diff --git a/.gitignore b/.gitignore index 469aa0d894b..b5cc5abdb0b 100644 --- a/.gitignore +++ b/.gitignore @@ -49,6 +49,8 @@ extra/comp_err extra/innochecksum extra/jemalloc/build/ extra/jemalloc/tmp/ +extra/mariabackup/mariabackup +extra/mariabackup/mbstream extra/my_print_defaults extra/mysql_waitpid extra/mysqld_safe_helper @@ -124,10 +126,13 @@ scripts/mytop scripts/wsrep_sst_common scripts/wsrep_sst_mysqldump scripts/wsrep_sst_rsync +scripts/wsrep_sst_mariabackup scripts/wsrep_sst_xtrabackup scripts/wsrep_sst_xtrabackup-v2 scripts/maria_add_gis_sp.sql scripts/maria_add_gis_sp_bootstrap.sql +scripts/galera_new_cluster +scripts/galera_recovery sql-bench/bench-count-distinct sql-bench/bench-init.pl sql-bench/compare-results @@ -219,6 +224,7 @@ support-files/config.medium.ini support-files/config.small.ini support-files/mariadb.pc support-files/mariadb@.service +support-files/mariadb.service support-files/my-huge.cnf support-files/my-innodb-heavy-4G.cnf support-files/my-large.cnf @@ -232,6 +238,7 @@ support-files/mysqld_multi.server support-files/wsrep.cnf support-files/wsrep_notify support-files/policy/selinux/mysqld-safe.pp +support-files/mariadb.pp tags tests/async_queries tests/bug25714 @@ -248,6 +255,10 @@ storage/mroonga/vendor/groonga/src/groonga-benchmark storage/mroonga/vendor/groonga/src/suggest/groonga-suggest-create-dataset storage/mroonga/mysql-test/mroonga/storage/r/information_schema_plugins.result storage/mroonga/mysql-test/mroonga/storage/r/variable_version.result +xxx/* +yyy/* +zzz/* + # C and C++ # Compiled Object files diff --git a/.travis.compiler.sh b/.travis.compiler.sh index 35e79e177ef..13e35fffe87 100755 --- a/.travis.compiler.sh +++ b/.travis.compiler.sh @@ -8,8 +8,8 @@ if [[ "${TRAVIS_OS_NAME}" == 'linux' ]]; then CMAKE_OPT="${CMAKE_OPT} -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache" fi case ${GCC_VERSION} in - 5) CXX=clang++-3.9 ;; - 6) CXX=clang++-4.0 ;; + 5) CXX=clang++-4.0 ;; + 6) CXX=clang++-5.0 ;; esac export CXX CC=${CXX/++/} elif [[ "${CXX}" == 'g++' ]]; then @@ -39,8 +39,4 @@ else fi fi -# main.mysqlhotcopy_myisam consitently failed in travis containers -# https://travis-ci.org/grooverdan/mariadb-server/builds/217661580 -echo 'main.mysqlhotcopy_myisam : unstable in containers' >> ${TRAVIS_BUILD_DIR}/mysql-test/unstable-tests -echo 'archive.mysqlhotcopy_archive : unstable in containers' >> ${TRAVIS_BUILD_DIR}/mysql-test/unstable-tests set +v +x diff --git a/.travis.yml b/.travis.yml index f33de076289..f3253b5e1a9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,15 +40,66 @@ matrix: include: - os: linux compiler: gcc + addons: + apt: + packages: # make sure these match debian/control contents + - bison + - chrpath + - cmake + - debhelper + - dh-apparmor + - dpatch + - gdb + - libaio-dev + - libboost-dev + - libcurl3-dev + - libdbd-mysql + - libjudy-dev + - libncurses5-dev + - libpam0g-dev + - libpcre3-dev + - libreadline-gplv2-dev + - libstemmer-dev + - libssl-dev + - libnuma-dev + - libxml2-dev + - lsb-release + - perl + - po-debconf + - psmisc + - zlib1g-dev + - libcrack2-dev + - cracklib-runtime + - libjemalloc-dev + - libsnappy-dev + - liblzma-dev + - libzmq-dev + - libdistro-info-perl + - uuid-dev + - devscripts + - fakeroot script: - ${CC} --version ; ${CXX} --version - # Just for disabling hotcopy tests for now - source .travis.compiler.sh # https://github.com/travis-ci/travis-ci/issues/7062 - /run/shm isn't writable or executable # in trusty containers - export MTR_MEM=/tmp - env DEB_BUILD_OPTIONS="parallel=6" debian/autobake-deb.sh; - ccache --show-stats + # Until OSX becomes a bit more stable: MDEV-12435 + allow_failures: + - os: osx + compiler: clang + env: GCC_VERSION=4.8 TYPE=RelWithDebInfo MYSQL_TEST_SUITES=rpl + - os: osx + compiler: clang + env: GCC_VERSION=5 TYPE=RelWithDebInfo MYSQL_TEST_SUITES=main,archive,optimizer_unfixed_bugs,parts,sys_vars,unit,vcol,innodb,innodb_gis,innodb_zip,innodb_fts + - os: osx + compiler: clang + env: GCC_VERSION=6 TYPE=RelWithDebInfo MYSQL_TEST_SUITES=binlog,binlog_encryption,encryption,rocksdb + - os: osx + compiler: clang + env: GCC_VERSION=6 TYPE=RelWithDebInfo MYSQL_TEST_SUITES=csv,federated,funcs_1,funcs_2,gcol,handler,heap,json,maria,percona,perfschema,plugins,multi_source,roles # Matrix include for coverity # - env: @@ -85,29 +136,26 @@ addons: apt: sources: - ubuntu-toolchain-r-test - - llvm-toolchain-trusty - - llvm-toolchain-trusty-3.9 - llvm-toolchain-trusty-4.0 - packages: # make sure these match debian/control contents + - sourceline: 'deb http://apt.llvm.org/trusty/ llvm-toolchain-trusty-5.0 main' + packages: # make sure these match the build requirements - gcc-5 - g++-5 - gcc-6 - g++-6 - - clang-3.9 - - llvm-3.9-dev - clang-4.0 - llvm-4.0-dev + - clang-5.0 + - llvm-5.0-dev - libasan0 - bison - chrpath - cmake - - debhelper - - dh-apparmor - - dpatch - gdb - libaio-dev - libboost-dev - libcurl3-dev + - libdbd-mysql - libjudy-dev - libncurses5-dev - libpam0g-dev @@ -119,16 +167,15 @@ addons: - libxml2-dev - lsb-release - perl - - po-debconf - psmisc - zlib1g-dev - libcrack2-dev + - cracklib-runtime - libjemalloc-dev - libsnappy-dev - liblzma-dev - libzmq-dev - - libdistro-info-perl - - devscripts # implicit for any build on Ubuntu + - uuid-dev # libsystemd-daemon-dev # https://github.com/travis-ci/apt-package-whitelist/issues/3882 diff --git a/BUILD/FINISH.sh b/BUILD/FINISH.sh index b41c5c5139d..20784c49f0b 100644 --- a/BUILD/FINISH.sh +++ b/BUILD/FINISH.sh @@ -35,6 +35,11 @@ fi # git clean -fdX removes all ignored (build) files commands="\ git clean -fdX +cd ./libmariadb +git submodule update +cd ../storage/rocksdb/rocksdb +git submodule update +cd ../../.. path=`dirname $0` . \"$path/autorun.sh\"" diff --git a/BUILD/SETUP.sh b/BUILD/SETUP.sh index 22357ce7fc8..2d6548dda0e 100755 --- a/BUILD/SETUP.sh +++ b/BUILD/SETUP.sh @@ -205,7 +205,7 @@ fi max_no_embedded_configs="$SSL_LIBRARY --with-plugins=max" max_no_qc_configs="$SSL_LIBRARY --with-plugins=max --without-query-cache" -max_configs="$SSL_LIBRARY --with-plugins=max --with-embedded-server --with-libevent --without-plugin=plugin_file_key_management" +max_configs="$SSL_LIBRARY --with-plugins=max --with-embedded-server --with-libevent --without-plugin=plugin_file_key_management --with-plugin-rocksdb=dynamic" all_configs="$SSL_LIBRARY --with-plugins=max --with-embedded-server --with-innodb_plugin --with-libevent" # @@ -289,6 +289,11 @@ gcov_compile_flags="-fprofile-arcs -ftest-coverage" gcov_compile_flags="$gcov_compile_flags -DDISABLE_TAO_ASM" gcov_compile_flags="$gcov_compile_flags -DMYSQL_SERVER_SUFFIX=-gcov -DHAVE_gcov" +# +# The following plugins doesn't work on 32 bit systems +disable_64_bit_plugins="--without-plugin-tokudb --without-plugin-rocksdb" + + # GCC4 needs -fprofile-arcs -ftest-coverage on the linker command line (as well # as on the compiler command line), and this requires setting LDFLAGS for BDB. diff --git a/BUILD/compile-amd64-debug-max-no-ndb b/BUILD/compile-amd64-debug-max-no-ndb deleted file mode 100755 index d45a51eba54..00000000000 --- a/BUILD/compile-amd64-debug-max-no-ndb +++ /dev/null @@ -1,25 +0,0 @@ -#! /bin/sh - -# Copyright (C) 2005, 2006 MySQL AB -# Use is subject to license terms -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Library General Public -# License as published by the Free Software Foundation; version 2 -# of the License. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Library General Public License for more details. -# -# You should have received a copy of the GNU Library General Public -# License along with this library; if not, write to the Free -# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -# MA 02110-1301, USA - -path=`dirname $0` -. "$path/SETUP.sh" -extra_flags="$amd64_cflags $debug_cflags" -extra_configs="$amd64_configs $debug_configs $max_configs" - -. "$path/FINISH.sh" diff --git a/BUILD/compile-amd64-gprof-no-ndb b/BUILD/compile-amd64-gprof-no-ndb deleted file mode 100755 index ef684274658..00000000000 --- a/BUILD/compile-amd64-gprof-no-ndb +++ /dev/null @@ -1,7 +0,0 @@ -#! /bin/sh -path=`dirname $0` -. "$path/SETUP.sh" -extra_flags="$amd64_cflags -pg -g" -extra_configs="$amd64_configs $max_configs --disable-shared $static_link" - -. "$path/FINISH.sh" diff --git a/BUILD/compile-pentium b/BUILD/compile-pentium index c197d9b49bf..af8e5b53a30 100755 --- a/BUILD/compile-pentium +++ b/BUILD/compile-pentium @@ -20,7 +20,7 @@ path=`dirname $0` . "$path/SETUP.sh" extra_flags="$pentium_cflags $fast_cflags" -extra_configs="$pentium_configs" +extra_configs="$pentium_configs $disable_64_bit_plugins" strip=yes . "$path/FINISH.sh" diff --git a/BUILD/compile-pentium-debug b/BUILD/compile-pentium-debug index faeb1b89597..ecbe04087c3 100755 --- a/BUILD/compile-pentium-debug +++ b/BUILD/compile-pentium-debug @@ -19,6 +19,6 @@ path=`dirname $0` . "$path/SETUP.sh" extra_flags="$pentium_cflags $debug_cflags" -extra_configs="$pentium_configs $debug_configs" +extra_configs="$pentium_configs $debug_configs $disable_64_bit_plugins" . "$path/FINISH.sh" diff --git a/BUILD/compile-pentium-debug-all b/BUILD/compile-pentium-debug-all index 710ce8af63c..9ed5bf6b2cd 100755 --- a/BUILD/compile-pentium-debug-all +++ b/BUILD/compile-pentium-debug-all @@ -5,6 +5,6 @@ set -- "$@" --with-debug=full . "$path/SETUP.sh" extra_flags="$pentium_cflags $debug_cflags" -extra_configs="$pentium_configs $debug_configs $all_configs $error_inject --with-experimental-collations" +extra_configs="$pentium_configs $debug_configs $all_configs $error_inject --with-experimental-collations $disable_64_bit_plugins" . "$path/FINISH.sh" diff --git a/BUILD/compile-pentium-debug-max b/BUILD/compile-pentium-debug-max index 0c925d8426f..68784eb34ea 100755 --- a/BUILD/compile-pentium-debug-max +++ b/BUILD/compile-pentium-debug-max @@ -19,6 +19,6 @@ path=`dirname $0` . "$path/SETUP.sh" extra_flags="$pentium_cflags $debug_cflags" -extra_configs="$pentium_configs $debug_configs $max_configs $error_inject --with-experimental-collations" +extra_configs="$pentium_configs $debug_configs $max_configs $error_inject --with-experimental-collations $disable_64_bit_plugins" . "$path/FINISH.sh" diff --git a/BUILD/compile-pentium-debug-max-no-embedded b/BUILD/compile-pentium-debug-max-no-embedded index 2394c8aa2c7..d8bc896f89c 100755 --- a/BUILD/compile-pentium-debug-max-no-embedded +++ b/BUILD/compile-pentium-debug-max-no-embedded @@ -20,6 +20,6 @@ path=`dirname $0` . "$path/SETUP.sh" extra_flags="$pentium_cflags $debug_cflags" -extra_configs="$pentium_configs $debug_configs $max_no_embedded_configs" +extra_configs="$pentium_configs $debug_configs $max_no_embedded_configs $disable_64_bit_plugins" . "$path/FINISH.sh" diff --git a/BUILD/compile-pentium-debug-max-no-ndb b/BUILD/compile-pentium-debug-max-no-ndb deleted file mode 100755 index 705164c20bc..00000000000 --- a/BUILD/compile-pentium-debug-max-no-ndb +++ /dev/null @@ -1,24 +0,0 @@ -#! /bin/sh - -# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; version 2 of the License. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - -path=`dirname $0` -. "$path/SETUP.sh" - -extra_flags="$pentium_cflags $debug_cflags" -extra_configs="$pentium_configs $debug_configs $max_configs" - -. "$path/FINISH.sh" diff --git a/BUILD/compile-pentium-debug-max-no-qc b/BUILD/compile-pentium-debug-max-no-qc deleted file mode 100755 index 6407b4b09ad..00000000000 --- a/BUILD/compile-pentium-debug-max-no-qc +++ /dev/null @@ -1,10 +0,0 @@ -#! /bin/sh -# Builds server without query cache support - -path=`dirname $0` -. "$path/SETUP.sh" - -extra_flags="$pentium_cflags $debug_cflags" -extra_configs="$pentium_configs $debug_configs $max_no_qc_configs" - -. "$path/FINISH.sh" diff --git a/BUILD/compile-pentium-debug-openssl b/BUILD/compile-pentium-debug-openssl index abf6b41a2d2..697b937bc93 100755 --- a/BUILD/compile-pentium-debug-openssl +++ b/BUILD/compile-pentium-debug-openssl @@ -19,7 +19,7 @@ path=`dirname $0` . "$path/SETUP.sh" extra_flags="$pentium_cflags $debug_cflags" -extra_configs="$pentium_configs $debug_configs" +extra_configs="$pentium_configs $debug_configs $disable_64_bit_plugins" extra_configs="$extra_configs --with-debug --with-ssl=/usr" diff --git a/BUILD/compile-pentium-debug-wsrep b/BUILD/compile-pentium-debug-wsrep index ee68e3fd0c1..6528ed77f95 100644 --- a/BUILD/compile-pentium-debug-wsrep +++ b/BUILD/compile-pentium-debug-wsrep @@ -7,6 +7,6 @@ set -- "$@" --with-debug=full extra_flags="$pentium_cflags $debug_cflags -g -O0 $wsrep_cflags" c_warnings="$c_warnings $debug_extra_warnings" cxx_warnings="$cxx_warnings $debug_extra_warnings" -extra_configs="$pentium_configs $debug_configs $wsrep_configs --with-wsrep" +extra_configs="$pentium_configs $debug_configs $wsrep_configs --with-wsrep $disable_64_bit_plugins" . "$path/FINISH.sh" diff --git a/BUILD/compile-pentium-gcov b/BUILD/compile-pentium-gcov index 56072f619e5..9c5a61e9089 100755 --- a/BUILD/compile-pentium-gcov +++ b/BUILD/compile-pentium-gcov @@ -40,6 +40,6 @@ export LDFLAGS="$gcov_link_flags" extra_flags="$pentium_cflags $debug_cflags $max_cflags $gcov_compile_flags" c_warnings="$c_warnings $debug_extra_warnings" cxx_warnings="$cxx_warnings $debug_extra_warnings" -extra_configs="$pentium_configs $debug_configs $gcov_configs $max_configs" +extra_configs="$pentium_configs $debug_configs $gcov_configs $max_configs $disable_64_bit_plugins" . "$path/FINISH.sh" diff --git a/BUILD/compile-pentium-gprof b/BUILD/compile-pentium-gprof index 52231e7832a..de014e3ae8b 100755 --- a/BUILD/compile-pentium-gprof +++ b/BUILD/compile-pentium-gprof @@ -19,6 +19,6 @@ path=`dirname $0` . "$path/SETUP.sh" extra_flags="$pentium_cflags $gprof_compile_flags" -extra_configs="$pentium_configs $debug_configs $gprof_link_flags" +extra_configs="$pentium_configs $debug_configs $gprof_link_flags $disable_64_bit_plugins" . "$path/FINISH.sh" diff --git a/BUILD/compile-pentium-icc b/BUILD/compile-pentium-icc index 23333a13c15..4fdc37b0667 100755 --- a/BUILD/compile-pentium-icc +++ b/BUILD/compile-pentium-icc @@ -35,6 +35,6 @@ extra_flags="$fast_cflags -unroll2 -ip -mp -restrict" # icpc: error: problem during multi-file optimization compilation (code 1) extra_flags="$extra_flags -no-ipo" base_cxxflags="-fno-exceptions -fno-rtti" -extra_configs="$pentium_configs $static_link" +extra_configs="$pentium_configs $static_link $disable_64_bit_plugins" . "$path/FINISH.sh" diff --git a/BUILD/compile-pentium-max b/BUILD/compile-pentium-max index 470596f8eb9..d2a61de8e13 100755 --- a/BUILD/compile-pentium-max +++ b/BUILD/compile-pentium-max @@ -20,6 +20,6 @@ path=`dirname $0` . "$path/SETUP.sh" extra_flags="$pentium_cflags $fast_cflags -g" -extra_configs="$pentium_configs $max_configs" +extra_configs="$pentium_configs $max_configs $disable_64_bit_plugins" . "$path/FINISH.sh" diff --git a/BUILD/compile-pentium-valgrind-max b/BUILD/compile-pentium-valgrind-max index c4cb1845ba1..4f21e3574ff 100755 --- a/BUILD/compile-pentium-valgrind-max +++ b/BUILD/compile-pentium-valgrind-max @@ -33,6 +33,6 @@ path=`dirname $0` . "$path/SETUP.sh" extra_flags="$pentium_cflags $debug_cflags $valgrind_flags" -extra_configs="$pentium_configs $debug_configs $valgrind_configs $max_configs" +extra_configs="$pentium_configs $debug_configs $valgrind_configs $max_configs $disable_64_bit_plugins" . "$path/FINISH.sh" diff --git a/BUILD/compile-pentium-valgrind-max-no-ndb b/BUILD/compile-pentium-valgrind-max-no-ndb deleted file mode 100755 index 4eb47cb2fe2..00000000000 --- a/BUILD/compile-pentium-valgrind-max-no-ndb +++ /dev/null @@ -1,26 +0,0 @@ -#! /bin/sh - -# Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Library General Public -# License as published by the Free Software Foundation; version 2 -# of the License. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Library General Public License for more details. -# -# You should have received a copy of the GNU Library General Public -# License along with this library; if not, write to the Free -# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -# MA 02110-1301, USA - -path=`dirname $0` -. "$path/SETUP.sh" - -extra_flags="$pentium_cflags $debug_cflags $valgrind_flags" -extra_configs="$pentium_configs $debug_configs $valgrind_configs $max_configs" - -. "$path/FINISH.sh" diff --git a/BUILD/compile-pentium-wsrep b/BUILD/compile-pentium-wsrep index eeb14310e4e..b0b8e408370 100644 --- a/BUILD/compile-pentium-wsrep +++ b/BUILD/compile-pentium-wsrep @@ -4,7 +4,7 @@ path=`dirname $0` . "$path/SETUP.sh" extra_flags="$pentium_cflags $fast_cflags $wsrep_cflags" -extra_configs="$pentium_configs $wsrep_configs --with-wsrep" +extra_configs="$pentium_configs $wsrep_configs --with-wsrep $disable_64_bit_plugins" #strip=yes diff --git a/BUILD/compile-ppc-debug-max-no-ndb b/BUILD/compile-ppc-debug-max-no-ndb deleted file mode 100755 index 0642ddf7a57..00000000000 --- a/BUILD/compile-ppc-debug-max-no-ndb +++ /dev/null @@ -1,25 +0,0 @@ -#! /bin/sh - -# Copyright (c) 2005, 2006 MySQL AB -# Use is subject to license terms -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; version 2 of the License. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - -path=`dirname $0` -. "$path/SETUP.sh" - -extra_flags="$ppc_cflags $debug_cflags" -extra_configs="$debug_configs $max_configs" - -. "$path/FINISH.sh" diff --git a/CMakeLists.txt b/CMakeLists.txt index 5c4e0037588..b0cf68351b7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ -# Copyright (c) 2006, 2014, Oracle and/or its affiliates. -# Copyright (c) 2008, 2014, Monty Program Ab +# Copyright (c) 2006, 2017, Oracle and/or its affiliates. +# Copyright (c) 2008, 2017, MariaDB # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -220,11 +220,9 @@ IF(SECURITY_HARDENED) MY_CHECK_AND_SET_COMPILER_FLAG("-D_FORTIFY_SOURCE=2" RELEASE RELWITHDEBINFO) ENDIF() -OPTION(ENABLE_DEBUG_SYNC "Enable debug sync (debug builds only)" ON) -IF(ENABLE_DEBUG_SYNC) - SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DENABLED_DEBUG_SYNC") - SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DENABLED_DEBUG_SYNC") -ENDIF() +# Always enable debug sync for debug builds. +SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DENABLED_DEBUG_SYNC") +SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DENABLED_DEBUG_SYNC") OPTION(ENABLE_GCOV "Enable gcov (debug, Linux builds only)" OFF) IF (ENABLE_GCOV) @@ -365,7 +363,7 @@ ENDIF() SET (MYSQLD_STATIC_PLUGIN_LIBS "" CACHE INTERNAL "") -# mariadb_connector_c fetches submodules which is useful for plugins +INCLUDE(submodules) INCLUDE(mariadb_connector_c) # this does ADD_SUBDIRECTORY(libmariadb) # Add storage engines and plugins. @@ -462,7 +460,6 @@ INSTALL_DOCUMENTATION(README.md CREDITS COPYING COPYING.thirdparty # ${CMAKE_BINARY_DIR}/Docs/INFO_BIN) IF(UNIX) - INSTALL_DOCUMENTATION(Docs/INSTALL-BINARY COMPONENT Readme) INSTALL_DOCUMENTATION(Docs/INSTALL-BINARY Docs/README-wsrep COMPONENT Readme) ENDIF() diff --git a/CREDITS b/CREDITS index d352232ad2e..6288c2cdea4 100644 --- a/CREDITS +++ b/CREDITS @@ -4,17 +4,19 @@ organization registered in the USA. The current main sponsors of the MariaDB Foundation are: Alibaba Cloud https://intl.aliyun.com (2017) -Booking.com https://www.booking.com (2013 - 2017) -Development Bank of Singapore https://dbs.com (2016 - 2017) -MariaDB Corporation https://www.mariadb.com (2013 - 2017) -Visma https://visma.com (2015 - 2017) -Acronis http://acronis.com (2016 - 2017) -Nexedi https://www.nexedi.com (2016 - 2017) -Automattic https://automattic.com (2014 - 2017) -Tencent Game DBA http://tencentdba.com/about (2016 - 2017) -Tencent TDSQL http://tdsql.org/ (2016 - 2017) -Verkkokauppa.com https://www.verkkokauppa.com (2015 - 2017) -Virtuozzo https://virtuozzo.com (2016 - 2017) +Booking.com https://www.booking.com (2013) +Tencent Cloud https://cloud.tencent.com (2017) +Development Bank of Singapore https://dbs.com (2016) +IBM https://www.ibm.com (2017) +MariaDB Corporation https://www.mariadb.com (2013) +Visma https://visma.com (2015) +Acronis http://acronis.com (2016) +Nexedi https://www.nexedi.com (2016) +Automattic https://automattic.com (2014) +Tencent Game DBA http://tencentdba.com/about (2016) +Tencent TDSQL http://tdsql.org (2016) +Verkkokauppa.com https://www.verkkokauppa.com (2015) +Virtuozzo https://virtuozzo.com (2016) For a full list of sponsors, see https://mariadb.org/about/supporters/ diff --git a/README.md b/README.md index f34e6a43b71..58e08f89ca0 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Please read the CREDITS file for details about the MariaDB Foundation, and who is developing MariaDB. MariaDB is developed by many of the original developers of MySQL who -now work for the MariadB Foundation and the MariaDB Corporation, and by many people in +now work for the MariaDB Foundation and the MariaDB Corporation, and by many people in the community. MySQL, which is the base of MariaDB, is a product and trademark of Oracle diff --git a/VERSION b/VERSION index ed825f4c577..b816ecbfe54 100644 --- a/VERSION +++ b/VERSION @@ -1,3 +1,3 @@ MYSQL_VERSION_MAJOR=10 MYSQL_VERSION_MINOR=2 -MYSQL_VERSION_PATCH=6 +MYSQL_VERSION_PATCH=9 diff --git a/client/client_priv.h b/client/client_priv.h index e96e187fb34..ba1a1fddfae 100644 --- a/client/client_priv.h +++ b/client/client_priv.h @@ -120,4 +120,3 @@ enum options_client Name of the performance schema database. */ #define PERFORMANCE_SCHEMA_DB_NAME "performance_schema" - diff --git a/client/mysql.cc b/client/mysql.cc index 69924010a15..fb9ffbef669 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2014, Oracle and/or its affiliates. - Copyright (c) 2009, 2016, MariaDB + Copyright (c) 2009, 2017, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -149,7 +149,7 @@ static my_bool ignore_errors=0,wait_flag=0,quick=0, default_pager_set= 0, opt_sigint_ignore= 0, auto_vertical_output= 0, show_warnings= 0, executing_query= 0, - ignore_spaces= 0, opt_progress_reports; + ignore_spaces= 0, opt_binhex= 0, opt_progress_reports; static my_bool debug_info_flag, debug_check_flag, batch_abort_on_error; static my_bool column_types_flag; static my_bool preserve_comments= 0; @@ -1145,8 +1145,6 @@ int main(int argc,char *argv[]) outfile[0]=0; // no (default) outfile strmov(pager, "stdout"); // the default, if --pager wasn't given - mysql_init(&mysql); - { char *tmp=getenv("PAGER"); if (tmp && strlen(tmp)) @@ -1185,7 +1183,11 @@ int main(int argc,char *argv[]) } defaults_argv=argv; if ((status.exit_status= get_options(argc, (char **) argv))) - mysql_end(-1); + { + free_defaults(defaults_argv); + my_end(0); + exit(status.exit_status); + } if (status.batch && !status.line_buff && !(status.line_buff= batch_readline_init(MAX_BATCH_BUFFER_SIZE, stdin))) @@ -1494,6 +1496,8 @@ static struct my_option my_long_options[] = {"batch", 'B', "Don't use history file. Disable interactive behavior. (Enables --silent.)", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"binary-as-hex", 'b', "Print binary data as hex", &opt_binhex, &opt_binhex, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"character-sets-dir", OPT_CHARSETS_DIR, "Directory for character set files.", &charsets_dir, &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -2321,8 +2325,10 @@ static bool add_line(String &buffer, char *line, ulong line_length, continue; } #endif - if (!*ml_comment && inchar == '\\' && - !(*in_string && + if (!*ml_comment && inchar == '\\' && *in_string != '`' && + !(*in_string == '"' && + (mysql.server_status & SERVER_STATUS_ANSI_QUOTES)) && + !(*in_string && (mysql.server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES))) { // Found possbile one character command like \c @@ -3061,7 +3067,6 @@ static int com_server_help(String *buffer __attribute__((unused)), { unsigned int num_fields= mysql_num_fields(result); my_ulonglong num_rows= mysql_num_rows(result); - mysql_fetch_fields(result); if (num_fields==3 && num_rows==1) { if (!(cur= mysql_fetch_row(result))) @@ -3315,7 +3320,8 @@ com_go(String *buffer,char *line __attribute__((unused))) print_table_data_html(result); else if (opt_xml) print_table_data_xml(result); - else if (vertical || (auto_vertical_output && (terminal_width < get_result_width(result)))) + else if (vertical || (auto_vertical_output && + (terminal_width < get_result_width(result)))) print_table_data_vertically(result); else if (opt_silent && verbose <= 2 && !output_tables) print_tab_data(result); @@ -3533,6 +3539,41 @@ print_field_types(MYSQL_RES *result) } +/* Used to determine if we should invoke print_as_hex for this field */ + +static bool +is_binary_field(MYSQL_FIELD *field) +{ + if ((field->charsetnr == 63) && + (field->type == MYSQL_TYPE_BIT || + field->type == MYSQL_TYPE_BLOB || + field->type == MYSQL_TYPE_LONG_BLOB || + field->type == MYSQL_TYPE_MEDIUM_BLOB || + field->type == MYSQL_TYPE_TINY_BLOB || + field->type == MYSQL_TYPE_VAR_STRING || + field->type == MYSQL_TYPE_STRING || + field->type == MYSQL_TYPE_VARCHAR || + field->type == MYSQL_TYPE_GEOMETRY)) + return 1; + return 0; +} + + +/* Print binary value as hex literal (0x ...) */ + +static void +print_as_hex(FILE *output_file, const char *str, ulong len, ulong total_bytes_to_send) +{ + const char *ptr= str, *end= ptr+len; + ulong i; + fprintf(output_file, "0x"); + for(; ptr < end; ptr++) + fprintf(output_file, "%02X", *((uchar*)ptr)); + for (i= 2*len+2; i < total_bytes_to_send; i++) + tee_putc((int)' ', output_file); +} + + static void print_table_data(MYSQL_RES *result) { @@ -3559,6 +3600,8 @@ print_table_data(MYSQL_RES *result) length= MY_MAX(length,field->max_length); if (length < 4 && !IS_NOT_NULL(field->flags)) length=4; // Room for "NULL" + if (opt_binhex && is_binary_field(field)) + length= 2 + length * 2; field->max_length=length; num_flag[mysql_field_tell(result) - 1]= IS_NUM(field->type); separator.fill(separator.length()+length+2,'-'); @@ -3626,9 +3669,11 @@ print_table_data(MYSQL_RES *result) many extra padding-characters we should send with the printing function. */ visible_length= charset_info->cset->numcells(charset_info, buffer, buffer + data_length); - extra_padding= data_length - visible_length; + extra_padding= (uint) (data_length - visible_length); - if (field_max_length > MAX_COLUMN_LENGTH) + if (opt_binhex && is_binary_field(field)) + print_as_hex(PAGER, cur[off], lengths[off], field_max_length); + else if (field_max_length > MAX_COLUMN_LENGTH) tee_print_sized_data(buffer, data_length, MAX_COLUMN_LENGTH+extra_padding, FALSE); else { @@ -3762,11 +3807,15 @@ print_table_data_html(MYSQL_RES *result) if (interrupted_query) break; ulong *lengths=mysql_fetch_lengths(result); + field= mysql_fetch_fields(result); (void) tee_fputs("", PAGER); for (uint i=0; i < mysql_num_fields(result); i++) { (void) tee_fputs("", PAGER); - xmlencode_print(cur[i], lengths[i]); + if (opt_binhex && is_binary_field(&field[i])) + print_as_hex(PAGER, cur[i], lengths[i], lengths[i]); + else + xmlencode_print(cur[i], lengths[i]); (void) tee_fputs("", PAGER); } (void) tee_fputs("", PAGER); @@ -3802,7 +3851,10 @@ print_table_data_xml(MYSQL_RES *result) if (cur[i]) { tee_fprintf(PAGER, "\">"); - xmlencode_print(cur[i], lengths[i]); + if (opt_binhex && is_binary_field(&fields[i])) + print_as_hex(PAGER, cur[i], lengths[i], lengths[i]); + else + xmlencode_print(cur[i], lengths[i]); tee_fprintf(PAGER, "\n"); } else @@ -3849,13 +3901,19 @@ print_table_data_vertically(MYSQL_RES *result) { unsigned int i; const char *p; - + if (opt_binhex && is_binary_field(field)) + fprintf(PAGER, "0x"); for (i= 0, p= cur[off]; i < lengths[off]; i+= 1, p+= 1) { - if (*p == '\0') - tee_putc((int)' ', PAGER); + if (opt_binhex && is_binary_field(field)) + fprintf(PAGER, "%02X", *((uchar*)p)); else - tee_putc((int)*p, PAGER); + { + if (*p == '\0') + tee_putc((int)' ', PAGER); + else + tee_putc((int)*p, PAGER); + } } tee_putc('\n', PAGER); } @@ -3865,7 +3923,6 @@ print_table_data_vertically(MYSQL_RES *result) } } - /* print_warnings should be called right after executing a statement */ static void print_warnings() @@ -4002,11 +4059,19 @@ print_tab_data(MYSQL_RES *result) while ((cur = mysql_fetch_row(result))) { lengths=mysql_fetch_lengths(result); - safe_put_field(cur[0],lengths[0]); + field= mysql_fetch_fields(result); + if (opt_binhex && is_binary_field(&field[0])) + print_as_hex(PAGER, cur[0], lengths[0], lengths[0]); + else + safe_put_field(cur[0],lengths[0]); + for (uint off=1 ; off < mysql_num_fields(result); off++) { (void) tee_fputs("\t", PAGER); - safe_put_field(cur[off], lengths[off]); + if (opt_binhex && field && is_binary_field(&field[off])) + print_as_hex(PAGER, cur[off], lengths[off], lengths[off]); + else + safe_put_field(cur[off], lengths[off]); } (void) tee_fputs("\n", PAGER); } @@ -4802,10 +4867,11 @@ com_status(String *buffer __attribute__((unused)), tee_fprintf(stdout, "Protocol:\t\tCompressed\n"); #endif - if ((status_str= mysql_stat(&mysql)) && !mysql_error(&mysql)[0]) + const char *pos; + if ((status_str= mysql_stat(&mysql)) && !mysql_error(&mysql)[0] && + (pos= strchr(status_str,' '))) { ulong sec; - const char *pos= strchr(status_str,' '); /* print label */ tee_fprintf(stdout, "%.*s\t\t\t", (int) (pos-status_str), status_str); if ((status_str= str2int(pos,10,0,LONG_MAX,(long*) &sec))) diff --git a/client/mysql_upgrade.c b/client/mysql_upgrade.c index ee63fda2e39..c10dc20e7d7 100644 --- a/client/mysql_upgrade.c +++ b/client/mysql_upgrade.c @@ -1,6 +1,6 @@ /* Copyright (c) 2006, 2013, Oracle and/or its affiliates. - Copyright (c) 2010, 2016, MariaDB + Copyright (c) 2010, 2017, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -1130,7 +1130,7 @@ static int check_version_match(void) int main(int argc, char **argv) { - char self_name[FN_REFLEN]; + char self_name[FN_REFLEN + 1]; MY_INIT(argv[0]); @@ -1138,7 +1138,7 @@ int main(int argc, char **argv) if (GetModuleFileName(NULL, self_name, FN_REFLEN) == 0) #endif { - strncpy(self_name, argv[0], FN_REFLEN); + strmake_buf(self_name, argv[0]); } if (init_dynamic_string(&ds_args, "", 512, 256) || @@ -1171,6 +1171,8 @@ int main(int argc, char **argv) { int fd= create_temp_file(cnf_file_path, opt_tmpdir[0] ? opt_tmpdir : NULL, "mysql_upgrade-", O_CREAT | O_WRONLY, MYF(MY_FAE)); + if (fd < 0) + die(NULL); my_write(fd, USTRING_WITH_LEN( "[client]\n"), MYF(MY_FAE)); my_write(fd, (uchar*)ds_args.str, ds_args.length, MYF(MY_FAE)); my_close(fd, MYF(0)); diff --git a/client/mysqladmin.cc b/client/mysqladmin.cc index 7491458c161..45b332a6cd6 100644 --- a/client/mysqladmin.cc +++ b/client/mysqladmin.cc @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2014, Oracle and/or its affiliates. - Copyright (c) 2010, 2016, MariaDB + Copyright (c) 2010, 2017, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -47,6 +47,7 @@ static uint opt_count_iterations= 0, my_end_arg; static ulong opt_connect_timeout, opt_shutdown_timeout; static char * unix_port=0; static char *opt_plugin_dir= 0, *opt_default_auth= 0; +static bool sql_log_bin_off= false; #ifdef HAVE_SMEM static char *shared_memory_base_name=0; @@ -600,6 +601,31 @@ static my_bool sql_connect(MYSQL *mysql, uint wait) } +static int maybe_disable_binlog(MYSQL *mysql) +{ + if (opt_local && !sql_log_bin_off) + { + if (mysql_query(mysql, "set local sql_log_bin=0")) + { + my_printf_error(0, "SET LOCAL SQL_LOG_BIN=0 failed; error: '%-.200s'", + error_flags, mysql_error(mysql)); + return -1; + } + } + sql_log_bin_off= true; + return 0; +} + + +int flush(MYSQL *mysql, const char *what) +{ + char buf[FN_REFLEN]; + my_snprintf(buf, sizeof(buf), "flush %s%s", + (opt_local && !sql_log_bin_off ? "local " : ""), what); + return mysql_query(mysql, buf); +} + + /** @brief Execute all commands @@ -616,6 +642,7 @@ static my_bool sql_connect(MYSQL *mysql, uint wait) static int execute_commands(MYSQL *mysql,int argc, char **argv) { + int ret = 0; const char *status; /* MySQL documentation relies on the fact that mysqladmin will @@ -628,17 +655,6 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) struct my_rnd_struct rand_st; char buff[FN_REFLEN + 20]; - if (opt_local) - { - sprintf(buff, "set local sql_log_bin=0"); - if (mysql_query(mysql, buff)) - { - my_printf_error(0, "SET LOCAL SQL_LOG_BIN=0 failed; error: '%-.200s'", - error_flags, mysql_error(mysql)); - return -1; - } - } - for (; argc > 0 ; argv++,argc--) { int command; @@ -650,6 +666,8 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) my_printf_error(0, "Too few arguments to create", error_flags); return 1; } + if (maybe_disable_binlog(mysql)) + return -1; sprintf(buff,"create database `%.*s`",FN_REFLEN,argv[1]); if (mysql_query(mysql,buff)) { @@ -667,6 +685,8 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) my_printf_error(0, "Too few arguments to drop", error_flags); return 1; } + if (maybe_disable_binlog(mysql)) + return -1; if (drop_db(mysql,argv[1])) return -1; argc--; argv++; @@ -707,7 +727,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) } case ADMIN_FLUSH_PRIVILEGES: case ADMIN_RELOAD: - if (mysql_query(mysql,"flush privileges")) + if (flush(mysql, "privileges")) { my_printf_error(0, "reload failed; error: '%s'", error_flags, mysql_error(mysql)); @@ -911,7 +931,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) } case ADMIN_FLUSH_LOGS: { - if (mysql_query(mysql,"flush logs")) + if (flush(mysql, "logs")) { my_printf_error(0, "flush failed; error: '%s'", error_flags, mysql_error(mysql)); @@ -921,7 +941,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) } case ADMIN_FLUSH_BINARY_LOG: { - if (mysql_query(mysql, "flush binary logs")) + if (flush(mysql, "binary logs")) { my_printf_error(0, "flush failed; error: '%s'", error_flags, mysql_error(mysql)); @@ -931,7 +951,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) } case ADMIN_FLUSH_ENGINE_LOG: { - if (mysql_query(mysql,"flush engine logs")) + if (flush(mysql, "engine logs")) { my_printf_error(0, "flush failed; error: '%s'", error_flags, mysql_error(mysql)); @@ -941,7 +961,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) } case ADMIN_FLUSH_ERROR_LOG: { - if (mysql_query(mysql, "flush error logs")) + if (flush(mysql, "error logs")) { my_printf_error(0, "flush failed; error: '%s'", error_flags, mysql_error(mysql)); @@ -951,7 +971,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) } case ADMIN_FLUSH_GENERAL_LOG: { - if (mysql_query(mysql, "flush general logs")) + if (flush(mysql, "general logs")) { my_printf_error(0, "flush failed; error: '%s'", error_flags, mysql_error(mysql)); @@ -961,7 +981,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) } case ADMIN_FLUSH_RELAY_LOG: { - if (mysql_query(mysql, "flush relay logs")) + if (flush(mysql, "relay logs")) { my_printf_error(0, "flush failed; error: '%s'", error_flags, mysql_error(mysql)); @@ -971,7 +991,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) } case ADMIN_FLUSH_SLOW_LOG: { - if (mysql_query(mysql,"flush slow logs")) + if (flush(mysql, "slow logs")) { my_printf_error(0, "flush failed; error: '%s'", error_flags, mysql_error(mysql)); @@ -981,7 +1001,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) } case ADMIN_FLUSH_HOSTS: { - if (mysql_query(mysql,"flush hosts")) + if (flush(mysql, "hosts")) { my_printf_error(0, "flush failed; error: '%s'", error_flags, mysql_error(mysql)); @@ -991,7 +1011,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) } case ADMIN_FLUSH_TABLES: { - if (mysql_query(mysql,"flush tables")) + if (flush(mysql, "tables")) { my_printf_error(0, "flush failed; error: '%s'", error_flags, mysql_error(mysql)); @@ -1001,7 +1021,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) } case ADMIN_FLUSH_STATUS: { - if (mysql_query(mysql,"flush status")) + if (flush(mysql, "status")) { my_printf_error(0, "flush failed; error: '%s'", error_flags, mysql_error(mysql)); @@ -1011,7 +1031,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) } case ADMIN_FLUSH_TABLE_STATISTICS: { - if (mysql_query(mysql,"flush table_statistics")) + if (flush(mysql, "table_statistics")) { my_printf_error(0, "flush failed; error: '%s'", error_flags, mysql_error(mysql)); @@ -1021,7 +1041,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) } case ADMIN_FLUSH_INDEX_STATISTICS: { - if (mysql_query(mysql,"flush index_statistics")) + if (flush(mysql, "index_statistics")) { my_printf_error(0, "flush failed; error: '%s'", error_flags, mysql_error(mysql)); @@ -1031,7 +1051,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) } case ADMIN_FLUSH_USER_STATISTICS: { - if (mysql_query(mysql,"flush user_statistics")) + if (flush(mysql, "user_statistics")) { my_printf_error(0, "flush failed; error: '%s'", error_flags, mysql_error(mysql)); @@ -1041,7 +1061,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) } case ADMIN_FLUSH_USER_RESOURCES: { - if (mysql_query(mysql, "flush user_resources")) + if (flush(mysql, "user_resources")) { my_printf_error(0, "flush failed; error: '%s'", error_flags, mysql_error(mysql)); @@ -1051,7 +1071,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) } case ADMIN_FLUSH_CLIENT_STATISTICS: { - if (mysql_query(mysql,"flush client_statistics")) + if (flush(mysql, "client_statistics")) { my_printf_error(0, "flush failed; error: '%s'", error_flags, mysql_error(mysql)); @@ -1061,9 +1081,8 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) } case ADMIN_FLUSH_ALL_STATISTICS: { - if (mysql_query(mysql, - "flush table_statistics,index_statistics," - "user_statistics,client_statistics")) + if (flush(mysql, "table_statistics,index_statistics," + "user_statistics,client_statistics")) { my_printf_error(0, "flush failed; error: '%s'", error_flags, mysql_error(mysql)); @@ -1073,9 +1092,8 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) } case ADMIN_FLUSH_ALL_STATUS: { - if (mysql_query(mysql, - "flush status,table_statistics,index_statistics," - "user_statistics,client_statistics")) + if (flush(mysql, "status,table_statistics,index_statistics," + "user_statistics,client_statistics")) { my_printf_error(0, "flush failed; error: '%s'", error_flags, mysql_error(mysql)); @@ -1093,6 +1111,8 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) start_time=time((time_t*) 0); my_rnd_init(&rand_st,(ulong) start_time,(ulong) start_time/2); + if (maybe_disable_binlog(mysql)) + return -1; if (argc < 1) { my_printf_error(0, "Too few arguments to change password", error_flags); @@ -1106,7 +1126,8 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) if (strcmp(typed_password, verified) != 0) { my_printf_error(0,"Passwords don't match",MYF(ME_BELL)); - return -1; + ret = -1; + goto password_done; } } else @@ -1133,7 +1154,8 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) { my_printf_error(0, "Could not determine old_passwords setting from server; error: '%s'", error_flags, mysql_error(mysql)); - return -1; + ret = -1; + goto password_done; } else { @@ -1144,7 +1166,8 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) "Could not get old_passwords setting from " "server; error: '%s'", error_flags, mysql_error(mysql)); - return -1; + ret = -1; + goto password_done; } if (!mysql_num_rows(res)) old= 1; @@ -1169,15 +1192,15 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) { my_printf_error(0, "Can't turn off logging; error: '%s'", error_flags, mysql_error(mysql)); - return -1; + ret = -1; } + else if (mysql_query(mysql,buff)) { if (mysql_errno(mysql)!=1290) { my_printf_error(0,"unable to change password; error: '%s'", error_flags, mysql_error(mysql)); - return -1; } else { @@ -1191,9 +1214,10 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) " --skip-grant-tables).\n" "Use: \"mysqladmin flush-privileges password '*'\"" " instead", error_flags); - return -1; } + ret = -1; } +password_done: /* free up memory from prompted password */ if (typed_password != argv[1]) { @@ -1300,7 +1324,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) return 1; } } - return 0; + return ret; } /** diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc index 92534501fb1..584f6955453 100644 --- a/client/mysqlbinlog.cc +++ b/client/mysqlbinlog.cc @@ -68,6 +68,7 @@ CHARSET_INFO* system_charset_info= &my_charset_utf8_general_ci; /* Needed for Flashback */ DYNAMIC_ARRAY binlog_events; // Storing the events output string +DYNAMIC_ARRAY events_in_stmt; // Storing the events that in one statement String stop_event_string; // Storing the STOP_EVENT output string char server_version[SERVER_VERSION_LENGTH]; @@ -894,6 +895,25 @@ static bool print_row_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev, print_event_info->m_table_map_ignored.get_table(table_id); bool skip_event= (ignored_map != NULL); + if (opt_flashback) + { + Rows_log_event *e= (Rows_log_event*) ev; + // The last Row_log_event will be the first event in Flashback + if (is_stmt_end) + e->clear_flags(Rows_log_event::STMT_END_F); + // The first Row_log_event will be the last event in Flashback + if (events_in_stmt.elements == 0) + e->set_flags(Rows_log_event::STMT_END_F); + // Update the temp_buf + e->update_flags(); + + if (insert_dynamic(&events_in_stmt, (uchar *) &ev)) + { + error("Out of memory: can't allocate memory to store the flashback events."); + exit(1); + } + } + /* end of statement check: i) destroy/free ignored maps @@ -945,7 +965,36 @@ static bool print_row_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev, if (skip_event) return 0; - return print_base64(print_event_info, ev); + if (!opt_flashback) + return print_base64(print_event_info, ev); + else + { + if (is_stmt_end) + { + bool res= false; + Log_event *e= NULL; + + // Print the row_event from the last one to the first one + for (uint i= events_in_stmt.elements; i > 0; --i) + { + e= *(dynamic_element(&events_in_stmt, i - 1, Log_event**)); + res= res || print_base64(print_event_info, e); + } + // Copy all output into the Log_event + ev->output_buf.copy(e->output_buf); + // Delete Log_event + for (uint i= 0; i < events_in_stmt.elements-1; ++i) + { + e= *(dynamic_element(&events_in_stmt, i, Log_event**)); + delete e; + } + reset_dynamic(&events_in_stmt); + + return res; + } + } + + return 0; } @@ -1386,6 +1435,8 @@ Exit_status process_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev, } if (print_base64(print_event_info, ev)) goto err; + if (opt_flashback) + reset_dynamic(&events_in_stmt); break; } case WRITE_ROWS_EVENT: @@ -1402,9 +1453,12 @@ Exit_status process_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev, case DELETE_ROWS_COMPRESSED_EVENT_V1: { Rows_log_event *e= (Rows_log_event*) ev; + bool is_stmt_end= e->get_flags(Rows_log_event::STMT_END_F); if (print_row_event(print_event_info, ev, e->get_table_id(), e->get_flags(Rows_log_event::STMT_END_F))) goto err; + if (!is_stmt_end) + destroy_evt= FALSE; break; } case PRE_GA_WRITE_ROWS_EVENT: @@ -1412,9 +1466,12 @@ Exit_status process_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev, case PRE_GA_UPDATE_ROWS_EVENT: { Old_rows_log_event *e= (Old_rows_log_event*) ev; + bool is_stmt_end= e->get_flags(Rows_log_event::STMT_END_F); if (print_row_event(print_event_info, ev, e->get_table_id(), e->get_flags(Old_rows_log_event::STMT_END_F))) goto err; + if (!is_stmt_end) + destroy_evt= FALSE; break; } case START_ENCRYPTION_EVENT: @@ -1459,7 +1516,7 @@ end: &my_charset_bin); else { - if (push_dynamic(&binlog_events, (uchar *) &tmp_str)) + if (insert_dynamic(&binlog_events, (uchar *) &tmp_str)) { error("Out of memory: can't allocate memory to store the flashback events."); exit(1); @@ -2480,7 +2537,7 @@ static Exit_status dump_remote_log_entries(PRINT_EVENT_INFO *print_event_info, int2store(buf + BIN_LOG_HEADER_SIZE, binlog_flags); size_t tlen = strlen(logname); - if (tlen > UINT_MAX) + if (tlen > sizeof(buf) - 10) { error("Log name too long."); DBUG_RETURN(ERROR_STOP); @@ -2915,9 +2972,12 @@ int main(int argc, char** argv) my_set_max_open_files(open_files_limit); if (opt_flashback) + { my_init_dynamic_array(&binlog_events, sizeof(LEX_STRING), 1024, 1024, MYF(0)); - + my_init_dynamic_array(&events_in_stmt, sizeof(Rows_log_event*), 1024, 1024, + MYF(0)); + } if (opt_stop_never) to_last_remote_log= TRUE; @@ -3031,6 +3091,7 @@ int main(int argc, char** argv) } fprintf(result_file, "COMMIT\n/*!*/;\n"); delete_dynamic(&binlog_events); + delete_dynamic(&events_in_stmt); } /* Set delimiter back to semicolon */ diff --git a/client/mysqlcheck.c b/client/mysqlcheck.c index c1ea002515b..42785b6dc7c 100644 --- a/client/mysqlcheck.c +++ b/client/mysqlcheck.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001, 2013, Oracle and/or its affiliates. - Copyright (c) 2010, 2016, MariaDB + Copyright (c) 2010, 2017, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/client/mysqldump.c b/client/mysqldump.c index 281a7a6c7f2..c8ebd2217a3 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -92,8 +92,7 @@ static void add_load_option(DYNAMIC_STRING *str, const char *option, const char *option_value); -static ulong find_set(TYPELIB *lib, const char *x, size_t length, - char **err_pos, uint *err_len); +static ulong find_set(TYPELIB *, const char *, size_t, char **, uint *); static char *alloc_query_str(ulong size); static void field_escape(DYNAMIC_STRING* in, const char *from); @@ -114,7 +113,8 @@ static my_bool verbose= 0, opt_no_create_info= 0, opt_no_data= 0, opt_no_data_m opt_slave_apply= 0, opt_include_master_host_port= 0, opt_events= 0, opt_comments_used= 0, - opt_alltspcs=0, opt_notspcs= 0, opt_logging; + opt_alltspcs=0, opt_notspcs= 0, opt_logging, + opt_drop_trigger= 0 ; static my_bool insert_pat_inited= 0, debug_info_flag= 0, debug_check_flag= 0; static ulong opt_max_allowed_packet, opt_net_buffer_length; static MYSQL mysql_connection,*mysql=0; @@ -233,6 +233,9 @@ static struct my_option my_long_options[] = {"add-drop-table", OPT_DROP, "Add a DROP TABLE before each create.", &opt_drop, &opt_drop, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, + {"add-drop-trigger", 0, "Add a DROP TRIGGER before each create.", + &opt_drop_trigger, &opt_drop_trigger, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, + 0}, {"add-locks", OPT_LOCKS, "Add locks around INSERT statements.", &opt_lock, &opt_lock, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, @@ -2170,6 +2173,7 @@ static void print_xml_comment(FILE *xml_file, size_t len, case '-': if (*(comment_string + 1) == '-') /* Only one hyphen allowed. */ break; + /* fall through */ default: fputc(*comment_string, xml_file); break; @@ -2207,7 +2211,6 @@ static void print_comment(FILE *sql_file, my_bool is_error, const char *format, print_xml_comment(sql_file, strlen(comment_buff), comment_buff); } - /* create_delimiter Generate a new (null-terminated) string that does not exist in query @@ -2552,7 +2555,7 @@ static uint dump_routines_for_db(char *db) query_buff); print_comment(sql_file, 1, "-- does %s have permissions on mysql.proc?\n\n", - current_user); + fix_for_comment(current_user)); maybe_die(EX_MYSQLERR,"%s has insufficent privileges to %s!", current_user, query_buff); } @@ -2847,6 +2850,8 @@ static uint get_table_structure(char *table, char *db, char *table_type, my_free(scv_buff); + if (path) + my_fclose(sql_file, MYF(MY_WME)); DBUG_RETURN(0); } else @@ -3281,6 +3286,10 @@ static void dump_trigger_old(FILE *sql_file, MYSQL_RES *show_triggers_rs, if (opt_compact) fprintf(sql_file, "/*!50003 SET @OLD_SQL_MODE=@@SQL_MODE*/;\n"); + if (opt_drop_trigger) + fprintf(sql_file, "/*!50032 DROP TRIGGER IF EXISTS %s */;\n", + (*show_trigger_row)[0]); + fprintf(sql_file, "DELIMITER ;;\n" "/*!50003 SET SESSION SQL_MODE=\"%s\" */;;\n" @@ -3361,6 +3370,10 @@ static int dump_trigger(FILE *sql_file, MYSQL_RES *show_create_trigger_rs, switch_sql_mode(sql_file, ";", row[1]); + if (opt_drop_trigger) + fprintf(sql_file, "/*!50032 DROP TRIGGER IF EXISTS %s */;\n", + row[0]); + query_str= cover_definer_clause(row[2], strlen(row[2]), C_STRING_WITH_LEN("50017"), C_STRING_WITH_LEN("50003"), @@ -5471,7 +5484,7 @@ static ulong find_set(TYPELIB *lib, const char *x, size_t length, var_len= (uint) (pos - start); strmake(buff, start, MY_MIN(sizeof(buff) - 1, var_len)); find= find_type(buff, lib, FIND_TYPE_BASIC); - if (!find) + if (find <= 0) { *err_pos= (char*) start; *err_len= var_len; @@ -5929,8 +5942,7 @@ static my_bool get_view_structure(char *table, char* db) dynstr_free(&ds_view); } - if (switch_character_set_results(mysql, default_charset)) - DBUG_RETURN(1); + switch_character_set_results(mysql, default_charset); /* If a separate .sql file was opened, close it now */ if (sql_file != md_result_file) diff --git a/client/mysqlimport.c b/client/mysqlimport.c index 688789ec436..38b2eb5f672 100644 --- a/client/mysqlimport.c +++ b/client/mysqlimport.c @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2015, Oracle and/or its affiliates. - Copyright (c) 2011, 2016, MariaDB + Copyright (c) 2011, 2017, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -677,7 +677,7 @@ int main(int argc, char **argv) MYF(0)))) return -2; - for (counter= 0; *argv != NULL; argv++) /* Loop through tables */ + for (; *argv != NULL; argv++) /* Loop through tables */ { pthread_mutex_lock(&counter_mutex); while (counter == opt_use_threads) diff --git a/client/mysqlshow.c b/client/mysqlshow.c index e3e30abc426..46494311f7d 100644 --- a/client/mysqlshow.c +++ b/client/mysqlshow.c @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2015, Oracle and/or its affiliates. - Copyright (c) 2010, 2016, MariaDB + Copyright (c) 2010, 2017, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/client/mysqlslap.c b/client/mysqlslap.c index b3229980e77..a78bf35d51b 100644 --- a/client/mysqlslap.c +++ b/client/mysqlslap.c @@ -1,6 +1,6 @@ /* Copyright (c) 2005, 2015, Oracle and/or its affiliates. - Copyright (c) 2010, 2016, MariaDB + Copyright (c) 2010, 2017, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/client/mysqltest.cc b/client/mysqltest.cc index d930369e303..05113f02a44 100644 --- a/client/mysqltest.cc +++ b/client/mysqltest.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2000, 2013, Oracle and/or its affiliates. - Copyright (c) 2009, 2016, Monty Program Ab. + Copyright (c) 2009, 2017, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -82,7 +82,7 @@ static my_bool non_blocking_api_enabled= 0; #define MAX_DELIMITER_LENGTH 16 #define DEFAULT_MAX_CONN 64 -#define DIE_BUFF_SIZE 8192 +#define DIE_BUFF_SIZE 256*1024 /* Flags controlling send and reap */ #define QUERY_SEND_FLAG 1 @@ -574,15 +574,17 @@ struct st_replace *glob_replace= 0; void replace_strings_append(struct st_replace *rep, DYNAMIC_STRING* ds, const char *from, int len); -static void cleanup_and_exit(int exit_code) __attribute__((noreturn)); +ATTRIBUTE_NORETURN +static void cleanup_and_exit(int exit_code); -void really_die(const char *msg) __attribute__((noreturn)); +ATTRIBUTE_NORETURN +void really_die(const char *msg); void report_or_die(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2); -void die(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2) - __attribute__((noreturn)); +ATTRIBUTE_NORETURN ATTRIBUTE_FORMAT(printf, 1, 2) +void die(const char *fmt, ...); static void make_error_message(char *buf, size_t len, const char *fmt, va_list args); -void abort_not_supported_test(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2) - __attribute__((noreturn)); +ATTRIBUTE_NORETURN ATTRIBUTE_FORMAT(printf, 1, 2) +void abort_not_supported_test(const char *fmt, ...); void verbose_msg(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2); void log_msg(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2); @@ -602,7 +604,7 @@ void do_eval(DYNAMIC_STRING *query_eval, const char *query, void str_to_file(const char *fname, char *str, int size); void str_to_file2(const char *fname, char *str, int size, my_bool append); -void fix_win_paths(char *val, int len); +void fix_win_paths(char *val, size_t len); const char *get_errname_from_code (uint error_code); int multi_reg_replace(struct st_replace_regex* r,char* val); @@ -1063,7 +1065,7 @@ void do_eval(DYNAMIC_STRING *query_eval, const char *query, if (!(v= var_get(p, &p, 0, 0))) { report_or_die( "Bad variable in eval"); - return; + DBUG_VOID_RETURN; } dynstr_append_mem(query_eval, v->str_val, v->str_val_len); } @@ -1721,12 +1723,22 @@ int cat_file(DYNAMIC_STRING* ds, const char* filename) { int fd; size_t len; - char buff[16384]; + char *buff; if ((fd= my_open(filename, O_RDONLY, MYF(0))) < 0) return 1; - while((len= my_read(fd, (uchar*)&buff, - sizeof(buff)-1, MYF(0))) > 0) + + len= (size_t) my_seek(fd, 0, SEEK_END, MYF(0)); + my_seek(fd, 0, SEEK_SET, MYF(0)); + if (len == (size_t)MY_FILEPOS_ERROR || + !(buff= (char*)my_malloc(len + 1, MYF(0)))) + { + my_close(fd, MYF(0)); + return 1; + } + len= my_read(fd, (uchar*)buff, len, MYF(0)); + my_close(fd, MYF(0)); + { char *p= buff, *start= buff,*end=buff+len; while (p < end) @@ -1749,7 +1761,7 @@ int cat_file(DYNAMIC_STRING* ds, const char* filename) *p= 0; replace_dynstr_append_mem(ds, start, p-start); } - my_close(fd, MYF(0)); + my_free(buff); return 0; } @@ -1776,7 +1788,7 @@ static int run_command(char* cmd, if (!(res_file= popen(cmd, "r"))) { report_or_die("popen(\"%s\", \"r\") failed", cmd); - return -1; + DBUG_RETURN(-1); } while (fgets(buf, sizeof(buf), res_file)) @@ -2642,6 +2654,7 @@ void var_query_set(VAR *var, const char *query, const char** query_end) if (!mysql) { struct st_command command; + DBUG_ASSERT(query_end); memset(&command, 0, sizeof(command)); command.query= (char*)query; command.first_word_len= (*query_end - query); @@ -2873,7 +2886,7 @@ void var_set_query_get_value(struct st_command *command, VAR *var) dynstr_free(&ds_query); dynstr_free(&ds_col); eval_expr(var, "", 0); - return; + DBUG_VOID_RETURN; } { @@ -2898,7 +2911,7 @@ void var_set_query_get_value(struct st_command *command, VAR *var) ds_col.str, ds_query.str); dynstr_free(&ds_query); dynstr_free(&ds_col); - return; + DBUG_VOID_RETURN; } DBUG_PRINT("info", ("Found column %d with name '%s'", i, fields[i].name)); @@ -3344,7 +3357,7 @@ void do_exec(struct st_command *command) if (!*cmd) { report_or_die("Missing argument in exec"); - return; + DBUG_VOID_RETURN; } command->last_argument= command->end; @@ -3370,6 +3383,12 @@ void do_exec(struct st_command *command) #endif #endif + if (disable_result_log) + { + /* Collect stderr output as well, for the case app. crashes or returns error.*/ + dynstr_append(&ds_cmd, " 2>&1"); + } + DBUG_PRINT("info", ("Executing '%s' as '%s'", command->first_argument, ds_cmd.str)); @@ -3378,7 +3397,7 @@ void do_exec(struct st_command *command) dynstr_free(&ds_cmd); if (command->abort_on_error) report_or_die("popen(\"%s\", \"r\") failed", command->first_argument); - return; + DBUG_VOID_RETURN; } ds_result= &ds_res; @@ -3405,16 +3424,7 @@ void do_exec(struct st_command *command) len--; } #endif - if (disable_result_log) - { - if (len) - buf[len-1] = 0; - DBUG_PRINT("exec_result",("%s", buf)); - } - else - { - replace_dynstr_append_mem(ds_result, buf, len); - } + replace_dynstr_append_mem(ds_result, buf, len); } error= pclose(res_file); @@ -3424,7 +3434,7 @@ void do_exec(struct st_command *command) dynstr_free(&ds_sorted); } - if (error > 0) + if (error) { uint status= WEXITSTATUS(error); int i; @@ -3436,7 +3446,7 @@ void do_exec(struct st_command *command) ds_cmd.str, error, status, errno, ds_res.str); dynstr_free(&ds_cmd); - return; + DBUG_VOID_RETURN; } DBUG_PRINT("info", @@ -3470,6 +3480,12 @@ void do_exec(struct st_command *command) } dynstr_free(&ds_cmd); + + if (disable_result_log) + { + /* Disable output in case of successful exit.*/ + dynstr_set(&ds_res,""); + } DBUG_VOID_RETURN; } @@ -3569,7 +3585,7 @@ void do_system(struct st_command *command) if (strlen(command->first_argument) == 0) { report_or_die("Missing arguments to system, nothing to do!"); - return; + DBUG_VOID_RETURN; } init_dynamic_string(&ds_cmd, 0, command->query_len + 64, 256); @@ -3607,6 +3623,37 @@ void do_system(struct st_command *command) } +/* returns TRUE if path is inside a sandbox */ +bool is_sub_path(const char *path, size_t plen, const char *sandbox) +{ + size_t len= strlen(sandbox); + if (!sandbox || !len || plen <= len || memcmp(path, sandbox, len - 1) + || path[len] != '/') + return false; + return true; +} + + +/* returns TRUE if path cannot be modified */ +bool bad_path(const char *path) +{ + size_t plen= strlen(path); + + const char *vardir= getenv("MYSQLTEST_VARDIR"); + if (is_sub_path(path, plen, vardir)) + return false; + + const char *tmpdir= getenv("MYSQL_TMP_DIR"); + if (is_sub_path(path, plen, tmpdir)) + return false; + + report_or_die("Path '%s' is not a subdirectory of MYSQLTEST_VARDIR '%s'" + "or MYSQL_TMP_DIR '%s'", + path, vardir, tmpdir); + return true; +} + + /* SYNOPSIS set_wild_chars @@ -3665,6 +3712,9 @@ void do_remove_file(struct st_command *command) rm_args, sizeof(rm_args)/sizeof(struct command_arg), ' '); + if (bad_path(ds_filename.str)) + DBUG_VOID_RETURN; + DBUG_PRINT("info", ("removing file: %s", ds_filename.str)); error= my_delete(ds_filename.str, MYF(disable_warnings ? 0 : MY_WME)) != 0; handle_command_error(command, error, my_errno); @@ -3708,6 +3758,9 @@ void do_remove_files_wildcard(struct st_command *command) ' '); fn_format(dirname, ds_directory.str, "", "", MY_UNPACK_FILENAME); + if (bad_path(ds_directory.str)) + DBUG_VOID_RETURN; + DBUG_PRINT("info", ("listing directory: %s", dirname)); if (!(dir_info= my_dir(dirname, MYF(MY_DONT_SORT | MY_WANT_STAT | MY_WME)))) { @@ -3782,6 +3835,9 @@ void do_copy_file(struct st_command *command) sizeof(copy_file_args)/sizeof(struct command_arg), ' '); + if (bad_path(ds_to_file.str)) + DBUG_VOID_RETURN; + DBUG_PRINT("info", ("Copy %s to %s", ds_from_file.str, ds_to_file.str)); /* MY_HOLD_ORIGINAL_MODES prevents attempts to chown the file */ error= (my_copy(ds_from_file.str, ds_to_file.str, @@ -3819,6 +3875,9 @@ void do_move_file(struct st_command *command) sizeof(move_file_args)/sizeof(struct command_arg), ' '); + if (bad_path(ds_to_file.str)) + DBUG_VOID_RETURN; + DBUG_PRINT("info", ("Move %s to %s", ds_from_file.str, ds_to_file.str)); error= (my_rename(ds_from_file.str, ds_to_file.str, MYF(disable_warnings ? 0 : MY_WME)) != 0); @@ -3857,6 +3916,9 @@ void do_chmod_file(struct st_command *command) sizeof(chmod_file_args)/sizeof(struct command_arg), ' '); + if (bad_path(ds_file.str)) + DBUG_VOID_RETURN; + /* Parse what mode to set */ if (ds_mode.length != 4 || str2int(ds_mode.str, 8, 0, INT_MAX, &mode) == NullS) @@ -3928,6 +3990,9 @@ void do_mkdir(struct st_command *command) mkdir_args, sizeof(mkdir_args)/sizeof(struct command_arg), ' '); + if (bad_path(ds_dirname.str)) + DBUG_VOID_RETURN; + DBUG_PRINT("info", ("creating directory: %s", ds_dirname.str)); error= my_mkdir(ds_dirname.str, 0777, MYF(MY_WME)) != 0; handle_command_error(command, error, my_errno); @@ -3935,6 +4000,65 @@ void do_mkdir(struct st_command *command) DBUG_VOID_RETURN; } + +/* + Remove directory recursively. +*/ +static int rmtree(const char *dir) +{ + char path[FN_REFLEN]; + char sep[]={ FN_LIBCHAR, 0 }; + int err=0; + + MY_DIR *dir_info= my_dir(dir, MYF(MY_DONT_SORT | MY_WANT_STAT)); + if (!dir_info) + return 1; + + for (uint i= 0; i < dir_info->number_of_files; i++) + { + FILEINFO *file= dir_info->dir_entry + i; + /* Skip "." and ".." */ + if (!strcmp(file->name, ".") || !strcmp(file->name, "..")) + continue; + + strxnmov(path, sizeof(path), dir, sep, file->name, NULL); + + if (!MY_S_ISDIR(file->mystat->st_mode)) + { + err= my_delete(path, 0); +#ifdef _WIN32 + /* + On Windows, check and possible reset readonly attribute. + my_delete(), or DeleteFile does not remove theses files. + */ + if (err) + { + DWORD attr= GetFileAttributes(path); + if (attr != INVALID_FILE_ATTRIBUTES && + (attr & FILE_ATTRIBUTE_READONLY)) + { + SetFileAttributes(path, attr &~ FILE_ATTRIBUTE_READONLY); + err= my_delete(path, 0); + } + } +#endif + } + else + err= rmtree(path); + + if(err) + break; + } + + my_dirend(dir_info); + + if (!err) + err= rmdir(dir); + + return err; +} + + /* SYNOPSIS do_rmdir @@ -3942,12 +4066,11 @@ void do_mkdir(struct st_command *command) DESCRIPTION rmdir - Remove the empty directory + Remove the directory tree */ void do_rmdir(struct st_command *command) { - int error; static DYNAMIC_STRING ds_dirname; const struct command_arg rmdir_args[] = { { "dirname", ARG_STRING, TRUE, &ds_dirname, "Directory to remove" } @@ -3958,9 +4081,13 @@ void do_rmdir(struct st_command *command) rmdir_args, sizeof(rmdir_args)/sizeof(struct command_arg), ' '); + if (bad_path(ds_dirname.str)) + DBUG_VOID_RETURN; + DBUG_PRINT("info", ("removing directory: %s", ds_dirname.str)); - error= rmdir(ds_dirname.str) != 0; - handle_command_error(command, error, errno); + if (rmtree(ds_dirname.str)) + handle_command_error(command, 1, errno); + dynstr_free(&ds_dirname); DBUG_VOID_RETURN; } @@ -4073,6 +4200,9 @@ static void do_list_files_write_file_command(struct st_command *command, list_files_args, sizeof(list_files_args)/sizeof(struct command_arg), ' '); + if (bad_path(ds_filename.str)) + DBUG_VOID_RETURN; + init_dynamic_string(&ds_content, "", 1024, 1024); error= get_list_files(&ds_content, &ds_dirname, &ds_wild); handle_command_error(command, error, my_errno); @@ -4124,7 +4254,8 @@ void read_until_delimiter(DYNAMIC_STRING *ds, while (1) { c= my_getc(cur_file->file); - + if (c == '\r') + c= my_getc(cur_file->file); if (c == '\n') { cur_file->lineno++; @@ -4175,6 +4306,9 @@ void do_write_file_command(struct st_command *command, my_bool append) sizeof(write_file_args)/sizeof(struct command_arg), ' '); + if (bad_path(ds_filename.str)) + DBUG_VOID_RETURN; + if (!append && access(ds_filename.str, F_OK) == 0) { /* The file should not be overwritten */ @@ -4556,7 +4690,7 @@ void do_perl(struct st_command *command) if (command->abort_on_error) die("popen(\"%s\", \"r\") failed", buf); dynstr_free(&ds_delimiter); - return; + DBUG_VOID_RETURN; } while (fgets(buf, sizeof(buf), res_file)) @@ -6388,6 +6522,16 @@ my_bool end_of_query(int c) } +static inline bool is_escape_char(char c, char in_string) +{ + if (c != '\\' || in_string == '`') return false; + if (!cur_con) return true; + uint server_status= cur_con->mysql->server_status; + if (server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES) return false; + return !(server_status & SERVER_STATUS_ANSI_QUOTES && in_string == '"'); +} + + /* Read one "line" from the file @@ -6414,7 +6558,7 @@ my_bool end_of_query(int c) int read_line(char *buf, int size) { - char c, UNINIT_VAR(last_quote), last_char= 0; + char c, last_quote=0, last_char= 0; char *p= buf, *buf_end= buf + size - 1; int skip_char= 0; my_bool have_slash= FALSE; @@ -6496,7 +6640,7 @@ int read_line(char *buf, int size) state= R_Q; } } - have_slash= (c == '\\'); + have_slash= is_escape_char(c, last_quote); break; case R_COMMENT: @@ -6566,7 +6710,7 @@ int read_line(char *buf, int size) case R_Q: if (c == last_quote) state= R_NORMAL; - else if (c == '\\') + else if (is_escape_char(c, last_quote)) state= R_SLASH_IN_Q; break; @@ -7345,7 +7489,7 @@ void free_win_path_patterns() => all \ from c:\mysql\m... until next space is converted into / */ -void fix_win_paths(char *val, int len) +void fix_win_paths(char *val, size_t len) { #ifdef _WIN32 uint i; @@ -9875,25 +10019,39 @@ bool parse_re_part(char *start_re, char *end_re, Returns: st_replace_regex struct with pairs of substitutions */ +void append_replace_regex(char*, char*, struct st_replace_regex*, char**); struct st_replace_regex* init_replace_regex(char* expr) { + char *expr_end, *buf_p; struct st_replace_regex* res; - char* buf,*expr_end; - char* p, start_re, end_re= 1; - char* buf_p; uint expr_len= strlen(expr); - struct st_regex reg; /* my_malloc() will die on fail with MY_FAE */ res=(struct st_replace_regex*)my_malloc( - sizeof(*res)+expr_len ,MYF(MY_FAE+MY_WME)); + sizeof(*res)+8192 ,MYF(MY_FAE+MY_WME)); my_init_dynamic_array(&res->regex_arr,sizeof(struct st_regex), 128, 128, MYF(0)); - buf= (char*)res + sizeof(*res); expr_end= expr + expr_len; + buf_p= (char*)res + sizeof(*res); + append_replace_regex(expr, expr_end, res, &buf_p); + + res->odd_buf_len= res->even_buf_len= 8192; + res->even_buf= (char*)my_malloc(res->even_buf_len,MYF(MY_WME+MY_FAE)); + res->odd_buf= (char*)my_malloc(res->odd_buf_len,MYF(MY_WME+MY_FAE)); + res->buf= res->even_buf; + + return res; +} + + +void append_replace_regex(char* expr, char *expr_end, struct st_replace_regex* res, + char **buf_p) +{ + char* p, start_re, end_re= 1; + struct st_regex reg; + p= expr; - buf_p= buf; /* for each regexp substitution statement */ while (p < expr_end) @@ -9912,13 +10070,34 @@ struct st_replace_regex* init_replace_regex(char* expr) } start_re= 0; - reg.pattern= buf_p; - if (parse_re_part(&start_re, &end_re, &p, expr_end, &buf_p)) - goto err; + reg.pattern= *buf_p; - reg.replace= buf_p; - if (parse_re_part(&start_re, &end_re, &p, expr_end, &buf_p)) - goto err; + /* Allow variable for the *entire* list of replacements */ + if (*p == '$') + { + const char *v_end; + VAR *val= var_get(p, &v_end, 0, 1); + + if (val) + { + char *expr, *expr_end; + expr= val->str_val; + expr_end= expr + val->str_val_len; + append_replace_regex(expr, expr_end, res, buf_p); + } + + p= (char *) v_end + 1; + continue; + } + else + { + if (parse_re_part(&start_re, &end_re, &p, expr_end, buf_p)) + goto err; + + reg.replace= *buf_p; + if (parse_re_part(&start_re, &end_re, &p, expr_end, buf_p)) + goto err; + } /* Check if we should do matching case insensitive */ if (p < expr_end && *p == 'i') @@ -9931,17 +10110,12 @@ struct st_replace_regex* init_replace_regex(char* expr) if (insert_dynamic(&res->regex_arr, ®)) die("Out of memory"); } - res->odd_buf_len= res->even_buf_len= 8192; - res->even_buf= (char*)my_malloc(res->even_buf_len,MYF(MY_WME+MY_FAE)); - res->odd_buf= (char*)my_malloc(res->odd_buf_len,MYF(MY_WME+MY_FAE)); - res->buf= res->even_buf; - return res; + return; err: my_free(res); die("Error parsing replace_regex \"%s\"", expr); - return 0; } /* @@ -10021,12 +10195,6 @@ void do_get_replace_regex(struct st_command *command) { char *expr= command->first_argument; free_replace_regex(); - /* Allow variable for the *entire* list of replacements */ - if (*expr == '$') - { - VAR *val= var_get(expr, NULL, 0, 1); - expr= val ? val->str_val : NULL; - } if (expr && *expr && !(glob_replace_regex=init_replace_regex(expr))) die("Could not init replace_regex"); command->last_argument= command->end; diff --git a/cmake/build_configurations/mysql_release.cmake b/cmake/build_configurations/mysql_release.cmake index 726a151a5b1..fcac8dde6e9 100644 --- a/cmake/build_configurations/mysql_release.cmake +++ b/cmake/build_configurations/mysql_release.cmake @@ -88,20 +88,24 @@ ENDIF() OPTION(ENABLED_LOCAL_INFILE "" ON) SET(WITH_INNODB_SNAPPY OFF CACHE STRING "") IF(WIN32) + SET(WITH_LIBARCHIVE STATIC CACHE STRING "") ELSEIF(RPM) SET(WITH_SSL system CACHE STRING "") SET(WITH_ZLIB system CACHE STRING "") SET(CHECKMODULE /usr/bin/checkmodule CACHE STRING "") SET(SEMODULE_PACKAGE /usr/bin/semodule_package CACHE STRING "") + SET(WITH_LIBARCHIVE ON CACHE STRING "") ELSEIF(DEB) SET(WITH_SSL system CACHE STRING "") SET(WITH_ZLIB system CACHE STRING "") SET(WITH_LIBWRAP ON) SET(HAVE_EMBEDDED_PRIVILEGE_CONTROL ON) + SET(WITH_LIBARCHIVE ON CACHE STRING "") ELSE() SET(WITH_SSL bundled CACHE STRING "") SET(WITH_ZLIB bundled CACHE STRING "") SET(WITH_JEMALLOC static CACHE STRING "") + SET(WITH_LIBARCHIVE STATIC CACHE STRING "") ENDIF() IF(NOT COMPILATION_COMMENT) diff --git a/cmake/cpack_rpm.cmake b/cmake/cpack_rpm.cmake index dced85f3a22..47daa88d0a2 100644 --- a/cmake/cpack_rpm.cmake +++ b/cmake/cpack_rpm.cmake @@ -23,13 +23,22 @@ SET(CPACK_COMPONENT_SHAREDLIBRARIES_GROUP "shared") SET(CPACK_COMPONENT_COMMON_GROUP "common") SET(CPACK_COMPONENT_CLIENTPLUGINS_GROUP "common") SET(CPACK_COMPONENT_COMPAT_GROUP "compat") +SET(CPACK_COMPONENT_BACKUP_GROUP "backup") + SET(CPACK_COMPONENTS_ALL Server ManPagesServer IniFiles Server_Scripts SupportFiles Development ManPagesDevelopment ManPagesTest Readme ManPagesClient Test - Common Client SharedLibraries ClientPlugins) + Common Client SharedLibraries ClientPlugins + backup +) SET(CPACK_RPM_PACKAGE_NAME ${CPACK_PACKAGE_NAME}) -SET(CPACK_PACKAGE_FILE_NAME "${CPACK_RPM_PACKAGE_NAME}-${VERSION}-${RPM}-${CMAKE_SYSTEM_PROCESSOR}") +IF(CMAKE_VERSION VERSION_LESS "3.6.0") + SET(CPACK_PACKAGE_FILE_NAME "${CPACK_RPM_PACKAGE_NAME}-${VERSION}-${RPM}-${CMAKE_SYSTEM_PROCESSOR}") +ELSE() + SET(CPACK_RPM_FILE_NAME "RPM-DEFAULT") + SET(CPACK_RPM_DEBUGINFO_PACKAGE ON) +ENDIF() SET(CPACK_RPM_PACKAGE_RELEASE "1%{?dist}") SET(CPACK_RPM_PACKAGE_LICENSE "GPLv2") @@ -112,6 +121,7 @@ SET(CPACK_RPM_client_USER_FILELIST ${ignored} "%config(noreplace) ${INSTALL_SYSC SET(CPACK_RPM_compat_USER_FILELIST ${ignored}) SET(CPACK_RPM_devel_USER_FILELIST ${ignored}) SET(CPACK_RPM_test_USER_FILELIST ${ignored}) +SET(CPACK_RPM_backup_USER_FILELIST ${ignored}) # "set/append array" - append a set of strings, separated by a space MACRO(SETA var) diff --git a/cmake/create_initial_db.cmake.in b/cmake/create_initial_db.cmake.in index c77e28d882c..baa48847815 100644 --- a/cmake/create_initial_db.cmake.in +++ b/cmake/create_initial_db.cmake.in @@ -82,7 +82,3 @@ EXECUTE_PROCESS ( IF(NOT RESULT EQUAL 0) MESSAGE(FATAL_ERROR "Could not create initial database \n ${OUT} \n ${ERR}") ENDIF() - -EXECUTE_PROCESS ( - COMMAND "@CMAKE_COMMAND@" -E touch ${CMAKE_CURRENT_BINARY_DIR}/initdb.dep -) diff --git a/cmake/for_clients.cmake b/cmake/for_clients.cmake index 636610e7fba..e5916c56ddc 100644 --- a/cmake/for_clients.cmake +++ b/cmake/for_clients.cmake @@ -45,7 +45,7 @@ MACRO(EXTRACT_LINK_LIBRARIES target var) ENDIF() ENDMACRO() -EXTRACT_LINK_LIBRARIES(mariadb LIBS) +EXTRACT_LINK_LIBRARIES(libmariadb LIBS) EXTRACT_LINK_LIBRARIES(mysqlserver EMB_LIBS) SET(LIBS "-lmariadb ${ZLIB_DEPS} ${LIBS} ${openssl_libs}") @@ -72,6 +72,6 @@ REPLACE_FOR_CLIENTS(CFLAGS "[DU]DBUG_OFF" "[DU]SAFE_MUTEX" "[DU]NDEBUG" "xstrconst" "xc99=none" "AC99" "restrict" "W[-A-Za-z]*=[-A-Za-z0-9]*") # Same for --libs -REPLACE_FOR_CLIENTS(LIBS lmtmalloc static-libcxa i-static static-intel) +REPLACE_FOR_CLIENTS(LIBS "Wl,[^ ]*" lmtmalloc static-libcxa i-static static-intel) REPLACE_FOR_CLIENTS(EMB_LIBS lmtmalloc static-libcxa i-static static-intel) diff --git a/cmake/mariadb_connector_c.cmake b/cmake/mariadb_connector_c.cmake index 400fcda0c1a..6773314313b 100644 --- a/cmake/mariadb_connector_c.cmake +++ b/cmake/mariadb_connector_c.cmake @@ -1,17 +1,3 @@ -IF(NOT EXISTS ${CMAKE_SOURCE_DIR}/libmariadb/CMakeLists.txt AND GIT_EXECUTABLE) - EXECUTE_PROCESS(COMMAND "${GIT_EXECUTABLE}" submodule init - WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - EXECUTE_PROCESS(COMMAND "${GIT_EXECUTABLE}" submodule update - WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") -ENDIF() -IF(NOT EXISTS ${CMAKE_SOURCE_DIR}/libmariadb/CMakeLists.txt) - MESSAGE(FATAL_ERROR "No MariaDB Connector/C! Run - git submodule init - git submodule update -Then restart the build. -") -ENDIF() - SET(OPT CONC_) IF (CMAKE_BUILD_TYPE STREQUAL "Debug") diff --git a/cmake/os/Windows.cmake b/cmake/os/Windows.cmake index 22f1ff7f30d..37fd204ed72 100644 --- a/cmake/os/Windows.cmake +++ b/cmake/os/Windows.cmake @@ -139,8 +139,8 @@ IF(MSVC) ENDIF() #TODO: update the code and remove the disabled warnings - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4800 /wd4805 /wd4996") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4800 /wd4805 /wd4996 /wd4291 /wd4577 /we4099") + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4800 /wd4805 /wd4996 /we4700") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4800 /wd4805 /wd4996 /wd4291 /wd4577 /we4099 /we4700") ENDIF() diff --git a/cmake/pcre.cmake b/cmake/pcre.cmake index 45d9bc01ddb..894bde38974 100644 --- a/cmake/pcre.cmake +++ b/cmake/pcre.cmake @@ -5,7 +5,7 @@ MACRO (CHECK_PCRE) IF(WITH_PCRE STREQUAL "system" OR WITH_PCRE STREQUAL "auto") CHECK_LIBRARY_EXISTS(pcre pcre_stack_guard "" HAVE_PCRE) ENDIF() - IF(NOT HAVE_PCRE) + IF(NOT HAVE_PCRE OR WITH_PCRE STREQUAL "bundled") IF (WITH_PCRE STREQUAL "system") MESSAGE(FATAL_ERROR "system pcre is not found or unusable") ENDIF() diff --git a/cmake/plugin.cmake b/cmake/plugin.cmake index 354ee53c7bb..df3115bc8f3 100644 --- a/cmake/plugin.cmake +++ b/cmake/plugin.cmake @@ -201,13 +201,15 @@ MACRO(MYSQL_ADD_PLUGIN) # executable to the linker command line (it would result into link error). # Thus we skip TARGET_LINK_LIBRARIES on Linux, as it would only generate # an additional dependency. - IF(NOT ARG_CLIENT) + IF(ARG_RECOMPILE_FOR_EMBEDDED OR ARG_STORAGE_ENGINE) IF(MSVC) ADD_DEPENDENCIES(${target} gen_mysqld_lib) TARGET_LINK_LIBRARIES(${target} mysqld_import_lib) ELSEIF(NOT CMAKE_SYSTEM_NAME STREQUAL "Linux") TARGET_LINK_LIBRARIES (${target} mysqld) ENDIF() + ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND NOT WITH_ASAN) + TARGET_LINK_LIBRARIES (${target} "-Wl,--no-undefined") ENDIF() ADD_DEPENDENCIES(${target} GenError ${ARG_DEPENDENCIES}) @@ -233,9 +235,11 @@ MACRO(MYSQL_ADD_PLUGIN) SET(CPACK_RPM_${ARG_COMPONENT}_PACKAGE_PROVIDES "cmake_bug_13248" PARENT_SCOPE) SET(CPACK_RPM_${ARG_COMPONENT}_PACKAGE_OBSOLETES "cmake_bug_13248" PARENT_SCOPE) SET(CPACK_RPM_${ARG_COMPONENT}_USER_FILELIST ${ignored} PARENT_SCOPE) - IF(NOT ARG_CLIENT AND NOT ARG_CONFIG AND UNIX) - SET(ARG_CONFIG "${CMAKE_CURRENT_BINARY_DIR}/${target}.cnf") - FILE(WRITE ${ARG_CONFIG} "[mariadb]\nplugin-load-add=${ARG_MODULE_OUTPUT_NAME}.so\n") + IF(NOT ARG_CLIENT AND UNIX) + IF (NOT ARG_CONFIG) + SET(ARG_CONFIG "${CMAKE_CURRENT_BINARY_DIR}/${target}.cnf") + FILE(WRITE ${ARG_CONFIG} "[mariadb]\nplugin-load-add=${ARG_MODULE_OUTPUT_NAME}.so\n") + ENDIF() INSTALL(FILES ${ARG_CONFIG} COMPONENT ${ARG_COMPONENT} DESTINATION ${INSTALL_SYSCONF2DIR}) SET(CPACK_RPM_${ARG_COMPONENT}_USER_FILELIST ${ignored} "%config(noreplace) ${INSTALL_SYSCONF2DIR}/*" PARENT_SCOPE) ENDIF() diff --git a/cmake/ssl.cmake b/cmake/ssl.cmake index d407ea3d26f..65abb27923b 100644 --- a/cmake/ssl.cmake +++ b/cmake/ssl.cmake @@ -1,4 +1,5 @@ -# Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2012, Oracle and/or its affiliates. +# Copyright (c) 2011, 2017, MariaDB Corporation # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -11,7 +12,7 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # We support different versions of SSL: # - "bundled" uses source code in /extra/yassl @@ -159,7 +160,7 @@ MACRO (MYSQL_CHECK_SSL) HAVE_EncryptAes128Gcm) ELSE() IF(WITH_SSL STREQUAL "system") - MESSAGE(SEND_ERROR "Cannot find appropriate system libraries for SSL. Use WITH_SSL=bundled to enable SSL support") + MESSAGE(SEND_ERROR "Cannot find appropriate system libraries for SSL. Use WITH_SSL=bundled to enable SSL support") ENDIF() MYSQL_USE_BUNDLED_SSL() ENDIF() diff --git a/cmake/submodules.cmake b/cmake/submodules.cmake new file mode 100644 index 00000000000..672a3affc1d --- /dev/null +++ b/cmake/submodules.cmake @@ -0,0 +1,31 @@ +# update submodules automatically +IF(GIT_EXECUTABLE AND EXISTS "${CMAKE_SOURCE_DIR}/.git") + EXECUTE_PROCESS(COMMAND "${GIT_EXECUTABLE}" config --get cmake.update-submodules + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + OUTPUT_VARIABLE cmake_update_submodules + RESULT_VARIABLE git_config_get_result) + IF(git_config_get_result EQUAL 128 OR cmake_update_submodules MATCHES no) + SET(update_result 0) + ELSEIF (cmake_update_submodules MATCHES force) + MESSAGE(STATUS "Updating submodules (forced)") + EXECUTE_PROCESS(COMMAND "${GIT_EXECUTABLE}" submodule update --init --force + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + RESULT_VARIABLE update_result) + ELSEIF (cmake_update_submodules MATCHES yes) + EXECUTE_PROCESS(COMMAND "${GIT_EXECUTABLE}" submodule update --init + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + RESULT_VARIABLE update_result) + ELSE() + MESSAGE(STATUS "Updating submodules") + EXECUTE_PROCESS(COMMAND "${GIT_EXECUTABLE}" submodule update --init + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + RESULT_VARIABLE update_result) + ENDIF() +ENDIF() + +IF(update_result OR NOT EXISTS ${CMAKE_SOURCE_DIR}/libmariadb/CMakeLists.txt) + MESSAGE(FATAL_ERROR "No MariaDB Connector/C! Run + git submodule update --init +Then restart the build. +") +ENDIF() diff --git a/cmake/systemd.cmake b/cmake/systemd.cmake index 841b52280e2..6986cb748ce 100644 --- a/cmake/systemd.cmake +++ b/cmake/systemd.cmake @@ -70,9 +70,11 @@ MACRO(CHECK_SYSTEMD) UNSET(HAVE_SYSTEMD_SD_NOTIFYF) MESSAGE_ONCE(systemd "Systemd features not enabled") IF(WITH_SYSTEMD STREQUAL "yes") - MESSAGE(FATAL_ERROR "Requested WITH_SYSTEMD=YES however no dependencies installed/found") + MESSAGE(FATAL_ERROR "Requested WITH_SYSTEMD=yes however no dependencies installed/found") ENDIF() ENDIF() + ELSEIF(NOT WITH_SYSTEMD STREQUAL "no") + MESSAGE(FATAL_ERROR "Invalid value for WITH_SYSTEMD. Must be 'yes', 'no', or 'auto'.") ENDIF() ENDIF() ENDMACRO() diff --git a/cmake/wsrep.cmake b/cmake/wsrep.cmake index 0a1c7dd9697..e6d1379aea3 100644 --- a/cmake/wsrep.cmake +++ b/cmake/wsrep.cmake @@ -26,7 +26,7 @@ ENDIF() OPTION(WITH_WSREP "WSREP replication API (to use, e.g. Galera Replication library)" ${with_wsrep_default}) # Set the patch version -SET(WSREP_PATCH_VERSION "19") +SET(WSREP_PATCH_VERSION "20") # Obtain wsrep API version FILE(STRINGS "${MySQL_SOURCE_DIR}/wsrep/wsrep_api.h" WSREP_API_VERSION @@ -41,4 +41,3 @@ SET(WSREP_PROC_INFO ${WITH_WSREP}) IF(WITH_WSREP) SET(WSREP_PATCH_VERSION "wsrep_${WSREP_VERSION}") ENDIF() - diff --git a/config.h.cmake b/config.h.cmake index c0fad4a3efe..51abd4b11d5 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -576,21 +576,4 @@ #define __STDC_FORMAT_MACROS #endif -/* - stat structure (from ) is conditionally defined - to have different layout and size depending on the defined macros. - The correct macro is defined in my_config.h, which means it MUST be - included first (or at least before - so, practically, - before including any system headers). - - Check the include order by looking at __GLIBC__ (defined in ) - - But we cannot force all third-party clients/connectors to include - my_config.h first. So, their crashes are their responsibility, - we enable this check only for MariaDB sources (SAFE_MUTEX check). -*/ -#if defined(__GLIBC__) && defined(SAFE_MUTEX) -#error MUST be included first! -#endif - #endif diff --git a/debian/additions/enable_encryption.preset b/debian/additions/enable_encryption.preset new file mode 100644 index 00000000000..287bc03413a --- /dev/null +++ b/debian/additions/enable_encryption.preset @@ -0,0 +1,20 @@ +# +# !include this file into your my.cnf (or any of *.cnf files in /etc/mysql/conf.d) +# and it will enable data at rest encryption. This is a simple way to +# ensure that everything that can be encrypted will be and your +# data will not leak unencrypted. +# +# DO NOT EDIT THIS FILE! On MariaDB upgrades it might be replaced with a +# newer version and your edits will be lost. Instead, add your edits +# to the .cnf file after the !include directive. +# +# NOTE that you also need to install an encryption plugin for the encryption +# to work. See https://mariadb.com/kb/en/mariadb/data-at-rest-encryption/#encryption-key-management +# +[mariadb] +aria-encrypt-tables +encrypt-binlog +encrypt-tmp-disk-tables +encrypt-tmp-files +loose-innodb-encrypt-log +loose-innodb-encrypt-tables diff --git a/debian/autobake-deb.sh b/debian/autobake-deb.sh index b6d1711e6ea..92c68c225d7 100755 --- a/debian/autobake-deb.sh +++ b/debian/autobake-deb.sh @@ -81,6 +81,11 @@ if [[ $GCCVERSION -lt 40800 ]] || [[ $(arch) =~ i[346]86 ]] then sed '/Package: mariadb-plugin-rocksdb/,+7d' -i debian/control fi +if [[ $GCCVERSION -lt 40800 ]] +then + sed '/Package: mariadb-plugin-aws-key-management-10.2/,+13d' -i debian/control +fi + # Adjust changelog, add new version echo "Incrementing changelog and starting build scripts" diff --git a/debian/control b/debian/control index c501078f678..e2d99d61ad4 100644 --- a/debian/control +++ b/debian/control @@ -21,7 +21,7 @@ Build-Depends: bison, libpam0g-dev, libpcre3-dev (>= 2:8.35-3.2~), libreadline-gplv2-dev, - libssl-dev, + libssl-dev | libssl1.0-dev, libsnappy-dev, libsystemd-dev, libxml2-dev, @@ -30,6 +30,7 @@ Build-Depends: bison, po-debconf, psmisc, unixodbc-dev, + uuid-dev, zlib1g-dev (>= 1:1.1.3-5~) Standards-Version: 3.8.2 Homepage: http://mariadb.org/ @@ -47,13 +48,9 @@ Conflicts: mariadb-galera-server-10.0 (<< 10.0.5), mariadb-server-5.2, mariadb-server-5.3, mariadb-server-5.5 (<< 5.5.33) -Replaces: libmariadbclient18, - libmysqlclient18, - libmysqlclient19, +Replaces: libmysqlclient19, libmysqlclient20 -Provides: libmariadbclient18, - libmysqlclient18, - libmysqlclient19, +Provides: libmysqlclient19, libmysqlclient20 Description: MariaDB database client library MariaDB is a fast, stable and true multi-user, multi-threaded SQL database @@ -67,27 +64,29 @@ Package: libmariadbclient18 Section: libs Architecture: any Depends: libmariadb3 (= ${binary:Version}), ${misc:Depends} +Replaces: libmariadbclient18 +Provides: libmariadbclient18 Description: Virtual package to satisfy external depends MariaDB is a fast, stable and true multi-user, multi-threaded SQL database server. SQL (Structured Query Language) is the most popular database query language in the world. The main goals of MariaDB are speed, robustness and ease of use. . - This is an empty package that depends on the libmariadb3 - package. + This package provides compatibility symlinks for libmariadb3 Package: libmysqlclient18 Section: libs Architecture: any Depends: libmariadb3 (= ${binary:Version}), ${misc:Depends} +Replaces: libmysqlclient18 +Provides: libmysqlclient18 Description: Virtual package to satisfy external depends MariaDB is a fast, stable and true multi-user, multi-threaded SQL database server. SQL (Structured Query Language) is the most popular database query language in the world. The main goals of MariaDB are speed, robustness and ease of use. . - This is an empty package that depends on the libmariadb3 - package. + This package provides compatibility symlinks for libmariadb3 Package: libmariadb-dev Architecture: any @@ -173,8 +172,7 @@ Description: MariaDB database common files (e.g. /etc/mysql/conf.d/mariadb.cnf) Package: mariadb-client-core-10.2 Architecture: any -Depends: libmariadb3 (>= ${source:Version}), - mariadb-common (>= ${source:Version}), +Depends: mariadb-common (>= ${source:Version}), ${misc:Depends}, ${shlibs:Depends} Conflicts: mariadb-client-10.0, @@ -237,7 +235,6 @@ Description: MariaDB database core client binaries Package: mariadb-client-10.2 Architecture: any Depends: debianutils (>=1.6), - libmariadb3 (>= ${source:Version}), mariadb-client-core-10.2 (>= ${source:Version}), mariadb-common, ${misc:Depends}, @@ -291,8 +288,7 @@ Description: MariaDB database client binaries Package: mariadb-server-core-10.2 Architecture: any -Depends: libmariadb3 (>= ${binary:Version}), - mariadb-common (>= ${source:Version}), +Depends: mariadb-common (>= ${source:Version}), ${misc:Depends}, ${shlibs:Depends} Conflicts: mariadb-server-core-10.0, @@ -552,6 +548,16 @@ Breaks: mariadb-gssapi-client-10.1, mariadb-gssapi-client-10.2 Replaces: mariadb-gssapi-client-10.1, mariadb-gssapi-client-10.2 Description: GSSAPI authentication plugin for MariaDB client +Package: mariadb-backup-10.2 +Section: database +Architecture: any +Breaks: mariadb-backup-10.1 +Replaces: mariadb-backup-10.1 +Depends: mariadb-server-10.2, + ${misc:Depends}, + ${shlibs:Depends} +Description: Backup tool for MariaDB server + Package: mariadb-plugin-cracklib-password-check Architecture: any Depends: libcrack2 (>= 2.9.0), @@ -562,6 +568,20 @@ Description: CrackLib Password Validation Plugin for MariaDB This password validation plugin uses cracklib to allow only sufficiently secure (as defined by cracklib) user passwords in MariaDB. +Package: mariadb-plugin-aws-key-management-10.2 +Section: database +Architecture: any +Breaks: mariadb-aws-key-management-10.1 +Replaces: mariadb-aws-key-management-10.1 +Depends: mariadb-server-10.2, + libcurl3, + ${misc:Depends}, + ${shlibs:Depends} +Description: Amazon Web Service Key Management Service Plugin for MariaDB + This encryption key management plugin gives an interface to the Amazon Web + Services Key Management Service for managing encryption keys used for MariaDB + data-at-rest encryption. + Package: mariadb-test Architecture: any Depends: mariadb-client-10.2 (= ${binary:Version}), diff --git a/debian/libmariadb-dev.install b/debian/libmariadb-dev.install index e11eceb704e..e62aad1b43f 100644 --- a/debian/libmariadb-dev.install +++ b/debian/libmariadb-dev.install @@ -1,7 +1,8 @@ usr/bin/mysql_config -usr/include/mysql/*.h -usr/include/mysql/psi/*.h +usr/include/mysql usr/lib/*/libmariadb.so +usr/lib/*/libmysqlclient.so +usr/lib/*/libmariadbclient.so usr/lib/*/libmariadbclient.a usr/lib/*/libmysqlservices.a usr/share/aclocal/mysql.m4 diff --git a/debian/libmariadb-dev.links b/debian/libmariadb-dev.links deleted file mode 100644 index 0076791dcfa..00000000000 --- a/debian/libmariadb-dev.links +++ /dev/null @@ -1,2 +0,0 @@ -usr/lib/libmysqlclient.so.18 usr/lib/libmysqlclient.so -usr/lib/libmysqlclient_r.so.18 usr/lib/libmysqlclient_r.so diff --git a/debian/libmariadb3.install b/debian/libmariadb3.install index cdb1e5918df..58e2bd1dcb2 100644 --- a/debian/libmariadb3.install +++ b/debian/libmariadb3.install @@ -1,5 +1,5 @@ -usr/lib/*/libmariadbclient.so.* -usr/lib/*/libmysqlclient.so.* +usr/lib/*/libmysqlclient.so.19 +usr/lib/*/libmysqlclient.so.20 usr/lib/*/libmariadb.so.* usr/lib/mysql/plugin/dialog.so usr/lib/mysql/plugin/mysql_clear_password.so diff --git a/debian/libmariadbclient18.install b/debian/libmariadbclient18.install new file mode 100644 index 00000000000..e3939fa4fc7 --- /dev/null +++ b/debian/libmariadbclient18.install @@ -0,0 +1 @@ +usr/lib/*/libmariadbclient.so.18 diff --git a/debian/libmysqlclient18.install b/debian/libmysqlclient18.install new file mode 100644 index 00000000000..3193873093f --- /dev/null +++ b/debian/libmysqlclient18.install @@ -0,0 +1 @@ +usr/lib/*/libmysqlclient.so.18 diff --git a/debian/mariadb-backup-10.2.install b/debian/mariadb-backup-10.2.install new file mode 100644 index 00000000000..734117c92e2 --- /dev/null +++ b/debian/mariadb-backup-10.2.install @@ -0,0 +1,2 @@ +usr/bin/mariabackup +usr/bin/mbstream diff --git a/debian/mariadb-plugin-aws-key-management-10.2.install b/debian/mariadb-plugin-aws-key-management-10.2.install new file mode 100644 index 00000000000..ed966b4115d --- /dev/null +++ b/debian/mariadb-plugin-aws-key-management-10.2.install @@ -0,0 +1,2 @@ +usr/lib/mysql/plugin/aws_key_management.so +debian/additions/enable_encryption.preset etc/mysql/conf.d/ diff --git a/debian/mariadb-server-10.2.install b/debian/mariadb-server-10.2.install index 3b5a475f486..81981fe1f60 100644 --- a/debian/mariadb-server-10.2.install +++ b/debian/mariadb-server-10.2.install @@ -38,6 +38,7 @@ usr/bin/wsrep_sst_mysqldump usr/bin/wsrep_sst_rsync usr/bin/wsrep_sst_xtrabackup usr/bin/wsrep_sst_xtrabackup-v2 +usr/bin/wsrep_sst_mariabackup usr/lib/mysql/plugin/auth_pam.so usr/lib/mysql/plugin/auth_socket.so usr/lib/mysql/plugin/file_key_management.so diff --git a/debian/mariadb-server-core-10.2.install b/debian/mariadb-server-core-10.2.install index 9ab77b2f95a..d882bd53f52 100644 --- a/debian/mariadb-server-core-10.2.install +++ b/debian/mariadb-server-core-10.2.install @@ -10,6 +10,7 @@ usr/share/mysql/estonian usr/share/mysql/french usr/share/mysql/german usr/share/mysql/greek +usr/share/mysql/hindi usr/share/mysql/hungarian usr/share/mysql/italian usr/share/mysql/japanese diff --git a/debian/patches/50_mysql-test__db_test.dpatch b/debian/patches/50_mysql-test__db_test.dpatch index 670afbf14ac..14c0fc4acf6 100755 --- a/debian/patches/50_mysql-test__db_test.dpatch +++ b/debian/patches/50_mysql-test__db_test.dpatch @@ -11,14 +11,14 @@ --- old/mysql-test/mysql-test-run.pl 2009-06-16 14:24:09.000000000 +0200 +++ new/mysql-test/mysql-test-run.pl 2009-07-04 00:03:34.000000000 +0200 @@ -3578,6 +3578,11 @@ sub mysql_install_db { - mtr_appendfile_to_file("$sql_dir/mysql_system_tables_data.sql", - $bootstrap_sql_file); + mtr_appendfile_to_file("$sql_dir/mysql_system_tables_data.sql", + $bootstrap_sql_file); -+ mtr_tofile($bootstrap_sql_file, "-- Debian removed the default privileges on the 'test' database\n"); -+ mtr_tofile($bootstrap_sql_file, "INSERT INTO mysql.db VALUES ('%','test','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y','Y','Y','Y','N','N','Y','Y');\n"); -+ mtr_tofile($bootstrap_sql_file, "INSERT INTO mysql.db VALUES ('%','test\\_%','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y','Y','Y','Y','N','N','Y','Y');\n"); -+ ++ mtr_tofile($bootstrap_sql_file, "-- Debian removed the default privileges on the 'test' database\n"); ++ mtr_tofile($bootstrap_sql_file, "INSERT INTO mysql.db VALUES ('%','test','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y','Y','Y','Y','N','N','Y','Y');\n"); ++ mtr_tofile($bootstrap_sql_file, "INSERT INTO mysql.db VALUES ('%','test\\_%','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y','Y','Y','Y','N','N','Y','Y');\n"); + - # Add test data for timezone - this is just a subset, on a real - # system these tables will be populated either by mysql_tzinfo_to_sql - # or by downloading the timezone table package from our website ++ + # Add test data for timezone - this is just a subset, on a real + # system these tables will be populated either by mysql_tzinfo_to_sql + # or by downloading the timezone table package from our website diff --git a/debian/rules b/debian/rules index 7aa09ea988b..2f385b26455 100755 --- a/debian/rules +++ b/debian/rules @@ -162,6 +162,7 @@ override_dh_auto_install: install -D -m 644 debian/mariadb-server-10.2.py $(TMP)/usr/share/apport/package-hooks/source_mariadb-10.2.py # Install libmariadbclient18 compatibility links + ln -s /usr/lib/$(DEB_HOST_MULTIARCH)/libmariadb.so.3 $(TMP)/usr/lib/$(DEB_HOST_MULTIARCH)/libmariadbclient.so ln -s /usr/lib/$(DEB_HOST_MULTIARCH)/libmariadb.so.3 $(TMP)/usr/lib/$(DEB_HOST_MULTIARCH)/libmariadbclient.so.18 # Install libmysqlclientclientXX compatibility links diff --git a/extra/CMakeLists.txt b/extra/CMakeLists.txt index 9cc5e7faa86..8c73e23d72b 100644 --- a/extra/CMakeLists.txt +++ b/extra/CMakeLists.txt @@ -79,7 +79,6 @@ IF(WITH_INNOBASE_STORAGE_ENGINE OR WITH_XTRADB_STORAGE_ENGINE) ../storage/innobase/ut/ut0ut.cc ../storage/innobase/buf/buf0buf.cc ../storage/innobase/page/page0zip.cc - ../storage/innobase/os/os0file.cc ../storage/innobase/fil/fil0crypt.cc ) diff --git a/extra/innochecksum.cc b/extra/innochecksum.cc index 238a5a80ac5..a0976970db7 100644 --- a/extra/innochecksum.cc +++ b/extra/innochecksum.cc @@ -26,40 +26,58 @@ Published with a permission. */ -#include #include #include #include #include #include #include -#ifdef HAVE_UNISTD_H +#ifndef __WIN__ # include #endif #include #include -#include /* ORACLE_WELCOME_COPYRIGHT_NOTICE */ +#include /* ORACLE_WELCOME_COPYRIGHT_NOTICE */ /* Only parts of these files are included from the InnoDB codebase. The parts not included are excluded by #ifndef UNIV_INNOCHECKSUM. */ -#include "univ.i" /* include all of this */ -#include "page0size.h" /* page_size_t */ -#include "page0zip.h" /* page_zip_calc_checksum() */ -#include "page0page.h" /* PAGE_* */ -#include "trx0undo.h" /* TRX_UNDO_* */ -#include "fut0lst.h" /* FLST_NODE_SIZE */ -#include "buf0checksum.h" /* buf_calc_page_*() */ -#include "fil0fil.h" /* FIL_* */ -#include "fil0crypt.h" -#include "os0file.h" -#include "fsp0fsp.h" /* fsp_flags_get_page_size() & - fsp_flags_get_zip_size() */ -#include "mach0data.h" /* mach_read_from_4() */ -#include "ut0crc32.h" /* ut_crc32_init() */ -#include "fsp0pagecompress.h" /* fil_get_compression_alg_name */ +typedef void fil_space_t; + +#include "univ.i" /* include all of this */ +#include "page0size.h" + +#define FLST_BASE_NODE_SIZE (4 + 2 * FIL_ADDR_SIZE) +#define FLST_NODE_SIZE (2 * FIL_ADDR_SIZE) +#define FSEG_PAGE_DATA FIL_PAGE_DATA +#define FSEG_HEADER_SIZE 10 +#define UT_BITS_IN_BYTES(b) (((b) + 7) / 8) + +#include "ut0ut.h" #include "ut0byte.h" +#include "mtr0types.h" #include "mach0data.h" +#include "fsp0types.h" +#include "rem0rec.h" +#include "buf0checksum.h" /* buf_calc_page_*() */ +#include "buf0buf.h" /* buf_page_is_corrupted */ +#include "fil0fil.h" /* FIL_* */ +#include "page0page.h" /* PAGE_* */ +#include "page0zip.h" /* page_zip_*() */ +#include "trx0undo.h" /* TRX_* */ +#include "fsp0fsp.h" /* fsp_flags_get_page_size() & + fsp_flags_get_zip_size() */ +#include "ut0crc32.h" /* ut_crc32_init() */ +#include "fsp0pagecompress.h" /* fil_get_compression_alg_name */ +#include "fil0crypt.h" /* fil_space_verify_crypt_checksum */ + +#include + +#ifdef UNIV_NONINL +# include "fsp0fsp.ic" +# include "mach0data.ic" +# include "ut0rnd.ic" +#endif #ifndef PRIuMAX #define PRIuMAX "llu" @@ -68,17 +86,21 @@ The parts not included are excluded by #ifndef UNIV_INNOCHECKSUM. */ /* Global variables */ static bool verbose; static bool just_count; -static uintmax_t start_page; -static uintmax_t end_page; -static uintmax_t do_page; +static unsigned long long start_page; +static unsigned long long end_page; +static unsigned long long do_page; static bool use_end_page; static bool do_one_page; -/* replaces declaration in srv0srv.c */ -ulong srv_page_size; -page_size_t univ_page_size(0, 0, false); +static my_bool do_leaf; +static my_bool per_page_details; +static ulong n_merge; extern ulong srv_checksum_algorithm; +static ulong physical_page_size; /* Page size in bytes on disk. */ +static ulong logical_page_size; /* Page size when uncompressed. */ +ulong srv_page_size; +page_size_t univ_page_size(0, 0, false); /* Current page number (0 based). */ -uintmax_t cur_page_num; +unsigned long long cur_page_num; /* Skip the checksum verification. */ static bool no_check; /* Enabled for strict checksum verification. */ @@ -86,7 +108,7 @@ bool strict_verify = 0; /* Enabled for rewrite checksum. */ static bool do_write; /* Mismatches count allowed (0 by default). */ -static uintmax_t allow_mismatches; +static unsigned long long allow_mismatches=0; static bool page_type_summary; static bool page_type_dump; /* Store filename for page-type-dump option. */ @@ -99,8 +121,7 @@ char* log_filename = NULL; FILE* log_file = NULL; /* Enabled for log write option. */ static bool is_log_enabled = false; -static my_bool do_leaf; -static ulong n_merge; + #ifndef _WIN32 /* advisory lock for non-window system. */ struct flock lk; @@ -198,75 +219,6 @@ struct per_index_stats { std::map index_ids; -bool encrypted = false; - -ulint -page_is_comp( -/*=========*/ - const page_t* page) /*!< in: index page */ -{ - return(page_header_get_field(page, PAGE_N_HEAP) & 0x8000); -} - -bool -page_is_leaf( -/*=========*/ - const page_t* page) /*!< in: page */ -{ - return(!*(const uint16*) (page + (PAGE_HEADER + PAGE_LEVEL))); -} - -ulint -page_get_page_no( -/*=============*/ - const page_t* page) /*!< in: page */ -{ - return(mach_read_from_4(page + FIL_PAGE_OFFSET)); -} -#define FSEG_HEADER_SIZE 10 /*!< Length of the file system - header, in bytes */ -#define REC_N_NEW_EXTRA_BYTES 5 -#define REC_N_OLD_EXTRA_BYTES 6 -#define PAGE_DATA (PAGE_HEADER + 36 + 2 * FSEG_HEADER_SIZE) - /* start of data on the page */ -#define PAGE_NEW_SUPREMUM (PAGE_DATA + 2 * REC_N_NEW_EXTRA_BYTES + 8) - /* offset of the page supremum record on a - new-style compact page */ -#define PAGE_NEW_SUPREMUM_END (PAGE_NEW_SUPREMUM + 8) -#define PAGE_OLD_SUPREMUM (PAGE_DATA + 2 + 2 * REC_N_OLD_EXTRA_BYTES + 8) - /* offset of the page supremum record on an - old-style page */ -#define PAGE_OLD_SUPREMUM_END (PAGE_OLD_SUPREMUM + 9) - /* offset of the page supremum record end on - an old-style page */ -#define FLST_BASE_NODE_SIZE (4 + 2 * 6) -#define XDES_ARR_OFFSET (FSP_HEADER_OFFSET + FSP_HEADER_SIZE) -#define XDES_FREE_BIT 0 -#define XDES_BITMAP (FLST_NODE_SIZE + 12) -#define XDES_BITS_PER_PAGE 2 -#define UT_BITS_IN_BYTES(b) (((b) + 7) / 8) -#define XDES_SIZE \ - (XDES_BITMAP \ - + UT_BITS_IN_BYTES(FSP_EXTENT_SIZE * XDES_BITS_PER_PAGE)) - -ulint -page_get_data_size( -/*===============*/ - const page_t* page) /*!< in: index page */ -{ - ulint ret; - - ret = (ulint)(page_header_get_field(page, PAGE_HEAP_TOP) - - (page_is_comp(page) - ? PAGE_NEW_SUPREMUM_END - : PAGE_OLD_SUPREMUM_END) - - page_header_get_field(page, PAGE_GARBAGE)); - - ut_ad(ret < UNIV_PAGE_SIZE); - - return(ret); -} - void print_index_leaf_stats( unsigned long long id, const per_index_stats& index, @@ -280,7 +232,7 @@ void print_index_leaf_stats( fprintf(fil_out, "page_no\tdata_size\tn_recs\n"); while (it_page != index.leaves.end()) { const per_page_stats& stat = it_page->second; - fprintf(fil_out, "%llu\t%lu\t%lu\n", it_page->first, stat.data_size, stat.n_recs); + fprintf(fil_out, "%llu\t" ULINTPF "\t" ULINTPF "\n", it_page->first, stat.data_size, stat.n_recs); page_no = stat.right_page_no; it_page = index.leaves.find(page_no); } @@ -306,6 +258,7 @@ void defrag_analysis( break; } } + if (index.max_data_size) { n_pages += data_size_total / index.max_data_size; if (data_size_total % index.max_data_size != 0) { @@ -315,10 +268,14 @@ void defrag_analysis( } if (index.leaf_pages) { - fprintf(fil_out, "count = %lu free = %lu\n", index.count, index.free_pages); + fprintf(fil_out, "count = " ULINTPF " free = " ULINTPF "\n", index.count, index.free_pages); } - fprintf(fil_out, "%llu\t\t%llu\t\t%lu\t\t%lu\t\t%lu\t\t%.2f\t%lu\n", + if (!n_leaf_pages) { + n_leaf_pages = 1; + } + + fprintf(fil_out, "%llu\t\t%llu\t\t" ULINTPF "\t\t" ULINTPF "\t\t" ULINTPF "\t\t%.2f\t" ULINTPF "\n", id, index.leaf_pages, n_leaf_pages, n_merge, n_pages, 1.0 - (double)n_pages / (double)n_leaf_pages, index.max_data_size); } @@ -368,29 +325,6 @@ get_page_size( return(page_size_t(flags)); } -#ifdef MYSQL_COMPRESSION -/** Decompress a page -@param[in,out] buf Page read from disk, uncompressed data will - also be copied to this page -@param[in, out] scratch Page to use for temporary decompress -@param[in] page_size scratch physical size -@return true if decompress succeeded */ -static -bool page_decompress( - byte* buf, - byte* scratch, - page_size_t page_size) -{ - dberr_t err; - - /* Set the dblwr recover flag to false. */ - err = os_file_decompress_page( - false, buf, scratch, page_size.physical()); - - return(err == DB_SUCCESS); -} -#endif - #ifdef _WIN32 /***********************************************//* @param [in] error error no. from the getLastError(). @@ -435,6 +369,7 @@ open_file( access = GENERIC_READ; flags = _O_RDONLY | _O_BINARY; } + /* CreateFile() also provide advisory lock with the usage of access and share mode of the file.*/ hFile = CreateFile( @@ -458,8 +393,7 @@ open_file( if (do_write) { create_flag = O_RDWR; lk.l_type = F_WRLCK; - } - else { + } else { create_flag = O_RDONLY; lk.l_type = F_RDLCK; } @@ -521,12 +455,18 @@ ulong read_file( /** Check if page is corrupted or not. @param[in] buf page frame @param[in] page_size page size +@param[in] is_encrypted true if page0 contained cryp_data + with crypt_scheme encrypted +@param[in] is_compressed true if page0 fsp_flags contained + page compression flag @retval true if page is corrupted otherwise false. */ static bool is_page_corrupted( - const byte* buf, - const page_size_t& page_size) + byte* buf, + const page_size_t& page_size, + bool is_encrypted, + bool is_compressed) { /* enable if page is corrupted. */ @@ -534,8 +474,22 @@ is_page_corrupted( /* use to store LSN values. */ ulint logseq; ulint logseqfield; + ulint page_type = mach_read_from_2(buf+FIL_PAGE_TYPE); + uint key_version = mach_read_from_4(buf+FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); + ulint space_id = mach_read_from_4( + buf + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID); - if (!page_size.is_compressed()) { + /* We can't trust only a page type, thus we take account + also fsp_flags or crypt_data on page 0 */ + if ((page_type == FIL_PAGE_PAGE_COMPRESSED && is_compressed) || + (page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED && + is_compressed && is_encrypted)) { + /* Page compressed tables do not contain post compression + checksum. */ + return (false); + } + + if (page_size.is_compressed()) { /* check the stored log sequence numbers for uncompressed tablespace. */ logseq = mach_read_from_4(buf + FIL_PAGE_LSN + 4); @@ -545,35 +499,32 @@ is_page_corrupted( if (is_log_enabled) { fprintf(log_file, - "page::%" PRIuMAX + "space::" ULINTPF " page::%llu" "; log sequence number:first = " ULINTPF "; second = " ULINTPF "\n", - cur_page_num, logseq, logseqfield); + space_id, cur_page_num, logseq, logseqfield); if (logseq != logseqfield) { fprintf(log_file, - "Fail; page %" PRIuMAX + "Fail; space::" ULINTPF " page::%llu" " invalid (fails log " "sequence number check)\n", - cur_page_num); + space_id, cur_page_num); } } } - /* FIXME: Read the page number from the tablespace header, - and check that every page carries the same page number. */ + /* Again we can't trust only FIL_PAGE_FILE_FLUSH_LSN field + now repurposed as FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, + we need to check also crypt_data contents. - /* If page is encrypted, use different checksum calculation + If page is encrypted, use different checksum calculation as innochecksum can't decrypt pages. Note that some old InnoDB versions did not initialize FIL_PAGE_FILE_FLUSH_LSN field so if crypt checksum does not match we verify checksum using - normal method. - */ - if (mach_read_from_4(buf+FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION) != 0) { - is_corrupted = fil_space_verify_crypt_checksum( - const_cast(buf), page_size, - mach_read_from_4(buf - + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID), - cur_page_num); + normal method. */ + if (is_encrypted && key_version != 0) { + is_corrupted = !fil_space_verify_crypt_checksum(buf, + page_size, space_id, cur_page_num); } else { is_corrupted = true; } @@ -624,8 +575,9 @@ is_page_empty( if (*page++) { return (false); } - } - return (true); + } + + return (true); } /********************************************************************//** @@ -678,7 +630,7 @@ update_checksum( mach_write_to_4(page + FIL_PAGE_SPACE_OR_CHKSUM, checksum); if (is_log_enabled) { - fprintf(log_file, "page::%" PRIuMAX "; Updated checksum =" + fprintf(log_file, "page::%llu; Updated checksum =" " %u\n", cur_page_num, checksum); } @@ -709,7 +661,7 @@ update_checksum( mach_write_to_4(page + FIL_PAGE_SPACE_OR_CHKSUM, checksum); if (is_log_enabled) { - fprintf(log_file, "page::%" PRIuMAX "; Updated checksum field1" + fprintf(log_file, "page::%llu; Updated checksum field1" " = %u\n", cur_page_num, checksum); } @@ -723,7 +675,7 @@ update_checksum( FIL_PAGE_END_LSN_OLD_CHKSUM,checksum); if (is_log_enabled) { - fprintf(log_file, "page::%" PRIuMAX "; Updated checksum " + fprintf(log_file, "page::%llu; Updated checksum " "field2 = %u\n", cur_page_num, checksum); } @@ -798,7 +750,7 @@ write_file( if (page_size != fwrite(buf, 1, page_size, file == stdin ? stdout : file)) { - fprintf(stderr, "Failed to write page %" PRIuMAX " to %s: %s\n", + fprintf(stderr, "Failed to write page::%llu to %s: %s\n", cur_page_num, filename, strerror(errno)); return(false); @@ -815,93 +767,32 @@ write_file( return(true); } -/********************************************************//** -Gets the next index page number. -@return next page number */ -ulint -btr_page_get_next( -/*==============*/ - const page_t* page) /*!< in: index page */ -{ - return(mach_read_from_4(page + FIL_PAGE_NEXT)); -} - -/********************************************************//** -Gets the previous index page number. -@return prev page number */ -ulint -btr_page_get_prev( -/*==============*/ - const page_t* page) /*!< in: index page */ -{ - return(mach_read_from_4(page + FIL_PAGE_PREV)); -} - -ulint -mach_read_ulint( - const byte* ptr, - mlog_id_t type) -{ - switch (type) { - case MLOG_1BYTE: - return(mach_read_from_1(ptr)); - case MLOG_2BYTES: - return(mach_read_from_2(ptr)); - case MLOG_4BYTES: - return(mach_read_from_4(ptr)); - default: - break; - } - - ut_error; - return(0); -} -ibool -xdes_get_bit( -/*=========*/ - const xdes_t* descr, /*!< in: descriptor */ - ulint bit, /*!< in: XDES_FREE_BIT or XDES_CLEAN_BIT */ - ulint offset) /*!< in: page offset within extent: - 0 ... FSP_EXTENT_SIZE - 1 */ -{ - ulint index = bit + XDES_BITS_PER_PAGE * offset; - - ulint bit_index = index % 8; - ulint byte_index = index / 8; - - return(ut_bit_get_nth( - mach_read_ulint(descr + XDES_BITMAP + byte_index, - MLOG_1BYTE), - bit_index)); -} - /* Parse the page and collect/dump the information about page type @param [in] page buffer page -@param [in] xdes xdes page +@param [out] xdes extend descriptor page @param [in] file file for diagnosis. -@param [in] page_size page size +@param [in] page_size page_size +@param [in] is_encrypted tablespace is encrypted */ void parse_page( const byte* page, - const byte* xdes, + byte* xdes, FILE* file, - page_size_t page_size) + const page_size_t& page_size, + bool is_encrypted) { - unsigned long long id=0; - ulint undo_page_type=0; - ulint n_recs; - ulint page_no=0; - ulint right_page_no=0; - ulint left_page_no=0; - ulint data_bytes=0; - bool is_leaf=false; - ulint size_range_id=0; - ulint data_types=0; - ulint key_version = 0; - + unsigned long long id; + ulint undo_page_type; char str[20]={'\0'}; + ulint n_recs; + ulint page_no; + ulint left_page_no; + ulint right_page_no; + ulint data_bytes; + bool is_leaf; + int size_range_id; /* Check whether page is doublewrite buffer. */ if(skip_page) { @@ -912,102 +803,105 @@ parse_page( switch (mach_read_from_2(page + FIL_PAGE_TYPE)) { - case FIL_PAGE_INDEX: + case FIL_PAGE_INDEX: { + uint key_version = mach_read_from_4(page + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); page_type.n_fil_page_index++; - id = mach_read_from_8(page + PAGE_HEADER + PAGE_INDEX_ID); - n_recs = page_header_get_field(page, PAGE_N_RECS); - page_no = page_get_page_no(page); - left_page_no = btr_page_get_prev(page); - right_page_no = btr_page_get_next(page); - key_version = mach_read_from_4(page + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); /* If page is encrypted we can't read index header */ - if (!key_version) { - data_bytes = page_get_data_size(page); + if (!is_encrypted) { + id = mach_read_from_8(page + PAGE_HEADER + PAGE_INDEX_ID); + n_recs = mach_read_from_2(page + PAGE_HEADER + PAGE_N_RECS); + page_no = mach_read_from_4(page + FIL_PAGE_OFFSET); + left_page_no = mach_read_from_4(page + FIL_PAGE_PREV); + right_page_no = mach_read_from_4(page + FIL_PAGE_NEXT); + ulint is_comp = mach_read_from_2(page + PAGE_HEADER + PAGE_N_HEAP) & 0x8000; + ulint level = mach_read_from_2(page + PAGE_HEADER + PAGE_LEVEL); + ulint garbage = mach_read_from_2(page + PAGE_HEADER + PAGE_GARBAGE); + + + data_bytes = (ulint)(mach_read_from_2(page + PAGE_HEADER + PAGE_HEAP_TOP) + - (is_comp + ? PAGE_NEW_SUPREMUM_END + : PAGE_OLD_SUPREMUM_END) + - garbage); + + is_leaf = (!*(const uint16*) (page + (PAGE_HEADER + PAGE_LEVEL))); + + if (page_type_dump) { + fprintf(file, "#::%llu\t\t|\t\tIndex page\t\t\t|" + "\tindex id=%llu,", cur_page_num, id); + + fprintf(file, + " page level=" ULINTPF + ", No. of records=" ULINTPF + ", garbage=" ULINTPF ", %s\n", + level, n_recs, garbage, str); + } + + size_range_id = (data_bytes * SIZE_RANGES_FOR_PAGE + + page_size.logical() - 1) / + page_size.logical(); + + if (size_range_id > SIZE_RANGES_FOR_PAGE + 1) { + /* data_bytes is bigger than logical_page_size */ + size_range_id = SIZE_RANGES_FOR_PAGE + 1; + } + if (per_page_details) { + printf("index id=%llu page " ULINTPF " leaf %d n_recs " ULINTPF " data_bytes " ULINTPF + "\n", id, page_no, is_leaf, n_recs, data_bytes); + } + /* update per-index statistics */ + { + if (index_ids.count(id) == 0) { + index_ids[id] = per_index_stats(); + } + std::map::iterator it; + it = index_ids.find(id); + per_index_stats &index = (it->second); + const byte* des = xdes + XDES_ARR_OFFSET + + XDES_SIZE * ((page_no & (page_size.physical() - 1)) + / FSP_EXTENT_SIZE); + if (xdes_get_bit(des, XDES_FREE_BIT, + page_no % FSP_EXTENT_SIZE)) { + index.free_pages++; + return; + } + + index.pages++; + + if (is_leaf) { + index.leaf_pages++; + if (data_bytes > index.max_data_size) { + index.max_data_size = data_bytes; + } + struct per_page_stats pp(n_recs, data_bytes, + left_page_no, right_page_no); + + index.leaves[page_no] = pp; + + if (left_page_no == ULINT32_UNDEFINED) { + index.first_leaf_page = page_no; + index.count++; + } + } + + index.total_n_recs += n_recs; + index.total_data_bytes += data_bytes; + index.pages_in_size_range[size_range_id] ++; + } } else { - data_bytes = 0; - } - - is_leaf = page_is_leaf(page); - - if (page_type_dump) { - fprintf(file, "#::%8" PRIuMAX "\t\t|\t\tIndex page\t\t\t|" - "\tindex id=%llu,", cur_page_num, id); - - fprintf(file, - " page level=" ULINTPF " leaf %u" - ", No. of records=" ULINTPF - ", garbage=" ULINTPF - ", n_recs=" ULINTPF - ", %s\n", - page_header_get_field(page, PAGE_LEVEL), - is_leaf, - n_recs, - page_header_get_field(page, PAGE_GARBAGE), - data_types, - str); - } - - size_range_id = (data_bytes * SIZE_RANGES_FOR_PAGE - + page_size.logical() - 1) / - page_size.logical(); - - if (size_range_id > SIZE_RANGES_FOR_PAGE + 1) { - /* data_bytes is bigger than logical_page_size */ - size_range_id = SIZE_RANGES_FOR_PAGE + 1; - } - - /* update per-index statistics */ - { - if (index_ids.count(id) == 0) { - index_ids[id] = per_index_stats(); - } - - std::map::iterator it; - it = index_ids.find(id); - per_index_stats &index = (it->second); - uchar* des = (uchar *)(xdes + XDES_ARR_OFFSET - + XDES_SIZE * ((page_no & (page_size.physical() - 1)) - / FSP_EXTENT_SIZE)); - - if (xdes_get_bit(des, XDES_FREE_BIT, - page_no % FSP_EXTENT_SIZE)) { - index.free_pages++; - return; - } - - index.pages++; - - if (is_leaf) { - index.leaf_pages++; - if (data_bytes > index.max_data_size) { - index.max_data_size = data_bytes; - } - - struct per_page_stats pp(n_recs, data_bytes, - left_page_no, right_page_no); - - index.leaves[page_no] = pp; - - if (left_page_no == ULINT32_UNDEFINED) { - index.first_leaf_page = page_no; - index.count++; - } - } - - index.total_n_recs += n_recs; - index.total_data_bytes += data_bytes; - index.pages_in_size_range[size_range_id] ++; + fprintf(file, "#::%llu\t\t|\t\tEncrypted Index page\t\t\t|" + "\tkey_version %u,%s\n", cur_page_num, key_version, str); } break; - + } case FIL_PAGE_UNDO_LOG: page_type.n_fil_page_undo_log++; undo_page_type = mach_read_from_2(page + TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_TYPE); if (page_type_dump) { - fprintf(file, "#::%8" PRIuMAX "\t\t|\t\tUndo log page\t\t\t|", + fprintf(file, "#::%llu\t\t|\t\tUndo log page\t\t\t|", cur_page_num); } if (undo_page_type == TRX_UNDO_INSERT) { @@ -1081,7 +975,7 @@ parse_page( case FIL_PAGE_INODE: page_type.n_fil_page_inode++; if (page_type_dump) { - fprintf(file, "#::%8" PRIuMAX "\t\t|\t\tInode page\t\t\t|" + fprintf(file, "#::%llu\t\t|\t\tInode page\t\t\t|" "\t%s\n",cur_page_num, str); } break; @@ -1089,7 +983,7 @@ parse_page( case FIL_PAGE_IBUF_FREE_LIST: page_type.n_fil_page_ibuf_free_list++; if (page_type_dump) { - fprintf(file, "#::%8" PRIuMAX "\t\t|\t\tInsert buffer free list" + fprintf(file, "#::%llu\t\t|\t\tInsert buffer free list" " page\t|\t%s\n", cur_page_num, str); } break; @@ -1097,7 +991,7 @@ parse_page( case FIL_PAGE_TYPE_ALLOCATED: page_type.n_fil_page_type_allocated++; if (page_type_dump) { - fprintf(file, "#::%8" PRIuMAX "\t\t|\t\tFreshly allocated " + fprintf(file, "#::%llu\t\t|\t\tFreshly allocated " "page\t\t|\t%s\n", cur_page_num, str); } break; @@ -1105,7 +999,7 @@ parse_page( case FIL_PAGE_IBUF_BITMAP: page_type.n_fil_page_ibuf_bitmap++; if (page_type_dump) { - fprintf(file, "#::%8" PRIuMAX "\t\t|\t\tInsert Buffer " + fprintf(file, "#::%llu\t\t|\t\tInsert Buffer " "Bitmap\t\t|\t%s\n", cur_page_num, str); } break; @@ -1113,7 +1007,7 @@ parse_page( case FIL_PAGE_TYPE_SYS: page_type.n_fil_page_type_sys++; if (page_type_dump) { - fprintf(file, "#::%8" PRIuMAX "\t\t|\t\tSystem page\t\t\t|" + fprintf(file, "#::%llu\t\t|\t\tSystem page\t\t\t|" "\t%s\n",cur_page_num, str); } break; @@ -1121,25 +1015,25 @@ parse_page( case FIL_PAGE_TYPE_TRX_SYS: page_type.n_fil_page_type_trx_sys++; if (page_type_dump) { - fprintf(file, "#::%8" PRIuMAX "\t\t|\t\tTransaction system " + fprintf(file, "#::%llu\t\t|\t\tTransaction system " "page\t\t|\t%s\n", cur_page_num, str); } break; case FIL_PAGE_TYPE_FSP_HDR: page_type.n_fil_page_type_fsp_hdr++; - memcpy((void *)xdes, (void *)page, page_size.physical()); + memcpy(xdes, page, page_size.physical()); if (page_type_dump) { - fprintf(file, "#::%8" PRIuMAX "\t\t|\t\tFile Space " + fprintf(file, "#::%llu\t\t|\t\tFile Space " "Header\t\t|\t%s\n", cur_page_num, str); } break; case FIL_PAGE_TYPE_XDES: page_type.n_fil_page_type_xdes++; - memcpy((void *)xdes, (void *)page, page_size.physical()); + memcpy(xdes, page, page_size.physical()); if (page_type_dump) { - fprintf(file, "#::%8" PRIuMAX "\t\t|\t\tExtent descriptor " + fprintf(file, "#::%llu\t\t|\t\tExtent descriptor " "page\t\t|\t%s\n", cur_page_num, str); } break; @@ -1147,7 +1041,7 @@ parse_page( case FIL_PAGE_TYPE_BLOB: page_type.n_fil_page_type_blob++; if (page_type_dump) { - fprintf(file, "#::%8" PRIuMAX "\t\t|\t\tBLOB page\t\t\t|\t%s\n", + fprintf(file, "#::%llu\t\t|\t\tBLOB page\t\t\t|\t%s\n", cur_page_num, str); } break; @@ -1155,7 +1049,7 @@ parse_page( case FIL_PAGE_TYPE_ZBLOB: page_type.n_fil_page_type_zblob++; if (page_type_dump) { - fprintf(file, "#::%8" PRIuMAX "\t\t|\t\tCompressed BLOB " + fprintf(file, "#::%llu\t\t|\t\tCompressed BLOB " "page\t\t|\t%s\n", cur_page_num, str); } break; @@ -1163,25 +1057,26 @@ parse_page( case FIL_PAGE_TYPE_ZBLOB2: page_type.n_fil_page_type_zblob2++; if (page_type_dump) { - fprintf(file, "#::%8" PRIuMAX "\t\t|\t\tSubsequent Compressed " + fprintf(file, "#::%llu\t\t|\t\tSubsequent Compressed " "BLOB page\t|\t%s\n", cur_page_num, str); } break; - case FIL_PAGE_PAGE_COMPRESSED: - page_type.n_fil_page_type_page_compressed++; - if (page_type_dump) { - fprintf(file, "#::%8" PRIuMAX "\t\t|\t\tPage compressed " + case FIL_PAGE_PAGE_COMPRESSED: + page_type.n_fil_page_type_page_compressed++; + if (page_type_dump) { + fprintf(file, "#::%llu\t\t|\t\tPage compressed " "page\t|\t%s\n", cur_page_num, str); - } - break; - case FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED: - page_type.n_fil_page_type_page_compressed_encrypted++; - if (page_type_dump) { - fprintf(file, "#::%8" PRIuMAX "\t\t|\t\tPage compressed encrypted " + } + break; + + case FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED: + page_type.n_fil_page_type_page_compressed_encrypted++; + if (page_type_dump) { + fprintf(file, "#::%llu\t\t|\t\tPage compressed encrypted " "page\t|\t%s\n", cur_page_num, str); - } - break; + } + break; default: page_type.n_fil_page_type_other++; break; @@ -1269,7 +1164,7 @@ print_summary( page_type.n_fil_page_type_page_compressed); fprintf(fil_out, "%8d\tPage compressed encrypted page\n", page_type.n_fil_page_type_page_compressed_encrypted); - fprintf(fil_out, "%8d\tOther type of page", + fprintf(fil_out, "%8d\tOther type of page\n", page_type.n_fil_page_type_other); fprintf(fil_out, "\n===============================================\n"); @@ -1327,8 +1222,10 @@ static struct my_option innochecksum_options[] = { 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, {"verbose", 'v', "Verbose (prints progress every 5 seconds).", &verbose, &verbose, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, +#ifndef DBUG_OFF {"debug", '#', "Output debug log. See " REFMAN "dbug-package.html", &dbug_setting, &dbug_setting, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, +#endif /* !DBUG_OFF */ {"count", 'c', "Print the count of pages in the file and exits.", &just_count, &just_count, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"start_page", 's', "Start on this page number (0 based).", @@ -1357,10 +1254,12 @@ static struct my_option innochecksum_options[] = { {"page-type-dump", 'D', "Dump the page type info for each page in a " "tablespace.", &page_dump_filename, &page_dump_filename, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"per-page-details", 'i', "Print out per-page detail information.", + &per_page_details, &per_page_details, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"log", 'l', "log output.", &log_filename, &log_filename, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"leaf", 'e', "Examine leaf index pages", + {"leaf", 'f', "Examine leaf index pages", &do_leaf, &do_leaf, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"merge", 'm', "leaf page count if merge given number of consecutive pages", &n_merge, &n_merge, 0, GET_ULONG, REQUIRED_ARG, 0, 0, (longlong)10L, 0, 1, 0}, @@ -1388,9 +1287,9 @@ static void usage(void) puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000")); printf("InnoDB offline file checksum utility.\n"); printf("Usage: %s [-c] [-s ] [-e ] " - "[-p ] [-v] [-a ] [-n] " + "[-p ] [-i] [-v] [-a ] [-n] " "[-C ] [-w ] [-S] [-D ] " - "[-l ] [-e] \n", my_progname); + "[-l ] [-l] [-m ] \n", my_progname); printf("See " REFMAN "innochecksum.html for usage hints.\n"); my_print_help(innochecksum_options); my_print_variables(innochecksum_options); @@ -1483,7 +1382,7 @@ get_options( char ***argv) { if (handle_options(argc, argv, innochecksum_options, - innochecksum_get_one_option)) { + innochecksum_get_one_option)) { my_end(0); exit(true); } @@ -1498,6 +1397,133 @@ get_options( return (false); } +/** Check from page 0 if table is encrypted. +@param[in] filename Filename +@param[in] page_size page size +@param[in] page Page 0 +@retval true if tablespace is encrypted, false if not +*/ +static +bool check_encryption( + const char* filename, + const page_size_t& page_size, + byte * page) +{ + ulint offset = (FSP_HEADER_OFFSET + (XDES_ARR_OFFSET + XDES_SIZE * + (page_size.physical()) / FSP_EXTENT_SIZE)); + + if (memcmp(page + offset, CRYPT_MAGIC, MAGIC_SZ) != 0) { + return false; + } + + ulint type = mach_read_from_1(page + offset + MAGIC_SZ + 0); + + if (! (type == CRYPT_SCHEME_UNENCRYPTED || + type == CRYPT_SCHEME_1)) { + return false; + } + + ulint iv_length = mach_read_from_1(page + offset + MAGIC_SZ + 1); + + if (iv_length != CRYPT_SCHEME_1_IV_LEN) { + return false; + } + + uint min_key_version = mach_read_from_4 + (page + offset + MAGIC_SZ + 2 + iv_length); + + uint key_id = mach_read_from_4 + (page + offset + MAGIC_SZ + 2 + iv_length + 4); + + if (type == CRYPT_SCHEME_1 && is_log_enabled) { + fprintf(log_file,"Tablespace %s encrypted key_version %u key_id %u\n", + filename, min_key_version, key_id); + } + + return (type == CRYPT_SCHEME_1); +} + +/** +Verify page checksum. +@param[in] buf page to verify +@param[in] page_size page size +@param[in] is_encrypted true if tablespace is encrypted +@param[in] is_compressed true if tablespace is page compressed +@param[in,out] mismatch_count Number of pages failed in checksum verify +@retval 0 if page checksum matches or 1 if it does not match +*/ +static +int verify_checksum( + byte* buf, + const page_size_t& page_size, + bool is_encrypted, + bool is_compressed, + unsigned long long* mismatch_count) +{ + int exit_status = 0; + bool is_corrupted = false; + + is_corrupted = is_page_corrupted( + buf, page_size, is_encrypted, is_compressed); + + if (is_corrupted) { + fprintf(stderr, "Fail: page::%llu invalid\n", + cur_page_num); + + (*mismatch_count)++; + + if (*mismatch_count > allow_mismatches) { + fprintf(stderr, + "Exceeded the " + "maximum allowed " + "checksum mismatch " + "count::%llu current::%llu\n", + *mismatch_count, + allow_mismatches); + + exit_status = 1; + } + } + + return (exit_status); +} + +/** Rewrite page checksum if needed. +@param[in] filename File name +@param[in] fil_in File pointer +@param[in] buf page +@param[in] page_size page size +@param[in] pos File position +@param[in] is_encrypted true if tablespace is encrypted +@param[in] is_compressed true if tablespace is page compressed +@retval 0 if checksum rewrite was successful, 1 if error was detected */ +static +int +rewrite_checksum( + const char* filename, + FILE* fil_in, + byte* buf, + const page_size_t& page_size, + fpos_t* pos, + bool is_encrypted, + bool is_compressed) +{ + int exit_status = 0; + /* Rewrite checksum. Note that for encrypted and + page compressed tables this is not currently supported. */ + if (do_write && + !is_encrypted && + !is_compressed + && !write_file(filename, fil_in, buf, + page_size.is_compressed(), pos, + static_cast(page_size.physical()))) { + + exit_status = 1; + } + + return (exit_status); +} + int main( int argc, char **argv) @@ -1507,15 +1533,12 @@ int main( /* our input filename. */ char* filename; /* Buffer to store pages read. */ + byte* buf_ptr = NULL; + byte* xdes_ptr = NULL; byte* buf = NULL; - /* Buffer for xdes */ byte* xdes = NULL; /* bytes read count */ ulong bytes; - /* Buffer to decompress page.*/ -#ifdef MYSQL_COMPRESSION - byte* tbuf = NULL; -#endif /* current time */ time_t now; /* last time */ @@ -1527,6 +1550,8 @@ int main( struct stat st; #endif /* _WIN32 */ + int exit_status = 0; + /* size of file (has to be 64 bits) */ unsigned long long int size = 0; /* number of pages in file */ @@ -1534,9 +1559,7 @@ int main( off_t offset = 0; /* count the no. of page corrupted. */ - ulint mismatch_count = 0; - /* Variable to ack the page is corrupted or not. */ - bool is_corrupted = false; + unsigned long long mismatch_count = 0; bool partial_page_read = false; /* Enabled when read from stdin is done. */ @@ -1556,32 +1579,37 @@ int main( DBUG_PROCESS(argv[0]); if (get_options(&argc,&argv)) { - DBUG_RETURN(1); + exit_status = 1; + goto my_exit; } if (strict_verify && no_check) { fprintf(stderr, "Error: --strict-check option cannot be used " "together with --no-check option.\n"); - DBUG_RETURN(1); + exit_status = 1; + goto my_exit; } if (no_check && !do_write) { fprintf(stderr, "Error: --no-check must be associated with " "--write option.\n"); - DBUG_RETURN(1); + exit_status = 1; + goto my_exit; } if (page_type_dump) { fil_page_type = create_file(page_dump_filename); if (!fil_page_type) { - DBUG_RETURN(1); + exit_status = 1; + goto my_exit; } } if (is_log_enabled) { log_file = create_file(log_filename); if (!log_file) { - DBUG_RETURN(1); + exit_status = 1; + goto my_exit; } fprintf(log_file, "InnoDB File Checksum Utility.\n"); } @@ -1591,17 +1619,17 @@ int main( } - buf = (byte*) malloc(UNIV_PAGE_SIZE_MAX * 2); - xdes = (byte *) malloc(UNIV_PAGE_SIZE_MAX *2); -#ifdef MYSQL_COMPRESSION - tbuf = buf + UNIV_PAGE_SIZE_MAX; -#endif + buf_ptr = (byte*) malloc(UNIV_PAGE_SIZE_MAX * 2); + xdes_ptr = (byte*)malloc(UNIV_PAGE_SIZE_MAX * 2); + buf = (byte *) ut_align(buf_ptr, UNIV_PAGE_SIZE_MAX); + xdes = (byte *) ut_align(xdes_ptr, UNIV_PAGE_SIZE_MAX); + /* The file name is not optional. */ for (int i = 0; i < argc; ++i) { + /* Reset parameters for each file. */ filename = argv[i]; memset(&page_type, 0, sizeof(innodb_page_type)); - is_corrupted = false; partial_page_read = false; skip_page = false; @@ -1626,7 +1654,8 @@ int main( fprintf(stderr, "Error: %s cannot be found\n", filename); - goto err_exit; + exit_status = 1; + goto my_exit; } if (!read_from_stdin) { @@ -1634,35 +1663,17 @@ int main( fil_in = open_file(filename); /*If fil_in is NULL, terminate as some error encountered */ if(fil_in == NULL) { - goto err_exit; + exit_status = 1; + goto my_exit; } /* Save the current file pointer in pos variable.*/ if (0 != fgetpos(fil_in, &pos)) { perror("fgetpos"); - goto err_exit; + exit_status = 1; + goto my_exit; } } - /* Testing for lock mechanism. The innochecksum - acquire lock on given file. So other tools accessing the same - file for processsing must fail. */ -#ifdef _WIN32 - DBUG_EXECUTE_IF("innochecksum_cause_mysqld_crash", - ut_ad(page_dump_filename); - while((_access( page_dump_filename, 0)) == 0) { - sleep(1); - } - DBUG_RETURN(0); ); -#else - DBUG_EXECUTE_IF("innochecksum_cause_mysqld_crash", - ut_ad(page_dump_filename); - struct stat status_buf; - while(stat(page_dump_filename, &status_buf) == 0) { - sleep(1); - } - DBUG_RETURN(0); ); -#endif /* _WIN32 */ - /* Read the minimum page size. */ bytes = ulong(fread(buf, 1, UNIV_ZIP_SIZE_MIN, fil_in)); partial_page_read = true; @@ -1670,10 +1681,11 @@ int main( if (bytes != UNIV_ZIP_SIZE_MIN) { fprintf(stderr, "Error: Was not able to read the " "minimum page size "); - fprintf(stderr, "of %d bytes. Bytes read was %lu\n", + fprintf(stderr, "of %d bytes. Bytes read was " ULINTPF "\n", UNIV_ZIP_SIZE_MIN, bytes); - goto err_exit; + exit_status = 1; + goto my_exit; } /* enable variable is_system_tablespace when space_id of given @@ -1683,8 +1695,79 @@ int main( FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID, 4)) ? true : false; + /* Determine page size, zip_size and page compression + from fsp_flags and encryption metadata from page 0 */ const page_size_t& page_size = get_page_size(buf); + ulint flags = mach_read_from_4(FSP_HEADER_OFFSET + FSP_SPACE_FLAGS + buf); + ulint zip_size = page_size.is_compressed() ? page_size.logical() : 0; + logical_page_size = page_size.is_compressed() ? zip_size : 0; + physical_page_size = page_size.physical(); + srv_page_size = page_size.logical(); + bool is_compressed = FSP_FLAGS_HAS_PAGE_COMPRESSION(flags); + + if (page_size.physical() > UNIV_ZIP_SIZE_MIN) { + /* Read rest of the page 0 to determine crypt_data */ + bytes = ulong(read_file(buf, partial_page_read, page_size.physical(), fil_in)); + + if (bytes != page_size.physical()) { + fprintf(stderr, "Error: Was not able to read the " + "rest of the page "); + fprintf(stderr, "of " ULINTPF " bytes. Bytes read was " ULINTPF "\n", + page_size.physical() - UNIV_ZIP_SIZE_MIN, bytes); + + exit_status = 1; + goto my_exit; + } + partial_page_read = false; + } + + /* Now that we have full page 0 in buffer, check encryption */ + bool is_encrypted = check_encryption(filename, page_size, buf); + + /* Verify page 0 contents. Note that we can't allow + checksum mismatch on page 0, because that would mean we + could not trust it content. */ + if (!no_check) { + unsigned long long tmp_allow_mismatches = allow_mismatches; + allow_mismatches = 0; + + exit_status = verify_checksum(buf, page_size, is_encrypted, is_compressed, &mismatch_count); + + if (exit_status) { + fprintf(stderr, "Error: Page 0 checksum mismatch, can't continue. \n"); + goto my_exit; + } + allow_mismatches = tmp_allow_mismatches; + } + + if ((exit_status = rewrite_checksum(filename, fil_in, buf, + page_size, &pos, is_encrypted, is_compressed))) { + goto my_exit; + } + + if (page_type_dump) { + fprintf(fil_page_type, + "\n\nFilename::%s\n", filename); + fprintf(fil_page_type, + "========================================" + "======================================\n"); + fprintf(fil_page_type, + "\tPAGE_NO\t\t|\t\tPAGE_TYPE\t\t" + "\t|\tEXTRA INFO\n"); + fprintf(fil_page_type, + "========================================" + "======================================\n"); + } + + if (per_page_details) { + printf("page %llu ", cur_page_num); + } + + if (page_type_summary || page_type_dump) { + parse_page(buf, xdes, fil_page_type, page_size, is_encrypted); + } + pages = (ulint) (size / page_size.physical()); if (just_count) { @@ -1700,14 +1783,14 @@ int main( "(" ULINTPF " pages)\n", filename, size, pages); if (do_one_page) { fprintf(log_file, "Innochecksum: " - "checking page %" PRIuMAX "\n", + "checking page::%llu;\n", do_page); } } } else { if (is_log_enabled) { fprintf(log_file, "Innochecksum: checking " - "pages in range %" PRIuMAX " to %" PRIuMAX "\n", + "pages in range::%llu to %llu\n", start_page, use_end_page ? end_page : (pages - 1)); } @@ -1731,14 +1814,16 @@ int main( perror("Error: Unable to seek to " "necessary offset"); - goto err_exit; + exit_status = 1; + goto my_exit; } /* Save the current file pointer in pos variable. */ if (0 != fgetpos(fil_in, &pos)) { perror("fgetpos"); - goto err_exit; + exit_status = 1; + goto my_exit; } } else { @@ -1758,7 +1843,7 @@ int main( bytes = read_file(buf, partial_page_read, static_cast( - page_size.physical()), + page_size.physical()), fil_in); partial_page_read = false; @@ -1769,34 +1854,22 @@ int main( "to seek to necessary " "offset"); - goto err_exit; + exit_status = 1; + goto my_exit; } } } } - if (page_type_dump) { - fprintf(fil_page_type, - "\n\nFilename::%s\n", filename); - fprintf(fil_page_type, - "========================================" - "======================================\n"); - fprintf(fil_page_type, - "\tPAGE_NO\t\t|\t\tPAGE_TYPE\t\t" - "\t|\tEXTRA INFO\n"); - fprintf(fil_page_type, - "========================================" - "======================================\n"); - } - /* main checksumming loop */ - cur_page_num = start_page; + cur_page_num = start_page ? start_page : cur_page_num + 1; + lastt = 0; while (!feof(fil_in)) { bytes = read_file(buf, partial_page_read, static_cast( - page_size.physical()), fil_in); + page_size.physical()), fil_in); partial_page_read = false; if (!bytes && feof(fil_in)) { @@ -1808,14 +1881,16 @@ int main( page_size.physical()); perror(" "); - goto err_exit; + exit_status = 1; + goto my_exit; } if (bytes != page_size.physical()) { - fprintf(stderr, "Error: bytes read (%lu) " + fprintf(stderr, "Error: bytes read (" ULINTPF ") " "doesn't match page size (" ULINTPF ")\n", bytes, page_size.physical()); - goto err_exit; + exit_status = 1; + goto my_exit; } if (is_system_tablespace) { @@ -1823,60 +1898,29 @@ int main( skip_page = is_page_doublewritebuffer(buf); } else { skip_page = false; -#ifdef MYSQL_COMPRESSION - if (!page_decompress(buf, tbuf, page_size)) { - - fprintf(stderr, - "Page decompress failed"); - - goto err_exit; - } -#endif } - ulint page_type = mach_read_from_2(buf + FIL_PAGE_TYPE); + ulint cur_page_type = mach_read_from_2(buf+FIL_PAGE_TYPE); - if (page_type == FIL_PAGE_PAGE_COMPRESSED || - page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED) { + /* FIXME: Page compressed or Page compressed and encrypted + pages do not contain checksum. */ + if (cur_page_type == FIL_PAGE_PAGE_COMPRESSED || + cur_page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED) { skip_page = true; } /* If no-check is enabled, skip the checksum verification.*/ - if (!no_check) { - /* Checksum verification */ - if (!skip_page) { - is_corrupted = is_page_corrupted( - buf, page_size); - - if (is_corrupted) { - fprintf(stderr, "Fail: page " - "%" PRIuMAX " invalid\n", - cur_page_num); - - mismatch_count++; - - if(mismatch_count > allow_mismatches) { - fprintf(stderr, - "Exceeded the " - "maximum allowed " - "checksum mismatch " - "count::%" PRIuMAX "\n", - allow_mismatches); - - goto err_exit; - } - } - } + if (!no_check + && !skip_page + && (exit_status = verify_checksum(buf, page_size, + is_encrypted, is_compressed, &mismatch_count))) { + goto my_exit; } - /* Rewrite checksum */ - if (do_write - && !write_file(filename, fil_in, buf, - page_size.is_compressed(), &pos, - static_cast(page_size.physical()))) { - - goto err_exit; + if ((exit_status = rewrite_checksum(filename, fil_in, buf, + page_size, &pos, is_encrypted, is_compressed))) { + goto my_exit; } /* end if this was the last page we were supposed to check */ @@ -1884,12 +1928,17 @@ int main( break; } + if (per_page_details) { + printf("page %llu ", cur_page_num); + } + if (page_type_summary || page_type_dump) { - parse_page(buf, xdes , fil_page_type, page_size); + parse_page(buf, xdes, fil_page_type, page_size, is_encrypted); } /* do counter increase and progress printing */ cur_page_num++; + if (verbose && !read_from_stdin) { if ((cur_page_num % 64) == 0) { now = time(0); @@ -1898,7 +1947,7 @@ int main( } if (now - lastt >= 1 && is_log_enabled) { - fprintf(log_file, "page %" PRIuMAX " " + fprintf(log_file, "page::%llu " "okay: %.3f%% done\n", (cur_page_num - 1), (float) cur_page_num / pages * 100); @@ -1929,19 +1978,19 @@ int main( fclose(log_file); } - free(buf); - free(xdes); - my_end(0); + free(buf_ptr); + free(xdes_ptr); - DBUG_RETURN(0); + my_end(exit_status); + DBUG_RETURN(exit_status); -err_exit: - if (buf) { - free(buf); +my_exit: + if (buf_ptr) { + free(buf_ptr); } - if (xdes) { - free(xdes); + if (xdes_ptr) { + free(xdes_ptr); } if (!read_from_stdin && fil_in) { @@ -1952,7 +2001,6 @@ err_exit: fclose(log_file); } - my_end(1); - - DBUG_RETURN(1); + my_end(exit_status); + DBUG_RETURN(exit_status); } diff --git a/extra/mariabackup/CMakeLists.txt b/extra/mariabackup/CMakeLists.txt new file mode 100644 index 00000000000..78188d2f8e8 --- /dev/null +++ b/extra/mariabackup/CMakeLists.txt @@ -0,0 +1,117 @@ +# Copyright (c) 2013, 2017 Percona LLC and/or its affiliates. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + +OPTION(WITH_MARIABACKUP "Include mariabackup" ON) +IF(NOT WITH_MARIABACKUP) + RETURN() +ENDIF() + + +IF(NOT WIN32) + CHECK_SYMBOL_EXISTS(regcomp regex.h HAVE_SYSTEM_REGEX) + IF(HAVE_SYSTEM_REGEX) + ADD_DEFINITIONS(-DHAVE_SYSTEM_REGEX) + ENDIF() +ENDIF() + + +INCLUDE_DIRECTORIES( + ${CMAKE_SOURCE_DIR}/include + ${CMAKE_SOURCE_DIR}/sql + ${CMAKE_CURRENT_SOURCE_DIR}/quicklz + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/crc + ) + +IF(NOT HAVE_SYSTEM_REGEX) + INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/pcre) +ENDIF() + +ADD_DEFINITIONS(-UMYSQL_SERVER) +######################################################################## +# xtrabackup binary +######################################################################## + +IF(WIN32) + SET(NT_SERVICE_SOURCE ${PROJECT_SOURCE_DIR}/sql/nt_servc.cc) +ELSE() + SET(NT_SERVICE_SOURCE) +ENDIF() + +ADD_DEFINITIONS(-DPCRE_STATIC=1) + +MYSQL_ADD_EXECUTABLE(mariabackup + xtrabackup.cc + innobackupex.cc + changed_page_bitmap.cc + datasink.c + ds_buffer.c + ds_compress.c + ds_local.c + ds_stdout.c + ds_tmpfile.c + ds_xbstream.c + fil_cur.cc + quicklz/quicklz.c + read_filt.cc + write_filt.cc + wsrep.cc + xbstream_write.c + backup_mysql.cc + backup_copy.cc + encryption_plugin.cc + ${PROJECT_SOURCE_DIR}/sql/net_serv.cc + ${NT_SERVICE_SOURCE} + ${PROJECT_SOURCE_DIR}/libmysqld/libmysql.c + COMPONENT backup + ) + + +# Export all symbols on Unix, for better crash callstacks +SET_TARGET_PROPERTIES(mariabackup PROPERTIES ENABLE_EXPORTS TRUE) +ADD_SUBDIRECTORY(crc) + + +TARGET_LINK_LIBRARIES(mariabackup sql crc) + +IF(NOT HAVE_SYSTEM_REGEX) + TARGET_LINK_LIBRARIES(mariabackup pcreposix) +ENDIF() + + +######################################################################## +# xbstream binary +######################################################################## +MYSQL_ADD_EXECUTABLE(mbstream + ds_buffer.c + ds_local.c + ds_stdout.c + datasink.c + xbstream.c + xbstream_read.c + xbstream_write.c + COMPONENT backup + ) + + +TARGET_LINK_LIBRARIES(mbstream + mysys + crc +) + +IF(MSVC) + SET_TARGET_PROPERTIES(mbstream PROPERTIES LINK_FLAGS setargv.obj) +ENDIF() diff --git a/extra/mariabackup/backup_copy.cc b/extra/mariabackup/backup_copy.cc new file mode 100644 index 00000000000..19cb768cd01 --- /dev/null +++ b/extra/mariabackup/backup_copy.cc @@ -0,0 +1,2017 @@ +/****************************************************** +hot backup tool for InnoDB +(c) 2009-2015 Percona LLC and/or its affiliates +(c) 2017 MariaDB +Originally Created 3/3/2009 Yasufumi Kinoshita +Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko, +Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +******************************************************* + +This file incorporates work covered by the following copyright and +permission notice: + +Copyright (c) 2000, 2011, MySQL AB & Innobase Oy. All Rights Reserved. + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 59 Temple +Place, Suite 330, Boston, MA 02111-1307 USA + +*******************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "fil_cur.h" +#include "xtrabackup.h" +#include "common.h" +#include "backup_copy.h" +#include "backup_mysql.h" +#include +#include "xb0xb.h" + + +/* list of files to sync for --rsync mode */ +static std::set rsync_list; +/* locations of tablespaces read from .isl files */ +static std::map tablespace_locations; + +/* Whether LOCK BINLOG FOR BACKUP has been issued during backup */ +bool binlog_locked; + +/************************************************************************ +Struct represents file or directory. */ +struct datadir_node_t { + ulint dbpath_len; + char *filepath; + ulint filepath_len; + char *filepath_rel; + ulint filepath_rel_len; + bool is_empty_dir; + bool is_file; +}; + +/************************************************************************ +Holds the state needed to enumerate files in MySQL data directory. */ +struct datadir_iter_t { + char *datadir_path; + char *dbpath; + ulint dbpath_len; + char *filepath; + ulint filepath_len; + char *filepath_rel; + ulint filepath_rel_len; + pthread_mutex_t mutex; + os_file_dir_t dir; + os_file_dir_t dbdir; + os_file_stat_t dbinfo; + os_file_stat_t fileinfo; + dberr_t err; + bool is_empty_dir; + bool is_file; + bool skip_first_level; +}; + + +/************************************************************************ +Represents the context of the thread processing MySQL data directory. */ +struct datadir_thread_ctxt_t { + datadir_iter_t *it; + uint n_thread; + uint *count; + pthread_mutex_t count_mutex; + os_thread_id_t id; + bool ret; +}; + +static bool backup_files_from_datadir(const char *dir_path); + +/************************************************************************ +Retirn true if character if file separator */ +bool +is_path_separator(char c) +{ + return(c == FN_LIBCHAR || c == FN_LIBCHAR2); +} + + +/************************************************************************ +Fill the node struct. Memory for node need to be allocated and freed by +the caller. It is caller responsibility to initialize node with +datadir_node_init and cleanup the memory with datadir_node_free. +Node can not be shared between threads. */ +static +void +datadir_node_fill(datadir_node_t *node, datadir_iter_t *it) +{ + if (node->filepath_len < it->filepath_len) { + free(node->filepath); + node->filepath = (char*)(malloc(it->filepath_len)); + node->filepath_len = it->filepath_len; + } + if (node->filepath_rel_len < it->filepath_rel_len) { + free(node->filepath_rel); + node->filepath_rel = (char*)(malloc(it->filepath_rel_len)); + node->filepath_rel_len = it->filepath_rel_len; + } + + strcpy(node->filepath, it->filepath); + strcpy(node->filepath_rel, it->filepath_rel); + node->is_empty_dir = it->is_empty_dir; + node->is_file = it->is_file; +} + +static +void +datadir_node_free(datadir_node_t *node) +{ + free(node->filepath); + free(node->filepath_rel); + memset(node, 0, sizeof(datadir_node_t)); +} + +static +void +datadir_node_init(datadir_node_t *node) +{ + memset(node, 0, sizeof(datadir_node_t)); +} + + +/************************************************************************ +Create the MySQL data directory iterator. Memory needs to be released +with datadir_iter_free. Position should be advanced with +datadir_iter_next_file. Iterator can be shared between multiple +threads. It is guaranteed that each thread receives unique file from +data directory into its local node struct. */ +static +datadir_iter_t * +datadir_iter_new(const char *path, bool skip_first_level = true) +{ + datadir_iter_t *it; + + it = static_cast(malloc(sizeof(datadir_iter_t))); + memset(it, 0, sizeof(datadir_iter_t)); + + pthread_mutex_init(&it->mutex, NULL); + it->datadir_path = strdup(path); + + it->dir = os_file_opendir(it->datadir_path, TRUE); + + if (it->dir == NULL) { + + goto error; + } + + it->err = DB_SUCCESS; + + it->dbpath_len = FN_REFLEN; + it->dbpath = static_cast(malloc(it->dbpath_len)); + + it->filepath_len = FN_REFLEN; + it->filepath = static_cast(malloc(it->filepath_len)); + + it->filepath_rel_len = FN_REFLEN; + it->filepath_rel = static_cast(malloc(it->filepath_rel_len)); + + it->skip_first_level = skip_first_level; + + return(it); + +error: + free(it); + + return(NULL); +} + +static +bool +datadir_iter_next_database(datadir_iter_t *it) +{ + if (it->dbdir != NULL) { + if (os_file_closedir(it->dbdir) != 0) { + + msg("Warning: could not" + " close database directory %s\n", it->dbpath); + + it->err = DB_ERROR; + + } + it->dbdir = NULL; + } + + while (os_file_readdir_next_file(it->datadir_path, + it->dir, &it->dbinfo) == 0) { + ulint len; + + if ((it->dbinfo.type == OS_FILE_TYPE_FILE + && it->skip_first_level) + || it->dbinfo.type == OS_FILE_TYPE_UNKNOWN) { + + continue; + } + + /* We found a symlink or a directory; try opening it to see + if a symlink is a directory */ + + len = strlen(it->datadir_path) + + strlen (it->dbinfo.name) + 2; + if (len > it->dbpath_len) { + it->dbpath_len = len; + free(it->dbpath); + + it->dbpath = static_cast( + malloc(it->dbpath_len)); + } + ut_snprintf(it->dbpath, it->dbpath_len, + "%s/%s", it->datadir_path, + it->dbinfo.name); + os_normalize_path(it->dbpath); + + if (it->dbinfo.type == OS_FILE_TYPE_FILE) { + it->is_file = true; + return(true); + } + + if (check_if_skip_database_by_path(it->dbpath)) { + msg("Skipping db: %s\n", it->dbpath); + continue; + } + + /* We want wrong directory permissions to be a fatal error for + XtraBackup. */ + it->dbdir = os_file_opendir(it->dbpath, TRUE); + + if (it->dbdir != NULL) { + + it->is_file = false; + return(true); + } + + } + + return(false); +} + +/************************************************************************ +Concatenate n parts into single path */ +static +void +make_path_n(int n, char **path, ulint *path_len, ...) +{ + ulint len_needed = n + 1; + char *p; + int i; + va_list vl; + + ut_ad(n > 0); + + va_start(vl, path_len); + for (i = 0; i < n; i++) { + p = va_arg(vl, char*); + len_needed += strlen(p); + } + va_end(vl); + + if (len_needed < *path_len) { + free(*path); + *path = static_cast(malloc(len_needed)); + } + + va_start(vl, path_len); + p = va_arg(vl, char*); + strcpy(*path, p); + for (i = 1; i < n; i++) { + size_t plen; + p = va_arg(vl, char*); + plen = strlen(*path); + if (!is_path_separator((*path)[plen - 1])) { + (*path)[plen] = FN_LIBCHAR; + (*path)[plen + 1] = 0; + } + strcat(*path + plen, p); + } + va_end(vl); +} + +static +bool +datadir_iter_next_file(datadir_iter_t *it) +{ + if (it->is_file && it->dbpath) { + make_path_n(2, &it->filepath, &it->filepath_len, + it->datadir_path, it->dbinfo.name); + + make_path_n(1, &it->filepath_rel, &it->filepath_rel_len, + it->dbinfo.name); + + it->is_empty_dir = false; + it->is_file = false; + + return(true); + } + + if (!it->dbpath || !it->dbdir) { + + return(false); + } + + while (os_file_readdir_next_file(it->dbpath, it->dbdir, + &it->fileinfo) == 0) { + + if (it->fileinfo.type == OS_FILE_TYPE_DIR) { + + continue; + } + + /* We found a symlink or a file */ + make_path_n(3, &it->filepath, &it->filepath_len, + it->datadir_path, it->dbinfo.name, + it->fileinfo.name); + + make_path_n(2, &it->filepath_rel, &it->filepath_rel_len, + it->dbinfo.name, it->fileinfo.name); + + it->is_empty_dir = false; + + return(true); + } + + return(false); +} + +static +bool +datadir_iter_next(datadir_iter_t *it, datadir_node_t *node) +{ + bool ret = true; + + pthread_mutex_lock(&it->mutex); + + if (datadir_iter_next_file(it)) { + + datadir_node_fill(node, it); + + goto done; + } + + while (datadir_iter_next_database(it)) { + + if (datadir_iter_next_file(it)) { + + datadir_node_fill(node, it); + + goto done; + } + + make_path_n(2, &it->filepath, &it->filepath_len, + it->datadir_path, it->dbinfo.name); + + make_path_n(1, &it->filepath_rel, &it->filepath_rel_len, + it->dbinfo.name); + + it->is_empty_dir = true; + + datadir_node_fill(node, it); + + goto done; + } + + /* nothing found */ + ret = false; + +done: + pthread_mutex_unlock(&it->mutex); + + return(ret); +} + +/************************************************************************ +Interface to read MySQL data file sequentially. One should open file +with datafile_open to get cursor and close the cursor with +datafile_close. Cursor can not be shared between multiple +threads. */ +static +void +datadir_iter_free(datadir_iter_t *it) +{ + pthread_mutex_destroy(&it->mutex); + + if (it->dbdir) { + + os_file_closedir(it->dbdir); + } + + if (it->dir) { + + os_file_closedir(it->dir); + } + + free(it->dbpath); + free(it->filepath); + free(it->filepath_rel); + free(it->datadir_path); + free(it); +} + + +/************************************************************************ +Holds the state needed to copy single data file. */ +struct datafile_cur_t { + pfs_os_file_t file; + char rel_path[FN_REFLEN]; + char abs_path[FN_REFLEN]; + MY_STAT statinfo; + uint thread_n; + byte* orig_buf; + byte* buf; + size_t buf_size; + size_t buf_read; + size_t buf_offset; +}; + +static +void +datafile_close(datafile_cur_t *cursor) +{ + if (cursor->file != OS_FILE_CLOSED) { + os_file_close(cursor->file); + } + free(cursor->buf); +} + +static +bool +datafile_open(const char *file, datafile_cur_t *cursor, uint thread_n) +{ + bool success; + + memset(cursor, 0, sizeof(datafile_cur_t)); + + strncpy(cursor->abs_path, file, sizeof(cursor->abs_path)); + + /* Get the relative path for the destination tablespace name, i.e. the + one that can be appended to the backup root directory. Non-system + tablespaces may have absolute paths for remote tablespaces in MySQL + 5.6+. We want to make "local" copies for the backup. */ + strncpy(cursor->rel_path, + xb_get_relative_path(cursor->abs_path, FALSE), + sizeof(cursor->rel_path)); + + cursor->file = os_file_create_simple_no_error_handling( + 0, cursor->abs_path, + OS_FILE_OPEN, OS_FILE_READ_ALLOW_DELETE, true, &success); + if (!success) { + /* The following call prints an error message */ + os_file_get_last_error(TRUE); + + msg("[%02u] error: cannot open " + "file %s\n", + thread_n, cursor->abs_path); + + return(false); + } + + if (!my_stat(cursor->abs_path, &cursor->statinfo, 0)) { + msg("[%02u] error: cannot stat %s\n", + thread_n, cursor->abs_path); + + datafile_close(cursor); + + return(false); + } + + posix_fadvise(cursor->file, 0, 0, POSIX_FADV_SEQUENTIAL); + + cursor->buf_size = 10 * 1024 * 1024; + cursor->buf = static_cast(malloc((ulint)cursor->buf_size)); + + return(true); +} + + +static +xb_fil_cur_result_t +datafile_read(datafile_cur_t *cursor) +{ + ulint to_read; + + xtrabackup_io_throttling(); + + to_read = (ulint)MY_MIN(cursor->statinfo.st_size - cursor->buf_offset, + cursor->buf_size); + + if (to_read == 0) { + return(XB_FIL_CUR_EOF); + } + + if (!os_file_read(IORequestRead, + cursor->file, cursor->buf, cursor->buf_offset, + to_read)) { + return(XB_FIL_CUR_ERROR); + } + + posix_fadvise(cursor->file, cursor->buf_offset, to_read, + POSIX_FADV_DONTNEED); + + cursor->buf_read = to_read; + cursor->buf_offset += to_read; + + return(XB_FIL_CUR_SUCCESS); +} + + + +/************************************************************************ +Check to see if a file exists. +Takes name of the file to check. +@return true if file exists. */ +static +bool +file_exists(const char *filename) +{ + MY_STAT stat_arg; + + if (!my_stat(filename, &stat_arg, MYF(0))) { + + return(false); + } + + return(true); +} + +/************************************************************************ +Trim leading slashes from absolute path so it becomes relative */ +static +const char * +trim_dotslash(const char *path) +{ + while (*path) { + if (is_path_separator(*path)) { + ++path; + continue; + } + if (*path == '.' && is_path_separator(path[1])) { + path += 2; + continue; + } + break; + } + + return(path); +} + + + +/************************************************************************ +Check if string ends with given suffix. +@return true if string ends with given suffix. */ +bool +ends_with(const char *str, const char *suffix) +{ + size_t suffix_len = strlen(suffix); + size_t str_len = strlen(str); + return(str_len >= suffix_len + && strcmp(str + str_len - suffix_len, suffix) == 0); +} + +static bool starts_with(const char *str, const char *prefix) +{ + return strncmp(str, prefix, strlen(prefix)) == 0; +} + +/************************************************************************ +Create directories recursively. +@return 0 if directories created successfully. */ +static +int +mkdirp(const char *pathname, int Flags, myf MyFlags) +{ + char parent[PATH_MAX], *p; + + /* make a parent directory path */ + strncpy(parent, pathname, sizeof(parent)); + parent[sizeof(parent) - 1] = 0; + + for (p = parent + strlen(parent); + !is_path_separator(*p) && p != parent; p--); + + *p = 0; + + /* try to make parent directory */ + if (p != parent && mkdirp(parent, Flags, MyFlags) != 0) { + return(-1); + } + + /* make this one if parent has been made */ + if (my_mkdir(pathname, Flags, MyFlags) == 0) { + return(0); + } + + /* if it already exists that is fine */ + if (errno == EEXIST) { + return(0); + } + + return(-1); +} + +/************************************************************************ +Return true if first and second arguments are the same path. */ +bool +equal_paths(const char *first, const char *second) +{ +#ifdef HAVE_REALPATH + char real_first[PATH_MAX]; + char real_second[PATH_MAX]; + + if (realpath(first, real_first) == NULL) { + return false; + } + if (realpath(second, real_second) == NULL) { + return false; + } + + return (strcmp(real_first, real_second) == 0); +#else + return strcmp(first, second) == 0; +#endif +} + +/************************************************************************ +Check if directory exists. Optionally create directory if doesn't +exist. +@return true if directory exists and if it was created successfully. */ +bool +directory_exists(const char *dir, bool create) +{ + os_file_dir_t os_dir; + MY_STAT stat_arg; + char errbuf[MYSYS_STRERROR_SIZE]; + + if (my_stat(dir, &stat_arg, MYF(0)) == NULL) { + + if (!create) { + return(false); + } + + if (mkdirp(dir, 0777, MYF(0)) < 0) { + my_strerror(errbuf, sizeof(errbuf), my_errno); + msg("Can not create directory %s: %s\n", dir, errbuf); + return(false); + + } + } + + /* could be symlink */ + os_dir = os_file_opendir(dir, FALSE); + + if (os_dir == NULL) { + my_strerror(errbuf, sizeof(errbuf), my_errno); + msg("Can not open directory %s: %s\n", dir, + errbuf); + + return(false); + } + + os_file_closedir(os_dir); + + return(true); +} + +/************************************************************************ +Check that directory exists and it is empty. */ +static +bool +directory_exists_and_empty(const char *dir, const char *comment) +{ + os_file_dir_t os_dir; + dberr_t err; + os_file_stat_t info; + bool empty; + + if (!directory_exists(dir, true)) { + return(false); + } + + os_dir = os_file_opendir(dir, FALSE); + + if (os_dir == NULL) { + msg("%s can not open directory %s\n", comment, dir); + return(false); + } + + empty = (fil_file_readdir_next_file(&err, dir, os_dir, &info) != 0); + + os_file_closedir(os_dir); + + if (!empty) { + msg("%s directory %s is not empty!\n", comment, dir); + } + + return(empty); +} + + +/************************************************************************ +Check if file name ends with given set of suffixes. +@return true if it does. */ +static +bool +filename_matches(const char *filename, const char **ext_list) +{ + const char **ext; + + for (ext = ext_list; *ext; ext++) { + if (ends_with(filename, *ext)) { + return(true); + } + } + + return(false); +} + + +/************************************************************************ +Copy data file for backup. Also check if it is allowed to copy by +comparing its name to the list of known data file types and checking +if passes the rules for partial backup. +@return true if file backed up or skipped successfully. */ +static +bool +datafile_copy_backup(const char *filepath, uint thread_n) +{ + const char *ext_list[] = {"frm", "isl", "MYD", "MYI", "MAD", "MAI", + "MRG", "TRG", "TRN", "ARM", "ARZ", "CSM", "CSV", "opt", "par", + NULL}; + + /* Get the name and the path for the tablespace. node->name always + contains the path (which may be absolute for remote tablespaces in + 5.6+). space->name contains the tablespace name in the form + "./database/table.ibd" (in 5.5-) or "database/table" (in 5.6+). For a + multi-node shared tablespace, space->name contains the name of the first + node, but that's irrelevant, since we only need node_name to match them + against filters, and the shared tablespace is always copied regardless + of the filters value. */ + + if (check_if_skip_table(filepath)) { + msg_ts("[%02u] Skipping %s.\n", thread_n, filepath); + return(true); + } + + if (filename_matches(filepath, ext_list)) { + return copy_file(ds_data, filepath, filepath, thread_n); + } + + return(true); +} + + +/************************************************************************ +Same as datafile_copy_backup, but put file name into the list for +rsync command. */ +static +bool +datafile_rsync_backup(const char *filepath, bool save_to_list, FILE *f) +{ + const char *ext_list[] = {"frm", "isl", "MYD", "MYI", "MAD", "MAI", + "MRG", "TRG", "TRN", "ARM", "ARZ", "CSM", "CSV", "opt", "par", + NULL}; + + /* Get the name and the path for the tablespace. node->name always + contains the path (which may be absolute for remote tablespaces in + 5.6+). space->name contains the tablespace name in the form + "./database/table.ibd" (in 5.5-) or "database/table" (in 5.6+). For a + multi-node shared tablespace, space->name contains the name of the first + node, but that's irrelevant, since we only need node_name to match them + against filters, and the shared tablespace is always copied regardless + of the filters value. */ + + if (check_if_skip_table(filepath)) { + return(true); + } + + if (filename_matches(filepath, ext_list)) { + fprintf(f, "%s\n", filepath); + if (save_to_list) { + rsync_list.insert(filepath); + } + } + + return(true); +} + + +static +bool +backup_file_vprintf(const char *filename, const char *fmt, va_list ap) +{ + ds_file_t *dstfile = NULL; + MY_STAT stat; /* unused for now */ + char *buf = 0; + int buf_len; + const char *action; + + memset(&stat, 0, sizeof(stat)); + + buf_len = vasprintf(&buf, fmt, ap); + + stat.st_size = buf_len; + stat.st_mtime = my_time(0); + + dstfile = ds_open(ds_data, filename, &stat); + if (dstfile == NULL) { + msg("[%02u] error: " + "cannot open the destination stream for %s\n", + 0, filename); + goto error; + } + + action = xb_get_copy_action("Writing"); + msg_ts("[%02u] %s %s\n", 0, action, filename); + + if (buf_len == -1) { + goto error; + } + + if (ds_write(dstfile, buf, buf_len)) { + goto error; + } + + /* close */ + msg_ts("[%02u] ...done\n", 0); + free(buf); + + if (ds_close(dstfile)) { + goto error_close; + } + + return(true); + +error: + free(buf); + if (dstfile != NULL) { + ds_close(dstfile); + } + +error_close: + msg("[%02u] Error: backup file failed.\n", 0); + return(false); /*ERROR*/ +} + + +bool +backup_file_printf(const char *filename, const char *fmt, ...) +{ + bool result; + va_list ap; + + va_start(ap, fmt); + + result = backup_file_vprintf(filename, fmt, ap); + + va_end(ap); + + return(result); +} + +static +bool +run_data_threads(datadir_iter_t *it, os_thread_func_t func, uint n) +{ + datadir_thread_ctxt_t *data_threads; + uint i, count; + pthread_mutex_t count_mutex; + bool ret; + + data_threads = (datadir_thread_ctxt_t*) + malloc(sizeof(datadir_thread_ctxt_t) * n); + + pthread_mutex_init(&count_mutex, NULL); + count = n; + + for (i = 0; i < n; i++) { + data_threads[i].it = it; + data_threads[i].n_thread = i + 1; + data_threads[i].count = &count; + data_threads[i].count_mutex = count_mutex; + os_thread_create(func, data_threads + i, &data_threads[i].id); + } + + /* Wait for threads to exit */ + while (1) { + os_thread_sleep(100000); + pthread_mutex_lock(&count_mutex); + if (count == 0) { + pthread_mutex_unlock(&count_mutex); + break; + } + pthread_mutex_unlock(&count_mutex); + } + + pthread_mutex_destroy(&count_mutex); + + ret = true; + for (i = 0; i < n; i++) { + ret = data_threads[i].ret && ret; + if (!data_threads[i].ret) { + msg("Error: thread %u failed.\n", i); + } + } + + free(data_threads); + + return(ret); +} + + +/************************************************************************ +Copy file for backup/restore. +@return true in case of success. */ +bool +copy_file(ds_ctxt_t *datasink, + const char *src_file_path, + const char *dst_file_path, + uint thread_n) +{ + char dst_name[FN_REFLEN]; + ds_file_t *dstfile = NULL; + datafile_cur_t cursor; + xb_fil_cur_result_t res; + + if (!datafile_open(src_file_path, &cursor, thread_n)) { + goto error_close; + } + + strncpy(dst_name, cursor.rel_path, sizeof(dst_name)); + + dstfile = ds_open(datasink, trim_dotslash(dst_file_path), + &cursor.statinfo); + if (dstfile == NULL) { + msg("[%02u] error: " + "cannot open the destination stream for %s\n", + thread_n, dst_name); + goto error; + } + + msg_ts("[%02u] %s %s to %s\n", + thread_n, xb_get_copy_action(), src_file_path, dstfile->path); + + /* The main copy loop */ + while ((res = datafile_read(&cursor)) == XB_FIL_CUR_SUCCESS) { + + if (ds_write(dstfile, cursor.buf, cursor.buf_read)) { + goto error; + } + } + + if (res == XB_FIL_CUR_ERROR) { + goto error; + } + + /* close */ + msg_ts("[%02u] ...done\n", thread_n); + datafile_close(&cursor); + if (ds_close(dstfile)) { + goto error_close; + } + return(true); + +error: + datafile_close(&cursor); + if (dstfile != NULL) { + ds_close(dstfile); + } + +error_close: + msg("[%02u] Error: copy_file() failed.\n", thread_n); + return(false); /*ERROR*/ +} + + +/************************************************************************ +Try to move file by renaming it. If source and destination are on +different devices fall back to copy and unlink. +@return true in case of success. */ +static +bool +move_file(ds_ctxt_t *datasink, + const char *src_file_path, + const char *dst_file_path, + const char *dst_dir, uint thread_n) +{ + char errbuf[MYSYS_STRERROR_SIZE]; + char dst_file_path_abs[FN_REFLEN]; + char dst_dir_abs[FN_REFLEN]; + size_t dirname_length; + + ut_snprintf(dst_file_path_abs, sizeof(dst_file_path_abs), + "%s/%s", dst_dir, dst_file_path); + + dirname_part(dst_dir_abs, dst_file_path_abs, &dirname_length); + + if (!directory_exists(dst_dir_abs, true)) { + return(false); + } + + if (file_exists(dst_file_path_abs)) { + msg("Error: Move file %s to %s failed: Destination " + "file exists\n", + src_file_path, dst_file_path_abs); + return(false); + } + + msg_ts("[%02u] Moving %s to %s\n", + thread_n, src_file_path, dst_file_path_abs); + + if (my_rename(src_file_path, dst_file_path_abs, MYF(0)) != 0) { + if (my_errno == EXDEV) { + bool ret; + ret = copy_file(datasink, src_file_path, + dst_file_path, thread_n); + msg_ts("[%02u] Removing %s\n", thread_n, src_file_path); + if (unlink(src_file_path) != 0) { + my_strerror(errbuf, sizeof(errbuf), errno); + msg("Error: unlink %s failed: %s\n", + src_file_path, + errbuf); + } + return(ret); + } + my_strerror(errbuf, sizeof(errbuf), my_errno); + msg("Can not move file %s to %s: %s\n", + src_file_path, dst_file_path_abs, + errbuf); + return(false); + } + + msg_ts("[%02u] ...done\n", thread_n); + + return(true); +} + + +/************************************************************************ +Read link from .isl file if any and store it in the global map associated +with given tablespace. */ +static +void +read_link_file(const char *ibd_filepath, const char *link_filepath) +{ + char *filepath= NULL; + + FILE *file = fopen(link_filepath, "r+b"); + if (file) { + filepath = static_cast(malloc(OS_FILE_MAX_PATH)); + + os_file_read_string(file, filepath, OS_FILE_MAX_PATH); + fclose(file); + + if (strlen(filepath)) { + /* Trim whitespace from end of filepath */ + ulint lastch = strlen(filepath) - 1; + while (lastch > 4 && filepath[lastch] <= 0x20) { + filepath[lastch--] = 0x00; + } + os_normalize_path(filepath); + } + + tablespace_locations[ibd_filepath] = filepath; + } + free(filepath); +} + + +/************************************************************************ +Return the location of given .ibd if it was previously read +from .isl file. +@return NULL or destination .ibd file path. */ +static +const char * +tablespace_filepath(const char *ibd_filepath) +{ + std::map::iterator it; + + it = tablespace_locations.find(ibd_filepath); + + if (it != tablespace_locations.end()) { + return it->second.c_str(); + } + + return NULL; +} + + +/************************************************************************ +Copy or move file depending on current mode. +@return true in case of success. */ +static +bool +copy_or_move_file(const char *src_file_path, + const char *dst_file_path, + const char *dst_dir, + uint thread_n) +{ + ds_ctxt_t *datasink = ds_data; /* copy to datadir by default */ + char filedir[FN_REFLEN]; + size_t filedir_len; + bool ret; + + /* read the link from .isl file */ + if (ends_with(src_file_path, ".isl")) { + char *ibd_filepath; + + ibd_filepath = strdup(src_file_path); + strcpy(ibd_filepath + strlen(ibd_filepath) - 3, "ibd"); + + read_link_file(ibd_filepath, src_file_path); + + free(ibd_filepath); + } + + /* check if there is .isl file */ + if (ends_with(src_file_path, ".ibd")) { + char *link_filepath; + const char *filepath; + + link_filepath = strdup(src_file_path); + strcpy(link_filepath + strlen(link_filepath) - 3, "isl"); + + read_link_file(src_file_path, link_filepath); + + filepath = tablespace_filepath(src_file_path); + + if (filepath != NULL) { + dirname_part(filedir, filepath, &filedir_len); + + dst_file_path = filepath + filedir_len; + dst_dir = filedir; + + if (!directory_exists(dst_dir, true)) { + ret = false; + goto cleanup; + } + + datasink = ds_create(dst_dir, DS_TYPE_LOCAL); + } + + free(link_filepath); + } + + ret = (xtrabackup_copy_back ? + copy_file(datasink, src_file_path, dst_file_path, thread_n) : + move_file(datasink, src_file_path, dst_file_path, + dst_dir, thread_n)); + +cleanup: + + if (datasink != ds_data) { + ds_destroy(datasink); + } + + return(ret); +} + + + + +bool +backup_files(const char *from, bool prep_mode) +{ + char rsync_tmpfile_name[FN_REFLEN]; + FILE *rsync_tmpfile = NULL; + datadir_iter_t *it; + datadir_node_t node; + bool ret = true; + + if (prep_mode && !opt_rsync) { + return(true); + } + + if (opt_rsync) { + snprintf(rsync_tmpfile_name, sizeof(rsync_tmpfile_name), + "%s/%s%d", opt_mysql_tmpdir, + "xtrabackup_rsyncfiles_pass", + prep_mode ? 1 : 2); + rsync_tmpfile = fopen(rsync_tmpfile_name, "w"); + if (rsync_tmpfile == NULL) { + msg("Error: can't create file %s\n", + rsync_tmpfile_name); + return(false); + } + } + + msg_ts("Starting %s non-InnoDB tables and files\n", + prep_mode ? "prep copy of" : "to backup"); + + datadir_node_init(&node); + it = datadir_iter_new(from); + + while (datadir_iter_next(it, &node)) { + + if (!node.is_empty_dir) { + if (opt_rsync) { + ret = datafile_rsync_backup(node.filepath, + !prep_mode, rsync_tmpfile); + } else { + ret = datafile_copy_backup(node.filepath, 1); + } + if (!ret) { + msg("Failed to copy file %s\n", node.filepath); + goto out; + } + } else if (!prep_mode) { + /* backup fake file into empty directory */ + char path[FN_REFLEN]; + ut_snprintf(path, sizeof(path), + "%s/db.opt", node.filepath); + if (!(ret = backup_file_printf( + trim_dotslash(path), "%s", ""))) { + msg("Failed to create file %s\n", path); + goto out; + } + } + } + + if (opt_rsync) { + std::stringstream cmd; + int err; + + if (buffer_pool_filename && file_exists(buffer_pool_filename)) { + fprintf(rsync_tmpfile, "%s\n", buffer_pool_filename); + rsync_list.insert(buffer_pool_filename); + } + if (file_exists("ib_lru_dump")) { + fprintf(rsync_tmpfile, "%s\n", "ib_lru_dump"); + rsync_list.insert("ib_lru_dump"); + } + + fclose(rsync_tmpfile); + rsync_tmpfile = NULL; + + cmd << "rsync -t . --files-from=" << rsync_tmpfile_name + << " " << xtrabackup_target_dir; + + msg_ts("Starting rsync as: %s\n", cmd.str().c_str()); + if ((err = system(cmd.str().c_str()) && !prep_mode) != 0) { + msg_ts("Error: rsync failed with error code %d\n", err); + ret = false; + goto out; + } + msg_ts("rsync finished successfully.\n"); + + if (!prep_mode && !opt_no_lock) { + char path[FN_REFLEN]; + char dst_path[FN_REFLEN]; + char *newline; + + /* Remove files that have been removed between first and + second passes. Cannot use "rsync --delete" because it + does not work with --files-from. */ + snprintf(rsync_tmpfile_name, sizeof(rsync_tmpfile_name), + "%s/%s", opt_mysql_tmpdir, + "xtrabackup_rsyncfiles_pass1"); + + rsync_tmpfile = fopen(rsync_tmpfile_name, "r"); + if (rsync_tmpfile == NULL) { + msg("Error: can't open file %s\n", + rsync_tmpfile_name); + return(false); + } + + while (fgets(path, sizeof(path), rsync_tmpfile)) { + + newline = strchr(path, '\n'); + if (newline) { + *newline = 0; + } + if (rsync_list.count(path) < 1) { + snprintf(dst_path, sizeof(dst_path), + "%s/%s", xtrabackup_target_dir, + path); + msg_ts("Removing %s\n", dst_path); + unlink(dst_path); + } + } + + fclose(rsync_tmpfile); + rsync_tmpfile = NULL; + } + } + + msg_ts("Finished %s non-InnoDB tables and files\n", + prep_mode ? "a prep copy of" : "backing up"); + +out: + datadir_iter_free(it); + datadir_node_free(&node); + + if (rsync_tmpfile != NULL) { + fclose(rsync_tmpfile); + } + + return(ret); +} + +/** Start --backup */ +bool backup_start() +{ + if (!opt_no_lock) { + if (opt_safe_slave_backup) { + if (!wait_for_safe_slave(mysql_connection)) { + return(false); + } + } + + if (!backup_files(fil_path_to_mysql_datadir, true)) { + return(false); + } + + history_lock_time = time(NULL); + + if (!lock_tables(mysql_connection)) { + return(false); + } + } + + if (!backup_files(fil_path_to_mysql_datadir, false)) { + return(false); + } + + if (!backup_files_from_datadir(fil_path_to_mysql_datadir)) { + return false; + } + + // There is no need to stop slave thread before coping non-Innodb data when + // --no-lock option is used because --no-lock option requires that no DDL or + // DML to non-transaction tables can occur. + if (opt_no_lock) { + if (opt_safe_slave_backup) { + if (!wait_for_safe_slave(mysql_connection)) { + return(false); + } + } + } + + if (opt_slave_info) { + lock_binlog_maybe(mysql_connection); + + if (!write_slave_info(mysql_connection)) { + return(false); + } + } + + /* The only reason why Galera/binlog info is written before + wait_for_ibbackup_log_copy_finish() is that after that call the xtrabackup + binary will start streamig a temporary copy of REDO log to stdout and + thus, any streaming from innobackupex would interfere. The only way to + avoid that is to have a single process, i.e. merge innobackupex and + xtrabackup. */ + if (opt_galera_info) { + if (!write_galera_info(mysql_connection)) { + return(false); + } + write_current_binlog_file(mysql_connection); + } + + if (opt_binlog_info == BINLOG_INFO_ON) { + + lock_binlog_maybe(mysql_connection); + write_binlog_info(mysql_connection); + } + + if (have_flush_engine_logs) { + msg_ts("Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...\n"); + xb_mysql_query(mysql_connection, + "FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS", false); + } + + return(true); +} + +/** Release resources after backup_start() */ +void backup_release() +{ + /* release all locks */ + if (!opt_no_lock) { + unlock_all(mysql_connection); + history_lock_time = 0; + } else { + history_lock_time = time(NULL) - history_lock_time; + } + + if (opt_safe_slave_backup && sql_thread_started) { + msg("Starting slave SQL thread\n"); + xb_mysql_query(mysql_connection, + "START SLAVE SQL_THREAD", false); + } +} + +/** Finish after backup_start() and backup_release() */ +bool backup_finish() +{ + /* Copy buffer pool dump or LRU dump */ + if (!opt_rsync) { + if (buffer_pool_filename && file_exists(buffer_pool_filename)) { + const char *dst_name; + + dst_name = trim_dotslash(buffer_pool_filename); + copy_file(ds_data, buffer_pool_filename, dst_name, 0); + } + if (file_exists("ib_lru_dump")) { + copy_file(ds_data, "ib_lru_dump", "ib_lru_dump", 0); + } + } + + msg_ts("Backup created in directory '%s'\n", xtrabackup_target_dir); + if (mysql_binlog_position != NULL) { + msg("MySQL binlog position: %s\n", mysql_binlog_position); + } + if (mysql_slave_position && opt_slave_info) { + msg("MySQL slave binlog position: %s\n", + mysql_slave_position); + } + + if (!write_backup_config_file()) { + return(false); + } + + if (!write_xtrabackup_info(mysql_connection)) { + return(false); + } + + + + return(true); +} + +bool +ibx_copy_incremental_over_full() +{ + const char *ext_list[] = {"frm", "isl", "MYD", "MYI", "MAD", "MAI", + "MRG", "TRG", "TRN", "ARM", "ARZ", "CSM", "CSV", "opt", "par", + NULL}; + const char *sup_files[] = {"xtrabackup_binlog_info", + "xtrabackup_galera_info", + "xtrabackup_slave_info", + "xtrabackup_info", + "ib_lru_dump", + NULL}; + datadir_iter_t *it = NULL; + datadir_node_t node; + bool ret = true; + char path[FN_REFLEN]; + int i; + + datadir_node_init(&node); + + /* If we were applying an incremental change set, we need to make + sure non-InnoDB files and xtrabackup_* metainfo files are copied + to the full backup directory. */ + + if (xtrabackup_incremental) { + + ds_data = ds_create(xtrabackup_target_dir, DS_TYPE_LOCAL); + + it = datadir_iter_new(xtrabackup_incremental_dir); + + while (datadir_iter_next(it, &node)) { + + /* copy only non-innodb files */ + + if (node.is_empty_dir + || !filename_matches(node.filepath, ext_list)) { + continue; + } + + if (file_exists(node.filepath_rel)) { + unlink(node.filepath_rel); + } + + if (!(ret = copy_file(ds_data, node.filepath, + node.filepath_rel, 1))) { + msg("Failed to copy file %s\n", + node.filepath); + goto cleanup; + } + } + + /* copy buffer pool dump */ + if (innobase_buffer_pool_filename) { + const char *src_name; + + src_name = trim_dotslash(innobase_buffer_pool_filename); + + snprintf(path, sizeof(path), "%s/%s", + xtrabackup_incremental_dir, + src_name); + + if (file_exists(path)) { + copy_file(ds_data, path, + innobase_buffer_pool_filename, 0); + } + } + + /* copy supplementary files */ + + for (i = 0; sup_files[i]; i++) { + snprintf(path, sizeof(path), "%s/%s", + xtrabackup_incremental_dir, + sup_files[i]); + + if (file_exists(path)) + { + if (file_exists(sup_files[i])) { + unlink(sup_files[i]); + } + copy_file(ds_data, path, sup_files[i], 0); + } + } + + } + +cleanup: + if (it != NULL) { + datadir_iter_free(it); + } + + if (ds_data != NULL) { + ds_destroy(ds_data); + } + + datadir_node_free(&node); + + return(ret); +} + +bool +ibx_cleanup_full_backup() +{ + const char *ext_list[] = {"delta", "meta", "ibd", NULL}; + datadir_iter_t *it = NULL; + datadir_node_t node; + bool ret = true; + + datadir_node_init(&node); + + /* If we are applying an incremental change set, we need to make + sure non-InnoDB files are cleaned up from full backup dir before + we copy files from incremental dir. */ + + it = datadir_iter_new(xtrabackup_target_dir); + + while (datadir_iter_next(it, &node)) { + + if (node.is_empty_dir) { +#ifdef _WIN32 + DeleteFile(node.filepath); +#else + rmdir(node.filepath); +#endif + } + + if (xtrabackup_incremental && !node.is_empty_dir + && !filename_matches(node.filepath, ext_list)) { + unlink(node.filepath); + } + } + + datadir_iter_free(it); + + datadir_node_free(&node); + + return(ret); +} + +bool +apply_log_finish() +{ + if (!ibx_cleanup_full_backup() + || !ibx_copy_incremental_over_full()) { + return(false); + } + + return(true); +} + +bool +copy_back() +{ + bool ret; + datadir_iter_t *it = NULL; + datadir_node_t node; + char *dst_dir; + + memset(&node, 0, sizeof(node)); + + if (!opt_force_non_empty_dirs) { + if (!directory_exists_and_empty(mysql_data_home, + "Original data")) { + return(false); + } + } else { + if (!directory_exists(mysql_data_home, true)) { + return(false); + } + } + if (srv_undo_dir && *srv_undo_dir + && !directory_exists(srv_undo_dir, true)) { + return(false); + } + if (innobase_data_home_dir && *innobase_data_home_dir + && !directory_exists(innobase_data_home_dir, true)) { + return(false); + } + if (srv_log_group_home_dir && *srv_log_group_home_dir + && !directory_exists(srv_log_group_home_dir, true)) { + return(false); + } + + /* cd to backup directory */ + if (my_setwd(xtrabackup_target_dir, MYF(MY_WME))) + { + msg("cannot my_setwd %s\n", xtrabackup_target_dir); + return(false); + } + + /* parse data file path */ + + if (!innobase_data_file_path) { + innobase_data_file_path = (char*) "ibdata1:10M:autoextend"; + } + + srv_sys_space.set_path("."); + + if (!srv_sys_space.parse_params(innobase_data_file_path, true)) { + msg("syntax error in innodb_data_file_path\n"); + return(false); + } + + srv_max_n_threads = 1000; + sync_check_init(); + ut_crc32_init(); + + /* copy undo tablespaces */ + if (srv_undo_tablespaces > 0) { + + dst_dir = (srv_undo_dir && *srv_undo_dir) + ? srv_undo_dir : mysql_data_home; + + ds_data = ds_create(dst_dir, DS_TYPE_LOCAL); + + for (ulong i = 1; i <= srv_undo_tablespaces; i++) { + char filename[20]; + sprintf(filename, "undo%03lu", i); + if (!(ret = copy_or_move_file(filename, filename, + dst_dir, 1))) { + goto cleanup; + } + } + + ds_destroy(ds_data); + ds_data = NULL; + } + + dst_dir = (srv_log_group_home_dir && *srv_log_group_home_dir) + ? srv_log_group_home_dir : mysql_data_home; + + /* --backup generates a single ib_logfile0, which we must copy + if it exists. */ + + ds_data = ds_create(dst_dir, DS_TYPE_LOCAL); + if (!file_exists("ib_logfile0")) { + /* After completed --prepare, redo log files are redundant. + We must delete any redo logs at the destination, so that + the database will not jump to a different log sequence number + (LSN). */ + + for (uint i = 0; i <= SRV_N_LOG_FILES_MAX + 1; i++) { + char filename[FN_REFLEN]; + snprintf(filename, sizeof filename, "%s/ib_logfile%u", + dst_dir, i); + unlink(filename); + } + } else if (!(ret = copy_or_move_file("ib_logfile0", "ib_logfile0", + dst_dir, 1))) { + goto cleanup; + } + ds_destroy(ds_data); + + /* copy innodb system tablespace(s) */ + + dst_dir = (innobase_data_home_dir && *innobase_data_home_dir) + ? innobase_data_home_dir : mysql_data_home; + + ds_data = ds_create(dst_dir, DS_TYPE_LOCAL); + + for (Tablespace::const_iterator iter(srv_sys_space.begin()), + end(srv_sys_space.end()); + iter != end; + ++iter) { + const char *filename = base_name(iter->name()); + + if (!(ret = copy_or_move_file(filename, iter->name(), + dst_dir, 1))) { + goto cleanup; + } + } + + ds_destroy(ds_data); + + /* copy the rest of tablespaces */ + ds_data = ds_create(mysql_data_home, DS_TYPE_LOCAL); + + it = datadir_iter_new(".", false); + + datadir_node_init(&node); + + while (datadir_iter_next(it, &node)) { + const char *ext_list[] = {"backup-my.cnf", + "xtrabackup_binary", "xtrabackup_binlog_info", + "xtrabackup_checkpoints", ".qp", ".pmap", ".tmp", + NULL}; + const char *filename; + char c_tmp; + int i_tmp; + bool is_ibdata_file; + + /* create empty directories */ + if (node.is_empty_dir) { + char path[FN_REFLEN]; + + snprintf(path, sizeof(path), "%s/%s", + mysql_data_home, node.filepath_rel); + + msg_ts("[%02u] Creating directory %s\n", 1, path); + + if (mkdirp(path, 0777, MYF(0)) < 0) { + char errbuf[MYSYS_STRERROR_SIZE]; + my_strerror(errbuf, sizeof(errbuf), my_errno); + msg("Can not create directory %s: %s\n", + path, errbuf); + ret = false; + + goto cleanup; + + } + + msg_ts("[%02u] ...done.", 1); + + continue; + } + + filename = base_name(node.filepath); + + /* skip .qp files */ + if (filename_matches(filename, ext_list)) { + continue; + } + + /* skip undo tablespaces */ + if (sscanf(filename, "undo%d%c", &i_tmp, &c_tmp) == 1) { + continue; + } + + /* skip the redo log (it was already copied) */ + if (!strcmp(filename, "ib_logfile0")) { + continue; + } + + /* skip innodb data files */ + is_ibdata_file = false; + for (Tablespace::const_iterator iter(srv_sys_space.begin()), + end(srv_sys_space.end()); iter != end; ++iter) { + if (strcmp(iter->name(), filename) == 0) { + is_ibdata_file = true; + break; + } + } + if (is_ibdata_file) { + continue; + } + + if (!(ret = copy_or_move_file(node.filepath, node.filepath_rel, + mysql_data_home, 1))) { + goto cleanup; + } + } + + /* copy buufer pool dump */ + + if (innobase_buffer_pool_filename) { + const char *src_name; + char path[FN_REFLEN]; + + src_name = trim_dotslash(innobase_buffer_pool_filename); + + snprintf(path, sizeof(path), "%s/%s", + mysql_data_home, + src_name); + + /* could be already copied with other files + from data directory */ + if (file_exists(src_name) && + !file_exists(innobase_buffer_pool_filename)) { + copy_or_move_file(src_name, + innobase_buffer_pool_filename, + mysql_data_home, 0); + } + } + +cleanup: + if (it != NULL) { + datadir_iter_free(it); + } + + datadir_node_free(&node); + + if (ds_data != NULL) { + ds_destroy(ds_data); + } + + ds_data = NULL; + + sync_check_close(); + return(ret); +} + +bool +decrypt_decompress_file(const char *filepath, uint thread_n) +{ + std::stringstream cmd, message; + char *dest_filepath = strdup(filepath); + bool needs_action = false; + + cmd << IF_WIN("type ","cat ") << filepath; + + if (opt_decompress + && ends_with(filepath, ".qp")) { + cmd << " | qpress -dio "; + dest_filepath[strlen(dest_filepath) - 3] = 0; + if (needs_action) { + message << " and "; + } + message << "decompressing"; + needs_action = true; + } + + cmd << " > " << dest_filepath; + message << " " << filepath; + + free(dest_filepath); + + if (needs_action) { + + msg_ts("[%02u] %s\n", thread_n, message.str().c_str()); + + if (system(cmd.str().c_str()) != 0) { + return(false); + } + } + + return(true); +} + +static +os_thread_ret_t STDCALL +decrypt_decompress_thread_func(void *arg) +{ + bool ret = true; + datadir_node_t node; + datadir_thread_ctxt_t *ctxt = (datadir_thread_ctxt_t *)(arg); + + datadir_node_init(&node); + + while (datadir_iter_next(ctxt->it, &node)) { + + /* skip empty directories in backup */ + if (node.is_empty_dir) { + continue; + } + + if (!ends_with(node.filepath, ".qp")) { + continue; + } + + if (!(ret = decrypt_decompress_file(node.filepath, + ctxt->n_thread))) { + goto cleanup; + } + } + +cleanup: + + datadir_node_free(&node); + + pthread_mutex_lock(&ctxt->count_mutex); + --(*ctxt->count); + pthread_mutex_unlock(&ctxt->count_mutex); + + ctxt->ret = ret; + + os_thread_exit(); + OS_THREAD_DUMMY_RETURN; +} + +bool +decrypt_decompress() +{ + bool ret; + datadir_iter_t *it = NULL; + + srv_max_n_threads = 1000; + sync_check_init(); + + /* cd to backup directory */ + if (my_setwd(xtrabackup_target_dir, MYF(MY_WME))) + { + msg("cannot my_setwd %s\n", xtrabackup_target_dir); + return(false); + } + + /* copy the rest of tablespaces */ + ds_data = ds_create(".", DS_TYPE_LOCAL); + + it = datadir_iter_new(".", false); + + ut_a(xtrabackup_parallel >= 0); + + ret = run_data_threads(it, decrypt_decompress_thread_func, + xtrabackup_parallel ? xtrabackup_parallel : 1); + + if (it != NULL) { + datadir_iter_free(it); + } + + if (ds_data != NULL) { + ds_destroy(ds_data); + } + + ds_data = NULL; + + sync_check_close(); + + return(ret); +} + +/* + Copy some files from top level datadir. + Do not copy the Innodb files (ibdata1, redo log files), + as this is done in a separate step. +*/ +static bool backup_files_from_datadir(const char *dir_path) +{ + os_file_dir_t dir = os_file_opendir(dir_path, TRUE); + os_file_stat_t info; + bool ret = true; + while (os_file_readdir_next_file(dir_path, dir, &info) == 0) { + + if (info.type != OS_FILE_TYPE_FILE) + continue; + + const char *pname = strrchr(info.name, IF_WIN('\\', '/')); + if (!pname) + pname = info.name; + + /* Copy aria log files, and aws keys for encryption plugins.*/ + const char *prefixes[] = { "aria_log", "aws-kms-key" }; + for (size_t i = 0; i < array_elements(prefixes); i++) { + if (starts_with(pname, prefixes[i])) { + ret = copy_file(ds_data, info.name, info.name, 1); + if (!ret) { + break; + } + } + } + } + os_file_closedir(dir); + return ret; +} diff --git a/extra/mariabackup/backup_copy.h b/extra/mariabackup/backup_copy.h new file mode 100644 index 00000000000..fbc09eaded3 --- /dev/null +++ b/extra/mariabackup/backup_copy.h @@ -0,0 +1,51 @@ + +#ifndef XTRABACKUP_BACKUP_COPY_H +#define XTRABACKUP_BACKUP_COPY_H + +#include +#include "datasink.h" + +/* special files */ +#define XTRABACKUP_SLAVE_INFO "xtrabackup_slave_info" +#define XTRABACKUP_GALERA_INFO "xtrabackup_galera_info" +#define XTRABACKUP_BINLOG_INFO "xtrabackup_binlog_info" +#define XTRABACKUP_INFO "xtrabackup_info" + +extern bool binlog_locked; + +bool +backup_file_printf(const char *filename, const char *fmt, ...) + ATTRIBUTE_FORMAT(printf, 2, 0); + +/************************************************************************ +Return true if first and second arguments are the same path. */ +bool +equal_paths(const char *first, const char *second); + +/************************************************************************ +Copy file for backup/restore. +@return true in case of success. */ +bool +copy_file(ds_ctxt_t *datasink, + const char *src_file_path, + const char *dst_file_path, + uint thread_n); + +/** Start --backup */ +bool backup_start(); +/** Release resources after backup_start() */ +void backup_release(); +/** Finish after backup_start() and backup_release() */ +bool backup_finish(); +bool +apply_log_finish(); +bool +copy_back(); +bool +decrypt_decompress(); +bool +is_path_separator(char); +bool +directory_exists(const char *dir, bool create); + +#endif diff --git a/extra/mariabackup/backup_mysql.cc b/extra/mariabackup/backup_mysql.cc new file mode 100644 index 00000000000..cebbbf3a28c --- /dev/null +++ b/extra/mariabackup/backup_mysql.cc @@ -0,0 +1,1706 @@ +/****************************************************** +hot backup tool for InnoDB +(c) 2009-2015 Percona LLC and/or its affiliates +Originally Created 3/3/2009 Yasufumi Kinoshita +Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko, +Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +******************************************************* + +This file incorporates work covered by the following copyright and +permission notice: + +Copyright (c) 2000, 2011, MySQL AB & Innobase Oy. All Rights Reserved. + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 59 Temple +Place, Suite 330, Boston, MA 02111-1307 USA + +*******************************************************/ +#define MYSQL_CLIENT + +#include +#include +#include +#include +#include +#include +#include "common.h" +#include "xtrabackup.h" +#include "mysql_version.h" +#include "backup_copy.h" +#include "backup_mysql.h" +#include "mysqld.h" +#include "encryption_plugin.h" +#include +#include +#include + + +char *tool_name; +char tool_args[2048]; + +/* mysql flavor and version */ +mysql_flavor_t server_flavor = FLAVOR_UNKNOWN; +unsigned long mysql_server_version = 0; + +/* server capabilities */ +bool have_changed_page_bitmaps = false; +bool have_backup_locks = false; +bool have_backup_safe_binlog_info = false; +bool have_lock_wait_timeout = false; +bool have_galera_enabled = false; +bool have_flush_engine_logs = false; +bool have_multi_threaded_slave = false; +bool have_gtid_slave = false; + +/* Kill long selects */ +os_thread_id_t kill_query_thread_id; +os_event_t kill_query_thread_started; +os_event_t kill_query_thread_stopped; +os_event_t kill_query_thread_stop; + +bool sql_thread_started = false; +char *mysql_slave_position = NULL; +char *mysql_binlog_position = NULL; +char *buffer_pool_filename = NULL; + +/* History on server */ +time_t history_start_time; +time_t history_end_time; +time_t history_lock_time; + +MYSQL *mysql_connection; + +my_bool opt_ssl_verify_server_cert; + +MYSQL * +xb_mysql_connect() +{ + MYSQL *connection = mysql_init(NULL); + char mysql_port_str[std::numeric_limits::digits10 + 3]; + + sprintf(mysql_port_str, "%d", opt_port); + + if (connection == NULL) { + msg("Failed to init MySQL struct: %s.\n", + mysql_error(connection)); + return(NULL); + } + + if (!opt_secure_auth) { + mysql_options(connection, MYSQL_SECURE_AUTH, + (char *) &opt_secure_auth); + } + + if (xb_plugin_dir && *xb_plugin_dir){ + mysql_options(connection, MYSQL_PLUGIN_DIR, xb_plugin_dir); + } + mysql_options(connection, MYSQL_OPT_PROTOCOL, &opt_protocol); + mysql_options(connection,MYSQL_SET_CHARSET_NAME, "utf8"); + + msg_ts("Connecting to MySQL server host: %s, user: %s, password: %s, " + "port: %s, socket: %s\n", opt_host ? opt_host : "localhost", + opt_user ? opt_user : "not set", + opt_password ? "set" : "not set", + opt_port != 0 ? mysql_port_str : "not set", + opt_socket ? opt_socket : "not set"); + +#ifdef HAVE_OPENSSL + if (opt_use_ssl) + { + mysql_ssl_set(connection, opt_ssl_key, opt_ssl_cert, + opt_ssl_ca, opt_ssl_capath, + opt_ssl_cipher); + mysql_options(connection, MYSQL_OPT_SSL_CRL, opt_ssl_crl); + mysql_options(connection, MYSQL_OPT_SSL_CRLPATH, + opt_ssl_crlpath); + } + mysql_options(connection,MYSQL_OPT_SSL_VERIFY_SERVER_CERT, + (char*)&opt_ssl_verify_server_cert); +#endif + + if (!mysql_real_connect(connection, + opt_host ? opt_host : "localhost", + opt_user, + opt_password, + "" /*database*/, opt_port, + opt_socket, 0)) { + msg("Failed to connect to MySQL server: %s.\n", + mysql_error(connection)); + mysql_close(connection); + return(NULL); + } + + xb_mysql_query(connection, "SET SESSION wait_timeout=2147483", + false, true); + + return(connection); +} + +/*********************************************************************//** +Execute mysql query. */ +MYSQL_RES * +xb_mysql_query(MYSQL *connection, const char *query, bool use_result, + bool die_on_error) +{ + MYSQL_RES *mysql_result = NULL; + + if (mysql_query(connection, query)) { + msg("Error: failed to execute query %s: %s\n", query, + mysql_error(connection)); + if (die_on_error) { + exit(EXIT_FAILURE); + } + return(NULL); + } + + /* store result set on client if there is a result */ + if (mysql_field_count(connection) > 0) { + if ((mysql_result = mysql_store_result(connection)) == NULL) { + msg("Error: failed to fetch query result %s: %s\n", + query, mysql_error(connection)); + exit(EXIT_FAILURE); + } + + if (!use_result) { + mysql_free_result(mysql_result); + } + } + + return mysql_result; +} + + +struct mysql_variable { + const char *name; + char **value; +}; + + +static +void +read_mysql_variables(MYSQL *connection, const char *query, mysql_variable *vars, + bool vertical_result) +{ + MYSQL_RES *mysql_result; + MYSQL_ROW row; + mysql_variable *var; + + mysql_result = xb_mysql_query(connection, query, true); + + ut_ad(!vertical_result || mysql_num_fields(mysql_result) == 2); + + if (vertical_result) { + while ((row = mysql_fetch_row(mysql_result))) { + char *name = row[0]; + char *value = row[1]; + for (var = vars; var->name; var++) { + if (strcmp(var->name, name) == 0 + && value != NULL) { + *(var->value) = strdup(value); + } + } + } + } else { + MYSQL_FIELD *field; + + if ((row = mysql_fetch_row(mysql_result)) != NULL) { + int i = 0; + while ((field = mysql_fetch_field(mysql_result)) + != NULL) { + char *name = field->name; + char *value = row[i]; + for (var = vars; var->name; var++) { + if (strcmp(var->name, name) == 0 + && value != NULL) { + *(var->value) = strdup(value); + } + } + ++i; + } + } + } + + mysql_free_result(mysql_result); +} + + +static +void +free_mysql_variables(mysql_variable *vars) +{ + mysql_variable *var; + + for (var = vars; var->name; var++) { + free(*(var->value)); + } +} + + +static +char * +read_mysql_one_value(MYSQL *connection, const char *query) +{ + MYSQL_RES *mysql_result; + MYSQL_ROW row; + char *result = NULL; + + mysql_result = xb_mysql_query(connection, query, true); + + ut_ad(mysql_num_fields(mysql_result) == 1); + + if ((row = mysql_fetch_row(mysql_result))) { + result = strdup(row[0]); + } + + mysql_free_result(mysql_result); + + return(result); +} + +static +bool +check_server_version(unsigned long version_number, + const char *version_string, + const char *version_comment, + const char *innodb_version) +{ + bool version_supported = false; + bool mysql51 = false; + + mysql_server_version = version_number; + + server_flavor = FLAVOR_UNKNOWN; + if (strstr(version_comment, "Percona") != NULL) { + server_flavor = FLAVOR_PERCONA_SERVER; + } else if (strstr(version_comment, "MariaDB") != NULL || + strstr(version_string, "MariaDB") != NULL) { + server_flavor = FLAVOR_MARIADB; + } else if (strstr(version_comment, "MySQL") != NULL) { + server_flavor = FLAVOR_MYSQL; + } + + mysql51 = version_number > 50100 && version_number < 50500; + version_supported = version_supported + || (mysql51 && innodb_version != NULL); + version_supported = version_supported + || (version_number > 50500 && version_number < 50700); + version_supported = version_supported + || ((version_number > 100000) + && server_flavor == FLAVOR_MARIADB); + + if (mysql51 && innodb_version == NULL) { + msg("Error: Built-in InnoDB in MySQL 5.1 is not " + "supported in this release. You can either use " + "Percona XtraBackup 2.0, or upgrade to InnoDB " + "plugin.\n"); + } else if (!version_supported) { + msg("Error: Unsupported server version: '%s'. Please " + "report a bug at " + "https://bugs.launchpad.net/percona-xtrabackup\n", + version_string); + } + + return(version_supported); +} + +/*********************************************************************//** +Receive options important for XtraBackup from MySQL server. +@return true on success. */ +bool +get_mysql_vars(MYSQL *connection) +{ + char *gtid_mode_var = NULL; + char *version_var = NULL; + char *version_comment_var = NULL; + char *innodb_version_var = NULL; + char *have_backup_locks_var = NULL; + char *have_backup_safe_binlog_info_var = NULL; + char *log_bin_var = NULL; + char *lock_wait_timeout_var= NULL; + char *wsrep_on_var = NULL; + char *slave_parallel_workers_var = NULL; + char *gtid_slave_pos_var = NULL; + char *innodb_buffer_pool_filename_var = NULL; + char *datadir_var = NULL; + char *innodb_log_group_home_dir_var = NULL; + char *innodb_log_file_size_var = NULL; + char *innodb_log_files_in_group_var = NULL; + char *innodb_data_file_path_var = NULL; + char *innodb_data_home_dir_var = NULL; + char *innodb_undo_directory_var = NULL; + char *innodb_page_size_var = NULL; + char *innodb_undo_tablespaces_var = NULL; + char *endptr; + unsigned long server_version = mysql_get_server_version(connection); + + bool ret = true; + + mysql_variable mysql_vars[] = { + {"have_backup_locks", &have_backup_locks_var}, + {"have_backup_safe_binlog_info", + &have_backup_safe_binlog_info_var}, + {"log_bin", &log_bin_var}, + {"lock_wait_timeout", &lock_wait_timeout_var}, + {"gtid_mode", >id_mode_var}, + {"version", &version_var}, + {"version_comment", &version_comment_var}, + {"innodb_version", &innodb_version_var}, + {"wsrep_on", &wsrep_on_var}, + {"slave_parallel_workers", &slave_parallel_workers_var}, + {"gtid_slave_pos", >id_slave_pos_var}, + {"innodb_buffer_pool_filename", + &innodb_buffer_pool_filename_var}, + {"datadir", &datadir_var}, + {"innodb_log_group_home_dir", &innodb_log_group_home_dir_var}, + {"innodb_log_file_size", &innodb_log_file_size_var}, + {"innodb_log_files_in_group", &innodb_log_files_in_group_var}, + {"innodb_data_file_path", &innodb_data_file_path_var}, + {"innodb_data_home_dir", &innodb_data_home_dir_var}, + {"innodb_undo_directory", &innodb_undo_directory_var}, + {"innodb_page_size", &innodb_page_size_var}, + {"innodb_undo_tablespaces", &innodb_undo_tablespaces_var}, + {NULL, NULL} + }; + + read_mysql_variables(connection, "SHOW VARIABLES", + mysql_vars, true); + + if (have_backup_locks_var != NULL && !opt_no_backup_locks) { + have_backup_locks = true; + } + + if (opt_binlog_info == BINLOG_INFO_AUTO) { + + if (have_backup_safe_binlog_info_var != NULL) + opt_binlog_info = BINLOG_INFO_LOCKLESS; + else if (log_bin_var != NULL && !strcmp(log_bin_var, "ON")) + opt_binlog_info = BINLOG_INFO_ON; + else + opt_binlog_info = BINLOG_INFO_OFF; + } + + if (have_backup_safe_binlog_info_var == NULL && + opt_binlog_info == BINLOG_INFO_LOCKLESS) { + + msg("Error: --binlog-info=LOCKLESS is not supported by the " + "server\n"); + return(false); + } + + if (lock_wait_timeout_var != NULL) { + have_lock_wait_timeout = true; + } + + if (wsrep_on_var != NULL) { + have_galera_enabled = true; + } + + /* Check server version compatibility and detect server flavor */ + + if (!(ret = check_server_version(server_version, version_var, + version_comment_var, + innodb_version_var))) { + goto out; + } + + if (server_version > 50500) { + have_flush_engine_logs = true; + } + + if (slave_parallel_workers_var != NULL + && atoi(slave_parallel_workers_var) > 0) { + have_multi_threaded_slave = true; + } + + if (innodb_buffer_pool_filename_var != NULL) { + buffer_pool_filename = strdup(innodb_buffer_pool_filename_var); + } + + if ((gtid_mode_var && strcmp(gtid_mode_var, "ON") == 0) || + (gtid_slave_pos_var && *gtid_slave_pos_var)) { + have_gtid_slave = true; + } + + msg("Using server version %s\n", version_var); + + if (!(ret = detect_mysql_capabilities_for_backup())) { + goto out; + } + + /* make sure datadir value is the same in configuration file */ + if (check_if_param_set("datadir")) { + if (!directory_exists(mysql_data_home, false)) { + msg("Warning: option 'datadir' points to " + "nonexistent directory '%s'\n", mysql_data_home); + } + if (!directory_exists(datadir_var, false)) { + msg("Warning: MySQL variable 'datadir' points to " + "nonexistent directory '%s'\n", datadir_var); + } + if (!equal_paths(mysql_data_home, datadir_var)) { + msg("Warning: option 'datadir' has different " + "values:\n" + " '%s' in defaults file\n" + " '%s' in SHOW VARIABLES\n", + mysql_data_home, datadir_var); + } + } + + /* get some default values is they are missing from my.cnf */ + if (datadir_var && *datadir_var) { + strmake(mysql_real_data_home, datadir_var, FN_REFLEN - 1); + mysql_data_home= mysql_real_data_home; + } + + if (innodb_data_file_path_var && *innodb_data_file_path_var) { + innobase_data_file_path = my_strdup( + innodb_data_file_path_var, MYF(MY_FAE)); + } + + if (innodb_data_home_dir_var && *innodb_data_home_dir_var) { + innobase_data_home_dir = my_strdup( + innodb_data_home_dir_var, MYF(MY_FAE)); + } + + if (innodb_log_group_home_dir_var + && *innodb_log_group_home_dir_var) { + srv_log_group_home_dir = my_strdup( + innodb_log_group_home_dir_var, MYF(MY_FAE)); + } + + if (innodb_undo_directory_var && *innodb_undo_directory_var) { + srv_undo_dir = my_strdup( + innodb_undo_directory_var, MYF(MY_FAE)); + } + + if (innodb_log_files_in_group_var) { + srv_n_log_files = strtol( + innodb_log_files_in_group_var, &endptr, 10); + ut_ad(*endptr == 0); + } + + if (innodb_log_file_size_var) { + srv_log_file_size = strtoll( + innodb_log_file_size_var, &endptr, 10); + ut_ad(*endptr == 0); + } + + if (innodb_page_size_var) { + innobase_page_size = strtoll( + innodb_page_size_var, &endptr, 10); + ut_ad(*endptr == 0); + } + + if (innodb_undo_tablespaces_var) { + srv_undo_tablespaces = strtoul(innodb_undo_tablespaces_var, &endptr, 10); + ut_ad(*endptr == 0); + } + +out: + free_mysql_variables(mysql_vars); + + return(ret); +} + +/*********************************************************************//** +Query the server to find out what backup capabilities it supports. +@return true on success. */ +bool +detect_mysql_capabilities_for_backup() +{ + const char *query = "SELECT 'INNODB_CHANGED_PAGES', COUNT(*) FROM " + "INFORMATION_SCHEMA.PLUGINS " + "WHERE PLUGIN_NAME LIKE 'INNODB_CHANGED_PAGES'"; + char *innodb_changed_pages = NULL; + mysql_variable vars[] = { + {"INNODB_CHANGED_PAGES", &innodb_changed_pages}, {NULL, NULL}}; + + if (xtrabackup_incremental) { + + read_mysql_variables(mysql_connection, query, vars, true); + + ut_ad(innodb_changed_pages != NULL); + + have_changed_page_bitmaps = (atoi(innodb_changed_pages) == 1); + + /* INNODB_CHANGED_PAGES are listed in + INFORMATION_SCHEMA.PLUGINS in MariaDB, but + FLUSH NO_WRITE_TO_BINLOG CHANGED_PAGE_BITMAPS + is not supported for versions below 10.1.6 + (see MDEV-7472) */ + if (server_flavor == FLAVOR_MARIADB && + mysql_server_version < 100106) { + have_changed_page_bitmaps = false; + } + + free_mysql_variables(vars); + } + + /* do some sanity checks */ + if (opt_galera_info && !have_galera_enabled) { + msg("--galera-info is specified on the command " + "line, but the server does not support Galera " + "replication. Ignoring the option.\n"); + opt_galera_info = false; + } + + if (opt_slave_info && have_multi_threaded_slave && + !have_gtid_slave) { + msg("The --slave-info option requires GTID enabled for a " + "multi-threaded slave.\n"); + return(false); + } + + return(true); +} + +static +bool +select_incremental_lsn_from_history(lsn_t *incremental_lsn) +{ + MYSQL_RES *mysql_result; + char query[1000]; + char buf[100]; + + if (opt_incremental_history_name) { + mysql_real_escape_string(mysql_connection, buf, + opt_incremental_history_name, + (unsigned long)strlen(opt_incremental_history_name)); + ut_snprintf(query, sizeof(query), + "SELECT innodb_to_lsn " + "FROM PERCONA_SCHEMA.xtrabackup_history " + "WHERE name = '%s' " + "AND innodb_to_lsn IS NOT NULL " + "ORDER BY innodb_to_lsn DESC LIMIT 1", + buf); + } + + if (opt_incremental_history_uuid) { + mysql_real_escape_string(mysql_connection, buf, + opt_incremental_history_uuid, + (unsigned long)strlen(opt_incremental_history_uuid)); + ut_snprintf(query, sizeof(query), + "SELECT innodb_to_lsn " + "FROM PERCONA_SCHEMA.xtrabackup_history " + "WHERE uuid = '%s' " + "AND innodb_to_lsn IS NOT NULL " + "ORDER BY innodb_to_lsn DESC LIMIT 1", + buf); + } + + mysql_result = xb_mysql_query(mysql_connection, query, true); + + ut_ad(mysql_num_fields(mysql_result) == 1); + const MYSQL_ROW row = mysql_fetch_row(mysql_result); + if (row) { + *incremental_lsn = strtoull(row[0], NULL, 10); + msg("Found and using lsn: " LSN_PF " for %s %s\n", + *incremental_lsn, + opt_incremental_history_uuid ? "uuid" : "name", + opt_incremental_history_uuid ? + opt_incremental_history_uuid : + opt_incremental_history_name); + } else { + msg("Error while attempting to find history record " + "for %s %s\n", + opt_incremental_history_uuid ? "uuid" : "name", + opt_incremental_history_uuid ? + opt_incremental_history_uuid : + opt_incremental_history_name); + } + + mysql_free_result(mysql_result); + + return(row != NULL); +} + +static +const char * +eat_sql_whitespace(const char *query) +{ + bool comment = false; + + while (*query) { + if (comment) { + if (query[0] == '*' && query[1] == '/') { + query += 2; + comment = false; + continue; + } + ++query; + continue; + } + if (query[0] == '/' && query[1] == '*') { + query += 2; + comment = true; + continue; + } + if (strchr("\t\n\r (", query[0])) { + ++query; + continue; + } + break; + } + + return(query); +} + +static +bool +is_query_from_list(const char *query, const char **list) +{ + const char **item; + + query = eat_sql_whitespace(query); + + item = list; + while (*item) { + if (strncasecmp(query, *item, strlen(*item)) == 0) { + return(true); + } + ++item; + } + + return(false); +} + +static +bool +is_query(const char *query) +{ + const char *query_list[] = {"insert", "update", "delete", "replace", + "alter", "load", "select", "do", "handler", "call", "execute", + "begin", NULL}; + + return is_query_from_list(query, query_list); +} + +static +bool +is_select_query(const char *query) +{ + const char *query_list[] = {"select", NULL}; + + return is_query_from_list(query, query_list); +} + +static +bool +is_update_query(const char *query) +{ + const char *query_list[] = {"insert", "update", "delete", "replace", + "alter", "load", NULL}; + + return is_query_from_list(query, query_list); +} + +static +bool +have_queries_to_wait_for(MYSQL *connection, uint threshold) +{ + MYSQL_RES *result = xb_mysql_query(connection, "SHOW FULL PROCESSLIST", + true); + const bool all_queries = (opt_lock_wait_query_type == QUERY_TYPE_ALL); + bool have_to_wait = false; + + while (MYSQL_ROW row = mysql_fetch_row(result)) { + const char *info = row[7]; + int duration = row[5] ? atoi(row[5]) : 0; + char *id = row[0]; + + if (info != NULL + && duration >= (int)threshold + && ((all_queries && is_query(info)) + || is_update_query(info))) { + msg_ts("Waiting for query %s (duration %d sec): %s", + id, duration, info); + have_to_wait = true; + break; + } + } + + mysql_free_result(result); + return(have_to_wait); +} + +static +void +kill_long_queries(MYSQL *connection, time_t timeout) +{ + char kill_stmt[100]; + + MYSQL_RES *result = xb_mysql_query(connection, "SHOW FULL PROCESSLIST", + true); + const bool all_queries = (opt_kill_long_query_type == QUERY_TYPE_ALL); + while (MYSQL_ROW row = mysql_fetch_row(result)) { + const char *info = row[7]; + long long duration = row[5]? atoll(row[5]) : 0; + char *id = row[0]; + + if (info != NULL && + (time_t)duration >= timeout && + ((all_queries && is_query(info)) || + is_select_query(info))) { + msg_ts("Killing query %s (duration %d sec): %s\n", + id, (int)duration, info); + ut_snprintf(kill_stmt, sizeof(kill_stmt), + "KILL %s", id); + xb_mysql_query(connection, kill_stmt, false, false); + } + } + + mysql_free_result(result); +} + +static +bool +wait_for_no_updates(MYSQL *connection, uint timeout, uint threshold) +{ + time_t start_time; + + start_time = time(NULL); + + msg_ts("Waiting %u seconds for queries running longer than %u seconds " + "to finish\n", timeout, threshold); + + while (time(NULL) <= (time_t)(start_time + timeout)) { + if (!have_queries_to_wait_for(connection, threshold)) { + return(true); + } + os_thread_sleep(1000000); + } + + msg_ts("Unable to obtain lock. Please try again later."); + + return(false); +} + +static +os_thread_ret_t +kill_query_thread( +/*===============*/ + void *arg __attribute__((unused))) +{ + MYSQL *mysql; + time_t start_time; + + start_time = time(NULL); + + os_event_set(kill_query_thread_started); + + msg_ts("Kill query timeout %d seconds.\n", + opt_kill_long_queries_timeout); + + while (time(NULL) - start_time < + (time_t)opt_kill_long_queries_timeout) { + if (os_event_wait_time(kill_query_thread_stop, 1000) != + OS_SYNC_TIME_EXCEEDED) { + goto stop_thread; + } + } + + if ((mysql = xb_mysql_connect()) == NULL) { + msg("Error: kill query thread failed\n"); + goto stop_thread; + } + + while (true) { + kill_long_queries(mysql, time(NULL) - start_time); + if (os_event_wait_time(kill_query_thread_stop, 1000) != + OS_SYNC_TIME_EXCEEDED) { + break; + } + } + + mysql_close(mysql); + +stop_thread: + msg_ts("Kill query thread stopped\n"); + + os_event_set(kill_query_thread_stopped); + + os_thread_exit(); + OS_THREAD_DUMMY_RETURN; +} + + +static +void +start_query_killer() +{ + kill_query_thread_stop = os_event_create(0); + kill_query_thread_started = os_event_create(0); + kill_query_thread_stopped = os_event_create(0); + + os_thread_create(kill_query_thread, NULL, &kill_query_thread_id); + + os_event_wait(kill_query_thread_started); +} + +static +void +stop_query_killer() +{ + os_event_set(kill_query_thread_stop); + os_event_wait_time(kill_query_thread_stopped, 60000); +} + +/*********************************************************************//** +Function acquires either a backup tables lock, if supported +by the server, or a global read lock (FLUSH TABLES WITH READ LOCK) +otherwise. +@returns true if lock acquired */ +bool +lock_tables(MYSQL *connection) +{ + if (have_lock_wait_timeout) { + /* Set the maximum supported session value for + lock_wait_timeout to prevent unnecessary timeouts when the + global value is changed from the default */ + xb_mysql_query(connection, + "SET SESSION lock_wait_timeout=31536000", false); + } + + if (have_backup_locks) { + msg_ts("Executing LOCK TABLES FOR BACKUP...\n"); + xb_mysql_query(connection, "LOCK TABLES FOR BACKUP", false); + return(true); + } + + if (!opt_lock_wait_timeout && !opt_kill_long_queries_timeout) { + + /* We do first a FLUSH TABLES. If a long update is running, the + FLUSH TABLES will wait but will not stall the whole mysqld, and + when the long update is done the FLUSH TABLES WITH READ LOCK + will start and succeed quickly. So, FLUSH TABLES is to lower + the probability of a stage where both mysqldump and most client + connections are stalled. Of course, if a second long update + starts between the two FLUSHes, we have that bad stall. + + Option lock_wait_timeout serve the same purpose and is not + compatible with this trick. + */ + + msg_ts("Executing FLUSH NO_WRITE_TO_BINLOG TABLES...\n"); + + xb_mysql_query(connection, + "FLUSH NO_WRITE_TO_BINLOG TABLES", false); + } + + if (opt_lock_wait_timeout) { + if (!wait_for_no_updates(connection, opt_lock_wait_timeout, + opt_lock_wait_threshold)) { + return(false); + } + } + + msg_ts("Executing FLUSH TABLES WITH READ LOCK...\n"); + + if (opt_kill_long_queries_timeout) { + start_query_killer(); + } + + if (have_galera_enabled) { + xb_mysql_query(connection, + "SET SESSION wsrep_causal_reads=0", false); + } + + xb_mysql_query(connection, "FLUSH TABLES WITH READ LOCK", false); + + if (opt_kill_long_queries_timeout) { + stop_query_killer(); + } + + return(true); +} + + +/*********************************************************************//** +If backup locks are used, execute LOCK BINLOG FOR BACKUP provided that we are +not in the --no-lock mode and the lock has not been acquired already. +@returns true if lock acquired */ +bool +lock_binlog_maybe(MYSQL *connection) +{ + if (have_backup_locks && !opt_no_lock && !binlog_locked) { + msg_ts("Executing LOCK BINLOG FOR BACKUP...\n"); + xb_mysql_query(connection, "LOCK BINLOG FOR BACKUP", false); + binlog_locked = true; + + return(true); + } + + return(false); +} + + +/*********************************************************************//** +Releases either global read lock acquired with FTWRL and the binlog +lock acquired with LOCK BINLOG FOR BACKUP, depending on +the locking strategy being used */ +void +unlock_all(MYSQL *connection) +{ + if (opt_debug_sleep_before_unlock) { + msg_ts("Debug sleep for %u seconds\n", + opt_debug_sleep_before_unlock); + os_thread_sleep(opt_debug_sleep_before_unlock * 1000); + } + + if (binlog_locked) { + msg_ts("Executing UNLOCK BINLOG\n"); + xb_mysql_query(connection, "UNLOCK BINLOG", false); + } + + msg_ts("Executing UNLOCK TABLES\n"); + xb_mysql_query(connection, "UNLOCK TABLES", false); + + msg_ts("All tables unlocked\n"); +} + + +static +int +get_open_temp_tables(MYSQL *connection) +{ + char *slave_open_temp_tables = NULL; + mysql_variable status[] = { + {"Slave_open_temp_tables", &slave_open_temp_tables}, + {NULL, NULL} + }; + int result = false; + + read_mysql_variables(connection, + "SHOW STATUS LIKE 'slave_open_temp_tables'", status, true); + + result = slave_open_temp_tables ? atoi(slave_open_temp_tables) : 0; + + free_mysql_variables(status); + + return(result); +} + +/*********************************************************************//** +Wait until it's safe to backup a slave. Returns immediately if +the host isn't a slave. Currently there's only one check: +Slave_open_temp_tables has to be zero. Dies on timeout. */ +bool +wait_for_safe_slave(MYSQL *connection) +{ + char *read_master_log_pos = NULL; + char *slave_sql_running = NULL; + int n_attempts = 1; + const int sleep_time = 3; + int open_temp_tables = 0; + bool result = true; + + mysql_variable status[] = { + {"Read_Master_Log_Pos", &read_master_log_pos}, + {"Slave_SQL_Running", &slave_sql_running}, + {NULL, NULL} + }; + + sql_thread_started = false; + + read_mysql_variables(connection, "SHOW SLAVE STATUS", status, false); + + if (!(read_master_log_pos && slave_sql_running)) { + msg("Not checking slave open temp tables for " + "--safe-slave-backup because host is not a slave\n"); + goto cleanup; + } + + if (strcmp(slave_sql_running, "Yes") == 0) { + sql_thread_started = true; + xb_mysql_query(connection, "STOP SLAVE SQL_THREAD", false); + } + + if (opt_safe_slave_backup_timeout > 0) { + n_attempts = opt_safe_slave_backup_timeout / sleep_time; + } + + open_temp_tables = get_open_temp_tables(connection); + msg_ts("Slave open temp tables: %d\n", open_temp_tables); + + while (open_temp_tables && n_attempts--) { + msg_ts("Starting slave SQL thread, waiting %d seconds, then " + "checking Slave_open_temp_tables again (%d attempts " + "remaining)...\n", sleep_time, n_attempts); + + xb_mysql_query(connection, "START SLAVE SQL_THREAD", false); + os_thread_sleep(sleep_time * 1000000); + xb_mysql_query(connection, "STOP SLAVE SQL_THREAD", false); + + open_temp_tables = get_open_temp_tables(connection); + msg_ts("Slave open temp tables: %d\n", open_temp_tables); + } + + /* Restart the slave if it was running at start */ + if (open_temp_tables == 0) { + msg_ts("Slave is safe to backup\n"); + goto cleanup; + } + + result = false; + + if (sql_thread_started) { + msg_ts("Restarting slave SQL thread.\n"); + xb_mysql_query(connection, "START SLAVE SQL_THREAD", false); + } + + msg_ts("Slave_open_temp_tables did not become zero after " + "%d seconds\n", opt_safe_slave_backup_timeout); + +cleanup: + free_mysql_variables(status); + + return(result); +} + + +/*********************************************************************//** +Retrieves MySQL binlog position of the master server in a replication +setup and saves it in a file. It also saves it in mysql_slave_position +variable. */ +bool +write_slave_info(MYSQL *connection) +{ + char *master = NULL; + char *filename = NULL; + char *gtid_executed = NULL; + char *position = NULL; + char *gtid_slave_pos = NULL; + char *ptr; + bool result = false; + + mysql_variable status[] = { + {"Master_Host", &master}, + {"Relay_Master_Log_File", &filename}, + {"Exec_Master_Log_Pos", &position}, + {"Executed_Gtid_Set", >id_executed}, + {NULL, NULL} + }; + + mysql_variable variables[] = { + {"gtid_slave_pos", >id_slave_pos}, + {NULL, NULL} + }; + + read_mysql_variables(connection, "SHOW SLAVE STATUS", status, false); + read_mysql_variables(connection, "SHOW VARIABLES", variables, true); + + if (master == NULL || filename == NULL || position == NULL) { + msg("Failed to get master binlog coordinates " + "from SHOW SLAVE STATUS\n"); + msg("This means that the server is not a " + "replication slave. Ignoring the --slave-info " + "option\n"); + /* we still want to continue the backup */ + result = true; + goto cleanup; + } + + /* Print slave status to a file. + If GTID mode is used, construct a CHANGE MASTER statement with + MASTER_AUTO_POSITION and correct a gtid_purged value. */ + if (gtid_executed != NULL && *gtid_executed) { + /* MySQL >= 5.6 with GTID enabled */ + + for (ptr = strchr(gtid_executed, '\n'); + ptr; + ptr = strchr(ptr, '\n')) { + *ptr = ' '; + } + + result = backup_file_printf(XTRABACKUP_SLAVE_INFO, + "SET GLOBAL gtid_purged='%s';\n" + "CHANGE MASTER TO MASTER_AUTO_POSITION=1\n", + gtid_executed); + + ut_a(asprintf(&mysql_slave_position, + "master host '%s', purge list '%s'", + master, gtid_executed) != -1); + } else if (gtid_slave_pos && *gtid_slave_pos) { + /* MariaDB >= 10.0 with GTID enabled */ + result = backup_file_printf(XTRABACKUP_SLAVE_INFO, + "SET GLOBAL gtid_slave_pos = '%s';\n" + "CHANGE MASTER TO master_use_gtid = slave_pos\n", + gtid_slave_pos); + ut_a(asprintf(&mysql_slave_position, + "master host '%s', gtid_slave_pos %s", + master, gtid_slave_pos) != -1); + } else { + result = backup_file_printf(XTRABACKUP_SLAVE_INFO, + "CHANGE MASTER TO MASTER_LOG_FILE='%s', " + "MASTER_LOG_POS=%s\n", filename, position); + ut_a(asprintf(&mysql_slave_position, + "master host '%s', filename '%s', position '%s'", + master, filename, position) != -1); + } + +cleanup: + free_mysql_variables(status); + free_mysql_variables(variables); + + return(result); +} + + +/*********************************************************************//** +Retrieves MySQL Galera and +saves it in a file. It also prints it to stdout. */ +bool +write_galera_info(MYSQL *connection) +{ + char *state_uuid = NULL, *state_uuid55 = NULL; + char *last_committed = NULL, *last_committed55 = NULL; + bool result; + + mysql_variable status[] = { + {"Wsrep_local_state_uuid", &state_uuid}, + {"wsrep_local_state_uuid", &state_uuid55}, + {"Wsrep_last_committed", &last_committed}, + {"wsrep_last_committed", &last_committed55}, + {NULL, NULL} + }; + + /* When backup locks are supported by the server, we should skip + creating xtrabackup_galera_info file on the backup stage, because + wsrep_local_state_uuid and wsrep_last_committed will be inconsistent + without blocking commits. The state file will be created on the prepare + stage using the WSREP recovery procedure. */ + if (have_backup_locks) { + return(true); + } + + read_mysql_variables(connection, "SHOW STATUS", status, true); + + if ((state_uuid == NULL && state_uuid55 == NULL) + || (last_committed == NULL && last_committed55 == NULL)) { + msg("Failed to get master wsrep state from SHOW STATUS.\n"); + result = false; + goto cleanup; + } + + result = backup_file_printf(XTRABACKUP_GALERA_INFO, + "%s:%s\n", state_uuid ? state_uuid : state_uuid55, + last_committed ? last_committed : last_committed55); + +cleanup: + free_mysql_variables(status); + + return(result); +} + + +/*********************************************************************//** +Flush and copy the current binary log file into the backup, +if GTID is enabled */ +bool +write_current_binlog_file(MYSQL *connection) +{ + char *executed_gtid_set = NULL; + char *gtid_binlog_state = NULL; + char *log_bin_file = NULL; + char *log_bin_dir = NULL; + bool gtid_exists; + bool result = true; + char filepath[FN_REFLEN]; + + mysql_variable status[] = { + {"Executed_Gtid_Set", &executed_gtid_set}, + {NULL, NULL} + }; + + mysql_variable status_after_flush[] = { + {"File", &log_bin_file}, + {NULL, NULL} + }; + + mysql_variable vars[] = { + {"gtid_binlog_state", >id_binlog_state}, + {"log_bin_basename", &log_bin_dir}, + {NULL, NULL} + }; + + read_mysql_variables(connection, "SHOW MASTER STATUS", status, false); + read_mysql_variables(connection, "SHOW VARIABLES", vars, true); + + gtid_exists = (executed_gtid_set && *executed_gtid_set) + || (gtid_binlog_state && *gtid_binlog_state); + + if (gtid_exists) { + size_t log_bin_dir_length; + + lock_binlog_maybe(connection); + + xb_mysql_query(connection, "FLUSH BINARY LOGS", false); + + read_mysql_variables(connection, "SHOW MASTER STATUS", + status_after_flush, false); + + if (opt_log_bin != NULL && strchr(opt_log_bin, FN_LIBCHAR)) { + /* If log_bin is set, it has priority */ + if (log_bin_dir) { + free(log_bin_dir); + } + log_bin_dir = strdup(opt_log_bin); + } else if (log_bin_dir == NULL) { + /* Default location is MySQL datadir */ + log_bin_dir = strdup("./"); + } + + dirname_part(log_bin_dir, log_bin_dir, &log_bin_dir_length); + + /* strip final slash if it is not the only path component */ + if (log_bin_dir_length > 1 && + log_bin_dir[log_bin_dir_length - 1] == FN_LIBCHAR) { + log_bin_dir[log_bin_dir_length - 1] = 0; + } + + if (log_bin_dir == NULL || log_bin_file == NULL) { + msg("Failed to get master binlog coordinates from " + "SHOW MASTER STATUS"); + result = false; + goto cleanup; + } + + ut_snprintf(filepath, sizeof(filepath), "%s%c%s", + log_bin_dir, FN_LIBCHAR, log_bin_file); + result = copy_file(ds_data, filepath, log_bin_file, 0); + } + +cleanup: + free_mysql_variables(status_after_flush); + free_mysql_variables(status); + free_mysql_variables(vars); + + return(result); +} + + +/*********************************************************************//** +Retrieves MySQL binlog position and +saves it in a file. It also prints it to stdout. */ +bool +write_binlog_info(MYSQL *connection) +{ + char *filename = NULL; + char *position = NULL; + char *gtid_mode = NULL; + char *gtid_current_pos = NULL; + char *gtid_executed = NULL; + char *gtid = NULL; + bool result; + bool mysql_gtid; + bool mariadb_gtid; + + mysql_variable status[] = { + {"File", &filename}, + {"Position", &position}, + {"Executed_Gtid_Set", >id_executed}, + {NULL, NULL} + }; + + mysql_variable vars[] = { + {"gtid_mode", >id_mode}, + {"gtid_current_pos", >id_current_pos}, + {NULL, NULL} + }; + + read_mysql_variables(connection, "SHOW MASTER STATUS", status, false); + read_mysql_variables(connection, "SHOW VARIABLES", vars, true); + + if (filename == NULL || position == NULL) { + /* Do not create xtrabackup_binlog_info if binary + log is disabled */ + result = true; + goto cleanup; + } + + mysql_gtid = ((gtid_mode != NULL) && (strcmp(gtid_mode, "ON") == 0)); + mariadb_gtid = (gtid_current_pos != NULL); + + gtid = (gtid_executed != NULL ? gtid_executed : gtid_current_pos); + + if (mariadb_gtid || mysql_gtid) { + ut_a(asprintf(&mysql_binlog_position, + "filename '%s', position '%s', " + "GTID of the last change '%s'", + filename, position, gtid) != -1); + result = backup_file_printf(XTRABACKUP_BINLOG_INFO, + "%s\t%s\t%s\n", filename, position, + gtid); + } else { + ut_a(asprintf(&mysql_binlog_position, + "filename '%s', position '%s'", + filename, position) != -1); + result = backup_file_printf(XTRABACKUP_BINLOG_INFO, + "%s\t%s\n", filename, position); + } + +cleanup: + free_mysql_variables(status); + free_mysql_variables(vars); + + return(result); +} + +struct escape_and_quote +{ + escape_and_quote(MYSQL *mysql, const char *str) + : mysql(mysql), str(str) {} + MYSQL * const mysql; + const char * const str; +}; + +static +std::ostream& +operator<<(std::ostream& s, const escape_and_quote& eq) +{ + if (!eq.str) + return s << "NULL"; + s << '\''; + size_t len = strlen(eq.str); + char* escaped = (char *)alloca(2 * len + 1); + len = mysql_real_escape_string(eq.mysql, escaped, eq.str, len); + s << std::string(escaped, len); + s << '\''; + return s; +} + +/*********************************************************************//** +Writes xtrabackup_info file and if backup_history is enable creates +PERCONA_SCHEMA.xtrabackup_history and writes a new history record to the +table containing all the history info particular to the just completed +backup. */ +bool +write_xtrabackup_info(MYSQL *connection) +{ + + char *uuid = NULL; + char *server_version = NULL; + char buf_start_time[100]; + char buf_end_time[100]; + tm tm; + std::ostringstream oss; + const char *xb_stream_name[] = {"file", "tar", "xbstream"}; + + uuid = read_mysql_one_value(connection, "SELECT UUID()"); + server_version = read_mysql_one_value(connection, "SELECT VERSION()"); + localtime_r(&history_start_time, &tm); + strftime(buf_start_time, sizeof(buf_start_time), + "%Y-%m-%d %H:%M:%S", &tm); + history_end_time = time(NULL); + localtime_r(&history_end_time, &tm); + strftime(buf_end_time, sizeof(buf_end_time), + "%Y-%m-%d %H:%M:%S", &tm); + bool is_partial = (xtrabackup_tables + || xtrabackup_tables_file + || xtrabackup_databases + || xtrabackup_databases_file + || xtrabackup_tables_exclude + || xtrabackup_databases_exclude + ); + + backup_file_printf(XTRABACKUP_INFO, + "uuid = %s\n" + "name = %s\n" + "tool_name = %s\n" + "tool_command = %s\n" + "tool_version = %s\n" + "ibbackup_version = %s\n" + "server_version = %s\n" + "start_time = %s\n" + "end_time = %s\n" + "lock_time = %d\n" + "binlog_pos = %s\n" + "innodb_from_lsn = %llu\n" + "innodb_to_lsn = %llu\n" + "partial = %s\n" + "incremental = %s\n" + "format = %s\n" + "compressed = %s\n", + uuid, /* uuid */ + opt_history ? opt_history : "", /* name */ + tool_name, /* tool_name */ + tool_args, /* tool_command */ + MYSQL_SERVER_VERSION, /* tool_version */ + MYSQL_SERVER_VERSION, /* ibbackup_version */ + server_version, /* server_version */ + buf_start_time, /* start_time */ + buf_end_time, /* end_time */ + (int)history_lock_time, /* lock_time */ + mysql_binlog_position ? + mysql_binlog_position : "", /* binlog_pos */ + incremental_lsn, /* innodb_from_lsn */ + metadata_to_lsn, /* innodb_to_lsn */ + is_partial? "Y" : "N", + xtrabackup_incremental ? "Y" : "N", /* incremental */ + xb_stream_name[xtrabackup_stream_fmt], /* format */ + xtrabackup_compress ? "compressed" : "N"); /* compressed */ + + if (!opt_history) { + goto cleanup; + } + + xb_mysql_query(connection, + "CREATE DATABASE IF NOT EXISTS PERCONA_SCHEMA", false); + xb_mysql_query(connection, + "CREATE TABLE IF NOT EXISTS PERCONA_SCHEMA.xtrabackup_history(" + "uuid VARCHAR(40) NOT NULL PRIMARY KEY," + "name VARCHAR(255) DEFAULT NULL," + "tool_name VARCHAR(255) DEFAULT NULL," + "tool_command TEXT DEFAULT NULL," + "tool_version VARCHAR(255) DEFAULT NULL," + "ibbackup_version VARCHAR(255) DEFAULT NULL," + "server_version VARCHAR(255) DEFAULT NULL," + "start_time TIMESTAMP NULL DEFAULT NULL," + "end_time TIMESTAMP NULL DEFAULT NULL," + "lock_time BIGINT UNSIGNED DEFAULT NULL," + "binlog_pos VARCHAR(128) DEFAULT NULL," + "innodb_from_lsn BIGINT UNSIGNED DEFAULT NULL," + "innodb_to_lsn BIGINT UNSIGNED DEFAULT NULL," + "partial ENUM('Y', 'N') DEFAULT NULL," + "incremental ENUM('Y', 'N') DEFAULT NULL," + "format ENUM('file', 'tar', 'xbstream') DEFAULT NULL," + "compressed ENUM('Y', 'N') DEFAULT NULL" + ") CHARACTER SET utf8 ENGINE=innodb", false); + + +#define ESCAPE_BOOL(expr) ((expr)?"'Y'":"'N'") + + oss << "insert into PERCONA_SCHEMA.xtrabackup_history(" + << "uuid, name, tool_name, tool_command, tool_version," + << "ibbackup_version, server_version, start_time, end_time," + << "lock_time, binlog_pos, innodb_from_lsn, innodb_to_lsn," + << "partial, incremental, format, compressed) " + << "values(" + << escape_and_quote(connection, uuid) << "," + << escape_and_quote(connection, opt_history) << "," + << escape_and_quote(connection, tool_name) << "," + << escape_and_quote(connection, tool_args) << "," + << escape_and_quote(connection, MYSQL_SERVER_VERSION) << "," + << escape_and_quote(connection, MYSQL_SERVER_VERSION) << "," + << escape_and_quote(connection, server_version) << "," + << "from_unixtime(" << history_start_time << ")," + << "from_unixtime(" << history_end_time << ")," + << history_lock_time << "," + << escape_and_quote(connection, mysql_binlog_position) << "," + << incremental_lsn << "," + << metadata_to_lsn << "," + << ESCAPE_BOOL(is_partial) << "," + << ESCAPE_BOOL(xtrabackup_incremental)<< "," + << escape_and_quote(connection,xb_stream_name[xtrabackup_stream_fmt]) <<"," + << ESCAPE_BOOL(xtrabackup_compress) << ")"; + + xb_mysql_query(mysql_connection, oss.str().c_str(), false); + +cleanup: + + free(uuid); + free(server_version); + + return(true); +} + +extern const char *innodb_checksum_algorithm_names[]; + +bool write_backup_config_file() +{ + int rc= backup_file_printf("backup-my.cnf", + "# This MySQL options file was generated by innobackupex.\n\n" + "# The MySQL server\n" + "[mysqld]\n" + "innodb_checksum_algorithm=%s\n" + "innodb_data_file_path=%s\n" + "innodb_log_files_in_group=%lu\n" + "innodb_log_file_size=%llu\n" + "innodb_page_size=%lu\n" + "innodb_undo_directory=%s\n" + "innodb_undo_tablespaces=%lu\n" + "%s%s\n" + "%s\n", + innodb_checksum_algorithm_names[srv_checksum_algorithm], + innobase_data_file_path, + srv_n_log_files, + srv_log_file_size, + srv_page_size, + srv_undo_dir, + srv_undo_tablespaces, + innobase_buffer_pool_filename ? + "innodb_buffer_pool_filename=" : "", + innobase_buffer_pool_filename ? + innobase_buffer_pool_filename : "", + encryption_plugin_get_config()); + return rc; +} + + +static +char *make_argv(char *buf, size_t len, int argc, char **argv) +{ + size_t left= len; + const char *arg; + + buf[0]= 0; + ++argv; --argc; + while (argc > 0 && left > 0) + { + arg = *argv; + if (strncmp(*argv, "--password", strlen("--password")) == 0) { + arg = "--password=..."; + } + left-= ut_snprintf(buf + len - left, left, + "%s%c", arg, argc > 1 ? ' ' : 0); + ++argv; --argc; + } + + return buf; +} + +void +capture_tool_command(int argc, char **argv) +{ + /* capture tool name tool args */ + tool_name = strrchr(argv[0], '/'); + tool_name = tool_name ? tool_name + 1 : argv[0]; + + make_argv(tool_args, sizeof(tool_args), argc, argv); +} + + +bool +select_history() +{ + if (opt_incremental_history_name || opt_incremental_history_uuid) { + if (!select_incremental_lsn_from_history( + &incremental_lsn)) { + return(false); + } + } + return(true); +} + +bool +flush_changed_page_bitmaps() +{ + if (xtrabackup_incremental && have_changed_page_bitmaps && + !xtrabackup_incremental_force_scan) { + xb_mysql_query(mysql_connection, + "FLUSH NO_WRITE_TO_BINLOG CHANGED_PAGE_BITMAPS", false); + } + return(true); +} + + +/*********************************************************************//** +Deallocate memory, disconnect from MySQL server, etc. +@return true on success. */ +void +backup_cleanup() +{ + free(mysql_slave_position); + free(mysql_binlog_position); + free(buffer_pool_filename); + + if (mysql_connection) { + mysql_close(mysql_connection); + } +} + + +static pthread_mutex_t mdl_lock_con_mutex; +static MYSQL *mdl_con = NULL; + +void +mdl_lock_init() +{ + pthread_mutex_init(&mdl_lock_con_mutex, NULL); + mdl_con = xb_mysql_connect(); + if (mdl_con) + { + xb_mysql_query(mdl_con, "BEGIN", false, true); + } +} + +#ifndef DBUF_OFF +/* Test that table is really locked, if lock_ddl_per_table is set. + The test is executed in DBUG_EXECUTE_IF block inside mdl_lock_table(). +*/ +static void check_mdl_lock_works(const char *table_name) +{ + MYSQL *test_con= xb_mysql_connect(); + char *query; + xb_a(asprintf(&query, + "SET STATEMENT max_statement_time=1 FOR ALTER TABLE %s" + " ADD COLUMN mdl_lock_column int", table_name)); + int err = mysql_query(test_con, query); + DBUG_ASSERT(err); + int err_no = mysql_errno(test_con); + DBUG_ASSERT(err_no == ER_STATEMENT_TIMEOUT); + mysql_close(test_con); + free(query); +} +#endif +void +mdl_lock_table(ulint space_id) +{ + std::ostringstream oss; + oss << "SELECT NAME " + "FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES " + "WHERE SPACE = " << space_id << " AND NAME LIKE '%%/%%'"; + + pthread_mutex_lock(&mdl_lock_con_mutex); + + MYSQL_RES *mysql_result = xb_mysql_query(mdl_con, oss.str().c_str(), true, true); + + while (MYSQL_ROW row = mysql_fetch_row(mysql_result)) { + std::string full_table_name = ut_get_name(0,row[0]); + std::ostringstream lock_query; + lock_query << "SELECT * FROM " << full_table_name << " LIMIT 0"; + + msg_ts("Locking MDL for %s\n", full_table_name.c_str()); + xb_mysql_query(mdl_con, lock_query.str().c_str(), false, false); + + DBUG_EXECUTE_IF("check_mdl_lock_works", + check_mdl_lock_works(full_table_name.c_str());); + } + + pthread_mutex_unlock(&mdl_lock_con_mutex); + mysql_free_result(mysql_result); +} + + +void +mdl_unlock_all() +{ + msg_ts("Unlocking MDL for all tables\n"); + xb_mysql_query(mdl_con, "COMMIT", false, true); + mysql_close(mdl_con); + pthread_mutex_destroy(&mdl_lock_con_mutex); +} + diff --git a/extra/mariabackup/backup_mysql.h b/extra/mariabackup/backup_mysql.h new file mode 100644 index 00000000000..3ccd7bdb613 --- /dev/null +++ b/extra/mariabackup/backup_mysql.h @@ -0,0 +1,92 @@ +#ifndef XTRABACKUP_BACKUP_MYSQL_H +#define XTRABACKUP_BACKUP_MYSQL_H + +#include + +/* mysql flavor and version */ +enum mysql_flavor_t { FLAVOR_UNKNOWN, FLAVOR_MYSQL, + FLAVOR_PERCONA_SERVER, FLAVOR_MARIADB }; +extern mysql_flavor_t server_flavor; +extern unsigned long mysql_server_version; + +/* server capabilities */ +extern bool have_changed_page_bitmaps; +extern bool have_backup_locks; +extern bool have_lock_wait_timeout; +extern bool have_galera_enabled; +extern bool have_flush_engine_logs; +extern bool have_multi_threaded_slave; +extern bool have_gtid_slave; + + +/* History on server */ +extern time_t history_start_time; +extern time_t history_end_time; +extern time_t history_lock_time; + + +extern bool sql_thread_started; +extern char *mysql_slave_position; +extern char *mysql_binlog_position; +extern char *buffer_pool_filename; + +/** connection to mysql server */ +extern MYSQL *mysql_connection; + +void +capture_tool_command(int argc, char **argv); + +bool +select_history(); + +bool +flush_changed_page_bitmaps(); + +void +backup_cleanup(); + +bool +get_mysql_vars(MYSQL *connection); + +bool +detect_mysql_capabilities_for_backup(); + +MYSQL * +xb_mysql_connect(); + +MYSQL_RES * +xb_mysql_query(MYSQL *connection, const char *query, bool use_result, + bool die_on_error = true); + +void +unlock_all(MYSQL *connection); + +bool +write_current_binlog_file(MYSQL *connection); + +bool +write_binlog_info(MYSQL *connection); + +bool +write_xtrabackup_info(MYSQL *connection); + +bool +write_backup_config_file(); + +bool +lock_binlog_maybe(MYSQL *connection); + +bool +lock_tables(MYSQL *connection); + +bool +wait_for_safe_slave(MYSQL *connection); + +bool +write_galera_info(MYSQL *connection); + +bool +write_slave_info(MYSQL *connection); + + +#endif diff --git a/extra/mariabackup/backup_wsrep.h b/extra/mariabackup/backup_wsrep.h new file mode 100644 index 00000000000..6537b304e12 --- /dev/null +++ b/extra/mariabackup/backup_wsrep.h @@ -0,0 +1,32 @@ +/****************************************************** +Percona XtraBackup: hot backup tool for InnoDB +(c) 2009-2014 Percona LLC and/or its affiliates +Originally Created 3/3/2009 Yasufumi Kinoshita +Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko, +Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +*******************************************************/ + +#ifndef BACKUP_WSREP_H +#define BACKUP_WSREP_H + +/*********************************************************************** +Store Galera checkpoint info in the 'xtrabackup_galera_info' file, if that +information is present in the trx system header. Otherwise, do nothing. */ +void +xb_write_galera_info(bool incremental_prepare); +/*==================*/ + +#endif diff --git a/extra/mariabackup/changed_page_bitmap.cc b/extra/mariabackup/changed_page_bitmap.cc new file mode 100644 index 00000000000..ce769375a16 --- /dev/null +++ b/extra/mariabackup/changed_page_bitmap.cc @@ -0,0 +1,1045 @@ +/****************************************************** +XtraBackup: hot backup tool for InnoDB +(c) 2009-2012 Percona Inc. +Originally Created 3/3/2009 Yasufumi Kinoshita +Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko, +Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +/* Changed page bitmap implementation */ + +#include "changed_page_bitmap.h" + +#include "common.h" +#include "xtrabackup.h" + +/* TODO: copy-pasted shared definitions from the XtraDB bitmap write code. +Remove these on the first opportunity, i.e. single-binary XtraBackup. */ + +/* log0online.h */ + +/** Single bitmap file information */ +struct log_online_bitmap_file_t { + char name[FN_REFLEN]; /*!< Name with full path */ + pfs_os_file_t file; /*!< Handle to opened file */ + ib_uint64_t size; /*!< Size of the file */ + ib_uint64_t offset; /*!< Offset of the next read, + or count of already-read bytes + */ +}; + +/** A set of bitmap files containing some LSN range */ +struct log_online_bitmap_file_range_t { + size_t count; /*!< Number of files */ + /*!< Dynamically-allocated array of info about individual files */ + struct files_t { + char name[FN_REFLEN];/*!< Name of a file */ + lsn_t start_lsn; /*!< Starting LSN of data in this + file */ + ulong seq_num; /*!< Sequence number of this file */ + } *files; +}; + +/* log0online.c */ + +/** File name stem for bitmap files. */ +static const char* bmp_file_name_stem = "ib_modified_log_"; + +/** The bitmap file block size in bytes. All writes will be multiples of this. + */ +enum { + MODIFIED_PAGE_BLOCK_SIZE = 4096 +}; + +/** Offsets in a file bitmap block */ +enum { + MODIFIED_PAGE_IS_LAST_BLOCK = 0,/* 1 if last block in the current + write, 0 otherwise. */ + MODIFIED_PAGE_START_LSN = 4, /* The starting tracked LSN of this and + other blocks in the same write */ + MODIFIED_PAGE_END_LSN = 12, /* The ending tracked LSN of this and + other blocks in the same write */ + MODIFIED_PAGE_SPACE_ID = 20, /* The space ID of tracked pages in + this block */ + MODIFIED_PAGE_1ST_PAGE_ID = 24, /* The page ID of the first tracked + page in this block */ + MODIFIED_PAGE_BLOCK_UNUSED_1 = 28,/* Unused in order to align the start + of bitmap at 8 byte boundary */ + MODIFIED_PAGE_BLOCK_BITMAP = 32,/* Start of the bitmap itself */ + MODIFIED_PAGE_BLOCK_UNUSED_2 = MODIFIED_PAGE_BLOCK_SIZE - 8, + /* Unused in order to align the end of + bitmap at 8 byte boundary */ + MODIFIED_PAGE_BLOCK_CHECKSUM = MODIFIED_PAGE_BLOCK_SIZE - 4 + /* The checksum of the current block */ +}; + +/** Length of the bitmap data in a block */ +enum { MODIFIED_PAGE_BLOCK_BITMAP_LEN + = MODIFIED_PAGE_BLOCK_UNUSED_2 - MODIFIED_PAGE_BLOCK_BITMAP }; + +/** Length of the bitmap data in a block in page ids */ +enum { MODIFIED_PAGE_BLOCK_ID_COUNT = MODIFIED_PAGE_BLOCK_BITMAP_LEN * 8 }; + +typedef ib_uint64_t bitmap_word_t; + +/****************************************************************//** +Calculate a bitmap block checksum. Algorithm borrowed from +log_block_calc_checksum. +@return checksum */ +UNIV_INLINE +ulint +log_online_calc_checksum( +/*=====================*/ + const byte* block); /*! p2 +*/ +static +int +log_online_compare_bmp_keys( +/*========================*/ + const void* p1, /*! k2_start_page ? 1 : 0; + } + return k1_space < k2_space ? -1 : 1; +} + +/****************************************************************//** +Calculate a bitmap block checksum. Algorithm borrowed from +log_block_calc_checksum. +@return checksum */ +UNIV_INLINE +ulint +log_online_calc_checksum( +/*=====================*/ + const byte* block) /*! 24) { + + sh = 0; + } + } + + return sum; +} + +/****************************************************************//** +Read one bitmap data page and check it for corruption. + +@return TRUE if page read OK, FALSE if I/O error */ +static +ibool +log_online_read_bitmap_page( +/*========================*/ + log_online_bitmap_file_t *bitmap_file, /*!size >= MODIFIED_PAGE_BLOCK_SIZE); + ut_a(bitmap_file->offset + <= bitmap_file->size - MODIFIED_PAGE_BLOCK_SIZE); + ut_a(bitmap_file->offset % MODIFIED_PAGE_BLOCK_SIZE == 0); + success = os_file_read(IORequestRead, + bitmap_file->file, page, bitmap_file->offset, + MODIFIED_PAGE_BLOCK_SIZE); + + if (UNIV_UNLIKELY(!success)) { + + /* The following call prints an error message */ + os_file_get_last_error(TRUE); + msg("InnoDB: Warning: failed reading changed page bitmap " + "file \'%s\'\n", bitmap_file->name); + return FALSE; + } + + bitmap_file->offset += MODIFIED_PAGE_BLOCK_SIZE; + ut_ad(bitmap_file->offset <= bitmap_file->size); + + checksum = mach_read_from_4(page + MODIFIED_PAGE_BLOCK_CHECKSUM); + actual_checksum = log_online_calc_checksum(page); + *checksum_ok = (checksum == actual_checksum); + + return TRUE; +} + +/*********************************************************************//** +Check the name of a given file if it's a changed page bitmap file and +return file sequence and start LSN name components if it is. If is not, +the values of output parameters are undefined. + +@return TRUE if a given file is a changed page bitmap file. */ +static +ibool +log_online_is_bitmap_file( +/*======================*/ + const os_file_stat_t* file_info, /*!name) < OS_FILE_MAX_PATH); + + return ((file_info->type == OS_FILE_TYPE_FILE + || file_info->type == OS_FILE_TYPE_LINK) + && (sscanf(file_info->name, "%[a-z_]%lu_" LSN_PF ".xdb", stem, + bitmap_file_seq_num, bitmap_file_start_lsn) == 3) + && (!strcmp(stem, bmp_file_name_stem))); +} + +/*********************************************************************//** +List the bitmap files in srv_data_home and setup their range that contains the +specified LSN interval. This range, if non-empty, will start with a file that +has the greatest LSN equal to or less than the start LSN and will include all +the files up to the one with the greatest LSN less than the end LSN. Caller +must free bitmap_files->files when done if bitmap_files set to non-NULL and +this function returned TRUE. Field bitmap_files->count might be set to a +larger value than the actual count of the files, and space for the unused array +slots will be allocated but cleared to zeroes. + +@return TRUE if succeeded +*/ +static +ibool +log_online_setup_bitmap_file_range( +/*===============================*/ + log_online_bitmap_file_range_t *bitmap_files, /*!= range_start); + + bitmap_files->count = 0; + bitmap_files->files = NULL; + + /* 1st pass: size the info array */ + + bitmap_dir = os_file_opendir(srv_data_home, FALSE); + if (UNIV_UNLIKELY(!bitmap_dir)) { + + msg("InnoDB: Error: failed to open bitmap directory \'%s\'\n", + srv_data_home); + return FALSE; + } + + while (!os_file_readdir_next_file(srv_data_home, bitmap_dir, + &bitmap_dir_file_info)) { + + ulong file_seq_num; + lsn_t file_start_lsn; + + if (!log_online_is_bitmap_file(&bitmap_dir_file_info, + &file_seq_num, + &file_start_lsn) + || file_start_lsn >= range_end) { + + continue; + } + + if (file_seq_num > last_file_seq_num) { + + last_file_seq_num = file_seq_num; + } + + if (file_start_lsn >= range_start + || file_start_lsn == first_file_start_lsn + || first_file_start_lsn > range_start) { + + /* A file that falls into the range */ + + if (file_start_lsn < first_file_start_lsn) { + + first_file_start_lsn = file_start_lsn; + } + if (file_seq_num < first_file_seq_num) { + + first_file_seq_num = file_seq_num; + } + } else if (file_start_lsn > first_file_start_lsn) { + + /* A file that has LSN closer to the range start + but smaller than it, replacing another such file */ + first_file_start_lsn = file_start_lsn; + first_file_seq_num = file_seq_num; + } + } + + if (UNIV_UNLIKELY(os_file_closedir(bitmap_dir))) { + + os_file_get_last_error(TRUE); + msg("InnoDB: Error: cannot close \'%s\'\n",srv_data_home); + return FALSE; + } + + if (first_file_seq_num == ULONG_MAX && last_file_seq_num == 0) { + + bitmap_files->count = 0; + return TRUE; + } + + bitmap_files->count = last_file_seq_num - first_file_seq_num + 1; + + /* 2nd pass: get the file names in the file_seq_num order */ + + bitmap_dir = os_file_opendir(srv_data_home, FALSE); + if (UNIV_UNLIKELY(!bitmap_dir)) { + + msg("InnoDB: Error: failed to open bitmap directory \'%s\'\n", + srv_data_home); + return FALSE; + } + + bitmap_files->files = + static_cast + (malloc(bitmap_files->count * sizeof(bitmap_files->files[0]))); + memset(bitmap_files->files, 0, + bitmap_files->count * sizeof(bitmap_files->files[0])); + + while (!os_file_readdir_next_file(srv_data_home, bitmap_dir, + &bitmap_dir_file_info)) { + + ulong file_seq_num; + lsn_t file_start_lsn; + size_t array_pos; + + if (!log_online_is_bitmap_file(&bitmap_dir_file_info, + &file_seq_num, + &file_start_lsn) + || file_start_lsn >= range_end + || file_start_lsn < first_file_start_lsn) { + + continue; + } + + array_pos = file_seq_num - first_file_seq_num; + if (UNIV_UNLIKELY(array_pos >= bitmap_files->count)) { + + msg("InnoDB: Error: inconsistent bitmap file " + "directory\n"); + free(bitmap_files->files); + return FALSE; + } + + if (file_seq_num > bitmap_files->files[array_pos].seq_num) { + + bitmap_files->files[array_pos].seq_num = file_seq_num; + strncpy(bitmap_files->files[array_pos].name, + bitmap_dir_file_info.name, FN_REFLEN); + bitmap_files->files[array_pos].name[FN_REFLEN - 1] + = '\0'; + bitmap_files->files[array_pos].start_lsn + = file_start_lsn; + } + } + + if (UNIV_UNLIKELY(os_file_closedir(bitmap_dir))) { + + os_file_get_last_error(TRUE); + msg("InnoDB: Error: cannot close \'%s\'\n", srv_data_home); + free(bitmap_files->files); + return FALSE; + } + +#ifdef UNIV_DEBUG + ut_ad(bitmap_files->files[0].seq_num == first_file_seq_num); + + for (size_t i = 1; i < bitmap_files->count; i++) { + if (!bitmap_files->files[i].seq_num) { + + break; + } + ut_ad(bitmap_files->files[i].seq_num + > bitmap_files->files[i - 1].seq_num); + ut_ad(bitmap_files->files[i].start_lsn + >= bitmap_files->files[i - 1].start_lsn); + } +#endif + + return TRUE; +} + +/****************************************************************//** +Open a bitmap file for reading. + +@return whether opened successfully */ +static +bool +log_online_open_bitmap_file_read_only( +/*==================================*/ + const char* name, /*!name, FN_REFLEN, "%s%s", srv_data_home, name); + bitmap_file->file = os_file_create_simple_no_error_handling( + 0, bitmap_file->name, + OS_FILE_OPEN, OS_FILE_READ_ONLY, true, &success); + if (UNIV_UNLIKELY(!success)) { + + /* Here and below assume that bitmap file names do not + contain apostrophes, thus no need for ut_print_filename(). */ + msg("InnoDB: Warning: error opening the changed page " + "bitmap \'%s\'\n", bitmap_file->name); + return success; + } + + bitmap_file->size = os_file_get_size(bitmap_file->file); + bitmap_file->offset = 0; + +#ifdef UNIV_LINUX + posix_fadvise(bitmap_file->file, 0, 0, POSIX_FADV_SEQUENTIAL); + posix_fadvise(bitmap_file->file, 0, 0, POSIX_FADV_NOREUSE); +#endif + + return success; +} + +/****************************************************************//** +Diagnose one or both of the following situations if we read close to +the end of bitmap file: +1) Warn if the remainder of the file is less than one page. +2) Error if we cannot read any more full pages but the last read page +did not have the last-in-run flag set. + +@return FALSE for the error */ +static +ibool +log_online_diagnose_bitmap_eof( +/*===========================*/ + const log_online_bitmap_file_t* bitmap_file, /*!< in: bitmap file */ + ibool last_page_in_run)/*!< in: "last page in + run" flag value in the + last read page */ +{ + /* Check if we are too close to EOF to read a full page */ + if ((bitmap_file->size < MODIFIED_PAGE_BLOCK_SIZE) + || (bitmap_file->offset + > bitmap_file->size - MODIFIED_PAGE_BLOCK_SIZE)) { + + if (UNIV_UNLIKELY(bitmap_file->offset != bitmap_file->size)) { + + /* If we are not at EOF and we have less than one page + to read, it's junk. This error is not fatal in + itself. */ + + msg("InnoDB: Warning: junk at the end of changed " + "page bitmap file \'%s\'.\n", bitmap_file->name); + } + + if (UNIV_UNLIKELY(!last_page_in_run)) { + + /* We are at EOF but the last read page did not finish + a run */ + /* It's a "Warning" here because it's not a fatal error + for the whole server */ + msg("InnoDB: Warning: changed page bitmap " + "file \'%s\' does not contain a complete run " + "at the end.\n", bitmap_file->name); + return FALSE; + } + } + return TRUE; +} + +/* End of copy-pasted definitions */ + +/** Iterator structure over changed page bitmap */ +struct xb_page_bitmap_range_struct { + const xb_page_bitmap *bitmap; /* Bitmap with data */ + ulint space_id; /* Space id for this + iterator */ + ulint bit_i; /* Bit index of the iterator + position in the current page */ + const ib_rbt_node_t *bitmap_node; /* Current bitmap tree node */ + const byte *bitmap_page; /* Current bitmap page */ + ulint current_page_id;/* Current page id */ +}; + +/****************************************************************//** +Print a diagnostic message on missing bitmap data for an LSN range. */ +static +void +xb_msg_missing_lsn_data( +/*====================*/ + lsn_t missing_interval_start, /*!size >= MODIFIED_PAGE_BLOCK_SIZE); + + *page_end_lsn = 0; + + while ((*page_end_lsn <= lsn) + && (bitmap_file->offset + <= bitmap_file->size - MODIFIED_PAGE_BLOCK_SIZE)) { + + next_to_last_page_ok = last_page_ok; + if (!log_online_read_bitmap_page(bitmap_file, page, + &last_page_ok)) { + + return FALSE; + } + + *page_end_lsn = mach_read_from_8(page + MODIFIED_PAGE_END_LSN); + } + + /* We check two pages here because the last read page already contains + the required LSN data. If the next to the last one page is corrupted, + then we have no way of telling if that page contained the required LSN + range data too */ + return last_page_ok && next_to_last_page_ok; +} + +/****************************************************************//** +Read the disk bitmap and build the changed page bitmap tree for the +LSN interval incremental_lsn to checkpoint_lsn_start. + +@return the built bitmap tree or NULL if unable to read the full interval for +any reason. */ +xb_page_bitmap* +xb_page_bitmap_init(void) +/*=====================*/ +{ + log_online_bitmap_file_t bitmap_file; + lsn_t bmp_start_lsn = incremental_lsn; + lsn_t bmp_end_lsn = checkpoint_lsn_start; + byte page[MODIFIED_PAGE_BLOCK_SIZE]; + lsn_t current_page_end_lsn; + xb_page_bitmap *result; + ibool last_page_in_run= FALSE; + log_online_bitmap_file_range_t bitmap_files; + size_t bmp_i; + ibool last_page_ok = TRUE; + + if (UNIV_UNLIKELY(bmp_start_lsn > bmp_end_lsn)) { + + msg("xtrabackup: incremental backup LSN " LSN_PF + " is larger than than the last checkpoint LSN " LSN_PF + "\n", bmp_start_lsn, bmp_end_lsn); + return NULL; + } + + if (!log_online_setup_bitmap_file_range(&bitmap_files, bmp_start_lsn, + bmp_end_lsn)) { + + return NULL; + } + + /* Only accept no bitmap files returned if start LSN == end LSN */ + if (bitmap_files.count == 0 && bmp_end_lsn != bmp_start_lsn) { + + return NULL; + } + + result = rbt_create(MODIFIED_PAGE_BLOCK_SIZE, + log_online_compare_bmp_keys); + + if (bmp_start_lsn == bmp_end_lsn) { + + /* Empty range - empty bitmap */ + return result; + } + + bmp_i = 0; + + if (UNIV_UNLIKELY(bitmap_files.files[bmp_i].start_lsn + > bmp_start_lsn)) { + + /* The 1st file does not have the starting LSN data */ + xb_msg_missing_lsn_data(bmp_start_lsn, + bitmap_files.files[bmp_i].start_lsn); + rbt_free(result); + free(bitmap_files.files); + return NULL; + } + + /* Skip any zero-sized files at the start */ + while ((bmp_i < bitmap_files.count - 1) + && (bitmap_files.files[bmp_i].start_lsn + == bitmap_files.files[bmp_i + 1].start_lsn)) { + + bmp_i++; + } + + /* Is the 1st bitmap file missing? */ + if (UNIV_UNLIKELY(bitmap_files.files[bmp_i].name[0] == '\0')) { + + /* TODO: this is not the exact missing range */ + xb_msg_missing_lsn_data(bmp_start_lsn, bmp_end_lsn); + rbt_free(result); + free(bitmap_files.files); + return NULL; + } + + /* Open the 1st bitmap file */ + if (UNIV_UNLIKELY(!log_online_open_bitmap_file_read_only( + bitmap_files.files[bmp_i].name, + &bitmap_file))) { + + rbt_free(result); + free(bitmap_files.files); + return NULL; + } + + /* If the 1st file is truncated, no data. Not merged with the case + below because zero-length file indicates not a corruption but missing + subsequent files instead. */ + if (UNIV_UNLIKELY(bitmap_file.size < MODIFIED_PAGE_BLOCK_SIZE)) { + + xb_msg_missing_lsn_data(bmp_start_lsn, bmp_end_lsn); + rbt_free(result); + free(bitmap_files.files); + os_file_close(bitmap_file.file); + return NULL; + } + + /* Find the start of the required LSN range in the file */ + if (UNIV_UNLIKELY(!xb_find_lsn_in_bitmap_file(&bitmap_file, page, + ¤t_page_end_lsn, + bmp_start_lsn))) { + + msg("xtrabackup: Warning: changed page bitmap file " + "\'%s\' corrupted\n", bitmap_file.name); + rbt_free(result); + free(bitmap_files.files); + os_file_close(bitmap_file.file); + return NULL; + } + + last_page_in_run + = mach_read_from_4(page + MODIFIED_PAGE_IS_LAST_BLOCK); + + if (UNIV_UNLIKELY(!log_online_diagnose_bitmap_eof(&bitmap_file, + last_page_in_run))) { + + rbt_free(result); + free(bitmap_files.files); + os_file_close(bitmap_file.file); + return NULL; + } + + if (UNIV_UNLIKELY(current_page_end_lsn < bmp_start_lsn)) { + + xb_msg_missing_lsn_data(current_page_end_lsn, bmp_start_lsn); + rbt_free(result); + free(bitmap_files.files); + os_file_close(bitmap_file.file); + return NULL; + } + + /* 1st bitmap page found, add it to the tree. */ + rbt_insert(result, page, page); + + /* Read next pages/files until all required data is read */ + while (last_page_ok + && (current_page_end_lsn < bmp_end_lsn + || (current_page_end_lsn == bmp_end_lsn + && !last_page_in_run))) { + + ib_rbt_bound_t tree_search_pos; + + /* If EOF, advance the file skipping over any empty files */ + while (bitmap_file.size < MODIFIED_PAGE_BLOCK_SIZE + || (bitmap_file.offset + > bitmap_file.size - MODIFIED_PAGE_BLOCK_SIZE)) { + + os_file_close(bitmap_file.file); + + if (UNIV_UNLIKELY( + !log_online_diagnose_bitmap_eof( + &bitmap_file, last_page_in_run))) { + + rbt_free(result); + free(bitmap_files.files); + return NULL; + } + + bmp_i++; + + if (UNIV_UNLIKELY(bmp_i == bitmap_files.count + || (bitmap_files.files[bmp_i].seq_num + == 0))) { + + xb_msg_missing_lsn_data(current_page_end_lsn, + bmp_end_lsn); + rbt_free(result); + free(bitmap_files.files); + return NULL; + } + + /* Is the next file missing? */ + if (UNIV_UNLIKELY(bitmap_files.files[bmp_i].name[0] + == '\0')) { + + /* TODO: this is not the exact missing range */ + xb_msg_missing_lsn_data(bitmap_files.files + [bmp_i - 1].start_lsn, + bmp_end_lsn); + rbt_free(result); + free(bitmap_files.files); + return NULL; + } + + if (UNIV_UNLIKELY( + !log_online_open_bitmap_file_read_only( + bitmap_files.files[bmp_i].name, + &bitmap_file))) { + + rbt_free(result); + free(bitmap_files.files); + return NULL; + } + } + + if (UNIV_UNLIKELY( + !log_online_read_bitmap_page(&bitmap_file, page, + &last_page_ok))) { + + rbt_free(result); + free(bitmap_files.files); + os_file_close(bitmap_file.file); + return NULL; + } + + if (UNIV_UNLIKELY(!last_page_ok)) { + + msg("xtrabackup: warning: changed page bitmap file " + "\'%s\' corrupted.\n", bitmap_file.name); + rbt_free(result); + free(bitmap_files.files); + os_file_close(bitmap_file.file); + return NULL; + } + + /* Merge the current page with an existing page or insert a new + page into the tree */ + + if (!rbt_search(result, &tree_search_pos, page)) { + + /* Merge the bitmap pages */ + byte *existing_page + = rbt_value(byte, tree_search_pos.last); + bitmap_word_t *bmp_word_1 = (bitmap_word_t *) + (existing_page + MODIFIED_PAGE_BLOCK_BITMAP); + bitmap_word_t *bmp_end = (bitmap_word_t *) + (existing_page + MODIFIED_PAGE_BLOCK_UNUSED_2); + bitmap_word_t *bmp_word_2 = (bitmap_word_t *) + (page + MODIFIED_PAGE_BLOCK_BITMAP); + while (bmp_word_1 < bmp_end) { + + *bmp_word_1++ |= *bmp_word_2++; + } + xb_a (bmp_word_1 == bmp_end); + } else { + + /* Add a new page */ + rbt_add_node(result, &tree_search_pos, page); + } + + current_page_end_lsn + = mach_read_from_8(page + MODIFIED_PAGE_END_LSN); + last_page_in_run + = mach_read_from_4(page + MODIFIED_PAGE_IS_LAST_BLOCK); + } + + xb_a (current_page_end_lsn >= bmp_end_lsn); + + free(bitmap_files.files); + os_file_close(bitmap_file.file); + + return result; +} + +/****************************************************************//** +Free the bitmap tree. */ +void +xb_page_bitmap_deinit( +/*==================*/ + xb_page_bitmap* bitmap) /*!bitmap_page has been +already found/bumped by rbt_search()/rbt_next(). + +@return FALSE if no more bitmap data for the range space ID */ +static +ibool +xb_page_bitmap_setup_next_page( +/*===========================*/ + xb_page_bitmap_range* bitmap_range) /*!bitmap_node == NULL) { + + bitmap_range->current_page_id = ULINT_UNDEFINED; + return FALSE; + } + + bitmap_range->bitmap_page = rbt_value(byte, bitmap_range->bitmap_node); + + new_space_id = mach_read_from_4(bitmap_range->bitmap_page + + MODIFIED_PAGE_SPACE_ID); + if (new_space_id != bitmap_range->space_id) { + + /* No more data for the current page id. */ + xb_a(new_space_id > bitmap_range->space_id); + bitmap_range->current_page_id = ULINT_UNDEFINED; + return FALSE; + } + + new_1st_page_id = mach_read_from_4(bitmap_range->bitmap_page + + MODIFIED_PAGE_1ST_PAGE_ID); + xb_a (new_1st_page_id >= bitmap_range->current_page_id + || bitmap_range->current_page_id == ULINT_UNDEFINED); + + bitmap_range->current_page_id = new_1st_page_id; + bitmap_range->bit_i = 0; + + return TRUE; +} + +/** Find the node with the smallest key that greater than equal to search key. +@param[in] tree red-black tree +@param[in] key search key +@return node with the smallest greater-than-or-equal key +@retval NULL if none was found */ +static +const ib_rbt_node_t* +rbt_lower_bound(const ib_rbt_t* tree, const void* key) +{ + ut_ad(!tree->cmp_arg); + const ib_rbt_node_t* ge = NULL; + + for (const ib_rbt_node_t *node = tree->root->left; + node != tree->nil; ) { + int result = tree->compare(node->value, key); + + if (result < 0) { + node = node->right; + } else { + ge = node; + if (result == 0) { + break; + } + + node = node->left; + } + } + + return(ge); +} + +/****************************************************************//** +Set up a new bitmap range iterator over a given space id changed +pages in a given bitmap. + +@return bitmap range iterator */ +xb_page_bitmap_range* +xb_page_bitmap_range_init( +/*======================*/ + xb_page_bitmap* bitmap, /*!< in: bitmap to iterate over */ + ulint space_id) /*!< in: space id */ +{ + byte search_page[MODIFIED_PAGE_BLOCK_SIZE]; + xb_page_bitmap_range *result + = static_cast(malloc(sizeof(*result))); + + memset(result, 0, sizeof(*result)); + result->bitmap = bitmap; + result->space_id = space_id; + result->current_page_id = ULINT_UNDEFINED; + + /* Search for the 1st page for the given space id */ + /* This also sets MODIFIED_PAGE_1ST_PAGE_ID to 0, which is what we + want. */ + memset(search_page, 0, MODIFIED_PAGE_BLOCK_SIZE); + mach_write_to_4(search_page + MODIFIED_PAGE_SPACE_ID, space_id); + + result->bitmap_node = rbt_lower_bound(result->bitmap, search_page); + + xb_page_bitmap_setup_next_page(result); + + return result; +} + +/****************************************************************//** +Get the value of the bitmap->range->bit_i bitmap bit + +@return the current bit value */ +static inline +ibool +is_bit_set( +/*=======*/ + const xb_page_bitmap_range* bitmap_range) /*!< in: bitmap + range */ +{ + return ((*(((bitmap_word_t *)(bitmap_range->bitmap_page + + MODIFIED_PAGE_BLOCK_BITMAP)) + + (bitmap_range->bit_i >> 6))) + & (1ULL << (bitmap_range->bit_i & 0x3F))) ? TRUE : FALSE; +} + +/****************************************************************//** +Get the next page id that has its bit set or cleared, i.e. equal to +bit_value. + +@return page id */ +ulint +xb_page_bitmap_range_get_next_bit( +/*==============================*/ + xb_page_bitmap_range* bitmap_range, /*!< in/out: bitmap range */ + ibool bit_value) /*!< in: bit value */ +{ + if (UNIV_UNLIKELY(bitmap_range->current_page_id + == ULINT_UNDEFINED)) { + + return ULINT_UNDEFINED; + } + + do { + while (bitmap_range->bit_i < MODIFIED_PAGE_BLOCK_ID_COUNT) { + + while (is_bit_set(bitmap_range) != bit_value + && (bitmap_range->bit_i + < MODIFIED_PAGE_BLOCK_ID_COUNT)) { + + bitmap_range->current_page_id++; + bitmap_range->bit_i++; + } + + if (bitmap_range->bit_i + < MODIFIED_PAGE_BLOCK_ID_COUNT) { + + ulint result = bitmap_range->current_page_id; + bitmap_range->current_page_id++; + bitmap_range->bit_i++; + return result; + } + } + + bitmap_range->bitmap_node + = rbt_next(bitmap_range->bitmap, + bitmap_range->bitmap_node); + + } while (xb_page_bitmap_setup_next_page(bitmap_range)); + + return ULINT_UNDEFINED; +} + +/****************************************************************//** +Free the bitmap range iterator. */ +void +xb_page_bitmap_range_deinit( +/*========================*/ + xb_page_bitmap_range* bitmap_range) /*! in/out: bitmap range */ +{ + free(bitmap_range); +} diff --git a/extra/mariabackup/changed_page_bitmap.h b/extra/mariabackup/changed_page_bitmap.h new file mode 100644 index 00000000000..6f549f47400 --- /dev/null +++ b/extra/mariabackup/changed_page_bitmap.h @@ -0,0 +1,85 @@ +/****************************************************** +XtraBackup: hot backup tool for InnoDB +(c) 2009-2012 Percona Inc. +Originally Created 3/3/2009 Yasufumi Kinoshita +Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko, +Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +/* Changed page bitmap interface */ + +#ifndef XB_CHANGED_PAGE_BITMAP_H +#define XB_CHANGED_PAGE_BITMAP_H + +#include +#include + +/* The changed page bitmap structure */ +typedef ib_rbt_t xb_page_bitmap; + +struct xb_page_bitmap_range_struct; + +/* The bitmap range iterator over one space id */ +typedef struct xb_page_bitmap_range_struct xb_page_bitmap_range; + +/****************************************************************//** +Read the disk bitmap and build the changed page bitmap tree for the +LSN interval incremental_lsn to checkpoint_lsn_start. + +@return the built bitmap tree */ +xb_page_bitmap* +xb_page_bitmap_init(void); +/*=====================*/ + +/****************************************************************//** +Free the bitmap tree. */ +void +xb_page_bitmap_deinit( +/*==================*/ + xb_page_bitmap* bitmap); /*! +#include +#include +#include + + +# define fil_is_user_tablespace_id(i) ((i) > srv_undo_tablespaces_open) + +#ifdef _MSC_VER +#define stat _stati64 +#define PATH_MAX MAX_PATH +#endif + +#ifndef HAVE_VASPRINTF +static inline int vasprintf(char **strp, const char *fmt, va_list args) +{ + int len; +#ifdef _MSC_VER + len = _vscprintf(fmt, args); +#else + len = vsnprintf(NULL, 0, fmt, args); +#endif + if (len < 0) + { + return -1; + } + *strp = (char *)malloc(len + 1); + if (!*strp) + { + return -1; + } + vsprintf(*strp, fmt, args); + return len; +} + +static inline int asprintf(char **strp, const char *fmt,...) +{ + va_list args; + va_start(args, fmt); + int len = vasprintf(strp, fmt, args); + va_end(args); + return len; +} +#endif + +#define xb_a(expr) \ + do { \ + if (!(expr)) { \ + msg("Assertion \"%s\" failed at %s:%lu\n", \ + #expr, __FILE__, (ulong) __LINE__); \ + abort(); \ + } \ + } while (0); + +#ifdef XB_DEBUG +#define xb_ad(expr) xb_a(expr) +#else +#define xb_ad(expr) +#endif + +#define XB_DELTA_INFO_SUFFIX ".meta" + +static inline int msg(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2); +static inline int msg(const char *fmt, ...) +{ + int result; + va_list args; + + va_start(args, fmt); + result = vfprintf(stderr, fmt, args); + va_end(args); + + return result; +} + +static inline int msg_ts(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2); +static inline int msg_ts(const char *fmt, ...) +{ + int result; + time_t t = time(NULL); + char date[100]; + char *line; + va_list args; + + strftime(date, sizeof(date), "%y%m%d %H:%M:%S", localtime(&t)); + + va_start(args, fmt); + result = vasprintf(&line, fmt, args); + va_end(args); + + if (result != -1) { + result = fprintf(stderr, "%s %s", date, line); + free(line); + } + + return result; +} + +/* Use POSIX_FADV_NORMAL when available */ + +#ifdef POSIX_FADV_NORMAL +# define USE_POSIX_FADVISE +#else +# define POSIX_FADV_NORMAL +# define POSIX_FADV_SEQUENTIAL +# define POSIX_FADV_DONTNEED +# define posix_fadvise(a,b,c,d) do {} while(0) +#endif + +/*********************************************************************** +Computes bit shift for a given value. If the argument is not a power +of 2, returns 0.*/ +static inline size_t +get_bit_shift(size_t value) +{ + size_t shift; + + if (value == 0) + return 0; + + for (shift = 0; !(value & 1); shift++) { + value >>= 1; + } + return (value >> 1) ? 0 : shift; +} + +/**************************************************************************** +Read 'len' bytes from 'fd'. It is identical to my_read(..., MYF(MY_FULL_IO)), +i.e. tries to combine partial reads into a single block of size 'len', except +that it bails out on EOF or error, and returns the number of successfully read +bytes instead. */ +static inline size_t +xb_read_full(File fd, uchar *buf, size_t len) +{ + size_t tlen = 0; + size_t tbytes; + + while (tlen < len) { + tbytes = my_read(fd, buf, len - tlen, MYF(MY_WME)); + if (tbytes == 0 || tbytes == MY_FILE_ERROR) { + break; + } + + buf += tbytes; + tlen += tbytes; + } + + return tlen; +} + +#endif diff --git a/BUILD/compile-pentium-myodbc b/extra/mariabackup/crc/CMakeLists.txt old mode 100755 new mode 100644 similarity index 52% rename from BUILD/compile-pentium-myodbc rename to extra/mariabackup/crc/CMakeLists.txt index d9b1dd47129..91758cdf520 --- a/BUILD/compile-pentium-myodbc +++ b/extra/mariabackup/crc/CMakeLists.txt @@ -1,28 +1,33 @@ -#! /bin/sh - -# Copyright (C) 2000 MySQL AB -# Use is subject to license terms +# Copyright (c) 2017 Percona LLC and/or its affiliates. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 2 of the License. -# + # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -# + # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA -path=`dirname $0` -. "$path/SETUP.sh" +PROJECT(crc C) -extra_flags="$pentium_cflags $fast_cflags" -extra_configs="$pentium_configs --without-server" - -make=no -strip=yes - -. "$path/FINISH.sh" +IF(NOT CMAKE_CROSSCOMPILING AND NOT MSVC) + STRING(TOLOWER ${CMAKE_SYSTEM_PROCESSOR} processor) + IF(processor MATCHES "86" OR processor MATCHES "amd64" OR processor MATCHES "x64") + # Check for PCLMUL instruction + CHECK_C_SOURCE_RUNS(" + int main() + { + asm volatile (\"pclmulqdq \\$0x00, %%xmm1, %%xmm0\":::\"cc\"); + return 0; + }" HAVE_CLMUL_INSTRUCTION) + ENDIF() +ENDIF() +IF(HAVE_CLMUL_INSTRUCTION) + ADD_DEFINITIONS(-DHAVE_CLMUL_INSTRUCTION) +ENDIF() +ADD_LIBRARY(crc STATIC crc_glue.c crc-intel-pclmul.c) diff --git a/extra/mariabackup/crc/config.h.cmake b/extra/mariabackup/crc/config.h.cmake new file mode 100644 index 00000000000..fe81c1859ae --- /dev/null +++ b/extra/mariabackup/crc/config.h.cmake @@ -0,0 +1,21 @@ +/****************************************************** +Copyright (c) 2017 Percona LLC and/or its affiliates. + +Zlib compatible CRC-32 implementation. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#cmakedefine HAVE_CLMUL_INSTRUCTION 1 diff --git a/extra/mariabackup/crc/crc-intel-pclmul.c b/extra/mariabackup/crc/crc-intel-pclmul.c new file mode 100644 index 00000000000..d470c2bee43 --- /dev/null +++ b/extra/mariabackup/crc/crc-intel-pclmul.c @@ -0,0 +1,511 @@ +/****************************************************** +Copyright (c) 2017 Percona LLC and/or its affiliates. + +CRC32 using Intel's PCLMUL instruction. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +/* crc-intel-pclmul.c - Intel PCLMUL accelerated CRC implementation + * Copyright (C) 2016 Jussi Kivilinna + * + * This file is part of Libgcrypt. + * + * Libgcrypt is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * Libgcrypt is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + */ + +#include +#include +#include +#include + +# define U64_C(c) (c ## UL) + +typedef uint32_t u32; +typedef uint16_t u16; +typedef uint64_t u64; +#ifndef byte +typedef uint8_t byte; +#endif + +# define _gcry_bswap32 __builtin_bswap32 + +#if __GNUC__ >= 4 && defined(__x86_64__) && defined(HAVE_CLMUL_INSTRUCTION) + +#if _GCRY_GCC_VERSION >= 40400 /* 4.4 */ +/* Prevent compiler from issuing SSE instructions between asm blocks. */ +# pragma GCC target("no-sse") +#endif + + +#define ALIGNED_16 __attribute__ ((aligned (16))) + + +struct u16_unaligned_s +{ + u16 a; +} __attribute__((packed, aligned (1), may_alias)); + + +/* Constants structure for generic reflected/non-reflected CRC32 CLMUL + * functions. */ +struct crc32_consts_s +{ + /* k: { x^(32*17), x^(32*15), x^(32*5), x^(32*3), x^(32*2), 0 } mod P(x) */ + u64 k[6]; + /* my_p: { floor(x^64 / P(x)), P(x) } */ + u64 my_p[2]; +}; + + +/* CLMUL constants for CRC32 and CRC32RFC1510. */ +static const struct crc32_consts_s crc32_consts ALIGNED_16 = +{ + { /* k[6] = reverse_33bits( x^(32*y) mod P(x) ) */ + U64_C(0x154442bd4), U64_C(0x1c6e41596), /* y = { 17, 15 } */ + U64_C(0x1751997d0), U64_C(0x0ccaa009e), /* y = { 5, 3 } */ + U64_C(0x163cd6124), 0 /* y = 2 */ + }, + { /* my_p[2] = reverse_33bits ( { floor(x^64 / P(x)), P(x) } ) */ + U64_C(0x1f7011641), U64_C(0x1db710641) + } +}; + +/* Common constants for CRC32 algorithms. */ +static const byte crc32_refl_shuf_shift[3 * 16] ALIGNED_16 = + { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + }; +static const byte crc32_partial_fold_input_mask[16 + 16] ALIGNED_16 = + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + }; +static const u64 crc32_merge9to15_shuf[15 - 9 + 1][2] ALIGNED_16 = + { + { U64_C(0x0706050403020100), U64_C(0xffffffffffffff0f) }, /* 9 */ + { U64_C(0x0706050403020100), U64_C(0xffffffffffff0f0e) }, + { U64_C(0x0706050403020100), U64_C(0xffffffffff0f0e0d) }, + { U64_C(0x0706050403020100), U64_C(0xffffffff0f0e0d0c) }, + { U64_C(0x0706050403020100), U64_C(0xffffff0f0e0d0c0b) }, + { U64_C(0x0706050403020100), U64_C(0xffff0f0e0d0c0b0a) }, + { U64_C(0x0706050403020100), U64_C(0xff0f0e0d0c0b0a09) }, /* 15 */ + }; +static const u64 crc32_merge5to7_shuf[7 - 5 + 1][2] ALIGNED_16 = + { + { U64_C(0xffffff0703020100), U64_C(0xffffffffffffffff) }, /* 5 */ + { U64_C(0xffff070603020100), U64_C(0xffffffffffffffff) }, + { U64_C(0xff07060503020100), U64_C(0xffffffffffffffff) }, /* 7 */ + }; + +/* PCLMUL functions for reflected CRC32. */ +static inline void +crc32_reflected_bulk (u32 *pcrc, const byte *inbuf, size_t inlen, + const struct crc32_consts_s *consts) +{ + if (inlen >= 8 * 16) + { + asm volatile ("movd %[crc], %%xmm4\n\t" + "movdqu %[inbuf_0], %%xmm0\n\t" + "movdqu %[inbuf_1], %%xmm1\n\t" + "movdqu %[inbuf_2], %%xmm2\n\t" + "movdqu %[inbuf_3], %%xmm3\n\t" + "pxor %%xmm4, %%xmm0\n\t" + : + : [inbuf_0] "m" (inbuf[0 * 16]), + [inbuf_1] "m" (inbuf[1 * 16]), + [inbuf_2] "m" (inbuf[2 * 16]), + [inbuf_3] "m" (inbuf[3 * 16]), + [crc] "m" (*pcrc) + ); + + inbuf += 4 * 16; + inlen -= 4 * 16; + + asm volatile ("movdqa %[k1k2], %%xmm4\n\t" + : + : [k1k2] "m" (consts->k[1 - 1]) + ); + + /* Fold by 4. */ + while (inlen >= 4 * 16) + { + asm volatile ("movdqu %[inbuf_0], %%xmm5\n\t" + "movdqa %%xmm0, %%xmm6\n\t" + "pclmulqdq $0x00, %%xmm4, %%xmm0\n\t" + "pclmulqdq $0x11, %%xmm4, %%xmm6\n\t" + "pxor %%xmm5, %%xmm0\n\t" + "pxor %%xmm6, %%xmm0\n\t" + + "movdqu %[inbuf_1], %%xmm5\n\t" + "movdqa %%xmm1, %%xmm6\n\t" + "pclmulqdq $0x00, %%xmm4, %%xmm1\n\t" + "pclmulqdq $0x11, %%xmm4, %%xmm6\n\t" + "pxor %%xmm5, %%xmm1\n\t" + "pxor %%xmm6, %%xmm1\n\t" + + "movdqu %[inbuf_2], %%xmm5\n\t" + "movdqa %%xmm2, %%xmm6\n\t" + "pclmulqdq $0x00, %%xmm4, %%xmm2\n\t" + "pclmulqdq $0x11, %%xmm4, %%xmm6\n\t" + "pxor %%xmm5, %%xmm2\n\t" + "pxor %%xmm6, %%xmm2\n\t" + + "movdqu %[inbuf_3], %%xmm5\n\t" + "movdqa %%xmm3, %%xmm6\n\t" + "pclmulqdq $0x00, %%xmm4, %%xmm3\n\t" + "pclmulqdq $0x11, %%xmm4, %%xmm6\n\t" + "pxor %%xmm5, %%xmm3\n\t" + "pxor %%xmm6, %%xmm3\n\t" + : + : [inbuf_0] "m" (inbuf[0 * 16]), + [inbuf_1] "m" (inbuf[1 * 16]), + [inbuf_2] "m" (inbuf[2 * 16]), + [inbuf_3] "m" (inbuf[3 * 16]) + ); + + inbuf += 4 * 16; + inlen -= 4 * 16; + } + + asm volatile ("movdqa %[k3k4], %%xmm6\n\t" + "movdqa %[my_p], %%xmm5\n\t" + : + : [k3k4] "m" (consts->k[3 - 1]), + [my_p] "m" (consts->my_p[0]) + ); + + /* Fold 4 to 1. */ + + asm volatile ("movdqa %%xmm0, %%xmm4\n\t" + "pclmulqdq $0x00, %%xmm6, %%xmm0\n\t" + "pclmulqdq $0x11, %%xmm6, %%xmm4\n\t" + "pxor %%xmm1, %%xmm0\n\t" + "pxor %%xmm4, %%xmm0\n\t" + + "movdqa %%xmm0, %%xmm4\n\t" + "pclmulqdq $0x00, %%xmm6, %%xmm0\n\t" + "pclmulqdq $0x11, %%xmm6, %%xmm4\n\t" + "pxor %%xmm2, %%xmm0\n\t" + "pxor %%xmm4, %%xmm0\n\t" + + "movdqa %%xmm0, %%xmm4\n\t" + "pclmulqdq $0x00, %%xmm6, %%xmm0\n\t" + "pclmulqdq $0x11, %%xmm6, %%xmm4\n\t" + "pxor %%xmm3, %%xmm0\n\t" + "pxor %%xmm4, %%xmm0\n\t" + : + : + ); + } + else + { + asm volatile ("movd %[crc], %%xmm1\n\t" + "movdqu %[inbuf], %%xmm0\n\t" + "movdqa %[k3k4], %%xmm6\n\t" + "pxor %%xmm1, %%xmm0\n\t" + "movdqa %[my_p], %%xmm5\n\t" + : + : [inbuf] "m" (*inbuf), + [crc] "m" (*pcrc), + [k3k4] "m" (consts->k[3 - 1]), + [my_p] "m" (consts->my_p[0]) + ); + + inbuf += 16; + inlen -= 16; + } + + /* Fold by 1. */ + if (inlen >= 16) + { + while (inlen >= 16) + { + /* Load next block to XMM2. Fold XMM0 to XMM0:XMM1. */ + asm volatile ("movdqu %[inbuf], %%xmm2\n\t" + "movdqa %%xmm0, %%xmm1\n\t" + "pclmulqdq $0x00, %%xmm6, %%xmm0\n\t" + "pclmulqdq $0x11, %%xmm6, %%xmm1\n\t" + "pxor %%xmm2, %%xmm0\n\t" + "pxor %%xmm1, %%xmm0\n\t" + : + : [inbuf] "m" (*inbuf) + ); + + inbuf += 16; + inlen -= 16; + } + } + + /* Partial fold. */ + if (inlen) + { + /* Load last input and add padding zeros. */ + asm volatile ("movdqu %[shr_shuf], %%xmm3\n\t" + "movdqu %[shl_shuf], %%xmm4\n\t" + "movdqu %[mask], %%xmm2\n\t" + + "movdqa %%xmm0, %%xmm1\n\t" + "pshufb %%xmm4, %%xmm0\n\t" + "movdqu %[inbuf], %%xmm4\n\t" + "pshufb %%xmm3, %%xmm1\n\t" + "pand %%xmm4, %%xmm2\n\t" + "por %%xmm1, %%xmm2\n\t" + + "movdqa %%xmm0, %%xmm1\n\t" + "pclmulqdq $0x00, %%xmm6, %%xmm0\n\t" + "pclmulqdq $0x11, %%xmm6, %%xmm1\n\t" + "pxor %%xmm2, %%xmm0\n\t" + "pxor %%xmm1, %%xmm0\n\t" + : + : [inbuf] "m" (*(inbuf - 16 + inlen)), + [mask] "m" (crc32_partial_fold_input_mask[inlen]), + [shl_shuf] "m" (crc32_refl_shuf_shift[inlen]), + [shr_shuf] "m" (crc32_refl_shuf_shift[inlen + 16]) + ); + + inbuf += inlen; + inlen -= inlen; + } + + /* Final fold. */ + asm volatile (/* reduce 128-bits to 96-bits */ + "movdqa %%xmm0, %%xmm1\n\t" + "pclmulqdq $0x10, %%xmm6, %%xmm0\n\t" + "psrldq $8, %%xmm1\n\t" + "pxor %%xmm1, %%xmm0\n\t" + + /* reduce 96-bits to 64-bits */ + "pshufd $0xfc, %%xmm0, %%xmm1\n\t" /* [00][00][00][x] */ + "pshufd $0xf9, %%xmm0, %%xmm0\n\t" /* [00][00][x>>64][x>>32] */ + "pclmulqdq $0x00, %[k5], %%xmm1\n\t" /* [00][00][xx][xx] */ + "pxor %%xmm1, %%xmm0\n\t" /* top 64-bit are zero */ + + /* barrett reduction */ + "pshufd $0xf3, %%xmm0, %%xmm1\n\t" /* [00][00][x>>32][00] */ + "pslldq $4, %%xmm0\n\t" /* [??][x>>32][??][??] */ + "pclmulqdq $0x00, %%xmm5, %%xmm1\n\t" /* [00][xx][xx][00] */ + "pclmulqdq $0x10, %%xmm5, %%xmm1\n\t" /* [00][xx][xx][00] */ + "pxor %%xmm1, %%xmm0\n\t" + + /* store CRC */ + "pextrd $2, %%xmm0, %[out]\n\t" + : [out] "=m" (*pcrc) + : [k5] "m" (consts->k[5 - 1]) + ); +} + +static inline void +crc32_reflected_less_than_16 (u32 *pcrc, const byte *inbuf, size_t inlen, + const struct crc32_consts_s *consts) +{ + if (inlen < 4) + { + u32 crc = *pcrc; + u32 data; + + asm volatile ("movdqa %[my_p], %%xmm5\n\t" + : + : [my_p] "m" (consts->my_p[0]) + ); + + if (inlen == 1) + { + data = inbuf[0]; + data ^= crc; + data <<= 24; + crc >>= 8; + } + else if (inlen == 2) + { + data = ((const struct u16_unaligned_s *)inbuf)->a; + data ^= crc; + data <<= 16; + crc >>= 16; + } + else + { + data = ((const struct u16_unaligned_s *)inbuf)->a; + data |= inbuf[2] << 16; + data ^= crc; + data <<= 8; + crc >>= 24; + } + + /* Barrett reduction */ + asm volatile ("movd %[in], %%xmm0\n\t" + "movd %[crc], %%xmm1\n\t" + + "pclmulqdq $0x00, %%xmm5, %%xmm0\n\t" /* [00][00][xx][xx] */ + "psllq $32, %%xmm1\n\t" + "pshufd $0xfc, %%xmm0, %%xmm0\n\t" /* [00][00][00][x] */ + "pclmulqdq $0x10, %%xmm5, %%xmm0\n\t" /* [00][00][xx][xx] */ + "pxor %%xmm1, %%xmm0\n\t" + + "pextrd $1, %%xmm0, %[out]\n\t" + : [out] "=m" (*pcrc) + : [in] "rm" (data), + [crc] "rm" (crc) + ); + } + else if (inlen == 4) + { + /* Barrett reduction */ + asm volatile ("movd %[crc], %%xmm1\n\t" + "movd %[in], %%xmm0\n\t" + "movdqa %[my_p], %%xmm5\n\t" + "pxor %%xmm1, %%xmm0\n\t" + + "pclmulqdq $0x00, %%xmm5, %%xmm0\n\t" /* [00][00][xx][xx] */ + "pshufd $0xfc, %%xmm0, %%xmm0\n\t" /* [00][00][00][x] */ + "pclmulqdq $0x10, %%xmm5, %%xmm0\n\t" /* [00][00][xx][xx] */ + + "pextrd $1, %%xmm0, %[out]\n\t" + : [out] "=m" (*pcrc) + : [in] "m" (*inbuf), + [crc] "m" (*pcrc), + [my_p] "m" (consts->my_p[0]) + ); + } + else + { + asm volatile ("movdqu %[shuf], %%xmm4\n\t" + "movd %[crc], %%xmm1\n\t" + "movdqa %[my_p], %%xmm5\n\t" + "movdqa %[k3k4], %%xmm6\n\t" + : + : [shuf] "m" (crc32_refl_shuf_shift[inlen]), + [crc] "m" (*pcrc), + [my_p] "m" (consts->my_p[0]), + [k3k4] "m" (consts->k[3 - 1]) + ); + + if (inlen >= 8) + { + asm volatile ("movq %[inbuf], %%xmm0\n\t" + : + : [inbuf] "m" (*inbuf) + ); + if (inlen > 8) + { + asm volatile (/*"pinsrq $1, %[inbuf_tail], %%xmm0\n\t"*/ + "movq %[inbuf_tail], %%xmm2\n\t" + "punpcklqdq %%xmm2, %%xmm0\n\t" + "pshufb %[merge_shuf], %%xmm0\n\t" + : + : [inbuf_tail] "m" (inbuf[inlen - 8]), + [merge_shuf] "m" + (*crc32_merge9to15_shuf[inlen - 9]) + ); + } + } + else + { + asm volatile ("movd %[inbuf], %%xmm0\n\t" + "pinsrd $1, %[inbuf_tail], %%xmm0\n\t" + "pshufb %[merge_shuf], %%xmm0\n\t" + : + : [inbuf] "m" (*inbuf), + [inbuf_tail] "m" (inbuf[inlen - 4]), + [merge_shuf] "m" + (*crc32_merge5to7_shuf[inlen - 5]) + ); + } + + /* Final fold. */ + asm volatile ("pxor %%xmm1, %%xmm0\n\t" + "pshufb %%xmm4, %%xmm0\n\t" + + /* reduce 128-bits to 96-bits */ + "movdqa %%xmm0, %%xmm1\n\t" + "pclmulqdq $0x10, %%xmm6, %%xmm0\n\t" + "psrldq $8, %%xmm1\n\t" + "pxor %%xmm1, %%xmm0\n\t" /* top 32-bit are zero */ + + /* reduce 96-bits to 64-bits */ + "pshufd $0xfc, %%xmm0, %%xmm1\n\t" /* [00][00][00][x] */ + "pshufd $0xf9, %%xmm0, %%xmm0\n\t" /* [00][00][x>>64][x>>32] */ + "pclmulqdq $0x00, %[k5], %%xmm1\n\t" /* [00][00][xx][xx] */ + "pxor %%xmm1, %%xmm0\n\t" /* top 64-bit are zero */ + + /* barrett reduction */ + "pshufd $0xf3, %%xmm0, %%xmm1\n\t" /* [00][00][x>>32][00] */ + "pslldq $4, %%xmm0\n\t" /* [??][x>>32][??][??] */ + "pclmulqdq $0x00, %%xmm5, %%xmm1\n\t" /* [00][xx][xx][00] */ + "pclmulqdq $0x10, %%xmm5, %%xmm1\n\t" /* [00][xx][xx][00] */ + "pxor %%xmm1, %%xmm0\n\t" + + /* store CRC */ + "pextrd $2, %%xmm0, %[out]\n\t" + : [out] "=m" (*pcrc) + : [k5] "m" (consts->k[5 - 1]) + ); + } +} + +void +crc32_intel_pclmul (u32 *pcrc, const byte *inbuf, size_t inlen) +{ + const struct crc32_consts_s *consts = &crc32_consts; +#if defined(__x86_64__) && defined(__WIN64__) + char win64tmp[2 * 16]; + + /* XMM6-XMM7 need to be restored after use. */ + asm volatile ("movdqu %%xmm6, 0*16(%0)\n\t" + "movdqu %%xmm7, 1*16(%0)\n\t" + : + : "r" (win64tmp) + : "memory"); +#endif + + if (!inlen) + return; + + if (inlen >= 16) + crc32_reflected_bulk(pcrc, inbuf, inlen, consts); + else + crc32_reflected_less_than_16(pcrc, inbuf, inlen, consts); + +#if defined(__x86_64__) && defined(__WIN64__) + /* Restore used registers. */ + asm volatile("movdqu 0*16(%0), %%xmm6\n\t" + "movdqu 1*16(%0), %%xmm7\n\t" + : + : "r" (win64tmp) + : "memory"); +#endif +} + +#endif diff --git a/extra/mariabackup/crc/crc-intel-pclmul.h b/extra/mariabackup/crc/crc-intel-pclmul.h new file mode 100644 index 00000000000..120058165a0 --- /dev/null +++ b/extra/mariabackup/crc/crc-intel-pclmul.h @@ -0,0 +1,25 @@ +/****************************************************** +Copyright (c) 2017 Percona LLC and/or its affiliates. + +CRC32 using Intel's PCLMUL instruction. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#include +#include + +void +crc32_intel_pclmul(uint32_t *pcrc, const uint8_t *inbuf, size_t inlen); diff --git a/extra/mariabackup/crc/crc_glue.c b/extra/mariabackup/crc/crc_glue.c new file mode 100644 index 00000000000..c301cb01e2e --- /dev/null +++ b/extra/mariabackup/crc/crc_glue.c @@ -0,0 +1,72 @@ +/****************************************************** +Copyright (c) 2017 Percona LLC and/or its affiliates. + +Zlib compatible CRC-32 implementation. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ +#include "my_config.h" +#include "crc_glue.h" +#include "crc-intel-pclmul.h" +#include +#include +#include + +#if __GNUC__ >= 4 && defined(__x86_64__) +static int pclmul_enabled = 0; +#endif + +#if defined(__GNUC__) && defined(__x86_64__) +static +uint32_t +cpuid(uint32_t* ecx, uint32_t* edx) +{ + uint32_t level; + + asm("cpuid" : "=a" (level) : "a" (0) : "ebx", "ecx", "edx"); + + if (level < 1) { + return level; + } + + asm("cpuid" : "=c" (*ecx), "=d" (*edx) + : "a" (1) + : "ebx"); + + return level; +} +#endif + +void crc_init() { +#if defined(__GNUC__) && defined(__x86_64__) + uint32_t ecx, edx; + + if (cpuid(&ecx, &edx) > 0) { + pclmul_enabled = ((ecx >> 19) & 1) && ((ecx >> 1) & 1); + } +#endif +} + +unsigned long crc32_iso3309(unsigned long crc, const unsigned char *buf, unsigned int len) +{ +#if __GNUC__ >= 4 && defined(__x86_64__) && defined(HAVE_CLMUL_INSTRUCTION) + if (pclmul_enabled) { + uint32_t crc_accum = crc ^ 0xffffffffL; + crc32_intel_pclmul(&crc_accum, buf, len); + return crc_accum ^ 0xffffffffL; + } +#endif + return crc32(crc, buf, len); +} diff --git a/extra/mariabackup/crc/crc_glue.h b/extra/mariabackup/crc/crc_glue.h new file mode 100644 index 00000000000..e287fa4a7aa --- /dev/null +++ b/extra/mariabackup/crc/crc_glue.h @@ -0,0 +1,31 @@ +/****************************************************** +Copyright (c) 2017 Percona LLC and/or its affiliates. + +Zlib compatible CRC-32 implementation. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + + +#ifdef __cplusplus +extern "C" { +#endif + +void crc_init(); +unsigned long crc32_iso3309(unsigned long crc, const unsigned char *buf, unsigned int len); + +#ifdef __cplusplus +} +#endif diff --git a/extra/mariabackup/datasink.c b/extra/mariabackup/datasink.c new file mode 100644 index 00000000000..460e0e8ca19 --- /dev/null +++ b/extra/mariabackup/datasink.c @@ -0,0 +1,137 @@ +/****************************************************** +Copyright (c) 2011-2013 Percona LLC and/or its affiliates. + +Data sink interface. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#include +#include "common.h" +#include "datasink.h" +#include "ds_compress.h" +#include "ds_archive.h" +#include "ds_xbstream.h" +#include "ds_local.h" +#include "ds_stdout.h" +#include "ds_tmpfile.h" +#include "ds_buffer.h" + +/************************************************************************ +Create a datasink of the specified type */ +ds_ctxt_t * +ds_create(const char *root, ds_type_t type) +{ + datasink_t *ds; + ds_ctxt_t *ctxt; + + switch (type) { + case DS_TYPE_STDOUT: + ds = &datasink_stdout; + break; + case DS_TYPE_LOCAL: + ds = &datasink_local; + break; + case DS_TYPE_ARCHIVE: +#ifdef HAVE_LIBARCHIVE + ds = &datasink_archive; +#else + msg("Error : mariabackup was built without libarchive support"); + exit(EXIT_FAILURE); +#endif + break; + case DS_TYPE_XBSTREAM: + ds = &datasink_xbstream; + break; + case DS_TYPE_COMPRESS: + ds = &datasink_compress; + break; + case DS_TYPE_ENCRYPT: + case DS_TYPE_DECRYPT: + msg("Error : mariabackup does not support encrypted backups."); + exit(EXIT_FAILURE); + break; + + case DS_TYPE_TMPFILE: + ds = &datasink_tmpfile; + break; + case DS_TYPE_BUFFER: + ds = &datasink_buffer; + break; + default: + msg("Unknown datasink type: %d\n", type); + xb_ad(0); + return NULL; + } + + ctxt = ds->init(root); + if (ctxt != NULL) { + ctxt->datasink = ds; + } else { + msg("Error: failed to initialize datasink.\n"); + exit(EXIT_FAILURE); + } + + return ctxt; +} + +/************************************************************************ +Open a datasink file */ +ds_file_t * +ds_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *stat) +{ + ds_file_t *file; + + file = ctxt->datasink->open(ctxt, path, stat); + if (file != NULL) { + file->datasink = ctxt->datasink; + } + + return file; +} + +/************************************************************************ +Write to a datasink file. +@return 0 on success, 1 on error. */ +int +ds_write(ds_file_t *file, const void *buf, size_t len) +{ + return file->datasink->write(file, buf, len); +} + +/************************************************************************ +Close a datasink file. +@return 0 on success, 1, on error. */ +int +ds_close(ds_file_t *file) +{ + return file->datasink->close(file); +} + +/************************************************************************ +Destroy a datasink handle */ +void +ds_destroy(ds_ctxt_t *ctxt) +{ + ctxt->datasink->deinit(ctxt); +} + +/************************************************************************ +Set the destination pipe for a datasink (only makes sense for compress and +tmpfile). */ +void ds_set_pipe(ds_ctxt_t *ctxt, ds_ctxt_t *pipe_ctxt) +{ + ctxt->pipe_ctxt = pipe_ctxt; +} diff --git a/extra/mariabackup/datasink.h b/extra/mariabackup/datasink.h new file mode 100644 index 00000000000..8bf1321aad1 --- /dev/null +++ b/extra/mariabackup/datasink.h @@ -0,0 +1,100 @@ +/****************************************************** +Copyright (c) 2011-2013 Percona LLC and/or its affiliates. + +Data sink interface. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#ifndef XB_DATASINK_H +#define XB_DATASINK_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern char *xtrabackup_tmpdir; +struct datasink_struct; +typedef struct datasink_struct datasink_t; + +typedef struct ds_ctxt { + datasink_t *datasink; + char *root; + void *ptr; + struct ds_ctxt *pipe_ctxt; +} ds_ctxt_t; + +typedef struct { + void *ptr; + char *path; + datasink_t *datasink; +} ds_file_t; + +struct datasink_struct { + ds_ctxt_t *(*init)(const char *root); + ds_file_t *(*open)(ds_ctxt_t *ctxt, const char *path, MY_STAT *stat); + int (*write)(ds_file_t *file, const void *buf, size_t len); + int (*close)(ds_file_t *file); + void (*deinit)(ds_ctxt_t *ctxt); +}; + +/* Supported datasink types */ +typedef enum { + DS_TYPE_STDOUT, + DS_TYPE_LOCAL, + DS_TYPE_ARCHIVE, + DS_TYPE_XBSTREAM, + DS_TYPE_COMPRESS, + DS_TYPE_ENCRYPT, + DS_TYPE_DECRYPT, + DS_TYPE_TMPFILE, + DS_TYPE_BUFFER +} ds_type_t; + +/************************************************************************ +Create a datasink of the specified type */ +ds_ctxt_t *ds_create(const char *root, ds_type_t type); + +/************************************************************************ +Open a datasink file */ +ds_file_t *ds_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *stat); + +/************************************************************************ +Write to a datasink file. +@return 0 on success, 1 on error. */ +int ds_write(ds_file_t *file, const void *buf, size_t len); + +/************************************************************************ +Close a datasink file. +@return 0 on success, 1, on error. */ +int ds_close(ds_file_t *file); + +/************************************************************************ +Destroy a datasink handle */ +void ds_destroy(ds_ctxt_t *ctxt); + +/************************************************************************ +Set the destination pipe for a datasink (only makes sense for compress and +tmpfile). */ +void ds_set_pipe(ds_ctxt_t *ctxt, ds_ctxt_t *pipe_ctxt); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* XB_DATASINK_H */ diff --git a/extra/mariabackup/ds_archive.c b/extra/mariabackup/ds_archive.c new file mode 100644 index 00000000000..50afcce4bc7 --- /dev/null +++ b/extra/mariabackup/ds_archive.c @@ -0,0 +1,280 @@ +/****************************************************** +Copyright (c) 2013 Percona LLC and/or its affiliates. + +Streaming implementation for XtraBackup. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#include +#include +#include +#include "common.h" +#include "datasink.h" + +#if ARCHIVE_VERSION_NUMBER < 3000000 +#define archive_write_add_filter_none(X) archive_write_set_compression_none(X) +#define archive_write_free(X) archive_write_finish(X) +#endif + +typedef struct { + struct archive *archive; + ds_file_t *dest_file; + pthread_mutex_t mutex; +} ds_archive_ctxt_t; + +typedef struct { + struct archive_entry *entry; + ds_archive_ctxt_t *archive_ctxt; +} ds_archive_file_t; + + +/*********************************************************************** +General archive interface */ + +static ds_ctxt_t *archive_init(const char *root); +static ds_file_t *archive_open(ds_ctxt_t *ctxt, const char *path, + MY_STAT *mystat); +static int archive_write(ds_file_t *file, const void *buf, size_t len); +static int archive_close(ds_file_t *file); +static void archive_deinit(ds_ctxt_t *ctxt); + +datasink_t datasink_archive = { + &archive_init, + &archive_open, + &archive_write, + &archive_close, + &archive_deinit +}; + +static +int +my_archive_open_callback(struct archive *a __attribute__((unused)), + void *data __attribute__((unused))) +{ + return ARCHIVE_OK; +} + +static +ssize_t +my_archive_write_callback(struct archive *a __attribute__((unused)), + void *data, const void *buffer, size_t length) +{ + ds_archive_ctxt_t *archive_ctxt; + + archive_ctxt = (ds_archive_ctxt_t *) data; + + xb_ad(archive_ctxt != NULL); + xb_ad(archive_ctxt->dest_file != NULL); + + if (!ds_write(archive_ctxt->dest_file, buffer, length)) { + return length; + } + return -1; +} + +static +int +my_archive_close_callback(struct archive *a __attribute__((unused)), + void *data __attribute__((unused))) +{ + return ARCHIVE_OK; +} + +static +ds_ctxt_t * +archive_init(const char *root __attribute__((unused))) +{ + ds_ctxt_t *ctxt; + ds_archive_ctxt_t *archive_ctxt; + struct archive *a; + + ctxt = my_malloc(sizeof(ds_ctxt_t) + sizeof(ds_archive_ctxt_t), + MYF(MY_FAE)); + archive_ctxt = (ds_archive_ctxt_t *)(ctxt + 1); + + if (pthread_mutex_init(&archive_ctxt->mutex, NULL)) { + msg("archive_init: pthread_mutex_init() failed.\n"); + goto err; + } + + a = archive_write_new(); + if (a == NULL) { + msg("archive_write_new() failed.\n"); + goto err; + } + + archive_ctxt->archive = a; + archive_ctxt->dest_file = NULL; + + if(archive_write_add_filter_none(a) != ARCHIVE_OK || + archive_write_set_format_pax_restricted(a) != ARCHIVE_OK || + /* disable internal buffering so we don't have to flush the + output in xtrabackup */ + archive_write_set_bytes_per_block(a, 0) != ARCHIVE_OK) { + msg("failed to set libarchive archive options: %s\n", + archive_error_string(a)); + archive_write_free(a); + goto err; + } + + if (archive_write_open(a, archive_ctxt, my_archive_open_callback, + my_archive_write_callback, + my_archive_close_callback) != ARCHIVE_OK) { + msg("cannot open output archive.\n"); + return NULL; + } + + ctxt->ptr = archive_ctxt; + + return ctxt; + +err: + my_free(ctxt); + return NULL; +} + +static +ds_file_t * +archive_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *mystat) +{ + ds_archive_ctxt_t *archive_ctxt; + ds_ctxt_t *dest_ctxt; + ds_file_t *file; + ds_archive_file_t *archive_file; + + struct archive *a; + struct archive_entry *entry; + + xb_ad(ctxt->pipe_ctxt != NULL); + dest_ctxt = ctxt->pipe_ctxt; + + archive_ctxt = (ds_archive_ctxt_t *) ctxt->ptr; + + pthread_mutex_lock(&archive_ctxt->mutex); + if (archive_ctxt->dest_file == NULL) { + archive_ctxt->dest_file = ds_open(dest_ctxt, path, mystat); + if (archive_ctxt->dest_file == NULL) { + return NULL; + } + } + pthread_mutex_unlock(&archive_ctxt->mutex); + + file = (ds_file_t *) my_malloc(sizeof(ds_file_t) + + sizeof(ds_archive_file_t), + MYF(MY_FAE)); + + archive_file = (ds_archive_file_t *) (file + 1); + + a = archive_ctxt->archive; + + entry = archive_entry_new(); + if (entry == NULL) { + msg("archive_entry_new() failed.\n"); + goto err; + } + + archive_entry_set_size(entry, mystat->st_size); + archive_entry_set_mode(entry, 0660); + archive_entry_set_filetype(entry, AE_IFREG); + archive_entry_set_pathname(entry, path); + archive_entry_set_mtime(entry, mystat->st_mtime, 0); + + archive_file->entry = entry; + archive_file->archive_ctxt = archive_ctxt; + + if (archive_write_header(a, entry) != ARCHIVE_OK) { + msg("archive_write_header() failed.\n"); + archive_entry_free(entry); + goto err; + } + + file->ptr = archive_file; + file->path = archive_ctxt->dest_file->path; + + return file; + +err: + if (archive_ctxt->dest_file) { + ds_close(archive_ctxt->dest_file); + archive_ctxt->dest_file = NULL; + } + my_free(file); + + return NULL; +} + +static +int +archive_write(ds_file_t *file, const void *buf, size_t len) +{ + ds_archive_file_t *archive_file; + struct archive *a; + + archive_file = (ds_archive_file_t *) file->ptr; + + a = archive_file->archive_ctxt->archive; + + xb_ad(archive_file->archive_ctxt->dest_file != NULL); + if (archive_write_data(a, buf, len) < 0) { + msg("archive_write_data() failed: %s (errno = %d)\n", + archive_error_string(a), archive_errno(a)); + return 1; + } + + return 0; +} + +static +int +archive_close(ds_file_t *file) +{ + ds_archive_file_t *archive_file; + int rc = 0; + + archive_file = (ds_archive_file_t *)file->ptr; + + archive_entry_free(archive_file->entry); + + my_free(file); + + return rc; +} + +static +void +archive_deinit(ds_ctxt_t *ctxt) +{ + struct archive *a; + ds_archive_ctxt_t *archive_ctxt; + + archive_ctxt = (ds_archive_ctxt_t *) ctxt->ptr; + + a = archive_ctxt->archive; + + if (archive_write_close(a) != ARCHIVE_OK) { + msg("archive_write_close() failed.\n"); + } + archive_write_free(a); + + if (archive_ctxt->dest_file) { + ds_close(archive_ctxt->dest_file); + archive_ctxt->dest_file = NULL; + } + + pthread_mutex_destroy(&archive_ctxt->mutex); + + my_free(ctxt); +} diff --git a/extra/mariabackup/ds_archive.h b/extra/mariabackup/ds_archive.h new file mode 100644 index 00000000000..3f4e4463c58 --- /dev/null +++ b/extra/mariabackup/ds_archive.h @@ -0,0 +1,28 @@ +/****************************************************** +Copyright (c) 2013 Percona LLC and/or its affiliates. + +Streaming interface for XtraBackup. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#ifndef DS_ARCHIVE_H +#define DS_ARCHIVE_H + +#include "datasink.h" + +extern datasink_t datasink_archive; + +#endif diff --git a/extra/mariabackup/ds_buffer.c b/extra/mariabackup/ds_buffer.c new file mode 100644 index 00000000000..4bb314c0f50 --- /dev/null +++ b/extra/mariabackup/ds_buffer.c @@ -0,0 +1,189 @@ +/****************************************************** +Copyright (c) 2012-2013 Percona LLC and/or its affiliates. + +buffer datasink for XtraBackup. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +/* Does buffered output to a destination datasink set with ds_set_pipe(). +Writes to the destination datasink are guaranteed to not be smaller than a +specified buffer size (DS_DEFAULT_BUFFER_SIZE by default), with the only +exception for the last write for a file. */ + +#include +#include +#include "ds_buffer.h" +#include "common.h" +#include "datasink.h" + +#define DS_DEFAULT_BUFFER_SIZE (64 * 1024) + +typedef struct { + ds_file_t *dst_file; + char *buf; + size_t pos; + size_t size; +} ds_buffer_file_t; + +typedef struct { + size_t buffer_size; +} ds_buffer_ctxt_t; + +static ds_ctxt_t *buffer_init(const char *root); +static ds_file_t *buffer_open(ds_ctxt_t *ctxt, const char *path, + MY_STAT *mystat); +static int buffer_write(ds_file_t *file, const void *buf, size_t len); +static int buffer_close(ds_file_t *file); +static void buffer_deinit(ds_ctxt_t *ctxt); + +datasink_t datasink_buffer = { + &buffer_init, + &buffer_open, + &buffer_write, + &buffer_close, + &buffer_deinit +}; + +/* Change the default buffer size */ +void ds_buffer_set_size(ds_ctxt_t *ctxt, size_t size) +{ + ds_buffer_ctxt_t *buffer_ctxt = (ds_buffer_ctxt_t *) ctxt->ptr; + + buffer_ctxt->buffer_size = size; +} + +static ds_ctxt_t * +buffer_init(const char *root) +{ + ds_ctxt_t *ctxt; + ds_buffer_ctxt_t *buffer_ctxt; + + ctxt = my_malloc(sizeof(ds_ctxt_t) + sizeof(ds_buffer_ctxt_t), + MYF(MY_FAE)); + buffer_ctxt = (ds_buffer_ctxt_t *) (ctxt + 1); + buffer_ctxt->buffer_size = DS_DEFAULT_BUFFER_SIZE; + + ctxt->ptr = buffer_ctxt; + ctxt->root = my_strdup(root, MYF(MY_FAE)); + + return ctxt; +} + +static ds_file_t * +buffer_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *mystat) +{ + ds_buffer_ctxt_t *buffer_ctxt; + ds_ctxt_t *pipe_ctxt; + ds_file_t *dst_file; + ds_file_t *file; + ds_buffer_file_t *buffer_file; + + pipe_ctxt = ctxt->pipe_ctxt; + xb_a(pipe_ctxt != NULL); + + dst_file = ds_open(pipe_ctxt, path, mystat); + if (dst_file == NULL) { + exit(EXIT_FAILURE); + } + + buffer_ctxt = (ds_buffer_ctxt_t *) ctxt->ptr; + + file = (ds_file_t *) my_malloc(sizeof(ds_file_t) + + sizeof(ds_buffer_file_t) + + buffer_ctxt->buffer_size, + MYF(MY_FAE)); + + buffer_file = (ds_buffer_file_t *) (file + 1); + buffer_file->dst_file = dst_file; + buffer_file->buf = (char *) (buffer_file + 1); + buffer_file->size = buffer_ctxt->buffer_size; + buffer_file->pos = 0; + + file->path = dst_file->path; + file->ptr = buffer_file; + + return file; +} + +static int +buffer_write(ds_file_t *file, const void *buf, size_t len) +{ + ds_buffer_file_t *buffer_file; + + buffer_file = (ds_buffer_file_t *) file->ptr; + + while (len > 0) { + if (buffer_file->pos + len > buffer_file->size) { + if (buffer_file->pos > 0) { + size_t bytes; + + bytes = buffer_file->size - buffer_file->pos; + memcpy(buffer_file->buf + buffer_file->pos, buf, + bytes); + + if (ds_write(buffer_file->dst_file, + buffer_file->buf, + buffer_file->size)) { + return 1; + } + + buffer_file->pos = 0; + + buf = (const char *) buf + bytes; + len -= bytes; + } else { + /* We don't have any buffered bytes, just write + the entire source buffer */ + if (ds_write(buffer_file->dst_file, buf, len)) { + return 1; + } + break; + } + } else { + memcpy(buffer_file->buf + buffer_file->pos, buf, len); + buffer_file->pos += len; + break; + } + } + + return 0; +} + +static int +buffer_close(ds_file_t *file) +{ + ds_buffer_file_t *buffer_file; + int ret; + + buffer_file = (ds_buffer_file_t *) file->ptr; + if (buffer_file->pos > 0) { + ds_write(buffer_file->dst_file, buffer_file->buf, + buffer_file->pos); + } + + ret = ds_close(buffer_file->dst_file); + + my_free(file); + + return ret; +} + +static void +buffer_deinit(ds_ctxt_t *ctxt) +{ + my_free(ctxt->root); + my_free(ctxt); +} diff --git a/extra/mariabackup/ds_buffer.h b/extra/mariabackup/ds_buffer.h new file mode 100644 index 00000000000..f8d2d63267d --- /dev/null +++ b/extra/mariabackup/ds_buffer.h @@ -0,0 +1,39 @@ +/****************************************************** +Copyright (c) 2012-2013 Percona LLC and/or its affiliates. + +buffer datasink for XtraBackup. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#ifndef DS_BUFFER_H +#define DS_BUFFER_H + +#include "datasink.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern datasink_t datasink_buffer; + +/* Change the default buffer size */ +void ds_buffer_set_size(ds_ctxt_t *ctxt, size_t size); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/extra/mariabackup/ds_compress.c b/extra/mariabackup/ds_compress.c new file mode 100644 index 00000000000..15801c8abd4 --- /dev/null +++ b/extra/mariabackup/ds_compress.c @@ -0,0 +1,462 @@ +/****************************************************** +Copyright (c) 2011-2013 Percona LLC and/or its affiliates. + +Compressing datasink implementation for XtraBackup. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#include +#include +#include +#include +#include "common.h" +#include "datasink.h" + +#define COMPRESS_CHUNK_SIZE ((size_t) (xtrabackup_compress_chunk_size)) +#define MY_QLZ_COMPRESS_OVERHEAD 400 + +typedef struct { + pthread_t id; + uint num; + pthread_mutex_t ctrl_mutex; + pthread_cond_t ctrl_cond; + pthread_mutex_t data_mutex; + pthread_cond_t data_cond; + my_bool started; + my_bool data_avail; + my_bool cancelled; + const char *from; + size_t from_len; + char *to; + size_t to_len; + qlz_state_compress state; + ulong adler; +} comp_thread_ctxt_t; + +typedef struct { + comp_thread_ctxt_t *threads; + uint nthreads; +} ds_compress_ctxt_t; + +typedef struct { + ds_file_t *dest_file; + ds_compress_ctxt_t *comp_ctxt; + size_t bytes_processed; +} ds_compress_file_t; + +/* Compression options */ +extern char *xtrabackup_compress_alg; +extern uint xtrabackup_compress_threads; +extern ulonglong xtrabackup_compress_chunk_size; + +static ds_ctxt_t *compress_init(const char *root); +static ds_file_t *compress_open(ds_ctxt_t *ctxt, const char *path, + MY_STAT *mystat); +static int compress_write(ds_file_t *file, const void *buf, size_t len); +static int compress_close(ds_file_t *file); +static void compress_deinit(ds_ctxt_t *ctxt); + +datasink_t datasink_compress = { + &compress_init, + &compress_open, + &compress_write, + &compress_close, + &compress_deinit +}; + +static inline int write_uint32_le(ds_file_t *file, ulong n); +static inline int write_uint64_le(ds_file_t *file, ulonglong n); + +static comp_thread_ctxt_t *create_worker_threads(uint n); +static void destroy_worker_threads(comp_thread_ctxt_t *threads, uint n); +static void *compress_worker_thread_func(void *arg); + +static +ds_ctxt_t * +compress_init(const char *root) +{ + ds_ctxt_t *ctxt; + ds_compress_ctxt_t *compress_ctxt; + comp_thread_ctxt_t *threads; + + /* Create and initialize the worker threads */ + threads = create_worker_threads(xtrabackup_compress_threads); + if (threads == NULL) { + msg("compress: failed to create worker threads.\n"); + return NULL; + } + + ctxt = (ds_ctxt_t *) my_malloc(sizeof(ds_ctxt_t) + + sizeof(ds_compress_ctxt_t), + MYF(MY_FAE)); + + compress_ctxt = (ds_compress_ctxt_t *) (ctxt + 1); + compress_ctxt->threads = threads; + compress_ctxt->nthreads = xtrabackup_compress_threads; + + ctxt->ptr = compress_ctxt; + ctxt->root = my_strdup(root, MYF(MY_FAE)); + + return ctxt; +} + +static +ds_file_t * +compress_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *mystat) +{ + ds_compress_ctxt_t *comp_ctxt; + ds_ctxt_t *dest_ctxt; + ds_file_t *dest_file; + char new_name[FN_REFLEN]; + size_t name_len; + ds_file_t *file; + ds_compress_file_t *comp_file; + + xb_ad(ctxt->pipe_ctxt != NULL); + dest_ctxt = ctxt->pipe_ctxt; + + comp_ctxt = (ds_compress_ctxt_t *) ctxt->ptr; + + /* Append the .qp extension to the filename */ + fn_format(new_name, path, "", ".qp", MYF(MY_APPEND_EXT)); + + dest_file = ds_open(dest_ctxt, new_name, mystat); + if (dest_file == NULL) { + return NULL; + } + + /* Write the qpress archive header */ + if (ds_write(dest_file, "qpress10", 8) || + write_uint64_le(dest_file, COMPRESS_CHUNK_SIZE)) { + goto err; + } + + /* We are going to create a one-file "flat" (i.e. with no + subdirectories) archive. So strip the directory part from the path and + remove the '.qp' suffix. */ + fn_format(new_name, path, "", "", MYF(MY_REPLACE_DIR)); + + /* Write the qpress file header */ + name_len = strlen(new_name); + if (ds_write(dest_file, "F", 1) || + write_uint32_le(dest_file, (uint)name_len) || + /* we want to write the terminating \0 as well */ + ds_write(dest_file, new_name, name_len + 1)) { + goto err; + } + + file = (ds_file_t *) my_malloc(sizeof(ds_file_t) + + sizeof(ds_compress_file_t), + MYF(MY_FAE)); + comp_file = (ds_compress_file_t *) (file + 1); + comp_file->dest_file = dest_file; + comp_file->comp_ctxt = comp_ctxt; + comp_file->bytes_processed = 0; + + file->ptr = comp_file; + file->path = dest_file->path; + + return file; + +err: + ds_close(dest_file); + return NULL; +} + +static +int +compress_write(ds_file_t *file, const void *buf, size_t len) +{ + ds_compress_file_t *comp_file; + ds_compress_ctxt_t *comp_ctxt; + comp_thread_ctxt_t *threads; + comp_thread_ctxt_t *thd; + uint nthreads; + uint i; + const char *ptr; + ds_file_t *dest_file; + + comp_file = (ds_compress_file_t *) file->ptr; + comp_ctxt = comp_file->comp_ctxt; + dest_file = comp_file->dest_file; + + threads = comp_ctxt->threads; + nthreads = comp_ctxt->nthreads; + + ptr = (const char *) buf; + while (len > 0) { + uint max_thread; + + /* Send data to worker threads for compression */ + for (i = 0; i < nthreads; i++) { + size_t chunk_len; + + thd = threads + i; + + pthread_mutex_lock(&thd->ctrl_mutex); + + chunk_len = (len > COMPRESS_CHUNK_SIZE) ? + COMPRESS_CHUNK_SIZE : len; + thd->from = ptr; + thd->from_len = chunk_len; + + pthread_mutex_lock(&thd->data_mutex); + thd->data_avail = TRUE; + pthread_cond_signal(&thd->data_cond); + pthread_mutex_unlock(&thd->data_mutex); + + len -= chunk_len; + if (len == 0) { + break; + } + ptr += chunk_len; + } + + max_thread = (i < nthreads) ? i : nthreads - 1; + + /* Reap and stream the compressed data */ + for (i = 0; i <= max_thread; i++) { + thd = threads + i; + + pthread_mutex_lock(&thd->data_mutex); + while (thd->data_avail == TRUE) { + pthread_cond_wait(&thd->data_cond, + &thd->data_mutex); + } + + xb_a(threads[i].to_len > 0); + + if (ds_write(dest_file, "NEWBNEWB", 8) || + write_uint64_le(dest_file, + comp_file->bytes_processed)) { + msg("compress: write to the destination stream " + "failed.\n"); + return 1; + } + + comp_file->bytes_processed += threads[i].from_len; + + if (write_uint32_le(dest_file, threads[i].adler) || + ds_write(dest_file, threads[i].to, + threads[i].to_len)) { + msg("compress: write to the destination stream " + "failed.\n"); + return 1; + } + + pthread_mutex_unlock(&threads[i].data_mutex); + pthread_mutex_unlock(&threads[i].ctrl_mutex); + } + } + + return 0; +} + +static +int +compress_close(ds_file_t *file) +{ + ds_compress_file_t *comp_file; + ds_file_t *dest_file; + int rc; + + comp_file = (ds_compress_file_t *) file->ptr; + dest_file = comp_file->dest_file; + + /* Write the qpress file trailer */ + ds_write(dest_file, "ENDSENDS", 8); + + /* Supposedly the number of written bytes should be written as a + "recovery information" in the file trailer, but in reality qpress + always writes 8 zeros here. Let's do the same */ + + write_uint64_le(dest_file, 0); + + rc = ds_close(dest_file); + + my_free(file); + + return rc; +} + +static +void +compress_deinit(ds_ctxt_t *ctxt) +{ + ds_compress_ctxt_t *comp_ctxt; + + xb_ad(ctxt->pipe_ctxt != NULL); + + comp_ctxt = (ds_compress_ctxt_t *) ctxt->ptr;; + + destroy_worker_threads(comp_ctxt->threads, comp_ctxt->nthreads); + + my_free(ctxt->root); + my_free(ctxt); +} + +static inline +int +write_uint32_le(ds_file_t *file, ulong n) +{ + char tmp[4]; + + int4store(tmp, n); + return ds_write(file, tmp, sizeof(tmp)); +} + +static inline +int +write_uint64_le(ds_file_t *file, ulonglong n) +{ + char tmp[8]; + + int8store(tmp, n); + return ds_write(file, tmp, sizeof(tmp)); +} + +static +comp_thread_ctxt_t * +create_worker_threads(uint n) +{ + comp_thread_ctxt_t *threads; + uint i; + + threads = (comp_thread_ctxt_t *) + my_malloc(sizeof(comp_thread_ctxt_t) * n, MYF(MY_FAE)); + + for (i = 0; i < n; i++) { + comp_thread_ctxt_t *thd = threads + i; + + thd->num = i + 1; + thd->started = FALSE; + thd->cancelled = FALSE; + thd->data_avail = FALSE; + + thd->to = (char *) my_malloc(COMPRESS_CHUNK_SIZE + + MY_QLZ_COMPRESS_OVERHEAD, + MYF(MY_FAE)); + + /* Initialize the control mutex and condition var */ + if (pthread_mutex_init(&thd->ctrl_mutex, NULL) || + pthread_cond_init(&thd->ctrl_cond, NULL)) { + goto err; + } + + /* Initialize and data mutex and condition var */ + if (pthread_mutex_init(&thd->data_mutex, NULL) || + pthread_cond_init(&thd->data_cond, NULL)) { + goto err; + } + + pthread_mutex_lock(&thd->ctrl_mutex); + + if (pthread_create(&thd->id, NULL, compress_worker_thread_func, + thd)) { + msg("compress: pthread_create() failed: " + "errno = %d\n", errno); + goto err; + } + } + + /* Wait for the threads to start */ + for (i = 0; i < n; i++) { + comp_thread_ctxt_t *thd = threads + i; + + while (thd->started == FALSE) + pthread_cond_wait(&thd->ctrl_cond, &thd->ctrl_mutex); + pthread_mutex_unlock(&thd->ctrl_mutex); + } + + return threads; + +err: + return NULL; +} + +static +void +destroy_worker_threads(comp_thread_ctxt_t *threads, uint n) +{ + uint i; + + for (i = 0; i < n; i++) { + comp_thread_ctxt_t *thd = threads + i; + + pthread_mutex_lock(&thd->data_mutex); + threads[i].cancelled = TRUE; + pthread_cond_signal(&thd->data_cond); + pthread_mutex_unlock(&thd->data_mutex); + + pthread_join(thd->id, NULL); + + pthread_cond_destroy(&thd->data_cond); + pthread_mutex_destroy(&thd->data_mutex); + pthread_cond_destroy(&thd->ctrl_cond); + pthread_mutex_destroy(&thd->ctrl_mutex); + + my_free(thd->to); + } + + my_free(threads); +} + +static +void * +compress_worker_thread_func(void *arg) +{ + comp_thread_ctxt_t *thd = (comp_thread_ctxt_t *) arg; + + pthread_mutex_lock(&thd->ctrl_mutex); + + pthread_mutex_lock(&thd->data_mutex); + + thd->started = TRUE; + pthread_cond_signal(&thd->ctrl_cond); + + pthread_mutex_unlock(&thd->ctrl_mutex); + + while (1) { + thd->data_avail = FALSE; + pthread_cond_signal(&thd->data_cond); + + while (!thd->data_avail && !thd->cancelled) { + pthread_cond_wait(&thd->data_cond, &thd->data_mutex); + } + + if (thd->cancelled) + break; + + thd->to_len = qlz_compress(thd->from, thd->to, thd->from_len, + &thd->state); + + /* qpress uses 0x00010000 as the initial value, but its own + Adler-32 implementation treats the value differently: + 1. higher order bits are the sum of all bytes in the sequence + 2. lower order bits are the sum of resulting values at every + step. + So it's the other way around as compared to zlib's adler32(). + That's why 0x00000001 is being passed here to be compatible + with qpress implementation. */ + + thd->adler = adler32(0x00000001, (uchar *) thd->to, + (uInt)thd->to_len); + } + + pthread_mutex_unlock(&thd->data_mutex); + + return NULL; +} diff --git a/extra/mariabackup/ds_compress.h b/extra/mariabackup/ds_compress.h new file mode 100644 index 00000000000..8498c965e13 --- /dev/null +++ b/extra/mariabackup/ds_compress.h @@ -0,0 +1,28 @@ +/****************************************************** +Copyright (c) 2011-2013 Percona LLC and/or its affiliates. + +Compression interface for XtraBackup. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#ifndef DS_COMPRESS_H +#define DS_COMPRESS_H + +#include "datasink.h" + +extern datasink_t datasink_compress; + +#endif diff --git a/extra/mariabackup/ds_local.c b/extra/mariabackup/ds_local.c new file mode 100644 index 00000000000..3e2b1e0129b --- /dev/null +++ b/extra/mariabackup/ds_local.c @@ -0,0 +1,151 @@ +/****************************************************** +Copyright (c) 2011-2013 Percona LLC and/or its affiliates. + +Local datasink implementation for XtraBackup. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#include +#include +#include +#include "common.h" +#include "datasink.h" + +typedef struct { + File fd; +} ds_local_file_t; + +static ds_ctxt_t *local_init(const char *root); +static ds_file_t *local_open(ds_ctxt_t *ctxt, const char *path, + MY_STAT *mystat); +static int local_write(ds_file_t *file, const void *buf, size_t len); +static int local_close(ds_file_t *file); +static void local_deinit(ds_ctxt_t *ctxt); + +datasink_t datasink_local = { + &local_init, + &local_open, + &local_write, + &local_close, + &local_deinit +}; + +static +ds_ctxt_t * +local_init(const char *root) +{ + ds_ctxt_t *ctxt; + + if (my_mkdir(root, 0777, MYF(0)) < 0 + && my_errno != EEXIST && my_errno != EISDIR) + { + char errbuf[MYSYS_STRERROR_SIZE]; + my_strerror(errbuf, sizeof(errbuf),my_errno); + my_error(EE_CANT_MKDIR, MYF(ME_BELL | ME_WAITTANG), + root, my_errno,errbuf, my_errno); + return NULL; + } + + ctxt = my_malloc(sizeof(ds_ctxt_t), MYF(MY_FAE)); + + ctxt->root = my_strdup(root, MYF(MY_FAE)); + + return ctxt; +} + +static +ds_file_t * +local_open(ds_ctxt_t *ctxt, const char *path, + MY_STAT *mystat __attribute__((unused))) +{ + char fullpath[FN_REFLEN]; + char dirpath[FN_REFLEN]; + size_t dirpath_len; + size_t path_len; + ds_local_file_t *local_file; + ds_file_t *file; + File fd; + + fn_format(fullpath, path, ctxt->root, "", MYF(MY_RELATIVE_PATH)); + + /* Create the directory if needed */ + dirname_part(dirpath, fullpath, &dirpath_len); + if (my_mkdir(dirpath, 0777, MYF(0)) < 0 && my_errno != EEXIST) { + char errbuf[MYSYS_STRERROR_SIZE]; + my_strerror(errbuf, sizeof(errbuf), my_errno); + my_error(EE_CANT_MKDIR, MYF(ME_BELL | ME_WAITTANG), + dirpath, my_errno, errbuf); + return NULL; + } + + fd = my_create(fullpath, 0, O_WRONLY | O_BINARY | O_EXCL | O_NOFOLLOW, + MYF(MY_WME)); + if (fd < 0) { + return NULL; + } + + path_len = strlen(fullpath) + 1; /* terminating '\0' */ + + file = (ds_file_t *) my_malloc(sizeof(ds_file_t) + + sizeof(ds_local_file_t) + + path_len, + MYF(MY_FAE)); + local_file = (ds_local_file_t *) (file + 1); + + local_file->fd = fd; + + file->path = (char *) local_file + sizeof(ds_local_file_t); + memcpy(file->path, fullpath, path_len); + + file->ptr = local_file; + + return file; +} + +static +int +local_write(ds_file_t *file, const void *buf, size_t len) +{ + File fd = ((ds_local_file_t *) file->ptr)->fd; + + if (!my_write(fd, buf, len, MYF(MY_WME | MY_NABP))) { + posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED); + return 0; + } + + return 1; +} + +static +int +local_close(ds_file_t *file) +{ + File fd = ((ds_local_file_t *) file->ptr)->fd; + + my_free(file); + + my_sync(fd, MYF(MY_WME)); + + return my_close(fd, MYF(MY_WME)); +} + +static +void +local_deinit(ds_ctxt_t *ctxt) +{ + my_free(ctxt->root); + my_free(ctxt); +} diff --git a/extra/mariabackup/ds_local.h b/extra/mariabackup/ds_local.h new file mode 100644 index 00000000000..b0f0f04030c --- /dev/null +++ b/extra/mariabackup/ds_local.h @@ -0,0 +1,28 @@ +/****************************************************** +Copyright (c) 2011-2013 Percona LLC and/or its affiliates. + +Local datasink interface for XtraBackup. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#ifndef DS_LOCAL_H +#define DS_LOCAL_H + +#include "datasink.h" + +extern datasink_t datasink_local; + +#endif diff --git a/extra/mariabackup/ds_stdout.c b/extra/mariabackup/ds_stdout.c new file mode 100644 index 00000000000..91a514ddf64 --- /dev/null +++ b/extra/mariabackup/ds_stdout.c @@ -0,0 +1,121 @@ +/****************************************************** +Copyright (c) 2013 Percona LLC and/or its affiliates. + +Local datasink implementation for XtraBackup. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#include +#include +#include "common.h" +#include "datasink.h" + +typedef struct { + File fd; +} ds_stdout_file_t; + +static ds_ctxt_t *stdout_init(const char *root); +static ds_file_t *stdout_open(ds_ctxt_t *ctxt, const char *path, + MY_STAT *mystat); +static int stdout_write(ds_file_t *file, const void *buf, size_t len); +static int stdout_close(ds_file_t *file); +static void stdout_deinit(ds_ctxt_t *ctxt); + +datasink_t datasink_stdout = { + &stdout_init, + &stdout_open, + &stdout_write, + &stdout_close, + &stdout_deinit +}; + +static +ds_ctxt_t * +stdout_init(const char *root) +{ + ds_ctxt_t *ctxt; + + ctxt = my_malloc(sizeof(ds_ctxt_t), MYF(MY_FAE)); + + ctxt->root = my_strdup(root, MYF(MY_FAE)); + + return ctxt; +} + +static +ds_file_t * +stdout_open(ds_ctxt_t *ctxt __attribute__((unused)), + const char *path __attribute__((unused)), + MY_STAT *mystat __attribute__((unused))) +{ + ds_stdout_file_t *stdout_file; + ds_file_t *file; + size_t pathlen; + const char *fullpath = ""; + + pathlen = strlen(fullpath) + 1; + + file = (ds_file_t *) my_malloc(sizeof(ds_file_t) + + sizeof(ds_stdout_file_t) + + pathlen, + MYF(MY_FAE)); + stdout_file = (ds_stdout_file_t *) (file + 1); + + +#ifdef __WIN__ + setmode(fileno(stdout), _O_BINARY); +#endif + + stdout_file->fd = my_fileno(stdout); + + file->path = (char *) stdout_file + sizeof(ds_stdout_file_t); + memcpy(file->path, fullpath, pathlen); + + file->ptr = stdout_file; + + return file; +} + +static +int +stdout_write(ds_file_t *file, const void *buf, size_t len) +{ + File fd = ((ds_stdout_file_t *) file->ptr)->fd; + + if (!my_write(fd, buf, len, MYF(MY_WME | MY_NABP))) { + posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED); + return 0; + } + + return 1; +} + +static +int +stdout_close(ds_file_t *file) +{ + my_free(file); + + return 1; +} + +static +void +stdout_deinit(ds_ctxt_t *ctxt) +{ + my_free(ctxt->root); + my_free(ctxt); +} diff --git a/extra/mariabackup/ds_stdout.h b/extra/mariabackup/ds_stdout.h new file mode 100644 index 00000000000..58940264fef --- /dev/null +++ b/extra/mariabackup/ds_stdout.h @@ -0,0 +1,28 @@ +/****************************************************** +Copyright (c) 2013 Percona LLC and/or its affiliates. + +Local datasink interface for XtraBackup. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#ifndef DS_STDOUT_H +#define DS_STDOUT_H + +#include "datasink.h" + +extern datasink_t datasink_stdout; + +#endif diff --git a/extra/mariabackup/ds_tmpfile.c b/extra/mariabackup/ds_tmpfile.c new file mode 100644 index 00000000000..b039d83ba03 --- /dev/null +++ b/extra/mariabackup/ds_tmpfile.c @@ -0,0 +1,247 @@ +/****************************************************** +Copyright (c) 2012 Percona LLC and/or its affiliates. + +tmpfile datasink for XtraBackup. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +/* Do all writes to temporary files first, then pipe them to the specified +datasink in a serialized way in deinit(). */ + +#include +#include "common.h" +#include "datasink.h" + +typedef struct { + pthread_mutex_t mutex; + LIST *file_list; +} ds_tmpfile_ctxt_t; + +typedef struct { + LIST list; + File fd; + char *orig_path; + MY_STAT mystat; + ds_file_t *file; +} ds_tmp_file_t; + +static ds_ctxt_t *tmpfile_init(const char *root); +static ds_file_t *tmpfile_open(ds_ctxt_t *ctxt, const char *path, + MY_STAT *mystat); +static int tmpfile_write(ds_file_t *file, const void *buf, size_t len); +static int tmpfile_close(ds_file_t *file); +static void tmpfile_deinit(ds_ctxt_t *ctxt); + +datasink_t datasink_tmpfile = { + &tmpfile_init, + &tmpfile_open, + &tmpfile_write, + &tmpfile_close, + &tmpfile_deinit +}; + + +static ds_ctxt_t * +tmpfile_init(const char *root) +{ + ds_ctxt_t *ctxt; + ds_tmpfile_ctxt_t *tmpfile_ctxt; + + ctxt = my_malloc(sizeof(ds_ctxt_t) + sizeof(ds_tmpfile_ctxt_t), + MYF(MY_FAE)); + tmpfile_ctxt = (ds_tmpfile_ctxt_t *) (ctxt + 1); + tmpfile_ctxt->file_list = NULL; + if (pthread_mutex_init(&tmpfile_ctxt->mutex, NULL)) { + + my_free(ctxt); + return NULL; + } + + ctxt->ptr = tmpfile_ctxt; + ctxt->root = my_strdup(root, MYF(MY_FAE)); + + return ctxt; +} + +static ds_file_t * +tmpfile_open(ds_ctxt_t *ctxt, const char *path, + MY_STAT *mystat) +{ + ds_tmpfile_ctxt_t *tmpfile_ctxt; + char tmp_path[FN_REFLEN]; + ds_tmp_file_t *tmp_file; + ds_file_t *file; + size_t path_len; + File fd; + + /* Create a temporary file in tmpdir. The file will be automatically + removed on close. Code copied from mysql_tmpfile(). */ + fd = create_temp_file(tmp_path,xtrabackup_tmpdir, + "xbtemp", +#ifdef __WIN__ + O_BINARY | O_TRUNC | O_SEQUENTIAL | + O_TEMPORARY | O_SHORT_LIVED | +#endif /* __WIN__ */ + O_CREAT | O_EXCL | O_RDWR, + MYF(MY_WME)); + +#ifndef __WIN__ + if (fd >= 0) { + /* On Windows, open files cannot be removed, but files can be + created with the O_TEMPORARY flag to the same effect + ("delete on close"). */ + unlink(tmp_path); + } +#endif /* !__WIN__ */ + + if (fd < 0) { + return NULL; + } + + path_len = strlen(path) + 1; /* terminating '\0' */ + + file = (ds_file_t *) my_malloc(sizeof(ds_file_t) + + sizeof(ds_tmp_file_t) + path_len, + MYF(MY_FAE)); + + tmp_file = (ds_tmp_file_t *) (file + 1); + tmp_file->file = file; + memcpy(&tmp_file->mystat, mystat, sizeof(MY_STAT)); + /* Save a copy of 'path', since it may not be accessible later */ + tmp_file->orig_path = (char *) tmp_file + sizeof(ds_tmp_file_t); + + tmp_file->fd = fd; + memcpy(tmp_file->orig_path, path, path_len); + + /* Store the real temporary file name in file->path */ + file->path = my_strdup(tmp_path, MYF(MY_FAE)); + file->ptr = tmp_file; + + /* Store the file object in the list to be piped later */ + tmpfile_ctxt = (ds_tmpfile_ctxt_t *) ctxt->ptr; + tmp_file->list.data = tmp_file; + + pthread_mutex_lock(&tmpfile_ctxt->mutex); + tmpfile_ctxt->file_list = list_add(tmpfile_ctxt->file_list, + &tmp_file->list); + pthread_mutex_unlock(&tmpfile_ctxt->mutex); + + return file; +} + +static int +tmpfile_write(ds_file_t *file, const void *buf, size_t len) +{ + File fd = ((ds_tmp_file_t *) file->ptr)->fd; + + if (!my_write(fd, buf, len, MYF(MY_WME | MY_NABP))) { + posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED); + return 0; + } + + return 1; +} + +static int +tmpfile_close(ds_file_t *file) +{ + /* Do nothing -- we will close (and thus remove) the file after piping + it to the destination datasink in tmpfile_deinit(). */ + + my_free(file->path); + + return 0; +} + +static void +tmpfile_deinit(ds_ctxt_t *ctxt) +{ + LIST *list; + ds_tmpfile_ctxt_t *tmpfile_ctxt; + MY_STAT mystat; + ds_tmp_file_t *tmp_file; + ds_file_t *dst_file; + ds_ctxt_t *pipe_ctxt; + void *buf = NULL; + const size_t buf_size = 10 * 1024 * 1024; + size_t bytes; + size_t offset; + + pipe_ctxt = ctxt->pipe_ctxt; + xb_a(pipe_ctxt != NULL); + + buf = my_malloc(buf_size, MYF(MY_FAE)); + + tmpfile_ctxt = (ds_tmpfile_ctxt_t *) ctxt->ptr; + list = tmpfile_ctxt->file_list; + + /* Walk the files in the order they have been added */ + list = list_reverse(list); + while (list != NULL) { + tmp_file = list->data; + /* Stat the file to replace size and mtime on the original + * mystat struct */ + if (my_fstat(tmp_file->fd, &mystat, MYF(0))) { + msg("error: my_fstat() failed.\n"); + exit(EXIT_FAILURE); + } + tmp_file->mystat.st_size = mystat.st_size; + tmp_file->mystat.st_mtime = mystat.st_mtime; + + dst_file = ds_open(pipe_ctxt, tmp_file->orig_path, + &tmp_file->mystat); + if (dst_file == NULL) { + msg("error: could not stream a temporary file to " + "'%s'\n", tmp_file->orig_path); + exit(EXIT_FAILURE); + } + + /* copy to the destination datasink */ + posix_fadvise(tmp_file->fd, 0, 0, POSIX_FADV_SEQUENTIAL); + if (my_seek(tmp_file->fd, 0, SEEK_SET, MYF(0)) == + MY_FILEPOS_ERROR) { + msg("error: my_seek() failed for '%s', errno = %d.\n", + tmp_file->file->path, my_errno); + exit(EXIT_FAILURE); + } + offset = 0; + while ((bytes = my_read(tmp_file->fd, buf, buf_size, + MYF(MY_WME))) > 0) { + posix_fadvise(tmp_file->fd, offset, buf_size, POSIX_FADV_DONTNEED); + offset += buf_size; + if (ds_write(dst_file, buf, bytes)) { + msg("error: cannot write to stream for '%s'.\n", + tmp_file->orig_path); + exit(EXIT_FAILURE); + } + } + if (bytes == (size_t) -1) { + exit(EXIT_FAILURE); + } + + my_close(tmp_file->fd, MYF(MY_WME)); + ds_close(dst_file); + + list = list_rest(list); + my_free(tmp_file->file); + } + + pthread_mutex_destroy(&tmpfile_ctxt->mutex); + + my_free(buf); + my_free(ctxt->root); + my_free(ctxt); +} diff --git a/extra/mariabackup/ds_tmpfile.h b/extra/mariabackup/ds_tmpfile.h new file mode 100644 index 00000000000..c21f1a3f0b5 --- /dev/null +++ b/extra/mariabackup/ds_tmpfile.h @@ -0,0 +1,30 @@ +/****************************************************** +Copyright (c) 2012 Percona LLC and/or its affiliates. + +tmpfile datasink for XtraBackup. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#ifndef DS_TMPFILE_H +#define DS_TMPFILE_H + +#include "datasink.h" + +extern datasink_t datasink_tmpfile; + +extern MY_TMPDIR mysql_tmpdir_list; + +#endif diff --git a/extra/mariabackup/ds_xbstream.c b/extra/mariabackup/ds_xbstream.c new file mode 100644 index 00000000000..42924a72d7f --- /dev/null +++ b/extra/mariabackup/ds_xbstream.c @@ -0,0 +1,223 @@ +/****************************************************** +Copyright (c) 2011-2013 Percona LLC and/or its affiliates. + +Streaming implementation for XtraBackup. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#include +#include +#include "common.h" +#include "datasink.h" +#include "xbstream.h" + +typedef struct { + xb_wstream_t *xbstream; + ds_file_t *dest_file; + pthread_mutex_t mutex; +} ds_stream_ctxt_t; + +typedef struct { + xb_wstream_file_t *xbstream_file; + ds_stream_ctxt_t *stream_ctxt; +} ds_stream_file_t; + +/*********************************************************************** +General streaming interface */ + +static ds_ctxt_t *xbstream_init(const char *root); +static ds_file_t *xbstream_open(ds_ctxt_t *ctxt, const char *path, + MY_STAT *mystat); +static int xbstream_write(ds_file_t *file, const void *buf, size_t len); +static int xbstream_close(ds_file_t *file); +static void xbstream_deinit(ds_ctxt_t *ctxt); + +datasink_t datasink_xbstream = { + &xbstream_init, + &xbstream_open, + &xbstream_write, + &xbstream_close, + &xbstream_deinit +}; + +static +ssize_t +my_xbstream_write_callback(xb_wstream_file_t *f __attribute__((unused)), + void *userdata, const void *buf, size_t len) +{ + ds_stream_ctxt_t *stream_ctxt; + + stream_ctxt = (ds_stream_ctxt_t *) userdata; + + xb_ad(stream_ctxt != NULL); + xb_ad(stream_ctxt->dest_file != NULL); + + if (!ds_write(stream_ctxt->dest_file, buf, len)) { + return len; + } + return -1; +} + +static +ds_ctxt_t * +xbstream_init(const char *root __attribute__((unused))) +{ + ds_ctxt_t *ctxt; + ds_stream_ctxt_t *stream_ctxt; + xb_wstream_t *xbstream; + + ctxt = my_malloc(sizeof(ds_ctxt_t) + sizeof(ds_stream_ctxt_t), + MYF(MY_FAE)); + stream_ctxt = (ds_stream_ctxt_t *)(ctxt + 1); + + if (pthread_mutex_init(&stream_ctxt->mutex, NULL)) { + msg("xbstream_init: pthread_mutex_init() failed.\n"); + goto err; + } + + xbstream = xb_stream_write_new(); + if (xbstream == NULL) { + msg("xb_stream_write_new() failed.\n"); + goto err; + } + stream_ctxt->xbstream = xbstream; + stream_ctxt->dest_file = NULL; + + ctxt->ptr = stream_ctxt; + + return ctxt; + +err: + my_free(ctxt); + return NULL; +} + +static +ds_file_t * +xbstream_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *mystat) +{ + ds_file_t *file; + ds_stream_file_t *stream_file; + ds_stream_ctxt_t *stream_ctxt; + ds_ctxt_t *dest_ctxt; + xb_wstream_t *xbstream; + xb_wstream_file_t *xbstream_file; + + + xb_ad(ctxt->pipe_ctxt != NULL); + dest_ctxt = ctxt->pipe_ctxt; + + stream_ctxt = (ds_stream_ctxt_t *) ctxt->ptr; + + pthread_mutex_lock(&stream_ctxt->mutex); + if (stream_ctxt->dest_file == NULL) { + stream_ctxt->dest_file = ds_open(dest_ctxt, path, mystat); + if (stream_ctxt->dest_file == NULL) { + return NULL; + } + } + pthread_mutex_unlock(&stream_ctxt->mutex); + + file = (ds_file_t *) my_malloc(sizeof(ds_file_t) + + sizeof(ds_stream_file_t), + MYF(MY_FAE)); + stream_file = (ds_stream_file_t *) (file + 1); + + xbstream = stream_ctxt->xbstream; + + xbstream_file = xb_stream_write_open(xbstream, path, mystat, + stream_ctxt, + my_xbstream_write_callback); + + if (xbstream_file == NULL) { + msg("xb_stream_write_open() failed.\n"); + goto err; + } + + stream_file->xbstream_file = xbstream_file; + stream_file->stream_ctxt = stream_ctxt; + file->ptr = stream_file; + file->path = stream_ctxt->dest_file->path; + + return file; + +err: + if (stream_ctxt->dest_file) { + ds_close(stream_ctxt->dest_file); + stream_ctxt->dest_file = NULL; + } + my_free(file); + + return NULL; +} + +static +int +xbstream_write(ds_file_t *file, const void *buf, size_t len) +{ + ds_stream_file_t *stream_file; + xb_wstream_file_t *xbstream_file; + + + stream_file = (ds_stream_file_t *) file->ptr; + + xbstream_file = stream_file->xbstream_file; + + if (xb_stream_write_data(xbstream_file, buf, len)) { + msg("xb_stream_write_data() failed.\n"); + return 1; + } + + return 0; +} + +static +int +xbstream_close(ds_file_t *file) +{ + ds_stream_file_t *stream_file; + int rc = 0; + + stream_file = (ds_stream_file_t *)file->ptr; + + rc = xb_stream_write_close(stream_file->xbstream_file); + + my_free(file); + + return rc; +} + +static +void +xbstream_deinit(ds_ctxt_t *ctxt) +{ + ds_stream_ctxt_t *stream_ctxt; + + stream_ctxt = (ds_stream_ctxt_t *) ctxt->ptr; + + if (xb_stream_write_done(stream_ctxt->xbstream)) { + msg("xb_stream_done() failed.\n"); + } + + if (stream_ctxt->dest_file) { + ds_close(stream_ctxt->dest_file); + stream_ctxt->dest_file = NULL; + } + + pthread_mutex_destroy(&stream_ctxt->mutex); + + my_free(ctxt); +} diff --git a/extra/mariabackup/ds_xbstream.h b/extra/mariabackup/ds_xbstream.h new file mode 100644 index 00000000000..30f34ac8318 --- /dev/null +++ b/extra/mariabackup/ds_xbstream.h @@ -0,0 +1,28 @@ +/****************************************************** +Copyright (c) 2011-2013 Percona LLC and/or its affiliates. + +Streaming interface for XtraBackup. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#ifndef DS_XBSTREAM_H +#define DS_XBSTREAM_H + +#include "datasink.h" + +extern datasink_t datasink_xbstream; + +#endif diff --git a/extra/mariabackup/encryption_plugin.cc b/extra/mariabackup/encryption_plugin.cc new file mode 100644 index 00000000000..76512c185e2 --- /dev/null +++ b/extra/mariabackup/encryption_plugin.cc @@ -0,0 +1,157 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +extern struct st_maria_plugin *mysql_optional_plugins[]; +extern struct st_maria_plugin *mysql_mandatory_plugins[]; +static void encryption_plugin_init(int argc, char **argv); + +extern char *xb_plugin_load; +extern char *xb_plugin_dir; + +const int PLUGIN_MAX_ARGS = 1024; +std::vector backup_plugins_args; + +const char *QUERY_PLUGIN = +"SELECT plugin_name, plugin_library, @@plugin_dir" +" FROM information_schema.plugins WHERE plugin_type='ENCRYPTION'" +" AND plugin_status='ACTIVE'"; + +std::string encryption_plugin_config; + +static void add_to_plugin_load_list(const char *plugin_def) +{ + opt_plugin_load_list_ptr->push_back(new i_string(plugin_def)); +} + +static char XTRABACKUP_EXE[] = "xtrabackup"; + +void encryption_plugin_backup_init(MYSQL *mysql) +{ + MYSQL_RES *result; + MYSQL_ROW row; + std::ostringstream oss; + char *argv[PLUGIN_MAX_ARGS]; + int argc; + + result = xb_mysql_query(mysql, QUERY_PLUGIN, true, true); + row = mysql_fetch_row(result); + if (!row) + { + mysql_free_result(result); + return; + } + + char *name= row[0]; + char *library= row[1]; + char *dir= row[2]; + +#ifdef _WIN32 + for (char *p = dir; *p; p++) + if (*p == '\\') *p = '/'; +#endif + + std::string plugin_load(name); + if (library) + plugin_load += std::string("=") + library; + + oss << "plugin_load=" << plugin_load << std::endl; + + /* Required to load the plugin later.*/ + add_to_plugin_load_list(plugin_load.c_str()); + strncpy(opt_plugin_dir, dir, FN_REFLEN); + + oss << "plugin_dir=" << '"' << dir << '"' << std::endl; + + + /* Read plugin variables. */ + char query[1024]; + snprintf(query, 1024, "SHOW variables like '%s_%%'", name); + mysql_free_result(result); + + result = xb_mysql_query(mysql, query, true, true); + while ((row = mysql_fetch_row(result))) + { + std::string arg("--"); + arg += row[0]; + arg += "="; + arg += row[1]; + backup_plugins_args.push_back(arg); + oss << row[0] << "=" << row[1] << std::endl; + } + + mysql_free_result(result); + + /* Check whether to encrypt logs. */ + result = xb_mysql_query(mysql, "select @@innodb_encrypt_log", true, true); + row = mysql_fetch_row(result); + srv_encrypt_log = (row != 0 && row[0][0] == '1'); + oss << "innodb_encrypt_log=" << row[0] << std::endl; + + mysql_free_result(result); + + encryption_plugin_config = oss.str(); + + argc = 0; + argv[argc++] = XTRABACKUP_EXE; + for(size_t i = 0; i < backup_plugins_args.size(); i++) + { + argv[argc++] = (char *)backup_plugins_args[i].c_str(); + if (argc == PLUGIN_MAX_ARGS - 2) + break; + } + argv[argc] = 0; + + encryption_plugin_init(argc, argv); +} + +const char *encryption_plugin_get_config() +{ + return encryption_plugin_config.c_str(); +} + +extern int finalize_encryption_plugin(st_plugin_int *plugin); + + +void encryption_plugin_prepare_init(int argc, char **argv) +{ + + if (!xb_plugin_load) + { + finalize_encryption_plugin(0); + return; + } + + add_to_plugin_load_list(xb_plugin_load); + + if (xb_plugin_dir) + strncpy(opt_plugin_dir, xb_plugin_dir, FN_REFLEN); + + char **new_argv = new char *[argc + 1]; + new_argv[0] = XTRABACKUP_EXE; + memcpy(&new_argv[1], argv, argc*sizeof(char *)); + + encryption_plugin_init(argc+1, new_argv); + + delete[] new_argv; +} + +static void encryption_plugin_init(int argc, char **argv) +{ + /* Patch optional and mandatory plugins, we only need to load the one in xb_plugin_load. */ + mysql_optional_plugins[0] = mysql_mandatory_plugins[0] = 0; + msg("Loading encryption plugin\n"); + for (int i= 1; i < argc; i++) + msg("\t Encryption plugin parameter : '%s'\n", argv[i]); + plugin_init(&argc, argv, PLUGIN_INIT_SKIP_PLUGIN_TABLE); +} + diff --git a/extra/mariabackup/encryption_plugin.h b/extra/mariabackup/encryption_plugin.h new file mode 100644 index 00000000000..16d74790254 --- /dev/null +++ b/extra/mariabackup/encryption_plugin.h @@ -0,0 +1,7 @@ +#include +#include +extern void encryption_plugin_backup_init(MYSQL *mysql); +extern const char* encryption_plugin_get_config(); +extern void encryption_plugin_prepare_init(int argc, char **argv); + +//extern void encryption_plugin_init(int argc, char **argv); diff --git a/extra/mariabackup/fil_cur.cc b/extra/mariabackup/fil_cur.cc new file mode 100644 index 00000000000..03f4ce0d7a7 --- /dev/null +++ b/extra/mariabackup/fil_cur.cc @@ -0,0 +1,402 @@ +/****************************************************** +XtraBackup: hot backup tool for InnoDB +(c) 2009-2013 Percona LLC and/or its affiliates. +Originally Created 3/3/2009 Yasufumi Kinoshita +Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko, +Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +/* Source file cursor implementation */ + +#include + +#include +#include +#include +#include + +#include "fil_cur.h" +#include "common.h" +#include "read_filt.h" +#include "xtrabackup.h" +#include "xb0xb.h" + +/* Size of read buffer in pages (640 pages = 10M for 16K sized pages) */ +#define XB_FIL_CUR_PAGES 640 + +/*********************************************************************** +Extracts the relative path ("database/table.ibd") of a tablespace from a +specified possibly absolute path. + +For user tablespaces both "./database/table.ibd" and +"/remote/dir/database/table.ibd" result in "database/table.ibd". + +For system tablepsaces (i.e. When is_system is TRUE) both "/remote/dir/ibdata1" +and "./ibdata1" yield "ibdata1" in the output. */ +const char * +xb_get_relative_path( +/*=================*/ + const char* path, /*!< in: tablespace path (either + relative or absolute) */ + ibool is_system) /*!< in: TRUE for system tablespaces, + i.e. when only the filename must be + returned. */ +{ + const char *next; + const char *cur; + const char *prev; + + prev = NULL; + cur = path; + + while ((next = strchr(cur, OS_PATH_SEPARATOR)) != NULL) { + + prev = cur; + cur = next + 1; + } + + if (is_system) { + + return(cur); + } else { + + return((prev == NULL) ? cur : prev); + } + +} + +/**********************************************************************//** +Closes a file. */ +static +void +xb_fil_node_close_file( +/*===================*/ + fil_node_t* node) /*!< in: file node */ +{ + ibool ret; + + mutex_enter(&fil_system->mutex); + + ut_ad(node); + ut_a(node->n_pending == 0); + ut_a(node->n_pending_flushes == 0); + ut_a(!node->being_extended); + + if (!node->is_open()) { + + mutex_exit(&fil_system->mutex); + + return; + } + + ret = os_file_close(node->handle); + ut_a(ret); + + node->handle = OS_FILE_CLOSED; + + ut_a(fil_system->n_open > 0); + fil_system->n_open--; + fil_n_file_opened--; + + if (node->space->purpose == FIL_TYPE_TABLESPACE && + fil_is_user_tablespace_id(node->space->id)) { + + ut_a(UT_LIST_GET_LEN(fil_system->LRU) > 0); + + /* The node is in the LRU list, remove it */ + UT_LIST_REMOVE(fil_system->LRU, node); + } + + mutex_exit(&fil_system->mutex); +} + +/************************************************************************ +Open a source file cursor and initialize the associated read filter. + +@return XB_FIL_CUR_SUCCESS on success, XB_FIL_CUR_SKIP if the source file must +be skipped and XB_FIL_CUR_ERROR on error. */ +xb_fil_cur_result_t +xb_fil_cur_open( +/*============*/ + xb_fil_cur_t* cursor, /*!< out: source file cursor */ + xb_read_filt_t* read_filter, /*!< in/out: the read filter */ + fil_node_t* node, /*!< in: source tablespace node */ + uint thread_n) /*!< thread number for diagnostics */ +{ + bool success; + + /* Initialize these first so xb_fil_cur_close() handles them correctly + in case of error */ + cursor->orig_buf = NULL; + cursor->node = NULL; + + cursor->space_id = node->space->id; + + strncpy(cursor->abs_path, node->name, sizeof(cursor->abs_path)); + + /* Get the relative path for the destination tablespace name, i.e. the + one that can be appended to the backup root directory. Non-system + tablespaces may have absolute paths for DATA DIRECTORY. + We want to make "local" copies for the backup. */ + strncpy(cursor->rel_path, + xb_get_relative_path(cursor->abs_path, cursor->is_system()), + sizeof(cursor->rel_path)); + + /* In the backup mode we should already have a tablespace handle created + by fil_ibd_load() unless it is a system + tablespace. Otherwise we open the file here. */ + if (cursor->is_system() || srv_operation == SRV_OPERATION_RESTORE_DELTA + || xb_close_files) { + node->handle = os_file_create_simple_no_error_handling( + 0, node->name, + OS_FILE_OPEN, + OS_FILE_READ_ALLOW_DELETE, true, &success); + if (!success) { + /* The following call prints an error message */ + os_file_get_last_error(TRUE); + + msg("[%02u] xtrabackup: error: cannot open " + "tablespace %s\n", + thread_n, cursor->abs_path); + + return(XB_FIL_CUR_ERROR); + } + mutex_enter(&fil_system->mutex); + + fil_system->n_open++; + fil_n_file_opened++; + + if (node->space->purpose == FIL_TYPE_TABLESPACE && + fil_is_user_tablespace_id(node->space->id)) { + + /* Put the node to the LRU list */ + UT_LIST_ADD_FIRST(fil_system->LRU, node); + } + + mutex_exit(&fil_system->mutex); + } + + ut_ad(node->is_open()); + + cursor->node = node; + cursor->file = node->handle; + + if (stat(cursor->abs_path, &cursor->statinfo)) { + msg("[%02u] xtrabackup: error: cannot stat %s\n", + thread_n, cursor->abs_path); + + xb_fil_cur_close(cursor); + + return(XB_FIL_CUR_ERROR); + } + + if (srv_file_flush_method == SRV_O_DIRECT + || srv_file_flush_method == SRV_O_DIRECT_NO_FSYNC) { + + os_file_set_nocache(cursor->file, node->name, "OPEN"); + } + + posix_fadvise(cursor->file, 0, 0, POSIX_FADV_SEQUENTIAL); + + /* Determine the page size */ + ulint flags = xb_get_space_flags(cursor->file); + if (flags == ULINT_UNDEFINED) { + xb_fil_cur_close(cursor); + return(XB_FIL_CUR_SKIP); + } + + if (!fsp_flags_is_valid(flags, cursor->space_id)) { + ulint cflags = fsp_flags_convert_from_101(flags); + if (cflags == ULINT_UNDEFINED) { + msg("[%02u] xtrabackup: Error: Invalid " + "tablespace flags: %x.\n", thread_n, uint(flags)); + return(XB_FIL_CUR_SKIP); + } + flags = cflags; + } + + const page_size_t page_size(flags); + cursor->page_size = page_size; + + /* Allocate read buffer */ + cursor->buf_size = XB_FIL_CUR_PAGES * page_size.physical(); + cursor->orig_buf = static_cast + (malloc(cursor->buf_size + UNIV_PAGE_SIZE)); + cursor->buf = static_cast + (ut_align(cursor->orig_buf, UNIV_PAGE_SIZE)); + + cursor->buf_read = 0; + cursor->buf_npages = 0; + cursor->buf_offset = 0; + cursor->buf_page_no = 0; + cursor->thread_n = thread_n; + + cursor->space_size = (ulint)(cursor->statinfo.st_size + / page_size.physical()); + + cursor->read_filter = read_filter; + cursor->read_filter->init(&cursor->read_filter_ctxt, cursor, + node->space->id); + + return(XB_FIL_CUR_SUCCESS); +} + +/************************************************************************ +Reads and verifies the next block of pages from the source +file. Positions the cursor after the last read non-corrupted page. + +@return XB_FIL_CUR_SUCCESS if some have been read successfully, XB_FIL_CUR_EOF +if there are no more pages to read and XB_FIL_CUR_ERROR on error. */ +xb_fil_cur_result_t +xb_fil_cur_read( +/*============*/ + xb_fil_cur_t* cursor) /*!< in/out: source file cursor */ +{ + ibool success; + byte* page; + ulint i; + ulint npages; + ulint retry_count; + xb_fil_cur_result_t ret; + ib_int64_t offset; + ib_int64_t to_read; + const ulint page_size = cursor->page_size.physical(); + xb_ad(!cursor->is_system() || page_size == UNIV_PAGE_SIZE); + + cursor->read_filter->get_next_batch(&cursor->read_filter_ctxt, + &offset, &to_read); + + if (to_read == 0LL) { + return(XB_FIL_CUR_EOF); + } + + if (to_read > (ib_int64_t) cursor->buf_size) { + to_read = (ib_int64_t) cursor->buf_size; + } + + xb_a(to_read > 0 && to_read <= 0xFFFFFFFFLL); + + if ((to_read & ~(page_size - 1)) + && offset + to_read == cursor->statinfo.st_size) { + + if (to_read < (ib_int64_t) page_size) { + msg("[%02u] xtrabackup: Warning: junk at the end of " + "%s:\n", cursor->thread_n, cursor->abs_path); + msg("[%02u] xtrabackup: Warning: offset = %llu, " + "to_read = %llu\n", + cursor->thread_n, + (unsigned long long) offset, + (unsigned long long) to_read); + + return(XB_FIL_CUR_EOF); + } + + to_read = (ib_int64_t) (((ulint) to_read) & + ~(page_size - 1)); + } + + xb_a((to_read & (page_size - 1)) == 0); + + npages = (ulint) (to_read / cursor->page_size.physical()); + + retry_count = 10; + ret = XB_FIL_CUR_SUCCESS; + +read_retry: + xtrabackup_io_throttling(); + + cursor->buf_read = 0; + cursor->buf_npages = 0; + cursor->buf_offset = offset; + cursor->buf_page_no = (ulint)(offset / cursor->page_size.physical()); + + FilSpace space(cursor->space_id); + + if (!space()) { + return(XB_FIL_CUR_ERROR); + } + + success = os_file_read(IORequestRead, + cursor->file, cursor->buf, offset, + (ulint) to_read); + if (!success) { + return(XB_FIL_CUR_ERROR); + } + + /* check pages for corruption and re-read if necessary. i.e. in case of + partially written pages */ + for (page = cursor->buf, i = 0; i < npages; + page += page_size, i++) { + ulint page_no = cursor->buf_page_no + i; + + if (cursor->space_id == TRX_SYS_SPACE && + page_no >= FSP_EXTENT_SIZE && + page_no < FSP_EXTENT_SIZE * 3) { + /* We ignore the doublewrite buffer pages */ + } else if (!fil_space_verify_crypt_checksum( + page, cursor->page_size, space->id, page_no) + && buf_page_is_corrupted(true, page, + cursor->page_size, + space)) { + retry_count--; + if (retry_count == 0) { + msg("[%02u] xtrabackup: " + "Error: failed to read page after " + "10 retries. File %s seems to be " + "corrupted.\n", cursor->thread_n, + cursor->abs_path); + ret = XB_FIL_CUR_ERROR; + break; + } + + if (retry_count == 9) { + msg("[%02u] xtrabackup: " + "Database page corruption detected at page " + ULINTPF ", retrying...\n", + cursor->thread_n, page_no); + } + + os_thread_sleep(100000); + + goto read_retry; + } + cursor->buf_read += page_size; + cursor->buf_npages++; + } + + posix_fadvise(cursor->file, offset, to_read, POSIX_FADV_DONTNEED); + + return(ret); +} + +/************************************************************************ +Close the source file cursor opened with xb_fil_cur_open() and its +associated read filter. */ +void +xb_fil_cur_close( +/*=============*/ + xb_fil_cur_t *cursor) /*!< in/out: source file cursor */ +{ + cursor->read_filter->deinit(&cursor->read_filter_ctxt); + + free(cursor->orig_buf); + + if (cursor->node != NULL) { + xb_fil_node_close_file(cursor->node); + cursor->file = OS_FILE_CLOSED; + } +} diff --git a/extra/mariabackup/fil_cur.h b/extra/mariabackup/fil_cur.h new file mode 100644 index 00000000000..e3f356a346c --- /dev/null +++ b/extra/mariabackup/fil_cur.h @@ -0,0 +1,128 @@ +/****************************************************** +XtraBackup: hot backup tool for InnoDB +(c) 2009-2013 Percona LLC and/or its affiliates. +Originally Created 3/3/2009 Yasufumi Kinoshita +Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko, +Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +/* Source file cursor interface */ + +#ifndef FIL_CUR_H +#define FIL_CUR_H + +#include +#include "read_filt.h" +#include "srv0start.h" + +struct xb_fil_cur_t { + pfs_os_file_t file; /*!< source file handle */ + fil_node_t* node; /*!< source tablespace node */ + char rel_path[FN_REFLEN]; + /*!< normalized file path */ + char abs_path[FN_REFLEN]; + /*!< absolute file path */ + MY_STAT statinfo; /*!< information about the file */ + page_size_t page_size; /*!< page size */ + xb_read_filt_t* read_filter; /*!< read filter */ + xb_read_filt_ctxt_t read_filter_ctxt; + /*!< read filter context */ + byte* orig_buf; /*!< read buffer */ + byte* buf; /*!< aligned pointer for orig_buf */ + size_t buf_size; /*!< buffer size in bytes */ + size_t buf_read; /*!< number of read bytes in buffer + after the last cursor read */ + size_t buf_npages; /*!< number of pages in buffer after the + last cursor read */ + ib_int64_t buf_offset; /*!< file offset of the first page in + buffer */ + ulint buf_page_no; /*!< number of the first page in + buffer */ + uint thread_n; /*!< thread number for diagnostics */ + ulint space_id; /*!< ID of tablespace */ + ulint space_size; /*!< space size in pages */ + + /** TODO: remove this default constructor */ + xb_fil_cur_t() : page_size(0), read_filter_ctxt() {} + + /** @return whether this is not a file-per-table tablespace */ + bool is_system() const + { + ut_ad(space_id != SRV_TMP_SPACE_ID); + return(space_id == TRX_SYS_SPACE + || srv_is_undo_tablespace(space_id)); + } +}; + +typedef enum { + XB_FIL_CUR_SUCCESS, + XB_FIL_CUR_SKIP, + XB_FIL_CUR_ERROR, + XB_FIL_CUR_EOF +} xb_fil_cur_result_t; + +/************************************************************************ +Open a source file cursor and initialize the associated read filter. + +@return XB_FIL_CUR_SUCCESS on success, XB_FIL_CUR_SKIP if the source file must +be skipped and XB_FIL_CUR_ERROR on error. */ +xb_fil_cur_result_t +xb_fil_cur_open( +/*============*/ + xb_fil_cur_t* cursor, /*!< out: source file cursor */ + xb_read_filt_t* read_filter, /*!< in/out: the read filter */ + fil_node_t* node, /*!< in: source tablespace node */ + uint thread_n); /*!< thread number for diagnostics */ + +/************************************************************************ +Reads and verifies the next block of pages from the source +file. Positions the cursor after the last read non-corrupted page. + +@return XB_FIL_CUR_SUCCESS if some have been read successfully, XB_FIL_CUR_EOF +if there are no more pages to read and XB_FIL_CUR_ERROR on error. */ +xb_fil_cur_result_t +xb_fil_cur_read( +/*============*/ + xb_fil_cur_t* cursor); /*!< in/out: source file cursor */ + +/************************************************************************ +Close the source file cursor opened with xb_fil_cur_open() and its +associated read filter. */ +void +xb_fil_cur_close( +/*=============*/ + xb_fil_cur_t *cursor); /*!< in/out: source file cursor */ + +/*********************************************************************** +Extracts the relative path ("database/table.ibd") of a tablespace from a +specified possibly absolute path. + +For user tablespaces both "./database/table.ibd" and +"/remote/dir/database/table.ibd" result in "database/table.ibd". + +For system tablepsaces (i.e. When is_system is TRUE) both "/remote/dir/ibdata1" +and "./ibdata1" yield "ibdata1" in the output. */ +const char * +xb_get_relative_path( +/*=================*/ + const char* path, /*!< in: tablespace path (either + relative or absolute) */ + ibool is_system); /*!< in: TRUE for system tablespaces, + i.e. when only the filename must be + returned. */ + +#endif diff --git a/extra/mariabackup/innobackupex.cc b/extra/mariabackup/innobackupex.cc new file mode 100644 index 00000000000..c15e02cdff3 --- /dev/null +++ b/extra/mariabackup/innobackupex.cc @@ -0,0 +1,1012 @@ +/****************************************************** +hot backup tool for InnoDB +(c) 2009-2015 Percona LLC and/or its affiliates +Originally Created 3/3/2009 Yasufumi Kinoshita +Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko, +Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +******************************************************* + +This file incorporates work covered by the following copyright and +permission notice: + +Copyright (c) 2000, 2011, MySQL AB & Innobase Oy. All Rights Reserved. + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 59 Temple +Place, Suite 330, Boston, MA 02111-1307 USA + +*******************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "common.h" +#include "innobackupex.h" +#include "xtrabackup.h" +#include "xbstream.h" +#include "fil_cur.h" +#include "write_filt.h" +#include "backup_copy.h" + +using std::min; +using std::max; + +/* options */ +my_bool opt_ibx_version = FALSE; +my_bool opt_ibx_help = FALSE; +my_bool opt_ibx_apply_log = FALSE; +my_bool opt_ibx_incremental = FALSE; +my_bool opt_ibx_notimestamp = FALSE; + +my_bool opt_ibx_copy_back = FALSE; +my_bool opt_ibx_move_back = FALSE; +my_bool opt_ibx_galera_info = FALSE; +my_bool opt_ibx_slave_info = FALSE; +my_bool opt_ibx_no_lock = FALSE; +my_bool opt_ibx_safe_slave_backup = FALSE; +my_bool opt_ibx_rsync = FALSE; +my_bool opt_ibx_force_non_empty_dirs = FALSE; +my_bool opt_ibx_noversioncheck = FALSE; +my_bool opt_ibx_no_backup_locks = FALSE; +my_bool opt_ibx_decompress = FALSE; + +char *opt_ibx_incremental_history_name = NULL; +char *opt_ibx_incremental_history_uuid = NULL; + +char *opt_ibx_user = NULL; +char *opt_ibx_password = NULL; +char *opt_ibx_host = NULL; +char *opt_ibx_defaults_group = NULL; +char *opt_ibx_socket = NULL; +uint opt_ibx_port = 0; + +ulong opt_ibx_lock_wait_query_type; +ulong opt_ibx_kill_long_query_type; + +uint opt_ibx_kill_long_queries_timeout = 0; +uint opt_ibx_lock_wait_timeout = 0; +uint opt_ibx_lock_wait_threshold = 0; +uint opt_ibx_debug_sleep_before_unlock = 0; +uint opt_ibx_safe_slave_backup_timeout = 0; + +const char *opt_ibx_history = NULL; + +char *opt_ibx_include = NULL; +char *opt_ibx_databases = NULL; +bool ibx_partial_backup = false; + +char *ibx_position_arg = NULL; +char *ibx_backup_directory = NULL; + +/* copy of proxied xtrabackup options */ +my_bool ibx_xb_close_files; +const char *ibx_xtrabackup_compress_alg; +uint ibx_xtrabackup_compress_threads; +ulonglong ibx_xtrabackup_compress_chunk_size; +my_bool ibx_xtrabackup_export; +char *ibx_xtrabackup_extra_lsndir; +char *ibx_xtrabackup_incremental_basedir; +char *ibx_xtrabackup_incremental_dir; +my_bool ibx_xtrabackup_incremental_force_scan; +ulint ibx_xtrabackup_log_copy_interval; +char *ibx_xtrabackup_incremental; +int ibx_xtrabackup_parallel; +char *ibx_xtrabackup_stream_str; +char *ibx_xtrabackup_tables_file; +long ibx_xtrabackup_throttle; +char *ibx_opt_mysql_tmpdir; +longlong ibx_xtrabackup_use_memory; + + +static inline int ibx_msg(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2); +static inline int ibx_msg(const char *fmt, ...) +{ + int result; + time_t t = time(NULL); + char date[100]; + char *line; + va_list args; + + strftime(date, sizeof(date), "%y%m%d %H:%M:%S", localtime(&t)); + + va_start(args, fmt); + + result = vasprintf(&line, fmt, args); + + va_end(args); + + if (result != -1) { + result = fprintf(stderr, "%s %s: %s", + date, INNOBACKUPEX_BIN_NAME, line); + free(line); + } + + return result; +} + +enum innobackupex_options +{ + OPT_APPLY_LOG = 256, + OPT_COPY_BACK, + OPT_MOVE_BACK, + OPT_REDO_ONLY, + OPT_GALERA_INFO, + OPT_SLAVE_INFO, + OPT_INCREMENTAL, + OPT_INCREMENTAL_HISTORY_NAME, + OPT_INCREMENTAL_HISTORY_UUID, + OPT_LOCK_WAIT_QUERY_TYPE, + OPT_KILL_LONG_QUERY_TYPE, + OPT_KILL_LONG_QUERIES_TIMEOUT, + OPT_LOCK_WAIT_TIMEOUT, + OPT_LOCK_WAIT_THRESHOLD, + OPT_DEBUG_SLEEP_BEFORE_UNLOCK, + OPT_NO_LOCK, + OPT_SAFE_SLAVE_BACKUP, + OPT_SAFE_SLAVE_BACKUP_TIMEOUT, + OPT_RSYNC, + OPT_HISTORY, + OPT_INCLUDE, + OPT_FORCE_NON_EMPTY_DIRS, + OPT_NO_TIMESTAMP, + OPT_NO_VERSION_CHECK, + OPT_NO_BACKUP_LOCKS, + OPT_DATABASES, + OPT_DECOMPRESS, + + /* options wich are passed directly to xtrabackup */ + OPT_CLOSE_FILES, + OPT_COMPACT, + OPT_COMPRESS, + OPT_COMPRESS_THREADS, + OPT_COMPRESS_CHUNK_SIZE, + OPT_EXPORT, + OPT_EXTRA_LSNDIR, + OPT_INCREMENTAL_BASEDIR, + OPT_INCREMENTAL_DIR, + OPT_INCREMENTAL_FORCE_SCAN, + OPT_LOG_COPY_INTERVAL, + OPT_PARALLEL, + OPT_REBUILD_INDEXES, + OPT_REBUILD_THREADS, + OPT_STREAM, + OPT_TABLES_FILE, + OPT_THROTTLE, + OPT_USE_MEMORY +}; + +ibx_mode_t ibx_mode = IBX_MODE_BACKUP; + +static struct my_option ibx_long_options[] = +{ + {"version", 'v', "print xtrabackup version information", + (uchar *) &opt_ibx_version, (uchar *) &opt_ibx_version, 0, + GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"help", '?', "This option displays a help screen and exits.", + (uchar *) &opt_ibx_help, (uchar *) &opt_ibx_help, 0, + GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"apply-log", OPT_APPLY_LOG, "Prepare a backup in BACKUP-DIR by " + "applying the redo log 'ib_logfile0' and creating new redo log. " + "The InnoDB configuration is read from the file \"backup-my.cnf\".", + (uchar*) &opt_ibx_apply_log, (uchar*) &opt_ibx_apply_log, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"copy-back", OPT_COPY_BACK, "Copy all the files in a previously made " + "backup from the backup directory to their original locations.", + (uchar *) &opt_ibx_copy_back, (uchar *) &opt_ibx_copy_back, 0, + GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"move-back", OPT_MOVE_BACK, "Move all the files in a previously made " + "backup from the backup directory to the actual datadir location. " + "Use with caution, as it removes backup files.", + (uchar *) &opt_ibx_move_back, (uchar *) &opt_ibx_move_back, 0, + GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"galera-info", OPT_GALERA_INFO, "This options creates the " + "xtrabackup_galera_info file which contains the local node state at " + "the time of the backup. Option should be used when performing the " + "backup of Percona-XtraDB-Cluster. Has no effect when backup locks " + "are used to create the backup.", + (uchar *) &opt_ibx_galera_info, (uchar *) &opt_ibx_galera_info, 0, + GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"slave-info", OPT_SLAVE_INFO, "This option is useful when backing " + "up a replication slave server. It prints the binary log position " + "and name of the master server. It also writes this information to " + "the \"xtrabackup_slave_info\" file as a \"CHANGE MASTER\" command. " + "A new slave for this master can be set up by starting a slave server " + "on this backup and issuing a \"CHANGE MASTER\" command with the " + "binary log position saved in the \"xtrabackup_slave_info\" file.", + (uchar *) &opt_ibx_slave_info, (uchar *) &opt_ibx_slave_info, 0, + GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"incremental", OPT_INCREMENTAL, "This option tells xtrabackup to " + "create an incremental backup, rather than a full one. It is passed " + "to the xtrabackup child process. When this option is specified, " + "either --incremental-lsn or --incremental-basedir can also be given. " + "If neither option is given, option --incremental-basedir is passed " + "to xtrabackup by default, set to the first timestamped backup " + "directory in the backup base directory.", + (uchar *) &opt_ibx_incremental, (uchar *) &opt_ibx_incremental, 0, + GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"no-lock", OPT_NO_LOCK, "Use this option to disable table lock " + "with \"FLUSH TABLES WITH READ LOCK\". Use it only if ALL your " + "tables are InnoDB and you DO NOT CARE about the binary log " + "position of the backup. This option shouldn't be used if there " + "are any DDL statements being executed or if any updates are " + "happening on non-InnoDB tables (this includes the system MyISAM " + "tables in the mysql database), otherwise it could lead to an " + "inconsistent backup. If you are considering to use --no-lock " + "because your backups are failing to acquire the lock, this could " + "be because of incoming replication events preventing the lock " + "from succeeding. Please try using --safe-slave-backup to " + "momentarily stop the replication slave thread, this may help " + "the backup to succeed and you then don't need to resort to " + "using this option.", + (uchar *) &opt_ibx_no_lock, (uchar *) &opt_ibx_no_lock, 0, + GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"safe-slave-backup", OPT_SAFE_SLAVE_BACKUP, "Stop slave SQL thread " + "and wait to start backup until Slave_open_temp_tables in " + "\"SHOW STATUS\" is zero. If there are no open temporary tables, " + "the backup will take place, otherwise the SQL thread will be " + "started and stopped until there are no open temporary tables. " + "The backup will fail if Slave_open_temp_tables does not become " + "zero after --safe-slave-backup-timeout seconds. The slave SQL " + "thread will be restarted when the backup finishes.", + (uchar *) &opt_ibx_safe_slave_backup, + (uchar *) &opt_ibx_safe_slave_backup, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"rsync", OPT_RSYNC, "Uses the rsync utility to optimize local file " + "transfers. When this option is specified, innobackupex uses rsync " + "to copy all non-InnoDB files instead of spawning a separate cp for " + "each file, which can be much faster for servers with a large number " + "of databases or tables. This option cannot be used together with " + "--stream.", + (uchar *) &opt_ibx_rsync, (uchar *) &opt_ibx_rsync, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"force-non-empty-directories", OPT_FORCE_NON_EMPTY_DIRS, "This " + "option, when specified, makes --copy-back or --move-back transfer " + "files to non-empty directories. Note that no existing files will be " + "overwritten. If --copy-back or --nove-back has to copy a file from " + "the backup directory which already exists in the destination " + "directory, it will still fail with an error.", + (uchar *) &opt_ibx_force_non_empty_dirs, + (uchar *) &opt_ibx_force_non_empty_dirs, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"no-timestamp", OPT_NO_TIMESTAMP, "This option prevents creation of a " + "time-stamped subdirectory of the BACKUP-ROOT-DIR given on the " + "command line. When it is specified, the backup is done in " + "BACKUP-ROOT-DIR instead.", + (uchar *) &opt_ibx_notimestamp, + (uchar *) &opt_ibx_notimestamp, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"no-version-check", OPT_NO_VERSION_CHECK, "This option disables the " + "version check which is enabled by the --version-check option.", + (uchar *) &opt_ibx_noversioncheck, + (uchar *) &opt_ibx_noversioncheck, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"no-backup-locks", OPT_NO_BACKUP_LOCKS, "This option controls if " + "backup locks should be used instead of FLUSH TABLES WITH READ LOCK " + "on the backup stage. The option has no effect when backup locks are " + "not supported by the server. This option is enabled by default, " + "disable with --no-backup-locks.", + (uchar *) &opt_ibx_no_backup_locks, + (uchar *) &opt_ibx_no_backup_locks, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"decompress", OPT_DECOMPRESS, "Decompresses all files with the .qp " + "extension in a backup previously made with the --compress option.", + (uchar *) &opt_ibx_decompress, + (uchar *) &opt_ibx_decompress, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"user", 'u', "This option specifies the MySQL username used " + "when connecting to the server, if that's not the current user. " + "The option accepts a string argument. See mysql --help for details.", + (uchar*) &opt_ibx_user, (uchar*) &opt_ibx_user, 0, GET_STR, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"host", 'H', "This option specifies the host to use when " + "connecting to the database server with TCP/IP. The option accepts " + "a string argument. See mysql --help for details.", + (uchar*) &opt_ibx_host, (uchar*) &opt_ibx_host, 0, GET_STR, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"port", 'P', "This option specifies the port to use when " + "connecting to the database server with TCP/IP. The option accepts " + "a string argument. See mysql --help for details.", + &opt_ibx_port, &opt_ibx_port, 0, GET_UINT, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + + {"password", 'p', "This option specifies the password to use " + "when connecting to the database. It accepts a string argument. " + "See mysql --help for details.", + 0, 0, 0, GET_STR, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"socket", 'S', "This option specifies the socket to use when " + "connecting to the local database server with a UNIX domain socket. " + "The option accepts a string argument. See mysql --help for details.", + (uchar*) &opt_ibx_socket, (uchar*) &opt_ibx_socket, 0, GET_STR, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"incremental-history-name", OPT_INCREMENTAL_HISTORY_NAME, + "This option specifies the name of the backup series stored in the " + "PERCONA_SCHEMA.xtrabackup_history history record to base an " + "incremental backup on. Xtrabackup will search the history table " + "looking for the most recent (highest innodb_to_lsn), successful " + "backup in the series and take the to_lsn value to use as the " + "starting lsn for the incremental backup. This will be mutually " + "exclusive with --incremental-history-uuid, --incremental-basedir " + "and --incremental-lsn. If no valid lsn can be found (no series by " + "that name, no successful backups by that name) xtrabackup will " + "return with an error. It is used with the --incremental option.", + (uchar*) &opt_ibx_incremental_history_name, + (uchar*) &opt_ibx_incremental_history_name, 0, GET_STR, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"incremental-history-uuid", OPT_INCREMENTAL_HISTORY_UUID, + "This option specifies the UUID of the specific history record " + "stored in the PERCONA_SCHEMA.xtrabackup_history to base an " + "incremental backup on. --incremental-history-name, " + "--incremental-basedir and --incremental-lsn. If no valid lsn can be " + "found (no success record with that uuid) xtrabackup will return " + "with an error. It is used with the --incremental option.", + (uchar*) &opt_ibx_incremental_history_uuid, + (uchar*) &opt_ibx_incremental_history_uuid, 0, GET_STR, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"ftwrl-wait-query-type", OPT_LOCK_WAIT_QUERY_TYPE, + "This option specifies which types of queries are allowed to complete " + "before innobackupex will issue the global lock. Default is all.", + (uchar*) &opt_ibx_lock_wait_query_type, + (uchar*) &opt_ibx_lock_wait_query_type, &query_type_typelib, + GET_ENUM, REQUIRED_ARG, QUERY_TYPE_ALL, 0, 0, 0, 0, 0}, + + {"kill-long-query-type", OPT_KILL_LONG_QUERY_TYPE, + "This option specifies which types of queries should be killed to " + "unblock the global lock. Default is \"all\".", + (uchar*) &opt_ibx_kill_long_query_type, + (uchar*) &opt_ibx_kill_long_query_type, &query_type_typelib, + GET_ENUM, REQUIRED_ARG, QUERY_TYPE_SELECT, 0, 0, 0, 0, 0}, + + {"history", OPT_HISTORY, + "This option enables the tracking of backup history in the " + "PERCONA_SCHEMA.xtrabackup_history table. An optional history " + "series name may be specified that will be placed with the history " + "record for the current backup being taken.", + NULL, NULL, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, + + {"include", OPT_INCLUDE, + "This option is a regular expression to be matched against table " + "names in databasename.tablename format. It is passed directly to " + "xtrabackup's --tables option. See the xtrabackup documentation for " + "details.", + (uchar*) &opt_ibx_include, + (uchar*) &opt_ibx_include, 0, GET_STR, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"databases", OPT_DATABASES, + "This option specifies the list of databases that innobackupex should " + "back up. The option accepts a string argument or path to file that " + "contains the list of databases to back up. The list is of the form " + "\"databasename1[.table_name1] databasename2[.table_name2] . . .\". " + "If this option is not specified, all databases containing MyISAM and " + "InnoDB tables will be backed up. Please make sure that --databases " + "contains all of the InnoDB databases and tables, so that all of the " + "innodb.frm files are also backed up. In case the list is very long, " + "this can be specified in a file, and the full path of the file can " + "be specified instead of the list. (See option --tables-file.)", + (uchar*) &opt_ibx_databases, + (uchar*) &opt_ibx_databases, 0, GET_STR, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"kill-long-queries-timeout", OPT_KILL_LONG_QUERIES_TIMEOUT, + "This option specifies the number of seconds innobackupex waits " + "between starting FLUSH TABLES WITH READ LOCK and killing those " + "queries that block it. Default is 0 seconds, which means " + "innobackupex will not attempt to kill any queries.", + (uchar*) &opt_ibx_kill_long_queries_timeout, + (uchar*) &opt_ibx_kill_long_queries_timeout, 0, GET_UINT, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"ftwrl-wait-timeout", OPT_LOCK_WAIT_TIMEOUT, + "This option specifies time in seconds that innobackupex should wait " + "for queries that would block FTWRL before running it. If there are " + "still such queries when the timeout expires, innobackupex terminates " + "with an error. Default is 0, in which case innobackupex does not " + "wait for queries to complete and starts FTWRL immediately.", + (uchar*) &opt_ibx_lock_wait_timeout, + (uchar*) &opt_ibx_lock_wait_timeout, 0, GET_UINT, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"ftwrl-wait-threshold", OPT_LOCK_WAIT_THRESHOLD, + "This option specifies the query run time threshold which is used by " + "innobackupex to detect long-running queries with a non-zero value " + "of --ftwrl-wait-timeout. FTWRL is not started until such " + "long-running queries exist. This option has no effect if " + "--ftwrl-wait-timeout is 0. Default value is 60 seconds.", + (uchar*) &opt_ibx_lock_wait_threshold, + (uchar*) &opt_ibx_lock_wait_threshold, 0, GET_UINT, + REQUIRED_ARG, 60, 0, 0, 0, 0, 0}, + + {"debug-sleep-before-unlock", OPT_DEBUG_SLEEP_BEFORE_UNLOCK, + "This is a debug-only option used by the XtraBackup test suite.", + (uchar*) &opt_ibx_debug_sleep_before_unlock, + (uchar*) &opt_ibx_debug_sleep_before_unlock, 0, GET_UINT, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"safe-slave-backup-timeout", OPT_SAFE_SLAVE_BACKUP_TIMEOUT, + "How many seconds --safe-slave-backup should wait for " + "Slave_open_temp_tables to become zero. (default 300)", + (uchar*) &opt_ibx_safe_slave_backup_timeout, + (uchar*) &opt_ibx_safe_slave_backup_timeout, 0, GET_UINT, + REQUIRED_ARG, 300, 0, 0, 0, 0, 0}, + + + /* Following command-line options are actually handled by xtrabackup. + We put them here with only purpose for them to showup in + innobackupex --help output */ + + {"close_files", OPT_CLOSE_FILES, "Do not keep files opened. This " + "option is passed directly to xtrabackup. Use at your own risk.", + (uchar*) &ibx_xb_close_files, (uchar*) &ibx_xb_close_files, 0, + GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"compress", OPT_COMPRESS, "This option instructs xtrabackup to " + "compress backup copies of InnoDB data files. It is passed directly " + "to the xtrabackup child process. Try 'xtrabackup --help' for more " + "details.", (uchar*) &ibx_xtrabackup_compress_alg, + (uchar*) &ibx_xtrabackup_compress_alg, 0, + GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, + + {"compress-threads", OPT_COMPRESS_THREADS, + "This option specifies the number of worker threads that will be used " + "for parallel compression. It is passed directly to the xtrabackup " + "child process. Try 'xtrabackup --help' for more details.", + (uchar*) &ibx_xtrabackup_compress_threads, + (uchar*) &ibx_xtrabackup_compress_threads, + 0, GET_UINT, REQUIRED_ARG, 1, 1, UINT_MAX, 0, 0, 0}, + + {"compress-chunk-size", OPT_COMPRESS_CHUNK_SIZE, "Size of working " + "buffer(s) for compression threads in bytes. The default value " + "is 64K.", (uchar*) &ibx_xtrabackup_compress_chunk_size, + (uchar*) &ibx_xtrabackup_compress_chunk_size, + 0, GET_ULL, REQUIRED_ARG, (1 << 16), 1024, ULONGLONG_MAX, 0, 0, 0}, + + {"export", OPT_EXPORT, "This option is passed directly to xtrabackup's " + "--export option. It enables exporting individual tables for import " + "into another server. See the xtrabackup documentation for details.", + (uchar*) &ibx_xtrabackup_export, (uchar*) &ibx_xtrabackup_export, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"extra-lsndir", OPT_EXTRA_LSNDIR, "This option specifies the " + "directory in which to save an extra copy of the " + "\"xtrabackup_checkpoints\" file. The option accepts a string " + "argument. It is passed directly to xtrabackup's --extra-lsndir " + "option. See the xtrabackup documentation for details.", + (uchar*) &ibx_xtrabackup_extra_lsndir, + (uchar*) &ibx_xtrabackup_extra_lsndir, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"incremental-basedir", OPT_INCREMENTAL_BASEDIR, "This option " + "specifies the directory containing the full backup that is the base " + "dataset for the incremental backup. The option accepts a string " + "argument. It is used with the --incremental option.", + (uchar*) &ibx_xtrabackup_incremental_basedir, + (uchar*) &ibx_xtrabackup_incremental_basedir, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"incremental-dir", OPT_INCREMENTAL_DIR, "This option specifies the " + "directory where the incremental backup will be combined with the " + "full backup to make a new full backup. The option accepts a string " + "argument. It is used with the --incremental option.", + (uchar*) &ibx_xtrabackup_incremental_dir, + (uchar*) &ibx_xtrabackup_incremental_dir, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"incremental-force-scan", OPT_INCREMENTAL_FORCE_SCAN, + "This options tells xtrabackup to perform full scan of data files " + "for taking an incremental backup even if full changed page bitmap " + "data is available to enable the backup without the full scan.", + (uchar*)&ibx_xtrabackup_incremental_force_scan, + (uchar*)&ibx_xtrabackup_incremental_force_scan, 0, GET_BOOL, NO_ARG, + 0, 0, 0, 0, 0, 0}, + + {"log-copy-interval", OPT_LOG_COPY_INTERVAL, "This option specifies " + "time interval between checks done by log copying thread in " + "milliseconds.", (uchar*) &ibx_xtrabackup_log_copy_interval, + (uchar*) &ibx_xtrabackup_log_copy_interval, + 0, GET_LONG, REQUIRED_ARG, 1000, 0, LONG_MAX, 0, 1, 0}, + + {"incremental-lsn", OPT_INCREMENTAL, "This option specifies the log " + "sequence number (LSN) to use for the incremental backup. The option " + "accepts a string argument. It is used with the --incremental option. " + "It is used instead of specifying --incremental-basedir. For " + "databases created by MySQL and Percona Server 5.0-series versions, " + "specify the LSN as two 32-bit integers in high:low format. For " + "databases created in 5.1 and later, specify the LSN as a single " + "64-bit integer.", + (uchar*) &ibx_xtrabackup_incremental, + (uchar*) &ibx_xtrabackup_incremental, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"parallel", OPT_PARALLEL, "On backup, this option specifies the " + "number of threads the xtrabackup child process should use to back " + "up files concurrently. The option accepts an integer argument. It " + "is passed directly to xtrabackup's --parallel option. See the " + "xtrabackup documentation for details.", + (uchar*) &ibx_xtrabackup_parallel, (uchar*) &ibx_xtrabackup_parallel, + 0, GET_INT, REQUIRED_ARG, 1, 1, INT_MAX, 0, 0, 0}, + + + {"stream", OPT_STREAM, "This option specifies the format in which to " + "do the streamed backup. The option accepts a string argument. The " + "backup will be done to STDOUT in the specified format. Currently, " + "the only supported formats are tar and xbstream. This option is " + "passed directly to xtrabackup's --stream option.", + (uchar*) &ibx_xtrabackup_stream_str, + (uchar*) &ibx_xtrabackup_stream_str, 0, GET_STR, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"tables-file", OPT_TABLES_FILE, "This option specifies the file in " + "which there are a list of names of the form database. The option " + "accepts a string argument.table, one per line. The option is passed " + "directly to xtrabackup's --tables-file option.", + (uchar*) &ibx_xtrabackup_tables_file, + (uchar*) &ibx_xtrabackup_tables_file, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"throttle", OPT_THROTTLE, "This option specifies a number of I/O " + "operations (pairs of read+write) per second. It accepts an integer " + "argument. It is passed directly to xtrabackup's --throttle option.", + (uchar*) &ibx_xtrabackup_throttle, (uchar*) &ibx_xtrabackup_throttle, + 0, GET_LONG, REQUIRED_ARG, 0, 0, LONG_MAX, 0, 1, 0}, + + {"tmpdir", 't', "This option specifies the location where a temporary " + "files will be stored. If the option is not specified, the default is " + "to use the value of tmpdir read from the server configuration.", + (uchar*) &ibx_opt_mysql_tmpdir, + (uchar*) &ibx_opt_mysql_tmpdir, 0, GET_STR, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + + {"use-memory", OPT_USE_MEMORY, "This option accepts a string argument " + "that specifies the amount of memory in bytes for xtrabackup to use " + "for crash recovery while preparing a backup. Multiples are supported " + "providing the unit (e.g. 1MB, 1GB). It is used only with the option " + "--apply-log. It is passed directly to xtrabackup's --use-memory " + "option. See the xtrabackup documentation for details.", + (uchar*) &ibx_xtrabackup_use_memory, + (uchar*) &ibx_xtrabackup_use_memory, + 0, GET_LL, REQUIRED_ARG, 100*1024*1024L, 1024*1024L, LONGLONG_MAX, 0, + 1024*1024L, 0}, + + { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} +}; + + +static void usage(void) +{ + puts("Open source backup tool for InnoDB and XtraDB\n\ +\n\ +Copyright (C) 2009-2015 Percona LLC and/or its affiliates.\n\ +Portions Copyright (C) 2000, 2011, MySQL AB & Innobase Oy. All Rights Reserved.\n\ +\n\ +This program is free software; you can redistribute it and/or\n\ +modify it under the terms of the GNU General Public License\n\ +as published by the Free Software Foundation version 2\n\ +of the License.\n\ +\n\ +This program is distributed in the hope that it will be useful,\n\ +but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\ +GNU General Public License for more details.\n\ +\n\ +You can download full text of the license on http://www.gnu.org/licenses/gpl-2.0.txt\n\n"); + + puts("innobackupex - Non-blocking backup tool for InnoDB, XtraDB and HailDB databases\n\ +\n\ +SYNOPOSIS\n\ +\n\ +innobackupex [--compress] [--compress-threads=NUMBER-OF-THREADS] [--compress-chunk-size=CHUNK-SIZE]\n\ + [--include=REGEXP] [--user=NAME]\n\ + [--password=WORD] [--port=PORT] [--socket=SOCKET]\n\ + [--no-timestamp] [--ibbackup=IBBACKUP-BINARY]\n\ + [--slave-info] [--galera-info] [--stream=tar|xbstream]\n\ + [--defaults-file=MY.CNF] [--defaults-group=GROUP-NAME]\n\ + [--databases=LIST] [--no-lock] \n\ + [--tmpdir=DIRECTORY] [--tables-file=FILE]\n\ + [--history=NAME]\n\ + [--incremental] [--incremental-basedir]\n\ + [--incremental-dir] [--incremental-force-scan] [--incremental-lsn]\n\ + [--incremental-history-name=NAME] [--incremental-history-uuid=UUID]\n\ + [--close-files]\n\ + BACKUP-ROOT-DIR\n\ +\n\ +innobackupex --apply-log [--use-memory=B]\n\ + [--defaults-file=MY.CNF]\n\ + [--export] [--ibbackup=IBBACKUP-BINARY]\n\ + BACKUP-DIR\n\ +\n\ +innobackupex --copy-back [--defaults-file=MY.CNF] [--defaults-group=GROUP-NAME] BACKUP-DIR\n\ +\n\ +innobackupex --move-back [--defaults-file=MY.CNF] [--defaults-group=GROUP-NAME] BACKUP-DIR\n\ +\n\ +innobackupex [--decompress]\n\ + [--parallel=NUMBER-OF-FORKS] BACKUP-DIR\n\ +\n\ +DESCRIPTION\n\ +\n\ +The first command line above makes a hot backup of a MySQL database.\n\ +By default it creates a backup directory (named by the current date\n\ + and time) in the given backup root directory. With the --no-timestamp\n\ +option it does not create a time-stamped backup directory, but it puts\n\ +the backup in the given directory (which must not exist). This\n\ +command makes a complete backup of all MyISAM and InnoDB tables and\n\ +indexes in all databases or in all of the databases specified with the\n\ +--databases option. The created backup contains .frm, .MRG, .MYD,\n\ +.MYI, .MAD, .MAI, .TRG, .TRN, .ARM, .ARZ, .CSM, CSV, .opt, .par, and\n\ +InnoDB data and log files. The MY.CNF options file defines the\n\ +location of the database. This command connects to the MySQL server\n\ +using the mysql client program, and runs xtrabackup as a child\n\ +process.\n\ +\n\ +The --apply-log command prepares a backup for starting a MySQL\n\ +server on the backup. This command recovers InnoDB data files as specified\n\ +in BACKUP-DIR/backup-my.cnf using BACKUP-DIR/ib_logfile0,\n\ +and creates new InnoDB log files as specified in BACKUP-DIR/backup-my.cnf.\n\ +The BACKUP-DIR should be the path to a backup directory created by\n\ +xtrabackup. This command runs xtrabackup as a child process, but it does not \n\ +connect to the database server.\n\ +\n\ +The --copy-back command copies data, index, and log files\n\ +from the backup directory back to their original locations.\n\ +The MY.CNF options file defines the original location of the database.\n\ +The BACKUP-DIR is the path to a backup directory created by xtrabackup.\n\ +\n\ +The --move-back command is similar to --copy-back with the only difference that\n\ +it moves files to their original locations rather than copies them. As this\n\ +option removes backup files, it must be used with caution. It may be useful in\n\ +cases when there is not enough free disk space to copy files.\n\ +\n\ +The --decompress command will decompress a backup made\n\ +with the --compress option. The\n\ +--parallel option will allow multiple files to be decompressed\n\ +simultaneously. In order to decompress, the qpress utility MUST be installed\n\ +and accessable within the path. This process will remove the original\n\ +compressed files and leave the results in the same location.\n\ +\n\ +On success the exit code innobackupex is 0. A non-zero exit code \n\ +indicates an error.\n"); + printf("Usage: [%s [--defaults-file=#] --backup | %s [--defaults-file=#] --prepare] [OPTIONS]\n", my_progname, my_progname); + my_print_help(ibx_long_options); +} + + +static +my_bool +ibx_get_one_option(int optid, + const struct my_option *opt __attribute__((unused)), + char *argument) +{ + switch(optid) { + case '?': + usage(); + exit(0); + break; + case 'v': + msg("innobackupex version %s %s (%s)\n", + MYSQL_SERVER_VERSION, + SYSTEM_TYPE, MACHINE_TYPE); + exit(0); + break; + case OPT_HISTORY: + if (argument) { + opt_ibx_history = argument; + } else { + opt_ibx_history = ""; + } + break; + case OPT_STREAM: + if (!strcasecmp(argument, "xbstream")) + xtrabackup_stream_fmt = XB_STREAM_FMT_XBSTREAM; + else { + ibx_msg("Invalid --stream argument: %s\n", argument); + return 1; + } + xtrabackup_stream = TRUE; + break; + case OPT_COMPRESS: + if (argument == NULL) + xtrabackup_compress_alg = "quicklz"; + else if (strcasecmp(argument, "quicklz")) + { + ibx_msg("Invalid --compress argument: %s\n", argument); + return 1; + } + xtrabackup_compress = TRUE; + break; + case 'p': + if (argument) + { + char *start = argument; + my_free(opt_ibx_password); + opt_ibx_password= my_strdup(argument, MYF(MY_FAE)); + /* Destroy argument */ + while (*argument) + *argument++= 'x'; + if (*start) + start[1]=0 ; + } + break; + } + return(0); +} + +bool +make_backup_dir() +{ + time_t t = time(NULL); + char buf[100]; + + if (!opt_ibx_notimestamp && !ibx_xtrabackup_stream_str) { + strftime(buf, sizeof(buf), "%Y-%m-%d_%H-%M-%S", localtime(&t)); + ut_a(asprintf(&ibx_backup_directory, "%s/%s", + ibx_position_arg, buf) != -1); + } else { + ibx_backup_directory = strdup(ibx_position_arg); + } + + if (!directory_exists(ibx_backup_directory, true)) { + return(false); + } + + return(true); +} + +bool +ibx_handle_options(int *argc, char ***argv) +{ + int i, n_arguments; + + if (handle_options(argc, argv, ibx_long_options, ibx_get_one_option)) { + return(false); + } + + if (opt_ibx_apply_log) { + ibx_mode = IBX_MODE_APPLY_LOG; + } else if (opt_ibx_copy_back) { + ibx_mode = IBX_MODE_COPY_BACK; + } else if (opt_ibx_move_back) { + ibx_mode = IBX_MODE_MOVE_BACK; + } else if (opt_ibx_decompress) { + ibx_mode = IBX_MODE_DECRYPT_DECOMPRESS; + } else { + ibx_mode = IBX_MODE_BACKUP; + } + + /* find and save position argument */ + i = 0; + n_arguments = 0; + while (i < *argc) { + char *opt = (*argv)[i]; + + if (strncmp(opt, "--", 2) != 0 + && !(strlen(opt) == 2 && opt[0] == '-')) { + if (ibx_position_arg != NULL + && ibx_position_arg != opt) { + ibx_msg("Error: extra argument found %s\n", + opt); + } + ibx_position_arg = opt; + ++n_arguments; + } + ++i; + } + + *argc -= n_arguments; + if (n_arguments > 1) { + return(false); + } + + if (ibx_position_arg == NULL) { + ibx_msg("Missing argument\n"); + return(false); + } + + /* set argv[0] to be the program name */ + --(*argv); + ++(*argc); + + return(true); +} + +/*********************************************************************//** +Parse command-line options, connect to MySQL server, +detect server capabilities, etc. +@return true on success. */ +bool +ibx_init() +{ + const char *run; + + /*=====================*/ + xtrabackup_copy_back = opt_ibx_copy_back; + xtrabackup_move_back = opt_ibx_move_back; + opt_galera_info = opt_ibx_galera_info; + opt_slave_info = opt_ibx_slave_info; + opt_no_lock = opt_ibx_no_lock; + opt_safe_slave_backup = opt_ibx_safe_slave_backup; + opt_rsync = opt_ibx_rsync; + opt_force_non_empty_dirs = opt_ibx_force_non_empty_dirs; + opt_noversioncheck = opt_ibx_noversioncheck; + opt_no_backup_locks = opt_ibx_no_backup_locks; + opt_decompress = opt_ibx_decompress; + + opt_incremental_history_name = opt_ibx_incremental_history_name; + opt_incremental_history_uuid = opt_ibx_incremental_history_uuid; + + opt_user = opt_ibx_user; + opt_password = opt_ibx_password; + opt_host = opt_ibx_host; + opt_defaults_group = opt_ibx_defaults_group; + opt_socket = opt_ibx_socket; + opt_port = opt_ibx_port; + + opt_lock_wait_query_type = opt_ibx_lock_wait_query_type; + opt_kill_long_query_type = opt_ibx_kill_long_query_type; + + opt_kill_long_queries_timeout = opt_ibx_kill_long_queries_timeout; + opt_lock_wait_timeout = opt_ibx_lock_wait_timeout; + opt_lock_wait_threshold = opt_ibx_lock_wait_threshold; + opt_debug_sleep_before_unlock = opt_ibx_debug_sleep_before_unlock; + opt_safe_slave_backup_timeout = opt_ibx_safe_slave_backup_timeout; + + opt_history = opt_ibx_history; + + /* setup xtrabackup options */ + xb_close_files = ibx_xb_close_files; + xtrabackup_compress_alg = ibx_xtrabackup_compress_alg; + xtrabackup_compress_threads = ibx_xtrabackup_compress_threads; + xtrabackup_compress_chunk_size = ibx_xtrabackup_compress_chunk_size; + xtrabackup_export = ibx_xtrabackup_export; + xtrabackup_extra_lsndir = ibx_xtrabackup_extra_lsndir; + xtrabackup_incremental_basedir = ibx_xtrabackup_incremental_basedir; + xtrabackup_incremental_dir = ibx_xtrabackup_incremental_dir; + xtrabackup_incremental_force_scan = + ibx_xtrabackup_incremental_force_scan; + xtrabackup_log_copy_interval = ibx_xtrabackup_log_copy_interval; + xtrabackup_incremental = ibx_xtrabackup_incremental; + xtrabackup_parallel = ibx_xtrabackup_parallel; + xtrabackup_stream_str = ibx_xtrabackup_stream_str; + xtrabackup_tables_file = ibx_xtrabackup_tables_file; + xtrabackup_throttle = ibx_xtrabackup_throttle; + opt_mysql_tmpdir = ibx_opt_mysql_tmpdir; + xtrabackup_use_memory = ibx_xtrabackup_use_memory; + + if (!opt_ibx_incremental + && (xtrabackup_incremental + || xtrabackup_incremental_basedir + || opt_ibx_incremental_history_name + || opt_ibx_incremental_history_uuid)) { + ibx_msg("Error: --incremental-lsn, --incremental-basedir, " + "--incremental-history-name and " + "--incremental-history-uuid require the " + "--incremental option.\n"); + return(false); + } + + if (opt_ibx_databases != NULL) { + if (is_path_separator(*opt_ibx_databases)) { + xtrabackup_databases_file = opt_ibx_databases; + } else { + xtrabackup_databases = opt_ibx_databases; + } + } + + /* --tables and --tables-file options are xtrabackup only */ + ibx_partial_backup = (opt_ibx_include || opt_ibx_databases); + + if (ibx_mode == IBX_MODE_BACKUP) { + + if (!make_backup_dir()) { + return(false); + } + } + + /* --binlog-info is xtrabackup only, so force + --binlog-info=ON. i.e. behavior before the feature had been + implemented */ + opt_binlog_info = BINLOG_INFO_ON; + + switch (ibx_mode) { + case IBX_MODE_APPLY_LOG: + xtrabackup_prepare = TRUE; + xtrabackup_target_dir = ibx_position_arg; + run = "apply-log"; + break; + case IBX_MODE_BACKUP: + xtrabackup_backup = TRUE; + xtrabackup_target_dir = ibx_backup_directory; + if (opt_ibx_include != NULL) { + xtrabackup_tables = opt_ibx_include; + } + run = "backup"; + break; + case IBX_MODE_COPY_BACK: + xtrabackup_copy_back = TRUE; + xtrabackup_target_dir = ibx_position_arg; + run = "copy-back"; + break; + case IBX_MODE_MOVE_BACK: + xtrabackup_move_back = TRUE; + xtrabackup_target_dir = ibx_position_arg; + run = "move-back"; + break; + case IBX_MODE_DECRYPT_DECOMPRESS: + xtrabackup_decrypt_decompress = TRUE; + xtrabackup_target_dir = ibx_position_arg; + run = "decompress"; + break; + default: + ut_error; + } + + ibx_msg("Starting the %s operation\n\n" + "IMPORTANT: Please check that the %s run completes " + "successfully.\n" + " At the end of a successful %s run innobackupex\n" + " prints \"completed OK!\".\n\n", run, run, run); + + + return(true); +} + +void +ibx_cleanup() +{ + free(ibx_backup_directory); +} diff --git a/extra/mariabackup/innobackupex.h b/extra/mariabackup/innobackupex.h new file mode 100644 index 00000000000..e2ad9bd2511 --- /dev/null +++ b/extra/mariabackup/innobackupex.h @@ -0,0 +1,45 @@ +/****************************************************** +Copyright (c) 2011-2014 Percona LLC and/or its affiliates. + +Declarations for innobackupex.cc + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#ifndef INNOBACKUPEX_H +#define INNOBACKUPEX_H + +#define INNOBACKUPEX_BIN_NAME "innobackupex" + +enum ibx_mode_t { + IBX_MODE_BACKUP, + IBX_MODE_APPLY_LOG, + IBX_MODE_COPY_BACK, + IBX_MODE_MOVE_BACK, + IBX_MODE_DECRYPT_DECOMPRESS +}; + +extern ibx_mode_t ibx_mode; + +bool +ibx_handle_options(int *argc, char ***argv); + +bool +ibx_init(); + +void +ibx_cleanup(); + +#endif diff --git a/extra/mariabackup/quicklz/quicklz.c b/extra/mariabackup/quicklz/quicklz.c new file mode 100644 index 00000000000..3742129023a --- /dev/null +++ b/extra/mariabackup/quicklz/quicklz.c @@ -0,0 +1,848 @@ +// Fast data compression library +// Copyright (C) 2006-2011 Lasse Mikkel Reinhold +// lar@quicklz.com +// +// QuickLZ can be used for free under the GPL 1, 2 or 3 license (where anything +// released into public must be open source) or under a commercial license if such +// has been acquired (see http://www.quicklz.com/order.html). The commercial license +// does not cover derived or ported versions created by third parties under GPL. + +// 1.5.0 final + +#include "quicklz.h" + +#if QLZ_VERSION_MAJOR != 1 || QLZ_VERSION_MINOR != 5 || QLZ_VERSION_REVISION != 0 + #error quicklz.c and quicklz.h have different versions +#endif + +#if (defined(__X86__) || defined(__i386__) || defined(i386) || defined(_M_IX86) || defined(__386__) || defined(__x86_64__) || defined(_M_X64)) + #define X86X64 +#endif + +#define MINOFFSET 2 +#define UNCONDITIONAL_MATCHLEN 6 +#define UNCOMPRESSED_END 4 +#define CWORD_LEN 4 + +#if QLZ_COMPRESSION_LEVEL == 1 && defined QLZ_PTR_64 && QLZ_STREAMING_BUFFER == 0 + #define OFFSET_BASE source + #define CAST (ui32)(size_t) +#else + #define OFFSET_BASE 0 + #define CAST +#endif + +int qlz_get_setting(int setting) +{ + switch (setting) + { + case 0: return QLZ_COMPRESSION_LEVEL; + case 1: return sizeof(qlz_state_compress); + case 2: return sizeof(qlz_state_decompress); + case 3: return QLZ_STREAMING_BUFFER; +#ifdef QLZ_MEMORY_SAFE + case 6: return 1; +#else + case 6: return 0; +#endif + case 7: return QLZ_VERSION_MAJOR; + case 8: return QLZ_VERSION_MINOR; + case 9: return QLZ_VERSION_REVISION; + } + return -1; +} + +#if QLZ_COMPRESSION_LEVEL == 1 +static int same(const unsigned char *src, size_t n) +{ + while(n > 0 && *(src + n) == *src) + n--; + return n == 0 ? 1 : 0; +} +#endif + +static void reset_table_compress(qlz_state_compress *state) +{ + int i; + for(i = 0; i < QLZ_HASH_VALUES; i++) + { +#if QLZ_COMPRESSION_LEVEL == 1 + state->hash[i].offset = 0; +#else + state->hash_counter[i] = 0; +#endif + } +} + +static void reset_table_decompress(qlz_state_decompress *state) +{ + int i; + (void)state; + (void)i; +#if QLZ_COMPRESSION_LEVEL == 2 + for(i = 0; i < QLZ_HASH_VALUES; i++) + { + state->hash_counter[i] = 0; + } +#endif +} + +static __inline ui32 hash_func(ui32 i) +{ +#if QLZ_COMPRESSION_LEVEL == 2 + return ((i >> 9) ^ (i >> 13) ^ i) & (QLZ_HASH_VALUES - 1); +#else + return ((i >> 12) ^ i) & (QLZ_HASH_VALUES - 1); +#endif +} + +static __inline ui32 fast_read(void const *src, ui32 bytes) +{ +#ifndef X86X64 + unsigned char *p = (unsigned char*)src; + switch (bytes) + { + case 4: + return(*p | *(p + 1) << 8 | *(p + 2) << 16 | *(p + 3) << 24); + case 3: + return(*p | *(p + 1) << 8 | *(p + 2) << 16); + case 2: + return(*p | *(p + 1) << 8); + case 1: + return(*p); + } + return 0; +#else + if (bytes >= 1 && bytes <= 4) + return *((ui32*)src); + else + return 0; +#endif +} + +static __inline ui32 hashat(const unsigned char *src) +{ + ui32 fetch, hash; + fetch = fast_read(src, 3); + hash = hash_func(fetch); + return hash; +} + +static __inline void fast_write(ui32 f, void *dst, size_t bytes) +{ +#ifndef X86X64 + unsigned char *p = (unsigned char*)dst; + + switch (bytes) + { + case 4: + *p = (unsigned char)f; + *(p + 1) = (unsigned char)(f >> 8); + *(p + 2) = (unsigned char)(f >> 16); + *(p + 3) = (unsigned char)(f >> 24); + return; + case 3: + *p = (unsigned char)f; + *(p + 1) = (unsigned char)(f >> 8); + *(p + 2) = (unsigned char)(f >> 16); + return; + case 2: + *p = (unsigned char)f; + *(p + 1) = (unsigned char)(f >> 8); + return; + case 1: + *p = (unsigned char)f; + return; + } +#else + switch (bytes) + { + case 4: + *((ui32*)dst) = f; + return; + case 3: + *((ui32*)dst) = f; + return; + case 2: + *((ui16 *)dst) = (ui16)f; + return; + case 1: + *((unsigned char*)dst) = (unsigned char)f; + return; + } +#endif +} + + +size_t qlz_size_decompressed(const char *source) +{ + ui32 n, r; + n = (((*source) & 2) == 2) ? 4 : 1; + r = fast_read(source + 1 + n, n); + r = r & (0xffffffff >> ((4 - n)*8)); + return r; +} + +size_t qlz_size_compressed(const char *source) +{ + ui32 n, r; + n = (((*source) & 2) == 2) ? 4 : 1; + r = fast_read(source + 1, n); + r = r & (0xffffffff >> ((4 - n)*8)); + return r; +} + +size_t qlz_size_header(const char *source) +{ + size_t n = 2*((((*source) & 2) == 2) ? 4 : 1) + 1; + return n; +} + + +static __inline void memcpy_up(unsigned char *dst, const unsigned char *src, ui32 n) +{ + // Caution if modifying memcpy_up! Overlap of dst and src must be special handled. +#ifndef X86X64 + unsigned char *end = dst + n; + while(dst < end) + { + *dst = *src; + dst++; + src++; + } +#else + ui32 f = 0; + do + { + *(ui32 *)(dst + f) = *(ui32 *)(src + f); + f += MINOFFSET + 1; + } + while (f < n); +#endif +} + +static __inline void update_hash(qlz_state_decompress *state, const unsigned char *s) +{ +#if QLZ_COMPRESSION_LEVEL == 1 + ui32 hash; + hash = hashat(s); + state->hash[hash].offset = s; + state->hash_counter[hash] = 1; +#elif QLZ_COMPRESSION_LEVEL == 2 + ui32 hash; + unsigned char c; + hash = hashat(s); + c = state->hash_counter[hash]; + state->hash[hash].offset[c & (QLZ_POINTERS - 1)] = s; + c++; + state->hash_counter[hash] = c; +#endif + (void)state; + (void)s; +} + +#if QLZ_COMPRESSION_LEVEL <= 2 +static void update_hash_upto(qlz_state_decompress *state, unsigned char **lh, const unsigned char *max) +{ + while(*lh < max) + { + (*lh)++; + update_hash(state, *lh); + } +} +#endif + +static size_t qlz_compress_core(const unsigned char *source, unsigned char *destination, size_t size, qlz_state_compress *state) +{ + const unsigned char *last_byte = source + size - 1; + const unsigned char *src = source; + unsigned char *cword_ptr = destination; + unsigned char *dst = destination + CWORD_LEN; + ui32 cword_val = 1U << 31; + const unsigned char *last_matchstart = last_byte - UNCONDITIONAL_MATCHLEN - UNCOMPRESSED_END; + ui32 fetch = 0; + unsigned int lits = 0; + + (void) lits; + + if(src <= last_matchstart) + fetch = fast_read(src, 3); + + while(src <= last_matchstart) + { + if ((cword_val & 1) == 1) + { + // store uncompressed if compression ratio is too low + if (src > source + (size >> 1) && dst - destination > src - source - ((src - source) >> 5)) + return 0; + + fast_write((cword_val >> 1) | (1U << 31), cword_ptr, CWORD_LEN); + + cword_ptr = dst; + dst += CWORD_LEN; + cword_val = 1U << 31; + fetch = fast_read(src, 3); + } +#if QLZ_COMPRESSION_LEVEL == 1 + { + const unsigned char *o; + ui32 hash, cached; + + hash = hash_func(fetch); + cached = fetch ^ state->hash[hash].cache; + state->hash[hash].cache = fetch; + + o = state->hash[hash].offset + OFFSET_BASE; + state->hash[hash].offset = CAST(src - OFFSET_BASE); + +#ifdef X86X64 + if ((cached & 0xffffff) == 0 && o != OFFSET_BASE && (src - o > MINOFFSET || (src == o + 1 && lits >= 3 && src > source + 3 && same(src - 3, 6)))) + { + if(cached != 0) + { +#else + if (cached == 0 && o != OFFSET_BASE && (src - o > MINOFFSET || (src == o + 1 && lits >= 3 && src > source + 3 && same(src - 3, 6)))) + { + if (*(o + 3) != *(src + 3)) + { +#endif + hash <<= 4; + cword_val = (cword_val >> 1) | (1U << 31); + fast_write((3 - 2) | hash, dst, 2); + src += 3; + dst += 2; + } + else + { + const unsigned char *old_src = src; + size_t matchlen; + hash <<= 4; + + cword_val = (cword_val >> 1) | (1U << 31); + src += 4; + + if(*(o + (src - old_src)) == *src) + { + src++; + if(*(o + (src - old_src)) == *src) + { + size_t q = last_byte - UNCOMPRESSED_END - (src - 5) + 1; + size_t remaining = q > 255 ? 255 : q; + src++; + while(*(o + (src - old_src)) == *src && (size_t)(src - old_src) < remaining) + src++; + } + } + + matchlen = src - old_src; + if (matchlen < 18) + { + fast_write((ui32)(matchlen - 2) | hash, dst, 2); + dst += 2; + } + else + { + fast_write((ui32)(matchlen << 16) | hash, dst, 3); + dst += 3; + } + } + fetch = fast_read(src, 3); + lits = 0; + } + else + { + lits++; + *dst = *src; + src++; + dst++; + cword_val = (cword_val >> 1); +#ifdef X86X64 + fetch = fast_read(src, 3); +#else + fetch = (fetch >> 8 & 0xffff) | (*(src + 2) << 16); +#endif + } + } +#elif QLZ_COMPRESSION_LEVEL >= 2 + { + const unsigned char *o, *offset2; + ui32 hash, matchlen, k, m, best_k = 0; + unsigned char c; + size_t remaining = (last_byte - UNCOMPRESSED_END - src + 1) > 255 ? 255 : (last_byte - UNCOMPRESSED_END - src + 1); + (void)best_k; + + + //hash = hashat(src); + fetch = fast_read(src, 3); + hash = hash_func(fetch); + + c = state->hash_counter[hash]; + + offset2 = state->hash[hash].offset[0]; + if(offset2 < src - MINOFFSET && c > 0 && ((fast_read(offset2, 3) ^ fetch) & 0xffffff) == 0) + { + matchlen = 3; + if(*(offset2 + matchlen) == *(src + matchlen)) + { + matchlen = 4; + while(*(offset2 + matchlen) == *(src + matchlen) && matchlen < remaining) + matchlen++; + } + } + else + matchlen = 0; + for(k = 1; k < QLZ_POINTERS && c > k; k++) + { + o = state->hash[hash].offset[k]; +#if QLZ_COMPRESSION_LEVEL == 3 + if(((fast_read(o, 3) ^ fetch) & 0xffffff) == 0 && o < src - MINOFFSET) +#elif QLZ_COMPRESSION_LEVEL == 2 + if(*(src + matchlen) == *(o + matchlen) && ((fast_read(o, 3) ^ fetch) & 0xffffff) == 0 && o < src - MINOFFSET) +#endif + { + m = 3; + while(*(o + m) == *(src + m) && m < remaining) + m++; +#if QLZ_COMPRESSION_LEVEL == 3 + if ((m > matchlen) || (m == matchlen && o > offset2)) +#elif QLZ_COMPRESSION_LEVEL == 2 + if (m > matchlen) +#endif + { + offset2 = o; + matchlen = m; + best_k = k; + } + } + } + o = offset2; + state->hash[hash].offset[c & (QLZ_POINTERS - 1)] = src; + c++; + state->hash_counter[hash] = c; + +#if QLZ_COMPRESSION_LEVEL == 3 + if(matchlen > 2 && src - o < 131071) + { + ui32 u; + size_t offset = src - o; + + for(u = 1; u < matchlen; u++) + { + hash = hashat(src + u); + c = state->hash_counter[hash]++; + state->hash[hash].offset[c & (QLZ_POINTERS - 1)] = src + u; + } + + cword_val = (cword_val >> 1) | (1U << 31); + src += matchlen; + + if(matchlen == 3 && offset <= 63) + { + *dst = (unsigned char)(offset << 2); + dst++; + } + else if (matchlen == 3 && offset <= 16383) + { + ui32 f = (ui32)((offset << 2) | 1); + fast_write(f, dst, 2); + dst += 2; + } + else if (matchlen <= 18 && offset <= 1023) + { + ui32 f = ((matchlen - 3) << 2) | ((ui32)offset << 6) | 2; + fast_write(f, dst, 2); + dst += 2; + } + + else if(matchlen <= 33) + { + ui32 f = ((matchlen - 2) << 2) | ((ui32)offset << 7) | 3; + fast_write(f, dst, 3); + dst += 3; + } + else + { + ui32 f = ((matchlen - 3) << 7) | ((ui32)offset << 15) | 3; + fast_write(f, dst, 4); + dst += 4; + } + } + else + { + *dst = *src; + src++; + dst++; + cword_val = (cword_val >> 1); + } +#elif QLZ_COMPRESSION_LEVEL == 2 + + if(matchlen > 2) + { + cword_val = (cword_val >> 1) | (1U << 31); + src += matchlen; + + if (matchlen < 10) + { + ui32 f = best_k | ((matchlen - 2) << 2) | (hash << 5); + fast_write(f, dst, 2); + dst += 2; + } + else + { + ui32 f = best_k | (matchlen << 16) | (hash << 5); + fast_write(f, dst, 3); + dst += 3; + } + } + else + { + *dst = *src; + src++; + dst++; + cword_val = (cword_val >> 1); + } +#endif + } +#endif + } + while (src <= last_byte) + { + if ((cword_val & 1) == 1) + { + fast_write((cword_val >> 1) | (1U << 31), cword_ptr, CWORD_LEN); + cword_ptr = dst; + dst += CWORD_LEN; + cword_val = 1U << 31; + } +#if QLZ_COMPRESSION_LEVEL < 3 + if (src <= last_byte - 3) + { +#if QLZ_COMPRESSION_LEVEL == 1 + ui32 hash, fetch; + fetch = fast_read(src, 3); + hash = hash_func(fetch); + state->hash[hash].offset = CAST(src - OFFSET_BASE); + state->hash[hash].cache = fetch; +#elif QLZ_COMPRESSION_LEVEL == 2 + ui32 hash; + unsigned char c; + hash = hashat(src); + c = state->hash_counter[hash]; + state->hash[hash].offset[c & (QLZ_POINTERS - 1)] = src; + c++; + state->hash_counter[hash] = c; +#endif + } +#endif + *dst = *src; + src++; + dst++; + cword_val = (cword_val >> 1); + } + + while((cword_val & 1) != 1) + cword_val = (cword_val >> 1); + + fast_write((cword_val >> 1) | (1U << 31), cword_ptr, CWORD_LEN); + + // min. size must be 9 bytes so that the qlz_size functions can take 9 bytes as argument + return dst - destination < 9 ? 9 : dst - destination; +} + +static size_t qlz_decompress_core(const unsigned char *source, unsigned char *destination, size_t size, qlz_state_decompress *state, const unsigned char *history) +{ + const unsigned char *src = source + qlz_size_header((const char *)source); + unsigned char *dst = destination; + const unsigned char *last_destination_byte = destination + size - 1; + ui32 cword_val = 1; + const unsigned char *last_matchstart = last_destination_byte - UNCONDITIONAL_MATCHLEN - UNCOMPRESSED_END; + unsigned char *last_hashed = destination - 1; + const unsigned char *last_source_byte = source + qlz_size_compressed((const char *)source) - 1; + static const ui32 bitlut[16] = {4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0}; + + (void) last_source_byte; + (void) last_hashed; + (void) state; + (void) history; + + for(;;) + { + ui32 fetch; + + if (cword_val == 1) + { +#ifdef QLZ_MEMORY_SAFE + if(src + CWORD_LEN - 1 > last_source_byte) + return 0; +#endif + cword_val = fast_read(src, CWORD_LEN); + src += CWORD_LEN; + } + +#ifdef QLZ_MEMORY_SAFE + if(src + 4 - 1 > last_source_byte) + return 0; +#endif + + fetch = fast_read(src, 4); + + if ((cword_val & 1) == 1) + { + ui32 matchlen; + const unsigned char *offset2; + +#if QLZ_COMPRESSION_LEVEL == 1 + ui32 hash; + cword_val = cword_val >> 1; + hash = (fetch >> 4) & 0xfff; + offset2 = (const unsigned char *)(size_t)state->hash[hash].offset; + + if((fetch & 0xf) != 0) + { + matchlen = (fetch & 0xf) + 2; + src += 2; + } + else + { + matchlen = *(src + 2); + src += 3; + } + +#elif QLZ_COMPRESSION_LEVEL == 2 + ui32 hash; + unsigned char c; + cword_val = cword_val >> 1; + hash = (fetch >> 5) & 0x7ff; + c = (unsigned char)(fetch & 0x3); + offset2 = state->hash[hash].offset[c]; + + if((fetch & (28)) != 0) + { + matchlen = ((fetch >> 2) & 0x7) + 2; + src += 2; + } + else + { + matchlen = *(src + 2); + src += 3; + } + +#elif QLZ_COMPRESSION_LEVEL == 3 + ui32 offset; + cword_val = cword_val >> 1; + if ((fetch & 3) == 0) + { + offset = (fetch & 0xff) >> 2; + matchlen = 3; + src++; + } + else if ((fetch & 2) == 0) + { + offset = (fetch & 0xffff) >> 2; + matchlen = 3; + src += 2; + } + else if ((fetch & 1) == 0) + { + offset = (fetch & 0xffff) >> 6; + matchlen = ((fetch >> 2) & 15) + 3; + src += 2; + } + else if ((fetch & 127) != 3) + { + offset = (fetch >> 7) & 0x1ffff; + matchlen = ((fetch >> 2) & 0x1f) + 2; + src += 3; + } + else + { + offset = (fetch >> 15); + matchlen = ((fetch >> 7) & 255) + 3; + src += 4; + } + + offset2 = dst - offset; +#endif + +#ifdef QLZ_MEMORY_SAFE + if(offset2 < history || offset2 > dst - MINOFFSET - 1) + return 0; + + if(matchlen > (ui32)(last_destination_byte - dst - UNCOMPRESSED_END + 1)) + return 0; +#endif + + memcpy_up(dst, offset2, matchlen); + dst += matchlen; + +#if QLZ_COMPRESSION_LEVEL <= 2 + update_hash_upto(state, &last_hashed, dst - matchlen); + last_hashed = dst - 1; +#endif + } + else + { + if (dst < last_matchstart) + { + unsigned int n = bitlut[cword_val & 0xf]; +#ifdef X86X64 + *(ui32 *)dst = *(ui32 *)src; +#else + memcpy_up(dst, src, 4); +#endif + cword_val = cword_val >> n; + dst += n; + src += n; +#if QLZ_COMPRESSION_LEVEL <= 2 + update_hash_upto(state, &last_hashed, dst - 3); +#endif + } + else + { + while(dst <= last_destination_byte) + { + if (cword_val == 1) + { + src += CWORD_LEN; + cword_val = 1U << 31; + } +#ifdef QLZ_MEMORY_SAFE + if(src >= last_source_byte + 1) + return 0; +#endif + *dst = *src; + dst++; + src++; + cword_val = cword_val >> 1; + } + +#if QLZ_COMPRESSION_LEVEL <= 2 + update_hash_upto(state, &last_hashed, last_destination_byte - 3); // todo, use constant +#endif + return size; + } + + } + } +} + +size_t qlz_compress(const void *source, char *destination, size_t size, qlz_state_compress *state) +{ + size_t r; + ui32 compressed; + size_t base; + + if(size == 0 || size > 0xffffffff - 400) + return 0; + + if(size < 216) + base = 3; + else + base = 9; + +#if QLZ_STREAMING_BUFFER > 0 + if (state->stream_counter + size - 1 >= QLZ_STREAMING_BUFFER) +#endif + { + reset_table_compress(state); + r = base + qlz_compress_core((const unsigned char *)source, (unsigned char*)destination + base, size, state); +#if QLZ_STREAMING_BUFFER > 0 + reset_table_compress(state); +#endif + if(r == base) + { + memcpy(destination + base, source, size); + r = size + base; + compressed = 0; + } + else + { + compressed = 1; + } + state->stream_counter = 0; + } +#if QLZ_STREAMING_BUFFER > 0 + else + { + unsigned char *src = state->stream_buffer + state->stream_counter; + + memcpy(src, source, size); + r = base + qlz_compress_core(src, (unsigned char*)destination + base, size, state); + + if(r == base) + { + memcpy(destination + base, src, size); + r = size + base; + compressed = 0; + reset_table_compress(state); + } + else + { + compressed = 1; + } + state->stream_counter += size; + } +#endif + if(base == 3) + { + *destination = (unsigned char)(0 | compressed); + *(destination + 1) = (unsigned char)r; + *(destination + 2) = (unsigned char)size; + } + else + { + *destination = (unsigned char)(2 | compressed); + fast_write((ui32)r, destination + 1, 4); + fast_write((ui32)size, destination + 5, 4); + } + + *destination |= (QLZ_COMPRESSION_LEVEL << 2); + *destination |= (1 << 6); + *destination |= ((QLZ_STREAMING_BUFFER == 0 ? 0 : (QLZ_STREAMING_BUFFER == 100000 ? 1 : (QLZ_STREAMING_BUFFER == 1000000 ? 2 : 3))) << 4); + +// 76543210 +// 01SSLLHC + + return r; +} + +size_t qlz_decompress(const char *source, void *destination, qlz_state_decompress *state) +{ + size_t dsiz = qlz_size_decompressed(source); + +#if QLZ_STREAMING_BUFFER > 0 + if (state->stream_counter + qlz_size_decompressed(source) - 1 >= QLZ_STREAMING_BUFFER) +#endif + { + if((*source & 1) == 1) + { + reset_table_decompress(state); + dsiz = qlz_decompress_core((const unsigned char *)source, (unsigned char *)destination, dsiz, state, (const unsigned char *)destination); + } + else + { + memcpy(destination, source + qlz_size_header(source), dsiz); + } + state->stream_counter = 0; + reset_table_decompress(state); + } +#if QLZ_STREAMING_BUFFER > 0 + else + { + unsigned char *dst = state->stream_buffer + state->stream_counter; + if((*source & 1) == 1) + { + dsiz = qlz_decompress_core((const unsigned char *)source, dst, dsiz, state, (const unsigned char *)state->stream_buffer); + } + else + { + memcpy(dst, source + qlz_size_header(source), dsiz); + reset_table_decompress(state); + } + memcpy(destination, dst, dsiz); + state->stream_counter += dsiz; + } +#endif + return dsiz; +} + diff --git a/extra/mariabackup/quicklz/quicklz.h b/extra/mariabackup/quicklz/quicklz.h new file mode 100644 index 00000000000..6ffe00f3a91 --- /dev/null +++ b/extra/mariabackup/quicklz/quicklz.h @@ -0,0 +1,144 @@ +#ifndef QLZ_HEADER +#define QLZ_HEADER + +// Fast data compression library +// Copyright (C) 2006-2011 Lasse Mikkel Reinhold +// lar@quicklz.com +// +// QuickLZ can be used for free under the GPL 1, 2 or 3 license (where anything +// released into public must be open source) or under a commercial license if such +// has been acquired (see http://www.quicklz.com/order.html). The commercial license +// does not cover derived or ported versions created by third parties under GPL. + +// You can edit following user settings. Data must be decompressed with the same +// setting of QLZ_COMPRESSION_LEVEL and QLZ_STREAMING_BUFFER as it was compressed +// (see manual). If QLZ_STREAMING_BUFFER > 0, scratch buffers must be initially +// zeroed out (see manual). First #ifndef makes it possible to define settings from +// the outside like the compiler command line. + +// 1.5.0 final + +#ifndef QLZ_COMPRESSION_LEVEL + #define QLZ_COMPRESSION_LEVEL 1 + //#define QLZ_COMPRESSION_LEVEL 2 + //#define QLZ_COMPRESSION_LEVEL 3 + + #define QLZ_STREAMING_BUFFER 0 + //#define QLZ_STREAMING_BUFFER 100000 + //#define QLZ_STREAMING_BUFFER 1000000 + + //#define QLZ_MEMORY_SAFE +#endif + +#define QLZ_VERSION_MAJOR 1 +#define QLZ_VERSION_MINOR 5 +#define QLZ_VERSION_REVISION 0 + +// Using size_t, memset() and memcpy() +#include + +// Verify compression level +#if QLZ_COMPRESSION_LEVEL != 1 && QLZ_COMPRESSION_LEVEL != 2 && QLZ_COMPRESSION_LEVEL != 3 +#error QLZ_COMPRESSION_LEVEL must be 1, 2 or 3 +#endif + +typedef unsigned int ui32; +typedef unsigned short int ui16; + +// Decrease QLZ_POINTERS for level 3 to increase compression speed. Do not touch any other values! +#if QLZ_COMPRESSION_LEVEL == 1 +#define QLZ_POINTERS 1 +#define QLZ_HASH_VALUES 4096 +#elif QLZ_COMPRESSION_LEVEL == 2 +#define QLZ_POINTERS 4 +#define QLZ_HASH_VALUES 2048 +#elif QLZ_COMPRESSION_LEVEL == 3 +#define QLZ_POINTERS 16 +#define QLZ_HASH_VALUES 4096 +#endif + +// Detect if pointer size is 64-bit. It's not fatal if some 64-bit target is not detected because this is only for adding an optional 64-bit optimization. +#if defined _LP64 || defined __LP64__ || defined __64BIT__ || _ADDR64 || defined _WIN64 || defined __arch64__ || __WORDSIZE == 64 || (defined __sparc && defined __sparcv9) || defined __x86_64 || defined __amd64 || defined __x86_64__ || defined _M_X64 || defined _M_IA64 || defined __ia64 || defined __IA64__ + #define QLZ_PTR_64 +#endif + +// hash entry +typedef struct +{ +#if QLZ_COMPRESSION_LEVEL == 1 + ui32 cache; +#if defined QLZ_PTR_64 && QLZ_STREAMING_BUFFER == 0 + unsigned int offset; +#else + const unsigned char *offset; +#endif +#else + const unsigned char *offset[QLZ_POINTERS]; +#endif + +} qlz_hash_compress; + +typedef struct +{ +#if QLZ_COMPRESSION_LEVEL == 1 + const unsigned char *offset; +#else + const unsigned char *offset[QLZ_POINTERS]; +#endif +} qlz_hash_decompress; + + +// states +typedef struct +{ + #if QLZ_STREAMING_BUFFER > 0 + unsigned char stream_buffer[QLZ_STREAMING_BUFFER]; + #endif + size_t stream_counter; + qlz_hash_compress hash[QLZ_HASH_VALUES]; + unsigned char hash_counter[QLZ_HASH_VALUES]; +} qlz_state_compress; + + +#if QLZ_COMPRESSION_LEVEL == 1 || QLZ_COMPRESSION_LEVEL == 2 + typedef struct + { +#if QLZ_STREAMING_BUFFER > 0 + unsigned char stream_buffer[QLZ_STREAMING_BUFFER]; +#endif + qlz_hash_decompress hash[QLZ_HASH_VALUES]; + unsigned char hash_counter[QLZ_HASH_VALUES]; + size_t stream_counter; + } qlz_state_decompress; +#elif QLZ_COMPRESSION_LEVEL == 3 + typedef struct + { +#if QLZ_STREAMING_BUFFER > 0 + unsigned char stream_buffer[QLZ_STREAMING_BUFFER]; +#endif +#if QLZ_COMPRESSION_LEVEL <= 2 + qlz_hash_decompress hash[QLZ_HASH_VALUES]; +#endif + size_t stream_counter; + } qlz_state_decompress; +#endif + + +#if defined (__cplusplus) +extern "C" { +#endif + +// Public functions of QuickLZ +size_t qlz_size_decompressed(const char *source); +size_t qlz_size_compressed(const char *source); +size_t qlz_compress(const void *source, char *destination, size_t size, qlz_state_compress *state); +size_t qlz_decompress(const char *source, void *destination, qlz_state_decompress *state); +int qlz_get_setting(int setting); +size_t qlz_size_header(const char *source); + +#if defined (__cplusplus) +} +#endif + +#endif + diff --git a/extra/mariabackup/read_filt.cc b/extra/mariabackup/read_filt.cc new file mode 100644 index 00000000000..a48591abf29 --- /dev/null +++ b/extra/mariabackup/read_filt.cc @@ -0,0 +1,207 @@ +/****************************************************** +XtraBackup: hot backup tool for InnoDB +(c) 2009-2012 Percona Inc. +Originally Created 3/3/2009 Yasufumi Kinoshita +Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko, +Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +/* Data file read filter implementation */ + +#include "read_filt.h" +#include "common.h" +#include "fil_cur.h" +#include "xtrabackup.h" + +/****************************************************************//** +Perform read filter context initialization that is common to all read +filters. */ +static +void +common_init( +/*========*/ + xb_read_filt_ctxt_t* ctxt, /*!offset = 0; + ctxt->data_file_size = cursor->statinfo.st_size; + ctxt->buffer_capacity = cursor->buf_size; + ctxt->page_size = cursor->page_size; +} + +/****************************************************************//** +Initialize the pass-through read filter. */ +static +void +rf_pass_through_init( +/*=================*/ + xb_read_filt_ctxt_t* ctxt, /*!offset; + *read_batch_len = ctxt->data_file_size - ctxt->offset; + + if (*read_batch_len > (ib_int64_t)ctxt->buffer_capacity) { + *read_batch_len = ctxt->buffer_capacity; + } + + ctxt->offset += *read_batch_len; +} + +/****************************************************************//** +Deinitialize the pass-through read filter. */ +static +void +rf_pass_through_deinit( +/*===================*/ + xb_read_filt_ctxt_t* ctxt __attribute__((unused))) + /*!bitmap_range = xb_page_bitmap_range_init(changed_page_bitmap, + space_id); + ctxt->filter_batch_end = 0; +} + +/****************************************************************//** +Get the next batch of pages for the bitmap read filter. */ +static +void +rf_bitmap_get_next_batch( +/*=====================*/ + xb_read_filt_ctxt_t* ctxt, /*!page_size.physical(); + + start_page_id = (ulint)(ctxt->offset / page_size); + + xb_a (ctxt->offset % page_size == 0); + + if (start_page_id == ctxt->filter_batch_end) { + + /* Used up all the previous bitmap range, get some more */ + ulint next_page_id; + + /* Find the next changed page using the bitmap */ + next_page_id = xb_page_bitmap_range_get_next_bit + (ctxt->bitmap_range, TRUE); + + if (next_page_id == ULINT_UNDEFINED) { + *read_batch_len = 0; + return; + } + + ctxt->offset = next_page_id * page_size; + + /* Find the end of the current changed page block by searching + for the next cleared bitmap bit */ + ctxt->filter_batch_end + = xb_page_bitmap_range_get_next_bit(ctxt->bitmap_range, + FALSE); + xb_a(next_page_id < ctxt->filter_batch_end); + } + + *read_batch_start = ctxt->offset; + if (ctxt->filter_batch_end == ULINT_UNDEFINED) { + /* No more cleared bits in the bitmap, need to copy all the + remaining pages. */ + *read_batch_len = ctxt->data_file_size - ctxt->offset; + } else { + *read_batch_len = ctxt->filter_batch_end * page_size + - ctxt->offset; + } + + /* If the page block is larger than the buffer capacity, limit it to + buffer capacity. The subsequent invocations will continue returning + the current block in buffer-sized pieces until ctxt->filter_batch_end + is reached, trigerring the next bitmap query. */ + if (*read_batch_len > (ib_int64_t)ctxt->buffer_capacity) { + *read_batch_len = ctxt->buffer_capacity; + } + + ctxt->offset += *read_batch_len; + xb_a (ctxt->offset % page_size == 0); + xb_a (*read_batch_start % page_size == 0); + xb_a (*read_batch_len % page_size == 0); +} + +/****************************************************************//** +Deinitialize the changed page bitmap-based read filter. */ +static +void +rf_bitmap_deinit( +/*=============*/ + xb_read_filt_ctxt_t* ctxt) /*!bitmap_range); +} + +/* The pass-through read filter */ +xb_read_filt_t rf_pass_through = { + &rf_pass_through_init, + &rf_pass_through_get_next_batch, + &rf_pass_through_deinit +}; + +/* The changed page bitmap-based read filter */ +xb_read_filt_t rf_bitmap = { + &rf_bitmap_init, + &rf_bitmap_get_next_batch, + &rf_bitmap_deinit +}; diff --git a/extra/mariabackup/read_filt.h b/extra/mariabackup/read_filt.h new file mode 100644 index 00000000000..cebc714eed8 --- /dev/null +++ b/extra/mariabackup/read_filt.h @@ -0,0 +1,66 @@ +/****************************************************** +XtraBackup: hot backup tool for InnoDB +(c) 2009-2012 Percona Inc. +Originally Created 3/3/2009 Yasufumi Kinoshita +Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko, +Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +/* Data file read filter interface */ + +#ifndef XB_READ_FILT_H +#define XB_READ_FILT_H + +#include "changed_page_bitmap.h" + +typedef ulint space_id_t; + +struct xb_fil_cur_t; + +/* The read filter context */ +struct xb_read_filt_ctxt_t { + ib_int64_t offset; /*!< current file offset */ + ib_int64_t data_file_size; /*!< data file size */ + size_t buffer_capacity;/*!< read buffer capacity */ + space_id_t space_id; /*!< space id */ + /* The following fields used only in bitmap filter */ + /* Move these to union if any other filters are added in future */ + xb_page_bitmap_range *bitmap_range; /*!< changed page bitmap range + iterator for space_id */ + page_size_t page_size; /*!< page size */ + ulint filter_batch_end;/*!< the ending page id of the + current changed page block in + the bitmap */ + /** TODO: remove this default constructor */ + xb_read_filt_ctxt_t() : page_size(0) {} +}; + +/* The read filter */ +struct xb_read_filt_t { + void (*init)(xb_read_filt_ctxt_t* ctxt, + const xb_fil_cur_t* cursor, + ulint space_id); + void (*get_next_batch)(xb_read_filt_ctxt_t* ctxt, + ib_int64_t* read_batch_start, + ib_int64_t* read_batch_len); + void (*deinit)(xb_read_filt_ctxt_t* ctxt); +}; + +extern xb_read_filt_t rf_pass_through; +extern xb_read_filt_t rf_bitmap; + +#endif diff --git a/extra/mariabackup/write_filt.cc b/extra/mariabackup/write_filt.cc new file mode 100644 index 00000000000..a0633818405 --- /dev/null +++ b/extra/mariabackup/write_filt.cc @@ -0,0 +1,217 @@ +/****************************************************** +XtraBackup: hot backup tool for InnoDB +(c) 2009-2013 Percona LLC and/or its affiliates. +Originally Created 3/3/2009 Yasufumi Kinoshita +Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko, +Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +/* Page write filters implementation */ + +#include +#include "common.h" +#include "write_filt.h" +#include "fil_cur.h" +#include "xtrabackup.h" + +/************************************************************************ +Write-through page write filter. */ +static my_bool wf_wt_init(xb_write_filt_ctxt_t *ctxt, char *dst_name, + xb_fil_cur_t *cursor); +static my_bool wf_wt_process(xb_write_filt_ctxt_t *ctxt, ds_file_t *dstfile); + +xb_write_filt_t wf_write_through = { + &wf_wt_init, + &wf_wt_process, + NULL, + NULL +}; + +/************************************************************************ +Incremental page write filter. */ +static my_bool wf_incremental_init(xb_write_filt_ctxt_t *ctxt, char *dst_name, + xb_fil_cur_t *cursor); +static my_bool wf_incremental_process(xb_write_filt_ctxt_t *ctxt, + ds_file_t *dstfile); +static my_bool wf_incremental_finalize(xb_write_filt_ctxt_t *ctxt, + ds_file_t *dstfile); +static void wf_incremental_deinit(xb_write_filt_ctxt_t *ctxt); + +xb_write_filt_t wf_incremental = { + &wf_incremental_init, + &wf_incremental_process, + &wf_incremental_finalize, + &wf_incremental_deinit +}; + +/************************************************************************ +Initialize incremental page write filter. + +@return TRUE on success, FALSE on error. */ +static my_bool +wf_incremental_init(xb_write_filt_ctxt_t *ctxt, char *dst_name, + xb_fil_cur_t *cursor) +{ + char meta_name[FN_REFLEN]; + ulint buf_size; + xb_wf_incremental_ctxt_t *cp = + &(ctxt->u.wf_incremental_ctxt); + + ctxt->cursor = cursor; + + /* allocate buffer for incremental backup (4096 pages) */ + buf_size = (cursor->page_size.physical() / 4 + 1) + * cursor->page_size.physical(); + cp->delta_buf_base = static_cast(malloc(buf_size)); + memset(cp->delta_buf_base, 0, buf_size); + cp->delta_buf = static_cast + (ut_align(cp->delta_buf_base, UNIV_PAGE_SIZE_MAX)); + + /* write delta meta info */ + snprintf(meta_name, sizeof(meta_name), "%s%s", dst_name, + XB_DELTA_INFO_SUFFIX); + const xb_delta_info_t info(cursor->page_size, cursor->space_id); + if (!xb_write_delta_metadata(meta_name, &info)) { + msg("[%02u] xtrabackup: Error: " + "failed to write meta info for %s\n", + cursor->thread_n, cursor->rel_path); + return(FALSE); + } + + /* change the target file name, since we are only going to write + delta pages */ + strcat(dst_name, ".delta"); + + mach_write_to_4(cp->delta_buf, 0x78747261UL); /*"xtra"*/ + cp->npages = 1; + + return(TRUE); +} + +/************************************************************************ +Run the next batch of pages through incremental page write filter. + +@return TRUE on success, FALSE on error. */ +static my_bool +wf_incremental_process(xb_write_filt_ctxt_t *ctxt, ds_file_t *dstfile) +{ + ulint i; + xb_fil_cur_t *cursor = ctxt->cursor; + byte *page; + const ulint page_size + = cursor->page_size.physical(); + xb_wf_incremental_ctxt_t *cp = &(ctxt->u.wf_incremental_ctxt); + + for (i = 0, page = cursor->buf; i < cursor->buf_npages; + i++, page += page_size) { + + if (incremental_lsn >= mach_read_from_8(page + FIL_PAGE_LSN)) { + + continue; + } + + /* updated page */ + if (cp->npages == page_size / 4) { + /* flush buffer */ + if (ds_write(dstfile, cp->delta_buf, + cp->npages * page_size)) { + return(FALSE); + } + + /* clear buffer */ + memset(cp->delta_buf, 0, page_size / 4 * page_size); + /*"xtra"*/ + mach_write_to_4(cp->delta_buf, 0x78747261UL); + cp->npages = 1; + } + + mach_write_to_4(cp->delta_buf + cp->npages * 4, + cursor->buf_page_no + i); + memcpy(cp->delta_buf + cp->npages * page_size, page, + page_size); + + cp->npages++; + } + + return(TRUE); +} + +/************************************************************************ +Flush the incremental page write filter's buffer. + +@return TRUE on success, FALSE on error. */ +static my_bool +wf_incremental_finalize(xb_write_filt_ctxt_t *ctxt, ds_file_t *dstfile) +{ + xb_fil_cur_t *cursor = ctxt->cursor; + const ulint page_size + = cursor->page_size.physical(); + xb_wf_incremental_ctxt_t *cp = &(ctxt->u.wf_incremental_ctxt); + + if (cp->npages != page_size / 4) { + mach_write_to_4(cp->delta_buf + cp->npages * 4, 0xFFFFFFFFUL); + } + + /* Mark the final block */ + mach_write_to_4(cp->delta_buf, 0x58545241UL); /*"XTRA"*/ + + /* flush buffer */ + if (ds_write(dstfile, cp->delta_buf, cp->npages * page_size)) { + return(FALSE); + } + + return(TRUE); +} + +/************************************************************************ +Free the incremental page write filter's buffer. */ +static void +wf_incremental_deinit(xb_write_filt_ctxt_t *ctxt) +{ + xb_wf_incremental_ctxt_t *cp = &(ctxt->u.wf_incremental_ctxt); + + free(cp->delta_buf_base); +} + +/************************************************************************ +Initialize the write-through page write filter. + +@return TRUE on success, FALSE on error. */ +static my_bool +wf_wt_init(xb_write_filt_ctxt_t *ctxt, char *dst_name __attribute__((unused)), + xb_fil_cur_t *cursor) +{ + ctxt->cursor = cursor; + + return(TRUE); +} + +/************************************************************************ +Write the next batch of pages to the destination datasink. + +@return TRUE on success, FALSE on error. */ +static my_bool +wf_wt_process(xb_write_filt_ctxt_t *ctxt, ds_file_t *dstfile) +{ + xb_fil_cur_t *cursor = ctxt->cursor; + + if (ds_write(dstfile, cursor->buf, cursor->buf_read)) { + return(FALSE); + } + + return(TRUE); +} diff --git a/extra/mariabackup/write_filt.h b/extra/mariabackup/write_filt.h new file mode 100644 index 00000000000..bcab263f1dd --- /dev/null +++ b/extra/mariabackup/write_filt.h @@ -0,0 +1,58 @@ +/****************************************************** +XtraBackup: hot backup tool for InnoDB +(c) 2009-2013 Percona LLC and/or its affiliates. +Originally Created 3/3/2009 Yasufumi Kinoshita +Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko, +Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +/* Page write filter interface */ + +#ifndef XB_WRITE_FILT_H +#define XB_WRITE_FILT_H + +#include "fil_cur.h" +#include "datasink.h" + +/* Incremental page filter context */ +typedef struct { + byte *delta_buf_base; + byte *delta_buf; + ulint npages; +} xb_wf_incremental_ctxt_t; + +/* Page filter context used as an opaque structure by callers */ +typedef struct { + xb_fil_cur_t *cursor; + union { + xb_wf_incremental_ctxt_t wf_incremental_ctxt; + } u; +} xb_write_filt_ctxt_t; + + +typedef struct { + my_bool (*init)(xb_write_filt_ctxt_t *ctxt, char *dst_name, + xb_fil_cur_t *cursor); + my_bool (*process)(xb_write_filt_ctxt_t *ctxt, ds_file_t *dstfile); + my_bool (*finalize)(xb_write_filt_ctxt_t *, ds_file_t *dstfile); + void (*deinit)(xb_write_filt_ctxt_t *); +} xb_write_filt_t; + +extern xb_write_filt_t wf_write_through; +extern xb_write_filt_t wf_incremental; + +#endif /* XB_WRITE_FILT_H */ diff --git a/extra/mariabackup/wsrep.cc b/extra/mariabackup/wsrep.cc new file mode 100644 index 00000000000..be11e058255 --- /dev/null +++ b/extra/mariabackup/wsrep.cc @@ -0,0 +1,220 @@ +/****************************************************** +Percona XtraBackup: hot backup tool for InnoDB +(c) 2009-2014 Percona LLC and/or its affiliates +Originally Created 3/3/2009 Yasufumi Kinoshita +Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko, +Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +******************************************************* + +This file incorporates work covered by the following copyright and +permission notice: + + Copyright 2010 Codership Oy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#include +#include +#include +#include + +#include "common.h" +#ifdef WITH_WSREP +#define WSREP_XID_PREFIX "WSREPXid" +#define WSREP_XID_PREFIX_LEN MYSQL_XID_PREFIX_LEN +#define WSREP_XID_UUID_OFFSET 8 +#define WSREP_XID_SEQNO_OFFSET (WSREP_XID_UUID_OFFSET + sizeof(wsrep_uuid_t)) +#define WSREP_XID_GTRID_LEN (WSREP_XID_SEQNO_OFFSET + sizeof(wsrep_seqno_t)) + +/*! undefined seqno */ +#define WSREP_SEQNO_UNDEFINED (-1) + +/*! Name of file where Galera info is stored on recovery */ +#define XB_GALERA_INFO_FILENAME "xtrabackup_galera_info" + +/* Galera UUID type - for all unique IDs */ +typedef struct wsrep_uuid { + unsigned char data[16]; +} wsrep_uuid_t; + +/* sequence number of a writeset, etc. */ +typedef long long wsrep_seqno_t; + +/* Undefined UUID */ +static const wsrep_uuid_t WSREP_UUID_UNDEFINED = {{0,}}; + +/***********************************************************************//** +Check if a given WSREP XID is valid. + +@return true if valid. +*/ +static +bool +wsrep_is_wsrep_xid( +/*===============*/ + const void* xid_ptr) +{ + const XID* xid = reinterpret_cast(xid_ptr); + + return((xid->formatID == 1 && + xid->gtrid_length == WSREP_XID_GTRID_LEN && + xid->bqual_length == 0 && + !memcmp(xid->data, WSREP_XID_PREFIX, WSREP_XID_PREFIX_LEN))); +} + +/***********************************************************************//** +Retrieve binary WSREP UUID from XID. + +@return binary WSREP UUID represenataion, if UUID is valid, or + WSREP_UUID_UNDEFINED otherwise. +*/ +static +const wsrep_uuid_t* +wsrep_xid_uuid( +/*===========*/ + const XID* xid) +{ + if (wsrep_is_wsrep_xid(xid)) { + return(reinterpret_cast + (xid->data + WSREP_XID_UUID_OFFSET)); + } else { + return(&WSREP_UUID_UNDEFINED); + } +} + +/***********************************************************************//** +Retrieve WSREP seqno from XID. + +@return WSREP seqno, if it is valid, or WSREP_SEQNO_UNDEFINED otherwise. +*/ +wsrep_seqno_t wsrep_xid_seqno( +/*==========================*/ + const XID* xid) +{ + if (wsrep_is_wsrep_xid(xid)) { + wsrep_seqno_t seqno; + memcpy(&seqno, xid->data + WSREP_XID_SEQNO_OFFSET, + sizeof(wsrep_seqno_t)); + + return(seqno); + } else { + return(WSREP_SEQNO_UNDEFINED); + } +} + +/***********************************************************************//** +Write UUID to string. + +@return length of UUID string representation or -EMSGSIZE if string is too +short. +*/ +static +int +wsrep_uuid_print( +/*=============*/ + const wsrep_uuid_t* uuid, + char* str, + size_t str_len) +{ + if (str_len > 36) { + const unsigned char* u = uuid->data; + return snprintf(str, str_len, + "%02x%02x%02x%02x-%02x%02x-%02x%02x-" + "%02x%02x-%02x%02x%02x%02x%02x%02x", + u[ 0], u[ 1], u[ 2], u[ 3], u[ 4], u[ 5], u[ 6], + u[ 7], u[ 8], u[ 9], u[10], u[11], u[12], u[13], + u[14], u[15]); + } + else { + return -EMSGSIZE; + } +} + +/*********************************************************************** +Store Galera checkpoint info in the 'xtrabackup_galera_info' file, if that +information is present in the trx system header. Otherwise, do nothing. */ +void +xb_write_galera_info(bool incremental_prepare) +/*==================*/ +{ + FILE* fp; + XID xid; + char uuid_str[40]; + wsrep_seqno_t seqno; + MY_STAT statinfo; + + /* Do not overwrite existing an existing file to be compatible with + servers with older server versions */ + if (!incremental_prepare && + my_stat(XB_GALERA_INFO_FILENAME, &statinfo, MYF(0)) != NULL) { + + return; + } + + memset(&xid, 0, sizeof(xid)); + xid.formatID = -1; + + if (!trx_sys_read_wsrep_checkpoint(&xid)) { + + return; + } + + if (wsrep_uuid_print(wsrep_xid_uuid(&xid), uuid_str, + sizeof(uuid_str)) < 0) { + return; + } + + fp = fopen(XB_GALERA_INFO_FILENAME, "w"); + if (fp == NULL) { + + msg("xtrabackup: error: " + "could not create " XB_GALERA_INFO_FILENAME + ", errno = %d\n", + errno); + exit(EXIT_FAILURE); + } + + seqno = wsrep_xid_seqno(&xid); + + msg("xtrabackup: Recovered WSREP position: %s:%lld\n", + uuid_str, (long long) seqno); + + if (fprintf(fp, "%s:%lld", uuid_str, (long long) seqno) < 0) { + + msg("xtrabackup: error: " + "could not write to " XB_GALERA_INFO_FILENAME + ", errno = %d\n", + errno); + exit(EXIT_FAILURE); + } + + fclose(fp); +} +#endif diff --git a/extra/mariabackup/xb0xb.h b/extra/mariabackup/xb0xb.h new file mode 100644 index 00000000000..59938a014c6 --- /dev/null +++ b/extra/mariabackup/xb0xb.h @@ -0,0 +1,27 @@ +/****************************************************** +Copyright (c) 2012 Percona LLC and/or its affiliates. + +Declarations of XtraBackup functions called by InnoDB code. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#ifndef xb0xb_h +#define xb0xb_h + +extern const char *innodb_checksum_algorithm_names[]; +extern TYPELIB innodb_checksum_algorithm_typelib; + +#endif diff --git a/extra/mariabackup/xb_regex.h b/extra/mariabackup/xb_regex.h new file mode 100644 index 00000000000..2e07e434e27 --- /dev/null +++ b/extra/mariabackup/xb_regex.h @@ -0,0 +1,48 @@ +/****************************************************** +Copyright (c) 2011-2013 Percona LLC and/or its affiliates. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +/* This file is required to abstract away regex(3) calls so that +my_regex is used on Windows and native calls are used on POSIX platforms. */ + +#ifndef XB_REGEX_H +#define XB_REGEX_H + +#ifdef HAVE_SYSTEM_REGEX +#include +#else +#include +#endif + +typedef regex_t* xb_regex_t; + +#define xb_regex_init() + +#define xb_regexec(preg,string,nmatch,pmatch,eflags) \ + regexec(preg, string, nmatch, pmatch, eflags) + +#define xb_regerror(errcode,preg,errbuf,errbuf_size) \ + regerror(errcode, preg, errbuf, errbuf_size) + +#define xb_regcomp(preg,regex,cflags) \ + regcomp(preg, regex, cflags) + +#define xb_regfree(preg) regfree(preg) + +#define xb_regex_end() + +#endif /* XB_REGEX_H */ diff --git a/extra/mariabackup/xbcloud.cc b/extra/mariabackup/xbcloud.cc new file mode 100644 index 00000000000..56661b03dd0 --- /dev/null +++ b/extra/mariabackup/xbcloud.cc @@ -0,0 +1,2721 @@ +/****************************************************** +Copyright (c) 2014 Percona LLC and/or its affiliates. + +The xbstream utility: serialize/deserialize files in the XBSTREAM format. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "xbstream.h" + +using std::min; +using std::max; +using std::map; +using std::string; + +#define XBCLOUD_VERSION "1.0" + +#define SWIFT_MAX_URL_SIZE 8192 +#define SWIFT_MAX_HDR_SIZE 8192 + +#define SWIFT_CHUNK_SIZE 11 * 1024 * 1024 + +#if ((LIBCURL_VERSION_MAJOR >= 7) && (LIBCURL_VERSION_MINOR >= 16)) +#define OLD_CURL_MULTI 0 +#else +#define OLD_CURL_MULTI 1 +#endif + +/*****************************************************************************/ + +typedef struct swift_auth_info_struct swift_auth_info; +typedef struct connection_info_struct connection_info; +typedef struct socket_info_struct socket_info; +typedef struct global_io_info_struct global_io_info; +typedef struct slo_chunk_struct slo_chunk; +typedef struct container_list_struct container_list; +typedef struct object_info_struct object_info; + +struct swift_auth_info_struct { + char url[SWIFT_MAX_URL_SIZE]; + char token[SWIFT_MAX_HDR_SIZE]; +}; + +struct global_io_info_struct { + struct ev_loop *loop; + struct ev_io input_event; + struct ev_timer timer_event; + CURLM *multi; + int still_running; + int eof; + curl_socket_t input_fd; + connection_info **connections; + long chunk_no; + connection_info *current_connection; + const char *url; + const char *container; + const char *token; + const char *backup_name; +}; + +struct socket_info_struct { + curl_socket_t sockfd; + CURL *easy; + int action; + long timeout; + struct ev_io ev; + int evset; + global_io_info *global; +}; + +struct connection_info_struct { + CURL *easy; + global_io_info *global; + char *buffer; + size_t buffer_size; + size_t filled_size; + size_t upload_size; + bool chunk_uploaded; + bool chunk_acked; + char error[CURL_ERROR_SIZE]; + struct curl_slist *slist; + char *name; + size_t name_len; + char hash[33]; + size_t chunk_no; + bool magic_verified; + size_t chunk_path_len; + xb_chunk_type_t chunk_type; + size_t payload_size; + size_t chunk_size; + int retry_count; + bool upload_started; + ulong global_idx; +}; + +struct slo_chunk_struct { + char name[SWIFT_MAX_URL_SIZE]; + char md5[33]; + int idx; + size_t size; +}; + +struct object_info_struct { + char hash[33]; + char name[SWIFT_MAX_URL_SIZE]; + size_t bytes; +}; + +struct container_list_struct { + size_t content_length; + size_t content_bufsize; + char *content_json; + size_t object_count; + size_t idx; + object_info *objects; + bool final; +}; + +enum {SWIFT, S3}; +const char *storage_names[] = +{ "SWIFT", "S3", NullS}; + +static my_bool opt_verbose = 0; +static ulong opt_storage = SWIFT; +static const char *opt_swift_user = NULL; +static const char *opt_swift_user_id = NULL; +static const char *opt_swift_password = NULL; +static const char *opt_swift_tenant = NULL; +static const char *opt_swift_tenant_id = NULL; +static const char *opt_swift_project = NULL; +static const char *opt_swift_project_id = NULL; +static const char *opt_swift_domain = NULL; +static const char *opt_swift_domain_id = NULL; +static const char *opt_swift_region = NULL; +static const char *opt_swift_container = NULL; +static const char *opt_swift_storage_url = NULL; +static const char *opt_swift_auth_url = NULL; +static const char *opt_swift_key = NULL; +static const char *opt_swift_auth_version = NULL; +static const char *opt_name = NULL; +static const char *opt_cacert = NULL; +static ulong opt_parallel = 1; +static my_bool opt_insecure = 0; +static enum {MODE_GET, MODE_PUT, MODE_DELETE} opt_mode; + +static char **file_list = NULL; +static int file_list_size = 0; + +TYPELIB storage_typelib = +{array_elements(storage_names)-1, "", storage_names, NULL}; + +enum { + OPT_STORAGE = 256, + OPT_SWIFT_CONTAINER, + OPT_SWIFT_AUTH_URL, + OPT_SWIFT_KEY, + OPT_SWIFT_USER, + OPT_SWIFT_USER_ID, + OPT_SWIFT_PASSWORD, + OPT_SWIFT_TENANT, + OPT_SWIFT_TENANT_ID, + OPT_SWIFT_PROJECT, + OPT_SWIFT_PROJECT_ID, + OPT_SWIFT_DOMAIN, + OPT_SWIFT_DOMAIN_ID, + OPT_SWIFT_REGION, + OPT_SWIFT_STORAGE_URL, + OPT_SWIFT_AUTH_VERSION, + OPT_PARALLEL, + OPT_CACERT, + OPT_INSECURE, + OPT_VERBOSE +}; + + +static struct my_option my_long_options[] = +{ + {"help", '?', "Display this help and exit.", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"storage", OPT_STORAGE, "Specify storage type S3/SWIFT.", + &opt_storage, &opt_storage, &storage_typelib, + GET_ENUM, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"swift-auth-version", OPT_SWIFT_AUTH_VERSION, + "Swift authentication verison to use.", + &opt_swift_auth_version, &opt_swift_auth_version, 0, + GET_STR_ALLOC, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + + {"swift-container", OPT_SWIFT_CONTAINER, + "Swift container to store backups into.", + &opt_swift_container, &opt_swift_container, 0, + GET_STR_ALLOC, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + + {"swift-user", OPT_SWIFT_USER, + "Swift user name.", + &opt_swift_user, &opt_swift_user, 0, GET_STR_ALLOC, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + + {"swift-user-id", OPT_SWIFT_USER_ID, + "Swift user ID.", + &opt_swift_user_id, &opt_swift_user_id, 0, GET_STR_ALLOC, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + + {"swift-auth-url", OPT_SWIFT_AUTH_URL, + "Base URL of SWIFT authentication service.", + &opt_swift_auth_url, &opt_swift_auth_url, 0, + GET_STR_ALLOC, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + + {"swift-storage-url", OPT_SWIFT_STORAGE_URL, + "URL of object-store endpoint. Usually received from authentication " + "service. Specify to override this value.", + &opt_swift_storage_url, &opt_swift_storage_url, 0, + GET_STR_ALLOC, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + + {"swift-key", OPT_SWIFT_KEY, + "Swift key.", + &opt_swift_key, &opt_swift_key, 0, GET_STR_ALLOC, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + + {"swift-tenant", OPT_SWIFT_TENANT, + "The tenant name. Both the --swift-tenant and --swift-tenant-id " + "options are optional, but should not be specified together.", + &opt_swift_tenant, &opt_swift_tenant, 0, GET_STR_ALLOC, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + + {"swift-tenant-id", OPT_SWIFT_TENANT_ID, + "The tenant ID. Both the --swift-tenant and --swift-tenant-id " + "options are optional, but should not be specified together.", + &opt_swift_tenant_id, &opt_swift_tenant_id, 0, + GET_STR_ALLOC, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + + {"swift-project", OPT_SWIFT_PROJECT, + "The project name.", + &opt_swift_project, &opt_swift_project, 0, GET_STR_ALLOC, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + + {"swift-project-id", OPT_SWIFT_PROJECT_ID, + "The project ID.", + &opt_swift_project_id, &opt_swift_project_id, 0, + GET_STR_ALLOC, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + + {"swift-domain", OPT_SWIFT_DOMAIN, + "The domain name.", + &opt_swift_domain, &opt_swift_domain, 0, GET_STR_ALLOC, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + + {"swift-domain-id", OPT_SWIFT_DOMAIN_ID, + "The domain ID.", + &opt_swift_domain_id, &opt_swift_domain_id, 0, + GET_STR_ALLOC, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + + {"swift-password", OPT_SWIFT_PASSWORD, + "The password of the user.", + &opt_swift_password, &opt_swift_password, 0, + GET_STR_ALLOC, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + + {"swift-region", OPT_SWIFT_REGION, + "The region object-store endpoint.", + &opt_swift_region, &opt_swift_region, 0, + GET_STR_ALLOC, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + + {"parallel", OPT_PARALLEL, + "Number of parallel chunk uploads.", + &opt_parallel, &opt_parallel, 0, GET_ULONG, REQUIRED_ARG, + 1, 0, 0, 0, 0, 0}, + + {"cacert", OPT_CACERT, + "CA certificate file.", + &opt_cacert, &opt_cacert, 0, GET_STR_ALLOC, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + + {"insecure", OPT_INSECURE, + "Do not verify server SSL certificate.", + &opt_insecure, &opt_insecure, 0, GET_BOOL, NO_ARG, + 0, 0, 0, 0, 0, 0}, + + {"verbose", OPT_VERBOSE, + "Turn ON cURL tracing.", + &opt_verbose, &opt_verbose, 0, GET_BOOL, NO_ARG, + 0, 0, 0, 0, 0, 0}, + + {0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} +}; + +/* The values of these arguments should be masked + on the command line */ +static const char * const masked_args[] = { + "--swift-password", + "--swift-key", + "--swift-auth-url", + "--swift-storage-url", + "--swift-container", + "--swift-user", + "--swift-tenant", + "--swift-user-id", + "--swift-tenant-id", + 0 +}; + +static map file_chunk_count; + +static +void +print_version() +{ + printf("%s Ver %s for %s (%s)\n", my_progname, XBCLOUD_VERSION, + SYSTEM_TYPE, MACHINE_TYPE); +} + +static +void +usage() +{ + print_version(); + puts("Copyright (C) 2015 Percona LLC and/or its affiliates."); + puts("This software comes with ABSOLUTELY NO WARRANTY. " + "This is free software,\nand you are welcome to modify and " + "redistribute it under the GPL license.\n"); + + puts("Manage backups on Cloud services.\n"); + + puts("Usage: "); + printf(" %s -c put [OPTIONS...] upload backup from STDIN into " + "the cloud service with given name.\n", my_progname); + printf(" %s -c get [OPTIONS...] [FILES...] stream specified " + "backup or individual files from cloud service into STDOUT.\n", + my_progname); + + puts("\nOptions:"); + my_print_help(my_long_options); +} + +static +my_bool +get_one_option(int optid, const struct my_option *opt __attribute__((unused)), + char *argument __attribute__((unused))) +{ + switch (optid) { + case '?': + usage(); + exit(0); + } + + return(FALSE); +} + +static const char *load_default_groups[]= + { "xbcloud", 0 }; + +/*********************************************************************//** +mask sensitive values on the command line */ +static +void +mask_args(int argc, char **argv) +{ + int i; + for (i = 0; i < argc-1; i++) { + int j = 0; + if (argv[i]) while (masked_args[j]) { + char *p; + if ((p = strstr(argv[i], masked_args[j]))) { + p += strlen(masked_args[j]); + while (*p && *p != '=') { + p++; + } + if (*p == '=') { + p++; + while (*p) { + *p++ = 'x'; + } + } + } + j++; + } + } +} + +static +int parse_args(int argc, char **argv) +{ + const char *command; + + if (argc < 2) { + fprintf(stderr, "Command isn't specified. " + "Supported commands are put and get\n"); + usage(); + exit(EXIT_FAILURE); + } + + command = argv[1]; + argc--; argv++; + + if (strcasecmp(command, "put") == 0) { + opt_mode = MODE_PUT; + } else if (strcasecmp(command, "get") == 0) { + opt_mode = MODE_GET; + } else if (strcasecmp(command, "delete") == 0) { + opt_mode = MODE_DELETE; + } else { + fprintf(stderr, "Unknown command %s. " + "Supported commands are put and get\n", command); + usage(); + exit(EXIT_FAILURE); + } + + if (load_defaults("my", load_default_groups, &argc, &argv)) { + exit(EXIT_FAILURE); + } + + if (handle_options(&argc, &argv, my_long_options, get_one_option)) { + exit(EXIT_FAILURE); + } + + /* make sure name is specified */ + if (argc < 1) { + fprintf(stderr, "Backup name is required argument\n"); + exit(EXIT_FAILURE); + } + opt_name = argv[0]; + argc--; argv++; + + /* validate arguments */ + if (opt_storage == SWIFT) { + if (opt_swift_user == NULL) { + fprintf(stderr, "Swift user is not specified\n"); + exit(EXIT_FAILURE); + } + if (opt_swift_container == NULL) { + fprintf(stderr, + "Swift container is not specified\n"); + exit(EXIT_FAILURE); + } + if (opt_swift_auth_url == NULL) { + fprintf(stderr, "Swift auth URL is not specified\n"); + exit(EXIT_FAILURE); + } + } else { + fprintf(stderr, "Swift is only supported storage API\n"); + } + + if (argc > 0) { + file_list = argv; + file_list_size = argc; + } + + return(0); +} + +static char *hex_md5(const unsigned char *hash, char *out) +{ + enum { hash_len = 16 }; + char *p; + int i; + + for (i = 0, p = out; i < hash_len; i++, p+=2) { + sprintf(p, "%02x", hash[i]); + } + + return out; +} + +/* If header starts with prefix it's value will be copied into output buffer */ +static +int get_http_header(const char *prefix, const char *buffer, + char *out, size_t out_size) +{ + const char *beg, *end; + size_t len, prefix_len; + + prefix_len = strlen(prefix); + + if (strncasecmp(buffer, prefix, prefix_len) == 0) { + beg = buffer + prefix_len; + end = strchr(beg, '\r'); + + len = min(end - beg, out_size - 1); + + strncpy(out, beg, len); + + out[len] = 0; + + return 1; + } + + return 0; +} + +static +size_t swift_auth_header_read_cb(char *ptr, size_t size, size_t nmemb, + void *data) +{ + swift_auth_info *info = (swift_auth_info*)(data); + + get_http_header("X-Storage-Url: ", ptr, + info->url, array_elements(info->url)); + get_http_header("X-Auth-Token: ", ptr, + info->token, array_elements(info->token)); + + return nmemb * size; +} + +/*********************************************************************//** +Authenticate against Swift TempAuth. Fills swift_auth_info struct. +Uses creadentials privided as global variables. +@returns true if access is granted and token received. */ +static +bool +swift_temp_auth(const char *auth_url, swift_auth_info *info) +{ + CURL *curl; + CURLcode res; + long http_code; + char *hdr_buf = NULL; + struct curl_slist *slist = NULL; + + if (opt_swift_user == NULL) { + fprintf(stderr, "Swift user must be specified for TempAuth.\n"); + return(false); + } + + if (opt_swift_key == NULL) { + fprintf(stderr, "Swift key must be specified for TempAuth.\n"); + return(false); + } + + curl = curl_easy_init(); + + if (curl != NULL) { + + hdr_buf = (char *)(calloc(14 + max(strlen(opt_swift_user), + strlen(opt_swift_key)), 1)); + + if (!hdr_buf) { + res = CURLE_FAILED_INIT; + goto cleanup; + } + + sprintf(hdr_buf, "X-Auth-User: %s", opt_swift_user); + slist = curl_slist_append(slist, hdr_buf); + + sprintf(hdr_buf, "X-Auth-Key: %s", opt_swift_key); + slist = curl_slist_append(slist, hdr_buf); + + curl_easy_setopt(curl, CURLOPT_VERBOSE, opt_verbose); + curl_easy_setopt(curl, CURLOPT_URL, auth_url); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, + swift_auth_header_read_cb); + curl_easy_setopt(curl, CURLOPT_HEADERDATA, info); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist); + if (opt_cacert != NULL) + curl_easy_setopt(curl, CURLOPT_CAINFO, opt_cacert); + if (opt_insecure) + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE); + + res = curl_easy_perform(curl); + + if (res != CURLE_OK) { + fprintf(stderr, "error: authentication failed: " + "curl_easy_perform(): %s\n", + curl_easy_strerror(res)); + goto cleanup; + } + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); + if (http_code != 200 && + http_code != 204) { + fprintf(stderr, "error: authentication failed " + "with response code: %ld\n", http_code); + res = CURLE_LOGIN_DENIED; + goto cleanup; + } + } else { + res = CURLE_FAILED_INIT; + fprintf(stderr, "error: curl_easy_init() failed\n"); + goto cleanup; + } + +cleanup: + if (hdr_buf) { + free(hdr_buf); + } + if (slist) { + curl_slist_free_all(slist); + } + if (curl) { + curl_easy_cleanup(curl); + } + + if (res == CURLE_OK) { + /* check that we received token and storage URL */ + if (*info->url == 0) { + fprintf(stderr, "error: malformed response: " + "X-Storage-Url is missing\n"); + return(false); + } + if (*info->token == 0) { + fprintf(stderr, "error: malformed response: " + "X-Auth-Token is missing\n"); + return(false); + } + return(true); + } + + return(false); +} + +static +size_t +write_null_cb(char *buffer, size_t size, size_t nmemb, void *stream) +{ + return fwrite(buffer, size, nmemb, stderr); +} + + +static +size_t +read_null_cb(char *ptr, size_t size, size_t nmemb, void *data) +{ + return 0; +} + + +static +int +swift_create_container(swift_auth_info *info, const char *name) +{ + char url[SWIFT_MAX_URL_SIZE]; + char auth_token[SWIFT_MAX_HDR_SIZE]; + CURLcode res; + long http_code; + CURL *curl; + struct curl_slist *slist = NULL; + + snprintf(url, array_elements(url), "%s/%s", info->url, name); + snprintf(auth_token, array_elements(auth_token), "X-Auth-Token: %s", + info->token); + + curl = curl_easy_init(); + + if (curl != NULL) { + slist = curl_slist_append(slist, auth_token); + slist = curl_slist_append(slist, "Content-Length: 0"); + + curl_easy_setopt(curl, CURLOPT_VERBOSE, opt_verbose); + curl_easy_setopt(curl, CURLOPT_URL, url); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_null_cb); + curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_null_cb); + curl_easy_setopt(curl, CURLOPT_INFILESIZE, 0L); + curl_easy_setopt(curl, CURLOPT_PUT, 1L); + if (opt_cacert != NULL) + curl_easy_setopt(curl, CURLOPT_CAINFO, opt_cacert); + if (opt_insecure) + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE); + + res = curl_easy_perform(curl); + + if (res != CURLE_OK) { + fprintf(stderr, + "error: curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + goto cleanup; + } + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); + if (http_code != 201 && /* created */ + http_code != 202 /* accepted (already exists) */) { + fprintf(stderr, "error: request failed " + "with response code: %ld\n", http_code); + res = CURLE_LOGIN_DENIED; + goto cleanup; + } + } else { + res = CURLE_FAILED_INIT; + fprintf(stderr, "error: curl_easy_init() failed\n"); + goto cleanup; + } + +cleanup: + if (slist) { + curl_slist_free_all(slist); + } + if (curl) { + curl_easy_cleanup(curl); + } + + return res; +} + + +/*********************************************************************//** +Delete object with given url. +@returns true if object deleted successfully. */ +static +bool +swift_delete_object(swift_auth_info *info, const char *url) +{ + char auth_token[SWIFT_MAX_HDR_SIZE]; + CURLcode res; + long http_code; + CURL *curl; + struct curl_slist *slist = NULL; + bool ret = false; + + snprintf(auth_token, array_elements(auth_token), "X-Auth-Token: %s", + info->token); + + curl = curl_easy_init(); + + if (curl != NULL) { + slist = curl_slist_append(slist, auth_token); + + curl_easy_setopt(curl, CURLOPT_VERBOSE, opt_verbose); + curl_easy_setopt(curl, CURLOPT_URL, url); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE"); + if (opt_cacert != NULL) + curl_easy_setopt(curl, CURLOPT_CAINFO, opt_cacert); + if (opt_insecure) + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE); + + res = curl_easy_perform(curl); + + if (res != CURLE_OK) { + fprintf(stderr, + "error: curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + goto cleanup; + } + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); + if (http_code != 200 && /* OK */ + http_code != 204 /* no content */) { + fprintf(stderr, "error: request failed " + "with response code: %ld\n", http_code); + goto cleanup; + } + ret = true; + } else { + fprintf(stderr, "error: curl_easy_init() failed\n"); + goto cleanup; + } + +cleanup: + if (slist) { + curl_slist_free_all(slist); + } + if (curl) { + curl_easy_cleanup(curl); + } + + return ret; +} + +static int conn_upload_init(connection_info *conn); +static void conn_buffer_updated(connection_info *conn); +static connection_info *conn_new(global_io_info *global, ulong global_idx); +static void conn_cleanup(connection_info *conn); +static void conn_upload_retry(connection_info *conn); + +/* Check for completed transfers, and remove their easy handles */ +static void check_multi_info(global_io_info *g) +{ + char *eff_url; + CURLMsg *msg; + int msgs_left; + connection_info *conn; + CURL *easy; + + while ((msg = curl_multi_info_read(g->multi, &msgs_left))) { + if (msg->msg == CURLMSG_DONE) { + easy = msg->easy_handle; + curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn); + curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, + &eff_url); + curl_multi_remove_handle(g->multi, easy); + curl_easy_cleanup(easy); + conn->easy = NULL; + if (conn->chunk_acked) { + conn->chunk_uploaded = true; + fprintf(stderr, "%s is done\n", conn->hash); + } else { + fprintf(stderr, "error: chunk %zu '%s' %s " + "is not uploaded, but socket closed " + "(%zu bytes of %zu left to upload)\n", + conn->chunk_no, + conn->name, + conn->hash, + conn->chunk_size - conn->upload_size, + conn->chunk_size); + conn_upload_retry(conn); + } + } + } +} + +/* Die if we get a bad CURLMcode somewhere */ +static void mcode_or_die(const char *where, CURLMcode code) +{ + if (code != CURLM_OK) + { + const char *s; + switch (code) + { + case CURLM_BAD_HANDLE: + s = "CURLM_BAD_HANDLE"; + break; + case CURLM_BAD_EASY_HANDLE: + s = "CURLM_BAD_EASY_HANDLE"; + break; + case CURLM_OUT_OF_MEMORY: + s = "CURLM_OUT_OF_MEMORY"; + break; + case CURLM_INTERNAL_ERROR: + s = "CURLM_INTERNAL_ERROR"; + break; + case CURLM_UNKNOWN_OPTION: + s = "CURLM_UNKNOWN_OPTION"; + break; + case CURLM_LAST: + s = "CURLM_LAST"; + break; + default: + s = "CURLM_unknown"; + break; + case CURLM_BAD_SOCKET: + s = "CURLM_BAD_SOCKET"; + fprintf(stderr, "error: %s returns (%d) %s\n", + where, code, s); + /* ignore this error */ + return; + } + fprintf(stderr, "error: %s returns (%d) %s\n", + where, code, s); + assert(0); + } +} + +/* Called by libev when we get action on a multi socket */ +static void event_cb(EV_P_ struct ev_io *w, int revents) +{ + global_io_info *global = (global_io_info*)(w->data); + CURLMcode rc; + +#if !(OLD_CURL_MULTI) + int action = (revents & EV_READ ? CURL_POLL_IN : 0) | + (revents & EV_WRITE ? CURL_POLL_OUT : 0); + + do { + rc = curl_multi_socket_action(global->multi, w->fd, action, + &global->still_running); + } while (rc == CURLM_CALL_MULTI_PERFORM); +#else + do { + rc = curl_multi_socket(global->multi, w->fd, + &global->still_running); + } while (rc == CURLM_CALL_MULTI_PERFORM); +#endif + mcode_or_die("error: event_cb: curl_multi_socket_action", rc); + check_multi_info(global); + if (global->still_running <= 0) { + ev_timer_stop(global->loop, &global->timer_event); + } +} + +static void remsock(curl_socket_t s, socket_info *fdp, global_io_info *global) +{ + if (fdp) { + if (fdp->evset) { + ev_io_stop(global->loop, &fdp->ev); + } + free(fdp); + } +} + +static void setsock(socket_info *fdp, curl_socket_t s, CURL *easy, int action, + global_io_info *global) +{ + int kind = (action & CURL_POLL_IN ? (int)(EV_READ) : 0) | + (action & CURL_POLL_OUT ? (int)(EV_WRITE) : 0); + + fdp->sockfd = s; + fdp->action = action; + fdp->easy = easy; + if (fdp->evset) + ev_io_stop(global->loop, &fdp->ev); + ev_io_init(&fdp->ev, event_cb, fdp->sockfd, kind); + fdp->ev.data = global; + fdp->evset = 1; + ev_io_start(global->loop, &fdp->ev); +} + +static void addsock(curl_socket_t s, CURL *easy, int action, + global_io_info *global) +{ + socket_info *fdp = (socket_info *)(calloc(sizeof(socket_info), 1)); + + fdp->global = global; + setsock(fdp, s, easy, action, global); + curl_multi_assign(global->multi, s, fdp); +} + +static int sock_cb(CURL *easy, curl_socket_t s, int what, void *cbp, + void *sockp) +{ + global_io_info *global = (global_io_info*)(cbp); + socket_info *fdp = (socket_info*)(sockp); + + if (what == CURL_POLL_REMOVE) { + remsock(s, fdp, global); + } else { + if (!fdp) { + addsock(s, easy, what, global); + } else { + setsock(fdp, s, easy, what, global); + } + } + return 0; +} + +/* Called by libev when our timeout expires */ +static void timer_cb(EV_P_ struct ev_timer *w, int revents) +{ + global_io_info *io_global = (global_io_info*)(w->data); + CURLMcode rc; + +#if !(OLD_CURL_MULTI) + do { + rc = curl_multi_socket_action(io_global->multi, + CURL_SOCKET_TIMEOUT, 0, + &io_global->still_running); + } while (rc == CURLM_CALL_MULTI_PERFORM); +#else + do { + rc = curl_multi_socket_all(io_global->multi, + &io_global->still_running); + } while (rc == CURLM_CALL_MULTI_PERFORM); +#endif + mcode_or_die("timer_cb: curl_multi_socket_action", rc); + check_multi_info(io_global); +} + +static connection_info *get_current_connection(global_io_info *global) +{ + connection_info *conn = global->current_connection; + ulong i; + + if (conn && conn->filled_size < conn->chunk_size) + return conn; + + for (i = 0; i < opt_parallel; i++) { + conn = global->connections[i]; + if (conn->chunk_uploaded || conn->filled_size == 0) { + global->current_connection = conn; + conn_upload_init(conn); + return conn; + } + } + + return NULL; +} + +/* This gets called whenever data is received from the input */ +static void input_cb(EV_P_ struct ev_io *w, int revents) +{ + global_io_info *io_global = (global_io_info *)(w->data); + connection_info *conn = get_current_connection(io_global); + + if (conn == NULL) + return; + + if (conn->filled_size < conn->chunk_size) { + if (revents & EV_READ) { + ssize_t nbytes = read(io_global->input_fd, + conn->buffer + conn->filled_size, + conn->chunk_size - + conn->filled_size); + if (nbytes > 0) { + conn->filled_size += nbytes; + conn_buffer_updated(conn); + } else if (nbytes < 0) { + if (errno != EAGAIN && errno != EINTR) { + char error[200]; + my_strerror(error, sizeof(error), + errno); + fprintf(stderr, "error: failed to read " + "input stream (%s)\n", error); + /* failed to read input */ + exit(1); + } + } else { + io_global->eof = 1; + ev_io_stop(io_global->loop, w); + } + } + } + + assert(conn->filled_size <= conn->chunk_size); +} + +static int swift_upload_read_cb(char *ptr, size_t size, size_t nmemb, + void *data) +{ + size_t realsize; + + connection_info *conn = (connection_info*)(data); + + if (conn->filled_size == conn->upload_size && + conn->upload_size < conn->chunk_size && !conn->global->eof) { + ssize_t nbytes; + assert(conn->global->current_connection == conn); + do { + nbytes = read(conn->global->input_fd, + conn->buffer + conn->filled_size, + conn->chunk_size - conn->filled_size); + } while (nbytes == -1 && errno == EAGAIN); + if (nbytes > 0) { + conn->filled_size += nbytes; + conn_buffer_updated(conn); + } else { + conn->global->eof = 1; + } + } + + realsize = min(size * nmemb, conn->filled_size - conn->upload_size); + + memcpy(ptr, conn->buffer + conn->upload_size, realsize); + conn->upload_size += realsize; + + assert(conn->filled_size <= conn->chunk_size); + assert(conn->upload_size <= conn->filled_size); + + return realsize; +} + +static +size_t upload_header_read_cb(char *ptr, size_t size, size_t nmemb, + void *data) +{ + connection_info *conn = (connection_info *)(data); + char etag[33]; + + if (get_http_header("Etag: ", ptr, etag, array_elements(etag))) { + if (strcmp(conn->hash, etag) != 0) { + fprintf(stderr, "error: ETag mismatch\n"); + exit(EXIT_FAILURE); + } + fprintf(stderr, "acked chunk %s\n", etag); + conn->chunk_acked = true; + } + + return nmemb * size; +} + +static int conn_upload_init(connection_info *conn) +{ + conn->filled_size = 0; + conn->upload_size = 0; + conn->chunk_uploaded = false; + conn->chunk_acked = false; + conn->chunk_size = CHUNK_HEADER_CONSTANT_LEN; + conn->magic_verified = false; + conn->chunk_path_len = 0; + conn->chunk_type = XB_CHUNK_TYPE_UNKNOWN; + conn->payload_size = 0; + conn->upload_started = false; + conn->retry_count = 0; + if (conn->name != NULL) { + conn->name[0] = 0; + } + + if (conn->easy != NULL) { + conn->easy = 0; + } + + if (conn->slist != NULL) { + curl_slist_free_all(conn->slist); + conn->slist = NULL; + } + + return 0; +} + +static void conn_upload_prepare(connection_info *conn) +{ + gcry_md_hd_t md5; + + gcry_md_open(&md5, GCRY_MD_MD5, 0); + gcry_md_write(md5, conn->buffer, conn->chunk_size); + hex_md5(gcry_md_read(md5, GCRY_MD_MD5), conn->hash); + gcry_md_close(md5); +} + +static int conn_upload_start(connection_info *conn) +{ + char token_header[SWIFT_MAX_HDR_SIZE]; + char object_url[SWIFT_MAX_URL_SIZE]; + char content_len[200], etag[200]; + global_io_info *global; + CURLMcode rc; + + global = conn->global; + + fprintf(stderr, "uploading chunk %s/%s/%s.%020zu " + "(md5: %s, size: %zu)\n", + global->container, global->backup_name, conn->name, + conn->chunk_no, conn->hash, conn->chunk_size); + + snprintf(object_url, array_elements(object_url), "%s/%s/%s/%s.%020zu", + global->url, global->container, global->backup_name, + conn->name, conn->chunk_no); + + snprintf(content_len, sizeof(content_len), "Content-Length: %lu", + (ulong)(conn->chunk_size)); + + snprintf(etag, sizeof(etag), "ETag: %s", conn->hash); + + snprintf(token_header, array_elements(token_header), + "X-Auth-Token: %s", global->token); + + conn->slist = curl_slist_append(conn->slist, token_header); + conn->slist = curl_slist_append(conn->slist, + "Connection: keep-alive"); + conn->slist = curl_slist_append(conn->slist, + "Content-Type: " + "application/octet-stream"); + conn->slist = curl_slist_append(conn->slist, content_len); + conn->slist = curl_slist_append(conn->slist, etag); + + conn->easy = curl_easy_init(); + if (!conn->easy) { + fprintf(stderr, "error: curl_easy_init() failed\n"); + return 1; + } + curl_easy_setopt(conn->easy, CURLOPT_URL, object_url); + curl_easy_setopt(conn->easy, CURLOPT_READFUNCTION, + swift_upload_read_cb); + curl_easy_setopt(conn->easy, CURLOPT_READDATA, conn); + curl_easy_setopt(conn->easy, CURLOPT_VERBOSE, opt_verbose); + curl_easy_setopt(conn->easy, CURLOPT_ERRORBUFFER, conn->error); + curl_easy_setopt(conn->easy, CURLOPT_PRIVATE, conn); + curl_easy_setopt(conn->easy, CURLOPT_NOPROGRESS, 1L); + curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_TIME, 5L); + curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_LIMIT, 1024L); + curl_easy_setopt(conn->easy, CURLOPT_PUT, 1L); + curl_easy_setopt(conn->easy, CURLOPT_HTTPHEADER, conn->slist); + curl_easy_setopt(conn->easy, CURLOPT_HEADERFUNCTION, + upload_header_read_cb); + curl_easy_setopt(conn->easy, CURLOPT_HEADERDATA, conn); + curl_easy_setopt(conn->easy, CURLOPT_INFILESIZE, + (long) conn->chunk_size); + if (opt_cacert != NULL) + curl_easy_setopt(conn->easy, CURLOPT_CAINFO, opt_cacert); + if (opt_insecure) + curl_easy_setopt(conn->easy, CURLOPT_SSL_VERIFYPEER, FALSE); + + rc = curl_multi_add_handle(conn->global->multi, conn->easy); + mcode_or_die("conn_upload_init: curl_multi_add_handle", rc); + +#if (OLD_CURL_MULTI) + do { + rc = curl_multi_socket_all(global->multi, + &global->still_running); + } while(rc == CURLM_CALL_MULTI_PERFORM); +#endif + + conn->upload_started = true; + + return 0; +} + +static void conn_cleanup(connection_info *conn) +{ + if (conn) { + free(conn->name); + free(conn->buffer); + if (conn->slist) { + curl_slist_free_all(conn->slist); + conn->slist = NULL; + } + if (conn->easy) { + curl_easy_cleanup(conn->easy); + conn->easy = NULL; + } + } + free(conn); +} + +static void conn_upload_retry(connection_info *conn) +{ + /* already closed by cURL */ + conn->easy = NULL; + + if (conn->slist != NULL) { + curl_slist_free_all(conn->slist); + conn->slist = NULL; + } + + if (conn->retry_count++ > 3) { + fprintf(stderr, "error: retry count limit reached\n"); + exit(EXIT_FAILURE); + } + + fprintf(stderr, "warning: retrying to upload chunk %zu of '%s'\n", + conn->chunk_no, conn->name); + + conn->upload_size = 0; + + conn_upload_start(conn); +} + +static connection_info *conn_new(global_io_info *global, ulong global_idx) +{ + connection_info *conn; + + conn = (connection_info *)(calloc(1, sizeof(connection_info))); + if (conn == NULL) { + goto error; + } + + conn->global = global; + conn->global_idx = global_idx; + conn->buffer_size = SWIFT_CHUNK_SIZE; + if ((conn->buffer = (char *)(calloc(conn->buffer_size, 1))) == + NULL) { + goto error; + } + + return conn; + +error: + if (conn != NULL) { + conn_cleanup(conn); + } + + fprintf(stderr, "error: out of memory\n"); + exit(EXIT_FAILURE); + + return NULL; +} + +/*********************************************************************//** +Handle input buffer updates. Parse chunk header and set appropriate +buffer size. */ +static +void +conn_buffer_updated(connection_info *conn) +{ + bool ready_for_upload = false; + + /* chunk header */ + if (!conn->magic_verified && + conn->filled_size >= CHUNK_HEADER_CONSTANT_LEN) { + if (strncmp(XB_STREAM_CHUNK_MAGIC, conn->buffer, + sizeof(XB_STREAM_CHUNK_MAGIC) - 1) != 0) { + + fprintf(stderr, "Error: magic expected\n"); + exit(EXIT_FAILURE); + } + conn->magic_verified = true; + conn->chunk_path_len = uint4korr(conn->buffer + + PATH_LENGTH_OFFSET); + conn->chunk_type = (xb_chunk_type_t) + (conn->buffer[CHUNK_TYPE_OFFSET]); + conn->chunk_size = CHUNK_HEADER_CONSTANT_LEN + + conn->chunk_path_len; + if (conn->chunk_type != XB_CHUNK_TYPE_EOF) { + conn->chunk_size += 16; + } + } + + /* ordinary chunk */ + if (conn->magic_verified && + conn->payload_size == 0 && + conn->chunk_type != XB_CHUNK_TYPE_EOF && + conn->filled_size >= CHUNK_HEADER_CONSTANT_LEN + + conn->chunk_path_len + 16) { + + conn->payload_size = uint8korr(conn->buffer + + CHUNK_HEADER_CONSTANT_LEN + + conn->chunk_path_len); + + conn->chunk_size = conn->payload_size + 4 + 16 + + conn->chunk_path_len + + CHUNK_HEADER_CONSTANT_LEN; + + if (conn->name == NULL) { + conn->name = (char*)(malloc(conn->chunk_path_len + 1)); + } else if (conn->name_len < conn->chunk_path_len + 1) { + conn->name = (char*)(realloc(conn->name, + conn->chunk_path_len + 1)); + } + conn->name_len = conn->chunk_path_len + 1; + + memcpy(conn->name, conn->buffer + CHUNK_HEADER_CONSTANT_LEN, + conn->chunk_path_len); + conn->name[conn->chunk_path_len] = 0; + + if (conn->buffer_size < conn->chunk_size) { + conn->buffer = + (char *)(realloc(conn->buffer, conn->chunk_size)); + conn->buffer_size = conn->chunk_size; + } + } + + /* EOF chunk has no payload */ + if (conn->magic_verified && + conn->chunk_type == XB_CHUNK_TYPE_EOF && + conn->filled_size >= CHUNK_HEADER_CONSTANT_LEN + + conn->chunk_path_len) { + + if (conn->name == NULL) { + conn->name = (char*)(malloc(conn->chunk_path_len + 1)); + } else if (conn->name_len < conn->chunk_path_len + 1) { + conn->name = (char*)(realloc(conn->name, + conn->chunk_path_len + 1)); + } + conn->name_len = conn->chunk_path_len + 1; + + memcpy(conn->name, conn->buffer + CHUNK_HEADER_CONSTANT_LEN, + conn->chunk_path_len); + conn->name[conn->chunk_path_len] = 0; + } + + if (conn->filled_size > 0 && conn->filled_size == conn->chunk_size) { + ready_for_upload = true; + } + + /* start upload once recieved the size of the chunk */ + if (!conn->upload_started && ready_for_upload) { + conn->chunk_no = file_chunk_count[conn->name]++; + conn_upload_prepare(conn); + conn_upload_start(conn); + } +} + +static int init_input(global_io_info *io_global) +{ + ev_io_init(&io_global->input_event, input_cb, STDIN_FILENO, EV_READ); + io_global->input_event.data = io_global; + ev_io_start(io_global->loop, &io_global->input_event); + + return 0; +} + +/* Update the event timer after curl_multi library calls */ +static int multi_timer_cb(CURLM *multi, long timeout_ms, global_io_info *global) +{ + ev_timer_stop(global->loop, &global->timer_event); + if (timeout_ms > 0) { + double t = timeout_ms / 1000.0; + ev_timer_init(&global->timer_event, timer_cb, t, 0.); + ev_timer_start(global->loop, &global->timer_event); + } else { + timer_cb(global->loop, &global->timer_event, 0); + } + return 0; +} + +static +int swift_upload_parts(swift_auth_info *auth, const char *container, + const char *name) +{ + global_io_info io_global; + ulong i; +#if (OLD_CURL_MULTI) + long timeout; +#endif + CURLMcode rc; + int n_dirty_buffers; + + memset(&io_global, 0, sizeof(io_global)); + + io_global.loop = ev_default_loop(0); + init_input(&io_global); + io_global.multi = curl_multi_init(); + ev_timer_init(&io_global.timer_event, timer_cb, 0., 0.); + io_global.timer_event.data = &io_global; + io_global.connections = (connection_info **) + (calloc(opt_parallel, sizeof(connection_info))); + io_global.url = auth->url; + io_global.container = container; + io_global.backup_name = name; + io_global.token = auth->token; + for (i = 0; i < opt_parallel; i++) { + io_global.connections[i] = conn_new(&io_global, i); + } + + /* setup the generic multi interface options we want */ + curl_multi_setopt(io_global.multi, CURLMOPT_SOCKETFUNCTION, sock_cb); + curl_multi_setopt(io_global.multi, CURLMOPT_SOCKETDATA, &io_global); +#if !(OLD_CURL_MULTI) + curl_multi_setopt(io_global.multi, CURLMOPT_TIMERFUNCTION, multi_timer_cb); + curl_multi_setopt(io_global.multi, CURLMOPT_TIMERDATA, &io_global); + do { + rc = curl_multi_socket_action(io_global.multi, + CURL_SOCKET_TIMEOUT, 0, + &io_global.still_running); + } while (rc == CURLM_CALL_MULTI_PERFORM); +#else + curl_multi_timeout(io_global.multi, &timeout); + if (timeout >= 0) { + multi_timer_cb(io_global.multi, timeout, &io_global); + } + do { + rc = curl_multi_socket_all(io_global.multi, &io_global.still_running); + } while(rc == CURLM_CALL_MULTI_PERFORM); +#endif + + ev_loop(io_global.loop, 0); + check_multi_info(&io_global); + curl_multi_cleanup(io_global.multi); + + n_dirty_buffers = 0; + for (i = 0; i < opt_parallel; i++) { + connection_info *conn = io_global.connections[i]; + if (conn && conn->upload_size != conn->filled_size) { + fprintf(stderr, "error: upload failed: %lu bytes left " + "in the buffer %s (uploaded = %d)\n", + (ulong)(conn->filled_size - conn->upload_size), + conn->name, conn->chunk_uploaded); + ++n_dirty_buffers; + } + } + + for (i = 0; i < opt_parallel; i++) { + if (io_global.connections[i] != NULL) { + conn_cleanup(io_global.connections[i]); + } + } + free(io_global.connections); + + if (n_dirty_buffers > 0) { + return(EXIT_FAILURE); + } + + return 0; +} + +struct download_buffer_info { + off_t offset; + size_t size; + size_t result_len; + char *buf; + curl_read_callback custom_header_callback; + void *custom_header_callback_data; +}; + +/*********************************************************************//** +Callback to parse header of GET request on swift contaier. */ +static +size_t fetch_buffer_header_cb(char *ptr, size_t size, size_t nmemb, + void *data) +{ + download_buffer_info *buffer_info = (download_buffer_info*)(data); + size_t buf_size; + char content_length_str[100]; + char *endptr; + + if (get_http_header("Content-Length: ", ptr, + content_length_str, sizeof(content_length_str))) { + + buf_size = strtoull(content_length_str, &endptr, 10); + + if (buffer_info->buf == NULL) { + buffer_info->buf = (char*)(malloc(buf_size)); + buffer_info->size = buf_size; + } + + if (buf_size > buffer_info->size) { + buffer_info->buf = (char*) + (realloc(buffer_info->buf, buf_size)); + buffer_info->size = buf_size; + } + + buffer_info->result_len = buf_size; + } + + if (buffer_info->custom_header_callback) { + buffer_info->custom_header_callback(ptr, size, nmemb, + buffer_info->custom_header_callback_data); + } + + return nmemb * size; +} + +/*********************************************************************//** +Write contents into string buffer */ +static +size_t +fetch_buffer_cb(char *buffer, size_t size, size_t nmemb, void *out_buffer) +{ + download_buffer_info *buffer_info = (download_buffer_info*)(out_buffer); + + assert(buffer_info->size >= buffer_info->offset + size * nmemb); + + memcpy(buffer_info->buf + buffer_info->offset, buffer, size * nmemb); + buffer_info->offset += size * nmemb; + + return size * nmemb; +} + + +/*********************************************************************//** +Downloads contents of URL into buffer. Caller is responsible for +deallocating the buffer. +@return pointer to a buffer or NULL */ +static +char * +swift_fetch_into_buffer(swift_auth_info *auth, const char *url, + char **buf, size_t *buf_size, size_t *result_len, + curl_read_callback header_callback, + void *header_callback_data) +{ + char auth_token[SWIFT_MAX_HDR_SIZE]; + download_buffer_info buffer_info; + struct curl_slist *slist = NULL; + long http_code; + CURL *curl; + CURLcode res; + + memset(&buffer_info, 0, sizeof(buffer_info)); + buffer_info.buf = *buf; + buffer_info.size = *buf_size; + buffer_info.custom_header_callback = header_callback; + buffer_info.custom_header_callback_data = header_callback_data; + + snprintf(auth_token, array_elements(auth_token), "X-Auth-Token: %s", + auth->token); + + curl = curl_easy_init(); + + if (curl != NULL) { + slist = curl_slist_append(slist, auth_token); + + curl_easy_setopt(curl, CURLOPT_VERBOSE, opt_verbose); + curl_easy_setopt(curl, CURLOPT_URL, url); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fetch_buffer_cb); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer_info); + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, + fetch_buffer_header_cb); + curl_easy_setopt(curl, CURLOPT_HEADERDATA, + &buffer_info); + if (opt_cacert != NULL) + curl_easy_setopt(curl, CURLOPT_CAINFO, opt_cacert); + if (opt_insecure) + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE); + + res = curl_easy_perform(curl); + + if (res != CURLE_OK) { + fprintf(stderr, + "error: curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + goto cleanup; + } + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); + if (http_code < 200 || http_code >= 300) { + fprintf(stderr, "error: request failed " + "with response code: %ld\n", http_code); + res = CURLE_LOGIN_DENIED; + goto cleanup; + } + } else { + res = CURLE_FAILED_INIT; + fprintf(stderr, "error: curl_easy_init() failed\n"); + goto cleanup; + } + +cleanup: + if (slist) { + curl_slist_free_all(slist); + } + if (curl) { + curl_easy_cleanup(curl); + } + + if (res == CURLE_OK) { + *buf = buffer_info.buf; + *buf_size = buffer_info.size; + *result_len = buffer_info.result_len; + return(buffer_info.buf); + } + + free(buffer_info.buf); + *buf = NULL; + *buf_size = 0; + *result_len = 0; + + return(NULL); +} + +static +container_list * +container_list_new() +{ + container_list *list = + (container_list *)(calloc(1, sizeof(container_list))); + + list->object_count = 1000; + list->objects = (object_info*) + (calloc(list->object_count, sizeof(object_info))); + + if (list->objects == NULL) { + fprintf(stderr, "error: out of memory\n"); + free(list); + return(NULL); + } + + return(list); +} + +static +void +container_list_free(container_list *list) +{ + free(list->content_json); + free(list->objects); + free(list); +} + +static +void +container_list_add_object(container_list *list, const char *name, + const char *hash, size_t bytes) +{ + const size_t object_count_step = 1000; + + if (list->idx >= list->object_count) { + list->objects = (object_info*) + realloc(list->objects, + (list->object_count + object_count_step) * + sizeof(object_info)); + memset(list->objects + list->object_count, 0, + object_count_step * sizeof(object_info)); + list->object_count += object_count_step; + } + assert(list->idx <= list->object_count); + strcpy(list->objects[list->idx].name, name); + strcpy(list->objects[list->idx].hash, hash); + list->objects[list->idx].bytes = bytes; + ++list->idx; +} + + +/*********************************************************************//** +Tokenize json string. Return array of tokens. Caller is responsoble for +deallocating the array. */ +jsmntok_t * +json_tokenise(char *json, size_t len, int initial_tokens) +{ + jsmn_parser parser; + jsmn_init(&parser); + + unsigned int n = initial_tokens; + jsmntok_t *tokens = (jsmntok_t *)(malloc(sizeof(jsmntok_t) * n)); + + int ret = jsmn_parse(&parser, json, len, tokens, n); + + while (ret == JSMN_ERROR_NOMEM) + { + n = n * 2 + 1; + tokens = (jsmntok_t*)(realloc(tokens, sizeof(jsmntok_t) * n)); + ret = jsmn_parse(&parser, json, len, tokens, n); + } + + if (ret == JSMN_ERROR_INVAL) { + fprintf(stderr, "error: invalid JSON string\n"); + + } + if (ret == JSMN_ERROR_PART) { + fprintf(stderr, "error: truncated JSON string\n"); + } + + return tokens; +} + +/*********************************************************************//** +Return true if token representation equal to given string. */ +static +bool +json_token_eq(const char *buf, jsmntok_t *t, const char *s) +{ + size_t len = strlen(s); + + assert(t->end > t->start); + + return((size_t)(t->end - t->start) == len && + (strncmp(buf + t->start, s, len) == 0)); +} + +/*********************************************************************//** +Copy given token as string. */ +static +bool +json_token_str(const char *buf, jsmntok_t *t, char *out, int out_size) +{ + size_t len = min(t->end - t->start, out_size - 1); + + memcpy(out, buf + t->start, len); + out[len] = 0; + + return(true); +} + +/*********************************************************************//** +Parse SWIFT container list response and fill output array with values +sorted by object name. */ +static +bool +swift_parse_container_list(container_list *list) +{ + enum {MAX_DEPTH=20}; + enum label_t {NONE, OBJECT}; + + char name[SWIFT_MAX_URL_SIZE]; + char hash[33]; + char bytes[30]; + char *response = list->content_json; + + struct stack_t { + jsmntok_t *t; + int n_items; + label_t label; + }; + + stack_t stack[MAX_DEPTH]; + jsmntok_t *tokens; + int level; + size_t count = 0; + + tokens = json_tokenise(list->content_json, list->content_length, 200); + + stack[0].t = &tokens[0]; + stack[0].label = NONE; + stack[0].n_items = 1; + level = 0; + + for (size_t i = 0, j = 1; j > 0; i++, j--) { + jsmntok_t *t = &tokens[i]; + + assert(t->start != -1 && t->end != -1); + assert(level >= 0); + + --stack[level].n_items; + + switch (t->type) { + case JSMN_ARRAY: + case JSMN_OBJECT: + if (level < MAX_DEPTH - 1) { + level++; + } + stack[level].t = t; + stack[level].label = NONE; + if (t->type == JSMN_ARRAY) { + stack[level].n_items = t->size; + j += t->size; + } else { + stack[level].n_items = t->size * 2; + j += t->size * 2; + } + break; + case JSMN_PRIMITIVE: + case JSMN_STRING: + if (stack[level].t->type == JSMN_OBJECT && + stack[level].n_items % 2 == 1) { + /* key */ + if (json_token_eq(response, t, "name")) { + json_token_str(response, &tokens[i + 1], + name, sizeof(name)); + } + if (json_token_eq(response, t, "hash")) { + json_token_str(response, &tokens[i + 1], + hash, sizeof(hash)); + } + if (json_token_eq(response, t, "bytes")) { + json_token_str(response, &tokens[i + 1], + bytes, sizeof(bytes)); + } + } + break; + } + + while (stack[level].n_items == 0 && level > 0) { + if (stack[level].t->type == JSMN_OBJECT + && level == 2) { + char *endptr; + container_list_add_object(list, name, hash, + strtoull(bytes, &endptr, 10)); + ++count; + } + --level; + } + } + + if (count == 0) { + list->final = true; + } + + free(tokens); + + return(true); +} + +/*********************************************************************//** +List swift container with given name. Return list of objects sorted by +object name. */ +static +container_list * +swift_list(swift_auth_info *auth, const char *container, const char *path) +{ + container_list *list; + char url[SWIFT_MAX_URL_SIZE]; + + list = container_list_new(); + + while (!list->final) { + + /* download the list in json format */ + snprintf(url, array_elements(url), + "%s/%s?format=json&limit=1000%s%s%s%s", + auth->url, container, path ? "&prefix=" : "", + path ? path : "", list->idx > 0 ? "&marker=" : "", + list->idx > 0 ? + list->objects[list->idx - 1].name : ""); + + list->content_json = swift_fetch_into_buffer(auth, url, + &list->content_json, &list->content_bufsize, + &list->content_length, NULL, NULL); + + if (list->content_json == NULL) { + container_list_free(list); + return(NULL); + } + + /* parse downloaded list */ + if (!swift_parse_container_list(list)) { + fprintf(stderr, "error: unable to parse " + "container list\n"); + container_list_free(list); + return(NULL); + } + } + + return(list); +} + + +/*********************************************************************//** +Return true if chunk is a part of backup with given name. */ +static +bool +chunk_belongs_to(const char *chunk_name, const char *backup_name) +{ + size_t backup_name_len = strlen(backup_name); + + return((strlen(chunk_name) > backup_name_len) + && (chunk_name[backup_name_len] == '/') + && strncmp(chunk_name, backup_name, backup_name_len) == 0); +} + +/*********************************************************************//** +Return true if chunk is in given list. */ +static +bool +chunk_in_list(const char *chunk_name, char **list, int list_size) +{ + size_t chunk_name_len; + + if (list_size == 0) { + return(true); + } + + chunk_name_len = strlen(chunk_name); + if (chunk_name_len < 20) { + return(false); + } + + for (int i = 0; i < list_size; i++) { + size_t item_len = strlen(list[i]); + + if ((strncmp(chunk_name - item_len + chunk_name_len - 21, + list[i], item_len) == 0) + && (chunk_name[chunk_name_len - 21] == '.') + && (chunk_name[chunk_name_len - item_len - 22] == '/')) { + return(true); + } + } + + return(false); +} + +static +int swift_download(swift_auth_info *auth, const char *container, + const char *name) +{ + container_list *list; + char *buf = NULL; + size_t buf_size = 0; + size_t result_len = 0; + + if ((list = swift_list(auth, container, name)) == NULL) { + return(CURLE_FAILED_INIT); + } + + for (size_t i = 0; i < list->idx; i++) { + const char *chunk_name = list->objects[i].name; + + if (chunk_belongs_to(chunk_name, name) + && chunk_in_list(chunk_name, file_list, file_list_size)) { + char url[SWIFT_MAX_URL_SIZE]; + + snprintf(url, sizeof(url), "%s/%s/%s", + auth->url, container, chunk_name); + + if ((buf = swift_fetch_into_buffer( + auth, url, &buf, &buf_size, &result_len, + NULL, NULL)) == NULL) { + fprintf(stderr, "error: failed to download " + "chunk %s\n", chunk_name); + container_list_free(list); + return(CURLE_FAILED_INIT); + } + + fwrite(buf, 1, result_len, stdout); + } + } + + free(buf); + + container_list_free(list); + + return(CURLE_OK); +} + + +/*********************************************************************//** +Delete backup with given name from given container. +@return true if backup deleted successfully */ +static +bool swift_delete(swift_auth_info *auth, const char *container, + const char *name) +{ + container_list *list; + + if ((list = swift_list(auth, container, name)) == NULL) { + return(CURLE_FAILED_INIT); + } + + for (size_t i = 0; i < list->object_count; i++) { + const char *chunk_name = list->objects[i].name; + + if (chunk_belongs_to(chunk_name, name)) { + char url[SWIFT_MAX_URL_SIZE]; + + snprintf(url, sizeof(url), "%s/%s/%s", + auth->url, container, chunk_name); + + fprintf(stderr, "delete %s\n", chunk_name); + if (!swift_delete_object(auth, url)) { + fprintf(stderr, "error: failed to delete " + "chunk %s\n", chunk_name); + container_list_free(list); + return(CURLE_FAILED_INIT); + } + } + } + + container_list_free(list); + + return(CURLE_OK); +} + +/*********************************************************************//** +Check if backup with given name exists. +@return true if backup exists */ +static +bool swift_backup_exists(swift_auth_info *auth, const char *container, + const char *backup_name) +{ + container_list *list; + + if ((list = swift_list(auth, container, backup_name)) == NULL) { + fprintf(stderr, "error: unable to list container %s\n", + container); + exit(EXIT_FAILURE); + } + + for (size_t i = 0; i < list->object_count; i++) { + if (chunk_belongs_to(list->objects[i].name, backup_name)) { + container_list_free(list); + return(true); + } + } + + container_list_free(list); + + return(false); +} + +/*********************************************************************//** +Fills auth_info with response from keystone response. +@return true is response parsed successfully */ +static +bool +swift_parse_keystone_response_v2(char *response, size_t response_length, + swift_auth_info *auth_info) +{ + enum {MAX_DEPTH=20}; + enum label_t {NONE, ACCESS, CATALOG, ENDPOINTS, TOKEN}; + + char filtered_url[SWIFT_MAX_URL_SIZE]; + char public_url[SWIFT_MAX_URL_SIZE]; + char region[SWIFT_MAX_URL_SIZE]; + char id[SWIFT_MAX_URL_SIZE]; + char token_id[SWIFT_MAX_URL_SIZE]; + char type[SWIFT_MAX_URL_SIZE]; + + struct stack_t { + jsmntok_t *t; + int n_items; + label_t label; + }; + + stack_t stack[MAX_DEPTH]; + jsmntok_t *tokens; + int level; + + tokens = json_tokenise(response, response_length, 200); + + stack[0].t = &tokens[0]; + stack[0].label = NONE; + stack[0].n_items = 1; + level = 0; + + for (size_t i = 0, j = 1; j > 0; i++, j--) { + jsmntok_t *t = &tokens[i]; + + assert(t->start != -1 && t->end != -1); + assert(level >= 0); + + --stack[level].n_items; + + switch (t->type) { + case JSMN_ARRAY: + case JSMN_OBJECT: + if (level < MAX_DEPTH - 1) { + level++; + } + stack[level].t = t; + stack[level].label = NONE; + if (t->type == JSMN_ARRAY) { + stack[level].n_items = t->size; + j += t->size; + } else { + stack[level].n_items = t->size * 2; + j += t->size * 2; + } + break; + case JSMN_PRIMITIVE: + case JSMN_STRING: + if (stack[level].t->type == JSMN_OBJECT && + stack[level].n_items % 2 == 1) { + /* key */ + if (json_token_eq(response, t, "access")) { + stack[level].label = ACCESS; + } + if (json_token_eq(response, t, + "serviceCatalog")) { + stack[level].label = CATALOG; + } + if (json_token_eq(response, t, "endpoints")) { + stack[level].label = ENDPOINTS; + } + if (json_token_eq(response, t, "token")) { + stack[level].label = TOKEN; + } + if (json_token_eq(response, t, "id")) { + json_token_str(response, &tokens[i + 1], + id, sizeof(id)); + } + if (json_token_eq(response, t, "id") + && stack[level - 1].label == TOKEN) { + json_token_str(response, &tokens[i + 1], + token_id, sizeof(token_id)); + } + if (json_token_eq(response, t, "region")) { + json_token_str(response, &tokens[i + 1], + region, sizeof(region)); + } + if (json_token_eq(response, t, "publicURL")) { + json_token_str(response, &tokens[i + 1], + public_url, sizeof(public_url)); + } + if (json_token_eq(response, t, "type")) { + json_token_str(response, &tokens[i + 1], + type, sizeof(type)); + } + } + break; + } + + while (stack[level].n_items == 0 && level > 0) { + if (stack[level].t->type == JSMN_OBJECT + && level == 6 + && stack[level - 1].t->type == JSMN_ARRAY + && stack[level - 2].label == ENDPOINTS) { + if (opt_swift_region == NULL + || strcmp(opt_swift_region, region) == 0) { + strncpy(filtered_url, public_url, + sizeof(filtered_url)); + } + } + if (stack[level].t->type == JSMN_OBJECT && + level == 4 && + stack[level - 1].t->type == JSMN_ARRAY && + stack[level - 2].label == CATALOG) { + if (strcmp(type, "object-store") == 0) { + strncpy(auth_info->url, filtered_url, + sizeof(auth_info->url)); + } + } + --level; + } + } + + free(tokens); + + strncpy(auth_info->token, token_id, sizeof(auth_info->token)); + + assert(level == 0); + + if (*auth_info->token == 0) { + fprintf(stderr, "error: can not receive token from response\n"); + return(false); + } + + if (*auth_info->url == 0) { + fprintf(stderr, "error: can not get URL from response\n"); + return(false); + } + + return(true); +} + +/*********************************************************************//** +Authenticate against Swift TempAuth. Fills swift_auth_info struct. +Uses creadentials privided as global variables. +@returns true if access is granted and token received. */ +static +bool +swift_keystone_auth_v2(const char *auth_url, swift_auth_info *info) +{ + char tenant_arg[SWIFT_MAX_URL_SIZE]; + char payload[SWIFT_MAX_URL_SIZE]; + struct curl_slist *slist = NULL; + download_buffer_info buf_info; + long http_code; + CURLcode res; + CURL *curl; + bool auth_res = false; + + memset(&buf_info, 0, sizeof(buf_info)); + + if (opt_swift_user == NULL) { + fprintf(stderr, "error: both --swift-user is required " + "for keystone authentication.\n"); + return(false); + } + + if (opt_swift_password == NULL) { + fprintf(stderr, "error: both --swift-password is required " + "for keystone authentication.\n"); + return(false); + } + + if (opt_swift_tenant != NULL && opt_swift_tenant_id != NULL) { + fprintf(stderr, "error: both --swift-tenant and " + "--swift-tenant-id specified for keystone " + "authentication.\n"); + return(false); + } + + if (opt_swift_tenant != NULL) { + snprintf(tenant_arg, sizeof(tenant_arg), ",\"%s\":\"%s\"", + "tenantName", opt_swift_tenant); + } else if (opt_swift_tenant_id != NULL) { + snprintf(tenant_arg, sizeof(tenant_arg), ",\"%s\":\"%s\"", + "tenantId", opt_swift_tenant_id); + } else { + *tenant_arg = 0; + } + + snprintf(payload, sizeof(payload), "{\"auth\": " + "{\"passwordCredentials\": {\"username\":\"%s\"," + "\"password\":\"%s\"}%s}}", + opt_swift_user, opt_swift_password, tenant_arg); + + curl = curl_easy_init(); + + if (curl != NULL) { + + slist = curl_slist_append(slist, + "Content-Type: application/json"); + slist = curl_slist_append(slist, + "Accept: application/json"); + + curl_easy_setopt(curl, CURLOPT_VERBOSE, opt_verbose); + curl_easy_setopt(curl, CURLOPT_POST, 1L); + curl_easy_setopt(curl, CURLOPT_URL, auth_url); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, payload); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fetch_buffer_cb); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buf_info); + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, + fetch_buffer_header_cb); + curl_easy_setopt(curl, CURLOPT_HEADERDATA, + &buf_info); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist); + + if (opt_cacert != NULL) + curl_easy_setopt(curl, CURLOPT_CAINFO, opt_cacert); + if (opt_insecure) + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE); + + res = curl_easy_perform(curl); + + if (res != CURLE_OK) { + fprintf(stderr, + "error: curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + goto cleanup; + } + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); + if (http_code < 200 || http_code >= 300) { + fprintf(stderr, "error: request failed " + "with response code: %ld\n", http_code); + res = CURLE_LOGIN_DENIED; + goto cleanup; + } + } else { + res = CURLE_FAILED_INIT; + fprintf(stderr, "error: curl_easy_init() failed\n"); + goto cleanup; + } + + if (!swift_parse_keystone_response_v2(buf_info.buf, + buf_info.size, info)) { + goto cleanup; + } + + auth_res = true; + +cleanup: + if (slist) { + curl_slist_free_all(slist); + } + if (curl) { + curl_easy_cleanup(curl); + } + + free(buf_info.buf); + + return(auth_res); +} + + +/*********************************************************************//** +Fills auth_info with response from keystone response. +@return true is response parsed successfully */ +static +bool +swift_parse_keystone_response_v3(char *response, size_t response_length, + swift_auth_info *auth_info) +{ + enum {MAX_DEPTH=20}; + enum label_t {NONE, TOKEN, CATALOG, ENDPOINTS}; + + char url[SWIFT_MAX_URL_SIZE]; + char filtered_url[SWIFT_MAX_URL_SIZE]; + char region[SWIFT_MAX_URL_SIZE]; + char interface[SWIFT_MAX_URL_SIZE]; + char type[SWIFT_MAX_URL_SIZE]; + + struct stack_t { + jsmntok_t *t; + int n_items; + label_t label; + }; + + stack_t stack[MAX_DEPTH]; + jsmntok_t *tokens; + int level; + + tokens = json_tokenise(response, response_length, 200); + + stack[0].t = &tokens[0]; + stack[0].label = NONE; + stack[0].n_items = 1; + level = 0; + + for (size_t i = 0, j = 1; j > 0; i++, j--) { + jsmntok_t *t = &tokens[i]; + + assert(t->start != -1 && t->end != -1); + assert(level >= 0); + + --stack[level].n_items; + + switch (t->type) { + case JSMN_ARRAY: + case JSMN_OBJECT: + if (level < MAX_DEPTH - 1) { + level++; + } + stack[level].t = t; + stack[level].label = NONE; + if (t->type == JSMN_ARRAY) { + stack[level].n_items = t->size; + j += t->size; + } else { + stack[level].n_items = t->size * 2; + j += t->size * 2; + } + break; + case JSMN_PRIMITIVE: + case JSMN_STRING: + if (stack[level].t->type == JSMN_OBJECT && + stack[level].n_items % 2 == 1) { + /* key */ + if (json_token_eq(response, t, "token")) { + stack[level].label = TOKEN; + fprintf(stderr, "token\n"); + } + if (json_token_eq(response, t, + "catalog")) { + stack[level].label = CATALOG; + fprintf(stderr, "catalog\n"); + } + if (json_token_eq(response, t, "endpoints")) { + stack[level].label = ENDPOINTS; + } + if (json_token_eq(response, t, "region")) { + json_token_str(response, &tokens[i + 1], + region, sizeof(region)); + } + if (json_token_eq(response, t, "url")) { + json_token_str(response, &tokens[i + 1], + url, sizeof(url)); + } + if (json_token_eq(response, t, "interface")) { + json_token_str(response, &tokens[i + 1], + interface, sizeof(interface)); + } + if (json_token_eq(response, t, "type")) { + json_token_str(response, &tokens[i + 1], + type, sizeof(type)); + } + } + break; + } + + while (stack[level].n_items == 0 && level > 0) { + if (stack[level].t->type == JSMN_OBJECT + && level == 6 + && stack[level - 1].t->type == JSMN_ARRAY + && stack[level - 2].label == ENDPOINTS) { + if ((opt_swift_region == NULL + || strcmp(opt_swift_region, region) == 0) + && strcmp(interface, "public") == 0) { + strncpy(filtered_url, url, + sizeof(filtered_url)); + } + } + if (stack[level].t->type == JSMN_OBJECT && + level == 4 && + stack[level - 1].t->type == JSMN_ARRAY && + stack[level - 2].label == CATALOG) { + if (strcmp(type, "object-store") == 0) { + strncpy(auth_info->url, filtered_url, + sizeof(auth_info->url)); + } + } + --level; + } + } + + free(tokens); + + assert(level == 0); + + if (*auth_info->url == 0) { + fprintf(stderr, "error: can not get URL from response\n"); + return(false); + } + + return(true); +} + +/*********************************************************************//** +Captures X-Subject-Token header. */ +static +size_t keystone_v3_header_cb(char *ptr, size_t size, size_t nmemb, void *data) +{ + swift_auth_info *info = (swift_auth_info*)(data); + + get_http_header("X-Subject-Token: ", ptr, + info->token, array_elements(info->token)); + + return nmemb * size; +} + +/*********************************************************************//** +Authenticate against Swift TempAuth. Fills swift_auth_info struct. +Uses creadentials privided as global variables. +@returns true if access is granted and token received. */ +static +bool +swift_keystone_auth_v3(const char *auth_url, swift_auth_info *info) +{ + char scope[SWIFT_MAX_URL_SIZE]; + char domain[SWIFT_MAX_URL_SIZE]; + char payload[SWIFT_MAX_URL_SIZE]; + struct curl_slist *slist = NULL; + download_buffer_info buf_info; + long http_code; + CURLcode res; + CURL *curl; + bool auth_res = false; + + memset(&buf_info, 0, sizeof(buf_info)); + buf_info.custom_header_callback = keystone_v3_header_cb; + buf_info.custom_header_callback_data = info; + + if (opt_swift_user == NULL) { + fprintf(stderr, "error: both --swift-user is required " + "for keystone authentication.\n"); + return(false); + } + + if (opt_swift_password == NULL) { + fprintf(stderr, "error: both --swift-password is required " + "for keystone authentication.\n"); + return(false); + } + + if (opt_swift_project_id != NULL && opt_swift_project != NULL) { + fprintf(stderr, "error: both --swift-project and " + "--swift-project-id specified for keystone " + "authentication.\n"); + return(false); + } + + if (opt_swift_domain_id != NULL && opt_swift_domain != NULL) { + fprintf(stderr, "error: both --swift-domain and " + "--swift-domain-id specified for keystone " + "authentication.\n"); + return(false); + } + + if (opt_swift_project_id != NULL && opt_swift_domain != NULL) { + fprintf(stderr, "error: both --swift-project-id and " + "--swift-domain specified for keystone " + "authentication.\n"); + return(false); + } + + if (opt_swift_project_id != NULL && opt_swift_domain_id != NULL) { + fprintf(stderr, "error: both --swift-project-id and " + "--swift-domain-id specified for keystone " + "authentication.\n"); + return(false); + } + + scope[0] = 0; domain[0] = 0; + + if (opt_swift_domain != NULL) { + snprintf(domain, sizeof(domain), + ",{\"domain\":{\"name\":\"%s\"}}", + opt_swift_domain); + } else if (opt_swift_domain_id != NULL) { + snprintf(domain, sizeof(domain), + ",{\"domain\":{\"id\":\"%s\"}}", + opt_swift_domain_id); + } + + if (opt_swift_project_id != NULL) { + snprintf(scope, sizeof(scope), + ",\"scope\":{\"project\":{\"id\":\"%s\"}}", + opt_swift_project_id); + } else if (opt_swift_project != NULL) { + snprintf(scope, sizeof(scope), + ",\"scope\":{\"project\":{\"name\":\"%s\"%s}}", + opt_swift_project_id, domain); + } + + snprintf(payload, sizeof(payload), "{\"auth\":{\"identity\":" + "{\"methods\":[\"password\"],\"password\":{\"user\":" + "{\"name\":\"%s\",\"password\":\"%s\"%s}}}%s}}", + opt_swift_user, opt_swift_password, + *scope ? "" : ",\"domain\":{\"id\":\"default\"}", + scope); + + curl = curl_easy_init(); + + if (curl != NULL) { + + slist = curl_slist_append(slist, + "Content-Type: application/json"); + slist = curl_slist_append(slist, + "Accept: application/json"); + + curl_easy_setopt(curl, CURLOPT_VERBOSE, opt_verbose); + curl_easy_setopt(curl, CURLOPT_POST, 1L); + curl_easy_setopt(curl, CURLOPT_URL, auth_url); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, payload); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fetch_buffer_cb); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buf_info); + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, + fetch_buffer_header_cb); + curl_easy_setopt(curl, CURLOPT_HEADERDATA, + &buf_info); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist); + + if (opt_cacert != NULL) + curl_easy_setopt(curl, CURLOPT_CAINFO, opt_cacert); + if (opt_insecure) + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE); + + res = curl_easy_perform(curl); + + if (res != CURLE_OK) { + fprintf(stderr, + "error: curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + goto cleanup; + } + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); + if (http_code < 200 || http_code >= 300) { + fprintf(stderr, "error: request failed " + "with response code: %ld\n", http_code); + res = CURLE_LOGIN_DENIED; + goto cleanup; + } + } else { + res = CURLE_FAILED_INIT; + fprintf(stderr, "error: curl_easy_init() failed\n"); + goto cleanup; + } + + if (!swift_parse_keystone_response_v3(buf_info.buf, + buf_info.size, info)) { + goto cleanup; + } + + auth_res = true; + +cleanup: + if (slist) { + curl_slist_free_all(slist); + } + if (curl) { + curl_easy_cleanup(curl); + } + + free(buf_info.buf); + + return(auth_res); +} + +int main(int argc, char **argv) +{ + swift_auth_info info; + char auth_url[SWIFT_MAX_URL_SIZE]; + + MY_INIT(argv[0]); + + /* handle_options in parse_args is destructive so + * we make a copy of our argument pointers so we can + * mask the sensitive values afterwards */ + char **mask_argv = (char **)malloc(sizeof(char *) * (argc - 1)); + memcpy(mask_argv, argv + 1, sizeof(char *) * (argc - 1)); + + if (parse_args(argc, argv)) { + return(EXIT_FAILURE); + } + + mask_args(argc, mask_argv); /* mask args on cmdline */ + + curl_global_init(CURL_GLOBAL_ALL); + + if (opt_swift_auth_version == NULL || *opt_swift_auth_version == '1') { + /* TempAuth */ + snprintf(auth_url, SWIFT_MAX_URL_SIZE, "%sauth/v%s/", + opt_swift_auth_url, opt_swift_auth_version ? + opt_swift_auth_version : "1.0"); + + if (!swift_temp_auth(auth_url, &info)) { + fprintf(stderr, "error: failed to authenticate\n"); + return(EXIT_FAILURE); + } + + } else if (*opt_swift_auth_version == '2') { + /* Keystone v2 */ + snprintf(auth_url, SWIFT_MAX_URL_SIZE, "%sv%s/tokens", + opt_swift_auth_url, opt_swift_auth_version); + + if (!swift_keystone_auth_v2(auth_url, &info)) { + fprintf(stderr, "error: failed to authenticate\n"); + return(EXIT_FAILURE); + } + + } else if (*opt_swift_auth_version == '3') { + /* Keystone v3 */ + snprintf(auth_url, SWIFT_MAX_URL_SIZE, "%sv%s/auth/tokens", + opt_swift_auth_url, opt_swift_auth_version); + + if (!swift_keystone_auth_v3(auth_url, &info)) { + fprintf(stderr, "error: failed to authenticate\n"); + exit(EXIT_FAILURE); + } + + } + + if (opt_swift_storage_url != NULL) { + snprintf(info.url, sizeof(info.url), "%s", + opt_swift_storage_url); + } + + fprintf(stderr, "Object store URL: %s\n", info.url); + + if (opt_mode == MODE_PUT) { + + if (swift_create_container(&info, opt_swift_container) != 0) { + fprintf(stderr, "error: failed to create " + "container %s\n", + opt_swift_container); + return(EXIT_FAILURE); + } + + if (swift_backup_exists(&info, opt_swift_container, opt_name)) { + fprintf(stderr, "error: backup named '%s' " + "already exists!\n", + opt_name); + return(EXIT_FAILURE); + } + + if (swift_upload_parts(&info, opt_swift_container, + opt_name) != 0) { + fprintf(stderr, "error: upload failed\n"); + return(EXIT_FAILURE); + } + + } else if (opt_mode == MODE_GET) { + + if (swift_download(&info, opt_swift_container, opt_name) + != CURLE_OK) { + fprintf(stderr, "error: download failed\n"); + return(EXIT_FAILURE); + } + + } else if (opt_mode == MODE_DELETE) { + + if (swift_delete(&info, opt_swift_container, opt_name) + != CURLE_OK) { + fprintf(stderr, "error: delete failed\n"); + return(EXIT_FAILURE); + } + + } else { + fprintf(stderr, "Unknown command supplied.\n"); + exit(EXIT_FAILURE); + } + + curl_global_cleanup(); + + return(EXIT_SUCCESS); +} diff --git a/extra/mariabackup/xbstream.c b/extra/mariabackup/xbstream.c new file mode 100644 index 00000000000..f3880f9ec03 --- /dev/null +++ b/extra/mariabackup/xbstream.c @@ -0,0 +1,564 @@ +/****************************************************** +Copyright (c) 2011-2013 Percona LLC and/or its affiliates. + +The xbstream utility: serialize/deserialize files in the XBSTREAM format. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#include +#include +#include +#include +#include +#include "common.h" +#include "xbstream.h" +#include "datasink.h" +#include "crc_glue.h" + +#define XBSTREAM_VERSION "1.0" +#define XBSTREAM_BUFFER_SIZE (10 * 1024 * 1024UL) + +#define START_FILE_HASH_SIZE 16 + +typedef enum { + RUN_MODE_NONE, + RUN_MODE_CREATE, + RUN_MODE_EXTRACT +} run_mode_t; + +/* Need the following definitions to avoid linking with ds_*.o and their link +dependencies */ +datasink_t datasink_archive; +datasink_t datasink_xbstream; +datasink_t datasink_compress; +datasink_t datasink_tmpfile; +datasink_t datasink_buffer; + +static run_mode_t opt_mode; +static char * opt_directory = NULL; +static my_bool opt_verbose = 0; +static int opt_parallel = 1; + +static struct my_option my_long_options[] = +{ + {"help", '?', "Display this help and exit.", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"create", 'c', "Stream the specified files to the standard output.", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"extract", 'x', "Extract to disk files from the stream on the " + "standard input.", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"directory", 'C', "Change the current directory to the specified one " + "before streaming or extracting.", &opt_directory, &opt_directory, 0, + GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"verbose", 'v', "Print verbose output.", &opt_verbose, &opt_verbose, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"parallel", 'p', "Number of worker threads for reading / writing.", + &opt_parallel, &opt_parallel, 0, GET_INT, REQUIRED_ARG, + 1, 1, INT_MAX, 0, 0, 0}, + + {0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} +}; + +typedef struct { + HASH *filehash; + xb_rstream_t *stream; + ds_ctxt_t *ds_ctxt; + pthread_mutex_t *mutex; +} extract_ctxt_t; + +typedef struct { + char *path; + uint pathlen; + my_off_t offset; + ds_file_t *file; + pthread_mutex_t mutex; +} file_entry_t; + +static int get_options(int *argc, char ***argv); +static int mode_create(int argc, char **argv); +static int mode_extract(int n_threads, int argc, char **argv); +static my_bool get_one_option(int optid, const struct my_option *opt, + char *argument); + +int +main(int argc, char **argv) +{ + MY_INIT(argv[0]); + + crc_init(); + + if (get_options(&argc, &argv)) { + goto err; + } + + if (opt_mode == RUN_MODE_NONE) { + msg("%s: either -c or -x must be specified.\n", my_progname); + goto err; + } + + /* Change the current directory if -C is specified */ + if (opt_directory && my_setwd(opt_directory, MYF(MY_WME))) { + goto err; + } + + if (opt_mode == RUN_MODE_CREATE && mode_create(argc, argv)) { + goto err; + } else if (opt_mode == RUN_MODE_EXTRACT && + mode_extract(opt_parallel, argc, argv)) { + goto err; + } + + my_cleanup_options(my_long_options); + + my_end(0); + + return EXIT_SUCCESS; +err: + my_cleanup_options(my_long_options); + + my_end(0); + + exit(EXIT_FAILURE); +} + +static +int +get_options(int *argc, char ***argv) +{ + int ho_error; + + if ((ho_error= handle_options(argc, argv, my_long_options, + get_one_option))) { + exit(EXIT_FAILURE); + } + + return 0; +} + +static +void +print_version(void) +{ + printf("%s Ver %s for %s (%s)\n", my_progname, XBSTREAM_VERSION, + SYSTEM_TYPE, MACHINE_TYPE); +} + +static +void +usage(void) +{ + print_version(); + puts("Copyright (C) 2011-2013 Percona LLC and/or its affiliates."); + puts("This software comes with ABSOLUTELY NO WARRANTY. " + "This is free software,\nand you are welcome to modify and " + "redistribute it under the GPL license.\n"); + + puts("Serialize/deserialize files in the XBSTREAM format.\n"); + + puts("Usage: "); + printf(" %s -c [OPTIONS...] FILES... # stream specified files to " + "standard output.\n", my_progname); + printf(" %s -x [OPTIONS...] # extract files from the stream" + "on the standard input.\n", my_progname); + + puts("\nOptions:"); + my_print_help(my_long_options); +} + +static +int +set_run_mode(run_mode_t mode) +{ + if (opt_mode != RUN_MODE_NONE) { + msg("%s: can't set specify both -c and -x.\n", my_progname); + return 1; + } + + opt_mode = mode; + + return 0; +} + +static +my_bool +get_one_option(int optid, const struct my_option *opt __attribute__((unused)), + char *argument __attribute__((unused))) +{ + switch (optid) { + case 'c': + if (set_run_mode(RUN_MODE_CREATE)) { + return TRUE; + } + break; + case 'x': + if (set_run_mode(RUN_MODE_EXTRACT)) { + return TRUE; + } + break; + case '?': + usage(); + exit(0); + } + + return FALSE; +} + +static +int +stream_one_file(File file, xb_wstream_file_t *xbfile) +{ + uchar *buf; + ssize_t bytes; + my_off_t offset; + + posix_fadvise(file, 0, 0, POSIX_FADV_SEQUENTIAL); + offset = my_tell(file, MYF(MY_WME)); + + buf = (uchar*)(my_malloc(XBSTREAM_BUFFER_SIZE, MYF(MY_FAE))); + + while ((bytes = (ssize_t)my_read(file, buf, XBSTREAM_BUFFER_SIZE, + MYF(MY_WME))) > 0) { + if (xb_stream_write_data(xbfile, buf, bytes)) { + msg("%s: xb_stream_write_data() failed.\n", + my_progname); + my_free(buf); + return 1; + } + posix_fadvise(file, offset, XBSTREAM_BUFFER_SIZE, + POSIX_FADV_DONTNEED); + offset += XBSTREAM_BUFFER_SIZE; + + } + + my_free(buf); + + if (bytes < 0) { + return 1; + } + + return 0; +} + +static +int +mode_create(int argc, char **argv) +{ + int i; + MY_STAT mystat; + xb_wstream_t *stream; + + if (argc < 1) { + msg("%s: no files are specified.\n", my_progname); + return 1; + } + + stream = xb_stream_write_new(); + if (stream == NULL) { + msg("%s: xb_stream_write_new() failed.\n", my_progname); + return 1; + } + + for (i = 0; i < argc; i++) { + char *filepath = argv[i]; + File src_file; + xb_wstream_file_t *file; + + if (my_stat(filepath, &mystat, MYF(MY_WME)) == NULL) { + goto err; + } + if (!MY_S_ISREG(mystat.st_mode)) { + msg("%s: %s is not a regular file, exiting.\n", + my_progname, filepath); + goto err; + } + + if ((src_file = my_open(filepath, O_RDONLY, MYF(MY_WME))) < 0) { + msg("%s: failed to open %s.\n", my_progname, filepath); + goto err; + } + + file = xb_stream_write_open(stream, filepath, &mystat, NULL, NULL); + if (file == NULL) { + goto err; + } + + if (opt_verbose) { + msg("%s\n", filepath); + } + + if (stream_one_file(src_file, file) || + xb_stream_write_close(file) || + my_close(src_file, MYF(MY_WME))) { + goto err; + } + } + + xb_stream_write_done(stream); + + return 0; +err: + xb_stream_write_done(stream); + + return 1; +} + +static +file_entry_t * +file_entry_new(extract_ctxt_t *ctxt, const char *path, uint pathlen) +{ + file_entry_t *entry; + ds_file_t *file; + + entry = (file_entry_t *) my_malloc(sizeof(file_entry_t), + MYF(MY_WME | MY_ZEROFILL)); + if (entry == NULL) { + return NULL; + } + + entry->path = my_strndup(path, pathlen, MYF(MY_WME)); + if (entry->path == NULL) { + goto err; + } + entry->pathlen = pathlen; + + file = ds_open(ctxt->ds_ctxt, path, NULL); + + if (file == NULL) { + msg("%s: failed to create file.\n", my_progname); + goto err; + } + + if (opt_verbose) { + msg("%s\n", entry->path); + } + + entry->file = file; + + pthread_mutex_init(&entry->mutex, NULL); + + return entry; + +err: + if (entry->path != NULL) { + my_free(entry->path); + } + my_free(entry); + + return NULL; +} + +static +uchar * +get_file_entry_key(file_entry_t *entry, size_t *length, + my_bool not_used __attribute__((unused))) +{ + *length = entry->pathlen; + return (uchar *) entry->path; +} + +static +void +file_entry_free(file_entry_t *entry) +{ + pthread_mutex_destroy(&entry->mutex); + ds_close(entry->file); + my_free(entry->path); + my_free(entry); +} + +static +void * +extract_worker_thread_func(void *arg) +{ + xb_rstream_chunk_t chunk; + file_entry_t *entry; + xb_rstream_result_t res; + + extract_ctxt_t *ctxt = (extract_ctxt_t *) arg; + + my_thread_init(); + + memset(&chunk, 0, sizeof(chunk)); + + while (1) { + + pthread_mutex_lock(ctxt->mutex); + res = xb_stream_read_chunk(ctxt->stream, &chunk); + + if (res != XB_STREAM_READ_CHUNK) { + pthread_mutex_unlock(ctxt->mutex); + break; + } + + /* If unknown type and ignorable flag is set, skip this chunk */ + if (chunk.type == XB_CHUNK_TYPE_UNKNOWN && \ + !(chunk.flags & XB_STREAM_FLAG_IGNORABLE)) { + pthread_mutex_unlock(ctxt->mutex); + continue; + } + + /* See if we already have this file open */ + entry = (file_entry_t *) my_hash_search(ctxt->filehash, + (uchar *) chunk.path, + chunk.pathlen); + + if (entry == NULL) { + entry = file_entry_new(ctxt, + chunk.path, + chunk.pathlen); + if (entry == NULL) { + pthread_mutex_unlock(ctxt->mutex); + break; + } + if (my_hash_insert(ctxt->filehash, (uchar *) entry)) { + msg("%s: my_hash_insert() failed.\n", + my_progname); + pthread_mutex_unlock(ctxt->mutex); + break; + } + } + + pthread_mutex_lock(&entry->mutex); + + pthread_mutex_unlock(ctxt->mutex); + + res = xb_stream_validate_checksum(&chunk); + + if (res != XB_STREAM_READ_CHUNK) { + pthread_mutex_unlock(&entry->mutex); + break; + } + + if (chunk.type == XB_CHUNK_TYPE_EOF) { + pthread_mutex_lock(ctxt->mutex); + pthread_mutex_unlock(&entry->mutex); + my_hash_delete(ctxt->filehash, (uchar *) entry); + pthread_mutex_unlock(ctxt->mutex); + + continue; + } + + if (entry->offset != chunk.offset) { + msg("%s: out-of-order chunk: real offset = 0x%llx, " + "expected offset = 0x%llx\n", my_progname, + chunk.offset, entry->offset); + pthread_mutex_unlock(&entry->mutex); + res = XB_STREAM_READ_ERROR; + break; + } + + if (ds_write(entry->file, chunk.data, chunk.length)) { + msg("%s: my_write() failed.\n", my_progname); + pthread_mutex_unlock(&entry->mutex); + res = XB_STREAM_READ_ERROR; + break; + } + + entry->offset += chunk.length; + + pthread_mutex_unlock(&entry->mutex); + } + + if (chunk.data) + my_free(chunk.data); + + my_thread_end(); + + return (void *)(res); +} + + +static +int +mode_extract(int n_threads, int argc __attribute__((unused)), + char **argv __attribute__((unused))) +{ + xb_rstream_t *stream = NULL; + HASH filehash; + ds_ctxt_t *ds_ctxt = NULL; + extract_ctxt_t ctxt; + int i; + pthread_t *tids = NULL; + void **retvals = NULL; + pthread_mutex_t mutex; + int ret = 0; + + if (my_hash_init(&filehash, &my_charset_bin, START_FILE_HASH_SIZE, + 0, 0, (my_hash_get_key) get_file_entry_key, + (my_hash_free_key) file_entry_free, MYF(0))) { + msg("%s: failed to initialize file hash.\n", my_progname); + return 1; + } + + if (pthread_mutex_init(&mutex, NULL)) { + msg("%s: failed to initialize mutex.\n", my_progname); + my_hash_free(&filehash); + return 1; + } + + /* If --directory is specified, it is already set as CWD by now. */ + ds_ctxt = ds_create(".", DS_TYPE_LOCAL); + if (ds_ctxt == NULL) { + ret = 1; + goto exit; + } + + + stream = xb_stream_read_new(); + if (stream == NULL) { + msg("%s: xb_stream_read_new() failed.\n", my_progname); + pthread_mutex_destroy(&mutex); + ret = 1; + goto exit; + } + + ctxt.stream = stream; + ctxt.filehash = &filehash; + ctxt.ds_ctxt = ds_ctxt; + ctxt.mutex = &mutex; + + tids = malloc(sizeof(pthread_t) * n_threads); + retvals = malloc(sizeof(void*) * n_threads); + + for (i = 0; i < n_threads; i++) + pthread_create(tids + i, NULL, extract_worker_thread_func, + &ctxt); + + for (i = 0; i < n_threads; i++) + pthread_join(tids[i], retvals + i); + + for (i = 0; i < n_threads; i++) { + if ((ulong)retvals[i] == XB_STREAM_READ_ERROR) { + ret = 1; + goto exit; + } + } + +exit: + pthread_mutex_destroy(&mutex); + + free(tids); + free(retvals); + + my_hash_free(&filehash); + if (ds_ctxt != NULL) { + ds_destroy(ds_ctxt); + } + xb_stream_read_done(stream); + + return ret; +} diff --git a/extra/mariabackup/xbstream.h b/extra/mariabackup/xbstream.h new file mode 100644 index 00000000000..08b017ca5ce --- /dev/null +++ b/extra/mariabackup/xbstream.h @@ -0,0 +1,106 @@ +/****************************************************** +Copyright (c) 2011-2017 Percona LLC and/or its affiliates. + +The xbstream format interface. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#ifndef XBSTREAM_H +#define XBSTREAM_H + +#include + +/* Magic value in a chunk header */ +#define XB_STREAM_CHUNK_MAGIC "XBSTCK01" + +/* Chunk flags */ +/* Chunk can be ignored if unknown version/format */ +#define XB_STREAM_FLAG_IGNORABLE 0x01 + +/* Magic + flags + type + path len */ +#define CHUNK_HEADER_CONSTANT_LEN ((sizeof(XB_STREAM_CHUNK_MAGIC) - 1) + \ + 1 + 1 + 4) +#define CHUNK_TYPE_OFFSET (sizeof(XB_STREAM_CHUNK_MAGIC) - 1 + 1) +#define PATH_LENGTH_OFFSET (sizeof(XB_STREAM_CHUNK_MAGIC) - 1 + 1 + 1) + +typedef struct xb_wstream_struct xb_wstream_t; + +typedef struct xb_wstream_file_struct xb_wstream_file_t; + +typedef enum { + XB_STREAM_FMT_NONE, + XB_STREAM_FMT_XBSTREAM +} xb_stream_fmt_t; + +/************************************************************************ +Write interface. */ + +typedef ssize_t xb_stream_write_callback(xb_wstream_file_t *file, + void *userdata, + const void *buf, size_t len); + +xb_wstream_t *xb_stream_write_new(void); + +xb_wstream_file_t *xb_stream_write_open(xb_wstream_t *stream, const char *path, + MY_STAT *mystat, void *userdata, + xb_stream_write_callback *onwrite); + +int xb_stream_write_data(xb_wstream_file_t *file, const void *buf, size_t len); + +int xb_stream_write_close(xb_wstream_file_t *file); + +int xb_stream_write_done(xb_wstream_t *stream); + +/************************************************************************ +Read interface. */ + +typedef enum { + XB_STREAM_READ_CHUNK, + XB_STREAM_READ_EOF, + XB_STREAM_READ_ERROR +} xb_rstream_result_t; + +typedef enum { + XB_CHUNK_TYPE_UNKNOWN = '\0', + XB_CHUNK_TYPE_PAYLOAD = 'P', + XB_CHUNK_TYPE_EOF = 'E' +} xb_chunk_type_t; + +typedef struct xb_rstream_struct xb_rstream_t; + +typedef struct { + uchar flags; + xb_chunk_type_t type; + uint pathlen; + char path[FN_REFLEN]; + size_t length; + my_off_t offset; + my_off_t checksum_offset; + void *data; + ulong checksum; + size_t buflen; +} xb_rstream_chunk_t; + +xb_rstream_t *xb_stream_read_new(void); + +xb_rstream_result_t xb_stream_read_chunk(xb_rstream_t *stream, + xb_rstream_chunk_t *chunk); + +int xb_stream_read_done(xb_rstream_t *stream); + +int xb_stream_validate_checksum(xb_rstream_chunk_t *chunk); + +#endif diff --git a/extra/mariabackup/xbstream_read.c b/extra/mariabackup/xbstream_read.c new file mode 100644 index 00000000000..8d19242301b --- /dev/null +++ b/extra/mariabackup/xbstream_read.c @@ -0,0 +1,228 @@ +/****************************************************** +Copyright (c) 2011-2017 Percona LLC and/or its affiliates. + +The xbstream format reader implementation. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#include +#include +#include +#include "common.h" +#include "xbstream.h" +#include "crc_glue.h" + +/* Allocate 1 MB for the payload buffer initially */ +#define INIT_BUFFER_LEN (1024 * 1024) + +#ifndef MY_OFF_T_MAX +#define MY_OFF_T_MAX (~(my_off_t)0UL) +#endif + +struct xb_rstream_struct { + my_off_t offset; + File fd; +}; + +xb_rstream_t * +xb_stream_read_new(void) +{ + xb_rstream_t *stream; + + stream = (xb_rstream_t *) my_malloc(sizeof(xb_rstream_t), MYF(MY_FAE)); + +#ifdef __WIN__ + setmode(fileno(stdin), _O_BINARY); +#endif + + stream->fd = my_fileno(stdin); + stream->offset = 0; + + return stream; +} + +static inline +xb_chunk_type_t +validate_chunk_type(uchar code) +{ + switch ((xb_chunk_type_t) code) { + case XB_CHUNK_TYPE_PAYLOAD: + case XB_CHUNK_TYPE_EOF: + return (xb_chunk_type_t) code; + default: + return XB_CHUNK_TYPE_UNKNOWN; + } +} + +int +xb_stream_validate_checksum(xb_rstream_chunk_t *chunk) +{ + ulong checksum; + + checksum = crc32_iso3309(0, chunk->data, (uint)chunk->length); + if (checksum != chunk->checksum) { + msg("xb_stream_read_chunk(): invalid checksum at offset " + "0x%llx: expected 0x%lx, read 0x%lx.\n", + (ulonglong) chunk->checksum_offset, chunk->checksum, + checksum); + return XB_STREAM_READ_ERROR; + } + + return XB_STREAM_READ_CHUNK; +} + +#define F_READ(buf,len) \ + do { \ + if (xb_read_full(fd, buf, len) < len) { \ + msg("xb_stream_read_chunk(): my_read() failed.\n"); \ + goto err; \ + } \ + } while (0) + +xb_rstream_result_t +xb_stream_read_chunk(xb_rstream_t *stream, xb_rstream_chunk_t *chunk) +{ + uchar tmpbuf[16]; + uchar *ptr = tmpbuf; + uint pathlen; + size_t tbytes; + ulonglong ullval; + File fd = stream->fd; + + xb_ad(sizeof(tmpbuf) >= CHUNK_HEADER_CONSTANT_LEN); + + /* This is the only place where we expect EOF, so read with + xb_read_full() rather than F_READ() */ + tbytes = xb_read_full(fd, ptr, CHUNK_HEADER_CONSTANT_LEN); + if (tbytes == 0) { + return XB_STREAM_READ_EOF; + } else if (tbytes < CHUNK_HEADER_CONSTANT_LEN) { + msg("xb_stream_read_chunk(): unexpected end of stream at " + "offset 0x%llx.\n", stream->offset); + goto err; + } + + ptr = tmpbuf; + + /* Chunk magic value */ + if (memcmp(tmpbuf, XB_STREAM_CHUNK_MAGIC, 8)) { + msg("xb_stream_read_chunk(): wrong chunk magic at offset " + "0x%llx.\n", (ulonglong) stream->offset); + goto err; + } + ptr += 8; + stream->offset += 8; + + /* Chunk flags */ + chunk->flags = *ptr++; + stream->offset++; + + /* Chunk type, ignore unknown ones if ignorable flag is set */ + chunk->type = validate_chunk_type(*ptr); + if (chunk->type == XB_CHUNK_TYPE_UNKNOWN && + !(chunk->flags & XB_STREAM_FLAG_IGNORABLE)) { + msg("xb_stream_read_chunk(): unknown chunk type 0x%lu at " + "offset 0x%llx.\n", (ulong) *ptr, + (ulonglong) stream->offset); + goto err; + } + ptr++; + stream->offset++; + + /* Path length */ + pathlen = uint4korr(ptr); + if (pathlen >= FN_REFLEN) { + msg("xb_stream_read_chunk(): path length (%lu) is too large at " + "offset 0x%llx.\n", (ulong) pathlen, stream->offset); + goto err; + } + chunk->pathlen = pathlen; + stream->offset +=4; + + xb_ad((ptr + 4 - tmpbuf) == CHUNK_HEADER_CONSTANT_LEN); + + /* Path */ + if (chunk->pathlen > 0) { + F_READ((uchar *) chunk->path, pathlen); + stream->offset += pathlen; + } + chunk->path[pathlen] = '\0'; + + if (chunk->type == XB_CHUNK_TYPE_EOF) { + return XB_STREAM_READ_CHUNK; + } + + /* Payload length */ + F_READ(tmpbuf, 16); + ullval = uint8korr(tmpbuf); + if (ullval > (ulonglong) SIZE_T_MAX) { + msg("xb_stream_read_chunk(): chunk length is too large at " + "offset 0x%llx: 0x%llx.\n", (ulonglong) stream->offset, + ullval); + goto err; + } + chunk->length = (size_t) ullval; + stream->offset += 8; + + /* Payload offset */ + ullval = uint8korr(tmpbuf + 8); + if (ullval > (ulonglong) MY_OFF_T_MAX) { + msg("xb_stream_read_chunk(): chunk offset is too large at " + "offset 0x%llx: 0x%llx.\n", (ulonglong) stream->offset, + ullval); + goto err; + } + chunk->offset = (my_off_t) ullval; + stream->offset += 8; + + /* Reallocate the buffer if needed */ + if (chunk->length > chunk->buflen) { + chunk->data = my_realloc(chunk->data, chunk->length, + MYF(MY_WME | MY_ALLOW_ZERO_PTR)); + if (chunk->data == NULL) { + msg("xb_stream_read_chunk(): failed to increase buffer " + "to %lu bytes.\n", (ulong) chunk->length); + goto err; + } + chunk->buflen = chunk->length; + } + + /* Checksum */ + F_READ(tmpbuf, 4); + chunk->checksum = uint4korr(tmpbuf); + chunk->checksum_offset = stream->offset; + + /* Payload */ + if (chunk->length > 0) { + F_READ(chunk->data, chunk->length); + stream->offset += chunk->length; + } + + stream->offset += 4; + + return XB_STREAM_READ_CHUNK; + +err: + return XB_STREAM_READ_ERROR; +} + +int +xb_stream_read_done(xb_rstream_t *stream) +{ + my_free(stream); + + return 0; +} diff --git a/extra/mariabackup/xbstream_write.c b/extra/mariabackup/xbstream_write.c new file mode 100644 index 00000000000..978be71e7dd --- /dev/null +++ b/extra/mariabackup/xbstream_write.c @@ -0,0 +1,294 @@ +/****************************************************** +Copyright (c) 2011-2017 Percona LLC and/or its affiliates. + +The xbstream format writer implementation. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#include +#include +#include +#include "common.h" +#include "xbstream.h" +#include "crc_glue.h" + +/* Group writes smaller than this into a single chunk */ +#define XB_STREAM_MIN_CHUNK_SIZE (10 * 1024 * 1024) + +struct xb_wstream_struct { + pthread_mutex_t mutex; +}; + +struct xb_wstream_file_struct { + xb_wstream_t *stream; + char *path; + size_t path_len; + char chunk[XB_STREAM_MIN_CHUNK_SIZE]; + char *chunk_ptr; + size_t chunk_free; + my_off_t offset; + void *userdata; + xb_stream_write_callback *write; +}; + +static int xb_stream_flush(xb_wstream_file_t *file); +static int xb_stream_write_chunk(xb_wstream_file_t *file, + const void *buf, size_t len); +static int xb_stream_write_eof(xb_wstream_file_t *file); + +static +ssize_t +xb_stream_default_write_callback(xb_wstream_file_t *file __attribute__((unused)), + void *userdata __attribute__((unused)), + const void *buf, size_t len) +{ + if (my_write(my_fileno(stdout), buf, len, MYF(MY_WME | MY_NABP))) + return -1; + return len; +} + +xb_wstream_t * +xb_stream_write_new(void) +{ + xb_wstream_t *stream; + + stream = (xb_wstream_t *) my_malloc(sizeof(xb_wstream_t), MYF(MY_FAE)); + pthread_mutex_init(&stream->mutex, NULL); + + return stream;; +} + +xb_wstream_file_t * +xb_stream_write_open(xb_wstream_t *stream, const char *path, + MY_STAT *mystat __attribute__((unused)), + void *userdata, + xb_stream_write_callback *onwrite) +{ + xb_wstream_file_t *file; + size_t path_len; + + path_len = strlen(path); + + if (path_len > FN_REFLEN) { + msg("xb_stream_write_open(): file path is too long.\n"); + return NULL; + } + + file = (xb_wstream_file_t *) my_malloc(sizeof(xb_wstream_file_t) + + path_len + 1, MYF(MY_FAE)); + + file->path = (char *) (file + 1); +#ifdef _WIN32 + /* Normalize path on Windows, so we can restore elsewhere.*/ + { + int i; + for (i = 0; ; i++) { + file->path[i] = (path[i] == '\\') ? '/' : path[i]; + if (!path[i]) + break; + } + } +#else + memcpy(file->path, path, path_len + 1); +#endif + file->path_len = path_len; + + file->stream = stream; + file->offset = 0; + file->chunk_ptr = file->chunk; + file->chunk_free = XB_STREAM_MIN_CHUNK_SIZE; + if (onwrite) { +#ifdef __WIN__ + setmode(fileno(stdout), _O_BINARY); +#endif + file->userdata = userdata; + file->write = onwrite; + } else { + file->userdata = NULL; + file->write = xb_stream_default_write_callback; + } + + return file; +} + +int +xb_stream_write_data(xb_wstream_file_t *file, const void *buf, size_t len) +{ + if (len < file->chunk_free) { + memcpy(file->chunk_ptr, buf, len); + file->chunk_ptr += len; + file->chunk_free -= len; + + return 0; + } + + if (xb_stream_flush(file)) + return 1; + + return xb_stream_write_chunk(file, buf, len); +} + +int +xb_stream_write_close(xb_wstream_file_t *file) +{ + if (xb_stream_flush(file) || + xb_stream_write_eof(file)) { + my_free(file); + return 1; + } + + my_free(file); + + return 0; +} + +int +xb_stream_write_done(xb_wstream_t *stream) +{ + pthread_mutex_destroy(&stream->mutex); + + my_free(stream); + + return 0; +} + +static +int +xb_stream_flush(xb_wstream_file_t *file) +{ + if (file->chunk_ptr == file->chunk) { + return 0; + } + + if (xb_stream_write_chunk(file, file->chunk, + file->chunk_ptr - file->chunk)) { + return 1; + } + + file->chunk_ptr = file->chunk; + file->chunk_free = XB_STREAM_MIN_CHUNK_SIZE; + + return 0; +} + +static +int +xb_stream_write_chunk(xb_wstream_file_t *file, const void *buf, size_t len) +{ + /* Chunk magic + flags + chunk type + path_len + path + len + offset + + checksum */ + uchar tmpbuf[sizeof(XB_STREAM_CHUNK_MAGIC) - 1 + 1 + 1 + 4 + + FN_REFLEN + 8 + 8 + 4]; + uchar *ptr; + xb_wstream_t *stream = file->stream; + ulong checksum; + + /* Write xbstream header */ + ptr = tmpbuf; + + /* Chunk magic */ + memcpy(ptr, XB_STREAM_CHUNK_MAGIC, sizeof(XB_STREAM_CHUNK_MAGIC) - 1); + ptr += sizeof(XB_STREAM_CHUNK_MAGIC) - 1; + + *ptr++ = 0; /* Chunk flags */ + + *ptr++ = (uchar) XB_CHUNK_TYPE_PAYLOAD; /* Chunk type */ + + int4store(ptr, file->path_len); /* Path length */ + ptr += 4; + + memcpy(ptr, file->path, file->path_len); /* Path */ + ptr += file->path_len; + + int8store(ptr, len); /* Payload length */ + ptr += 8; + + checksum = crc32_iso3309(0, buf, (uint)len); /* checksum */ + + pthread_mutex_lock(&stream->mutex); + + int8store(ptr, file->offset); /* Payload offset */ + ptr += 8; + + int4store(ptr, checksum); + ptr += 4; + + xb_ad(ptr <= tmpbuf + sizeof(tmpbuf)); + + if (file->write(file, file->userdata, tmpbuf, ptr-tmpbuf) == -1) + goto err; + + + if (file->write(file, file->userdata, buf, len) == -1) /* Payload */ + goto err; + + file->offset+= len; + + pthread_mutex_unlock(&stream->mutex); + + return 0; + +err: + + pthread_mutex_unlock(&stream->mutex); + + return 1; +} + +static +int +xb_stream_write_eof(xb_wstream_file_t *file) +{ + /* Chunk magic + flags + chunk type + path_len + path */ + uchar tmpbuf[sizeof(XB_STREAM_CHUNK_MAGIC) - 1 + 1 + 1 + 4 + + FN_REFLEN]; + uchar *ptr; + xb_wstream_t *stream = file->stream; + + pthread_mutex_lock(&stream->mutex); + + /* Write xbstream header */ + ptr = tmpbuf; + + /* Chunk magic */ + memcpy(ptr, XB_STREAM_CHUNK_MAGIC, sizeof(XB_STREAM_CHUNK_MAGIC) - 1); + ptr += sizeof(XB_STREAM_CHUNK_MAGIC) - 1; + + *ptr++ = 0; /* Chunk flags */ + + *ptr++ = (uchar) XB_CHUNK_TYPE_EOF; /* Chunk type */ + + int4store(ptr, file->path_len); /* Path length */ + ptr += 4; + + memcpy(ptr, file->path, file->path_len); /* Path */ + ptr += file->path_len; + + xb_ad(ptr <= tmpbuf + sizeof(tmpbuf)); + + if (file->write(file, file->userdata, tmpbuf, + (ulonglong) (ptr - tmpbuf)) == -1) + goto err; + + pthread_mutex_unlock(&stream->mutex); + + return 0; +err: + + pthread_mutex_unlock(&stream->mutex); + + return 1; +} diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc new file mode 100644 index 00000000000..6fc37ead4f6 --- /dev/null +++ b/extra/mariabackup/xtrabackup.cc @@ -0,0 +1,5525 @@ +/****************************************************** +XtraBackup: hot backup tool for InnoDB +(c) 2009-2017 Percona LLC and/or its affiliates +Originally Created 3/3/2009 Yasufumi Kinoshita +Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko, +Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz. +(c) 2017, MariaDB Corporation. +Portions written by Marko Mäkelä. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +******************************************************* + +This file incorporates work covered by the following copyright and +permission notice: + +Copyright (c) 2000, 2011, MySQL AB & Innobase Oy. All Rights Reserved. + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 59 Temple +Place, Suite 330, Boston, MA 02111-1307 USA + +*******************************************************/ + +//#define XTRABACKUP_TARGET_IS_PLUGIN + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#ifdef __linux__ +# include +#include +#endif + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#define G_PTR uchar* + +#include "common.h" +#include "datasink.h" + +#include "xb_regex.h" +#include "fil_cur.h" +#include "write_filt.h" +#include "xtrabackup.h" +#include "ds_buffer.h" +#include "ds_tmpfile.h" +#include "xbstream.h" +#include "changed_page_bitmap.h" +#include "read_filt.h" +#include "backup_wsrep.h" +#include "innobackupex.h" +#include "backup_mysql.h" +#include "backup_copy.h" +#include "backup_mysql.h" +#include "xb0xb.h" +#include "encryption_plugin.h" +#include +#include +#include +#include + +int sys_var_init(); + +/* === xtrabackup specific options === */ +char xtrabackup_real_target_dir[FN_REFLEN] = "./xtrabackup_backupfiles/"; +char *xtrabackup_target_dir= xtrabackup_real_target_dir; +static my_bool xtrabackup_version; +my_bool xtrabackup_backup; +my_bool xtrabackup_prepare; +my_bool xtrabackup_copy_back; +my_bool xtrabackup_move_back; +my_bool xtrabackup_decrypt_decompress; +my_bool xtrabackup_print_param; + +my_bool xtrabackup_export; + +longlong xtrabackup_use_memory; + +uint opt_protocol; +long xtrabackup_throttle; /* 0:unlimited */ +static lint io_ticket; +static os_event_t wait_throttle; +static os_event_t log_copying_stop; + +char *xtrabackup_incremental; +lsn_t incremental_lsn; +lsn_t incremental_to_lsn; +lsn_t incremental_last_lsn; +xb_page_bitmap *changed_page_bitmap; + +char *xtrabackup_incremental_basedir; /* for --backup */ +char *xtrabackup_extra_lsndir; /* for --backup with --extra-lsndir */ +char *xtrabackup_incremental_dir; /* for --prepare */ + +char xtrabackup_real_incremental_basedir[FN_REFLEN]; +char xtrabackup_real_extra_lsndir[FN_REFLEN]; +char xtrabackup_real_incremental_dir[FN_REFLEN]; + + +char *xtrabackup_tmpdir; + +char *xtrabackup_tables; +char *xtrabackup_tables_file; +char *xtrabackup_tables_exclude; + +typedef std::list regex_list_t; +static regex_list_t regex_include_list; +static regex_list_t regex_exclude_list; + +static hash_table_t* tables_include_hash = NULL; +static hash_table_t* tables_exclude_hash = NULL; + +char *xtrabackup_databases = NULL; +char *xtrabackup_databases_file = NULL; +char *xtrabackup_databases_exclude = NULL; +static hash_table_t* databases_include_hash = NULL; +static hash_table_t* databases_exclude_hash = NULL; + +static hash_table_t* inc_dir_tables_hash; + +struct xb_filter_entry_struct{ + char* name; + ibool has_tables; + hash_node_t name_hash; +}; +typedef struct xb_filter_entry_struct xb_filter_entry_t; + +lsn_t checkpoint_lsn_start; +lsn_t checkpoint_no_start; +static lsn_t log_copy_scanned_lsn; +static bool log_copying; +static bool log_copying_running; +static bool io_watching_thread_running; + +int xtrabackup_parallel; + +char *xtrabackup_stream_str = NULL; +xb_stream_fmt_t xtrabackup_stream_fmt = XB_STREAM_FMT_NONE; +ibool xtrabackup_stream = FALSE; + +const char *xtrabackup_compress_alg = NULL; +ibool xtrabackup_compress = FALSE; +uint xtrabackup_compress_threads; +ulonglong xtrabackup_compress_chunk_size = 0; + +/* sleep interval beetween log copy iterations in log copying thread +in milliseconds (default is 1 second) */ +ulint xtrabackup_log_copy_interval = 1000; +static ulong max_buf_pool_modified_pct; + +/* Ignored option (--log) for MySQL option compatibility */ +static char* log_ignored_opt; + +/* === metadata of backup === */ +#define XTRABACKUP_METADATA_FILENAME "xtrabackup_checkpoints" +char metadata_type[30] = ""; /*[full-backuped|log-applied|incremental]*/ +lsn_t metadata_from_lsn; +lsn_t metadata_to_lsn; +lsn_t metadata_last_lsn; + +static ds_file_t* dst_log_file; + +static char mysql_data_home_buff[2]; + +const char *defaults_group = "mysqld"; + +/* === static parameters in ha_innodb.cc */ + +#define HA_INNOBASE_ROWS_IN_TABLE 10000 /* to get optimization right */ +#define HA_INNOBASE_RANGE_COUNT 100 + +ulong innobase_large_page_size = 0; + +/* The default values for the following, type long or longlong, start-up +parameters are declared in mysqld.cc: */ + +long innobase_buffer_pool_awe_mem_mb = 0; +long innobase_file_io_threads = 4; +long innobase_read_io_threads = 4; +long innobase_write_io_threads = 4; +long innobase_log_buffer_size = 1024*1024L; +long innobase_open_files = 300L; + +longlong innobase_page_size = (1LL << 14); /* 16KB */ +char* innobase_buffer_pool_filename = NULL; + +longlong innobase_buffer_pool_size = 8*1024*1024L; + +/* The default values for the following char* start-up parameters +are determined in innobase_init below: */ + +static char* innobase_ignored_opt; +char* innobase_data_home_dir; +char* innobase_data_file_path; +/* The following has a misleading name: starting from 4.0.5, this also +affects Windows: */ +char* innobase_unix_file_flush_method; + +my_bool innobase_use_doublewrite; +my_bool innobase_use_large_pages; +my_bool innobase_file_per_table; +my_bool innobase_locks_unsafe_for_binlog; +my_bool innobase_rollback_on_timeout; +my_bool innobase_create_status_file; + +/* The following counter is used to convey information to InnoDB +about server activity: in selects it is not sensible to call +srv_active_wake_master_thread after each fetch or search, we only do +it every INNOBASE_WAKE_INTERVAL'th step. */ + +#define INNOBASE_WAKE_INTERVAL 32 +ulong innobase_active_counter = 0; + + +static char *xtrabackup_debug_sync = NULL; + +my_bool xtrabackup_incremental_force_scan = FALSE; + +/* The flushed lsn which is read from data files */ +lsn_t flushed_lsn= 0; + +ulong xb_open_files_limit= 0; +char *xb_plugin_dir; +char *xb_plugin_load; +my_bool xb_close_files; + +/* Datasinks */ +ds_ctxt_t *ds_data = NULL; +ds_ctxt_t *ds_meta = NULL; +ds_ctxt_t *ds_redo = NULL; + +static bool innobackupex_mode = false; + +/* String buffer used by --print-param to accumulate server options as they are +parsed from the defaults file */ +static std::ostringstream print_param_str; + +/* Set of specified parameters */ +std::set param_set; + +static ulonglong global_max_value; + +extern "C" sig_handler handle_fatal_signal(int sig); +extern LOGGER logger; + +my_bool opt_galera_info = FALSE; +my_bool opt_slave_info = FALSE; +my_bool opt_no_lock = FALSE; +my_bool opt_safe_slave_backup = FALSE; +my_bool opt_rsync = FALSE; +my_bool opt_force_non_empty_dirs = FALSE; +my_bool opt_noversioncheck = FALSE; +my_bool opt_no_backup_locks = FALSE; +my_bool opt_decompress = FALSE; + +my_bool opt_lock_ddl_per_table = FALSE; + +static const char *binlog_info_values[] = {"off", "lockless", "on", "auto", + NullS}; +static TYPELIB binlog_info_typelib = {array_elements(binlog_info_values)-1, "", + binlog_info_values, NULL}; +ulong opt_binlog_info; + +char *opt_incremental_history_name; +char *opt_incremental_history_uuid; + +char *opt_user; +char *opt_password; +char *opt_host; +char *opt_defaults_group; +char *opt_socket; +uint opt_port; +char *opt_log_bin; + +const char *query_type_names[] = { "ALL", "UPDATE", "SELECT", NullS}; + +TYPELIB query_type_typelib= {array_elements(query_type_names) - 1, "", + query_type_names, NULL}; + +ulong opt_lock_wait_query_type; +ulong opt_kill_long_query_type; + +uint opt_kill_long_queries_timeout = 0; +uint opt_lock_wait_timeout = 0; +uint opt_lock_wait_threshold = 0; +uint opt_debug_sleep_before_unlock = 0; +uint opt_safe_slave_backup_timeout = 0; + +const char *opt_history = NULL; + +#if defined(HAVE_OPENSSL) +my_bool opt_ssl_verify_server_cert = FALSE; +#endif + +char mariabackup_exe[FN_REFLEN]; +char orig_argv1[FN_REFLEN]; + +/* Whether xtrabackup_binlog_info should be created on recovery */ +static bool recover_binlog_info; + +/* Simple datasink creation tracking...add datasinks in the reverse order you +want them destroyed. */ +#define XTRABACKUP_MAX_DATASINKS 10 +static ds_ctxt_t *datasinks[XTRABACKUP_MAX_DATASINKS]; +static uint actual_datasinks = 0; +static inline +void +xtrabackup_add_datasink(ds_ctxt_t *ds) +{ + xb_ad(actual_datasinks < XTRABACKUP_MAX_DATASINKS); + datasinks[actual_datasinks] = ds; actual_datasinks++; +} + + +typedef void (*process_single_tablespace_func_t)(const char *dirname, const char *filname, bool is_remote); +static dberr_t enumerate_ibd_files(process_single_tablespace_func_t callback); + + +/* ======== Datafiles iterator ======== */ +struct datafiles_iter_t { + fil_system_t *system; + fil_space_t *space; + fil_node_t *node; + ibool started; + pthread_mutex_t mutex; +}; + +/* ======== Datafiles iterator ======== */ +static +datafiles_iter_t * +datafiles_iter_new(fil_system_t *f_system) +{ + datafiles_iter_t *it; + + it = static_cast(malloc(sizeof(datafiles_iter_t))); + pthread_mutex_init(&it->mutex, NULL); + + it->system = f_system; + it->space = NULL; + it->node = NULL; + it->started = FALSE; + + return it; +} + +static +fil_node_t * +datafiles_iter_next(datafiles_iter_t *it) +{ + fil_node_t *new_node; + + pthread_mutex_lock(&it->mutex); + + if (it->node == NULL) { + if (it->started) + goto end; + it->started = TRUE; + } else { + it->node = UT_LIST_GET_NEXT(chain, it->node); + if (it->node != NULL) + goto end; + } + + it->space = (it->space == NULL) ? + UT_LIST_GET_FIRST(it->system->space_list) : + UT_LIST_GET_NEXT(space_list, it->space); + + while (it->space != NULL && + (it->space->purpose != FIL_TYPE_TABLESPACE || + UT_LIST_GET_LEN(it->space->chain) == 0)) + it->space = UT_LIST_GET_NEXT(space_list, it->space); + if (it->space == NULL) + goto end; + + it->node = UT_LIST_GET_FIRST(it->space->chain); + +end: + new_node = it->node; + pthread_mutex_unlock(&it->mutex); + + return new_node; +} + +static +void +datafiles_iter_free(datafiles_iter_t *it) +{ + pthread_mutex_destroy(&it->mutex); + free(it); +} + +/* ======== Date copying thread context ======== */ + +typedef struct { + datafiles_iter_t *it; + uint num; + uint *count; + pthread_mutex_t count_mutex; + os_thread_id_t id; +} data_thread_ctxt_t; + +/* ======== for option and variables ======== */ + +enum options_xtrabackup +{ + OPT_XTRA_TARGET_DIR = 1000, /* make sure it is larger + than OPT_MAX_CLIENT_OPTION */ + OPT_XTRA_BACKUP, + OPT_XTRA_PREPARE, + OPT_XTRA_EXPORT, + OPT_XTRA_PRINT_PARAM, + OPT_XTRA_USE_MEMORY, + OPT_XTRA_THROTTLE, + OPT_XTRA_LOG_COPY_INTERVAL, + OPT_XTRA_INCREMENTAL, + OPT_XTRA_INCREMENTAL_BASEDIR, + OPT_XTRA_EXTRA_LSNDIR, + OPT_XTRA_INCREMENTAL_DIR, + OPT_XTRA_TABLES, + OPT_XTRA_TABLES_FILE, + OPT_XTRA_DATABASES, + OPT_XTRA_DATABASES_FILE, + OPT_XTRA_PARALLEL, + OPT_XTRA_STREAM, + OPT_XTRA_COMPRESS, + OPT_XTRA_COMPRESS_THREADS, + OPT_XTRA_COMPRESS_CHUNK_SIZE, + OPT_LOG, + OPT_INNODB, + OPT_INNODB_DATA_FILE_PATH, + OPT_INNODB_DATA_HOME_DIR, + OPT_INNODB_ADAPTIVE_HASH_INDEX, + OPT_INNODB_DOUBLEWRITE, + OPT_INNODB_FILE_PER_TABLE, + OPT_INNODB_FLUSH_LOG_AT_TRX_COMMIT, + OPT_INNODB_FLUSH_METHOD, + OPT_INNODB_LOCKS_UNSAFE_FOR_BINLOG, + OPT_INNODB_LOG_GROUP_HOME_DIR, + OPT_INNODB_MAX_DIRTY_PAGES_PCT, + OPT_INNODB_MAX_PURGE_LAG, + OPT_INNODB_ROLLBACK_ON_TIMEOUT, + OPT_INNODB_STATUS_FILE, + OPT_INNODB_AUTOEXTEND_INCREMENT, + OPT_INNODB_BUFFER_POOL_SIZE, + OPT_INNODB_COMMIT_CONCURRENCY, + OPT_INNODB_CONCURRENCY_TICKETS, + OPT_INNODB_FILE_IO_THREADS, + OPT_INNODB_IO_CAPACITY, + OPT_INNODB_READ_IO_THREADS, + OPT_INNODB_WRITE_IO_THREADS, + OPT_INNODB_USE_NATIVE_AIO, + OPT_INNODB_PAGE_SIZE, + OPT_INNODB_BUFFER_POOL_FILENAME, + OPT_INNODB_LOCK_WAIT_TIMEOUT, + OPT_INNODB_LOG_BUFFER_SIZE, + OPT_INNODB_LOG_FILE_SIZE, + OPT_INNODB_LOG_FILES_IN_GROUP, + OPT_INNODB_OPEN_FILES, + OPT_XTRA_DEBUG_SYNC, + OPT_INNODB_CHECKSUM_ALGORITHM, + OPT_INNODB_UNDO_DIRECTORY, + OPT_INNODB_UNDO_TABLESPACES, + OPT_INNODB_LOG_CHECKSUMS, + OPT_XTRA_INCREMENTAL_FORCE_SCAN, + OPT_DEFAULTS_GROUP, + OPT_OPEN_FILES_LIMIT, + OPT_PLUGIN_DIR, + OPT_PLUGIN_LOAD, + OPT_INNODB_ENCRYPT_LOG, + OPT_CLOSE_FILES, + OPT_CORE_FILE, + + OPT_COPY_BACK, + OPT_MOVE_BACK, + OPT_GALERA_INFO, + OPT_SLAVE_INFO, + OPT_NO_LOCK, + OPT_SAFE_SLAVE_BACKUP, + OPT_RSYNC, + OPT_FORCE_NON_EMPTY_DIRS, + OPT_NO_VERSION_CHECK, + OPT_NO_BACKUP_LOCKS, + OPT_DECOMPRESS, + OPT_INCREMENTAL_HISTORY_NAME, + OPT_INCREMENTAL_HISTORY_UUID, + OPT_LOCK_WAIT_QUERY_TYPE, + OPT_KILL_LONG_QUERY_TYPE, + OPT_HISTORY, + OPT_KILL_LONG_QUERIES_TIMEOUT, + OPT_LOCK_WAIT_TIMEOUT, + OPT_LOCK_WAIT_THRESHOLD, + OPT_DEBUG_SLEEP_BEFORE_UNLOCK, + OPT_SAFE_SLAVE_BACKUP_TIMEOUT, + OPT_BINLOG_INFO, + OPT_XB_SECURE_AUTH, + + OPT_XTRA_TABLES_EXCLUDE, + OPT_XTRA_DATABASES_EXCLUDE, + OPT_PROTOCOL, + OPT_LOCK_DDL_PER_TABLE +}; + +struct my_option xb_client_options[] = +{ + {"version", 'v', "print xtrabackup version information", + (G_PTR *) &xtrabackup_version, (G_PTR *) &xtrabackup_version, 0, GET_BOOL, + NO_ARG, 0, 0, 0, 0, 0, 0}, + {"target-dir", OPT_XTRA_TARGET_DIR, "destination directory", (G_PTR*) &xtrabackup_target_dir, + (G_PTR*) &xtrabackup_target_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"backup", OPT_XTRA_BACKUP, "take backup to target-dir", + (G_PTR*) &xtrabackup_backup, (G_PTR*) &xtrabackup_backup, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"prepare", OPT_XTRA_PREPARE, "prepare a backup for starting mysql server on the backup.", + (G_PTR*) &xtrabackup_prepare, (G_PTR*) &xtrabackup_prepare, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"export", OPT_XTRA_EXPORT, "create files to import to another database when prepare.", + (G_PTR*) &xtrabackup_export, (G_PTR*) &xtrabackup_export, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"print-param", OPT_XTRA_PRINT_PARAM, "print parameter of mysqld needed for copyback.", + (G_PTR*) &xtrabackup_print_param, (G_PTR*) &xtrabackup_print_param, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"use-memory", OPT_XTRA_USE_MEMORY, "The value is used instead of buffer_pool_size", + (G_PTR*) &xtrabackup_use_memory, (G_PTR*) &xtrabackup_use_memory, + 0, GET_LL, REQUIRED_ARG, 100*1024*1024L, 1024*1024L, LONGLONG_MAX, 0, + 1024*1024L, 0}, + {"throttle", OPT_XTRA_THROTTLE, "limit count of IO operations (pairs of read&write) per second to IOS values (for '--backup')", + (G_PTR*) &xtrabackup_throttle, (G_PTR*) &xtrabackup_throttle, + 0, GET_LONG, REQUIRED_ARG, 0, 0, LONG_MAX, 0, 1, 0}, + {"log", OPT_LOG, "Ignored option for MySQL option compatibility", + (G_PTR*) &log_ignored_opt, (G_PTR*) &log_ignored_opt, 0, + GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, + {"log-copy-interval", OPT_XTRA_LOG_COPY_INTERVAL, "time interval between checks done by log copying thread in milliseconds (default is 1 second).", + (G_PTR*) &xtrabackup_log_copy_interval, (G_PTR*) &xtrabackup_log_copy_interval, + 0, GET_LONG, REQUIRED_ARG, 1000, 0, LONG_MAX, 0, 1, 0}, + {"extra-lsndir", OPT_XTRA_EXTRA_LSNDIR, "(for --backup): save an extra copy of the xtrabackup_checkpoints file in this directory.", + (G_PTR*) &xtrabackup_extra_lsndir, (G_PTR*) &xtrabackup_extra_lsndir, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"incremental-lsn", OPT_XTRA_INCREMENTAL, "(for --backup): copy only .ibd pages newer than specified LSN 'high:low'. ##ATTENTION##: If a wrong LSN value is specified, it is impossible to diagnose this, causing the backup to be unusable. Be careful!", + (G_PTR*) &xtrabackup_incremental, (G_PTR*) &xtrabackup_incremental, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"incremental-basedir", OPT_XTRA_INCREMENTAL_BASEDIR, "(for --backup): copy only .ibd pages newer than backup at specified directory.", + (G_PTR*) &xtrabackup_incremental_basedir, (G_PTR*) &xtrabackup_incremental_basedir, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"incremental-dir", OPT_XTRA_INCREMENTAL_DIR, "(for --prepare): apply .delta files and logfile in the specified directory.", + (G_PTR*) &xtrabackup_incremental_dir, (G_PTR*) &xtrabackup_incremental_dir, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"tables", OPT_XTRA_TABLES, "filtering by regexp for table names.", + (G_PTR*) &xtrabackup_tables, (G_PTR*) &xtrabackup_tables, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"tables_file", OPT_XTRA_TABLES_FILE, "filtering by list of the exact database.table name in the file.", + (G_PTR*) &xtrabackup_tables_file, (G_PTR*) &xtrabackup_tables_file, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"databases", OPT_XTRA_DATABASES, "filtering by list of databases.", + (G_PTR*) &xtrabackup_databases, (G_PTR*) &xtrabackup_databases, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"databases_file", OPT_XTRA_DATABASES_FILE, + "filtering by list of databases in the file.", + (G_PTR*) &xtrabackup_databases_file, (G_PTR*) &xtrabackup_databases_file, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"tables-exclude", OPT_XTRA_TABLES_EXCLUDE, "filtering by regexp for table names. " + "Operates the same way as --tables, but matched names are excluded from backup. " + "Note that this option has a higher priority than --tables.", + (G_PTR*) &xtrabackup_tables_exclude, (G_PTR*) &xtrabackup_tables_exclude, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"databases-exclude", OPT_XTRA_DATABASES_EXCLUDE, "Excluding databases based on name, " + "Operates the same way as --databases, but matched names are excluded from backup. " + "Note that this option has a higher priority than --databases.", + (G_PTR*) &xtrabackup_databases_exclude, (G_PTR*) &xtrabackup_databases_exclude, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"stream", OPT_XTRA_STREAM, "Stream all backup files to the standard output " + "in the specified format." + "Supported format is 'xbstream'." + , + (G_PTR*) &xtrabackup_stream_str, (G_PTR*) &xtrabackup_stream_str, 0, GET_STR, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"compress", OPT_XTRA_COMPRESS, "Compress individual backup files using the " + "specified compression algorithm. Currently the only supported algorithm " + "is 'quicklz'. It is also the default algorithm, i.e. the one used when " + "--compress is used without an argument.", + (G_PTR*) &xtrabackup_compress_alg, (G_PTR*) &xtrabackup_compress_alg, 0, + GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, + + {"compress-threads", OPT_XTRA_COMPRESS_THREADS, + "Number of threads for parallel data compression. The default value is 1.", + (G_PTR*) &xtrabackup_compress_threads, (G_PTR*) &xtrabackup_compress_threads, + 0, GET_UINT, REQUIRED_ARG, 1, 1, UINT_MAX, 0, 0, 0}, + + {"compress-chunk-size", OPT_XTRA_COMPRESS_CHUNK_SIZE, + "Size of working buffer(s) for compression threads in bytes. The default value is 64K.", + (G_PTR*) &xtrabackup_compress_chunk_size, (G_PTR*) &xtrabackup_compress_chunk_size, + 0, GET_ULL, REQUIRED_ARG, (1 << 16), 1024, ULONGLONG_MAX, 0, 0, 0}, + + {"incremental-force-scan", OPT_XTRA_INCREMENTAL_FORCE_SCAN, + "Perform a full-scan incremental backup even in the presence of changed " + "page bitmap data", + (G_PTR*)&xtrabackup_incremental_force_scan, + (G_PTR*)&xtrabackup_incremental_force_scan, 0, GET_BOOL, NO_ARG, + 0, 0, 0, 0, 0, 0}, + + + {"close_files", OPT_CLOSE_FILES, "do not keep files opened. Use at your own " + "risk.", (G_PTR*) &xb_close_files, (G_PTR*) &xb_close_files, 0, GET_BOOL, + NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"core-file", OPT_CORE_FILE, "Write core on fatal signals", 0, 0, 0, + GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + + + {"copy-back", OPT_COPY_BACK, "Copy all the files in a previously made " + "backup from the backup directory to their original locations.", + (uchar *) &xtrabackup_copy_back, (uchar *) &xtrabackup_copy_back, 0, + GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"move-back", OPT_MOVE_BACK, "Move all the files in a previously made " + "backup from the backup directory to the actual datadir location. " + "Use with caution, as it removes backup files.", + (uchar *) &xtrabackup_move_back, (uchar *) &xtrabackup_move_back, 0, + GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"galera-info", OPT_GALERA_INFO, "This options creates the " + "xtrabackup_galera_info file which contains the local node state at " + "the time of the backup. Option should be used when performing the " + "backup of Percona-XtraDB-Cluster. Has no effect when backup locks " + "are used to create the backup.", + (uchar *) &opt_galera_info, (uchar *) &opt_galera_info, 0, + GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"slave-info", OPT_SLAVE_INFO, "This option is useful when backing " + "up a replication slave server. It prints the binary log position " + "and name of the master server. It also writes this information to " + "the \"xtrabackup_slave_info\" file as a \"CHANGE MASTER\" command. " + "A new slave for this master can be set up by starting a slave server " + "on this backup and issuing a \"CHANGE MASTER\" command with the " + "binary log position saved in the \"xtrabackup_slave_info\" file.", + (uchar *) &opt_slave_info, (uchar *) &opt_slave_info, 0, + GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"no-lock", OPT_NO_LOCK, "Use this option to disable table lock " + "with \"FLUSH TABLES WITH READ LOCK\". Use it only if ALL your " + "tables are InnoDB and you DO NOT CARE about the binary log " + "position of the backup. This option shouldn't be used if there " + "are any DDL statements being executed or if any updates are " + "happening on non-InnoDB tables (this includes the system MyISAM " + "tables in the mysql database), otherwise it could lead to an " + "inconsistent backup. If you are considering to use --no-lock " + "because your backups are failing to acquire the lock, this could " + "be because of incoming replication events preventing the lock " + "from succeeding. Please try using --safe-slave-backup to " + "momentarily stop the replication slave thread, this may help " + "the backup to succeed and you then don't need to resort to " + "using this option.", + (uchar *) &opt_no_lock, (uchar *) &opt_no_lock, 0, + GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"safe-slave-backup", OPT_SAFE_SLAVE_BACKUP, "Stop slave SQL thread " + "and wait to start backup until Slave_open_temp_tables in " + "\"SHOW STATUS\" is zero. If there are no open temporary tables, " + "the backup will take place, otherwise the SQL thread will be " + "started and stopped until there are no open temporary tables. " + "The backup will fail if Slave_open_temp_tables does not become " + "zero after --safe-slave-backup-timeout seconds. The slave SQL " + "thread will be restarted when the backup finishes.", + (uchar *) &opt_safe_slave_backup, + (uchar *) &opt_safe_slave_backup, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"rsync", OPT_RSYNC, "Uses the rsync utility to optimize local file " + "transfers. When this option is specified, innobackupex uses rsync " + "to copy all non-InnoDB files instead of spawning a separate cp for " + "each file, which can be much faster for servers with a large number " + "of databases or tables. This option cannot be used together with " + "--stream.", + (uchar *) &opt_rsync, (uchar *) &opt_rsync, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"force-non-empty-directories", OPT_FORCE_NON_EMPTY_DIRS, "This " + "option, when specified, makes --copy-back or --move-back transfer " + "files to non-empty directories. Note that no existing files will be " + "overwritten. If --copy-back or --nove-back has to copy a file from " + "the backup directory which already exists in the destination " + "directory, it will still fail with an error.", + (uchar *) &opt_force_non_empty_dirs, + (uchar *) &opt_force_non_empty_dirs, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"no-version-check", OPT_NO_VERSION_CHECK, "This option disables the " + "version check which is enabled by the --version-check option.", + (uchar *) &opt_noversioncheck, + (uchar *) &opt_noversioncheck, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"no-backup-locks", OPT_NO_BACKUP_LOCKS, "This option controls if " + "backup locks should be used instead of FLUSH TABLES WITH READ LOCK " + "on the backup stage. The option has no effect when backup locks are " + "not supported by the server. This option is enabled by default, " + "disable with --no-backup-locks.", + (uchar *) &opt_no_backup_locks, + (uchar *) &opt_no_backup_locks, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"decompress", OPT_DECOMPRESS, "Decompresses all files with the .qp " + "extension in a backup previously made with the --compress option.", + (uchar *) &opt_decompress, + (uchar *) &opt_decompress, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"user", 'u', "This option specifies the MySQL username used " + "when connecting to the server, if that's not the current user. " + "The option accepts a string argument. See mysql --help for details.", + (uchar*) &opt_user, (uchar*) &opt_user, 0, GET_STR, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"host", 'H', "This option specifies the host to use when " + "connecting to the database server with TCP/IP. The option accepts " + "a string argument. See mysql --help for details.", + (uchar*) &opt_host, (uchar*) &opt_host, 0, GET_STR, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"port", 'P', "This option specifies the port to use when " + "connecting to the database server with TCP/IP. The option accepts " + "a string argument. See mysql --help for details.", + &opt_port, &opt_port, 0, GET_UINT, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + + {"password", 'p', "This option specifies the password to use " + "when connecting to the database. It accepts a string argument. " + "See mysql --help for details.", + 0, 0, 0, GET_STR, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"protocol", OPT_PROTOCOL, "The protocol to use for connection (tcp, socket, pipe, memory).", + 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"socket", 'S', "This option specifies the socket to use when " + "connecting to the local database server with a UNIX domain socket. " + "The option accepts a string argument. See mysql --help for details.", + (uchar*) &opt_socket, (uchar*) &opt_socket, 0, GET_STR, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"incremental-history-name", OPT_INCREMENTAL_HISTORY_NAME, + "This option specifies the name of the backup series stored in the " + "PERCONA_SCHEMA.xtrabackup_history history record to base an " + "incremental backup on. Xtrabackup will search the history table " + "looking for the most recent (highest innodb_to_lsn), successful " + "backup in the series and take the to_lsn value to use as the " + "starting lsn for the incremental backup. This will be mutually " + "exclusive with --incremental-history-uuid, --incremental-basedir " + "and --incremental-lsn. If no valid lsn can be found (no series by " + "that name, no successful backups by that name) xtrabackup will " + "return with an error. It is used with the --incremental option.", + (uchar*) &opt_incremental_history_name, + (uchar*) &opt_incremental_history_name, 0, GET_STR, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"incremental-history-uuid", OPT_INCREMENTAL_HISTORY_UUID, + "This option specifies the UUID of the specific history record " + "stored in the PERCONA_SCHEMA.xtrabackup_history to base an " + "incremental backup on. --incremental-history-name, " + "--incremental-basedir and --incremental-lsn. If no valid lsn can be " + "found (no success record with that uuid) xtrabackup will return " + "with an error. It is used with the --incremental option.", + (uchar*) &opt_incremental_history_uuid, + (uchar*) &opt_incremental_history_uuid, 0, GET_STR, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"ftwrl-wait-query-type", OPT_LOCK_WAIT_QUERY_TYPE, + "This option specifies which types of queries are allowed to complete " + "before innobackupex will issue the global lock. Default is all.", + (uchar*) &opt_lock_wait_query_type, + (uchar*) &opt_lock_wait_query_type, &query_type_typelib, + GET_ENUM, REQUIRED_ARG, QUERY_TYPE_ALL, 0, 0, 0, 0, 0}, + + {"kill-long-query-type", OPT_KILL_LONG_QUERY_TYPE, + "This option specifies which types of queries should be killed to " + "unblock the global lock. Default is \"all\".", + (uchar*) &opt_kill_long_query_type, + (uchar*) &opt_kill_long_query_type, &query_type_typelib, + GET_ENUM, REQUIRED_ARG, QUERY_TYPE_SELECT, 0, 0, 0, 0, 0}, + + {"history", OPT_HISTORY, + "This option enables the tracking of backup history in the " + "PERCONA_SCHEMA.xtrabackup_history table. An optional history " + "series name may be specified that will be placed with the history " + "record for the current backup being taken.", + NULL, NULL, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, + + {"kill-long-queries-timeout", OPT_KILL_LONG_QUERIES_TIMEOUT, + "This option specifies the number of seconds innobackupex waits " + "between starting FLUSH TABLES WITH READ LOCK and killing those " + "queries that block it. Default is 0 seconds, which means " + "innobackupex will not attempt to kill any queries.", + (uchar*) &opt_kill_long_queries_timeout, + (uchar*) &opt_kill_long_queries_timeout, 0, GET_UINT, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"ftwrl-wait-timeout", OPT_LOCK_WAIT_TIMEOUT, + "This option specifies time in seconds that innobackupex should wait " + "for queries that would block FTWRL before running it. If there are " + "still such queries when the timeout expires, innobackupex terminates " + "with an error. Default is 0, in which case innobackupex does not " + "wait for queries to complete and starts FTWRL immediately.", + (uchar*) &opt_lock_wait_timeout, + (uchar*) &opt_lock_wait_timeout, 0, GET_UINT, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"ftwrl-wait-threshold", OPT_LOCK_WAIT_THRESHOLD, + "This option specifies the query run time threshold which is used by " + "innobackupex to detect long-running queries with a non-zero value " + "of --ftwrl-wait-timeout. FTWRL is not started until such " + "long-running queries exist. This option has no effect if " + "--ftwrl-wait-timeout is 0. Default value is 60 seconds.", + (uchar*) &opt_lock_wait_threshold, + (uchar*) &opt_lock_wait_threshold, 0, GET_UINT, + REQUIRED_ARG, 60, 0, 0, 0, 0, 0}, + + {"debug-sleep-before-unlock", OPT_DEBUG_SLEEP_BEFORE_UNLOCK, + "This is a debug-only option used by the XtraBackup test suite.", + (uchar*) &opt_debug_sleep_before_unlock, + (uchar*) &opt_debug_sleep_before_unlock, 0, GET_UINT, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"safe-slave-backup-timeout", OPT_SAFE_SLAVE_BACKUP_TIMEOUT, + "How many seconds --safe-slave-backup should wait for " + "Slave_open_temp_tables to become zero. (default 300)", + (uchar*) &opt_safe_slave_backup_timeout, + (uchar*) &opt_safe_slave_backup_timeout, 0, GET_UINT, + REQUIRED_ARG, 300, 0, 0, 0, 0, 0}, + + {"binlog-info", OPT_BINLOG_INFO, + "This option controls how XtraBackup should retrieve server's binary log " + "coordinates corresponding to the backup. Possible values are OFF, ON, " + "LOCKLESS and AUTO. See the XtraBackup manual for more information", + &opt_binlog_info, &opt_binlog_info, + &binlog_info_typelib, GET_ENUM, OPT_ARG, BINLOG_INFO_AUTO, 0, 0, 0, 0, 0}, + + {"secure-auth", OPT_XB_SECURE_AUTH, "Refuse client connecting to server if it" + " uses old (pre-4.1.1) protocol.", &opt_secure_auth, + &opt_secure_auth, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, + +#include "sslopt-longopts.h" + + + { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} +}; + +uint xb_client_options_count = array_elements(xb_client_options); + +#ifndef DBUG_OFF +/** Parameters to DBUG */ +static const char *dbug_option; +#endif + +struct my_option xb_server_options[] = +{ + {"datadir", 'h', "Path to the database root.", (G_PTR*) &mysql_data_home, + (G_PTR*) &mysql_data_home, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"tmpdir", 't', + "Path for temporary files. Several paths may be specified, separated by a " +#if defined(__WIN__) || defined(OS2) || defined(__NETWARE__) + "semicolon (;)" +#else + "colon (:)" +#endif + ", in this case they are used in a round-robin fashion.", + (G_PTR*) &opt_mysql_tmpdir, + (G_PTR*) &opt_mysql_tmpdir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"parallel", OPT_XTRA_PARALLEL, + "Number of threads to use for parallel datafiles transfer. " + "The default value is 1.", + (G_PTR*) &xtrabackup_parallel, (G_PTR*) &xtrabackup_parallel, 0, GET_INT, + REQUIRED_ARG, 1, 1, INT_MAX, 0, 0, 0}, + + {"log", OPT_LOG, "Ignored option for MySQL option compatibility", + (G_PTR*) &log_ignored_opt, (G_PTR*) &log_ignored_opt, 0, + GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, + + {"log_bin", OPT_LOG, "Base name for the log sequence", + &opt_log_bin, &opt_log_bin, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, + + {"innodb", OPT_INNODB, "Ignored option for MySQL option compatibility", + (G_PTR*) &innobase_ignored_opt, (G_PTR*) &innobase_ignored_opt, 0, + GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, +#ifdef BTR_CUR_HASH_ADAPT + {"innodb_adaptive_hash_index", OPT_INNODB_ADAPTIVE_HASH_INDEX, + "Enable InnoDB adaptive hash index (enabled by default). " + "Disable with --skip-innodb-adaptive-hash-index.", + &btr_search_enabled, + &btr_search_enabled, + 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, +#endif /* BTR_CUR_HASH_ADAPT */ + {"innodb_autoextend_increment", OPT_INNODB_AUTOEXTEND_INCREMENT, + "Data file autoextend increment in megabytes", + (G_PTR*) &sys_tablespace_auto_extend_increment, + (G_PTR*) &sys_tablespace_auto_extend_increment, + 0, GET_ULONG, REQUIRED_ARG, 8L, 1L, 1000L, 0, 1L, 0}, + {"innodb_buffer_pool_size", OPT_INNODB_BUFFER_POOL_SIZE, + "The size of the memory buffer InnoDB uses to cache data and indexes of its tables.", + (G_PTR*) &innobase_buffer_pool_size, (G_PTR*) &innobase_buffer_pool_size, 0, + GET_LL, REQUIRED_ARG, 8*1024*1024L, 1024*1024L, LONGLONG_MAX, 0, + 1024*1024L, 0}, + {"innodb_data_file_path", OPT_INNODB_DATA_FILE_PATH, + "Path to individual files and their sizes.", &innobase_data_file_path, + &innobase_data_file_path, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"innodb_data_home_dir", OPT_INNODB_DATA_HOME_DIR, + "The common part for InnoDB table spaces.", &innobase_data_home_dir, + &innobase_data_home_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"innodb_doublewrite", OPT_INNODB_DOUBLEWRITE, + "Enable InnoDB doublewrite buffer during --prepare.", + (G_PTR*) &innobase_use_doublewrite, + (G_PTR*) &innobase_use_doublewrite, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"innodb_io_capacity", OPT_INNODB_IO_CAPACITY, + "Number of IOPs the server can do. Tunes the background IO rate", + (G_PTR*) &srv_io_capacity, (G_PTR*) &srv_io_capacity, + 0, GET_ULONG, OPT_ARG, 200, 100, ~0UL, 0, 0, 0}, + {"innodb_file_io_threads", OPT_INNODB_FILE_IO_THREADS, + "Number of file I/O threads in InnoDB.", (G_PTR*) &innobase_file_io_threads, + (G_PTR*) &innobase_file_io_threads, 0, GET_LONG, REQUIRED_ARG, 4, 4, 64, 0, + 1, 0}, + {"innodb_read_io_threads", OPT_INNODB_READ_IO_THREADS, + "Number of background read I/O threads in InnoDB.", (G_PTR*) &innobase_read_io_threads, + (G_PTR*) &innobase_read_io_threads, 0, GET_LONG, REQUIRED_ARG, 4, 1, 64, 0, + 1, 0}, + {"innodb_write_io_threads", OPT_INNODB_WRITE_IO_THREADS, + "Number of background write I/O threads in InnoDB.", (G_PTR*) &innobase_write_io_threads, + (G_PTR*) &innobase_write_io_threads, 0, GET_LONG, REQUIRED_ARG, 4, 1, 64, 0, + 1, 0}, + {"innodb_file_per_table", OPT_INNODB_FILE_PER_TABLE, + "Stores each InnoDB table to an .ibd file in the database dir.", + (G_PTR*) &innobase_file_per_table, + (G_PTR*) &innobase_file_per_table, 0, GET_BOOL, NO_ARG, + FALSE, 0, 0, 0, 0, 0}, + + {"innodb_flush_method", OPT_INNODB_FLUSH_METHOD, + "With which method to flush data.", (G_PTR*) &innobase_unix_file_flush_method, + (G_PTR*) &innobase_unix_file_flush_method, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, + 0, 0, 0}, + + {"innodb_log_buffer_size", OPT_INNODB_LOG_BUFFER_SIZE, + "The size of the buffer which InnoDB uses to write log to the log files on disk.", + (G_PTR*) &innobase_log_buffer_size, (G_PTR*) &innobase_log_buffer_size, 0, + GET_LONG, REQUIRED_ARG, 1024*1024L, 256*1024L, LONG_MAX, 0, 1024, 0}, + {"innodb_log_file_size", OPT_INNODB_LOG_FILE_SIZE, + "Ignored for mysqld option compatibility", + (G_PTR*) &srv_log_file_size, (G_PTR*) &srv_log_file_size, 0, + GET_ULL, REQUIRED_ARG, 48 << 20, 1 << 20, 512ULL << 30, 0, + UNIV_PAGE_SIZE_MAX, 0}, + {"innodb_log_files_in_group", OPT_INNODB_LOG_FILES_IN_GROUP, + "Ignored for mysqld option compatibility", + &srv_n_log_files, &srv_n_log_files, + 0, GET_LONG, REQUIRED_ARG, 1, 1, 100, 0, 1, 0}, + {"innodb_log_group_home_dir", OPT_INNODB_LOG_GROUP_HOME_DIR, + "Path to InnoDB log files.", &srv_log_group_home_dir, + &srv_log_group_home_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"innodb_max_dirty_pages_pct", OPT_INNODB_MAX_DIRTY_PAGES_PCT, + "Percentage of dirty pages allowed in bufferpool.", (G_PTR*) &srv_max_buf_pool_modified_pct, + (G_PTR*) &srv_max_buf_pool_modified_pct, 0, GET_ULONG, REQUIRED_ARG, 90, 0, 100, 0, 0, 0}, + {"innodb_open_files", OPT_INNODB_OPEN_FILES, + "How many files at the maximum InnoDB keeps open at the same time.", + (G_PTR*) &innobase_open_files, (G_PTR*) &innobase_open_files, 0, + GET_LONG, REQUIRED_ARG, 300L, 10L, LONG_MAX, 0, 1L, 0}, + {"innodb_use_native_aio", OPT_INNODB_USE_NATIVE_AIO, + "Use native AIO if supported on this platform.", + (G_PTR*) &srv_use_native_aio, + (G_PTR*) &srv_use_native_aio, 0, GET_BOOL, NO_ARG, + FALSE, 0, 0, 0, 0, 0}, + {"innodb_page_size", OPT_INNODB_PAGE_SIZE, + "The universal page size of the database.", + (G_PTR*) &innobase_page_size, (G_PTR*) &innobase_page_size, 0, + /* Use GET_LL to support numeric suffixes in 5.6 */ + GET_LL, REQUIRED_ARG, + (1LL << 14), (1LL << 12), (1LL << UNIV_PAGE_SIZE_SHIFT_MAX), 0, 1L, 0}, + {"innodb_buffer_pool_filename", OPT_INNODB_BUFFER_POOL_FILENAME, + "Ignored for mysqld option compatibility", + (G_PTR*) &innobase_buffer_pool_filename, + (G_PTR*) &innobase_buffer_pool_filename, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + +#ifndef DBUG_OFF /* unfortunately "debug" collides with existing options */ + {"dbug", '#', "Built in DBUG debugger.", + &dbug_option, &dbug_option, 0, GET_STR, OPT_ARG, + 0, 0, 0, 0, 0, 0}, +#endif +#ifndef __WIN__ + {"debug-sync", OPT_XTRA_DEBUG_SYNC, + "Debug sync point. This is only used by the xtrabackup test suite", + (G_PTR*) &xtrabackup_debug_sync, + (G_PTR*) &xtrabackup_debug_sync, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, +#endif + + {"innodb_checksum_algorithm", OPT_INNODB_CHECKSUM_ALGORITHM, + "The algorithm InnoDB uses for page checksumming. [CRC32, STRICT_CRC32, " + "INNODB, STRICT_INNODB, NONE, STRICT_NONE]", &srv_checksum_algorithm, + &srv_checksum_algorithm, &innodb_checksum_algorithm_typelib, GET_ENUM, + REQUIRED_ARG, SRV_CHECKSUM_ALGORITHM_INNODB, 0, 0, 0, 0, 0}, + + {"innodb_undo_directory", OPT_INNODB_UNDO_DIRECTORY, + "Directory where undo tablespace files live, this path can be absolute.", + &srv_undo_dir, &srv_undo_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, + 0}, + + {"innodb_undo_tablespaces", OPT_INNODB_UNDO_TABLESPACES, + "Number of undo tablespaces to use.", + (G_PTR*)&srv_undo_tablespaces, (G_PTR*)&srv_undo_tablespaces, + 0, GET_ULONG, REQUIRED_ARG, 0, 0, 126, 0, 1, 0}, + + {"defaults_group", OPT_DEFAULTS_GROUP, "defaults group in config file (default \"mysqld\").", + (G_PTR*) &defaults_group, (G_PTR*) &defaults_group, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"plugin-dir", OPT_PLUGIN_DIR, "Server plugin directory", + &xb_plugin_dir, &xb_plugin_dir, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, + + { "plugin-load", OPT_PLUGIN_LOAD, "encrypton plugin to load", + &xb_plugin_load, &xb_plugin_load, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, + + { "innodb-encrypt-log", OPT_INNODB_ENCRYPT_LOG, "encrypton plugin to load", + &srv_encrypt_log, &srv_encrypt_log, + 0, GET_BOOL, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, + + {"innodb-log-checksums", OPT_INNODB_LOG_CHECKSUMS, + "Whether to require checksums for InnoDB redo log blocks", + &innodb_log_checksums, &innodb_log_checksums, + 0, GET_BOOL, REQUIRED_ARG, 1, 0, 0, 0, 0, 0 }, + + {"open_files_limit", OPT_OPEN_FILES_LIMIT, "the maximum number of file " + "descriptors to reserve with setrlimit().", + (G_PTR*) &xb_open_files_limit, (G_PTR*) &xb_open_files_limit, 0, GET_ULONG, + REQUIRED_ARG, 0, 0, UINT_MAX, 0, 1, 0}, + + {"lock-ddl-per-table", OPT_LOCK_DDL_PER_TABLE, "Lock DDL for each table " + "before xtrabackup starts to copy it and until the backup is completed.", + (uchar*) &opt_lock_ddl_per_table, (uchar*) &opt_lock_ddl_per_table, 0, + GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} +}; + +uint xb_server_options_count = array_elements(xb_server_options); + +#ifndef __WIN__ +static int debug_sync_resumed; + +static void sigcont_handler(int sig); + +static void sigcont_handler(int sig __attribute__((unused))) +{ + debug_sync_resumed= 1; +} +#endif + +static inline +void +debug_sync_point(const char *name) +{ +#ifndef __WIN__ + FILE *fp; + pid_t pid; + char pid_path[FN_REFLEN]; + + if (xtrabackup_debug_sync == NULL) { + return; + } + + if (strcmp(xtrabackup_debug_sync, name)) { + return; + } + + pid = getpid(); + + snprintf(pid_path, sizeof(pid_path), "%s/xtrabackup_debug_sync", + xtrabackup_target_dir); + fp = fopen(pid_path, "w"); + if (fp == NULL) { + msg("xtrabackup: Error: cannot open %s\n", pid_path); + exit(EXIT_FAILURE); + } + fprintf(fp, "%u\n", (uint) pid); + fclose(fp); + + msg("xtrabackup: DEBUG: Suspending at debug sync point '%s'. " + "Resume with 'kill -SIGCONT %u'.\n", name, (uint) pid); + + debug_sync_resumed= 0; + kill(pid, SIGSTOP); + while (!debug_sync_resumed) { + sleep(1); + } + + /* On resume */ + msg("xtrabackup: DEBUG: removing the pid file.\n"); + my_delete(pid_path, MYF(MY_WME)); +#endif +} + + +static std::vector tables_for_export; + +static void append_export_table(const char *dbname, const char *tablename, bool is_remote) +{ + if(dbname && tablename && !is_remote) + { + char buf[3*FN_REFLEN]; + snprintf(buf,sizeof(buf),"%s/%s",dbname, tablename); + // trim .ibd + char *p=strrchr(buf, '.'); + if (p) *p=0; + + tables_for_export.push_back(ut_get_name(0,buf)); + } +} + + +#define BOOTSTRAP_FILENAME "mariabackup_prepare_for_export.sql" + +static int create_bootstrap_file() +{ + FILE *f= fopen(BOOTSTRAP_FILENAME,"wb"); + if(!f) + return -1; + + fputs("SET NAMES UTF8;\n",f); + enumerate_ibd_files(append_export_table); + for (size_t i= 0; i < tables_for_export.size(); i++) + { + const char *tab = tables_for_export[i].c_str(); + fprintf(f, + "BEGIN NOT ATOMIC " + "DECLARE CONTINUE HANDLER FOR NOT FOUND,SQLEXCEPTION BEGIN END;" + "FLUSH TABLES %s FOR EXPORT;" + "END;\n" + "UNLOCK TABLES;\n", + tab); + } + fclose(f); + return 0; +} + +static int prepare_export() +{ + int err= -1; + + char cmdline[2*FN_REFLEN]; + FILE *outf; + + if (create_bootstrap_file()) + return -1; + + // Process defaults-file , it can have some --lc-language stuff, + // which is* unfortunately* still necessary to get mysqld up + if (strncmp(orig_argv1,"--defaults-file=",16) == 0) + { + sprintf(cmdline, + IF_WIN("\"","") "\"%s\" --mysqld \"%s\" --defaults-group-suffix=%s" + " --defaults-extra-file=./backup-my.cnf --datadir=." + " --innodb --innodb-fast-shutdown=0" + " --innodb_purge_rseg_truncate_frequency=1 --innodb-buffer-pool-size=%llu" + " --console --skip-log-error --bootstrap < " BOOTSTRAP_FILENAME IF_WIN("\"",""), + mariabackup_exe, + orig_argv1, (my_defaults_group_suffix?my_defaults_group_suffix:""), + xtrabackup_use_memory); + } + else + { + sprintf(cmdline, + IF_WIN("\"","") "\"%s\" --mysqld" + " --defaults-file=./backup-my.cnf --datadir=." + " --innodb --innodb-fast-shutdown=0" + " --innodb_purge_rseg_truncate_frequency=1 --innodb-buffer-pool-size=%llu" + " --console --log-error= --bootstrap < " BOOTSTRAP_FILENAME IF_WIN("\"",""), + mariabackup_exe, + xtrabackup_use_memory); + } + + msg("Prepare export : executing %s\n", cmdline); + fflush(stderr); + + outf= popen(cmdline,"r"); + if (!outf) + goto end; + + char outline[FN_REFLEN]; + while(fgets(outline, sizeof(outline)-1, outf)) + fprintf(stderr,"%s",outline); + + err = pclose(outf); +end: + unlink(BOOTSTRAP_FILENAME); + return err; +} + + +static const char *xb_client_default_groups[]= + { "xtrabackup", "client", 0, 0, 0 }; + +static const char *xb_server_default_groups[]= + { "xtrabackup", "mysqld", 0, 0, 0 }; + +static void print_version(void) +{ + msg("%s based on MariaDB server %s %s (%s) \n", + my_progname, MYSQL_SERVER_VERSION, SYSTEM_TYPE, MACHINE_TYPE); +} + +static void usage(void) +{ + puts("Open source backup tool for InnoDB and XtraDB\n\ +\n\ +Copyright (C) 2009-2015 Percona LLC and/or its affiliates.\n\ +Portions Copyright (C) 2000, 2011, MySQL AB & Innobase Oy. All Rights Reserved.\n\ +\n\ +This program is free software; you can redistribute it and/or\n\ +modify it under the terms of the GNU General Public License\n\ +as published by the Free Software Foundation version 2\n\ +of the License.\n\ +\n\ +This program is distributed in the hope that it will be useful,\n\ +but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\ +GNU General Public License for more details.\n\ +\n\ +You can download full text of the license on http://www.gnu.org/licenses/gpl-2.0.txt\n"); + + printf("Usage: [%s [--defaults-file=#] --backup | %s [--defaults-file=#] --prepare] [OPTIONS]\n",my_progname,my_progname); + print_defaults("my", xb_server_default_groups); + my_print_help(xb_client_options); + my_print_help(xb_server_options); + my_print_variables(xb_server_options); + my_print_variables(xb_client_options); +} + +#define ADD_PRINT_PARAM_OPT(value) \ + { \ + print_param_str << opt->name << "=" << value << "\n"; \ + param_set.insert(opt->name); \ + } + +/************************************************************************ +Check if parameter is set in defaults file or via command line argument +@return true if parameter is set. */ +bool +check_if_param_set(const char *param) +{ + return param_set.find(param) != param_set.end(); +} + +my_bool +xb_get_one_option(int optid, + const struct my_option *opt __attribute__((unused)), + char *argument) +{ + switch(optid) { + case 'h': + strmake(mysql_real_data_home,argument, FN_REFLEN - 1); + mysql_data_home= mysql_real_data_home; + + ADD_PRINT_PARAM_OPT(mysql_real_data_home); + break; + + case 't': + + ADD_PRINT_PARAM_OPT(opt_mysql_tmpdir); + break; + + case OPT_INNODB_DATA_HOME_DIR: + + ADD_PRINT_PARAM_OPT(innobase_data_home_dir); + break; + + case OPT_INNODB_DATA_FILE_PATH: + + ADD_PRINT_PARAM_OPT(innobase_data_file_path); + break; + + case OPT_INNODB_LOG_GROUP_HOME_DIR: + + ADD_PRINT_PARAM_OPT(srv_log_group_home_dir); + break; + + case OPT_INNODB_LOG_FILES_IN_GROUP: + case OPT_INNODB_LOG_FILE_SIZE: + break; + + case OPT_INNODB_FLUSH_METHOD: + + ADD_PRINT_PARAM_OPT(innobase_unix_file_flush_method); + break; + + case OPT_INNODB_PAGE_SIZE: + + ADD_PRINT_PARAM_OPT(innobase_page_size); + break; + + case OPT_INNODB_UNDO_DIRECTORY: + + ADD_PRINT_PARAM_OPT(srv_undo_dir); + break; + + case OPT_INNODB_UNDO_TABLESPACES: + + ADD_PRINT_PARAM_OPT(srv_undo_tablespaces); + break; + + case OPT_INNODB_CHECKSUM_ALGORITHM: + + ut_a(srv_checksum_algorithm <= SRV_CHECKSUM_ALGORITHM_STRICT_NONE); + + ADD_PRINT_PARAM_OPT(innodb_checksum_algorithm_names[srv_checksum_algorithm]); + break; + + case OPT_INNODB_BUFFER_POOL_FILENAME: + + ADD_PRINT_PARAM_OPT(innobase_buffer_pool_filename); + break; + + case OPT_XTRA_TARGET_DIR: + strmake(xtrabackup_real_target_dir,argument, sizeof(xtrabackup_real_target_dir)-1); + xtrabackup_target_dir= xtrabackup_real_target_dir; + break; + case OPT_XTRA_STREAM: + if (!strcasecmp(argument, "xbstream")) + xtrabackup_stream_fmt = XB_STREAM_FMT_XBSTREAM; + else + { + msg("Invalid --stream argument: %s\n", argument); + return 1; + } + xtrabackup_stream = TRUE; + break; + case OPT_XTRA_COMPRESS: + if (argument == NULL) + xtrabackup_compress_alg = "quicklz"; + else if (strcasecmp(argument, "quicklz")) + { + msg("Invalid --compress argument: %s\n", argument); + return 1; + } + xtrabackup_compress = TRUE; + break; + case OPT_DECOMPRESS: + opt_decompress = TRUE; + xtrabackup_decrypt_decompress = true; + break; + case (int) OPT_CORE_FILE: + test_flags |= TEST_CORE_ON_SIGNAL; + break; + case OPT_HISTORY: + if (argument) { + opt_history = argument; + } else { + opt_history = ""; + } + break; + case 'p': + if (argument) + { + char *start= argument; + my_free(opt_password); + opt_password= my_strdup(argument, MYF(MY_FAE)); + while (*argument) *argument++= 'x'; // Destroy argument + if (*start) + start[1]=0 ; + } + break; + case OPT_PROTOCOL: + if (argument) + { + opt_protocol= find_type_or_exit(argument, &sql_protocol_typelib, + opt->name); + } + break; +#include "sslopt-case.h" + + case '?': + usage(); + exit(EXIT_SUCCESS); + break; + case 'v': + print_version(); + exit(EXIT_SUCCESS); + break; + default: + break; + } + return 0; +} + +static my_bool +innodb_init_param(void) +{ + srv_is_being_started = TRUE; + /* === some variables from mysqld === */ + memset((G_PTR) &mysql_tmpdir_list, 0, sizeof(mysql_tmpdir_list)); + + if (init_tmpdir(&mysql_tmpdir_list, opt_mysql_tmpdir)) + exit(EXIT_FAILURE); + xtrabackup_tmpdir = my_tmpdir(&mysql_tmpdir_list); + /* dummy for initialize all_charsets[] */ + get_charset_name(0); + + srv_page_size = 0; + srv_page_size_shift = 0; + + if (innobase_page_size != (1LL << 14)) { + int n_shift = (int)get_bit_shift((ulint) innobase_page_size); + + if (n_shift >= 12 && n_shift <= UNIV_PAGE_SIZE_SHIFT_MAX) { + srv_page_size_shift = n_shift; + srv_page_size = 1 << n_shift; + msg("InnoDB: The universal page size of the " + "database is set to %lu.\n", srv_page_size); + } else { + msg("InnoDB: Error: invalid value of " + "innobase_page_size: %lld", innobase_page_size); + exit(EXIT_FAILURE); + } + } else { + srv_page_size_shift = 14; + srv_page_size = (1 << srv_page_size_shift); + } + + /* Check that values don't overflow on 32-bit systems. */ + if (sizeof(ulint) == 4) { + if (xtrabackup_use_memory > UINT_MAX32) { + msg("xtrabackup: use-memory can't be over 4GB" + " on 32-bit systems\n"); + } + + if (innobase_buffer_pool_size > UINT_MAX32) { + msg("xtrabackup: innobase_buffer_pool_size can't be " + "over 4GB on 32-bit systems\n"); + + goto error; + } + } + + static char default_path[2] = { FN_CURLIB, 0 }; + fil_path_to_mysql_datadir = default_path; + + /* Set InnoDB initialization parameters according to the values + read from MySQL .cnf file */ + + if (xtrabackup_backup) { + msg("xtrabackup: using the following InnoDB configuration:\n"); + } else { + msg("xtrabackup: using the following InnoDB configuration " + "for recovery:\n"); + } + + /*--------------- Data files -------------------------*/ + + /* The default dir for data files is the datadir of MySQL */ + + srv_data_home = (xtrabackup_backup && innobase_data_home_dir + ? innobase_data_home_dir : default_path); + msg("xtrabackup: innodb_data_home_dir = %s\n", srv_data_home); + + /* Set default InnoDB data file size to 10 MB and let it be + auto-extending. Thus users can use InnoDB in >= 4.0 without having + to specify any startup options. */ + + if (!innobase_data_file_path) { + innobase_data_file_path = (char*) "ibdata1:10M:autoextend"; + } + msg("xtrabackup: innodb_data_file_path = %s\n", + innobase_data_file_path); + + /* This is the first time univ_page_size is used. + It was initialized to 16k pages before srv_page_size was set */ + univ_page_size.copy_from( + page_size_t(srv_page_size, srv_page_size, false)); + + srv_sys_space.set_space_id(TRX_SYS_SPACE); + srv_sys_space.set_name("innodb_system"); + srv_sys_space.set_path(srv_data_home); + srv_sys_space.set_flags(FSP_FLAGS_PAGE_SSIZE()); + + if (!srv_sys_space.parse_params(innobase_data_file_path, true)) { + goto error; + } + + /* -------------- Log files ---------------------------*/ + + /* The default dir for log files is the datadir of MySQL */ + + if (!(xtrabackup_backup && srv_log_group_home_dir)) { + srv_log_group_home_dir = default_path; + } + if (xtrabackup_prepare && xtrabackup_incremental_dir) { + srv_log_group_home_dir = xtrabackup_incremental_dir; + } + msg("xtrabackup: innodb_log_group_home_dir = %s\n", + srv_log_group_home_dir); + + os_normalize_path(srv_log_group_home_dir); + + if (strchr(srv_log_group_home_dir, ';')) { + + msg("syntax error in innodb_log_group_home_dir, "); + goto error; + } + + srv_adaptive_flushing = FALSE; + srv_file_format = 1; /* Barracuda */ + srv_max_file_format_at_startup = UNIV_FORMAT_MIN; /* on */ + /* --------------------------------------------------*/ + + srv_file_flush_method_str = innobase_unix_file_flush_method; + + srv_log_buffer_size = (ulint) innobase_log_buffer_size; + + /* We set srv_pool_size here in units of 1 kB. InnoDB internally + changes the value so that it becomes the number of database pages. */ + + srv_buf_pool_size = (ulint) xtrabackup_use_memory; + srv_buf_pool_chunk_unit = srv_buf_pool_size; + srv_buf_pool_instances = 1; + + srv_n_file_io_threads = (ulint) innobase_file_io_threads; + srv_n_read_io_threads = (ulint) innobase_read_io_threads; + srv_n_write_io_threads = (ulint) innobase_write_io_threads; + + srv_use_doublewrite_buf = (ibool) innobase_use_doublewrite; + + os_use_large_pages = (ibool) innobase_use_large_pages; + os_large_page_size = (ulint) innobase_large_page_size; + row_rollback_on_timeout = (ibool) innobase_rollback_on_timeout; + + srv_file_per_table = (my_bool) innobase_file_per_table; + + srv_locks_unsafe_for_binlog = (ibool) innobase_locks_unsafe_for_binlog; + + srv_max_n_open_files = (ulint) innobase_open_files; + srv_innodb_status = (ibool) innobase_create_status_file; + + srv_print_verbose_log = 1; + + /* Store the default charset-collation number of this MySQL + installation */ + + /* We cannot treat characterset here for now!! */ + data_mysql_default_charset_coll = (ulint)default_charset_info->number; + + ut_a(DATA_MYSQL_BINARY_CHARSET_COLL == my_charset_bin.number); + + //innobase_commit_concurrency_init_default(); + + /* Since we in this module access directly the fields of a trx + struct, and due to different headers and flags it might happen that + mutex_t has a different size in this module and in InnoDB + modules, we check at run time that the size is the same in + these compilation modules. */ + + /* On 5.5+ srv_use_native_aio is TRUE by default. It is later reset + if it is not supported by the platform in + innobase_start_or_create_for_mysql(). As we don't call it in xtrabackup, + we have to duplicate checks from that function here. */ + +#ifdef _WIN32 + srv_use_native_aio = TRUE; + +#elif defined(LINUX_NATIVE_AIO) + + if (srv_use_native_aio) { + ut_print_timestamp(stderr); + msg(" InnoDB: Using Linux native AIO\n"); + } +#else + /* Currently native AIO is supported only on windows and linux + and that also when the support is compiled in. In all other + cases, we ignore the setting of innodb_use_native_aio. */ + srv_use_native_aio = FALSE; + +#endif + + /* Assign the default value to srv_undo_dir if it's not specified, as + my_getopt does not support default values for string options. We also + ignore the option and override innodb_undo_directory on --prepare, + because separate undo tablespaces are copied to the root backup + directory. */ + + if (!srv_undo_dir || !xtrabackup_backup) { + srv_undo_dir = (char*) "."; + } + + log_checksum_algorithm_ptr = innodb_log_checksums || srv_encrypt_log + ? log_block_calc_checksum_crc32 + : log_block_calc_checksum_none; + + return(FALSE); + +error: + msg("xtrabackup: innodb_init_param(): Error occured.\n"); + return(TRUE); +} + +static bool innodb_init() +{ + dberr_t err = innobase_start_or_create_for_mysql(); + if (err != DB_SUCCESS) { + msg("xtrabackup: innodb_init() returned %d (%s).\n", + err, ut_strerr(err)); + innodb_shutdown(); + return(TRUE); + } + + return(FALSE); +} + +/* ================= common ================= */ + +/*********************************************************************** +Read backup meta info. +@return TRUE on success, FALSE on failure. */ +static +my_bool +xtrabackup_read_metadata(char *filename) +{ + FILE *fp; + my_bool r = TRUE; + int t; + + fp = fopen(filename,"r"); + if(!fp) { + msg("xtrabackup: Error: cannot open %s\n", filename); + return(FALSE); + } + + if (fscanf(fp, "backup_type = %29s\n", metadata_type) + != 1) { + r = FALSE; + goto end; + } + /* Use UINT64PF instead of LSN_PF here, as we have to maintain the file + format. */ + if (fscanf(fp, "from_lsn = " UINT64PF "\n", &metadata_from_lsn) + != 1) { + r = FALSE; + goto end; + } + if (fscanf(fp, "to_lsn = " UINT64PF "\n", &metadata_to_lsn) + != 1) { + r = FALSE; + goto end; + } + if (fscanf(fp, "last_lsn = " UINT64PF "\n", &metadata_last_lsn) + != 1) { + metadata_last_lsn = 0; + } + /* Optional fields */ + + if (fscanf(fp, "recover_binlog_info = %d\n", &t) == 1) { + recover_binlog_info = (t == 1); + } +end: + fclose(fp); + + return(r); +} + +/*********************************************************************** +Print backup meta info to a specified buffer. */ +static +void +xtrabackup_print_metadata(char *buf, size_t buf_len) +{ + /* Use UINT64PF instead of LSN_PF here, as we have to maintain the file + format. */ + snprintf(buf, buf_len, + "backup_type = %s\n" + "from_lsn = " UINT64PF "\n" + "to_lsn = " UINT64PF "\n" + "last_lsn = " UINT64PF "\n" + "recover_binlog_info = %d\n", + metadata_type, + metadata_from_lsn, + metadata_to_lsn, + metadata_last_lsn, + MY_TEST(opt_binlog_info == BINLOG_INFO_LOCKLESS)); +} + +/*********************************************************************** +Stream backup meta info to a specified datasink. +@return TRUE on success, FALSE on failure. */ +static +my_bool +xtrabackup_stream_metadata(ds_ctxt_t *ds_ctxt) +{ + char buf[1024]; + size_t len; + ds_file_t *stream; + MY_STAT mystat; + my_bool rc = TRUE; + + xtrabackup_print_metadata(buf, sizeof(buf)); + + len = strlen(buf); + + mystat.st_size = len; + mystat.st_mtime = my_time(0); + + stream = ds_open(ds_ctxt, XTRABACKUP_METADATA_FILENAME, &mystat); + if (stream == NULL) { + msg("xtrabackup: Error: cannot open output stream " + "for %s\n", XTRABACKUP_METADATA_FILENAME); + return(FALSE); + } + + if (ds_write(stream, buf, len)) { + rc = FALSE; + } + + if (ds_close(stream)) { + rc = FALSE; + } + + return(rc); +} + +/*********************************************************************** +Write backup meta info to a specified file. +@return TRUE on success, FALSE on failure. */ +static +my_bool +xtrabackup_write_metadata(const char *filepath) +{ + char buf[1024]; + size_t len; + FILE *fp; + + xtrabackup_print_metadata(buf, sizeof(buf)); + + len = strlen(buf); + + fp = fopen(filepath, "w"); + if(!fp) { + msg("xtrabackup: Error: cannot open %s\n", filepath); + return(FALSE); + } + if (fwrite(buf, len, 1, fp) < 1) { + fclose(fp); + return(FALSE); + } + + fclose(fp); + + return(TRUE); +} + +/*********************************************************************** +Read meta info for an incremental delta. +@return TRUE on success, FALSE on failure. */ +static my_bool +xb_read_delta_metadata(const char *filepath, xb_delta_info_t *info) +{ + FILE* fp; + char key[51]; + char value[51]; + my_bool r = TRUE; + + /* set defaults */ + ulint page_size = ULINT_UNDEFINED, zip_size = 0; + info->space_id = ULINT_UNDEFINED; + + fp = fopen(filepath, "r"); + if (!fp) { + /* Meta files for incremental deltas are optional */ + return(TRUE); + } + + while (!feof(fp)) { + if (fscanf(fp, "%50s = %50s\n", key, value) == 2) { + if (strcmp(key, "page_size") == 0) { + page_size = strtoul(value, NULL, 10); + } else if (strcmp(key, "zip_size") == 0) { + zip_size = strtoul(value, NULL, 10); + } else if (strcmp(key, "space_id") == 0) { + info->space_id = strtoul(value, NULL, 10); + } + } + } + + fclose(fp); + + if (page_size == ULINT_UNDEFINED) { + msg("xtrabackup: page_size is required in %s\n", filepath); + r = FALSE; + } else { + info->page_size = page_size_t(zip_size ? zip_size : page_size, + page_size, zip_size != 0); + } + + if (info->space_id == ULINT_UNDEFINED) { + msg("xtrabackup: Warning: This backup was taken with XtraBackup 2.0.1 " + "or earlier, some DDL operations between full and incremental " + "backups may be handled incorrectly\n"); + } + + return(r); +} + +/*********************************************************************** +Write meta info for an incremental delta. +@return TRUE on success, FALSE on failure. */ +my_bool +xb_write_delta_metadata(const char *filename, const xb_delta_info_t *info) +{ + ds_file_t *f; + char buf[64]; + my_bool ret; + size_t len; + MY_STAT mystat; + + snprintf(buf, sizeof(buf), + "page_size = %lu\n" + "zip_size = %lu\n" + "space_id = %lu\n", + info->page_size.logical(), + info->page_size.is_compressed() + ? info->page_size.physical() : 0, + info->space_id); + len = strlen(buf); + + mystat.st_size = len; + mystat.st_mtime = my_time(0); + + f = ds_open(ds_meta, filename, &mystat); + if (f == NULL) { + msg("xtrabackup: Error: cannot open output stream for %s\n", + filename); + return(FALSE); + } + + ret = (ds_write(f, buf, len) == 0); + + if (ds_close(f)) { + ret = FALSE; + } + + return(ret); +} + +/* ================= backup ================= */ +void +xtrabackup_io_throttling(void) +{ + if (xtrabackup_backup && xtrabackup_throttle && (io_ticket--) < 0) { + os_event_reset(wait_throttle); + os_event_wait(wait_throttle); + } +} + +static +my_bool regex_list_check_match( + const regex_list_t& list, + const char* name) +{ + regmatch_t tables_regmatch[1]; + for (regex_list_t::const_iterator i = list.begin(), end = list.end(); + i != end; ++i) { + const regex_t& regex = *i; + int regres = regexec(®ex, name, 1, tables_regmatch, 0); + + if (regres != REG_NOMATCH) { + return(TRUE); + } + } + return(FALSE); +} + +static +my_bool +find_filter_in_hashtable( + const char* name, + hash_table_t* table, + xb_filter_entry_t** result +) +{ + xb_filter_entry_t* found = NULL; + HASH_SEARCH(name_hash, table, ut_fold_string(name), + xb_filter_entry_t*, + found, (void) 0, + !strcmp(found->name, name)); + + if (found && result) { + *result = found; + } + return (found != NULL); +} + +/************************************************************************ +Checks if a given table name matches any of specifications given in +regex_list or tables_hash. + +@return TRUE on match or both regex_list and tables_hash are empty.*/ +static my_bool +check_if_table_matches_filters(const char *name, + const regex_list_t& regex_list, + hash_table_t* tables_hash) +{ + if (regex_list.empty() && !tables_hash) { + return(FALSE); + } + + if (regex_list_check_match(regex_list, name)) { + return(TRUE); + } + + if (tables_hash && find_filter_in_hashtable(name, tables_hash, NULL)) { + return(TRUE); + } + + return FALSE; +} + +enum skip_database_check_result { + DATABASE_SKIP, + DATABASE_SKIP_SOME_TABLES, + DATABASE_DONT_SKIP, + DATABASE_DONT_SKIP_UNLESS_EXPLICITLY_EXCLUDED, +}; + +/************************************************************************ +Checks if a database specified by name should be skipped from backup based on +the --databases, --databases_file or --databases_exclude options. + +@return TRUE if entire database should be skipped, + FALSE otherwise. +*/ +static +skip_database_check_result +check_if_skip_database( + const char* name /*!< in: path to the database */ +) +{ + /* There are some filters for databases, check them */ + xb_filter_entry_t* database = NULL; + + if (databases_exclude_hash && + find_filter_in_hashtable(name, databases_exclude_hash, + &database) && + !database->has_tables) { + /* Database is found and there are no tables specified, + skip entire db. */ + return DATABASE_SKIP; + } + + if (databases_include_hash) { + if (!find_filter_in_hashtable(name, databases_include_hash, + &database)) { + /* Database isn't found, skip the database */ + return DATABASE_SKIP; + } else if (database->has_tables) { + return DATABASE_SKIP_SOME_TABLES; + } else { + return DATABASE_DONT_SKIP_UNLESS_EXPLICITLY_EXCLUDED; + } + } + + return DATABASE_DONT_SKIP; +} + +/************************************************************************ +Checks if a database specified by path should be skipped from backup based on +the --databases, --databases_file or --databases_exclude options. + +@return TRUE if the table should be skipped. */ +my_bool +check_if_skip_database_by_path( + const char* path /*!< in: path to the db directory. */ +) +{ + if (databases_include_hash == NULL && + databases_exclude_hash == NULL) { + return(FALSE); + } + + const char* db_name = strrchr(path, OS_PATH_SEPARATOR); + if (db_name == NULL) { + db_name = path; + } else { + ++db_name; + } + + return check_if_skip_database(db_name) == DATABASE_SKIP; +} + +/************************************************************************ +Checks if a table specified as a name in the form "database/name" (InnoDB 5.6) +or "./database/name.ibd" (InnoDB 5.5-) should be skipped from backup based on +the --tables or --tables-file options. + +@return TRUE if the table should be skipped. */ +my_bool +check_if_skip_table( +/******************/ + const char* name) /*!< in: path to the table */ +{ + char buf[FN_REFLEN]; + const char *dbname, *tbname; + const char *ptr; + char *eptr; + + if (regex_exclude_list.empty() && + regex_include_list.empty() && + tables_include_hash == NULL && + tables_exclude_hash == NULL && + databases_include_hash == NULL && + databases_exclude_hash == NULL) { + return(FALSE); + } + + dbname = NULL; + tbname = name; + while ((ptr = strchr(tbname, '/')) != NULL) { + dbname = tbname; + tbname = ptr + 1; + } + + if (dbname == NULL) { + return(FALSE); + } + + strncpy(buf, dbname, FN_REFLEN); + buf[tbname - 1 - dbname] = 0; + + const skip_database_check_result skip_database = + check_if_skip_database(buf); + if (skip_database == DATABASE_SKIP) { + return (TRUE); + } + + buf[FN_REFLEN - 1] = '\0'; + buf[tbname - 1 - dbname] = '.'; + + /* Check if there's a suffix in the table name. If so, truncate it. We + rely on the fact that a dot cannot be a part of a table name (it is + encoded by the server with the @NNNN syntax). */ + if ((eptr = strchr(&buf[tbname - dbname], '.')) != NULL) { + + *eptr = '\0'; + } + + /* For partitioned tables first try to match against the regexp + without truncating the #P#... suffix so we can backup individual + partitions with regexps like '^test[.]t#P#p5' */ + if (check_if_table_matches_filters(buf, regex_exclude_list, + tables_exclude_hash)) { + return(TRUE); + } + if (check_if_table_matches_filters(buf, regex_include_list, + tables_include_hash)) { + return(FALSE); + } + if ((eptr = strstr(buf, "#P#")) != NULL) { + *eptr = 0; + + if (check_if_table_matches_filters(buf, regex_exclude_list, + tables_exclude_hash)) { + return (TRUE); + } + if (check_if_table_matches_filters(buf, regex_include_list, + tables_include_hash)) { + return(FALSE); + } + } + + if (skip_database == DATABASE_DONT_SKIP_UNLESS_EXPLICITLY_EXCLUDED) { + /* Database is in include-list, and qualified name wasn't + found in any of exclusion filters.*/ + return (FALSE); + } + + if (skip_database == DATABASE_SKIP_SOME_TABLES || + !regex_include_list.empty() || + tables_include_hash) { + + /* Include lists are present, but qualified name + failed to match any.*/ + return(TRUE); + } + + return(FALSE); +} + +/** @return the tablespace flags from a given data file +@retval ULINT_UNDEFINED if the file is not readable */ +ulint xb_get_space_flags(pfs_os_file_t file) +{ + byte *buf; + byte *page; + ulint flags; + + buf = static_cast(malloc(2 * UNIV_PAGE_SIZE)); + page = static_cast(ut_align(buf, UNIV_PAGE_SIZE)); + + if (os_file_read(IORequestRead, file, page, 0, UNIV_PAGE_SIZE)) { + flags = fsp_header_get_flags(page); + } else { + flags = ULINT_UNDEFINED; + } + + free(buf); + + return(flags); +} + +const char* +xb_get_copy_action(const char *dflt) +{ + const char *action; + + if (xtrabackup_stream) { + if (xtrabackup_compress) { + action = "Compressing and streaming"; + } else { + action = "Streaming"; + } + } else { + if (xtrabackup_compress) { + action = "Compressing"; + } else { + action = dflt; + } + } + + return(action); +} + +/* TODO: We may tune the behavior (e.g. by fil_aio)*/ + +static +my_bool +xtrabackup_copy_datafile(fil_node_t* node, uint thread_n) +{ + char dst_name[FN_REFLEN]; + ds_file_t *dstfile = NULL; + xb_fil_cur_t cursor; + xb_fil_cur_result_t res; + xb_write_filt_t *write_filter = NULL; + xb_write_filt_ctxt_t write_filt_ctxt; + const char *action; + xb_read_filt_t *read_filter; + my_bool rc = FALSE; + + /* Get the name and the path for the tablespace. node->name always + contains the path (which may be absolute for remote tablespaces in + 5.6+). space->name contains the tablespace name in the form + "./database/table.ibd" (in 5.5-) or "database/table" (in 5.6+). For a + multi-node shared tablespace, space->name contains the name of the first + node, but that's irrelevant, since we only need node_name to match them + against filters, and the shared tablespace is always copied regardless + of the filters value. */ + + const char* const node_name = node->space->name; + const char* const node_path = node->name; + + if (fil_is_user_tablespace_id(node->space->id) + && check_if_skip_table(node_name)) { + msg("[%02u] Skipping %s.\n", thread_n, node_name); + return(FALSE); + } + + if (opt_lock_ddl_per_table) { + mdl_lock_table(node->space->id); + } + + if (!changed_page_bitmap) { + read_filter = &rf_pass_through; + } + else { + read_filter = &rf_bitmap; + } + res = xb_fil_cur_open(&cursor, read_filter, node, thread_n); + if (res == XB_FIL_CUR_SKIP) { + goto skip; + } else if (res == XB_FIL_CUR_ERROR) { + goto error; + } + + strncpy(dst_name, cursor.rel_path, sizeof(dst_name)); + + /* Setup the page write filter */ + if (xtrabackup_incremental) { + write_filter = &wf_incremental; + } else { + write_filter = &wf_write_through; + } + + memset(&write_filt_ctxt, 0, sizeof(xb_write_filt_ctxt_t)); + ut_a(write_filter->process != NULL); + + if (write_filter->init != NULL && + !write_filter->init(&write_filt_ctxt, dst_name, &cursor)) { + msg("[%02u] xtrabackup: error: " + "failed to initialize page write filter.\n", thread_n); + goto error; + } + + dstfile = ds_open(ds_data, dst_name, &cursor.statinfo); + if (dstfile == NULL) { + msg("[%02u] xtrabackup: error: " + "cannot open the destination stream for %s\n", + thread_n, dst_name); + goto error; + } + + action = xb_get_copy_action(); + + if (xtrabackup_stream) { + msg_ts("[%02u] %s %s\n", thread_n, action, node_path); + } else { + msg_ts("[%02u] %s %s to %s\n", thread_n, action, + node_path, dstfile->path); + } + + /* The main copy loop */ + while ((res = xb_fil_cur_read(&cursor)) == XB_FIL_CUR_SUCCESS) { + if (!write_filter->process(&write_filt_ctxt, dstfile)) { + goto error; + } + } + + if (res == XB_FIL_CUR_ERROR) { + goto error; + } + + if (write_filter->finalize + && !write_filter->finalize(&write_filt_ctxt, dstfile)) { + goto error; + } + + /* close */ + msg_ts("[%02u] ...done\n", thread_n); + xb_fil_cur_close(&cursor); + if (ds_close(dstfile)) { + rc = TRUE; + } + if (write_filter && write_filter->deinit) { + write_filter->deinit(&write_filt_ctxt); + } + return(rc); + +error: + xb_fil_cur_close(&cursor); + if (dstfile != NULL) { + ds_close(dstfile); + } + if (write_filter && write_filter->deinit) { + write_filter->deinit(&write_filt_ctxt);; + } + msg("[%02u] xtrabackup: Error: " + "xtrabackup_copy_datafile() failed.\n", thread_n); + return(TRUE); /*ERROR*/ + +skip: + + if (dstfile != NULL) { + ds_close(dstfile); + } + if (write_filter && write_filter->deinit) { + write_filter->deinit(&write_filt_ctxt); + } + msg("[%02u] xtrabackup: Warning: We assume the " + "table was dropped during xtrabackup execution " + "and ignore the file.\n", thread_n); + msg("[%02u] xtrabackup: Warning: skipping tablespace %s.\n", + thread_n, node_name); + return(FALSE); +} + +/** How to copy a redo log segment in backup */ +enum copy_logfile { + /** Initial copying: copy at least one block */ + COPY_FIRST, + /** Tracking while copying data files */ + COPY_ONLINE, + /** Final copying: copy until the end of the log */ + COPY_LAST +}; + +/** Copy redo log blocks to the data sink. +@param[in] copy how to copy the log +@param[in] start_lsn buffer start LSN +@param[in] end_lsn buffer end LSN +@return last scanned LSN (equals to last copied LSN if copy=COPY_LAST) +@retval 0 on failure */ +static +lsn_t +xtrabackup_copy_log(copy_logfile copy, lsn_t start_lsn, lsn_t end_lsn) +{ + lsn_t scanned_lsn = start_lsn; + + const byte* log_block = log_sys->buf; + + for (ulint scanned_checkpoint = 0; + scanned_lsn < end_lsn; + log_block += OS_FILE_LOG_BLOCK_SIZE) { + ulint checkpoint = log_block_get_checkpoint_no(log_block); + + if (scanned_checkpoint > checkpoint + && scanned_checkpoint - checkpoint >= 0x80000000UL) { + /* Garbage from a log buffer flush which was made + before the most recent database recovery */ + break; + } + + scanned_checkpoint = checkpoint; + ulint data_len = log_block_get_data_len(log_block); + + if (data_len == OS_FILE_LOG_BLOCK_SIZE) { + /* We got a full log block. */ + scanned_lsn += data_len; + } else if (data_len + >= OS_FILE_LOG_BLOCK_SIZE - LOG_BLOCK_TRL_SIZE + || data_len <= LOG_BLOCK_HDR_SIZE) { + /* We got a garbage block (abrupt end of the log). */ + break; + } else { + /* We got a partial block (abrupt end of the log). */ + scanned_lsn += data_len; + break; + } + } + + log_sys->log.scanned_lsn = scanned_lsn; + + end_lsn = copy == COPY_LAST + ? ut_uint64_align_up(scanned_lsn, OS_FILE_LOG_BLOCK_SIZE) + : scanned_lsn & ~lsn_t(OS_FILE_LOG_BLOCK_SIZE - 1); + + if (ulint write_size = ulint(end_lsn - start_lsn)) { + if (srv_encrypt_log) { + log_crypt(log_sys->buf, start_lsn, write_size); + } + + if (ds_write(dst_log_file, log_sys->buf, write_size)) { + msg("xtrabackup: Error: " + "write to logfile failed\n"); + return(0); + } + } + + return(scanned_lsn); +} + +/** Copy redo log until the current end of the log is reached +@param copy how to copy the log +@return whether the operation failed */ +static bool +xtrabackup_copy_logfile(copy_logfile copy) +{ + ut_a(dst_log_file != NULL); + ut_ad(recv_sys != NULL); + + lsn_t start_lsn; + lsn_t end_lsn; + + start_lsn = ut_uint64_align_down(log_copy_scanned_lsn, + OS_FILE_LOG_BLOCK_SIZE); + + /* When copying the first or last part of the log, retry a few + times to ensure that all log up to the last checkpoint will be + read. */ + do { + end_lsn = start_lsn + RECV_SCAN_SIZE; + + xtrabackup_io_throttling(); + + log_mutex_enter(); + + lsn_t lsn = log_group_read_log_seg(log_sys->buf, &log_sys->log, + start_lsn, end_lsn); + + start_lsn = xtrabackup_copy_log(copy, start_lsn, lsn); + + log_mutex_exit(); + + if (!start_lsn) { + ds_close(dst_log_file); + dst_log_file = NULL; + msg("xtrabackup: Error: xtrabackup_copy_logfile()" + " failed.\n"); + return(true); + } + } while (start_lsn == end_lsn); + + ut_ad(start_lsn == log_sys->log.scanned_lsn); + + msg_ts(">> log scanned up to (" LSN_PF ")\n", start_lsn); + + /* update global variable*/ + log_copy_scanned_lsn = start_lsn; + + debug_sync_point("xtrabackup_copy_logfile_pause"); + return(false); +} + +static os_thread_ret_t log_copying_thread(void*) +{ + /* + Initialize mysys thread-specific memory so we can + use mysys functions in this thread. + */ + my_thread_init(); + + do { + os_event_reset(log_copying_stop); + os_event_wait_time_low(log_copying_stop, + xtrabackup_log_copy_interval * 1000ULL, + 0); + } while (log_copying && xtrabackup_copy_logfile(COPY_ONLINE)); + + log_copying_running = false; + my_thread_end(); + os_thread_exit(NULL); + + return(0); +} + +/* io throttle watching (rough) */ +static os_thread_ret_t io_watching_thread(void*) +{ + /* currently, for --backup only */ + ut_a(xtrabackup_backup); + + while (log_copying) { + os_thread_sleep(1000000); /*1 sec*/ + io_ticket = xtrabackup_throttle; + os_event_set(wait_throttle); + } + + /* stop io throttle */ + xtrabackup_throttle = 0; + os_event_set(wait_throttle); + + io_watching_thread_running = false; + + os_thread_exit(NULL); + + return(0); +} + +/************************************************************************** +Datafiles copying thread.*/ +static +os_thread_ret_t +data_copy_thread_func( +/*==================*/ + void *arg) /* thread context */ +{ + data_thread_ctxt_t *ctxt = (data_thread_ctxt_t *) arg; + uint num = ctxt->num; + fil_node_t* node; + + /* + Initialize mysys thread-specific memory so we can + use mysys functions in this thread. + */ + my_thread_init(); + + debug_sync_point("data_copy_thread_func"); + + while ((node = datafiles_iter_next(ctxt->it)) != NULL) { + + /* copy the datafile */ + if(xtrabackup_copy_datafile(node, num)) { + msg("[%02u] xtrabackup: Error: " + "failed to copy datafile.\n", num); + exit(EXIT_FAILURE); + } + } + + pthread_mutex_lock(&ctxt->count_mutex); + (*ctxt->count)--; + pthread_mutex_unlock(&ctxt->count_mutex); + + my_thread_end(); + os_thread_exit(NULL); + OS_THREAD_DUMMY_RETURN; +} + +/************************************************************************ +Initialize the appropriate datasink(s). Both local backups and streaming in the +'xbstream' format allow parallel writes so we can write directly. + +Otherwise (i.e. when streaming in the 'tar' format) we need 2 separate datasinks +for the data stream (and don't allow parallel data copying) and for metainfo +files (including ib_logfile0). The second datasink writes to temporary +files first, and then streams them in a serialized way when closed. */ +static void +xtrabackup_init_datasinks(void) +{ + /* Start building out the pipelines from the terminus back */ + if (xtrabackup_stream) { + /* All streaming goes to stdout */ + ds_data = ds_meta = ds_redo = ds_create(xtrabackup_target_dir, + DS_TYPE_STDOUT); + } else { + /* Local filesystem */ + ds_data = ds_meta = ds_redo = ds_create(xtrabackup_target_dir, + DS_TYPE_LOCAL); + } + + /* Track it for destruction */ + xtrabackup_add_datasink(ds_data); + + /* Stream formatting */ + if (xtrabackup_stream) { + ds_ctxt_t *ds; + + ut_a(xtrabackup_stream_fmt == XB_STREAM_FMT_XBSTREAM); + ds = ds_create(xtrabackup_target_dir, DS_TYPE_XBSTREAM); + + xtrabackup_add_datasink(ds); + + ds_set_pipe(ds, ds_data); + ds_data = ds; + + + ds_redo = ds_meta = ds_data; + } + + /* Compression for ds_data and ds_redo */ + if (xtrabackup_compress) { + ds_ctxt_t *ds; + + /* Use a 1 MB buffer for compressed output stream */ + ds = ds_create(xtrabackup_target_dir, DS_TYPE_BUFFER); + ds_buffer_set_size(ds, 1024 * 1024); + xtrabackup_add_datasink(ds); + ds_set_pipe(ds, ds_data); + if (ds_data != ds_redo) { + ds_data = ds; + ds = ds_create(xtrabackup_target_dir, DS_TYPE_BUFFER); + ds_buffer_set_size(ds, 1024 * 1024); + xtrabackup_add_datasink(ds); + ds_set_pipe(ds, ds_redo); + ds_redo = ds; + } else { + ds_redo = ds_data = ds; + } + + ds = ds_create(xtrabackup_target_dir, DS_TYPE_COMPRESS); + xtrabackup_add_datasink(ds); + ds_set_pipe(ds, ds_data); + if (ds_data != ds_redo) { + ds_data = ds; + ds = ds_create(xtrabackup_target_dir, DS_TYPE_COMPRESS); + xtrabackup_add_datasink(ds); + ds_set_pipe(ds, ds_redo); + ds_redo = ds; + } else { + ds_redo = ds_data = ds; + } + } +} + +/************************************************************************ +Destroy datasinks. + +Destruction is done in the specific order to not violate their order in the +pipeline so that each datasink is able to flush data down the pipeline. */ +static void xtrabackup_destroy_datasinks(void) +{ + for (uint i = actual_datasinks; i > 0; i--) { + ds_destroy(datasinks[i-1]); + datasinks[i-1] = NULL; + } + ds_data = NULL; + ds_meta = NULL; + ds_redo = NULL; +} + +#define SRV_MAX_N_PENDING_SYNC_IOS 100 + +/** Initialize the tablespace cache subsystem. */ +static +void +xb_fil_io_init() +{ + fil_init(srv_file_per_table ? 50000 : 5000, LONG_MAX); + fsp_init(); +} + +static +Datafile* +xb_new_datafile(const char *name, bool is_remote) +{ + if (is_remote) { + RemoteDatafile *remote_file = new RemoteDatafile(); + remote_file->set_name(name); + return(remote_file); + } else { + Datafile *file = new Datafile(); + file->set_name(name); + file->make_filepath(".", name, IBD); + return(file); + } +} + + +static +void +xb_load_single_table_tablespace( + const char *dirname, + const char *filname, + bool is_remote) +{ + ut_ad(srv_operation == SRV_OPERATION_BACKUP + || srv_operation == SRV_OPERATION_RESTORE_DELTA); + /* Ignore .isl files on XtraBackup recovery. All tablespaces must be + local. */ + if (is_remote && srv_operation == SRV_OPERATION_RESTORE_DELTA) { + return; + } + if (check_if_skip_table(filname)) { + return; + } + + /* The name ends in .ibd or .isl; + try opening the file */ + char* name; + size_t dirlen = dirname == NULL ? 0 : strlen(dirname); + size_t namelen = strlen(filname); + ulint pathlen = dirname == NULL ? namelen + 1: dirlen + namelen + 2; + lsn_t flush_lsn; + dberr_t err; + fil_space_t *space; + + name = static_cast(ut_malloc_nokey(pathlen)); + + if (dirname != NULL) { + ut_snprintf(name, pathlen, "%s/%s", dirname, filname); + name[pathlen - 5] = 0; + } else { + ut_snprintf(name, pathlen, "%s", filname); + name[pathlen - 5] = 0; + } + + Datafile *file = xb_new_datafile(name, is_remote); + + if (file->open_read_only(true) != DB_SUCCESS) { + ut_free(name); + exit(EXIT_FAILURE); + } + + err = file->validate_first_page(&flush_lsn); + + if (err == DB_SUCCESS && file->space_id() != SRV_TMP_SPACE_ID) { + os_offset_t node_size = os_file_get_size(file->handle()); + os_offset_t n_pages; + + ut_a(node_size != (os_offset_t) -1); + + n_pages = node_size / page_size_t(file->flags()).physical(); + + space = fil_space_create( + name, file->space_id(), file->flags(), + FIL_TYPE_TABLESPACE, NULL/* TODO: crypt_data */); + + ut_a(space != NULL); + + if (!fil_node_create(file->filepath(), ulint(n_pages), space, + false, false)) { + ut_error; + } + + /* by opening the tablespace we forcing node and space objects + in the cache to be populated with fields from space header */ + fil_space_open(space->name); + + if (srv_operation == SRV_OPERATION_RESTORE_DELTA + || xb_close_files) { + fil_space_close(space->name); + } + } + + ut_free(name); + + delete file; + + if (err != DB_SUCCESS && err != DB_CORRUPTION && xtrabackup_backup) { + /* allow corrupted first page for xtrabackup, it could be just + zero-filled page, which we restore from redo log later */ + exit(EXIT_FAILURE); + } +} + +/** Scan the database directories under the MySQL datadir, looking for +.ibd files and determining the space id in each of them. +@return DB_SUCCESS or error number */ + +static dberr_t enumerate_ibd_files(process_single_tablespace_func_t callback) +{ + int ret; + char* dbpath = NULL; + ulint dbpath_len = 100; + os_file_dir_t dir; + os_file_dir_t dbdir; + os_file_stat_t dbinfo; + os_file_stat_t fileinfo; + dberr_t err = DB_SUCCESS; + size_t len; + + /* The datadir of MySQL is always the default directory of mysqld */ + + dir = os_file_opendir(fil_path_to_mysql_datadir, true); + + if (dir == NULL) { + + return(DB_ERROR); + } + + dbpath = static_cast(ut_malloc_nokey(dbpath_len)); + + /* Scan all directories under the datadir. They are the database + directories of MySQL. */ + + ret = fil_file_readdir_next_file(&err, fil_path_to_mysql_datadir, dir, + &dbinfo); + while (ret == 0) { + + /* General tablespaces are always at the first level of the + data home dir */ + if (dbinfo.type == OS_FILE_TYPE_FILE) { + bool is_isl = ends_with(dbinfo.name, ".isl"); + bool is_ibd = !is_isl && ends_with(dbinfo.name,".ibd"); + + if (is_isl || is_ibd) { + (*callback)(NULL, dbinfo.name, is_isl); + } + } + + if (dbinfo.type == OS_FILE_TYPE_FILE + || dbinfo.type == OS_FILE_TYPE_UNKNOWN) { + + goto next_datadir_item; + } + + /* We found a symlink or a directory; try opening it to see + if a symlink is a directory */ + + len = strlen(fil_path_to_mysql_datadir) + + strlen (dbinfo.name) + 2; + if (len > dbpath_len) { + dbpath_len = len; + + if (dbpath) { + ut_free(dbpath); + } + + dbpath = static_cast(ut_malloc_nokey(dbpath_len)); + } + ut_snprintf(dbpath, dbpath_len, + "%s/%s", fil_path_to_mysql_datadir, dbinfo.name); + os_normalize_path(dbpath); + + if (check_if_skip_database_by_path(dbpath)) { + fprintf(stderr, "Skipping db: %s\n", dbpath); + goto next_datadir_item; + } + + /* We want wrong directory permissions to be a fatal error for + XtraBackup. */ + dbdir = os_file_opendir(dbpath, true); + + if (dbdir != NULL) { + + /* We found a database directory; loop through it, + looking for possible .ibd files in it */ + + for (ret = fil_file_readdir_next_file(&err, dbpath, + dbdir, + &fileinfo); + ret == 0; + ret = fil_file_readdir_next_file(&err, dbpath, + dbdir, + &fileinfo)) { + if (fileinfo.type == OS_FILE_TYPE_DIR) { + continue; + } + + /* We found a symlink or a file */ + if (strlen(fileinfo.name) > 4) { + bool is_isl= false; + if (ends_with(fileinfo.name, ".ibd") || ((is_isl = ends_with(fileinfo.name, ".ibd")))) + (*callback)(dbinfo.name, fileinfo.name, is_isl); + } + } + + if (0 != os_file_closedir(dbdir)) { + fprintf(stderr, "InnoDB: Warning: could not" + " close database directory %s\n", + dbpath); + + err = DB_ERROR; + } + + } else { + + err = DB_ERROR; + break; + + } + +next_datadir_item: + ret = fil_file_readdir_next_file(&err, + fil_path_to_mysql_datadir, + dir, &dbinfo); + } + + ut_free(dbpath); + + if (0 != os_file_closedir(dir)) { + fprintf(stderr, + "InnoDB: Error: could not close MySQL datadir\n"); + + return(DB_ERROR); + } + + return(err); +} + +/**************************************************************************** +Populates the tablespace memory cache by scanning for and opening data files. +@returns DB_SUCCESS or error code.*/ +static +dberr_t +xb_load_tablespaces() +{ + bool create_new_db; + dberr_t err; + ulint sum_of_new_sizes; + lsn_t flush_lsn; + + ut_ad(srv_operation == SRV_OPERATION_BACKUP + || srv_operation == SRV_OPERATION_RESTORE_DELTA); + + err = srv_sys_space.check_file_spec(&create_new_db, 0); + + /* create_new_db must not be true. */ + if (err != DB_SUCCESS || create_new_db) { + msg("xtrabackup: could not find data files at the " + "specified datadir\n"); + return(DB_ERROR); + } + + err = srv_sys_space.open_or_create(false, false, &sum_of_new_sizes, + &flush_lsn); + + if (err != DB_SUCCESS) { + msg("xtrabackup: Could not open or create data files.\n" + "xtrabackup: If you tried to add new data files, and it " + "failed here,\n" + "xtrabackup: you should now edit innodb_data_file_path in " + "my.cnf back\n" + "xtrabackup: to what it was, and remove the new ibdata " + "files InnoDB created\n" + "xtrabackup: in this failed attempt. InnoDB only wrote " + "those files full of\n" + "xtrabackup: zeros, but did not yet use them in any way. " + "But be careful: do not\n" + "xtrabackup: remove old data files which contain your " + "precious data!\n"); + return(err); + } + + /* Add separate undo tablespaces to fil_system */ + + err = srv_undo_tablespaces_init(false); + + if (err != DB_SUCCESS) { + return(err); + } + + /* It is important to call xb_load_single_table_tablespaces() after + srv_undo_tablespaces_init(), because fil_is_user_tablespace_id() * + relies on srv_undo_tablespaces_open to be properly initialized */ + + msg("xtrabackup: Generating a list of tablespaces\n"); + + err = enumerate_ibd_files(xb_load_single_table_tablespace); + if (err != DB_SUCCESS) { + return(err); + } + + debug_sync_point("xtrabackup_load_tablespaces_pause"); + + return(DB_SUCCESS); +} + +/************************************************************************ +Initialize the tablespace memory cache and populate it by scanning for and +opening data files. +@returns DB_SUCCESS or error code.*/ +static +dberr_t +xb_data_files_init() +{ + xb_fil_io_init(); + + return(xb_load_tablespaces()); +} + +/************************************************************************ +Destroy the tablespace memory cache. */ +static +void +xb_data_files_close() +{ + ut_ad(!os_thread_count); + fil_close_all_files(); + if (buf_dblwr) { + buf_dblwr_free(); + } +} + +/*********************************************************************** +Allocate and initialize the entry for databases and tables filtering +hash tables. If memory allocation is not successful, terminate program. +@return pointer to the created entry. */ +static +xb_filter_entry_t * +xb_new_filter_entry( +/*================*/ + const char* name) /*!< in: name of table/database */ +{ + xb_filter_entry_t *entry; + ulint namelen = strlen(name); + + ut_a(namelen <= NAME_LEN * 2 + 1); + + entry = static_cast + (malloc(sizeof(xb_filter_entry_t) + namelen + 1)); + memset(entry, '\0', sizeof(xb_filter_entry_t) + namelen + 1); + entry->name = ((char*)entry) + sizeof(xb_filter_entry_t); + strcpy(entry->name, name); + entry->has_tables = FALSE; + + return entry; +} + +/*********************************************************************** +Add entry to hash table. If hash table is NULL, allocate and initialize +new hash table */ +static +xb_filter_entry_t* +xb_add_filter( +/*========================*/ + const char* name, /*!< in: name of table/database */ + hash_table_t** hash) /*!< in/out: hash to insert into */ +{ + xb_filter_entry_t* entry; + + entry = xb_new_filter_entry(name); + + if (UNIV_UNLIKELY(*hash == NULL)) { + *hash = hash_create(1000); + } + HASH_INSERT(xb_filter_entry_t, + name_hash, *hash, + ut_fold_string(entry->name), + entry); + + return entry; +} + +/*********************************************************************** +Validate name of table or database. If name is invalid, program will +be finished with error code */ +static +void +xb_validate_name( +/*=============*/ + const char* name, /*!< in: name */ + size_t len) /*!< in: length of name */ +{ + const char* p; + + /* perform only basic validation. validate length and + path symbols */ + if (len > NAME_LEN) { + msg("xtrabackup: name `%s` is too long.\n", name); + exit(EXIT_FAILURE); + } + p = strpbrk(name, "/\\~"); + if (p && p - name < NAME_LEN) { + msg("xtrabackup: name `%s` is not valid.\n", name); + exit(EXIT_FAILURE); + } +} + +/*********************************************************************** +Register new filter entry which can be either database +or table name. */ +static +void +xb_register_filter_entry( +/*=====================*/ + const char* name, /*!< in: name */ + hash_table_t** databases_hash, + hash_table_t** tables_hash + ) +{ + const char* p; + size_t namelen; + xb_filter_entry_t* db_entry = NULL; + + namelen = strlen(name); + if ((p = strchr(name, '.')) != NULL) { + char dbname[NAME_LEN + 1]; + + xb_validate_name(name, p - name); + xb_validate_name(p + 1, namelen - (p - name)); + + strncpy(dbname, name, p - name); + dbname[p - name] = 0; + + if (*databases_hash) { + HASH_SEARCH(name_hash, (*databases_hash), + ut_fold_string(dbname), + xb_filter_entry_t*, + db_entry, (void) 0, + !strcmp(db_entry->name, dbname)); + } + if (!db_entry) { + db_entry = xb_add_filter(dbname, databases_hash); + } + db_entry->has_tables = TRUE; + xb_add_filter(name, tables_hash); + } else { + xb_validate_name(name, namelen); + + xb_add_filter(name, databases_hash); + } +} + +static +void +xb_register_include_filter_entry( + const char* name +) +{ + xb_register_filter_entry(name, &databases_include_hash, + &tables_include_hash); +} + +static +void +xb_register_exclude_filter_entry( + const char* name +) +{ + xb_register_filter_entry(name, &databases_exclude_hash, + &tables_exclude_hash); +} + +/*********************************************************************** +Register new table for the filter. */ +static +void +xb_register_table( +/*==============*/ + const char* name) /*!< in: name of table */ +{ + if (strchr(name, '.') == NULL) { + msg("xtrabackup: `%s` is not fully qualified name.\n", name); + exit(EXIT_FAILURE); + } + + xb_register_include_filter_entry(name); +} + +static +void +xb_add_regex_to_list( + const char* regex, /*!< in: regex */ + const char* error_context, /*!< in: context to error message */ + regex_list_t* list) /*! in: list to put new regex to */ +{ + char errbuf[100]; + int ret; + + regex_t compiled_regex; + ret = regcomp(&compiled_regex, regex, REG_EXTENDED); + + if (ret != 0) { + regerror(ret, &compiled_regex, errbuf, sizeof(errbuf)); + msg("xtrabackup: error: %s regcomp(%s): %s\n", + error_context, regex, errbuf); + exit(EXIT_FAILURE); + } + + list->push_back(compiled_regex); +} + +/*********************************************************************** +Register new regex for the include filter. */ +static +void +xb_register_include_regex( +/*==============*/ + const char* regex) /*!< in: regex */ +{ + xb_add_regex_to_list(regex, "tables", ®ex_include_list); +} + +/*********************************************************************** +Register new regex for the exclude filter. */ +static +void +xb_register_exclude_regex( +/*==============*/ + const char* regex) /*!< in: regex */ +{ + xb_add_regex_to_list(regex, "tables-exclude", ®ex_exclude_list); +} + +typedef void (*insert_entry_func_t)(const char*); + +/*********************************************************************** +Scan string and load filter entries from it. */ +static +void +xb_load_list_string( +/*================*/ + char* list, /*!< in: string representing a list */ + const char* delimiters, /*!< in: delimiters of entries */ + insert_entry_func_t ins) /*!< in: callback to add entry */ +{ + char* p; + char* saveptr; + + p = strtok_r(list, delimiters, &saveptr); + while (p) { + + ins(p); + + p = strtok_r(NULL, delimiters, &saveptr); + } +} + +/*********************************************************************** +Scan file and load filter entries from it. */ +static +void +xb_load_list_file( +/*==============*/ + const char* filename, /*!< in: name of file */ + insert_entry_func_t ins) /*!< in: callback to add entry */ +{ + char name_buf[NAME_LEN*2+2]; + FILE* fp; + + /* read and store the filenames */ + fp = fopen(filename, "r"); + if (!fp) { + msg("xtrabackup: cannot open %s\n", + filename); + exit(EXIT_FAILURE); + } + while (fgets(name_buf, sizeof(name_buf), fp) != NULL) { + char* p = strchr(name_buf, '\n'); + if (p) { + *p = '\0'; + } else { + msg("xtrabackup: `%s...` name is too long", name_buf); + exit(EXIT_FAILURE); + } + + ins(name_buf); + } + + fclose(fp); +} + + +static +void +xb_filters_init() +{ + if (xtrabackup_databases) { + xb_load_list_string(xtrabackup_databases, " \t", + xb_register_include_filter_entry); + } + + if (xtrabackup_databases_file) { + xb_load_list_file(xtrabackup_databases_file, + xb_register_include_filter_entry); + } + + if (xtrabackup_databases_exclude) { + xb_load_list_string(xtrabackup_databases_exclude, " \t", + xb_register_exclude_filter_entry); + } + + if (xtrabackup_tables) { + xb_load_list_string(xtrabackup_tables, ",", + xb_register_include_regex); + } + + if (xtrabackup_tables_file) { + xb_load_list_file(xtrabackup_tables_file, xb_register_table); + } + + if (xtrabackup_tables_exclude) { + xb_load_list_string(xtrabackup_tables_exclude, ",", + xb_register_exclude_regex); + } +} + +static +void +xb_filter_hash_free(hash_table_t* hash) +{ + ulint i; + + /* free the hash elements */ + for (i = 0; i < hash_get_n_cells(hash); i++) { + xb_filter_entry_t* table; + + table = static_cast + (HASH_GET_FIRST(hash, i)); + + while (table) { + xb_filter_entry_t* prev_table = table; + + table = static_cast + (HASH_GET_NEXT(name_hash, prev_table)); + + HASH_DELETE(xb_filter_entry_t, name_hash, hash, + ut_fold_string(prev_table->name), prev_table); + free(prev_table); + } + } + + /* free hash */ + hash_table_free(hash); +} + +static void xb_regex_list_free(regex_list_t* list) +{ + while (list->size() > 0) { + xb_regfree(&list->front()); + list->pop_front(); + } +} + +/************************************************************************ +Destroy table filters for partial backup. */ +static +void +xb_filters_free() +{ + xb_regex_list_free(®ex_include_list); + xb_regex_list_free(®ex_exclude_list); + + if (tables_include_hash) { + xb_filter_hash_free(tables_include_hash); + } + + if (tables_exclude_hash) { + xb_filter_hash_free(tables_exclude_hash); + } + + if (databases_include_hash) { + xb_filter_hash_free(databases_include_hash); + } + + if (databases_exclude_hash) { + xb_filter_hash_free(databases_exclude_hash); + } +} + +/*********************************************************************//** +Creates or opens the log files and closes them. +@return DB_SUCCESS or error code */ +static +ulint +open_or_create_log_file( +/*====================*/ + fil_space_t* space, + ibool* log_file_created, /*!< out: TRUE if new log file + created */ + ulint i) /*!< in: log file number in group */ +{ + char name[10000]; + ulint dirnamelen; + + *log_file_created = FALSE; + + os_normalize_path(srv_log_group_home_dir); + + dirnamelen = strlen(srv_log_group_home_dir); + ut_a(dirnamelen < (sizeof name) - 10 - sizeof "ib_logfile"); + memcpy(name, srv_log_group_home_dir, dirnamelen); + + /* Add a path separator if needed. */ + if (dirnamelen && name[dirnamelen - 1] != OS_PATH_SEPARATOR) { + name[dirnamelen++] = OS_PATH_SEPARATOR; + } + + sprintf(name + dirnamelen, "%s%lu", "ib_logfile", (ulong) i); + + ut_a(fil_validate()); + + ut_a(fil_node_create(name, ulint(srv_log_file_size >> srv_page_size_shift), + space, false, false)); + + return(DB_SUCCESS); +} + +/*********************************************************************//** +Normalizes init parameter values to use units we use inside InnoDB. +@return DB_SUCCESS or error code */ +static +void +xb_normalize_init_values(void) +/*==========================*/ +{ + srv_sys_space.normalize(); + srv_log_buffer_size /= UNIV_PAGE_SIZE; + srv_lock_table_size = 5 * (srv_buf_pool_size / UNIV_PAGE_SIZE); +} + +/*********************************************************************** +Set the open files limit. Based on set_max_open_files(). + +@return the resulting open files limit. May be less or more than the requested +value. */ +static uint +xb_set_max_open_files( +/*==================*/ + uint max_file_limit) /*!= max_file_limit) { + + max_file_limit = rlimit.rlim_cur; + goto end; + } + + rlimit.rlim_cur = rlimit.rlim_max = max_file_limit; + + if (setrlimit(RLIMIT_NOFILE, &rlimit)) { + + max_file_limit = old_cur; /* Use original value */ + } else { + + rlimit.rlim_cur = 0; /* Safety if next call fails */ + + (void) getrlimit(RLIMIT_NOFILE, &rlimit); + + if (rlimit.rlim_cur) { + + /* If call didn't fail */ + max_file_limit = (uint) rlimit.rlim_cur; + } + } + +end: + return(max_file_limit); +#else + return(0); +#endif +} + +static void stop_backup_threads() +{ + log_copying = false; + + if (log_copying_stop) { + os_event_set(log_copying_stop); + msg("xtrabackup: Stopping log copying thread.\n"); + while (log_copying_running) { + msg("."); + os_thread_sleep(200000); /*0.2 sec*/ + } + msg("\n"); + os_event_destroy(log_copying_stop); + } + + if (wait_throttle) { + /* wait for io_watching_thread completion */ + while (io_watching_thread_running) { + os_thread_sleep(1000000); + } + os_event_destroy(wait_throttle); + } +} + +/** Implement the core of --backup +@return whether the operation succeeded */ +static +bool +xtrabackup_backup_low() +{ + /* read the latest checkpoint lsn */ + { + ulint max_cp_field; + + log_mutex_enter(); + + if (recv_find_max_checkpoint(&max_cp_field) == DB_SUCCESS + && log_sys->log.format != 0) { + metadata_to_lsn = mach_read_from_8( + log_sys->checkpoint_buf + LOG_CHECKPOINT_LSN); + msg("xtrabackup: The latest check point" + " (for incremental): '" LSN_PF "'\n", + metadata_to_lsn); + } else { + metadata_to_lsn = 0; + msg("xtrabackup: Error: recv_find_max_checkpoint() failed.\n"); + } + log_mutex_exit(); + } + + stop_backup_threads(); + + if (!dst_log_file || xtrabackup_copy_logfile(COPY_LAST)) { + return false; + } + + if (ds_close(dst_log_file)) { + dst_log_file = NULL; + return false; + } + + dst_log_file = NULL; + + if(!xtrabackup_incremental) { + strcpy(metadata_type, "full-backuped"); + metadata_from_lsn = 0; + } else { + strcpy(metadata_type, "incremental"); + metadata_from_lsn = incremental_lsn; + } + metadata_last_lsn = log_copy_scanned_lsn; + + if (!xtrabackup_stream_metadata(ds_meta)) { + msg("xtrabackup: Error: failed to stream metadata.\n"); + return false; + } + if (xtrabackup_extra_lsndir) { + char filename[FN_REFLEN]; + + sprintf(filename, "%s/%s", xtrabackup_extra_lsndir, + XTRABACKUP_METADATA_FILENAME); + if (!xtrabackup_write_metadata(filename)) { + msg("xtrabackup: Error: failed to write metadata " + "to '%s'.\n", filename); + return false; + } + + } + + return true; +} + +/** Implement --backup +@return whether the operation succeeded */ +static +bool +xtrabackup_backup_func() +{ + MY_STAT stat_info; + uint i; + uint count; + pthread_mutex_t count_mutex; + data_thread_ctxt_t *data_threads; + +#ifdef USE_POSIX_FADVISE + msg("xtrabackup: uses posix_fadvise().\n"); +#endif + + /* cd to datadir */ + + if (my_setwd(mysql_real_data_home,MYF(MY_WME))) + { + msg("xtrabackup: cannot my_setwd %s\n", mysql_real_data_home); + return(false); + } + msg("xtrabackup: cd to %s\n", mysql_real_data_home); + + msg("xtrabackup: open files limit requested %u, set to %u\n", + (uint) xb_open_files_limit, + xb_set_max_open_files(xb_open_files_limit)); + + mysql_data_home= mysql_data_home_buff; + mysql_data_home[0]=FN_CURLIB; // all paths are relative from here + mysql_data_home[1]=0; + + srv_n_purge_threads = 1; + srv_read_only_mode = TRUE; + + srv_operation = SRV_OPERATION_BACKUP; + + if (xb_close_files) + msg("xtrabackup: warning: close-files specified. Use it " + "at your own risk. If there are DDL operations like table DROP TABLE " + "or RENAME TABLE during the backup, inconsistent backup will be " + "produced.\n"); + + if (opt_lock_ddl_per_table) { + mdl_lock_init(); + } + + /* initialize components */ + if(innodb_init_param()) { +fail: + stop_backup_threads(); + innodb_shutdown(); + return(false); + } + + xb_normalize_init_values(); + + + if (srv_file_flush_method_str == NULL) { + /* These are the default options */ + srv_file_flush_method = SRV_FSYNC; + } else if (0 == ut_strcmp(srv_file_flush_method_str, "fsync")) { + srv_file_flush_method = SRV_FSYNC; + } else if (0 == ut_strcmp(srv_file_flush_method_str, "O_DSYNC")) { + srv_file_flush_method = SRV_O_DSYNC; + + } else if (0 == ut_strcmp(srv_file_flush_method_str, "O_DIRECT")) { + srv_file_flush_method = SRV_O_DIRECT; + msg("xtrabackup: using O_DIRECT\n"); + } else if (0 == ut_strcmp(srv_file_flush_method_str, "littlesync")) { + srv_file_flush_method = SRV_LITTLESYNC; + } else if (0 == ut_strcmp(srv_file_flush_method_str, "nosync")) { + srv_file_flush_method = SRV_NOSYNC; + } else if (0 == ut_strcmp(srv_file_flush_method_str, "ALL_O_DIRECT")) { + srv_file_flush_method = SRV_ALL_O_DIRECT_FSYNC; + msg("xtrabackup: using ALL_O_DIRECT\n"); + } else if (0 == ut_strcmp(srv_file_flush_method_str, + "O_DIRECT_NO_FSYNC")) { + srv_file_flush_method = SRV_O_DIRECT_NO_FSYNC; + msg("xtrabackup: using O_DIRECT_NO_FSYNC\n"); + } else { + msg("xtrabackup: Unrecognized value %s for " + "innodb_flush_method\n", srv_file_flush_method_str); + goto fail; + } + + /* We can only use synchronous unbuffered IO on Windows for now */ + if (srv_file_flush_method_str != NULL) { + msg("xtrabackupp: Warning: " + "ignoring innodb_flush_method = %s on Windows.\n", srv_file_flush_method_str); + } + +#ifdef _WIN32 + srv_file_flush_method = SRV_ALL_O_DIRECT_FSYNC; + srv_use_native_aio = TRUE; +#endif + + if (srv_buf_pool_size >= 1000 * 1024 * 1024) { + /* Here we still have srv_pool_size counted + in kilobytes (in 4.0 this was in bytes) + srv_boot() converts the value to + pages; if buffer pool is less than 1000 MB, + assume fewer threads. */ + srv_max_n_threads = 50000; + + } else if (srv_buf_pool_size >= 8 * 1024 * 1024) { + + srv_max_n_threads = 10000; + } else { + srv_max_n_threads = 1000; /* saves several MB of memory, + especially in 64-bit + computers */ + } + + sync_check_init(); + ut_d(sync_check_enable()); + /* Reset the system variables in the recovery module. */ + recv_sys_var_init(); + trx_pool_init(); + row_mysql_init(); + + ut_crc32_init(); + crc_init(); + recv_sys_init(); + +#ifdef WITH_INNODB_DISALLOW_WRITES + srv_allow_writes_event = os_event_create(0); + os_event_set(srv_allow_writes_event); +#endif + + xb_filters_init(); + + { + ibool log_file_created; + ibool log_created = FALSE; + ibool log_opened = FALSE; + ulint err; + ulint i; + + xb_fil_io_init(); + srv_n_file_io_threads = srv_n_read_io_threads; + + os_aio_init(srv_n_read_io_threads, srv_n_write_io_threads, + SRV_MAX_N_PENDING_SYNC_IOS); + + log_sys_init(); + log_init(srv_n_log_files); + fil_space_t* space = fil_space_create( + "innodb_redo_log", SRV_LOG_SPACE_FIRST_ID, 0, + FIL_TYPE_LOG, NULL); + + lock_sys_create(srv_lock_table_size); + + for (i = 0; i < srv_n_log_files; i++) { + err = open_or_create_log_file(space, &log_file_created, i); + if (err != DB_SUCCESS) { + goto fail; + } + + if (log_file_created) { + log_created = TRUE; + } else { + log_opened = TRUE; + } + if ((log_opened && log_created)) { + msg( + "xtrabackup: Error: all log files must be created at the same time.\n" + "xtrabackup: All log files must be created also in database creation.\n" + "xtrabackup: If you want bigger or smaller log files, shut down the\n" + "xtrabackup: database and make sure there were no errors in shutdown.\n" + "xtrabackup: Then delete the existing log files. Edit the .cnf file\n" + "xtrabackup: and start the database again.\n"); + + goto fail; + } + } + + /* log_file_created must not be TRUE, if online */ + if (log_file_created) { + msg("xtrabackup: Something wrong with source files...\n"); + goto fail; + } + + } + + /* create extra LSN dir if it does not exist. */ + if (xtrabackup_extra_lsndir + &&!my_stat(xtrabackup_extra_lsndir,&stat_info,MYF(0)) + && (my_mkdir(xtrabackup_extra_lsndir,0777,MYF(0)) < 0)) { + msg("xtrabackup: Error: cannot mkdir %d: %s\n", + my_errno, xtrabackup_extra_lsndir); + goto fail; + } + + /* create target dir if not exist */ + if (!xtrabackup_stream_str && !my_stat(xtrabackup_target_dir,&stat_info,MYF(0)) + && (my_mkdir(xtrabackup_target_dir,0777,MYF(0)) < 0)){ + msg("xtrabackup: Error: cannot mkdir %d: %s\n", + my_errno, xtrabackup_target_dir); + goto fail; + } + + { + /* definition from recv_recovery_from_checkpoint_start() */ + ulint max_cp_field; + + /* start back ground thread to copy newer log */ + os_thread_id_t log_copying_thread_id; + datafiles_iter_t *it; + + /* get current checkpoint_lsn */ + /* Look for the latest checkpoint from any of the log groups */ + + log_mutex_enter(); + + dberr_t err = recv_find_max_checkpoint(&max_cp_field); + + if (err != DB_SUCCESS) { +log_fail: + log_mutex_exit(); + goto fail; + } + + if (log_sys->log.format == 0) { +old_format: + msg("xtrabackup: Error: cannot process redo log" + " before MariaDB 10.2.2\n"); + log_mutex_exit(); + goto log_fail; + } + + ut_ad(!((log_sys->log.format ^ LOG_HEADER_FORMAT_CURRENT) + & ~LOG_HEADER_FORMAT_ENCRYPTED)); + + const byte* buf = log_sys->checkpoint_buf; + +reread_log_header: + checkpoint_lsn_start = log_sys->log.lsn; + checkpoint_no_start = log_sys->next_checkpoint_no; + + err = recv_find_max_checkpoint(&max_cp_field); + + if (err != DB_SUCCESS) { + goto log_fail; + } + + if (log_sys->log.format == 0) { + goto old_format; + } + + ut_ad(!((log_sys->log.format ^ LOG_HEADER_FORMAT_CURRENT) + & ~LOG_HEADER_FORMAT_ENCRYPTED)); + + log_group_header_read(&log_sys->log, max_cp_field); + + if (checkpoint_no_start != mach_read_from_8(buf + LOG_CHECKPOINT_NO)) { + goto reread_log_header; + } + + log_mutex_exit(); + + xtrabackup_init_datasinks(); + + if (!select_history()) { + goto fail; + } + + /* open the log file */ + memset(&stat_info, 0, sizeof(MY_STAT)); + dst_log_file = ds_open(ds_redo, "ib_logfile0", &stat_info); + if (dst_log_file == NULL) { + msg("xtrabackup: error: failed to open the target stream for " + "'ib_logfile0'.\n"); + goto fail; + } + + /* label it */ + byte MY_ALIGNED(OS_FILE_LOG_BLOCK_SIZE) log_hdr[OS_FILE_LOG_BLOCK_SIZE]; + memset(log_hdr, 0, sizeof log_hdr); + mach_write_to_4(LOG_HEADER_FORMAT + log_hdr, log_sys->log.format); + mach_write_to_8(LOG_HEADER_START_LSN + log_hdr, checkpoint_lsn_start); + strcpy(reinterpret_cast(LOG_HEADER_CREATOR + log_hdr), + "Backup " MYSQL_SERVER_VERSION); + log_block_set_checksum(log_hdr, + log_block_calc_checksum_crc32(log_hdr)); + + /* Write the log header. */ + if (ds_write(dst_log_file, log_hdr, sizeof log_hdr)) { + log_write_fail: + msg("xtrabackup: error: write to logfile failed\n"); + goto fail; + } + /* Adjust the checkpoint page. */ + memcpy(log_hdr, buf, OS_FILE_LOG_BLOCK_SIZE); + mach_write_to_8(log_hdr + LOG_CHECKPOINT_OFFSET, + (checkpoint_lsn_start & (OS_FILE_LOG_BLOCK_SIZE - 1)) + | LOG_FILE_HDR_SIZE); + log_block_set_checksum(log_hdr, + log_block_calc_checksum_crc32(log_hdr)); + /* Write checkpoint page 1 and two empty log pages before the + payload. */ + if (ds_write(dst_log_file, log_hdr, OS_FILE_LOG_BLOCK_SIZE) + || !memset(log_hdr, 0, sizeof log_hdr) + || ds_write(dst_log_file, log_hdr, sizeof log_hdr) + || ds_write(dst_log_file, log_hdr, sizeof log_hdr)) { + goto log_write_fail; + } + + /* start flag */ + log_copying = TRUE; + + /* start io throttle */ + if(xtrabackup_throttle) { + os_thread_id_t io_watching_thread_id; + + io_ticket = xtrabackup_throttle; + wait_throttle = os_event_create(0); + io_watching_thread_running = true; + + os_thread_create(io_watching_thread, NULL, + &io_watching_thread_id); + } + + /* copy log file by current position */ + log_copy_scanned_lsn = checkpoint_lsn_start; + if (xtrabackup_copy_logfile(COPY_FIRST)) + goto fail; + + log_copying_stop = os_event_create(0); + log_copying_running = true; + os_thread_create(log_copying_thread, NULL, &log_copying_thread_id); + + /* Populate fil_system with tablespaces to copy */ + err = xb_load_tablespaces(); + if (err != DB_SUCCESS) { + msg("xtrabackup: error: xb_load_tablespaces() failed with" + "error code %u\n", err); + goto fail; + } + + /* FLUSH CHANGED_PAGE_BITMAPS call */ + if (!flush_changed_page_bitmaps()) { + goto fail; + } + debug_sync_point("xtrabackup_suspend_at_start"); + + if (xtrabackup_incremental) { + if (!xtrabackup_incremental_force_scan) { + changed_page_bitmap = xb_page_bitmap_init(); + } + if (!changed_page_bitmap) { + msg("xtrabackup: using the full scan for incremental " + "backup\n"); + } else if (incremental_lsn != checkpoint_lsn_start) { + /* Do not print that bitmaps are used when dummy bitmap + is build for an empty LSN range. */ + msg("xtrabackup: using the changed page bitmap\n"); + } + } + + ut_a(xtrabackup_parallel > 0); + + if (xtrabackup_parallel > 1) { + msg("xtrabackup: Starting %u threads for parallel data " + "files transfer\n", xtrabackup_parallel); + } + + it = datafiles_iter_new(fil_system); + if (it == NULL) { + msg("xtrabackup: Error: datafiles_iter_new() failed.\n"); + goto fail; + } + + /* Create data copying threads */ + data_threads = (data_thread_ctxt_t *) + malloc(sizeof(data_thread_ctxt_t) * xtrabackup_parallel); + count = xtrabackup_parallel; + pthread_mutex_init(&count_mutex, NULL); + + for (i = 0; i < (uint) xtrabackup_parallel; i++) { + data_threads[i].it = it; + data_threads[i].num = i+1; + data_threads[i].count = &count; + data_threads[i].count_mutex = count_mutex; + os_thread_create(data_copy_thread_func, data_threads + i, + &data_threads[i].id); + } + + /* Wait for threads to exit */ + while (1) { + os_thread_sleep(1000000); + pthread_mutex_lock(&count_mutex); + bool stop = count == 0; + pthread_mutex_unlock(&count_mutex); + if (stop) { + break; + } + } + + pthread_mutex_destroy(&count_mutex); + free(data_threads); + datafiles_iter_free(it); + + if (changed_page_bitmap) { + xb_page_bitmap_deinit(changed_page_bitmap); + } + } + + bool ok = backup_start(); + + if (ok) { + ok = xtrabackup_backup_low(); + + backup_release(); + + if (ok) { + backup_finish(); + } + } + + if (!ok) { + goto fail; + } + + if (opt_lock_ddl_per_table) { + mdl_unlock_all(); + } + + xtrabackup_destroy_datasinks(); + + msg("xtrabackup: Redo log (from LSN " LSN_PF " to " LSN_PF + ") was copied.\n", checkpoint_lsn_start, log_copy_scanned_lsn); + xb_filters_free(); + + xb_data_files_close(); + + /* Make sure that the latest checkpoint was included */ + if (metadata_to_lsn > log_copy_scanned_lsn) { + msg("xtrabackup: error: failed to copy enough redo log (" + "LSN=" LSN_PF "; checkpoint LSN=" LSN_PF ").\n", + log_copy_scanned_lsn, metadata_to_lsn); + goto fail; + } + + innodb_shutdown(); + return(true); +} + +/* ================= prepare ================= */ + +/*********************************************************************** +Generates path to the meta file path from a given path to an incremental .delta +by replacing trailing ".delta" with ".meta", or returns error if 'delta_path' +does not end with the ".delta" character sequence. +@return TRUE on success, FALSE on error. */ +static +ibool +get_meta_path( + const char *delta_path, /* in: path to a .delta file */ + char *meta_path) /* out: path to the corresponding .meta + file */ +{ + size_t len = strlen(delta_path); + + if (len <= 6 || strcmp(delta_path + len - 6, ".delta")) { + return FALSE; + } + memcpy(meta_path, delta_path, len - 6); + strcpy(meta_path + len - 6, XB_DELTA_INFO_SUFFIX); + + return TRUE; +} + +/****************************************************************//** +Create a new tablespace on disk and return the handle to its opened +file. Code adopted from fil_create_new_single_table_tablespace with +the main difference that only disk file is created without updating +the InnoDB in-memory dictionary data structures. + +@return true on success, false on error. */ +static +bool +xb_space_create_file( +/*==================*/ + const char* path, /*!(malloc(3 * UNIV_PAGE_SIZE)); + /* Align the memory for file i/o if we might have O_DIRECT set */ + page = static_cast(ut_align(buf, UNIV_PAGE_SIZE)); + + memset(page, '\0', UNIV_PAGE_SIZE); + + fsp_header_init_fields(page, space_id, flags); + mach_write_to_4(page + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID, space_id); + + const page_size_t page_size(flags); + + if (!page_size.is_compressed()) { + buf_flush_init_for_writing(NULL, page, NULL, 0, false); + + ret = os_file_write(IORequestWrite, path, *file, page, 0, + UNIV_PAGE_SIZE); + } else { + page_zip_des_t page_zip; + ulint zip_size = page_size.physical(); + page_zip_set_size(&page_zip, zip_size); + page_zip.data = page + UNIV_PAGE_SIZE; + fprintf(stderr, "zip_size = " ULINTPF "\n", zip_size); + +#ifdef UNIV_DEBUG + page_zip.m_start = +#endif /* UNIV_DEBUG */ + page_zip.m_end = page_zip.m_nonempty = + page_zip.n_blobs = 0; + + buf_flush_init_for_writing(NULL, page, &page_zip, 0, false); + + ret = os_file_write(IORequestWrite, path, *file, + page_zip.data, 0, zip_size); + } + + free(buf); + + if (!ret) { + msg("xtrabackup: could not write the first page to %s\n", + path); + os_file_close(*file); + os_file_delete(0, path); + return ret; + } + + return TRUE; +} + +/*********************************************************************** +Searches for matching tablespace file for given .delta file and space_id +in given directory. When matching tablespace found, renames it to match the +name of .delta file. If there was a tablespace with matching name and +mismatching ID, renames it to xtrabackup_tmp_#ID.ibd. If there was no +matching file, creates a new tablespace. +@return file handle of matched or created file */ +static +pfs_os_file_t +xb_delta_open_matching_space( + const char* dbname, /* in: path to destination database dir */ + const char* name, /* in: name of delta file (without .delta) */ + const xb_delta_info_t& info, + char* real_name, /* out: full path of destination file */ + size_t real_name_len, /* out: buffer size for real_name */ + bool* success) /* out: indicates error. true = success */ +{ + char dest_dir[FN_REFLEN]; + char dest_space_name[FN_REFLEN]; + fil_space_t* fil_space; + pfs_os_file_t file; + xb_filter_entry_t* table; + + ut_a(dbname != NULL || + !fil_is_user_tablespace_id(info.space_id) || + info.space_id == ULINT_UNDEFINED); + + *success = false; + + if (dbname) { + snprintf(dest_dir, FN_REFLEN, "%s/%s", + xtrabackup_target_dir, dbname); + os_normalize_path(dest_dir); + + snprintf(dest_space_name, FN_REFLEN, "%s/%s", dbname, name); + } else { + snprintf(dest_dir, FN_REFLEN, "%s", xtrabackup_target_dir); + os_normalize_path(dest_dir); + + snprintf(dest_space_name, FN_REFLEN, "%s", name); + } + + snprintf(real_name, real_name_len, + "%s/%s", + xtrabackup_target_dir, dest_space_name); + os_normalize_path(real_name); + /* Truncate ".ibd" */ + dest_space_name[strlen(dest_space_name) - 4] = '\0'; + + /* Create the database directory if it doesn't exist yet */ + if (!os_file_create_directory(dest_dir, FALSE)) { + msg("xtrabackup: error: cannot create dir %s\n", dest_dir); + return file; + } + + log_mutex_enter(); + if (!fil_is_user_tablespace_id(info.space_id)) { +found: + /* open the file and return its handle */ + + file = os_file_create_simple_no_error_handling( + 0, real_name, + OS_FILE_OPEN, OS_FILE_READ_WRITE, false, success); + + if (!*success) { + msg("xtrabackup: Cannot open file %s\n", real_name); + } +exit: + log_mutex_exit(); + return file; + } + + /* remember space name for further reference */ + table = static_cast + (malloc(sizeof(xb_filter_entry_t) + + strlen(dest_space_name) + 1)); + + table->name = ((char*)table) + sizeof(xb_filter_entry_t); + strcpy(table->name, dest_space_name); + HASH_INSERT(xb_filter_entry_t, name_hash, inc_dir_tables_hash, + ut_fold_string(table->name), table); + + mutex_enter(&fil_system->mutex); + fil_space = fil_space_get_by_name(dest_space_name); + mutex_exit(&fil_system->mutex); + + if (fil_space != NULL) { + if (fil_space->id == info.space_id + || info.space_id == ULINT_UNDEFINED) { + /* we found matching space */ + goto found; + } else { + + char tmpname[FN_REFLEN]; + + snprintf(tmpname, FN_REFLEN, "%s/xtrabackup_tmp_#%lu", + dbname, fil_space->id); + + msg("xtrabackup: Renaming %s to %s.ibd\n", + fil_space->name, tmpname); + + if (!fil_rename_tablespace( + fil_space->id, + fil_space->chain.start->name, + tmpname, NULL)) + { + msg("xtrabackup: Cannot rename %s to %s\n", + fil_space->name, tmpname); + goto exit; + } + } + } + + if (info.space_id == ULINT_UNDEFINED) + { + msg("xtrabackup: Error: Cannot handle DDL operation on tablespace " + "%s\n", dest_space_name); + exit(EXIT_FAILURE); + } + mutex_enter(&fil_system->mutex); + fil_space = fil_space_get_by_id(info.space_id); + mutex_exit(&fil_system->mutex); + if (fil_space != NULL) { + char tmpname[FN_REFLEN]; + + strncpy(tmpname, dest_space_name, FN_REFLEN); + + msg("xtrabackup: Renaming %s to %s\n", + fil_space->name, dest_space_name); + + if (!fil_rename_tablespace(fil_space->id, + fil_space->chain.start->name, + tmpname, + NULL)) + { + msg("xtrabackup: Cannot rename %s to %s\n", + fil_space->name, dest_space_name); + goto exit; + } + + goto found; + } + + /* No matching space found. create the new one. */ + const ulint flags = info.page_size.is_compressed() + ? get_bit_shift(info.page_size.physical() + >> (UNIV_ZIP_SIZE_SHIFT_MIN - 1)) + << FSP_FLAGS_POS_ZIP_SSIZE + | FSP_FLAGS_MASK_POST_ANTELOPE + | FSP_FLAGS_MASK_ATOMIC_BLOBS + | (info.page_size.logical() == UNIV_PAGE_SIZE_ORIG + ? 0 + : get_bit_shift(info.page_size.logical() + >> (UNIV_ZIP_SIZE_SHIFT_MIN - 1)) + << FSP_FLAGS_POS_PAGE_SSIZE) + : FSP_FLAGS_PAGE_SSIZE(); + ut_ad(page_size_t(flags).equals_to(info.page_size)); + + if (fil_space_create(dest_space_name, info.space_id, flags, + FIL_TYPE_TABLESPACE, 0)) { + *success = xb_space_create_file(real_name, info.space_id, + flags, &file); + } else { + msg("xtrabackup: Cannot create tablespace %s\n", + dest_space_name); + } + + goto exit; +} + +/************************************************************************ +Applies a given .delta file to the corresponding data file. +@return TRUE on success */ +static +ibool +xtrabackup_apply_delta( + const char* dirname, /* in: dir name of incremental */ + const char* dbname, /* in: database name (ibdata: NULL) */ + const char* filename, /* in: file name (not a path), + including the .delta extension */ + void* /*data*/) +{ + pfs_os_file_t src_file; + pfs_os_file_t dst_file; + char src_path[FN_REFLEN]; + char dst_path[FN_REFLEN]; + char meta_path[FN_REFLEN]; + char space_name[FN_REFLEN]; + bool success; + + ibool last_buffer = FALSE; + ulint page_in_buffer; + ulint incremental_buffers = 0; + + xb_delta_info_t info(univ_page_size, SRV_TMP_SPACE_ID); + ulint page_size; + ulint page_size_shift; + byte* incremental_buffer_base = NULL; + byte* incremental_buffer; + + size_t offset; + + ut_a(xtrabackup_incremental); + + if (dbname) { + snprintf(src_path, sizeof(src_path), "%s/%s/%s", + dirname, dbname, filename); + snprintf(dst_path, sizeof(dst_path), "%s/%s/%s", + xtrabackup_real_target_dir, dbname, filename); + } else { + snprintf(src_path, sizeof(src_path), "%s/%s", + dirname, filename); + snprintf(dst_path, sizeof(dst_path), "%s/%s", + xtrabackup_real_target_dir, filename); + } + dst_path[strlen(dst_path) - 6] = '\0'; + + strncpy(space_name, filename, FN_REFLEN); + space_name[strlen(space_name) - 6] = 0; + + if (!get_meta_path(src_path, meta_path)) { + goto error; + } + + os_normalize_path(dst_path); + os_normalize_path(src_path); + os_normalize_path(meta_path); + + if (!xb_read_delta_metadata(meta_path, &info)) { + goto error; + } + + page_size = info.page_size.physical(); + page_size_shift = get_bit_shift(page_size); + msg("xtrabackup: page size for %s is %lu bytes\n", + src_path, page_size); + if (page_size_shift < 10 || + page_size_shift > UNIV_PAGE_SIZE_SHIFT_MAX) { + msg("xtrabackup: error: invalid value of page_size " + "(%lu bytes) read from %s\n", page_size, meta_path); + goto error; + } + + src_file = os_file_create_simple_no_error_handling( + 0, src_path, + OS_FILE_OPEN, OS_FILE_READ_WRITE, false, &success); + if (!success) { + os_file_get_last_error(TRUE); + msg("xtrabackup: error: cannot open %s\n", src_path); + goto error; + } + + posix_fadvise(src_file, 0, 0, POSIX_FADV_SEQUENTIAL); + + os_file_set_nocache(src_file, src_path, "OPEN"); + + dst_file = xb_delta_open_matching_space( + dbname, space_name, info, + dst_path, sizeof(dst_path), &success); + if (!success) { + msg("xtrabackup: error: cannot open %s\n", dst_path); + goto error; + } + + posix_fadvise(dst_file, 0, 0, POSIX_FADV_DONTNEED); + + os_file_set_nocache(dst_file, dst_path, "OPEN"); + + /* allocate buffer for incremental backup (4096 pages) */ + incremental_buffer_base = static_cast + (malloc((page_size / 4 + 1) * page_size)); + incremental_buffer = static_cast + (ut_align(incremental_buffer_base, + page_size)); + + msg("Applying %s to %s...\n", src_path, dst_path); + + while (!last_buffer) { + ulint cluster_header; + + /* read to buffer */ + /* first block of block cluster */ + offset = ((incremental_buffers * (page_size / 4)) + << page_size_shift); + success = os_file_read(IORequestRead, src_file, + incremental_buffer, offset, page_size); + if (!success) { + goto error; + } + + cluster_header = mach_read_from_4(incremental_buffer); + switch(cluster_header) { + case 0x78747261UL: /*"xtra"*/ + break; + case 0x58545241UL: /*"XTRA"*/ + last_buffer = TRUE; + break; + default: + msg("xtrabackup: error: %s seems not " + ".delta file.\n", src_path); + goto error; + } + + /* FIXME: If the .delta modifies FSP_SIZE on page 0, + extend the file to that size. */ + + for (page_in_buffer = 1; page_in_buffer < page_size / 4; + page_in_buffer++) { + if (mach_read_from_4(incremental_buffer + page_in_buffer * 4) + == 0xFFFFFFFFUL) + break; + } + + ut_a(last_buffer || page_in_buffer == page_size / 4); + + /* read whole of the cluster */ + success = os_file_read(IORequestRead, src_file, + incremental_buffer, + offset, page_in_buffer * page_size); + if (!success) { + goto error; + } + + posix_fadvise(src_file, offset, page_in_buffer * page_size, + POSIX_FADV_DONTNEED); + + for (page_in_buffer = 1; page_in_buffer < page_size / 4; + page_in_buffer++) { + ulint offset_on_page; + + offset_on_page = mach_read_from_4(incremental_buffer + page_in_buffer * 4); + + if (offset_on_page == 0xFFFFFFFFUL) + break; + + success = os_file_write(IORequestWrite, + dst_path, dst_file, + incremental_buffer + + page_in_buffer * page_size, + (offset_on_page << + page_size_shift), + page_size); + if (!success) { + goto error; + } + } + + incremental_buffers++; + } + + free(incremental_buffer_base); + if (src_file != OS_FILE_CLOSED) + os_file_close(src_file); + if (dst_file != OS_FILE_CLOSED) + os_file_close(dst_file); + return TRUE; + +error: + free(incremental_buffer_base); + if (src_file != OS_FILE_CLOSED) + os_file_close(src_file); + if (dst_file != OS_FILE_CLOSED) + os_file_close(dst_file); + msg("xtrabackup: Error: xtrabackup_apply_delta(): " + "failed to apply %s to %s.\n", src_path, dst_path); + return FALSE; +} + +/************************************************************************ +Callback to handle datadir entry. Function of this type will be called +for each entry which matches the mask by xb_process_datadir. +@return should return TRUE on success */ +typedef ibool (*handle_datadir_entry_func_t)( +/*=========================================*/ + const char* data_home_dir, /*!name, name)); + + if (!table) { + snprintf(name, FN_REFLEN, "%s/%s/%s", data_home_dir, + db_name, file_name); + return os_file_delete(0, name); + } + + return(TRUE); +} + +/************************************************************************ +Function enumerates files in datadir (provided by path) which are matched +by provided suffix. For each entry callback is called. +@return FALSE if callback for some entry returned FALSE */ +static +ibool +xb_process_datadir( + const char* path, /*! suffix_len + && 0 == strcmp(fileinfo.name + + strlen(fileinfo.name) - suffix_len, + suffix)) { + if (!func( + path, NULL, + fileinfo.name, NULL)) + { + return(FALSE); + } + } +next_file_item_1: + ret = fil_file_readdir_next_file(&err, + path, dbdir, + &fileinfo); + } + + os_file_closedir(dbdir); + } else { + msg("xtrabackup: Cannot open dir %s\n", + path); + } + + /* single table tablespaces */ + dir = os_file_opendir(path, FALSE); + + if (dir == NULL) { + msg("xtrabackup: Cannot open dir %s\n", + path); + } + + ret = fil_file_readdir_next_file(&err, path, dir, + &dbinfo); + while (ret == 0) { + if (dbinfo.type == OS_FILE_TYPE_FILE + || dbinfo.type == OS_FILE_TYPE_UNKNOWN) { + + goto next_datadir_item; + } + + sprintf(dbpath, "%s/%s", path, + dbinfo.name); + os_normalize_path(dbpath); + + dbdir = os_file_opendir(dbpath, FALSE); + + if (dbdir != NULL) { + + ret = fil_file_readdir_next_file(&err, dbpath, dbdir, + &fileinfo); + while (ret == 0) { + + if (fileinfo.type == OS_FILE_TYPE_DIR) { + + goto next_file_item_2; + } + + if (strlen(fileinfo.name) > suffix_len + && 0 == strcmp(fileinfo.name + + strlen(fileinfo.name) - + suffix_len, + suffix)) { + /* The name ends in suffix; process + the file */ + if (!func( + path, + dbinfo.name, + fileinfo.name, NULL)) + { + return(FALSE); + } + } +next_file_item_2: + ret = fil_file_readdir_next_file(&err, + dbpath, dbdir, + &fileinfo); + } + + os_file_closedir(dbdir); + } +next_datadir_item: + ret = fil_file_readdir_next_file(&err, + path, + dir, &dbinfo); + } + + os_file_closedir(dir); + + return(TRUE); +} + +/************************************************************************ +Applies all .delta files from incremental_dir to the full backup. +@return TRUE on success. */ +static +ibool +xtrabackup_apply_deltas() +{ + return xb_process_datadir(xtrabackup_incremental_dir, ".delta", + xtrabackup_apply_delta); +} + + +static +void +innodb_free_param() +{ + srv_sys_space.shutdown(); + free_tmpdir(&mysql_tmpdir_list); +} + + +/** Store the current binary log coordinates in a specified file. +@param[in] filename file name +@param[in] name binary log file name +@param[in] pos binary log file position +@return whether the operation succeeded */ +static bool +store_binlog_info(const char* filename, const char* name, ulonglong pos) +{ + FILE *fp = fopen(filename, "w"); + + if (!fp) { + msg("xtrabackup: failed to open '%s'\n", filename); + return(false); + } + + fprintf(fp, "%s\t%llu\n", name, pos); + fclose(fp); + + return(true); +} + +/** Implement --prepare +@return whether the operation succeeded */ +static bool +xtrabackup_prepare_func(char** argv) +{ + char metadata_path[FN_REFLEN]; + + /* cd to target-dir */ + + if (my_setwd(xtrabackup_real_target_dir,MYF(MY_WME))) + { + msg("xtrabackup: cannot my_setwd %s\n", + xtrabackup_real_target_dir); + return(false); + } + msg("xtrabackup: cd to %s\n", xtrabackup_real_target_dir); + + int argc; for (argc = 0; argv[argc]; argc++) {} + encryption_plugin_prepare_init(argc, argv); + + xtrabackup_target_dir= mysql_data_home_buff; + xtrabackup_target_dir[0]=FN_CURLIB; // all paths are relative from here + xtrabackup_target_dir[1]=0; + const lsn_t target_lsn = xtrabackup_incremental + ? incremental_to_lsn : metadata_to_lsn; + + /* + read metadata of target + */ + sprintf(metadata_path, "%s/%s", xtrabackup_target_dir, + XTRABACKUP_METADATA_FILENAME); + + if (!xtrabackup_read_metadata(metadata_path)) { + msg("xtrabackup: Error: failed to read metadata from '%s'\n", + metadata_path); + return(false); + } + + if (!strcmp(metadata_type, "full-backuped")) { + if (xtrabackup_incremental) { + msg("xtrabackup: error: applying incremental backup " + "needs a prepared target.\n"); + return(false); + } + msg("xtrabackup: This target seems to be not prepared yet.\n"); + } else if (!strcmp(metadata_type, "log-applied")) { + msg("xtrabackup: This target seems to be already prepared.\n"); + } else { + msg("xtrabackup: This target does not have correct metadata.\n"); + return(false); + } + + bool ok = !xtrabackup_incremental + || metadata_to_lsn == incremental_lsn; + if (!ok) { + msg("xtrabackup: error: This incremental backup seems " + "not to be proper for the target.\n" + "xtrabackup: Check 'to_lsn' of the target and " + "'from_lsn' of the incremental.\n"); + return(false); + } + + srv_max_n_threads = 1000; + srv_undo_logs = 1; + srv_n_purge_threads = 1; + + xb_filters_init(); + + srv_log_group_home_dir = NULL; + srv_thread_concurrency = 1; + + if (xtrabackup_incremental) { + srv_operation = SRV_OPERATION_RESTORE_DELTA; + + if (innodb_init_param()) { + goto error_cleanup; + } + + xb_normalize_init_values(); + sync_check_init(); + ut_d(sync_check_enable()); + ut_crc32_init(); + recv_sys_init(); + log_sys_init(); + recv_recovery_on = true; + +#ifdef WITH_INNODB_DISALLOW_WRITES + srv_allow_writes_event = os_event_create(0); + os_event_set(srv_allow_writes_event); +#endif + dberr_t err = xb_data_files_init(); + if (err != DB_SUCCESS) { + msg("xtrabackup: error: xb_data_files_init() failed " + "with error %s\n", ut_strerr(err)); + goto error_cleanup; + } + + inc_dir_tables_hash = hash_create(1000); + + ok = xtrabackup_apply_deltas(); + + xb_data_files_close(); + + if (ok) { + /* Cleanup datadir from tablespaces deleted + between full and incremental backups */ + + xb_process_datadir("./", ".ibd", rm_if_not_found); + } + + xb_filter_hash_free(inc_dir_tables_hash); + + fil_close(); +#ifdef WITH_INNODB_DISALLOW_WRITES + os_event_destroy(srv_allow_writes_event); +#endif + innodb_free_param(); + log_shutdown(); + sync_check_close(); + if (!ok) goto error_cleanup; + } + + srv_operation = SRV_OPERATION_RESTORE; + + if (innodb_init_param()) { + goto error_cleanup; + } + + /* increase IO threads */ + if (srv_n_file_io_threads < 10) { + srv_n_read_io_threads = 4; + srv_n_write_io_threads = 4; + } + + msg("xtrabackup: Starting InnoDB instance for recovery.\n" + "xtrabackup: Using %lld bytes for buffer pool " + "(set by --use-memory parameter)\n", xtrabackup_use_memory); + + srv_max_buf_pool_modified_pct = (double)max_buf_pool_modified_pct; + + if (srv_max_dirty_pages_pct_lwm > srv_max_buf_pool_modified_pct) { + srv_max_dirty_pages_pct_lwm = srv_max_buf_pool_modified_pct; + } + + if (innodb_init()) { + goto error_cleanup; + } + + + if (ok) { + mtr_t mtr; + mtr.start(); + const trx_sysf_t* sys_header = trx_sysf_get(&mtr); + + if (mach_read_from_4(TRX_SYS_MYSQL_LOG_INFO + + TRX_SYS_MYSQL_LOG_MAGIC_N_FLD + + sys_header) + == TRX_SYS_MYSQL_LOG_MAGIC_N) { + ulonglong pos = mach_read_from_8( + TRX_SYS_MYSQL_LOG_INFO + + TRX_SYS_MYSQL_LOG_OFFSET + + sys_header); + const char* name = reinterpret_cast( + TRX_SYS_MYSQL_LOG_INFO + TRX_SYS_MYSQL_LOG_NAME + + sys_header); + msg("Last binlog file %s, position %llu\n", name, pos); + + /* output to xtrabackup_binlog_pos_innodb and + (if backup_safe_binlog_info was available on + the server) to xtrabackup_binlog_info. In the + latter case xtrabackup_binlog_pos_innodb + becomes redundant and is created only for + compatibility. */ + ok = store_binlog_info( + "xtrabackup_binlog_pos_innodb", name, pos) + && (!recover_binlog_info || store_binlog_info( + XTRABACKUP_BINLOG_INFO, + name, pos)); + } + + mtr.commit(); + } + + /* Check whether the log is applied enough or not. */ + if ((srv_start_lsn || fil_space_get(SRV_LOG_SPACE_FIRST_ID)) + && srv_start_lsn < target_lsn) { + msg("xtrabackup: error: " + "The log was only applied up to LSN " LSN_PF + ", instead of " LSN_PF "\n", + srv_start_lsn, target_lsn); + ok = false; + } +#ifdef WITH_WSREP + else if (ok) xb_write_galera_info(xtrabackup_incremental); +#endif + + innodb_shutdown(); + innodb_free_param(); + + /* output to metadata file */ + if (ok) { + char filename[FN_REFLEN]; + + strcpy(metadata_type, "log-applied"); + + if(xtrabackup_incremental + && metadata_to_lsn < incremental_to_lsn) + { + metadata_to_lsn = incremental_to_lsn; + metadata_last_lsn = incremental_last_lsn; + } + + sprintf(filename, "%s/%s", xtrabackup_target_dir, XTRABACKUP_METADATA_FILENAME); + if (!xtrabackup_write_metadata(filename)) { + + msg("xtrabackup: Error: failed to write metadata " + "to '%s'\n", filename); + ok = false; + } else if (xtrabackup_extra_lsndir) { + sprintf(filename, "%s/%s", xtrabackup_extra_lsndir, XTRABACKUP_METADATA_FILENAME); + if (!xtrabackup_write_metadata(filename)) { + msg("xtrabackup: Error: failed to write " + "metadata to '%s'\n", filename); + ok = false; + } + } + } + + if (ok) ok = apply_log_finish(); + + if (ok && xtrabackup_export) + ok= (prepare_export() == 0); + +error_cleanup: + xb_filters_free(); + return ok; +} + +/************************************************************************** +Append group name to xb_load_default_groups list. */ +static +void +append_defaults_group(const char *group, const char *default_groups[], + size_t default_groups_size) +{ + uint i; + bool appended = false; + for (i = 0; i < default_groups_size - 1; i++) { + if (default_groups[i] == NULL) { + default_groups[i] = group; + appended = true; + break; + } + } + ut_a(appended); +} + +bool +xb_init() +{ + const char *mixed_options[4] = {NULL, NULL, NULL, NULL}; + int n_mixed_options; + + /* sanity checks */ + + if (opt_slave_info + && opt_no_lock + && !opt_safe_slave_backup) { + msg("Error: --slave-info is used with --no-lock but " + "without --safe-slave-backup. The binlog position " + "cannot be consistent with the backup data.\n"); + return(false); + } + + if (opt_rsync && xtrabackup_stream_fmt) { + msg("Error: --rsync doesn't work with --stream\n"); + return(false); + } + + n_mixed_options = 0; + + if (opt_decompress) { + mixed_options[n_mixed_options++] = "--decompress"; + } + + if (xtrabackup_copy_back) { + mixed_options[n_mixed_options++] = "--copy-back"; + } + + if (xtrabackup_move_back) { + mixed_options[n_mixed_options++] = "--move-back"; + } + + if (xtrabackup_prepare) { + mixed_options[n_mixed_options++] = "--apply-log"; + } + + if (n_mixed_options > 1) { + msg("Error: %s and %s are mutually exclusive\n", + mixed_options[0], mixed_options[1]); + return(false); + } + + if (xtrabackup_backup) { + if ((mysql_connection = xb_mysql_connect()) == NULL) { + return(false); + } + + if (!get_mysql_vars(mysql_connection)) { + return(false); + } + + encryption_plugin_backup_init(mysql_connection); + history_start_time = time(NULL); + + } + + return(true); +} + + +extern void init_signals(void); + +#include + +/* Messages . Avoid loading errmsg.sys file */ +void setup_error_messages() +{ + static const char *my_msgs[ERRORS_PER_RANGE]; + static const char **all_msgs[] = { my_msgs, my_msgs, my_msgs, my_msgs }; + my_default_lc_messages = &my_locale_en_US; + my_default_lc_messages->errmsgs->errmsgs = all_msgs; + + /* Populate the necessary error messages */ + struct { + int id; + const char *fmt; + } + xb_msgs[] = + { + { ER_DATABASE_NAME,"Database" }, + { ER_TABLE_NAME,"Table"}, + { ER_PARTITION_NAME, "Partition" }, + { ER_SUBPARTITION_NAME, "Subpartition" }, + { ER_TEMPORARY_NAME, "Temporary"}, + { ER_RENAMED_NAME, "Renamed"}, + { ER_CANT_FIND_DL_ENTRY, "Can't find symbol '%-.128s' in library"}, + { ER_CANT_OPEN_LIBRARY, "Can't open shared library '%-.192s' (errno: %d, %-.128s)" }, + { ER_OUTOFMEMORY, "Out of memory; restart server and try again (needed %d bytes)" }, + { ER_CANT_OPEN_LIBRARY, "Can't open shared library '%-.192s' (errno: %d, %-.128s)" }, + { ER_UDF_NO_PATHS, "No paths allowed for shared library" }, + { ER_CANT_INITIALIZE_UDF,"Can't initialize function '%-.192s'; %-.80s"}, + { ER_PLUGIN_IS_NOT_LOADED,"Plugin '%-.192s' is not loaded" } + }; + + for (int i = 0; i < (int)array_elements(all_msgs); i++) + all_msgs[0][i] = "Unknown error"; + + for (int i = 0; i < (int)array_elements(xb_msgs); i++) + all_msgs[0][xb_msgs[i].id - ER_ERROR_FIRST] = xb_msgs[i].fmt; +} + +void +handle_options(int argc, char **argv, char ***argv_client, char ***argv_server) +{ + /* Setup some variables for Innodb.*/ + + srv_operation = SRV_OPERATION_RESTORE; + + files_charset_info = &my_charset_utf8_general_ci; + + setup_error_messages(); + sys_var_init(); + plugin_mutex_init(); + mysql_rwlock_init(key_rwlock_LOCK_system_variables_hash, &LOCK_system_variables_hash); + opt_stack_trace = 1; + test_flags |= TEST_SIGINT; + init_signals(); +#ifndef _WIN32 + /* Exit process on SIGINT. */ + my_sigset(SIGINT, SIG_DFL); +#endif + + sf_leaking_memory = 1; /* don't report memory leaks on early exist */ + + int i; + int ho_error; + + char* target_dir = NULL; + bool prepare = false; + + char conf_file[FN_REFLEN]; + int argc_client = argc; + int argc_server = argc; + + /* scan options for group and config file to load defaults from */ + for (i = 1; i < argc; i++) { + + char *optend = strcend(argv[i], '='); + + if (strncmp(argv[i], "--defaults-group", + optend - argv[i]) == 0) { + defaults_group = optend + 1; + append_defaults_group(defaults_group, + xb_server_default_groups, + array_elements(xb_server_default_groups)); + } + + if (strncmp(argv[i], "--login-path", + optend - argv[i]) == 0) { + append_defaults_group(optend + 1, + xb_client_default_groups, + array_elements(xb_client_default_groups)); + } + + if (!strncmp(argv[i], "--prepare", + optend - argv[i])) { + prepare = true; + } + + if (!strncmp(argv[i], "--apply-log", + optend - argv[i])) { + prepare = true; + } + + if (!strncmp(argv[i], "--target-dir", + optend - argv[i]) && *optend) { + target_dir = optend + 1; + } + + if (!*optend && argv[i][0] != '-') { + target_dir = argv[i]; + } + } + + snprintf(conf_file, sizeof(conf_file), "my"); + + if (prepare && target_dir) { + snprintf(conf_file, sizeof(conf_file), + "%s/backup-my.cnf", target_dir); + if (!strncmp(argv[1], "--defaults-file=", 16)) { + /* Remove defaults-file*/ + for (int i = 2; ; i++) { + if ((argv[i-1]= argv[i]) == 0) + break; + } + argc--; + } + } + + *argv_client = argv; + *argv_server = argv; + if (load_defaults(conf_file, xb_server_default_groups, + &argc_server, argv_server)) { + exit(EXIT_FAILURE); + } + + int n; + for (n = 0; (*argv_server)[n]; n++) {}; + argc_server = n; + + print_param_str << + "# This MySQL options file was generated by XtraBackup.\n" + "[" << defaults_group << "]\n"; + + /* We want xtrabackup to ignore unknown options, because it only + recognizes a small subset of server variables */ + my_getopt_skip_unknown = TRUE; + + /* Reset u_max_value for all options, as we don't want the + --maximum-... modifier to set the actual option values */ + for (my_option *optp= xb_server_options; optp->name; optp++) { + optp->u_max_value = (G_PTR *) &global_max_value; + } + + + /* Throw a descriptive error if --defaults-file or --defaults-extra-file + is not the first command line argument */ + for (int i = 2 ; i < argc ; i++) { + char *optend = strcend((argv)[i], '='); + + if (optend - argv[i] == 15 && + !strncmp(argv[i], "--defaults-file", optend - argv[i])) { + + msg("xtrabackup: Error: --defaults-file " + "must be specified first on the command " + "line\n"); + exit(EXIT_FAILURE); + } + if (optend - argv[i] == 21 && + !strncmp(argv[i], "--defaults-extra-file", + optend - argv[i])) { + + msg("xtrabackup: Error: --defaults-extra-file " + "must be specified first on the command " + "line\n"); + exit(EXIT_FAILURE); + } + } + + if (argc_server > 0 + && (ho_error=handle_options(&argc_server, argv_server, + xb_server_options, xb_get_one_option))) + exit(ho_error); + + if (load_defaults(conf_file, xb_client_default_groups, + &argc_client, argv_client)) { + exit(EXIT_FAILURE); + } + + for (n = 0; (*argv_client)[n]; n++) {}; + argc_client = n; + + if (innobackupex_mode && argc_client > 0) { + /* emulate innobackupex script */ + innobackupex_mode = true; + if (!ibx_handle_options(&argc_client, argv_client)) { + exit(EXIT_FAILURE); + } + } + + if (argc_client > 0 + && (ho_error=handle_options(&argc_client, argv_client, + xb_client_options, xb_get_one_option))) + exit(ho_error); + + /* Reject command line arguments that don't look like options, i.e. are + not of the form '-X' (single-character options) or '--option' (long + options) */ + for (int i = 0 ; i < argc_client ; i++) { + const char * const opt = (*argv_client)[i]; + + if (strncmp(opt, "--", 2) && + !(strlen(opt) == 2 && opt[0] == '-')) { + bool server_option = true; + + for (int j = 0; j < argc_server; j++) { + if (opt == (*argv_server)[j]) { + server_option = false; + break; + } + } + + if (!server_option) { + msg("xtrabackup: Error:" + " unknown argument: '%s'\n", opt); + exit(EXIT_FAILURE); + } + } + } +} + +static int main_low(char** argv); +static int get_exepath(char *buf, size_t size, const char *argv0); + +/* ================= main =================== */ +int main(int argc, char **argv) +{ + char **client_defaults, **server_defaults; + + if (get_exepath(mariabackup_exe,FN_REFLEN, argv[0])) + strncpy(mariabackup_exe,argv[0], FN_REFLEN-1); + + + if (argc > 1 ) + { + /* In "prepare export", we need to start mysqld + Since it is not always be installed on the machine, + we start "mariabackup --mysqld", which acts as mysqld + */ + if (strcmp(argv[1], "--mysqld") == 0) + { + extern int mysqld_main(int argc, char **argv); + argc--; + argv++; + argv[0]+=2; + return mysqld_main(argc, argv); + } + if(strcmp(argv[1], "--innobackupex") == 0) + { + argv++; + argc--; + innobackupex_mode = true; + } + } + + if (argc > 1) + strncpy(orig_argv1,argv[1],sizeof(orig_argv1) -1); + + init_signals(); + MY_INIT(argv[0]); + + pthread_key_create(&THR_THD, NULL); + my_pthread_setspecific_ptr(THR_THD, NULL); + + xb_regex_init(); + + capture_tool_command(argc, argv); + + if (mysql_server_init(-1, NULL, NULL)) + { + exit(EXIT_FAILURE); + } + + system_charset_info = &my_charset_utf8_general_ci; + key_map_full.set_all(); + + logger.init_base(); + logger.set_handlers(LOG_FILE, LOG_NONE, LOG_NONE); + mysql_mutex_init(key_LOCK_error_log, &LOCK_error_log, + MY_MUTEX_INIT_FAST); + + handle_options(argc, argv, &client_defaults, &server_defaults); + +#ifndef DBUG_OFF + if (dbug_option) { + DBUG_SET_INITIAL(dbug_option); + DBUG_SET(dbug_option); + } +#endif + + int status = main_low(server_defaults); + + backup_cleanup(); + + if (innobackupex_mode) { + ibx_cleanup(); + } + + free_defaults(client_defaults); + free_defaults(server_defaults); + +#ifndef DBUG_OFF + if (dbug_option) { + DBUG_END(); + } +#endif + + if (THR_THD) + (void) pthread_key_delete(THR_THD); + + logger.cleanup_base(); + mysql_mutex_destroy(&LOCK_error_log); + + if (status == EXIT_SUCCESS) { + msg_ts("completed OK!\n"); + } + + return status; +} + +static int main_low(char** argv) +{ + if (innobackupex_mode) { + if (!ibx_init()) { + return(EXIT_FAILURE); + } + } + + if (!xtrabackup_print_param && !xtrabackup_prepare + && !strcmp(mysql_data_home, "./")) { + if (!xtrabackup_print_param) + usage(); + msg("\nxtrabackup: Error: Please set parameter 'datadir'\n"); + return(EXIT_FAILURE); + } + + /* Expand target-dir, incremental-basedir, etc. */ + + char cwd[FN_REFLEN]; + my_getwd(cwd, sizeof(cwd), MYF(0)); + + my_load_path(xtrabackup_real_target_dir, + xtrabackup_target_dir, cwd); + unpack_dirname(xtrabackup_real_target_dir, + xtrabackup_real_target_dir); + xtrabackup_target_dir= xtrabackup_real_target_dir; + + if (xtrabackup_incremental_basedir) { + my_load_path(xtrabackup_real_incremental_basedir, + xtrabackup_incremental_basedir, cwd); + unpack_dirname(xtrabackup_real_incremental_basedir, + xtrabackup_real_incremental_basedir); + xtrabackup_incremental_basedir = + xtrabackup_real_incremental_basedir; + } + + if (xtrabackup_incremental_dir) { + my_load_path(xtrabackup_real_incremental_dir, + xtrabackup_incremental_dir, cwd); + unpack_dirname(xtrabackup_real_incremental_dir, + xtrabackup_real_incremental_dir); + xtrabackup_incremental_dir = xtrabackup_real_incremental_dir; + } + + if (xtrabackup_extra_lsndir) { + my_load_path(xtrabackup_real_extra_lsndir, + xtrabackup_extra_lsndir, cwd); + unpack_dirname(xtrabackup_real_extra_lsndir, + xtrabackup_real_extra_lsndir); + xtrabackup_extra_lsndir = xtrabackup_real_extra_lsndir; + } + + /* get default temporary directory */ + if (!opt_mysql_tmpdir || !opt_mysql_tmpdir[0]) { + opt_mysql_tmpdir = getenv("TMPDIR"); +#if defined(__WIN__) + if (!opt_mysql_tmpdir) { + opt_mysql_tmpdir = getenv("TEMP"); + } + if (!opt_mysql_tmpdir) { + opt_mysql_tmpdir = getenv("TMP"); + } +#endif + if (!opt_mysql_tmpdir || !opt_mysql_tmpdir[0]) { + opt_mysql_tmpdir = const_cast(DEFAULT_TMPDIR); + } + } + + /* temporary setting of enough size */ + srv_page_size_shift = UNIV_PAGE_SIZE_SHIFT_MAX; + srv_page_size = UNIV_PAGE_SIZE_MAX; + if (xtrabackup_backup && xtrabackup_incremental) { + /* direct specification is only for --backup */ + /* and the lsn is prior to the other option */ + + char* endchar; + int error = 0; + incremental_lsn = strtoll(xtrabackup_incremental, &endchar, 10); + if (*endchar != '\0') + error = 1; + + if (error) { + msg("xtrabackup: value '%s' may be wrong format for " + "incremental option.\n", xtrabackup_incremental); + return(EXIT_FAILURE); + } + } else if (xtrabackup_backup && xtrabackup_incremental_basedir) { + char filename[FN_REFLEN]; + + sprintf(filename, "%s/%s", xtrabackup_incremental_basedir, XTRABACKUP_METADATA_FILENAME); + + if (!xtrabackup_read_metadata(filename)) { + msg("xtrabackup: error: failed to read metadata from " + "%s\n", filename); + return(EXIT_FAILURE); + } + + incremental_lsn = metadata_to_lsn; + xtrabackup_incremental = xtrabackup_incremental_basedir; //dummy + } else if (xtrabackup_prepare && xtrabackup_incremental_dir) { + char filename[FN_REFLEN]; + + sprintf(filename, "%s/%s", xtrabackup_incremental_dir, XTRABACKUP_METADATA_FILENAME); + + if (!xtrabackup_read_metadata(filename)) { + msg("xtrabackup: error: failed to read metadata from " + "%s\n", filename); + return(EXIT_FAILURE); + } + + incremental_lsn = metadata_from_lsn; + incremental_to_lsn = metadata_to_lsn; + incremental_last_lsn = metadata_last_lsn; + xtrabackup_incremental = xtrabackup_incremental_dir; //dummy + + } else if (opt_incremental_history_name) { + xtrabackup_incremental = opt_incremental_history_name; + } else if (opt_incremental_history_uuid) { + xtrabackup_incremental = opt_incremental_history_uuid; + } else { + xtrabackup_incremental = NULL; + } + + if (!xb_init()) { + return(EXIT_FAILURE); + } + + /* --print-param */ + if (xtrabackup_print_param) { + printf("%s", print_param_str.str().c_str()); + return(EXIT_SUCCESS); + } + + print_version(); + if (xtrabackup_incremental) { + msg("incremental backup from " LSN_PF " is enabled.\n", + incremental_lsn); + } + + if (xtrabackup_export && innobase_file_per_table == FALSE) { + msg("xtrabackup: auto-enabling --innodb-file-per-table due to " + "the --export option\n"); + innobase_file_per_table = TRUE; + } + + /* cannot execute both for now */ + { + int num = 0; + + if (xtrabackup_backup) num++; + if (xtrabackup_prepare) num++; + if (xtrabackup_copy_back) num++; + if (xtrabackup_move_back) num++; + if (xtrabackup_decrypt_decompress) num++; + if (num != 1) { /* !XOR (for now) */ + usage(); + return(EXIT_FAILURE); + } + } + +#ifndef __WIN__ + if (xtrabackup_debug_sync) { + signal(SIGCONT, sigcont_handler); + } +#endif + + /* --backup */ + if (xtrabackup_backup && !xtrabackup_backup_func()) { + return(EXIT_FAILURE); + } + + /* --prepare */ + if (xtrabackup_prepare + && !xtrabackup_prepare_func(argv)) { + return(EXIT_FAILURE); + } + + if (xtrabackup_copy_back || xtrabackup_move_back) { + if (!check_if_param_set("datadir")) { + msg("Error: datadir must be specified.\n"); + return(EXIT_FAILURE); + } + if (!copy_back()) + return(EXIT_FAILURE); + } + + if (xtrabackup_decrypt_decompress && !decrypt_decompress()) { + return(EXIT_FAILURE); + } + + return(EXIT_SUCCESS); +} + + +static int get_exepath(char *buf, size_t size, const char *argv0) +{ +#ifdef _WIN32 + DWORD ret = GetModuleFileNameA(NULL, buf, size); + if (ret > 0) + return 0; +#elif defined(__linux__) + ssize_t ret = readlink("/proc/self/exe", buf, size-1); + if(ret > 0) + return 0; +#endif + + return my_realpath(buf, argv0, 0); +} + diff --git a/extra/mariabackup/xtrabackup.h b/extra/mariabackup/xtrabackup.h new file mode 100644 index 00000000000..c902e7f54ba --- /dev/null +++ b/extra/mariabackup/xtrabackup.h @@ -0,0 +1,200 @@ +/****************************************************** +Copyright (c) 2011-2015 Percona LLC and/or its affiliates. + +Declarations for xtrabackup.cc + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#ifndef XB_XTRABACKUP_H +#define XB_XTRABACKUP_H + +#include +#include "datasink.h" +#include "xbstream.h" +#include "changed_page_bitmap.h" + +struct xb_delta_info_t +{ + xb_delta_info_t(page_size_t page_size, ulint space_id) + : page_size(page_size), space_id(space_id) {} + + page_size_t page_size; + ulint space_id; +}; + +/* value of the --incremental option */ +extern lsn_t incremental_lsn; + +extern char *xtrabackup_target_dir; +extern char *xtrabackup_incremental_dir; +extern char *xtrabackup_incremental_basedir; +extern char *innobase_data_home_dir; +extern char *innobase_buffer_pool_filename; +extern char *xb_plugin_dir; +extern uint opt_protocol; +extern ds_ctxt_t *ds_meta; +extern ds_ctxt_t *ds_data; + +/* The last checkpoint LSN at the backup startup time */ +extern lsn_t checkpoint_lsn_start; + +extern xb_page_bitmap *changed_page_bitmap; + +extern char *xtrabackup_incremental; +extern my_bool xtrabackup_incremental_force_scan; + +extern lsn_t metadata_from_lsn; +extern lsn_t metadata_to_lsn; +extern lsn_t metadata_last_lsn; + +extern xb_stream_fmt_t xtrabackup_stream_fmt; +extern ibool xtrabackup_stream; + +extern char *xtrabackup_tables; +extern char *xtrabackup_tables_file; +extern char *xtrabackup_databases; +extern char *xtrabackup_databases_file; +extern char *xtrabackup_tables_exclude; +extern char *xtrabackup_databases_exclude; + +extern ibool xtrabackup_compress; + +extern my_bool xtrabackup_backup; +extern my_bool xtrabackup_prepare; +extern my_bool xtrabackup_copy_back; +extern my_bool xtrabackup_move_back; +extern my_bool xtrabackup_decrypt_decompress; + +extern char *innobase_data_file_path; +extern longlong innobase_page_size; + +extern int xtrabackup_parallel; + +extern my_bool xb_close_files; +extern const char *xtrabackup_compress_alg; +#ifdef __cplusplus +extern "C"{ +#endif + extern uint xtrabackup_compress_threads; + extern ulonglong xtrabackup_compress_chunk_size; +#ifdef __cplusplus +} +#endif +extern my_bool xtrabackup_export; +extern char *xtrabackup_extra_lsndir; +extern ulint xtrabackup_log_copy_interval; +extern char *xtrabackup_stream_str; +extern long xtrabackup_throttle; +extern longlong xtrabackup_use_memory; + +extern my_bool opt_galera_info; +extern my_bool opt_slave_info; +extern my_bool opt_no_lock; +extern my_bool opt_safe_slave_backup; +extern my_bool opt_rsync; +extern my_bool opt_force_non_empty_dirs; +extern my_bool opt_noversioncheck; +extern my_bool opt_no_backup_locks; +extern my_bool opt_decompress; + +extern char *opt_incremental_history_name; +extern char *opt_incremental_history_uuid; + +extern char *opt_user; +extern char *opt_password; +extern char *opt_host; +extern char *opt_defaults_group; +extern char *opt_socket; +extern uint opt_port; +extern char *opt_log_bin; + +extern const char *query_type_names[]; + +enum query_type_t {QUERY_TYPE_ALL, QUERY_TYPE_UPDATE, + QUERY_TYPE_SELECT}; + +extern TYPELIB query_type_typelib; + +extern ulong opt_lock_wait_query_type; +extern ulong opt_kill_long_query_type; + +extern uint opt_kill_long_queries_timeout; +extern uint opt_lock_wait_timeout; +extern uint opt_lock_wait_threshold; +extern uint opt_debug_sleep_before_unlock; +extern uint opt_safe_slave_backup_timeout; + +extern const char *opt_history; + +enum binlog_info_enum { BINLOG_INFO_OFF, BINLOG_INFO_LOCKLESS, BINLOG_INFO_ON, + BINLOG_INFO_AUTO}; + +extern ulong opt_binlog_info; + +void xtrabackup_io_throttling(void); +my_bool xb_write_delta_metadata(const char *filename, + const xb_delta_info_t *info); + +/** @return the tablespace flags from a given data file +@retval ULINT_UNDEFINED if the file is not readable */ +ulint xb_get_space_flags(pfs_os_file_t file); + +/************************************************************************ +Checks if a table specified as a name in the form "database/name" (InnoDB 5.6) +or "./database/name.ibd" (InnoDB 5.5-) should be skipped from backup based on +the --tables or --tables-file options. + +@return TRUE if the table should be skipped. */ +my_bool +check_if_skip_table( +/******************/ + const char* name); /*!< in: path to the table */ + + +/************************************************************************ +Checks if a database specified by path should be skipped from backup based on +the --databases, --databases_file or --databases_exclude options. + +@return TRUE if the table should be skipped. */ +my_bool +check_if_skip_database_by_path( + const char* path /*!< in: path to the db directory. */ +); + +/************************************************************************ +Check if parameter is set in defaults file or via command line argument +@return true if parameter is set. */ +bool +check_if_param_set(const char *param); + +#if defined(HAVE_OPENSSL) +extern my_bool opt_ssl_verify_server_cert; +#endif + + +my_bool +xb_get_one_option(int optid, + const struct my_option *opt __attribute__((unused)), + char *argument); + +const char* +xb_get_copy_action(const char *dflt = "Copying"); + +void mdl_lock_init(); +void mdl_lock_table(ulint space_id); +void mdl_unlock_all(); +bool ends_with(const char *str, const char *suffix); +#endif /* XB_XTRABACKUP_H */ diff --git a/extra/mysqld_safe_helper.c b/extra/mysqld_safe_helper.c index 09e507c6e1c..2ccff20b910 100644 --- a/extra/mysqld_safe_helper.c +++ b/extra/mysqld_safe_helper.c @@ -59,7 +59,7 @@ int main(int argc, char *argv[]) MY_INIT(argv[0]); if (argc < 3) - do_usage(argv[0]); + do_usage(); user_info= my_check_user(argv[1], MYF(0)); if (user_info ? my_set_user(argv[1], user_info, MYF(MY_WME)) diff --git a/extra/replace.c b/extra/replace.c index a9982670384..b8c328f2902 100644 --- a/extra/replace.c +++ b/extra/replace.c @@ -174,6 +174,7 @@ register char **argv[]; break; case 'V': version=1; + /* fall through */ case 'I': case '?': help=1; /* Help text written */ diff --git a/extra/yassl/include/openssl/ssl.h b/extra/yassl/include/openssl/ssl.h index 9ec99b46c1f..ede4581fa13 100644 --- a/extra/yassl/include/openssl/ssl.h +++ b/extra/yassl/include/openssl/ssl.h @@ -540,7 +540,7 @@ void MD5_Final(unsigned char*, MD5_CTX*); /* yaSSL extensions */ int SSL_set_compression(SSL*); /* turn on yaSSL zlib compression */ -char *yaSSL_ASN1_TIME_to_string(ASN1_TIME *time, char *buf, size_t len); +char *yaSSL_ASN1_TIME_to_string(const ASN1_TIME *time, char *buf, size_t len); #include "transport_types.h" diff --git a/extra/yassl/src/handshake.cpp b/extra/yassl/src/handshake.cpp index 407e4092ccc..6e181a997bd 100644 --- a/extra/yassl/src/handshake.cpp +++ b/extra/yassl/src/handshake.cpp @@ -788,6 +788,16 @@ int DoProcessReply(SSL& ssl) needHdr = true; else { buffer >> hdr; + /* + According to RFC 4346 (see "7.4.1.3. Server Hello"), the Server Hello + packet needs to specify the highest supported TLS version, but not + higher than what client requests. YaSSL highest supported version is + TLSv1.1 (=3.2) - if the client requests a higher version, downgrade it + here to 3.2. + See also Appendix E of RFC 5246 (TLS 1.2) + */ + if (hdr.version_.major_ == 3 && hdr.version_.minor_ > 2) + hdr.version_.minor_ = 2; ssl.verifyState(hdr); } diff --git a/extra/yassl/src/ssl.cpp b/extra/yassl/src/ssl.cpp index cb845a34c8a..51e1bd1ab21 100644 --- a/extra/yassl/src/ssl.cpp +++ b/extra/yassl/src/ssl.cpp @@ -1736,7 +1736,7 @@ unsigned long ERR_get_error() // end stunnel needs - char *yaSSL_ASN1_TIME_to_string(ASN1_TIME *time, char *buf, size_t len) + char *yaSSL_ASN1_TIME_to_string(const ASN1_TIME *time, char *buf, size_t len) { tm t; static const char *month_names[12]= diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt index e6de8515fdc..8af7a1281b1 100644 --- a/include/CMakeLists.txt +++ b/include/CMakeLists.txt @@ -64,23 +64,51 @@ SET(HEADERS json_lib.h ) -INSTALL(FILES ${HEADERS} DESTINATION ${INSTALL_INCLUDEDIR} COMPONENT Development) +# don't use C/C's (possibly outdated) copy of mysqld_error.h +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/mysqld_error.h + DESTINATION ${INSTALL_INCLUDEDIR} COMPONENT Development) + +INSTALL(FILES ${HEADERS} + DESTINATION ${INSTALL_INCLUDEDIR}/server COMPONENT Development) FOREACH(f ${HEADERS_GEN_CONFIGURE}) - INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${f} DESTINATION ${INSTALL_INCLUDEDIR} COMPONENT Development PERMISSIONS OWNER_READ GROUP_READ WORLD_READ) + INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${f} + DESTINATION ${INSTALL_INCLUDEDIR}/server COMPONENT Development) ENDFOREACH(f) -INSTALL(DIRECTORY mysql/ DESTINATION ${INSTALL_INCLUDEDIR} COMPONENT Development FILES_MATCHING PATTERN "*.h") +INSTALL(DIRECTORY mysql/ DESTINATION ${INSTALL_INCLUDEDIR}/server/mysql COMPONENT Development FILES_MATCHING PATTERN "*.h") STRING(REPLACE "." "\\." EXCL_RE "${HEADERS};${HEADERS_GEN_CONFIGURE}") STRING(REPLACE ";" "|" EXCL_RE "${EXCL_RE}") -INSTALL(DIRECTORY . DESTINATION ${INSTALL_INCLUDEDIR}/private COMPONENT Development - FILES_MATCHING PATTERN "*.h" - PATTERN CMakeFiles EXCLUDE - PATTERN mysql EXCLUDE - REGEX "\\./(${EXCL_RE}$)" EXCLUDE) +MACRO(INSTALL_PRIVATE DIR) + INSTALL(DIRECTORY ${DIR}/. + DESTINATION ${INSTALL_INCLUDEDIR}/server/private COMPONENT Development + FILES_MATCHING PATTERN "*.h" + PATTERN CMakeFiles EXCLUDE + PATTERN mysql EXCLUDE + REGEX "\\./(${EXCL_RE}$)" EXCLUDE) +ENDMACRO() -INSTALL(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/. DESTINATION ${INSTALL_INCLUDEDIR}/private COMPONENT Development - FILES_MATCHING PATTERN "*.h" - PATTERN CMakeFiles EXCLUDE - PATTERN mysql EXCLUDE - REGEX "\\./(${EXCL_RE}$)" EXCLUDE) +INSTALL_PRIVATE(${CMAKE_CURRENT_BINARY_DIR}) +IF(NOT ${CMAKE_CURRENT_BINARY_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}) + INSTALL_PRIVATE(${CMAKE_CURRENT_SOURCE_DIR}) +ENDIF() + +MACRO(INSTALL_COMPAT_HEADER file footer) + INSTALL(CODE "FILE(WRITE \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${INSTALL_INCLUDEDIR}/${file} +\"/* Do not edit this file directly, it was auto-generated by cmake */ + +#warning This file should not be included by clients, include only +${footer} +\")" COMPONENT Development) +ENDMACRO() + +INSTALL_COMPAT_HEADER(my_global.h "") +INSTALL_COMPAT_HEADER(my_config.h "") +INSTALL_COMPAT_HEADER(my_sys.h "") +INSTALL_COMPAT_HEADER(mysql_version.h " +#include +#define LIBMYSQL_VERSION MARIADB_CLIENT_VERSION_STR +") +INSTALL_COMPAT_HEADER(mysql_com.h " +#include +") diff --git a/include/my_compiler.h b/include/my_compiler.h index 000d4e42848..97e6f9ae106 100644 --- a/include/my_compiler.h +++ b/include/my_compiler.h @@ -148,6 +148,29 @@ struct my_aligned_storage #define MY_ALIGNED(size) #endif +#ifdef __GNUC__ +# define ATTRIBUTE_NORETURN __attribute__((noreturn)) +# if MY_GNUC_PREREQ(4,3) +/** Starting with GCC 4.3, the "cold" attribute is used to inform the +compiler that a function is unlikely executed. The function is +optimized for size rather than speed and on many targets it is placed +into special subsection of the text section so all cold functions +appears close together improving code locality of non-cold parts of +program. The paths leading to call of cold functions within code are +marked as unlikely by the branch prediction mechanism. optimize a +rarely invoked function for size instead for speed. */ +# define ATTRIBUTE_COLD __attribute__((cold)) +# endif +#elif defined _WIN32 +# define ATTRIBUTE_NORETURN __declspec(noreturn) +#else +# define ATTRIBUTE_NORETURN /* empty */ +#endif + +#ifndef ATTRIBUTE_COLD +# define ATTRIBUTE_COLD /* empty */ +#endif + #include #endif /* MY_COMPILER_INCLUDED */ diff --git a/include/my_crypt.h b/include/my_crypt.h index e1e94c9bd9d..719e349bfb9 100644 --- a/include/my_crypt.h +++ b/include/my_crypt.h @@ -18,74 +18,7 @@ #ifndef MY_CRYPT_INCLUDED #define MY_CRYPT_INCLUDED -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* return values from my_aes_encrypt/my_aes_decrypt functions */ -#define MY_AES_OK 0 -#define MY_AES_BAD_DATA -100 -#define MY_AES_OPENSSL_ERROR -101 -#define MY_AES_BAD_KEYSIZE -102 - -/* The block size for all supported algorithms */ -#define MY_AES_BLOCK_SIZE 16 - -/* The max key length of all supported algorithms */ -#define MY_AES_MAX_KEY_LENGTH 32 - -#define MY_AES_CTX_SIZE 512 - -enum my_aes_mode { - MY_AES_ECB, MY_AES_CBC -#ifdef HAVE_EncryptAes128Ctr - , MY_AES_CTR -#endif -#ifdef HAVE_EncryptAes128Gcm - , MY_AES_GCM -#endif -}; - -int my_aes_crypt_init(void *ctx, enum my_aes_mode mode, int flags, - const unsigned char* key, unsigned int klen, - const unsigned char* iv, unsigned int ivlen); -int my_aes_crypt_update(void *ctx, const uchar *src, uint slen, - uchar *dst, uint *dlen); -int my_aes_crypt_finish(void *ctx, uchar *dst, uint *dlen); -int my_aes_crypt(enum my_aes_mode mode, int flags, - const uchar *src, uint slen, uchar *dst, uint *dlen, - const uchar *key, uint klen, const uchar *iv, uint ivlen); - -/* - calculate the length of the cyphertext from the length of the plaintext - for different AES encryption modes with padding enabled. - Without padding (ENCRYPTION_FLAG_NOPAD) cyphertext has the same length - as the plaintext -*/ -static inline uint my_aes_get_size(enum my_aes_mode mode __attribute__((unused)), uint source_length) -{ -#ifdef HAVE_EncryptAes128Ctr - if (mode == MY_AES_CTR) - return source_length; -#ifdef HAVE_EncryptAes128Gcm - if (mode == MY_AES_GCM) - return source_length + MY_AES_BLOCK_SIZE; -#endif -#endif - return (source_length / MY_AES_BLOCK_SIZE + 1) * MY_AES_BLOCK_SIZE; -} - -static inline uint my_aes_ctx_size(enum my_aes_mode mode __attribute__((unused))) -{ - return MY_AES_CTX_SIZE; -} - -int my_random_bytes(uchar* buf, int num); - -#ifdef __cplusplus -} -#endif +#include /* HAVE_EncryptAes128{Ctr,Gcm} */ +#include #endif /* MY_CRYPT_INCLUDED */ diff --git a/include/my_dir.h b/include/my_dir.h index be988ae790c..949a9a4d354 100644 --- a/include/my_dir.h +++ b/include/my_dir.h @@ -35,9 +35,16 @@ extern "C" { #define MY_S_ISUID S_ISUID /* set user id on execution */ #define MY_S_ISGID S_ISGID /* set group id on execution */ #define MY_S_ISVTX S_ISVTX /* save swapped text even after use */ -#define MY_S_IREAD S_IREAD /* read permission, owner */ -#define MY_S_IWRITE S_IWRITE /* write permission, owner */ -#define MY_S_IEXEC S_IEXEC /* execute/search permission, owner */ + +#ifndef S_IREAD +#define MY_S_IREAD S_IRUSR /* read permission, owner */ +#define MY_S_IWRITE S_IWUSR /* write permission, owner */ +#define MY_S_IEXEC S_IXUSR /* execute/search permission, owner */ +#else +#define MY_S_IREAD S_IREAD /* read permission, owner */ +#define MY_S_IWRITE S_IWRITE /* write permission, owner */ +#define MY_S_IEXEC S_IEXEC /* execute/search permission, owner */ +#endif #define MY_S_ISDIR(m) (((m) & MY_S_IFMT) == MY_S_IFDIR) #define MY_S_ISCHR(m) (((m) & MY_S_IFMT) == MY_S_IFCHR) diff --git a/include/my_global.h b/include/my_global.h index 7e31783e326..cb31ae233bd 100644 --- a/include/my_global.h +++ b/include/my_global.h @@ -1,6 +1,6 @@ /* Copyright (c) 2001, 2013, Oracle and/or its affiliates. - Copyright (c) 2010, 2017, MariaDB Corporation. + Copyright (c) 2009, 2017, MariaDB Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -437,9 +437,8 @@ extern "C" int madvise(void *addr, size_t len, int behav); #define SIGNAL_HANDLER_RESET_ON_DELIVERY #endif -#ifndef STDERR_FILENO -#define STDERR_FILENO fileno(stderr) -#endif +/* don't assume that STDERR_FILENO is 2, mysqld can freopen */ +#undef STDERR_FILENO #ifndef SO_EXT #ifdef _WIN32 diff --git a/include/my_handler_errors.h b/include/my_handler_errors.h index bdea4f71eaf..082e6effdab 100644 --- a/include/my_handler_errors.h +++ b/include/my_handler_errors.h @@ -24,11 +24,11 @@ static const char *handler_error_messages[]= { /* 120 */ - "Didn't find key on read or update", + "Didn't find the key on read or update", "Duplicate key on write or update", "Internal (unspecified) error in handler", - "Someone has changed the row since it was read (while the table was locked to prevent it)", - "Wrong index given to function", + "Someone has changed the row since it was read (even though the table was locked to prevent it)", + "Wrong index given to a function", "Undefined handler error 125", "Index is corrupted", "Table file is corrupted", @@ -36,7 +36,7 @@ static const char *handler_error_messages[]= "Undefined handler error 129", /* 130 */ "Incorrect file format", - "Command not supported by database", + "Command not supported by the engine", "Old database file", "No record read before update", "Record was already deleted (or record file crashed)", @@ -47,7 +47,7 @@ static const char *handler_error_messages[]= "Too big row", /* 140 */ "Wrong create options", - "Duplicate unique key or constraint on write or update", + "Duplicate unique key on write or update", "Unknown character set used in table", "Conflicting table definitions in sub-tables of MERGE table", "Table is crashed and last repair failed", @@ -62,13 +62,13 @@ static const char *handler_error_messages[]= "Cannot delete a parent row", "No savepoint with that name", "Non unique key block size", - "The table does not exist in engine", - "The table already existed in storage engine", - "Could not connect to storage engine", + "The table does not exist in the storage engine", + "The table already existed in the storage engine", + "Could not connect to the storage engine", "Unexpected null pointer found when using spatial index", - "The table changed in storage engine", + "The table changed in the storage engine", /* 160 */ - "There's no partition in table for the given value", + "There's no partition in the table for the given value", "Row-based binary logging of row failed", "Index needed in foreign key constraint", "Upholding foreign key constraints would lead to a duplicate key error in some other table", @@ -77,13 +77,13 @@ static const char *handler_error_messages[]= "Failed to get next auto increment value", "Failed to set row auto increment value", "Unknown (generic) error from engine", - "Record was not update. Original values was same as new values", + "Record was not updated. New values were the same as original values", /* 170 */ "It is not possible to log this statement", "The event was corrupt, leading to illegal data being read", "The table is of a new format not supported by this version", "The event could not be processed. No other handler error happened", - "Got a fatal error during initialization of handler", + "Fatal error during initialization of handler", "File too short; Expected more data in file", "Read page with wrong checksum", "Too many active concurrent transactions", @@ -105,7 +105,7 @@ static const char *handler_error_messages[]= "Too many words in a FTS phrase or proximity search", "Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.", "Foreign key cascade delete/update exceeds max depth", - "Tablespace is missing for table" + "Tablespace is missing for a table" }; #endif /* MYSYS_MY_HANDLER_ERRORS_INCLUDED */ diff --git a/include/my_pthread.h b/include/my_pthread.h index a69e0c49f55..672bca5ab39 100644 --- a/include/my_pthread.h +++ b/include/my_pthread.h @@ -346,6 +346,26 @@ int my_pthread_mutex_trylock(pthread_mutex_t *mutex); } while(0) #endif /* !set_timespec_time_nsec */ +#ifdef MYSQL_CLIENT +#define _current_thd() NULL +#elif defined(_WIN32) +#ifdef __cplusplus +extern "C" +#endif +MYSQL_THD _current_thd_noinline(); +#define _current_thd() _current_thd_noinline() +#else +/* + THR_THD is a key which will be used to set/get THD* for a thread, + using my_pthread_setspecific_ptr()/my_thread_getspecific_ptr(). +*/ +extern pthread_key(MYSQL_THD, THR_THD); +static inline MYSQL_THD _current_thd(void) +{ + return my_pthread_getspecific_ptr(MYSQL_THD,THR_THD); +} +#endif + /* safe_mutex adds checking to mutex for easier debugging */ struct st_hash; typedef struct st_safe_mutex_t diff --git a/include/my_sys.h b/include/my_sys.h index 9cc069d1fd3..fb3e15b64a4 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -42,6 +42,7 @@ typedef struct my_aio_result { #include /*for alloca*/ #endif #include +#include #define MY_INIT(name) { my_progname= name; my_init(); } @@ -104,18 +105,10 @@ typedef struct my_aio_result { #define MY_GIVE_INFO 2U /* Give time info about process*/ #define MY_DONT_FREE_DBUG 4U /* Do not call DBUG_END() in my_end() */ -#define ME_HIGHBYTE 8U /* Shift for colours */ -#define ME_NOCUR 1U /* Don't use curses message */ -#define ME_OLDWIN 2U /* Use old window */ -#define ME_BELL 4U /* Ring bell then printing message */ -#define ME_HOLDTANG 8U /* Don't delete last keys */ -#define ME_WAITTOT 16U /* Wait for errtime secs of for a action */ -#define ME_WAITTANG 32U /* Wait for a user action */ -#define ME_NOREFRESH 64U /* Write the error message to error log */ -#define ME_NOINPUT 128U /* Dont use the input libary */ -#define ME_COLOUR1 ((1U << ME_HIGHBYTE)) /* Possibly error-colours */ -#define ME_COLOUR2 ((2U << ME_HIGHBYTE)) -#define ME_COLOUR3 ((3U << ME_HIGHBYTE)) +#define ME_BELL 4U /* Ring bell then printing message */ +#define ME_WAITTANG 0 /* Wait for a user action */ +#define ME_NOREFRESH 64U /* Write the error message to error log */ +#define ME_NOINPUT 0 /* Dont use the input libary */ #define ME_JUST_INFO 1024U /**< not error but just info */ #define ME_JUST_WARNING 2048U /**< not error but just warning */ #define ME_FATALERROR 4096U /* Fatal statement error */ @@ -429,14 +422,6 @@ typedef struct st_io_cache /* Used when cacheing files */ /* The non-inclusive boundary of the valid write area */ uchar *write_end; - /* - Current_pos and current_end are convenience variables used by - my_b_tell() and other routines that need to know the current offset - current_pos points to &write_pos, and current_end to &write_end in a - WRITE_CACHE, and &read_pos and &read_end respectively otherwise - */ - uchar **current_pos, **current_end; - /* The lock is for append buffer used in SEQ_READ_APPEND cache need mutex copying from append buffer to read buffer. @@ -591,7 +576,11 @@ static inline size_t my_b_fill(IO_CACHE *info) static inline my_off_t my_b_tell(const IO_CACHE *info) { - return info->pos_in_file + (*info->current_pos - info->request_pos); + if (info->type == WRITE_CACHE) { + return info->pos_in_file + (info->write_pos - info->request_pos); + + } + return info->pos_in_file + (info->read_pos - info->request_pos); } static inline my_off_t my_b_write_tell(const IO_CACHE *info) @@ -616,7 +605,10 @@ static inline my_off_t my_b_get_pos_in_file(const IO_CACHE *info) static inline size_t my_b_bytes_in_cache(const IO_CACHE *info) { - return *info->current_end - *info->current_pos; + if (info->type == WRITE_CACHE) { + return info->write_end - info->write_pos; + } + return info->read_end - info->read_pos; } int my_b_copy_to_file(IO_CACHE *cache, FILE *file); @@ -725,12 +717,6 @@ extern int my_sync(File fd, myf my_flags); extern int my_sync_dir(const char *dir_name, myf my_flags); extern int my_sync_dir_by_file(const char *file_name, myf my_flags); extern const char *my_get_err_msg(uint nr); -extern void my_error(uint nr,myf MyFlags, ...); -extern void my_printf_error(uint my_err, const char *format, - myf MyFlags, ...) - ATTRIBUTE_FORMAT(printf, 2, 4); -extern void my_printv_error(uint error, const char *format, myf MyFlags, - va_list ap); extern int my_error_register(const char** (*get_errmsgs) (int nr), uint first, uint last); extern my_bool my_error_unregister(uint first, uint last); @@ -816,7 +802,6 @@ extern int init_io_cache(IO_CACHE *info,File file,size_t cachesize, extern my_bool reinit_io_cache(IO_CACHE *info,enum cache_type type, my_off_t seek_offset, my_bool use_async_io, my_bool clear_cache); -extern void setup_io_cache(IO_CACHE* info); extern void init_io_cache_share(IO_CACHE *read_cache, IO_CACHE_SHARE *cshare, IO_CACHE *write_cache, uint num_threads); @@ -962,6 +947,12 @@ extern ulonglong my_getcputime(void); #define hrtime_sec_part(X) ((ulong)((X).val % HRTIME_RESOLUTION)) #define my_time(X) hrtime_to_time(my_hrtime()) +#if STACK_DIRECTION < 0 +#define available_stack_size(CUR,END) (long) ((char*)(CUR) - (char*)(END)) +#else +#define available_stack_size(CUR,END) (long) ((char*)(END) - (char*)(CUR)) +#endif + #ifdef HAVE_SYS_MMAN_H #include diff --git a/include/mysql.h.pp b/include/mysql.h.pp index 517516aeb30..9c5d9fa4303 100644 --- a/include/mysql.h.pp +++ b/include/mysql.h.pp @@ -12,7 +12,8 @@ enum enum_server_command COM_UNIMPLEMENTED, COM_RESET_CONNECTION, COM_MDB_GAP_BEG, - COM_MDB_GAP_END=250, + COM_MDB_GAP_END=249, + COM_STMT_BULK_EXECUTE=250, COM_SLAVE_WORKER=251, COM_SLAVE_IO=252, COM_SLAVE_SQL=253, diff --git a/include/mysql/plugin.h b/include/mysql/plugin.h index 2f077d8440e..ad5a792173a 100644 --- a/include/mysql/plugin.h +++ b/include/mysql/plugin.h @@ -75,7 +75,7 @@ typedef struct st_mysql_xid MYSQL_XID; #define MYSQL_PLUGIN_INTERFACE_VERSION 0x0104 /* MariaDB plugin interface version */ -#define MARIA_PLUGIN_INTERFACE_VERSION 0x010c +#define MARIA_PLUGIN_INTERFACE_VERSION 0x010d /* The allowable types of plugins diff --git a/include/mysql/plugin_audit.h.pp b/include/mysql/plugin_audit.h.pp index 2adde48dc22..03f6f0caba0 100644 --- a/include/mysql/plugin_audit.h.pp +++ b/include/mysql/plugin_audit.h.pp @@ -137,6 +137,43 @@ size_t my_md5_context_size(); void my_md5_init(void *context); void my_md5_input(void *context, const unsigned char *buf, size_t len); void my_md5_result(void *context, unsigned char *digest); +enum my_aes_mode { + MY_AES_ECB, MY_AES_CBC +}; +extern struct my_crypt_service_st { + int (*my_aes_crypt_init)(void *ctx, enum my_aes_mode mode, int flags, + const unsigned char* key, unsigned int klen, + const unsigned char* iv, unsigned int ivlen); + int (*my_aes_crypt_update)(void *ctx, const unsigned char *src, unsigned int slen, + unsigned char *dst, unsigned int *dlen); + int (*my_aes_crypt_finish)(void *ctx, unsigned char *dst, unsigned int *dlen); + int (*my_aes_crypt)(enum my_aes_mode mode, int flags, + const unsigned char *src, unsigned int slen, unsigned char *dst, unsigned int *dlen, + const unsigned char *key, unsigned int klen, const unsigned char *iv, unsigned int ivlen); + unsigned int (*my_aes_get_size)(enum my_aes_mode mode, unsigned int source_length); + unsigned int (*my_aes_ctx_size)(enum my_aes_mode mode); + int (*my_random_bytes)(unsigned char* buf, int num); +} *my_crypt_service; +int my_aes_crypt_init(void *ctx, enum my_aes_mode mode, int flags, + const unsigned char* key, unsigned int klen, + const unsigned char* iv, unsigned int ivlen); +int my_aes_crypt_update(void *ctx, const unsigned char *src, unsigned int slen, + unsigned char *dst, unsigned int *dlen); +int my_aes_crypt_finish(void *ctx, unsigned char *dst, unsigned int *dlen); +int my_aes_crypt(enum my_aes_mode mode, int flags, + const unsigned char *src, unsigned int slen, unsigned char *dst, unsigned int *dlen, + const unsigned char *key, unsigned int klen, const unsigned char *iv, unsigned int ivlen); +int my_random_bytes(unsigned char* buf, int num); +unsigned int my_aes_get_size(enum my_aes_mode mode, unsigned int source_length); +unsigned int my_aes_ctx_size(enum my_aes_mode mode); +extern struct my_print_error_service_st { + void(*my_error_func)(unsigned int nr, unsigned long MyFlags, ...); + void(*my_printf_error_func)(unsigned int nr, const char *fmt, unsigned long MyFlags,...); + void(*my_printv_error_func)(unsigned int error, const char *format, unsigned long MyFlags, va_list ap); +} *my_print_error_service; +extern void my_error(unsigned int nr, unsigned long MyFlags, ...); +extern void my_printf_error(unsigned int my_err, const char *format, unsigned long MyFlags, ...); +extern void my_printv_error(unsigned int error, const char *format, unsigned long MyFlags,va_list ap); extern struct my_snprintf_service_st { size_t (*my_snprintf_type)(char*, size_t, const char*, ...); size_t (*my_vsnprintf_type)(char *, size_t, const char*, va_list); diff --git a/include/mysql/plugin_auth.h.pp b/include/mysql/plugin_auth.h.pp index a9cb8044c4f..07cdb1b5f52 100644 --- a/include/mysql/plugin_auth.h.pp +++ b/include/mysql/plugin_auth.h.pp @@ -137,6 +137,43 @@ size_t my_md5_context_size(); void my_md5_init(void *context); void my_md5_input(void *context, const unsigned char *buf, size_t len); void my_md5_result(void *context, unsigned char *digest); +enum my_aes_mode { + MY_AES_ECB, MY_AES_CBC +}; +extern struct my_crypt_service_st { + int (*my_aes_crypt_init)(void *ctx, enum my_aes_mode mode, int flags, + const unsigned char* key, unsigned int klen, + const unsigned char* iv, unsigned int ivlen); + int (*my_aes_crypt_update)(void *ctx, const unsigned char *src, unsigned int slen, + unsigned char *dst, unsigned int *dlen); + int (*my_aes_crypt_finish)(void *ctx, unsigned char *dst, unsigned int *dlen); + int (*my_aes_crypt)(enum my_aes_mode mode, int flags, + const unsigned char *src, unsigned int slen, unsigned char *dst, unsigned int *dlen, + const unsigned char *key, unsigned int klen, const unsigned char *iv, unsigned int ivlen); + unsigned int (*my_aes_get_size)(enum my_aes_mode mode, unsigned int source_length); + unsigned int (*my_aes_ctx_size)(enum my_aes_mode mode); + int (*my_random_bytes)(unsigned char* buf, int num); +} *my_crypt_service; +int my_aes_crypt_init(void *ctx, enum my_aes_mode mode, int flags, + const unsigned char* key, unsigned int klen, + const unsigned char* iv, unsigned int ivlen); +int my_aes_crypt_update(void *ctx, const unsigned char *src, unsigned int slen, + unsigned char *dst, unsigned int *dlen); +int my_aes_crypt_finish(void *ctx, unsigned char *dst, unsigned int *dlen); +int my_aes_crypt(enum my_aes_mode mode, int flags, + const unsigned char *src, unsigned int slen, unsigned char *dst, unsigned int *dlen, + const unsigned char *key, unsigned int klen, const unsigned char *iv, unsigned int ivlen); +int my_random_bytes(unsigned char* buf, int num); +unsigned int my_aes_get_size(enum my_aes_mode mode, unsigned int source_length); +unsigned int my_aes_ctx_size(enum my_aes_mode mode); +extern struct my_print_error_service_st { + void(*my_error_func)(unsigned int nr, unsigned long MyFlags, ...); + void(*my_printf_error_func)(unsigned int nr, const char *fmt, unsigned long MyFlags,...); + void(*my_printv_error_func)(unsigned int error, const char *format, unsigned long MyFlags, va_list ap); +} *my_print_error_service; +extern void my_error(unsigned int nr, unsigned long MyFlags, ...); +extern void my_printf_error(unsigned int my_err, const char *format, unsigned long MyFlags, ...); +extern void my_printv_error(unsigned int error, const char *format, unsigned long MyFlags,va_list ap); extern struct my_snprintf_service_st { size_t (*my_snprintf_type)(char*, size_t, const char*, ...); size_t (*my_vsnprintf_type)(char *, size_t, const char*, va_list); diff --git a/include/mysql/plugin_encryption.h.pp b/include/mysql/plugin_encryption.h.pp index 4675f0cf6ec..7275f0a982e 100644 --- a/include/mysql/plugin_encryption.h.pp +++ b/include/mysql/plugin_encryption.h.pp @@ -137,6 +137,43 @@ size_t my_md5_context_size(); void my_md5_init(void *context); void my_md5_input(void *context, const unsigned char *buf, size_t len); void my_md5_result(void *context, unsigned char *digest); +enum my_aes_mode { + MY_AES_ECB, MY_AES_CBC +}; +extern struct my_crypt_service_st { + int (*my_aes_crypt_init)(void *ctx, enum my_aes_mode mode, int flags, + const unsigned char* key, unsigned int klen, + const unsigned char* iv, unsigned int ivlen); + int (*my_aes_crypt_update)(void *ctx, const unsigned char *src, unsigned int slen, + unsigned char *dst, unsigned int *dlen); + int (*my_aes_crypt_finish)(void *ctx, unsigned char *dst, unsigned int *dlen); + int (*my_aes_crypt)(enum my_aes_mode mode, int flags, + const unsigned char *src, unsigned int slen, unsigned char *dst, unsigned int *dlen, + const unsigned char *key, unsigned int klen, const unsigned char *iv, unsigned int ivlen); + unsigned int (*my_aes_get_size)(enum my_aes_mode mode, unsigned int source_length); + unsigned int (*my_aes_ctx_size)(enum my_aes_mode mode); + int (*my_random_bytes)(unsigned char* buf, int num); +} *my_crypt_service; +int my_aes_crypt_init(void *ctx, enum my_aes_mode mode, int flags, + const unsigned char* key, unsigned int klen, + const unsigned char* iv, unsigned int ivlen); +int my_aes_crypt_update(void *ctx, const unsigned char *src, unsigned int slen, + unsigned char *dst, unsigned int *dlen); +int my_aes_crypt_finish(void *ctx, unsigned char *dst, unsigned int *dlen); +int my_aes_crypt(enum my_aes_mode mode, int flags, + const unsigned char *src, unsigned int slen, unsigned char *dst, unsigned int *dlen, + const unsigned char *key, unsigned int klen, const unsigned char *iv, unsigned int ivlen); +int my_random_bytes(unsigned char* buf, int num); +unsigned int my_aes_get_size(enum my_aes_mode mode, unsigned int source_length); +unsigned int my_aes_ctx_size(enum my_aes_mode mode); +extern struct my_print_error_service_st { + void(*my_error_func)(unsigned int nr, unsigned long MyFlags, ...); + void(*my_printf_error_func)(unsigned int nr, const char *fmt, unsigned long MyFlags,...); + void(*my_printv_error_func)(unsigned int error, const char *format, unsigned long MyFlags, va_list ap); +} *my_print_error_service; +extern void my_error(unsigned int nr, unsigned long MyFlags, ...); +extern void my_printf_error(unsigned int my_err, const char *format, unsigned long MyFlags, ...); +extern void my_printv_error(unsigned int error, const char *format, unsigned long MyFlags,va_list ap); extern struct my_snprintf_service_st { size_t (*my_snprintf_type)(char*, size_t, const char*, ...); size_t (*my_vsnprintf_type)(char *, size_t, const char*, va_list); diff --git a/include/mysql/plugin_ftparser.h.pp b/include/mysql/plugin_ftparser.h.pp index 34d968b60ab..eee69281afe 100644 --- a/include/mysql/plugin_ftparser.h.pp +++ b/include/mysql/plugin_ftparser.h.pp @@ -137,6 +137,43 @@ size_t my_md5_context_size(); void my_md5_init(void *context); void my_md5_input(void *context, const unsigned char *buf, size_t len); void my_md5_result(void *context, unsigned char *digest); +enum my_aes_mode { + MY_AES_ECB, MY_AES_CBC +}; +extern struct my_crypt_service_st { + int (*my_aes_crypt_init)(void *ctx, enum my_aes_mode mode, int flags, + const unsigned char* key, unsigned int klen, + const unsigned char* iv, unsigned int ivlen); + int (*my_aes_crypt_update)(void *ctx, const unsigned char *src, unsigned int slen, + unsigned char *dst, unsigned int *dlen); + int (*my_aes_crypt_finish)(void *ctx, unsigned char *dst, unsigned int *dlen); + int (*my_aes_crypt)(enum my_aes_mode mode, int flags, + const unsigned char *src, unsigned int slen, unsigned char *dst, unsigned int *dlen, + const unsigned char *key, unsigned int klen, const unsigned char *iv, unsigned int ivlen); + unsigned int (*my_aes_get_size)(enum my_aes_mode mode, unsigned int source_length); + unsigned int (*my_aes_ctx_size)(enum my_aes_mode mode); + int (*my_random_bytes)(unsigned char* buf, int num); +} *my_crypt_service; +int my_aes_crypt_init(void *ctx, enum my_aes_mode mode, int flags, + const unsigned char* key, unsigned int klen, + const unsigned char* iv, unsigned int ivlen); +int my_aes_crypt_update(void *ctx, const unsigned char *src, unsigned int slen, + unsigned char *dst, unsigned int *dlen); +int my_aes_crypt_finish(void *ctx, unsigned char *dst, unsigned int *dlen); +int my_aes_crypt(enum my_aes_mode mode, int flags, + const unsigned char *src, unsigned int slen, unsigned char *dst, unsigned int *dlen, + const unsigned char *key, unsigned int klen, const unsigned char *iv, unsigned int ivlen); +int my_random_bytes(unsigned char* buf, int num); +unsigned int my_aes_get_size(enum my_aes_mode mode, unsigned int source_length); +unsigned int my_aes_ctx_size(enum my_aes_mode mode); +extern struct my_print_error_service_st { + void(*my_error_func)(unsigned int nr, unsigned long MyFlags, ...); + void(*my_printf_error_func)(unsigned int nr, const char *fmt, unsigned long MyFlags,...); + void(*my_printv_error_func)(unsigned int error, const char *format, unsigned long MyFlags, va_list ap); +} *my_print_error_service; +extern void my_error(unsigned int nr, unsigned long MyFlags, ...); +extern void my_printf_error(unsigned int my_err, const char *format, unsigned long MyFlags, ...); +extern void my_printv_error(unsigned int error, const char *format, unsigned long MyFlags,va_list ap); extern struct my_snprintf_service_st { size_t (*my_snprintf_type)(char*, size_t, const char*, ...); size_t (*my_vsnprintf_type)(char *, size_t, const char*, va_list); diff --git a/include/mysql/plugin_password_validation.h.pp b/include/mysql/plugin_password_validation.h.pp index 5a642a55d08..adb0afc734d 100644 --- a/include/mysql/plugin_password_validation.h.pp +++ b/include/mysql/plugin_password_validation.h.pp @@ -137,6 +137,43 @@ size_t my_md5_context_size(); void my_md5_init(void *context); void my_md5_input(void *context, const unsigned char *buf, size_t len); void my_md5_result(void *context, unsigned char *digest); +enum my_aes_mode { + MY_AES_ECB, MY_AES_CBC +}; +extern struct my_crypt_service_st { + int (*my_aes_crypt_init)(void *ctx, enum my_aes_mode mode, int flags, + const unsigned char* key, unsigned int klen, + const unsigned char* iv, unsigned int ivlen); + int (*my_aes_crypt_update)(void *ctx, const unsigned char *src, unsigned int slen, + unsigned char *dst, unsigned int *dlen); + int (*my_aes_crypt_finish)(void *ctx, unsigned char *dst, unsigned int *dlen); + int (*my_aes_crypt)(enum my_aes_mode mode, int flags, + const unsigned char *src, unsigned int slen, unsigned char *dst, unsigned int *dlen, + const unsigned char *key, unsigned int klen, const unsigned char *iv, unsigned int ivlen); + unsigned int (*my_aes_get_size)(enum my_aes_mode mode, unsigned int source_length); + unsigned int (*my_aes_ctx_size)(enum my_aes_mode mode); + int (*my_random_bytes)(unsigned char* buf, int num); +} *my_crypt_service; +int my_aes_crypt_init(void *ctx, enum my_aes_mode mode, int flags, + const unsigned char* key, unsigned int klen, + const unsigned char* iv, unsigned int ivlen); +int my_aes_crypt_update(void *ctx, const unsigned char *src, unsigned int slen, + unsigned char *dst, unsigned int *dlen); +int my_aes_crypt_finish(void *ctx, unsigned char *dst, unsigned int *dlen); +int my_aes_crypt(enum my_aes_mode mode, int flags, + const unsigned char *src, unsigned int slen, unsigned char *dst, unsigned int *dlen, + const unsigned char *key, unsigned int klen, const unsigned char *iv, unsigned int ivlen); +int my_random_bytes(unsigned char* buf, int num); +unsigned int my_aes_get_size(enum my_aes_mode mode, unsigned int source_length); +unsigned int my_aes_ctx_size(enum my_aes_mode mode); +extern struct my_print_error_service_st { + void(*my_error_func)(unsigned int nr, unsigned long MyFlags, ...); + void(*my_printf_error_func)(unsigned int nr, const char *fmt, unsigned long MyFlags,...); + void(*my_printv_error_func)(unsigned int error, const char *format, unsigned long MyFlags, va_list ap); +} *my_print_error_service; +extern void my_error(unsigned int nr, unsigned long MyFlags, ...); +extern void my_printf_error(unsigned int my_err, const char *format, unsigned long MyFlags, ...); +extern void my_printv_error(unsigned int error, const char *format, unsigned long MyFlags,va_list ap); extern struct my_snprintf_service_st { size_t (*my_snprintf_type)(char*, size_t, const char*, ...); size_t (*my_vsnprintf_type)(char *, size_t, const char*, va_list); diff --git a/include/mysql/psi/mysql_file.h b/include/mysql/psi/mysql_file.h index 2f388c285bf..be9d7116b9b 100644 --- a/include/mysql/psi/mysql_file.h +++ b/include/mysql/psi/mysql_file.h @@ -1423,4 +1423,3 @@ inline_mysql_file_sync( /** @} (end of group File_instrumentation) */ #endif - diff --git a/include/mysql/service_my_crypt.h b/include/mysql/service_my_crypt.h new file mode 100644 index 00000000000..83de0378e4a --- /dev/null +++ b/include/mysql/service_my_crypt.h @@ -0,0 +1,120 @@ +#ifndef MYSQL_SERVICE_MY_CRYPT_INCLUDED +#define MYSQL_SERVICE_MY_CRYPT_INCLUDED + +/* + Copyright (c) 2014 Google Inc. + Copyright (c) 2014, 2015 MariaDB Corporation + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +/** + @file + my crypt service + + AES encryption functions, and a function to generate random bytes. + + Include my_config.h before this file to use CTR and GCM modes + (they only work if server was compiled with openssl). +*/ + + +#ifdef __cplusplus +extern "C" { +#endif + +/* return values from my_aes_encrypt/my_aes_decrypt functions */ +#define MY_AES_OK 0 +#define MY_AES_BAD_DATA -100 +#define MY_AES_OPENSSL_ERROR -101 +#define MY_AES_BAD_KEYSIZE -102 + +/* The block size for all supported algorithms */ +#define MY_AES_BLOCK_SIZE 16 + +/* The max key length of all supported algorithms */ +#define MY_AES_MAX_KEY_LENGTH 32 + +#define MY_AES_CTX_SIZE 512 + +enum my_aes_mode { + MY_AES_ECB, MY_AES_CBC +#ifdef HAVE_EncryptAes128Ctr + , MY_AES_CTR +#endif +#ifdef HAVE_EncryptAes128Gcm + , MY_AES_GCM +#endif +}; + +extern struct my_crypt_service_st { + int (*my_aes_crypt_init)(void *ctx, enum my_aes_mode mode, int flags, + const unsigned char* key, unsigned int klen, + const unsigned char* iv, unsigned int ivlen); + int (*my_aes_crypt_update)(void *ctx, const unsigned char *src, unsigned int slen, + unsigned char *dst, unsigned int *dlen); + int (*my_aes_crypt_finish)(void *ctx, unsigned char *dst, unsigned int *dlen); + int (*my_aes_crypt)(enum my_aes_mode mode, int flags, + const unsigned char *src, unsigned int slen, unsigned char *dst, unsigned int *dlen, + const unsigned char *key, unsigned int klen, const unsigned char *iv, unsigned int ivlen); + unsigned int (*my_aes_get_size)(enum my_aes_mode mode, unsigned int source_length); + unsigned int (*my_aes_ctx_size)(enum my_aes_mode mode); + int (*my_random_bytes)(unsigned char* buf, int num); +} *my_crypt_service; + +#ifdef MYSQL_DYNAMIC_PLUGIN + +#define my_aes_crypt_init(A,B,C,D,E,F,G) \ + my_crypt_service->my_aes_crypt_init(A,B,C,D,E,F,G) + +#define my_aes_crypt_update(A,B,C,D,E) \ + my_crypt_service->my_aes_crypt_update(A,B,C,D,E) + +#define my_aes_crypt_finish(A,B,C) \ + my_crypt_service->my_aes_crypt_finish(A,B,C) + +#define my_aes_crypt(A,B,C,D,E,F,G,H,I,J) \ + my_crypt_service->my_aes_crypt(A,B,C,D,E,F,G,H,I,J) + +#define my_aes_get_size(A,B)\ + my_crypt_service->my_aes_get_size(A,B) + +#define my_aes_ctx_size(A)\ + my_crypt_service->my_aes_ctx_size(A) + +#define my_random_bytes(A,B)\ + my_crypt_service->my_random_bytes(A,B) + +#else + +int my_aes_crypt_init(void *ctx, enum my_aes_mode mode, int flags, + const unsigned char* key, unsigned int klen, + const unsigned char* iv, unsigned int ivlen); +int my_aes_crypt_update(void *ctx, const unsigned char *src, unsigned int slen, + unsigned char *dst, unsigned int *dlen); +int my_aes_crypt_finish(void *ctx, unsigned char *dst, unsigned int *dlen); +int my_aes_crypt(enum my_aes_mode mode, int flags, + const unsigned char *src, unsigned int slen, unsigned char *dst, unsigned int *dlen, + const unsigned char *key, unsigned int klen, const unsigned char *iv, unsigned int ivlen); + +int my_random_bytes(unsigned char* buf, int num); +unsigned int my_aes_get_size(enum my_aes_mode mode, unsigned int source_length); +unsigned int my_aes_ctx_size(enum my_aes_mode mode); +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* MYSQL_SERVICE_MY_CRYPT_INCLUDED */ diff --git a/include/mysql/service_my_print_error.h b/include/mysql/service_my_print_error.h new file mode 100644 index 00000000000..636151655e5 --- /dev/null +++ b/include/mysql/service_my_print_error.h @@ -0,0 +1,64 @@ +/* Copyright (c) 2016, MariaDB + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +#ifndef MYSQL_SERVICE_MY_PRINT_ERROR_INCLUDED +#define MYSQL_SERVICE_MY_PRINT_ERROR_INCLUDED + +/** + @file include/mysql/service_my_print_error.h + + This service provides functions for plugins to report + errors to client (without client, the errors are written to the error log). + +*/ +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef MYSQL_ABI_CHECK +#include +#include +#endif + +#define ME_ERROR_LOG 64 /* Write the message to the error log */ +#define ME_NOTE 1024 /* Not an error, just a note */ +#define ME_WARNING 2048 /* Not an error, just a warning */ +#define ME_FATAL 4096 /* Fatal statement error */ + +extern struct my_print_error_service_st { + void (*my_error_func)(unsigned int nr, unsigned long MyFlags, ...); + void (*my_printf_error_func)(unsigned int nr, const char *fmt, unsigned long MyFlags,...); + void (*my_printv_error_func)(unsigned int error, const char *format, unsigned long MyFlags, va_list ap); +} *my_print_error_service; + +#ifdef MYSQL_DYNAMIC_PLUGIN + +#define my_error my_print_error_service->my_error_func +#define my_printf_error my_print_error_service->my_printf_error_func +#define my_printv_error(A,B,C,D) my_print_error_service->my_printv_error_func(A,B,C,D) + +#else + +extern void my_error(unsigned int nr, unsigned long MyFlags, ...); +extern void my_printf_error(unsigned int my_err, const char *format, unsigned long MyFlags, ...); +extern void my_printv_error(unsigned int error, const char *format, unsigned long MyFlags,va_list ap); +#endif + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/include/mysql/services.h b/include/mysql/services.h index 420f2430a36..6168c5ed8dc 100644 --- a/include/mysql/services.h +++ b/include/mysql/services.h @@ -26,6 +26,8 @@ extern "C" { #include #include #include +#include +#include #include #include #include diff --git a/include/mysql_com.h b/include/mysql_com.h index ace54767b06..06c934bf9bd 100644 --- a/include/mysql_com.h +++ b/include/mysql_com.h @@ -115,7 +115,8 @@ enum enum_server_command COM_RESET_CONNECTION, /* don't forget to update const char *command_name[] in sql_parse.cc */ COM_MDB_GAP_BEG, - COM_MDB_GAP_END=250, + COM_MDB_GAP_END=249, + COM_STMT_BULK_EXECUTE=250, COM_SLAVE_WORKER=251, COM_SLAVE_IO=252, COM_SLAVE_SQL=253, @@ -136,6 +137,13 @@ enum enum_indicator_type STMT_INDICATOR_IGNORE }; +/* + bulk PS flags +*/ +#define STMT_BULK_FLAG_CLIENT_SEND_TYPES 128 +#define STMT_BULK_FLAG_INSERT_ID_REQUEST 64 + + /* sql type stored in .frm files for virtual fields */ #define MYSQL_TYPE_VIRTUAL 245 /* @@ -311,7 +319,8 @@ enum enum_indicator_type CLIENT_SESSION_TRACK |\ CLIENT_DEPRECATE_EOF |\ CLIENT_CONNECT_ATTRS |\ - MARIADB_CLIENT_COM_MULTI) + MARIADB_CLIENT_COM_MULTI |\ + MARIADB_CLIENT_STMT_BULK_OPERATIONS) /* To be added later: @@ -378,7 +387,9 @@ enum enum_indicator_type This status flag, when on, implies that one of the state information has changed on the server because of the execution of the last statement. */ -#define SERVER_SESSION_STATE_CHANGED (1UL << 14) +#define SERVER_SESSION_STATE_CHANGED 16384U + +#define SERVER_STATUS_ANSI_QUOTES 32768U /** Server status flags that must be cleared when starting diff --git a/include/service_versions.h b/include/service_versions.h index d79474f1d36..da7a2101f76 100644 --- a/include/service_versions.h +++ b/include/service_versions.h @@ -27,14 +27,16 @@ #define VERSION_encryption 0x0300 #define VERSION_encryption_scheme 0x0100 #define VERSION_logger 0x0100 +#define VERSION_my_crypt 0x0100 #define VERSION_my_md5 0x0100 +#define VERSION_my_print_error 0x0100 #define VERSION_my_sha1 0x0101 #define VERSION_my_sha2 0x0100 #define VERSION_my_snprintf 0x0100 #define VERSION_progress_report 0x0100 #define VERSION_thd_alloc 0x0100 #define VERSION_thd_autoinc 0x0100 -#define VERSION_thd_error_context 0x0100 +#define VERSION_thd_error_context 0x0200 #define VERSION_thd_rnd 0x0100 #define VERSION_thd_specifics 0x0100 #define VERSION_thd_timezone 0x0100 diff --git a/include/ssl_compat.h b/include/ssl_compat.h new file mode 100644 index 00000000000..568af6e1db4 --- /dev/null +++ b/include/ssl_compat.h @@ -0,0 +1,96 @@ +/* + Copyright (c) 2016, 2017 MariaDB Corporation + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include + +/* OpenSSL version specific definitions */ +#if !defined(HAVE_YASSL) && defined(OPENSSL_VERSION_NUMBER) + +#if OPENSSL_VERSION_NUMBER >= 0x10002000L && !defined(LIBRESSL_VERSION_NUMBER) +#define HAVE_X509_check_host 1 +#endif + +#if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER) +#define HAVE_OPENSSL11 1 +#define SSL_LIBRARY OpenSSL_version(OPENSSL_VERSION) +#define ERR_remove_state(X) ERR_clear_error() +#define EVP_CIPHER_CTX_SIZE 168 +#define EVP_MD_CTX_SIZE 48 +#undef EVP_MD_CTX_init +#define EVP_MD_CTX_init(X) do { bzero((X), EVP_MD_CTX_SIZE); EVP_MD_CTX_reset(X); } while(0) +#undef EVP_CIPHER_CTX_init +#define EVP_CIPHER_CTX_init(X) do { bzero((X), EVP_CIPHER_CTX_SIZE); EVP_CIPHER_CTX_reset(X); } while(0) + +/* + Macros below are deprecated. OpenSSL 1.1 may define them or not, + depending on how it was built. +*/ +#undef ERR_free_strings +#define ERR_free_strings() +#undef EVP_cleanup +#define EVP_cleanup() +#undef CRYPTO_cleanup_all_ex_data +#define CRYPTO_cleanup_all_ex_data() +#undef SSL_load_error_strings +#define SSL_load_error_strings() + +#else +#define HAVE_OPENSSL10 1 +#define SSL_LIBRARY SSLeay_version(SSLEAY_VERSION) + +/* + Unfortunately RAND_bytes manual page does not provide any guarantees + in relation to blocking behavior. Here we explicitly use SSLeay random + instead of whatever random engine is currently set in OpenSSL. That way + we are guaranteed to have a non-blocking random. +*/ +#define RAND_OpenSSL() RAND_SSLeay() + +#ifdef HAVE_ERR_remove_thread_state +#define ERR_remove_state(X) ERR_remove_thread_state(NULL) +#endif /* HAVE_ERR_remove_thread_state */ + +#endif /* HAVE_OPENSSL11 */ + +#elif defined(HAVE_YASSL) +#define SSL_LIBRARY "YaSSL " YASSL_VERSION +#define BN_free(X) do { } while(0) +#endif /* !defined(HAVE_YASSL) */ + +#ifndef HAVE_OPENSSL11 +#define ASN1_STRING_get0_data(X) ASN1_STRING_data(X) +#define OPENSSL_init_ssl(X,Y) SSL_library_init() +#define DH_set0_pqg(D,P,Q,G) ((D)->p= (P), (D)->g= (G)) +#define EVP_CIPHER_CTX_buf_noconst(ctx) ((ctx)->buf) +#define EVP_CIPHER_CTX_encrypting(ctx) ((ctx)->encrypt) +#define EVP_CIPHER_CTX_SIZE sizeof(EVP_CIPHER_CTX) +#define EVP_MD_CTX_SIZE sizeof(EVP_MD_CTX) + +#define EVP_MD_CTX_reset(X) EVP_MD_CTX_cleanup(X) +#define EVP_CIPHER_CTX_reset(X) EVP_CIPHER_CTX_cleanup(X) +#define X509_get0_notBefore(X) X509_get_notBefore(X) +#define X509_get0_notAfter(X) X509_get_notAfter(X) +#endif + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +int check_openssl_compatibility(); + +#ifdef __cplusplus +} +#endif diff --git a/include/violite.h b/include/violite.h index 6047c7c8fd4..5dcf27dbab1 100644 --- a/include/violite.h +++ b/include/violite.h @@ -123,13 +123,6 @@ int vio_getnameinfo(const struct sockaddr *sa, int flags); #ifdef HAVE_OPENSSL -#include -#if OPENSSL_VERSION_NUMBER < 0x0090700f -#define DES_cblock des_cblock -#define DES_key_schedule des_key_schedule -#define DES_set_key_unchecked(k,ks) des_set_key_unchecked((k),*(ks)) -#define DES_ede3_cbc_encrypt(i,o,l,k1,k2,k3,iv,e) des_ede3_cbc_encrypt((i),(o),(l),*(k1),*(k2),*(k3),(iv),(e)) -#endif /* apple deprecated openssl in MacOSX Lion */ #ifdef __APPLE__ #pragma GCC diagnostic ignored "-Wdeprecated-declarations" @@ -146,14 +139,10 @@ typedef my_socket YASSL_SOCKET_T; #include #include -#ifdef HAVE_ERR_remove_thread_state -#define ERR_remove_state(X) ERR_remove_thread_state(NULL) -#endif - enum enum_ssl_init_error { - SSL_INITERR_NOERROR= 0, SSL_INITERR_CERT, SSL_INITERR_KEY, - SSL_INITERR_NOMATCH, SSL_INITERR_BAD_PATHS, SSL_INITERR_CIPHERS, + SSL_INITERR_NOERROR= 0, SSL_INITERR_CERT, SSL_INITERR_KEY, + SSL_INITERR_NOMATCH, SSL_INITERR_BAD_PATHS, SSL_INITERR_CIPHERS, SSL_INITERR_MEMFAIL, SSL_INITERR_DH, SSL_INITERR_LASTERR }; const char* sslGetErrString(enum enum_ssl_init_error err); diff --git a/include/welcome_copyright_notice.h b/include/welcome_copyright_notice.h index e9891856221..cd7cd6692be 100644 --- a/include/welcome_copyright_notice.h +++ b/include/welcome_copyright_notice.h @@ -1,5 +1,5 @@ -/* Copyright (c) 2011, 2016, Oracle and/or its affiliates. - Copyright (c) 2011, 2016, MariaDB +/* Copyright (c) 2011, 2017, Oracle and/or its affiliates. + Copyright (c) 2011, 2017, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,7 +17,7 @@ #ifndef _welcome_copyright_notice_h_ #define _welcome_copyright_notice_h_ -#define COPYRIGHT_NOTICE_CURRENT_YEAR "2016" +#define COPYRIGHT_NOTICE_CURRENT_YEAR "2017" /* This define specifies copyright notice which is displayed by every MySQL diff --git a/include/wsrep.h b/include/wsrep.h index 532e4339f10..0c06bb32b31 100644 --- a/include/wsrep.h +++ b/include/wsrep.h @@ -45,6 +45,10 @@ #define WSREP_WARN(...) WSREP_LOG(sql_print_warning, ##__VA_ARGS__) #define WSREP_ERROR(...) WSREP_LOG(sql_print_error, ##__VA_ARGS__) +#define WSREP_SYNC_WAIT(thd_, before_) \ + { if (WSREP_CLIENT(thd_) && \ + wsrep_sync_wait(thd_, before_)) goto error; } + #else #define IF_WSREP(A,B) B #define DBUG_ASSERT_IF_WSREP(A) @@ -55,6 +59,8 @@ #define WSREP_TO_ISOLATION_BEGIN(db_, table_, table_list_) #define WSREP_TO_ISOLATION_END #define WSREP_TO_ISOLATION_BEGIN_WRTCHK(db_, table_, table_list_) -#endif +#define WSREP_SYNC_WAIT(thd_, before_) -#endif /* WSERP_INCLUDED */ +#endif /* WITH_WSREP */ + +#endif /* WSREP_INCLUDED */ diff --git a/libmariadb b/libmariadb index d1387356292..11321f16bfc 160000 --- a/libmariadb +++ b/libmariadb @@ -1 +1 @@ -Subproject commit d1387356292fb840c7736aeb8f449310c3139087 +Subproject commit 11321f16bfcd92e210d5736af7b7d5073a89c2ef diff --git a/libmysqld/CMakeLists.txt b/libmysqld/CMakeLists.txt index 5516cd7013a..0022bb1442d 100644 --- a/libmysqld/CMakeLists.txt +++ b/libmysqld/CMakeLists.txt @@ -158,7 +158,7 @@ ENDFOREACH() MERGE_LIBRARIES(mysqlserver STATIC ${EMBEDDED_LIBS} OUTPUT_NAME ${MYSQLSERVER_OUTPUT_NAME} COMPONENT ${COMPONENT_MYSQLSERVER}) -INSTALL(FILES embedded_priv.h DESTINATION ${INSTALL_INCLUDEDIR}/private COMPONENT ${COMPONENT_MYSQLSERVER}) +INSTALL(FILES embedded_priv.h DESTINATION ${INSTALL_INCLUDEDIR}/server/private COMPONENT ${COMPONENT_MYSQLSERVER}) # Visual Studio users need debug static library IF(MSVC) diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc index 555eadc9425..d6f77e68183 100644 --- a/libmysqld/lib_sql.cc +++ b/libmysqld/lib_sql.cc @@ -140,8 +140,7 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command, } /* Clear result variables */ - thd->clear_error(); - thd->get_stmt_da()->reset_diagnostics_area(); + thd->clear_error(1); mysql->affected_rows= ~(my_ulonglong) 0; mysql->field_count= 0; net_clear_error(net); diff --git a/libmysqld/libmysql.c b/libmysqld/libmysql.c index 09d5abbbb6a..d06b32b0625 100644 --- a/libmysqld/libmysql.c +++ b/libmysqld/libmysql.c @@ -1,5 +1,5 @@ -/* Copyright (c) 2000, 2014, Oracle and/or its affiliates. - Copyright (c) 2009, 2014, SkySQL Ab. +/* Copyright (c) 2000, 2014, Oracle and/or its affiliates + Copyright (c) 2009, 2017, MariaDB Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -122,7 +122,9 @@ typedef struct st_mysql_stmt_extension 1 could not initialize environment (out of memory or thread keys) */ -int STDCALL mysql_server_init(int argc, char **argv, char **groups) +int STDCALL mysql_server_init(int argc __attribute__((unused)), + char **argv __attribute__((unused)), + char **groups __attribute__((unused))) { int result= 0; if (!mysql_client_init) @@ -1404,7 +1406,7 @@ void set_stmt_errmsg(MYSQL_STMT *stmt, NET *net) DBUG_ASSERT(stmt != 0); stmt->last_errno= net->last_errno; - if (net->last_error && net->last_error[0]) + if (net->last_error[0]) strmov(stmt->last_error, net->last_error); strmov(stmt->sqlstate, net->sqlstate); @@ -4707,8 +4709,7 @@ my_bool STDCALL mysql_stmt_close(MYSQL_STMT *stmt) { uchar buff[MYSQL_STMT_HEADER]; /* 4 bytes - stmt id */ - if ((rc= reset_stmt_handle(stmt, RESET_ALL_BUFFERS | RESET_CLEAR_ERROR))) - return rc; + reset_stmt_handle(stmt, RESET_ALL_BUFFERS | RESET_CLEAR_ERROR); int4store(buff, stmt->stmt_id); if ((rc= stmt_command(mysql, COM_STMT_CLOSE, buff, 4, stmt))) @@ -4918,4 +4919,3 @@ ulong STDCALL mysql_net_field_length(uchar **packet) { return net_field_length(packet); } - diff --git a/libservices/CMakeLists.txt b/libservices/CMakeLists.txt index 0b68a156077..e20be6d7a7c 100644 --- a/libservices/CMakeLists.txt +++ b/libservices/CMakeLists.txt @@ -22,7 +22,9 @@ SET(MYSQLSERVICES_SOURCES encryption_service.c kill_statement_service.c logger_service.c + my_crypt_service.c my_md5_service.c + my_print_error_service.c my_sha1_service.c my_sha2_service.c my_snprintf_service.c @@ -35,7 +37,7 @@ SET(MYSQLSERVICES_SOURCES thd_timezone_service.c thd_wait_service.c wsrep_service.c -) + ) ADD_CONVENIENCE_LIBRARY(mysqlservices ${MYSQLSERVICES_SOURCES}) INSTALL(TARGETS mysqlservices DESTINATION ${INSTALL_LIBDIR} COMPONENT Development) diff --git a/libservices/my_crypt_service.c b/libservices/my_crypt_service.c new file mode 100644 index 00000000000..e6b9e273094 --- /dev/null +++ b/libservices/my_crypt_service.c @@ -0,0 +1,2 @@ +#include +SERVICE_VERSION my_crypt_service= (void*)VERSION_my_crypt; diff --git a/libservices/my_print_error_service.c b/libservices/my_print_error_service.c new file mode 100644 index 00000000000..7642668d470 --- /dev/null +++ b/libservices/my_print_error_service.c @@ -0,0 +1,17 @@ +/* Copyright (c) 2016 MariaDB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include +SERVICE_VERSION my_print_error_service= (void*)VERSION_my_print_error; \ No newline at end of file diff --git a/man/galera_new_cluster.1 b/man/galera_new_cluster.1 index 72c46edc54a..9765141a20c 100644 --- a/man/galera_new_cluster.1 +++ b/man/galera_new_cluster.1 @@ -11,6 +11,26 @@ .SH NAME galera_new_cluster \- starting a new Galera cluster .SH DESCRIPTION -Use: Starting a new Galera Cluster\. +Used to bootstrap a new Galera Cluster when all nodes are down\&. +Run galera_new_cluster on the first node only\&. +On the remaining nodes simply run 'service @DAEMON_NAME@ start'\&. .PP -For more information, please refer to the MariaDB Knowledge Base, available online at https://mariadb.com/kb/ +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +.\" galera_new_cluster: help option +.\" help option: galera_new_cluster +\fB\-\-help\fR, +\fB\-h\fR +.sp +Display a help message and exit\&. +.PP +.sp +.SH "SEE ALSO" +For more information on configuration and usage see +https://mariadb.com/kb/en/mariadb/getting-started-with-mariadb-galera-cluster/ diff --git a/man/mysqldump.1 b/man/mysqldump.1 index 7e7e455e020..e12a9d7eaf7 100644 --- a/man/mysqldump.1 +++ b/man/mysqldump.1 @@ -272,6 +272,25 @@ statement\&. .sp -1 .IP \(bu 2.3 .\} +.\" mysqldump: add-drop-trigger option +.\" add-drop-trigger option: mysqldump +\fB\-\-add\-drop\-trigger\fR +.sp +Add a +DROP TRIGGER +statement before each +CREATE TRIGGER +statement\&. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} .\" mysqldump: add-locks option .\" add-locks option: mysqldump \fB\-\-add\-locks\fR diff --git a/mysql-test/CMakeLists.txt b/mysql-test/CMakeLists.txt index 1c7cfaf81da..7e5ef3fb8df 100644 --- a/mysql-test/CMakeLists.txt +++ b/mysql-test/CMakeLists.txt @@ -22,6 +22,7 @@ IF(NOT ${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) ${CMAKE_CURRENT_BINARY_DIR}/mysql-test-run.pl @ONLY ) + SET(out_of_source_build TRUE) ENDIF() IF(UNIX) EXECUTE_PROCESS( @@ -32,9 +33,9 @@ IF(UNIX) ./mysql-test-run.pl mysql-test-run WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) - IF(INSTALL_MYSQLTESTDIR) - INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/mtr - ${CMAKE_CURRENT_BINARY_DIR}/mysql-test-run + IF(INSTALL_MYSQLTESTDIR AND out_of_source_build) + INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/mtr + ${CMAKE_CURRENT_BINARY_DIR}/mysql-test-run DESTINATION ${INSTALL_MYSQLTESTDIR} COMPONENT Test) ENDIF() diff --git a/mysql-test/collections/buildbot_suites.bat b/mysql-test/collections/buildbot_suites.bat index f91692d2918..89e68919c7f 100644 --- a/mysql-test/collections/buildbot_suites.bat +++ b/mysql-test/collections/buildbot_suites.bat @@ -2,4 +2,5 @@ perl mysql-test-run.pl --verbose-restart --force --testcase-timeout=45 --suite-t main,^ innodb,^ plugins,^ +mariabackup,^ rocksdb diff --git a/mysql-test/disabled.def b/mysql-test/disabled.def index e82ddcf92d1..b489139a59f 100644 --- a/mysql-test/disabled.def +++ b/mysql-test/disabled.def @@ -12,7 +12,6 @@ tablespace : disabled in MariaDB (no TABLESPACE table attribute) events_time_zone : Test is not predictable as it depends on precise timing. read_many_rows_innodb : Bug#11748886 2010-11-15 mattiasj report already exists -log_tables-big : Bug#11756699 2010-11-15 mattiasj report already exists mysql_embedded : Bug#12561297 2011-05-14 Anitha Dependent on PB2 changes - eventum#41836 #show_explain : Psergey: random timeout in range-checked-for-each record query. ssl_crl_clients_valid : broken upstream diff --git a/mysql-test/include/binlog_parallel_replication_marks.test b/mysql-test/include/binlog_parallel_replication_marks.test new file mode 100644 index 00000000000..b915d26ce99 --- /dev/null +++ b/mysql-test/include/binlog_parallel_replication_marks.test @@ -0,0 +1,81 @@ +# Test the markings on GTID events (ddl, waited, trans, +# @@skip_parallel_replication) that are used to control parallel +# replication on the slave. + +--source include/have_innodb.inc + +RESET MASTER; +--source include/wait_for_binlog_checkpoint.inc + +CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +--let $binlog_pos1=query_get_value(SHOW MASTER STATUS, Position, 1) +/* GTID */ INSERT INTO t1 VALUES (1,0); +/* GTID */ BEGIN; +/* GTID */ INSERT INTO t1 VALUES (2,0); +/* GTID */ ALTER TABLE t1 ADD c INT; +/* GTID */ INSERT INTO t1 VALUES (3,0,0); +/* GTID */ COMMIT; +/* GTID */ BEGIN; +/* GTID */ UPDATE t1 SET b=1, c=1 WHERE a=2; +/* GTID */ CREATE TEMPORARY TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +/* GTID */ INSERT INTO t2 VALUES (4,10), (5,20); +/* GTID */ INSERT INTO t1 SELECT a, 2, b FROM t2; +/* GTID */ DROP TEMPORARY TABLE t2; +/* GTID */ INSERT INTO t1 VALUES (6, 3, 0); +/* GTID */ COMMIT; +/* GTID */ CREATE TEMPORARY TABLE t3 (a INT PRIMARY KEY) ENGINE=InnoDB; +/* GTID */ BEGIN; +/* GTID */ DELETE FROM t1 WHERE a=5; +/* GTID */ INSERT INTO t3 VALUES (7); +/* GTID */ INSERT INTO t1 SELECT a, 4, 0 FROM t3; +/* GTID */ UPDATE t1 SET c=1 WHERE a=7; +/* GTID */ DROP TEMPORARY TABLE t3; +/* GTID */ COMMIT; +/* GTID */ CREATE TEMPORARY TABLE t4 (a INT PRIMARY KEY) ENGINE=InnoDB; +/* GTID */ BEGIN; +/* GTID */ INSERT INTO t1 VALUES (8, 5, 0); +/* GTID */ ALTER TABLE t4 ADD b INT; +/* GTID */ INSERT INTO t1 VALUES (9, 5, 1); +/* GTID */ COMMIT; +connect (tmp_con,localhost,root,,); +/* GTID */ INSERT INTO t1 VALUES (10, 6, 0); +/* GTID */ BEGIN; +/* GTID */ CREATE TEMPORARY TABLE t5 (a INT PRIMARY KEY) ENGINE=InnoDB; +/* GTID */ INSERT INTO t1 VALUES (11, 7, 0); +/* GTID */ COMMIT; +--let $before_drop_pos=query_get_value(SHOW MASTER STATUS, Position, 1) +disconnect tmp_con; +connection default; + +# We need to wait for the implicit DROP TEMPORARY TABLE to be logged after +# tmp_con disconnect, otherwise we get sporadic test failures. +--let $wait_condition= SELECT variable_value > $before_drop_pos FROM information_schema.global_status WHERE variable_name = 'binlog_snapshot_position' +--source include/wait_condition.inc + +--let $binlog_pos2=query_get_value(SHOW MASTER STATUS, Position, 1) + +--let $binlog_file= query_get_value(SHOW MASTER STATUS, File, 1) +FLUSH LOGS; + +--let $MYSQLD_DATADIR= `select @@datadir` +--let $file= $MYSQLTEST_VARDIR/tmp/binlog_parallel_replication_marks.out +--let OUTPUT_FILE=$file +exec $MYSQL_BINLOG --start_position=$binlog_pos1 --stop_position=$binlog_pos2 $MYSQLD_DATADIR/$binlog_file > $file; + +perl; +my $file= $ENV{'OUTPUT_FILE'}; +open F, "<", $file + or die "Unable to open file '$file': $!\n"; +while () { + s/^#\d+ +\d+:\d+:\d+ /# /; + s/GTID \d+-\d+-\d+/GTID #-#-#/; + s/end_log_pos \d+/end_log_pos #/; + s/table id \d+/table id #/; + s/mapped to number \d+/mapped to number #/; + s/CRC32 0x[0-9a-f]+/CRC32 0x########/; + print if /GTID|BEGIN|COMMIT|Table_map|Write_rows|Update_rows|Delete_rows|generated by server|40005 TEMPORARY/; +} +close F; +EOF + +DROP TABLE t1; diff --git a/mysql-test/include/default_client.cnf b/mysql-test/include/default_client.cnf index bcd6a4849d2..e326b308f5f 100644 --- a/mysql-test/include/default_client.cnf +++ b/mysql-test/include/default_client.cnf @@ -20,3 +20,9 @@ default-character-set=latin1 [mysql_upgrade] default-character-set=latin1 + +[mysqltest] +loose-ssl-ca=@ENV.MYSQL_TEST_DIR/std_data/cacert.pem +loose-ssl-cert=@ENV.MYSQL_TEST_DIR/std_data/client-cert.pem +loose-ssl-key=@ENV.MYSQL_TEST_DIR/std_data/client-key.pem +loose-skip-ssl diff --git a/mysql-test/include/default_mysqld.cnf b/mysql-test/include/default_mysqld.cnf index b5b16461781..44a7fd12d27 100644 --- a/mysql-test/include/default_mysqld.cnf +++ b/mysql-test/include/default_mysqld.cnf @@ -108,6 +108,10 @@ binlog-direct-non-transactional-updates default-storage-engine=myisam +loose-ssl-ca=@ENV.MYSQL_TEST_DIR/std_data/cacert.pem +loose-ssl-cert=@ENV.MYSQL_TEST_DIR/std_data/server-cert.pem +loose-ssl-key=@ENV.MYSQL_TEST_DIR/std_data/server-key.pem + # here, at the end of [mysqld] group mtr will automatically disable # all optional plugins. diff --git a/mysql-test/include/fail_start_mysqld.inc b/mysql-test/include/fail_start_mysqld.inc new file mode 100644 index 00000000000..bb1085b5dd7 --- /dev/null +++ b/mysql-test/include/fail_start_mysqld.inc @@ -0,0 +1,18 @@ +# ==== Usage ==== +# +# [--let $restart_parameters= --innodb-force-recovery=0 --innodb-read-only=1] +# [--let $mysqld_stub_cmd= $MYSQLD_LAST_CMD] +# [--let $error_log= $MYSQLTEST_VARDIR/log/mysqld.1.err] +# --source include/fail_restart_mysqld.inc + +# Evaluate the default of $error_log +if (!$error_log) +{ + --let $error_log= $MYSQLTEST_VARDIR/log/mysqld.1.err +} + +--error 1 +--exec $mysqld_stub_cmd $restart_parameters >> $error_log 2>&1 + +# As the server is stopped +--disable_reconnect diff --git a/mysql-test/include/galera_cluster.inc b/mysql-test/include/galera_cluster.inc index bc652225722..c1834c3c26f 100644 --- a/mysql-test/include/galera_cluster.inc +++ b/mysql-test/include/galera_cluster.inc @@ -8,3 +8,5 @@ --let $galera_cluster_size = 2 --source include/galera_init.inc + +--source include/have_innodb.inc diff --git a/mysql-test/include/have_wsrep_enabled.inc b/mysql-test/include/have_wsrep_enabled.inc index 94eccadec3b..9287369c87c 100644 --- a/mysql-test/include/have_wsrep_enabled.inc +++ b/mysql-test/include/have_wsrep_enabled.inc @@ -8,4 +8,5 @@ if (`SELECT COUNT(*)=0 FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_N { --skip Test requires wsrep_on=ON } +--source include/wait_until_ready.inc diff --git a/mysql-test/include/index_merge1.inc b/mysql-test/include/index_merge1.inc index 88dd4c31910..b63b2db78da 100644 --- a/mysql-test/include/index_merge1.inc +++ b/mysql-test/include/index_merge1.inc @@ -64,6 +64,8 @@ explain select * from t0 where key1 < 3 or key2 > 1020; select * from t0 where key1 < 3 or key2 > 1020; +select * from t0 where key1=1022; # MDEV-13535 no-key-read select after keyread + explain select * from t0 where key1 < 3 or key2 <4; explain diff --git a/mysql-test/include/innodb_encrypt_log.combinations b/mysql-test/include/innodb_encrypt_log.combinations new file mode 100644 index 00000000000..fd21a57c3c2 --- /dev/null +++ b/mysql-test/include/innodb_encrypt_log.combinations @@ -0,0 +1,7 @@ +[crypt] +innodb_encrypt_log=ON +innodb_encryption_rotate_key_age=1 +plugin_load_add=$DEBUG_KEY_MANAGEMENT_SO + +[clear] +skip_innodb_encrypt_log diff --git a/mysql-test/include/innodb_encrypt_log.inc b/mysql-test/include/innodb_encrypt_log.inc new file mode 100644 index 00000000000..5beebeae81f --- /dev/null +++ b/mysql-test/include/innodb_encrypt_log.inc @@ -0,0 +1,4 @@ +# The goal of including this file is to enable innodb_encrypt_log combinations +# (see include/innodb_encrypt_log.combinations) + +--source include/have_innodb.inc diff --git a/mysql-test/include/innodb_page_size.combinations b/mysql-test/include/innodb_page_size.combinations new file mode 100644 index 00000000000..b9b1e1b106f --- /dev/null +++ b/mysql-test/include/innodb_page_size.combinations @@ -0,0 +1,16 @@ +[64k] +innodb-page-size=64K +innodb-buffer-pool-size=24M + +[32k] +innodb-page-size=32K +innodb-buffer-pool-size=24M + +[16k] +innodb-page-size=16K + +[8k] +innodb-page-size=8K + +[4k] +innodb-page-size=4K diff --git a/mysql-test/include/innodb_page_size.inc b/mysql-test/include/innodb_page_size.inc new file mode 100644 index 00000000000..754b640da86 --- /dev/null +++ b/mysql-test/include/innodb_page_size.inc @@ -0,0 +1,4 @@ +# The goal of including this file is to enable innodb_page_size combinations +# (see include/innodb_page_size.combinations) + +--source include/have_innodb.inc diff --git a/mysql-test/include/innodb_page_size_small.combinations b/mysql-test/include/innodb_page_size_small.combinations new file mode 100644 index 00000000000..a9b7c7ce14d --- /dev/null +++ b/mysql-test/include/innodb_page_size_small.combinations @@ -0,0 +1,8 @@ +[16k] +innodb-page-size=16K + +[8k] +innodb-page-size=8K + +[4k] +innodb-page-size=4K diff --git a/mysql-test/include/innodb_page_size_small.inc b/mysql-test/include/innodb_page_size_small.inc new file mode 100644 index 00000000000..754b640da86 --- /dev/null +++ b/mysql-test/include/innodb_page_size_small.inc @@ -0,0 +1,4 @@ +# The goal of including this file is to enable innodb_page_size combinations +# (see include/innodb_page_size.combinations) + +--source include/have_innodb.inc diff --git a/mysql-test/include/innodb_undo_tablespaces.combinations b/mysql-test/include/innodb_undo_tablespaces.combinations new file mode 100644 index 00000000000..0ac7a6e2d05 --- /dev/null +++ b/mysql-test/include/innodb_undo_tablespaces.combinations @@ -0,0 +1,5 @@ +[undo0] +innodb-undo-tablespaces=0 + +[undo3] +innodb-undo-tablespaces=3 diff --git a/mysql-test/include/innodb_undo_tablespaces.inc b/mysql-test/include/innodb_undo_tablespaces.inc new file mode 100644 index 00000000000..b109fcc4f0e --- /dev/null +++ b/mysql-test/include/innodb_undo_tablespaces.inc @@ -0,0 +1,3 @@ +# The goal of including this file is to enable innodb_undo_tablespaces combinations +# (see include/innodb_undo_tablespaces.combinations) + diff --git a/mysql-test/include/require_openssl_client.inc b/mysql-test/include/require_openssl_client.inc new file mode 100644 index 00000000000..9b19960041b --- /dev/null +++ b/mysql-test/include/require_openssl_client.inc @@ -0,0 +1,5 @@ +if ($CLIENT_TLS_LIBRARY != "OpenSSL") { + if ($CLIENT_TLS_LIBRARY != "LibreSSL") { + skip "Test requires Connector/C with OpenSSL library"; + } +} diff --git a/mysql-test/include/restart_mysqld.inc b/mysql-test/include/restart_mysqld.inc index dcaf47c55a2..3d3e55db4ac 100644 --- a/mysql-test/include/restart_mysqld.inc +++ b/mysql-test/include/restart_mysqld.inc @@ -6,50 +6,5 @@ --source include/not_embedded.inc -if ($rpl_inited) -{ - if (!$allow_rpl_inited) - { - --die ERROR IN TEST: When using the replication test framework (master-slave.inc, rpl_init.inc etc), use rpl_restart_server.inc instead of restart_mysqld.inc. If you know what you are doing and you really have to use restart_mysqld.inc, set allow_rpl_inited=1 before you source restart_mysqld.inc - } -} - ---let $server_shutdown_timeout= 60 -if ($shutdown_timeout) -{ - --let $server_shutdown_timeout= $shutdown_timeout -} -if ($shutdown_timeout == 0) -{ - --let $server_shutdown_timeout= 0 -} - -# Write file to make mysql-test-run.pl expect the "crash", but don't start -# it until it's told to ---let $_server_id= `SELECT @@server_id` ---let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.$_server_id.expect ---exec echo "wait" > $_expect_file_name - -# Send shutdown to the connected server and give -# it 10 seconds to die before zapping it -shutdown_server $server_shutdown_timeout; - -# Write file to make mysql-test-run.pl start up the server again -if ($restart_parameters) -{ - --exec echo "restart: $restart_parameters" > $_expect_file_name -} -if (!$restart_parameters) -{ - --exec echo "restart" > $_expect_file_name -} - -# Turn on reconnect ---enable_reconnect - -# Call script that will poll the server waiting for it to be back online again ---source include/wait_until_connected_again.inc - -# Turn off reconnect again ---disable_reconnect - +--source include/shutdown_mysqld.inc +--source include/start_mysqld.inc diff --git a/mysql-test/include/search_pattern_in_file.inc b/mysql-test/include/search_pattern_in_file.inc index 3c5529989bb..21192b55efb 100644 --- a/mysql-test/include/search_pattern_in_file.inc +++ b/mysql-test/include/search_pattern_in_file.inc @@ -76,5 +76,6 @@ perl; my $res=@matches ? "FOUND " . scalar(@matches) : "NOT FOUND"; $ENV{SEARCH_FILE} =~ s{^.*?([^/\\]+)$}{$1}; print "$res /$search_pattern/ in $ENV{SEARCH_FILE}\n"; - exit $ENV{SEARCH_ABORT} && $res =~ /^$ENV{SEARCH_ABORT}/; + die "$ENV{SEARCH_ABORT}\n" + if $ENV{SEARCH_ABORT} && $res =~ /^$ENV{SEARCH_ABORT}/; EOF diff --git a/mysql-test/include/shutdown_mysqld.inc b/mysql-test/include/shutdown_mysqld.inc index 54bba1318e7..c8ab6d00f0d 100644 --- a/mysql-test/include/shutdown_mysqld.inc +++ b/mysql-test/include/shutdown_mysqld.inc @@ -1,3 +1,17 @@ +# ==== Usage ==== +# +# [--let $shutdown_timeout= 30] +# [--let $allow_rpl_inited= 1] +# --source include/shutdown_mysqld.inc + +# The default value is empty +--let $server_shutdown_timeout= + +if ($shutdown_timeout) +{ + --let $server_shutdown_timeout= $shutdown_timeout +} + # This is the first half of include/restart_mysqld.inc. if ($rpl_inited) { @@ -12,7 +26,17 @@ if ($rpl_inited) --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.$_server_id.expect --exec echo "wait" > $_expect_file_name +--let $server_shutdown_timeout= 60 +if ($shutdown_timeout) +{ + --let $server_shutdown_timeout= $shutdown_timeout +} +if ($shutdown_timeout == 0) +{ + --let $server_shutdown_timeout= 0 +} + # Send shutdown to the connected server ---shutdown_server +--shutdown_server $server_shutdown_timeout --source include/wait_until_disconnected.inc diff --git a/mysql-test/include/start_mysqld.inc b/mysql-test/include/start_mysqld.inc index e31f26aad8c..04dff714d49 100644 --- a/mysql-test/include/start_mysqld.inc +++ b/mysql-test/include/start_mysqld.inc @@ -16,6 +16,9 @@ if (!$restart_parameters) # Call script that will poll the server waiting for it to be back online again --source include/wait_until_connected_again.inc +# Wait for wsrep +--source include/wait_wsrep_ready.inc + # Turn off reconnect again --disable_reconnect diff --git a/mysql-test/include/varchar.inc b/mysql-test/include/varchar.inc index 50741130895..7add7113b8d 100644 --- a/mysql-test/include/varchar.inc +++ b/mysql-test/include/varchar.inc @@ -90,6 +90,7 @@ explain select count(*) from t1 where v between 'a' and 'a ' and v between 'a ' --replace_regex /Duplicate entry '[^']+' for key/Duplicate entry '{ ' for key/ --error ER_DUP_ENTRY alter table t1 add unique(v); +show warnings; alter table t1 add key(v); select concat('*',v,'*',c,'*',t,'*') as qq from t1 where v='a'; --replace_column 6 # 9 # 10 # diff --git a/mysql-test/include/wait_for_slave_sql_error_and_skip.inc b/mysql-test/include/wait_for_slave_sql_error_and_skip.inc index 9246c1839af..d68faaf04e7 100644 --- a/mysql-test/include/wait_for_slave_sql_error_and_skip.inc +++ b/mysql-test/include/wait_for_slave_sql_error_and_skip.inc @@ -66,6 +66,13 @@ if (!$slave_skip_counter) { } source include/start_slave.inc; +# start_slave.inc returns when Slave_SQL_Running=Yes. But the slave +# thread sets it before clearing Last_SQL_Errno. So we have to wait +# for Last_SQL_Errno=0 separately. + +let $slave_param= Last_SQL_Errno; +let $slave_param_value= 0; +source include/wait_for_slave_param.inc; --let $include_filename= wait_for_slave_sql_error_and_skip.inc [errno=$slave_sql_errno] --source include/end_include_file.inc diff --git a/mysql-test/include/wait_innodb_all_purged.inc b/mysql-test/include/wait_innodb_all_purged.inc deleted file mode 100644 index a77e6ec1573..00000000000 --- a/mysql-test/include/wait_innodb_all_purged.inc +++ /dev/null @@ -1,60 +0,0 @@ -# include/wait_innodb_all_purged.inc -# -# SUMMARY -# -# Waits until purged all undo records of innodb, or operation times out. -# -# USAGE -# -# --source include/wait_innodb_all_purged.inc -# ---source include/have_innodb.inc - -if (`select version() like '%debug%'`) { ---disable_query_log - -let $wait_counter_init= 300; -if ($wait_timeout) -{ - let $wait_counter_init= `SELECT $wait_timeout * 10`; -} -# Reset $wait_timeout so that its value won't be used on subsequent -# calls, and default will be used instead. -let $wait_timeout= 0; - -let $wait_counter= $wait_counter_init; - -# Keep track of how many times the wait condition is tested -let $wait_condition_reps= 0; -let $prev_trx_age= 0; -while ($wait_counter) -{ - let $trx_age = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS -WHERE VARIABLE_NAME = 'INNODB_PURGE_TRX_ID_AGE';`; - - if ($trx_age != $prev_trx_age) - { - let $wait_counter= $wait_counter_init; - let $prev_trx_age= $trx_age; - } - - let $success= `SELECT $trx_age < 1`; - inc $wait_condition_reps; - if ($success) - { - let $wait_counter= 0; - } - if (!$success) - { - set global innodb_purge_run_now=ON; - real_sleep 0.1; - dec $wait_counter; - } -} -if (!$success) -{ - echo Timeout in wait_innodb_all_purged.inc for INNODB_PURGE_TRX_ID_AGE = $trx_age; -} - ---enable_query_log -} diff --git a/mysql-test/include/wait_wsrep_ready.inc b/mysql-test/include/wait_wsrep_ready.inc new file mode 100644 index 00000000000..2dd1ef7f1ab --- /dev/null +++ b/mysql-test/include/wait_wsrep_ready.inc @@ -0,0 +1,18 @@ +# +# If the wsrep plugin is loaded, wait until the wsrep provider becomes +# ready for use. +# + +--disable_query_log +--disable_result_log + +if (`SELECT COUNT(*)=1 FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'wsrep' AND PLUGIN_STATUS='ACTIVE'`) +{ + if (`SELECT @@GLOBAL.WSREP_ON`) + { + --source include/galera_wait_ready.inc + } +} + +--enable_query_log +--enable_result_log diff --git a/mysql-test/include/write_var_to_file.inc b/mysql-test/include/write_var_to_file.inc index 08de195ccbb..7982c6fab31 100644 --- a/mysql-test/include/write_var_to_file.inc +++ b/mysql-test/include/write_var_to_file.inc @@ -43,9 +43,8 @@ if ($write_to_file == 'GENERATE') if (`SELECT LENGTH(@@secure_file_priv) > 0`) { - --let $_wvtf_secure_file_priv= `SELECT @@secure_file_priv` --let $_wvtf_suffix= `SELECT UUID()` - --let $_wvtf_tmp_file= $_wvtf_secure_file_priv/_wvtf_$_wvtf_suffix + --let $_wvtf_tmp_file= $MYSQLTEST_VARDIR/_wvtf_$_wvtf_suffix --eval SELECT '$write_var' INTO DUMPFILE '$_wvtf_tmp_file' --copy_file $_wvtf_tmp_file $write_to_file diff --git a/mysql-test/lib/My/ConfigFactory.pm b/mysql-test/lib/My/ConfigFactory.pm index 12c0095e80e..830b49d431f 100644 --- a/mysql-test/lib/My/ConfigFactory.pm +++ b/mysql-test/lib/My/ConfigFactory.pm @@ -182,55 +182,6 @@ sub fix_log_slow_queries { return "$dir/mysqld-slow.log"; } -sub fix_std_data { - my ($self, $config, $group_name, $group)= @_; - my $testdir= $self->get_testdir($group); - return "$testdir/std_data"; -} - -sub ssl_supported { - my ($self)= @_; - return $self->{ARGS}->{ssl}; -} - -sub fix_skip_ssl { - return if !ssl_supported(@_); - # Add skip-ssl if ssl is supported to avoid - # that mysqltest connects with SSL by default - return 1; -} - -sub fix_ssl_ca { - return if !ssl_supported(@_); - my $std_data= fix_std_data(@_); - return "$std_data/cacert.pem" -} - -sub fix_ssl_server_cert { - return if !ssl_supported(@_); - my $std_data= fix_std_data(@_); - return "$std_data/server-cert.pem" -} - -sub fix_ssl_client_cert { - return if !ssl_supported(@_); - my $std_data= fix_std_data(@_); - return "$std_data/client-cert.pem" -} - -sub fix_ssl_server_key { - return if !ssl_supported(@_); - my $std_data= fix_std_data(@_); - return "$std_data/server-key.pem" -} - -sub fix_ssl_client_key { - return if !ssl_supported(@_); - my $std_data= fix_std_data(@_); - return "$std_data/client-key.pem" -} - - # # Rules to run for each mysqld in the config # - will be run in order listed here @@ -255,9 +206,6 @@ my @mysqld_rules= { '#user' => sub { return shift->{ARGS}->{user} || ""; } }, { '#password' => sub { return shift->{ARGS}->{password} || ""; } }, { 'server-id' => \&fix_server_id, }, - { 'ssl-ca' => \&fix_ssl_ca }, - { 'ssl-cert' => \&fix_ssl_server_cert }, - { 'ssl-key' => \&fix_ssl_server_key }, { 'bind-address' => \&fix_bind_address }, ); @@ -284,10 +232,6 @@ my @client_rules= # my @mysqltest_rules= ( - { 'ssl-ca' => \&fix_ssl_ca }, - { 'ssl-cert' => \&fix_ssl_client_cert }, - { 'ssl-key' => \&fix_ssl_client_key }, - { 'skip-ssl' => \&fix_skip_ssl }, ); diff --git a/mysql-test/lib/My/SafeProcess/CMakeLists.txt b/mysql-test/lib/My/SafeProcess/CMakeLists.txt index 7d39129d0f5..ec93f94a3e8 100644 --- a/mysql-test/lib/My/SafeProcess/CMakeLists.txt +++ b/mysql-test/lib/My/SafeProcess/CMakeLists.txt @@ -29,16 +29,6 @@ ELSE() MYSQL_ADD_EXECUTABLE(my_safe_process safe_process.cc ${INSTALL_ARGS}) ENDIF() -INSTALL(TARGETS my_safe_process - DESTINATION "${INSTALL_MYSQLTESTDIR}/lib/My/SafeProcess" COMPONENT Test -) - -IF(WIN32) - INSTALL(TARGETS my_safe_kill - DESTINATION "${INSTALL_MYSQLTESTDIR}/lib/My/SafeProcess" COMPONENT Test - ) -ENDIF() - INSTALL(FILES Base.pm DESTINATION "${INSTALL_MYSQLTESTDIR}/lib/My/SafeProcess" COMPONENT Test ) diff --git a/mysql-test/lib/generate-ssl-certs.sh b/mysql-test/lib/generate-ssl-certs.sh index cc919dfe32e..8f15ba9d521 100755 --- a/mysql-test/lib/generate-ssl-certs.sh +++ b/mysql-test/lib/generate-ssl-certs.sh @@ -1,30 +1,39 @@ -#!/bin/sh -xe +#!/bin/sh + +set -xe # simply run me from mysql-test/ cd std_data/ # boilerplace for "openssl ca" and /etc/ssl/openssl.cnf rm -rf demoCA -mkdir demoCA demoCA/private demoCA/newcerts +mkdir demoCA demoCA/newcerts touch demoCA/index.txt echo 01 > demoCA/serial # CA certificate, self-signed -openssl req -x509 -newkey rsa:2048 -keyout demoCA/private/cakey.pem -out cacert.pem -days 7300 -nodes -subj '/CN=cacert/C=FI/ST=Helsinki/L=Helsinki/O=MariaDB' -text +openssl req -x509 -newkey rsa:2048 -keyout cakey.pem -out cacert.pem -days 7300 -nodes -subj '/CN=cacert/C=FI/ST=Helsinki/L=Helsinki/O=MariaDB' -text # server certificate signing request and private key. Note the very long subject (for MDEV-7859) openssl req -newkey rsa:1024 -keyout server-key.pem -out demoCA/server-req.pem -days 7300 -nodes -subj '/CN=localhost/C=FI/ST=state or province within country, in other certificates in this file it is the same as L/L=location, usually an address but often ambiguously used/OU=organizational unit name, a division name within an organization/O=organization name, typically a company name' # convert the key to yassl compatible format openssl rsa -in server-key.pem -out server-key.pem # sign the server certificate with CA certificate -openssl ca -days 7300 -batch -cert cacert.pem -policy policy_anything -out server-cert.pem -infiles demoCA/server-req.pem +openssl ca -keyfile cakey.pem -days 7300 -batch -cert cacert.pem -policy policy_anything -out server-cert.pem -infiles demoCA/server-req.pem openssl req -newkey rsa:8192 -keyout server8k-key.pem -out demoCA/server8k-req.pem -days 7300 -nodes -subj '/CN=server8k/C=FI/ST=Helsinki/L=Helsinki/O=MariaDB' openssl rsa -in server8k-key.pem -out server8k-key.pem -openssl ca -days 7300 -batch -cert cacert.pem -policy policy_anything -out server8k-cert.pem -infiles demoCA/server8k-req.pem +openssl ca -keyfile cakey.pem -days 7300 -batch -cert cacert.pem -policy policy_anything -out server8k-cert.pem -infiles demoCA/server8k-req.pem openssl req -newkey rsa:1024 -keyout client-key.pem -out demoCA/client-req.pem -days 7300 -nodes -subj '/CN=client/C=FI/ST=Helsinki/L=Helsinki/O=MariaDB' openssl rsa -in client-key.pem -out client-key.pem -openssl ca -days 7300 -batch -cert cacert.pem -policy policy_anything -out client-cert.pem -infiles demoCA/client-req.pem +openssl ca -keyfile cakey.pem -days 7300 -batch -cert cacert.pem -policy policy_anything -out client-cert.pem -infiles demoCA/client-req.pem + +# with SubjectAltName, only for OpenSSL 1.0.2+ +cat > demoCA/sanext.conf <{'warnings'} ) + { + mtr_report($tinfo->{'warnings'}); + } } elsif ($result eq 'MTR_RES_PASSED') { diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index 2c6db5ba42b..5589e74a998 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -2,7 +2,7 @@ # -*- cperl -*- # Copyright (c) 2004, 2014, Oracle and/or its affiliates. -# Copyright (c) 2009, 2014, Monty Program Ab +# Copyright (c) 2009, 2017, MariaDB Corporation # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -184,6 +184,7 @@ my @DEFAULT_SUITES= qw( innodb_zip- json- maria- + mariabackup- multi_source- optimizer_unfixed_bugs- parts- @@ -196,6 +197,7 @@ my @DEFAULT_SUITES= qw( unit- vcol- wsrep- + galera- ); my $opt_suites; @@ -1261,10 +1263,6 @@ sub command_line_setup { fix_vs_config_dir(); - # Respect MTR_BINDIR variable, which is typically set in to the - # build directory in out-of-source builds. - $bindir=$ENV{MTR_BINDIR}||$basedir; - # Look for the client binaries directory if ($path_client_bindir) { @@ -2278,6 +2276,16 @@ sub environment_setup { $ENV{'MYSQL_PLUGIN'}= $exe_mysql_plugin; $ENV{'MYSQL_EMBEDDED'}= $exe_mysql_embedded; + my $client_config_exe= + mtr_exe_maybe_exists( + "$bindir/libmariadb/mariadb_config$opt_vs_config/mariadb_config", + "$bindir/bin/mariadb_config"); + if ($client_config_exe) + { + my $tls_info= `$client_config_exe --tlsinfo`; + ($ENV{CLIENT_TLS_LIBRARY},$ENV{CLIENT_TLS_LIBRARY_VERSION})= + split(/ /, $tls_info, 2); + } my $exe_mysqld= find_mysqld($basedir); $ENV{'MYSQLD'}= $exe_mysqld; my $extra_opts= join (" ", @opt_extra_mysqld_opt); @@ -2786,18 +2794,26 @@ sub mysql_server_start($) { } my $mysqld_basedir= $mysqld->value('basedir'); + my $extra_opts= get_extra_opts($mysqld, $tinfo); + if ( $basedir eq $mysqld_basedir ) { if (! $opt_start_dirty) # If dirty, keep possibly grown system db { - # Copy datadir from installed system db - for my $path ( "$opt_vardir", "$opt_vardir/..") { - my $install_db= "$path/install.db"; - copytree($install_db, $datadir) - if -d $install_db; + # Some InnoDB options are incompatible with the default bootstrap. + # If they are used, re-bootstrap + if ( $extra_opts and + "@$extra_opts" =~ /--innodb[-_](?:page[-_]size|checksum[-_]algorithm|undo[-_]tablespaces|log[-_]group[-_]home[-_]dir|data[-_]home[-_]dir)/ ) + { + mysql_install_db($mysqld, undef, $extra_opts); + } + else { + # Copy datadir from installed system db + my $path= ($opt_parallel == 1) ? "$opt_vardir" : "$opt_vardir/.."; + my $install_db= "$path/install.db"; + copytree($install_db, $datadir) if -d $install_db; + mtr_error("Failed to copy system db to '$datadir'") unless -d $datadir; } - mtr_error("Failed to copy system db to '$datadir'") - unless -d $datadir; } } else @@ -2836,7 +2852,6 @@ sub mysql_server_start($) { if (!$opt_embedded_server) { - my $extra_opts= get_extra_opts($mysqld, $tinfo); mysqld_start($mysqld,$extra_opts); # Save this test case information, so next can examine it @@ -3060,7 +3075,7 @@ sub default_mysqld { sub mysql_install_db { - my ($mysqld, $datadir)= @_; + my ($mysqld, $datadir, $extra_opts)= @_; my $install_datadir= $datadir || $mysqld->value('datadir'); my $install_basedir= $mysqld->value('basedir'); @@ -3072,17 +3087,20 @@ sub mysql_install_db { my $args; mtr_init_args(\$args); mtr_add_arg($args, "--no-defaults"); + mtr_add_arg($args, "--disable-getopt-prefix-matching"); mtr_add_arg($args, "--bootstrap"); mtr_add_arg($args, "--basedir=%s", $install_basedir); mtr_add_arg($args, "--datadir=%s", $install_datadir); + mtr_add_arg($args, "--plugin-dir=%s", $plugindir); mtr_add_arg($args, "--default-storage-engine=myisam"); - mtr_add_arg($args, "--skip-plugin-$_") for @optional_plugins; + mtr_add_arg($args, "--loose-skip-plugin-$_") for @optional_plugins; # starting from 10.0 bootstrap scripts require InnoDB mtr_add_arg($args, "--loose-innodb"); mtr_add_arg($args, "--loose-innodb-log-file-size=5M"); mtr_add_arg($args, "--disable-sync-frm"); mtr_add_arg($args, "--tmpdir=%s", "$opt_vardir/tmp/"); mtr_add_arg($args, "--core-file"); + mtr_add_arg($args, "--console"); if ( $opt_debug ) { @@ -3115,98 +3133,108 @@ sub mysql_install_db { # ---------------------------------------------------------------------- $ENV{'MYSQLD_BOOTSTRAP_CMD'}= "$exe_mysqld_bootstrap " . join(" ", @$args); - + # Extra options can come not only from the command line, but also + # from option files or combinations. We want them on a command line + # that is executed now, because otherwise the datadir might be + # incompatible with the test settings, but not on the general + # $MYSQLD_BOOTSTRAP_CMD line + foreach my $extra_opt ( @$extra_opts ) { + mtr_add_arg($args, $extra_opt); + } # ---------------------------------------------------------------------- # Create the bootstrap.sql file # ---------------------------------------------------------------------- - my $bootstrap_sql_file= "$opt_vardir/tmp/bootstrap.sql"; + my $bootstrap_sql_file= "$opt_vardir/log/bootstrap.sql"; - if ($opt_boot_gdb) { - gdb_arguments(\$args, \$exe_mysqld_bootstrap, $mysqld->name(), - $bootstrap_sql_file); - } - if ($opt_boot_dbx) { - dbx_arguments(\$args, \$exe_mysqld_bootstrap, $mysqld->name(), - $bootstrap_sql_file); - } - if ($opt_boot_ddd) { - ddd_arguments(\$args, \$exe_mysqld_bootstrap, $mysqld->name(), - $bootstrap_sql_file); - } - - my $path_sql= my_find_file($install_basedir, - ["mysql", "sql/share", "share/mariadb", - "share/mysql", "share", "scripts"], - "mysql_system_tables.sql", - NOT_REQUIRED); - - if (-f $path_sql ) + if (! -e $bootstrap_sql_file) { - my $sql_dir= dirname($path_sql); - # Use the mysql database for system tables - mtr_tofile($bootstrap_sql_file, "use mysql;\n"); + if ($opt_boot_gdb) { + gdb_arguments(\$args, \$exe_mysqld_bootstrap, $mysqld->name(), + $bootstrap_sql_file); + } + if ($opt_boot_dbx) { + dbx_arguments(\$args, \$exe_mysqld_bootstrap, $mysqld->name(), + $bootstrap_sql_file); + } + if ($opt_boot_ddd) { + ddd_arguments(\$args, \$exe_mysqld_bootstrap, $mysqld->name(), + $bootstrap_sql_file); + } - # Add the offical mysql system tables - # for a production system - mtr_appendfile_to_file("$sql_dir/mysql_system_tables.sql", - $bootstrap_sql_file); + my $path_sql= my_find_file($install_basedir, + ["mysql", "sql/share", "share/mariadb", + "share/mysql", "share", "scripts"], + "mysql_system_tables.sql", + NOT_REQUIRED); - # Add the performance tables - # for a production system - mtr_appendfile_to_file("$sql_dir/mysql_performance_tables.sql", - $bootstrap_sql_file); + if (-f $path_sql ) + { + my $sql_dir= dirname($path_sql); + # Use the mysql database for system tables + mtr_tofile($bootstrap_sql_file, "use mysql;\n"); - # Add the mysql system tables initial data - # for a production system - mtr_appendfile_to_file("$sql_dir/mysql_system_tables_data.sql", - $bootstrap_sql_file); + # Add the offical mysql system tables + # for a production system + mtr_appendfile_to_file("$sql_dir/mysql_system_tables.sql", + $bootstrap_sql_file); - # Add test data for timezone - this is just a subset, on a real - # system these tables will be populated either by mysql_tzinfo_to_sql - # or by downloading the timezone table package from our website - mtr_appendfile_to_file("$sql_dir/mysql_test_data_timezone.sql", - $bootstrap_sql_file); + # Add the performance tables + # for a production system + mtr_appendfile_to_file("$sql_dir/mysql_performance_tables.sql", + $bootstrap_sql_file); - # Fill help tables, just an empty file when running from bk repo - # but will be replaced by a real fill_help_tables.sql when - # building the source dist - mtr_appendfile_to_file("$sql_dir/fill_help_tables.sql", - $bootstrap_sql_file); + # Add the mysql system tables initial data + # for a production system + mtr_appendfile_to_file("$sql_dir/mysql_system_tables_data.sql", + $bootstrap_sql_file); - # mysql.gtid_slave_pos was created in InnoDB, but many tests - # run without InnoDB. Alter it to MyISAM now - mtr_tofile($bootstrap_sql_file, "ALTER TABLE gtid_slave_pos ENGINE=MyISAM;\n"); - } - else - { - # Install db from init_db.sql that exist in early 5.1 and 5.0 - # versions of MySQL - my $init_file= "$install_basedir/mysql-test/lib/init_db.sql"; - mtr_report(" - from '$init_file'"); - my $text= mtr_grab_file($init_file) or - mtr_error("Can't open '$init_file': $!"); + # Add test data for timezone - this is just a subset, on a real + # system these tables will be populated either by mysql_tzinfo_to_sql + # or by downloading the timezone table package from our website + mtr_appendfile_to_file("$sql_dir/mysql_test_data_timezone.sql", + $bootstrap_sql_file); + # Fill help tables, just an empty file when running from bk repo + # but will be replaced by a real fill_help_tables.sql when + # building the source dist + mtr_appendfile_to_file("$sql_dir/fill_help_tables.sql", + $bootstrap_sql_file); + + # mysql.gtid_slave_pos was created in InnoDB, but many tests + # run without InnoDB. Alter it to MyISAM now + mtr_tofile($bootstrap_sql_file, "ALTER TABLE gtid_slave_pos ENGINE=MyISAM;\n"); + } + else + { + # Install db from init_db.sql that exist in early 5.1 and 5.0 + # versions of MySQL + my $init_file= "$install_basedir/mysql-test/lib/init_db.sql"; + mtr_report(" - from '$init_file'"); + my $text= mtr_grab_file($init_file) or + mtr_error("Can't open '$init_file': $!"); + + mtr_tofile($bootstrap_sql_file, + sql_to_bootstrap($text)); + } + + # Remove anonymous users mtr_tofile($bootstrap_sql_file, - sql_to_bootstrap($text)); + "DELETE FROM mysql.user where user= '';\n"); + + # Create mtr database + mtr_tofile($bootstrap_sql_file, + "CREATE DATABASE mtr CHARSET=latin1;\n"); + + # Add help tables and data for warning detection and supression + mtr_tofile($bootstrap_sql_file, + sql_to_bootstrap(mtr_grab_file("include/mtr_warnings.sql"))); + + # Add procedures for checking server is restored after testcase + mtr_tofile($bootstrap_sql_file, + sql_to_bootstrap(mtr_grab_file("include/mtr_check.sql"))); } - # Remove anonymous users - mtr_tofile($bootstrap_sql_file, - "DELETE FROM mysql.user where user= '';\n"); - - # Create mtr database - mtr_tofile($bootstrap_sql_file, - "CREATE DATABASE mtr CHARSET=latin1;\n"); - - # Add help tables and data for warning detection and supression - mtr_tofile($bootstrap_sql_file, - sql_to_bootstrap(mtr_grab_file("include/mtr_warnings.sql"))); - - # Add procedures for checking server is restored after testcase - mtr_tofile($bootstrap_sql_file, - sql_to_bootstrap(mtr_grab_file("include/mtr_check.sql"))); - # Log bootstrap command my $path_bootstrap_log= "$opt_vardir/log/bootstrap.log"; mtr_tofile($path_bootstrap_log, @@ -3985,12 +4013,13 @@ sub run_testcase ($$) { { my $res= $test->exit_status(); - if ($res == 0 and $opt_warnings and check_warnings($tinfo) ) + if (($res == 0 or $res == 62) and $opt_warnings and check_warnings($tinfo) ) { - # Test case suceeded, but it has produced unexpected - # warnings, continue in $res == 1 - $res= 1; - resfile_output($tinfo->{'warnings'}) if $opt_resfile; + # If test case suceeded, but it has produced unexpected + # warnings, continue with $res == 1; + # but if the test was skipped, it should remain skipped + $res= 1 if $res == 0; + resfile_output($tinfo->{'warnings'}) if $opt_resfile; } if ( $res == 0 ) @@ -4541,8 +4570,8 @@ sub check_warnings ($) { my $timeout= start_timer(check_timeout($tinfo)); + my $result= 0; while (1){ - my $result= 0; my $proc= My::SafeProcess->wait_any_timeout($timeout); mtr_report("Got $proc"); @@ -5026,13 +5055,11 @@ sub mysqld_start ($$) { $path_vardir_trace, $mysqld->name()); } - if (IS_WINDOWS) - { - # Trick the server to send output to stderr, with --console - if (!(grep(/^--log-error/, @$args))) { - mtr_add_arg($args, "--console"); - } - } + + # "Dynamic" version of MYSQLD_CMD is reevaluated with each mysqld_start. + # Use it to restart the server at testing a failing server start (e.g + # due to incompatible options). + $ENV{'MYSQLD_LAST_CMD'}= "$exe @$args"; if ( $opt_gdb || $opt_manual_gdb ) { @@ -5490,14 +5517,6 @@ sub start_mysqltest ($) { my $extra_opts= get_extra_opts($mysqld, $tinfo); mysqld_arguments($mysqld_args, $mysqld, $extra_opts); mtr_add_arg($args, "--server-arg=%s", $_) for @$mysqld_args; - - if (IS_WINDOWS) - { - # Trick the server to send output to stderr, with --console - if (!(grep(/^--server-arg=--log-error/, @$args))) { - mtr_add_arg($args, "--server-arg=--console"); - } - } } # ---------------------------------------------------------------------- diff --git a/mysql-test/r/alter_table.result b/mysql-test/r/alter_table.result index c88abd9867e..13fbe00f2e3 100644 --- a/mysql-test/r/alter_table.result +++ b/mysql-test/r/alter_table.result @@ -1925,8 +1925,8 @@ ALTER TABLE ti1 FORCE; affected rows: 0 info: Records: 0 Duplicates: 0 Warnings: 0 ALTER TABLE tm1 FORCE; -affected rows: 0 -info: Records: 0 Duplicates: 0 Warnings: 0 +affected rows: 2 +info: Records: 2 Duplicates: 0 Warnings: 0 ALTER TABLE ti1 AUTO_INCREMENT 3; affected rows: 0 info: Records: 0 Duplicates: 0 Warnings: 0 @@ -2125,6 +2125,58 @@ t1 CREATE TABLE `t1` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8 DROP TABLE t1; # +# MDEV-8960 Can't refer the same column twice in one ALTER TABLE +# +CREATE TABLE t1 ( +`a` int(11) DEFAULT NULL +) DEFAULT CHARSET=utf8; +ALTER TABLE t1 ADD COLUMN `consultant_id` integer NOT NULL, +ALTER COLUMN `consultant_id` DROP DEFAULT; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `consultant_id` int(11) NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8 +DROP TABLE t1; +CREATE TABLE t1 ( +`a` int(11) DEFAULT NULL +) DEFAULT CHARSET=utf8; +ALTER TABLE t1 ADD COLUMN `consultant_id` integer NOT NULL, +ALTER COLUMN `consultant_id` SET DEFAULT 2; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `consultant_id` int(11) NOT NULL DEFAULT 2 +) ENGINE=MyISAM DEFAULT CHARSET=utf8 +DROP TABLE t1; +CREATE TABLE t1 ( +`a` int(11) DEFAULT NULL +) DEFAULT CHARSET=utf8; +ALTER TABLE t1 ADD COLUMN `consultant_id` integer NOT NULL DEFAULT 2, +ALTER COLUMN `consultant_id` DROP DEFAULT; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `consultant_id` int(11) NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8 +DROP TABLE t1; +CREATE TABLE t1 ( +`a` int(11) DEFAULT NULL +) DEFAULT CHARSET=utf8; +ALTER TABLE t1 ADD COLUMN `consultant_id` integer NOT NULL DEFAULT 2, +ALTER COLUMN `consultant_id` DROP DEFAULT, +MODIFY COLUMN `consultant_id` BIGINT; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `consultant_id` bigint(20) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8 +DROP TABLE t1; +# # Start of 10.1 tests # # @@ -2171,3 +2223,52 @@ DROP TABLE t1; CREATE TABLE t1(a INT, b INT, CONSTRAINT min check (a>5), CONSTRAINT min check (b>5)); ERROR HY000: Duplicate CHECK constraint name 'min' +create table t1 (a int, b int, check(a>b)); +alter table t1 drop column a; +ERROR 42S22: Unknown column 'a' in 'CHECK' +alter table t1 drop column b, add column b bigint first; +ERROR 42S22: Unknown column 'b' in 'CHECK' +alter table t1 drop column a, drop constraint constraint_1; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `b` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +drop table t1; +create table t1 (a int, b int, check(a>0)); +alter table t1 drop column a; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `b` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +drop table t1; +create table t1 (a int, b int, check(a>0)); +alter table t1 drop column a, add column a bigint first; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` bigint(20) DEFAULT NULL, + `b` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +drop table t1; +create table t1 (a int, b int, c int, unique(a)); +alter table t1 drop column a; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `b` int(11) DEFAULT NULL, + `c` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +drop table t1; +create table t1 (a int, b int, c int, unique(a,b)); +alter table t1 drop column a; +ERROR 42000: Key column 'a' doesn't exist in table +alter table t1 drop column a, drop index a; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `b` int(11) DEFAULT NULL, + `c` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +drop table t1; diff --git a/mysql-test/r/alter_table_online.result b/mysql-test/r/alter_table_online.result index b3ef9c354f7..54df4e0c96c 100644 --- a/mysql-test/r/alter_table_online.result +++ b/mysql-test/r/alter_table_online.result @@ -184,6 +184,35 @@ CREATE TABLE t1 (a LONGTEXT COLLATE latin1_general_ci); ALTER TABLE t1 MODIFY a LONGTEXT COLLATE latin1_swedish_ci, ALGORITHM=INPLACE; ERROR 0A000: ALGORITHM=INPLACE is not supported for this operation. Try ALGORITHM=COPY DROP TABLE t1; -# -# End of MDEV-8948 ALTER ... INPLACE does work for BINARY, BLOB -# +select @@global.delay_key_write; +@@global.delay_key_write +ON +create table t1 (a int, b int, key(b)); +flush tables; +flush status; +show status like 'Feature_delay_key_write'; +Variable_name Value +Feature_delay_key_write 0 +insert t1 values (1,2),(2,3),(3,4); +show status like 'Feature_delay_key_write'; +Variable_name Value +Feature_delay_key_write 0 +alter online table t1 delay_key_write=1; +show status like 'Feature_delay_key_write'; +Variable_name Value +Feature_delay_key_write 1 +flush tables; +insert t1 values (1,2),(2,3),(3,4); +show status like 'Feature_delay_key_write'; +Variable_name Value +Feature_delay_key_write 2 +alter online table t1 delay_key_write=0; +show status like 'Feature_delay_key_write'; +Variable_name Value +Feature_delay_key_write 2 +flush tables; +insert t1 values (1,2),(2,3),(3,4); +show status like 'Feature_delay_key_write'; +Variable_name Value +Feature_delay_key_write 2 +drop table t1; diff --git a/mysql-test/r/analyze_format_json.result b/mysql-test/r/analyze_format_json.result index 6ac23c6ce80..307fb734026 100644 --- a/mysql-test/r/analyze_format_json.result +++ b/mysql-test/r/analyze_format_json.result @@ -613,22 +613,24 @@ ANALYZE }, "block-nl-join": { "table": { - "table_name": "", + "table_name": "t2", "access_type": "ALL", - "possible_keys": ["distinct_key"], "r_loops": 1, "rows": 2, "r_rows": 2, "r_total_time_ms": "REPLACED", "filtered": 100, - "r_filtered": 100 + "r_filtered": 0, + "attached_condition": "(t2.b,t2.b in (subquery#2))" }, "buffer_type": "flat", "buffer_size": "256Kb", "join_type": "BNL", - "r_filtered": 100, - "materialized": { - "unique": 1, + "attached_condition": "(t2.b,t2.b in (subquery#2))", + "r_filtered": null + }, + "subqueries": [ + { "query_block": { "select_id": 2, "r_loops": 1, @@ -645,24 +647,7 @@ ANALYZE } } } - }, - "block-nl-join": { - "table": { - "table_name": "t2", - "access_type": "ALL", - "r_loops": 1, - "rows": 2, - "r_rows": 2, - "r_total_time_ms": "REPLACED", - "filtered": 100, - "r_filtered": 100 - }, - "buffer_type": "incremental", - "buffer_size": "256Kb", - "join_type": "BNL", - "attached_condition": "t2.b = ``.a", - "r_filtered": 0 - } + ] } } drop table t1,t2; @@ -772,3 +757,63 @@ ANALYZE } } drop table t1,t2,t3; +# +# MDEV-13286: Floating point exception in Filesort_tracker::print_json_members(Json_writer*) +# +create table t0(a int); +insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); +create table t1 (a int, b int, c int); +insert into t1 select a,a,a from t0; +create table t2 as select * from t1; +analyze format=json select a, (select t2.b from t2 where t2.a + + + + 0x74696E79626C6F622D74657874207265616461626C65 + 0x626C6F622D74657874207265616461626C65 + 0x6D656469756D626C6F622D74657874207265616461626C65 + 0x6C6F6E67626C6F622D74657874207265616461626C65 + 0x74657874207265616461626C65 + 0x01 + 0x63 + 0x7661726961626C65 + 0x000000000101000000000000000000F03F000000000000F03F + + + + + + + 1 + 0xAB123400000000000000 + 0x123ABC + + + + 2 + 0xDE123400000000000000 + 0x123DEF + + + +#Print the table contents in html format + +
c1c2c3c4c5c6c7c8c9
0x74696E79626C6F622D74657874207265616461626C650x626C6F622D74657874207265616461626C650x6D656469756D626C6F622D74657874207265616461626C650x6C6F6E67626C6F622D74657874207265616461626C650x74657874207265616461626C650x010x630x7661726961626C650x000000000101000000000000000000F03F000000000000F03F
idcol1col2
10xAB1234000000000000000x123ABC
20xDE1234000000000000000x123DEF
DROP TABLE t1, t2; diff --git a/mysql-test/r/check_constraint.result b/mysql-test/r/check_constraint.result index fcda0a84fcb..525140d96e7 100644 --- a/mysql-test/r/check_constraint.result +++ b/mysql-test/r/check_constraint.result @@ -136,13 +136,19 @@ insert into t1(c1) values(1); ERROR 23000: CONSTRAINT `CONSTRAINT_1` failed for `test`.`t1` insert into t1(c1) values(2); drop table t1; -create table t1 (a int, b int, check(a>0)); -alter table t1 drop column a; -ERROR 42S22: Unknown column 'a' in 'CHECK' -drop table t1; create or replace table t1( c1 int auto_increment primary key, check( c1 > 0 or c1 is null ) ); ERROR HY000: Function or expression 'AUTO_INCREMENT' cannot be used in the CHECK clause of `c1` create table t1 (a int check (@b in (select user from mysql.user))); ERROR HY000: Function or expression 'select ...' cannot be used in the CHECK clause of `a` create table t1 (a int check (a > @b)); ERROR HY000: Function or expression '@b' cannot be used in the CHECK clause of `a` +create table t1 (a int check (a = 1)); +insert t1 values (1); +insert t1 values (2); +ERROR 23000: CONSTRAINT `a` failed for `test`.`t1` +insert t1 values (NULL); +select * from t1; +a +1 +NULL +drop table t1; diff --git a/mysql-test/r/client_xml.result b/mysql-test/r/client_xml.result index 7f74a092af7..6f91c18318c 100644 --- a/mysql-test/r/client_xml.result +++ b/mysql-test/r/client_xml.result @@ -3,7 +3,7 @@ set @@global.concurrent_insert= 0; drop table if exists t1; create table t1 ( `a&b` int, -`ab` text ); insert into t1 values (1, 2, 'a&b ab'); @@ -21,9 +21,9 @@ insert into t1 values (1, 2, 'a&b ab'); - - - + + + diff --git a/mysql-test/r/contributors.result b/mysql-test/r/contributors.result index 4a26d0f19dd..5d92184f191 100644 --- a/mysql-test/r/contributors.result +++ b/mysql-test/r/contributors.result @@ -2,9 +2,11 @@ SHOW CONTRIBUTORS; Name Location Comment Booking.com https://www.booking.com Founding member, Platinum Sponsor of the MariaDB Foundation Alibaba Cloud https://intl.aliyun.com Platinum Sponsor of the MariaDB Foundation +Tencent Cloud https://cloud.tencent.com Platinum Sponsor of the MariaDB Foundation MariaDB Corporation https://mariadb.com Founding member, Gold Sponsor of the MariaDB Foundation Visma https://visma.com Gold Sponsor of the MariaDB Foundation DBS https://dbs.com Gold Sponsor of the MariaDB Foundation +IBM https://www.ibm.com Gold Sponsor of the MariaDB Foundation Nexedi https://www.nexedi.com Silver Sponsor of the MariaDB Foundation Acronis http://www.acronis.com Silver Sponsor of the MariaDB Foundation Auttomattic https://automattic.com Bronze Sponsor of the MariaDB Foundation diff --git a/mysql-test/r/count_distinct.result b/mysql-test/r/count_distinct.result index 3b65dd0e608..d55a232c715 100644 --- a/mysql-test/r/count_distinct.result +++ b/mysql-test/r/count_distinct.result @@ -94,3 +94,15 @@ count(distinct i) 2 drop table t1; drop view v1; +create table t1 (user_id char(64) character set utf8); +insert t1 values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17); +set @@tmp_table_size = 1024; +select count(distinct user_id) from t1; +count(distinct user_id) +17 +alter table t1 modify user_id char(128) character set utf8; +select count(distinct user_id) from t1; +count(distinct user_id) +17 +drop table t1; +set @@tmp_table_size = default; diff --git a/mysql-test/r/cte_nonrecursive.result b/mysql-test/r/cte_nonrecursive.result index 50f99ec4bde..79d380a04db 100644 --- a/mysql-test/r/cte_nonrecursive.result +++ b/mysql-test/r/cte_nonrecursive.result @@ -507,6 +507,7 @@ select t.a, count(*) from t1,t where t1.a=t.a group by t.a; id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t1 ALL NULL NULL NULL NULL 8 Using where; Using temporary; Using filesort 1 PRIMARY t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join) +1 PRIMARY eq_ref distinct_key distinct_key 35 func 1 3 MATERIALIZED t2 ALL NULL NULL NULL NULL 4 Using where 3 MATERIALIZED t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join) explain @@ -522,6 +523,7 @@ where t1.a=t.a group by t.a; id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t1 ALL NULL NULL NULL NULL 8 Using where; Using temporary; Using filesort 1 PRIMARY t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join) +1 PRIMARY eq_ref distinct_key distinct_key 35 func 1 3 MATERIALIZED t2 ALL NULL NULL NULL NULL 4 Using where 3 MATERIALIZED t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join) # with clause in the specification of a derived table @@ -1000,3 +1002,56 @@ f 2 DROP TABLE cte; DROP TABLE t; +# +# MDEV-13107: SHOW TABLE STATUS, SHOW CREATE VIEW +# for CTEs that use derived tables +# +create table t1(a int) engine=myisam; +insert into t1 values (3), (1), (2); +create table t2 (b int) engine=myisam; +insert into t2 values (2), (10); +create view v1 as +with t as (select s.a from (select t1.a from t1) s), +r as(select t.a from t2, t where t2.b=t.a) +select a from r; +create view v2 as +with t as (select s.a from (select t1.a from t1) s), +r as(select t.a from t2, t where t2.b=t.a) +select a from t1; +show table status; +show create view v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS with t as (select `s`.`a` AS `a` from (select `test`.`t1`.`a` AS `a` from `test`.`t1`) `s`), r as (select `t`.`a` AS `a` from (`test`.`t2` join `t`) where `test`.`t2`.`b` = `t`.`a`)select `r`.`a` AS `a` from `r` latin1 latin1_swedish_ci +show create view v2; +View Create View character_set_client collation_connection +v2 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v2` AS with t as (select `s`.`a` AS `a` from (select `test`.`t1`.`a` AS `a` from `test`.`t1`) `s`), r as (select `t`.`a` AS `a` from (`test`.`t2` join `t`) where `test`.`t2`.`b` = `t`.`a`)select `test`.`t1`.`a` AS `a` from `test`.`t1` latin1 latin1_swedish_ci +select * from v1; +a +2 +select * from v2; +a +3 +1 +2 +prepare stmt1 from "select * from v1"; +execute stmt1; +a +2 +execute stmt1; +a +2 +prepare stmt2 from "select * from v2"; +execute stmt2; +a +3 +1 +2 +execute stmt2; +a +3 +1 +2 +deallocate prepare stmt1; +deallocate prepare stmt2; +drop view v1,v2; +drop table t1,t2; diff --git a/mysql-test/r/ctype_big5.result b/mysql-test/r/ctype_big5.result index 3c184c8aec9..2db4da51667 100644 --- a/mysql-test/r/ctype_big5.result +++ b/mysql-test/r/ctype_big5.result @@ -516,7 +516,7 @@ E5ABBA drop table t1; select hex(convert(_big5 0xC84041 using ucs2)); hex(convert(_big5 0xC84041 using ucs2)) -NULL +003F0041 Warnings: Warning 1977 Cannot convert 'big5' character 0xC840 to 'ucs2' End of 4.1 tests @@ -796,69 +796,69 @@ A2C1 â…¨ A2C2 â…© Warnings: Warning 1977 Cannot convert 'big5' character 0xA3C0 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3C0 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3C1 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3C1 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3C2 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3C2 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3C3 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3C3 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3C4 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3C4 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3C5 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3C5 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3C6 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3C6 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3C7 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3C7 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3C8 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3C8 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3C9 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3C9 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3CA to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3CA to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3CB to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3CB to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3CC to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3CC to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3CD to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3CD to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3CE to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3CE to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3CF to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3CF to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3D0 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3D0 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3D1 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3D1 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3D2 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3D2 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3D3 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3D3 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3D4 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3D4 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3D5 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3D5 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3D6 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3D6 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3D7 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3D7 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3D8 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3D8 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3D9 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3D9 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3DA to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3DA to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3DB to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3DB to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3DC to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3DC to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3DD to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3DD to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3DE to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3DE to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3DF to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3DF to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3E0 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3E1 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3E2 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3E3 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3E4 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3E5 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3E6 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3E7 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3E8 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3E9 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3EA to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3EB to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3EC to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3ED to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3EE to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3EF to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3F0 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3F1 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3F2 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3F3 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3F4 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3F5 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3F6 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3F7 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3F8 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3F9 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3FA to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3FB to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3FC to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3FD to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3FE to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xC7FD to 'utf8' SELECT * FROM t1 WHERE HEX(CAST(UPPER(a) AS CHAR CHARACTER SET utf8)) <> HEX(UPPER(CAST(a AS CHAR CHARACTER SET utf8))) ORDER BY code; @@ -875,69 +875,69 @@ C7DA Ñ C7DB Ñ‚ Warnings: Warning 1977 Cannot convert 'big5' character 0xA3C0 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3C0 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3C1 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3C1 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3C2 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3C2 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3C3 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3C3 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3C4 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3C4 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3C5 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3C5 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3C6 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3C6 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3C7 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3C7 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3C8 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3C8 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3C9 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3C9 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3CA to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3CA to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3CB to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3CB to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3CC to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3CC to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3CD to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3CD to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3CE to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3CE to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3CF to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3CF to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3D0 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3D0 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3D1 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3D1 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3D2 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3D2 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3D3 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3D3 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3D4 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3D4 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3D5 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3D5 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3D6 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3D6 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3D7 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3D7 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3D8 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3D8 to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3D9 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3D9 to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3DA to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3DA to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3DB to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3DB to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3DC to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3DC to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3DD to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3DD to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3DE to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3DE to 'utf8' +Warning 1977 Cannot convert 'big5' character 0xA3DF to 'utf8' Warning 1977 Cannot convert 'big5' character 0xA3DF to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3E0 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3E1 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3E2 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3E3 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3E4 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3E5 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3E6 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3E7 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3E8 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3E9 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3EA to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3EB to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3EC to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3ED to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3EE to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3EF to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3F0 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3F1 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3F2 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3F3 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3F4 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3F5 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3F6 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3F7 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3F8 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3F9 to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3FA to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3FB to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3FC to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3FD to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xA3FE to 'utf8' -Warning 1977 Cannot convert 'big5' character 0xC7FD to 'utf8' DROP TABLE t1; # # End of 5.5 tests diff --git a/mysql-test/r/ctype_cp1251.result b/mysql-test/r/ctype_cp1251.result index 037f3cb07e3..e0e6a5cfd95 100644 --- a/mysql-test/r/ctype_cp1251.result +++ b/mysql-test/r/ctype_cp1251.result @@ -281,7 +281,7 @@ chr upper lower utf8 roundtrip issafe 95 95 95 E280A2 95 96 96 96 E28093 96 97 97 97 E28094 97 -98 98 98 NULL NULL Round trip unsafe +98 98 98 3F 3F Round trip unsafe 99 99 99 E284A2 99 9A 9A 9A D199 9A 9B 9B 9B E280BA 9B diff --git a/mysql-test/r/ctype_cp932_binlog_stm.result b/mysql-test/r/ctype_cp932_binlog_stm.result index b958933cd12..f49400b63ff 100644 --- a/mysql-test/r/ctype_cp932_binlog_stm.result +++ b/mysql-test/r/ctype_cp932_binlog_stm.result @@ -388,138 +388,138 @@ code a 81F0 â„« Warnings: Warning 1977 Cannot convert 'cp932' character 0x81AD to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81AD to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81AE to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81AE to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81AF to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81AF to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81B0 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81B0 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81B1 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81B1 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81B2 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81B2 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81B3 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81B3 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81B4 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81B4 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81B5 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81B5 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81B6 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81B6 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81B7 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81B7 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81C0 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81C0 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81C1 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81C1 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81C2 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81C2 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81C3 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81C3 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81C4 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81C4 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81C5 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81C5 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81C6 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81C6 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81C7 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81C7 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81CF to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81CF to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81D0 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81D0 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81D1 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81D1 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81D2 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81D2 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81D3 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81D3 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81D4 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81D4 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81D5 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81D5 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81D6 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81D6 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81D7 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81D7 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81D8 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81D8 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81D9 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81D9 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81E9 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81E9 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81EA to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81EA to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x81EB to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x81EC to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x81ED to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x81EE to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x81EF to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x81F8 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x81F9 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x81FA to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x81FB to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x8240 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x8241 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x8242 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x8243 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x8244 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x8245 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x8246 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x8247 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x8248 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x8249 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x824A to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x824B to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x824C to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x824D to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x824E to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x8259 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x825A to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x825B to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x825C to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x825D to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x825E to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x825F to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x827A to 'utf8' SELECT * FROM t1 WHERE HEX(CAST(UPPER(a) AS CHAR CHARACTER SET utf8)) <> HEX(UPPER(CAST(a AS CHAR CHARACTER SET utf8))) ORDER BY code; code a Warnings: Warning 1977 Cannot convert 'cp932' character 0x81AD to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81AD to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81AE to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81AE to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81AF to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81AF to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81B0 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81B0 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81B1 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81B1 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81B2 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81B2 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81B3 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81B3 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81B4 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81B4 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81B5 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81B5 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81B6 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81B6 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81B7 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81B7 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81C0 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81C0 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81C1 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81C1 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81C2 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81C2 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81C3 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81C3 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81C4 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81C4 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81C5 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81C5 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81C6 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81C6 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81C7 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81C7 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81CF to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81CF to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81D0 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81D0 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81D1 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81D1 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81D2 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81D2 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81D3 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81D3 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81D4 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81D4 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81D5 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81D5 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81D6 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81D6 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81D7 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81D7 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81D8 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81D8 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81D9 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81D9 to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81E9 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81E9 to 'utf8' +Warning 1977 Cannot convert 'cp932' character 0x81EA to 'utf8' Warning 1977 Cannot convert 'cp932' character 0x81EA to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x81EB to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x81EC to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x81ED to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x81EE to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x81EF to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x81F8 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x81F9 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x81FA to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x81FB to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x8240 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x8241 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x8242 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x8243 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x8244 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x8245 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x8246 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x8247 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x8248 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x8249 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x824A to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x824B to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x824C to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x824D to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x824E to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x8259 to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x825A to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x825B to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x825C to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x825D to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x825E to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x825F to 'utf8' -Warning 1977 Cannot convert 'cp932' character 0x827A to 'utf8' # # WL#3090 Japanese Character Set adjustments # Test cp932->Unicode conversion diff --git a/mysql-test/r/ctype_eucjpms.result b/mysql-test/r/ctype_eucjpms.result index afca918abc1..bc7b4b9ef9d 100644 --- a/mysql-test/r/ctype_eucjpms.result +++ b/mysql-test/r/ctype_eucjpms.result @@ -9991,12 +9991,12 @@ a hex(b) c DROP TABLE t1; select hex(convert(_eucjpms 0xA5FE41 using ucs2)); hex(convert(_eucjpms 0xA5FE41 using ucs2)) -NULL +003F0041 Warnings: Warning 1977 Cannot convert 'eucjpms' character 0xA5FE to 'ucs2' select hex(convert(_eucjpms 0x8FABF841 using ucs2)); hex(convert(_eucjpms 0x8FABF841 using ucs2)) -NULL +003F0041 Warnings: Warning 1977 Cannot convert 'eucjpms' character 0x8FABF8 to 'ucs2' set global LC_TIME_NAMES=convert((convert((0x63) using eucjpms)) using utf8); @@ -10566,69 +10566,69 @@ code a 8FAABC Ä¢ Warnings: Warning 1977 Cannot convert 'eucjpms' character 0xA2AF to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2AF to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2B0 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2B0 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2B1 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2B1 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2B2 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2B2 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2B3 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2B3 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2B4 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2B4 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2B5 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2B5 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2B6 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2B6 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2B7 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2B7 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2B8 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2B8 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2B9 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2B9 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2C2 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2C2 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2C3 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2C3 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2C4 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2C4 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2C5 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2C5 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2C6 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2C6 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2C7 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2C7 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2C8 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2C8 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2C9 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2C9 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2D1 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2D1 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2D2 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2D2 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2D3 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2D3 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2D4 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2D4 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2D5 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2D5 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2D6 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2D6 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2D7 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2D7 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2D8 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2D8 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2D9 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2D9 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2DA to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2DA to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2DB to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2DB to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2EB to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2EB to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2EC to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2EC to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA2ED to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA2EE to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA2EF to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA2F0 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA2F1 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA2FA to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA2FB to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA2FC to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA2FD to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3A1 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3A2 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3A3 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3A4 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3A5 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3A6 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3A7 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3A8 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3A9 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3AA to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3AB to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3AC to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3AD to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3AE to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3AF to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3BA to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3BB to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3BC to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3BD to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3BE to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3BF to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3C0 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3DB to 'utf8' SELECT * FROM t1 WHERE HEX(CAST(UPPER(a) AS CHAR CHARACTER SET utf8)) <> HEX(UPPER(CAST(a AS CHAR CHARACTER SET utf8))) ORDER BY code; @@ -10637,69 +10637,69 @@ code a 8FABB9 ǵ Warnings: Warning 1977 Cannot convert 'eucjpms' character 0xA2AF to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2AF to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2B0 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2B0 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2B1 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2B1 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2B2 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2B2 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2B3 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2B3 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2B4 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2B4 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2B5 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2B5 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2B6 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2B6 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2B7 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2B7 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2B8 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2B8 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2B9 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2B9 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2C2 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2C2 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2C3 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2C3 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2C4 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2C4 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2C5 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2C5 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2C6 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2C6 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2C7 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2C7 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2C8 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2C8 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2C9 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2C9 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2D1 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2D1 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2D2 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2D2 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2D3 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2D3 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2D4 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2D4 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2D5 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2D5 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2D6 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2D6 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2D7 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2D7 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2D8 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2D8 to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2D9 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2D9 to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2DA to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2DA to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2DB to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2DB to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2EB to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2EB to 'utf8' +Warning 1977 Cannot convert 'eucjpms' character 0xA2EC to 'utf8' Warning 1977 Cannot convert 'eucjpms' character 0xA2EC to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA2ED to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA2EE to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA2EF to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA2F0 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA2F1 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA2FA to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA2FB to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA2FC to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA2FD to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3A1 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3A2 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3A3 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3A4 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3A5 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3A6 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3A7 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3A8 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3A9 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3AA to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3AB to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3AC to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3AD to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3AE to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3AF to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3BA to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3BB to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3BC to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3BD to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3BE to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3BF to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3C0 to 'utf8' -Warning 1977 Cannot convert 'eucjpms' character 0xA3DB to 'utf8' # # WL#3090 Japanese Character Set adjustments # Test sjis->Unicode conversion diff --git a/mysql-test/r/ctype_euckr.result b/mysql-test/r/ctype_euckr.result index 8069ef54bb1..3fb6f98b2eb 100644 --- a/mysql-test/r/ctype_euckr.result +++ b/mysql-test/r/ctype_euckr.result @@ -24714,69 +24714,69 @@ code a A1CA â„« Warnings: Warning 1977 Cannot convert 'euckr' character 0xA2E8 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2E8 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2E9 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2E9 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2EA to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2EA to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2EB to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2EB to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2EC to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2EC to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2ED to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2ED to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2EE to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2EE to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2EF to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2EF to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2F0 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2F0 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2F1 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2F1 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2F2 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2F2 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2F3 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2F3 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2F4 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2F4 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2F5 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2F5 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2F6 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2F6 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2F7 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2F7 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2F8 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2F8 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2F9 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2F9 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2FA to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2FA to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2FB to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2FB to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2FC to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2FC to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2FD to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2FD to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2FE to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2FE to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA5AB to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA5AB to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA5AC to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA5AC to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA5AD to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA5AD to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA5AE to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA5AE to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA5AF to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA5AF to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA5BA to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA5BA to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA5BB to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA5BB to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA5BC to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA5BC to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA5BD to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA5BD to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5BE to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5BF to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5C0 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5D9 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5DA to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5DB to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5DC to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5DD to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5DE to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5DF to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5E0 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5F9 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5FA to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5FB to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5FC to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5FD to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5FE to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6E5 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6E6 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6E7 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6E8 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6E9 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6EA to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6EB to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6EC to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6ED to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6EE to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6EF to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6F0 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6F1 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6F2 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6F3 to 'utf8' SELECT * FROM t1 WHERE HEX(CAST(UPPER(a) AS CHAR CHARACTER SET utf8)) <> HEX(UPPER(CAST(a AS CHAR CHARACTER SET utf8))) ORDER BY code; @@ -24810,69 +24810,69 @@ A8E6 â“© A9A2 Ä‘ Warnings: Warning 1977 Cannot convert 'euckr' character 0xA2E8 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2E8 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2E9 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2E9 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2EA to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2EA to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2EB to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2EB to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2EC to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2EC to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2ED to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2ED to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2EE to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2EE to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2EF to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2EF to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2F0 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2F0 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2F1 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2F1 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2F2 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2F2 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2F3 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2F3 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2F4 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2F4 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2F5 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2F5 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2F6 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2F6 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2F7 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2F7 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2F8 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2F8 to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2F9 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2F9 to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2FA to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2FA to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2FB to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2FB to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2FC to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2FC to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2FD to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2FD to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA2FE to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA2FE to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA5AB to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA5AB to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA5AC to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA5AC to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA5AD to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA5AD to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA5AE to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA5AE to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA5AF to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA5AF to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA5BA to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA5BA to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA5BB to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA5BB to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA5BC to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA5BC to 'utf8' +Warning 1977 Cannot convert 'euckr' character 0xA5BD to 'utf8' Warning 1977 Cannot convert 'euckr' character 0xA5BD to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5BE to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5BF to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5C0 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5D9 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5DA to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5DB to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5DC to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5DD to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5DE to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5DF to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5E0 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5F9 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5FA to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5FB to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5FC to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5FD to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA5FE to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6E5 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6E6 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6E7 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6E8 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6E9 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6EA to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6EB to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6EC to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6ED to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6EE to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6EF to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6F0 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6F1 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6F2 to 'utf8' -Warning 1977 Cannot convert 'euckr' character 0xA6F3 to 'utf8' DROP TABLE t1; # # End of 5.5 tests diff --git a/mysql-test/r/ctype_gb2312.result b/mysql-test/r/ctype_gb2312.result index cef286b0aab..c3c2eee9b1c 100644 --- a/mysql-test/r/ctype_gb2312.result +++ b/mysql-test/r/ctype_gb2312.result @@ -742,69 +742,69 @@ A2FB â…ª A2FC â…« Warnings: Warning 1977 Cannot convert 'gb2312' character 0xA2A1 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2A1 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2A2 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2A2 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2A3 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2A3 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2A4 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2A4 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2A5 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2A5 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2A6 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2A6 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2A7 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2A7 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2A8 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2A8 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2A9 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2A9 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2AA to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2AA to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2AB to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2AB to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2AC to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2AC to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2AD to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2AD to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2AE to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2AE to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2AF to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2AF to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2B0 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2B0 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2E3 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2E3 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2E4 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2E4 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2EF to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2EF to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2F0 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2F0 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2FD to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2FD to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2FE to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2FE to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA4F4 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA4F4 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA4F5 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA4F5 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA4F6 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA4F6 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA4F7 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA4F7 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA4F8 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA4F8 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA4F9 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA4F9 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA4FA to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA4FA to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA4FB to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA4FB to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA4FC to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA4FC to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA4FD to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA4FD to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA4FE to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA5F7 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA5F8 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA5F9 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA5FA to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA5FB to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA5FC to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA5FD to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA5FE to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6B9 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6BA to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6BB to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6BC to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6BD to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6BE to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6BF to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6C0 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6D9 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6DA to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6DB to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6DC to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6DD to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6DE to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6DF to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6E0 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6E1 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6E2 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6E3 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6E4 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6E5 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6E6 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6E7 to 'utf8' SELECT * FROM t1 WHERE HEX(CAST(UPPER(a) AS CHAR CHARACTER SET utf8)) <> HEX(UPPER(CAST(a AS CHAR CHARACTER SET utf8))) ORDER BY code; @@ -837,69 +837,69 @@ A8B9 ü A8BA ê Warnings: Warning 1977 Cannot convert 'gb2312' character 0xA2A1 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2A1 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2A2 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2A2 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2A3 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2A3 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2A4 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2A4 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2A5 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2A5 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2A6 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2A6 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2A7 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2A7 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2A8 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2A8 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2A9 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2A9 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2AA to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2AA to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2AB to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2AB to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2AC to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2AC to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2AD to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2AD to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2AE to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2AE to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2AF to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2AF to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2B0 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2B0 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2E3 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2E3 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2E4 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2E4 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2EF to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2EF to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2F0 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2F0 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2FD to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2FD to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA2FE to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA2FE to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA4F4 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA4F4 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA4F5 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA4F5 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA4F6 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA4F6 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA4F7 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA4F7 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA4F8 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA4F8 to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA4F9 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA4F9 to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA4FA to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA4FA to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA4FB to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA4FB to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA4FC to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA4FC to 'utf8' +Warning 1977 Cannot convert 'gb2312' character 0xA4FD to 'utf8' Warning 1977 Cannot convert 'gb2312' character 0xA4FD to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA4FE to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA5F7 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA5F8 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA5F9 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA5FA to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA5FB to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA5FC to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA5FD to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA5FE to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6B9 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6BA to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6BB to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6BC to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6BD to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6BE to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6BF to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6C0 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6D9 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6DA to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6DB to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6DC to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6DD to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6DE to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6DF to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6E0 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6E1 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6E2 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6E3 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6E4 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6E5 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6E6 to 'utf8' -Warning 1977 Cannot convert 'gb2312' character 0xA6E7 to 'utf8' DROP TABLE t1; # # End of 5.5 tests diff --git a/mysql-test/r/ctype_gbk.result b/mysql-test/r/ctype_gbk.result index 8e16320b9df..a6cea80fef5 100644 --- a/mysql-test/r/ctype_gbk.result +++ b/mysql-test/r/ctype_gbk.result @@ -463,7 +463,7 @@ A3A0 DROP TABLE t1; select hex(convert(_gbk 0xA14041 using ucs2)); hex(convert(_gbk 0xA14041 using ucs2)) -NULL +003F0041 Warnings: Warning 1977 Cannot convert 'gbk' character 0xA140 to 'ucs2' create table t1 (c1 text not null, c2 text not null) character set gbk; @@ -774,69 +774,69 @@ A2FB â…ª A2FC â…« Warnings: Warning 1977 Cannot convert 'gbk' character 0xA140 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA140 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA141 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA141 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA142 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA142 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA143 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA143 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA144 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA144 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA145 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA145 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA146 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA146 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA147 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA147 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA148 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA148 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA149 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA149 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA14A to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA14A to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA14B to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA14B to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA14C to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA14C to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA14D to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA14D to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA14E to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA14E to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA14F to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA14F to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA150 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA150 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA151 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA151 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA152 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA152 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA153 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA153 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA154 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA154 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA155 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA155 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA156 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA156 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA157 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA157 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA158 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA158 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA159 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA159 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA15A to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA15A to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA15B to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA15B to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA15C to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA15C to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA15D to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA15D to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA15E to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA15E to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA15F to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA15F to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA160 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA161 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA162 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA163 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA164 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA165 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA166 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA167 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA168 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA169 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA16A to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA16B to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA16C to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA16D to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA16E to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA16F to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA170 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA171 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA172 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA173 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA174 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA175 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA176 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA177 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA178 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA179 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA17A to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA17B to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA17C to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA17D to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA17E to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA180 to 'utf8' SELECT * FROM t1 WHERE HEX(CAST(UPPER(a) AS CHAR CHARACTER SET utf8)) <> HEX(UPPER(CAST(a AS CHAR CHARACTER SET utf8))) ORDER BY code; @@ -871,69 +871,69 @@ A8BD Å„ A8BE ň Warnings: Warning 1977 Cannot convert 'gbk' character 0xA140 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA140 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA141 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA141 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA142 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA142 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA143 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA143 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA144 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA144 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA145 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA145 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA146 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA146 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA147 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA147 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA148 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA148 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA149 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA149 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA14A to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA14A to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA14B to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA14B to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA14C to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA14C to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA14D to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA14D to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA14E to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA14E to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA14F to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA14F to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA150 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA150 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA151 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA151 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA152 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA152 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA153 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA153 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA154 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA154 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA155 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA155 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA156 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA156 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA157 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA157 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA158 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA158 to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA159 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA159 to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA15A to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA15A to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA15B to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA15B to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA15C to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA15C to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA15D to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA15D to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA15E to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA15E to 'utf8' +Warning 1977 Cannot convert 'gbk' character 0xA15F to 'utf8' Warning 1977 Cannot convert 'gbk' character 0xA15F to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA160 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA161 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA162 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA163 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA164 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA165 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA166 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA167 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA168 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA169 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA16A to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA16B to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA16C to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA16D to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA16E to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA16F to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA170 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA171 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA172 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA173 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA174 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA175 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA176 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA177 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA178 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA179 to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA17A to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA17B to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA17C to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA17D to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA17E to 'utf8' -Warning 1977 Cannot convert 'gbk' character 0xA180 to 'utf8' DROP TABLE t1; # # End of 5.5 tests diff --git a/mysql-test/r/ctype_sjis.result b/mysql-test/r/ctype_sjis.result index 756e7a11d93..c19a0008e11 100644 --- a/mysql-test/r/ctype_sjis.result +++ b/mysql-test/r/ctype_sjis.result @@ -663,138 +663,138 @@ code a 81F0 â„« Warnings: Warning 1977 Cannot convert 'sjis' character 0x81AD to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81AD to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81AE to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81AE to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81AF to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81AF to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81B0 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81B0 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81B1 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81B1 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81B2 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81B2 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81B3 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81B3 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81B4 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81B4 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81B5 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81B5 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81B6 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81B6 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81B7 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81B7 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81C0 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81C0 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81C1 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81C1 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81C2 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81C2 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81C3 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81C3 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81C4 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81C4 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81C5 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81C5 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81C6 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81C6 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81C7 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81C7 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81CF to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81CF to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81D0 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81D0 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81D1 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81D1 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81D2 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81D2 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81D3 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81D3 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81D4 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81D4 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81D5 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81D5 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81D6 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81D6 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81D7 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81D7 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81D8 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81D8 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81D9 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81D9 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81E9 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81E9 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81EA to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81EA to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x81EB to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x81EC to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x81ED to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x81EE to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x81EF to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x81F8 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x81F9 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x81FA to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x81FB to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x8240 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x8241 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x8242 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x8243 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x8244 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x8245 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x8246 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x8247 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x8248 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x8249 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x824A to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x824B to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x824C to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x824D to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x824E to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x8259 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x825A to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x825B to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x825C to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x825D to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x825E to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x825F to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x827A to 'utf8' SELECT * FROM t1 WHERE HEX(CAST(UPPER(a) AS CHAR CHARACTER SET utf8)) <> HEX(UPPER(CAST(a AS CHAR CHARACTER SET utf8))) ORDER BY code; code a Warnings: Warning 1977 Cannot convert 'sjis' character 0x81AD to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81AD to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81AE to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81AE to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81AF to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81AF to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81B0 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81B0 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81B1 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81B1 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81B2 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81B2 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81B3 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81B3 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81B4 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81B4 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81B5 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81B5 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81B6 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81B6 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81B7 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81B7 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81C0 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81C0 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81C1 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81C1 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81C2 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81C2 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81C3 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81C3 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81C4 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81C4 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81C5 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81C5 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81C6 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81C6 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81C7 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81C7 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81CF to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81CF to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81D0 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81D0 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81D1 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81D1 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81D2 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81D2 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81D3 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81D3 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81D4 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81D4 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81D5 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81D5 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81D6 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81D6 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81D7 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81D7 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81D8 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81D8 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81D9 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81D9 to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81E9 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81E9 to 'utf8' +Warning 1977 Cannot convert 'sjis' character 0x81EA to 'utf8' Warning 1977 Cannot convert 'sjis' character 0x81EA to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x81EB to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x81EC to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x81ED to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x81EE to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x81EF to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x81F8 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x81F9 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x81FA to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x81FB to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x8240 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x8241 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x8242 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x8243 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x8244 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x8245 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x8246 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x8247 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x8248 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x8249 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x824A to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x824B to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x824C to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x824D to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x824E to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x8259 to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x825A to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x825B to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x825C to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x825D to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x825E to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x825F to 'utf8' -Warning 1977 Cannot convert 'sjis' character 0x827A to 'utf8' # # WL#3090 Japanese Character Set adjustments # Test sjis->Unicode conversion diff --git a/mysql-test/r/ctype_uca_partitions.result b/mysql-test/r/ctype_uca_partitions.result index 508893522e4..154de148ee0 100644 --- a/mysql-test/r/ctype_uca_partitions.result +++ b/mysql-test/r/ctype_uca_partitions.result @@ -6,7 +6,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `c1` varchar(10) CHARACTER SET utf8 COLLATE utf8_thai_520_w2 DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 3 INSERT INTO t1 VALUES ('A'),('À'),('Ã'),('Â'),('Ã'),('Ä'),('Ã…'); INSERT INTO t1 VALUES ('B'); diff --git a/mysql-test/r/ctype_ucs.result b/mysql-test/r/ctype_ucs.result index 389a5d3850a..08af0186080 100644 --- a/mysql-test/r/ctype_ucs.result +++ b/mysql-test/r/ctype_ucs.result @@ -5606,6 +5606,23 @@ SELECT 'a','aa'; a aa a aa # +# MDEV-10306 Wrong results with combination of CONCAT, SUBSTR and CONVERT in subquery +# +SET NAMES utf8, character_set_connection=ucs2; +SET @save_optimizer_switch=@@optimizer_switch; +SET optimizer_switch=_utf8'derived_merge=on'; +CREATE TABLE t1 (t VARCHAR(10) CHARSET latin1); +INSERT INTO t1 VALUES('abcdefghi'); +SET NAMES utf8, character_set_connection=ucs2; +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT HEX(t) t2 FROM t1) sub; +c2 +616263646566676869-616263646566676869 +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT TO_BASE64(t) t2 FROM t1) sub; +c2 +YWJjZGVmZ2hp-YWJjZGVmZ2hp +DROP TABLE t1; +SET optimizer_switch=@save_optimizer_switch; +# # End of 10.0 tests # select collation(cast("a" as char(10) unicode binary)); diff --git a/mysql-test/r/ctype_ujis.result b/mysql-test/r/ctype_ujis.result index 93a31a2818c..cb9de83fedc 100644 --- a/mysql-test/r/ctype_ujis.result +++ b/mysql-test/r/ctype_ujis.result @@ -2481,12 +2481,12 @@ a hex(b) c DROP TABLE t1; select hex(convert(_ujis 0xA5FE41 using ucs2)); hex(convert(_ujis 0xA5FE41 using ucs2)) -NULL +003F0041 Warnings: Warning 1977 Cannot convert 'ujis' character 0xA5FE to 'ucs2' select hex(convert(_ujis 0x8FABF841 using ucs2)); hex(convert(_ujis 0x8FABF841 using ucs2)) -NULL +003F0041 Warnings: Warning 1977 Cannot convert 'ujis' character 0x8FABF8 to 'ucs2' DROP TABLE IF EXISTS t1, t2; @@ -3060,69 +3060,69 @@ code a 8FAABC Ä¢ Warnings: Warning 1977 Cannot convert 'ujis' character 0xA2AF to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2AF to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2B0 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2B0 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2B1 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2B1 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2B2 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2B2 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2B3 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2B3 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2B4 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2B4 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2B5 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2B5 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2B6 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2B6 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2B7 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2B7 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2B8 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2B8 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2B9 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2B9 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2C2 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2C2 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2C3 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2C3 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2C4 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2C4 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2C5 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2C5 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2C6 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2C6 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2C7 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2C7 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2C8 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2C8 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2C9 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2C9 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2D1 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2D1 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2D2 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2D2 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2D3 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2D3 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2D4 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2D4 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2D5 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2D5 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2D6 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2D6 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2D7 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2D7 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2D8 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2D8 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2D9 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2D9 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2DA to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2DA to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2DB to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2DB to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2EB to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2EB to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2EC to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2EC to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA2ED to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA2EE to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA2EF to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA2F0 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA2F1 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA2FA to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA2FB to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA2FC to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA2FD to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3A1 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3A2 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3A3 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3A4 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3A5 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3A6 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3A7 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3A8 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3A9 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3AA to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3AB to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3AC to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3AD to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3AE to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3AF to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3BA to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3BB to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3BC to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3BD to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3BE to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3BF to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3C0 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3DB to 'utf8' SELECT * FROM t1 WHERE HEX(CAST(UPPER(a) AS CHAR CHARACTER SET utf8)) <> HEX(UPPER(CAST(a AS CHAR CHARACTER SET utf8))) ORDER BY code; @@ -3131,69 +3131,69 @@ code a 8FABB9 ǵ Warnings: Warning 1977 Cannot convert 'ujis' character 0xA2AF to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2AF to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2B0 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2B0 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2B1 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2B1 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2B2 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2B2 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2B3 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2B3 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2B4 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2B4 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2B5 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2B5 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2B6 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2B6 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2B7 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2B7 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2B8 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2B8 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2B9 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2B9 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2C2 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2C2 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2C3 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2C3 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2C4 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2C4 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2C5 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2C5 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2C6 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2C6 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2C7 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2C7 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2C8 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2C8 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2C9 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2C9 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2D1 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2D1 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2D2 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2D2 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2D3 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2D3 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2D4 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2D4 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2D5 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2D5 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2D6 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2D6 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2D7 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2D7 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2D8 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2D8 to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2D9 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2D9 to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2DA to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2DA to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2DB to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2DB to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2EB to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2EB to 'utf8' +Warning 1977 Cannot convert 'ujis' character 0xA2EC to 'utf8' Warning 1977 Cannot convert 'ujis' character 0xA2EC to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA2ED to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA2EE to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA2EF to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA2F0 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA2F1 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA2FA to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA2FB to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA2FC to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA2FD to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3A1 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3A2 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3A3 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3A4 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3A5 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3A6 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3A7 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3A8 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3A9 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3AA to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3AB to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3AC to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3AD to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3AE to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3AF to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3BA to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3BB to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3BC to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3BD to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3BE to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3BF to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3C0 to 'utf8' -Warning 1977 Cannot convert 'ujis' character 0xA3DB to 'utf8' # # WL#3090 Japanese Character Set adjustments # Test sjis->Unicode conversion diff --git a/mysql-test/r/ctype_utf32.result b/mysql-test/r/ctype_utf32.result index 37cda220db0..0a4a49dd39e 100644 --- a/mysql-test/r/ctype_utf32.result +++ b/mysql-test/r/ctype_utf32.result @@ -1666,7 +1666,7 @@ CHAR_LENGTH(TRIM(BOTH 0x00 FROM _utf32 0x00000061)) 1 select hex(lower(cast(0xffff0000 as char character set utf32))) as c; c -NULL +0000003F0000003F0000003F0000003F Warnings: Warning 1300 Invalid utf32 character string: '\xFF\xFF\x00\x00' # diff --git a/mysql-test/r/ctype_utf8.result b/mysql-test/r/ctype_utf8.result index 0a4898ff0b9..c7e20a4180d 100644 --- a/mysql-test/r/ctype_utf8.result +++ b/mysql-test/r/ctype_utf8.result @@ -1925,7 +1925,7 @@ Warnings: Warning 1300 Invalid utf8 character string: 'FF8F' select convert(char(0xff,0x8f) using utf8); convert(char(0xff,0x8f) using utf8) -NULL +?? Warnings: Warning 1300 Invalid utf8 character string: '\xFF\x8F' set sql_mode=traditional; @@ -1951,7 +1951,7 @@ Warnings: Warning 1300 Invalid utf8 character string: 'FD' select convert(char(0xff,0x8f) using utf8); convert(char(0xff,0x8f) using utf8) -NULL +?? Warnings: Warning 1300 Invalid utf8 character string: '\xFF\x8F' select hex(convert(char(2557 using latin1) using utf8)); @@ -2120,7 +2120,7 @@ Warnings: Warning 1300 Invalid utf8 character string: 'FF' select hex(convert(0xFF using utf8)); hex(convert(0xFF using utf8)) -NULL +3F Warnings: Warning 1300 Invalid utf8 character string: '\xFF' select hex(_utf8 0x616263FF); @@ -2139,7 +2139,7 @@ Warnings: Warning 1300 Invalid utf8 character string: 'FF' select hex(convert(0xFF using utf8)); hex(convert(0xFF using utf8)) -NULL +3F Warnings: Warning 1300 Invalid utf8 character string: '\xFF' select hex(_utf8 0x616263FF); @@ -10479,6 +10479,31 @@ END DROP PROCEDURE p1; SET @@SQL_MODE=default; # +# MDEV-10191 non convertible chars convert() resulted in Null instead "?" on Windows +# +SET sql_mode='STRICT_TRANS_TABLES'; +SELECT CONVERT(_utf8 0xC499 USING latin1); +CONVERT(_utf8 0xC499 USING latin1) +? +Warnings: +Warning 1977 Cannot convert 'utf8' character 0xC499 to 'latin1' +SELECT CAST(_utf8 0xC499 AS CHAR CHARACTER SET latin1); +CAST(_utf8 0xC499 AS CHAR CHARACTER SET latin1) +? +Warnings: +Warning 1977 Cannot convert 'utf8' character 0xC499 to 'latin1' +SET sql_mode=default; +SELECT CONVERT(_utf8 0xC499 USING latin1); +CONVERT(_utf8 0xC499 USING latin1) +? +Warnings: +Warning 1977 Cannot convert 'utf8' character 0xC499 to 'latin1' +SELECT CAST(_utf8 0xC499 AS CHAR CHARACTER SET latin1); +CAST(_utf8 0xC499 AS CHAR CHARACTER SET latin1) +? +Warnings: +Warning 1977 Cannot convert 'utf8' character 0xC499 to 'latin1' +# # End of 10.1 tests # # diff --git a/mysql-test/r/ctype_utf8mb4.result b/mysql-test/r/ctype_utf8mb4.result index d74cfd4dd3f..cf3000baf6a 100644 --- a/mysql-test/r/ctype_utf8mb4.result +++ b/mysql-test/r/ctype_utf8mb4.result @@ -1950,7 +1950,7 @@ Warnings: Warning 1300 Invalid utf8mb4 character string: 'FF8F' select convert(char(0xff,0x8f) using utf8mb4); convert(char(0xff,0x8f) using utf8mb4) -NULL +?? Warnings: Warning 1300 Invalid utf8mb4 character string: '\xFF\x8F' set sql_mode=traditional; @@ -1976,7 +1976,7 @@ Warnings: Warning 1300 Invalid utf8mb4 character string: 'FD' select convert(char(0xff,0x8f) using utf8mb4); convert(char(0xff,0x8f) using utf8mb4) -NULL +?? Warnings: Warning 1300 Invalid utf8mb4 character string: '\xFF\x8F' select hex(convert(char(2557 using latin1) using utf8mb4)); @@ -2145,7 +2145,7 @@ Warnings: Warning 1300 Invalid utf8mb4 character string: 'FF' select hex(convert(0xFF using utf8mb4)); hex(convert(0xFF using utf8mb4)) -NULL +3F Warnings: Warning 1300 Invalid utf8mb4 character string: '\xFF' select hex(_utf8mb4 0x616263FF); @@ -2164,7 +2164,7 @@ Warnings: Warning 1300 Invalid utf8mb4 character string: 'FF' select hex(convert(0xFF using utf8mb4)); hex(convert(0xFF using utf8mb4)) -NULL +3F Warnings: Warning 1300 Invalid utf8mb4 character string: '\xFF' select hex(_utf8mb4 0x616263FF); diff --git a/mysql-test/r/ctype_utf8mb4_heap.result b/mysql-test/r/ctype_utf8mb4_heap.result index 859ceff864e..d82ed89be9c 100644 --- a/mysql-test/r/ctype_utf8mb4_heap.result +++ b/mysql-test/r/ctype_utf8mb4_heap.result @@ -1782,7 +1782,7 @@ Warnings: Warning 1300 Invalid utf8mb4 character string: 'FF8F' select convert(char(0xff,0x8f) using utf8mb4); convert(char(0xff,0x8f) using utf8mb4) -NULL +?? Warnings: Warning 1300 Invalid utf8mb4 character string: '\xFF\x8F' set sql_mode=traditional; @@ -1808,7 +1808,7 @@ Warnings: Warning 1300 Invalid utf8mb4 character string: 'FD' select convert(char(0xff,0x8f) using utf8mb4); convert(char(0xff,0x8f) using utf8mb4) -NULL +?? Warnings: Warning 1300 Invalid utf8mb4 character string: '\xFF\x8F' select hex(convert(char(2557 using latin1) using utf8mb4)); @@ -1977,7 +1977,7 @@ Warnings: Warning 1300 Invalid utf8mb4 character string: 'FF' select hex(convert(0xFF using utf8mb4)); hex(convert(0xFF using utf8mb4)) -NULL +3F Warnings: Warning 1300 Invalid utf8mb4 character string: '\xFF' select hex(_utf8mb4 0x616263FF); @@ -1996,7 +1996,7 @@ Warnings: Warning 1300 Invalid utf8mb4 character string: 'FF' select hex(convert(0xFF using utf8mb4)); hex(convert(0xFF using utf8mb4)) -NULL +3F Warnings: Warning 1300 Invalid utf8mb4 character string: '\xFF' select hex(_utf8mb4 0x616263FF); diff --git a/mysql-test/r/ctype_utf8mb4_innodb.result b/mysql-test/r/ctype_utf8mb4_innodb.result index 11d89154269..c444e872f98 100644 --- a/mysql-test/r/ctype_utf8mb4_innodb.result +++ b/mysql-test/r/ctype_utf8mb4_innodb.result @@ -1910,7 +1910,7 @@ Warnings: Warning 1300 Invalid utf8mb4 character string: 'FF8F' select convert(char(0xff,0x8f) using utf8mb4); convert(char(0xff,0x8f) using utf8mb4) -NULL +?? Warnings: Warning 1300 Invalid utf8mb4 character string: '\xFF\x8F' set sql_mode=traditional; @@ -1936,7 +1936,7 @@ Warnings: Warning 1300 Invalid utf8mb4 character string: 'FD' select convert(char(0xff,0x8f) using utf8mb4); convert(char(0xff,0x8f) using utf8mb4) -NULL +?? Warnings: Warning 1300 Invalid utf8mb4 character string: '\xFF\x8F' select hex(convert(char(2557 using latin1) using utf8mb4)); @@ -2105,7 +2105,7 @@ Warnings: Warning 1300 Invalid utf8mb4 character string: 'FF' select hex(convert(0xFF using utf8mb4)); hex(convert(0xFF using utf8mb4)) -NULL +3F Warnings: Warning 1300 Invalid utf8mb4 character string: '\xFF' select hex(_utf8mb4 0x616263FF); @@ -2124,7 +2124,7 @@ Warnings: Warning 1300 Invalid utf8mb4 character string: 'FF' select hex(convert(0xFF using utf8mb4)); hex(convert(0xFF using utf8mb4)) -NULL +3F Warnings: Warning 1300 Invalid utf8mb4 character string: '\xFF' select hex(_utf8mb4 0x616263FF); diff --git a/mysql-test/r/ctype_utf8mb4_myisam.result b/mysql-test/r/ctype_utf8mb4_myisam.result index ef7bda0a79b..5176f92dc0f 100644 --- a/mysql-test/r/ctype_utf8mb4_myisam.result +++ b/mysql-test/r/ctype_utf8mb4_myisam.result @@ -1910,7 +1910,7 @@ Warnings: Warning 1300 Invalid utf8mb4 character string: 'FF8F' select convert(char(0xff,0x8f) using utf8mb4); convert(char(0xff,0x8f) using utf8mb4) -NULL +?? Warnings: Warning 1300 Invalid utf8mb4 character string: '\xFF\x8F' set sql_mode=traditional; @@ -1936,7 +1936,7 @@ Warnings: Warning 1300 Invalid utf8mb4 character string: 'FD' select convert(char(0xff,0x8f) using utf8mb4); convert(char(0xff,0x8f) using utf8mb4) -NULL +?? Warnings: Warning 1300 Invalid utf8mb4 character string: '\xFF\x8F' select hex(convert(char(2557 using latin1) using utf8mb4)); @@ -2105,7 +2105,7 @@ Warnings: Warning 1300 Invalid utf8mb4 character string: 'FF' select hex(convert(0xFF using utf8mb4)); hex(convert(0xFF using utf8mb4)) -NULL +3F Warnings: Warning 1300 Invalid utf8mb4 character string: '\xFF' select hex(_utf8mb4 0x616263FF); @@ -2124,7 +2124,7 @@ Warnings: Warning 1300 Invalid utf8mb4 character string: 'FF' select hex(convert(0xFF using utf8mb4)); hex(convert(0xFF using utf8mb4)) -NULL +3F Warnings: Warning 1300 Invalid utf8mb4 character string: '\xFF' select hex(_utf8mb4 0x616263FF); diff --git a/mysql-test/r/date_formats.result b/mysql-test/r/date_formats.result index 8439c40fbf9..16dbdf7969c 100644 --- a/mysql-test/r/date_formats.result +++ b/mysql-test/r/date_formats.result @@ -558,3 +558,18 @@ SET NAMES latin1; # # End of 5.1 tests # +select time_format('2001-01-01 02:02:02', '%d.%m.%Y'); +time_format('2001-01-01 02:02:02', '%d.%m.%Y') +NULL +select time_format('2001-01-01 02:02:02', '%d %T'); +time_format('2001-01-01 02:02:02', '%d %T') +NULL +select time_format('01 02:02:02', '%d %T'); +time_format('01 02:02:02', '%d %T') +NULL +select time_format('01 02:02:02', '%T'); +time_format('01 02:02:02', '%T') +26:02:02 +select time_format('2001-01-01 02:02:02', '%T'); +time_format('2001-01-01 02:02:02', '%T') +02:02:02 diff --git a/mysql-test/r/default.result b/mysql-test/r/default.result index 2780ed3b168..8fa88066f7c 100644 --- a/mysql-test/r/default.result +++ b/mysql-test/r/default.result @@ -3381,4 +3381,11 @@ create table t1 (col1 int default(-(default(col1)))); ERROR 01000: Expression for field `col1` is refering to uninitialized field `col1` create table t1 (col int default (yearweek((exp(710))))); ERROR 22003: DOUBLE value is out of range in 'exp(710)' +# +# MDEV-13707 Server in ORACLE mode crashes on ALTER with wrong DEFAULT clause +# +CREATE OR REPLACE TABLE t1(i int); +ALTER TABLE t1 ADD b CHAR(255) DEFAULT `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`; +ERROR 42S22: Unknown column 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' in 'DEFAULT' +DROP TABLE t1; # end of 10.2 test diff --git a/mysql-test/r/derived.result b/mysql-test/r/derived.result index 8a7422ba5ec..722ff76e556 100644 --- a/mysql-test/r/derived.result +++ b/mysql-test/r/derived.result @@ -554,7 +554,7 @@ EXPLAIN SELECT * FROM (SELECT * FROM t1) AS table1, id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t1 system NULL NULL NULL NULL 1 1 PRIMARY ref key0 key0 5 const 0 -3 DERIVED t2 ALL NULL NULL NULL NULL 2 Using temporary +3 DERIVED t2 ALL NULL NULL NULL NULL 2 Using where; Using temporary Warnings: Note 1249 Select 4 was reduced during optimization DROP TABLE t1, t2; diff --git a/mysql-test/r/derived_cond_pushdown.result b/mysql-test/r/derived_cond_pushdown.result index dbc25fb255c..b94cb46acea 100644 --- a/mysql-test/r/derived_cond_pushdown.result +++ b/mysql-test/r/derived_cond_pushdown.result @@ -7234,6 +7234,7 @@ EXPLAIN "materialized": { "query_block": { "select_id": 5, + "having_condition": "s > 2", "filesort": { "sort_key": "t4.d", "temporary_table": { @@ -7605,6 +7606,7 @@ EXPLAIN "materialized": { "query_block": { "select_id": 3, + "having_condition": "s < 50", "filesort": { "sort_key": "t3.a", "temporary_table": { @@ -7755,9 +7757,14 @@ EXPLAIN "select_id": 4, "table": { "table_name": "t", - "access_type": "ALL", + "access_type": "range", + "possible_keys": ["PRIMARY"], + "key": "PRIMARY", + "key_length": "4", + "used_key_parts": ["pk"], "rows": 2, - "filtered": 100 + "filtered": 100, + "index_condition": "t.pk > 2" } } } @@ -8447,3 +8454,315 @@ WHERE row <> order_number; row order_number 14 51 DROP TABLE sales_documents; +# +# MDEV-12845: pushdown from merged derived using equalities +# +create table t1 (a int); +insert into t1 values +(4), (8), (5), (3), (10), (2), (7); +create table t2 (b int, c int); +insert into t2 values +(2,1), (5,2), (2,2), (4,1), (4,3), +(5,3), (2,4), (4,6), (2,1); +create view v1 as +select b, sum(c) as s from t2 group by b; +create view v2 as +select distinct b, c from t2; +create view v3 as +select b, max(c) as m from t2 group by b; +select b +from ( select t1.a, v1.b, v1.s from t1, v1 where t1.a = v1.b ) as t +where b > 2; +b +4 +5 +explain format=json select b +from ( select t1.a, v1.b, v1.s from t1, v1 where t1.a = v1.b ) as t +where b > 2; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 7, + "filtered": 100, + "attached_condition": "t1.a > 2 and t1.a is not null" + }, + "table": { + "table_name": "", + "access_type": "ref", + "possible_keys": ["key0"], + "key": "key0", + "key_length": "5", + "used_key_parts": ["b"], + "ref": ["test.t1.a"], + "rows": 2, + "filtered": 100, + "materialized": { + "query_block": { + "select_id": 3, + "filesort": { + "sort_key": "t2.b", + "temporary_table": { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 9, + "filtered": 100, + "attached_condition": "t2.b > 2" + } + } + } + } + } + } + } +} +select a +from ( select t1.a, v1.b, v1.s from t1, v1 where t1.a = v1.b ) as t +where a > 2; +a +4 +5 +explain format=json select a +from ( select t1.a, v1.b, v1.s from t1, v1 where t1.a = v1.b ) as t +where a > 2; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 7, + "filtered": 100, + "attached_condition": "t1.a > 2 and t1.a is not null" + }, + "table": { + "table_name": "", + "access_type": "ref", + "possible_keys": ["key0"], + "key": "key0", + "key_length": "5", + "used_key_parts": ["b"], + "ref": ["test.t1.a"], + "rows": 2, + "filtered": 100, + "materialized": { + "query_block": { + "select_id": 3, + "filesort": { + "sort_key": "t2.b", + "temporary_table": { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 9, + "filtered": 100, + "attached_condition": "t2.b > 2" + } + } + } + } + } + } + } +} +select a +from ( select t1.a, v2.b, v2.c from t1, v2 where t1.a = v2.b ) as t +where a > 2; +a +4 +4 +4 +5 +5 +explain format=json select a +from ( select t1.a, v2.b, v2.c from t1, v2 where t1.a = v2.b ) as t +where a > 2; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 7, + "filtered": 100, + "attached_condition": "t1.a > 2 and t1.a is not null" + }, + "table": { + "table_name": "", + "access_type": "ref", + "possible_keys": ["key0"], + "key": "key0", + "key_length": "5", + "used_key_parts": ["b"], + "ref": ["test.t1.a"], + "rows": 2, + "filtered": 100, + "materialized": { + "query_block": { + "select_id": 3, + "temporary_table": { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 9, + "filtered": 100, + "attached_condition": "t2.b > 2" + } + } + } + } + } + } +} +select a +from ( select t1.a, v3.b, v3.m from t1, v3 where t1.a = v3.m ) as t +where a > 2; +a +4 +3 +explain format=json select a +from ( select t1.a, v3.b, v3.m from t1, v3 where t1.a = v3.m ) as t +where a > 2; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 7, + "filtered": 100, + "attached_condition": "t1.a > 2 and t1.a is not null" + }, + "table": { + "table_name": "", + "access_type": "ref", + "possible_keys": ["key0"], + "key": "key0", + "key_length": "5", + "used_key_parts": ["m"], + "ref": ["test.t1.a"], + "rows": 2, + "filtered": 100, + "materialized": { + "query_block": { + "select_id": 3, + "having_condition": "m > 2", + "filesort": { + "sort_key": "t2.b", + "temporary_table": { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 9, + "filtered": 100 + } + } + } + } + } + } + } +} +drop view v1,v2,v3; +drop table t1,t2; +# +# MDEV-13166: pushdown from merged derived +# +CREATE TABLE t1 (i int) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1),(2); +CREATE VIEW v1 AS SELECT MAX(i) AS f FROM t1; +SELECT * FROM ( SELECT * FROM v1 ) AS sq WHERE f > 0; +f +2 +explain format=json SELECT * FROM ( SELECT * FROM v1 ) AS sq WHERE f > 0; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "table": { + "table_name": "", + "access_type": "ALL", + "rows": 2, + "filtered": 100, + "attached_condition": "v1.f > 0", + "materialized": { + "query_block": { + "select_id": 3, + "having_condition": "f > 0", + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 2, + "filtered": 100 + } + } + } + } + } +} +DROP VIEW v1; +DROP TABLE t1; +# +# MDEV-13193: pushdown of equality extracted from multiple equality +# +CREATE TABLE t1 (i1 int, KEY(i1)) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1),(2); +CREATE TABLE t2 (i2 int) ENGINE=MyISAM; +INSERT INTO t2 VALUES (2),(4); +CREATE ALGORITHM=TEMPTABLE VIEW v2 AS SELECT * FROM t2; +SELECT * FROM t1, ( SELECT * FROM v2 ) AS sq +WHERE i1 = 1 AND ( i1 = i2 OR i1 = 2 ); +i1 i2 +explain format=json SELECT * FROM t1, ( SELECT * FROM v2 ) AS sq +WHERE i1 = 1 AND ( i1 = i2 OR i1 = 2 ); +EXPLAIN +{ + "query_block": { + "select_id": 1, + "table": { + "table_name": "t1", + "access_type": "ref", + "possible_keys": ["i1"], + "key": "i1", + "key_length": "5", + "used_key_parts": ["i1"], + "ref": ["const"], + "rows": 1, + "filtered": 100, + "using_index": true + }, + "block-nl-join": { + "table": { + "table_name": "", + "access_type": "ALL", + "rows": 2, + "filtered": 100, + "attached_condition": "v2.i2 = 1" + }, + "buffer_type": "flat", + "buffer_size": "256Kb", + "join_type": "BNL", + "materialized": { + "query_block": { + "select_id": 3, + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 2, + "filtered": 100, + "attached_condition": "t2.i2 = 1" + } + } + } + } + } +} +DROP VIEW v2; +DROP TABLE t1,t2; diff --git a/mysql-test/r/derived_view.result b/mysql-test/r/derived_view.result index 7a451a312ca..df6ba084a87 100644 --- a/mysql-test/r/derived_view.result +++ b/mysql-test/r/derived_view.result @@ -900,7 +900,7 @@ EXPLAIN "access_type": "ALL", "rows": 11, "filtered": 100, - "attached_condition": "t1.f1 in (2,3)" + "attached_condition": "t1.f1 < 7 and t1.f1 in (2,3)" } } } @@ -2916,5 +2916,64 @@ Handler_read_rnd_deleted 0 Handler_read_rnd_next 27 deallocate prepare stmt1; drop table t1,t2; +# +# Bug mdev-12670: mergeable derived / view with subqueries +# subject to semi-join optimizations +# (actually this is a 5.3 bug.) +# +create table t1 (a int) engine=myisam; +insert into t1 values (5),(3),(2),(7),(2),(5),(1); +create table t2 (b int, index idx(b)) engine=myisam; +insert into t2 values (2),(3),(2),(1),(3),(4); +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +analyze table t1,t2; +Table Op Msg_type Msg_text +test.t1 analyze status OK +test.t2 analyze status OK +explain select a from t1 where a in (select b from t2); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 7 Using where +1 PRIMARY t2 ref idx idx 5 test.t1.a 140 Using index; FirstMatch(t1) +explain select * from (select a from t1 where a in (select b from t2)) t; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 7 Using where +1 PRIMARY t2 ref idx idx 5 test.t1.a 140 Using index; FirstMatch(t1) +create view v1 as select a from t1 where a in (select b from t2); +explain select * from v1; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 7 Using where +1 PRIMARY t2 ref idx idx 5 test.t1.a 140 Using index; FirstMatch(t1) +drop view v1; +drop table t1,t2; +# +# Bug mdev-12812: mergeable derived / view with subqueries +# NOT subject to semi-join optimizations +# +CREATE TABLE t1 (c1 varchar(3)) ENGINE=MyISAM; +INSERT INTO t1 VALUES ('foo'),('foo'); +CREATE TABLE t2 (c2 varchar(3)) ENGINE=MyISAM; +INSERT INTO t2 VALUES ('bar'),('qux'),('foo'); +SELECT STRAIGHT_JOIN * +FROM ( SELECT * FROM t1 WHERE c1 IN ( SELECT c2 FROM t2 ) ) AS sq; +c1 +foo +foo +EXPLAIN EXTENDED SELECT STRAIGHT_JOIN * +FROM ( SELECT * FROM t1 WHERE c1 IN ( SELECT c2 FROM t2 ) ) AS sq; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 2 100.00 Using where +3 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 3 100.00 Using where +Warnings: +Note 1003 select straight_join `test`.`t1`.`c1` AS `c1` from `test`.`t1` where (`test`.`t1`.`c1`,(select `test`.`t2`.`c2` from `test`.`t2` where (`test`.`t1`.`c1`) = `test`.`t2`.`c2`)) +DROP TABLE t1, t2; set optimizer_switch=@exit_optimizer_switch; set join_cache_level=@exit_join_cache_level; diff --git a/mysql-test/r/drop_debug.result b/mysql-test/r/drop_debug.result deleted file mode 100644 index 852b3ac2163..00000000000 --- a/mysql-test/r/drop_debug.result +++ /dev/null @@ -1,25 +0,0 @@ - -# -- -# -- Bug#43138: DROP DATABASE failure does not clean up message list. -# -- - -DROP DATABASE IF EXISTS mysql_test; - -CREATE DATABASE mysql_test; -CREATE TABLE mysql_test.t1(a INT); -CREATE TABLE mysql_test.t2(b INT); -CREATE TABLE mysql_test.t3(c INT); - -SET SESSION debug_dbug= "+d,bug43138"; - -DROP DATABASE mysql_test; -Warnings: -Error 1051 Unknown table 't1' -Error 1051 Unknown table 't2' -Error 1051 Unknown table 't3' - -SET SESSION debug_dbug= "-d,bug43138"; - -# -- -# -- End of Bug#43138. -# -- diff --git a/mysql-test/r/errors.result b/mysql-test/r/errors.result index cf3e738395a..6d77a582fb8 100644 --- a/mysql-test/r/errors.result +++ b/mysql-test/r/errors.result @@ -172,3 +172,7 @@ UPDATE t1 SET a = 'new' WHERE COLUMN_CREATE( 1, 'v', 1, 'w' ) IS NULL; ERROR 22007: Illegal value used as argument of dynamic column function drop table t1; +set max_session_mem_used = 50000; +select * from seq_1_to_1000; +set max_session_mem_used = 8192; +select * from seq_1_to_1000; diff --git a/mysql-test/r/events_2.result b/mysql-test/r/events_2.result index ab5d47b5118..6d2ebda03d0 100644 --- a/mysql-test/r/events_2.result +++ b/mysql-test/r/events_2.result @@ -2,10 +2,10 @@ set sql_mode=""; drop database if exists events_test; create database events_test; use events_test; -create event e_26 on schedule at '2027-01-01 00:00:00' disable do set @a = 5; +create event e_26 on schedule at '2037-01-01 00:00:00' disable do set @a = 5; select db, name, body, definer, convert_tz(execute_at, 'UTC', 'SYSTEM'), on_completion from mysql.event; db name body definer convert_tz(execute_at, 'UTC', 'SYSTEM') on_completion -events_test e_26 set @a = 5 root@localhost 2027-01-01 00:00:00 DROP +events_test e_26 set @a = 5 root@localhost 2037-01-01 00:00:00 DROP drop event e_26; create event e_26 on schedule at NULL disable do set @a = 5; ERROR HY000: Incorrect AT value: 'NULL' diff --git a/mysql-test/r/explain_json.result b/mysql-test/r/explain_json.result index 1af67cf6a4e..1e95e983253 100644 --- a/mysql-test/r/explain_json.result +++ b/mysql-test/r/explain_json.result @@ -825,7 +825,7 @@ EXPLAIN "buffer_type": "flat", "buffer_size": "256Kb", "join_type": "BNL", - "attached_condition": "t2.b <> outer_t1.a and trigcond((outer_t1.a) = t1.a or t1.a is null)" + "attached_condition": "t2.b <> outer_t1.a" } } } @@ -1573,7 +1573,7 @@ EXPLAIN "access_type": "ALL", "rows": 10, "filtered": 100, - "attached_condition": "t0.a < 5 and t1.b < t0.a" + "attached_condition": "t1.b < t0.a" } } } diff --git a/mysql-test/r/func_concat.result b/mysql-test/r/func_concat.result index 925158ab129..b87ee7bfc52 100644 --- a/mysql-test/r/func_concat.result +++ b/mysql-test/r/func_concat.result @@ -149,3 +149,116 @@ CALL p1(); ########################################40100.000 DROP PROCEDURE p1; # End of 5.1 tests +# +# Start of 10.0 tests +# +# +# MDEV-10306 Wrong results with combination of CONCAT, SUBSTR and CONVERT in subquery +# +SET @save_optimizer_switch=@@optimizer_switch; +SET optimizer_switch='derived_merge=on'; +CREATE TABLE t1 (t VARCHAR(10) CHARSET latin1); +INSERT INTO t1 VALUES('1234567'); +SELECT CONCAT(SUBSTR(t2, 1, 3), SUBSTR(t2, 5)) c1, +CONCAT(SUBSTR(t2,1,3),'---',SUBSTR(t2,5)) c2 +FROM (SELECT CONVERT(t USING latin1) t2 FROM t1) sub; +c1 c2 +123567 123---567 +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT CONVERT(t USING latin1) t2 FROM t1) sub; +c2 +1234567-1234567 +DROP TABLE t1; +CREATE TABLE t1 (t VARCHAR(10) CHARSET latin1); +INSERT INTO t1 VALUES('1234567'); +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT CONVERT(t USING latin1) t2 FROM t1) sub; +c2 +1234567-1234567 +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT REVERSE(t) t2 FROM t1) sub; +c2 +7654321-7654321 +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT SOUNDEX(t) t2 FROM t1) sub; +c2 +- +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT TO_BASE64(t) t2 FROM t1) sub; +c2 +MTIzNDU2Nw==-MTIzNDU2Nw== +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT WEIGHT_STRING(t) t2 FROM t1) sub; +c2 +1234567-1234567 +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT HEX(t) t2 FROM t1) sub; +c2 +31323334353637-31323334353637 +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT QUOTE(t) t2 FROM t1) sub; +c2 +'1234567'-'1234567' +DROP TABLE t1; +CREATE TABLE t1 (t VARCHAR(32) CHARSET latin1); +INSERT INTO t1 VALUES(TO_BASE64('abcdefghi')); +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT FROM_BASE64(t) t2 FROM t1) sub; +c2 +abcdefghi-abcdefghi +DROP TABLE t1; +CREATE TABLE t1 (t VARCHAR(32) CHARSET latin1); +INSERT INTO t1 VALUES(HEX('abcdefghi')); +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UNHEX(t) t2 FROM t1) sub; +c2 +abcdefghi-abcdefghi +DROP TABLE t1; +CREATE TABLE t1 (t VARCHAR(30) CHARSET latin1); +INSERT INTO t1 VALUES('test'); +SELECT LENGTH(CONCAT(t2)) c2 FROM (SELECT AES_ENCRYPT(t,'x') t2 FROM t1) sub; +c2 +16 +SELECT LENGTH(CONCAT(t2,'-',t2)) c2 FROM (SELECT AES_ENCRYPT(t,'x') t2 FROM t1) sub; +c2 +33 +SELECT LENGTH(CONCAT(t2,'--',t2)) c2 FROM (SELECT AES_ENCRYPT(t,'x') t2 FROM t1) sub; +c2 +34 +SELECT LENGTH(CONCAT(t2)) c2 FROM (SELECT AES_DECRYPT(AES_ENCRYPT(t,'x'),'x') t2 FROM t1) sub; +c2 +4 +SELECT LENGTH(CONCAT(t2,'-',t2)) c2 FROM (SELECT AES_DECRYPT(AES_ENCRYPT(t,'x'),'x') t2 FROM t1) sub; +c2 +9 +SELECT LENGTH(CONCAT(t2,'--',t2)) c2 FROM (SELECT AES_DECRYPT(AES_ENCRYPT(t,'x'),'x') t2 FROM t1) sub; +c2 +10 +DROP TABLE t1; +CREATE TABLE t1 (t VARCHAR(64) CHARSET latin1); +INSERT INTO t1 VALUES('123456789'); +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT MD5(t) t2 FROM t1) sub; +c2 +25f9e794323b453885f5181f1b624d0b-25f9e794323b453885f5181f1b624d0b +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT FORMAT(t,2) t2 FROM t1) sub; +c2 +123,456,789.00-123,456,789.00 +DROP TABLE t1; +CREATE TABLE t1 (t VARCHAR(32) CHARSET latin1); +INSERT INTO t1 VALUES('abcdefghi'); +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT INSERT(t,3,4,'xxx') t2 FROM t1) sub; +c2 +abxxxghi-abxxxghi +DROP TABLE t1; +CREATE TABLE t1 (t VARCHAR(10) CHARSET latin1); +INSERT INTO t1 VALUES('abcdefghi'); +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LEFT(t,10) t2 FROM t1) sub; +c2 +abcdefghi-abcdefghi +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT RIGHT(t,10) t2 FROM t1) sub; +c2 +abcdefghi-abcdefghi +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT SUBSTR(t,1,10) t2 FROM t1) sub; +c2 +abcdefghi-abcdefghi +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LTRIM(t) t2 FROM t1) sub; +c2 +abcdefghi-abcdefghi +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT RTRIM(t) t2 FROM t1) sub; +c2 +abcdefghi-abcdefghi +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT TRIM(t) t2 FROM t1) sub; +c2 +abcdefghi-abcdefghi +DROP TABLE t1; +SET optimizer_switch=@save_optimizer_switch; diff --git a/mysql-test/r/func_crypt.result b/mysql-test/r/func_crypt.result index c8a621e2fd3..aaa6aa61eae 100644 --- a/mysql-test/r/func_crypt.result +++ b/mysql-test/r/func_crypt.result @@ -107,6 +107,24 @@ OLD_PASSWORD(c1) PASSWORD(c1) DROP TABLE t1; # End of 5.0 tests # +# Start of 10.0 tests +# +# +# MDEV-10306 Wrong results with combination of CONCAT, SUBSTR and CONVERT in subquery +# +SET @save_optimizer_switch=@@optimizer_switch; +SET optimizer_switch='derived_merge=on'; +CREATE TABLE t1 (t VARCHAR(32) CHARSET latin1); +INSERT INTO t1 VALUES('abcdefghi'); +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT ENCRYPT(t,'aa') t2 FROM t1) sub; +c2 +aaHHlPHAM4sjs-aaHHlPHAM4sjs +DROP TABLE t1; +SET optimizer_switch=@save_optimizer_switch; +# +# End of 10.0 tests +# +# # Start of 10.1 tests # # Start of func_str_ascii_checksum.inc diff --git a/mysql-test/r/func_group.result b/mysql-test/r/func_group.result index cb97ea298a0..c4e991e8cbe 100644 --- a/mysql-test/r/func_group.result +++ b/mysql-test/r/func_group.result @@ -2447,3 +2447,12 @@ DROP TABLE t1; # # End of 10.1 tests # +# +# MDEV-13064: assertion `n < m_size' fails in Item::split_sum_func2() +# +create table t1 (i int) engine=MyISAM; +insert into t1 value (1),(2); +select count(*)+sleep(0) from t1; +count(*)+sleep(0) +2 +drop table t1; diff --git a/mysql-test/r/func_json.result b/mysql-test/r/func_json.result index eff8f5c9c92..5c3134b7ce9 100644 --- a/mysql-test/r/func_json.result +++ b/mysql-test/r/func_json.result @@ -356,6 +356,12 @@ json_keys('foo') NULL Warnings: Warning 4038 Syntax error in JSON text in argument 1 to function 'json_keys' at position 1 +select json_keys('{"a":{"c":1, "d":2}, "b":2, "c":1, "a":3, "b":1, "c":2}'); +json_keys('{"a":{"c":1, "d":2}, "b":2, "c":1, "a":3, "b":1, "c":2}') +["a", "b", "c"] +select json_keys('{"c1": "value 1", "c1": "value 2"}'); +json_keys('{"c1": "value 1", "c1": "value 2"}') +["c1"] SET @j = '["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]'; select json_search(@j, 'one', 'abc'); json_search(@j, 'one', 'abc') @@ -629,3 +635,73 @@ j p json_remove(j, p) {"a":1,"b":2,"c":3} $.b {"a": 1, "c": 3} {"a":1,"b":2,"c":3} $.c {"a": 1, "b": 2} drop table t1; +SET @str = 'bar', @path = '$'; +SELECT JSON_SEARCH('{"foo":"bar"}', 'all' , @str, '%', @path); +JSON_SEARCH('{"foo":"bar"}', 'all' , @str, '%', @path) +"$.foo" +SELECT JSON_VALUE('[{"foo": 1},"bar"]', '$[*][0]'); +JSON_VALUE('[{"foo": 1},"bar"]', '$[*][0]') +bar +CREATE TABLE t1 (f INT NOT NULL); +INSERT INTO t1 VALUES (0); +SELECT JSON_KEYS(f) FROM t1 ORDER BY 1; +JSON_KEYS(f) +NULL +DROP TABLE t1; +SELECT JSON_EXTRACT( '{"foo":"bar"}', '$[*].*' ); +JSON_EXTRACT( '{"foo":"bar"}', '$[*].*' ) +NULL +SELECT JSON_EXTRACT( '{"foo":"bar"}', '$[*]' ); +JSON_EXTRACT( '{"foo":"bar"}', '$[*]' ) +NULL +select JSON_EXTRACT('{"name":"value"}', '$.name') = 'value'; +JSON_EXTRACT('{"name":"value"}', '$.name') = 'value' +1 +select JSON_EXTRACT('{\"asdf\":true}', "$.\"asdf\"") = true; +JSON_EXTRACT('{\"asdf\":true}', "$.\"asdf\"") = true +1 +select JSON_EXTRACT('{\"asdf\":true}', "$.\"asdf\"") = false; +JSON_EXTRACT('{\"asdf\":true}', "$.\"asdf\"") = false +0 +select JSON_EXTRACT('{\"asdf\":true}', "$.\"asdf\"") = 1; +JSON_EXTRACT('{\"asdf\":true}', "$.\"asdf\"") = 1 +1 +select JSON_EXTRACT('{\"input1\":\"\\u00f6\"}', '$.\"input1\"'); +JSON_EXTRACT('{\"input1\":\"\\u00f6\"}', '$.\"input1\"') +"\u00f6" +select JSON_EXTRACT('{"foo": "bar" foobar foo invalid ', '$.foo'); +JSON_EXTRACT('{"foo": "bar" foobar foo invalid ', '$.foo') +NULL +Warnings: +Warning 4038 Syntax error in JSON text in argument 1 to function 'json_extract' at position 15 +SELECT JSON_OBJECT('foo', '`'); +JSON_OBJECT('foo', '`') +{"foo": "`"} +SELECT JSON_OBJECT("foo", "bar`bar"); +JSON_OBJECT("foo", "bar`bar") +{"foo": "bar`bar"} +SELECT JSON_SET('{}', '$.age', 87); +JSON_SET('{}', '$.age', 87) +{"age": 87} +SELECT JSON_MERGE('[]', '{"c":"d"}'); +JSON_MERGE('[]', '{"c":"d"}') +[{"c": "d"}] +SET @str = "{\"\\u00e4\\u00f6\":\"yes\"}"; +SET @path = "$.\"\\u00e4\\u00f6\""; +select @str, @path, JSON_EXTRACT(@str, @path); +@str @path JSON_EXTRACT(@str, @path) +{"\u00e4\u00f6":"yes"} $."\u00e4\u00f6" "yes" +SET @str = "{\"\\u00e4\":\"yes\"}"; +SET @path = "$.\"\\u00e4\""; +select @str, @path, JSON_EXTRACT(@str, @path); +@str @path JSON_EXTRACT(@str, @path) +{"\u00e4":"yes"} $."\u00e4" "yes" +select json_array(5,json_query('[1,2]','$')); +json_array(5,json_query('[1,2]','$')) +[5, [1,2]] +SELECT JSON_ARRAY('1. Ä› 2. Å¡ 3. Ä 4. Å™ 5. ž 6. ý 7. á 8. í 9. é 10. ů 11. ú') AS json_data; +json_data +["1. Ä› 2. Å¡ 3. Ä 4. Å™ 5. ž 6. ý 7. á 8. í 9. é 10. ů 11. ú"] +SELECT JSON_OBJECT("user","Jožko MrkviÄká") as json_data; +json_data +{"user": "Jožko MrkviÄká"} diff --git a/mysql-test/r/func_math.result b/mysql-test/r/func_math.result index 8ca10203add..ff2e929cffc 100644 --- a/mysql-test/r/func_math.result +++ b/mysql-test/r/func_math.result @@ -838,3 +838,8 @@ select 0=0, 0=-0, 0.0= -0.0, 0.0 = -(0.0), 0.0E1=-0.0E1, 0.0E1=-(0.0E1); select CRC32(NULL), CRC32(''), CRC32('MySQL'), CRC32('mysql'), CRC32('01234567'), CRC32('012345678'); CRC32(NULL) CRC32('') CRC32('MySQL') CRC32('mysql') CRC32('01234567') CRC32('012345678') NULL 0 3259397556 2501908538 763378421 939184570 +explain extended select (3-2)+1, (3/2)*1, 3-(2+1), 3/(2*1); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Warnings: +Note 1003 select 3 - 2 + 1 AS `(3-2)+1`,3 / 2 * 1 AS `(3/2)*1`,3 - (2 + 1) AS `3-(2+1)`,3 / (2 * 1) AS `3/(2*1)` diff --git a/mysql-test/r/func_regexp_pcre.result b/mysql-test/r/func_regexp_pcre.result index 18aa7ed8379..ece2019ef83 100644 --- a/mysql-test/r/func_regexp_pcre.result +++ b/mysql-test/r/func_regexp_pcre.result @@ -880,3 +880,51 @@ SET @regCheck= '\\xE0\\x01'; SELECT CAST(0xE001 AS BINARY) REGEXP @regCheck; CAST(0xE001 AS BINARY) REGEXP @regCheck 1 +# MDEV-12420: Testing recursion overflow +SELECT 1 FROM dual WHERE ('Alpha,Bravo,Charlie,Delta,Echo,Foxtrot,StrataCentral,Golf,Hotel,India,Juliet,Kilo,Lima,Mike,StrataL3,November,Oscar,StrataL2,Sand,P3,P4SwitchTest,Arsys,Poppa,ExtensionMgr,Arp,Quebec,Romeo,StrataApiV2,PtReyes,Sierra,SandAcl,Arrow,Artools,BridgeTest,Tango,SandT,PAlaska,Namespace,Agent,Qos,PatchPanel,ProjectReport,Ark,Gimp,Agent,SliceAgent,Arnet,Bgp,Ale,Tommy,Central,AsicPktTestLib,Hsc,SandL3,Abuild,Pca9555,Standby,ControllerDut,CalSys,SandLib,Sb820,PointV2,BfnLib,Evpn,BfnSdk,Sflow,ManagementActive,AutoTest,GatedTest,Bgp,Sand,xinetd,BfnAgentLib,bf-utils,Hello,BfnState,Eos,Artest,Qos,Scd,ThermoMgr,Uniform,EosUtils,Eb,FanController,Central,BfnL3,BfnL2,tcp_wrappers,Victor,Environment,Route,Failover,Whiskey,Xray,Gimp,BfnFixed,Strata,SoCal,XApi,Msrp,XpProfile,tcpdump,PatchPanel,ArosTest,FhTest,Arbus,XpAcl,MacConc,XpApi,telnet,QosTest,Alpha2,BfnVlan,Stp,VxlanControllerTest,MplsAgent,Bravo2,Lanz,BfnMbb,Intf,XCtrl,Unicast,SandTunnel,L3Unicast,Ipsec,MplsTest,Rsvp,EthIntf,StageMgr,Sol,MplsUtils,Nat,Ira,P4NamespaceDut,Counters,Charlie2,Aqlc,Mlag,Power,OpenFlow,Lag,RestApi,BfdTest,strongs,Sfa,CEosUtils,Adt746,MaintenanceMode,MlagDut,EosImage,IpEth,MultiProtocol,Launcher,Max3179,Snmp,Acl,IpEthTest,PhyEee,bf-syslibs,tacc,XpL2,p4-ar-switch,p4-bf-switch,LdpTest,BfnPhy,Mirroring,Phy6,Ptp' REGEXP '^((?!\b(Strata|StrataApi|StrataApiV2)\b).)*$'); +1 +Warnings: +Warning 1139 Got error 'pcre_exec: recursion limit of NUM exceeded' from regexp +SELECT CONCAT(REPEAT('100,',133),'101') RLIKE '^(([1-9][0-9]*),)*[1-9][0-9]*$'; +CONCAT(REPEAT('100,',133),'101') RLIKE '^(([1-9][0-9]*),)*[1-9][0-9]*$' +1 +SELECT CONCAT(REPEAT('100,',200),'101') RLIKE '^(([1-9][0-9]*),)*[1-9][0-9]*$'; +CONCAT(REPEAT('100,',200),'101') RLIKE '^(([1-9][0-9]*),)*[1-9][0-9]*$' +0 +Warnings: +Warning 1139 Got error 'pcre_exec: recursion limit of NUM exceeded' from regexp +SELECT REGEXP_INSTR(CONCAT(REPEAT('100,',133),'101'), '^(([1-9][0-9]*),)*[1-9][0-9]*$'); +REGEXP_INSTR(CONCAT(REPEAT('100,',133),'101'), '^(([1-9][0-9]*),)*[1-9][0-9]*$') +1 +SELECT REGEXP_INSTR(CONCAT(REPEAT('100,',200),'101'), '^(([1-9][0-9]*),)*[1-9][0-9]*$'); +REGEXP_INSTR(CONCAT(REPEAT('100,',200),'101'), '^(([1-9][0-9]*),)*[1-9][0-9]*$') +0 +Warnings: +Warning 1139 Got error 'pcre_exec: recursion limit of NUM exceeded' from regexp +SELECT LENGTH(REGEXP_SUBSTR(CONCAT(REPEAT('100,',133),'101'), '^(([1-9][0-9]*),)*[1-9][0-9]*$')); +LENGTH(REGEXP_SUBSTR(CONCAT(REPEAT('100,',133),'101'), '^(([1-9][0-9]*),)*[1-9][0-9]*$')) +535 +SELECT LENGTH(REGEXP_SUBSTR(CONCAT(REPEAT('100,',200),'101'), '^(([1-9][0-9]*),)*[1-9][0-9]*$')); +LENGTH(REGEXP_SUBSTR(CONCAT(REPEAT('100,',200),'101'), '^(([1-9][0-9]*),)*[1-9][0-9]*$')) +0 +Warnings: +Warning 1139 Got error 'pcre_exec: recursion limit of NUM exceeded' from regexp +SELECT LENGTH(REGEXP_REPLACE(CONCAT(REPEAT('100,',133),'101'), '^(([1-9][0-9]*),)*[1-9][0-9]*$', '')); +LENGTH(REGEXP_REPLACE(CONCAT(REPEAT('100,',133),'101'), '^(([1-9][0-9]*),)*[1-9][0-9]*$', '')) +0 +SELECT LENGTH(REGEXP_REPLACE(CONCAT(REPEAT('100,',200),'101'), '^(([1-9][0-9]*),)*[1-9][0-9]*$', '')); +LENGTH(REGEXP_REPLACE(CONCAT(REPEAT('100,',200),'101'), '^(([1-9][0-9]*),)*[1-9][0-9]*$', '')) +803 +Warnings: +Warning 1139 Got error 'pcre_exec: recursion limit of NUM exceeded' from regexp +SELECT REGEXP_INSTR('a_kollision', 'oll'); +REGEXP_INSTR('a_kollision', 'oll') +4 +SELECT REGEXP_INSTR('a_kollision', '(oll)'); +REGEXP_INSTR('a_kollision', '(oll)') +4 +SELECT REGEXP_INSTR('a_kollision', 'o([lm])\\1'); +REGEXP_INSTR('a_kollision', 'o([lm])\\1') +4 +SELECT a FROM (SELECT "aa" a) t WHERE a REGEXP '[0-9]'; +a diff --git a/mysql-test/r/gis-json.result b/mysql-test/r/gis-json.result index 8625a5bfb74..d888b08351d 100644 --- a/mysql-test/r/gis-json.result +++ b/mysql-test/r/gis-json.result @@ -61,6 +61,34 @@ POINT(102 0.5) SELECT st_astext(st_geomfromgeojson('{ "type": "FeatureCollection", "features": [{ "type": "Feature", "geometry": { "type": "Point", "coordinates": [102.0, 0.5] }, "properties": { "prop0": "value0" } }]}')); st_astext(st_geomfromgeojson('{ "type": "FeatureCollection", "features": [{ "type": "Feature", "geometry": { "type": "Point", "coordinates": [102.0, 0.5] }, "properties": { "prop0": "value0" } }]}')) GEOMETRYCOLLECTION(POINT(102 0.5)) +SELECT ST_AsText(ST_GeomFromGeoJSON('{ "type": "Point", "coordinates": [5.3, 15.0, 4.3]}',5)); +ERROR HY000: Incorrect option value: '5' for function ST_GeometryFromJSON +SELECT ST_AsText(ST_GeomFromGeoJSON('{ "type": "Point", "coordinates": [5.3, 15.0, 4.3]}',1)); +ERROR 22023: Invalid GIS data provided to function ST_GeometryFromJSON. +SELECT ST_AsText(ST_GeomFromGeoJSON('{ "type": "Point", "coordinates": [5.3, 15.0, 4.3]}',2)); +ST_AsText(ST_GeomFromGeoJSON('{ "type": "Point", "coordinates": [5.3, 15.0, 4.3]}',2)) +POINT(5.3 15) +SELECT ST_AsText(ST_GeomFromGeoJSON('{ "type": "Point", "coordinates": [5.3, 15.0, 4.3]}',3)); +ST_AsText(ST_GeomFromGeoJSON('{ "type": "Point", "coordinates": [5.3, 15.0, 4.3]}',3)) +POINT(5.3 15) +SELECT ST_AsText(ST_GeomFromGeoJSON('{ "type": "Point", "coordinates": [5.3, 15.0, 4.3]}',4)); +ST_AsText(ST_GeomFromGeoJSON('{ "type": "Point", "coordinates": [5.3, 15.0, 4.3]}',4)) +POINT(5.3 15) +SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(5.363 7.266)'),2); +ST_AsGeoJSON(ST_GeomFromText('POINT(5.363 7.266)'),2) +{"type": "Point", "coordinates": [5.36, 7.27]} +SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(5.363 7.266)'),1); +ST_AsGeoJSON(ST_GeomFromText('POINT(5.363 7.266)'),1) +{"type": "Point", "coordinates": [5.4, 7.3]} +SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(5.363 7.266)'),10); +ST_AsGeoJSON(ST_GeomFromText('POINT(5.363 7.266)'),10) +{"type": "Point", "coordinates": [5.363, 7.266]} +SELECT ST_AsGeoJSON(ST_GeomFromText("POINT(10 11)"), 100, 1); +ST_AsGeoJSON(ST_GeomFromText("POINT(10 11)"), 100, 1) +{"bbox": [10, 11, 10, 11], "type": "Point", "coordinates": [10, 11]} +SELECT ST_AsGeoJSON(ST_GeomFromText("POINT(10 11)"), 100, 5); +ST_AsGeoJSON(ST_GeomFromText("POINT(10 11)"), 100, 5) +{"bbox": [10, 11, 10, 11], "type": "Point", "coordinates": [10, 11]} # # End of 10.2 tests # diff --git a/mysql-test/r/gis-rt-precise.result b/mysql-test/r/gis-rt-precise.result index 65583a0ce0d..d3308ed90ba 100644 --- a/mysql-test/r/gis-rt-precise.result +++ b/mysql-test/r/gis-rt-precise.result @@ -51,7 +51,7 @@ count(*) EXPLAIN SELECT fid, AsText(g) FROM t1 WHERE ST_Within(g, GeomFromText('Polygon((40 40,60 40,60 60,40 40))')); id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 range g g 34 NULL 1 Using where +1 SIMPLE t1 range g g 34 NULL 4 Using where SELECT fid, AsText(g) FROM t1 WHERE ST_Within(g, GeomFromText('Polygon((40 40,60 40,60 60,40 40))')); fid AsText(g) diff --git a/mysql-test/r/gis-rtree.result b/mysql-test/r/gis-rtree.result index b76d02ef1d7..9373237f1d6 100644 --- a/mysql-test/r/gis-rtree.result +++ b/mysql-test/r/gis-rtree.result @@ -301,7 +301,7 @@ count(*) EXPLAIN SELECT fid, AsText(g) FROM t2 WHERE Within(g, GeomFromText('Polygon((40 40,60 40,60 60,40 60,40 40))')); id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 range g g 34 NULL 1 Using where +1 SIMPLE t2 range g g 34 NULL 4 Using where SELECT fid, AsText(g) FROM t2 WHERE Within(g, GeomFromText('Polygon((40 40,60 40,60 60,40 60,40 40))')); fid AsText(g) diff --git a/mysql-test/r/gis.result b/mysql-test/r/gis.result index b9ee2a9136f..93e980efa2b 100644 --- a/mysql-test/r/gis.result +++ b/mysql-test/r/gis.result @@ -331,8 +331,8 @@ fid IsClosed(g) 116 0 SELECT fid, AsText(Centroid(g)) FROM gis_multi_polygon; fid AsText(Centroid(g)) -117 POINT(55.58852775304245 17.426536064113982) -118 POINT(55.58852775304245 17.426536064113982) +117 POINT(57.98031067576927 17.854754130800433) +118 POINT(57.98031067576927 17.854754130800433) 119 POINT(2 2) SELECT fid, Area(g) FROM gis_multi_polygon; fid Area(g) @@ -680,11 +680,11 @@ insert into t1 values ('85984',GeomFromText('MULTIPOLYGON(((-115.006363 select object_id, geometrytype(geo), ISSIMPLE(GEO), ASTEXT(centroid(geo)) from t1 where object_id=85998; object_id geometrytype(geo) ISSIMPLE(GEO) ASTEXT(centroid(geo)) -85998 MULTIPOLYGON 1 POINT(115.31877315203187 -36.23747282102153) +85998 MULTIPOLYGON 1 POINT(115.2970604672862 -36.23335610879993) select object_id, geometrytype(geo), ISSIMPLE(GEO), ASTEXT(centroid(geo)) from t1 where object_id=85984; object_id geometrytype(geo) ISSIMPLE(GEO) ASTEXT(centroid(geo)) -85984 MULTIPOLYGON 1 POINT(-114.87787186923313 36.33101763469059) +85984 MULTIPOLYGON 1 POINT(-114.86854472054372 36.34725218253213) drop table t1; create table t1 (fl geometry not null); insert into t1 values (1); @@ -1616,8 +1616,8 @@ insert into t1 values(geomfromtext("POINT(0 9.2233720368548e18)")); select equals(`a`,convert(`a` using utf8)) from `t1`; equals(`a`,convert(`a` using utf8)) 1 -NULL -NULL +0 +0 Warnings: Warning 1300 Invalid utf8 character string: '\xE0C' Warning 1300 Invalid utf8 character string: '\xE0C' @@ -1702,7 +1702,37 @@ SELECT ASTEXT(p) FROM v1; ASTEXT(p) POINT(1 1) DROP VIEW v1; -End of 5.5 tests +# +# Start of 10.0 tests +# +# +# MDEV-12495 Conditional jump depends on uninitialised value for: SELECT NULL UNION geom_expression +# +SELECT AsText(g) FROM (SELECT NULL AS g UNION SELECT Point(1,1)) AS t1; +AsText(g) +NULL +POINT(1 1) +# +# MDEV-10306 Wrong results with combination of CONCAT, SUBSTR and CONVERT in subquery +# +SET @save_optimizer_switch=@@optimizer_switch; +SET optimizer_switch='derived_merge=on'; +CREATE TABLE t1 (x INT, y INT); +INSERT INTO t1 VALUES(0,0); +SELECT LENGTH(t2) c2 FROM (SELECT ST_BUFFER(POINT(x,y), 0) t2 FROM t1) sub; +c2 +25 +SELECT LENGTH(CONCAT(t2,'-',t2)) c2 FROM (SELECT ST_BUFFER(POINT(x,y), 0) t2 FROM t1) sub; +c2 +51 +SELECT LENGTH(CONCAT(t2,'--',t2)) c2 FROM (SELECT ST_BUFFER(POINT(x,y), 0) t2 FROM t1) sub; +c2 +52 +DROP TABLE t1; +SET optimizer_switch=@save_optimizer_switch; +# +# End 10.0 tests +# SHOW CREATE TABLE information_schema.geometry_columns; Table Create Table GEOMETRY_COLUMNS CREATE TEMPORARY TABLE `GEOMETRY_COLUMNS` ( diff --git a/mysql-test/r/group_by.result b/mysql-test/r/group_by.result index bd5f4bc1efd..f893bb23f6b 100644 --- a/mysql-test/r/group_by.result +++ b/mysql-test/r/group_by.result @@ -2640,6 +2640,33 @@ select a from t1 group by a having a > 1; a drop table t1; set sql_mode= @save_sql_mode; +create table t1 (f1 int); +insert into t1 values (5),(9); +create table t2 (f2 int); +insert into t2 values (0),(6); +create table t3 (f3 int); +insert into t3 values (6),(3); +create table t4 (f4 int); +insert into t4 values (1),(0); +select +(select min(f1) from t1 where f1 in (select min(f4) from t2)) as field7, +(select count(*) from t3 where f3 in (select max(f4) from t2 group by field7)) +from t4; +ERROR 42S22: Reference 'field7' not supported (reference to group function) +drop table t1, t2, t3, t4; +create table t1 (i1 int); +insert into t1 values (1); +create table t2 (i int); +insert into t2 values (2); +select 1 from t1 left join t2 b on b.i = (select max(b.i) from t2); +1 +1 +drop table t1, t2; +create table t1 (c1 int, c2 int); +create table t2 (c1 int, c2 int); +select t1.c1 as c1, t2.c2 as c1 from t1, t2 where t1.c1 < 20 and t2.c2 > 5 group by t1.c1, t2.c2 having t1.c1 < 3; +c1 c1 +drop table t1, t2; # # Bug #58782 # Missing rows with SELECT .. WHERE .. IN subquery diff --git a/mysql-test/r/handlersocket.result b/mysql-test/r/handlersocket.result index 26c77813b26..1b3fc573548 100644 --- a/mysql-test/r/handlersocket.result +++ b/mysql-test/r/handlersocket.result @@ -5,7 +5,7 @@ plugin_version 1.0 plugin_status ACTIVE plugin_type DAEMON plugin_library handlersocket.so -plugin_library_version 1.12 +plugin_library_version 1.13 plugin_author higuchi dot akira at dena dot jp plugin_description Direct access into InnoDB plugin_license BSD diff --git a/mysql-test/r/index_merge_myisam.result b/mysql-test/r/index_merge_myisam.result index 21387f67893..992e1d831b5 100644 --- a/mysql-test/r/index_merge_myisam.result +++ b/mysql-test/r/index_merge_myisam.result @@ -34,6 +34,9 @@ key1 key2 key3 key4 key5 key6 key7 key8 1022 1022 1022 1022 1022 1022 1022 2 1023 1023 1023 1023 1023 1023 1023 1 1024 1024 1024 1024 1024 1024 1024 0 +select * from t0 where key1=1022; +key1 key2 key3 key4 key5 key6 key7 key8 +1022 1022 1022 1022 1022 1022 1022 2 explain select * from t0 where key1 < 3 or key2 <4; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t0 index_merge i1,i2 i1,i2 4,4 NULL 7 Using sort_union(i1,i2); Using where diff --git a/mysql-test/r/information_schema.result b/mysql-test/r/information_schema.result index dad6d5d8c8a..00ec9d9f39c 100644 --- a/mysql-test/r/information_schema.result +++ b/mysql-test/r/information_schema.result @@ -1344,13 +1344,13 @@ DROP TABLE IF EXISTS bug23037; DROP FUNCTION IF EXISTS get_value; SELECT COLUMN_NAME, MD5(COLUMN_DEFAULT), LENGTH(COLUMN_DEFAULT) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='bug23037'; COLUMN_NAME MD5(COLUMN_DEFAULT) LENGTH(COLUMN_DEFAULT) -fld1 7cf7a6782be951a1f2464a350da926a5 65532 +fld1 85ea6a55b8f0058e640b3de141a3a9d9 65534 SELECT MD5(get_value()); MD5(get_value()) -7cf7a6782be951a1f2464a350da926a5 +76176d2daa20c582375b8dcfc18033cd SELECT COLUMN_NAME, MD5(COLUMN_DEFAULT), LENGTH(COLUMN_DEFAULT), COLUMN_DEFAULT=get_value() FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='bug23037'; COLUMN_NAME MD5(COLUMN_DEFAULT) LENGTH(COLUMN_DEFAULT) COLUMN_DEFAULT=get_value() -fld1 7cf7a6782be951a1f2464a350da926a5 65532 1 +fld1 85ea6a55b8f0058e640b3de141a3a9d9 65534 0 DROP TABLE bug23037; DROP FUNCTION get_value; set @tmp_optimizer_switch=@@optimizer_switch; @@ -1437,12 +1437,12 @@ select column_default from information_schema.columns where table_name= 't1'; column_default NULL NULL - +'' NULL NULL 10 NULL -2006-01-01 00:00:00 +'2006-01-01 00:00:00' show columns from t1; Field Type Null Key Default Extra f1 varchar(50) YES NULL diff --git a/mysql-test/r/information_schema_parameters.result b/mysql-test/r/information_schema_parameters.result index 67527fbfe7f..1d974851133 100644 --- a/mysql-test/r/information_schema_parameters.result +++ b/mysql-test/r/information_schema_parameters.result @@ -29,7 +29,7 @@ TABLE_SCHEMA information_schema TABLE_NAME PARAMETERS COLUMN_NAME SPECIFIC_CATALOG ORDINAL_POSITION 1 -COLUMN_DEFAULT +COLUMN_DEFAULT '' IS_NULLABLE NO DATA_TYPE varchar CHARACTER_MAXIMUM_LENGTH 512 @@ -51,7 +51,7 @@ TABLE_SCHEMA information_schema TABLE_NAME PARAMETERS COLUMN_NAME SPECIFIC_SCHEMA ORDINAL_POSITION 2 -COLUMN_DEFAULT +COLUMN_DEFAULT '' IS_NULLABLE NO DATA_TYPE varchar CHARACTER_MAXIMUM_LENGTH 64 @@ -73,7 +73,7 @@ TABLE_SCHEMA information_schema TABLE_NAME PARAMETERS COLUMN_NAME SPECIFIC_NAME ORDINAL_POSITION 3 -COLUMN_DEFAULT +COLUMN_DEFAULT '' IS_NULLABLE NO DATA_TYPE varchar CHARACTER_MAXIMUM_LENGTH 64 @@ -161,7 +161,7 @@ TABLE_SCHEMA information_schema TABLE_NAME PARAMETERS COLUMN_NAME DATA_TYPE ORDINAL_POSITION 7 -COLUMN_DEFAULT +COLUMN_DEFAULT '' IS_NULLABLE NO DATA_TYPE varchar CHARACTER_MAXIMUM_LENGTH 64 @@ -337,7 +337,7 @@ TABLE_SCHEMA information_schema TABLE_NAME PARAMETERS COLUMN_NAME DTD_IDENTIFIER ORDINAL_POSITION 15 -COLUMN_DEFAULT +COLUMN_DEFAULT '' IS_NULLABLE NO DATA_TYPE longtext CHARACTER_MAXIMUM_LENGTH 4294967295 @@ -359,7 +359,7 @@ TABLE_SCHEMA information_schema TABLE_NAME PARAMETERS COLUMN_NAME ROUTINE_TYPE ORDINAL_POSITION 16 -COLUMN_DEFAULT +COLUMN_DEFAULT '' IS_NULLABLE NO DATA_TYPE varchar CHARACTER_MAXIMUM_LENGTH 9 diff --git a/mysql-test/r/information_schema_part.result b/mysql-test/r/information_schema_part.result index 91720d12ac4..081631a512f 100644 --- a/mysql-test/r/information_schema_part.result +++ b/mysql-test/r/information_schema_part.result @@ -7,9 +7,9 @@ partition x3 values in (16, 8, 5+19, 70-43) tablespace ts3); select * from information_schema.partitions where table_schema="test" and table_name="t1"; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PARTITION_NAME SUBPARTITION_NAME PARTITION_ORDINAL_POSITION SUBPARTITION_ORDINAL_POSITION PARTITION_METHOD SUBPARTITION_METHOD PARTITION_EXPRESSION SUBPARTITION_EXPRESSION PARTITION_DESCRIPTION TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE CREATE_TIME UPDATE_TIME CHECK_TIME CHECKSUM PARTITION_COMMENT NODEGROUP TABLESPACE_NAME -def test t1 x1 NULL 1 NULL LIST NULL b*a NULL 1 0 0 0 # 1024 0 # # NULL NULL default ts1 -def test t1 x2 NULL 2 NULL LIST NULL b*a NULL 3,11,5,7 0 0 0 # 1024 0 # # NULL NULL default ts2 -def test t1 x3 NULL 3 NULL LIST NULL b*a NULL 16,8,24,27 0 0 0 # 1024 0 # # NULL NULL default ts3 +def test t1 x1 NULL 1 NULL LIST NULL `b` * `a` NULL 1 0 0 0 # 1024 0 # # NULL NULL default ts1 +def test t1 x2 NULL 2 NULL LIST NULL `b` * `a` NULL 3,11,5,7 0 0 0 # 1024 0 # # NULL NULL default ts2 +def test t1 x3 NULL 3 NULL LIST NULL `b` * `a` NULL 16,8,24,27 0 0 0 # 1024 0 # # NULL NULL default ts3 create table t2 (a int not null,b int not null,c int not null, primary key(a,b)) partition by range (a) partitions 3 @@ -19,18 +19,18 @@ partition x3 values less than maxvalue tablespace ts3); select * from information_schema.partitions where table_schema="test" and table_name="t2"; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PARTITION_NAME SUBPARTITION_NAME PARTITION_ORDINAL_POSITION SUBPARTITION_ORDINAL_POSITION PARTITION_METHOD SUBPARTITION_METHOD PARTITION_EXPRESSION SUBPARTITION_EXPRESSION PARTITION_DESCRIPTION TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE CREATE_TIME UPDATE_TIME CHECK_TIME CHECKSUM PARTITION_COMMENT NODEGROUP TABLESPACE_NAME -def test t2 x1 NULL 1 NULL RANGE NULL a NULL 5 0 0 0 # 1024 0 # # NULL NULL default ts1 -def test t2 x2 NULL 2 NULL RANGE NULL a NULL 10 0 0 0 # 1024 0 # # NULL NULL default ts2 -def test t2 x3 NULL 3 NULL RANGE NULL a NULL MAXVALUE 0 0 0 # 1024 0 # # NULL NULL default ts3 +def test t2 x1 NULL 1 NULL RANGE NULL `a` NULL 5 0 0 0 # 1024 0 # # NULL NULL default ts1 +def test t2 x2 NULL 2 NULL RANGE NULL `a` NULL 10 0 0 0 # 1024 0 # # NULL NULL default ts2 +def test t2 x3 NULL 3 NULL RANGE NULL `a` NULL MAXVALUE 0 0 0 # 1024 0 # # NULL NULL default ts3 create table t3 (f1 date) partition by hash(month(f1)) partitions 3; select * from information_schema.partitions where table_schema="test" and table_name="t3"; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PARTITION_NAME SUBPARTITION_NAME PARTITION_ORDINAL_POSITION SUBPARTITION_ORDINAL_POSITION PARTITION_METHOD SUBPARTITION_METHOD PARTITION_EXPRESSION SUBPARTITION_EXPRESSION PARTITION_DESCRIPTION TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE CREATE_TIME UPDATE_TIME CHECK_TIME CHECKSUM PARTITION_COMMENT NODEGROUP TABLESPACE_NAME -def test t3 p0 NULL 1 NULL HASH NULL month(f1) NULL NULL 0 0 0 # 1024 0 # # NULL NULL default NULL -def test t3 p1 NULL 2 NULL HASH NULL month(f1) NULL NULL 0 0 0 # 1024 0 # # NULL NULL default NULL -def test t3 p2 NULL 3 NULL HASH NULL month(f1) NULL NULL 0 0 0 # 1024 0 # # NULL NULL default NULL +def test t3 p0 NULL 1 NULL HASH NULL month(`f1`) NULL NULL 0 0 0 # 1024 0 # # NULL NULL default NULL +def test t3 p1 NULL 2 NULL HASH NULL month(`f1`) NULL NULL 0 0 0 # 1024 0 # # NULL NULL default NULL +def test t3 p2 NULL 3 NULL HASH NULL month(`f1`) NULL NULL 0 0 0 # 1024 0 # # NULL NULL default NULL create table t4 (f1 date, f2 int) partition by key(f1,f2) partitions 3; @@ -63,14 +63,14 @@ subpartition x22 tablespace t2) ); select * from information_schema.partitions where table_schema="test"; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PARTITION_NAME SUBPARTITION_NAME PARTITION_ORDINAL_POSITION SUBPARTITION_ORDINAL_POSITION PARTITION_METHOD SUBPARTITION_METHOD PARTITION_EXPRESSION SUBPARTITION_EXPRESSION PARTITION_DESCRIPTION TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE CREATE_TIME UPDATE_TIME CHECK_TIME CHECKSUM PARTITION_COMMENT NODEGROUP TABLESPACE_NAME -def test t1 x1 x11 1 1 RANGE HASH a a+b 1 0 0 0 # 1024 0 # # NULL NULL default t1 -def test t1 x1 x12 1 2 RANGE HASH a a+b 1 0 0 0 # 1024 0 # # NULL NULL default t2 -def test t1 x2 x21 2 1 RANGE HASH a a+b 5 0 0 0 # 1024 0 # # NULL NULL default t1 -def test t1 x2 x22 2 2 RANGE HASH a a+b 5 0 0 0 # 1024 0 # # NULL NULL default t2 -def test t2 x1 x11 1 1 RANGE KEY a `a` 1 0 0 0 # 1024 0 # # NULL NULL default t1 -def test t2 x1 x12 1 2 RANGE KEY a `a` 1 0 0 0 # 1024 0 # # NULL NULL default t2 -def test t2 x2 x21 2 1 RANGE KEY a `a` 5 0 0 0 # 1024 0 # # NULL NULL default t1 -def test t2 x2 x22 2 2 RANGE KEY a `a` 5 0 0 0 # 1024 0 # # NULL NULL default t2 +def test t1 x1 x11 1 1 RANGE HASH `a` `a` + `b` 1 0 0 0 # 1024 0 # # NULL NULL default t1 +def test t1 x1 x12 1 2 RANGE HASH `a` `a` + `b` 1 0 0 0 # 1024 0 # # NULL NULL default t2 +def test t1 x2 x21 2 1 RANGE HASH `a` `a` + `b` 5 0 0 0 # 1024 0 # # NULL NULL default t1 +def test t1 x2 x22 2 2 RANGE HASH `a` `a` + `b` 5 0 0 0 # 1024 0 # # NULL NULL default t2 +def test t2 x1 x11 1 1 RANGE KEY `a` `a` 1 0 0 0 # 1024 0 # # NULL NULL default t1 +def test t2 x1 x12 1 2 RANGE KEY `a` `a` 1 0 0 0 # 1024 0 # # NULL NULL default t2 +def test t2 x2 x21 2 1 RANGE KEY `a` `a` 5 0 0 0 # 1024 0 # # NULL NULL default t1 +def test t2 x2 x22 2 2 RANGE KEY `a` `a` 5 0 0 0 # 1024 0 # # NULL NULL default t2 drop table t1,t2; create table t1 ( a int not null, @@ -88,10 +88,10 @@ subpartition x22 tablespace t2 nodegroup 1) ); select * from information_schema.partitions where table_schema="test"; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PARTITION_NAME SUBPARTITION_NAME PARTITION_ORDINAL_POSITION SUBPARTITION_ORDINAL_POSITION PARTITION_METHOD SUBPARTITION_METHOD PARTITION_EXPRESSION SUBPARTITION_EXPRESSION PARTITION_DESCRIPTION TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE CREATE_TIME UPDATE_TIME CHECK_TIME CHECKSUM PARTITION_COMMENT NODEGROUP TABLESPACE_NAME -def test t1 x1 x11 1 1 RANGE HASH a a+b 1 0 0 0 # 1024 0 # # NULL NULL 0 t1 -def test t1 x1 x12 1 2 RANGE HASH a a+b 1 0 0 0 # 1024 0 # # NULL NULL 1 t2 -def test t1 x2 x21 2 1 RANGE HASH a a+b 5 0 0 0 # 1024 0 # # NULL NULL 0 t1 -def test t1 x2 x22 2 2 RANGE HASH a a+b 5 0 0 0 # 1024 0 # # NULL NULL 1 t2 +def test t1 x1 x11 1 1 RANGE HASH `a` `a` + `b` 1 0 0 0 # 1024 0 # # NULL NULL 0 t1 +def test t1 x1 x12 1 2 RANGE HASH `a` `a` + `b` 1 0 0 0 # 1024 0 # # NULL NULL 1 t2 +def test t1 x2 x21 2 1 RANGE HASH `a` `a` + `b` 5 0 0 0 # 1024 0 # # NULL NULL 0 t1 +def test t1 x2 x22 2 2 RANGE HASH `a` `a` + `b` 5 0 0 0 # 1024 0 # # NULL NULL 1 t2 show tables; Tables_in_test t1 @@ -107,9 +107,9 @@ partitions 3; select * from information_schema.partitions where table_schema="test" and table_name="t1"; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PARTITION_NAME SUBPARTITION_NAME PARTITION_ORDINAL_POSITION SUBPARTITION_ORDINAL_POSITION PARTITION_METHOD SUBPARTITION_METHOD PARTITION_EXPRESSION SUBPARTITION_EXPRESSION PARTITION_DESCRIPTION TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE CREATE_TIME UPDATE_TIME CHECK_TIME CHECKSUM PARTITION_COMMENT NODEGROUP TABLESPACE_NAME -def test t1 p0 NULL 1 NULL LINEAR HASH NULL month(f1) NULL NULL 0 0 0 # 1024 0 # # NULL NULL default NULL -def test t1 p1 NULL 2 NULL LINEAR HASH NULL month(f1) NULL NULL 0 0 0 # 1024 0 # # NULL NULL default NULL -def test t1 p2 NULL 3 NULL LINEAR HASH NULL month(f1) NULL NULL 0 0 0 # 1024 0 # # NULL NULL default NULL +def test t1 p0 NULL 1 NULL LINEAR HASH NULL month(`f1`) NULL NULL 0 0 0 # 1024 0 # # NULL NULL default NULL +def test t1 p1 NULL 2 NULL LINEAR HASH NULL month(`f1`) NULL NULL 0 0 0 # 1024 0 # # NULL NULL default NULL +def test t1 p2 NULL 3 NULL LINEAR HASH NULL month(`f1`) NULL NULL 0 0 0 # 1024 0 # # NULL NULL default NULL drop table t1; create table t1 (a int) PARTITION BY RANGE (a) @@ -120,9 +120,9 @@ Table Create Table t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -SUBPARTITION BY LINEAR HASH (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +SUBPARTITION BY LINEAR HASH (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM) select SUBPARTITION_METHOD FROM information_schema.partitions WHERE table_schema="test" AND table_name="t1"; SUBPARTITION_METHOD @@ -138,8 +138,8 @@ Table Create Table t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53) ENGINE = MyISAM) SELECT PARTITION_DESCRIPTION FROM information_schema.partitions WHERE table_schema = "test" AND table_name = "t1"; PARTITION_DESCRIPTION diff --git a/mysql-test/r/information_schema_routines.result b/mysql-test/r/information_schema_routines.result index bfbd5941834..0d83f3a2bda 100644 --- a/mysql-test/r/information_schema_routines.result +++ b/mysql-test/r/information_schema_routines.result @@ -46,7 +46,7 @@ TABLE_SCHEMA information_schema TABLE_NAME ROUTINES COLUMN_NAME SPECIFIC_NAME ORDINAL_POSITION 1 -COLUMN_DEFAULT +COLUMN_DEFAULT '' IS_NULLABLE NO DATA_TYPE varchar CHARACTER_MAXIMUM_LENGTH 64 @@ -68,7 +68,7 @@ TABLE_SCHEMA information_schema TABLE_NAME ROUTINES COLUMN_NAME ROUTINE_CATALOG ORDINAL_POSITION 2 -COLUMN_DEFAULT +COLUMN_DEFAULT '' IS_NULLABLE NO DATA_TYPE varchar CHARACTER_MAXIMUM_LENGTH 512 @@ -90,7 +90,7 @@ TABLE_SCHEMA information_schema TABLE_NAME ROUTINES COLUMN_NAME ROUTINE_SCHEMA ORDINAL_POSITION 3 -COLUMN_DEFAULT +COLUMN_DEFAULT '' IS_NULLABLE NO DATA_TYPE varchar CHARACTER_MAXIMUM_LENGTH 64 @@ -112,7 +112,7 @@ TABLE_SCHEMA information_schema TABLE_NAME ROUTINES COLUMN_NAME ROUTINE_NAME ORDINAL_POSITION 4 -COLUMN_DEFAULT +COLUMN_DEFAULT '' IS_NULLABLE NO DATA_TYPE varchar CHARACTER_MAXIMUM_LENGTH 64 @@ -134,7 +134,7 @@ TABLE_SCHEMA information_schema TABLE_NAME ROUTINES COLUMN_NAME ROUTINE_TYPE ORDINAL_POSITION 5 -COLUMN_DEFAULT +COLUMN_DEFAULT '' IS_NULLABLE NO DATA_TYPE varchar CHARACTER_MAXIMUM_LENGTH 9 @@ -156,7 +156,7 @@ TABLE_SCHEMA information_schema TABLE_NAME ROUTINES COLUMN_NAME DATA_TYPE ORDINAL_POSITION 6 -COLUMN_DEFAULT +COLUMN_DEFAULT '' IS_NULLABLE NO DATA_TYPE varchar CHARACTER_MAXIMUM_LENGTH 64 @@ -354,7 +354,7 @@ TABLE_SCHEMA information_schema TABLE_NAME ROUTINES COLUMN_NAME ROUTINE_BODY ORDINAL_POSITION 15 -COLUMN_DEFAULT +COLUMN_DEFAULT '' IS_NULLABLE NO DATA_TYPE varchar CHARACTER_MAXIMUM_LENGTH 8 @@ -442,7 +442,7 @@ TABLE_SCHEMA information_schema TABLE_NAME ROUTINES COLUMN_NAME PARAMETER_STYLE ORDINAL_POSITION 19 -COLUMN_DEFAULT +COLUMN_DEFAULT '' IS_NULLABLE NO DATA_TYPE varchar CHARACTER_MAXIMUM_LENGTH 8 @@ -464,7 +464,7 @@ TABLE_SCHEMA information_schema TABLE_NAME ROUTINES COLUMN_NAME IS_DETERMINISTIC ORDINAL_POSITION 20 -COLUMN_DEFAULT +COLUMN_DEFAULT '' IS_NULLABLE NO DATA_TYPE varchar CHARACTER_MAXIMUM_LENGTH 3 @@ -486,7 +486,7 @@ TABLE_SCHEMA information_schema TABLE_NAME ROUTINES COLUMN_NAME SQL_DATA_ACCESS ORDINAL_POSITION 21 -COLUMN_DEFAULT +COLUMN_DEFAULT '' IS_NULLABLE NO DATA_TYPE varchar CHARACTER_MAXIMUM_LENGTH 64 @@ -530,7 +530,7 @@ TABLE_SCHEMA information_schema TABLE_NAME ROUTINES COLUMN_NAME SECURITY_TYPE ORDINAL_POSITION 23 -COLUMN_DEFAULT +COLUMN_DEFAULT '' IS_NULLABLE NO DATA_TYPE varchar CHARACTER_MAXIMUM_LENGTH 7 @@ -552,7 +552,7 @@ TABLE_SCHEMA information_schema TABLE_NAME ROUTINES COLUMN_NAME CREATED ORDINAL_POSITION 24 -COLUMN_DEFAULT 0000-00-00 00:00:00 +COLUMN_DEFAULT '0000-00-00 00:00:00' IS_NULLABLE NO DATA_TYPE datetime CHARACTER_MAXIMUM_LENGTH NULL @@ -574,7 +574,7 @@ TABLE_SCHEMA information_schema TABLE_NAME ROUTINES COLUMN_NAME LAST_ALTERED ORDINAL_POSITION 25 -COLUMN_DEFAULT 0000-00-00 00:00:00 +COLUMN_DEFAULT '0000-00-00 00:00:00' IS_NULLABLE NO DATA_TYPE datetime CHARACTER_MAXIMUM_LENGTH NULL @@ -596,7 +596,7 @@ TABLE_SCHEMA information_schema TABLE_NAME ROUTINES COLUMN_NAME SQL_MODE ORDINAL_POSITION 26 -COLUMN_DEFAULT +COLUMN_DEFAULT '' IS_NULLABLE NO DATA_TYPE varchar CHARACTER_MAXIMUM_LENGTH 8192 @@ -618,7 +618,7 @@ TABLE_SCHEMA information_schema TABLE_NAME ROUTINES COLUMN_NAME ROUTINE_COMMENT ORDINAL_POSITION 27 -COLUMN_DEFAULT +COLUMN_DEFAULT '' IS_NULLABLE NO DATA_TYPE longtext CHARACTER_MAXIMUM_LENGTH 4294967295 @@ -640,7 +640,7 @@ TABLE_SCHEMA information_schema TABLE_NAME ROUTINES COLUMN_NAME DEFINER ORDINAL_POSITION 28 -COLUMN_DEFAULT +COLUMN_DEFAULT '' IS_NULLABLE NO DATA_TYPE varchar CHARACTER_MAXIMUM_LENGTH 189 @@ -662,7 +662,7 @@ TABLE_SCHEMA information_schema TABLE_NAME ROUTINES COLUMN_NAME CHARACTER_SET_CLIENT ORDINAL_POSITION 29 -COLUMN_DEFAULT +COLUMN_DEFAULT '' IS_NULLABLE NO DATA_TYPE varchar CHARACTER_MAXIMUM_LENGTH 32 @@ -684,7 +684,7 @@ TABLE_SCHEMA information_schema TABLE_NAME ROUTINES COLUMN_NAME COLLATION_CONNECTION ORDINAL_POSITION 30 -COLUMN_DEFAULT +COLUMN_DEFAULT '' IS_NULLABLE NO DATA_TYPE varchar CHARACTER_MAXIMUM_LENGTH 32 @@ -706,7 +706,7 @@ TABLE_SCHEMA information_schema TABLE_NAME ROUTINES COLUMN_NAME DATABASE_COLLATION ORDINAL_POSITION 31 -COLUMN_DEFAULT +COLUMN_DEFAULT '' IS_NULLABLE NO DATA_TYPE varchar CHARACTER_MAXIMUM_LENGTH 32 diff --git a/mysql-test/r/innodb_ext_key.result b/mysql-test/r/innodb_ext_key.result index 1305be86e5a..c55e8d138f8 100644 --- a/mysql-test/r/innodb_ext_key.result +++ b/mysql-test/r/innodb_ext_key.result @@ -1133,5 +1133,78 @@ where index_date_updated= 10 and index_id < 800; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t2 range index_date_updated index_date_updated 13 NULL # Using index condition drop table t0,t1,t2; -set optimizer_switch=@save_ext_key_optimizer_switch; -SET SESSION STORAGE_ENGINE=DEFAULT; +# +# MDEV-11196: Error:Run-Time Check Failure #2 - Stack around the variable 'key_buff' +# was corrupted, server crashes in opt_sum_query +CREATE TABLE t1 ( +pk INT, +f1 VARCHAR(3), +f2 VARCHAR(1024), +PRIMARY KEY (pk), +KEY(f2) +) ENGINE=InnoDB CHARSET utf8 ROW_FORMAT= DYNAMIC; +INSERT INTO t1 VALUES (1,'foo','abc'),(2,'bar','def'); +SELECT MAX(t2.pk) FROM t1 t2 INNER JOIN t1 t3 ON t2.f1 = t3.f1 WHERE t2.pk <= 4; +MAX(t2.pk) +2 +drop table t1; +CREATE TABLE t1 ( +pk1 INT, +pk2 INT, +f1 VARCHAR(3), +f2 VARCHAR(1021), +PRIMARY KEY (pk1,pk2), +KEY(f2) +) ENGINE=InnoDB CHARSET utf8 ROW_FORMAT= DYNAMIC; +INSERT INTO t1 VALUES (1,2,'2','abc'),(2,3,'3','def'); +explain format= json +select * from t1 force index(f2) where pk1 <= 5 and pk2 <=5 and f2 = 'abc' and f1 <= '3'; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "table": { + "table_name": "t1", + "access_type": "range", + "possible_keys": ["f2"], + "key": "f2", + "key_length": "3070", + "used_key_parts": ["f2", "pk1"], + "rows": 1, + "filtered": 100, + "index_condition": "t1.pk1 <= 5 and t1.pk2 <= 5 and t1.f2 = 'abc'", + "attached_condition": "t1.f1 <= '3'" + } + } +} +drop table t1; +CREATE TABLE t1 ( +f2 INT, +pk2 INT, +f1 VARCHAR(3), +pk1 VARCHAR(1000), +PRIMARY KEY (pk1,pk2), +KEY k1(pk1,f2) +) ENGINE=InnoDB CHARSET utf8 ROW_FORMAT= DYNAMIC; +INSERT INTO t1 VALUES (1,2,'2','abc'),(2,3,'3','def'); +explain format= json +select * from t1 force index(k1) where f2 <= 5 and pk2 <=5 and pk1 = 'abc' and f1 <= '3'; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "table": { + "table_name": "t1", + "access_type": "range", + "possible_keys": ["k1"], + "key": "k1", + "key_length": "3011", + "used_key_parts": ["pk1", "f2", "pk2"], + "rows": 1, + "filtered": 100, + "index_condition": "t1.f2 <= 5 and t1.pk2 <= 5 and t1.pk1 = 'abc'", + "attached_condition": "t1.f1 <= '3'" + } + } +} +drop table t1; diff --git a/mysql-test/r/innodb_icp.result b/mysql-test/r/innodb_icp.result index 207317c1add..8a58a769ed9 100644 --- a/mysql-test/r/innodb_icp.result +++ b/mysql-test/r/innodb_icp.result @@ -432,7 +432,7 @@ WHERE pk IN (SELECT it.pk FROM t2 JOIN t2 AS it ON it.i=it.i WHERE it.pk-t1.i<10 id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t1 ALL NULL NULL NULL NULL 3 Using where 2 DEPENDENT SUBQUERY it eq_ref PRIMARY PRIMARY 4 func 1 Using where -2 DEPENDENT SUBQUERY t2 index NULL PRIMARY 4 NULL 3 Using where; Using index; Using join buffer (flat, BNL join) +2 DEPENDENT SUBQUERY t2 index NULL PRIMARY 4 NULL 3 Using index; Using join buffer (flat, BNL join) SELECT * FROM t1 WHERE pk IN (SELECT it.pk FROM t2 JOIN t2 AS it ON it.i=it.i WHERE it.pk-t1.i<10); pk i diff --git a/mysql-test/r/join.result b/mysql-test/r/join.result index aea2d604b03..596cecfa8b2 100644 --- a/mysql-test/r/join.result +++ b/mysql-test/r/join.result @@ -757,8 +757,8 @@ statistics.TABLE_NAME, statistics.COLUMN_NAME, statistics.TABLE_CATALOG, statist columns.TABLE_CATALOG, columns.TABLE_SCHEMA, columns.COLUMN_DEFAULT, columns.IS_NULLABLE, columns.DATA_TYPE, columns.CHARACTER_MAXIMUM_LENGTH, columns.CHARACTER_OCTET_LENGTH, columns.NUMERIC_PRECISION, columns.NUMERIC_SCALE, columns.CHARACTER_SET_NAME, columns.COLLATION_NAME, columns.COLUMN_TYPE, columns.COLUMN_KEY, columns.EXTRA, columns.COLUMN_COMMENT from information_schema.statistics join information_schema.columns using(table_name,column_name) where table_name='user'; TABLE_NAME COLUMN_NAME TABLE_CATALOG TABLE_SCHEMA NON_UNIQUE INDEX_SCHEMA INDEX_NAME SEQ_IN_INDEX COLLATION SUB_PART PACKED NULLABLE INDEX_TYPE COMMENT TABLE_CATALOG TABLE_SCHEMA COLUMN_DEFAULT IS_NULLABLE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE CHARACTER_SET_NAME COLLATION_NAME COLUMN_TYPE COLUMN_KEY EXTRA COLUMN_COMMENT -user Host def mysql 0 mysql PRIMARY 1 A NULL NULL BTREE def mysql NO char 60 180 NULL NULL utf8 utf8_bin char(60) PRI -user User def mysql 0 mysql PRIMARY 2 A NULL NULL BTREE def mysql NO char 80 240 NULL NULL utf8 utf8_bin char(80) PRI +user Host def mysql 0 mysql PRIMARY 1 A NULL NULL BTREE def mysql '' NO char 60 180 NULL NULL utf8 utf8_bin char(60) PRI +user User def mysql 0 mysql PRIMARY 2 A NULL NULL BTREE def mysql '' NO char 80 240 NULL NULL utf8 utf8_bin char(80) PRI Warnings: Warning 1286 Unknown storage engine 'InnoDB' Warning 1286 Unknown storage engine 'InnoDB' diff --git a/mysql-test/r/join_cache.result b/mysql-test/r/join_cache.result index 5cb76a93d9a..eb845c63a76 100644 --- a/mysql-test/r/join_cache.result +++ b/mysql-test/r/join_cache.result @@ -5949,4 +5949,13 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE PROFILING ALL NULL NULL NULL NULL NULL Using where 1 SIMPLE user hash_ALL NULL #hash#$hj 1 information_schema.PROFILING.PAGE_FAULTS_MINOR 4 Using where; Using join buffer (flat, BNLH join) set join_cache_level=default; +create table t1 (c1 date not null, key (c1)) engine=innodb; +insert t1 values ('2017-12-27'); +create table t2 (pk int, f1 int, f2 int); +insert t2 values (4,1,1), (6,1,1); +set join_buffer_size = 222222208; +select f2 from t2,t1 where f2 = 0; +f2 +drop table t1, t2; +set join_buffer_size = default; set @@optimizer_switch=@save_optimizer_switch; diff --git a/mysql-test/r/join_outer.result b/mysql-test/r/join_outer.result index ffeddc989ec..571dedfd77d 100644 --- a/mysql-test/r/join_outer.result +++ b/mysql-test/r/join_outer.result @@ -1743,7 +1743,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 PRIMARY t1 index PRIMARY PRIMARY 4 NULL 2 100.00 Using where; Using index; Using temporary; Using filesort 1 PRIMARY t2 eq_ref PRIMARY PRIMARY 4 func 1 100.00 Using where; Using index 2 DEPENDENT SUBQUERY t3 eq_ref PRIMARY PRIMARY 4 func 1 100.00 Using where; Using index -2 DEPENDENT SUBQUERY t4 eq_ref PRIMARY PRIMARY 4 test.t3.pk 1 100.00 Using where; Using index +2 DEPENDENT SUBQUERY t4 eq_ref PRIMARY PRIMARY 4 test.t3.pk 1 100.00 Using index Warnings: Note 1276 Field or reference 'test.t2.pk' of SELECT #2 was resolved in SELECT #1 Note 1003 select `test`.`t2`.`pk` AS `pk`,<`test`.`t2`.`pk`>((select `test`.`t3`.`pk` + if(`test`.`t4`.`pk` is null,0,`test`.`t4`.`pk`) from `test`.`t3` left join `test`.`t4` on(`test`.`t4`.`pk` = `test`.`t3`.`pk`) where `test`.`t3`.`pk` = `test`.`t2`.`pk` + 1000 limit 1)) AS `t` from `test`.`t1` join `test`.`t2` where `test`.`t2`.`pk` = `test`.`t1`.`pk` + 1000 and `test`.`t1`.`pk` > 1000 group by `test`.`t2`.`pk` @@ -2337,4 +2337,99 @@ id select_type table type possible_keys key key_len ref rows filtered Extra Warnings: Note 1003 select `test`.`t1`.`i1` AS `i1`,`test`.`t1`.`v1` AS `v1`,`test`.`t2`.`i2` AS `i2`,`test`.`t2`.`v2` AS `v2`,`test`.`t3`.`i3` AS `i3`,`test`.`t3`.`v3` AS `v3` from `test`.`t1` join `test`.`t2` join `test`.`t3` where `test`.`t3`.`v3` = 4 and `test`.`t1`.`i1` = `test`.`t3`.`i3` and `test`.`t2`.`i2` = `test`.`t3`.`i3` drop table t1,t2,t3; +# +# MDEV-11958: LEFT JOIN with stored routine produces incorrect result +# +CREATE TABLE t (x INT); +INSERT INTO t VALUES(1),(NULL); +CREATE FUNCTION f (val INT, ret INT) RETURNS INT DETERMINISTIC RETURN IFNULL(val, ret); +SELECT t1.x, t2.x, IFNULL(t2.x,0), f(t2.x,0) +FROM t t1 LEFT JOIN t t2 +ON t1.x = t2.x +WHERE IFNULL(t2.x,0)=0; +x x IFNULL(t2.x,0) f(t2.x,0) +NULL NULL 0 0 +explain extended +SELECT t1.x, t2.x, IFNULL(t2.x,0), f(t2.x,0) +FROM t t1 LEFT JOIN t t2 +ON t1.x = t2.x +WHERE IFNULL(t2.x,0)=0; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 +1 SIMPLE t2 ALL NULL NULL NULL NULL 2 100.00 Using where +Warnings: +Note 1003 select `test`.`t1`.`x` AS `x`,`test`.`t2`.`x` AS `x`,ifnull(`test`.`t2`.`x`,0) AS `IFNULL(t2.x,0)`,`f`(`test`.`t2`.`x`,0) AS `f(t2.x,0)` from `test`.`t` `t1` left join `test`.`t` `t2` on(`test`.`t2`.`x` = `test`.`t1`.`x`) where ifnull(`test`.`t2`.`x`,0) = 0 +SELECT t1.x, t2.x, IFNULL(t2.x,0), f(t2.x,0) +FROM t t1 LEFT JOIN t t2 +ON t1.x = t2.x +WHERE f(t2.x,0)=0; +x x IFNULL(t2.x,0) f(t2.x,0) +NULL NULL 0 0 +explain extended +SELECT t1.x, t2.x, IFNULL(t2.x,0), f(t2.x,0) +FROM t t1 LEFT JOIN t t2 +ON t1.x = t2.x +WHERE f(t2.x,0)=0; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 +1 SIMPLE t2 ALL NULL NULL NULL NULL 2 100.00 Using where +Warnings: +Note 1003 select `test`.`t1`.`x` AS `x`,`test`.`t2`.`x` AS `x`,ifnull(`test`.`t2`.`x`,0) AS `IFNULL(t2.x,0)`,`f`(`test`.`t2`.`x`,0) AS `f(t2.x,0)` from `test`.`t` `t1` left join `test`.`t` `t2` on(`test`.`t2`.`x` = `test`.`t1`.`x`) where `f`(`test`.`t2`.`x`,0) = 0 +drop function f; +drop table t; +CREATE TABLE t1 ( +col1 DECIMAL(33,5) NULL DEFAULT NULL, +col2 DECIMAL(33,5) NULL DEFAULT NULL +); +CREATE TABLE t2 ( +col1 DECIMAL(33,5) NULL DEFAULT NULL, +col2 DECIMAL(33,5) NULL DEFAULT NULL, +col3 DECIMAL(33,5) NULL DEFAULT NULL +); +INSERT INTO t1 VALUES (2, 1.1), (2, 2.1); +INSERT INTO t2 VALUES (3, 3.1, 4), (1, 1, NULL); +CREATE FUNCTION f1 ( p_num DECIMAL(45,15), p_return DECIMAL(45,15)) +RETURNS decimal(33,5) +LANGUAGE SQL +DETERMINISTIC +CONTAINS SQL +SQL SECURITY INVOKER +BEGIN +IF p_num IS NULL THEN +RETURN p_return; +ELSE +RETURN p_num; +END IF; +END | +SELECT t1.col1, t2.col1, t2.col3 +FROM t1 LEFT OUTER JOIN t2 ON t1.col1 = t2.col2 +WHERE IFNULL(t2.col3,0) = 0; +col1 col1 col3 +2.00000 NULL NULL +2.00000 NULL NULL +EXPLAIN EXTENDED SELECT t1.col1, t2.col1, t2.col3 +FROM t1 LEFT OUTER JOIN t2 ON t1.col1 = t2.col2 +WHERE IFNULL(t2.col3,0) = 0; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 +1 SIMPLE t2 ALL NULL NULL NULL NULL 2 100.00 Using where +Warnings: +Note 1003 select `test`.`t1`.`col1` AS `col1`,`test`.`t2`.`col1` AS `col1`,`test`.`t2`.`col3` AS `col3` from `test`.`t1` left join `test`.`t2` on(`test`.`t2`.`col2` = `test`.`t1`.`col1`) where ifnull(`test`.`t2`.`col3`,0) = 0 +SELECT t1.col1, t2.col1, t2.col3 +FROM t1 LEFT OUTER JOIN t2 ON t1.col1 = t2.col2 +WHERE f1(t2.col3,0) = 0; +col1 col1 col3 +2.00000 NULL NULL +2.00000 NULL NULL +EXPLAIN EXTENDED SELECT t1.col1, t2.col1, t2.col3 +FROM t1 LEFT OUTER JOIN t2 ON t1.col1 = t2.col2 +WHERE f1(t2.col3,0) = 0; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 +1 SIMPLE t2 ALL NULL NULL NULL NULL 2 100.00 Using where +Warnings: +Note 1003 select `test`.`t1`.`col1` AS `col1`,`test`.`t2`.`col1` AS `col1`,`test`.`t2`.`col3` AS `col3` from `test`.`t1` left join `test`.`t2` on(`test`.`t2`.`col2` = `test`.`t1`.`col1`) where `f1`(`test`.`t2`.`col3`,0) = 0 +DROP FUNCTION f1; +DROP TABLE t1,t2; +# end of 5.5 tests SET optimizer_switch=@save_optimizer_switch; diff --git a/mysql-test/r/join_outer_jcl6.result b/mysql-test/r/join_outer_jcl6.result index 4ffca891061..fac12729498 100644 --- a/mysql-test/r/join_outer_jcl6.result +++ b/mysql-test/r/join_outer_jcl6.result @@ -1754,7 +1754,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 PRIMARY t1 index PRIMARY PRIMARY 4 NULL 2 100.00 Using where; Using index; Using temporary; Using filesort 1 PRIMARY t2 eq_ref PRIMARY PRIMARY 4 func 1 100.00 Using where; Using index 2 DEPENDENT SUBQUERY t3 eq_ref PRIMARY PRIMARY 4 func 1 100.00 Using where; Using index -2 DEPENDENT SUBQUERY t4 eq_ref PRIMARY PRIMARY 4 test.t3.pk 1 100.00 Using where; Using index +2 DEPENDENT SUBQUERY t4 eq_ref PRIMARY PRIMARY 4 test.t3.pk 1 100.00 Using index Warnings: Note 1276 Field or reference 'test.t2.pk' of SELECT #2 was resolved in SELECT #1 Note 1003 select `test`.`t2`.`pk` AS `pk`,<`test`.`t2`.`pk`>((select `test`.`t3`.`pk` + if(`test`.`t4`.`pk` is null,0,`test`.`t4`.`pk`) from `test`.`t3` left join `test`.`t4` on(`test`.`t4`.`pk` = `test`.`t3`.`pk`) where `test`.`t3`.`pk` = `test`.`t2`.`pk` + 1000 limit 1)) AS `t` from `test`.`t1` join `test`.`t2` where `test`.`t2`.`pk` = `test`.`t1`.`pk` + 1000 and `test`.`t1`.`pk` > 1000 group by `test`.`t2`.`pk` @@ -2348,6 +2348,101 @@ id select_type table type possible_keys key key_len ref rows filtered Extra Warnings: Note 1003 select `test`.`t1`.`i1` AS `i1`,`test`.`t1`.`v1` AS `v1`,`test`.`t2`.`i2` AS `i2`,`test`.`t2`.`v2` AS `v2`,`test`.`t3`.`i3` AS `i3`,`test`.`t3`.`v3` AS `v3` from `test`.`t1` join `test`.`t2` join `test`.`t3` where `test`.`t3`.`v3` = 4 and `test`.`t1`.`i1` = `test`.`t3`.`i3` and `test`.`t2`.`i2` = `test`.`t3`.`i3` drop table t1,t2,t3; +# +# MDEV-11958: LEFT JOIN with stored routine produces incorrect result +# +CREATE TABLE t (x INT); +INSERT INTO t VALUES(1),(NULL); +CREATE FUNCTION f (val INT, ret INT) RETURNS INT DETERMINISTIC RETURN IFNULL(val, ret); +SELECT t1.x, t2.x, IFNULL(t2.x,0), f(t2.x,0) +FROM t t1 LEFT JOIN t t2 +ON t1.x = t2.x +WHERE IFNULL(t2.x,0)=0; +x x IFNULL(t2.x,0) f(t2.x,0) +NULL NULL 0 0 +explain extended +SELECT t1.x, t2.x, IFNULL(t2.x,0), f(t2.x,0) +FROM t t1 LEFT JOIN t t2 +ON t1.x = t2.x +WHERE IFNULL(t2.x,0)=0; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 +1 SIMPLE t2 ALL NULL NULL NULL NULL 2 100.00 Using where; Using join buffer (flat, BNL join) +Warnings: +Note 1003 select `test`.`t1`.`x` AS `x`,`test`.`t2`.`x` AS `x`,ifnull(`test`.`t2`.`x`,0) AS `IFNULL(t2.x,0)`,`f`(`test`.`t2`.`x`,0) AS `f(t2.x,0)` from `test`.`t` `t1` left join `test`.`t` `t2` on(`test`.`t2`.`x` = `test`.`t1`.`x`) where ifnull(`test`.`t2`.`x`,0) = 0 +SELECT t1.x, t2.x, IFNULL(t2.x,0), f(t2.x,0) +FROM t t1 LEFT JOIN t t2 +ON t1.x = t2.x +WHERE f(t2.x,0)=0; +x x IFNULL(t2.x,0) f(t2.x,0) +NULL NULL 0 0 +explain extended +SELECT t1.x, t2.x, IFNULL(t2.x,0), f(t2.x,0) +FROM t t1 LEFT JOIN t t2 +ON t1.x = t2.x +WHERE f(t2.x,0)=0; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 +1 SIMPLE t2 ALL NULL NULL NULL NULL 2 100.00 Using where; Using join buffer (flat, BNL join) +Warnings: +Note 1003 select `test`.`t1`.`x` AS `x`,`test`.`t2`.`x` AS `x`,ifnull(`test`.`t2`.`x`,0) AS `IFNULL(t2.x,0)`,`f`(`test`.`t2`.`x`,0) AS `f(t2.x,0)` from `test`.`t` `t1` left join `test`.`t` `t2` on(`test`.`t2`.`x` = `test`.`t1`.`x`) where `f`(`test`.`t2`.`x`,0) = 0 +drop function f; +drop table t; +CREATE TABLE t1 ( +col1 DECIMAL(33,5) NULL DEFAULT NULL, +col2 DECIMAL(33,5) NULL DEFAULT NULL +); +CREATE TABLE t2 ( +col1 DECIMAL(33,5) NULL DEFAULT NULL, +col2 DECIMAL(33,5) NULL DEFAULT NULL, +col3 DECIMAL(33,5) NULL DEFAULT NULL +); +INSERT INTO t1 VALUES (2, 1.1), (2, 2.1); +INSERT INTO t2 VALUES (3, 3.1, 4), (1, 1, NULL); +CREATE FUNCTION f1 ( p_num DECIMAL(45,15), p_return DECIMAL(45,15)) +RETURNS decimal(33,5) +LANGUAGE SQL +DETERMINISTIC +CONTAINS SQL +SQL SECURITY INVOKER +BEGIN +IF p_num IS NULL THEN +RETURN p_return; +ELSE +RETURN p_num; +END IF; +END | +SELECT t1.col1, t2.col1, t2.col3 +FROM t1 LEFT OUTER JOIN t2 ON t1.col1 = t2.col2 +WHERE IFNULL(t2.col3,0) = 0; +col1 col1 col3 +2.00000 NULL NULL +2.00000 NULL NULL +EXPLAIN EXTENDED SELECT t1.col1, t2.col1, t2.col3 +FROM t1 LEFT OUTER JOIN t2 ON t1.col1 = t2.col2 +WHERE IFNULL(t2.col3,0) = 0; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 +1 SIMPLE t2 ALL NULL NULL NULL NULL 2 100.00 Using where; Using join buffer (flat, BNL join) +Warnings: +Note 1003 select `test`.`t1`.`col1` AS `col1`,`test`.`t2`.`col1` AS `col1`,`test`.`t2`.`col3` AS `col3` from `test`.`t1` left join `test`.`t2` on(`test`.`t2`.`col2` = `test`.`t1`.`col1`) where ifnull(`test`.`t2`.`col3`,0) = 0 +SELECT t1.col1, t2.col1, t2.col3 +FROM t1 LEFT OUTER JOIN t2 ON t1.col1 = t2.col2 +WHERE f1(t2.col3,0) = 0; +col1 col1 col3 +2.00000 NULL NULL +2.00000 NULL NULL +EXPLAIN EXTENDED SELECT t1.col1, t2.col1, t2.col3 +FROM t1 LEFT OUTER JOIN t2 ON t1.col1 = t2.col2 +WHERE f1(t2.col3,0) = 0; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 +1 SIMPLE t2 ALL NULL NULL NULL NULL 2 100.00 Using where; Using join buffer (flat, BNL join) +Warnings: +Note 1003 select `test`.`t1`.`col1` AS `col1`,`test`.`t2`.`col1` AS `col1`,`test`.`t2`.`col3` AS `col3` from `test`.`t1` left join `test`.`t2` on(`test`.`t2`.`col2` = `test`.`t1`.`col1`) where `f1`(`test`.`t2`.`col3`,0) = 0 +DROP FUNCTION f1; +DROP TABLE t1,t2; +# end of 5.5 tests SET optimizer_switch=@save_optimizer_switch; set join_cache_level=default; show variables like 'join_cache_level'; diff --git a/mysql-test/r/limit_rows_examined.result b/mysql-test/r/limit_rows_examined.result index 157d10ae76a..2b5bca2fb47 100644 --- a/mysql-test/r/limit_rows_examined.result +++ b/mysql-test/r/limit_rows_examined.result @@ -425,7 +425,7 @@ c1 bb cc Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 18 rows, which exceeds LIMIT ROWS EXAMINED (16). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query examined at least 17 rows, which exceeds LIMIT ROWS EXAMINED (16). The query result may be incomplete select * from v1 LIMIT ROWS EXAMINED 11; c1 bb @@ -438,7 +438,8 @@ from (select * from t1 where c1 IN (select * from t2 where c2 > ' ' LIMIT ROWS EXAMINED 0)) as tmp LIMIT ROWS EXAMINED 11; id select_type table type possible_keys key key_len ref rows Extra -1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using where +1 PRIMARY t1 ALL NULL NULL NULL NULL 4 +1 PRIMARY eq_ref distinct_key distinct_key 2 func 1 3 MATERIALIZED t2 ALL NULL NULL NULL NULL 4 Using where select * from (select * from t1 @@ -749,22 +750,24 @@ FROM t1, t2 AS alias2, t2 AS alias3 WHERE alias3.c IN ( SELECT 1 UNION SELECT 6 ) GROUP BY field1, field2, field3, field4, field5 LIMIT ROWS EXAMINED 120; -ERROR HY000: Sort aborted: +field1 field2 field3 field4 field5 +Warnings: +Warning 1931 Query execution was interrupted. The query examined at least 121 rows, which exceeds LIMIT ROWS EXAMINED (120). The query result may be incomplete SHOW STATUS LIKE 'Handler_read%'; Variable_name Value Handler_read_first 1 -Handler_read_key 5 +Handler_read_key 4 Handler_read_last 0 -Handler_read_next 7 +Handler_read_next 4 Handler_read_prev 0 Handler_read_retry 0 Handler_read_rnd 0 Handler_read_rnd_deleted 0 -Handler_read_rnd_next 38 +Handler_read_rnd_next 46 SHOW STATUS LIKE 'Handler_tmp%'; Variable_name Value Handler_tmp_update 0 -Handler_tmp_write 70 +Handler_tmp_write 66 FLUSH STATUS; SELECT a AS field1, alias2.d AS field2, alias2.f AS field3, alias2.e AS field4, b AS field5 FROM t1, t2 AS alias2, t2 AS alias3 @@ -772,20 +775,20 @@ WHERE alias3.c IN ( SELECT 1 UNION SELECT 6 ) GROUP BY field1, field2, field3, field4, field5 LIMIT ROWS EXAMINED 124; field1 field2 field3 field4 field5 -00:21:38 06:07:10 a 2007-06-08 04:35:26 2007-05-28 00:00:00 Warnings: Warning 1931 Query execution was interrupted. The query examined at least 125 rows, which exceeds LIMIT ROWS EXAMINED (124). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query examined at least 127 rows, which exceeds LIMIT ROWS EXAMINED (124). The query result may be incomplete SHOW STATUS LIKE 'Handler_read%'; Variable_name Value Handler_read_first 1 -Handler_read_key 5 +Handler_read_key 4 Handler_read_last 0 -Handler_read_next 7 +Handler_read_next 4 Handler_read_prev 0 Handler_read_retry 0 -Handler_read_rnd 2 -Handler_read_rnd_deleted 1 -Handler_read_rnd_next 39 +Handler_read_rnd 0 +Handler_read_rnd_deleted 0 +Handler_read_rnd_next 48 SHOW STATUS LIKE 'Handler_tmp%'; Variable_name Value Handler_tmp_update 0 diff --git a/mysql-test/r/loaddata.result b/mysql-test/r/loaddata.result index b91dd1b87ae..4f59e9cdbe3 100644 --- a/mysql-test/r/loaddata.result +++ b/mysql-test/r/loaddata.result @@ -340,7 +340,7 @@ FIELDS ESCAPED BY '\\' TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' (c0, c2); -ERROR HY000: Invalid column reference (v2.c0) in LOAD DATA +ERROR HY000: Column 'c0' is not updatable LOAD DATA INFILE '../../std_data/bug35469.dat' INTO TABLE v3 FIELDS ESCAPED BY '\\' diff --git a/mysql-test/r/loadxml.result b/mysql-test/r/loadxml.result index c3b4c867c98..1d7af4f8b38 100644 --- a/mysql-test/r/loadxml.result +++ b/mysql-test/r/loadxml.result @@ -5,10 +5,10 @@ load xml infile '../../std_data/loadxml.dat' into table t1 rows identified by ''; select * from t1 order by a; a b -1 b1 -2 b2 -3 b3 -11 b11 +1 b1 +2 b2 +3 b3 +11 b11 111 b111 112 b112 & < > " ' &unknown; -- check entities 212 b212 @@ -84,17 +84,17 @@ LOAD XML INFILE '../../std_data/loadxml.dat' INTO TABLE t1 ROWS IDENTIFIED BY '' (a,@b) SET b=concat('!',@b); SELECT * FROM t1 ORDER BY a; a b -1 !b1 -11 !b11 +1 ! b1 +11 ! b11 111 !b111 112 !b112 & < > " ' &unknown; -- check entities -2 !b2 +2 ! b2 212 !b212 213 !b213 214 !b214 215 !b215 216 !&bb b; -3 !b3 +3 ! b3 DROP TABLE t1; # # Bug#16171518 LOAD XML DOES NOT HANDLE EMPTY ELEMENTS @@ -123,3 +123,14 @@ col1 col2 col3 ABC DEF NULL GHI NULL 123 DROP TABLE t1; +# +# MDEV-12696 Crash with LOAD XML and non-updatable VIEW column +# +CREATE TABLE t1 (c1 TEXT); +CREATE VIEW v1 AS SELECT CONCAT(c1,'') AS c1, NULL AS c2 FROM t1; +LOAD XML INFILE '../../std_data/loaddata/mdev12696.xml' INTO TABLE v1 (c1); +ERROR HY000: Column 'c1' is not updatable +LOAD XML INFILE '../../std_data/loaddata/mdev12696.xml' INTO TABLE v1 (c2); +ERROR HY000: Column 'c2' is not updatable +DROP VIEW v1; +DROP TABLE t1; diff --git a/mysql-test/r/locale.result b/mysql-test/r/locale.result index 95c1f51fd87..a02e80ed21e 100644 --- a/mysql-test/r/locale.result +++ b/mysql-test/r/locale.result @@ -223,5 +223,21 @@ SELECT * FROM non_existent; ERROR 42S02: Table 'test.non_existent' doesn't exist SET lc_time_names=@old_50915_lc_time_names; # -# End of 5.6 tests +# End of 10.0 tests +# +# +# End of 10.1 tests +# +create view v1 as select +format(123456789,2) as b, +format(123456789,2,'rm_CH') as b1; +select * from v1; +b b1 +123,456,789.00 123'456'789,00 +show create view v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select format(123456789,2) AS `b`,format(123456789,2,'rm_CH') AS `b1` utf8 utf8_general_ci +drop view v1; +# +# End of 10.2 tests # diff --git a/mysql-test/r/log_tables-big.result b/mysql-test/r/log_tables-big.result index 9b81127c825..0a33510fe77 100644 --- a/mysql-test/r/log_tables-big.result +++ b/mysql-test/r/log_tables-big.result @@ -1,29 +1,39 @@ +set @@global.log_output = 'TABLE'; +connect con1,localhost,root,,; +connect con2,localhost,root,,; +connection con1; set session long_query_time=10; select get_lock('bug27638', 1); get_lock('bug27638', 1) 1 +connection con2; set session long_query_time=1; -truncate table mysql.slow_log; select get_lock('bug27638', 2); get_lock('bug27638', 2) 0 -select if (query_time between '00:00:01' and '00:00:10', 'OK', 'WRONG') as qt, sql_text from mysql.slow_log; +select if (query_time >= '00:00:01', 'OK', 'WRONG') as qt, sql_text from mysql.slow_log +where sql_text = 'select get_lock(\'bug27638\', 2)'; qt sql_text OK select get_lock('bug27638', 2) -truncate table mysql.slow_log; select get_lock('bug27638', 60); get_lock('bug27638', 60) 0 -select if (query_time between '00:00:59' and '00:01:10', 'OK', 'WRONG') as qt, sql_text from mysql.slow_log; +select if (query_time >= '00:00:59', 'OK', 'WRONG') as qt, sql_text from mysql.slow_log +where sql_text = 'select get_lock(\'bug27638\', 60)'; qt sql_text OK select get_lock('bug27638', 60) -truncate table mysql.slow_log; select get_lock('bug27638', 101); get_lock('bug27638', 101) 0 -select if (query_time between '00:01:40' and '00:01:50', 'OK', 'WRONG') as qt, sql_text from mysql.slow_log; +select if (query_time >= '00:01:40', 'OK', 'WRONG') as qt, sql_text from mysql.slow_log +where sql_text = 'select get_lock(\'bug27638\', 101)'; qt sql_text OK select get_lock('bug27638', 101) +connection con1; select release_lock('bug27638'); release_lock('bug27638') 1 +connection default; +disconnect con1; +disconnect con2; +set @@global.log_output=default; diff --git a/mysql-test/r/mdl.result b/mysql-test/r/mdl.result new file mode 100644 index 00000000000..d93bfd5c729 --- /dev/null +++ b/mysql-test/r/mdl.result @@ -0,0 +1,22 @@ +# +# MDEV-12882 - Assertion `mdl_ticket->m_type == MDL_SHARED_UPGRADABLE || +# mdl_ticket->m_type == MDL_SHARED_NO_WRITE || +# mdl_ticket->m_type == MDL_SHARED_NO_READ_WRITE || +# mdl_ticket->m_type == MDL_SHARED_READ' +# failed in MDL_context::upgrade_shared_lock +# +CREATE TABLE t1(a INT) ENGINE=InnoDB; +LOCK TABLES t1 WRITE CONCURRENT, t1 AS t2 READ; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info; +LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME +MDL_INTENTION_EXCLUSIVE Global read lock +MDL_SHARED_NO_READ_WRITE Table metadata lock test t1 +UNLOCK TABLES; +LOCK TABLES t1 AS t2 READ, t1 WRITE CONCURRENT; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info; +LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME +MDL_INTENTION_EXCLUSIVE Global read lock +MDL_SHARED_WRITE Table metadata lock test t1 +MDL_SHARED_READ_ONLY Table metadata lock test t1 +UNLOCK TABLES; +DROP TABLE t1; diff --git a/mysql-test/r/mdl_sync.result b/mysql-test/r/mdl_sync.result index 1e285650c77..3880fc5ef91 100644 --- a/mysql-test/r/mdl_sync.result +++ b/mysql-test/r/mdl_sync.result @@ -3049,3 +3049,21 @@ SET DEBUG_SYNC= 'RESET'; disconnect con1; disconnect con2; disconnect con3; +# +# MDEV-12620 - set lock_wait_timeout = 1;flush tables with read lock; +# lock not released after timeout +# +CREATE TABLE t1(a INT) ENGINE=InnoDB; +SET debug_sync='open_tables_after_open_and_process_table SIGNAL ready WAIT_FOR go'; +SELECT * FROM t1; +connect con1,localhost,root,,; +SET debug_sync='now WAIT_FOR ready'; +SET lock_wait_timeout=1; +FLUSH TABLES WITH READ LOCK; +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +SET debug_sync='now SIGNAL go'; +connection default; +a +SET debug_sync='RESET'; +DROP TABLE t1; +disconnect con1; diff --git a/mysql-test/r/mix2_myisam.result b/mysql-test/r/mix2_myisam.result index b282be15a56..34764466d2a 100644 --- a/mysql-test/r/mix2_myisam.result +++ b/mysql-test/r/mix2_myisam.result @@ -1549,6 +1549,9 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref v v 13 const # Using where; Using index alter table t1 add unique(v); ERROR 23000: Duplicate entry '{ ' for key 'v_2' +show warnings; +Level Code Message +Error 1062 Duplicate entry 'a' for key 'v_2' alter table t1 add key(v); Warnings: Note 1831 Duplicate index `v_2`. This is deprecated and will be disallowed in a future release diff --git a/mysql-test/r/mrr_icp_extra.result b/mysql-test/r/mrr_icp_extra.result index 5706bf21895..95788b393dd 100644 --- a/mysql-test/r/mrr_icp_extra.result +++ b/mysql-test/r/mrr_icp_extra.result @@ -350,6 +350,9 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref v v 13 const # Using where; Using index alter table t1 add unique(v); ERROR 23000: Duplicate entry '{ ' for key 'v_2' +show warnings; +Level Code Message +Error 1062 Duplicate entry 'a' for key 'v_2' alter table t1 add key(v); Warnings: Note 1831 Duplicate index `v_2`. This is deprecated and will be disallowed in a future release diff --git a/mysql-test/r/myisam.result b/mysql-test/r/myisam.result index f7eb5db6468..5b41b35c1ba 100644 --- a/mysql-test/r/myisam.result +++ b/mysql-test/r/myisam.result @@ -1255,6 +1255,9 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref v v 13 const # Using where; Using index alter table t1 add unique(v); ERROR 23000: Duplicate entry '{ ' for key 'v_2' +show warnings; +Level Code Message +Error 1062 Duplicate entry 'a' for key 'v_2' alter table t1 add key(v); Warnings: Note 1831 Duplicate index `v_2`. This is deprecated and will be disallowed in a future release diff --git a/mysql-test/r/myisam_debug.result b/mysql-test/r/myisam_debug.result index 39cbd69cdb0..6232e3eac0e 100644 --- a/mysql-test/r/myisam_debug.result +++ b/mysql-test/r/myisam_debug.result @@ -29,3 +29,15 @@ Table Op Msg_type Msg_text test.t1 check status OK DROP TABLE t1,t2; disconnect insertConn; +call mtr.add_suppression("Index for table '.*test.t1\\.MYI' is corrupt; try to repair it"); +create table t1 (a int, index(a)); +lock tables t1 write; +insert t1 values (1),(2),(1); +set @old_dbug=@@debug_dbug; +set debug_dbug='+d,mi_lock_database_failure'; +unlock tables; +Warnings: +Error 126 Index for table './test/t1.MYI' is corrupt; try to repair it +Error 1030 Got error 22 "Invalid argument" from storage engine MyISAM +set debug_dbug=@old_dbug; +drop table t1; diff --git a/mysql-test/r/myisam_icp.result b/mysql-test/r/myisam_icp.result index 458d0195a19..6a70521cd72 100644 --- a/mysql-test/r/myisam_icp.result +++ b/mysql-test/r/myisam_icp.result @@ -430,7 +430,7 @@ WHERE pk IN (SELECT it.pk FROM t2 JOIN t2 AS it ON it.i=it.i WHERE it.pk-t1.i<10 id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t1 ALL NULL NULL NULL NULL 3 Using where 2 DEPENDENT SUBQUERY it eq_ref PRIMARY PRIMARY 4 func 1 Using index condition -2 DEPENDENT SUBQUERY t2 index NULL PRIMARY 4 NULL 3 Using where; Using index; Using join buffer (flat, BNL join) +2 DEPENDENT SUBQUERY t2 index NULL PRIMARY 4 NULL 3 Using index; Using join buffer (flat, BNL join) SELECT * FROM t1 WHERE pk IN (SELECT it.pk FROM t2 JOIN t2 AS it ON it.i=it.i WHERE it.pk-t1.i<10); pk i @@ -804,7 +804,7 @@ id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t ALL PRIMARY,c NULL NULL NULL 64 Using where 1 PRIMARY t2 ref g g 5 test.t.c 19 Using where 2 DEPENDENT SUBQUERY t1 index PRIMARY PRIMARY 4 NULL 64 Using where; Using index -2 DEPENDENT SUBQUERY t2 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 Using index condition; Using where +2 DEPENDENT SUBQUERY t2 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 Using where SELECT COUNT(*) FROM t1 AS t, t2 WHERE c = g AND (EXISTS (SELECT * FROM t1, t2 WHERE a = f AND h <= t.e AND a > t.b) diff --git a/mysql-test/r/mysql.result b/mysql-test/r/mysql.result index 4097a22ea43..09f014da627 100644 --- a/mysql-test/r/mysql.result +++ b/mysql-test/r/mysql.result @@ -544,3 +544,61 @@ ERROR 1300 (HY000) at line 2: Invalid utf8 character string: 'test\xF0\x9F\x98\x set GLOBAL sql_mode=default; End of tests +create table `a1\``b1` (a int); +show tables; +Tables_in_test +a1\`b1 +insert `a1\``b1` values (1),(2); +show create table `a1\``b1`; +Table Create Table +a1\`b1 CREATE TABLE `a1\``b1` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `a1\``b1` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; +INSERT INTO `a1\``b1` VALUES (1),(2); +insert `a1\``b1` values (4),(5); +show create table `a1\``b1`; +Table Create Table +a1\`b1 CREATE TABLE `a1\``b1` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +select * from `a1\``b1`; +a +1 +2 +drop table `a1\``b1`; +set sql_mode=ansi_quotes; +create table "a1\""b1" (a int); +show tables; +Tables_in_test +a1\"b1 +insert "a1\""b1" values (1),(2); +show create table "a1\""b1"; +Table Create Table +a1\"b1 CREATE TABLE "a1\""b1" ( + "a" int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE "a1\""b1" ( + "a" int(11) DEFAULT NULL +); +/*!40101 SET character_set_client = @saved_cs_client */; +INSERT INTO "a1\""b1" VALUES (1),(2); +insert "a1\""b1" values (4),(5); +show create table "a1\""b1"; +Table Create Table +a1\"b1 CREATE TABLE "a1\""b1" ( + "a" int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +select * from "a1\""b1"; +a +1 +2 +drop table "a1\""b1"; +set sql_mode=default; diff --git a/mysql-test/r/mysql_plugin.result b/mysql-test/r/mysql_plugin.result deleted file mode 100644 index 0bcb47e4a10..00000000000 --- a/mysql-test/r/mysql_plugin.result +++ /dev/null @@ -1,132 +0,0 @@ -# -# Ensure the plugin isn't loaded. -# -SELECT * FROM mysql.plugin WHERE dl like 'libdaemon%' ORDER BY name; -name dl -# -# Enable the plugin... -# -# -# Simulate loading a plugin libary with multiple entry points. -# This will test the DISABLE to ensure all rows are removed. -# -INSERT INTO mysql.plugin VALUES ('wicky', 'libdaemon_example.so'); -INSERT INTO mysql.plugin VALUES ('wacky', 'libdaemon_example.so'); -INSERT INTO mysql.plugin VALUES ('wonky', 'libdaemon_example.so'); -# -# Ensure the plugin is now loaded. -# -SELECT * FROM mysql.plugin WHERE dl like 'libdaemon%' ORDER BY name; -name dl -daemon_example libdaemon_example.so -wacky libdaemon_example.so -wicky libdaemon_example.so -wonky libdaemon_example.so -# -# Ensure the plugin is loaded. -# -SELECT * FROM mysql.plugin WHERE dl like '%libdaemon%' ORDER BY name; -name dl -daemon_example libdaemon_example.so -# -# Ensure the plugin is replaced. -# -SELECT * FROM mysql.plugin WHERE dl like '%libdaemon%' ORDER BY name; -name dl -daemon_example liblibdaemon_example.so -# -# Disable the plugin... -# -# -# Ensure the plugin isn't loaded. -# -SELECT * FROM mysql.plugin WHERE dl like '%libdaemon%' ORDER BY name; -name dl -# -# Attempt to load non-existant plugin -# -ERROR: Cannot read plugin config file NOT_THERE_AT_ALL. File does not exist. -# -# Attempt to use non-existant plugin.ini file -# -ERROR: Cannot read plugin config file daemon_example. File does not exist. -# -# Attempt to omit the plugin -# -ERROR: No plugin specified. -# -# Attempt to omit DISABLE|ENABLE -# -ERROR: missing operation. Please specify either ' ENABLE' or ' DISABLE'. -# -# Attempt to use bad paths - datadir -# -ERROR: Cannot access datadir at '/data_not_there/'. -# -# Attempt to use bad paths - basedir -# -ERROR: Cannot access basedir at '/basedir_not_there/'. -# -# Attempt to use bad paths - plugin_dir -# -ERROR: Cannot read plugin config file daemon_example. File does not exist. -# -# Attempt to use bad paths - mysqld -# -ERROR: Cannot access mysqld path '/mysqld_not_there/'. -# -# Attempt to use bad paths - my_print_defaults -# -ERROR: Cannot access my-print-defaults path '/my_print_defaults_not_there/'. -# -# Missing library -# -ERROR: The plugin library is missing or in a different location. -# -# Bad format for config file -# -ERROR: Cannot read plugin config file daemon_example. Bad format in plugin configuration file. -# -# Missing base_dir option -# -ERROR: Missing --basedir option. -# -# Missing data_dir option -# -ERROR: Missing --datadir option. -# -# Missing plugin_dir option -# -ERROR: Missing --plugin_dir option. -# -# Show the help. -# -mysql_plugin Ver V.V.VV Distrib XX.XX.XX -Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. - -Enable or disable plugins. - -Usage: mysql_plugin [options] ENABLE|DISABLE - -Options: - -?, --help Display this help and exit. - -b, --basedir=name The basedir for the server. - -d, --datadir=name The datadir for the server. - -p, --plugin-dir=name - The plugin dir for the server. - -i, --plugin-ini=name - Read plugin information from configuration file specified - instead of from /.ini. - -n, --no-defaults Do not read values from configuration file. - -P, --print-defaults - Show default values from configuration file. - -m, --mysqld=name Path to mysqld executable. Example: /sbin/temp1/mysql/bin - -f, --my-print-defaults=name - Path to my_print_defaults executable. Example: - /source/temp11/extra - -v, --verbose More verbose output; you can use this multiple times to - get even more verbose output. - -V, --version Output version information and exit. - - -mysql_plugin Ver V.V.VV Distrib XX.XX.XX diff --git a/mysql-test/r/mysql_upgrade.result b/mysql-test/r/mysql_upgrade.result index a337a939acc..a6a5da8f8c8 100644 --- a/mysql-test/r/mysql_upgrade.result +++ b/mysql-test/r/mysql_upgrade.result @@ -475,6 +475,29 @@ even_longer_user_name_number_3_to_test_the_grantor_and_definer_field_length@loca even_longer_user_name_number_3_to_test_the_grantor_and_definer_field_length@localhost DROP USER very_long_user_name_number_1, very_long_user_name_number_2, even_longer_user_name_number_3_to_test_the_grantor_and_definer_field_length@localhost; DROP PROCEDURE test.pr; +use test; +call mtr.add_suppression('Column last_update in table `mysql`.`innodb_table_stats` is INT NOT NULL but should be'); +alter table mysql.innodb_table_stats modify last_update int not null; +create table extralongname_extralongname_extralongname_extralongname_ext ( +id int(10) unsigned not null, +created_date date not null, +created timestamp not null, +primary key (created,id,created_date) +) engine=innodb stats_persistent=1 default charset=latin1 +partition by range (year(created_date)) +subpartition by hash (month(created_date)) +subpartitions 2 ( +partition p2007 values less than (2008), +partition p2008 values less than (2009) +); +select length(table_name) from mysql.innodb_table_stats; +length(table_name) +79 +79 +79 +79 +drop table extralongname_extralongname_extralongname_extralongname_ext; +End of 10.0 tests set sql_mode=default; # Droping the previously created mysql_upgrade_info file.. create table test.t1(a int) engine=MyISAM; @@ -537,4 +560,4 @@ t1 CREATE TABLE `t1` ( ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE test.t1; SET GLOBAL enforce_storage_engine=NULL; -End of tests +End of 10.1 tests diff --git a/mysql-test/r/mysqld--help,win.rdiff b/mysql-test/r/mysqld--help,win.rdiff index b1544862a59..4e46a9da285 100644 --- a/mysql-test/r/mysqld--help,win.rdiff +++ b/mysql-test/r/mysqld--help,win.rdiff @@ -1,6 +1,6 @@ ---- mysqld--help.result 2016-11-04 13:35:06.665881700 +0000 -+++ mysqld--help,win.reject 2016-11-04 13:58:39.030512500 +0000 -@@ -318,7 +318,6 @@ +--- a/mysql-test/r/mysqld--help.result ++++ b/mysql-test/r/mysqld--help.result +@@ -334,7 +334,6 @@ The number of segments in a key cache -L, --language=name Client error messages in given language. May be given as a full path. Deprecated. Use --lc-messages-dir instead. @@ -8,7 +8,7 @@ --lc-messages=name Set the language used for the error messages. -L, --lc-messages-dir=name Directory where error messages are -@@ -521,6 +520,7 @@ +@@ -543,6 +542,7 @@ Use MySQL-5.6 (instead of MariaDB-5.3) format for TIME, DATETIME, TIMESTAMP columns. (Defaults to on; use --skip-mysql56-temporal-format to disable.) @@ -16,7 +16,7 @@ --net-buffer-length=# Buffer length for TCP/IP and socket communication --net-read-timeout=# -@@ -931,6 +931,9 @@ +@@ -956,6 +956,9 @@ characteristics (isolation level, read only/read write,snapshot - but not any work done / data modified within the transaction). @@ -26,7 +26,7 @@ --show-slave-auth-info Show user and password in SHOW SLAVE HOSTS on this master. -@@ -1043,6 +1046,10 @@ +@@ -1068,6 +1071,10 @@ Log slow queries to given log file. Defaults logging to 'hostname'-slow.log. Must be enabled to activate other slow log options @@ -37,29 +37,32 @@ --socket=name Socket file to use for connection --sort-buffer-size=# Each thread that needs to do a sort allocates a buffer of -@@ -1061,6 +1068,7 @@ +@@ -1086,6 +1093,7 @@ NO_ENGINE_SUBSTITUTION, PAD_CHAR_TO_FULL_LENGTH --stack-trace Print a symbolic stack trace on failure (Defaults to on; use --skip-stack-trace to disable.) + --standalone Dummy option to start as a standalone program (NT). --standard-compliant-cte - Allow only standards compiant CTE - (Defaults to on; use --skip-standards-compliant-cte to disable.) -@@ -1109,6 +1117,11 @@ + Allow only CTEs compliant to SQL standard + (Defaults to on; use --skip-standard-compliant-cte to disable.) +@@ -1134,8 +1142,12 @@ --thread-pool-max-threads=# Maximum allowed number of worker threads in the thread pool +- --thread-pool-oversubscribe=# +- How many additional active worker threads in a group are + --thread-pool-min-threads=# + Minimum number of threads in the thread pool. + --thread-pool-mode=name + Chose implementation of the threadpool. One of: windows, + generic - --thread-pool-oversubscribe=# - How many additional active worker threads in a group are ++ --thread-pool-oversubscribe=# How many additional active worker threads in a group are allowed. -@@ -1139,8 +1152,8 @@ - size, MySQL will automatically convert it to an on-disk - MyISAM or Aria table + --thread-pool-prio-kickup-timer=# + The number of milliseconds before a dequeued low-priority +@@ -1172,8 +1184,8 @@ + automatically convert it to an on-disk MyISAM or Aria + table. -t, --tmpdir=name Path for temporary files. Several paths may be specified, - separated by a colon (:), in this case they are used in a - round-robin fashion @@ -68,7 +71,7 @@ --transaction-alloc-block-size=# Allocation block size for transactions to be stored in binary log -@@ -1264,7 +1277,6 @@ +@@ -1298,7 +1310,6 @@ key-cache-division-limit 100 key-cache-file-hash-size 512 key-cache-segments 0 @@ -76,7 +79,7 @@ lc-messages en_US lc-messages-dir MYSQL_SHAREDIR/ lc-time-names en_US -@@ -1333,6 +1345,7 @@ +@@ -1368,6 +1379,7 @@ myisam-stats-method NULLS_UNEQUAL myisam-use-mmap FALSE mysql56-temporal-format TRUE @@ -84,7 +87,7 @@ net-buffer-length 16384 net-read-timeout 30 net-retry-count 10 -@@ -1434,6 +1447,8 @@ +@@ -1469,6 +1481,8 @@ session-track-state-change FALSE session-track-system-variables session-track-transaction-info OFF @@ -93,15 +96,15 @@ show-slave-auth-info FALSE silent-startup FALSE skip-grant-tables TRUE -@@ -1458,6 +1473,7 @@ +@@ -1493,6 +1507,7 @@ slave-type-conversions slow-launch-time 2 slow-query-log FALSE +slow-start-timeout 15000 sort-buffer-size 2097152 - sql-mode NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION + sql-mode STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION stack-trace TRUE -@@ -1471,14 +1487,16 @@ +@@ -1506,14 +1521,16 @@ sync-relay-log 10000 sync-relay-log-info 10000 sysdate-is-now FALSE diff --git a/mysql-test/r/mysqld--help.result b/mysql-test/r/mysqld--help.result index cfd2ede6ef9..bcc985a8a50 100644 --- a/mysql-test/r/mysqld--help.result +++ b/mysql-test/r/mysqld--help.result @@ -1,3 +1,4 @@ +Windows bug: happens when a new line is exactly at the right offset. The following options may be given as the first argument: --print-defaults Print the program argument list and exit. --no-defaults Don't read default options from any option file. @@ -22,13 +23,15 @@ The following options may be given as the first argument: Creating and dropping stored procedures alters ACLs (Defaults to on; use --skip-automatic-sp-privileges to disable.) --back-log=# The number of outstanding connection requests MariaDB can - have. This comes into play when the main MySQL thread + have. This comes into play when the main MariaDB thread gets very many connection requests in a very short time (Automatically configured unless set explicitly) -b, --basedir=name Path to installation directory. All paths are usually resolved relative to this - --big-tables Allow big result sets by saving all temporary sets on - file (Solves most 'table full' errors) + --big-tables Old variable, which if set to 1, allows large result sets + by saving all temporary sets to disk, avoiding 'table + full' errors. No longer needed, as the server now handles + this automatically. sql_big_tables is a synonym. --bind-address=name IP address to bind to. --binlog-annotate-row-events Tells the master to annotate RBR events with the @@ -104,7 +107,7 @@ The following options may be given as the first argument: The size of the statement cache for updates to non-transactional engines for the binary log. If you often use statements updating a great number of rows, you - can increase this to get more performance + can increase this to get more performance. --bootstrap Used by mysql installation scripts. --bulk-insert-buffer-size=# Size of tree cache used in bulk insert optimisation. Note @@ -158,12 +161,21 @@ The following options may be given as the first argument: --default-week-format=# The default week format used by WEEK() functions --delay-key-write[=name] - Type of DELAY_KEY_WRITE. One of: OFF, ON, ALL + Specifies how MyISAM tables handles CREATE TABLE + DELAY_KEY_WRITE. If set to ON, the default, any DELAY KEY + WRITEs are honored. The key buffer is then flushed only + when the table closes, speeding up writes. MyISAM tables + should be automatically checked upon startup in this + case, and --external locking should not be used, as it + can lead to index corruption. If set to OFF, DELAY KEY + WRITEs are ignored, while if set to ALL, all new opened + tables are treated as if created with DELAY KEY WRITEs + enabled. --delayed-insert-limit=# After inserting delayed_insert_limit rows, the INSERT DELAYED handler will check if there are any SELECT statements pending. If so, it allows these to execute - before continuing + before continuing. --delayed-insert-timeout=# How long a INSERT DELAYED thread should wait for INSERT statements before terminating @@ -231,7 +243,7 @@ The following options may be given as the first argument: --gdb Set up signals usable for debugging. Deprecated, use --general-log Log connections and queries to a table or log file. Defaults logging to a file 'hostname'.log or a table - mysql.general_logif --log-output=TABLE is used + mysql.general_logif --log-output=TABLE is used. --general-log-file=name Log connections and queries to given file --getopt-prefix-matching @@ -376,7 +388,7 @@ The following options may be given as the first argument: logs. --log-slave-updates Tells the slave to log the updates from the slave thread to the binary log. You will need to turn it on if you - plan to daisy-chain the slaves + plan to daisy-chain the slaves. --log-slow-admin-statements Log slow OPTIMIZE, ANALYZE, ALTER and other administrative statements to the slow log if it is open. @@ -573,7 +585,7 @@ The following options may be given as the first argument: a query. Values smaller than the number of tables in a relation result in faster optimization, but may produce very bad query plans. If set to 0, the system will - automatically pick a reasonable value + automatically pick a reasonable value. --optimizer-selectivity-sampling-limit=# Controls number of record samples to check condition selectivity @@ -761,7 +773,9 @@ The following options may be given as the first argument: The size of the buffer that is allocated when preloading indexes --profiling-history-size=# - Limit of query profiling memory + Number of statements about which profiling information is + maintained. If set to 0, no profiles are stored. See SHOW + PROFILES. --progress-report-time=# Seconds between sending progress reports to the client for time-consuming statements. Set to 0 to disable @@ -802,21 +816,21 @@ The following options may be given as the first argument: --read-rnd-buffer-size=# When reading rows in sorted order after a sort, the rows are read through this buffer to avoid a disk seeks - --relay-log=name The location and name to use for relay logs + --relay-log=name The location and name to use for relay logs. --relay-log-index=name The location and name to use for the file that keeps a list of the last relay logs --relay-log-info-file=name The location and name of the file that remembers where - the SQL replication thread is in the relay logs + the SQL replication thread is in the relay logs. --relay-log-purge if disabled - do not purge relay logs. if enabled - purge - them as soon as they are no more needed + them as soon as they are no more needed. (Defaults to on; use --skip-relay-log-purge to disable.) --relay-log-recovery Enables automatic relay log recovery right after the database startup, which means that the IO Thread starts re-fetching from the master right after the last - transaction processed + transaction processed. --relay-log-space-limit=# Maximum space to use for all relay logs --replicate-annotate-row-events @@ -981,7 +995,7 @@ The following options may be given as the first argument: idempotent. For example, in row based replication attempts to delete rows that doesn't exist will be ignored. In STRICT mode, replication will stop on any - unexpected difference between the master and the slave + unexpected difference between the master and the slave. --slave-load-tmpdir=name The location where the slave should put its temporary files when replicating a LOAD DATA INFILE command @@ -1049,7 +1063,7 @@ The following options may be given as the first argument: --slow-query-log Log slow queries to a table or log file. Defaults logging to a file 'hostname'-slow.log or a table mysql.slow_log if --log-output=TABLE is used. Must be enabled to - activate other slow log options + activate other slow log options. --slow-query-log-file=name Log slow queries to given log file. Defaults logging to 'hostname'-slow.log. Must be enabled to activate other @@ -1146,9 +1160,17 @@ The following options may be given as the first argument: --time-format=name The TIME format (ignored) --timed-mutexes Specify whether to time mutexes. Deprecated, has no effect. - --tmp-table-size=# If an internal in-memory temporary table exceeds this - size, MySQL will automatically convert it to an on-disk - MyISAM or Aria table + --tmp-disk-table-size=# + Max size for data for an internal temporary on-disk + MyISAM or Aria table. + --tmp-memory-table-size=# + If an internal in-memory temporary table exceeds this + size, MariaDB will automatically convert it to an on-disk + MyISAM or Aria table. Same as tmp_table_size. + --tmp-table-size=# Alias for tmp_memory_table_size. If an internal in-memory + temporary table exceeds this size, MariaDB will + automatically convert it to an on-disk MyISAM or Aria + table. -t, --tmpdir=name Path for temporary files. Several paths may be specified, separated by a colon (:), in this case they are used in a round-robin fashion @@ -1212,7 +1234,7 @@ character-sets-dir MYSQL_CHARSETSDIR/ chroot (No default value) completion-type NO_CHAIN concurrent-insert AUTO -console FALSE +console TRUE date-format %Y-%m-%d datetime-format %Y-%m-%d %H:%i:%s deadlock-search-depth-long 15 @@ -1250,7 +1272,7 @@ ft-query-expansion-limit 20 ft-stopword-file (No default value) gdb FALSE general-log FALSE -getopt-prefix-matching TRUE +getopt-prefix-matching FALSE group-concat-max-len 1048576 gtid-domain-id 0 gtid-ignore-duplicates FALSE @@ -1396,7 +1418,7 @@ performance-schema-max-rwlock-instances -1 performance-schema-max-socket-classes 10 performance-schema-max-socket-instances -1 performance-schema-max-stage-classes 150 -performance-schema-max-statement-classes 187 +performance-schema-max-statement-classes 188 performance-schema-max-table-handles -1 performance-schema-max-table-instances -1 performance-schema-max-thread-classes 50 @@ -1499,6 +1521,8 @@ thread-pool-stall-limit 500 thread-stack 299008 time-format %H:%i:%s timed-mutexes FALSE +tmp-disk-table-size 18446744073709551615 +tmp-memory-table-size 16777216 tmp-table-size 16777216 transaction-alloc-block-size 8192 transaction-isolation REPEATABLE-READ diff --git a/mysql-test/r/mysqldump.result b/mysql-test/r/mysqldump.result index 1243c455e6c..7f6107db5e4 100644 --- a/mysql-test/r/mysqldump.result +++ b/mysql-test/r/mysqldump.result @@ -15,7 +15,7 @@ INSERT INTO t1 VALUES (1), (2); - + @@ -151,9 +151,9 @@ INSERT INTO t1 VALUES (1, "test", "tes"), (2, "TEST", "TES"); - - - + + + @@ -179,7 +179,7 @@ INSERT INTO t1 VALUES ("1\""), ("\"2"); - + @@ -1613,10 +1613,10 @@ CREATE TABLE `t2` ( - + - + @@ -1624,10 +1624,10 @@ CREATE TABLE `t2` ( - + - + @@ -3739,8 +3739,8 @@ INSERT INTO t1 VALUES(1,0xff00fef0); - - + + @@ -4681,7 +4681,7 @@ CREATE TABLE `comment_table` (i INT COMMENT 'FIELD COMMENT') COMMENT = 'TABLE CO - + @@ -4778,8 +4778,8 @@ CREATE VIEW v2 AS SELECT * FROM t2; - - + + @@ -4797,7 +4797,7 @@ CREATE VIEW v2 AS SELECT * FROM t2; - + @@ -4833,12 +4833,12 @@ END - - + + - + @@ -4901,8 +4901,8 @@ END --> - - + + - + - - + + - + diff --git a/mysql-test/std_data/server-cert.pem b/mysql-test/std_data/server-cert.pem index 1cc1519ada9..b874f129ce3 100644 --- a/mysql-test/std_data/server-cert.pem +++ b/mysql-test/std_data/server-cert.pem @@ -2,25 +2,25 @@ Certificate: Data: Version: 3 (0x2) Serial Number: 1 (0x1) - Signature Algorithm: sha1WithRSAEncryption + Signature Algorithm: sha256WithRSAEncryption Issuer: CN=cacert, C=FI, ST=Helsinki, L=Helsinki, O=MariaDB Validity - Not Before: Apr 25 14:55:05 2015 GMT - Not After : Apr 20 14:55:05 2035 GMT + Not Before: Apr 25 20:52:21 2017 GMT + Not After : Apr 20 20:52:21 2037 GMT Subject: C=FI, ST=state or province within country, in other certificates in this file it is the same as L, L=location, usually an address but often ambiguously used, O=organization name, typically a company name, OU=organizational unit name, a division name within an organization, CN=localhost Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (1024 bit) Modulus: - 00:aa:e6:54:bd:dd:52:1e:16:f7:24:52:37:58:2b: - a7:af:49:e1:cd:75:2a:18:52:e1:48:f0:59:82:c0: - 7a:d9:66:b3:97:04:b3:77:f4:39:fd:d1:c0:1a:c5: - a6:ab:44:84:d2:17:39:53:25:63:9b:c3:24:78:51: - 5c:77:6b:df:b4:82:1d:e4:43:f4:67:0a:5d:89:a2: - fe:b0:ea:64:3a:1d:9d:49:78:c8:7f:79:a5:cd:45: - 4b:0c:ad:ae:4f:e2:d4:5d:ec:e8:73:06:ed:98:92: - 85:49:b2:9c:31:3b:44:38:5f:bb:5a:f1:68:84:a9: - c3:5b:31:39:d4:47:98:38:55 + 00:c9:fe:83:3f:0b:38:89:1d:43:15:93:5c:26:b9: + 80:65:41:bd:2f:63:66:5e:db:fa:33:20:d9:c7:e1: + 35:f3:14:3c:c8:b4:f7:09:d8:f5:b5:44:8f:6b:7e: + a0:a4:3b:45:5f:e6:f4:0f:08:67:f8:5a:4c:49:e4: + e5:39:31:69:8c:cf:25:78:93:a6:7f:58:e9:90:9c: + 61:cb:2e:14:b1:57:b2:15:9c:ea:8d:6f:96:20:fe: + 29:ed:2c:71:b8:4f:1f:e0:05:6c:04:b1:7e:e0:bc: + 42:8e:bf:95:5e:a9:5e:c9:c9:a4:64:c2:1f:59:94: + 14:c2:06:44:79:bc:d2:65:2d Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: @@ -28,47 +28,47 @@ Certificate: Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: - E5:72:8F:57:72:D6:75:63:28:7F:E2:BF:00:B7:1D:B8:AA:FE:94:59 + CB:22:3B:E6:DA:B8:3D:7E:39:61:18:38:50:C8:4D:B4:C8:9A:3E:2B X509v3 Authority Key Identifier: - keyid:C7:2C:01:95:1A:F5:3E:CD:04:A6:24:35:35:04:D9:A7:16:01:2A:79 + keyid:1C:C7:2B:AA:1B:B1:BB:2E:9A:F4:0F:B1:86:60:57:38:C2:41:05:12 - Signature Algorithm: sha1WithRSAEncryption - 88:44:46:fa:7d:16:ae:9d:16:5b:95:26:03:3c:71:f4:29:3d: - df:cb:f4:14:20:9f:87:24:b4:29:17:2d:7a:12:48:76:ac:00: - 44:26:ba:93:83:ad:58:7e:b7:77:e4:b0:32:0d:e5:dd:fb:cc: - 0e:9b:88:e0:24:82:e4:41:43:47:5a:4e:d3:b4:5b:47:4b:57: - eb:67:02:63:bb:dd:05:12:f5:95:01:0b:89:81:ca:c2:91:14: - 21:9a:9e:c9:84:91:46:35:0e:26:44:1e:91:88:74:4f:fe:d3: - 19:9e:65:fa:46:e2:46:04:ad:91:79:4c:70:1b:68:b2:49:e9: - 6c:f4:58:44:3b:43:15:85:56:64:1b:84:74:49:95:9f:cd:93: - 9d:8e:69:ab:ca:46:97:b6:74:e9:2a:83:85:62:cd:e5:be:c3: - 52:bd:cf:90:cc:60:27:76:ee:1b:3c:da:69:73:e2:11:68:14: - dc:7d:9f:b8:6f:20:a2:0c:b7:8e:33:40:89:d1:a3:89:e2:60: - 6a:ec:b5:9f:e8:c5:55:10:40:b2:95:5e:54:8a:10:8e:d5:90: - d9:98:86:d8:f9:b6:01:41:8c:d7:0d:0e:86:0e:50:6d:a2:64: - 00:2a:91:5e:35:64:15:e3:86:34:3a:39:eb:0f:4f:56:c7:15: - 4c:74:2e:91 + Signature Algorithm: sha256WithRSAEncryption + 8e:b7:3d:cc:2b:e5:27:49:49:5a:d4:3c:83:9b:2f:7d:11:de: + 6b:0f:b4:51:02:e4:37:d0:c4:b5:7b:4b:e3:42:93:75:32:d1: + eb:41:a2:27:fe:4d:91:ae:2b:a0:8b:3b:7f:e9:1b:47:85:73: + 9f:b7:05:74:34:eb:62:12:d8:f2:24:6a:b4:24:58:7a:6a:55: + 3e:ba:54:f9:51:de:54:0e:19:06:f6:01:23:32:0a:6c:81:e2: + 57:8a:9e:71:c5:ba:ca:c3:0f:18:d4:ef:54:4b:e1:ee:7c:3a: + f3:4d:c3:a3:44:21:9f:c8:ef:85:01:ab:fe:a9:7b:36:05:10: + 25:5e:61:b8:1d:7c:40:8a:5d:5b:c1:bb:7c:79:45:6e:84:63: + b5:3f:51:e9:9c:57:01:de:2d:1e:85:cb:83:f0:16:6d:78:bb: + 12:01:a5:e5:a2:a7:80:fa:54:8f:9a:5c:de:1c:52:a2:bd:00: + 49:e4:04:65:30:f9:b9:fc:4f:94:e2:d8:39:89:b6:a5:a5:2d: + db:25:a3:0d:5b:f9:e1:2a:13:19:5e:d7:1a:33:89:5b:ac:bd: + 29:26:da:1a:90:7e:08:19:dd:59:4b:50:fd:46:c3:0b:91:33: + 8b:c6:70:d1:22:18:37:a3:8b:d3:8f:f8:68:cf:38:8e:e1:ef: + ac:17:88:ca -----BEGIN CERTIFICATE----- -MIIEETCCAvmgAwIBAgIBATANBgkqhkiG9w0BAQUFADBWMQ8wDQYDVQQDDAZjYWNl +MIIEETCCAvmgAwIBAgIBATANBgkqhkiG9w0BAQsFADBWMQ8wDQYDVQQDDAZjYWNl cnQxCzAJBgNVBAYTAkZJMREwDwYDVQQIDAhIZWxzaW5raTERMA8GA1UEBwwISGVs -c2lua2kxEDAOBgNVBAoMB01hcmlhREIwHhcNMTUwNDI1MTQ1NTA1WhcNMzUwNDIw -MTQ1NTA1WjCCAUcxCzAJBgNVBAYTAkZJMWEwXwYDVQQIDFhzdGF0ZSBvciBwcm92 +c2lua2kxEDAOBgNVBAoMB01hcmlhREIwHhcNMTcwNDI1MjA1MjIxWhcNMzcwNDIw +MjA1MjIxWjCCAUcxCzAJBgNVBAYTAkZJMWEwXwYDVQQIDFhzdGF0ZSBvciBwcm92 aW5jZSB3aXRoaW4gY291bnRyeSwgaW4gb3RoZXIgY2VydGlmaWNhdGVzIGluIHRo aXMgZmlsZSBpdCBpcyB0aGUgc2FtZSBhcyBMMUAwPgYDVQQHDDdsb2NhdGlvbiwg dXN1YWxseSBhbiBhZGRyZXNzIGJ1dCBvZnRlbiBhbWJpZ3VvdXNseSB1c2VkMTQw MgYDVQQKDCtvcmdhbml6YXRpb24gbmFtZSwgdHlwaWNhbGx5IGEgY29tcGFueSBu YW1lMUkwRwYDVQQLDEBvcmdhbml6YXRpb25hbCB1bml0IG5hbWUsIGEgZGl2aXNp b24gbmFtZSB3aXRoaW4gYW4gb3JnYW5pemF0aW9uMRIwEAYDVQQDDAlsb2NhbGhv -c3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKrmVL3dUh4W9yRSN1grp69J -4c11KhhS4UjwWYLAetlms5cEs3f0Of3RwBrFpqtEhNIXOVMlY5vDJHhRXHdr37SC -HeRD9GcKXYmi/rDqZDodnUl4yH95pc1FSwytrk/i1F3s6HMG7ZiShUmynDE7RDhf -u1rxaISpw1sxOdRHmDhVAgMBAAGjezB5MAkGA1UdEwQCMAAwLAYJYIZIAYb4QgEN -BB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBTlco9X -ctZ1Yyh/4r8Atx24qv6UWTAfBgNVHSMEGDAWgBTHLAGVGvU+zQSmJDU1BNmnFgEq -eTANBgkqhkiG9w0BAQUFAAOCAQEAiERG+n0Wrp0WW5UmAzxx9Ck938v0FCCfhyS0 -KRctehJIdqwARCa6k4OtWH63d+SwMg3l3fvMDpuI4CSC5EFDR1pO07RbR0tX62cC -Y7vdBRL1lQELiYHKwpEUIZqeyYSRRjUOJkQekYh0T/7TGZ5l+kbiRgStkXlMcBto -sknpbPRYRDtDFYVWZBuEdEmVn82TnY5pq8pGl7Z06SqDhWLN5b7DUr3PkMxgJ3bu -GzzaaXPiEWgU3H2fuG8gogy3jjNAidGjieJgauy1n+jFVRBAspVeVIoQjtWQ2ZiG -2Pm2AUGM1w0Ohg5QbaJkACqRXjVkFeOGNDo56w9PVscVTHQukQ== +c3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMn+gz8LOIkdQxWTXCa5gGVB +vS9jZl7b+jMg2cfhNfMUPMi09wnY9bVEj2t+oKQ7RV/m9A8IZ/haTEnk5TkxaYzP +JXiTpn9Y6ZCcYcsuFLFXshWc6o1vliD+Ke0scbhPH+AFbASxfuC8Qo6/lV6pXsnJ +pGTCH1mUFMIGRHm80mUtAgMBAAGjezB5MAkGA1UdEwQCMAAwLAYJYIZIAYb4QgEN +BB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBTLIjvm +2rg9fjlhGDhQyE20yJo+KzAfBgNVHSMEGDAWgBQcxyuqG7G7Lpr0D7GGYFc4wkEF +EjANBgkqhkiG9w0BAQsFAAOCAQEAjrc9zCvlJ0lJWtQ8g5svfRHeaw+0UQLkN9DE +tXtL40KTdTLR60GiJ/5Nka4roIs7f+kbR4Vzn7cFdDTrYhLY8iRqtCRYempVPrpU ++VHeVA4ZBvYBIzIKbIHiV4qeccW6ysMPGNTvVEvh7nw6803Do0Qhn8jvhQGr/ql7 +NgUQJV5huB18QIpdW8G7fHlFboRjtT9R6ZxXAd4tHoXLg/AWbXi7EgGl5aKngPpU +j5pc3hxSor0ASeQEZTD5ufxPlOLYOYm2paUt2yWjDVv54SoTGV7XGjOJW6y9KSba +GpB+CBndWUtQ/UbDC5Ezi8Zw0SIYN6OL04/4aM84juHvrBeIyg== -----END CERTIFICATE----- diff --git a/mysql-test/std_data/server-key.pem b/mysql-test/std_data/server-key.pem index 3125ae88a8a..feb7fbaf535 100644 --- a/mysql-test/std_data/server-key.pem +++ b/mysql-test/std_data/server-key.pem @@ -1,15 +1,15 @@ -----BEGIN RSA PRIVATE KEY----- -MIICXAIBAAKBgQCq5lS93VIeFvckUjdYK6evSeHNdSoYUuFI8FmCwHrZZrOXBLN3 -9Dn90cAaxaarRITSFzlTJWObwyR4UVx3a9+0gh3kQ/RnCl2Jov6w6mQ6HZ1JeMh/ -eaXNRUsMra5P4tRd7OhzBu2YkoVJspwxO0Q4X7ta8WiEqcNbMTnUR5g4VQIDAQAB -AoGAblQWXyBzdBN1Z5BgRF6ieYpj6OT70QoogJMR5lRmutUPma4iQo17pr3znBT/ -nU+1w3/UtTXNEXCwqbA01q/gkbP2PaW/sbHLVow1B7u/o42WW6I3Btnl3ClnCNjD -Mo7/Gj027hhp7mC61r81JeJVh8fJUgxdNqoH7AkDnA+FJAECQQDjIl3k6W2P+bHb -bp+8eyY7ITQbppZh+3hFJKRL7DZKFYL5J6gejiBURnG9DKnhoSP2nqzqdrRhWZhB -ZHr+ciEBAkEAwJ5rMpFoIwRzgPD4Q4iSqHcBbFcJE7dK1XLq6MYUVNQGfDU8pBvI -EocXphpsJ8CbR35dGDY19rmO2LjG3RBDVQJAetRN9Inrjw2YCjNzvKjYTuew1zcq -YghszO94zfoKjdu+PWEdwJBZmVmTDoo3oGXVHfxHRHA3MeISvWJKRSmRAQJAHL9H -9msXJKrEZkkQdFvMr5HbR4UR2LxxUbvt7UGqxSJDuYPkggWXbZR15hdpbuFjC1+D -m1pz4Ve+RwAExfdoZQJBANfmuWtlLU+SMpDG4zOyC7u4dz+TtnEOfDUECFNZtqvU -MWz98MIXAjiBDYU1Z0BrA7b0/FVsPR3t6JZFQWWI2y8= +MIICXQIBAAKBgQDJ/oM/CziJHUMVk1wmuYBlQb0vY2Ze2/ozINnH4TXzFDzItPcJ +2PW1RI9rfqCkO0Vf5vQPCGf4WkxJ5OU5MWmMzyV4k6Z/WOmQnGHLLhSxV7IVnOqN +b5Yg/intLHG4Tx/gBWwEsX7gvEKOv5VeqV7JyaRkwh9ZlBTCBkR5vNJlLQIDAQAB +AoGAZzoeMJW3arr9kYUhTtj1+MlDuXf+1PNuRbrAERnSzErHVXrF1M5/owdKlBC+ +X6+6oGwSxavyFkVvP0QusK/D1DxSs60Mk1p3Ax5nVpNYiBdeBULcYiXCSUbKItYL +vzyECIc02t+auWf/wp3Wy3g6sU6FoT2QCPSsy0qRC48VBzECQQD79P9w0XjJGk8y +3zPc4JOr3a1UUu4VLjFdFDR2eZZRE02NcXfLHE0+Idk3TYnNDRLoWDJjdfZ0thZZ +KuJ58wIDAkEAzTxGYmT/aieDC3G8sHMqLUvjN30TfTocv7mWlpxWo7zbRbQm7jsB +S5weRKtu3yVmdb6rW+5IZSCazc/j4T5tDwJAUgDRSpTCrSFE+Zevt4nYRi2mBjXf +i0E3i8XRtWWpSMXxjcGKba7ObRRzMA6qdPR2XOynqbtw9Vd2Ops8jthKpQJBAJJm +8tZxsXlqIiLhyXYdUPLq9XS5tlNYRvXFT9S0RWGb8NbyQesjEDN9dGIL4JUxurs3 +fkmf2ui4r3UtXSNqQqUCQQDjatAhBdibh5UawO5VpI87OJMzATCkY/mX3R+TnbOm +MkdydjF022P0M4N24DiM+2nBTDp+F45LwtQLa4vmB2No -----END RSA PRIVATE KEY----- diff --git a/mysql-test/std_data/server8k-cert.pem b/mysql-test/std_data/server8k-cert.pem index 7e41195cea4..df27c77e8e0 100644 --- a/mysql-test/std_data/server8k-cert.pem +++ b/mysql-test/std_data/server8k-cert.pem @@ -2,85 +2,85 @@ Certificate: Data: Version: 3 (0x2) Serial Number: 2 (0x2) - Signature Algorithm: sha1WithRSAEncryption + Signature Algorithm: sha256WithRSAEncryption Issuer: CN=cacert, C=FI, ST=Helsinki, L=Helsinki, O=MariaDB Validity - Not Before: Apr 25 14:55:16 2015 GMT - Not After : Apr 20 14:55:16 2035 GMT + Not Before: Apr 25 20:52:33 2017 GMT + Not After : Apr 20 20:52:33 2037 GMT Subject: C=FI, ST=Helsinki, L=Helsinki, O=MariaDB, CN=server8k Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (8192 bit) Modulus: - 00:e6:24:79:3d:3a:58:6a:12:1c:13:6a:43:d9:c1: - 65:ec:55:c1:4f:7d:fc:f2:a6:56:a5:ab:c5:48:2c: - ce:9c:9d:47:3d:94:93:d5:3b:a3:d0:09:a8:8f:e0: - 4b:36:a0:95:ae:2d:ad:7f:a2:a3:c5:f6:87:80:4c: - 6a:26:15:47:73:20:47:e1:f8:5f:49:b7:13:20:f7: - 32:9f:db:7d:62:41:1b:60:26:7b:41:26:16:0c:92: - 22:ef:b4:2e:b3:db:90:e9:09:ca:fe:1a:1b:e4:f3: - 78:69:7d:ca:6e:c5:39:4b:46:72:09:51:08:40:78: - 8e:04:2a:23:cb:d5:50:cf:96:dd:56:43:10:1b:d2: - 71:28:8f:10:a9:e4:44:1c:39:8a:06:a7:fa:37:48: - bd:5a:dd:37:7f:7a:00:cf:84:8a:48:a3:75:a5:67: - fb:7b:47:2d:26:00:2e:65:ed:63:4e:b7:94:18:3f: - 5a:08:74:54:e5:af:dd:86:1b:34:9b:4c:de:fe:d8: - 69:3d:72:90:c7:5c:83:82:78:ea:ab:06:d4:f1:06: - 20:ad:fd:24:bb:e9:94:e0:c6:32:f5:df:af:b4:14: - 4d:9c:ce:0d:62:3a:3a:2b:11:f9:9e:d7:8e:63:2b: - 57:35:10:7e:d5:44:64:8c:61:9b:4e:f8:e8:a5:fb: - 47:bb:85:33:ea:c6:e0:3d:e2:2c:e8:41:e1:15:e2: - a7:45:23:df:d0:f9:93:01:97:89:95:77:4d:d5:d4: - c1:db:61:ca:e2:84:36:9c:01:9b:33:ec:53:83:2f: - dd:d7:d8:20:c0:6b:4a:73:92:d2:6c:22:a6:a2:68: - 46:8b:aa:3f:aa:fe:47:b7:98:70:fd:ba:59:88:af: - 9f:0d:d7:cb:a0:42:44:f9:f0:54:39:c1:cd:fb:b4: - e4:c6:d6:7e:1d:f5:ed:b9:1a:0f:d7:e6:a2:ab:a2: - 25:1f:6c:f9:ab:9c:d8:a3:b9:da:32:72:51:6d:61: - f1:3b:7d:06:2b:3d:43:d5:52:1f:cb:62:14:53:69: - 4d:91:12:22:f0:55:f9:fc:4f:de:ee:e3:fc:fd:40: - 57:50:eb:0e:7a:45:cc:52:0f:24:6f:45:02:72:6b: - 6d:90:94:1c:d4:fb:34:f6:4b:4d:25:17:6f:df:4a: - 64:f8:ad:1e:6e:df:ad:6c:b3:1d:1a:e6:0e:59:7b: - f8:a7:13:77:78:85:bf:3f:7c:12:d4:8e:34:ff:01: - 90:03:42:85:60:e4:99:d6:19:32:46:41:e8:50:ca: - 2a:03:61:cd:c5:68:f4:92:0f:6e:48:89:41:9e:53: - bc:41:62:ed:4a:92:64:b5:cb:3d:55:6c:d9:87:87: - 9a:ab:fc:22:50:66:92:2b:b9:d7:9e:3b:ed:80:e3: - fa:19:69:38:87:b6:25:3a:db:b5:d0:f2:80:4d:af: - 6d:7d:92:90:de:aa:df:be:80:26:1c:69:ee:7a:e3: - 45:c9:a4:4e:6a:e0:56:5f:1f:61:44:3f:62:34:c9: - 1e:21:5f:f6:7f:68:c0:6e:bf:d2:35:1e:53:99:e4: - e1:bd:64:a4:49:3c:c3:ce:b6:e8:a9:3d:27:54:ea: - f1:3e:a1:fc:7b:bf:8d:71:60:90:c5:66:24:85:de: - 7d:47:1f:62:83:e2:63:8e:10:5c:14:cd:d0:7e:86: - 44:4d:df:05:10:43:b8:3c:87:64:69:ec:ea:fb:49: - 9a:c6:76:c1:8f:ea:49:98:0a:d3:97:af:64:ef:da: - 5f:a9:57:03:e3:a0:15:d8:68:c5:40:d8:7b:0f:26: - 0d:5f:f0:be:5a:4c:fd:af:9e:bf:2d:31:40:71:25: - de:d0:73:19:2d:ae:a6:cb:7c:f0:b8:a4:a9:5c:50: - 80:41:4e:dc:f7:20:a4:a6:66:65:fb:92:d1:43:2d: - bf:30:b2:0d:db:9b:a3:ac:28:08:c4:81:99:0c:0d: - 45:e9:a9:e5:6c:da:bf:10:bb:a7:3e:5a:5f:b7:93: - 4a:20:15:29:69:74:78:d1:eb:53:a8:88:49:cb:de: - 0c:e2:9b:31:e2:2f:56:95:cf:55:92:a3:8e:a9:ef: - 68:cb:00:11:d4:71:06:4b:e5:89:0c:b6:e7:2b:2f: - 98:65:21:8e:2a:a3:86:73:bb:1b:76:e1:94:02:d8: - a1:51:97:15:60:a2:39:d5:fd:dc:a8:be:30:12:44: - b1:49:0b:94:82:cf:5f:93:61:1c:3c:eb:05:5b:a4: - 17:ee:30:cd:7c:db:3f:ee:79:02:da:14:20:98:fd: - 9a:0a:f1:39:c8:59:5b:4e:a3:ad:f8:04:e6:0b:b6: - 81:7e:41:00:af:f7:37:ec:6e:bc:28:a3:3d:76:b6: - fd:e9:88:c7:1e:78:79:27:62:a2:83:34:15:61:b8: - e4:c3:ac:f5:7f:3e:4e:5f:5f:31:5b:e8:91:1b:80: - 5e:cb:74:b2:e5:a3:8a:d5:5a:89:fa:63:f1:ff:67: - bd:59:d0:70:77:b7:75:b5:34:74:3d:2e:99:46:0b: - 4b:c4:64:2f:93:48:fe:47:92:6a:0b:42:5e:ef:c9: - 06:64:84:60:89:2b:84:1f:31:0d:36:15:4e:6b:cd: - 14:f7:a0:d1:b2:b8:ff:53:f5:aa:b9:ed:63:50:7a: - 6f:62:e7:c7:7f:bc:f5:e2:0c:f8:28:a4:0d:ba:75: - d0:b8:c7:9b:e3:94:62:66:1c:d8:6c:02:2e:a5:a2: - 62:50:fe:cf:31 + 00:b3:a7:81:cf:a3:9b:3c:57:2a:8e:de:13:08:a6: + 15:6a:68:08:ce:a1:a0:ef:fc:32:95:5a:9a:b5:cc: + 84:bb:a3:15:a0:fc:29:bb:71:0e:f3:40:20:97:35: + 92:92:89:36:6a:5f:be:a5:24:5a:c8:0e:f7:53:a8: + e0:74:05:90:38:21:a5:25:72:2b:56:70:74:aa:d6: + 30:25:e0:95:dd:3d:4a:48:4b:25:a7:a8:c4:eb:e5: + d6:10:4f:95:42:91:b0:cb:68:2f:bf:96:0f:0a:9b: + 2b:01:0d:03:ae:3f:b7:7e:f6:1e:c1:14:42:04:7f: + 09:21:e8:3e:87:c0:b3:d7:dd:4f:7e:95:b6:83:33: + 8f:cc:f4:bb:11:8e:66:5f:b4:32:22:8b:8e:34:93: + 82:0f:02:d1:6f:85:b2:a7:7e:36:0c:f3:0d:91:46: + f9:a5:91:dc:60:4a:0d:eb:e5:37:e3:76:d8:13:bb: + 55:33:23:4c:b3:90:df:6a:b6:80:3d:f6:bd:9d:bd: + ef:d3:8d:7a:9a:61:ac:02:3d:10:b5:c2:53:d2:7e: + ee:1c:90:a5:b0:e8:db:71:8f:d3:53:e4:80:b0:b6: + cc:b0:f2:eb:46:c3:d9:3c:48:01:1d:3a:5c:d0:f2: + 17:9c:9a:8e:fc:2a:36:e7:1c:59:41:66:ad:e1:d3: + 82:d8:95:ee:ae:dc:ab:72:94:cb:0b:8a:df:ef:70: + f7:f9:e2:77:76:64:67:2d:02:dc:1a:db:02:e9:5e: + 63:3f:3e:07:e9:65:e4:02:78:62:55:e1:52:18:5a: + a3:9c:56:dd:cd:d3:f7:f2:55:45:62:20:ce:fd:41: + 93:b9:c2:20:90:23:a4:41:4f:30:5c:5e:a0:97:6f: + a4:1f:87:6a:97:87:70:f9:d5:56:b7:6a:cc:f1:28: + d2:26:34:57:65:9c:2d:41:43:8b:6c:bd:15:6f:ec: + ce:3e:9f:4d:2f:a6:21:d8:f7:4d:d1:63:4f:f0:9e: + 04:c3:82:33:58:34:20:4b:81:0d:42:0d:44:62:48: + 1b:4c:cf:e0:69:e4:c8:f8:9c:98:1f:74:37:3a:3f: + 23:40:3a:88:80:c2:9c:9b:ba:6a:b9:2c:3a:67:a6: + b6:5c:83:fd:93:3f:6e:53:19:48:e3:3d:fa:f5:8e: + 03:40:8f:e6:af:c5:de:aa:f8:70:77:36:2b:6e:3a: + df:bc:d7:f6:c7:4f:02:7f:a1:ad:2f:3c:e9:08:45: + 2f:57:1a:f1:5b:9c:27:07:3a:44:43:3e:05:b1:4a: + 1b:42:a4:90:ab:ce:4b:f7:c1:9b:d7:dd:6f:05:11: + f9:e8:a3:a1:99:6c:2e:27:3d:b1:54:6f:eb:b2:e8: + f8:e6:12:6f:8a:69:05:cc:c6:f6:c4:2d:b0:06:b6: + 21:50:28:50:dc:8c:b2:8c:65:ce:d9:2b:51:b8:62: + 56:70:b4:46:4d:e4:4c:a1:86:31:3d:e3:07:7f:73: + e3:09:6e:ee:a7:29:2a:80:23:8a:b6:0c:22:9e:43: + 1c:a9:8c:47:2c:02:6d:13:ef:88:a7:d7:d1:60:d9: + 6b:28:80:97:8a:b7:ff:62:6b:28:54:0d:ab:63:3a: + ac:57:9e:2f:95:2b:f4:a0:3d:a1:60:a0:57:1a:09: + 23:ee:fc:4d:9b:45:83:f2:0a:1f:b3:77:0e:98:20: + b3:16:fc:97:03:30:fc:ab:3e:7e:fc:3e:76:64:cb: + 4b:4d:c9:6c:8f:aa:70:ec:03:c5:81:31:43:11:9a: + fc:2d:ba:25:94:0b:73:7e:c1:39:01:ca:68:70:1a: + ef:a4:ba:dc:13:d6:37:17:09:0d:ca:aa:21:94:bb: + 3e:43:fd:8c:80:e6:58:fd:75:23:5a:ca:1f:0b:2e: + 35:c2:cd:77:0c:73:b3:2f:9a:e4:03:68:58:c8:3f: + f3:76:8d:05:53:d2:34:db:09:af:70:ed:67:0b:ff: + 2f:64:35:2d:71:22:7a:f2:f2:2b:7d:6d:be:80:bd: + 18:38:37:01:67:a4:5f:48:29:52:78:9f:b5:b8:80: + 70:ca:10:6a:e1:27:3b:c0:61:4e:96:f8:e8:0f:42: + b1:fa:bc:05:ef:31:91:38:ab:0f:a7:ef:2c:86:c1: + ab:85:36:7c:10:9d:c7:0a:6b:e6:2b:11:dd:fa:45: + e7:d2:c3:3a:c1:cd:60:27:68:26:d7:87:49:5f:e3: + 7f:26:20:1f:99:a8:f9:00:a6:0d:d5:13:81:6e:fc: + 27:8a:03:58:6b:0e:3a:c7:20:a1:5c:24:d1:08:a6: + 5a:1e:e7:81:3d:21:05:2e:4b:5d:18:14:f1:4f:ab: + 5c:e5:81:da:c1:2c:f6:12:ff:25:09:97:1e:9d:51: + 6d:1f:63:2e:9c:ed:7d:86:45:b0:35:73:f6:9f:82: + 65:bc:7f:46:88:e1:a1:60:a1:37:50:26:9c:d7:76: + f3:dc:94:89:6d:d7:be:a6:17:a1:2b:71:14:37:17: + 5f:ed:5a:39:99:fc:69:af:bb:63:55:c6:60:7b:64: + d8:bb:b7:4a:9f:b9:aa:89:4b:30:1f:9c:ef:23:7a: + af:7e:31:dd:fb:dd:0a:d5:04:0a:8c:57:6f:64:80: + eb:f3:ee:6c:33:d2:72:c2:24:68:a2:4e:99:88:1c: + f7:3b:5d:10:cc:4e:ea:a5:cb:00:40:8a:a9:63:2e: + 18:92:eb:b1:28:05:fe:19:ea:7b:32:fb:63:56:2c: + 0b:20:01:92:a3 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: @@ -88,61 +88,61 @@ Certificate: Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: - B3:A9:00:04:C7:9C:2B:CD:C0:5F:D1:28:5C:5C:C6:1F:26:F7:17:5A + 43:3B:26:15:A5:60:62:3F:07:2A:8C:8C:DA:F8:74:BE:36:B2:33:E4 X509v3 Authority Key Identifier: - keyid:C7:2C:01:95:1A:F5:3E:CD:04:A6:24:35:35:04:D9:A7:16:01:2A:79 + keyid:1C:C7:2B:AA:1B:B1:BB:2E:9A:F4:0F:B1:86:60:57:38:C2:41:05:12 - Signature Algorithm: sha1WithRSAEncryption - 01:43:2c:d5:1d:b5:36:05:31:ca:b2:f3:9e:71:ce:62:fe:b2: - e5:e3:2d:30:23:99:51:3d:50:ee:d6:ce:76:e8:43:8d:5d:9d: - 28:9b:43:90:0c:d4:24:54:3c:53:3c:18:92:ec:93:86:87:7a: - d6:7f:5d:3b:56:cd:9d:96:7a:06:c8:16:19:8b:ed:c8:21:cf: - 15:b9:fb:06:7d:cb:5c:46:9c:c5:2e:8e:de:77:21:e5:9d:35: - 95:00:c7:ad:d2:57:36:65:1a:43:6c:ee:75:ad:a2:d8:c0:60: - d5:07:d7:5c:5d:8e:ae:af:4a:e6:fa:6a:13:78:98:b8:11:c7: - dc:d2:a7:dd:29:b5:76:fa:ef:13:62:5f:9a:0d:e2:87:6a:04: - 3c:5f:72:44:d0:d0:7a:70:c6:09:2b:bf:92:91:6d:f4:2e:53: - f3:b4:c5:23:61:d6:87:c1:30:ef:fe:92:6f:97:78:f2:ea:3c: - ff:e8:54:3a:9f:49:ac:a9:2b:46:c3:76:b1:f9:eb:31:a3:4f: - 40:58:16:90:77:b6:3d:6f:85:95:12:a9:ca:70:0a:9a:cd:61: - 46:27:84:ce:9e:33:54:8f:9a:41:6d:4d:11:bd:14:7f:ff:32: - e9:06:bc:36:38:11:5c:0f:e9:a5:5a:0f:5c:7c:fa:f5:73:5b: - 4c:47:f2:f2 + Signature Algorithm: sha256WithRSAEncryption + 5c:c7:4e:56:eb:21:1b:f3:5d:c4:56:fa:bf:6d:e1:0d:fa:cc: + b0:7c:13:58:b9:d4:47:b3:de:b4:ae:f2:45:02:88:65:43:89: + cf:ea:9c:d0:ea:45:42:35:d2:ec:bc:b4:73:03:db:85:7b:c7: + f0:68:d7:dc:2b:70:71:63:ed:33:68:9f:29:ff:67:0a:69:3b: + c4:65:7c:25:00:cf:7f:ee:aa:fe:44:19:70:f2:74:db:da:9f: + 52:92:1a:03:e6:0a:49:85:2e:2a:02:c1:81:d4:6d:cf:98:d1: + e9:6a:2f:bb:fa:a6:d5:4b:55:38:c2:aa:8c:f5:d3:f9:e6:74: + db:00:d6:29:f9:d1:9c:7a:0e:98:c5:e5:8c:16:49:d8:cf:ee: + a0:cb:c2:2c:31:cf:62:2c:b1:7f:6d:60:b0:ce:d5:07:45:e8: + 44:17:7c:c4:12:fb:00:57:24:57:e8:17:78:3b:1e:0d:91:aa: + 67:98:d0:e5:9a:86:4b:88:4a:2f:55:5d:2e:13:ec:f5:4a:7d: + e7:13:a7:57:03:41:2f:f6:6c:08:8e:58:ef:b0:7a:79:32:e3: + bb:4b:eb:4d:42:cd:42:96:2d:67:f6:4c:c1:f6:62:fb:c0:3e: + 09:69:8f:36:7e:fa:c8:cd:ff:72:3e:df:92:f7:8f:44:cf:77: + fe:6e:74:de -----BEGIN CERTIFICATE----- -MIIGpDCCBYygAwIBAgIBAjANBgkqhkiG9w0BAQUFADBWMQ8wDQYDVQQDDAZjYWNl +MIIGpDCCBYygAwIBAgIBAjANBgkqhkiG9w0BAQsFADBWMQ8wDQYDVQQDDAZjYWNl cnQxCzAJBgNVBAYTAkZJMREwDwYDVQQIDAhIZWxzaW5raTERMA8GA1UEBwwISGVs -c2lua2kxEDAOBgNVBAoMB01hcmlhREIwHhcNMTUwNDI1MTQ1NTE2WhcNMzUwNDIw -MTQ1NTE2WjBYMQswCQYDVQQGEwJGSTERMA8GA1UECAwISGVsc2lua2kxETAPBgNV +c2lua2kxEDAOBgNVBAoMB01hcmlhREIwHhcNMTcwNDI1MjA1MjMzWhcNMzcwNDIw +MjA1MjMzWjBYMQswCQYDVQQGEwJGSTERMA8GA1UECAwISGVsc2lua2kxETAPBgNV BAcMCEhlbHNpbmtpMRAwDgYDVQQKDAdNYXJpYURCMREwDwYDVQQDDAhzZXJ2ZXI4 -azCCBCIwDQYJKoZIhvcNAQEBBQADggQPADCCBAoCggQBAOYkeT06WGoSHBNqQ9nB -ZexVwU99/PKmVqWrxUgszpydRz2Uk9U7o9AJqI/gSzagla4trX+io8X2h4BMaiYV -R3MgR+H4X0m3EyD3Mp/bfWJBG2Ame0EmFgySIu+0LrPbkOkJyv4aG+TzeGl9ym7F -OUtGcglRCEB4jgQqI8vVUM+W3VZDEBvScSiPEKnkRBw5igan+jdIvVrdN396AM+E -ikijdaVn+3tHLSYALmXtY063lBg/Wgh0VOWv3YYbNJtM3v7YaT1ykMdcg4J46qsG -1PEGIK39JLvplODGMvXfr7QUTZzODWI6OisR+Z7XjmMrVzUQftVEZIxhm0746KX7 -R7uFM+rG4D3iLOhB4RXip0Uj39D5kwGXiZV3TdXUwdthyuKENpwBmzPsU4Mv3dfY -IMBrSnOS0mwipqJoRouqP6r+R7eYcP26WYivnw3Xy6BCRPnwVDnBzfu05MbWfh31 -7bkaD9fmoquiJR9s+auc2KO52jJyUW1h8Tt9Bis9Q9VSH8tiFFNpTZESIvBV+fxP -3u7j/P1AV1DrDnpFzFIPJG9FAnJrbZCUHNT7NPZLTSUXb99KZPitHm7frWyzHRrm -Dll7+KcTd3iFvz98EtSONP8BkANChWDkmdYZMkZB6FDKKgNhzcVo9JIPbkiJQZ5T -vEFi7UqSZLXLPVVs2YeHmqv8IlBmkiu515477YDj+hlpOIe2JTrbtdDygE2vbX2S -kN6q376AJhxp7nrjRcmkTmrgVl8fYUQ/YjTJHiFf9n9owG6/0jUeU5nk4b1kpEk8 -w8626Kk9J1Tq8T6h/Hu/jXFgkMVmJIXefUcfYoPiY44QXBTN0H6GRE3fBRBDuDyH -ZGns6vtJmsZ2wY/qSZgK05evZO/aX6lXA+OgFdhoxUDYew8mDV/wvlpM/a+evy0x -QHEl3tBzGS2upst88LikqVxQgEFO3PcgpKZmZfuS0UMtvzCyDdubo6woCMSBmQwN -Remp5WzavxC7pz5aX7eTSiAVKWl0eNHrU6iIScveDOKbMeIvVpXPVZKjjqnvaMsA -EdRxBkvliQy25ysvmGUhjiqjhnO7G3bhlALYoVGXFWCiOdX93Ki+MBJEsUkLlILP -X5NhHDzrBVukF+4wzXzbP+55AtoUIJj9mgrxOchZW06jrfgE5gu2gX5BAK/3N+xu -vCijPXa2/emIxx54eSdiooM0FWG45MOs9X8+Tl9fMVvokRuAXst0suWjitVaifpj -8f9nvVnQcHe3dbU0dD0umUYLS8RkL5NI/keSagtCXu/JBmSEYIkrhB8xDTYVTmvN -FPeg0bK4/1P1qrntY1B6b2Lnx3+89eIM+CikDbp10LjHm+OUYmYc2GwCLqWiYlD+ -zzECAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBH -ZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFLOpAATHnCvNwF/RKFxcxh8m -9xdaMB8GA1UdIwQYMBaAFMcsAZUa9T7NBKYkNTUE2acWASp5MA0GCSqGSIb3DQEB -BQUAA4IBAQABQyzVHbU2BTHKsvOecc5i/rLl4y0wI5lRPVDu1s526EONXZ0om0OQ -DNQkVDxTPBiS7JOGh3rWf107Vs2dlnoGyBYZi+3IIc8VufsGfctcRpzFLo7edyHl -nTWVAMet0lc2ZRpDbO51raLYwGDVB9dcXY6ur0rm+moTeJi4Ecfc0qfdKbV2+u8T -Yl+aDeKHagQ8X3JE0NB6cMYJK7+SkW30LlPztMUjYdaHwTDv/pJvl3jy6jz/6FQ6 -n0msqStGw3ax+esxo09AWBaQd7Y9b4WVEqnKcAqazWFGJ4TOnjNUj5pBbU0RvRR/ -/zLpBrw2OBFcD+mlWg9cfPr1c1tMR/Ly +azCCBCIwDQYJKoZIhvcNAQEBBQADggQPADCCBAoCggQBALOngc+jmzxXKo7eEwim +FWpoCM6hoO/8MpVamrXMhLujFaD8KbtxDvNAIJc1kpKJNmpfvqUkWsgO91Oo4HQF +kDghpSVyK1ZwdKrWMCXgld09SkhLJaeoxOvl1hBPlUKRsMtoL7+WDwqbKwENA64/ +t372HsEUQgR/CSHoPofAs9fdT36VtoMzj8z0uxGOZl+0MiKLjjSTgg8C0W+Fsqd+ +NgzzDZFG+aWR3GBKDevlN+N22BO7VTMjTLOQ32q2gD32vZ2979ONepphrAI9ELXC +U9J+7hyQpbDo23GP01PkgLC2zLDy60bD2TxIAR06XNDyF5yajvwqNuccWUFmreHT +gtiV7q7cq3KUywuK3+9w9/nid3ZkZy0C3BrbAuleYz8+B+ll5AJ4YlXhUhhao5xW +3c3T9/JVRWIgzv1Bk7nCIJAjpEFPMFxeoJdvpB+HapeHcPnVVrdqzPEo0iY0V2Wc +LUFDi2y9FW/szj6fTS+mIdj3TdFjT/CeBMOCM1g0IEuBDUINRGJIG0zP4GnkyPic +mB90Nzo/I0A6iIDCnJu6arksOmemtlyD/ZM/blMZSOM9+vWOA0CP5q/F3qr4cHc2 +K24637zX9sdPAn+hrS886QhFL1ca8VucJwc6REM+BbFKG0KkkKvOS/fBm9fdbwUR ++eijoZlsLic9sVRv67Lo+OYSb4ppBczG9sQtsAa2IVAoUNyMsoxlztkrUbhiVnC0 +Rk3kTKGGMT3jB39z4wlu7qcpKoAjirYMIp5DHKmMRywCbRPviKfX0WDZayiAl4q3 +/2JrKFQNq2M6rFeeL5Ur9KA9oWCgVxoJI+78TZtFg/IKH7N3Dpggsxb8lwMw/Ks+ +fvw+dmTLS03JbI+qcOwDxYExQxGa/C26JZQLc37BOQHKaHAa76S63BPWNxcJDcqq +IZS7PkP9jIDmWP11I1rKHwsuNcLNdwxzsy+a5ANoWMg/83aNBVPSNNsJr3DtZwv/ +L2Q1LXEievLyK31tvoC9GDg3AWekX0gpUniftbiAcMoQauEnO8BhTpb46A9Csfq8 +Be8xkTirD6fvLIbBq4U2fBCdxwpr5isR3fpF59LDOsHNYCdoJteHSV/jfyYgH5mo ++QCmDdUTgW78J4oDWGsOOscgoVwk0QimWh7ngT0hBS5LXRgU8U+rXOWB2sEs9hL/ +JQmXHp1RbR9jLpztfYZFsDVz9p+CZbx/RojhoWChN1AmnNd289yUiW3XvqYXoStx +FDcXX+1aOZn8aa+7Y1XGYHtk2Lu3Sp+5qolLMB+c7yN6r34x3fvdCtUECoxXb2SA +6/PubDPScsIkaKJOmYgc9ztdEMxO6qXLAECKqWMuGJLrsSgF/hnqezL7Y1YsCyAB +kqMCAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBH +ZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFEM7JhWlYGI/ByqMjNr4dL42 +sjPkMB8GA1UdIwQYMBaAFBzHK6obsbsumvQPsYZgVzjCQQUSMA0GCSqGSIb3DQEB +CwUAA4IBAQBcx05W6yEb813EVvq/beEN+sywfBNYudRHs960rvJFAohlQ4nP6pzQ +6kVCNdLsvLRzA9uFe8fwaNfcK3BxY+0zaJ8p/2cKaTvEZXwlAM9/7qr+RBlw8nTb +2p9SkhoD5gpJhS4qAsGB1G3PmNHpai+7+qbVS1U4wqqM9dP55nTbANYp+dGceg6Y +xeWMFknYz+6gy8IsMc9iLLF/bWCwztUHRehEF3zEEvsAVyRX6Bd4Ox4NkapnmNDl +moZLiEovVV0uE+z1Sn3nE6dXA0Ev9mwIjljvsHp5MuO7S+tNQs1Cli1n9kzB9mL7 +wD4JaY82fvrIzf9yPt+S949Ez3f+bnTe -----END CERTIFICATE----- diff --git a/mysql-test/std_data/server8k-key.pem b/mysql-test/std_data/server8k-key.pem index 72d2756477c..a383b359275 100644 --- a/mysql-test/std_data/server8k-key.pem +++ b/mysql-test/std_data/server8k-key.pem @@ -1,99 +1,99 @@ -----BEGIN RSA PRIVATE KEY----- -MIISKgIBAAKCBAEA5iR5PTpYahIcE2pD2cFl7FXBT3388qZWpavFSCzOnJ1HPZST -1Tuj0Amoj+BLNqCVri2tf6KjxfaHgExqJhVHcyBH4fhfSbcTIPcyn9t9YkEbYCZ7 -QSYWDJIi77Qus9uQ6QnK/hob5PN4aX3KbsU5S0ZyCVEIQHiOBCojy9VQz5bdVkMQ -G9JxKI8QqeREHDmKBqf6N0i9Wt03f3oAz4SKSKN1pWf7e0ctJgAuZe1jTreUGD9a -CHRU5a/dhhs0m0ze/thpPXKQx1yDgnjqqwbU8QYgrf0ku+mU4MYy9d+vtBRNnM4N -Yjo6KxH5nteOYytXNRB+1URkjGGbTvjopftHu4Uz6sbgPeIs6EHhFeKnRSPf0PmT -AZeJlXdN1dTB22HK4oQ2nAGbM+xTgy/d19ggwGtKc5LSbCKmomhGi6o/qv5Ht5hw -/bpZiK+fDdfLoEJE+fBUOcHN+7TkxtZ+HfXtuRoP1+aiq6IlH2z5q5zYo7naMnJR -bWHxO30GKz1D1VIfy2IUU2lNkRIi8FX5/E/e7uP8/UBXUOsOekXMUg8kb0UCcmtt -kJQc1Ps09ktNJRdv30pk+K0ebt+tbLMdGuYOWXv4pxN3eIW/P3wS1I40/wGQA0KF -YOSZ1hkyRkHoUMoqA2HNxWj0kg9uSIlBnlO8QWLtSpJktcs9VWzZh4eaq/wiUGaS -K7nXnjvtgOP6GWk4h7YlOtu10PKATa9tfZKQ3qrfvoAmHGnueuNFyaROauBWXx9h -RD9iNMkeIV/2f2jAbr/SNR5TmeThvWSkSTzDzrboqT0nVOrxPqH8e7+NcWCQxWYk -hd59Rx9ig+JjjhBcFM3QfoZETd8FEEO4PIdkaezq+0maxnbBj+pJmArTl69k79pf -qVcD46AV2GjFQNh7DyYNX/C+Wkz9r56/LTFAcSXe0HMZLa6my3zwuKSpXFCAQU7c -9yCkpmZl+5LRQy2/MLIN25ujrCgIxIGZDA1F6anlbNq/ELunPlpft5NKIBUpaXR4 -0etTqIhJy94M4psx4i9Wlc9VkqOOqe9oywAR1HEGS+WJDLbnKy+YZSGOKqOGc7sb -duGUAtihUZcVYKI51f3cqL4wEkSxSQuUgs9fk2EcPOsFW6QX7jDNfNs/7nkC2hQg -mP2aCvE5yFlbTqOt+ATmC7aBfkEAr/c37G68KKM9drb96YjHHnh5J2KigzQVYbjk -w6z1fz5OX18xW+iRG4Bey3Sy5aOK1VqJ+mPx/2e9WdBwd7d1tTR0PS6ZRgtLxGQv -k0j+R5JqC0Je78kGZIRgiSuEHzENNhVOa80U96DRsrj/U/Wque1jUHpvYufHf7z1 -4gz4KKQNunXQuMeb45RiZhzYbAIupaJiUP7PMQIDAQABAoIEAQDdg63OaSJAtj2f -0mCMb8ISwFfYk4Osar5rp/Gzjq0vwZKYizHfxA/gZeuA0HqUkeyAQicE+x53pNq3 -etWQ4lprTV7i+ZV99mDLEiQACdudft1Cpsdr5aTDZMWLwvpQ072fEHX6Llc6/72e -jB0UkXCcK6oHnZ87rs3C5Gyf/SpTJPrV1KbkoKGaUFnRrIyCPj/EOFp2a+UWWGba -pCuzkfcoA21xT6yW8+NY+EOwh9VWJwy8af3WtWIh0ix+sCDqegsJcHObWXJQ8ZMD -Oi9lfqXnd+ZskYOR+zn5P8w9LJiJ1CEAFLR9H15tpleFtCSw/z5pLP9ndvTwyeIb -GSmU2VAqBgP6roGYDuL6iq6Dyi0GN4luM0pz9c/PtY2Ni8MrzeziKjAF6OXiDE41 -rxTwdG7RxnNa2q7+tjt9hrCgLbYqd6W/6VKYZY1YKvIE+PhdwGtzxwbKsOf6phqt -6DZr0BKIX7VwMeXRHbhtjw6hR86diH2koLQPfH4crDIL3GQ2J13C/RxjTLAEOli2 -y4paeOYzOe6ANDXXBOhieFw5f6mqD9pTF2PWDTnTJhfMGJ6gXPapDYoycS8huNnM -DnqtMVIOf2zOI8aSkumJyXq2bEpGSNK80IJgyKfpk0b4qOdbG7tklfbhVCxTida0 -qqgmJKLGrNmJNW8KLB1U4/hcowEVFz8MF0OZAnByDHi2axwSRSGD5aG2yhCfs3Sy -C269M25v0WuTeOs02RnHUvLPIhvbOEVTu6AjvAtYIfjEq+xqrjbZqUqJeh/xo2tF -SohWe5aQs5DntsMCkZWlqlXc4CCaCqVACegh5Rn+8JbpZvpzy4HUtThfVbB45a5P -6uRAsoxiIHbPLyIaKHFqqfog98hzD4TZYKpfb4RCgqKgEAHGKh4/KPM9O4iw67Oj -EnT2WduegazemzOxQIuZ1UcNu/2d7uy8v/zPGLEUfqhFLS8PMStEuLdQQZfU2DFM -rHJZsH3UtgSreZuQnlTHYy073UhB44mhcYbwa03jMkLHb1bt9q9l8ZAZ5FjstKJD -vN5hMqT5LBQtvArCB+aIVDQxEyZiqFxBlW658uAIhCkLXNB5BVfEUEB8w5vZXOPn -UpNyM8v0dYOkiSOH6+Kk0i7eC8CSrSQAaLnuFZxepGCGMFksywMv7mDg6yX1sAkE -RMakKaAaZ55QpUv1/heaBVK0xmwpjJBefAoMCyFh/I+o7BkFdWGsGF2Tc5ZxZB3F -DF75An4WV2qFMNEIb2SGBBUHGoG75C7tRC9ll39SqX7X2pXMaHvJvEx76CmhC9ub -TzkRDV0Zi/GqiBQXz5kn4AP3GCuJUQJIvK2l0HPqbqNULrhahwQWBOpIek/SLBFV -3fRQc5ABAoICAQDzqaS5/JEKUGMzVikWYnxl6fXgMp/l3Hq2DyifRqgYVoSr/wOJ -PTOOJrtuvwHK6kbOv4YRfKwgVWlJgoAP9Tz0GGpE7toSk3biHY4tTF4KR3xIIOnI -LQLNDR0LDrJSjQhAH5z8U/E+dpOCBHLfXodZ0/ZuXx9YS/pNDQBW/+HOmDtCfqpb -kLmxjZcvZnAZyrlSjGrHJoPjiFrVA/1xvY68TNWHWu8EXphKO/aBi5/e4wWS7I8q -0lDjjPB3GIm0rhumowoGYDPtchcTIvip9aGSPsw56elV+PiwbZaPHZXwHeI0Q25j -UAdkmkwO4VaYGeR4JSUTjoOwWdXXediRq9SKRwhOoat3GJdDwYByYgZb8MKdQCZV -H9hD0rEF4JOrUnOsCteXMNEczQocfSxduLD7XLie+oXoEggNE/hD9EJ397sOvyUg -rgmJLBPCbIPdnfCwm9rdLMsWUjvd4JFq1dyQ9QM1LkdOGQdSoUixtN8X75BdkWhL -/LUqVV/L5/1DStYniO6k4ry67u4POisAZa4czPAJrBEOakVxkCIoaH+mZ/J3GxWc -DvnV6myvcNXUEENhfMt2mikP5zcPthq1O1nm7RFqiow4s/f0jc6Epr/LToXwhm8j -5ch0TkcM+ioguCyYXWEzRJUt3GBWpHoSvxqKLxaWbo1mtxHpGxHDIIFAoQKCAgEA -8cuU0H0OE3JJaG+9Hp6q5mJfdrAzeIPTCT1jxVDptZaplMVo8X0+LIKYpzWqbGWa -Z3cTmReOZBukuKPKXuZEufYqzwIh7lEv1ls2SJ8Gedf3Dq3C2fCITHzXlsg58mrf -tD6cKE85EmI/GhXtaBc51Qa60w5MyXfzK3EPi8lD1v5Il5K1MG6sv+7+P1LgAQVj -c9mPVT1WmgBFVG2/syJ9L94smwhrtM2NhxMkMtEBrOiv0Wy0bEb1wIo5ndBGBoeF -KXBfz87HDbUCSxItDFZ5mDk2ARnzl/13+wr81aKcxW2LyQ0eiiN+HczmM1xpavU6 -KI/QnIvUNqW9XRSNpz/w+DO9+gs9BPIODMww4KpLVtgFfy5KYre1/MpgZHVlHDCI -r72WaDFHdMs75JN1rPNnYx81LtKp0JnE2bIDda3qlCKTBtwaFEUg1F0v9NK9yiZF -JytwUUIfURayT34hfDAJDaSemWT3b4U2kYBr7Fp+g6R5iAosx/TnCYxtuGhdSLA7 -JkL4gy6Ll6hQkIyxRxC6R38wzwUFg4pbV6qrhjP1qyuU1BsZrBSV1RSbcHghSAZj -UmT/sCKOhnliptnnz3e6ceP8I9Y2/TOeJXPdH6zvfaTpnVLiZC48FBKnXFCM4SaS -v5qejQChBBOyd9ybO40sxC/Db8WsPa1LCMnHzm9YtJECggIBAOitGIYZ7o7A0NnW -7wlXJp9TWN2suhAQCIYN16axHBeRlsN/k2rcLH0T82v/rcCNEuye63GLcfq2VQJD -QfL7JieZoPEOfOO8OYwW2QvcnviF5uIhu9zRTplsak2CzToTPsus5IX3yqjxJk7D -3MX8SJe41tvyrcXtV6l4PtjVJFXZ/My0lA04GHq6UKKM2YNnmKyBNf3Sg6MlNEex -tbWFY+XgIQ9OAGxVwGsy82QlZpa6hzoT92rWxzNkBMRVhDorAHCRxCLufufBSNOX -U4lI6+7xVKgA/DaCt0gSffFQOTu/7aAmvCTN6SFiTjrvZ3d7UjaAkfUo5Avk3VUU -H4CLazxYNFCSBWCG9PtYrkWL4bKuJ8lt1qz26ddqPGz2VU0GQTsKZ3ESxr0P9xXZ -WiJtGWQO2KXHaVOA1HtYlHyfpVFWGSQt11BroOOCWaQRZ6KbDZo4WjlWauB3yn9H -0NUKP8OUlGmWNbUYJWv8Y6R+qYL72wnero/RU1aHjCD0+V3m+rVqBykg80Q2oNGd -pC6O6kLKWHWEAA2Z4ZJeJqAbmbnYDSs7i9koW96wKvUldKs6lH1lZA1vjMKI8oVo -SfzCHklsHHN2tgv3n1HCkHEPopqL808JsNvAsziM/0AfK1dvR/Z/RTBlz2apyL0z -9vYr0zYdXR5tl018h/fnR4Dja0nBAoICAG7z5Ui6adAgnHDQ/W5kjrWDJJ05A5Vk -oF1YD0VG+Md76Ds9TwepWfNgxh3McXSmNvENYi/Y8F0dljun5UAg2B6hSEmPh/Rs -ys/JMSKn3nfg0xyoPYZ2aoT2sJMfM//6bMawCEYy/FRkQuJ8d2FRbxdCrE4W/MNi -SHKBwgl6BKhOLQ9oob4kux6j04VJSUMOrvFFPxF1QR0PzMCOT+4qgFmL0NofRhVE -UZJPBUhQQj2O1Mb749rfwPtmMkQpg0iRvVgjmcOo9gxjKDc8kvFbaRaiAhcFSpNP -G1RWWWjK4rdxqjhKzd3DpaaVFHkzCair+NEOFUMQowOkkD17Jfk+TRwH2kA4EfsH -+8yBklg1rLagD/2pRzb/aAIk95CBkjEaUE6cZ71OB6UfcU9VHyWK18FTW7strgDr -3rmqhw3kDYWGTANU0p7EjekFDfGBFtgBMbBkrXiMKAS0roPts/3hqPXauXBYNXa2 -ITEpRdzCNdXAjogPazciOTZXey2ork2hmLLY/mJr5GBmOvnppZufoGsYgVQt0Lbo -sTuMNIMzqqKuL/AYs3IUTCDoAN/eMB911vPDJtUzNkWcw9kemtHH9gU3AceMD9Wm -bwZuoWRcndUA7LZlhz9DPAxV9vhUeiEC60oC8IhxZnGRfE6mK5FrGcS4yiyq/3uZ -3pmcxhQDYigRAoICAQCzK0SUG9tSzwpyuEb7hbS7isT0XOnVvLDEXL2jTwVqbN8a -pC9jebbzJgxk5EA+np/eZlRU7h4aZjRhtDwi4HsarXzgIni6z1vswAiOSZRCfC17 -8/tjfER9w3pJMRTJ5MFeN7JvNUhWnXY5fX6SBl/Eocwwy8S/eIWUY53aI2k8UZMR -eLUb9I6eL21qZAPp/XD8/3pF5DH0ECOS96C8mDKTGnARUyfkKrlaASSTfe5XToNb -IpDEYtLwpHN0missq+ObqPc5lwot/nBy2fdllksb3mCCK8AxuKEDsVtWbb2maoa9 -lRGxIxr++ZV8n0dAwGCV18CbhBYh/B2YnrexI2ZfYOQbzPjHiuUgSLGBJvIUX+S+ -O8ij0vQBqECfwCq63SrdW340Huob52d/cod9pNolO5edftPNJVJP+44sZtEJoDBW -WgzdpVV9fA8TYsO6B3Dci960fbpWnKZ01uLFWVTkou8IwqcaxJIyMzS3Gmqo4UEF -oxBSrg9rTAMJSnm2YWBHK1Z8DDlLzw3SkNZVKm6Ai4yEcLs1PzGZejsJvsu3zGgq -nM4liRHK2QqY1SJf6PsJGxAI62tlyTRfjxtC3Jq9oJbmJs+jl0gtNKEbkfQc83IL -8wCHOm9G7KK7XJjMCb50Dh80YIDFj5GTQLU1tKdpDBfq6YTKUHqjPA8GRnz8vA== +MIISKAIBAAKCBAEAs6eBz6ObPFcqjt4TCKYVamgIzqGg7/wylVqatcyEu6MVoPwp +u3EO80AglzWSkok2al++pSRayA73U6jgdAWQOCGlJXIrVnB0qtYwJeCV3T1KSEsl +p6jE6+XWEE+VQpGwy2gvv5YPCpsrAQ0Drj+3fvYewRRCBH8JIeg+h8Cz191PfpW2 +gzOPzPS7EY5mX7QyIouONJOCDwLRb4Wyp342DPMNkUb5pZHcYEoN6+U343bYE7tV +MyNMs5DfaraAPfa9nb3v0416mmGsAj0QtcJT0n7uHJClsOjbcY/TU+SAsLbMsPLr +RsPZPEgBHTpc0PIXnJqO/Co25xxZQWat4dOC2JXurtyrcpTLC4rf73D3+eJ3dmRn +LQLcGtsC6V5jPz4H6WXkAnhiVeFSGFqjnFbdzdP38lVFYiDO/UGTucIgkCOkQU8w +XF6gl2+kH4dql4dw+dVWt2rM8SjSJjRXZZwtQUOLbL0Vb+zOPp9NL6Yh2PdN0WNP +8J4Ew4IzWDQgS4ENQg1EYkgbTM/gaeTI+JyYH3Q3Oj8jQDqIgMKcm7pquSw6Z6a2 +XIP9kz9uUxlI4z369Y4DQI/mr8XeqvhwdzYrbjrfvNf2x08Cf6GtLzzpCEUvVxrx +W5wnBzpEQz4FsUobQqSQq85L98Gb191vBRH56KOhmWwuJz2xVG/rsuj45hJvimkF +zMb2xC2wBrYhUChQ3IyyjGXO2StRuGJWcLRGTeRMoYYxPeMHf3PjCW7upykqgCOK +tgwinkMcqYxHLAJtE++Ip9fRYNlrKICXirf/YmsoVA2rYzqsV54vlSv0oD2hYKBX +Ggkj7vxNm0WD8gofs3cOmCCzFvyXAzD8qz5+/D52ZMtLTclsj6pw7APFgTFDEZr8 +LbollAtzfsE5AcpocBrvpLrcE9Y3FwkNyqohlLs+Q/2MgOZY/XUjWsofCy41ws13 +DHOzL5rkA2hYyD/zdo0FU9I02wmvcO1nC/8vZDUtcSJ68vIrfW2+gL0YODcBZ6Rf +SClSeJ+1uIBwyhBq4Sc7wGFOlvjoD0Kx+rwF7zGROKsPp+8shsGrhTZ8EJ3HCmvm +KxHd+kXn0sM6wc1gJ2gm14dJX+N/JiAfmaj5AKYN1ROBbvwnigNYaw46xyChXCTR +CKZaHueBPSEFLktdGBTxT6tc5YHawSz2Ev8lCZcenVFtH2MunO19hkWwNXP2n4Jl +vH9GiOGhYKE3UCac13bz3JSJbde+phehK3EUNxdf7Vo5mfxpr7tjVcZge2TYu7dK +n7mqiUswH5zvI3qvfjHd+90K1QQKjFdvZIDr8+5sM9JywiRook6ZiBz3O10QzE7q +pcsAQIqpYy4YkuuxKAX+Gep7MvtjViwLIAGSowIDAQABAoIEAG18dDwatQx9As62 +wFrQ/NQwOs3S6sXWqO0knoyU639+0Duf8b7uE/Ji7nm4iG8NeEAzwXfbRAgQNuKh +VMjgaxgKSR8dCRRQzIkgp48t46dFJvQP+A7JZ9lr5J1kIs7DAz+zawYTaW9JSVgG +mmujIS0ayXtZ4THkSaiEZTdOVUwE7+FxVB15WvXJYAg/BFzm8HblHfEkxGppiUGx +9ULmRAJ4TZhv7Mzeq7Ny7jEJLJpPXzgHPtE/fgshC0d5mYYpzT1I99OxsTpMtAtZ +M8nReEwcVvjJnnDGOJZo1J2X8GXBwdVE9eXWjZmTODqbytz77S/fcaxz/amzOSIG +dYne4SsllKS0jzfxPhz2saq26ik7vxpD7i0cRQ+I0alvgISWRTQUiHSI8UTtYJ6+ +/l7VAa/isoTZOsOmwv7M7D6U9EtjrUKwBAUHFk+0Fg2w9WELhep7/bEiQWvnOMtX +sruWBm5zv5CxW1MuujKn2t5jHNWhQaeOIrW9V6Hew3PJsLTTHUVX2Ikc8KZLObTP +XTtGE993cADrYYxPH8l40QCHB2t6bM2maBTRy8PlMFMsYaM7rqnftlOuXyRYLm97 +oO7F8InpD1mDND4bBKbL3UOgl1QW9dbb8KOn8pERDXD9Z3K4ewyORiyuONXxBAz2 +QiaQ4gDJWD6sEySPEHcpDjemi6mKJFtDw935JxS2brso/NHoJSVdcNxisd2irA8P +U8jyFTrTm7cO0nKFx9vv9r5dsbkqyQnJ9V0q4/DoWvnkPElKuvTeJMw6CvTjfvc1 +xIf8m3MQJTN8pqPpIOSj8DIhQIJBEVxtcajg+vlMuefR8hTCdLzQV2QEdLGjNGph +OhFuHrHw1b3I4nCyi9MOLzpdUDgZkaw4hPg38u71RJ6bUF6pE89Yj04/svB7SZgA +sE8+/pZcASZl1Y0T29OM3qFJvukBWwsNij5P5SLmTXDev+DXbzUvmVLCk8nJkJ5m +n1peGst0ApHnEzxVhU+9d5FWBdIgN7fp7V2AlFt1r0TRWUYndBn9/B6xiyfd5iyK +LpcbRjLpQ/9b3SYQZL9t65Hc40rP35rY0luQTzVd6E/D041E0NWdpAZai4GrpMKp +NUBXBbmwnCZEzExLi78We6aF5tG9Vh+uxyYUXlrABR98jONgYIvnWaATaw6oLgam +B84RhWUa1f+K70wrTorUO8QNvYO2n4jpwJikn4H9pFvvzzoOB7RaA+EF4HjaVmQr +Jm6S18c7sksYFGIJYsPrXMtgOMQVYiQ3s8LDgsWKoEQYgvgxE24AoXGlXXbALrpo +4WvRN7qLAm3n2OQYFUK0SGoELOADQFQhbNL91i0k4wzQ56ofQCb8aTmm3q76TnbK +4gmIUIECggIBAOm3PhMqIKb3ZEZOWYMKByb7v8seuVh6mwXmgITcZIiA2f8rTfyH +OZanYK72FsuGZEbf1ELwNUX0JobwklA1Uq9NajaJUdfe4wDpghf282APHK1nD3m3 +FX7Rsoof/dW9+bV/IIbQDwy+1ctB20m6dejt3kWyHSXly2y2L3bk1flee8oi+VCO +ROp4u23KJcglIYlL+cL1z76lX41v8JW3deCTL/JStmK6zuvFhY5fTlOGxsLhAY3X +VTZ0MNUpezlBaXTixi7ilgbh7rJSpCmeno5my1hdl/5Q5U/u5F5E7ZxKxlhuVWdA +cf9qbtolSsgJ2w8axPD3dLnQ6wsNnl4yL77TdNr8OlbwIADXHH9VzZbfEgOhP4r9 +Cwz4hIUbylJ9QGZVsEVZhvqR3M6OgqlYOmC72nLPXVYbL/Rr7cTx8t+WJ4wJRP3l +pi6AgDZXKbMKyMIhM1IscSR2swtAFyl6g6rcAjFyG+p1IKMOQ3YOqdVVUf5UYSpo +NBTpJ+ho3CyQJK25yT2Maex5Q91M6Rk9vmXaIs+K40t/zu8cnCIH9j3In0BrpSi7 +WUyLgzXW+7ZrW7cugC93VVgjGNbgBiDimZ5duViI+xY+3OlrsUxzSHN+YY+8H2G2 +TfzT+Mgo8lJXH9tseFBLvRKhoPbbCyCwnOJ6k2k8/iqZ2eE7vQodyW/zAoICAQDE +yK5Mlu0k3oTVasgYRNDYKJ9uyarVLaRcN6UjzNUSta2hABzQe/LG895EucK9yVa0 +4jT7EXILYQpHnQkaYtyHtN/deYWLRObT6RMws7te2MhwzQkaNavgi449dHP38TPS +qy3Vh6v4nMhRjkhLqNiiJoDWThtkB216t+71GxdF2l9trrcvlC6q0Z65PR4LK3B/ +3m8KmlyGN940Ovb/4kEh2EZmNwbMq+3SaXiS4R7ZvKoboyNmwvCh4t5ne+NXz3Vm +7srej0cnOM54dTuNVdXm6pajYjELNVJGsK0vo6CAZiAOyasFkwMFMr5w/ehBaZIo +9ewWjvgDdvQ0+JBMVZJot7e5D4tUgVTaIMpQryzAp/u3r5KC1bkcC1Zie+44CaPr +V2FspEyYQDPJHC2tRj33lbaCWDdfdhYhv6uzlcM9ExPj+RQA0xlCuxh1pxK43H4t +PdWvcIeIKtFRWq9gsH1/wDBaIsB5Kykq4xyvMOj3dyV+dyIO1D3GG2+ZoBt8gklk +ieDIzCMKsXbomgm64/Ewlx9tf1fbTouSWP1+Gh0Wne3sCEtCY72ebYgjtaA0w8Xr +HGTsEdw/rSer46uULYWXYC6VYZwlyTbPh4NSD7ATrQo6HnaKugtuya9NPfYD9S9w +PoXPXpNKvwSq9SA/XsodHet9uU+IlKnYI41hVGaukQKCAgEAu7dAFmh5vWFqmsWH +Q6akQ/1j+KL+v0AKj1yp0Qyreq/zZ+3CP5fk+0oIb76cZG/Wzs4sUG9aeos0/qDv +A5kwhjipnJACul38+diTcugYZgj9QZFLbrlMfIW03xf+6tQhYlNvLpih3dzRHuYQ +WVF4LtQO+O+sVaoSD4js6pO2AQqQZrRchwUd+S1rbS0112FrZDkvrBV+/GMbMiC8 +naOy++N8WSdx8i6Uz+3f7ZBC+vd/YTsT4ncXrBr6tdsRa9VL/GPARhwb3/9LltKl +pAAQ3dNWc+0IjW0wIVmA9u5p4mR0lsZXtgyfA0TbMD9PpwezeJhJojk++ZgBkOkp +UAMDMkPo0ZJQ0U8ghUxBSU0DSbB1aZDz1pCTdaGN3tOJV2Pee9NLNwhHT64kKYtx +Cs8gZF29gQVotCY2CB0/5jVmm4qgzOsNDNiM90CiugKcLX/162Z7L/8eCOmFuP2L +HPeYFX2MDWbXYSMeSZjFOmdgpUZYCux+9m6nljwGn7bJUMmdjCNyrQrAcPydM3v4 +pRtgd7ISz5uAID3RWWAjT3oRn2Ip9rX++44ulTpg8rdviP8FtUWWE4nHdHkMFFnu +0i7ur7Ibki7DbQSkrp6e0watJIZXmfjBQ9wHG5CteybYKqZrofOnVubeP76t6Ffa +wjDYcVd+WsJwaosT4sH2fc+a4V0CggIAX703N+ISHGb6f47FLTGF3jTdZJxPNgpP +teIIwUMtwz2K7RLN8gzr0Cnj0NID0iw7uCN6HVCeiLS8uJzJSgIhQxEX/XvbIify +mdUC1iYLmhikZGUM8ah9J/Ed0f5vUYkTaoKH+SRZ4cn9l9g+ijjqtPFAq4Myxlbq +x9LnOm7kwsJ8vTNMwqQ4lDkKHRuEG3EV+dAxfBofu9lAjW7GrzXX9Gxxy9cnwro/ +KajQ1b0bMloc9PdJCPz87/YduIFI2XcAqoSxRNi2iHmV0ntO7vN87yzg/zqNm+Nk +VSouCEh2lSGapTcusraUuJm4l+agcfq39p+3Lj5+ocjlBUSNh+X2JmaDx1Ctu/50 +Vu+vHtQrVMwlpneQM4Fh3ygQ7jdXbgIasyw/JQlGjqhlyYmhG3VaPrOjKQVcY2Bj +YiYLloLdi0BV5AtR1RjfaFz4iH0xmakE5mP4K7P27KPQVOFnBAa5+EZ7/856kDkU +fV4jnYSRQ5y/LCkv88EFEPZWNIr19Hy60mRWbbsLrW8r5/zRkRDHTpmn27EiAHvV +Ye1T3187Gb7ae4SJgRJftc2ad60s9Z7uEvYsj8Icwwoui+1nk98V6NENuPXVb3jW +5t8KYAlr5BbDLAWYLORZHZyYYl8r6z8FxnlUxtA/nxUSY06BUvN+J+5fnTpkXJHf +lF2vslPK5VECggIANpTlrc5Zp9c0jPOiBQT/92LdtMR9mB76WB8fX9xn1Tm7V/cI +MatRrFzaTvi5HqHxPWJJ5cgMYKQw8kHHk1q9U7jeexZGCICFOUjk3N2Z0aXIWrx+ +hiS1i5DzRaZNI682s436cdaS4GpZIhqjIOR4/JS15Nfu+DVqyHOevWnd0D/tGoJB +JpiePYl2k7b8sirM3bHnRDtBiMHrHyHxzpdTLImDLHXr7C5DTeQAzzo+YMu45mNm +utKq3SRlO2wizj0qpONgJ6cHI7pypAPalliA+hPRRJqaHmTr7LpkP3+g73hf26wK +PoF6CLkdaN945F4Z48/3zEOP3XRIQocMA46ayA+8TsOpx9rm8L1LrF1pgmJi5Ml9 +3yV93ZZ/w4Jy0pqZ28nn3gcX6JP7qtfgioLLeyuuBphpOQXl7Ys3w1d0EEErpATU +tRG+BS16o+FhM1iXAN8c8HrqOtyJzCpYnuoWiNc+G8BIn6ox3xmihwK4hiR6s/OM +Mxaa6T4FF/IWIzuCezYPGgybWMXj3nRHsD7eNP170irBLwS3GdD1HWM2BpmLdJa0 +m/7QQkONhCnNFtjIalfPWMX51z/8GOKRKWH5A8PY6CxVHRg1ZfHT4TlfbdRPIG8d +6JrWt2s4eLv9VRdM+oMifHR4qvLDgg7R8pBr2FSsVXM9U2+j+drIeAhkjHI= -----END RSA PRIVATE KEY----- diff --git a/mysql-test/std_data/serversan-cert.pem b/mysql-test/std_data/serversan-cert.pem new file mode 100644 index 00000000000..e47779f420d --- /dev/null +++ b/mysql-test/std_data/serversan-cert.pem @@ -0,0 +1,60 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 4 (0x4) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=cacert, C=FI, ST=Helsinki, L=Helsinki, O=MariaDB + Validity + Not Before: Apr 25 20:52:33 2017 GMT + Not After : Apr 20 20:52:33 2037 GMT + Subject: C=FI, ST=Helsinki, L=Helsinki, O=MariaDB, CN=server + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (1024 bit) + Modulus: + 00:a7:74:d4:2b:80:cb:96:08:2a:b9:c2:87:18:0d: + 69:2b:da:cf:ef:21:cb:05:d4:80:2c:f3:85:bc:78: + b2:42:d9:9f:f1:dc:47:68:c5:af:5a:c9:01:f0:dd: + 91:cb:3a:b9:38:b2:36:6b:a3:66:ef:cd:44:0f:8f: + 39:57:60:ad:3b:44:33:51:c2:7f:cb:5c:8d:55:b8: + 1e:e8:80:e0:ed:9d:8d:10:7a:42:68:73:06:63:83: + ce:db:05:5b:e1:7b:f9:0e:87:20:38:b8:11:6a:b7: + 59:3d:4a:ca:cb:60:e6:e1:73:d9:a2:24:4a:70:93: + 5e:cf:d5:04:d5:ad:ac:96:a5 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Alternative Name: + DNS:localhost + Signature Algorithm: sha256WithRSAEncryption + 4b:78:d9:09:4c:25:cc:fb:17:8f:31:13:ac:d7:36:2d:5f:d4: + ce:94:84:d2:a7:fa:e2:1e:ae:b6:72:1f:01:56:0f:89:80:c0: + 01:ba:ad:d7:cb:24:c5:25:ec:f8:35:ac:52:1b:4f:af:7c:26: + 8d:d4:d4:91:05:21:b7:ba:3f:6b:1b:8d:1d:a5:6b:7e:7d:be: + 2f:6a:09:83:c2:c3:6c:2f:8a:31:fa:7b:36:3f:6d:e1:62:ca: + a0:3c:43:b8:53:5a:4a:b3:4d:7a:cb:9c:6e:db:a4:ce:a1:95: + 5e:26:d8:22:39:8c:34:0e:92:bd:87:a2:b1:7a:68:25:57:17: + b2:d8:43:3b:98:e4:80:6b:7d:3e:ab:32:82:6d:b8:80:45:83: + d6:55:f8:cd:31:74:17:8c:42:75:09:71:66:b9:e0:94:16:ca: + 1d:db:1e:89:12:a1:9f:00:cb:83:99:5d:5d:28:7a:df:2a:87: + b5:8d:f1:9c:b9:89:2a:0d:6c:af:61:00:41:cb:03:df:99:4a: + fe:93:81:88:ff:47:4e:2a:b5:2b:bf:85:0f:9a:21:7b:20:58: + 7a:1c:67:b5:8b:da:db:03:69:25:db:76:0e:f9:23:57:8d:8a: + 47:dc:15:16:7c:2d:66:8f:6a:10:f3:b2:ea:2e:31:c6:d4:2c: + 90:15:56:f4 +-----BEGIN CERTIFICATE----- +MIICuzCCAaOgAwIBAgIBBDANBgkqhkiG9w0BAQsFADBWMQ8wDQYDVQQDDAZjYWNl +cnQxCzAJBgNVBAYTAkZJMREwDwYDVQQIDAhIZWxzaW5raTERMA8GA1UEBwwISGVs +c2lua2kxEDAOBgNVBAoMB01hcmlhREIwHhcNMTcwNDI1MjA1MjMzWhcNMzcwNDIw +MjA1MjMzWjBWMQswCQYDVQQGEwJGSTERMA8GA1UECAwISGVsc2lua2kxETAPBgNV +BAcMCEhlbHNpbmtpMRAwDgYDVQQKDAdNYXJpYURCMQ8wDQYDVQQDDAZzZXJ2ZXIw +gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKd01CuAy5YIKrnChxgNaSvaz+8h +ywXUgCzzhbx4skLZn/HcR2jFr1rJAfDdkcs6uTiyNmujZu/NRA+POVdgrTtEM1HC +f8tcjVW4HuiA4O2djRB6QmhzBmODztsFW+F7+Q6HIDi4EWq3WT1Kystg5uFz2aIk +SnCTXs/VBNWtrJalAgMBAAGjGDAWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDANBgkq +hkiG9w0BAQsFAAOCAQEAS3jZCUwlzPsXjzETrNc2LV/UzpSE0qf64h6utnIfAVYP +iYDAAbqt18skxSXs+DWsUhtPr3wmjdTUkQUht7o/axuNHaVrfn2+L2oJg8LDbC+K +Mfp7Nj9t4WLKoDxDuFNaSrNNesucbtukzqGVXibYIjmMNA6SvYeisXpoJVcXsthD +O5jkgGt9Pqsygm24gEWD1lX4zTF0F4xCdQlxZrnglBbKHdseiRKhnwDLg5ldXSh6 +3yqHtY3xnLmJKg1sr2EAQcsD35lK/pOBiP9HTiq1K7+FD5oheyBYehxntYva2wNp +Jdt2DvkjV42KR9wVFnwtZo9qEPOy6i4xxtQskBVW9A== +-----END CERTIFICATE----- diff --git a/mysql-test/std_data/serversan-key.pem b/mysql-test/std_data/serversan-key.pem new file mode 100644 index 00000000000..393c0bc9c1a --- /dev/null +++ b/mysql-test/std_data/serversan-key.pem @@ -0,0 +1,16 @@ +-----BEGIN PRIVATE KEY----- +MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKd01CuAy5YIKrnC +hxgNaSvaz+8hywXUgCzzhbx4skLZn/HcR2jFr1rJAfDdkcs6uTiyNmujZu/NRA+P +OVdgrTtEM1HCf8tcjVW4HuiA4O2djRB6QmhzBmODztsFW+F7+Q6HIDi4EWq3WT1K +ystg5uFz2aIkSnCTXs/VBNWtrJalAgMBAAECgYBReSgZmmpzLroK8zhjXXMEIUv1 +3w02YvOR61HwJxEkMVn+hNxBf50XoKDPHh5nMMUZbqvHpxLYLZilsVuGxcTCPVzw +YxTooPcJY8x61oUclI2Ls5czu/OfzoJhA9ESaFn6e4xReUFmNi8ygTMuPReZZ90T +ZvDikonKtCCk99MSaQJBANrmlPtfY57KJ18f1TqLvqy73I1vQjffSOrK3deYbvvB +jUJ79G9Wzj8Hje2y+XkkK+OIPcND1DnoTCTuqVazn+cCQQDD1jy8zrVg/JEPhQkS +BM7nvm4PIb0cgTPrOhsHDIF4hbaAZnA0N4ZEJ2q7YitXfOeR98x+aH/WJOrzzhmE +VXOTAkBQ4lK6b4zH57qUk5aeg3R5LxFX0XyOWJsA5uUB/PlFXUdtAZBYc6LR92Ci +LDeyY4M0F+t6c12/5+3615UKzGSRAkA+SGV6utcOqGTOJcZTt7nCFFtWbqmBZkoH +1qv/2udWWFhJj8rBoKMQC+UzAS69nVjcoI2l6kA17/nVXkfZQYAHAkEAmOHCZCVQ +9CCYTJICvoZR2euUYdnatLN8d2/ARWjzcRDTdS82P2oscATwAsvJxsphDmbOmVWP +Hfy1t8OOCHKYAQ== +-----END PRIVATE KEY----- diff --git a/mysql-test/std_data/vcol_autoinc.MYD b/mysql-test/std_data/vcol_autoinc.MYD new file mode 100644 index 00000000000..e69de29bb2d diff --git a/mysql-test/std_data/vcol_autoinc.MYI b/mysql-test/std_data/vcol_autoinc.MYI new file mode 100644 index 00000000000..ddb3f2e0748 Binary files /dev/null and b/mysql-test/std_data/vcol_autoinc.MYI differ diff --git a/mysql-test/std_data/vcol_autoinc.frm b/mysql-test/std_data/vcol_autoinc.frm new file mode 100644 index 00000000000..bff7983735c Binary files /dev/null and b/mysql-test/std_data/vcol_autoinc.frm differ diff --git a/mysql-test/suite.pm b/mysql-test/suite.pm index f501e610e53..a662a600afe 100644 --- a/mysql-test/suite.pm +++ b/mysql-test/suite.pm @@ -68,6 +68,10 @@ sub skip_combinations { unless $::mysqld_variables{'version-ssl-library'} =~ /OpenSSL (\S+)/ and $1 ge "1.0.1d"; + $skip{'t/ssl_7937.combinations'} = [ 'x509v3' ] + unless $::mysqld_variables{'version-ssl-library'} =~ /OpenSSL (\S+)/ + and $1 ge "1.0.2"; + %skip; } diff --git a/mysql-test/suite/archive/archive_gis.result b/mysql-test/suite/archive/archive_gis.result index 6ee50fd3b85..80c1e347764 100644 --- a/mysql-test/suite/archive/archive_gis.result +++ b/mysql-test/suite/archive/archive_gis.result @@ -326,8 +326,8 @@ fid IsClosed(g) 116 0 SELECT fid, AsText(Centroid(g)) FROM gis_multi_polygon ORDER by fid; fid AsText(Centroid(g)) -117 POINT(55.58852775304245 17.426536064113982) -118 POINT(55.58852775304245 17.426536064113982) +117 POINT(57.98031067576927 17.854754130800433) +118 POINT(57.98031067576927 17.854754130800433) 119 POINT(2 2) SELECT fid, Area(g) FROM gis_multi_polygon ORDER by fid; fid Area(g) diff --git a/mysql-test/suite/archive/partition_archive.result b/mysql-test/suite/archive/partition_archive.result index 1ed979f2c92..a2e0fe7420f 100644 --- a/mysql-test/suite/archive/partition_archive.result +++ b/mysql-test/suite/archive/partition_archive.result @@ -84,7 +84,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=ARCHIVE DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) + PARTITION BY HASH (`a`) drop table t1; CREATE TABLE t1(id MEDIUMINT NOT NULL AUTO_INCREMENT, f1 VARCHAR(25), @@ -109,20 +109,20 @@ t1 CREATE TABLE `t1` ( `f1` varchar(25) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=ARCHIVE AUTO_INCREMENT=101 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (id) -SUBPARTITION BY HASH (id) + PARTITION BY RANGE (`id`) +SUBPARTITION BY HASH (`id`) SUBPARTITIONS 2 -(PARTITION pa1 VALUES LESS THAN (10) ENGINE = ARCHIVE, - PARTITION pa2 VALUES LESS THAN (20) ENGINE = ARCHIVE, - PARTITION pa3 VALUES LESS THAN (30) ENGINE = ARCHIVE, - PARTITION pa4 VALUES LESS THAN (40) ENGINE = ARCHIVE, - PARTITION pa5 VALUES LESS THAN (50) ENGINE = ARCHIVE, - PARTITION pa6 VALUES LESS THAN (60) ENGINE = ARCHIVE, - PARTITION pa7 VALUES LESS THAN (70) ENGINE = ARCHIVE, - PARTITION pa8 VALUES LESS THAN (80) ENGINE = ARCHIVE, - PARTITION pa9 VALUES LESS THAN (90) ENGINE = ARCHIVE, - PARTITION pa10 VALUES LESS THAN (100) ENGINE = ARCHIVE, - PARTITION pa11 VALUES LESS THAN MAXVALUE ENGINE = ARCHIVE) +(PARTITION `pa1` VALUES LESS THAN (10) ENGINE = ARCHIVE, + PARTITION `pa2` VALUES LESS THAN (20) ENGINE = ARCHIVE, + PARTITION `pa3` VALUES LESS THAN (30) ENGINE = ARCHIVE, + PARTITION `pa4` VALUES LESS THAN (40) ENGINE = ARCHIVE, + PARTITION `pa5` VALUES LESS THAN (50) ENGINE = ARCHIVE, + PARTITION `pa6` VALUES LESS THAN (60) ENGINE = ARCHIVE, + PARTITION `pa7` VALUES LESS THAN (70) ENGINE = ARCHIVE, + PARTITION `pa8` VALUES LESS THAN (80) ENGINE = ARCHIVE, + PARTITION `pa9` VALUES LESS THAN (90) ENGINE = ARCHIVE, + PARTITION `pa10` VALUES LESS THAN (100) ENGINE = ARCHIVE, + PARTITION `pa11` VALUES LESS THAN MAXVALUE ENGINE = ARCHIVE) select count(*) from t1; count(*) 100 @@ -138,7 +138,7 @@ t1 CREATE TABLE `t1` ( `fld1` int(11) NOT NULL, PRIMARY KEY (`fld1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (fld1) + PARTITION BY HASH (`fld1`) PARTITIONS 5 ALTER TABLE t1 ENGINE= ARCHIVE; ERROR HY000: Can't create table `test`.`#sql-temporary` (errno: 140 "Wrong create options") @@ -149,7 +149,7 @@ t1 CREATE TABLE `t1` ( `fld1` int(11) NOT NULL, PRIMARY KEY (`fld1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (fld1) + PARTITION BY HASH (`fld1`) PARTITIONS 5 #Cleanup. DROP TABLE t1; diff --git a/mysql-test/suite/binlog/r/binlog_innodb.result b/mysql-test/suite/binlog/r/binlog_innodb.result index 2896706d407..233dda00075 100644 --- a/mysql-test/suite/binlog/r/binlog_innodb.result +++ b/mysql-test/suite/binlog/r/binlog_innodb.result @@ -176,4 +176,14 @@ ERROR 23000: Duplicate entry '4' for key 'PRIMARY' # There must be no UPDATE query event; include/show_binlog_events.inc drop table t1, t2; +*** MDEV-11937: InnoDB flushes redo log too often *** +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; +SET @old_flush = @@GLOBAL.innodb_flush_log_at_trx_commit; +SET GLOBAL innodb_flush_log_at_trx_commit=1; +SELECT IF(@num_sync < 100*1.5, "OK", +CONCAT("ERROR: More than 1 fsync per commit (saw ", @num_sync/100, ")")) AS status; +status +OK +DROP TABLE t1; +SET GLOBAL innodb_flush_log_at_trx_commit=@old_flush; End of tests diff --git a/mysql-test/suite/binlog/r/binlog_parallel_replication_marks_row.result b/mysql-test/suite/binlog/r/binlog_parallel_replication_marks_row.result new file mode 100644 index 00000000000..d63538e5318 --- /dev/null +++ b/mysql-test/suite/binlog/r/binlog_parallel_replication_marks_row.result @@ -0,0 +1,110 @@ +RESET MASTER; +CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +/* GTID */ INSERT INTO t1 VALUES (1,0); +/* GTID */ BEGIN; +/* GTID */ INSERT INTO t1 VALUES (2,0); +/* GTID */ ALTER TABLE t1 ADD c INT; +/* GTID */ INSERT INTO t1 VALUES (3,0,0); +/* GTID */ COMMIT; +/* GTID */ BEGIN; +/* GTID */ UPDATE t1 SET b=1, c=1 WHERE a=2; +/* GTID */ CREATE TEMPORARY TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +/* GTID */ INSERT INTO t2 VALUES (4,10), (5,20); +/* GTID */ INSERT INTO t1 SELECT a, 2, b FROM t2; +/* GTID */ DROP TEMPORARY TABLE t2; +/* GTID */ INSERT INTO t1 VALUES (6, 3, 0); +/* GTID */ COMMIT; +/* GTID */ CREATE TEMPORARY TABLE t3 (a INT PRIMARY KEY) ENGINE=InnoDB; +/* GTID */ BEGIN; +/* GTID */ DELETE FROM t1 WHERE a=5; +/* GTID */ INSERT INTO t3 VALUES (7); +/* GTID */ INSERT INTO t1 SELECT a, 4, 0 FROM t3; +/* GTID */ UPDATE t1 SET c=1 WHERE a=7; +/* GTID */ DROP TEMPORARY TABLE t3; +/* GTID */ COMMIT; +/* GTID */ CREATE TEMPORARY TABLE t4 (a INT PRIMARY KEY) ENGINE=InnoDB; +/* GTID */ BEGIN; +/* GTID */ INSERT INTO t1 VALUES (8, 5, 0); +/* GTID */ ALTER TABLE t4 ADD b INT; +/* GTID */ INSERT INTO t1 VALUES (9, 5, 1); +/* GTID */ COMMIT; +connect tmp_con,localhost,root,,; +/* GTID */ INSERT INTO t1 VALUES (10, 6, 0); +/* GTID */ BEGIN; +/* GTID */ CREATE TEMPORARY TABLE t5 (a INT PRIMARY KEY) ENGINE=InnoDB; +/* GTID */ INSERT INTO t1 VALUES (11, 7, 0); +/* GTID */ COMMIT; +disconnect tmp_con; +connection default; +FLUSH LOGS; +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans +BEGIN +#Q> /* GTID */ INSERT INTO t1 VALUES (1,0) +# server id 1 end_log_pos # CRC32 0x######## Table_map: `test`.`t1` mapped to number # +# server id 1 end_log_pos # CRC32 0x######## Write_rows: table id # flags: STMT_END_F +COMMIT/*!*/; +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans +BEGIN +#Q> /* GTID */ INSERT INTO t1 VALUES (2,0) +# server id 1 end_log_pos # CRC32 0x######## Table_map: `test`.`t1` mapped to number # +# server id 1 end_log_pos # CRC32 0x######## Write_rows: table id # flags: STMT_END_F +COMMIT/*!*/; +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# ddl +/* GTID */ ALTER TABLE t1 ADD c INT +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans +BEGIN +#Q> /* GTID */ INSERT INTO t1 VALUES (3,0,0) +# server id 1 end_log_pos # CRC32 0x######## Table_map: `test`.`t1` mapped to number # +# server id 1 end_log_pos # CRC32 0x######## Write_rows: table id # flags: STMT_END_F +COMMIT/*!*/; +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans +BEGIN +#Q> /* GTID */ UPDATE t1 SET b=1, c=1 WHERE a=2 +# server id 1 end_log_pos # CRC32 0x######## Table_map: `test`.`t1` mapped to number # +# server id 1 end_log_pos # CRC32 0x######## Update_rows: table id # flags: STMT_END_F +#Q> /* GTID */ INSERT INTO t1 SELECT a, 2, b FROM t2 +# server id 1 end_log_pos # CRC32 0x######## Table_map: `test`.`t1` mapped to number # +# server id 1 end_log_pos # CRC32 0x######## Write_rows: table id # flags: STMT_END_F +#Q> /* GTID */ INSERT INTO t1 VALUES (6, 3, 0) +# server id 1 end_log_pos # CRC32 0x######## Table_map: `test`.`t1` mapped to number # +# server id 1 end_log_pos # CRC32 0x######## Write_rows: table id # flags: STMT_END_F +COMMIT/*!*/; +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans +BEGIN +#Q> /* GTID */ DELETE FROM t1 WHERE a=5 +# server id 1 end_log_pos # CRC32 0x######## Table_map: `test`.`t1` mapped to number # +# server id 1 end_log_pos # CRC32 0x######## Delete_rows: table id # flags: STMT_END_F +#Q> /* GTID */ INSERT INTO t1 SELECT a, 4, 0 FROM t3 +# server id 1 end_log_pos # CRC32 0x######## Table_map: `test`.`t1` mapped to number # +# server id 1 end_log_pos # CRC32 0x######## Write_rows: table id # flags: STMT_END_F +#Q> /* GTID */ UPDATE t1 SET c=1 WHERE a=7 +# server id 1 end_log_pos # CRC32 0x######## Table_map: `test`.`t1` mapped to number # +# server id 1 end_log_pos # CRC32 0x######## Update_rows: table id # flags: STMT_END_F +COMMIT/*!*/; +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans +BEGIN +#Q> /* GTID */ INSERT INTO t1 VALUES (8, 5, 0) +# server id 1 end_log_pos # CRC32 0x######## Table_map: `test`.`t1` mapped to number # +# server id 1 end_log_pos # CRC32 0x######## Write_rows: table id # flags: STMT_END_F +COMMIT/*!*/; +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans +BEGIN +#Q> /* GTID */ INSERT INTO t1 VALUES (9, 5, 1) +# server id 1 end_log_pos # CRC32 0x######## Table_map: `test`.`t1` mapped to number # +# server id 1 end_log_pos # CRC32 0x######## Write_rows: table id # flags: STMT_END_F +COMMIT/*!*/; +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans +BEGIN +#Q> /* GTID */ INSERT INTO t1 VALUES (10, 6, 0) +# server id 1 end_log_pos # CRC32 0x######## Table_map: `test`.`t1` mapped to number # +# server id 1 end_log_pos # CRC32 0x######## Write_rows: table id # flags: STMT_END_F +COMMIT/*!*/; +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans +BEGIN +#Q> /* GTID */ INSERT INTO t1 VALUES (11, 7, 0) +# server id 1 end_log_pos # CRC32 0x######## Table_map: `test`.`t1` mapped to number # +# server id 1 end_log_pos # CRC32 0x######## Write_rows: table id # flags: STMT_END_F +COMMIT/*!*/; +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# ddl +DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `t5` +DROP TABLE t1; diff --git a/mysql-test/suite/binlog/r/binlog_parallel_replication_marks_stm_mix.result b/mysql-test/suite/binlog/r/binlog_parallel_replication_marks_stm_mix.result new file mode 100644 index 00000000000..c56dff9c8a0 --- /dev/null +++ b/mysql-test/suite/binlog/r/binlog_parallel_replication_marks_stm_mix.result @@ -0,0 +1,96 @@ +RESET MASTER; +CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +/* GTID */ INSERT INTO t1 VALUES (1,0); +/* GTID */ BEGIN; +/* GTID */ INSERT INTO t1 VALUES (2,0); +/* GTID */ ALTER TABLE t1 ADD c INT; +/* GTID */ INSERT INTO t1 VALUES (3,0,0); +/* GTID */ COMMIT; +/* GTID */ BEGIN; +/* GTID */ UPDATE t1 SET b=1, c=1 WHERE a=2; +/* GTID */ CREATE TEMPORARY TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +/* GTID */ INSERT INTO t2 VALUES (4,10), (5,20); +/* GTID */ INSERT INTO t1 SELECT a, 2, b FROM t2; +/* GTID */ DROP TEMPORARY TABLE t2; +/* GTID */ INSERT INTO t1 VALUES (6, 3, 0); +/* GTID */ COMMIT; +/* GTID */ CREATE TEMPORARY TABLE t3 (a INT PRIMARY KEY) ENGINE=InnoDB; +/* GTID */ BEGIN; +/* GTID */ DELETE FROM t1 WHERE a=5; +/* GTID */ INSERT INTO t3 VALUES (7); +/* GTID */ INSERT INTO t1 SELECT a, 4, 0 FROM t3; +/* GTID */ UPDATE t1 SET c=1 WHERE a=7; +/* GTID */ DROP TEMPORARY TABLE t3; +/* GTID */ COMMIT; +/* GTID */ CREATE TEMPORARY TABLE t4 (a INT PRIMARY KEY) ENGINE=InnoDB; +/* GTID */ BEGIN; +/* GTID */ INSERT INTO t1 VALUES (8, 5, 0); +/* GTID */ ALTER TABLE t4 ADD b INT; +/* GTID */ INSERT INTO t1 VALUES (9, 5, 1); +/* GTID */ COMMIT; +connect tmp_con,localhost,root,,; +/* GTID */ INSERT INTO t1 VALUES (10, 6, 0); +/* GTID */ BEGIN; +/* GTID */ CREATE TEMPORARY TABLE t5 (a INT PRIMARY KEY) ENGINE=InnoDB; +/* GTID */ INSERT INTO t1 VALUES (11, 7, 0); +/* GTID */ COMMIT; +disconnect tmp_con; +connection default; +FLUSH LOGS; +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans +BEGIN +/* GTID */ INSERT INTO t1 VALUES (1,0) +COMMIT/*!*/; +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans +BEGIN +/* GTID */ INSERT INTO t1 VALUES (2,0) +COMMIT/*!*/; +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# ddl +/* GTID */ ALTER TABLE t1 ADD c INT +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans +BEGIN +/* GTID */ INSERT INTO t1 VALUES (3,0,0) +COMMIT/*!*/; +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# ddl +BEGIN +/* GTID */ UPDATE t1 SET b=1, c=1 WHERE a=2 +/* GTID */ CREATE TEMPORARY TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB +/* GTID */ INSERT INTO t2 VALUES (4,10), (5,20) +/* GTID */ INSERT INTO t1 SELECT a, 2, b FROM t2 +DROP TEMPORARY TABLE `t2` /* generated by server */ +/* GTID */ INSERT INTO t1 VALUES (6, 3, 0) +COMMIT/*!*/; +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# ddl +/* GTID */ CREATE TEMPORARY TABLE t3 (a INT PRIMARY KEY) ENGINE=InnoDB +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# ddl +BEGIN +/* GTID */ DELETE FROM t1 WHERE a=5 +/* GTID */ INSERT INTO t3 VALUES (7) +/* GTID */ INSERT INTO t1 SELECT a, 4, 0 FROM t3 +/* GTID */ UPDATE t1 SET c=1 WHERE a=7 +DROP TEMPORARY TABLE `t3` /* generated by server */ +COMMIT/*!*/; +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# ddl +/* GTID */ CREATE TEMPORARY TABLE t4 (a INT PRIMARY KEY) ENGINE=InnoDB +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans +BEGIN +/* GTID */ INSERT INTO t1 VALUES (8, 5, 0) +COMMIT/*!*/; +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# ddl +/* GTID */ ALTER TABLE t4 ADD b INT +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans +BEGIN +/* GTID */ INSERT INTO t1 VALUES (9, 5, 1) +COMMIT/*!*/; +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans +BEGIN +/* GTID */ INSERT INTO t1 VALUES (10, 6, 0) +COMMIT/*!*/; +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# ddl +BEGIN +/* GTID */ CREATE TEMPORARY TABLE t5 (a INT PRIMARY KEY) ENGINE=InnoDB +/* GTID */ INSERT INTO t1 VALUES (11, 7, 0) +COMMIT/*!*/; +# server id 1 end_log_pos # CRC32 0x######## GTID #-#-# ddl +DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `t5` +DROP TABLE t1; diff --git a/mysql-test/suite/binlog/r/binlog_unsafe.result b/mysql-test/suite/binlog/r/binlog_unsafe.result index 1cde61620a6..2c8ed93b5b5 100644 --- a/mysql-test/suite/binlog/r/binlog_unsafe.result +++ b/mysql-test/suite/binlog/r/binlog_unsafe.result @@ -1,14 +1,14 @@ #### Setup tables #### -CREATE TABLE t0 (a CHAR(100)); -CREATE TABLE t1 (a CHAR(100)); -CREATE TABLE t2 (a CHAR(100)); -CREATE TABLE t3 (a CHAR(100)); -CREATE TABLE ta0 (a CHAR(100)); -CREATE TABLE ta1 (a CHAR(100)); -CREATE TABLE ta2 (a CHAR(100)); -CREATE TABLE ta3 (a CHAR(100)); +CREATE TABLE t0 (a CHAR(200)); +CREATE TABLE t1 (a CHAR(200)); +CREATE TABLE t2 (a CHAR(200)); +CREATE TABLE t3 (a CHAR(200)); +CREATE TABLE ta0 (a CHAR(200)); +CREATE TABLE ta1 (a CHAR(200)); +CREATE TABLE ta2 (a CHAR(200)); +CREATE TABLE ta3 (a CHAR(200)); CREATE TABLE autoinc_table (a INT PRIMARY KEY AUTO_INCREMENT); -CREATE TABLE data_table (a CHAR(100)); +CREATE TABLE data_table (a CHAR(200)); INSERT INTO data_table VALUES ('foo'); CREATE TABLE trigger_table_1 (a INT); CREATE TABLE trigger_table_2 (a INT); @@ -2392,7 +2392,7 @@ Note 1592 Unsafe statement written to the binary log using statement format sinc DROP PROCEDURE p1; DROP TABLE t1; DROP TABLE IF EXISTS t1; -CREATE TABLE t1 (a VARCHAR(100), b VARCHAR(100)); +CREATE TABLE t1 (a VARCHAR(200), b VARCHAR(200)); INSERT INTO t1 VALUES ('a','b'); UPDATE t1 SET b = '%s%s%s%s%s%s%s%s%s%s%s%s%s%s' WHERE a = 'a' LIMIT 1; Warnings: @@ -2423,7 +2423,7 @@ CREATE FUNCTION fun_check_log_bin() RETURNS INT BEGIN SET @@SQL_LOG_BIN = 0; INSERT INTO t1 VALUES(@@global.sync_binlog); -RETURN 100; +RETURN 200; END| "One unsafe warning should be issued in the following statement" SELECT fun_check_log_bin(); diff --git a/mysql-test/suite/binlog/r/flashback.result b/mysql-test/suite/binlog/r/flashback.result index ae8b583fc7a..c96eaebe838 100644 --- a/mysql-test/suite/binlog/r/flashback.result +++ b/mysql-test/suite/binlog/r/flashback.result @@ -6,7 +6,7 @@ DROP TABLE IF EXISTS t1; # We need a fixed timestamp to avoid varying results. # SET timestamp=1000000000; -# +# < CASE 1 > # Delete all existing binary logs. # RESET MASTER; @@ -20,22 +20,22 @@ c06 char(10), c07 varchar(20), c08 TEXT ) ENGINE=InnoDB; -# +# < CASE 1 > # Insert data to t1 # INSERT INTO t1 VALUES(0,0,0,0,0,'','',''); INSERT INTO t1 VALUES(1,2,3,4,5, "abc", "abcdefg", "abcedfghijklmnopqrstuvwxyz"); INSERT INTO t1 VALUES(127, 32767, 8388607, 2147483647, 9223372036854775807, repeat('a', 10), repeat('a', 20), repeat('a', 255)); -# +# < CASE 1 > # Update t1 # UPDATE t1 SET c01=100 WHERE c02=0 OR c03=3; -# +# < CASE 1 > # Clear t1 # DELETE FROM t1; FLUSH LOGS; -# +# < CASE 1 > # Show mysqlbinlog result without -B # /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; @@ -258,7 +258,7 @@ DELIMITER ; ROLLBACK /* added by mysqlbinlog */; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; -# +# < CASE 1 > # Show mysqlbinlog result with -B # /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; @@ -426,14 +426,14 @@ DELIMITER ; ROLLBACK /* added by mysqlbinlog */; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; -# +# < CASE 1 > # Insert data to t1 # TRUNCATE TABLE t1; INSERT INTO t1 VALUES(0,0,0,0,0,'','',''); INSERT INTO t1 VALUES(1,2,3,4,5, "abc", "abcdefg", "abcedfghijklmnopqrstuvwxyz"); INSERT INTO t1 VALUES(127, 32767, 8388607, 2147483647, 9223372036854775807, repeat('a', 10), repeat('a', 20), repeat('a', 60)); -# +# < CASE 1 > # Delete all existing binary logs. # RESET MASTER; @@ -442,7 +442,7 @@ c01 c02 c03 c04 c05 c06 c07 c08 0 0 0 0 0 1 2 3 4 5 abc abcdefg abcedfghijklmnopqrstuvwxyz 127 32767 8388607 2147483647 9223372036854775807 aaaaaaaaaa aaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -# +# < CASE 1 > # Operate some data # UPDATE t1 SET c01=20; @@ -450,7 +450,7 @@ UPDATE t1 SET c02=200; UPDATE t1 SET c03=2000; DELETE FROM t1; FLUSH LOGS; -# +# < CASE 1 > # Flashback & Check the result # SELECT * FROM t1; @@ -459,7 +459,7 @@ c01 c02 c03 c04 c05 c06 c07 c08 1 2 3 4 5 abc abcdefg abcedfghijklmnopqrstuvwxyz 0 0 0 0 0 RESET MASTER; -# +# < CASE 2 > # UPDATE multi-rows in one event # BEGIN; @@ -467,7 +467,7 @@ UPDATE t1 SET c01=10 WHERE c01=0; UPDATE t1 SET c01=20 WHERE c01=10; COMMIT; FLUSH LOGS; -# +# < CASE 2 > # Flashback & Check the result # SELECT * FROM t1; @@ -476,7 +476,7 @@ c01 c02 c03 c04 c05 c06 c07 c08 1 2 3 4 5 abc abcdefg abcedfghijklmnopqrstuvwxyz 0 0 0 0 0 DROP TABLE t1; -# +# < CASE 3 > # Self-referencing foreign keys # CREATE TABLE t1 (a INT PRIMARY KEY, b INT, FOREIGN KEY my_fk(b) REFERENCES t1(a)) ENGINE=InnoDB; @@ -493,7 +493,7 @@ a b RESET MASTER; DELETE FROM t1 ORDER BY a DESC; FLUSH LOGS; -# +# < CASE 3 > # Flashback & Check the result # SELECT * FROM t1; @@ -502,9 +502,180 @@ a b 2 1 3 2 4 3 +DROP TABLE t1; +# < CASE 4 > +# Trigger +# +CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +CREATE TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +BEGIN; +INSERT INTO t1 VALUES (1, NULL); +INSERT INTO t1 VALUES (2, 1), (3, 2), (4, 3); +INSERT INTO t2 VALUES (6, 7), (7, 8), (8, 9); +COMMIT; +SELECT * FROM t1; +a b +1 NULL +2 1 +3 2 +4 3 +SELECT * FROM t2; +a b +6 7 +7 8 +8 9 +CREATE TRIGGER trg1 BEFORE INSERT ON t1 FOR EACH ROW DELETE FROM t2 WHERE a = NEW.b; +RESET MASTER; +INSERT INTO t1 VALUES (5, 6), (7, 8); +SELECT * FROM t1; +a b +1 NULL +2 1 +3 2 +4 3 +5 6 +7 8 +SELECT * FROM t2; +a b +7 8 +FLUSH LOGS; +# < CASE 4 > +# Flashback & Check the result +# +SELECT * FROM t1; +a b +1 NULL +2 1 +3 2 +4 3 +SELECT * FROM t2; +a b +6 7 +7 8 +8 9 +DROP TRIGGER trg1; +DROP TABLE t1; +DROP TABLE t2; +# < CASE 5 > +# REPLCAE Queries +# +CREATE TABLE t1 (a INT PRIMARY KEY, b INT, UNIQUE uk(b)) ENGINE=InnoDB; +BEGIN; +INSERT INTO t1 VALUES (1, NULL); +INSERT INTO t1 VALUES (2, 1), (3, 2), (4, 3); +INSERT INTO t1 VALUES (5, 4), (6, 5), (7, 6); +COMMIT; +SELECT * FROM t1; +a b +1 NULL +2 1 +3 2 +4 3 +5 4 +6 5 +7 6 +RESET MASTER; +REPLACE INTO t1 VALUES (3, 100); +REPLACE INTO t1 SET a=4, b=200; +SELECT * FROM t1; +a b +1 NULL +2 1 +5 4 +6 5 +7 6 +3 100 +4 200 +REPLACE INTO t1 VALUES (5,5); +SELECT * FROM t1; +a b +1 NULL +2 1 +5 5 +7 6 +3 100 +4 200 +FLUSH LOGS; +# < CASE 5 > +# Flashback & Check the result +# +SELECT * FROM t1; +a b +1 NULL +2 1 +3 2 +4 3 +5 4 +6 5 +7 6 +DROP TABLE t1; +# < CASE 6 > +# Test Case from MDEV-21067 +# +CREATE DATABASE world; +CREATE TABLE world.city ( +ID INT AUTO_INCREMENT PRIMARY KEY, +Name VARCHAR(64), +CountryCode VARCHAR(64), +District VARCHAR(64), +Population INT +) ENGINE=InnoDB; +CREATE TABLE test.test ( +ID INT AUTO_INCREMENT PRIMARY KEY, +REC VARCHAR(64), +ts TIMESTAMP +) ENGINE=InnoDB; +INSERT INTO world.city VALUES (NULL, 'Davenport', 'USA', 'Iowa', 100); +INSERT INTO world.city VALUES (NULL, 'Boulder', 'USA', 'Colorado', 1000); +INSERT INTO world.city VALUES (NULL, 'Gweru', 'ZWE', 'Midlands', 10000); +RESET MASTER; +CHECKSUM TABLE world.city; +Table Checksum +world.city 563256876 +INSERT INTO test.test VALUES (NULL, 'Good record 1', CURRENT_TIMESTAMP()); +INSERT INTO world.city VALUES (NULL, 'Wrong value 1', '000', 'Wrong', 0); +INSERT INTO world.city VALUES (NULL, 'Wrong value 2', '000', 'Wrong', 0) , (NULL, 'Wrong value 3', '000', 'Wrong', 0); +INSERT INTO test.test VALUES (NULL, 'Good record 2', CURRENT_TIMESTAMP()); +UPDATE world.city SET Population = 99999999 WHERE ID IN (1, 2, 3); +INSERT INTO test.test VALUES (NULL, 'Good record 3', CURRENT_TIMESTAMP()); +DELETE FROM world.city WHERE ID BETWEEN 1 AND 2; +INSERT INTO test.test VALUES (NULL, 'Good record 5', CURRENT_TIMESTAMP()); +REPLACE INTO world.city VALUES (4074, 'Wrong value 4', '000', 'Wrong', 0); +REPLACE INTO world.city VALUES (4078, 'Wrong value 5', '000', 'Wrong', 0), (NULL, 'Wrong value 6', '000', 'Wrong', 0); +INSERT INTO test.test VALUES (NULL, 'Good record 6', CURRENT_TIMESTAMP()); +INSERT INTO world.city +SELECT NULL, Name, CountryCode, District, Population FROM world.city WHERE ID BETWEEN 2 AND 10; +INSERT INTO test.test VALUES (NULL, 'Good record 7', CURRENT_TIMESTAMP()); +INSERT INTO test.test VALUES (NULL, 'Good record 8', CURRENT_TIMESTAMP()); +DELETE FROM world.city; +INSERT INTO test.test VALUES (NULL, 'Good record 9', CURRENT_TIMESTAMP()); +FLUSH LOGS; +# < CASE 6 > +# Flashback & Check the result +# +SELECT * FROM world.city; +ID Name CountryCode District Population +1 Davenport USA Iowa 100 +2 Boulder USA Colorado 1000 +3 Gweru ZWE Midlands 10000 +SELECT * FROM test.test; +ID REC ts +1 Good record 1 2001-09-09 09:46:40 +2 Good record 2 2001-09-09 09:46:40 +3 Good record 3 2001-09-09 09:46:40 +4 Good record 5 2001-09-09 09:46:40 +5 Good record 6 2001-09-09 09:46:40 +6 Good record 7 2001-09-09 09:46:40 +7 Good record 8 2001-09-09 09:46:40 +8 Good record 9 2001-09-09 09:46:40 +CHECKSUM TABLE world.city; +Table Checksum +world.city 563256876 +DROP TABLE test.test; +DROP TABLE world.city; +DROP DATABASE world; SET binlog_format=statement; Warnings: Warning 1105 MariaDB Galera and flashback do not support binlog format: STATEMENT SET GLOBAL binlog_format=statement; ERROR HY000: Flashback does not support binlog_format STATEMENT -DROP TABLE t1; diff --git a/mysql-test/suite/binlog/r/mysqladmin.result b/mysql-test/suite/binlog/r/mysqladmin.result new file mode 100644 index 00000000000..4be6c96d55b --- /dev/null +++ b/mysql-test/suite/binlog/r/mysqladmin.result @@ -0,0 +1,12 @@ +create user adm@localhost identified by 'foobar'; +grant reload on *.* to adm@localhost; +reset master; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # flush status +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # flush status +drop user adm@localhost; diff --git a/mysql-test/suite/binlog/t/binlog_innodb.test b/mysql-test/suite/binlog/t/binlog_innodb.test index 8191b72d5a9..153dcdd155a 100644 --- a/mysql-test/suite/binlog/t/binlog_innodb.test +++ b/mysql-test/suite/binlog/t/binlog_innodb.test @@ -172,4 +172,33 @@ source include/show_binlog_events.inc; # cleanup bug#27716 drop table t1, t2; +--echo *** MDEV-11937: InnoDB flushes redo log too often *** + +# Count number of log fsyncs reported by InnoDB per commit. +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; + +SET @old_flush = @@GLOBAL.innodb_flush_log_at_trx_commit; +SET GLOBAL innodb_flush_log_at_trx_commit=1; + +--let $syncs1 = query_get_value(SHOW STATUS LIKE 'Innodb_os_log_fsyncs', Value, 1) +--let $ROWS = 100 +--disable_query_log +let $count = $ROWS; +while ($count) { + eval INSERT INTO t1 VALUES ($count); + dec $count; +} +--let $syncs2 = query_get_value(SHOW STATUS LIKE 'Innodb_os_log_fsyncs', Value, 1) +eval SET @num_sync = $syncs2 - $syncs1; +--enable_query_log + +# Allow a bit of slack, in case some background process or something +# is introducing a few more syncs. +eval SELECT IF(@num_sync < $ROWS*1.5, "OK", + CONCAT("ERROR: More than 1 fsync per commit (saw ", @num_sync/$ROWS, ")")) AS status; + +DROP TABLE t1; +SET GLOBAL innodb_flush_log_at_trx_commit=@old_flush; + + --echo End of tests diff --git a/mysql-test/suite/binlog/t/binlog_parallel_replication_marks_row.test b/mysql-test/suite/binlog/t/binlog_parallel_replication_marks_row.test new file mode 100644 index 00000000000..82898486089 --- /dev/null +++ b/mysql-test/suite/binlog/t/binlog_parallel_replication_marks_row.test @@ -0,0 +1,3 @@ +--source include/have_log_bin.inc +--source include/have_binlog_format_row.inc +--source include/binlog_parallel_replication_marks.test diff --git a/mysql-test/suite/binlog/t/binlog_parallel_replication_marks_stm_mix.test b/mysql-test/suite/binlog/t/binlog_parallel_replication_marks_stm_mix.test new file mode 100644 index 00000000000..15042b3a07f --- /dev/null +++ b/mysql-test/suite/binlog/t/binlog_parallel_replication_marks_stm_mix.test @@ -0,0 +1,3 @@ +--source include/have_log_bin.inc +--source include/have_binlog_format_mixed_or_statement.inc +--source include/binlog_parallel_replication_marks.test diff --git a/mysql-test/suite/binlog/t/binlog_unsafe.test b/mysql-test/suite/binlog/t/binlog_unsafe.test index c9e92e21002..a23155e6c1d 100644 --- a/mysql-test/suite/binlog/t/binlog_unsafe.test +++ b/mysql-test/suite/binlog/t/binlog_unsafe.test @@ -106,16 +106,16 @@ call mtr.add_suppression("Unsafe statement written to the binary log using state --echo #### Setup tables #### -CREATE TABLE t0 (a CHAR(100)); -CREATE TABLE t1 (a CHAR(100)); -CREATE TABLE t2 (a CHAR(100)); -CREATE TABLE t3 (a CHAR(100)); -CREATE TABLE ta0 (a CHAR(100)); -CREATE TABLE ta1 (a CHAR(100)); -CREATE TABLE ta2 (a CHAR(100)); -CREATE TABLE ta3 (a CHAR(100)); +CREATE TABLE t0 (a CHAR(200)); +CREATE TABLE t1 (a CHAR(200)); +CREATE TABLE t2 (a CHAR(200)); +CREATE TABLE t3 (a CHAR(200)); +CREATE TABLE ta0 (a CHAR(200)); +CREATE TABLE ta1 (a CHAR(200)); +CREATE TABLE ta2 (a CHAR(200)); +CREATE TABLE ta3 (a CHAR(200)); CREATE TABLE autoinc_table (a INT PRIMARY KEY AUTO_INCREMENT); -CREATE TABLE data_table (a CHAR(100)); +CREATE TABLE data_table (a CHAR(200)); INSERT INTO data_table VALUES ('foo'); CREATE TABLE trigger_table_1 (a INT); CREATE TABLE trigger_table_2 (a INT); @@ -429,7 +429,7 @@ DROP TABLE t1; DROP TABLE IF EXISTS t1; --enable_warnings -CREATE TABLE t1 (a VARCHAR(100), b VARCHAR(100)); +CREATE TABLE t1 (a VARCHAR(200), b VARCHAR(200)); INSERT INTO t1 VALUES ('a','b'); UPDATE t1 SET b = '%s%s%s%s%s%s%s%s%s%s%s%s%s%s' WHERE a = 'a' LIMIT 1; DROP TABLE t1; @@ -467,7 +467,7 @@ CREATE FUNCTION fun_check_log_bin() RETURNS INT BEGIN SET @@SQL_LOG_BIN = 0; INSERT INTO t1 VALUES(@@global.sync_binlog); - RETURN 100; + RETURN 200; END| DELIMITER ;| --echo "One unsafe warning should be issued in the following statement" diff --git a/mysql-test/suite/binlog/t/flashback.test b/mysql-test/suite/binlog/t/flashback.test index 8ef38dbcb9f..3fc8c44c60c 100644 --- a/mysql-test/suite/binlog/t/flashback.test +++ b/mysql-test/suite/binlog/t/flashback.test @@ -13,12 +13,11 @@ DROP TABLE IF EXISTS t1; --echo # SET timestamp=1000000000; ---echo # +--echo # < CASE 1 > --echo # Delete all existing binary logs. --echo # RESET MASTER; - CREATE TABLE t1 ( c01 tinyint, c02 smallint, @@ -30,7 +29,7 @@ CREATE TABLE t1 ( c08 TEXT ) ENGINE=InnoDB; ---echo # +--echo # < CASE 1 > --echo # Insert data to t1 --echo # INSERT INTO t1 VALUES(0,0,0,0,0,'','',''); @@ -38,19 +37,19 @@ INSERT INTO t1 VALUES(1,2,3,4,5, "abc", "abcdefg", "abcedfghijklmnopqrstuvwxyz") INSERT INTO t1 VALUES(127, 32767, 8388607, 2147483647, 9223372036854775807, repeat('a', 10), repeat('a', 20), repeat('a', 255)); ---echo # +--echo # < CASE 1 > --echo # Update t1 --echo # UPDATE t1 SET c01=100 WHERE c02=0 OR c03=3; ---echo # +--echo # < CASE 1 > --echo # Clear t1 --echo # DELETE FROM t1; FLUSH LOGS; ---echo # +--echo # < CASE 1 > --echo # Show mysqlbinlog result without -B --echo # @@ -59,7 +58,7 @@ let $MYSQLD_DATADIR= `select @@datadir`; --replace_regex /SQL_LOAD_MB-[0-9]-[0-9]/SQL_LOAD_MB-#-#/ /exec_time=[0-9]*/exec_time=#/ /end_log_pos [0-9]*/end_log_pos #/ /# at [0-9]*/# at #/ /Xid = [0-9]*/Xid = #/ /thread_id=[0-9]*/thread_id=#/ /table id [0-9]*/table id #/ /mapped to number [0-9]*/mapped to number #/ /server v [^ ]*/server v #.##.##/ /CRC32 0x[0-9a-f]*/CRC32 XXX/ --exec $MYSQL_BINLOG --base64-output=decode-rows -v -v $MYSQLD_DATADIR/master-bin.000001 ---echo # +--echo # < CASE 1 > --echo # Show mysqlbinlog result with -B --echo # @@ -68,7 +67,7 @@ let $MYSQLD_DATADIR= `select @@datadir`; --replace_regex /SQL_LOAD_MB-[0-9]-[0-9]/SQL_LOAD_MB-#-#/ /exec_time=[0-9]*/exec_time=#/ /end_log_pos [0-9]*/end_log_pos #/ /# at [0-9]*/# at #/ /Xid = [0-9]*/Xid = #/ /thread_id=[0-9]*/thread_id=#/ /table id [0-9]*/table id #/ /mapped to number [0-9]*/mapped to number #/ /server v [^ ]*/server v #.##.##/ /CRC32 0x[0-9a-f]*/CRC32 XXX/ --exec $MYSQL_BINLOG -B --base64-output=decode-rows -v -v $MYSQLD_DATADIR/master-bin.000001 ---echo # +--echo # < CASE 1 > --echo # Insert data to t1 --echo # TRUNCATE TABLE t1; @@ -76,13 +75,13 @@ INSERT INTO t1 VALUES(0,0,0,0,0,'','',''); INSERT INTO t1 VALUES(1,2,3,4,5, "abc", "abcdefg", "abcedfghijklmnopqrstuvwxyz"); INSERT INTO t1 VALUES(127, 32767, 8388607, 2147483647, 9223372036854775807, repeat('a', 10), repeat('a', 20), repeat('a', 60)); ---echo # +--echo # < CASE 1 > --echo # Delete all existing binary logs. --echo # RESET MASTER; SELECT * FROM t1; ---echo # +--echo # < CASE 1 > --echo # Operate some data --echo # @@ -94,12 +93,13 @@ DELETE FROM t1; FLUSH LOGS; ---echo # +--echo # < CASE 1 > --echo # Flashback & Check the result --echo # let $MYSQLD_DATADIR= `select @@datadir`; --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--exec $MYSQL_BINLOG -vv $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_original_1.sql --exec $MYSQL_BINLOG -B -vv $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_1.sql --exec $MYSQL -e "SET binlog_format= ROW; source $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_1.sql;" @@ -107,9 +107,10 @@ SELECT * FROM t1; RESET MASTER; ---echo # +--echo # < CASE 2 > --echo # UPDATE multi-rows in one event --echo # + BEGIN; UPDATE t1 SET c01=10 WHERE c01=0; UPDATE t1 SET c01=20 WHERE c01=10; @@ -117,12 +118,13 @@ COMMIT; FLUSH LOGS; ---echo # +--echo # < CASE 2 > --echo # Flashback & Check the result --echo # let $MYSQLD_DATADIR= `select @@datadir`; --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--exec $MYSQL_BINLOG -vv $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_original_2.sql --exec $MYSQL_BINLOG -B -vv $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_2.sql --exec $MYSQL -e "SET binlog_format= ROW; source $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_2.sql;" @@ -130,9 +132,10 @@ SELECT * FROM t1; DROP TABLE t1; ---echo # +--echo # < CASE 3 > --echo # Self-referencing foreign keys --echo # + CREATE TABLE t1 (a INT PRIMARY KEY, b INT, FOREIGN KEY my_fk(b) REFERENCES t1(a)) ENGINE=InnoDB; BEGIN; @@ -149,19 +152,191 @@ DELETE FROM t1 ORDER BY a DESC; FLUSH LOGS; ---echo # +--echo # < CASE 3 > --echo # Flashback & Check the result --echo # let $MYSQLD_DATADIR= `select @@datadir`; --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--exec $MYSQL_BINLOG -vv $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_original_3.sql --exec $MYSQL_BINLOG -B -vv $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_3.sql --exec $MYSQL -e "SET binlog_format= ROW; source $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_3.sql;" SELECT * FROM t1; +DROP TABLE t1; + +--echo # < CASE 4 > +--echo # Trigger +--echo # + +CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +CREATE TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; + +BEGIN; +INSERT INTO t1 VALUES (1, NULL); +INSERT INTO t1 VALUES (2, 1), (3, 2), (4, 3); +INSERT INTO t2 VALUES (6, 7), (7, 8), (8, 9); +COMMIT; + +SELECT * FROM t1; +SELECT * FROM t2; + +CREATE TRIGGER trg1 BEFORE INSERT ON t1 FOR EACH ROW DELETE FROM t2 WHERE a = NEW.b; + +# New binlog +RESET MASTER; + +INSERT INTO t1 VALUES (5, 6), (7, 8); + +SELECT * FROM t1; +SELECT * FROM t2; + +FLUSH LOGS; + +--echo # < CASE 4 > +--echo # Flashback & Check the result +--echo # + +let $MYSQLD_DATADIR= `select @@datadir`; +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--exec $MYSQL_BINLOG -vv $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_original_4.sql +--exec $MYSQL_BINLOG -B $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_4.sql +--exec $MYSQL -e "SET binlog_format= ROW; source $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_4.sql;" + +SELECT * FROM t1; +SELECT * FROM t2; + +DROP TRIGGER trg1; +DROP TABLE t1; +DROP TABLE t2; + +--echo # < CASE 5 > +--echo # REPLCAE Queries +--echo # + +CREATE TABLE t1 (a INT PRIMARY KEY, b INT, UNIQUE uk(b)) ENGINE=InnoDB; + +BEGIN; +INSERT INTO t1 VALUES (1, NULL); +INSERT INTO t1 VALUES (2, 1), (3, 2), (4, 3); +INSERT INTO t1 VALUES (5, 4), (6, 5), (7, 6); +COMMIT; + +SELECT * FROM t1; + +# New binlog +RESET MASTER; + +REPLACE INTO t1 VALUES (3, 100); +REPLACE INTO t1 SET a=4, b=200; + +SELECT * FROM t1; + +REPLACE INTO t1 VALUES (5,5); + +SELECT * FROM t1; + +FLUSH LOGS; + +--echo # < CASE 5 > +--echo # Flashback & Check the result +--echo # + +let $MYSQLD_DATADIR= `select @@datadir`; +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--exec $MYSQL_BINLOG -vv $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_original_5.sql +--exec $MYSQL_BINLOG -B $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_5.sql +--exec $MYSQL -e "SET binlog_format= ROW; source $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_5.sql;" + +SELECT * FROM t1; + +DROP TABLE t1; + + +--echo # < CASE 6 > +--echo # Test Case from MDEV-21067 +--echo # + +# Init Structure +CREATE DATABASE world; +CREATE TABLE world.city ( + ID INT AUTO_INCREMENT PRIMARY KEY, + Name VARCHAR(64), + CountryCode VARCHAR(64), + District VARCHAR(64), + Population INT +) ENGINE=InnoDB; +CREATE TABLE test.test ( + ID INT AUTO_INCREMENT PRIMARY KEY, + REC VARCHAR(64), + ts TIMESTAMP +) ENGINE=InnoDB; + +INSERT INTO world.city VALUES (NULL, 'Davenport', 'USA', 'Iowa', 100); +INSERT INTO world.city VALUES (NULL, 'Boulder', 'USA', 'Colorado', 1000); +INSERT INTO world.city VALUES (NULL, 'Gweru', 'ZWE', 'Midlands', 10000); + +RESET MASTER; + +CHECKSUM TABLE world.city; + +# Insert test data +INSERT INTO test.test VALUES (NULL, 'Good record 1', CURRENT_TIMESTAMP()); + +INSERT INTO world.city VALUES (NULL, 'Wrong value 1', '000', 'Wrong', 0); +INSERT INTO world.city VALUES (NULL, 'Wrong value 2', '000', 'Wrong', 0) , (NULL, 'Wrong value 3', '000', 'Wrong', 0); + +INSERT INTO test.test VALUES (NULL, 'Good record 2', CURRENT_TIMESTAMP()); + +UPDATE world.city SET Population = 99999999 WHERE ID IN (1, 2, 3); + +INSERT INTO test.test VALUES (NULL, 'Good record 3', CURRENT_TIMESTAMP()); + +DELETE FROM world.city WHERE ID BETWEEN 1 AND 2; + +INSERT INTO test.test VALUES (NULL, 'Good record 5', CURRENT_TIMESTAMP()); + +REPLACE INTO world.city VALUES (4074, 'Wrong value 4', '000', 'Wrong', 0); +REPLACE INTO world.city VALUES (4078, 'Wrong value 5', '000', 'Wrong', 0), (NULL, 'Wrong value 6', '000', 'Wrong', 0); + +INSERT INTO test.test VALUES (NULL, 'Good record 6', CURRENT_TIMESTAMP()); + +INSERT INTO world.city +SELECT NULL, Name, CountryCode, District, Population FROM world.city WHERE ID BETWEEN 2 AND 10; + +INSERT INTO test.test VALUES (NULL, 'Good record 7', CURRENT_TIMESTAMP()); + +INSERT INTO test.test VALUES (NULL, 'Good record 8', CURRENT_TIMESTAMP()); + +DELETE FROM world.city; + +INSERT INTO test.test VALUES (NULL, 'Good record 9', CURRENT_TIMESTAMP()); + +FLUSH LOGS; + +--echo # < CASE 6 > +--echo # Flashback & Check the result +--echo # + +let $MYSQLD_DATADIR= `select @@datadir`; +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--exec $MYSQL_BINLOG --database=world --table=city -vv $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_original_6.sql +--exec $MYSQL_BINLOG --database=world --table=city -B $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_6.sql +--exec $MYSQL -e "SET binlog_format= ROW; source $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_6.sql;" + +SELECT * FROM world.city; + +SELECT * FROM test.test; + +CHECKSUM TABLE world.city; + +DROP TABLE test.test; +DROP TABLE world.city; +DROP DATABASE world; + +## Clear + SET binlog_format=statement; --error ER_FLASHBACK_NOT_SUPPORTED SET GLOBAL binlog_format=statement; - -DROP TABLE t1; diff --git a/mysql-test/suite/binlog/t/mysqladmin.test b/mysql-test/suite/binlog/t/mysqladmin.test new file mode 100644 index 00000000000..3c2fbc0a708 --- /dev/null +++ b/mysql-test/suite/binlog/t/mysqladmin.test @@ -0,0 +1,12 @@ +source include/have_binlog_format_statement.inc; +# +# MDEV-12612 mysqladmin --local flush... to use FLUSH LOCAL +# +create user adm@localhost identified by 'foobar'; +grant reload on *.* to adm@localhost; +reset master; +exec $MYSQLADMIN -uadm -pfoobar flush-status; +source include/show_binlog_events.inc; +exec $MYSQLADMIN --local -uadm -pfoobar flush-status; +source include/show_binlog_events.inc; +drop user adm@localhost; diff --git a/mysql-test/suite/csv/read_only.result b/mysql-test/suite/csv/read_only.result new file mode 100644 index 00000000000..d6936681f65 --- /dev/null +++ b/mysql-test/suite/csv/read_only.result @@ -0,0 +1,30 @@ +create table t1 (a int not null) engine=csv; +insert t1 values (1),(2); +flush tables; +select * from information_schema.tables where table_schema='test'; +TABLE_CATALOG def +TABLE_SCHEMA test +TABLE_NAME t1 +TABLE_TYPE BASE TABLE +ENGINE NULL +VERSION NULL +ROW_FORMAT NULL +TABLE_ROWS NULL +AVG_ROW_LENGTH NULL +DATA_LENGTH NULL +MAX_DATA_LENGTH NULL +INDEX_LENGTH NULL +DATA_FREE NULL +AUTO_INCREMENT NULL +CREATE_TIME NULL +UPDATE_TIME NULL +CHECK_TIME NULL +TABLE_COLLATION NULL +CHECKSUM NULL +CREATE_OPTIONS NULL +TABLE_COMMENT File './test/t1.CSM' not found (Errcode: 13 "Permission denied") +Warnings: +Level Warning +Code 29 +Message File './test/t1.CSM' not found (Errcode: 13 "Permission denied") +drop table t1; diff --git a/mysql-test/suite/csv/read_only.test b/mysql-test/suite/csv/read_only.test new file mode 100644 index 00000000000..2af209182d0 --- /dev/null +++ b/mysql-test/suite/csv/read_only.test @@ -0,0 +1,19 @@ +# +# MDEV-11883 MariaDB crashes with out-of-memory when query information_schema +# +source include/have_csv.inc; + +let datadir=`select @@datadir`; + +create table t1 (a int not null) engine=csv; +insert t1 values (1),(2); +flush tables; + +chmod 0400 $datadir/test/t1.CSM; +chmod 0400 $datadir/test/t1.CSV; + +--replace_result $datadir ./ +query_vertical select * from information_schema.tables where table_schema='test'; + +drop table t1; + diff --git a/mysql-test/suite/encryption/disabled.def b/mysql-test/suite/encryption/disabled.def index 8c263c6a458..abbb82d51f6 100644 --- a/mysql-test/suite/encryption/disabled.def +++ b/mysql-test/suite/encryption/disabled.def @@ -12,4 +12,4 @@ innodb_scrub : MDEV-8139 scrubbing does not work reliably innodb_scrub_background : MDEV-8139 scrubbing does not work reliably -innodb_encryption-page-compression : MDEV-11420 + diff --git a/mysql-test/suite/encryption/r/create_or_replace.result b/mysql-test/suite/encryption/r/create_or_replace.result index d52572d6d23..1671043b50d 100644 --- a/mysql-test/suite/encryption/r/create_or_replace.result +++ b/mysql-test/suite/encryption/r/create_or_replace.result @@ -1,4 +1,3 @@ -call mtr.add_suppression("InnoDB: Error: trying to do an operation on a dropped tablespace.*"); SET default_storage_engine = InnoDB; CREATE TABLE t1 (pk INT PRIMARY KEY, c VARCHAR(256)); CREATE TABLE t2 AS SELECT * FROM t1; diff --git a/mysql-test/suite/encryption/r/encrypt_and_grep.result b/mysql-test/suite/encryption/r/encrypt_and_grep.result index b1ffbdb8134..38dc11e7850 100644 --- a/mysql-test/suite/encryption/r/encrypt_and_grep.result +++ b/mysql-test/suite/encryption/r/encrypt_and_grep.result @@ -1,10 +1,13 @@ SET GLOBAL innodb_file_per_table = ON; +SET GLOBAL innodb_file_format = `Barracuda`; create table t1 (a varchar(255)) engine=innodb encrypted=yes; create table t2 (a varchar(255)) engine=innodb; +show warnings; +Level Code Message create table t3 (a varchar(255)) engine=innodb encrypted=no; -insert t1 values (repeat('foobar', 42)); -insert t2 values (repeat('temp', 42)); -insert t3 values (repeat('dummy', 42)); +insert t1 values (repeat('foobarsecret', 12)); +insert t2 values (repeat('tempsecret', 12)); +insert t3 values (repeat('dummysecret', 12)); # Wait max 10 min for key encryption threads to encrypt all spaces SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; NAME @@ -17,15 +20,14 @@ test/t1 test/t2 innodb_system # t1 yes on expecting NOT FOUND -NOT FOUND /foobar/ in t1.ibd +NOT FOUND /foobarsecret/ in t1.ibd # t2 ... on expecting NOT FOUND -NOT FOUND /temp/ in t2.ibd +NOT FOUND /tempsecret/ in t2.ibd # t3 no on expecting FOUND -FOUND 42 /dummy/ in t3.ibd +FOUND 12 /dummysecret/ in t3.ibd # ibdata1 expecting NOT FOUND -NOT FOUND /foobar/ in ibdata1 +NOT FOUND /foobarsecret/ in ibdata1 # Now turn off encryption and wait for threads to decrypt everything -SET GLOBAL innodb_encryption_threads = 1; SET GLOBAL innodb_encrypt_tables = off; # Wait max 10 min for key encryption threads to decrypt all spaces SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; @@ -39,15 +41,14 @@ SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_ NAME test/t1 # t1 yes on expecting NOT FOUND -NOT FOUND /foobar/ in t1.ibd -# t2 ... on expecting FOUND -NOT FOUND /temp/ in t2.ibd +NOT FOUND /foobarsecret/ in t1.ibd +# t2 ... default expecting FOUND +FOUND 12 /tempsecret/ in t2.ibd # t3 no on expecting FOUND -FOUND 42 /dummy/ in t3.ibd +FOUND 12 /dummysecret/ in t3.ibd # ibdata1 expecting NOT FOUND -NOT FOUND /foobar/ in ibdata1 +NOT FOUND /foobarsecret/ in ibdata1 # Now turn on encryption and wait for threads to encrypt all spaces -SET GLOBAL innodb_encryption_threads = 4; SET GLOBAL innodb_encrypt_tables = on; # Wait max 10 min for key encryption threads to encrypt all spaces SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; @@ -61,11 +62,11 @@ test/t1 test/t2 innodb_system # t1 yes on expecting NOT FOUND -NOT FOUND /foobar/ in t1.ibd +NOT FOUND /foobarsecret/ in t1.ibd # t2 ... on expecting NOT FOUND -NOT FOUND /temp/ in t2.ibd +NOT FOUND /tempsecret/ in t2.ibd # t3 no on expecting FOUND -FOUND 42 /dummy/ in t3.ibd +FOUND 12 /dummysecret/ in t3.ibd # ibdata1 expecting NOT FOUND -NOT FOUND /foobar/ in ibdata1 +NOT FOUND /foobarsecret/ in ibdata1 drop table t1, t2, t3; diff --git a/mysql-test/suite/encryption/r/encryption_force.result b/mysql-test/suite/encryption/r/encryption_force.result index 164a0067062..730a32a4b27 100644 --- a/mysql-test/suite/encryption/r/encryption_force.result +++ b/mysql-test/suite/encryption/r/encryption_force.result @@ -31,7 +31,7 @@ Table Create Table t4 CREATE TABLE `t4` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 `encrypted`=yes - PARTITION BY HASH (a) + PARTITION BY HASH (`a`) PARTITIONS 2 alter table t1 encrypted=no; ERROR HY000: Can't create table `test`.`#sql-temporary` (errno: 140 "Wrong create options") diff --git a/mysql-test/suite/encryption/r/filekeys_syntax.result b/mysql-test/suite/encryption/r/filekeys_syntax.result index 019446096b9..a7782bce17c 100644 --- a/mysql-test/suite/encryption/r/filekeys_syntax.result +++ b/mysql-test/suite/encryption/r/filekeys_syntax.result @@ -28,7 +28,7 @@ select plugin_status from information_schema.plugins where plugin_name = 'file_key_management'; plugin_status install soname 'file_key_management'; -ERROR HY000: Invalid key id at MYSQL_TMP_DIR/keys.txt line 2, column 11 +ERROR HY000: Invalid key id at MYSQL_TMP_DIR/keys.txt line 2, column 10 call mtr.add_suppression("Invalid key id"); call mtr.add_suppression("Plugin 'file_key_management' init function returned error"); call mtr.add_suppression("Plugin 'file_key_management' registration.*failed"); diff --git a/mysql-test/suite/encryption/r/innochecksum.result b/mysql-test/suite/encryption/r/innochecksum.result index 7cd7af7b93b..6ea54f3d053 100644 --- a/mysql-test/suite/encryption/r/innochecksum.result +++ b/mysql-test/suite/encryption/r/innochecksum.result @@ -1,3 +1,5 @@ +SET GLOBAL innodb_file_format = `Barracuda`; +SET GLOBAL innodb_file_per_table = ON; set global innodb_compression_algorithm = 1; # Create and populate a tables CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ENGINE=InnoDB ENCRYPTED=YES ENCRYPTION_KEY_ID=4; @@ -5,6 +7,7 @@ CREATE TABLE t2 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ENGINE=InnoDB ROW_FOR CREATE TABLE t3 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ENGINE=InnoDB ROW_FORMAT=COMPRESSED ENCRYPTED=NO; CREATE TABLE t4 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ENGINE=InnoDB PAGE_COMPRESSED=1; CREATE TABLE t5 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ENGINE=InnoDB PAGE_COMPRESSED=1 ENCRYPTED=YES ENCRYPTION_KEY_ID=4; +CREATE TABLE t6 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ENGINE=InnoDB; # Write file to make mysql-test-run.pl expect the "crash", but don't # start it until it's told to # We give 30 seconds to do a clean shutdown because we do not want @@ -16,6 +19,27 @@ CREATE TABLE t5 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ENGINE=InnoDB PAGE_CO # Run innochecksum on t3 # Run innochecksum on t4 # Run innochecksum on t4 +# Run innochecksum on t5 +# Run innochecksum on t6 +# Backup tables before corrupting +# Corrupt FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION +# Run innochecksum on t2 +# Run innochecksum on t3 +# no encryption corrupting the field should not have effect +# Run innochecksum on t6 +# no encryption corrupting the field should not have effect +# Restore the original tables +# Corrupt FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION+4 (post encryption checksum) +# Run innochecksum on t2 +# Run innochecksum on t3 +# Run innochecksum on t6 +# no encryption corrupting the field should not have effect +# Restore the original tables +# Corrupt FIL_DATA+10 (data) +# Run innochecksum on t2 +# Run innochecksum on t3 +# Run innochecksum on t6 +# Restore the original tables # Write file to make mysql-test-run.pl start up the server again # Cleanup -DROP TABLE t1, t2, t3, t4, t5; +DROP TABLE t1, t2, t3, t4, t5, t6; diff --git a/mysql-test/suite/encryption/r/innodb-bad-key-change.result b/mysql-test/suite/encryption/r/innodb-bad-key-change.result index 798057e3fb5..2e87b85489e 100644 --- a/mysql-test/suite/encryption/r/innodb-bad-key-change.result +++ b/mysql-test/suite/encryption/r/innodb-bad-key-change.result @@ -1,9 +1,9 @@ call mtr.add_suppression("Plugin 'file_key_management' init function returned error"); call mtr.add_suppression("Plugin 'file_key_management' registration.*failed"); -call mtr.add_suppression("InnoDB: The page .* in file test/.* cannot be decrypted"); -call mtr.add_suppression("mysqld: File .* not found"); - +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[12]\\.ibd' cannot be decrypted\\."); +call mtr.add_suppression("File '.*mysql-test.std_data.keysbad3\\.txt' not found"); # Start server with keys2.txt +SET GLOBAL innodb_file_per_table = ON; CREATE TABLE t1 (c VARCHAR(8)) ENGINE=InnoDB ENCRYPTED=YES ENCRYPTION_KEY_ID=2; INSERT INTO t1 VALUES ('foobar'); ALTER TABLE t1 ADD COLUMN c2 INT; @@ -29,15 +29,13 @@ ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be SHOW WARNINGS; Level Code Message Warning 192 Table test/t1 in tablespace is encrypted but encryption service or used key_id is not available. Can't continue reading table. -Warning 192 Table test/t1 is encrypted but encryption service or used key_id 2 is not available. Can't continue reading table. +Warning 192 Table t1 in file ./test/t1.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB DROP TABLE t1; -Warnings: -Warning 192 Table in tablespace encrypted.However key management plugin or used key_id 1 is not found or used encryption algorithm or method does not match. Can't continue opening the table. SHOW WARNINGS; Level Code Message -Warning 192 Table in tablespace encrypted.However key management plugin or used key_id 1 is not found or used encryption algorithm or method does not match. Can't continue opening the table. -# Start server with keys.txt +# Start server with keys3.txt +SET GLOBAL innodb_default_encryption_key_id=5; CREATE TABLE t2 (c VARCHAR(8), id int not null primary key, b int, key(b)) ENGINE=InnoDB ENCRYPTED=YES; INSERT INTO t2 VALUES ('foobar',1,2); @@ -47,69 +45,60 @@ ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be SHOW WARNINGS; Level Code Message Warning 192 Table test/t2 in tablespace is encrypted but encryption service or used key_id is not available. Can't continue reading table. -Warning 192 Table test/t2 is encrypted but encryption service or used key_id is not available. Can't continue reading table. +Warning 192 Table t2 in file ./test/t2.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB SELECT * FROM t2 where id = 1; ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB SHOW WARNINGS; Level Code Message -Warning 1812 Tablespace is missing for table 'test/t2' -Warning 192 Table test/t2 is encrypted but encryption service or used key_id is not available. Can't continue reading table. +Warning 192 Table t2 in file ./test/t2.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB SELECT * FROM t2 where b = 1; ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB SHOW WARNINGS; Level Code Message -Warning 1812 Tablespace is missing for table 'test/t2' -Warning 192 Table test/t2 is encrypted but encryption service or used key_id is not available. Can't continue reading table. +Warning 192 Table t2 in file ./test/t2.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB INSERT INTO t2 VALUES ('tmp',3,3); ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB SHOW WARNINGS; Level Code Message -Warning 1812 Tablespace is missing for table 'test/t2' -Warning 192 Table test/t2 is encrypted but encryption service or used key_id is not available. Can't continue reading table. +Warning 192 Table t2 in file ./test/t2.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB DELETE FROM t2 where b = 3; ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB SHOW WARNINGS; Level Code Message -Warning 1812 Tablespace is missing for table 'test/t2' -Warning 192 Table test/t2 is encrypted but encryption service or used key_id is not available. Can't continue reading table. +Warning 192 Table t2 in file ./test/t2.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB DELETE FROM t2 where id = 3; ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB SHOW WARNINGS; Level Code Message -Warning 1812 Tablespace is missing for table 'test/t2' -Warning 192 Table test/t2 is encrypted but encryption service or used key_id is not available. Can't continue reading table. +Warning 192 Table t2 in file ./test/t2.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB UPDATE t2 set b = b +1; ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB SHOW WARNINGS; Level Code Message -Warning 1812 Tablespace is missing for table 'test/t2' -Warning 192 Table test/t2 is encrypted but encryption service or used key_id is not available. Can't continue reading table. +Warning 192 Table t2 in file ./test/t2.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB OPTIMIZE TABLE t2; Table Op Msg_type Msg_text -test.t2 optimize Warning Tablespace is missing for table 'test/t2' -test.t2 optimize Warning Table test/t2 is encrypted but encryption service or used key_id is not available. Can't continue reading table. +test.t2 optimize Warning Table t2 in file ./test/t2.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. test.t2 optimize Error Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB test.t2 optimize error Corrupt SHOW WARNINGS; Level Code Message -ALTER TABLE t2 ADD COLUMN c INT; +ALTER TABLE t2 ADD COLUMN d INT; ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB SHOW WARNINGS; Level Code Message -Warning 1812 Tablespace is missing for table 'test/t2' -Warning 192 Table test/t2 is encrypted but encryption service or used key_id is not available. Can't continue reading table. +Warning 192 Table t2 in file ./test/t2.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB ANALYZE TABLE t2; Table Op Msg_type Msg_text -test.t2 analyze Warning Tablespace is missing for table 'test/t2' -test.t2 analyze Warning Table test/t2 is encrypted but encryption service or used key_id is not available. Can't continue reading table. +test.t2 analyze Warning Table t2 in file ./test/t2.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. test.t2 analyze Error Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB test.t2 analyze error Corrupt SHOW WARNINGS; @@ -118,16 +107,8 @@ TRUNCATE TABLE t2; ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB SHOW WARNINGS; Level Code Message -Warning 1812 Tablespace is missing for table 'test/t2' -Warning 192 Table test/t2 is encrypted but encryption service or used key_id is not available. Can't continue reading table. +Warning 192 Table t2 in file ./test/t2.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB DROP TABLE t2; -ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB -SHOW WARNINGS; -Level Code Message -Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB -# Restart server with keys.txt -DROP TABLE t2; -SHOW WARNINGS; -Level Code Message +# Start server with keys2.txt diff --git a/mysql-test/suite/encryption/r/innodb-bad-key-change2.result b/mysql-test/suite/encryption/r/innodb-bad-key-change2.result index adf984b9708..b1f91c0d095 100644 --- a/mysql-test/suite/encryption/r/innodb-bad-key-change2.result +++ b/mysql-test/suite/encryption/r/innodb-bad-key-change2.result @@ -1,23 +1,56 @@ -call mtr.add_suppression("InnoDB: The page .* in file test/t1 cannot be decrypted"); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t1(new)?\\.ibd' cannot be decrypted\\."); call mtr.add_suppression("Couldn't load plugins from 'file_key_management"); -CREATE TABLE t1 (pk INT PRIMARY KEY, f VARCHAR(8)) ENGINE=InnoDB ENCRYPTION_KEY_ID=4; +call mtr.add_suppression("InnoDB: Tablespace for table \`test\`.\`t1\` is set as discarded\\."); +SET GLOBAL innodb_file_per_table = ON; +CREATE TABLE t1 (pk INT PRIMARY KEY, f VARCHAR(8)) ENGINE=InnoDB +ENCRYPTED=YES ENCRYPTION_KEY_ID=4; INSERT INTO t1 VALUES (1,'foo'),(2,'bar'); -select * from t1; +SELECT * FROM t1; ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB -show warnings; +SHOW WARNINGS; Level Code Message -Warning 192 Table test/t1 is encrypted but encryption service or used key_id is not available. Can't continue reading table. -Warning 192 Table test/t1 is encrypted but encryption service or used key_id is not available. Can't continue reading table. +Warning 192 Table test/t1 in tablespace is encrypted but encryption service or used key_id is not available. Can't continue reading table. +Warning 192 Table t1 in file ./test/t1.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB -alter table t1 discard tablespace; +ALTER TABLE t1 ENGINE=InnoDB; ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB -show warnings; +SHOW WARNINGS; Level Code Message +Warning 192 Table t1 in file ./test/t1.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB -alter table t1 engine=InnoDB; +OPTIMIZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 optimize Warning Table t1 in file ./test/t1.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. +test.t1 optimize Error Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB +test.t1 optimize error Corrupt +SHOW WARNINGS; +Level Code Message +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check Warning Table t1 in file ./test/t1.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. +test.t1 check Error Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB +test.t1 check error Corrupt +SHOW WARNINGS; +Level Code Message +FLUSH TABLES t1 FOR EXPORT; +backup: t1 +UNLOCK TABLES; +ALTER TABLE t1 DISCARD TABLESPACE; +Warnings: +Warning 192 Table test/t1 in tablespace is encrypted but encryption service or used key_id is not available. Can't continue reading table. +Warning 1812 Tablespace is missing for table 'test/t1' +restore: t1 .ibd and .cfg files +ALTER TABLE t1 IMPORT TABLESPACE; +Warnings: +Warning 1814 Tablespace has been discarded for table `t1` +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `pk` int(11) NOT NULL, + `f` varchar(8) DEFAULT NULL, + PRIMARY KEY (`pk`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 `ENCRYPTED`=YES `ENCRYPTION_KEY_ID`=4 +RENAME TABLE t1 TO t1new; +ALTER TABLE t1new RENAME TO t2new; ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB -show warnings; -Level Code Message -Warning 192 Table test/t1 is encrypted but encryption service or used key_id is not available. Can't continue reading table. -Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB -DROP TABLE t1; +DROP TABLE t1new; diff --git a/mysql-test/suite/encryption/r/innodb-bad-key-change4.result b/mysql-test/suite/encryption/r/innodb-bad-key-change4.result index 69f11d8745b..7f4b1fbc151 100644 --- a/mysql-test/suite/encryption/r/innodb-bad-key-change4.result +++ b/mysql-test/suite/encryption/r/innodb-bad-key-change4.result @@ -1,11 +1,21 @@ -call mtr.add_suppression("InnoDB: The page .* in file test/t1 cannot be decrypted"); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t1\\.ibd' cannot be decrypted\\."); call mtr.add_suppression("Couldn't load plugins from 'file_key_management"); -CREATE TABLE t1 (pk INT PRIMARY KEY, f VARCHAR(8)) ENGINE=InnoDB ENCRYPTION_KEY_ID=4; +SET GLOBAL innodb_file_per_table = ON; +CREATE TABLE t1 (pk INT PRIMARY KEY, f VARCHAR(8)) ENGINE=InnoDB +ENCRYPTED=YES ENCRYPTION_KEY_ID=4; INSERT INTO t1 VALUES (1,'foo'),(2,'bar'); +OPTIMIZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 optimize Warning Table test/t1 in tablespace is encrypted but encryption service or used key_id is not available. Can't continue reading table. +test.t1 optimize Warning Table t1 in file ./test/t1.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. +test.t1 optimize Error Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB +test.t1 optimize error Corrupt +SHOW WARNINGS; +Level Code Message CHECK TABLE t1; Table Op Msg_type Msg_text -test.t1 check Warning Table test/t1 in tablespace # is encrypted but encryption service or used key_id is not available. Can't continue reading table. -test.t1 check Warning Table test/t1 is encrypted but encryption service or used key_id is not available. Can't continue checking table. +test.t1 check Warning Table t1 in file ./test/t1.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. +test.t1 check Error Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB test.t1 check error Corrupt SHOW WARNINGS; Level Code Message diff --git a/mysql-test/suite/encryption/r/innodb-bad-key-change5.result b/mysql-test/suite/encryption/r/innodb-bad-key-change5.result deleted file mode 100644 index 13b74f3b23d..00000000000 --- a/mysql-test/suite/encryption/r/innodb-bad-key-change5.result +++ /dev/null @@ -1,20 +0,0 @@ -call mtr.add_suppression("InnoDB: The page .* in file test/t1 cannot be decrypted"); -call mtr.add_suppression("Couldn't load plugins from 'file_key_management"); -CREATE TABLE t1 (pk INT PRIMARY KEY, f VARCHAR(8)) ENGINE=InnoDB ENCRYPTION_KEY_ID=4; -INSERT INTO t1 VALUES (1,'foo'),(2,'bar'); -OPTIMIZE TABLE t1; -Table Op Msg_type Msg_text -test.t1 optimize Warning Table test/t1 is encrypted but encryption service or used key_id is not available. Can't continue checking table. -test.t1 optimize Warning InnoDB: Cannot defragment table test/t1: returned error code 192 - -test.t1 optimize note Table does not support optimize, doing recreate + analyze instead -test.t1 optimize error Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB -test.t1 optimize status Operation failed -Warnings: -Warning 192 Table test/t1 is encrypted but encryption service or used key_id is not available. Can't continue reading table. -Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB -SHOW WARNINGS; -Level Code Message -Warning 192 Table test/t1 is encrypted but encryption service or used key_id is not available. Can't continue reading table. -Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB -DROP TABLE t1; diff --git a/mysql-test/suite/encryption/r/innodb-bad-key-shutdown.result b/mysql-test/suite/encryption/r/innodb-bad-key-shutdown.result deleted file mode 100644 index 447329a74da..00000000000 --- a/mysql-test/suite/encryption/r/innodb-bad-key-shutdown.result +++ /dev/null @@ -1,16 +0,0 @@ -call mtr.add_suppression("InnoDB: The page .* in file test/t1 cannot be decrypted"); -call mtr.add_suppression("Couldn't load plugins from 'file_key_management"); -# -# Restart the server with key 4 in the key file -# -CREATE TABLE t1 (i INT, KEY(i)) ENGINE=InnoDB ENCRYPTED=YES ENCRYPTION_KEY_ID=4; -INSERT INTO t1 VALUES (1); -# -# Restart the server with a different value for key 4 in the key file -# -SELECT * FROM t1; -ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB -SELECT * FROM t1; -i -1 -DROP TABLE t1; diff --git a/mysql-test/suite/encryption/r/innodb-checksum-algorithm,32k.rdiff b/mysql-test/suite/encryption/r/innodb-checksum-algorithm,32k.rdiff new file mode 100644 index 00000000000..cd66df7440b --- /dev/null +++ b/mysql-test/suite/encryption/r/innodb-checksum-algorithm,32k.rdiff @@ -0,0 +1,38 @@ +--- suite/encryption/r/innodb-checksum-algorithm.result ++++ suite/encryption/r/innodb-checksum-algorithm,32k.reject +@@ -13,9 +13,9 @@ + SET GLOBAL innodb_default_encryption_key_id=4; + SET GLOBAL innodb_checksum_algorithm=crc32; + create table tce_crc32(a serial, b blob, index(b(10))) engine=innodb +-ROW_FORMAT=COMPRESSED encrypted=yes; ++ROW_FORMAT=DYNAMIC encrypted=yes; + create table tc_crc32(a serial, b blob, index(b(10))) engine=innodb +-ROW_FORMAT=COMPRESSED encrypted=no; ++ROW_FORMAT=DYNAMIC encrypted=no; + create table te_crc32(a serial, b blob, index(b(10))) engine=innodb + encrypted=yes; + create table t_crc32(a serial, b blob, index(b(10))) engine=innodb +@@ -222,9 +222,9 @@ + t_crc32, tpe_crc32, tp_crc32; + SET GLOBAL innodb_checksum_algorithm=innodb; + create table tce_innodb(a serial, b blob, index(b(10))) engine=innodb +-ROW_FORMAT=COMPRESSED encrypted=yes; ++ROW_FORMAT=DYNAMIC encrypted=yes; + create table tc_innodb(a serial, b blob, index(b(10))) engine=innodb +-ROW_FORMAT=COMPRESSED encrypted=no; ++ROW_FORMAT=DYNAMIC encrypted=no; + create table te_innodb(a serial, b blob, index(b(10))) engine=innodb + encrypted=yes; + create table t_innodb(a serial, b blob, index(b(10))) engine=innodb +@@ -431,9 +431,9 @@ + t_innodb, tpe_innodb, tp_innodb; + SET GLOBAL innodb_checksum_algorithm=none; + create table tce_none(a serial, b blob, index(b(10))) engine=innodb +-ROW_FORMAT=COMPRESSED encrypted=yes; ++ROW_FORMAT=DYNAMIC encrypted=yes; + create table tc_none(a serial, b blob, index(b(10))) engine=innodb +-ROW_FORMAT=COMPRESSED encrypted=no; ++ROW_FORMAT=DYNAMIC encrypted=no; + create table te_none(a serial, b blob, index(b(10))) engine=innodb + encrypted=yes; + create table t_none(a serial, b blob, index(b(10))) engine=innodb diff --git a/mysql-test/suite/encryption/r/innodb-checksum-algorithm,64k.rdiff b/mysql-test/suite/encryption/r/innodb-checksum-algorithm,64k.rdiff new file mode 100644 index 00000000000..523074297da --- /dev/null +++ b/mysql-test/suite/encryption/r/innodb-checksum-algorithm,64k.rdiff @@ -0,0 +1,38 @@ +--- suite/encryption/r/innodb-checksum-algorithm.result ++++ suite/encryption/r/innodb-checksum-algorithm,64k.reject +@@ -13,9 +13,9 @@ + SET GLOBAL innodb_default_encryption_key_id=4; + SET GLOBAL innodb_checksum_algorithm=crc32; + create table tce_crc32(a serial, b blob, index(b(10))) engine=innodb +-ROW_FORMAT=COMPRESSED encrypted=yes; ++ROW_FORMAT=DYNAMIC encrypted=yes; + create table tc_crc32(a serial, b blob, index(b(10))) engine=innodb +-ROW_FORMAT=COMPRESSED encrypted=no; ++ROW_FORMAT=DYNAMIC encrypted=no; + create table te_crc32(a serial, b blob, index(b(10))) engine=innodb + encrypted=yes; + create table t_crc32(a serial, b blob, index(b(10))) engine=innodb +@@ -222,9 +222,9 @@ + t_crc32, tpe_crc32, tp_crc32; + SET GLOBAL innodb_checksum_algorithm=innodb; + create table tce_innodb(a serial, b blob, index(b(10))) engine=innodb +-ROW_FORMAT=COMPRESSED encrypted=yes; ++ROW_FORMAT=DYNAMIC encrypted=yes; + create table tc_innodb(a serial, b blob, index(b(10))) engine=innodb +-ROW_FORMAT=COMPRESSED encrypted=no; ++ROW_FORMAT=DYNAMIC encrypted=no; + create table te_innodb(a serial, b blob, index(b(10))) engine=innodb + encrypted=yes; + create table t_innodb(a serial, b blob, index(b(10))) engine=innodb +@@ -431,9 +431,9 @@ + t_innodb, tpe_innodb, tp_innodb; + SET GLOBAL innodb_checksum_algorithm=none; + create table tce_none(a serial, b blob, index(b(10))) engine=innodb +-ROW_FORMAT=COMPRESSED encrypted=yes; ++ROW_FORMAT=DYNAMIC encrypted=yes; + create table tc_none(a serial, b blob, index(b(10))) engine=innodb +-ROW_FORMAT=COMPRESSED encrypted=no; ++ROW_FORMAT=DYNAMIC encrypted=no; + create table te_none(a serial, b blob, index(b(10))) engine=innodb + encrypted=yes; + create table t_none(a serial, b blob, index(b(10))) engine=innodb diff --git a/mysql-test/suite/encryption/r/innodb-checksum-algorithm.result b/mysql-test/suite/encryption/r/innodb-checksum-algorithm.result new file mode 100644 index 00000000000..a12b47ef31d --- /dev/null +++ b/mysql-test/suite/encryption/r/innodb-checksum-algorithm.result @@ -0,0 +1,643 @@ +SET @saved_file_per_table = @@global.innodb_file_per_table; +SET @saved_checksum_algorithm = @@global.innodb_checksum_algorithm; +SET @saved_encrypt_tables = @@global.innodb_encrypt_tables; +SET @saved_encryption_threads = @@global.innodb_encryption_threads; +SET @saved_encryption_key_id = @@global.innodb_default_encryption_key_id; +SET GLOBAL innodb_file_per_table = ON; +SET GLOBAL innodb_encrypt_tables = ON; +SET GLOBAL innodb_encryption_threads = 4; +call mtr.add_suppression("InnoDB: innodb_checksum_algorithm is set to \"strict_(crc32|none|innodb)\" but the page \\[page id: space=[0-9]+, page number=[0-9]+\\] contains a valid checksum \"(innodb|none|crc32)\""); +SET GLOBAL innodb_checksum_algorithm = innodb; +SET GLOBAL innodb_default_encryption_key_id=4; +SET GLOBAL innodb_checksum_algorithm=crc32; +create table tce_crc32(a serial, b blob, index(b(10))) engine=innodb +ROW_FORMAT=COMPRESSED encrypted=yes; +create table tc_crc32(a serial, b blob, index(b(10))) engine=innodb +ROW_FORMAT=COMPRESSED encrypted=no; +create table te_crc32(a serial, b blob, index(b(10))) engine=innodb +encrypted=yes; +create table t_crc32(a serial, b blob, index(b(10))) engine=innodb +encrypted=no; +create table tpe_crc32(a serial, b blob, index(b(10))) engine=innodb +page_compressed=yes encrypted=yes; +create table tp_crc32(a serial, b blob, index(b(10))) engine=innodb +page_compressed=yes encrypted=no; +begin; +insert into tce_crc32(b) values (repeat('secret',20)); +insert into tc_crc32(b) values (repeat('secret',20)); +insert into te_crc32(b) values (repeat('secret',20)); +insert into t_crc32(b) values (repeat('secret',20)); +insert into tpe_crc32(b) values (repeat('secret',20)); +insert into tp_crc32(b) values (repeat('secret',20)); +commit; +FLUSH TABLES tce_crc32, tc_crc32, te_crc32, +t_crc32, tpe_crc32, tp_crc32 FOR EXPORT; +backup: tce_crc32 +backup: tc_crc32 +backup: te_crc32 +backup: t_crc32 +backup: tpe_crc32 +backup: tp_crc32 +t_crc32.cfg +t_crc32.frm +t_crc32.ibd +tc_crc32.cfg +tc_crc32.frm +tc_crc32.ibd +tce_crc32.cfg +tce_crc32.frm +tce_crc32.ibd +te_crc32.cfg +te_crc32.frm +te_crc32.ibd +tp_crc32.cfg +tp_crc32.frm +tp_crc32.ibd +tpe_crc32.cfg +tpe_crc32.frm +tpe_crc32.ibd +UNLOCK TABLES; +SET GLOBAL innodb_checksum_algorithm=strict_crc32; +ALTER TABLE tce_crc32 DISCARD TABLESPACE; +ALTER TABLE tc_crc32 DISCARD TABLESPACE; +ALTER TABLE te_crc32 DISCARD TABLESPACE; +ALTER TABLE t_crc32 DISCARD TABLESPACE; +ALTER TABLE tpe_crc32 DISCARD TABLESPACE; +ALTER TABLE tp_crc32 DISCARD TABLESPACE; +restore: tce_crc32 .ibd and .cfg files +restore: tc_crc32 .ibd and .cfg files +restore: te_crc32 .ibd and .cfg files +restore: t_crc32 .ibd and .cfg files +restore: tpe_crc32 .ibd and .cfg files +restore: tp_crc32 .ibd and .cfg files +ALTER TABLE tce_crc32 IMPORT TABLESPACE; +update tce_crc32 set b=substr(b,1); +ALTER TABLE tc_crc32 IMPORT TABLESPACE; +update tc_crc32 set b=substr(b,1); +ALTER TABLE te_crc32 IMPORT TABLESPACE; +update te_crc32 set b=substr(b,1); +ALTER TABLE t_crc32 IMPORT TABLESPACE; +update t_crc32 set b=substr(b,1); +ALTER TABLE tpe_crc32 IMPORT TABLESPACE; +update tpe_crc32 set b=substr(b,1); +ALTER TABLE tp_crc32 IMPORT TABLESPACE; +update tp_crc32 set b=substr(b,1); +SET GLOBAL innodb_checksum_algorithm=crc32; +ALTER TABLE tce_crc32 DISCARD TABLESPACE; +ALTER TABLE tc_crc32 DISCARD TABLESPACE; +ALTER TABLE te_crc32 DISCARD TABLESPACE; +ALTER TABLE t_crc32 DISCARD TABLESPACE; +ALTER TABLE tpe_crc32 DISCARD TABLESPACE; +ALTER TABLE tp_crc32 DISCARD TABLESPACE; +restore: tce_crc32 .ibd and .cfg files +restore: tc_crc32 .ibd and .cfg files +restore: te_crc32 .ibd and .cfg files +restore: t_crc32 .ibd and .cfg files +restore: tpe_crc32 .ibd and .cfg files +restore: tp_crc32 .ibd and .cfg files +ALTER TABLE tce_crc32 IMPORT TABLESPACE; +update tce_crc32 set b=substr(b,1); +ALTER TABLE tc_crc32 IMPORT TABLESPACE; +update tc_crc32 set b=substr(b,1); +ALTER TABLE te_crc32 IMPORT TABLESPACE; +update te_crc32 set b=substr(b,1); +ALTER TABLE t_crc32 IMPORT TABLESPACE; +update t_crc32 set b=substr(b,1); +ALTER TABLE tpe_crc32 IMPORT TABLESPACE; +update tpe_crc32 set b=substr(b,1); +ALTER TABLE tp_crc32 IMPORT TABLESPACE; +update tp_crc32 set b=substr(b,1); +SET GLOBAL innodb_checksum_algorithm=strict_innodb; +ALTER TABLE tce_crc32 DISCARD TABLESPACE; +ALTER TABLE tc_crc32 DISCARD TABLESPACE; +ALTER TABLE te_crc32 DISCARD TABLESPACE; +ALTER TABLE t_crc32 DISCARD TABLESPACE; +ALTER TABLE tpe_crc32 DISCARD TABLESPACE; +ALTER TABLE tp_crc32 DISCARD TABLESPACE; +restore: tce_crc32 .ibd and .cfg files +restore: tc_crc32 .ibd and .cfg files +restore: te_crc32 .ibd and .cfg files +restore: t_crc32 .ibd and .cfg files +restore: tpe_crc32 .ibd and .cfg files +restore: tp_crc32 .ibd and .cfg files +ALTER TABLE tce_crc32 IMPORT TABLESPACE; +update tce_crc32 set b=substr(b,1); +ALTER TABLE tc_crc32 IMPORT TABLESPACE; +update tc_crc32 set b=substr(b,1); +ALTER TABLE te_crc32 IMPORT TABLESPACE; +update te_crc32 set b=substr(b,1); +ALTER TABLE t_crc32 IMPORT TABLESPACE; +update t_crc32 set b=substr(b,1); +ALTER TABLE tpe_crc32 IMPORT TABLESPACE; +update tpe_crc32 set b=substr(b,1); +ALTER TABLE tp_crc32 IMPORT TABLESPACE; +update tp_crc32 set b=substr(b,1); +SET GLOBAL innodb_checksum_algorithm=innodb; +ALTER TABLE tce_crc32 DISCARD TABLESPACE; +ALTER TABLE tc_crc32 DISCARD TABLESPACE; +ALTER TABLE te_crc32 DISCARD TABLESPACE; +ALTER TABLE t_crc32 DISCARD TABLESPACE; +ALTER TABLE tpe_crc32 DISCARD TABLESPACE; +ALTER TABLE tp_crc32 DISCARD TABLESPACE; +restore: tce_crc32 .ibd and .cfg files +restore: tc_crc32 .ibd and .cfg files +restore: te_crc32 .ibd and .cfg files +restore: t_crc32 .ibd and .cfg files +restore: tpe_crc32 .ibd and .cfg files +restore: tp_crc32 .ibd and .cfg files +ALTER TABLE tce_crc32 IMPORT TABLESPACE; +update tce_crc32 set b=substr(b,1); +ALTER TABLE tc_crc32 IMPORT TABLESPACE; +update tc_crc32 set b=substr(b,1); +ALTER TABLE te_crc32 IMPORT TABLESPACE; +update te_crc32 set b=substr(b,1); +ALTER TABLE t_crc32 IMPORT TABLESPACE; +update t_crc32 set b=substr(b,1); +ALTER TABLE tpe_crc32 IMPORT TABLESPACE; +update tpe_crc32 set b=substr(b,1); +ALTER TABLE tp_crc32 IMPORT TABLESPACE; +update tp_crc32 set b=substr(b,1); +SET GLOBAL innodb_checksum_algorithm=strict_none; +ALTER TABLE tce_crc32 DISCARD TABLESPACE; +ALTER TABLE tc_crc32 DISCARD TABLESPACE; +ALTER TABLE te_crc32 DISCARD TABLESPACE; +ALTER TABLE t_crc32 DISCARD TABLESPACE; +ALTER TABLE tpe_crc32 DISCARD TABLESPACE; +ALTER TABLE tp_crc32 DISCARD TABLESPACE; +restore: tce_crc32 .ibd and .cfg files +restore: tc_crc32 .ibd and .cfg files +restore: te_crc32 .ibd and .cfg files +restore: t_crc32 .ibd and .cfg files +restore: tpe_crc32 .ibd and .cfg files +restore: tp_crc32 .ibd and .cfg files +ALTER TABLE tce_crc32 IMPORT TABLESPACE; +update tce_crc32 set b=substr(b,1); +ALTER TABLE tc_crc32 IMPORT TABLESPACE; +update tc_crc32 set b=substr(b,1); +ALTER TABLE te_crc32 IMPORT TABLESPACE; +update te_crc32 set b=substr(b,1); +ALTER TABLE t_crc32 IMPORT TABLESPACE; +update t_crc32 set b=substr(b,1); +ALTER TABLE tpe_crc32 IMPORT TABLESPACE; +update tpe_crc32 set b=substr(b,1); +ALTER TABLE tp_crc32 IMPORT TABLESPACE; +update tp_crc32 set b=substr(b,1); +SET GLOBAL innodb_checksum_algorithm=none; +ALTER TABLE tce_crc32 DISCARD TABLESPACE; +ALTER TABLE tc_crc32 DISCARD TABLESPACE; +ALTER TABLE te_crc32 DISCARD TABLESPACE; +ALTER TABLE t_crc32 DISCARD TABLESPACE; +ALTER TABLE tpe_crc32 DISCARD TABLESPACE; +ALTER TABLE tp_crc32 DISCARD TABLESPACE; +restore: tce_crc32 .ibd and .cfg files +restore: tc_crc32 .ibd and .cfg files +restore: te_crc32 .ibd and .cfg files +restore: t_crc32 .ibd and .cfg files +restore: tpe_crc32 .ibd and .cfg files +restore: tp_crc32 .ibd and .cfg files +ALTER TABLE tce_crc32 IMPORT TABLESPACE; +update tce_crc32 set b=substr(b,1); +ALTER TABLE tc_crc32 IMPORT TABLESPACE; +update tc_crc32 set b=substr(b,1); +ALTER TABLE te_crc32 IMPORT TABLESPACE; +update te_crc32 set b=substr(b,1); +ALTER TABLE t_crc32 IMPORT TABLESPACE; +update t_crc32 set b=substr(b,1); +ALTER TABLE tpe_crc32 IMPORT TABLESPACE; +update tpe_crc32 set b=substr(b,1); +ALTER TABLE tp_crc32 IMPORT TABLESPACE; +update tp_crc32 set b=substr(b,1); +CHECK TABLE tce_crc32, tc_crc32, te_crc32, +t_crc32, tpe_crc32, tp_crc32; +Table Op Msg_type Msg_text +test.tce_crc32 check status OK +test.tc_crc32 check status OK +test.te_crc32 check status OK +test.t_crc32 check status OK +test.tpe_crc32 check status OK +test.tp_crc32 check status OK +DROP TABLE tce_crc32, tc_crc32, te_crc32, +t_crc32, tpe_crc32, tp_crc32; +SET GLOBAL innodb_checksum_algorithm=innodb; +create table tce_innodb(a serial, b blob, index(b(10))) engine=innodb +ROW_FORMAT=COMPRESSED encrypted=yes; +create table tc_innodb(a serial, b blob, index(b(10))) engine=innodb +ROW_FORMAT=COMPRESSED encrypted=no; +create table te_innodb(a serial, b blob, index(b(10))) engine=innodb +encrypted=yes; +create table t_innodb(a serial, b blob, index(b(10))) engine=innodb +encrypted=no; +create table tpe_innodb(a serial, b blob, index(b(10))) engine=innodb +page_compressed=yes encrypted=yes; +create table tp_innodb(a serial, b blob, index(b(10))) engine=innodb +page_compressed=yes encrypted=no; +begin; +insert into tce_innodb(b) values (repeat('secret',20)); +insert into tc_innodb(b) values (repeat('secret',20)); +insert into te_innodb(b) values (repeat('secret',20)); +insert into t_innodb(b) values (repeat('secret',20)); +insert into tpe_innodb(b) values (repeat('secret',20)); +insert into tp_innodb(b) values (repeat('secret',20)); +commit; +FLUSH TABLES tce_innodb, tc_innodb, te_innodb, +t_innodb, tpe_innodb, tp_innodb FOR EXPORT; +backup: tce_innodb +backup: tc_innodb +backup: te_innodb +backup: t_innodb +backup: tpe_innodb +backup: tp_innodb +t_innodb.cfg +t_innodb.frm +t_innodb.ibd +tc_innodb.cfg +tc_innodb.frm +tc_innodb.ibd +tce_innodb.cfg +tce_innodb.frm +tce_innodb.ibd +te_innodb.cfg +te_innodb.frm +te_innodb.ibd +tp_innodb.cfg +tp_innodb.frm +tp_innodb.ibd +tpe_innodb.cfg +tpe_innodb.frm +tpe_innodb.ibd +UNLOCK TABLES; +SET GLOBAL innodb_checksum_algorithm=strict_crc32; +ALTER TABLE tce_innodb DISCARD TABLESPACE; +ALTER TABLE tc_innodb DISCARD TABLESPACE; +ALTER TABLE te_innodb DISCARD TABLESPACE; +ALTER TABLE t_innodb DISCARD TABLESPACE; +ALTER TABLE tpe_innodb DISCARD TABLESPACE; +ALTER TABLE tp_innodb DISCARD TABLESPACE; +restore: tce_innodb .ibd and .cfg files +restore: tc_innodb .ibd and .cfg files +restore: te_innodb .ibd and .cfg files +restore: t_innodb .ibd and .cfg files +restore: tpe_innodb .ibd and .cfg files +restore: tp_innodb .ibd and .cfg files +ALTER TABLE tce_innodb IMPORT TABLESPACE; +update tce_innodb set b=substr(b,1); +ALTER TABLE tc_innodb IMPORT TABLESPACE; +update tc_innodb set b=substr(b,1); +ALTER TABLE te_innodb IMPORT TABLESPACE; +update te_innodb set b=substr(b,1); +ALTER TABLE t_innodb IMPORT TABLESPACE; +update t_innodb set b=substr(b,1); +ALTER TABLE tpe_innodb IMPORT TABLESPACE; +update tpe_innodb set b=substr(b,1); +ALTER TABLE tp_innodb IMPORT TABLESPACE; +update tp_innodb set b=substr(b,1); +SET GLOBAL innodb_checksum_algorithm=crc32; +ALTER TABLE tce_innodb DISCARD TABLESPACE; +ALTER TABLE tc_innodb DISCARD TABLESPACE; +ALTER TABLE te_innodb DISCARD TABLESPACE; +ALTER TABLE t_innodb DISCARD TABLESPACE; +ALTER TABLE tpe_innodb DISCARD TABLESPACE; +ALTER TABLE tp_innodb DISCARD TABLESPACE; +restore: tce_innodb .ibd and .cfg files +restore: tc_innodb .ibd and .cfg files +restore: te_innodb .ibd and .cfg files +restore: t_innodb .ibd and .cfg files +restore: tpe_innodb .ibd and .cfg files +restore: tp_innodb .ibd and .cfg files +ALTER TABLE tce_innodb IMPORT TABLESPACE; +update tce_innodb set b=substr(b,1); +ALTER TABLE tc_innodb IMPORT TABLESPACE; +update tc_innodb set b=substr(b,1); +ALTER TABLE te_innodb IMPORT TABLESPACE; +update te_innodb set b=substr(b,1); +ALTER TABLE t_innodb IMPORT TABLESPACE; +update t_innodb set b=substr(b,1); +ALTER TABLE tpe_innodb IMPORT TABLESPACE; +update tpe_innodb set b=substr(b,1); +ALTER TABLE tp_innodb IMPORT TABLESPACE; +update tp_innodb set b=substr(b,1); +SET GLOBAL innodb_checksum_algorithm=strict_innodb; +ALTER TABLE tce_innodb DISCARD TABLESPACE; +ALTER TABLE tc_innodb DISCARD TABLESPACE; +ALTER TABLE te_innodb DISCARD TABLESPACE; +ALTER TABLE t_innodb DISCARD TABLESPACE; +ALTER TABLE tpe_innodb DISCARD TABLESPACE; +ALTER TABLE tp_innodb DISCARD TABLESPACE; +restore: tce_innodb .ibd and .cfg files +restore: tc_innodb .ibd and .cfg files +restore: te_innodb .ibd and .cfg files +restore: t_innodb .ibd and .cfg files +restore: tpe_innodb .ibd and .cfg files +restore: tp_innodb .ibd and .cfg files +ALTER TABLE tce_innodb IMPORT TABLESPACE; +update tce_innodb set b=substr(b,1); +ALTER TABLE tc_innodb IMPORT TABLESPACE; +update tc_innodb set b=substr(b,1); +ALTER TABLE te_innodb IMPORT TABLESPACE; +update te_innodb set b=substr(b,1); +ALTER TABLE t_innodb IMPORT TABLESPACE; +update t_innodb set b=substr(b,1); +ALTER TABLE tpe_innodb IMPORT TABLESPACE; +update tpe_innodb set b=substr(b,1); +ALTER TABLE tp_innodb IMPORT TABLESPACE; +update tp_innodb set b=substr(b,1); +SET GLOBAL innodb_checksum_algorithm=innodb; +ALTER TABLE tce_innodb DISCARD TABLESPACE; +ALTER TABLE tc_innodb DISCARD TABLESPACE; +ALTER TABLE te_innodb DISCARD TABLESPACE; +ALTER TABLE t_innodb DISCARD TABLESPACE; +ALTER TABLE tpe_innodb DISCARD TABLESPACE; +ALTER TABLE tp_innodb DISCARD TABLESPACE; +restore: tce_innodb .ibd and .cfg files +restore: tc_innodb .ibd and .cfg files +restore: te_innodb .ibd and .cfg files +restore: t_innodb .ibd and .cfg files +restore: tpe_innodb .ibd and .cfg files +restore: tp_innodb .ibd and .cfg files +ALTER TABLE tce_innodb IMPORT TABLESPACE; +update tce_innodb set b=substr(b,1); +ALTER TABLE tc_innodb IMPORT TABLESPACE; +update tc_innodb set b=substr(b,1); +ALTER TABLE te_innodb IMPORT TABLESPACE; +update te_innodb set b=substr(b,1); +ALTER TABLE t_innodb IMPORT TABLESPACE; +update t_innodb set b=substr(b,1); +ALTER TABLE tpe_innodb IMPORT TABLESPACE; +update tpe_innodb set b=substr(b,1); +ALTER TABLE tp_innodb IMPORT TABLESPACE; +update tp_innodb set b=substr(b,1); +SET GLOBAL innodb_checksum_algorithm=strict_none; +ALTER TABLE tce_innodb DISCARD TABLESPACE; +ALTER TABLE tc_innodb DISCARD TABLESPACE; +ALTER TABLE te_innodb DISCARD TABLESPACE; +ALTER TABLE t_innodb DISCARD TABLESPACE; +ALTER TABLE tpe_innodb DISCARD TABLESPACE; +ALTER TABLE tp_innodb DISCARD TABLESPACE; +restore: tce_innodb .ibd and .cfg files +restore: tc_innodb .ibd and .cfg files +restore: te_innodb .ibd and .cfg files +restore: t_innodb .ibd and .cfg files +restore: tpe_innodb .ibd and .cfg files +restore: tp_innodb .ibd and .cfg files +ALTER TABLE tce_innodb IMPORT TABLESPACE; +update tce_innodb set b=substr(b,1); +ALTER TABLE tc_innodb IMPORT TABLESPACE; +update tc_innodb set b=substr(b,1); +ALTER TABLE te_innodb IMPORT TABLESPACE; +update te_innodb set b=substr(b,1); +ALTER TABLE t_innodb IMPORT TABLESPACE; +update t_innodb set b=substr(b,1); +ALTER TABLE tpe_innodb IMPORT TABLESPACE; +update tpe_innodb set b=substr(b,1); +ALTER TABLE tp_innodb IMPORT TABLESPACE; +update tp_innodb set b=substr(b,1); +SET GLOBAL innodb_checksum_algorithm=none; +ALTER TABLE tce_innodb DISCARD TABLESPACE; +ALTER TABLE tc_innodb DISCARD TABLESPACE; +ALTER TABLE te_innodb DISCARD TABLESPACE; +ALTER TABLE t_innodb DISCARD TABLESPACE; +ALTER TABLE tpe_innodb DISCARD TABLESPACE; +ALTER TABLE tp_innodb DISCARD TABLESPACE; +restore: tce_innodb .ibd and .cfg files +restore: tc_innodb .ibd and .cfg files +restore: te_innodb .ibd and .cfg files +restore: t_innodb .ibd and .cfg files +restore: tpe_innodb .ibd and .cfg files +restore: tp_innodb .ibd and .cfg files +ALTER TABLE tce_innodb IMPORT TABLESPACE; +update tce_innodb set b=substr(b,1); +ALTER TABLE tc_innodb IMPORT TABLESPACE; +update tc_innodb set b=substr(b,1); +ALTER TABLE te_innodb IMPORT TABLESPACE; +update te_innodb set b=substr(b,1); +ALTER TABLE t_innodb IMPORT TABLESPACE; +update t_innodb set b=substr(b,1); +ALTER TABLE tpe_innodb IMPORT TABLESPACE; +update tpe_innodb set b=substr(b,1); +ALTER TABLE tp_innodb IMPORT TABLESPACE; +update tp_innodb set b=substr(b,1); +CHECK TABLE tce_innodb, tc_innodb, te_innodb, +t_innodb, tpe_innodb, tp_innodb; +Table Op Msg_type Msg_text +test.tce_innodb check status OK +test.tc_innodb check status OK +test.te_innodb check status OK +test.t_innodb check status OK +test.tpe_innodb check status OK +test.tp_innodb check status OK +DROP TABLE tce_innodb, tc_innodb, te_innodb, +t_innodb, tpe_innodb, tp_innodb; +SET GLOBAL innodb_checksum_algorithm=none; +create table tce_none(a serial, b blob, index(b(10))) engine=innodb +ROW_FORMAT=COMPRESSED encrypted=yes; +create table tc_none(a serial, b blob, index(b(10))) engine=innodb +ROW_FORMAT=COMPRESSED encrypted=no; +create table te_none(a serial, b blob, index(b(10))) engine=innodb +encrypted=yes; +create table t_none(a serial, b blob, index(b(10))) engine=innodb +encrypted=no; +create table tpe_none(a serial, b blob, index(b(10))) engine=innodb +page_compressed=yes encrypted=yes; +create table tp_none(a serial, b blob, index(b(10))) engine=innodb +page_compressed=yes encrypted=no; +begin; +insert into tce_none(b) values (repeat('secret',20)); +insert into tc_none(b) values (repeat('secret',20)); +insert into te_none(b) values (repeat('secret',20)); +insert into t_none(b) values (repeat('secret',20)); +insert into tpe_none(b) values (repeat('secret',20)); +insert into tp_none(b) values (repeat('secret',20)); +commit; +FLUSH TABLES tce_none, tc_none, te_none, +t_none, tpe_none, tp_none FOR EXPORT; +backup: tce_none +backup: tc_none +backup: te_none +backup: t_none +backup: tpe_none +backup: tp_none +t_none.cfg +t_none.frm +t_none.ibd +tc_none.cfg +tc_none.frm +tc_none.ibd +tce_none.cfg +tce_none.frm +tce_none.ibd +te_none.cfg +te_none.frm +te_none.ibd +tp_none.cfg +tp_none.frm +tp_none.ibd +tpe_none.cfg +tpe_none.frm +tpe_none.ibd +UNLOCK TABLES; +SET GLOBAL innodb_checksum_algorithm=strict_crc32; +ALTER TABLE tce_none DISCARD TABLESPACE; +ALTER TABLE tc_none DISCARD TABLESPACE; +ALTER TABLE te_none DISCARD TABLESPACE; +ALTER TABLE t_none DISCARD TABLESPACE; +ALTER TABLE tpe_none DISCARD TABLESPACE; +ALTER TABLE tp_none DISCARD TABLESPACE; +restore: tce_none .ibd and .cfg files +restore: tc_none .ibd and .cfg files +restore: te_none .ibd and .cfg files +restore: t_none .ibd and .cfg files +restore: tpe_none .ibd and .cfg files +restore: tp_none .ibd and .cfg files +ALTER TABLE tce_none IMPORT TABLESPACE; +update tce_none set b=substr(b,1); +ALTER TABLE tc_none IMPORT TABLESPACE; +update tc_none set b=substr(b,1); +ALTER TABLE te_none IMPORT TABLESPACE; +update te_none set b=substr(b,1); +ALTER TABLE t_none IMPORT TABLESPACE; +update t_none set b=substr(b,1); +ALTER TABLE tpe_none IMPORT TABLESPACE; +update tpe_none set b=substr(b,1); +ALTER TABLE tp_none IMPORT TABLESPACE; +update tp_none set b=substr(b,1); +SET GLOBAL innodb_checksum_algorithm=crc32; +ALTER TABLE tce_none DISCARD TABLESPACE; +ALTER TABLE tc_none DISCARD TABLESPACE; +ALTER TABLE te_none DISCARD TABLESPACE; +ALTER TABLE t_none DISCARD TABLESPACE; +ALTER TABLE tpe_none DISCARD TABLESPACE; +ALTER TABLE tp_none DISCARD TABLESPACE; +restore: tce_none .ibd and .cfg files +restore: tc_none .ibd and .cfg files +restore: te_none .ibd and .cfg files +restore: t_none .ibd and .cfg files +restore: tpe_none .ibd and .cfg files +restore: tp_none .ibd and .cfg files +ALTER TABLE tce_none IMPORT TABLESPACE; +update tce_none set b=substr(b,1); +ALTER TABLE tc_none IMPORT TABLESPACE; +update tc_none set b=substr(b,1); +ALTER TABLE te_none IMPORT TABLESPACE; +update te_none set b=substr(b,1); +ALTER TABLE t_none IMPORT TABLESPACE; +update t_none set b=substr(b,1); +ALTER TABLE tpe_none IMPORT TABLESPACE; +update tpe_none set b=substr(b,1); +ALTER TABLE tp_none IMPORT TABLESPACE; +update tp_none set b=substr(b,1); +SET GLOBAL innodb_checksum_algorithm=strict_innodb; +ALTER TABLE tce_none DISCARD TABLESPACE; +ALTER TABLE tc_none DISCARD TABLESPACE; +ALTER TABLE te_none DISCARD TABLESPACE; +ALTER TABLE t_none DISCARD TABLESPACE; +ALTER TABLE tpe_none DISCARD TABLESPACE; +ALTER TABLE tp_none DISCARD TABLESPACE; +restore: tce_none .ibd and .cfg files +restore: tc_none .ibd and .cfg files +restore: te_none .ibd and .cfg files +restore: t_none .ibd and .cfg files +restore: tpe_none .ibd and .cfg files +restore: tp_none .ibd and .cfg files +ALTER TABLE tce_none IMPORT TABLESPACE; +update tce_none set b=substr(b,1); +ALTER TABLE tc_none IMPORT TABLESPACE; +update tc_none set b=substr(b,1); +ALTER TABLE te_none IMPORT TABLESPACE; +update te_none set b=substr(b,1); +ALTER TABLE t_none IMPORT TABLESPACE; +update t_none set b=substr(b,1); +ALTER TABLE tpe_none IMPORT TABLESPACE; +update tpe_none set b=substr(b,1); +ALTER TABLE tp_none IMPORT TABLESPACE; +update tp_none set b=substr(b,1); +SET GLOBAL innodb_checksum_algorithm=innodb; +ALTER TABLE tce_none DISCARD TABLESPACE; +ALTER TABLE tc_none DISCARD TABLESPACE; +ALTER TABLE te_none DISCARD TABLESPACE; +ALTER TABLE t_none DISCARD TABLESPACE; +ALTER TABLE tpe_none DISCARD TABLESPACE; +ALTER TABLE tp_none DISCARD TABLESPACE; +restore: tce_none .ibd and .cfg files +restore: tc_none .ibd and .cfg files +restore: te_none .ibd and .cfg files +restore: t_none .ibd and .cfg files +restore: tpe_none .ibd and .cfg files +restore: tp_none .ibd and .cfg files +ALTER TABLE tce_none IMPORT TABLESPACE; +update tce_none set b=substr(b,1); +ALTER TABLE tc_none IMPORT TABLESPACE; +update tc_none set b=substr(b,1); +ALTER TABLE te_none IMPORT TABLESPACE; +update te_none set b=substr(b,1); +ALTER TABLE t_none IMPORT TABLESPACE; +update t_none set b=substr(b,1); +ALTER TABLE tpe_none IMPORT TABLESPACE; +update tpe_none set b=substr(b,1); +ALTER TABLE tp_none IMPORT TABLESPACE; +update tp_none set b=substr(b,1); +SET GLOBAL innodb_checksum_algorithm=strict_none; +ALTER TABLE tce_none DISCARD TABLESPACE; +ALTER TABLE tc_none DISCARD TABLESPACE; +ALTER TABLE te_none DISCARD TABLESPACE; +ALTER TABLE t_none DISCARD TABLESPACE; +ALTER TABLE tpe_none DISCARD TABLESPACE; +ALTER TABLE tp_none DISCARD TABLESPACE; +restore: tce_none .ibd and .cfg files +restore: tc_none .ibd and .cfg files +restore: te_none .ibd and .cfg files +restore: t_none .ibd and .cfg files +restore: tpe_none .ibd and .cfg files +restore: tp_none .ibd and .cfg files +ALTER TABLE tce_none IMPORT TABLESPACE; +update tce_none set b=substr(b,1); +ALTER TABLE tc_none IMPORT TABLESPACE; +update tc_none set b=substr(b,1); +ALTER TABLE te_none IMPORT TABLESPACE; +update te_none set b=substr(b,1); +ALTER TABLE t_none IMPORT TABLESPACE; +update t_none set b=substr(b,1); +ALTER TABLE tpe_none IMPORT TABLESPACE; +update tpe_none set b=substr(b,1); +ALTER TABLE tp_none IMPORT TABLESPACE; +update tp_none set b=substr(b,1); +SET GLOBAL innodb_checksum_algorithm=none; +ALTER TABLE tce_none DISCARD TABLESPACE; +ALTER TABLE tc_none DISCARD TABLESPACE; +ALTER TABLE te_none DISCARD TABLESPACE; +ALTER TABLE t_none DISCARD TABLESPACE; +ALTER TABLE tpe_none DISCARD TABLESPACE; +ALTER TABLE tp_none DISCARD TABLESPACE; +restore: tce_none .ibd and .cfg files +restore: tc_none .ibd and .cfg files +restore: te_none .ibd and .cfg files +restore: t_none .ibd and .cfg files +restore: tpe_none .ibd and .cfg files +restore: tp_none .ibd and .cfg files +ALTER TABLE tce_none IMPORT TABLESPACE; +update tce_none set b=substr(b,1); +ALTER TABLE tc_none IMPORT TABLESPACE; +update tc_none set b=substr(b,1); +ALTER TABLE te_none IMPORT TABLESPACE; +update te_none set b=substr(b,1); +ALTER TABLE t_none IMPORT TABLESPACE; +update t_none set b=substr(b,1); +ALTER TABLE tpe_none IMPORT TABLESPACE; +update tpe_none set b=substr(b,1); +ALTER TABLE tp_none IMPORT TABLESPACE; +update tp_none set b=substr(b,1); +CHECK TABLE tce_none, tc_none, te_none, +t_none, tpe_none, tp_none; +Table Op Msg_type Msg_text +test.tce_none check status OK +test.tc_none check status OK +test.te_none check status OK +test.t_none check status OK +test.tpe_none check status OK +test.tp_none check status OK +DROP TABLE tce_none, tc_none, te_none, +t_none, tpe_none, tp_none; +SET GLOBAL innodb_file_per_table = @saved_file_per_table; +SET GLOBAL innodb_checksum_algorithm = @saved_checksum_algorithm; +SET GLOBAL innodb_encrypt_tables = @saved_encrypt_tables; +SET GLOBAL innodb_encryption_threads = @saved_encryption_threads; +SET GLOBAL innodb_default_encryption_key_id = @saved_encryption_key_id; diff --git a/mysql-test/suite/encryption/r/innodb-compressed-blob.result b/mysql-test/suite/encryption/r/innodb-compressed-blob.result new file mode 100644 index 00000000000..bf43e1b30d6 --- /dev/null +++ b/mysql-test/suite/encryption/r/innodb-compressed-blob.result @@ -0,0 +1,21 @@ +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[123]\\.ibd' cannot be decrypted\\."); +call mtr.add_suppression("InnoDB: Unable to decompress ..test.t[1-3]\\.ibd\\[page id: space=[1-9][0-9]*, page number=[0-9]+\\]"); +# Restart mysqld --file-key-management-filename=keys2.txt +SET GLOBAL innodb_file_per_table = ON; +set GLOBAL innodb_default_encryption_key_id=4; +create table t1(a int not null primary key, b blob, index(b(10))) engine=innodb row_format=compressed; +create table t2(a int not null primary key, b blob, index(b(10))) engine=innodb row_format=compressed encrypted=yes; +create table t3(a int not null primary key, b blob, index(b(10))) engine=innodb row_format=compressed encrypted=no; +insert into t1 values (1, repeat('secret',6000)); +insert into t2 values (1, repeat('secret',6000)); +insert into t3 values (1, repeat('secret',6000)); +# Restart mysqld --file-key-management-filename=keys3.txt +select count(*) from t1 FORCE INDEX (b) where b like 'secret%'; +ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB +select count(*) from t2 FORCE INDEX (b) where b like 'secret%'; +ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB +select count(*) from t3 FORCE INDEX (b) where b like 'secret%'; +count(*) +1 +# Restart mysqld --file-key-management-filename=keys2.txt +drop table t1,t2,t3; diff --git a/mysql-test/suite/encryption/r/innodb-encryption-disable.result b/mysql-test/suite/encryption/r/innodb-encryption-disable.result index d19124ab602..90668a3a395 100644 --- a/mysql-test/suite/encryption/r/innodb-encryption-disable.result +++ b/mysql-test/suite/encryption/r/innodb-encryption-disable.result @@ -1,4 +1,4 @@ -call mtr.add_suppression("InnoDB: The page .* in file test/t[15] cannot be decrypted"); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[15]\\.ibd' cannot be decrypted\\."); call mtr.add_suppression("Couldn't load plugins from 'file_key_management"); create table t5 ( `intcol1` int(32) DEFAULT NULL, @@ -16,20 +16,8 @@ CREATE TABLE `t1` ( `charcol3` varchar(128) DEFAULT NULL ) ENGINE=InnoDB; insert into t1 values (1,2,'maria','db','encryption'); -select * from t1; -intcol1 intcol2 charcol1 charcol2 charcol3 -1 2 maria db encryption -select * from t5; -intcol1 intcol2 charcol1 charcol2 charcol3 -1 2 maria db encryption alter table t1 encrypted='yes' `encryption_key_id`=1; select * from t1; -intcol1 intcol2 charcol1 charcol2 charcol3 -1 2 maria db encryption -select * from t5; -intcol1 intcol2 charcol1 charcol2 charcol3 -1 2 maria db encryption -select * from t1; ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB select * from t5; ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB diff --git a/mysql-test/suite/encryption/r/innodb-first-page-read.result b/mysql-test/suite/encryption/r/innodb-first-page-read.result new file mode 100644 index 00000000000..6df80e8223d --- /dev/null +++ b/mysql-test/suite/encryption/r/innodb-first-page-read.result @@ -0,0 +1,98 @@ +SET GLOBAL innodb_file_format = `Barracuda`; +SET GLOBAL innodb_file_per_table = ON; +FLUSH STATUS; +create database innodb_test; +use innodb_test; +create table innodb_normal(c1 bigint not null, b char(200)) engine=innodb; +create table innodb_compact(c1 bigint not null, b char(200)) engine=innodb row_format=compact; +create table innodb_dynamic(c1 bigint not null, b char(200)) engine=innodb row_format=dynamic; +create table innodb_compressed(c1 bigint not null, b char(200)) engine=innodb row_format=compressed; +create table innodb_compressed1(c1 bigint not null, b char(200)) engine=innodb row_format=compressed key_block_size=1; +create table innodb_compressed2(c1 bigint not null, b char(200)) engine=innodb row_format=compressed key_block_size=2; +create table innodb_compressed4(c1 bigint not null, b char(200)) engine=innodb row_format=compressed key_block_size=4; +create table innodb_compressed8(c1 bigint not null, b char(200)) engine=innodb row_format=compressed key_block_size=8; +create table innodb_compressed16(c1 bigint not null, b char(200)) engine=innodb row_format=compressed key_block_size=16; +create table innodb_redundant(c1 bigint not null, b char(200)) engine=innodb row_format=redundant; +create table innodb_pagecomp(c1 bigint not null, b char(200)) engine=innodb page_compressed=yes; +create table innodb_pagecomp1(c1 bigint not null, b char(200)) engine=innodb page_compressed=yes page_compression_level=1; +create table innodb_pagecomp2(c1 bigint not null, b char(200)) engine=innodb page_compressed=yes page_compression_level=2; +create table innodb_pagecomp3(c1 bigint not null, b char(200)) engine=innodb page_compressed=yes page_compression_level=3; +create table innodb_pagecomp4(c1 bigint not null, b char(200)) engine=innodb page_compressed=yes page_compression_level=4; +create table innodb_pagecomp5(c1 bigint not null, b char(200)) engine=innodb page_compressed=yes page_compression_level=5; +create table innodb_pagecomp6(c1 bigint not null, b char(200)) engine=innodb page_compressed=yes page_compression_level=6; +create table innodb_pagecomp7(c1 bigint not null, b char(200)) engine=innodb page_compressed=yes page_compression_level=7; +create table innodb_pagecomp8(c1 bigint not null, b char(200)) engine=innodb page_compressed=yes page_compression_level=8; +create table innodb_pagecomp9(c1 bigint not null, b char(200)) engine=innodb page_compressed=yes page_compression_level=9; +create table innodb_datadir1(c1 bigint not null, b char(200)) engine=innodb DATA DIRECTORY='MYSQL_TMP_DIR'; +create table innodb_datadir2(c1 bigint not null, b char(200)) engine=innodb row_format=compressed DATA DIRECTORY='MYSQL_TMP_DIR'; +create table innodb_datadir3(c1 bigint not null, b char(200)) engine=innodb page_compressed=yes DATA DIRECTORY='MYSQL_TMP_DIR'; +begin; +insert into innodb_normal values (1,'secret'); +insert into innodb_compact select * from innodb_normal; +insert into innodb_dynamic select * from innodb_normal; +insert into innodb_compressed select * from innodb_normal; +insert into innodb_compressed1 select * from innodb_normal; +insert into innodb_compressed2 select * from innodb_normal; +insert into innodb_compressed4 select * from innodb_normal; +insert into innodb_compressed8 select * from innodb_normal; +insert into innodb_compressed16 select * from innodb_normal; +insert into innodb_redundant select * from innodb_normal; +insert into innodb_pagecomp select * from innodb_normal; +insert into innodb_pagecomp1 select * from innodb_normal; +insert into innodb_pagecomp2 select * from innodb_normal; +insert into innodb_pagecomp3 select * from innodb_normal; +insert into innodb_pagecomp4 select * from innodb_normal; +insert into innodb_pagecomp5 select * from innodb_normal; +insert into innodb_pagecomp6 select * from innodb_normal; +insert into innodb_pagecomp7 select * from innodb_normal; +insert into innodb_pagecomp8 select * from innodb_normal; +insert into innodb_pagecomp9 select * from innodb_normal; +insert into innodb_datadir1 select * from innodb_normal; +insert into innodb_datadir2 select * from innodb_normal; +insert into innodb_datadir3 select * from innodb_normal; +commit; +FLUSH STATUS; +# Restart server and see how many page 0's are read +# result should actual number of tables except remote tables could be read twice +# i.e. < 23 + 3*2 = 29 +SELECT VARIABLE_VALUE <= 29 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'innodb_pages0_read'; +VARIABLE_VALUE <= 29 +1 +use innodb_test; +SELECT VARIABLE_VALUE <= 29 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'innodb_pages0_read'; +VARIABLE_VALUE <= 29 +1 +use test; +SELECT VARIABLE_VALUE <= 29 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'innodb_pages0_read'; +VARIABLE_VALUE <= 29 +1 +set global innodb_encrypt_tables=OFF; +# wait until tables are decrypted +# result should be actual number of tables except remote tables could be read twice +# i.e. < 23 + 3*2 = 29 +SELECT VARIABLE_VALUE <= 29 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'innodb_pages0_read'; +VARIABLE_VALUE <= 29 +1 +use innodb_test; +SELECT VARIABLE_VALUE <= 29 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'innodb_pages0_read'; +VARIABLE_VALUE <= 29 +1 +use test; +SELECT VARIABLE_VALUE <= 29 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'innodb_pages0_read'; +VARIABLE_VALUE <= 29 +1 +FLUSH STATUS; +# restart and see number read page 0 +SELECT VARIABLE_VALUE <= 29 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'innodb_pages0_read'; +VARIABLE_VALUE <= 29 +1 +use innodb_test; +SELECT VARIABLE_VALUE <= 29 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'innodb_pages0_read'; +VARIABLE_VALUE <= 29 +1 +use test; +SELECT VARIABLE_VALUE <= 29 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'innodb_pages0_read'; +VARIABLE_VALUE <= 29 +1 +drop database innodb_test; +FLUSH STATUS; diff --git a/mysql-test/suite/encryption/r/innodb-force-corrupt.result b/mysql-test/suite/encryption/r/innodb-force-corrupt.result new file mode 100644 index 00000000000..67917ca5f82 --- /dev/null +++ b/mysql-test/suite/encryption/r/innodb-force-corrupt.result @@ -0,0 +1,23 @@ +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[123]\\.ibd' cannot be decrypted\\."); +SET GLOBAL innodb_file_per_table = ON; +set global innodb_compression_algorithm = 1; +# Create and populate tables to be corrupted +CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT,c char(200)) ENGINE=InnoDB encrypted=yes; +CREATE TABLE t2 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT,c char(200)) ENGINE=InnoDB row_format=compressed encrypted=yes; +CREATE TABLE t3 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT, c char(200)) ENGINE=InnoDB page_compressed=yes encrypted=yes; +BEGIN; +INSERT INTO t1 (b,c) VALUES ('corrupt me','secret'); +INSERT INTO t1 (b,c) VALUES ('corrupt me','moresecretmoresecret'); +INSERT INTO t2 select * from t1; +INSERT INTO t3 select * from t1; +COMMIT; +# Backup tables before corrupting +# Corrupt tables +SELECT * FROM t1; +ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB +SELECT * FROM t2; +ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB +SELECT * FROM t3; +ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB +# Restore the original tables +DROP TABLE t1,t2,t3; diff --git a/mysql-test/suite/encryption/r/innodb-key-rotation-disable.result b/mysql-test/suite/encryption/r/innodb-key-rotation-disable.result index feaede20f2a..680db692c17 100644 --- a/mysql-test/suite/encryption/r/innodb-key-rotation-disable.result +++ b/mysql-test/suite/encryption/r/innodb-key-rotation-disable.result @@ -2,9 +2,6 @@ SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_ NAME SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; NAME -mysql/innodb_table_stats -mysql/innodb_index_stats -innodb_system create database enctests; use enctests; create table t1(a int not null primary key, b char(200)) engine=innodb; @@ -62,5 +59,4 @@ FOUND 1 /public/ in t7.ibd FOUND 1 /public/ in t8.ibd # t9 page compressed expecting NOT FOUND NOT FOUND /public/ in t9.ibd -use test; drop database enctests; diff --git a/mysql-test/suite/encryption/r/innodb-missing-key.result b/mysql-test/suite/encryption/r/innodb-missing-key.result index 2d2bc91c321..3eb48409f13 100644 --- a/mysql-test/suite/encryption/r/innodb-missing-key.result +++ b/mysql-test/suite/encryption/r/innodb-missing-key.result @@ -1,5 +1,4 @@ -call mtr.add_suppression("InnoDB: The page .* in file test/t. cannot be decrypted"); - +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[123]\\.ibd' cannot be decrypted\\."); # Start server with keys2.txt CREATE TABLE t1(a int not null primary key auto_increment, b varchar(128)) engine=innodb ENCRYPTED=YES ENCRYPTION_KEY_ID=19; CREATE TABLE t2(a int not null primary key auto_increment, b varchar(128)) engine=innodb ENCRYPTED=YES ENCRYPTION_KEY_ID=1; diff --git a/mysql-test/suite/encryption/r/innodb-page_encryption_compression.result b/mysql-test/suite/encryption/r/innodb-page_encryption_compression.result index a5bd7da8421..808345ab4ca 100644 --- a/mysql-test/suite/encryption/r/innodb-page_encryption_compression.result +++ b/mysql-test/suite/encryption/r/innodb-page_encryption_compression.result @@ -36,73 +36,12 @@ set current_num = current_num + 1; end while; end// commit; -set autocommit=0; -call innodb_insert_proc(5000); -commit; -set autocommit=1; +begin; +call innodb_insert_proc(2000); insert into innodb_compact select * from innodb_normal; insert into innodb_dynamic select * from innodb_normal; -update innodb_normal set c1 = c1 + 1; -update innodb_compact set c1 = c1 + 1; -update innodb_dynamic set c1 = c1 + 1; -select count(*) from innodb_normal; -count(*) -5000 -select count(*) from innodb_compact where c1 < 1500000; -count(*) -5000 -select count(*) from innodb_dynamic where c1 < 1500000; -count(*) -5000 -select count(*) from innodb_compact t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -count(*) -5000 -select count(*) from innodb_dynamic t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -count(*) -5000 -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; -variable_value >= 0 -1 -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; -variable_value >= 0 -1 -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_compressed'; -variable_value >= 0 -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decompressed'; -variable_value >= 0 +commit; set global innodb_compression_algorithm = 1; -update innodb_normal set c1 = c1 + 1; -update innodb_compact set c1 = c1 + 1; -update innodb_dynamic set c1 = c1 + 1; -select count(*) from innodb_normal; -count(*) -5000 -select count(*) from innodb_compact where c1 < 1500000; -count(*) -5000 -select count(*) from innodb_dynamic where c1 < 1500000; -count(*) -5000 -select count(*) from innodb_compact t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -count(*) -5000 -select count(*) from innodb_dynamic t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -count(*) -5000 -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; -variable_value >= 0 -1 -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; -variable_value >= 0 -1 -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_compressed'; -variable_value >= 0 -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decompressed'; -variable_value >= 0 alter table innodb_normal engine=innodb page_compressed=DEFAULT; show create table innodb_normal; Table Create Table @@ -124,54 +63,6 @@ innodb_dynamic CREATE TABLE `innodb_dynamic` ( `c1` bigint(20) NOT NULL, `b` char(200) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC -show create table innodb_normal; -Table Create Table -innodb_normal CREATE TABLE `innodb_normal` ( - `c1` bigint(20) NOT NULL, - `b` char(200) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 -show create table innodb_compact; -Table Create Table -innodb_compact CREATE TABLE `innodb_compact` ( - `c1` bigint(20) NOT NULL, - `b` char(200) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT -show create table innodb_dynamic; -Table Create Table -innodb_dynamic CREATE TABLE `innodb_dynamic` ( - `c1` bigint(20) NOT NULL, - `b` char(200) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC -update innodb_normal set c1 = c1 + 1; -update innodb_compact set c1 = c1 + 1; -update innodb_dynamic set c1 = c1 + 1; -select count(*) from innodb_normal; -count(*) -5000 -select count(*) from innodb_compact where c1 < 1500000; -count(*) -5000 -select count(*) from innodb_dynamic where c1 < 1500000; -count(*) -5000 -select count(*) from innodb_compact t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -count(*) -5000 -select count(*) from innodb_dynamic t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -count(*) -5000 -SELECT variable_value = 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; -variable_value = 0 -1 -SELECT variable_value = 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; -variable_value = 0 -1 -SELECT variable_value = 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_compressed'; -variable_value = 0 -SELECT variable_value = 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decompressed'; -variable_value = 0 drop procedure innodb_insert_proc; drop table innodb_normal; drop table innodb_compact; diff --git a/mysql-test/suite/encryption/r/innodb-page_encryption_log_encryption.result b/mysql-test/suite/encryption/r/innodb-page_encryption_log_encryption.result index ce74ac52537..189be75b83f 100644 --- a/mysql-test/suite/encryption/r/innodb-page_encryption_log_encryption.result +++ b/mysql-test/suite/encryption/r/innodb-page_encryption_log_encryption.result @@ -1,6 +1,3 @@ -call mtr.add_suppression("KeyID 0 not found or with error. Check the key and the log*"); -call mtr.add_suppression("Disabling redo log encryp*"); -call mtr.add_suppression("InnoDB: Redo log crypto: Can't initialize to key version*"); create table innodb_normal(c1 bigint not null, b char(200)) engine=innodb; show warnings; Level Code Message @@ -50,49 +47,15 @@ set current_num = current_num + 1; end while; end// commit; -set autocommit=0; +begin; call innodb_insert_proc(2000); -commit; -set autocommit=1; insert into innodb_compact select * from innodb_normal; insert into innodb_compressed select * from innodb_normal; insert into innodb_dynamic select * from innodb_normal; insert into innodb_redundant select * from innodb_normal; -update innodb_normal set c1 = c1 +1; -update innodb_compact set c1 = c1 + 1; -update innodb_compressed set c1 = c1 + 1; -update innodb_dynamic set c1 = c1 + 1; -update innodb_redundant set c1 = c1 + 1; -select count(*) from innodb_compact where c1 < 1500000; -count(*) -2000 -select count(*) from innodb_compressed where c1 < 1500000; -count(*) -2000 -select count(*) from innodb_dynamic where c1 < 1500000; -count(*) -2000 -select count(*) from innodb_redundant where c1 < 1500000; -count(*) -2000 -select count(*) from innodb_compact t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -count(*) -2000 -select count(*) from innodb_dynamic t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -count(*) -2000 -select count(*) from innodb_compressed t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -count(*) -2000 -select count(*) from innodb_redundant t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -count(*) -2000 -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; -variable_value >= 0 +commit; +SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; +variable_value > 0 1 SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; variable_value >= 0 @@ -102,40 +65,13 @@ update innodb_compact set c1 = c1 + 1; update innodb_compressed set c1 = c1 + 1; update innodb_dynamic set c1 = c1 + 1; update innodb_redundant set c1 = c1 + 1; -select count(*) from innodb_compact where c1 < 1500000; -count(*) -2000 -select count(*) from innodb_compressed where c1 < 1500000; -count(*) -2000 -select count(*) from innodb_dynamic where c1 < 1500000; -count(*) -2000 -select count(*) from innodb_redundant where c1 < 1500000; -count(*) -2000 -select count(*) from innodb_compact t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -count(*) -2000 -select count(*) from innodb_dynamic t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -count(*) -2000 -select count(*) from innodb_compressed t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -count(*) -2000 -select count(*) from innodb_redundant t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -count(*) -2000 -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; -variable_value >= 0 +SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; +variable_value > 0 1 -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; -variable_value >= 0 +SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; +variable_value > 0 1 +SET GLOBAL innodb_encrypt_tables=OFF; alter table innodb_compact engine=innodb encrypted=DEFAULT encryption_key_id=DEFAULT; show create table innodb_compact; Table Create Table @@ -164,63 +100,6 @@ innodb_redundant CREATE TABLE `innodb_redundant` ( `c1` bigint(20) NOT NULL, `b` char(200) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=REDUNDANT -show create table innodb_compact; -Table Create Table -innodb_compact CREATE TABLE `innodb_compact` ( - `c1` bigint(20) NOT NULL, - `b` char(200) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT -show create table innodb_compressed; -Table Create Table -innodb_compressed CREATE TABLE `innodb_compressed` ( - `c1` bigint(20) NOT NULL, - `b` char(200) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED -show create table innodb_dynamic; -Table Create Table -innodb_dynamic CREATE TABLE `innodb_dynamic` ( - `c1` bigint(20) NOT NULL, - `b` char(200) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC -show create table innodb_redundant; -Table Create Table -innodb_redundant CREATE TABLE `innodb_redundant` ( - `c1` bigint(20) NOT NULL, - `b` char(200) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=REDUNDANT -update innodb_normal set c1 = c1 +1; -update innodb_compact set c1 = c1 + 1; -update innodb_compressed set c1 = c1 + 1; -update innodb_dynamic set c1 = c1 + 1; -update innodb_redundant set c1 = c1 + 1; -select count(*) from innodb_compact where c1 < 1500000; -count(*) -2000 -select count(*) from innodb_compressed where c1 < 1500000; -count(*) -2000 -select count(*) from innodb_dynamic where c1 < 1500000; -count(*) -2000 -select count(*) from innodb_redundant where c1 < 1500000; -count(*) -2000 -select count(*) from innodb_compact t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -count(*) -2000 -select count(*) from innodb_dynamic t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -count(*) -2000 -select count(*) from innodb_compressed t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -count(*) -2000 -select count(*) from innodb_redundant t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -count(*) -2000 SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; variable_value >= 0 1 diff --git a/mysql-test/suite/encryption/r/innodb-redo-badkey.result b/mysql-test/suite/encryption/r/innodb-redo-badkey.result new file mode 100644 index 00000000000..ee803261b90 --- /dev/null +++ b/mysql-test/suite/encryption/r/innodb-redo-badkey.result @@ -0,0 +1,38 @@ +call mtr.add_suppression("Plugin 'file_key_management'"); +call mtr.add_suppression("Plugin 'InnoDB' init function returned error."); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[0-9]+\\] in file .*test/t[1-4]\\.ibd cannot be decrypted"); +call mtr.add_suppression("InnoDB: Unable to decompress .*.test.t1\\.ibd\\[page id: space=[1-9][0-9]*, page number=[0-9]+\\]"); +call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed file read of tablespace test/t1 page \\[page id: space=[1-9][0-9]*, page number=[0-9]*\\]"); +call mtr.add_suppression("InnoDB: Plugin initialization aborted"); +call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed"); +# Restart mysqld --file-key-management-filename=keys2.txt +# Wait max 10 min for key encryption threads to encrypt all spaces +SET GLOBAL innodb_file_format = `Barracuda`; +SET GLOBAL innodb_file_per_table = ON; +create table t1(a int not null primary key auto_increment, c char(250), b blob, index(b(10))) engine=innodb row_format=compressed encrypted=yes encryption_key_id=4; +create table t2(a int not null primary key auto_increment, c char(250), b blob, index(b(10))) engine=innodb row_format=compressed; +create table t3(a int not null primary key auto_increment, c char(250), b blob, index(b(10))) engine=innodb encrypted=yes encryption_key_id=4; +create table t4(a int not null primary key auto_increment, c char(250), b blob, index(b(10))) engine=innodb; +begin; +insert into t2 select * from t1; +insert into t3 select * from t1; +insert into t4 select * from t1; +commit; +SET GLOBAL innodb_flush_log_at_trx_commit=1; +begin; +update t1 set c = repeat('secret3', 20); +update t2 set c = repeat('secret4', 20); +update t3 set c = repeat('secret4', 20); +update t4 set c = repeat('secret4', 20); +insert into t1 (c,b) values (repeat('secret5',20), repeat('secret6',6000)); +insert into t2 (c,b) values (repeat('secret7',20), repeat('secret8',6000)); +insert into t3 (c,b) values (repeat('secret9',20), repeat('secre10',6000)); +insert into t4 (c,b) values (repeat('secre11',20), repeat('secre12',6000)); +COMMIT; +# Kill the server +# restart +# Kill the server +# Restart mysqld --innodb-force-recovery=1 +# Kill the server +# Restart mysqld --file-key-management-filename=keys2.txt +drop table t1, t2,t3,t4; diff --git a/mysql-test/suite/encryption/r/innodb-redo-nokeys.result b/mysql-test/suite/encryption/r/innodb-redo-nokeys.result new file mode 100644 index 00000000000..dcbe1f5a395 --- /dev/null +++ b/mysql-test/suite/encryption/r/innodb-redo-nokeys.result @@ -0,0 +1,37 @@ +call mtr.add_suppression("InnoDB: Block in space_id .*"); +call mtr.add_suppression("mysqld: File .*"); +call mtr.add_suppression("Plugin 'file_key_management' .*"); +call mtr.add_suppression("InnoDB: cannot enable encryption, encryption plugin is not available"); +call mtr.add_suppression("Plugin 'InnoDB' init function returned error."); +call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed."); +call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t2 cannot be decrypted."); +call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t3 cannot be decrypted."); +call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t4 cannot be decrypted."); +call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t1 cannot be decrypted."); +# Restart mysqld --file-key-management-filename=keys2.txt +SET GLOBAL innodb_file_format = `Barracuda`; +SET GLOBAL innodb_file_per_table = ON; +create table t1(a int not null primary key auto_increment, c char(200), b blob, index(b(10))) engine=innodb row_format=compressed encrypted=yes encryption_key_id=20; +create table t2(a int not null primary key auto_increment, c char(200), b blob, index(b(10))) engine=innodb row_format=compressed; +create table t3(a int not null primary key auto_increment, c char(200), b blob, index(b(10))) engine=innodb encrypted=yes encryption_key_id=20; +create table t4(a int not null primary key auto_increment, c char(200), b blob, index(b(10))) engine=innodb; +begin; +insert into t2 select * from t1; +insert into t3 select * from t1; +insert into t4 select * from t1; +commit; +SET GLOBAL innodb_flush_log_at_trx_commit=1; +begin; +update t1 set c = repeat('secret3', 20); +update t2 set c = repeat('secret4', 20); +update t3 set c = repeat('secret4', 20); +update t4 set c = repeat('secret4', 20); +insert into t1 (c,b) values (repeat('secret5',20), repeat('secret6',6000)); +insert into t2 (c,b) values (repeat('secret7',20), repeat('secret8',6000)); +insert into t3 (c,b) values (repeat('secret9',20), repeat('secre10',6000)); +insert into t4 (c,b) values (repeat('secre11',20), repeat('secre12',6000)); +COMMIT; +# Kill the server +# restart +# Restart mysqld --file-key-management-filename=keys2.txt +drop table t1, t2,t3,t4; diff --git a/mysql-test/suite/encryption/r/innodb_encrypt_log.result b/mysql-test/suite/encryption/r/innodb_encrypt_log.result index f8f933be831..0663890c685 100644 --- a/mysql-test/suite/encryption/r/innodb_encrypt_log.result +++ b/mysql-test/suite/encryption/r/innodb_encrypt_log.result @@ -25,6 +25,7 @@ CREATE TEMPORARY TABLE t LIKE t0; INSERT INTO t VALUES (NULL,1,1,'private','secret'),(NULL,2,2,'sacred','success'), (NULL,3,3,'story','secure'),(NULL,4,4,'security','sacrament'); +SET GLOBAL innodb_change_buffering=none; SET GLOBAL innodb_flush_log_at_trx_commit=1; INSERT INTO t0 SELECT NULL, t1.col_int, t1.col_int_key, t1.col_char, t1.col_char_key @@ -36,8 +37,6 @@ NOT FOUND /private|secret|sacr(ed|ament)|success|story|secur(e|ity)/ in ibdata1 NOT FOUND /private|secret|sacr(ed|ament)|success|story|secur(e|ity)/ in t0.ibd # ib_logfile0 expecting NOT FOUND NOT FOUND /private|secret|sacr(ed|ament)|success|story|secur(e|ity)/ in ib_logfile0 -# ib_logfile1 expecting NOT FOUND -NOT FOUND /private|secret|sacr(ed|ament)|success|story|secur(e|ity)/ in ib_logfile1 # Restart without redo log encryption SELECT COUNT(*) FROM t0; COUNT(*) @@ -51,7 +50,7 @@ INSERT INTO t0 VALUES(NULL, 5, 5, 'public', 'gossip'); # ib_logfile0 expecting NOT FOUND NOT FOUND /private|secret|sacr(ed|ament)|success|story|secur(e|ity)/ in ib_logfile0 # ib_logfile0 expecting FOUND -FOUND 3 /public|gossip/ in ib_logfile0 +FOUND 1 /(public|gossip).*/ in ib_logfile0 # ibdata1 expecting NOT FOUND NOT FOUND /private|secret|sacr(ed|ament)|success|story|secur(e|ity)|public|gossip/ in ibdata1 # t0.ibd expecting NOT FOUND diff --git a/mysql-test/suite/encryption/r/innodb_encryption-page-compression.result b/mysql-test/suite/encryption/r/innodb_encryption-page-compression.result index 60b9ff57605..359f285901c 100644 --- a/mysql-test/suite/encryption/r/innodb_encryption-page-compression.result +++ b/mysql-test/suite/encryption/r/innodb_encryption-page-compression.result @@ -95,13 +95,8 @@ set current_num = current_num + 1; end while; end// commit; -set autocommit=0; -call innodb_insert_proc(5000); -commit; -set autocommit=1; -select count(*) from innodb_normal; -count(*) -5000 +begin; +call innodb_insert_proc(2000); insert into innodb_page_compressed1 select * from innodb_normal; insert into innodb_page_compressed2 select * from innodb_normal; insert into innodb_page_compressed3 select * from innodb_normal; @@ -114,120 +109,45 @@ insert into innodb_page_compressed9 select * from innodb_normal; commit; select count(*) from innodb_page_compressed1 where c1 < 500000; count(*) -5000 +2000 select count(*) from innodb_page_compressed2 where c1 < 500000; count(*) -5000 +2000 select count(*) from innodb_page_compressed3 where c1 < 500000; count(*) -5000 +2000 select count(*) from innodb_page_compressed4 where c1 < 500000; count(*) -5000 +2000 select count(*) from innodb_page_compressed5 where c1 < 500000; count(*) -5000 +2000 select count(*) from innodb_page_compressed6 where c1 < 500000; count(*) -5000 +2000 select count(*) from innodb_page_compressed7 where c1 < 500000; count(*) -5000 +2000 select count(*) from innodb_page_compressed8 where c1 < 500000; count(*) -5000 +2000 select count(*) from innodb_page_compressed9 where c1 < 500000; count(*) -5000 -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; -variable_value >= 0 +2000 +SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; +variable_value > 0 1 SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; variable_value >= 0 1 -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_compressed'; -variable_value >= 0 -1 -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_decompressed'; -variable_value >= 0 -1 -select count(*) from innodb_page_compressed1 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed2 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed3 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed4 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed5 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed6 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed7 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed8 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed9 where c1 < 500000; -count(*) -5000 -update innodb_page_compressed1 set c1 = c1 + 1; -update innodb_page_compressed2 set c1 = c1 + 1; -update innodb_page_compressed3 set c1 = c1 + 1; -update innodb_page_compressed4 set c1 = c1 + 1; -update innodb_page_compressed5 set c1 = c1 + 1; -update innodb_page_compressed6 set c1 = c1 + 1; -update innodb_page_compressed7 set c1 = c1 + 1; -update innodb_page_compressed8 set c1 = c1 + 1; -update innodb_page_compressed9 set c1 = c1 + 1; -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; -variable_value >= 0 -1 -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; -variable_value >= 0 -1 -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_compressed'; -variable_value >= 0 +SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_compressed'; +variable_value > 0 1 SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_decompressed'; variable_value >= 0 1 SET GLOBAL innodb_encryption_threads = 4; SET GLOBAL innodb_encrypt_tables = off; -select count(*) from innodb_page_compressed1 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed2 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed3 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed4 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed5 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed6 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed7 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed8 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed9 where c1 < 500000; -count(*) -5000 update innodb_page_compressed1 set c1 = c1 + 1; update innodb_page_compressed2 set c1 = c1 + 1; update innodb_page_compressed3 set c1 = c1 + 1; @@ -240,11 +160,11 @@ update innodb_page_compressed9 set c1 = c1 + 1; SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; variable_value >= 0 1 -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; -variable_value >= 0 +SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; +variable_value > 0 1 -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_compressed'; -variable_value >= 0 +SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_compressed'; +variable_value > 0 1 SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_decompressed'; variable_value >= 0 diff --git a/mysql-test/suite/encryption/r/innodb_encryption.result b/mysql-test/suite/encryption/r/innodb_encryption.result index 26c77499d25..72f2632ba26 100644 --- a/mysql-test/suite/encryption/r/innodb_encryption.result +++ b/mysql-test/suite/encryption/r/innodb_encryption.result @@ -6,25 +6,26 @@ innodb_encrypt_tables ON innodb_encryption_rotate_key_age 15 innodb_encryption_rotation_iops 100 innodb_encryption_threads 4 -DESCRIBE INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION; -Field Type Null Key Default Extra -SPACE int(11) unsigned NO 0 -NAME varchar(655) YES NULL -ENCRYPTION_SCHEME int(11) unsigned NO 0 -KEYSERVER_REQUESTS int(11) unsigned NO 0 -MIN_KEY_VERSION int(11) unsigned NO 0 -CURRENT_KEY_VERSION int(11) unsigned NO 0 -KEY_ROTATION_PAGE_NUMBER bigint(21) unsigned YES NULL -KEY_ROTATION_MAX_PAGE_NUMBER bigint(21) unsigned YES NULL -CURRENT_KEY_ID int(11) unsigned NO 0 -ROTATING_OR_FLUSHING int(1) unsigned NO 0 -# Wait max 5 min for key encryption threads to encrypt one space -# Success! -# Wait max 10 min for key encryption threads to encrypt all space +SET GLOBAL innodb_encrypt_tables = ON; +# Wait max 10 min for key encryption threads to encrypt all spaces +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; +NAME +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; +NAME +mysql/innodb_table_stats +mysql/innodb_index_stats +innodb_system # Success! # Now turn off encryption and wait for threads to decrypt everything SET GLOBAL innodb_encrypt_tables = off; -# Wait max 10 min for key encryption threads to decrypt all space +# Wait max 10 min for key encryption threads to encrypt all spaces +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; +NAME +mysql/innodb_table_stats +mysql/innodb_index_stats +innodb_system +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; +NAME # Success! # Shutdown innodb_encryption_threads SET GLOBAL innodb_encryption_threads=0; @@ -32,16 +33,24 @@ SET GLOBAL innodb_encryption_threads=0; # since threads are off tables should remain unencrypted SET GLOBAL innodb_encrypt_tables = on; # Wait 15s to check that nothing gets encrypted +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; +NAME +mysql/innodb_table_stats +mysql/innodb_index_stats +innodb_system +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; +NAME # Success! # Startup innodb_encryption_threads SET GLOBAL innodb_encryption_threads=@start_global_value; -# Wait 1 min to check that it start encrypting again -# Success! -# -# Check that restart with encryption turned off works -# even if spaces are encrypted -# -# First wait max 10 min for key encryption threads to encrypt all spaces +# Wait max 10 min for key encryption threads to encrypt all spaces +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; +NAME +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; +NAME +mysql/innodb_table_stats +mysql/innodb_index_stats +innodb_system # Success! # Restart mysqld --innodb_encrypt_tables=0 --innodb_encryption_threads=0 SHOW VARIABLES LIKE 'innodb_encrypt%'; @@ -51,9 +60,10 @@ innodb_encrypt_tables OFF innodb_encryption_rotate_key_age 15 innodb_encryption_rotation_iops 100 innodb_encryption_threads 0 -SELECT COUNT(*) > 0 as should_be_1 -FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION -WHERE MIN_KEY_VERSION <> 0; -should_be_1 -1 -# Restart mysqld again...with default options +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; +NAME +mysql/innodb_table_stats +mysql/innodb_index_stats +innodb_system +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; +NAME diff --git a/mysql-test/suite/encryption/r/innodb_encryption_discard_import.result b/mysql-test/suite/encryption/r/innodb_encryption_discard_import.result index 91581eb8837..b503d6c9d30 100644 --- a/mysql-test/suite/encryption/r/innodb_encryption_discard_import.result +++ b/mysql-test/suite/encryption/r/innodb_encryption_discard_import.result @@ -1,5 +1,3 @@ -call mtr.add_suppression("InnoDB: Tablespace for table .* is set as discarded."); -call mtr.add_suppression("InnoDB: Cannot calculate statistics for table .* because the .ibd file is missing. Please refer to .* for how to resolve the issue."); CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY, a VARCHAR(255)) ENGINE=InnoDB encrypted=yes; CREATE TABLE t2 (id INT NOT NULL PRIMARY KEY, a VARCHAR(255)) ENGINE=InnoDB; CREATE TABLE t3 (id INT NOT NULL PRIMARY KEY, a VARCHAR(255)) ENGINE=InnoDB row_format=compressed encrypted=yes; diff --git a/mysql-test/suite/encryption/r/innodb_lotoftables.result b/mysql-test/suite/encryption/r/innodb_lotoftables.result index cf5724b527a..da07a52f8c3 100644 --- a/mysql-test/suite/encryption/r/innodb_lotoftables.result +++ b/mysql-test/suite/encryption/r/innodb_lotoftables.result @@ -17,10 +17,9 @@ commit work; show status like 'innodb_pages0_read%'; Variable_name Value Innodb_pages0_read 3 -# should be 100 -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE NAME LIKE 'innodb_encrypted%'; -COUNT(*) -100 +# should be empty +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE NAME LIKE 'innodb_encrypted%'; +NAME create database innodb_encrypted_2; use innodb_encrypted_2; show status like 'innodb_pages0_read%'; @@ -32,14 +31,112 @@ set autocommit=1; show status like 'innodb_pages0_read%'; Variable_name Value Innodb_pages0_read 3 -# should be 100 -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%'; -COUNT(*) -100 -# should be 100 -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%'; -COUNT(*) -100 +# should contain 100 tables +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; +NAME +innodb_encrypted_2/t_1 +innodb_encrypted_2/t_10 +innodb_encrypted_2/t_100 +innodb_encrypted_2/t_11 +innodb_encrypted_2/t_12 +innodb_encrypted_2/t_13 +innodb_encrypted_2/t_14 +innodb_encrypted_2/t_15 +innodb_encrypted_2/t_16 +innodb_encrypted_2/t_17 +innodb_encrypted_2/t_18 +innodb_encrypted_2/t_19 +innodb_encrypted_2/t_2 +innodb_encrypted_2/t_20 +innodb_encrypted_2/t_21 +innodb_encrypted_2/t_22 +innodb_encrypted_2/t_23 +innodb_encrypted_2/t_24 +innodb_encrypted_2/t_25 +innodb_encrypted_2/t_26 +innodb_encrypted_2/t_27 +innodb_encrypted_2/t_28 +innodb_encrypted_2/t_29 +innodb_encrypted_2/t_3 +innodb_encrypted_2/t_30 +innodb_encrypted_2/t_31 +innodb_encrypted_2/t_32 +innodb_encrypted_2/t_33 +innodb_encrypted_2/t_34 +innodb_encrypted_2/t_35 +innodb_encrypted_2/t_36 +innodb_encrypted_2/t_37 +innodb_encrypted_2/t_38 +innodb_encrypted_2/t_39 +innodb_encrypted_2/t_4 +innodb_encrypted_2/t_40 +innodb_encrypted_2/t_41 +innodb_encrypted_2/t_42 +innodb_encrypted_2/t_43 +innodb_encrypted_2/t_44 +innodb_encrypted_2/t_45 +innodb_encrypted_2/t_46 +innodb_encrypted_2/t_47 +innodb_encrypted_2/t_48 +innodb_encrypted_2/t_49 +innodb_encrypted_2/t_5 +innodb_encrypted_2/t_50 +innodb_encrypted_2/t_51 +innodb_encrypted_2/t_52 +innodb_encrypted_2/t_53 +innodb_encrypted_2/t_54 +innodb_encrypted_2/t_55 +innodb_encrypted_2/t_56 +innodb_encrypted_2/t_57 +innodb_encrypted_2/t_58 +innodb_encrypted_2/t_59 +innodb_encrypted_2/t_6 +innodb_encrypted_2/t_60 +innodb_encrypted_2/t_61 +innodb_encrypted_2/t_62 +innodb_encrypted_2/t_63 +innodb_encrypted_2/t_64 +innodb_encrypted_2/t_65 +innodb_encrypted_2/t_66 +innodb_encrypted_2/t_67 +innodb_encrypted_2/t_68 +innodb_encrypted_2/t_69 +innodb_encrypted_2/t_7 +innodb_encrypted_2/t_70 +innodb_encrypted_2/t_71 +innodb_encrypted_2/t_72 +innodb_encrypted_2/t_73 +innodb_encrypted_2/t_74 +innodb_encrypted_2/t_75 +innodb_encrypted_2/t_76 +innodb_encrypted_2/t_77 +innodb_encrypted_2/t_78 +innodb_encrypted_2/t_79 +innodb_encrypted_2/t_8 +innodb_encrypted_2/t_80 +innodb_encrypted_2/t_81 +innodb_encrypted_2/t_82 +innodb_encrypted_2/t_83 +innodb_encrypted_2/t_84 +innodb_encrypted_2/t_85 +innodb_encrypted_2/t_86 +innodb_encrypted_2/t_87 +innodb_encrypted_2/t_88 +innodb_encrypted_2/t_89 +innodb_encrypted_2/t_9 +innodb_encrypted_2/t_90 +innodb_encrypted_2/t_91 +innodb_encrypted_2/t_92 +innodb_encrypted_2/t_93 +innodb_encrypted_2/t_94 +innodb_encrypted_2/t_95 +innodb_encrypted_2/t_96 +innodb_encrypted_2/t_97 +innodb_encrypted_2/t_98 +innodb_encrypted_2/t_99 +# should contain 0 tables +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; +NAME create database innodb_encrypted_3; use innodb_encrypted_3; show status like 'innodb_pages0_read%'; @@ -51,33 +148,626 @@ set autocommit=1; show status like 'innodb_pages0_read%'; Variable_name Value Innodb_pages0_read 3 -# should be 100 -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%'; -COUNT(*) -100 -# should be 200 -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%'; -COUNT(*) -200 +# should contain 100 tables +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; +NAME +innodb_encrypted_2/t_1 +innodb_encrypted_2/t_10 +innodb_encrypted_2/t_100 +innodb_encrypted_2/t_11 +innodb_encrypted_2/t_12 +innodb_encrypted_2/t_13 +innodb_encrypted_2/t_14 +innodb_encrypted_2/t_15 +innodb_encrypted_2/t_16 +innodb_encrypted_2/t_17 +innodb_encrypted_2/t_18 +innodb_encrypted_2/t_19 +innodb_encrypted_2/t_2 +innodb_encrypted_2/t_20 +innodb_encrypted_2/t_21 +innodb_encrypted_2/t_22 +innodb_encrypted_2/t_23 +innodb_encrypted_2/t_24 +innodb_encrypted_2/t_25 +innodb_encrypted_2/t_26 +innodb_encrypted_2/t_27 +innodb_encrypted_2/t_28 +innodb_encrypted_2/t_29 +innodb_encrypted_2/t_3 +innodb_encrypted_2/t_30 +innodb_encrypted_2/t_31 +innodb_encrypted_2/t_32 +innodb_encrypted_2/t_33 +innodb_encrypted_2/t_34 +innodb_encrypted_2/t_35 +innodb_encrypted_2/t_36 +innodb_encrypted_2/t_37 +innodb_encrypted_2/t_38 +innodb_encrypted_2/t_39 +innodb_encrypted_2/t_4 +innodb_encrypted_2/t_40 +innodb_encrypted_2/t_41 +innodb_encrypted_2/t_42 +innodb_encrypted_2/t_43 +innodb_encrypted_2/t_44 +innodb_encrypted_2/t_45 +innodb_encrypted_2/t_46 +innodb_encrypted_2/t_47 +innodb_encrypted_2/t_48 +innodb_encrypted_2/t_49 +innodb_encrypted_2/t_5 +innodb_encrypted_2/t_50 +innodb_encrypted_2/t_51 +innodb_encrypted_2/t_52 +innodb_encrypted_2/t_53 +innodb_encrypted_2/t_54 +innodb_encrypted_2/t_55 +innodb_encrypted_2/t_56 +innodb_encrypted_2/t_57 +innodb_encrypted_2/t_58 +innodb_encrypted_2/t_59 +innodb_encrypted_2/t_6 +innodb_encrypted_2/t_60 +innodb_encrypted_2/t_61 +innodb_encrypted_2/t_62 +innodb_encrypted_2/t_63 +innodb_encrypted_2/t_64 +innodb_encrypted_2/t_65 +innodb_encrypted_2/t_66 +innodb_encrypted_2/t_67 +innodb_encrypted_2/t_68 +innodb_encrypted_2/t_69 +innodb_encrypted_2/t_7 +innodb_encrypted_2/t_70 +innodb_encrypted_2/t_71 +innodb_encrypted_2/t_72 +innodb_encrypted_2/t_73 +innodb_encrypted_2/t_74 +innodb_encrypted_2/t_75 +innodb_encrypted_2/t_76 +innodb_encrypted_2/t_77 +innodb_encrypted_2/t_78 +innodb_encrypted_2/t_79 +innodb_encrypted_2/t_8 +innodb_encrypted_2/t_80 +innodb_encrypted_2/t_81 +innodb_encrypted_2/t_82 +innodb_encrypted_2/t_83 +innodb_encrypted_2/t_84 +innodb_encrypted_2/t_85 +innodb_encrypted_2/t_86 +innodb_encrypted_2/t_87 +innodb_encrypted_2/t_88 +innodb_encrypted_2/t_89 +innodb_encrypted_2/t_9 +innodb_encrypted_2/t_90 +innodb_encrypted_2/t_91 +innodb_encrypted_2/t_92 +innodb_encrypted_2/t_93 +innodb_encrypted_2/t_94 +innodb_encrypted_2/t_95 +innodb_encrypted_2/t_96 +innodb_encrypted_2/t_97 +innodb_encrypted_2/t_98 +innodb_encrypted_2/t_99 +# should contain 100 tables +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; +NAME +innodb_encrypted_3/t_1 +innodb_encrypted_3/t_10 +innodb_encrypted_3/t_100 +innodb_encrypted_3/t_11 +innodb_encrypted_3/t_12 +innodb_encrypted_3/t_13 +innodb_encrypted_3/t_14 +innodb_encrypted_3/t_15 +innodb_encrypted_3/t_16 +innodb_encrypted_3/t_17 +innodb_encrypted_3/t_18 +innodb_encrypted_3/t_19 +innodb_encrypted_3/t_2 +innodb_encrypted_3/t_20 +innodb_encrypted_3/t_21 +innodb_encrypted_3/t_22 +innodb_encrypted_3/t_23 +innodb_encrypted_3/t_24 +innodb_encrypted_3/t_25 +innodb_encrypted_3/t_26 +innodb_encrypted_3/t_27 +innodb_encrypted_3/t_28 +innodb_encrypted_3/t_29 +innodb_encrypted_3/t_3 +innodb_encrypted_3/t_30 +innodb_encrypted_3/t_31 +innodb_encrypted_3/t_32 +innodb_encrypted_3/t_33 +innodb_encrypted_3/t_34 +innodb_encrypted_3/t_35 +innodb_encrypted_3/t_36 +innodb_encrypted_3/t_37 +innodb_encrypted_3/t_38 +innodb_encrypted_3/t_39 +innodb_encrypted_3/t_4 +innodb_encrypted_3/t_40 +innodb_encrypted_3/t_41 +innodb_encrypted_3/t_42 +innodb_encrypted_3/t_43 +innodb_encrypted_3/t_44 +innodb_encrypted_3/t_45 +innodb_encrypted_3/t_46 +innodb_encrypted_3/t_47 +innodb_encrypted_3/t_48 +innodb_encrypted_3/t_49 +innodb_encrypted_3/t_5 +innodb_encrypted_3/t_50 +innodb_encrypted_3/t_51 +innodb_encrypted_3/t_52 +innodb_encrypted_3/t_53 +innodb_encrypted_3/t_54 +innodb_encrypted_3/t_55 +innodb_encrypted_3/t_56 +innodb_encrypted_3/t_57 +innodb_encrypted_3/t_58 +innodb_encrypted_3/t_59 +innodb_encrypted_3/t_6 +innodb_encrypted_3/t_60 +innodb_encrypted_3/t_61 +innodb_encrypted_3/t_62 +innodb_encrypted_3/t_63 +innodb_encrypted_3/t_64 +innodb_encrypted_3/t_65 +innodb_encrypted_3/t_66 +innodb_encrypted_3/t_67 +innodb_encrypted_3/t_68 +innodb_encrypted_3/t_69 +innodb_encrypted_3/t_7 +innodb_encrypted_3/t_70 +innodb_encrypted_3/t_71 +innodb_encrypted_3/t_72 +innodb_encrypted_3/t_73 +innodb_encrypted_3/t_74 +innodb_encrypted_3/t_75 +innodb_encrypted_3/t_76 +innodb_encrypted_3/t_77 +innodb_encrypted_3/t_78 +innodb_encrypted_3/t_79 +innodb_encrypted_3/t_8 +innodb_encrypted_3/t_80 +innodb_encrypted_3/t_81 +innodb_encrypted_3/t_82 +innodb_encrypted_3/t_83 +innodb_encrypted_3/t_84 +innodb_encrypted_3/t_85 +innodb_encrypted_3/t_86 +innodb_encrypted_3/t_87 +innodb_encrypted_3/t_88 +innodb_encrypted_3/t_89 +innodb_encrypted_3/t_9 +innodb_encrypted_3/t_90 +innodb_encrypted_3/t_91 +innodb_encrypted_3/t_92 +innodb_encrypted_3/t_93 +innodb_encrypted_3/t_94 +innodb_encrypted_3/t_95 +innodb_encrypted_3/t_96 +innodb_encrypted_3/t_97 +innodb_encrypted_3/t_98 +innodb_encrypted_3/t_99 use test; show status like 'innodb_pages0_read%'; Variable_name Value Innodb_pages0_read 3 -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%'; -COUNT(*) -100 -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%'; -COUNT(*) -200 +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; +NAME +innodb_encrypted_2/t_1 +innodb_encrypted_2/t_10 +innodb_encrypted_2/t_100 +innodb_encrypted_2/t_11 +innodb_encrypted_2/t_12 +innodb_encrypted_2/t_13 +innodb_encrypted_2/t_14 +innodb_encrypted_2/t_15 +innodb_encrypted_2/t_16 +innodb_encrypted_2/t_17 +innodb_encrypted_2/t_18 +innodb_encrypted_2/t_19 +innodb_encrypted_2/t_2 +innodb_encrypted_2/t_20 +innodb_encrypted_2/t_21 +innodb_encrypted_2/t_22 +innodb_encrypted_2/t_23 +innodb_encrypted_2/t_24 +innodb_encrypted_2/t_25 +innodb_encrypted_2/t_26 +innodb_encrypted_2/t_27 +innodb_encrypted_2/t_28 +innodb_encrypted_2/t_29 +innodb_encrypted_2/t_3 +innodb_encrypted_2/t_30 +innodb_encrypted_2/t_31 +innodb_encrypted_2/t_32 +innodb_encrypted_2/t_33 +innodb_encrypted_2/t_34 +innodb_encrypted_2/t_35 +innodb_encrypted_2/t_36 +innodb_encrypted_2/t_37 +innodb_encrypted_2/t_38 +innodb_encrypted_2/t_39 +innodb_encrypted_2/t_4 +innodb_encrypted_2/t_40 +innodb_encrypted_2/t_41 +innodb_encrypted_2/t_42 +innodb_encrypted_2/t_43 +innodb_encrypted_2/t_44 +innodb_encrypted_2/t_45 +innodb_encrypted_2/t_46 +innodb_encrypted_2/t_47 +innodb_encrypted_2/t_48 +innodb_encrypted_2/t_49 +innodb_encrypted_2/t_5 +innodb_encrypted_2/t_50 +innodb_encrypted_2/t_51 +innodb_encrypted_2/t_52 +innodb_encrypted_2/t_53 +innodb_encrypted_2/t_54 +innodb_encrypted_2/t_55 +innodb_encrypted_2/t_56 +innodb_encrypted_2/t_57 +innodb_encrypted_2/t_58 +innodb_encrypted_2/t_59 +innodb_encrypted_2/t_6 +innodb_encrypted_2/t_60 +innodb_encrypted_2/t_61 +innodb_encrypted_2/t_62 +innodb_encrypted_2/t_63 +innodb_encrypted_2/t_64 +innodb_encrypted_2/t_65 +innodb_encrypted_2/t_66 +innodb_encrypted_2/t_67 +innodb_encrypted_2/t_68 +innodb_encrypted_2/t_69 +innodb_encrypted_2/t_7 +innodb_encrypted_2/t_70 +innodb_encrypted_2/t_71 +innodb_encrypted_2/t_72 +innodb_encrypted_2/t_73 +innodb_encrypted_2/t_74 +innodb_encrypted_2/t_75 +innodb_encrypted_2/t_76 +innodb_encrypted_2/t_77 +innodb_encrypted_2/t_78 +innodb_encrypted_2/t_79 +innodb_encrypted_2/t_8 +innodb_encrypted_2/t_80 +innodb_encrypted_2/t_81 +innodb_encrypted_2/t_82 +innodb_encrypted_2/t_83 +innodb_encrypted_2/t_84 +innodb_encrypted_2/t_85 +innodb_encrypted_2/t_86 +innodb_encrypted_2/t_87 +innodb_encrypted_2/t_88 +innodb_encrypted_2/t_89 +innodb_encrypted_2/t_9 +innodb_encrypted_2/t_90 +innodb_encrypted_2/t_91 +innodb_encrypted_2/t_92 +innodb_encrypted_2/t_93 +innodb_encrypted_2/t_94 +innodb_encrypted_2/t_95 +innodb_encrypted_2/t_96 +innodb_encrypted_2/t_97 +innodb_encrypted_2/t_98 +innodb_encrypted_2/t_99 +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; +NAME +innodb_encrypted_3/t_1 +innodb_encrypted_3/t_10 +innodb_encrypted_3/t_100 +innodb_encrypted_3/t_11 +innodb_encrypted_3/t_12 +innodb_encrypted_3/t_13 +innodb_encrypted_3/t_14 +innodb_encrypted_3/t_15 +innodb_encrypted_3/t_16 +innodb_encrypted_3/t_17 +innodb_encrypted_3/t_18 +innodb_encrypted_3/t_19 +innodb_encrypted_3/t_2 +innodb_encrypted_3/t_20 +innodb_encrypted_3/t_21 +innodb_encrypted_3/t_22 +innodb_encrypted_3/t_23 +innodb_encrypted_3/t_24 +innodb_encrypted_3/t_25 +innodb_encrypted_3/t_26 +innodb_encrypted_3/t_27 +innodb_encrypted_3/t_28 +innodb_encrypted_3/t_29 +innodb_encrypted_3/t_3 +innodb_encrypted_3/t_30 +innodb_encrypted_3/t_31 +innodb_encrypted_3/t_32 +innodb_encrypted_3/t_33 +innodb_encrypted_3/t_34 +innodb_encrypted_3/t_35 +innodb_encrypted_3/t_36 +innodb_encrypted_3/t_37 +innodb_encrypted_3/t_38 +innodb_encrypted_3/t_39 +innodb_encrypted_3/t_4 +innodb_encrypted_3/t_40 +innodb_encrypted_3/t_41 +innodb_encrypted_3/t_42 +innodb_encrypted_3/t_43 +innodb_encrypted_3/t_44 +innodb_encrypted_3/t_45 +innodb_encrypted_3/t_46 +innodb_encrypted_3/t_47 +innodb_encrypted_3/t_48 +innodb_encrypted_3/t_49 +innodb_encrypted_3/t_5 +innodb_encrypted_3/t_50 +innodb_encrypted_3/t_51 +innodb_encrypted_3/t_52 +innodb_encrypted_3/t_53 +innodb_encrypted_3/t_54 +innodb_encrypted_3/t_55 +innodb_encrypted_3/t_56 +innodb_encrypted_3/t_57 +innodb_encrypted_3/t_58 +innodb_encrypted_3/t_59 +innodb_encrypted_3/t_6 +innodb_encrypted_3/t_60 +innodb_encrypted_3/t_61 +innodb_encrypted_3/t_62 +innodb_encrypted_3/t_63 +innodb_encrypted_3/t_64 +innodb_encrypted_3/t_65 +innodb_encrypted_3/t_66 +innodb_encrypted_3/t_67 +innodb_encrypted_3/t_68 +innodb_encrypted_3/t_69 +innodb_encrypted_3/t_7 +innodb_encrypted_3/t_70 +innodb_encrypted_3/t_71 +innodb_encrypted_3/t_72 +innodb_encrypted_3/t_73 +innodb_encrypted_3/t_74 +innodb_encrypted_3/t_75 +innodb_encrypted_3/t_76 +innodb_encrypted_3/t_77 +innodb_encrypted_3/t_78 +innodb_encrypted_3/t_79 +innodb_encrypted_3/t_8 +innodb_encrypted_3/t_80 +innodb_encrypted_3/t_81 +innodb_encrypted_3/t_82 +innodb_encrypted_3/t_83 +innodb_encrypted_3/t_84 +innodb_encrypted_3/t_85 +innodb_encrypted_3/t_86 +innodb_encrypted_3/t_87 +innodb_encrypted_3/t_88 +innodb_encrypted_3/t_89 +innodb_encrypted_3/t_9 +innodb_encrypted_3/t_90 +innodb_encrypted_3/t_91 +innodb_encrypted_3/t_92 +innodb_encrypted_3/t_93 +innodb_encrypted_3/t_94 +innodb_encrypted_3/t_95 +innodb_encrypted_3/t_96 +innodb_encrypted_3/t_97 +innodb_encrypted_3/t_98 +innodb_encrypted_3/t_99 SET GLOBAL innodb_encrypt_tables = on; SET GLOBAL innodb_encryption_threads=4; -# Wait until all encrypted tables have been encrypted -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%'; -COUNT(*) -200 -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%'; -COUNT(*) -100 +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; +NAME +innodb_encrypted_2/t_1 +innodb_encrypted_2/t_10 +innodb_encrypted_2/t_100 +innodb_encrypted_2/t_11 +innodb_encrypted_2/t_12 +innodb_encrypted_2/t_13 +innodb_encrypted_2/t_14 +innodb_encrypted_2/t_15 +innodb_encrypted_2/t_16 +innodb_encrypted_2/t_17 +innodb_encrypted_2/t_18 +innodb_encrypted_2/t_19 +innodb_encrypted_2/t_2 +innodb_encrypted_2/t_20 +innodb_encrypted_2/t_21 +innodb_encrypted_2/t_22 +innodb_encrypted_2/t_23 +innodb_encrypted_2/t_24 +innodb_encrypted_2/t_25 +innodb_encrypted_2/t_26 +innodb_encrypted_2/t_27 +innodb_encrypted_2/t_28 +innodb_encrypted_2/t_29 +innodb_encrypted_2/t_3 +innodb_encrypted_2/t_30 +innodb_encrypted_2/t_31 +innodb_encrypted_2/t_32 +innodb_encrypted_2/t_33 +innodb_encrypted_2/t_34 +innodb_encrypted_2/t_35 +innodb_encrypted_2/t_36 +innodb_encrypted_2/t_37 +innodb_encrypted_2/t_38 +innodb_encrypted_2/t_39 +innodb_encrypted_2/t_4 +innodb_encrypted_2/t_40 +innodb_encrypted_2/t_41 +innodb_encrypted_2/t_42 +innodb_encrypted_2/t_43 +innodb_encrypted_2/t_44 +innodb_encrypted_2/t_45 +innodb_encrypted_2/t_46 +innodb_encrypted_2/t_47 +innodb_encrypted_2/t_48 +innodb_encrypted_2/t_49 +innodb_encrypted_2/t_5 +innodb_encrypted_2/t_50 +innodb_encrypted_2/t_51 +innodb_encrypted_2/t_52 +innodb_encrypted_2/t_53 +innodb_encrypted_2/t_54 +innodb_encrypted_2/t_55 +innodb_encrypted_2/t_56 +innodb_encrypted_2/t_57 +innodb_encrypted_2/t_58 +innodb_encrypted_2/t_59 +innodb_encrypted_2/t_6 +innodb_encrypted_2/t_60 +innodb_encrypted_2/t_61 +innodb_encrypted_2/t_62 +innodb_encrypted_2/t_63 +innodb_encrypted_2/t_64 +innodb_encrypted_2/t_65 +innodb_encrypted_2/t_66 +innodb_encrypted_2/t_67 +innodb_encrypted_2/t_68 +innodb_encrypted_2/t_69 +innodb_encrypted_2/t_7 +innodb_encrypted_2/t_70 +innodb_encrypted_2/t_71 +innodb_encrypted_2/t_72 +innodb_encrypted_2/t_73 +innodb_encrypted_2/t_74 +innodb_encrypted_2/t_75 +innodb_encrypted_2/t_76 +innodb_encrypted_2/t_77 +innodb_encrypted_2/t_78 +innodb_encrypted_2/t_79 +innodb_encrypted_2/t_8 +innodb_encrypted_2/t_80 +innodb_encrypted_2/t_81 +innodb_encrypted_2/t_82 +innodb_encrypted_2/t_83 +innodb_encrypted_2/t_84 +innodb_encrypted_2/t_85 +innodb_encrypted_2/t_86 +innodb_encrypted_2/t_87 +innodb_encrypted_2/t_88 +innodb_encrypted_2/t_89 +innodb_encrypted_2/t_9 +innodb_encrypted_2/t_90 +innodb_encrypted_2/t_91 +innodb_encrypted_2/t_92 +innodb_encrypted_2/t_93 +innodb_encrypted_2/t_94 +innodb_encrypted_2/t_95 +innodb_encrypted_2/t_96 +innodb_encrypted_2/t_97 +innodb_encrypted_2/t_98 +innodb_encrypted_2/t_99 +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; +NAME +innodb_encrypted_3/t_1 +innodb_encrypted_3/t_10 +innodb_encrypted_3/t_100 +innodb_encrypted_3/t_11 +innodb_encrypted_3/t_12 +innodb_encrypted_3/t_13 +innodb_encrypted_3/t_14 +innodb_encrypted_3/t_15 +innodb_encrypted_3/t_16 +innodb_encrypted_3/t_17 +innodb_encrypted_3/t_18 +innodb_encrypted_3/t_19 +innodb_encrypted_3/t_2 +innodb_encrypted_3/t_20 +innodb_encrypted_3/t_21 +innodb_encrypted_3/t_22 +innodb_encrypted_3/t_23 +innodb_encrypted_3/t_24 +innodb_encrypted_3/t_25 +innodb_encrypted_3/t_26 +innodb_encrypted_3/t_27 +innodb_encrypted_3/t_28 +innodb_encrypted_3/t_29 +innodb_encrypted_3/t_3 +innodb_encrypted_3/t_30 +innodb_encrypted_3/t_31 +innodb_encrypted_3/t_32 +innodb_encrypted_3/t_33 +innodb_encrypted_3/t_34 +innodb_encrypted_3/t_35 +innodb_encrypted_3/t_36 +innodb_encrypted_3/t_37 +innodb_encrypted_3/t_38 +innodb_encrypted_3/t_39 +innodb_encrypted_3/t_4 +innodb_encrypted_3/t_40 +innodb_encrypted_3/t_41 +innodb_encrypted_3/t_42 +innodb_encrypted_3/t_43 +innodb_encrypted_3/t_44 +innodb_encrypted_3/t_45 +innodb_encrypted_3/t_46 +innodb_encrypted_3/t_47 +innodb_encrypted_3/t_48 +innodb_encrypted_3/t_49 +innodb_encrypted_3/t_5 +innodb_encrypted_3/t_50 +innodb_encrypted_3/t_51 +innodb_encrypted_3/t_52 +innodb_encrypted_3/t_53 +innodb_encrypted_3/t_54 +innodb_encrypted_3/t_55 +innodb_encrypted_3/t_56 +innodb_encrypted_3/t_57 +innodb_encrypted_3/t_58 +innodb_encrypted_3/t_59 +innodb_encrypted_3/t_6 +innodb_encrypted_3/t_60 +innodb_encrypted_3/t_61 +innodb_encrypted_3/t_62 +innodb_encrypted_3/t_63 +innodb_encrypted_3/t_64 +innodb_encrypted_3/t_65 +innodb_encrypted_3/t_66 +innodb_encrypted_3/t_67 +innodb_encrypted_3/t_68 +innodb_encrypted_3/t_69 +innodb_encrypted_3/t_7 +innodb_encrypted_3/t_70 +innodb_encrypted_3/t_71 +innodb_encrypted_3/t_72 +innodb_encrypted_3/t_73 +innodb_encrypted_3/t_74 +innodb_encrypted_3/t_75 +innodb_encrypted_3/t_76 +innodb_encrypted_3/t_77 +innodb_encrypted_3/t_78 +innodb_encrypted_3/t_79 +innodb_encrypted_3/t_8 +innodb_encrypted_3/t_80 +innodb_encrypted_3/t_81 +innodb_encrypted_3/t_82 +innodb_encrypted_3/t_83 +innodb_encrypted_3/t_84 +innodb_encrypted_3/t_85 +innodb_encrypted_3/t_86 +innodb_encrypted_3/t_87 +innodb_encrypted_3/t_88 +innodb_encrypted_3/t_89 +innodb_encrypted_3/t_9 +innodb_encrypted_3/t_90 +innodb_encrypted_3/t_91 +innodb_encrypted_3/t_92 +innodb_encrypted_3/t_93 +innodb_encrypted_3/t_94 +innodb_encrypted_3/t_95 +innodb_encrypted_3/t_96 +innodb_encrypted_3/t_97 +innodb_encrypted_3/t_98 +innodb_encrypted_3/t_99 show status like 'innodb_pages0_read%'; Variable_name Value Innodb_pages0_read 3 @@ -127,26 +817,416 @@ Innodb_pages0_read 303 show status like 'innodb_pages0_read%'; Variable_name Value Innodb_pages0_read 303 -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%'; -COUNT(*) -100 -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%'; -COUNT(*) -200 +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; +NAME +innodb_encrypted_3/t_1 +innodb_encrypted_3/t_10 +innodb_encrypted_3/t_100 +innodb_encrypted_3/t_11 +innodb_encrypted_3/t_12 +innodb_encrypted_3/t_13 +innodb_encrypted_3/t_14 +innodb_encrypted_3/t_15 +innodb_encrypted_3/t_16 +innodb_encrypted_3/t_17 +innodb_encrypted_3/t_18 +innodb_encrypted_3/t_19 +innodb_encrypted_3/t_2 +innodb_encrypted_3/t_20 +innodb_encrypted_3/t_21 +innodb_encrypted_3/t_22 +innodb_encrypted_3/t_23 +innodb_encrypted_3/t_24 +innodb_encrypted_3/t_25 +innodb_encrypted_3/t_26 +innodb_encrypted_3/t_27 +innodb_encrypted_3/t_28 +innodb_encrypted_3/t_29 +innodb_encrypted_3/t_3 +innodb_encrypted_3/t_30 +innodb_encrypted_3/t_31 +innodb_encrypted_3/t_32 +innodb_encrypted_3/t_33 +innodb_encrypted_3/t_34 +innodb_encrypted_3/t_35 +innodb_encrypted_3/t_36 +innodb_encrypted_3/t_37 +innodb_encrypted_3/t_38 +innodb_encrypted_3/t_39 +innodb_encrypted_3/t_4 +innodb_encrypted_3/t_40 +innodb_encrypted_3/t_41 +innodb_encrypted_3/t_42 +innodb_encrypted_3/t_43 +innodb_encrypted_3/t_44 +innodb_encrypted_3/t_45 +innodb_encrypted_3/t_46 +innodb_encrypted_3/t_47 +innodb_encrypted_3/t_48 +innodb_encrypted_3/t_49 +innodb_encrypted_3/t_5 +innodb_encrypted_3/t_50 +innodb_encrypted_3/t_51 +innodb_encrypted_3/t_52 +innodb_encrypted_3/t_53 +innodb_encrypted_3/t_54 +innodb_encrypted_3/t_55 +innodb_encrypted_3/t_56 +innodb_encrypted_3/t_57 +innodb_encrypted_3/t_58 +innodb_encrypted_3/t_59 +innodb_encrypted_3/t_6 +innodb_encrypted_3/t_60 +innodb_encrypted_3/t_61 +innodb_encrypted_3/t_62 +innodb_encrypted_3/t_63 +innodb_encrypted_3/t_64 +innodb_encrypted_3/t_65 +innodb_encrypted_3/t_66 +innodb_encrypted_3/t_67 +innodb_encrypted_3/t_68 +innodb_encrypted_3/t_69 +innodb_encrypted_3/t_7 +innodb_encrypted_3/t_70 +innodb_encrypted_3/t_71 +innodb_encrypted_3/t_72 +innodb_encrypted_3/t_73 +innodb_encrypted_3/t_74 +innodb_encrypted_3/t_75 +innodb_encrypted_3/t_76 +innodb_encrypted_3/t_77 +innodb_encrypted_3/t_78 +innodb_encrypted_3/t_79 +innodb_encrypted_3/t_8 +innodb_encrypted_3/t_80 +innodb_encrypted_3/t_81 +innodb_encrypted_3/t_82 +innodb_encrypted_3/t_83 +innodb_encrypted_3/t_84 +innodb_encrypted_3/t_85 +innodb_encrypted_3/t_86 +innodb_encrypted_3/t_87 +innodb_encrypted_3/t_88 +innodb_encrypted_3/t_89 +innodb_encrypted_3/t_9 +innodb_encrypted_3/t_90 +innodb_encrypted_3/t_91 +innodb_encrypted_3/t_92 +innodb_encrypted_3/t_93 +innodb_encrypted_3/t_94 +innodb_encrypted_3/t_95 +innodb_encrypted_3/t_96 +innodb_encrypted_3/t_97 +innodb_encrypted_3/t_98 +innodb_encrypted_3/t_99 +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; +NAME +innodb_encrypted_2/t_1 +innodb_encrypted_2/t_10 +innodb_encrypted_2/t_100 +innodb_encrypted_2/t_11 +innodb_encrypted_2/t_12 +innodb_encrypted_2/t_13 +innodb_encrypted_2/t_14 +innodb_encrypted_2/t_15 +innodb_encrypted_2/t_16 +innodb_encrypted_2/t_17 +innodb_encrypted_2/t_18 +innodb_encrypted_2/t_19 +innodb_encrypted_2/t_2 +innodb_encrypted_2/t_20 +innodb_encrypted_2/t_21 +innodb_encrypted_2/t_22 +innodb_encrypted_2/t_23 +innodb_encrypted_2/t_24 +innodb_encrypted_2/t_25 +innodb_encrypted_2/t_26 +innodb_encrypted_2/t_27 +innodb_encrypted_2/t_28 +innodb_encrypted_2/t_29 +innodb_encrypted_2/t_3 +innodb_encrypted_2/t_30 +innodb_encrypted_2/t_31 +innodb_encrypted_2/t_32 +innodb_encrypted_2/t_33 +innodb_encrypted_2/t_34 +innodb_encrypted_2/t_35 +innodb_encrypted_2/t_36 +innodb_encrypted_2/t_37 +innodb_encrypted_2/t_38 +innodb_encrypted_2/t_39 +innodb_encrypted_2/t_4 +innodb_encrypted_2/t_40 +innodb_encrypted_2/t_41 +innodb_encrypted_2/t_42 +innodb_encrypted_2/t_43 +innodb_encrypted_2/t_44 +innodb_encrypted_2/t_45 +innodb_encrypted_2/t_46 +innodb_encrypted_2/t_47 +innodb_encrypted_2/t_48 +innodb_encrypted_2/t_49 +innodb_encrypted_2/t_5 +innodb_encrypted_2/t_50 +innodb_encrypted_2/t_51 +innodb_encrypted_2/t_52 +innodb_encrypted_2/t_53 +innodb_encrypted_2/t_54 +innodb_encrypted_2/t_55 +innodb_encrypted_2/t_56 +innodb_encrypted_2/t_57 +innodb_encrypted_2/t_58 +innodb_encrypted_2/t_59 +innodb_encrypted_2/t_6 +innodb_encrypted_2/t_60 +innodb_encrypted_2/t_61 +innodb_encrypted_2/t_62 +innodb_encrypted_2/t_63 +innodb_encrypted_2/t_64 +innodb_encrypted_2/t_65 +innodb_encrypted_2/t_66 +innodb_encrypted_2/t_67 +innodb_encrypted_2/t_68 +innodb_encrypted_2/t_69 +innodb_encrypted_2/t_7 +innodb_encrypted_2/t_70 +innodb_encrypted_2/t_71 +innodb_encrypted_2/t_72 +innodb_encrypted_2/t_73 +innodb_encrypted_2/t_74 +innodb_encrypted_2/t_75 +innodb_encrypted_2/t_76 +innodb_encrypted_2/t_77 +innodb_encrypted_2/t_78 +innodb_encrypted_2/t_79 +innodb_encrypted_2/t_8 +innodb_encrypted_2/t_80 +innodb_encrypted_2/t_81 +innodb_encrypted_2/t_82 +innodb_encrypted_2/t_83 +innodb_encrypted_2/t_84 +innodb_encrypted_2/t_85 +innodb_encrypted_2/t_86 +innodb_encrypted_2/t_87 +innodb_encrypted_2/t_88 +innodb_encrypted_2/t_89 +innodb_encrypted_2/t_9 +innodb_encrypted_2/t_90 +innodb_encrypted_2/t_91 +innodb_encrypted_2/t_92 +innodb_encrypted_2/t_93 +innodb_encrypted_2/t_94 +innodb_encrypted_2/t_95 +innodb_encrypted_2/t_96 +innodb_encrypted_2/t_97 +innodb_encrypted_2/t_98 +innodb_encrypted_2/t_99 SET GLOBAL innodb_encrypt_tables = off; SET GLOBAL innodb_encryption_threads=4; -# Wait until all default encrypted tables have been decrypted -# should be 100 -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%'; -COUNT(*) -100 -# should be 200 -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%'; -COUNT(*) -200 -show status like 'innodb_pages0_read%'; -Variable_name Value -Innodb_pages0_read 303 +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; +NAME +innodb_encrypted_2/t_1 +innodb_encrypted_2/t_10 +innodb_encrypted_2/t_100 +innodb_encrypted_2/t_11 +innodb_encrypted_2/t_12 +innodb_encrypted_2/t_13 +innodb_encrypted_2/t_14 +innodb_encrypted_2/t_15 +innodb_encrypted_2/t_16 +innodb_encrypted_2/t_17 +innodb_encrypted_2/t_18 +innodb_encrypted_2/t_19 +innodb_encrypted_2/t_2 +innodb_encrypted_2/t_20 +innodb_encrypted_2/t_21 +innodb_encrypted_2/t_22 +innodb_encrypted_2/t_23 +innodb_encrypted_2/t_24 +innodb_encrypted_2/t_25 +innodb_encrypted_2/t_26 +innodb_encrypted_2/t_27 +innodb_encrypted_2/t_28 +innodb_encrypted_2/t_29 +innodb_encrypted_2/t_3 +innodb_encrypted_2/t_30 +innodb_encrypted_2/t_31 +innodb_encrypted_2/t_32 +innodb_encrypted_2/t_33 +innodb_encrypted_2/t_34 +innodb_encrypted_2/t_35 +innodb_encrypted_2/t_36 +innodb_encrypted_2/t_37 +innodb_encrypted_2/t_38 +innodb_encrypted_2/t_39 +innodb_encrypted_2/t_4 +innodb_encrypted_2/t_40 +innodb_encrypted_2/t_41 +innodb_encrypted_2/t_42 +innodb_encrypted_2/t_43 +innodb_encrypted_2/t_44 +innodb_encrypted_2/t_45 +innodb_encrypted_2/t_46 +innodb_encrypted_2/t_47 +innodb_encrypted_2/t_48 +innodb_encrypted_2/t_49 +innodb_encrypted_2/t_5 +innodb_encrypted_2/t_50 +innodb_encrypted_2/t_51 +innodb_encrypted_2/t_52 +innodb_encrypted_2/t_53 +innodb_encrypted_2/t_54 +innodb_encrypted_2/t_55 +innodb_encrypted_2/t_56 +innodb_encrypted_2/t_57 +innodb_encrypted_2/t_58 +innodb_encrypted_2/t_59 +innodb_encrypted_2/t_6 +innodb_encrypted_2/t_60 +innodb_encrypted_2/t_61 +innodb_encrypted_2/t_62 +innodb_encrypted_2/t_63 +innodb_encrypted_2/t_64 +innodb_encrypted_2/t_65 +innodb_encrypted_2/t_66 +innodb_encrypted_2/t_67 +innodb_encrypted_2/t_68 +innodb_encrypted_2/t_69 +innodb_encrypted_2/t_7 +innodb_encrypted_2/t_70 +innodb_encrypted_2/t_71 +innodb_encrypted_2/t_72 +innodb_encrypted_2/t_73 +innodb_encrypted_2/t_74 +innodb_encrypted_2/t_75 +innodb_encrypted_2/t_76 +innodb_encrypted_2/t_77 +innodb_encrypted_2/t_78 +innodb_encrypted_2/t_79 +innodb_encrypted_2/t_8 +innodb_encrypted_2/t_80 +innodb_encrypted_2/t_81 +innodb_encrypted_2/t_82 +innodb_encrypted_2/t_83 +innodb_encrypted_2/t_84 +innodb_encrypted_2/t_85 +innodb_encrypted_2/t_86 +innodb_encrypted_2/t_87 +innodb_encrypted_2/t_88 +innodb_encrypted_2/t_89 +innodb_encrypted_2/t_9 +innodb_encrypted_2/t_90 +innodb_encrypted_2/t_91 +innodb_encrypted_2/t_92 +innodb_encrypted_2/t_93 +innodb_encrypted_2/t_94 +innodb_encrypted_2/t_95 +innodb_encrypted_2/t_96 +innodb_encrypted_2/t_97 +innodb_encrypted_2/t_98 +innodb_encrypted_2/t_99 +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; +NAME +innodb_encrypted_3/t_1 +innodb_encrypted_3/t_10 +innodb_encrypted_3/t_100 +innodb_encrypted_3/t_11 +innodb_encrypted_3/t_12 +innodb_encrypted_3/t_13 +innodb_encrypted_3/t_14 +innodb_encrypted_3/t_15 +innodb_encrypted_3/t_16 +innodb_encrypted_3/t_17 +innodb_encrypted_3/t_18 +innodb_encrypted_3/t_19 +innodb_encrypted_3/t_2 +innodb_encrypted_3/t_20 +innodb_encrypted_3/t_21 +innodb_encrypted_3/t_22 +innodb_encrypted_3/t_23 +innodb_encrypted_3/t_24 +innodb_encrypted_3/t_25 +innodb_encrypted_3/t_26 +innodb_encrypted_3/t_27 +innodb_encrypted_3/t_28 +innodb_encrypted_3/t_29 +innodb_encrypted_3/t_3 +innodb_encrypted_3/t_30 +innodb_encrypted_3/t_31 +innodb_encrypted_3/t_32 +innodb_encrypted_3/t_33 +innodb_encrypted_3/t_34 +innodb_encrypted_3/t_35 +innodb_encrypted_3/t_36 +innodb_encrypted_3/t_37 +innodb_encrypted_3/t_38 +innodb_encrypted_3/t_39 +innodb_encrypted_3/t_4 +innodb_encrypted_3/t_40 +innodb_encrypted_3/t_41 +innodb_encrypted_3/t_42 +innodb_encrypted_3/t_43 +innodb_encrypted_3/t_44 +innodb_encrypted_3/t_45 +innodb_encrypted_3/t_46 +innodb_encrypted_3/t_47 +innodb_encrypted_3/t_48 +innodb_encrypted_3/t_49 +innodb_encrypted_3/t_5 +innodb_encrypted_3/t_50 +innodb_encrypted_3/t_51 +innodb_encrypted_3/t_52 +innodb_encrypted_3/t_53 +innodb_encrypted_3/t_54 +innodb_encrypted_3/t_55 +innodb_encrypted_3/t_56 +innodb_encrypted_3/t_57 +innodb_encrypted_3/t_58 +innodb_encrypted_3/t_59 +innodb_encrypted_3/t_6 +innodb_encrypted_3/t_60 +innodb_encrypted_3/t_61 +innodb_encrypted_3/t_62 +innodb_encrypted_3/t_63 +innodb_encrypted_3/t_64 +innodb_encrypted_3/t_65 +innodb_encrypted_3/t_66 +innodb_encrypted_3/t_67 +innodb_encrypted_3/t_68 +innodb_encrypted_3/t_69 +innodb_encrypted_3/t_7 +innodb_encrypted_3/t_70 +innodb_encrypted_3/t_71 +innodb_encrypted_3/t_72 +innodb_encrypted_3/t_73 +innodb_encrypted_3/t_74 +innodb_encrypted_3/t_75 +innodb_encrypted_3/t_76 +innodb_encrypted_3/t_77 +innodb_encrypted_3/t_78 +innodb_encrypted_3/t_79 +innodb_encrypted_3/t_8 +innodb_encrypted_3/t_80 +innodb_encrypted_3/t_81 +innodb_encrypted_3/t_82 +innodb_encrypted_3/t_83 +innodb_encrypted_3/t_84 +innodb_encrypted_3/t_85 +innodb_encrypted_3/t_86 +innodb_encrypted_3/t_87 +innodb_encrypted_3/t_88 +innodb_encrypted_3/t_89 +innodb_encrypted_3/t_9 +innodb_encrypted_3/t_90 +innodb_encrypted_3/t_91 +innodb_encrypted_3/t_92 +innodb_encrypted_3/t_93 +innodb_encrypted_3/t_94 +innodb_encrypted_3/t_95 +innodb_encrypted_3/t_96 +innodb_encrypted_3/t_97 +innodb_encrypted_3/t_98 +innodb_encrypted_3/t_99 use test; drop database innodb_encrypted_1; drop database innodb_encrypted_2; diff --git a/mysql-test/suite/encryption/r/innodb_onlinealter_encryption.result b/mysql-test/suite/encryption/r/innodb_onlinealter_encryption.result index 26765229a2e..f75268f3290 100644 --- a/mysql-test/suite/encryption/r/innodb_onlinealter_encryption.result +++ b/mysql-test/suite/encryption/r/innodb_onlinealter_encryption.result @@ -10,8 +10,8 @@ begin declare current_num int; set current_num = 0; while current_num < repeat_count do -insert into t1 values (current_num,repeat('foobar',42)); -insert into t2 values (current_num,repeat('temp', 42)); +insert into t1 values (current_num,repeat('foobar',12)); +insert into t2 values (current_num,repeat('tempsecret', 12)); insert into t3 values (current_num,repeat('barfoo',42)); insert into t4 values (current_num,repeat('repeat',42)); insert into t5 values (current_num,substring('A BC DEF GHIJ KLM NOPQRS TUV WXYZ 012 3456789', rand()*36+1, 100), repeat('author new',22)); @@ -29,7 +29,7 @@ set autocommit=1; # t1 yes on expecting NOT FOUND NOT FOUND /foobar/ in t1.ibd # t2 ... on expecting NOT FOUND -NOT FOUND /temp/ in t2.ibd +NOT FOUND /tempsecret/ in t2.ibd # t3 ... on expecting NOT FOUND NOT FOUND /barfoo/ in t3.ibd # t4 ... on expecting NOT FOUND @@ -124,7 +124,7 @@ t7 CREATE TABLE `t7` ( # t1 yes on expecting NOT FOUND NOT FOUND /foobar/ in t1.ibd # t2 ... on expecting NOT FOUND -NOT FOUND /temp/ in t2.ibd +NOT FOUND /tempsecret/ in t2.ibd # t3 ... on expecting NOT FOUND NOT FOUND /barfoo/ in t3.ibd # t4 ... on expecting NOT FOUND diff --git a/mysql-test/suite/encryption/r/innodb_scrub.result b/mysql-test/suite/encryption/r/innodb_scrub.result index e3dd48b2c51..6e8febc762d 100644 --- a/mysql-test/suite/encryption/r/innodb_scrub.result +++ b/mysql-test/suite/encryption/r/innodb_scrub.result @@ -1,6 +1,6 @@ create table snapshot_status engine = myisam select * from information_schema.global_status -where variable_name like 'innodb_scrub_background%'; +where variable_name like 'innodb_scrub%'; # MDEV-8139 Fix scrubbing tests # FIXME: Add index(b) to each table; ensure that undo logs are scrubbed. create table delete_3 ( diff --git a/mysql-test/suite/encryption/r/second_plugin-12863.result b/mysql-test/suite/encryption/r/second_plugin-12863.result new file mode 100644 index 00000000000..8775b1b8fb3 --- /dev/null +++ b/mysql-test/suite/encryption/r/second_plugin-12863.result @@ -0,0 +1,7 @@ +call mtr.add_suppression('debug.key.management'); +install soname 'debug_key_management'; +ERROR HY000: Can't initialize function 'debug_key_management'; Plugin initialization function failed. +create table t1 (a varchar(255)) engine=innodb encrypted=yes; +create table t2 (a varchar(255)) engine=innodb; +create table t3 (a varchar(255)) engine=innodb encrypted=no; +drop table t1, t2, t3; diff --git a/mysql-test/suite/encryption/t/create_or_replace.test b/mysql-test/suite/encryption/t/create_or_replace.test index 98d5b7cc017..3b2970e5162 100644 --- a/mysql-test/suite/encryption/t/create_or_replace.test +++ b/mysql-test/suite/encryption/t/create_or_replace.test @@ -7,9 +7,6 @@ # # MDEV-8164: Server crashes in pfs_mutex_enter_func after fil_crypt_is_closing or alike # - -call mtr.add_suppression("InnoDB: Error: trying to do an operation on a dropped tablespace.*"); - SET default_storage_engine = InnoDB; CREATE TABLE t1 (pk INT PRIMARY KEY, c VARCHAR(256)); diff --git a/mysql-test/suite/encryption/t/encrypt_and_grep.opt b/mysql-test/suite/encryption/t/encrypt_and_grep.opt index 5c9aaf65b06..c50ec719307 100644 --- a/mysql-test/suite/encryption/t/encrypt_and_grep.opt +++ b/mysql-test/suite/encryption/t/encrypt_and_grep.opt @@ -1,7 +1,7 @@ --innodb-encrypt-tables=ON --innodb-encrypt-log=ON --innodb-encryption-rotate-key-age=15 ---innodb-encryption-threads=1 +--innodb-encryption-threads=4 --innodb-tablespaces-encryption diff --git a/mysql-test/suite/encryption/t/encrypt_and_grep.test b/mysql-test/suite/encryption/t/encrypt_and_grep.test index 2ef69db237d..c5a10620f6e 100644 --- a/mysql-test/suite/encryption/t/encrypt_and_grep.test +++ b/mysql-test/suite/encryption/t/encrypt_and_grep.test @@ -14,15 +14,19 @@ --let t3_IBD = $MYSQLD_DATADIR/test/t3.ibd --let SEARCH_RANGE = 10000000 +--disable_warnings SET GLOBAL innodb_file_per_table = ON; +SET GLOBAL innodb_file_format = `Barracuda`; +--enable_warnings create table t1 (a varchar(255)) engine=innodb encrypted=yes; create table t2 (a varchar(255)) engine=innodb; +show warnings; create table t3 (a varchar(255)) engine=innodb encrypted=no; -insert t1 values (repeat('foobar', 42)); -insert t2 values (repeat('temp', 42)); -insert t3 values (repeat('dummy', 42)); +insert t1 values (repeat('foobarsecret', 12)); +insert t2 values (repeat('tempsecret', 12)); +insert t3 values (repeat('dummysecret', 12)); --echo # Wait max 10 min for key encryption threads to encrypt all spaces --let $wait_timeout= 600 @@ -34,19 +38,19 @@ SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_ --source include/shutdown_mysqld.inc ---let SEARCH_PATTERN=foobar +--let SEARCH_PATTERN=foobarsecret --echo # t1 yes on expecting NOT FOUND -- let SEARCH_FILE=$t1_IBD -- source include/search_pattern_in_file.inc ---let SEARCH_PATTERN=temp +--let SEARCH_PATTERN=tempsecret --echo # t2 ... on expecting NOT FOUND -- let SEARCH_FILE=$t2_IBD -- source include/search_pattern_in_file.inc ---let SEARCH_PATTERN=dummy +--let SEARCH_PATTERN=dummysecret --echo # t3 no on expecting FOUND -- let SEARCH_FILE=$t3_IBD -- source include/search_pattern_in_file.inc ---let SEARCH_PATTERN=foobar +--let SEARCH_PATTERN=foobarsecret --echo # ibdata1 expecting NOT FOUND -- let SEARCH_FILE=$ib1_IBD -- source include/search_pattern_in_file.inc @@ -54,12 +58,12 @@ SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_ -- source include/start_mysqld.inc --echo # Now turn off encryption and wait for threads to decrypt everything -SET GLOBAL innodb_encryption_threads = 1; + SET GLOBAL innodb_encrypt_tables = off; --echo # Wait max 10 min for key encryption threads to decrypt all spaces --let $wait_timeout= 600 ---let $wait_condition=SELECT COUNT(*) = 5 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND KEY_ROTATION_PAGE_NUMBER IS NULL; +--let $wait_condition=SELECT COUNT(*) = 5 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND CURRENT_KEY_VERSION = 0; --source include/wait_condition.inc SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; @@ -67,27 +71,27 @@ SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_ --source include/shutdown_mysqld.inc ---let SEARCH_PATTERN=foobar +--let SEARCH_PATTERN=foobarsecret --echo # t1 yes on expecting NOT FOUND -- let SEARCH_FILE=$t1_IBD -- source include/search_pattern_in_file.inc ---let SEARCH_PATTERN=temp ---echo # t2 ... on expecting FOUND +--let SEARCH_PATTERN=tempsecret +--echo # t2 ... default expecting FOUND -- let SEARCH_FILE=$t2_IBD -- source include/search_pattern_in_file.inc ---let SEARCH_PATTERN=dummy +--let SEARCH_PATTERN=dummysecret --echo # t3 no on expecting FOUND -- let SEARCH_FILE=$t3_IBD -- source include/search_pattern_in_file.inc ---let SEARCH_PATTERN=foobar +--let SEARCH_PATTERN=foobarsecret --echo # ibdata1 expecting NOT FOUND -- let SEARCH_FILE=$ib1_IBD -- source include/search_pattern_in_file.inc + -- source include/start_mysqld.inc --echo # Now turn on encryption and wait for threads to encrypt all spaces -SET GLOBAL innodb_encryption_threads = 4; SET GLOBAL innodb_encrypt_tables = on; --echo # Wait max 10 min for key encryption threads to encrypt all spaces @@ -100,19 +104,19 @@ SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_ --source include/shutdown_mysqld.inc ---let SEARCH_PATTERN=foobar +--let SEARCH_PATTERN=foobarsecret --echo # t1 yes on expecting NOT FOUND -- let SEARCH_FILE=$t1_IBD -- source include/search_pattern_in_file.inc ---let SEARCH_PATTERN=temp +--let SEARCH_PATTERN=tempsecret --echo # t2 ... on expecting NOT FOUND -- let SEARCH_FILE=$t2_IBD -- source include/search_pattern_in_file.inc ---let SEARCH_PATTERN=dummy +--let SEARCH_PATTERN=dummysecret --echo # t3 no on expecting FOUND -- let SEARCH_FILE=$t3_IBD -- source include/search_pattern_in_file.inc ---let SEARCH_PATTERN=foobar +--let SEARCH_PATTERN=foobarsecret --echo # ibdata1 expecting NOT FOUND -- let SEARCH_FILE=$ib1_IBD -- source include/search_pattern_in_file.inc diff --git a/mysql-test/suite/encryption/t/innochecksum.test b/mysql-test/suite/encryption/t/innochecksum.test index 39e86d49674..f1c1b65d418 100644 --- a/mysql-test/suite/encryption/t/innochecksum.test +++ b/mysql-test/suite/encryption/t/innochecksum.test @@ -2,24 +2,24 @@ # MDEV-8773: InnoDB innochecksum does not work with encrypted or page compressed tables # -# Don't test under embedded +# Don't test under embedded as we restart server -- source include/not_embedded.inc # Require InnoDB -- source include/have_innodb.inc -- source include/have_file_key_management_plugin.inc +-- source include/innodb_page_size_small.inc if (!$INNOCHECKSUM) { --echo Need innochecksum binary --die Need innochecksum binary } ---disable_query_log -let $innodb_compression_algorithm_orig=`SELECT @@innodb_compression_algorithm`; -let MYSQLD_DATADIR= `SELECT @@datadir`; ---enable_query_log - +--disable_warnings +SET GLOBAL innodb_file_format = `Barracuda`; +SET GLOBAL innodb_file_per_table = ON; # zlib set global innodb_compression_algorithm = 1; +--enable_warnings --echo # Create and populate a tables CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ENGINE=InnoDB ENCRYPTED=YES ENCRYPTION_KEY_ID=4; @@ -27,9 +27,11 @@ CREATE TABLE t2 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ENGINE=InnoDB ROW_FOR CREATE TABLE t3 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ENGINE=InnoDB ROW_FORMAT=COMPRESSED ENCRYPTED=NO; CREATE TABLE t4 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ENGINE=InnoDB PAGE_COMPRESSED=1; CREATE TABLE t5 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ENGINE=InnoDB PAGE_COMPRESSED=1 ENCRYPTED=YES ENCRYPTION_KEY_ID=4; +CREATE TABLE t6 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ENGINE=InnoDB; --disable_query_log --let $i = 1000 +begin; while ($i) { INSERT INTO t1 (b) VALUES (REPEAT('abcdefghijklmnopqrstuvwxyz', 100)); @@ -39,6 +41,8 @@ INSERT INTO t2 SELECT * FROM t1; INSERT INTO t3 SELECT * FROM t1; INSERT INTO t4 SELECT * FROM t1; INSERT INTO t5 SELECT * FROM t1; +INSERT INTO t6 SELECT * FROM t1; +commit; --enable_query_log let $MYSQLD_DATADIR=`select @@datadir`; @@ -47,6 +51,10 @@ let t2_IBD = $MYSQLD_DATADIR/test/t2.ibd; let t3_IBD = $MYSQLD_DATADIR/test/t3.ibd; let t4_IBD = $MYSQLD_DATADIR/test/t4.ibd; let t5_IBD = $MYSQLD_DATADIR/test/t5.ibd; +let t6_IBD = $MYSQLD_DATADIR/test/t6.ibd; + +let INNODB_PAGE_SIZE=`select @@innodb_page_size`; +let MYSQLD_DATADIR=`select @@datadir`; --echo # Write file to make mysql-test-run.pl expect the "crash", but don't --echo # start it until it's told to @@ -80,17 +88,198 @@ shutdown_server 30; --exec $INNOCHECKSUM $t4_IBD +--echo # Run innochecksum on t5 + +--exec $INNOCHECKSUM $t5_IBD + +--echo # Run innochecksum on t6 + +--exec $INNOCHECKSUM $t6_IBD + --enable_result_log +--echo # Backup tables before corrupting +--copy_file $MYSQLD_DATADIR/test/t1.ibd $MYSQLD_DATADIR/test/t1.ibd.backup +--copy_file $MYSQLD_DATADIR/test/t2.ibd $MYSQLD_DATADIR/test/t2.ibd.backup +--copy_file $MYSQLD_DATADIR/test/t3.ibd $MYSQLD_DATADIR/test/t3.ibd.backup +--copy_file $MYSQLD_DATADIR/test/t4.ibd $MYSQLD_DATADIR/test/t4.ibd.backup +--copy_file $MYSQLD_DATADIR/test/t5.ibd $MYSQLD_DATADIR/test/t5.ibd.backup +--copy_file $MYSQLD_DATADIR/test/t6.ibd $MYSQLD_DATADIR/test/t6.ibd.backup + +# +# MDEV-11939: innochecksum mistakes a file for an encrypted one +# + +--echo # Corrupt FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION + +perl; +open(FILE, "+<", "$ENV{MYSQLD_DATADIR}/test/t1.ibd") or die "open"; +binmode FILE; +seek(FILE, $ENV{'INNODB_PAGE_SIZE'} * 3 + 26, SEEK_SET) or die "seek"; +print FILE pack("H*", "c00lcafedeadb017"); +close FILE or die "close"; +open(FILE, "+<", "$ENV{MYSQLD_DATADIR}/test/t2.ibd") or die "open"; +binmode FILE; +seek(FILE, $ENV{'INNODB_PAGE_SIZE'} * 3 + 26, SEEK_SET) or die "seek"; +print FILE pack("H*", "c00lcafedeadb017"); +close FILE or die "close"; +open(FILE, "+<", "$ENV{MYSQLD_DATADIR}/test/t3.ibd") or die "open"; +binmode FILE; +seek(FILE, $ENV{'INNODB_PAGE_SIZE'} * 3 + 26, SEEK_SET) or die "seek"; +print FILE pack("H*", "c00lcafedeadb017"); +close FILE or die "close"; +open(FILE, "+<", "$ENV{MYSQLD_DATADIR}/test/t6.ibd") or die "open"; +binmode FILE; +seek(FILE, $ENV{'INNODB_PAGE_SIZE'} * 3 + 26, SEEK_SET) or die "seek"; +print FILE pack("H*", "c00lcafedeadb017"); +close FILE or die "close"; +EOF + +-- disable_result_log +--error 1 +--exec $INNOCHECKSUM $t1_IBD + +--echo # Run innochecksum on t2 + +--error 1 +--exec $INNOCHECKSUM $t2_IBD + +--echo # Run innochecksum on t3 +--echo # no encryption corrupting the field should not have effect +--exec $INNOCHECKSUM $t3_IBD + +--echo # Run innochecksum on t6 +--echo # no encryption corrupting the field should not have effect +--exec $INNOCHECKSUM $t6_IBD + +--enable_result_log + +--echo # Restore the original tables +--remove_file $MYSQLD_DATADIR/test/t1.ibd +--remove_file $MYSQLD_DATADIR/test/t2.ibd +--remove_file $MYSQLD_DATADIR/test/t3.ibd +--remove_file $MYSQLD_DATADIR/test/t4.ibd +--remove_file $MYSQLD_DATADIR/test/t5.ibd +--remove_file $MYSQLD_DATADIR/test/t6.ibd +--copy_file $MYSQLD_DATADIR/test/t1.ibd.backup $MYSQLD_DATADIR/test/t1.ibd +--copy_file $MYSQLD_DATADIR/test/t2.ibd.backup $MYSQLD_DATADIR/test/t2.ibd +--copy_file $MYSQLD_DATADIR/test/t3.ibd.backup $MYSQLD_DATADIR/test/t3.ibd +--copy_file $MYSQLD_DATADIR/test/t4.ibd.backup $MYSQLD_DATADIR/test/t4.ibd +--copy_file $MYSQLD_DATADIR/test/t5.ibd.backup $MYSQLD_DATADIR/test/t5.ibd +--copy_file $MYSQLD_DATADIR/test/t6.ibd.backup $MYSQLD_DATADIR/test/t6.ibd + +--echo # Corrupt FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION+4 (post encryption checksum) + +perl; +open(FILE, "+<", "$ENV{MYSQLD_DATADIR}/test/t1.ibd") or die "open"; +binmode FILE; +seek(FILE, $ENV{'INNODB_PAGE_SIZE'} * 3 + 30, SEEK_SET) or die "seek"; +print FILE pack("H*", "c00lcafedeadb017"); +close FILE or die "close"; +open(FILE, "+<", "$ENV{MYSQLD_DATADIR}/test/t2.ibd") or die "open"; +binmode FILE; +seek(FILE, $ENV{'INNODB_PAGE_SIZE'} * 3 + 30, SEEK_SET) or die "seek"; +print FILE pack("H*", "c00lcafedeadb017"); +close FILE or die "close"; +open(FILE, "+<", "$ENV{MYSQLD_DATADIR}/test/t3.ibd") or die "open"; +binmode FILE; +seek(FILE, $ENV{'INNODB_PAGE_SIZE'} * 3 + 30, SEEK_SET) or die "seek"; +print FILE pack("H*", "c00lcafedeadb017"); +close FILE or die "close"; +open(FILE, "+<", "$ENV{MYSQLD_DATADIR}/test/t6.ibd") or die "open"; +binmode FILE; +seek(FILE, $ENV{'INNODB_PAGE_SIZE'} * 3 + 30, SEEK_SET) or die "seek"; +print FILE pack("H*", "c00lcafedeadb017"); +close FILE or die "close"; +EOF + +-- disable_result_log +--error 1 +--exec $INNOCHECKSUM $t1_IBD + +--echo # Run innochecksum on t2 +--error 1 +--exec $INNOCHECKSUM $t2_IBD + +--echo # Run innochecksum on t3 +--error 1 +--exec $INNOCHECKSUM $t3_IBD + +--echo # Run innochecksum on t6 +--echo # no encryption corrupting the field should not have effect +--exec $INNOCHECKSUM $t6_IBD + +--enable_result_log + +--echo # Restore the original tables +--remove_file $MYSQLD_DATADIR/test/t1.ibd +--remove_file $MYSQLD_DATADIR/test/t2.ibd +--remove_file $MYSQLD_DATADIR/test/t3.ibd +--remove_file $MYSQLD_DATADIR/test/t4.ibd +--remove_file $MYSQLD_DATADIR/test/t5.ibd +--remove_file $MYSQLD_DATADIR/test/t6.ibd +--copy_file $MYSQLD_DATADIR/test/t1.ibd.backup $MYSQLD_DATADIR/test/t1.ibd +--copy_file $MYSQLD_DATADIR/test/t2.ibd.backup $MYSQLD_DATADIR/test/t2.ibd +--copy_file $MYSQLD_DATADIR/test/t3.ibd.backup $MYSQLD_DATADIR/test/t3.ibd +--copy_file $MYSQLD_DATADIR/test/t4.ibd.backup $MYSQLD_DATADIR/test/t4.ibd +--copy_file $MYSQLD_DATADIR/test/t5.ibd.backup $MYSQLD_DATADIR/test/t5.ibd +--copy_file $MYSQLD_DATADIR/test/t6.ibd.backup $MYSQLD_DATADIR/test/t6.ibd + +--echo # Corrupt FIL_DATA+10 (data) + +perl; +open(FILE, "+<", "$ENV{MYSQLD_DATADIR}/test/t1.ibd") or die "open"; +binmode FILE; +seek(FILE, $ENV{'INNODB_PAGE_SIZE'} * 3 + 48, SEEK_SET) or die "seek"; +print FILE pack("H*", "c00lcafedeadb017"); +close FILE or die "close"; +open(FILE, "+<", "$ENV{MYSQLD_DATADIR}/test/t2.ibd") or die "open"; +binmode FILE; +seek(FILE, $ENV{'INNODB_PAGE_SIZE'} * 3 + 48, SEEK_SET) or die "seek"; +print FILE pack("H*", "c00lcafedeadb017"); +close FILE or die "close"; +open(FILE, "+<", "$ENV{MYSQLD_DATADIR}/test/t3.ibd") or die "open"; +binmode FILE; +seek(FILE, $ENV{'INNODB_PAGE_SIZE'} * 3 + 48, SEEK_SET) or die "seek"; +print FILE pack("H*", "c00lcafedeadb017"); +close FILE or die "close"; +open(FILE, "+<", "$ENV{MYSQLD_DATADIR}/test/t6.ibd") or die "open"; +binmode FILE; +seek(FILE, $ENV{'INNODB_PAGE_SIZE'} * 3 + 48, SEEK_SET) or die "seek"; +print FILE pack("H*", "c00lcafedeadb017"); +close FILE or die "close"; +EOF + +-- disable_result_log +--error 1 +--exec $INNOCHECKSUM $t1_IBD + +--echo # Run innochecksum on t2 +--error 1 +--exec $INNOCHECKSUM $t2_IBD + +--echo # Run innochecksum on t3 +--error 1 +--exec $INNOCHECKSUM $t3_IBD + +--echo # Run innochecksum on t6 +--error 1 +--exec $INNOCHECKSUM $t6_IBD + +--enable_result_log + +--echo # Restore the original tables +--move_file $MYSQLD_DATADIR/test/t1.ibd.backup $MYSQLD_DATADIR/test/t1.ibd +--move_file $MYSQLD_DATADIR/test/t2.ibd.backup $MYSQLD_DATADIR/test/t2.ibd +--move_file $MYSQLD_DATADIR/test/t3.ibd.backup $MYSQLD_DATADIR/test/t3.ibd +--move_file $MYSQLD_DATADIR/test/t4.ibd.backup $MYSQLD_DATADIR/test/t4.ibd +--move_file $MYSQLD_DATADIR/test/t5.ibd.backup $MYSQLD_DATADIR/test/t5.ibd +--move_file $MYSQLD_DATADIR/test/t6.ibd.backup $MYSQLD_DATADIR/test/t6.ibd + --echo # Write file to make mysql-test-run.pl start up the server again --exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --enable_reconnect --source include/wait_until_connected_again.inc --echo # Cleanup -DROP TABLE t1, t2, t3, t4, t5; - -# reset system ---disable_query_log -EVAL SET GLOBAL innodb_compression_algorithm = $innodb_compression_algorithm_orig; ---enable_query_log +DROP TABLE t1, t2, t3, t4, t5, t6; diff --git a/mysql-test/suite/encryption/t/innodb-bad-key-change.test b/mysql-test/suite/encryption/t/innodb-bad-key-change.test index e8b5de99d80..04c50e6f327 100644 --- a/mysql-test/suite/encryption/t/innodb-bad-key-change.test +++ b/mysql-test/suite/encryption/t/innodb-bad-key-change.test @@ -2,10 +2,6 @@ -- source include/have_file_key_management_plugin.inc # embedded does not support restart -- source include/not_embedded.inc --- source include/not_valgrind.inc -# Avoid CrashReporter popup on Mac --- source include/not_crashrep.inc --- source include/not_windows.inc # # MDEV-8588: Assertion failure in file ha_innodb.cc line 21140 if at least one encrypted @@ -14,14 +10,15 @@ call mtr.add_suppression("Plugin 'file_key_management' init function returned error"); call mtr.add_suppression("Plugin 'file_key_management' registration.*failed"); -call mtr.add_suppression("InnoDB: The page .* in file test/.* cannot be decrypted"); -call mtr.add_suppression("mysqld: File .* not found"); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[12]\\.ibd' cannot be decrypted\\."); +call mtr.add_suppression("File '.*mysql-test.std_data.keysbad3\\.txt' not found"); ---echo --echo # Start server with keys2.txt -- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt -- source include/restart_mysqld.inc +SET GLOBAL innodb_file_per_table = ON; + CREATE TABLE t1 (c VARCHAR(8)) ENGINE=InnoDB ENCRYPTED=YES ENCRYPTION_KEY_ID=2; INSERT INTO t1 VALUES ('foobar'); ALTER TABLE t1 ADD COLUMN c2 INT; @@ -41,14 +38,14 @@ SELECT * FROM t1; --error ER_GET_ERRMSG SELECT * FROM t1; ---replace_regex /tablespace [0-9]*/tablespace / +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / SHOW WARNINGS; -- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keysbad3.txt -- source include/restart_mysqld.inc ---replace_regex /tablespace [0-9]*/tablespace / +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / DROP TABLE t1; ---replace_regex /tablespace [0-9]*/tablespace / +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / SHOW WARNINGS; # @@ -56,10 +53,11 @@ SHOW WARNINGS; # line 2856 on querying a table using wrong default encryption key # ---echo # Start server with keys.txt --- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys.txt +--echo # Start server with keys3.txt +-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys3.txt -- source include/restart_mysqld.inc +SET GLOBAL innodb_default_encryption_key_id=5; CREATE TABLE t2 (c VARCHAR(8), id int not null primary key, b int, key(b)) ENGINE=InnoDB ENCRYPTED=YES; INSERT INTO t2 VALUES ('foobar',1,2); @@ -70,58 +68,50 @@ INSERT INTO t2 VALUES ('foobar',1,2); --error ER_GET_ERRMSG SELECT * FROM t2; ---replace_regex /tablespace [0-9]*/tablespace / +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / SHOW WARNINGS; --error ER_GET_ERRMSG SELECT * FROM t2 where id = 1; ---replace_regex /tablespace [0-9]*/tablespace / +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / SHOW WARNINGS; --error ER_GET_ERRMSG SELECT * FROM t2 where b = 1; ---replace_regex /tablespace [0-9]*/tablespace / +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / SHOW WARNINGS; --error ER_GET_ERRMSG INSERT INTO t2 VALUES ('tmp',3,3); ---replace_regex /tablespace [0-9]*/tablespace / +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / SHOW WARNINGS; --error ER_GET_ERRMSG DELETE FROM t2 where b = 3; ---replace_regex /tablespace [0-9]*/tablespace / +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / SHOW WARNINGS; --error ER_GET_ERRMSG DELETE FROM t2 where id = 3; ---replace_regex /tablespace [0-9]*/tablespace / +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / SHOW WARNINGS; --error ER_GET_ERRMSG UPDATE t2 set b = b +1; ---replace_regex /tablespace [0-9]*/tablespace / +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / SHOW WARNINGS; OPTIMIZE TABLE t2; ---replace_regex /tablespace [0-9]*/tablespace / +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / SHOW WARNINGS; --error ER_GET_ERRMSG -ALTER TABLE t2 ADD COLUMN c INT; ---replace_regex /tablespace [0-9]*/tablespace / +ALTER TABLE t2 ADD COLUMN d INT; +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / SHOW WARNINGS; ANALYZE TABLE t2; ---replace_regex /tablespace [0-9]*/tablespace / +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / SHOW WARNINGS; --error ER_GET_ERRMSG TRUNCATE TABLE t2; ---replace_regex /tablespace [0-9]*/tablespace / +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / SHOW WARNINGS; ---replace_regex /.*tablespace [0-9]*// ---error ER_GET_ERRMSG + DROP TABLE t2; ---replace_regex /tablespace [0-9]*/tablespace / -SHOW WARNINGS; --echo ---echo # Restart server with keys.txt --- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys.txt +--echo # Start server with keys2.txt +-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt -- source include/restart_mysqld.inc - ---replace_regex /.*tablespace [0-9]*// -DROP TABLE t2; ---replace_regex /tablespace [0-9]*/tablespace / -SHOW WARNINGS; diff --git a/mysql-test/suite/encryption/t/innodb-bad-key-change2.test b/mysql-test/suite/encryption/t/innodb-bad-key-change2.test index c7c9e66dcf8..3c9e10efc90 100644 --- a/mysql-test/suite/encryption/t/innodb-bad-key-change2.test +++ b/mysql-test/suite/encryption/t/innodb-bad-key-change2.test @@ -1,49 +1,88 @@ --source include/have_innodb.inc # embedded does not support restart -- source include/not_embedded.inc --- source include/not_valgrind.inc -# Avoid CrashReporter popup on Mac --- source include/not_crashrep.inc -- source filekeys_plugin_exists.inc # # MDEV-8750: Server crashes in page_cur_is_after_last on altering table using a wrong encryption key +# MDEV-8769: Server crash at file btr0btr.ic line 122 when defragmenting encrypted table using incorrect keys +# MDEV-8768: Server crash at file btr0btr.ic line 122 when checking encrypted table using incorrect keys +# MDEV-8727: Server/InnoDB hangs on shutdown after trying to read an encrypted table with a wrong key # -call mtr.add_suppression("InnoDB: The page .* in file test/t1 cannot be decrypted"); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t1(new)?\\.ibd' cannot be decrypted\\."); # Suppression for builds where file_key_management plugin is linked statically call mtr.add_suppression("Couldn't load plugins from 'file_key_management"); +call mtr.add_suppression("InnoDB: Tablespace for table \`test\`.\`t1\` is set as discarded\\."); ---write_file $MYSQLTEST_VARDIR/keys1.txt -1;770A8A65DA156D24EE2A093277530142 -4;770A8A65DA156D24EE2A093277530143 -EOF - ---let $restart_parameters= --innodb-encrypt-tables --innodb-stats-persistent --plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt +--let $restart_parameters=--plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt --source include/restart_mysqld.inc -CREATE TABLE t1 (pk INT PRIMARY KEY, f VARCHAR(8)) ENGINE=InnoDB ENCRYPTION_KEY_ID=4; +SET GLOBAL innodb_file_per_table = ON; + +CREATE TABLE t1 (pk INT PRIMARY KEY, f VARCHAR(8)) ENGINE=InnoDB +ENCRYPTED=YES ENCRYPTION_KEY_ID=4; INSERT INTO t1 VALUES (1,'foo'),(2,'bar'); ---write_file $MYSQLTEST_VARDIR/keys2.txt -1;770A8A65DA156D24EE2A093277530142 -4;770A8A65DA156D24EE2A093277530144 +--let $restart_parameters=--plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys3.txt +--source include/restart_mysqld.inc + +--error ER_GET_ERRMSG +SELECT * FROM t1; +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / +SHOW WARNINGS; +--error ER_GET_ERRMSG +ALTER TABLE t1 ENGINE=InnoDB; +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / +SHOW WARNINGS; +OPTIMIZE TABLE t1; +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / +SHOW WARNINGS; + +CHECK TABLE t1; +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / +SHOW WARNINGS; + +--let $restart_parameters=--plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt +--source include/restart_mysqld.inc + +let MYSQLD_DATADIR =`SELECT @@datadir`; + +FLUSH TABLES t1 FOR EXPORT; +perl; +do "$ENV{MTR_SUITE_DIR}/include/innodb-util.pl"; +ib_backup_tablespaces("test", "t1"); +EOF +UNLOCK TABLES; + +--let $restart_parameters=--plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys3.txt +--source include/restart_mysqld.inc + +# Discard should pass even with incorrect keys +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / +ALTER TABLE t1 DISCARD TABLESPACE; + +perl; +do "$ENV{MTR_SUITE_DIR}/include/innodb-util.pl"; +ib_discard_tablespaces("test", "t1"); +ib_restore_tablespaces("test", "t1"); EOF ---let $restart_parameters= --innodb-encrypt-tables --innodb-stats-persistent --plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys2.txt + +--let $restart_parameters=--plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt --source include/restart_mysqld.inc ---error ER_GET_ERRMSG -select * from t1; -show warnings; ---error ER_GET_ERRMSG -alter table t1 discard tablespace; -show warnings; ---error ER_GET_ERRMSG -alter table t1 engine=InnoDB; -show warnings; +ALTER TABLE t1 IMPORT TABLESPACE; +SHOW CREATE TABLE t1; ---let $restart_parameters= --innodb-encrypt-tables --innodb-stats-persistent --plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt +--let $restart_parameters= --innodb-encrypt-tables --plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys3.txt --source include/restart_mysqld.inc -DROP TABLE t1; ---remove_file $MYSQLTEST_VARDIR/keys1.txt ---remove_file $MYSQLTEST_VARDIR/keys2.txt +# Rename table should pass even with incorrect keys +RENAME TABLE t1 TO t1new; +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / + +# Alter table rename is not allowed with incorrect keys +--error ER_GET_ERRMSG +ALTER TABLE t1new RENAME TO t2new; +# Drop should pass even with incorrect keys +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / +DROP TABLE t1new; diff --git a/mysql-test/suite/encryption/t/innodb-bad-key-change5.opt b/mysql-test/suite/encryption/t/innodb-bad-key-change4.opt similarity index 100% rename from mysql-test/suite/encryption/t/innodb-bad-key-change5.opt rename to mysql-test/suite/encryption/t/innodb-bad-key-change4.opt diff --git a/mysql-test/suite/encryption/t/innodb-bad-key-change4.test b/mysql-test/suite/encryption/t/innodb-bad-key-change4.test index 0459c433ece..a2305aa968b 100644 --- a/mysql-test/suite/encryption/t/innodb-bad-key-change4.test +++ b/mysql-test/suite/encryption/t/innodb-bad-key-change4.test @@ -1,43 +1,39 @@ --source include/have_innodb.inc # embedded does not support restart -- source include/not_embedded.inc --- source include/not_valgrind.inc -# Avoid CrashReporter popup on Mac --- source include/not_crashrep.inc -- source filekeys_plugin_exists.inc # +# MDEV-8769: Server crash at file btr0btr.ic line 122 when defragmenting encrypted table using incorrect keys # MDEV-8768: Server crash at file btr0btr.ic line 122 when checking encrypted table using incorrect keys # -call mtr.add_suppression("InnoDB: The page .* in file test/t1 cannot be decrypted"); + +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t1\\.ibd' cannot be decrypted\\."); # Suppression for builds where file_key_management plugin is linked statically call mtr.add_suppression("Couldn't load plugins from 'file_key_management"); ---write_file $MYSQLTEST_VARDIR/keys1.txt -1;770A8A65DA156D24EE2A093277530142 -4;770A8A65DA156D24EE2A093277530143 -EOF - ---let $restart_parameters= --innodb-encrypt-tables --innodb-stats-persistent --plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt +--let $restart_parameters=--plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt --source include/restart_mysqld.inc -CREATE TABLE t1 (pk INT PRIMARY KEY, f VARCHAR(8)) ENGINE=InnoDB ENCRYPTION_KEY_ID=4; +SET GLOBAL innodb_file_per_table = ON; + +CREATE TABLE t1 (pk INT PRIMARY KEY, f VARCHAR(8)) ENGINE=InnoDB +ENCRYPTED=YES ENCRYPTION_KEY_ID=4; INSERT INTO t1 VALUES (1,'foo'),(2,'bar'); ---write_file $MYSQLTEST_VARDIR/keys2.txt -1;770A8A65DA156D24EE2A093277530142 -4;770A8A65DA156D24EE2A093277530144 -EOF - ---let $restart_parameters= --innodb-encrypt-tables --innodb-stats-persistent --plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys2.txt +--let $restart_parameters=--plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys3.txt --source include/restart_mysqld.inc ---replace_regex /tablespace [0-9]*/tablespace #/ +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / +OPTIMIZE TABLE t1; +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / +SHOW WARNINGS; + +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / CHECK TABLE t1; +--replace_regex /(tablespace|key_id) [1-9][0-9]*/\1 / SHOW WARNINGS; ---let $restart_parameters= --innodb-encrypt-tables --innodb-stats-persistent --plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt +--let $restart_parameters=--plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt --source include/restart_mysqld.inc DROP TABLE t1; ---remove_file $MYSQLTEST_VARDIR/keys1.txt ---remove_file $MYSQLTEST_VARDIR/keys2.txt diff --git a/mysql-test/suite/encryption/t/innodb-bad-key-change5.test b/mysql-test/suite/encryption/t/innodb-bad-key-change5.test deleted file mode 100644 index b205d203374..00000000000 --- a/mysql-test/suite/encryption/t/innodb-bad-key-change5.test +++ /dev/null @@ -1,42 +0,0 @@ ---source include/have_innodb.inc -# embedded does not support restart --- source include/not_embedded.inc --- source include/not_valgrind.inc -# Avoid CrashReporter popup on Mac --- source include/not_crashrep.inc --- source filekeys_plugin_exists.inc -# -# MDEV-8769: Server crash at file btr0btr.ic line 122 when defragmenting encrypted table using incorrect keys -# -call mtr.add_suppression("InnoDB: The page .* in file test/t1 cannot be decrypted"); -# Suppression for builds where file_key_management plugin is linked statically -call mtr.add_suppression("Couldn't load plugins from 'file_key_management"); - ---write_file $MYSQLTEST_VARDIR/keys1.txt -1;770A8A65DA156D24EE2A093277530142 -4;770A8A65DA156D24EE2A093277530143 -EOF - ---let $restart_parameters= --innodb-encrypt-tables --innodb-defragment=1 --innodb-stats-persistent --plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt ---source include/restart_mysqld.inc - -CREATE TABLE t1 (pk INT PRIMARY KEY, f VARCHAR(8)) ENGINE=InnoDB ENCRYPTION_KEY_ID=4; -INSERT INTO t1 VALUES (1,'foo'),(2,'bar'); - ---write_file $MYSQLTEST_VARDIR/keys2.txt -1;770A8A65DA156D24EE2A093277530142 -4;770A8A65DA156D24EE2A093277530144 -EOF - ---let $restart_parameters= --innodb-encrypt-tables --innodb-defragment=1 --innodb-stats-persistent --plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys2.txt ---source include/restart_mysqld.inc - -OPTIMIZE TABLE t1; -SHOW WARNINGS; - ---let $restart_parameters= --innodb-encrypt-tables --innodb-defragment=1 --innodb-stats-persistent --plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt ---source include/restart_mysqld.inc - -DROP TABLE t1; ---remove_file $MYSQLTEST_VARDIR/keys1.txt ---remove_file $MYSQLTEST_VARDIR/keys2.txt diff --git a/mysql-test/suite/encryption/t/innodb-bad-key-shutdown.test b/mysql-test/suite/encryption/t/innodb-bad-key-shutdown.test deleted file mode 100644 index d1b009fad93..00000000000 --- a/mysql-test/suite/encryption/t/innodb-bad-key-shutdown.test +++ /dev/null @@ -1,52 +0,0 @@ -# -# MDEV-8727: Server/InnoDB hangs on shutdown after trying to read an encrypted table with a wrong key -# - ---source include/have_innodb.inc ---source include/not_embedded.inc - -call mtr.add_suppression("InnoDB: The page .* in file test/t1 cannot be decrypted"); -# Suppression for builds where file_key_management plugin is linked statically -call mtr.add_suppression("Couldn't load plugins from 'file_key_management"); - ---echo # ---echo # Restart the server with key 4 in the key file ---echo # - ---write_file $MYSQLTEST_VARDIR/keys1.txt -1;770A8A65DA156D24EE2A093277530142 -4;18420B5CBA31CCDFFE9716E91EB61374D05914F3ADE23E03 -EOF - ---let $restart_parameters= --plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt ---source include/restart_mysqld.inc - -CREATE TABLE t1 (i INT, KEY(i)) ENGINE=InnoDB ENCRYPTED=YES ENCRYPTION_KEY_ID=4; -INSERT INTO t1 VALUES (1); - ---echo # ---echo # Restart the server with a different value for key 4 in the key file ---echo # - ---write_file $MYSQLTEST_VARDIR/keys2.txt -1;770A8A65DA156D24EE2A093277530142 -4;22222222222222222222222222222222 -EOF - ---let $restart_parameters= --plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys2.txt ---source include/restart_mysqld.inc - ---error ER_GET_ERRMSG -SELECT * FROM t1; - ---let $restart_parameters= --plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt ---source include/restart_mysqld.inc - -SELECT * FROM t1; -DROP TABLE t1; - ---let $restart_parameters= ---source include/restart_mysqld.inc - ---remove_file $MYSQLTEST_VARDIR/keys2.txt ---remove_file $MYSQLTEST_VARDIR/keys1.txt diff --git a/mysql-test/suite/encryption/t/innodb-checksum-algorithm.test b/mysql-test/suite/encryption/t/innodb-checksum-algorithm.test new file mode 100644 index 00000000000..7eaa1bd64c6 --- /dev/null +++ b/mysql-test/suite/encryption/t/innodb-checksum-algorithm.test @@ -0,0 +1,120 @@ +-- source include/innodb_page_size.inc +-- source include/have_file_key_management_plugin.inc + +SET @saved_file_per_table = @@global.innodb_file_per_table; +SET @saved_checksum_algorithm = @@global.innodb_checksum_algorithm; +SET @saved_encrypt_tables = @@global.innodb_encrypt_tables; +SET @saved_encryption_threads = @@global.innodb_encryption_threads; +SET @saved_encryption_key_id = @@global.innodb_default_encryption_key_id; + +SET GLOBAL innodb_file_per_table = ON; +SET GLOBAL innodb_encrypt_tables = ON; +SET GLOBAL innodb_encryption_threads = 4; + +call mtr.add_suppression("InnoDB: innodb_checksum_algorithm is set to \"strict_(crc32|none|innodb)\" but the page \\[page id: space=[0-9]+, page number=[0-9]+\\] contains a valid checksum \"(innodb|none|crc32)\""); + +SET GLOBAL innodb_checksum_algorithm = innodb; +SET GLOBAL innodb_default_encryption_key_id=4; + +let MYSQLD_DATADIR =`SELECT @@datadir`; + +# ROW_FORMAT=COMPRESSED is unavailable with innodb_page_size=32k or 64k +let $row_format_compressed= `select case when @@global.innodb_page_size>16384 +then 'ROW_FORMAT=DYNAMIC' else 'ROW_FORMAT=COMPRESSED' end`; + +let $from = 3; +while ($from) +{ +dec $from; +let checksum = `select case $from + when 0 then 'none' + when 1 then 'innodb' + when 2 then 'crc32' + end`; +eval SET GLOBAL innodb_checksum_algorithm=$checksum; + +eval create table tce_$checksum(a serial, b blob, index(b(10))) engine=innodb +$row_format_compressed encrypted=yes; +eval create table tc_$checksum(a serial, b blob, index(b(10))) engine=innodb +$row_format_compressed encrypted=no; +eval create table te_$checksum(a serial, b blob, index(b(10))) engine=innodb +encrypted=yes; +eval create table t_$checksum(a serial, b blob, index(b(10))) engine=innodb +encrypted=no; +eval create table tpe_$checksum(a serial, b blob, index(b(10))) engine=innodb +page_compressed=yes encrypted=yes; +eval create table tp_$checksum(a serial, b blob, index(b(10))) engine=innodb +page_compressed=yes encrypted=no; + +begin; +eval insert into tce_$checksum(b) values (repeat('secret',20)); +eval insert into tc_$checksum(b) values (repeat('secret',20)); +eval insert into te_$checksum(b) values (repeat('secret',20)); +eval insert into t_$checksum(b) values (repeat('secret',20)); +eval insert into tpe_$checksum(b) values (repeat('secret',20)); +eval insert into tp_$checksum(b) values (repeat('secret',20)); +commit; + +eval FLUSH TABLES tce_$checksum, tc_$checksum, te_$checksum, +t_$checksum, tpe_$checksum, tp_$checksum FOR EXPORT; +perl; +do "$ENV{MTR_SUITE_DIR}/include/innodb-util.pl"; +my @tables = ("tce_", "tc_", "te_", "t_", "tpe_", "tp_"); +ib_backup_tablespaces("test", map{ $_ . $ENV{checksum} } @tables); +EOF +--list_files $MYSQLD_DATADIR/test +UNLOCK TABLES; + +let $to = 6; +while ($to) +{ +dec $to; +let $tocksum = `select case $to + when 0 then 'none' + when 1 then 'strict_none' + when 2 then 'innodb' + when 3 then 'strict_innodb' + when 4 then 'crc32' + when 5 then 'strict_crc32' + end`; + +eval SET GLOBAL innodb_checksum_algorithm=$tocksum; + +eval ALTER TABLE tce_$checksum DISCARD TABLESPACE; +eval ALTER TABLE tc_$checksum DISCARD TABLESPACE; +eval ALTER TABLE te_$checksum DISCARD TABLESPACE; +eval ALTER TABLE t_$checksum DISCARD TABLESPACE; +eval ALTER TABLE tpe_$checksum DISCARD TABLESPACE; +eval ALTER TABLE tp_$checksum DISCARD TABLESPACE; + +perl; +do "$ENV{MTR_SUITE_DIR}/include/innodb-util.pl"; +my @tables = ("tce_", "tc_", "te_", "t_", "tpe_", "tp_"); +ib_restore_tablespaces("test", map{ $_ . $ENV{checksum} } @tables); +EOF + +eval ALTER TABLE tce_$checksum IMPORT TABLESPACE; +eval update tce_$checksum set b=substr(b,1); +eval ALTER TABLE tc_$checksum IMPORT TABLESPACE; +eval update tc_$checksum set b=substr(b,1); +eval ALTER TABLE te_$checksum IMPORT TABLESPACE; +eval update te_$checksum set b=substr(b,1); +eval ALTER TABLE t_$checksum IMPORT TABLESPACE; +eval update t_$checksum set b=substr(b,1); +eval ALTER TABLE tpe_$checksum IMPORT TABLESPACE; +eval update tpe_$checksum set b=substr(b,1); +eval ALTER TABLE tp_$checksum IMPORT TABLESPACE; +eval update tp_$checksum set b=substr(b,1); +} + +eval CHECK TABLE tce_$checksum, tc_$checksum, te_$checksum, +t_$checksum, tpe_$checksum, tp_$checksum; +eval DROP TABLE tce_$checksum, tc_$checksum, te_$checksum, +t_$checksum, tpe_$checksum, tp_$checksum; +} + +SET GLOBAL innodb_file_per_table = @saved_file_per_table; +SET GLOBAL innodb_checksum_algorithm = @saved_checksum_algorithm; +SET GLOBAL innodb_encrypt_tables = @saved_encrypt_tables; +SET GLOBAL innodb_encryption_threads = @saved_encryption_threads; +SET GLOBAL innodb_default_encryption_key_id = @saved_encryption_key_id; diff --git a/mysql-test/suite/encryption/t/innodb-compressed-blob.combinations b/mysql-test/suite/encryption/t/innodb-compressed-blob.combinations new file mode 100644 index 00000000000..e096b023b52 --- /dev/null +++ b/mysql-test/suite/encryption/t/innodb-compressed-blob.combinations @@ -0,0 +1,12 @@ +[crc32] +loose-innodb-tablespaces-encryption +loose-innodb-encrypt-tables=on +loose-innodb-encryption-threads=4 +max_allowed_packet=64K +loose-innodb-checksum-algorithm=crc32 +[none] +loose-innodb-tablespaces-encryption +loose-innodb-encrypt-tables=on +loose-innodb-encryption-threads=4 +max_allowed_packet=64K +loose-innodb-checksum-algorithm=none diff --git a/mysql-test/suite/encryption/t/innodb-compressed-blob.test b/mysql-test/suite/encryption/t/innodb-compressed-blob.test new file mode 100644 index 00000000000..4f28f8e183d --- /dev/null +++ b/mysql-test/suite/encryption/t/innodb-compressed-blob.test @@ -0,0 +1,39 @@ +-- source include/innodb_page_size_small.inc +-- source include/have_file_key_management_plugin.inc + +# embedded does not support restart +-- source include/not_embedded.inc + +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[123]\\.ibd' cannot be decrypted\\."); +call mtr.add_suppression("InnoDB: Unable to decompress ..test.t[1-3]\\.ibd\\[page id: space=[1-9][0-9]*, page number=[0-9]+\\]"); + +--echo # Restart mysqld --file-key-management-filename=keys2.txt +-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt +-- source include/restart_mysqld.inc + +SET GLOBAL innodb_file_per_table = ON; + +set GLOBAL innodb_default_encryption_key_id=4; +create table t1(a int not null primary key, b blob, index(b(10))) engine=innodb row_format=compressed; +create table t2(a int not null primary key, b blob, index(b(10))) engine=innodb row_format=compressed encrypted=yes; +create table t3(a int not null primary key, b blob, index(b(10))) engine=innodb row_format=compressed encrypted=no; + +insert into t1 values (1, repeat('secret',6000)); +insert into t2 values (1, repeat('secret',6000)); +insert into t3 values (1, repeat('secret',6000)); + +--echo # Restart mysqld --file-key-management-filename=keys3.txt +-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys3.txt +-- source include/restart_mysqld.inc + +--error ER_GET_ERRMSG +select count(*) from t1 FORCE INDEX (b) where b like 'secret%'; +--error ER_GET_ERRMSG +select count(*) from t2 FORCE INDEX (b) where b like 'secret%'; +select count(*) from t3 FORCE INDEX (b) where b like 'secret%'; + +--echo # Restart mysqld --file-key-management-filename=keys2.txt +-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt +-- source include/restart_mysqld.inc + +drop table t1,t2,t3; diff --git a/mysql-test/suite/encryption/t/innodb-encryption-disable.test b/mysql-test/suite/encryption/t/innodb-encryption-disable.test index fed9878ffbc..8c72cf6a3b2 100644 --- a/mysql-test/suite/encryption/t/innodb-encryption-disable.test +++ b/mysql-test/suite/encryption/t/innodb-encryption-disable.test @@ -1,22 +1,18 @@ -- source include/have_innodb.inc # embedded does not support restart -- source include/not_embedded.inc --- source include/not_valgrind.inc -# Avoid CrashReporter popup on Mac --- source include/not_crashrep.inc -- source filekeys_plugin_exists.inc # # MDEV-9559: Server without encryption configs crashes if selecting from an implicitly encrypted table # -call mtr.add_suppression("InnoDB: The page .* in file test/t[15] cannot be decrypted"); + +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[15]\\.ibd' cannot be decrypted\\."); + +# Suppression for builds where file_key_management plugin is linked statically call mtr.add_suppression("Couldn't load plugins from 'file_key_management"); ---write_file $MYSQLTEST_VARDIR/keys1.txt -1;770A8A65DA156D24EE2A093277530142 -EOF - ---let $restart_parameters= --innodb-encrypt-tables --plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt +--let $restart_parameters=--innodb-encrypt-tables=ON --plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt --source include/restart_mysqld.inc create table t5 ( @@ -38,16 +34,9 @@ CREATE TABLE `t1` ( ) ENGINE=InnoDB; insert into t1 values (1,2,'maria','db','encryption'); - -select * from t1; -select * from t5; - alter table t1 encrypted='yes' `encryption_key_id`=1; -select * from t1; -select * from t5; - ---let $restart_parameters= --innodb-encrypt-tables=OFF +--let $restart_parameters=--innodb-encrypt-tables=OFF --source include/restart_mysqld.inc --error ER_GET_ERRMSG @@ -55,10 +44,8 @@ select * from t1; --error ER_GET_ERRMSG select * from t5; ---let $restart_parameters= --innodb-encrypt-tables --plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt +--let $restart_parameters=--innodb-encrypt-tables=ON --plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt --source include/restart_mysqld.inc drop table t1; drop table t5; - ---remove_file $MYSQLTEST_VARDIR/keys1.txt diff --git a/mysql-test/suite/encryption/t/innodb-first-page-read.opt b/mysql-test/suite/encryption/t/innodb-first-page-read.opt new file mode 100644 index 00000000000..38d69691ed6 --- /dev/null +++ b/mysql-test/suite/encryption/t/innodb-first-page-read.opt @@ -0,0 +1,5 @@ +--innodb-encrypt-tables=ON +--innodb-encrypt-log=ON +--innodb-encryption-rotate-key-age=15 +--innodb-encryption-threads=4 +--innodb-tablespaces-encryption diff --git a/mysql-test/suite/encryption/t/innodb-first-page-read.test b/mysql-test/suite/encryption/t/innodb-first-page-read.test new file mode 100644 index 00000000000..d661e4565d2 --- /dev/null +++ b/mysql-test/suite/encryption/t/innodb-first-page-read.test @@ -0,0 +1,109 @@ +-- source include/have_innodb.inc +-- source include/have_file_key_management_plugin.inc +-- source include/not_embedded.inc + +--disable_warnings +SET GLOBAL innodb_file_format = `Barracuda`; +SET GLOBAL innodb_file_per_table = ON; +--enable_warnings + +FLUSH STATUS; + +create database innodb_test; +use innodb_test; +create table innodb_normal(c1 bigint not null, b char(200)) engine=innodb; +create table innodb_compact(c1 bigint not null, b char(200)) engine=innodb row_format=compact; +create table innodb_dynamic(c1 bigint not null, b char(200)) engine=innodb row_format=dynamic; +create table innodb_compressed(c1 bigint not null, b char(200)) engine=innodb row_format=compressed; +create table innodb_compressed1(c1 bigint not null, b char(200)) engine=innodb row_format=compressed key_block_size=1; +create table innodb_compressed2(c1 bigint not null, b char(200)) engine=innodb row_format=compressed key_block_size=2; +create table innodb_compressed4(c1 bigint not null, b char(200)) engine=innodb row_format=compressed key_block_size=4; +create table innodb_compressed8(c1 bigint not null, b char(200)) engine=innodb row_format=compressed key_block_size=8; +create table innodb_compressed16(c1 bigint not null, b char(200)) engine=innodb row_format=compressed key_block_size=16; +create table innodb_redundant(c1 bigint not null, b char(200)) engine=innodb row_format=redundant; +create table innodb_pagecomp(c1 bigint not null, b char(200)) engine=innodb page_compressed=yes; +create table innodb_pagecomp1(c1 bigint not null, b char(200)) engine=innodb page_compressed=yes page_compression_level=1; +create table innodb_pagecomp2(c1 bigint not null, b char(200)) engine=innodb page_compressed=yes page_compression_level=2; +create table innodb_pagecomp3(c1 bigint not null, b char(200)) engine=innodb page_compressed=yes page_compression_level=3; +create table innodb_pagecomp4(c1 bigint not null, b char(200)) engine=innodb page_compressed=yes page_compression_level=4; +create table innodb_pagecomp5(c1 bigint not null, b char(200)) engine=innodb page_compressed=yes page_compression_level=5; +create table innodb_pagecomp6(c1 bigint not null, b char(200)) engine=innodb page_compressed=yes page_compression_level=6; +create table innodb_pagecomp7(c1 bigint not null, b char(200)) engine=innodb page_compressed=yes page_compression_level=7; +create table innodb_pagecomp8(c1 bigint not null, b char(200)) engine=innodb page_compressed=yes page_compression_level=8; +create table innodb_pagecomp9(c1 bigint not null, b char(200)) engine=innodb page_compressed=yes page_compression_level=9; + +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +eval create table innodb_datadir1(c1 bigint not null, b char(200)) engine=innodb DATA DIRECTORY='$MYSQL_TMP_DIR'; +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +eval create table innodb_datadir2(c1 bigint not null, b char(200)) engine=innodb row_format=compressed DATA DIRECTORY='$MYSQL_TMP_DIR'; +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +eval create table innodb_datadir3(c1 bigint not null, b char(200)) engine=innodb page_compressed=yes DATA DIRECTORY='$MYSQL_TMP_DIR'; + +begin; +insert into innodb_normal values (1,'secret'); +insert into innodb_compact select * from innodb_normal; +insert into innodb_dynamic select * from innodb_normal; +insert into innodb_compressed select * from innodb_normal; +insert into innodb_compressed1 select * from innodb_normal; +insert into innodb_compressed2 select * from innodb_normal; +insert into innodb_compressed4 select * from innodb_normal; +insert into innodb_compressed8 select * from innodb_normal; +insert into innodb_compressed16 select * from innodb_normal; +insert into innodb_redundant select * from innodb_normal; +insert into innodb_pagecomp select * from innodb_normal; +insert into innodb_pagecomp1 select * from innodb_normal; +insert into innodb_pagecomp2 select * from innodb_normal; +insert into innodb_pagecomp3 select * from innodb_normal; +insert into innodb_pagecomp4 select * from innodb_normal; +insert into innodb_pagecomp5 select * from innodb_normal; +insert into innodb_pagecomp6 select * from innodb_normal; +insert into innodb_pagecomp7 select * from innodb_normal; +insert into innodb_pagecomp8 select * from innodb_normal; +insert into innodb_pagecomp9 select * from innodb_normal; +insert into innodb_datadir1 select * from innodb_normal; +insert into innodb_datadir2 select * from innodb_normal; +insert into innodb_datadir3 select * from innodb_normal; +commit; + +FLUSH STATUS; + +--echo # Restart server and see how many page 0's are read +--source include/restart_mysqld.inc + +--echo # result should actual number of tables except remote tables could be read twice +--echo # i.e. < 23 + 3*2 = 29 + +SELECT VARIABLE_VALUE <= 29 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'innodb_pages0_read'; +use innodb_test; +SELECT VARIABLE_VALUE <= 29 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'innodb_pages0_read'; +use test; +SELECT VARIABLE_VALUE <= 29 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'innodb_pages0_read'; + +set global innodb_encrypt_tables=OFF; + +--echo # wait until tables are decrypted +--let $wait_condition=SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 +--source include/wait_condition.inc + +--echo # result should be actual number of tables except remote tables could be read twice +--echo # i.e. < 23 + 3*2 = 29 + +SELECT VARIABLE_VALUE <= 29 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'innodb_pages0_read'; +use innodb_test; +SELECT VARIABLE_VALUE <= 29 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'innodb_pages0_read'; +use test; +SELECT VARIABLE_VALUE <= 29 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'innodb_pages0_read'; + +FLUSH STATUS; + +--echo # restart and see number read page 0 +-- source include/restart_mysqld.inc + +SELECT VARIABLE_VALUE <= 29 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'innodb_pages0_read'; +use innodb_test; +SELECT VARIABLE_VALUE <= 29 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'innodb_pages0_read'; +use test; +SELECT VARIABLE_VALUE <= 29 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'innodb_pages0_read'; + +drop database innodb_test; +FLUSH STATUS; diff --git a/mysql-test/suite/encryption/t/innodb-force-corrupt.test b/mysql-test/suite/encryption/t/innodb-force-corrupt.test new file mode 100644 index 00000000000..4d3bfc2d1e9 --- /dev/null +++ b/mysql-test/suite/encryption/t/innodb-force-corrupt.test @@ -0,0 +1,84 @@ +# +# MDEV-11759: Encryption code in MariaDB 10.1/10.2 causes compatibility problems +# + +-- source include/have_innodb.inc +-- source include/have_file_key_management_plugin.inc +# Don't test under embedded +-- source include/not_embedded.inc + +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[123]\\.ibd' cannot be decrypted\\."); + +SET GLOBAL innodb_file_per_table = ON; +set global innodb_compression_algorithm = 1; + +--echo # Create and populate tables to be corrupted +CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT,c char(200)) ENGINE=InnoDB encrypted=yes; +CREATE TABLE t2 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT,c char(200)) ENGINE=InnoDB row_format=compressed encrypted=yes; +CREATE TABLE t3 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT, c char(200)) ENGINE=InnoDB page_compressed=yes encrypted=yes; + +BEGIN; +INSERT INTO t1 (b,c) VALUES ('corrupt me','secret'); +--disable_query_log +--let $i = 100 +while ($i) +{ + INSERT INTO t1 (b,c) VALUES (REPEAT('abcabcabc', 100),'secretsecret'); + dec $i; +} +--enable_query_log + +INSERT INTO t1 (b,c) VALUES ('corrupt me','moresecretmoresecret'); +INSERT INTO t2 select * from t1; +INSERT INTO t3 select * from t1; +COMMIT; + +let INNODB_PAGE_SIZE=`select @@innodb_page_size`; +let MYSQLD_DATADIR=`select @@datadir`; + +--source include/shutdown_mysqld.inc + +--echo # Backup tables before corrupting +--copy_file $MYSQLD_DATADIR/test/t1.ibd $MYSQLD_DATADIR/test/t1.ibd.backup +--copy_file $MYSQLD_DATADIR/test/t2.ibd $MYSQLD_DATADIR/test/t2.ibd.backup +--copy_file $MYSQLD_DATADIR/test/t3.ibd $MYSQLD_DATADIR/test/t3.ibd.backup + +--echo # Corrupt tables + +perl; +open(FILE, "+<", "$ENV{MYSQLD_DATADIR}/test/t1.ibd") or die "open"; +binmode FILE; +seek(FILE, $ENV{'INNODB_PAGE_SIZE'} * 3 + 26, SEEK_SET) or die "seek"; +print FILE pack("H*", "c00lcafedeadb017"); +close FILE or die "close"; +open(FILE, "+<", "$ENV{MYSQLD_DATADIR}/test/t2.ibd") or die "open"; +binmode FILE; +seek(FILE, $ENV{'INNODB_PAGE_SIZE'} * 3 + 26, SEEK_SET) or die "seek"; +print FILE pack("H*", "c00lcafedeadb017"); +close FILE or die "close"; +open(FILE, "+<", "$ENV{MYSQLD_DATADIR}/test/t3.ibd") or die "open"; +binmode FILE; +seek(FILE, $ENV{'INNODB_PAGE_SIZE'} * 3 + 26, SEEK_SET) or die "seek"; +print FILE pack("H*", "c00lcafedeadb017"); +close FILE or die "close"; +EOF + +--source include/start_mysqld.inc + +--error ER_GET_ERRMSG +SELECT * FROM t1; +--error ER_GET_ERRMSG +SELECT * FROM t2; +--error ER_GET_ERRMSG +SELECT * FROM t3; + +--source include/shutdown_mysqld.inc + +--echo # Restore the original tables +--move_file $MYSQLD_DATADIR/test/t1.ibd.backup $MYSQLD_DATADIR/test/t1.ibd +--move_file $MYSQLD_DATADIR/test/t2.ibd.backup $MYSQLD_DATADIR/test/t2.ibd +--move_file $MYSQLD_DATADIR/test/t3.ibd.backup $MYSQLD_DATADIR/test/t3.ibd + +--source include/start_mysqld.inc + +DROP TABLE t1,t2,t3; diff --git a/mysql-test/suite/encryption/t/innodb-key-rotation-disable.test b/mysql-test/suite/encryption/t/innodb-key-rotation-disable.test index fdbd6c8da7c..574e0c3becc 100644 --- a/mysql-test/suite/encryption/t/innodb-key-rotation-disable.test +++ b/mysql-test/suite/encryption/t/innodb-key-rotation-disable.test @@ -8,9 +8,6 @@ SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_ --disable_query_log --disable_warnings -let $innodb_compression_algorithm_orig=`SELECT @@innodb_compression_algorithm`; -let $innodb_file_format_orig = `SELECT @@innodb_file_format`; -let $innodb_file_per_table_orig = `SELECT @@innodb_file_per_table`; let $encryption = `SELECT @@innodb_encrypt_tables`; SET GLOBAL innodb_file_format = `Barracuda`; SET GLOBAL innodb_file_per_table = ON; @@ -88,15 +85,4 @@ SET GLOBAL innodb_encrypt_tables=ON; -- source include/start_mysqld.inc -use test; drop database enctests; -# reset system - ---disable_query_log ---disable_warnings -EVAL SET GLOBAL innodb_compression_algorithm = $innodb_compression_algorithm_orig; -EVAL SET GLOBAL innodb_file_per_table = $innodb_file_per_table_orig; -EVAL SET GLOBAL innodb_file_format = $innodb_file_format_orig; -set global innodb_compression_algorithm = DEFAULT; ---enable_warnings ---enable_query_log diff --git a/mysql-test/suite/encryption/t/innodb-missing-key.test b/mysql-test/suite/encryption/t/innodb-missing-key.test index 84ca92010e9..8091d23cf1c 100644 --- a/mysql-test/suite/encryption/t/innodb-missing-key.test +++ b/mysql-test/suite/encryption/t/innodb-missing-key.test @@ -6,9 +6,9 @@ # # MDEV-11004: Unable to start (Segfault or os error 2) when encryption key missing # -call mtr.add_suppression("InnoDB: The page .* in file test/t. cannot be decrypted"); ---echo +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[123]\\.ibd' cannot be decrypted\\."); + --echo # Start server with keys2.txt -- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt -- source include/restart_mysqld.inc diff --git a/mysql-test/suite/encryption/t/innodb-page_encryption_compression.test b/mysql-test/suite/encryption/t/innodb-page_encryption_compression.test index 2fe29e0cb5c..d902fa38508 100644 --- a/mysql-test/suite/encryption/t/innodb-page_encryption_compression.test +++ b/mysql-test/suite/encryption/t/innodb-page_encryption_compression.test @@ -1,12 +1,8 @@ -- source include/have_innodb.inc -- source include/not_embedded.inc -- source include/have_file_key_management_plugin.inc --- source include/big_test.inc -# Test heavy not tested on valgrind --- source include/not_valgrind.inc let $innodb_compression_algorithm_orig=`SELECT @@innodb_compression_algorithm`; -let $encryption = `SELECT @@innodb_encrypt_tables`; # zlib set global innodb_compression_algorithm = 1; @@ -35,79 +31,29 @@ end// delimiter ;// commit; -set autocommit=0; -call innodb_insert_proc(5000); -commit; -set autocommit=1; - +begin; +call innodb_insert_proc(2000); insert into innodb_compact select * from innodb_normal; insert into innodb_dynamic select * from innodb_normal; +commit; -update innodb_normal set c1 = c1 + 1; -update innodb_compact set c1 = c1 + 1; -update innodb_dynamic set c1 = c1 + 1; -select count(*) from innodb_normal; -select count(*) from innodb_compact where c1 < 1500000; -select count(*) from innodb_dynamic where c1 < 1500000; -select count(*) from innodb_compact t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -select count(*) from innodb_dynamic t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; - -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_compressed'; -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decompressed'; +let $wait_condition= select variable_value > 0 from information_schema.global_status where variable_name = 'INNODB_NUM_PAGES_PAGE_COMPRESSED'; +--source include/wait_condition.inc +--let $restart_parameters=--innodb-encrypt-tables=OFF --source include/restart_mysqld.inc # zlib set global innodb_compression_algorithm = 1; -update innodb_normal set c1 = c1 + 1; -update innodb_compact set c1 = c1 + 1; -update innodb_dynamic set c1 = c1 + 1; -select count(*) from innodb_normal; -select count(*) from innodb_compact where c1 < 1500000; -select count(*) from innodb_dynamic where c1 < 1500000; -select count(*) from innodb_compact t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -select count(*) from innodb_dynamic t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; - -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_compressed'; -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decompressed'; - alter table innodb_normal engine=innodb page_compressed=DEFAULT; show create table innodb_normal; alter table innodb_compact engine=innodb encrypted=DEFAULT encryption_key_id=DEFAULT page_compressed=DEFAULT; show create table innodb_compact; alter table innodb_dynamic engine=innodb encrypted=DEFAULT encryption_key_id=DEFAULT page_compressed=DEFAULT; show create table innodb_dynamic; - ---source include/restart_mysqld.inc - -show create table innodb_normal; -show create table innodb_compact; -show create table innodb_dynamic; - -update innodb_normal set c1 = c1 + 1; -update innodb_compact set c1 = c1 + 1; -update innodb_dynamic set c1 = c1 + 1; -select count(*) from innodb_normal; -select count(*) from innodb_compact where c1 < 1500000; -select count(*) from innodb_dynamic where c1 < 1500000; -select count(*) from innodb_compact t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -select count(*) from innodb_dynamic t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; - -SELECT variable_value = 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; -SELECT variable_value = 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; -SELECT variable_value = 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_compressed'; -SELECT variable_value = 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decompressed'; +let $wait_condition= select variable_value > 0 from information_schema.global_status where variable_name = 'INNODB_NUM_PAGES_PAGE_DECOMPRESSED'; +--source include/wait_condition.inc drop procedure innodb_insert_proc; drop table innodb_normal; @@ -117,5 +63,4 @@ drop table innodb_dynamic; # reset system --disable_query_log EVAL SET GLOBAL innodb_compression_algorithm = $innodb_compression_algorithm_orig; -EVAL SET GLOBAL innodb_encrypt_tables = $encryption; --enable_query_log diff --git a/mysql-test/suite/encryption/t/innodb-page_encryption_log_encryption.test b/mysql-test/suite/encryption/t/innodb-page_encryption_log_encryption.test index f7eab67154d..5b472094653 100644 --- a/mysql-test/suite/encryption/t/innodb-page_encryption_log_encryption.test +++ b/mysql-test/suite/encryption/t/innodb-page_encryption_log_encryption.test @@ -2,10 +2,6 @@ -- source include/not_embedded.inc -- source include/have_file_key_management_plugin.inc -call mtr.add_suppression("KeyID 0 not found or with error. Check the key and the log*"); -call mtr.add_suppression("Disabling redo log encryp*"); -call mtr.add_suppression("InnoDB: Redo log crypto: Can't initialize to key version*"); - create table innodb_normal(c1 bigint not null, b char(200)) engine=innodb; show warnings; create table innodb_compact(c1 bigint not null, b char(200)) engine=innodb row_format=compact encrypted=yes encryption_key_id=1; @@ -35,36 +31,19 @@ end// delimiter ;// commit; -set autocommit=0; +begin; call innodb_insert_proc(2000); -commit; -set autocommit=1; - insert into innodb_compact select * from innodb_normal; insert into innodb_compressed select * from innodb_normal; insert into innodb_dynamic select * from innodb_normal; insert into innodb_redundant select * from innodb_normal; +commit; -update innodb_normal set c1 = c1 +1; -update innodb_compact set c1 = c1 + 1; -update innodb_compressed set c1 = c1 + 1; -update innodb_dynamic set c1 = c1 + 1; -update innodb_redundant set c1 = c1 + 1; -select count(*) from innodb_compact where c1 < 1500000; -select count(*) from innodb_compressed where c1 < 1500000; -select count(*) from innodb_dynamic where c1 < 1500000; -select count(*) from innodb_redundant where c1 < 1500000; -select count(*) from innodb_compact t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -select count(*) from innodb_dynamic t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -select count(*) from innodb_compressed t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -select count(*) from innodb_redundant t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; +let $wait_condition= select variable_value > 0 from information_schema.global_status where variable_name = 'INNODB_NUM_PAGES_ENCRYPTED'; +--source include/wait_condition.inc # Note there that these variables are updated only when real I/O is done, thus they are not reliable -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; +SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; --source include/restart_mysqld.inc @@ -74,22 +53,14 @@ update innodb_compact set c1 = c1 + 1; update innodb_compressed set c1 = c1 + 1; update innodb_dynamic set c1 = c1 + 1; update innodb_redundant set c1 = c1 + 1; -select count(*) from innodb_compact where c1 < 1500000; -select count(*) from innodb_compressed where c1 < 1500000; -select count(*) from innodb_dynamic where c1 < 1500000; -select count(*) from innodb_redundant where c1 < 1500000; -select count(*) from innodb_compact t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -select count(*) from innodb_dynamic t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -select count(*) from innodb_compressed t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -select count(*) from innodb_redundant t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; +let $wait_condition= select variable_value > 0 from information_schema.global_status where variable_name = 'INNODB_NUM_PAGES_ENCRYPTED'; +--source include/wait_condition.inc +SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; +SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; + +SET GLOBAL innodb_encrypt_tables=OFF; alter table innodb_compact engine=innodb encrypted=DEFAULT encryption_key_id=DEFAULT; show create table innodb_compact; alter table innodb_compressed engine=innodb encrypted=DEFAULT encryption_key_id=DEFAULT; @@ -99,30 +70,8 @@ show create table innodb_dynamic; alter table innodb_redundant engine=innodb encrypted=DEFAULT encryption_key_id=DEFAULT; show create table innodb_redundant; ---source include/restart_mysqld.inc - -show create table innodb_compact; -show create table innodb_compressed; -show create table innodb_dynamic; -show create table innodb_redundant; - -update innodb_normal set c1 = c1 +1; -update innodb_compact set c1 = c1 + 1; -update innodb_compressed set c1 = c1 + 1; -update innodb_dynamic set c1 = c1 + 1; -update innodb_redundant set c1 = c1 + 1; -select count(*) from innodb_compact where c1 < 1500000; -select count(*) from innodb_compressed where c1 < 1500000; -select count(*) from innodb_dynamic where c1 < 1500000; -select count(*) from innodb_redundant where c1 < 1500000; -select count(*) from innodb_compact t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -select count(*) from innodb_dynamic t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -select count(*) from innodb_compressed t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; -select count(*) from innodb_redundant t1, innodb_normal t2 where -t1.c1 = t2.c1 and t1.b = t2.b; +let $wait_condition= select variable_value > 0 from information_schema.global_status where variable_name = 'INNODB_NUM_PAGES_DECRYPTED'; +--source include/wait_condition.inc SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; @@ -133,7 +82,6 @@ drop table innodb_compact; drop table innodb_compressed; drop table innodb_dynamic; drop table innodb_redundant; - # # MDEV-8143: InnoDB: Database page corruption on disk or a failed file read # diff --git a/mysql-test/suite/encryption/t/innodb-redo-badkey.opt b/mysql-test/suite/encryption/t/innodb-redo-badkey.opt new file mode 100644 index 00000000000..343128e8803 --- /dev/null +++ b/mysql-test/suite/encryption/t/innodb-redo-badkey.opt @@ -0,0 +1,5 @@ +--innodb-change-buffering=all +--innodb-encrypt-tables=on +--innodb-tablespaces-encryption +--innodb-encryption-threads=2 +--innodb-default-encryption-key-id=4 diff --git a/mysql-test/suite/encryption/t/innodb-redo-badkey.test b/mysql-test/suite/encryption/t/innodb-redo-badkey.test new file mode 100644 index 00000000000..be8555584bb --- /dev/null +++ b/mysql-test/suite/encryption/t/innodb-redo-badkey.test @@ -0,0 +1,93 @@ +-- source include/have_innodb.inc +-- source include/have_file_key_management_plugin.inc +# embedded does not support restart +-- source include/not_embedded.inc + +call mtr.add_suppression("Plugin 'file_key_management'"); +call mtr.add_suppression("Plugin 'InnoDB' init function returned error."); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[0-9]+\\] in file .*test/t[1-4]\\.ibd cannot be decrypted"); +call mtr.add_suppression("InnoDB: Unable to decompress .*.test.t1\\.ibd\\[page id: space=[1-9][0-9]*, page number=[0-9]+\\]"); +call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed file read of tablespace test/t1 page \\[page id: space=[1-9][0-9]*, page number=[0-9]*\\]"); +call mtr.add_suppression("InnoDB: Plugin initialization aborted"); +call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed"); + +--echo # Restart mysqld --file-key-management-filename=keys2.txt +-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt +-- source include/restart_mysqld.inc + +--echo # Wait max 10 min for key encryption threads to encrypt all spaces +--let $wait_timeout= 600 +--let $wait_condition=SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 +--source include/wait_condition.inc + +--disable_warnings +SET GLOBAL innodb_file_format = `Barracuda`; +SET GLOBAL innodb_file_per_table = ON; +--enable_warnings + +create table t1(a int not null primary key auto_increment, c char(250), b blob, index(b(10))) engine=innodb row_format=compressed encrypted=yes encryption_key_id=4; +create table t2(a int not null primary key auto_increment, c char(250), b blob, index(b(10))) engine=innodb row_format=compressed; +create table t3(a int not null primary key auto_increment, c char(250), b blob, index(b(10))) engine=innodb encrypted=yes encryption_key_id=4; +create table t4(a int not null primary key auto_increment, c char(250), b blob, index(b(10))) engine=innodb; + +begin; +--disable_query_log +--let $i = 20 +begin; +while ($i) +{ + insert into t1(c,b) values (repeat('secret1',20), repeat('secret2',6000)); + dec $i; +} +--enable_query_log + +insert into t2 select * from t1; +insert into t3 select * from t1; +insert into t4 select * from t1; +commit; + +--source ../../suite/innodb/include/no_checkpoint_start.inc + +# +# We test redo log page read at recv_read_page using +# incorrect keys from std_data/keys.txt. If checkpoint +# happens we will skip this test. If no checkpoint +# happens, InnoDB refuses to start as used +# encryption key is incorrect. +# +SET GLOBAL innodb_flush_log_at_trx_commit=1; +begin; +update t1 set c = repeat('secret3', 20); +update t2 set c = repeat('secret4', 20); +update t3 set c = repeat('secret4', 20); +update t4 set c = repeat('secret4', 20); +insert into t1 (c,b) values (repeat('secret5',20), repeat('secret6',6000)); +insert into t2 (c,b) values (repeat('secret7',20), repeat('secret8',6000)); +insert into t3 (c,b) values (repeat('secret9',20), repeat('secre10',6000)); +insert into t4 (c,b) values (repeat('secre11',20), repeat('secre12',6000)); +COMMIT; +let $cleanup= drop table t1,t2,t3,t4; +--let CLEANUP_IF_CHECKPOINT= $cleanup; +--source ../../suite/innodb/include/no_checkpoint_end.inc + +--echo # restart +--error 1 +-- source include/start_mysqld.inc +--source include/kill_mysqld.inc + +# +# Now test with innodb-force-recovery=1 i.e. ignore corrupt pages +# + +--echo # Restart mysqld --innodb-force-recovery=1 +-- let $restart_parameters=--innodb-force-recovery=1 +--error 1 +-- source include/start_mysqld.inc + +--source include/kill_mysqld.inc + +--echo # Restart mysqld --file-key-management-filename=keys2.txt +-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt +-- source include/start_mysqld.inc + +drop table t1, t2,t3,t4; diff --git a/mysql-test/suite/encryption/t/innodb-redo-nokeys.opt b/mysql-test/suite/encryption/t/innodb-redo-nokeys.opt new file mode 100644 index 00000000000..21afc19fc5d --- /dev/null +++ b/mysql-test/suite/encryption/t/innodb-redo-nokeys.opt @@ -0,0 +1,3 @@ +--innodb-change-buffering=none +--innodb-encrypt-tables=on +--innodb-default-encryption-key-id=20 diff --git a/mysql-test/suite/encryption/t/innodb-redo-nokeys.test b/mysql-test/suite/encryption/t/innodb-redo-nokeys.test new file mode 100644 index 00000000000..e55e2ade153 --- /dev/null +++ b/mysql-test/suite/encryption/t/innodb-redo-nokeys.test @@ -0,0 +1,80 @@ +-- source include/have_innodb.inc +-- source include/have_file_key_management_plugin.inc +# embedded does not support restart +-- source include/not_embedded.inc + +call mtr.add_suppression("InnoDB: Block in space_id .*"); +call mtr.add_suppression("mysqld: File .*"); +call mtr.add_suppression("Plugin 'file_key_management' .*"); +call mtr.add_suppression("InnoDB: cannot enable encryption, encryption plugin is not available"); +call mtr.add_suppression("Plugin 'InnoDB' init function returned error."); +call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed."); +call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t2 cannot be decrypted."); +call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t3 cannot be decrypted."); +call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t4 cannot be decrypted."); +call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t1 cannot be decrypted."); + +--echo # Restart mysqld --file-key-management-filename=keys2.txt +-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt +-- source include/restart_mysqld.inc + +--disable_warnings +SET GLOBAL innodb_file_format = `Barracuda`; +SET GLOBAL innodb_file_per_table = ON; +--enable_warnings + +create table t1(a int not null primary key auto_increment, c char(200), b blob, index(b(10))) engine=innodb row_format=compressed encrypted=yes encryption_key_id=20; +create table t2(a int not null primary key auto_increment, c char(200), b blob, index(b(10))) engine=innodb row_format=compressed; +create table t3(a int not null primary key auto_increment, c char(200), b blob, index(b(10))) engine=innodb encrypted=yes encryption_key_id=20; +create table t4(a int not null primary key auto_increment, c char(200), b blob, index(b(10))) engine=innodb; + +begin; +--disable_query_log +--let $i = 20 +begin; +while ($i) +{ + insert into t1(c,b) values (repeat('secret1',20), repeat('secret2',6000)); + dec $i; +} +--enable_query_log + +insert into t2 select * from t1; +insert into t3 select * from t1; +insert into t4 select * from t1; +commit; + +--source ../../suite/innodb/include/no_checkpoint_start.inc +# +# We test redo log page read at recv_read_page using +# keys that are not in std_data/keys.txt. If checkpoint +# happens we will skip this test. If no checkpoint +# happens, InnoDB refuses to start as used +# encryption key is not found. +# +SET GLOBAL innodb_flush_log_at_trx_commit=1; +begin; +update t1 set c = repeat('secret3', 20); +update t2 set c = repeat('secret4', 20); +update t3 set c = repeat('secret4', 20); +update t4 set c = repeat('secret4', 20); +insert into t1 (c,b) values (repeat('secret5',20), repeat('secret6',6000)); +insert into t2 (c,b) values (repeat('secret7',20), repeat('secret8',6000)); +insert into t3 (c,b) values (repeat('secret9',20), repeat('secre10',6000)); +insert into t4 (c,b) values (repeat('secre11',20), repeat('secre12',6000)); +COMMIT; +let $cleanup= drop table t1,t2,t3,t4; +--let CLEANUP_IF_CHECKPOINT= $cleanup; +--source ../../suite/innodb/include/no_checkpoint_end.inc + +--echo # restart +-- source include/start_mysqld.inc +# +# In above server does start but InnoDB refuses to start +# thus we need to restart server with correct key file +# +--echo # Restart mysqld --file-key-management-filename=keys2.txt +-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt +-- source include/restart_mysqld.inc + +drop table t1, t2,t3,t4; diff --git a/mysql-test/suite/encryption/t/innodb_encrypt_log.opt b/mysql-test/suite/encryption/t/innodb_encrypt_log.opt index 24046fe779a..34dc9a80f87 100644 --- a/mysql-test/suite/encryption/t/innodb_encrypt_log.opt +++ b/mysql-test/suite/encryption/t/innodb_encrypt_log.opt @@ -3,4 +3,5 @@ --plugin-load-add=$FILE_KEY_MANAGEMENT_SO --loose-file-key-management --loose-file-key-management-filename=$MYSQL_TEST_DIR/std_data/logkey.txt +--innodb-log-files-in-group=1 --file-key-management-encryption-algorithm=aes_cbc diff --git a/mysql-test/suite/encryption/t/innodb_encrypt_log.test b/mysql-test/suite/encryption/t/innodb_encrypt_log.test index 5f60889600a..4b3d92e876c 100644 --- a/mysql-test/suite/encryption/t/innodb_encrypt_log.test +++ b/mysql-test/suite/encryption/t/innodb_encrypt_log.test @@ -32,6 +32,11 @@ INSERT INTO t VALUES (NULL,1,1,'private','secret'),(NULL,2,2,'sacred','success'), (NULL,3,3,'story','secure'),(NULL,4,4,'security','sacrament'); +# Prevent change buffering of key(col_char_key), so that +# after the restart, the data ('secret','success','secure','sacrament') +# cannot be emitted to the unencrypted redo log by change buffer merge. +SET GLOBAL innodb_change_buffering=none; + # Force a redo log flush at the next commit. SET GLOBAL innodb_flush_log_at_trx_commit=1; INSERT INTO t0 @@ -52,9 +57,6 @@ INSERT INTO t0 --echo # ib_logfile0 expecting NOT FOUND -- let SEARCH_FILE=$MYSQLD_DATADIR/ib_logfile0 -- source include/search_pattern_in_file.inc ---echo # ib_logfile1 expecting NOT FOUND --- let SEARCH_FILE=$MYSQLD_DATADIR/ib_logfile1 --- source include/search_pattern_in_file.inc --echo # Restart without redo log encryption -- let $restart_parameters=--skip-innodb-encrypt-log --innodb-log-files-in-group=1 @@ -73,7 +75,7 @@ INSERT INTO t0 VALUES(NULL, 5, 5, 'public', 'gossip'); --echo # ib_logfile0 expecting NOT FOUND -- let SEARCH_FILE=$MYSQLD_DATADIR/ib_logfile0 -- source include/search_pattern_in_file.inc ---let SEARCH_PATTERN=public|gossip +--let SEARCH_PATTERN=(public|gossip).* --echo # ib_logfile0 expecting FOUND -- let SEARCH_FILE=$MYSQLD_DATADIR/ib_logfile0 -- source include/search_pattern_in_file.inc diff --git a/mysql-test/suite/encryption/t/innodb_encryption-page-compression.test b/mysql-test/suite/encryption/t/innodb_encryption-page-compression.test index 606662e44e6..113b5001f0f 100644 --- a/mysql-test/suite/encryption/t/innodb_encryption-page-compression.test +++ b/mysql-test/suite/encryption/t/innodb_encryption-page-compression.test @@ -1,9 +1,6 @@ -- source include/have_innodb.inc -- source include/have_example_key_management_plugin.inc -# embedded does not support restart --- source include/not_embedded.inc - let $innodb_compression_algorithm_orig=`SELECT @@innodb_compression_algorithm`; let $innodb_encrypt_tables_orig = `SELECT @@innodb_encrypt_tables`; let $innodb_encryption_threads_orig = `SELECT @@innodb_encryption_threads`; @@ -56,11 +53,8 @@ end// delimiter ;// commit; -set autocommit=0; -call innodb_insert_proc(5000); -commit; -set autocommit=1; -select count(*) from innodb_normal; +begin; +call innodb_insert_proc(2000); insert into innodb_page_compressed1 select * from innodb_normal; insert into innodb_page_compressed2 select * from innodb_normal; insert into innodb_page_compressed3 select * from innodb_normal; @@ -71,23 +65,6 @@ insert into innodb_page_compressed7 select * from innodb_normal; insert into innodb_page_compressed8 select * from innodb_normal; insert into innodb_page_compressed9 select * from innodb_normal; commit; -select count(*) from innodb_page_compressed1 where c1 < 500000; -select count(*) from innodb_page_compressed2 where c1 < 500000; -select count(*) from innodb_page_compressed3 where c1 < 500000; -select count(*) from innodb_page_compressed4 where c1 < 500000; -select count(*) from innodb_page_compressed5 where c1 < 500000; -select count(*) from innodb_page_compressed6 where c1 < 500000; -select count(*) from innodb_page_compressed7 where c1 < 500000; -select count(*) from innodb_page_compressed8 where c1 < 500000; -select count(*) from innodb_page_compressed9 where c1 < 500000; - -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_compressed'; -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_decompressed'; - - ---source include/restart_mysqld.inc select count(*) from innodb_page_compressed1 where c1 < 500000; select count(*) from innodb_page_compressed2 where c1 < 500000; @@ -98,33 +75,18 @@ select count(*) from innodb_page_compressed6 where c1 < 500000; select count(*) from innodb_page_compressed7 where c1 < 500000; select count(*) from innodb_page_compressed8 where c1 < 500000; select count(*) from innodb_page_compressed9 where c1 < 500000; -update innodb_page_compressed1 set c1 = c1 + 1; -update innodb_page_compressed2 set c1 = c1 + 1; -update innodb_page_compressed3 set c1 = c1 + 1; -update innodb_page_compressed4 set c1 = c1 + 1; -update innodb_page_compressed5 set c1 = c1 + 1; -update innodb_page_compressed6 set c1 = c1 + 1; -update innodb_page_compressed7 set c1 = c1 + 1; -update innodb_page_compressed8 set c1 = c1 + 1; -update innodb_page_compressed9 set c1 = c1 + 1; -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; +let $wait_condition= select variable_value > 0 from information_schema.global_status where variable_name = 'INNODB_NUM_PAGES_PAGE_COMPRESSED'; +--source include/wait_condition.inc + +SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_compressed'; +SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_compressed'; SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_decompressed'; SET GLOBAL innodb_encryption_threads = 4; SET GLOBAL innodb_encrypt_tables = off; -select count(*) from innodb_page_compressed1 where c1 < 500000; -select count(*) from innodb_page_compressed2 where c1 < 500000; -select count(*) from innodb_page_compressed3 where c1 < 500000; -select count(*) from innodb_page_compressed4 where c1 < 500000; -select count(*) from innodb_page_compressed5 where c1 < 500000; -select count(*) from innodb_page_compressed6 where c1 < 500000; -select count(*) from innodb_page_compressed7 where c1 < 500000; -select count(*) from innodb_page_compressed8 where c1 < 500000; -select count(*) from innodb_page_compressed9 where c1 < 500000; update innodb_page_compressed1 set c1 = c1 + 1; update innodb_page_compressed2 set c1 = c1 + 1; update innodb_page_compressed3 set c1 = c1 + 1; @@ -135,9 +97,12 @@ update innodb_page_compressed7 set c1 = c1 + 1; update innodb_page_compressed8 set c1 = c1 + 1; update innodb_page_compressed9 set c1 = c1 + 1; +let $wait_condition= select variable_value > 0 from information_schema.global_status where variable_name = 'INNODB_NUM_PAGES_DECRYPTED'; +--source include/wait_condition.inc + SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_compressed'; +SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; +SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_compressed'; SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_decompressed'; drop procedure innodb_insert_proc; diff --git a/mysql-test/suite/encryption/t/innodb_encryption.test b/mysql-test/suite/encryption/t/innodb_encryption.test index 50aca2a7260..35c2b3695a9 100644 --- a/mysql-test/suite/encryption/t/innodb_encryption.test +++ b/mysql-test/suite/encryption/t/innodb_encryption.test @@ -3,6 +3,7 @@ # -- source include/have_innodb.inc -- source include/have_example_key_management_plugin.inc +-- source include/innodb_undo_tablespaces.inc # embedded does not support restart -- source include/not_embedded.inc @@ -11,78 +12,29 @@ SET @start_global_value = @@global.innodb_encryption_threads; SHOW VARIABLES LIKE 'innodb_encrypt%'; -DESCRIBE INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION; +SET GLOBAL innodb_encrypt_tables = ON; ---echo # Wait max 5 min for key encryption threads to encrypt one space -let $cnt=300; -while ($cnt) -{ - let $success=`SELECT COUNT(*) > 0 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION > 0`; - if ($success) - { - let $cnt=0; - } - if (!$success) - { - real_sleep 1; - dec $cnt; - } -} -if (!$success) -{ - SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION; - SHOW STATUS LIKE 'innodb_encryption%'; - -- die Timeout waiting for encryption threads -} ---echo # Success! +--echo # Wait max 10 min for key encryption threads to encrypt all spaces +--let $wait_timeout= 600 +--let $wait_condition=SELECT COUNT(*) >= 3 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; +--source include/wait_condition.inc + +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; ---echo # Wait max 10 min for key encryption threads to encrypt all space -let $cnt=600; -while ($cnt) -{ - let $success=`SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0`; - if ($success) - { - let $cnt=0; - } - if (!$success) - { - real_sleep 1; - dec $cnt; - } -} -if (!$success) -{ - SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION; - SHOW STATUS LIKE 'innodb_encryption%'; - -- die Timeout waiting for encryption threads -} --echo # Success! --echo # Now turn off encryption and wait for threads to decrypt everything SET GLOBAL innodb_encrypt_tables = off; ---echo # Wait max 10 min for key encryption threads to decrypt all space -let $cnt=600; -while ($cnt) -{ - let $success=`SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0`; - if ($success) - { - let $cnt=0; - } - if (!$success) - { - real_sleep 1; - dec $cnt; - } -} -if (!$success) -{ - SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION; - SHOW STATUS LIKE 'innodb_encryption%'; - -- die Timeout waiting for encryption threads -} +--echo # Wait max 10 min for key encryption threads to encrypt all spaces +--let $wait_timeout= 600 +--let $wait_condition=SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; +--source include/wait_condition.inc + +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; + --echo # Success! --echo # Shutdown innodb_encryption_threads @@ -93,84 +45,32 @@ SET GLOBAL innodb_encryption_threads=0; SET GLOBAL innodb_encrypt_tables = on; --echo # Wait 15s to check that nothing gets encrypted -let $cnt=15; -while ($cnt) -{ - let $success=`SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0`; - if ($success) - { - real_sleep 1; - dec $cnt; - } - if (!$success) - { - SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; - -- die Failure, tablespace getting encrypted even if innodb_encryption_threads=0 - } -} +--let $wait_timeout= 15 +--let $wait_condition=SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; +--source include/wait_condition.inc + +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; + --echo # Success! --echo # Startup innodb_encryption_threads SET GLOBAL innodb_encryption_threads=@start_global_value; ---echo # Wait 1 min to check that it start encrypting again -let $cnt=60; -while ($cnt) -{ - let $success=`SELECT COUNT(*) > 0 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 OR KEY_ROTATION_PAGE_NUMBER IS NOT NULL`; - if ($success) - { - let $cnt=0; - } - if (!$success) - { - real_sleep 1; - dec $cnt; - } -} -if (!$success) -{ - SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION; - SHOW STATUS LIKE 'innodb_encryption%'; - -- die Timeout waiting for encryption threads -} ---echo # Success! +--echo # Wait max 10 min for key encryption threads to encrypt all spaces +--let $wait_timeout= 600 +--let $wait_condition=SELECT COUNT(*) >=3 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; +--source include/wait_condition.inc + +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; ---echo # ---echo # Check that restart with encryption turned off works ---echo # even if spaces are encrypted ---echo # ---echo # First wait max 10 min for key encryption threads to encrypt all spaces -let $cnt=600; -while ($cnt) -{ - let $success=`SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0`; - if ($success) - { - let $cnt=0; - } - if (!$success) - { - real_sleep 1; - dec $cnt; - } -} -if (!$success) -{ - SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION; - SHOW STATUS LIKE 'innodb_encryption%'; - -- die Timeout waiting for encryption threads -} --echo # Success! --echo # Restart mysqld --innodb_encrypt_tables=0 --innodb_encryption_threads=0 -- let $restart_parameters=--innodb_encrypt_tables=0 --innodb_encryption_threads=0 -- source include/restart_mysqld.inc SHOW VARIABLES LIKE 'innodb_encrypt%'; -SELECT COUNT(*) > 0 as should_be_1 -FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION -WHERE MIN_KEY_VERSION <> 0; ---echo # Restart mysqld again...with default options --- let $restart_parameters= --- source include/restart_mysqld.inc +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; diff --git a/mysql-test/suite/encryption/t/innodb_encryption_discard_import.test b/mysql-test/suite/encryption/t/innodb_encryption_discard_import.test index 075cb1cf77e..3e78d468ab1 100644 --- a/mysql-test/suite/encryption/t/innodb_encryption_discard_import.test +++ b/mysql-test/suite/encryption/t/innodb_encryption_discard_import.test @@ -3,11 +3,7 @@ -- source include/not_valgrind.inc -- source include/not_embedded.inc -call mtr.add_suppression("InnoDB: Tablespace for table .* is set as discarded."); -call mtr.add_suppression("InnoDB: Cannot calculate statistics for table .* because the .ibd file is missing. Please refer to .* for how to resolve the issue."); - -let $MYSQLD_TMPDIR = `SELECT @@tmpdir`; -let $MYSQLD_DATADIR = `SELECT @@datadir`; +let MYSQLD_DATADIR = `SELECT @@datadir`; --let SEARCH_RANGE = 10000000 --let $id = `SELECT RAND()` @@ -59,7 +55,6 @@ set autocommit=1; -- let SEARCH_FILE=$t3_IBD -- source include/search_pattern_in_file.inc -let MYSQLD_DATADIR =`SELECT @@datadir`; --list_files $MYSQLD_DATADIR/test FLUSH TABLES t1, t2, t3 FOR EXPORT; perl; diff --git a/mysql-test/suite/encryption/t/innodb_lotoftables.test b/mysql-test/suite/encryption/t/innodb_lotoftables.test index 6e87c93df4b..cd3c6a30c07 100644 --- a/mysql-test/suite/encryption/t/innodb_lotoftables.test +++ b/mysql-test/suite/encryption/t/innodb_lotoftables.test @@ -48,9 +48,8 @@ show status like 'innodb_pages0_read%'; # # Verify # ---echo # should be 100 - -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE NAME LIKE 'innodb_encrypted%'; +--echo # should be empty +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE NAME LIKE 'innodb_encrypted%'; # # This will create 100 tables that are encrypted always @@ -84,10 +83,10 @@ show status like 'innodb_pages0_read%'; # # Verify # ---echo # should be 100 -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%'; ---echo # should be 100 -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%'; +--echo # should contain 100 tables +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; +--echo # should contain 0 tables +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; # # This will create 100 tables that are not encrypted @@ -121,45 +120,26 @@ show status like 'innodb_pages0_read%'; # # Verify # ---echo # should be 100 -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%'; ---echo # should be 200 -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%'; +--echo # should contain 100 tables +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; +--echo # should contain 100 tables +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; use test; show status like 'innodb_pages0_read%'; -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%'; -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%'; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; SET GLOBAL innodb_encrypt_tables = on; SET GLOBAL innodb_encryption_threads=4; ---echo # Wait until all encrypted tables have been encrypted -let $cnt=600; -while ($cnt) -{ - let $success=`SELECT COUNT(*) = 100 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0`; - if ($success) - { - let $cnt=0; - } - if (!$success) - { - real_sleep 1; - dec $cnt; - } -} -if (!$success) -{ - SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; - SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; - SHOW STATUS LIKE 'innodb_encryption%'; - -- die Timeout waiting for encryption threads -} +--let $wait_timeout= 600 +--let $wait_condition=SELECT COUNT(*) = 100 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; +--source include/wait_condition.inc -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%'; -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%'; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; show status like 'innodb_pages0_read%'; --echo # Success! @@ -226,40 +206,19 @@ while ($tables) show status like 'innodb_pages0_read%'; -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%'; -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%'; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; SET GLOBAL innodb_encrypt_tables = off; SET GLOBAL innodb_encryption_threads=4; ---echo # Wait until all default encrypted tables have been decrypted -let $cnt=600; -while ($cnt) -{ - let $success=`SELECT COUNT(*) = 100 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0`; - if ($success) - { - let $cnt=0; - } - if (!$success) - { - real_sleep 1; - dec $cnt; - } -} -if (!$success) -{ - SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; - SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; - SHOW STATUS LIKE 'innodb_encryption%'; - -- die Timeout waiting for encryption threads -} +--let $wait_timeout= 600 +--let $wait_condition=SELECT COUNT(*) = 100 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; +--source include/wait_condition.inc ---echo # should be 100 -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%'; ---echo # should be 200 -SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%'; -show status like 'innodb_pages0_read%'; + +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME; # # Cleanup diff --git a/mysql-test/suite/encryption/t/innodb_onlinealter_encryption.opt b/mysql-test/suite/encryption/t/innodb_onlinealter_encryption.opt index bcff011eb82..38d69691ed6 100644 --- a/mysql-test/suite/encryption/t/innodb_onlinealter_encryption.opt +++ b/mysql-test/suite/encryption/t/innodb_onlinealter_encryption.opt @@ -3,6 +3,3 @@ --innodb-encryption-rotate-key-age=15 --innodb-encryption-threads=4 --innodb-tablespaces-encryption ---innodb-max-dirty-pages-pct=0.001 - - diff --git a/mysql-test/suite/encryption/t/innodb_onlinealter_encryption.test b/mysql-test/suite/encryption/t/innodb_onlinealter_encryption.test index e7e8405e839..b222e1882d5 100644 --- a/mysql-test/suite/encryption/t/innodb_onlinealter_encryption.test +++ b/mysql-test/suite/encryption/t/innodb_onlinealter_encryption.test @@ -17,8 +17,8 @@ begin declare current_num int; set current_num = 0; while current_num < repeat_count do - insert into t1 values (current_num,repeat('foobar',42)); - insert into t2 values (current_num,repeat('temp', 42)); + insert into t1 values (current_num,repeat('foobar',12)); + insert into t2 values (current_num,repeat('tempsecret', 12)); insert into t3 values (current_num,repeat('barfoo',42)); insert into t4 values (current_num,repeat('repeat',42)); insert into t5 values (current_num,substring('A BC DEF GHIJ KLM NOPQRS TUV WXYZ 012 3456789', rand()*36+1, 100), repeat('author new',22)); @@ -42,14 +42,13 @@ set autocommit=1; --let $MYSQLD_DATADIR=`select @@datadir` --source include/shutdown_mysqld.inc ---source include/wait_until_disconnected.inc --let SEARCH_RANGE = 10000000 --let SEARCH_PATTERN=foobar --echo # t1 yes on expecting NOT FOUND -- let SEARCH_FILE=$MYSQLD_DATADIR/test/t1.ibd -- source include/search_pattern_in_file.inc ---let SEARCH_PATTERN=temp +--let SEARCH_PATTERN=tempsecret --echo # t2 ... on expecting NOT FOUND -- let SEARCH_FILE=$MYSQLD_DATADIR/test/t2.ibd -- source include/search_pattern_in_file.inc @@ -103,13 +102,12 @@ SHOW CREATE TABLE t6; SHOW CREATE TABLE t7; --source include/shutdown_mysqld.inc ---source include/wait_until_disconnected.inc --let SEARCH_PATTERN=foobar --echo # t1 yes on expecting NOT FOUND -- let SEARCH_FILE=$MYSQLD_DATADIR/test/t1.ibd -- source include/search_pattern_in_file.inc ---let SEARCH_PATTERN=temp +--let SEARCH_PATTERN=tempsecret --echo # t2 ... on expecting NOT FOUND -- let SEARCH_FILE=$MYSQLD_DATADIR/test/t2.ibd -- source include/search_pattern_in_file.inc diff --git a/mysql-test/suite/encryption/t/second_plugin-12863.test b/mysql-test/suite/encryption/t/second_plugin-12863.test new file mode 100644 index 00000000000..c04fccf9716 --- /dev/null +++ b/mysql-test/suite/encryption/t/second_plugin-12863.test @@ -0,0 +1,16 @@ +# +# MDEV-12863 No table can be created after second encryption plugin attempted to load +# +--source include/have_innodb.inc +--source include/have_file_key_management_plugin.inc + +call mtr.add_suppression('debug.key.management'); + +--error 1123 +install soname 'debug_key_management'; + +create table t1 (a varchar(255)) engine=innodb encrypted=yes; +create table t2 (a varchar(255)) engine=innodb; +create table t3 (a varchar(255)) engine=innodb encrypted=no; + +drop table t1, t2, t3; diff --git a/mysql-test/suite/engines/funcs/r/tc_partition_analyze.result b/mysql-test/suite/engines/funcs/r/tc_partition_analyze.result index 852b300332b..884408d29b3 100644 --- a/mysql-test/suite/engines/funcs/r/tc_partition_analyze.result +++ b/mysql-test/suite/engines/funcs/r/tc_partition_analyze.result @@ -24,13 +24,13 @@ t1 CREATE TABLE `t1` ( `c2` char(10) DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE (c1) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (200) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (300) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN (400) ENGINE = ENGINE, - PARTITION p4 VALUES LESS THAN (500) ENGINE = ENGINE, - PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (200) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (300) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN (400) ENGINE = ENGINE, + PARTITION `p4` VALUES LESS THAN (500) ENGINE = ENGINE, + PARTITION `p5` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) ALTER TABLE t1 ANALYZE PARTITION p1,p2; Table Op Msg_type Msg_text test.t1 analyze status OK @@ -48,13 +48,13 @@ t1 CREATE TABLE `t1` ( `c2` char(10) DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE (c1) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (200) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (300) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN (400) ENGINE = ENGINE, - PARTITION p4 VALUES LESS THAN (500) ENGINE = ENGINE, - PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (200) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (300) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN (400) ENGINE = ENGINE, + PARTITION `p4` VALUES LESS THAN (500) ENGINE = ENGINE, + PARTITION `p5` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test diff --git a/mysql-test/suite/engines/funcs/r/tc_partition_change_from_range_to_hash_key.result b/mysql-test/suite/engines/funcs/r/tc_partition_change_from_range_to_hash_key.result index 805e4637928..93208147dc4 100644 --- a/mysql-test/suite/engines/funcs/r/tc_partition_change_from_range_to_hash_key.result +++ b/mysql-test/suite/engines/funcs/r/tc_partition_change_from_range_to_hash_key.result @@ -34,7 +34,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 5 ALTER TABLE t1 COALESCE PARTITION 2; SELECT * FROM t1 ORDER BY c1; @@ -56,7 +56,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; @@ -97,7 +97,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 5 ALTER TABLE t1 COALESCE PARTITION 2; SELECT * FROM t1 ORDER BY c1; @@ -119,7 +119,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; @@ -160,7 +160,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 5 ALTER TABLE t1 COALESCE PARTITION 2; SELECT * FROM t1 ORDER BY c1; @@ -182,7 +182,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; @@ -223,7 +223,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 5 ALTER TABLE t1 COALESCE PARTITION 2; SELECT * FROM t1 ORDER BY c1; @@ -245,7 +245,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; @@ -286,7 +286,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 5 ALTER TABLE t1 COALESCE PARTITION 2; SELECT * FROM t1 ORDER BY c1; @@ -308,7 +308,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; @@ -349,7 +349,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 5 ALTER TABLE t1 COALESCE PARTITION 2; SELECT * FROM t1 ORDER BY c1; @@ -371,7 +371,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; @@ -412,7 +412,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 5 ALTER TABLE t1 COALESCE PARTITION 2; SELECT * FROM t1 ORDER BY c1; @@ -434,7 +434,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; @@ -475,7 +475,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 5 ALTER TABLE t1 COALESCE PARTITION 2; SELECT * FROM t1 ORDER BY c1; @@ -497,7 +497,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; @@ -538,7 +538,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 5 ALTER TABLE t1 COALESCE PARTITION 2; SELECT * FROM t1 ORDER BY c1; @@ -560,7 +560,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; @@ -601,7 +601,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 5 ALTER TABLE t1 COALESCE PARTITION 2; SELECT * FROM t1 ORDER BY c1; @@ -623,7 +623,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; @@ -664,7 +664,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 5 ALTER TABLE t1 COALESCE PARTITION 2; SELECT * FROM t1 ORDER BY c1; @@ -686,7 +686,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; @@ -727,7 +727,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 5 ALTER TABLE t1 COALESCE PARTITION 2; SELECT * FROM t1 ORDER BY c1; @@ -749,7 +749,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; diff --git a/mysql-test/suite/engines/funcs/r/tc_partition_check.result b/mysql-test/suite/engines/funcs/r/tc_partition_check.result index f2e10ec2a06..79592633197 100644 --- a/mysql-test/suite/engines/funcs/r/tc_partition_check.result +++ b/mysql-test/suite/engines/funcs/r/tc_partition_check.result @@ -24,13 +24,13 @@ t1 CREATE TABLE `t1` ( `c2` char(10) DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE (c1) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (200) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (300) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN (400) ENGINE = ENGINE, - PARTITION p4 VALUES LESS THAN (500) ENGINE = ENGINE, - PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (200) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (300) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN (400) ENGINE = ENGINE, + PARTITION `p4` VALUES LESS THAN (500) ENGINE = ENGINE, + PARTITION `p5` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) ALTER TABLE t1 CHECK PARTITION p1,p2; Table Op Msg_type Msg_text test.t1 check status OK @@ -48,13 +48,13 @@ t1 CREATE TABLE `t1` ( `c2` char(10) DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE (c1) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (200) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (300) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN (400) ENGINE = ENGINE, - PARTITION p4 VALUES LESS THAN (500) ENGINE = ENGINE, - PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (200) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (300) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN (400) ENGINE = ENGINE, + PARTITION `p4` VALUES LESS THAN (500) ENGINE = ENGINE, + PARTITION `p5` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test diff --git a/mysql-test/suite/engines/funcs/r/tc_partition_hash.result b/mysql-test/suite/engines/funcs/r/tc_partition_hash.result index 8c29eb32d90..e7ac578fbfe 100644 --- a/mysql-test/suite/engines/funcs/r/tc_partition_hash.result +++ b/mysql-test/suite/engines/funcs/r/tc_partition_hash.result @@ -9,7 +9,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 1 DROP TABLE t1; SHOW TABLES; @@ -24,7 +24,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 1 DROP TABLE t1; SHOW TABLES; @@ -39,7 +39,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 1 DROP TABLE t1; SHOW TABLES; @@ -54,7 +54,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 1 DROP TABLE t1; SHOW TABLES; @@ -69,7 +69,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 1 DROP TABLE t1; SHOW TABLES; @@ -84,7 +84,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 1 DROP TABLE t1; SHOW TABLES; @@ -99,7 +99,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 1 DROP TABLE t1; SHOW TABLES; @@ -114,7 +114,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 1 DROP TABLE t1; SHOW TABLES; @@ -129,7 +129,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 1 DROP TABLE t1; SHOW TABLES; @@ -144,7 +144,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 1 DROP TABLE t1; SHOW TABLES; @@ -159,7 +159,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 1 DROP TABLE t1; SHOW TABLES; @@ -174,7 +174,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 1 DROP TABLE t1; SHOW TABLES; @@ -189,7 +189,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -204,7 +204,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -219,7 +219,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -234,7 +234,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -249,7 +249,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -264,7 +264,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -279,7 +279,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -294,7 +294,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -309,7 +309,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -324,7 +324,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -339,7 +339,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -354,7 +354,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -369,7 +369,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; @@ -384,7 +384,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; @@ -399,7 +399,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; @@ -414,7 +414,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; @@ -429,7 +429,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; @@ -444,7 +444,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; @@ -459,7 +459,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; @@ -474,7 +474,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; @@ -489,7 +489,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; @@ -504,7 +504,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; @@ -519,7 +519,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; @@ -534,7 +534,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 3 DROP TABLE t1; SHOW TABLES; @@ -549,7 +549,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -564,7 +564,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -579,7 +579,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -594,7 +594,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -609,7 +609,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -624,7 +624,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -639,7 +639,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -654,7 +654,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -669,7 +669,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -684,7 +684,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -699,7 +699,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -714,7 +714,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -729,7 +729,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -744,7 +744,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -759,7 +759,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -774,7 +774,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -789,7 +789,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -804,7 +804,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -819,7 +819,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -834,7 +834,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -849,7 +849,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -864,7 +864,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -879,7 +879,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -894,7 +894,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -909,7 +909,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 10 DROP TABLE t1; SHOW TABLES; @@ -924,7 +924,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 10 DROP TABLE t1; SHOW TABLES; @@ -939,7 +939,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 10 DROP TABLE t1; SHOW TABLES; @@ -954,7 +954,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 10 DROP TABLE t1; SHOW TABLES; @@ -969,7 +969,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 10 DROP TABLE t1; SHOW TABLES; @@ -984,7 +984,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 10 DROP TABLE t1; SHOW TABLES; @@ -999,7 +999,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 10 DROP TABLE t1; SHOW TABLES; @@ -1014,7 +1014,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 10 DROP TABLE t1; SHOW TABLES; @@ -1029,7 +1029,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 10 DROP TABLE t1; SHOW TABLES; @@ -1044,7 +1044,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 10 DROP TABLE t1; SHOW TABLES; @@ -1059,7 +1059,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 10 DROP TABLE t1; SHOW TABLES; @@ -1074,7 +1074,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 10 DROP TABLE t1; SHOW TABLES; @@ -1089,7 +1089,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 50 DROP TABLE t1; SHOW TABLES; @@ -1104,7 +1104,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 50 DROP TABLE t1; SHOW TABLES; @@ -1119,7 +1119,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 50 DROP TABLE t1; SHOW TABLES; @@ -1134,7 +1134,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 50 DROP TABLE t1; SHOW TABLES; @@ -1149,7 +1149,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 50 DROP TABLE t1; SHOW TABLES; @@ -1164,7 +1164,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 50 DROP TABLE t1; SHOW TABLES; @@ -1179,7 +1179,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 50 DROP TABLE t1; SHOW TABLES; @@ -1194,7 +1194,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 50 DROP TABLE t1; SHOW TABLES; @@ -1209,7 +1209,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 50 DROP TABLE t1; SHOW TABLES; @@ -1224,7 +1224,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 50 DROP TABLE t1; SHOW TABLES; @@ -1239,7 +1239,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 50 DROP TABLE t1; SHOW TABLES; @@ -1254,7 +1254,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 50 DROP TABLE t1; SHOW TABLES; diff --git a/mysql-test/suite/engines/funcs/r/tc_partition_hash_date_function.result b/mysql-test/suite/engines/funcs/r/tc_partition_hash_date_function.result index 368ba8c0249..96725b7328a 100644 --- a/mysql-test/suite/engines/funcs/r/tc_partition_hash_date_function.result +++ b/mysql-test/suite/engines/funcs/r/tc_partition_hash_date_function.result @@ -10,7 +10,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(c3)) + PARTITION BY HASH (year(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -25,7 +25,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(c3)) + PARTITION BY HASH (year(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -40,7 +40,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(c3)) + PARTITION BY HASH (year(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -55,7 +55,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(c3)) + PARTITION BY HASH (year(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -70,7 +70,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(c3)) + PARTITION BY HASH (year(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -85,7 +85,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(c3)) + PARTITION BY HASH (year(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -100,7 +100,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(c3)) + PARTITION BY HASH (year(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -115,7 +115,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(c3)) + PARTITION BY HASH (year(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -130,7 +130,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(c3)) + PARTITION BY HASH (year(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -145,7 +145,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(c3)) + PARTITION BY HASH (year(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -160,7 +160,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(c3)) + PARTITION BY HASH (year(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -175,7 +175,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(c3)) + PARTITION BY HASH (year(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -190,7 +190,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (MONTH(c3)) + PARTITION BY HASH (month(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -205,7 +205,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (MONTH(c3)) + PARTITION BY HASH (month(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -220,7 +220,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (MONTH(c3)) + PARTITION BY HASH (month(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -235,7 +235,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (MONTH(c3)) + PARTITION BY HASH (month(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -250,7 +250,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (MONTH(c3)) + PARTITION BY HASH (month(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -265,7 +265,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (MONTH(c3)) + PARTITION BY HASH (month(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -280,7 +280,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (MONTH(c3)) + PARTITION BY HASH (month(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -295,7 +295,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (MONTH(c3)) + PARTITION BY HASH (month(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -310,7 +310,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (MONTH(c3)) + PARTITION BY HASH (month(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -325,7 +325,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (MONTH(c3)) + PARTITION BY HASH (month(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -340,7 +340,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (MONTH(c3)) + PARTITION BY HASH (month(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -355,7 +355,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (MONTH(c3)) + PARTITION BY HASH (month(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -370,7 +370,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAY(c3)) + PARTITION BY HASH (dayofmonth(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -385,7 +385,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAY(c3)) + PARTITION BY HASH (dayofmonth(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -400,7 +400,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAY(c3)) + PARTITION BY HASH (dayofmonth(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -415,7 +415,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAY(c3)) + PARTITION BY HASH (dayofmonth(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -430,7 +430,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAY(c3)) + PARTITION BY HASH (dayofmonth(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -445,7 +445,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAY(c3)) + PARTITION BY HASH (dayofmonth(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -460,7 +460,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAY(c3)) + PARTITION BY HASH (dayofmonth(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -475,7 +475,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAY(c3)) + PARTITION BY HASH (dayofmonth(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -490,7 +490,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAY(c3)) + PARTITION BY HASH (dayofmonth(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -505,7 +505,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAY(c3)) + PARTITION BY HASH (dayofmonth(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -520,7 +520,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAY(c3)) + PARTITION BY HASH (dayofmonth(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -535,7 +535,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAY(c3)) + PARTITION BY HASH (dayofmonth(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -550,7 +550,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAYOFWEEK(c3)) + PARTITION BY HASH (dayofweek(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -565,7 +565,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAYOFWEEK(c3)) + PARTITION BY HASH (dayofweek(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -580,7 +580,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAYOFWEEK(c3)) + PARTITION BY HASH (dayofweek(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -595,7 +595,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAYOFWEEK(c3)) + PARTITION BY HASH (dayofweek(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -610,7 +610,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAYOFWEEK(c3)) + PARTITION BY HASH (dayofweek(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -625,7 +625,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAYOFWEEK(c3)) + PARTITION BY HASH (dayofweek(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -640,7 +640,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAYOFWEEK(c3)) + PARTITION BY HASH (dayofweek(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -655,7 +655,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAYOFWEEK(c3)) + PARTITION BY HASH (dayofweek(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -670,7 +670,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAYOFWEEK(c3)) + PARTITION BY HASH (dayofweek(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -685,7 +685,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAYOFWEEK(c3)) + PARTITION BY HASH (dayofweek(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -700,7 +700,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAYOFWEEK(c3)) + PARTITION BY HASH (dayofweek(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test @@ -715,7 +715,7 @@ t2 CREATE TABLE `t2` ( `c2` char(5) DEFAULT NULL, `c3` datetime DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAYOFWEEK(c3)) + PARTITION BY HASH (dayofweek(`c3`)) DROP TABLE t2; SHOW TABLES; Tables_in_test diff --git a/mysql-test/suite/engines/funcs/r/tc_partition_key.result b/mysql-test/suite/engines/funcs/r/tc_partition_key.result index 9ca335be0e2..9286b5d9649 100644 --- a/mysql-test/suite/engines/funcs/r/tc_partition_key.result +++ b/mysql-test/suite/engines/funcs/r/tc_partition_key.result @@ -9,7 +9,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -24,7 +24,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -39,7 +39,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -54,7 +54,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -69,7 +69,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -84,7 +84,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -99,7 +99,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -114,7 +114,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -129,7 +129,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -144,7 +144,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -159,7 +159,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -174,7 +174,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -189,7 +189,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -204,7 +204,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -219,7 +219,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -234,7 +234,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -249,7 +249,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -264,7 +264,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -279,7 +279,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -294,7 +294,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -309,7 +309,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -324,7 +324,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -339,7 +339,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -354,7 +354,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -369,7 +369,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -384,7 +384,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -399,7 +399,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -414,7 +414,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -429,7 +429,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -444,7 +444,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -459,7 +459,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -474,7 +474,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -489,7 +489,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -504,7 +504,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -519,7 +519,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -534,7 +534,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -549,7 +549,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; @@ -564,7 +564,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; @@ -579,7 +579,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; @@ -594,7 +594,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; @@ -609,7 +609,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; @@ -624,7 +624,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; @@ -639,7 +639,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; @@ -654,7 +654,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; @@ -669,7 +669,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; @@ -684,7 +684,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; @@ -699,7 +699,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; @@ -714,7 +714,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; diff --git a/mysql-test/suite/engines/funcs/r/tc_partition_linear_key.result b/mysql-test/suite/engines/funcs/r/tc_partition_linear_key.result index 0a560743832..2eb32646f9f 100644 --- a/mysql-test/suite/engines/funcs/r/tc_partition_linear_key.result +++ b/mysql-test/suite/engines/funcs/r/tc_partition_linear_key.result @@ -9,7 +9,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -24,7 +24,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -39,7 +39,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -54,7 +54,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -69,7 +69,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -84,7 +84,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -99,7 +99,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -114,7 +114,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -129,7 +129,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -144,7 +144,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -159,7 +159,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -174,7 +174,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -189,7 +189,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -204,7 +204,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -219,7 +219,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -234,7 +234,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -249,7 +249,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -264,7 +264,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -279,7 +279,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -294,7 +294,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -309,7 +309,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -324,7 +324,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -339,7 +339,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -354,7 +354,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 4 DROP TABLE t1; SHOW TABLES; @@ -369,7 +369,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -384,7 +384,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -399,7 +399,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -414,7 +414,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -429,7 +429,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -444,7 +444,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -459,7 +459,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -474,7 +474,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -489,7 +489,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -504,7 +504,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -519,7 +519,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -534,7 +534,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 5 DROP TABLE t1; SHOW TABLES; @@ -549,7 +549,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; @@ -564,7 +564,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; @@ -579,7 +579,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; @@ -594,7 +594,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; @@ -609,7 +609,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; @@ -624,7 +624,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; @@ -639,7 +639,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; @@ -654,7 +654,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; @@ -669,7 +669,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; @@ -684,7 +684,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; @@ -699,7 +699,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; @@ -714,7 +714,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 99 DROP TABLE t1; SHOW TABLES; diff --git a/mysql-test/suite/engines/funcs/r/tc_partition_optimize.result b/mysql-test/suite/engines/funcs/r/tc_partition_optimize.result index c30705c8194..0eb1143ca47 100644 --- a/mysql-test/suite/engines/funcs/r/tc_partition_optimize.result +++ b/mysql-test/suite/engines/funcs/r/tc_partition_optimize.result @@ -24,13 +24,13 @@ t1 CREATE TABLE `t1` ( `c2` char(10) DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE (c1) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (200) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (300) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN (400) ENGINE = ENGINE, - PARTITION p4 VALUES LESS THAN (500) ENGINE = ENGINE, - PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (200) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (300) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN (400) ENGINE = ENGINE, + PARTITION `p4` VALUES LESS THAN (500) ENGINE = ENGINE, + PARTITION `p5` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) ALTER TABLE t1 OPTIMIZE PARTITION p1,p2; SELECT * FROM t1 ORDER BY c1; c1 c2 @@ -46,13 +46,13 @@ t1 CREATE TABLE `t1` ( `c2` char(10) DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE (c1) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (200) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (300) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN (400) ENGINE = ENGINE, - PARTITION p4 VALUES LESS THAN (500) ENGINE = ENGINE, - PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (200) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (300) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN (400) ENGINE = ENGINE, + PARTITION `p4` VALUES LESS THAN (500) ENGINE = ENGINE, + PARTITION `p5` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test diff --git a/mysql-test/suite/engines/funcs/r/tc_partition_rebuild.result b/mysql-test/suite/engines/funcs/r/tc_partition_rebuild.result index bef7ba0635d..9f63c022f36 100644 --- a/mysql-test/suite/engines/funcs/r/tc_partition_rebuild.result +++ b/mysql-test/suite/engines/funcs/r/tc_partition_rebuild.result @@ -24,13 +24,13 @@ t1 CREATE TABLE `t1` ( `c2` char(10) DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE (c1) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (200) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (300) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN (400) ENGINE = ENGINE, - PARTITION p4 VALUES LESS THAN (500) ENGINE = ENGINE, - PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (200) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (300) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN (400) ENGINE = ENGINE, + PARTITION `p4` VALUES LESS THAN (500) ENGINE = ENGINE, + PARTITION `p5` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) ALTER TABLE t1 REBUILD PARTITION p1,p2; SELECT * FROM t1 ORDER BY c1; c1 c2 @@ -46,13 +46,13 @@ t1 CREATE TABLE `t1` ( `c2` char(10) DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE (c1) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (200) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (300) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN (400) ENGINE = ENGINE, - PARTITION p4 VALUES LESS THAN (500) ENGINE = ENGINE, - PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (200) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (300) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN (400) ENGINE = ENGINE, + PARTITION `p4` VALUES LESS THAN (500) ENGINE = ENGINE, + PARTITION `p5` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test diff --git a/mysql-test/suite/engines/funcs/r/tc_partition_remove.result b/mysql-test/suite/engines/funcs/r/tc_partition_remove.result index 3ae3439f83c..fcf489d2763 100644 --- a/mysql-test/suite/engines/funcs/r/tc_partition_remove.result +++ b/mysql-test/suite/engines/funcs/r/tc_partition_remove.result @@ -21,7 +21,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) ALTER TABLE t1 REMOVE PARTITIONING; SELECT * FROM t1 ORDER BY c1; c1 c2 @@ -60,7 +60,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) ALTER TABLE t1 REMOVE PARTITIONING; SELECT * FROM t1 ORDER BY c1; c1 c2 @@ -99,7 +99,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) ALTER TABLE t1 REMOVE PARTITIONING; SELECT * FROM t1 ORDER BY c1; c1 c2 @@ -138,7 +138,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) ALTER TABLE t1 REMOVE PARTITIONING; SELECT * FROM t1 ORDER BY c1; c1 c2 @@ -177,7 +177,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) ALTER TABLE t1 REMOVE PARTITIONING; SELECT * FROM t1 ORDER BY c1; c1 c2 @@ -216,7 +216,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) DEFAULT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) ALTER TABLE t1 REMOVE PARTITIONING; SELECT * FROM t1 ORDER BY c1; c1 c2 @@ -259,7 +259,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) ALTER TABLE t1 REMOVE PARTITIONING; SELECT * FROM t1 ORDER BY c1; c1 c2 @@ -298,7 +298,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) ALTER TABLE t1 REMOVE PARTITIONING; SELECT * FROM t1 ORDER BY c1; c1 c2 @@ -337,7 +337,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) ALTER TABLE t1 REMOVE PARTITIONING; SELECT * FROM t1 ORDER BY c1; c1 c2 @@ -376,7 +376,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) ALTER TABLE t1 REMOVE PARTITIONING; SELECT * FROM t1 ORDER BY c1; c1 c2 @@ -415,7 +415,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) ALTER TABLE t1 REMOVE PARTITIONING; SELECT * FROM t1 ORDER BY c1; c1 c2 @@ -454,7 +454,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) ALTER TABLE t1 REMOVE PARTITIONING; SELECT * FROM t1 ORDER BY c1; c1 c2 diff --git a/mysql-test/suite/engines/funcs/r/tc_partition_reorg_divide.result b/mysql-test/suite/engines/funcs/r/tc_partition_reorg_divide.result index 517c16083b3..22463593106 100644 --- a/mysql-test/suite/engines/funcs/r/tc_partition_reorg_divide.result +++ b/mysql-test/suite/engines/funcs/r/tc_partition_reorg_divide.result @@ -44,12 +44,12 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION s0 VALUES LESS THAN (3) ENGINE = ENGINE, - PARTITION s1 VALUES LESS THAN (10) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (20) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (30) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `s0` VALUES LESS THAN (3) ENGINE = ENGINE, + PARTITION `s1` VALUES LESS THAN (10) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (20) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (30) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) ALTER TABLE t1 DROP PARTITION s2; ERROR HY000: Error in list of partitions to DROP ALTER TABLE t1 DROP PARTITION s1; @@ -71,11 +71,11 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION s0 VALUES LESS THAN (3) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (20) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (30) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `s0` VALUES LESS THAN (3) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (20) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (30) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -125,12 +125,12 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION s0 VALUES LESS THAN (3) ENGINE = ENGINE, - PARTITION s1 VALUES LESS THAN (10) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (20) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (30) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `s0` VALUES LESS THAN (3) ENGINE = ENGINE, + PARTITION `s1` VALUES LESS THAN (10) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (20) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (30) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) ALTER TABLE t1 DROP PARTITION s2; ERROR HY000: Error in list of partitions to DROP ALTER TABLE t1 DROP PARTITION s1; @@ -152,11 +152,11 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION s0 VALUES LESS THAN (3) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (20) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (30) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `s0` VALUES LESS THAN (3) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (20) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (30) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -206,12 +206,12 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION s0 VALUES LESS THAN (3) ENGINE = ENGINE, - PARTITION s1 VALUES LESS THAN (10) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (20) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (30) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `s0` VALUES LESS THAN (3) ENGINE = ENGINE, + PARTITION `s1` VALUES LESS THAN (10) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (20) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (30) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) ALTER TABLE t1 DROP PARTITION s2; ERROR HY000: Error in list of partitions to DROP ALTER TABLE t1 DROP PARTITION s1; @@ -233,11 +233,11 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION s0 VALUES LESS THAN (3) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (20) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (30) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `s0` VALUES LESS THAN (3) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (20) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (30) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -287,12 +287,12 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION s0 VALUES LESS THAN (3) ENGINE = ENGINE, - PARTITION s1 VALUES LESS THAN (10) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (20) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (30) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `s0` VALUES LESS THAN (3) ENGINE = ENGINE, + PARTITION `s1` VALUES LESS THAN (10) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (20) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (30) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) ALTER TABLE t1 DROP PARTITION s2; ERROR HY000: Error in list of partitions to DROP ALTER TABLE t1 DROP PARTITION s1; @@ -314,11 +314,11 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION s0 VALUES LESS THAN (3) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (20) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (30) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `s0` VALUES LESS THAN (3) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (20) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (30) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -368,12 +368,12 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION s0 VALUES LESS THAN (3) ENGINE = ENGINE, - PARTITION s1 VALUES LESS THAN (10) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (20) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (30) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `s0` VALUES LESS THAN (3) ENGINE = ENGINE, + PARTITION `s1` VALUES LESS THAN (10) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (20) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (30) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) ALTER TABLE t1 DROP PARTITION s2; ERROR HY000: Error in list of partitions to DROP ALTER TABLE t1 DROP PARTITION s1; @@ -395,11 +395,11 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION s0 VALUES LESS THAN (3) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (20) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (30) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `s0` VALUES LESS THAN (3) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (20) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (30) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -449,12 +449,12 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION s0 VALUES LESS THAN (3) ENGINE = ENGINE, - PARTITION s1 VALUES LESS THAN (10) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (20) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (30) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `s0` VALUES LESS THAN (3) ENGINE = ENGINE, + PARTITION `s1` VALUES LESS THAN (10) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (20) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (30) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) ALTER TABLE t1 DROP PARTITION s2; ERROR HY000: Error in list of partitions to DROP ALTER TABLE t1 DROP PARTITION s1; @@ -476,11 +476,11 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION s0 VALUES LESS THAN (3) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (20) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (30) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `s0` VALUES LESS THAN (3) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (20) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (30) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test diff --git a/mysql-test/suite/engines/funcs/r/tc_partition_reorg_hash_key.result b/mysql-test/suite/engines/funcs/r/tc_partition_reorg_hash_key.result index 18f07127cb3..e43e95e928e 100644 --- a/mysql-test/suite/engines/funcs/r/tc_partition_reorg_hash_key.result +++ b/mysql-test/suite/engines/funcs/r/tc_partition_reorg_hash_key.result @@ -19,7 +19,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 10 ALTER TABLE t1 ADD PARTITION PARTITIONS 10; SELECT * FROM t1 ORDER BY c1; @@ -41,7 +41,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 20 ALTER TABLE t1 COALESCE PARTITION 18; SHOW TABLES; @@ -63,7 +63,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SHOW CREATE TABLE t1; Table Create Table @@ -71,7 +71,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -97,7 +97,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 10 ALTER TABLE t1 ADD PARTITION PARTITIONS 10; SELECT * FROM t1 ORDER BY c1; @@ -119,7 +119,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 20 ALTER TABLE t1 COALESCE PARTITION 18; SELECT * FROM t1 ORDER BY c1; @@ -141,7 +141,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SHOW CREATE TABLE t1; Table Create Table @@ -149,7 +149,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -175,7 +175,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 10 ALTER TABLE t1 ADD PARTITION PARTITIONS 10; SELECT * FROM t1 ORDER BY c1; @@ -197,7 +197,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 20 ALTER TABLE t1 COALESCE PARTITION 18; SELECT * FROM t1 ORDER BY c1; @@ -219,7 +219,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SHOW CREATE TABLE t1; Table Create Table @@ -227,7 +227,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -253,7 +253,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 10 ALTER TABLE t1 ADD PARTITION PARTITIONS 10; SELECT * FROM t1 ORDER BY c1; @@ -275,7 +275,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 20 ALTER TABLE t1 COALESCE PARTITION 18; SELECT * FROM t1 ORDER BY c1; @@ -297,7 +297,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SHOW CREATE TABLE t1; Table Create Table @@ -305,7 +305,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -331,7 +331,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 10 ALTER TABLE t1 ADD PARTITION PARTITIONS 10; SELECT * FROM t1 ORDER BY c1; @@ -353,7 +353,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 20 ALTER TABLE t1 COALESCE PARTITION 18; SELECT * FROM t1 ORDER BY c1; @@ -375,7 +375,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SHOW CREATE TABLE t1; Table Create Table @@ -383,7 +383,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -409,7 +409,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 10 ALTER TABLE t1 ADD PARTITION PARTITIONS 10; SELECT * FROM t1 ORDER BY c1; @@ -431,7 +431,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 20 ALTER TABLE t1 COALESCE PARTITION 18; SELECT * FROM t1 ORDER BY c1; @@ -453,7 +453,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SHOW CREATE TABLE t1; Table Create Table @@ -461,7 +461,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -487,7 +487,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 10 ALTER TABLE t1 ADD PARTITION PARTITIONS 10; SELECT * FROM t1 ORDER BY c1; @@ -509,7 +509,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 20 ALTER TABLE t1 COALESCE PARTITION 18; SELECT * FROM t1 ORDER BY c1; @@ -531,7 +531,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 SHOW CREATE TABLE t1; Table Create Table @@ -539,7 +539,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -565,7 +565,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 10 ALTER TABLE t1 ADD PARTITION PARTITIONS 10; SELECT * FROM t1 ORDER BY c1; @@ -587,7 +587,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 20 ALTER TABLE t1 COALESCE PARTITION 18; SELECT * FROM t1 ORDER BY c1; @@ -609,7 +609,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 SHOW CREATE TABLE t1; Table Create Table @@ -617,7 +617,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -643,7 +643,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 10 ALTER TABLE t1 ADD PARTITION PARTITIONS 10; SELECT * FROM t1 ORDER BY c1; @@ -665,7 +665,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 20 ALTER TABLE t1 COALESCE PARTITION 18; SELECT * FROM t1 ORDER BY c1; @@ -687,7 +687,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 SHOW CREATE TABLE t1; Table Create Table @@ -695,7 +695,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -721,7 +721,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 10 ALTER TABLE t1 ADD PARTITION PARTITIONS 10; SELECT * FROM t1 ORDER BY c1; @@ -743,7 +743,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 20 ALTER TABLE t1 COALESCE PARTITION 18; SELECT * FROM t1 ORDER BY c1; @@ -765,7 +765,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 SHOW CREATE TABLE t1; Table Create Table @@ -773,7 +773,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -799,7 +799,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 10 ALTER TABLE t1 ADD PARTITION PARTITIONS 10; SELECT * FROM t1 ORDER BY c1; @@ -821,7 +821,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 20 ALTER TABLE t1 COALESCE PARTITION 18; SELECT * FROM t1 ORDER BY c1; @@ -843,7 +843,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 SHOW CREATE TABLE t1; Table Create Table @@ -851,7 +851,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -877,7 +877,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 10 ALTER TABLE t1 ADD PARTITION PARTITIONS 10; SELECT * FROM t1 ORDER BY c1; @@ -899,7 +899,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 20 ALTER TABLE t1 COALESCE PARTITION 18; SELECT * FROM t1 ORDER BY c1; @@ -921,7 +921,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 SHOW CREATE TABLE t1; Table Create Table @@ -929,7 +929,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -955,7 +955,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 10 ALTER TABLE t1 ADD PARTITION PARTITIONS 10; SELECT * FROM t1 ORDER BY c1; @@ -977,7 +977,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 20 ALTER TABLE t1 COALESCE PARTITION 18; SELECT * FROM t1 ORDER BY c1; @@ -999,7 +999,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 SHOW CREATE TABLE t1; Table Create Table @@ -1007,7 +1007,7 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -1033,7 +1033,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 10 ALTER TABLE t1 ADD PARTITION PARTITIONS 10; SELECT * FROM t1 ORDER BY c1; @@ -1055,7 +1055,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 20 ALTER TABLE t1 COALESCE PARTITION 18; SELECT * FROM t1 ORDER BY c1; @@ -1077,7 +1077,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 SHOW CREATE TABLE t1; Table Create Table @@ -1085,7 +1085,7 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -1111,7 +1111,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 10 ALTER TABLE t1 ADD PARTITION PARTITIONS 10; SELECT * FROM t1 ORDER BY c1; @@ -1133,7 +1133,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 20 ALTER TABLE t1 COALESCE PARTITION 18; SELECT * FROM t1 ORDER BY c1; @@ -1155,7 +1155,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 SHOW CREATE TABLE t1; Table Create Table @@ -1163,7 +1163,7 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -1189,7 +1189,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 10 ALTER TABLE t1 ADD PARTITION PARTITIONS 10; SELECT * FROM t1 ORDER BY c1; @@ -1211,7 +1211,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 20 ALTER TABLE t1 COALESCE PARTITION 18; SELECT * FROM t1 ORDER BY c1; @@ -1233,7 +1233,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 SHOW CREATE TABLE t1; Table Create Table @@ -1241,7 +1241,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -1267,7 +1267,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 10 ALTER TABLE t1 ADD PARTITION PARTITIONS 10; SELECT * FROM t1 ORDER BY c1; @@ -1289,7 +1289,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 20 ALTER TABLE t1 COALESCE PARTITION 18; SELECT * FROM t1 ORDER BY c1; @@ -1311,7 +1311,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 SHOW CREATE TABLE t1; Table Create Table @@ -1319,7 +1319,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; @@ -1345,7 +1345,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 10 ALTER TABLE t1 ADD PARTITION PARTITIONS 10; SELECT * FROM t1 ORDER BY c1; @@ -1367,7 +1367,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 20 ALTER TABLE t1 COALESCE PARTITION 18; SELECT * FROM t1 ORDER BY c1; @@ -1389,7 +1389,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 SHOW CREATE TABLE t1; Table Create Table @@ -1397,7 +1397,7 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LINEAR KEY (c1) + PARTITION BY LINEAR KEY (`c1`) PARTITIONS 2 DROP TABLE t1; SHOW TABLES; diff --git a/mysql-test/suite/engines/funcs/r/tc_partition_reorg_merge.result b/mysql-test/suite/engines/funcs/r/tc_partition_reorg_merge.result index 618b8dd2465..89681d5ec65 100644 --- a/mysql-test/suite/engines/funcs/r/tc_partition_reorg_merge.result +++ b/mysql-test/suite/engines/funcs/r/tc_partition_reorg_merge.result @@ -41,10 +41,10 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = ENGINE, - PARTITION m0 VALUES LESS THAN (30) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = ENGINE, + PARTITION `m0` VALUES LESS THAN (30) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) ALTER TABLE t1 DROP PARTITION m1; ERROR HY000: Error in list of partitions to DROP ALTER TABLE t1 DROP PARTITION m0; @@ -63,9 +63,9 @@ t1 CREATE TABLE `t1` ( `c1` tinyint(4) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -112,10 +112,10 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = ENGINE, - PARTITION m0 VALUES LESS THAN (30) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = ENGINE, + PARTITION `m0` VALUES LESS THAN (30) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) ALTER TABLE t1 DROP PARTITION m1; ERROR HY000: Error in list of partitions to DROP ALTER TABLE t1 DROP PARTITION m0; @@ -134,9 +134,9 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -183,10 +183,10 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = ENGINE, - PARTITION m0 VALUES LESS THAN (30) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = ENGINE, + PARTITION `m0` VALUES LESS THAN (30) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) ALTER TABLE t1 DROP PARTITION m1; ERROR HY000: Error in list of partitions to DROP ALTER TABLE t1 DROP PARTITION m0; @@ -205,9 +205,9 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -254,10 +254,10 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = ENGINE, - PARTITION m0 VALUES LESS THAN (30) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = ENGINE, + PARTITION `m0` VALUES LESS THAN (30) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) ALTER TABLE t1 DROP PARTITION m1; ERROR HY000: Error in list of partitions to DROP ALTER TABLE t1 DROP PARTITION m0; @@ -276,9 +276,9 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -325,10 +325,10 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = ENGINE, - PARTITION m0 VALUES LESS THAN (30) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = ENGINE, + PARTITION `m0` VALUES LESS THAN (30) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) ALTER TABLE t1 DROP PARTITION m1; ERROR HY000: Error in list of partitions to DROP ALTER TABLE t1 DROP PARTITION m0; @@ -347,9 +347,9 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -396,10 +396,10 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = ENGINE, - PARTITION m0 VALUES LESS THAN (30) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = ENGINE, + PARTITION `m0` VALUES LESS THAN (30) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) ALTER TABLE t1 DROP PARTITION m1; ERROR HY000: Error in list of partitions to DROP ALTER TABLE t1 DROP PARTITION m0; @@ -418,9 +418,9 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) NOT NULL, `c2` char(5) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( c1) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test diff --git a/mysql-test/suite/engines/funcs/r/tc_partition_repair.result b/mysql-test/suite/engines/funcs/r/tc_partition_repair.result index 98d9aa93740..d51bd86b715 100644 --- a/mysql-test/suite/engines/funcs/r/tc_partition_repair.result +++ b/mysql-test/suite/engines/funcs/r/tc_partition_repair.result @@ -24,13 +24,13 @@ t1 CREATE TABLE `t1` ( `c2` char(10) DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE (c1) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (200) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (300) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN (400) ENGINE = ENGINE, - PARTITION p4 VALUES LESS THAN (500) ENGINE = ENGINE, - PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (200) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (300) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN (400) ENGINE = ENGINE, + PARTITION `p4` VALUES LESS THAN (500) ENGINE = ENGINE, + PARTITION `p5` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) ALTER TABLE t1 REPAIR PARTITION p1,p2; SELECT * FROM t1 ORDER BY c1; c1 c2 @@ -46,13 +46,13 @@ t1 CREATE TABLE `t1` ( `c2` char(10) DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE (c1) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (200) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (300) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN (400) ENGINE = ENGINE, - PARTITION p4 VALUES LESS THAN (500) ENGINE = ENGINE, - PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (200) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (300) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN (400) ENGINE = ENGINE, + PARTITION `p4` VALUES LESS THAN (500) ENGINE = ENGINE, + PARTITION `p5` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test diff --git a/mysql-test/suite/engines/funcs/r/tc_partition_sub1.result b/mysql-test/suite/engines/funcs/r/tc_partition_sub1.result index 6d1dc41a354..be47aaadd40 100644 --- a/mysql-test/suite/engines/funcs/r/tc_partition_sub1.result +++ b/mysql-test/suite/engines/funcs/r/tc_partition_sub1.result @@ -45,12 +45,12 @@ t1 CREATE TABLE `t1` ( `name` varchar(30) DEFAULT NULL, `purchased` date DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( YEAR(purchased)) -SUBPARTITION BY HASH ( TO_DAYS(purchased)) + PARTITION BY RANGE (year(`purchased`)) +SUBPARTITION BY HASH (to_days(`purchased`)) SUBPARTITIONS 2 -(PARTITION p0 VALUES LESS THAN (1990) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (2000) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) +(PARTITION `p0` VALUES LESS THAN (1990) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (2000) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -100,12 +100,12 @@ t1 CREATE TABLE `t1` ( `name` varchar(30) DEFAULT NULL, `purchased` date DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( YEAR(purchased)) -SUBPARTITION BY HASH ( TO_DAYS(purchased)) + PARTITION BY RANGE (year(`purchased`)) +SUBPARTITION BY HASH (to_days(`purchased`)) SUBPARTITIONS 2 -(PARTITION p0 VALUES LESS THAN (1990) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (2000) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) +(PARTITION `p0` VALUES LESS THAN (1990) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (2000) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -155,12 +155,12 @@ t1 CREATE TABLE `t1` ( `name` varchar(30) DEFAULT NULL, `purchased` date DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( YEAR(purchased)) -SUBPARTITION BY HASH ( TO_DAYS(purchased)) + PARTITION BY RANGE (year(`purchased`)) +SUBPARTITION BY HASH (to_days(`purchased`)) SUBPARTITIONS 2 -(PARTITION p0 VALUES LESS THAN (1990) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (2000) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) +(PARTITION `p0` VALUES LESS THAN (1990) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (2000) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -210,12 +210,12 @@ t1 CREATE TABLE `t1` ( `name` varchar(30) DEFAULT NULL, `purchased` date DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( YEAR(purchased)) -SUBPARTITION BY HASH ( TO_DAYS(purchased)) + PARTITION BY RANGE (year(`purchased`)) +SUBPARTITION BY HASH (to_days(`purchased`)) SUBPARTITIONS 2 -(PARTITION p0 VALUES LESS THAN (1990) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (2000) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) +(PARTITION `p0` VALUES LESS THAN (1990) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (2000) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -265,12 +265,12 @@ t1 CREATE TABLE `t1` ( `name` varchar(30) DEFAULT NULL, `purchased` date DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( YEAR(purchased)) -SUBPARTITION BY HASH ( TO_DAYS(purchased)) + PARTITION BY RANGE (year(`purchased`)) +SUBPARTITION BY HASH (to_days(`purchased`)) SUBPARTITIONS 2 -(PARTITION p0 VALUES LESS THAN (1990) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (2000) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) +(PARTITION `p0` VALUES LESS THAN (1990) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (2000) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -320,12 +320,12 @@ t1 CREATE TABLE `t1` ( `name` varchar(30) DEFAULT NULL, `purchased` date DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( YEAR(purchased)) -SUBPARTITION BY HASH ( TO_DAYS(purchased)) + PARTITION BY RANGE (year(`purchased`)) +SUBPARTITION BY HASH (to_days(`purchased`)) SUBPARTITIONS 2 -(PARTITION p0 VALUES LESS THAN (1990) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (2000) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) +(PARTITION `p0` VALUES LESS THAN (1990) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (2000) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test diff --git a/mysql-test/suite/engines/funcs/r/tc_partition_sub2.result b/mysql-test/suite/engines/funcs/r/tc_partition_sub2.result index c6a0d9aac68..543b3471092 100644 --- a/mysql-test/suite/engines/funcs/r/tc_partition_sub2.result +++ b/mysql-test/suite/engines/funcs/r/tc_partition_sub2.result @@ -53,17 +53,17 @@ t1 CREATE TABLE `t1` ( `name` varchar(30) DEFAULT NULL, `purchased` date DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( YEAR(purchased)) -SUBPARTITION BY HASH ( TO_DAYS(purchased)) -(PARTITION p0 VALUES LESS THAN (1990) - (SUBPARTITION s0 ENGINE = ENGINE, - SUBPARTITION s1 ENGINE = ENGINE), - PARTITION p1 VALUES LESS THAN (2000) - (SUBPARTITION s2 ENGINE = ENGINE, - SUBPARTITION s3 ENGINE = ENGINE), - PARTITION p2 VALUES LESS THAN MAXVALUE - (SUBPARTITION s4 ENGINE = ENGINE, - SUBPARTITION s5 ENGINE = ENGINE)) + PARTITION BY RANGE (year(`purchased`)) +SUBPARTITION BY HASH (to_days(`purchased`)) +(PARTITION `p0` VALUES LESS THAN (1990) + (SUBPARTITION `s0` ENGINE = ENGINE, + SUBPARTITION `s1` ENGINE = ENGINE), + PARTITION `p1` VALUES LESS THAN (2000) + (SUBPARTITION `s2` ENGINE = ENGINE, + SUBPARTITION `s3` ENGINE = ENGINE), + PARTITION `p2` VALUES LESS THAN MAXVALUE + (SUBPARTITION `s4` ENGINE = ENGINE, + SUBPARTITION `s5` ENGINE = ENGINE)) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -121,17 +121,17 @@ t1 CREATE TABLE `t1` ( `name` varchar(30) DEFAULT NULL, `purchased` date DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( YEAR(purchased)) -SUBPARTITION BY HASH ( TO_DAYS(purchased)) -(PARTITION p0 VALUES LESS THAN (1990) - (SUBPARTITION s0 ENGINE = ENGINE, - SUBPARTITION s1 ENGINE = ENGINE), - PARTITION p1 VALUES LESS THAN (2000) - (SUBPARTITION s2 ENGINE = ENGINE, - SUBPARTITION s3 ENGINE = ENGINE), - PARTITION p2 VALUES LESS THAN MAXVALUE - (SUBPARTITION s4 ENGINE = ENGINE, - SUBPARTITION s5 ENGINE = ENGINE)) + PARTITION BY RANGE (year(`purchased`)) +SUBPARTITION BY HASH (to_days(`purchased`)) +(PARTITION `p0` VALUES LESS THAN (1990) + (SUBPARTITION `s0` ENGINE = ENGINE, + SUBPARTITION `s1` ENGINE = ENGINE), + PARTITION `p1` VALUES LESS THAN (2000) + (SUBPARTITION `s2` ENGINE = ENGINE, + SUBPARTITION `s3` ENGINE = ENGINE), + PARTITION `p2` VALUES LESS THAN MAXVALUE + (SUBPARTITION `s4` ENGINE = ENGINE, + SUBPARTITION `s5` ENGINE = ENGINE)) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -189,17 +189,17 @@ t1 CREATE TABLE `t1` ( `name` varchar(30) DEFAULT NULL, `purchased` date DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( YEAR(purchased)) -SUBPARTITION BY HASH ( TO_DAYS(purchased)) -(PARTITION p0 VALUES LESS THAN (1990) - (SUBPARTITION s0 ENGINE = ENGINE, - SUBPARTITION s1 ENGINE = ENGINE), - PARTITION p1 VALUES LESS THAN (2000) - (SUBPARTITION s2 ENGINE = ENGINE, - SUBPARTITION s3 ENGINE = ENGINE), - PARTITION p2 VALUES LESS THAN MAXVALUE - (SUBPARTITION s4 ENGINE = ENGINE, - SUBPARTITION s5 ENGINE = ENGINE)) + PARTITION BY RANGE (year(`purchased`)) +SUBPARTITION BY HASH (to_days(`purchased`)) +(PARTITION `p0` VALUES LESS THAN (1990) + (SUBPARTITION `s0` ENGINE = ENGINE, + SUBPARTITION `s1` ENGINE = ENGINE), + PARTITION `p1` VALUES LESS THAN (2000) + (SUBPARTITION `s2` ENGINE = ENGINE, + SUBPARTITION `s3` ENGINE = ENGINE), + PARTITION `p2` VALUES LESS THAN MAXVALUE + (SUBPARTITION `s4` ENGINE = ENGINE, + SUBPARTITION `s5` ENGINE = ENGINE)) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -257,17 +257,17 @@ t1 CREATE TABLE `t1` ( `name` varchar(30) DEFAULT NULL, `purchased` date DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( YEAR(purchased)) -SUBPARTITION BY HASH ( TO_DAYS(purchased)) -(PARTITION p0 VALUES LESS THAN (1990) - (SUBPARTITION s0 ENGINE = ENGINE, - SUBPARTITION s1 ENGINE = ENGINE), - PARTITION p1 VALUES LESS THAN (2000) - (SUBPARTITION s2 ENGINE = ENGINE, - SUBPARTITION s3 ENGINE = ENGINE), - PARTITION p2 VALUES LESS THAN MAXVALUE - (SUBPARTITION s4 ENGINE = ENGINE, - SUBPARTITION s5 ENGINE = ENGINE)) + PARTITION BY RANGE (year(`purchased`)) +SUBPARTITION BY HASH (to_days(`purchased`)) +(PARTITION `p0` VALUES LESS THAN (1990) + (SUBPARTITION `s0` ENGINE = ENGINE, + SUBPARTITION `s1` ENGINE = ENGINE), + PARTITION `p1` VALUES LESS THAN (2000) + (SUBPARTITION `s2` ENGINE = ENGINE, + SUBPARTITION `s3` ENGINE = ENGINE), + PARTITION `p2` VALUES LESS THAN MAXVALUE + (SUBPARTITION `s4` ENGINE = ENGINE, + SUBPARTITION `s5` ENGINE = ENGINE)) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -325,17 +325,17 @@ t1 CREATE TABLE `t1` ( `name` varchar(30) DEFAULT NULL, `purchased` date DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( YEAR(purchased)) -SUBPARTITION BY HASH ( TO_DAYS(purchased)) -(PARTITION p0 VALUES LESS THAN (1990) - (SUBPARTITION s0 ENGINE = ENGINE, - SUBPARTITION s1 ENGINE = ENGINE), - PARTITION p1 VALUES LESS THAN (2000) - (SUBPARTITION s2 ENGINE = ENGINE, - SUBPARTITION s3 ENGINE = ENGINE), - PARTITION p2 VALUES LESS THAN MAXVALUE - (SUBPARTITION s4 ENGINE = ENGINE, - SUBPARTITION s5 ENGINE = ENGINE)) + PARTITION BY RANGE (year(`purchased`)) +SUBPARTITION BY HASH (to_days(`purchased`)) +(PARTITION `p0` VALUES LESS THAN (1990) + (SUBPARTITION `s0` ENGINE = ENGINE, + SUBPARTITION `s1` ENGINE = ENGINE), + PARTITION `p1` VALUES LESS THAN (2000) + (SUBPARTITION `s2` ENGINE = ENGINE, + SUBPARTITION `s3` ENGINE = ENGINE), + PARTITION `p2` VALUES LESS THAN MAXVALUE + (SUBPARTITION `s4` ENGINE = ENGINE, + SUBPARTITION `s5` ENGINE = ENGINE)) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -393,17 +393,17 @@ t1 CREATE TABLE `t1` ( `name` varchar(30) DEFAULT NULL, `purchased` date DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE ( YEAR(purchased)) -SUBPARTITION BY HASH ( TO_DAYS(purchased)) -(PARTITION p0 VALUES LESS THAN (1990) - (SUBPARTITION s0 ENGINE = ENGINE, - SUBPARTITION s1 ENGINE = ENGINE), - PARTITION p1 VALUES LESS THAN (2000) - (SUBPARTITION s2 ENGINE = ENGINE, - SUBPARTITION s3 ENGINE = ENGINE), - PARTITION p2 VALUES LESS THAN MAXVALUE - (SUBPARTITION s4 ENGINE = ENGINE, - SUBPARTITION s5 ENGINE = ENGINE)) + PARTITION BY RANGE (year(`purchased`)) +SUBPARTITION BY HASH (to_days(`purchased`)) +(PARTITION `p0` VALUES LESS THAN (1990) + (SUBPARTITION `s0` ENGINE = ENGINE, + SUBPARTITION `s1` ENGINE = ENGINE), + PARTITION `p1` VALUES LESS THAN (2000) + (SUBPARTITION `s2` ENGINE = ENGINE, + SUBPARTITION `s3` ENGINE = ENGINE), + PARTITION `p2` VALUES LESS THAN MAXVALUE + (SUBPARTITION `s4` ENGINE = ENGINE, + SUBPARTITION `s5` ENGINE = ENGINE)) DROP TABLE t1; SHOW TABLES; Tables_in_test diff --git a/mysql-test/suite/engines/funcs/r/tc_partition_value.result b/mysql-test/suite/engines/funcs/r/tc_partition_value.result index 98a5f885e4b..48891fc368d 100644 --- a/mysql-test/suite/engines/funcs/r/tc_partition_value.result +++ b/mysql-test/suite/engines/funcs/r/tc_partition_value.result @@ -15,13 +15,13 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) DEFAULT NULL, `c2` int(11) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE (c1) -(PARTITION p0 VALUES LESS THAN (1991) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (1995) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (1999) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN (2002) ENGINE = ENGINE, - PARTITION p4 VALUES LESS THAN (2006) ENGINE = ENGINE, - PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (1991) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (1995) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (1999) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN (2002) ENGINE = ENGINE, + PARTITION `p4` VALUES LESS THAN (2006) ENGINE = ENGINE, + PARTITION `p5` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -41,13 +41,13 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) DEFAULT NULL, `c2` int(11) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE (c1) -(PARTITION p0 VALUES LESS THAN (1991) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (1995) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (1999) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN (2002) ENGINE = ENGINE, - PARTITION p4 VALUES LESS THAN (2006) ENGINE = ENGINE, - PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (1991) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (1995) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (1999) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN (2002) ENGINE = ENGINE, + PARTITION `p4` VALUES LESS THAN (2006) ENGINE = ENGINE, + PARTITION `p5` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -67,13 +67,13 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` int(11) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE (c1) -(PARTITION p0 VALUES LESS THAN (1991) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (1995) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (1999) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN (2002) ENGINE = ENGINE, - PARTITION p4 VALUES LESS THAN (2006) ENGINE = ENGINE, - PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (1991) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (1995) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (1999) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN (2002) ENGINE = ENGINE, + PARTITION `p4` VALUES LESS THAN (2006) ENGINE = ENGINE, + PARTITION `p5` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -93,13 +93,13 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` int(11) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE (c1) -(PARTITION p0 VALUES LESS THAN (1991) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (1995) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (1999) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN (2002) ENGINE = ENGINE, - PARTITION p4 VALUES LESS THAN (2006) ENGINE = ENGINE, - PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (1991) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (1995) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (1999) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN (2002) ENGINE = ENGINE, + PARTITION `p4` VALUES LESS THAN (2006) ENGINE = ENGINE, + PARTITION `p5` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -119,13 +119,13 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) DEFAULT NULL, `c2` int(11) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY RANGE (c1) -(PARTITION p0 VALUES LESS THAN (1991) ENGINE = ENGINE, - PARTITION p1 VALUES LESS THAN (1995) ENGINE = ENGINE, - PARTITION p2 VALUES LESS THAN (1999) ENGINE = ENGINE, - PARTITION p3 VALUES LESS THAN (2002) ENGINE = ENGINE, - PARTITION p4 VALUES LESS THAN (2006) ENGINE = ENGINE, - PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = ENGINE) + PARTITION BY RANGE (`c1`) +(PARTITION `p0` VALUES LESS THAN (1991) ENGINE = ENGINE, + PARTITION `p1` VALUES LESS THAN (1995) ENGINE = ENGINE, + PARTITION `p2` VALUES LESS THAN (1999) ENGINE = ENGINE, + PARTITION `p3` VALUES LESS THAN (2002) ENGINE = ENGINE, + PARTITION `p4` VALUES LESS THAN (2006) ENGINE = ENGINE, + PARTITION `p5` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test diff --git a/mysql-test/suite/engines/funcs/r/tc_partition_value_specific.result b/mysql-test/suite/engines/funcs/r/tc_partition_value_specific.result index 71a38814fd8..0d9393ffeda 100644 --- a/mysql-test/suite/engines/funcs/r/tc_partition_value_specific.result +++ b/mysql-test/suite/engines/funcs/r/tc_partition_value_specific.result @@ -13,11 +13,11 @@ t1 CREATE TABLE `t1` ( `c1` smallint(6) DEFAULT NULL, `c2` int(11) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LIST (c1) -(PARTITION r0 VALUES IN (1,5,9,13,17,21) ENGINE = ENGINE, - PARTITION r1 VALUES IN (2,6,10,14,18,22) ENGINE = ENGINE, - PARTITION r2 VALUES IN (3,7,11,15,19,23) ENGINE = ENGINE, - PARTITION r3 VALUES IN (4,8,12,16,20,24) ENGINE = ENGINE) + PARTITION BY LIST (`c1`) +(PARTITION `r0` VALUES IN (1,5,9,13,17,21) ENGINE = ENGINE, + PARTITION `r1` VALUES IN (2,6,10,14,18,22) ENGINE = ENGINE, + PARTITION `r2` VALUES IN (3,7,11,15,19,23) ENGINE = ENGINE, + PARTITION `r3` VALUES IN (4,8,12,16,20,24) ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -35,11 +35,11 @@ t1 CREATE TABLE `t1` ( `c1` mediumint(9) DEFAULT NULL, `c2` int(11) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LIST (c1) -(PARTITION r0 VALUES IN (1,5,9,13,17,21) ENGINE = ENGINE, - PARTITION r1 VALUES IN (2,6,10,14,18,22) ENGINE = ENGINE, - PARTITION r2 VALUES IN (3,7,11,15,19,23) ENGINE = ENGINE, - PARTITION r3 VALUES IN (4,8,12,16,20,24) ENGINE = ENGINE) + PARTITION BY LIST (`c1`) +(PARTITION `r0` VALUES IN (1,5,9,13,17,21) ENGINE = ENGINE, + PARTITION `r1` VALUES IN (2,6,10,14,18,22) ENGINE = ENGINE, + PARTITION `r2` VALUES IN (3,7,11,15,19,23) ENGINE = ENGINE, + PARTITION `r3` VALUES IN (4,8,12,16,20,24) ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -57,11 +57,11 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` int(11) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LIST (c1) -(PARTITION r0 VALUES IN (1,5,9,13,17,21) ENGINE = ENGINE, - PARTITION r1 VALUES IN (2,6,10,14,18,22) ENGINE = ENGINE, - PARTITION r2 VALUES IN (3,7,11,15,19,23) ENGINE = ENGINE, - PARTITION r3 VALUES IN (4,8,12,16,20,24) ENGINE = ENGINE) + PARTITION BY LIST (`c1`) +(PARTITION `r0` VALUES IN (1,5,9,13,17,21) ENGINE = ENGINE, + PARTITION `r1` VALUES IN (2,6,10,14,18,22) ENGINE = ENGINE, + PARTITION `r2` VALUES IN (3,7,11,15,19,23) ENGINE = ENGINE, + PARTITION `r3` VALUES IN (4,8,12,16,20,24) ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -79,11 +79,11 @@ t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` int(11) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LIST (c1) -(PARTITION r0 VALUES IN (1,5,9,13,17,21) ENGINE = ENGINE, - PARTITION r1 VALUES IN (2,6,10,14,18,22) ENGINE = ENGINE, - PARTITION r2 VALUES IN (3,7,11,15,19,23) ENGINE = ENGINE, - PARTITION r3 VALUES IN (4,8,12,16,20,24) ENGINE = ENGINE) + PARTITION BY LIST (`c1`) +(PARTITION `r0` VALUES IN (1,5,9,13,17,21) ENGINE = ENGINE, + PARTITION `r1` VALUES IN (2,6,10,14,18,22) ENGINE = ENGINE, + PARTITION `r2` VALUES IN (3,7,11,15,19,23) ENGINE = ENGINE, + PARTITION `r3` VALUES IN (4,8,12,16,20,24) ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test @@ -101,11 +101,11 @@ t1 CREATE TABLE `t1` ( `c1` bigint(20) DEFAULT NULL, `c2` int(11) DEFAULT NULL ) ENGINE=ENGINE DEFAULT CHARSET=latin1 - PARTITION BY LIST (c1) -(PARTITION r0 VALUES IN (1,5,9,13,17,21) ENGINE = ENGINE, - PARTITION r1 VALUES IN (2,6,10,14,18,22) ENGINE = ENGINE, - PARTITION r2 VALUES IN (3,7,11,15,19,23) ENGINE = ENGINE, - PARTITION r3 VALUES IN (4,8,12,16,20,24) ENGINE = ENGINE) + PARTITION BY LIST (`c1`) +(PARTITION `r0` VALUES IN (1,5,9,13,17,21) ENGINE = ENGINE, + PARTITION `r1` VALUES IN (2,6,10,14,18,22) ENGINE = ENGINE, + PARTITION `r2` VALUES IN (3,7,11,15,19,23) ENGINE = ENGINE, + PARTITION `r3` VALUES IN (4,8,12,16,20,24) ENGINE = ENGINE) DROP TABLE t1; SHOW TABLES; Tables_in_test diff --git a/mysql-test/suite/federated/assisted_discovery.result b/mysql-test/suite/federated/assisted_discovery.result index f79e47da8b4..4818ff7bb02 100644 --- a/mysql-test/suite/federated/assisted_discovery.result +++ b/mysql-test/suite/federated/assisted_discovery.result @@ -38,6 +38,40 @@ id group a\\b a\\ name 1 1 2 NULL foo 2 1 2 NULL fee DROP TABLE t1; +create table t1 ( +a bigint(20) not null auto_increment, +b bigint(20) not null, +c tinyint(4) not null, +d varchar(4096) not null, +primary key (a), +key (b,c,d(255)) +); +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` bigint(20) NOT NULL AUTO_INCREMENT, + `b` bigint(20) NOT NULL, + `c` tinyint(4) NOT NULL, + `d` varchar(4096) NOT NULL, + PRIMARY KEY (`a`), + KEY `b` (`b`,`c`,`d`(255)) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +connection master; +create table t1 engine=federated +connection='mysql://root@127.0.0.1:SLAVE_PORT/test/t1'; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` bigint(20) NOT NULL AUTO_INCREMENT, + `b` bigint(20) NOT NULL, + `c` tinyint(4) NOT NULL, + `d` varchar(4096) NOT NULL, + PRIMARY KEY (`a`), + KEY `b` (`b`,`c`,`d`(255)) +) ENGINE=FEDERATED DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/test/t1' +drop table t1; +connection slave; +drop table t1; connection master; DROP TABLE IF EXISTS federated.t1; DROP DATABASE IF EXISTS federated; diff --git a/mysql-test/suite/federated/assisted_discovery.test b/mysql-test/suite/federated/assisted_discovery.test index 9f3abe74ecc..fa83a2a8e19 100644 --- a/mysql-test/suite/federated/assisted_discovery.test +++ b/mysql-test/suite/federated/assisted_discovery.test @@ -30,5 +30,29 @@ connection slave; SELECT * FROM t1; DROP TABLE t1; +# +# +# +create table t1 ( + a bigint(20) not null auto_increment, + b bigint(20) not null, + c tinyint(4) not null, + d varchar(4096) not null, + primary key (a), + key (b,c,d(255)) +); +show create table t1; + +connection master; +--replace_result $SLAVE_MYPORT SLAVE_PORT +eval create table t1 engine=federated + connection='mysql://root@127.0.0.1:$SLAVE_MYPORT/test/t1'; +--replace_result $SLAVE_MYPORT SLAVE_PORT +show create table t1; +drop table t1; + +connection slave; +drop table t1; + source include/federated_cleanup.inc; diff --git a/mysql-test/suite/federated/federated_partition.result b/mysql-test/suite/federated/federated_partition.result index 8485328a166..a2d5fcffd9b 100644 --- a/mysql-test/suite/federated/federated_partition.result +++ b/mysql-test/suite/federated/federated_partition.result @@ -21,9 +21,9 @@ t1 CREATE TABLE `t1` ( `s1` int(11) NOT NULL, PRIMARY KEY (`s1`) ) ENGINE=FEDERATED DEFAULT CHARSET=latin1 - PARTITION BY LIST (s1) -(PARTITION p1 VALUES IN (1,3) CONNECTION = 'mysql://root@127.0.0.1:SLAVE_PORT/federated/t1_1' ENGINE = FEDERATED, - PARTITION p2 VALUES IN (2,4) CONNECTION = 'mysql://root@127.0.0.1:SLAVE_PORT/federated/t1_2' ENGINE = FEDERATED) + PARTITION BY LIST (`s1`) +(PARTITION `p1` VALUES IN (1,3) CONNECTION = 'mysql://root@127.0.0.1:SLAVE_PORT/federated/t1_1' ENGINE = FEDERATED, + PARTITION `p2` VALUES IN (2,4) CONNECTION = 'mysql://root@127.0.0.1:SLAVE_PORT/federated/t1_2' ENGINE = FEDERATED) insert into t1 values (1), (2), (3), (4); select * from t1; s1 diff --git a/mysql-test/suite/federated/net_thd_crash-12725.result b/mysql-test/suite/federated/net_thd_crash-12725.result new file mode 100644 index 00000000000..8c85b7a7594 --- /dev/null +++ b/mysql-test/suite/federated/net_thd_crash-12725.result @@ -0,0 +1,10 @@ +SET GLOBAL query_cache_size= 16*1024*1024; +SET GLOBAL query_cache_type= 1; +CREATE TABLE t1 (i INT); +CREATE TABLE t2 (i INT) ENGINE=FEDERATED CONNECTION="mysql://root@localhost:MASTER_MYPORT/test/t1"; +ALTER TABLE t2 DISABLE KEYS; +ERROR HY000: Storage engine FEDERATED of the table `test`.`t2` doesn't have this option +CREATE TABLE t3 (i INT) ENGINE=FEDERATED CONNECTION="mysql://root@localhost:MASTER_MYPORT/test/t1"; +SET GLOBAL query_cache_size= default; +SET GLOBAL query_cache_type= default; +drop table t1, t2, t3; diff --git a/mysql-test/suite/federated/net_thd_crash-12725.test b/mysql-test/suite/federated/net_thd_crash-12725.test new file mode 100644 index 00000000000..e94001cde01 --- /dev/null +++ b/mysql-test/suite/federated/net_thd_crash-12725.test @@ -0,0 +1,17 @@ +# +# MDEV-12725 select on federated table crashes server +# +# +SET GLOBAL query_cache_size= 16*1024*1024; +SET GLOBAL query_cache_type= 1; +CREATE TABLE t1 (i INT); +--replace_result $MASTER_MYPORT MASTER_MYPORT +eval CREATE TABLE t2 (i INT) ENGINE=FEDERATED CONNECTION="mysql://root@localhost:$MASTER_MYPORT/test/t1"; +--error ER_ILLEGAL_HA +ALTER TABLE t2 DISABLE KEYS; +--replace_result $MASTER_MYPORT MASTER_MYPORT +eval CREATE TABLE t3 (i INT) ENGINE=FEDERATED CONNECTION="mysql://root@localhost:$MASTER_MYPORT/test/t1"; +source include/restart_mysqld.inc; +SET GLOBAL query_cache_size= default; +SET GLOBAL query_cache_type= default; +drop table t1, t2, t3; diff --git a/mysql-test/suite/federated/net_thd_crash-12951.result b/mysql-test/suite/federated/net_thd_crash-12951.result new file mode 100644 index 00000000000..573ac96efff --- /dev/null +++ b/mysql-test/suite/federated/net_thd_crash-12951.result @@ -0,0 +1,11 @@ +set global query_cache_size= 16*1024*1024; +set global query_cache_type= 1; +create table t1 (i int) engine=innodb; +create table t2 (i int) engine=federated +CONNECTION="mysql://root@localhost:MASTER_MYPORT/test/t1"; +select * from t2; +i +drop table t2; +drop table t1; +set global query_cache_type= default; +set global query_cache_size= default; diff --git a/mysql-test/suite/federated/net_thd_crash-12951.test b/mysql-test/suite/federated/net_thd_crash-12951.test new file mode 100644 index 00000000000..81cd826686e --- /dev/null +++ b/mysql-test/suite/federated/net_thd_crash-12951.test @@ -0,0 +1,23 @@ +# +# MDEV-12951 Server crash [mysqld got exception 0xc0000005] +# + +--source include/have_innodb.inc + +set global query_cache_size= 16*1024*1024; +set global query_cache_type= 1; + +create table t1 (i int) engine=innodb; +--replace_result $MASTER_MYPORT MASTER_MYPORT +eval create table t2 (i int) engine=federated + CONNECTION="mysql://root@localhost:$MASTER_MYPORT/test/t1"; + +select * from t2; + +source include/restart_mysqld.inc; + +drop table t2; +drop table t1; + +set global query_cache_type= default; +set global query_cache_size= default; diff --git a/mysql-test/suite/funcs_1/datadict/is_key_column_usage.inc b/mysql-test/suite/funcs_1/datadict/is_key_column_usage.inc index ee8a923485a..71030a2b1d8 100644 --- a/mysql-test/suite/funcs_1/datadict/is_key_column_usage.inc +++ b/mysql-test/suite/funcs_1/datadict/is_key_column_usage.inc @@ -232,12 +232,6 @@ eval $my_select; ALTER TABLE db_datadict.t1_my_tablex ADD UNIQUE my_idx (f4,first_col); eval $my_select; # -# Check DROP COLUMN -eval $my_select; -ALTER TABLE db_datadict.t1_my_tablex -DROP COLUMN first_col; -eval $my_select; -# # Check impact of DROP TABLE SELECT table_name, column_name FROM information_schema.key_column_usage @@ -328,7 +322,7 @@ if (!$mysql_errno) INSERT INTO information_schema.key_column_usage SELECT * FROM information_schema.key_column_usage; ---error ER_DBACCESS_DENIED_ERROR +--error ER_DBACCESS_DENIED_ERROR,ER_NON_UPDATABLE_TABLE UPDATE information_schema.key_column_usage SET table_name = 'db1' WHERE constraint_name = 'primary'; diff --git a/mysql-test/suite/funcs_1/datadict/is_tables.inc b/mysql-test/suite/funcs_1/datadict/is_tables.inc index de0681d952b..2059917247c 100644 --- a/mysql-test/suite/funcs_1/datadict/is_tables.inc +++ b/mysql-test/suite/funcs_1/datadict/is_tables.inc @@ -441,7 +441,7 @@ ENGINE = $engine_type; INSERT INTO information_schema.tables SELECT * FROM information_schema.tables; ---error ER_DBACCESS_DENIED_ERROR +--error ER_DBACCESS_DENIED_ERROR,ER_NON_UPDATABLE_TABLE UPDATE information_schema.tables SET table_schema = 'test' WHERE table_name = 't1'; diff --git a/mysql-test/suite/funcs_1/datadict/is_triggers.inc b/mysql-test/suite/funcs_1/datadict/is_triggers.inc index 82cf6f8e21f..b2ce1e2de00 100644 --- a/mysql-test/suite/funcs_1/datadict/is_triggers.inc +++ b/mysql-test/suite/funcs_1/datadict/is_triggers.inc @@ -236,7 +236,7 @@ ON db_datadict.t1 FOR EACH ROW SET @test_before = 2, new.f1 = @test_before; INSERT INTO information_schema.triggers SELECT * FROM information_schema.triggers; ---error ER_DBACCESS_DENIED_ERROR +--error ER_DBACCESS_DENIED_ERROR,ER_NON_UPDATABLE_TABLE UPDATE information_schema.triggers SET trigger_schema = 'test' WHERE table_name = 't1'; diff --git a/mysql-test/suite/funcs_1/datadict/is_views.inc b/mysql-test/suite/funcs_1/datadict/is_views.inc index 3330bea4462..bdba03f3632 100644 --- a/mysql-test/suite/funcs_1/datadict/is_views.inc +++ b/mysql-test/suite/funcs_1/datadict/is_views.inc @@ -278,7 +278,7 @@ SELECT * FROM information_schema.views; INSERT INTO information_schema.views(table_schema, table_name) VALUES ('db2', 'v2'); ---error ER_DBACCESS_DENIED_ERROR +--error ER_DBACCESS_DENIED_ERROR,ER_NON_UPDATABLE_TABLE UPDATE information_schema.views SET table_schema = 'test' WHERE table_name = 't1'; diff --git a/mysql-test/suite/funcs_1/r/is_character_sets.result b/mysql-test/suite/funcs_1/r/is_character_sets.result index caff08ae1e4..da4e3b06503 100644 --- a/mysql-test/suite/funcs_1/r/is_character_sets.result +++ b/mysql-test/suite/funcs_1/r/is_character_sets.result @@ -57,7 +57,7 @@ INSERT INTO information_schema.character_sets SELECT * FROM information_schema.character_sets; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' UPDATE information_schema.character_sets SET description = 'just updated'; -ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' +Got one of the listed errors DELETE FROM information_schema.character_sets WHERE table_name = 't1'; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' TRUNCATE information_schema.character_sets; diff --git a/mysql-test/suite/funcs_1/r/is_coll_char_set_appl.result b/mysql-test/suite/funcs_1/r/is_coll_char_set_appl.result index 7eba964bdf6..a512a7458fb 100644 --- a/mysql-test/suite/funcs_1/r/is_coll_char_set_appl.result +++ b/mysql-test/suite/funcs_1/r/is_coll_char_set_appl.result @@ -52,10 +52,10 @@ SELECT * FROM information_schema.collation_character_set_applicability; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' UPDATE information_schema.collation_character_set_applicability SET collation_name = 'big6_chinese_ci' WHERE character_set_name = 'big6'; -ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' +Got one of the listed errors UPDATE information_schema.collation_character_set_applicability SET character_set_name = 't_4711'; -ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' +Got one of the listed errors DELETE FROM information_schema.collation_character_set_applicability; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' TRUNCATE information_schema.collation_character_set_applicability; diff --git a/mysql-test/suite/funcs_1/r/is_collations.result b/mysql-test/suite/funcs_1/r/is_collations.result index c017bbd4eaf..c74976f9fc2 100644 --- a/mysql-test/suite/funcs_1/r/is_collations.result +++ b/mysql-test/suite/funcs_1/r/is_collations.result @@ -67,7 +67,7 @@ INSERT INTO information_schema.collations VALUES ( 'cp1251_bin', 'cp1251',50, '', '',0); ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' UPDATE information_schema.collations SET description = 'just updated'; -ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' +Got one of the listed errors DELETE FROM information_schema.collations WHERE table_name = 't1'; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' TRUNCATE information_schema.collations; diff --git a/mysql-test/suite/funcs_1/r/is_columns.result b/mysql-test/suite/funcs_1/r/is_columns.result index 26a8677495b..982f4de5116 100644 --- a/mysql-test/suite/funcs_1/r/is_columns.result +++ b/mysql-test/suite/funcs_1/r/is_columns.result @@ -296,7 +296,7 @@ SELECT table_name, column_name, column_default FROM information_schema.columns WHERE table_name = 't1_my_tablex'; table_name column_name column_default -t1_my_tablex first_col hello +t1_my_tablex first_col 'hello' SELECT table_name, column_name, is_nullable FROM information_schema.columns WHERE table_name = 't1_my_tablex'; diff --git a/mysql-test/suite/funcs_1/r/is_columns_innodb.result b/mysql-test/suite/funcs_1/r/is_columns_innodb.result index e1349f5a067..297dc2d33f8 100644 --- a/mysql-test/suite/funcs_1/r/is_columns_innodb.result +++ b/mysql-test/suite/funcs_1/r/is_columns_innodb.result @@ -472,15 +472,15 @@ def test tb1 f7 7 NULL YES longtext 4294967295 4294967295 NULL NULL NULL latin1 def test tb1 f8 8 NULL YES tinyblob 255 255 NULL NULL NULL NULL NULL tinyblob select,insert,update,references NEVER NULL def test tb1 f9 9 NULL YES blob 65535 65535 NULL NULL NULL NULL NULL blob select,insert,update,references NEVER NULL def test tb2 f100 42 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL NULL double unsigned zerofill select,insert,update,references NEVER NULL -def test tb2 f101 43 2000-01-01 NO date NULL NULL NULL NULL NULL NULL NULL date select,insert,update,references NEVER NULL -def test tb2 f102 44 00:00:20 NO time NULL NULL NULL NULL 0 NULL NULL time select,insert,update,references NEVER NULL -def test tb2 f103 45 0002-02-02 00:00:00 NO datetime NULL NULL NULL NULL 0 NULL NULL datetime select,insert,update,references NEVER NULL -def test tb2 f104 46 2000-12-31 23:59:59 NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL +def test tb2 f101 43 '2000-01-01' NO date NULL NULL NULL NULL NULL NULL NULL date select,insert,update,references NEVER NULL +def test tb2 f102 44 '00:00:20' NO time NULL NULL NULL NULL 0 NULL NULL time select,insert,update,references NEVER NULL +def test tb2 f103 45 '0002-02-02 00:00:00' NO datetime NULL NULL NULL NULL 0 NULL NULL datetime select,insert,update,references NEVER NULL +def test tb2 f104 46 '2000-12-31 23:59:59' NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL def test tb2 f105 47 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) select,insert,update,references NEVER NULL def test tb2 f106 48 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) select,insert,update,references NEVER NULL def test tb2 f107 49 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) select,insert,update,references NEVER NULL -def test tb2 f108 50 1enum NO enum 5 5 NULL NULL NULL latin1 latin1_swedish_ci enum('1enum','2enum') select,insert,update,references NEVER NULL -def test tb2 f109 51 1set NO set 9 9 NULL NULL NULL latin1 latin1_swedish_ci set('1set','2set') select,insert,update,references NEVER NULL +def test tb2 f108 50 '1enum' NO enum 5 5 NULL NULL NULL latin1 latin1_swedish_ci enum('1enum','2enum') select,insert,update,references NEVER NULL +def test tb2 f109 51 '1set' NO set 9 9 NULL NULL NULL latin1 latin1_swedish_ci set('1set','2set') select,insert,update,references NEVER NULL def test tb2 f59 1 NULL YES decimal NULL NULL 10 0 NULL NULL NULL decimal(10,0) unsigned select,insert,update,references NEVER NULL def test tb2 f60 2 NULL YES decimal NULL NULL 64 0 NULL NULL NULL decimal(64,0) unsigned select,insert,update,references NEVER NULL def test tb2 f61 3 NULL YES decimal NULL NULL 10 0 NULL NULL NULL decimal(10,0) unsigned zerofill select,insert,update,references NEVER NULL @@ -522,9 +522,9 @@ def test tb2 f96 38 8.8 NO double NULL NULL 22 NULL NULL NULL NULL double unsign def test tb2 f97 39 0000000008.8 NO float NULL NULL 12 NULL NULL NULL NULL float unsigned zerofill select,insert,update,references NEVER NULL def test tb2 f98 40 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL NULL double unsigned zerofill select,insert,update,references NEVER NULL def test tb2 f99 41 0000000008.8 NO float NULL NULL 12 NULL NULL NULL NULL float unsigned zerofill select,insert,update,references NEVER NULL -def test tb3 f118 1 a NO char 1 1 NULL NULL NULL latin1 latin1_swedish_ci char(1) select,insert,update,references NEVER NULL -def test tb3 f119 2  NO char 1 1 NULL NULL NULL latin1 latin1_bin char(1) select,insert,update,references NEVER NULL -def test tb3 f120 3  NO char 1 1 NULL NULL NULL latin1 latin1_swedish_ci char(1) select,insert,update,references NEVER NULL +def test tb3 f118 1 'a' NO char 1 1 NULL NULL NULL latin1 latin1_swedish_ci char(1) select,insert,update,references NEVER NULL +def test tb3 f119 2 '' NO char 1 1 NULL NULL NULL latin1 latin1_bin char(1) select,insert,update,references NEVER NULL +def test tb3 f120 3 '' NO char 1 1 NULL NULL NULL latin1 latin1_swedish_ci char(1) select,insert,update,references NEVER NULL def test tb3 f121 4 NULL YES tinytext 255 255 NULL NULL NULL latin1 latin1_swedish_ci tinytext select,insert,update,references NEVER NULL def test tb3 f122 5 NULL YES text 65535 65535 NULL NULL NULL latin1 latin1_swedish_ci text select,insert,update,references NEVER NULL def test tb3 f123 6 NULL YES mediumtext 16777215 16777215 NULL NULL NULL latin1 latin1_swedish_ci mediumtext select,insert,update,references NEVER NULL @@ -533,7 +533,7 @@ def test tb3 f125 8 NULL YES tinyblob 255 255 NULL NULL NULL NULL NULL tinyblob def test tb3 f126 9 NULL YES blob 65535 65535 NULL NULL NULL NULL NULL blob select,insert,update,references NEVER NULL def test tb3 f127 10 NULL YES mediumblob 16777215 16777215 NULL NULL NULL NULL NULL mediumblob select,insert,update,references NEVER NULL def test tb3 f128 11 NULL YES longblob 4294967295 4294967295 NULL NULL NULL NULL NULL longblob select,insert,update,references NEVER NULL -def test tb3 f129 12  NO binary 1 1 NULL NULL NULL NULL NULL binary(1) select,insert,update,references NEVER NULL +def test tb3 f129 12 '' NO binary 1 1 NULL NULL NULL NULL NULL binary(1) select,insert,update,references NEVER NULL def test tb3 f130 13 99 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(4) select,insert,update,references NEVER NULL def test tb3 f131 14 99 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(3) unsigned select,insert,update,references NEVER NULL def test tb3 f132 15 099 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(3) unsigned zerofill select,insert,update,references NEVER NULL @@ -639,15 +639,15 @@ def test tb4 f239 56 NULL YES varchar 20000 20000 NULL NULL NULL latin1 latin1_b def test tb4 f240 57 NULL YES varchar 2000 2000 NULL NULL NULL latin1 latin1_swedish_ci varchar(2000) select,insert,update,references NEVER NULL def test tb4 f241 58 NULL YES char 100 100 NULL NULL NULL latin1 latin1_swedish_ci char(100) select,insert,update,references NEVER NULL def test1 tb2 f100 42 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL NULL double unsigned zerofill select,insert,update,references NEVER NULL -def test1 tb2 f101 43 2000-01-01 NO date NULL NULL NULL NULL NULL NULL NULL date select,insert,update,references NEVER NULL -def test1 tb2 f102 44 00:00:20 NO time NULL NULL NULL NULL 0 NULL NULL time select,insert,update,references NEVER NULL -def test1 tb2 f103 45 0002-02-02 00:00:00 NO datetime NULL NULL NULL NULL 0 NULL NULL datetime select,insert,update,references NEVER NULL -def test1 tb2 f104 46 2000-12-31 23:59:59 NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL +def test1 tb2 f101 43 '2000-01-01' NO date NULL NULL NULL NULL NULL NULL NULL date select,insert,update,references NEVER NULL +def test1 tb2 f102 44 '00:00:20' NO time NULL NULL NULL NULL 0 NULL NULL time select,insert,update,references NEVER NULL +def test1 tb2 f103 45 '0002-02-02 00:00:00' NO datetime NULL NULL NULL NULL 0 NULL NULL datetime select,insert,update,references NEVER NULL +def test1 tb2 f104 46 '2000-12-31 23:59:59' NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL def test1 tb2 f105 47 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) select,insert,update,references NEVER NULL def test1 tb2 f106 48 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) select,insert,update,references NEVER NULL def test1 tb2 f107 49 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) select,insert,update,references NEVER NULL -def test1 tb2 f108 50 1enum NO enum 5 5 NULL NULL NULL latin1 latin1_swedish_ci enum('1enum','2enum') select,insert,update,references NEVER NULL -def test1 tb2 f109 51 1set NO set 9 9 NULL NULL NULL latin1 latin1_swedish_ci set('1set','2set') select,insert,update,references NEVER NULL +def test1 tb2 f108 50 '1enum' NO enum 5 5 NULL NULL NULL latin1 latin1_swedish_ci enum('1enum','2enum') select,insert,update,references NEVER NULL +def test1 tb2 f109 51 '1set' NO set 9 9 NULL NULL NULL latin1 latin1_swedish_ci set('1set','2set') select,insert,update,references NEVER NULL def test1 tb2 f59 1 NULL YES decimal NULL NULL 10 0 NULL NULL NULL decimal(10,0) unsigned select,insert,update,references NEVER NULL def test1 tb2 f60 2 NULL YES decimal NULL NULL 64 0 NULL NULL NULL decimal(64,0) unsigned select,insert,update,references NEVER NULL def test1 tb2 f61 3 NULL YES decimal NULL NULL 10 0 NULL NULL NULL decimal(10,0) unsigned zerofill select,insert,update,references NEVER NULL diff --git a/mysql-test/suite/funcs_1/r/is_columns_is.result b/mysql-test/suite/funcs_1/r/is_columns_is.result index 9cf3478aea5..58105c8d945 100644 --- a/mysql-test/suite/funcs_1/r/is_columns_is.result +++ b/mysql-test/suite/funcs_1/r/is_columns_is.result @@ -3,33 +3,33 @@ WHERE table_schema = 'information_schema' AND table_name <> 'profiling' AND table_name not like 'innodb_%' ORDER BY table_schema, table_name, column_name; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION COLUMN_DEFAULT IS_NULLABLE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE DATETIME_PRECISION CHARACTER_SET_NAME COLLATION_NAME COLUMN_TYPE COLUMN_KEY EXTRA PRIVILEGES COLUMN_COMMENT IS_GENERATED GENERATION_EXPRESSION -def information_schema ALL_PLUGINS LOAD_OPTION 11 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema ALL_PLUGINS LOAD_OPTION 11 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema ALL_PLUGINS PLUGIN_AUTHOR 8 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema ALL_PLUGINS PLUGIN_AUTH_VERSION 13 NULL YES varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) select NEVER NULL def information_schema ALL_PLUGINS PLUGIN_DESCRIPTION 9 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext select NEVER NULL def information_schema ALL_PLUGINS PLUGIN_LIBRARY 6 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema ALL_PLUGINS PLUGIN_LIBRARY_VERSION 7 NULL YES varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) select NEVER NULL -def information_schema ALL_PLUGINS PLUGIN_LICENSE 10 NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) select NEVER NULL -def information_schema ALL_PLUGINS PLUGIN_MATURITY 12 NO varchar 12 36 NULL NULL NULL utf8 utf8_general_ci varchar(12) select NEVER NULL -def information_schema ALL_PLUGINS PLUGIN_NAME 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema ALL_PLUGINS PLUGIN_STATUS 3 NO varchar 16 48 NULL NULL NULL utf8 utf8_general_ci varchar(16) select NEVER NULL -def information_schema ALL_PLUGINS PLUGIN_TYPE 4 NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) select NEVER NULL -def information_schema ALL_PLUGINS PLUGIN_TYPE_VERSION 5 NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) select NEVER NULL -def information_schema ALL_PLUGINS PLUGIN_VERSION 2 NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) select NEVER NULL -def information_schema APPLICABLE_ROLES GRANTEE 1 NO varchar 190 570 NULL NULL NULL utf8 utf8_general_ci varchar(190) select NEVER NULL +def information_schema ALL_PLUGINS PLUGIN_LICENSE 10 '' NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) select NEVER NULL +def information_schema ALL_PLUGINS PLUGIN_MATURITY 12 '' NO varchar 12 36 NULL NULL NULL utf8 utf8_general_ci varchar(12) select NEVER NULL +def information_schema ALL_PLUGINS PLUGIN_NAME 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema ALL_PLUGINS PLUGIN_STATUS 3 '' NO varchar 16 48 NULL NULL NULL utf8 utf8_general_ci varchar(16) select NEVER NULL +def information_schema ALL_PLUGINS PLUGIN_TYPE 4 '' NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) select NEVER NULL +def information_schema ALL_PLUGINS PLUGIN_TYPE_VERSION 5 '' NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) select NEVER NULL +def information_schema ALL_PLUGINS PLUGIN_VERSION 2 '' NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) select NEVER NULL +def information_schema APPLICABLE_ROLES GRANTEE 1 '' NO varchar 190 570 NULL NULL NULL utf8 utf8_general_ci varchar(190) select NEVER NULL def information_schema APPLICABLE_ROLES IS_DEFAULT 4 NULL YES varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL -def information_schema APPLICABLE_ROLES IS_GRANTABLE 3 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL -def information_schema APPLICABLE_ROLES ROLE_NAME 2 NO varchar 128 384 NULL NULL NULL utf8 utf8_general_ci varchar(128) select NEVER NULL -def information_schema CHARACTER_SETS CHARACTER_SET_NAME 1 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL -def information_schema CHARACTER_SETS DEFAULT_COLLATE_NAME 2 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL -def information_schema CHARACTER_SETS DESCRIPTION 3 NO varchar 60 180 NULL NULL NULL utf8 utf8_general_ci varchar(60) select NEVER NULL +def information_schema APPLICABLE_ROLES IS_GRANTABLE 3 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL +def information_schema APPLICABLE_ROLES ROLE_NAME 2 '' NO varchar 128 384 NULL NULL NULL utf8 utf8_general_ci varchar(128) select NEVER NULL +def information_schema CHARACTER_SETS CHARACTER_SET_NAME 1 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL +def information_schema CHARACTER_SETS DEFAULT_COLLATE_NAME 2 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL +def information_schema CHARACTER_SETS DESCRIPTION 3 '' NO varchar 60 180 NULL NULL NULL utf8 utf8_general_ci varchar(60) select NEVER NULL def information_schema CHARACTER_SETS MAXLEN 4 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(3) select NEVER NULL def information_schema CLIENT_STATISTICS ACCESS_DENIED 22 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL def information_schema CLIENT_STATISTICS BINLOG_BYTES_WRITTEN 9 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL def information_schema CLIENT_STATISTICS BUSY_TIME 5 0 NO double NULL NULL 21 NULL NULL NULL NULL double select NEVER NULL def information_schema CLIENT_STATISTICS BYTES_RECEIVED 7 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL def information_schema CLIENT_STATISTICS BYTES_SENT 8 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL -def information_schema CLIENT_STATISTICS CLIENT 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema CLIENT_STATISTICS CLIENT 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema CLIENT_STATISTICS COMMIT_TRANSACTIONS 18 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL def information_schema CLIENT_STATISTICS CONCURRENT_CONNECTIONS 3 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL def information_schema CLIENT_STATISTICS CONNECTED_TIME 4 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL @@ -49,74 +49,74 @@ def information_schema CLIENT_STATISTICS SELECT_COMMANDS 15 0 NO bigint NULL NUL def information_schema CLIENT_STATISTICS TOTAL_CONNECTIONS 2 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL def information_schema CLIENT_STATISTICS TOTAL_SSL_CONNECTIONS 24 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema CLIENT_STATISTICS UPDATE_COMMANDS 16 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL -def information_schema COLLATIONS CHARACTER_SET_NAME 2 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL -def information_schema COLLATIONS COLLATION_NAME 1 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL +def information_schema COLLATIONS CHARACTER_SET_NAME 2 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL +def information_schema COLLATIONS COLLATION_NAME 1 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL def information_schema COLLATIONS ID 3 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(11) select NEVER NULL -def information_schema COLLATIONS IS_COMPILED 5 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL -def information_schema COLLATIONS IS_DEFAULT 4 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL +def information_schema COLLATIONS IS_COMPILED 5 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL +def information_schema COLLATIONS IS_DEFAULT 4 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL def information_schema COLLATIONS SORTLEN 6 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(3) select NEVER NULL -def information_schema COLLATION_CHARACTER_SET_APPLICABILITY CHARACTER_SET_NAME 2 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL -def information_schema COLLATION_CHARACTER_SET_APPLICABILITY COLLATION_NAME 1 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL +def information_schema COLLATION_CHARACTER_SET_APPLICABILITY CHARACTER_SET_NAME 2 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL +def information_schema COLLATION_CHARACTER_SET_APPLICABILITY COLLATION_NAME 1 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL def information_schema COLUMNS CHARACTER_MAXIMUM_LENGTH 9 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema COLUMNS CHARACTER_OCTET_LENGTH 10 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema COLUMNS CHARACTER_SET_NAME 14 NULL YES varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL def information_schema COLUMNS COLLATION_NAME 15 NULL YES varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL -def information_schema COLUMNS COLUMN_COMMENT 20 NO varchar 1024 3072 NULL NULL NULL utf8 utf8_general_ci varchar(1024) select NEVER NULL +def information_schema COLUMNS COLUMN_COMMENT 20 '' NO varchar 1024 3072 NULL NULL NULL utf8 utf8_general_ci varchar(1024) select NEVER NULL def information_schema COLUMNS COLUMN_DEFAULT 6 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext select NEVER NULL -def information_schema COLUMNS COLUMN_KEY 17 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL -def information_schema COLUMNS COLUMN_NAME 4 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema COLUMNS COLUMN_TYPE 16 NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext select NEVER NULL -def information_schema COLUMNS DATA_TYPE 8 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema COLUMNS COLUMN_KEY 17 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL +def information_schema COLUMNS COLUMN_NAME 4 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema COLUMNS COLUMN_TYPE 16 '' NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext select NEVER NULL +def information_schema COLUMNS DATA_TYPE 8 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema COLUMNS DATETIME_PRECISION 13 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL -def information_schema COLUMNS EXTRA 18 NO varchar 30 90 NULL NULL NULL utf8 utf8_general_ci varchar(30) select NEVER NULL +def information_schema COLUMNS EXTRA 18 '' NO varchar 30 90 NULL NULL NULL utf8 utf8_general_ci varchar(30) select NEVER NULL def information_schema COLUMNS GENERATION_EXPRESSION 22 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext select NEVER NULL -def information_schema COLUMNS IS_GENERATED 21 NO varchar 6 18 NULL NULL NULL utf8 utf8_general_ci varchar(6) select NEVER NULL -def information_schema COLUMNS IS_NULLABLE 7 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL +def information_schema COLUMNS IS_GENERATED 21 '' NO varchar 6 18 NULL NULL NULL utf8 utf8_general_ci varchar(6) select NEVER NULL +def information_schema COLUMNS IS_NULLABLE 7 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL def information_schema COLUMNS NUMERIC_PRECISION 11 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema COLUMNS NUMERIC_SCALE 12 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema COLUMNS ORDINAL_POSITION 5 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL -def information_schema COLUMNS PRIVILEGES 19 NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) select NEVER NULL -def information_schema COLUMNS TABLE_CATALOG 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL -def information_schema COLUMNS TABLE_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema COLUMNS TABLE_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema COLUMN_PRIVILEGES COLUMN_NAME 5 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema COLUMN_PRIVILEGES GRANTEE 1 NO varchar 190 570 NULL NULL NULL utf8 utf8_general_ci varchar(190) select NEVER NULL -def information_schema COLUMN_PRIVILEGES IS_GRANTABLE 7 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL -def information_schema COLUMN_PRIVILEGES PRIVILEGE_TYPE 6 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema COLUMN_PRIVILEGES TABLE_CATALOG 2 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL -def information_schema COLUMN_PRIVILEGES TABLE_NAME 4 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema COLUMN_PRIVILEGES TABLE_SCHEMA 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema COLUMNS PRIVILEGES 19 '' NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) select NEVER NULL +def information_schema COLUMNS TABLE_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL +def information_schema COLUMNS TABLE_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema COLUMNS TABLE_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema COLUMN_PRIVILEGES COLUMN_NAME 5 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema COLUMN_PRIVILEGES GRANTEE 1 '' NO varchar 190 570 NULL NULL NULL utf8 utf8_general_ci varchar(190) select NEVER NULL +def information_schema COLUMN_PRIVILEGES IS_GRANTABLE 7 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL +def information_schema COLUMN_PRIVILEGES PRIVILEGE_TYPE 6 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema COLUMN_PRIVILEGES TABLE_CATALOG 2 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL +def information_schema COLUMN_PRIVILEGES TABLE_NAME 4 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema COLUMN_PRIVILEGES TABLE_SCHEMA 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema ENABLED_ROLES ROLE_NAME 1 NULL YES varchar 128 384 NULL NULL NULL utf8 utf8_general_ci varchar(128) select NEVER NULL -def information_schema ENGINES COMMENT 3 NO varchar 160 480 NULL NULL NULL utf8 utf8_general_ci varchar(160) select NEVER NULL -def information_schema ENGINES ENGINE 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema ENGINES COMMENT 3 '' NO varchar 160 480 NULL NULL NULL utf8 utf8_general_ci varchar(160) select NEVER NULL +def information_schema ENGINES ENGINE 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema ENGINES SAVEPOINTS 6 NULL YES varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL -def information_schema ENGINES SUPPORT 2 NO varchar 8 24 NULL NULL NULL utf8 utf8_general_ci varchar(8) select NEVER NULL +def information_schema ENGINES SUPPORT 2 '' NO varchar 8 24 NULL NULL NULL utf8 utf8_general_ci varchar(8) select NEVER NULL def information_schema ENGINES TRANSACTIONS 4 NULL YES varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL def information_schema ENGINES XA 5 NULL YES varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL -def information_schema EVENTS CHARACTER_SET_CLIENT 22 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL -def information_schema EVENTS COLLATION_CONNECTION 23 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL -def information_schema EVENTS CREATED 17 0000-00-00 00:00:00 NO datetime NULL NULL NULL NULL 0 NULL NULL datetime select NEVER NULL -def information_schema EVENTS DATABASE_COLLATION 24 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL -def information_schema EVENTS DEFINER 4 NO varchar 189 567 NULL NULL NULL utf8 utf8_general_ci varchar(189) select NEVER NULL +def information_schema EVENTS CHARACTER_SET_CLIENT 22 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL +def information_schema EVENTS COLLATION_CONNECTION 23 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL +def information_schema EVENTS CREATED 17 '0000-00-00 00:00:00' NO datetime NULL NULL NULL NULL 0 NULL NULL datetime select NEVER NULL +def information_schema EVENTS DATABASE_COLLATION 24 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL +def information_schema EVENTS DEFINER 4 '' NO varchar 189 567 NULL NULL NULL utf8 utf8_general_ci varchar(189) select NEVER NULL def information_schema EVENTS ENDS 14 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime select NEVER NULL -def information_schema EVENTS EVENT_BODY 6 NO varchar 8 24 NULL NULL NULL utf8 utf8_general_ci varchar(8) select NEVER NULL -def information_schema EVENTS EVENT_CATALOG 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema EVENTS EVENT_COMMENT 20 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema EVENTS EVENT_DEFINITION 7 NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext select NEVER NULL -def information_schema EVENTS EVENT_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema EVENTS EVENT_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema EVENTS EVENT_TYPE 8 NO varchar 9 27 NULL NULL NULL utf8 utf8_general_ci varchar(9) select NEVER NULL +def information_schema EVENTS EVENT_BODY 6 '' NO varchar 8 24 NULL NULL NULL utf8 utf8_general_ci varchar(8) select NEVER NULL +def information_schema EVENTS EVENT_CATALOG 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema EVENTS EVENT_COMMENT 20 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema EVENTS EVENT_DEFINITION 7 '' NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext select NEVER NULL +def information_schema EVENTS EVENT_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema EVENTS EVENT_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema EVENTS EVENT_TYPE 8 '' NO varchar 9 27 NULL NULL NULL utf8 utf8_general_ci varchar(9) select NEVER NULL def information_schema EVENTS EXECUTE_AT 9 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime select NEVER NULL def information_schema EVENTS INTERVAL_FIELD 11 NULL YES varchar 18 54 NULL NULL NULL utf8 utf8_general_ci varchar(18) select NEVER NULL def information_schema EVENTS INTERVAL_VALUE 10 NULL YES varchar 256 768 NULL NULL NULL utf8 utf8_general_ci varchar(256) select NEVER NULL -def information_schema EVENTS LAST_ALTERED 18 0000-00-00 00:00:00 NO datetime NULL NULL NULL NULL 0 NULL NULL datetime select NEVER NULL +def information_schema EVENTS LAST_ALTERED 18 '0000-00-00 00:00:00' NO datetime NULL NULL NULL NULL 0 NULL NULL datetime select NEVER NULL def information_schema EVENTS LAST_EXECUTED 19 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime select NEVER NULL -def information_schema EVENTS ON_COMPLETION 16 NO varchar 12 36 NULL NULL NULL utf8 utf8_general_ci varchar(12) select NEVER NULL +def information_schema EVENTS ON_COMPLETION 16 '' NO varchar 12 36 NULL NULL NULL utf8 utf8_general_ci varchar(12) select NEVER NULL def information_schema EVENTS ORIGINATOR 21 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(10) select NEVER NULL -def information_schema EVENTS SQL_MODE 12 NO varchar 8192 24576 NULL NULL NULL utf8 utf8_general_ci varchar(8192) select NEVER NULL +def information_schema EVENTS SQL_MODE 12 '' NO varchar 8192 24576 NULL NULL NULL utf8 utf8_general_ci varchar(8192) select NEVER NULL def information_schema EVENTS STARTS 13 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime select NEVER NULL -def information_schema EVENTS STATUS 15 NO varchar 18 54 NULL NULL NULL utf8 utf8_general_ci varchar(18) select NEVER NULL -def information_schema EVENTS TIME_ZONE 5 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema EVENTS STATUS 15 '' NO varchar 18 54 NULL NULL NULL utf8 utf8_general_ci varchar(18) select NEVER NULL +def information_schema EVENTS TIME_ZONE 5 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema FILES AUTOEXTEND_SIZE 19 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema FILES AVG_ROW_LENGTH 28 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema FILES CHECKSUM 36 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL @@ -126,12 +126,12 @@ def information_schema FILES CREATION_TIME 20 NULL YES datetime NULL NULL NULL N def information_schema FILES DATA_FREE 32 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema FILES DATA_LENGTH 29 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema FILES DELETED_ROWS 12 NULL YES bigint NULL NULL 19 0 NULL NULL NULL bigint(4) select NEVER NULL -def information_schema FILES ENGINE 10 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema FILES ENGINE 10 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema FILES EXTENT_SIZE 16 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(4) select NEVER NULL def information_schema FILES EXTRA 38 NULL YES varchar 255 765 NULL NULL NULL utf8 utf8_general_ci varchar(255) select NEVER NULL def information_schema FILES FILE_ID 1 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(4) select NEVER NULL def information_schema FILES FILE_NAME 2 NULL YES varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL -def information_schema FILES FILE_TYPE 3 NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) select NEVER NULL +def information_schema FILES FILE_TYPE 3 '' NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) select NEVER NULL def information_schema FILES FREE_EXTENTS 14 NULL YES bigint NULL NULL 19 0 NULL NULL NULL bigint(4) select NEVER NULL def information_schema FILES FULLTEXT_KEYS 11 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema FILES INDEX_LENGTH 31 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL @@ -144,9 +144,9 @@ def information_schema FILES MAXIMUM_SIZE 18 NULL YES bigint NULL NULL 20 0 NULL def information_schema FILES MAX_DATA_LENGTH 30 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema FILES RECOVER_TIME 23 NULL YES bigint NULL NULL 19 0 NULL NULL NULL bigint(4) select NEVER NULL def information_schema FILES ROW_FORMAT 26 NULL YES varchar 10 30 NULL NULL NULL utf8 utf8_general_ci varchar(10) select NEVER NULL -def information_schema FILES STATUS 37 NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) select NEVER NULL +def information_schema FILES STATUS 37 '' NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) select NEVER NULL def information_schema FILES TABLESPACE_NAME 4 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema FILES TABLE_CATALOG 5 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema FILES TABLE_CATALOG 5 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema FILES TABLE_NAME 7 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema FILES TABLE_ROWS 27 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema FILES TABLE_SCHEMA 6 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL @@ -156,30 +156,30 @@ def information_schema FILES UPDATE_COUNT 13 NULL YES bigint NULL NULL 19 0 NULL def information_schema FILES UPDATE_TIME 34 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime select NEVER NULL def information_schema FILES VERSION 25 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema GEOMETRY_COLUMNS COORD_DIMENSION 11 0 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(2) select NEVER NULL -def information_schema GEOMETRY_COLUMNS F_GEOMETRY_COLUMN 4 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema GEOMETRY_COLUMNS F_TABLE_CATALOG 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL -def information_schema GEOMETRY_COLUMNS F_TABLE_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema GEOMETRY_COLUMNS F_TABLE_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema GEOMETRY_COLUMNS F_GEOMETRY_COLUMN 4 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema GEOMETRY_COLUMNS F_TABLE_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL +def information_schema GEOMETRY_COLUMNS F_TABLE_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema GEOMETRY_COLUMNS F_TABLE_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema GEOMETRY_COLUMNS GEOMETRY_TYPE 10 0 NO int NULL NULL 10 0 NULL NULL NULL int(7) select NEVER NULL -def information_schema GEOMETRY_COLUMNS G_GEOMETRY_COLUMN 8 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema GEOMETRY_COLUMNS G_TABLE_CATALOG 5 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL -def information_schema GEOMETRY_COLUMNS G_TABLE_NAME 7 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema GEOMETRY_COLUMNS G_TABLE_SCHEMA 6 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema GEOMETRY_COLUMNS G_GEOMETRY_COLUMN 8 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema GEOMETRY_COLUMNS G_TABLE_CATALOG 5 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL +def information_schema GEOMETRY_COLUMNS G_TABLE_NAME 7 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema GEOMETRY_COLUMNS G_TABLE_SCHEMA 6 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema GEOMETRY_COLUMNS MAX_PPR 12 0 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(2) select NEVER NULL def information_schema GEOMETRY_COLUMNS SRID 13 0 NO smallint NULL NULL 5 0 NULL NULL NULL smallint(5) select NEVER NULL def information_schema GEOMETRY_COLUMNS STORAGE_TYPE 9 0 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(2) select NEVER NULL -def information_schema GLOBAL_STATUS VARIABLE_NAME 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema GLOBAL_STATUS VARIABLE_VALUE 2 NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) select NEVER NULL -def information_schema GLOBAL_VARIABLES VARIABLE_NAME 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema GLOBAL_VARIABLES VARIABLE_VALUE 2 NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) select NEVER NULL -def information_schema INDEX_STATISTICS INDEX_NAME 3 NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) select NEVER NULL +def information_schema GLOBAL_STATUS VARIABLE_NAME 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema GLOBAL_STATUS VARIABLE_VALUE 2 '' NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) select NEVER NULL +def information_schema GLOBAL_VARIABLES VARIABLE_NAME 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema GLOBAL_VARIABLES VARIABLE_VALUE 2 '' NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) select NEVER NULL +def information_schema INDEX_STATISTICS INDEX_NAME 3 '' NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) select NEVER NULL def information_schema INDEX_STATISTICS ROWS_READ 4 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL -def information_schema INDEX_STATISTICS TABLE_NAME 2 NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) select NEVER NULL -def information_schema INDEX_STATISTICS TABLE_SCHEMA 1 NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) select NEVER NULL +def information_schema INDEX_STATISTICS TABLE_NAME 2 '' NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) select NEVER NULL +def information_schema INDEX_STATISTICS TABLE_SCHEMA 1 '' NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) select NEVER NULL def information_schema KEY_CACHES BLOCK_SIZE 5 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema KEY_CACHES DIRTY_BLOCKS 8 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema KEY_CACHES FULL_SIZE 4 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL -def information_schema KEY_CACHES KEY_CACHE_NAME 1 NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) select NEVER NULL +def information_schema KEY_CACHES KEY_CACHE_NAME 1 '' NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) select NEVER NULL def information_schema KEY_CACHES READS 10 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema KEY_CACHES READ_REQUESTS 9 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema KEY_CACHES SEGMENTS 2 NULL YES int NULL NULL 10 0 NULL NULL NULL int(3) unsigned select NEVER NULL @@ -188,34 +188,34 @@ def information_schema KEY_CACHES UNUSED_BLOCKS 7 0 NO bigint NULL NULL 20 0 NUL def information_schema KEY_CACHES USED_BLOCKS 6 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema KEY_CACHES WRITES 12 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema KEY_CACHES WRITE_REQUESTS 11 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL -def information_schema KEY_COLUMN_USAGE COLUMN_NAME 7 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema KEY_COLUMN_USAGE CONSTRAINT_CATALOG 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL -def information_schema KEY_COLUMN_USAGE CONSTRAINT_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema KEY_COLUMN_USAGE CONSTRAINT_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema KEY_COLUMN_USAGE COLUMN_NAME 7 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema KEY_COLUMN_USAGE CONSTRAINT_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL +def information_schema KEY_COLUMN_USAGE CONSTRAINT_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema KEY_COLUMN_USAGE CONSTRAINT_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema KEY_COLUMN_USAGE ORDINAL_POSITION 8 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(10) select NEVER NULL def information_schema KEY_COLUMN_USAGE POSITION_IN_UNIQUE_CONSTRAINT 9 NULL YES bigint NULL NULL 19 0 NULL NULL NULL bigint(10) select NEVER NULL def information_schema KEY_COLUMN_USAGE REFERENCED_COLUMN_NAME 12 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema KEY_COLUMN_USAGE REFERENCED_TABLE_NAME 11 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema KEY_COLUMN_USAGE REFERENCED_TABLE_SCHEMA 10 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema KEY_COLUMN_USAGE TABLE_CATALOG 4 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL -def information_schema KEY_COLUMN_USAGE TABLE_NAME 6 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema KEY_COLUMN_USAGE TABLE_SCHEMA 5 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema KEY_COLUMN_USAGE TABLE_CATALOG 4 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL +def information_schema KEY_COLUMN_USAGE TABLE_NAME 6 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema KEY_COLUMN_USAGE TABLE_SCHEMA 5 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema PARAMETERS CHARACTER_MAXIMUM_LENGTH 8 NULL YES int NULL NULL 10 0 NULL NULL NULL int(21) select NEVER NULL def information_schema PARAMETERS CHARACTER_OCTET_LENGTH 9 NULL YES int NULL NULL 10 0 NULL NULL NULL int(21) select NEVER NULL def information_schema PARAMETERS CHARACTER_SET_NAME 13 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema PARAMETERS COLLATION_NAME 14 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema PARAMETERS DATA_TYPE 7 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema PARAMETERS DATA_TYPE 7 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema PARAMETERS DATETIME_PRECISION 12 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL -def information_schema PARAMETERS DTD_IDENTIFIER 15 NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext select NEVER NULL +def information_schema PARAMETERS DTD_IDENTIFIER 15 '' NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext select NEVER NULL def information_schema PARAMETERS NUMERIC_PRECISION 10 NULL YES int NULL NULL 10 0 NULL NULL NULL int(21) select NEVER NULL def information_schema PARAMETERS NUMERIC_SCALE 11 NULL YES int NULL NULL 10 0 NULL NULL NULL int(21) select NEVER NULL def information_schema PARAMETERS ORDINAL_POSITION 4 0 NO int NULL NULL 10 0 NULL NULL NULL int(21) select NEVER NULL def information_schema PARAMETERS PARAMETER_MODE 5 NULL YES varchar 5 15 NULL NULL NULL utf8 utf8_general_ci varchar(5) select NEVER NULL def information_schema PARAMETERS PARAMETER_NAME 6 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema PARAMETERS ROUTINE_TYPE 16 NO varchar 9 27 NULL NULL NULL utf8 utf8_general_ci varchar(9) select NEVER NULL -def information_schema PARAMETERS SPECIFIC_CATALOG 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL -def information_schema PARAMETERS SPECIFIC_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema PARAMETERS SPECIFIC_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema PARAMETERS ROUTINE_TYPE 16 '' NO varchar 9 27 NULL NULL NULL utf8 utf8_general_ci varchar(9) select NEVER NULL +def information_schema PARAMETERS SPECIFIC_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL +def information_schema PARAMETERS SPECIFIC_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema PARAMETERS SPECIFIC_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema PARTITIONS AVG_ROW_LENGTH 14 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema PARTITIONS CHECKSUM 22 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema PARTITIONS CHECK_TIME 21 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime select NEVER NULL @@ -224,8 +224,8 @@ def information_schema PARTITIONS DATA_FREE 18 0 NO bigint NULL NULL 20 0 NULL N def information_schema PARTITIONS DATA_LENGTH 15 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema PARTITIONS INDEX_LENGTH 17 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema PARTITIONS MAX_DATA_LENGTH 16 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL -def information_schema PARTITIONS NODEGROUP 24 NO varchar 12 36 NULL NULL NULL utf8 utf8_general_ci varchar(12) select NEVER NULL -def information_schema PARTITIONS PARTITION_COMMENT 23 NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) select NEVER NULL +def information_schema PARTITIONS NODEGROUP 24 '' NO varchar 12 36 NULL NULL NULL utf8 utf8_general_ci varchar(12) select NEVER NULL +def information_schema PARTITIONS PARTITION_COMMENT 23 '' NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) select NEVER NULL def information_schema PARTITIONS PARTITION_DESCRIPTION 12 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext select NEVER NULL def information_schema PARTITIONS PARTITION_EXPRESSION 10 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext select NEVER NULL def information_schema PARTITIONS PARTITION_METHOD 8 NULL YES varchar 18 54 NULL NULL NULL utf8 utf8_general_ci varchar(18) select NEVER NULL @@ -236,28 +236,28 @@ def information_schema PARTITIONS SUBPARTITION_METHOD 9 NULL YES varchar 12 36 N def information_schema PARTITIONS SUBPARTITION_NAME 5 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema PARTITIONS SUBPARTITION_ORDINAL_POSITION 7 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema PARTITIONS TABLESPACE_NAME 25 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema PARTITIONS TABLE_CATALOG 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL -def information_schema PARTITIONS TABLE_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema PARTITIONS TABLE_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL +def information_schema PARTITIONS TABLE_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema PARTITIONS TABLE_ROWS 13 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL -def information_schema PARTITIONS TABLE_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema PARTITIONS TABLE_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema PARTITIONS UPDATE_TIME 20 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime select NEVER NULL -def information_schema PLUGINS LOAD_OPTION 11 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema PLUGINS LOAD_OPTION 11 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema PLUGINS PLUGIN_AUTHOR 8 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema PLUGINS PLUGIN_AUTH_VERSION 13 NULL YES varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) select NEVER NULL def information_schema PLUGINS PLUGIN_DESCRIPTION 9 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext select NEVER NULL def information_schema PLUGINS PLUGIN_LIBRARY 6 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema PLUGINS PLUGIN_LIBRARY_VERSION 7 NULL YES varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) select NEVER NULL -def information_schema PLUGINS PLUGIN_LICENSE 10 NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) select NEVER NULL -def information_schema PLUGINS PLUGIN_MATURITY 12 NO varchar 12 36 NULL NULL NULL utf8 utf8_general_ci varchar(12) select NEVER NULL -def information_schema PLUGINS PLUGIN_NAME 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema PLUGINS PLUGIN_STATUS 3 NO varchar 16 48 NULL NULL NULL utf8 utf8_general_ci varchar(16) select NEVER NULL -def information_schema PLUGINS PLUGIN_TYPE 4 NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) select NEVER NULL -def information_schema PLUGINS PLUGIN_TYPE_VERSION 5 NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) select NEVER NULL -def information_schema PLUGINS PLUGIN_VERSION 2 NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) select NEVER NULL -def information_schema PROCESSLIST COMMAND 5 NO varchar 16 48 NULL NULL NULL utf8 utf8_general_ci varchar(16) select NEVER NULL +def information_schema PLUGINS PLUGIN_LICENSE 10 '' NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) select NEVER NULL +def information_schema PLUGINS PLUGIN_MATURITY 12 '' NO varchar 12 36 NULL NULL NULL utf8 utf8_general_ci varchar(12) select NEVER NULL +def information_schema PLUGINS PLUGIN_NAME 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema PLUGINS PLUGIN_STATUS 3 '' NO varchar 16 48 NULL NULL NULL utf8 utf8_general_ci varchar(16) select NEVER NULL +def information_schema PLUGINS PLUGIN_TYPE 4 '' NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) select NEVER NULL +def information_schema PLUGINS PLUGIN_TYPE_VERSION 5 '' NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) select NEVER NULL +def information_schema PLUGINS PLUGIN_VERSION 2 '' NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) select NEVER NULL +def information_schema PROCESSLIST COMMAND 5 '' NO varchar 16 48 NULL NULL NULL utf8 utf8_general_ci varchar(16) select NEVER NULL def information_schema PROCESSLIST DB 4 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema PROCESSLIST EXAMINED_ROWS 14 0 NO int NULL NULL 10 0 NULL NULL NULL int(7) select NEVER NULL -def information_schema PROCESSLIST HOST 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema PROCESSLIST HOST 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema PROCESSLIST ID 1 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(4) select NEVER NULL def information_schema PROCESSLIST INFO 8 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext select NEVER NULL def information_schema PROCESSLIST INFO_BINARY 16 NULL YES blob 65535 65535 NULL NULL NULL NULL NULL blob select NEVER NULL @@ -270,97 +270,97 @@ def information_schema PROCESSLIST STATE 7 NULL YES varchar 64 192 NULL NULL NUL def information_schema PROCESSLIST TID 17 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(4) select NEVER NULL def information_schema PROCESSLIST TIME 6 0 NO int NULL NULL 10 0 NULL NULL NULL int(7) select NEVER NULL def information_schema PROCESSLIST TIME_MS 9 0.000 NO decimal NULL NULL 22 3 NULL NULL NULL decimal(22,3) select NEVER NULL -def information_schema PROCESSLIST USER 2 NO varchar 128 384 NULL NULL NULL utf8 utf8_general_ci varchar(128) select NEVER NULL -def information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_CATALOG 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL -def information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema REFERENTIAL_CONSTRAINTS DELETE_RULE 9 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema REFERENTIAL_CONSTRAINTS MATCH_OPTION 7 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema REFERENTIAL_CONSTRAINTS REFERENCED_TABLE_NAME 11 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema REFERENTIAL_CONSTRAINTS TABLE_NAME 10 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema REFERENTIAL_CONSTRAINTS UNIQUE_CONSTRAINT_CATALOG 4 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL +def information_schema PROCESSLIST USER 2 '' NO varchar 128 384 NULL NULL NULL utf8 utf8_general_ci varchar(128) select NEVER NULL +def information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL +def information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema REFERENTIAL_CONSTRAINTS DELETE_RULE 9 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema REFERENTIAL_CONSTRAINTS MATCH_OPTION 7 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema REFERENTIAL_CONSTRAINTS REFERENCED_TABLE_NAME 11 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema REFERENTIAL_CONSTRAINTS TABLE_NAME 10 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema REFERENTIAL_CONSTRAINTS UNIQUE_CONSTRAINT_CATALOG 4 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL def information_schema REFERENTIAL_CONSTRAINTS UNIQUE_CONSTRAINT_NAME 6 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema REFERENTIAL_CONSTRAINTS UNIQUE_CONSTRAINT_SCHEMA 5 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema REFERENTIAL_CONSTRAINTS UPDATE_RULE 8 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema REFERENTIAL_CONSTRAINTS UNIQUE_CONSTRAINT_SCHEMA 5 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema REFERENTIAL_CONSTRAINTS UPDATE_RULE 8 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema ROUTINES CHARACTER_MAXIMUM_LENGTH 7 NULL YES int NULL NULL 10 0 NULL NULL NULL int(21) select NEVER NULL def information_schema ROUTINES CHARACTER_OCTET_LENGTH 8 NULL YES int NULL NULL 10 0 NULL NULL NULL int(21) select NEVER NULL -def information_schema ROUTINES CHARACTER_SET_CLIENT 29 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL +def information_schema ROUTINES CHARACTER_SET_CLIENT 29 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL def information_schema ROUTINES CHARACTER_SET_NAME 12 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema ROUTINES COLLATION_CONNECTION 30 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL +def information_schema ROUTINES COLLATION_CONNECTION 30 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL def information_schema ROUTINES COLLATION_NAME 13 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema ROUTINES CREATED 24 0000-00-00 00:00:00 NO datetime NULL NULL NULL NULL 0 NULL NULL datetime select NEVER NULL -def information_schema ROUTINES DATABASE_COLLATION 31 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL -def information_schema ROUTINES DATA_TYPE 6 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema ROUTINES CREATED 24 '0000-00-00 00:00:00' NO datetime NULL NULL NULL NULL 0 NULL NULL datetime select NEVER NULL +def information_schema ROUTINES DATABASE_COLLATION 31 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL +def information_schema ROUTINES DATA_TYPE 6 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema ROUTINES DATETIME_PRECISION 11 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL -def information_schema ROUTINES DEFINER 28 NO varchar 189 567 NULL NULL NULL utf8 utf8_general_ci varchar(189) select NEVER NULL +def information_schema ROUTINES DEFINER 28 '' NO varchar 189 567 NULL NULL NULL utf8 utf8_general_ci varchar(189) select NEVER NULL def information_schema ROUTINES DTD_IDENTIFIER 14 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext select NEVER NULL def information_schema ROUTINES EXTERNAL_LANGUAGE 18 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema ROUTINES EXTERNAL_NAME 17 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema ROUTINES IS_DETERMINISTIC 20 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL -def information_schema ROUTINES LAST_ALTERED 25 0000-00-00 00:00:00 NO datetime NULL NULL NULL NULL 0 NULL NULL datetime select NEVER NULL +def information_schema ROUTINES IS_DETERMINISTIC 20 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL +def information_schema ROUTINES LAST_ALTERED 25 '0000-00-00 00:00:00' NO datetime NULL NULL NULL NULL 0 NULL NULL datetime select NEVER NULL def information_schema ROUTINES NUMERIC_PRECISION 9 NULL YES int NULL NULL 10 0 NULL NULL NULL int(21) select NEVER NULL def information_schema ROUTINES NUMERIC_SCALE 10 NULL YES int NULL NULL 10 0 NULL NULL NULL int(21) select NEVER NULL -def information_schema ROUTINES PARAMETER_STYLE 19 NO varchar 8 24 NULL NULL NULL utf8 utf8_general_ci varchar(8) select NEVER NULL -def information_schema ROUTINES ROUTINE_BODY 15 NO varchar 8 24 NULL NULL NULL utf8 utf8_general_ci varchar(8) select NEVER NULL -def information_schema ROUTINES ROUTINE_CATALOG 2 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL -def information_schema ROUTINES ROUTINE_COMMENT 27 NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext select NEVER NULL +def information_schema ROUTINES PARAMETER_STYLE 19 '' NO varchar 8 24 NULL NULL NULL utf8 utf8_general_ci varchar(8) select NEVER NULL +def information_schema ROUTINES ROUTINE_BODY 15 '' NO varchar 8 24 NULL NULL NULL utf8 utf8_general_ci varchar(8) select NEVER NULL +def information_schema ROUTINES ROUTINE_CATALOG 2 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL +def information_schema ROUTINES ROUTINE_COMMENT 27 '' NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext select NEVER NULL def information_schema ROUTINES ROUTINE_DEFINITION 16 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext select NEVER NULL -def information_schema ROUTINES ROUTINE_NAME 4 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema ROUTINES ROUTINE_SCHEMA 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema ROUTINES ROUTINE_TYPE 5 NO varchar 9 27 NULL NULL NULL utf8 utf8_general_ci varchar(9) select NEVER NULL -def information_schema ROUTINES SECURITY_TYPE 23 NO varchar 7 21 NULL NULL NULL utf8 utf8_general_ci varchar(7) select NEVER NULL -def information_schema ROUTINES SPECIFIC_NAME 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema ROUTINES SQL_DATA_ACCESS 21 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema ROUTINES SQL_MODE 26 NO varchar 8192 24576 NULL NULL NULL utf8 utf8_general_ci varchar(8192) select NEVER NULL +def information_schema ROUTINES ROUTINE_NAME 4 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema ROUTINES ROUTINE_SCHEMA 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema ROUTINES ROUTINE_TYPE 5 '' NO varchar 9 27 NULL NULL NULL utf8 utf8_general_ci varchar(9) select NEVER NULL +def information_schema ROUTINES SECURITY_TYPE 23 '' NO varchar 7 21 NULL NULL NULL utf8 utf8_general_ci varchar(7) select NEVER NULL +def information_schema ROUTINES SPECIFIC_NAME 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema ROUTINES SQL_DATA_ACCESS 21 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema ROUTINES SQL_MODE 26 '' NO varchar 8192 24576 NULL NULL NULL utf8 utf8_general_ci varchar(8192) select NEVER NULL def information_schema ROUTINES SQL_PATH 22 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema SCHEMATA CATALOG_NAME 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL -def information_schema SCHEMATA DEFAULT_CHARACTER_SET_NAME 3 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL -def information_schema SCHEMATA DEFAULT_COLLATION_NAME 4 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL -def information_schema SCHEMATA SCHEMA_NAME 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema SCHEMATA CATALOG_NAME 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL +def information_schema SCHEMATA DEFAULT_CHARACTER_SET_NAME 3 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL +def information_schema SCHEMATA DEFAULT_COLLATION_NAME 4 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL +def information_schema SCHEMATA SCHEMA_NAME 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema SCHEMATA SQL_PATH 5 NULL YES varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL -def information_schema SCHEMA_PRIVILEGES GRANTEE 1 NO varchar 190 570 NULL NULL NULL utf8 utf8_general_ci varchar(190) select NEVER NULL -def information_schema SCHEMA_PRIVILEGES IS_GRANTABLE 5 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL -def information_schema SCHEMA_PRIVILEGES PRIVILEGE_TYPE 4 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema SCHEMA_PRIVILEGES TABLE_CATALOG 2 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL -def information_schema SCHEMA_PRIVILEGES TABLE_SCHEMA 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema SESSION_STATUS VARIABLE_NAME 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema SESSION_STATUS VARIABLE_VALUE 2 NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) select NEVER NULL -def information_schema SESSION_VARIABLES VARIABLE_NAME 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema SESSION_VARIABLES VARIABLE_VALUE 2 NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) select NEVER NULL -def information_schema SPATIAL_REF_SYS AUTH_NAME 2 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL +def information_schema SCHEMA_PRIVILEGES GRANTEE 1 '' NO varchar 190 570 NULL NULL NULL utf8 utf8_general_ci varchar(190) select NEVER NULL +def information_schema SCHEMA_PRIVILEGES IS_GRANTABLE 5 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL +def information_schema SCHEMA_PRIVILEGES PRIVILEGE_TYPE 4 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema SCHEMA_PRIVILEGES TABLE_CATALOG 2 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL +def information_schema SCHEMA_PRIVILEGES TABLE_SCHEMA 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema SESSION_STATUS VARIABLE_NAME 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema SESSION_STATUS VARIABLE_VALUE 2 '' NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) select NEVER NULL +def information_schema SESSION_VARIABLES VARIABLE_NAME 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema SESSION_VARIABLES VARIABLE_VALUE 2 '' NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) select NEVER NULL +def information_schema SPATIAL_REF_SYS AUTH_NAME 2 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL def information_schema SPATIAL_REF_SYS AUTH_SRID 3 0 NO int NULL NULL 10 0 NULL NULL NULL int(5) select NEVER NULL def information_schema SPATIAL_REF_SYS SRID 1 0 NO smallint NULL NULL 5 0 NULL NULL NULL smallint(5) select NEVER NULL -def information_schema SPATIAL_REF_SYS SRTEXT 4 NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) select NEVER NULL +def information_schema SPATIAL_REF_SYS SRTEXT 4 '' NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) select NEVER NULL def information_schema STATISTICS CARDINALITY 10 NULL YES bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL def information_schema STATISTICS COLLATION 9 NULL YES varchar 1 3 NULL NULL NULL utf8 utf8_general_ci varchar(1) select NEVER NULL -def information_schema STATISTICS COLUMN_NAME 8 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema STATISTICS COLUMN_NAME 8 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema STATISTICS COMMENT 15 NULL YES varchar 16 48 NULL NULL NULL utf8 utf8_general_ci varchar(16) select NEVER NULL -def information_schema STATISTICS INDEX_COMMENT 16 NO varchar 1024 3072 NULL NULL NULL utf8 utf8_general_ci varchar(1024) select NEVER NULL -def information_schema STATISTICS INDEX_NAME 6 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema STATISTICS INDEX_SCHEMA 5 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema STATISTICS INDEX_TYPE 14 NO varchar 16 48 NULL NULL NULL utf8 utf8_general_ci varchar(16) select NEVER NULL +def information_schema STATISTICS INDEX_COMMENT 16 '' NO varchar 1024 3072 NULL NULL NULL utf8 utf8_general_ci varchar(1024) select NEVER NULL +def information_schema STATISTICS INDEX_NAME 6 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema STATISTICS INDEX_SCHEMA 5 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema STATISTICS INDEX_TYPE 14 '' NO varchar 16 48 NULL NULL NULL utf8 utf8_general_ci varchar(16) select NEVER NULL def information_schema STATISTICS NON_UNIQUE 4 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(1) select NEVER NULL -def information_schema STATISTICS NULLABLE 13 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL +def information_schema STATISTICS NULLABLE 13 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL def information_schema STATISTICS PACKED 12 NULL YES varchar 10 30 NULL NULL NULL utf8 utf8_general_ci varchar(10) select NEVER NULL def information_schema STATISTICS SEQ_IN_INDEX 7 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(2) select NEVER NULL def information_schema STATISTICS SUB_PART 11 NULL YES bigint NULL NULL 19 0 NULL NULL NULL bigint(3) select NEVER NULL -def information_schema STATISTICS TABLE_CATALOG 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL -def information_schema STATISTICS TABLE_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema STATISTICS TABLE_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema STATISTICS TABLE_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL +def information_schema STATISTICS TABLE_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema STATISTICS TABLE_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema SYSTEM_VARIABLES COMMAND_LINE_ARGUMENT 14 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema SYSTEM_VARIABLES DEFAULT_VALUE 5 NULL YES varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) select NEVER NULL def information_schema SYSTEM_VARIABLES ENUM_VALUE_LIST 12 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext select NEVER NULL def information_schema SYSTEM_VARIABLES GLOBAL_VALUE 3 NULL YES varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) select NEVER NULL -def information_schema SYSTEM_VARIABLES GLOBAL_VALUE_ORIGIN 4 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema SYSTEM_VARIABLES GLOBAL_VALUE_ORIGIN 4 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema SYSTEM_VARIABLES NUMERIC_BLOCK_SIZE 11 NULL YES varchar 21 63 NULL NULL NULL utf8 utf8_general_ci varchar(21) select NEVER NULL def information_schema SYSTEM_VARIABLES NUMERIC_MAX_VALUE 10 NULL YES varchar 21 63 NULL NULL NULL utf8 utf8_general_ci varchar(21) select NEVER NULL def information_schema SYSTEM_VARIABLES NUMERIC_MIN_VALUE 9 NULL YES varchar 21 63 NULL NULL NULL utf8 utf8_general_ci varchar(21) select NEVER NULL -def information_schema SYSTEM_VARIABLES READ_ONLY 13 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL +def information_schema SYSTEM_VARIABLES READ_ONLY 13 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL def information_schema SYSTEM_VARIABLES SESSION_VALUE 2 NULL YES varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) select NEVER NULL -def information_schema SYSTEM_VARIABLES VARIABLE_COMMENT 8 NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) select NEVER NULL -def information_schema SYSTEM_VARIABLES VARIABLE_NAME 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema SYSTEM_VARIABLES VARIABLE_SCOPE 6 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema SYSTEM_VARIABLES VARIABLE_TYPE 7 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema SYSTEM_VARIABLES VARIABLE_COMMENT 8 '' NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) select NEVER NULL +def information_schema SYSTEM_VARIABLES VARIABLE_NAME 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema SYSTEM_VARIABLES VARIABLE_SCOPE 6 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema SYSTEM_VARIABLES VARIABLE_TYPE 7 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema TABLES AUTO_INCREMENT 14 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema TABLES AVG_ROW_LENGTH 9 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema TABLES CHECKSUM 19 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL @@ -373,67 +373,67 @@ def information_schema TABLES ENGINE 5 NULL YES varchar 64 192 NULL NULL NULL ut def information_schema TABLES INDEX_LENGTH 12 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema TABLES MAX_DATA_LENGTH 11 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema TABLES ROW_FORMAT 7 NULL YES varchar 10 30 NULL NULL NULL utf8 utf8_general_ci varchar(10) select NEVER NULL -def information_schema TABLES TABLE_CATALOG 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL +def information_schema TABLES TABLE_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL def information_schema TABLES TABLE_COLLATION 18 NULL YES varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL -def information_schema TABLES TABLE_COMMENT 21 NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) select NEVER NULL -def information_schema TABLES TABLE_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema TABLES TABLE_COMMENT 21 '' NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) select NEVER NULL +def information_schema TABLES TABLE_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema TABLES TABLE_ROWS 8 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL -def information_schema TABLES TABLE_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema TABLES TABLE_TYPE 4 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema TABLES TABLE_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema TABLES TABLE_TYPE 4 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema TABLES UPDATE_TIME 16 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime select NEVER NULL def information_schema TABLES VERSION 6 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema TABLESPACES AUTOEXTEND_SIZE 6 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL -def information_schema TABLESPACES ENGINE 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema TABLESPACES ENGINE 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema TABLESPACES EXTENT_SIZE 5 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema TABLESPACES LOGFILE_GROUP_NAME 4 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema TABLESPACES MAXIMUM_SIZE 7 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema TABLESPACES NODEGROUP_ID 8 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema TABLESPACES TABLESPACE_COMMENT 9 NULL YES varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) select NEVER NULL -def information_schema TABLESPACES TABLESPACE_NAME 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema TABLESPACES TABLESPACE_NAME 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema TABLESPACES TABLESPACE_TYPE 3 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema TABLE_CONSTRAINTS CONSTRAINT_CATALOG 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL -def information_schema TABLE_CONSTRAINTS CONSTRAINT_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema TABLE_CONSTRAINTS CONSTRAINT_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema TABLE_CONSTRAINTS CONSTRAINT_TYPE 6 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema TABLE_CONSTRAINTS TABLE_NAME 5 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema TABLE_CONSTRAINTS TABLE_SCHEMA 4 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema TABLE_PRIVILEGES GRANTEE 1 NO varchar 190 570 NULL NULL NULL utf8 utf8_general_ci varchar(190) select NEVER NULL -def information_schema TABLE_PRIVILEGES IS_GRANTABLE 6 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL -def information_schema TABLE_PRIVILEGES PRIVILEGE_TYPE 5 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema TABLE_PRIVILEGES TABLE_CATALOG 2 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL -def information_schema TABLE_PRIVILEGES TABLE_NAME 4 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema TABLE_PRIVILEGES TABLE_SCHEMA 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema TABLE_CONSTRAINTS CONSTRAINT_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL +def information_schema TABLE_CONSTRAINTS CONSTRAINT_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema TABLE_CONSTRAINTS CONSTRAINT_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema TABLE_CONSTRAINTS CONSTRAINT_TYPE 6 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema TABLE_CONSTRAINTS TABLE_NAME 5 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema TABLE_CONSTRAINTS TABLE_SCHEMA 4 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema TABLE_PRIVILEGES GRANTEE 1 '' NO varchar 190 570 NULL NULL NULL utf8 utf8_general_ci varchar(190) select NEVER NULL +def information_schema TABLE_PRIVILEGES IS_GRANTABLE 6 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL +def information_schema TABLE_PRIVILEGES PRIVILEGE_TYPE 5 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema TABLE_PRIVILEGES TABLE_CATALOG 2 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL +def information_schema TABLE_PRIVILEGES TABLE_NAME 4 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema TABLE_PRIVILEGES TABLE_SCHEMA 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema TABLE_STATISTICS ROWS_CHANGED 4 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL def information_schema TABLE_STATISTICS ROWS_CHANGED_X_INDEXES 5 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL def information_schema TABLE_STATISTICS ROWS_READ 3 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL -def information_schema TABLE_STATISTICS TABLE_NAME 2 NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) select NEVER NULL -def information_schema TABLE_STATISTICS TABLE_SCHEMA 1 NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) select NEVER NULL +def information_schema TABLE_STATISTICS TABLE_NAME 2 '' NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) select NEVER NULL +def information_schema TABLE_STATISTICS TABLE_SCHEMA 1 '' NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) select NEVER NULL def information_schema TRIGGERS ACTION_CONDITION 9 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext select NEVER NULL def information_schema TRIGGERS ACTION_ORDER 8 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(4) select NEVER NULL -def information_schema TRIGGERS ACTION_ORIENTATION 11 NO varchar 9 27 NULL NULL NULL utf8 utf8_general_ci varchar(9) select NEVER NULL -def information_schema TRIGGERS ACTION_REFERENCE_NEW_ROW 16 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL +def information_schema TRIGGERS ACTION_ORIENTATION 11 '' NO varchar 9 27 NULL NULL NULL utf8 utf8_general_ci varchar(9) select NEVER NULL +def information_schema TRIGGERS ACTION_REFERENCE_NEW_ROW 16 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL def information_schema TRIGGERS ACTION_REFERENCE_NEW_TABLE 14 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema TRIGGERS ACTION_REFERENCE_OLD_ROW 15 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL +def information_schema TRIGGERS ACTION_REFERENCE_OLD_ROW 15 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL def information_schema TRIGGERS ACTION_REFERENCE_OLD_TABLE 13 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema TRIGGERS ACTION_STATEMENT 10 NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext select NEVER NULL -def information_schema TRIGGERS ACTION_TIMING 12 NO varchar 6 18 NULL NULL NULL utf8 utf8_general_ci varchar(6) select NEVER NULL -def information_schema TRIGGERS CHARACTER_SET_CLIENT 20 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL -def information_schema TRIGGERS COLLATION_CONNECTION 21 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL +def information_schema TRIGGERS ACTION_STATEMENT 10 '' NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext select NEVER NULL +def information_schema TRIGGERS ACTION_TIMING 12 '' NO varchar 6 18 NULL NULL NULL utf8 utf8_general_ci varchar(6) select NEVER NULL +def information_schema TRIGGERS CHARACTER_SET_CLIENT 20 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL +def information_schema TRIGGERS COLLATION_CONNECTION 21 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL def information_schema TRIGGERS CREATED 17 NULL YES datetime NULL NULL NULL NULL 2 NULL NULL datetime(2) select NEVER NULL -def information_schema TRIGGERS DATABASE_COLLATION 22 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL -def information_schema TRIGGERS DEFINER 19 NO varchar 189 567 NULL NULL NULL utf8 utf8_general_ci varchar(189) select NEVER NULL -def information_schema TRIGGERS EVENT_MANIPULATION 4 NO varchar 6 18 NULL NULL NULL utf8 utf8_general_ci varchar(6) select NEVER NULL -def information_schema TRIGGERS EVENT_OBJECT_CATALOG 5 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL -def information_schema TRIGGERS EVENT_OBJECT_SCHEMA 6 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema TRIGGERS EVENT_OBJECT_TABLE 7 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema TRIGGERS SQL_MODE 18 NO varchar 8192 24576 NULL NULL NULL utf8 utf8_general_ci varchar(8192) select NEVER NULL -def information_schema TRIGGERS TRIGGER_CATALOG 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL -def information_schema TRIGGERS TRIGGER_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema TRIGGERS TRIGGER_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema USER_PRIVILEGES GRANTEE 1 NO varchar 190 570 NULL NULL NULL utf8 utf8_general_ci varchar(190) select NEVER NULL -def information_schema USER_PRIVILEGES IS_GRANTABLE 4 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL -def information_schema USER_PRIVILEGES PRIVILEGE_TYPE 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema USER_PRIVILEGES TABLE_CATALOG 2 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL +def information_schema TRIGGERS DATABASE_COLLATION 22 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL +def information_schema TRIGGERS DEFINER 19 '' NO varchar 189 567 NULL NULL NULL utf8 utf8_general_ci varchar(189) select NEVER NULL +def information_schema TRIGGERS EVENT_MANIPULATION 4 '' NO varchar 6 18 NULL NULL NULL utf8 utf8_general_ci varchar(6) select NEVER NULL +def information_schema TRIGGERS EVENT_OBJECT_CATALOG 5 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL +def information_schema TRIGGERS EVENT_OBJECT_SCHEMA 6 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema TRIGGERS EVENT_OBJECT_TABLE 7 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema TRIGGERS SQL_MODE 18 '' NO varchar 8192 24576 NULL NULL NULL utf8 utf8_general_ci varchar(8192) select NEVER NULL +def information_schema TRIGGERS TRIGGER_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL +def information_schema TRIGGERS TRIGGER_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema TRIGGERS TRIGGER_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema USER_PRIVILEGES GRANTEE 1 '' NO varchar 190 570 NULL NULL NULL utf8 utf8_general_ci varchar(190) select NEVER NULL +def information_schema USER_PRIVILEGES IS_GRANTABLE 4 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL +def information_schema USER_PRIVILEGES PRIVILEGE_TYPE 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema USER_PRIVILEGES TABLE_CATALOG 2 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL def information_schema USER_STATISTICS ACCESS_DENIED 22 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL def information_schema USER_STATISTICS BINLOG_BYTES_WRITTEN 9 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL def information_schema USER_STATISTICS BUSY_TIME 5 0 NO double NULL NULL 21 NULL NULL NULL NULL double select NEVER NULL @@ -458,18 +458,18 @@ def information_schema USER_STATISTICS SELECT_COMMANDS 15 0 NO bigint NULL NULL def information_schema USER_STATISTICS TOTAL_CONNECTIONS 2 0 NO int NULL NULL 10 0 NULL NULL NULL int(11) select NEVER NULL def information_schema USER_STATISTICS TOTAL_SSL_CONNECTIONS 24 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select NEVER NULL def information_schema USER_STATISTICS UPDATE_COMMANDS 16 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL -def information_schema USER_STATISTICS USER 1 NO varchar 128 384 NULL NULL NULL utf8 utf8_general_ci varchar(128) select NEVER NULL -def information_schema VIEWS ALGORITHM 11 NO varchar 10 30 NULL NULL NULL utf8 utf8_general_ci varchar(10) select NEVER NULL -def information_schema VIEWS CHARACTER_SET_CLIENT 9 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL -def information_schema VIEWS CHECK_OPTION 5 NO varchar 8 24 NULL NULL NULL utf8 utf8_general_ci varchar(8) select NEVER NULL -def information_schema VIEWS COLLATION_CONNECTION 10 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL -def information_schema VIEWS DEFINER 7 NO varchar 189 567 NULL NULL NULL utf8 utf8_general_ci varchar(189) select NEVER NULL -def information_schema VIEWS IS_UPDATABLE 6 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL -def information_schema VIEWS SECURITY_TYPE 8 NO varchar 7 21 NULL NULL NULL utf8 utf8_general_ci varchar(7) select NEVER NULL -def information_schema VIEWS TABLE_CATALOG 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL -def information_schema VIEWS TABLE_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema VIEWS TABLE_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL -def information_schema VIEWS VIEW_DEFINITION 4 NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext select NEVER NULL +def information_schema USER_STATISTICS USER 1 '' NO varchar 128 384 NULL NULL NULL utf8 utf8_general_ci varchar(128) select NEVER NULL +def information_schema VIEWS ALGORITHM 11 '' NO varchar 10 30 NULL NULL NULL utf8 utf8_general_ci varchar(10) select NEVER NULL +def information_schema VIEWS CHARACTER_SET_CLIENT 9 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL +def information_schema VIEWS CHECK_OPTION 5 '' NO varchar 8 24 NULL NULL NULL utf8 utf8_general_ci varchar(8) select NEVER NULL +def information_schema VIEWS COLLATION_CONNECTION 10 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL +def information_schema VIEWS DEFINER 7 '' NO varchar 189 567 NULL NULL NULL utf8 utf8_general_ci varchar(189) select NEVER NULL +def information_schema VIEWS IS_UPDATABLE 6 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) select NEVER NULL +def information_schema VIEWS SECURITY_TYPE 8 '' NO varchar 7 21 NULL NULL NULL utf8 utf8_general_ci varchar(7) select NEVER NULL +def information_schema VIEWS TABLE_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL +def information_schema VIEWS TABLE_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema VIEWS TABLE_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL +def information_schema VIEWS VIEW_DEFINITION 4 '' NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext select NEVER NULL ########################################################################## # Show the quotient of CHARACTER_OCTET_LENGTH and CHARACTER_MAXIMUM_LENGTH ########################################################################## diff --git a/mysql-test/suite/funcs_1/r/is_columns_is_embedded.result b/mysql-test/suite/funcs_1/r/is_columns_is_embedded.result index 68bdb8cdea0..4e12db06817 100644 --- a/mysql-test/suite/funcs_1/r/is_columns_is_embedded.result +++ b/mysql-test/suite/funcs_1/r/is_columns_is_embedded.result @@ -3,33 +3,33 @@ WHERE table_schema = 'information_schema' AND table_name <> 'profiling' AND table_name not like 'innodb_%' ORDER BY table_schema, table_name, column_name; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION COLUMN_DEFAULT IS_NULLABLE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE DATETIME_PRECISION CHARACTER_SET_NAME COLLATION_NAME COLUMN_TYPE COLUMN_KEY EXTRA PRIVILEGES COLUMN_COMMENT IS_GENERATED GENERATION_EXPRESSION -def information_schema ALL_PLUGINS LOAD_OPTION 11 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema ALL_PLUGINS LOAD_OPTION 11 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema ALL_PLUGINS PLUGIN_AUTHOR 8 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema ALL_PLUGINS PLUGIN_AUTH_VERSION 13 NULL YES varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) NEVER NULL def information_schema ALL_PLUGINS PLUGIN_DESCRIPTION 9 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext NEVER NULL def information_schema ALL_PLUGINS PLUGIN_LIBRARY 6 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema ALL_PLUGINS PLUGIN_LIBRARY_VERSION 7 NULL YES varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) NEVER NULL -def information_schema ALL_PLUGINS PLUGIN_LICENSE 10 NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) NEVER NULL -def information_schema ALL_PLUGINS PLUGIN_MATURITY 12 NO varchar 12 36 NULL NULL NULL utf8 utf8_general_ci varchar(12) NEVER NULL -def information_schema ALL_PLUGINS PLUGIN_NAME 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema ALL_PLUGINS PLUGIN_STATUS 3 NO varchar 16 48 NULL NULL NULL utf8 utf8_general_ci varchar(16) NEVER NULL -def information_schema ALL_PLUGINS PLUGIN_TYPE 4 NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) NEVER NULL -def information_schema ALL_PLUGINS PLUGIN_TYPE_VERSION 5 NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) NEVER NULL -def information_schema ALL_PLUGINS PLUGIN_VERSION 2 NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) NEVER NULL -def information_schema APPLICABLE_ROLES GRANTEE 1 NO varchar 190 570 NULL NULL NULL utf8 utf8_general_ci varchar(190) NEVER NULL +def information_schema ALL_PLUGINS PLUGIN_LICENSE 10 '' NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) NEVER NULL +def information_schema ALL_PLUGINS PLUGIN_MATURITY 12 '' NO varchar 12 36 NULL NULL NULL utf8 utf8_general_ci varchar(12) NEVER NULL +def information_schema ALL_PLUGINS PLUGIN_NAME 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema ALL_PLUGINS PLUGIN_STATUS 3 '' NO varchar 16 48 NULL NULL NULL utf8 utf8_general_ci varchar(16) NEVER NULL +def information_schema ALL_PLUGINS PLUGIN_TYPE 4 '' NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) NEVER NULL +def information_schema ALL_PLUGINS PLUGIN_TYPE_VERSION 5 '' NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) NEVER NULL +def information_schema ALL_PLUGINS PLUGIN_VERSION 2 '' NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) NEVER NULL +def information_schema APPLICABLE_ROLES GRANTEE 1 '' NO varchar 190 570 NULL NULL NULL utf8 utf8_general_ci varchar(190) NEVER NULL def information_schema APPLICABLE_ROLES IS_DEFAULT 4 NULL YES varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL -def information_schema APPLICABLE_ROLES IS_GRANTABLE 3 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL -def information_schema APPLICABLE_ROLES ROLE_NAME 2 NO varchar 128 384 NULL NULL NULL utf8 utf8_general_ci varchar(128) NEVER NULL -def information_schema CHARACTER_SETS CHARACTER_SET_NAME 1 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL -def information_schema CHARACTER_SETS DEFAULT_COLLATE_NAME 2 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL -def information_schema CHARACTER_SETS DESCRIPTION 3 NO varchar 60 180 NULL NULL NULL utf8 utf8_general_ci varchar(60) NEVER NULL +def information_schema APPLICABLE_ROLES IS_GRANTABLE 3 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL +def information_schema APPLICABLE_ROLES ROLE_NAME 2 '' NO varchar 128 384 NULL NULL NULL utf8 utf8_general_ci varchar(128) NEVER NULL +def information_schema CHARACTER_SETS CHARACTER_SET_NAME 1 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL +def information_schema CHARACTER_SETS DEFAULT_COLLATE_NAME 2 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL +def information_schema CHARACTER_SETS DESCRIPTION 3 '' NO varchar 60 180 NULL NULL NULL utf8 utf8_general_ci varchar(60) NEVER NULL def information_schema CHARACTER_SETS MAXLEN 4 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(3) NEVER NULL def information_schema CLIENT_STATISTICS ACCESS_DENIED 22 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL def information_schema CLIENT_STATISTICS BINLOG_BYTES_WRITTEN 9 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL def information_schema CLIENT_STATISTICS BUSY_TIME 5 0 NO double NULL NULL 21 NULL NULL NULL NULL double NEVER NULL def information_schema CLIENT_STATISTICS BYTES_RECEIVED 7 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL def information_schema CLIENT_STATISTICS BYTES_SENT 8 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL -def information_schema CLIENT_STATISTICS CLIENT 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema CLIENT_STATISTICS CLIENT 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema CLIENT_STATISTICS COMMIT_TRANSACTIONS 18 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL def information_schema CLIENT_STATISTICS CONCURRENT_CONNECTIONS 3 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL def information_schema CLIENT_STATISTICS CONNECTED_TIME 4 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL @@ -49,74 +49,74 @@ def information_schema CLIENT_STATISTICS SELECT_COMMANDS 15 0 NO bigint NULL NUL def information_schema CLIENT_STATISTICS TOTAL_CONNECTIONS 2 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL def information_schema CLIENT_STATISTICS TOTAL_SSL_CONNECTIONS 24 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema CLIENT_STATISTICS UPDATE_COMMANDS 16 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL -def information_schema COLLATIONS CHARACTER_SET_NAME 2 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL -def information_schema COLLATIONS COLLATION_NAME 1 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL +def information_schema COLLATIONS CHARACTER_SET_NAME 2 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL +def information_schema COLLATIONS COLLATION_NAME 1 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL def information_schema COLLATIONS ID 3 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(11) NEVER NULL -def information_schema COLLATIONS IS_COMPILED 5 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL -def information_schema COLLATIONS IS_DEFAULT 4 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL +def information_schema COLLATIONS IS_COMPILED 5 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL +def information_schema COLLATIONS IS_DEFAULT 4 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL def information_schema COLLATIONS SORTLEN 6 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(3) NEVER NULL -def information_schema COLLATION_CHARACTER_SET_APPLICABILITY CHARACTER_SET_NAME 2 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL -def information_schema COLLATION_CHARACTER_SET_APPLICABILITY COLLATION_NAME 1 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL +def information_schema COLLATION_CHARACTER_SET_APPLICABILITY CHARACTER_SET_NAME 2 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL +def information_schema COLLATION_CHARACTER_SET_APPLICABILITY COLLATION_NAME 1 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL def information_schema COLUMNS CHARACTER_MAXIMUM_LENGTH 9 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema COLUMNS CHARACTER_OCTET_LENGTH 10 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema COLUMNS CHARACTER_SET_NAME 14 NULL YES varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL def information_schema COLUMNS COLLATION_NAME 15 NULL YES varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL -def information_schema COLUMNS COLUMN_COMMENT 20 NO varchar 1024 3072 NULL NULL NULL utf8 utf8_general_ci varchar(1024) NEVER NULL +def information_schema COLUMNS COLUMN_COMMENT 20 '' NO varchar 1024 3072 NULL NULL NULL utf8 utf8_general_ci varchar(1024) NEVER NULL def information_schema COLUMNS COLUMN_DEFAULT 6 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext NEVER NULL -def information_schema COLUMNS COLUMN_KEY 17 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL -def information_schema COLUMNS COLUMN_NAME 4 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema COLUMNS COLUMN_TYPE 16 NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext NEVER NULL -def information_schema COLUMNS DATA_TYPE 8 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema COLUMNS COLUMN_KEY 17 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL +def information_schema COLUMNS COLUMN_NAME 4 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema COLUMNS COLUMN_TYPE 16 '' NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext NEVER NULL +def information_schema COLUMNS DATA_TYPE 8 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema COLUMNS DATETIME_PRECISION 13 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL -def information_schema COLUMNS EXTRA 18 NO varchar 30 90 NULL NULL NULL utf8 utf8_general_ci varchar(30) NEVER NULL +def information_schema COLUMNS EXTRA 18 '' NO varchar 30 90 NULL NULL NULL utf8 utf8_general_ci varchar(30) NEVER NULL def information_schema COLUMNS GENERATION_EXPRESSION 22 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext NEVER NULL -def information_schema COLUMNS IS_GENERATED 21 NO varchar 6 18 NULL NULL NULL utf8 utf8_general_ci varchar(6) NEVER NULL -def information_schema COLUMNS IS_NULLABLE 7 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL +def information_schema COLUMNS IS_GENERATED 21 '' NO varchar 6 18 NULL NULL NULL utf8 utf8_general_ci varchar(6) NEVER NULL +def information_schema COLUMNS IS_NULLABLE 7 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL def information_schema COLUMNS NUMERIC_PRECISION 11 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema COLUMNS NUMERIC_SCALE 12 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema COLUMNS ORDINAL_POSITION 5 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL -def information_schema COLUMNS PRIVILEGES 19 NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) NEVER NULL -def information_schema COLUMNS TABLE_CATALOG 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL -def information_schema COLUMNS TABLE_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema COLUMNS TABLE_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema COLUMN_PRIVILEGES COLUMN_NAME 5 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema COLUMN_PRIVILEGES GRANTEE 1 NO varchar 190 570 NULL NULL NULL utf8 utf8_general_ci varchar(190) NEVER NULL -def information_schema COLUMN_PRIVILEGES IS_GRANTABLE 7 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL -def information_schema COLUMN_PRIVILEGES PRIVILEGE_TYPE 6 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema COLUMN_PRIVILEGES TABLE_CATALOG 2 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL -def information_schema COLUMN_PRIVILEGES TABLE_NAME 4 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema COLUMN_PRIVILEGES TABLE_SCHEMA 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema COLUMNS PRIVILEGES 19 '' NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) NEVER NULL +def information_schema COLUMNS TABLE_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL +def information_schema COLUMNS TABLE_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema COLUMNS TABLE_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema COLUMN_PRIVILEGES COLUMN_NAME 5 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema COLUMN_PRIVILEGES GRANTEE 1 '' NO varchar 190 570 NULL NULL NULL utf8 utf8_general_ci varchar(190) NEVER NULL +def information_schema COLUMN_PRIVILEGES IS_GRANTABLE 7 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL +def information_schema COLUMN_PRIVILEGES PRIVILEGE_TYPE 6 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema COLUMN_PRIVILEGES TABLE_CATALOG 2 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL +def information_schema COLUMN_PRIVILEGES TABLE_NAME 4 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema COLUMN_PRIVILEGES TABLE_SCHEMA 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema ENABLED_ROLES ROLE_NAME 1 NULL YES varchar 128 384 NULL NULL NULL utf8 utf8_general_ci varchar(128) NEVER NULL -def information_schema ENGINES COMMENT 3 NO varchar 160 480 NULL NULL NULL utf8 utf8_general_ci varchar(160) NEVER NULL -def information_schema ENGINES ENGINE 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema ENGINES COMMENT 3 '' NO varchar 160 480 NULL NULL NULL utf8 utf8_general_ci varchar(160) NEVER NULL +def information_schema ENGINES ENGINE 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema ENGINES SAVEPOINTS 6 NULL YES varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL -def information_schema ENGINES SUPPORT 2 NO varchar 8 24 NULL NULL NULL utf8 utf8_general_ci varchar(8) NEVER NULL +def information_schema ENGINES SUPPORT 2 '' NO varchar 8 24 NULL NULL NULL utf8 utf8_general_ci varchar(8) NEVER NULL def information_schema ENGINES TRANSACTIONS 4 NULL YES varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL def information_schema ENGINES XA 5 NULL YES varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL -def information_schema EVENTS CHARACTER_SET_CLIENT 22 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL -def information_schema EVENTS COLLATION_CONNECTION 23 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL -def information_schema EVENTS CREATED 17 0000-00-00 00:00:00 NO datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL -def information_schema EVENTS DATABASE_COLLATION 24 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL -def information_schema EVENTS DEFINER 4 NO varchar 189 567 NULL NULL NULL utf8 utf8_general_ci varchar(189) NEVER NULL +def information_schema EVENTS CHARACTER_SET_CLIENT 22 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL +def information_schema EVENTS COLLATION_CONNECTION 23 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL +def information_schema EVENTS CREATED 17 '0000-00-00 00:00:00' NO datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL +def information_schema EVENTS DATABASE_COLLATION 24 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL +def information_schema EVENTS DEFINER 4 '' NO varchar 189 567 NULL NULL NULL utf8 utf8_general_ci varchar(189) NEVER NULL def information_schema EVENTS ENDS 14 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL -def information_schema EVENTS EVENT_BODY 6 NO varchar 8 24 NULL NULL NULL utf8 utf8_general_ci varchar(8) NEVER NULL -def information_schema EVENTS EVENT_CATALOG 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema EVENTS EVENT_COMMENT 20 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema EVENTS EVENT_DEFINITION 7 NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext NEVER NULL -def information_schema EVENTS EVENT_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema EVENTS EVENT_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema EVENTS EVENT_TYPE 8 NO varchar 9 27 NULL NULL NULL utf8 utf8_general_ci varchar(9) NEVER NULL +def information_schema EVENTS EVENT_BODY 6 '' NO varchar 8 24 NULL NULL NULL utf8 utf8_general_ci varchar(8) NEVER NULL +def information_schema EVENTS EVENT_CATALOG 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema EVENTS EVENT_COMMENT 20 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema EVENTS EVENT_DEFINITION 7 '' NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext NEVER NULL +def information_schema EVENTS EVENT_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema EVENTS EVENT_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema EVENTS EVENT_TYPE 8 '' NO varchar 9 27 NULL NULL NULL utf8 utf8_general_ci varchar(9) NEVER NULL def information_schema EVENTS EXECUTE_AT 9 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL def information_schema EVENTS INTERVAL_FIELD 11 NULL YES varchar 18 54 NULL NULL NULL utf8 utf8_general_ci varchar(18) NEVER NULL def information_schema EVENTS INTERVAL_VALUE 10 NULL YES varchar 256 768 NULL NULL NULL utf8 utf8_general_ci varchar(256) NEVER NULL -def information_schema EVENTS LAST_ALTERED 18 0000-00-00 00:00:00 NO datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL +def information_schema EVENTS LAST_ALTERED 18 '0000-00-00 00:00:00' NO datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL def information_schema EVENTS LAST_EXECUTED 19 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL -def information_schema EVENTS ON_COMPLETION 16 NO varchar 12 36 NULL NULL NULL utf8 utf8_general_ci varchar(12) NEVER NULL +def information_schema EVENTS ON_COMPLETION 16 '' NO varchar 12 36 NULL NULL NULL utf8 utf8_general_ci varchar(12) NEVER NULL def information_schema EVENTS ORIGINATOR 21 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(10) NEVER NULL -def information_schema EVENTS SQL_MODE 12 NO varchar 8192 24576 NULL NULL NULL utf8 utf8_general_ci varchar(8192) NEVER NULL +def information_schema EVENTS SQL_MODE 12 '' NO varchar 8192 24576 NULL NULL NULL utf8 utf8_general_ci varchar(8192) NEVER NULL def information_schema EVENTS STARTS 13 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL -def information_schema EVENTS STATUS 15 NO varchar 18 54 NULL NULL NULL utf8 utf8_general_ci varchar(18) NEVER NULL -def information_schema EVENTS TIME_ZONE 5 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema EVENTS STATUS 15 '' NO varchar 18 54 NULL NULL NULL utf8 utf8_general_ci varchar(18) NEVER NULL +def information_schema EVENTS TIME_ZONE 5 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema FILES AUTOEXTEND_SIZE 19 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema FILES AVG_ROW_LENGTH 28 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema FILES CHECKSUM 36 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL @@ -126,12 +126,12 @@ def information_schema FILES CREATION_TIME 20 NULL YES datetime NULL NULL NULL N def information_schema FILES DATA_FREE 32 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema FILES DATA_LENGTH 29 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema FILES DELETED_ROWS 12 NULL YES bigint NULL NULL 19 0 NULL NULL NULL bigint(4) NEVER NULL -def information_schema FILES ENGINE 10 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema FILES ENGINE 10 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema FILES EXTENT_SIZE 16 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(4) NEVER NULL def information_schema FILES EXTRA 38 NULL YES varchar 255 765 NULL NULL NULL utf8 utf8_general_ci varchar(255) NEVER NULL def information_schema FILES FILE_ID 1 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(4) NEVER NULL def information_schema FILES FILE_NAME 2 NULL YES varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL -def information_schema FILES FILE_TYPE 3 NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) NEVER NULL +def information_schema FILES FILE_TYPE 3 '' NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) NEVER NULL def information_schema FILES FREE_EXTENTS 14 NULL YES bigint NULL NULL 19 0 NULL NULL NULL bigint(4) NEVER NULL def information_schema FILES FULLTEXT_KEYS 11 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema FILES INDEX_LENGTH 31 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL @@ -144,9 +144,9 @@ def information_schema FILES MAXIMUM_SIZE 18 NULL YES bigint NULL NULL 20 0 NULL def information_schema FILES MAX_DATA_LENGTH 30 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema FILES RECOVER_TIME 23 NULL YES bigint NULL NULL 19 0 NULL NULL NULL bigint(4) NEVER NULL def information_schema FILES ROW_FORMAT 26 NULL YES varchar 10 30 NULL NULL NULL utf8 utf8_general_ci varchar(10) NEVER NULL -def information_schema FILES STATUS 37 NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) NEVER NULL +def information_schema FILES STATUS 37 '' NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) NEVER NULL def information_schema FILES TABLESPACE_NAME 4 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema FILES TABLE_CATALOG 5 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema FILES TABLE_CATALOG 5 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema FILES TABLE_NAME 7 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema FILES TABLE_ROWS 27 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema FILES TABLE_SCHEMA 6 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL @@ -156,30 +156,30 @@ def information_schema FILES UPDATE_COUNT 13 NULL YES bigint NULL NULL 19 0 NULL def information_schema FILES UPDATE_TIME 34 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL def information_schema FILES VERSION 25 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema GEOMETRY_COLUMNS COORD_DIMENSION 11 0 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(2) NEVER NULL -def information_schema GEOMETRY_COLUMNS F_GEOMETRY_COLUMN 4 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema GEOMETRY_COLUMNS F_TABLE_CATALOG 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL -def information_schema GEOMETRY_COLUMNS F_TABLE_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema GEOMETRY_COLUMNS F_TABLE_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema GEOMETRY_COLUMNS F_GEOMETRY_COLUMN 4 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema GEOMETRY_COLUMNS F_TABLE_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL +def information_schema GEOMETRY_COLUMNS F_TABLE_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema GEOMETRY_COLUMNS F_TABLE_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema GEOMETRY_COLUMNS GEOMETRY_TYPE 10 0 NO int NULL NULL 10 0 NULL NULL NULL int(7) NEVER NULL -def information_schema GEOMETRY_COLUMNS G_GEOMETRY_COLUMN 8 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema GEOMETRY_COLUMNS G_TABLE_CATALOG 5 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL -def information_schema GEOMETRY_COLUMNS G_TABLE_NAME 7 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema GEOMETRY_COLUMNS G_TABLE_SCHEMA 6 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema GEOMETRY_COLUMNS G_GEOMETRY_COLUMN 8 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema GEOMETRY_COLUMNS G_TABLE_CATALOG 5 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL +def information_schema GEOMETRY_COLUMNS G_TABLE_NAME 7 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema GEOMETRY_COLUMNS G_TABLE_SCHEMA 6 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema GEOMETRY_COLUMNS MAX_PPR 12 0 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(2) NEVER NULL def information_schema GEOMETRY_COLUMNS SRID 13 0 NO smallint NULL NULL 5 0 NULL NULL NULL smallint(5) NEVER NULL def information_schema GEOMETRY_COLUMNS STORAGE_TYPE 9 0 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(2) NEVER NULL -def information_schema GLOBAL_STATUS VARIABLE_NAME 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema GLOBAL_STATUS VARIABLE_VALUE 2 NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) NEVER NULL -def information_schema GLOBAL_VARIABLES VARIABLE_NAME 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema GLOBAL_VARIABLES VARIABLE_VALUE 2 NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) NEVER NULL -def information_schema INDEX_STATISTICS INDEX_NAME 3 NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) NEVER NULL +def information_schema GLOBAL_STATUS VARIABLE_NAME 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema GLOBAL_STATUS VARIABLE_VALUE 2 '' NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) NEVER NULL +def information_schema GLOBAL_VARIABLES VARIABLE_NAME 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema GLOBAL_VARIABLES VARIABLE_VALUE 2 '' NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) NEVER NULL +def information_schema INDEX_STATISTICS INDEX_NAME 3 '' NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) NEVER NULL def information_schema INDEX_STATISTICS ROWS_READ 4 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL -def information_schema INDEX_STATISTICS TABLE_NAME 2 NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) NEVER NULL -def information_schema INDEX_STATISTICS TABLE_SCHEMA 1 NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) NEVER NULL +def information_schema INDEX_STATISTICS TABLE_NAME 2 '' NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) NEVER NULL +def information_schema INDEX_STATISTICS TABLE_SCHEMA 1 '' NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) NEVER NULL def information_schema KEY_CACHES BLOCK_SIZE 5 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema KEY_CACHES DIRTY_BLOCKS 8 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema KEY_CACHES FULL_SIZE 4 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL -def information_schema KEY_CACHES KEY_CACHE_NAME 1 NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) NEVER NULL +def information_schema KEY_CACHES KEY_CACHE_NAME 1 '' NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) NEVER NULL def information_schema KEY_CACHES READS 10 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema KEY_CACHES READ_REQUESTS 9 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema KEY_CACHES SEGMENTS 2 NULL YES int NULL NULL 10 0 NULL NULL NULL int(3) unsigned NEVER NULL @@ -188,34 +188,34 @@ def information_schema KEY_CACHES UNUSED_BLOCKS 7 0 NO bigint NULL NULL 20 0 NUL def information_schema KEY_CACHES USED_BLOCKS 6 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema KEY_CACHES WRITES 12 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema KEY_CACHES WRITE_REQUESTS 11 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL -def information_schema KEY_COLUMN_USAGE COLUMN_NAME 7 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema KEY_COLUMN_USAGE CONSTRAINT_CATALOG 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL -def information_schema KEY_COLUMN_USAGE CONSTRAINT_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema KEY_COLUMN_USAGE CONSTRAINT_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema KEY_COLUMN_USAGE COLUMN_NAME 7 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema KEY_COLUMN_USAGE CONSTRAINT_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL +def information_schema KEY_COLUMN_USAGE CONSTRAINT_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema KEY_COLUMN_USAGE CONSTRAINT_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema KEY_COLUMN_USAGE ORDINAL_POSITION 8 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(10) NEVER NULL def information_schema KEY_COLUMN_USAGE POSITION_IN_UNIQUE_CONSTRAINT 9 NULL YES bigint NULL NULL 19 0 NULL NULL NULL bigint(10) NEVER NULL def information_schema KEY_COLUMN_USAGE REFERENCED_COLUMN_NAME 12 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema KEY_COLUMN_USAGE REFERENCED_TABLE_NAME 11 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema KEY_COLUMN_USAGE REFERENCED_TABLE_SCHEMA 10 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema KEY_COLUMN_USAGE TABLE_CATALOG 4 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL -def information_schema KEY_COLUMN_USAGE TABLE_NAME 6 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema KEY_COLUMN_USAGE TABLE_SCHEMA 5 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema KEY_COLUMN_USAGE TABLE_CATALOG 4 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL +def information_schema KEY_COLUMN_USAGE TABLE_NAME 6 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema KEY_COLUMN_USAGE TABLE_SCHEMA 5 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema PARAMETERS CHARACTER_MAXIMUM_LENGTH 8 NULL YES int NULL NULL 10 0 NULL NULL NULL int(21) NEVER NULL def information_schema PARAMETERS CHARACTER_OCTET_LENGTH 9 NULL YES int NULL NULL 10 0 NULL NULL NULL int(21) NEVER NULL def information_schema PARAMETERS CHARACTER_SET_NAME 13 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema PARAMETERS COLLATION_NAME 14 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema PARAMETERS DATA_TYPE 7 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema PARAMETERS DATA_TYPE 7 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema PARAMETERS DATETIME_PRECISION 12 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL -def information_schema PARAMETERS DTD_IDENTIFIER 15 NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext NEVER NULL +def information_schema PARAMETERS DTD_IDENTIFIER 15 '' NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext NEVER NULL def information_schema PARAMETERS NUMERIC_PRECISION 10 NULL YES int NULL NULL 10 0 NULL NULL NULL int(21) NEVER NULL def information_schema PARAMETERS NUMERIC_SCALE 11 NULL YES int NULL NULL 10 0 NULL NULL NULL int(21) NEVER NULL def information_schema PARAMETERS ORDINAL_POSITION 4 0 NO int NULL NULL 10 0 NULL NULL NULL int(21) NEVER NULL def information_schema PARAMETERS PARAMETER_MODE 5 NULL YES varchar 5 15 NULL NULL NULL utf8 utf8_general_ci varchar(5) NEVER NULL def information_schema PARAMETERS PARAMETER_NAME 6 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema PARAMETERS ROUTINE_TYPE 16 NO varchar 9 27 NULL NULL NULL utf8 utf8_general_ci varchar(9) NEVER NULL -def information_schema PARAMETERS SPECIFIC_CATALOG 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL -def information_schema PARAMETERS SPECIFIC_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema PARAMETERS SPECIFIC_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema PARAMETERS ROUTINE_TYPE 16 '' NO varchar 9 27 NULL NULL NULL utf8 utf8_general_ci varchar(9) NEVER NULL +def information_schema PARAMETERS SPECIFIC_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL +def information_schema PARAMETERS SPECIFIC_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema PARAMETERS SPECIFIC_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema PARTITIONS AVG_ROW_LENGTH 14 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema PARTITIONS CHECKSUM 22 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema PARTITIONS CHECK_TIME 21 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL @@ -224,8 +224,8 @@ def information_schema PARTITIONS DATA_FREE 18 0 NO bigint NULL NULL 20 0 NULL N def information_schema PARTITIONS DATA_LENGTH 15 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema PARTITIONS INDEX_LENGTH 17 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema PARTITIONS MAX_DATA_LENGTH 16 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL -def information_schema PARTITIONS NODEGROUP 24 NO varchar 12 36 NULL NULL NULL utf8 utf8_general_ci varchar(12) NEVER NULL -def information_schema PARTITIONS PARTITION_COMMENT 23 NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) NEVER NULL +def information_schema PARTITIONS NODEGROUP 24 '' NO varchar 12 36 NULL NULL NULL utf8 utf8_general_ci varchar(12) NEVER NULL +def information_schema PARTITIONS PARTITION_COMMENT 23 '' NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) NEVER NULL def information_schema PARTITIONS PARTITION_DESCRIPTION 12 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext NEVER NULL def information_schema PARTITIONS PARTITION_EXPRESSION 10 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext NEVER NULL def information_schema PARTITIONS PARTITION_METHOD 8 NULL YES varchar 18 54 NULL NULL NULL utf8 utf8_general_ci varchar(18) NEVER NULL @@ -236,28 +236,28 @@ def information_schema PARTITIONS SUBPARTITION_METHOD 9 NULL YES varchar 12 36 N def information_schema PARTITIONS SUBPARTITION_NAME 5 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema PARTITIONS SUBPARTITION_ORDINAL_POSITION 7 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema PARTITIONS TABLESPACE_NAME 25 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema PARTITIONS TABLE_CATALOG 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL -def information_schema PARTITIONS TABLE_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema PARTITIONS TABLE_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL +def information_schema PARTITIONS TABLE_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema PARTITIONS TABLE_ROWS 13 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL -def information_schema PARTITIONS TABLE_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema PARTITIONS TABLE_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema PARTITIONS UPDATE_TIME 20 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL -def information_schema PLUGINS LOAD_OPTION 11 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema PLUGINS LOAD_OPTION 11 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema PLUGINS PLUGIN_AUTHOR 8 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema PLUGINS PLUGIN_AUTH_VERSION 13 NULL YES varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) NEVER NULL def information_schema PLUGINS PLUGIN_DESCRIPTION 9 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext NEVER NULL def information_schema PLUGINS PLUGIN_LIBRARY 6 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema PLUGINS PLUGIN_LIBRARY_VERSION 7 NULL YES varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) NEVER NULL -def information_schema PLUGINS PLUGIN_LICENSE 10 NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) NEVER NULL -def information_schema PLUGINS PLUGIN_MATURITY 12 NO varchar 12 36 NULL NULL NULL utf8 utf8_general_ci varchar(12) NEVER NULL -def information_schema PLUGINS PLUGIN_NAME 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema PLUGINS PLUGIN_STATUS 3 NO varchar 16 48 NULL NULL NULL utf8 utf8_general_ci varchar(16) NEVER NULL -def information_schema PLUGINS PLUGIN_TYPE 4 NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) NEVER NULL -def information_schema PLUGINS PLUGIN_TYPE_VERSION 5 NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) NEVER NULL -def information_schema PLUGINS PLUGIN_VERSION 2 NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) NEVER NULL -def information_schema PROCESSLIST COMMAND 5 NO varchar 16 48 NULL NULL NULL utf8 utf8_general_ci varchar(16) NEVER NULL +def information_schema PLUGINS PLUGIN_LICENSE 10 '' NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) NEVER NULL +def information_schema PLUGINS PLUGIN_MATURITY 12 '' NO varchar 12 36 NULL NULL NULL utf8 utf8_general_ci varchar(12) NEVER NULL +def information_schema PLUGINS PLUGIN_NAME 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema PLUGINS PLUGIN_STATUS 3 '' NO varchar 16 48 NULL NULL NULL utf8 utf8_general_ci varchar(16) NEVER NULL +def information_schema PLUGINS PLUGIN_TYPE 4 '' NO varchar 80 240 NULL NULL NULL utf8 utf8_general_ci varchar(80) NEVER NULL +def information_schema PLUGINS PLUGIN_TYPE_VERSION 5 '' NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) NEVER NULL +def information_schema PLUGINS PLUGIN_VERSION 2 '' NO varchar 20 60 NULL NULL NULL utf8 utf8_general_ci varchar(20) NEVER NULL +def information_schema PROCESSLIST COMMAND 5 '' NO varchar 16 48 NULL NULL NULL utf8 utf8_general_ci varchar(16) NEVER NULL def information_schema PROCESSLIST DB 4 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema PROCESSLIST EXAMINED_ROWS 14 0 NO int NULL NULL 10 0 NULL NULL NULL int(7) NEVER NULL -def information_schema PROCESSLIST HOST 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema PROCESSLIST HOST 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema PROCESSLIST ID 1 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(4) NEVER NULL def information_schema PROCESSLIST INFO 8 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext NEVER NULL def information_schema PROCESSLIST INFO_BINARY 16 NULL YES blob 65535 65535 NULL NULL NULL NULL NULL blob NEVER NULL @@ -270,97 +270,97 @@ def information_schema PROCESSLIST STATE 7 NULL YES varchar 64 192 NULL NULL NUL def information_schema PROCESSLIST TID 17 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(4) NEVER NULL def information_schema PROCESSLIST TIME 6 0 NO int NULL NULL 10 0 NULL NULL NULL int(7) NEVER NULL def information_schema PROCESSLIST TIME_MS 9 0.000 NO decimal NULL NULL 22 3 NULL NULL NULL decimal(22,3) NEVER NULL -def information_schema PROCESSLIST USER 2 NO varchar 128 384 NULL NULL NULL utf8 utf8_general_ci varchar(128) NEVER NULL -def information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_CATALOG 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL -def information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema REFERENTIAL_CONSTRAINTS DELETE_RULE 9 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema REFERENTIAL_CONSTRAINTS MATCH_OPTION 7 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema REFERENTIAL_CONSTRAINTS REFERENCED_TABLE_NAME 11 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema REFERENTIAL_CONSTRAINTS TABLE_NAME 10 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema REFERENTIAL_CONSTRAINTS UNIQUE_CONSTRAINT_CATALOG 4 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL +def information_schema PROCESSLIST USER 2 '' NO varchar 128 384 NULL NULL NULL utf8 utf8_general_ci varchar(128) NEVER NULL +def information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL +def information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema REFERENTIAL_CONSTRAINTS DELETE_RULE 9 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema REFERENTIAL_CONSTRAINTS MATCH_OPTION 7 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema REFERENTIAL_CONSTRAINTS REFERENCED_TABLE_NAME 11 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema REFERENTIAL_CONSTRAINTS TABLE_NAME 10 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema REFERENTIAL_CONSTRAINTS UNIQUE_CONSTRAINT_CATALOG 4 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL def information_schema REFERENTIAL_CONSTRAINTS UNIQUE_CONSTRAINT_NAME 6 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema REFERENTIAL_CONSTRAINTS UNIQUE_CONSTRAINT_SCHEMA 5 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema REFERENTIAL_CONSTRAINTS UPDATE_RULE 8 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema REFERENTIAL_CONSTRAINTS UNIQUE_CONSTRAINT_SCHEMA 5 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema REFERENTIAL_CONSTRAINTS UPDATE_RULE 8 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema ROUTINES CHARACTER_MAXIMUM_LENGTH 7 NULL YES int NULL NULL 10 0 NULL NULL NULL int(21) NEVER NULL def information_schema ROUTINES CHARACTER_OCTET_LENGTH 8 NULL YES int NULL NULL 10 0 NULL NULL NULL int(21) NEVER NULL -def information_schema ROUTINES CHARACTER_SET_CLIENT 29 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL +def information_schema ROUTINES CHARACTER_SET_CLIENT 29 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL def information_schema ROUTINES CHARACTER_SET_NAME 12 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema ROUTINES COLLATION_CONNECTION 30 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL +def information_schema ROUTINES COLLATION_CONNECTION 30 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL def information_schema ROUTINES COLLATION_NAME 13 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema ROUTINES CREATED 24 0000-00-00 00:00:00 NO datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL -def information_schema ROUTINES DATABASE_COLLATION 31 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL -def information_schema ROUTINES DATA_TYPE 6 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema ROUTINES CREATED 24 '0000-00-00 00:00:00' NO datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL +def information_schema ROUTINES DATABASE_COLLATION 31 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL +def information_schema ROUTINES DATA_TYPE 6 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema ROUTINES DATETIME_PRECISION 11 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL -def information_schema ROUTINES DEFINER 28 NO varchar 189 567 NULL NULL NULL utf8 utf8_general_ci varchar(189) NEVER NULL +def information_schema ROUTINES DEFINER 28 '' NO varchar 189 567 NULL NULL NULL utf8 utf8_general_ci varchar(189) NEVER NULL def information_schema ROUTINES DTD_IDENTIFIER 14 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext NEVER NULL def information_schema ROUTINES EXTERNAL_LANGUAGE 18 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema ROUTINES EXTERNAL_NAME 17 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema ROUTINES IS_DETERMINISTIC 20 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL -def information_schema ROUTINES LAST_ALTERED 25 0000-00-00 00:00:00 NO datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL +def information_schema ROUTINES IS_DETERMINISTIC 20 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL +def information_schema ROUTINES LAST_ALTERED 25 '0000-00-00 00:00:00' NO datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL def information_schema ROUTINES NUMERIC_PRECISION 9 NULL YES int NULL NULL 10 0 NULL NULL NULL int(21) NEVER NULL def information_schema ROUTINES NUMERIC_SCALE 10 NULL YES int NULL NULL 10 0 NULL NULL NULL int(21) NEVER NULL -def information_schema ROUTINES PARAMETER_STYLE 19 NO varchar 8 24 NULL NULL NULL utf8 utf8_general_ci varchar(8) NEVER NULL -def information_schema ROUTINES ROUTINE_BODY 15 NO varchar 8 24 NULL NULL NULL utf8 utf8_general_ci varchar(8) NEVER NULL -def information_schema ROUTINES ROUTINE_CATALOG 2 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL -def information_schema ROUTINES ROUTINE_COMMENT 27 NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext NEVER NULL +def information_schema ROUTINES PARAMETER_STYLE 19 '' NO varchar 8 24 NULL NULL NULL utf8 utf8_general_ci varchar(8) NEVER NULL +def information_schema ROUTINES ROUTINE_BODY 15 '' NO varchar 8 24 NULL NULL NULL utf8 utf8_general_ci varchar(8) NEVER NULL +def information_schema ROUTINES ROUTINE_CATALOG 2 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL +def information_schema ROUTINES ROUTINE_COMMENT 27 '' NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext NEVER NULL def information_schema ROUTINES ROUTINE_DEFINITION 16 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext NEVER NULL -def information_schema ROUTINES ROUTINE_NAME 4 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema ROUTINES ROUTINE_SCHEMA 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema ROUTINES ROUTINE_TYPE 5 NO varchar 9 27 NULL NULL NULL utf8 utf8_general_ci varchar(9) NEVER NULL -def information_schema ROUTINES SECURITY_TYPE 23 NO varchar 7 21 NULL NULL NULL utf8 utf8_general_ci varchar(7) NEVER NULL -def information_schema ROUTINES SPECIFIC_NAME 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema ROUTINES SQL_DATA_ACCESS 21 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema ROUTINES SQL_MODE 26 NO varchar 8192 24576 NULL NULL NULL utf8 utf8_general_ci varchar(8192) NEVER NULL +def information_schema ROUTINES ROUTINE_NAME 4 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema ROUTINES ROUTINE_SCHEMA 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema ROUTINES ROUTINE_TYPE 5 '' NO varchar 9 27 NULL NULL NULL utf8 utf8_general_ci varchar(9) NEVER NULL +def information_schema ROUTINES SECURITY_TYPE 23 '' NO varchar 7 21 NULL NULL NULL utf8 utf8_general_ci varchar(7) NEVER NULL +def information_schema ROUTINES SPECIFIC_NAME 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema ROUTINES SQL_DATA_ACCESS 21 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema ROUTINES SQL_MODE 26 '' NO varchar 8192 24576 NULL NULL NULL utf8 utf8_general_ci varchar(8192) NEVER NULL def information_schema ROUTINES SQL_PATH 22 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema SCHEMATA CATALOG_NAME 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL -def information_schema SCHEMATA DEFAULT_CHARACTER_SET_NAME 3 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL -def information_schema SCHEMATA DEFAULT_COLLATION_NAME 4 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL -def information_schema SCHEMATA SCHEMA_NAME 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema SCHEMATA CATALOG_NAME 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL +def information_schema SCHEMATA DEFAULT_CHARACTER_SET_NAME 3 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL +def information_schema SCHEMATA DEFAULT_COLLATION_NAME 4 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL +def information_schema SCHEMATA SCHEMA_NAME 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema SCHEMATA SQL_PATH 5 NULL YES varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL -def information_schema SCHEMA_PRIVILEGES GRANTEE 1 NO varchar 190 570 NULL NULL NULL utf8 utf8_general_ci varchar(190) NEVER NULL -def information_schema SCHEMA_PRIVILEGES IS_GRANTABLE 5 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL -def information_schema SCHEMA_PRIVILEGES PRIVILEGE_TYPE 4 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema SCHEMA_PRIVILEGES TABLE_CATALOG 2 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL -def information_schema SCHEMA_PRIVILEGES TABLE_SCHEMA 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema SESSION_STATUS VARIABLE_NAME 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema SESSION_STATUS VARIABLE_VALUE 2 NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) NEVER NULL -def information_schema SESSION_VARIABLES VARIABLE_NAME 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema SESSION_VARIABLES VARIABLE_VALUE 2 NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) NEVER NULL -def information_schema SPATIAL_REF_SYS AUTH_NAME 2 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL +def information_schema SCHEMA_PRIVILEGES GRANTEE 1 '' NO varchar 190 570 NULL NULL NULL utf8 utf8_general_ci varchar(190) NEVER NULL +def information_schema SCHEMA_PRIVILEGES IS_GRANTABLE 5 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL +def information_schema SCHEMA_PRIVILEGES PRIVILEGE_TYPE 4 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema SCHEMA_PRIVILEGES TABLE_CATALOG 2 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL +def information_schema SCHEMA_PRIVILEGES TABLE_SCHEMA 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema SESSION_STATUS VARIABLE_NAME 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema SESSION_STATUS VARIABLE_VALUE 2 '' NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) NEVER NULL +def information_schema SESSION_VARIABLES VARIABLE_NAME 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema SESSION_VARIABLES VARIABLE_VALUE 2 '' NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) NEVER NULL +def information_schema SPATIAL_REF_SYS AUTH_NAME 2 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL def information_schema SPATIAL_REF_SYS AUTH_SRID 3 0 NO int NULL NULL 10 0 NULL NULL NULL int(5) NEVER NULL def information_schema SPATIAL_REF_SYS SRID 1 0 NO smallint NULL NULL 5 0 NULL NULL NULL smallint(5) NEVER NULL -def information_schema SPATIAL_REF_SYS SRTEXT 4 NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) NEVER NULL +def information_schema SPATIAL_REF_SYS SRTEXT 4 '' NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) NEVER NULL def information_schema STATISTICS CARDINALITY 10 NULL YES bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL def information_schema STATISTICS COLLATION 9 NULL YES varchar 1 3 NULL NULL NULL utf8 utf8_general_ci varchar(1) NEVER NULL -def information_schema STATISTICS COLUMN_NAME 8 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema STATISTICS COLUMN_NAME 8 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema STATISTICS COMMENT 15 NULL YES varchar 16 48 NULL NULL NULL utf8 utf8_general_ci varchar(16) NEVER NULL -def information_schema STATISTICS INDEX_COMMENT 16 NO varchar 1024 3072 NULL NULL NULL utf8 utf8_general_ci varchar(1024) NEVER NULL -def information_schema STATISTICS INDEX_NAME 6 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema STATISTICS INDEX_SCHEMA 5 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema STATISTICS INDEX_TYPE 14 NO varchar 16 48 NULL NULL NULL utf8 utf8_general_ci varchar(16) NEVER NULL +def information_schema STATISTICS INDEX_COMMENT 16 '' NO varchar 1024 3072 NULL NULL NULL utf8 utf8_general_ci varchar(1024) NEVER NULL +def information_schema STATISTICS INDEX_NAME 6 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema STATISTICS INDEX_SCHEMA 5 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema STATISTICS INDEX_TYPE 14 '' NO varchar 16 48 NULL NULL NULL utf8 utf8_general_ci varchar(16) NEVER NULL def information_schema STATISTICS NON_UNIQUE 4 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(1) NEVER NULL -def information_schema STATISTICS NULLABLE 13 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL +def information_schema STATISTICS NULLABLE 13 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL def information_schema STATISTICS PACKED 12 NULL YES varchar 10 30 NULL NULL NULL utf8 utf8_general_ci varchar(10) NEVER NULL def information_schema STATISTICS SEQ_IN_INDEX 7 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(2) NEVER NULL def information_schema STATISTICS SUB_PART 11 NULL YES bigint NULL NULL 19 0 NULL NULL NULL bigint(3) NEVER NULL -def information_schema STATISTICS TABLE_CATALOG 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL -def information_schema STATISTICS TABLE_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema STATISTICS TABLE_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema STATISTICS TABLE_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL +def information_schema STATISTICS TABLE_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema STATISTICS TABLE_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema SYSTEM_VARIABLES COMMAND_LINE_ARGUMENT 14 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema SYSTEM_VARIABLES DEFAULT_VALUE 5 NULL YES varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) NEVER NULL def information_schema SYSTEM_VARIABLES ENUM_VALUE_LIST 12 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext NEVER NULL def information_schema SYSTEM_VARIABLES GLOBAL_VALUE 3 NULL YES varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) NEVER NULL -def information_schema SYSTEM_VARIABLES GLOBAL_VALUE_ORIGIN 4 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema SYSTEM_VARIABLES GLOBAL_VALUE_ORIGIN 4 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema SYSTEM_VARIABLES NUMERIC_BLOCK_SIZE 11 NULL YES varchar 21 63 NULL NULL NULL utf8 utf8_general_ci varchar(21) NEVER NULL def information_schema SYSTEM_VARIABLES NUMERIC_MAX_VALUE 10 NULL YES varchar 21 63 NULL NULL NULL utf8 utf8_general_ci varchar(21) NEVER NULL def information_schema SYSTEM_VARIABLES NUMERIC_MIN_VALUE 9 NULL YES varchar 21 63 NULL NULL NULL utf8 utf8_general_ci varchar(21) NEVER NULL -def information_schema SYSTEM_VARIABLES READ_ONLY 13 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL +def information_schema SYSTEM_VARIABLES READ_ONLY 13 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL def information_schema SYSTEM_VARIABLES SESSION_VALUE 2 NULL YES varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) NEVER NULL -def information_schema SYSTEM_VARIABLES VARIABLE_COMMENT 8 NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) NEVER NULL -def information_schema SYSTEM_VARIABLES VARIABLE_NAME 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema SYSTEM_VARIABLES VARIABLE_SCOPE 6 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema SYSTEM_VARIABLES VARIABLE_TYPE 7 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema SYSTEM_VARIABLES VARIABLE_COMMENT 8 '' NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) NEVER NULL +def information_schema SYSTEM_VARIABLES VARIABLE_NAME 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema SYSTEM_VARIABLES VARIABLE_SCOPE 6 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema SYSTEM_VARIABLES VARIABLE_TYPE 7 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema TABLES AUTO_INCREMENT 14 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema TABLES AVG_ROW_LENGTH 9 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema TABLES CHECKSUM 19 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL @@ -373,67 +373,67 @@ def information_schema TABLES ENGINE 5 NULL YES varchar 64 192 NULL NULL NULL ut def information_schema TABLES INDEX_LENGTH 12 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema TABLES MAX_DATA_LENGTH 11 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema TABLES ROW_FORMAT 7 NULL YES varchar 10 30 NULL NULL NULL utf8 utf8_general_ci varchar(10) NEVER NULL -def information_schema TABLES TABLE_CATALOG 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL +def information_schema TABLES TABLE_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL def information_schema TABLES TABLE_COLLATION 18 NULL YES varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL -def information_schema TABLES TABLE_COMMENT 21 NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) NEVER NULL -def information_schema TABLES TABLE_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema TABLES TABLE_COMMENT 21 '' NO varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) NEVER NULL +def information_schema TABLES TABLE_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema TABLES TABLE_ROWS 8 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL -def information_schema TABLES TABLE_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema TABLES TABLE_TYPE 4 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema TABLES TABLE_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema TABLES TABLE_TYPE 4 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema TABLES UPDATE_TIME 16 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL def information_schema TABLES VERSION 6 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema TABLESPACES AUTOEXTEND_SIZE 6 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL -def information_schema TABLESPACES ENGINE 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema TABLESPACES ENGINE 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema TABLESPACES EXTENT_SIZE 5 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema TABLESPACES LOGFILE_GROUP_NAME 4 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema TABLESPACES MAXIMUM_SIZE 7 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema TABLESPACES NODEGROUP_ID 8 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema TABLESPACES TABLESPACE_COMMENT 9 NULL YES varchar 2048 6144 NULL NULL NULL utf8 utf8_general_ci varchar(2048) NEVER NULL -def information_schema TABLESPACES TABLESPACE_NAME 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema TABLESPACES TABLESPACE_NAME 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema TABLESPACES TABLESPACE_TYPE 3 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema TABLE_CONSTRAINTS CONSTRAINT_CATALOG 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL -def information_schema TABLE_CONSTRAINTS CONSTRAINT_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema TABLE_CONSTRAINTS CONSTRAINT_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema TABLE_CONSTRAINTS CONSTRAINT_TYPE 6 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema TABLE_CONSTRAINTS TABLE_NAME 5 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema TABLE_CONSTRAINTS TABLE_SCHEMA 4 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema TABLE_PRIVILEGES GRANTEE 1 NO varchar 190 570 NULL NULL NULL utf8 utf8_general_ci varchar(190) NEVER NULL -def information_schema TABLE_PRIVILEGES IS_GRANTABLE 6 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL -def information_schema TABLE_PRIVILEGES PRIVILEGE_TYPE 5 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema TABLE_PRIVILEGES TABLE_CATALOG 2 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL -def information_schema TABLE_PRIVILEGES TABLE_NAME 4 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema TABLE_PRIVILEGES TABLE_SCHEMA 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema TABLE_CONSTRAINTS CONSTRAINT_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL +def information_schema TABLE_CONSTRAINTS CONSTRAINT_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema TABLE_CONSTRAINTS CONSTRAINT_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema TABLE_CONSTRAINTS CONSTRAINT_TYPE 6 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema TABLE_CONSTRAINTS TABLE_NAME 5 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema TABLE_CONSTRAINTS TABLE_SCHEMA 4 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema TABLE_PRIVILEGES GRANTEE 1 '' NO varchar 190 570 NULL NULL NULL utf8 utf8_general_ci varchar(190) NEVER NULL +def information_schema TABLE_PRIVILEGES IS_GRANTABLE 6 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL +def information_schema TABLE_PRIVILEGES PRIVILEGE_TYPE 5 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema TABLE_PRIVILEGES TABLE_CATALOG 2 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL +def information_schema TABLE_PRIVILEGES TABLE_NAME 4 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema TABLE_PRIVILEGES TABLE_SCHEMA 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema TABLE_STATISTICS ROWS_CHANGED 4 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL def information_schema TABLE_STATISTICS ROWS_CHANGED_X_INDEXES 5 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL def information_schema TABLE_STATISTICS ROWS_READ 3 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL -def information_schema TABLE_STATISTICS TABLE_NAME 2 NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) NEVER NULL -def information_schema TABLE_STATISTICS TABLE_SCHEMA 1 NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) NEVER NULL +def information_schema TABLE_STATISTICS TABLE_NAME 2 '' NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) NEVER NULL +def information_schema TABLE_STATISTICS TABLE_SCHEMA 1 '' NO varchar 192 576 NULL NULL NULL utf8 utf8_general_ci varchar(192) NEVER NULL def information_schema TRIGGERS ACTION_CONDITION 9 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext NEVER NULL def information_schema TRIGGERS ACTION_ORDER 8 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(4) NEVER NULL -def information_schema TRIGGERS ACTION_ORIENTATION 11 NO varchar 9 27 NULL NULL NULL utf8 utf8_general_ci varchar(9) NEVER NULL -def information_schema TRIGGERS ACTION_REFERENCE_NEW_ROW 16 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL +def information_schema TRIGGERS ACTION_ORIENTATION 11 '' NO varchar 9 27 NULL NULL NULL utf8 utf8_general_ci varchar(9) NEVER NULL +def information_schema TRIGGERS ACTION_REFERENCE_NEW_ROW 16 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL def information_schema TRIGGERS ACTION_REFERENCE_NEW_TABLE 14 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema TRIGGERS ACTION_REFERENCE_OLD_ROW 15 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL +def information_schema TRIGGERS ACTION_REFERENCE_OLD_ROW 15 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL def information_schema TRIGGERS ACTION_REFERENCE_OLD_TABLE 13 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema TRIGGERS ACTION_STATEMENT 10 NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext NEVER NULL -def information_schema TRIGGERS ACTION_TIMING 12 NO varchar 6 18 NULL NULL NULL utf8 utf8_general_ci varchar(6) NEVER NULL -def information_schema TRIGGERS CHARACTER_SET_CLIENT 20 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL -def information_schema TRIGGERS COLLATION_CONNECTION 21 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL +def information_schema TRIGGERS ACTION_STATEMENT 10 '' NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext NEVER NULL +def information_schema TRIGGERS ACTION_TIMING 12 '' NO varchar 6 18 NULL NULL NULL utf8 utf8_general_ci varchar(6) NEVER NULL +def information_schema TRIGGERS CHARACTER_SET_CLIENT 20 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL +def information_schema TRIGGERS COLLATION_CONNECTION 21 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL def information_schema TRIGGERS CREATED 17 NULL YES datetime NULL NULL NULL NULL 2 NULL NULL datetime(2) NEVER NULL -def information_schema TRIGGERS DATABASE_COLLATION 22 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL -def information_schema TRIGGERS DEFINER 19 NO varchar 189 567 NULL NULL NULL utf8 utf8_general_ci varchar(189) NEVER NULL -def information_schema TRIGGERS EVENT_MANIPULATION 4 NO varchar 6 18 NULL NULL NULL utf8 utf8_general_ci varchar(6) NEVER NULL -def information_schema TRIGGERS EVENT_OBJECT_CATALOG 5 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL -def information_schema TRIGGERS EVENT_OBJECT_SCHEMA 6 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema TRIGGERS EVENT_OBJECT_TABLE 7 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema TRIGGERS SQL_MODE 18 NO varchar 8192 24576 NULL NULL NULL utf8 utf8_general_ci varchar(8192) NEVER NULL -def information_schema TRIGGERS TRIGGER_CATALOG 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL -def information_schema TRIGGERS TRIGGER_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema TRIGGERS TRIGGER_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema USER_PRIVILEGES GRANTEE 1 NO varchar 190 570 NULL NULL NULL utf8 utf8_general_ci varchar(190) NEVER NULL -def information_schema USER_PRIVILEGES IS_GRANTABLE 4 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL -def information_schema USER_PRIVILEGES PRIVILEGE_TYPE 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema USER_PRIVILEGES TABLE_CATALOG 2 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL +def information_schema TRIGGERS DATABASE_COLLATION 22 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL +def information_schema TRIGGERS DEFINER 19 '' NO varchar 189 567 NULL NULL NULL utf8 utf8_general_ci varchar(189) NEVER NULL +def information_schema TRIGGERS EVENT_MANIPULATION 4 '' NO varchar 6 18 NULL NULL NULL utf8 utf8_general_ci varchar(6) NEVER NULL +def information_schema TRIGGERS EVENT_OBJECT_CATALOG 5 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL +def information_schema TRIGGERS EVENT_OBJECT_SCHEMA 6 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema TRIGGERS EVENT_OBJECT_TABLE 7 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema TRIGGERS SQL_MODE 18 '' NO varchar 8192 24576 NULL NULL NULL utf8 utf8_general_ci varchar(8192) NEVER NULL +def information_schema TRIGGERS TRIGGER_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL +def information_schema TRIGGERS TRIGGER_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema TRIGGERS TRIGGER_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema USER_PRIVILEGES GRANTEE 1 '' NO varchar 190 570 NULL NULL NULL utf8 utf8_general_ci varchar(190) NEVER NULL +def information_schema USER_PRIVILEGES IS_GRANTABLE 4 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL +def information_schema USER_PRIVILEGES PRIVILEGE_TYPE 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema USER_PRIVILEGES TABLE_CATALOG 2 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL def information_schema USER_STATISTICS ACCESS_DENIED 22 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL def information_schema USER_STATISTICS BINLOG_BYTES_WRITTEN 9 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL def information_schema USER_STATISTICS BUSY_TIME 5 0 NO double NULL NULL 21 NULL NULL NULL NULL double NEVER NULL @@ -458,18 +458,18 @@ def information_schema USER_STATISTICS SELECT_COMMANDS 15 0 NO bigint NULL NULL def information_schema USER_STATISTICS TOTAL_CONNECTIONS 2 0 NO int NULL NULL 10 0 NULL NULL NULL int(11) NEVER NULL def information_schema USER_STATISTICS TOTAL_SSL_CONNECTIONS 24 0 NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def information_schema USER_STATISTICS UPDATE_COMMANDS 16 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL -def information_schema USER_STATISTICS USER 1 NO varchar 128 384 NULL NULL NULL utf8 utf8_general_ci varchar(128) NEVER NULL -def information_schema VIEWS ALGORITHM 11 NO varchar 10 30 NULL NULL NULL utf8 utf8_general_ci varchar(10) NEVER NULL -def information_schema VIEWS CHARACTER_SET_CLIENT 9 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL -def information_schema VIEWS CHECK_OPTION 5 NO varchar 8 24 NULL NULL NULL utf8 utf8_general_ci varchar(8) NEVER NULL -def information_schema VIEWS COLLATION_CONNECTION 10 NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL -def information_schema VIEWS DEFINER 7 NO varchar 189 567 NULL NULL NULL utf8 utf8_general_ci varchar(189) NEVER NULL -def information_schema VIEWS IS_UPDATABLE 6 NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL -def information_schema VIEWS SECURITY_TYPE 8 NO varchar 7 21 NULL NULL NULL utf8 utf8_general_ci varchar(7) NEVER NULL -def information_schema VIEWS TABLE_CATALOG 1 NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL -def information_schema VIEWS TABLE_NAME 3 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema VIEWS TABLE_SCHEMA 2 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL -def information_schema VIEWS VIEW_DEFINITION 4 NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext NEVER NULL +def information_schema USER_STATISTICS USER 1 '' NO varchar 128 384 NULL NULL NULL utf8 utf8_general_ci varchar(128) NEVER NULL +def information_schema VIEWS ALGORITHM 11 '' NO varchar 10 30 NULL NULL NULL utf8 utf8_general_ci varchar(10) NEVER NULL +def information_schema VIEWS CHARACTER_SET_CLIENT 9 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL +def information_schema VIEWS CHECK_OPTION 5 '' NO varchar 8 24 NULL NULL NULL utf8 utf8_general_ci varchar(8) NEVER NULL +def information_schema VIEWS COLLATION_CONNECTION 10 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) NEVER NULL +def information_schema VIEWS DEFINER 7 '' NO varchar 189 567 NULL NULL NULL utf8 utf8_general_ci varchar(189) NEVER NULL +def information_schema VIEWS IS_UPDATABLE 6 '' NO varchar 3 9 NULL NULL NULL utf8 utf8_general_ci varchar(3) NEVER NULL +def information_schema VIEWS SECURITY_TYPE 8 '' NO varchar 7 21 NULL NULL NULL utf8 utf8_general_ci varchar(7) NEVER NULL +def information_schema VIEWS TABLE_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL +def information_schema VIEWS TABLE_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema VIEWS TABLE_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL +def information_schema VIEWS VIEW_DEFINITION 4 '' NO longtext 4294967295 4294967295 NULL NULL NULL utf8 utf8_general_ci longtext NEVER NULL ########################################################################## # Show the quotient of CHARACTER_OCTET_LENGTH and CHARACTER_MAXIMUM_LENGTH ########################################################################## diff --git a/mysql-test/suite/funcs_1/r/is_columns_memory.result b/mysql-test/suite/funcs_1/r/is_columns_memory.result index 220a29f4df4..e94d4c9123a 100644 --- a/mysql-test/suite/funcs_1/r/is_columns_memory.result +++ b/mysql-test/suite/funcs_1/r/is_columns_memory.result @@ -473,15 +473,15 @@ def test tb1 f56 48 0000000099 NO decimal NULL NULL 10 0 NULL NULL NULL decimal( def test tb1 f57 49 99 NO decimal NULL NULL 10 0 NULL NULL NULL decimal(10,0) select,insert,update,references NEVER NULL def test tb1 f58 50 99 NO decimal NULL NULL 64 0 NULL NULL NULL decimal(64,0) select,insert,update,references NEVER NULL def test tb2 f100 42 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL NULL double unsigned zerofill select,insert,update,references NEVER NULL -def test tb2 f101 43 2000-01-01 NO date NULL NULL NULL NULL NULL NULL NULL date select,insert,update,references NEVER NULL -def test tb2 f102 44 00:00:20 NO time NULL NULL NULL NULL 0 NULL NULL time select,insert,update,references NEVER NULL -def test tb2 f103 45 0002-02-02 00:00:00 NO datetime NULL NULL NULL NULL 0 NULL NULL datetime select,insert,update,references NEVER NULL -def test tb2 f104 46 2000-12-31 23:59:59 NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL +def test tb2 f101 43 '2000-01-01' NO date NULL NULL NULL NULL NULL NULL NULL date select,insert,update,references NEVER NULL +def test tb2 f102 44 '00:00:20' NO time NULL NULL NULL NULL 0 NULL NULL time select,insert,update,references NEVER NULL +def test tb2 f103 45 '0002-02-02 00:00:00' NO datetime NULL NULL NULL NULL 0 NULL NULL datetime select,insert,update,references NEVER NULL +def test tb2 f104 46 '2000-12-31 23:59:59' NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL def test tb2 f105 47 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) select,insert,update,references NEVER NULL def test tb2 f106 48 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) select,insert,update,references NEVER NULL def test tb2 f107 49 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) select,insert,update,references NEVER NULL -def test tb2 f108 50 1enum NO enum 5 5 NULL NULL NULL latin1 latin1_swedish_ci enum('1enum','2enum') select,insert,update,references NEVER NULL -def test tb2 f109 51 1set NO set 9 9 NULL NULL NULL latin1 latin1_swedish_ci set('1set','2set') select,insert,update,references NEVER NULL +def test tb2 f108 50 '1enum' NO enum 5 5 NULL NULL NULL latin1 latin1_swedish_ci enum('1enum','2enum') select,insert,update,references NEVER NULL +def test tb2 f109 51 '1set' NO set 9 9 NULL NULL NULL latin1 latin1_swedish_ci set('1set','2set') select,insert,update,references NEVER NULL def test tb2 f59 1 NULL YES decimal NULL NULL 10 0 NULL NULL NULL decimal(10,0) unsigned select,insert,update,references NEVER NULL def test tb2 f60 2 NULL YES decimal NULL NULL 64 0 NULL NULL NULL decimal(64,0) unsigned select,insert,update,references NEVER NULL def test tb2 f61 3 NULL YES decimal NULL NULL 10 0 NULL NULL NULL decimal(10,0) unsigned zerofill select,insert,update,references NEVER NULL @@ -523,12 +523,12 @@ def test tb2 f96 38 8.8 NO double NULL NULL 22 NULL NULL NULL NULL double unsign def test tb2 f97 39 0000000008.8 NO float NULL NULL 12 NULL NULL NULL NULL float unsigned zerofill select,insert,update,references NEVER NULL def test tb2 f98 40 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL NULL double unsigned zerofill select,insert,update,references NEVER NULL def test tb2 f99 41 0000000008.8 NO float NULL NULL 12 NULL NULL NULL NULL float unsigned zerofill select,insert,update,references NEVER NULL -def test tb3 f118 1 a NO char 1 1 NULL NULL NULL latin1 latin1_swedish_ci char(1) select,insert,update,references NEVER NULL -def test tb3 f119 2  NO char 1 1 NULL NULL NULL latin1 latin1_bin char(1) select,insert,update,references NEVER NULL -def test tb3 f120 3  NO char 1 1 NULL NULL NULL latin1 latin1_swedish_ci char(1) select,insert,update,references NEVER NULL +def test tb3 f118 1 'a' NO char 1 1 NULL NULL NULL latin1 latin1_swedish_ci char(1) select,insert,update,references NEVER NULL +def test tb3 f119 2 '' NO char 1 1 NULL NULL NULL latin1 latin1_bin char(1) select,insert,update,references NEVER NULL +def test tb3 f120 3 '' NO char 1 1 NULL NULL NULL latin1 latin1_swedish_ci char(1) select,insert,update,references NEVER NULL def test tb3 f121 4 NULL YES char 50 50 NULL NULL NULL latin1 latin1_swedish_ci char(50) select,insert,update,references NEVER NULL def test tb3 f122 5 NULL YES char 50 50 NULL NULL NULL latin1 latin1_swedish_ci char(50) select,insert,update,references NEVER NULL -def test tb3 f129 6  NO binary 1 1 NULL NULL NULL NULL NULL binary(1) select,insert,update,references NEVER NULL +def test tb3 f129 6 '' NO binary 1 1 NULL NULL NULL NULL NULL binary(1) select,insert,update,references NEVER NULL def test tb3 f130 7 99 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(4) select,insert,update,references NEVER NULL def test tb3 f131 8 99 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(3) unsigned select,insert,update,references NEVER NULL def test tb3 f132 9 099 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(3) unsigned zerofill select,insert,update,references NEVER NULL @@ -633,15 +633,15 @@ def test tb4 f239 56 NULL YES varbinary 0 0 NULL NULL NULL NULL NULL varbinary(0 def test tb4 f240 57 NULL YES varchar 1200 1200 NULL NULL NULL latin1 latin1_swedish_ci varchar(1200) select,insert,update,references NEVER NULL def test tb4 f241 53 NULL YES char 255 255 NULL NULL NULL latin1 latin1_swedish_ci char(255) select,insert,update,references NEVER NULL def test1 tb2 f100 42 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL NULL double unsigned zerofill select,insert,update,references NEVER NULL -def test1 tb2 f101 43 2000-01-01 NO date NULL NULL NULL NULL NULL NULL NULL date select,insert,update,references NEVER NULL -def test1 tb2 f102 44 00:00:20 NO time NULL NULL NULL NULL 0 NULL NULL time select,insert,update,references NEVER NULL -def test1 tb2 f103 45 0002-02-02 00:00:00 NO datetime NULL NULL NULL NULL 0 NULL NULL datetime select,insert,update,references NEVER NULL -def test1 tb2 f104 46 2000-12-31 23:59:59 NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL +def test1 tb2 f101 43 '2000-01-01' NO date NULL NULL NULL NULL NULL NULL NULL date select,insert,update,references NEVER NULL +def test1 tb2 f102 44 '00:00:20' NO time NULL NULL NULL NULL 0 NULL NULL time select,insert,update,references NEVER NULL +def test1 tb2 f103 45 '0002-02-02 00:00:00' NO datetime NULL NULL NULL NULL 0 NULL NULL datetime select,insert,update,references NEVER NULL +def test1 tb2 f104 46 '2000-12-31 23:59:59' NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL def test1 tb2 f105 47 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) select,insert,update,references NEVER NULL def test1 tb2 f106 48 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) select,insert,update,references NEVER NULL def test1 tb2 f107 49 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) select,insert,update,references NEVER NULL -def test1 tb2 f108 50 1enum NO enum 5 5 NULL NULL NULL latin1 latin1_swedish_ci enum('1enum','2enum') select,insert,update,references NEVER NULL -def test1 tb2 f109 51 1set NO set 9 9 NULL NULL NULL latin1 latin1_swedish_ci set('1set','2set') select,insert,update,references NEVER NULL +def test1 tb2 f108 50 '1enum' NO enum 5 5 NULL NULL NULL latin1 latin1_swedish_ci enum('1enum','2enum') select,insert,update,references NEVER NULL +def test1 tb2 f109 51 '1set' NO set 9 9 NULL NULL NULL latin1 latin1_swedish_ci set('1set','2set') select,insert,update,references NEVER NULL def test1 tb2 f59 1 NULL YES decimal NULL NULL 10 0 NULL NULL NULL decimal(10,0) unsigned select,insert,update,references NEVER NULL def test1 tb2 f60 2 NULL YES decimal NULL NULL 64 0 NULL NULL NULL decimal(64,0) unsigned select,insert,update,references NEVER NULL def test1 tb2 f61 3 NULL YES decimal NULL NULL 10 0 NULL NULL NULL decimal(10,0) unsigned zerofill select,insert,update,references NEVER NULL diff --git a/mysql-test/suite/funcs_1/r/is_columns_myisam.result b/mysql-test/suite/funcs_1/r/is_columns_myisam.result index ba72de1d5ec..c4e11e3f48b 100644 --- a/mysql-test/suite/funcs_1/r/is_columns_myisam.result +++ b/mysql-test/suite/funcs_1/r/is_columns_myisam.result @@ -521,15 +521,15 @@ def test tb1 f7 7 NULL YES longtext 4294967295 4294967295 NULL NULL NULL latin1 def test tb1 f8 8 NULL YES tinyblob 255 255 NULL NULL NULL NULL NULL tinyblob select,insert,update,references NEVER NULL def test tb1 f9 9 NULL YES blob 65535 65535 NULL NULL NULL NULL NULL blob select,insert,update,references NEVER NULL def test tb2 f100 42 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL NULL double unsigned zerofill select,insert,update,references NEVER NULL -def test tb2 f101 43 2000-01-01 NO date NULL NULL NULL NULL NULL NULL NULL date select,insert,update,references NEVER NULL -def test tb2 f102 44 00:00:20 NO time NULL NULL NULL NULL 0 NULL NULL time select,insert,update,references NEVER NULL -def test tb2 f103 45 0002-02-02 00:00:00 NO datetime NULL NULL NULL NULL 0 NULL NULL datetime select,insert,update,references NEVER NULL -def test tb2 f104 46 2000-12-31 23:59:59 NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL +def test tb2 f101 43 '2000-01-01' NO date NULL NULL NULL NULL NULL NULL NULL date select,insert,update,references NEVER NULL +def test tb2 f102 44 '00:00:20' NO time NULL NULL NULL NULL 0 NULL NULL time select,insert,update,references NEVER NULL +def test tb2 f103 45 '0002-02-02 00:00:00' NO datetime NULL NULL NULL NULL 0 NULL NULL datetime select,insert,update,references NEVER NULL +def test tb2 f104 46 '2000-12-31 23:59:59' NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL def test tb2 f105 47 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) select,insert,update,references NEVER NULL def test tb2 f106 48 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) select,insert,update,references NEVER NULL def test tb2 f107 49 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) select,insert,update,references NEVER NULL -def test tb2 f108 50 1enum NO enum 5 5 NULL NULL NULL latin1 latin1_swedish_ci enum('1enum','2enum') select,insert,update,references NEVER NULL -def test tb2 f109 51 1set NO set 9 9 NULL NULL NULL latin1 latin1_swedish_ci set('1set','2set') select,insert,update,references NEVER NULL +def test tb2 f108 50 '1enum' NO enum 5 5 NULL NULL NULL latin1 latin1_swedish_ci enum('1enum','2enum') select,insert,update,references NEVER NULL +def test tb2 f109 51 '1set' NO set 9 9 NULL NULL NULL latin1 latin1_swedish_ci set('1set','2set') select,insert,update,references NEVER NULL def test tb2 f110 52 NULL YES varbinary 64 64 NULL NULL NULL NULL NULL varbinary(64) select,insert,update,references NEVER NULL def test tb2 f111 53 NULL YES varbinary 27 27 NULL NULL NULL NULL NULL varbinary(27) select,insert,update,references NEVER NULL def test tb2 f112 54 NULL YES varbinary 64 64 NULL NULL NULL NULL NULL varbinary(64) select,insert,update,references NEVER NULL @@ -579,9 +579,9 @@ def test tb2 f96 38 8.8 NO double NULL NULL 22 NULL NULL NULL NULL double unsign def test tb2 f97 39 0000000008.8 NO float NULL NULL 12 NULL NULL NULL NULL float unsigned zerofill select,insert,update,references NEVER NULL def test tb2 f98 40 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL NULL double unsigned zerofill select,insert,update,references NEVER NULL def test tb2 f99 41 0000000008.8 NO float NULL NULL 12 NULL NULL NULL NULL float unsigned zerofill select,insert,update,references NEVER NULL -def test tb3 f118 1 a NO char 1 1 NULL NULL NULL latin1 latin1_swedish_ci char(1) select,insert,update,references NEVER NULL -def test tb3 f119 2  NO char 1 1 NULL NULL NULL latin1 latin1_bin char(1) select,insert,update,references NEVER NULL -def test tb3 f120 3  NO char 1 1 NULL NULL NULL latin1 latin1_swedish_ci char(1) select,insert,update,references NEVER NULL +def test tb3 f118 1 'a' NO char 1 1 NULL NULL NULL latin1 latin1_swedish_ci char(1) select,insert,update,references NEVER NULL +def test tb3 f119 2 '' NO char 1 1 NULL NULL NULL latin1 latin1_bin char(1) select,insert,update,references NEVER NULL +def test tb3 f120 3 '' NO char 1 1 NULL NULL NULL latin1 latin1_swedish_ci char(1) select,insert,update,references NEVER NULL def test tb3 f121 4 NULL YES tinytext 255 255 NULL NULL NULL latin1 latin1_swedish_ci tinytext select,insert,update,references NEVER NULL def test tb3 f122 5 NULL YES text 65535 65535 NULL NULL NULL latin1 latin1_swedish_ci text select,insert,update,references NEVER NULL def test tb3 f123 6 NULL YES mediumtext 16777215 16777215 NULL NULL NULL latin1 latin1_swedish_ci mediumtext select,insert,update,references NEVER NULL @@ -590,7 +590,7 @@ def test tb3 f125 8 NULL YES tinyblob 255 255 NULL NULL NULL NULL NULL tinyblob def test tb3 f126 9 NULL YES blob 65535 65535 NULL NULL NULL NULL NULL blob select,insert,update,references NEVER NULL def test tb3 f127 10 NULL YES mediumblob 16777215 16777215 NULL NULL NULL NULL NULL mediumblob select,insert,update,references NEVER NULL def test tb3 f128 11 NULL YES longblob 4294967295 4294967295 NULL NULL NULL NULL NULL longblob select,insert,update,references NEVER NULL -def test tb3 f129 12  NO binary 1 1 NULL NULL NULL NULL NULL binary(1) select,insert,update,references NEVER NULL +def test tb3 f129 12 '' NO binary 1 1 NULL NULL NULL NULL NULL binary(1) select,insert,update,references NEVER NULL def test tb3 f130 13 99 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(4) select,insert,update,references NEVER NULL def test tb3 f131 14 99 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(3) unsigned select,insert,update,references NEVER NULL def test tb3 f132 15 099 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(3) unsigned zerofill select,insert,update,references NEVER NULL @@ -705,15 +705,15 @@ def test tb4 f240 65 NULL YES varchar 120 120 NULL NULL NULL latin1 latin1_swedi def test tb4 f241 66 NULL YES char 100 100 NULL NULL NULL latin1 latin1_swedish_ci char(100) select,insert,update,references NEVER NULL def test tb4 f242 67 NULL YES bit NULL NULL 30 NULL NULL NULL NULL bit(30) select,insert,update,references NEVER NULL def test1 tb2 f100 42 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL NULL double unsigned zerofill select,insert,update,references NEVER NULL -def test1 tb2 f101 43 2000-01-01 NO date NULL NULL NULL NULL NULL NULL NULL date select,insert,update,references NEVER NULL -def test1 tb2 f102 44 00:00:20 NO time NULL NULL NULL NULL 0 NULL NULL time select,insert,update,references NEVER NULL -def test1 tb2 f103 45 0002-02-02 00:00:00 NO datetime NULL NULL NULL NULL 0 NULL NULL datetime select,insert,update,references NEVER NULL -def test1 tb2 f104 46 2000-12-31 23:59:59 NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL +def test1 tb2 f101 43 '2000-01-01' NO date NULL NULL NULL NULL NULL NULL NULL date select,insert,update,references NEVER NULL +def test1 tb2 f102 44 '00:00:20' NO time NULL NULL NULL NULL 0 NULL NULL time select,insert,update,references NEVER NULL +def test1 tb2 f103 45 '0002-02-02 00:00:00' NO datetime NULL NULL NULL NULL 0 NULL NULL datetime select,insert,update,references NEVER NULL +def test1 tb2 f104 46 '2000-12-31 23:59:59' NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL def test1 tb2 f105 47 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) select,insert,update,references NEVER NULL def test1 tb2 f106 48 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) select,insert,update,references NEVER NULL def test1 tb2 f107 49 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) select,insert,update,references NEVER NULL -def test1 tb2 f108 50 1enum NO enum 5 5 NULL NULL NULL latin1 latin1_swedish_ci enum('1enum','2enum') select,insert,update,references NEVER NULL -def test1 tb2 f109 51 1set NO set 9 9 NULL NULL NULL latin1 latin1_swedish_ci set('1set','2set') select,insert,update,references NEVER NULL +def test1 tb2 f108 50 '1enum' NO enum 5 5 NULL NULL NULL latin1 latin1_swedish_ci enum('1enum','2enum') select,insert,update,references NEVER NULL +def test1 tb2 f109 51 '1set' NO set 9 9 NULL NULL NULL latin1 latin1_swedish_ci set('1set','2set') select,insert,update,references NEVER NULL def test1 tb2 f110 52 NULL YES varbinary 64 64 NULL NULL NULL NULL NULL varbinary(64) select,insert,update,references NEVER NULL def test1 tb2 f111 53 NULL YES varbinary 27 27 NULL NULL NULL NULL NULL varbinary(27) select,insert,update,references NEVER NULL def test1 tb2 f112 54 NULL YES varbinary 64 64 NULL NULL NULL NULL NULL varbinary(64) select,insert,update,references NEVER NULL diff --git a/mysql-test/suite/funcs_1/r/is_columns_myisam_embedded.result b/mysql-test/suite/funcs_1/r/is_columns_myisam_embedded.result index b025776cf44..ae2b05c058e 100644 --- a/mysql-test/suite/funcs_1/r/is_columns_myisam_embedded.result +++ b/mysql-test/suite/funcs_1/r/is_columns_myisam_embedded.result @@ -521,15 +521,15 @@ def test tb1 f7 7 NULL YES longtext 4294967295 4294967295 NULL NULL NULL latin1 def test tb1 f8 8 NULL YES tinyblob 255 255 NULL NULL NULL NULL NULL tinyblob NEVER NULL def test tb1 f9 9 NULL YES blob 65535 65535 NULL NULL NULL NULL NULL blob NEVER NULL def test tb2 f100 42 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL NULL double unsigned zerofill NEVER NULL -def test tb2 f101 43 2000-01-01 NO date NULL NULL NULL NULL NULL NULL NULL date NEVER NULL -def test tb2 f102 44 00:00:20 NO time NULL NULL NULL NULL 0 NULL NULL time NEVER NULL -def test tb2 f103 45 0002-02-02 00:00:00 NO datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL -def test tb2 f104 46 2000-12-31 23:59:59 NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp NEVER NULL +def test tb2 f101 43 '2000-01-01' NO date NULL NULL NULL NULL NULL NULL NULL date NEVER NULL +def test tb2 f102 44 '00:00:20' NO time NULL NULL NULL NULL 0 NULL NULL time NEVER NULL +def test tb2 f103 45 '0002-02-02 00:00:00' NO datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL +def test tb2 f104 46 '2000-12-31 23:59:59' NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp NEVER NULL def test tb2 f105 47 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) NEVER NULL def test tb2 f106 48 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) NEVER NULL def test tb2 f107 49 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) NEVER NULL -def test tb2 f108 50 1enum NO enum 5 5 NULL NULL NULL latin1 latin1_swedish_ci enum('1enum','2enum') NEVER NULL -def test tb2 f109 51 1set NO set 9 9 NULL NULL NULL latin1 latin1_swedish_ci set('1set','2set') NEVER NULL +def test tb2 f108 50 '1enum' NO enum 5 5 NULL NULL NULL latin1 latin1_swedish_ci enum('1enum','2enum') NEVER NULL +def test tb2 f109 51 '1set' NO set 9 9 NULL NULL NULL latin1 latin1_swedish_ci set('1set','2set') NEVER NULL def test tb2 f110 52 NULL YES varbinary 64 64 NULL NULL NULL NULL NULL varbinary(64) NEVER NULL def test tb2 f111 53 NULL YES varbinary 27 27 NULL NULL NULL NULL NULL varbinary(27) NEVER NULL def test tb2 f112 54 NULL YES varbinary 64 64 NULL NULL NULL NULL NULL varbinary(64) NEVER NULL @@ -579,9 +579,9 @@ def test tb2 f96 38 8.8 NO double NULL NULL 22 NULL NULL NULL NULL double unsign def test tb2 f97 39 0000000008.8 NO float NULL NULL 12 NULL NULL NULL NULL float unsigned zerofill NEVER NULL def test tb2 f98 40 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL NULL double unsigned zerofill NEVER NULL def test tb2 f99 41 0000000008.8 NO float NULL NULL 12 NULL NULL NULL NULL float unsigned zerofill NEVER NULL -def test tb3 f118 1 a NO char 1 1 NULL NULL NULL latin1 latin1_swedish_ci char(1) NEVER NULL -def test tb3 f119 2  NO char 1 1 NULL NULL NULL latin1 latin1_bin char(1) NEVER NULL -def test tb3 f120 3  NO char 1 1 NULL NULL NULL latin1 latin1_swedish_ci char(1) NEVER NULL +def test tb3 f118 1 'a' NO char 1 1 NULL NULL NULL latin1 latin1_swedish_ci char(1) NEVER NULL +def test tb3 f119 2 '' NO char 1 1 NULL NULL NULL latin1 latin1_bin char(1) NEVER NULL +def test tb3 f120 3 '' NO char 1 1 NULL NULL NULL latin1 latin1_swedish_ci char(1) NEVER NULL def test tb3 f121 4 NULL YES tinytext 255 255 NULL NULL NULL latin1 latin1_swedish_ci tinytext NEVER NULL def test tb3 f122 5 NULL YES text 65535 65535 NULL NULL NULL latin1 latin1_swedish_ci text NEVER NULL def test tb3 f123 6 NULL YES mediumtext 16777215 16777215 NULL NULL NULL latin1 latin1_swedish_ci mediumtext NEVER NULL @@ -590,7 +590,7 @@ def test tb3 f125 8 NULL YES tinyblob 255 255 NULL NULL NULL NULL NULL tinyblob def test tb3 f126 9 NULL YES blob 65535 65535 NULL NULL NULL NULL NULL blob NEVER NULL def test tb3 f127 10 NULL YES mediumblob 16777215 16777215 NULL NULL NULL NULL NULL mediumblob NEVER NULL def test tb3 f128 11 NULL YES longblob 4294967295 4294967295 NULL NULL NULL NULL NULL longblob NEVER NULL -def test tb3 f129 12  NO binary 1 1 NULL NULL NULL NULL NULL binary(1) NEVER NULL +def test tb3 f129 12 '' NO binary 1 1 NULL NULL NULL NULL NULL binary(1) NEVER NULL def test tb3 f130 13 99 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(4) NEVER NULL def test tb3 f131 14 99 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(3) unsigned NEVER NULL def test tb3 f132 15 099 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(3) unsigned zerofill NEVER NULL @@ -705,15 +705,15 @@ def test tb4 f240 65 NULL YES varchar 120 120 NULL NULL NULL latin1 latin1_swedi def test tb4 f241 66 NULL YES char 100 100 NULL NULL NULL latin1 latin1_swedish_ci char(100) NEVER NULL def test tb4 f242 67 NULL YES bit NULL NULL 30 NULL NULL NULL NULL bit(30) NEVER NULL def test1 tb2 f100 42 00000000000000000008.8 NO double NULL NULL 22 NULL NULL NULL NULL double unsigned zerofill NEVER NULL -def test1 tb2 f101 43 2000-01-01 NO date NULL NULL NULL NULL NULL NULL NULL date NEVER NULL -def test1 tb2 f102 44 00:00:20 NO time NULL NULL NULL NULL 0 NULL NULL time NEVER NULL -def test1 tb2 f103 45 0002-02-02 00:00:00 NO datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL -def test1 tb2 f104 46 2000-12-31 23:59:59 NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp NEVER NULL +def test1 tb2 f101 43 '2000-01-01' NO date NULL NULL NULL NULL NULL NULL NULL date NEVER NULL +def test1 tb2 f102 44 '00:00:20' NO time NULL NULL NULL NULL 0 NULL NULL time NEVER NULL +def test1 tb2 f103 45 '0002-02-02 00:00:00' NO datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL +def test1 tb2 f104 46 '2000-12-31 23:59:59' NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp NEVER NULL def test1 tb2 f105 47 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) NEVER NULL def test1 tb2 f106 48 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) NEVER NULL def test1 tb2 f107 49 2000 NO year NULL NULL NULL NULL NULL NULL NULL year(4) NEVER NULL -def test1 tb2 f108 50 1enum NO enum 5 5 NULL NULL NULL latin1 latin1_swedish_ci enum('1enum','2enum') NEVER NULL -def test1 tb2 f109 51 1set NO set 9 9 NULL NULL NULL latin1 latin1_swedish_ci set('1set','2set') NEVER NULL +def test1 tb2 f108 50 '1enum' NO enum 5 5 NULL NULL NULL latin1 latin1_swedish_ci enum('1enum','2enum') NEVER NULL +def test1 tb2 f109 51 '1set' NO set 9 9 NULL NULL NULL latin1 latin1_swedish_ci set('1set','2set') NEVER NULL def test1 tb2 f110 52 NULL YES varbinary 64 64 NULL NULL NULL NULL NULL varbinary(64) NEVER NULL def test1 tb2 f111 53 NULL YES varbinary 27 27 NULL NULL NULL NULL NULL varbinary(27) NEVER NULL def test1 tb2 f112 54 NULL YES varbinary 64 64 NULL NULL NULL NULL NULL varbinary(64) NEVER NULL diff --git a/mysql-test/suite/funcs_1/r/is_columns_mysql.result b/mysql-test/suite/funcs_1/r/is_columns_mysql.result index b12574a0dc4..d021c73b339 100644 --- a/mysql-test/suite/funcs_1/r/is_columns_mysql.result +++ b/mysql-test/suite/funcs_1/r/is_columns_mysql.result @@ -2,13 +2,13 @@ SELECT * FROM information_schema.columns WHERE table_schema = 'mysql' ORDER BY table_schema, table_name, column_name; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION COLUMN_DEFAULT IS_NULLABLE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE DATETIME_PRECISION CHARACTER_SET_NAME COLLATION_NAME COLUMN_TYPE COLUMN_KEY EXTRA PRIVILEGES COLUMN_COMMENT IS_GENERATED GENERATION_EXPRESSION -def mysql columns_priv Column_name 5 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI select,insert,update,references NEVER NULL -def mysql columns_priv Column_priv 7 NO set 31 93 NULL NULL NULL utf8 utf8_general_ci set('Select','Insert','Update','References') select,insert,update,references NEVER NULL -def mysql columns_priv Db 2 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI select,insert,update,references NEVER NULL -def mysql columns_priv Host 1 NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI select,insert,update,references NEVER NULL -def mysql columns_priv Table_name 4 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI select,insert,update,references NEVER NULL +def mysql columns_priv Column_name 5 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI select,insert,update,references NEVER NULL +def mysql columns_priv Column_priv 7 '' NO set 31 93 NULL NULL NULL utf8 utf8_general_ci set('Select','Insert','Update','References') select,insert,update,references NEVER NULL +def mysql columns_priv Db 2 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI select,insert,update,references NEVER NULL +def mysql columns_priv Host 1 '' NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI select,insert,update,references NEVER NULL +def mysql columns_priv Table_name 4 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI select,insert,update,references NEVER NULL def mysql columns_priv Timestamp 6 current_timestamp() NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp on update current_timestamp() select,insert,update,references NEVER NULL -def mysql columns_priv User 3 NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI select,insert,update,references NEVER NULL +def mysql columns_priv User 3 '' NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI select,insert,update,references NEVER NULL def mysql column_stats avg_frequency 8 NULL YES decimal NULL NULL 12 4 NULL NULL NULL decimal(12,4) select,insert,update,references NEVER NULL def mysql column_stats avg_length 7 NULL YES decimal NULL NULL 12 4 NULL NULL NULL decimal(12,4) select,insert,update,references NEVER NULL def mysql column_stats column_name 3 NULL NO varchar 64 192 NULL NULL NULL utf8 utf8_bin varchar(64) PRI select,insert,update,references NEVER NULL @@ -20,52 +20,52 @@ def mysql column_stats max_value 5 NULL YES varbinary 255 255 NULL NULL NULL NUL def mysql column_stats min_value 4 NULL YES varbinary 255 255 NULL NULL NULL NULL NULL varbinary(255) select,insert,update,references NEVER NULL def mysql column_stats nulls_ratio 6 NULL YES decimal NULL NULL 12 4 NULL NULL NULL decimal(12,4) select,insert,update,references NEVER NULL def mysql column_stats table_name 2 NULL NO varchar 64 192 NULL NULL NULL utf8 utf8_bin varchar(64) PRI select,insert,update,references NEVER NULL -def mysql db Alter_priv 13 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql db Alter_routine_priv 19 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql db Create_priv 8 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql db Create_routine_priv 18 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql db Create_tmp_table_priv 14 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql db Create_view_priv 16 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql db Db 2 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI select,insert,update,references NEVER NULL -def mysql db Delete_priv 7 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql db Drop_priv 9 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql db Event_priv 21 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql db Execute_priv 20 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql db Grant_priv 10 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql db Host 1 NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI select,insert,update,references NEVER NULL -def mysql db Index_priv 12 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql db Insert_priv 5 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql db Lock_tables_priv 15 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql db References_priv 11 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql db Select_priv 4 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql db Show_view_priv 17 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql db Trigger_priv 22 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql db Update_priv 6 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql db User 3 NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI select,insert,update,references NEVER NULL +def mysql db Alter_priv 13 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql db Alter_routine_priv 19 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql db Create_priv 8 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql db Create_routine_priv 18 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql db Create_tmp_table_priv 14 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql db Create_view_priv 16 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql db Db 2 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI select,insert,update,references NEVER NULL +def mysql db Delete_priv 7 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql db Drop_priv 9 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql db Event_priv 21 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql db Execute_priv 20 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql db Grant_priv 10 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql db Host 1 '' NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI select,insert,update,references NEVER NULL +def mysql db Index_priv 12 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql db Insert_priv 5 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql db Lock_tables_priv 15 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql db References_priv 11 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql db Select_priv 4 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql db Show_view_priv 17 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql db Trigger_priv 22 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql db Update_priv 6 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql db User 3 '' NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI select,insert,update,references NEVER NULL def mysql event body 3 NULL NO longblob 4294967295 4294967295 NULL NULL NULL NULL NULL longblob select,insert,update,references NEVER NULL def mysql event body_utf8 22 NULL YES longblob 4294967295 4294967295 NULL NULL NULL NULL NULL longblob select,insert,update,references NEVER NULL def mysql event character_set_client 19 NULL YES char 32 96 NULL NULL NULL utf8 utf8_bin char(32) select,insert,update,references NEVER NULL def mysql event collation_connection 20 NULL YES char 32 96 NULL NULL NULL utf8 utf8_bin char(32) select,insert,update,references NEVER NULL -def mysql event comment 16 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) select,insert,update,references NEVER NULL +def mysql event comment 16 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) select,insert,update,references NEVER NULL def mysql event created 8 current_timestamp() NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp on update current_timestamp() select,insert,update,references NEVER NULL -def mysql event db 1 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI select,insert,update,references NEVER NULL +def mysql event db 1 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI select,insert,update,references NEVER NULL def mysql event db_collation 21 NULL YES char 32 96 NULL NULL NULL utf8 utf8_bin char(32) select,insert,update,references NEVER NULL -def mysql event definer 4 NO char 141 423 NULL NULL NULL utf8 utf8_bin char(141) select,insert,update,references NEVER NULL +def mysql event definer 4 '' NO char 141 423 NULL NULL NULL utf8 utf8_bin char(141) select,insert,update,references NEVER NULL def mysql event ends 12 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime select,insert,update,references NEVER NULL def mysql event execute_at 5 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime select,insert,update,references NEVER NULL def mysql event interval_field 7 NULL YES enum 18 54 NULL NULL NULL utf8 utf8_general_ci enum('YEAR','QUARTER','MONTH','DAY','HOUR','MINUTE','WEEK','SECOND','MICROSECOND','YEAR_MONTH','DAY_HOUR','DAY_MINUTE','DAY_SECOND','HOUR_MINUTE','HOUR_SECOND','MINUTE_SECOND','DAY_MICROSECOND','HOUR_MICROSECOND','MINUTE_MICROSECOND','SECOND_MICROSECOND') select,insert,update,references NEVER NULL def mysql event interval_value 6 NULL YES int NULL NULL 10 0 NULL NULL NULL int(11) select,insert,update,references NEVER NULL def mysql event last_executed 10 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime select,insert,update,references NEVER NULL -def mysql event modified 9 0000-00-00 00:00:00 NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL -def mysql event name 2 NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) PRI select,insert,update,references NEVER NULL -def mysql event on_completion 14 DROP NO enum 8 24 NULL NULL NULL utf8 utf8_general_ci enum('DROP','PRESERVE') select,insert,update,references NEVER NULL +def mysql event modified 9 '0000-00-00 00:00:00' NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL +def mysql event name 2 '' NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) PRI select,insert,update,references NEVER NULL +def mysql event on_completion 14 'DROP' NO enum 8 24 NULL NULL NULL utf8 utf8_general_ci enum('DROP','PRESERVE') select,insert,update,references NEVER NULL def mysql event originator 17 NULL NO int NULL NULL 10 0 NULL NULL NULL int(10) unsigned select,insert,update,references NEVER NULL -def mysql event sql_mode 15 NO set 494 1482 NULL NULL NULL utf8 utf8_general_ci set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') select,insert,update,references NEVER NULL +def mysql event sql_mode 15 '' NO set 494 1482 NULL NULL NULL utf8 utf8_general_ci set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') select,insert,update,references NEVER NULL def mysql event starts 11 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime select,insert,update,references NEVER NULL -def mysql event status 13 ENABLED NO enum 18 54 NULL NULL NULL utf8 utf8_general_ci enum('ENABLED','DISABLED','SLAVESIDE_DISABLED') select,insert,update,references NEVER NULL -def mysql event time_zone 18 SYSTEM NO char 64 64 NULL NULL NULL latin1 latin1_swedish_ci char(64) select,insert,update,references NEVER NULL -def mysql func dl 3 NO char 128 384 NULL NULL NULL utf8 utf8_bin char(128) select,insert,update,references NEVER NULL -def mysql func name 1 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI select,insert,update,references NEVER NULL +def mysql event status 13 'ENABLED' NO enum 18 54 NULL NULL NULL utf8 utf8_general_ci enum('ENABLED','DISABLED','SLAVESIDE_DISABLED') select,insert,update,references NEVER NULL +def mysql event time_zone 18 'SYSTEM' NO char 64 64 NULL NULL NULL latin1 latin1_swedish_ci char(64) select,insert,update,references NEVER NULL +def mysql func dl 3 '' NO char 128 384 NULL NULL NULL utf8 utf8_bin char(128) select,insert,update,references NEVER NULL +def mysql func name 1 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI select,insert,update,references NEVER NULL def mysql func ret 2 0 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(1) select,insert,update,references NEVER NULL def mysql func type 4 NULL NO enum 9 27 NULL NULL NULL utf8 utf8_general_ci enum('function','aggregate') select,insert,update,references NEVER NULL def mysql general_log argument 6 NULL NO mediumtext 16777215 16777215 NULL NULL NULL utf8 utf8_general_ci mediumtext select,insert,update,references NEVER NULL @@ -92,26 +92,26 @@ def mysql help_topic help_category_id 3 NULL NO smallint NULL NULL 5 0 NULL NULL def mysql help_topic help_topic_id 1 NULL NO int NULL NULL 10 0 NULL NULL NULL int(10) unsigned PRI select,insert,update,references NEVER NULL def mysql help_topic name 2 NULL NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) UNI select,insert,update,references NEVER NULL def mysql help_topic url 6 NULL NO text 65535 65535 NULL NULL NULL utf8 utf8_general_ci text select,insert,update,references NEVER NULL -def mysql host Alter_priv 12 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql host Alter_routine_priv 18 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql host Create_priv 7 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql host Create_routine_priv 17 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql host Create_tmp_table_priv 13 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql host Create_view_priv 15 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql host Db 2 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI select,insert,update,references NEVER NULL -def mysql host Delete_priv 6 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql host Drop_priv 8 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql host Execute_priv 19 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql host Grant_priv 9 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql host Host 1 NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI select,insert,update,references NEVER NULL -def mysql host Index_priv 11 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql host Insert_priv 4 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql host Lock_tables_priv 14 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql host References_priv 10 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql host Select_priv 3 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql host Show_view_priv 16 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql host Trigger_priv 20 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql host Update_priv 5 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql host Alter_priv 12 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql host Alter_routine_priv 18 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql host Create_priv 7 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql host Create_routine_priv 17 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql host Create_tmp_table_priv 13 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql host Create_view_priv 15 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql host Db 2 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI select,insert,update,references NEVER NULL +def mysql host Delete_priv 6 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql host Drop_priv 8 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql host Execute_priv 19 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql host Grant_priv 9 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql host Host 1 '' NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI select,insert,update,references NEVER NULL +def mysql host Index_priv 11 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql host Insert_priv 4 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql host Lock_tables_priv 14 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql host References_priv 10 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql host Select_priv 3 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql host Show_view_priv 16 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql host Trigger_priv 20 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql host Update_priv 5 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL def mysql index_stats avg_frequency 5 NULL YES decimal NULL NULL 12 4 NULL NULL NULL decimal(12,4) select,insert,update,references NEVER NULL def mysql index_stats db_name 1 NULL NO varchar 64 192 NULL NULL NULL utf8 utf8_bin varchar(64) PRI select,insert,update,references NEVER NULL def mysql index_stats index_name 3 NULL NO varchar 64 192 NULL NULL NULL utf8 utf8_bin varchar(64) PRI select,insert,update,references NEVER NULL @@ -131,56 +131,56 @@ def mysql innodb_table_stats last_update 3 current_timestamp() NO timestamp NULL def mysql innodb_table_stats n_rows 4 NULL NO bigint NULL NULL 20 0 NULL NULL NULL bigint(20) unsigned select,insert,update,references NEVER NULL def mysql innodb_table_stats sum_of_other_index_sizes 6 NULL NO bigint NULL NULL 20 0 NULL NULL NULL bigint(20) unsigned select,insert,update,references NEVER NULL def mysql innodb_table_stats table_name 2 NULL NO varchar 64 192 NULL NULL NULL utf8 utf8_bin varchar(64) PRI select,insert,update,references NEVER NULL -def mysql plugin dl 2 NO varchar 128 384 NULL NULL NULL utf8 utf8_general_ci varchar(128) select,insert,update,references NEVER NULL -def mysql plugin name 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) PRI select,insert,update,references NEVER NULL +def mysql plugin dl 2 '' NO varchar 128 384 NULL NULL NULL utf8 utf8_general_ci varchar(128) select,insert,update,references NEVER NULL +def mysql plugin name 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) PRI select,insert,update,references NEVER NULL def mysql proc body 11 NULL NO longblob 4294967295 4294967295 NULL NULL NULL NULL NULL longblob select,insert,update,references NEVER NULL def mysql proc body_utf8 20 NULL YES longblob 4294967295 4294967295 NULL NULL NULL NULL NULL longblob select,insert,update,references NEVER NULL def mysql proc character_set_client 17 NULL YES char 32 96 NULL NULL NULL utf8 utf8_bin char(32) select,insert,update,references NEVER NULL def mysql proc collation_connection 18 NULL YES char 32 96 NULL NULL NULL utf8 utf8_bin char(32) select,insert,update,references NEVER NULL def mysql proc comment 16 NULL NO text 65535 65535 NULL NULL NULL utf8 utf8_bin text select,insert,update,references NEVER NULL def mysql proc created 13 current_timestamp() NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp on update current_timestamp() select,insert,update,references NEVER NULL -def mysql proc db 1 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI select,insert,update,references NEVER NULL +def mysql proc db 1 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI select,insert,update,references NEVER NULL def mysql proc db_collation 19 NULL YES char 32 96 NULL NULL NULL utf8 utf8_bin char(32) select,insert,update,references NEVER NULL -def mysql proc definer 12 NO char 141 423 NULL NULL NULL utf8 utf8_bin char(141) select,insert,update,references NEVER NULL -def mysql proc is_deterministic 7 NO NO enum 3 9 NULL NULL NULL utf8 utf8_general_ci enum('YES','NO') select,insert,update,references NEVER NULL -def mysql proc language 5 SQL NO enum 3 9 NULL NULL NULL utf8 utf8_general_ci enum('SQL') select,insert,update,references NEVER NULL -def mysql proc modified 14 0000-00-00 00:00:00 NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL -def mysql proc name 2 NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) PRI select,insert,update,references NEVER NULL +def mysql proc definer 12 '' NO char 141 423 NULL NULL NULL utf8 utf8_bin char(141) select,insert,update,references NEVER NULL +def mysql proc is_deterministic 7 'NO' NO enum 3 9 NULL NULL NULL utf8 utf8_general_ci enum('YES','NO') select,insert,update,references NEVER NULL +def mysql proc language 5 'SQL' NO enum 3 9 NULL NULL NULL utf8 utf8_general_ci enum('SQL') select,insert,update,references NEVER NULL +def mysql proc modified 14 '0000-00-00 00:00:00' NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL +def mysql proc name 2 '' NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) PRI select,insert,update,references NEVER NULL def mysql proc param_list 9 NULL NO blob 65535 65535 NULL NULL NULL NULL NULL blob select,insert,update,references NEVER NULL def mysql proc returns 10 NULL NO longblob 4294967295 4294967295 NULL NULL NULL NULL NULL longblob select,insert,update,references NEVER NULL -def mysql proc security_type 8 DEFINER NO enum 7 21 NULL NULL NULL utf8 utf8_general_ci enum('INVOKER','DEFINER') select,insert,update,references NEVER NULL -def mysql proc specific_name 4 NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) select,insert,update,references NEVER NULL -def mysql proc sql_data_access 6 CONTAINS_SQL NO enum 17 51 NULL NULL NULL utf8 utf8_general_ci enum('CONTAINS_SQL','NO_SQL','READS_SQL_DATA','MODIFIES_SQL_DATA') select,insert,update,references NEVER NULL -def mysql proc sql_mode 15 NO set 494 1482 NULL NULL NULL utf8 utf8_general_ci set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') select,insert,update,references NEVER NULL +def mysql proc security_type 8 'DEFINER' NO enum 7 21 NULL NULL NULL utf8 utf8_general_ci enum('INVOKER','DEFINER') select,insert,update,references NEVER NULL +def mysql proc specific_name 4 '' NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) select,insert,update,references NEVER NULL +def mysql proc sql_data_access 6 'CONTAINS_SQL' NO enum 17 51 NULL NULL NULL utf8 utf8_general_ci enum('CONTAINS_SQL','NO_SQL','READS_SQL_DATA','MODIFIES_SQL_DATA') select,insert,update,references NEVER NULL +def mysql proc sql_mode 15 '' NO set 494 1482 NULL NULL NULL utf8 utf8_general_ci set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') select,insert,update,references NEVER NULL def mysql proc type 3 NULL NO enum 9 27 NULL NULL NULL utf8 utf8_general_ci enum('FUNCTION','PROCEDURE') PRI select,insert,update,references NEVER NULL -def mysql procs_priv Db 2 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI select,insert,update,references NEVER NULL -def mysql procs_priv Grantor 6 NO char 141 423 NULL NULL NULL utf8 utf8_bin char(141) MUL select,insert,update,references NEVER NULL -def mysql procs_priv Host 1 NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI select,insert,update,references NEVER NULL -def mysql procs_priv Proc_priv 7 NO set 27 81 NULL NULL NULL utf8 utf8_general_ci set('Execute','Alter Routine','Grant') select,insert,update,references NEVER NULL -def mysql procs_priv Routine_name 4 NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) PRI select,insert,update,references NEVER NULL +def mysql procs_priv Db 2 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI select,insert,update,references NEVER NULL +def mysql procs_priv Grantor 6 '' NO char 141 423 NULL NULL NULL utf8 utf8_bin char(141) MUL select,insert,update,references NEVER NULL +def mysql procs_priv Host 1 '' NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI select,insert,update,references NEVER NULL +def mysql procs_priv Proc_priv 7 '' NO set 27 81 NULL NULL NULL utf8 utf8_general_ci set('Execute','Alter Routine','Grant') select,insert,update,references NEVER NULL +def mysql procs_priv Routine_name 4 '' NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) PRI select,insert,update,references NEVER NULL def mysql procs_priv Routine_type 5 NULL NO enum 9 27 NULL NULL NULL utf8 utf8_bin enum('FUNCTION','PROCEDURE') PRI select,insert,update,references NEVER NULL def mysql procs_priv Timestamp 8 current_timestamp() NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp on update current_timestamp() select,insert,update,references NEVER NULL -def mysql procs_priv User 3 NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI select,insert,update,references NEVER NULL -def mysql proxies_priv Grantor 6 NO char 141 423 NULL NULL NULL utf8 utf8_bin char(141) MUL select,insert,update,references NEVER NULL -def mysql proxies_priv Host 1 NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI select,insert,update,references NEVER NULL -def mysql proxies_priv Proxied_host 3 NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI select,insert,update,references NEVER NULL -def mysql proxies_priv Proxied_user 4 NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI select,insert,update,references NEVER NULL +def mysql procs_priv User 3 '' NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI select,insert,update,references NEVER NULL +def mysql proxies_priv Grantor 6 '' NO char 141 423 NULL NULL NULL utf8 utf8_bin char(141) MUL select,insert,update,references NEVER NULL +def mysql proxies_priv Host 1 '' NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI select,insert,update,references NEVER NULL +def mysql proxies_priv Proxied_host 3 '' NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI select,insert,update,references NEVER NULL +def mysql proxies_priv Proxied_user 4 '' NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI select,insert,update,references NEVER NULL def mysql proxies_priv Timestamp 7 current_timestamp() NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp on update current_timestamp() select,insert,update,references NEVER NULL -def mysql proxies_priv User 2 NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI select,insert,update,references NEVER NULL +def mysql proxies_priv User 2 '' NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI select,insert,update,references NEVER NULL def mysql proxies_priv With_grant 5 0 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(1) select,insert,update,references NEVER NULL -def mysql roles_mapping Admin_option 4 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql roles_mapping Host 1 NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI select,insert,update,references NEVER NULL -def mysql roles_mapping Role 3 NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI select,insert,update,references NEVER NULL -def mysql roles_mapping User 2 NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI select,insert,update,references NEVER NULL -def mysql servers Db 3 NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) select,insert,update,references NEVER NULL -def mysql servers Host 2 NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) select,insert,update,references NEVER NULL -def mysql servers Owner 9 NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) select,insert,update,references NEVER NULL -def mysql servers Password 5 NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) select,insert,update,references NEVER NULL +def mysql roles_mapping Admin_option 4 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql roles_mapping Host 1 '' NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI select,insert,update,references NEVER NULL +def mysql roles_mapping Role 3 '' NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI select,insert,update,references NEVER NULL +def mysql roles_mapping User 2 '' NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI select,insert,update,references NEVER NULL +def mysql servers Db 3 '' NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) select,insert,update,references NEVER NULL +def mysql servers Host 2 '' NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) select,insert,update,references NEVER NULL +def mysql servers Owner 9 '' NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) select,insert,update,references NEVER NULL +def mysql servers Password 5 '' NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) select,insert,update,references NEVER NULL def mysql servers Port 6 0 NO int NULL NULL 10 0 NULL NULL NULL int(4) select,insert,update,references NEVER NULL -def mysql servers Server_name 1 NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) PRI select,insert,update,references NEVER NULL -def mysql servers Socket 7 NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) select,insert,update,references NEVER NULL -def mysql servers Username 4 NO char 80 240 NULL NULL NULL utf8 utf8_general_ci char(80) select,insert,update,references NEVER NULL -def mysql servers Wrapper 8 NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) select,insert,update,references NEVER NULL +def mysql servers Server_name 1 '' NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) PRI select,insert,update,references NEVER NULL +def mysql servers Socket 7 '' NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) select,insert,update,references NEVER NULL +def mysql servers Username 4 '' NO char 80 240 NULL NULL NULL utf8 utf8_general_ci char(80) select,insert,update,references NEVER NULL +def mysql servers Wrapper 8 '' NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) select,insert,update,references NEVER NULL def mysql slow_log db 7 NULL NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select,insert,update,references NEVER NULL def mysql slow_log insert_id 9 NULL NO int NULL NULL 10 0 NULL NULL NULL int(11) select,insert,update,references NEVER NULL def mysql slow_log last_insert_id 8 NULL NO int NULL NULL 10 0 NULL NULL NULL int(11) select,insert,update,references NEVER NULL @@ -194,19 +194,19 @@ def mysql slow_log sql_text 11 NULL NO mediumtext 16777215 16777215 NULL NULL NU def mysql slow_log start_time 1 current_timestamp(6) NO timestamp NULL NULL NULL NULL 6 NULL NULL timestamp(6) on update current_timestamp(6) select,insert,update,references NEVER NULL def mysql slow_log thread_id 12 NULL NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select,insert,update,references NEVER NULL def mysql slow_log user_host 2 NULL NO mediumtext 16777215 16777215 NULL NULL NULL utf8 utf8_general_ci mediumtext select,insert,update,references NEVER NULL -def mysql tables_priv Column_priv 8 NO set 31 93 NULL NULL NULL utf8 utf8_general_ci set('Select','Insert','Update','References') select,insert,update,references NEVER NULL -def mysql tables_priv Db 2 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI select,insert,update,references NEVER NULL -def mysql tables_priv Grantor 5 NO char 141 423 NULL NULL NULL utf8 utf8_bin char(141) MUL select,insert,update,references NEVER NULL -def mysql tables_priv Host 1 NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI select,insert,update,references NEVER NULL -def mysql tables_priv Table_name 4 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI select,insert,update,references NEVER NULL -def mysql tables_priv Table_priv 7 NO set 98 294 NULL NULL NULL utf8 utf8_general_ci set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') select,insert,update,references NEVER NULL +def mysql tables_priv Column_priv 8 '' NO set 31 93 NULL NULL NULL utf8 utf8_general_ci set('Select','Insert','Update','References') select,insert,update,references NEVER NULL +def mysql tables_priv Db 2 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI select,insert,update,references NEVER NULL +def mysql tables_priv Grantor 5 '' NO char 141 423 NULL NULL NULL utf8 utf8_bin char(141) MUL select,insert,update,references NEVER NULL +def mysql tables_priv Host 1 '' NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI select,insert,update,references NEVER NULL +def mysql tables_priv Table_name 4 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI select,insert,update,references NEVER NULL +def mysql tables_priv Table_priv 7 '' NO set 98 294 NULL NULL NULL utf8 utf8_general_ci set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') select,insert,update,references NEVER NULL def mysql tables_priv Timestamp 6 current_timestamp() NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp on update current_timestamp() select,insert,update,references NEVER NULL -def mysql tables_priv User 3 NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI select,insert,update,references NEVER NULL +def mysql tables_priv User 3 '' NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI select,insert,update,references NEVER NULL def mysql table_stats cardinality 3 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned select,insert,update,references NEVER NULL def mysql table_stats db_name 1 NULL NO varchar 64 192 NULL NULL NULL utf8 utf8_bin varchar(64) PRI select,insert,update,references NEVER NULL def mysql table_stats table_name 2 NULL NO varchar 64 192 NULL NULL NULL utf8 utf8_bin varchar(64) PRI select,insert,update,references NEVER NULL def mysql time_zone Time_zone_id 1 NULL NO int NULL NULL 10 0 NULL NULL NULL int(10) unsigned PRI auto_increment select,insert,update,references NEVER NULL -def mysql time_zone Use_leap_seconds 2 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('Y','N') select,insert,update,references NEVER NULL +def mysql time_zone Use_leap_seconds 2 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('Y','N') select,insert,update,references NEVER NULL def mysql time_zone_leap_second Correction 2 NULL NO int NULL NULL 10 0 NULL NULL NULL int(11) select,insert,update,references NEVER NULL def mysql time_zone_leap_second Transition_time 1 NULL NO bigint NULL NULL 19 0 NULL NULL NULL bigint(20) PRI select,insert,update,references NEVER NULL def mysql time_zone_name Name 1 NULL NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) PRI select,insert,update,references NEVER NULL @@ -214,55 +214,55 @@ def mysql time_zone_name Time_zone_id 2 NULL NO int NULL NULL 10 0 NULL NULL NUL def mysql time_zone_transition Time_zone_id 1 NULL NO int NULL NULL 10 0 NULL NULL NULL int(10) unsigned PRI select,insert,update,references NEVER NULL def mysql time_zone_transition Transition_time 2 NULL NO bigint NULL NULL 19 0 NULL NULL NULL bigint(20) PRI select,insert,update,references NEVER NULL def mysql time_zone_transition Transition_type_id 3 NULL NO int NULL NULL 10 0 NULL NULL NULL int(10) unsigned select,insert,update,references NEVER NULL -def mysql time_zone_transition_type Abbreviation 5 NO char 8 24 NULL NULL NULL utf8 utf8_general_ci char(8) select,insert,update,references NEVER NULL +def mysql time_zone_transition_type Abbreviation 5 '' NO char 8 24 NULL NULL NULL utf8 utf8_general_ci char(8) select,insert,update,references NEVER NULL def mysql time_zone_transition_type Is_DST 4 0 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(3) unsigned select,insert,update,references NEVER NULL def mysql time_zone_transition_type Offset 3 0 NO int NULL NULL 10 0 NULL NULL NULL int(11) select,insert,update,references NEVER NULL def mysql time_zone_transition_type Time_zone_id 1 NULL NO int NULL NULL 10 0 NULL NULL NULL int(10) unsigned PRI select,insert,update,references NEVER NULL def mysql time_zone_transition_type Transition_type_id 2 NULL NO int NULL NULL 10 0 NULL NULL NULL int(10) unsigned PRI select,insert,update,references NEVER NULL -def mysql user Alter_priv 17 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user Alter_routine_priv 28 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Alter_priv 17 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Alter_routine_priv 28 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL def mysql user authentication_string 42 NULL NO text 65535 65535 NULL NULL NULL utf8 utf8_bin text select,insert,update,references NEVER NULL -def mysql user Create_priv 8 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user Create_routine_priv 27 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user Create_tablespace_priv 32 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user Create_tmp_table_priv 20 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user Create_user_priv 29 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user Create_view_priv 25 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user default_role 45 NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) select,insert,update,references NEVER NULL -def mysql user Delete_priv 7 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user Drop_priv 9 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user Event_priv 30 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user Execute_priv 22 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user File_priv 13 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user Grant_priv 14 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user Host 1 NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI select,insert,update,references NEVER NULL -def mysql user Index_priv 16 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user Insert_priv 5 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user is_role 44 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user Lock_tables_priv 21 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Create_priv 8 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Create_routine_priv 27 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Create_tablespace_priv 32 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Create_tmp_table_priv 20 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Create_user_priv 29 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Create_view_priv 25 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user default_role 45 '' NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) select,insert,update,references NEVER NULL +def mysql user Delete_priv 7 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Drop_priv 9 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Event_priv 30 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Execute_priv 22 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user File_priv 13 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Grant_priv 14 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Host 1 '' NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI select,insert,update,references NEVER NULL +def mysql user Index_priv 16 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Insert_priv 5 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user is_role 44 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Lock_tables_priv 21 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL def mysql user max_connections 39 0 NO int NULL NULL 10 0 NULL NULL NULL int(11) unsigned select,insert,update,references NEVER NULL def mysql user max_questions 37 0 NO int NULL NULL 10 0 NULL NULL NULL int(11) unsigned select,insert,update,references NEVER NULL def mysql user max_statement_time 46 0.000000 NO decimal NULL NULL 12 6 NULL NULL NULL decimal(12,6) select,insert,update,references NEVER NULL def mysql user max_updates 38 0 NO int NULL NULL 10 0 NULL NULL NULL int(11) unsigned select,insert,update,references NEVER NULL def mysql user max_user_connections 40 0 NO int NULL NULL 10 0 NULL NULL NULL int(11) select,insert,update,references NEVER NULL -def mysql user Password 3 NO char 41 41 NULL NULL NULL latin1 latin1_bin char(41) select,insert,update,references NEVER NULL -def mysql user password_expired 43 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user plugin 41 NO char 64 64 NULL NULL NULL latin1 latin1_swedish_ci char(64) select,insert,update,references NEVER NULL -def mysql user Process_priv 12 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user References_priv 15 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user Reload_priv 10 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user Repl_client_priv 24 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user Repl_slave_priv 23 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user Select_priv 4 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user Show_db_priv 18 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user Show_view_priv 26 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user Shutdown_priv 11 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Password 3 '' NO char 41 41 NULL NULL NULL latin1 latin1_bin char(41) select,insert,update,references NEVER NULL +def mysql user password_expired 43 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user plugin 41 '' NO char 64 64 NULL NULL NULL latin1 latin1_swedish_ci char(64) select,insert,update,references NEVER NULL +def mysql user Process_priv 12 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user References_priv 15 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Reload_priv 10 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Repl_client_priv 24 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Repl_slave_priv 23 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Select_priv 4 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Show_db_priv 18 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Show_view_priv 26 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Shutdown_priv 11 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL def mysql user ssl_cipher 34 NULL NO blob 65535 65535 NULL NULL NULL NULL NULL blob select,insert,update,references NEVER NULL -def mysql user ssl_type 33 NO enum 9 27 NULL NULL NULL utf8 utf8_general_ci enum('','ANY','X509','SPECIFIED') select,insert,update,references NEVER NULL -def mysql user Super_priv 19 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user Trigger_priv 31 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user Update_priv 6 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL -def mysql user User 2 NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI select,insert,update,references NEVER NULL +def mysql user ssl_type 33 '' NO enum 9 27 NULL NULL NULL utf8 utf8_general_ci enum('','ANY','X509','SPECIFIED') select,insert,update,references NEVER NULL +def mysql user Super_priv 19 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Trigger_priv 31 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user Update_priv 6 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') select,insert,update,references NEVER NULL +def mysql user User 2 '' NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI select,insert,update,references NEVER NULL def mysql user x509_issuer 35 NULL NO blob 65535 65535 NULL NULL NULL NULL NULL blob select,insert,update,references NEVER NULL def mysql user x509_subject 36 NULL NO blob 65535 65535 NULL NULL NULL NULL NULL blob select,insert,update,references NEVER NULL ########################################################################## diff --git a/mysql-test/suite/funcs_1/r/is_columns_mysql_embedded.result b/mysql-test/suite/funcs_1/r/is_columns_mysql_embedded.result index 9beb736edc6..22b4ddfc311 100644 --- a/mysql-test/suite/funcs_1/r/is_columns_mysql_embedded.result +++ b/mysql-test/suite/funcs_1/r/is_columns_mysql_embedded.result @@ -2,13 +2,13 @@ SELECT * FROM information_schema.columns WHERE table_schema = 'mysql' ORDER BY table_schema, table_name, column_name; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION COLUMN_DEFAULT IS_NULLABLE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE DATETIME_PRECISION CHARACTER_SET_NAME COLLATION_NAME COLUMN_TYPE COLUMN_KEY EXTRA PRIVILEGES COLUMN_COMMENT IS_GENERATED GENERATION_EXPRESSION -def mysql columns_priv Column_name 5 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI NEVER NULL -def mysql columns_priv Column_priv 7 NO set 31 93 NULL NULL NULL utf8 utf8_general_ci set('Select','Insert','Update','References') NEVER NULL -def mysql columns_priv Db 2 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI NEVER NULL -def mysql columns_priv Host 1 NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI NEVER NULL -def mysql columns_priv Table_name 4 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI NEVER NULL +def mysql columns_priv Column_name 5 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI NEVER NULL +def mysql columns_priv Column_priv 7 '' NO set 31 93 NULL NULL NULL utf8 utf8_general_ci set('Select','Insert','Update','References') NEVER NULL +def mysql columns_priv Db 2 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI NEVER NULL +def mysql columns_priv Host 1 '' NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI NEVER NULL +def mysql columns_priv Table_name 4 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI NEVER NULL def mysql columns_priv Timestamp 6 current_timestamp() NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp on update current_timestamp() NEVER NULL -def mysql columns_priv User 3 NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI NEVER NULL +def mysql columns_priv User 3 '' NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI NEVER NULL def mysql column_stats avg_frequency 8 NULL YES decimal NULL NULL 12 4 NULL NULL NULL decimal(12,4) NEVER NULL def mysql column_stats avg_length 7 NULL YES decimal NULL NULL 12 4 NULL NULL NULL decimal(12,4) NEVER NULL def mysql column_stats column_name 3 NULL NO varchar 64 192 NULL NULL NULL utf8 utf8_bin varchar(64) PRI NEVER NULL @@ -20,52 +20,52 @@ def mysql column_stats max_value 5 NULL YES varbinary 255 255 NULL NULL NULL NUL def mysql column_stats min_value 4 NULL YES varbinary 255 255 NULL NULL NULL NULL NULL varbinary(255) NEVER NULL def mysql column_stats nulls_ratio 6 NULL YES decimal NULL NULL 12 4 NULL NULL NULL decimal(12,4) NEVER NULL def mysql column_stats table_name 2 NULL NO varchar 64 192 NULL NULL NULL utf8 utf8_bin varchar(64) PRI NEVER NULL -def mysql db Alter_priv 13 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql db Alter_routine_priv 19 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql db Create_priv 8 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql db Create_routine_priv 18 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql db Create_tmp_table_priv 14 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql db Create_view_priv 16 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql db Db 2 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI NEVER NULL -def mysql db Delete_priv 7 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql db Drop_priv 9 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql db Event_priv 21 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql db Execute_priv 20 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql db Grant_priv 10 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql db Host 1 NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI NEVER NULL -def mysql db Index_priv 12 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql db Insert_priv 5 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql db Lock_tables_priv 15 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql db References_priv 11 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql db Select_priv 4 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql db Show_view_priv 17 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql db Trigger_priv 22 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql db Update_priv 6 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql db User 3 NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI NEVER NULL +def mysql db Alter_priv 13 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql db Alter_routine_priv 19 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql db Create_priv 8 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql db Create_routine_priv 18 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql db Create_tmp_table_priv 14 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql db Create_view_priv 16 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql db Db 2 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI NEVER NULL +def mysql db Delete_priv 7 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql db Drop_priv 9 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql db Event_priv 21 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql db Execute_priv 20 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql db Grant_priv 10 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql db Host 1 '' NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI NEVER NULL +def mysql db Index_priv 12 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql db Insert_priv 5 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql db Lock_tables_priv 15 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql db References_priv 11 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql db Select_priv 4 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql db Show_view_priv 17 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql db Trigger_priv 22 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql db Update_priv 6 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql db User 3 '' NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI NEVER NULL def mysql event body 3 NULL NO longblob 4294967295 4294967295 NULL NULL NULL NULL NULL longblob NEVER NULL def mysql event body_utf8 22 NULL YES longblob 4294967295 4294967295 NULL NULL NULL NULL NULL longblob NEVER NULL def mysql event character_set_client 19 NULL YES char 32 96 NULL NULL NULL utf8 utf8_bin char(32) NEVER NULL def mysql event collation_connection 20 NULL YES char 32 96 NULL NULL NULL utf8 utf8_bin char(32) NEVER NULL -def mysql event comment 16 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) NEVER NULL +def mysql event comment 16 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) NEVER NULL def mysql event created 8 current_timestamp() NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp on update current_timestamp() NEVER NULL -def mysql event db 1 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI NEVER NULL +def mysql event db 1 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI NEVER NULL def mysql event db_collation 21 NULL YES char 32 96 NULL NULL NULL utf8 utf8_bin char(32) NEVER NULL -def mysql event definer 4 NO char 141 423 NULL NULL NULL utf8 utf8_bin char(141) NEVER NULL +def mysql event definer 4 '' NO char 141 423 NULL NULL NULL utf8 utf8_bin char(141) NEVER NULL def mysql event ends 12 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL def mysql event execute_at 5 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL def mysql event interval_field 7 NULL YES enum 18 54 NULL NULL NULL utf8 utf8_general_ci enum('YEAR','QUARTER','MONTH','DAY','HOUR','MINUTE','WEEK','SECOND','MICROSECOND','YEAR_MONTH','DAY_HOUR','DAY_MINUTE','DAY_SECOND','HOUR_MINUTE','HOUR_SECOND','MINUTE_SECOND','DAY_MICROSECOND','HOUR_MICROSECOND','MINUTE_MICROSECOND','SECOND_MICROSECOND') NEVER NULL def mysql event interval_value 6 NULL YES int NULL NULL 10 0 NULL NULL NULL int(11) NEVER NULL def mysql event last_executed 10 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL -def mysql event modified 9 0000-00-00 00:00:00 NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp NEVER NULL -def mysql event name 2 NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) PRI NEVER NULL -def mysql event on_completion 14 DROP NO enum 8 24 NULL NULL NULL utf8 utf8_general_ci enum('DROP','PRESERVE') NEVER NULL +def mysql event modified 9 '0000-00-00 00:00:00' NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp NEVER NULL +def mysql event name 2 '' NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) PRI NEVER NULL +def mysql event on_completion 14 'DROP' NO enum 8 24 NULL NULL NULL utf8 utf8_general_ci enum('DROP','PRESERVE') NEVER NULL def mysql event originator 17 NULL NO int NULL NULL 10 0 NULL NULL NULL int(10) unsigned NEVER NULL -def mysql event sql_mode 15 NO set 494 1482 NULL NULL NULL utf8 utf8_general_ci set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') NEVER NULL +def mysql event sql_mode 15 '' NO set 494 1482 NULL NULL NULL utf8 utf8_general_ci set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') NEVER NULL def mysql event starts 11 NULL YES datetime NULL NULL NULL NULL 0 NULL NULL datetime NEVER NULL -def mysql event status 13 ENABLED NO enum 18 54 NULL NULL NULL utf8 utf8_general_ci enum('ENABLED','DISABLED','SLAVESIDE_DISABLED') NEVER NULL -def mysql event time_zone 18 SYSTEM NO char 64 64 NULL NULL NULL latin1 latin1_swedish_ci char(64) NEVER NULL -def mysql func dl 3 NO char 128 384 NULL NULL NULL utf8 utf8_bin char(128) NEVER NULL -def mysql func name 1 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI NEVER NULL +def mysql event status 13 'ENABLED' NO enum 18 54 NULL NULL NULL utf8 utf8_general_ci enum('ENABLED','DISABLED','SLAVESIDE_DISABLED') NEVER NULL +def mysql event time_zone 18 'SYSTEM' NO char 64 64 NULL NULL NULL latin1 latin1_swedish_ci char(64) NEVER NULL +def mysql func dl 3 '' NO char 128 384 NULL NULL NULL utf8 utf8_bin char(128) NEVER NULL +def mysql func name 1 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI NEVER NULL def mysql func ret 2 0 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(1) NEVER NULL def mysql func type 4 NULL NO enum 9 27 NULL NULL NULL utf8 utf8_general_ci enum('function','aggregate') NEVER NULL def mysql general_log argument 6 NULL NO mediumtext 16777215 16777215 NULL NULL NULL utf8 utf8_general_ci mediumtext NEVER NULL @@ -92,81 +92,81 @@ def mysql help_topic help_category_id 3 NULL NO smallint NULL NULL 5 0 NULL NULL def mysql help_topic help_topic_id 1 NULL NO int NULL NULL 10 0 NULL NULL NULL int(10) unsigned PRI NEVER NULL def mysql help_topic name 2 NULL NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) UNI NEVER NULL def mysql help_topic url 6 NULL NO text 65535 65535 NULL NULL NULL utf8 utf8_general_ci text NEVER NULL -def mysql host Alter_priv 12 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql host Alter_routine_priv 18 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql host Create_priv 7 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql host Create_routine_priv 17 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql host Create_tmp_table_priv 13 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql host Create_view_priv 15 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql host Db 2 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI NEVER NULL -def mysql host Delete_priv 6 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql host Drop_priv 8 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql host Execute_priv 19 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql host Grant_priv 9 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql host Host 1 NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI NEVER NULL -def mysql host Index_priv 11 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql host Insert_priv 4 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql host Lock_tables_priv 14 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql host References_priv 10 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql host Select_priv 3 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql host Show_view_priv 16 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql host Trigger_priv 20 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql host Update_priv 5 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql host Alter_priv 12 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql host Alter_routine_priv 18 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql host Create_priv 7 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql host Create_routine_priv 17 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql host Create_tmp_table_priv 13 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql host Create_view_priv 15 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql host Db 2 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI NEVER NULL +def mysql host Delete_priv 6 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql host Drop_priv 8 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql host Execute_priv 19 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql host Grant_priv 9 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql host Host 1 '' NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI NEVER NULL +def mysql host Index_priv 11 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql host Insert_priv 4 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql host Lock_tables_priv 14 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql host References_priv 10 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql host Select_priv 3 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql host Show_view_priv 16 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql host Trigger_priv 20 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql host Update_priv 5 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL def mysql index_stats avg_frequency 5 NULL YES decimal NULL NULL 12 4 NULL NULL NULL decimal(12,4) NEVER NULL def mysql index_stats db_name 1 NULL NO varchar 64 192 NULL NULL NULL utf8 utf8_bin varchar(64) PRI NEVER NULL def mysql index_stats index_name 3 NULL NO varchar 64 192 NULL NULL NULL utf8 utf8_bin varchar(64) PRI NEVER NULL def mysql index_stats prefix_arity 4 NULL NO int NULL NULL 10 0 NULL NULL NULL int(11) unsigned PRI NEVER NULL def mysql index_stats table_name 2 NULL NO varchar 64 192 NULL NULL NULL utf8 utf8_bin varchar(64) PRI NEVER NULL -def mysql plugin dl 2 NO varchar 128 384 NULL NULL NULL utf8 utf8_general_ci varchar(128) NEVER NULL -def mysql plugin name 1 NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) PRI NEVER NULL +def mysql plugin dl 2 '' NO varchar 128 384 NULL NULL NULL utf8 utf8_general_ci varchar(128) NEVER NULL +def mysql plugin name 1 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) PRI NEVER NULL def mysql proc body 11 NULL NO longblob 4294967295 4294967295 NULL NULL NULL NULL NULL longblob NEVER NULL def mysql proc body_utf8 20 NULL YES longblob 4294967295 4294967295 NULL NULL NULL NULL NULL longblob NEVER NULL def mysql proc character_set_client 17 NULL YES char 32 96 NULL NULL NULL utf8 utf8_bin char(32) NEVER NULL def mysql proc collation_connection 18 NULL YES char 32 96 NULL NULL NULL utf8 utf8_bin char(32) NEVER NULL def mysql proc comment 16 NULL NO text 65535 65535 NULL NULL NULL utf8 utf8_bin text NEVER NULL def mysql proc created 13 current_timestamp() NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp on update current_timestamp() NEVER NULL -def mysql proc db 1 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI NEVER NULL +def mysql proc db 1 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI NEVER NULL def mysql proc db_collation 19 NULL YES char 32 96 NULL NULL NULL utf8 utf8_bin char(32) NEVER NULL -def mysql proc definer 12 NO char 141 423 NULL NULL NULL utf8 utf8_bin char(141) NEVER NULL -def mysql proc is_deterministic 7 NO NO enum 3 9 NULL NULL NULL utf8 utf8_general_ci enum('YES','NO') NEVER NULL -def mysql proc language 5 SQL NO enum 3 9 NULL NULL NULL utf8 utf8_general_ci enum('SQL') NEVER NULL -def mysql proc modified 14 0000-00-00 00:00:00 NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp NEVER NULL -def mysql proc name 2 NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) PRI NEVER NULL +def mysql proc definer 12 '' NO char 141 423 NULL NULL NULL utf8 utf8_bin char(141) NEVER NULL +def mysql proc is_deterministic 7 'NO' NO enum 3 9 NULL NULL NULL utf8 utf8_general_ci enum('YES','NO') NEVER NULL +def mysql proc language 5 'SQL' NO enum 3 9 NULL NULL NULL utf8 utf8_general_ci enum('SQL') NEVER NULL +def mysql proc modified 14 '0000-00-00 00:00:00' NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp NEVER NULL +def mysql proc name 2 '' NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) PRI NEVER NULL def mysql proc param_list 9 NULL NO blob 65535 65535 NULL NULL NULL NULL NULL blob NEVER NULL def mysql proc returns 10 NULL NO longblob 4294967295 4294967295 NULL NULL NULL NULL NULL longblob NEVER NULL -def mysql proc security_type 8 DEFINER NO enum 7 21 NULL NULL NULL utf8 utf8_general_ci enum('INVOKER','DEFINER') NEVER NULL -def mysql proc specific_name 4 NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) NEVER NULL -def mysql proc sql_data_access 6 CONTAINS_SQL NO enum 17 51 NULL NULL NULL utf8 utf8_general_ci enum('CONTAINS_SQL','NO_SQL','READS_SQL_DATA','MODIFIES_SQL_DATA') NEVER NULL -def mysql proc sql_mode 15 NO set 494 1482 NULL NULL NULL utf8 utf8_general_ci set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') NEVER NULL +def mysql proc security_type 8 'DEFINER' NO enum 7 21 NULL NULL NULL utf8 utf8_general_ci enum('INVOKER','DEFINER') NEVER NULL +def mysql proc specific_name 4 '' NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) NEVER NULL +def mysql proc sql_data_access 6 'CONTAINS_SQL' NO enum 17 51 NULL NULL NULL utf8 utf8_general_ci enum('CONTAINS_SQL','NO_SQL','READS_SQL_DATA','MODIFIES_SQL_DATA') NEVER NULL +def mysql proc sql_mode 15 '' NO set 494 1482 NULL NULL NULL utf8 utf8_general_ci set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') NEVER NULL def mysql proc type 3 NULL NO enum 9 27 NULL NULL NULL utf8 utf8_general_ci enum('FUNCTION','PROCEDURE') PRI NEVER NULL -def mysql procs_priv Db 2 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI NEVER NULL -def mysql procs_priv Grantor 6 NO char 141 423 NULL NULL NULL utf8 utf8_bin char(141) MUL NEVER NULL -def mysql procs_priv Host 1 NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI NEVER NULL -def mysql procs_priv Proc_priv 7 NO set 27 81 NULL NULL NULL utf8 utf8_general_ci set('Execute','Alter Routine','Grant') NEVER NULL -def mysql procs_priv Routine_name 4 NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) PRI NEVER NULL +def mysql procs_priv Db 2 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI NEVER NULL +def mysql procs_priv Grantor 6 '' NO char 141 423 NULL NULL NULL utf8 utf8_bin char(141) MUL NEVER NULL +def mysql procs_priv Host 1 '' NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI NEVER NULL +def mysql procs_priv Proc_priv 7 '' NO set 27 81 NULL NULL NULL utf8 utf8_general_ci set('Execute','Alter Routine','Grant') NEVER NULL +def mysql procs_priv Routine_name 4 '' NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) PRI NEVER NULL def mysql procs_priv Routine_type 5 NULL NO enum 9 27 NULL NULL NULL utf8 utf8_bin enum('FUNCTION','PROCEDURE') PRI NEVER NULL def mysql procs_priv Timestamp 8 current_timestamp() NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp on update current_timestamp() NEVER NULL -def mysql procs_priv User 3 NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI NEVER NULL -def mysql proxies_priv Grantor 6 NO char 141 423 NULL NULL NULL utf8 utf8_bin char(141) MUL NEVER NULL -def mysql proxies_priv Host 1 NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI NEVER NULL -def mysql proxies_priv Proxied_host 3 NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI NEVER NULL -def mysql proxies_priv Proxied_user 4 NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI NEVER NULL +def mysql procs_priv User 3 '' NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI NEVER NULL +def mysql proxies_priv Grantor 6 '' NO char 141 423 NULL NULL NULL utf8 utf8_bin char(141) MUL NEVER NULL +def mysql proxies_priv Host 1 '' NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI NEVER NULL +def mysql proxies_priv Proxied_host 3 '' NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI NEVER NULL +def mysql proxies_priv Proxied_user 4 '' NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI NEVER NULL def mysql proxies_priv Timestamp 7 current_timestamp() NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp on update current_timestamp() NEVER NULL -def mysql proxies_priv User 2 NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI NEVER NULL +def mysql proxies_priv User 2 '' NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI NEVER NULL def mysql proxies_priv With_grant 5 0 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(1) NEVER NULL -def mysql roles_mapping Admin_option 4 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql roles_mapping Host 1 NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI NEVER NULL -def mysql roles_mapping Role 3 NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI NEVER NULL -def mysql roles_mapping User 2 NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI NEVER NULL -def mysql servers Db 3 NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) NEVER NULL -def mysql servers Host 2 NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) NEVER NULL -def mysql servers Owner 9 NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) NEVER NULL -def mysql servers Password 5 NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) NEVER NULL +def mysql roles_mapping Admin_option 4 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql roles_mapping Host 1 '' NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI NEVER NULL +def mysql roles_mapping Role 3 '' NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI NEVER NULL +def mysql roles_mapping User 2 '' NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI NEVER NULL +def mysql servers Db 3 '' NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) NEVER NULL +def mysql servers Host 2 '' NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) NEVER NULL +def mysql servers Owner 9 '' NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) NEVER NULL +def mysql servers Password 5 '' NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) NEVER NULL def mysql servers Port 6 0 NO int NULL NULL 10 0 NULL NULL NULL int(4) NEVER NULL -def mysql servers Server_name 1 NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) PRI NEVER NULL -def mysql servers Socket 7 NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) NEVER NULL -def mysql servers Username 4 NO char 80 240 NULL NULL NULL utf8 utf8_general_ci char(80) NEVER NULL -def mysql servers Wrapper 8 NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) NEVER NULL +def mysql servers Server_name 1 '' NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) PRI NEVER NULL +def mysql servers Socket 7 '' NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) NEVER NULL +def mysql servers Username 4 '' NO char 80 240 NULL NULL NULL utf8 utf8_general_ci char(80) NEVER NULL +def mysql servers Wrapper 8 '' NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) NEVER NULL def mysql slow_log db 7 NULL NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL def mysql slow_log insert_id 9 NULL NO int NULL NULL 10 0 NULL NULL NULL int(11) NEVER NULL def mysql slow_log last_insert_id 8 NULL NO int NULL NULL 10 0 NULL NULL NULL int(11) NEVER NULL @@ -180,19 +180,19 @@ def mysql slow_log sql_text 11 NULL NO mediumtext 16777215 16777215 NULL NULL NU def mysql slow_log start_time 1 current_timestamp(6) NO timestamp NULL NULL NULL NULL 6 NULL NULL timestamp(6) on update current_timestamp(6) NEVER NULL def mysql slow_log thread_id 12 NULL NO bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def mysql slow_log user_host 2 NULL NO mediumtext 16777215 16777215 NULL NULL NULL utf8 utf8_general_ci mediumtext NEVER NULL -def mysql tables_priv Column_priv 8 NO set 31 93 NULL NULL NULL utf8 utf8_general_ci set('Select','Insert','Update','References') NEVER NULL -def mysql tables_priv Db 2 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI NEVER NULL -def mysql tables_priv Grantor 5 NO char 141 423 NULL NULL NULL utf8 utf8_bin char(141) MUL NEVER NULL -def mysql tables_priv Host 1 NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI NEVER NULL -def mysql tables_priv Table_name 4 NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI NEVER NULL -def mysql tables_priv Table_priv 7 NO set 98 294 NULL NULL NULL utf8 utf8_general_ci set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') NEVER NULL +def mysql tables_priv Column_priv 8 '' NO set 31 93 NULL NULL NULL utf8 utf8_general_ci set('Select','Insert','Update','References') NEVER NULL +def mysql tables_priv Db 2 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI NEVER NULL +def mysql tables_priv Grantor 5 '' NO char 141 423 NULL NULL NULL utf8 utf8_bin char(141) MUL NEVER NULL +def mysql tables_priv Host 1 '' NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI NEVER NULL +def mysql tables_priv Table_name 4 '' NO char 64 192 NULL NULL NULL utf8 utf8_bin char(64) PRI NEVER NULL +def mysql tables_priv Table_priv 7 '' NO set 98 294 NULL NULL NULL utf8 utf8_general_ci set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') NEVER NULL def mysql tables_priv Timestamp 6 current_timestamp() NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp on update current_timestamp() NEVER NULL -def mysql tables_priv User 3 NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI NEVER NULL +def mysql tables_priv User 3 '' NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI NEVER NULL def mysql table_stats cardinality 3 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(21) unsigned NEVER NULL def mysql table_stats db_name 1 NULL NO varchar 64 192 NULL NULL NULL utf8 utf8_bin varchar(64) PRI NEVER NULL def mysql table_stats table_name 2 NULL NO varchar 64 192 NULL NULL NULL utf8 utf8_bin varchar(64) PRI NEVER NULL def mysql time_zone Time_zone_id 1 NULL NO int NULL NULL 10 0 NULL NULL NULL int(10) unsigned PRI auto_increment NEVER NULL -def mysql time_zone Use_leap_seconds 2 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('Y','N') NEVER NULL +def mysql time_zone Use_leap_seconds 2 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('Y','N') NEVER NULL def mysql time_zone_leap_second Correction 2 NULL NO int NULL NULL 10 0 NULL NULL NULL int(11) NEVER NULL def mysql time_zone_leap_second Transition_time 1 NULL NO bigint NULL NULL 19 0 NULL NULL NULL bigint(20) PRI NEVER NULL def mysql time_zone_name Name 1 NULL NO char 64 192 NULL NULL NULL utf8 utf8_general_ci char(64) PRI NEVER NULL @@ -200,55 +200,55 @@ def mysql time_zone_name Time_zone_id 2 NULL NO int NULL NULL 10 0 NULL NULL NUL def mysql time_zone_transition Time_zone_id 1 NULL NO int NULL NULL 10 0 NULL NULL NULL int(10) unsigned PRI NEVER NULL def mysql time_zone_transition Transition_time 2 NULL NO bigint NULL NULL 19 0 NULL NULL NULL bigint(20) PRI NEVER NULL def mysql time_zone_transition Transition_type_id 3 NULL NO int NULL NULL 10 0 NULL NULL NULL int(10) unsigned NEVER NULL -def mysql time_zone_transition_type Abbreviation 5 NO char 8 24 NULL NULL NULL utf8 utf8_general_ci char(8) NEVER NULL +def mysql time_zone_transition_type Abbreviation 5 '' NO char 8 24 NULL NULL NULL utf8 utf8_general_ci char(8) NEVER NULL def mysql time_zone_transition_type Is_DST 4 0 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(3) unsigned NEVER NULL def mysql time_zone_transition_type Offset 3 0 NO int NULL NULL 10 0 NULL NULL NULL int(11) NEVER NULL def mysql time_zone_transition_type Time_zone_id 1 NULL NO int NULL NULL 10 0 NULL NULL NULL int(10) unsigned PRI NEVER NULL def mysql time_zone_transition_type Transition_type_id 2 NULL NO int NULL NULL 10 0 NULL NULL NULL int(10) unsigned PRI NEVER NULL -def mysql user Alter_priv 17 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user Alter_routine_priv 28 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Alter_priv 17 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Alter_routine_priv 28 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL def mysql user authentication_string 42 NULL NO text 65535 65535 NULL NULL NULL utf8 utf8_bin text NEVER NULL -def mysql user Create_priv 8 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user Create_routine_priv 27 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user Create_tablespace_priv 32 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user Create_tmp_table_priv 20 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user Create_user_priv 29 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user Create_view_priv 25 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user default_role 45 NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) NEVER NULL -def mysql user Delete_priv 7 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user Drop_priv 9 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user Event_priv 30 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user Execute_priv 22 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user File_priv 13 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user Grant_priv 14 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user Host 1 NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI NEVER NULL -def mysql user Index_priv 16 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user Insert_priv 5 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user is_role 44 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user Lock_tables_priv 21 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Create_priv 8 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Create_routine_priv 27 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Create_tablespace_priv 32 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Create_tmp_table_priv 20 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Create_user_priv 29 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Create_view_priv 25 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user default_role 45 '' NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) NEVER NULL +def mysql user Delete_priv 7 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Drop_priv 9 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Event_priv 30 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Execute_priv 22 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user File_priv 13 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Grant_priv 14 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Host 1 '' NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) PRI NEVER NULL +def mysql user Index_priv 16 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Insert_priv 5 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user is_role 44 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Lock_tables_priv 21 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL def mysql user max_connections 39 0 NO int NULL NULL 10 0 NULL NULL NULL int(11) unsigned NEVER NULL def mysql user max_questions 37 0 NO int NULL NULL 10 0 NULL NULL NULL int(11) unsigned NEVER NULL def mysql user max_statement_time 46 0.000000 NO decimal NULL NULL 12 6 NULL NULL NULL decimal(12,6) NEVER NULL def mysql user max_updates 38 0 NO int NULL NULL 10 0 NULL NULL NULL int(11) unsigned NEVER NULL def mysql user max_user_connections 40 0 NO int NULL NULL 10 0 NULL NULL NULL int(11) NEVER NULL -def mysql user Password 3 NO char 41 41 NULL NULL NULL latin1 latin1_bin char(41) NEVER NULL -def mysql user password_expired 43 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user plugin 41 NO char 64 64 NULL NULL NULL latin1 latin1_swedish_ci char(64) NEVER NULL -def mysql user Process_priv 12 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user References_priv 15 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user Reload_priv 10 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user Repl_client_priv 24 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user Repl_slave_priv 23 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user Select_priv 4 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user Show_db_priv 18 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user Show_view_priv 26 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user Shutdown_priv 11 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Password 3 '' NO char 41 41 NULL NULL NULL latin1 latin1_bin char(41) NEVER NULL +def mysql user password_expired 43 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user plugin 41 '' NO char 64 64 NULL NULL NULL latin1 latin1_swedish_ci char(64) NEVER NULL +def mysql user Process_priv 12 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user References_priv 15 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Reload_priv 10 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Repl_client_priv 24 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Repl_slave_priv 23 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Select_priv 4 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Show_db_priv 18 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Show_view_priv 26 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Shutdown_priv 11 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL def mysql user ssl_cipher 34 NULL NO blob 65535 65535 NULL NULL NULL NULL NULL blob NEVER NULL -def mysql user ssl_type 33 NO enum 9 27 NULL NULL NULL utf8 utf8_general_ci enum('','ANY','X509','SPECIFIED') NEVER NULL -def mysql user Super_priv 19 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user Trigger_priv 31 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user Update_priv 6 N NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL -def mysql user User 2 NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI NEVER NULL +def mysql user ssl_type 33 '' NO enum 9 27 NULL NULL NULL utf8 utf8_general_ci enum('','ANY','X509','SPECIFIED') NEVER NULL +def mysql user Super_priv 19 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Trigger_priv 31 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user Update_priv 6 'N' NO enum 1 3 NULL NULL NULL utf8 utf8_general_ci enum('N','Y') NEVER NULL +def mysql user User 2 '' NO char 80 240 NULL NULL NULL utf8 utf8_bin char(80) PRI NEVER NULL def mysql user x509_issuer 35 NULL NO blob 65535 65535 NULL NULL NULL NULL NULL blob NEVER NULL def mysql user x509_subject 36 NULL NO blob 65535 65535 NULL NULL NULL NULL NULL blob NEVER NULL Warnings: diff --git a/mysql-test/suite/funcs_1/r/is_engines.result b/mysql-test/suite/funcs_1/r/is_engines.result index e76cbe7bdee..54372ae9f39 100644 --- a/mysql-test/suite/funcs_1/r/is_engines.result +++ b/mysql-test/suite/funcs_1/r/is_engines.result @@ -64,7 +64,7 @@ INSERT INTO information_schema.engines SELECT * FROM information_schema.engines; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' UPDATE information_schema.engines SET engine = '1234567'; -ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' +Got one of the listed errors DELETE FROM information_schema.engines WHERE support IN ('DEFAULT','YES'); ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' TRUNCATE information_schema.engines; diff --git a/mysql-test/suite/funcs_1/r/is_events.result b/mysql-test/suite/funcs_1/r/is_events.result index 3db6cc5e61d..ca9e7427513 100644 --- a/mysql-test/suite/funcs_1/r/is_events.result +++ b/mysql-test/suite/funcs_1/r/is_events.result @@ -128,7 +128,7 @@ SELECT * FROM information_schema.events; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' UPDATE information_schema.events SET event_name = '1234567' WHERE table_name = 't1'; -ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' +Got one of the listed errors DELETE FROM information_schema.events WHERE event_catalog IS NULL; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' TRUNCATE information_schema.events; diff --git a/mysql-test/suite/funcs_1/r/is_key_column_usage.result b/mysql-test/suite/funcs_1/r/is_key_column_usage.result index 80dd2db5441..fa2a738788e 100644 --- a/mysql-test/suite/funcs_1/r/is_key_column_usage.result +++ b/mysql-test/suite/funcs_1/r/is_key_column_usage.result @@ -345,28 +345,6 @@ db_datadict my_idx db_datadict t1_my_tablex f4 1 db_datadict my_idx db_datadict t1_my_tablex first_col 2 db_datadict PRIMARY db_datadict t1_my_tablex first_col 1 db_datadict PRIMARY db_datadict t1_my_tablex f2 2 -SELECT constraint_schema, constraint_name, table_schema, -table_name, column_name, ordinal_position -FROM information_schema.key_column_usage -WHERE table_name = 't1_my_tablex' -ORDER BY constraint_schema, constraint_name, table_schema, -table_name, ordinal_position; -constraint_schema constraint_name table_schema table_name column_name ordinal_position -db_datadict my_idx db_datadict t1_my_tablex f4 1 -db_datadict my_idx db_datadict t1_my_tablex first_col 2 -db_datadict PRIMARY db_datadict t1_my_tablex first_col 1 -db_datadict PRIMARY db_datadict t1_my_tablex f2 2 -ALTER TABLE db_datadict.t1_my_tablex -DROP COLUMN first_col; -SELECT constraint_schema, constraint_name, table_schema, -table_name, column_name, ordinal_position -FROM information_schema.key_column_usage -WHERE table_name = 't1_my_tablex' -ORDER BY constraint_schema, constraint_name, table_schema, -table_name, ordinal_position; -constraint_schema constraint_name table_schema table_name column_name ordinal_position -db_datadict my_idx db_datadict t1_my_tablex f4 1 -db_datadict PRIMARY db_datadict t1_my_tablex f2 1 SELECT table_name, column_name FROM information_schema.key_column_usage WHERE table_name = 't1_my_tablex' @@ -374,6 +352,8 @@ ORDER BY table_name, column_name; table_name column_name t1_my_tablex f2 t1_my_tablex f4 +t1_my_tablex first_col +t1_my_tablex first_col DROP TABLE db_datadict.t1_my_tablex; SELECT table_name, column_name FROM information_schema.key_column_usage @@ -419,7 +399,7 @@ SELECT * FROM information_schema.key_column_usage; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' UPDATE information_schema.key_column_usage SET table_name = 'db1' WHERE constraint_name = 'primary'; -ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' +Got one of the listed errors DELETE FROM information_schema.key_column_usage WHERE table_name = 't1'; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' TRUNCATE information_schema.key_column_usage; diff --git a/mysql-test/suite/funcs_1/r/is_key_column_usage_embedded.result b/mysql-test/suite/funcs_1/r/is_key_column_usage_embedded.result index a794bf8328b..4a6114f3da3 100644 --- a/mysql-test/suite/funcs_1/r/is_key_column_usage_embedded.result +++ b/mysql-test/suite/funcs_1/r/is_key_column_usage_embedded.result @@ -28,10 +28,10 @@ DROP FUNCTION test.f1; ######################################################################### DESCRIBE information_schema.KEY_COLUMN_USAGE; Field Type Null Key Default Extra -CONSTRAINT_CATALOG varchar(512) YES NULL +CONSTRAINT_CATALOG varchar(512) NO CONSTRAINT_SCHEMA varchar(64) NO CONSTRAINT_NAME varchar(64) NO -TABLE_CATALOG varchar(512) YES NULL +TABLE_CATALOG varchar(512) NO TABLE_SCHEMA varchar(64) NO TABLE_NAME varchar(64) NO COLUMN_NAME varchar(64) NO @@ -43,14 +43,14 @@ REFERENCED_COLUMN_NAME varchar(64) YES NULL SHOW CREATE TABLE information_schema.KEY_COLUMN_USAGE; Table Create Table KEY_COLUMN_USAGE CREATE TEMPORARY TABLE `KEY_COLUMN_USAGE` ( - `CONSTRAINT_CATALOG` varchar(512) DEFAULT NULL, + `CONSTRAINT_CATALOG` varchar(512) NOT NULL DEFAULT '', `CONSTRAINT_SCHEMA` varchar(64) NOT NULL DEFAULT '', `CONSTRAINT_NAME` varchar(64) NOT NULL DEFAULT '', - `TABLE_CATALOG` varchar(512) DEFAULT NULL, + `TABLE_CATALOG` varchar(512) NOT NULL DEFAULT '', `TABLE_SCHEMA` varchar(64) NOT NULL DEFAULT '', `TABLE_NAME` varchar(64) NOT NULL DEFAULT '', `COLUMN_NAME` varchar(64) NOT NULL DEFAULT '', - `ORDINAL_POSITION` bigint(10) NOT NULL DEFAULT '0', + `ORDINAL_POSITION` bigint(10) NOT NULL DEFAULT 0, `POSITION_IN_UNIQUE_CONSTRAINT` bigint(10) DEFAULT NULL, `REFERENCED_TABLE_SCHEMA` varchar(64) DEFAULT NULL, `REFERENCED_TABLE_NAME` varchar(64) DEFAULT NULL, @@ -58,10 +58,10 @@ KEY_COLUMN_USAGE CREATE TEMPORARY TABLE `KEY_COLUMN_USAGE` ( ) ENGINE=MEMORY DEFAULT CHARSET=utf8 SHOW COLUMNS FROM information_schema.KEY_COLUMN_USAGE; Field Type Null Key Default Extra -CONSTRAINT_CATALOG varchar(512) YES NULL +CONSTRAINT_CATALOG varchar(512) NO CONSTRAINT_SCHEMA varchar(64) NO CONSTRAINT_NAME varchar(64) NO -TABLE_CATALOG varchar(512) YES NULL +TABLE_CATALOG varchar(512) NO TABLE_SCHEMA varchar(64) NO TABLE_NAME varchar(64) NO COLUMN_NAME varchar(64) NO @@ -75,6 +75,74 @@ table_schema, table_name, column_name FROM information_schema.key_column_usage WHERE constraint_catalog IS NOT NULL OR table_catalog IS NOT NULL; constraint_catalog constraint_schema constraint_name table_catalog table_schema table_name column_name +def mysql PRIMARY def mysql column_stats db_name +def mysql PRIMARY def mysql column_stats table_name +def mysql PRIMARY def mysql column_stats column_name +def mysql PRIMARY def mysql columns_priv Host +def mysql PRIMARY def mysql columns_priv Db +def mysql PRIMARY def mysql columns_priv User +def mysql PRIMARY def mysql columns_priv Table_name +def mysql PRIMARY def mysql columns_priv Column_name +def mysql PRIMARY def mysql db Host +def mysql PRIMARY def mysql db Db +def mysql PRIMARY def mysql db User +def mysql PRIMARY def mysql event db +def mysql PRIMARY def mysql event name +def mysql PRIMARY def mysql func name +def mysql PRIMARY def mysql gtid_slave_pos domain_id +def mysql PRIMARY def mysql gtid_slave_pos sub_id +def mysql PRIMARY def mysql help_category help_category_id +def mysql name def mysql help_category name +def mysql PRIMARY def mysql help_keyword help_keyword_id +def mysql name def mysql help_keyword name +def mysql PRIMARY def mysql help_relation help_keyword_id +def mysql PRIMARY def mysql help_relation help_topic_id +def mysql PRIMARY def mysql help_topic help_topic_id +def mysql name def mysql help_topic name +def mysql PRIMARY def mysql host Host +def mysql PRIMARY def mysql host Db +def mysql PRIMARY def mysql index_stats db_name +def mysql PRIMARY def mysql index_stats table_name +def mysql PRIMARY def mysql index_stats index_name +def mysql PRIMARY def mysql index_stats prefix_arity +def mysql PRIMARY def mysql innodb_index_stats database_name +def mysql PRIMARY def mysql innodb_index_stats table_name +def mysql PRIMARY def mysql innodb_index_stats index_name +def mysql PRIMARY def mysql innodb_index_stats stat_name +def mysql PRIMARY def mysql innodb_table_stats database_name +def mysql PRIMARY def mysql innodb_table_stats table_name +def mysql PRIMARY def mysql plugin name +def mysql PRIMARY def mysql proc db +def mysql PRIMARY def mysql proc name +def mysql PRIMARY def mysql proc type +def mysql PRIMARY def mysql procs_priv Host +def mysql PRIMARY def mysql procs_priv Db +def mysql PRIMARY def mysql procs_priv User +def mysql PRIMARY def mysql procs_priv Routine_name +def mysql PRIMARY def mysql procs_priv Routine_type +def mysql PRIMARY def mysql proxies_priv Host +def mysql PRIMARY def mysql proxies_priv User +def mysql PRIMARY def mysql proxies_priv Proxied_host +def mysql PRIMARY def mysql proxies_priv Proxied_user +def mysql Host def mysql roles_mapping Host +def mysql Host def mysql roles_mapping User +def mysql Host def mysql roles_mapping Role +def mysql PRIMARY def mysql servers Server_name +def mysql PRIMARY def mysql table_stats db_name +def mysql PRIMARY def mysql table_stats table_name +def mysql PRIMARY def mysql tables_priv Host +def mysql PRIMARY def mysql tables_priv Db +def mysql PRIMARY def mysql tables_priv User +def mysql PRIMARY def mysql tables_priv Table_name +def mysql PRIMARY def mysql time_zone Time_zone_id +def mysql PRIMARY def mysql time_zone_leap_second Transition_time +def mysql PRIMARY def mysql time_zone_name Name +def mysql PRIMARY def mysql time_zone_transition Time_zone_id +def mysql PRIMARY def mysql time_zone_transition Transition_time +def mysql PRIMARY def mysql time_zone_transition_type Time_zone_id +def mysql PRIMARY def mysql time_zone_transition_type Transition_type_id +def mysql PRIMARY def mysql user Host +def mysql PRIMARY def mysql user User ######################################################################################## # Testcase 3.2.7.2 + 3.2.7.3: INFORMATION_SCHEMA.KEY_COLUMN_USAGE accessible information ######################################################################################## @@ -100,25 +168,27 @@ WHERE table_name LIKE 't1_%' ORDER BY constraint_catalog, constraint_schema, constraint_name, table_catalog, table_schema, table_name, ordinal_position; CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION POSITION_IN_UNIQUE_CONSTRAINT REFERENCED_TABLE_SCHEMA REFERENCED_TABLE_NAME REFERENCED_COLUMN_NAME -NULL db_datadict PRIMARY NULL db_datadict t1_1 f1 1 NULL NULL NULL NULL -NULL db_datadict PRIMARY NULL db_datadict t1_2 f1 1 NULL NULL NULL NULL -# Establish connection testuser1 (user=testuser1) +def db_datadict PRIMARY def db_datadict t1_1 f1 1 NULL NULL NULL NULL +def db_datadict PRIMARY def db_datadict t1_2 f1 1 NULL NULL NULL NULL +connect testuser1, localhost, testuser1, , db_datadict; SELECT * FROM information_schema.key_column_usage WHERE table_name LIKE 't1_%' ORDER BY constraint_catalog, constraint_schema, constraint_name, table_catalog, table_schema, table_name, ordinal_position; CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION POSITION_IN_UNIQUE_CONSTRAINT REFERENCED_TABLE_SCHEMA REFERENCED_TABLE_NAME REFERENCED_COLUMN_NAME -NULL db_datadict PRIMARY NULL db_datadict t1_1 f1 1 NULL NULL NULL NULL -NULL db_datadict PRIMARY NULL db_datadict t1_2 f1 1 NULL NULL NULL NULL -# Establish connection testuser2 (user=testuser2) +def db_datadict PRIMARY def db_datadict t1_1 f1 1 NULL NULL NULL NULL +def db_datadict PRIMARY def db_datadict t1_2 f1 1 NULL NULL NULL NULL +connect testuser2, localhost, testuser2, , db_datadict; SELECT * FROM information_schema.key_column_usage WHERE table_name LIKE 't1_%' ORDER BY constraint_catalog, constraint_schema, constraint_name, table_catalog, table_schema, table_name, ordinal_position; CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION POSITION_IN_UNIQUE_CONSTRAINT REFERENCED_TABLE_SCHEMA REFERENCED_TABLE_NAME REFERENCED_COLUMN_NAME -NULL db_datadict PRIMARY NULL db_datadict t1_1 f1 1 NULL NULL NULL NULL -NULL db_datadict PRIMARY NULL db_datadict t1_2 f1 1 NULL NULL NULL NULL -# Switch to connection default and close connections testuser1, testuser2 +def db_datadict PRIMARY def db_datadict t1_1 f1 1 NULL NULL NULL NULL +def db_datadict PRIMARY def db_datadict t1_2 f1 1 NULL NULL NULL NULL +connection default; +disconnect testuser1; +disconnect testuser2; DROP USER 'testuser1'@'localhost'; DROP USER 'testuser2'@'localhost'; DROP TABLE t1_1; @@ -139,10 +209,10 @@ DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ENGINE = ; SELECT * FROM information_schema.key_column_usage WHERE table_name = 't1_my_table'; -CONSTRAINT_CATALOG NULL +CONSTRAINT_CATALOG def CONSTRAINT_SCHEMA test CONSTRAINT_NAME PRIMARY -TABLE_CATALOG NULL +TABLE_CATALOG def TABLE_SCHEMA test TABLE_NAME t1_my_table COLUMN_NAME f1 @@ -151,10 +221,10 @@ POSITION_IN_UNIQUE_CONSTRAINT NULL REFERENCED_TABLE_SCHEMA NULL REFERENCED_TABLE_NAME NULL REFERENCED_COLUMN_NAME NULL -CONSTRAINT_CATALOG NULL +CONSTRAINT_CATALOG def CONSTRAINT_SCHEMA test CONSTRAINT_NAME PRIMARY -TABLE_CATALOG NULL +TABLE_CATALOG def TABLE_SCHEMA test TABLE_NAME t1_my_table COLUMN_NAME f2 @@ -277,28 +347,6 @@ db_datadict my_idx db_datadict t1_my_tablex f4 1 db_datadict my_idx db_datadict t1_my_tablex first_col 2 db_datadict PRIMARY db_datadict t1_my_tablex first_col 1 db_datadict PRIMARY db_datadict t1_my_tablex f2 2 -SELECT constraint_schema, constraint_name, table_schema, -table_name, column_name, ordinal_position -FROM information_schema.key_column_usage -WHERE table_name = 't1_my_tablex' -ORDER BY constraint_schema, constraint_name, table_schema, -table_name, ordinal_position; -constraint_schema constraint_name table_schema table_name column_name ordinal_position -db_datadict my_idx db_datadict t1_my_tablex f4 1 -db_datadict my_idx db_datadict t1_my_tablex first_col 2 -db_datadict PRIMARY db_datadict t1_my_tablex first_col 1 -db_datadict PRIMARY db_datadict t1_my_tablex f2 2 -ALTER TABLE db_datadict.t1_my_tablex -DROP COLUMN first_col; -SELECT constraint_schema, constraint_name, table_schema, -table_name, column_name, ordinal_position -FROM information_schema.key_column_usage -WHERE table_name = 't1_my_tablex' -ORDER BY constraint_schema, constraint_name, table_schema, -table_name, ordinal_position; -constraint_schema constraint_name table_schema table_name column_name ordinal_position -db_datadict my_idx db_datadict t1_my_tablex f4 1 -db_datadict PRIMARY db_datadict t1_my_tablex f2 1 SELECT table_name, column_name FROM information_schema.key_column_usage WHERE table_name = 't1_my_tablex' @@ -306,6 +354,8 @@ ORDER BY table_name, column_name; table_name column_name t1_my_tablex f2 t1_my_tablex f4 +t1_my_tablex first_col +t1_my_tablex first_col DROP TABLE db_datadict.t1_my_tablex; SELECT table_name, column_name FROM information_schema.key_column_usage @@ -351,7 +401,7 @@ SELECT * FROM information_schema.key_column_usage; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' UPDATE information_schema.key_column_usage SET table_name = 'db1' WHERE constraint_name = 'primary'; -ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' +Got one of the listed errors DELETE FROM information_schema.key_column_usage WHERE table_name = 't1'; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' TRUNCATE information_schema.key_column_usage; diff --git a/mysql-test/suite/funcs_1/r/is_routines_embedded.result b/mysql-test/suite/funcs_1/r/is_routines_embedded.result index e5f476367e2..1fc9f90ae49 100644 --- a/mysql-test/suite/funcs_1/r/is_routines_embedded.result +++ b/mysql-test/suite/funcs_1/r/is_routines_embedded.result @@ -1,3 +1,4 @@ +set sql_mode=""; SHOW TABLES FROM information_schema LIKE 'ROUTINES'; Tables_in_information_schema (ROUTINES) ROUTINES @@ -29,11 +30,19 @@ DROP FUNCTION test.f1; DESCRIBE information_schema.ROUTINES; Field Type Null Key Default Extra SPECIFIC_NAME varchar(64) NO -ROUTINE_CATALOG varchar(512) YES NULL +ROUTINE_CATALOG varchar(512) NO ROUTINE_SCHEMA varchar(64) NO ROUTINE_NAME varchar(64) NO ROUTINE_TYPE varchar(9) NO -DTD_IDENTIFIER varchar(64) YES NULL +DATA_TYPE varchar(64) NO +CHARACTER_MAXIMUM_LENGTH int(21) YES NULL +CHARACTER_OCTET_LENGTH int(21) YES NULL +NUMERIC_PRECISION int(21) YES NULL +NUMERIC_SCALE int(21) YES NULL +DATETIME_PRECISION bigint(21) unsigned YES NULL +CHARACTER_SET_NAME varchar(64) YES NULL +COLLATION_NAME varchar(64) YES NULL +DTD_IDENTIFIER longtext YES NULL ROUTINE_BODY varchar(8) NO ROUTINE_DEFINITION longtext YES NULL EXTERNAL_NAME varchar(64) YES NULL @@ -45,23 +54,31 @@ SQL_PATH varchar(64) YES NULL SECURITY_TYPE varchar(7) NO CREATED datetime NO 0000-00-00 00:00:00 LAST_ALTERED datetime NO 0000-00-00 00:00:00 -SQL_MODE longtext NO NULL -ROUTINE_COMMENT varchar(64) NO -DEFINER varchar(77) NO +SQL_MODE varchar(8192) NO +ROUTINE_COMMENT longtext NO +DEFINER varchar(189) NO CHARACTER_SET_CLIENT varchar(32) NO COLLATION_CONNECTION varchar(32) NO -DATABASE_COLLATION varchar(32) NO +DATABASE_COLLATION varchar(32) NO SHOW CREATE TABLE information_schema.ROUTINES; Table Create Table ROUTINES CREATE TEMPORARY TABLE `ROUTINES` ( `SPECIFIC_NAME` varchar(64) NOT NULL DEFAULT '', - `ROUTINE_CATALOG` varchar(512) DEFAULT NULL, + `ROUTINE_CATALOG` varchar(512) NOT NULL DEFAULT '', `ROUTINE_SCHEMA` varchar(64) NOT NULL DEFAULT '', `ROUTINE_NAME` varchar(64) NOT NULL DEFAULT '', `ROUTINE_TYPE` varchar(9) NOT NULL DEFAULT '', - `DTD_IDENTIFIER` varchar(64) DEFAULT NULL, + `DATA_TYPE` varchar(64) NOT NULL DEFAULT '', + `CHARACTER_MAXIMUM_LENGTH` int(21) DEFAULT NULL, + `CHARACTER_OCTET_LENGTH` int(21) DEFAULT NULL, + `NUMERIC_PRECISION` int(21) DEFAULT NULL, + `NUMERIC_SCALE` int(21) DEFAULT NULL, + `DATETIME_PRECISION` bigint(21) unsigned DEFAULT NULL, + `CHARACTER_SET_NAME` varchar(64) DEFAULT NULL, + `COLLATION_NAME` varchar(64) DEFAULT NULL, + `DTD_IDENTIFIER` longtext DEFAULT NULL, `ROUTINE_BODY` varchar(8) NOT NULL DEFAULT '', - `ROUTINE_DEFINITION` longtext, + `ROUTINE_DEFINITION` longtext DEFAULT NULL, `EXTERNAL_NAME` varchar(64) DEFAULT NULL, `EXTERNAL_LANGUAGE` varchar(64) DEFAULT NULL, `PARAMETER_STYLE` varchar(8) NOT NULL DEFAULT '', @@ -71,21 +88,29 @@ ROUTINES CREATE TEMPORARY TABLE `ROUTINES` ( `SECURITY_TYPE` varchar(7) NOT NULL DEFAULT '', `CREATED` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `LAST_ALTERED` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `SQL_MODE` longtext NOT NULL, - `ROUTINE_COMMENT` varchar(64) NOT NULL DEFAULT '', - `DEFINER` varchar(77) NOT NULL DEFAULT '', + `SQL_MODE` varchar(8192) NOT NULL DEFAULT '', + `ROUTINE_COMMENT` longtext NOT NULL DEFAULT '', + `DEFINER` varchar(189) NOT NULL DEFAULT '', `CHARACTER_SET_CLIENT` varchar(32) NOT NULL DEFAULT '', `COLLATION_CONNECTION` varchar(32) NOT NULL DEFAULT '', `DATABASE_COLLATION` varchar(32) NOT NULL DEFAULT '' -) ENGINE=MyISAM DEFAULT CHARSET=utf8 +) DEFAULT CHARSET=utf8 SHOW COLUMNS FROM information_schema.ROUTINES; Field Type Null Key Default Extra SPECIFIC_NAME varchar(64) NO -ROUTINE_CATALOG varchar(512) YES NULL +ROUTINE_CATALOG varchar(512) NO ROUTINE_SCHEMA varchar(64) NO ROUTINE_NAME varchar(64) NO ROUTINE_TYPE varchar(9) NO -DTD_IDENTIFIER varchar(64) YES NULL +DATA_TYPE varchar(64) NO +CHARACTER_MAXIMUM_LENGTH int(21) YES NULL +CHARACTER_OCTET_LENGTH int(21) YES NULL +NUMERIC_PRECISION int(21) YES NULL +NUMERIC_SCALE int(21) YES NULL +DATETIME_PRECISION bigint(21) unsigned YES NULL +CHARACTER_SET_NAME varchar(64) YES NULL +COLLATION_NAME varchar(64) YES NULL +DTD_IDENTIFIER longtext YES NULL ROUTINE_BODY varchar(8) NO ROUTINE_DEFINITION longtext YES NULL EXTERNAL_NAME varchar(64) YES NULL @@ -97,12 +122,12 @@ SQL_PATH varchar(64) YES NULL SECURITY_TYPE varchar(7) NO CREATED datetime NO 0000-00-00 00:00:00 LAST_ALTERED datetime NO 0000-00-00 00:00:00 -SQL_MODE longtext NO NULL -ROUTINE_COMMENT varchar(64) NO -DEFINER varchar(77) NO +SQL_MODE varchar(8192) NO +ROUTINE_COMMENT longtext NO +DEFINER varchar(189) NO CHARACTER_SET_CLIENT varchar(32) NO COLLATION_CONNECTION varchar(32) NO -DATABASE_COLLATION varchar(32) NO +DATABASE_COLLATION varchar(32) NO USE test; DROP PROCEDURE IF EXISTS sp_for_routines; DROP FUNCTION IF EXISTS function_for_routines; @@ -111,11 +136,14 @@ CREATE FUNCTION function_for_routines() RETURNS INT RETURN 0; SELECT specific_name,routine_catalog,routine_schema,routine_name,routine_type, routine_body,external_name,external_language,parameter_style,sql_path FROM information_schema.routines -WHERE routine_catalog IS NOT NULL OR external_name IS NOT NULL +WHERE routine_schema = 'test' AND +(routine_catalog IS NOT NULL OR external_name IS NOT NULL OR external_language IS NOT NULL OR sql_path IS NOT NULL OR routine_body <> 'SQL' OR parameter_style <> 'SQL' - OR specific_name <> routine_name; + OR specific_name <> routine_name); specific_name routine_catalog routine_schema routine_name routine_type routine_body external_name external_language parameter_style sql_path +function_for_routines def test function_for_routines FUNCTION SQL NULL NULL SQL NULL +sp_for_routines def test sp_for_routines PROCEDURE SQL NULL NULL SQL NULL DROP PROCEDURE sp_for_routines; DROP FUNCTION function_for_routines; ################################################################################ @@ -159,34 +187,46 @@ GRANT EXECUTE ON PROCEDURE db_datadict_2.sp_6_408002_2 TO 'testuser2'@'localhost'; GRANT EXECUTE ON db_datadict_2.* TO 'testuser2'@'localhost'; FLUSH PRIVILEGES; -# Establish connection testuser1 (user=testuser1) +connect testuser1, localhost, testuser1, , db_datadict; SELECT * FROM information_schema.routines; -SPECIFIC_NAME ROUTINE_CATALOG ROUTINE_SCHEMA ROUTINE_NAME ROUTINE_TYPE DTD_IDENTIFIER ROUTINE_BODY ROUTINE_DEFINITION EXTERNAL_NAME EXTERNAL_LANGUAGE PARAMETER_STYLE IS_DETERMINISTIC SQL_DATA_ACCESS SQL_PATH SECURITY_TYPE CREATED LAST_ALTERED SQL_MODE ROUTINE_COMMENT DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION -sp_6_408002_1 NULL db_datadict sp_6_408002_1 PROCEDURE NULL SQL BEGIN +SPECIFIC_NAME ROUTINE_CATALOG ROUTINE_SCHEMA ROUTINE_NAME ROUTINE_TYPE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE DATETIME_PRECISION CHARACTER_SET_NAME COLLATION_NAME DTD_IDENTIFIER ROUTINE_BODY ROUTINE_DEFINITION EXTERNAL_NAME EXTERNAL_LANGUAGE PARAMETER_STYLE IS_DETERMINISTIC SQL_DATA_ACCESS SQL_PATH SECURITY_TYPE CREATED LAST_ALTERED SQL_MODE ROUTINE_COMMENT DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION +sp_6_408002_1 def db_datadict sp_6_408002_1 PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM db_datadict.res_6_408002_1; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost latin1 latin1_swedish_ci latin1_swedish_ci -sp_6_408002_2 NULL db_datadict_2 sp_6_408002_2 PROCEDURE NULL SQL BEGIN +sp_6_408002_2 def db_datadict_2 sp_6_408002_2 PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM db_datadict_2.res_6_408002_2; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost latin1 latin1_swedish_ci latin1_swedish_ci -# Establish connection testuser2 (user=testuser2) +add_suppression def mtr add_suppression PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN INSERT INTO test_suppressions (pattern) VALUES (pattern); FLUSH NO_WRITE_TO_BINLOG TABLE test_suppressions; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8 utf8_general_ci latin1_swedish_ci +check_testcase def mtr check_testcase PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE variable_name NOT IN ('timestamp', 'innodb_file_format_max') AND variable_name not like "Last_IO_Err*" AND variable_name != 'INNODB_IBUF_MAX_SIZE' AND variable_name != 'INNODB_USE_NATIVE_AIO' AND variable_name != 'INNODB_BUFFER_POOL_LOAD_AT_STARTUP' AND variable_name not like 'GTID%POS' AND variable_name != 'GTID_BINLOG_STATE' ORDER BY variable_name; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mtr_wsrep_notify', 'wsrep_schema'); SELECT table_name AS tables_in_test FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='test'; SELECT CONCAT(table_schema, '.', table_name) AS tables_in_mysql FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='mysql' ORDER BY tables_in_mysql; SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql; SELECT * FROM INFORMATION_SCHEMA.EVENTS; SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME NOT IN ('gs_insert', 'ts_insert'); SELECT * FROM INFORMATION_SCHEMA.ROUTINES; SHOW STATUS LIKE 'slave_open_temp_tables'; checksum table mysql.columns_priv, mysql.db, mysql.func, mysql.help_category, mysql.help_keyword, mysql.help_relation, mysql.host, mysql.plugin, mysql.proc, mysql.procs_priv, mysql.roles_mapping, mysql.tables_priv, mysql.time_zone, mysql.time_zone_leap_second, mysql.time_zone_name, mysql.time_zone_transition, mysql.time_zone_transition_type, mysql.user; SELECT * FROM INFORMATION_SCHEMA.PLUGINS; select * from information_schema.session_variables where variable_name = 'debug_sync'; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8 utf8_general_ci latin1_swedish_ci +check_warnings def mtr check_warnings PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN DECLARE `pos` bigint unsigned; SET SQL_LOG_BIN=0; UPDATE error_log el, global_suppressions gs SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP gs.pattern; UPDATE error_log el, test_suppressions ts SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP ts.pattern; SELECT COUNT(*) INTO @num_warnings FROM error_log WHERE suspicious=1; IF @num_warnings > 0 THEN SELECT line FROM error_log WHERE suspicious=1; SELECT 2 INTO result; ELSE SELECT 0 INTO RESULT; END IF; TRUNCATE test_suppressions; DROP TABLE error_log; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8 utf8_general_ci latin1_swedish_ci +connect testuser2, localhost, testuser2, , db_datadict; SELECT * FROM information_schema.routines; -SPECIFIC_NAME ROUTINE_CATALOG ROUTINE_SCHEMA ROUTINE_NAME ROUTINE_TYPE DTD_IDENTIFIER ROUTINE_BODY ROUTINE_DEFINITION EXTERNAL_NAME EXTERNAL_LANGUAGE PARAMETER_STYLE IS_DETERMINISTIC SQL_DATA_ACCESS SQL_PATH SECURITY_TYPE CREATED LAST_ALTERED SQL_MODE ROUTINE_COMMENT DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION -sp_6_408002_1 NULL db_datadict sp_6_408002_1 PROCEDURE NULL SQL BEGIN +SPECIFIC_NAME ROUTINE_CATALOG ROUTINE_SCHEMA ROUTINE_NAME ROUTINE_TYPE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE DATETIME_PRECISION CHARACTER_SET_NAME COLLATION_NAME DTD_IDENTIFIER ROUTINE_BODY ROUTINE_DEFINITION EXTERNAL_NAME EXTERNAL_LANGUAGE PARAMETER_STYLE IS_DETERMINISTIC SQL_DATA_ACCESS SQL_PATH SECURITY_TYPE CREATED LAST_ALTERED SQL_MODE ROUTINE_COMMENT DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION +sp_6_408002_1 def db_datadict sp_6_408002_1 PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM db_datadict.res_6_408002_1; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost latin1 latin1_swedish_ci latin1_swedish_ci -sp_6_408002_2 NULL db_datadict_2 sp_6_408002_2 PROCEDURE NULL SQL BEGIN +sp_6_408002_2 def db_datadict_2 sp_6_408002_2 PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM db_datadict_2.res_6_408002_2; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost latin1 latin1_swedish_ci latin1_swedish_ci -# Establish connection testuser3 (user=testuser3) +add_suppression def mtr add_suppression PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN INSERT INTO test_suppressions (pattern) VALUES (pattern); FLUSH NO_WRITE_TO_BINLOG TABLE test_suppressions; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8 utf8_general_ci latin1_swedish_ci +check_testcase def mtr check_testcase PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE variable_name NOT IN ('timestamp', 'innodb_file_format_max') AND variable_name not like "Last_IO_Err*" AND variable_name != 'INNODB_IBUF_MAX_SIZE' AND variable_name != 'INNODB_USE_NATIVE_AIO' AND variable_name != 'INNODB_BUFFER_POOL_LOAD_AT_STARTUP' AND variable_name not like 'GTID%POS' AND variable_name != 'GTID_BINLOG_STATE' ORDER BY variable_name; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mtr_wsrep_notify', 'wsrep_schema'); SELECT table_name AS tables_in_test FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='test'; SELECT CONCAT(table_schema, '.', table_name) AS tables_in_mysql FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='mysql' ORDER BY tables_in_mysql; SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql; SELECT * FROM INFORMATION_SCHEMA.EVENTS; SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME NOT IN ('gs_insert', 'ts_insert'); SELECT * FROM INFORMATION_SCHEMA.ROUTINES; SHOW STATUS LIKE 'slave_open_temp_tables'; checksum table mysql.columns_priv, mysql.db, mysql.func, mysql.help_category, mysql.help_keyword, mysql.help_relation, mysql.host, mysql.plugin, mysql.proc, mysql.procs_priv, mysql.roles_mapping, mysql.tables_priv, mysql.time_zone, mysql.time_zone_leap_second, mysql.time_zone_name, mysql.time_zone_transition, mysql.time_zone_transition_type, mysql.user; SELECT * FROM INFORMATION_SCHEMA.PLUGINS; select * from information_schema.session_variables where variable_name = 'debug_sync'; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8 utf8_general_ci latin1_swedish_ci +check_warnings def mtr check_warnings PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN DECLARE `pos` bigint unsigned; SET SQL_LOG_BIN=0; UPDATE error_log el, global_suppressions gs SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP gs.pattern; UPDATE error_log el, test_suppressions ts SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP ts.pattern; SELECT COUNT(*) INTO @num_warnings FROM error_log WHERE suspicious=1; IF @num_warnings > 0 THEN SELECT line FROM error_log WHERE suspicious=1; SELECT 2 INTO result; ELSE SELECT 0 INTO RESULT; END IF; TRUNCATE test_suppressions; DROP TABLE error_log; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8 utf8_general_ci latin1_swedish_ci +connect testuser3, localhost, testuser3, , test; SELECT * FROM information_schema.routines; -SPECIFIC_NAME ROUTINE_CATALOG ROUTINE_SCHEMA ROUTINE_NAME ROUTINE_TYPE DTD_IDENTIFIER ROUTINE_BODY ROUTINE_DEFINITION EXTERNAL_NAME EXTERNAL_LANGUAGE PARAMETER_STYLE IS_DETERMINISTIC SQL_DATA_ACCESS SQL_PATH SECURITY_TYPE CREATED LAST_ALTERED SQL_MODE ROUTINE_COMMENT DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION -sp_6_408002_1 NULL db_datadict sp_6_408002_1 PROCEDURE NULL SQL BEGIN +SPECIFIC_NAME ROUTINE_CATALOG ROUTINE_SCHEMA ROUTINE_NAME ROUTINE_TYPE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE DATETIME_PRECISION CHARACTER_SET_NAME COLLATION_NAME DTD_IDENTIFIER ROUTINE_BODY ROUTINE_DEFINITION EXTERNAL_NAME EXTERNAL_LANGUAGE PARAMETER_STYLE IS_DETERMINISTIC SQL_DATA_ACCESS SQL_PATH SECURITY_TYPE CREATED LAST_ALTERED SQL_MODE ROUTINE_COMMENT DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION +sp_6_408002_1 def db_datadict sp_6_408002_1 PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM db_datadict.res_6_408002_1; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost latin1 latin1_swedish_ci latin1_swedish_ci -sp_6_408002_2 NULL db_datadict_2 sp_6_408002_2 PROCEDURE NULL SQL BEGIN +sp_6_408002_2 def db_datadict_2 sp_6_408002_2 PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM db_datadict_2.res_6_408002_2; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost latin1 latin1_swedish_ci latin1_swedish_ci -# Switch to connection default and close connections testuser1,testuser2,testuser3 +add_suppression def mtr add_suppression PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN INSERT INTO test_suppressions (pattern) VALUES (pattern); FLUSH NO_WRITE_TO_BINLOG TABLE test_suppressions; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8 utf8_general_ci latin1_swedish_ci +check_testcase def mtr check_testcase PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE variable_name NOT IN ('timestamp', 'innodb_file_format_max') AND variable_name not like "Last_IO_Err*" AND variable_name != 'INNODB_IBUF_MAX_SIZE' AND variable_name != 'INNODB_USE_NATIVE_AIO' AND variable_name != 'INNODB_BUFFER_POOL_LOAD_AT_STARTUP' AND variable_name not like 'GTID%POS' AND variable_name != 'GTID_BINLOG_STATE' ORDER BY variable_name; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mtr_wsrep_notify', 'wsrep_schema'); SELECT table_name AS tables_in_test FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='test'; SELECT CONCAT(table_schema, '.', table_name) AS tables_in_mysql FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='mysql' ORDER BY tables_in_mysql; SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql; SELECT * FROM INFORMATION_SCHEMA.EVENTS; SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME NOT IN ('gs_insert', 'ts_insert'); SELECT * FROM INFORMATION_SCHEMA.ROUTINES; SHOW STATUS LIKE 'slave_open_temp_tables'; checksum table mysql.columns_priv, mysql.db, mysql.func, mysql.help_category, mysql.help_keyword, mysql.help_relation, mysql.host, mysql.plugin, mysql.proc, mysql.procs_priv, mysql.roles_mapping, mysql.tables_priv, mysql.time_zone, mysql.time_zone_leap_second, mysql.time_zone_name, mysql.time_zone_transition, mysql.time_zone_transition_type, mysql.user; SELECT * FROM INFORMATION_SCHEMA.PLUGINS; select * from information_schema.session_variables where variable_name = 'debug_sync'; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8 utf8_general_ci latin1_swedish_ci +check_warnings def mtr check_warnings PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN DECLARE `pos` bigint unsigned; SET SQL_LOG_BIN=0; UPDATE error_log el, global_suppressions gs SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP gs.pattern; UPDATE error_log el, test_suppressions ts SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP ts.pattern; SELECT COUNT(*) INTO @num_warnings FROM error_log WHERE suspicious=1; IF @num_warnings > 0 THEN SELECT line FROM error_log WHERE suspicious=1; SELECT 2 INTO result; ELSE SELECT 0 INTO RESULT; END IF; TRUNCATE test_suppressions; DROP TABLE error_log; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8 utf8_general_ci latin1_swedish_ci +connection default; +disconnect testuser1; +disconnect testuser2; +disconnect testuser3; DROP USER 'testuser1'@'localhost'; DROP USER 'testuser2'@'localhost'; DROP USER 'testuser3'@'localhost'; @@ -199,17 +239,25 @@ DROP DATABASE db_datadict_2; DROP DATABASE IF EXISTS db_datadict; CREATE DATABASE db_datadict; SELECT * FROM information_schema.routines WHERE routine_schema = 'db_datadict'; -SPECIFIC_NAME ROUTINE_CATALOG ROUTINE_SCHEMA ROUTINE_NAME ROUTINE_TYPE DTD_IDENTIFIER ROUTINE_BODY ROUTINE_DEFINITION EXTERNAL_NAME EXTERNAL_LANGUAGE PARAMETER_STYLE IS_DETERMINISTIC SQL_DATA_ACCESS SQL_PATH SECURITY_TYPE CREATED LAST_ALTERED SQL_MODE ROUTINE_COMMENT DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION +SPECIFIC_NAME ROUTINE_CATALOG ROUTINE_SCHEMA ROUTINE_NAME ROUTINE_TYPE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE DATETIME_PRECISION CHARACTER_SET_NAME COLLATION_NAME DTD_IDENTIFIER ROUTINE_BODY ROUTINE_DEFINITION EXTERNAL_NAME EXTERNAL_LANGUAGE PARAMETER_STYLE IS_DETERMINISTIC SQL_DATA_ACCESS SQL_PATH SECURITY_TYPE CREATED LAST_ALTERED SQL_MODE ROUTINE_COMMENT DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION USE db_datadict; CREATE PROCEDURE sp_for_routines() SELECT 'db_datadict'; CREATE FUNCTION function_for_routines() RETURNS INT RETURN 0; SELECT * FROM information_schema.routines WHERE routine_schema = 'db_datadict' ORDER BY routine_name; SPECIFIC_NAME function_for_routines -ROUTINE_CATALOG NULL +ROUTINE_CATALOG def ROUTINE_SCHEMA db_datadict ROUTINE_NAME function_for_routines ROUTINE_TYPE FUNCTION +DATA_TYPE int +CHARACTER_MAXIMUM_LENGTH NULL +CHARACTER_OCTET_LENGTH NULL +NUMERIC_PRECISION 10 +NUMERIC_SCALE 0 +DATETIME_PRECISION NULL +CHARACTER_SET_NAME NULL +COLLATION_NAME NULL DTD_IDENTIFIER int(11) ROUTINE_BODY SQL ROUTINE_DEFINITION RETURN 0 @@ -229,10 +277,18 @@ CHARACTER_SET_CLIENT latin1 COLLATION_CONNECTION latin1_swedish_ci DATABASE_COLLATION latin1_swedish_ci SPECIFIC_NAME sp_for_routines -ROUTINE_CATALOG NULL +ROUTINE_CATALOG def ROUTINE_SCHEMA db_datadict ROUTINE_NAME sp_for_routines ROUTINE_TYPE PROCEDURE +DATA_TYPE +CHARACTER_MAXIMUM_LENGTH NULL +CHARACTER_OCTET_LENGTH NULL +NUMERIC_PRECISION NULL +NUMERIC_SCALE NULL +DATETIME_PRECISION NULL +CHARACTER_SET_NAME NULL +COLLATION_NAME NULL DTD_IDENTIFIER NULL ROUTINE_BODY SQL ROUTINE_DEFINITION SELECT 'db_datadict' @@ -256,10 +312,18 @@ ALTER FUNCTION function_for_routines COMMENT 'updated comments'; SELECT * FROM information_schema.routines WHERE routine_schema = 'db_datadict' ORDER BY routine_name; SPECIFIC_NAME function_for_routines -ROUTINE_CATALOG NULL +ROUTINE_CATALOG def ROUTINE_SCHEMA db_datadict ROUTINE_NAME function_for_routines ROUTINE_TYPE FUNCTION +DATA_TYPE int +CHARACTER_MAXIMUM_LENGTH NULL +CHARACTER_OCTET_LENGTH NULL +NUMERIC_PRECISION 10 +NUMERIC_SCALE 0 +DATETIME_PRECISION NULL +CHARACTER_SET_NAME NULL +COLLATION_NAME NULL DTD_IDENTIFIER int(11) ROUTINE_BODY SQL ROUTINE_DEFINITION RETURN 0 @@ -279,10 +343,18 @@ CHARACTER_SET_CLIENT latin1 COLLATION_CONNECTION latin1_swedish_ci DATABASE_COLLATION latin1_swedish_ci SPECIFIC_NAME sp_for_routines -ROUTINE_CATALOG NULL +ROUTINE_CATALOG def ROUTINE_SCHEMA db_datadict ROUTINE_NAME sp_for_routines ROUTINE_TYPE PROCEDURE +DATA_TYPE +CHARACTER_MAXIMUM_LENGTH NULL +CHARACTER_OCTET_LENGTH NULL +NUMERIC_PRECISION NULL +NUMERIC_SCALE NULL +DATETIME_PRECISION NULL +CHARACTER_SET_NAME NULL +COLLATION_NAME NULL DTD_IDENTIFIER NULL ROUTINE_BODY SQL ROUTINE_DEFINITION SELECT 'db_datadict' @@ -304,16 +376,24 @@ DATABASE_COLLATION latin1_swedish_ci DROP PROCEDURE sp_for_routines; DROP FUNCTION function_for_routines; SELECT * FROM information_schema.routines WHERE routine_schema = 'db_datadict'; -SPECIFIC_NAME ROUTINE_CATALOG ROUTINE_SCHEMA ROUTINE_NAME ROUTINE_TYPE DTD_IDENTIFIER ROUTINE_BODY ROUTINE_DEFINITION EXTERNAL_NAME EXTERNAL_LANGUAGE PARAMETER_STYLE IS_DETERMINISTIC SQL_DATA_ACCESS SQL_PATH SECURITY_TYPE CREATED LAST_ALTERED SQL_MODE ROUTINE_COMMENT DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION +SPECIFIC_NAME ROUTINE_CATALOG ROUTINE_SCHEMA ROUTINE_NAME ROUTINE_TYPE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE DATETIME_PRECISION CHARACTER_SET_NAME COLLATION_NAME DTD_IDENTIFIER ROUTINE_BODY ROUTINE_DEFINITION EXTERNAL_NAME EXTERNAL_LANGUAGE PARAMETER_STYLE IS_DETERMINISTIC SQL_DATA_ACCESS SQL_PATH SECURITY_TYPE CREATED LAST_ALTERED SQL_MODE ROUTINE_COMMENT DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION CREATE PROCEDURE sp_for_routines() SELECT 'db_datadict'; CREATE FUNCTION function_for_routines() RETURNS INT RETURN 0; SELECT * FROM information_schema.routines WHERE routine_schema = 'db_datadict' ORDER BY routine_name; SPECIFIC_NAME function_for_routines -ROUTINE_CATALOG NULL +ROUTINE_CATALOG def ROUTINE_SCHEMA db_datadict ROUTINE_NAME function_for_routines ROUTINE_TYPE FUNCTION +DATA_TYPE int +CHARACTER_MAXIMUM_LENGTH NULL +CHARACTER_OCTET_LENGTH NULL +NUMERIC_PRECISION 10 +NUMERIC_SCALE 0 +DATETIME_PRECISION NULL +CHARACTER_SET_NAME NULL +COLLATION_NAME NULL DTD_IDENTIFIER int(11) ROUTINE_BODY SQL ROUTINE_DEFINITION RETURN 0 @@ -333,10 +413,18 @@ CHARACTER_SET_CLIENT latin1 COLLATION_CONNECTION latin1_swedish_ci DATABASE_COLLATION latin1_swedish_ci SPECIFIC_NAME sp_for_routines -ROUTINE_CATALOG NULL +ROUTINE_CATALOG def ROUTINE_SCHEMA db_datadict ROUTINE_NAME sp_for_routines ROUTINE_TYPE PROCEDURE +DATA_TYPE +CHARACTER_MAXIMUM_LENGTH NULL +CHARACTER_OCTET_LENGTH NULL +NUMERIC_PRECISION NULL +NUMERIC_SCALE NULL +DATETIME_PRECISION NULL +CHARACTER_SET_NAME NULL +COLLATION_NAME NULL DTD_IDENTIFIER NULL ROUTINE_BODY SQL ROUTINE_DEFINITION SELECT 'db_datadict' @@ -358,7 +446,7 @@ DATABASE_COLLATION latin1_swedish_ci use test; DROP DATABASE db_datadict; SELECT * FROM information_schema.routines WHERE routine_schema = 'db_datadict'; -SPECIFIC_NAME ROUTINE_CATALOG ROUTINE_SCHEMA ROUTINE_NAME ROUTINE_TYPE DTD_IDENTIFIER ROUTINE_BODY ROUTINE_DEFINITION EXTERNAL_NAME EXTERNAL_LANGUAGE PARAMETER_STYLE IS_DETERMINISTIC SQL_DATA_ACCESS SQL_PATH SECURITY_TYPE CREATED LAST_ALTERED SQL_MODE ROUTINE_COMMENT DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION +SPECIFIC_NAME ROUTINE_CATALOG ROUTINE_SCHEMA ROUTINE_NAME ROUTINE_TYPE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE DATETIME_PRECISION CHARACTER_SET_NAME COLLATION_NAME DTD_IDENTIFIER ROUTINE_BODY ROUTINE_DEFINITION EXTERNAL_NAME EXTERNAL_LANGUAGE PARAMETER_STYLE IS_DETERMINISTIC SQL_DATA_ACCESS SQL_PATH SECURITY_TYPE CREATED LAST_ALTERED SQL_MODE ROUTINE_COMMENT DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION ######################################################################### # 3.2.8.4: INFORMATION_SCHEMA.ROUTINES routine body too big for # ROUTINE_DEFINITION column @@ -498,10 +586,18 @@ abc 98765 99999999 98765 2010 SELECT *, LENGTH(routine_definition) FROM information_schema.routines WHERE routine_schema = 'db_datadict'; SPECIFIC_NAME sp_6_408004 -ROUTINE_CATALOG NULL +ROUTINE_CATALOG def ROUTINE_SCHEMA db_datadict ROUTINE_NAME sp_6_408004 ROUTINE_TYPE PROCEDURE +DATA_TYPE +CHARACTER_MAXIMUM_LENGTH NULL +CHARACTER_OCTET_LENGTH NULL +NUMERIC_PRECISION NULL +NUMERIC_SCALE NULL +DATETIME_PRECISION NULL +CHARACTER_SET_NAME NULL +COLLATION_NAME NULL DTD_IDENTIFIER NULL ROUTINE_BODY SQL ROUTINE_DEFINITION BEGIN @@ -630,7 +726,7 @@ VALUES ('p2', 'procedure'); ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' UPDATE information_schema.routines SET routine_name = 'p2' WHERE routine_body = 'sql'; -ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' +ERROR HY000: The target table routines of the UPDATE is not updatable DELETE FROM information_schema.routines ; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' TRUNCATE information_schema.routines ; diff --git a/mysql-test/suite/funcs_1/r/is_schemata_embedded.result b/mysql-test/suite/funcs_1/r/is_schemata_embedded.result index db0583b4b72..5f48c030c16 100644 --- a/mysql-test/suite/funcs_1/r/is_schemata_embedded.result +++ b/mysql-test/suite/funcs_1/r/is_schemata_embedded.result @@ -28,31 +28,36 @@ DROP FUNCTION test.f1; ######################################################################### DESCRIBE information_schema.SCHEMATA; Field Type Null Key Default Extra -CATALOG_NAME varchar(512) YES NULL +CATALOG_NAME varchar(512) NO SCHEMA_NAME varchar(64) NO -DEFAULT_CHARACTER_SET_NAME varchar(64) NO -DEFAULT_COLLATION_NAME varchar(64) NO +DEFAULT_CHARACTER_SET_NAME varchar(32) NO +DEFAULT_COLLATION_NAME varchar(32) NO SQL_PATH varchar(512) YES NULL SHOW CREATE TABLE information_schema.SCHEMATA; Table Create Table SCHEMATA CREATE TEMPORARY TABLE `SCHEMATA` ( - `CATALOG_NAME` varchar(512) DEFAULT NULL, + `CATALOG_NAME` varchar(512) NOT NULL DEFAULT '', `SCHEMA_NAME` varchar(64) NOT NULL DEFAULT '', - `DEFAULT_CHARACTER_SET_NAME` varchar(64) NOT NULL DEFAULT '', - `DEFAULT_COLLATION_NAME` varchar(64) NOT NULL DEFAULT '', + `DEFAULT_CHARACTER_SET_NAME` varchar(32) NOT NULL DEFAULT '', + `DEFAULT_COLLATION_NAME` varchar(32) NOT NULL DEFAULT '', `SQL_PATH` varchar(512) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=utf8 SHOW COLUMNS FROM information_schema.SCHEMATA; Field Type Null Key Default Extra -CATALOG_NAME varchar(512) YES NULL +CATALOG_NAME varchar(512) NO SCHEMA_NAME varchar(64) NO -DEFAULT_CHARACTER_SET_NAME varchar(64) NO -DEFAULT_COLLATION_NAME varchar(64) NO +DEFAULT_CHARACTER_SET_NAME varchar(32) NO +DEFAULT_COLLATION_NAME varchar(32) NO SQL_PATH varchar(512) YES NULL SELECT catalog_name, schema_name, sql_path FROM information_schema.schemata WHERE catalog_name IS NOT NULL or sql_path IS NOT NULL; catalog_name schema_name sql_path +def information_schema NULL +def mtr NULL +def mysql NULL +def performance_schema NULL +def test NULL ############################################################################### # Testcases 3.2.9.2+3.2.9.3: INFORMATION_SCHEMA.SCHEMATA accessible information ############################################################################### @@ -72,43 +77,46 @@ GRANT SELECT ON db_datadict_2.* to 'testuser2'@'localhost'; SELECT * FROM information_schema.schemata WHERE schema_name LIKE 'db_datadict_%' ORDER BY schema_name; CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH -NULL db_datadict_1 latin1 latin1_swedish_ci NULL -NULL db_datadict_2 latin1 latin1_swedish_ci NULL +def db_datadict_1 latin1 latin1_swedish_ci NULL +def db_datadict_2 latin1 latin1_swedish_ci NULL SHOW DATABASES LIKE 'db_datadict_%'; Database (db_datadict_%) db_datadict_1 db_datadict_2 -# Establish connection testuser1 (user=testuser1) +connect testuser1, localhost, testuser1, , db_datadict_1; SELECT * FROM information_schema.schemata WHERE schema_name LIKE 'db_datadict_%' ORDER BY schema_name; CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH -NULL db_datadict_1 latin1 latin1_swedish_ci NULL -NULL db_datadict_2 latin1 latin1_swedish_ci NULL +def db_datadict_1 latin1 latin1_swedish_ci NULL +def db_datadict_2 latin1 latin1_swedish_ci NULL SHOW DATABASES LIKE 'db_datadict_%'; Database (db_datadict_%) db_datadict_1 db_datadict_2 -# Establish connection testuser2 (user=testuser2) +connect testuser2, localhost, testuser2, , db_datadict_2; SELECT * FROM information_schema.schemata WHERE schema_name LIKE 'db_datadict_%' ORDER BY schema_name; CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH -NULL db_datadict_1 latin1 latin1_swedish_ci NULL -NULL db_datadict_2 latin1 latin1_swedish_ci NULL +def db_datadict_1 latin1 latin1_swedish_ci NULL +def db_datadict_2 latin1 latin1_swedish_ci NULL SHOW DATABASES LIKE 'db_datadict_%'; Database (db_datadict_%) db_datadict_1 db_datadict_2 -# Establish connection testuser3 (user=testuser3) +connect testuser3, localhost, testuser3, , test; SELECT * FROM information_schema.schemata WHERE schema_name LIKE 'db_datadict_%' ORDER BY schema_name; CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH -NULL db_datadict_1 latin1 latin1_swedish_ci NULL -NULL db_datadict_2 latin1 latin1_swedish_ci NULL +def db_datadict_1 latin1 latin1_swedish_ci NULL +def db_datadict_2 latin1 latin1_swedish_ci NULL SHOW DATABASES LIKE 'db_datadict_%'; Database (db_datadict_%) db_datadict_1 db_datadict_2 -# Switch to connection default and close connections testuser1,testuser2,testuser3 +connection default; +disconnect testuser1; +disconnect testuser2; +disconnect testuser3; DROP USER 'testuser1'@'localhost'; DROP USER 'testuser2'@'localhost'; DROP USER 'testuser3'@'localhost'; @@ -123,7 +131,7 @@ CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_P CREATE DATABASE db_datadict CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci'; SELECT * FROM information_schema.schemata WHERE schema_name = 'db_datadict'; CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH -NULL db_datadict latin1 latin1_swedish_ci NULL +def db_datadict latin1 latin1_swedish_ci NULL SELECT schema_name, default_character_set_name FROM information_schema.schemata WHERE schema_name = 'db_datadict'; schema_name default_character_set_name @@ -167,9 +175,9 @@ ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_ UPDATE information_schema.schemata SET default_character_set_name = 'utf8' WHERE schema_name = 'db_datadict'; -ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' +ERROR HY000: The target table schemata of the UPDATE is not updatable UPDATE information_schema.schemata SET catalog_name = 't_4711'; -ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' +ERROR HY000: The target table schemata of the UPDATE is not updatable DELETE FROM information_schema.schemata WHERE schema_name = 'db_datadict'; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' TRUNCATE information_schema.schemata; diff --git a/mysql-test/suite/funcs_1/r/is_table_constraints.result b/mysql-test/suite/funcs_1/r/is_table_constraints.result index 37fcce5ae42..0553b4344c8 100644 --- a/mysql-test/suite/funcs_1/r/is_table_constraints.result +++ b/mysql-test/suite/funcs_1/r/is_table_constraints.result @@ -162,7 +162,7 @@ SELECT table_name FROM information_schema.table_constraints WHERE table_name LIKE 't1_my_table%'; table_name CREATE TABLE test.t1_my_table -(f1 CHAR(12), f2 TIMESTAMP, f4 BIGINT, PRIMARY KEY(f1,f2)) +(f1 CHAR(12), f2 TIMESTAMP, f4 BIGINT, PRIMARY KEY(f1)) DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ENGINE = ; SELECT constraint_name, table_schema, table_name, constraint_type diff --git a/mysql-test/suite/funcs_1/r/is_tables.result b/mysql-test/suite/funcs_1/r/is_tables.result index 5ccbdd3d90c..75809a3b77a 100644 --- a/mysql-test/suite/funcs_1/r/is_tables.result +++ b/mysql-test/suite/funcs_1/r/is_tables.result @@ -402,7 +402,7 @@ SELECT * FROM information_schema.tables; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' UPDATE information_schema.tables SET table_schema = 'test' WHERE table_name = 't1'; -ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' +Got one of the listed errors DELETE FROM information_schema.tables WHERE table_name = 't1'; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' TRUNCATE information_schema.tables; diff --git a/mysql-test/suite/funcs_1/r/is_tables_embedded.result b/mysql-test/suite/funcs_1/r/is_tables_embedded.result index 13ee6277bad..c42645f3536 100644 --- a/mysql-test/suite/funcs_1/r/is_tables_embedded.result +++ b/mysql-test/suite/funcs_1/r/is_tables_embedded.result @@ -28,77 +28,77 @@ DROP FUNCTION test.f1; ######################################################################### DESCRIBE information_schema.TABLES; Field Type Null Key Default Extra -TABLE_CATALOG varchar(512) YES NULL +TABLE_CATALOG varchar(512) NO TABLE_SCHEMA varchar(64) NO TABLE_NAME varchar(64) NO TABLE_TYPE varchar(64) NO ENGINE varchar(64) YES NULL -VERSION bigint(21) YES NULL +VERSION bigint(21) unsigned YES NULL ROW_FORMAT varchar(10) YES NULL -TABLE_ROWS bigint(21) YES NULL -AVG_ROW_LENGTH bigint(21) YES NULL -DATA_LENGTH bigint(21) YES NULL -MAX_DATA_LENGTH bigint(21) YES NULL -INDEX_LENGTH bigint(21) YES NULL -DATA_FREE bigint(21) YES NULL -AUTO_INCREMENT bigint(21) YES NULL +TABLE_ROWS bigint(21) unsigned YES NULL +AVG_ROW_LENGTH bigint(21) unsigned YES NULL +DATA_LENGTH bigint(21) unsigned YES NULL +MAX_DATA_LENGTH bigint(21) unsigned YES NULL +INDEX_LENGTH bigint(21) unsigned YES NULL +DATA_FREE bigint(21) unsigned YES NULL +AUTO_INCREMENT bigint(21) unsigned YES NULL CREATE_TIME datetime YES NULL UPDATE_TIME datetime YES NULL CHECK_TIME datetime YES NULL -TABLE_COLLATION varchar(64) YES NULL -CHECKSUM bigint(21) YES NULL -CREATE_OPTIONS varchar(255) YES NULL -TABLE_COMMENT varchar(80) NO +TABLE_COLLATION varchar(32) YES NULL +CHECKSUM bigint(21) unsigned YES NULL +CREATE_OPTIONS varchar(2048) YES NULL +TABLE_COMMENT varchar(2048) NO SHOW CREATE TABLE information_schema.TABLES; Table Create Table TABLES CREATE TEMPORARY TABLE `TABLES` ( - `TABLE_CATALOG` varchar(512) default NULL, - `TABLE_SCHEMA` varchar(64) NOT NULL default '', - `TABLE_NAME` varchar(64) NOT NULL default '', - `TABLE_TYPE` varchar(64) NOT NULL default '', - `ENGINE` varchar(64) default NULL, - `VERSION` bigint(21) default NULL, - `ROW_FORMAT` varchar(10) default NULL, - `TABLE_ROWS` bigint(21) default NULL, - `AVG_ROW_LENGTH` bigint(21) default NULL, - `DATA_LENGTH` bigint(21) default NULL, - `MAX_DATA_LENGTH` bigint(21) default NULL, - `INDEX_LENGTH` bigint(21) default NULL, - `DATA_FREE` bigint(21) default NULL, - `AUTO_INCREMENT` bigint(21) default NULL, - `CREATE_TIME` datetime default NULL, - `UPDATE_TIME` datetime default NULL, - `CHECK_TIME` datetime default NULL, - `TABLE_COLLATION` varchar(64) default NULL, - `CHECKSUM` bigint(21) default NULL, - `CREATE_OPTIONS` varchar(255) default NULL, - `TABLE_COMMENT` varchar(80) NOT NULL default '' + `TABLE_CATALOG` varchar(512) NOT NULL DEFAULT '', + `TABLE_SCHEMA` varchar(64) NOT NULL DEFAULT '', + `TABLE_NAME` varchar(64) NOT NULL DEFAULT '', + `TABLE_TYPE` varchar(64) NOT NULL DEFAULT '', + `ENGINE` varchar(64) DEFAULT NULL, + `VERSION` bigint(21) unsigned DEFAULT NULL, + `ROW_FORMAT` varchar(10) DEFAULT NULL, + `TABLE_ROWS` bigint(21) unsigned DEFAULT NULL, + `AVG_ROW_LENGTH` bigint(21) unsigned DEFAULT NULL, + `DATA_LENGTH` bigint(21) unsigned DEFAULT NULL, + `MAX_DATA_LENGTH` bigint(21) unsigned DEFAULT NULL, + `INDEX_LENGTH` bigint(21) unsigned DEFAULT NULL, + `DATA_FREE` bigint(21) unsigned DEFAULT NULL, + `AUTO_INCREMENT` bigint(21) unsigned DEFAULT NULL, + `CREATE_TIME` datetime DEFAULT NULL, + `UPDATE_TIME` datetime DEFAULT NULL, + `CHECK_TIME` datetime DEFAULT NULL, + `TABLE_COLLATION` varchar(32) DEFAULT NULL, + `CHECKSUM` bigint(21) unsigned DEFAULT NULL, + `CREATE_OPTIONS` varchar(2048) DEFAULT NULL, + `TABLE_COMMENT` varchar(2048) NOT NULL DEFAULT '' ) ENGINE=MEMORY DEFAULT CHARSET=utf8 SHOW COLUMNS FROM information_schema.TABLES; Field Type Null Key Default Extra -TABLE_CATALOG varchar(512) YES NULL +TABLE_CATALOG varchar(512) NO TABLE_SCHEMA varchar(64) NO TABLE_NAME varchar(64) NO TABLE_TYPE varchar(64) NO ENGINE varchar(64) YES NULL -VERSION bigint(21) YES NULL +VERSION bigint(21) unsigned YES NULL ROW_FORMAT varchar(10) YES NULL -TABLE_ROWS bigint(21) YES NULL -AVG_ROW_LENGTH bigint(21) YES NULL -DATA_LENGTH bigint(21) YES NULL -MAX_DATA_LENGTH bigint(21) YES NULL -INDEX_LENGTH bigint(21) YES NULL -DATA_FREE bigint(21) YES NULL -AUTO_INCREMENT bigint(21) YES NULL +TABLE_ROWS bigint(21) unsigned YES NULL +AVG_ROW_LENGTH bigint(21) unsigned YES NULL +DATA_LENGTH bigint(21) unsigned YES NULL +MAX_DATA_LENGTH bigint(21) unsigned YES NULL +INDEX_LENGTH bigint(21) unsigned YES NULL +DATA_FREE bigint(21) unsigned YES NULL +AUTO_INCREMENT bigint(21) unsigned YES NULL CREATE_TIME datetime YES NULL UPDATE_TIME datetime YES NULL CHECK_TIME datetime YES NULL -TABLE_COLLATION varchar(64) YES NULL -CHECKSUM bigint(21) YES NULL -CREATE_OPTIONS varchar(255) YES NULL -TABLE_COMMENT varchar(80) NO +TABLE_COLLATION varchar(32) YES NULL +CHECKSUM bigint(21) unsigned YES NULL +CREATE_OPTIONS varchar(2048) YES NULL +TABLE_COMMENT varchar(2048) NO SELECT table_catalog, table_schema, table_name -FROM information_schema.tables WHERE table_catalog IS NOT NULL; +FROM information_schema.tables WHERE table_catalog IS NULL OR table_catalog <> 'def'; table_catalog table_schema table_name ################################################################################ # Testcase 3.2.12.2 + 3.2.12.3: INFORMATION_SCHEMA.TABLES accessible information @@ -117,7 +117,7 @@ CREATE TABLE db_datadict.tb1 (f1 INT, f2 INT, f3 INT) ENGINE = ; GRANT SELECT ON db_datadict.tb1 TO 'testuser1'@'localhost'; GRANT ALL ON db_datadict.tb1 TO 'testuser2'@'localhost' WITH GRANT OPTION; -# Establish connection testuser1 (user=testuser1) +connect testuser1, localhost, testuser1, , db_datadict; CREATE TABLE tb2 (f1 DECIMAL) ENGINE = ; CREATE TABLE tb3 (f1 VARCHAR(200)) @@ -129,59 +129,61 @@ GRANT SELECT ON db_datadict.v3 to 'testuser3'@'localhost'; SELECT * FROM information_schema.tables WHERE table_schema = 'db_datadict' ORDER BY table_name; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT -NULL db_datadict tb1 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# -NULL db_datadict tb2 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# -NULL db_datadict tb3 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# -NULL db_datadict v3 VIEW #ENG# NULL #RF# NULL #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# NULL #CS# NULL VIEW +def db_datadict tb1 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# +def db_datadict tb2 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# +def db_datadict tb3 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# +def db_datadict v3 VIEW #ENG# NULL #RF# NULL #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# NULL #CS# NULL VIEW SHOW TABLES FROM db_datadict; Tables_in_db_datadict tb1 tb2 tb3 v3 -# Establish connection testuser2 (user=testuser2) +connect testuser2, localhost, testuser2, , db_datadict; SELECT * FROM information_schema.tables WHERE table_schema = 'db_datadict' ORDER BY table_name; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT -NULL db_datadict tb1 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# -NULL db_datadict tb2 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# -NULL db_datadict tb3 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# -NULL db_datadict v3 VIEW #ENG# NULL #RF# NULL #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# NULL #CS# NULL VIEW +def db_datadict tb1 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# +def db_datadict tb2 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# +def db_datadict tb3 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# +def db_datadict v3 VIEW #ENG# NULL #RF# NULL #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# NULL #CS# NULL VIEW SHOW TABLES FROM db_datadict; Tables_in_db_datadict tb1 tb2 tb3 v3 -# Establish connection testuser3 (user=testuser3) +connect testuser3, localhost, testuser3, , db_datadict; SELECT * FROM information_schema.tables WHERE table_schema = 'db_datadict' ORDER BY table_name; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT -NULL db_datadict tb1 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# -NULL db_datadict tb2 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# -NULL db_datadict tb3 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# -NULL db_datadict v3 VIEW #ENG# NULL #RF# NULL #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# NULL #CS# NULL VIEW +def db_datadict tb1 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# +def db_datadict tb2 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# +def db_datadict tb3 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# +def db_datadict v3 VIEW #ENG# NULL #RF# NULL #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# NULL #CS# NULL VIEW SHOW TABLES FROM db_datadict; Tables_in_db_datadict tb1 tb2 tb3 v3 -# Switch to connection default (user=root) +connection default; SELECT * FROM information_schema.tables WHERE table_schema = 'db_datadict' ORDER BY table_name; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT -NULL db_datadict tb1 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# -NULL db_datadict tb2 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# -NULL db_datadict tb3 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# -NULL db_datadict v3 VIEW #ENG# NULL #RF# NULL #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# NULL #CS# NULL VIEW +def db_datadict tb1 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# +def db_datadict tb2 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# +def db_datadict tb3 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# +def db_datadict v3 VIEW #ENG# NULL #RF# NULL #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# NULL #CS# NULL VIEW SHOW TABLES FROM db_datadict; Tables_in_db_datadict tb1 tb2 tb3 v3 -# Close connection testuser1, testuser2, testuser3 +disconnect testuser1; +disconnect testuser2; +disconnect testuser3; DROP USER 'testuser1'@'localhost'; DROP USER 'testuser2'@'localhost'; DROP USER 'testuser3'@'localhost'; @@ -200,7 +202,7 @@ DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci COMMENT = 'Initial Comment' ENGINE = ; SELECT * FROM information_schema.tables WHERE table_name = 't1_my_table'; -TABLE_CATALOG NULL +TABLE_CATALOG def TABLE_SCHEMA test TABLE_NAME t1_my_table TABLE_TYPE BASE TABLE @@ -318,6 +320,7 @@ SELECT UPDATE_TIME, checksum INTO @UPDATE_TIME, @checksum FROM information_schema.tables WHERE table_name = 't1_my_tablex'; INSERT INTO db_datadict.t1_my_tablex SET f1 = 3; +FLUSH TABLES; SELECT UPDATE_TIME > @UPDATE_TIME AS "Is current UPDATE_TIME bigger than before last INSERT?" FROM information_schema.tables @@ -352,7 +355,7 @@ DROP TABLE test.t1_my_tablex; CREATE VIEW test.t1_my_tablex AS SELECT 1; SELECT * FROM information_schema.tables WHERE table_name = 't1_my_tablex'; -TABLE_CATALOG NULL +TABLE_CATALOG def TABLE_SCHEMA test TABLE_NAME t1_my_tablex TABLE_TYPE VIEW @@ -407,7 +410,7 @@ SELECT * FROM information_schema.tables; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' UPDATE information_schema.tables SET table_schema = 'test' WHERE table_name = 't1'; -ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' +Got one of the listed errors DELETE FROM information_schema.tables WHERE table_name = 't1'; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' TRUNCATE information_schema.tables; diff --git a/mysql-test/suite/funcs_1/r/is_triggers.result b/mysql-test/suite/funcs_1/r/is_triggers.result index d20eeb9a319..8e5842742cb 100644 --- a/mysql-test/suite/funcs_1/r/is_triggers.result +++ b/mysql-test/suite/funcs_1/r/is_triggers.result @@ -215,7 +215,7 @@ SELECT * FROM information_schema.triggers; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' UPDATE information_schema.triggers SET trigger_schema = 'test' WHERE table_name = 't1'; -ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' +Got one of the listed errors DELETE FROM information_schema.triggers WHERE trigger_name = 't1'; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' TRUNCATE information_schema.triggers; diff --git a/mysql-test/suite/funcs_1/r/is_triggers_embedded.result b/mysql-test/suite/funcs_1/r/is_triggers_embedded.result index 5e0c7601da7..55dc79e50d2 100644 --- a/mysql-test/suite/funcs_1/r/is_triggers_embedded.result +++ b/mysql-test/suite/funcs_1/r/is_triggers_embedded.result @@ -1,3 +1,4 @@ +set global sql_mode=""; SHOW TABLES FROM information_schema LIKE 'TRIGGERS'; Tables_in_information_schema (TRIGGERS) TRIGGERS @@ -28,74 +29,85 @@ DROP FUNCTION test.f1; ######################################################################### DESCRIBE information_schema.TRIGGERS; Field Type Null Key Default Extra -TRIGGER_CATALOG varchar(512) YES NULL +TRIGGER_CATALOG varchar(512) NO TRIGGER_SCHEMA varchar(64) NO TRIGGER_NAME varchar(64) NO EVENT_MANIPULATION varchar(6) NO -EVENT_OBJECT_CATALOG varchar(512) YES NULL +EVENT_OBJECT_CATALOG varchar(512) NO EVENT_OBJECT_SCHEMA varchar(64) NO EVENT_OBJECT_TABLE varchar(64) NO ACTION_ORDER bigint(4) NO 0 ACTION_CONDITION longtext YES NULL -ACTION_STATEMENT longtext NO NULL +ACTION_STATEMENT longtext NO ACTION_ORIENTATION varchar(9) NO ACTION_TIMING varchar(6) NO ACTION_REFERENCE_OLD_TABLE varchar(64) YES NULL ACTION_REFERENCE_NEW_TABLE varchar(64) YES NULL ACTION_REFERENCE_OLD_ROW varchar(3) NO ACTION_REFERENCE_NEW_ROW varchar(3) NO -CREATED datetime YES NULL -SQL_MODE longtext NO NULL -DEFINER longtext NO NULL +CREATED datetime(2) YES NULL +SQL_MODE varchar(8192) NO +DEFINER varchar(189) NO +CHARACTER_SET_CLIENT varchar(32) NO +COLLATION_CONNECTION varchar(32) NO +DATABASE_COLLATION varchar(32) NO SHOW CREATE TABLE information_schema.TRIGGERS; Table Create Table TRIGGERS CREATE TEMPORARY TABLE `TRIGGERS` ( - `TRIGGER_CATALOG` varchar(512) default NULL, - `TRIGGER_SCHEMA` varchar(64) NOT NULL default '', - `TRIGGER_NAME` varchar(64) NOT NULL default '', - `EVENT_MANIPULATION` varchar(6) NOT NULL default '', - `EVENT_OBJECT_CATALOG` varchar(512) default NULL, - `EVENT_OBJECT_SCHEMA` varchar(64) NOT NULL default '', - `EVENT_OBJECT_TABLE` varchar(64) NOT NULL default '', - `ACTION_ORDER` bigint(4) NOT NULL default '0', - `ACTION_CONDITION` longtext, - `ACTION_STATEMENT` longtext NOT NULL, - `ACTION_ORIENTATION` varchar(9) NOT NULL default '', - `ACTION_TIMING` varchar(6) NOT NULL default '', - `ACTION_REFERENCE_OLD_TABLE` varchar(64) default NULL, - `ACTION_REFERENCE_NEW_TABLE` varchar(64) default NULL, - `ACTION_REFERENCE_OLD_ROW` varchar(3) NOT NULL default '', - `ACTION_REFERENCE_NEW_ROW` varchar(3) NOT NULL default '', - `CREATED` datetime default NULL, - `SQL_MODE` longtext NOT NULL, - `DEFINER` longtext NOT NULL -) ENGINE=MyISAM DEFAULT CHARSET=utf8 + `TRIGGER_CATALOG` varchar(512) NOT NULL DEFAULT '', + `TRIGGER_SCHEMA` varchar(64) NOT NULL DEFAULT '', + `TRIGGER_NAME` varchar(64) NOT NULL DEFAULT '', + `EVENT_MANIPULATION` varchar(6) NOT NULL DEFAULT '', + `EVENT_OBJECT_CATALOG` varchar(512) NOT NULL DEFAULT '', + `EVENT_OBJECT_SCHEMA` varchar(64) NOT NULL DEFAULT '', + `EVENT_OBJECT_TABLE` varchar(64) NOT NULL DEFAULT '', + `ACTION_ORDER` bigint(4) NOT NULL DEFAULT 0, + `ACTION_CONDITION` longtext DEFAULT NULL, + `ACTION_STATEMENT` longtext NOT NULL DEFAULT '', + `ACTION_ORIENTATION` varchar(9) NOT NULL DEFAULT '', + `ACTION_TIMING` varchar(6) NOT NULL DEFAULT '', + `ACTION_REFERENCE_OLD_TABLE` varchar(64) DEFAULT NULL, + `ACTION_REFERENCE_NEW_TABLE` varchar(64) DEFAULT NULL, + `ACTION_REFERENCE_OLD_ROW` varchar(3) NOT NULL DEFAULT '', + `ACTION_REFERENCE_NEW_ROW` varchar(3) NOT NULL DEFAULT '', + `CREATED` datetime(2) DEFAULT NULL, + `SQL_MODE` varchar(8192) NOT NULL DEFAULT '', + `DEFINER` varchar(189) NOT NULL DEFAULT '', + `CHARACTER_SET_CLIENT` varchar(32) NOT NULL DEFAULT '', + `COLLATION_CONNECTION` varchar(32) NOT NULL DEFAULT '', + `DATABASE_COLLATION` varchar(32) NOT NULL DEFAULT '' +) DEFAULT CHARSET=utf8 SHOW COLUMNS FROM information_schema.TRIGGERS; Field Type Null Key Default Extra -TRIGGER_CATALOG varchar(512) YES NULL +TRIGGER_CATALOG varchar(512) NO TRIGGER_SCHEMA varchar(64) NO TRIGGER_NAME varchar(64) NO EVENT_MANIPULATION varchar(6) NO -EVENT_OBJECT_CATALOG varchar(512) YES NULL +EVENT_OBJECT_CATALOG varchar(512) NO EVENT_OBJECT_SCHEMA varchar(64) NO EVENT_OBJECT_TABLE varchar(64) NO ACTION_ORDER bigint(4) NO 0 ACTION_CONDITION longtext YES NULL -ACTION_STATEMENT longtext NO NULL +ACTION_STATEMENT longtext NO ACTION_ORIENTATION varchar(9) NO ACTION_TIMING varchar(6) NO ACTION_REFERENCE_OLD_TABLE varchar(64) YES NULL ACTION_REFERENCE_NEW_TABLE varchar(64) YES NULL ACTION_REFERENCE_OLD_ROW varchar(3) NO ACTION_REFERENCE_NEW_ROW varchar(3) NO -CREATED datetime YES NULL -SQL_MODE longtext NO NULL -DEFINER longtext NO NULL +CREATED datetime(2) YES NULL +SQL_MODE varchar(8192) NO +DEFINER varchar(189) NO +CHARACTER_SET_CLIENT varchar(32) NO +COLLATION_CONNECTION varchar(32) NO +DATABASE_COLLATION varchar(32) NO SELECT * FROM information_schema.triggers WHERE trigger_catalog IS NOT NULL OR event_object_catalog IS NOT NULL OR action_condition IS NOT NULL OR action_reference_old_table IS NOT NULL OR action_reference_new_table IS NOT NULL; -TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED SQL_MODE DEFINER +TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED SQL_MODE DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION +def mtr gs_insert INSERT def mtr global_suppressions 1 NULL BEGIN DECLARE dummy INT; SELECT "" REGEXP NEW.pattern INTO dummy; END ROW BEFORE NULL NULL OLD NEW # root@localhost latin1 latin1_swedish_ci latin1_swedish_ci +def mtr ts_insert INSERT def mtr test_suppressions 1 NULL BEGIN DECLARE dummy INT; SELECT "" REGEXP NEW.pattern INTO dummy; END ROW BEFORE NULL NULL OLD NEW # root@localhost latin1 latin1_swedish_ci latin1_swedish_ci ################################################################################## # Testcase 3.2.18.2 + 3.2.18.3: INFORMATION_SCHEMA.TRIGGERS accessible information ################################################################################## @@ -109,62 +121,74 @@ DROP USER 'testuser3'@'localhost'; CREATE USER 'testuser3'@'localhost'; DROP USER 'testuser4'@'localhost'; CREATE USER 'testuser4'@'localhost'; -GRANT SUPER ON *.* TO 'testuser1'@'localhost'; -GRANT SUPER ON *.* TO 'testuser3'@'localhost'; -GRANT SUPER ON *.* TO 'testuser4'@'localhost'; +GRANT TRIGGER ON *.* TO 'testuser1'@'localhost'; +GRANT TRIGGER ON *.* TO 'testuser3'@'localhost'; +GRANT TRIGGER ON *.* TO 'testuser4'@'localhost'; GRANT ALL ON db_datadict.* TO 'testuser1'@'localhost' WITH GRANT OPTION; -# Establish connection testuser1 (user=testuser1) +connect testuser1, localhost, testuser1, , db_datadict; CREATE TABLE db_datadict.t1 (f1 INT, f2 INT, f3 INT) ENGINE = ; CREATE TRIGGER trg1 BEFORE INSERT ON db_datadict.t1 FOR EACH ROW SET @test_before = 2, new.f1 = @test_before; GRANT ALL ON db_datadict.t1 TO 'testuser2'@'localhost'; +REVOKE TRIGGER ON db_datadict.t1 FROM 'testuser2'@'localhost'; GRANT SELECT ON db_datadict.t1 TO 'testuser3'@'localhost'; SELECT * FROM information_schema.triggers WHERE trigger_name = 'trg1'; -TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED SQL_MODE DEFINER -NULL db_datadict trg1 INSERT NULL db_datadict t1 0 NULL SET @test_before = 2, new.f1 = @test_before ROW BEFORE NULL NULL OLD NEW NULL testuser1@localhost +TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED SQL_MODE DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION +def db_datadict trg1 INSERT def db_datadict t1 1 NULL SET @test_before = 2, new.f1 = @test_before ROW BEFORE NULL NULL OLD NEW # testuser1@localhost latin1 latin1_swedish_ci latin1_swedish_ci SHOW TRIGGERS FROM db_datadict; -Trigger Event Table Statement Timing Created sql_mode Definer -trg1 INSERT t1 SET @test_before = 2, new.f1 = @test_before BEFORE NULL testuser1@localhost -# Establish connection testuser2 (user=testuser2) +Trigger Event Table Statement Timing Created sql_mode Definer character_set_client collation_connection Database Collation +trg1 INSERT t1 SET @test_before = 2, new.f1 = @test_before BEFORE # testuser1@localhost latin1 latin1_swedish_ci latin1_swedish_ci +connect testuser2, localhost, testuser2, , db_datadict; SHOW GRANTS FOR 'testuser2'@'localhost'; -# No SUPER Privilege --> no result for query +# No TRIGGER Privilege --> no result for query SELECT * FROM information_schema.triggers WHERE trigger_name = 'trg1'; -TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED SQL_MODE DEFINER -NULL db_datadict trg1 INSERT NULL db_datadict t1 0 NULL SET @test_before = 2, new.f1 = @test_before ROW BEFORE NULL NULL OLD NEW NULL testuser1@localhost +TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED SQL_MODE DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION +def db_datadict trg1 INSERT def db_datadict t1 1 NULL SET @test_before = 2, new.f1 = @test_before ROW BEFORE NULL NULL OLD NEW # testuser1@localhost latin1 latin1_swedish_ci latin1_swedish_ci SHOW TRIGGERS FROM db_datadict; -Trigger Event Table Statement Timing Created sql_mode Definer -trg1 INSERT t1 SET @test_before = 2, new.f1 = @test_before BEFORE NULL testuser1@localhost -# Establish connection testuser3 (user=testuser3) +Trigger Event Table Statement Timing Created sql_mode Definer character_set_client collation_connection Database Collation +trg1 INSERT t1 SET @test_before = 2, new.f1 = @test_before BEFORE # testuser1@localhost latin1 latin1_swedish_ci latin1_swedish_ci +connect testuser3, localhost, testuser3, , test; SHOW GRANTS FOR 'testuser3'@'localhost'; -# SUPER Privilege + SELECT Privilege on t1 --> result for query +# TRIGGER Privilege + SELECT Privilege on t1 --> result for query SELECT * FROM information_schema.triggers WHERE trigger_name = 'trg1'; -TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED SQL_MODE DEFINER -NULL db_datadict trg1 INSERT NULL db_datadict t1 0 NULL SET @test_before = 2, new.f1 = @test_before ROW BEFORE NULL NULL OLD NEW NULL testuser1@localhost +TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED SQL_MODE DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION +def db_datadict trg1 INSERT def db_datadict t1 1 NULL SET @test_before = 2, new.f1 = @test_before ROW BEFORE NULL NULL OLD NEW # testuser1@localhost latin1 latin1_swedish_ci latin1_swedish_ci SHOW TRIGGERS FROM db_datadict; -Trigger Event Table Statement Timing Created sql_mode Definer -trg1 INSERT t1 SET @test_before = 2, new.f1 = @test_before BEFORE NULL testuser1@localhost -# Establish connection testuser4 (user=testuser4) +Trigger Event Table Statement Timing Created sql_mode Definer character_set_client collation_connection Database Collation +trg1 INSERT t1 SET @test_before = 2, new.f1 = @test_before BEFORE # testuser1@localhost latin1 latin1_swedish_ci latin1_swedish_ci +connect testuser4, localhost, testuser4, , test; SHOW GRANTS FOR 'testuser4'@'localhost'; -# SUPER Privilege + no SELECT Privilege on t1 --> no result for query +# TRIGGER Privilege + no SELECT Privilege on t1 --> result for query +SELECT * FROM db_datadict.t1; +f1 f2 f3 +DESC db_datadict.t1; +Field Type Null Key Default Extra +f1 int(11) YES NULL +f2 int(11) YES NULL +f3 int(11) YES NULL SELECT * FROM information_schema.triggers WHERE trigger_name = 'trg1'; -TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED SQL_MODE DEFINER -NULL db_datadict trg1 INSERT NULL db_datadict t1 0 NULL SET @test_before = 2, new.f1 = @test_before ROW BEFORE NULL NULL OLD NEW NULL testuser1@localhost +TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED SQL_MODE DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION +def db_datadict trg1 INSERT def db_datadict t1 1 NULL SET @test_before = 2, new.f1 = @test_before ROW BEFORE NULL NULL OLD NEW # testuser1@localhost latin1 latin1_swedish_ci latin1_swedish_ci SHOW TRIGGERS FROM db_datadict; -Trigger Event Table Statement Timing Created sql_mode Definer -trg1 INSERT t1 SET @test_before = 2, new.f1 = @test_before BEFORE NULL testuser1@localhost -# Switch to connection default and close connections testuser1 - testuser4 +Trigger Event Table Statement Timing Created sql_mode Definer character_set_client collation_connection Database Collation +trg1 INSERT t1 SET @test_before = 2, new.f1 = @test_before BEFORE # testuser1@localhost latin1 latin1_swedish_ci latin1_swedish_ci +connection default; +disconnect testuser1; +disconnect testuser2; +disconnect testuser3; +disconnect testuser4; SELECT * FROM information_schema.triggers WHERE trigger_name = 'trg1'; -TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED SQL_MODE DEFINER -NULL db_datadict trg1 INSERT NULL db_datadict t1 0 NULL SET @test_before = 2, new.f1 = @test_before ROW BEFORE NULL NULL OLD NEW NULL testuser1@localhost +TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED SQL_MODE DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION +def db_datadict trg1 INSERT def db_datadict t1 1 NULL SET @test_before = 2, new.f1 = @test_before ROW BEFORE NULL NULL OLD NEW # testuser1@localhost latin1 latin1_swedish_ci latin1_swedish_ci SHOW TRIGGERS FROM db_datadict; -Trigger Event Table Statement Timing Created sql_mode Definer -trg1 INSERT t1 SET @test_before = 2, new.f1 = @test_before BEFORE NULL testuser1@localhost +Trigger Event Table Statement Timing Created sql_mode Definer character_set_client collation_connection Database Collation +trg1 INSERT t1 SET @test_before = 2, new.f1 = @test_before BEFORE # testuser1@localhost latin1 latin1_swedish_ci latin1_swedish_ci DROP USER 'testuser1'@'localhost'; DROP USER 'testuser2'@'localhost'; DROP USER 'testuser3'@'localhost'; @@ -188,7 +212,7 @@ SELECT * FROM information_schema.triggers; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' UPDATE information_schema.triggers SET trigger_schema = 'test' WHERE table_name = 't1'; -ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' +Got one of the listed errors DELETE FROM information_schema.triggers WHERE trigger_name = 't1'; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' TRUNCATE information_schema.triggers; @@ -206,3 +230,4 @@ ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_ ALTER TABLE information_schema.triggers RENAME information_schema.xtriggers; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' DROP DATABASE db_datadict; +set global sql_mode=default; diff --git a/mysql-test/suite/funcs_1/r/is_views.result b/mysql-test/suite/funcs_1/r/is_views.result index fb3daef3317..cc50b8033f0 100644 --- a/mysql-test/suite/funcs_1/r/is_views.result +++ b/mysql-test/suite/funcs_1/r/is_views.result @@ -234,7 +234,7 @@ VALUES ('db2', 'v2'); ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' UPDATE information_schema.views SET table_schema = 'test' WHERE table_name = 't1'; -ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' +Got one of the listed errors DELETE FROM information_schema.views WHERE table_name = 't1'; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' TRUNCATE information_schema.views; diff --git a/mysql-test/suite/funcs_1/r/is_views_embedded.result b/mysql-test/suite/funcs_1/r/is_views_embedded.result index 21f799fca79..1f2e23c3610 100644 --- a/mysql-test/suite/funcs_1/r/is_views_embedded.result +++ b/mysql-test/suite/funcs_1/r/is_views_embedded.result @@ -28,36 +28,45 @@ DROP FUNCTION test.f1; ######################################################################### DESCRIBE information_schema.VIEWS; Field Type Null Key Default Extra -TABLE_CATALOG varchar(512) YES NULL +TABLE_CATALOG varchar(512) NO TABLE_SCHEMA varchar(64) NO TABLE_NAME varchar(64) NO -VIEW_DEFINITION longtext NO NULL +VIEW_DEFINITION longtext NO CHECK_OPTION varchar(8) NO IS_UPDATABLE varchar(3) NO -DEFINER varchar(77) NO +DEFINER varchar(189) NO SECURITY_TYPE varchar(7) NO +CHARACTER_SET_CLIENT varchar(32) NO +COLLATION_CONNECTION varchar(32) NO +ALGORITHM varchar(10) NO SHOW CREATE TABLE information_schema.VIEWS; Table Create Table VIEWS CREATE TEMPORARY TABLE `VIEWS` ( - `TABLE_CATALOG` varchar(512) default NULL, - `TABLE_SCHEMA` varchar(64) NOT NULL default '', - `TABLE_NAME` varchar(64) NOT NULL default '', - `VIEW_DEFINITION` longtext NOT NULL, - `CHECK_OPTION` varchar(8) NOT NULL default '', - `IS_UPDATABLE` varchar(3) NOT NULL default '', - `DEFINER` varchar(77) NOT NULL default '', - `SECURITY_TYPE` varchar(7) NOT NULL default '' -) ENGINE=MyISAM DEFAULT CHARSET=utf8 + `TABLE_CATALOG` varchar(512) NOT NULL DEFAULT '', + `TABLE_SCHEMA` varchar(64) NOT NULL DEFAULT '', + `TABLE_NAME` varchar(64) NOT NULL DEFAULT '', + `VIEW_DEFINITION` longtext NOT NULL DEFAULT '', + `CHECK_OPTION` varchar(8) NOT NULL DEFAULT '', + `IS_UPDATABLE` varchar(3) NOT NULL DEFAULT '', + `DEFINER` varchar(189) NOT NULL DEFAULT '', + `SECURITY_TYPE` varchar(7) NOT NULL DEFAULT '', + `CHARACTER_SET_CLIENT` varchar(32) NOT NULL DEFAULT '', + `COLLATION_CONNECTION` varchar(32) NOT NULL DEFAULT '', + `ALGORITHM` varchar(10) NOT NULL DEFAULT '' +) DEFAULT CHARSET=utf8 SHOW COLUMNS FROM information_schema.VIEWS; Field Type Null Key Default Extra -TABLE_CATALOG varchar(512) YES NULL +TABLE_CATALOG varchar(512) NO TABLE_SCHEMA varchar(64) NO TABLE_NAME varchar(64) NO -VIEW_DEFINITION longtext NO NULL +VIEW_DEFINITION longtext NO CHECK_OPTION varchar(8) NO IS_UPDATABLE varchar(3) NO -DEFINER varchar(77) NO +DEFINER varchar(189) NO SECURITY_TYPE varchar(7) NO +CHARACTER_SET_CLIENT varchar(32) NO +COLLATION_CONNECTION varchar(32) NO +ALGORITHM varchar(10) NO SELECT table_catalog, table_schema, table_name FROM information_schema.views WHERE table_catalog IS NOT NULL; table_catalog table_schema table_name @@ -81,28 +90,31 @@ GRANT SELECT ON db_datadict.v_granted_to_1 TO 'testuser1'@'localhost'; GRANT SHOW VIEW, CREATE VIEW ON db_datadict.* TO 'testuser2'@'localhost'; SELECT * FROM information_schema.views WHERE table_schema = 'db_datadict' ORDER BY table_name; -TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE DEFINER SECURITY_TYPE -NULL db_datadict v_granted_glob /* ALGORITHM=UNDEFINED */ select `db_datadict`.`t1`.`f2` AS `f2`,`db_datadict`.`t1`.`f3` AS `f3` from `db_datadict`.`t1` NONE YES root@localhost DEFINER -NULL db_datadict v_granted_to_1 /* ALGORITHM=UNDEFINED */ select `db_datadict`.`t1`.`f1` AS `f1`,`db_datadict`.`t1`.`f2` AS `f2`,`db_datadict`.`t1`.`f3` AS `f3` from `db_datadict`.`t1` NONE YES root@localhost DEFINER -# Establish connection testuser1 (user=testuser1) +TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE DEFINER SECURITY_TYPE CHARACTER_SET_CLIENT COLLATION_CONNECTION ALGORITHM +def db_datadict v_granted_glob select `db_datadict`.`t1`.`f2` AS `f2`,`db_datadict`.`t1`.`f3` AS `f3` from `db_datadict`.`t1` NONE YES root@localhost DEFINER latin1 latin1_swedish_ci UNDEFINED +def db_datadict v_granted_to_1 select `db_datadict`.`t1`.`f1` AS `f1`,`db_datadict`.`t1`.`f2` AS `f2`,`db_datadict`.`t1`.`f3` AS `f3` from `db_datadict`.`t1` NONE YES root@localhost DEFINER latin1 latin1_swedish_ci UNDEFINED +connect testuser1, localhost, testuser1, , test; SELECT * FROM information_schema.views WHERE table_schema = 'db_datadict' ORDER BY table_name; -TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE DEFINER SECURITY_TYPE -NULL db_datadict v_granted_glob NONE YES root@localhost DEFINER -NULL db_datadict v_granted_to_1 NONE YES root@localhost DEFINER -# Establish connection testuser2 (user=testuser2) +TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE DEFINER SECURITY_TYPE CHARACTER_SET_CLIENT COLLATION_CONNECTION ALGORITHM +def db_datadict v_granted_glob NONE YES root@localhost DEFINER latin1 latin1_swedish_ci UNDEFINED +def db_datadict v_granted_to_1 NONE YES root@localhost DEFINER latin1 latin1_swedish_ci UNDEFINED +connect testuser2, localhost, testuser2, , test; SELECT * FROM information_schema.views WHERE table_schema = 'db_datadict' ORDER BY table_name; -TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE DEFINER SECURITY_TYPE -NULL db_datadict v_granted_glob NONE YES root@localhost DEFINER -NULL db_datadict v_granted_to_1 NONE YES root@localhost DEFINER -# Establish connection test_no_views (user=test_no_views) +TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE DEFINER SECURITY_TYPE CHARACTER_SET_CLIENT COLLATION_CONNECTION ALGORITHM +def db_datadict v_granted_glob NONE YES root@localhost DEFINER latin1 latin1_swedish_ci UNDEFINED +def db_datadict v_granted_to_1 NONE YES root@localhost DEFINER latin1 latin1_swedish_ci UNDEFINED +connect test_no_views, localhost, test_no_views, , test; SELECT * FROM information_schema.views WHERE table_schema = 'db_datadict' ORDER BY table_name; -TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE DEFINER SECURITY_TYPE -NULL db_datadict v_granted_glob NONE YES root@localhost DEFINER -NULL db_datadict v_granted_to_1 NONE YES root@localhost DEFINER -# Switch to connection default and close all other connections +TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE DEFINER SECURITY_TYPE CHARACTER_SET_CLIENT COLLATION_CONNECTION ALGORITHM +def db_datadict v_granted_glob NONE YES root@localhost DEFINER latin1 latin1_swedish_ci UNDEFINED +def db_datadict v_granted_to_1 NONE YES root@localhost DEFINER latin1 latin1_swedish_ci UNDEFINED +connection default; +disconnect testuser1; +disconnect testuser2; +disconnect test_no_views; DROP USER 'testuser1'@'localhost'; DROP USER 'testuser2'@'localhost'; DROP USER 'test_no_views'@'localhost'; @@ -120,12 +132,18 @@ DROP USER 'testuser1'@'localhost'; CREATE USER 'testuser1'@'localhost'; SELECT * FROM information_schema.views WHERE table_name LIKE 't1_%'; -TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE DEFINER SECURITY_TYPE +TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE DEFINER SECURITY_TYPE CHARACTER_SET_CLIENT COLLATION_CONNECTION ALGORITHM CREATE VIEW test.t1_view AS SELECT DISTINCT f1 FROM test.t1_table; +CREATE ALGORITHM=MERGE VIEW test.t1_view1 AS SELECT f1 FROM test.t1_table; +CREATE ALGORITHM=TEMPTABLE VIEW test.t1_view2 AS SELECT f1 FROM test.t1_table; SELECT * FROM information_schema.views WHERE table_name LIKE 't1_%'; -TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE DEFINER SECURITY_TYPE -NULL test t1_view /* ALGORITHM=UNDEFINED */ select distinct `test`.`t1_table`.`f1` AS `f1` from `test`.`t1_table` NONE NO root@localhost DEFINER +TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE DEFINER SECURITY_TYPE CHARACTER_SET_CLIENT COLLATION_CONNECTION ALGORITHM +def test t1_view select distinct `test`.`t1_table`.`f1` AS `f1` from `test`.`t1_table` NONE NO root@localhost DEFINER latin1 latin1_swedish_ci UNDEFINED +def test t1_view1 select `test`.`t1_table`.`f1` AS `f1` from `test`.`t1_table` NONE YES root@localhost DEFINER latin1 latin1_swedish_ci MERGE +def test t1_view2 select `test`.`t1_table`.`f1` AS `f1` from `test`.`t1_table` NONE NO root@localhost DEFINER latin1 latin1_swedish_ci TEMPTABLE +DROP VIEW test.t1_view1; +DROP VIEW test.t1_view2; SELECT table_name,definer FROM information_schema.views WHERE table_name = 't1_view'; table_name definer @@ -148,7 +166,7 @@ ORDER BY table_schema,table_name; table_schema table_name test t1_view RENAME TABLE test.t1_view TO db_datadict.t1_view; -ERROR HY000: Changing schema from 'test' to 'db_datadict' is not allowed. +ERROR HY000: Changing schema from 'test' to 'db_datadict' is not allowed DROP VIEW test.t1_view; CREATE VIEW db_datadict.t1_view AS SELECT * FROM test.t1_table; SELECT table_schema,table_name FROM information_schema.views @@ -189,8 +207,6 @@ WHERE table_name LIKE 't1_%' ORDER BY table_name; table_name t1_view -Warnings: -Warning 1356 View 'db_datadict.t1_view' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them CREATE TABLE test.t1_table (f1 BIGINT, f2 CHAR(10)) DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci COMMENT = 'Initial Comment' ENGINE = ; @@ -221,7 +237,7 @@ VALUES ('db2', 'v2'); ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' UPDATE information_schema.views SET table_schema = 'test' WHERE table_name = 't1'; -ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' +Got one of the listed errors DELETE FROM information_schema.views WHERE table_name = 't1'; ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' TRUNCATE information_schema.views; diff --git a/mysql-test/suite/funcs_1/t/is_character_sets.test b/mysql-test/suite/funcs_1/t/is_character_sets.test index c280985944c..22ed5aebb12 100644 --- a/mysql-test/suite/funcs_1/t/is_character_sets.test +++ b/mysql-test/suite/funcs_1/t/is_character_sets.test @@ -9,11 +9,6 @@ # Create this script based on older scripts and new code. # -if (`SELECT VERSION() LIKE '%embedded%'`) -{ - --skip Bug#37456 funcs_1: Several tests crash when used with embedded server -} - let $is_table = CHARACTER_SETS; # The table INFORMATION_SCHEMA.CHARACTER_SETS must exist @@ -82,7 +77,7 @@ CREATE DATABASE db_datadict; INSERT INTO information_schema.character_sets SELECT * FROM information_schema.character_sets; ---error ER_DBACCESS_DENIED_ERROR +--error ER_DBACCESS_DENIED_ERROR,ER_NON_UPDATABLE_TABLE UPDATE information_schema.character_sets SET description = 'just updated'; --error ER_DBACCESS_DENIED_ERROR diff --git a/mysql-test/suite/funcs_1/t/is_coll_char_set_appl.test b/mysql-test/suite/funcs_1/t/is_coll_char_set_appl.test index 84690b0647c..d2a33592801 100644 --- a/mysql-test/suite/funcs_1/t/is_coll_char_set_appl.test +++ b/mysql-test/suite/funcs_1/t/is_coll_char_set_appl.test @@ -9,11 +9,6 @@ # Create this script based on older scripts and new code. # -if (`SELECT VERSION() LIKE '%embedded%'`) -{ - --skip Bug#37456 funcs_1: Several tests crash when used with embedded server -} - let $is_table = COLLATION_CHARACTER_SET_APPLICABILITY; # The table INFORMATION_SCHEMA.CHARACTER_SET_APPLICABILITY must exist @@ -79,10 +74,10 @@ CREATE DATABASE db_datadict; INSERT INTO information_schema.collation_character_set_applicability SELECT * FROM information_schema.collation_character_set_applicability; ---error ER_DBACCESS_DENIED_ERROR +--error ER_DBACCESS_DENIED_ERROR,ER_NON_UPDATABLE_TABLE UPDATE information_schema.collation_character_set_applicability SET collation_name = 'big6_chinese_ci' WHERE character_set_name = 'big6'; ---error ER_DBACCESS_DENIED_ERROR +--error ER_DBACCESS_DENIED_ERROR,ER_NON_UPDATABLE_TABLE UPDATE information_schema.collation_character_set_applicability SET character_set_name = 't_4711'; diff --git a/mysql-test/suite/funcs_1/t/is_collations.test b/mysql-test/suite/funcs_1/t/is_collations.test index 5bfd9e35cdb..db34a7b77b1 100644 --- a/mysql-test/suite/funcs_1/t/is_collations.test +++ b/mysql-test/suite/funcs_1/t/is_collations.test @@ -9,10 +9,6 @@ # Create this script based on older scripts and new code. # -if (`SELECT VERSION() LIKE '%embedded%'`) -{ - --skip Bug#37456 funcs_1: Several tests crash when used with embedded server -} let $is_table = COLLATIONS; # The table INFORMATION_SCHEMA.COLLATIONS must exist @@ -86,7 +82,7 @@ INSERT INTO information_schema.collations (collation_name,character_set_name,id,is_default,is_compiled,sortlen) VALUES ( 'cp1251_bin', 'cp1251',50, '', '',0); ---error ER_DBACCESS_DENIED_ERROR +--error ER_DBACCESS_DENIED_ERROR,ER_NON_UPDATABLE_TABLE UPDATE information_schema.collations SET description = 'just updated'; --error ER_DBACCESS_DENIED_ERROR diff --git a/mysql-test/suite/funcs_1/t/is_engines.test b/mysql-test/suite/funcs_1/t/is_engines.test index 3a0cf3168e8..1a361d2186d 100644 --- a/mysql-test/suite/funcs_1/t/is_engines.test +++ b/mysql-test/suite/funcs_1/t/is_engines.test @@ -15,11 +15,6 @@ # testsuite funcs_1 # -if (`SELECT VERSION() LIKE '%embedded%'`) -{ - --skip Bug#37456 funcs_1: Several tests crash when used with embedded server -} - let $engine_type = MEMORY; let $other_engine_type = MyISAM; @@ -100,7 +95,7 @@ ENGINE = $engine_type; INSERT INTO information_schema.engines SELECT * FROM information_schema.engines; ---error ER_DBACCESS_DENIED_ERROR +--error ER_DBACCESS_DENIED_ERROR,ER_NON_UPDATABLE_TABLE UPDATE information_schema.engines SET engine = '1234567'; --error ER_DBACCESS_DENIED_ERROR diff --git a/mysql-test/suite/funcs_1/t/is_events.test b/mysql-test/suite/funcs_1/t/is_events.test index 400094966b1..69d1af6b2f7 100644 --- a/mysql-test/suite/funcs_1/t/is_events.test +++ b/mysql-test/suite/funcs_1/t/is_events.test @@ -10,11 +10,6 @@ # testsuite funcs_1 # -if (`SELECT VERSION() LIKE '%embedded%'`) -{ - --skip Bug#37456 funcs_1: Several tests crash when used with embedded server -} - let $engine_type = MEMORY; let $other_engine_type = MyISAM; @@ -143,7 +138,7 @@ ENGINE = $engine_type; INSERT INTO information_schema.events SELECT * FROM information_schema.events; ---error ER_DBACCESS_DENIED_ERROR +--error ER_DBACCESS_DENIED_ERROR,ER_NON_UPDATABLE_TABLE UPDATE information_schema.events SET event_name = '1234567' WHERE table_name = 't1'; diff --git a/mysql-test/suite/funcs_1/t/is_key_column_usage_embedded.test b/mysql-test/suite/funcs_1/t/is_key_column_usage_embedded.test index 7a823821a6b..d7e5b1ddb8d 100644 --- a/mysql-test/suite/funcs_1/t/is_key_column_usage_embedded.test +++ b/mysql-test/suite/funcs_1/t/is_key_column_usage_embedded.test @@ -18,8 +18,4 @@ if (`SELECT VERSION() NOT LIKE '%embedded%'`) { --skip Test requires: embedded server } -if (`SELECT VERSION() LIKE '%embedded%'`) -{ - --skip Bug#37456 funcs_1: Several tests crash when used with embedded server -} --source suite/funcs_1/datadict/is_key_column_usage.inc diff --git a/mysql-test/suite/funcs_1/t/is_routines_embedded.test b/mysql-test/suite/funcs_1/t/is_routines_embedded.test index c8bd04e1f31..86e1145690d 100644 --- a/mysql-test/suite/funcs_1/t/is_routines_embedded.test +++ b/mysql-test/suite/funcs_1/t/is_routines_embedded.test @@ -17,8 +17,4 @@ if (`SELECT VERSION() NOT LIKE '%embedded%'`) { --skip Test requires: embedded server } -if (`SELECT VERSION() LIKE '%embedded%'`) -{ - --skip Bug#37456 funcs_1: Several tests crash when used with embedded server -} --source suite/funcs_1/datadict/is_routines.inc diff --git a/mysql-test/suite/funcs_1/t/is_schemata_embedded.test b/mysql-test/suite/funcs_1/t/is_schemata_embedded.test index d5bfd6fa2b4..5fbb023dd8e 100644 --- a/mysql-test/suite/funcs_1/t/is_schemata_embedded.test +++ b/mysql-test/suite/funcs_1/t/is_schemata_embedded.test @@ -17,8 +17,4 @@ if (`SELECT VERSION() NOT LIKE '%embedded%'`) { --skip Test requires: embedded server } -if (`SELECT VERSION() LIKE '%embedded%'`) -{ - --skip Bug#37456 funcs_1: Several tests crash when used with embedded server -} --source suite/funcs_1/datadict/is_schemata.inc diff --git a/mysql-test/suite/funcs_1/t/is_table_constraints.test b/mysql-test/suite/funcs_1/t/is_table_constraints.test index d1659517e79..96853edac2c 100644 --- a/mysql-test/suite/funcs_1/t/is_table_constraints.test +++ b/mysql-test/suite/funcs_1/t/is_table_constraints.test @@ -172,7 +172,7 @@ WHERE table_name LIKE 't1_my_table%'; --replace_result $engine_type eval CREATE TABLE test.t1_my_table - (f1 CHAR(12), f2 TIMESTAMP, f4 BIGINT, PRIMARY KEY(f1,f2)) + (f1 CHAR(12), f2 TIMESTAMP, f4 BIGINT, PRIMARY KEY(f1)) DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ENGINE = $engine_type; # Settings used in CREATE TABLE must be visible diff --git a/mysql-test/suite/funcs_1/t/is_tables_embedded.test b/mysql-test/suite/funcs_1/t/is_tables_embedded.test index 8514d9815f1..d3c59ffff36 100644 --- a/mysql-test/suite/funcs_1/t/is_tables_embedded.test +++ b/mysql-test/suite/funcs_1/t/is_tables_embedded.test @@ -17,8 +17,4 @@ if (`SELECT VERSION() NOT LIKE '%embedded%'`) { --skip Test requires: embedded server } -if (`SELECT VERSION() LIKE '%embedded%'`) -{ - --skip Bug#37456 funcs_1: Several tests crash when used with embedded server -} --source suite/funcs_1/datadict/is_tables.inc diff --git a/mysql-test/suite/funcs_1/t/is_triggers_embedded.test b/mysql-test/suite/funcs_1/t/is_triggers_embedded.test index 5ec533ad4d9..d8e99c77bff 100644 --- a/mysql-test/suite/funcs_1/t/is_triggers_embedded.test +++ b/mysql-test/suite/funcs_1/t/is_triggers_embedded.test @@ -17,8 +17,4 @@ if (`SELECT VERSION() NOT LIKE '%embedded%'`) { --skip Test requires: embedded server } -if (`SELECT VERSION() LIKE '%embedded%'`) -{ - --skip Bug#37456 funcs_1: Several tests crash when used with embedded server -} --source suite/funcs_1/datadict/is_triggers.inc diff --git a/mysql-test/suite/funcs_1/t/is_views_embedded.test b/mysql-test/suite/funcs_1/t/is_views_embedded.test index a2b69d64a52..66b4f59e897 100644 --- a/mysql-test/suite/funcs_1/t/is_views_embedded.test +++ b/mysql-test/suite/funcs_1/t/is_views_embedded.test @@ -17,8 +17,4 @@ if (`SELECT VERSION() NOT LIKE '%embedded%'`) { --skip Test requires: embedded server } -if (`SELECT VERSION() LIKE '%embedded%'`) -{ - --skip Bug#37456 funcs_1: Several tests crash when used with embedded server -} --source suite/funcs_1/datadict/is_views.inc diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index 6c3efc77e20..423c83208f8 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -1,60 +1,58 @@ -galera_wsrep_provider_unset_set : lp1379204 'Unsupported protocol downgrade: incremental data collection disabled. Expect abort.' -galera_kill_nochanges : mysql-wsrep#24 Galera server does not restart properly if killed -galera_bf_abort_for_update : mysql-wsrep#26 SELECT FOR UPDATE sometimes allowed to proceed in the face of a concurrent update -galera_toi_ddl_fk_insert : qa#39 galera_toi_ddl_fk_insert fails sporadically -galera_binlog_row_image : MDEV-7471 - Enable binlog_row_image parameter in MariaDB -galera_binlog_rows_query_log_events : Unknown system variable 'binlog_rows_query_log_events' (see annotate_rows_log_event) - -galera_ist_mysqldump : Lost connection to MySQL server during query -galera_ist_xtrabackup-v2 : mysqltest failed but provided no output -galera_ist_innodb_flush_logs : mysqltest failed but provided no output -galera_sst_mysqldump : query 'show status' failed with wrong errno 1927 -galera_as_master_gtid : Needs to be re-worked -galera_as_master_gtid_change_master : Needs to be re-worked -galera_migrate : query 'let $success= `$wait_condition`' failed: 1146 -galera_var_notify_cmd : Result content mismatch -query_cache : Fails intermittently due to content mismatch. Needs to be investigated -basic : Fails intermittently without providing any output. Needs to be investigated -galera_var_auto_inc_control_on : Failing sporadically with content mismatch -galera_parallel_simple : Failing sporadically -galera_bf_abort : Failing sporadically -galera_log_output_csv : Failing sporadically -galera_as_slave_preordered : wsrep-preordered is not available in MariaDB Galera cluster -galera_gra_log : TODO: investigate -galera_as_slave_replication_bundle : TODO: investigate -galera_ssl_upgrade : TODO: investigate -mysql-wsrep#90 : TODO: investigate -galera_flush : mysql-wsrep/issues/229 -galera_transaction_read_only : mysql-wsrep/issues/229 -galera_gcs_fragment : Incorrect arguments to SET -galera_flush_local : Fails sporadically -galera_binlog_stmt_autoinc : TODO: investigate -galera_concurrent_ctas : Test times out, investigate -MW-286 : TODO: investigate -galera_sst_xtrabackup-v2-options : TODO: Fix test case -galera_sst_xtrabackup-v2 : MDEV-11208 -galera_sst_xtrabackup-v2_encrypt_with_key : MDEV-11208 -mysql-wsrep#33 : TODO: investigate +############################################################################## +# +# List the test cases that are to be disabled temporarily. +# +# Separate the test case name and the comment with ':'. +# +# : MDEV- +# +# Do not use any TAB characters for whitespace. +# +############################################################################## +MW-336 : MDEV-13549 Galera test failures +galera_gra_log : MDEV-13549 Galera test failures +galera_flush_local : MDEV-13549 Galera test failures +galera_flush : MDEV-13549 Galera test failures +MW-329 : MDEV-13549 Galera test failures +galera_account_management : MariaDB 10.0 does not support ALTER USER +galera_binlog_row_image : MariaDB 10.0 does not support binlog_row_image +galera_binlog_rows_query_log_events: MariaDB does not support binlog_rows_query_log_events +GAL-419 : MDEV-13549 Galera test failures +galera_toi_ddl_fk_insert : MDEV-13549 Galera test failures +galera_var_notify_cmd : MDEV-13549 Galera test failures +galera_var_slave_threads : MDEV-13549 Galera test failures +mysql-wsrep#90 : MDEV-13549 Galera test failures +galera_as_master_gtid : Requires MySQL GTID +galera_as_master_gtid_change_master : Requires MySQL GTID +galera_as_slave_replication_bundle : MDEV-13549 Galera test failures +galera_as_slave_preordered : wsrep-preordered feature not merged to MariaDB +galera_gcs_fragment : MDEV-13549 Galera test failures +galera_gcache_recover : MDEV-13549 Galera test failures +galera_gcache_recover_full_gcache : MDEV-13549 Galera test failures +galera_gcache_recover_manytrx : MDEV-13549 Galera test failures +galera_ist_mysqldump : MDEV-13549 Galera test failures +mysql-wsrep#31 : MDEV-13549 Galera test failures +galera_migrate : MariaDB 10.0 does not support START SLAVE USER +galera_concurrent_ctas : MDEV-13549 Galera test failures +galera_bf_abort_for_update : MDEV-13549 Galera test failures +galera_wsrep_desync_wsrep_on : MDEV-13549 Galera test failures +galera_ssl_upgrade : MDEV-13549 Galera test failures +mysql-wsrep#33 : MDEV-13549 Galera test failures +galera_var_auto_inc_control_on : MDEV-13549 Galera test failures +MW-44 : MDEV-13549 Galera test failures +galera_var_retry_autocommit : MDEV-13549 Galera test failures +pxc-421 : MDEV-13549 Galera test failures +lp1376747-2 : MDEV-13549 Galera test failures +lp1376747 : MDEV-13549 Galera test failures +galera_toi_ddl_nonconflicting : MDEV-13549 Galera test failures +galera_parallel_simple : MDEV-13549 Galera test failures +galera_admin : MDEV-13549 Galera test failures +galera_var_max_ws_rows : MDEV-13549 Galera test failures 10.1 +MW-286 : MDEV-13549 Galera test failures 10.1 +galera_as_master: MDEV-13549 Galera test failures 10.1 +galera_pc_ignore_sb : MDEV-13549 Galera test failures 10.1 +galera_lock_table : MDEV-13549 Galera test failures 10.1 +MW-284 : MDEV-13549 Galera test failures 10.1 +galera_as_slave : MDEV-13549 Galera test failures 10.1 galera_var_innodb_disallow_writes : MDEV-10949 -MW-258 : MDEV-11229 -galera_as_master : MDEV-11229 -MW-44 : MDEV-11229 -galera_gcs_fc_limit : MDEV-11229 -galera_roles : MDEV-11229 -galera_lock_table : MDEV-11229 -GAL-480 : Investigate -galera_fk_no_pk :Investigate -galera_account_management : Investigate -galera.galera_var_retry_autocommit : MDEV-12319 #Sparodic Faliure -galera.galera_gcs_fc_limit : MDEV-12319 #Sparodic Faliure -galera.galera_toi_ddl_nonconflicting : MDEV-12319 #Sparodic Faliure -galera.mysql-wsrep#198 : MDEV-12319 #Sparodic Faliure -galera.galera_pc_ignore_sb : MDEV-12319 #Sparodic Faliure -galera.MW-329 : MDEV-12319 #Sparodic Faliure -galera.galera_ist_recv_bind : MDEV-12319 #Failed to start mysqld -galera.galera_ist_restart_joiner : MDEV-12319 #Failed to start mysqld -galera.galera_ssl_compression : MDEV-12319 #Failed to start mysqld -galera.galera_wan : MDEV-12319 #Failed to start mysqld -galera.rpl_row_annotate : MDEV-12319 #Failed to start mysqld -galera_restart_on_unknown_option : Solve -galera_kill_applier : Investigate; problem introduced in merge from 10.1 +galera_kill_applier : race condition at the start of the test diff --git a/mysql-test/suite/galera/galera_2nodes.cnf b/mysql-test/suite/galera/galera_2nodes.cnf index 34bf1fc58fe..b24f3603894 100644 --- a/mysql-test/suite/galera/galera_2nodes.cnf +++ b/mysql-test/suite/galera/galera_2nodes.cnf @@ -9,14 +9,14 @@ default-storage-engine=innodb wsrep-provider=@ENV.WSREP_PROVIDER wsrep_node_address=127.0.0.1 # enforce read-committed characteristics across the cluster -wsrep-sync-wait=7 +wsrep-sync-wait=15 [mysqld.1] #galera_port=@OPT.port #ist_port=@OPT.port #sst_port=@OPT.port wsrep-cluster-address=gcomm:// -wsrep_provider_options='repl.causal_read_timeout=PT90S;base_port=@mysqld.1.#galera_port;gcache.size=10M;evs.suspect_timeout=PT10S' +wsrep_provider_options='repl.causal_read_timeout=PT90S;base_port=@mysqld.1.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;gcache.size=10M' wsrep_node_incoming_address=127.0.0.1:@mysqld.1.port wsrep_sst_receive_address='127.0.0.1:@mysqld.1.#sst_port' @@ -29,7 +29,7 @@ wsrep_provider_options='repl.causal_read_timeout=PT90S;base_port=@mysqld.2.#gale # enforce read-committed characteristics across the cluster wsrep_causal_reads=ON -wsrep_sync_wait = 7 +wsrep_sync_wait = 15 wsrep_node_address=127.0.0.1 wsrep_sst_receive_address=127.0.0.2:@mysqld.2.#sst_port diff --git a/mysql-test/suite/galera/galera_2nodes_as_master.cnf b/mysql-test/suite/galera/galera_2nodes_as_master.cnf index 68c0cca29a2..33bfc475721 100644 --- a/mysql-test/suite/galera/galera_2nodes_as_master.cnf +++ b/mysql-test/suite/galera/galera_2nodes_as_master.cnf @@ -29,7 +29,7 @@ wsrep_node_address=127.0.0.1 wsrep_node_incoming_address=127.0.0.1:@mysqld.1.port # enforce read-committed characteristics across the cluster wsrep-causal-reads=ON -wsrep-sync-wait=7 +wsrep-sync-wait=15 [mysqld.2] #galera_port=@OPT.port @@ -48,7 +48,7 @@ wsrep_node_address=127.0.0.1 wsrep_node_incoming_address=127.0.0.1:@mysqld.2.port # enforce read-committed characteristics across the cluster wsrep-causal-reads=ON -wsrep-sync-wait=7 +wsrep-sync-wait=15 [mysqld.3] server-id=3 diff --git a/mysql-test/suite/galera/galera_2nodes_as_master_slave.cnf b/mysql-test/suite/galera/galera_2nodes_as_master_slave.cnf index 716a790fea6..f68fe524904 100644 --- a/mysql-test/suite/galera/galera_2nodes_as_master_slave.cnf +++ b/mysql-test/suite/galera/galera_2nodes_as_master_slave.cnf @@ -29,7 +29,7 @@ wsrep_provider_options='base_port=@mysqld.2.#galera_port;evs.install_timeout = P # enforce read-committed characteristics across the cluster wsrep_causal_reads=ON -wsrep_sync_wait = 7 +wsrep_sync_wait = 15 wsrep_node_address=127.0.0.1 wsrep_sst_receive_address=127.0.0.2:@mysqld.2.#sst_port @@ -49,7 +49,7 @@ wsrep_provider_options='base_port=@mysqld.3.#galera_port;evs.install_timeout = P # enforce read-committed characteristics across the cluster wsrep_causal_reads=ON -wsrep_sync_wait = 7 +wsrep_sync_wait = 15 wsrep_node_address=127.0.0.1 wsrep_sst_receive_address=127.0.0.2:@mysqld.3.#sst_port diff --git a/mysql-test/suite/galera/galera_2nodes_as_master_with_repl_filter.cnf b/mysql-test/suite/galera/galera_2nodes_as_master_with_repl_filter.cnf index 5f0af2e58e5..d5490280ab2 100644 --- a/mysql-test/suite/galera/galera_2nodes_as_master_with_repl_filter.cnf +++ b/mysql-test/suite/galera/galera_2nodes_as_master_with_repl_filter.cnf @@ -23,7 +23,7 @@ wsrep_provider_options='base_port=@mysqld.1.#galera_port' # enforce read-committed characteristics across the cluster wsrep_causal_reads=ON -wsrep_sync_wait = 7 +wsrep_sync_wait = 15 wsrep_node_address=127.0.0.1 wsrep_sst_receive_address=127.0.0.2:@mysqld.1.#sst_port @@ -49,7 +49,7 @@ wsrep_provider_options='base_port=@mysqld.2.#galera_port' # enforce read-committed characteristics across the cluster wsrep_causal_reads=ON -wsrep_sync_wait = 7 +wsrep_sync_wait = 15 wsrep_node_address=127.0.0.1 wsrep_sst_receive_address=127.0.0.2:@mysqld.2.#sst_port diff --git a/mysql-test/suite/galera/galera_2nodes_as_slave.cnf b/mysql-test/suite/galera/galera_2nodes_as_slave.cnf index 6d71649c274..4d9e39d2aae 100644 --- a/mysql-test/suite/galera/galera_2nodes_as_slave.cnf +++ b/mysql-test/suite/galera/galera_2nodes_as_slave.cnf @@ -33,7 +33,7 @@ wsrep_sst_receive_address='127.0.0.1:@mysqld.2.#sst_port' # enforce read-committed characteristics across the cluster wsrep-causal-reads=ON -wsrep-sync-wait=7 +wsrep-sync-wait=15 server-id=2 [mysqld.3] @@ -57,7 +57,7 @@ wsrep_sst_receive_address='127.0.0.1:@mysqld.3.#sst_port' # enforce read-committed characteristics across the cluster wsrep-causal-reads=ON -wsrep-sync-wait=7 +wsrep-sync-wait=15 server-id=3 [ENV] diff --git a/mysql-test/suite/galera/galera_3nodes_as_slave.cnf b/mysql-test/suite/galera/galera_3nodes_as_slave.cnf index aed33ba365b..ac1ca34e242 100644 --- a/mysql-test/suite/galera/galera_3nodes_as_slave.cnf +++ b/mysql-test/suite/galera/galera_3nodes_as_slave.cnf @@ -30,7 +30,7 @@ wsrep_sst_receive_address='127.0.0.1:@mysqld.2.#sst_port' # enforce read-committed characteristics across the cluster wsrep-causal-reads=ON -wsrep-sync-wait=7 +wsrep-sync-wait=15 server-id=2 [mysqld.3] @@ -51,7 +51,7 @@ wsrep_sst_receive_address='127.0.0.1:@mysqld.3.#sst_port' # enforce read-committed characteristics across the cluster wsrep-causal-reads=ON -wsrep-sync-wait=7 +wsrep-sync-wait=15 server-id=3 [mysqld.4] @@ -72,7 +72,7 @@ wsrep_sst_receive_address='127.0.0.1:@mysqld.4.#sst_port' # enforce read-committed characteristics across the cluster wsrep-causal-reads=ON -wsrep-sync-wait=7 +wsrep-sync-wait=15 server-id=4 [ENV] diff --git a/mysql-test/suite/galera/galera_4nodes.cnf b/mysql-test/suite/galera/galera_4nodes.cnf index c93282e6c47..1c195afd54b 100644 --- a/mysql-test/suite/galera/galera_4nodes.cnf +++ b/mysql-test/suite/galera/galera_4nodes.cnf @@ -10,7 +10,7 @@ wsrep-provider=@ENV.WSREP_PROVIDER wsrep_node_address=127.0.0.1 # enforce read-committed characteristics across the cluster wsrep-causal-reads=ON -wsrep-sync-wait=7 +wsrep-sync-wait=15 [mysqld.1] #galera_port=@OPT.port diff --git a/mysql-test/suite/galera/r/GAL-401.result b/mysql-test/suite/galera/r/GAL-401.result index b2ecd1c2bfa..3b55b7589b7 100644 --- a/mysql-test/suite/galera/r/GAL-401.result +++ b/mysql-test/suite/galera/r/GAL-401.result @@ -2,15 +2,18 @@ SET GLOBAL wsrep_provider_options = 'pc.ignore_sb=true'; connection node_2; SET @@global.wsrep_desync = 1; SET SESSION wsrep_dirty_reads=1; +SET SESSION wsrep_sync_wait=0; SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; connection node_1; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)); connection node_2; SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0'; +SET wsrep_dirty_reads=0; SHOW STATUS LIKE 'wsrep_desync_count'; Variable_name Value wsrep_desync_count 0 SET @@global.wsrep_desync = 0; +SET SESSION wsrep_sync_wait=15; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( diff --git a/mysql-test/suite/galera/r/GAL-480.result b/mysql-test/suite/galera/r/GAL-480.result index b762e07423e..143f48a69e3 100644 --- a/mysql-test/suite/galera/r/GAL-480.result +++ b/mysql-test/suite/galera/r/GAL-480.result @@ -1,3 +1,4 @@ +connection node_1; CREATE TABLE t1 (f1 CHAR(10), f0 integer) ENGINE=InnoDB; FLUSH TABLE t1 FOR EXPORT; UNLOCK TABLES; diff --git a/mysql-test/suite/galera/r/MW-284.result b/mysql-test/suite/galera/r/MW-284.result index a4c08bc7a93..bfb1301f7bd 100644 --- a/mysql-test/suite/galera/r/MW-284.result +++ b/mysql-test/suite/galera/r/MW-284.result @@ -17,7 +17,7 @@ INSERT INTO t1 VALUES (1); connection node_3; connection node_1; DROP TABLE t1; -SET global wsrep_sync_wait=7; +SET global wsrep_sync_wait=15; connection node_3; STOP SLAVE; RESET SLAVE ALL; diff --git a/mysql-test/suite/galera/r/MW-309.result b/mysql-test/suite/galera/r/MW-309.result new file mode 100644 index 00000000000..3dd49a041ee --- /dev/null +++ b/mysql-test/suite/galera/r/MW-309.result @@ -0,0 +1,22 @@ +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +SET GLOBAL wsrep_max_ws_rows = 2; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +SELECT * FROM t1 GROUP BY f1; +f1 +1 +SELECT * FROM t1 GROUP BY f1; +f1 +1 +SELECT * FROM t1 GROUP BY f1; +f1 +1 +SHOW STATUS LIKE '%wsrep%'; +SET GLOBAL wsrep_max_ws_rows = 0; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/r/MW-329.result b/mysql-test/suite/galera/r/MW-329.result index 655d8e9e291..af57bc4b056 100644 --- a/mysql-test/suite/galera/r/MW-329.result +++ b/mysql-test/suite/galera/r/MW-329.result @@ -1,3 +1,4 @@ +CALL mtr.add_suppression("WSREP: .*conflict state . after post commit .*"); CREATE TABLE t1 (f1 INTEGER, f2 CHAR(20) DEFAULT 'abc') ENGINE=InnoDB; INSERT INTO t1 (f1) VALUES (1),(65535); FLUSH STATUS; @@ -12,9 +13,17 @@ WHILE 1 DO INSERT INTO t1 (f1) VALUES (FLOOR( 1 + RAND( ) * 65535 )); END WHILE; END| +connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1; +connection node_1b; CALL proc_insert();; +connection node_2; +CALL mtr.add_suppression("WSREP: Failed to report last committed .*"); SELECT VARIABLE_VALUE > 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'; VARIABLE_VALUE > 0 1 +connection node_1; +connection node_1b; +connection node_1; DROP PROCEDURE proc_insert; DROP TABLE t1; +CALL mtr.add_suppression("conflict state 3 after post commit"); diff --git a/mysql-test/suite/galera/r/MW-336.result b/mysql-test/suite/galera/r/MW-336.result new file mode 100644 index 00000000000..9bdb61c1a9c --- /dev/null +++ b/mysql-test/suite/galera/r/MW-336.result @@ -0,0 +1,42 @@ +CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB; +SET GLOBAL wsrep_slave_threads = 10; +SET GLOBAL wsrep_slave_threads = 1; +INSERT INTO t1 VALUES (1); +SET GLOBAL wsrep_slave_threads = 10; +SELECT COUNT(*) = 11 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; +COUNT(*) = 11 +1 +SET GLOBAL wsrep_slave_threads = 20; +SELECT COUNT(*) = 21 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; +COUNT(*) = 21 +1 +SET GLOBAL wsrep_slave_threads = 1; +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (3); +INSERT INTO t1 VALUES (4); +INSERT INTO t1 VALUES (5); +INSERT INTO t1 VALUES (6); +INSERT INTO t1 VALUES (7); +INSERT INTO t1 VALUES (8); +INSERT INTO t1 VALUES (9); +SET GLOBAL wsrep_slave_threads = 10; +SET GLOBAL wsrep_slave_threads = 0; +Warnings: +Warning 1292 Truncated incorrect wsrep_slave_threads value: '0' +INSERT INTO t1 VALUES (10); +INSERT INTO t1 VALUES (11); +INSERT INTO t1 VALUES (12); +INSERT INTO t1 VALUES (13); +INSERT INTO t1 VALUES (14); +INSERT INTO t1 VALUES (15); +INSERT INTO t1 VALUES (16); +INSERT INTO t1 VALUES (17); +INSERT INTO t1 VALUES (18); +INSERT INTO t1 VALUES (19); +INSERT INTO t1 VALUES (20); +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; +COUNT(*) = 2 +1 +SET GLOBAL wsrep_slave_threads = 1; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/r/MW-357.result b/mysql-test/suite/galera/r/MW-357.result new file mode 100644 index 00000000000..35855e21233 --- /dev/null +++ b/mysql-test/suite/galera/r/MW-357.result @@ -0,0 +1,9 @@ +connection node_2; +SET GLOBAL wsrep_slave_threads = 0; +Warnings: +Warning 1292 Truncated incorrect wsrep_slave_threads value: '0' +connection node_1; +CREATE TABLE t1 (f1 INT PRIMARY KEY) Engine=InnoDB; +connection node_1; +INSERT INTO t1 VALUES (1); +DROP TABLE t1; diff --git a/mysql-test/suite/galera/r/MW-369.result b/mysql-test/suite/galera/r/MW-369.result new file mode 100644 index 00000000000..516904d1b2a --- /dev/null +++ b/mysql-test/suite/galera/r/MW-369.result @@ -0,0 +1,155 @@ +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, +CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +SET AUTOCOMMIT=ON; +START TRANSACTION; +DELETE FROM p WHERE f1 = 1; +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +INSERT INTO c VALUES (1, 1); +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; +COMMIT; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; +SET GLOBAL wsrep_provider_options = 'dbug='; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT * FROM p; +f1 f2 +1 0 +2 0 +SELECT * FROM c; +f1 p_id +1 1 +DROP TABLE c; +DROP TABLE p; +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, +f2 INTEGER, +CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +INSERT INTO c VALUES (1, 1, 0); +SET AUTOCOMMIT=ON; +START TRANSACTION; +UPDATE p SET f2 = 1 WHERE f1 = 1; +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +UPDATE c SET f2 = 1 WHERE f1 = 1; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; +COMMIT; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; +SET GLOBAL wsrep_provider_options = 'dbug='; +SELECT * FROM p; +f1 f2 +1 1 +2 0 +SELECT * FROM c; +f1 p_id f2 +1 1 1 +DROP TABLE c; +DROP TABLE p; +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, +CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +INSERT INTO c VALUES (1, 1); +SET AUTOCOMMIT=ON; +START TRANSACTION; +UPDATE p SET f2 = 1 WHERE f1 = 1; +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +DELETE FROM c WHERE f1 = 1; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; +COMMIT; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; +SET GLOBAL wsrep_provider_options = 'dbug='; +SELECT * FROM p; +f1 f2 +1 1 +2 0 +SELECT * FROM c; +f1 p_id +DROP TABLE c; +DROP TABLE p; +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER UNIQUE KEY) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, +CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f2)) ; +INSERT INTO p VALUES (1, 0); +SET AUTOCOMMIT=ON; +START TRANSACTION; +UPDATE p SET f2 = 1 WHERE f1 = 1; +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +INSERT INTO c VALUES (1, 0);; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; +COMMIT; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; +SET GLOBAL wsrep_provider_options = 'dbug='; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT * FROM p; +f1 f2 +1 0 +SELECT * FROM c; +f1 p_id +1 0 +DROP TABLE c; +DROP TABLE p; +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, f2 INTEGER, +CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1) +ON DELETE CASCADE) ; +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +INSERT INTO c VALUES (1, 1, 0); +SET AUTOCOMMIT=ON; +START TRANSACTION; +DELETE FROM p WHERE f1 = 1; +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +UPDATE c SET f2 = 1 WHERE f1 = 1; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; +COMMIT; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; +SET GLOBAL wsrep_provider_options = 'dbug='; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT * FROM p; +f1 f2 +1 0 +2 0 +SELECT * FROM c; +f1 p_id f2 +1 1 1 +DROP TABLE c; +DROP TABLE p; diff --git a/mysql-test/suite/galera/r/MW-402.result b/mysql-test/suite/galera/r/MW-402.result new file mode 100644 index 00000000000..9be98d629fb --- /dev/null +++ b/mysql-test/suite/galera/r/MW-402.result @@ -0,0 +1,200 @@ +connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1; +connection node_1; +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, f2 INTEGER, +CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1) ON DELETE CASCADE); +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +INSERT INTO c VALUES (1, 1, 0); +connection node_1a; +connection node_1; +SET AUTOCOMMIT=ON; +START TRANSACTION; +UPDATE c SET f2=1 where f1=1; +connection node_1a; +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +connection node_2; +DELETE FROM p WHERE f1 = 1; +connection node_1a; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; +connection node_1; +COMMIT; +connection node_1a; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; +SET GLOBAL wsrep_provider_options = 'dbug='; +connection node_1; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_2; +SELECT * FROM p; +f1 f2 +2 0 +SELECT * FROM c; +f1 p_id f2 +DROP TABLE c; +DROP TABLE p; +connection node_1; +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, f2 INTEGER, +CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1) ON UPDATE CASCADE); +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +INSERT INTO c VALUES (1, 1, 0); +connection node_1a; +connection node_1; +SET AUTOCOMMIT=ON; +START TRANSACTION; +UPDATE c SET f2=2 where f1=1; +connection node_1a; +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +connection node_2; +UPDATE p set f1=11 WHERE f1 = 1; +connection node_1a; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; +connection node_1; +COMMIT; +connection node_1a; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; +SET GLOBAL wsrep_provider_options = 'dbug='; +connection node_1; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_2; +SELECT * FROM p; +f1 f2 +2 0 +11 0 +SELECT * FROM c; +f1 p_id f2 +1 11 0 +DROP TABLE c; +DROP TABLE p; +connection node_1; +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, f2 INTEGER, +CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1) ON UPDATE CASCADE); +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +INSERT INTO c VALUES (1, 1, 0); +connection node_1a; +connection node_1; +SET AUTOCOMMIT=ON; +START TRANSACTION; +UPDATE c SET p_id=2 where f1=1; +connection node_1a; +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +connection node_2; +UPDATE p set f1=11 WHERE f1 = 1; +connection node_1a; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; +connection node_1; +COMMIT; +connection node_1a; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; +SET GLOBAL wsrep_provider_options = 'dbug='; +connection node_1; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_2; +SELECT * FROM p; +f1 f2 +2 0 +11 0 +SELECT * FROM c; +f1 p_id f2 +1 11 0 +connection node_1a; +connection node_1; +SET AUTOCOMMIT=ON; +START TRANSACTION; +UPDATE p set f1=21 WHERE f1 = 11; +connection node_1a; +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +connection node_2; +UPDATE c SET p_id=2 where f1=1; +connection node_1a; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; +connection node_1; +COMMIT; +connection node_1a; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; +SET GLOBAL wsrep_provider_options = 'dbug='; +connection node_1; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_2; +SELECT * FROM p; +f1 f2 +2 0 +11 0 +SELECT * FROM c; +f1 p_id f2 +1 2 0 +DROP TABLE c; +DROP TABLE p; +connection node_1; +CREATE TABLE p1 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE p2 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p1_id INTEGER, p2_id INTEGER, f2 INTEGER, +CONSTRAINT fk_1 FOREIGN KEY (p1_id) REFERENCES p1 (f1) ON DELETE CASCADE, +CONSTRAINT fk_2 FOREIGN KEY (p2_id) REFERENCES p2 (f1)); +INSERT INTO p1 VALUES (1, 0); +INSERT INTO p2 VALUES (1, 0); +INSERT INTO c VALUES (1, 1, 1, 0); +connection node_1a; +connection node_1; +SET AUTOCOMMIT=ON; +START TRANSACTION; +UPDATE p2 SET f2=2 where f1=1; +connection node_1a; +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +connection node_2; +DELETE FROM p1 WHERE f1 = 1; +connection node_1a; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; +connection node_1; +COMMIT; +connection node_1a; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; +SET GLOBAL wsrep_provider_options = 'dbug='; +connection node_1; +connection node_2; +SELECT * FROM p1; +f1 f2 +SELECT * FROM p2; +f1 f2 +1 2 +SELECT * FROM c; +f1 p1_id p2_id f2 +DROP TABLE c,p1,p2; diff --git a/mysql-test/suite/galera/r/MW-86-wait1.result b/mysql-test/suite/galera/r/MW-86-wait1.result new file mode 100644 index 00000000000..00010eaedcb --- /dev/null +++ b/mysql-test/suite/galera/r/MW-86-wait1.result @@ -0,0 +1,51 @@ +connection node_2; +SELECT @@debug_sync; +@@debug_sync +ON - current signal: '' +SET SESSION wsrep_sync_wait = 1; +SET GLOBAL debug = "+d,sync.wsrep_apply_cb"; +Warnings: +Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead +connection node_1; +CREATE TABLE t_wait1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t_wait1 VALUES (1); +connection node_2; +SET SESSION debug_sync = "now WAIT_FOR sync.wsrep_apply_cb_reached"; +SHOW BINARY LOGS; +SHOW BINLOG EVENTS; +SHOW COLUMNS FROM t1; +SHOW CREATE EVENT e1; +SHOW CREATE FUNCTION f1; +SHOW CREATE PROCEDURE p1; +SHOW CREATE TABLE t1; +SHOW CREATE TRIGGER tr1; +SHOW CREATE VIEW v1; +SHOW DATABASES; +SHOW ENGINE InnoDB STATUS; +SHOW FUNCTION CODE f1; +SHOW FUNCTION STATUS; +SHOW GRANTS FOR 'root'@'localhost'; +SHOW INDEX FROM t1; +SHOW OPEN TABLES; +SHOW PROCEDURE CODE p1; +SHOW PROCEDURE STATUS; +SHOW PRIVILEGES; +SHOW STATUS LIKE 'wsrep_cluster_size'; +SHOW TABLE STATUS; +SHOW TABLES; +SHOW TRIGGERS; +SHOW GLOBAL VARIABLES LIKE 'foo_bar'; +SHOW WARNINGS; +SET GLOBAL debug = "-d,sync.wsrep_apply_cb"; +Warnings: +Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead +SET SESSION debug_sync = "now SIGNAL signal.wsrep_apply_cb"; +SET SESSION wsrep_sync_wait = default; +DROP TABLE t_wait1; +SET GLOBAL debug = NULL; +Warnings: +Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead +SET debug_sync='RESET'; +SELECT @@debug_sync; +@@debug_sync +ON - current signal: '' diff --git a/mysql-test/suite/galera/r/MW-86-wait8.result b/mysql-test/suite/galera/r/MW-86-wait8.result new file mode 100644 index 00000000000..47e0ebc1342 --- /dev/null +++ b/mysql-test/suite/galera/r/MW-86-wait8.result @@ -0,0 +1,53 @@ +connection node_2; +SELECT @@debug_sync; +@@debug_sync +ON - current signal: '' +SET SESSION wsrep_sync_wait = 8; +SET GLOBAL debug = "+d,sync.wsrep_apply_cb"; +Warnings: +Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead +connection node_1; +CREATE TABLE t_wait8 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t_wait8 VALUES (1); +connection node_2; +SET GLOBAL wsrep_provider_options = "repl.causal_read_timeout=PT0.1S"; +SET SESSION debug_sync = "now WAIT_FOR sync.wsrep_apply_cb_reached"; +SHOW BINARY LOGS; +SHOW BINLOG EVENTS; +SHOW COLUMNS FROM t1; +SHOW CREATE DATABASE db1; +SHOW CREATE EVENT e1; +SHOW CREATE FUNCTION f1; +SHOW CREATE PROCEDURE p1; +SHOW CREATE TABLE t1; +SHOW CREATE TRIGGER tr1; +SHOW CREATE VIEW v1; +SHOW DATABASES; +SHOW ENGINE InnoDB STATUS; +SHOW FUNCTION CODE f1; +SHOW FUNCTION STATUS; +SHOW GRANTS FOR 'root'@'localhost'; +SHOW INDEX FROM t1; +SHOW OPEN TABLES; +SHOW PROCEDURE CODE p1; +SHOW PROCEDURE STATUS; +SHOW PRIVILEGES; +SHOW STATUS LIKE 'wsrep_cluster_size'; +SHOW TABLE STATUS; +SHOW TABLES; +SHOW TRIGGERS; +SHOW GLOBAL VARIABLES LIKE 'foo_bar'; +SHOW WARNINGS; +SET GLOBAL debug = "-d,sync.wsrep_apply_cb"; +Warnings: +Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; +SET SESSION wsrep_sync_wait = default; +DROP TABLE t_wait8; +SET GLOBAL debug = NULL; +Warnings: +Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead +SET debug_sync='RESET'; +SELECT @@debug_sync; +@@debug_sync +ON - current signal: '' diff --git a/mysql-test/suite/galera/r/basic.result b/mysql-test/suite/galera/r/basic.result index d4efe348b61..e85c805253f 100644 --- a/mysql-test/suite/galera/r/basic.result +++ b/mysql-test/suite/galera/r/basic.result @@ -10,6 +10,7 @@ c1 5 # On node_1 +connection node_1; SELECT * FROM test.t1; c1 1 @@ -19,6 +20,7 @@ c1 5 # On node_2 +connection node_2; SELECT * FROM test.t1; c1 1 @@ -27,4 +29,6 @@ c1 4 5 DROP TABLE t1; +disconnect node_2; +disconnect node_1; # End of test diff --git a/mysql-test/suite/galera/r/galera#414.result b/mysql-test/suite/galera/r/galera#414.result index c9fc39ddc21..34dcb6242d3 100644 --- a/mysql-test/suite/galera/r/galera#414.result +++ b/mysql-test/suite/galera/r/galera#414.result @@ -1,3 +1,5 @@ +connection node_1; +connection node_2; connection node_2; connection node_1; SET SESSION wsrep_sync_wait = 0; diff --git a/mysql-test/suite/galera/r/galera_applier_ftwrl_table.result b/mysql-test/suite/galera/r/galera_applier_ftwrl_table.result index 18dcc55d5d4..a6607906661 100644 --- a/mysql-test/suite/galera/r/galera_applier_ftwrl_table.result +++ b/mysql-test/suite/galera/r/galera_applier_ftwrl_table.result @@ -13,7 +13,7 @@ COUNT(*) = 0 1 connection node_1; UNLOCK TABLES; -SET SESSION wsrep_sync_wait = 7; +SET SESSION wsrep_sync_wait = 15; SELECT COUNT(*) = 2 FROM t1; COUNT(*) = 2 1 diff --git a/mysql-test/suite/galera/r/galera_applier_ftwrl_table_alter.result b/mysql-test/suite/galera/r/galera_applier_ftwrl_table_alter.result index 1cf88dbf5d3..9711100d155 100644 --- a/mysql-test/suite/galera/r/galera_applier_ftwrl_table_alter.result +++ b/mysql-test/suite/galera/r/galera_applier_ftwrl_table_alter.result @@ -15,7 +15,7 @@ SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system use COUNT(*) = 1 1 UNLOCK TABLES; -SET SESSION wsrep_sync_wait = 7; +SET SESSION wsrep_sync_wait = 15; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( diff --git a/mysql-test/suite/galera/r/galera_as_slave_autoinc.result b/mysql-test/suite/galera/r/galera_as_slave_autoinc.result index ac01ea100a0..60f3216aa9c 100644 --- a/mysql-test/suite/galera/r/galera_as_slave_autoinc.result +++ b/mysql-test/suite/galera/r/galera_as_slave_autoinc.result @@ -38,11 +38,9 @@ i c show variables like 'binlog_format'; Variable_name Value binlog_format STATEMENT -show variables like '%auto_increment%'; +show variables like 'auto_increment_increment'; Variable_name Value auto_increment_increment 7 -auto_increment_offset 5 -wsrep_auto_increment_control ON connection node_2; select * from t1; i c diff --git a/mysql-test/suite/galera/r/galera_bf_abort.result b/mysql-test/suite/galera/r/galera_bf_abort.result index cc750f05050..2307c35361c 100644 --- a/mysql-test/suite/galera/r/galera_bf_abort.result +++ b/mysql-test/suite/galera/r/galera_bf_abort.result @@ -1,8 +1,13 @@ CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(6)) ENGINE=InnoDB; +connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2; +connection node_2; SET AUTOCOMMIT=OFF; START TRANSACTION; INSERT INTO t1 VALUES (1,'node_2'); +connection node_1; INSERT INTO t1 VALUES (1,'node_1'); +connection node_2a; +connection node_2; INSERT INTO t1 VALUES (2, 'node_2'); ERROR 40001: Deadlock found when trying to get lock; try restarting transaction wsrep_local_aborts_increment diff --git a/mysql-test/suite/galera/r/galera_bf_abort_flush_for_export.result b/mysql-test/suite/galera/r/galera_bf_abort_flush_for_export.result index 91b3c9ecaa8..7b98c807efb 100644 --- a/mysql-test/suite/galera/r/galera_bf_abort_flush_for_export.result +++ b/mysql-test/suite/galera/r/galera_bf_abort_flush_for_export.result @@ -9,7 +9,7 @@ SET SESSION wsrep_sync_wait = 0; UNLOCK TABLES; COMMIT; SET AUTOCOMMIT=ON; -SET SESSION wsrep_sync_wait = 7; +SET SESSION wsrep_sync_wait = 15; SELECT COUNT(*) = 1 FROM t1; COUNT(*) = 1 1 diff --git a/mysql-test/suite/galera/r/galera_ddl_multiline.result b/mysql-test/suite/galera/r/galera_ddl_multiline.result new file mode 100644 index 00000000000..339a91125eb --- /dev/null +++ b/mysql-test/suite/galera/r/galera_ddl_multiline.result @@ -0,0 +1,89 @@ +connection node_1; +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +connection node_2; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +connection node_1; +CREATE TABLE t3 (f1 INTEGER) ENGINE=InnoDB; CREATE TABLE t4 (f1 INTEGER) ENGINE=InnoDB;; +SHOW CREATE TABLE t3; +Table Create Table +t3 CREATE TABLE `t3` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SHOW CREATE TABLE t4; +Table Create Table +t4 CREATE TABLE `t4` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +connection node_2; +SHOW CREATE TABLE t3; +Table Create Table +t3 CREATE TABLE `t3` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SHOW CREATE TABLE t4; +Table Create Table +t4 CREATE TABLE `t4` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +connection node_1; +INSERT INTO t1 VALUES (1); +CREATE TABLE t5 (f1 INTEGER) ENGINE=InnoDB; +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +SHOW CREATE TABLE t5; +Table Create Table +t5 CREATE TABLE `t5` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +connection node_2; +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +SHOW CREATE TABLE t5; +Table Create Table +t5 CREATE TABLE `t5` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +connection node_1; +CREATE TABLE t6 (f1 INTEGER) ENGINE=InnoDB; INSERT INTO t2 VALUES (1);; +SELECT COUNT(*) = 1 FROM t2; +COUNT(*) = 1 +1 +SHOW CREATE TABLE t6; +Table Create Table +t6 CREATE TABLE `t6` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +connection node_2; +SELECT COUNT(*) = 1 FROM t2; +COUNT(*) = 1 +1 +SHOW CREATE TABLE t6; +Table Create Table +t6 CREATE TABLE `t6` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +include/diff_servers.inc [servers=1 2] +connection node_1; +DROP TABLE t1, t2, t3, t4, t5, t6; diff --git a/mysql-test/suite/galera/r/galera_defaults.result b/mysql-test/suite/galera/r/galera_defaults.result index cb306734002..28c3f4dd104 100644 --- a/mysql-test/suite/galera/r/galera_defaults.result +++ b/mysql-test/suite/galera/r/galera_defaults.result @@ -1,5 +1,5 @@ -SELECT COUNT(*) = 42 FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE 'wsrep_%'; -COUNT(*) = 42 +SELECT COUNT(*) = 43 FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE 'wsrep_%'; +COUNT(*) = 43 1 SELECT VARIABLE_NAME, VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES @@ -26,6 +26,7 @@ WSREP_CONVERT_LOCK_TO_TRX OFF WSREP_DBUG_OPTION WSREP_DEBUG OFF WSREP_DESYNC OFF +WSREP_DIRTY_READS OFF WSREP_DRUPAL_282555_WORKAROUND OFF WSREP_FORCED_BINLOG_FORMAT NONE WSREP_GTID_DOMAIN_ID 0 @@ -49,8 +50,8 @@ WSREP_SST_AUTH WSREP_SST_DONOR WSREP_SST_DONOR_REJECTS_QUERIES OFF WSREP_SST_METHOD rsync -WSREP_SYNC_WAIT 7 -; ; ; cert.log_conflicts = no; debug = no; evs.auto_evict = 0; evs.causal_keepalive_period = PT1S; evs.debug_log_mask = 0x1; evs.delay_margin = PT1S; evs.delayed_keep_period = PT30S; evs.inactive_check_period = PT0.5S; evs.inactive_timeout = PT30S; evs.info_log_mask = 0; evs.install_timeout = PT15S; evs.join_retrans_period = PT1S; evs.keepalive_period = PT1S; evs.max_install_timeouts = 3; evs.send_window = 4; evs.stats_report_period = PT1M; evs.suspect_timeout = PT10S; evs.use_aggregate = true; evs.user_send_window = 2; evs.version = 0; evs.view_forget_timeout = P1D; ; gcache.keep_pages_size = 0; gcache.mem_size = 0; ; gcache.page_size = 128M; gcache.recover = no; gcache.size = 128M; gcomm.thread_prio = ; gcs.fc_debug = 0; gcs.fc_factor = 1.0; gcs.fc_limit = 16; gcs.fc_master_slave = no; gcs.max_packet_size = 64500; gcs.max_throttle = 0.25; ;gcs.recv_q_soft_limit = 0.25; gcs.sync_donor = no; ; gmcast.mcast_addr = ; gmcast.mcast_ttl = 1; gmcast.peer_timeout = PT3S; gmcast.segment = 0; gmcast.time_wait = PT5S; gmcast.version = 0; ; pc.announce_timeout = PT3S; pc.checksum = false; pc.ignore_quorum = false; pc.ignore_sb = false; pc.linger = PT20S; pc.npvo = false; pc.recovery = true; pc.version = 0; pc.wait_prim = true; pc.wait_prim_timeout = PT30S; pc.weight = 1; protonet.backend = asio; protonet.version = 0; repl.causal_read_timeout = PT90S; repl.commit_order = 3; repl.key_format = FLAT8; repl.max_ws_size = 2147483647; repl.proto_max = 7; socket.checksum = 2; socket.recv_buf_size = 212992; +WSREP_SYNC_WAIT 15 +; ; ; cert.log_conflicts = no; debug = no; evs.auto_evict = 0; evs.causal_keepalive_period = PT1S; evs.debug_log_mask = 0x1; evs.delay_margin = PT1S; evs.delayed_keep_period = PT30S; evs.inactive_check_period = PT0.5S; evs.inactive_timeout = PT30S; evs.info_log_mask = 0; evs.install_timeout = PT15S; evs.join_retrans_period = PT1S; evs.keepalive_period = PT1S; evs.max_install_timeouts = 3; evs.send_window = 4; evs.stats_report_period = PT1M; evs.suspect_timeout = PT10S; evs.use_aggregate = true; evs.user_send_window = 2; evs.version = 0; evs.view_forget_timeout = P1D; ; gcache.keep_pages_size = 0; gcache.mem_size = 0; ; gcache.page_size = 128M; gcache.recover = no; gcache.size = 10M; gcomm.thread_prio = ; gcs.fc_debug = 0; gcs.fc_factor = 1.0; gcs.fc_limit = 16; gcs.fc_master_slave = no; gcs.max_packet_size = 64500; gcs.max_throttle = 0.25; ; gcs.recv_q_soft_limit = 0.25; gcs.sync_donor = no; ; gmcast.mcast_addr = ; gmcast.mcast_ttl = 1; gmcast.peer_timeout = PT3S; gmcast.segment = 0; gmcast.time_wait = PT5S; gmcast.version = 0; ; pc.announce_timeout = PT3S; pc.checksum = false; pc.ignore_quorum = false; pc.ignore_sb = false; pc.linger = PT20S; pc.npvo = false; pc.recovery = true; pc.version = 0; pc.wait_prim = true; pc.wait_prim_timeout = PT30S; pc.weight = 1; protonet.backend = asio; protonet.version = 0; repl.causal_read_timeout = PT90S; repl.commit_order = 3; repl.key_format = FLAT8; repl.max_ws_size = 2147483647; repl.proto_max = 7; socket.checksum = 2; socket.recv_buf_size = 212992; SELECT COUNT(*) FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE 'wsrep_%' AND VARIABLE_NAME != 'wsrep_debug_sync_waiters'; diff --git a/mysql-test/suite/galera/r/galera_insert_ignore.result b/mysql-test/suite/galera/r/galera_insert_ignore.result index d21fb2b02d0..7057affaa0e 100644 --- a/mysql-test/suite/galera/r/galera_insert_ignore.result +++ b/mysql-test/suite/galera/r/galera_insert_ignore.result @@ -1,6 +1,6 @@ -SET GLOBAL wsrep_sync_wait = 7; +SET GLOBAL wsrep_sync_wait = 15; connection node_2; -SET GLOBAL wsrep_sync_wait = 7; +SET GLOBAL wsrep_sync_wait = 15; connection node_1; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; INSERT INTO t1 VALUES (1); diff --git a/mysql-test/suite/galera/r/galera_ist_progress.result b/mysql-test/suite/galera/r/galera_ist_progress.result new file mode 100644 index 00000000000..9fc7febbea5 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_ist_progress.result @@ -0,0 +1,19 @@ +SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1'; +SET SESSION wsrep_on = OFF; +SET SESSION wsrep_on = ON; +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (3); +INSERT INTO t1 VALUES (4); +INSERT INTO t1 VALUES (5); +INSERT INTO t1 VALUES (6); +INSERT INTO t1 VALUES (7); +INSERT INTO t1 VALUES (8); +INSERT INTO t1 VALUES (9); +INSERT INTO t1 VALUES (10); +SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 0'; +include/assert_grep.inc [Receiving IST: 11 writesets, seqnos] +include/assert_grep.inc [Receiving IST\.\.\. 0\.0% \( 0/11 events\) complete] +include/assert_grep.inc [Receiving IST\.\.\.100\.0% \(11/11 events\) complete] +DROP TABLE t1; diff --git a/mysql-test/suite/galera/r/galera_ist_restart_joiner.result b/mysql-test/suite/galera/r/galera_ist_restart_joiner.result index 78fc5b2baf3..c81cecfae1c 100644 --- a/mysql-test/suite/galera/r/galera_ist_restart_joiner.result +++ b/mysql-test/suite/galera/r/galera_ist_restart_joiner.result @@ -9,20 +9,15 @@ connection node_1; UPDATE t1 SET f2 = 'b' WHERE f1 > 1; UPDATE t1 SET f2 = 'c' WHERE f1 > 2; connection node_2; -SET GLOBAL wsrep_provider_options = 'dbug=d,recv_IST_after_apply_trx'; -SET SESSION wsrep_sync_wait = 0; Loading wsrep_provider ... -SHOW STATUS LIKE 'wsrep_debug_sync_waiters'; -Variable_name Value -wsrep_debug_sync_waiters recv_IST_after_apply_trx +SET SESSION wsrep_on=OFF; +SET SESSION wsrep_on=ON; connection node_1; connection node_1; UPDATE t1 SET f2 = 'd' WHERE f1 > 3; -CREATE TABLE t2 (f1 INTEGER); connection node_2; connection node_1; UPDATE t1 SET f2 = 'e' WHERE f1 > 4; -CREATE TABLE t3 (f1 INTEGER); connection node_2; Performing --wsrep-recover ... Starting server ... @@ -46,13 +41,7 @@ f1 f2 4 d 5 e 6 f -SELECT COUNT(*) = 0 FROM t2; -COUNT(*) = 0 -1 -SELECT COUNT(*) = 0 FROM t3; -COUNT(*) = 0 -1 connection node_1; -DROP TABLE t1, t2, t3; +DROP TABLE t1; disconnect node_2; disconnect node_1; diff --git a/mysql-test/suite/galera/r/galera_kill_nochanges.result b/mysql-test/suite/galera/r/galera_kill_nochanges.result index db3c75e2886..a307dde0527 100644 --- a/mysql-test/suite/galera/r/galera_kill_nochanges.result +++ b/mysql-test/suite/galera/r/galera_kill_nochanges.result @@ -1,6 +1,9 @@ +connection node_1; CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; INSERT INTO t1 VALUES (1); +connection node_2; Killing server ... +connection node_2a; SELECT COUNT(*) = 1 FROM t1; COUNT(*) = 1 1 diff --git a/mysql-test/suite/galera/r/galera_log_output_csv.result b/mysql-test/suite/galera/r/galera_log_output_csv.result index cdb5ee49f3e..5cb61b36332 100644 --- a/mysql-test/suite/galera/r/galera_log_output_csv.result +++ b/mysql-test/suite/galera/r/galera_log_output_csv.result @@ -9,10 +9,12 @@ SELECT 1 = 1 FROM t1; SELECT COUNT(*) = 1 FROM mysql.slow_log WHERE sql_text = 'SELECT 1 = 1 FROM t1'; COUNT(*) = 1 1 +connection node_2; SELECT 2 = 2 FROM t1; 2 = 2 1 SELECT COUNT(*) = 1 FROM mysql.slow_log WHERE sql_text = 'SELECT 2 = 2 FROM t1'; COUNT(*) = 1 1 +connection node_1; DROP TABLE t1; diff --git a/mysql-test/suite/galera/r/galera_many_rows.result b/mysql-test/suite/galera/r/galera_many_rows.result index ab43b961458..6f9e76f010e 100644 --- a/mysql-test/suite/galera/r/galera_many_rows.result +++ b/mysql-test/suite/galera/r/galera_many_rows.result @@ -7,7 +7,7 @@ CREATE TABLE t1 (f1 INTEGER AUTO_INCREMENT PRIMARY KEY, f2 INTEGER) Engine=InnoD INSERT INTO t1 (f2) SELECT a1.f1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5; connection node_2; SET SESSION wsrep_sync_wait = 0; -SET SESSION wsrep_sync_wait = 7; +SET SESSION wsrep_sync_wait = 15; SET GLOBAL wsrep_provider_options = 'repl.causal_read_timeout=PT1H'; SELECT COUNT(*) = 100000 FROM t1; COUNT(*) = 100000 diff --git a/mysql-test/suite/galera/r/galera_parallel_apply_lock_table.result b/mysql-test/suite/galera/r/galera_parallel_apply_lock_table.result index 90349f493bd..ab56a8a2aa6 100644 --- a/mysql-test/suite/galera/r/galera_parallel_apply_lock_table.result +++ b/mysql-test/suite/galera/r/galera_parallel_apply_lock_table.result @@ -23,7 +23,7 @@ COUNT(*) = 0 connection node_2; UNLOCK TABLES; connection node_2a; -SET SESSION wsrep_sync_wait = 7;; +SET SESSION wsrep_sync_wait = 15;; SELECT COUNT(*) = 1 FROM t1; COUNT(*) = 1 1 diff --git a/mysql-test/suite/galera/r/galera_parallel_simple.result b/mysql-test/suite/galera/r/galera_parallel_simple.result index 6d023c38a57..3b10815c63d 100644 --- a/mysql-test/suite/galera/r/galera_parallel_simple.result +++ b/mysql-test/suite/galera/r/galera_parallel_simple.result @@ -16,7 +16,7 @@ INSERT INTO t1 VALUES (1); INSERT INTO t2 VALUES (1); SET SESSION wsrep_sync_wait = 0; UNLOCK TABLES; -SET SESSION wsrep_sync_wait = 7; +SET SESSION wsrep_sync_wait = 15; SELECT COUNT(*) = 10 FROM t1; COUNT(*) = 10 0 diff --git a/mysql-test/suite/galera/r/galera_query_cache_sync_wait.result b/mysql-test/suite/galera/r/galera_query_cache_sync_wait.result index 2a37d62698a..8c9cece9097 100644 --- a/mysql-test/suite/galera/r/galera_query_cache_sync_wait.result +++ b/mysql-test/suite/galera/r/galera_query_cache_sync_wait.result @@ -5,7 +5,6 @@ SET GLOBAL wsrep_provider_options = "repl.causal_read_timeout=PT1S"; SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb"; Warnings: Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead -SET SESSION wsrep_sync_wait = 7; SELECT MAX(id) FROM t1; MAX(id) 1 @@ -19,7 +18,6 @@ Warnings: Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; FLUSH QUERY CACHE; -SET SESSION wsrep_sync_wait = 7; SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb"; Warnings: Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead @@ -36,11 +34,9 @@ SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; connection node_1; INSERT INTO t1 VALUES (4); connection node_2; -SET SESSION wsrep_sync_wait = 7; SELECT MAX(id) FROM t1; MAX(id) 4 -SET SESSION wsrep_sync_wait = 7; FLUSH STATUS; SELECT MAX(id) FROM t1; MAX(id) @@ -54,7 +50,6 @@ Warning 1287 '@@debug' is deprecated and will be removed in a future release. Pl connection node_1; INSERT INTO t1 VALUES (5); connection node_2; -SET SESSION wsrep_sync_wait = 7; SELECT MAX(id) FROM t1 ; connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2; connection node_2a; diff --git a/mysql-test/suite/galera/r/galera_restart_on_unknown_option.result b/mysql-test/suite/galera/r/galera_restart_on_unknown_option.result index a21b1edf3e7..ba6f30fcf30 100644 --- a/mysql-test/suite/galera/r/galera_restart_on_unknown_option.result +++ b/mysql-test/suite/galera/r/galera_restart_on_unknown_option.result @@ -1,5 +1,8 @@ CALL mtr.add_suppression("Aborting"); CALL mtr.add_suppression("unknown option '--galera-unknown-option'"); +connection node_1; +connection node_2; +connection node_2; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)); INSERT INTO t1 VALUES (1, 'a'), (2, 'a'), (3, 'a'); SELECT * FROM t1; @@ -8,6 +11,7 @@ f1 f2 2 a 3 a Shutting down server ... +connection node_1; UPDATE t1 SET f2 = 'b' WHERE f1 > 1; UPDATE t1 SET f2 = 'c' WHERE f1 > 2; SELECT * FROM t1; @@ -15,6 +19,7 @@ f1 f2 1 a 2 b 3 c +connection node_2; Starting server ... Starting server ... SELECT * FROM t1; @@ -23,6 +28,7 @@ f1 f2 2 b 3 c Shutting down server ... +connection node_1; UPDATE t1 SET f2 = 'd' WHERE f1 > 1; UPDATE t1 SET f2 = 'd' WHERE f1 > 2; SELECT * FROM t1; @@ -30,6 +36,7 @@ f1 f2 1 a 2 d 3 d +connection node_2; Starting server ... Starting server ... SELECT * FROM t1; @@ -37,4 +44,5 @@ f1 f2 1 a 2 d 3 d +connection node_1; DROP TABLE t1; diff --git a/mysql-test/suite/galera/r/galera_suspend_slave.result b/mysql-test/suite/galera/r/galera_suspend_slave.result index 380ecb395c3..384d91f1d49 100644 --- a/mysql-test/suite/galera/r/galera_suspend_slave.result +++ b/mysql-test/suite/galera/r/galera_suspend_slave.result @@ -9,9 +9,12 @@ Suspending node_2 ... INSERT INTO t1 VALUES (1); Got one of the listed errors Resuming node_2 ... +SET SESSION wsrep_sync_wait = 1; INSERT INTO t1 VALUES (1); connection node_2a; +SET SESSION wsrep_sync_wait = 1; SELECT COUNT(*) = 1 FROM t1; COUNT(*) = 1 1 +SET SESSION wsrep_sync_wait = 15; DROP TABLE t1; diff --git a/mysql-test/suite/galera/r/galera_sync_wait_show.result b/mysql-test/suite/galera/r/galera_sync_wait_show.result index e0783e42174..e1d6dd9d61d 100644 --- a/mysql-test/suite/galera/r/galera_sync_wait_show.result +++ b/mysql-test/suite/galera/r/galera_sync_wait_show.result @@ -1,5 +1,5 @@ connection node_2; -SET SESSION wsrep_sync_wait = 1; +SET SESSION wsrep_sync_wait = 8; connection node_1; CREATE DATABASE db1; connection node_2; diff --git a/mysql-test/suite/galera/r/galera_toi_ddl_fk_update.result b/mysql-test/suite/galera/r/galera_toi_ddl_fk_update.result index 8366cfd27c8..a5db90aa965 100644 --- a/mysql-test/suite/galera/r/galera_toi_ddl_fk_update.result +++ b/mysql-test/suite/galera/r/galera_toi_ddl_fk_update.result @@ -10,11 +10,17 @@ parent_id INT ) ENGINE=InnoDB; INSERT INTO parent VALUES (1); INSERT INTO child (parent_id) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; +connection node_1; ALTER TABLE child ADD FOREIGN KEY (parent_id) REFERENCES parent(id) ON UPDATE CASCADE;; +connection node_2; UPDATE parent SET id = 2 WHERE id = 1;; +connection node_1; +connection node_2; +connection node_2; SELECT COUNT(*) = 10000 FROM child WHERE parent_id = 2; COUNT(*) = 10000 1 +connection node_1; SELECT COUNT(*) = 10000 FROM child WHERE parent_id = 2; COUNT(*) = 10000 1 diff --git a/mysql-test/suite/galera/r/galera_transaction_read_only.result b/mysql-test/suite/galera/r/galera_transaction_read_only.result index 3cd1076a285..b388f195fb1 100644 --- a/mysql-test/suite/galera/r/galera_transaction_read_only.result +++ b/mysql-test/suite/galera/r/galera_transaction_read_only.result @@ -1,21 +1,30 @@ +connection node_1; CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; +connection node_2; +connection node_1; SET AUTOCOMMIT=OFF; START TRANSACTION; COMMIT; +connection node_2; wsrep_last_committed_diff 1 +connection node_2; +connection node_1; START TRANSACTION READ ONLY; SELECT COUNT(*) = 0 FROM t1; COUNT(*) = 0 1 COMMIT; +connection node_2; wsrep_last_committed_diff 1 +connection node_1; START TRANSACTION; SELECT COUNT(*) = 0 FROM t1; COUNT(*) = 0 1 COMMIT; +connection node_2; wsrep_last_committed_diff 1 DROP TABLE t1; diff --git a/mysql-test/suite/galera/r/galera_unicode_identifiers.result b/mysql-test/suite/galera/r/galera_unicode_identifiers.result index 146cc052152..5eb13a83df9 100644 --- a/mysql-test/suite/galera/r/galera_unicode_identifiers.result +++ b/mysql-test/suite/galera/r/galera_unicode_identifiers.result @@ -1,6 +1,6 @@ -SET GLOBAL wsrep_sync_wait = 7; +SET GLOBAL wsrep_sync_wait = 15; connection node_2; -SET GLOBAL wsrep_sync_wait = 7; +SET GLOBAL wsrep_sync_wait = 15; connection node_1; CREATE DATABASE `database with space`; USE `database with space`; diff --git a/mysql-test/suite/galera/r/galera_var_dirty_reads.result b/mysql-test/suite/galera/r/galera_var_dirty_reads.result index 0bc30f4092c..beb47be1747 100644 --- a/mysql-test/suite/galera/r/galera_var_dirty_reads.result +++ b/mysql-test/suite/galera/r/galera_var_dirty_reads.result @@ -6,10 +6,6 @@ INSERT INTO t1 VALUES(1); SELECT * FROM t1; i 1 -create user user1; -grant all privileges on *.* to user1; -create user user2; -grant all privileges on *.* to user2; SET @@global.wsrep_cluster_address = ''; SET @@session.wsrep_dirty_reads=OFF; SET SESSION wsrep_sync_wait=0; @@ -21,87 +17,36 @@ Variable_name Value wsrep_cluster_status non-Primary SELECT * FROM t1; ERROR 08S01: WSREP has not yet prepared node for application use -SELECT @@wsrep_dirty_reads; -@@wsrep_dirty_reads -0 -SELECT 2; -2 -2 -SELECT 2+2 FROM DUAL; -2+2 -4 +SELECT 1 FROM t1; +ERROR 08S01: WSREP has not yet prepared node for application use SET @@session.wsrep_dirty_reads=ON; SELECT * FROM t1; i 1 -connect con1, localhost, user1,,test,$NODE_MYPORT_2,$NODE_MYSOCK_2; -SET SESSION wsrep_sync_wait=0; -set session wsrep_dirty_reads=1; -prepare stmt_show from 'select 1'; -prepare stmt_select from 'select * from t1'; -prepare stmt_insert from 'insert into t1 values(1)'; -set session wsrep_dirty_reads=0; -execute stmt_show; +SELECT 1 FROM t1; +1 +1 +SELECT i, variable_name, variable_value FROM t1, information_schema.session_variables WHERE variable_name LIKE "wsrep_dirty_reads" AND i = 1; +i variable_name variable_value +1 WSREP_DIRTY_READS ON +SET @@session.wsrep_dirty_reads=OFF; +SELECT i, variable_name, variable_value FROM t1, information_schema.session_variables WHERE variable_name LIKE "wsrep_dirty_reads" AND i = 1; ERROR 08S01: WSREP has not yet prepared node for application use -execute stmt_select; +SELECT 1; +1 +1 +USE information_schema; ERROR 08S01: WSREP has not yet prepared node for application use -execute stmt_insert; +SELECT * FROM information_schema.session_variables WHERE variable_name LIKE "wsrep_dirty_reads"; ERROR 08S01: WSREP has not yet prepared node for application use -SET wsrep_dirty_reads=ON; -select @@session.wsrep_dirty_reads; -@@session.wsrep_dirty_reads -1 -execute stmt_show; -1 -1 -execute stmt_select; -i -1 -execute stmt_insert; +SELECT COUNT(*) >= 10 FROM performance_schema.events_statements_history; ERROR 08S01: WSREP has not yet prepared node for application use -SET @@global.wsrep_dirty_reads=ON; -connect con2, localhost, user2,,test,$NODE_MYPORT_2,$NODE_MYSOCK_2; -select @@session.wsrep_dirty_reads; -@@session.wsrep_dirty_reads -1 -prepare stmt_show from 'select 1'; -prepare stmt_select from 'select * from t1'; -prepare stmt_insert from 'insert into t1 values(1)'; -execute stmt_show; -1 -1 -execute stmt_select; -i -1 -execute stmt_insert; -ERROR 08S01: WSREP has not yet prepared node for application use -SET SESSION wsrep_sync_wait=1; -execute stmt_show; -1 -1 -execute stmt_select; -i -1 -execute stmt_insert; -ERROR 08S01: WSREP has not yet prepared node for application use -SET SESSION wsrep_sync_wait=7; -execute stmt_show; -1 -1 -execute stmt_select; -i -1 -execute stmt_insert; -ERROR 08S01: WSREP has not yet prepared node for application use -connection node_2; -SET @@global.wsrep_dirty_reads=OFF; connection node_1; +USE test; SELECT * FROM t1; i 1 DROP TABLE t1; -drop user user1; -drop user user2; disconnect node_2; disconnect node_1; # End of test diff --git a/mysql-test/suite/galera/r/galera_var_node_address.result b/mysql-test/suite/galera/r/galera_var_node_address.result index fe3b5613903..8ce6a5e01a1 100644 --- a/mysql-test/suite/galera/r/galera_var_node_address.result +++ b/mysql-test/suite/galera/r/galera_var_node_address.result @@ -1,3 +1,5 @@ +call mtr.add_suppression("WSREP: Stray state UUID msg: .* current group state WAIT_STATE_UUID .*"); +call mtr.add_suppression("WSREP: Protocol violation. JOIN message sender .* is not in state transfer (.*). Message ignored."); SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; VARIABLE_VALUE = 4 1 diff --git a/mysql-test/suite/galera/r/galera_var_retry_autocommit.result b/mysql-test/suite/galera/r/galera_var_retry_autocommit.result index f4d17ad9a41..392728baf7d 100644 --- a/mysql-test/suite/galera/r/galera_var_retry_autocommit.result +++ b/mysql-test/suite/galera/r/galera_var_retry_autocommit.result @@ -1,16 +1,24 @@ +connection node_1; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=InnoDB; CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW SET NEW.f2 = SLEEP(5); +connection node_1; SET SESSION wsrep_retry_autocommit = 0; INSERT INTO t1 (f1) VALUES (1),(2);; +connection node_2; TRUNCATE TABLE t1; +connection node_1; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_1; SET SESSION wsrep_retry_autocommit = 1; INSERT INTO t1 (f1) VALUES (3),(4);; +connection node_2; TRUNCATE TABLE t1; +connection node_1; SELECT * FROM test.t1; f1 f2 3 0 4 0 +connection node_2; CREATE PROCEDURE repeated_truncate () BEGIN DECLARE i INT; @@ -22,11 +30,15 @@ SET i = i + 1; END WHILE; END| CALL repeated_truncate(); +connection node_1; SET SESSION wsrep_retry_autocommit = 1; INSERT INTO t1 (f1) VALUES (5),(6); ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_1; SET SESSION wsrep_retry_autocommit = 1024; INSERT INTO t1 (f1) VALUES (7),(8);; +connection node_2; +connection node_1; include/diff_servers.inc [servers=1 2] DROP TABLE t1; DROP PROCEDURE repeated_truncate; diff --git a/mysql-test/suite/galera/r/galera_var_sync_wait.result b/mysql-test/suite/galera/r/galera_var_sync_wait.result index 7f3afa77ecd..3dfe902767c 100644 --- a/mysql-test/suite/galera/r/galera_var_sync_wait.result +++ b/mysql-test/suite/galera/r/galera_var_sync_wait.result @@ -3,7 +3,7 @@ # SELECT @@global.wsrep_sync_wait; @@global.wsrep_sync_wait -7 +15 SELECT @@global.wsrep_causal_reads; @@global.wsrep_causal_reads 1 @@ -11,9 +11,6 @@ connection node_1; CREATE TABLE t1 (f1 INT PRIMARY KEY) Engine=InnoDB; connection node_2; SET GLOBAL wsrep_sync_wait = 1; -SHOW TABLES LIKE '%t1'; -Tables_in_test (%t1) -t1 SELECT COUNT(*) = 0 FROM t1; COUNT(*) = 0 1 @@ -31,7 +28,7 @@ UPDATE t3 SET f1 = 2; affected rows: 1 info: Rows matched: 1 Changed: 1 Warnings: 0 connection node_2; -SET GLOBAL wsrep_sync_wait = 7; +SET GLOBAL wsrep_sync_wait = 15; DROP TABLE t1; DROP TABLE t2; DROP TABLE t3; diff --git a/mysql-test/suite/galera/r/galera_wsrep_provider_unset_set.result b/mysql-test/suite/galera/r/galera_wsrep_provider_unset_set.result index 681e4606b38..d56d9340474 100644 --- a/mysql-test/suite/galera/r/galera_wsrep_provider_unset_set.result +++ b/mysql-test/suite/galera/r/galera_wsrep_provider_unset_set.result @@ -1,12 +1,20 @@ +connection node_1; +connection node_2; +connection node_1; CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; INSERT INTO t1 VALUES (1); +connection node_2; SET GLOBAL wsrep_provider='none'; INSERT INTO t1 VALUES (2); +connection node_1; INSERT INTO t1 VALUES (3); +connection node_2; +SET SESSION wsrep_sync_wait = 0; INSERT INTO t1 VALUES (4); SELECT COUNT(*) = 4 FROM t1; COUNT(*) = 4 1 +connection node_1; SELECT COUNT(*) = 3 FROM t1; COUNT(*) = 3 1 diff --git a/mysql-test/suite/galera/r/mysql-wsrep#198.result b/mysql-test/suite/galera/r/mysql-wsrep#198.result index afc2a07fb30..33f36d407db 100644 --- a/mysql-test/suite/galera/r/mysql-wsrep#198.result +++ b/mysql-test/suite/galera/r/mysql-wsrep#198.result @@ -1,6 +1,9 @@ CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; CREATE TABLE t2 (id INT PRIMARY KEY) ENGINE=InnoDB; connection node_2; +SELECT 1 FROM DUAL; +1 +1 LOCK TABLE t2 WRITE; connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2; connection node_2a; diff --git a/mysql-test/suite/galera/r/mysql-wsrep#201.result b/mysql-test/suite/galera/r/mysql-wsrep#201.result index 0f2980eddd2..fe5725cab27 100644 --- a/mysql-test/suite/galera/r/mysql-wsrep#201.result +++ b/mysql-test/suite/galera/r/mysql-wsrep#201.result @@ -2,4 +2,3 @@ CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; INSERT INTO t1 VALUES (DEFAULT); connection node_2; SET GLOBAL query_cache_size=1355776; -SET SESSION wsrep_sync_wait = 7; diff --git a/mysql-test/suite/galera/r/partition.result b/mysql-test/suite/galera/r/partition.result index 824572065c1..3835de514aa 100644 --- a/mysql-test/suite/galera/r/partition.result +++ b/mysql-test/suite/galera/r/partition.result @@ -56,10 +56,10 @@ t1 CREATE TABLE `t1` ( `i` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`i`) ) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (i) -(PARTITION p1 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p2 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION pMax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`i`) +(PARTITION `p1` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p2` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `pMax` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SHOW CREATE TABLE p1; Table Create Table p1 CREATE TABLE `p1` ( @@ -93,9 +93,9 @@ t1 CREATE TABLE `t1` ( `i` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`i`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (i) -(PARTITION p1 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION pMax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`i`) +(PARTITION `p1` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `pMax` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) # On node_2 connection node_2; @@ -105,9 +105,9 @@ t1 CREATE TABLE `t1` ( `i` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`i`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (i) -(PARTITION p1 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION pMax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`i`) +(PARTITION `p1` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `pMax` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) DROP TABLE t1, p1; # # MDEV-5146: Bulk loads into partitioned table not working diff --git a/mysql-test/suite/galera/r/pxc-421.result b/mysql-test/suite/galera/r/pxc-421.result index 4fde5a26819..38bf64f20c5 100644 --- a/mysql-test/suite/galera/r/pxc-421.result +++ b/mysql-test/suite/galera/r/pxc-421.result @@ -10,6 +10,7 @@ INSERT INTO t1 VALUES (2); connection node_1; INSERT INTO t1 VALUES (3); connection node_2; +set SESSION wsrep_sync_wait=0; INSERT INTO t1 VALUES (4); set GLOBAL wsrep_slave_threads=5; SELECT COUNT(*) = 5 FROM t1; @@ -31,6 +32,7 @@ SET GLOBAL wsrep_slave_threads = 1; SELECT COUNT(*) FROM t1; COUNT(*) 16 +SET GLOBAL auto_increment_offset = 2; connection node_1; SELECT COUNT(*) FROM t1; COUNT(*) @@ -40,3 +42,4 @@ Variable_name Value wsrep_slave_threads 12 SET GLOBAL wsrep_slave_threads = 1; DROP TABLE t1; +SET GLOBAL auto_increment_offset = 1; diff --git a/mysql-test/suite/galera/r/query_cache.result b/mysql-test/suite/galera/r/query_cache.result index 4b1b950e5c3..4aaae2997f3 100644 --- a/mysql-test/suite/galera/r/query_cache.result +++ b/mysql-test/suite/galera/r/query_cache.result @@ -1,6 +1,7 @@ # Execute FLUSH/RESET commands. # On node-1 +connection node_1; SET @query_cache_size_saved=@@GLOBAL.query_cache_size; SET @query_cache_type_saved=@@GLOBAL.query_cache_type; set GLOBAL query_cache_size=1355776; @@ -8,6 +9,7 @@ flush query cache; reset query cache; flush status; # On node-2 +connection node_2; SET @query_cache_size_saved=@@GLOBAL.query_cache_size; SET @query_cache_type_saved=@@GLOBAL.query_cache_type; set GLOBAL query_cache_size=1355776; @@ -15,6 +17,7 @@ flush query cache; reset query cache; flush status; # On node-1 +connection node_1; create table t1 (a int not null) engine=innodb; insert into t1 values (1),(2),(3); select * from t1; @@ -47,6 +50,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 1 # On node-2 +connection node_2; select * from t1; a 1 @@ -77,6 +81,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 1 # On node-1 +connection node_1; delete from t1 where a=1; show status like "Qcache_queries_in_cache"; Variable_name Value @@ -85,6 +90,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 1 # On node-2 +connection node_2; show status like "Qcache_queries_in_cache"; Variable_name Value Qcache_queries_in_cache 0 @@ -92,6 +98,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 1 # On node-1 +connection node_1; select * from t1; a 2 @@ -103,6 +110,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 1 # On node-2 +connection node_2; select * from t1; a 2 @@ -114,6 +122,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 1 # On node-1 +connection node_1; update t1 set a=1 where a=3; show status like "Qcache_queries_in_cache"; Variable_name Value @@ -122,6 +131,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 1 # On node-2 +connection node_2; show status like "Qcache_queries_in_cache"; Variable_name Value Qcache_queries_in_cache 0 @@ -129,6 +139,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 1 # On node-1 +connection node_1; select * from t1; a 2 @@ -140,6 +151,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 1 # On node-2 +connection node_2; select * from t1; a 2 @@ -151,6 +163,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 1 # On node-1 +connection node_1; drop table t1; show status like "Qcache_queries_in_cache"; Variable_name Value @@ -159,6 +172,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 1 # On node-2 +connection node_2; show status like "Qcache_queries_in_cache"; Variable_name Value Qcache_queries_in_cache 0 @@ -167,6 +181,7 @@ Variable_name Value Qcache_hits 1 # On node-1 +connection node_1; create table t1 (a int not null) ENGINE=MyISAM; insert into t1 values (1),(2),(3); create table t2 (a int not null) ENGINE=MyISAM; @@ -323,6 +338,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 3 # On node-2 +connection node_2; select * from t3; a select * from t3; @@ -338,6 +354,7 @@ Variable_name Value Qcache_hits 2 drop table t1, t2, t3; # On node-1 +connection node_1; set query_cache_type=demand; create table t1 (a int not null) engine=innodb; insert into t1 values (1),(2),(3); @@ -371,6 +388,7 @@ Variable_name Value Qcache_queries_in_cache 1 set query_cache_type=on; # On node-2 +connection node_2; set query_cache_type=demand; select * from t1; a @@ -402,6 +420,7 @@ Variable_name Value Qcache_queries_in_cache 1 set query_cache_type=on; # On node-1 +connection node_1; reset query cache; show status like "Qcache_queries_in_cache"; Variable_name Value @@ -410,6 +429,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 4 # On node-2 +connection node_2; reset query cache; show status like "Qcache_queries_in_cache"; Variable_name Value @@ -418,6 +438,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 3 # On node-1 +connection node_1; select sql_no_cache * from t1; a 1 @@ -430,6 +451,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 4 # On node-2 +connection node_2; select sql_no_cache * from t1; a 1 @@ -443,6 +465,7 @@ Variable_name Value Qcache_hits 3 drop table t1; # On node-1 +connection node_1; create table t1 (a text not null) engine=innodb; select CONNECTION_ID() from t1; CONNECTION_ID() @@ -483,6 +506,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 4 # On node-2 +connection node_2; select CONNECTION_ID() from t1; CONNECTION_ID() select FOUND_ROWS(); @@ -523,6 +547,7 @@ Variable_name Value Qcache_hits 3 drop table t1; # On node-1 +connection node_1; create database mysqltest; create table mysqltest.t1 (i int not null auto_increment, a int, primary key (i)) engine=innodb; @@ -548,6 +573,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 4 # On node-2 +connection node_2; select * from t1; a show status like "Qcache_queries_in_cache"; @@ -574,10 +600,9 @@ Variable_name Value Qcache_hits 3 drop table t1; # On node-1 +connection node_1; create table t1 (a char(1) not null collate koi8r_general_ci) engine=innodb; -insert into t1 values(_koi8r"á"); -Warnings: -Warning 1265 Data truncated for column 'a' at row 1 +insert into t1 values(_koi8r 0xc3); set CHARACTER SET koi8r; select * from t1; a @@ -594,6 +619,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 4 # On node-2 +connection node_2; set CHARACTER SET koi8r; select * from t1; a @@ -611,6 +637,7 @@ Variable_name Value Qcache_hits 3 drop table t1; # On node-1 +connection node_1; create database if not exists mysqltest; create table mysqltest.t1 (i int not null) engine=innodb; create table t1 (i int not null) engine=innodb; @@ -637,6 +664,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 6 # On node-2 +connection node_2; select * from t1; i 2 @@ -660,6 +688,7 @@ Qcache_hits 5 drop database mysqltest; drop table t1; # On node-1 +connection node_1; create table t1 (i int not null) engine=innodb; insert into t1 (i) values (1),(2),(3),(4); select SQL_CALC_FOUND_ROWS * from t1 limit 2; @@ -713,6 +742,7 @@ show status like "Qcache_queries_in_cache"; Variable_name Value Qcache_queries_in_cache 2 # On node-2 +connection node_2; select SQL_CALC_FOUND_ROWS * from t1 limit 2; i 1 @@ -765,9 +795,11 @@ Variable_name Value Qcache_queries_in_cache 2 drop table t1; # On node-2 +connection node_2; flush query cache; reset query cache; # On node-1 +connection node_1; flush query cache; reset query cache; create table t1 (a int not null) ENGINE=MYISAM; @@ -802,6 +834,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 9 # On node-2 +connection node_2; select * from t1; a select * from t1; @@ -830,6 +863,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 8 # On node-1 +connection node_1; show status like "Qcache_queries_in_cache"; Variable_name Value Qcache_queries_in_cache 0 @@ -837,6 +871,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 9 # On node-2 +connection node_2; show global variables like "query_cache_min_res_unit"; Variable_name Value query_cache_min_res_unit 4096 @@ -847,6 +882,7 @@ show global variables like "query_cache_min_res_unit"; Variable_name Value query_cache_min_res_unit 1000 # On node-1 +connection node_1; show global variables like "query_cache_min_res_unit"; Variable_name Value query_cache_min_res_unit 4096 @@ -887,6 +923,7 @@ show status like "Qcache_queries_in_cache"; Variable_name Value Qcache_queries_in_cache 2 # On node-2 +connection node_2; select * from t1; a 1 @@ -935,6 +972,7 @@ show global variables like "query_cache_min_res_unit"; Variable_name Value query_cache_min_res_unit 4096 # On node-1 +connection node_1; select a from t2; a 1 @@ -957,6 +995,7 @@ show global variables like "query_cache_min_res_unit"; Variable_name Value query_cache_min_res_unit 4096 # On node-1 +connection node_1; create table t1 (a int not null) engine=innodb; insert into t1 values (1); select "aaa" from t1; @@ -972,6 +1011,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 12 # On node-2 +connection node_2; select "aaa" from t1; aaa aaa @@ -986,6 +1026,7 @@ Variable_name Value Qcache_hits 11 drop table t1; # On node-1 +connection node_1; create table t1 (a int) engine=innodb; set GLOBAL query_cache_size=1000; Warnings: @@ -1052,6 +1093,7 @@ query_cache_size 102400 select * from t1; a # On node-2 +connection node_2; set GLOBAL query_cache_size=1000; Warnings: Warning 1292 Truncated incorrect query_cache_size value: '1000' @@ -1118,6 +1160,7 @@ select * from t1; a drop table t1; # On node-1 +connection node_1; set GLOBAL query_cache_size=1048576; create table t1 (i int not null) engine=innodb; create table t2 (i int not null) engine=innodb; @@ -1149,6 +1192,7 @@ Qcache_hits 12 update t1 set i=(select distinct 1 from (select * from t2) a); drop table t3; # On node-2 +connection node_2; set GLOBAL query_cache_size=1048576; select * from t1; i @@ -1168,6 +1212,7 @@ Variable_name Value Qcache_hits 11 drop table t1, t2; # On node-1 +connection node_1; use mysql; select * from db; show status like "Qcache_queries_in_cache"; @@ -1185,6 +1230,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 12 # On node-1 +connection node_1; create table t1(id int auto_increment primary key) engine=innodb; insert into t1 values (1), (2), (3); select * from t1; @@ -1199,6 +1245,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 12 # On node-2 +connection node_2; select * from t1; id 1 @@ -1211,6 +1258,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 11 # On node-1 +connection node_1; alter table t1 rename to t2; select * from t1; ERROR 42S02: Table 'test.t1' doesn't exist @@ -1221,6 +1269,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 12 # On node-2 +connection node_2; select * from t1; ERROR 42S02: Table 'test.t1' doesn't exist show status like "Qcache_queries_in_cache"; @@ -1231,6 +1280,7 @@ Variable_name Value Qcache_hits 11 drop table t2; # On node-1 +connection node_1; create table t1 (word char(20) not null) engine=innodb; select * from t1; word @@ -1251,6 +1301,7 @@ select count(*) from t1; count(*) 70 # On node-2 +connection node_2; select count(*) from t1; count(*) 70 @@ -1272,6 +1323,7 @@ count(*) 140 drop table t1; # On node-1 +connection node_1; create table t1 (a int) engine=innodb; insert into t1 values (1),(2),(3); show status like "Qcache_queries_in_cache"; @@ -1292,6 +1344,7 @@ Variable_name Value Qcache_hits 12 drop table t1; # On node-1 +connection node_1; create table t1 (a int) engine=innodb; insert into t1 values (1),(2); show status like "Qcache_queries_in_cache"; @@ -1316,6 +1369,7 @@ Variable_name Value Qcache_hits 12 SET SQL_SELECT_LIMIT=DEFAULT; # On node-2 +connection node_2; show status like "Qcache_queries_in_cache"; Variable_name Value Qcache_queries_in_cache 0 @@ -1339,6 +1393,7 @@ Qcache_hits 11 SET SQL_SELECT_LIMIT=DEFAULT; drop table t1; # On node-1 +connection node_1; create table t1 (a int not null) engine=innodb; create table t2 (a int not null) engine=innodb; set query_cache_wlock_invalidate=1; @@ -1380,6 +1435,7 @@ unlock table; drop view v1; set query_cache_wlock_invalidate=default; # On node-2 +connection node_2; set query_cache_wlock_invalidate=1; create view v1 as select * from t1; select * from t1; @@ -1420,6 +1476,7 @@ drop view v1; set query_cache_wlock_invalidate=default; drop table t1,t2; # On node-1 +connection node_1; create table t1 (id int primary key) engine=innodb; insert into t1 values (1),(2),(3); select * from t1; @@ -1433,12 +1490,10 @@ a drop table t1; drop table t1; # On node-1 +connection node_1; SET NAMES koi8r; CREATE TABLE t1 (a char(1) character set koi8r) engine=innodb; -INSERT INTO t1 VALUES (_koi8r'á'),(_koi8r'Ã'); -Warnings: -Warning 1265 Data truncated for column 'a' at row 1 -Warning 1265 Data truncated for column 'a' at row 2 +INSERT INTO t1 VALUES (_koi8r 0xc3),(_koi8r 0xc3); SELECT a,'Â','â'='Â' FROM t1; a  'â'='Â' à  0 @@ -1484,6 +1539,7 @@ Variable_name Value Qcache_queries_in_cache 4 SET NAMES default; # On node-2 +connection node_2; SELECT a,'Â','â'='Â' FROM t1; a  'â'='Â' ?  0 @@ -1529,6 +1585,7 @@ Variable_name Value Qcache_queries_in_cache 4 drop table t1; # On node-1 +connection node_1; create table t1 (a int) engine=innodb; show status like "Qcache_queries_in_cache"; Variable_name Value @@ -1553,6 +1610,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 13 # On node-2 +connection node_2; show status like "Qcache_queries_in_cache"; Variable_name Value Qcache_queries_in_cache 0 @@ -1577,6 +1635,7 @@ Variable_name Value Qcache_hits 12 drop table t1; # On node-1 +connection node_1; set session query_cache_type = 2; create table t1(a int) engine=innodb; select table_name from information_schema.tables @@ -1614,6 +1673,7 @@ show status like "Qcache_hits"; Variable_name Value Qcache_hits 14 # On node-2 +connection node_2; select a from t1; a select a from t1; @@ -1636,10 +1696,12 @@ Qcache_hits 13 drop table t1; # Restore original settings. # On node-1 +connection node_1; SET GLOBAL query_cache_size=@query_cache_size_saved; SET GLOBAL query_cache_type=@query_cache_type_saved; # On node-2 +connection node_2; SET GLOBAL query_cache_size=@query_cache_size_saved; SET GLOBAL query_cache_type=@query_cache_type_saved; # End of test diff --git a/mysql-test/suite/galera/suite.pm b/mysql-test/suite/galera/suite.pm index a161301d8ff..361743f1243 100644 --- a/mysql-test/suite/galera/suite.pm +++ b/mysql-test/suite/galera/suite.pm @@ -19,6 +19,9 @@ $ENV{WSREP_PROVIDER} = $provider; my ($spath) = grep { -f "$_/wsrep_sst_rsync"; } "$::bindir/scripts", $::path_client_bindir; return "No SST scripts" unless $spath; +my ($cpath) = grep { -f "$_/mysql"; } "$::bindir/scripts", $::path_client_bindir; +return "No scritps" unless $cpath; + my ($epath) = grep { -f "$_/my_print_defaults"; } "$::bindir/extra", $::path_client_bindir; return "No my_print_defaults" unless $epath; @@ -65,13 +68,19 @@ push @::global_suppressions, qr(WSREP: TO isolation failed for: .*), qr|WSREP: gcs_caused\(\) returned .*|, qr|WSREP: Protocol violation. JOIN message sender .* is not in state transfer \(SYNCED\). Message ignored.|, + qr|WSREP: Protocol violation. JOIN message sender .* is not in state transfer \(JOINED\). Message ignored.|, + qr|WSREP: Unsupported protocol downgrade: incremental data collection disabled. Expect abort.|, qr(WSREP: Action message in non-primary configuration from member [0-9]*), qr(WSREP: discarding established .*), + qr|WSREP: .*core_handle_uuid_msg.*|, + qr(WSREP: --wsrep-causal-reads=ON takes precedence over --wsrep-sync-wait=0. WSREP_SYNC_WAIT_BEFORE_READ is on), + qr|WSREP: JOIN message from member .* in non-primary configuration. Ignored.|, ); $ENV{PATH}="$epath:$ENV{PATH}"; $ENV{PATH}="$spath:$ENV{PATH}" unless $epath eq $spath; +$ENV{PATH}="$cpath:$ENV{PATH}" unless $cpath eq $spath; bless { }; diff --git a/mysql-test/suite/galera/t/GAL-401.test b/mysql-test/suite/galera/t/GAL-401.test index 66015f970c9..06ce37dc81f 100644 --- a/mysql-test/suite/galera/t/GAL-401.test +++ b/mysql-test/suite/galera/t/GAL-401.test @@ -10,6 +10,7 @@ SET GLOBAL wsrep_provider_options = 'pc.ignore_sb=true'; --connection node_2 SET @@global.wsrep_desync = 1; SET SESSION wsrep_dirty_reads=1; +SET SESSION wsrep_sync_wait=0; SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; --let $wait_condition = SELECT VARIABLE_VALUE = 'non-Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; --source include/wait_condition.inc @@ -27,10 +28,13 @@ CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)); # Reconnect node 2 to the PC: --connection node_2 SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0'; +SET wsrep_dirty_reads=0; --let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; --source include/wait_condition.inc --let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; --source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +--source include/wait_condition.inc # Must return 0: SHOW STATUS LIKE 'wsrep_desync_count'; @@ -41,6 +45,7 @@ SET @@global.wsrep_desync = 0; --let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; --source include/wait_condition.inc +SET SESSION wsrep_sync_wait=15; SHOW CREATE TABLE t1; DROP TABLE t1; CALL mtr.add_suppression("WSREP: Protocol violation. JOIN message sender (.*) is not in state transfer \\(SYNCED\\). Message ignored."); diff --git a/mysql-test/suite/galera/t/MW-286.test b/mysql-test/suite/galera/t/MW-286.test index 1b2e322f078..08deb317fbe 100644 --- a/mysql-test/suite/galera/t/MW-286.test +++ b/mysql-test/suite/galera/t/MW-286.test @@ -25,6 +25,7 @@ SET wsrep_on = FALSE; --error ER_QUERY_INTERRUPTED ALTER TABLE t1 ADD PRIMARY KEY (f1); +SET SESSION wsrep_sync_wait = 0; SET wsrep_on = TRUE; SET GLOBAL wsrep_desync = FALSE; diff --git a/mysql-test/suite/galera/t/MW-309.test b/mysql-test/suite/galera/t/MW-309.test new file mode 100644 index 00000000000..351a508ecec --- /dev/null +++ b/mysql-test/suite/galera/t/MW-309.test @@ -0,0 +1,32 @@ +# +# MW-309 Regression: wsrep_max_ws_rows limit also applies to certain SELECT queries +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; + +SET GLOBAL wsrep_max_ws_rows = 2; + +SET AUTOCOMMIT=OFF; +START TRANSACTION; +SELECT * FROM t1 GROUP BY f1; +SELECT * FROM t1 GROUP BY f1; + +--error 0 +SELECT * FROM t1 GROUP BY f1; + +--disable_result_log +--error 0 +SHOW STATUS LIKE '%wsrep%'; +--enable_result_log + +SET GLOBAL wsrep_max_ws_rows = 0; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MW-329.test b/mysql-test/suite/galera/t/MW-329.test index acf6763b396..b3b4e8e921f 100644 --- a/mysql-test/suite/galera/t/MW-329.test +++ b/mysql-test/suite/galera/t/MW-329.test @@ -5,6 +5,7 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +CALL mtr.add_suppression("WSREP: .*conflict state . after post commit .*"); CREATE TABLE t1 (f1 INTEGER, f2 CHAR(20) DEFAULT 'abc') ENGINE=InnoDB; # We start with a populated table @@ -41,7 +42,8 @@ DELIMITER ;| # --connection node_2 ---let $count = 10 +CALL mtr.add_suppression("WSREP: Failed to report last committed .*"); +--let $count = 200 while ($count) { --let $signature = `SELECT LEFT(MD5(RAND()), 10)` @@ -80,3 +82,6 @@ SELECT VARIABLE_VALUE > 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_N --connection node_1 DROP PROCEDURE proc_insert; DROP TABLE t1; + +# Due to MW-330, Multiple "conflict state 3 after post commit" warnings if table is dropped while SP is running +CALL mtr.add_suppression("conflict state 3 after post commit"); diff --git a/mysql-test/suite/galera/t/MW-336.test b/mysql-test/suite/galera/t/MW-336.test new file mode 100644 index 00000000000..79d8951a822 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-336.test @@ -0,0 +1,64 @@ +# +# MW-336 Slave threads may leak if variable wsrep_slave_threads is set repeatedly +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB; + +--connection node_1 +SET GLOBAL wsrep_slave_threads = 10; +SET GLOBAL wsrep_slave_threads = 1; + +--connection node_2 +INSERT INTO t1 VALUES (1); + +--connection node_1 +--sleep 0.5 +SET GLOBAL wsrep_slave_threads = 10; +--sleep 0.5 +SELECT COUNT(*) = 11 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; + +SET GLOBAL wsrep_slave_threads = 20; +--sleep 0.5 +SELECT COUNT(*) = 21 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; + + +SET GLOBAL wsrep_slave_threads = 1; + +--connection node_2 +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (3); +INSERT INTO t1 VALUES (4); +INSERT INTO t1 VALUES (5); +INSERT INTO t1 VALUES (6); +INSERT INTO t1 VALUES (7); +INSERT INTO t1 VALUES (8); +INSERT INTO t1 VALUES (9); + + +--connection node_1 +SET GLOBAL wsrep_slave_threads = 10; +SET GLOBAL wsrep_slave_threads = 0; + +--connection node_2 +INSERT INTO t1 VALUES (10); +INSERT INTO t1 VALUES (11); +INSERT INTO t1 VALUES (12); +INSERT INTO t1 VALUES (13); +INSERT INTO t1 VALUES (14); +INSERT INTO t1 VALUES (15); +INSERT INTO t1 VALUES (16); +INSERT INTO t1 VALUES (17); +INSERT INTO t1 VALUES (18); +INSERT INTO t1 VALUES (19); +INSERT INTO t1 VALUES (20); + +--connection node_1 +--sleep 0.5 +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; + +SET GLOBAL wsrep_slave_threads = 1; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MW-357.test b/mysql-test/suite/galera/t/MW-357.test new file mode 100644 index 00000000000..d13cf058aeb --- /dev/null +++ b/mysql-test/suite/galera/t/MW-357.test @@ -0,0 +1,13 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_2 +SET GLOBAL wsrep_slave_threads = 0; + +--connection node_1 +CREATE TABLE t1 (f1 INT PRIMARY KEY) Engine=InnoDB; + +--connection node_1 +INSERT INTO t1 VALUES (1); + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MW-369.inc b/mysql-test/suite/galera/t/MW-369.inc new file mode 100644 index 00000000000..5fd9ef150ae --- /dev/null +++ b/mysql-test/suite/galera/t/MW-369.inc @@ -0,0 +1,75 @@ +# +# This file should be included from tests for MW-369 to run concurrent +# transaction from node_1 with autocommit query from node_2. +# +# The parameters: +# * $mw_369_parent_query - the parent query to be run inside transaction +# * $mw_369_child_query - the child query +# +# The operations are the following: +# +# node_1: +# START TRANSACTION; +# $mw_369_parent_query +# node_2 +# $mw_369_child_query - will be blocked on node_1 in apply monitor +# node_1: +# COMMIT; - will be blocked on node_1 in local monitor +# +# The $mw_369_child_query is always expected to succeed. The caller is +# responsible for checking if the final COMMIT on connection node_1 +# succeeds. +# + +--connection node_1 +SET AUTOCOMMIT=ON; +START TRANSACTION; + +--eval $mw_369_parent_query + +# +# Block the $mw_369_child_query from node_2 +# +# --connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +SET SESSION wsrep_sync_wait = 0; +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +# +# insert client row, which will make it impossible to replay the +# delete on parent +# +--connection node_2 +--eval $mw_369_child_query + +# +# Wait until $mw_369_child_query from node_2 reaches the sync point and +# block the 'COMMIT' from node_1 before it certifies. +# +--connection node_1a +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + +--let $galera_sync_point = local_monitor_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_1 +--send COMMIT + +# +# Wait until both sync points have been reached +# +--connection node_1a +--let $galera_sync_point = apply_monitor_slave_enter_sync local_monitor_enter_sync +--source include/galera_wait_sync_point.inc + +# +# both threads are now parked in sync points, signal them to continue +# +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc + +--let $galera_sync_point = local_monitor_enter_sync +--source include/galera_signal_sync_point.inc +--source include/galera_clear_sync_point.inc diff --git a/mysql-test/suite/galera/t/MW-369.test b/mysql-test/suite/galera/t/MW-369.test new file mode 100644 index 00000000000..720d6daf518 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-369.test @@ -0,0 +1,246 @@ +# +# Test A Outline: +# =============== +# +# This test tests the scenario for MW-369 where a new child table +# row referring to parent table row is inserted concurrently from +# another node while the transaction which tries to delete a +# referred row from the parent table is committing. +# +# The p table will originally have rows (1, 0), (2, 0). +# The c table will be empty. +# +# A new row (1, 1) pointing to parent row (1, 0) is inserted from +# connection node_2, the transaction which tries to remove the +# parent row (1, 0) is run from connection node_1. +# +# Expected outcome: +# ================ +# +# The transaction on node_1 will fail. The parent table will contain +# rows (1, 0), (2, 0) and the child table will contain row (1, 1). +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc +--source suite/galera/include/galera_have_debug_sync.inc + +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; + +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); + +--let $mw_369_parent_query = DELETE FROM p WHERE f1 = 1 +--let $mw_369_child_query = INSERT INTO c VALUES (1, 1) + +# +# we must open connection node_1a here, MW-369.inc will use it later +# +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--source MW-369.inc + +# Commit fails +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; + +# +# Test B Outline: +# =============== +# +# This test tests the scenario for MW-369 where a existing +# child table row is updated concurrently from another node +# with a transaction which updates the parent table. +# +# The p table will originally have rows (1, 0), (2, 0). +# The c table will originally have rows (1, 1, 0) which points +# to parent table row (1, 0). +# +# Expected outcome: +# ================ +# +# Both updates should succeed since they are done to separate tables and +# rows. The parent table will contain rows (1, 1), (2, 0). The child +# table will contain row (1, 1, 1). +# + +--connection node_1 +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, + f2 INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; + +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +INSERT INTO c VALUES (1, 1, 0); + +--let mw_369_parent_query = UPDATE p SET f2 = 1 WHERE f1 = 1 +--let $mw_369_child_query = UPDATE c SET f2 = 1 WHERE f1 = 1 +--source MW-369.inc + +# Commit succeeds +--connection node_1 +--reap + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; + +# +# Test C Outline: +# =============== +# +# This test tests the scenario for MW-369 where a child table row is +# deleted concurrently from the other node while a transaction updates +# the parent table referred by the child table row. +# +# The p table will originally have rows (1, 0), (2, 0) +# The c table will originally have row (1, 1) which points to parent +# table row (1, 0). +# +# A row (1, 1) pointing to parent row (1, 0) is deleted from +# connection node_2, the transaction which tries to update the +# parent row (1, 0) is run from connection node_1. +# +# Expected Outcome: +# ================ +# Both operations on node_1 and node_2 should succeed without conflicts. +# The parent table should contain values (1, 1), (2, 0) and the child +# table should be empty. + +--connection node_1 +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; + +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +INSERT INTO c VALUES (1, 1); + +--let $mw_369_parent_query = UPDATE p SET f2 = 1 WHERE f1 = 1 +--let $mw_369_child_query = DELETE FROM c WHERE f1 = 1 +--source MW-369.inc + +# Commit succeeds +--connection node_1 +--reap + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; + + +# +# Test D Outline: +# =============== +# +# This test is similar to test A, where parent row is deleted while a child row +# is inserted simultaneously on node 2. However, in this test case the FK +# constraint's target column is a unique key, and parent row is not delete, +# but this key value is changed so that insert on node 2 will cause FK +# violation +# +# The p table will originally have rows (1, 0) +# The c table will originally be empty +# +# in node_1, parent row is updated to value (1,1) +# A row (1, 0) pointing to the old version of parent row (1, 0) is inserted +# in connection node_2 +# +# Expected Outcome: +# ================ +# This is a true conflict and one transaciton must abort. In this case it is node_1 +# transaction, which was scheduled later. +# Parent table should have row (1,0) +# child table should have row (1,0) +# + +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER UNIQUE KEY) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f2)) ; + +INSERT INTO p VALUES (1, 0); + +--let $mw_369_parent_query = UPDATE p SET f2 = 1 WHERE f1 = 1 +--let $mw_369_child_query = INSERT INTO c VALUES (1, 0); +--source MW-369.inc + +# Commit fails +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; + +# +# Test E Outline: +# =============== +# +# This test is similar to test B, where parent row is deleted while a child row +# is updated simultaneously on node 2. However, in this test case the FK +# constraint has ON DELETE CASCADE option, and the delete on parent row will +# cascade a delete on child row as well. This will cause true conflict with +# connection node_2, which tries to update unrelated column on child table. +# +# The p table will originally have rows (1, 0), (2,0) +# The c table will originally have row (1,1,0) +# +# in node_1, parent row (1,0) is deleted and cascaded delete will happen on +# child table row (1,1,0). +# in connection node_2 child table row is update to value (1,1,1) +# +# Expected Outcome: +# ================ +# This is a true conflict and one transaciton must abort. In this case it is node_1 +# transaction, which was scheduled later. +# Parent table should have rows (1,0), (2,0) +# child table should have row (1,1,1) +# + + +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, f2 INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1) + ON DELETE CASCADE) ; + +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +INSERT INTO c VALUES (1, 1, 0); + +--let $mw_369_parent_query = DELETE FROM p WHERE f1 = 1 +--let $mw_369_child_query = UPDATE c SET f2 = 1 WHERE f1 = 1 +--source MW-369.inc + +# Commit fails +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; + diff --git a/mysql-test/suite/galera/t/MW-402.test b/mysql-test/suite/galera/t/MW-402.test new file mode 100644 index 00000000000..36b691c6295 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-402.test @@ -0,0 +1,180 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source suite/galera/include/galera_have_debug_sync.inc + +# +# we must open connection node_1a here, MW-369.inc will use it later +# +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 + +# +# cascading delete operation is replicated from node2 +# and this conflicts with an update for child table in node1 +# +# As a result, the update should fail for certification error +# +--connection node_1 + +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, f2 INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1) ON DELETE CASCADE); + +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); + +INSERT INTO c VALUES (1, 1, 0); + +--let $mw_369_parent_query = UPDATE c SET f2=1 where f1=1 +--let $mw_369_child_query = DELETE FROM p WHERE f1 = 1 + +--connection node_1a +--source MW-369.inc + +# Commit fails +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; + +# +# cascading update operation is replicated from node2 +# and this conflicts with an update for child table in node1 +# +# As a result, the update should fail for certification error +# +--connection node_1 + +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, f2 INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1) ON UPDATE CASCADE); + + +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); + +INSERT INTO c VALUES (1, 1, 0); + +--let $mw_369_parent_query = UPDATE c SET f2=2 where f1=1 +--let $mw_369_child_query = UPDATE p set f1=11 WHERE f1 = 1 + +--connection node_1a +--source MW-369.inc + +# Commit fails +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; + +# +# ON UPDATE CASCADE tests +# Here we update primary key of parent table to cause cascaded update +# on child table +# +# cascading update operation is replicated from node2 +# and this conflicts with an update for child table in node1 +# +# As a result, the update should fail for certification error +# +--connection node_1 + +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, f2 INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1) ON UPDATE CASCADE); + + +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); + +INSERT INTO c VALUES (1, 1, 0); + +--let $mw_369_parent_query = UPDATE c SET p_id=2 where f1=1 +--let $mw_369_child_query = UPDATE p set f1=11 WHERE f1 = 1 + +--connection node_1a +--source MW-369.inc + +# Commit fails +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +# same as previous, but statements in different order +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +--let $mw_369_parent_query = UPDATE p set f1=21 WHERE f1 = 11 +--let $mw_369_child_query = UPDATE c SET p_id=2 where f1=1 + +--connection node_1a +--source MW-369.inc + +# Commit fails +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; + + +# +# CASCADE DELETE tests with two parent tables +# Here we cause cascaded operation on child table through +# one parent table and have other operation on the other +# parent table +# +# cascading update operation is replicated from node2 +# but this does not conflict with an update for the other parent table in node1 +# +# As a result, the update on p2 should succeed +# +--connection node_1 + +CREATE TABLE p1 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE p2 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p1_id INTEGER, p2_id INTEGER, f2 INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p1_id) REFERENCES p1 (f1) ON DELETE CASCADE, + CONSTRAINT fk_2 FOREIGN KEY (p2_id) REFERENCES p2 (f1)); + + +INSERT INTO p1 VALUES (1, 0); +INSERT INTO p2 VALUES (1, 0); + +INSERT INTO c VALUES (1, 1, 1, 0); + +--let $mw_369_parent_query = UPDATE p2 SET f2=2 where f1=1 +--let $mw_369_child_query = DELETE FROM p1 WHERE f1 = 1 + +--connection node_1a +--source MW-369.inc + +# Commit succeeds +--connection node_1 +--reap + +# same as previous, but statements in different order +--connection node_2 +SELECT * FROM p1; +SELECT * FROM p2; +SELECT * FROM c; + +DROP TABLE c,p1,p2; diff --git a/mysql-test/suite/galera/t/MW-86-wait1-master.opt b/mysql-test/suite/galera/t/MW-86-wait1-master.opt new file mode 100644 index 00000000000..8a755e98b00 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-86-wait1-master.opt @@ -0,0 +1 @@ +--log-bin --log-slave-updates diff --git a/mysql-test/suite/galera/t/MW-86-wait1.test b/mysql-test/suite/galera/t/MW-86-wait1.test new file mode 100644 index 00000000000..6c0982ad8b3 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-86-wait1.test @@ -0,0 +1,106 @@ +# +# SHOW commands no longer obey wsrep_sync_wait = 1 (WSREP_SYNC_WAIT_BEFORE_READ) +# (they do not wait for the background INSERT in the applier in node_2 to +# complete) +# +--source include/galera_cluster.inc +--source include/have_binlog_format_row.inc +--source include/have_debug_sync.inc + +--connection node_2 +# Make sure no signals have been leftover from previous tests to surprise us. +SELECT @@debug_sync; + +SET SESSION wsrep_sync_wait = 1; +SET GLOBAL debug = "+d,sync.wsrep_apply_cb"; + +--connection node_1 +CREATE TABLE t_wait1 (f1 INTEGER) ENGINE=InnoDB; +# This will complete in node_1 but will start a background apply in node_2 +# which will stop because of sync.wsrep_apply_cb we set above. +INSERT INTO t_wait1 VALUES (1); + +--connection node_2 + +SET SESSION debug_sync = "now WAIT_FOR sync.wsrep_apply_cb_reached"; + +--disable_result_log + +SHOW BINARY LOGS; + +SHOW BINLOG EVENTS; + +--error ER_NO_SUCH_TABLE +SHOW COLUMNS FROM t1; + +--error ER_EVENT_DOES_NOT_EXIST +SHOW CREATE EVENT e1; + +--error ER_SP_DOES_NOT_EXIST +SHOW CREATE FUNCTION f1; + +--error ER_SP_DOES_NOT_EXIST +SHOW CREATE PROCEDURE p1; + +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t1; + +--error ER_TRG_DOES_NOT_EXIST +SHOW CREATE TRIGGER tr1; + +--error ER_NO_SUCH_TABLE +SHOW CREATE VIEW v1; + +SHOW DATABASES; + +SHOW ENGINE InnoDB STATUS; + +--error ER_SP_DOES_NOT_EXIST +SHOW FUNCTION CODE f1; + +SHOW FUNCTION STATUS; + +SHOW GRANTS FOR 'root'@'localhost'; + +--error ER_NO_SUCH_TABLE +SHOW INDEX FROM t1; + +SHOW OPEN TABLES; + +--error ER_SP_DOES_NOT_EXIST +SHOW PROCEDURE CODE p1; + +SHOW PROCEDURE STATUS; + +SHOW PRIVILEGES; + +SHOW STATUS LIKE 'wsrep_cluster_size'; + +SHOW TABLE STATUS; + +SHOW TABLES; + +SHOW TRIGGERS; + +SHOW GLOBAL VARIABLES LIKE 'foo_bar'; + +--error 0 +SHOW WARNINGS; + +--enable_result_log + +# Unblock the background INSERT and remove the sync point. +SET GLOBAL debug = "-d,sync.wsrep_apply_cb"; +SET SESSION debug_sync = "now SIGNAL signal.wsrep_apply_cb"; + +SET SESSION wsrep_sync_wait = default; + +# This will wait for the background INSERT to complete before we quit +# from the test. +DROP TABLE t_wait1; + +SET GLOBAL debug = NULL; +SET debug_sync='RESET'; + +# Make sure no pending signals are leftover to surprise subsequent tests. +SELECT @@debug_sync; diff --git a/mysql-test/suite/galera/t/MW-86-wait8-master.opt b/mysql-test/suite/galera/t/MW-86-wait8-master.opt new file mode 100644 index 00000000000..8a755e98b00 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-86-wait8-master.opt @@ -0,0 +1 @@ +--log-bin --log-slave-updates diff --git a/mysql-test/suite/galera/t/MW-86-wait8.test b/mysql-test/suite/galera/t/MW-86-wait8.test new file mode 100644 index 00000000000..65e612c5c8e --- /dev/null +++ b/mysql-test/suite/galera/t/MW-86-wait8.test @@ -0,0 +1,128 @@ +# +# SHOW commands now obey wsrep_sync_wait = 8 (WSREP_SYNC_WAIT_BEFORE_SHOW) +# +--source include/galera_cluster.inc +--source include/have_binlog_format_row.inc +--source include/have_debug_sync.inc + +--connection node_2 +# Make sure no signals have been leftover from previous tests to surprise us. +SELECT @@debug_sync; + +SET SESSION wsrep_sync_wait = 8; +SET GLOBAL debug = "+d,sync.wsrep_apply_cb"; + +--connection node_1 +CREATE TABLE t_wait8 (f1 INTEGER) ENGINE=InnoDB; +# This will complete in node_1 but will start a background apply in node_2 +# which will stop because of sync.wsrep_apply_cb we set above. +INSERT INTO t_wait8 VALUES (1); + +--connection node_2 + +--let $wsrep_provider_options_orig = `SELECT @@wsrep_provider_options` +SET GLOBAL wsrep_provider_options = "repl.causal_read_timeout=PT0.1S"; + +SET SESSION debug_sync = "now WAIT_FOR sync.wsrep_apply_cb_reached"; + +--disable_result_log + +--error ER_LOCK_WAIT_TIMEOUT +SHOW BINARY LOGS; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW BINLOG EVENTS; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW COLUMNS FROM t1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW CREATE DATABASE db1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW CREATE EVENT e1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW CREATE FUNCTION f1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW CREATE PROCEDURE p1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW CREATE TABLE t1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW CREATE TRIGGER tr1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW CREATE VIEW v1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW DATABASES; + +--error 0 +SHOW ENGINE InnoDB STATUS; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW FUNCTION CODE f1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW FUNCTION STATUS; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW GRANTS FOR 'root'@'localhost'; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW INDEX FROM t1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW OPEN TABLES; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW PROCEDURE CODE p1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW PROCEDURE STATUS; + +--error 0 +SHOW PRIVILEGES; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW STATUS LIKE 'wsrep_cluster_size'; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW TABLE STATUS; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW TABLES; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW TRIGGERS; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW GLOBAL VARIABLES LIKE 'foo_bar'; + +--error 0 +SHOW WARNINGS; + +--enable_result_log + +--disable_query_log +--eval SET GLOBAL wsrep_provider_options = "$wsrep_provider_options_orig" +--enable_query_log + +# Unblock the background INSERT and remove the sync point. +SET GLOBAL debug = "-d,sync.wsrep_apply_cb"; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; + +SET SESSION wsrep_sync_wait = default; + +# This will wait for the background INSERT to complete before we quit +# from the test. +DROP TABLE t_wait8; + +SET GLOBAL debug = NULL; +SET debug_sync='RESET'; + +# Make sure no pending signals are leftover to surprise subsequent tests. +SELECT @@debug_sync; diff --git a/mysql-test/suite/galera/t/galera#414.test b/mysql-test/suite/galera/t/galera#414.test index dccb28e4054..de10898df42 100644 --- a/mysql-test/suite/galera/t/galera#414.test +++ b/mysql-test/suite/galera/t/galera#414.test @@ -6,6 +6,11 @@ --source include/have_innodb.inc --source include/galera_cluster.inc +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + # We perform the shutdown/restart sequence in here. If there was a crash during shutdown, MTR will detect it --connection node_2 @@ -35,3 +40,4 @@ CALL mtr.add_suppression("Failed to set packet size"); --source include/wait_condition.inc CALL mtr.add_suppression("Failed to set packet size"); +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_applier_ftwrl_table.test b/mysql-test/suite/galera/t/galera_applier_ftwrl_table.test index 6747977812b..97819384a75 100644 --- a/mysql-test/suite/galera/t/galera_applier_ftwrl_table.test +++ b/mysql-test/suite/galera/t/galera_applier_ftwrl_table.test @@ -28,7 +28,7 @@ SELECT COUNT(*) = 0 FROM t1; --connection node_1 UNLOCK TABLES; -SET SESSION wsrep_sync_wait = 7; +SET SESSION wsrep_sync_wait = 15; SELECT COUNT(*) = 2 FROM t1; DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter.test b/mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter.test index 99c45c04ba0..67f2108d263 100644 --- a/mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter.test +++ b/mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter.test @@ -29,7 +29,7 @@ SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system use UNLOCK TABLES; -SET SESSION wsrep_sync_wait = 7; +SET SESSION wsrep_sync_wait = 15; SHOW CREATE TABLE t1; SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'Waiting for table metadata lock'; diff --git a/mysql-test/suite/galera/t/galera_as_slave_autoinc.test b/mysql-test/suite/galera/t/galera_as_slave_autoinc.test index 9292badc480..59483d0591c 100644 --- a/mysql-test/suite/galera/t/galera_as_slave_autoinc.test +++ b/mysql-test/suite/galera/t/galera_as_slave_autoinc.test @@ -48,7 +48,7 @@ insert into t1(i) values(null), (null), (null); select * from t1; show variables like 'binlog_format'; -show variables like '%auto_increment%'; +show variables like 'auto_increment_increment'; --connection node_2 --let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; diff --git a/mysql-test/suite/galera/t/galera_autoinc_sst_xtrabackup.cnf b/mysql-test/suite/galera/t/galera_autoinc_sst_xtrabackup.cnf index 7d684cef67d..b4bf5f02171 100644 --- a/mysql-test/suite/galera/t/galera_autoinc_sst_xtrabackup.cnf +++ b/mysql-test/suite/galera/t/galera_autoinc_sst_xtrabackup.cnf @@ -1,9 +1,8 @@ !include ../galera_2nodes.cnf [mysqld] -#wsrep_sst_method=xtrabackup-v2 -#wsrep_sst_auth="root:" -#wsrep_debug=ON +wsrep_sst_method=xtrabackup-v2 +wsrep_sst_auth="root:" [mysqld.1] wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true' diff --git a/mysql-test/suite/galera/t/galera_autoinc_sst_xtrabackup.test b/mysql-test/suite/galera/t/galera_autoinc_sst_xtrabackup.test index 251450f7099..30ce9bc4ceb 100644 --- a/mysql-test/suite/galera/t/galera_autoinc_sst_xtrabackup.test +++ b/mysql-test/suite/galera/t/galera_autoinc_sst_xtrabackup.test @@ -1,6 +1,6 @@ # # Test that autoincrement works correctly while the cluster membership -# is changing and IST takes place. +# is changing and SST takes place. # --source include/big_test.inc diff --git a/mysql-test/suite/galera/t/galera_bf_abort_flush_for_export.test b/mysql-test/suite/galera/t/galera_bf_abort_flush_for_export.test index e32089ce21e..fde783e2cef 100644 --- a/mysql-test/suite/galera/t/galera_bf_abort_flush_for_export.test +++ b/mysql-test/suite/galera/t/galera_bf_abort_flush_for_export.test @@ -27,7 +27,7 @@ UNLOCK TABLES; COMMIT; SET AUTOCOMMIT=ON; -SET SESSION wsrep_sync_wait = 7; +SET SESSION wsrep_sync_wait = 15; SELECT COUNT(*) = 1 FROM t1; --let $wsrep_local_bf_aborts_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` diff --git a/mysql-test/suite/galera/t/galera_ddl_multiline.test b/mysql-test/suite/galera/t/galera_ddl_multiline.test new file mode 100644 index 00000000000..c7155d066fa --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ddl_multiline.test @@ -0,0 +1,54 @@ +# +# Test that Galera works correctly with multiline statements, in particular involving DDLs +# + +--source include/galera_cluster.inc + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; + +SHOW CREATE TABLE t1; +SHOW CREATE TABLE t2; + +--connection node_2 +SHOW CREATE TABLE t1; +SHOW CREATE TABLE t2; + +--connection node_1 +--send CREATE TABLE t3 (f1 INTEGER) ENGINE=InnoDB; CREATE TABLE t4 (f1 INTEGER) ENGINE=InnoDB; +--reap + +SHOW CREATE TABLE t3; +SHOW CREATE TABLE t4; + +--connection node_2 +SHOW CREATE TABLE t3; +SHOW CREATE TABLE t4; + +--connection node_1 +INSERT INTO t1 VALUES (1); CREATE TABLE t5 (f1 INTEGER) ENGINE=InnoDB; + +SELECT COUNT(*) = 1 FROM t1; +SHOW CREATE TABLE t5; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; +SHOW CREATE TABLE t5; + +--connection node_1 +--send CREATE TABLE t6 (f1 INTEGER) ENGINE=InnoDB; INSERT INTO t2 VALUES (1); +--reap + +SELECT COUNT(*) = 1 FROM t2; +SHOW CREATE TABLE t6; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t2; +SHOW CREATE TABLE t6; + +--let $diff_servers = 1 2 +--source include/diff_servers.inc + +--connection node_1 +DROP TABLE t1, t2, t3, t4, t5, t6; + diff --git a/mysql-test/suite/galera/t/galera_defaults.test b/mysql-test/suite/galera/t/galera_defaults.test index 3b1cb7b8650..32fc24097d2 100644 --- a/mysql-test/suite/galera/t/galera_defaults.test +++ b/mysql-test/suite/galera/t/galera_defaults.test @@ -13,13 +13,13 @@ # Make sure that the test is operating on the right version of galera library. --disable_query_log ---let $galera_version=25.3.17 +--let $galera_version=3.20 source ../wsrep/include/check_galera_version.inc; --enable_query_log # Global Variables -SELECT COUNT(*) = 42 FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE 'wsrep_%'; +SELECT COUNT(*) = 43 FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE 'wsrep_%'; SELECT VARIABLE_NAME, VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES diff --git a/mysql-test/suite/galera/t/galera_gcs_fc_limit.test b/mysql-test/suite/galera/t/galera_gcs_fc_limit.test index dc65a452d7c..61576a39316 100644 --- a/mysql-test/suite/galera/t/galera_gcs_fc_limit.test +++ b/mysql-test/suite/galera/t/galera_gcs_fc_limit.test @@ -21,11 +21,11 @@ LOCK TABLE t1 WRITE; --connection node_1 --sleep 1 INSERT INTO t1 VALUES (2); ---sleep 1 +--sleep 2 INSERT INTO t1 VALUES (3); ---sleep 1 +--sleep 2 INSERT INTO t1 VALUES (4); ---sleep 1 +--sleep 2 # This query will hang because flow control will kick in --send diff --git a/mysql-test/suite/galera/t/galera_insert_ignore.test b/mysql-test/suite/galera/t/galera_insert_ignore.test index 4b4b0a6e9fb..027f70e96d9 100644 --- a/mysql-test/suite/galera/t/galera_insert_ignore.test +++ b/mysql-test/suite/galera/t/galera_insert_ignore.test @@ -2,10 +2,10 @@ --source include/have_innodb.inc --let $wsrep_sync_wait_orig = (SELECT @@wsrep_sync_wait) -SET GLOBAL wsrep_sync_wait = 7; +SET GLOBAL wsrep_sync_wait = 15; --connection node_2 -SET GLOBAL wsrep_sync_wait = 7; +SET GLOBAL wsrep_sync_wait = 15; # diff --git a/mysql-test/suite/galera/t/galera_ist_mysqldump.cnf b/mysql-test/suite/galera/t/galera_ist_mysqldump.cnf index db6b7d5e129..357c8678658 100644 --- a/mysql-test/suite/galera/t/galera_ist_mysqldump.cnf +++ b/mysql-test/suite/galera/t/galera_ist_mysqldump.cnf @@ -9,3 +9,4 @@ wsrep_provider_options='base_port=@mysqld.1.#galera_port;pc.ignore_sb=true' [mysqld.2] wsrep_provider_options='base_port=@mysqld.2.#galera_port;pc.ignore_sb=true' + diff --git a/mysql-test/suite/galera/t/galera_ist_progress.cnf b/mysql-test/suite/galera/t/galera_ist_progress.cnf new file mode 100644 index 00000000000..0a26f6d6c83 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ist_progress.cnf @@ -0,0 +1,5 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;pc.ignore_sb=true' + diff --git a/mysql-test/suite/galera/t/galera_ist_progress.test b/mysql-test/suite/galera/t/galera_ist_progress.test new file mode 100644 index 00000000000..3ba63415c28 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ist_progress.test @@ -0,0 +1,76 @@ +# +# Test progress output during IST +# + +--source include/galera_cluster.inc +# This could cause out of storage if run /dev/shm +--source include/big_test.inc + +# Isolate node #2 +--connection node_2 +SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1'; + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--connection node_2 +SET SESSION wsrep_on = OFF; +--let $wait_condition = SELECT VARIABLE_VALUE = 'non-Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc +SET SESSION wsrep_on = ON; + +# Node #2 is now isolated. Run some transactions to accumulate writesets for IST + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (3); +INSERT INTO t1 VALUES (4); +INSERT INTO t1 VALUES (5); +INSERT INTO t1 VALUES (6); +INSERT INTO t1 VALUES (7); +INSERT INTO t1 VALUES (8); +INSERT INTO t1 VALUES (9); +INSERT INTO t1 VALUES (10); + +# Restore node #2, IST is performed + +--connection node_2 +SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 0'; + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--connection node_2 +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc + +# +# Grep for expected IST output in joiner log +# + +--connection node_1 + +--let $assert_count = 1 +--let $assert_file = $MYSQLTEST_VARDIR/log/mysqld.2.err +--let $assert_only_after = Need state transfer + +--let $assert_text = Receiving IST: 11 writesets, seqnos +--let $assert_select = Receiving IST: 11 writesets, seqnos +--source include/assert_grep.inc + +--let $assert_text = Receiving IST\.\.\. 0\.0% \( 0/11 events\) complete +--let $assert_select = Receiving IST\.\.\. 0\.0% \( 0/11 events\) complete +--source include/assert_grep.inc + +--let $assert_text = Receiving IST\.\.\.100\.0% \(11/11 events\) complete +--let $assert_select = Receiving IST\.\.\.100\.0% \(11/11 events\) complete +--source include/assert_grep.inc + +# Cleanup + +--connection node_1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_ist_recv_bind.test b/mysql-test/suite/galera/t/galera_ist_recv_bind.test index cb7329073ad..a339684c158 100644 --- a/mysql-test/suite/galera/t/galera_ist_recv_bind.test +++ b/mysql-test/suite/galera/t/galera_ist_recv_bind.test @@ -5,6 +5,7 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/big_test.inc --connection node_1 SELECT @@wsrep_provider_options LIKE '%ist.recv_bind = 127.0.0.1%'; diff --git a/mysql-test/suite/galera/t/galera_ist_restart_joiner.test b/mysql-test/suite/galera/t/galera_ist_restart_joiner.test index 931daaad30d..633318629a6 100644 --- a/mysql-test/suite/galera/t/galera_ist_restart_joiner.test +++ b/mysql-test/suite/galera/t/galera_ist_restart_joiner.test @@ -8,6 +8,8 @@ --source include/have_innodb.inc --source include/have_debug_sync.inc --source suite/galera/include/galera_have_debug_sync.inc +# This could cause out of storage if run /dev/shm +--source include/big_test.inc # Save original auto_increment_offset values. --let $node_1=node_1 @@ -31,13 +33,6 @@ UPDATE t1 SET f2 = 'b' WHERE f1 > 1; UPDATE t1 SET f2 = 'c' WHERE f1 > 2; --connection node_2 -# Make sure IST will block ... ---let $galera_sync_point = recv_IST_after_apply_trx ---source include/galera_set_sync_point.inc - -SET SESSION wsrep_sync_wait = 0; - - # Write file to make mysql-test-run.pl expect the crash, but don't start it --let $_server_id= `SELECT @@server_id` --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.$_server_id.expect @@ -48,21 +43,23 @@ SET SESSION wsrep_sync_wait = 0; # ... and restart provider to force IST --echo Loading wsrep_provider ... --disable_query_log +# base_port setting is lost for some reason when unloading provider, so we need to restore it +--eval SET GLOBAL wsrep_provider_options= 'base_port=$NODE_GALERAPORT_2'; --eval SET GLOBAL wsrep_provider = '$wsrep_provider_orig'; +# Make sure IST will block ... +--let $galera_sync_point = recv_IST_after_apply_trx +--source include/galera_set_sync_point.inc --eval SET GLOBAL wsrep_cluster_address = '$wsrep_cluster_address_orig'; --enable_query_log -# We can not use a wait_condition on SELECT * FROM INFORMATION_SCHEMA.GLOBAL_STATUS as such queries are blocked during IST -# so we perform a simple sleep and SHOW instead - ---sleep 5 -SHOW STATUS LIKE 'wsrep_debug_sync_waiters'; +SET SESSION wsrep_on=OFF; +--let $wait_condition = SELECT VARIABLE_VALUE = 'recv_IST_after_apply_trx' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_debug_sync_waiters'; +--source include/wait_condition.inc +SET SESSION wsrep_on=ON; --connection node_1 -# Perform DML and DDL while IST is in progress ---connection node_1 +# Perform DML while IST is in progress UPDATE t1 SET f2 = 'd' WHERE f1 > 3; -CREATE TABLE t2 (f1 INTEGER); # Kill node #2 while IST is in progress --connection node_2 @@ -85,9 +82,8 @@ EOF --let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' --source include/wait_condition.inc -# Perform DML and DDL while node #2 is down +# Perform DML while node #2 is down UPDATE t1 SET f2 = 'e' WHERE f1 > 4; -CREATE TABLE t3 (f1 INTEGER); --connection node_2 @@ -106,11 +102,9 @@ SELECT * FROM t1; --connection node_2 SELECT * FROM t1; -SELECT COUNT(*) = 0 FROM t2; -SELECT COUNT(*) = 0 FROM t3; --connection node_1 -DROP TABLE t1, t2, t3; +DROP TABLE t1; # Restore original auto_increment_offset values. --source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_ist_rsync.cnf b/mysql-test/suite/galera/t/galera_ist_rsync.cnf index bbe0f6047fb..797e3651967 100644 --- a/mysql-test/suite/galera/t/galera_ist_rsync.cnf +++ b/mysql-test/suite/galera/t/galera_ist_rsync.cnf @@ -5,7 +5,9 @@ wsrep_sst_method=rsync [mysqld.1] wsrep_provider_options='base_port=@mysqld.1.#galera_port;pc.ignore_sb=true' +wsrep_sync_wait=1 [mysqld.2] wsrep_provider_options='base_port=@mysqld.2.#galera_port;pc.ignore_sb=true' +wsrep_sync_wait=1 diff --git a/mysql-test/suite/galera/t/galera_ist_rsync.test b/mysql-test/suite/galera/t/galera_ist_rsync.test index 41d1a0c1fc2..1da79cd4214 100644 --- a/mysql-test/suite/galera/t/galera_ist_rsync.test +++ b/mysql-test/suite/galera/t/galera_ist_rsync.test @@ -2,7 +2,12 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc --source suite/galera/include/galera_st_disconnect_slave.inc --source suite/galera/include/galera_st_shutdown_slave.inc --source suite/galera/include/galera_st_kill_slave.inc --source suite/galera/include/galera_st_kill_slave_ddl.inc +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_kill_applier.test b/mysql-test/suite/galera/t/galera_kill_applier.test index a8e6c9c8e79..d04b72bce0a 100644 --- a/mysql-test/suite/galera/t/galera_kill_applier.test +++ b/mysql-test/suite/galera/t/galera_kill_applier.test @@ -6,8 +6,8 @@ --source include/have_innodb.inc --connection node_1 - ---let $applier_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND NOT STATE <=> 'wsrep aborter idle' AND STATE NOT LIKE 'InnoDB%' LIMIT 1` +--sleep 2 +--let $applier_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE IS NULL LIMIT 1` --disable_query_log --error ER_KILL_DENIED_ERROR,ER_KILL_DENIED_ERROR diff --git a/mysql-test/suite/galera/t/galera_many_rows.test b/mysql-test/suite/galera/t/galera_many_rows.test index 653dc2dd75a..58ba85e1b9e 100644 --- a/mysql-test/suite/galera/t/galera_many_rows.test +++ b/mysql-test/suite/galera/t/galera_many_rows.test @@ -16,7 +16,7 @@ INSERT INTO t1 (f2) SELECT a1.f1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4 --connection node_2 SET SESSION wsrep_sync_wait = 0; --let $wsrep_provider_options_node2 = `SELECT @@wsrep_provider_options` -SET SESSION wsrep_sync_wait = 7; +SET SESSION wsrep_sync_wait = 15; SET GLOBAL wsrep_provider_options = 'repl.causal_read_timeout=PT1H'; diff --git a/mysql-test/suite/galera/t/galera_migrate.cnf b/mysql-test/suite/galera/t/galera_migrate.cnf index 47bdf53afef..ed48f208e52 100644 --- a/mysql-test/suite/galera/t/galera_migrate.cnf +++ b/mysql-test/suite/galera/t/galera_migrate.cnf @@ -13,7 +13,7 @@ log-bin=mysqld-bin wsrep_node_address=127.0.0.1 wsrep_causal_reads=ON -wsrep_sync_wait = 7 +wsrep_sync_wait = 15 [mysqld.1] #galera_port=@OPT.port diff --git a/mysql-test/suite/galera/t/galera_parallel_simple.test b/mysql-test/suite/galera/t/galera_parallel_simple.test index e078a342c16..41cd0c8e6fa 100644 --- a/mysql-test/suite/galera/t/galera_parallel_simple.test +++ b/mysql-test/suite/galera/t/galera_parallel_simple.test @@ -45,7 +45,7 @@ SET SESSION wsrep_sync_wait = 0; UNLOCK TABLES; -SET SESSION wsrep_sync_wait = 7; +SET SESSION wsrep_sync_wait = 15; SELECT COUNT(*) = 10 FROM t1; SELECT COUNT(*) = 10 FROM t2; diff --git a/mysql-test/suite/galera/t/galera_pc_ignore_sb.test b/mysql-test/suite/galera/t/galera_pc_ignore_sb.test index 84fd3a91857..89ef2f0f96b 100644 --- a/mysql-test/suite/galera/t/galera_pc_ignore_sb.test +++ b/mysql-test/suite/galera/t/galera_pc_ignore_sb.test @@ -20,6 +20,7 @@ SET GLOBAL wsrep_provider_options = 'pc.ignore_sb=true'; --source include/kill_galera.inc --connection node_1 +--sleep 2 CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; INSERT INTO t1 VALUES (1); DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_query_cache_sync_wait.test b/mysql-test/suite/galera/t/galera_query_cache_sync_wait.test index 6b14118d5fc..87afc2d7bb2 100644 --- a/mysql-test/suite/galera/t/galera_query_cache_sync_wait.test +++ b/mysql-test/suite/galera/t/galera_query_cache_sync_wait.test @@ -10,7 +10,6 @@ INSERT INTO t1 VALUES (1); --let $wsrep_provider_options_orig = `SELECT @@wsrep_provider_options` SET GLOBAL wsrep_provider_options = "repl.causal_read_timeout=PT1S"; SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb"; -SET SESSION wsrep_sync_wait = 7; SELECT MAX(id) FROM t1; # first lookup miss # @@ -27,7 +26,6 @@ SET GLOBAL DEBUG = ""; SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; FLUSH QUERY CACHE; -SET SESSION wsrep_sync_wait = 7; SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb"; SET DEBUG_SYNC = "RESET"; @@ -52,9 +50,7 @@ SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; INSERT INTO t1 VALUES (4); --connection node_2 -SET SESSION wsrep_sync_wait = 7; SELECT MAX(id) FROM t1; -SET SESSION wsrep_sync_wait = 7; # # Query cache hit @@ -73,7 +69,6 @@ SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb"; INSERT INTO t1 VALUES (5); --connection node_2 -SET SESSION wsrep_sync_wait = 7; --send SELECT MAX(id) FROM t1 --connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 diff --git a/mysql-test/suite/galera/t/galera_restart_on_unknown_option.test b/mysql-test/suite/galera/t/galera_restart_on_unknown_option.test index 2f27678b547..ed7f106c123 100644 --- a/mysql-test/suite/galera/t/galera_restart_on_unknown_option.test +++ b/mysql-test/suite/galera/t/galera_restart_on_unknown_option.test @@ -6,6 +6,11 @@ CALL mtr.add_suppression("Aborting"); CALL mtr.add_suppression("unknown option '--galera-unknown-option'"); +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + # # We should count the number of "Assertion failed" warnings # in the log file before and after testing. To do this we need @@ -125,6 +130,7 @@ SELECT * FROM t1; --connection node_1 DROP TABLE t1; +--source include/auto_increment_offset_restore.inc # # We should count the number of "Assertion failed" warnings @@ -148,3 +154,5 @@ DROP TABLE t1; } EOF --remove_file $TEST_LOG.copy + +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_ssl.test b/mysql-test/suite/galera/t/galera_ssl.test index 8dc94dc1966..e6346aa2151 100644 --- a/mysql-test/suite/galera/t/galera_ssl.test +++ b/mysql-test/suite/galera/t/galera_ssl.test @@ -8,6 +8,7 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/big_test.inc SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; diff --git a/mysql-test/suite/galera/t/galera_ssl_compression.test b/mysql-test/suite/galera/t/galera_ssl_compression.test index cdecf4807d4..75f92c5b2f4 100644 --- a/mysql-test/suite/galera/t/galera_ssl_compression.test +++ b/mysql-test/suite/galera/t/galera_ssl_compression.test @@ -7,6 +7,7 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/big_test.inc SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; diff --git a/mysql-test/suite/galera/t/galera_suspend_slave.test b/mysql-test/suite/galera/t/galera_suspend_slave.test index 353a7c38a73..dcc4a8d14c3 100644 --- a/mysql-test/suite/galera/t/galera_suspend_slave.test +++ b/mysql-test/suite/galera/t/galera_suspend_slave.test @@ -41,6 +41,7 @@ INSERT INTO t1 VALUES (1); exit(0); EOF +SET SESSION wsrep_sync_wait = 1; --sleep 10 --source include/wait_until_ready.inc INSERT INTO t1 VALUES (1); @@ -50,9 +51,11 @@ INSERT INTO t1 VALUES (1); --source include/galera_connect.inc --connection node_2a +SET SESSION wsrep_sync_wait = 1; --source include/wait_until_ready.inc SELECT COUNT(*) = 1 FROM t1; +SET SESSION wsrep_sync_wait = 15; DROP TABLE t1; # Restore original auto_increment_offset values. diff --git a/mysql-test/suite/galera/t/galera_sync_wait_show.test b/mysql-test/suite/galera/t/galera_sync_wait_show.test index 3707b7ebaf1..edad2840da2 100644 --- a/mysql-test/suite/galera/t/galera_sync_wait_show.test +++ b/mysql-test/suite/galera/t/galera_sync_wait_show.test @@ -7,7 +7,8 @@ --source include/have_debug.inc --connection node_2 -SET SESSION wsrep_sync_wait = 1; +# MW-86 SHOW commands have now bitmap value 8 +SET SESSION wsrep_sync_wait = 8; --connection node_1 diff --git a/mysql-test/suite/galera/t/galera_unicode_identifiers.test b/mysql-test/suite/galera/t/galera_unicode_identifiers.test index 9adac1aa555..f3df60a6415 100644 --- a/mysql-test/suite/galera/t/galera_unicode_identifiers.test +++ b/mysql-test/suite/galera/t/galera_unicode_identifiers.test @@ -6,10 +6,10 @@ --source include/have_innodb.inc --let $wsrep_sync_wait_orig = (SELECT @@wsrep_sync_wait) -SET GLOBAL wsrep_sync_wait = 7; +SET GLOBAL wsrep_sync_wait = 15; --connection node_2 -SET GLOBAL wsrep_sync_wait = 7; +SET GLOBAL wsrep_sync_wait = 15; --connection node_1 diff --git a/mysql-test/suite/galera/t/galera_var_cluster_address.test b/mysql-test/suite/galera/t/galera_var_cluster_address.test index 0f857eb1aac..03706bbbb12 100644 --- a/mysql-test/suite/galera/t/galera_var_cluster_address.test +++ b/mysql-test/suite/galera/t/galera_var_cluster_address.test @@ -76,4 +76,3 @@ CALL mtr.add_suppression("WSREP: wsrep::connect\\(gcomm://192.0.2.1\\) failed: 7 --source include/galera_end.inc --echo # End of test - diff --git a/mysql-test/suite/galera/t/galera_var_dirty_reads.test b/mysql-test/suite/galera/t/galera_var_dirty_reads.test index 1fd30c69a7b..cba8488b879 100644 --- a/mysql-test/suite/galera/t/galera_var_dirty_reads.test +++ b/mysql-test/suite/galera/t/galera_var_dirty_reads.test @@ -17,15 +17,10 @@ CREATE TABLE t1(i INT) ENGINE=INNODB; INSERT INTO t1 VALUES(1); SELECT * FROM t1; -create user user1; -grant all privileges on *.* to user1; -create user user2; -grant all privileges on *.* to user2; - SET @@global.wsrep_cluster_address = ''; SET @@session.wsrep_dirty_reads=OFF; -# Set wsrep_sync_wait to avoid ER_LOCK_WAIT_TIMEOUT (MDEV-6832). +# Set wsrep_sync_wait to avoid ER_LOCK_WAIT_TIMEOUT. SET SESSION wsrep_sync_wait=0; # Must return 'OFF' @@ -37,75 +32,31 @@ SHOW STATUS LIKE 'wsrep_cluster_status'; --error ER_UNKNOWN_COM_ERROR SELECT * FROM t1; -#Select query which does not access table should be allowed MDEV-11016 -SELECT @@wsrep_dirty_reads; -SELECT 2; -SELECT 2+2 FROM DUAL; +--error ER_UNKNOWN_COM_ERROR +SELECT 1 FROM t1; SET @@session.wsrep_dirty_reads=ON; SELECT * FROM t1; +SELECT 1 FROM t1; ---enable_connect_log ---connect (con1, localhost, user1,,test,$NODE_MYPORT_2,$NODE_MYSOCK_2) -#Just test the session behavior -SET SESSION wsrep_sync_wait=0; +SELECT i, variable_name, variable_value FROM t1, information_schema.session_variables WHERE variable_name LIKE "wsrep_dirty_reads" AND i = 1; -set session wsrep_dirty_reads=1; -#Prepared statement creation should be allowed MDEV-11479 -prepare stmt_show from 'select 1'; -prepare stmt_select from 'select * from t1'; -prepare stmt_insert from 'insert into t1 values(1)'; -set session wsrep_dirty_reads=0; +SET @@session.wsrep_dirty_reads=OFF; -#No Preapare stmt/proceure will be allowed --error ER_UNKNOWN_COM_ERROR -execute stmt_show; +SELECT i, variable_name, variable_value FROM t1, information_schema.session_variables WHERE variable_name LIKE "wsrep_dirty_reads" AND i = 1; + +SELECT 1; + --error ER_UNKNOWN_COM_ERROR -execute stmt_select; +USE information_schema; + --error ER_UNKNOWN_COM_ERROR -execute stmt_insert; +SELECT * FROM information_schema.session_variables WHERE variable_name LIKE "wsrep_dirty_reads"; -SET wsrep_dirty_reads=ON; -select @@session.wsrep_dirty_reads; -#Only prepare statement which does not change data should be allowed -execute stmt_show; -execute stmt_select; --error ER_UNKNOWN_COM_ERROR -execute stmt_insert; -SET @@global.wsrep_dirty_reads=ON; - ---connect (con2, localhost, user2,,test,$NODE_MYPORT_2,$NODE_MYSOCK_2) -#Just test the session behavior -select @@session.wsrep_dirty_reads; - -prepare stmt_show from 'select 1'; -prepare stmt_select from 'select * from t1'; -prepare stmt_insert from 'insert into t1 values(1)'; - -#Only prepare statement which does not change data should be allowed -execute stmt_show; -execute stmt_select; ---error ER_UNKNOWN_COM_ERROR -execute stmt_insert; - -#wsrep_dirty_read should work when wsrep_sync_wait is 1 or non zero -#because we already are disconnected , So It does not make any sense -#to wait for other nodes -SET SESSION wsrep_sync_wait=1; -execute stmt_show; -execute stmt_select; ---error ER_UNKNOWN_COM_ERROR -execute stmt_insert; - -SET SESSION wsrep_sync_wait=7; -execute stmt_show; -execute stmt_select; ---error ER_UNKNOWN_COM_ERROR -execute stmt_insert; - ---connection node_2 -SET @@global.wsrep_dirty_reads=OFF; +SELECT COUNT(*) >= 10 FROM performance_schema.events_statements_history; --disable_query_log --eval SET @@global.wsrep_cluster_address = '$wsrep_cluster_address_saved' @@ -113,13 +64,11 @@ SET @@global.wsrep_dirty_reads=OFF; --source include/wait_until_connected_again.inc --connection node_1 +USE test; SELECT * FROM t1; # Cleanup DROP TABLE t1; -drop user user1; -drop user user2; -# Restore original auto_increment_offset values. --source include/auto_increment_offset_restore.inc --source include/galera_end.inc diff --git a/mysql-test/suite/galera/t/galera_var_node_address.test b/mysql-test/suite/galera/t/galera_var_node_address.test index cf118cf9934..3353652d8b9 100644 --- a/mysql-test/suite/galera/t/galera_var_node_address.test +++ b/mysql-test/suite/galera/t/galera_var_node_address.test @@ -6,6 +6,9 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +call mtr.add_suppression("WSREP: Stray state UUID msg: .* current group state WAIT_STATE_UUID .*"); +call mtr.add_suppression("WSREP: Protocol violation. JOIN message sender .* is not in state transfer (.*). Message ignored."); + SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; --connection node_1 diff --git a/mysql-test/suite/galera/t/galera_var_sync_wait.test b/mysql-test/suite/galera/t/galera_var_sync_wait.test index 288ad62226f..ecb0d92b891 100644 --- a/mysql-test/suite/galera/t/galera_var_sync_wait.test +++ b/mysql-test/suite/galera/t/galera_var_sync_wait.test @@ -20,7 +20,10 @@ CREATE TABLE t1 (f1 INT PRIMARY KEY) Engine=InnoDB; --connection node_2 SET GLOBAL wsrep_sync_wait = 1; # Those statements should see the table -SHOW TABLES LIKE '%t1'; + +# MW-86 SHOW commands have now their own bitmask +# SHOW TABLES LIKE '%t1'; + SELECT COUNT(*) = 0 FROM t1; --connection node_1 diff --git a/mysql-test/suite/galera/t/galera_wsrep_provider_unset_set.test b/mysql-test/suite/galera/t/galera_wsrep_provider_unset_set.test index fe4c358bd89..7f91495fcc4 100644 --- a/mysql-test/suite/galera/t/galera_wsrep_provider_unset_set.test +++ b/mysql-test/suite/galera/t/galera_wsrep_provider_unset_set.test @@ -6,6 +6,11 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + --connection node_1 CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; INSERT INTO t1 VALUES (1); @@ -26,6 +31,8 @@ INSERT INTO t1 VALUES (3); --eval SET GLOBAL wsrep_cluster_address = '$wsrep_cluster_address_orig'; --enable_query_log +SET SESSION wsrep_sync_wait = 0; + --source include/wait_until_connected_again.inc --source include/galera_wait_ready.inc @@ -39,3 +46,5 @@ SELECT COUNT(*) = 4 FROM t1; SELECT COUNT(*) = 3 FROM t1; DROP TABLE t1; + +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/lp1376747-4.test b/mysql-test/suite/galera/t/lp1376747-4.test index be56ee5edc1..0c707d6d681 100644 --- a/mysql-test/suite/galera/t/lp1376747-4.test +++ b/mysql-test/suite/galera/t/lp1376747-4.test @@ -45,7 +45,7 @@ SHOW CREATE TABLE t1; --connection node_2a --reap UNLOCK TABLES; ---sleep 1 +--sleep 2 SHOW CREATE TABLE t1; SELECT * from t1; diff --git a/mysql-test/suite/galera/t/mysql-wsrep#198.test b/mysql-test/suite/galera/t/mysql-wsrep#198.test index 2b05c4ff4d9..a80d030a8b0 100644 --- a/mysql-test/suite/galera/t/mysql-wsrep#198.test +++ b/mysql-test/suite/galera/t/mysql-wsrep#198.test @@ -5,6 +5,9 @@ CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; CREATE TABLE t2 (id INT PRIMARY KEY) ENGINE=InnoDB; --connection node_2 +# Ensure that the tables have been created on node #2 +SELECT 1 FROM DUAL; + LOCK TABLE t2 WRITE; --connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 diff --git a/mysql-test/suite/galera/t/mysql-wsrep#201.test b/mysql-test/suite/galera/t/mysql-wsrep#201.test index e9327540195..21cf05db008 100644 --- a/mysql-test/suite/galera/t/mysql-wsrep#201.test +++ b/mysql-test/suite/galera/t/mysql-wsrep#201.test @@ -8,7 +8,6 @@ INSERT INTO t1 VALUES (DEFAULT); --connection node_2 --let $qcache_size_orig = `SELECT @@GLOBAL.query_cache_size` SET GLOBAL query_cache_size=1355776; -SET SESSION wsrep_sync_wait = 7; --disable_query_log diff --git a/mysql-test/suite/galera/t/pxc-421.test b/mysql-test/suite/galera/t/pxc-421.test index 8a360b12f4c..381f9bb4494 100644 --- a/mysql-test/suite/galera/t/pxc-421.test +++ b/mysql-test/suite/galera/t/pxc-421.test @@ -31,6 +31,7 @@ INSERT INTO t1 VALUES (3); --eval SET GLOBAL wsrep_cluster_address = '$wsrep_cluster_address_orig'; --enable_query_log +set SESSION wsrep_sync_wait=0; --source include/wait_until_connected_again.inc --source include/galera_wait_ready.inc @@ -53,8 +54,12 @@ show global variables like 'wsrep_slave_threads'; --eval SET GLOBAL wsrep_slave_threads = $wsrep_slave_2 SELECT COUNT(*) FROM t1; +SET GLOBAL auto_increment_offset = 2; + --connection node_1 SELECT COUNT(*) FROM t1; show global variables like 'wsrep_slave_threads'; --eval SET GLOBAL wsrep_slave_threads = $wsrep_slave_1 DROP TABLE t1; + +SET GLOBAL auto_increment_offset = 1; diff --git a/mysql-test/suite/galera/t/query_cache.opt b/mysql-test/suite/galera/t/query_cache.opt new file mode 100644 index 00000000000..a00258bc48c --- /dev/null +++ b/mysql-test/suite/galera/t/query_cache.opt @@ -0,0 +1 @@ +--query_cache_type=1 diff --git a/mysql-test/suite/galera/t/query_cache.test b/mysql-test/suite/galera/t/query_cache.test index 24ed8ecd077..e024b308fab 100644 --- a/mysql-test/suite/galera/t/query_cache.test +++ b/mysql-test/suite/galera/t/query_cache.test @@ -323,7 +323,7 @@ drop table t1; --echo # On node-1 --connection node_1 create table t1 (a char(1) not null collate koi8r_general_ci) engine=innodb; -insert into t1 values(_koi8r"á"); +insert into t1 values(_koi8r 0xc3); set CHARACTER SET koi8r; select * from t1; set CHARACTER SET cp1251_koi8; @@ -861,7 +861,7 @@ drop table t1; --connection node_1 SET NAMES koi8r; CREATE TABLE t1 (a char(1) character set koi8r) engine=innodb; -INSERT INTO t1 VALUES (_koi8r'á'),(_koi8r'Ã'); +INSERT INTO t1 VALUES (_koi8r 0xc3),(_koi8r 0xc3); # # Run select # diff --git a/mysql-test/suite/galera_3nodes/disabled.def b/mysql-test/suite/galera_3nodes/disabled.def index ca55c41ff72..a9b9b00b40c 100644 --- a/mysql-test/suite/galera_3nodes/disabled.def +++ b/mysql-test/suite/galera_3nodes/disabled.def @@ -1,7 +1,3 @@ -galera_garbd : Fix the test case -galera_evs_suspect_timeout : TODO: investigate -galera_innobackupex_backup : TODO: investigate galera_slave_options_do :MDEV-8798 galera_slave_options_ignore : MDEV-8798 -galera_pc_bootstrap : TODO: Investigate: Timeout in wait_condition.inc -galera_pc_weight : Test times out + diff --git a/mysql-test/suite/galera_3nodes/galera_3nodes.cnf b/mysql-test/suite/galera_3nodes/galera_3nodes.cnf index 1ed273fdcb5..fe3bcb1e8ff 100644 --- a/mysql-test/suite/galera_3nodes/galera_3nodes.cnf +++ b/mysql-test/suite/galera_3nodes/galera_3nodes.cnf @@ -11,14 +11,13 @@ wsrep-provider=@ENV.WSREP_PROVIDER wsrep_node_address=127.0.0.1 # enforce read-committed characteristics across the cluster wsrep-causal-reads=ON -wsrep-sync-wait=7 +wsrep-sync-wait=15 [mysqld.1] -#galera_port=@OPT.port -#ist_port=@OPT.port -#sst_port=@OPT.port -wsrep-cluster-address=gcomm:// -wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=10M;evs.suspect_timeout=PT10S' +wsrep-cluster-address='gcomm://' +wsrep_provider_options='base_port=@mysqld.1.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S' + +wsrep_sst_receive_address=127.0.0.2:@mysqld.1.#sst_port wsrep_node_incoming_address=127.0.0.1:@mysqld.1.port wsrep_sst_receive_address='127.0.0.1:@mysqld.1.#sst_port' diff --git a/mysql-test/suite/galera_3nodes/r/GAL-501.result b/mysql-test/suite/galera_3nodes/r/GAL-501.result new file mode 100644 index 00000000000..a2bf5f4d98c --- /dev/null +++ b/mysql-test/suite/galera_3nodes/r/GAL-501.result @@ -0,0 +1,14 @@ +SELECT VARIABLE_VALUE LIKE '%[::1]%' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_incoming_addresses'; +VARIABLE_VALUE LIKE '%[::1]%' +1 +SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 3 +1 +SET GLOBAL wsrep_provider_options='gmcast.isolate=1'; +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +SET GLOBAL wsrep_provider_options='gmcast.isolate=0'; +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera_3nodes/r/galera_ipv6_mysqldump.result b/mysql-test/suite/galera_3nodes/r/galera_ipv6_mysqldump.result new file mode 100644 index 00000000000..f519654952b --- /dev/null +++ b/mysql-test/suite/galera_3nodes/r/galera_ipv6_mysqldump.result @@ -0,0 +1,26 @@ +GRANT ALL PRIVILEGES ON *.* TO 'sst'; +SET GLOBAL wsrep_sst_auth = 'sst:'; +SET GLOBAL wsrep_sst_method = 'mysqldump'; +Unloading wsrep provider ... +SET GLOBAL wsrep_provider = 'none'; +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +Loading wsrep provider ... +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +DROP TABLE t1; +SELECT VARIABLE_VALUE LIKE '%[::1]%' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_incoming_addresses'; +VARIABLE_VALUE LIKE '%[::1]%' +1 +CALL mtr.add_suppression("Slave SQL: Error 'The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement' on query"); +DROP USER sst; +CALL mtr.add_suppression("Slave SQL: Error 'The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement' on query"); +CALL mtr.add_suppression("InnoDB: Error: Table \"mysql\"\\.\"innodb_index_stats\" not found"); +CALL mtr.add_suppression("InnoDB: New log files created"); +CALL mtr.add_suppression("InnoDB: Creating foreign key constraint system tables"); +CALL mtr.add_suppression("Can't open and lock time zone table"); +CALL mtr.add_suppression("Can't open and lock privilege tables"); +CALL mtr.add_suppression("Info table is not ready to be used"); +CALL mtr.add_suppression("Native table .* has the wrong structure"); +CALL mtr.add_suppression("Unsupported protocol downgrade: incremental data collection disabled. Expect abort"); diff --git a/mysql-test/suite/galera_3nodes/r/galera_ipv6_rsync.result b/mysql-test/suite/galera_3nodes/r/galera_ipv6_rsync.result new file mode 100644 index 00000000000..a2bf5f4d98c --- /dev/null +++ b/mysql-test/suite/galera_3nodes/r/galera_ipv6_rsync.result @@ -0,0 +1,14 @@ +SELECT VARIABLE_VALUE LIKE '%[::1]%' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_incoming_addresses'; +VARIABLE_VALUE LIKE '%[::1]%' +1 +SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 3 +1 +SET GLOBAL wsrep_provider_options='gmcast.isolate=1'; +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +SET GLOBAL wsrep_provider_options='gmcast.isolate=0'; +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera_3nodes/r/galera_ipv6_xtrabackup-v2.result b/mysql-test/suite/galera_3nodes/r/galera_ipv6_xtrabackup-v2.result new file mode 100644 index 00000000000..53e35939a79 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/r/galera_ipv6_xtrabackup-v2.result @@ -0,0 +1,18 @@ +SELECT VARIABLE_VALUE LIKE '%[::1]%' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_incoming_addresses'; +VARIABLE_VALUE LIKE '%[::1]%' +1 +SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 3 +1 +SET GLOBAL wsrep_provider_options='gmcast.isolate=1'; +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +SET GLOBAL wsrep_provider_options='gmcast.isolate=0'; +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +DROP TABLE t1; +include/assert_grep.inc [Streaming the backup to joiner at \[::1\]] +include/assert_grep.inc [async IST sender starting to serve tcp://\[::1\]:] +include/assert_grep.inc [IST receiver addr using tcp://\[::1\]] +include/assert_grep.inc [Prepared IST receiver, listening at: tcp://\[::1\]] diff --git a/mysql-test/suite/galera_3nodes/r/galera_var_dirty_reads2.result b/mysql-test/suite/galera_3nodes/r/galera_var_dirty_reads2.result new file mode 100644 index 00000000000..88780a2c87f --- /dev/null +++ b/mysql-test/suite/galera_3nodes/r/galera_var_dirty_reads2.result @@ -0,0 +1,48 @@ +CREATE TABLE t1 (f1 INTEGER); +INSERT INTO t1 VALUES (1); +SET GLOBAL wsrep_provider_options='gmcast.isolate=1'; +SET SESSION wsrep_sync_wait = 0; +SET SESSION wsrep_dirty_reads = 1; +SELECT f1 FROM t1; +f1 +1 +USE test; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +LOCK TABLE t1 WRITE; +UNLOCK TABLES; +FLUSH TABLES WITH READ LOCK; +UNLOCK TABLES; +PREPARE stmt_select FROM 'SELECT f1 FROM t1'; +EXECUTE stmt_select; +f1 +1 +PREPARE stmt_update FROM 'UPDATE t1 SET f1 = f1 + f1'; +SET GLOBAL wsrep_dirty_reads = 1; +SET GLOBAL wsrep_sync_wait = 0; +SET GLOBAL wsrep_dirty_reads = 0; +SET GLOBAL wsrep_sync_wait = 15; +SET SESSION wsrep_dirty_reads = 1; +INSERT INTO t1 SELECT * FROM t1; +ERROR 08S01: WSREP has not yet prepared node for application use +DELETE FROM t1; +ERROR 08S01: WSREP has not yet prepared node for application use +UPDATE t1 SET f1 = f1 + 1; +ERROR 08S01: WSREP has not yet prepared node for application use +DROP TABLE t1; +ERROR 08S01: WSREP has not yet prepared node for application use +EXECUTE stmt_update; +ERROR 08S01: WSREP has not yet prepared node for application use +SET SESSION wsrep_dirty_reads = 0; +SELECT * FROM t1; +ERROR 08S01: WSREP has not yet prepared node for application use +EXECUTE stmt_select; +ERROR 08S01: WSREP has not yet prepared node for application use +SELECT COUNT(*) > 0 FROM INFORMATION_SCHEMA.PROCESSLIST; +COUNT(*) > 0 +1 +SET GLOBAL wsrep_provider_options='gmcast.isolate=0'; +DROP TABLE t1; diff --git a/mysql-test/suite/galera_3nodes/t/GAL-501.cnf b/mysql-test/suite/galera_3nodes/t/GAL-501.cnf new file mode 100644 index 00000000000..7002cb5bdfd --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/GAL-501.cnf @@ -0,0 +1,26 @@ +!include ../galera_3nodes.cnf + +[mysqld] +wsrep_sst_method=rsync + + +[mysqld.1] +wsrep-cluster-address=gcomm:// +wsrep_node_address=[::1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.1.#galera_port;ist.recv_addr=[::1]' +wsrep_sst_receive_address='[::1]:@mysqld.1.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.1.port' + +[mysqld.2] +wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' +wsrep_node_address=[::1] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.2.#galera_port;ist.recv_addr=[::1]' +wsrep_sst_receive_address='[::1]:@mysqld.2.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.2.port' + +[mysqld.3] +wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' +wsrep_node_address=[::1] +wsrep_provider_options='base_port=@mysqld.3.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.3.#galera_port;ist.recv_addr=[::1]' +wsrep_sst_receive_address='[::1]:@mysqld.3.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.3.port' diff --git a/mysql-test/suite/galera_3nodes/t/GAL-501.test b/mysql-test/suite/galera_3nodes/t/GAL-501.test new file mode 100644 index 00000000000..60ed5989227 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/GAL-501.test @@ -0,0 +1,38 @@ +# +# Test GAL-501 Improved URI parsing for IPv6 addresses +# The .cnf file contains +# wsrep_node_address=[::1] +# ist.recv_addr=[::1] + +--source include/galera_cluster.inc +--source include/have_ipv6.inc + +# Confirm that initial handshake happened over ipv6 + +SELECT VARIABLE_VALUE LIKE '%[::1]%' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_incoming_addresses'; +SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +# Force IST + +--connection node_2 +SET GLOBAL wsrep_provider_options='gmcast.isolate=1'; + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +--connection node_2 +SET GLOBAL wsrep_provider_options='gmcast.isolate=0'; + +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +--source include/wait_condition.inc + +SELECT COUNT(*) = 1 FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera_3nodes/t/galera_ipv6_mysqldump.cnf b/mysql-test/suite/galera_3nodes/t/galera_ipv6_mysqldump.cnf new file mode 100644 index 00000000000..3728e1ce005 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/galera_ipv6_mysqldump.cnf @@ -0,0 +1,22 @@ +!include ../galera_3nodes.cnf + +[mysqld] +wsrep_sst_method=rsync + +[mysqld.1] +wsrep-cluster-address=gcomm:// +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.1.#galera_port;ist.recv_addr=[::1]:@mysqld.1.#ist_port' +wsrep_sst_receive_address='[::1]:@mysqld.1.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.1.port' + +[mysqld.2] +wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.2.#galera_port;ist.recv_addr=[::1]:@mysqld.2.#ist_port' +wsrep_sst_receive_address='[::1]:@mysqld.2.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.2.port' + +[mysqld.3] +wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' +wsrep_provider_options='base_port=@mysqld.3.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.3.#galera_port;ist.recv_addr=[::1]:@mysqld.3.#ist_port' +wsrep_sst_receive_address='[::1]:@mysqld.3.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.3.port' diff --git a/mysql-test/suite/galera_3nodes/t/galera_ipv6_mysqldump.test b/mysql-test/suite/galera_3nodes/t/galera_ipv6_mysqldump.test new file mode 100644 index 00000000000..5b06e617eef --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/galera_ipv6_mysqldump.test @@ -0,0 +1,56 @@ +--source include/galera_cluster.inc +--source include/have_ipv6.inc + +--connection node_1 +GRANT ALL PRIVILEGES ON *.* TO 'sst'; + +--let $wsrep_sst_auth_orig = `SELECT @@wsrep_sst_auth` +SET GLOBAL wsrep_sst_auth = 'sst:'; + +--connection node_2 +--source include/wait_until_connected_again.inc +--let $wsrep_sst_method_orig = `SELECT @@wsrep_sst_method` +--let $wsrep_sst_receive_address_orig = `SELECT @@wsrep_sst_receive_address` + +--disable_query_log +--eval SET GLOBAL wsrep_sst_receive_address = '[::1]:$NODE_MYPORT_2'; +--enable_query_log +SET GLOBAL wsrep_sst_method = 'mysqldump'; + + +# +# Force mysqldump SST +# + +--connection node_2 +--source suite/galera/include/galera_unload_provider.inc +--remove_file $MYSQLTEST_VARDIR/mysqld.2/data/grastate.dat + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + + +--connection node_2 +--source suite/galera/include/galera_load_provider.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +--source include/wait_condition.inc + +SELECT COUNT(*) = 1 FROM t1; + +DROP TABLE t1; + +# Confirm that initial handshake happened over ipv6 + +SELECT VARIABLE_VALUE LIKE '%[::1]%' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_incoming_addresses'; + +--source suite/galera/include/galera_sst_restore.inc +--connection node_2 +CALL mtr.add_suppression("Unsupported protocol downgrade: incremental data collection disabled. Expect abort"); diff --git a/mysql-test/suite/galera_3nodes/t/galera_ipv6_rsync.cnf b/mysql-test/suite/galera_3nodes/t/galera_ipv6_rsync.cnf new file mode 100644 index 00000000000..3728e1ce005 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/galera_ipv6_rsync.cnf @@ -0,0 +1,22 @@ +!include ../galera_3nodes.cnf + +[mysqld] +wsrep_sst_method=rsync + +[mysqld.1] +wsrep-cluster-address=gcomm:// +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.1.#galera_port;ist.recv_addr=[::1]:@mysqld.1.#ist_port' +wsrep_sst_receive_address='[::1]:@mysqld.1.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.1.port' + +[mysqld.2] +wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.2.#galera_port;ist.recv_addr=[::1]:@mysqld.2.#ist_port' +wsrep_sst_receive_address='[::1]:@mysqld.2.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.2.port' + +[mysqld.3] +wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' +wsrep_provider_options='base_port=@mysqld.3.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.3.#galera_port;ist.recv_addr=[::1]:@mysqld.3.#ist_port' +wsrep_sst_receive_address='[::1]:@mysqld.3.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.3.port' diff --git a/mysql-test/suite/galera_3nodes/t/galera_ipv6_rsync.test b/mysql-test/suite/galera_3nodes/t/galera_ipv6_rsync.test new file mode 100644 index 00000000000..7ee209d8e72 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/galera_ipv6_rsync.test @@ -0,0 +1,32 @@ +--source include/galera_cluster.inc +--source include/have_ipv6.inc + +# Confirm that initial handshake happened over ipv6 + +SELECT VARIABLE_VALUE LIKE '%[::1]%' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_incoming_addresses'; +SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +# Force IST + +--connection node_2 +SET GLOBAL wsrep_provider_options='gmcast.isolate=1'; + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +--connection node_2 +SET GLOBAL wsrep_provider_options='gmcast.isolate=0'; + +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +--source include/wait_condition.inc + +SELECT COUNT(*) = 1 FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera_3nodes/t/galera_ipv6_xtrabackup-v2.cnf b/mysql-test/suite/galera_3nodes/t/galera_ipv6_xtrabackup-v2.cnf new file mode 100644 index 00000000000..8a80be0d2a9 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/galera_ipv6_xtrabackup-v2.cnf @@ -0,0 +1,26 @@ +!include ../galera_3nodes.cnf + +[mysqld] +wsrep_sst_method=xtrabackup-v2 +wsrep_sst_auth="root:" + +[mysqld.1] +wsrep-cluster-address=gcomm:// +wsrep_provider_options='base_host=[::1];base_port=@mysqld.1.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.1.#galera_port;ist.recv_addr=[::1]:@mysqld.1.#ist_port' +wsrep_sst_receive_address='[::1]:@mysqld.1.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.1.port' + +[mysqld.2] +wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' +wsrep_provider_options='base_host=[::1];base_port=@mysqld.2.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.2.#galera_port;ist.recv_addr=[::1]:@mysqld.2.#ist_port' +wsrep_sst_receive_address='[::1]:@mysqld.2.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.2.port' + +[mysqld.3] +wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' +wsrep_provider_options='base_host=[::1];base_port=@mysqld.3.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.3.#galera_port;ist.recv_addr=[::1]:@mysqld.3.#ist_port' +wsrep_sst_receive_address='[::1]:@mysqld.3.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.3.port' + +[SST] +sockopt=",pf=ip6" diff --git a/mysql-test/suite/galera_3nodes/t/galera_ipv6_xtrabackup-v2.test b/mysql-test/suite/galera_3nodes/t/galera_ipv6_xtrabackup-v2.test new file mode 100644 index 00000000000..84eee017700 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/galera_ipv6_xtrabackup-v2.test @@ -0,0 +1,62 @@ +--source include/galera_cluster.inc +--source include/have_ipv6.inc + +# Confirm that initial handshake happened over ipv6 + +SELECT VARIABLE_VALUE LIKE '%[::1]%' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_incoming_addresses'; +SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +# Force IST + +--connection node_2 +SET GLOBAL wsrep_provider_options='gmcast.isolate=1'; + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +--connection node_2 +SET GLOBAL wsrep_provider_options='gmcast.isolate=0'; + +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +--source include/wait_condition.inc + +SELECT COUNT(*) = 1 FROM t1; + +DROP TABLE t1; + +# Confirm that key messages around SST and IST reference IPv6 + +--connection node_1 +--let $assert_file = $MYSQLTEST_VARDIR/log/mysqld.1.err +--let $assert_only_after = CURRENT_TEST + +--let $assert_count = 2 +--let $assert_text = Streaming the backup to joiner at \[::1\] +--let $assert_select = Streaming the backup to joiner at \[::1\] +--source include/assert_grep.inc + +--let $assert_count = 1 +--let $assert_text = async IST sender starting to serve tcp://\[::1\]: +--let $assert_select = async IST sender starting to serve tcp://\[::1\]: +--source include/assert_grep.inc + +--let $assert_file = $MYSQLTEST_VARDIR/log/mysqld.2.err + +--let $assert_text = IST receiver addr using tcp://\[::1\] +--let $assert_select = IST receiver addr using tcp://\[::1\] +--source include/assert_grep.inc + +--let $assert_text = Prepared IST receiver, listening at: tcp://\[::1\] +--let $assert_select = Prepared IST receiver, listening at: tcp://\[::1\] +--source include/assert_grep.inc + + + + diff --git a/mysql-test/suite/galera_3nodes/t/galera_var_dirty_reads2.test b/mysql-test/suite/galera_3nodes/t/galera_var_dirty_reads2.test new file mode 100644 index 00000000000..129ba2e1f38 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/galera_var_dirty_reads2.test @@ -0,0 +1,112 @@ +# +# Additional tests for wsrep_dirty_reads +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INTEGER); +INSERT INTO t1 VALUES (1); + +--connection node_2 +SET GLOBAL wsrep_provider_options='gmcast.isolate=1'; + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--connection node_2 +SET SESSION wsrep_sync_wait = 0; + +--let $wait_condition = SELECT VARIABLE_VALUE = 'non-Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc + +SET SESSION wsrep_dirty_reads = 1; + +# Those statements should succeed + +--error 0 +SELECT f1 FROM t1; + +--error 0 +USE test; + +--error 0 +SHOW CREATE TABLE t1; + +--error 0 +LOCK TABLE t1 WRITE; + +--error 0 +UNLOCK TABLES; + +--error 0 +FLUSH TABLES WITH READ LOCK; + +--error 0 +UNLOCK TABLES; + +--error 0 +PREPARE stmt_select FROM 'SELECT f1 FROM t1'; + +--error 0 +EXECUTE stmt_select; + +--error 0 +PREPARE stmt_update FROM 'UPDATE t1 SET f1 = f1 + f1'; + +# Mysqldump should succeed + +SET GLOBAL wsrep_dirty_reads = 1; +SET GLOBAL wsrep_sync_wait = 0; +--error 0 +--exec $MYSQL_DUMP -u root -S $NODE_MYSOCK_2 test >/dev/null +SET GLOBAL wsrep_dirty_reads = 0; +SET GLOBAL wsrep_sync_wait = 15; + +# Those statements should fail + +SET SESSION wsrep_dirty_reads = 1; + +--error ER_UNKNOWN_COM_ERROR +INSERT INTO t1 SELECT * FROM t1; + +--error ER_UNKNOWN_COM_ERROR +DELETE FROM t1; + +--error ER_UNKNOWN_COM_ERROR +UPDATE t1 SET f1 = f1 + 1; + +--error ER_UNKNOWN_COM_ERROR +DROP TABLE t1; + +--error ER_UNKNOWN_COM_ERROR +EXECUTE stmt_update; + +# With wsrep_dirty_reads = 0 , even SELECTS are not allowed + +SET SESSION wsrep_dirty_reads = 0; + +--error ER_UNKNOWN_COM_ERROR +SELECT * FROM t1; + +--error ER_UNKNOWN_COM_ERROR +EXECUTE stmt_select; + +# But reads from INFORMATION_SCHEMA are allowed + +--error 0 +SELECT COUNT(*) > 0 FROM INFORMATION_SCHEMA.PROCESSLIST; + +# Restore cluster +SET GLOBAL wsrep_provider_options='gmcast.isolate=0'; + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--connection node_2 +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc + +DROP TABLE t1; diff --git a/mysql-test/suite/gcol/inc/gcol_keys.inc b/mysql-test/suite/gcol/inc/gcol_keys.inc index 8b6712e9302..a16d425ed24 100644 --- a/mysql-test/suite/gcol/inc/gcol_keys.inc +++ b/mysql-test/suite/gcol/inc/gcol_keys.inc @@ -322,24 +322,6 @@ ALTER TABLE t1 add unique index idx(pk); DESC t1; DROP TABLE t1; ---echo # ---echo # Bug#21346132: WL8149:INNODB: FAILING ASSERTION: ---echo # PRIMARY_KEY_NO == -1 || PRIMARY_KEY_NO == 0 ---echo # -CREATE TABLE t1 ( - col_int_nokey int(11) NOT NULL, - col_int_key int(11) GENERATED ALWAYS AS (col_int_nokey), - col_varchar_nokey varchar(1) NOT NULL, - col_varchar_key varchar(2) GENERATED ALWAYS AS (col_varchar_nokey), - UNIQUE KEY col_int_key (col_int_key), - UNIQUE KEY col_varchar_key (col_varchar_key), - UNIQUE KEY col_int_key_2 (col_int_key,col_varchar_key), - UNIQUE KEY col_varchar_key_2 (col_varchar_key,col_varchar_nokey), - KEY col_int_key_3 (col_int_key,col_int_nokey) -); - -ALTER TABLE t1 DROP COLUMN col_varchar_key; -DROP TABLE t1; --echo # --echo # Bug#21320151 WL8149: WRONG RESULT WITH INDEX SCAN --echo # diff --git a/mysql-test/suite/gcol/r/gcol_bugfixes.result b/mysql-test/suite/gcol/r/gcol_bugfixes.result index fd40515225e..9aff30aabc9 100644 --- a/mysql-test/suite/gcol/r/gcol_bugfixes.result +++ b/mysql-test/suite/gcol/r/gcol_bugfixes.result @@ -576,6 +576,19 @@ SELECT 1 FROM t WHERE c GROUP BY b; COMMIT; DROP TABLE t; # +# Bug #25793677 INNODB: FAILING ASSERTION: CLUST_TEMPL_FOR_SEC || LEN .... +# +CREATE TABLE v ( +a INT, +c INT, +b CHAR(2) GENERATED ALWAYS AS (a IN (1)) VIRTUAL, +KEY(c,b(1))) charset utf8mb4; +INSERT INTO v (a,c) VALUES (1,1); +SELECT (SELECT MAX(c) FROM v); +(SELECT MAX(c) FROM v) +1 +DROP TABLE v; +# # MDEV-9255 Add generation_expression to information_schema.columns. # CREATE TABLE gcol_t1 ( diff --git a/mysql-test/suite/gcol/r/gcol_keys_innodb.result b/mysql-test/suite/gcol/r/gcol_keys_innodb.result index 80605b8b0b2..fadbb3b8031 100644 --- a/mysql-test/suite/gcol/r/gcol_keys_innodb.result +++ b/mysql-test/suite/gcol/r/gcol_keys_innodb.result @@ -6,6 +6,19 @@ SET @@session.default_storage_engine = 'InnoDB'; # - FOREIGN INDEX (partially supported) # - CHECK (allowed but not used) # UNIQUE +create table t1 (a int, b int generated always as (a*2) virtual unique); +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` int(11) GENERATED ALWAYS AS (`a` * 2) VIRTUAL, + UNIQUE KEY `b` (`b`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +describe t1; +Field Type Null Key Default Extra +a int(11) YES NULL +b int(11) YES UNI NULL VIRTUAL GENERATED +drop table t1; create table t1 (a int, b int generated always as (a*2) stored unique); show create table t1; Table Create Table @@ -19,6 +32,19 @@ Field Type Null Key Default Extra a int(11) YES NULL b int(11) YES UNI NULL STORED GENERATED drop table t1; +create table t1 (a int, b int generated always as (a*2) virtual, unique key (b)); +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` int(11) GENERATED ALWAYS AS (`a` * 2) VIRTUAL, + UNIQUE KEY `b` (`b`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +describe t1; +Field Type Null Key Default Extra +a int(11) YES NULL +b int(11) YES UNI NULL VIRTUAL GENERATED +drop table t1; create table t1 (a int, b int generated always as (a*2) stored, unique (b)); show create table t1; Table Create Table @@ -32,6 +58,9 @@ Field Type Null Key Default Extra a int(11) YES NULL b int(11) YES UNI NULL STORED GENERATED drop table t1; +create table t1 (a int, b int generated always as (a*2) virtual); +alter table t1 add unique key (b); +drop table t1; create table t1 (a int, b int generated always as (a*2) stored); alter table t1 add unique key (b); drop table t1; @@ -41,6 +70,21 @@ drop table t1; # - gcol_select.inc # # INDEX +create table t1 (a int, b int generated always as (a*2) virtual, index (b)); +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` int(11) GENERATED ALWAYS AS (`a` * 2) VIRTUAL, + KEY `b` (`b`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +describe t1; +Field Type Null Key Default Extra +a int(11) YES NULL +b int(11) YES MUL NULL VIRTUAL GENERATED +drop table t1; +create table t1 (a int, b int generated always as (a*2) virtual, index (a,b)); +drop table t1; create table t1 (a int, b int generated always as (a*2) stored, index (b)); show create table t1; Table Create Table @@ -67,6 +111,10 @@ Field Type Null Key Default Extra a int(11) YES MUL NULL b int(11) YES NULL STORED GENERATED drop table t1; +create table t1 (a int, b int generated always as (a*2) virtual); +alter table t1 add index (b); +alter table t1 add index (a,b); +drop table t1; create table t1 (a int, b int generated always as (a*2) stored); alter table t1 add index (b); drop table t1; @@ -100,6 +148,13 @@ ERROR HY000: Cannot define foreign key with ON UPDATE CASCADE clause on a genera alter table t1 add foreign key (b) references t2(a) on delete set null; ERROR HY000: Cannot define foreign key with ON DELETE SET NULL clause on a generated column drop table t1; +create table t1 (a int, b int generated always as (a+1) virtual, +foreign key (b) references t2(a)); +ERROR HY000: Can't create table `test`.`t1` (errno: 150 "Foreign key constraint is incorrectly formed") +create table t1 (a int, b int generated always as (a+1) virtual); +alter table t1 add foreign key (b) references t2(a); +ERROR HY000: Can't create table `test`.`#sql-temporary` (errno: 150 "Foreign key constraint is incorrectly formed") +drop table t1; # Allowed FK options. create table t2 (a int primary key, b char(5)); create table t1 (a int, b int generated always as (a % 10) stored, @@ -117,6 +172,168 @@ drop table t1; create table t1 (a int, b int generated always as (a % 10) stored, foreign key (b) references t2(a) on delete no action); drop table t1,t2; +# +# Bug#20553262: WL8149: ASSERTION `DELSUM+(INT) Y/4-TEMP >= 0' FAILED +# +CREATE TABLE c ( +pk integer AUTO_INCREMENT, +col_datetime_nokey DATETIME /*! NULL */, +col_time_nokey TIME /*! NULL */, +col_datetime_key DATETIME GENERATED ALWAYS AS +(ADDTIME(col_datetime_nokey, col_time_nokey)), +col_time_key TIME GENERATED ALWAYS AS +(ADDTIME(col_datetime_nokey, col_time_nokey)), +col_varchar_nokey VARCHAR(1) /*! NULL */, +PRIMARY KEY (pk), +KEY (col_time_key), +KEY (col_datetime_key)); +INSERT INTO c ( col_time_nokey,col_datetime_nokey,col_varchar_nokey) values +('14:03:03.042673','2001-11-28 00:50:27.051028', 'c'), +('01:46:09.016386','2007-10-09 19:53:04.008332', NULL), +('16:21:18.052408','2001-11-08 21:02:12.009395', 'x'), +('18:56:33.027423','2003-04-01 00:00:00', 'i'); +Warnings: +Note 1265 Data truncated for column 'col_time_key' at row 1 +Note 1265 Data truncated for column 'col_time_key' at row 2 +Note 1265 Data truncated for column 'col_time_key' at row 3 +Note 1265 Data truncated for column 'col_time_key' at row 4 +EXPLAIN SELECT +outr.col_time_key AS x +FROM c as outr +WHERE +outr.col_varchar_nokey in ('c', 'x', 'i') +AND (outr.col_time_key IS NULL OR +outr.col_datetime_key = '2009-09-27'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE outr ALL col_time_key,col_datetime_key NULL NULL NULL 4 x +SELECT +outr.col_time_key AS x +FROM c AS outr +WHERE +outr.col_varchar_nokey in ('c', 'x', 'i') +AND (outr.col_time_key IS NULL OR +outr.col_datetime_key = '2009-09-27'); +x +DROP TABLE c; +# +# Bug#20913803: WL8149: SIG 11 IN DFIELD_DUP | +# INNOBASE/INCLUDE/DATA0DATA.IC:253 +# +CREATE TABLE A ( +col_varchar_nokey TEXT , +col_varchar_key TEXT GENERATED ALWAYS AS (REPEAT(col_varchar_nokey, 1000)), +KEY (col_varchar_key(50)) +); +INSERT INTO A (col_varchar_nokey) VALUES (''); +CREATE TABLE D ( +pk INTEGER AUTO_INCREMENT, +col_date_nokey BLOB, +col_date_key BLOB GENERATED ALWAYS AS (REPEAT(col_date_nokey,1000)) VIRTUAL, +col_datetime_nokey LONGBLOB, +col_time_nokey LONGTEXT, +col_datetime_key LONGBLOB GENERATED ALWAYS AS (REPEAT(col_datetime_nokey, 1000)), +col_time_key LONGTEXT GENERATED ALWAYS AS (REPEAT(col_datetime_nokey, 1000)), +col_varchar_nokey TEXT, +col_varchar_key TEXT GENERATED ALWAYS AS (REPEAT(col_varchar_nokey, 1000)), +PRIMARY KEY (pk), +KEY (col_varchar_key(50)), +KEY (col_date_key(20)), +KEY (col_time_key(20)), +KEY (col_datetime_key(20)), +KEY (col_varchar_key(10), col_date_key(10), col_time_key(5), col_datetime_key(5)) +); +INSERT INTO D ( +col_date_nokey, +col_time_nokey, +col_datetime_nokey, +col_varchar_nokey +) VALUES ('', '', '', ''),('', '', '', ''); +DELETE FROM OUTR1.* USING D AS OUTR1 RIGHT JOIN A AS OUTR2 ON +( OUTR1 . `col_varchar_nokey` = OUTR2 . `col_varchar_nokey` ); +DROP TABLE IF EXISTS A,D; +# +# Bug#21024896: SIG 11 INNOBASE_ADD_ONE_VIRTUAL | +# INNOBASE/HANDLER/HANDLER0ALTER.CC +# +CREATE TABLE t1 ( +col1 int(11) DEFAULT NULL, +col2 int(11) DEFAULT NULL, +col3 int(11) NOT NULL, +col4 int(11) DEFAULT NULL, +col5 int(11) GENERATED ALWAYS AS (col2 / col2) VIRTUAL, +col7 int(11) GENERATED ALWAYS AS (col5 + col5) VIRTUAL, +col8 int(11) GENERATED ALWAYS AS (col5 * col5) VIRTUAL, +col9 text, +col6 int(11) DEFAULT NULL, +PRIMARY KEY (`col3`), +UNIQUE KEY uidx (`col2`), +KEY idx (`col5`) +); +INSERT INTO t1(col1,col2,col3,col4,col9,col6) +VALUES(1,1,0,1,REPEAT(col1,1000),0), (3,2,1,1,REPEAT(col1,1000),NULL); +ALTER TABLE t1 ADD COLUMN extra INT; +DROP TABLE t1; +# +# Bug#21316860: WL8149:INNODB: FAILING ASSERTION: +# TEMPL->CLUST_REC_FIELD_NO != ULINT_UNDEFINED +# +CREATE TABLE t1 ( +pk int(11) NOT NULL, +col_int_nokey int(11), +col_int_key int(11) GENERATED ALWAYS AS (col_int_nokey) VIRTUAL, +col_date_nokey date, +col_date_key date GENERATED ALWAYS AS (col_date_nokey) VIRTUAL, +PRIMARY KEY (pk), +UNIQUE KEY col_int_key (col_int_key) +); +ALTER TABLE t1 DROP COLUMN pk; +DROP TABLE t1; +# Remove the impact on PK choose by index on virtual generated column +CREATE TABLE t1 ( +pk int(11) NOT NULL, +col_int_nokey int(11) DEFAULT NULL, +col_int_key int(11) GENERATED ALWAYS AS (col_int_nokey) VIRTUAL, +UNIQUE KEY col_int_key (col_int_key) +); +ALTER TABLE t1 add unique index idx(pk); +DESC t1; +Field Type Null Key Default Extra +pk int(11) NO PRI NULL +col_int_nokey int(11) YES NULL +col_int_key int(11) YES UNI NULL VIRTUAL GENERATED +DROP TABLE t1; +# +# Bug#21320151 WL8149: WRONG RESULT WITH INDEX SCAN +# +CREATE TABLE t1 ( +id INTEGER NOT NULL, +b INTEGER GENERATED ALWAYS AS (id+1) VIRTUAL, +UNIQUE KEY (b) +); +INSERT INTO t1 (id) VALUES (2),(3),(4),(5),(6),(7),(8),(9),(10); +EXPLAIN SELECT b FROM t1 FORCE INDEX(b); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index NULL b 5 NULL 9 Using index +SELECT b FROM t1 FORCE INDEX(b); +b +3 +4 +5 +6 +7 +8 +9 +10 +11 +EXPLAIN SELECT b FROM t1 FORCE INDEX(b) WHERE b BETWEEN 1 AND 5; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range b b 5 NULL 3 Using where; Using index +SELECT b FROM t1 FORCE INDEX(b) WHERE b BETWEEN 1 AND 5; +b +3 +4 +5 +DROP TABLE t1; # Testing data manipulation operations involving FOREIGN KEY # on generated columns can be found in: @@ -297,6 +514,202 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE table2 eq_ref PRIMARY PRIMARY 4 test.table1.pk 1 DROP TABLE t1; # +# Bug#21391781 ASSERT WHEN RUNNING ALTER TABLE ON A TABLE WITH INDEX +# ON VIRTUAL COLUMN +# +CREATE TABLE t1 ( +col1 INTEGER NOT NULL, +col2 INTEGER NOT NULL, +gcol1 INTEGER GENERATED ALWAYS AS (col1 + col2) VIRTUAL, +col3 INTEGER NOT NULL, +col4 INTEGER NOT NULL, +col5 INTEGER DEFAULT NULL, +col6 INTEGER DEFAULT NULL, +col7 INTEGER DEFAULT NULL, +col8 INTEGER DEFAULT NULL, +col9 INTEGER DEFAULT NULL, +col10 INTEGER DEFAULT NULL, +col11 INTEGER DEFAULT NULL, +col12 INTEGER DEFAULT NULL, +col13 INTEGER DEFAULT NULL, +col14 INTEGER DEFAULT NULL, +col15 INTEGER DEFAULT NULL, +col16 INTEGER DEFAULT NULL, +col17 INTEGER DEFAULT NULL, +col18 INTEGER DEFAULT NULL, +col19 INTEGER DEFAULT NULL, +col20 INTEGER DEFAULT NULL, +col21 INTEGER DEFAULT NULL, +col22 INTEGER DEFAULT NULL, +col23 INTEGER DEFAULT NULL, +col24 INTEGER DEFAULT NULL, +col25 INTEGER DEFAULT NULL, +col26 INTEGER DEFAULT NULL, +col27 INTEGER DEFAULT NULL, +col28 INTEGER DEFAULT NULL, +col29 INTEGER DEFAULT NULL, +col30 INTEGER DEFAULT NULL, +col31 INTEGER DEFAULT NULL, +col32 INTEGER DEFAULT NULL, +col33 INTEGER DEFAULT NULL, +col34 INTEGER DEFAULT NULL, +col35 INTEGER DEFAULT NULL, +col36 INTEGER DEFAULT NULL, +col37 INTEGER DEFAULT NULL, +col38 INTEGER DEFAULT NULL, +col39 INTEGER DEFAULT NULL, +col40 INTEGER DEFAULT NULL, +col41 INTEGER DEFAULT NULL, +col42 INTEGER DEFAULT NULL, +col43 INTEGER DEFAULT NULL, +col44 INTEGER DEFAULT NULL, +col45 INTEGER DEFAULT NULL, +col46 INTEGER DEFAULT NULL, +col47 INTEGER DEFAULT NULL, +col48 INTEGER DEFAULT NULL, +col49 INTEGER DEFAULT NULL, +col50 INTEGER DEFAULT NULL, +col51 INTEGER DEFAULT NULL, +col52 INTEGER DEFAULT NULL, +col53 INTEGER DEFAULT NULL, +col54 INTEGER DEFAULT NULL, +col55 INTEGER DEFAULT NULL, +col56 INTEGER DEFAULT NULL, +col57 INTEGER DEFAULT NULL, +col58 INTEGER DEFAULT NULL, +col59 INTEGER DEFAULT NULL, +col60 INTEGER DEFAULT NULL, +col61 INTEGER DEFAULT NULL, +col62 INTEGER DEFAULT NULL, +col63 INTEGER DEFAULT NULL, +col64 INTEGER DEFAULT NULL, +col65 INTEGER DEFAULT NULL, +gcol2 INTEGER GENERATED ALWAYS AS (col3 / col4) VIRTUAL, +KEY idx1 (gcol1) +); +INSERT INTO t1 (col1, col2, col3, col4) +VALUES (1,1,1,1), (2,2,2,2), (3,3,3,3), (4,4,4,4), (5,5,5,5); +ALTER TABLE t1 ADD COLUMN extra INTEGER; +SELECT gcol1 FROM t1 FORCE INDEX(idx1); +gcol1 +2 +4 +6 +8 +10 +DROP TABLE t1; +CREATE TABLE t1 ( +col1 INTEGER NOT NULL, +col2 INTEGER NOT NULL, +gcol1 INTEGER GENERATED ALWAYS AS (col1 + col2) VIRTUAL, +col3 INTEGER NOT NULL, +col4 INTEGER NOT NULL, +col5 INTEGER DEFAULT NULL, +col6 INTEGER DEFAULT NULL, +col7 INTEGER DEFAULT NULL, +col8 INTEGER DEFAULT NULL, +col9 INTEGER DEFAULT NULL, +col10 INTEGER DEFAULT NULL, +col11 INTEGER DEFAULT NULL, +col12 INTEGER DEFAULT NULL, +col13 INTEGER DEFAULT NULL, +col14 INTEGER DEFAULT NULL, +col15 INTEGER DEFAULT NULL, +col16 INTEGER DEFAULT NULL, +col17 INTEGER DEFAULT NULL, +col18 INTEGER DEFAULT NULL, +col19 INTEGER DEFAULT NULL, +col20 INTEGER DEFAULT NULL, +col21 INTEGER DEFAULT NULL, +col22 INTEGER DEFAULT NULL, +col23 INTEGER DEFAULT NULL, +col24 INTEGER DEFAULT NULL, +col25 INTEGER DEFAULT NULL, +col26 INTEGER DEFAULT NULL, +col27 INTEGER DEFAULT NULL, +col28 INTEGER DEFAULT NULL, +col29 INTEGER DEFAULT NULL, +col30 INTEGER DEFAULT NULL, +col31 INTEGER DEFAULT NULL, +col32 INTEGER DEFAULT NULL, +col33 INTEGER DEFAULT NULL, +col34 INTEGER DEFAULT NULL, +col35 INTEGER DEFAULT NULL, +col36 INTEGER DEFAULT NULL, +col37 INTEGER DEFAULT NULL, +col38 INTEGER DEFAULT NULL, +col39 INTEGER DEFAULT NULL, +col40 INTEGER DEFAULT NULL, +col41 INTEGER DEFAULT NULL, +col42 INTEGER DEFAULT NULL, +col43 INTEGER DEFAULT NULL, +col44 INTEGER DEFAULT NULL, +col45 INTEGER DEFAULT NULL, +col46 INTEGER DEFAULT NULL, +col47 INTEGER DEFAULT NULL, +col48 INTEGER DEFAULT NULL, +col49 INTEGER DEFAULT NULL, +col50 INTEGER DEFAULT NULL, +col51 INTEGER DEFAULT NULL, +col52 INTEGER DEFAULT NULL, +col53 INTEGER DEFAULT NULL, +col54 INTEGER DEFAULT NULL, +col55 INTEGER DEFAULT NULL, +col56 INTEGER DEFAULT NULL, +col57 INTEGER DEFAULT NULL, +col58 INTEGER DEFAULT NULL, +col59 INTEGER DEFAULT NULL, +col60 INTEGER DEFAULT NULL, +col61 INTEGER DEFAULT NULL, +col62 INTEGER DEFAULT NULL, +col63 INTEGER DEFAULT NULL, +col64 INTEGER DEFAULT NULL, +col65 INTEGER DEFAULT NULL, +gcol2 INTEGER GENERATED ALWAYS AS (col3 / col4) VIRTUAL, +KEY idx1 (gcol2) +); +INSERT INTO t1 (col1, col2, col3, col4) +VALUES (1,1,1,1), (2,2,2,2), (3,3,3,3), (4,4,4,4), (5,5,5,5); +ALTER TABLE t1 ADD COLUMN extra INTEGER; +SELECT gcol2 FROM t1 FORCE INDEX(idx1); +gcol2 +1 +1 +1 +1 +1 +DROP TABLE t1; +# +# Bug#21628161 CRASH/MEMORY CORRUPTION ADDING INDEXES TO VIRTUAL COLUMN +# +CREATE TABLE t (a INT, +b BOOLEAN GENERATED ALWAYS AS (a+10000) VIRTUAL, +c BLOB GENERATED ALWAYS AS (b=2) VIRTUAL); +INSERT INTO t(a) VALUES (1); +SELECT * FROM t WHERE c = '0'; +a b c +1 127 0 +SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR +ALTER TABLE t ADD UNIQUE INDEX (c(1)); +SELECT * FROM t WHERE c = '0'; +a b c +1 127 0 +DROP TABLE t; +# +# Bug#21688115 VIRTUAL COLUMN COMPUTATION SAVE_IN_FIELD() +# DID NOT RETURN TRUE WITH DIVIDE 0 +# +CREATE TABLE t (a INT, b INT, h VARCHAR(10)); +INSERT INTO t VALUES (12, 3, "ss"); +INSERT INTO t VALUES (13, 4, "ss"); +INSERT INTO t VALUES (14, 0, "ss"); +SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR +ALTER TABLE t ADD c INT GENERATED ALWAYS AS (a/b) VIRTUAL; +CREATE INDEX idx ON t(c); +ERROR 22012: Division by 0 +CALL mtr.add_suppression("\\[Warning\\] InnoDB: Compute virtual column values failed"); +DROP TABLE t; +# # Bug#21770798 OPTIMIZER DOES NOT USE INDEX FOR GENERATED EXPRESSIONS # WITH LOGICAL OPERATORS # @@ -412,6 +825,65 @@ a1 a2 b 0 NULL 1 DROP TABLE t1, t2; # +# +# BUG#21365158 WL8149:ASSERTION `!TABLE || (!TABLE->WRITE_SET +# +CREATE TABLE t1 ( +pk INTEGER AUTO_INCREMENT, +col_int_nokey INTEGER NOT NULL, +col_varchar_nokey VARCHAR(1), +col_varchar_key VARCHAR(2) GENERATED ALWAYS AS +(CONCAT(col_varchar_nokey, col_varchar_nokey)) VIRTUAL, +PRIMARY KEY (pk) +); +INSERT INTO t1 ( col_int_nokey, col_varchar_nokey) +VALUES (4, 'b'),(9, 'o'),(4, 'k'),(5, 'a'),(5, 'f'), +(9, 't'),(3, 'c'),(8, 'c'),(0, 'r'),(98, 'k'); +CREATE TABLE t2 ( +pk INTEGER AUTO_INCREMENT, +col_int_nokey INTEGER NOT NULL, +col_varchar_nokey VARCHAR(1) NOT NULL, +col_varchar_key VARCHAR(2) GENERATED ALWAYS AS +(CONCAT(col_varchar_nokey, col_varchar_nokey)) VIRTUAL, +PRIMARY KEY (pk), +UNIQUE KEY (col_varchar_key) +); +INSERT INTO t2 ( col_int_nokey, col_varchar_nokey) +VALUES (1, 'c'),(8, 'm'),(9, 'd'), (6, 'y'),(1, 't'), +(2, 's'),(4, 'r'); +SELECT +CONCAT( t2.col_varchar_nokey , t2.col_varchar_nokey ) AS f2, +t1.col_varchar_key AS f5 +FROM +t2 LEFT JOIN t1 ON t2.col_int_nokey > t1.col_int_nokey +ORDER BY f2, f5; +f2 f5 +cc rr +dd aa +dd bb +dd cc +dd cc +dd ff +dd kk +dd rr +mm aa +mm bb +mm cc +mm ff +mm kk +mm rr +rr cc +rr rr +ss rr +tt rr +yy aa +yy bb +yy cc +yy ff +yy kk +yy rr +DROP TABLE t1,t2; +# DROP VIEW IF EXISTS v1,v2; DROP TABLE IF EXISTS t1,t2,t3; DROP PROCEDURE IF EXISTS p1; diff --git a/mysql-test/suite/gcol/r/gcol_keys_myisam.result b/mysql-test/suite/gcol/r/gcol_keys_myisam.result index 8cd871162fd..dcbba1f70c1 100644 --- a/mysql-test/suite/gcol/r/gcol_keys_myisam.result +++ b/mysql-test/suite/gcol/r/gcol_keys_myisam.result @@ -303,23 +303,6 @@ col_int_nokey int(11) YES NULL col_int_key int(11) YES UNI NULL VIRTUAL GENERATED DROP TABLE t1; # -# Bug#21346132: WL8149:INNODB: FAILING ASSERTION: -# PRIMARY_KEY_NO == -1 || PRIMARY_KEY_NO == 0 -# -CREATE TABLE t1 ( -col_int_nokey int(11) NOT NULL, -col_int_key int(11) GENERATED ALWAYS AS (col_int_nokey), -col_varchar_nokey varchar(1) NOT NULL, -col_varchar_key varchar(2) GENERATED ALWAYS AS (col_varchar_nokey), -UNIQUE KEY col_int_key (col_int_key), -UNIQUE KEY col_varchar_key (col_varchar_key), -UNIQUE KEY col_int_key_2 (col_int_key,col_varchar_key), -UNIQUE KEY col_varchar_key_2 (col_varchar_key,col_varchar_nokey), -KEY col_int_key_3 (col_int_key,col_int_nokey) -); -ALTER TABLE t1 DROP COLUMN col_varchar_key; -DROP TABLE t1; -# # Bug#21320151 WL8149: WRONG RESULT WITH INDEX SCAN # CREATE TABLE t1 ( diff --git a/mysql-test/suite/gcol/r/gcol_update.result b/mysql-test/suite/gcol/r/gcol_update.result index 380d1c1efef..720ff533bac 100644 --- a/mysql-test/suite/gcol/r/gcol_update.result +++ b/mysql-test/suite/gcol/r/gcol_update.result @@ -1,13 +1,19 @@ -set global innodb_purge_stop_now = 1; +SET @saved_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency; +SET GLOBAL innodb_purge_rseg_truncate_frequency = 1; +connect purge_control,localhost,root; +START TRANSACTION WITH CONSISTENT SNAPSHOT; +connection default; create table t1(f1 int not null, f2 blob not null, f3 blob not null, vchar char(2) as (substr(f3,2,2)) virtual, primary key(f1, f3(5)), index(vchar))engine=innodb; insert into t1(f1,f2,f3) values(1, repeat('a',8000), repeat('b', 9000)); update t1 set f1=5 where f1=1; delete from t1 where f1=5; -set global innodb_purge_run_now=1; -set global innodb_fast_shutdown=0; -set global innodb_purge_stop_now = 1; +connection purge_control; +COMMIT; +InnoDB 0 transactions not purged +START TRANSACTION WITH CONSISTENT SNAPSHOT; +connection default; drop table t1; create table t1(f1 int not null, f2 blob not null, f3 blob not null, vchar char(2) as (substr(f3,2,2)) virtual, @@ -15,9 +21,11 @@ primary key(f1, f3(5)), index(vchar, f3(2)))engine=innodb; insert into t1(f1,f2,f3) values(1, repeat('a',8000), repeat('b', 9000)); update t1 set f1=5 where f1=1; delete from t1 where f1=5; -set global innodb_purge_run_now=1; -set global innodb_fast_shutdown=0; -set global innodb_purge_stop_now = 1; +connection purge_control; +COMMIT; +InnoDB 0 transactions not purged +START TRANSACTION WITH CONSISTENT SNAPSHOT; +connection default; drop table t1; create table t1(f1 int not null, f2 blob not null, f3 blob not null, vchar blob as (f3) virtual, @@ -25,6 +33,10 @@ primary key(f1, f3(5)), index(vchar(3)))engine=innodb; insert into t1(f1,f2,f3) values(1, repeat('a',8000), repeat('b', 9000)); update t1 set f1=5 where f1=1; delete from t1 where f1=5; -set global innodb_purge_run_now=1; -set global innodb_fast_shutdown=0; +connection purge_control; +COMMIT; +InnoDB 0 transactions not purged +disconnect purge_control; +connection default; drop table t1; +SET GLOBAL innodb_purge_rseg_truncate_frequency = @saved_frequency; diff --git a/mysql-test/suite/gcol/r/innodb_virtual_basic.result b/mysql-test/suite/gcol/r/innodb_virtual_basic.result index 7212dbcc16f..bf0ded2b952 100644 --- a/mysql-test/suite/gcol/r/innodb_virtual_basic.result +++ b/mysql-test/suite/gcol/r/innodb_virtual_basic.result @@ -921,90 +921,6 @@ alter table t add unique index (c(39)); replace into t set a = 'a',b =1; replace into t set a = 'a',b =1; drop table t; -CREATE TABLE t (a INT, b INT, h VARCHAR(10)); -INSERT INTO t VALUES (12, 3, "ss"); -INSERT INTO t VALUES (13, 4, "ss"); -INSERT INTO t VALUES (14, 0, "ss"); -alter table t add c INT GENERATED ALWAYS AS(a/b); -create index idx on t(c); -Warnings: -Warning 1365 Division by 0 -DROP TABLE t; -CREATE TABLE t ( -pk INTEGER AUTO_INCREMENT, -col_int_nokey INTEGER /*! NULL */, -col_int INT GENERATED ALWAYS AS (col_int_nokey + col_int_nokey) STORED, -col_int_key INTEGER GENERATED ALWAYS AS (col_int + col_int_nokey) VIRTUAL, -col_date_nokey DATE /*! NULL */, -col_date DATE GENERATED ALWAYS AS (DATE_ADD(col_date_nokey,interval 30 day)) STORED, -col_date_key DATE GENERATED ALWAYS AS (DATE_ADD(col_date,interval 30 day)) VIRTUAL, -col_datetime_nokey DATETIME /*! NULL */, -col_time_nokey TIME /*! NULL */, -col_datetime DATETIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time_nokey)) STORED, -col_time TIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time_nokey)) STORED, -col_datetime_key DATETIME GENERATED ALWAYS AS (ADDTIME(col_datetime, col_time_nokey)) VIRTUAL, -col_time_key TIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time)) VIRTUAL, -col_varchar_nokey VARCHAR(1) /*! NULL */, -col_varchar VARCHAR(2) GENERATED ALWAYS AS (CONCAT(col_varchar_nokey,col_varchar_nokey)) STORED, -col_varchar_key VARCHAR(2) GENERATED ALWAYS AS (CONCAT(col_varchar, 'x')) VIRTUAL, -unique KEY (pk,col_int_key), -KEY(col_int), -KEY(col_date), -KEY(col_datetime), -KEY(col_time), -KEY(col_varchar), -UNIQUE KEY (col_int_key), -KEY (col_time_key), -KEY (col_datetime_key), -UNIQUE KEY (col_int_key, col_varchar_key), -KEY (col_int_key, col_int_nokey), -KEY(col_int_key,col_date_key), -KEY(col_int_key, col_time_key), -KEY(col_int_key, col_datetime_key), -KEY(col_date_key,col_time_key,col_datetime_key), -KEY (col_varchar_key, col_varchar_nokey), -UNIQUE KEY (col_int_key, col_varchar_key, col_date_key, col_time_key, col_datetime_key) -) AUTO_INCREMENT=10 ENGINE=INNODB PARTITION BY KEY(col_int_key) PARTITIONS 3; -ALTER TABLE t DROP COLUMN `pk`; -SHOW CREATE TABLE t; -Table Create Table -t CREATE TABLE `t` ( - `col_int_nokey` int(11) DEFAULT NULL, - `col_int` int(11) GENERATED ALWAYS AS (`col_int_nokey` + `col_int_nokey`) STORED, - `col_int_key` int(11) GENERATED ALWAYS AS (`col_int` + `col_int_nokey`) VIRTUAL, - `col_date_nokey` date DEFAULT NULL, - `col_date` date GENERATED ALWAYS AS (`col_date_nokey` + interval 30 day) STORED, - `col_date_key` date GENERATED ALWAYS AS (`col_date` + interval 30 day) VIRTUAL, - `col_datetime_nokey` datetime DEFAULT NULL, - `col_time_nokey` time DEFAULT NULL, - `col_datetime` datetime GENERATED ALWAYS AS (addtime(`col_datetime_nokey`,`col_time_nokey`)) STORED, - `col_time` time GENERATED ALWAYS AS (addtime(`col_datetime_nokey`,`col_time_nokey`)) STORED, - `col_datetime_key` datetime GENERATED ALWAYS AS (addtime(`col_datetime`,`col_time_nokey`)) VIRTUAL, - `col_time_key` time GENERATED ALWAYS AS (addtime(`col_datetime_nokey`,`col_time`)) VIRTUAL, - `col_varchar_nokey` varchar(1) DEFAULT NULL, - `col_varchar` varchar(2) GENERATED ALWAYS AS (concat(`col_varchar_nokey`,`col_varchar_nokey`)) STORED, - `col_varchar_key` varchar(2) GENERATED ALWAYS AS (concat(`col_varchar`,'x')) VIRTUAL, - UNIQUE KEY `pk` (`col_int_key`), - UNIQUE KEY `col_int_key` (`col_int_key`), - UNIQUE KEY `col_int_key_2` (`col_int_key`,`col_varchar_key`), - UNIQUE KEY `col_int_key_7` (`col_int_key`,`col_varchar_key`,`col_date_key`,`col_time_key`,`col_datetime_key`), - KEY `col_int` (`col_int`), - KEY `col_date` (`col_date`), - KEY `col_datetime` (`col_datetime`), - KEY `col_time` (`col_time`), - KEY `col_varchar` (`col_varchar`), - KEY `col_time_key` (`col_time_key`), - KEY `col_datetime_key` (`col_datetime_key`), - KEY `col_int_key_3` (`col_int_key`,`col_int_nokey`), - KEY `col_int_key_4` (`col_int_key`,`col_date_key`), - KEY `col_int_key_5` (`col_int_key`,`col_time_key`), - KEY `col_int_key_6` (`col_int_key`,`col_datetime_key`), - KEY `col_date_key` (`col_date_key`,`col_time_key`,`col_datetime_key`), - KEY `col_varchar_key` (`col_varchar_key`,`col_varchar_nokey`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (col_int_key) -PARTITIONS 3 -DROP TABLE t; CREATE TABLE t (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10)); INSERT INTO t VALUES (11, 3, DEFAULT, 'mm'); INSERT INTO t VALUES (18, 1, DEFAULT, 'mm'); diff --git a/mysql-test/suite/gcol/r/innodb_virtual_debug_purge.result b/mysql-test/suite/gcol/r/innodb_virtual_debug_purge.result index e2d9be445da..7d1d1d30198 100644 --- a/mysql-test/suite/gcol/r/innodb_virtual_debug_purge.result +++ b/mysql-test/suite/gcol/r/innodb_virtual_debug_purge.result @@ -1,5 +1,7 @@ set default_storage_engine=innodb; set @old_dbug=@@global.debug_dbug; +SET @saved_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency; +SET GLOBAL innodb_purge_rseg_truncate_frequency = 1; CREATE TABLE `t` ( `a` BLOB, `b` BLOB, @@ -12,9 +14,7 @@ INSERT INTO t VALUES (REPEAT('a', 16000), REPEAT('b', 16000), DEFAULT, "mm", 2); CREATE INDEX idx ON t(c(100)); SET global debug_dbug="+d,ib_purge_virtual_index_callback"; UPDATE t SET a = REPEAT('m', 16000) WHERE a like "aaa%"; -select sleep(3); -sleep(3) -0 +InnoDB 0 transactions not purged SET global debug_dbug=@old_dbug; DROP TABLE t; CREATE TABLE t ( @@ -29,9 +29,7 @@ INSERT INTO t VALUES (REPEAT('a', 100), REPEAT('b', 100), DEFAULT, "mm", 2); CREATE INDEX idx ON t(c(100)); SET global debug_dbug="+d,ib_purge_virtual_index_callback"; UPDATE t SET a = REPEAT('m', 100) WHERE a like "aaa%"; -select sleep(3); -sleep(3) -0 +InnoDB 0 transactions not purged SET global debug_dbug=@old_dbug; DROP TABLE t; CREATE TABLE t1 ( @@ -52,9 +50,7 @@ insert into t1 values(4, 18, default); CREATE INDEX idx ON t1(x); SET global debug_dbug="+d,ib_purge_virtual_index_callback"; UPDATE t1 SET id = 10 WHERE id = 1; -select sleep(3); -sleep(3) -0 +InnoDB 0 transactions not purged SET global debug_dbug=@old_dbug; DROP TABLE t1; connect con1,localhost,root,,; @@ -80,7 +76,7 @@ SET DEBUG_SYNC= 'now WAIT_FOR uncommitted'; # enable purge COMMIT; # wait for purge to process the deleted records. -Timeout in wait_innodb_all_purged.inc for INNODB_PURGE_TRX_ID_AGE = 4 +InnoDB 0 transactions not purged SET DEBUG_SYNC= 'now SIGNAL purged'; connection default; /* connection default */ ALTER TABLE t1 ADD COLUMN c INT GENERATED ALWAYS AS(a+b), ADD INDEX idx (c), ALGORITHM=INPLACE, LOCK=SHARED; @@ -119,6 +115,7 @@ INSERT INTO t1(a, b) VALUES (8, 8); # enable purge COMMIT; # wait for purge to process the deleted/updated records. +InnoDB 1 transactions not purged SET DEBUG_SYNC= 'now SIGNAL purged'; disconnect con1; connection default; @@ -141,20 +138,26 @@ DROP TABLE t0, t1; create table t (a blob, b blob, c blob as (concat(a,b)), h varchar(10), index (c(100))); insert t(a,b,h) values (repeat('g', 16000), repeat('x', 16000), "kk"); insert t(a,b,h) values (repeat('a', 16000), repeat('b', 16000), "mm"); -set global innodb_purge_stop_now = 1; set global debug_dbug="+d,ib_purge_virtual_index_callback"; +connect prevent_purge, localhost, root; +start transaction with consistent snapshot; +connection default; update t set a = repeat('m', 16000) where a like "aaa%"; connect con1, localhost, root; lock table t write; +disconnect prevent_purge; connection default; -set global innodb_purge_run_now=1; select variable_value>1 from information_schema.global_status where variable_name='innodb_purge_trx_id_age'; variable_value>1 1 disconnect con1; +start transaction with consistent snapshot; +commit; +InnoDB 0 transactions not purged select variable_value>1 from information_schema.global_status where variable_name='innodb_purge_trx_id_age'; variable_value>1 0 set global debug_dbug=@old_dbug; drop table t; set debug_sync=reset; +SET GLOBAL innodb_purge_rseg_truncate_frequency = @saved_frequency; diff --git a/mysql-test/suite/gcol/r/innodb_virtual_purge.result b/mysql-test/suite/gcol/r/innodb_virtual_purge.result index 658f49b4b31..308b01ded25 100644 --- a/mysql-test/suite/gcol/r/innodb_virtual_purge.result +++ b/mysql-test/suite/gcol/r/innodb_virtual_purge.result @@ -1,3 +1,5 @@ +SET @saved_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency; +SET GLOBAL innodb_purge_rseg_truncate_frequency = 1; # # Bug#21869656 UNDO LOG DOES NOT CONTAIN ENOUGH INFORMATION # ON INDEXED VIRTUAL COLUMNS @@ -21,6 +23,7 @@ connection con1; COMMIT; UPDATE t1 SET a=1; connection default; +InnoDB 0 transactions not purged CHECK TABLE t1; Table Op Msg_type Msg_text test.t1 check status OK @@ -119,6 +122,7 @@ connection con1; COMMIT; disconnect con1; connection default; +InnoDB 0 transactions not purged CHECK TABLE t1; Table Op Msg_type Msg_text test.t1 check status OK @@ -138,3 +142,4 @@ CREATE TABLE t1 (a VARCHAR(30), b INT, a2 VARCHAR(30) GENERATED ALWAYS AS (a) VI CREATE INDEX idx ON t1(a2(10), b, a2(20)); ERROR 42S21: Duplicate column name 'a2' DROP TABLE t1; +SET GLOBAL innodb_purge_rseg_truncate_frequency = @saved_frequency; diff --git a/mysql-test/suite/gcol/t/gcol_bugfixes.test b/mysql-test/suite/gcol/t/gcol_bugfixes.test index 4acae77e830..5563347a02a 100644 --- a/mysql-test/suite/gcol/t/gcol_bugfixes.test +++ b/mysql-test/suite/gcol/t/gcol_bugfixes.test @@ -537,6 +537,19 @@ SELECT 1 FROM t WHERE c GROUP BY b; COMMIT; DROP TABLE t; +--echo # +--echo # Bug #25793677 INNODB: FAILING ASSERTION: CLUST_TEMPL_FOR_SEC || LEN .... +--echo # + +CREATE TABLE v ( +a INT, +c INT, +b CHAR(2) GENERATED ALWAYS AS (a IN (1)) VIRTUAL, +KEY(c,b(1))) charset utf8mb4; +INSERT INTO v (a,c) VALUES (1,1); +SELECT (SELECT MAX(c) FROM v); +DROP TABLE v; + --echo # --echo # MDEV-9255 Add generation_expression to information_schema.columns. --echo # diff --git a/mysql-test/suite/gcol/t/gcol_keys_innodb.test b/mysql-test/suite/gcol/t/gcol_keys_innodb.test index 3fe1ee4ff61..7f7c4503108 100644 --- a/mysql-test/suite/gcol/t/gcol_keys_innodb.test +++ b/mysql-test/suite/gcol/t/gcol_keys_innodb.test @@ -37,7 +37,7 @@ eval SET @@session.default_storage_engine = 'InnoDB'; #------------------------------------------------------------------------------# # Execute the tests to be applied to all storage engines let $skip_spatial_index_check = 1; -let $support_virtual_index= 0; +let $support_virtual_index= 1; --source suite/gcol/inc/gcol_keys.inc if ($support_virtual_index) { diff --git a/mysql-test/suite/gcol/t/gcol_rollback.test b/mysql-test/suite/gcol/t/gcol_rollback.test index 4cd1fcc46ac..ba88dda45d7 100644 --- a/mysql-test/suite/gcol/t/gcol_rollback.test +++ b/mysql-test/suite/gcol/t/gcol_rollback.test @@ -6,6 +6,11 @@ # Save the initial number of concurrent sessions. --source include/count_sessions.inc +# Make sure there are no unexpected open tables from previous tests +--disable_query_log +FLUSH TABLES; +--enable_query_log + CREATE TABLE t ( a INTEGER, b BLOB GENERATED ALWAYS AS (a) VIRTUAL, diff --git a/mysql-test/suite/gcol/t/gcol_update.test b/mysql-test/suite/gcol/t/gcol_update.test index 0a7265bebac..8652ce7a638 100644 --- a/mysql-test/suite/gcol/t/gcol_update.test +++ b/mysql-test/suite/gcol/t/gcol_update.test @@ -1,9 +1,12 @@ ---source include/have_debug.inc --source include/have_innodb.inc -# The embedded server does not support restarting. ---source include/not_embedded.inc -set global innodb_purge_stop_now = 1; +SET @saved_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency; +SET GLOBAL innodb_purge_rseg_truncate_frequency = 1; + +connect (purge_control,localhost,root); +START TRANSACTION WITH CONSISTENT SNAPSHOT; + +connection default; # Index on virtual column @@ -16,10 +19,12 @@ insert into t1(f1,f2,f3) values(1, repeat('a',8000), repeat('b', 9000)); update t1 set f1=5 where f1=1; delete from t1 where f1=5; -set global innodb_purge_run_now=1; -set global innodb_fast_shutdown=0; ---source include/restart_mysqld.inc -set global innodb_purge_stop_now = 1; +connection purge_control; +COMMIT; +--source ../../innodb/include/wait_all_purged.inc +START TRANSACTION WITH CONSISTENT SNAPSHOT; +connection default; + drop table t1; # Index on virtual column and blob @@ -33,10 +38,11 @@ insert into t1(f1,f2,f3) values(1, repeat('a',8000), repeat('b', 9000)); update t1 set f1=5 where f1=1; delete from t1 where f1=5; -set global innodb_purge_run_now=1; -set global innodb_fast_shutdown=0; ---source include/restart_mysqld.inc -set global innodb_purge_stop_now = 1; +connection purge_control; +COMMIT; +--source ../../innodb/include/wait_all_purged.inc +START TRANSACTION WITH CONSISTENT SNAPSHOT; +connection default; drop table t1; # Index on virtual column of blob type @@ -50,7 +56,12 @@ insert into t1(f1,f2,f3) values(1, repeat('a',8000), repeat('b', 9000)); update t1 set f1=5 where f1=1; delete from t1 where f1=5; -set global innodb_purge_run_now=1; -set global innodb_fast_shutdown=0; ---source include/restart_mysqld.inc +connection purge_control; +COMMIT; +--source ../../innodb/include/wait_all_purged.inc +disconnect purge_control; + +connection default; drop table t1; + +SET GLOBAL innodb_purge_rseg_truncate_frequency = @saved_frequency; diff --git a/mysql-test/suite/gcol/t/innodb_virtual_basic.test b/mysql-test/suite/gcol/t/innodb_virtual_basic.test index 4f88fb7f8f6..4fd8360eb26 100644 --- a/mysql-test/suite/gcol/t/innodb_virtual_basic.test +++ b/mysql-test/suite/gcol/t/innodb_virtual_basic.test @@ -772,58 +772,7 @@ replace into t set a = 'a',b =1; replace into t set a = 'a',b =1; drop table t; -CREATE TABLE t (a INT, b INT, h VARCHAR(10)); -INSERT INTO t VALUES (12, 3, "ss"); -INSERT INTO t VALUES (13, 4, "ss"); -INSERT INTO t VALUES (14, 0, "ss"); -alter table t add c INT GENERATED ALWAYS AS(a/b); -create index idx on t(c); -DROP TABLE t; - -CREATE TABLE t ( - pk INTEGER AUTO_INCREMENT, - col_int_nokey INTEGER /*! NULL */, - col_int INT GENERATED ALWAYS AS (col_int_nokey + col_int_nokey) STORED, - col_int_key INTEGER GENERATED ALWAYS AS (col_int + col_int_nokey) VIRTUAL, - col_date_nokey DATE /*! NULL */, - col_date DATE GENERATED ALWAYS AS (DATE_ADD(col_date_nokey,interval 30 day)) STORED, - col_date_key DATE GENERATED ALWAYS AS (DATE_ADD(col_date,interval 30 day)) VIRTUAL, - col_datetime_nokey DATETIME /*! NULL */, - col_time_nokey TIME /*! NULL */, - col_datetime DATETIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time_nokey)) STORED, - col_time TIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time_nokey)) STORED, - col_datetime_key DATETIME GENERATED ALWAYS AS (ADDTIME(col_datetime, col_time_nokey)) VIRTUAL, - col_time_key TIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time)) VIRTUAL, - col_varchar_nokey VARCHAR(1) /*! NULL */, - col_varchar VARCHAR(2) GENERATED ALWAYS AS (CONCAT(col_varchar_nokey,col_varchar_nokey)) STORED, - col_varchar_key VARCHAR(2) GENERATED ALWAYS AS (CONCAT(col_varchar, 'x')) VIRTUAL, - unique KEY (pk,col_int_key), - KEY(col_int), - KEY(col_date), - KEY(col_datetime), - KEY(col_time), - KEY(col_varchar), - UNIQUE KEY (col_int_key), - KEY (col_time_key), - KEY (col_datetime_key), - UNIQUE KEY (col_int_key, col_varchar_key), - KEY (col_int_key, col_int_nokey), - KEY(col_int_key,col_date_key), - KEY(col_int_key, col_time_key), - KEY(col_int_key, col_datetime_key), - KEY(col_date_key,col_time_key,col_datetime_key), - KEY (col_varchar_key, col_varchar_nokey), - UNIQUE KEY (col_int_key, col_varchar_key, col_date_key, col_time_key, col_datetime_key) -) AUTO_INCREMENT=10 ENGINE=INNODB PARTITION BY KEY(col_int_key) PARTITIONS 3; - -ALTER TABLE t DROP COLUMN `pk`; - -SHOW CREATE TABLE t; - -DROP TABLE t; - CREATE TABLE t (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10)); - INSERT INTO t VALUES (11, 3, DEFAULT, 'mm'); INSERT INTO t VALUES (18, 1, DEFAULT, 'mm'); INSERT INTO t VALUES (28, 1, DEFAULT, 'mm'); diff --git a/mysql-test/suite/gcol/t/innodb_virtual_debug_purge.test b/mysql-test/suite/gcol/t/innodb_virtual_debug_purge.test index 1e6cd44d0aa..2668e26c976 100644 --- a/mysql-test/suite/gcol/t/innodb_virtual_debug_purge.test +++ b/mysql-test/suite/gcol/t/innodb_virtual_debug_purge.test @@ -5,6 +5,9 @@ set default_storage_engine=innodb; set @old_dbug=@@global.debug_dbug; +# Ensure that the history list length will actually be decremented by purge. +SET @saved_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency; +SET GLOBAL innodb_purge_rseg_truncate_frequency = 1; CREATE TABLE `t` ( `a` BLOB, @@ -21,11 +24,10 @@ CREATE INDEX idx ON t(c(100)); SET global debug_dbug="+d,ib_purge_virtual_index_callback"; UPDATE t SET a = REPEAT('m', 16000) WHERE a like "aaa%"; -select sleep(3); +--source ../../innodb/include/wait_all_purged.inc SET global debug_dbug=@old_dbug; DROP TABLE t; - CREATE TABLE t ( a TINYBLOB, b TINYBLOB, @@ -41,7 +43,7 @@ CREATE INDEX idx ON t(c(100)); SET global debug_dbug="+d,ib_purge_virtual_index_callback"; UPDATE t SET a = REPEAT('m', 100) WHERE a like "aaa%"; -select sleep(3); +--source ../../innodb/include/wait_all_purged.inc SET global debug_dbug=@old_dbug; DROP TABLE t; @@ -68,7 +70,7 @@ CREATE INDEX idx ON t1(x); SET global debug_dbug="+d,ib_purge_virtual_index_callback"; UPDATE t1 SET id = 10 WHERE id = 1; -select sleep(3); +--source ../../innodb/include/wait_all_purged.inc SET global debug_dbug=@old_dbug; DROP TABLE t1; @@ -109,7 +111,7 @@ SET DEBUG_SYNC= 'now WAIT_FOR uncommitted'; COMMIT; --echo # wait for purge to process the deleted records. ---source include/wait_innodb_all_purged.inc +--source ../../innodb/include/wait_all_purged.inc SET DEBUG_SYNC= 'now SIGNAL purged'; @@ -154,7 +156,7 @@ INSERT INTO t1(a, b) VALUES (8, 8); COMMIT; --echo # wait for purge to process the deleted/updated records. ---source include/wait_innodb_all_purged.inc +--source ../../innodb/include/wait_all_purged.inc SET DEBUG_SYNC= 'now SIGNAL purged'; @@ -175,20 +177,24 @@ DROP TABLE t0, t1; create table t (a blob, b blob, c blob as (concat(a,b)), h varchar(10), index (c(100))); insert t(a,b,h) values (repeat('g', 16000), repeat('x', 16000), "kk"); insert t(a,b,h) values (repeat('a', 16000), repeat('b', 16000), "mm"); -set global innodb_purge_stop_now = 1; set global debug_dbug="+d,ib_purge_virtual_index_callback"; +connect(prevent_purge, localhost, root); +start transaction with consistent snapshot; +connection default; update t set a = repeat('m', 16000) where a like "aaa%"; connect(con1, localhost, root); lock table t write; +disconnect prevent_purge; connection default; -set global innodb_purge_run_now=1; -sleep 3; select variable_value>1 from information_schema.global_status where variable_name='innodb_purge_trx_id_age'; disconnect con1; -sleep 3; +start transaction with consistent snapshot; +commit; +--source ../../innodb/include/wait_all_purged.inc select variable_value>1 from information_schema.global_status where variable_name='innodb_purge_trx_id_age'; set global debug_dbug=@old_dbug; drop table t; --source include/wait_until_count_sessions.inc set debug_sync=reset; +SET GLOBAL innodb_purge_rseg_truncate_frequency = @saved_frequency; diff --git a/mysql-test/suite/gcol/t/innodb_virtual_purge.test b/mysql-test/suite/gcol/t/innodb_virtual_purge.test index ab6ba52c2c3..4eb5d8c65b8 100644 --- a/mysql-test/suite/gcol/t/innodb_virtual_purge.test +++ b/mysql-test/suite/gcol/t/innodb_virtual_purge.test @@ -1,6 +1,10 @@ --source include/have_innodb.inc --source include/count_sessions.inc +# Ensure that the history list length will actually be decremented by purge. +SET @saved_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency; +SET GLOBAL innodb_purge_rseg_truncate_frequency = 1; + --echo # --echo # Bug#21869656 UNDO LOG DOES NOT CONTAIN ENOUGH INFORMATION --echo # ON INDEXED VIRTUAL COLUMNS @@ -32,8 +36,7 @@ COMMIT; UPDATE t1 SET a=1; connection default; -# wait for purge to process the update_undo record (in debug builds) ---source include/wait_innodb_all_purged.inc +--source ../../innodb/include/wait_all_purged.inc CHECK TABLE t1; SELECT b1 FROM t1; @@ -118,8 +121,7 @@ COMMIT; disconnect con1; connection default; -# wait for purge to process the update_undo record (in debug builds) ---source include/wait_innodb_all_purged.inc +--source ../../innodb/include/wait_all_purged.inc CHECK TABLE t1; SELECT b1 FROM t1; @@ -136,3 +138,4 @@ CREATE INDEX idx ON t1(a2(10), b, a2(20)); DROP TABLE t1; --source include/wait_until_count_sessions.inc +SET GLOBAL innodb_purge_rseg_truncate_frequency = @saved_frequency; diff --git a/mysql-test/suite/innodb/disabled.def b/mysql-test/suite/innodb/disabled.def index 631f01a8e65..9a92e99df2e 100644 --- a/mysql-test/suite/innodb/disabled.def +++ b/mysql-test/suite/innodb/disabled.def @@ -10,5 +10,14 @@ # ############################################################################## -innodb_defragment_fill_factor : MDEV-10771 -innodb_bug14147491 : MDEV-12253 ut_ad(buf_pool->n_pend_reads > 0) +innodb_defragment_fill_factor : MDEV-11336 Fix and enable innodb_defragment +innodb.defrag_mdl-9155 : MDEV-11336 Fix and enable innodb_defragment +innodb.innodb_defrag_concurrent : MDEV-11336 Fix and enable innodb_defragment +innodb.innodb_defrag_stats : MDEV-11336 Fix and enable innodb_defragment +innodb.innodb_defrag_stats_many_tables : MDEV-11336 Fix and enable innodb_defragment +innodb.innodb_defragment : MDEV-11336 Fix and enable innodb_defragment +innodb.innodb_defragment_fill_factor : MDEV-11336 Fix and enable innodb_defragment +innodb.innodb_defragment_small : MDEV-11336 Fix and enable innodb_defragment +innodb.innodb_defrag_binlog : MDEV-11336 Fix and enable innodb_defragment +innodb-wl5980-alter : MDEV-9469 / MDEV-13668 extra crash in 10.2 +create-index-debug : MDEV-13680 InnoDB may crash when btr_page_alloc() fails diff --git a/mysql-test/suite/innodb/include/alter_table_pk_no_sort.inc b/mysql-test/suite/innodb/include/alter_table_pk_no_sort.inc new file mode 100644 index 00000000000..6a2fcd15be0 --- /dev/null +++ b/mysql-test/suite/innodb/include/alter_table_pk_no_sort.inc @@ -0,0 +1,265 @@ +# skip sort for prefix change +# pk(o1(2)) to pk(o1(3)) +create table t1(o1 varchar(10), primary key(o1(2))) engine = innodb; +insert into t1 values('abd'), ('acd'); +alter table t1 drop primary key, add primary key(o1(3)), lock=none; +drop table t1; + +# pk(o1(2)) to pk(o1) +create table t1(o1 varchar(10), primary key(o1(2))) engine = innodb; +insert into t1 values('abd'), ('acd'); +alter table t1 drop primary key, add primary key(o1), lock=none; +drop table t1; + +# pk(o1(2)) to pk(o1(3),n1) +create table t1(o1 varchar(10), primary key(o1(2))) engine = innodb; +insert into t1 values('abd'), ('acd'); +alter table t1 add n1 int not null, drop primary key, add primary key(o1(3), n1), lock=none; +drop table t1; + +# pk(o1(2)) to pk(o1,n1) +create table t1(o1 varchar(10), primary key(o1(2))) engine = innodb; +insert into t1 values('abd'), ('acd'); +alter table t1 add n1 int not null, drop primary key, add primary key(o1, n1), lock=none; +drop table t1; + +# pk(o1(2)) to pk(o1(3), o2) +create table t1(o1 varchar(10), o2 int not null, primary key(o1(2))) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1(3), o2), lock=none; +drop table t1; + +# pk(o1(2)) to pk(o1, o2) +create table t1(o1 varchar(10), o2 int not null, primary key(o1(2))) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1, o2), lock=none; +drop table t1; + +# pk(o1(3)) to pk(o1(2)) +create table t1(o1 varchar(10), primary key(o1(3))) engine = innodb; +insert into t1 values('abd'), ('acd'); +alter table t1 drop primary key, add primary key(o1(2)), lock=none; +drop table t1; + +# pk(o1) to pk(o1(2)) +create table t1(o1 varchar(10), primary key(o1)) engine = innodb; +insert into t1 values('abd'), ('acd'); +alter table t1 drop primary key, add primary key(o1(2)), lock=none; +drop table t1; + +# pk(o1(3),o2) to pk(o1(2)) +create table t1(o1 varchar(10), o2 int, primary key(o1(3), o2)) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 drop primary key, add primary key(o1(2)), lock=none; +drop table t1; + +# pk(o1,o2) to pk(o1(2)) +create table t1(o1 varchar(10), o2 int, primary key(o1, o2)) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 drop primary key, add primary key(o1(2)), lock=none; +drop table t1; + +# pk(o1(3),o2) to pk(o1(2),n1) +create table t1(o1 varchar(10), o2 int, primary key(o1(3), o2)) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1(2),n1), lock=none; +drop table t1; + +# pk(o1,o2) to pk(o1(2),n1) +create table t1(o1 varchar(10), o2 int, primary key(o1, o2)) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1(2),n1), lock=none; +drop table t1; + +# pk(o1(3),o2) to pk(o1(3),n1) +create table t1(o1 varchar(10), o2 int, primary key(o1(3), o2)) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1(3),n1), lock=none; +drop table t1; + +# pk(o1,o2) to pk(o1,n1) +create table t1(o1 varchar(10), o2 int, primary key(o1, o2)) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1,n1), lock=none; +drop table t1; + +# pk(o1,o2(3)) to pk(o1,o2(2)) +create table t1(o1 int, o2 varchar(10), primary key(o1,o2(3))) engine = innodb; +insert into t1 values(1,'abd'), (2,'acd'); +alter table t1 drop primary key, add primary key(o1,o2(2)), lock=none; +drop table t1; + +# pk(o1,o2) to pk(o1,o2(2)) +create table t1(o1 int, o2 varchar(10), primary key(o1,o2)) engine = innodb; +insert into t1 values(1,'abd'), (2,'acd'); +alter table t1 drop primary key, add primary key(o1,o2(2)), lock=none; +drop table t1; + +# pk(o1,o2(2)) to pk(o1,o2(3)) +create table t1(o1 int, o2 varchar(10), primary key(o1,o2(2))) engine = innodb; +insert into t1 values(1, 'abd'), (2, 'acd'); +alter table t1 drop primary key, add primary key(o1,o2(3)), lock=none; +drop table t1; + +# pk(o1,o2(2)) to pk(o1,o2) +create table t1(o1 int, o2 varchar(10), primary key(o1,o2(2))) engine = innodb; +insert into t1 values(1, 'abd'), (2, 'acd'); +alter table t1 drop primary key, add primary key(o1,o2), lock=none; +drop table t1; + +# pk(o1,o2(3),o3) to pk(o1,o2(2)) +create table t1(o1 int, o2 varchar(10), o3 int, primary key(o1,o2(3),o3)) engine = innodb; +insert into t1 values(1, 'abd', 1), (2, 'acd', 2); +alter table t1 drop primary key, add primary key(o1,o2(2)), lock=none; +drop table t1; + +# pk(o1,o2,o3) to pk(o1,o2(2)) +create table t1(o1 int, o2 varchar(10), o3 int, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1, 'abd', 1), (2, 'acd', 2); +alter table t1 drop primary key, add primary key(o1,o2(2)), lock=none; +drop table t1; + +# pk(o1(3),o2(3)) to pk(o1(3),o2(2)) +create table t1(o1 varchar(10), o2 varchar(10), primary key(o1(3),o2(3))) engine = innodb; +insert into t1 values('abd', 'acd'), ('acd', 'abd'); +alter table t1 drop primary key, add primary key(o1(3),o2(2)), lock=none; +drop table t1; + +# pk(o1,o2) to pk(o1,o2(2)) +create table t1(o1 varchar(10), o2 varchar(10), primary key(o1,o2)) engine = innodb; +insert into t1 values('abd', 'acd'), ('acd', 'abd'); +alter table t1 drop primary key, add primary key(o1,o2(2)), lock=none; +drop table t1; + +# pk(o1(3),o2(2)) to pk(o1(3),o2(3)) +create table t1(o1 varchar(10), o2 varchar(10), primary key(o1(3),o2(2))) engine = innodb; +insert into t1 values('abd', 'acd'), ('acd', 'abd'); +alter table t1 drop primary key, add primary key(o1(3),o2(3)), lock=none; +drop table t1; + +# pk(o1,o2(2)) to pk(o1,o2) +create table t1(o1 varchar(10), o2 varchar(10), primary key(o1,o2(2))) engine = innodb; +insert into t1 values('abd', 'acd'), ('acd', 'abd'); +alter table t1 drop primary key, add primary key(o1,o2), lock=none; +drop table t1; + +# pk(o1(3),o2,o3(2)) to pk(o1(3),o2,o3(3)) +create table t1(o1 varchar(10), o2 int, o3 varchar(10), primary key(o1(3),o2,o3(2))) engine = innodb; +insert into t1 values('abd', 1, 'acd'), ('acd', 2, 'abd'); +alter table t1 drop primary key, add primary key(o1(3),o2,o3(3)), lock=none; +drop table t1; + +# pk(o1,o2,o3(2)) to pk(o1,o2,o3) +create table t1(o1 varchar(10), o2 int, o3 varchar(10), primary key(o1,o2,o3(2))) engine = innodb; +insert into t1 values('abd', 1, 'acd'), ('acd', 2, 'abd'); +alter table t1 drop primary key, add primary key(o1,o2,o3), lock=none; +drop table t1; + +# pk(o1(3),o2,o3(3)) to pk(o1(3),o2,o3(2)) +create table t1(o1 varchar(10), o2 int, o3 varchar(10), primary key(o1(3),o2,o3(3))) engine = innodb; +insert into t1 values('abd', 1, 'acd'), ('acd', 2, 'abd'); +alter table t1 drop primary key, add primary key(o1(3),o2,o3(2)), lock=none; +drop table t1; + +# pk(o1,o2,o3) to pk(o1,o2,o3(2)) +create table t1(o1 varchar(10), o2 int, o3 varchar(10), primary key(o1,o2,o3(3))) engine = innodb; +insert into t1 values('abd', 1, 'acd'), ('acd', 2, 'abd'); +alter table t1 drop primary key, add primary key(o1,o2,o3(2)), lock=none; +drop table t1; + +# skip sort for adding existing columns/newly added columns, dropping pk columns at the end. +# pk(o1) to pk(o1,o2) +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 drop primary key, add primary key(o1,o2), lock=none; +drop table t1; + +# pk(o1) to pk(o1,n1) +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1,n1), lock=none; +drop table t1; + +# pk(o1) to pk(n1,o1) +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, drop primary key, add primary key(n1,o1), lock=none; +drop table t1; + +# pk(o1) to pk(n1,o1,n2) +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, add n2 int not null, drop primary key, add primary key(n1,o1,n2), lock=none; +drop table t1; + +# pk(o1) to pk(n1,n2,o1) +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, add n2 int not null, drop primary key, add primary key(n1,n2,o1), lock=none; +drop table t1; + +# pk(o1) to pk(o1,n1,n2) +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, add n2 int not null, drop primary key, add primary key(o1,n1,n2), lock=none; +drop table t1; + +# pk(o1) to pk(o1,o2,n1) +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1,o2,n1), lock=none; +drop table t1; + +# pk(o1) to pk(o1,n1,o2) +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1,n1,o2), lock=none; +drop table t1; + +# pk(o1) to pk(n1,o1,o2) +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, drop primary key, add primary key(n1,o1,o2), lock=none; +drop table t1; + +# pk(o1) to pk(o1,o2,o3) +create table t1(o1 int, o2 int not null, o3 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1,2),(2,2,1); +alter table t1 drop primary key, add primary key(o1,o2,o3), lock=none; +drop table t1; + +# pk(o1) to pk(o1,o3,o2) +create table t1(o1 int, o2 int not null, o3 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1,2),(2,2,1); +alter table t1 drop primary key, add primary key(o1,o3,o2), lock=none; +drop table t1; + +# pk(o1,o2,o3) to pk(o1,o2) +create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1,1,2),(2,2,1); +alter table t1 drop primary key, add primary key(o1,o2), lock=none; +drop table t1; + +# pk(o1,o2,o3) to pk(o1,o2,o3,o4) +create table t1(o1 int, o2 int, o3 int, o4 int not null, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1,1,2,2),(2,2,1,1); +alter table t1 add n1 int not null, drop primary key, add primary key(o1,o2,o3,o4), lock=none; +drop table t1; + +# pk(o1,o2,o3) to pk(o1,o2,n1) +create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1,1,2),(2,2,1); +alter table t1 add n1 int not null, drop primary key, add primary key(o1,o2,n1), lock=none; +drop table t1; + +# pk(o1,o2,o3) to pk(o1,n1,o2) +create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1,1,2),(2,2,1); +alter table t1 add n1 int not null, drop primary key, add primary key(o1,n1,o2), lock=none; +drop table t1; + +# pk(o1,o2,o3) to pk(o1) +create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1,1,2),(2,2,1); +alter table t1 drop primary key, add primary key(o1), lock=none; +drop table t1; diff --git a/mysql-test/suite/innodb/include/ibd_convert.pl b/mysql-test/suite/innodb/include/ibd_convert.pl index 9c7e829f455..bb9dfbe74b8 100644 --- a/mysql-test/suite/innodb/include/ibd_convert.pl +++ b/mysql-test/suite/innodb/include/ibd_convert.pl @@ -11,7 +11,7 @@ sub convert_to_mariadb_101 # FIL_PAGE_DATA + FSP_SPACE_FLAGS = 38 + 16 = 54 bytes from the start my($flags) = unpack "x[54]N", $_; my $badflags = ($flags & 0x3f); - my $compression_level=6; + my $compression_level=3; $badflags |= 1<<6|$compression_level<<7 if ($flags & 1 << 16); $badflags |= ($flags & 15 << 6) << 7; # PAGE_SSIZE diff --git a/mysql-test/suite/innodb/include/import.inc b/mysql-test/suite/innodb/include/import.inc new file mode 100644 index 00000000000..e8265cb3db6 --- /dev/null +++ b/mysql-test/suite/innodb/include/import.inc @@ -0,0 +1,40 @@ +# Export Table and Import from saved files .cfg and .ibd +# Caller should create t1 table definition and populate table + +let $MYSQLD_DATADIR = `SELECT @@datadir`; + +if(!$source_db) { + let $source_db = test; +} + +if(!$dest_db) { + let $dest_db = test; +} + +eval FLUSH TABLES $source_db.t1 FOR EXPORT; + +--copy_file $MYSQLD_DATADIR/$source_db/t1.cfg $MYSQLD_DATADIR/t1.cfg_back +--copy_file $MYSQLD_DATADIR/$source_db/t1.ibd $MYSQLD_DATADIR/t1.ibd_back + +UNLOCK TABLES; + +if($source_db != $dest_db) { + eval USE $dest_db; + let $create1 = query_get_value(SHOW CREATE TABLE $source_db.t1, Create Table, 1); + eval $create1; +} + +eval ALTER TABLE $dest_db.t1 DISCARD TABLESPACE; + +--move_file $MYSQLD_DATADIR/t1.cfg_back $MYSQLD_DATADIR/$dest_db/t1.cfg +--move_file $MYSQLD_DATADIR/t1.ibd_back $MYSQLD_DATADIR/$dest_db/t1.ibd + +eval ALTER TABLE $dest_db.t1 IMPORT TABLESPACE; + +eval CHECK TABLE $dest_db.t1; +eval SHOW CREATE TABLE $dest_db.t1; +eval SELECT * FROM $dest_db.t1; + +if($source_db != $dest_db) { + eval DROP TABLE $dest_db.t1; +} diff --git a/mysql-test/suite/innodb/include/innodb-page-compression.inc b/mysql-test/suite/innodb/include/innodb-page-compression.inc new file mode 100644 index 00000000000..3acbeaf0988 --- /dev/null +++ b/mysql-test/suite/innodb/include/innodb-page-compression.inc @@ -0,0 +1,131 @@ +--disable_warnings +set global innodb_file_format = `Barracuda`; +set global innodb_file_per_table = on; +--enable_warnings + +create table innodb_normal (c1 int not null auto_increment primary key, b char(200)) engine=innodb; +create table innodb_page_compressed1 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=1; +create table innodb_page_compressed2 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=2; +create table innodb_page_compressed3 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=3; +create table innodb_page_compressed4 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=4; +create table innodb_page_compressed5 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=5; +create table innodb_page_compressed6 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=6; +create table innodb_page_compressed7 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=7; +create table innodb_page_compressed8 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=8; +create table innodb_page_compressed9 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=9; + +--disable_query_log +begin; +let $i = 2000; +while ($i) +{ + insert into innodb_normal(b) values(REPEAT('Aa',50)); + insert into innodb_normal(b) values(REPEAT('a',100)); + insert into innodb_normal(b) values(REPEAT('b',100)); + insert into innodb_normal(b) values(REPEAT('0',100)); + insert into innodb_normal(b) values(REPEAT('1',100)); + dec $i; +} + +insert into innodb_page_compressed1 select * from innodb_normal; +insert into innodb_page_compressed2 select * from innodb_normal; +insert into innodb_page_compressed3 select * from innodb_normal; +insert into innodb_page_compressed4 select * from innodb_normal; +insert into innodb_page_compressed5 select * from innodb_normal; +insert into innodb_page_compressed6 select * from innodb_normal; +insert into innodb_page_compressed7 select * from innodb_normal; +insert into innodb_page_compressed8 select * from innodb_normal; +insert into innodb_page_compressed9 select * from innodb_normal; +commit; +--enable_query_log + +select count(*) from innodb_page_compressed1; +select count(*) from innodb_page_compressed3; +select count(*) from innodb_page_compressed4; +select count(*) from innodb_page_compressed5; +select count(*) from innodb_page_compressed6; +select count(*) from innodb_page_compressed6; +select count(*) from innodb_page_compressed7; +select count(*) from innodb_page_compressed8; +select count(*) from innodb_page_compressed9; + +# +# Wait until pages are really compressed +# +let $wait_condition= select variable_value > 0 from information_schema.global_status where variable_name = 'INNODB_NUM_PAGES_PAGE_COMPRESSED'; +--source include/wait_condition.inc + +--let $MYSQLD_DATADIR=`select @@datadir` + +# shutdown before grep + +--source include/shutdown_mysqld.inc + +--let t1_IBD = $MYSQLD_DATADIR/test/innodb_normal.ibd +--let SEARCH_RANGE = 10000000 +--let SEARCH_PATTERN=AaAaAaAa +--echo # innodb_normal expected FOUND +-- let SEARCH_FILE=$t1_IBD +-- source include/search_pattern_in_file.inc +--let t1_IBD = $MYSQLD_DATADIR/test/innodb_page_compressed1.ibd +--echo # innodb_page_compressed1 page compressed expected NOT FOUND +-- let SEARCH_FILE=$t1_IBD +-- source include/search_pattern_in_file.inc +--let t1_IBD = $MYSQLD_DATADIR/test/innodb_page_compressed2.ibd +--echo # innodb_page_compressed2 page compressed expected NOT FOUND +-- let SEARCH_FILE=$t1_IBD +-- source include/search_pattern_in_file.inc +--let t1_IBD = $MYSQLD_DATADIR/test/innodb_page_compressed3.ibd +--echo # innodb_page_compressed3 page compressed expected NOT FOUND +-- let SEARCH_FILE=$t1_IBD +-- source include/search_pattern_in_file.inc +--let t1_IBD = $MYSQLD_DATADIR/test/innodb_page_compressed4.ibd +--echo # innodb_page_compressed4 page compressed expected NOT FOUND +-- let SEARCH_FILE=$t1_IBD +-- source include/search_pattern_in_file.inc +--let t1_IBD = $MYSQLD_DATADIR/test/innodb_page_compressed5.ibd +--echo # innodb_page_compressed5 page compressed expected NOT FOUND +-- let SEARCH_FILE=$t1_IBD +-- source include/search_pattern_in_file.inc +--let t1_IBD = $MYSQLD_DATADIR/test/innodb_page_compressed6.ibd +--echo # innodb_page_compressed6 page compressed expected NOT FOUND +-- let SEARCH_FILE=$t1_IBD +-- source include/search_pattern_in_file.inc +--let t1_IBD = $MYSQLD_DATADIR/test/innodb_page_compressed7.ibd +--echo # innodb_page_compressed7 page compressed expected NOT FOUND +-- let SEARCH_FILE=$t1_IBD +-- source include/search_pattern_in_file.inc +--let t1_IBD = $MYSQLD_DATADIR/test/innodb_page_compressed8.ibd +--echo # innodb_page_compressed8 page compressed expected NOT FOUND +-- let SEARCH_FILE=$t1_IBD +-- source include/search_pattern_in_file.inc +--let t1_IBD = $MYSQLD_DATADIR/test/innodb_page_compressed9.ibd +--echo # innodb_page_compressed9 page compressed expected NOT FOUND +-- let SEARCH_FILE=$t1_IBD +-- source include/search_pattern_in_file.inc + +-- source include/start_mysqld.inc + +select count(*) from innodb_page_compressed1; +select count(*) from innodb_page_compressed3; +select count(*) from innodb_page_compressed4; +select count(*) from innodb_page_compressed5; +select count(*) from innodb_page_compressed6; +select count(*) from innodb_page_compressed6; +select count(*) from innodb_page_compressed7; +select count(*) from innodb_page_compressed8; +select count(*) from innodb_page_compressed9; + +let $wait_condition= select variable_value > 0 from information_schema.global_status where variable_name = 'INNODB_NUM_PAGES_PAGE_DECOMPRESSED'; +--source include/wait_condition.inc + +drop table innodb_normal; +drop table innodb_page_compressed1; +drop table innodb_page_compressed2; +drop table innodb_page_compressed3; +drop table innodb_page_compressed4; +drop table innodb_page_compressed5; +drop table innodb_page_compressed6; +drop table innodb_page_compressed7; +drop table innodb_page_compressed8; +drop table innodb_page_compressed9; diff --git a/mysql-test/suite/innodb/include/innodb-wl6045.inc b/mysql-test/suite/innodb/include/innodb-wl6045.inc new file mode 100644 index 00000000000..33a2ecd731f --- /dev/null +++ b/mysql-test/suite/innodb/include/innodb-wl6045.inc @@ -0,0 +1,22 @@ +--echo ===> Testing size=$size +--disable_warnings +--eval CREATE TABLE t1(id INT AUTO_INCREMENT PRIMARY KEY, msg VARCHAR(255)) ENGINE=INNODB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=$size +--enable_warnings + +insert into t1 values(1,"I"); +insert into t1 values(2,"AM"); +insert into t1 values(3,"COMPRESSED"); + +--source include/shutdown_mysqld.inc + +#STOP; + +--exec $INNOCHECKSUM $MYSQLD_DATADIR/test/t1.ibd +--exec $INNOCHECKSUM --write=crc32 $MYSQLD_DATADIR/test/t1.ibd +--exec $INNOCHECKSUM --strict-check=crc32 $MYSQLD_DATADIR/test/t1.ibd +--exec $INNOCHECKSUM --write=none $MYSQLD_DATADIR/test/t1.ibd +--exec $INNOCHECKSUM --strict-check=none $MYSQLD_DATADIR/test/t1.ibd + +--source include/start_mysqld.inc +select * from t1; +drop table t1; diff --git a/mysql-test/suite/innodb/include/innodb_dict.inc b/mysql-test/suite/innodb/include/innodb_dict.inc new file mode 100644 index 00000000000..1e05181272d --- /dev/null +++ b/mysql-test/suite/innodb/include/innodb_dict.inc @@ -0,0 +1,9 @@ +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; + +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; + +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; diff --git a/mysql-test/suite/innodb/include/innodb_merge_threshold_delete.inc b/mysql-test/suite/innodb/include/innodb_merge_threshold_delete.inc index 6aad7afa878..8c60cd6e230 100644 --- a/mysql-test/suite/innodb/include/innodb_merge_threshold_delete.inc +++ b/mysql-test/suite/innodb/include/innodb_merge_threshold_delete.inc @@ -6,7 +6,6 @@ # --source include/have_innodb.inc ---source include/have_debug.inc --source include/have_innodb_16k.inc # turn on flags @@ -47,17 +46,17 @@ INFORMATION_SCHEMA.INNODB_BUFFER_PAGE s2 where s1.SPACE = s2.SPACE AND NAME like 'test/tab1%' and PAGE_TYPE = "INDEX" order by PAGE_NUMBER, NUMBER_RECORDS; -set global innodb_purge_stop_now=ON; +begin; delete from tab1 where a = 12; delete from tab1 where a = 13; delete from tab1 where a = 14; delete from tab1 where a = 5; delete from tab1 where a = 6; delete from tab1 where a = 7; -set global innodb_purge_run_now=ON; +commit; # wait for purge view progress (records are deleted actually by purge) ---source include/wait_innodb_all_purged.inc +--source include/wait_all_purged.inc # not merged yet # | 1,2,3,4 | 8,9,10,11 | @@ -72,34 +71,27 @@ INFORMATION_SCHEMA.INNODB_BUFFER_PAGE s2 where s1.SPACE = s2.SPACE AND NAME like 'test/tab1%' and PAGE_TYPE = "INDEX" order by PAGE_NUMBER, NUMBER_RECORDS; - -set global innodb_purge_stop_now=ON; delete from tab1 where a = 11; -set global innodb_purge_run_now=ON; # wait for purge view progress (records are deleted actually by purge) ---source include/wait_innodb_all_purged.inc +--source include/wait_all_purged.inc --echo # check page merge happens (MERGE_THRESHOLD=50 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; -set global innodb_purge_stop_now=ON; delete from tab1 where a = 10; -set global innodb_purge_run_now=ON; # wait for purge view progress (records are deleted actually by purge) ---source include/wait_innodb_all_purged.inc +--source include/wait_all_purged.inc --echo # check page merge happens (MERGE_THRESHOLD=35 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; -set global innodb_purge_stop_now=ON; delete from tab1 where a = 9; -set global innodb_purge_run_now=ON; # wait for purge view progress (records are deleted actually by purge) ---source include/wait_innodb_all_purged.inc +--source include/wait_all_purged.inc --echo # check page merge happens (MERGE_THRESHOLD=25 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics diff --git a/mysql-test/suite/innodb/include/innodb_merge_threshold_secondary.inc b/mysql-test/suite/innodb/include/innodb_merge_threshold_secondary.inc index 72242ea2e1b..8e821365e3f 100644 --- a/mysql-test/suite/innodb/include/innodb_merge_threshold_secondary.inc +++ b/mysql-test/suite/innodb/include/innodb_merge_threshold_secondary.inc @@ -7,7 +7,6 @@ # --source include/have_innodb.inc ---source include/have_debug.inc --source include/have_innodb_16k.inc # turn on flags @@ -79,7 +78,7 @@ INFORMATION_SCHEMA.INNODB_BUFFER_PAGE s2 where s1.SPACE = s2.SPACE AND NAME like 'test/tab1%' and PAGE_TYPE = "INDEX" order by PAGE_NUMBER, NUMBER_RECORDS; -set global innodb_purge_stop_now=ON; +begin; delete from tab1 where a = 33; delete from tab1 where a = 34; delete from tab1 where a = 35; @@ -100,10 +99,10 @@ delete from tab1 where a = 18; delete from tab1 where a = 19; delete from tab1 where a = 20; delete from tab1 where a = 21; -set global innodb_purge_run_now=ON; +commit; # wait for purge view progress (records are deleted actually by purge) ---source include/wait_innodb_all_purged.inc +--source include/wait_all_purged.inc # secondary index is not merged yet # | 1,..,11 | 22,..,32 | @@ -119,33 +118,27 @@ where s1.SPACE = s2.SPACE AND NAME like 'test/tab1%' and PAGE_TYPE = "INDEX" order by PAGE_NUMBER, NUMBER_RECORDS; -set global innodb_purge_stop_now=ON; delete from tab1 where a = 32; -set global innodb_purge_run_now=ON; # wait for purge view progress (records are deleted actually by purge) ---source include/wait_innodb_all_purged.inc +--source include/wait_all_purged.inc --echo # check page merge happens (MERGE_THRESHOLD=50 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; -set global innodb_purge_stop_now=ON; delete from tab1 where a = 31; -set global innodb_purge_run_now=ON; # wait for purge view progress (records are deleted actually by purge) ---source include/wait_innodb_all_purged.inc +--source include/wait_all_purged.inc --echo # check page merge happens (MERGE_THRESHOLD=45 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; -set global innodb_purge_stop_now=ON; delete from tab1 where a = 30; -set global innodb_purge_run_now=ON; # wait for purge view progress (records are deleted actually by purge) ---source include/wait_innodb_all_purged.inc +--source include/wait_all_purged.inc --echo # check page merge happens (MERGE_THRESHOLD=40 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics diff --git a/mysql-test/suite/innodb/include/innodb_merge_threshold_update.inc b/mysql-test/suite/innodb/include/innodb_merge_threshold_update.inc index ff34cafd24a..61e961ac6ae 100644 --- a/mysql-test/suite/innodb/include/innodb_merge_threshold_update.inc +++ b/mysql-test/suite/innodb/include/innodb_merge_threshold_update.inc @@ -6,7 +6,6 @@ # --source include/have_innodb.inc ---source include/have_debug.inc --source include/have_innodb_16k.inc # turn on flags diff --git a/mysql-test/suite/innodb/include/wait_all_purged.inc b/mysql-test/suite/innodb/include/wait_all_purged.inc new file mode 100644 index 00000000000..7dbb59a5d32 --- /dev/null +++ b/mysql-test/suite/innodb/include/wait_all_purged.inc @@ -0,0 +1,19 @@ +# Wait for everything to be purged. +# The user should have set innodb_purge_rseg_truncate_frequency=1. + +let $wait_counter= 300; +while ($wait_counter) +{ + --replace_regex /.*History list length ([0-9]+).*/\1/ + let $remaining= `SHOW ENGINE INNODB STATUS`; + if ($remaining == 'InnoDB 0') + { + let $wait_counter= 0; + } + if ($wait_counter) + { + real_sleep 0.1; + dec $wait_counter; + } +} +echo $remaining transactions not purged; diff --git a/mysql-test/suite/innodb/r/101_compatibility.result b/mysql-test/suite/innodb/r/101_compatibility.result index bc4d37916df..a1ca493a6b2 100644 --- a/mysql-test/suite/innodb/r/101_compatibility.result +++ b/mysql-test/suite/innodb/r/101_compatibility.result @@ -9,7 +9,7 @@ SET INNODB_STRICT_MODE=OFF; CREATE TABLE tz(a INT)ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; SET INNODB_STRICT_MODE=ON; CREATE TABLE tdd(a INT) ENGINE=InnoDB, DATA DIRECTORY='MYSQL_TMP_DIR'; -CREATE TABLE tp(a INT) ENGINE=InnoDB page_compressed=1; +CREATE TABLE tp(a INT) ENGINE=InnoDB ROW_FORMAT=DYNAMIC PAGE_COMPRESSED=1; CREATE TABLE ti(a INT) ENGINE=InnoDB; FLUSH TABLES ti FOR EXPORT; backup: ti diff --git a/mysql-test/suite/innodb/r/alter_crash.result b/mysql-test/suite/innodb/r/alter_crash.result new file mode 100644 index 00000000000..8de02cc5fbd --- /dev/null +++ b/mysql-test/suite/innodb/r/alter_crash.result @@ -0,0 +1,149 @@ +# +# Bug#20015132 ALTER TABLE FAILS TO CHECK IF TABLE IS CORRUPTED +# +CREATE TABLE t1(c1 INT PRIMARY KEY, c2 CHAR(1), c3 INT UNSIGNED) ENGINE=InnoDB; +SET @saved_debug_dbug = @@SESSION.debug_dbug; +SET DEBUG_DBUG='+d,ib_create_table_fail_too_many_trx'; +ALTER TABLE t1 ADD INDEX (c2), ADD INDEX (c3); +ERROR HY000: Too many active concurrent transactions +SET DEBUG_DBUG=@saved_debug_dbug; +ALTER TABLE t1 ADD INDEX (c2), ADD INDEX (c3); +SET DEBUG_DBUG='+d,dict_set_index_corrupted'; +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check Warning InnoDB: Index c2 is marked as corrupted +test.t1 check Warning InnoDB: Index c3 is marked as corrupted +test.t1 check error Corrupt +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check Warning InnoDB: Index c2 is marked as corrupted +test.t1 check Warning InnoDB: Index c3 is marked as corrupted +test.t1 check error Corrupt +ALTER TABLE t1 DROP INDEX c2; +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check Warning InnoDB: Index c3 is marked as corrupted +test.t1 check error Corrupt +ALTER TABLE t1 ADD INDEX (c2,c3); +ERROR HY000: Index c3 is corrupted +ALTER TABLE t1 CHANGE c3 c3 INT NOT NULL; +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +ALTER TABLE t1 ADD INDEX (c2,c3); +DROP TABLE t1; +# +# Bug #14669848 CRASH DURING ALTER MAKES ORIGINAL TABLE INACCESSIBLE +# +# -- Scenario 1: +# Crash the server in ha_innobase::commit_inplace_alter_table() +# just after committing the dictionary changes. +CREATE TABLE t1 (f1 INT NOT NULL, f2 INT NOT NULL) ENGINE=innodb; +INSERT INTO t1 VALUES (1,2),(3,4); +SET DEBUG_DBUG='+d,innodb_alter_commit_crash_after_commit'; +ALTER TABLE t1 ADD PRIMARY KEY (f2, f1); +ERROR HY000: Lost connection to MySQL server during query +# Restart mysqld after the crash and reconnect. +# Manual *.frm recovery begin. +# Manual recovery end +FLUSH TABLES; +# Drop the orphaned original table. +# Files in datadir after manual recovery. +t1.frm +t1.ibd +SHOW TABLES; +Tables_in_test +t1 +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `f1` int(11) NOT NULL, + `f2` int(11) NOT NULL, + PRIMARY KEY (`f2`,`f1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +INSERT INTO t1 VALUES (5,6),(7,8); +SELECT * FROM t1; +f1 f2 +1 2 +3 4 +5 6 +7 8 +DROP TABLE t1; +CREATE TABLE t1 (f1 INT NOT NULL, f2 INT NOT NULL) ENGINE=InnoDB; +ALTER TABLE t1 ADD PRIMARY KEY (f2, f1); +DROP TABLE t1; +# -- Scenario 2: +# Crash the server in ha_innobase::commit_inplace_alter_table() +# just before committing the dictionary changes, but after +# writing the MLOG_FILE_RENAME records. As the mini-transaction +# is not committed, the renames will not be replayed. +CREATE TABLE t2 (f1 int not null, f2 int not null) ENGINE=InnoDB; +INSERT INTO t2 VALUES (1,2),(3,4); +SET DEBUG_DBUG='+d,innodb_alter_commit_crash_before_commit'; +ALTER TABLE t2 ADD PRIMARY KEY (f2, f1); +ERROR HY000: Lost connection to MySQL server during query +# Startup the server after the crash +# Read and remember the temporary table name +# Manual *.frm recovery begin. The dictionary was not updated +# and the files were not renamed. The rebuilt table +# was left behind on purpose, to faciliate data recovery. +# Manual recovery end +# Drop the orphaned rebuilt table. +SHOW TABLES; +Tables_in_test +t2 +INSERT INTO t2 VALUES (5,6),(7,8); +SELECT * from t2; +f1 f2 +1 2 +3 4 +5 6 +7 8 +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `f1` int(11) NOT NULL, + `f2` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +DROP TABLE t2; +CREATE TABLE t2 (f1 INT NOT NULL, f2 INT NOT NULL) ENGINE=InnoDB; +ALTER TABLE t2 ADD PRIMARY KEY (f2, f1); +DROP TABLE t2; +# ------------------------- +# End of Testing Scenario 2 +# ------------------------- +# +# Bug#19330255 WL#7142 - CRASH DURING ALTER TABLE LEADS TO +# DATA DICTIONARY INCONSISTENCY +# +CREATE TABLE t1(a int PRIMARY KEY, b varchar(255), c int NOT NULL) +ENGINE=InnoDB; +INSERT INTO t1 SET a=1,c=2; +SET DEBUG_DBUG='+d,innodb_alter_commit_crash_after_commit'; +ALTER TABLE t1 ADD INDEX (b), CHANGE c d int, ALGORITHM=INPLACE; +ERROR HY000: Lost connection to MySQL server during query +# Restart mysqld after the crash and reconnect. +# Manual *.frm recovery begin. +# Manual recovery end +FLUSH TABLES; +# Drop the orphaned original table. +# Files in datadir after manual recovery. +t1.frm +t1.ibd +SHOW TABLES; +Tables_in_test +t1 +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) NOT NULL, + `b` varchar(255) DEFAULT NULL, + `d` int(11) DEFAULT NULL, + PRIMARY KEY (`a`), + KEY `b` (`b`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +UPDATE t1 SET d=NULL; +SELECT * FROM t1; +a b d +1 NULL NULL +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/alter_rename_existing.result b/mysql-test/suite/innodb/r/alter_rename_existing.result new file mode 100644 index 00000000000..881518595de --- /dev/null +++ b/mysql-test/suite/innodb/r/alter_rename_existing.result @@ -0,0 +1,96 @@ +# +# Show what happens during ALTER TABLE when an existing file +# exists in the target location. +# +# Bug #19218794: IF TABLESPACE EXISTS, CAN'T CREATE TABLE, +# BUT CAN ALTER ENGINE=INNODB +# +CREATE TABLE t1 (a SERIAL, b CHAR(10)) ENGINE=Memory; +INSERT INTO t1(b) VALUES('one'), ('two'), ('three'); +# +# Create a file called MYSQLD_DATADIR/test/t1.ibd +# Directory listing of test/*.ibd +# +t1.ibd +ALTER TABLE t1 ENGINE = InnoDB; +ERROR HY000: Error on rename of 'OLD_FILE_NAME' to 'NEW_FILE_NAME' (errno: 184 "Tablespace already exists") +# +# Move the file to InnoDB as t2 +# +ALTER TABLE t1 RENAME TO t2, ENGINE = INNODB; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `b` char(10) DEFAULT NULL, + UNIQUE KEY `a` (`a`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 +SELECT * from t2; +a b +1 one +2 two +3 three +ALTER TABLE t2 RENAME TO t1; +ERROR HY000: Error on rename of 'OLD_FILE_NAME' to 'NEW_FILE_NAME' (errno: 184 "Tablespace already exists") +# +# Create another t1, but in the system tablespace. +# +SET GLOBAL innodb_file_per_table=OFF; +CREATE TABLE t1 (a SERIAL, b CHAR(20)) ENGINE=InnoDB; +INSERT INTO t1(b) VALUES('one'), ('two'), ('three'); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `b` char(20) DEFAULT NULL, + UNIQUE KEY `a` (`a`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 +SELECT name, space=0 FROM information_schema.innodb_sys_tables WHERE name = 'test/t1'; +name space=0 +test/t1 1 +# +# ALTER TABLE from system tablespace to system tablespace +# +ALTER TABLE t1 ADD COLUMN c INT, ALGORITHM=INPLACE; +ALTER TABLE t1 ADD COLUMN d INT, ALGORITHM=COPY; +# +# Try to move t1 from the system tablespace to a file-per-table +# while a blocking t1.ibd file exists. +# +SET GLOBAL innodb_file_per_table=ON; +ALTER TABLE t1 ADD COLUMN e1 INT, ALGORITHM=INPLACE; +ERROR HY000: Tablespace for table 'test/t1' exists. Please DISCARD the tablespace before IMPORT +ALTER TABLE t1 ADD COLUMN e2 INT, ALGORITHM=COPY; +ERROR HY000: Error on rename of 'OLD_FILE_NAME' to 'NEW_FILE_NAME' (errno: 184 "Tablespace already exists") +# +# Delete the blocking file called MYSQLD_DATADIR/test/t1.ibd +# Move t1 to file-per-table using ALGORITHM=INPLACE with no blocking t1.ibd. +# +ALTER TABLE t1 ADD COLUMN e INT, ALGORITHM=INPLACE; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `b` char(20) DEFAULT NULL, + `c` int(11) DEFAULT NULL, + `d` int(11) DEFAULT NULL, + `e` int(11) DEFAULT NULL, + UNIQUE KEY `a` (`a`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 +SELECT name, space=0 FROM information_schema.innodb_sys_tables WHERE name = 'test/t1'; +name space=0 +test/t1 0 +DROP TABLE t1; +# +# Rename t2.ibd to t1.ibd. +# +ALTER TABLE t2 RENAME TO t1; +SELECT name, space=0 FROM information_schema.innodb_sys_tables WHERE name = 'test/t1'; +name space=0 +test/t1 0 +SELECT * from t1; +a b +1 one +2 two +3 three +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/create-index-debug.result b/mysql-test/suite/innodb/r/create-index-debug.result new file mode 100644 index 00000000000..99f6efe9bfe --- /dev/null +++ b/mysql-test/suite/innodb/r/create-index-debug.result @@ -0,0 +1,26 @@ +SET @saved_debug_dbug = @@SESSION.debug_dbug; +# +#BUG#21326304 INNODB ONLINE ALTER TABLE ENDS IN CRASH ON DISK FULL +# +CREATE TABLE t1(f1 CHAR(255) NOT NULL, f2 CHAR(255) NOT NULL, f3 +CHAR(255) NOT NULL, f4 CHAR(255) NOT NULL, f5 CHAR(255) NOT NULL,f6 +CHAR(255) NOT NULL, f7 CHAR(255) NOT NULL, f8 CHAR(255) NOT NULL,f9 +CHAR(255) NOT NULL, f10 CHAR(255) NOT NULL, f11 CHAR(255) NOT NULL,f12 +CHAR(255) NOT NULL, f13 CHAR(255) NOT NULL, f14 CHAR(255) NOT NULL,f15 +CHAR(255) NOT NULL, f16 CHAR(255) NOT NULL, f17 CHAR(255) NOT NULL,f18 +CHAR(255) NOT NULL) +ENGINE=INNODB ROW_FORMAT=DYNAMIC; +Warnings: +Warning 1478 InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope. +Warning 1478 InnoDB: assuming ROW_FORMAT=COMPACT. +INSERT INTO t1 +VALUES('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r'); +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +SET debug_dbug = '+d,disk_is_full'; +ALTER TABLE t1 FORCE, ALGORITHM=INPLACE; +ERROR HY000: The table 't1' is full +SET debug_dbug= @saved_debug_dbug; +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/doublewrite.result b/mysql-test/suite/innodb/r/doublewrite.result index 6b913f49972..61c81ee9dff 100644 --- a/mysql-test/suite/innodb/r/doublewrite.result +++ b/mysql-test/suite/innodb/r/doublewrite.result @@ -231,6 +231,7 @@ set global innodb_buf_flush_list_now = 1; check table t1; Table Op Msg_type Msg_text test.t1 check status OK +FOUND 1 /\[ERROR\] InnoDB: .*test.t1\.ibd.*/ in mysqld.1.err select f1, f2 from t1; f1 f2 1 ############ @@ -238,6 +239,13 @@ f1 f2 3 //////////// 4 ------------ 5 ............ -# Test End -# --------------------------------------------------------------- drop table t1; +# +# MDEV-12600 crash during install_db with innodb_page_size=32K +# and ibdata1=3M +# +SELECT * FROM INFORMATION_SCHEMA.ENGINES +WHERE engine = 'innodb' +AND support IN ('YES', 'DEFAULT', 'ENABLED'); +ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS +FOUND 1 /\[ERROR\] InnoDB: Cannot create doublewrite buffer/ in mysqld.1.err diff --git a/mysql-test/suite/innodb/r/drop_table_background.result b/mysql-test/suite/innodb/r/drop_table_background.result new file mode 100644 index 00000000000..a6f5672ba7f --- /dev/null +++ b/mysql-test/suite/innodb/r/drop_table_background.result @@ -0,0 +1,9 @@ +CREATE TABLE t(c0 SERIAL, c1 INT, c2 INT, c3 INT, c4 INT, +KEY(c1), KEY(c2), KEY(c2,c1), +KEY(c3), KEY(c3,c1), KEY(c3,c2), KEY(c3,c2,c1), +KEY(c4), KEY(c4,c1), KEY(c4,c2), KEY(c4,c2,c1), +KEY(c4,c3), KEY(c4,c3,c1), KEY(c4,c3,c2), KEY(c4,c3,c2,c1)) ENGINE=InnoDB; +SET DEBUG_DBUG='+d,row_drop_table_add_to_background'; +DROP TABLE t; +CREATE TABLE t (a INT) ENGINE=InnoDB; +DROP TABLE t; diff --git a/mysql-test/suite/innodb/r/foreign_key.result b/mysql-test/suite/innodb/r/foreign_key.result index c0a6b37c1a0..da0e16b86ac 100644 --- a/mysql-test/suite/innodb/r/foreign_key.result +++ b/mysql-test/suite/innodb/r/foreign_key.result @@ -150,3 +150,116 @@ unique_constraint_name PRIMARY DROP TABLE t2; DROP TABLE t1; +SET FOREIGN_KEY_CHECKS=0; +CREATE TABLE staff ( +staff_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, +store_id TINYINT UNSIGNED NOT NULL, +PRIMARY KEY (staff_id), +KEY idx_fk_store_id (store_id), +CONSTRAINT fk_staff_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE +) ENGINE=InnoDB; +CREATE TABLE store ( +store_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, +manager_staff_id TINYINT UNSIGNED NOT NULL, +PRIMARY KEY (store_id), +UNIQUE KEY idx_unique_manager (manager_staff_id), +CONSTRAINT fk_store_staff FOREIGN KEY (manager_staff_id) REFERENCES staff (staff_id) ON DELETE RESTRICT ON UPDATE CASCADE +) ENGINE=InnoDB; +SET FOREIGN_KEY_CHECKS=DEFAULT; +LOCK TABLE staff WRITE; +UNLOCK TABLES; +DROP TABLES staff, store; +SET FOREIGN_KEY_CHECKS=1; +# +# MDEV-13246 Stale rows despite ON DELETE CASCADE constraint +# +CREATE TABLE users ( +id int unsigned AUTO_INCREMENT PRIMARY KEY, +name varchar(32) NOT NULL DEFAULT '' +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE matchmaking_groups ( +id bigint unsigned AUTO_INCREMENT PRIMARY KEY, +host_user_id int unsigned NOT NULL UNIQUE, +CONSTRAINT FOREIGN KEY (host_user_id) REFERENCES users (id) +ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE matchmaking_group_users ( +matchmaking_group_id bigint unsigned NOT NULL, +user_id int unsigned NOT NULL, +PRIMARY KEY (matchmaking_group_id,user_id), +UNIQUE KEY user_id (user_id), +CONSTRAINT FOREIGN KEY (matchmaking_group_id) +REFERENCES matchmaking_groups (id) ON DELETE CASCADE ON UPDATE CASCADE, +CONSTRAINT FOREIGN KEY (user_id) +REFERENCES users (id) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE matchmaking_group_maps ( +matchmaking_group_id bigint unsigned NOT NULL, +map_id tinyint unsigned NOT NULL, +PRIMARY KEY (matchmaking_group_id,map_id), +CONSTRAINT FOREIGN KEY (matchmaking_group_id) +REFERENCES matchmaking_groups (id) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +INSERT INTO users VALUES (NULL,'foo'),(NULL,'bar'); +INSERT INTO matchmaking_groups VALUES (10,1),(11,2); +INSERT INTO matchmaking_group_users VALUES (10,1),(11,2); +INSERT INTO matchmaking_group_maps VALUES (10,55),(11,66); +BEGIN; +UPDATE users SET name = 'qux' WHERE id = 1; +connect con1,localhost,root,,; +SET innodb_lock_wait_timeout= 1; +DELETE FROM matchmaking_groups WHERE id = 10; +connection default; +COMMIT; +SELECT * FROM matchmaking_group_users WHERE matchmaking_group_id NOT IN (SELECT id FROM matchmaking_groups); +matchmaking_group_id user_id +SELECT * FROM matchmaking_group_maps WHERE matchmaking_group_id NOT IN (SELECT id FROM matchmaking_groups); +matchmaking_group_id map_id +SELECT * FROM users; +id name +1 qux +2 bar +DROP TABLE +matchmaking_group_maps, matchmaking_group_users, matchmaking_groups, users; +# +# MDEV-13331 FK DELETE CASCADE does not honor innodb_lock_wait_timeout +# +CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t2 ( +id INT NOT NULL PRIMARY KEY, +ref_id INT NOT NULL DEFAULT 0, +f INT NULL, +FOREIGN KEY (ref_id) REFERENCES t1 (id) ON DELETE CASCADE +) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1),(2); +INSERT INTO t2 VALUES (1,1,10),(2,2,20); +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `id` int(11) NOT NULL, + `ref_id` int(11) NOT NULL DEFAULT 0, + `f` int(11) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `ref_id` (`ref_id`), + CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`ref_id`) REFERENCES `t1` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +connection con1; +BEGIN; +UPDATE t2 SET f = 11 WHERE id = 1; +connection default; +SET innodb_lock_wait_timeout= 1; +DELETE FROM t1 WHERE id = 1; +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +connection con1; +COMMIT; +disconnect con1; +connection default; +SELECT * FROM t2; +id ref_id f +1 1 11 +2 2 20 +DELETE FROM t1 WHERE id = 1; +SELECT * FROM t2; +id ref_id f +2 2 20 +DROP TABLE t2, t1; diff --git a/mysql-test/suite/innodb/r/group_commit_binlog_pos.result b/mysql-test/suite/innodb/r/group_commit_binlog_pos.result index 616790c8b37..4de7cc8e43a 100644 --- a/mysql-test/suite/innodb/r/group_commit_binlog_pos.result +++ b/mysql-test/suite/innodb/r/group_commit_binlog_pos.result @@ -43,6 +43,6 @@ a 1 2 3 -InnoDB: Last MySQL binlog file position 0 , file name ./master-bin.000001 +InnoDB: Last binlog file './master-bin.000001', position SET DEBUG_SYNC= 'RESET'; DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/group_commit_binlog_pos_no_optimize_thread.result b/mysql-test/suite/innodb/r/group_commit_binlog_pos_no_optimize_thread.result index f338761aea8..faf57de1750 100644 --- a/mysql-test/suite/innodb/r/group_commit_binlog_pos_no_optimize_thread.result +++ b/mysql-test/suite/innodb/r/group_commit_binlog_pos_no_optimize_thread.result @@ -44,6 +44,6 @@ a 1 2 3 -InnoDB: Last MySQL binlog file position 0 , file name ./master-bin.000001 +InnoDB: Last binlog file './master-bin.000001', position SET DEBUG_SYNC= 'RESET'; DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/index_merge_threshold.result b/mysql-test/suite/innodb/r/index_merge_threshold.result index 092bb69aa65..35cb82e6f1e 100644 --- a/mysql-test/suite/innodb/r/index_merge_threshold.result +++ b/mysql-test/suite/innodb/r/index_merge_threshold.result @@ -1,3 +1,5 @@ +SET @saved_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency; +SET GLOBAL innodb_purge_rseg_truncate_frequency = 1; CREATE TABLE tab(a BIGINT PRIMARY KEY,c1 TINYTEXT,c2 TEXT,c3 MEDIUMTEXT, c4 TINYBLOB,c5 BLOB,c6 MEDIUMBLOB,c7 LONGBLOB) ENGINE=InnoDB; CREATE INDEX index1 ON tab(c1(255)) COMMENT 'Check index level merge MERGE_THRESHOLD=51'; @@ -205,14 +207,15 @@ PAGE_NUMBER NUMBER_RECORDS 3 2 4 7 5 7 -set global innodb_purge_stop_now=ON; +begin; delete from tab1 where a = 12; delete from tab1 where a = 13; delete from tab1 where a = 14; delete from tab1 where a = 5; delete from tab1 where a = 6; delete from tab1 where a = 7; -set global innodb_purge_run_now=ON; +commit; +InnoDB 0 transactions not purged # check page merge happens (nothing is expected) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; @@ -228,27 +231,24 @@ PAGE_NUMBER NUMBER_RECORDS 3 2 4 4 5 4 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 11; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=50 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; name count_reset index_page_merge_attempts 1 index_page_merge_successful 1 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 10; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=35 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; name count_reset index_page_merge_attempts 2 index_page_merge_successful 2 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 9; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=25 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; @@ -288,14 +288,15 @@ PAGE_NUMBER NUMBER_RECORDS 3 2 4 7 5 7 -set global innodb_purge_stop_now=ON; +begin; delete from tab1 where a = 12; delete from tab1 where a = 13; delete from tab1 where a = 14; delete from tab1 where a = 5; delete from tab1 where a = 6; delete from tab1 where a = 7; -set global innodb_purge_run_now=ON; +commit; +InnoDB 0 transactions not purged # check page merge happens (nothing is expected) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; @@ -311,27 +312,24 @@ PAGE_NUMBER NUMBER_RECORDS 3 2 4 4 5 4 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 11; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=50 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; name count_reset index_page_merge_attempts 0 index_page_merge_successful 0 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 10; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=35 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; name count_reset index_page_merge_attempts 1 index_page_merge_successful 1 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 9; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=25 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; @@ -371,14 +369,15 @@ PAGE_NUMBER NUMBER_RECORDS 3 2 4 7 5 7 -set global innodb_purge_stop_now=ON; +begin; delete from tab1 where a = 12; delete from tab1 where a = 13; delete from tab1 where a = 14; delete from tab1 where a = 5; delete from tab1 where a = 6; delete from tab1 where a = 7; -set global innodb_purge_run_now=ON; +commit; +InnoDB 0 transactions not purged # check page merge happens (nothing is expected) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; @@ -394,27 +393,24 @@ PAGE_NUMBER NUMBER_RECORDS 3 2 4 4 5 4 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 11; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=50 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; name count_reset index_page_merge_attempts 0 index_page_merge_successful 0 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 10; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=35 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; name count_reset index_page_merge_attempts 0 index_page_merge_successful 0 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 9; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=25 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; @@ -459,14 +455,15 @@ PAGE_NUMBER NUMBER_RECORDS 3 2 4 7 5 7 -set global innodb_purge_stop_now=ON; +begin; delete from tab1 where a = 12; delete from tab1 where a = 13; delete from tab1 where a = 14; delete from tab1 where a = 5; delete from tab1 where a = 6; delete from tab1 where a = 7; -set global innodb_purge_run_now=ON; +commit; +InnoDB 0 transactions not purged # check page merge happens (nothing is expected) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; @@ -483,27 +480,24 @@ PAGE_NUMBER NUMBER_RECORDS 3 2 4 4 5 4 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 11; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=50 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; name count_reset index_page_merge_attempts 0 index_page_merge_successful 0 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 10; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=35 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; name count_reset index_page_merge_attempts 1 index_page_merge_successful 1 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 9; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=25 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; @@ -872,7 +866,7 @@ PAGE_NUMBER NUMBER_RECORDS 4 2 27 21 28 21 -set global innodb_purge_stop_now=ON; +begin; delete from tab1 where a = 33; delete from tab1 where a = 34; delete from tab1 where a = 35; @@ -893,7 +887,8 @@ delete from tab1 where a = 18; delete from tab1 where a = 19; delete from tab1 where a = 20; delete from tab1 where a = 21; -set global innodb_purge_run_now=ON; +commit; +InnoDB 0 transactions not purged # check page merge happens (nothing is expected) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; @@ -910,27 +905,24 @@ PAGE_NUMBER NUMBER_RECORDS 4 2 27 11 28 11 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 32; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=50 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; name count_reset index_page_merge_attempts 1 index_page_merge_successful 1 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 31; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=45 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; name count_reset index_page_merge_attempts 2 index_page_merge_successful 2 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 30; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=40 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; @@ -1000,7 +992,7 @@ PAGE_NUMBER NUMBER_RECORDS 4 2 27 21 28 21 -set global innodb_purge_stop_now=ON; +begin; delete from tab1 where a = 33; delete from tab1 where a = 34; delete from tab1 where a = 35; @@ -1021,7 +1013,8 @@ delete from tab1 where a = 18; delete from tab1 where a = 19; delete from tab1 where a = 20; delete from tab1 where a = 21; -set global innodb_purge_run_now=ON; +commit; +InnoDB 0 transactions not purged # check page merge happens (nothing is expected) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; @@ -1038,27 +1031,24 @@ PAGE_NUMBER NUMBER_RECORDS 4 2 27 11 28 11 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 32; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=50 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; name count_reset index_page_merge_attempts 0 index_page_merge_successful 0 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 31; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=45 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; name count_reset index_page_merge_attempts 1 index_page_merge_successful 1 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 30; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=40 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; @@ -1128,7 +1118,7 @@ PAGE_NUMBER NUMBER_RECORDS 4 2 27 21 28 21 -set global innodb_purge_stop_now=ON; +begin; delete from tab1 where a = 33; delete from tab1 where a = 34; delete from tab1 where a = 35; @@ -1149,7 +1139,8 @@ delete from tab1 where a = 18; delete from tab1 where a = 19; delete from tab1 where a = 20; delete from tab1 where a = 21; -set global innodb_purge_run_now=ON; +commit; +InnoDB 0 transactions not purged # check page merge happens (nothing is expected) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; @@ -1166,27 +1157,24 @@ PAGE_NUMBER NUMBER_RECORDS 4 2 27 11 28 11 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 32; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=50 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; name count_reset index_page_merge_attempts 0 index_page_merge_successful 0 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 31; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=45 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; name count_reset index_page_merge_attempts 0 index_page_merge_successful 0 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 30; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=40 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; @@ -1257,7 +1245,7 @@ PAGE_NUMBER NUMBER_RECORDS 4 2 27 21 28 21 -set global innodb_purge_stop_now=ON; +begin; delete from tab1 where a = 33; delete from tab1 where a = 34; delete from tab1 where a = 35; @@ -1278,7 +1266,8 @@ delete from tab1 where a = 18; delete from tab1 where a = 19; delete from tab1 where a = 20; delete from tab1 where a = 21; -set global innodb_purge_run_now=ON; +commit; +InnoDB 0 transactions not purged # check page merge happens (nothing is expected) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; @@ -1295,27 +1284,24 @@ PAGE_NUMBER NUMBER_RECORDS 4 2 27 11 28 11 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 32; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=50 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; name count_reset index_page_merge_attempts 0 index_page_merge_successful 0 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 31; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=45 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; name count_reset index_page_merge_attempts 1 index_page_merge_successful 1 -set global innodb_purge_stop_now=ON; delete from tab1 where a = 30; -set global innodb_purge_run_now=ON; +InnoDB 0 transactions not purged # check page merge happens (MERGE_THRESHOLD=40 causes merge here) SELECT name,count_reset FROM information_schema.innodb_metrics WHERE name like 'index_page_merge_%'; @@ -1323,3 +1309,4 @@ name count_reset index_page_merge_attempts 2 index_page_merge_successful 2 DROP TABLE tab1; +SET GLOBAL innodb_purge_rseg_truncate_frequency = @saved_frequency; diff --git a/mysql-test/suite/innodb/r/index_tree_operation.result b/mysql-test/suite/innodb/r/index_tree_operation.result new file mode 100644 index 00000000000..29660962e0c --- /dev/null +++ b/mysql-test/suite/innodb/r/index_tree_operation.result @@ -0,0 +1,55 @@ +# +# Bug#15923864 (Bug#67718): +# INNODB DRASTICALLY UNDER-FILLS PAGES IN CERTAIN CONDITIONS +# +SET GLOBAL innodb_file_per_table=ON; +CREATE TABLE t1 (a BIGINT PRIMARY KEY, b VARCHAR(4096)) ENGINE=InnoDB; +INSERT INTO t1 VALUES (0, REPEAT('a', 4096)); +INSERT INTO t1 VALUES (1000, REPEAT('a', 4096)); +INSERT INTO t1 VALUES (1001, REPEAT('a', 4096)); +INSERT INTO t1 VALUES (1002, REPEAT('a', 4096)); +INSERT INTO t1 VALUES (1, REPEAT('a', 4096)); +INSERT INTO t1 VALUES (2, REPEAT('a', 4096)); +SELECT page_number, number_records +FROM information_schema.innodb_sys_tablespaces s1, +information_schema.innodb_buffer_page s2 +WHERE s1.space = s2.space AND name = 'test/t1' +AND page_type = "INDEX" ORDER BY page_number; +page_number number_records +3 2 +4 3 +5 3 +INSERT INTO t1 VALUES (999, REPEAT('a', 4096)); +SELECT page_number, number_records +FROM information_schema.innodb_sys_tablespaces s1, +information_schema.innodb_buffer_page s2 +WHERE s1.space = s2.space AND name = 'test/t1' +AND page_type = "INDEX" ORDER BY page_number; +page_number number_records +3 3 +4 3 +5 3 +6 1 +INSERT INTO t1 VALUES (998, REPEAT('a', 4096)); +SELECT page_number, number_records +FROM information_schema.innodb_sys_tablespaces s1, +information_schema.innodb_buffer_page s2 +WHERE s1.space = s2.space AND name = 'test/t1' +AND page_type = "INDEX" ORDER BY page_number; +page_number number_records +3 3 +4 3 +5 3 +6 2 +INSERT INTO t1 VALUES (997, REPEAT('a', 4096)); +SELECT page_number, number_records +FROM information_schema.innodb_sys_tablespaces s1, +information_schema.innodb_buffer_page s2 +WHERE s1.space = s2.space AND name = 'test/t1' +AND page_type = "INDEX" ORDER BY page_number; +page_number number_records +3 3 +4 3 +5 3 +6 3 +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/innodb-64k.result b/mysql-test/suite/innodb/r/innodb-64k.result index f72ba8ef8b5..0bc256aaf02 100644 --- a/mysql-test/suite/innodb/r/innodb-64k.result +++ b/mysql-test/suite/innodb/r/innodb-64k.result @@ -1,3 +1,4 @@ +call mtr.add_suppression('InnoDB: Cannot add field.*because after adding it, the row size is'); # Test 1) Show the page size from Information Schema SELECT variable_value FROM information_schema.global_status WHERE LOWER(variable_name) = 'innodb_page_size'; @@ -5,80 +6,26 @@ variable_value 65536 # Test 4) The maximum row size is dependent upon the page size. SET SESSION innodb_strict_mode = ON; -CREATE TABLE t1 ( -c01 char(200), c02 char(200), c03 char(200), c04 char(200), c05 char(200), -c06 char(200), c07 char(200), c08 char(200), c09 char(200), c10 char(200), -c11 char(200), c12 char(200), c13 char(200), c14 char(200), c15 char(200), -c16 char(200), c17 char(200), c18 char(200), c19 char(200), c20 char(200), -c21 char(200), c22 char(200), c23 char(200), c24 char(200), c25 char(200), -c26 char(200), c27 char(200), c28 char(200), c29 char(200), c30 char(200), -c31 char(200), c32 char(200), c33 char(200), c34 char(200), c35 char(200), -c36 char(200), c37 char(200), c38 char(200), c39 char(200), c40 char(200), -c41 char(200), c42 char(200), c43 char(200), c44 char(200), c45 char(200), -c46 char(200), c47 char(200), c48 char(200), c49 char(200), c50 char(200), -c51 char(200), c52 char(200), c53 char(200), c54 char(200), c55 char(200), -c56 char(200), c57 char(200), c58 char(200), c59 char(200), c60 char(200), -c61 char(200), c62 char(200), c63 char(200), c64 char(200), c65 char(200), -c66 char(200), c67 char(200), c68 char(200), c69 char(200), c70 char(200), -c71 char(200), c72 char(200), c73 char(200), c74 char(200), c75 char(200), -c76 char(200), c77 char(200), c78 char(200), c79 char(200), c80 char(200), -c101 char(200), c102 char(200), c103 char(200), c104 char(200), c105 char(200), -c106 char(200), c107 char(200), c108 char(200), c109 char(200), c110 char(200), -c111 char(200), c112 char(200), c113 char(200), c114 char(200), c115 char(200), -c116 char(200), c117 char(200), c118 char(200), c119 char(200), c120 char(200), -c121 char(200), c122 char(200), c123 char(200), c124 char(200), c125 char(200), -c126 char(200), c127 char(200), c128 char(200), c129 char(200), c130 char(200), -c131 char(200), c132 char(200), c133 char(200), c134 char(200), c135 char(200), -c136 char(200), c137 char(200), c138 char(200), c139 char(200), c140 char(200), -c141 char(200), c142 char(200), c143 char(200), c144 char(200), c145 char(200), -c146 char(200), c147 char(200), c148 char(200), c149 char(200), c150 char(200), -c151 char(200), c152 char(200), c153 char(200), c154 char(200), c155 char(200), -c156 char(200), c157 char(200), c158 char(200), c159 char(200), c160 char(200), -c161 char(200), c162 char(200), c163 char(200), c164 char(200), c165 char(200), -c166 char(200), c167 char(200), c168 char(200), c169 char(200), c170 char(200), -c171 char(200), c172 char(200), c173 char(200), c174 char(200), c175 char(200), -c176 char(200), c177 char(200), c178 char(200), c179 char(200), c180 char(200), -c190 char(200), -c81 char(143) -) ROW_FORMAT=redundant; -DROP TABLE t1; -CREATE TABLE t1 ( -c01 char(200), c02 char(200), c03 char(200), c04 char(200), c05 char(200), -c06 char(200), c07 char(200), c08 char(200), c09 char(200), c10 char(200), -c11 char(200), c12 char(200), c13 char(200), c14 char(200), c15 char(200), -c16 char(200), c17 char(200), c18 char(200), c19 char(200), c20 char(200), -c21 char(200), c22 char(200), c23 char(200), c24 char(200), c25 char(200), -c26 char(200), c27 char(200), c28 char(200), c29 char(200), c30 char(200), -c31 char(200), c32 char(200), c33 char(200), c34 char(200), c35 char(200), -c36 char(200), c37 char(200), c38 char(200), c39 char(200), c40 char(200), -c41 char(200), c42 char(200), c43 char(200), c44 char(200), c45 char(200), -c46 char(200), c47 char(200), c48 char(200), c49 char(200), c50 char(200), -c51 char(200), c52 char(200), c53 char(200), c54 char(200), c55 char(200), -c56 char(200), c57 char(200), c58 char(200), c59 char(200), c60 char(200), -c61 char(200), c62 char(200), c63 char(200), c64 char(200), c65 char(200), -c66 char(200), c67 char(200), c68 char(200), c69 char(200), c70 char(200), -c71 char(200), c72 char(200), c73 char(200), c74 char(200), c75 char(200), -c76 char(200), c77 char(200), c78 char(200), c79 char(200), c80 char(200), -c101 char(200), c102 char(200), c103 char(200), c104 char(200), c105 char(200), -c106 char(200), c107 char(200), c108 char(200), c109 char(200), c110 char(200), -c111 char(200), c112 char(200), c113 char(200), c114 char(200), c115 char(200), -c116 char(200), c117 char(200), c118 char(200), c119 char(200), c120 char(200), -c121 char(200), c122 char(200), c123 char(200), c124 char(200), c125 char(200), -c126 char(200), c127 char(200), c128 char(200), c129 char(200), c130 char(200), -c131 char(200), c132 char(200), c133 char(200), c134 char(200), c135 char(200), -c136 char(200), c137 char(200), c138 char(200), c139 char(200), c140 char(200), -c141 char(200), c142 char(200), c143 char(200), c144 char(200), c145 char(200), -c146 char(200), c147 char(200), c148 char(200), c149 char(200), c150 char(200), -c151 char(200), c152 char(200), c153 char(200), c154 char(200), c155 char(200), -c156 char(200), c157 char(200), c158 char(200), c159 char(200), c160 char(200), -c161 char(200), c162 char(200), c163 char(200), c164 char(200), c165 char(200), -c166 char(200), c167 char(200), c168 char(200), c169 char(200), c170 char(200), -c171 char(200), c172 char(200), c173 char(200), c174 char(200), c175 char(200), -c176 char(200), c177 char(200), c178 char(200), c179 char(200), c180 char(200), -c190 char(200), -c81 char(144) -) ROW_FORMAT=redundant; -ERROR 42000: Row size too large (> max_row_size). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +SELECT @@innodb_strict_mode; +@@innodb_strict_mode +1 +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT=REDUNDANT; +ERROR 42000: Row size too large (> 16382). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +show warnings; +Level Code Message +Error 1118 Row size too large (> 16382). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +Warning 1030 Got error 139 "Too big row" from storage engine InnoDB CREATE TABLE t1 ( c01 char(200), c02 char(200), c03 char(200), c04 char(200), c05 char(200), c06 char(200), c07 char(200), c08 char(200), c09 char(200), c10 char(200), @@ -323,7 +270,7 @@ vb=@d,wb=@d,xb=@d,yb=@d,zb=@d, ac=@d,bc=@d,cc=@d,dc=@d,ec=@d,fc=@d,gc=@d,hc=@d,ic=@d,jc=@d, kc=@d,lc=@d,mc=@d,nc=@d,oc=@d,pc=@d,qc=@d,rc=@d,sc=@d,tc=@d,uc=@d, vc=@d,wc=@d,xc=@d,yc=@d,zc=@d; -ERROR HY000: Undo log record is too big. +ERROR HY000: Undo log record is too big BEGIN; UPDATE t1 SET a=@d,b=@d,c=@d,d=@d,e=@d; UPDATE t1 SET f=@d,g=@d,h=@d,i=@d,j=@d; @@ -373,114 +320,113 @@ CREATE INDEX xtc1c5 ON t1 (cc(767),dc(767)); CREATE INDEX xte1e5 ON t1 (ec(767),fc(767)); UPDATE t1 SET t=@e; CREATE INDEX xt5k1f6 ON t1 (lc(767),mc(767)); -ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 32702. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` blob, - `b` blob, - `c` blob, - `d` blob, - `e` blob, - `f` blob, - `g` blob, - `h` blob, - `i` blob, - `j` blob, - `k` blob, - `l` blob, - `m` blob, - `n` blob, - `o` blob, - `p` blob, - `q` blob, - `r` blob, - `s` blob, - `t` blob, - `u` blob, - `v` blob, - `w` blob, - `x` blob, - `y` blob, - `z` blob, - `aa` blob, - `ba` blob, - `ca` blob, - `da` blob, - `ea` blob, - `fa` blob, - `ga` blob, - `ha` blob, - `ia` blob, - `ja` blob, - `ka` blob, - `la` blob, - `ma` blob, - `na` blob, - `oa` blob, - `pa` blob, - `qa` blob, - `ra` blob, - `sa` blob, - `ta` blob, - `ua` blob, - `va` blob, - `wa` blob, - `xa` blob, - `ya` blob, - `za` blob, - `ab` blob, - `bb` blob, - `cb` blob, - `db` blob, - `eb` blob, - `fb` blob, - `gb` blob, - `hb` blob, - `ib` blob, - `jb` blob, - `kb` blob, - `lb` blob, - `mb` blob, - `nb` blob, - `ob` blob, - `pb` blob, - `qb` blob, - `rb` blob, - `sb` blob, - `tb` blob, - `ub` blob, - `vb` blob, - `wb` blob, - `xb` blob, - `yb` blob, - `zb` blob, - `ac` blob, - `bc` blob, - `cc` blob, - `dc` blob, - `ec` blob, - `fc` blob, - `gc` blob, - `hc` blob, - `ic` blob, - `jc` blob, - `kc` blob, - `lc` blob, - `mc` blob, - `nc` blob, - `oc` blob, - `pc` blob, - `qc` blob, - `rc` blob, - `sc` blob, - `tc` blob, - `uc` blob, - `vc` blob, - `wc` blob, - `xc` blob, - `yc` blob, - `zc` blob, + `a` blob DEFAULT NULL, + `b` blob DEFAULT NULL, + `c` blob DEFAULT NULL, + `d` blob DEFAULT NULL, + `e` blob DEFAULT NULL, + `f` blob DEFAULT NULL, + `g` blob DEFAULT NULL, + `h` blob DEFAULT NULL, + `i` blob DEFAULT NULL, + `j` blob DEFAULT NULL, + `k` blob DEFAULT NULL, + `l` blob DEFAULT NULL, + `m` blob DEFAULT NULL, + `n` blob DEFAULT NULL, + `o` blob DEFAULT NULL, + `p` blob DEFAULT NULL, + `q` blob DEFAULT NULL, + `r` blob DEFAULT NULL, + `s` blob DEFAULT NULL, + `t` blob DEFAULT NULL, + `u` blob DEFAULT NULL, + `v` blob DEFAULT NULL, + `w` blob DEFAULT NULL, + `x` blob DEFAULT NULL, + `y` blob DEFAULT NULL, + `z` blob DEFAULT NULL, + `aa` blob DEFAULT NULL, + `ba` blob DEFAULT NULL, + `ca` blob DEFAULT NULL, + `da` blob DEFAULT NULL, + `ea` blob DEFAULT NULL, + `fa` blob DEFAULT NULL, + `ga` blob DEFAULT NULL, + `ha` blob DEFAULT NULL, + `ia` blob DEFAULT NULL, + `ja` blob DEFAULT NULL, + `ka` blob DEFAULT NULL, + `la` blob DEFAULT NULL, + `ma` blob DEFAULT NULL, + `na` blob DEFAULT NULL, + `oa` blob DEFAULT NULL, + `pa` blob DEFAULT NULL, + `qa` blob DEFAULT NULL, + `ra` blob DEFAULT NULL, + `sa` blob DEFAULT NULL, + `ta` blob DEFAULT NULL, + `ua` blob DEFAULT NULL, + `va` blob DEFAULT NULL, + `wa` blob DEFAULT NULL, + `xa` blob DEFAULT NULL, + `ya` blob DEFAULT NULL, + `za` blob DEFAULT NULL, + `ab` blob DEFAULT NULL, + `bb` blob DEFAULT NULL, + `cb` blob DEFAULT NULL, + `db` blob DEFAULT NULL, + `eb` blob DEFAULT NULL, + `fb` blob DEFAULT NULL, + `gb` blob DEFAULT NULL, + `hb` blob DEFAULT NULL, + `ib` blob DEFAULT NULL, + `jb` blob DEFAULT NULL, + `kb` blob DEFAULT NULL, + `lb` blob DEFAULT NULL, + `mb` blob DEFAULT NULL, + `nb` blob DEFAULT NULL, + `ob` blob DEFAULT NULL, + `pb` blob DEFAULT NULL, + `qb` blob DEFAULT NULL, + `rb` blob DEFAULT NULL, + `sb` blob DEFAULT NULL, + `tb` blob DEFAULT NULL, + `ub` blob DEFAULT NULL, + `vb` blob DEFAULT NULL, + `wb` blob DEFAULT NULL, + `xb` blob DEFAULT NULL, + `yb` blob DEFAULT NULL, + `zb` blob DEFAULT NULL, + `ac` blob DEFAULT NULL, + `bc` blob DEFAULT NULL, + `cc` blob DEFAULT NULL, + `dc` blob DEFAULT NULL, + `ec` blob DEFAULT NULL, + `fc` blob DEFAULT NULL, + `gc` blob DEFAULT NULL, + `hc` blob DEFAULT NULL, + `ic` blob DEFAULT NULL, + `jc` blob DEFAULT NULL, + `kc` blob DEFAULT NULL, + `lc` blob DEFAULT NULL, + `mc` blob DEFAULT NULL, + `nc` blob DEFAULT NULL, + `oc` blob DEFAULT NULL, + `pc` blob DEFAULT NULL, + `qc` blob DEFAULT NULL, + `rc` blob DEFAULT NULL, + `sc` blob DEFAULT NULL, + `tc` blob DEFAULT NULL, + `uc` blob DEFAULT NULL, + `vc` blob DEFAULT NULL, + `wc` blob DEFAULT NULL, + `xc` blob DEFAULT NULL, + `yc` blob DEFAULT NULL, + `zc` blob DEFAULT NULL, KEY `t1a` (`a`(767),`b`(767)), KEY `t1c` (`c`(767),`d`(767)), KEY `t1e` (`e`(767),`f`(767)), @@ -521,7 +467,8 @@ t1 CREATE TABLE `t1` ( KEY `xt5g1f2` (`gc`(767),`hc`(767)), KEY `xt5i1f4` (`ic`(767)), KEY `xtc1c5` (`cc`(767),`dc`(767)), - KEY `xte1e5` (`ec`(767),`fc`(767)) + KEY `xte1e5` (`ec`(767),`fc`(767)), + KEY `xt5k1f6` (`lc`(767),`mc`(767)) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC SHOW WARNINGS; Level Code Message @@ -778,110 +725,110 @@ insert into t2 select * from t2; show create table t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` blob, - `b` blob, - `c` blob, - `d` blob, - `e` blob, - `f` blob, - `g` blob, - `h` blob, - `i` blob, - `j` blob, - `k` blob, - `l` blob, - `m` blob, - `n` blob, - `o` blob, - `p` blob, - `q` blob, - `r` blob, - `s` blob, - `t` blob, - `u` blob, - `v` blob, - `w` blob, - `x` blob, - `y` blob, - `z` blob, - `aa` blob, - `ba` blob, - `ca` blob, - `da` blob, - `ea` blob, - `fa` blob, - `ga` blob, - `ha` blob, - `ia` blob, - `ja` blob, - `ka` blob, - `la` blob, - `ma` blob, - `na` blob, - `oa` blob, - `pa` blob, - `qa` blob, - `ra` blob, - `sa` blob, - `ta` blob, - `ua` blob, - `va` blob, - `wa` blob, - `xa` blob, - `ya` blob, - `za` blob, - `ab` blob, - `bb` blob, - `cb` blob, - `db` blob, - `eb` blob, - `fb` blob, - `gb` blob, - `hb` blob, - `ib` blob, - `jb` blob, - `kb` blob, - `lb` blob, - `mb` blob, - `nb` blob, - `ob` blob, - `pb` blob, - `qb` blob, - `rb` blob, - `sb` blob, - `tb` blob, - `ub` blob, - `vb` blob, - `wb` blob, - `xb` blob, - `yb` blob, - `zb` blob, - `ac` blob, - `bc` blob, - `cc` blob, - `dc` blob, - `ec` blob, - `fc` blob, - `gc` blob, - `hc` blob, - `ic` blob, - `jc` blob, - `kc` blob, - `lc` blob, - `mc` blob, - `nc` blob, - `oc` blob, - `pc` blob, - `qc` blob, - `rc` blob, - `sc` blob, - `tc` blob, - `uc` blob, - `vc` blob, - `wc` blob, - `xc` blob, - `yc` blob, - `zc` blob, + `a` blob DEFAULT NULL, + `b` blob DEFAULT NULL, + `c` blob DEFAULT NULL, + `d` blob DEFAULT NULL, + `e` blob DEFAULT NULL, + `f` blob DEFAULT NULL, + `g` blob DEFAULT NULL, + `h` blob DEFAULT NULL, + `i` blob DEFAULT NULL, + `j` blob DEFAULT NULL, + `k` blob DEFAULT NULL, + `l` blob DEFAULT NULL, + `m` blob DEFAULT NULL, + `n` blob DEFAULT NULL, + `o` blob DEFAULT NULL, + `p` blob DEFAULT NULL, + `q` blob DEFAULT NULL, + `r` blob DEFAULT NULL, + `s` blob DEFAULT NULL, + `t` blob DEFAULT NULL, + `u` blob DEFAULT NULL, + `v` blob DEFAULT NULL, + `w` blob DEFAULT NULL, + `x` blob DEFAULT NULL, + `y` blob DEFAULT NULL, + `z` blob DEFAULT NULL, + `aa` blob DEFAULT NULL, + `ba` blob DEFAULT NULL, + `ca` blob DEFAULT NULL, + `da` blob DEFAULT NULL, + `ea` blob DEFAULT NULL, + `fa` blob DEFAULT NULL, + `ga` blob DEFAULT NULL, + `ha` blob DEFAULT NULL, + `ia` blob DEFAULT NULL, + `ja` blob DEFAULT NULL, + `ka` blob DEFAULT NULL, + `la` blob DEFAULT NULL, + `ma` blob DEFAULT NULL, + `na` blob DEFAULT NULL, + `oa` blob DEFAULT NULL, + `pa` blob DEFAULT NULL, + `qa` blob DEFAULT NULL, + `ra` blob DEFAULT NULL, + `sa` blob DEFAULT NULL, + `ta` blob DEFAULT NULL, + `ua` blob DEFAULT NULL, + `va` blob DEFAULT NULL, + `wa` blob DEFAULT NULL, + `xa` blob DEFAULT NULL, + `ya` blob DEFAULT NULL, + `za` blob DEFAULT NULL, + `ab` blob DEFAULT NULL, + `bb` blob DEFAULT NULL, + `cb` blob DEFAULT NULL, + `db` blob DEFAULT NULL, + `eb` blob DEFAULT NULL, + `fb` blob DEFAULT NULL, + `gb` blob DEFAULT NULL, + `hb` blob DEFAULT NULL, + `ib` blob DEFAULT NULL, + `jb` blob DEFAULT NULL, + `kb` blob DEFAULT NULL, + `lb` blob DEFAULT NULL, + `mb` blob DEFAULT NULL, + `nb` blob DEFAULT NULL, + `ob` blob DEFAULT NULL, + `pb` blob DEFAULT NULL, + `qb` blob DEFAULT NULL, + `rb` blob DEFAULT NULL, + `sb` blob DEFAULT NULL, + `tb` blob DEFAULT NULL, + `ub` blob DEFAULT NULL, + `vb` blob DEFAULT NULL, + `wb` blob DEFAULT NULL, + `xb` blob DEFAULT NULL, + `yb` blob DEFAULT NULL, + `zb` blob DEFAULT NULL, + `ac` blob DEFAULT NULL, + `bc` blob DEFAULT NULL, + `cc` blob DEFAULT NULL, + `dc` blob DEFAULT NULL, + `ec` blob DEFAULT NULL, + `fc` blob DEFAULT NULL, + `gc` blob DEFAULT NULL, + `hc` blob DEFAULT NULL, + `ic` blob DEFAULT NULL, + `jc` blob DEFAULT NULL, + `kc` blob DEFAULT NULL, + `lc` blob DEFAULT NULL, + `mc` blob DEFAULT NULL, + `nc` blob DEFAULT NULL, + `oc` blob DEFAULT NULL, + `pc` blob DEFAULT NULL, + `qc` blob DEFAULT NULL, + `rc` blob DEFAULT NULL, + `sc` blob DEFAULT NULL, + `tc` blob DEFAULT NULL, + `uc` blob DEFAULT NULL, + `vc` blob DEFAULT NULL, + `wc` blob DEFAULT NULL, + `xc` blob DEFAULT NULL, + `yc` blob DEFAULT NULL, + `zc` blob DEFAULT NULL, KEY `t1a` (`a`(767),`b`(767)), KEY `t1c` (`c`(767),`d`(767)), KEY `t1e` (`e`(767),`f`(767)), @@ -922,208 +869,209 @@ t1 CREATE TABLE `t1` ( KEY `xt5g1f2` (`gc`(767),`hc`(767)), KEY `xt5i1f4` (`ic`(767)), KEY `xtc1c5` (`cc`(767),`dc`(767)), - KEY `xte1e5` (`ec`(767),`fc`(767)) + KEY `xte1e5` (`ec`(767),`fc`(767)), + KEY `xt5k1f6` (`lc`(767),`mc`(767)) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC show create table t2; Table Create Table t2 CREATE TABLE `t2` ( - `COL1` text, - `COL2` text, - `COL3` text, - `COL4` text, - `COL5` text, - `COL6` text, - `COL7` text, - `COL8` text, - `COL9` text, - `COL10` text, - `COL11` text, - `COL12` text, - `COL13` text, - `COL14` text, - `COL15` text, - `COL16` text, - `COL17` text, - `COL18` text, - `COL19` text, - `COL20` text, - `COL21` text, - `COL22` text, - `COL23` text, - `COL24` text, - `COL25` text, - `COL26` text, - `COL27` text, - `COL28` text, - `COL29` text, - `COL30` text, - `COL31` text, - `COL32` text, - `COL33` text, - `COL34` text, - `COL35` text, - `COL36` text, - `COL37` text, - `COL38` text, - `COL39` text, - `COL40` text, - `COL41` text, - `COL42` text, - `COL43` text, - `COL44` text, - `COL45` text, - `COL46` text, - `COL47` text, - `COL48` text, - `COL49` text, - `COL50` text, - `COL51` text, - `COL52` text, - `COL53` text, - `COL54` text, - `COL55` text, - `COL56` text, - `COL57` text, - `COL58` text, - `COL59` text, - `COL60` text, - `COL61` text, - `COL62` text, - `COL63` text, - `COL64` text, - `COL65` text, - `COL66` text, - `COL67` text, - `COL68` text, - `COL69` text, - `COL70` text, - `COL71` text, - `COL72` text, - `COL73` text, - `COL74` text, - `COL75` text, - `COL76` text, - `COL77` text, - `COL78` text, - `COL79` text, - `COL80` text, - `COL81` text, - `COL82` text, - `COL83` text, - `COL84` text, - `COL85` text, - `COL86` text, - `COL87` text, - `COL88` text, - `COL89` text, - `COL90` text, - `COL91` text, - `COL92` text, - `COL93` text, - `COL94` text, - `COL95` text, - `COL96` text, - `COL97` text, - `COL98` text, - `COL99` text, - `COL100` text, - `COL101` text, - `COL102` text, - `COL103` text, - `COL104` text, - `COL105` text, - `COL106` text, - `COL107` text, - `COL108` text, - `COL109` text, - `COL110` text, - `COL111` text, - `COL112` text, - `COL113` text, - `COL114` text, - `COL115` text, - `COL116` text, - `COL117` text, - `COL118` text, - `COL119` text, - `COL120` text, - `COL121` text, - `COL122` text, - `COL123` text, - `COL124` text, - `COL125` text, - `COL126` text, - `COL127` text, - `COL128` text, - `COL129` text, - `COL130` text, - `COL131` text, - `COL132` text, - `COL133` text, - `COL134` text, - `COL135` text, - `COL136` text, - `COL137` text, - `COL138` text, - `COL139` text, - `COL140` text, - `COL141` text, - `COL142` text, - `COL143` text, - `COL144` text, - `COL145` text, - `COL146` text, - `COL147` text, - `COL148` text, - `COL149` text, - `COL150` text, - `COL151` text, - `COL152` text, - `COL153` text, - `COL154` text, - `COL155` text, - `COL156` text, - `COL157` text, - `COL158` text, - `COL159` text, - `COL160` text, - `COL161` text, - `COL162` text, - `COL163` text, - `COL164` text, - `COL165` text, - `COL166` text, - `COL167` text, - `COL168` text, - `COL169` text, - `COL170` text, - `COL171` text, - `COL172` text, - `COL173` text, - `COL174` text, - `COL175` text, - `COL176` text, - `COL177` text, - `COL178` text, - `COL179` text, - `COL180` text, - `COL181` text, - `COL182` text, - `COL183` text, - `COL184` text, - `COL185` text, - `COL186` text, - `COL187` text, - `COL188` text, - `COL189` text, - `COL190` text, - `COL191` text, - `COL192` text, - `COL193` text, - `COL194` text, - `COL195` text, - `COL196` text, - `COL197` text + `COL1` text DEFAULT NULL, + `COL2` text DEFAULT NULL, + `COL3` text DEFAULT NULL, + `COL4` text DEFAULT NULL, + `COL5` text DEFAULT NULL, + `COL6` text DEFAULT NULL, + `COL7` text DEFAULT NULL, + `COL8` text DEFAULT NULL, + `COL9` text DEFAULT NULL, + `COL10` text DEFAULT NULL, + `COL11` text DEFAULT NULL, + `COL12` text DEFAULT NULL, + `COL13` text DEFAULT NULL, + `COL14` text DEFAULT NULL, + `COL15` text DEFAULT NULL, + `COL16` text DEFAULT NULL, + `COL17` text DEFAULT NULL, + `COL18` text DEFAULT NULL, + `COL19` text DEFAULT NULL, + `COL20` text DEFAULT NULL, + `COL21` text DEFAULT NULL, + `COL22` text DEFAULT NULL, + `COL23` text DEFAULT NULL, + `COL24` text DEFAULT NULL, + `COL25` text DEFAULT NULL, + `COL26` text DEFAULT NULL, + `COL27` text DEFAULT NULL, + `COL28` text DEFAULT NULL, + `COL29` text DEFAULT NULL, + `COL30` text DEFAULT NULL, + `COL31` text DEFAULT NULL, + `COL32` text DEFAULT NULL, + `COL33` text DEFAULT NULL, + `COL34` text DEFAULT NULL, + `COL35` text DEFAULT NULL, + `COL36` text DEFAULT NULL, + `COL37` text DEFAULT NULL, + `COL38` text DEFAULT NULL, + `COL39` text DEFAULT NULL, + `COL40` text DEFAULT NULL, + `COL41` text DEFAULT NULL, + `COL42` text DEFAULT NULL, + `COL43` text DEFAULT NULL, + `COL44` text DEFAULT NULL, + `COL45` text DEFAULT NULL, + `COL46` text DEFAULT NULL, + `COL47` text DEFAULT NULL, + `COL48` text DEFAULT NULL, + `COL49` text DEFAULT NULL, + `COL50` text DEFAULT NULL, + `COL51` text DEFAULT NULL, + `COL52` text DEFAULT NULL, + `COL53` text DEFAULT NULL, + `COL54` text DEFAULT NULL, + `COL55` text DEFAULT NULL, + `COL56` text DEFAULT NULL, + `COL57` text DEFAULT NULL, + `COL58` text DEFAULT NULL, + `COL59` text DEFAULT NULL, + `COL60` text DEFAULT NULL, + `COL61` text DEFAULT NULL, + `COL62` text DEFAULT NULL, + `COL63` text DEFAULT NULL, + `COL64` text DEFAULT NULL, + `COL65` text DEFAULT NULL, + `COL66` text DEFAULT NULL, + `COL67` text DEFAULT NULL, + `COL68` text DEFAULT NULL, + `COL69` text DEFAULT NULL, + `COL70` text DEFAULT NULL, + `COL71` text DEFAULT NULL, + `COL72` text DEFAULT NULL, + `COL73` text DEFAULT NULL, + `COL74` text DEFAULT NULL, + `COL75` text DEFAULT NULL, + `COL76` text DEFAULT NULL, + `COL77` text DEFAULT NULL, + `COL78` text DEFAULT NULL, + `COL79` text DEFAULT NULL, + `COL80` text DEFAULT NULL, + `COL81` text DEFAULT NULL, + `COL82` text DEFAULT NULL, + `COL83` text DEFAULT NULL, + `COL84` text DEFAULT NULL, + `COL85` text DEFAULT NULL, + `COL86` text DEFAULT NULL, + `COL87` text DEFAULT NULL, + `COL88` text DEFAULT NULL, + `COL89` text DEFAULT NULL, + `COL90` text DEFAULT NULL, + `COL91` text DEFAULT NULL, + `COL92` text DEFAULT NULL, + `COL93` text DEFAULT NULL, + `COL94` text DEFAULT NULL, + `COL95` text DEFAULT NULL, + `COL96` text DEFAULT NULL, + `COL97` text DEFAULT NULL, + `COL98` text DEFAULT NULL, + `COL99` text DEFAULT NULL, + `COL100` text DEFAULT NULL, + `COL101` text DEFAULT NULL, + `COL102` text DEFAULT NULL, + `COL103` text DEFAULT NULL, + `COL104` text DEFAULT NULL, + `COL105` text DEFAULT NULL, + `COL106` text DEFAULT NULL, + `COL107` text DEFAULT NULL, + `COL108` text DEFAULT NULL, + `COL109` text DEFAULT NULL, + `COL110` text DEFAULT NULL, + `COL111` text DEFAULT NULL, + `COL112` text DEFAULT NULL, + `COL113` text DEFAULT NULL, + `COL114` text DEFAULT NULL, + `COL115` text DEFAULT NULL, + `COL116` text DEFAULT NULL, + `COL117` text DEFAULT NULL, + `COL118` text DEFAULT NULL, + `COL119` text DEFAULT NULL, + `COL120` text DEFAULT NULL, + `COL121` text DEFAULT NULL, + `COL122` text DEFAULT NULL, + `COL123` text DEFAULT NULL, + `COL124` text DEFAULT NULL, + `COL125` text DEFAULT NULL, + `COL126` text DEFAULT NULL, + `COL127` text DEFAULT NULL, + `COL128` text DEFAULT NULL, + `COL129` text DEFAULT NULL, + `COL130` text DEFAULT NULL, + `COL131` text DEFAULT NULL, + `COL132` text DEFAULT NULL, + `COL133` text DEFAULT NULL, + `COL134` text DEFAULT NULL, + `COL135` text DEFAULT NULL, + `COL136` text DEFAULT NULL, + `COL137` text DEFAULT NULL, + `COL138` text DEFAULT NULL, + `COL139` text DEFAULT NULL, + `COL140` text DEFAULT NULL, + `COL141` text DEFAULT NULL, + `COL142` text DEFAULT NULL, + `COL143` text DEFAULT NULL, + `COL144` text DEFAULT NULL, + `COL145` text DEFAULT NULL, + `COL146` text DEFAULT NULL, + `COL147` text DEFAULT NULL, + `COL148` text DEFAULT NULL, + `COL149` text DEFAULT NULL, + `COL150` text DEFAULT NULL, + `COL151` text DEFAULT NULL, + `COL152` text DEFAULT NULL, + `COL153` text DEFAULT NULL, + `COL154` text DEFAULT NULL, + `COL155` text DEFAULT NULL, + `COL156` text DEFAULT NULL, + `COL157` text DEFAULT NULL, + `COL158` text DEFAULT NULL, + `COL159` text DEFAULT NULL, + `COL160` text DEFAULT NULL, + `COL161` text DEFAULT NULL, + `COL162` text DEFAULT NULL, + `COL163` text DEFAULT NULL, + `COL164` text DEFAULT NULL, + `COL165` text DEFAULT NULL, + `COL166` text DEFAULT NULL, + `COL167` text DEFAULT NULL, + `COL168` text DEFAULT NULL, + `COL169` text DEFAULT NULL, + `COL170` text DEFAULT NULL, + `COL171` text DEFAULT NULL, + `COL172` text DEFAULT NULL, + `COL173` text DEFAULT NULL, + `COL174` text DEFAULT NULL, + `COL175` text DEFAULT NULL, + `COL176` text DEFAULT NULL, + `COL177` text DEFAULT NULL, + `COL178` text DEFAULT NULL, + `COL179` text DEFAULT NULL, + `COL180` text DEFAULT NULL, + `COL181` text DEFAULT NULL, + `COL182` text DEFAULT NULL, + `COL183` text DEFAULT NULL, + `COL184` text DEFAULT NULL, + `COL185` text DEFAULT NULL, + `COL186` text DEFAULT NULL, + `COL187` text DEFAULT NULL, + `COL188` text DEFAULT NULL, + `COL189` text DEFAULT NULL, + `COL190` text DEFAULT NULL, + `COL191` text DEFAULT NULL, + `COL192` text DEFAULT NULL, + `COL193` text DEFAULT NULL, + `COL194` text DEFAULT NULL, + `COL195` text DEFAULT NULL, + `COL196` text DEFAULT NULL, + `COL197` text DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC BEGIN; update t2 set col150=@a; diff --git a/mysql-test/suite/innodb/r/innodb-alter-autoinc.result b/mysql-test/suite/innodb/r/innodb-alter-autoinc.result new file mode 100644 index 00000000000..a96d2f634cb --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb-alter-autoinc.result @@ -0,0 +1,174 @@ +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES(347),(33101),(123),(45),(6); +SET @old_sql_mode = @@sql_mode; +SET @@sql_mode = 'STRICT_TRANS_TABLES'; +ALTER TABLE t1 ADD PRIMARY KEY(a); +SET @@sql_mode = @old_sql_mode; +ALTER TABLE t1 DROP PRIMARY KEY, ADD id INT AUTO_INCREMENT PRIMARY KEY, +LOCK=NONE; +ERROR 0A000: LOCK=NONE is not supported. Reason: Adding an auto-increment column requires a lock. Try LOCK=SHARED +ALTER TABLE t1 ADD id INT AUTO_INCREMENT; +ERROR 42000: Incorrect table definition; there can be only one auto column and it must be defined as a key +ALTER TABLE t1 ADD id INT AUTO_INCREMENT, ADD INDEX(a, id); +ERROR 42000: Incorrect table definition; there can be only one auto column and it must be defined as a key +ALTER TABLE t1 ADD id INT NOT NULL, ADD INDEX(id, a); +SELECT * FROM t1; +a id +6 0 +45 0 +123 0 +347 0 +33101 0 +SET AUTO_INCREMENT_INCREMENT = 5, AUTO_INCREMENT_OFFSET = 30; +ALTER TABLE t1 DROP PRIMARY KEY, ADD id INT AUTO_INCREMENT PRIMARY KEY, +DROP COLUMN id, AUTO_INCREMENT = 42, ALGORITHM=COPY; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) NOT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`id`), + KEY `id` (`id`,`a`) +) ENGINE=InnoDB AUTO_INCREMENT=70 DEFAULT CHARSET=latin1 +BEGIN; +INSERT INTO t1 VALUES(7,0); +SELECT * FROM t1; +a id +6 45 +45 50 +123 55 +347 60 +33101 65 +7 70 +ROLLBACK; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) NOT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`id`), + KEY `id` (`id`,`a`) +) ENGINE=InnoDB AUTO_INCREMENT=75 DEFAULT CHARSET=latin1 +ALTER TABLE t1 DROP PRIMARY KEY, ADD id INT AUTO_INCREMENT PRIMARY KEY, +DROP COLUMN id, AUTO_INCREMENT = 42, LOCK=NONE; +ERROR 0A000: LOCK=NONE is not supported. Reason: Adding an auto-increment column requires a lock. Try LOCK=SHARED +ALTER TABLE t1 DROP PRIMARY KEY, ADD id INT AUTO_INCREMENT PRIMARY KEY, +DROP COLUMN id, AUTO_INCREMENT = 42, ALGORITHM=INPLACE; +SELECT * FROM t1; +a id +6 45 +45 50 +123 55 +347 60 +33101 65 +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) NOT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`id`), + KEY `id` (`id`,`a`) +) ENGINE=InnoDB AUTO_INCREMENT=70 DEFAULT CHARSET=latin1 +INSERT INTO t1 SET a=123; +INSERT INTO t1 VALUES(-123,-45); +ALTER TABLE t1 AUTO_INCREMENT = 75; +INSERT INTO t1 SET a=123; +SELECT * FROM t1; +a id +-123 -45 +6 45 +45 50 +123 55 +347 60 +33101 65 +123 70 +123 75 +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) NOT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`id`), + KEY `id` (`id`,`a`) +) ENGINE=InnoDB AUTO_INCREMENT=80 DEFAULT CHARSET=latin1 +DROP TABLE t1; +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES(347),(33101),(123),(45),(6); +ALTER TABLE t1 ADD PRIMARY KEY(a); +ALTER TABLE t1 ADD id INT NOT NULL, ADD INDEX(id, a); +SELECT * FROM t1; +a id +6 0 +45 0 +123 0 +347 0 +33101 0 +ALTER TABLE t1 DROP PRIMARY KEY, ADD id INT AUTO_INCREMENT PRIMARY KEY, +DROP COLUMN id, AUTO_INCREMENT = 42, ALGORITHM=INPLACE; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) NOT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`id`), + KEY `id` (`id`,`a`) +) ENGINE=InnoDB AUTO_INCREMENT=70 DEFAULT CHARSET=latin1 +BEGIN; +INSERT INTO t1 VALUES(7,0); +SELECT * FROM t1; +a id +6 45 +45 50 +123 55 +347 60 +33101 65 +7 70 +ROLLBACK; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) NOT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`id`), + KEY `id` (`id`,`a`) +) ENGINE=InnoDB AUTO_INCREMENT=75 DEFAULT CHARSET=latin1 +ALTER TABLE t1 DROP PRIMARY KEY, ADD id INT AUTO_INCREMENT PRIMARY KEY, +DROP COLUMN id, AUTO_INCREMENT = 42, ALGORITHM=COPY; +SELECT * FROM t1; +a id +6 45 +45 50 +123 55 +347 60 +33101 65 +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) NOT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`id`), + KEY `id` (`id`,`a`) +) ENGINE=InnoDB AUTO_INCREMENT=70 DEFAULT CHARSET=latin1 +INSERT INTO t1 SET a=123; +INSERT INTO t1 VALUES(-123,-45); +ALTER TABLE t1 AUTO_INCREMENT = 75; +INSERT INTO t1 SET a=123; +SELECT * FROM t1; +a id +-123 -45 +6 45 +45 50 +123 55 +347 60 +33101 65 +123 70 +123 75 +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) NOT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`id`), + KEY `id` (`id`,`a`) +) ENGINE=InnoDB AUTO_INCREMENT=80 DEFAULT CHARSET=latin1 +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/innodb-alter-timestamp.result b/mysql-test/suite/innodb/r/innodb-alter-timestamp.result index 2ab81136d1f..9659b03d6b2 100644 --- a/mysql-test/suite/innodb/r/innodb-alter-timestamp.result +++ b/mysql-test/suite/innodb/r/innodb-alter-timestamp.result @@ -1,8 +1,32 @@ -CREATE TABLE t1 ( -`i1` INT(10) UNSIGNED NOT NULL, -`d1` TIMESTAMP NULL DEFAULT NULL -) ENGINE=innodb; -show create table t1; +CREATE TABLE t1 (i1 INT UNSIGNED NULL DEFAULT 42) ENGINE=innodb; +INSERT INTO t1 VALUES(NULL); +ALTER TABLE t1 CHANGE i1 i1 INT UNSIGNED NOT NULL DEFAULT rand(), +ALGORITHM=INPLACE; +ERROR 22004: Invalid use of NULL value +ALTER TABLE t1 CHANGE i1 i1 INT UNSIGNED NOT NULL DEFAULT rand(), +ALGORITHM=COPY; +ERROR 01000: Data truncated for column 'i1' at row 1 +ALTER TABLE t1 CHANGE i1 id INT UNSIGNED NOT NULL AUTO_INCREMENT, +ADD PRIMARY KEY(id), ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY +ALTER TABLE t1 ADD PRIMARY KEY(i1), ALGORITHM=INPLACE; +ERROR 22004: Invalid use of NULL value +ALTER TABLE t1 CHANGE i1 id INT UNSIGNED NOT NULL AUTO_INCREMENT, +ADD PRIMARY KEY(id); +affected rows: 1 +info: Records: 1 Duplicates: 0 Warnings: 0 +SELECT * FROM t1; +id +1 +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 +DROP TABLE t1; +CREATE TABLE t1 (i1 INT UNSIGNED NOT NULL, d1 TIMESTAMP NULL) ENGINE=InnoDB; +SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `i1` int(10) unsigned NOT NULL, @@ -17,13 +41,79 @@ i1 d1 4 NULL 5 NULL set sql_mode = 'STRICT_ALL_TABLES,NO_ZERO_DATE'; -ALTER TABLE t1 CHANGE `d1` `d1` TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL; +ALTER TABLE t1 CHANGE d1 d1 TIMESTAMP NULL DEFAULT '2017-05-08 16:23:45', +ALGORITHM=INPLACE; +SELECT DISTINCT d1 FROM t1; +d1 +NULL +ALTER TABLE t1 CHANGE d1 d1 TIMESTAMP NULL DEFAULT '2017-05-08 16:32:45', +ALGORITHM=COPY; +SELECT DISTINCT d1 FROM t1; +d1 +NULL +ALTER TABLE t1 CHANGE d1 d1 TIMESTAMP DEFAULT '2017-05-08 16:32:54'; +affected rows: 5 +info: Records: 5 Duplicates: 0 Warnings: 0 +# Note: NULL was changed to CURRENT_TIMESTAMP(), +# not the specified constant DEFAULT value! +SELECT COUNT(DISTINCT d1),COUNT(d1),COUNT(*) FROM t1; +COUNT(DISTINCT d1) COUNT(d1) COUNT(*) +1 5 5 +SELECT DISTINCT (CURRENT_TIMESTAMP()-d1) <= 60 FROM t1; +(CURRENT_TIMESTAMP()-d1) <= 60 +1 drop table t1; CREATE TABLE t1 ( `i1` INT(10) UNSIGNED NOT NULL, `d1` TIMESTAMP NULL DEFAULT NULL ) ENGINE=innodb; INSERT INTO t1 (i1) VALUES (1), (2), (3), (4), (5); -ALTER TABLE t1 CHANGE `d1` `d1` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; -drop table t1; -set sql_mode = ''; +ALTER TABLE t1 CHANGE d1 d1 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; +affected rows: 5 +info: Records: 5 Duplicates: 0 Warnings: 0 +ALTER TABLE t1 ADD COLUMN w1 varchar(20) NULL DEFAULT USER(); +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +ALTER TABLE t1 CHANGE w1 u1 varchar(30) NULL DEFAULT substr(USER(),1); +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT u1, COUNT(DISTINCT d1) FROM t1 GROUP BY u1; +u1 COUNT(DISTINCT d1) +root@localhost 1 +ALTER TABLE t1 ADD COLUMN d2 TIMESTAMP DEFAULT '2017-05-08 16:23:45', +LOCK=NONE; +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +ALTER TABLE t1 ADD COLUMN d3 TIMESTAMP DEFAULT d1, LOCK=NONE; +ERROR 0A000: LOCK=NONE is not supported for this operation. Try LOCK=SHARED +ALTER TABLE t1 ADD COLUMN d3 TIMESTAMP DEFAULT d1, ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported for this operation. Try ALGORITHM=COPY +ALTER TABLE t1 ADD COLUMN d3 TIMESTAMP DEFAULT d1; +affected rows: 5 +info: Records: 5 Duplicates: 0 Warnings: 0 +SELECT d1-d3, d2 FROM t1; +d1-d3 d2 +0 2017-05-08 16:23:45 +0 2017-05-08 16:23:45 +0 2017-05-08 16:23:45 +0 2017-05-08 16:23:45 +0 2017-05-08 16:23:45 +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `i1` int(10) unsigned NOT NULL, + `d1` timestamp NOT NULL DEFAULT current_timestamp(), + `u1` varchar(30) DEFAULT substr(user(),1), + `d2` timestamp NOT NULL DEFAULT '2017-05-08 16:23:45', + `d3` timestamp NOT NULL DEFAULT `d1` +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +ALTER TABLE t1 ADD COLUMN d4 TIMESTAMP DEFAULT CURRENT_TIMESTAMP; +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT COUNT(DISTINCT d4),COUNT(d4),COUNT(*) FROM t1; +COUNT(DISTINCT d4) COUNT(d4) COUNT(*) +1 5 5 +SELECT DISTINCT (CURRENT_TIMESTAMP()-d4) <= 60 FROM t1; +(CURRENT_TIMESTAMP()-d4) <= 60 +1 +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/innodb-alter.result b/mysql-test/suite/innodb/r/innodb-alter.result new file mode 100644 index 00000000000..aa78f55c78f --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb-alter.result @@ -0,0 +1,859 @@ +SET NAMES utf8mb4; +CREATE TABLE t1 ( +c1 INT PRIMARY KEY, c2 INT DEFAULT 1, ct TEXT, +INDEX(c2)) +ENGINE=InnoDB; +INSERT INTO t1 SET c1=1; +CREATE TABLE sys_tables SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES +WHERE NAME LIKE 'test/t%'; +CREATE TABLE sys_indexes SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +CREATE TABLE t1p LIKE t1; +CREATE TABLE t1c (c1 INT PRIMARY KEY, c2 INT, c3 INT, INDEX(c2), INDEX(c3), +CONSTRAINT t1c2 FOREIGN KEY (c2) REFERENCES t1(c2), +CONSTRAINT t1c3 FOREIGN KEY (c3) REFERENCES t1p(c2)) +ENGINE=InnoDB; +CREATE TABLE sys_foreign SELECT i.* +FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN i +WHERE FOR_NAME LIKE 'test/t%'; +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 c2 0 +test/t1c3 c3 c2 0 +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +c2 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +c2 0 c2 +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 c2 0 +test/t1c3 c3 c2 0 +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL, + `c2` int(11) DEFAULT 1, + `ct` text DEFAULT NULL, + PRIMARY KEY (`c1`), + KEY `c2` (`c2`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +ALTER TABLE t1 ALTER c2 DROP DEFAULT; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL, + `c2` int(11), + `ct` text DEFAULT NULL, + PRIMARY KEY (`c1`), + KEY `c2` (`c2`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +c2 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +c2 0 c2 +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 c2 0 +test/t1c3 c3 c2 0 +ALTER TABLE t1 CHANGE c2 c2 INT AFTER c1; +ALTER TABLE t1 CHANGE c1 c1 INT FIRST; +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +c2 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +c2 0 c2 +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 c2 0 +test/t1c3 c3 c2 0 +ALTER TABLE t1 CHANGE C2 c3 INT; +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +c3 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +c2 0 c3 +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 c3 0 +test/t1c3 c3 c2 0 +ALTER TABLE t1 CHANGE c3 C INT; +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +C 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +c2 0 C +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 C 0 +test/t1c3 c3 c2 0 +ALTER TABLE t1 CHANGE C Cöŀumň_TWO INT; +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 Cöŀumň_TWO 0 +test/t1c3 c3 c2 0 +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +Cöŀumň_TWO 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +c2 0 Cöŀumň_TWO +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 Cöŀumň_TWO 0 +test/t1c3 c3 c2 0 +ALTER TABLE t1 CHANGE cöĿǖmň_two c3 INT; +ERROR 42S22: Unknown column 'cöĿǖmň_two' in 't1' +ALTER TABLE t1 CHANGE cÖĿUMŇ_two c3 INT, RENAME TO t3; +SELECT st.NAME, i.NAME +FROM sys_tables st INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES i +ON i.TABLE_ID=st.TABLE_ID; +NAME NAME +test/t1 test/t3 +SHOW CREATE TABLE t3; +Table Create Table +t3 CREATE TABLE `t3` ( + `c1` int(11) NOT NULL, + `c3` int(11) DEFAULT NULL, + `ct` text DEFAULT NULL, + PRIMARY KEY (`c1`), + KEY `c2` (`c3`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SHOW CREATE TABLE t1c; +Table Create Table +t1c CREATE TABLE `t1c` ( + `c1` int(11) NOT NULL, + `c2` int(11) DEFAULT NULL, + `c3` int(11) DEFAULT NULL, + PRIMARY KEY (`c1`), + KEY `c2` (`c2`), + KEY `c3` (`c3`), + CONSTRAINT `t1c2` FOREIGN KEY (`c2`) REFERENCES `t3` (`c3`), + CONSTRAINT `t1c3` FOREIGN KEY (`c3`) REFERENCES `t1p` (`c2`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +ALTER TABLE t3 CHANGE c3 +`12345678901234567890123456789012345678901234567890123456789012345` INT; +ERROR 42000: Identifier name '12345678901234567890123456789012345678901234567890123456789012345' is too long +ALTER TABLE t3 CHANGE c3 +`1234567890123456789012345678901234567890123456789012345678901234` INT; +SHOW CREATE TABLE t3; +Table Create Table +t3 CREATE TABLE `t3` ( + `c1` int(11) NOT NULL, + `1234567890123456789012345678901234567890123456789012345678901234` int(11) DEFAULT NULL, + `ct` text DEFAULT NULL, + PRIMARY KEY (`c1`), + KEY `c2` (`1234567890123456789012345678901234567890123456789012345678901234`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +ALTER TABLE t3 CHANGE +`1234567890123456789012345678901234567890123456789012345678901234` +`倀å€å€‚倃倄倅倆倇倈倉倊個倌å€å€Žå€å€å€‘倒倓倔倕倖倗倘候倚倛倜å€å€žå€Ÿå€ å€¡å€¢å€£å€¤å€¥å€¦å€§å€¨å€©å€ªå€«å€¬å€­å€®å€¯å€°å€±å€²å€³å€´å€µå€¶å€·å€¸å€¹å€ºå€»å€¼å€½å€¾å€¿å€` INT; +ERROR 42000: Identifier name '倀å€å€‚倃倄倅倆倇倈倉倊個倌å€å€Žå€å€å€‘倒倓倔倕倖倗倘候倚倛倜å€å€žå€Ÿå€ ' is too long +ALTER TABLE t3 CHANGE +`1234567890123456789012345678901234567890123456789012345678901234` +`倀å€å€‚倃倄倅倆倇倈倉倊個倌å€å€Žå€å€å€‘倒倓倔倕倖倗倘候倚倛倜å€å€žå€Ÿå€ å€¡å€¢å€£å€¤å€¥å€¦å€§å€¨å€©å€ªå€«å€¬å€­å€®å€¯å€°å€±å€²å€³å€´å€µå€¶å€·å€¸å€¹å€ºå€»å€¼å€½å€¾å€¿Ã¤` INT; +ERROR 42000: Identifier name '倀å€å€‚倃倄倅倆倇倈倉倊個倌å€å€Žå€å€å€‘倒倓倔倕倖倗倘候倚倛倜å€å€žå€Ÿå€ ' is too long +ALTER TABLE t3 CHANGE +`1234567890123456789012345678901234567890123456789012345678901234` +`倀å€å€‚倃倄倅倆倇倈倉倊個倌å€å€Žå€å€å€‘倒倓倔倕倖倗倘候倚倛倜å€å€žå€Ÿå€ å€¡å€¢å€£å€¤å€¥å€¦å€§å€¨å€©å€ªå€«å€¬å€­å€®å€¯å€°å€±å€²å€³å€´å€µå€¶å€·å€¸å€¹å€ºå€»å€¼å€½å€¾Ã¤` INT; +ALTER TABLE t3 CHANGE +`倀å€å€‚倃倄倅倆倇倈倉倊個倌å€å€Žå€å€å€‘倒倓倔倕倖倗倘候倚倛倜å€å€žå€Ÿå€ å€¡å€¢å€£å€¤å€¥å€¦å€§å€¨å€©å€ªå€«å€¬å€­å€®å€¯å€°å€±å€²å€³å€´å€µå€¶å€·å€¸å€¹å€ºå€»å€¼å€½å€¾Ã„` +c3 INT; +ALTER TABLE t3 CHANGE c3 ðŒ€ðŒðŒ‚ðŒƒðŒ„ðŒ…ðŒ†ðŒ‡ðŒˆðŒ‰ðŒŠðŒ‹ðŒŒðŒðŒŽðŒðŒðŒ‘ðŒ’ðŒ“ðŒ”ðŒ•ðŒ–ðŒ—ðŒ˜ðŒ™ðŒšðŒ›ðŒœ INT; +ERROR HY000: Invalid utf8mb4 character string: '\xF0\x90\x8C\x80\xF0\x90\x8C\x81\xF0\x90\x8C\x82\xF0\x90\x8C\x83' +ALTER TABLE t3 CHANGE c3 😲 INT; +ERROR HY000: Invalid utf8mb4 character string: '\xF0\x9F\x98\xB2' +ALTER TABLE t3 RENAME TO t2; +SELECT st.NAME, i.NAME +FROM sys_tables st INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES i +ON i.TABLE_ID=st.TABLE_ID; +NAME NAME +test/t1 test/t2 +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `c1` int(11) NOT NULL, + `c3` int(11) DEFAULT NULL, + `ct` text DEFAULT NULL, + PRIMARY KEY (`c1`), + KEY `c2` (`c3`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +RENAME TABLE t2 TO t1; +SELECT st.NAME, i.NAME +FROM sys_tables st INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES i +ON i.TABLE_ID=st.TABLE_ID; +NAME NAME +test/t1 test/t1 +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +c3 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +c2 0 c3 +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 c3 0 +test/t1c3 c3 c2 0 +ALTER TABLE t1 DROP INDEX c2; +ERROR HY000: Cannot drop index 'c2': needed in a foreign key constraint +ALTER TABLE t1 DROP INDEX c4; +ERROR 42000: Can't DROP INDEX `c4`; check that it exists +ALTER TABLE t1c DROP FOREIGN KEY c2; +ERROR 42000: Can't DROP FOREIGN KEY `c2`; check that it exists +ALTER TABLE t1c DROP FOREIGN KEY t1c2, DROP FOREIGN KEY c2; +ERROR 42000: Can't DROP FOREIGN KEY `c2`; check that it exists +ALTER TABLE t1c DROP FOREIGN KEY t1c2, DROP FOREIGN KEY c2, DROP INDEX c2; +ERROR 42000: Can't DROP FOREIGN KEY `c2`; check that it exists +ALTER TABLE t1c DROP INDEX c2; +ERROR HY000: Cannot drop index 'c2': needed in a foreign key constraint +ALTER TABLE t1c DROP FOREIGN KEY ẗ1C2; +ERROR 42000: Can't DROP FOREIGN KEY `ẗ1C2`; check that it exists +SHOW CREATE TABLE t1c; +Table Create Table +t1c CREATE TABLE `t1c` ( + `c1` int(11) NOT NULL, + `c2` int(11) DEFAULT NULL, + `c3` int(11) DEFAULT NULL, + PRIMARY KEY (`c1`), + KEY `c2` (`c2`), + KEY `c3` (`c3`), + CONSTRAINT `t1c2` FOREIGN KEY (`c2`) REFERENCES `t1` (`c3`), + CONSTRAINT `t1c3` FOREIGN KEY (`c3`) REFERENCES `t1p` (`c2`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SET foreign_key_checks=0; +DROP TABLE t1p; +SET foreign_key_checks=1; +SHOW CREATE TABLE t1c; +Table Create Table +t1c CREATE TABLE `t1c` ( + `c1` int(11) NOT NULL, + `c2` int(11) DEFAULT NULL, + `c3` int(11) DEFAULT NULL, + PRIMARY KEY (`c1`), + KEY `c2` (`c2`), + KEY `c3` (`c3`), + CONSTRAINT `t1c2` FOREIGN KEY (`c2`) REFERENCES `t1` (`c3`), + CONSTRAINT `t1c3` FOREIGN KEY (`c3`) REFERENCES `t1p` (`c2`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +c3 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +c2 0 c3 +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 c3 0 +test/t1c3 c3 c2 0 +CREATE TABLE t1p (c1 INT PRIMARY KEY, c2 INT, INDEX(c2)) ENGINE=InnoDB; +ALTER TABLE t1c DROP INDEX C2, DROP INDEX C3; +ERROR HY000: Cannot drop index 'c2': needed in a foreign key constraint +ALTER TABLE t1c DROP INDEX C3; +ERROR HY000: Cannot drop index 'c3': needed in a foreign key constraint +SET foreign_key_checks=0; +ALTER TABLE t1c DROP INDEX C3; +SET foreign_key_checks=1; +SHOW CREATE TABLE t1c; +Table Create Table +t1c CREATE TABLE `t1c` ( + `c1` int(11) NOT NULL, + `c2` int(11) DEFAULT NULL, + `c3` int(11) DEFAULT NULL, + PRIMARY KEY (`c1`), + KEY `c2` (`c2`), + CONSTRAINT `t1c2` FOREIGN KEY (`c2`) REFERENCES `t1` (`c3`), + CONSTRAINT `t1c3` FOREIGN KEY (`c3`) REFERENCES `t1p` (`c2`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +c3 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +c2 0 c3 +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 c3 0 +test/t1c3 c3 c2 0 +ALTER TABLE t1c DROP FOREIGN KEY t1C3; +SHOW CREATE TABLE t1c; +Table Create Table +t1c CREATE TABLE `t1c` ( + `c1` int(11) NOT NULL, + `c2` int(11) DEFAULT NULL, + `c3` int(11) DEFAULT NULL, + PRIMARY KEY (`c1`), + KEY `c2` (`c2`), + CONSTRAINT `t1c2` FOREIGN KEY (`c2`) REFERENCES `t1` (`c3`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +c3 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +c2 0 c3 +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 c3 0 +ALTER TABLE t1c DROP INDEX c2, DROP FOREIGN KEY t1C2; +SHOW CREATE TABLE t1c; +Table Create Table +t1c CREATE TABLE `t1c` ( + `c1` int(11) NOT NULL, + `c2` int(11) DEFAULT NULL, + `c3` int(11) DEFAULT NULL, + PRIMARY KEY (`c1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +c3 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +c2 0 c3 +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +ALTER TABLE t1 DROP INDEX c2, CHANGE c3 c2 INT; +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +c2 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +CREATE TABLE t1o LIKE t1; +ALTER TABLE t1 ADD FULLTEXT INDEX (ct), +CHANGE c1 pk INT, ALTER c2 SET DEFAULT 42, RENAME TO tt, +ALGORITHM=INPLACE, LOCK=NONE; +ERROR 0A000: LOCK=NONE is not supported. Reason: Fulltext index creation requires a lock. Try LOCK=SHARED +ALTER TABLE t1 ADD FULLTEXT INDEX (ct), +CHANGE c1 pk INT, ALTER c2 SET DEFAULT 42, RENAME TO tt, +ALGORITHM=INPLACE, LOCK=SHARED; +Warnings: +Warning 124 InnoDB rebuilding table to add column FTS_DOC_ID +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +SHOW CREATE TABLE tt; +Table Create Table +tt CREATE TABLE `tt` ( + `pk` int(11) NOT NULL, + `c2` int(11) DEFAULT 42, + `ct` text DEFAULT NULL, + PRIMARY KEY (`pk`), + FULLTEXT KEY `ct` (`ct`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +ALTER TABLE t1o CHANGE c1 dB_row_Id INT, ALGORITHM=COPY; +ERROR 42000: Incorrect column name 'dB_row_Id' +ALTER TABLE t1o CHANGE c1 dB_row_Id INT, ALGORITHM=INPLACE; +ERROR 42000: Incorrect column name 'DB_ROW_ID' +ALTER TABLE t1o CHANGE c1 DB_TRX_ID INT; +ERROR 42000: Incorrect column name 'DB_TRX_ID' +ALTER TABLE t1o CHANGE c1 db_roll_ptr INT; +ERROR 42000: Incorrect column name 'DB_ROLL_PTR' +ALTER TABLE t1o ADD COLUMN DB_TRX_ID INT; +ERROR 42000: Incorrect column name 'DB_TRX_ID' +ALTER TABLE t1o ADD COLUMN db_roll_ptr INT; +ERROR 42000: Incorrect column name 'db_roll_ptr' +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), ADD COLUMN FTS_DOC_ID BIGINT; +ERROR HY000: Column 'FTS_DOC_ID' is of wrong type for an InnoDB FULLTEXT index +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), ADD COLUMN FTS_DOC_ID BIGINT UNSIGNED; +ERROR HY000: Column 'FTS_DOC_ID' is of wrong type for an InnoDB FULLTEXT index +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), +ADD COLUMN FTS_DOC_ID BIGINT UNSIGNED NOT NULL; +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), ADD COLUMN FTS_DOC_ID INT; +ERROR 42S21: Duplicate column name 'FTS_DOC_ID' +ALTER TABLE t1o DROP COLUMN FTS_DOC_ID, ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot drop or rename FTS_DOC_ID. Try ALGORITHM=COPY +ALTER TABLE t1o DROP COLUMN FTS_DOC_ID, DROP INDEX ct, ALGORITHM=INPLACE; +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), ADD COLUMN cu TEXT; +Warnings: +Warning 124 InnoDB rebuilding table to add column FTS_DOC_ID +ALTER TABLE t1o ADD FULLTEXT INDEX(cu), ADD COLUMN FTS_DOC_ID BIGINT, +ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: InnoDB presently supports one FULLTEXT index creation at a time. Try ALGORITHM=COPY +ALTER TABLE t1o ADD FULLTEXT INDEX(cu), ADD COLUMN FTS_DOC_ID BIGINT; +ERROR 42000: Incorrect column name 'FTS_DOC_ID' +ALTER TABLE t1o ADD FULLTEXT INDEX(cu), ADD COLUMN FTS_DOC_ID BIGINT UNSIGNED, +ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: InnoDB presently supports one FULLTEXT index creation at a time. Try ALGORITHM=COPY +ALTER TABLE t1o ADD FULLTEXT INDEX(cu), ADD COLUMN FTS_DOC_ID BIGINT UNSIGNED; +ERROR 42000: Incorrect column name 'FTS_DOC_ID' +ALTER TABLE t1o ADD FULLTEXT INDEX(cu), +ADD COLUMN FTS_DOC_ID BIGINT UNSIGNED NOT NULL, ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: InnoDB presently supports one FULLTEXT index creation at a time. Try ALGORITHM=COPY +ALTER TABLE t1o ADD COLUMN FTS_DOC_ID BIGINT UNSIGNED NOT NULL, +ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: InnoDB presently supports one FULLTEXT index creation at a time. Try ALGORITHM=COPY +ALTER TABLE t1o ADD COLUMN FTS_DOC_ID BIGINT UNSIGNED NOT NULL; +ALTER TABLE t1o DROP COLUMN FTS_DOC_ID, ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot drop or rename FTS_DOC_ID. Try ALGORITHM=COPY +ALTER TABLE t1o DROP COLUMN FTS_DOC_ID; +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), CHANGE c1 FTS_DOC_ID INT, +ALGORITHM=COPY; +ERROR 42000: Incorrect column name 'FTS_DOC_ID' +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), CHANGE c1 FTS_DOC_ID INT, +ALGORITHM=INPLACE; +ERROR 42000: Incorrect column name 'FTS_DOC_ID' +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), CHANGE c1 FTS_Doc_ID INT, +ALGORITHM=INPLACE; +ERROR 42000: Incorrect column name 'FTS_DOC_ID' +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), +CHANGE c1 FTS_DOC_ID BIGINT UNSIGNED NOT NULL, +ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY +CREATE TABLE t1n LIKE t1o; +ALTER TABLE t1n ADD FULLTEXT INDEX(ct); +ALTER TABLE t1n CHANGE c1 Fts_DOC_ID INT, ALGORITHM=INPLACE; +ERROR 42000: Incorrect column name 'FTS_DOC_ID' +ALTER TABLE t1n CHANGE c1 Fts_DOC_ID INT, ALGORITHM=COPY; +ERROR 42000: Incorrect column name 'Fts_DOC_ID' +ALTER TABLE t1n CHANGE FTS_DOC_ID c11 INT, ALGORITHM=INPLACE; +ERROR 42S22: Unknown column 'FTS_DOC_ID' in 't1n' +ALTER TABLE t1n CHANGE c1 FTS_DOC_ïD INT, ALGORITHM=INPLACE; +ALTER TABLE t1n CHANGE FTS_DOC_ÃD c1 INT, ALGORITHM=INPLACE; +ALTER TABLE t1n CHANGE c1 c2 INT, CHANGE c2 ct INT, CHANGE ct c1 TEXT, +ALGORITHM=INPLACE; +SHOW CREATE TABLE t1n; +Table Create Table +t1n CREATE TABLE `t1n` ( + `c2` int(11) NOT NULL, + `ct` int(11) DEFAULT NULL, + `c1` text DEFAULT NULL, + `cu` text DEFAULT NULL, + PRIMARY KEY (`c2`), + FULLTEXT KEY `ct` (`c1`), + FULLTEXT KEY `ct_2` (`c1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +ALTER TABLE t1n CHANGE c2 c1 INT, CHANGE ct c2 INT, CHANGE c1 ct TEXT, +ALGORITHM=COPY; +SHOW CREATE TABLE t1n; +Table Create Table +t1n CREATE TABLE `t1n` ( + `c1` int(11) NOT NULL, + `c2` int(11) DEFAULT NULL, + `ct` text DEFAULT NULL, + `cu` text DEFAULT NULL, + PRIMARY KEY (`c1`), + FULLTEXT KEY `ct` (`ct`), + FULLTEXT KEY `ct_2` (`ct`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +ALTER TABLE t1n ADD INDEX(c2), CHANGE c2 c4 INT, ALGORITHM=INPLACE; +ERROR 42000: Key column 'c2' doesn't exist in table +ALTER TABLE t1n ADD INDEX(c2), CHANGE c2 c4 INT, ALGORITHM=COPY; +ERROR 42000: Key column 'c2' doesn't exist in table +ALTER TABLE t1n ADD INDEX(c4), CHANGE c2 c4 INT, ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: InnoDB presently supports one FULLTEXT index creation at a time. Try ALGORITHM=COPY +ALTER TABLE t1n CHANGE c2 c4 INT, LOCK=NONE; +ALTER TABLE t1n ADD INDEX(c4), LOCK=NONE; +SHOW CREATE TABLE t1n; +Table Create Table +t1n CREATE TABLE `t1n` ( + `c1` int(11) NOT NULL, + `c4` int(11) DEFAULT NULL, + `ct` text DEFAULT NULL, + `cu` text DEFAULT NULL, + PRIMARY KEY (`c1`), + KEY `c4` (`c4`), + FULLTEXT KEY `ct` (`ct`), + FULLTEXT KEY `ct_2` (`ct`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +ALTER TABLE t1n DROP INDEX c4; +ALTER TABLE t1n CHANGE c4 c1 INT, ADD INDEX(c1), ALGORITHM=INPLACE; +ERROR 42S21: Duplicate column name 'c1' +ALTER TABLE t1n CHANGE c4 c11 INT, ADD INDEX(c11), ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: InnoDB presently supports one FULLTEXT index creation at a time. Try ALGORITHM=COPY +ALTER TABLE t1n CHANGE c4 c11 INT, LOCK=NONE; +ALTER TABLE t1n ADD INDEX(c11), LOCK=NONE; +SHOW CREATE TABLE t1n; +Table Create Table +t1n CREATE TABLE `t1n` ( + `c1` int(11) NOT NULL, + `c11` int(11) DEFAULT NULL, + `ct` text DEFAULT NULL, + `cu` text DEFAULT NULL, + PRIMARY KEY (`c1`), + KEY `c11` (`c11`), + FULLTEXT KEY `ct` (`ct`), + FULLTEXT KEY `ct_2` (`ct`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +DROP TABLE t1n; +ALTER TABLE t1o MODIFY c1 BIGINT UNSIGNED NOT NULL, DROP INDEX ct, +ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY +ALTER TABLE t1o MODIFY c1 BIGINT UNSIGNED NOT NULL, DROP INDEX ct; +ALTER TABLE t1o CHANGE c1 FTS_DOC_ID BIGINT UNSIGNED NOT NULL, +ALGORITHM=INPLACE; +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), ALGORITHM=INPLACE; +ALTER TABLE t1o CHANGE FTS_DOC_ID foo_id BIGINT UNSIGNED NOT NULL, +ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot drop or rename FTS_DOC_ID. Try ALGORITHM=COPY +SELECT sc.pos FROM information_schema.innodb_sys_columns sc +INNER JOIN information_schema.innodb_sys_tables st +ON sc.TABLE_ID=st.TABLE_ID +WHERE st.NAME='test/t1o' AND sc.NAME='FTS_DOC_ID'; +pos +0 +SHOW CREATE TABLE t1o; +Table Create Table +t1o CREATE TABLE `t1o` ( + `FTS_DOC_ID` bigint(20) unsigned NOT NULL, + `c2` int(11) DEFAULT NULL, + `ct` text DEFAULT NULL, + `cu` text DEFAULT NULL, + PRIMARY KEY (`FTS_DOC_ID`), + FULLTEXT KEY `ct` (`ct`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +ALTER TABLE t1o CHANGE FTS_DOC_ID foo_id BIGINT UNSIGNED NOT NULL, +DROP INDEX ct, ALGORITHM=INPLACE; +SHOW CREATE TABLE t1o; +Table Create Table +t1o CREATE TABLE `t1o` ( + `foo_id` bigint(20) unsigned NOT NULL, + `c2` int(11) DEFAULT NULL, + `ct` text DEFAULT NULL, + `cu` text DEFAULT NULL, + PRIMARY KEY (`foo_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +DROP TABLE t1c, t1p, sys_tables, sys_indexes, sys_foreign; +CREATE TABLE sys_tables SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES +WHERE NAME='test/t1o'; +CREATE TABLE sys_indexes SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +CREATE TABLE sys_foreign SELECT i.* +FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN i WHERE FOR_NAME='test/t1o'; +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +foo_id 0 6 1800 8 +c2 1 6 1027 4 +ct 2 5 524540 10 +cu 3 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 foo_id +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +ALTER TABLE t1o ADD UNIQUE INDEX FTS_DOC_ID_INDEX(FTS_DOC_ID), +ADD FULLTEXT INDEX(ct), +CHANGE foo_id FTS_DOC_ID BIGINT UNSIGNED NOT NULL; +ALTER TABLE t1o DROP INDEX ct, DROP INDEX FTS_DOC_ID_INDEX, +CHANGE FTS_DOC_ID foo_id BIGINT UNSIGNED NOT NULL; +ALTER TABLE t1o ADD UNIQUE INDEX FTS_DOC_ID_INDEX(foo_id); +call mtr.add_suppression("InnoDB: No matching column for `FTS_DOC_ID` in index `ct` of table `test`\\.`t1o`"); +ALTER TABLE t1o CHANGE foo_id FTS_DOC_ID BIGINT UNSIGNED NOT NULL, +ADD FULLTEXT INDEX(ct); +ERROR HY000: Index for table 't1o' is corrupt; try to repair it +DROP TABLE sys_indexes; +CREATE TABLE sys_indexes SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +DROP TABLE tt, t1o, sys_tables, sys_indexes, sys_foreign; +CREATE TABLE t (t TEXT, FULLTEXT(t)) ENGINE=InnoDB; +DROP INDEX t ON t; +SELECT SUBSTRING(name, LOCATE('_', name) - 3, 5) AS prefix, name +FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES +WHERE name LIKE '%FTS_%' ORDER BY 1, 2; +prefix name +FTS_0 test/FTS_AUX_BEING_DELETED +FTS_0 test/FTS_AUX_BEING_DELETED_CACHE +FTS_0 test/FTS_AUX_CONFIG +FTS_0 test/FTS_AUX_DELETED +FTS_0 test/FTS_AUX_DELETED_CACHE +SELECT sc.pos, sc.NAME FROM information_schema.innodb_sys_columns sc +INNER JOIN information_schema.innodb_sys_tables st +ON sc.TABLE_ID=st.TABLE_ID +WHERE st.NAME='test/t'; +pos NAME +0 t +1 FTS_DOC_ID +ALTER TABLE t ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE; +SELECT SUBSTRING(name, LOCATE('_', name) - 3, 5) AS prefix, name +FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES +WHERE name LIKE '%FTS_%' ORDER BY 1, 2; +prefix name +ALTER TABLE t ADD FULLTEXT INDEX(t); +Warnings: +Warning 124 InnoDB rebuilding table to add column FTS_DOC_ID +SELECT sc.pos, sc.NAME FROM information_schema.innodb_sys_columns sc +INNER JOIN information_schema.innodb_sys_tables st +ON sc.TABLE_ID=st.TABLE_ID +WHERE st.NAME='test/t'; +pos NAME +0 t +1 FTS_DOC_ID +DROP TABLE t; +# +# Bug #19465984 INNODB DATA DICTIONARY IS NOT UPDATED WHILE +# RENAMING THE COLUMN +# +CREATE TABLE t1(c1 INT NOT NULL, PRIMARY KEY(c1))ENGINE=INNODB; +CREATE TABLE t2(c2 INT NOT NULL, FOREIGN KEY(c2) REFERENCES t1(c1))ENGINE=INNODB; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL, + PRIMARY KEY (`c1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `c2` int(11) NOT NULL, + KEY `c2` (`c2`), + CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`c2`) REFERENCES `t1` (`c1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +ALTER TABLE t1 CHANGE COLUMN c1 C1 INT; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `C1` int(11) NOT NULL, + PRIMARY KEY (`C1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `c2` int(11) NOT NULL, + KEY `c2` (`c2`), + CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`c2`) REFERENCES `t1` (`c1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `C1` int(11) NOT NULL, + PRIMARY KEY (`C1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `c2` int(11) NOT NULL, + KEY `c2` (`c2`), + CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`c2`) REFERENCES `t1` (`c1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +DROP TABLE t2, t1; +# +# BUG 20029625 - HANDLE_FATAL_SIGNAL (SIG=11) IN +# DICT_MEM_TABLE_COL_RENAME_LOW +# +CREATE TABLE parent(a INT, b INT, KEY(a, b)) ENGINE = InnoDB; +CREATE TABLE t1(a1 INT, a2 INT) ENGINE = InnoDB; +set foreign_key_checks=0; +ALTER TABLE t1 ADD CONSTRAINT fk_a FOREIGN KEY(a1, a2) REFERENCES parent(a, b) ON DELETE SET NULL ON UPDATE CASCADE; +ALTER TABLE t1 CHANGE a2 a3 INT,ADD CONSTRAINT fk_1 FOREIGN KEY(a1, a3) REFERENCES parent(a, b) ON DELETE SET NULL ON UPDATE CASCADE; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a1` int(11) DEFAULT NULL, + `a3` int(11) DEFAULT NULL, + KEY `fk_1` (`a1`,`a3`), + CONSTRAINT `fk_1` FOREIGN KEY (`a1`, `a3`) REFERENCES `parent` (`a`, `b`) ON DELETE SET NULL ON UPDATE CASCADE, + CONSTRAINT `fk_a` FOREIGN KEY (`a1`, `a3`) REFERENCES `parent` (`a`, `b`) ON DELETE SET NULL ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +ALTER TABLE t1 CHANGE a3 a4 INT; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a1` int(11) DEFAULT NULL, + `a4` int(11) DEFAULT NULL, + KEY `fk_1` (`a1`,`a4`), + CONSTRAINT `fk_1` FOREIGN KEY (`a1`, `a4`) REFERENCES `parent` (`a`, `b`) ON DELETE SET NULL ON UPDATE CASCADE, + CONSTRAINT `fk_a` FOREIGN KEY (`a1`, `a4`) REFERENCES `parent` (`a`, `b`) ON DELETE SET NULL ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +ALTER TABLE parent CHANGE b c INT; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a1` int(11) DEFAULT NULL, + `a4` int(11) DEFAULT NULL, + KEY `fk_1` (`a1`,`a4`), + CONSTRAINT `fk_1` FOREIGN KEY (`a1`, `a4`) REFERENCES `parent` (`a`, `c`) ON DELETE SET NULL ON UPDATE CASCADE, + CONSTRAINT `fk_a` FOREIGN KEY (`a1`, `a4`) REFERENCES `parent` (`a`, `c`) ON DELETE SET NULL ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +DROP TABLE t1, parent; +# +#BUG#21514135 SCHEMA MISMATCH ERROR WHEN IMPORTING TABLESPACE AFTER +#DROPPING AN INDEX +# +CREATE DATABASE source_db; +CREATE DATABASE dest_db; +CREATE TABLE source_db.t1 ( +id int(11) NOT NULL, +age int(11) DEFAULT NULL, +name varchar(20), +PRIMARY KEY (id), +KEY index1 (age) +) ENGINE=InnoDB; +ALTER TABLE source_db.t1 DROP INDEX index1, ADD INDEX index2(name, age), algorithm=inplace; +FLUSH TABLES source_db.t1 FOR EXPORT; +UNLOCK TABLES; +USE dest_db; +CREATE TABLE `t1` ( + `id` int(11) NOT NULL, + `age` int(11) DEFAULT NULL, + `name` varchar(20) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `index2` (`name`,`age`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +ALTER TABLE dest_db.t1 DISCARD TABLESPACE; +ALTER TABLE dest_db.t1 IMPORT TABLESPACE; +CHECK TABLE dest_db.t1; +Table Op Msg_type Msg_text +dest_db.t1 check status OK +SHOW CREATE TABLE dest_db.t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(11) NOT NULL, + `age` int(11) DEFAULT NULL, + `name` varchar(20) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `index2` (`name`,`age`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT * FROM dest_db.t1; +id age name +DROP TABLE dest_db.t1; +ALTER TABLE source_db.t1 DROP INDEX index2, algorithm=inplace; +FLUSH TABLES source_db.t1 FOR EXPORT; +UNLOCK TABLES; +USE dest_db; +CREATE TABLE `t1` ( + `id` int(11) NOT NULL, + `age` int(11) DEFAULT NULL, + `name` varchar(20) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +ALTER TABLE dest_db.t1 DISCARD TABLESPACE; +ALTER TABLE dest_db.t1 IMPORT TABLESPACE; +CHECK TABLE dest_db.t1; +Table Op Msg_type Msg_text +dest_db.t1 check status OK +SHOW CREATE TABLE dest_db.t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(11) NOT NULL, + `age` int(11) DEFAULT NULL, + `name` varchar(20) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT * FROM dest_db.t1; +id age name +DROP TABLE dest_db.t1; +DROP TABLE source_db.t1; +DROP DATABASE source_db; +DROP DATABASE dest_db; diff --git a/mysql-test/suite/innodb/r/innodb-blob.result b/mysql-test/suite/innodb/r/innodb-blob.result index ec37492c279..d48bfdf0f80 100644 --- a/mysql-test/suite/innodb/r/innodb-blob.result +++ b/mysql-test/suite/innodb/r/innodb-blob.result @@ -97,6 +97,12 @@ SELECT info FROM information_schema.processlist WHERE state = 'debug sync point: before_row_upd_extern'; info UPDATE t3 SET c=REPEAT('i',3000) WHERE a=2 +connect con3,localhost,root,,; +SET GLOBAL innodb_flush_log_at_trx_commit=1; +DELETE FROM t1; +ROLLBACK; +disconnect con3; +connection con2; disconnect con2; connection default; ERROR HY000: Lost connection to MySQL server during query diff --git a/mysql-test/suite/innodb/r/innodb-enlarge-blob.result b/mysql-test/suite/innodb/r/innodb-enlarge-blob.result new file mode 100644 index 00000000000..8c8e9cf5007 --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb-enlarge-blob.result @@ -0,0 +1,18 @@ +CREATE TABLE t1 (a LONGTEXT) ENGINE=INNODB ROW_FORMAT=REDUNDANT; +SHOW WARNINGS; +Level Code Message +INSERT INTO t1 SET a=CONCAT('A', SPACE(8000), 'B'); +INSERT INTO t1 SELECT a FROM t1; +UPDATE t1 SET a=CONCAT(a, RAND(), a); +UPDATE t1 SET a=CONCAT(a, RAND(), a); +SELECT * from t1; +DROP TABLE t1; +CREATE TABLE t1 (a LONGTEXT) ENGINE=INNODB ROW_FORMAT=DYNAMIC; +SHOW WARNINGS; +Level Code Message +INSERT INTO t1 SET a=CONCAT('A', SPACE(8000), 'B'); +INSERT INTO t1 SELECT a FROM t1; +UPDATE t1 SET a=CONCAT(a, RAND(), a); +UPDATE t1 SET a=CONCAT(a, RAND(), a); +SELECT * from t1; +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/innodb-index-debug.result b/mysql-test/suite/innodb/r/innodb-index-debug.result new file mode 100644 index 00000000000..172e4ebf454 --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb-index-debug.result @@ -0,0 +1,297 @@ +CREATE TABLE t1(c1 INT NOT NULL, c2 INT, PRIMARY KEY(c1)) Engine=InnoDB; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL, + `c2` int(11) DEFAULT NULL, + PRIMARY KEY (`c1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +INSERT INTO t1 VALUES (1,1),(2,2),(3,3),(4,4),(5,5); +SET @saved_debug_dbug = @@SESSION.debug_dbug; +SET DEBUG_DBUG='+d,ib_build_indexes_too_many_concurrent_trxs, ib_rename_indexes_too_many_concurrent_trxs, ib_drop_index_too_many_concurrent_trxs'; +ALTER TABLE t1 ADD UNIQUE INDEX(c2); +ERROR HY000: Too many active concurrent transactions +SET DEBUG_DBUG = @saved_debug_dbug; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL, + `c2` int(11) DEFAULT NULL, + PRIMARY KEY (`c1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +DROP TABLE t1; +CREATE TABLE bug13861218 (c1 INT NOT NULL, c2 INT NOT NULL, INDEX(c2)) +ENGINE=InnoDB; +INSERT INTO bug13861218 VALUES (8, 0), (4, 0), (0, 0); +SET DEBUG_DBUG = '+d,ib_row_merge_buf_add_two'; +CREATE UNIQUE INDEX ui ON bug13861218(c1); +SET DEBUG_DBUG = @saved_debug_dbug; +DROP TABLE bug13861218; +CREATE TABLE bug13861218 (c1 INT NOT NULL, c2 INT UNIQUE) ENGINE=InnoDB; +INSERT INTO bug13861218 VALUES (8, NULL), (4, NULL), (0, NULL); +SET DEBUG_DBUG = '+d,ib_row_merge_buf_add_two'; +CREATE UNIQUE INDEX ui ON bug13861218(c1); +SET DEBUG_DBUG = @saved_debug_dbug; +DROP TABLE bug13861218; +# +# Bug #17657223 EXCESSIVE TEMPORARY FILE USAGE IN ALTER TABLE +# +create table t480(a serial)engine=innodb; +insert into t480 +values(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(), +(),(),(),(),(),(),(),(); +insert into t480 select 0 from t480; +insert into t480 select 0 from t480; +insert into t480 select 0 from t480; +insert into t480 select 0 from t480; +create table t1(f1 int auto_increment not null, +f2 char(200) not null, f3 char(200) not null, +primary key(f1,f2,f3), key(f1))engine=innodb; +insert into t1 select NULL,'aaa','bbb' from t480; +insert into t1 select NULL,'aaaa','bbbb' from t480; +insert into t1 select NULL,'aaaaa','bbbbb' from t480; +insert into t1 select NULL,'aaaaaa','bbbbbb' from t480; +SET DEBUG_DBUG = '+d,row_merge_write_failure'; +alter table t1 drop primary key,add primary key(f2,f1); +ERROR HY000: Temporary file write failure +SET DEBUG_DBUG = @saved_debug_dbug; +drop table t1; +connect con1,localhost,root; +create table t1(k1 int auto_increment primary key, +k2 char(200),k3 char(200))engine=innodb; +insert into t1 values(NULL,'a','b'), (NULL,'aa','bb'); +SET DEBUG_SYNC= 'row_merge_after_scan +SIGNAL opened WAIT_FOR flushed'; +optimize table t1; +connection default; +SET DEBUG_SYNC= 'now WAIT_FOR opened'; +INSERT INTO t1 select NULL,'aaa','bbb' from t480; +SET DEBUG_SYNC= 'now SIGNAL flushed'; +connection con1; +/*con1 reap*/ Optimize table t1; +Table Op Msg_type Msg_text +test.t1 optimize note Table does not support optimize, doing recreate + analyze instead +test.t1 optimize status OK +affected rows: 2 +SELECT COUNT(k1),k2,k3 FROM t1 GROUP BY k2,k3; +COUNT(k1) k2 k3 +1 a b +1 aa bb +480 aaa bbb +drop table t1; +create table t1(k1 int auto_increment primary key, +k2 char(200),k3 char(200))engine=innodb; +SET DEBUG_SYNC= 'row_merge_after_scan +SIGNAL opened WAIT_FOR flushed'; +ALTER TABLE t1 ADD COLUMN k4 int; +connection default; +SET DEBUG_SYNC= 'now WAIT_FOR opened'; +SET debug = '+d,row_log_tmpfile_fail'; +Warnings: +Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead +INSERT INTO t1 select NULL,'aaa','bbb' from t480; +INSERT INTO t1 select NULL,'aaaa','bbbb' from t480; +SET DEBUG_SYNC= 'now SIGNAL flushed'; +SET DEBUG_DBUG = @saved_debug_dbug; +connection con1; +/*con1 reap*/ ALTER TABLE t1 ADD COLUMN k4 int; +ERROR HY000: Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space +SELECT COUNT(k1),k2,k3 FROM t1 GROUP BY k2,k3; +COUNT(k1) k2 k3 +480 aaa bbb +480 aaaa bbbb +disconnect con1; +connection default; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `k1` int(11) NOT NULL AUTO_INCREMENT, + `k2` char(200) DEFAULT NULL, + `k3` char(200) DEFAULT NULL, + PRIMARY KEY (`k1`) +) ENGINE=InnoDB AUTO_INCREMENT=1023 DEFAULT CHARSET=latin1 +drop table t1; +drop table t480; +SET DEBUG_SYNC='RESET'; +# +# BUG#21612714 ALTER TABLE SORTING SKIPPED WHEN CHANGE PK AND DROP +# LAST COLUMN OF OLD PK +# +SET DEBUG_DBUG = '+d,innodb_alter_table_pk_assert_no_sort'; +create table t1(o1 varchar(10), primary key(o1(2))) engine = innodb; +insert into t1 values('abd'), ('acd'); +alter table t1 drop primary key, add primary key(o1(3)), lock=none; +drop table t1; +create table t1(o1 varchar(10), primary key(o1(2))) engine = innodb; +insert into t1 values('abd'), ('acd'); +alter table t1 drop primary key, add primary key(o1), lock=none; +drop table t1; +create table t1(o1 varchar(10), primary key(o1(2))) engine = innodb; +insert into t1 values('abd'), ('acd'); +alter table t1 add n1 int not null, drop primary key, add primary key(o1(3), n1), lock=none; +drop table t1; +create table t1(o1 varchar(10), primary key(o1(2))) engine = innodb; +insert into t1 values('abd'), ('acd'); +alter table t1 add n1 int not null, drop primary key, add primary key(o1, n1), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int not null, primary key(o1(2))) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1(3), o2), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int not null, primary key(o1(2))) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1, o2), lock=none; +drop table t1; +create table t1(o1 varchar(10), primary key(o1(3))) engine = innodb; +insert into t1 values('abd'), ('acd'); +alter table t1 drop primary key, add primary key(o1(2)), lock=none; +drop table t1; +create table t1(o1 varchar(10), primary key(o1)) engine = innodb; +insert into t1 values('abd'), ('acd'); +alter table t1 drop primary key, add primary key(o1(2)), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, primary key(o1(3), o2)) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 drop primary key, add primary key(o1(2)), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, primary key(o1, o2)) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 drop primary key, add primary key(o1(2)), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, primary key(o1(3), o2)) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1(2),n1), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, primary key(o1, o2)) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1(2),n1), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, primary key(o1(3), o2)) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1(3),n1), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, primary key(o1, o2)) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1,n1), lock=none; +drop table t1; +create table t1(o1 int, o2 varchar(10), primary key(o1,o2(3))) engine = innodb; +insert into t1 values(1,'abd'), (2,'acd'); +alter table t1 drop primary key, add primary key(o1,o2(2)), lock=none; +drop table t1; +create table t1(o1 int, o2 varchar(10), primary key(o1,o2)) engine = innodb; +insert into t1 values(1,'abd'), (2,'acd'); +alter table t1 drop primary key, add primary key(o1,o2(2)), lock=none; +drop table t1; +create table t1(o1 int, o2 varchar(10), primary key(o1,o2(2))) engine = innodb; +insert into t1 values(1, 'abd'), (2, 'acd'); +alter table t1 drop primary key, add primary key(o1,o2(3)), lock=none; +drop table t1; +create table t1(o1 int, o2 varchar(10), primary key(o1,o2(2))) engine = innodb; +insert into t1 values(1, 'abd'), (2, 'acd'); +alter table t1 drop primary key, add primary key(o1,o2), lock=none; +drop table t1; +create table t1(o1 int, o2 varchar(10), o3 int, primary key(o1,o2(3),o3)) engine = innodb; +insert into t1 values(1, 'abd', 1), (2, 'acd', 2); +alter table t1 drop primary key, add primary key(o1,o2(2)), lock=none; +drop table t1; +create table t1(o1 int, o2 varchar(10), o3 int, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1, 'abd', 1), (2, 'acd', 2); +alter table t1 drop primary key, add primary key(o1,o2(2)), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 varchar(10), primary key(o1(3),o2(3))) engine = innodb; +insert into t1 values('abd', 'acd'), ('acd', 'abd'); +alter table t1 drop primary key, add primary key(o1(3),o2(2)), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 varchar(10), primary key(o1,o2)) engine = innodb; +insert into t1 values('abd', 'acd'), ('acd', 'abd'); +alter table t1 drop primary key, add primary key(o1,o2(2)), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 varchar(10), primary key(o1(3),o2(2))) engine = innodb; +insert into t1 values('abd', 'acd'), ('acd', 'abd'); +alter table t1 drop primary key, add primary key(o1(3),o2(3)), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 varchar(10), primary key(o1,o2(2))) engine = innodb; +insert into t1 values('abd', 'acd'), ('acd', 'abd'); +alter table t1 drop primary key, add primary key(o1,o2), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, o3 varchar(10), primary key(o1(3),o2,o3(2))) engine = innodb; +insert into t1 values('abd', 1, 'acd'), ('acd', 2, 'abd'); +alter table t1 drop primary key, add primary key(o1(3),o2,o3(3)), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, o3 varchar(10), primary key(o1,o2,o3(2))) engine = innodb; +insert into t1 values('abd', 1, 'acd'), ('acd', 2, 'abd'); +alter table t1 drop primary key, add primary key(o1,o2,o3), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, o3 varchar(10), primary key(o1(3),o2,o3(3))) engine = innodb; +insert into t1 values('abd', 1, 'acd'), ('acd', 2, 'abd'); +alter table t1 drop primary key, add primary key(o1(3),o2,o3(2)), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, o3 varchar(10), primary key(o1,o2,o3(3))) engine = innodb; +insert into t1 values('abd', 1, 'acd'), ('acd', 2, 'abd'); +alter table t1 drop primary key, add primary key(o1,o2,o3(2)), lock=none; +drop table t1; +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 drop primary key, add primary key(o1,o2), lock=none; +drop table t1; +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1,n1), lock=none; +drop table t1; +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, drop primary key, add primary key(n1,o1), lock=none; +drop table t1; +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, add n2 int not null, drop primary key, add primary key(n1,o1,n2), lock=none; +drop table t1; +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, add n2 int not null, drop primary key, add primary key(n1,n2,o1), lock=none; +drop table t1; +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, add n2 int not null, drop primary key, add primary key(o1,n1,n2), lock=none; +drop table t1; +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1,o2,n1), lock=none; +drop table t1; +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1,n1,o2), lock=none; +drop table t1; +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, drop primary key, add primary key(n1,o1,o2), lock=none; +drop table t1; +create table t1(o1 int, o2 int not null, o3 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1,2),(2,2,1); +alter table t1 drop primary key, add primary key(o1,o2,o3), lock=none; +drop table t1; +create table t1(o1 int, o2 int not null, o3 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1,2),(2,2,1); +alter table t1 drop primary key, add primary key(o1,o3,o2), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1,1,2),(2,2,1); +alter table t1 drop primary key, add primary key(o1,o2), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int, o4 int not null, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1,1,2,2),(2,2,1,1); +alter table t1 add n1 int not null, drop primary key, add primary key(o1,o2,o3,o4), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1,1,2),(2,2,1); +alter table t1 add n1 int not null, drop primary key, add primary key(o1,o2,n1), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1,1,2),(2,2,1); +alter table t1 add n1 int not null, drop primary key, add primary key(o1,n1,o2), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1,1,2),(2,2,1); +alter table t1 drop primary key, add primary key(o1), lock=none; +drop table t1; +SET DEBUG_DBUG = @saved_debug_dbug; diff --git a/mysql-test/suite/innodb/r/innodb-index-online,crypt.rdiff b/mysql-test/suite/innodb/r/innodb-index-online,crypt.rdiff new file mode 100644 index 00000000000..166cdf7a8b6 --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb-index-online,crypt.rdiff @@ -0,0 +1,20 @@ +--- innodb-index-online.result ++++ innodb-index-online,crypt.reject +@@ -301,7 +301,7 @@ + @merge_encrypt_1>@merge_encrypt_0, @merge_decrypt_1>@merge_decrypt_0, + @rowlog_encrypt_1>@rowlog_encrypt_0; + sort_balance @merge_encrypt_1>@merge_encrypt_0 @merge_decrypt_1>@merge_decrypt_0 @rowlog_encrypt_1>@rowlog_encrypt_0 +-0 0 0 0 ++0 0 0 1 + SET DEBUG_SYNC = 'now SIGNAL dml2_done'; + connection con1; + ERROR HY000: Creating index 'c2e' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again +@@ -423,7 +423,7 @@ + @rowlog_encrypt_2-@rowlog_encrypt_1>0 as log_encrypted, + @rowlog_decrypt_2-@rowlog_decrypt_1>0 as log_decrypted; + sort_encrypted sort_decrypted log_encrypted log_decrypted +-0 0 0 0 ++0 0 1 1 + connection con1; + SELECT COUNT(c22f) FROM t1; + COUNT(c22f) diff --git a/mysql-test/suite/innodb/r/innodb-index-online-delete.result b/mysql-test/suite/innodb/r/innodb-index-online-delete.result new file mode 100644 index 00000000000..1c6e7c26acb --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb-index-online-delete.result @@ -0,0 +1,18 @@ +connect con1,localhost,root,,; +connection default; +CREATE TABLE t (a INT PRIMARY KEY, b INT NOT NULL) ENGINE=InnoDB; +INSERT INTO t VALUES(1,2),(2,3); +SET DEBUG_SYNC='alter_table_inplace_after_lock_downgrade SIGNAL do WAIT_FOR m'; +SET DEBUG_SYNC='innodb_after_inplace_alter_table SIGNAL scanned WAIT_FOR done'; +CREATE INDEX tb ON t(b); +connection con1; +SET DEBUG_SYNC='now WAIT_FOR do'; +SET DEBUG_SYNC='row_update_for_mysql_error SIGNAL m WAIT_FOR scanned'; +UPDATE t SET a=2 WHERE a=1; +ERROR 23000: Duplicate entry '2' for key 'PRIMARY' +call mtr.add_suppression('InnoDB: record in index .*tb was not found on rollback, trying to insert'); +SET DEBUG_SYNC='now SIGNAL done'; +disconnect con1; +connection default; +SET DEBUG_SYNC='RESET'; +DROP TABLE t; diff --git a/mysql-test/suite/innodb/r/innodb-index-online-fk.result b/mysql-test/suite/innodb/r/innodb-index-online-fk.result new file mode 100644 index 00000000000..359ce4a717c --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb-index-online-fk.result @@ -0,0 +1,608 @@ +CREATE TABLE parent (a INT PRIMARY KEY, b INT NOT NULL) ENGINE = InnoDB; +INSERT INTO parent VALUES(1,2),(2,3); +CREATE INDEX tb ON parent(b); +INSERT INTO parent VALUES(10,20),(20,30); +CREATE TABLE child (a1 INT PRIMARY KEY, a2 INT) ENGINE = InnoDB; +CREATE INDEX tb ON child(a2); +INSERT INTO child VALUES(10,20); +ALTER TABLE child ADD FOREIGN KEY(a2) REFERENCES parent(b), +ALGORITHM = INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Adding foreign keys needs foreign_key_checks=OFF. Try ALGORITHM=COPY +SET foreign_key_checks = 0; +ALTER TABLE child ADD CONSTRAINT fk_1 FOREIGN KEY (a2) +REFERENCES parent(b) ON DELETE SET NULL ON UPDATE CASCADE, +ALGORITHM = INPLACE; +SELECT * FROM information_schema.INNODB_SYS_FOREIGN; +ID FOR_NAME REF_NAME N_COLS TYPE +test/fk_1 test/child test/parent 1 6 +SELECT * FROM information_schema.INNODB_SYS_FOREIGN_COLS; +ID FOR_COL_NAME REF_COL_NAME POS +test/fk_1 a2 b 0 +ALTER TABLE child ADD CONSTRAINT fk_1 FOREIGN KEY (a2) +REFERENCES parent(b) ON DELETE SET NULL ON UPDATE CASCADE, +ALGORITHM = INPLACE; +ERROR HY000: Duplicate FOREIGN KEY constraint name 'test/fk_1' +SET foreign_key_checks = 1; +INSERT INTO child VALUES(1,2),(2,3); +INSERT INTO child VALUES(4,4); +ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`child`, CONSTRAINT `fk_1` FOREIGN KEY (`a2`) REFERENCES `parent` (`b`) ON DELETE SET NULL ON UPDATE CASCADE) +SELECT * FROM parent; +a b +1 2 +2 3 +10 20 +20 30 +SET foreign_key_checks = 0; +ALTER TABLE child ADD CONSTRAINT fk_20 FOREIGN KEY (a1, a2) +REFERENCES parent(a, b) ON DELETE CASCADE ON UPDATE CASCADE, +ALGORITHM = INPLACE; +ERROR HY000: Failed to add the foreign key constaint. Missing index for constraint 'fk_20' in the referenced table 'parent' +SHOW WARNINGS; +Level Code Message +Error 1822 Failed to add the foreign key constaint. Missing index for constraint 'fk_20' in the referenced table 'parent' +SHOW ERRORS; +Level Code Message +Error 1822 Failed to add the foreign key constaint. Missing index for constraint 'fk_20' in the referenced table 'parent' +CREATE INDEX idx1 on parent(a, b); +ALTER TABLE child ADD CONSTRAINT fk_10 FOREIGN KEY (a1, a2) +REFERENCES parent(a, b) ON DELETE CASCADE ON UPDATE CASCADE, +ALGORITHM = INPLACE; +ALTER TABLE child ADD CONSTRAINT fk_2 FOREIGN KEY (a1, a2) +REFERENCES parent(a, b) ON DELETE CASCADE ON UPDATE CASCADE, ADD INDEX idx1(a1,a2), +ALGORITHM = INPLACE; +ALTER TABLE child ADD CONSTRAINT fk_3 FOREIGN KEY (a1, a2) +REFERENCES parent(a, b) ON DELETE CASCADE ON UPDATE CASCADE; +SELECT * FROM information_schema.INNODB_SYS_FOREIGN; +ID FOR_NAME REF_NAME N_COLS TYPE +test/fk_1 test/child test/parent 1 6 +test/fk_10 test/child test/parent 2 5 +test/fk_2 test/child test/parent 2 5 +test/fk_3 test/child test/parent 2 5 +SELECT * FROM information_schema.INNODB_SYS_FOREIGN_COLS; +ID FOR_COL_NAME REF_COL_NAME POS +test/fk_1 a2 b 0 +test/fk_10 a1 a 0 +test/fk_10 a2 b 1 +test/fk_2 a1 a 0 +test/fk_2 a2 b 1 +test/fk_3 a1 a 0 +test/fk_3 a2 b 1 +SET foreign_key_checks = 1; +INSERT INTO child VALUES(5,4); +ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`child`, CONSTRAINT `fk_1` FOREIGN KEY (`a2`) REFERENCES `parent` (`b`) ON DELETE SET NULL ON UPDATE CASCADE) +SHOW CREATE TABLE child; +Table Create Table +child CREATE TABLE `child` ( + `a1` int(11) NOT NULL, + `a2` int(11) DEFAULT NULL, + PRIMARY KEY (`a1`), + KEY `tb` (`a2`), + KEY `idx1` (`a1`,`a2`), + CONSTRAINT `fk_1` FOREIGN KEY (`a2`) REFERENCES `parent` (`b`) ON DELETE SET NULL ON UPDATE CASCADE, + CONSTRAINT `fk_10` FOREIGN KEY (`a1`, `a2`) REFERENCES `parent` (`a`, `b`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `fk_2` FOREIGN KEY (`a1`, `a2`) REFERENCES `parent` (`a`, `b`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `fk_3` FOREIGN KEY (`a1`, `a2`) REFERENCES `parent` (`a`, `b`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +DELETE FROM parent where a = 1; +SELECT * FROM child; +a1 a2 +2 3 +10 20 +SET foreign_key_checks = 0; +SET @saved_debug_dbug = @@SESSION.debug_dbug; +SET DEBUG_DBUG = '+d,innodb_test_open_ref_fail'; +ALTER TABLE child ADD CONSTRAINT fk_4 FOREIGN KEY (a1, a2) +REFERENCES parent(a, b) ON DELETE CASCADE ON UPDATE CASCADE, +ALGORITHM = INPLACE; +SET DEBUG_DBUG = @saved_debug_dbug; +SELECT * FROM information_schema.INNODB_SYS_FOREIGN; +ID FOR_NAME REF_NAME N_COLS TYPE +test/fk_1 test/child test/parent 1 6 +test/fk_10 test/child test/parent 2 5 +test/fk_2 test/child test/parent 2 5 +test/fk_3 test/child test/parent 2 5 +test/fk_4 test/child test/parent 2 5 +SELECT * FROM information_schema.INNODB_SYS_FOREIGN_COLS; +ID FOR_COL_NAME REF_COL_NAME POS +test/fk_1 a2 b 0 +test/fk_10 a1 a 0 +test/fk_10 a2 b 1 +test/fk_2 a1 a 0 +test/fk_2 a2 b 1 +test/fk_3 a1 a 0 +test/fk_3 a2 b 1 +test/fk_4 a1 a 0 +test/fk_4 a2 b 1 +SELECT t2.name, t1.name FROM information_schema.innodb_sys_columns t1, information_schema.innodb_sys_tables t2 WHERE t1.table_id = t2.table_id AND t2.name LIKE "%child" ORDER BY t1.name; +name name +test/child a1 +test/child a2 +SELECT NAME FROM information_schema.INNODB_SYS_TABLES; +NAME +SYS_DATAFILES +SYS_FOREIGN +SYS_FOREIGN_COLS +SYS_TABLESPACES +SYS_VIRTUAL +mysql/innodb_index_stats +mysql/innodb_table_stats +test/child +test/parent +INSERT INTO child VALUES(5,4); +SET foreign_key_checks = 1; +INSERT INTO child VALUES(6,5); +ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`child`, CONSTRAINT `fk_1` FOREIGN KEY (`a2`) REFERENCES `parent` (`b`) ON DELETE SET NULL ON UPDATE CASCADE) +SET foreign_key_checks = 0; +CREATE TABLE `#parent` (a INT PRIMARY KEY, b INT NOT NULL) ENGINE = InnoDB; +CREATE INDEX tb ON `#parent`(a, b); +CREATE TABLE `#child` (a1 INT PRIMARY KEY, a2 INT) ENGINE = InnoDB; +CREATE INDEX tb ON `#child`(a1, a2); +SET DEBUG_DBUG = '+d,innodb_test_no_foreign_idx'; +ALTER TABLE `#child` ADD CONSTRAINT fk_40 FOREIGN KEY (a1, a2) +REFERENCES `#parent`(a, b) ON DELETE CASCADE ON UPDATE CASCADE, +ALGORITHM = INPLACE; +ERROR HY000: Failed to add the foreign key constaint. Missing index for constraint 'fk_40' in the foreign table '#child' +SET DEBUG_DBUG = @saved_debug_dbug; +SHOW ERRORS; +Level Code Message +Error 1821 Failed to add the foreign key constaint. Missing index for constraint 'fk_40' in the foreign table '#child' +SELECT * FROM information_schema.INNODB_SYS_FOREIGN; +ID FOR_NAME REF_NAME N_COLS TYPE +test/fk_1 test/child test/parent 1 6 +test/fk_10 test/child test/parent 2 5 +test/fk_2 test/child test/parent 2 5 +test/fk_3 test/child test/parent 2 5 +test/fk_4 test/child test/parent 2 5 +SELECT * FROM information_schema.INNODB_SYS_FOREIGN_COLS; +ID FOR_COL_NAME REF_COL_NAME POS +test/fk_1 a2 b 0 +test/fk_10 a1 a 0 +test/fk_10 a2 b 1 +test/fk_2 a1 a 0 +test/fk_2 a2 b 1 +test/fk_3 a1 a 0 +test/fk_3 a2 b 1 +test/fk_4 a1 a 0 +test/fk_4 a2 b 1 +SET DEBUG_DBUG = '+d,innodb_test_no_reference_idx'; +ALTER TABLE child ADD CONSTRAINT fk_42 FOREIGN KEY (a1, a2) +REFERENCES parent(a, b) ON DELETE CASCADE ON UPDATE CASCADE, +ALGORITHM = INPLACE; +ERROR HY000: Failed to add the foreign key constaint. Missing index for constraint 'fk_42' in the referenced table 'parent' +SET DEBUG_DBUG = @saved_debug_dbug; +SHOW ERRORS; +Level Code Message +Error 1822 Failed to add the foreign key constaint. Missing index for constraint 'fk_42' in the referenced table 'parent' +SET DEBUG_DBUG = '+d,innodb_test_wrong_fk_option'; +ALTER TABLE child ADD CONSTRAINT fk_42 FOREIGN KEY (a1, a2) +REFERENCES parent(a, b) ON DELETE CASCADE ON UPDATE CASCADE, +ALGORITHM = INPLACE; +ERROR HY000: Failed to add the foreign key constraint on table 'child'. Incorrect options in FOREIGN KEY constraint 'test/fk_42' +SET DEBUG_DBUG = @saved_debug_dbug; +SELECT * FROM information_schema.INNODB_SYS_FOREIGN; +ID FOR_NAME REF_NAME N_COLS TYPE +test/fk_1 test/child test/parent 1 6 +test/fk_10 test/child test/parent 2 5 +test/fk_2 test/child test/parent 2 5 +test/fk_3 test/child test/parent 2 5 +test/fk_4 test/child test/parent 2 5 +SELECT * FROM information_schema.INNODB_SYS_FOREIGN_COLS; +ID FOR_COL_NAME REF_COL_NAME POS +test/fk_1 a2 b 0 +test/fk_10 a1 a 0 +test/fk_10 a2 b 1 +test/fk_2 a1 a 0 +test/fk_2 a2 b 1 +test/fk_3 a1 a 0 +test/fk_3 a2 b 1 +test/fk_4 a1 a 0 +test/fk_4 a2 b 1 +SET DEBUG_DBUG = '+d,innodb_test_cannot_add_fk_system'; +ALTER TABLE `#child` ADD CONSTRAINT fk_43 FOREIGN KEY (a1, a2) +REFERENCES `#parent`(a, b) ON DELETE CASCADE ON UPDATE CASCADE, +ALGORITHM = INPLACE; +ERROR HY000: Failed to add the foreign key constraint 'test/fk_43' to system tables +SET DEBUG_DBUG = @saved_debug_dbug; +SHOW ERRORS; +Level Code Message +Error 1823 Failed to add the foreign key constraint 'test/fk_43' to system tables +DROP TABLE `#child`; +DROP TABLE `#parent`; +SET foreign_key_checks = 0; +ALTER TABLE child ADD CONSTRAINT fk_5 FOREIGN KEY (a2) REFERENCES parent(b) +ON DELETE SET NULL ON UPDATE CASCADE, +ADD CONSTRAINT fk_6 FOREIGN KEY (a1, a2) +REFERENCES parent(a, b) ON DELETE CASCADE ON UPDATE CASCADE, +ALGORITHM = INPLACE; +SELECT * FROM information_schema.INNODB_SYS_FOREIGN; +ID FOR_NAME REF_NAME N_COLS TYPE +test/fk_1 test/child test/parent 1 6 +test/fk_10 test/child test/parent 2 5 +test/fk_2 test/child test/parent 2 5 +test/fk_3 test/child test/parent 2 5 +test/fk_4 test/child test/parent 2 5 +test/fk_5 test/child test/parent 1 6 +test/fk_6 test/child test/parent 2 5 +SELECT * FROM information_schema.INNODB_SYS_FOREIGN_COLS; +ID FOR_COL_NAME REF_COL_NAME POS +test/fk_1 a2 b 0 +test/fk_10 a1 a 0 +test/fk_10 a2 b 1 +test/fk_2 a1 a 0 +test/fk_2 a2 b 1 +test/fk_3 a1 a 0 +test/fk_3 a2 b 1 +test/fk_4 a1 a 0 +test/fk_4 a2 b 1 +test/fk_5 a2 b 0 +test/fk_6 a1 a 0 +test/fk_6 a2 b 1 +DROP TABLE child; +DROP TABLE parent; +CREATE TABLE parent (a INT PRIMARY KEY, b INT NOT NULL) ENGINE = InnoDB; +INSERT INTO parent VALUES(1,2),(2,3); +CREATE INDEX tb ON parent(b); +INSERT INTO parent VALUES(10,20),(20,30); +CREATE TABLE child (a1 INT PRIMARY KEY, a2 INT) ENGINE = InnoDB; +CREATE INDEX tb ON child(a2); +INSERT INTO child VALUES(10,20); +SET foreign_key_checks = 0; +ALTER TABLE child DROP INDEX tb, ADD CONSTRAINT fk_4 FOREIGN KEY (a2) +REFERENCES parent(b) ON DELETE CASCADE ON UPDATE CASCADE, +ALGORITHM = INPLACE; +SHOW CREATE TABLE child; +Table Create Table +child CREATE TABLE `child` ( + `a1` int(11) NOT NULL, + `a2` int(11) DEFAULT NULL, + PRIMARY KEY (`a1`), + KEY `fk_4` (`a2`), + CONSTRAINT `fk_4` FOREIGN KEY (`a2`) REFERENCES `parent` (`b`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT * FROM information_schema.INNODB_SYS_FOREIGN; +ID FOR_NAME REF_NAME N_COLS TYPE +test/fk_4 test/child test/parent 1 5 +SELECT * FROM information_schema.INNODB_SYS_FOREIGN_COLS; +ID FOR_COL_NAME REF_COL_NAME POS +test/fk_4 a2 b 0 +SET foreign_key_checks = 1; +DROP TABLE child; +DROP TABLE parent; +CREATE TABLE parent (a INT PRIMARY KEY, b INT NOT NULL) ENGINE = InnoDB; +INSERT INTO parent VALUES(1,2),(2,3); +CREATE INDEX tb ON parent(b); +INSERT INTO parent VALUES(10,20),(20,30); +CREATE TABLE child (a1 INT PRIMARY KEY, a2 INT) ENGINE = InnoDB; +CREATE INDEX tb ON child(a2); +SET foreign_key_checks = 0; +ALTER TABLE child CHANGE a2 a3 INT, +ADD CONSTRAINT fk_1 FOREIGN KEY (a2) REFERENCES parent(b) +ON DELETE SET NULL ON UPDATE CASCADE, +ALGORITHM = INPLACE; +ERROR 42000: Key column 'a2' doesn't exist in table +ALTER TABLE child CHANGE a2 a3 INT, +ADD CONSTRAINT fk_1 FOREIGN KEY (a3) REFERENCES parent(b) +ON DELETE SET NULL ON UPDATE CASCADE, +ALGORITHM = INPLACE; +DROP TABLE child; +DROP TABLE parent; +CREATE TABLE parent (a INT PRIMARY KEY, b INT NOT NULL) ENGINE = InnoDB; +INSERT INTO parent VALUES(1,2),(2,3); +CREATE INDEX tb ON parent(b); +INSERT INTO parent VALUES(10,20),(20,30); +CREATE TABLE child (a1 INT NOT NULL, a2 INT) ENGINE = InnoDB; +CREATE INDEX tb ON child(a2); +SET foreign_key_checks = 0; +SET DEBUG_DBUG = '+d,innodb_test_cannot_add_fk_system'; +ALTER TABLE child ADD PRIMARY KEY idx (a3), CHANGE a1 a3 INT, +ADD CONSTRAINT fk_1 FOREIGN KEY (a2) REFERENCES parent(b) +ON DELETE SET NULL ON UPDATE CASCADE, +ALGORITHM = INPLACE; +ERROR HY000: Failed to add the foreign key constraint 'test/fk_1' to system tables +SET DEBUG_DBUG = @saved_debug_dbug; +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN; +ID FOR_NAME REF_NAME N_COLS TYPE +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS; +ID FOR_COL_NAME REF_COL_NAME POS +SELECT t2.name, t1.name FROM information_schema.innodb_sys_columns t1, information_schema.innodb_sys_tables t2 WHERE t1.table_id = t2.table_id AND t2.name LIKE "%child" ORDER BY t1.name; +name name +test/child a1 +test/child a2 +SELECT NAME FROM information_schema.INNODB_SYS_TABLES; +NAME +SYS_DATAFILES +SYS_FOREIGN +SYS_FOREIGN_COLS +SYS_TABLESPACES +SYS_VIRTUAL +mysql/innodb_index_stats +mysql/innodb_table_stats +test/child +test/parent +ALTER TABLE child ADD PRIMARY KEY idx (a3), CHANGE a1 a3 INT, +ADD CONSTRAINT fk_1 FOREIGN KEY (a2) REFERENCES parent(b) +ON DELETE SET NULL ON UPDATE CASCADE, +ALGORITHM = INPLACE; +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN; +ID FOR_NAME REF_NAME N_COLS TYPE +test/fk_1 test/child test/parent 1 6 +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS; +ID FOR_COL_NAME REF_COL_NAME POS +test/fk_1 a2 b 0 +SELECT t2.name, t1.name FROM information_schema.innodb_sys_columns t1, information_schema.innodb_sys_tables t2 WHERE t1.table_id = t2.table_id AND t2.name LIKE "%child" ORDER BY t1.name; +name name +test/child a2 +test/child a3 +SELECT NAME FROM information_schema.INNODB_SYS_TABLES; +NAME +SYS_DATAFILES +SYS_FOREIGN +SYS_FOREIGN_COLS +SYS_TABLESPACES +SYS_VIRTUAL +mysql/innodb_index_stats +mysql/innodb_table_stats +test/child +test/parent +SHOW CREATE TABLE child; +Table Create Table +child CREATE TABLE `child` ( + `a3` int(11) NOT NULL, + `a2` int(11) DEFAULT NULL, + PRIMARY KEY (`a3`), + KEY `tb` (`a2`), + CONSTRAINT `fk_1` FOREIGN KEY (`a2`) REFERENCES `parent` (`b`) ON DELETE SET NULL ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +DROP TABLE child; +CREATE TABLE child (a1 INT NOT NULL, a2 INT) ENGINE = InnoDB; +ALTER TABLE child ADD PRIMARY KEY idx (a1), +ADD CONSTRAINT fk_1 FOREIGN KEY (a2) REFERENCES parent(b) +ON DELETE SET NULL ON UPDATE CASCADE, +ALGORITHM = INPLACE; +SELECT * from information_schema.INNODB_SYS_FOREIGN; +ID FOR_NAME REF_NAME N_COLS TYPE +test/fk_1 test/child test/parent 1 6 +SELECT * from information_schema.INNODB_SYS_FOREIGN_COLS; +ID FOR_COL_NAME REF_COL_NAME POS +test/fk_1 a2 b 0 +SELECT t2.name, t1.name FROM information_schema.innodb_sys_columns t1, information_schema.innodb_sys_tables t2 WHERE t1.table_id = t2.table_id AND t2.name LIKE "%child" ORDER BY t1.name; +name name +test/child a1 +test/child a2 +SELECT NAME FROM information_schema.INNODB_SYS_TABLES; +NAME +SYS_DATAFILES +SYS_FOREIGN +SYS_FOREIGN_COLS +SYS_TABLESPACES +SYS_VIRTUAL +mysql/innodb_index_stats +mysql/innodb_table_stats +test/child +test/parent +SHOW CREATE TABLE child; +Table Create Table +child CREATE TABLE `child` ( + `a1` int(11) NOT NULL, + `a2` int(11) DEFAULT NULL, + PRIMARY KEY (`a1`), + KEY `fk_1` (`a2`), + CONSTRAINT `fk_1` FOREIGN KEY (`a2`) REFERENCES `parent` (`b`) ON DELETE SET NULL ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +DROP TABLE child; +CREATE TABLE child (a1 INT NOT NULL, a2 INT) ENGINE = InnoDB; +ALTER TABLE child CHANGE a1 a3 INT, +ADD CONSTRAINT fk_1 FOREIGN KEY (a3) REFERENCES parent(b) +ON DELETE SET NULL ON UPDATE CASCADE, +ALGORITHM = INPLACE; +SELECT * from information_schema.INNODB_SYS_FOREIGN; +ID FOR_NAME REF_NAME N_COLS TYPE +test/fk_1 test/child test/parent 1 6 +SELECT * from information_schema.INNODB_SYS_FOREIGN_COLS; +ID FOR_COL_NAME REF_COL_NAME POS +test/fk_1 a3 b 0 +SELECT t2.name, t1.name FROM information_schema.innodb_sys_columns t1, information_schema.innodb_sys_tables t2 WHERE t1.table_id = t2.table_id AND t2.name LIKE "%child" ORDER BY t1.name; +name name +test/child a2 +test/child a3 +SELECT NAME FROM information_schema.INNODB_SYS_TABLES; +NAME +SYS_DATAFILES +SYS_FOREIGN +SYS_FOREIGN_COLS +SYS_TABLESPACES +SYS_VIRTUAL +mysql/innodb_index_stats +mysql/innodb_table_stats +test/child +test/parent +SHOW CREATE TABLE child; +Table Create Table +child CREATE TABLE `child` ( + `a3` int(11) DEFAULT NULL, + `a2` int(11) DEFAULT NULL, + KEY `fk_1` (`a3`), + CONSTRAINT `fk_1` FOREIGN KEY (`a3`) REFERENCES `parent` (`b`) ON DELETE SET NULL ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +DROP TABLE child; +CREATE TABLE child (a1 INT NOT NULL, a2 INT) ENGINE = InnoDB; +ALTER TABLE child ADD PRIMARY KEY idx (a3), CHANGE a1 a3 INT, +ADD CONSTRAINT fk_1 FOREIGN KEY (a3) REFERENCES parent(b) +ON DELETE SET NULL ON UPDATE CASCADE, +ALGORITHM = INPLACE; +ERROR HY000: Failed to add the foreign key constraint on table 'child'. Incorrect options in FOREIGN KEY constraint 'test/fk_1' +DROP TABLE parent; +DROP TABLE child; +CREATE TABLE parent (a INT PRIMARY KEY, b INT NOT NULL, c INT) ENGINE = InnoDB; +INSERT INTO parent VALUES(1,2,3),(2,3,4); +CREATE INDEX tb ON parent(b); +CREATE TABLE child (a1 INT NOT NULL, a2 INT, a3 INT) ENGINE = InnoDB; +CREATE INDEX tb ON child(a2); +ALTER TABLE child +ADD CONSTRAINT fk_a FOREIGN KEY (a2) REFERENCES parent(b) +ON DELETE SET NULL ON UPDATE CASCADE, +ALGORITHM = INPLACE; +ALTER TABLE child +ADD CONSTRAINT fk_b FOREIGN KEY (a1) REFERENCES parent(a), +ALGORITHM = INPLACE; +ALTER TABLE child CHANGE a2 a2_new INT, CHANGE a1 a1_new INT; +SHOW CREATE TABLE child; +Table Create Table +child CREATE TABLE `child` ( + `a1_new` int(11) DEFAULT NULL, + `a2_new` int(11) DEFAULT NULL, + `a3` int(11) DEFAULT NULL, + KEY `tb` (`a2_new`), + KEY `fk_b` (`a1_new`), + CONSTRAINT `fk_a` FOREIGN KEY (`a2_new`) REFERENCES `parent` (`b`) ON DELETE SET NULL ON UPDATE CASCADE, + CONSTRAINT `fk_b` FOREIGN KEY (`a1_new`) REFERENCES `parent` (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT * from information_schema.INNODB_SYS_FOREIGN; +ID FOR_NAME REF_NAME N_COLS TYPE +test/fk_a test/child test/parent 1 6 +test/fk_b test/child test/parent 1 0 +SELECT * from information_schema.INNODB_SYS_FOREIGN_COLS; +ID FOR_COL_NAME REF_COL_NAME POS +test/fk_a a2_new b 0 +test/fk_b a1_new a 0 +ALTER TABLE child +ADD CONSTRAINT fk_new_1 FOREIGN KEY (a1_new) REFERENCES parent(b), +ADD CONSTRAINT fk_new_2 FOREIGN KEY (a2_new) REFERENCES parent(a), +ADD CONSTRAINT fk_new_3 FOREIGN KEY (a3) REFERENCES parent(c), +ALGORITHM = INPLACE; +ERROR HY000: Failed to add the foreign key constaint. Missing index for constraint 'fk_new_3' in the referenced table 'parent' +SHOW CREATE TABLE child; +Table Create Table +child CREATE TABLE `child` ( + `a1_new` int(11) DEFAULT NULL, + `a2_new` int(11) DEFAULT NULL, + `a3` int(11) DEFAULT NULL, + KEY `tb` (`a2_new`), + KEY `fk_b` (`a1_new`), + CONSTRAINT `fk_a` FOREIGN KEY (`a2_new`) REFERENCES `parent` (`b`) ON DELETE SET NULL ON UPDATE CASCADE, + CONSTRAINT `fk_b` FOREIGN KEY (`a1_new`) REFERENCES `parent` (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT * from information_schema.INNODB_SYS_FOREIGN; +ID FOR_NAME REF_NAME N_COLS TYPE +test/fk_a test/child test/parent 1 6 +test/fk_b test/child test/parent 1 0 +SELECT * from information_schema.INNODB_SYS_FOREIGN_COLS; +ID FOR_COL_NAME REF_COL_NAME POS +test/fk_a a2_new b 0 +test/fk_b a1_new a 0 +ALTER TABLE child +ADD CONSTRAINT fk_new_1 FOREIGN KEY (a1_new) REFERENCES parent(b), +ADD CONSTRAINT fk_new_2 FOREIGN KEY (a2_new) REFERENCES parent(a), +ADD CONSTRAINT fk_new_3 FOREIGN KEY (a3) REFERENCES parent(a), +ALGORITHM = INPLACE; +SHOW CREATE TABLE child; +Table Create Table +child CREATE TABLE `child` ( + `a1_new` int(11) DEFAULT NULL, + `a2_new` int(11) DEFAULT NULL, + `a3` int(11) DEFAULT NULL, + KEY `tb` (`a2_new`), + KEY `fk_new_1` (`a1_new`), + KEY `fk_new_3` (`a3`), + CONSTRAINT `fk_a` FOREIGN KEY (`a2_new`) REFERENCES `parent` (`b`) ON DELETE SET NULL ON UPDATE CASCADE, + CONSTRAINT `fk_b` FOREIGN KEY (`a1_new`) REFERENCES `parent` (`a`), + CONSTRAINT `fk_new_1` FOREIGN KEY (`a1_new`) REFERENCES `parent` (`b`), + CONSTRAINT `fk_new_2` FOREIGN KEY (`a2_new`) REFERENCES `parent` (`a`), + CONSTRAINT `fk_new_3` FOREIGN KEY (`a3`) REFERENCES `parent` (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT * from information_schema.INNODB_SYS_FOREIGN; +ID FOR_NAME REF_NAME N_COLS TYPE +test/fk_a test/child test/parent 1 6 +test/fk_b test/child test/parent 1 0 +test/fk_new_1 test/child test/parent 1 0 +test/fk_new_2 test/child test/parent 1 0 +test/fk_new_3 test/child test/parent 1 0 +SELECT * from information_schema.INNODB_SYS_FOREIGN_COLS; +ID FOR_COL_NAME REF_COL_NAME POS +test/fk_a a2_new b 0 +test/fk_b a1_new a 0 +test/fk_new_1 a1_new b 0 +test/fk_new_2 a2_new a 0 +test/fk_new_3 a3 a 0 +DROP TABLE child; +CREATE TABLE child (a1 INT NOT NULL, a2 INT, a3 INT) ENGINE = InnoDB; +CREATE INDEX tb ON child(a2); +ALTER TABLE child ADD PRIMARY KEY idx (a1), +ADD CONSTRAINT fk_new_1 FOREIGN KEY (a1) REFERENCES parent(b), +ADD CONSTRAINT fk_new_2 FOREIGN KEY (a2) REFERENCES parent(a), +ADD CONSTRAINT fk_new_3 FOREIGN KEY (a3) REFERENCES parent(c), +ALGORITHM = INPLACE; +ERROR HY000: Failed to add the foreign key constaint. Missing index for constraint 'fk_new_3' in the referenced table 'parent' +SHOW CREATE TABLE child; +Table Create Table +child CREATE TABLE `child` ( + `a1` int(11) NOT NULL, + `a2` int(11) DEFAULT NULL, + `a3` int(11) DEFAULT NULL, + KEY `tb` (`a2`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT * from information_schema.INNODB_SYS_FOREIGN; +ID FOR_NAME REF_NAME N_COLS TYPE +SELECT * from information_schema.INNODB_SYS_FOREIGN_COLS; +ID FOR_COL_NAME REF_COL_NAME POS +ALTER TABLE child ADD PRIMARY KEY idx (a1), +ADD CONSTRAINT fk_new_1 FOREIGN KEY (a1) REFERENCES parent(b), +ADD CONSTRAINT fk_new_2 FOREIGN KEY (a2) REFERENCES parent(a), +ADD CONSTRAINT fk_new_3 FOREIGN KEY (a3) REFERENCES parent(a), +ALGORITHM = INPLACE; +SHOW CREATE TABLE child; +Table Create Table +child CREATE TABLE `child` ( + `a1` int(11) NOT NULL, + `a2` int(11) DEFAULT NULL, + `a3` int(11) DEFAULT NULL, + PRIMARY KEY (`a1`), + KEY `tb` (`a2`), + KEY `fk_new_3` (`a3`), + CONSTRAINT `fk_new_1` FOREIGN KEY (`a1`) REFERENCES `parent` (`b`), + CONSTRAINT `fk_new_2` FOREIGN KEY (`a2`) REFERENCES `parent` (`a`), + CONSTRAINT `fk_new_3` FOREIGN KEY (`a3`) REFERENCES `parent` (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT * from information_schema.INNODB_SYS_FOREIGN; +ID FOR_NAME REF_NAME N_COLS TYPE +test/fk_new_1 test/child test/parent 1 0 +test/fk_new_2 test/child test/parent 1 0 +test/fk_new_3 test/child test/parent 1 0 +SELECT * from information_schema.INNODB_SYS_FOREIGN_COLS; +ID FOR_COL_NAME REF_COL_NAME POS +test/fk_new_1 a1 b 0 +test/fk_new_2 a2 a 0 +test/fk_new_3 a3 a 0 +SET foreign_key_checks = 1; +DROP TABLE child; +DROP TABLE parent; +CREATE TABLE Parent (a INT PRIMARY KEY, b INT NOT NULL) ENGINE = InnoDB; +INSERT INTO Parent VALUES(1,2),(2,3); +CREATE INDEX tb ON Parent(b); +INSERT INTO Parent VALUES(10,20),(20,30); +CREATE TABLE Child (a1 INT PRIMARY KEY, a2 INT) ENGINE = InnoDB; +CREATE INDEX tb ON Child(a2); +INSERT INTO Child VALUES(10,20); +SET foreign_key_checks = 0; +ALTER TABLE Child ADD CONSTRAINT fk_1 FOREIGN KEY (a2) +REFERENCES Parent(b) ON DELETE SET NULL ON UPDATE CASCADE, +ALGORITHM = INPLACE; +DROP TABLE Child; +DROP TABLE Parent; +CREATE TABLE `t2`(a int,c int,d int) ENGINE=INNODB; +CREATE TABLE `t3`(a int,c int,d int) ENGINE=INNODB; +CREATE INDEX idx ON t3(a); +ALTER TABLE `t2` ADD CONSTRAINT `fw` FOREIGN KEY (`c`) REFERENCES t3 (a); +ALTER TABLE `t2` ADD CONSTRAINT `e` foreign key (`d`) REFERENCES t3(a); +ALTER TABLE `t3` ADD CONSTRAINT `e` foreign key (`c`) REFERENCES `t2`(`c`) ON UPDATE SET NULL; +ERROR HY000: Failed to add the foreign key constraint 'test/e' to system tables +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN; +ID FOR_NAME REF_NAME N_COLS TYPE +test/e test/t2 test/t3 1 0 +test/fw test/t2 test/t3 1 0 +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS; +ID FOR_COL_NAME REF_COL_NAME POS +test/e d a 0 +test/fw c a 0 +DROP TABLE t2; +DROP TABLE t3; diff --git a/mysql-test/suite/innodb/r/innodb-index-online-purge.result b/mysql-test/suite/innodb/r/innodb-index-online-purge.result new file mode 100644 index 00000000000..7a6469dd23a --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb-index-online-purge.result @@ -0,0 +1,48 @@ +connect con1,localhost,root,,; +connect con2,localhost,root,,; +connection default; +CREATE TABLE t (a INT PRIMARY KEY, c TEXT) ENGINE=InnoDB; +CREATE TABLE u (a INT PRIMARY KEY, b INT, c INT NOT NULL) ENGINE=InnoDB; +INSERT INTO t VALUES (1,'aa'); +BEGIN; +INSERT INTO u SET a=1, c=1; +INSERT INTO u SELECT a+1,NULL,a+1 FROM u; +INSERT INTO u SELECT a+2,NULL,a+2 FROM u; +INSERT INTO u SELECT a+4,NULL,a+4 FROM u; +INSERT INTO u SELECT a+8,NULL,a+8 FROM u; +INSERT INTO u SELECT a+16,NULL,a+16 FROM u; +INSERT INTO u SELECT a+32,NULL,a+32 FROM u; +INSERT INTO u SELECT a+64,NULL,a+64 FROM u; +INSERT INTO u SELECT a+128,NULL,a+64 FROM u; +INSERT INTO u SELECT a+256,NULL,a+64 FROM u; +COMMIT; +BEGIN; +DELETE FROM u; +connection con2; +SET DEBUG_SYNC='row_log_apply_before SIGNAL created_u WAIT_FOR dml_done_u'; +ALTER TABLE u ADD INDEX (c); +connection default; +COMMIT; +SET DEBUG_SYNC='now WAIT_FOR created_u'; +SELECT state FROM information_schema.processlist +WHERE info='ALTER TABLE u ADD INDEX (c)'; +state +debug sync point: row_log_apply_before +connection con1; +SET DEBUG_SYNC='row_log_apply_before SIGNAL created_t WAIT_FOR dml_done_t'; +CREATE INDEX c1 ON t (c(1)); +connection default; +SET DEBUG_SYNC='now WAIT_FOR created_t'; +UPDATE t SET c='ab'; +SELECT SLEEP(10); +SLEEP(10) +0 +SET DEBUG_SYNC='now SIGNAL dml_done_u'; +connection con2; +SET DEBUG_SYNC='now SIGNAL dml_done_t'; +disconnect con2; +connection con1; +disconnect con1; +connection default; +SET DEBUG_SYNC='RESET'; +DROP TABLE t,u; diff --git a/mysql-test/suite/innodb/r/innodb-index-online.result b/mysql-test/suite/innodb/r/innodb-index-online.result new file mode 100644 index 00000000000..5427f13043d --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb-index-online.result @@ -0,0 +1,503 @@ +call mtr.add_suppression("InnoDB: Warning: Small buffer pool size"); +SET @global_innodb_file_per_table_orig = @@global.innodb_file_per_table; +SET GLOBAL innodb_file_per_table = on; +CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT, c3 TEXT) +ENGINE=InnoDB STATS_PERSISTENT=0; +INSERT INTO t1 VALUES (1,1,''), (2,2,''), (3,3,''), (4,4,''), (5,5,''); +SET GLOBAL innodb_monitor_enable = module_ddl; +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 0 +ddl_pending_alter_table 0 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 0 +SET DEBUG_SYNC = 'RESET'; +SET DEBUG_SYNC = 'write_row_noreplace SIGNAL have_handle WAIT_FOR go_ahead'; +INSERT INTO t1 VALUES(1,2,3); +connect con1,localhost,root,,; +connection con1; +SET DEBUG_SYNC = 'now WAIT_FOR have_handle'; +SET lock_wait_timeout = 1; +ALTER TABLE t1 ADD UNIQUE INDEX(c2); +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +SET DEBUG_SYNC = 'now SIGNAL go_ahead'; +connection default; +ERROR 23000: Duplicate entry '1' for key 'PRIMARY' +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 0 +ddl_pending_alter_table 0 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 0 +connection con1; +SET @saved_debug_dbug = @@SESSION.debug_dbug; +SET DEBUG_DBUG = '+d,innodb_OOM_prepare_inplace_alter'; +ALTER TABLE t1 ADD UNIQUE INDEX(c2); +ERROR HY000: Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space +SET DEBUG_DBUG = @saved_debug_dbug; +SET DEBUG_DBUG = '+d,innodb_OOM_inplace_alter'; +CREATE UNIQUE INDEX c2 ON t1(c2); +ERROR HY000: Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space +SET DEBUG_DBUG = @saved_debug_dbug; +CREATE UNIQUE INDEX c2 ON t1(c2); +DROP INDEX c2 ON t1; +connection default; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL, + `c2` int(11) DEFAULT NULL, + `c3` text DEFAULT NULL, + PRIMARY KEY (`c1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 STATS_PERSISTENT=0 +BEGIN; +INSERT INTO t1 VALUES(7,4,2); +connection con1; +SET DEBUG_SYNC = 'row_log_apply_before SIGNAL scanned WAIT_FOR rollback_done'; +ALTER TABLE t1 ADD UNIQUE INDEX(c2); +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +connection default; +COMMIT; +connection con1; +ALTER TABLE t1 ADD UNIQUE INDEX(c2); +ERROR 23000: Duplicate entry '4' for key 'c2' +connection default; +DELETE FROM t1 WHERE c1 = 7; +connection con1; +ALTER TABLE t1 ADD FOREIGN KEY(c2) REFERENCES t1(c2), ALGORITHM = INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Adding foreign keys needs foreign_key_checks=OFF. Try ALGORITHM=COPY +ALTER TABLE t1 ADD UNIQUE INDEX(c2), LOCK = EXCLUSIVE, ALGORITHM = INPLACE; +DROP INDEX c2 ON t1; +ALTER TABLE t1 ADD UNIQUE INDEX(c2); +connection default; +SET DEBUG_SYNC = 'now WAIT_FOR scanned'; +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 1 +ddl_pending_alter_table 1 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 0 +BEGIN; +INSERT INTO t1 VALUES(7,4,2); +ROLLBACK; +SET DEBUG_SYNC = 'now SIGNAL rollback_done'; +connection con1; +ERROR 23000: Duplicate entry '4' for key 'c2' +SET DEBUG_SYNC = 'row_log_apply_after SIGNAL created WAIT_FOR dml_done'; +ALTER TABLE t1 ADD UNIQUE INDEX(c2); +connection default; +SET DEBUG_SYNC = 'now WAIT_FOR created'; +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 0 +ddl_pending_alter_table 1 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 0 +INSERT INTO t1 VALUES(6,3,1); +SET DEBUG_SYNC = 'now SIGNAL dml_done'; +connection con1; +ERROR 23000: Duplicate entry for key 'c2' +DELETE FROM t1 WHERE c1=6; +ALTER TABLE t1 ADD UNIQUE INDEX(c2); +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 0 +ddl_pending_alter_table 0 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 0 +connection default; +INSERT INTO t1 VALUES(6,3,1); +ERROR 23000: Duplicate entry '3' for key 'c2' +INSERT INTO t1 VALUES(7,4,2); +ERROR 23000: Duplicate entry '4' for key 'c2' +ALTER TABLE t1 STATS_PERSISTENT=1; +ANALYZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +UPDATE mysql.innodb_index_stats SET stat_value = 5 +WHERE database_name = 'test' AND table_name= 't1' AND index_name = 'PRIMARY' +AND stat_value = 6; +SELECT * FROM mysql.innodb_index_stats WHERE table_name IN ('t1'); +database_name table_name index_name last_update stat_name stat_value sample_size stat_description +test t1 PRIMARY LAST_UPDATE n_diff_pfx01 5 1 c1 +test t1 PRIMARY LAST_UPDATE n_leaf_pages 1 NULL Number of leaf pages in the index +test t1 PRIMARY LAST_UPDATE size 1 NULL Number of pages in the index +test t1 c2 LAST_UPDATE n_diff_pfx01 5 1 c2 +test t1 c2 LAST_UPDATE n_leaf_pages 1 NULL Number of leaf pages in the index +test t1 c2 LAST_UPDATE size 1 NULL Number of pages in the index +CREATE TABLE t1_c2_stats SELECT * FROM mysql.innodb_index_stats +WHERE database_name = 'test' AND table_name = 't1' and index_name = 'c2'; +ALTER TABLE t1_c2_stats ENGINE=INNODB; +DROP INDEX c2 ON t1; +ANALYZE TABLE t1_c2_stats; +Table Op Msg_type Msg_text +test.t1_c2_stats analyze status OK +SELECT * FROM mysql.innodb_index_stats WHERE table_name IN ('t1', 't1_c2_stats'); +database_name table_name index_name last_update stat_name stat_value sample_size stat_description +test t1 PRIMARY LAST_UPDATE n_diff_pfx01 5 1 c1 +test t1 PRIMARY LAST_UPDATE n_leaf_pages 1 NULL Number of leaf pages in the index +test t1 PRIMARY LAST_UPDATE size 1 NULL Number of pages in the index +connection con1; +KILL QUERY @id; +ERROR 70100: Query execution was interrupted +SET DEBUG_SYNC = 'row_log_apply_before SIGNAL c2d_created WAIT_FOR kill_done'; +CREATE INDEX c2d ON t1(c2); +connection default; +SET DEBUG_SYNC = 'now WAIT_FOR c2d_created'; +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 1 +ddl_pending_alter_table 1 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 0 +KILL QUERY @id; +SET DEBUG_SYNC = 'now SIGNAL kill_done'; +connection con1; +ERROR 70100: Query execution was interrupted +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 0 +ddl_pending_alter_table 0 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 0 +connection default; +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +INSERT INTO t1 SELECT 5 + c1, c2, c3 FROM t1; +INSERT INTO t1 SELECT 10 + c1, c2, c3 FROM t1; +INSERT INTO t1 SELECT 20 + c1, c2, c3 FROM t1; +INSERT INTO t1 SELECT 40 + c1, c2, c3 FROM t1; +EXPLAIN SELECT COUNT(*) FROM t1 WHERE c2 > 3; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 80 Using where +ANALYZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +connection con1; +UPDATE t1_c2_stats SET index_name = 'c2d'; +UPDATE t1_c2_stats SET stat_value = 2 WHERE stat_name = 'n_diff_pfx01'; +INSERT INTO t1_c2_stats +SELECT database_name, table_name, index_name, last_update, 'n_diff_pfx02', 80, +sample_size, 'c2,c1' FROM t1_c2_stats +WHERE stat_name = 'n_diff_pfx01' AND stat_description = 'c2'; +INSERT INTO mysql.innodb_index_stats SELECT * FROM t1_c2_stats; +DROP TABLE t1_c2_stats; +CREATE INDEX c2d ON t1(c2); +SHOW INDEX FROM t1; +Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment +t1 0 PRIMARY 1 c1 A 80 NULL NULL BTREE +t1 1 c2d 1 c2 A 10 NULL NULL YES BTREE +EXPLAIN SELECT COUNT(*) FROM t1 WHERE c2 > 3; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range c2d c2d 5 NULL 32 Using where; Using index +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL, + `c2` int(11) DEFAULT NULL, + `c3` text DEFAULT NULL, + PRIMARY KEY (`c1`), + KEY `c2d` (`c2`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 STATS_PERSISTENT=1 +connection default; +SET @merge_encrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +connection con1; +SET DEBUG_SYNC = 'row_log_apply_before SIGNAL c2e_created WAIT_FOR dml2_done'; +SET lock_wait_timeout = 10; +ALTER TABLE t1 DROP INDEX c2d, ADD INDEX c2e(c2), +ALGORITHM = INPLACE; +connection default; +INSERT INTO t1 SELECT 80 + c1, c2, c3 FROM t1; +INSERT INTO t1 SELECT 160 + c1, c2, c3 FROM t1; +SET DEBUG_SYNC = 'now WAIT_FOR c2e_created'; +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 1 +ddl_pending_alter_table 1 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 0 +BEGIN; +DELETE FROM t1; +ROLLBACK; +UPDATE t1 SET c2 = c2 + 1; +BEGIN; +UPDATE t1 SET c2 = c2 + 1; +DELETE FROM t1; +ROLLBACK; +BEGIN; +DELETE FROM t1; +ROLLBACK; +UPDATE t1 SET c2 = c2 + 1; +BEGIN; +UPDATE t1 SET c2 = c2 + 1; +DELETE FROM t1; +ROLLBACK; +BEGIN; +DELETE FROM t1; +ROLLBACK; +UPDATE t1 SET c2 = c2 + 1; +BEGIN; +UPDATE t1 SET c2 = c2 + 1; +DELETE FROM t1; +ROLLBACK; +BEGIN; +DELETE FROM t1; +ROLLBACK; +UPDATE t1 SET c2 = c2 + 1; +BEGIN; +UPDATE t1 SET c2 = c2 + 1; +DELETE FROM t1; +ROLLBACK; +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 1 +ddl_pending_alter_table 1 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 1 +SELECT sf.name, sf.pos FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES si +INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_FIELDS sf +ON si.index_id = sf.index_id WHERE si.name = '?c2e'; +name pos +c2 0 +SET @merge_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +SELECT +(@merge_encrypt_1-@merge_encrypt_0)- +(@merge_decrypt_1-@merge_decrypt_0) as sort_balance, +@merge_encrypt_1>@merge_encrypt_0, @merge_decrypt_1>@merge_decrypt_0, +@rowlog_encrypt_1>@rowlog_encrypt_0; +sort_balance @merge_encrypt_1>@merge_encrypt_0 @merge_decrypt_1>@merge_decrypt_0 @rowlog_encrypt_1>@rowlog_encrypt_0 +0 0 0 0 +SET DEBUG_SYNC = 'now SIGNAL dml2_done'; +connection con1; +ERROR HY000: Creating index 'c2e' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 1 +ddl_background_drop_tables 0 +ddl_online_create_index 0 +ddl_pending_alter_table 0 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 1 +SELECT sf.name, sf.pos FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES si +INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_FIELDS sf +ON si.index_id = sf.index_id WHERE si.name = 'c2e'; +name pos +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 1 +ddl_background_drop_tables 0 +ddl_online_create_index 0 +ddl_pending_alter_table 0 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 1 +connection default; +ALTER TABLE t1 COMMENT 'testing if c2e will be dropped'; +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 0 +ddl_pending_alter_table 0 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 1 +SET @merge_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +SET @rowlog_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); +connection con1; +SET DEBUG_SYNC = 'row_log_apply_before SIGNAL c2f_created WAIT_FOR dml3_done'; +ALTER TABLE t1 ADD INDEX c2f(c2); +connection default; +SET DEBUG_SYNC = 'now WAIT_FOR c2f_created'; +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 1 +ddl_pending_alter_table 1 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 1 +BEGIN; +INSERT INTO t1 SELECT 320 + c1, c2, c3 FROM t1 WHERE c1 > 160; +DELETE FROM t1 WHERE c1 > 320; +ROLLBACK; +BEGIN; +UPDATE t1 SET c2 = c2 + 1; +DELETE FROM t1; +ROLLBACK; +BEGIN; +INSERT INTO t1 SELECT 320 + c1, c2, c3 FROM t1 WHERE c1 > 160; +DELETE FROM t1 WHERE c1 > 320; +ROLLBACK; +BEGIN; +UPDATE t1 SET c2 = c2 + 1; +DELETE FROM t1; +ROLLBACK; +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 1 +ddl_pending_alter_table 1 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 2 +SET DEBUG_SYNC = 'now SIGNAL dml3_done'; +connection con1; +Warnings: +Note 1831 Duplicate index `c2f`. This is deprecated and will be disallowed in a future release +ALTER TABLE t1 CHANGE c2 c22f INT; +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 0 +ddl_pending_alter_table 0 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 2 +connection default; +SET @merge_encrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +SET @rowlog_decrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); +SELECT +(@merge_encrypt_2-@merge_encrypt_1)- +(@merge_decrypt_2-@merge_decrypt_1) as sort_balance, +(@rowlog_encrypt_2-@rowlog_encrypt_1)- +(@rowlog_decrypt_2-@rowlog_decrypt_1) as log_balance; +sort_balance log_balance +0 0 +SELECT +@merge_encrypt_2-@merge_encrypt_1>0 as sort_encrypted, +@merge_decrypt_2-@merge_decrypt_1>0 as sort_decrypted, +@rowlog_encrypt_2-@rowlog_encrypt_1>0 as log_encrypted, +@rowlog_decrypt_2-@rowlog_decrypt_1>0 as log_decrypted; +sort_encrypted sort_decrypted log_encrypted log_decrypted +0 0 0 0 +connection con1; +SELECT COUNT(c22f) FROM t1; +COUNT(c22f) +320 +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +ALTER TABLE t1 ADD UNIQUE INDEX c3p5(c3(5)); +ERROR 23000: Duplicate entry 'NULL' for key 'c3p5' +UPDATE t1 SET c3 = NULL WHERE c3 = ''; +SET lock_wait_timeout = 1; +SET DEBUG_SYNC = 'row_log_apply_before SIGNAL c3p5_created WAIT_FOR ins_done'; +ALTER TABLE t1 ADD UNIQUE INDEX c3p5(c3(5)); +connection default; +SET DEBUG_SYNC = 'now WAIT_FOR c3p5_created'; +SELECT sf.name, sf.pos FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES si +INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_FIELDS sf +ON si.index_id = sf.index_id WHERE si.name = '?c3p5'; +name pos +c3 0 +SET DEBUG_SYNC = 'ib_after_row_insert SIGNAL ins_done WAIT_FOR ddl_timed_out'; +INSERT INTO t1 VALUES(347,33101,NULL); +connection con1; +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +SET DEBUG_SYNC = 'now SIGNAL ddl_timed_out'; +SELECT sf.name, sf.pos FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES si +INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_FIELDS sf +ON si.index_id = sf.index_id WHERE si.name = 'c3p5'; +name pos +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 1 +ddl_background_drop_tables 0 +ddl_online_create_index 0 +ddl_pending_alter_table 0 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 2 +connection default; +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 1 +ddl_background_drop_tables 0 +ddl_online_create_index 0 +ddl_pending_alter_table 0 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 2 +connection con1; +disconnect con1; +connection default; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL, + `c22f` int(11) DEFAULT NULL, + `c3` text DEFAULT NULL, + PRIMARY KEY (`c1`), + KEY `c2d` (`c22f`), + KEY `c2f` (`c22f`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 STATS_PERSISTENT=1 COMMENT='testing if c2e will be dropped' +ALTER TABLE t1 DROP INDEX c2d, DROP INDEX c2f; +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 0 +ddl_pending_alter_table 0 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 2 +ALTER TABLE t1 ADD INDEX c2h(c22f), ALGORITHM = INPLACE; +ALTER TABLE t1 ADD INDEX c2h(c22f), ALGORITHM = COPY; +ERROR 42000: Duplicate key name 'c2h' +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL innodb_monitor_disable = module_ddl; +DROP TABLE t1; +SET GLOBAL innodb_file_per_table = @global_innodb_file_per_table_orig; +SET GLOBAL innodb_monitor_enable = default; +SET GLOBAL innodb_monitor_disable = default; diff --git a/mysql-test/suite/innodb/r/innodb-index.result b/mysql-test/suite/innodb/r/innodb-index.result index 1b7f44fa8c4..54ad4e8a927 100644 --- a/mysql-test/suite/innodb/r/innodb-index.result +++ b/mysql-test/suite/innodb/r/innodb-index.result @@ -1184,3 +1184,667 @@ t2c CREATE TABLE `t2c` ( KEY `t2a` (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 DROP TABLE t1,t2,t2c,t2i; +# +# Bug #17657223 EXCESSIVE TEMPORARY FILE USAGE IN ALTER TABLE +# +SET GLOBAL innodb_monitor_enable = module_ddl; +create table t1(f1 int not null, f2 blob)engine=innodb; +insert into t1 values(1, repeat('a',20000)); +# Skip sort +# Reusing the same pk +alter table t1 force; +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +SET GLOBAL innodb_monitor_reset = module_ddl; +drop table t1; +create table t1(f1 int not null, f2 int not null, +primary key(f1))engine=innodb; +insert into t1 values(1,2), (3,4); +# Add Secondary index. +# Skip temp file usage due to small table size +alter table t1 add key(f2); +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +SET GLOBAL innodb_monitor_reset = module_ddl; +drop table t1; +create table t480(a serial)engine=innodb; +insert into t480 +values(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(), +(),(),(),(),(),(),(),(); +insert into t480 select 0 from t480; +insert into t480 select 0 from t480; +insert into t480 select 0 from t480; +insert into t480 select 0 from t480; +create table t1(f1 int auto_increment not null, +f2 char(200) not null, f3 char(200) not null, +f4 char(200) not null,primary key(f1))engine=innodb; +insert into t1 select NULL,'aaa','bbb','ccc' from t480; +insert into t1 select NULL,'aaaa','bbbb','cccc' from t480; +insert into t1 select NULL,'aaaaa','bbbbb','ccccc' from t480; +insert into t1 select NULL,'aaaaaa','bbbbbb','cccccc' from t480; +insert into t1 select NULL,'aaaaaaa','bbbbbbb','ccccccc' from t480; +insert into t1 select NULL,'aaaaaaaa','bbbbbbbb','cccccccc' from t480; +select count(*) from t1; +count(*) +2880 +# Skip sort +# Change PK from (f1) to (f1,f2,f3,f4) +alter table t1 drop primary key, add primary key(f1,f2,f3,f4); +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +SET GLOBAL innodb_monitor_reset = module_ddl; +# Skip sort +# Change PK from (f1,f2,f3,f4) to (f1,f2,added_columns) +alter table t1 drop primary key,add column f5 int not null, +add column f6 int not null,add primary key(f1,f2,f5,f6); +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +SET GLOBAL innodb_monitor_reset = module_ddl; +# Skip sort +# Change PK from (f1,f2,f5,f6) to (f1,f2,f5) +alter table t1 drop column f6; +ERROR 42000: Key column 'f6' doesn't exist in table +alter table t1 drop column f6, drop primary key, add primary key(f1,f2,f5); +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +SET GLOBAL innodb_monitor_reset = module_ddl; +# Skip sort +# Reusing the same PK +alter table t1 add column f6 int; +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +SET GLOBAL innodb_monitor_reset = module_ddl; +# Skip sort +# Reusing the same pk +alter table t1 drop column f6; +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +SET GLOBAL innodb_monitor_reset = module_ddl; +# Must sort +# Change PK from (f1,f2,f5) to (f1,f5) +alter table t1 drop column f2; +ERROR 42000: Key column 'f2' doesn't exist in table +alter table t1 drop column f2, drop primary key, add primary key(f1,f5); +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +ddl_sort_file_alter_table 2 +SET GLOBAL innodb_monitor_reset = module_ddl; +# Skip sort +# Reusing the same pk +alter table t1 add column f2n int after f1, drop primary key, add +primary key (f1,f5,f2n); +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +SET GLOBAL innodb_monitor_reset = module_ddl; +# Skip sort +# Reusing the same pk +alter table t1 change f5 f2n int not null,change f2n f5 int not null, +add column f8 int not null; +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +SET GLOBAL innodb_monitor_reset = module_ddl; +# Skip sort +# Change PK from (f1,f4,f2n) to (f1,f4,added_column,f2n) +alter table t1 add column f7 int, drop primary key, +add primary key (f1,f5,f7,f2n); +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +ddl_sort_file_alter_table 2 +SET GLOBAL innodb_monitor_reset = module_ddl; +# Skip sort +# Reusing the same pk +alter table t1 force; +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +SET GLOBAL innodb_monitor_reset = module_ddl; +# Skip sort +# Reusing the same pk +alter table t1 row_format=compact; +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +SET GLOBAL innodb_monitor_reset = module_ddl; +# Skip sort +# Reusing the same pk +alter table t1 engine=innodb; +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +SET GLOBAL innodb_monitor_reset = module_ddl; +# Skip sort +# Optimize table +optimize table t1; +Table Op Msg_type Msg_text +test.t1 optimize note Table does not support optimize, doing recreate + analyze instead +test.t1 optimize status OK +affected rows: 2 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +SET GLOBAL innodb_monitor_reset = module_ddl; +# Sort files used for adding secondary index +alter table t1 drop primary key, add primary key(f1,f5,f7), add index +i(f3); +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +SET GLOBAL innodb_monitor_reset = module_ddl; +# No sort files used for dropping secondary index +alter table t1 drop primary key, add primary key(f1,f5),drop index i; +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +SET GLOBAL innodb_monitor_reset = module_ddl; +# Skip sort +# Change PK(f1,f5) to (f1,added_columns) and drop f5 +alter table t1 drop primary key, add primary key(f1,f12), +drop column f5, add column f12 int not null; +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +SET GLOBAL innodb_monitor_reset = module_ddl; +# Must sort +# Change PK(f1,f12) to (f1,existing_columns) +alter table t1 drop primary key, add primary key(f1,f3); +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +ddl_sort_file_alter_table 2 +SET GLOBAL innodb_monitor_reset = module_ddl; +# Skip sort +# Change PK(f1,f3) to (f1,added_column,f3,added_column) +alter table t1 drop primary key, add column f3n int, +add column f4n int, add primary key(f1,f3n,f3,f4n); +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +SET GLOBAL innodb_monitor_reset = module_ddl; +# Adding Secondary index alone. +alter table t1 add key(f1); +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +SET GLOBAL innodb_monitor_reset = module_ddl; +# Must sort +# Change PK(f1,f3) to (existing_column,f1) +alter table t1 drop primary key, add primary key(f4,f1); +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +ddl_sort_file_alter_table 3 +SET GLOBAL innodb_monitor_reset = module_ddl; +# Skip sort for PK. +# Change PK(f4,f1) to (added_columns,f4,f1) +# Secondary index rebuild happens +alter table t1 drop primary key, add column f5n int, +add column f6n int, add primary key(f5n,f6n,f4,f1); +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +SET GLOBAL innodb_monitor_reset = module_ddl; +# Skip sort for PK. +# Change PK(f5n,f6n,f4,f1) to +# (added_columns,f5n,added_column,f6n,f4,f1) +# Secondary index rebuild happens +alter table t1 drop primary key, add column f7n int, +add column f8n int, add primary key(f7n,f5n,f8n,f6n,f4,f1); +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; +name count_reset +SET GLOBAL innodb_monitor_reset = module_ddl; +SET GLOBAL innodb_monitor_disable = module_ddl; +select count(*) from t1; +count(*) +2880 +drop table t1; +SET GLOBAL innodb_monitor_reset = default; +SET GLOBAL innodb_monitor_enable = default; +SET GLOBAL innodb_monitor_disable = default; +# Bug#19163915 INNODB: DUPLICATE RECORDS COULD EXIST +# WHEN SKIPPING SORT FOR CLUSTER INDEX +SELECT @@innodb_sort_buffer_size; +@@innodb_sort_buffer_size +1048576 +create table t1(f1 int auto_increment not null, +f2 char(200) not null, f3 char(200) not null, +f4 char(200) not null,primary key(f1,f2,f3,f4)); +insert into t1 select NULL,'aaa','bbb','ccc' from t480; +insert into t1 values(106, 'aaa','bbb','cccc'); +select count(*) from t1; +count(*) +481 +# Skip sort +# Change PK from (f1,f2,f3,f4) to (f1,f2,f3) +alter table t1 drop primary key, add primary key(f1,f2,f3); +ERROR 23000: ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '106-aaa-bbb' for key 'PRIMARY' +select count(*) from t1; +count(*) +481 +drop table t1; +create table t1(f1 int auto_increment not null, +f2 char(200) not null, f3 char(200) not null, +f4 char(200) not null,primary key(f1,f2,f3,f4)); +insert into t1 select NULL,'aaa','bbb','ccc' from t480; +insert into t1 values(108,'aaa','bbb','cccc'); +select count(*) from t1; +count(*) +481 +alter table t1 drop primary key, add primary key(f1,f2,f3); +ERROR 23000: ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '108-aaa-bbb' for key 'PRIMARY' +select count(*) from t1; +count(*) +481 +drop table t1, t480; +# +# Bug #19896922 SORTING SKIPPED WHEN PREFIX LENGTH OF THE PK +# FIELD IS CHANGED +# +create table t1(a int not null, b varchar(30) not null, +primary key (b(10), a)) engine = innodb; +insert into t1 values(0,'khdHps6UxW8Lwaoxa604oK6zkb'),(1,'khdHps6UxW8L'); +select * from t1; +a b +0 khdHps6UxW8Lwaoxa604oK6zkb +1 khdHps6UxW8L +alter table t1 drop primary key, add primary key (b(18),a); +select * from t1; +a b +1 khdHps6UxW8L +0 khdHps6UxW8Lwaoxa604oK6zkb +drop table t1; +create table t1(a int not null, b varchar(30) not null, +primary key (b(10), a)) engine = innodb; +insert into t1 values(0,'khdHps6UxW8Lwaoxa604oK6zkb'),(1,'khdHps6UtW8L'); +select * from t1; +a b +1 khdHps6UtW8L +0 khdHps6UxW8Lwaoxa604oK6zkb +alter table t1 drop primary key, add primary key (b(8),a); +select * from t1; +a b +0 khdHps6UxW8Lwaoxa604oK6zkb +1 khdHps6UtW8L +drop table t1; +# +# Bug #21103101 SORTING SKIPPED WHEN DROPPING THE SINGLE +# COLUMN PRIMARY KEY +# +create table t1(f1 int not null, f2 int not null, +primary key (f1), unique key(f1, f2))engine=innodb; +insert into t1 values(1,3), (2,2); +alter table t1 drop column f1; +ERROR 42000: Key column 'f1' doesn't exist in table +alter table t1 drop column f1, drop primary key; +ERROR 42000: Key column 'f1' doesn't exist in table +alter table t1 drop column f1, drop key f1; +drop table t1; +create table t1(f1 int not null, f2 int not null, +primary key (f1), unique key(f1, f2))engine=innodb; +insert into t1 values(1,3), (2,2); +alter table t1 drop primary key, lock=none; +ERROR 0A000: LOCK=NONE is not supported. Reason: Dropping a primary key is not allowed without also adding a new primary key. Try LOCK=SHARED +drop table t1; +# +# BUG#21612714 ALTER TABLE SORTING SKIPPED WHEN CHANGE PK AND DROP +# LAST COLUMN OF OLD PK +# +create table t1(o1 int, o2 int, o3 int not null, primary key(o1,o2)) engine = innodb; +insert into t1 values(1,1,2),(1,2,1); +alter table t1 drop primary key, add primary key(o1,o3), drop o2, lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int not null, primary key(o1,o2)) engine = innodb; +insert into t1 values(1,1,2),(1,2,1); +alter table t1 drop o1, drop o2, add primary key(o3), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int not null, primary key(o1,o2)) engine = innodb; +insert into t1 values(1,1,2),(1,2,1); +alter table t1 drop primary key, add primary key(o1,o3), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int not null, primary key(o1,o2)) engine = innodb; +insert into t1 values(1,1,2),(1,2,1); +alter table t1 drop primary key, add primary key(o3), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int not null, primary key(o1,o2)) engine = innodb; +insert into t1 values(1,1,2),(1,2,1); +alter table t1 add column n1 int not null, drop primary key, add primary key(n1,o3), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int not null, primary key(o1,o2)) engine = innodb; +insert into t1 values(1,1,2),(2,2,1); +alter table t1 add column n1 int not null, drop primary key, add primary key(o3,n1), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int not null, primary key(o1,o2)) engine = innodb; +insert into t1 values(1,2,2),(2,1,1); +alter table t1 drop primary key, add primary key(o2, o1), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int not null, primary key(o1,o2)) engine = innodb; +insert into t1 values(1,2,2),(2,1,1); +alter table t1 drop primary key, add primary key(o2), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int not null, primary key(o1,o2)) engine = innodb; +insert into t1 values(1,2,2),(2,1,1); +alter table t1 drop primary key, add primary key(o2,o3), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int not null, primary key(o2,o1)) engine = innodb; +insert into t1 values(1,1,2),(2,1,1); +alter table t1 drop primary key, add primary key(o2,o3), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int not null, primary key(o1,o2)) engine = innodb; +insert into t1 values(1,1,2),(1,2,1); +alter table t1 drop primary key, add primary key(o1,o3,o2), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int not null, primary key(o1,o2)) engine = innodb; +insert into t1 values(1,2,2),(2,1,1); +alter table t1 drop primary key, add primary key(o3,o1,o2), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1,1,2),(1,2,1); +alter table t1 drop primary key, add primary key(o1,o3), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1,2,2),(2,1,1); +alter table t1 drop o1, lock=none; +ERROR 42000: Key column 'o1' doesn't exist in table +alter table t1 drop o1, drop primary key, add primary key(o2,o3), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1,1,2),(1,2,1); +alter table t1 drop o2, lock=none; +ERROR 42000: Key column 'o2' doesn't exist in table +alter table t1 drop o2, drop primary key, add primary key(o1,o3), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1,2,2),(2,1,1); +alter table t1 drop o1, drop o2, lock=none; +ERROR 42000: Key column 'o2' doesn't exist in table +alter table t1 drop o1, drop o2,drop primary key,add primary key(o3),lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, o3 int not null, primary key(o1(2), o2)) engine = innodb; +insert into t1 values('abd', 1, 1), ('abc', 2, 2); +alter table t1 drop primary key, add primary key(o1(3), o2), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, o3 int not null, primary key(o1(2), o2)) engine = innodb; +insert into t1 values('abd', 1, 1), ('abc', 2, 2); +alter table t1 drop primary key, add primary key(o1, o2), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, o3 int not null, primary key(o1(2), o2)) engine = innodb; +insert into t1 values('abd', 1, 1), ('abc', 2, 2); +alter table t1 drop primary key, add primary key(o1(3), o3), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, o3 int not null, primary key(o1(2), o2)) engine = innodb; +insert into t1 values('abd', 1, 1), ('abc', 2, 2); +alter table t1 drop primary key, add primary key(o1, o3), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, o3 int not null, primary key(o1(3), o2)) engine = innodb; +insert into t1 values('abc', 2, 1), ('abd', 1, 2); +alter table t1 drop primary key, add primary key(o1(2), o2), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, o3 int not null, primary key(o1, o2)) engine = innodb; +insert into t1 values('abc', 2, 1), ('abd', 1, 2); +alter table t1 drop primary key, add primary key(o1(2), o2), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, o3 int not null, primary key(o1(3), o2)) engine = innodb; +insert into t1 values('abc', 2, 2), ('abd', 1, 1); +alter table t1 drop primary key, add primary key(o1(2), o3), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, o3 int not null, primary key(o1, o2)) engine = innodb; +insert into t1 values('abc', 2, 2), ('abd', 1, 1); +alter table t1 drop primary key, add primary key(o1(2), o3), lock=none; +drop table t1; +create table t1(o1 int, o2 varchar(10), o3 int, primary key(o1,o2(2),o3)) engine = innodb; +insert into t1 values(1, 'abd', 1), (1, 'abc', 2); +alter table t1 drop primary key, add primary key(o1,o2(3)), lock=none; +drop table t1; +create table t1(o1 int, o2 varchar(10), o3 int, primary key(o1,o2(2),o3)) engine = innodb; +insert into t1 values(1, 'abd', 1), (1, 'abc', 2); +alter table t1 drop primary key, add primary key(o1,o2), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 varchar(10), primary key(o1(3),o2(3))) engine = innodb; +insert into t1 values('abc', 'acd'), ('abd', 'abd'); +alter table t1 drop primary key, add primary key(o1(2),o2(3)), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 varchar(10), primary key(o1,o2)) engine = innodb; +insert into t1 values('abc', 'acd'), ('abd', 'abd'); +alter table t1 drop primary key, add primary key(o1(2),o2), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 varchar(10), primary key(o1(3),o2(3))) engine = innodb; +insert into t1 values('abd', 'acd'), ('acd', 'abd'); +alter table t1 drop primary key, add primary key(o2(3),o1(3)), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 varchar(10), primary key(o1,o2)) engine = innodb; +insert into t1 values('abd', 'acd'), ('acd', 'abd'); +alter table t1 drop primary key, add primary key(o2,o1), lock=none; +drop table t1; +create table t1(o1 varchar(10), primary key(o1(2))) engine = innodb; +insert into t1 values('abd'), ('acd'); +alter table t1 drop primary key, add primary key(o1(3)), lock=none; +drop table t1; +create table t1(o1 varchar(10), primary key(o1(2))) engine = innodb; +insert into t1 values('abd'), ('acd'); +alter table t1 drop primary key, add primary key(o1), lock=none; +drop table t1; +create table t1(o1 varchar(10), primary key(o1(2))) engine = innodb; +insert into t1 values('abd'), ('acd'); +alter table t1 add n1 int not null, drop primary key, add primary key(o1(3), n1), lock=none; +drop table t1; +create table t1(o1 varchar(10), primary key(o1(2))) engine = innodb; +insert into t1 values('abd'), ('acd'); +alter table t1 add n1 int not null, drop primary key, add primary key(o1, n1), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int not null, primary key(o1(2))) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1(3), o2), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int not null, primary key(o1(2))) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1, o2), lock=none; +drop table t1; +create table t1(o1 varchar(10), primary key(o1(3))) engine = innodb; +insert into t1 values('abd'), ('acd'); +alter table t1 drop primary key, add primary key(o1(2)), lock=none; +drop table t1; +create table t1(o1 varchar(10), primary key(o1)) engine = innodb; +insert into t1 values('abd'), ('acd'); +alter table t1 drop primary key, add primary key(o1(2)), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, primary key(o1(3), o2)) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 drop primary key, add primary key(o1(2)), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, primary key(o1, o2)) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 drop primary key, add primary key(o1(2)), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, primary key(o1(3), o2)) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1(2),n1), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, primary key(o1, o2)) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1(2),n1), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, primary key(o1(3), o2)) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1(3),n1), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, primary key(o1, o2)) engine = innodb; +insert into t1 values('abd', 1), ('acd', 2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1,n1), lock=none; +drop table t1; +create table t1(o1 int, o2 varchar(10), primary key(o1,o2(3))) engine = innodb; +insert into t1 values(1,'abd'), (2,'acd'); +alter table t1 drop primary key, add primary key(o1,o2(2)), lock=none; +drop table t1; +create table t1(o1 int, o2 varchar(10), primary key(o1,o2)) engine = innodb; +insert into t1 values(1,'abd'), (2,'acd'); +alter table t1 drop primary key, add primary key(o1,o2(2)), lock=none; +drop table t1; +create table t1(o1 int, o2 varchar(10), primary key(o1,o2(2))) engine = innodb; +insert into t1 values(1, 'abd'), (2, 'acd'); +alter table t1 drop primary key, add primary key(o1,o2(3)), lock=none; +drop table t1; +create table t1(o1 int, o2 varchar(10), primary key(o1,o2(2))) engine = innodb; +insert into t1 values(1, 'abd'), (2, 'acd'); +alter table t1 drop primary key, add primary key(o1,o2), lock=none; +drop table t1; +create table t1(o1 int, o2 varchar(10), o3 int, primary key(o1,o2(3),o3)) engine = innodb; +insert into t1 values(1, 'abd', 1), (2, 'acd', 2); +alter table t1 drop primary key, add primary key(o1,o2(2)), lock=none; +drop table t1; +create table t1(o1 int, o2 varchar(10), o3 int, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1, 'abd', 1), (2, 'acd', 2); +alter table t1 drop primary key, add primary key(o1,o2(2)), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 varchar(10), primary key(o1(3),o2(3))) engine = innodb; +insert into t1 values('abd', 'acd'), ('acd', 'abd'); +alter table t1 drop primary key, add primary key(o1(3),o2(2)), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 varchar(10), primary key(o1,o2)) engine = innodb; +insert into t1 values('abd', 'acd'), ('acd', 'abd'); +alter table t1 drop primary key, add primary key(o1,o2(2)), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 varchar(10), primary key(o1(3),o2(2))) engine = innodb; +insert into t1 values('abd', 'acd'), ('acd', 'abd'); +alter table t1 drop primary key, add primary key(o1(3),o2(3)), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 varchar(10), primary key(o1,o2(2))) engine = innodb; +insert into t1 values('abd', 'acd'), ('acd', 'abd'); +alter table t1 drop primary key, add primary key(o1,o2), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, o3 varchar(10), primary key(o1(3),o2,o3(2))) engine = innodb; +insert into t1 values('abd', 1, 'acd'), ('acd', 2, 'abd'); +alter table t1 drop primary key, add primary key(o1(3),o2,o3(3)), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, o3 varchar(10), primary key(o1,o2,o3(2))) engine = innodb; +insert into t1 values('abd', 1, 'acd'), ('acd', 2, 'abd'); +alter table t1 drop primary key, add primary key(o1,o2,o3), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, o3 varchar(10), primary key(o1(3),o2,o3(3))) engine = innodb; +insert into t1 values('abd', 1, 'acd'), ('acd', 2, 'abd'); +alter table t1 drop primary key, add primary key(o1(3),o2,o3(2)), lock=none; +drop table t1; +create table t1(o1 varchar(10), o2 int, o3 varchar(10), primary key(o1,o2,o3(3))) engine = innodb; +insert into t1 values('abd', 1, 'acd'), ('acd', 2, 'abd'); +alter table t1 drop primary key, add primary key(o1,o2,o3(2)), lock=none; +drop table t1; +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 drop primary key, add primary key(o1,o2), lock=none; +drop table t1; +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1,n1), lock=none; +drop table t1; +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, drop primary key, add primary key(n1,o1), lock=none; +drop table t1; +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, add n2 int not null, drop primary key, add primary key(n1,o1,n2), lock=none; +drop table t1; +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, add n2 int not null, drop primary key, add primary key(n1,n2,o1), lock=none; +drop table t1; +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, add n2 int not null, drop primary key, add primary key(o1,n1,n2), lock=none; +drop table t1; +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1,o2,n1), lock=none; +drop table t1; +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, drop primary key, add primary key(o1,n1,o2), lock=none; +drop table t1; +create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1),(2,2); +alter table t1 add n1 int not null, drop primary key, add primary key(n1,o1,o2), lock=none; +drop table t1; +create table t1(o1 int, o2 int not null, o3 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1,2),(2,2,1); +alter table t1 drop primary key, add primary key(o1,o2,o3), lock=none; +drop table t1; +create table t1(o1 int, o2 int not null, o3 int not null, primary key(o1)) engine = innodb; +insert into t1 values(1,1,2),(2,2,1); +alter table t1 drop primary key, add primary key(o1,o3,o2), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1,1,2),(2,2,1); +alter table t1 drop primary key, add primary key(o1,o2), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int, o4 int not null, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1,1,2,2),(2,2,1,1); +alter table t1 add n1 int not null, drop primary key, add primary key(o1,o2,o3,o4), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1,1,2),(2,2,1); +alter table t1 add n1 int not null, drop primary key, add primary key(o1,o2,n1), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1,1,2),(2,2,1); +alter table t1 add n1 int not null, drop primary key, add primary key(o1,n1,o2), lock=none; +drop table t1; +create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1,1,2),(2,2,1); +alter table t1 drop primary key, add primary key(o1), lock=none; +drop table t1; diff --git a/mysql-test/suite/innodb/r/innodb-page_compression_default.result b/mysql-test/suite/innodb/r/innodb-page_compression_default.result index 10e1d6c766c..413450e1a6d 100644 --- a/mysql-test/suite/innodb/r/innodb-page_compression_default.result +++ b/mysql-test/suite/innodb/r/innodb-page_compression_default.result @@ -1,20 +1,98 @@ -SET GLOBAL innodb_file_format = `Barracuda`; -SET GLOBAL innodb_file_per_table = ON; -create table t1 (c1 int not null primary key auto_increment, b char(200)) engine=innodb page_compressed=1; -insert into t1 values(NULL,'compressed_text_aaaaaaaaabbbbbbbbbbbbbccccccccccccc'); -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; -# t1 compressed expected NOT FOUND -NOT FOUND /compressed_text/ in t1.ibd -drop table t1; +call mtr.add_suppression("InnoDB: Compression failed for space [0-9]+ name test/innodb_page_compressed[0-9] len [0-9]+ err 2 write_size [0-9]+."); +set global innodb_file_format = `Barracuda`; +set global innodb_file_per_table = on; +create table innodb_normal (c1 int not null auto_increment primary key, b char(200)) engine=innodb; +create table innodb_page_compressed1 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=1; +create table innodb_page_compressed2 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=2; +create table innodb_page_compressed3 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=3; +create table innodb_page_compressed4 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=4; +create table innodb_page_compressed5 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=5; +create table innodb_page_compressed6 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=6; +create table innodb_page_compressed7 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=7; +create table innodb_page_compressed8 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=8; +create table innodb_page_compressed9 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=9; +select count(*) from innodb_page_compressed1; +count(*) +10000 +select count(*) from innodb_page_compressed3; +count(*) +10000 +select count(*) from innodb_page_compressed4; +count(*) +10000 +select count(*) from innodb_page_compressed5; +count(*) +10000 +select count(*) from innodb_page_compressed6; +count(*) +10000 +select count(*) from innodb_page_compressed6; +count(*) +10000 +select count(*) from innodb_page_compressed7; +count(*) +10000 +select count(*) from innodb_page_compressed8; +count(*) +10000 +select count(*) from innodb_page_compressed9; +count(*) +10000 +# innodb_normal expected FOUND +FOUND 24084 /AaAaAaAa/ in innodb_normal.ibd +# innodb_page_compressed1 page compressed expected NOT FOUND +NOT FOUND /AaAaAaAa/ in innodb_page_compressed1.ibd +# innodb_page_compressed2 page compressed expected NOT FOUND +NOT FOUND /AaAaAaAa/ in innodb_page_compressed2.ibd +# innodb_page_compressed3 page compressed expected NOT FOUND +NOT FOUND /AaAaAaAa/ in innodb_page_compressed3.ibd +# innodb_page_compressed4 page compressed expected NOT FOUND +NOT FOUND /AaAaAaAa/ in innodb_page_compressed4.ibd +# innodb_page_compressed5 page compressed expected NOT FOUND +NOT FOUND /AaAaAaAa/ in innodb_page_compressed5.ibd +# innodb_page_compressed6 page compressed expected NOT FOUND +NOT FOUND /AaAaAaAa/ in innodb_page_compressed6.ibd +# innodb_page_compressed7 page compressed expected NOT FOUND +NOT FOUND /AaAaAaAa/ in innodb_page_compressed7.ibd +# innodb_page_compressed8 page compressed expected NOT FOUND +NOT FOUND /AaAaAaAa/ in innodb_page_compressed8.ibd +# innodb_page_compressed9 page compressed expected NOT FOUND +NOT FOUND /AaAaAaAa/ in innodb_page_compressed9.ibd +select count(*) from innodb_page_compressed1; +count(*) +10000 +select count(*) from innodb_page_compressed3; +count(*) +10000 +select count(*) from innodb_page_compressed4; +count(*) +10000 +select count(*) from innodb_page_compressed5; +count(*) +10000 +select count(*) from innodb_page_compressed6; +count(*) +10000 +select count(*) from innodb_page_compressed6; +count(*) +10000 +select count(*) from innodb_page_compressed7; +count(*) +10000 +select count(*) from innodb_page_compressed8; +count(*) +10000 +select count(*) from innodb_page_compressed9; +count(*) +10000 +drop table innodb_normal; +drop table innodb_page_compressed1; +drop table innodb_page_compressed2; +drop table innodb_page_compressed3; +drop table innodb_page_compressed4; +drop table innodb_page_compressed5; +drop table innodb_page_compressed6; +drop table innodb_page_compressed7; +drop table innodb_page_compressed8; +drop table innodb_page_compressed9; +#done diff --git a/mysql-test/suite/innodb/r/innodb-page_compression_snappy.result b/mysql-test/suite/innodb/r/innodb-page_compression_snappy.result index 442885755fd..83a17f678e4 100644 --- a/mysql-test/suite/innodb/r/innodb-page_compression_snappy.result +++ b/mysql-test/suite/innodb/r/innodb-page_compression_snappy.result @@ -1,430 +1,92 @@ -call mtr.add_suppression("InnoDB: Compression failed for space.*"); -set global innodb_compression_algorithm = 6; -create table innodb_compressed(c1 int, b char(200)) engine=innodb row_format=compressed key_block_size=8; -show warnings; -Level Code Message -create table innodb_normal (c1 int, b char(200)) engine=innodb; -show warnings; -Level Code Message -create table innodb_page_compressed1 (c1 int, b char(200)) engine=innodb page_compressed=1 page_compression_level=1; -show warnings; -Level Code Message -show create table innodb_page_compressed1; -Table Create Table -innodb_page_compressed1 CREATE TABLE `innodb_page_compressed1` ( - `c1` int(11) DEFAULT NULL, - `b` char(200) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 `page_compressed`=1 `page_compression_level`=1 -create table innodb_page_compressed2 (c1 int, b char(200)) engine=innodb page_compressed=1 page_compression_level=2; -show warnings; -Level Code Message -show create table innodb_page_compressed2; -Table Create Table -innodb_page_compressed2 CREATE TABLE `innodb_page_compressed2` ( - `c1` int(11) DEFAULT NULL, - `b` char(200) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 `page_compressed`=1 `page_compression_level`=2 -create table innodb_page_compressed3 (c1 int, b char(200)) engine=innodb page_compressed=1 page_compression_level=3; -show warnings; -Level Code Message -show create table innodb_page_compressed3; -Table Create Table -innodb_page_compressed3 CREATE TABLE `innodb_page_compressed3` ( - `c1` int(11) DEFAULT NULL, - `b` char(200) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 `page_compressed`=1 `page_compression_level`=3 -create table innodb_page_compressed4 (c1 int, b char(200)) engine=innodb page_compressed=1 page_compression_level=4; -show warnings; -Level Code Message -show create table innodb_page_compressed4; -Table Create Table -innodb_page_compressed4 CREATE TABLE `innodb_page_compressed4` ( - `c1` int(11) DEFAULT NULL, - `b` char(200) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 `page_compressed`=1 `page_compression_level`=4 -create table innodb_page_compressed5 (c1 int, b char(200)) engine=innodb page_compressed=1 page_compression_level=5; -show warnings; -Level Code Message -show create table innodb_page_compressed5; -Table Create Table -innodb_page_compressed5 CREATE TABLE `innodb_page_compressed5` ( - `c1` int(11) DEFAULT NULL, - `b` char(200) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 `page_compressed`=1 `page_compression_level`=5 -create table innodb_page_compressed6 (c1 int, b char(200)) engine=innodb page_compressed=1 page_compression_level=6; -show warnings; -Level Code Message -show create table innodb_page_compressed6; -Table Create Table -innodb_page_compressed6 CREATE TABLE `innodb_page_compressed6` ( - `c1` int(11) DEFAULT NULL, - `b` char(200) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 `page_compressed`=1 `page_compression_level`=6 -create table innodb_page_compressed7 (c1 int, b char(200)) engine=innodb page_compressed=1 page_compression_level=7; -show warnings; -Level Code Message -show create table innodb_page_compressed7; -Table Create Table -innodb_page_compressed7 CREATE TABLE `innodb_page_compressed7` ( - `c1` int(11) DEFAULT NULL, - `b` char(200) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 `page_compressed`=1 `page_compression_level`=7 -create table innodb_page_compressed8 (c1 int, b char(200)) engine=innodb page_compressed=1 page_compression_level=8; -show warnings; -Level Code Message -show create table innodb_page_compressed8; -Table Create Table -innodb_page_compressed8 CREATE TABLE `innodb_page_compressed8` ( - `c1` int(11) DEFAULT NULL, - `b` char(200) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 `page_compressed`=1 `page_compression_level`=8 -create table innodb_page_compressed9 (c1 int, b char(200)) engine=innodb page_compressed=1 page_compression_level=9; -show warnings; -Level Code Message -show create table innodb_page_compressed9; -Table Create Table -innodb_page_compressed9 CREATE TABLE `innodb_page_compressed9` ( - `c1` int(11) DEFAULT NULL, - `b` char(200) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 `page_compressed`=1 `page_compression_level`=9 -create procedure innodb_insert_proc (repeat_count int) -begin -declare current_num int; -set current_num = 0; -while current_num < repeat_count do -insert into innodb_normal values(current_num,'aaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccc'); -set current_num = current_num + 1; -end while; -end// -commit; -set autocommit=0; -call innodb_insert_proc(5000); -commit; -set autocommit=1; -select count(*) from innodb_normal; -count(*) -5000 -insert into innodb_compressed select * from innodb_normal; -insert into innodb_page_compressed1 select * from innodb_normal; -insert into innodb_page_compressed2 select * from innodb_normal; -insert into innodb_page_compressed3 select * from innodb_normal; -insert into innodb_page_compressed4 select * from innodb_normal; -insert into innodb_page_compressed5 select * from innodb_normal; -insert into innodb_page_compressed6 select * from innodb_normal; -insert into innodb_page_compressed7 select * from innodb_normal; -insert into innodb_page_compressed8 select * from innodb_normal; -insert into innodb_page_compressed9 select * from innodb_normal; -commit; -select count(*) from innodb_compressed; -count(*) -5000 +call mtr.add_suppression("InnoDB: Compression failed for space [0-9]+ name test/innodb_page_compressed[0-9] len [0-9]+ err 2 write_size [0-9]+."); +set global innodb_compression_algorithm = snappy; +set global innodb_file_format = `Barracuda`; +set global innodb_file_per_table = on; +create table innodb_normal (c1 int not null auto_increment primary key, b char(200)) engine=innodb; +create table innodb_page_compressed1 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=1; +create table innodb_page_compressed2 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=2; +create table innodb_page_compressed3 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=3; +create table innodb_page_compressed4 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=4; +create table innodb_page_compressed5 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=5; +create table innodb_page_compressed6 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=6; +create table innodb_page_compressed7 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=7; +create table innodb_page_compressed8 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=8; +create table innodb_page_compressed9 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=9; select count(*) from innodb_page_compressed1; count(*) -5000 -select count(*) from innodb_page_compressed1 where c1 < 500000; +10000 +select count(*) from innodb_page_compressed3; count(*) -5000 -select count(*) from innodb_page_compressed2 where c1 < 500000; +10000 +select count(*) from innodb_page_compressed4; count(*) -5000 -select count(*) from innodb_page_compressed3 where c1 < 500000; +10000 +select count(*) from innodb_page_compressed5; count(*) -5000 -select count(*) from innodb_page_compressed4 where c1 < 500000; +10000 +select count(*) from innodb_page_compressed6; count(*) -5000 -select count(*) from innodb_page_compressed5 where c1 < 500000; +10000 +select count(*) from innodb_page_compressed6; count(*) -5000 -select count(*) from innodb_page_compressed6 where c1 < 500000; +10000 +select count(*) from innodb_page_compressed7; count(*) -5000 -select count(*) from innodb_page_compressed7 where c1 < 500000; +10000 +select count(*) from innodb_page_compressed8; count(*) -5000 -select count(*) from innodb_page_compressed8 where c1 < 500000; +10000 +select count(*) from innodb_page_compressed9; count(*) -5000 -select count(*) from innodb_page_compressed9 where c1 < 500000; -count(*) -5000 -alter table innodb_normal page_compressed=1 page_compression_level=8; -show warnings; -Level Code Message -show create table innodb_normal; -Table Create Table -innodb_normal CREATE TABLE `innodb_normal` ( - `c1` int(11) DEFAULT NULL, - `b` char(200) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 `page_compressed`=1 `page_compression_level`=8 -alter table innodb_compressed row_format=default page_compressed=1 page_compression_level=8 key_block_size=0; -show warnings; -Level Code Message -show create table innodb_compressed; -Table Create Table -innodb_compressed CREATE TABLE `innodb_compressed` ( - `c1` int(11) DEFAULT NULL, - `b` char(200) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 `page_compressed`=1 `page_compression_level`=8 -update innodb_page_compressed1 set c1 = c1 + 1; -update innodb_page_compressed2 set c1 = c1 + 1; -update innodb_page_compressed3 set c1 = c1 + 1; -update innodb_page_compressed4 set c1 = c1 + 1; -update innodb_page_compressed5 set c1 = c1 + 1; -update innodb_page_compressed6 set c1 = c1 + 1; -update innodb_page_compressed7 set c1 = c1 + 1; -update innodb_page_compressed8 set c1 = c1 + 1; -update innodb_page_compressed9 set c1 = c1 + 1; -select count(*) from innodb_compressed; -count(*) -5000 +10000 +# innodb_normal expected FOUND +FOUND 24084 /AaAaAaAa/ in innodb_normal.ibd +# innodb_page_compressed1 page compressed expected NOT FOUND +NOT FOUND /AaAaAaAa/ in innodb_page_compressed1.ibd +# innodb_page_compressed2 page compressed expected NOT FOUND +NOT FOUND /AaAaAaAa/ in innodb_page_compressed2.ibd +# innodb_page_compressed3 page compressed expected NOT FOUND +NOT FOUND /AaAaAaAa/ in innodb_page_compressed3.ibd +# innodb_page_compressed4 page compressed expected NOT FOUND +NOT FOUND /AaAaAaAa/ in innodb_page_compressed4.ibd +# innodb_page_compressed5 page compressed expected NOT FOUND +NOT FOUND /AaAaAaAa/ in innodb_page_compressed5.ibd +# innodb_page_compressed6 page compressed expected NOT FOUND +NOT FOUND /AaAaAaAa/ in innodb_page_compressed6.ibd +# innodb_page_compressed7 page compressed expected NOT FOUND +NOT FOUND /AaAaAaAa/ in innodb_page_compressed7.ibd +# innodb_page_compressed8 page compressed expected NOT FOUND +NOT FOUND /AaAaAaAa/ in innodb_page_compressed8.ibd +# innodb_page_compressed9 page compressed expected NOT FOUND +NOT FOUND /AaAaAaAa/ in innodb_page_compressed9.ibd select count(*) from innodb_page_compressed1; count(*) -5000 -select count(*) from innodb_page_compressed1 where c1 < 500000; +10000 +select count(*) from innodb_page_compressed3; count(*) -5000 -select count(*) from innodb_page_compressed2 where c1 < 500000; +10000 +select count(*) from innodb_page_compressed4; count(*) -5000 -select count(*) from innodb_page_compressed3 where c1 < 500000; +10000 +select count(*) from innodb_page_compressed5; count(*) -5000 -select count(*) from innodb_page_compressed4 where c1 < 500000; +10000 +select count(*) from innodb_page_compressed6; count(*) -5000 -select count(*) from innodb_page_compressed5 where c1 < 500000; +10000 +select count(*) from innodb_page_compressed6; count(*) -5000 -select count(*) from innodb_page_compressed6 where c1 < 500000; +10000 +select count(*) from innodb_page_compressed7; count(*) -5000 -select count(*) from innodb_page_compressed7 where c1 < 500000; +10000 +select count(*) from innodb_page_compressed8; count(*) -5000 -select count(*) from innodb_page_compressed8 where c1 < 500000; +10000 +select count(*) from innodb_page_compressed9; count(*) -5000 -select count(*) from innodb_page_compressed9 where c1 < 500000; -count(*) -5000 -update innodb_page_compressed1 set c1 = c1 + 1; -update innodb_page_compressed2 set c1 = c1 + 1; -update innodb_page_compressed3 set c1 = c1 + 1; -update innodb_page_compressed4 set c1 = c1 + 1; -update innodb_page_compressed5 set c1 = c1 + 1; -update innodb_page_compressed6 set c1 = c1 + 1; -update innodb_page_compressed7 set c1 = c1 + 1; -update innodb_page_compressed8 set c1 = c1 + 1; -update innodb_page_compressed9 set c1 = c1 + 1; -select count(*) from innodb_compressed; -count(*) -5000 -select count(*) from innodb_page_compressed1; -count(*) -5000 -select count(*) from innodb_page_compressed1 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed2 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed3 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed4 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed5 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed6 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed7 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed8 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed9 where c1 < 500000; -count(*) -5000 -set global innodb_compression_algorithm = 1; -update innodb_page_compressed1 set c1 = c1 + 1; -update innodb_page_compressed2 set c1 = c1 + 1; -update innodb_page_compressed3 set c1 = c1 + 1; -update innodb_page_compressed4 set c1 = c1 + 1; -update innodb_page_compressed5 set c1 = c1 + 1; -update innodb_page_compressed6 set c1 = c1 + 1; -update innodb_page_compressed7 set c1 = c1 + 1; -update innodb_page_compressed8 set c1 = c1 + 1; -update innodb_page_compressed9 set c1 = c1 + 1; -commit; -select count(*) from innodb_compressed; -count(*) -5000 -select count(*) from innodb_page_compressed1; -count(*) -5000 -select count(*) from innodb_page_compressed1 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed2 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed3 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed4 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed5 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed6 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed7 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed8 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed9 where c1 < 500000; -count(*) -5000 -update innodb_page_compressed1 set c1 = c1 + 1; -update innodb_page_compressed2 set c1 = c1 + 1; -update innodb_page_compressed3 set c1 = c1 + 1; -update innodb_page_compressed4 set c1 = c1 + 1; -update innodb_page_compressed5 set c1 = c1 + 1; -update innodb_page_compressed6 set c1 = c1 + 1; -update innodb_page_compressed7 set c1 = c1 + 1; -update innodb_page_compressed8 set c1 = c1 + 1; -update innodb_page_compressed9 set c1 = c1 + 1; -select count(*) from innodb_compressed; -count(*) -5000 -select count(*) from innodb_page_compressed1; -count(*) -5000 -select count(*) from innodb_page_compressed1 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed2 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed3 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed4 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed5 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed6 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed7 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed8 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed9 where c1 < 500000; -count(*) -5000 -set global innodb_compression_algorithm = 0; -update innodb_page_compressed1 set c1 = c1 + 1; -update innodb_page_compressed2 set c1 = c1 + 1; -update innodb_page_compressed3 set c1 = c1 + 1; -update innodb_page_compressed4 set c1 = c1 + 1; -update innodb_page_compressed5 set c1 = c1 + 1; -update innodb_page_compressed6 set c1 = c1 + 1; -update innodb_page_compressed7 set c1 = c1 + 1; -update innodb_page_compressed8 set c1 = c1 + 1; -update innodb_page_compressed9 set c1 = c1 + 1; -commit; -select count(*) from innodb_compressed; -count(*) -5000 -select count(*) from innodb_page_compressed1; -count(*) -5000 -select count(*) from innodb_page_compressed1 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed2 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed3 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed4 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed5 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed6 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed7 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed8 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed9 where c1 < 500000; -count(*) -5000 -update innodb_page_compressed1 set c1 = c1 + 1; -update innodb_page_compressed2 set c1 = c1 + 1; -update innodb_page_compressed3 set c1 = c1 + 1; -update innodb_page_compressed4 set c1 = c1 + 1; -update innodb_page_compressed5 set c1 = c1 + 1; -update innodb_page_compressed6 set c1 = c1 + 1; -update innodb_page_compressed7 set c1 = c1 + 1; -update innodb_page_compressed8 set c1 = c1 + 1; -update innodb_page_compressed9 set c1 = c1 + 1; -select count(*) from innodb_compressed; -count(*) -5000 -select count(*) from innodb_page_compressed1; -count(*) -5000 -select count(*) from innodb_page_compressed1 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed2 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed3 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed4 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed5 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed6 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed7 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed8 where c1 < 500000; -count(*) -5000 -select count(*) from innodb_page_compressed9 where c1 < 500000; -count(*) -5000 -drop procedure innodb_insert_proc; +10000 drop table innodb_normal; -drop table innodb_compressed; drop table innodb_page_compressed1; drop table innodb_page_compressed2; drop table innodb_page_compressed3; @@ -434,3 +96,4 @@ drop table innodb_page_compressed6; drop table innodb_page_compressed7; drop table innodb_page_compressed8; drop table innodb_page_compressed9; +#done diff --git a/mysql-test/suite/innodb/r/innodb-table-online,crypt.rdiff b/mysql-test/suite/innodb/r/innodb-table-online,crypt.rdiff new file mode 100644 index 00000000000..624af214722 --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb-table-online,crypt.rdiff @@ -0,0 +1,20 @@ +--- innodb-table-online.result ++++ innodb-table-online,crypt.reject +@@ -291,7 +291,7 @@ + @merge_encrypt_1>@merge_encrypt_0, @merge_decrypt_1>@merge_decrypt_0, + @rowlog_encrypt_1>@rowlog_encrypt_0; + sort_balance @merge_encrypt_1>@merge_encrypt_0 @merge_decrypt_1>@merge_decrypt_0 @rowlog_encrypt_1>@rowlog_encrypt_0 +-0 0 0 0 ++0 0 0 1 + SET DEBUG_SYNC = 'now SIGNAL dml2_done'; + # session con1 + connection con1; +@@ -393,7 +393,7 @@ + @rowlog_encrypt_2-@rowlog_encrypt_1>0 as log_encrypted, + @rowlog_decrypt_2-@rowlog_decrypt_1>0 as log_decrypted; + sort_encrypted sort_decrypted log_encrypted log_decrypted +-0 0 0 0 ++1 1 1 1 + ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY c3p5(c3(5)); + ERROR 23000: Duplicate entry '' for key 'PRIMARY' + UPDATE t1 SET c3 = NULL WHERE c3 = ''; diff --git a/mysql-test/suite/innodb/r/innodb-table-online.result b/mysql-test/suite/innodb/r/innodb-table-online.result new file mode 100644 index 00000000000..ec5199e4f52 --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb-table-online.result @@ -0,0 +1,497 @@ +call mtr.add_suppression("InnoDB: Warning: Small buffer pool size"); +call mtr.add_suppression("InnoDB: Error: table 'test/t1'"); +call mtr.add_suppression("MySQL is trying to open a table handle but the .ibd file for"); +SET @global_innodb_file_per_table_orig = @@global.innodb_file_per_table; +SET GLOBAL innodb_file_per_table = on; +CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT NOT NULL, c3 CHAR(255) NOT NULL) +ENGINE = InnoDB; +INSERT INTO t1 VALUES (1,1,''), (2,2,''), (3,3,''), (4,4,''), (5,5,''); +SET GLOBAL innodb_monitor_enable = module_ddl; +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 0 +ddl_pending_alter_table 0 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 0 +SET DEBUG_SYNC = 'RESET'; +SET DEBUG_SYNC = 'write_row_noreplace SIGNAL have_handle WAIT_FOR go_ahead'; +INSERT INTO t1 VALUES(1,2,3); +# Establish session con1 (user=root) +connect con1,localhost,root,,; +connection con1; +SET DEBUG_SYNC = 'now WAIT_FOR have_handle'; +SET lock_wait_timeout = 1; +ALTER TABLE t1 ROW_FORMAT=REDUNDANT; +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +SET DEBUG_SYNC = 'now SIGNAL go_ahead'; +# session default +connection default; +ERROR 23000: Duplicate entry '1' for key 'PRIMARY' +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 0 +ddl_pending_alter_table 0 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 0 +# session con1 +connection con1; +SET @saved_debug_dbug = @@SESSION.debug_dbug; +SET DEBUG_DBUG = '+d,innodb_OOM_prepare_inplace_alter'; +ALTER TABLE t1 ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE, LOCK=NONE; +ERROR HY000: Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space +SET SESSION DEBUG = @saved_debug_dbug; +Warnings: +Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead +SET SESSION DEBUG = '+d,innodb_OOM_inplace_alter'; +Warnings: +Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead +ALTER TABLE t1 ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE, LOCK=NONE; +ERROR HY000: Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space +SET SESSION DEBUG = @saved_debug_dbug; +Warnings: +Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead +ALTER TABLE t1 ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE, LOCK=NONE; +# session default +connection default; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL, + `c2` int(11) NOT NULL, + `c3` char(255) NOT NULL, + PRIMARY KEY (`c1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=REDUNDANT +BEGIN; +INSERT INTO t1 VALUES(7,4,2); +# session con1 +connection con1; +SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL scanned WAIT_FOR insert_done'; +ALTER TABLE t1 DROP PRIMARY KEY, ADD UNIQUE INDEX(c2); +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +# session default +connection default; +COMMIT; +# session con1 +connection con1; +ALTER TABLE t1 DROP PRIMARY KEY, ADD UNIQUE INDEX(c2); +ERROR 23000: Duplicate entry '4' for key 'c2' +# session default +connection default; +DELETE FROM t1 WHERE c1 = 7; +# session con1 +connection con1; +ALTER TABLE t1 DROP PRIMARY KEY, ADD UNIQUE INDEX(c2), ROW_FORMAT=COMPACT, +LOCK = SHARED, ALGORITHM = INPLACE; +ALTER TABLE t1 ADD UNIQUE INDEX(c2), +LOCK = EXCLUSIVE, ALGORITHM = INPLACE; +Warnings: +Note 1831 Duplicate index `c2_2`. This is deprecated and will be disallowed in a future release +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL, + `c2` int(11) NOT NULL, + `c3` char(255) NOT NULL, + UNIQUE KEY `c2` (`c2`), + UNIQUE KEY `c2_2` (`c2`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT +ALTER TABLE t1 DROP INDEX c2, ALGORITHM = INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Dropping a primary key is not allowed without also adding a new primary key. Try ALGORITHM=COPY +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL, + `c2` int(11) NOT NULL, + `c3` char(255) NOT NULL, + UNIQUE KEY `c2` (`c2`), + UNIQUE KEY `c2_2` (`c2`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT +ALTER TABLE t1 DROP INDEX c2, ADD PRIMARY KEY(c1); +# session default +connection default; +SET DEBUG_SYNC = 'now WAIT_FOR scanned'; +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 1 +ddl_pending_alter_table 1 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 0 +BEGIN; +INSERT INTO t1 VALUES(4,7,2); +SET DEBUG_SYNC = 'now SIGNAL insert_done'; +# session con1 +connection con1; +ERROR 23000: Duplicate entry '4' for key 'PRIMARY' +# session default +connection default; +ROLLBACK; +# session con1 +connection con1; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL, + `c2` int(11) NOT NULL, + `c3` char(255) NOT NULL, + UNIQUE KEY `c2` (`c2`), + UNIQUE KEY `c2_2` (`c2`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT +ALTER TABLE t1 DROP PRIMARY KEY, ADD UNIQUE INDEX(c2), ALGORITHM = INPLACE; +ERROR 42000: Can't DROP INDEX `PRIMARY`; check that it exists +ALTER TABLE t1 DROP INDEX c2, ADD PRIMARY KEY(c1), ALGORITHM = INPLACE; +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 0 +ddl_pending_alter_table 0 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 0 +# session default +connection default; +INSERT INTO t1 VALUES(6,3,1); +ERROR 23000: Duplicate entry '3' for key 'c2_2' +INSERT INTO t1 VALUES(7,4,2); +ERROR 23000: Duplicate entry '4' for key 'c2_2' +DROP INDEX c2_2 ON t1; +BEGIN; +INSERT INTO t1 VALUES(7,4,2); +ROLLBACK; +# session con1 +connection con1; +KILL QUERY @id; +ERROR 70100: Query execution was interrupted +SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL rebuilt WAIT_FOR kill_done'; +ALTER TABLE t1 ROW_FORMAT=REDUNDANT; +# session default +connection default; +SET DEBUG_SYNC = 'now WAIT_FOR rebuilt'; +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 1 +ddl_pending_alter_table 1 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 0 +KILL QUERY @id; +SET DEBUG_SYNC = 'now SIGNAL kill_done'; +# session con1 +connection con1; +ERROR 70100: Query execution was interrupted +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 0 +ddl_pending_alter_table 0 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 0 +# session default +connection default; +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +INSERT INTO t1 SELECT 5 + c1, c2, c3 FROM t1; +INSERT INTO t1 SELECT 10 + c1, c2, c3 FROM t1; +INSERT INTO t1 SELECT 20 + c1, c2, c3 FROM t1; +INSERT INTO t1 SELECT 40 + c1, c2, c3 FROM t1; +EXPLAIN SELECT COUNT(*) FROM t1 WHERE c2 > 3; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL ROWS Using where +ANALYZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +SET @merge_encrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +# session con1 +connection con1; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL, + `c2` int(11) NOT NULL, + `c3` char(255) NOT NULL, + PRIMARY KEY (`c1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT +SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL rebuilt2 WAIT_FOR dml2_done'; +SET lock_wait_timeout = 10; +ALTER TABLE t1 ROW_FORMAT=COMPACT, ALGORITHM = INPLACE; +# session default +connection default; +INSERT INTO t1 SELECT 80 + c1, c2, c3 FROM t1; +INSERT INTO t1 SELECT 160 + c1, c2, c3 FROM t1; +UPDATE t1 SET c2 = c2 + 1; +SET DEBUG_SYNC = 'now WAIT_FOR rebuilt2'; +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 1 +ddl_pending_alter_table 1 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 1 +BEGIN; +DELETE FROM t1; +ROLLBACK; +UPDATE t1 SET c2 = c2 + 1; +BEGIN; +UPDATE t1 SET c2 = c2 + 1; +DELETE FROM t1; +ROLLBACK; +BEGIN; +DELETE FROM t1; +ROLLBACK; +UPDATE t1 SET c2 = c2 + 1; +BEGIN; +UPDATE t1 SET c2 = c2 + 1; +DELETE FROM t1; +ROLLBACK; +BEGIN; +DELETE FROM t1; +ROLLBACK; +UPDATE t1 SET c2 = c2 + 1; +BEGIN; +UPDATE t1 SET c2 = c2 + 1; +DELETE FROM t1; +ROLLBACK; +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 1 +ddl_pending_alter_table 1 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 1 +SET @merge_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +SELECT +(@merge_encrypt_1-@merge_encrypt_0)- +(@merge_decrypt_1-@merge_decrypt_0) as sort_balance, +@merge_encrypt_1>@merge_encrypt_0, @merge_decrypt_1>@merge_decrypt_0, +@rowlog_encrypt_1>@rowlog_encrypt_0; +sort_balance @merge_encrypt_1>@merge_encrypt_0 @merge_decrypt_1>@merge_decrypt_0 @rowlog_encrypt_1>@rowlog_encrypt_0 +0 0 0 0 +SET DEBUG_SYNC = 'now SIGNAL dml2_done'; +# session con1 +connection con1; +ERROR HY000: Creating index 'PRIMARY' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 0 +ddl_pending_alter_table 0 +ddl_sort_file_alter_table 0 +ddl_log_file_alter_table 1 +SET @merge_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +SET @rowlog_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); +SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL rebuilt3 WAIT_FOR dml3_done'; +ALTER TABLE t1 ADD PRIMARY KEY(c22f), CHANGE c2 c22f INT; +ERROR 42000: Multiple primary key defined +ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY(c22f), CHANGE c2 c22f INT; +ERROR 23000: Duplicate entry '5' for key 'PRIMARY' +ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY(c22f,c1,c4(5)), +CHANGE c2 c22f INT, CHANGE c3 c3 CHAR(255) NULL, CHANGE c1 c1 INT AFTER c22f, +ADD COLUMN c4 VARCHAR(6) DEFAULT 'Online', LOCK=NONE; +# session default +connection default; +SET DEBUG_SYNC = 'now WAIT_FOR rebuilt3'; +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 1 +ddl_pending_alter_table 1 +ddl_sort_file_alter_table 2 +ddl_log_file_alter_table 1 +BEGIN; +INSERT INTO t1 SELECT 320 + c1, c2, c3 FROM t1 WHERE c1 > 240; +DELETE FROM t1 WHERE c1 > 320; +ROLLBACK; +BEGIN; +UPDATE t1 SET c2 = c2 + 1; +DELETE FROM t1; +ROLLBACK; +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 1 +ddl_pending_alter_table 1 +ddl_sort_file_alter_table 2 +ddl_log_file_alter_table 2 +SET DEBUG_SYNC = 'now SIGNAL dml3_done'; +# session con1 +connection con1; +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 0 +ddl_pending_alter_table 0 +ddl_sort_file_alter_table 2 +ddl_log_file_alter_table 2 +SELECT COUNT(c22f) FROM t1; +COUNT(c22f) +320 +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +SET @merge_encrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +SET @rowlog_decrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); +SELECT +(@merge_encrypt_2-@merge_encrypt_1)- +(@merge_decrypt_2-@merge_decrypt_1) as sort_balance, +(@rowlog_encrypt_2-@rowlog_encrypt_1)- +(@rowlog_decrypt_2-@rowlog_decrypt_1) as log_balance; +sort_balance log_balance +0 0 +SELECT +@merge_encrypt_2-@merge_encrypt_1>0 as sort_encrypted, +@merge_decrypt_2-@merge_decrypt_1>0 as sort_decrypted, +@rowlog_encrypt_2-@rowlog_encrypt_1>0 as log_encrypted, +@rowlog_decrypt_2-@rowlog_decrypt_1>0 as log_decrypted; +sort_encrypted sort_decrypted log_encrypted log_decrypted +0 0 0 0 +ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY c3p5(c3(5)); +ERROR 23000: Duplicate entry '' for key 'PRIMARY' +UPDATE t1 SET c3 = NULL WHERE c3 = ''; +SET lock_wait_timeout = 1; +ALTER TABLE t1 DROP COLUMN c22f, ADD PRIMARY KEY c3p5(c3(5)); +ERROR 42000: Key column 'c22f' doesn't exist in table +SET @old_sql_mode = @@sql_mode; +SET @@sql_mode = 'STRICT_TRANS_TABLES'; +ALTER TABLE t1 DROP COLUMN c22f, DROP PRIMARY KEY, ADD PRIMARY KEY c3p5(c3(5)), +ALGORITHM = INPLACE; +ERROR 22004: Invalid use of NULL value +ALTER TABLE t1 MODIFY c3 CHAR(255) NOT NULL; +ERROR 22004: Invalid use of NULL value +SET @@sql_mode = @old_sql_mode; +UPDATE t1 SET c3=LEFT(CONCAT(c1,REPEAT('foo',c1)),255) WHERE c3 IS NULL; +SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL c3p5_created0 WAIT_FOR ins_done0'; +SET @@sql_mode = 'STRICT_TRANS_TABLES'; +ALTER TABLE t1 MODIFY c3 CHAR(255) NOT NULL, DROP COLUMN c22f, +DROP PRIMARY KEY, ADD PRIMARY KEY(c1,c4(5)), +ADD COLUMN c5 CHAR(5) DEFAULT 'tired' FIRST; +# session default +connection default; +SET DEBUG_SYNC = 'now WAIT_FOR c3p5_created0'; +BEGIN; +INSERT INTO t1 VALUES(347,33101,'Pikku kakkosen posti','YLETV2'); +INSERT INTO t1 VALUES(33101,347,NULL,''); +SET DEBUG_SYNC = 'now SIGNAL ins_done0'; +# session con1 +connection con1; +ERROR 22004: Invalid use of NULL value +SET @@sql_mode = @old_sql_mode; +# session default +connection default; +ROLLBACK; +# session con1 +connection con1; +ALTER TABLE t1 MODIFY c3 CHAR(255) NOT NULL; +SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL c3p5_created WAIT_FOR ins_done'; +ALTER TABLE t1 DROP PRIMARY KEY, DROP COLUMN c22f, +ADD COLUMN c6 VARCHAR(1000) DEFAULT +'I love tracking down hard-to-reproduce bugs.', +ADD PRIMARY KEY c3p5(c3(5), c6(2)); +# session default +connection default; +SET DEBUG_SYNC = 'now WAIT_FOR c3p5_created'; +SET DEBUG_SYNC = 'ib_after_row_insert SIGNAL ins_done WAIT_FOR ddl_timed_out'; +INSERT INTO t1 VALUES(347,33101,NULL,''); +ERROR 23000: Column 'c3' cannot be null +INSERT INTO t1 VALUES(347,33101,'Pikku kakkosen posti',''); +# session con1 +connection con1; +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +SET DEBUG_SYNC = 'now SIGNAL ddl_timed_out'; +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +name count +ddl_background_drop_indexes 0 +ddl_background_drop_tables 0 +ddl_online_create_index 0 +ddl_pending_alter_table 0 +ddl_sort_file_alter_table 6 +ddl_log_file_alter_table 2 +# session default +connection default; +SELECT COUNT(*) FROM t1; +COUNT(*) +321 +ALTER TABLE t1 ROW_FORMAT=REDUNDANT; +SELECT * FROM t1 LIMIT 10; +c22f c1 c3 c4 +5 1 1foo Online +5 6 6foofoofoofoofoofoo Online +5 11 11foofoofoofoofoofoofoofoofoofoofoo Online +5 16 16foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo Online +5 21 21foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo Online +5 26 26foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo Online +5 31 31foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo Online +5 36 36foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo Online +5 41 41foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo Online +5 46 46foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo Online +# session con1 +connection con1; +ALTER TABLE t1 DISCARD TABLESPACE; +# Disconnect session con1 +disconnect con1; +# session default +connection default; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c22f` int(11) NOT NULL, + `c1` int(11) NOT NULL, + `c3` char(255) NOT NULL, + `c4` varchar(6) NOT NULL DEFAULT 'Online', + PRIMARY KEY (`c22f`,`c1`,`c4`(5)) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=REDUNDANT +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL innodb_monitor_disable = module_ddl; +DROP TABLE t1; +SET GLOBAL innodb_file_per_table = @global_innodb_file_per_table_orig; +SET GLOBAL innodb_monitor_enable = default; +SET GLOBAL innodb_monitor_disable = default; diff --git a/mysql-test/suite/innodb/r/innodb-virtual-columns2.result b/mysql-test/suite/innodb/r/innodb-virtual-columns2.result new file mode 100644 index 00000000000..3574ba72849 --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb-virtual-columns2.result @@ -0,0 +1,64 @@ +CREATE TABLE t1 ( +y YEAR NULL, +i SMALLINT NULL, +c VARCHAR(8) NOT NULL DEFAULT '', +vi SMALLINT AS (i) VIRTUAL, +INDEX(y) +) ENGINE=InnoDB; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `y` year(4) DEFAULT NULL, + `i` smallint(6) DEFAULT NULL, + `c` varchar(8) NOT NULL DEFAULT '', + `vi` smallint(6) GENERATED ALWAYS AS (`i`) VIRTUAL, + KEY `y` (`y`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT * FROM t1 WHERE y BETWEEN 2012 AND 2016 FOR UPDATE; +y i c vi +INSERT INTO t1 (i) VALUES (1),(2); +SELECT * FROM t1 WHERE y BETWEEN 2012 AND 2016 FOR UPDATE; +y i c vi +DROP TABLE t1; +CREATE TABLE t1 ( +y YEAR NULL, +i SMALLINT NULL, +vi SMALLINT AS (i) VIRTUAL, +INDEX(y) +) ENGINE=InnoDB; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `y` year(4) DEFAULT NULL, + `i` smallint(6) DEFAULT NULL, + `vi` smallint(6) GENERATED ALWAYS AS (`i`) VIRTUAL, + KEY `y` (`y`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT * FROM t1 WHERE y BETWEEN 2012 AND 2016 FOR UPDATE; +y i vi +INSERT INTO t1 (i) VALUES (1),(2); +SELECT * FROM t1 WHERE y BETWEEN 2012 AND 2016 FOR UPDATE; +y i vi +DROP TABLE t1; +CREATE TABLE t1 ( +y YEAR NULL, +i SMALLINT NULL, +b BLOB NULL, +vi SMALLINT AS (i) VIRTUAL, +INDEX(y) +) ENGINE=InnoDB; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `y` year(4) DEFAULT NULL, + `i` smallint(6) DEFAULT NULL, + `b` blob DEFAULT NULL, + `vi` smallint(6) GENERATED ALWAYS AS (`i`) VIRTUAL, + KEY `y` (`y`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT * FROM t1 WHERE y BETWEEN 2012 AND 2016 FOR UPDATE; +y i b vi +INSERT INTO t1 (i) VALUES (1),(2); +SELECT * FROM t1 WHERE y BETWEEN 2012 AND 2016 FOR UPDATE; +y i b vi +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/innodb-wl5522-debug.result b/mysql-test/suite/innodb/r/innodb-wl5522-debug.result index 4d748d6ebed..99e9c49eee9 100644 --- a/mysql-test/suite/innodb/r/innodb-wl5522-debug.result +++ b/mysql-test/suite/innodb/r/innodb-wl5522-debug.result @@ -494,7 +494,9 @@ c4 VARCHAR(2048), INDEX idx1(c2), INDEX idx2(c3(512)), INDEX idx3(c4(512))) Engine=InnoDB; -SET GLOBAL INNODB_PURGE_STOP_NOW=ON; +connect purge_control,localhost,root; +START TRANSACTION WITH CONSISTENT SNAPSHOT; +connection default; SET GLOBAL innodb_disable_background_merge=ON; SET GLOBAL innodb_monitor_reset = ibuf_merges; SET GLOBAL innodb_monitor_reset = ibuf_merges_insert; @@ -659,7 +661,10 @@ FROM information_schema.innodb_metrics WHERE name = 'ibuf_merges_inserts' AND count > 0; name SET GLOBAL innodb_disable_background_merge=OFF; -SET GLOBAL INNODB_PURGE_RUN_NOW=ON; +connection purge_control; +COMMIT; +disconnect purge_control; +connection default; DROP TABLE test_wl5522.t1; CREATE TABLE test_wl5522.t1 ( c1 BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, diff --git a/mysql-test/suite/innodb/r/innodb-wl5980-alter.result b/mysql-test/suite/innodb/r/innodb-wl5980-alter.result new file mode 100644 index 00000000000..edd101efebb --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb-wl5980-alter.result @@ -0,0 +1,1420 @@ +# +# This is a copy of innodb-alter.test except using remote tablespaces +# and showing those files. +# +SET default_storage_engine=InnoDB; +SET GLOBAL innodb_file_per_table=ON; +SET NAMES utf8mb4; +CREATE TABLE t1 ( +c1 INT PRIMARY KEY, c2 INT DEFAULT 1, ct TEXT, +INDEX(c2)) +ENGINE=InnoDB DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir'; +INSERT INTO t1 SET c1=1; +CREATE TABLE sys_tables SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES +WHERE NAME LIKE 'test/t%'; +CREATE TABLE sys_indexes SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +CREATE TABLE t1p LIKE t1; +CREATE TABLE t1c (c1 INT PRIMARY KEY, c2 INT, c3 INT, INDEX(c2), INDEX(c3), +CONSTRAINT t1c2 FOREIGN KEY (c2) REFERENCES t1(c2), +CONSTRAINT t1c3 FOREIGN KEY (c3) REFERENCES t1p(c2)) +ENGINE=InnoDB DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir'; +CREATE TABLE sys_foreign SELECT i.* +FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN i +WHERE FOR_NAME LIKE 'test/t%'; +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 c2 0 +test/t1c3 c3 c2 0 +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +c2 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +c2 0 c2 +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 c2 0 +test/t1c3 c3 c2 0 +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL, + `c2` int(11) DEFAULT '1', + `ct` text, + PRIMARY KEY (`c1`), + KEY `c2` (`c2`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir/' +ALTER TABLE t1 ALTER c2 DROP DEFAULT; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL, + `c2` int(11), + `ct` text, + PRIMARY KEY (`c1`), + KEY `c2` (`c2`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir/' +### files in MYSQL_DATA_DIR/test +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1.frm +t1.isl +t1c.frm +t1c.isl +t1p.frm +t1p.ibd +### files in MYSQL_TMP_DIR/alt_dir/test +t1.ibd +t1c.ibd +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +c2 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +c2 0 c2 +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 c2 0 +test/t1c3 c3 c2 0 +ALTER TABLE t1 CHANGE c2 c2 INT AFTER c1; +ALTER TABLE t1 CHANGE c1 c1 INT FIRST; +### files in MYSQL_DATA_DIR/test +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1.frm +t1.isl +t1c.frm +t1c.isl +t1p.frm +t1p.ibd +### files in MYSQL_TMP_DIR/alt_dir/test +t1.ibd +t1c.ibd +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +c2 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +c2 0 c2 +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 c2 0 +test/t1c3 c3 c2 0 +ALTER TABLE t1 CHANGE C2 c3 INT; +### files in MYSQL_DATA_DIR/test +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1.frm +t1.isl +t1c.frm +t1c.isl +t1p.frm +t1p.ibd +### files in MYSQL_TMP_DIR/alt_dir/test +t1.ibd +t1c.ibd +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +c3 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +c2 0 c3 +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 c3 0 +test/t1c3 c3 c2 0 +ALTER TABLE t1 CHANGE c3 C INT; +### files in MYSQL_DATA_DIR/test +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1.frm +t1.isl +t1c.frm +t1c.isl +t1p.frm +t1p.ibd +### files in MYSQL_TMP_DIR/alt_dir/test +t1.ibd +t1c.ibd +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +C 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +c2 0 C +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 C 0 +test/t1c3 c3 c2 0 +ALTER TABLE t1 CHANGE C Cöŀumň_TWO INT; +### files in MYSQL_DATA_DIR/test +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1.frm +t1.isl +t1c.frm +t1c.isl +t1p.frm +t1p.ibd +### files in MYSQL_TMP_DIR/alt_dir/test +t1.ibd +t1c.ibd +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 Cöŀumň_TWO 0 +test/t1c3 c3 c2 0 +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +Cöŀumň_TWO 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +c2 0 Cöŀumň_TWO +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 Cöŀumň_TWO 0 +test/t1c3 c3 c2 0 +ALTER TABLE t1 CHANGE cöĿǖmň_two c3 INT; +ERROR 42S22: Unknown column 'cöĿǖmň_two' in 't1' +ALTER TABLE t1 CHANGE cÖĿUMŇ_two c3 INT, RENAME TO t3; +### files in MYSQL_DATA_DIR/test +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1c.frm +t1c.isl +t1p.frm +t1p.ibd +t3.frm +t3.isl +### files in MYSQL_TMP_DIR/alt_dir/test +t1c.ibd +t3.ibd +SELECT st.NAME, i.NAME +FROM sys_tables st INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES i +ON i.TABLE_ID=st.TABLE_ID; +NAME NAME +test/t1 test/t3 +SHOW CREATE TABLE t3; +Table Create Table +t3 CREATE TABLE `t3` ( + `c1` int(11) NOT NULL, + `c3` int(11) DEFAULT NULL, + `ct` text, + PRIMARY KEY (`c1`), + KEY `c2` (`c3`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir/' +SHOW CREATE TABLE t1c; +Table Create Table +t1c CREATE TABLE `t1c` ( + `c1` int(11) NOT NULL, + `c2` int(11) DEFAULT NULL, + `c3` int(11) DEFAULT NULL, + PRIMARY KEY (`c1`), + KEY `c2` (`c2`), + KEY `c3` (`c3`), + CONSTRAINT `t1c2` FOREIGN KEY (`c2`) REFERENCES `t3` (`c3`), + CONSTRAINT `t1c3` FOREIGN KEY (`c3`) REFERENCES `t1p` (`c2`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir/' +ALTER TABLE t3 CHANGE c3 +`12345678901234567890123456789012345678901234567890123456789012345` INT; +ERROR 42000: Identifier name '12345678901234567890123456789012345678901234567890123456789012345' is too long +ALTER TABLE t3 CHANGE c3 +`1234567890123456789012345678901234567890123456789012345678901234` INT; +### files in MYSQL_DATA_DIR/test +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1c.frm +t1c.isl +t1p.frm +t1p.ibd +t3.frm +t3.isl +### files in MYSQL_TMP_DIR/alt_dir/test +t1c.ibd +t3.ibd +SHOW CREATE TABLE t3; +Table Create Table +t3 CREATE TABLE `t3` ( + `c1` int(11) NOT NULL, + `1234567890123456789012345678901234567890123456789012345678901234` int(11) DEFAULT NULL, + `ct` text, + PRIMARY KEY (`c1`), + KEY `c2` (`1234567890123456789012345678901234567890123456789012345678901234`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir/' +ALTER TABLE t3 CHANGE +`1234567890123456789012345678901234567890123456789012345678901234` +`倀å€å€‚倃倄倅倆倇倈倉倊個倌å€å€Žå€å€å€‘倒倓倔倕倖倗倘候倚倛倜å€å€žå€Ÿå€ å€¡å€¢å€£å€¤å€¥å€¦å€§å€¨å€©å€ªå€«å€¬å€­å€®å€¯å€°å€±å€²å€³å€´å€µå€¶å€·å€¸å€¹å€ºå€»å€¼å€½å€¾å€¿å€` INT; +ERROR 42000: Identifier name '倀å€å€‚倃倄倅倆倇倈倉倊個倌å€å€Žå€å€å€‘倒倓倔倕倖倗倘候倚倛倜å€å€žå€Ÿå€ ' is too long +ALTER TABLE t3 CHANGE +`1234567890123456789012345678901234567890123456789012345678901234` +`倀å€å€‚倃倄倅倆倇倈倉倊個倌å€å€Žå€å€å€‘倒倓倔倕倖倗倘候倚倛倜å€å€žå€Ÿå€ å€¡å€¢å€£å€¤å€¥å€¦å€§å€¨å€©å€ªå€«å€¬å€­å€®å€¯å€°å€±å€²å€³å€´å€µå€¶å€·å€¸å€¹å€ºå€»å€¼å€½å€¾å€¿Ã¤` INT; +ERROR 42000: Identifier name '倀å€å€‚倃倄倅倆倇倈倉倊個倌å€å€Žå€å€å€‘倒倓倔倕倖倗倘候倚倛倜å€å€žå€Ÿå€ ' is too long +ALTER TABLE t3 CHANGE +`1234567890123456789012345678901234567890123456789012345678901234` +`倀å€å€‚倃倄倅倆倇倈倉倊個倌å€å€Žå€å€å€‘倒倓倔倕倖倗倘候倚倛倜å€å€žå€Ÿå€ å€¡å€¢å€£å€¤å€¥å€¦å€§å€¨å€©å€ªå€«å€¬å€­å€®å€¯å€°å€±å€²å€³å€´å€µå€¶å€·å€¸å€¹å€ºå€»å€¼å€½å€¾Ã¤` INT; +### files in MYSQL_DATA_DIR/test +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1c.frm +t1c.isl +t1p.frm +t1p.ibd +t3.frm +t3.isl +### files in MYSQL_TMP_DIR/alt_dir/test +t1c.ibd +t3.ibd +ALTER TABLE t3 CHANGE +`倀å€å€‚倃倄倅倆倇倈倉倊個倌å€å€Žå€å€å€‘倒倓倔倕倖倗倘候倚倛倜å€å€žå€Ÿå€ å€¡å€¢å€£å€¤å€¥å€¦å€§å€¨å€©å€ªå€«å€¬å€­å€®å€¯å€°å€±å€²å€³å€´å€µå€¶å€·å€¸å€¹å€ºå€»å€¼å€½å€¾Ã„` +c3 INT; +### files in MYSQL_DATA_DIR/test +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1c.frm +t1c.isl +t1p.frm +t1p.ibd +t3.frm +t3.isl +### files in MYSQL_TMP_DIR/alt_dir/test +t1c.ibd +t3.ibd +ALTER TABLE t3 CHANGE c3 ðŒ€ðŒðŒ‚ðŒƒðŒ„ðŒ…ðŒ†ðŒ‡ðŒˆðŒ‰ðŒŠðŒ‹ðŒŒðŒðŒŽðŒðŒðŒ‘ðŒ’ðŒ“ðŒ”ðŒ•ðŒ–ðŒ—ðŒ˜ðŒ™ðŒšðŒ›ðŒœ INT; +ERROR HY000: Invalid utf8 character string: '\xF0\x90\x8C\x80\xF0\x90\x8C\x81\xF0\x90\x8C\x82\xF0\x90\x8C\x83' +ALTER TABLE t3 CHANGE c3 😲 INT; +ERROR HY000: Invalid utf8 character string: '\xF0\x9F\x98\xB2' +ALTER TABLE t3 RENAME TO t2; +### files in MYSQL_DATA_DIR/test +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1c.frm +t1c.isl +t1p.frm +t1p.ibd +t2.frm +t2.isl +### files in MYSQL_TMP_DIR/alt_dir/test +t1c.ibd +t2.ibd +SELECT st.NAME, i.NAME +FROM sys_tables st INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES i +ON i.TABLE_ID=st.TABLE_ID; +NAME NAME +test/t1 test/t2 +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `c1` int(11) NOT NULL, + `c3` int(11) DEFAULT NULL, + `ct` text, + PRIMARY KEY (`c1`), + KEY `c2` (`c3`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir/' +RENAME TABLE t2 TO t1; +SELECT st.NAME, i.NAME +FROM sys_tables st INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES i +ON i.TABLE_ID=st.TABLE_ID; +NAME NAME +test/t1 test/t1 +### files in MYSQL_DATA_DIR/test +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1.frm +t1.isl +t1c.frm +t1c.isl +t1p.frm +t1p.ibd +### files in MYSQL_TMP_DIR/alt_dir/test +t1.ibd +t1c.ibd +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +c3 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +c2 0 c3 +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 c3 0 +test/t1c3 c3 c2 0 +ALTER TABLE t1 DROP INDEX c2; +ERROR HY000: Cannot drop index 'c2': needed in a foreign key constraint +ALTER TABLE t1 DROP INDEX c4; +ERROR 42000: Can't DROP 'c4'; check that column/key exists +ALTER TABLE t1c DROP FOREIGN KEY c2; +ERROR 42000: Can't DROP 'c2'; check that column/key exists +ALTER TABLE t1c DROP FOREIGN KEY t1c2, DROP FOREIGN KEY c2; +ERROR 42000: Can't DROP 'c2'; check that column/key exists +ALTER TABLE t1c DROP FOREIGN KEY t1c2, DROP FOREIGN KEY c2, DROP INDEX c2; +ERROR 42000: Can't DROP 'c2'; check that column/key exists +ALTER TABLE t1c DROP INDEX c2; +ERROR HY000: Cannot drop index 'c2': needed in a foreign key constraint +ALTER TABLE t1c DROP FOREIGN KEY ẗ1C2; +ERROR 42000: Can't DROP 'ẗ1C2'; check that column/key exists +SHOW CREATE TABLE t1c; +Table Create Table +t1c CREATE TABLE `t1c` ( + `c1` int(11) NOT NULL, + `c2` int(11) DEFAULT NULL, + `c3` int(11) DEFAULT NULL, + PRIMARY KEY (`c1`), + KEY `c2` (`c2`), + KEY `c3` (`c3`), + CONSTRAINT `t1c2` FOREIGN KEY (`c2`) REFERENCES `t1` (`c3`), + CONSTRAINT `t1c3` FOREIGN KEY (`c3`) REFERENCES `t1p` (`c2`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir/' +SET foreign_key_checks=0; +DROP TABLE t1p; +SET foreign_key_checks=1; +SHOW CREATE TABLE t1c; +Table Create Table +t1c CREATE TABLE `t1c` ( + `c1` int(11) NOT NULL, + `c2` int(11) DEFAULT NULL, + `c3` int(11) DEFAULT NULL, + PRIMARY KEY (`c1`), + KEY `c2` (`c2`), + KEY `c3` (`c3`), + CONSTRAINT `t1c2` FOREIGN KEY (`c2`) REFERENCES `t1` (`c3`), + CONSTRAINT `t1c3` FOREIGN KEY (`c3`) REFERENCES `t1p` (`c2`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir/' +### files in MYSQL_DATA_DIR/test +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1.frm +t1.isl +t1c.frm +t1c.isl +### files in MYSQL_TMP_DIR/alt_dir/test +t1.ibd +t1c.ibd +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +c3 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +c2 0 c3 +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 c3 0 +test/t1c3 c3 c2 0 +CREATE TABLE t1p (c1 INT PRIMARY KEY, c2 INT, INDEX(c2)) +ENGINE=InnoDB DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir'; +ALTER TABLE t1c DROP INDEX C2, DROP INDEX C3; +ERROR HY000: Cannot drop index 'c2': needed in a foreign key constraint +ALTER TABLE t1c DROP INDEX C3; +ERROR HY000: Cannot drop index 'c3': needed in a foreign key constraint +SET foreign_key_checks=0; +ALTER TABLE t1c DROP INDEX C3; +### files in MYSQL_DATA_DIR/test +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1.frm +t1.isl +t1c.frm +t1c.isl +t1p.frm +t1p.isl +### files in MYSQL_TMP_DIR/alt_dir/test +t1.ibd +t1c.ibd +t1p.ibd +SET foreign_key_checks=1; +SHOW CREATE TABLE t1c; +Table Create Table +t1c CREATE TABLE `t1c` ( + `c1` int(11) NOT NULL, + `c2` int(11) DEFAULT NULL, + `c3` int(11) DEFAULT NULL, + PRIMARY KEY (`c1`), + KEY `c2` (`c2`), + CONSTRAINT `t1c2` FOREIGN KEY (`c2`) REFERENCES `t1` (`c3`), + CONSTRAINT `t1c3` FOREIGN KEY (`c3`) REFERENCES `t1p` (`c2`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir/' +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +c3 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +c2 0 c3 +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 c3 0 +test/t1c3 c3 c2 0 +ALTER TABLE t1c DROP FOREIGN KEY t1C3; +### files in MYSQL_DATA_DIR/test +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1.frm +t1.isl +t1c.frm +t1c.isl +t1p.frm +t1p.isl +### files in MYSQL_TMP_DIR/alt_dir/test +t1.ibd +t1c.ibd +t1p.ibd +SHOW CREATE TABLE t1c; +Table Create Table +t1c CREATE TABLE `t1c` ( + `c1` int(11) NOT NULL, + `c2` int(11) DEFAULT NULL, + `c3` int(11) DEFAULT NULL, + PRIMARY KEY (`c1`), + KEY `c2` (`c2`), + CONSTRAINT `t1c2` FOREIGN KEY (`c2`) REFERENCES `t1` (`c3`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir/' +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +c3 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +c2 0 c3 +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +test/t1c2 c2 c3 0 +ALTER TABLE t1c DROP INDEX c2, DROP FOREIGN KEY t1C2; +### files in MYSQL_DATA_DIR/test +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1.frm +t1.isl +t1c.frm +t1c.isl +t1p.frm +t1p.isl +### files in MYSQL_TMP_DIR/alt_dir/test +t1.ibd +t1c.ibd +t1p.ibd +SHOW CREATE TABLE t1c; +Table Create Table +t1c CREATE TABLE `t1c` ( + `c1` int(11) NOT NULL, + `c2` int(11) DEFAULT NULL, + `c3` int(11) DEFAULT NULL, + PRIMARY KEY (`c1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir/' +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +c3 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +c2 0 c3 +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +ALTER TABLE t1 DROP INDEX c2, CHANGE c3 c2 INT; +### files in MYSQL_DATA_DIR/test +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1.frm +t1.isl +t1c.frm +t1c.isl +t1p.frm +t1p.isl +### files in MYSQL_TMP_DIR/alt_dir/test +t1.ibd +t1c.ibd +t1p.ibd +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +c1 0 6 1283 4 +c2 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 c1 +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +CREATE TABLE t1o LIKE t1; +ALTER TABLE t1 ADD FULLTEXT INDEX (ct), +CHANGE c1 pk INT, ALTER c2 SET DEFAULT 42, RENAME TO tt, +ALGORITHM=INPLACE, LOCK=NONE; +ERROR 0A000: LOCK=NONE is not supported. Reason: Fulltext index creation requires a lock. Try LOCK=SHARED. +ALTER TABLE t1 ADD FULLTEXT INDEX (ct), +CHANGE c1 pk INT, ALTER c2 SET DEFAULT 42, RENAME TO tt, +ALGORITHM=INPLACE, LOCK=SHARED; +Warnings: +Warning 124 InnoDB rebuilding table to add column FTS_DOC_ID +### files in MYSQL_DATA_DIR/test +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1c.frm +t1c.isl +t1o.frm +t1o.ibd +t1p.frm +t1p.isl +tt.frm +tt.isl +### files in MYSQL_TMP_DIR/alt_dir/test +t1c.ibd +t1p.ibd +tt.ibd +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +SHOW CREATE TABLE tt; +Table Create Table +tt CREATE TABLE `tt` ( + `pk` int(11) NOT NULL, + `c2` int(11) DEFAULT '42', + `ct` text, + PRIMARY KEY (`pk`), + FULLTEXT KEY `ct` (`ct`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir/' +ALTER TABLE t1o CHANGE c1 dB_row_Id INT, ALGORITHM=COPY; +ERROR 42000: Incorrect column name 'dB_row_Id' +ALTER TABLE t1o CHANGE c1 dB_row_Id INT, ALGORITHM=INPLACE; +ERROR 42000: Incorrect column name 'DB_ROW_ID' +ALTER TABLE t1o CHANGE c1 DB_TRX_ID INT; +ERROR 42000: Incorrect column name 'DB_TRX_ID' +ALTER TABLE t1o CHANGE c1 db_roll_ptr INT; +ERROR 42000: Incorrect column name 'DB_ROLL_PTR' +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), CHANGE c1 FTS_DOC_ID INT, +ALGORITHM=COPY; +ERROR 42000: Incorrect column name 'FTS_DOC_ID' +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), CHANGE c1 FTS_DOC_ID INT, +ALGORITHM=INPLACE; +ERROR HY000: Column 'FTS_DOC_ID' is of wrong type for an InnoDB FULLTEXT index +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), CHANGE c1 FTS_Doc_ID INT, +ALGORITHM=INPLACE; +ERROR 42000: Incorrect column name 'FTS_Doc_ID' +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), +CHANGE c1 FTS_DOC_ID BIGINT UNSIGNED NOT NULL, +ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY. +CREATE TABLE t1n LIKE t1o; +ALTER TABLE t1n ADD FULLTEXT INDEX(ct); +Warnings: +Warning 124 InnoDB rebuilding table to add column FTS_DOC_ID +### files in MYSQL_DATA_DIR/test +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1c.frm +t1c.isl +t1n.frm +t1n.ibd +t1o.frm +t1o.ibd +t1p.frm +t1p.isl +tt.frm +tt.isl +### files in MYSQL_TMP_DIR/alt_dir/test +t1c.ibd +t1p.ibd +tt.ibd +ALTER TABLE t1n CHANGE c1 Fts_DOC_ID INT, ALGORITHM=INPLACE; +ERROR 42000: Incorrect column name 'FTS_DOC_ID' +ALTER TABLE t1n CHANGE c1 Fts_DOC_ID INT, ALGORITHM=COPY; +ERROR 42000: Incorrect column name 'Fts_DOC_ID' +ALTER TABLE t1n CHANGE FTS_DOC_ID c11 INT, ALGORITHM=INPLACE; +ERROR 42S22: Unknown column 'FTS_DOC_ID' in 't1n' +ALTER TABLE t1n CHANGE c1 FTS_DOC_ïD INT, ALGORITHM=INPLACE; +### files in MYSQL_DATA_DIR/test +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1c.frm +t1c.isl +t1n.frm +t1n.ibd +t1o.frm +t1o.ibd +t1p.frm +t1p.isl +tt.frm +tt.isl +### files in MYSQL_TMP_DIR/alt_dir/test +t1c.ibd +t1p.ibd +tt.ibd +ALTER TABLE t1n CHANGE FTS_DOC_ÃD c1 INT, ALGORITHM=INPLACE; +### files in MYSQL_DATA_DIR/test +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1c.frm +t1c.isl +t1n.frm +t1n.ibd +t1o.frm +t1o.ibd +t1p.frm +t1p.isl +tt.frm +tt.isl +### files in MYSQL_TMP_DIR/alt_dir/test +t1c.ibd +t1p.ibd +tt.ibd +ALTER TABLE t1n CHANGE c1 c2 INT, CHANGE c2 ct INT, CHANGE ct c1 TEXT, +ALGORITHM=INPLACE; +### files in MYSQL_DATA_DIR/test +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1c.frm +t1c.isl +t1n.frm +t1n.ibd +t1o.frm +t1o.ibd +t1p.frm +t1p.isl +tt.frm +tt.isl +### files in MYSQL_TMP_DIR/alt_dir/test +t1c.ibd +t1p.ibd +tt.ibd +SHOW CREATE TABLE t1n; +Table Create Table +t1n CREATE TABLE `t1n` ( + `c2` int(11) NOT NULL, + `ct` int(11) DEFAULT NULL, + `c1` text, + PRIMARY KEY (`c2`), + FULLTEXT KEY `ct` (`c1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +ALTER TABLE t1n CHANGE c2 c1 INT, CHANGE ct c2 INT, CHANGE c1 ct TEXT, +ALGORITHM=COPY; +### files in MYSQL_DATA_DIR/test +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1c.frm +t1c.isl +t1n.frm +t1n.ibd +t1o.frm +t1o.ibd +t1p.frm +t1p.isl +tt.frm +tt.isl +### files in MYSQL_TMP_DIR/alt_dir/test +t1c.ibd +t1p.ibd +tt.ibd +SHOW CREATE TABLE t1n; +Table Create Table +t1n CREATE TABLE `t1n` ( + `c1` int(11) NOT NULL, + `c2` int(11) DEFAULT NULL, + `ct` text, + PRIMARY KEY (`c1`), + FULLTEXT KEY `ct` (`ct`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +ALTER TABLE t1n ADD INDEX(c2), CHANGE c2 c4 INT, ALGORITHM=INPLACE; +ERROR 42000: Key column 'c2' doesn't exist in table +ALTER TABLE t1n ADD INDEX(c2), CHANGE c2 c4 INT, ALGORITHM=COPY; +ERROR 42000: Key column 'c2' doesn't exist in table +ALTER TABLE t1n ADD INDEX(c4), CHANGE c2 c4 INT, ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: InnoDB presently supports one FULLTEXT index creation at a time. Try ALGORITHM=COPY. +ALTER TABLE t1n CHANGE c2 c4 INT, LOCK=NONE; +ALTER TABLE t1n ADD INDEX(c4), LOCK=NONE; +### files in MYSQL_DATA_DIR/test +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1c.frm +t1c.isl +t1n.frm +t1n.ibd +t1o.frm +t1o.ibd +t1p.frm +t1p.isl +tt.frm +tt.isl +### files in MYSQL_TMP_DIR/alt_dir/test +t1c.ibd +t1p.ibd +tt.ibd +SHOW CREATE TABLE t1n; +Table Create Table +t1n CREATE TABLE `t1n` ( + `c1` int(11) NOT NULL, + `c4` int(11) DEFAULT NULL, + `ct` text, + PRIMARY KEY (`c1`), + KEY `c4` (`c4`), + FULLTEXT KEY `ct` (`ct`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +ALTER TABLE t1n DROP INDEX c4; +### files in MYSQL_DATA_DIR/test +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1c.frm +t1c.isl +t1n.frm +t1n.ibd +t1o.frm +t1o.ibd +t1p.frm +t1p.isl +tt.frm +tt.isl +### files in MYSQL_TMP_DIR/alt_dir/test +t1c.ibd +t1p.ibd +tt.ibd +ALTER TABLE t1n CHANGE c4 c1 INT, ADD INDEX(c1), ALGORITHM=INPLACE; +ERROR 42S21: Duplicate column name 'c1' +ALTER TABLE t1n CHANGE c4 c11 INT, ADD INDEX(c11), ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: InnoDB presently supports one FULLTEXT index creation at a time. Try ALGORITHM=COPY. +ALTER TABLE t1n CHANGE c4 c11 INT, LOCK=NONE; +ALTER TABLE t1n ADD INDEX(c11), LOCK=NONE; +### files in MYSQL_DATA_DIR/test +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1c.frm +t1c.isl +t1n.frm +t1n.ibd +t1o.frm +t1o.ibd +t1p.frm +t1p.isl +tt.frm +tt.isl +### files in MYSQL_TMP_DIR/alt_dir/test +t1c.ibd +t1p.ibd +tt.ibd +SHOW CREATE TABLE t1n; +Table Create Table +t1n CREATE TABLE `t1n` ( + `c1` int(11) NOT NULL, + `c11` int(11) DEFAULT NULL, + `ct` text, + PRIMARY KEY (`c1`), + KEY `c11` (`c11`), + FULLTEXT KEY `ct` (`ct`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +DROP TABLE t1n; +ALTER TABLE t1o MODIFY c1 BIGINT UNSIGNED NOT NULL; +### files in MYSQL_DATA_DIR/test +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1c.frm +t1c.isl +t1o.frm +t1o.ibd +t1p.frm +t1p.isl +tt.frm +tt.isl +### files in MYSQL_TMP_DIR/alt_dir/test +t1c.ibd +t1p.ibd +tt.ibd +call mtr.add_suppression("Error: no matching column for .FTS_DOC_ID. in index .ct.--temporary-- of table .test...t1o"); +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), +CHANGE c1 FTS_DOC_ID BIGINT UNSIGNED NOT NULL, +ALGORITHM=INPLACE; +ERROR HY000: Incorrect key file for table 't1o'; try to repair it +# The following would crash 10.2. Re-enable this and test after merge! +ALTER TABLE t1o CHANGE c1 FTS_DOC_ID BIGINT UNSIGNED NOT NULL, LOCK=NONE; +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), ALGORITHM=INPLACE; +### files in MYSQL_DATA_DIR/test +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1c.frm +t1c.isl +t1o.frm +t1o.ibd +t1p.frm +t1p.isl +tt.frm +tt.isl +### files in MYSQL_TMP_DIR/alt_dir/test +t1c.ibd +t1p.ibd +tt.ibd +SELECT sc.pos FROM information_schema.innodb_sys_columns sc +INNER JOIN information_schema.innodb_sys_tables st +ON sc.TABLE_ID=st.TABLE_ID +WHERE st.NAME='test/t1o' AND sc.NAME='FTS_DOC_ID'; +pos +0 +SHOW CREATE TABLE t1o; +Table Create Table +t1o CREATE TABLE `t1o` ( + `FTS_DOC_ID` bigint(20) unsigned NOT NULL, + `c2` int(11) DEFAULT NULL, + `ct` text, + PRIMARY KEY (`FTS_DOC_ID`), + FULLTEXT KEY `ct` (`ct`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +ALTER TABLE t1o CHANGE FTS_DOC_ID foo_id BIGINT UNSIGNED NOT NULL, +DROP INDEX ct, LOCK=NONE; +### files in MYSQL_DATA_DIR/test +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1c.frm +t1c.isl +t1o.frm +t1o.ibd +t1p.frm +t1p.isl +tt.frm +tt.isl +### files in MYSQL_TMP_DIR/alt_dir/test +t1c.ibd +t1p.ibd +tt.ibd +SHOW CREATE TABLE t1o; +Table Create Table +t1o CREATE TABLE `t1o` ( + `foo_id` bigint(20) unsigned NOT NULL, + `c2` int(11) DEFAULT NULL, + `ct` text, + PRIMARY KEY (`foo_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +DROP TABLE t1c, t1p, sys_tables, sys_indexes, sys_foreign; +CREATE TABLE sys_tables SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES +WHERE NAME='test/t1o'; +CREATE TABLE sys_indexes SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +CREATE TABLE sys_foreign SELECT i.* +FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN i WHERE FOR_NAME='test/t1o'; +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +foo_id 0 6 1800 8 +c2 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 foo_id +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +ALTER TABLE t1o ADD UNIQUE INDEX FTS_DOC_ID_INDEX(foo_id); +### files in MYSQL_DATA_DIR/test +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1o.frm +t1o.ibd +tt.frm +tt.isl +### files in MYSQL_TMP_DIR/alt_dir/test +tt.ibd +ALTER TABLE t1o CHANGE foo_id FTS_DOC_ID BIGINT UNSIGNED NOT NULL, +ADD FULLTEXT INDEX(ct); +ERROR HY000: Incorrect key file for table 't1o'; try to repair it +ALTER TABLE t1o CHANGE foo_id FTS_DOC_ID BIGINT UNSIGNED NOT NULL, LOCK=NONE; +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), ALGORITHM=INPLACE; +### files in MYSQL_DATA_DIR/test +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +FTS_AUX_INDEX_1.ibd +FTS_AUX_INDEX_2.ibd +FTS_AUX_INDEX_3.ibd +FTS_AUX_INDEX_4.ibd +FTS_AUX_INDEX_5.ibd +FTS_AUX_INDEX_6.ibd +FTS_AUX_BEING_DELETED.ibd +FTS_AUX_BEING_DELETED_CACHE.ibd +FTS_AUX_CONFIG.ibd +FTS_AUX_DELETED.ibd +FTS_AUX_DELETED_CACHE.ibd +sys_foreign.frm +sys_foreign.ibd +sys_indexes.frm +sys_indexes.ibd +sys_tables.frm +sys_tables.ibd +t1o.frm +t1o.ibd +tt.frm +tt.isl +### files in MYSQL_TMP_DIR/alt_dir/test +tt.ibd +ALTER TABLE t1o CHANGE FTS_DOC_ID foo_id BIGINT UNSIGNED NOT NULL; +ERROR HY000: Index 'FTS_DOC_ID_INDEX' is of wrong type for an InnoDB FULLTEXT index +DROP TABLE sys_indexes; +CREATE TABLE sys_indexes SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +SELECT i.NAME,i.POS,i.MTYPE,i.PRTYPE,i.LEN +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +NAME POS MTYPE PRTYPE LEN +FTS_DOC_ID 0 6 1800 8 +c2 1 6 1027 4 +ct 2 5 524540 10 +SELECT si.NAME,i.POS,i.NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS i +INNER JOIN sys_indexes si ON i.INDEX_ID=si.INDEX_ID; +NAME POS NAME +PRIMARY 0 FTS_DOC_ID +FTS_DOC_ID_INDEX 0 FTS_DOC_ID +ct 0 ct +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; +ID FOR_COL_NAME REF_COL_NAME POS +# +# Cleanup +# +DROP TABLE tt, t1o, sys_tables, sys_indexes, sys_foreign; +### files in MYSQL_DATA_DIR/test +### files in MYSQL_TMP_DIR/alt_dir/test diff --git a/mysql-test/suite/innodb/r/innodb.result b/mysql-test/suite/innodb/r/innodb.result index 2ce73304281..8e0e6d5b512 100644 --- a/mysql-test/suite/innodb/r/innodb.result +++ b/mysql-test/suite/innodb/r/innodb.result @@ -1917,6 +1917,9 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref v v 13 const # Using where; Using index alter table t1 add unique(v); ERROR 23000: Duplicate entry '{ ' for key 'v_2' +show warnings; +Level Code Message +Error 1062 Duplicate entry 'v' for key 'v_2' alter table t1 add key(v); Warnings: Note 1831 Duplicate index `v_2`. This is deprecated and will be disallowed in a future release diff --git a/mysql-test/suite/innodb/r/innodb_bug14147491.result b/mysql-test/suite/innodb/r/innodb_bug14147491.result index cf960e3a6ee..40b9c7515c2 100644 --- a/mysql-test/suite/innodb/r/innodb_bug14147491.result +++ b/mysql-test/suite/innodb/r/innodb_bug14147491.result @@ -1,17 +1,17 @@ -CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ROW_FORMAT=COMPACT ENGINE=InnoDB; +# Create and populate the table to be corrupted +set global innodb_file_per_table=ON; +CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ENGINE=InnoDB; INSERT INTO t1 (b) VALUES ('corrupt me'); INSERT INTO t1 (b) VALUES ('corrupt me'); -# Backup the t1.ibd before corrupting # Corrupt the table Munged a string. Munged a string. -SET DEBUG_DBUG = '+d,innodb_page_corruption_retries'; -# Write file to make mysql-test-run.pl expect the "crash", but don't -# start it until it's told to -# The below SELECT query will crash the server because some pages -# on the disk are corrupted +# Now t1 is corrupted but we should not crash SELECT * FROM t1; -ERROR HY000: Lost connection to MySQL server during query -# Restore the original t1.ibd -# Cleanup +Got one of the listed errors +INSERT INTO t1(b) VALUES('abcdef'); +Got one of the listed errors +UPDATE t1 set b = 'deadbeef' where a = 1; +Got one of the listed errors +# Cleanup, this must be possible DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/innodb_bug46000.result b/mysql-test/suite/innodb/r/innodb_bug46000.result index 7c5ef13f3dc..86e8766fb8f 100644 --- a/mysql-test/suite/innodb/r/innodb_bug46000.result +++ b/mysql-test/suite/innodb/r/innodb_bug46000.result @@ -6,7 +6,7 @@ show warnings; Level Code Message Warning 1280 Cannot Create Index with name 'GEN_CLUST_INDEX'. The name is reserved for the system default primary index. Error 1280 Incorrect index name 'GEN_CLUST_INDEX' -Warning 1030 Got error 124 "Wrong index given to function" from storage engine InnoDB +Warning 1030 Got error 124 "Wrong index given to a function" from storage engine InnoDB create table bug46000(id int) engine=innodb; create index GEN_CLUST_INDEX on bug46000(id); ERROR 42000: Incorrect index name 'GEN_CLUST_INDEX' diff --git a/mysql-test/suite/innodb/r/innodb_defragment_fill_factor.result b/mysql-test/suite/innodb/r/innodb_defragment_fill_factor.result index e1e616a7e6f..5809542db8a 100644 --- a/mysql-test/suite/innodb/r/innodb_defragment_fill_factor.result +++ b/mysql-test/suite/innodb/r/innodb_defragment_fill_factor.result @@ -1,5 +1,3 @@ -DROP TABLE if exists t1; -DROP TABLE if exists t2; Testing tables with large records CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b VARCHAR(256), c VARCHAR(256), KEY SECOND(a, b,c)) ENGINE=INNODB; INSERT INTO t1 VALUES (1, REPEAT('A', 256), REPEAT('B', 256)); @@ -13,6 +11,7 @@ INSERT INTO t1 (b) SELECT b from t1; INSERT INTO t1 (b) SELECT b from t1; INSERT INTO t1 (b) SELECT b from t1; INSERT INTO t1 (b) SELECT b from t1; +SET GLOBAL innodb_fast_shutdown = 0; optimize table t1; Table Op Msg_type Msg_text test.t1 optimize status OK @@ -57,6 +56,7 @@ insert into t1 values (204, REPEAT('A', 256), REPEAT('B', 256)); DROP TABLE t1; Testing table with small records CREATE TABLE t2 (a INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b VARCHAR(16), c VARCHAR(32), KEY SECOND(a,b,c)) ENGINE=INNODB; +SET GLOBAL innodb_fast_shutdown = 0; optimize table t2; Table Op Msg_type Msg_text test.t2 optimize status OK diff --git a/mysql-test/suite/innodb/r/innodb_force_recovery.result b/mysql-test/suite/innodb/r/innodb_force_recovery.result index e405a79dd53..d71a6c4e8b0 100644 --- a/mysql-test/suite/innodb/r/innodb_force_recovery.result +++ b/mysql-test/suite/innodb/r/innodb_force_recovery.result @@ -1,5 +1,5 @@ create table t1(f1 int not null, f2 int not null, index idx(f2))engine=innodb; -create table t2(f1 int not null, f2 int not null, index idx(f2))engine=innodb; +create table t2(f1 int primary key, f2 int, index idx(f2))engine=innodb; insert into t1 values(1, 2); insert into t2 values(1, 2); SET GLOBAL innodb_fast_shutdown = 0; @@ -85,6 +85,37 @@ ERROR HY000: Table 't2' is read only show tables; Tables_in_test t2 +# Restart the server with innodb_force_recovery=2 +select * from t2; +f1 f2 +1 2 +begin; +update t2 set f2=3; +connect con1,localhost,root,,; +create table t3(a int)engine=innodb; +# Force a redo log flush of the above uncommitted UPDATE +SET GLOBAL innodb_flush_log_at_trx_commit=1; +drop table t3; +disconnect con1; +connection default; +# Kill the server +# Restart the server with innodb_force_recovery=3 +SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +select * from t2; +f1 f2 +1 3 +SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; +select * from t2; +f1 f2 +1 2 +SET GLOBAL innodb_lock_wait_timeout=1; +insert into t2 values(1,2); +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +insert into t2 values(9,10); +select * from t2; +f1 f2 +1 2 +9 10 drop table t2; show tables; Tables_in_test diff --git a/mysql-test/suite/innodb/r/innodb_gis.result b/mysql-test/suite/innodb/r/innodb_gis.result index 5a978ea303c..f7e0899d2d7 100644 --- a/mysql-test/suite/innodb/r/innodb_gis.result +++ b/mysql-test/suite/innodb/r/innodb_gis.result @@ -326,8 +326,8 @@ fid IsClosed(g) 116 0 SELECT fid, AsText(Centroid(g)) FROM gis_multi_polygon ORDER by fid; fid AsText(Centroid(g)) -117 POINT(55.58852775304245 17.426536064113982) -118 POINT(55.58852775304245 17.426536064113982) +117 POINT(57.98031067576927 17.854754130800433) +118 POINT(57.98031067576927 17.854754130800433) 119 POINT(2 2) SELECT fid, Area(g) FROM gis_multi_polygon ORDER by fid; fid Area(g) @@ -599,3 +599,12 @@ create unique index a on t1(a); drop table t1; create table t1 (g geometry not null, spatial gk(g)) engine=innodb; drop table t1; +create table t1(id int not null primary key, g1 geometry not null, spatial index(g1)); +insert into t1 values(1, polygonfromtext('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))')); +explain select id from t1 where contains(g1, pointfromtext('POINT(1 1)')); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range g1 g1 34 NULL 1 Using where +select id from t1 where contains(g1, pointfromtext('POINT(1 1)')); +id +1 +drop table t1; diff --git a/mysql-test/suite/innodb/r/innodb_max_recordsize_32k.result b/mysql-test/suite/innodb/r/innodb_max_recordsize_32k.result new file mode 100644 index 00000000000..0c06ad24a49 --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb_max_recordsize_32k.result @@ -0,0 +1,391 @@ +call mtr.add_suppression('InnoDB: Cannot add field.*because after adding it, the row size is'); +SELECT @@innodb_page_size; +@@innodb_page_size +32768 +SET GLOBAL innodb_file_format='Barracuda'; +SET GLOBAL innodb_file_per_table=ON; +SET @@innodb_strict_mode=ON; +SELECT @@innodb_file_format; +@@innodb_file_format +Barracuda +SELECT @@innodb_file_per_table; +@@innodb_file_per_table +1 +SELECT @@innodb_strict_mode; +@@innodb_strict_mode +1 +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT= COMPACT; +ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT= DYNAMIC; +ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. +show warnings; +Level Code Message +Error 1118 Row size too large (> 16318). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. +Warning 1030 Got error 139 "Too big row" from storage engine InnoDB +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT=REDUNDANT; +ERROR 42000: Row size too large (> 16315). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +show warnings; +Level Code Message +Error 1118 Row size too large (> 16315). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +Warning 1030 Got error 139 "Too big row" from storage engine InnoDB +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT=FIXED; +ERROR HY000: Can't create table `test`.`tab5` (errno: 140 "Wrong create options") +show warnings; +Level Code Message +Warning 1478 InnoDB: invalid ROW_FORMAT specifier. +Error 1005 Can't create table `test`.`tab5` (errno: 140 "Wrong create options") +Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT=COMPRESSED; +ERROR HY000: Can't create table `test`.`tab5` (errno: 140 "Wrong create options") +show warnings; +Level Code Message +Warning 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > 16k. +Error 1005 Can't create table `test`.`tab5` (errno: 140 "Wrong create options") +Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB +SET @@innodb_strict_mode=OFF; +SELECT @@innodb_strict_mode; +@@innodb_strict_mode +0 +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT=COMPACT; +Warnings: +Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),'a',NULL); +ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +SELECT * FROM tab5; +col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 +DROP TABLE tab5; +CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), +col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), +col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), +col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), +col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), +col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), +col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), +col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), +col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), +col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), +col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) +ENGINE = innodb ROW_FORMAT=COMPACT; +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',156),NULL); +ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',155),NULL); +SELECT * FROM tab5; +col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa NULL +DROP TABLE tab5; +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT=DYNAMIC; +Warnings: +Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. +DROP TABLE tab5; +CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), +col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), +col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), +col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), +col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), +col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), +col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), +col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), +col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), +col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), +col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) +ENGINE = innodb ROW_FORMAT=DYNAMIC; +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',156),NULL); +ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',155),NULL); +SELECT * FROM tab5; +col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa NULL +DROP TABLE tab5; +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT=REDUNDANT; +Warnings: +Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255)); +ERROR 42000: Row size too large (> 16315). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +SELECT * FROM tab5; +col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 +DROP TABLE tab5; +CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), +col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), +col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), +col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), +col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), +col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), +col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), +col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), +col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), +col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), +col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) +ENGINE = innodb ROW_FORMAT=REDUNDANT; +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',89),NULL); +ERROR 42000: Row size too large (> 16315). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',88),NULL); +SELECT * FROM tab5; +col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa NULL +DROP TABLE tab5; +CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), +col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), +col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), +col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), +col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), +col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), +col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), +col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), +col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), +col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), +col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) +ENGINE = innodb ROW_FORMAT=COMPRESSED; +Warnings: +Warning 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > NNNNk. Assuming ROW_FORMAT=DYNAMIC. +DROP TABLE tab5; +CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; +SHOW WARNINGS; +Level Code Message +INSERT INTO t VALUES (REPEAT('a',16384)); +INSERT INTO t VALUES (REPEAT('a',32768)); +INSERT INTO t VALUES (REPEAT('a',65535)); +SELECT LENGTH(col) FROM t; +LENGTH(col) +16384 +32768 +65535 +FLUSH TABLE t; +ANALYZE TABLE t; +Table Op Msg_type Msg_text +test.t analyze status OK +SELECT stat_value FROM mysql.innodb_index_stats where database_name = 'test' and table_name= 't' and stat_name='n_leaf_pages'; +stat_value +6 +SELECT clustered_index_size from mysql.innodb_table_stats where database_name = 'test' and table_name= 't'; +clustered_index_size +7 +DROP TABLE t; +CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; +SHOW WARNINGS; +Level Code Message +INSERT INTO t VALUES (REPEAT('a',16384)); +INSERT INTO t VALUES (REPEAT('a',32768)); +INSERT INTO t VALUES (REPEAT('a',65535)); +SELECT LENGTH(col) FROM t; +LENGTH(col) +16384 +32768 +65535 +FLUSH TABLE t; +ANALYZE TABLE t; +Table Op Msg_type Msg_text +test.t analyze status OK +SELECT stat_value FROM mysql.innodb_index_stats where database_name = 'test' and table_name= 't' and stat_name='n_leaf_pages'; +stat_value +4 +SELECT clustered_index_size from mysql.innodb_table_stats where database_name = 'test' and table_name= 't'; +clustered_index_size +5 +DROP TABLE t; +CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=COMPACT; +SHOW WARNINGS; +Level Code Message +INSERT INTO t VALUES (REPEAT('a',16384)); +INSERT INTO t VALUES (REPEAT('a',32768)); +INSERT INTO t VALUES (REPEAT('a',65535)); +SELECT LENGTH(col) FROM t; +LENGTH(col) +16384 +32768 +65535 +FLUSH TABLE t; +ANALYZE TABLE t; +Table Op Msg_type Msg_text +test.t analyze status OK +SELECT stat_value FROM mysql.innodb_index_stats where database_name = 'test' and table_name= 't' and stat_name='n_leaf_pages'; +stat_value +4 +SELECT clustered_index_size from mysql.innodb_table_stats where database_name = 'test' and table_name= 't'; +clustered_index_size +5 +DROP TABLE t; +# Success diff --git a/mysql-test/suite/innodb/r/innodb_max_recordsize_64k.result b/mysql-test/suite/innodb/r/innodb_max_recordsize_64k.result new file mode 100644 index 00000000000..f9751f02d43 --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb_max_recordsize_64k.result @@ -0,0 +1,594 @@ +call mtr.add_suppression('InnoDB: Cannot add field.*because after adding it, the row size is'); +SELECT @@innodb_page_size; +@@innodb_page_size +65536 +SET GLOBAL innodb_file_format='Barracuda'; +SET GLOBAL innodb_file_per_table=ON; +SET @@innodb_strict_mode=ON; +SELECT @@innodb_file_format; +@@innodb_file_format +Barracuda +SELECT @@innodb_file_per_table; +@@innodb_file_per_table +1 +SELECT @@innodb_strict_mode; +@@innodb_strict_mode +1 +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255), +ccol1 CHAR(255),ccol2 CHAR(255),ccol3 CHAR(255),ccol4 CHAR(255),ccol5 CHAR(255), +ccol6 CHAR(255),ccol7 CHAR(255),ccol8 CHAR(255),ccol9 CHAR(255),ccol10 CHAR(255), ccol11 CHAR(255), +ccol12 CHAR(255),ccol13 CHAR(255),ccol14 CHAR(255),ccol15 CHAR(255),ccol16 CHAR(255), ccol17 CHAR(255), +ccol18 CHAR(255),ccol19 CHAR(255),ccol20 CHAR(255),ccol21 CHAR(255),ccol22 CHAR(255), ccol23 CHAR(255), +ccol24 CHAR(255),ccol25 CHAR(255),ccol26 CHAR(255),ccol27 CHAR(255),ccol28 CHAR(255), ccol29 CHAR(255), +ccol30 CHAR(255),ccol31 CHAR(255),ccol32 CHAR(255),ccol33 CHAR(255),ccol34 CHAR(255), ccol35 CHAR(255), +ccol36 CHAR(255),ccol37 CHAR(255),ccol38 CHAR(255),ccol39 CHAR(255),ccol40 CHAR(255), ccol41 CHAR(255), +ccol42 CHAR(255),ccol43 CHAR(255),ccol44 CHAR(255),ccol45 CHAR(255),ccol46 CHAR(255), ccol47 CHAR(255), +ccol48 CHAR(255),ccol49 CHAR(255),ccol50 CHAR(255),ccol51 CHAR(255),ccol52 CHAR(255), ccol53 CHAR(255), +ccol54 CHAR(255),ccol55 CHAR(255),ccol56 CHAR(255),ccol57 CHAR(255),ccol58 CHAR(255), ccol59 CHAR(255), +ccol60 CHAR(255),ccol61 CHAR(255),ccol62 CHAR(255),ccol63 CHAR(255),ccol64 CHAR(255), ccol65 CHAR(255) +) +ENGINE = innodb ROW_FORMAT= COMPACT; +ERROR 42000: Row size too large (> 16383). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255), +ccol1 CHAR(255),ccol2 CHAR(255),ccol3 CHAR(255),ccol4 CHAR(255),ccol5 CHAR(255), +ccol6 CHAR(255),ccol7 CHAR(255),ccol8 CHAR(255),ccol9 CHAR(255),ccol10 CHAR(255), ccol11 CHAR(255), +ccol12 CHAR(255),ccol13 CHAR(255),ccol14 CHAR(255),ccol15 CHAR(255),ccol16 CHAR(255), ccol17 CHAR(255), +ccol18 CHAR(255),ccol19 CHAR(255),ccol20 CHAR(255),ccol21 CHAR(255),ccol22 CHAR(255), ccol23 CHAR(255), +ccol24 CHAR(255),ccol25 CHAR(255),ccol26 CHAR(255),ccol27 CHAR(255),ccol28 CHAR(255), ccol29 CHAR(255), +ccol30 CHAR(255),ccol31 CHAR(255),ccol32 CHAR(255),ccol33 CHAR(255),ccol34 CHAR(255), ccol35 CHAR(255), +ccol36 CHAR(255),ccol37 CHAR(255),ccol38 CHAR(255),ccol39 CHAR(255),ccol40 CHAR(255), ccol41 CHAR(255), +ccol42 CHAR(255),ccol43 CHAR(255),ccol44 CHAR(255),ccol45 CHAR(255),ccol46 CHAR(255), ccol47 CHAR(255), +ccol48 CHAR(255),ccol49 CHAR(255),ccol50 CHAR(255),ccol51 CHAR(255),ccol52 CHAR(255), ccol53 CHAR(255), +ccol54 CHAR(255),ccol55 CHAR(255),ccol56 CHAR(255),ccol57 CHAR(255),ccol58 CHAR(255), ccol59 CHAR(255), +ccol60 CHAR(255),ccol61 CHAR(255),ccol62 CHAR(255),ccol63 CHAR(255),ccol64 CHAR(255), ccol65 CHAR(255) +) +ENGINE = innodb ROW_FORMAT= DYNAMIC; +ERROR 42000: Row size too large (> 16383). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT=REDUNDANT; +ERROR 42000: Row size too large (> 16382). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +show warnings; +Level Code Message +Error 1118 Row size too large (> 16382). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +Warning 1030 Got error 139 "Too big row" from storage engine InnoDB +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT=FIXED; +ERROR HY000: Can't create table `test`.`tab5` (errno: 140 "Wrong create options") +show warnings; +Level Code Message +Warning 1478 InnoDB: invalid ROW_FORMAT specifier. +Error 1005 Can't create table `test`.`tab5` (errno: 140 "Wrong create options") +Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT=COMPRESSED; +ERROR HY000: Can't create table `test`.`tab5` (errno: 140 "Wrong create options") +show warnings; +Level Code Message +Warning 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > 16k. +Error 1005 Can't create table `test`.`tab5` (errno: 140 "Wrong create options") +Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB +SET @@innodb_strict_mode=OFF; +SELECT @@innodb_strict_mode; +@@innodb_strict_mode +0 +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255), +ccol1 CHAR(255),ccol2 CHAR(255),ccol3 CHAR(255),ccol4 CHAR(255),ccol5 CHAR(255), +ccol6 CHAR(255),ccol7 CHAR(255),ccol8 CHAR(255),ccol9 CHAR(255),ccol10 CHAR(255), ccol11 CHAR(255), +ccol12 CHAR(255),ccol13 CHAR(255),ccol14 CHAR(255),ccol15 CHAR(255),ccol16 CHAR(255), ccol17 CHAR(255), +ccol18 CHAR(255),ccol19 CHAR(255),ccol20 CHAR(255),ccol21 CHAR(255),ccol22 CHAR(255), ccol23 CHAR(255), +ccol24 CHAR(255),ccol25 CHAR(255),ccol26 CHAR(255),ccol27 CHAR(255),ccol28 CHAR(255), ccol29 CHAR(255), +ccol30 CHAR(255),ccol31 CHAR(255),ccol32 CHAR(255),ccol33 CHAR(255),ccol34 CHAR(255), ccol35 CHAR(255), +ccol36 CHAR(255),ccol37 CHAR(255),ccol38 CHAR(255),ccol39 CHAR(255),ccol40 CHAR(255), ccol41 CHAR(255), +ccol42 CHAR(255),ccol43 CHAR(255),ccol44 CHAR(255),ccol45 CHAR(255),ccol46 CHAR(255), ccol47 CHAR(255), +ccol48 CHAR(255),ccol49 CHAR(255),ccol50 CHAR(255),ccol51 CHAR(255),ccol52 CHAR(255), ccol53 CHAR(255), +ccol54 CHAR(255),ccol55 CHAR(255),ccol56 CHAR(255),ccol57 CHAR(255),ccol58 CHAR(255), ccol59 CHAR(255), +ccol60 CHAR(255),ccol61 CHAR(255),ccol62 CHAR(255),ccol63 CHAR(255),ccol64 CHAR(255), ccol65 CHAR(255) +) +ENGINE = innodb ROW_FORMAT=COMPACT; +Warnings: +Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),'a',NULL); +ERROR 42000: Row size too large (> 16383). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +SELECT * FROM tab5; +col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 ccol1 ccol2 ccol3 ccol4 ccol5 ccol6 ccol7 ccol8 ccol9 ccol10 ccol11 ccol12 ccol13 ccol14 ccol15 ccol16 ccol17 ccol18 ccol19 ccol20 ccol21 ccol22 ccol23 ccol24 ccol25 ccol26 ccol27 ccol28 ccol29 ccol30 ccol31 ccol32 ccol33 ccol34 ccol35 ccol36 ccol37 ccol38 ccol39 ccol40 ccol41 ccol42 ccol43 ccol44 ccol45 ccol46 ccol47 ccol48 ccol49 ccol50 ccol51 ccol52 ccol53 ccol54 ccol55 ccol56 ccol57 ccol58 ccol59 ccol60 ccol61 ccol62 ccol63 ccol64 ccol65 +DROP TABLE tab5; +CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), +col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), +col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), +col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), +col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), +col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), +col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), +col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), +col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), +col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), +col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255), +ccol1 VARCHAR(255),ccol2 VARCHAR(255),ccol3 VARCHAR(255),ccol4 VARCHAR(255),ccol5 VARCHAR(255), +ccol6 VARCHAR(255),ccol7 VARCHAR(255),ccol8 VARCHAR(255),ccol9 VARCHAR(255),ccol10 VARCHAR(255), ccol11 VARCHAR(255), +ccol12 VARCHAR(255),ccol13 VARCHAR(255),ccol14 VARCHAR(255),ccol15 VARCHAR(255),ccol16 VARCHAR(255), ccol17 VARCHAR(255), +ccol18 VARCHAR(255),ccol19 VARCHAR(255),ccol20 VARCHAR(255),ccol21 VARCHAR(255),ccol22 VARCHAR(255), ccol23 VARCHAR(255), +ccol24 VARCHAR(255),ccol25 VARCHAR(255),ccol26 VARCHAR(255),ccol27 VARCHAR(255),ccol28 VARCHAR(255), ccol29 VARCHAR(255), +ccol30 VARCHAR(255),ccol31 VARCHAR(255),ccol32 VARCHAR(255),ccol33 VARCHAR(255),ccol34 VARCHAR(255), ccol35 VARCHAR(255), +ccol36 VARCHAR(255),ccol37 VARCHAR(255),ccol38 VARCHAR(255),ccol39 VARCHAR(255),ccol40 VARCHAR(255), ccol41 VARCHAR(255), +ccol42 VARCHAR(255),ccol43 VARCHAR(255),ccol44 VARCHAR(255),ccol45 VARCHAR(255),ccol46 VARCHAR(255), ccol47 VARCHAR(255), +ccol48 VARCHAR(255),ccol49 VARCHAR(255),ccol50 VARCHAR(255),ccol51 VARCHAR(255),ccol52 VARCHAR(255), ccol53 VARCHAR(255), +ccol54 VARCHAR(255),ccol55 VARCHAR(255),ccol56 VARCHAR(255),ccol57 VARCHAR(255),ccol58 VARCHAR(255), ccol59 VARCHAR(255), +ccol60 VARCHAR(255),ccol61 VARCHAR(255),ccol62 VARCHAR(255),ccol63 VARCHAR(255),ccol64 VARCHAR(255), ccol65 VARCHAR(255) +) +ENGINE = innodb ROW_FORMAT=COMPACT; +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',214),NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL +); +ERROR 42000: Row size too large (> 16383). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',213),NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL +); +SELECT * FROM tab5; +col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 ccol1 ccol2 ccol3 ccol4 ccol5 ccol6 ccol7 ccol8 ccol9 ccol10 ccol11 ccol12 ccol13 ccol14 ccol15 ccol16 ccol17 ccol18 ccol19 ccol20 ccol21 ccol22 ccol23 ccol24 ccol25 ccol26 ccol27 ccol28 ccol29 ccol30 ccol31 ccol32 ccol33 ccol34 ccol35 ccol36 ccol37 ccol38 ccol39 ccol40 ccol41 ccol42 ccol43 ccol44 ccol45 ccol46 ccol47 ccol48 ccol49 ccol50 ccol51 ccol52 ccol53 ccol54 ccol55 ccol56 ccol57 ccol58 ccol59 ccol60 ccol61 ccol62 ccol63 ccol64 ccol65 +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +DROP TABLE tab5; +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255), +ccol1 CHAR(255),ccol2 CHAR(255),ccol3 CHAR(255),ccol4 CHAR(255),ccol5 CHAR(255), +ccol6 CHAR(255),ccol7 CHAR(255),ccol8 CHAR(255),ccol9 CHAR(255),ccol10 CHAR(255), ccol11 CHAR(255), +ccol12 CHAR(255),ccol13 CHAR(255),ccol14 CHAR(255),ccol15 CHAR(255),ccol16 CHAR(255), ccol17 CHAR(255), +ccol18 CHAR(255),ccol19 CHAR(255),ccol20 CHAR(255),ccol21 CHAR(255),ccol22 CHAR(255), ccol23 CHAR(255), +ccol24 CHAR(255),ccol25 CHAR(255),ccol26 CHAR(255),ccol27 CHAR(255),ccol28 CHAR(255), ccol29 CHAR(255), +ccol30 CHAR(255),ccol31 CHAR(255),ccol32 CHAR(255),ccol33 CHAR(255),ccol34 CHAR(255), ccol35 CHAR(255), +ccol36 CHAR(255),ccol37 CHAR(255),ccol38 CHAR(255),ccol39 CHAR(255),ccol40 CHAR(255), ccol41 CHAR(255), +ccol42 CHAR(255),ccol43 CHAR(255),ccol44 CHAR(255),ccol45 CHAR(255),ccol46 CHAR(255), ccol47 CHAR(255), +ccol48 CHAR(255),ccol49 CHAR(255),ccol50 CHAR(255),ccol51 CHAR(255),ccol52 CHAR(255), ccol53 CHAR(255), +ccol54 CHAR(255),ccol55 CHAR(255),ccol56 CHAR(255),ccol57 CHAR(255),ccol58 CHAR(255), ccol59 CHAR(255), +ccol60 CHAR(255),ccol61 CHAR(255),ccol62 CHAR(255),ccol63 CHAR(255),ccol64 CHAR(255), ccol65 CHAR(255) +) +ENGINE = innodb ROW_FORMAT=DYNAMIC; +Warnings: +Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. +DROP TABLE tab5; +CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), +col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), +col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), +col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), +col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), +col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), +col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), +col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), +col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), +col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), +col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255), +ccol1 VARCHAR(255),ccol2 VARCHAR(255),ccol3 VARCHAR(255),ccol4 VARCHAR(255),ccol5 VARCHAR(255), +ccol6 VARCHAR(255),ccol7 VARCHAR(255),ccol8 VARCHAR(255),ccol9 VARCHAR(255),ccol10 VARCHAR(255), ccol11 VARCHAR(255), +ccol12 VARCHAR(255),ccol13 VARCHAR(255),ccol14 VARCHAR(255),ccol15 VARCHAR(255),ccol16 VARCHAR(255), ccol17 VARCHAR(255), +ccol18 VARCHAR(255),ccol19 VARCHAR(255),ccol20 VARCHAR(255),ccol21 VARCHAR(255),ccol22 VARCHAR(255), ccol23 VARCHAR(255), +ccol24 VARCHAR(255),ccol25 VARCHAR(255),ccol26 VARCHAR(255),ccol27 VARCHAR(255),ccol28 VARCHAR(255), ccol29 VARCHAR(255), +ccol30 VARCHAR(255),ccol31 VARCHAR(255),ccol32 VARCHAR(255),ccol33 VARCHAR(255),ccol34 VARCHAR(255), ccol35 VARCHAR(255), +ccol36 VARCHAR(255),ccol37 VARCHAR(255),ccol38 VARCHAR(255),ccol39 VARCHAR(255),ccol40 VARCHAR(255), ccol41 VARCHAR(255), +ccol42 VARCHAR(255),ccol43 VARCHAR(255),ccol44 VARCHAR(255),ccol45 VARCHAR(255),ccol46 VARCHAR(255), ccol47 VARCHAR(255), +ccol48 VARCHAR(255),ccol49 VARCHAR(255),ccol50 VARCHAR(255),ccol51 VARCHAR(255),ccol52 VARCHAR(255), ccol53 VARCHAR(255), +ccol54 VARCHAR(255),ccol55 VARCHAR(255),ccol56 VARCHAR(255),ccol57 VARCHAR(255),ccol58 VARCHAR(255), ccol59 VARCHAR(255), +ccol60 VARCHAR(255),ccol61 VARCHAR(255),ccol62 VARCHAR(255),ccol63 VARCHAR(255),ccol64 VARCHAR(255), ccol65 VARCHAR(255) +) +ENGINE = innodb ROW_FORMAT=DYNAMIC; +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',214),NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL +); +ERROR 42000: Row size too large (> 16383). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',213),NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL +); +SELECT * FROM tab5; +col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 ccol1 ccol2 ccol3 ccol4 ccol5 ccol6 ccol7 ccol8 ccol9 ccol10 ccol11 ccol12 ccol13 ccol14 ccol15 ccol16 ccol17 ccol18 ccol19 ccol20 ccol21 ccol22 ccol23 ccol24 ccol25 ccol26 ccol27 ccol28 ccol29 ccol30 ccol31 ccol32 ccol33 ccol34 ccol35 ccol36 ccol37 ccol38 ccol39 ccol40 ccol41 ccol42 ccol43 ccol44 ccol45 ccol46 ccol47 ccol48 ccol49 ccol50 ccol51 ccol52 ccol53 ccol54 ccol55 ccol56 ccol57 ccol58 ccol59 ccol60 ccol61 ccol62 ccol63 ccol64 ccol65 +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +DROP TABLE tab5; +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255), +ccol1 CHAR(255),ccol2 CHAR(255),ccol3 CHAR(255),ccol4 CHAR(255),ccol5 CHAR(255), +ccol6 CHAR(255),ccol7 CHAR(255),ccol8 CHAR(255),ccol9 CHAR(255),ccol10 CHAR(255), ccol11 CHAR(255), +ccol12 CHAR(255),ccol13 CHAR(255),ccol14 CHAR(255),ccol15 CHAR(255),ccol16 CHAR(255), ccol17 CHAR(255), +ccol18 CHAR(255),ccol19 CHAR(255),ccol20 CHAR(255),ccol21 CHAR(255),ccol22 CHAR(255), ccol23 CHAR(255), +ccol24 CHAR(255),ccol25 CHAR(255),ccol26 CHAR(255),ccol27 CHAR(255),ccol28 CHAR(255), ccol29 CHAR(255), +ccol30 CHAR(255),ccol31 CHAR(255),ccol32 CHAR(255),ccol33 CHAR(255),ccol34 CHAR(255), ccol35 CHAR(255), +ccol36 CHAR(255),ccol37 CHAR(255),ccol38 CHAR(255),ccol39 CHAR(255),ccol40 CHAR(255), ccol41 CHAR(255), +ccol42 CHAR(255),ccol43 CHAR(255),ccol44 CHAR(255),ccol45 CHAR(255),ccol46 CHAR(255), ccol47 CHAR(255), +ccol48 CHAR(255),ccol49 CHAR(255),ccol50 CHAR(255),ccol51 CHAR(255),ccol52 CHAR(255), ccol53 CHAR(255), +ccol54 CHAR(255),ccol55 CHAR(255),ccol56 CHAR(255),ccol57 CHAR(255),ccol58 CHAR(255), ccol59 CHAR(255), +ccol60 CHAR(255),ccol61 CHAR(255),ccol62 CHAR(255),ccol63 CHAR(255),ccol64 CHAR(255), ccol65 CHAR(255) +) +ENGINE = innodb ROW_FORMAT=REDUNDANT; +Warnings: +Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL +); +ERROR 42000: Row size too large (> 16382). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +SELECT * FROM tab5; +col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 ccol1 ccol2 ccol3 ccol4 ccol5 ccol6 ccol7 ccol8 ccol9 ccol10 ccol11 ccol12 ccol13 ccol14 ccol15 ccol16 ccol17 ccol18 ccol19 ccol20 ccol21 ccol22 ccol23 ccol24 ccol25 ccol26 ccol27 ccol28 ccol29 ccol30 ccol31 ccol32 ccol33 ccol34 ccol35 ccol36 ccol37 ccol38 ccol39 ccol40 ccol41 ccol42 ccol43 ccol44 ccol45 ccol46 ccol47 ccol48 ccol49 ccol50 ccol51 ccol52 ccol53 ccol54 ccol55 ccol56 ccol57 ccol58 ccol59 ccol60 ccol61 ccol62 ccol63 ccol64 ccol65 +DROP TABLE tab5; +CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), +col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), +col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), +col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), +col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), +col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), +col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), +col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), +col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), +col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), +col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255), +ccol1 VARCHAR(255),ccol2 VARCHAR(255),ccol3 VARCHAR(255),ccol4 VARCHAR(255),ccol5 VARCHAR(255), +ccol6 VARCHAR(255),ccol7 VARCHAR(255),ccol8 VARCHAR(255),ccol9 VARCHAR(255),ccol10 VARCHAR(255), ccol11 VARCHAR(255), +ccol12 VARCHAR(255),ccol13 VARCHAR(255),ccol14 VARCHAR(255),ccol15 VARCHAR(255),ccol16 VARCHAR(255), ccol17 VARCHAR(255), +ccol18 VARCHAR(255),ccol19 VARCHAR(255),ccol20 VARCHAR(255),ccol21 VARCHAR(255),ccol22 VARCHAR(255), ccol23 VARCHAR(255), +ccol24 VARCHAR(255),ccol25 VARCHAR(255),ccol26 VARCHAR(255),ccol27 VARCHAR(255),ccol28 VARCHAR(255), ccol29 VARCHAR(255), +ccol30 VARCHAR(255),ccol31 VARCHAR(255),ccol32 VARCHAR(255),ccol33 VARCHAR(255),ccol34 VARCHAR(255), ccol35 VARCHAR(255), +ccol36 VARCHAR(255),ccol37 VARCHAR(255),ccol38 VARCHAR(255),ccol39 VARCHAR(255),ccol40 VARCHAR(255), ccol41 VARCHAR(255), +ccol42 VARCHAR(255),ccol43 VARCHAR(255),ccol44 VARCHAR(255),ccol45 VARCHAR(255),ccol46 VARCHAR(255), ccol47 VARCHAR(255), +ccol48 VARCHAR(255),ccol49 VARCHAR(255),ccol50 VARCHAR(255),ccol51 VARCHAR(255),ccol52 VARCHAR(255), ccol53 VARCHAR(255), +ccol54 VARCHAR(255),ccol55 VARCHAR(255),ccol56 VARCHAR(255),ccol57 VARCHAR(255),ccol58 VARCHAR(255), ccol59 VARCHAR(255), +ccol60 VARCHAR(255),ccol61 VARCHAR(255),ccol62 VARCHAR(255),ccol63 VARCHAR(255),ccol64 VARCHAR(255), ccol65 VARCHAR(255) +) +ENGINE = innodb ROW_FORMAT=REDUNDANT; +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',27),NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL +); +ERROR 42000: Row size too large (> 16382). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',26),NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL +); +SELECT * FROM tab5; +col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 ccol1 ccol2 ccol3 ccol4 ccol5 ccol6 ccol7 ccol8 ccol9 ccol10 ccol11 ccol12 ccol13 ccol14 ccol15 ccol16 ccol17 ccol18 ccol19 ccol20 ccol21 ccol22 ccol23 ccol24 ccol25 ccol26 ccol27 ccol28 ccol29 ccol30 ccol31 ccol32 ccol33 ccol34 ccol35 ccol36 ccol37 ccol38 ccol39 ccol40 ccol41 ccol42 ccol43 ccol44 ccol45 ccol46 ccol47 ccol48 ccol49 ccol50 ccol51 ccol52 ccol53 ccol54 ccol55 ccol56 ccol57 ccol58 ccol59 ccol60 ccol61 ccol62 ccol63 ccol64 ccol65 +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +DROP TABLE tab5; +CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), +col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), +col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), +col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), +col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), +col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), +col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), +col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), +col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), +col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), +col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) +ENGINE = innodb ROW_FORMAT=COMPRESSED; +Warnings: +Warning 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > NNNNk. Assuming ROW_FORMAT=DYNAMIC. +DROP TABLE tab5; +CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; +SHOW WARNINGS; +Level Code Message +INSERT INTO t VALUES (REPEAT('a',16384)); +INSERT INTO t VALUES (REPEAT('a',32768)); +INSERT INTO t VALUES (REPEAT('a',65535)); +SELECT LENGTH(col) FROM t; +LENGTH(col) +16384 +32768 +65535 +FLUSH TABLE t; +ANALYZE TABLE t; +Table Op Msg_type Msg_text +test.t analyze status OK +SELECT stat_value FROM mysql.innodb_index_stats where database_name = 'test' and table_name= 't' and stat_name='n_leaf_pages'; +stat_value +4 +SELECT clustered_index_size from mysql.innodb_table_stats where database_name = 'test' and table_name= 't'; +clustered_index_size +5 +DROP TABLE t; +CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; +SHOW WARNINGS; +Level Code Message +INSERT INTO t VALUES (REPEAT('a',16384)); +INSERT INTO t VALUES (REPEAT('a',32768)); +INSERT INTO t VALUES (REPEAT('a',65535)); +SELECT LENGTH(col) FROM t; +LENGTH(col) +16384 +32768 +65535 +FLUSH TABLE t; +ANALYZE TABLE t; +Table Op Msg_type Msg_text +test.t analyze status OK +SELECT stat_value FROM mysql.innodb_index_stats where database_name = 'test' and table_name= 't' and stat_name='n_leaf_pages'; +stat_value +3 +SELECT clustered_index_size from mysql.innodb_table_stats where database_name = 'test' and table_name= 't'; +clustered_index_size +4 +DROP TABLE t; +CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=COMPACT; +SHOW WARNINGS; +Level Code Message +INSERT INTO t VALUES (REPEAT('a',16384)); +INSERT INTO t VALUES (REPEAT('a',32768)); +INSERT INTO t VALUES (REPEAT('a',65535)); +SELECT LENGTH(col) FROM t; +LENGTH(col) +16384 +32768 +65535 +FLUSH TABLE t; +ANALYZE TABLE t; +Table Op Msg_type Msg_text +test.t analyze status OK +SELECT stat_value FROM mysql.innodb_index_stats where database_name = 'test' and table_name= 't' and stat_name='n_leaf_pages'; +stat_value +3 +SELECT clustered_index_size from mysql.innodb_table_stats where database_name = 'test' and table_name= 't'; +clustered_index_size +4 +DROP TABLE t; +# Success diff --git a/mysql-test/suite/innodb/r/innodb_stats_del_mark.result b/mysql-test/suite/innodb/r/innodb_stats_del_mark.result deleted file mode 100644 index 67538bf8eb3..00000000000 --- a/mysql-test/suite/innodb/r/innodb_stats_del_mark.result +++ /dev/null @@ -1,91 +0,0 @@ -# -# Bug 23333990 PERSISTENT INDEX STATISTICS UPDATE BEFORE -# TRANSACTION IS COMMITTED -# -"Test 1:- Uncommited delete test" -CREATE TABLE t1 (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, -val INT UNSIGNED NOT NULL, -INDEX (val)) ENGINE=INNODB -STATS_PERSISTENT=1,STATS_AUTO_RECALC=1; -INSERT INTO t1 (val) VALUES (CEIL(RAND()*20)); -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -SELECT COUNT(*) FROM t1; -COUNT(*) -262144 -ANALYZE TABLE t1; -Table Op Msg_type Msg_text -test.t1 analyze status OK -connect con1, localhost, root,,; -START TRANSACTION; -DELETE FROM t1; -SELECT COUNT(*) FROM t1; -connection default; -Test correctly estimates the number of rows as > 20000 -even when in other uncommmited transaction -all rows have been deleted. -connection con1; -COUNT(*) -0 -commit; -connection default; -Test 2:- Insert and rollback test -CREATE TABLE t2 (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, -val INT UNSIGNED NOT NULL, -INDEX (val)) ENGINE=INNODB -STATS_PERSISTENT=1,STATS_AUTO_RECALC=1; -connection con1; -START TRANSACTION; -INSERT INTO t2 (val) VALUES (CEIL(RAND()*20)); -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -SELECT COUNT(*) FROM t2; -connection default; -select count(*) from t2; -count(*) -0 -Test correctly estimates the number of rows as > 20000 -even when in other uncommited transaction -many rows are inserted. -connection con1; -COUNT(*) -262144 -Rollback the insert -rollback; -disconnect con1; -connection default; -Test correctly estimates the number of rows as 1 -after rollback. -DROP TABLE t1,t2; diff --git a/mysql-test/suite/innodb/r/innodb_stats_persistent.result b/mysql-test/suite/innodb/r/innodb_stats_persistent.result new file mode 100644 index 00000000000..f4de4b6b82e --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb_stats_persistent.result @@ -0,0 +1,116 @@ +SET @saved_include_delete_marked = @@GLOBAL.innodb_stats_include_delete_marked; +SET GLOBAL innodb_stats_include_delete_marked = ON; +SET @saved_traditional = @@GLOBAL.innodb_stats_traditional; +SET GLOBAL innodb_stats_traditional=false; +SET @saved_modified_counter = @@GLOBAL.innodb_stats_modified_counter; +SET GLOBAL innodb_stats_modified_counter=1; +CREATE TABLE t0 (id SERIAL, val INT UNSIGNED NOT NULL, KEY(val)) +ENGINE=INNODB STATS_PERSISTENT=1,STATS_AUTO_RECALC=1; +CREATE TABLE t1 LIKE t0; +CREATE TABLE t2 LIKE t0; +INSERT INTO t0 (val) VALUES (4); +INSERT INTO t0 (val) SELECT 4 FROM t0; +INSERT INTO t0 (val) SELECT 4 FROM t0; +INSERT INTO t0 (val) SELECT 4 FROM t0; +INSERT INTO t0 (val) SELECT 4 FROM t0; +INSERT INTO t1 SELECT * FROM t0; +SELECT COUNT(*) FROM t1; +COUNT(*) +16 +ANALYZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +connect con1, localhost, root,,; +START TRANSACTION; +DELETE FROM t1; +SELECT COUNT(*) FROM t1; +connection default; +# With innodb_stats_include_delete_marked=ON, +# DELETE must not affect statistics before COMMIT. +EXPLAIN SELECT * FROM t1 WHERE val=4; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref val val 4 const 16 Using index +connection con1; +COUNT(*) +0 +ROLLBACK; +SELECT COUNT(*) FROM t1; +COUNT(*) +16 +EXPLAIN SELECT * FROM t1 WHERE val=4; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref val val 4 const 16 Using index +BEGIN; +DELETE FROM t1; +COMMIT; +SELECT COUNT(*) FROM t1; +COUNT(*) +0 +connection default; +BEGIN; +INSERT INTO t2 SELECT * FROM t0; +# The INSERT will show up before COMMIT. +EXPLAIN SELECT * FROM t2 WHERE val=4; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t2 ref val val 4 const 16 Using index +SELECT COUNT(*) FROM t2; +COUNT(*) +16 +# The ROLLBACK of the INSERT must affect the statistics. +ROLLBACK; +SELECT COUNT(*) FROM t2; +COUNT(*) +0 +connection con1; +EXPLAIN SELECT * FROM t2 WHERE val=4; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t2 ref val val 4 const 1 Using index +SET @saved_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency; +SET GLOBAL innodb_purge_rseg_truncate_frequency = 1; +InnoDB 0 transactions not purged +SET GLOBAL innodb_purge_rseg_truncate_frequency = @saved_frequency; +# After COMMIT and purge, the DELETE must show up. +EXPLAIN SELECT * FROM t1 WHERE val=4; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref val val 4 const 1 Using index +SET GLOBAL innodb_stats_include_delete_marked = OFF; +BEGIN; +INSERT INTO t1 SELECT * FROM t0; +EXPLAIN SELECT * FROM t1 WHERE val=4; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref val val 4 const 16 Using index +ROLLBACK; +EXPLAIN SELECT * FROM t1 WHERE val=4; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref val val 4 const 1 Using index +BEGIN; +INSERT INTO t1 SELECT * FROM t0; +COMMIT; +EXPLAIN SELECT * FROM t1 WHERE val=4; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref val val 4 const 16 Using index +BEGIN; +DELETE FROM t1; +SELECT COUNT(*) FROM t1; +COUNT(*) +0 +# With innodb_stats_include_delete_marked=OFF, +# DELETE must affect statistics even before COMMIT. +# However, if there was a WHERE condition, +# ha_innobase::records_in_range() would count the delete-marked records. +EXPLAIN SELECT * FROM t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index NULL val 4 NULL 1 Using index +ROLLBACK; +EXPLAIN SELECT * FROM t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index NULL val 4 NULL 16 Using index +SELECT COUNT(*) FROM t1; +COUNT(*) +16 +disconnect con1; +connection default; +DROP TABLE t0,t1,t2; +SET GLOBAL innodb_stats_include_delete_marked = @saved_include_delete_marked; +SET GLOBAL innodb_stats_traditional = @saved_traditional; +SET GLOBAL innodb_stats_modified_counter = @saved_modified_counter; diff --git a/mysql-test/suite/innodb/r/innodb_stats_persistent_debug.result b/mysql-test/suite/innodb/r/innodb_stats_persistent_debug.result new file mode 100644 index 00000000000..9f93f05fd56 --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb_stats_persistent_debug.result @@ -0,0 +1,23 @@ +# +# MDEV-13534 InnoDB STATS_PERSISTENT fails to ignore +# garbage delete-mark flag on node pointer pages +# +CREATE TABLE t(a INT UNSIGNED PRIMARY KEY) +ENGINE=InnoDB STATS_PERSISTENT=1 STATS_SAMPLE_PAGES=1; +BEGIN; +SET @save_debug = @@GLOBAL.innodb_limit_optimistic_insert_debug; +SET GLOBAL innodb_limit_optimistic_insert_debug=2; +INSERT t VALUES(1),(5); +DELETE FROM t; +INSERT t VALUES(4); +DELETE FROM t; +INSERT t VALUES(3); +DELETE FROM t; +SET GLOBAL innodb_limit_optimistic_insert_debug = @save_debug; +connect con1, localhost, root,,; +ANALYZE TABLE t; +Table Op Msg_type Msg_text +test.t analyze status OK +disconnect con1; +connection default; +DROP TABLE t; diff --git a/mysql-test/suite/innodb/r/innodb_xtradb_compat.result b/mysql-test/suite/innodb/r/innodb_xtradb_compat.result new file mode 100644 index 00000000000..20b6ac4c892 --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb_xtradb_compat.result @@ -0,0 +1,313 @@ +select @@innodb_adaptive_hash_index_partitions, @@innodb_adaptive_hash_index_parts; +@@innodb_adaptive_hash_index_partitions @@innodb_adaptive_hash_index_parts +16 16 +set global innodb_adaptive_hash_index_partitions=1; +ERROR HY000: Variable 'innodb_adaptive_hash_index_partitions' is a read only variable +select @@innodb_buffer_pool_populate; +@@innodb_buffer_pool_populate +1 +set global innodb_buffer_pool_populate=1; +ERROR HY000: Variable 'innodb_buffer_pool_populate' is a read only variable +select @@innodb_cleaner_eviction_factor; +@@innodb_cleaner_eviction_factor +1 +set global innodb_cleaner_eviction_factor=1; +Warnings: +Warning 1287 Using innodb_cleaner_eviction_factor is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_cleaner_eviction_factor; +@@innodb_cleaner_eviction_factor +1 +select @@innodb_cleaner_flush_chunk_size; +@@innodb_cleaner_flush_chunk_size +16 +set global innodb_cleaner_flush_chunk_size=8; +Warnings: +Warning 1287 Using innodb_cleaner_flush_chunk_size is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_cleaner_flush_chunk_size; +@@innodb_cleaner_flush_chunk_size +16 +select @@innodb_cleaner_free_list_lwm; +@@innodb_cleaner_free_list_lwm +1 +set global innodb_cleaner_free_list_lwm=1; +Warnings: +Warning 1287 Using innodb_cleaner_free_list_lwm is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_cleaner_free_list_lwm; +@@innodb_cleaner_free_list_lwm +1 +select @@innodb_cleaner_lru_chunk_size; +@@innodb_cleaner_lru_chunk_size +1 +set global innodb_cleaner_lru_chunk_size=8; +Warnings: +Warning 1287 Using innodb_cleaner_lru_chunk_size is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_cleaner_lru_chunk_size; +@@innodb_cleaner_lru_chunk_size +1 +select @@innodb_cleaner_lsn_age_factor; +@@innodb_cleaner_lsn_age_factor +HIGH_CHECKPOINT +set global innodb_cleaner_lsn_age_factor=HIGH_CHECKPOINT; +Warnings: +Warning 1287 Using innodb_cleaner_lsn_age_factor is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_cleaner_lsn_age_factor; +@@innodb_cleaner_lsn_age_factor +HIGH_CHECKPOINT +select @@innodb_cleaner_max_flush_time; +@@innodb_cleaner_max_flush_time +1 +set global innodb_cleaner_max_flush_time=1; +Warnings: +Warning 1287 Using innodb_cleaner_max_flush_time is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_cleaner_max_flush_time; +@@innodb_cleaner_max_flush_time +1 +select @@innodb_cleaner_max_lru_time; +@@innodb_cleaner_max_lru_time +1 +set global innodb_cleaner_max_lru_time=1; +Warnings: +Warning 1287 Using innodb_cleaner_max_lru_time is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_cleaner_max_lru_time; +@@innodb_cleaner_max_lru_time +1 +select @@innodb_corrupt_table_action; +@@innodb_corrupt_table_action +salvage +set global innodb_corrupt_table_action=salvage; +Warnings: +Warning 1287 Using innodb_corrupt_table_action is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_corrupt_table_action; +@@innodb_corrupt_table_action +salvage +select @@innodb_empty_free_list_algorithm; +@@innodb_empty_free_list_algorithm +BACKOFF +set global innodb_empty_free_list_algorithm=BACKOFF; +Warnings: +Warning 1287 Using innodb_empty_free_list_algorithm is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_empty_free_list_algorithm; +@@innodb_empty_free_list_algorithm +BACKOFF +select @@innodb_fake_changes; +@@innodb_fake_changes +1 +set global innodb_fake_changes=1; +Warnings: +Warning 1287 Using innodb_fake_changes is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_fake_changes; +@@innodb_fake_changes +1 +# @@innodb_file_io_threads is absent +select @@innodb_foreground_preflush; +@@innodb_foreground_preflush +EXPONENTIAL_BACKOFF +set global innodb_foreground_preflush=EXPONENTIAL_BACKOFF; +Warnings: +Warning 1287 Using innodb_foreground_preflush is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_foreground_preflush; +@@innodb_foreground_preflush +EXPONENTIAL_BACKOFF +select @@innodb_kill_idle_transaction; +@@innodb_kill_idle_transaction +1 +set global innodb_kill_idle_transaction=1; +Warnings: +Warning 1287 Using innodb_kill_idle_transaction is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_kill_idle_transaction; +@@innodb_kill_idle_transaction +1 +select @@innodb_locking_fake_changes; +@@innodb_locking_fake_changes +1 +set global innodb_locking_fake_changes=1; +Warnings: +Warning 1287 Using innodb_locking_fake_changes is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_locking_fake_changes; +@@innodb_locking_fake_changes +1 +select @@innodb_log_arch_expire_sec; +@@innodb_log_arch_expire_sec +1 +set global innodb_log_arch_expire_sec=1; +Warnings: +Warning 1287 Using innodb_log_arch_expire_sec is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_log_arch_expire_sec; +@@innodb_log_arch_expire_sec +1 +select @@innodb_log_block_size; +@@innodb_log_block_size +16 +set global innodb_log_block_size= 8; +ERROR HY000: Variable 'innodb_log_block_size' is a read only variable +select @@innodb_log_checksum_algorithm, @@innodb_log_checksums; +@@innodb_log_checksum_algorithm @@innodb_log_checksums +STRICT_INNODB 1 +set global innodb_log_checksum_algorithm=NONE; +Warnings: +Warning 1287 Using innodb_log_checksum_algorithm is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_log_checksum_algorithm, @@innodb_log_checksums; +@@innodb_log_checksum_algorithm @@innodb_log_checksums +NONE 0 +set global innodb_log_checksum_algorithm=STRICT_INNODB; +Warnings: +Warning 1287 Using innodb_log_checksum_algorithm is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_log_checksum_algorithm, @@innodb_log_checksums; +@@innodb_log_checksum_algorithm @@innodb_log_checksums +STRICT_INNODB 1 +select @@innodb_max_bitmap_file_size; +@@innodb_max_bitmap_file_size +1 +set global innodb_max_bitmap_file_size=1; +Warnings: +Warning 1287 Using innodb_max_bitmap_file_size is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_max_bitmap_file_size; +@@innodb_max_bitmap_file_size +1 +select @@innodb_max_changed_pages; +@@innodb_max_changed_pages +1 +set global innodb_max_changed_pages=1; +Warnings: +Warning 1287 Using innodb_max_changed_pages is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_max_changed_pages; +@@innodb_max_changed_pages +1 +select @@innodb_mirrored_log_groups; +@@innodb_mirrored_log_groups +8 +set global innodb_mirrored_log_groups= 4; +ERROR HY000: Variable 'innodb_mirrored_log_groups' is a read only variable +select @@innodb_priority_cleaner; +@@innodb_priority_cleaner +1 +set global innodb_priority_cleaner=1; +Warnings: +Warning 1287 Using innodb_priority_cleaner is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_priority_cleaner; +@@innodb_priority_cleaner +1 +select @@innodb_priority_io; +@@innodb_priority_io +1 +set global innodb_priority_io=1; +Warnings: +Warning 1287 Using innodb_priority_io is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_priority_io; +@@innodb_priority_io +1 +select @@innodb_priority_master; +@@innodb_priority_master +1 +set global innodb_priority_master=1; +Warnings: +Warning 1287 Using innodb_priority_master is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_priority_master; +@@innodb_priority_master +1 +select @@innodb_priority_purge; +@@innodb_priority_purge +1 +set global innodb_priority_purge=1; +Warnings: +Warning 1287 Using innodb_priority_purge is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_priority_purge; +@@innodb_priority_purge +1 +select @@innodb_sched_priority_cleaner; +@@innodb_sched_priority_cleaner +16 +set global innodb_sched_priority_cleaner=8; +Warnings: +Warning 1287 Using innodb_sched_priority_cleaner is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_sched_priority_cleaner; +@@innodb_sched_priority_cleaner +16 +select @@innodb_sched_priority_io; +@@innodb_sched_priority_io +16 +set global innodb_sched_priority_io=8; +Warnings: +Warning 1287 Using innodb_sched_priority_io is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_sched_priority_io; +@@innodb_sched_priority_io +16 +select @@innodb_sched_priority_master; +@@innodb_sched_priority_master +16 +set global innodb_sched_priority_master=8; +Warnings: +Warning 1287 Using innodb_sched_priority_master is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_sched_priority_master; +@@innodb_sched_priority_master +16 +select @@innodb_sched_priority_purge; +@@innodb_sched_priority_purge +16 +set global innodb_sched_priority_purge=8; +Warnings: +Warning 1287 Using innodb_sched_priority_purge is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_sched_priority_purge; +@@innodb_sched_priority_purge +16 +select @@innodb_show_locks_held; +@@innodb_show_locks_held +16 +set global innodb_show_locks_held=8; +Warnings: +Warning 1287 Using innodb_show_locks_held is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_show_locks_held; +@@innodb_show_locks_held +16 +select @@innodb_show_verbose_locks; +@@innodb_show_verbose_locks +1 +set global innodb_show_verbose_locks=1; +Warnings: +Warning 1287 Using innodb_show_verbose_locks is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_show_verbose_locks; +@@innodb_show_verbose_locks +1 +select @@innodb_track_changed_pages; +@@innodb_track_changed_pages +1 +set global innodb_track_changed_pages=1; +ERROR HY000: Variable 'innodb_track_changed_pages' is a read only variable +select @@innodb_track_redo_log_now; +@@innodb_track_redo_log_now +1 +set global innodb_track_redo_log_now=1; +Warnings: +Warning 1287 Using innodb_track_redo_log_now is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_track_redo_log_now; +@@innodb_track_redo_log_now +1 +select @@innodb_use_global_flush_log_at_trx_commit; +@@innodb_use_global_flush_log_at_trx_commit +1 +set global innodb_use_global_flush_log_at_trx_commit=1; +Warnings: +Warning 1287 Using innodb_use_global_flush_log_at_trx_commit is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_use_global_flush_log_at_trx_commit; +@@innodb_use_global_flush_log_at_trx_commit +1 +select @@innodb_use_stacktrace; +@@innodb_use_stacktrace +1 +set global innodb_use_stacktrace=1; +ERROR HY000: Variable 'innodb_use_stacktrace' is a read only variable +select @@innodb_log_archive; +@@innodb_log_archive +1 +set global innodb_log_archive=1; +Warnings: +Warning 1287 Using innodb_log_archive is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +select @@innodb_log_archive; +@@innodb_log_archive +1 +select @@innodb_log_arch_dir; +@@innodb_log_arch_dir +ttt +set global innodb_log_arch_dir="ttt"; +ERROR HY000: Variable 'innodb_log_arch_dir' is a read only variable +FOUND 36 /Using [A-Za-z\-]* is deprecated and the parameter may be removed in future releases. Ignoning the parameter./ in mysqld.1.err diff --git a/mysql-test/suite/innodb/r/innodb_zip_innochecksum.result b/mysql-test/suite/innodb/r/innodb_zip_innochecksum.result new file mode 100644 index 00000000000..31d9450df80 --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb_zip_innochecksum.result @@ -0,0 +1,91 @@ +# Set the environmental variables +call mtr.add_suppression("InnoDB: Unable to read tablespace .* page no .* into the buffer pool after 100 attempts"); +call mtr.add_suppression("InnoDB: Warning: database page corruption or a failed"); +CREATE TABLE tab1(c1 INT PRIMARY KEY,c2 VARCHAR(20)) ENGINE=InnoDB; +CREATE INDEX idx1 ON tab1(c2(10)); +INSERT INTO tab1 VALUES(1, 'Innochecksum InnoDB1'); +CREATE TABLE t1(id INT AUTO_INCREMENT PRIMARY KEY, msg VARCHAR(255)) ENGINE=INNODB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4; +insert into t1 values(1,"i"); +insert into t1 values(2,"am"); +insert into t1 values(3,"compressed table"); +# Shutdown the Server +# Server Default checksum = innodb +[1b]: check the innochecksum without --strict-check +[2]: check the innochecksum with full form --strict-check=crc32 +[3]: check the innochecksum with short form -C crc32 +[4]: check the innochecksum with --no-check ignores algorithm check, warning is expected +FOUND 1 /Error: --no-check must be associated with --write option./ in my_restart.err +[5]: check the innochecksum with short form --no-check ignores algorithm check, warning is expected +FOUND 1 /Error: --no-check must be associated with --write option./ in my_restart.err +[6]: check the innochecksum with full form strict-check & no-check , an error is expected +FOUND 1 /Error: --strict-check option cannot be used together with --no-check option./ in my_restart.err +[7]: check the innochecksum with short form strict-check & no-check , an error is expected +FOUND 1 /Error: --strict-check option cannot be used together with --no-check option./ in my_restart.err +[8]: check the innochecksum with short & full form combination +# strict-check & no-check, an error is expected +FOUND 1 /Error: --strict-check option cannot be used together with --no-check option./ in my_restart.err +[9]: check the innochecksum with full form --strict-check=innodb +[10]: check the innochecksum with full form --strict-check=none +# when server Default checksum=crc32 +[11]: check the innochecksum with short form -C innodb +# when server Default checksum=crc32 +[12]: check the innochecksum with short form -C none +# when server Default checksum=crc32 +[13]: check strict-check with invalid values +FOUND 1 /Error while setting value \'strict_innodb\' to \'strict-check\'/ in my_restart.err +FOUND 1 /Error while setting value \'strict_innodb\' to \'strict-check\'/ in my_restart.err +FOUND 1 /Error while setting value \'strict_crc32\' to \'strict-check\'/ in my_restart.err +FOUND 1 /Error while setting value \'strict_crc32\' to \'strict-check\'/ in my_restart.err +FOUND 1 /Error while setting value \'strict_none\' to \'strict-check\'/ in my_restart.err +FOUND 1 /Error while setting value \'strict_none\' to \'strict-check\'/ in my_restart.err +FOUND 1 /Error while setting value \'InnoBD\' to \'strict-check\'/ in my_restart.err +FOUND 1 /Error while setting value \'InnoBD\' to \'strict-check\'/ in my_restart.err +FOUND 1 /Error while setting value \'crc\' to \'strict-check\'/ in my_restart.err +FOUND 1 /Error while setting value \'no\' to \'strict-check\'/ in my_restart.err +[14a]: when server default checksum=crc32 rewrite new checksum=crc32 with innochecksum +# Also check the long form of write option. +[14b]: when server default checksum=crc32 rewrite new checksum=innodb with innochecksum +# Also check the long form of write option. +# start the server with innodb_checksum_algorithm=InnoDB +INSERT INTO tab1 VALUES(2, 'Innochecksum CRC32'); +SELECT c1,c2 FROM tab1 order by c1,c2; +c1 c2 +1 Innochecksum InnoDB1 +2 Innochecksum CRC32 +# Stop the server +[15]: when server default checksum=crc32 rewrite new checksum=none with innochecksum +# Also check the short form of write option. +# Start the server with checksum algorithm=none +INSERT INTO tab1 VALUES(3, 'Innochecksum None'); +SELECT c1,c2 FROM tab1 order by c1,c2; +c1 c2 +1 Innochecksum InnoDB1 +2 Innochecksum CRC32 +3 Innochecksum None +DROP TABLE t1; +# Stop the server +[16]: rewrite into new checksum=crc32 with innochecksum +# Restart the DB server with innodb_checksum_algorithm=crc32 +SELECT * FROM tab1; +c1 c2 +1 Innochecksum InnoDB1 +2 Innochecksum CRC32 +3 Innochecksum None +DELETE FROM tab1 where c1=3; +SELECT c1,c2 FROM tab1 order by c1,c2; +c1 c2 +1 Innochecksum InnoDB1 +2 Innochecksum CRC32 +# Stop server +[17]: rewrite into new checksum=InnoDB +# Restart the DB server with innodb_checksum_algorithm=InnoDB +DELETE FROM tab1 where c1=2; +SELECT * FROM tab1; +c1 c2 +1 Innochecksum InnoDB1 +# Stop server +[18]:check Innochecksum with invalid write options +FOUND 1 /Error while setting value \'strict_crc32\' to \'write\'/ in my_restart.err +FOUND 1 /Error while setting value \'strict_innodb\' to \'write\'/ in my_restart.err +FOUND 1 /Error while setting value \'crc23\' to \'write\'/ in my_restart.err +DROP TABLE tab1; diff --git a/mysql-test/suite/innodb/r/innodb_zip_innochecksum2.result b/mysql-test/suite/innodb/r/innodb_zip_innochecksum2.result new file mode 100644 index 00000000000..582bb42f0cb --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb_zip_innochecksum2.result @@ -0,0 +1,160 @@ +SET GLOBAL innodb_compression_level=0; +SELECT @@innodb_compression_level; +@@innodb_compression_level +0 +CREATE TABLE t1 (j LONGBLOB) ENGINE = InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; +INSERT INTO t1 VALUES (repeat('abcdefghijklmnopqrstuvwxyz',200)); +INSERT INTO t1 SELECT * from t1; +INSERT INTO t1 SELECT * from t1; +INSERT INTO t1 SELECT * from t1; +INSERT INTO t1 SELECT * from t1; +INSERT INTO t1 SELECT * from t1; +INSERT INTO t1 SELECT * from t1; +INSERT INTO t1 SELECT * from t1; +INSERT INTO t1 SELECT * from t1; +INSERT INTO t1 SELECT * from t1; +INSERT INTO t1 SELECT * from t1; +# stop the server + +Variables (--variable-name=value) +and boolean options {FALSE|TRUE} Value (after reading options) +--------------------------------- ---------------------------------------- +verbose TRUE +debug FALSE +count FALSE +start-page 0 +end-page 0 +page 0 +strict-check crc32 +no-check FALSE +allow-mismatches 0 +write crc32 +page-type-summary FALSE +page-type-dump MYSQLTEST_VARDIR/tmp/dump.txt +per-page-details FALSE +log (No default value) +leaf FALSE +merge 0 +[1]:# check the both short and long options for "help" +[2]:# Run the innochecksum when file isn't provided. +# It will print the innochecksum usage similar to --help option. +innochecksum Ver #.#.# +Copyright (c) YEAR, YEAR , Oracle, MariaDB Corporation Ab and others. + +InnoDB offline file checksum utility. +Usage: innochecksum [-c] [-s ] [-e ] [-p ] [-i] [-v] [-a ] [-n] [-C ] [-w ] [-S] [-D ] [-l ] [-l] [-m ] + -?, --help Displays this help and exits. + -I, --info Synonym for --help. + -V, --version Displays version information and exits. + -v, --verbose Verbose (prints progress every 5 seconds). + -c, --count Print the count of pages in the file and exits. + -s, --start-page=# Start on this page number (0 based). + -e, --end-page=# End at this page number (0 based). + -p, --page=# Check only this page (0 based). + -C, --strict-check=name + Specify the strict checksum algorithm by the user.. One + of: crc32, crc32, innodb, innodb, none, none + -n, --no-check Ignore the checksum verification. + -a, --allow-mismatches=# + Maximum checksum mismatch allowed. + -w, --write=name Rewrite the checksum algorithm by the user.. One of: + crc32, crc32, innodb, innodb, none, none + -S, --page-type-summary + Display a count of each page type in a tablespace. + -D, --page-type-dump=name + Dump the page type info for each page in a tablespace. + -i, --per-page-details + Print out per-page detail information. + -l, --log=name log output. + -f, --leaf Examine leaf index pages + -m, --merge=# leaf page count if merge given number of consecutive + pages + +Variables (--variable-name=value) +and boolean options {FALSE|TRUE} Value (after reading options) +--------------------------------- ---------------------------------------- +verbose FALSE +count FALSE +start-page 0 +end-page 0 +page 0 +strict-check crc32 +no-check FALSE +allow-mismatches 0 +write crc32 +page-type-summary FALSE +page-type-dump (No default value) +per-page-details FALSE +log (No default value) +leaf FALSE +merge 0 +[3]:# check the both short and long options for "count" and exit +Number of pages:# +Number of pages:# +[4]:# Print the version of innochecksum and exit +innochecksum Ver #.#.## Restart the DB server +DROP TABLE t1; +[5]:# Check the innochecksum for compressed table t1 with different key_block_size +# Test for KEY_BLOCK_SIZE=1 +===> Testing size=1 +CREATE TABLE t1(id INT AUTO_INCREMENT PRIMARY KEY, msg VARCHAR(255)) ENGINE=INNODB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; +insert into t1 values(1,"I"); +insert into t1 values(2,"AM"); +insert into t1 values(3,"COMPRESSED"); +select * from t1; +id msg +1 I +2 AM +3 COMPRESSED +drop table t1; +# Test for KEY_BLOCK_SIZE=2 +===> Testing size=2 +CREATE TABLE t1(id INT AUTO_INCREMENT PRIMARY KEY, msg VARCHAR(255)) ENGINE=INNODB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=2; +insert into t1 values(1,"I"); +insert into t1 values(2,"AM"); +insert into t1 values(3,"COMPRESSED"); +select * from t1; +id msg +1 I +2 AM +3 COMPRESSED +drop table t1; +# Test for for KEY_BLOCK_SIZE=4 +===> Testing size=4 +CREATE TABLE t1(id INT AUTO_INCREMENT PRIMARY KEY, msg VARCHAR(255)) ENGINE=INNODB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4; +insert into t1 values(1,"I"); +insert into t1 values(2,"AM"); +insert into t1 values(3,"COMPRESSED"); +select * from t1; +id msg +1 I +2 AM +3 COMPRESSED +drop table t1; +set innodb_strict_mode=off; +# Test for for KEY_BLOCK_SIZE=8 +===> Testing size=8 +CREATE TABLE t1(id INT AUTO_INCREMENT PRIMARY KEY, msg VARCHAR(255)) ENGINE=INNODB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8; +insert into t1 values(1,"I"); +insert into t1 values(2,"AM"); +insert into t1 values(3,"COMPRESSED"); +select * from t1; +id msg +1 I +2 AM +3 COMPRESSED +drop table t1; +set innodb_strict_mode=off; +# Test for KEY_BLOCK_SIZE=16 +===> Testing size=16 +CREATE TABLE t1(id INT AUTO_INCREMENT PRIMARY KEY, msg VARCHAR(255)) ENGINE=INNODB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=16; +insert into t1 values(1,"I"); +insert into t1 values(2,"AM"); +insert into t1 values(3,"COMPRESSED"); +select * from t1; +id msg +1 I +2 AM +3 COMPRESSED +drop table t1; +# Test[5] completed diff --git a/mysql-test/suite/innodb/r/innodb_zip_innochecksum3.result b/mysql-test/suite/innodb/r/innodb_zip_innochecksum3.result new file mode 100644 index 00000000000..aaab68b3df9 --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb_zip_innochecksum3.result @@ -0,0 +1,227 @@ +# Set the environmental variables +call mtr.add_suppression("InnoDB: Unable to read tablespace .* page no .* into the buffer pool after 100 attempts"); +call mtr.add_suppression("InnoDB: innodb_checksum_algorithm is set to.*"); +[1]: Further Test are for rewrite checksum (innodb|crc32|none) for all ibd file & start the server. +CREATE TABLE tab1 (pk INTEGER NOT NULL PRIMARY KEY, +linestring_key GEOMETRY NOT NULL, +linestring_nokey GEOMETRY NOT NULL) +ENGINE=InnoDB ; +INSERT INTO tab1 (pk, linestring_key, linestring_nokey) +VALUES (1, ST_GeomFromText('POINT(10 10) '), ST_GeomFromText('POINT(10 10) ')); +CREATE INDEX linestring_index ON tab1(linestring_nokey(5)); +ALTER TABLE tab1 ADD KEY (linestring_key(5)); +# create a compressed table +CREATE TABLE tab2(col_1 CHAR (255) , +col_2 VARCHAR (255), col_3 longtext, +col_4 longtext,col_5 longtext, +col_6 longtext , col_7 int ) +engine = innodb row_format=compressed key_block_size=4; +CREATE INDEX idx1 ON tab2(col_3(10)); +CREATE INDEX idx2 ON tab2(col_4(10)); +CREATE INDEX idx3 ON tab2(col_5(10)); +SET @col_1 = repeat('a', 5); +SET @col_2 = repeat('b', 20); +SET @col_3 = repeat('c', 100); +SET @col_4 = repeat('d', 100); +SET @col_5 = repeat('e', 100); +SET @col_6 = repeat('f', 100); +INSERT INTO tab2(col_1,col_2,col_3,col_4,col_5,col_6,col_7) +VALUES (@col_1,@col_2,@col_3,@col_4,@cl_5,@col_6,5); +INSERT INTO tab2(col_1,col_2,col_3,col_4,col_5,col_6,col_7) +VALUES (@col_1,@col_2,@col_3,@col_4,@cl_5,@col_6,4); +INSERT INTO tab2(col_1,col_2,col_3,col_4,col_5,col_6,col_7) +VALUES (@col_1,@col_2,@col_3,@col_4,@cl_5,@col_6,3); +INSERT INTO tab2(col_1,col_2,col_3,col_4,col_5,col_6,col_7) +VALUES (@col_1,@col_2,@col_3,@col_4,@cl_5,@col_6,2); +INSERT INTO tab2(col_1,col_2,col_3,col_4,col_5,col_6,col_7) +VALUES (@col_1,@col_2,@col_3,@col_4,@cl_5,@col_6,1); +SELECT * FROM tab2 ORDER BY col_7; +# stop the server +[1(a)]: Rewrite into new checksum=InnoDB for all *.ibd file and ibdata1 +: start the server with innodb_checksum_algorithm=strict_innodb +INSERT INTO tab1 (pk, linestring_key, linestring_nokey) +VALUES (2, ST_GeomFromText('LINESTRING(10 10,20 20,30 30)'), ST_GeomFromText('LINESTRING(10 10,20 20,30 30)')); +SET @col_1 = repeat('a', 5); +SET @col_2 = repeat('b', 20); +SET @col_3 = repeat('c', 100); +SET @col_4 = repeat('d', 100); +SET @col_5 = repeat('e', 100); +SET @col_6 = repeat('f', 100); +INSERT INTO tab2(col_1,col_2,col_3,col_4,col_5,col_6,col_7) +VALUES (@col_1,@col_2,@col_3,@col_4,@cl_5,@col_6,6); +SELECT pk,ST_AsText(linestring_key),ST_AsText(linestring_nokey) +FROM tab1 ORDER BY pk; +SELECT * FROM tab2 ORDER BY col_7; +# stop the server +[1(b)]: Rewrite into new checksum=crc32 for all *.ibd file and ibdata1 +# start the server with innodb_checksum_algorithm=strict_crc32 +INSERT INTO tab1 (pk, linestring_key, linestring_nokey) +VALUES (3, ST_GeomFromText('POLYGON((0 0,5 5,10 10,15 15,0 0),(10 10,20 20,30 30,40 40,10 10))'), +ST_GeomFromText('POLYGON((0 0,5 5,10 10,15 15,0 0),(10 10,20 20,30 30,40 40,10 10))')); +SET @col_1 = repeat('g', 5); +SET @col_2 = repeat('h', 20); +SET @col_3 = repeat('i', 100); +SET @col_4 = repeat('j', 100); +SET @col_5 = repeat('k', 100); +SET @col_6 = repeat('l', 100); +INSERT INTO tab2(col_1,col_2,col_3,col_4,col_5,col_6,col_7) +VALUES (@col_1,@col_2,@col_3,@col_4,@cl_5,@col_6,7); +SELECT pk,ST_AsText(linestring_key),ST_AsText(linestring_nokey) +FROM tab1 ORDER BY pk; +SELECT * FROM tab2 ORDER BY col_7; +# stop the server +[1(c)]: Rewrite into new checksum=none for all *.ibd file and ibdata1 +INSERT INTO tab1 (pk, linestring_key, linestring_nokey) +VALUES (4, ST_GeomFromText('MULTIPOINT(0 0,5 5,10 10,20 20) '), ST_GeomFromText('MULTIPOINT(0 0,5 5,10 10,20 20) ')); +SET @col_1 = repeat('m', 5); +SET @col_2 = repeat('n', 20); +SET @col_3 = repeat('o', 100); +SET @col_4 = repeat('p', 100); +SET @col_5 = repeat('q', 100); +SET @col_6 = repeat('r', 100); +INSERT INTO tab2(col_1,col_2,col_3,col_4,col_5,col_6,col_7) +VALUES (@col_1,@col_2,@col_3,@col_4,@cl_5,@col_6,8); +SELECT pk,ST_AsText(linestring_key),ST_AsText(linestring_nokey) +FROM tab1 ORDER BY pk; +SELECT * FROM tab2 ORDER BY col_7; +# stop the server +[2]: Check the page type summary with shortform for tab1.ibd + +File::tab#.ibd +================PAGE TYPE SUMMARY============== +#PAGE_COUNT PAGE_TYPE +=============================================== + # Index page + # Undo log page + # Inode page + # Insert buffer free list page + # Freshly allocated page + # Insert buffer bitmap + # System page + # Transaction system page + # File Space Header + # Extent descriptor page + # BLOB page + # Compressed BLOB page + # Page compressed page + # Page compressed encrypted page + # Other type of page + +=============================================== +Additional information: +Undo page type: # insert, # update, # other +Undo page state: # active, # cached, # to_free, # to_purge, # prepared, # other +index_id #pages #leaf_pages #recs_per_page #bytes_per_page +# # # # # +# # # # # +# # # # # + +index_id page_data_bytes_histgram(empty,...,oversized) +# # # # # # # # # # # # # +# # # # # # # # # # # # # +# # # # # # # # # # # # # +[3]: Check the page type summary with longform for tab1.ibd + +File::tab#.ibd +================PAGE TYPE SUMMARY============== +#PAGE_COUNT PAGE_TYPE +=============================================== + # Index page + # Undo log page + # Inode page + # Insert buffer free list page + # Freshly allocated page + # Insert buffer bitmap + # System page + # Transaction system page + # File Space Header + # Extent descriptor page + # BLOB page + # Compressed BLOB page + # Page compressed page + # Page compressed encrypted page + # Other type of page + +=============================================== +Additional information: +Undo page type: # insert, # update, # other +Undo page state: # active, # cached, # to_free, # to_purge, # prepared, # other +index_id #pages #leaf_pages #recs_per_page #bytes_per_page +# # # # # +# # # # # +# # # # # + +index_id page_data_bytes_histgram(empty,...,oversized) +# # # # # # # # # # # # # +# # # # # # # # # # # # # +# # # # # # # # # # # # # +[4]: Page type dump for with longform for tab1.ibd +# Print the contents stored in dump.txt + + +Filename::tab#.ibd +============================================================================== + PAGE_NO | PAGE_TYPE | EXTRA INFO +============================================================================== +#::# | File Space Header | - +#::# | Insert Buffer Bitmap | - +#::# | Inode page | - +#::# | Index page | index id=#, page level=#, No. of records=#, garbage=#, - +#::# | Index page | index id=#, page level=#, No. of records=#, garbage=#, - +#::# | Index page | index id=#, page level=#, No. of records=#, garbage=#, - +#::# | Index page | index id=#, page level=#, No. of records=#, garbage=#, - +#::# | Freshly allocated page | - +# Variables used by page type dump for ibdata1 + +Variables (--variable-name=value) +and boolean options {FALSE|TRUE} Value (after reading options) +--------------------------------- ---------------------------------------- +verbose TRUE +count FALSE +start-page 0 +end-page 0 +page 0 +strict-check crc32 +no-check FALSE +allow-mismatches 0 +write crc32 +page-type-summary FALSE +page-type-dump MYSQLTEST_VARDIR/tmp/dump.txt +per-page-details FALSE +log (No default value) +leaf FALSE +merge 0 +[5]: Page type dump for with shortform for tab1.ibd + + +Filename::tab#.ibd +============================================================================== + PAGE_NO | PAGE_TYPE | EXTRA INFO +============================================================================== +#::# | File Space Header | - +#::# | Insert Buffer Bitmap | - +#::# | Inode page | - +#::# | Index page | index id=#, page level=#, No. of records=#, garbage=#, - +#::# | Index page | index id=#, page level=#, No. of records=#, garbage=#, - +#::# | Index page | index id=#, page level=#, No. of records=#, garbage=#, - +#::# | Index page | index id=#, page level=#, No. of records=#, garbage=#, - +#::# | Freshly allocated page | - +[6]: check the valid lower bound values for option +# allow-mismatches,page,start-page,end-page +[9]: check the both short and long options "page" and "start-page" when +# seek value is larger than file size. +FOUND 1 /Error: Unable to seek to necessary offset: Invalid argument/ in my_restart.err +FOUND 1 /Error: Unable to seek to necessary offset: Invalid argument/ in my_restart.err +FOUND 1 /Error: Unable to seek to necessary offset: Invalid argument/ in my_restart.err +FOUND 1 /Error: Unable to seek to necessary offset: Invalid argument/ in my_restart.err +[34]: check the invalid upper bound values for options, allow-mismatches, end-page, start-page and page. +# innochecksum will fail with error code: 1 +NOT FOUND /Incorrect unsigned integer value: '18446744073709551616'/ in my_restart.err +NOT FOUND /Incorrect unsigned integer value: '18446744073709551616'/ in my_restart.err +NOT FOUND /Incorrect unsigned integer value: '18446744073709551616'/ in my_restart.err +NOT FOUND /Incorrect unsigned integer value: '18446744073709551616'/ in my_restart.err +NOT FOUND /Incorrect unsigned integer value: '18446744073709551616'/ in my_restart.err +NOT FOUND /Incorrect unsigned integer value: '18446744073709551616'/ in my_restart.err +NOT FOUND /Incorrect unsigned integer value: '18446744073709551616'/ in my_restart.err +NOT FOUND /Incorrect unsigned integer value: '18446744073709551616'/ in my_restart.err +DROP TABLE tab1,tab2; diff --git a/mysql-test/suite/innodb/r/log_file.result b/mysql-test/suite/innodb/r/log_file.result index f0f8007cb09..b93bfc0d02b 100644 --- a/mysql-test/suite/innodb/r/log_file.result +++ b/mysql-test/suite/innodb/r/log_file.result @@ -340,7 +340,7 @@ WHERE engine='innodb' AND support IN ('YES', 'DEFAULT', 'ENABLED'); 1 1 -FOUND 1 /Resizing redo log from 1\*\d+ to 3\*\d+ pages; LSN=\d+/ in mysqld.1.err +FOUND 1 /Resizing redo log from 1\*\d+ to 3\*\d+ bytes; LSN=\d+/ in mysqld.1.err # Cleanup bak_ib_logfile0 bak_ib_logfile1 diff --git a/mysql-test/suite/innodb/r/log_file_name.result b/mysql-test/suite/innodb/r/log_file_name.result index df4c9f637be..f578455f251 100644 --- a/mysql-test/suite/innodb/r/log_file_name.result +++ b/mysql-test/suite/innodb/r/log_file_name.result @@ -1,4 +1,5 @@ SET GLOBAL innodb_file_per_table=ON; +FLUSH TABLES; CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB; CREATE TABLE t3(a INT PRIMARY KEY) ENGINE=InnoDB; BEGIN; diff --git a/mysql-test/suite/innodb/r/log_file_size.result b/mysql-test/suite/innodb/r/log_file_size.result index 9e0cb4dbbf7..b576061e74b 100644 --- a/mysql-test/suite/innodb/r/log_file_size.result +++ b/mysql-test/suite/innodb/r/log_file_size.result @@ -33,16 +33,16 @@ ERROR 42000: Unknown storage engine 'InnoDB' FOUND 1 /InnoDB: innodb_read_only prevents crash recovery/ in mysqld.1.err SELECT * FROM t1; ERROR 42000: Unknown storage engine 'InnoDB' -FOUND 2 /redo log from 3\*[0-9]+ to 2\*[0-9]+ pages/ in mysqld.1.err +FOUND 2 /redo log from 3\*[0-9]+ to 2\*[0-9]+ bytes/ in mysqld.1.err SELECT * FROM t1; ERROR 42000: Unknown storage engine 'InnoDB' -FOUND 3 /redo log from 3\*[0-9]+ to 2\*[0-9]+ pages/ in mysqld.1.err +FOUND 3 /redo log from 3\*[0-9]+ to 2\*[0-9]+ bytes/ in mysqld.1.err SELECT * FROM t1; ERROR 42000: Unknown storage engine 'InnoDB' FOUND 2 /InnoDB: innodb_read_only prevents crash recovery/ in mysqld.1.err SELECT * FROM t1; ERROR 42000: Unknown storage engine 'InnoDB' -FOUND 4 /redo log from 3\*[0-9]+ to 2\*[0-9]+ pages/ in mysqld.1.err +FOUND 4 /redo log from 3\*[0-9]+ to 2\*[0-9]+ bytes/ in mysqld.1.err SELECT * FROM t1; ERROR 42000: Unknown storage engine 'InnoDB' SELECT * FROM t1; @@ -56,7 +56,7 @@ ERROR 42000: Unknown storage engine 'InnoDB' FOUND 1 /InnoDB: Setting log file .*ib_logfile[0-9]+ size to/ in mysqld.1.err SELECT * FROM t1; ERROR 42000: Unknown storage engine 'InnoDB' -FOUND 1 /InnoDB: Log file .*ib_logfile0 size 7 is not a multiple of innodb_page_size/ in mysqld.1.err +FOUND 1 /InnoDB: Log file .*ib_logfile0 size 7 is not a multiple of 512 bytes/ in mysqld.1.err SELECT * FROM t1; ERROR 42000: Unknown storage engine 'InnoDB' FOUND 1 /InnoDB: Log file .*ib_logfile1 is of different size 1048576 bytes than other log files/ in mysqld.1.err diff --git a/mysql-test/suite/innodb/r/purge_thread_shutdown.result b/mysql-test/suite/innodb/r/purge_thread_shutdown.result new file mode 100644 index 00000000000..38cefbaf3e8 --- /dev/null +++ b/mysql-test/suite/innodb/r/purge_thread_shutdown.result @@ -0,0 +1,36 @@ +connect con1, localhost, root; +create table t1 (a int) engine=innodb; +insert t1 values (1),(2),(3),(4); +delete from t1 where a=1; +select user,state from information_schema.processlist order by 2; +user state +root +root Filling schema table +system user InnoDB purge coordinator +system user InnoDB purge worker +system user InnoDB purge worker +system user InnoDB purge worker +system user InnoDB shutdown handler +set global debug_dbug='+d,only_kill_system_threads'; +set global innodb_fast_shutdown=0; +shutdown; +connection default; +disconnect con1; +select user,state from information_schema.processlist order by 2; +user state +root Filling schema table +system user InnoDB purge coordinator +system user InnoDB purge worker +system user InnoDB purge worker +system user InnoDB purge worker +system user InnoDB slow shutdown wait +set global innodb_fast_shutdown=1; +select user,state from information_schema.processlist order by 2; +user state +root Filling schema table +delete from t1 where a=3; +set global innodb_fast_shutdown=0; +ERROR 42000: Variable 'innodb_fast_shutdown' can't be set to the value of '0' +kill ID; +ERROR 70100: Connection was killed +drop table t1; diff --git a/mysql-test/suite/innodb/r/read_only_recovery.result b/mysql-test/suite/innodb/r/read_only_recovery.result index 532749a7aae..97ec938fb2a 100644 --- a/mysql-test/suite/innodb/r/read_only_recovery.result +++ b/mysql-test/suite/innodb/r/read_only_recovery.result @@ -1,7 +1,8 @@ connect con1, localhost, root; CREATE TABLE t(a INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t VALUES(1); BEGIN; -INSERT INTO t VALUES(1),(2); +INSERT INTO t VALUES(2); DELETE FROM t WHERE a=2; connection default; # Normal MariaDB shutdown would roll back the above transaction. @@ -16,20 +17,23 @@ ROLLBACK; disconnect con1; SELECT * FROM t; a +1 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT * FROM t; a 1 +UPDATE t SET a=3 WHERE a=1; # Starting with MariaDB 10.2, innodb_read_only implies READ UNCOMMITTED. # In earlier versions, this would return the last committed version # (empty table)! SELECT * FROM t; a -1 +3 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT * FROM t; a -1 +3 SELECT * FROM t; a +3 DROP TABLE t; diff --git a/mysql-test/suite/innodb/r/rename_table.result b/mysql-test/suite/innodb/r/rename_table.result new file mode 100644 index 00000000000..3d7c3ff1b0e --- /dev/null +++ b/mysql-test/suite/innodb/r/rename_table.result @@ -0,0 +1,20 @@ +CREATE DATABASE test_jfg; +CREATE DATABASE test_jfg2; +CREATE TABLE test_jfg.test (a int unsigned PRIMARY KEY) ENGINE=InnoDB; +RENAME TABLE test_jfg.test TO test_jfg2.test; +SELECT REPLACE(path,'\\','/') path +FROM INFORMATION_SCHEMA.INNODB_SYS_DATAFILES WHERE PATH LIKE '%test%'; +path +./test_jfg2/test.ibd +DROP DATABASE test_jfg; +DROP DATABASE test_jfg2; +CREATE DATABASE abc_def; +CREATE DATABASE abc_def2; +CREATE TABLE abc_def.test (a int unsigned PRIMARY KEY) ENGINE=InnoDB; +RENAME TABLE abc_def.test TO abc_def2.test1; +SELECT REPLACE(path,'\\','/') path +FROM INFORMATION_SCHEMA.INNODB_SYS_DATAFILES WHERE PATH LIKE '%test%'; +path +./abc_def2/test1.ibd +DROP DATABASE abc_def; +DROP DATABASE abc_def2; diff --git a/mysql-test/suite/innodb/r/row_format_redundant.result b/mysql-test/suite/innodb/r/row_format_redundant.result new file mode 100644 index 00000000000..a2d5bbef8df --- /dev/null +++ b/mysql-test/suite/innodb/r/row_format_redundant.result @@ -0,0 +1,79 @@ +SET GLOBAL innodb_file_per_table=1; +# +# Bug#21644827 - FTS, ASSERT !SRV_READ_ONLY_MODE || M_IMPL.M_LOG_MODE == +# MTR_LOG_NO_REDO +# +SET GLOBAL innodb_file_per_table=ON; +create table t1 (a int not null, d varchar(15) not null, b +varchar(198) not null, c char(156), +fulltext ftsic(c)) engine=InnoDB +row_format=redundant; +insert into t1 values(123, 'abcdef', 'jghikl', 'mnop'); +insert into t1 values(456, 'abcdef', 'jghikl', 'mnop'); +insert into t1 values(789, 'abcdef', 'jghikl', 'mnop'); +insert into t1 values(134, 'kasdfsdsadf', 'adfjlasdkfjasd', 'adfsadflkasdasdfljasdf'); +insert into t1 select * from t1; +insert into t1 select * from t1; +insert into t1 select * from t1; +insert into t1 select * from t1; +insert into t1 select * from t1; +insert into t1 select * from t1; +insert into t1 select * from t1; +insert into t1 select * from t1; +insert into t1 select * from t1; +insert into t1 select * from t1; +SET GLOBAL innodb_file_per_table=OFF; +create table t2 (a int not null, d varchar(15) not null, b +varchar(198) not null, c char(156), fulltext ftsic(c)) engine=InnoDB +row_format=redundant; +insert into t2 select * from t1; +create table t3 (a int not null, d varchar(15) not null, b varchar(198), +c varchar(150), index k1(c(99), b(56)), index k2(b(5), c(10))) engine=InnoDB +row_format=redundant; +insert into t3 values(444, 'dddd', 'bbbbb', 'aaaaa'); +insert into t3 values(555, 'eeee', 'ccccc', 'aaaaa'); +SET GLOBAL innodb_fast_shutdown=0; +SELECT COUNT(*) FROM t1; +COUNT(*) +4096 +SELECT COUNT(*) FROM t2; +COUNT(*) +4096 +SELECT COUNT(*) FROM t3; +COUNT(*) +2 +TRUNCATE TABLE t1; +ERROR HY000: Table 't1' is read only +TRUNCATE TABLE t2; +ERROR HY000: Table 't2' is read only +TRUNCATE TABLE t3; +ERROR HY000: Table 't3' is read only +TRUNCATE TABLE t1; +TRUNCATE TABLE t2; +TRUNCATE TABLE t3; +corrupted SYS_TABLES.MIX_LEN for test/t1 +corrupted SYS_TABLES.MIX_LEN for test/t2 +corrupted SYS_TABLES.MIX_LEN for test/t3 +TRUNCATE TABLE t1; +ERROR 42S02: Table 'test.t1' doesn't exist in engine +TRUNCATE TABLE t2; +TRUNCATE TABLE t3; +SELECT COUNT(*) FROM t1; +ERROR 42S02: Table 'test.t1' doesn't exist in engine +SELECT COUNT(*) FROM t2; +COUNT(*) +0 +SELECT COUNT(*) FROM t3; +COUNT(*) +0 +RENAME TABLE t1 TO tee_one; +ERROR HY000: Error on rename of './test/t1' to './test/tee_one' (errno: 155 "The table does not exist in the storage engine") +DROP TABLE t1; +Warnings: +Warning 1932 Table 'test.t1' doesn't exist in engine +DROP TABLE t2,t3; +FOUND 49 /\[ERROR\] InnoDB: Table `test`\.`t1` in InnoDB data dictionary contains invalid flags\. SYS_TABLES\.TYPE=1 SYS_TABLES\.MIX_LEN=255\b/ in mysqld.1.err +ib_buffer_pool +ib_logfile0 +ib_logfile1 +ibdata1 diff --git a/mysql-test/suite/innodb/r/table_flags,32k.rdiff b/mysql-test/suite/innodb/r/table_flags,32k.rdiff new file mode 100644 index 00000000000..ea2d7048bb7 --- /dev/null +++ b/mysql-test/suite/innodb/r/table_flags,32k.rdiff @@ -0,0 +1,105 @@ +--- suite/innodb/r/table_flags.result ++++ suite/innodb/r/table_flags,32k.reject +@@ -5,6 +5,8 @@ + SET innodb_strict_mode=OFF; + CREATE TABLE tz(a INT PRIMARY KEY)ENGINE=InnoDB ROW_FORMAT=COMPRESSED + KEY_BLOCK_SIZE=1; ++Warnings: ++Warning 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > 16k. Assuming ROW_FORMAT=DYNAMIC. + SET innodb_strict_mode=ON; + CREATE TABLE tp(a INT PRIMARY KEY)ENGINE=InnoDB ROW_FORMAT=DYNAMIC + PAGE_COMPRESSED=1 PAGE_COMPRESSION_LEVEL=9; +@@ -13,7 +15,7 @@ + header=0x01000003016e (NAME=0x696e66696d756d00) + header=0x00002815008d (NAME='SYS_DATAFILES', + DB_TRX_ID=0x000000000302, +- DB_ROLL_PTR=0x81000001320194, ++ DB_ROLL_PTR=0x81000001310194, + ID=0x000000000000000e, + N_COLS=0x00000002, + TYPE=0x00000001, +@@ -23,7 +25,7 @@ + SPACE=0x00000000) + header=0x0000101500d5 (NAME='SYS_FOREIGN', + DB_TRX_ID=0x000000000300, +- DB_ROLL_PTR=0x800000012d0110, ++ DB_ROLL_PTR=0x800000012c0110, + ID=0x000000000000000b, + N_COLS=0x00000004, + TYPE=0x00000001, +@@ -33,7 +35,7 @@ + SPACE=0x00000000) + header=0x000018150122 (NAME='SYS_FOREIGN_COLS', + DB_TRX_ID=0x000000000300, +- DB_ROLL_PTR=0x800000012d0201, ++ DB_ROLL_PTR=0x800000012c0201, + ID=0x000000000000000c, + N_COLS=0x00000004, + TYPE=0x00000001, +@@ -43,7 +45,7 @@ + SPACE=0x00000000) + header=0x0400201501b8 (NAME='SYS_TABLESPACES', + DB_TRX_ID=0x000000000302, +- DB_ROLL_PTR=0x81000001320110, ++ DB_ROLL_PTR=0x81000001310110, + ID=0x000000000000000d, + N_COLS=0x00000003, + TYPE=0x00000001, +@@ -53,7 +55,7 @@ + SPACE=0x00000000) + header=0x000030150244 (NAME='SYS_VIRTUAL', + DB_TRX_ID=0x000000000304, +- DB_ROLL_PTR=0x82000001350110, ++ DB_ROLL_PTR=0x82000001340110, + ID=0x000000000000000f, + N_COLS=0x00000003, + TYPE=0x00000001, +@@ -63,7 +65,7 @@ + SPACE=0x00000000) + header=0x000040150288 (NAME='test/tc', + DB_TRX_ID=0x000000000308, +- DB_ROLL_PTR=0x84000001380110, ++ DB_ROLL_PTR=0x84000001370110, + ID=0x0000000000000011, + N_COLS=0x80000001, + TYPE=0x00000001, +@@ -73,7 +75,7 @@ + SPACE=0x00000002) + header=0x000048150310 (NAME='test/td', + DB_TRX_ID=0x00000000030a, +- DB_ROLL_PTR=0x85000001390110, ++ DB_ROLL_PTR=0x85000001380110, + ID=0x0000000000000012, + N_COLS=0x80000001, + TYPE=0x00000021, +@@ -83,7 +85,7 @@ + SPACE=0x00000003) + header=0x000058150200 (NAME='test/tp', + DB_TRX_ID=0x00000000030e, +- DB_ROLL_PTR=0x870000013b0110, ++ DB_ROLL_PTR=0x870000013a0110, + ID=0x0000000000000014, + N_COLS=0x80000001, + TYPE=0x000009a1, +@@ -93,7 +95,7 @@ + SPACE=0x00000005) + header=0x0000381502cc (NAME='test/tr', + DB_TRX_ID=0x000000000306, +- DB_ROLL_PTR=0x83000001370110, ++ DB_ROLL_PTR=0x83000001360110, + ID=0x0000000000000010, + N_COLS=0x00000001, + TYPE=0x00000001, +@@ -103,10 +105,10 @@ + SPACE=0x00000001) + header=0x000050150074 (NAME='test/tz', + DB_TRX_ID=0x00000000030c, +- DB_ROLL_PTR=0x860000013a0110, ++ DB_ROLL_PTR=0x86000001390110, + ID=0x0000000000000013, + N_COLS=0x80000001, +- TYPE=0x00000023, ++ TYPE=0x00000021, + MIX_ID=0x0000000000000000, + MIX_LEN=0x00000050, + CLUSTER_NAME=NULL(0 bytes), diff --git a/mysql-test/suite/innodb/r/table_flags,4k.rdiff b/mysql-test/suite/innodb/r/table_flags,4k.rdiff new file mode 100644 index 00000000000..0e469ee631b --- /dev/null +++ b/mysql-test/suite/innodb/r/table_flags,4k.rdiff @@ -0,0 +1,92 @@ +--- suite/innodb/r/table_flags.result ++++ suite/innodb/r/table_flags,4k.reject +@@ -13,7 +13,7 @@ + header=0x01000003016e (NAME=0x696e66696d756d00) + header=0x00002815008d (NAME='SYS_DATAFILES', + DB_TRX_ID=0x000000000302, +- DB_ROLL_PTR=0x81000001320194, ++ DB_ROLL_PTR=0x81000003260194, + ID=0x000000000000000e, + N_COLS=0x00000002, + TYPE=0x00000001, +@@ -23,7 +23,7 @@ + SPACE=0x00000000) + header=0x0000101500d5 (NAME='SYS_FOREIGN', + DB_TRX_ID=0x000000000300, +- DB_ROLL_PTR=0x800000012d0110, ++ DB_ROLL_PTR=0x80000003200110, + ID=0x000000000000000b, + N_COLS=0x00000004, + TYPE=0x00000001, +@@ -33,7 +33,7 @@ + SPACE=0x00000000) + header=0x000018150122 (NAME='SYS_FOREIGN_COLS', + DB_TRX_ID=0x000000000300, +- DB_ROLL_PTR=0x800000012d0201, ++ DB_ROLL_PTR=0x80000003200201, + ID=0x000000000000000c, + N_COLS=0x00000004, + TYPE=0x00000001, +@@ -43,7 +43,7 @@ + SPACE=0x00000000) + header=0x0400201501b8 (NAME='SYS_TABLESPACES', + DB_TRX_ID=0x000000000302, +- DB_ROLL_PTR=0x81000001320110, ++ DB_ROLL_PTR=0x81000003260110, + ID=0x000000000000000d, + N_COLS=0x00000003, + TYPE=0x00000001, +@@ -53,7 +53,7 @@ + SPACE=0x00000000) + header=0x000030150244 (NAME='SYS_VIRTUAL', + DB_TRX_ID=0x000000000304, +- DB_ROLL_PTR=0x82000001350110, ++ DB_ROLL_PTR=0x820000032a0110, + ID=0x000000000000000f, + N_COLS=0x00000003, + TYPE=0x00000001, +@@ -63,7 +63,7 @@ + SPACE=0x00000000) + header=0x000040150288 (NAME='test/tc', + DB_TRX_ID=0x000000000308, +- DB_ROLL_PTR=0x84000001380110, ++ DB_ROLL_PTR=0x840000032d0110, + ID=0x0000000000000011, + N_COLS=0x80000001, + TYPE=0x00000001, +@@ -73,7 +73,7 @@ + SPACE=0x00000002) + header=0x000048150310 (NAME='test/td', + DB_TRX_ID=0x00000000030a, +- DB_ROLL_PTR=0x85000001390110, ++ DB_ROLL_PTR=0x850000032f0110, + ID=0x0000000000000012, + N_COLS=0x80000001, + TYPE=0x00000021, +@@ -83,7 +83,7 @@ + SPACE=0x00000003) + header=0x000058150200 (NAME='test/tp', + DB_TRX_ID=0x00000000030e, +- DB_ROLL_PTR=0x870000013b0110, ++ DB_ROLL_PTR=0x87000003310110, + ID=0x0000000000000014, + N_COLS=0x80000001, + TYPE=0x000009a1, +@@ -93,7 +93,7 @@ + SPACE=0x00000005) + header=0x0000381502cc (NAME='test/tr', + DB_TRX_ID=0x000000000306, +- DB_ROLL_PTR=0x83000001370110, ++ DB_ROLL_PTR=0x830000032c0110, + ID=0x0000000000000010, + N_COLS=0x00000001, + TYPE=0x00000001, +@@ -103,7 +103,7 @@ + SPACE=0x00000001) + header=0x000050150074 (NAME='test/tz', + DB_TRX_ID=0x00000000030c, +- DB_ROLL_PTR=0x860000013a0110, ++ DB_ROLL_PTR=0x86000003300110, + ID=0x0000000000000013, + N_COLS=0x80000001, + TYPE=0x00000023, diff --git a/mysql-test/suite/innodb/r/table_flags,64k.rdiff b/mysql-test/suite/innodb/r/table_flags,64k.rdiff new file mode 100644 index 00000000000..ce2d7faa925 --- /dev/null +++ b/mysql-test/suite/innodb/r/table_flags,64k.rdiff @@ -0,0 +1,105 @@ +--- suite/innodb/r/table_flags.result ++++ suite/innodb/r/table_flags,64k.reject +@@ -5,6 +5,8 @@ + SET innodb_strict_mode=OFF; + CREATE TABLE tz(a INT PRIMARY KEY)ENGINE=InnoDB ROW_FORMAT=COMPRESSED + KEY_BLOCK_SIZE=1; ++Warnings: ++Warning 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > 16k. Assuming ROW_FORMAT=DYNAMIC. + SET innodb_strict_mode=ON; + CREATE TABLE tp(a INT PRIMARY KEY)ENGINE=InnoDB ROW_FORMAT=DYNAMIC + PAGE_COMPRESSED=1 PAGE_COMPRESSION_LEVEL=9; +@@ -13,7 +15,7 @@ + header=0x01000003016e (NAME=0x696e66696d756d00) + header=0x00002815008d (NAME='SYS_DATAFILES', + DB_TRX_ID=0x000000000302, +- DB_ROLL_PTR=0x81000001320194, ++ DB_ROLL_PTR=0x81000001310194, + ID=0x000000000000000e, + N_COLS=0x00000002, + TYPE=0x00000001, +@@ -23,7 +25,7 @@ + SPACE=0x00000000) + header=0x0000101500d5 (NAME='SYS_FOREIGN', + DB_TRX_ID=0x000000000300, +- DB_ROLL_PTR=0x800000012d0110, ++ DB_ROLL_PTR=0x800000012c0110, + ID=0x000000000000000b, + N_COLS=0x00000004, + TYPE=0x00000001, +@@ -33,7 +35,7 @@ + SPACE=0x00000000) + header=0x000018150122 (NAME='SYS_FOREIGN_COLS', + DB_TRX_ID=0x000000000300, +- DB_ROLL_PTR=0x800000012d0201, ++ DB_ROLL_PTR=0x800000012c0201, + ID=0x000000000000000c, + N_COLS=0x00000004, + TYPE=0x00000001, +@@ -43,7 +45,7 @@ + SPACE=0x00000000) + header=0x0400201501b8 (NAME='SYS_TABLESPACES', + DB_TRX_ID=0x000000000302, +- DB_ROLL_PTR=0x81000001320110, ++ DB_ROLL_PTR=0x81000001310110, + ID=0x000000000000000d, + N_COLS=0x00000003, + TYPE=0x00000001, +@@ -53,7 +55,7 @@ + SPACE=0x00000000) + header=0x000030150244 (NAME='SYS_VIRTUAL', + DB_TRX_ID=0x000000000304, +- DB_ROLL_PTR=0x82000001350110, ++ DB_ROLL_PTR=0x82000001340110, + ID=0x000000000000000f, + N_COLS=0x00000003, + TYPE=0x00000001, +@@ -63,7 +65,7 @@ + SPACE=0x00000000) + header=0x000040150288 (NAME='test/tc', + DB_TRX_ID=0x000000000308, +- DB_ROLL_PTR=0x84000001380110, ++ DB_ROLL_PTR=0x84000001370110, + ID=0x0000000000000011, + N_COLS=0x80000001, + TYPE=0x00000001, +@@ -73,7 +75,7 @@ + SPACE=0x00000002) + header=0x000048150310 (NAME='test/td', + DB_TRX_ID=0x00000000030a, +- DB_ROLL_PTR=0x85000001390110, ++ DB_ROLL_PTR=0x85000001380110, + ID=0x0000000000000012, + N_COLS=0x80000001, + TYPE=0x00000021, +@@ -83,7 +85,7 @@ + SPACE=0x00000003) + header=0x000058150200 (NAME='test/tp', + DB_TRX_ID=0x00000000030e, +- DB_ROLL_PTR=0x870000013b0110, ++ DB_ROLL_PTR=0x870000013a0110, + ID=0x0000000000000014, + N_COLS=0x80000001, + TYPE=0x000009a1, +@@ -93,7 +95,7 @@ + SPACE=0x00000005) + header=0x0000381502cc (NAME='test/tr', + DB_TRX_ID=0x000000000306, +- DB_ROLL_PTR=0x83000001370110, ++ DB_ROLL_PTR=0x83000001360110, + ID=0x0000000000000010, + N_COLS=0x00000001, + TYPE=0x00000001, +@@ -103,10 +105,10 @@ + SPACE=0x00000001) + header=0x000050150074 (NAME='test/tz', + DB_TRX_ID=0x00000000030c, +- DB_ROLL_PTR=0x860000013a0110, ++ DB_ROLL_PTR=0x86000001390110, + ID=0x0000000000000013, + N_COLS=0x80000001, +- TYPE=0x00000023, ++ TYPE=0x00000021, + MIX_ID=0x0000000000000000, + MIX_LEN=0x00000050, + CLUSTER_NAME=NULL(0 bytes), diff --git a/mysql-test/suite/innodb/r/table_flags,8k.rdiff b/mysql-test/suite/innodb/r/table_flags,8k.rdiff new file mode 100644 index 00000000000..d5b5731b305 --- /dev/null +++ b/mysql-test/suite/innodb/r/table_flags,8k.rdiff @@ -0,0 +1,92 @@ +--- suite/innodb/r/table_flags.result ++++ suite/innodb/r/table_flags,8k.reject +@@ -13,7 +13,7 @@ + header=0x01000003016e (NAME=0x696e66696d756d00) + header=0x00002815008d (NAME='SYS_DATAFILES', + DB_TRX_ID=0x000000000302, +- DB_ROLL_PTR=0x81000001320194, ++ DB_ROLL_PTR=0x81000001d70194, + ID=0x000000000000000e, + N_COLS=0x00000002, + TYPE=0x00000001, +@@ -23,7 +23,7 @@ + SPACE=0x00000000) + header=0x0000101500d5 (NAME='SYS_FOREIGN', + DB_TRX_ID=0x000000000300, +- DB_ROLL_PTR=0x800000012d0110, ++ DB_ROLL_PTR=0x80000001d10110, + ID=0x000000000000000b, + N_COLS=0x00000004, + TYPE=0x00000001, +@@ -33,7 +33,7 @@ + SPACE=0x00000000) + header=0x000018150122 (NAME='SYS_FOREIGN_COLS', + DB_TRX_ID=0x000000000300, +- DB_ROLL_PTR=0x800000012d0201, ++ DB_ROLL_PTR=0x80000001d10201, + ID=0x000000000000000c, + N_COLS=0x00000004, + TYPE=0x00000001, +@@ -43,7 +43,7 @@ + SPACE=0x00000000) + header=0x0400201501b8 (NAME='SYS_TABLESPACES', + DB_TRX_ID=0x000000000302, +- DB_ROLL_PTR=0x81000001320110, ++ DB_ROLL_PTR=0x81000001d70110, + ID=0x000000000000000d, + N_COLS=0x00000003, + TYPE=0x00000001, +@@ -53,7 +53,7 @@ + SPACE=0x00000000) + header=0x000030150244 (NAME='SYS_VIRTUAL', + DB_TRX_ID=0x000000000304, +- DB_ROLL_PTR=0x82000001350110, ++ DB_ROLL_PTR=0x82000001da0110, + ID=0x000000000000000f, + N_COLS=0x00000003, + TYPE=0x00000001, +@@ -63,7 +63,7 @@ + SPACE=0x00000000) + header=0x000040150288 (NAME='test/tc', + DB_TRX_ID=0x000000000308, +- DB_ROLL_PTR=0x84000001380110, ++ DB_ROLL_PTR=0x84000001dd0110, + ID=0x0000000000000011, + N_COLS=0x80000001, + TYPE=0x00000001, +@@ -73,7 +73,7 @@ + SPACE=0x00000002) + header=0x000048150310 (NAME='test/td', + DB_TRX_ID=0x00000000030a, +- DB_ROLL_PTR=0x85000001390110, ++ DB_ROLL_PTR=0x85000001de0110, + ID=0x0000000000000012, + N_COLS=0x80000001, + TYPE=0x00000021, +@@ -83,7 +83,7 @@ + SPACE=0x00000003) + header=0x000058150200 (NAME='test/tp', + DB_TRX_ID=0x00000000030e, +- DB_ROLL_PTR=0x870000013b0110, ++ DB_ROLL_PTR=0x87000001e00110, + ID=0x0000000000000014, + N_COLS=0x80000001, + TYPE=0x000009a1, +@@ -93,7 +93,7 @@ + SPACE=0x00000005) + header=0x0000381502cc (NAME='test/tr', + DB_TRX_ID=0x000000000306, +- DB_ROLL_PTR=0x83000001370110, ++ DB_ROLL_PTR=0x83000001dc0110, + ID=0x0000000000000010, + N_COLS=0x00000001, + TYPE=0x00000001, +@@ -103,7 +103,7 @@ + SPACE=0x00000001) + header=0x000050150074 (NAME='test/tz', + DB_TRX_ID=0x00000000030c, +- DB_ROLL_PTR=0x860000013a0110, ++ DB_ROLL_PTR=0x86000001df0110, + ID=0x0000000000000013, + N_COLS=0x80000001, + TYPE=0x00000023, diff --git a/mysql-test/suite/innodb/r/table_flags.result b/mysql-test/suite/innodb/r/table_flags.result new file mode 100644 index 00000000000..435fe8fc45e --- /dev/null +++ b/mysql-test/suite/innodb/r/table_flags.result @@ -0,0 +1,180 @@ +SET GLOBAL innodb_file_per_table=1; +CREATE TABLE tr(a INT PRIMARY KEY)ENGINE=InnoDB ROW_FORMAT=REDUNDANT; +CREATE TABLE tc(a INT PRIMARY KEY)ENGINE=InnoDB ROW_FORMAT=COMPACT; +CREATE TABLE td(a INT PRIMARY KEY)ENGINE=InnoDB ROW_FORMAT=DYNAMIC; +SET innodb_strict_mode=OFF; +CREATE TABLE tz(a INT PRIMARY KEY)ENGINE=InnoDB ROW_FORMAT=COMPRESSED +KEY_BLOCK_SIZE=1; +SET innodb_strict_mode=ON; +CREATE TABLE tp(a INT PRIMARY KEY)ENGINE=InnoDB ROW_FORMAT=DYNAMIC +PAGE_COMPRESSED=1 PAGE_COMPRESSION_LEVEL=9; +SYS_TABLES clustered index root page (8): +N_RECS=10; LEVEL=0; INDEX_ID=0x0000000000000001 +header=0x01000003016e (NAME=0x696e66696d756d00) +header=0x00002815008d (NAME='SYS_DATAFILES', + DB_TRX_ID=0x000000000302, + DB_ROLL_PTR=0x81000001320194, + ID=0x000000000000000e, + N_COLS=0x00000002, + TYPE=0x00000001, + MIX_ID=0x0000000000000000, + MIX_LEN=0x00000040, + CLUSTER_NAME=NULL(0 bytes), + SPACE=0x00000000) +header=0x0000101500d5 (NAME='SYS_FOREIGN', + DB_TRX_ID=0x000000000300, + DB_ROLL_PTR=0x800000012d0110, + ID=0x000000000000000b, + N_COLS=0x00000004, + TYPE=0x00000001, + MIX_ID=0x0000000000000000, + MIX_LEN=0x00000040, + CLUSTER_NAME=NULL(0 bytes), + SPACE=0x00000000) +header=0x000018150122 (NAME='SYS_FOREIGN_COLS', + DB_TRX_ID=0x000000000300, + DB_ROLL_PTR=0x800000012d0201, + ID=0x000000000000000c, + N_COLS=0x00000004, + TYPE=0x00000001, + MIX_ID=0x0000000000000000, + MIX_LEN=0x00000040, + CLUSTER_NAME=NULL(0 bytes), + SPACE=0x00000000) +header=0x0400201501b8 (NAME='SYS_TABLESPACES', + DB_TRX_ID=0x000000000302, + DB_ROLL_PTR=0x81000001320110, + ID=0x000000000000000d, + N_COLS=0x00000003, + TYPE=0x00000001, + MIX_ID=0x0000000000000000, + MIX_LEN=0x00000040, + CLUSTER_NAME=NULL(0 bytes), + SPACE=0x00000000) +header=0x000030150244 (NAME='SYS_VIRTUAL', + DB_TRX_ID=0x000000000304, + DB_ROLL_PTR=0x82000001350110, + ID=0x000000000000000f, + N_COLS=0x00000003, + TYPE=0x00000001, + MIX_ID=0x0000000000000000, + MIX_LEN=0x00000040, + CLUSTER_NAME=NULL(0 bytes), + SPACE=0x00000000) +header=0x000040150288 (NAME='test/tc', + DB_TRX_ID=0x000000000308, + DB_ROLL_PTR=0x84000001380110, + ID=0x0000000000000011, + N_COLS=0x80000001, + TYPE=0x00000001, + MIX_ID=0x0000000000000000, + MIX_LEN=0x00000050, + CLUSTER_NAME=NULL(0 bytes), + SPACE=0x00000002) +header=0x000048150310 (NAME='test/td', + DB_TRX_ID=0x00000000030a, + DB_ROLL_PTR=0x85000001390110, + ID=0x0000000000000012, + N_COLS=0x80000001, + TYPE=0x00000021, + MIX_ID=0x0000000000000000, + MIX_LEN=0x00000050, + CLUSTER_NAME=NULL(0 bytes), + SPACE=0x00000003) +header=0x000058150200 (NAME='test/tp', + DB_TRX_ID=0x00000000030e, + DB_ROLL_PTR=0x870000013b0110, + ID=0x0000000000000014, + N_COLS=0x80000001, + TYPE=0x000009a1, + MIX_ID=0x0000000000000000, + MIX_LEN=0x00000050, + CLUSTER_NAME=NULL(0 bytes), + SPACE=0x00000005) +header=0x0000381502cc (NAME='test/tr', + DB_TRX_ID=0x000000000306, + DB_ROLL_PTR=0x83000001370110, + ID=0x0000000000000010, + N_COLS=0x00000001, + TYPE=0x00000001, + MIX_ID=0x0000000000000000, + MIX_LEN=0x00000050, + CLUSTER_NAME=NULL(0 bytes), + SPACE=0x00000001) +header=0x000050150074 (NAME='test/tz', + DB_TRX_ID=0x00000000030c, + DB_ROLL_PTR=0x860000013a0110, + ID=0x0000000000000013, + N_COLS=0x80000001, + TYPE=0x00000023, + MIX_ID=0x0000000000000000, + MIX_LEN=0x00000050, + CLUSTER_NAME=NULL(0 bytes), + SPACE=0x00000004) +header=0x070008030000 (NAME=0x73757072656d756d00) +SHOW CREATE TABLE tr; +ERROR 42S02: Table 'test.tr' doesn't exist in engine +SHOW CREATE TABLE tc; +ERROR 42S02: Table 'test.tc' doesn't exist in engine +SHOW CREATE TABLE td; +ERROR 42S02: Table 'test.td' doesn't exist in engine +SHOW CREATE TABLE tz; +ERROR 42S02: Table 'test.tz' doesn't exist in engine +SHOW CREATE TABLE tp; +ERROR 42S02: Table 'test.tp' doesn't exist in engine +FOUND 6 /InnoDB: Table `test`.`t[czp]` in InnoDB data dictionary contains invalid flags\. SYS_TABLES\.TYPE=(129|289|3873|1232[13]) SYS_TABLES\.N_COLS=2147483649/ in mysqld.1.err +FOUND 2 /InnoDB: Refusing to load '\..test.td\.ibd' \(id=3, flags=0x1?[2ae]1\); dictionary contains id=3, flags=0x10[01][2ae]1\b/ in mysqld.1.err +FOUND 2 /InnoDB: Table `test`\.`tr` in InnoDB data dictionary contains invalid flags\. SYS_TABLES\.TYPE=65 SYS_TABLES\.MIX_LEN=4294967295\b/ in mysqld.1.err +Restoring SYS_TABLES clustered index root page (8) +SHOW CREATE TABLE tr; +Table Create Table +tr CREATE TABLE `tr` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=REDUNDANT +SHOW CREATE TABLE tc; +Table Create Table +tc CREATE TABLE `tc` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT +SHOW CREATE TABLE td; +Table Create Table +td CREATE TABLE `td` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC +SHOW CREATE TABLE tz; +Table Create Table +tz CREATE TABLE `tz` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1 +SHOW CREATE TABLE tp; +Table Create Table +tp CREATE TABLE `tp` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC `PAGE_COMPRESSED`=1 `PAGE_COMPRESSION_LEVEL`=9 +BEGIN; +INSERT INTO tr VALUES(1); +INSERT INTO tc VALUES(1); +INSERT INTO td VALUES(1); +INSERT INTO tz VALUES(1); +INSERT INTO tp VALUES(1); +ROLLBACK; +SELECT * FROM tr; +a +SELECT * FROM tc; +a +SELECT * FROM td; +a +SELECT * FROM tz; +a +SELECT * FROM tp; +a +DROP TABLE tr,tc,td,tz,tp; +ib_logfile0 +ib_logfile1 +ibdata1 +sys_tables.bin diff --git a/mysql-test/suite/innodb/r/temporary_table.result b/mysql-test/suite/innodb/r/temporary_table.result index 72c5250934b..310741b5798 100644 --- a/mysql-test/suite/innodb/r/temporary_table.result +++ b/mysql-test/suite/innodb/r/temporary_table.result @@ -130,7 +130,6 @@ ERROR HY000: The table 't1' is full drop procedure populate_t1; # test read-only mode # files in MYSQL_DATA_DIR -ibtmp1 select * from t1; ERROR 42S02: Table 'test.t1' doesn't exist show tables; @@ -138,6 +137,7 @@ Tables_in_test create temporary table t1 (keyc int, c1 char(100), c2 char(100)) engine = innodb; ERROR HY000: Can't create table `test`.`t1` (errno: 165 "Table is read only") # test various bad start-up parameters +FOUND 2 /InnoDB: Unable to create temporary file/ in mysqld.1.err FOUND 1 /innodb_temporary and innodb_system file names seem to be the same/ in mysqld.1.err SELECT * FROM INFORMATION_SCHEMA.ENGINES WHERE engine = 'innodb' AND support IN ('YES', 'DEFAULT', 'ENABLED'); @@ -150,10 +150,6 @@ FOUND 2 /support raw device/ in mysqld.1.err SELECT * FROM INFORMATION_SCHEMA.ENGINES WHERE engine = 'innodb' AND support IN ('YES', 'DEFAULT', 'ENABLED'); ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS -FOUND 1 /The innodb_temporary data file 'ibtmp1' must be at least/ in mysqld.1.err -SELECT * FROM INFORMATION_SCHEMA.ENGINES WHERE engine = 'innodb' -AND support IN ('YES', 'DEFAULT', 'ENABLED'); -ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS FOUND 1 /InnoDB: syntax error in file path/ in mysqld.1.err SELECT * FROM INFORMATION_SCHEMA.ENGINES WHERE engine = 'innodb' AND support IN ('YES', 'DEFAULT', 'ENABLED'); diff --git a/mysql-test/suite/innodb/r/truncate_debug.result b/mysql-test/suite/innodb/r/truncate_debug.result index 47316fed2f7..eb4e9cfbc85 100644 --- a/mysql-test/suite/innodb/r/truncate_debug.result +++ b/mysql-test/suite/innodb/r/truncate_debug.result @@ -75,12 +75,12 @@ connect con2,localhost,root,,; set global innodb_adaptive_hash_index=off; connection default; SET DEBUG_SYNC= 'now SIGNAL finish_scan'; -SET DEBUG_SYNC= 'RESET'; connection con1; disconnect con1; connection con2; disconnect con2; connection default; +SET DEBUG_SYNC= 'RESET'; SET session lock_wait_timeout=default; set global innodb_adaptive_hash_index=on; drop table t1,t2,t3; diff --git a/mysql-test/suite/innodb/r/truncate_purge_debug.result b/mysql-test/suite/innodb/r/truncate_purge_debug.result index edece3019bc..164987083d5 100644 --- a/mysql-test/suite/innodb/r/truncate_purge_debug.result +++ b/mysql-test/suite/innodb/r/truncate_purge_debug.result @@ -22,8 +22,8 @@ connection default; InnoDB 0 transactions not purged SET GLOBAL innodb_purge_rseg_truncate_frequency = @saved_frequency; SET DEBUG_SYNC = 'now SIGNAL finish_scan'; -SET DEBUG_SYNC = 'RESET'; connection con1; disconnect con1; connection default; +SET DEBUG_SYNC = 'RESET'; drop table t1; diff --git a/mysql-test/suite/innodb/t/101_compatibility.test b/mysql-test/suite/innodb/t/101_compatibility.test index 83ab7914a69..eb3d3b0c014 100644 --- a/mysql-test/suite/innodb/t/101_compatibility.test +++ b/mysql-test/suite/innodb/t/101_compatibility.test @@ -1,4 +1,4 @@ ---source include/have_innodb.inc +--source include/innodb_page_size.inc --source include/not_embedded.inc -- echo # @@ -29,7 +29,7 @@ SET INNODB_STRICT_MODE=ON; --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR EVAL CREATE TABLE tdd(a INT) ENGINE=InnoDB, DATA DIRECTORY='$MYSQL_TMP_DIR'; -CREATE TABLE tp(a INT) ENGINE=InnoDB page_compressed=1; +CREATE TABLE tp(a INT) ENGINE=InnoDB ROW_FORMAT=DYNAMIC PAGE_COMPRESSED=1; CREATE TABLE ti(a INT) ENGINE=InnoDB; FLUSH TABLES ti FOR EXPORT; perl; diff --git a/mysql-test/suite/innodb/t/alter_crash.opt b/mysql-test/suite/innodb/t/alter_crash.opt new file mode 100644 index 00000000000..39b93371503 --- /dev/null +++ b/mysql-test/suite/innodb/t/alter_crash.opt @@ -0,0 +1 @@ +--loose-innodb-sys-tables diff --git a/mysql-test/suite/innodb/t/alter_crash.test b/mysql-test/suite/innodb/t/alter_crash.test new file mode 100644 index 00000000000..54cc51aecf4 --- /dev/null +++ b/mysql-test/suite/innodb/t/alter_crash.test @@ -0,0 +1,228 @@ +# Crash-safe InnoDB ALTER operations + +--source include/not_valgrind.inc +--source include/not_embedded.inc +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/not_crashrep.inc + +--disable_query_log +call mtr.add_suppression('InnoDB: cannot find a free slot for an undo log'); +call mtr.add_suppression('InnoDB: row_merge_rename_index_to_add failed with error 47'); +call mtr.add_suppression('InnoDB: Flagged corruption of `c[23]`'); +call mtr.add_suppression('InnoDB: Index `c[23]` .*is corrupted'); +--enable_query_log + +--echo # +--echo # Bug#20015132 ALTER TABLE FAILS TO CHECK IF TABLE IS CORRUPTED +--echo # + +CREATE TABLE t1(c1 INT PRIMARY KEY, c2 CHAR(1), c3 INT UNSIGNED) ENGINE=InnoDB; +SET @saved_debug_dbug = @@SESSION.debug_dbug; +SET DEBUG_DBUG='+d,ib_create_table_fail_too_many_trx'; +--error ER_TOO_MANY_CONCURRENT_TRXS +ALTER TABLE t1 ADD INDEX (c2), ADD INDEX (c3); + +SET DEBUG_DBUG=@saved_debug_dbug; +ALTER TABLE t1 ADD INDEX (c2), ADD INDEX (c3); +# Flag the secondary indexes corrupted. +SET DEBUG_DBUG='+d,dict_set_index_corrupted'; +CHECK TABLE t1; + +# Ensure that the corruption is permanent. +--source include/restart_mysqld.inc +CHECK TABLE t1; +ALTER TABLE t1 DROP INDEX c2; +CHECK TABLE t1; +# We refuse an ALTER TABLE that would modify the InnoDB data dictionary +# while leaving some of the table corrupted. +--error ER_INDEX_CORRUPT +ALTER TABLE t1 ADD INDEX (c2,c3); +# This will rebuild the table, uncorrupting all secondary indexes. +ALTER TABLE t1 CHANGE c3 c3 INT NOT NULL; +CHECK TABLE t1; +ALTER TABLE t1 ADD INDEX (c2,c3); +DROP TABLE t1; + +let $MYSQLD_DATADIR= `select @@datadir`; +let datadir= `select @@datadir`; + +# These are from include/shutdown_mysqld.inc and allow to call start_mysqld.inc +--let $_server_id= `SELECT @@server_id` +--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.$_server_id.expect + +--echo # +--echo # Bug #14669848 CRASH DURING ALTER MAKES ORIGINAL TABLE INACCESSIBLE +--echo # +--echo # -- Scenario 1: +--echo # Crash the server in ha_innobase::commit_inplace_alter_table() +--echo # just after committing the dictionary changes. + +CREATE TABLE t1 (f1 INT NOT NULL, f2 INT NOT NULL) ENGINE=innodb; +INSERT INTO t1 VALUES (1,2),(3,4); +SET DEBUG_DBUG='+d,innodb_alter_commit_crash_after_commit'; + +let $orig_table_id = `SELECT table_id + FROM information_schema.innodb_sys_tables + WHERE name = 'test/t1'`; + +# Write file to make mysql-test-run.pl expect crash +--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect + +--error 2013 +ALTER TABLE t1 ADD PRIMARY KEY (f2, f1); + +--echo # Restart mysqld after the crash and reconnect. +--source include/start_mysqld.inc + +let $temp_table_name = `SELECT SUBSTR(name, 6) + FROM information_schema.innodb_sys_tables + WHERE table_id = $orig_table_id`; + +--echo # Manual *.frm recovery begin. + +--move_file $MYSQLD_DATADIR/test/t1.frm $MYSQLD_DATADIR/test/$temp_table_name.frm + +perl; +my @frm_file = glob "$ENV{'datadir'}/test/#sql-*.frm"; +my $t1_frm = "$ENV{'datadir'}/test/t1.frm"; +rename($frm_file[0], $t1_frm); +EOF + +--echo # Manual recovery end + +FLUSH TABLES; + +--echo # Drop the orphaned original table. +--disable_query_log +eval DROP TABLE `#mysql50#$temp_table_name`; +--enable_query_log + +--echo # Files in datadir after manual recovery. +--list_files $MYSQLD_DATADIR/test + +SHOW TABLES; +SHOW CREATE TABLE t1; +INSERT INTO t1 VALUES (5,6),(7,8); +SELECT * FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (f1 INT NOT NULL, f2 INT NOT NULL) ENGINE=InnoDB; +ALTER TABLE t1 ADD PRIMARY KEY (f2, f1); +DROP TABLE t1; + +--echo # -- Scenario 2: +--echo # Crash the server in ha_innobase::commit_inplace_alter_table() +--echo # just before committing the dictionary changes, but after +--echo # writing the MLOG_FILE_RENAME records. As the mini-transaction +--echo # is not committed, the renames will not be replayed. + +CREATE TABLE t2 (f1 int not null, f2 int not null) ENGINE=InnoDB; +INSERT INTO t2 VALUES (1,2),(3,4); +SET DEBUG_DBUG='+d,innodb_alter_commit_crash_before_commit'; + +let $orig_table_id = `SELECT table_id + FROM information_schema.innodb_sys_tables + WHERE name = 'test/t2'`; + +# Write file to make mysql-test-run.pl expect crash +--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect + +--error 2013 +ALTER TABLE t2 ADD PRIMARY KEY (f2, f1); + +--echo # Startup the server after the crash +--source include/start_mysqld.inc + +--echo # Read and remember the temporary table name +let $temp_table_name = `SELECT SUBSTRING(name,6) + FROM information_schema.innodb_sys_tables + WHERE name LIKE "test/#sql-ib$orig_table_id%"`; +# This second copy is an environment variable for the perl script below. +let temp_table_name = $temp_table_name; + +--echo # Manual *.frm recovery begin. The dictionary was not updated +--echo # and the files were not renamed. The rebuilt table +--echo # was left behind on purpose, to faciliate data recovery. + +perl; +my @frm_file = glob "$ENV{'datadir'}/test/#sql-*.frm"; +my $target_frm = "$ENV{'datadir'}/test/$ENV{'temp_table_name'}.frm"; +rename($frm_file[0], $target_frm); +EOF + +--echo # Manual recovery end + +--echo # Drop the orphaned rebuilt table. +--disable_query_log +eval DROP TABLE `#mysql50#$temp_table_name`; +--enable_query_log + +SHOW TABLES; +INSERT INTO t2 VALUES (5,6),(7,8); +SELECT * from t2; +SHOW CREATE TABLE t2; +DROP TABLE t2; + +CREATE TABLE t2 (f1 INT NOT NULL, f2 INT NOT NULL) ENGINE=InnoDB; +ALTER TABLE t2 ADD PRIMARY KEY (f2, f1); +DROP TABLE t2; +--list_files $MYSQLD_DATADIR/test + +--echo # ------------------------- +--echo # End of Testing Scenario 2 +--echo # ------------------------- + +--echo # +--echo # Bug#19330255 WL#7142 - CRASH DURING ALTER TABLE LEADS TO +--echo # DATA DICTIONARY INCONSISTENCY +--echo # + +CREATE TABLE t1(a int PRIMARY KEY, b varchar(255), c int NOT NULL) +ENGINE=InnoDB; +INSERT INTO t1 SET a=1,c=2; +SET DEBUG_DBUG='+d,innodb_alter_commit_crash_after_commit'; + +let $orig_table_id = `select table_id from + information_schema.innodb_sys_tables where name = 'test/t1'`; + +# FIXME: MDEV-9469 'Incorrect key file' on ALTER TABLE +# Write file to make mysql-test-run.pl expect crash +--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +# +--error 2013 +ALTER TABLE t1 ADD INDEX (b), CHANGE c d int, ALGORITHM=INPLACE; + +--echo # Restart mysqld after the crash and reconnect. +--source include/start_mysqld.inc + +let $temp_table_name = `SELECT SUBSTR(name, 6) + FROM information_schema.innodb_sys_tables + WHERE table_id = $orig_table_id`; + +--echo # Manual *.frm recovery begin. +--move_file $MYSQLD_DATADIR/test/t1.frm $MYSQLD_DATADIR/test/$temp_table_name.frm + +perl; +my @frm_file = glob "$ENV{'datadir'}/test/#sql-*.frm"; +my $t1_frm = "$ENV{'datadir'}/test/t1.frm"; +rename($frm_file[0], $t1_frm); +EOF + +--echo # Manual recovery end + +FLUSH TABLES; + +--echo # Drop the orphaned original table. +--disable_query_log +eval DROP TABLE `#mysql50#$temp_table_name`; +--enable_query_log + +--echo # Files in datadir after manual recovery. +--list_files $MYSQLD_DATADIR/test + +SHOW TABLES; +SHOW CREATE TABLE t1; +UPDATE t1 SET d=NULL; +SELECT * FROM t1; +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/alter_missing_tablespace.test b/mysql-test/suite/innodb/t/alter_missing_tablespace.test index 643b7a4833d..d877b8f3b5d 100644 --- a/mysql-test/suite/innodb/t/alter_missing_tablespace.test +++ b/mysql-test/suite/innodb/t/alter_missing_tablespace.test @@ -1,5 +1,5 @@ --source include/not_embedded.inc ---source include/have_innodb.inc +--source include/innodb_page_size.inc --echo # --echo # Bug#13955083 ALLOW IN-PLACE DDL OPERATIONS ON MISSING diff --git a/mysql-test/suite/innodb/t/alter_rename_existing.test b/mysql-test/suite/innodb/t/alter_rename_existing.test new file mode 100644 index 00000000000..0c8bf481969 --- /dev/null +++ b/mysql-test/suite/innodb/t/alter_rename_existing.test @@ -0,0 +1,93 @@ +--echo # +--echo # Show what happens during ALTER TABLE when an existing file +--echo # exists in the target location. +--echo # +--echo # Bug #19218794: IF TABLESPACE EXISTS, CAN'T CREATE TABLE, +--echo # BUT CAN ALTER ENGINE=INNODB +--echo # + +--source include/have_innodb.inc + +--disable_query_log +LET $MYSQLD_DATADIR = `select @@datadir`; +SET @old_innodb_file_per_table = @@innodb_file_per_table; +--enable_query_log + +CREATE TABLE t1 (a SERIAL, b CHAR(10)) ENGINE=Memory; +INSERT INTO t1(b) VALUES('one'), ('two'), ('three'); + +--echo # +--echo # Create a file called MYSQLD_DATADIR/test/t1.ibd +--exec echo "This is not t1.ibd" > $MYSQLD_DATADIR/test/t1.ibd + +--echo # Directory listing of test/*.ibd +--echo # +--list_files $MYSQLD_DATADIR/test/ *.ibd + +--replace_regex /Error on rename of '.*' to '.*'/Error on rename of 'OLD_FILE_NAME' to 'NEW_FILE_NAME'/ +--error ER_ERROR_ON_RENAME +ALTER TABLE t1 ENGINE = InnoDB; + +--echo # +--echo # Move the file to InnoDB as t2 +--echo # +ALTER TABLE t1 RENAME TO t2, ENGINE = INNODB; +SHOW CREATE TABLE t2; +SELECT * from t2; + +--replace_regex /Error on rename of '.*' to '.*'/Error on rename of 'OLD_FILE_NAME' to 'NEW_FILE_NAME'/ +--error ER_ERROR_ON_RENAME +ALTER TABLE t2 RENAME TO t1; + +--echo # +--echo # Create another t1, but in the system tablespace. +--echo # +SET GLOBAL innodb_file_per_table=OFF; +CREATE TABLE t1 (a SERIAL, b CHAR(20)) ENGINE=InnoDB; +INSERT INTO t1(b) VALUES('one'), ('two'), ('three'); +SHOW CREATE TABLE t1; +SELECT name, space=0 FROM information_schema.innodb_sys_tables WHERE name = 'test/t1'; + +--echo # +--echo # ALTER TABLE from system tablespace to system tablespace +--echo # +ALTER TABLE t1 ADD COLUMN c INT, ALGORITHM=INPLACE; +ALTER TABLE t1 ADD COLUMN d INT, ALGORITHM=COPY; + +--echo # +--echo # Try to move t1 from the system tablespace to a file-per-table +--echo # while a blocking t1.ibd file exists. +--echo # +SET GLOBAL innodb_file_per_table=ON; +--replace_regex /$MYSQLD_DATADIR/MYSQLD_DATADIR/ +--error ER_TABLESPACE_EXISTS +ALTER TABLE t1 ADD COLUMN e1 INT, ALGORITHM=INPLACE; +--replace_regex /Error on rename of '.*' to '.*'/Error on rename of 'OLD_FILE_NAME' to 'NEW_FILE_NAME'/ +--error ER_ERROR_ON_RENAME +ALTER TABLE t1 ADD COLUMN e2 INT, ALGORITHM=COPY; + +--echo # +--echo # Delete the blocking file called MYSQLD_DATADIR/test/t1.ibd +--remove_file $MYSQLD_DATADIR/test/t1.ibd + +--echo # Move t1 to file-per-table using ALGORITHM=INPLACE with no blocking t1.ibd. +--echo # +ALTER TABLE t1 ADD COLUMN e INT, ALGORITHM=INPLACE; +SHOW CREATE TABLE t1; +SELECT name, space=0 FROM information_schema.innodb_sys_tables WHERE name = 'test/t1'; + +DROP TABLE t1; + +--echo # +--echo # Rename t2.ibd to t1.ibd. +--echo # +ALTER TABLE t2 RENAME TO t1; +SELECT name, space=0 FROM information_schema.innodb_sys_tables WHERE name = 'test/t1'; +SELECT * from t1; + +DROP TABLE t1; + +--disable_query_log +call mtr.add_suppression("\\[ERROR\\] InnoDB: Cannot rename '.*' to '.*' for space ID .* because the target file exists. Remove the target file and try again"); +SET GLOBAL innodb_file_per_table = @old_innodb_file_per_table; +--enable_query_log diff --git a/mysql-test/suite/innodb/t/create-index-debug.test b/mysql-test/suite/innodb/t/create-index-debug.test new file mode 100644 index 00000000000..9ea416fbe1e --- /dev/null +++ b/mysql-test/suite/innodb/t/create-index-debug.test @@ -0,0 +1,34 @@ +--source include/have_innodb.inc +--source include/have_innodb_16k.inc +--source include/have_debug.inc + +SET @saved_debug_dbug = @@SESSION.debug_dbug; + +--echo # +--echo #BUG#21326304 INNODB ONLINE ALTER TABLE ENDS IN CRASH ON DISK FULL +--echo # +CREATE TABLE t1(f1 CHAR(255) NOT NULL, f2 CHAR(255) NOT NULL, f3 +CHAR(255) NOT NULL, f4 CHAR(255) NOT NULL, f5 CHAR(255) NOT NULL,f6 +CHAR(255) NOT NULL, f7 CHAR(255) NOT NULL, f8 CHAR(255) NOT NULL,f9 +CHAR(255) NOT NULL, f10 CHAR(255) NOT NULL, f11 CHAR(255) NOT NULL,f12 +CHAR(255) NOT NULL, f13 CHAR(255) NOT NULL, f14 CHAR(255) NOT NULL,f15 +CHAR(255) NOT NULL, f16 CHAR(255) NOT NULL, f17 CHAR(255) NOT NULL,f18 +CHAR(255) NOT NULL) +ENGINE=INNODB ROW_FORMAT=DYNAMIC; + +INSERT INTO t1 +VALUES('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r'); + +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; + +SET debug_dbug = '+d,disk_is_full'; + +--error ER_RECORD_FILE_FULL +ALTER TABLE t1 FORCE, ALGORITHM=INPLACE; + +SET debug_dbug= @saved_debug_dbug; + +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/doublewrite.test b/mysql-test/suite/innodb/t/doublewrite.test index a153ad66b19..bdeaba2dcec 100644 --- a/mysql-test/suite/innodb/t/doublewrite.test +++ b/mysql-test/suite/innodb/t/doublewrite.test @@ -4,22 +4,27 @@ --echo # PAGE OF SYSTEM TABLESPACE --echo # ---source include/have_innodb.inc +--source include/innodb_page_size.inc --source include/have_debug.inc --source include/not_embedded.inc # Slow shutdown and restart to make sure ibuf merge is finished SET GLOBAL innodb_fast_shutdown = 0; --disable_query_log -call mtr.add_suppression("Header page consists of zero bytes"); -call mtr.add_suppression("Checksum mismatch in datafile"); -call mtr.add_suppression("but the innodb_page_size start-up parameter is"); -call mtr.add_suppression("adjusting FSP_SPACE_FLAGS"); +call mtr.add_suppression("InnoDB: Header page consists of zero bytes"); +call mtr.add_suppression("InnoDB: Checksum mismatch in datafile: .*, Space ID:0, Flags: 0"); +call mtr.add_suppression("InnoDB: Data file .* uses page size .* but the innodb_page_size start-up parameter is"); +call mtr.add_suppression("InnoDB: adjusting FSP_SPACE_FLAGS"); +call mtr.add_suppression("InnoDB: New log files created"); +call mtr.add_suppression("InnoDB: Cannot create doublewrite buffer: the first file in innodb_data_file_path must be at least (3|6|12)M\\."); +call mtr.add_suppression("InnoDB: Database creation was aborted"); +call mtr.add_suppression("Plugin 'InnoDB' (init function returned error|registration as a STORAGE ENGINE failed)"); --enable_query_log --source include/restart_mysqld.inc let INNODB_PAGE_SIZE=`select @@innodb_page_size`; let MYSQLD_DATADIR=`select @@datadir`; +let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err; show variables like 'innodb_doublewrite'; show variables like 'innodb_fil_make_page_dirty_debug'; @@ -392,9 +397,38 @@ EOF --source include/start_mysqld.inc check table t1; +--let SEARCH_PATTERN= \[ERROR\] InnoDB: .*test.t1\\.ibd.* +--source include/search_pattern_in_file.inc + select f1, f2 from t1; ---echo # Test End ---echo # --------------------------------------------------------------- - drop table t1; + +--echo # +--echo # MDEV-12600 crash during install_db with innodb_page_size=32K +--echo # and ibdata1=3M +--echo # +let bugdir= $MYSQLTEST_VARDIR/tmp/doublewrite; +--mkdir $bugdir + +let $check_no_innodb=SELECT * FROM INFORMATION_SCHEMA.ENGINES +WHERE engine = 'innodb' +AND support IN ('YES', 'DEFAULT', 'ENABLED'); + +--let $ibp=--innodb-log-group-home-dir=$bugdir --innodb-data-home-dir=$bugdir +--let $ibd=$ibp --innodb-undo-tablespaces=0 --innodb-log-files-in-group=2 +--let $ibp=$ibp --innodb-data-file-path=ibdata1:1M;ibdata2:1M:autoextend + +--let $restart_parameters= $ibp +--source include/restart_mysqld.inc +eval $check_no_innodb; +--let SEARCH_PATTERN= \[ERROR\] InnoDB: Cannot create doublewrite buffer +--source include/search_pattern_in_file.inc +--let $restart_parameters= +--source include/restart_mysqld.inc + +--remove_file $bugdir/ibdata1 +--remove_file $bugdir/ibdata2 +--remove_file $bugdir/ib_logfile0 +--remove_file $bugdir/ib_logfile1 +--rmdir $bugdir diff --git a/mysql-test/suite/innodb/t/drop_table_background.test b/mysql-test/suite/innodb/t/drop_table_background.test new file mode 100644 index 00000000000..0f596dec574 --- /dev/null +++ b/mysql-test/suite/innodb/t/drop_table_background.test @@ -0,0 +1,30 @@ +--source include/have_innodb.inc +--source include/have_debug.inc +# Embedded server does not support restarting +--source include/not_embedded.inc + +CREATE TABLE t(c0 SERIAL, c1 INT, c2 INT, c3 INT, c4 INT, +KEY(c1), KEY(c2), KEY(c2,c1), +KEY(c3), KEY(c3,c1), KEY(c3,c2), KEY(c3,c2,c1), +KEY(c4), KEY(c4,c1), KEY(c4,c2), KEY(c4,c2,c1), +KEY(c4,c3), KEY(c4,c3,c1), KEY(c4,c3,c2), KEY(c4,c3,c2,c1)) ENGINE=InnoDB; + +let $n= 10; + +SET DEBUG_DBUG='+d,row_drop_table_add_to_background'; +--disable_query_log +let $i= $n; +while ($i) { + eval CREATE TABLE t$i LIKE t; + dec $i; +} +let $i= $n; +while ($i) { + eval DROP TABLE t$i; + dec $i; +} +--enable_query_log +DROP TABLE t; +--source include/restart_mysqld.inc +CREATE TABLE t (a INT) ENGINE=InnoDB; +DROP TABLE t; diff --git a/mysql-test/suite/innodb/t/foreign_key.test b/mysql-test/suite/innodb/t/foreign_key.test index 750465f2b85..3d3466c90f0 100644 --- a/mysql-test/suite/innodb/t/foreign_key.test +++ b/mysql-test/suite/innodb/t/foreign_key.test @@ -1,4 +1,5 @@ --source include/have_innodb.inc +--source include/count_sessions.inc --echo # --echo # Bug #19027905 ASSERT RET.SECOND DICT_CREATE_FOREIGN_CONSTRAINTS_LOW @@ -113,3 +114,126 @@ WHERE table_name = 't2'; DROP TABLE t2; DROP TABLE t1; + +# +# MDEV-12669 Circular foreign keys cause a loop and OOM upon LOCK TABLE +# +SET FOREIGN_KEY_CHECKS=0; +CREATE TABLE staff ( + staff_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, + store_id TINYINT UNSIGNED NOT NULL, + PRIMARY KEY (staff_id), + KEY idx_fk_store_id (store_id), + CONSTRAINT fk_staff_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE +) ENGINE=InnoDB; +CREATE TABLE store ( + store_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, + manager_staff_id TINYINT UNSIGNED NOT NULL, + PRIMARY KEY (store_id), + UNIQUE KEY idx_unique_manager (manager_staff_id), + CONSTRAINT fk_store_staff FOREIGN KEY (manager_staff_id) REFERENCES staff (staff_id) ON DELETE RESTRICT ON UPDATE CASCADE +) ENGINE=InnoDB; +SET FOREIGN_KEY_CHECKS=DEFAULT; + +LOCK TABLE staff WRITE; +UNLOCK TABLES; +DROP TABLES staff, store; +SET FOREIGN_KEY_CHECKS=1; + +--echo # +--echo # MDEV-13246 Stale rows despite ON DELETE CASCADE constraint +--echo # + +CREATE TABLE users ( + id int unsigned AUTO_INCREMENT PRIMARY KEY, + name varchar(32) NOT NULL DEFAULT '' +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE matchmaking_groups ( + id bigint unsigned AUTO_INCREMENT PRIMARY KEY, + host_user_id int unsigned NOT NULL UNIQUE, + CONSTRAINT FOREIGN KEY (host_user_id) REFERENCES users (id) + ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE matchmaking_group_users ( + matchmaking_group_id bigint unsigned NOT NULL, + user_id int unsigned NOT NULL, + PRIMARY KEY (matchmaking_group_id,user_id), + UNIQUE KEY user_id (user_id), + CONSTRAINT FOREIGN KEY (matchmaking_group_id) + REFERENCES matchmaking_groups (id) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT FOREIGN KEY (user_id) + REFERENCES users (id) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE matchmaking_group_maps ( + matchmaking_group_id bigint unsigned NOT NULL, + map_id tinyint unsigned NOT NULL, + PRIMARY KEY (matchmaking_group_id,map_id), + CONSTRAINT FOREIGN KEY (matchmaking_group_id) + REFERENCES matchmaking_groups (id) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT INTO users VALUES (NULL,'foo'),(NULL,'bar'); +INSERT INTO matchmaking_groups VALUES (10,1),(11,2); +INSERT INTO matchmaking_group_users VALUES (10,1),(11,2); +INSERT INTO matchmaking_group_maps VALUES (10,55),(11,66); + +BEGIN; +UPDATE users SET name = 'qux' WHERE id = 1; + +--connect (con1,localhost,root,,) +SET innodb_lock_wait_timeout= 1; +DELETE FROM matchmaking_groups WHERE id = 10; + +--connection default +COMMIT; +--sorted_result +SELECT * FROM matchmaking_group_users WHERE matchmaking_group_id NOT IN (SELECT id FROM matchmaking_groups); +--sorted_result +SELECT * FROM matchmaking_group_maps WHERE matchmaking_group_id NOT IN (SELECT id FROM matchmaking_groups); +--sorted_result +SELECT * FROM users; + +DROP TABLE +matchmaking_group_maps, matchmaking_group_users, matchmaking_groups, users; + +--echo # +--echo # MDEV-13331 FK DELETE CASCADE does not honor innodb_lock_wait_timeout +--echo # + +CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY) ENGINE=InnoDB; + +CREATE TABLE t2 ( + id INT NOT NULL PRIMARY KEY, + ref_id INT NOT NULL DEFAULT 0, + f INT NULL, + FOREIGN KEY (ref_id) REFERENCES t1 (id) ON DELETE CASCADE +) ENGINE=InnoDB; + +INSERT INTO t1 VALUES (1),(2); +INSERT INTO t2 VALUES (1,1,10),(2,2,20); + +SHOW CREATE TABLE t2; + +--connection con1 +BEGIN; +UPDATE t2 SET f = 11 WHERE id = 1; + +--connection default +SET innodb_lock_wait_timeout= 1; +--error ER_LOCK_WAIT_TIMEOUT +DELETE FROM t1 WHERE id = 1; + +--connection con1 +COMMIT; +--disconnect con1 + +--connection default +SELECT * FROM t2; +DELETE FROM t1 WHERE id = 1; +SELECT * FROM t2; +DROP TABLE t2, t1; + +--source include/wait_until_count_sessions.inc diff --git a/mysql-test/suite/innodb/t/group_commit_binlog_pos.test b/mysql-test/suite/innodb/t/group_commit_binlog_pos.test index 7148733dc43..801895e825d 100644 --- a/mysql-test/suite/innodb/t/group_commit_binlog_pos.test +++ b/mysql-test/suite/innodb/t/group_commit_binlog_pos.test @@ -9,7 +9,7 @@ # Don't test this under valgrind, memory leaks will occur as we crash --source include/not_valgrind.inc -# The test case currently uses grep and tail, which may be unavailable on +# The test case currently uses sed and tail, which may be unavailable on # some windows systems. But see MWL#191 for how to remove the need for grep. --source include/not_windows.inc @@ -99,7 +99,7 @@ SELECT * FROM t1 ORDER BY a; let $MYSQLD_DATADIR= `SELECT @@datadir`; let pos=`select $binlog_start_pos + 730`; --replace_result $pos ---exec grep 'InnoDB: Last MySQL binlog file position' $MYSQLD_DATADIR/../../log/mysqld.1.err | tail -1 +--exec sed -ne 's/.*\(InnoDB: Last binlog file .* position.*\)/\1/p' $MYSQLD_DATADIR/../../log/mysqld.1.err | tail -1 SET DEBUG_SYNC= 'RESET'; DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/group_commit_binlog_pos_no_optimize_thread.test b/mysql-test/suite/innodb/t/group_commit_binlog_pos_no_optimize_thread.test index a2dab551cec..116bc54441e 100644 --- a/mysql-test/suite/innodb/t/group_commit_binlog_pos_no_optimize_thread.test +++ b/mysql-test/suite/innodb/t/group_commit_binlog_pos_no_optimize_thread.test @@ -9,7 +9,7 @@ # Don't test this under valgrind, memory leaks will occur as we crash --source include/not_valgrind.inc -# The test case currently uses grep and tail, which may be unavailable on +# The test case currently uses sed and tail, which may be unavailable on # some windows systems. But see MWL#191 for how to remove the need for grep. --source include/not_windows.inc @@ -100,6 +100,6 @@ SELECT * FROM t1 ORDER BY a; let $MYSQLD_DATADIR= `SELECT @@datadir`; let pos=`select $binlog_start_pos + 730`; --replace_result $pos ---exec grep 'InnoDB: Last MySQL binlog file position' $MYSQLD_DATADIR/../../log/mysqld.1.err | tail -1 +--exec sed -ne 's/.*\(InnoDB: Last binlog file .* position.*\)/\1/p' $MYSQLD_DATADIR/../../log/mysqld.1.err | tail -1 SET DEBUG_SYNC= 'RESET'; DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/index_merge_threshold.test b/mysql-test/suite/innodb/t/index_merge_threshold.test index 7cbde0acf03..a587e10db6c 100644 --- a/mysql-test/suite/innodb/t/index_merge_threshold.test +++ b/mysql-test/suite/innodb/t/index_merge_threshold.test @@ -11,9 +11,11 @@ # Check actual behavior for table, partitioned table and temporary table # ############################################################# --source include/have_innodb_16k.inc ---source include/have_debug.inc --source include/have_partition.inc +SET @saved_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency; +SET GLOBAL innodb_purge_rseg_truncate_frequency = 1; + # Check index merge threshold by create index on all datatypes CREATE TABLE tab(a BIGINT PRIMARY KEY,c1 TINYTEXT,c2 TEXT,c3 MEDIUMTEXT, @@ -187,3 +189,4 @@ CREATE INDEX index1 ON tab1(b(750)) COMMENT 'MERGE_THRESHOLD=45'; --source suite/innodb/include/innodb_merge_threshold_secondary.inc DROP TABLE tab1; +SET GLOBAL innodb_purge_rseg_truncate_frequency = @saved_frequency; diff --git a/mysql-test/suite/innodb/t/index_tree_operation.opt b/mysql-test/suite/innodb/t/index_tree_operation.opt new file mode 100644 index 00000000000..66bceccc683 --- /dev/null +++ b/mysql-test/suite/innodb/t/index_tree_operation.opt @@ -0,0 +1 @@ +--innodb-sys-tablespaces diff --git a/mysql-test/suite/innodb/t/index_tree_operation.test b/mysql-test/suite/innodb/t/index_tree_operation.test new file mode 100644 index 00000000000..b9695db9346 --- /dev/null +++ b/mysql-test/suite/innodb/t/index_tree_operation.test @@ -0,0 +1,74 @@ +-- source include/have_innodb.inc +-- source include/have_innodb_16k.inc +--echo # +--echo # Bug#15923864 (Bug#67718): +--echo # INNODB DRASTICALLY UNDER-FILLS PAGES IN CERTAIN CONDITIONS +--echo # +# InnoDB should try to insert to the next page before split, +# if the insert record for split_and_insert is last of the page. +# Otherwise, the follwing records 999,998,997 cause each page per record. +# + +--disable_query_log +SET @old_innodb_file_per_table = @@innodb_file_per_table; +--enable_query_log + +SET GLOBAL innodb_file_per_table=ON; + +CREATE TABLE t1 (a BIGINT PRIMARY KEY, b VARCHAR(4096)) ENGINE=InnoDB; +INSERT INTO t1 VALUES (0, REPEAT('a', 4096)); +INSERT INTO t1 VALUES (1000, REPEAT('a', 4096)); +INSERT INTO t1 VALUES (1001, REPEAT('a', 4096)); +INSERT INTO t1 VALUES (1002, REPEAT('a', 4096)); +INSERT INTO t1 VALUES (1, REPEAT('a', 4096)); +INSERT INTO t1 VALUES (2, REPEAT('a', 4096)); + +# | 0, 1, 2 | 1000, 1001, 1002| + +SELECT page_number, number_records +FROM information_schema.innodb_sys_tablespaces s1, +information_schema.innodb_buffer_page s2 +WHERE s1.space = s2.space AND name = 'test/t1' +AND page_type = "INDEX" ORDER BY page_number; + +INSERT INTO t1 VALUES (999, REPEAT('a', 4096)); + +# try to insert '999' to the end of '0,1,2' page, but no space +# the next '1000,1001,1002' page has also no space. +# | 0, 1, 2 | 999 | 1000, 1001, 1002| + +SELECT page_number, number_records +FROM information_schema.innodb_sys_tablespaces s1, +information_schema.innodb_buffer_page s2 +WHERE s1.space = s2.space AND name = 'test/t1' +AND page_type = "INDEX" ORDER BY page_number; + + +INSERT INTO t1 VALUES (998, REPEAT('a', 4096)); + +# try to insert to the end of '0,1,2' page, but no space +# the next '998' page has space. +# | 0, 1, 2 | 998, 999 | 1000, 1001, 1002| + +SELECT page_number, number_records +FROM information_schema.innodb_sys_tablespaces s1, +information_schema.innodb_buffer_page s2 +WHERE s1.space = s2.space AND name = 'test/t1' +AND page_type = "INDEX" ORDER BY page_number; + +INSERT INTO t1 VALUES (997, REPEAT('a', 4096)); + +# same +# | 0, 1, 2 | 997, 998, 999 | 1000, 1001, 1002| + +SELECT page_number, number_records +FROM information_schema.innodb_sys_tablespaces s1, +information_schema.innodb_buffer_page s2 +WHERE s1.space = s2.space AND name = 'test/t1' +AND page_type = "INDEX" ORDER BY page_number; + +DROP TABLE t1; + +--disable_query_log +SET GLOBAL innodb_file_per_table = @old_innodb_file_per_table; +--enable_query_log diff --git a/mysql-test/suite/innodb/t/innodb-32k-crash-master.opt b/mysql-test/suite/innodb/t/innodb-32k-crash-master.opt index 3a0fcd48577..4761ed67d1e 100644 --- a/mysql-test/suite/innodb/t/innodb-32k-crash-master.opt +++ b/mysql-test/suite/innodb/t/innodb-32k-crash-master.opt @@ -1 +1,5 @@ ---default_storage_engine=InnoDB --innodb-buffer-pool-size=24M +--default_storage_engine=InnoDB +--innodb-buffer-pool-size=32M +--innodb-log-file-size=32M +--innodb-page-size=32K + diff --git a/mysql-test/suite/innodb/t/innodb-32k-master.opt b/mysql-test/suite/innodb/t/innodb-32k-master.opt index 9c4099c7f24..322385f7f24 100644 --- a/mysql-test/suite/innodb/t/innodb-32k-master.opt +++ b/mysql-test/suite/innodb/t/innodb-32k-master.opt @@ -1,3 +1,4 @@ --default_storage_engine=InnoDB ---innodb-buffer-pool-size=24M - +--innodb-page-size=32K +--innodb-log-file-size=32M +--innodb-buffer-pool-size=32M diff --git a/mysql-test/suite/innodb/t/innodb-64k-crash-master.opt b/mysql-test/suite/innodb/t/innodb-64k-crash-master.opt index 3a0fcd48577..ce51caf3fb0 100644 --- a/mysql-test/suite/innodb/t/innodb-64k-crash-master.opt +++ b/mysql-test/suite/innodb/t/innodb-64k-crash-master.opt @@ -1 +1,5 @@ ---default_storage_engine=InnoDB --innodb-buffer-pool-size=24M +--default_storage_engine=InnoDB +--innodb-buffer-pool-size=32M +--innodb-page-size=64K +--innodb-log-file-size=32M + diff --git a/mysql-test/suite/innodb/t/innodb-64k-master.opt b/mysql-test/suite/innodb/t/innodb-64k-master.opt index 9c4099c7f24..375b7fcd22f 100644 --- a/mysql-test/suite/innodb/t/innodb-64k-master.opt +++ b/mysql-test/suite/innodb/t/innodb-64k-master.opt @@ -1,3 +1,4 @@ --default_storage_engine=InnoDB ---innodb-buffer-pool-size=24M - +--innodb-buffer-pool-size=32M +--innodb-page-size=64K +--innodb-log-file-size=32M diff --git a/mysql-test/suite/innodb/t/innodb-64k.test b/mysql-test/suite/innodb/t/innodb-64k.test index 13351450cfc..2e08645f5b0 100644 --- a/mysql-test/suite/innodb/t/innodb-64k.test +++ b/mysql-test/suite/innodb/t/innodb-64k.test @@ -3,6 +3,8 @@ --source include/have_innodb.inc --source include/have_innodb_64k.inc +call mtr.add_suppression('InnoDB: Cannot add field.*because after adding it, the row size is'); + let $MYSQLD_DATADIR= `select @@datadir`; --echo # Test 1) Show the page size from Information Schema @@ -12,87 +14,23 @@ SELECT variable_value FROM information_schema.global_status --echo # Test 4) The maximum row size is dependent upon the page size. SET SESSION innodb_strict_mode = ON; +SELECT @@innodb_strict_mode; -# Redundant table; 32698 bytes - -# MDEV-11828 FIXME: The length must be less! -CREATE TABLE t1 ( -c01 char(200), c02 char(200), c03 char(200), c04 char(200), c05 char(200), -c06 char(200), c07 char(200), c08 char(200), c09 char(200), c10 char(200), -c11 char(200), c12 char(200), c13 char(200), c14 char(200), c15 char(200), -c16 char(200), c17 char(200), c18 char(200), c19 char(200), c20 char(200), -c21 char(200), c22 char(200), c23 char(200), c24 char(200), c25 char(200), -c26 char(200), c27 char(200), c28 char(200), c29 char(200), c30 char(200), -c31 char(200), c32 char(200), c33 char(200), c34 char(200), c35 char(200), -c36 char(200), c37 char(200), c38 char(200), c39 char(200), c40 char(200), -c41 char(200), c42 char(200), c43 char(200), c44 char(200), c45 char(200), -c46 char(200), c47 char(200), c48 char(200), c49 char(200), c50 char(200), -c51 char(200), c52 char(200), c53 char(200), c54 char(200), c55 char(200), -c56 char(200), c57 char(200), c58 char(200), c59 char(200), c60 char(200), -c61 char(200), c62 char(200), c63 char(200), c64 char(200), c65 char(200), -c66 char(200), c67 char(200), c68 char(200), c69 char(200), c70 char(200), -c71 char(200), c72 char(200), c73 char(200), c74 char(200), c75 char(200), -c76 char(200), c77 char(200), c78 char(200), c79 char(200), c80 char(200), -c101 char(200), c102 char(200), c103 char(200), c104 char(200), c105 char(200), -c106 char(200), c107 char(200), c108 char(200), c109 char(200), c110 char(200), -c111 char(200), c112 char(200), c113 char(200), c114 char(200), c115 char(200), -c116 char(200), c117 char(200), c118 char(200), c119 char(200), c120 char(200), -c121 char(200), c122 char(200), c123 char(200), c124 char(200), c125 char(200), -c126 char(200), c127 char(200), c128 char(200), c129 char(200), c130 char(200), -c131 char(200), c132 char(200), c133 char(200), c134 char(200), c135 char(200), -c136 char(200), c137 char(200), c138 char(200), c139 char(200), c140 char(200), -c141 char(200), c142 char(200), c143 char(200), c144 char(200), c145 char(200), -c146 char(200), c147 char(200), c148 char(200), c149 char(200), c150 char(200), -c151 char(200), c152 char(200), c153 char(200), c154 char(200), c155 char(200), -c156 char(200), c157 char(200), c158 char(200), c159 char(200), c160 char(200), -c161 char(200), c162 char(200), c163 char(200), c164 char(200), c165 char(200), -c166 char(200), c167 char(200), c168 char(200), c169 char(200), c170 char(200), -c171 char(200), c172 char(200), c173 char(200), c174 char(200), c175 char(200), -c176 char(200), c177 char(200), c178 char(200), c179 char(200), c180 char(200), -c190 char(200), -c81 char(143) -) ROW_FORMAT=redundant; - -DROP TABLE t1; - ---replace_regex /> [0-9]*/> max_row_size/ +# Redundant table --error ER_TOO_BIG_ROWSIZE -CREATE TABLE t1 ( -c01 char(200), c02 char(200), c03 char(200), c04 char(200), c05 char(200), -c06 char(200), c07 char(200), c08 char(200), c09 char(200), c10 char(200), -c11 char(200), c12 char(200), c13 char(200), c14 char(200), c15 char(200), -c16 char(200), c17 char(200), c18 char(200), c19 char(200), c20 char(200), -c21 char(200), c22 char(200), c23 char(200), c24 char(200), c25 char(200), -c26 char(200), c27 char(200), c28 char(200), c29 char(200), c30 char(200), -c31 char(200), c32 char(200), c33 char(200), c34 char(200), c35 char(200), -c36 char(200), c37 char(200), c38 char(200), c39 char(200), c40 char(200), -c41 char(200), c42 char(200), c43 char(200), c44 char(200), c45 char(200), -c46 char(200), c47 char(200), c48 char(200), c49 char(200), c50 char(200), -c51 char(200), c52 char(200), c53 char(200), c54 char(200), c55 char(200), -c56 char(200), c57 char(200), c58 char(200), c59 char(200), c60 char(200), -c61 char(200), c62 char(200), c63 char(200), c64 char(200), c65 char(200), -c66 char(200), c67 char(200), c68 char(200), c69 char(200), c70 char(200), -c71 char(200), c72 char(200), c73 char(200), c74 char(200), c75 char(200), -c76 char(200), c77 char(200), c78 char(200), c79 char(200), c80 char(200), -c101 char(200), c102 char(200), c103 char(200), c104 char(200), c105 char(200), -c106 char(200), c107 char(200), c108 char(200), c109 char(200), c110 char(200), -c111 char(200), c112 char(200), c113 char(200), c114 char(200), c115 char(200), -c116 char(200), c117 char(200), c118 char(200), c119 char(200), c120 char(200), -c121 char(200), c122 char(200), c123 char(200), c124 char(200), c125 char(200), -c126 char(200), c127 char(200), c128 char(200), c129 char(200), c130 char(200), -c131 char(200), c132 char(200), c133 char(200), c134 char(200), c135 char(200), -c136 char(200), c137 char(200), c138 char(200), c139 char(200), c140 char(200), -c141 char(200), c142 char(200), c143 char(200), c144 char(200), c145 char(200), -c146 char(200), c147 char(200), c148 char(200), c149 char(200), c150 char(200), -c151 char(200), c152 char(200), c153 char(200), c154 char(200), c155 char(200), -c156 char(200), c157 char(200), c158 char(200), c159 char(200), c160 char(200), -c161 char(200), c162 char(200), c163 char(200), c164 char(200), c165 char(200), -c166 char(200), c167 char(200), c168 char(200), c169 char(200), c170 char(200), -c171 char(200), c172 char(200), c173 char(200), c174 char(200), c175 char(200), -c176 char(200), c177 char(200), c178 char(200), c179 char(200), c180 char(200), -c190 char(200), -c81 char(144) -) ROW_FORMAT=redundant; +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT=REDUNDANT; +show warnings; # Compact table, 32701 bytes diff --git a/mysql-test/suite/innodb/t/innodb-alter-autoinc.test b/mysql-test/suite/innodb/t/innodb-alter-autoinc.test new file mode 100644 index 00000000000..e01c44aa26e --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb-alter-autoinc.test @@ -0,0 +1,104 @@ +--source include/have_innodb.inc + +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES(347),(33101),(123),(45),(6); +# NULL -> NOT NULL only allowed INPLACE if strict sql_mode is on. +SET @old_sql_mode = @@sql_mode; +SET @@sql_mode = 'STRICT_TRANS_TABLES'; +ALTER TABLE t1 ADD PRIMARY KEY(a); +SET @@sql_mode = @old_sql_mode; + +# We cannot assign AUTO_INCREMENT values during online index creation. +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1 DROP PRIMARY KEY, ADD id INT AUTO_INCREMENT PRIMARY KEY, + LOCK=NONE; + +--error ER_WRONG_AUTO_KEY +ALTER TABLE t1 ADD id INT AUTO_INCREMENT; + +--error ER_WRONG_AUTO_KEY +ALTER TABLE t1 ADD id INT AUTO_INCREMENT, ADD INDEX(a, id); + +ALTER TABLE t1 ADD id INT NOT NULL, ADD INDEX(id, a); + +SELECT * FROM t1; + +# Test with a non-default increment and offset +SET AUTO_INCREMENT_INCREMENT = 5, AUTO_INCREMENT_OFFSET = 30; + +ALTER TABLE t1 DROP PRIMARY KEY, ADD id INT AUTO_INCREMENT PRIMARY KEY, + DROP COLUMN id, AUTO_INCREMENT = 42, ALGORITHM=COPY; + +SHOW CREATE TABLE t1; + +# The autoinc next value should increase. It is not rolled back. +BEGIN; +INSERT INTO t1 VALUES(7,0); +SELECT * FROM t1; +ROLLBACK; + +SHOW CREATE TABLE t1; + +# We cannot assign AUTO_INCREMENT values during online index creation. +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1 DROP PRIMARY KEY, ADD id INT AUTO_INCREMENT PRIMARY KEY, + DROP COLUMN id, AUTO_INCREMENT = 42, LOCK=NONE; + +ALTER TABLE t1 DROP PRIMARY KEY, ADD id INT AUTO_INCREMENT PRIMARY KEY, + DROP COLUMN id, AUTO_INCREMENT = 42, ALGORITHM=INPLACE; + +SELECT * FROM t1; +SHOW CREATE TABLE t1; + +INSERT INTO t1 SET a=123; +INSERT INTO t1 VALUES(-123,-45); + +ALTER TABLE t1 AUTO_INCREMENT = 75; + +INSERT INTO t1 SET a=123; +SELECT * FROM t1; + +SHOW CREATE TABLE t1; + +DROP TABLE t1; + +# ALGORITHM=INPLACE should deliver identical results to ALGORITHM=COPY. +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES(347),(33101),(123),(45),(6); +ALTER TABLE t1 ADD PRIMARY KEY(a); + +ALTER TABLE t1 ADD id INT NOT NULL, ADD INDEX(id, a); + +SELECT * FROM t1; + +ALTER TABLE t1 DROP PRIMARY KEY, ADD id INT AUTO_INCREMENT PRIMARY KEY, + DROP COLUMN id, AUTO_INCREMENT = 42, ALGORITHM=INPLACE; + +SHOW CREATE TABLE t1; + +# The autoinc next value should increase. It is not rolled back. +BEGIN; +INSERT INTO t1 VALUES(7,0); +SELECT * FROM t1; +ROLLBACK; + +SHOW CREATE TABLE t1; + +ALTER TABLE t1 DROP PRIMARY KEY, ADD id INT AUTO_INCREMENT PRIMARY KEY, + DROP COLUMN id, AUTO_INCREMENT = 42, ALGORITHM=COPY; + +SELECT * FROM t1; + +SHOW CREATE TABLE t1; + +INSERT INTO t1 SET a=123; +INSERT INTO t1 VALUES(-123,-45); + +ALTER TABLE t1 AUTO_INCREMENT = 75; + +INSERT INTO t1 SET a=123; +SELECT * FROM t1; + +SHOW CREATE TABLE t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/innodb-alter-debug.test b/mysql-test/suite/innodb/t/innodb-alter-debug.test index 70017ffba35..f4996916e9f 100644 --- a/mysql-test/suite/innodb/t/innodb-alter-debug.test +++ b/mysql-test/suite/innodb/t/innodb-alter-debug.test @@ -1,4 +1,4 @@ ---source include/have_innodb.inc +--source include/innodb_page_size.inc --source include/have_debug.inc --source include/have_debug_sync.inc diff --git a/mysql-test/suite/innodb/t/innodb-alter-nullable.test b/mysql-test/suite/innodb/t/innodb-alter-nullable.test index 3f1e82b3183..bb5cdee000a 100644 --- a/mysql-test/suite/innodb/t/innodb-alter-nullable.test +++ b/mysql-test/suite/innodb/t/innodb-alter-nullable.test @@ -1,4 +1,4 @@ ---source include/have_innodb.inc +--source include/innodb_page_size.inc # Save the initial number of concurrent sessions. --source include/count_sessions.inc diff --git a/mysql-test/suite/innodb/t/innodb-alter-table.test b/mysql-test/suite/innodb/t/innodb-alter-table.test index 45342b4a218..97f0075f344 100644 --- a/mysql-test/suite/innodb/t/innodb-alter-table.test +++ b/mysql-test/suite/innodb/t/innodb-alter-table.test @@ -1,4 +1,4 @@ ---source include/have_innodb.inc +--source include/innodb_page_size.inc # # MMDEV-8386: MariaDB creates very big tmp file and hangs on xtradb diff --git a/mysql-test/suite/innodb/t/innodb-alter-tempfile.test b/mysql-test/suite/innodb/t/innodb-alter-tempfile.test index ec1ea35f1cf..d3f34b12ea6 100644 --- a/mysql-test/suite/innodb/t/innodb-alter-tempfile.test +++ b/mysql-test/suite/innodb/t/innodb-alter-tempfile.test @@ -10,8 +10,7 @@ # Avoid CrashReporter popup on Mac --source include/not_crashrep.inc -# InnoDB is required ---source include/have_innodb.inc +--source include/innodb_page_size.inc --echo # --echo # Bug #18734396 INNODB IN-PLACE ALTER FAILURES BLOCK FUTURE ALTERS diff --git a/mysql-test/suite/innodb/t/innodb-alter-timestamp.test b/mysql-test/suite/innodb/t/innodb-alter-timestamp.test index c0b17ee6440..d8acc02cbdb 100644 --- a/mysql-test/suite/innodb/t/innodb-alter-timestamp.test +++ b/mysql-test/suite/innodb/t/innodb-alter-timestamp.test @@ -1,16 +1,46 @@ --source include/have_innodb.inc -CREATE TABLE t1 ( - `i1` INT(10) UNSIGNED NOT NULL, - `d1` TIMESTAMP NULL DEFAULT NULL -) ENGINE=innodb; +CREATE TABLE t1 (i1 INT UNSIGNED NULL DEFAULT 42) ENGINE=innodb; +INSERT INTO t1 VALUES(NULL); +--enable_info +--error ER_INVALID_USE_OF_NULL +ALTER TABLE t1 CHANGE i1 i1 INT UNSIGNED NOT NULL DEFAULT rand(), +ALGORITHM=INPLACE; +--error WARN_DATA_TRUNCATED +ALTER TABLE t1 CHANGE i1 i1 INT UNSIGNED NOT NULL DEFAULT rand(), +ALGORITHM=COPY; +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1 CHANGE i1 id INT UNSIGNED NOT NULL AUTO_INCREMENT, +ADD PRIMARY KEY(id), ALGORITHM=INPLACE; +--error ER_INVALID_USE_OF_NULL +ALTER TABLE t1 ADD PRIMARY KEY(i1), ALGORITHM=INPLACE; +ALTER TABLE t1 CHANGE i1 id INT UNSIGNED NOT NULL AUTO_INCREMENT, +ADD PRIMARY KEY(id); +--disable_info +SELECT * FROM t1; +SHOW CREATE TABLE t1; +DROP TABLE t1; -show create table t1; +CREATE TABLE t1 (i1 INT UNSIGNED NOT NULL, d1 TIMESTAMP NULL) ENGINE=InnoDB; + +SHOW CREATE TABLE t1; INSERT INTO t1 (i1) VALUES (1), (2), (3), (4), (5); select * from t1; set sql_mode = 'STRICT_ALL_TABLES,NO_ZERO_DATE'; -ALTER TABLE t1 CHANGE `d1` `d1` TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL; +ALTER TABLE t1 CHANGE d1 d1 TIMESTAMP NULL DEFAULT '2017-05-08 16:23:45', +ALGORITHM=INPLACE; +SELECT DISTINCT d1 FROM t1; +ALTER TABLE t1 CHANGE d1 d1 TIMESTAMP NULL DEFAULT '2017-05-08 16:32:45', +ALGORITHM=COPY; +SELECT DISTINCT d1 FROM t1; +--enable_info +ALTER TABLE t1 CHANGE d1 d1 TIMESTAMP DEFAULT '2017-05-08 16:32:54'; +--disable_info +--echo # Note: NULL was changed to CURRENT_TIMESTAMP(), +--echo # not the specified constant DEFAULT value! +SELECT COUNT(DISTINCT d1),COUNT(d1),COUNT(*) FROM t1; +SELECT DISTINCT (CURRENT_TIMESTAMP()-d1) <= 60 FROM t1; drop table t1; CREATE TABLE t1 ( @@ -18,10 +48,27 @@ CREATE TABLE t1 ( `d1` TIMESTAMP NULL DEFAULT NULL ) ENGINE=innodb; INSERT INTO t1 (i1) VALUES (1), (2), (3), (4), (5); -ALTER TABLE t1 CHANGE `d1` `d1` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; -drop table t1; -set sql_mode = ''; - - - +--enable_info +ALTER TABLE t1 CHANGE d1 d1 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; +ALTER TABLE t1 ADD COLUMN w1 varchar(20) NULL DEFAULT USER(); +ALTER TABLE t1 CHANGE w1 u1 varchar(30) NULL DEFAULT substr(USER(),1); +--disable_info +SELECT u1, COUNT(DISTINCT d1) FROM t1 GROUP BY u1; +--enable_info +ALTER TABLE t1 ADD COLUMN d2 TIMESTAMP DEFAULT '2017-05-08 16:23:45', +LOCK=NONE; +--error ER_ALTER_OPERATION_NOT_SUPPORTED +ALTER TABLE t1 ADD COLUMN d3 TIMESTAMP DEFAULT d1, LOCK=NONE; +--error ER_ALTER_OPERATION_NOT_SUPPORTED +ALTER TABLE t1 ADD COLUMN d3 TIMESTAMP DEFAULT d1, ALGORITHM=INPLACE; +ALTER TABLE t1 ADD COLUMN d3 TIMESTAMP DEFAULT d1; +--disable_info +SELECT d1-d3, d2 FROM t1; +SHOW CREATE TABLE t1; +--enable_info +ALTER TABLE t1 ADD COLUMN d4 TIMESTAMP DEFAULT CURRENT_TIMESTAMP; +--disable_info +SELECT COUNT(DISTINCT d4),COUNT(d4),COUNT(*) FROM t1; +SELECT DISTINCT (CURRENT_TIMESTAMP()-d4) <= 60 FROM t1; +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/innodb-alter.opt b/mysql-test/suite/innodb/t/innodb-alter.opt new file mode 100644 index 00000000000..aa400236153 --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb-alter.opt @@ -0,0 +1,3 @@ +--loose-innodb-sys-indexes +--loose-innodb-sys-columns +--loose-innodb-sys-fields diff --git a/mysql-test/suite/innodb/t/innodb-alter.test b/mysql-test/suite/innodb/t/innodb-alter.test new file mode 100644 index 00000000000..5e681f96b4a --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb-alter.test @@ -0,0 +1,499 @@ +--source include/have_innodb.inc + +SET NAMES utf8mb4; + +CREATE TABLE t1 ( + c1 INT PRIMARY KEY, c2 INT DEFAULT 1, ct TEXT, + INDEX(c2)) +ENGINE=InnoDB; + +INSERT INTO t1 SET c1=1; + +CREATE TABLE sys_tables SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES +WHERE NAME LIKE 'test/t%'; +CREATE TABLE sys_indexes SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; + +CREATE TABLE t1p LIKE t1; + +CREATE TABLE t1c (c1 INT PRIMARY KEY, c2 INT, c3 INT, INDEX(c2), INDEX(c3), + CONSTRAINT t1c2 FOREIGN KEY (c2) REFERENCES t1(c2), + CONSTRAINT t1c3 FOREIGN KEY (c3) REFERENCES t1p(c2)) +ENGINE=InnoDB; + +CREATE TABLE sys_foreign SELECT i.* +FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN i +WHERE FOR_NAME LIKE 'test/t%'; + +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; + +-- source suite/innodb/include/innodb_dict.inc + +SHOW CREATE TABLE t1; +ALTER TABLE t1 ALTER c2 DROP DEFAULT; +SHOW CREATE TABLE t1; + +-- source suite/innodb/include/innodb_dict.inc + +# These should be no-op. +ALTER TABLE t1 CHANGE c2 c2 INT AFTER c1; +ALTER TABLE t1 CHANGE c1 c1 INT FIRST; + +-- source suite/innodb/include/innodb_dict.inc + +ALTER TABLE t1 CHANGE C2 c3 INT; + +-- source suite/innodb/include/innodb_dict.inc + +ALTER TABLE t1 CHANGE c3 C INT; + +-- source suite/innodb/include/innodb_dict.inc + +ALTER TABLE t1 CHANGE C Cöŀumň_TWO INT; + +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; + +-- source suite/innodb/include/innodb_dict.inc + +-- error ER_BAD_FIELD_ERROR +ALTER TABLE t1 CHANGE cöĿǖmň_two c3 INT; + +ALTER TABLE t1 CHANGE cÖĿUMŇ_two c3 INT, RENAME TO t3; + +SELECT st.NAME, i.NAME +FROM sys_tables st INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES i +ON i.TABLE_ID=st.TABLE_ID; + +SHOW CREATE TABLE t3; +SHOW CREATE TABLE t1c; + +# The maximum column name length should be 64 characters. +--error ER_TOO_LONG_IDENT +ALTER TABLE t3 CHANGE c3 +`12345678901234567890123456789012345678901234567890123456789012345` INT; +ALTER TABLE t3 CHANGE c3 +`1234567890123456789012345678901234567890123456789012345678901234` INT; +SHOW CREATE TABLE t3; + +# Test the length limit with non-ASCII utf-8 characters. +--error ER_TOO_LONG_IDENT +ALTER TABLE t3 CHANGE +`1234567890123456789012345678901234567890123456789012345678901234` +`倀å€å€‚倃倄倅倆倇倈倉倊個倌å€å€Žå€å€å€‘倒倓倔倕倖倗倘候倚倛倜å€å€žå€Ÿå€ å€¡å€¢å€£å€¤å€¥å€¦å€§å€¨å€©å€ªå€«å€¬å€­å€®å€¯å€°å€±å€²å€³å€´å€µå€¶å€·å€¸å€¹å€ºå€»å€¼å€½å€¾å€¿å€` INT; +--error ER_TOO_LONG_IDENT +ALTER TABLE t3 CHANGE +`1234567890123456789012345678901234567890123456789012345678901234` +`倀å€å€‚倃倄倅倆倇倈倉倊個倌å€å€Žå€å€å€‘倒倓倔倕倖倗倘候倚倛倜å€å€žå€Ÿå€ å€¡å€¢å€£å€¤å€¥å€¦å€§å€¨å€©å€ªå€«å€¬å€­å€®å€¯å€°å€±å€²å€³å€´å€µå€¶å€·å€¸å€¹å€ºå€»å€¼å€½å€¾å€¿Ã¤` INT; +ALTER TABLE t3 CHANGE +`1234567890123456789012345678901234567890123456789012345678901234` +`倀å€å€‚倃倄倅倆倇倈倉倊個倌å€å€Žå€å€å€‘倒倓倔倕倖倗倘候倚倛倜å€å€žå€Ÿå€ å€¡å€¢å€£å€¤å€¥å€¦å€§å€¨å€©å€ªå€«å€¬å€­å€®å€¯å€°å€±å€²å€³å€´å€µå€¶å€·å€¸å€¹å€ºå€»å€¼å€½å€¾Ã¤` INT; + +# check that the rename is case-insensitive (note the upper-case ä at end) +ALTER TABLE t3 CHANGE +`倀å€å€‚倃倄倅倆倇倈倉倊個倌å€å€Žå€å€å€‘倒倓倔倕倖倗倘候倚倛倜å€å€žå€Ÿå€ å€¡å€¢å€£å€¤å€¥å€¦å€§å€¨å€©å€ªå€«å€¬å€­å€®å€¯å€°å€±å€²å€³å€´å€µå€¶å€·å€¸å€¹å€ºå€»å€¼å€½å€¾Ã„` +c3 INT; + +# test with 4-byte UTF-8 (should be disallowed) +--error ER_INVALID_CHARACTER_STRING +ALTER TABLE t3 CHANGE c3 ðŒ€ðŒðŒ‚ðŒƒðŒ„ðŒ…ðŒ†ðŒ‡ðŒˆðŒ‰ðŒŠðŒ‹ðŒŒðŒðŒŽðŒðŒðŒ‘ðŒ’ðŒ“ðŒ”ðŒ•ðŒ–ðŒ—ðŒ˜ðŒ™ðŒšðŒ›ðŒœ INT; +--error ER_INVALID_CHARACTER_STRING +ALTER TABLE t3 CHANGE c3 😲 INT; + +ALTER TABLE t3 RENAME TO t2; + +SELECT st.NAME, i.NAME +FROM sys_tables st INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES i +ON i.TABLE_ID=st.TABLE_ID; + +SHOW CREATE TABLE t2; + +RENAME TABLE t2 TO t1; + +SELECT st.NAME, i.NAME +FROM sys_tables st INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES i +ON i.TABLE_ID=st.TABLE_ID; + +-- source suite/innodb/include/innodb_dict.inc + +--error ER_DROP_INDEX_FK +ALTER TABLE t1 DROP INDEX c2; + +--error ER_CANT_DROP_FIELD_OR_KEY +ALTER TABLE t1 DROP INDEX c4; + +--error ER_CANT_DROP_FIELD_OR_KEY +ALTER TABLE t1c DROP FOREIGN KEY c2; + +--error ER_CANT_DROP_FIELD_OR_KEY +ALTER TABLE t1c DROP FOREIGN KEY t1c2, DROP FOREIGN KEY c2; + +--error ER_CANT_DROP_FIELD_OR_KEY +ALTER TABLE t1c DROP FOREIGN KEY t1c2, DROP FOREIGN KEY c2, DROP INDEX c2; + +--error ER_DROP_INDEX_FK +ALTER TABLE t1c DROP INDEX c2; + +--error ER_CANT_DROP_FIELD_OR_KEY +ALTER TABLE t1c DROP FOREIGN KEY ẗ1C2; + +SHOW CREATE TABLE t1c; + +SET foreign_key_checks=0; +DROP TABLE t1p; +SET foreign_key_checks=1; + +SHOW CREATE TABLE t1c; + +-- source suite/innodb/include/innodb_dict.inc + +CREATE TABLE t1p (c1 INT PRIMARY KEY, c2 INT, INDEX(c2)) ENGINE=InnoDB; + +--error ER_DROP_INDEX_FK +ALTER TABLE t1c DROP INDEX C2, DROP INDEX C3; +--error ER_DROP_INDEX_FK +ALTER TABLE t1c DROP INDEX C3; + +SET foreign_key_checks=0; +ALTER TABLE t1c DROP INDEX C3; +SET foreign_key_checks=1; + +SHOW CREATE TABLE t1c; +-- source suite/innodb/include/innodb_dict.inc + +ALTER TABLE t1c DROP FOREIGN KEY t1C3; + +SHOW CREATE TABLE t1c; +-- source suite/innodb/include/innodb_dict.inc + +ALTER TABLE t1c DROP INDEX c2, DROP FOREIGN KEY t1C2; + +SHOW CREATE TABLE t1c; + +-- source suite/innodb/include/innodb_dict.inc + +ALTER TABLE t1 DROP INDEX c2, CHANGE c3 c2 INT; + +-- source suite/innodb/include/innodb_dict.inc + +CREATE TABLE t1o LIKE t1; + +# This will implicitly add a FTS_DOC_ID column, which cannot be done online. +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1 ADD FULLTEXT INDEX (ct), +CHANGE c1 pk INT, ALTER c2 SET DEFAULT 42, RENAME TO tt, +ALGORITHM=INPLACE, LOCK=NONE; + +ALTER TABLE t1 ADD FULLTEXT INDEX (ct), +CHANGE c1 pk INT, ALTER c2 SET DEFAULT 42, RENAME TO tt, +ALGORITHM=INPLACE, LOCK=SHARED; + +# The output should be empty, because index->id was reassigned. +-- source suite/innodb/include/innodb_dict.inc + +SHOW CREATE TABLE tt; + +# DB_ROW_ID, DB_TRX_ID, DB_ROLL_PTR are reserved InnoDB system column names. +--error ER_WRONG_COLUMN_NAME +ALTER TABLE t1o CHANGE c1 dB_row_Id INT, ALGORITHM=COPY; +--error ER_WRONG_COLUMN_NAME +ALTER TABLE t1o CHANGE c1 dB_row_Id INT, ALGORITHM=INPLACE; +--error ER_WRONG_COLUMN_NAME +ALTER TABLE t1o CHANGE c1 DB_TRX_ID INT; +--error ER_WRONG_COLUMN_NAME +ALTER TABLE t1o CHANGE c1 db_roll_ptr INT; +--error ER_WRONG_COLUMN_NAME +ALTER TABLE t1o ADD COLUMN DB_TRX_ID INT; +--error ER_WRONG_COLUMN_NAME +ALTER TABLE t1o ADD COLUMN db_roll_ptr INT; + +--error ER_INNODB_FT_WRONG_DOCID_COLUMN +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), ADD COLUMN FTS_DOC_ID BIGINT; +--error ER_INNODB_FT_WRONG_DOCID_COLUMN +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), ADD COLUMN FTS_DOC_ID BIGINT UNSIGNED; + +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), +ADD COLUMN FTS_DOC_ID BIGINT UNSIGNED NOT NULL; + +--error ER_DUP_FIELDNAME +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), ADD COLUMN FTS_DOC_ID INT; + +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1o DROP COLUMN FTS_DOC_ID, ALGORITHM=INPLACE; + +ALTER TABLE t1o DROP COLUMN FTS_DOC_ID, DROP INDEX ct, ALGORITHM=INPLACE; + +# This creates a hidden FTS_DOC_ID column. +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), ADD COLUMN cu TEXT; + +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1o ADD FULLTEXT INDEX(cu), ADD COLUMN FTS_DOC_ID BIGINT, +ALGORITHM=INPLACE; +--error ER_WRONG_COLUMN_NAME +ALTER TABLE t1o ADD FULLTEXT INDEX(cu), ADD COLUMN FTS_DOC_ID BIGINT; +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1o ADD FULLTEXT INDEX(cu), ADD COLUMN FTS_DOC_ID BIGINT UNSIGNED, +ALGORITHM=INPLACE; +--error ER_WRONG_COLUMN_NAME +ALTER TABLE t1o ADD FULLTEXT INDEX(cu), ADD COLUMN FTS_DOC_ID BIGINT UNSIGNED; + +# This would drop the hidden FTS_DOC_ID column and create +# a fulltext index on ct and another fulltext index on cu. +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1o ADD FULLTEXT INDEX(cu), +ADD COLUMN FTS_DOC_ID BIGINT UNSIGNED NOT NULL, ALGORITHM=INPLACE; + +# Replace the hidden FTS_DOC_ID column with a user-visible one. +# This used to work if there is at most one fulltext index. +# Currently, we disallow native ALTER TABLE if the table +# contains any FULLTEXT indexes. +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1o ADD COLUMN FTS_DOC_ID BIGINT UNSIGNED NOT NULL, +ALGORITHM=INPLACE; +ALTER TABLE t1o ADD COLUMN FTS_DOC_ID BIGINT UNSIGNED NOT NULL; +# Replace the user-visible FTS_DOC_ID column with a hidden one. +# We do not support this in-place. +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1o DROP COLUMN FTS_DOC_ID, ALGORITHM=INPLACE; +ALTER TABLE t1o DROP COLUMN FTS_DOC_ID; + +# FTS_DOC_ID is the internal row identifier for full-text search. +# It should be of type BIGINT UNSIGNED NOT NULL. +--error ER_WRONG_COLUMN_NAME +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), CHANGE c1 FTS_DOC_ID INT, +ALGORITHM=COPY; + +--error ER_WRONG_COLUMN_NAME +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), CHANGE c1 FTS_DOC_ID INT, +ALGORITHM=INPLACE; +--error ER_WRONG_COLUMN_NAME +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), CHANGE c1 FTS_Doc_ID INT, +ALGORITHM=INPLACE; +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), +CHANGE c1 FTS_DOC_ID BIGINT UNSIGNED NOT NULL, +ALGORITHM=INPLACE; + +CREATE TABLE t1n LIKE t1o; + +ALTER TABLE t1n ADD FULLTEXT INDEX(ct); +--error ER_WRONG_COLUMN_NAME +ALTER TABLE t1n CHANGE c1 Fts_DOC_ID INT, ALGORITHM=INPLACE; +--error ER_WRONG_COLUMN_NAME +ALTER TABLE t1n CHANGE c1 Fts_DOC_ID INT, ALGORITHM=COPY; +--error ER_BAD_FIELD_ERROR +ALTER TABLE t1n CHANGE FTS_DOC_ID c11 INT, ALGORITHM=INPLACE; +ALTER TABLE t1n CHANGE c1 FTS_DOC_ïD INT, ALGORITHM=INPLACE; + +ALTER TABLE t1n CHANGE FTS_DOC_ÃD c1 INT, ALGORITHM=INPLACE; +ALTER TABLE t1n CHANGE c1 c2 INT, CHANGE c2 ct INT, CHANGE ct c1 TEXT, +ALGORITHM=INPLACE; +SHOW CREATE TABLE t1n; +ALTER TABLE t1n CHANGE c2 c1 INT, CHANGE ct c2 INT, CHANGE c1 ct TEXT, +ALGORITHM=COPY; +SHOW CREATE TABLE t1n; + +--error ER_KEY_COLUMN_DOES_NOT_EXITS +ALTER TABLE t1n ADD INDEX(c2), CHANGE c2 c4 INT, ALGORITHM=INPLACE; +--error ER_KEY_COLUMN_DOES_NOT_EXITS +ALTER TABLE t1n ADD INDEX(c2), CHANGE c2 c4 INT, ALGORITHM=COPY; +# FIXME: MDEV-13668 InnoDB unnecessarily rebuilds table +# when renaming a column and adding index +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1n ADD INDEX(c4), CHANGE c2 c4 INT, ALGORITHM=INPLACE; +ALTER TABLE t1n CHANGE c2 c4 INT, LOCK=NONE; +ALTER TABLE t1n ADD INDEX(c4), LOCK=NONE; +SHOW CREATE TABLE t1n; +ALTER TABLE t1n DROP INDEX c4; +--error ER_DUP_FIELDNAME +ALTER TABLE t1n CHANGE c4 c1 INT, ADD INDEX(c1), ALGORITHM=INPLACE; +# FIXME: MDEV-13668 +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1n CHANGE c4 c11 INT, ADD INDEX(c11), ALGORITHM=INPLACE; +ALTER TABLE t1n CHANGE c4 c11 INT, LOCK=NONE; +ALTER TABLE t1n ADD INDEX(c11), LOCK=NONE; + +SHOW CREATE TABLE t1n; +DROP TABLE t1n; + +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1o MODIFY c1 BIGINT UNSIGNED NOT NULL, DROP INDEX ct, +ALGORITHM=INPLACE; + +# This will copy the table, removing the hidden FTS_DOC_ID column. +ALTER TABLE t1o MODIFY c1 BIGINT UNSIGNED NOT NULL, DROP INDEX ct; + +ALTER TABLE t1o CHANGE c1 FTS_DOC_ID BIGINT UNSIGNED NOT NULL, +ALGORITHM=INPLACE; + +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), ALGORITHM=INPLACE; + +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1o CHANGE FTS_DOC_ID foo_id BIGINT UNSIGNED NOT NULL, +ALGORITHM=INPLACE; + +# This should not show duplicates. +SELECT sc.pos FROM information_schema.innodb_sys_columns sc +INNER JOIN information_schema.innodb_sys_tables st +ON sc.TABLE_ID=st.TABLE_ID +WHERE st.NAME='test/t1o' AND sc.NAME='FTS_DOC_ID'; + +SHOW CREATE TABLE t1o; + +ALTER TABLE t1o CHANGE FTS_DOC_ID foo_id BIGINT UNSIGNED NOT NULL, +DROP INDEX ct, ALGORITHM=INPLACE; + +SHOW CREATE TABLE t1o; + +DROP TABLE t1c, t1p, sys_tables, sys_indexes, sys_foreign; + +# Check the internal schemata of tt, t1o. + +CREATE TABLE sys_tables SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES +WHERE NAME='test/t1o'; +CREATE TABLE sys_indexes SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +CREATE TABLE sys_foreign SELECT i.* +FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN i WHERE FOR_NAME='test/t1o'; + +-- source suite/innodb/include/innodb_dict.inc + +# Ensure that there exists no hidden FTS_DOC_ID_INDEX on foo_id. + +ALTER TABLE t1o ADD UNIQUE INDEX FTS_DOC_ID_INDEX(FTS_DOC_ID), +ADD FULLTEXT INDEX(ct), +CHANGE foo_id FTS_DOC_ID BIGINT UNSIGNED NOT NULL; + +ALTER TABLE t1o DROP INDEX ct, DROP INDEX FTS_DOC_ID_INDEX, +CHANGE FTS_DOC_ID foo_id BIGINT UNSIGNED NOT NULL; + +ALTER TABLE t1o ADD UNIQUE INDEX FTS_DOC_ID_INDEX(foo_id); + +# FIXME: MDEV-9469 'Incorrect key file' on ALTER TABLE +call mtr.add_suppression("InnoDB: No matching column for `FTS_DOC_ID` in index `ct` of table `test`\\.`t1o`"); +--error ER_NOT_KEYFILE +ALTER TABLE t1o CHANGE foo_id FTS_DOC_ID BIGINT UNSIGNED NOT NULL, +ADD FULLTEXT INDEX(ct); +# FIXME: MDEV-9469 (enable this) +#--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +#ALTER TABLE t1o CHANGE FTS_DOC_ID foo_id BIGINT UNSIGNED NOT NULL, +#ALGORITHM=INPLACE; +#end of MDEV-9469 FIXME + +DROP TABLE sys_indexes; +CREATE TABLE sys_indexes SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; + +-- source suite/innodb/include/innodb_dict.inc + +DROP TABLE tt, t1o, sys_tables, sys_indexes, sys_foreign; + +CREATE TABLE t (t TEXT, FULLTEXT(t)) ENGINE=InnoDB; +DROP INDEX t ON t; + +LET $regexp=/FTS_([0-9a-f_]+)([A-Z_]+)/FTS_AUX_\2/; +--replace_regex $regexp +SELECT SUBSTRING(name, LOCATE('_', name) - 3, 5) AS prefix, name +FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES +WHERE name LIKE '%FTS_%' ORDER BY 1, 2; + +SELECT sc.pos, sc.NAME FROM information_schema.innodb_sys_columns sc +INNER JOIN information_schema.innodb_sys_tables st +ON sc.TABLE_ID=st.TABLE_ID +WHERE st.NAME='test/t'; + +ALTER TABLE t ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE; + +--replace_regex $regexp +SELECT SUBSTRING(name, LOCATE('_', name) - 3, 5) AS prefix, name +FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES +WHERE name LIKE '%FTS_%' ORDER BY 1, 2; + +ALTER TABLE t ADD FULLTEXT INDEX(t); + +SELECT sc.pos, sc.NAME FROM information_schema.innodb_sys_columns sc +INNER JOIN information_schema.innodb_sys_tables st +ON sc.TABLE_ID=st.TABLE_ID +WHERE st.NAME='test/t'; + +DROP TABLE t; + +--disable_query_log +call mtr.add_suppression("deleting orphaned .ibd file"); +--enable_query_log + +--echo # +--echo # Bug #19465984 INNODB DATA DICTIONARY IS NOT UPDATED WHILE +--echo # RENAMING THE COLUMN +--echo # +CREATE TABLE t1(c1 INT NOT NULL, PRIMARY KEY(c1))ENGINE=INNODB; +CREATE TABLE t2(c2 INT NOT NULL, FOREIGN KEY(c2) REFERENCES t1(c1))ENGINE=INNODB; +SHOW CREATE TABLE t1; +SHOW CREATE TABLE t2; +ALTER TABLE t1 CHANGE COLUMN c1 C1 INT; +SHOW CREATE TABLE t1; +SHOW CREATE TABLE t2; +# FIXME: MDEV-13671 InnoDB should use case-insensitive column name comparisons +# like the rest of the server +#ALTER TABLE t1 CHANGE COLUMN C1 c5 INT; +SHOW CREATE TABLE t1; +SHOW CREATE TABLE t2; +DROP TABLE t2, t1; + +--echo # +--echo # BUG 20029625 - HANDLE_FATAL_SIGNAL (SIG=11) IN +--echo # DICT_MEM_TABLE_COL_RENAME_LOW +--echo # +CREATE TABLE parent(a INT, b INT, KEY(a, b)) ENGINE = InnoDB; +CREATE TABLE t1(a1 INT, a2 INT) ENGINE = InnoDB; + +set foreign_key_checks=0; +ALTER TABLE t1 ADD CONSTRAINT fk_a FOREIGN KEY(a1, a2) REFERENCES parent(a, b) ON DELETE SET NULL ON UPDATE CASCADE; + +ALTER TABLE t1 CHANGE a2 a3 INT,ADD CONSTRAINT fk_1 FOREIGN KEY(a1, a3) REFERENCES parent(a, b) ON DELETE SET NULL ON UPDATE CASCADE; +SHOW CREATE TABLE t1; +CHECK TABLE t1; + +ALTER TABLE t1 CHANGE a3 a4 INT; +SHOW CREATE TABLE t1; +CHECK TABLE t1; + +ALTER TABLE parent CHANGE b c INT; +SHOW CREATE TABLE t1; +CHECK TABLE t1; + +DROP TABLE t1, parent; + +--echo # +--echo #BUG#21514135 SCHEMA MISMATCH ERROR WHEN IMPORTING TABLESPACE AFTER +--echo #DROPPING AN INDEX +--echo # +let $source_db = source_db; +let $dest_db = dest_db; + +eval CREATE DATABASE $source_db; +eval CREATE DATABASE $dest_db; + +eval CREATE TABLE $source_db.t1 ( + id int(11) NOT NULL, + age int(11) DEFAULT NULL, + name varchar(20), + PRIMARY KEY (id), + KEY index1 (age) + ) ENGINE=InnoDB; + +eval ALTER TABLE $source_db.t1 DROP INDEX index1, ADD INDEX index2(name, age), algorithm=inplace; + +--source suite/innodb/include/import.inc + +eval ALTER TABLE $source_db.t1 DROP INDEX index2, algorithm=inplace; + +--source suite/innodb/include/import.inc + +eval DROP TABLE $source_db.t1; +eval DROP DATABASE $source_db; +eval DROP DATABASE $dest_db; + + + diff --git a/mysql-test/suite/innodb/t/innodb-blob.test b/mysql-test/suite/innodb/t/innodb-blob.test index d2484e2175d..1c91305b0ee 100644 --- a/mysql-test/suite/innodb/t/innodb-blob.test +++ b/mysql-test/suite/innodb/t/innodb-blob.test @@ -139,6 +139,14 @@ SET DEBUG_SYNC='now WAIT_FOR have_latch'; SELECT info FROM information_schema.processlist WHERE state = 'debug sync point: before_row_upd_extern'; +connect (con3,localhost,root,,); +SET GLOBAL innodb_flush_log_at_trx_commit=1; +DELETE FROM t1; +ROLLBACK; +disconnect con3; + +connection con2; + --let $shutdown_timeout=0 --source include/restart_mysqld.inc diff --git a/mysql-test/suite/innodb/t/innodb-enlarge-blob.opt b/mysql-test/suite/innodb/t/innodb-enlarge-blob.opt new file mode 100644 index 00000000000..7cc886cb9e5 --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb-enlarge-blob.opt @@ -0,0 +1,5 @@ +--innodb-file-per-table +--innodb-file-format='Barracuda' +--innodb-buffer-pool-size=32M +--innodb-page-size=64k +--innodb-strict-mode=OFF diff --git a/mysql-test/suite/innodb/t/innodb-enlarge-blob.test b/mysql-test/suite/innodb/t/innodb-enlarge-blob.test new file mode 100644 index 00000000000..65a64d299be --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb-enlarge-blob.test @@ -0,0 +1,29 @@ +--source include/have_innodb.inc + +# +# MDEV-13227: Assertion failure len < 16384 in file rem0rec.cc line 1285 +# Crashes with innodb_page_size=64K. Does not crash at <= 32K. +# +CREATE TABLE t1 (a LONGTEXT) ENGINE=INNODB ROW_FORMAT=REDUNDANT; +SHOW WARNINGS; +INSERT INTO t1 SET a=CONCAT('A', SPACE(8000), 'B'); +INSERT INTO t1 SELECT a FROM t1; +UPDATE t1 SET a=CONCAT(a, RAND(), a); +UPDATE t1 SET a=CONCAT(a, RAND(), a); +# random data no output we are only interested if fails +--disable_result_log +SELECT * from t1; +--enable_result_log +DROP TABLE t1; + +CREATE TABLE t1 (a LONGTEXT) ENGINE=INNODB ROW_FORMAT=DYNAMIC; +SHOW WARNINGS; +INSERT INTO t1 SET a=CONCAT('A', SPACE(8000), 'B'); +INSERT INTO t1 SELECT a FROM t1; +UPDATE t1 SET a=CONCAT(a, RAND(), a); +UPDATE t1 SET a=CONCAT(a, RAND(), a); +# random data no output we are only interested if fails +--disable_result_log +SELECT * from t1; +--enable_result_log +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/innodb-index-debug.opt b/mysql-test/suite/innodb/t/innodb-index-debug.opt new file mode 100644 index 00000000000..778b4443d4f --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb-index-debug.opt @@ -0,0 +1 @@ +--innodb-sort-buffer-size=64k diff --git a/mysql-test/suite/innodb/t/innodb-index-debug.test b/mysql-test/suite/innodb/t/innodb-index-debug.test new file mode 100644 index 00000000000..6927120fd5b --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb-index-debug.test @@ -0,0 +1,129 @@ +-- source include/have_debug.inc +-- source include/have_innodb.inc +-- source include/count_sessions.inc +-- source include/have_debug_sync.inc + +let $MYSQLD_DATADIR= `select @@datadir`; + +# +# Test for BUG# 12739098, check whether trx->error_status is reset on error. +# +CREATE TABLE t1(c1 INT NOT NULL, c2 INT, PRIMARY KEY(c1)) Engine=InnoDB; +SHOW CREATE TABLE t1; +INSERT INTO t1 VALUES (1,1),(2,2),(3,3),(4,4),(5,5); + +SET @saved_debug_dbug = @@SESSION.debug_dbug; +SET DEBUG_DBUG='+d,ib_build_indexes_too_many_concurrent_trxs, ib_rename_indexes_too_many_concurrent_trxs, ib_drop_index_too_many_concurrent_trxs'; +--error ER_TOO_MANY_CONCURRENT_TRXS +ALTER TABLE t1 ADD UNIQUE INDEX(c2); +SET DEBUG_DBUG = @saved_debug_dbug; + +SHOW CREATE TABLE t1; +DROP TABLE t1; + +# +# Test for Bug#13861218 Records are not fully sorted during index creation +# +CREATE TABLE bug13861218 (c1 INT NOT NULL, c2 INT NOT NULL, INDEX(c2)) +ENGINE=InnoDB; +INSERT INTO bug13861218 VALUES (8, 0), (4, 0), (0, 0); +SET DEBUG_DBUG = '+d,ib_row_merge_buf_add_two'; +# Force creation of a PRIMARY KEY on c1 to see what happens on the index(c2). +# No crash here, because n_uniq for c2 includes the clustered index fields +CREATE UNIQUE INDEX ui ON bug13861218(c1); +SET DEBUG_DBUG = @saved_debug_dbug; +DROP TABLE bug13861218; + +CREATE TABLE bug13861218 (c1 INT NOT NULL, c2 INT UNIQUE) ENGINE=InnoDB; +INSERT INTO bug13861218 VALUES (8, NULL), (4, NULL), (0, NULL); +SET DEBUG_DBUG = '+d,ib_row_merge_buf_add_two'; +# Force creation of a PRIMARY KEY on c1 to see what happens on the index(c2). +# assertion failure: ut_ad(cmp_dtuple_rec(dtuple, rec, rec_offsets) > 0) +CREATE UNIQUE INDEX ui ON bug13861218(c1); +SET DEBUG_DBUG = @saved_debug_dbug; +DROP TABLE bug13861218; + +--echo # +--echo # Bug #17657223 EXCESSIVE TEMPORARY FILE USAGE IN ALTER TABLE +--echo # + +# Error during file creation in alter operation +create table t480(a serial)engine=innodb; +insert into t480 +values(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(), +(),(),(),(),(),(),(),(); +insert into t480 select 0 from t480; +insert into t480 select 0 from t480; +insert into t480 select 0 from t480; +insert into t480 select 0 from t480; + +# Error during file write in alter operation. +create table t1(f1 int auto_increment not null, + f2 char(200) not null, f3 char(200) not null, + primary key(f1,f2,f3), key(f1))engine=innodb; +insert into t1 select NULL,'aaa','bbb' from t480; +insert into t1 select NULL,'aaaa','bbbb' from t480; +insert into t1 select NULL,'aaaaa','bbbbb' from t480; +insert into t1 select NULL,'aaaaaa','bbbbbb' from t480; +SET DEBUG_DBUG = '+d,row_merge_write_failure'; +--error ER_TEMP_FILE_WRITE_FAILURE +alter table t1 drop primary key,add primary key(f2,f1); +SET DEBUG_DBUG = @saved_debug_dbug; +drop table t1; + +# Optimize table via inplace algorithm +connect (con1,localhost,root); +create table t1(k1 int auto_increment primary key, +k2 char(200),k3 char(200))engine=innodb; +insert into t1 values(NULL,'a','b'), (NULL,'aa','bb'); +SET DEBUG_SYNC= 'row_merge_after_scan +SIGNAL opened WAIT_FOR flushed'; +send optimize table t1; +connection default; +SET DEBUG_SYNC= 'now WAIT_FOR opened'; +INSERT INTO t1 select NULL,'aaa','bbb' from t480; +SET DEBUG_SYNC= 'now SIGNAL flushed'; +connection con1; +--enable_info +--echo /*con1 reap*/ Optimize table t1; +reap; +--disable_info +SELECT COUNT(k1),k2,k3 FROM t1 GROUP BY k2,k3; +drop table t1; + +# Log file creation failure. +create table t1(k1 int auto_increment primary key, +k2 char(200),k3 char(200))engine=innodb; +SET DEBUG_SYNC= 'row_merge_after_scan +SIGNAL opened WAIT_FOR flushed'; +send ALTER TABLE t1 ADD COLUMN k4 int; +connection default; +SET DEBUG_SYNC= 'now WAIT_FOR opened'; +SET debug = '+d,row_log_tmpfile_fail'; +INSERT INTO t1 select NULL,'aaa','bbb' from t480; +INSERT INTO t1 select NULL,'aaaa','bbbb' from t480; +SET DEBUG_SYNC= 'now SIGNAL flushed'; +SET DEBUG_DBUG = @saved_debug_dbug; +connection con1; +--echo /*con1 reap*/ ALTER TABLE t1 ADD COLUMN k4 int; +--error ER_OUT_OF_RESOURCES +reap; +SELECT COUNT(k1),k2,k3 FROM t1 GROUP BY k2,k3; +disconnect con1; +connection default; +show create table t1; +drop table t1; +drop table t480; +SET DEBUG_SYNC='RESET'; +--source include/wait_until_count_sessions.inc + +--echo # +--echo # BUG#21612714 ALTER TABLE SORTING SKIPPED WHEN CHANGE PK AND DROP +--echo # LAST COLUMN OF OLD PK +--echo # + +SET DEBUG_DBUG = '+d,innodb_alter_table_pk_assert_no_sort'; + +--source suite/innodb/include/alter_table_pk_no_sort.inc + +SET DEBUG_DBUG = @saved_debug_dbug; diff --git a/mysql-test/suite/innodb/t/innodb-index-online-delete.test b/mysql-test/suite/innodb/t/innodb-index-online-delete.test new file mode 100644 index 00000000000..ec5f93731ed --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb-index-online-delete.test @@ -0,0 +1,36 @@ +--source include/have_innodb.inc +--source include/have_debug_sync.inc + +# Save the initial number of concurrent sessions. +--source include/count_sessions.inc + +connect (con1,localhost,root,,); + +connection default; + +CREATE TABLE t (a INT PRIMARY KEY, b INT NOT NULL) ENGINE=InnoDB; +INSERT INTO t VALUES(1,2),(2,3); + +SET DEBUG_SYNC='alter_table_inplace_after_lock_downgrade SIGNAL do WAIT_FOR m'; +SET DEBUG_SYNC='innodb_after_inplace_alter_table SIGNAL scanned WAIT_FOR done'; +--send +CREATE INDEX tb ON t(b); + +connection con1; +SET DEBUG_SYNC='now WAIT_FOR do'; +SET DEBUG_SYNC='row_update_for_mysql_error SIGNAL m WAIT_FOR scanned'; +--error ER_DUP_ENTRY +UPDATE t SET a=2 WHERE a=1; +call mtr.add_suppression('InnoDB: record in index .*tb was not found on rollback, trying to insert'); +SET DEBUG_SYNC='now SIGNAL done'; + +disconnect con1; + +connection default; +reap; +SET DEBUG_SYNC='RESET'; +DROP TABLE t; + +# Check that all connections opened by test cases in this file are really +# gone so execution of other tests won't be affected by their presence. +--source include/wait_until_count_sessions.inc diff --git a/mysql-test/suite/innodb/t/innodb-index-online-fk.opt b/mysql-test/suite/innodb/t/innodb-index-online-fk.opt new file mode 100644 index 00000000000..345d5529dce --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb-index-online-fk.opt @@ -0,0 +1,4 @@ +--loose-innodb-sys-tables +--loose-innodb-sys-columns +--loose-innodb-sys-foreign +--loose-innodb-sys-foreign-cols diff --git a/mysql-test/suite/innodb/t/innodb-index-online-fk.test b/mysql-test/suite/innodb/t/innodb-index-online-fk.test new file mode 100644 index 00000000000..5c8954064ce --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb-index-online-fk.test @@ -0,0 +1,484 @@ +--source include/have_innodb.inc +--source include/have_debug.inc + +CREATE TABLE parent (a INT PRIMARY KEY, b INT NOT NULL) ENGINE = InnoDB; +INSERT INTO parent VALUES(1,2),(2,3); + +CREATE INDEX tb ON parent(b); + +INSERT INTO parent VALUES(10,20),(20,30); + +CREATE TABLE child (a1 INT PRIMARY KEY, a2 INT) ENGINE = InnoDB; + +CREATE INDEX tb ON child(a2); + +INSERT INTO child VALUES(10,20); + +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE child ADD FOREIGN KEY(a2) REFERENCES parent(b), +ALGORITHM = INPLACE; + +SET foreign_key_checks = 0; + +ALTER TABLE child ADD CONSTRAINT fk_1 FOREIGN KEY (a2) +REFERENCES parent(b) ON DELETE SET NULL ON UPDATE CASCADE, +ALGORITHM = INPLACE; + +SELECT * FROM information_schema.INNODB_SYS_FOREIGN; + +SELECT * FROM information_schema.INNODB_SYS_FOREIGN_COLS; + +# duplicated foreign key name +--error ER_DUP_CONSTRAINT_NAME +ALTER TABLE child ADD CONSTRAINT fk_1 FOREIGN KEY (a2) +REFERENCES parent(b) ON DELETE SET NULL ON UPDATE CASCADE, +ALGORITHM = INPLACE; + +SET foreign_key_checks = 1; + +INSERT INTO child VALUES(1,2),(2,3); + +--error ER_NO_REFERENCED_ROW_2 +INSERT INTO child VALUES(4,4); + +SELECT * FROM parent; + +SET foreign_key_checks = 0; + +# This would fail. No corresponding index +--error ER_FK_NO_INDEX_PARENT +ALTER TABLE child ADD CONSTRAINT fk_20 FOREIGN KEY (a1, a2) +REFERENCES parent(a, b) ON DELETE CASCADE ON UPDATE CASCADE, +ALGORITHM = INPLACE; + +SHOW WARNINGS; + +SHOW ERRORS; + +CREATE INDEX idx1 on parent(a, b); + +ALTER TABLE child ADD CONSTRAINT fk_10 FOREIGN KEY (a1, a2) +REFERENCES parent(a, b) ON DELETE CASCADE ON UPDATE CASCADE, +ALGORITHM = INPLACE; + +# This should be successful, as we added the index +ALTER TABLE child ADD CONSTRAINT fk_2 FOREIGN KEY (a1, a2) +REFERENCES parent(a, b) ON DELETE CASCADE ON UPDATE CASCADE, ADD INDEX idx1(a1,a2), +ALGORITHM = INPLACE; + +ALTER TABLE child ADD CONSTRAINT fk_3 FOREIGN KEY (a1, a2) +REFERENCES parent(a, b) ON DELETE CASCADE ON UPDATE CASCADE; + +SELECT * FROM information_schema.INNODB_SYS_FOREIGN; + +SELECT * FROM information_schema.INNODB_SYS_FOREIGN_COLS; + +SET foreign_key_checks = 1; + +--error ER_NO_REFERENCED_ROW_2 +INSERT INTO child VALUES(5,4); + +SHOW CREATE TABLE child; + +DELETE FROM parent where a = 1; + +SELECT * FROM child; + +# Now test referenced table cannot be opened. This should work fine +# when foreign_key_checks is set to 0 + +SET foreign_key_checks = 0; + +# This is to test the scenario we cannot open the referenced table. +# Since foreign_key_checks is set to 0, the foreign key should still +# be added. +SET @saved_debug_dbug = @@SESSION.debug_dbug; +SET DEBUG_DBUG = '+d,innodb_test_open_ref_fail'; +ALTER TABLE child ADD CONSTRAINT fk_4 FOREIGN KEY (a1, a2) +REFERENCES parent(a, b) ON DELETE CASCADE ON UPDATE CASCADE, +ALGORITHM = INPLACE; +SET DEBUG_DBUG = @saved_debug_dbug; + +SELECT * FROM information_schema.INNODB_SYS_FOREIGN; + +SELECT * FROM information_schema.INNODB_SYS_FOREIGN_COLS; + +SELECT t2.name, t1.name FROM information_schema.innodb_sys_columns t1, information_schema.innodb_sys_tables t2 WHERE t1.table_id = t2.table_id AND t2.name LIKE "%child" ORDER BY t1.name; + +SELECT NAME FROM information_schema.INNODB_SYS_TABLES; + +# this should succeed, since we disabled the foreign key check +INSERT INTO child VALUES(5,4); + +SET foreign_key_checks = 1; + +--error ER_NO_REFERENCED_ROW_2 +INSERT INTO child VALUES(6,5); + +SET foreign_key_checks = 0; + +# Create some table with 'funny' characters, for testing the +# error message +CREATE TABLE `#parent` (a INT PRIMARY KEY, b INT NOT NULL) ENGINE = InnoDB; + +CREATE INDEX tb ON `#parent`(a, b); + +CREATE TABLE `#child` (a1 INT PRIMARY KEY, a2 INT) ENGINE = InnoDB; + +CREATE INDEX tb ON `#child`(a1, a2); + +# This is to test the scenario no foreign index, alter table should fail +SET DEBUG_DBUG = '+d,innodb_test_no_foreign_idx'; +--error ER_FK_NO_INDEX_CHILD, +ALTER TABLE `#child` ADD CONSTRAINT fk_40 FOREIGN KEY (a1, a2) +REFERENCES `#parent`(a, b) ON DELETE CASCADE ON UPDATE CASCADE, +ALGORITHM = INPLACE; +SET DEBUG_DBUG = @saved_debug_dbug; + +SHOW ERRORS; + +SELECT * FROM information_schema.INNODB_SYS_FOREIGN; + +SELECT * FROM information_schema.INNODB_SYS_FOREIGN_COLS; + +# This is to test the scenario no index on referenced table, +# alter table should fail +SET DEBUG_DBUG = '+d,innodb_test_no_reference_idx'; +--error ER_FK_NO_INDEX_PARENT, +ALTER TABLE child ADD CONSTRAINT fk_42 FOREIGN KEY (a1, a2) +REFERENCES parent(a, b) ON DELETE CASCADE ON UPDATE CASCADE, +ALGORITHM = INPLACE; +SET DEBUG_DBUG = @saved_debug_dbug; + +SHOW ERRORS; + +# This is to test the scenario no index on referenced table, +# alter table should fail +SET DEBUG_DBUG = '+d,innodb_test_wrong_fk_option'; +--error ER_FK_INCORRECT_OPTION +ALTER TABLE child ADD CONSTRAINT fk_42 FOREIGN KEY (a1, a2) +REFERENCES parent(a, b) ON DELETE CASCADE ON UPDATE CASCADE, +ALGORITHM = INPLACE; +SET DEBUG_DBUG = @saved_debug_dbug; + +SELECT * FROM information_schema.INNODB_SYS_FOREIGN; + +SELECT * FROM information_schema.INNODB_SYS_FOREIGN_COLS; + +# This is to test the scenario cannot add fk to the system table, +# alter table should fail +SET DEBUG_DBUG = '+d,innodb_test_cannot_add_fk_system'; +--error ER_FK_FAIL_ADD_SYSTEM +ALTER TABLE `#child` ADD CONSTRAINT fk_43 FOREIGN KEY (a1, a2) +REFERENCES `#parent`(a, b) ON DELETE CASCADE ON UPDATE CASCADE, +ALGORITHM = INPLACE; +SET DEBUG_DBUG = @saved_debug_dbug; + +SHOW ERRORS; + +DROP TABLE `#child`; +DROP TABLE `#parent`; + +# Now test add multiple foreign key constrain in a single clause +SET foreign_key_checks = 0; + +ALTER TABLE child ADD CONSTRAINT fk_5 FOREIGN KEY (a2) REFERENCES parent(b) +ON DELETE SET NULL ON UPDATE CASCADE, +ADD CONSTRAINT fk_6 FOREIGN KEY (a1, a2) +REFERENCES parent(a, b) ON DELETE CASCADE ON UPDATE CASCADE, +ALGORITHM = INPLACE; + +SELECT * FROM information_schema.INNODB_SYS_FOREIGN; + +SELECT * FROM information_schema.INNODB_SYS_FOREIGN_COLS; + +DROP TABLE child; +DROP TABLE parent; + +# Test a case where child's foreign key index is being dropped in the +# same clause of adding the foreign key. In theory, MySQL will +# automatically create a new index to meet the index requirement +CREATE TABLE parent (a INT PRIMARY KEY, b INT NOT NULL) ENGINE = InnoDB; + +INSERT INTO parent VALUES(1,2),(2,3); + +CREATE INDEX tb ON parent(b); + +INSERT INTO parent VALUES(10,20),(20,30); + +CREATE TABLE child (a1 INT PRIMARY KEY, a2 INT) ENGINE = InnoDB; + +CREATE INDEX tb ON child(a2); + +INSERT INTO child VALUES(10,20); + +SET foreign_key_checks = 0; + +ALTER TABLE child DROP INDEX tb, ADD CONSTRAINT fk_4 FOREIGN KEY (a2) +REFERENCES parent(b) ON DELETE CASCADE ON UPDATE CASCADE, +ALGORITHM = INPLACE; + +SHOW CREATE TABLE child; + +SELECT * FROM information_schema.INNODB_SYS_FOREIGN; + +SELECT * FROM information_schema.INNODB_SYS_FOREIGN_COLS; + +SET foreign_key_checks = 1; + +DROP TABLE child; + +DROP TABLE parent; + +# Test ADD FOREIGN KEY together with renaming columns. +CREATE TABLE parent (a INT PRIMARY KEY, b INT NOT NULL) ENGINE = InnoDB; + +INSERT INTO parent VALUES(1,2),(2,3); + +CREATE INDEX tb ON parent(b); + +INSERT INTO parent VALUES(10,20),(20,30); + +CREATE TABLE child (a1 INT PRIMARY KEY, a2 INT) ENGINE = InnoDB; + +CREATE INDEX tb ON child(a2); + +SET foreign_key_checks = 0; + +--error ER_KEY_COLUMN_DOES_NOT_EXITS +ALTER TABLE child CHANGE a2 a3 INT, +ADD CONSTRAINT fk_1 FOREIGN KEY (a2) REFERENCES parent(b) +ON DELETE SET NULL ON UPDATE CASCADE, +ALGORITHM = INPLACE; + +ALTER TABLE child CHANGE a2 a3 INT, +ADD CONSTRAINT fk_1 FOREIGN KEY (a3) REFERENCES parent(b) +ON DELETE SET NULL ON UPDATE CASCADE, +ALGORITHM = INPLACE; + +DROP TABLE child; + +DROP TABLE parent; + +# Add test for add Primary key and FK on changing columns +CREATE TABLE parent (a INT PRIMARY KEY, b INT NOT NULL) ENGINE = InnoDB; +INSERT INTO parent VALUES(1,2),(2,3); + +CREATE INDEX tb ON parent(b); + +INSERT INTO parent VALUES(10,20),(20,30); + +CREATE TABLE child (a1 INT NOT NULL, a2 INT) ENGINE = InnoDB; + +CREATE INDEX tb ON child(a2); + +SET foreign_key_checks = 0; + +# Let's rebuild the table and add the FK, make the add FK failed. + +SET DEBUG_DBUG = '+d,innodb_test_cannot_add_fk_system'; +--error ER_FK_FAIL_ADD_SYSTEM +ALTER TABLE child ADD PRIMARY KEY idx (a3), CHANGE a1 a3 INT, +ADD CONSTRAINT fk_1 FOREIGN KEY (a2) REFERENCES parent(b) +ON DELETE SET NULL ON UPDATE CASCADE, +ALGORITHM = INPLACE; +SET DEBUG_DBUG = @saved_debug_dbug; + +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN; +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS; +SELECT t2.name, t1.name FROM information_schema.innodb_sys_columns t1, information_schema.innodb_sys_tables t2 WHERE t1.table_id = t2.table_id AND t2.name LIKE "%child" ORDER BY t1.name; +SELECT NAME FROM information_schema.INNODB_SYS_TABLES; + +# This should be successful. It will also check any left over +# from previous failed operation (if dictionary entries not cleaned, +# it will have dup key error. +ALTER TABLE child ADD PRIMARY KEY idx (a3), CHANGE a1 a3 INT, +ADD CONSTRAINT fk_1 FOREIGN KEY (a2) REFERENCES parent(b) +ON DELETE SET NULL ON UPDATE CASCADE, +ALGORITHM = INPLACE; + +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN; +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS; +SELECT t2.name, t1.name FROM information_schema.innodb_sys_columns t1, information_schema.innodb_sys_tables t2 WHERE t1.table_id = t2.table_id AND t2.name LIKE "%child" ORDER BY t1.name; +SELECT NAME FROM information_schema.INNODB_SYS_TABLES; + +SHOW CREATE TABLE child; + +DROP TABLE child; + +CREATE TABLE child (a1 INT NOT NULL, a2 INT) ENGINE = InnoDB; + +# Now try primary index and FK +ALTER TABLE child ADD PRIMARY KEY idx (a1), +ADD CONSTRAINT fk_1 FOREIGN KEY (a2) REFERENCES parent(b) +ON DELETE SET NULL ON UPDATE CASCADE, +ALGORITHM = INPLACE; + +SELECT * from information_schema.INNODB_SYS_FOREIGN; +SELECT * from information_schema.INNODB_SYS_FOREIGN_COLS; +SELECT t2.name, t1.name FROM information_schema.innodb_sys_columns t1, information_schema.innodb_sys_tables t2 WHERE t1.table_id = t2.table_id AND t2.name LIKE "%child" ORDER BY t1.name; +SELECT NAME FROM information_schema.INNODB_SYS_TABLES; + +SHOW CREATE TABLE child; + +DROP TABLE child; + +CREATE TABLE child (a1 INT NOT NULL, a2 INT) ENGINE = InnoDB; + +ALTER TABLE child CHANGE a1 a3 INT, +ADD CONSTRAINT fk_1 FOREIGN KEY (a3) REFERENCES parent(b) +ON DELETE SET NULL ON UPDATE CASCADE, +ALGORITHM = INPLACE; + +SELECT * from information_schema.INNODB_SYS_FOREIGN; +SELECT * from information_schema.INNODB_SYS_FOREIGN_COLS; +SELECT t2.name, t1.name FROM information_schema.innodb_sys_columns t1, information_schema.innodb_sys_tables t2 WHERE t1.table_id = t2.table_id AND t2.name LIKE "%child" ORDER BY t1.name; +SELECT NAME FROM information_schema.INNODB_SYS_TABLES; + +SHOW CREATE TABLE child; + +DROP TABLE child; + +CREATE TABLE child (a1 INT NOT NULL, a2 INT) ENGINE = InnoDB; +# Now try all three +--error ER_FK_INCORRECT_OPTION +ALTER TABLE child ADD PRIMARY KEY idx (a3), CHANGE a1 a3 INT, +ADD CONSTRAINT fk_1 FOREIGN KEY (a3) REFERENCES parent(b) +ON DELETE SET NULL ON UPDATE CASCADE, +ALGORITHM = INPLACE; + +DROP TABLE parent; +DROP TABLE child; + +CREATE TABLE parent (a INT PRIMARY KEY, b INT NOT NULL, c INT) ENGINE = InnoDB; +INSERT INTO parent VALUES(1,2,3),(2,3,4); + +CREATE INDEX tb ON parent(b); + +CREATE TABLE child (a1 INT NOT NULL, a2 INT, a3 INT) ENGINE = InnoDB; +CREATE INDEX tb ON child(a2); + +ALTER TABLE child +ADD CONSTRAINT fk_a FOREIGN KEY (a2) REFERENCES parent(b) +ON DELETE SET NULL ON UPDATE CASCADE, +ALGORITHM = INPLACE; + +ALTER TABLE child +ADD CONSTRAINT fk_b FOREIGN KEY (a1) REFERENCES parent(a), +ALGORITHM = INPLACE; + +ALTER TABLE child CHANGE a2 a2_new INT, CHANGE a1 a1_new INT; + +SHOW CREATE TABLE child; + +SELECT * from information_schema.INNODB_SYS_FOREIGN; +SELECT * from information_schema.INNODB_SYS_FOREIGN_COLS; + +# The third add FK will fail +--error ER_FK_NO_INDEX_PARENT +ALTER TABLE child +ADD CONSTRAINT fk_new_1 FOREIGN KEY (a1_new) REFERENCES parent(b), +ADD CONSTRAINT fk_new_2 FOREIGN KEY (a2_new) REFERENCES parent(a), +ADD CONSTRAINT fk_new_3 FOREIGN KEY (a3) REFERENCES parent(c), +ALGORITHM = INPLACE; + +# It should still have only 2 FKs +SHOW CREATE TABLE child; + +SELECT * from information_schema.INNODB_SYS_FOREIGN; + +SELECT * from information_schema.INNODB_SYS_FOREIGN_COLS; + +#Now let's make it successful +ALTER TABLE child +ADD CONSTRAINT fk_new_1 FOREIGN KEY (a1_new) REFERENCES parent(b), +ADD CONSTRAINT fk_new_2 FOREIGN KEY (a2_new) REFERENCES parent(a), +ADD CONSTRAINT fk_new_3 FOREIGN KEY (a3) REFERENCES parent(a), +ALGORITHM = INPLACE; + +# It should still have 5 FKs +SHOW CREATE TABLE child; + +SELECT * from information_schema.INNODB_SYS_FOREIGN; + +SELECT * from information_schema.INNODB_SYS_FOREIGN_COLS; + +DROP TABLE child; +CREATE TABLE child (a1 INT NOT NULL, a2 INT, a3 INT) ENGINE = InnoDB; +CREATE INDEX tb ON child(a2); + +# Let's try this 3rd fk failure with add primary index +--error ER_FK_NO_INDEX_PARENT +ALTER TABLE child ADD PRIMARY KEY idx (a1), +ADD CONSTRAINT fk_new_1 FOREIGN KEY (a1) REFERENCES parent(b), +ADD CONSTRAINT fk_new_2 FOREIGN KEY (a2) REFERENCES parent(a), +ADD CONSTRAINT fk_new_3 FOREIGN KEY (a3) REFERENCES parent(c), +ALGORITHM = INPLACE; + +# It should still have no FKs, no PRIMARY +SHOW CREATE TABLE child; + +SELECT * from information_schema.INNODB_SYS_FOREIGN; + +SELECT * from information_schema.INNODB_SYS_FOREIGN_COLS; + +# make it successful +ALTER TABLE child ADD PRIMARY KEY idx (a1), +ADD CONSTRAINT fk_new_1 FOREIGN KEY (a1) REFERENCES parent(b), +ADD CONSTRAINT fk_new_2 FOREIGN KEY (a2) REFERENCES parent(a), +ADD CONSTRAINT fk_new_3 FOREIGN KEY (a3) REFERENCES parent(a), +ALGORITHM = INPLACE; + +# It should have 3 FKs, a new PRIMARY +SHOW CREATE TABLE child; + +SELECT * from information_schema.INNODB_SYS_FOREIGN; + +SELECT * from information_schema.INNODB_SYS_FOREIGN_COLS; + +SET foreign_key_checks = 1; + +DROP TABLE child; +DROP TABLE parent; + +CREATE TABLE Parent (a INT PRIMARY KEY, b INT NOT NULL) ENGINE = InnoDB; +INSERT INTO Parent VALUES(1,2),(2,3); + +CREATE INDEX tb ON Parent(b); + +INSERT INTO Parent VALUES(10,20),(20,30); + +CREATE TABLE Child (a1 INT PRIMARY KEY, a2 INT) ENGINE = InnoDB; + +CREATE INDEX tb ON Child(a2); + +INSERT INTO Child VALUES(10,20); + +SET foreign_key_checks = 0; + +ALTER TABLE Child ADD CONSTRAINT fk_1 FOREIGN KEY (a2) +REFERENCES Parent(b) ON DELETE SET NULL ON UPDATE CASCADE, +ALGORITHM = INPLACE; + +DROP TABLE Child; +DROP TABLE Parent; + +# This is the test for bug 14594526 - FK: ASSERTION IN +# DICT_TABLE_CHECK_FOR_DUP_INDEXES +CREATE TABLE `t2`(a int,c int,d int) ENGINE=INNODB; +CREATE TABLE `t3`(a int,c int,d int) ENGINE=INNODB; +CREATE INDEX idx ON t3(a); + +ALTER TABLE `t2` ADD CONSTRAINT `fw` FOREIGN KEY (`c`) REFERENCES t3 (a); + +ALTER TABLE `t2` ADD CONSTRAINT `e` foreign key (`d`) REFERENCES t3(a); + +--error ER_FK_FAIL_ADD_SYSTEM +ALTER TABLE `t3` ADD CONSTRAINT `e` foreign key (`c`) REFERENCES `t2`(`c`) ON UPDATE SET NULL; + +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN; +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS; + +DROP TABLE t2; + +DROP TABLE t3; diff --git a/mysql-test/suite/innodb/t/innodb-index-online-purge.test b/mysql-test/suite/innodb/t/innodb-index-online-purge.test new file mode 100644 index 00000000000..28ff9403c0c --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb-index-online-purge.test @@ -0,0 +1,73 @@ +--source include/have_innodb.inc +--source include/have_debug_sync.inc + +# Save the initial number of concurrent sessions. +--source include/count_sessions.inc + +connect (con1,localhost,root,,); + +connect (con2,localhost,root,,); +connection default; + +CREATE TABLE t (a INT PRIMARY KEY, c TEXT) ENGINE=InnoDB; +CREATE TABLE u (a INT PRIMARY KEY, b INT, c INT NOT NULL) ENGINE=InnoDB; + +INSERT INTO t VALUES (1,'aa'); +BEGIN; +INSERT INTO u SET a=1, c=1; +INSERT INTO u SELECT a+1,NULL,a+1 FROM u; +INSERT INTO u SELECT a+2,NULL,a+2 FROM u; +INSERT INTO u SELECT a+4,NULL,a+4 FROM u; +INSERT INTO u SELECT a+8,NULL,a+8 FROM u; +INSERT INTO u SELECT a+16,NULL,a+16 FROM u; +INSERT INTO u SELECT a+32,NULL,a+32 FROM u; +INSERT INTO u SELECT a+64,NULL,a+64 FROM u; +INSERT INTO u SELECT a+128,NULL,a+64 FROM u; +INSERT INTO u SELECT a+256,NULL,a+64 FROM u; +COMMIT; + +BEGIN; +DELETE FROM u; + +connection con2; +SET DEBUG_SYNC='row_log_apply_before SIGNAL created_u WAIT_FOR dml_done_u'; +--send +ALTER TABLE u ADD INDEX (c); + +connection default; +# Check that the above SELECT is blocked +let $wait_condition= + SELECT COUNT(*) = 1 from information_schema.processlist + WHERE state = 'Waiting for table metadata lock' AND + info = 'ALTER TABLE u ADD INDEX (c)'; +--source include/wait_condition.inc + +COMMIT; +SET DEBUG_SYNC='now WAIT_FOR created_u'; +SELECT state FROM information_schema.processlist +WHERE info='ALTER TABLE u ADD INDEX (c)'; + +connection con1; +SET DEBUG_SYNC='row_log_apply_before SIGNAL created_t WAIT_FOR dml_done_t'; +--send +CREATE INDEX c1 ON t (c(1)); +connection default; +SET DEBUG_SYNC='now WAIT_FOR created_t'; +UPDATE t SET c='ab'; +# Allow purge to kick in. TODO: Trigger this faster, somehow. +SELECT SLEEP(10); +SET DEBUG_SYNC='now SIGNAL dml_done_u'; +connection con2; +reap; +SET DEBUG_SYNC='now SIGNAL dml_done_t'; +disconnect con2; +connection con1; +reap; +disconnect con1; +connection default; +SET DEBUG_SYNC='RESET'; +DROP TABLE t,u; + +# Check that all connections opened by test cases in this file are really +# gone so execution of other tests won't be affected by their presence. +--source include/wait_until_count_sessions.inc diff --git a/mysql-test/suite/innodb/t/innodb-index-online.opt b/mysql-test/suite/innodb/t/innodb-index-online.opt new file mode 100644 index 00000000000..ff20edbe2f7 --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb-index-online.opt @@ -0,0 +1,6 @@ +--loose-innodb-sort-buffer-size=64k +--loose-innodb-online-alter-log-max-size=128k +--loose-innodb-buffer-pool-size=5M +--loose-innodb-log-buffer-size=256k +--loose-innodb-sys-indexes +--loose-innodb-sys-fields diff --git a/mysql-test/suite/innodb/t/innodb-index-online.test b/mysql-test/suite/innodb/t/innodb-index-online.test new file mode 100644 index 00000000000..efd700498c6 --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb-index-online.test @@ -0,0 +1,484 @@ +--source include/innodb_page_size_small.inc +--source include/innodb_encrypt_log.inc +--source include/have_debug_sync.inc + +let $innodb_metrics_select= +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; + +call mtr.add_suppression("InnoDB: Warning: Small buffer pool size"); + +# DISCARD TABLESPACE needs file-per-table +SET @global_innodb_file_per_table_orig = @@global.innodb_file_per_table; +SET GLOBAL innodb_file_per_table = on; + +# Save the initial number of concurrent sessions. +--source include/count_sessions.inc + +CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT, c3 TEXT) +ENGINE=InnoDB STATS_PERSISTENT=0; +INSERT INTO t1 VALUES (1,1,''), (2,2,''), (3,3,''), (4,4,''), (5,5,''); + +SET GLOBAL innodb_monitor_enable = module_ddl; +eval $innodb_metrics_select; + +SET DEBUG_SYNC = 'RESET'; +SET DEBUG_SYNC = 'write_row_noreplace SIGNAL have_handle WAIT_FOR go_ahead'; +--send +INSERT INTO t1 VALUES(1,2,3); + +connect (con1,localhost,root,,); +connection con1; + +# This should block at the end because of the INSERT in connection default +# is holding a metadata lock. +SET DEBUG_SYNC = 'now WAIT_FOR have_handle'; +SET lock_wait_timeout = 1; +--error ER_LOCK_WAIT_TIMEOUT +ALTER TABLE t1 ADD UNIQUE INDEX(c2); +SET DEBUG_SYNC = 'now SIGNAL go_ahead'; + +connection default; +--error ER_DUP_ENTRY +reap; +eval $innodb_metrics_select; + +connection con1; +SET @saved_debug_dbug = @@SESSION.debug_dbug; +SET DEBUG_DBUG = '+d,innodb_OOM_prepare_inplace_alter'; +--error ER_OUT_OF_RESOURCES +ALTER TABLE t1 ADD UNIQUE INDEX(c2); +SET DEBUG_DBUG = @saved_debug_dbug; +SET DEBUG_DBUG = '+d,innodb_OOM_inplace_alter'; +--error ER_OUT_OF_RESOURCES +CREATE UNIQUE INDEX c2 ON t1(c2); +SET DEBUG_DBUG = @saved_debug_dbug; +CREATE UNIQUE INDEX c2 ON t1(c2); +DROP INDEX c2 ON t1; + +connection default; +SHOW CREATE TABLE t1; +# Insert a duplicate entry (4) for the upcoming UNIQUE INDEX(c2). +BEGIN; +INSERT INTO t1 VALUES(7,4,2); + +connection con1; +# This DEBUG_SYNC should not kick in yet, because the duplicate key will be +# detected before we get a chance to apply the online log. +SET DEBUG_SYNC = 'row_log_apply_before SIGNAL scanned WAIT_FOR rollback_done'; +# This will be a lock wait timeout on the meta-data lock, +# because the transaction inserting (7,4,2) is still active. +--error ER_LOCK_WAIT_TIMEOUT +ALTER TABLE t1 ADD UNIQUE INDEX(c2); +connection default; +COMMIT; +connection con1; +--error ER_DUP_ENTRY +ALTER TABLE t1 ADD UNIQUE INDEX(c2); +connection default; +DELETE FROM t1 WHERE c1 = 7; +connection con1; +# ADD FOREIGN KEY is not supported in-place +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1 ADD FOREIGN KEY(c2) REFERENCES t1(c2), ALGORITHM = INPLACE; +# The previous DEBUG_SYNC should be ignored, because an exclusive lock +# has been requested and the online log is not being allocated. +ALTER TABLE t1 ADD UNIQUE INDEX(c2), LOCK = EXCLUSIVE, ALGORITHM = INPLACE; +DROP INDEX c2 ON t1; +# Now the previous DEBUG_SYNC should kick in. +--send +ALTER TABLE t1 ADD UNIQUE INDEX(c2); +connection default; +SET DEBUG_SYNC = 'now WAIT_FOR scanned'; +eval $innodb_metrics_select; + +# Insert a duplicate entry (4) for the already started UNIQUE INDEX(c2). +BEGIN; +INSERT INTO t1 VALUES(7,4,2); +ROLLBACK; +SET DEBUG_SYNC = 'now SIGNAL rollback_done'; + +connection con1; +# Because the modification log will be applied in order, there will be +# a duplicate key error on the (7,4,2) even though we roll it back. +--error ER_DUP_ENTRY +reap; +# Now, create the index without any concurrent DML, while no duplicate exists. +SET DEBUG_SYNC = 'row_log_apply_after SIGNAL created WAIT_FOR dml_done'; +--send +ALTER TABLE t1 ADD UNIQUE INDEX(c2); +connection default; +SET DEBUG_SYNC = 'now WAIT_FOR created'; +# At this point, the index has been created inside InnoDB but not yet +# in the MySQL data dictionary. +eval $innodb_metrics_select; +# A duplicate key error should now be triggered by InnoDB, but reported +# by the ALTER TABLE because the index does not 'officially' exist yet. +INSERT INTO t1 VALUES(6,3,1); +SET DEBUG_SYNC = 'now SIGNAL dml_done'; +connection con1; +# This is due to the duplicate entry (6,3,1). +--error ER_DUP_UNKNOWN_IN_INDEX +reap; +DELETE FROM t1 WHERE c1=6; +ALTER TABLE t1 ADD UNIQUE INDEX(c2); +eval $innodb_metrics_select; + +connection default; +--error ER_DUP_ENTRY +INSERT INTO t1 VALUES(6,3,1); +--error ER_DUP_ENTRY +INSERT INTO t1 VALUES(7,4,2); +ALTER TABLE t1 STATS_PERSISTENT=1; +ANALYZE TABLE t1; +# Purge may or may not have cleaned up the DELETE FROM t1 WHERE c1 = 7; +UPDATE mysql.innodb_index_stats SET stat_value = 5 +WHERE database_name = 'test' AND table_name= 't1' AND index_name = 'PRIMARY' +AND stat_value = 6; +--replace_column 4 LAST_UPDATE +SELECT * FROM mysql.innodb_index_stats WHERE table_name IN ('t1'); +CREATE TABLE t1_c2_stats SELECT * FROM mysql.innodb_index_stats +WHERE database_name = 'test' AND table_name = 't1' and index_name = 'c2'; +# in Embedded mode (./mtr --embedded-server) the t1_c2_stats table gets +# created in MyISAM format by default even if we set +# default_storage_engine='innodb' +ALTER TABLE t1_c2_stats ENGINE=INNODB; +DROP INDEX c2 ON t1; +ANALYZE TABLE t1_c2_stats; +--replace_column 4 LAST_UPDATE +SELECT * FROM mysql.innodb_index_stats WHERE table_name IN ('t1', 't1_c2_stats'); + +connection con1; +let $ID= `SELECT @id := CONNECTION_ID()`; +--error ER_QUERY_INTERRUPTED +KILL QUERY @id; + +SET DEBUG_SYNC = 'row_log_apply_before SIGNAL c2d_created WAIT_FOR kill_done'; +--send +CREATE INDEX c2d ON t1(c2); + +connection default; +SET DEBUG_SYNC = 'now WAIT_FOR c2d_created'; +eval $innodb_metrics_select; +let $ignore= `SELECT @id := $ID`; +KILL QUERY @id; +SET DEBUG_SYNC = 'now SIGNAL kill_done'; + +connection con1; +--error ER_QUERY_INTERRUPTED +reap; +eval $innodb_metrics_select; + +connection default; +CHECK TABLE t1; +INSERT INTO t1 SELECT 5 + c1, c2, c3 FROM t1; +INSERT INTO t1 SELECT 10 + c1, c2, c3 FROM t1; +INSERT INTO t1 SELECT 20 + c1, c2, c3 FROM t1; +INSERT INTO t1 SELECT 40 + c1, c2, c3 FROM t1; +# Purge may or may not have cleaned up the DELETE FROM t1 WHERE c1 = 7; +--replace_result 81 80 +EXPLAIN SELECT COUNT(*) FROM t1 WHERE c2 > 3; +ANALYZE TABLE t1; + +connection con1; +# Forge some statistics for c2d, and see that they will be used +UPDATE t1_c2_stats SET index_name = 'c2d'; +# Fake the statistics. The cardinality should be 5,80. +UPDATE t1_c2_stats SET stat_value = 2 WHERE stat_name = 'n_diff_pfx01'; +INSERT INTO t1_c2_stats +SELECT database_name, table_name, index_name, last_update, 'n_diff_pfx02', 80, +sample_size, 'c2,c1' FROM t1_c2_stats +WHERE stat_name = 'n_diff_pfx01' AND stat_description = 'c2'; +INSERT INTO mysql.innodb_index_stats SELECT * FROM t1_c2_stats; +DROP TABLE t1_c2_stats; + +CREATE INDEX c2d ON t1(c2); +# This should show the newly calculated stats by CREATE INDEX above, +# not the faked cardinality=4 for c2d(c2). +# Purge may or may not have cleaned up the DELETE FROM t1 WHERE c1 = 7; +--replace_result 81 80 +SHOW INDEX FROM t1; +EXPLAIN SELECT COUNT(*) FROM t1 WHERE c2 > 3; + +SHOW CREATE TABLE t1; + +connection default; +SET @merge_encrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +connection con1; + +# Exceed the configured innodb_online_alter_log_max_size. +# The actual limit is a multiple of innodb_sort_buf_size, +# because that is the size of the in-memory log buffers. +SET DEBUG_SYNC = 'row_log_apply_before SIGNAL c2e_created WAIT_FOR dml2_done'; +# Ensure that the ALTER TABLE will be executed even with some concurrent DML. +SET lock_wait_timeout = 10; +--send +# FIXME: MDEV-13668 +#ALTER TABLE t1 CHANGE c2 c22 INT, DROP INDEX c2d, ADD INDEX c2e(c22), +ALTER TABLE t1 DROP INDEX c2d, ADD INDEX c2e(c2), +ALGORITHM = INPLACE; + +# Generate some log (delete-mark, delete-unmark, insert etc.) +# while the index creation is blocked. Some of this may run +# in parallel with the clustered index scan. +connection default; +INSERT INTO t1 SELECT 80 + c1, c2, c3 FROM t1; +INSERT INTO t1 SELECT 160 + c1, c2, c3 FROM t1; +#UPDATE t1 SET c2 = c2 + 1; +SET DEBUG_SYNC = 'now WAIT_FOR c2e_created'; +# At this point, the clustered index scan must have completed, +# but the modification log keeps accumulating due to the DEBUG_SYNC. +eval $innodb_metrics_select; +let $c= 4; +while ($c) +{ + BEGIN; + DELETE FROM t1; + ROLLBACK; + UPDATE t1 SET c2 = c2 + 1; + BEGIN; + UPDATE t1 SET c2 = c2 + 1; + DELETE FROM t1; + ROLLBACK; + dec $c; +} +# Incomplete index c2e should exist until the DDL thread notices the overflow. +# (The output below strips TEMP_INDEX_PREFIX from the name.) +eval $innodb_metrics_select; +SELECT sf.name, sf.pos FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES si +INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_FIELDS sf +ON si.index_id = sf.index_id WHERE si.name = '?c2e'; + +SET @merge_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); + +SELECT +(@merge_encrypt_1-@merge_encrypt_0)- +(@merge_decrypt_1-@merge_decrypt_0) as sort_balance, +@merge_encrypt_1>@merge_encrypt_0, @merge_decrypt_1>@merge_decrypt_0, +@rowlog_encrypt_1>@rowlog_encrypt_0; + +# Release con1. +SET DEBUG_SYNC = 'now SIGNAL dml2_done'; + +connection con1; +# If the following fails with the wrong error, it probably means that +# you should rerun with a larger mtr --debug-sync-timeout. +--error ER_INNODB_ONLINE_LOG_TOO_BIG +reap; +# The index c2e should have been dropped from the data dictionary +# when the above error was noticed. It should still exist in the +# cache with index->online_status = ONLINE_INDEX_ABORTED_DROPPED. +eval $innodb_metrics_select; +SELECT sf.name, sf.pos FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES si +INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_FIELDS sf +ON si.index_id = sf.index_id WHERE si.name = 'c2e'; + +# ddl_background_drop_indexes = 1 here, because the incomplete index c2e still +# exists in the InnoDB data dictionary cache. +eval $innodb_metrics_select; + +connection default; + +ALTER TABLE t1 COMMENT 'testing if c2e will be dropped'; + +# Check that the 'zombie' index c2e was dropped. +eval $innodb_metrics_select; + +SET @merge_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +SET @rowlog_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); + +connection con1; +# Accumulate and apply some modification log. +SET DEBUG_SYNC = 'row_log_apply_before SIGNAL c2f_created WAIT_FOR dml3_done'; +--send +# FIXME: MDEV-13668 +#ALTER TABLE t1 ADD INDEX c2f(c22f), CHANGE c2 c22f INT; +ALTER TABLE t1 ADD INDEX c2f(c2); + +connection default; +SET DEBUG_SYNC = 'now WAIT_FOR c2f_created'; +# Generate some log (delete-mark, delete-unmark, insert etc.) +eval $innodb_metrics_select; +let $c= 2; +while ($c) +{ +BEGIN; +INSERT INTO t1 SELECT 320 + c1, c2, c3 FROM t1 WHERE c1 > 160; +DELETE FROM t1 WHERE c1 > 320; +ROLLBACK; +BEGIN; +UPDATE t1 SET c2 = c2 + 1; +DELETE FROM t1; +ROLLBACK; +dec $c; +} +eval $innodb_metrics_select; +# Release con1. +SET DEBUG_SYNC = 'now SIGNAL dml3_done'; + +connection con1; +reap; +# FIXME: MDEV-13668 +ALTER TABLE t1 CHANGE c2 c22f INT; + +eval $innodb_metrics_select; + +connection default; + +SET @merge_encrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +SET @rowlog_decrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); + +SELECT +(@merge_encrypt_2-@merge_encrypt_1)- +(@merge_decrypt_2-@merge_decrypt_1) as sort_balance, +(@rowlog_encrypt_2-@rowlog_encrypt_1)- +(@rowlog_decrypt_2-@rowlog_decrypt_1) as log_balance; +SELECT +@merge_encrypt_2-@merge_encrypt_1>0 as sort_encrypted, +@merge_decrypt_2-@merge_decrypt_1>0 as sort_decrypted, +@rowlog_encrypt_2-@rowlog_encrypt_1>0 as log_encrypted, +@rowlog_decrypt_2-@rowlog_decrypt_1>0 as log_decrypted; + +connection con1; +SELECT COUNT(c22f) FROM t1; +CHECK TABLE t1; + +# Create a column prefix index. +--error ER_DUP_ENTRY +ALTER TABLE t1 ADD UNIQUE INDEX c3p5(c3(5)); +UPDATE t1 SET c3 = NULL WHERE c3 = ''; +SET lock_wait_timeout = 1; +SET DEBUG_SYNC = 'row_log_apply_before SIGNAL c3p5_created WAIT_FOR ins_done'; +--send +ALTER TABLE t1 ADD UNIQUE INDEX c3p5(c3(5)); + +connection default; +SET DEBUG_SYNC = 'now WAIT_FOR c3p5_created'; + +# Check that the index was created. +SELECT sf.name, sf.pos FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES si +INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_FIELDS sf +ON si.index_id = sf.index_id WHERE si.name = '?c3p5'; + +SET DEBUG_SYNC = 'ib_after_row_insert SIGNAL ins_done WAIT_FOR ddl_timed_out'; +--send +INSERT INTO t1 VALUES(347,33101,NULL); + +connection con1; +--error ER_LOCK_WAIT_TIMEOUT +reap; +SET DEBUG_SYNC = 'now SIGNAL ddl_timed_out'; + +# InnoDB should have cleaned up the index c3p5 from the data dictionary, +# but not yet from the dictionary cache. +SELECT sf.name, sf.pos FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES si +INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_FIELDS sf +ON si.index_id = sf.index_id WHERE si.name = 'c3p5'; +eval $innodb_metrics_select; + +connection default; +reap; +# Index c3p5 should still exist in the data dictionary cache. +eval $innodb_metrics_select; + +--disable_parsing +# Temporarily disabled by fix for bug#14213236. Should be either +# removed or updated to take into account that locking for IMPORT/ +# DISCARD TABLESPACE happens on MDL layer. New test case is added +# to validate this at MDL layer(i_main.alter_table.test) + +SET DEBUG_SYNC = 'row_log_apply_before SIGNAL c2g_created WAIT_FOR dml4_done'; +# The lock upgrade at the end of the ALTER will conflict with the DISCARD. +SET lock_wait_timeout = 1; +--send +ALTER TABLE t1 DROP INDEX c2f, ADD INDEX c2g(c22f); + +connection con1; +SET DEBUG_SYNC = 'now WAIT_FOR c2g_created'; + +connect (con2,localhost,root,,); +connection con2; + +# This will conflict with the ALTER in connection default, above. +SET lock_wait_timeout = 10; +--send +ALTER TABLE t1 DISCARD TABLESPACE; + +connection con1; +let $wait_condition= + SELECT COUNT(*) = 1 FROM information_schema.processlist + WHERE state = 'Waiting for table level lock' and + info = 'ALTER TABLE t1 DISCARD TABLESPACE'; +--source include/wait_condition.inc + +SET DEBUG_SYNC = 'now SIGNAL dml4_done'; +disconnect con1; +connection con2; +reap; +disconnect con2; +connection default; +--error ER_LOCK_WAIT_TIMEOUT +reap; +--enable_parsing +#remove below con1 disconnect if above test case is enabled +connection con1; +disconnect con1; +connection default; + +SHOW CREATE TABLE t1; +ALTER TABLE t1 DROP INDEX c2d, DROP INDEX c2f; +# The ALTER TABLE should have cleaned up c3p5 from the cache. +eval $innodb_metrics_select; +ALTER TABLE t1 ADD INDEX c2h(c22f), ALGORITHM = INPLACE; +--error ER_DUP_KEYNAME +ALTER TABLE t1 ADD INDEX c2h(c22f), ALGORITHM = COPY; + +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL innodb_monitor_disable = module_ddl; + +DROP TABLE t1; + +# Check that all connections opened by test cases in this file are really +# gone so execution of other tests won't be affected by their presence. +--source include/wait_until_count_sessions.inc + +SET GLOBAL innodb_file_per_table = @global_innodb_file_per_table_orig; +--disable_warnings +SET GLOBAL innodb_monitor_enable = default; +SET GLOBAL innodb_monitor_disable = default; +--enable_warnings diff --git a/mysql-test/suite/innodb/t/innodb-index.test b/mysql-test/suite/innodb/t/innodb-index.test index 4549b3b6b47..721808c038c 100644 --- a/mysql-test/suite/innodb/t/innodb-index.test +++ b/mysql-test/suite/innodb/t/innodb-index.test @@ -546,3 +546,533 @@ show create table t2c; --disable_info DROP TABLE t1,t2,t2c,t2i; +--echo # +--echo # Bug #17657223 EXCESSIVE TEMPORARY FILE USAGE IN ALTER TABLE +--echo # + +SET GLOBAL innodb_monitor_enable = module_ddl; +let $innodb_metrics_select= +SELECT name, count_reset FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE +subsystem = 'ddl' and count_reset > 0; + +# Table with Blob data. +create table t1(f1 int not null, f2 blob)engine=innodb; +insert into t1 values(1, repeat('a',20000)); +--echo # Skip sort +--echo # Reusing the same pk +--enable_info +alter table t1 force; +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; +drop table t1; + +# Table with small data. +create table t1(f1 int not null, f2 int not null, +primary key(f1))engine=innodb; +insert into t1 values(1,2), (3,4); +--echo # Add Secondary index. +--echo # Skip temp file usage due to small table size +--enable_info +alter table t1 add key(f2); +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; +drop table t1; + +# Table with large data which is greater than sort buffer +create table t480(a serial)engine=innodb; +insert into t480 +values(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(), +(),(),(),(),(),(),(),(); +insert into t480 select 0 from t480; +insert into t480 select 0 from t480; +insert into t480 select 0 from t480; +insert into t480 select 0 from t480; +create table t1(f1 int auto_increment not null, + f2 char(200) not null, f3 char(200) not null, + f4 char(200) not null,primary key(f1))engine=innodb; +insert into t1 select NULL,'aaa','bbb','ccc' from t480; +insert into t1 select NULL,'aaaa','bbbb','cccc' from t480; +insert into t1 select NULL,'aaaaa','bbbbb','ccccc' from t480; +insert into t1 select NULL,'aaaaaa','bbbbbb','cccccc' from t480; +insert into t1 select NULL,'aaaaaaa','bbbbbbb','ccccccc' from t480; +insert into t1 select NULL,'aaaaaaaa','bbbbbbbb','cccccccc' from t480; +select count(*) from t1; + +--echo # Skip sort +--echo # Change PK from (f1) to (f1,f2,f3,f4) +--enable_info +alter table t1 drop primary key, add primary key(f1,f2,f3,f4); +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; + + +# Temp file not used during clustered index rebuild +# for the following alter table commands. + +--echo # Skip sort +--echo # Change PK from (f1,f2,f3,f4) to (f1,f2,added_columns) +--enable_info +alter table t1 drop primary key,add column f5 int not null, +add column f6 int not null,add primary key(f1,f2,f5,f6); +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; + +--echo # Skip sort +--echo # Change PK from (f1,f2,f5,f6) to (f1,f2,f5) +--error ER_KEY_COLUMN_DOES_NOT_EXITS +alter table t1 drop column f6; +--enable_info +alter table t1 drop column f6, drop primary key, add primary key(f1,f2,f5); +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; + +--echo # Skip sort +--echo # Reusing the same PK +--enable_info +alter table t1 add column f6 int; +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; + +--echo # Skip sort +--echo # Reusing the same pk +--enable_info +alter table t1 drop column f6; +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; + +--echo # Must sort +--echo # Change PK from (f1,f2,f5) to (f1,f5) +--error ER_KEY_COLUMN_DOES_NOT_EXITS +alter table t1 drop column f2; +--enable_info +alter table t1 drop column f2, drop primary key, add primary key(f1,f5); +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; + +--echo # Skip sort +--echo # Reusing the same pk +--enable_info +alter table t1 add column f2n int after f1, drop primary key, add +primary key (f1,f5,f2n); +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; + +--echo # Skip sort +--echo # Reusing the same pk +--enable_info +alter table t1 change f5 f2n int not null,change f2n f5 int not null, +add column f8 int not null; +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; + +--echo # Skip sort +--echo # Change PK from (f1,f4,f2n) to (f1,f4,added_column,f2n) +--enable_info +alter table t1 add column f7 int, drop primary key, +add primary key (f1,f5,f7,f2n); +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; + +--echo # Skip sort +--echo # Reusing the same pk +--enable_info +alter table t1 force; +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; + +--echo # Skip sort +--echo # Reusing the same pk +--enable_info +alter table t1 row_format=compact; +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; + +--echo # Skip sort +--echo # Reusing the same pk +--enable_info +alter table t1 engine=innodb; +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; + +--echo # Skip sort +--echo # Optimize table +--enable_info +optimize table t1; +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; + +--echo # Sort files used for adding secondary index +--enable_info +alter table t1 drop primary key, add primary key(f1,f5,f7), add index +i(f3); +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; + +--echo # No sort files used for dropping secondary index +--enable_info +alter table t1 drop primary key, add primary key(f1,f5),drop index i; +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; + +--echo # Skip sort +--echo # Change PK(f1,f5) to (f1,added_columns) and drop f5 +--enable_info +alter table t1 drop primary key, add primary key(f1,f12), +drop column f5, add column f12 int not null; +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; + +--echo # Must sort +--echo # Change PK(f1,f12) to (f1,existing_columns) +--enable_info +alter table t1 drop primary key, add primary key(f1,f3); +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; + +--echo # Skip sort +--echo # Change PK(f1,f3) to (f1,added_column,f3,added_column) +--enable_info +alter table t1 drop primary key, add column f3n int, +add column f4n int, add primary key(f1,f3n,f3,f4n); +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; + +--echo # Adding Secondary index alone. +--enable_info +alter table t1 add key(f1); +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; + +--echo # Must sort +--echo # Change PK(f1,f3) to (existing_column,f1) +--enable_info +alter table t1 drop primary key, add primary key(f4,f1); +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; + +--echo # Skip sort for PK. +--echo # Change PK(f4,f1) to (added_columns,f4,f1) +--echo # Secondary index rebuild happens +--enable_info +alter table t1 drop primary key, add column f5n int, +add column f6n int, add primary key(f5n,f6n,f4,f1); +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; + +--echo # Skip sort for PK. +--echo # Change PK(f5n,f6n,f4,f1) to +--echo # (added_columns,f5n,added_column,f6n,f4,f1) +--echo # Secondary index rebuild happens +--enable_info +alter table t1 drop primary key, add column f7n int, +add column f8n int, add primary key(f7n,f5n,f8n,f6n,f4,f1); +--disable_info +eval $innodb_metrics_select; +SET GLOBAL innodb_monitor_reset = module_ddl; + +SET GLOBAL innodb_monitor_disable = module_ddl; +select count(*) from t1; +drop table t1; +--disable_warnings +SET GLOBAL innodb_monitor_reset = default; +SET GLOBAL innodb_monitor_enable = default; +SET GLOBAL innodb_monitor_disable = default; +--enable_warnings + +--echo # Bug#19163915 INNODB: DUPLICATE RECORDS COULD EXIST +--echo # WHEN SKIPPING SORT FOR CLUSTER INDEX + +# last mtuple in previous buffer and first mtuple in next buffer +# are equal. +SELECT @@innodb_sort_buffer_size; +create table t1(f1 int auto_increment not null, + f2 char(200) not null, f3 char(200) not null, + f4 char(200) not null,primary key(f1,f2,f3,f4)); +insert into t1 select NULL,'aaa','bbb','ccc' from t480; +insert into t1 values(106, 'aaa','bbb','cccc'); +select count(*) from t1; +--echo # Skip sort +--echo # Change PK from (f1,f2,f3,f4) to (f1,f2,f3) +--error ER_DUP_ENTRY +alter table t1 drop primary key, add primary key(f1,f2,f3); +select count(*) from t1; +drop table t1; + +# Duplicates exist with in the buffer +create table t1(f1 int auto_increment not null, + f2 char(200) not null, f3 char(200) not null, + f4 char(200) not null,primary key(f1,f2,f3,f4)); +insert into t1 select NULL,'aaa','bbb','ccc' from t480; +insert into t1 values(108,'aaa','bbb','cccc'); +select count(*) from t1; +--error ER_DUP_ENTRY +alter table t1 drop primary key, add primary key(f1,f2,f3); +select count(*) from t1; +drop table t1, t480; + +--echo # +--echo # Bug #19896922 SORTING SKIPPED WHEN PREFIX LENGTH OF THE PK +--echo # FIELD IS CHANGED +--echo # + +# Prefix length changes for the varchar column. +create table t1(a int not null, b varchar(30) not null, + primary key (b(10), a)) engine = innodb; +insert into t1 values(0,'khdHps6UxW8Lwaoxa604oK6zkb'),(1,'khdHps6UxW8L'); +select * from t1; +alter table t1 drop primary key, add primary key (b(18),a); +select * from t1; +drop table t1; + +create table t1(a int not null, b varchar(30) not null, + primary key (b(10), a)) engine = innodb; +insert into t1 values(0,'khdHps6UxW8Lwaoxa604oK6zkb'),(1,'khdHps6UtW8L'); +select * from t1; +alter table t1 drop primary key, add primary key (b(8),a); +select * from t1; +drop table t1; + + +--echo # +--echo # Bug #21103101 SORTING SKIPPED WHEN DROPPING THE SINGLE +--echo # COLUMN PRIMARY KEY +--echo # + +# Drop primary key column. +create table t1(f1 int not null, f2 int not null, + primary key (f1), unique key(f1, f2))engine=innodb; +insert into t1 values(1,3), (2,2); +--error ER_KEY_COLUMN_DOES_NOT_EXITS +alter table t1 drop column f1; +--error ER_KEY_COLUMN_DOES_NOT_EXITS +alter table t1 drop column f1, drop primary key; +# DROP PRIMARY KEY is implied for a single-column PRIMARY KEY +alter table t1 drop column f1, drop key f1; +drop table t1; + +# Drop Primary key when lock is none. +create table t1(f1 int not null, f2 int not null, + primary key (f1), unique key(f1, f2))engine=innodb; +insert into t1 values(1,3), (2,2); +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +alter table t1 drop primary key, lock=none; +drop table t1; + +--echo # +--echo # BUG#21612714 ALTER TABLE SORTING SKIPPED WHEN CHANGE PK AND DROP +--echo # LAST COLUMN OF OLD PK +--echo # + +# no skip sort cases +# pk(o1,o2) to pk(o1,o3), drop o2 +create table t1(o1 int, o2 int, o3 int not null, primary key(o1,o2)) engine = innodb; +insert into t1 values(1,1,2),(1,2,1); +alter table t1 drop primary key, add primary key(o1,o3), drop o2, lock=none; +drop table t1; + +# pk(o1,o2) to pk(o3), drop o1, o2 +create table t1(o1 int, o2 int, o3 int not null, primary key(o1,o2)) engine = innodb; +insert into t1 values(1,1,2),(1,2,1); +alter table t1 drop o1, drop o2, add primary key(o3), lock=none; +drop table t1; + +# pk(o1,o2) to pk(o1,o3) +create table t1(o1 int, o2 int, o3 int not null, primary key(o1,o2)) engine = innodb; +insert into t1 values(1,1,2),(1,2,1); +alter table t1 drop primary key, add primary key(o1,o3), lock=none; +drop table t1; + +# pk(o1,o2) to pk(o3) +create table t1(o1 int, o2 int, o3 int not null, primary key(o1,o2)) engine = innodb; +insert into t1 values(1,1,2),(1,2,1); +alter table t1 drop primary key, add primary key(o3), lock=none; +drop table t1; + +# pk(o1,o2) to pk(n1,o3) +create table t1(o1 int, o2 int, o3 int not null, primary key(o1,o2)) engine = innodb; +insert into t1 values(1,1,2),(1,2,1); +alter table t1 add column n1 int not null, drop primary key, add primary key(n1,o3), lock=none; +drop table t1; + +# pk(o1,o2) to pk(o3,n1) +create table t1(o1 int, o2 int, o3 int not null, primary key(o1,o2)) engine = innodb; +insert into t1 values(1,1,2),(2,2,1); +alter table t1 add column n1 int not null, drop primary key, add primary key(o3,n1), lock=none; +drop table t1; + +# pk(o1,o2) to pk(o2,o1) +create table t1(o1 int, o2 int, o3 int not null, primary key(o1,o2)) engine = innodb; +insert into t1 values(1,2,2),(2,1,1); +alter table t1 drop primary key, add primary key(o2, o1), lock=none; +drop table t1; + +# pk(o1,o2) to pk(o2) +create table t1(o1 int, o2 int, o3 int not null, primary key(o1,o2)) engine = innodb; +insert into t1 values(1,2,2),(2,1,1); +alter table t1 drop primary key, add primary key(o2), lock=none; +drop table t1; + +# pk(o1,o2) to pk(o2,o3) +create table t1(o1 int, o2 int, o3 int not null, primary key(o1,o2)) engine = innodb; +insert into t1 values(1,2,2),(2,1,1); +alter table t1 drop primary key, add primary key(o2,o3), lock=none; +drop table t1; + +# pk(o2,o1) to pk(o2,o3) +create table t1(o1 int, o2 int, o3 int not null, primary key(o2,o1)) engine = innodb; +insert into t1 values(1,1,2),(2,1,1); +alter table t1 drop primary key, add primary key(o2,o3), lock=none; +drop table t1; + +# pk(o1,o2) to pk(o1,o3,o2) +create table t1(o1 int, o2 int, o3 int not null, primary key(o1,o2)) engine = innodb; +insert into t1 values(1,1,2),(1,2,1); +alter table t1 drop primary key, add primary key(o1,o3,o2), lock=none; +drop table t1; + +# pk(o1,o2) to pk(o3,o1,o2) +create table t1(o1 int, o2 int, o3 int not null, primary key(o1,o2)) engine = innodb; +insert into t1 values(1,2,2),(2,1,1); +alter table t1 drop primary key, add primary key(o3,o1,o2), lock=none; +drop table t1; + +# pk(o1,o2,o3) to pk(o1,o3) +create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1,1,2),(1,2,1); +alter table t1 drop primary key, add primary key(o1,o3), lock=none; +drop table t1; + +# pk(o1,o2,o3) to pk(o2,o3) by drop o1 +create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1,2,2),(2,1,1); +--error ER_KEY_COLUMN_DOES_NOT_EXITS +alter table t1 drop o1, lock=none; +alter table t1 drop o1, drop primary key, add primary key(o2,o3), lock=none; +drop table t1; + +# pk(o1,o2,o3) to pk(o1,o3) by drop o2 +create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1,1,2),(1,2,1); +--error ER_KEY_COLUMN_DOES_NOT_EXITS +alter table t1 drop o2, lock=none; +alter table t1 drop o2, drop primary key, add primary key(o1,o3), lock=none; +drop table t1; + +# pk(o1,o2,o3) to pk(o3) by drop o1,o2 +create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb; +insert into t1 values(1,2,2),(2,1,1); +--error ER_KEY_COLUMN_DOES_NOT_EXITS +alter table t1 drop o1, drop o2, lock=none; +alter table t1 drop o1, drop o2,drop primary key,add primary key(o3),lock=none; +drop table t1; + +# no skip sort for prefix change +# pk(o1(2),o2) to pk(o1(3),o2) +create table t1(o1 varchar(10), o2 int, o3 int not null, primary key(o1(2), o2)) engine = innodb; +insert into t1 values('abd', 1, 1), ('abc', 2, 2); +alter table t1 drop primary key, add primary key(o1(3), o2), lock=none; +drop table t1; + +# pk(o1(2),o2) to pk(o1,o2) +create table t1(o1 varchar(10), o2 int, o3 int not null, primary key(o1(2), o2)) engine = innodb; +insert into t1 values('abd', 1, 1), ('abc', 2, 2); +alter table t1 drop primary key, add primary key(o1, o2), lock=none; +drop table t1; + +# pk(o1(2),o2) to pk(o1(3),o3) +create table t1(o1 varchar(10), o2 int, o3 int not null, primary key(o1(2), o2)) engine = innodb; +insert into t1 values('abd', 1, 1), ('abc', 2, 2); +alter table t1 drop primary key, add primary key(o1(3), o3), lock=none; +drop table t1; + +# pk(o1(2),o2) to pk(o1,o3) +create table t1(o1 varchar(10), o2 int, o3 int not null, primary key(o1(2), o2)) engine = innodb; +insert into t1 values('abd', 1, 1), ('abc', 2, 2); +alter table t1 drop primary key, add primary key(o1, o3), lock=none; +drop table t1; + +# pk(o1(3),o2) to pk(o1(2),o2) +create table t1(o1 varchar(10), o2 int, o3 int not null, primary key(o1(3), o2)) engine = innodb; +insert into t1 values('abc', 2, 1), ('abd', 1, 2); +alter table t1 drop primary key, add primary key(o1(2), o2), lock=none; +drop table t1; + +# pk(o1,o2) to pk(o1(2),o2) +create table t1(o1 varchar(10), o2 int, o3 int not null, primary key(o1, o2)) engine = innodb; +insert into t1 values('abc', 2, 1), ('abd', 1, 2); +alter table t1 drop primary key, add primary key(o1(2), o2), lock=none; +drop table t1; + +# pk(o1(3),o2) to pk(o1(2),o3) +create table t1(o1 varchar(10), o2 int, o3 int not null, primary key(o1(3), o2)) engine = innodb; +insert into t1 values('abc', 2, 2), ('abd', 1, 1); +alter table t1 drop primary key, add primary key(o1(2), o3), lock=none; +drop table t1; + +# pk(o1,o2) to pk(o1(2),o3) +create table t1(o1 varchar(10), o2 int, o3 int not null, primary key(o1, o2)) engine = innodb; +insert into t1 values('abc', 2, 2), ('abd', 1, 1); +alter table t1 drop primary key, add primary key(o1(2), o3), lock=none; +drop table t1; + +# pk(o1,o2(2),o3) to pk(o1,o2(3)) +create table t1(o1 int, o2 varchar(10), o3 int, primary key(o1,o2(2),o3)) engine = innodb; +insert into t1 values(1, 'abd', 1), (1, 'abc', 2); +alter table t1 drop primary key, add primary key(o1,o2(3)), lock=none; +drop table t1; + +# pk(o1,o2(2),o3) to pk(o1,o2) +create table t1(o1 int, o2 varchar(10), o3 int, primary key(o1,o2(2),o3)) engine = innodb; +insert into t1 values(1, 'abd', 1), (1, 'abc', 2); +alter table t1 drop primary key, add primary key(o1,o2), lock=none; +drop table t1; + +# pk(o1(3),o2(3)) to pk(o1(2),o2(3)) +create table t1(o1 varchar(10), o2 varchar(10), primary key(o1(3),o2(3))) engine = innodb; +insert into t1 values('abc', 'acd'), ('abd', 'abd'); +alter table t1 drop primary key, add primary key(o1(2),o2(3)), lock=none; +drop table t1; + +# pk(o1,o2) to pk(o1(2),o2) +create table t1(o1 varchar(10), o2 varchar(10), primary key(o1,o2)) engine = innodb; +insert into t1 values('abc', 'acd'), ('abd', 'abd'); +alter table t1 drop primary key, add primary key(o1(2),o2), lock=none; +drop table t1; + +# pk(o1(3),o2(3)) to pk(o2(3),o1(3)) +create table t1(o1 varchar(10), o2 varchar(10), primary key(o1(3),o2(3))) engine = innodb; +insert into t1 values('abd', 'acd'), ('acd', 'abd'); +alter table t1 drop primary key, add primary key(o2(3),o1(3)), lock=none; +drop table t1; + +# pk(o1,o2) to pk(o2,o1) +create table t1(o1 varchar(10), o2 varchar(10), primary key(o1,o2)) engine = innodb; +insert into t1 values('abd', 'acd'), ('acd', 'abd'); +alter table t1 drop primary key, add primary key(o2,o1), lock=none; +drop table t1; + +# no skip sort cases +--source suite/innodb/include/alter_table_pk_no_sort.inc diff --git a/mysql-test/suite/innodb/t/innodb-page_compression_default.test b/mysql-test/suite/innodb/t/innodb-page_compression_default.test index 28f184c278c..1cc6c917548 100644 --- a/mysql-test/suite/innodb/t/innodb-page_compression_default.test +++ b/mysql-test/suite/innodb/t/innodb-page_compression_default.test @@ -1,51 +1,10 @@ --source include/have_innodb.inc +--source include/not_embedded.inc ---disable_query_log -let $innodb_compression_algorithm_orig=`SELECT @@innodb_compression_algorithm`; -let $innodb_file_format_orig = `SELECT @@innodb_file_format`; -let $innodb_file_per_table_orig = `SELECT @@innodb_file_per_table`; ---enable_query_log +call mtr.add_suppression("InnoDB: Compression failed for space [0-9]+ name test/innodb_page_compressed[0-9] len [0-9]+ err 2 write_size [0-9]+."); ---disable_warnings -SET GLOBAL innodb_file_format = `Barracuda`; -SET GLOBAL innodb_file_per_table = ON; ---enable_warnings +# All page compression test use the same +--source include/innodb-page-compression.inc -create table t1 (c1 int not null primary key auto_increment, b char(200)) engine=innodb page_compressed=1; -insert into t1 values(NULL,'compressed_text_aaaaaaaaabbbbbbbbbbbbbccccccccccccc'); -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; -insert into t1(b) select b from t1; +-- echo #done -let $wait_condition= select variable_value > 0 from information_schema.global_status where variable_name = 'INNODB_NUM_PAGES_PAGE_COMPRESSED'; ---source include/wait_condition.inc - ---let $MYSQLD_DATADIR=`select @@datadir` ---let t1_IBD = $MYSQLD_DATADIR/test/t1.ibd ---let SEARCH_RANGE = 10000000 ---let SEARCH_PATTERN=compressed_text - ---echo # t1 compressed expected NOT FOUND --- let SEARCH_FILE=$t1_IBD --- source include/search_pattern_in_file.inc - -drop table t1; - -# reset system ---disable_query_log ---disable_warnings -EVAL SET GLOBAL innodb_compression_algorithm = $innodb_compression_algorithm_orig; -EVAL SET GLOBAL innodb_file_per_table = $innodb_file_per_table_orig; -EVAL SET GLOBAL innodb_file_format = $innodb_file_format_orig; ---enable_warnings ---enable_query_log diff --git a/mysql-test/suite/innodb/t/innodb-page_compression_snappy.test b/mysql-test/suite/innodb/t/innodb-page_compression_snappy.test index b90d15f1fa3..532ec294d28 100644 --- a/mysql-test/suite/innodb/t/innodb-page_compression_snappy.test +++ b/mysql-test/suite/innodb/t/innodb-page_compression_snappy.test @@ -1,244 +1,13 @@ -- source include/have_innodb.inc -- source include/have_innodb_snappy.inc +--source include/not_embedded.inc -call mtr.add_suppression("InnoDB: Compression failed for space.*"); - -let $innodb_compression_algorithm_orig=`select @@innodb_compression_algorithm`; +call mtr.add_suppression("InnoDB: Compression failed for space [0-9]+ name test/innodb_page_compressed[0-9] len [0-9]+ err 2 write_size [0-9]+."); # snappy -set global innodb_compression_algorithm = 6; +set global innodb_compression_algorithm = snappy; -create table innodb_compressed(c1 int, b char(200)) engine=innodb row_format=compressed key_block_size=8; -show warnings; -create table innodb_normal (c1 int, b char(200)) engine=innodb; -show warnings; -create table innodb_page_compressed1 (c1 int, b char(200)) engine=innodb page_compressed=1 page_compression_level=1; -show warnings; -show create table innodb_page_compressed1; -create table innodb_page_compressed2 (c1 int, b char(200)) engine=innodb page_compressed=1 page_compression_level=2; -show warnings; -show create table innodb_page_compressed2; -create table innodb_page_compressed3 (c1 int, b char(200)) engine=innodb page_compressed=1 page_compression_level=3; -show warnings; -show create table innodb_page_compressed3; -create table innodb_page_compressed4 (c1 int, b char(200)) engine=innodb page_compressed=1 page_compression_level=4; -show warnings; -show create table innodb_page_compressed4; -create table innodb_page_compressed5 (c1 int, b char(200)) engine=innodb page_compressed=1 page_compression_level=5; -show warnings; -show create table innodb_page_compressed5; -create table innodb_page_compressed6 (c1 int, b char(200)) engine=innodb page_compressed=1 page_compression_level=6; -show warnings; -show create table innodb_page_compressed6; -create table innodb_page_compressed7 (c1 int, b char(200)) engine=innodb page_compressed=1 page_compression_level=7; -show warnings; -show create table innodb_page_compressed7; -create table innodb_page_compressed8 (c1 int, b char(200)) engine=innodb page_compressed=1 page_compression_level=8; -show warnings; -show create table innodb_page_compressed8; -create table innodb_page_compressed9 (c1 int, b char(200)) engine=innodb page_compressed=1 page_compression_level=9; -show warnings; -show create table innodb_page_compressed9; -delimiter //; -create procedure innodb_insert_proc (repeat_count int) -begin - declare current_num int; - set current_num = 0; - while current_num < repeat_count do - insert into innodb_normal values(current_num,'aaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccc'); - set current_num = current_num + 1; - end while; -end// -delimiter ;// -commit; +# All page compression test use the same +--source include/innodb-page-compression.inc -set autocommit=0; -call innodb_insert_proc(5000); -commit; -set autocommit=1; -select count(*) from innodb_normal; -insert into innodb_compressed select * from innodb_normal; -insert into innodb_page_compressed1 select * from innodb_normal; -insert into innodb_page_compressed2 select * from innodb_normal; -insert into innodb_page_compressed3 select * from innodb_normal; -insert into innodb_page_compressed4 select * from innodb_normal; -insert into innodb_page_compressed5 select * from innodb_normal; -insert into innodb_page_compressed6 select * from innodb_normal; -insert into innodb_page_compressed7 select * from innodb_normal; -insert into innodb_page_compressed8 select * from innodb_normal; -insert into innodb_page_compressed9 select * from innodb_normal; -commit; -select count(*) from innodb_compressed; -select count(*) from innodb_page_compressed1; -select count(*) from innodb_page_compressed1 where c1 < 500000; -select count(*) from innodb_page_compressed2 where c1 < 500000; -select count(*) from innodb_page_compressed3 where c1 < 500000; -select count(*) from innodb_page_compressed4 where c1 < 500000; -select count(*) from innodb_page_compressed5 where c1 < 500000; -select count(*) from innodb_page_compressed6 where c1 < 500000; -select count(*) from innodb_page_compressed7 where c1 < 500000; -select count(*) from innodb_page_compressed8 where c1 < 500000; -select count(*) from innodb_page_compressed9 where c1 < 500000; - -alter table innodb_normal page_compressed=1 page_compression_level=8; -show warnings; -show create table innodb_normal; -alter table innodb_compressed row_format=default page_compressed=1 page_compression_level=8 key_block_size=0; -show warnings; -show create table innodb_compressed; - -update innodb_page_compressed1 set c1 = c1 + 1; -update innodb_page_compressed2 set c1 = c1 + 1; -update innodb_page_compressed3 set c1 = c1 + 1; -update innodb_page_compressed4 set c1 = c1 + 1; -update innodb_page_compressed5 set c1 = c1 + 1; -update innodb_page_compressed6 set c1 = c1 + 1; -update innodb_page_compressed7 set c1 = c1 + 1; -update innodb_page_compressed8 set c1 = c1 + 1; -update innodb_page_compressed9 set c1 = c1 + 1; -select count(*) from innodb_compressed; -select count(*) from innodb_page_compressed1; -select count(*) from innodb_page_compressed1 where c1 < 500000; -select count(*) from innodb_page_compressed2 where c1 < 500000; -select count(*) from innodb_page_compressed3 where c1 < 500000; -select count(*) from innodb_page_compressed4 where c1 < 500000; -select count(*) from innodb_page_compressed5 where c1 < 500000; -select count(*) from innodb_page_compressed6 where c1 < 500000; -select count(*) from innodb_page_compressed7 where c1 < 500000; -select count(*) from innodb_page_compressed8 where c1 < 500000; -select count(*) from innodb_page_compressed9 where c1 < 500000; - ---source include/restart_mysqld.inc - -update innodb_page_compressed1 set c1 = c1 + 1; -update innodb_page_compressed2 set c1 = c1 + 1; -update innodb_page_compressed3 set c1 = c1 + 1; -update innodb_page_compressed4 set c1 = c1 + 1; -update innodb_page_compressed5 set c1 = c1 + 1; -update innodb_page_compressed6 set c1 = c1 + 1; -update innodb_page_compressed7 set c1 = c1 + 1; -update innodb_page_compressed8 set c1 = c1 + 1; -update innodb_page_compressed9 set c1 = c1 + 1; -select count(*) from innodb_compressed; -select count(*) from innodb_page_compressed1; -select count(*) from innodb_page_compressed1 where c1 < 500000; -select count(*) from innodb_page_compressed2 where c1 < 500000; -select count(*) from innodb_page_compressed3 where c1 < 500000; -select count(*) from innodb_page_compressed4 where c1 < 500000; -select count(*) from innodb_page_compressed5 where c1 < 500000; -select count(*) from innodb_page_compressed6 where c1 < 500000; -select count(*) from innodb_page_compressed7 where c1 < 500000; -select count(*) from innodb_page_compressed8 where c1 < 500000; -select count(*) from innodb_page_compressed9 where c1 < 500000; - -# zlib -set global innodb_compression_algorithm = 1; -update innodb_page_compressed1 set c1 = c1 + 1; -update innodb_page_compressed2 set c1 = c1 + 1; -update innodb_page_compressed3 set c1 = c1 + 1; -update innodb_page_compressed4 set c1 = c1 + 1; -update innodb_page_compressed5 set c1 = c1 + 1; -update innodb_page_compressed6 set c1 = c1 + 1; -update innodb_page_compressed7 set c1 = c1 + 1; -update innodb_page_compressed8 set c1 = c1 + 1; -update innodb_page_compressed9 set c1 = c1 + 1; -commit; -select count(*) from innodb_compressed; -select count(*) from innodb_page_compressed1; -select count(*) from innodb_page_compressed1 where c1 < 500000; -select count(*) from innodb_page_compressed2 where c1 < 500000; -select count(*) from innodb_page_compressed3 where c1 < 500000; -select count(*) from innodb_page_compressed4 where c1 < 500000; -select count(*) from innodb_page_compressed5 where c1 < 500000; -select count(*) from innodb_page_compressed6 where c1 < 500000; -select count(*) from innodb_page_compressed7 where c1 < 500000; -select count(*) from innodb_page_compressed8 where c1 < 500000; -select count(*) from innodb_page_compressed9 where c1 < 500000; - ---source include/restart_mysqld.inc - -update innodb_page_compressed1 set c1 = c1 + 1; -update innodb_page_compressed2 set c1 = c1 + 1; -update innodb_page_compressed3 set c1 = c1 + 1; -update innodb_page_compressed4 set c1 = c1 + 1; -update innodb_page_compressed5 set c1 = c1 + 1; -update innodb_page_compressed6 set c1 = c1 + 1; -update innodb_page_compressed7 set c1 = c1 + 1; -update innodb_page_compressed8 set c1 = c1 + 1; -update innodb_page_compressed9 set c1 = c1 + 1; -select count(*) from innodb_compressed; -select count(*) from innodb_page_compressed1; -select count(*) from innodb_page_compressed1 where c1 < 500000; -select count(*) from innodb_page_compressed2 where c1 < 500000; -select count(*) from innodb_page_compressed3 where c1 < 500000; -select count(*) from innodb_page_compressed4 where c1 < 500000; -select count(*) from innodb_page_compressed5 where c1 < 500000; -select count(*) from innodb_page_compressed6 where c1 < 500000; -select count(*) from innodb_page_compressed7 where c1 < 500000; -select count(*) from innodb_page_compressed8 where c1 < 500000; -select count(*) from innodb_page_compressed9 where c1 < 500000; - -# none -set global innodb_compression_algorithm = 0; -update innodb_page_compressed1 set c1 = c1 + 1; -update innodb_page_compressed2 set c1 = c1 + 1; -update innodb_page_compressed3 set c1 = c1 + 1; -update innodb_page_compressed4 set c1 = c1 + 1; -update innodb_page_compressed5 set c1 = c1 + 1; -update innodb_page_compressed6 set c1 = c1 + 1; -update innodb_page_compressed7 set c1 = c1 + 1; -update innodb_page_compressed8 set c1 = c1 + 1; -update innodb_page_compressed9 set c1 = c1 + 1; -commit; -select count(*) from innodb_compressed; -select count(*) from innodb_page_compressed1; -select count(*) from innodb_page_compressed1 where c1 < 500000; -select count(*) from innodb_page_compressed2 where c1 < 500000; -select count(*) from innodb_page_compressed3 where c1 < 500000; -select count(*) from innodb_page_compressed4 where c1 < 500000; -select count(*) from innodb_page_compressed5 where c1 < 500000; -select count(*) from innodb_page_compressed6 where c1 < 500000; -select count(*) from innodb_page_compressed7 where c1 < 500000; -select count(*) from innodb_page_compressed8 where c1 < 500000; -select count(*) from innodb_page_compressed9 where c1 < 500000; - ---source include/restart_mysqld.inc - -update innodb_page_compressed1 set c1 = c1 + 1; -update innodb_page_compressed2 set c1 = c1 + 1; -update innodb_page_compressed3 set c1 = c1 + 1; -update innodb_page_compressed4 set c1 = c1 + 1; -update innodb_page_compressed5 set c1 = c1 + 1; -update innodb_page_compressed6 set c1 = c1 + 1; -update innodb_page_compressed7 set c1 = c1 + 1; -update innodb_page_compressed8 set c1 = c1 + 1; -update innodb_page_compressed9 set c1 = c1 + 1; -select count(*) from innodb_compressed; -select count(*) from innodb_page_compressed1; -select count(*) from innodb_page_compressed1 where c1 < 500000; -select count(*) from innodb_page_compressed2 where c1 < 500000; -select count(*) from innodb_page_compressed3 where c1 < 500000; -select count(*) from innodb_page_compressed4 where c1 < 500000; -select count(*) from innodb_page_compressed5 where c1 < 500000; -select count(*) from innodb_page_compressed6 where c1 < 500000; -select count(*) from innodb_page_compressed7 where c1 < 500000; -select count(*) from innodb_page_compressed8 where c1 < 500000; -select count(*) from innodb_page_compressed9 where c1 < 500000; - -drop procedure innodb_insert_proc; -drop table innodb_normal; -drop table innodb_compressed; -drop table innodb_page_compressed1; -drop table innodb_page_compressed2; -drop table innodb_page_compressed3; -drop table innodb_page_compressed4; -drop table innodb_page_compressed5; -drop table innodb_page_compressed6; -drop table innodb_page_compressed7; -drop table innodb_page_compressed8; -drop table innodb_page_compressed9; - -# reset system ---disable_query_log -EVAL SET GLOBAL innodb_compression_algorithm = $innodb_compression_algorithm_orig; ---enable_query_log +-- echo #done diff --git a/mysql-test/suite/innodb/t/innodb-table-online-master.opt b/mysql-test/suite/innodb/t/innodb-table-online-master.opt new file mode 100644 index 00000000000..92eea2b0d2e --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb-table-online-master.opt @@ -0,0 +1 @@ +--innodb-sort-buffer-size=64k --innodb-online-alter-log-max-size=512k --innodb-buffer-pool-size=5M --innodb-log-buffer-size=256k diff --git a/mysql-test/suite/innodb/t/innodb-table-online.test b/mysql-test/suite/innodb/t/innodb-table-online.test new file mode 100644 index 00000000000..51f5445693e --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb-table-online.test @@ -0,0 +1,444 @@ +--source include/innodb_page_size_small.inc +--source include/innodb_encrypt_log.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc + +let $innodb_metrics_select= +SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; + +call mtr.add_suppression("InnoDB: Warning: Small buffer pool size"); +# these will be triggered by DISCARD TABLESPACE +call mtr.add_suppression("InnoDB: Error: table 'test/t1'"); +call mtr.add_suppression("MySQL is trying to open a table handle but the .ibd file for"); + +# DISCARD TABLESPACE needs file-per-table +SET @global_innodb_file_per_table_orig = @@global.innodb_file_per_table; +SET GLOBAL innodb_file_per_table = on; + +# Save the initial number of concurrent sessions. +--source include/count_sessions.inc + +CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT NOT NULL, c3 CHAR(255) NOT NULL) +ENGINE = InnoDB; +INSERT INTO t1 VALUES (1,1,''), (2,2,''), (3,3,''), (4,4,''), (5,5,''); + +SET GLOBAL innodb_monitor_enable = module_ddl; +eval $innodb_metrics_select; + +SET DEBUG_SYNC = 'RESET'; +SET DEBUG_SYNC = 'write_row_noreplace SIGNAL have_handle WAIT_FOR go_ahead'; +--send +INSERT INTO t1 VALUES(1,2,3); + +--echo # Establish session con1 (user=root) +connect (con1,localhost,root,,); +connection con1; + +# This should block at the end because of the INSERT in connection default +# is holding a metadata lock. +SET DEBUG_SYNC = 'now WAIT_FOR have_handle'; +SET lock_wait_timeout = 1; +--error ER_LOCK_WAIT_TIMEOUT +ALTER TABLE t1 ROW_FORMAT=REDUNDANT; +SET DEBUG_SYNC = 'now SIGNAL go_ahead'; + +--echo # session default +connection default; +--error ER_DUP_ENTRY +reap; +eval $innodb_metrics_select; + +--echo # session con1 +connection con1; +SET @saved_debug_dbug = @@SESSION.debug_dbug; +SET DEBUG_DBUG = '+d,innodb_OOM_prepare_inplace_alter'; +--error ER_OUT_OF_RESOURCES +ALTER TABLE t1 ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE, LOCK=NONE; +SET SESSION DEBUG = @saved_debug_dbug; +SET SESSION DEBUG = '+d,innodb_OOM_inplace_alter'; +--error ER_OUT_OF_RESOURCES +ALTER TABLE t1 ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE, LOCK=NONE; +SET SESSION DEBUG = @saved_debug_dbug; +ALTER TABLE t1 ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE, LOCK=NONE; + +--echo # session default +connection default; +SHOW CREATE TABLE t1; +# Insert a duplicate entry (4) for the upcoming UNIQUE INDEX(c2). +BEGIN; +INSERT INTO t1 VALUES(7,4,2); + +--echo # session con1 +connection con1; +# This DEBUG_SYNC should not kick in yet, because the duplicate key will be +# detected before we get a chance to apply the online log. +SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL scanned WAIT_FOR insert_done'; +# This will be a lock wait timeout on the meta-data lock, +# because the transaction inserting (7,4,2) is still active. +--error ER_LOCK_WAIT_TIMEOUT +ALTER TABLE t1 DROP PRIMARY KEY, ADD UNIQUE INDEX(c2); + +--echo # session default +connection default; +COMMIT; + +--echo # session con1 +connection con1; +--error ER_DUP_ENTRY +ALTER TABLE t1 DROP PRIMARY KEY, ADD UNIQUE INDEX(c2); + +--echo # session default +connection default; +DELETE FROM t1 WHERE c1 = 7; + +--echo # session con1 +connection con1; +ALTER TABLE t1 DROP PRIMARY KEY, ADD UNIQUE INDEX(c2), ROW_FORMAT=COMPACT, +LOCK = SHARED, ALGORITHM = INPLACE; + +# The previous DEBUG_SYNC should be ignored, because an exclusive lock +# has been requested and the online log is not being allocated. +ALTER TABLE t1 ADD UNIQUE INDEX(c2), +LOCK = EXCLUSIVE, ALGORITHM = INPLACE; + +SHOW CREATE TABLE t1; +# We do not support plain DROP_PK_INDEX without ADD_PK_INDEX. +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1 DROP INDEX c2, ALGORITHM = INPLACE; +SHOW CREATE TABLE t1; +# Now the previous DEBUG_SYNC should kick in. +--send +ALTER TABLE t1 DROP INDEX c2, ADD PRIMARY KEY(c1); + +--echo # session default +connection default; +SET DEBUG_SYNC = 'now WAIT_FOR scanned'; +eval $innodb_metrics_select; + +# Insert a duplicate entry (4) for the already started UNIQUE INDEX(c1). +BEGIN; +INSERT INTO t1 VALUES(4,7,2); +SET DEBUG_SYNC = 'now SIGNAL insert_done'; + +--echo # session con1 +connection con1; +# Because the modification log will be applied in order and we did +# not roll back before the log apply, there will be a duplicate key +# error on the (4,7,2). +--error ER_DUP_ENTRY +reap; + +--echo # session default +connection default; +ROLLBACK; + +--echo # session con1 +connection con1; +SHOW CREATE TABLE t1; +# Now, rebuild the table without any concurrent DML, while no duplicate exists. +--error ER_CANT_DROP_FIELD_OR_KEY +ALTER TABLE t1 DROP PRIMARY KEY, ADD UNIQUE INDEX(c2), ALGORITHM = INPLACE; +ALTER TABLE t1 DROP INDEX c2, ADD PRIMARY KEY(c1), ALGORITHM = INPLACE; +eval $innodb_metrics_select; + +--echo # session default +connection default; +--error ER_DUP_ENTRY +INSERT INTO t1 VALUES(6,3,1); +--error ER_DUP_ENTRY +INSERT INTO t1 VALUES(7,4,2); +DROP INDEX c2_2 ON t1; +BEGIN; +INSERT INTO t1 VALUES(7,4,2); +ROLLBACK; + +--echo # session con1 +connection con1; +let $ID= `SELECT @id := CONNECTION_ID()`; +--error ER_QUERY_INTERRUPTED +KILL QUERY @id; + +SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL rebuilt WAIT_FOR kill_done'; +--send +ALTER TABLE t1 ROW_FORMAT=REDUNDANT; + +--echo # session default +connection default; +SET DEBUG_SYNC = 'now WAIT_FOR rebuilt'; +eval $innodb_metrics_select; +let $ignore= `SELECT @id := $ID`; +KILL QUERY @id; +SET DEBUG_SYNC = 'now SIGNAL kill_done'; + +--echo # session con1 +connection con1; +--error ER_QUERY_INTERRUPTED +reap; +eval $innodb_metrics_select; + +--echo # session default +connection default; +CHECK TABLE t1; +INSERT INTO t1 SELECT 5 + c1, c2, c3 FROM t1; +INSERT INTO t1 SELECT 10 + c1, c2, c3 FROM t1; +INSERT INTO t1 SELECT 20 + c1, c2, c3 FROM t1; +INSERT INTO t1 SELECT 40 + c1, c2, c3 FROM t1; +# Purge may or may not have cleaned up the DELETE FROM t1 WHERE c1 = 7; +--replace_column 9 ROWS +EXPLAIN SELECT COUNT(*) FROM t1 WHERE c2 > 3; +ANALYZE TABLE t1; + +SET @merge_encrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); + +--echo # session con1 +connection con1; +SHOW CREATE TABLE t1; + +# Exceed the configured innodb_online_alter_log_max_size. +# The actual limit is a multiple of innodb_sort_buf_size, +# because that is the size of the in-memory log buffers. +SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL rebuilt2 WAIT_FOR dml2_done'; +# Ensure that the ALTER TABLE will be executed even with some concurrent DML. +SET lock_wait_timeout = 10; +--send +ALTER TABLE t1 ROW_FORMAT=COMPACT, ALGORITHM = INPLACE; + +# Generate some log (delete-mark, delete-unmark, insert etc.) +# while the index creation is blocked. Some of this may run +# in parallel with the clustered index scan. +--echo # session default +connection default; +INSERT INTO t1 SELECT 80 + c1, c2, c3 FROM t1; +INSERT INTO t1 SELECT 160 + c1, c2, c3 FROM t1; +UPDATE t1 SET c2 = c2 + 1; +SET DEBUG_SYNC = 'now WAIT_FOR rebuilt2'; +# At this point, the clustered index scan must have completed, +# but the modification log keeps accumulating due to the DEBUG_SYNC. +eval $innodb_metrics_select; +let $c= 3; +while ($c) +{ + BEGIN; + DELETE FROM t1; + ROLLBACK; + UPDATE t1 SET c2 = c2 + 1; + BEGIN; + UPDATE t1 SET c2 = c2 + 1; + DELETE FROM t1; + ROLLBACK; + dec $c; +} +# Temporary table should exist until the DDL thread notices the overflow. +eval $innodb_metrics_select; + +SET @merge_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); + +SELECT +(@merge_encrypt_1-@merge_encrypt_0)- +(@merge_decrypt_1-@merge_decrypt_0) as sort_balance, +@merge_encrypt_1>@merge_encrypt_0, @merge_decrypt_1>@merge_decrypt_0, +@rowlog_encrypt_1>@rowlog_encrypt_0; + +# Release con1. +SET DEBUG_SYNC = 'now SIGNAL dml2_done'; + +--echo # session con1 +connection con1; +# If the following fails with the wrong error, it probably means that +# you should rerun with a larger mtr --debug-sync-timeout. +--error ER_INNODB_ONLINE_LOG_TOO_BIG +reap; +# The table should have been dropped from the data dictionary +# when the above error was noticed. +eval $innodb_metrics_select; + +SET @merge_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +SET @rowlog_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); + +# Accumulate and apply some modification log. +SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL rebuilt3 WAIT_FOR dml3_done'; +--error ER_MULTIPLE_PRI_KEY +ALTER TABLE t1 ADD PRIMARY KEY(c22f), CHANGE c2 c22f INT; +--error ER_DUP_ENTRY +ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY(c22f), CHANGE c2 c22f INT; +--send +ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY(c22f,c1,c4(5)), +CHANGE c2 c22f INT, CHANGE c3 c3 CHAR(255) NULL, CHANGE c1 c1 INT AFTER c22f, +ADD COLUMN c4 VARCHAR(6) DEFAULT 'Online', LOCK=NONE; + +--echo # session default +connection default; +SET DEBUG_SYNC = 'now WAIT_FOR rebuilt3'; +# Generate some log (delete-mark, delete-unmark, insert etc.) +eval $innodb_metrics_select; +BEGIN; +INSERT INTO t1 SELECT 320 + c1, c2, c3 FROM t1 WHERE c1 > 240; +DELETE FROM t1 WHERE c1 > 320; +ROLLBACK; +BEGIN; +UPDATE t1 SET c2 = c2 + 1; +DELETE FROM t1; +ROLLBACK; +eval $innodb_metrics_select; +# Release con1. +SET DEBUG_SYNC = 'now SIGNAL dml3_done'; + +--echo # session con1 +connection con1; +reap; +eval $innodb_metrics_select; +SELECT COUNT(c22f) FROM t1; +CHECK TABLE t1; + +SET @merge_encrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +SET @rowlog_decrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); + +SELECT +(@merge_encrypt_2-@merge_encrypt_1)- +(@merge_decrypt_2-@merge_decrypt_1) as sort_balance, +(@rowlog_encrypt_2-@rowlog_encrypt_1)- +(@rowlog_decrypt_2-@rowlog_decrypt_1) as log_balance; +SELECT +@merge_encrypt_2-@merge_encrypt_1>0 as sort_encrypted, +@merge_decrypt_2-@merge_decrypt_1>0 as sort_decrypted, +@rowlog_encrypt_2-@rowlog_encrypt_1>0 as log_encrypted, +@rowlog_decrypt_2-@rowlog_decrypt_1>0 as log_decrypted; + +# Create a column prefix index. +--error ER_DUP_ENTRY +ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY c3p5(c3(5)); +UPDATE t1 SET c3 = NULL WHERE c3 = ''; +SET lock_wait_timeout = 1; +--error ER_KEY_COLUMN_DOES_NOT_EXITS +ALTER TABLE t1 DROP COLUMN c22f, ADD PRIMARY KEY c3p5(c3(5)); +SET @old_sql_mode = @@sql_mode; +# NULL -> NOT NULL only allowed INPLACE if strict sql_mode is on. +# And adding a PRIMARY KEY will also add NOT NULL implicitly! +SET @@sql_mode = 'STRICT_TRANS_TABLES'; +--error ER_INVALID_USE_OF_NULL +ALTER TABLE t1 DROP COLUMN c22f, DROP PRIMARY KEY, ADD PRIMARY KEY c3p5(c3(5)), +ALGORITHM = INPLACE; + +--error ER_INVALID_USE_OF_NULL +ALTER TABLE t1 MODIFY c3 CHAR(255) NOT NULL; +SET @@sql_mode = @old_sql_mode; +UPDATE t1 SET c3=LEFT(CONCAT(c1,REPEAT('foo',c1)),255) WHERE c3 IS NULL; + +SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL c3p5_created0 WAIT_FOR ins_done0'; +# NULL -> NOT NULL only allowed INPLACE if strict sql_mode is on. +SET @@sql_mode = 'STRICT_TRANS_TABLES'; +--send +ALTER TABLE t1 MODIFY c3 CHAR(255) NOT NULL, DROP COLUMN c22f, +DROP PRIMARY KEY, ADD PRIMARY KEY(c1,c4(5)), +ADD COLUMN c5 CHAR(5) DEFAULT 'tired' FIRST; + +--echo # session default +connection default; + +SET DEBUG_SYNC = 'now WAIT_FOR c3p5_created0'; +BEGIN; +INSERT INTO t1 VALUES(347,33101,'Pikku kakkosen posti','YLETV2'); +INSERT INTO t1 VALUES(33101,347,NULL,''); +SET DEBUG_SYNC = 'now SIGNAL ins_done0'; + +--echo # session con1 +connection con1; +--error ER_INVALID_USE_OF_NULL +reap; +SET @@sql_mode = @old_sql_mode; + +--echo # session default +connection default; +ROLLBACK; + +--echo # session con1 +connection con1; +ALTER TABLE t1 MODIFY c3 CHAR(255) NOT NULL; +SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL c3p5_created WAIT_FOR ins_done'; +--send +ALTER TABLE t1 DROP PRIMARY KEY, DROP COLUMN c22f, +ADD COLUMN c6 VARCHAR(1000) DEFAULT +'I love tracking down hard-to-reproduce bugs.', +ADD PRIMARY KEY c3p5(c3(5), c6(2)); + +--echo # session default +connection default; +SET DEBUG_SYNC = 'now WAIT_FOR c3p5_created'; +SET DEBUG_SYNC = 'ib_after_row_insert SIGNAL ins_done WAIT_FOR ddl_timed_out'; +--error ER_BAD_NULL_ERROR +INSERT INTO t1 VALUES(347,33101,NULL,''); +--send +INSERT INTO t1 VALUES(347,33101,'Pikku kakkosen posti',''); + +--echo # session con1 +connection con1; +--error ER_LOCK_WAIT_TIMEOUT +reap; +SET DEBUG_SYNC = 'now SIGNAL ddl_timed_out'; +eval $innodb_metrics_select; + +--echo # session default +connection default; +reap; +SELECT COUNT(*) FROM t1; +ALTER TABLE t1 ROW_FORMAT=REDUNDANT; +SELECT * FROM t1 LIMIT 10; + +--echo # session con1 +connection con1; +ALTER TABLE t1 DISCARD TABLESPACE; +--echo # Disconnect session con1 +disconnect con1; + +--echo # session default +connection default; +SHOW CREATE TABLE t1; +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL innodb_monitor_disable = module_ddl; +DROP TABLE t1; + +# Check that all connections opened by test cases in this file are really +# gone so execution of other tests won't be affected by their presence. +--source include/wait_until_count_sessions.inc + +SET GLOBAL innodb_file_per_table = @global_innodb_file_per_table_orig; +--disable_warnings +SET GLOBAL innodb_monitor_enable = default; +SET GLOBAL innodb_monitor_disable = default; +--enable_warnings diff --git a/mysql-test/suite/innodb/t/innodb-virtual-columns2.test b/mysql-test/suite/innodb/t/innodb-virtual-columns2.test new file mode 100644 index 00000000000..474a6354576 --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb-virtual-columns2.test @@ -0,0 +1,54 @@ +--source include/have_innodb.inc + +# +# MDEV-11724: InnoDB: Failing assertion: len <= col->len || ((col->mtype) == 5 || (col->mtype) == 16 || (col->mtype) == 14) || (((col->mtype) == 15 || (col->mtype) == 16) && len == 2 * 2 * sizeof(double)) || (col->len == 0 && col->mtype == 1) +# + +CREATE TABLE t1 ( + y YEAR NULL, + i SMALLINT NULL, + c VARCHAR(8) NOT NULL DEFAULT '', + vi SMALLINT AS (i) VIRTUAL, + INDEX(y) +) ENGINE=InnoDB; + +SHOW CREATE TABLE t1; +SELECT * FROM t1 WHERE y BETWEEN 2012 AND 2016 FOR UPDATE; +INSERT INTO t1 (i) VALUES (1),(2); +SELECT * FROM t1 WHERE y BETWEEN 2012 AND 2016 FOR UPDATE; +DROP TABLE t1; + +# +# MDEV-11725: InnoDB: Failing assertion: !rec || !cmp_dtuple_rec(tuple, rec, *offsets) +# + +CREATE TABLE t1 ( + y YEAR NULL, + i SMALLINT NULL, + vi SMALLINT AS (i) VIRTUAL, + INDEX(y) +) ENGINE=InnoDB; + +SHOW CREATE TABLE t1; +SELECT * FROM t1 WHERE y BETWEEN 2012 AND 2016 FOR UPDATE; +INSERT INTO t1 (i) VALUES (1),(2); +SELECT * FROM t1 WHERE y BETWEEN 2012 AND 2016 FOR UPDATE; +DROP TABLE t1; + +# +# MDEV-11726: Server crashes in mach_read_from_n_little_endian +# + +CREATE TABLE t1 ( + y YEAR NULL, + i SMALLINT NULL, + b BLOB NULL, + vi SMALLINT AS (i) VIRTUAL, + INDEX(y) +) ENGINE=InnoDB; + +SHOW CREATE TABLE t1; +SELECT * FROM t1 WHERE y BETWEEN 2012 AND 2016 FOR UPDATE; +INSERT INTO t1 (i) VALUES (1),(2); +SELECT * FROM t1 WHERE y BETWEEN 2012 AND 2016 FOR UPDATE; +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/innodb-wl5522-debug.test b/mysql-test/suite/innodb/t/innodb-wl5522-debug.test index 6b6506e8481..ca37521b9cf 100644 --- a/mysql-test/suite/innodb/t/innodb-wl5522-debug.test +++ b/mysql-test/suite/innodb/t/innodb-wl5522-debug.test @@ -1055,7 +1055,9 @@ CREATE TABLE test_wl5522.t1 ( INDEX idx3(c4(512))) Engine=InnoDB; # Stop purge so that it doesn't remove the delete marked entries. -SET GLOBAL INNODB_PURGE_STOP_NOW=ON; +connect (purge_control,localhost,root); +START TRANSACTION WITH CONSISTENT SNAPSHOT; +connection default; # Disable change buffer merge from the master thread, additionally # enable aggressive flushing so that more changes are buffered. @@ -1125,7 +1127,10 @@ SELECT name SET GLOBAL innodb_disable_background_merge=OFF; # Enable normal operation -SET GLOBAL INNODB_PURGE_RUN_NOW=ON; +connection purge_control; +COMMIT; +disconnect purge_control; +connection default; DROP TABLE test_wl5522.t1; diff --git a/mysql-test/suite/innodb/t/innodb-wl5980-alter.opt b/mysql-test/suite/innodb/t/innodb-wl5980-alter.opt new file mode 100644 index 00000000000..aa400236153 --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb-wl5980-alter.opt @@ -0,0 +1,3 @@ +--loose-innodb-sys-indexes +--loose-innodb-sys-columns +--loose-innodb-sys-fields diff --git a/mysql-test/suite/innodb/t/innodb-wl5980-alter.test b/mysql-test/suite/innodb/t/innodb-wl5980-alter.test new file mode 100644 index 00000000000..4b26661793c --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb-wl5980-alter.test @@ -0,0 +1,619 @@ +--echo # +--echo # This is a copy of innodb-alter.test except using remote tablespaces +--echo # and showing those files. +--echo # + +--source include/have_innodb.inc + +--disable_query_log +# These values can change during the test +LET $innodb_file_per_table_orig=`select @@innodb_file_per_table`; +LET $regexp=/FTS_([0-9a-f_]+)([A-Z0-9_]+)\.ibd/FTS_AUX_\2.ibd/; + +# Set up some variables +LET $MYSQL_DATA_DIR = `select @@datadir`; +LET $data_directory_clause = DATA DIRECTORY='$MYSQL_TMP_DIR/alt_dir'; +--enable_query_log + +SET default_storage_engine=InnoDB; +SET GLOBAL innodb_file_per_table=ON; + +SET NAMES utf8mb4; + +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +eval CREATE TABLE t1 ( + c1 INT PRIMARY KEY, c2 INT DEFAULT 1, ct TEXT, + INDEX(c2)) +ENGINE=InnoDB $data_directory_clause; + +INSERT INTO t1 SET c1=1; + +CREATE TABLE sys_tables SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES +WHERE NAME LIKE 'test/t%'; +CREATE TABLE sys_indexes SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; + +CREATE TABLE t1p LIKE t1; + +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +eval CREATE TABLE t1c (c1 INT PRIMARY KEY, c2 INT, c3 INT, INDEX(c2), INDEX(c3), + CONSTRAINT t1c2 FOREIGN KEY (c2) REFERENCES t1(c2), + CONSTRAINT t1c3 FOREIGN KEY (c3) REFERENCES t1p(c2)) +ENGINE=InnoDB $data_directory_clause; + +CREATE TABLE sys_foreign SELECT i.* +FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN i +WHERE FOR_NAME LIKE 'test/t%'; + +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; + +-- source suite/innodb/include/innodb_dict.inc + +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE t1; +ALTER TABLE t1 ALTER c2 DROP DEFAULT; +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE t1; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +-- source suite/innodb/include/innodb_dict.inc + +# These should be no-op. +ALTER TABLE t1 CHANGE c2 c2 INT AFTER c1; +ALTER TABLE t1 CHANGE c1 c1 INT FIRST; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +-- source suite/innodb/include/innodb_dict.inc + +ALTER TABLE t1 CHANGE C2 c3 INT; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +-- source suite/innodb/include/innodb_dict.inc + +ALTER TABLE t1 CHANGE c3 C INT; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +-- source suite/innodb/include/innodb_dict.inc + +ALTER TABLE t1 CHANGE C Cöŀumň_TWO INT; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i +INNER JOIN sys_foreign sf ON i.ID = sf.ID; + +-- source suite/innodb/include/innodb_dict.inc + +-- error ER_BAD_FIELD_ERROR +ALTER TABLE t1 CHANGE cöĿǖmň_two c3 INT; + +ALTER TABLE t1 CHANGE cÖĿUMŇ_two c3 INT, RENAME TO t3; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +SELECT st.NAME, i.NAME +FROM sys_tables st INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES i +ON i.TABLE_ID=st.TABLE_ID; + +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE t3; +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE t1c; + +# The maximum column name length should be 64 characters. +--error ER_TOO_LONG_IDENT +ALTER TABLE t3 CHANGE c3 +`12345678901234567890123456789012345678901234567890123456789012345` INT; +ALTER TABLE t3 CHANGE c3 +`1234567890123456789012345678901234567890123456789012345678901234` INT; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE t3; + +# Test the length limit with non-ASCII utf-8 characters. +--error ER_TOO_LONG_IDENT +ALTER TABLE t3 CHANGE +`1234567890123456789012345678901234567890123456789012345678901234` +`倀å€å€‚倃倄倅倆倇倈倉倊個倌å€å€Žå€å€å€‘倒倓倔倕倖倗倘候倚倛倜å€å€žå€Ÿå€ å€¡å€¢å€£å€¤å€¥å€¦å€§å€¨å€©å€ªå€«å€¬å€­å€®å€¯å€°å€±å€²å€³å€´å€µå€¶å€·å€¸å€¹å€ºå€»å€¼å€½å€¾å€¿å€` INT; + +--error ER_TOO_LONG_IDENT +ALTER TABLE t3 CHANGE +`1234567890123456789012345678901234567890123456789012345678901234` +`倀å€å€‚倃倄倅倆倇倈倉倊個倌å€å€Žå€å€å€‘倒倓倔倕倖倗倘候倚倛倜å€å€žå€Ÿå€ å€¡å€¢å€£å€¤å€¥å€¦å€§å€¨å€©å€ªå€«å€¬å€­å€®å€¯å€°å€±å€²å€³å€´å€µå€¶å€·å€¸å€¹å€ºå€»å€¼å€½å€¾å€¿Ã¤` INT; + +ALTER TABLE t3 CHANGE +`1234567890123456789012345678901234567890123456789012345678901234` +`倀å€å€‚倃倄倅倆倇倈倉倊個倌å€å€Žå€å€å€‘倒倓倔倕倖倗倘候倚倛倜å€å€žå€Ÿå€ å€¡å€¢å€£å€¤å€¥å€¦å€§å€¨å€©å€ªå€«å€¬å€­å€®å€¯å€°å€±å€²å€³å€´å€µå€¶å€·å€¸å€¹å€ºå€»å€¼å€½å€¾Ã¤` INT; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +# check that the rename is case-insensitive (note the upper-case ä at end) +ALTER TABLE t3 CHANGE +`倀å€å€‚倃倄倅倆倇倈倉倊個倌å€å€Žå€å€å€‘倒倓倔倕倖倗倘候倚倛倜å€å€žå€Ÿå€ å€¡å€¢å€£å€¤å€¥å€¦å€§å€¨å€©å€ªå€«å€¬å€­å€®å€¯å€°å€±å€²å€³å€´å€µå€¶å€·å€¸å€¹å€ºå€»å€¼å€½å€¾Ã„` +c3 INT; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +# test with 4-byte UTF-8 (should be disallowed) +--error ER_INVALID_CHARACTER_STRING +ALTER TABLE t3 CHANGE c3 ðŒ€ðŒðŒ‚ðŒƒðŒ„ðŒ…ðŒ†ðŒ‡ðŒˆðŒ‰ðŒŠðŒ‹ðŒŒðŒðŒŽðŒðŒðŒ‘ðŒ’ðŒ“ðŒ”ðŒ•ðŒ–ðŒ—ðŒ˜ðŒ™ðŒšðŒ›ðŒœ INT; + +--error ER_INVALID_CHARACTER_STRING +ALTER TABLE t3 CHANGE c3 😲 INT; + +ALTER TABLE t3 RENAME TO t2; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +SELECT st.NAME, i.NAME +FROM sys_tables st INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES i +ON i.TABLE_ID=st.TABLE_ID; + +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE t2; + +RENAME TABLE t2 TO t1; + +SELECT st.NAME, i.NAME +FROM sys_tables st INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES i +ON i.TABLE_ID=st.TABLE_ID; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +-- source suite/innodb/include/innodb_dict.inc + +--error ER_DROP_INDEX_FK +ALTER TABLE t1 DROP INDEX c2; + +--error ER_CANT_DROP_FIELD_OR_KEY +ALTER TABLE t1 DROP INDEX c4; + +--error ER_CANT_DROP_FIELD_OR_KEY +ALTER TABLE t1c DROP FOREIGN KEY c2; + +--error ER_CANT_DROP_FIELD_OR_KEY +ALTER TABLE t1c DROP FOREIGN KEY t1c2, DROP FOREIGN KEY c2; + +--error ER_CANT_DROP_FIELD_OR_KEY +ALTER TABLE t1c DROP FOREIGN KEY t1c2, DROP FOREIGN KEY c2, DROP INDEX c2; + +--error ER_DROP_INDEX_FK +ALTER TABLE t1c DROP INDEX c2; + +--error ER_CANT_DROP_FIELD_OR_KEY +ALTER TABLE t1c DROP FOREIGN KEY ẗ1C2; + +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE t1c; + +SET foreign_key_checks=0; +DROP TABLE t1p; +SET foreign_key_checks=1; + +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE t1c; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +-- source suite/innodb/include/innodb_dict.inc + +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +eval CREATE TABLE t1p (c1 INT PRIMARY KEY, c2 INT, INDEX(c2)) + ENGINE=InnoDB $data_directory_clause; + +--error ER_DROP_INDEX_FK +ALTER TABLE t1c DROP INDEX C2, DROP INDEX C3; +--error ER_DROP_INDEX_FK +ALTER TABLE t1c DROP INDEX C3; + +SET foreign_key_checks=0; +ALTER TABLE t1c DROP INDEX C3; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +SET foreign_key_checks=1; + +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE t1c; + +-- source suite/innodb/include/innodb_dict.inc + +ALTER TABLE t1c DROP FOREIGN KEY t1C3; + +--echo ### files in MYSQL_DATA_DIR/test +--list_files $MYSQL_DATA_DIR/test +--replace_regex $regexp +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE t1c; +-- source suite/innodb/include/innodb_dict.inc + +ALTER TABLE t1c DROP INDEX c2, DROP FOREIGN KEY t1C2; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE t1c; + +-- source suite/innodb/include/innodb_dict.inc + +ALTER TABLE t1 DROP INDEX c2, CHANGE c3 c2 INT; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +-- source suite/innodb/include/innodb_dict.inc + +CREATE TABLE t1o LIKE t1; + +# This will implicitly add a DOC_ID column. +# The LOCK=NONE should thus fail. +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1 ADD FULLTEXT INDEX (ct), +CHANGE c1 pk INT, ALTER c2 SET DEFAULT 42, RENAME TO tt, +ALGORITHM=INPLACE, LOCK=NONE; + +# Retry with LOCK=EXCLUSIVE. +ALTER TABLE t1 ADD FULLTEXT INDEX (ct), +CHANGE c1 pk INT, ALTER c2 SET DEFAULT 42, RENAME TO tt, +ALGORITHM=INPLACE, LOCK=SHARED; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +# The output should be empty, because index->id was reassigned. +-- source suite/innodb/include/innodb_dict.inc + +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE tt; + +# DB_ROW_ID, DB_TRX_ID, DB_ROLL_PTR are reserved InnoDB system column names. +--error ER_WRONG_COLUMN_NAME +ALTER TABLE t1o CHANGE c1 dB_row_Id INT, ALGORITHM=COPY; +--error ER_WRONG_COLUMN_NAME +ALTER TABLE t1o CHANGE c1 dB_row_Id INT, ALGORITHM=INPLACE; +--error ER_WRONG_COLUMN_NAME +ALTER TABLE t1o CHANGE c1 DB_TRX_ID INT; +--error ER_WRONG_COLUMN_NAME +ALTER TABLE t1o CHANGE c1 db_roll_ptr INT; + +# FTS_DOC_ID is the internal row identifier for full-text search. +# It should be of type BIGINT UNSIGNED NOT NULL. +--error ER_WRONG_COLUMN_NAME +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), CHANGE c1 FTS_DOC_ID INT, +ALGORITHM=COPY; + +--error ER_INNODB_FT_WRONG_DOCID_COLUMN +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), CHANGE c1 FTS_DOC_ID INT, +ALGORITHM=INPLACE; +--error ER_WRONG_COLUMN_NAME +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), CHANGE c1 FTS_Doc_ID INT, +ALGORITHM=INPLACE; +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), +CHANGE c1 FTS_DOC_ID BIGINT UNSIGNED NOT NULL, +ALGORITHM=INPLACE; + +CREATE TABLE t1n LIKE t1o; + +ALTER TABLE t1n ADD FULLTEXT INDEX(ct); + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +--error ER_WRONG_COLUMN_NAME +ALTER TABLE t1n CHANGE c1 Fts_DOC_ID INT, ALGORITHM=INPLACE; +--error ER_WRONG_COLUMN_NAME +ALTER TABLE t1n CHANGE c1 Fts_DOC_ID INT, ALGORITHM=COPY; +--error ER_BAD_FIELD_ERROR +ALTER TABLE t1n CHANGE FTS_DOC_ID c11 INT, ALGORITHM=INPLACE; +ALTER TABLE t1n CHANGE c1 FTS_DOC_ïD INT, ALGORITHM=INPLACE; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +ALTER TABLE t1n CHANGE FTS_DOC_ÃD c1 INT, ALGORITHM=INPLACE; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +ALTER TABLE t1n CHANGE c1 c2 INT, CHANGE c2 ct INT, CHANGE ct c1 TEXT, +ALGORITHM=INPLACE; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE t1n; +ALTER TABLE t1n CHANGE c2 c1 INT, CHANGE ct c2 INT, CHANGE c1 ct TEXT, +ALGORITHM=COPY; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE t1n; + +--error ER_KEY_COLUMN_DOES_NOT_EXITS +ALTER TABLE t1n ADD INDEX(c2), CHANGE c2 c4 INT, ALGORITHM=INPLACE; +--error ER_KEY_COLUMN_DOES_NOT_EXITS +ALTER TABLE t1n ADD INDEX(c2), CHANGE c2 c4 INT, ALGORITHM=COPY; + +# FIXME: MDEV-13668 InnoDB unnecessarily rebuilds table +# when renaming a column and adding index +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1n ADD INDEX(c4), CHANGE c2 c4 INT, ALGORITHM=INPLACE; +ALTER TABLE t1n CHANGE c2 c4 INT, LOCK=NONE; +ALTER TABLE t1n ADD INDEX(c4), LOCK=NONE; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE t1n; +ALTER TABLE t1n DROP INDEX c4; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +--error ER_DUP_FIELDNAME +ALTER TABLE t1n CHANGE c4 c1 INT, ADD INDEX(c1), ALGORITHM=INPLACE; +# FIXME: MDEV-13668 +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1n CHANGE c4 c11 INT, ADD INDEX(c11), ALGORITHM=INPLACE; +ALTER TABLE t1n CHANGE c4 c11 INT, LOCK=NONE; +ALTER TABLE t1n ADD INDEX(c11), LOCK=NONE; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE t1n; +DROP TABLE t1n; + +ALTER TABLE t1o MODIFY c1 BIGINT UNSIGNED NOT NULL; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +# FIXME: MDEV-9469 'Incorrect key file' on ALTER TABLE +call mtr.add_suppression("Error: no matching column for .FTS_DOC_ID. in index .ct.--temporary-- of table .test...t1o"); +--error ER_NOT_KEYFILE +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), +CHANGE c1 FTS_DOC_ID BIGINT UNSIGNED NOT NULL, +ALGORITHM=INPLACE; + +--echo # The following would crash 10.2. Re-enable this and test after merge! +ALTER TABLE t1o CHANGE c1 FTS_DOC_ID BIGINT UNSIGNED NOT NULL, LOCK=NONE; +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), ALGORITHM=INPLACE; +# end of MDEV-9469 FIXME + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +# This would create a hidden FTS_DOC_ID column, which cannot be done online. +# FIXME: MDEV-9469 (enable this) +#--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +#ALTER TABLE t1o CHANGE FTS_DOC_ID foo_id BIGINT UNSIGNED NOT NULL, +#LOCK=NONE; +#end of MDEV-9469 FIXME + +# This should not show duplicates. +SELECT sc.pos FROM information_schema.innodb_sys_columns sc +INNER JOIN information_schema.innodb_sys_tables st +ON sc.TABLE_ID=st.TABLE_ID +WHERE st.NAME='test/t1o' AND sc.NAME='FTS_DOC_ID'; + +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE t1o; + +# FIXME: MDEV-13668 +ALTER TABLE t1o CHANGE FTS_DOC_ID foo_id BIGINT UNSIGNED NOT NULL, +DROP INDEX ct, LOCK=NONE; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE t1o; + +DROP TABLE t1c, t1p, sys_tables, sys_indexes, sys_foreign; + +# Check the internal schemata of tt, t1o. + +CREATE TABLE sys_tables SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES +WHERE NAME='test/t1o'; +CREATE TABLE sys_indexes SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; +CREATE TABLE sys_foreign SELECT i.* +FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN i WHERE FOR_NAME='test/t1o'; + +-- source suite/innodb/include/innodb_dict.inc + +# Ensure that there exists no hidden FTS_DOC_ID_INDEX on foo_id. + +ALTER TABLE t1o ADD UNIQUE INDEX FTS_DOC_ID_INDEX(foo_id); + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +# FIXME: MDEV-9469 'Incorrect key file' on ALTER TABLE +--error ER_NOT_KEYFILE +ALTER TABLE t1o CHANGE foo_id FTS_DOC_ID BIGINT UNSIGNED NOT NULL, +ADD FULLTEXT INDEX(ct); + +ALTER TABLE t1o CHANGE foo_id FTS_DOC_ID BIGINT UNSIGNED NOT NULL, LOCK=NONE; +ALTER TABLE t1o ADD FULLTEXT INDEX(ct), ALGORITHM=INPLACE; +#end of MDEV-9469 FIXME + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test + +--error ER_INNODB_FT_WRONG_DOCID_INDEX +ALTER TABLE t1o CHANGE FTS_DOC_ID foo_id BIGINT UNSIGNED NOT NULL; + +DROP TABLE sys_indexes; +CREATE TABLE sys_indexes SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES i +INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID; + +-- source suite/innodb/include/innodb_dict.inc + +--echo # +--echo # Cleanup +--echo # + +DROP TABLE tt, t1o, sys_tables, sys_indexes, sys_foreign; + +--echo ### files in MYSQL_DATA_DIR/test +--replace_regex $regexp +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--replace_regex $regexp +--list_files $MYSQL_TMP_DIR/alt_dir/test +--rmdir $MYSQL_TMP_DIR/alt_dir/test +--rmdir $MYSQL_TMP_DIR/alt_dir + +-- disable_query_log +eval set global innodb_file_per_table=$innodb_file_per_table_orig; +call mtr.add_suppression("deleting orphaned .ibd file"); +-- enable_query_log diff --git a/mysql-test/suite/innodb/t/innodb_bug14147491.test b/mysql-test/suite/innodb/t/innodb_bug14147491.test index c848d24294d..09f9d53eaff 100644 --- a/mysql-test/suite/innodb/t/innodb_bug14147491.test +++ b/mysql-test/suite/innodb/t/innodb_bug14147491.test @@ -1,28 +1,26 @@ # # Test opening a corrupted table. # -# Valgrind can hang or return spurious messages on DBUG_SUICIDE -source include/not_valgrind.inc; -# Avoid CrashReporter popup on Mac -source include/not_crashrep.inc; # Restarting is not supported under embedded -source include/not_embedded.inc; +-- source include/not_embedded.inc # Require InnoDB -source include/have_innodb.inc; -# Require Debug for SET DEBUG -source include/have_debug.inc; -# Not encrypted tables -source include/not_encrypted.inc; -# Test could open crash reporter on Windows -# if compiler set up -source include/not_windows.inc; +-- source include/have_innodb.inc +-- source include/not_encrypted.inc --disable_query_log -CALL mtr.add_suppression("\\[ERROR\\] \\[FATAL\\] InnoDB: Unable to read page \\[page id: space=.*, page number=.*\\] into the buffer pool after 100 attempts"); -CALL mtr.add_suppression("\\[ERROR\\] InnoDB: Database page corruption on disk or a failed"); +call mtr.add_suppression("InnoDB: Table `test`.`t1` is corrupted. Please drop the table and recreate."); +call mtr.add_suppression("InnoDB: Cannot open table test/t1 from the internal data dictionary of InnoDB though the .frm file for the table exists. Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting.html for how to resolve the issue."); +call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed file read of tablespace test/t1 page \[page id: space=[0-9]+, page number=[0-9]+\]. You may have to recover from a backup."); +call mtr.add_suppression("InnoDB: We detected index corruption in an InnoDB type table.*"); +call mtr.add_suppression("mysqld: Index for table 't1' is corrupt; try to repair it"); +call mtr.add_suppression("mysqld.exe: Index for table 't1' is corrupt; try to repair it"); --enable_query_log -CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ROW_FORMAT=COMPACT ENGINE=InnoDB; +--echo # Create and populate the table to be corrupted + +set global innodb_file_per_table=ON; + +CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ENGINE=InnoDB; INSERT INTO t1 (b) VALUES ('corrupt me'); --disable_query_log --let $i = 10 @@ -39,9 +37,6 @@ let t1_IBD = $MYSQLD_DATADIR/test/t1.ibd; --source include/shutdown_mysqld.inc ---echo # Backup the t1.ibd before corrupting ---copy_file $t1_IBD $MYSQLD_DATADIR/test/t1.ibd.backup - --echo # Corrupt the table perl; @@ -71,27 +66,16 @@ EOF --source include/start_mysqld.inc -SET DEBUG_DBUG = '+d,innodb_page_corruption_retries'; +--echo # Now t1 is corrupted but we should not crash ---echo # Write file to make mysql-test-run.pl expect the "crash", but don't ---echo # start it until it's told to ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect - ---echo # The below SELECT query will crash the server because some pages ---echo # on the disk are corrupted ---error 2013 +--error 1030,1712,1932 SELECT * FROM t1; -# The below mtr command --remove_file fails randomly on windows with -# error number 13 which is permission denied on nix systems. We sleep -# 1 second hoping that any process holding lock on t1.ibd is released. -SLEEP 1; +--error 126,1030,1034,1712,1932 +INSERT INTO t1(b) VALUES('abcdef'); ---echo # Restore the original t1.ibd ---remove_file $MYSQLD_DATADIR/test/t1.ibd ---move_file $MYSQLD_DATADIR/test/t1.ibd.backup $MYSQLD_DATADIR/test/t1.ibd +--error 1030,1712,1932 +UPDATE t1 set b = 'deadbeef' where a = 1; ---source include/start_mysqld.inc - ---echo # Cleanup +--echo # Cleanup, this must be possible DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/innodb_defragment_fill_factor.test b/mysql-test/suite/innodb/t/innodb_defragment_fill_factor.test index 2edc8a45c02..3a5897b9911 100644 --- a/mysql-test/suite/innodb/t/innodb_defragment_fill_factor.test +++ b/mysql-test/suite/innodb/t/innodb_defragment_fill_factor.test @@ -4,11 +4,6 @@ --source include/not_embedded.inc --source include/have_innodb_16k.inc ---disable_warnings -DROP TABLE if exists t1; -DROP TABLE if exists t2; ---enable_warnings - --echo Testing tables with large records # Create table. CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b VARCHAR(256), c VARCHAR(256), KEY SECOND(a, b,c)) ENGINE=INNODB; @@ -36,7 +31,7 @@ while ($size) } --enable_query_log ---source include/wait_innodb_all_purged.inc +SET GLOBAL innodb_fast_shutdown = 0; --source include/restart_mysqld.inc optimize table t1; @@ -135,7 +130,7 @@ while ($size) } --enable_query_log ---source include/wait_innodb_all_purged.inc +SET GLOBAL innodb_fast_shutdown = 0; --source include/restart_mysqld.inc optimize table t2; @@ -206,5 +201,3 @@ if ($second_before == $second_after) { } DROP TABLE t2; - ---source include/wait_innodb_all_purged.inc diff --git a/mysql-test/suite/innodb/t/innodb_force_recovery.test b/mysql-test/suite/innodb/t/innodb_force_recovery.test index 31b9660e872..f9af16f6609 100644 --- a/mysql-test/suite/innodb/t/innodb_force_recovery.test +++ b/mysql-test/suite/innodb/t/innodb_force_recovery.test @@ -10,7 +10,7 @@ call mtr.add_suppression("InnoDB: Allocated tablespace ID \\d+ for test.t[12], o --enable_query_log create table t1(f1 int not null, f2 int not null, index idx(f2))engine=innodb; -create table t2(f1 int not null, f2 int not null, index idx(f2))engine=innodb; +create table t2(f1 int primary key, f2 int, index idx(f2))engine=innodb; insert into t1 values(1, 2); insert into t2 values(1, 2); @@ -132,8 +132,40 @@ truncate table t2; drop table t2; show tables; +--echo # Restart the server with innodb_force_recovery=2 +--let $restart_parameters= --innodb-force-recovery=2 +--source include/restart_mysqld.inc + +select * from t2; +begin; +update t2 set f2=3; + +connect (con1,localhost,root,,); +create table t3(a int)engine=innodb; +--echo # Force a redo log flush of the above uncommitted UPDATE +SET GLOBAL innodb_flush_log_at_trx_commit=1; +drop table t3; +disconnect con1; + +connection default; +--source include/kill_mysqld.inc + +--echo # Restart the server with innodb_force_recovery=3 +--let $restart_parameters= --innodb-force-recovery=3 +--source include/start_mysqld.inc + +SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +select * from t2; +SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; +select * from t2; +SET GLOBAL innodb_lock_wait_timeout=1; +--error ER_LOCK_WAIT_TIMEOUT +insert into t2 values(1,2); +insert into t2 values(9,10); + --let $restart_parameters= --source include/restart_mysqld.inc +select * from t2; drop table t2; show tables; diff --git a/mysql-test/suite/innodb/t/innodb_gis.test b/mysql-test/suite/innodb/t/innodb_gis.test index 45d66d95002..cb04c15f0b6 100644 --- a/mysql-test/suite/innodb/t/innodb_gis.test +++ b/mysql-test/suite/innodb/t/innodb_gis.test @@ -11,3 +11,12 @@ SET storage_engine=innodb; create table t1 (g geometry not null, spatial gk(g)) engine=innodb; drop table t1; +# +# MDEV-12462 SPATIAL index fails to work with CONTAINS +# + +create table t1(id int not null primary key, g1 geometry not null, spatial index(g1)); +insert into t1 values(1, polygonfromtext('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))')); +explain select id from t1 where contains(g1, pointfromtext('POINT(1 1)')); +select id from t1 where contains(g1, pointfromtext('POINT(1 1)')); +drop table t1; diff --git a/mysql-test/suite/innodb/t/innodb_max_recordsize_32k.opt b/mysql-test/suite/innodb/t/innodb_max_recordsize_32k.opt new file mode 100644 index 00000000000..f543bd0da39 --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb_max_recordsize_32k.opt @@ -0,0 +1,3 @@ +--innodb-page-size=32K +--innodb_buffer_pool_size=32M +--innodb-stats-persistent=ON diff --git a/mysql-test/suite/innodb/t/innodb_max_recordsize_32k.test b/mysql-test/suite/innodb/t/innodb_max_recordsize_32k.test new file mode 100644 index 00000000000..8549bbfdbef --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb_max_recordsize_32k.test @@ -0,0 +1,403 @@ +--source include/have_innodb.inc +--source include/have_innodb_32k.inc + +call mtr.add_suppression('InnoDB: Cannot add field.*because after adding it, the row size is'); + +# Check page size 32k +SELECT @@innodb_page_size; + +let $innodb_file_per_table = `SELECT @@innodb_file_per_table`; +let $innodb_file_format = `SELECT @@innodb_file_format`; +let $innodb_strict_mode = `SELECT @@innodb_strict_mode`; + +--disable_warnings +SET GLOBAL innodb_file_format='Barracuda'; +SET GLOBAL innodb_file_per_table=ON; +SET @@innodb_strict_mode=ON; +--enable_warnings + +SELECT @@innodb_file_format; +SELECT @@innodb_file_per_table; +SELECT @@innodb_strict_mode; + +# Check the error when the max record length > 16K for innodb_page_size=32k +--error ER_TOO_BIG_ROWSIZE +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT= COMPACT; + +# Check the error when the max record length > 16K for innodb_page_size=32k +--error ER_TOO_BIG_ROWSIZE +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT= DYNAMIC; +show warnings; + +# Check the error when the max record length > 16K for innodb_page_size=32k +--error ER_TOO_BIG_ROWSIZE +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT=REDUNDANT; +show warnings; + +# FIXED not supported +-- error 1005 +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT=FIXED; +show warnings; + +-- error 1005 +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT=COMPRESSED; +show warnings; + +--disable_warnings +SET @@innodb_strict_mode=OFF; +SELECT @@innodb_strict_mode; +--enable_warnings + +# Check the Warning | 139 | Row size too large (> 16318) +--replace_regex /> [0-9]+/> NNNN/ +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT=COMPACT; + +# row size 16353 > 16K +--error ER_TOO_BIG_ROWSIZE +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),'a',NULL); + +SELECT * FROM tab5; +DROP TABLE tab5; + +# Check the Warning | 139 | Row size too large (> 16318) +--replace_regex /> [0-9]+/> NNNN/ +CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), +col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), +col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), +col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), +col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), +col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), +col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), +col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), +col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), +col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), +col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) +ENGINE = innodb ROW_FORMAT=COMPACT; + +# row size 16318 : expected to fail +--error ER_TOO_BIG_ROWSIZE +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',156),NULL); + +# row size 16317 +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',155),NULL); + +SELECT * FROM tab5; +DROP TABLE tab5; + +# Check the Warning | 139 | Row size too large (> 16318) +--replace_regex /> [0-9]+/> NNNN/ +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT=DYNAMIC; +DROP TABLE tab5; + +# Check the Warning | 139 | Row size too large (> 16318) +--replace_regex /> [0-9]+/> NNNN/ +CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), +col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), +col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), +col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), +col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), +col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), +col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), +col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), +col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), +col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), +col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) +ENGINE = innodb ROW_FORMAT=DYNAMIC; + +# row size 16318 : expected to fail +--error ER_TOO_BIG_ROWSIZE +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',156),NULL); + +# row size 16317 +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',155),NULL); + +SELECT * FROM tab5; +DROP TABLE tab5; + +# Check the Warning | 139 | Row size too large (> 16318) +--replace_regex /> [0-9]+/> NNNN/ +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT=REDUNDANT; + +# 65 * 255 = 16575 +--error ER_TOO_BIG_ROWSIZE +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255)); + +SELECT * FROM tab5; +DROP TABLE tab5; + +# Check the Warning | 139 | Row size too large (> 16318) +--replace_regex /> [0-9]+/> NNNN/ +CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), +col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), +col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), +col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), +col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), +col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), +col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), +col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), +col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), +col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), +col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) +ENGINE = innodb ROW_FORMAT=REDUNDANT; + +# row size 16315 : expected to fail +--error ER_TOO_BIG_ROWSIZE +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',89),NULL); + +# row size 16314 +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',88),NULL); + +SELECT * FROM tab5; +DROP TABLE tab5; + +# Check the Warning | 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > NNNNk. Assuming ROW_FORMAT=COMPACT +--replace_regex /> [0-9]+/> NNNN/ +CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), +col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), +col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), +col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), +col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), +col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), +col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), +col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), +col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), +col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), +col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) +ENGINE = innodb ROW_FORMAT=COMPRESSED; + +DROP TABLE tab5; + +CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; +SHOW WARNINGS; +INSERT INTO t VALUES (REPEAT('a',16384)); +INSERT INTO t VALUES (REPEAT('a',32768)); +INSERT INTO t VALUES (REPEAT('a',65535)); +SELECT LENGTH(col) FROM t; +FLUSH TABLE t; +ANALYZE TABLE t; +# retrieve the number of leaf pages +SELECT stat_value FROM mysql.innodb_index_stats where database_name = 'test' and table_name= 't' and stat_name='n_leaf_pages'; +SELECT clustered_index_size from mysql.innodb_table_stats where database_name = 'test' and table_name= 't'; +DROP TABLE t; + +CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; +SHOW WARNINGS; +INSERT INTO t VALUES (REPEAT('a',16384)); +INSERT INTO t VALUES (REPEAT('a',32768)); +INSERT INTO t VALUES (REPEAT('a',65535)); +SELECT LENGTH(col) FROM t; +FLUSH TABLE t; +ANALYZE TABLE t; +# retrieve the number of leaf pages +SELECT stat_value FROM mysql.innodb_index_stats where database_name = 'test' and table_name= 't' and stat_name='n_leaf_pages'; +SELECT clustered_index_size from mysql.innodb_table_stats where database_name = 'test' and table_name= 't'; +DROP TABLE t; + +CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=COMPACT; +SHOW WARNINGS; +INSERT INTO t VALUES (REPEAT('a',16384)); +INSERT INTO t VALUES (REPEAT('a',32768)); +INSERT INTO t VALUES (REPEAT('a',65535)); +SELECT LENGTH(col) FROM t; +FLUSH TABLE t; +ANALYZE TABLE t; +# retrieve the number of leaf pages +SELECT stat_value FROM mysql.innodb_index_stats where database_name = 'test' and table_name= 't' and stat_name='n_leaf_pages'; +SELECT clustered_index_size from mysql.innodb_table_stats where database_name = 'test' and table_name= 't'; +DROP TABLE t; + +# cleanup +--disable_query_log +--disable_warnings +eval SET GLOBAL INNODB_FILE_FORMAT=$innodb_file_format; +eval SET GLOBAL INNODB_FILE_PER_TABLE=$innodb_file_per_table; +eval SET GLOBAL INNODB_STRICT_MODE=$innodb_strict_mode; +--enable_warnings +--enable_query_log + +--echo # Success + diff --git a/mysql-test/suite/innodb/t/innodb_max_recordsize_64k.opt b/mysql-test/suite/innodb/t/innodb_max_recordsize_64k.opt new file mode 100644 index 00000000000..8c9b8ae1e48 --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb_max_recordsize_64k.opt @@ -0,0 +1,3 @@ +--innodb-page-size=64K +--innodb_buffer_pool_size=32M +--innodb-stats-persistent=ON diff --git a/mysql-test/suite/innodb/t/innodb_max_recordsize_64k.test b/mysql-test/suite/innodb/t/innodb_max_recordsize_64k.test new file mode 100644 index 00000000000..0e6bc3bb04c --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb_max_recordsize_64k.test @@ -0,0 +1,607 @@ +--source include/have_innodb.inc +--source include/have_innodb_64k.inc + +call mtr.add_suppression('InnoDB: Cannot add field.*because after adding it, the row size is'); + +# Check page size 64k +SELECT @@innodb_page_size; + +let $innodb_file_per_table = `SELECT @@innodb_file_per_table`; +let $innodb_file_format = `SELECT @@innodb_file_format`; +let $innodb_strict_mode = `SELECT @@innodb_strict_mode`; + +--disable_warnings +SET GLOBAL innodb_file_format='Barracuda'; +SET GLOBAL innodb_file_per_table=ON; +SET @@innodb_strict_mode=ON; +--enable_warnings + +SELECT @@innodb_file_format; +SELECT @@innodb_file_per_table; +SELECT @@innodb_strict_mode; + +# Check the error when the max record length > 32K for innodb_page_size=64k +--error ER_TOO_BIG_ROWSIZE +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255), +ccol1 CHAR(255),ccol2 CHAR(255),ccol3 CHAR(255),ccol4 CHAR(255),ccol5 CHAR(255), +ccol6 CHAR(255),ccol7 CHAR(255),ccol8 CHAR(255),ccol9 CHAR(255),ccol10 CHAR(255), ccol11 CHAR(255), +ccol12 CHAR(255),ccol13 CHAR(255),ccol14 CHAR(255),ccol15 CHAR(255),ccol16 CHAR(255), ccol17 CHAR(255), +ccol18 CHAR(255),ccol19 CHAR(255),ccol20 CHAR(255),ccol21 CHAR(255),ccol22 CHAR(255), ccol23 CHAR(255), +ccol24 CHAR(255),ccol25 CHAR(255),ccol26 CHAR(255),ccol27 CHAR(255),ccol28 CHAR(255), ccol29 CHAR(255), +ccol30 CHAR(255),ccol31 CHAR(255),ccol32 CHAR(255),ccol33 CHAR(255),ccol34 CHAR(255), ccol35 CHAR(255), +ccol36 CHAR(255),ccol37 CHAR(255),ccol38 CHAR(255),ccol39 CHAR(255),ccol40 CHAR(255), ccol41 CHAR(255), +ccol42 CHAR(255),ccol43 CHAR(255),ccol44 CHAR(255),ccol45 CHAR(255),ccol46 CHAR(255), ccol47 CHAR(255), +ccol48 CHAR(255),ccol49 CHAR(255),ccol50 CHAR(255),ccol51 CHAR(255),ccol52 CHAR(255), ccol53 CHAR(255), +ccol54 CHAR(255),ccol55 CHAR(255),ccol56 CHAR(255),ccol57 CHAR(255),ccol58 CHAR(255), ccol59 CHAR(255), +ccol60 CHAR(255),ccol61 CHAR(255),ccol62 CHAR(255),ccol63 CHAR(255),ccol64 CHAR(255), ccol65 CHAR(255) +) +ENGINE = innodb ROW_FORMAT= COMPACT; + +# Check the error when the max record length > 16K for innodb_page_size=64k +--error ER_TOO_BIG_ROWSIZE +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255), +ccol1 CHAR(255),ccol2 CHAR(255),ccol3 CHAR(255),ccol4 CHAR(255),ccol5 CHAR(255), +ccol6 CHAR(255),ccol7 CHAR(255),ccol8 CHAR(255),ccol9 CHAR(255),ccol10 CHAR(255), ccol11 CHAR(255), +ccol12 CHAR(255),ccol13 CHAR(255),ccol14 CHAR(255),ccol15 CHAR(255),ccol16 CHAR(255), ccol17 CHAR(255), +ccol18 CHAR(255),ccol19 CHAR(255),ccol20 CHAR(255),ccol21 CHAR(255),ccol22 CHAR(255), ccol23 CHAR(255), +ccol24 CHAR(255),ccol25 CHAR(255),ccol26 CHAR(255),ccol27 CHAR(255),ccol28 CHAR(255), ccol29 CHAR(255), +ccol30 CHAR(255),ccol31 CHAR(255),ccol32 CHAR(255),ccol33 CHAR(255),ccol34 CHAR(255), ccol35 CHAR(255), +ccol36 CHAR(255),ccol37 CHAR(255),ccol38 CHAR(255),ccol39 CHAR(255),ccol40 CHAR(255), ccol41 CHAR(255), +ccol42 CHAR(255),ccol43 CHAR(255),ccol44 CHAR(255),ccol45 CHAR(255),ccol46 CHAR(255), ccol47 CHAR(255), +ccol48 CHAR(255),ccol49 CHAR(255),ccol50 CHAR(255),ccol51 CHAR(255),ccol52 CHAR(255), ccol53 CHAR(255), +ccol54 CHAR(255),ccol55 CHAR(255),ccol56 CHAR(255),ccol57 CHAR(255),ccol58 CHAR(255), ccol59 CHAR(255), +ccol60 CHAR(255),ccol61 CHAR(255),ccol62 CHAR(255),ccol63 CHAR(255),ccol64 CHAR(255), ccol65 CHAR(255) +) +ENGINE = innodb ROW_FORMAT= DYNAMIC; + +# Check the error when the max record length > 16K for innodb_page_size=64k +--error ER_TOO_BIG_ROWSIZE +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT=REDUNDANT; +show warnings; + +# FIXED not supported +-- error 1005 +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT=FIXED; +show warnings; + +-- error 1005 +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) +ENGINE = innodb ROW_FORMAT=COMPRESSED; +show warnings; + +--disable_warnings +SET @@innodb_strict_mode=OFF; +SELECT @@innodb_strict_mode; +--enable_warnings + +# Check the Warning | 139 | Row size too large +--replace_regex /> [0-9]+/> NNNN/ +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255), +ccol1 CHAR(255),ccol2 CHAR(255),ccol3 CHAR(255),ccol4 CHAR(255),ccol5 CHAR(255), +ccol6 CHAR(255),ccol7 CHAR(255),ccol8 CHAR(255),ccol9 CHAR(255),ccol10 CHAR(255), ccol11 CHAR(255), +ccol12 CHAR(255),ccol13 CHAR(255),ccol14 CHAR(255),ccol15 CHAR(255),ccol16 CHAR(255), ccol17 CHAR(255), +ccol18 CHAR(255),ccol19 CHAR(255),ccol20 CHAR(255),ccol21 CHAR(255),ccol22 CHAR(255), ccol23 CHAR(255), +ccol24 CHAR(255),ccol25 CHAR(255),ccol26 CHAR(255),ccol27 CHAR(255),ccol28 CHAR(255), ccol29 CHAR(255), +ccol30 CHAR(255),ccol31 CHAR(255),ccol32 CHAR(255),ccol33 CHAR(255),ccol34 CHAR(255), ccol35 CHAR(255), +ccol36 CHAR(255),ccol37 CHAR(255),ccol38 CHAR(255),ccol39 CHAR(255),ccol40 CHAR(255), ccol41 CHAR(255), +ccol42 CHAR(255),ccol43 CHAR(255),ccol44 CHAR(255),ccol45 CHAR(255),ccol46 CHAR(255), ccol47 CHAR(255), +ccol48 CHAR(255),ccol49 CHAR(255),ccol50 CHAR(255),ccol51 CHAR(255),ccol52 CHAR(255), ccol53 CHAR(255), +ccol54 CHAR(255),ccol55 CHAR(255),ccol56 CHAR(255),ccol57 CHAR(255),ccol58 CHAR(255), ccol59 CHAR(255), +ccol60 CHAR(255),ccol61 CHAR(255),ccol62 CHAR(255),ccol63 CHAR(255),ccol64 CHAR(255), ccol65 CHAR(255) +) +ENGINE = innodb ROW_FORMAT=COMPACT; + +# row size 32936 : should fail +--error ER_TOO_BIG_ROWSIZE +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),'a',NULL); + +SELECT * FROM tab5; +DROP TABLE tab5; + +CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), +col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), +col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), +col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), +col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), +col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), +col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), +col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), +col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), +col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), +col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255), +ccol1 VARCHAR(255),ccol2 VARCHAR(255),ccol3 VARCHAR(255),ccol4 VARCHAR(255),ccol5 VARCHAR(255), +ccol6 VARCHAR(255),ccol7 VARCHAR(255),ccol8 VARCHAR(255),ccol9 VARCHAR(255),ccol10 VARCHAR(255), ccol11 VARCHAR(255), +ccol12 VARCHAR(255),ccol13 VARCHAR(255),ccol14 VARCHAR(255),ccol15 VARCHAR(255),ccol16 VARCHAR(255), ccol17 VARCHAR(255), +ccol18 VARCHAR(255),ccol19 VARCHAR(255),ccol20 VARCHAR(255),ccol21 VARCHAR(255),ccol22 VARCHAR(255), ccol23 VARCHAR(255), +ccol24 VARCHAR(255),ccol25 VARCHAR(255),ccol26 VARCHAR(255),ccol27 VARCHAR(255),ccol28 VARCHAR(255), ccol29 VARCHAR(255), +ccol30 VARCHAR(255),ccol31 VARCHAR(255),ccol32 VARCHAR(255),ccol33 VARCHAR(255),ccol34 VARCHAR(255), ccol35 VARCHAR(255), +ccol36 VARCHAR(255),ccol37 VARCHAR(255),ccol38 VARCHAR(255),ccol39 VARCHAR(255),ccol40 VARCHAR(255), ccol41 VARCHAR(255), +ccol42 VARCHAR(255),ccol43 VARCHAR(255),ccol44 VARCHAR(255),ccol45 VARCHAR(255),ccol46 VARCHAR(255), ccol47 VARCHAR(255), +ccol48 VARCHAR(255),ccol49 VARCHAR(255),ccol50 VARCHAR(255),ccol51 VARCHAR(255),ccol52 VARCHAR(255), ccol53 VARCHAR(255), +ccol54 VARCHAR(255),ccol55 VARCHAR(255),ccol56 VARCHAR(255),ccol57 VARCHAR(255),ccol58 VARCHAR(255), ccol59 VARCHAR(255), +ccol60 VARCHAR(255),ccol61 VARCHAR(255),ccol62 VARCHAR(255),ccol63 VARCHAR(255),ccol64 VARCHAR(255), ccol65 VARCHAR(255) +) +ENGINE = innodb ROW_FORMAT=COMPACT; + +# row size 16384 >= 16K : expected to fail +--error ER_TOO_BIG_ROWSIZE +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',214),NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL +); + +# row size 16383 < 16K : expected to pass +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',213),NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL +); + +SELECT * FROM tab5; +DROP TABLE tab5; + +# Check the Warning | 139 | Row size too large (> 16318) +--replace_regex /> [0-9]+/> NNNN/ +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255), +ccol1 CHAR(255),ccol2 CHAR(255),ccol3 CHAR(255),ccol4 CHAR(255),ccol5 CHAR(255), +ccol6 CHAR(255),ccol7 CHAR(255),ccol8 CHAR(255),ccol9 CHAR(255),ccol10 CHAR(255), ccol11 CHAR(255), +ccol12 CHAR(255),ccol13 CHAR(255),ccol14 CHAR(255),ccol15 CHAR(255),ccol16 CHAR(255), ccol17 CHAR(255), +ccol18 CHAR(255),ccol19 CHAR(255),ccol20 CHAR(255),ccol21 CHAR(255),ccol22 CHAR(255), ccol23 CHAR(255), +ccol24 CHAR(255),ccol25 CHAR(255),ccol26 CHAR(255),ccol27 CHAR(255),ccol28 CHAR(255), ccol29 CHAR(255), +ccol30 CHAR(255),ccol31 CHAR(255),ccol32 CHAR(255),ccol33 CHAR(255),ccol34 CHAR(255), ccol35 CHAR(255), +ccol36 CHAR(255),ccol37 CHAR(255),ccol38 CHAR(255),ccol39 CHAR(255),ccol40 CHAR(255), ccol41 CHAR(255), +ccol42 CHAR(255),ccol43 CHAR(255),ccol44 CHAR(255),ccol45 CHAR(255),ccol46 CHAR(255), ccol47 CHAR(255), +ccol48 CHAR(255),ccol49 CHAR(255),ccol50 CHAR(255),ccol51 CHAR(255),ccol52 CHAR(255), ccol53 CHAR(255), +ccol54 CHAR(255),ccol55 CHAR(255),ccol56 CHAR(255),ccol57 CHAR(255),ccol58 CHAR(255), ccol59 CHAR(255), +ccol60 CHAR(255),ccol61 CHAR(255),ccol62 CHAR(255),ccol63 CHAR(255),ccol64 CHAR(255), ccol65 CHAR(255) +) +ENGINE = innodb ROW_FORMAT=DYNAMIC; +DROP TABLE tab5; + +# Check the Warning | 139 | Row size too large (> 16318) +--replace_regex /> [0-9]+/> NNNN/ +CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), +col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), +col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), +col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), +col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), +col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), +col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), +col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), +col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), +col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), +col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255), +ccol1 VARCHAR(255),ccol2 VARCHAR(255),ccol3 VARCHAR(255),ccol4 VARCHAR(255),ccol5 VARCHAR(255), +ccol6 VARCHAR(255),ccol7 VARCHAR(255),ccol8 VARCHAR(255),ccol9 VARCHAR(255),ccol10 VARCHAR(255), ccol11 VARCHAR(255), +ccol12 VARCHAR(255),ccol13 VARCHAR(255),ccol14 VARCHAR(255),ccol15 VARCHAR(255),ccol16 VARCHAR(255), ccol17 VARCHAR(255), +ccol18 VARCHAR(255),ccol19 VARCHAR(255),ccol20 VARCHAR(255),ccol21 VARCHAR(255),ccol22 VARCHAR(255), ccol23 VARCHAR(255), +ccol24 VARCHAR(255),ccol25 VARCHAR(255),ccol26 VARCHAR(255),ccol27 VARCHAR(255),ccol28 VARCHAR(255), ccol29 VARCHAR(255), +ccol30 VARCHAR(255),ccol31 VARCHAR(255),ccol32 VARCHAR(255),ccol33 VARCHAR(255),ccol34 VARCHAR(255), ccol35 VARCHAR(255), +ccol36 VARCHAR(255),ccol37 VARCHAR(255),ccol38 VARCHAR(255),ccol39 VARCHAR(255),ccol40 VARCHAR(255), ccol41 VARCHAR(255), +ccol42 VARCHAR(255),ccol43 VARCHAR(255),ccol44 VARCHAR(255),ccol45 VARCHAR(255),ccol46 VARCHAR(255), ccol47 VARCHAR(255), +ccol48 VARCHAR(255),ccol49 VARCHAR(255),ccol50 VARCHAR(255),ccol51 VARCHAR(255),ccol52 VARCHAR(255), ccol53 VARCHAR(255), +ccol54 VARCHAR(255),ccol55 VARCHAR(255),ccol56 VARCHAR(255),ccol57 VARCHAR(255),ccol58 VARCHAR(255), ccol59 VARCHAR(255), +ccol60 VARCHAR(255),ccol61 VARCHAR(255),ccol62 VARCHAR(255),ccol63 VARCHAR(255),ccol64 VARCHAR(255), ccol65 VARCHAR(255) +) +ENGINE = innodb ROW_FORMAT=DYNAMIC; + +# row size 16384 >= 16K : expected to fail +--error ER_TOO_BIG_ROWSIZE +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',214),NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL +); + +# row size 16383 < 16K : expected to pass +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',213),NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL +); + +SELECT * FROM tab5; +DROP TABLE tab5; + +# Check the Warning | 139 | Row size too large +--replace_regex /> [0-9]+/> NNNN/ +CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), +col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), +col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), +col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), +col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), +col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), +col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), +col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), +col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), +col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), +col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255), +ccol1 CHAR(255),ccol2 CHAR(255),ccol3 CHAR(255),ccol4 CHAR(255),ccol5 CHAR(255), +ccol6 CHAR(255),ccol7 CHAR(255),ccol8 CHAR(255),ccol9 CHAR(255),ccol10 CHAR(255), ccol11 CHAR(255), +ccol12 CHAR(255),ccol13 CHAR(255),ccol14 CHAR(255),ccol15 CHAR(255),ccol16 CHAR(255), ccol17 CHAR(255), +ccol18 CHAR(255),ccol19 CHAR(255),ccol20 CHAR(255),ccol21 CHAR(255),ccol22 CHAR(255), ccol23 CHAR(255), +ccol24 CHAR(255),ccol25 CHAR(255),ccol26 CHAR(255),ccol27 CHAR(255),ccol28 CHAR(255), ccol29 CHAR(255), +ccol30 CHAR(255),ccol31 CHAR(255),ccol32 CHAR(255),ccol33 CHAR(255),ccol34 CHAR(255), ccol35 CHAR(255), +ccol36 CHAR(255),ccol37 CHAR(255),ccol38 CHAR(255),ccol39 CHAR(255),ccol40 CHAR(255), ccol41 CHAR(255), +ccol42 CHAR(255),ccol43 CHAR(255),ccol44 CHAR(255),ccol45 CHAR(255),ccol46 CHAR(255), ccol47 CHAR(255), +ccol48 CHAR(255),ccol49 CHAR(255),ccol50 CHAR(255),ccol51 CHAR(255),ccol52 CHAR(255), ccol53 CHAR(255), +ccol54 CHAR(255),ccol55 CHAR(255),ccol56 CHAR(255),ccol57 CHAR(255),ccol58 CHAR(255), ccol59 CHAR(255), +ccol60 CHAR(255),ccol61 CHAR(255),ccol62 CHAR(255),ccol63 CHAR(255),ccol64 CHAR(255), ccol65 CHAR(255) +) +ENGINE = innodb ROW_FORMAT=REDUNDANT; + +# 65 * 255 = 16575 +--error ER_TOO_BIG_ROWSIZE +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL +); + +SELECT * FROM tab5; +DROP TABLE tab5; + +# Check the Warning | 139 | Row size too large +--replace_regex /> [0-9]+/> NNNN/ +CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), +col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), +col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), +col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), +col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), +col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), +col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), +col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), +col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), +col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), +col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255), +ccol1 VARCHAR(255),ccol2 VARCHAR(255),ccol3 VARCHAR(255),ccol4 VARCHAR(255),ccol5 VARCHAR(255), +ccol6 VARCHAR(255),ccol7 VARCHAR(255),ccol8 VARCHAR(255),ccol9 VARCHAR(255),ccol10 VARCHAR(255), ccol11 VARCHAR(255), +ccol12 VARCHAR(255),ccol13 VARCHAR(255),ccol14 VARCHAR(255),ccol15 VARCHAR(255),ccol16 VARCHAR(255), ccol17 VARCHAR(255), +ccol18 VARCHAR(255),ccol19 VARCHAR(255),ccol20 VARCHAR(255),ccol21 VARCHAR(255),ccol22 VARCHAR(255), ccol23 VARCHAR(255), +ccol24 VARCHAR(255),ccol25 VARCHAR(255),ccol26 VARCHAR(255),ccol27 VARCHAR(255),ccol28 VARCHAR(255), ccol29 VARCHAR(255), +ccol30 VARCHAR(255),ccol31 VARCHAR(255),ccol32 VARCHAR(255),ccol33 VARCHAR(255),ccol34 VARCHAR(255), ccol35 VARCHAR(255), +ccol36 VARCHAR(255),ccol37 VARCHAR(255),ccol38 VARCHAR(255),ccol39 VARCHAR(255),ccol40 VARCHAR(255), ccol41 VARCHAR(255), +ccol42 VARCHAR(255),ccol43 VARCHAR(255),ccol44 VARCHAR(255),ccol45 VARCHAR(255),ccol46 VARCHAR(255), ccol47 VARCHAR(255), +ccol48 VARCHAR(255),ccol49 VARCHAR(255),ccol50 VARCHAR(255),ccol51 VARCHAR(255),ccol52 VARCHAR(255), ccol53 VARCHAR(255), +ccol54 VARCHAR(255),ccol55 VARCHAR(255),ccol56 VARCHAR(255),ccol57 VARCHAR(255),ccol58 VARCHAR(255), ccol59 VARCHAR(255), +ccol60 VARCHAR(255),ccol61 VARCHAR(255),ccol62 VARCHAR(255),ccol63 VARCHAR(255),ccol64 VARCHAR(255), ccol65 VARCHAR(255) +) +ENGINE = innodb ROW_FORMAT=REDUNDANT; + +# row size 16383 >= 16K-1 : expected to fail +--error ER_TOO_BIG_ROWSIZE +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',27),NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL +); + +# row size 16382 < 16K-1 : expected to pass +INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), +repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',26),NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL, +NULL,NULL,NULL,NULL,NULL +); + +SELECT * FROM tab5; +DROP TABLE tab5; + +# Check the Warning | 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > NNNNk. Assuming ROW_FORMAT=COMPACT +--replace_regex /> [0-9]+/> NNNN/ +CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), +col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), +col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), +col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), +col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), +col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), +col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), +col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), +col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), +col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), +col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) +ENGINE = innodb ROW_FORMAT=COMPRESSED; + +DROP TABLE tab5; + +CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; +SHOW WARNINGS; +INSERT INTO t VALUES (REPEAT('a',16384)); +INSERT INTO t VALUES (REPEAT('a',32768)); +INSERT INTO t VALUES (REPEAT('a',65535)); +SELECT LENGTH(col) FROM t; +FLUSH TABLE t; +ANALYZE TABLE t; +# retrieve the number of leaf pages +SELECT stat_value FROM mysql.innodb_index_stats where database_name = 'test' and table_name= 't' and stat_name='n_leaf_pages'; +SELECT clustered_index_size from mysql.innodb_table_stats where database_name = 'test' and table_name= 't'; +DROP TABLE t; + +CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; +SHOW WARNINGS; +INSERT INTO t VALUES (REPEAT('a',16384)); +INSERT INTO t VALUES (REPEAT('a',32768)); +INSERT INTO t VALUES (REPEAT('a',65535)); +SELECT LENGTH(col) FROM t; +FLUSH TABLE t; +ANALYZE TABLE t; +# retrieve the number of leaf pages +SELECT stat_value FROM mysql.innodb_index_stats where database_name = 'test' and table_name= 't' and stat_name='n_leaf_pages'; +SELECT clustered_index_size from mysql.innodb_table_stats where database_name = 'test' and table_name= 't'; +DROP TABLE t; + +CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=COMPACT; +SHOW WARNINGS; +INSERT INTO t VALUES (REPEAT('a',16384)); +INSERT INTO t VALUES (REPEAT('a',32768)); +INSERT INTO t VALUES (REPEAT('a',65535)); +SELECT LENGTH(col) FROM t; +FLUSH TABLE t; +ANALYZE TABLE t; +# retrieve the number of leaf pages +SELECT stat_value FROM mysql.innodb_index_stats where database_name = 'test' and table_name= 't' and stat_name='n_leaf_pages'; +SELECT clustered_index_size from mysql.innodb_table_stats where database_name = 'test' and table_name= 't'; +DROP TABLE t; + +# cleanup +--disable_query_log +--disable_warnings +eval SET GLOBAL INNODB_FILE_FORMAT=$innodb_file_format; +eval SET GLOBAL INNODB_FILE_PER_TABLE=$innodb_file_per_table; +eval SET GLOBAL INNODB_STRICT_MODE=$innodb_strict_mode; +--enable_warnings +--enable_query_log + +--echo # Success + diff --git a/mysql-test/suite/innodb/t/innodb_stats_del_mark-master.opt b/mysql-test/suite/innodb/t/innodb_stats_del_mark-master.opt deleted file mode 100644 index 145ee2b4264..00000000000 --- a/mysql-test/suite/innodb/t/innodb_stats_del_mark-master.opt +++ /dev/null @@ -1 +0,0 @@ ---innodb_stats_include_delete_marked=on diff --git a/mysql-test/suite/innodb/t/innodb_stats_del_mark.test b/mysql-test/suite/innodb/t/innodb_stats_del_mark.test deleted file mode 100644 index 36f7a2ea099..00000000000 --- a/mysql-test/suite/innodb/t/innodb_stats_del_mark.test +++ /dev/null @@ -1,113 +0,0 @@ ---source include/have_innodb.inc ---source include/big_test.inc - ---echo # ---echo # Bug 23333990 PERSISTENT INDEX STATISTICS UPDATE BEFORE ---echo # TRANSACTION IS COMMITTED ---echo # - ---echo "Test 1:- Uncommited delete test" -CREATE TABLE t1 (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, - val INT UNSIGNED NOT NULL, - INDEX (val)) ENGINE=INNODB - STATS_PERSISTENT=1,STATS_AUTO_RECALC=1; - - -INSERT INTO t1 (val) VALUES (CEIL(RAND()*20)); -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; -INSERT INTO t1 (val) SELECT CEIL(RAND()*20) FROM t1; - -SELECT COUNT(*) FROM t1; -ANALYZE TABLE t1; - -connect(con1, localhost, root,,); -START TRANSACTION; -DELETE FROM t1; -send SELECT COUNT(*) FROM t1; - -connection default; -let $row_count= query_get_value(EXPLAIN SELECT * FROM t1 WHERE val=4, rows,1); -if ($row_count > 20000) -{ ---echo Test correctly estimates the number of rows as > 20000 ---echo even when in other uncommmited transaction ---echo all rows have been deleted. -} - -connection con1; -reap; -commit; - -connection default; - ---echo Test 2:- Insert and rollback test -CREATE TABLE t2 (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, - val INT UNSIGNED NOT NULL, - INDEX (val)) ENGINE=INNODB - STATS_PERSISTENT=1,STATS_AUTO_RECALC=1; - -connection con1; - -START TRANSACTION; -INSERT INTO t2 (val) VALUES (CEIL(RAND()*20)); -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -INSERT INTO t2 (val) SELECT CEIL(RAND()*20) FROM t2; -send SELECT COUNT(*) FROM t2; - -connection default; -select count(*) from t2; -let $row_count= query_get_value(EXPLAIN SELECT * FROM t2 WHERE val=4, rows,1); -if ($row_count > 20000) -{ ---echo Test correctly estimates the number of rows as > 20000 ---echo even when in other uncommited transaction ---echo many rows are inserted. -} - -connection con1; -reap; ---echo Rollback the insert -rollback; -disconnect con1; - -connection default; -let $row_count= query_get_value(EXPLAIN SELECT * FROM t2 WHERE val=4, rows,1); -if ($row_count <= 1) -{ ---echo Test correctly estimates the number of rows as $row_count ---echo after rollback. -} - -DROP TABLE t1,t2; diff --git a/mysql-test/suite/innodb/t/innodb_stats_persistent.test b/mysql-test/suite/innodb/t/innodb_stats_persistent.test new file mode 100644 index 00000000000..652b201c4b4 --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb_stats_persistent.test @@ -0,0 +1,95 @@ +--source include/have_innodb.inc +--source include/big_test.inc + +SET @saved_include_delete_marked = @@GLOBAL.innodb_stats_include_delete_marked; +SET GLOBAL innodb_stats_include_delete_marked = ON; +SET @saved_traditional = @@GLOBAL.innodb_stats_traditional; +SET GLOBAL innodb_stats_traditional=false; +SET @saved_modified_counter = @@GLOBAL.innodb_stats_modified_counter; +SET GLOBAL innodb_stats_modified_counter=1; + +CREATE TABLE t0 (id SERIAL, val INT UNSIGNED NOT NULL, KEY(val)) +ENGINE=INNODB STATS_PERSISTENT=1,STATS_AUTO_RECALC=1; +CREATE TABLE t1 LIKE t0; +CREATE TABLE t2 LIKE t0; + +INSERT INTO t0 (val) VALUES (4); +INSERT INTO t0 (val) SELECT 4 FROM t0; +INSERT INTO t0 (val) SELECT 4 FROM t0; +INSERT INTO t0 (val) SELECT 4 FROM t0; +INSERT INTO t0 (val) SELECT 4 FROM t0; + +INSERT INTO t1 SELECT * FROM t0; +SELECT COUNT(*) FROM t1; +ANALYZE TABLE t1; + +connect(con1, localhost, root,,); +START TRANSACTION; +DELETE FROM t1; +send SELECT COUNT(*) FROM t1; + +connection default; +--echo # With innodb_stats_include_delete_marked=ON, +--echo # DELETE must not affect statistics before COMMIT. +EXPLAIN SELECT * FROM t1 WHERE val=4; + +connection con1; +reap; +ROLLBACK; +SELECT COUNT(*) FROM t1; +EXPLAIN SELECT * FROM t1 WHERE val=4; + +BEGIN; +DELETE FROM t1; +COMMIT; +SELECT COUNT(*) FROM t1; + +connection default; +BEGIN; +INSERT INTO t2 SELECT * FROM t0; + +--echo # The INSERT will show up before COMMIT. +EXPLAIN SELECT * FROM t2 WHERE val=4; +SELECT COUNT(*) FROM t2; +--echo # The ROLLBACK of the INSERT must affect the statistics. +ROLLBACK; +SELECT COUNT(*) FROM t2; + +connection con1; +EXPLAIN SELECT * FROM t2 WHERE val=4; +SET @saved_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency; +SET GLOBAL innodb_purge_rseg_truncate_frequency = 1; +--source include/wait_all_purged.inc +SET GLOBAL innodb_purge_rseg_truncate_frequency = @saved_frequency; +--echo # After COMMIT and purge, the DELETE must show up. +EXPLAIN SELECT * FROM t1 WHERE val=4; + +SET GLOBAL innodb_stats_include_delete_marked = OFF; +BEGIN; +INSERT INTO t1 SELECT * FROM t0; +EXPLAIN SELECT * FROM t1 WHERE val=4; +ROLLBACK; +EXPLAIN SELECT * FROM t1 WHERE val=4; +BEGIN; +INSERT INTO t1 SELECT * FROM t0; +COMMIT; +EXPLAIN SELECT * FROM t1 WHERE val=4; +BEGIN; +DELETE FROM t1; +SELECT COUNT(*) FROM t1; +--echo # With innodb_stats_include_delete_marked=OFF, +--echo # DELETE must affect statistics even before COMMIT. +--echo # However, if there was a WHERE condition, +--echo # ha_innobase::records_in_range() would count the delete-marked records. +EXPLAIN SELECT * FROM t1; +ROLLBACK; +EXPLAIN SELECT * FROM t1; +SELECT COUNT(*) FROM t1; +disconnect con1; + +connection default; + +DROP TABLE t0,t1,t2; +SET GLOBAL innodb_stats_include_delete_marked = @saved_include_delete_marked; +SET GLOBAL innodb_stats_traditional = @saved_traditional; +SET GLOBAL innodb_stats_modified_counter = @saved_modified_counter; diff --git a/mysql-test/suite/innodb/t/innodb_stats_persistent_debug.test b/mysql-test/suite/innodb/t/innodb_stats_persistent_debug.test new file mode 100644 index 00000000000..7b16fa15f73 --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb_stats_persistent_debug.test @@ -0,0 +1,32 @@ +--source include/have_innodb.inc +--source include/have_debug.inc + +--echo # +--echo # MDEV-13534 InnoDB STATS_PERSISTENT fails to ignore +--echo # garbage delete-mark flag on node pointer pages +--echo # + +CREATE TABLE t(a INT UNSIGNED PRIMARY KEY) +ENGINE=InnoDB STATS_PERSISTENT=1 STATS_SAMPLE_PAGES=1; + +BEGIN; +# Create an index tree of height 3. +# This is adapted from innodb.innodb_bug14676111. + +SET @save_debug = @@GLOBAL.innodb_limit_optimistic_insert_debug; +SET GLOBAL innodb_limit_optimistic_insert_debug=2; + +INSERT t VALUES(1),(5); +DELETE FROM t; +INSERT t VALUES(4); +DELETE FROM t; +INSERT t VALUES(3); +DELETE FROM t; +SET GLOBAL innodb_limit_optimistic_insert_debug = @save_debug; + +connect(con1, localhost, root,,); +ANALYZE TABLE t; +disconnect con1; + +connection default; +DROP TABLE t; diff --git a/mysql-test/suite/innodb/t/innodb_xtradb_compat-master.opt b/mysql-test/suite/innodb/t/innodb_xtradb_compat-master.opt new file mode 100644 index 00000000000..1ee264ee868 --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb_xtradb_compat-master.opt @@ -0,0 +1,38 @@ +--innodb-adaptive-hash-index-partitions=16 +--innodb-buffer-pool-populate=1 +--innodb-cleaner-eviction-factor +--innodb-cleaner-flush-chunk-size=16 +--innodb-cleaner_free_list_lwm=1 +--innodb-cleaner-lru-chunk-size=1 +--innodb-cleaner-lsn-age-factor=HIGH_CHECKPOINT +--innodb-cleaner-max-flush-time=1 +--innodb-cleaner-max-lru-time=1 +--innodb-corrupt-table-action=salvage +--innodb-empty-free-list-algorithm=BACKOFF +--innodb-fake-changes +--innodb-file-io-threads=16 +--innodb-foreground-preflush=EXPONENTIAL_BACKOFF +--innodb-kill-idle-transaction=1 +--innodb-locking-fake-changes +--innodb-log-arch-expire-sec=1 +--innodb-log-arch-dir='ttt' +--innodb-log-archive +--innodb-log-block-size=16 +--innodb-log_checksum_algorithm=STRICT_INNODB +--innodb-max-bitmap-file-size=1 +--innodb-max-changed-pages=1 +--innodb-mirrored-log-groups=8 +--innodb-priority-cleaner +--innodb-priority-io +--innodb-priority-master +--innodb-priority-purge +--innodb-sched-priority-cleaner=16 +--innodb-sched-priority-io=16 +--innodb-sched-priority-master=16 +--innodb-sched-priority-purge=16 +--innodb-show-locks-held=16 +--innodb-show-verbose-locks=1 +--innodb-track-changed-pages +--innodb-track-redo-log-now +--innodb-use-global-flush-log-at-trx-commit +--innodb-use-stacktrace diff --git a/mysql-test/suite/innodb/t/innodb_xtradb_compat.test b/mysql-test/suite/innodb/t/innodb_xtradb_compat.test new file mode 100644 index 00000000000..359d93717d5 --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb_xtradb_compat.test @@ -0,0 +1,160 @@ +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/not_embedded.inc +--source include/not_windows.inc + +select @@innodb_adaptive_hash_index_partitions, @@innodb_adaptive_hash_index_parts; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +set global innodb_adaptive_hash_index_partitions=1; + +select @@innodb_buffer_pool_populate; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +set global innodb_buffer_pool_populate=1; + +select @@innodb_cleaner_eviction_factor; +set global innodb_cleaner_eviction_factor=1; +select @@innodb_cleaner_eviction_factor; + +select @@innodb_cleaner_flush_chunk_size; +set global innodb_cleaner_flush_chunk_size=8; +select @@innodb_cleaner_flush_chunk_size; + +select @@innodb_cleaner_free_list_lwm; +set global innodb_cleaner_free_list_lwm=1; +select @@innodb_cleaner_free_list_lwm; + +select @@innodb_cleaner_lru_chunk_size; +set global innodb_cleaner_lru_chunk_size=8; +select @@innodb_cleaner_lru_chunk_size; + +select @@innodb_cleaner_lsn_age_factor; +set global innodb_cleaner_lsn_age_factor=HIGH_CHECKPOINT; +select @@innodb_cleaner_lsn_age_factor; + +select @@innodb_cleaner_max_flush_time; +set global innodb_cleaner_max_flush_time=1; +select @@innodb_cleaner_max_flush_time; + +select @@innodb_cleaner_max_lru_time; +set global innodb_cleaner_max_lru_time=1; +select @@innodb_cleaner_max_lru_time; + +select @@innodb_corrupt_table_action; +set global innodb_corrupt_table_action=salvage; +select @@innodb_corrupt_table_action; + +select @@innodb_empty_free_list_algorithm; +set global innodb_empty_free_list_algorithm=BACKOFF; +select @@innodb_empty_free_list_algorithm; + +select @@innodb_fake_changes; +set global innodb_fake_changes=1; +select @@innodb_fake_changes; + +--echo # @@innodb_file_io_threads is absent + +select @@innodb_foreground_preflush; +set global innodb_foreground_preflush=EXPONENTIAL_BACKOFF; +select @@innodb_foreground_preflush; + +select @@innodb_kill_idle_transaction; +set global innodb_kill_idle_transaction=1; +select @@innodb_kill_idle_transaction; + +select @@innodb_locking_fake_changes; +set global innodb_locking_fake_changes=1; +select @@innodb_locking_fake_changes; + +select @@innodb_log_arch_expire_sec; +set global innodb_log_arch_expire_sec=1; +select @@innodb_log_arch_expire_sec; + +select @@innodb_log_block_size; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +set global innodb_log_block_size= 8; + +select @@innodb_log_checksum_algorithm, @@innodb_log_checksums; +set global innodb_log_checksum_algorithm=NONE; +select @@innodb_log_checksum_algorithm, @@innodb_log_checksums; +set global innodb_log_checksum_algorithm=STRICT_INNODB; +select @@innodb_log_checksum_algorithm, @@innodb_log_checksums; + +select @@innodb_max_bitmap_file_size; +set global innodb_max_bitmap_file_size=1; +select @@innodb_max_bitmap_file_size; + +select @@innodb_max_changed_pages; +set global innodb_max_changed_pages=1; +select @@innodb_max_changed_pages; + +select @@innodb_mirrored_log_groups; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +set global innodb_mirrored_log_groups= 4; + +select @@innodb_priority_cleaner; +set global innodb_priority_cleaner=1; +select @@innodb_priority_cleaner; + +select @@innodb_priority_io; +set global innodb_priority_io=1; +select @@innodb_priority_io; + +select @@innodb_priority_master; +set global innodb_priority_master=1; +select @@innodb_priority_master; + +select @@innodb_priority_purge; +set global innodb_priority_purge=1; +select @@innodb_priority_purge; + +select @@innodb_sched_priority_cleaner; +set global innodb_sched_priority_cleaner=8; +select @@innodb_sched_priority_cleaner; + +select @@innodb_sched_priority_io; +set global innodb_sched_priority_io=8; +select @@innodb_sched_priority_io; + +select @@innodb_sched_priority_master; +set global innodb_sched_priority_master=8; +select @@innodb_sched_priority_master; + +select @@innodb_sched_priority_purge; +set global innodb_sched_priority_purge=8; +select @@innodb_sched_priority_purge; + +select @@innodb_show_locks_held; +set global innodb_show_locks_held=8; +select @@innodb_show_locks_held; + +select @@innodb_show_verbose_locks; +set global innodb_show_verbose_locks=1; +select @@innodb_show_verbose_locks; + +select @@innodb_track_changed_pages; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +set global innodb_track_changed_pages=1; + +select @@innodb_track_redo_log_now; +set global innodb_track_redo_log_now=1; +select @@innodb_track_redo_log_now; + +select @@innodb_use_global_flush_log_at_trx_commit; +set global innodb_use_global_flush_log_at_trx_commit=1; +select @@innodb_use_global_flush_log_at_trx_commit; + +select @@innodb_use_stacktrace; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +set global innodb_use_stacktrace=1; + +select @@innodb_log_archive; +set global innodb_log_archive=1; +select @@innodb_log_archive; + +select @@innodb_log_arch_dir; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +set global innodb_log_arch_dir="ttt"; + +--let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let SEARCH_PATTERN=Using [A-Za-z\\-]* is deprecated and the parameter may be removed in future releases. Ignoning the parameter. +--source include/search_pattern_in_file.inc diff --git a/mysql-test/suite/innodb/t/innodb_zip_innochecksum.opt b/mysql-test/suite/innodb/t/innodb_zip_innochecksum.opt new file mode 100644 index 00000000000..f8c8c9d247d --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb_zip_innochecksum.opt @@ -0,0 +1,4 @@ +--skip-innodb-doublewrite +--innodb-file-per-table +--innodb-file-format=Barracuda + diff --git a/mysql-test/suite/innodb/t/innodb_zip_innochecksum.test b/mysql-test/suite/innodb/t/innodb_zip_innochecksum.test new file mode 100644 index 00000000000..63a4b418677 --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb_zip_innochecksum.test @@ -0,0 +1,239 @@ +#************************************************************ +# WL6045:Improve Innochecksum +#************************************************************ +--source include/innodb_page_size_small.inc +--source include/no_valgrind_without_big.inc +# Embedded server does not support crashing. +--source include/not_embedded.inc + +# Avoid CrashReporter popup on Mac. +--source include/not_crashrep.inc + +--echo # Set the environmental variables +let MYSQLD_BASEDIR= `SELECT @@basedir`; +let MYSQLD_DATADIR= `SELECT @@datadir`; +let SEARCH_FILE= $MYSQLTEST_VARDIR/log/my_restart.err; +call mtr.add_suppression("InnoDB: Unable to read tablespace .* page no .* into the buffer pool after 100 attempts"); +call mtr.add_suppression("InnoDB: Warning: database page corruption or a failed"); + +CREATE TABLE tab1(c1 INT PRIMARY KEY,c2 VARCHAR(20)) ENGINE=InnoDB; +CREATE INDEX idx1 ON tab1(c2(10)); +INSERT INTO tab1 VALUES(1, 'Innochecksum InnoDB1'); +CREATE TABLE t1(id INT AUTO_INCREMENT PRIMARY KEY, msg VARCHAR(255)) ENGINE=INNODB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4; +insert into t1 values(1,"i"); +insert into t1 values(2,"am"); +insert into t1 values(3,"compressed table"); + +--echo # Shutdown the Server +--source include/shutdown_mysqld.inc +--echo # Server Default checksum = innodb + +# +# Not repeatable with --parallel= >1 +# +#--echo [1a]: check the innochecksum when file doesn't exists +#--error 1 +#--exec $INNOCHECKSUM $MYSQLD_DATADIR/test/aa.ibd 2> $SEARCH_FILE +#let SEARCH_PATTERN= Error: $MYSQLD_DATADIR/test/aa.ibd cannot be found; +#--source include/search_pattern_in_file.inc + +--echo [1b]: check the innochecksum without --strict-check +--exec $INNOCHECKSUM $MYSQLD_DATADIR/test/tab1.ibd + +--echo [2]: check the innochecksum with full form --strict-check=crc32 +--exec $INNOCHECKSUM --strict-check=crc32 $MYSQLD_DATADIR/test/tab1.ibd + +--echo [3]: check the innochecksum with short form -C crc32 +--exec $INNOCHECKSUM -C crc32 $MYSQLD_DATADIR/test/tab1.ibd + +--echo [4]: check the innochecksum with --no-check ignores algorithm check, warning is expected +--error 1 +--exec $INNOCHECKSUM --no-check $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Error: --no-check must be associated with --write option.; +--source include/search_pattern_in_file.inc + +--echo [5]: check the innochecksum with short form --no-check ignores algorithm check, warning is expected +--error 1 +--exec $INNOCHECKSUM -n $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Error: --no-check must be associated with --write option.; +--source include/search_pattern_in_file.inc + +--echo [6]: check the innochecksum with full form strict-check & no-check , an error is expected +--error 1 +--exec $INNOCHECKSUM --strict-check=innodb --no-check $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Error: --strict-check option cannot be used together with --no-check option.; +--source include/search_pattern_in_file.inc + +--echo [7]: check the innochecksum with short form strict-check & no-check , an error is expected +--error 1 +--exec $INNOCHECKSUM -C innodb -n $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Error: --strict-check option cannot be used together with --no-check option.; +--source include/search_pattern_in_file.inc + +--echo [8]: check the innochecksum with short & full form combination +--echo # strict-check & no-check, an error is expected +--error 1 +--exec $INNOCHECKSUM --strict-check=innodb -n $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Error: --strict-check option cannot be used together with --no-check option.; +--source include/search_pattern_in_file.inc + +--echo [9]: check the innochecksum with full form --strict-check=innodb +# Server Default checksum = crc32 +--exec $INNOCHECKSUM --strict-check=innodb $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE + +--echo [10]: check the innochecksum with full form --strict-check=none +--echo # when server Default checksum=crc32 +--exec $INNOCHECKSUM --strict-check=none $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE + +--echo [11]: check the innochecksum with short form -C innodb +--echo # when server Default checksum=crc32 +--exec $INNOCHECKSUM -C innodb $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE + +--echo [12]: check the innochecksum with short form -C none +--echo # when server Default checksum=crc32 +--exec $INNOCHECKSUM -C none $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE + +--echo [13]: check strict-check with invalid values +--error 1 +--exec $INNOCHECKSUM --strict-check=strict_innodb $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Error while setting value \'strict_innodb\' to \'strict-check\'; +--source include/search_pattern_in_file.inc + +--error 1 +--exec $INNOCHECKSUM -C strict_innodb $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Error while setting value \'strict_innodb\' to \'strict-check\'; +--source include/search_pattern_in_file.inc + +--error 1 +--exec $INNOCHECKSUM --strict-check=strict_crc32 $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Error while setting value \'strict_crc32\' to \'strict-check\'; +--source include/search_pattern_in_file.inc + +--error 1 +--exec $INNOCHECKSUM -C strict_crc32 $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Error while setting value \'strict_crc32\' to \'strict-check\'; +--source include/search_pattern_in_file.inc + +--error 1 +--exec $INNOCHECKSUM --strict-check=strict_none $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Error while setting value \'strict_none\' to \'strict-check\'; +--source include/search_pattern_in_file.inc + +--error 1 +--exec $INNOCHECKSUM -C strict_none $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Error while setting value \'strict_none\' to \'strict-check\'; +--source include/search_pattern_in_file.inc + +--error 1 +--exec $INNOCHECKSUM --strict-check=InnoBD $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Error while setting value \'InnoBD\' to \'strict-check\'; +--source include/search_pattern_in_file.inc + +--error 1 +--exec $INNOCHECKSUM -C InnoBD $MYSQLD_DATADIR/test/tab1.ibd 2>$SEARCH_FILE +let SEARCH_PATTERN= Error while setting value \'InnoBD\' to \'strict-check\'; +--source include/search_pattern_in_file.inc + +--error 1 +--exec $INNOCHECKSUM --strict-check=crc $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Error while setting value \'crc\' to \'strict-check\'; +--source include/search_pattern_in_file.inc + +--error 1 +--exec $INNOCHECKSUM --strict-check=no $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Error while setting value \'no\' to \'strict-check\'; +--source include/search_pattern_in_file.inc + +--echo [14a]: when server default checksum=crc32 rewrite new checksum=crc32 with innochecksum +--echo # Also check the long form of write option. +--exec $INNOCHECKSUM --strict-check=crc32 --write=crc32 $MYSQLD_DATADIR/test/tab1.ibd +--exec $INNOCHECKSUM --strict-check=crc32 --write=crc32 $MYSQLD_DATADIR/test/t1.ibd +# Rewrite done, verify with --strict-check=crc32 +--exec $INNOCHECKSUM --strict-check=crc32 $MYSQLD_DATADIR/test/tab1.ibd +--exec $INNOCHECKSUM --strict-check=crc32 $MYSQLD_DATADIR/test/t1.ibd + +--echo [14b]: when server default checksum=crc32 rewrite new checksum=innodb with innochecksum +--echo # Also check the long form of write option. +--exec $INNOCHECKSUM --no-check --write=innodb $MYSQLD_DATADIR/test/tab1.ibd +--exec $INNOCHECKSUM --strict-check=crc32 --write=innodb $MYSQLD_DATADIR/test/t1.ibd +# Rewrite done, verify with --strict-check=innodb +--exec $INNOCHECKSUM --strict-check=innodb $MYSQLD_DATADIR/test/tab1.ibd + +--echo # start the server with innodb_checksum_algorithm=InnoDB +--let $restart_parameters= --innodb_checksum_algorithm=innodb +--source include/start_mysqld.inc + +INSERT INTO tab1 VALUES(2, 'Innochecksum CRC32'); +SELECT c1,c2 FROM tab1 order by c1,c2; + +--echo # Stop the server +--source include/shutdown_mysqld.inc + +--echo [15]: when server default checksum=crc32 rewrite new checksum=none with innochecksum +--echo # Also check the short form of write option. +--exec $INNOCHECKSUM --no-check -w none $MYSQLD_DATADIR/test/tab1.ibd +--exec $INNOCHECKSUM --no-check -w none $MYSQLD_DATADIR/test/t1.ibd +# Rewrite done, verify with --strict-check=none +--exec $INNOCHECKSUM --strict-check=none $MYSQLD_DATADIR/test/tab1.ibd +--exec $INNOCHECKSUM --strict-check=none $MYSQLD_DATADIR/test/t1.ibd + +--echo # Start the server with checksum algorithm=none +--let $restart_parameters= --innodb_checksum_algorithm=none +--source include/start_mysqld.inc + +INSERT INTO tab1 VALUES(3, 'Innochecksum None'); +SELECT c1,c2 FROM tab1 order by c1,c2; +DROP TABLE t1; + +--echo # Stop the server +--source include/shutdown_mysqld.inc + +--echo [16]: rewrite into new checksum=crc32 with innochecksum +--exec $INNOCHECKSUM --no-check --write=crc32 $MYSQLD_DATADIR/test/tab1.ibd + +--echo # Restart the DB server with innodb_checksum_algorithm=crc32 +--let $restart_parameters= --innodb_checksum_algorithm=crc32 +--source include/start_mysqld.inc + +SELECT * FROM tab1; +DELETE FROM tab1 where c1=3; +SELECT c1,c2 FROM tab1 order by c1,c2; + +--echo # Stop server +--source include/shutdown_mysqld.inc + +--echo [17]: rewrite into new checksum=InnoDB +--exec $INNOCHECKSUM --no-check --write=InnoDB $MYSQLD_DATADIR/test/tab1.ibd + +--echo # Restart the DB server with innodb_checksum_algorithm=InnoDB +--let $restart_parameters= --innodb_checksum_algorithm=innodb +--source include/start_mysqld.inc + +DELETE FROM tab1 where c1=2; +SELECT * FROM tab1; + +--echo # Stop server +--source include/shutdown_mysqld.inc + +--echo [18]:check Innochecksum with invalid write options +--error 1 +--exec $INNOCHECKSUM --no-check --write=strict_crc32 $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN=Error while setting value \'strict_crc32\' to \'write\'; +--source include/search_pattern_in_file.inc + +--error 1 +--exec $INNOCHECKSUM --no-check --write=strict_innodb $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN=Error while setting value \'strict_innodb\' to \'write\'; +--source include/search_pattern_in_file.inc + +--error 1 +--exec $INNOCHECKSUM --no-check --write=crc23 $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN=Error while setting value \'crc23\' to \'write\'; +--source include/search_pattern_in_file.inc +--remove_file $SEARCH_FILE + +# Cleanup +--let $restart_parameters= +--source include/start_mysqld.inc + +DROP TABLE tab1; diff --git a/mysql-test/suite/innodb/t/innodb_zip_innochecksum2.opt b/mysql-test/suite/innodb/t/innodb_zip_innochecksum2.opt new file mode 100644 index 00000000000..39d5c6d577c --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb_zip_innochecksum2.opt @@ -0,0 +1,4 @@ +--skip-innodb-doublewrite +--innodb-file-per-table +--innodb-file-format=Barracuda +--innodb-change-buffering=none diff --git a/mysql-test/suite/innodb/t/innodb_zip_innochecksum2.test b/mysql-test/suite/innodb/t/innodb_zip_innochecksum2.test new file mode 100644 index 00000000000..330bb81ba75 --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb_zip_innochecksum2.test @@ -0,0 +1,118 @@ +#************************************************************ +# WL6045:Improve Innochecksum +#************************************************************ +--source include/innodb_page_size_small.inc +--source include/have_debug.inc +--source include/no_valgrind_without_big.inc +# Avoid CrashReporter popup on Mac. +--source include/not_crashrep.inc + +--source include/not_embedded.inc +-- source include/big_test.inc + +--disable_query_log +# This warning occurs due to small buffer pool size(i.e. 8MB). It doesn't occur +# with --mysqld=--innodb_buffer_pool_size=10MB +call mtr.add_suppression("\\[Warning\\] InnoDB: Difficult to find free blocks in the buffer pool.*"); +--enable_query_log +let MYSQLD_BASEDIR= `SELECT @@basedir`; +let MYSQLD_DATADIR= `SELECT @@datadir`; +let SEARCH_FILE= $MYSQLTEST_VARDIR/log/my_restart.err; + +SET GLOBAL innodb_compression_level=0; +SELECT @@innodb_compression_level; + +CREATE TABLE t1 (j LONGBLOB) ENGINE = InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; +INSERT INTO t1 VALUES (repeat('abcdefghijklmnopqrstuvwxyz',200)); +let $i=10; +while ($i > 0) { + INSERT INTO t1 SELECT * from t1; + dec $i; +} + +--echo # stop the server +--source include/shutdown_mysqld.inc + +# Page_type_dump for t1 +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--exec $INNOCHECKSUM -v --page-type-dump $MYSQLTEST_VARDIR/tmp/dump.txt $MYSQLD_DATADIR/test/t1.ibd +--file_exists $MYSQLTEST_VARDIR/tmp/dump.txt +--remove_file $MYSQLTEST_VARDIR/tmp/dump.txt + +--echo [1]:# check the both short and long options for "help" +--exec $INNOCHECKSUM --help $MYSQLD_DATADIR/test/t1.ibd > $MYSQLTEST_VARDIR/tmp/help_output_long.txt +--exec $INNOCHECKSUM -I $MYSQLD_DATADIR/test/t1.ibd > $MYSQLTEST_VARDIR/tmp/help_output_short.txt +--diff_files $MYSQLTEST_VARDIR/tmp/help_output_long.txt $MYSQLTEST_VARDIR/tmp/help_output_short.txt + +--echo [2]:# Run the innochecksum when file isn't provided. +--echo # It will print the innochecksum usage similar to --help option. +--error 1 +--exec $INNOCHECKSUM > $MYSQLTEST_VARDIR/tmp/usage.txt +--diff_files $MYSQLTEST_VARDIR/tmp/help_output_long.txt $MYSQLTEST_VARDIR/tmp/usage.txt +--remove_file $MYSQLTEST_VARDIR/tmp/usage.txt + +perl; +use strict; +use warnings; +use File::Copy; +my $dir = $ENV{'MYSQLTEST_VARDIR'}; +my $file= 'help_output_long.txt'; +# open file in write mode +open IN_FILE,"<", "$dir/tmp/$file" or die $!; +open OUT_FILE, ">", "$dir/tmp/tmpfile" or die $!; +while() { + unless ($_=~ /^debug.*$/ || $_=~ /\-#, \-\-debug.*$/ || $_=~ /http:.*html/) { + $_=~ s/^\S*innochecksum.+Ver.+[0-9]*\.[0-9]*\.[0-9]*.+$/innochecksum Ver #.#.#/g; + $_=~ s/(Copyright\s\(c\))\s([0-9]*),\s([0-9]*)(.*)/$1 YEAR, YEAR $4/g; + $_=~ s/Usage:.*\[-c/Usage: innochecksum [-c/g; + print OUT_FILE $_; + } +} +close(IN_FILE); +close(OUT_FILE); +# move the new content from tmp file to the orginal file. +move ("$dir/tmp/tmpfile", "$dir/tmp/$file"); +EOF + +--cat_file $MYSQLTEST_VARDIR/tmp/help_output_long.txt +--remove_file $MYSQLTEST_VARDIR/tmp/help_output_long.txt +--remove_file $MYSQLTEST_VARDIR/tmp/help_output_short.txt + +--echo [3]:# check the both short and long options for "count" and exit +--replace_regex /[0-9]+/#/ +--exec $INNOCHECKSUM --count $MYSQLD_DATADIR/test/t1.ibd +--replace_regex /[0-9]+/#/ +--exec $INNOCHECKSUM -c $MYSQLD_DATADIR/test/t1.ibd + +--echo [4]:# Print the version of innochecksum and exit +--replace_regex /.*innochecksum.*Ver.*[0-9]*.[0-9]*.[0-9]*.*/innochecksum Ver #.#.#/ +--exec $INNOCHECKSUM -V $MYSQLD_DATADIR/test/t1.ibd + +--echo # Restart the DB server +--source include/start_mysqld.inc + +DROP TABLE t1; + +--echo [5]:# Check the innochecksum for compressed table t1 with different key_block_size +--echo # Test for KEY_BLOCK_SIZE=1 +--let $size=1 +--source ../include/innodb-wl6045.inc + +--echo # Test for KEY_BLOCK_SIZE=2 +--let $size=2 +--source ../include/innodb-wl6045.inc + +--echo # Test for for KEY_BLOCK_SIZE=4 +--let $size=4 +--source ../include/innodb-wl6045.inc + +set innodb_strict_mode=off; +--echo # Test for for KEY_BLOCK_SIZE=8 +--let $size=8 +--source ../include/innodb-wl6045.inc + +set innodb_strict_mode=off; +--echo # Test for KEY_BLOCK_SIZE=16 +--let $size=16 +--source ../include/innodb-wl6045.inc +--echo # Test[5] completed diff --git a/mysql-test/suite/innodb/t/innodb_zip_innochecksum3.opt b/mysql-test/suite/innodb/t/innodb_zip_innochecksum3.opt new file mode 100644 index 00000000000..828a7cd67c8 --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb_zip_innochecksum3.opt @@ -0,0 +1,2 @@ +--innodb-file-per-table +--innodb-file-format=Barracuda diff --git a/mysql-test/suite/innodb/t/innodb_zip_innochecksum3.test b/mysql-test/suite/innodb/t/innodb_zip_innochecksum3.test new file mode 100644 index 00000000000..dab10dcc997 --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb_zip_innochecksum3.test @@ -0,0 +1,406 @@ +#************************************************************ +# WL6045:Improve Innochecksum +#************************************************************ +--source include/innodb_page_size_small.inc + +--source include/no_valgrind_without_big.inc + +# Embedded server does not support crashing. +--source include/not_embedded.inc + +# Avoid CrashReporter popup on Mac. +--source include/not_crashrep.inc + +--echo # Set the environmental variables +let MYSQLD_BASEDIR= `SELECT @@basedir`; +let MYSQLD_DATADIR= `SELECT @@datadir`; +let SEARCH_FILE= $MYSQLTEST_VARDIR/log/my_restart.err; + +call mtr.add_suppression("InnoDB: Unable to read tablespace .* page no .* into the buffer pool after 100 attempts"); +call mtr.add_suppression("InnoDB: innodb_checksum_algorithm is set to.*"); + +--echo [1]: Further Test are for rewrite checksum (innodb|crc32|none) for all ibd file & start the server. + +CREATE TABLE tab1 (pk INTEGER NOT NULL PRIMARY KEY, +linestring_key GEOMETRY NOT NULL, +linestring_nokey GEOMETRY NOT NULL) +ENGINE=InnoDB ; + +INSERT INTO tab1 (pk, linestring_key, linestring_nokey) +VALUES (1, ST_GeomFromText('POINT(10 10) '), ST_GeomFromText('POINT(10 10) ')); + +CREATE INDEX linestring_index ON tab1(linestring_nokey(5)); +ALTER TABLE tab1 ADD KEY (linestring_key(5)); + +--echo # create a compressed table +CREATE TABLE tab2(col_1 CHAR (255) , +col_2 VARCHAR (255), col_3 longtext, +col_4 longtext,col_5 longtext, +col_6 longtext , col_7 int ) +engine = innodb row_format=compressed key_block_size=4; + +CREATE INDEX idx1 ON tab2(col_3(10)); +CREATE INDEX idx2 ON tab2(col_4(10)); +CREATE INDEX idx3 ON tab2(col_5(10)); + +# load the with repeat function +SET @col_1 = repeat('a', 5); +SET @col_2 = repeat('b', 20); +SET @col_3 = repeat('c', 100); +SET @col_4 = repeat('d', 100); +SET @col_5 = repeat('e', 100); +SET @col_6 = repeat('f', 100); + +# insert 5 records +let $i = 5; +while ($i) { + eval INSERT INTO tab2(col_1,col_2,col_3,col_4,col_5,col_6,col_7) + VALUES (@col_1,@col_2,@col_3,@col_4,@cl_5,@col_6,$i); + dec $i; +} + +--disable_result_log +SELECT * FROM tab2 ORDER BY col_7; + +--echo # stop the server +--source include/shutdown_mysqld.inc + +--echo [1(a)]: Rewrite into new checksum=InnoDB for all *.ibd file and ibdata1 +--exec $INNOCHECKSUM --write=InnoDB $MYSQLD_DATADIR/test/tab1.ibd +--exec $INNOCHECKSUM --write=InnoDB $MYSQLD_DATADIR/test/tab2.ibd +--exec $INNOCHECKSUM --write=InnoDB $MYSQLD_DATADIR/ibdata1 +perl; +foreach (glob("$ENV{MYSQLD_DATADIR}/*/*.ibd")) { + system("$ENV{INNOCHECKSUM} --no-check --write=InnoDB $_") +} +EOF + +--echo : start the server with innodb_checksum_algorithm=strict_innodb +--let $restart_parameters= --innodb_checksum_algorithm=strict_innodb +--source include/start_mysqld.inc + +INSERT INTO tab1 (pk, linestring_key, linestring_nokey) +VALUES (2, ST_GeomFromText('LINESTRING(10 10,20 20,30 30)'), ST_GeomFromText('LINESTRING(10 10,20 20,30 30)')); + +# load the with repeat function +SET @col_1 = repeat('a', 5); +SET @col_2 = repeat('b', 20); +SET @col_3 = repeat('c', 100); +SET @col_4 = repeat('d', 100); +SET @col_5 = repeat('e', 100); +SET @col_6 = repeat('f', 100); + +# check the table status is GOOD with DML +let $i = 6; +eval INSERT INTO tab2(col_1,col_2,col_3,col_4,col_5,col_6,col_7) +VALUES (@col_1,@col_2,@col_3,@col_4,@cl_5,@col_6,$i); + +-- disable_result_log +SELECT pk,ST_AsText(linestring_key),ST_AsText(linestring_nokey) +FROM tab1 ORDER BY pk; + +-- disable_result_log +SELECT * FROM tab2 ORDER BY col_7; + +--echo # stop the server +--source include/shutdown_mysqld.inc + +--echo [1(b)]: Rewrite into new checksum=crc32 for all *.ibd file and ibdata1 +--exec $INNOCHECKSUM --write=CRC32 $MYSQLD_DATADIR/test/tab1.ibd +--exec $INNOCHECKSUM --write=CRC32 $MYSQLD_DATADIR/test/tab2.ibd +--exec $INNOCHECKSUM --write=CRC32 $MYSQLD_DATADIR/ibdata1 +perl; +foreach (glob("$ENV{MYSQLD_DATADIR}/*/*.ibd")) { + system("$ENV{INNOCHECKSUM} --no-check --write=crc32 $_") +} +EOF + +--echo # start the server with innodb_checksum_algorithm=strict_crc32 +--let $restart_parameters= --innodb_checksum_algorithm=strict_crc32 +--source include/start_mysqld.inc + +# check the table status is GOOD with DML +INSERT INTO tab1 (pk, linestring_key, linestring_nokey) +VALUES (3, ST_GeomFromText('POLYGON((0 0,5 5,10 10,15 15,0 0),(10 10,20 20,30 30,40 40,10 10))'), +ST_GeomFromText('POLYGON((0 0,5 5,10 10,15 15,0 0),(10 10,20 20,30 30,40 40,10 10))')); + +# load the with repeat function +SET @col_1 = repeat('g', 5); +SET @col_2 = repeat('h', 20); +SET @col_3 = repeat('i', 100); +SET @col_4 = repeat('j', 100); +SET @col_5 = repeat('k', 100); +SET @col_6 = repeat('l', 100); + +# check the table status is GOOD with DML +let $i = 7; +eval INSERT INTO tab2(col_1,col_2,col_3,col_4,col_5,col_6,col_7) +VALUES (@col_1,@col_2,@col_3,@col_4,@cl_5,@col_6,$i); + +# check the records from table +-- disable_result_log +SELECT pk,ST_AsText(linestring_key),ST_AsText(linestring_nokey) +FROM tab1 ORDER BY pk; + +-- disable_result_log +SELECT * FROM tab2 ORDER BY col_7; + +--echo # stop the server +--source include/shutdown_mysqld.inc + +--echo [1(c)]: Rewrite into new checksum=none for all *.ibd file and ibdata1 +--exec $INNOCHECKSUM --write=none $MYSQLD_DATADIR/test/tab1.ibd +--exec $INNOCHECKSUM --write=none $MYSQLD_DATADIR/test/tab2.ibd +--exec $INNOCHECKSUM --write=none $MYSQLD_DATADIR/ibdata1 +perl; +foreach (glob("$ENV{MYSQLD_DATADIR}/undo*")) { + system("$ENV{INNOCHECKSUM} --no-check --write=NONE $_") +} +foreach (glob("$ENV{MYSQLD_DATADIR}/*/*.ibd")) { + system("$ENV{INNOCHECKSUM} --no-check --write=NONE $_") +} +EOF + +--let $restart_parameters= --innodb_checksum_algorithm=strict_none +--source include/start_mysqld.inc +--let $restart_parameters= +# check the table status is GOOD with DML +INSERT INTO tab1 (pk, linestring_key, linestring_nokey) +VALUES (4, ST_GeomFromText('MULTIPOINT(0 0,5 5,10 10,20 20) '), ST_GeomFromText('MULTIPOINT(0 0,5 5,10 10,20 20) ')); + +# load the with repeat function +SET @col_1 = repeat('m', 5); +SET @col_2 = repeat('n', 20); +SET @col_3 = repeat('o', 100); +SET @col_4 = repeat('p', 100); +SET @col_5 = repeat('q', 100); +SET @col_6 = repeat('r', 100); + +# check the table status is GOOD with DML +let $i = 8; +eval INSERT INTO tab2(col_1,col_2,col_3,col_4,col_5,col_6,col_7) +VALUES (@col_1,@col_2,@col_3,@col_4,@cl_5,@col_6,$i); + +# check the records from table +-- disable_result_log +SELECT pk,ST_AsText(linestring_key),ST_AsText(linestring_nokey) +FROM tab1 ORDER BY pk; + +--disable_result_log +SELECT * FROM tab2 ORDER BY col_7; +--enable_result_log + +--echo # stop the server +--source include/shutdown_mysqld.inc + +--echo [2]: Check the page type summary with shortform for tab1.ibd +--replace_regex /File.*.ibd/File::tab1.ibd/ /[0-9]+/#/ +--exec $INNOCHECKSUM -S $MYSQLD_DATADIR/test/tab1.ibd 2>$MYSQLTEST_VARDIR/tmp/page_summary_short.txt + +--echo [3]: Check the page type summary with longform for tab1.ibd +--replace_regex /File.*.ibd/File::tab1.ibd/ /[0-9]+/#/ +--exec $INNOCHECKSUM --page-type-summary $MYSQLD_DATADIR/test/tab1.ibd 2>$MYSQLTEST_VARDIR/tmp/page_summary_long.txt + +--remove_file $MYSQLTEST_VARDIR/tmp/page_summary_short.txt +--remove_file $MYSQLTEST_VARDIR/tmp/page_summary_long.txt +--echo [4]: Page type dump for with longform for tab1.ibd +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--exec $INNOCHECKSUM --page-type-dump $MYSQLTEST_VARDIR/tmp/dump.txt $MYSQLD_DATADIR/test/tab1.ibd + +perl; +use strict; +use warnings; +use File::Copy; +my $dir = $ENV{'MYSQLTEST_VARDIR'}; +opendir(DIR, $dir) or die $!; +my $file= 'dump.txt'; +# open file in write mode +open IN_FILE,"<", "$dir/tmp/$file" or die $!; +open OUT_FILE, ">", "$dir/tmp/innochecksum_3_tempfile" or die $!; +while() +{ + # Replace the intergers to # and complete file path to file name only. + $_=~ s/Filename.+/Filename::tab1.ibd/g; + $_=~ s/\d+/#/g; + print OUT_FILE $_; +} +close(IN_FILE); +close(OUT_FILE); +# move the new content from tmp file to the orginal file. +move ("$dir/tmp/innochecksum_3_tempfile", "$dir/tmp/$file"); +closedir(DIR); +EOF + +--echo # Print the contents stored in dump.txt +cat_file $MYSQLTEST_VARDIR/tmp/dump.txt; +--remove_file $MYSQLTEST_VARDIR/tmp/dump.txt + +--echo # Variables used by page type dump for ibdata1 +--exec $INNOCHECKSUM -v --page-type-dump $MYSQLTEST_VARDIR/tmp/dump.txt $MYSQLD_DATADIR/ibdata1 > $MYSQLTEST_VARDIR/tmp/page_verbose_summary.txt + +--file_exists $MYSQLTEST_VARDIR/tmp/dump.txt +--remove_file $MYSQLTEST_VARDIR/tmp/dump.txt + +perl; +use strict; +use warnings; +use File::Copy; +my $dir = $ENV{'MYSQLTEST_VARDIR'}; +opendir(DIR, $dir) or die $!; +my $file= 'page_verbose_summary.txt'; +# open file in write mode +open IN_FILE,"<", "$dir/tmp/$file" or die $!; +open OUT_FILE, ">", "$dir/tmp/innochecksum_3_tempfile" or die $!; +while() +{ + # Replace complete file path to file name only. + $_=~ s/$dir/MYSQLTEST_VARDIR/; + # Remove debug option, which is not in all builds + next if (/debug/); + print OUT_FILE $_; +} +close(IN_FILE); +close(OUT_FILE); +# move the new content from tmp file to the orginal file. +move ("$dir/tmp/innochecksum_3_tempfile", "$dir/tmp/$file"); +closedir(DIR); +EOF + +cat_file $MYSQLTEST_VARDIR/tmp/page_verbose_summary.txt; +--remove_file $MYSQLTEST_VARDIR/tmp/page_verbose_summary.txt + +--echo [5]: Page type dump for with shortform for tab1.ibd +--exec $INNOCHECKSUM -D $MYSQLTEST_VARDIR/tmp/dump.txt $MYSQLD_DATADIR/test/tab1.ibd + +perl; +use strict; +use warnings; +use File::Copy; +my $dir = $ENV{'MYSQLTEST_VARDIR'}; +opendir(DIR, $dir) or die $!; +my $file= 'dump.txt'; +# open file in write mode +open IN_FILE,"<", "$dir/tmp/$file" or die $!; +open OUT_FILE, ">", "$dir/tmp/innochecksum_3_tempfile" or die $!; +while() +{ + # Replace the intergers to # and complete file path to file name only. + $_=~ s/Filename.+/Filename::tab1.ibd/g; + $_=~ s/\d+/#/g; + print OUT_FILE $_; +} +close(IN_FILE); +close(OUT_FILE); +# move the new content from tmp file to the orginal file. +move ("$dir/tmp/innochecksum_3_tempfile", "$dir/tmp/$file"); +closedir(DIR); +EOF + +# Print the contents stored in dump.txt +cat_file $MYSQLTEST_VARDIR/tmp/dump.txt; +--remove_file $MYSQLTEST_VARDIR/tmp/dump.txt + +--echo [6]: check the valid lower bound values for option +--echo # allow-mismatches,page,start-page,end-page +--exec $INNOCHECKSUM --allow-mismatches=0 $MYSQLD_DATADIR/test/tab1.ibd +--exec $INNOCHECKSUM -a 0 $MYSQLD_DATADIR/test/tab1.ibd +--exec $INNOCHECKSUM --page=0 $MYSQLD_DATADIR/test/tab1.ibd +--exec $INNOCHECKSUM -p 0 $MYSQLD_DATADIR/test/tab1.ibd +--exec $INNOCHECKSUM --start-page=0 $MYSQLD_DATADIR/test/tab1.ibd +--exec $INNOCHECKSUM -s 0 $MYSQLD_DATADIR/test/tab1.ibd +--exec $INNOCHECKSUM --end-page=0 $MYSQLD_DATADIR/test/tab1.ibd +--exec $INNOCHECKSUM -e 0 $MYSQLD_DATADIR/test/tab1.ibd + +# +# These produce now errors +# +#--echo [7]: check the negative values for option +#--echo # allow-mismatches,page,start-page,end-page. +#--echo # They will reset to zero for negative values. +#--echo # check the invalid lower bound values +#--exec $INNOCHECKSUM --allow-mismatches=-1 $MYSQLD_DATADIR/test/tab1.ibd +#--exec $INNOCHECKSUM -a -1 $MYSQLD_DATADIR/test/tab1.ibd +#--exec $INNOCHECKSUM --page=-1 $MYSQLD_DATADIR/test/tab1.ibd +#--exec $INNOCHECKSUM -p -1 $MYSQLD_DATADIR/test/tab1.ibd +#--exec $INNOCHECKSUM --start-page=-1 $MYSQLD_DATADIR/test/tab1.ibd +#--exec $INNOCHECKSUM -s -1 $MYSQLD_DATADIR/test/tab1.ibd +#--exec $INNOCHECKSUM --end-page=-1 $MYSQLD_DATADIR/test/tab1.ibd +#--exec $INNOCHECKSUM -e -1 $MYSQLD_DATADIR/test/tab1.ibd +# +#--echo [8]: check the valid upper bound values for +#--echo # both short and long options "allow-mismatches" and "end-page" +# +#--exec $INNOCHECKSUM --allow-mismatches=18446744073709551615 $MYSQLD_DATADIR/test/tab1.ibd +#--exec $INNOCHECKSUM -a 18446744073709551615 $MYSQLD_DATADIR/test/tab1.ibd +#--exec $INNOCHECKSUM --end-page=18446744073709551615 $MYSQLD_DATADIR/test/tab1.ibd +#--exec $INNOCHECKSUM -e 18446744073709551615 $MYSQLD_DATADIR/test/tab1.ibd + +--echo [9]: check the both short and long options "page" and "start-page" when +--echo # seek value is larger than file size. +--error 1 +--exec $INNOCHECKSUM --page=18446744073709551615 $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Error: Unable to seek to necessary offset: Invalid argument; +--source include/search_pattern_in_file.inc + +--error 1 +--exec $INNOCHECKSUM -p 18446744073709551615 $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Error: Unable to seek to necessary offset: Invalid argument; +--source include/search_pattern_in_file.inc + +--error 1 +--exec $INNOCHECKSUM --start-page=18446744073709551615 $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Error: Unable to seek to necessary offset: Invalid argument; +--source include/search_pattern_in_file.inc + +--error 1 +--exec $INNOCHECKSUM -s 18446744073709551615 $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Error: Unable to seek to necessary offset: Invalid argument; +--source include/search_pattern_in_file.inc + +--echo [34]: check the invalid upper bound values for options, allow-mismatches, end-page, start-page and page. +--echo # innochecksum will fail with error code: 1 +--error 1 +--exec $INNOCHECKSUM --allow-mismatches=18446744073709551616 $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Incorrect unsigned integer value: '18446744073709551616'; +--source include/search_pattern_in_file.inc + +--error 1 +--exec $INNOCHECKSUM -a 18446744073709551616 $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Incorrect unsigned integer value: '18446744073709551616'; +--source include/search_pattern_in_file.inc + +--error 1 +--exec $INNOCHECKSUM --end-page=18446744073709551616 $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Incorrect unsigned integer value: '18446744073709551616'; +--source include/search_pattern_in_file.inc + +--error 1 +--exec $INNOCHECKSUM -e 18446744073709551616 $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Incorrect unsigned integer value: '18446744073709551616'; +--source include/search_pattern_in_file.inc + +--error 1 +--exec $INNOCHECKSUM --page=18446744073709551616 $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Incorrect unsigned integer value: '18446744073709551616'; +--source include/search_pattern_in_file.inc + +--error 1 +--exec $INNOCHECKSUM -p 18446744073709551616 $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Incorrect unsigned integer value: '18446744073709551616'; +--source include/search_pattern_in_file.inc + +--error 1 +--exec $INNOCHECKSUM --start-page=18446744073709551616 $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Incorrect unsigned integer value: '18446744073709551616'; +--source include/search_pattern_in_file.inc + +--error 1 +--exec $INNOCHECKSUM -s 18446744073709551616 $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE +let SEARCH_PATTERN= Incorrect unsigned integer value: '18446744073709551616'; +--source include/search_pattern_in_file.inc +--remove_file $SEARCH_FILE + +# Cleanup +--source include/start_mysqld.inc + +DROP TABLE tab1,tab2; diff --git a/mysql-test/suite/innodb/t/log_data_file_size.test b/mysql-test/suite/innodb/t/log_data_file_size.test index 56a9d35bd92..7928fc45520 100644 --- a/mysql-test/suite/innodb/t/log_data_file_size.test +++ b/mysql-test/suite/innodb/t/log_data_file_size.test @@ -1,4 +1,4 @@ ---source include/have_innodb.inc +--source include/innodb_page_size.inc --source include/not_embedded.inc let INNODB_PAGE_SIZE=`select @@innodb_page_size`; @@ -23,13 +23,13 @@ use Fcntl 'SEEK_CUR', 'SEEK_END'; my $page_size = $ENV{'INNODB_PAGE_SIZE'}; my $restart; +open(FILE, "+<", "$ENV{'MYSQLD_DATADIR'}ibdata1") or die; if ($ENV{'MYSQLD_IS_DEBUG'}) { # It is impractical to ensure that CREATE TABLE t will extend ibdata1. # We rely on innodb_system_tablespace_extend_debug=1 # to recover from this fault injection if no size change was redo-logged. my $root = $ENV{'INNODB_ROOT_PAGE'}; - open(FILE, "+<", "$ENV{'MYSQLD_DATADIR'}ibdata1") or die; my $size = sysseek(FILE, 0, SEEK_END) / $page_size; seek(FILE, $page_size * ($root + 1), SEEK_SET) or die; my $empty_tail= 1; @@ -39,8 +39,22 @@ if ($ENV{'MYSQLD_IS_DEBUG'}) $restart = "--innodb-data-file-size-debug=$size"; truncate(FILE, $page_size * $root); } - close FILE; } +# Clear the doublewrite buffer entries for our tables. +sysseek(FILE, 6 * $page_size - 190, 0)||die "Unable to seek ibdata1\n"; +sysread(FILE, $_, 12) == 12||die "Unable to read TRX_SYS\n"; +my($magic,$d1,$d2)=unpack "NNN", $_; +die "magic=$magic, $d1, $d2\n" unless $magic == 536853855 && $d2 >= $d1 + 64; +sysseek(FILE, $d1 * $page_size, 0)||die "Unable to seek ibdata1\n"; +# Find the pages in the doublewrite buffer +for (my $d = $d1; $d < $d2 + 64; $d++) { + sysread(FILE, $_, $page_size)==$page_size||die "Cannot read doublewrite\n"; + my($space_id,$offset)=unpack "x[4]Nx[26]N",$_; + next unless $space_id && $offset > 3; + sysseek(FILE, $d * $page_size, 0)||die "Unable to seek ibdata1\n"; + syswrite(FILE, chr(0) x $page_size)==$page_size||die; +} +close FILE; open(FILE, ">$ENV{MYSQLTEST_VARDIR}/log/start_mysqld.txt") || die; print FILE "--let \$restart_parameters=$restart\n" if $restart; print FILE "--source include/start_mysqld.inc\n"; diff --git a/mysql-test/suite/innodb/t/log_file.test b/mysql-test/suite/innodb/t/log_file.test index f5d46b1db10..8a82ab7f29f 100644 --- a/mysql-test/suite/innodb/t/log_file.test +++ b/mysql-test/suite/innodb/t/log_file.test @@ -218,7 +218,7 @@ eval $check_no_innodb; --source include/start_mysqld.inc eval $check_yes_innodb; --source include/shutdown_mysqld.inc ---let SEARCH_PATTERN=Resizing redo log from 1\*\d+ to 3\*\d+ pages; LSN=\d+ +--let SEARCH_PATTERN=Resizing redo log from 1\*\d+ to 3\*\d+ bytes; LSN=\d+ --source include/search_pattern_in_file.inc --let $restart_parameters= diff --git a/mysql-test/suite/innodb/t/log_file_name.test b/mysql-test/suite/innodb/t/log_file_name.test index 0a8dc3e1fc0..2ee8c49aa7c 100644 --- a/mysql-test/suite/innodb/t/log_file_name.test +++ b/mysql-test/suite/innodb/t/log_file_name.test @@ -7,6 +7,7 @@ --source include/not_embedded.inc SET GLOBAL innodb_file_per_table=ON; +FLUSH TABLES; CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB; @@ -170,6 +171,7 @@ call mtr.add_suppression("InnoDB: Ignoring tablespace for `test`.`u[1-3]` becaus call mtr.add_suppression("InnoDB: Failed to find tablespace for table .* in the cache. Attempting to load the tablespace with space id"); call mtr.add_suppression("InnoDB: Plugin initialization aborted"); call mtr.add_suppression("Plugin 'InnoDB' \(init function returned error\|registration as a STORAGE ENGINE failed\)"); +call mtr.add_suppression("InnoDB: Table test/u[123] in the InnoDB data dictionary has tablespace id [1-9][0-9]*, but tablespace with that id or name does not exist\\. Have you deleted or moved \\.ibd files\\?"); FLUSH TABLES; --enable_query_log @@ -265,7 +267,6 @@ let SEARCH_PATTERN= \[Warning\] InnoDB: Tablespace \d+ was not found at .*u[1-5] DROP TABLE u1,u2,u3,u6; ---remove_file $MYSQLD_DATADIR/test/u1.ibd --echo # List of files: --list_files $MYSQLD_DATADIR/test diff --git a/mysql-test/suite/innodb/t/log_file_size.test b/mysql-test/suite/innodb/t/log_file_size.test index ae6442a7994..206444115fc 100644 --- a/mysql-test/suite/innodb/t/log_file_size.test +++ b/mysql-test/suite/innodb/t/log_file_size.test @@ -1,5 +1,5 @@ # Test resizing the InnoDB redo log. ---source include/have_innodb.inc +--source include/innodb_page_size_small.inc # Embedded server tests do not support restarting --source include/not_embedded.inc # DBUG_EXECUTE_IF is needed @@ -16,7 +16,7 @@ call mtr.add_suppression("Plugin 'InnoDB' init function returned error"); call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed"); call mtr.add_suppression("InnoDB: Plugin initialization aborted"); call mtr.add_suppression("InnoDB: innodb_read_only prevents crash recovery"); -call mtr.add_suppression("InnoDB: Are you sure you are using the right ib_logfiles"); +call mtr.add_suppression("InnoDB: Are you sure you are using the right ib_logfiles"); call mtr.add_suppression("InnoDB: Cannot create log files in read-only mode"); call mtr.add_suppression("InnoDB: Only one log file found"); call mtr.add_suppression("InnoDB: Log file .*ib_logfile[01].* size"); @@ -24,6 +24,12 @@ call mtr.add_suppression("InnoDB: Unable to open .*ib_logfile0. to check native FLUSH TABLES; --enable_query_log +--let $restart_parameters= --innodb-thread-concurrency=1 --innodb-log-file-size=1m --innodb-log-files-in-group=2 +--source include/restart_mysqld.inc + +--let $restart_parameters= --innodb-thread-concurrency=100 --innodb-log-file-size=10M --innodb-log-files-in-group=2 +--source include/restart_mysqld.inc + CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB; BEGIN; INSERT INTO t1 VALUES (42); @@ -94,14 +100,14 @@ let SEARCH_PATTERN= InnoDB: innodb_read_only prevents crash recovery; --source include/restart_mysqld.inc --error ER_UNKNOWN_STORAGE_ENGINE SELECT * FROM t1; -let SEARCH_PATTERN= redo log from 3\*[0-9]+ to 2\*[0-9]+ pages; +let SEARCH_PATTERN= redo log from 3\*[0-9]+ to 2\*[0-9]+ bytes; --source include/search_pattern_in_file.inc --let $restart_parameters= --debug=d,innodb_log_abort_5 --source include/restart_mysqld.inc --error ER_UNKNOWN_STORAGE_ENGINE SELECT * FROM t1; -let SEARCH_PATTERN= redo log from 3\*[0-9]+ to 2\*[0-9]+ pages; +let SEARCH_PATTERN= redo log from 3\*[0-9]+ to 2\*[0-9]+ bytes; --source include/search_pattern_in_file.inc --let $restart_parameters= --innodb-read-only @@ -116,7 +122,7 @@ let SEARCH_PATTERN= InnoDB: innodb_read_only prevents crash recovery; --error ER_UNKNOWN_STORAGE_ENGINE SELECT * FROM t1; -let SEARCH_PATTERN= redo log from 3\*[0-9]+ to 2\*[0-9]+ pages; +let SEARCH_PATTERN= redo log from 3\*[0-9]+ to 2\*[0-9]+ bytes; --source include/search_pattern_in_file.inc --let $restart_parameters= --debug=d,innodb_log_abort_7 @@ -164,7 +170,7 @@ EOF --source include/start_mysqld.inc --error ER_UNKNOWN_STORAGE_ENGINE SELECT * FROM t1; -let SEARCH_PATTERN= InnoDB: Log file .*ib_logfile0 size 7 is not a multiple of innodb_page_size; +let SEARCH_PATTERN= InnoDB: Log file .*ib_logfile0 size 7 is not a multiple of 512 bytes; --source include/search_pattern_in_file.inc --remove_file $MYSQLD_DATADIR/ib_logfile0 --move_file $MYSQLD_DATADIR/ib_logfile101 $MYSQLD_DATADIR/ib_logfile0 diff --git a/mysql-test/suite/innodb/t/purge_thread_shutdown.test b/mysql-test/suite/innodb/t/purge_thread_shutdown.test new file mode 100644 index 00000000000..8a9a834454c --- /dev/null +++ b/mysql-test/suite/innodb/t/purge_thread_shutdown.test @@ -0,0 +1,41 @@ +source include/have_innodb.inc; +source include/not_embedded.inc; +source include/have_debug.inc; + +connect con1, localhost, root; +create table t1 (a int) engine=innodb; +insert t1 values (1),(2),(3),(4); +delete from t1 where a=1; + +select user,state from information_schema.processlist order by 2; + +set global debug_dbug='+d,only_kill_system_threads'; +set global innodb_fast_shutdown=0; + +let $_server_id= `SELECT @@server_id`; +let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.$_server_id.expect; +exec echo "wait" > $_expect_file_name; +send shutdown; + +connection default; +disconnect con1; + +sleep 5; +select user,state from information_schema.processlist order by 2; +set global innodb_fast_shutdown=1; + +let $wait_condition=select count(*) = 0 from information_schema.processlist where user='system user'; +source include/wait_condition.inc; +select user,state from information_schema.processlist order by 2; + +delete from t1 where a=3; +error ER_WRONG_VALUE_FOR_VAR; +set global innodb_fast_shutdown=0; + +let $me=`select connection_id()`; +replace_result $me ID; +error ER_CONNECTION_KILLED; +eval kill $me; + +source include/start_mysqld.inc; +drop table t1; diff --git a/mysql-test/suite/innodb/t/read_only_recovery.test b/mysql-test/suite/innodb/t/read_only_recovery.test index a1a69be724b..aea676d3644 100644 --- a/mysql-test/suite/innodb/t/read_only_recovery.test +++ b/mysql-test/suite/innodb/t/read_only_recovery.test @@ -4,9 +4,10 @@ --connect(con1, localhost, root) CREATE TABLE t(a INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t VALUES(1); BEGIN; # Generate insert_undo log. -INSERT INTO t VALUES(1),(2); +INSERT INTO t VALUES(2); # Generate update_undo log. DELETE FROM t WHERE a=2; --connection default @@ -27,6 +28,7 @@ ROLLBACK; SELECT * FROM t; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT * FROM t; +UPDATE t SET a=3 WHERE a=1; --let $restart_parameters= --innodb-read-only --source include/restart_mysqld.inc --echo # Starting with MariaDB 10.2, innodb_read_only implies READ UNCOMMITTED. diff --git a/mysql-test/suite/innodb/t/rename_table.opt b/mysql-test/suite/innodb/t/rename_table.opt new file mode 100644 index 00000000000..a4c52ea7d79 --- /dev/null +++ b/mysql-test/suite/innodb/t/rename_table.opt @@ -0,0 +1,2 @@ +--innodb +--innodb-sys-datafiles diff --git a/mysql-test/suite/innodb/t/rename_table.test b/mysql-test/suite/innodb/t/rename_table.test new file mode 100644 index 00000000000..ea9f70bacb0 --- /dev/null +++ b/mysql-test/suite/innodb/t/rename_table.test @@ -0,0 +1,31 @@ +--source include/have_innodb.inc +--source include/not_embedded.inc + +CREATE DATABASE test_jfg; +CREATE DATABASE test_jfg2; +CREATE TABLE test_jfg.test (a int unsigned PRIMARY KEY) ENGINE=InnoDB; +RENAME TABLE test_jfg.test TO test_jfg2.test; + +SELECT REPLACE(path,'\\','/') path +FROM INFORMATION_SCHEMA.INNODB_SYS_DATAFILES WHERE PATH LIKE '%test%'; + +DROP DATABASE test_jfg; + +--source include/restart_mysqld.inc + +DROP DATABASE test_jfg2; + +CREATE DATABASE abc_def; +CREATE DATABASE abc_def2; + +CREATE TABLE abc_def.test (a int unsigned PRIMARY KEY) ENGINE=InnoDB; +RENAME TABLE abc_def.test TO abc_def2.test1; + +SELECT REPLACE(path,'\\','/') path +FROM INFORMATION_SCHEMA.INNODB_SYS_DATAFILES WHERE PATH LIKE '%test%'; + +DROP DATABASE abc_def; + +--source include/restart_mysqld.inc + +DROP DATABASE abc_def2; diff --git a/mysql-test/suite/innodb/t/row_format_redundant.test b/mysql-test/suite/innodb/t/row_format_redundant.test new file mode 100644 index 00000000000..af3fe3b52cf --- /dev/null +++ b/mysql-test/suite/innodb/t/row_format_redundant.test @@ -0,0 +1,157 @@ +--source include/have_innodb.inc +# Embedded mode doesn't allow restarting +--source include/not_embedded.inc + +--disable_query_log +call mtr.add_suppression("InnoDB: Table `mysql`\\.`innodb_table_stats` not found"); +call mtr.add_suppression("InnoDB: Table `test`.`t1` in InnoDB data dictionary contains invalid flags. SYS_TABLES\\.TYPE=1 SYS_TABLES\\.MIX_LEN=255\\r?$"); +call mtr.add_suppression("InnoDB: Parent table of FTS auxiliary table test/FTS_.* not found"); +call mtr.add_suppression("InnoDB: Cannot open table test/t1 from the internal data dictionary"); +call mtr.add_suppression("InnoDB: Table `test`.`t1` does not exist in the InnoDB internal data dictionary though MariaDB is trying to (rename|drop)"); +FLUSH TABLES; +--enable_query_log + +let INNODB_PAGE_SIZE=`select @@innodb_page_size`; + +let bugdir= $MYSQLTEST_VARDIR/tmp/row_format_redundant; +--mkdir $bugdir +--let SEARCH_FILE = $MYSQLTEST_VARDIR/log/mysqld.1.err + +--let $d=--innodb-data-home-dir=$bugdir --innodb-log-group-home-dir=$bugdir +--let $d=$d --innodb-data-file-path=ibdata1:1M:autoextend +--let $d=$d --innodb-undo-tablespaces=0 --innodb-stats-persistent=0 +--let $restart_parameters= $d +--source include/restart_mysqld.inc + +SET GLOBAL innodb_file_per_table=1; + +--echo # +--echo # Bug#21644827 - FTS, ASSERT !SRV_READ_ONLY_MODE || M_IMPL.M_LOG_MODE == +--echo # MTR_LOG_NO_REDO +--echo # + +SET GLOBAL innodb_file_per_table=ON; +create table t1 (a int not null, d varchar(15) not null, b +varchar(198) not null, c char(156), +fulltext ftsic(c)) engine=InnoDB +row_format=redundant; + +insert into t1 values(123, 'abcdef', 'jghikl', 'mnop'); +insert into t1 values(456, 'abcdef', 'jghikl', 'mnop'); +insert into t1 values(789, 'abcdef', 'jghikl', 'mnop'); +insert into t1 values(134, 'kasdfsdsadf', 'adfjlasdkfjasd', 'adfsadflkasdasdfljasdf'); +insert into t1 select * from t1; +insert into t1 select * from t1; +insert into t1 select * from t1; +insert into t1 select * from t1; +insert into t1 select * from t1; +insert into t1 select * from t1; +insert into t1 select * from t1; +insert into t1 select * from t1; +insert into t1 select * from t1; +insert into t1 select * from t1; + +SET GLOBAL innodb_file_per_table=OFF; +create table t2 (a int not null, d varchar(15) not null, b +varchar(198) not null, c char(156), fulltext ftsic(c)) engine=InnoDB +row_format=redundant; + +insert into t2 select * from t1; + +create table t3 (a int not null, d varchar(15) not null, b varchar(198), +c varchar(150), index k1(c(99), b(56)), index k2(b(5), c(10))) engine=InnoDB +row_format=redundant; + +insert into t3 values(444, 'dddd', 'bbbbb', 'aaaaa'); +insert into t3 values(555, 'eeee', 'ccccc', 'aaaaa'); + +# read-only restart requires the change buffer to be empty; therefore we +# do a slow shutdown. +SET GLOBAL innodb_fast_shutdown=0; +--let $restart_parameters= $d --innodb-read-only +--source include/restart_mysqld.inc + +SELECT COUNT(*) FROM t1; +SELECT COUNT(*) FROM t2; +SELECT COUNT(*) FROM t3; + +--error ER_OPEN_AS_READONLY +TRUNCATE TABLE t1; +--error ER_OPEN_AS_READONLY +TRUNCATE TABLE t2; +--error ER_OPEN_AS_READONLY +TRUNCATE TABLE t3; + +--let $restart_parameters= $d +--source include/restart_mysqld.inc + +TRUNCATE TABLE t1; +TRUNCATE TABLE t2; +TRUNCATE TABLE t3; + +--source include/shutdown_mysqld.inc +--perl +use strict; +my $ps= $ENV{INNODB_PAGE_SIZE}; +my $file= "$ENV{bugdir}/ibdata1"; +open(FILE, "+<", $file) || die "Unable to open $file\n"; +# Read DICT_HDR_TABLES, the root page number of CLUST_IND (SYS_TABLES.NAME). +sysseek(FILE, 7*$ps+38+32, 0) || die "Unable to seek $file"; +die "Unable to read $file" unless sysread(FILE, $_, 4) == 4; +my $sys_tables_root = unpack("N", $_); +my $page; +sysseek(FILE, $sys_tables_root*$ps, 0) || die "Unable to seek $file"; +die "Unable to read $file" unless sysread(FILE, $page, $ps) == $ps; +for (my $offset= 0x65; $offset; + $offset= unpack("n", substr($page,$offset-2,2))) +{ + my $n_fields= unpack("n", substr($page,$offset-4,2)) >> 1 & 0x3ff; + my $start= 0; + my $end= unpack("C", substr($page, $offset-7, 1)); + my $name= substr($page,$offset+$start,$end-$start); + for (my $i= 0; $i < $n_fields; $i++) { + my $end= unpack("C", substr($page, $offset-7-$i, 1)); + # Corrupt SYS_TABLES.MIX_LEN (ignored for ROW_FORMAT=REDUNDANT) + if ($i == 7 && $name =~ '^test/t[123]') + { + print "corrupted SYS_TABLES.MIX_LEN for $name\n"; + substr($page,$offset+$start,$end-$start)= pack("N", 255); + } + $start= $end & 0x7f; + } +} +substr($page,0,4)=pack("N",0xdeadbeef); +substr($page,$ps-8,4)=pack("N",0xdeadbeef); +sysseek(FILE, $sys_tables_root*$ps, 0) || die "Unable to seek $file"; +syswrite(FILE, $page, $ps)==$ps || die "Unable to write $file\n"; +close(FILE) || die "Unable to close $file\n"; +EOF + +--source include/start_mysqld.inc +--error ER_NO_SUCH_TABLE_IN_ENGINE +TRUNCATE TABLE t1; +TRUNCATE TABLE t2; +TRUNCATE TABLE t3; +--error ER_NO_SUCH_TABLE_IN_ENGINE +SELECT COUNT(*) FROM t1; +SELECT COUNT(*) FROM t2; +SELECT COUNT(*) FROM t3; +--error ER_ERROR_ON_RENAME +RENAME TABLE t1 TO tee_one; +DROP TABLE t1; +DROP TABLE t2,t3; + +--let SEARCH_PATTERN= \[ERROR\] InnoDB: Table `test`\.`t1` in InnoDB data dictionary contains invalid flags\. SYS_TABLES\.TYPE=1 SYS_TABLES\.MIX_LEN=255\b +--source include/search_pattern_in_file.inc + +--let $restart_parameters= +--source include/restart_mysqld.inc + +--list_files $bugdir +--remove_files_wildcard $bugdir +--rmdir $bugdir + +# Remove the data file, because DROP TABLE skipped it for the "corrupted" table +--let MYSQLD_DATADIR=`select @@datadir` +--remove_file $MYSQLD_DATADIR/test/t1.ibd +--list_files $MYSQLD_DATADIR/test diff --git a/mysql-test/suite/innodb/t/table_flags.test b/mysql-test/suite/innodb/t/table_flags.test new file mode 100644 index 00000000000..b8ccc4ce4b6 --- /dev/null +++ b/mysql-test/suite/innodb/t/table_flags.test @@ -0,0 +1,204 @@ +--source include/innodb_page_size.inc +# Embedded server tests do not support restarting +--source include/not_embedded.inc + +--disable_query_log +call mtr.add_suppression("InnoDB: Table `mysql`\\.`innodb_table_stats` not found"); +call mtr.add_suppression("InnoDB: incorrect flags in SYS_TABLES"); +call mtr.add_suppression("InnoDB: Table `test`.`t[czp]` in InnoDB data dictionary contains invalid flags\\. SYS_TABLES\\.TYPE=(129|289|3873|1232[31]) SYS_TABLES\\.N_COLS=2147483649\\r?$"); +call mtr.add_suppression("InnoDB: Table `test`\\.`tr` in InnoDB data dictionary contains invalid flags\\. SYS_TABLES\\.TYPE=65 SYS_TABLES\\.MIX_LEN=4294967295\\r?$"); +call mtr.add_suppression("InnoDB: Refusing to load '\\..test.td\\.ibd' \\(id=3, flags=0x([2e]1)\\); dictionary contains id=3, flags=0x100\\1\\r?$"); +call mtr.add_suppression("InnoDB: Refusing to load '\\..test.td\\.ibd' \\(id=3, flags=0x(1[2ae]1)\\); dictionary contains id=3, flags=0x10\\1\\r?$"); +call mtr.add_suppression("InnoDB: Ignoring tablespace for `test`.`td` because it could not be opened\\."); +# FIXME: Remove the following spam due to invalid flags for test.td +call mtr.add_suppression("InnoDB: Operating system error number .* in a file operation"); +call mtr.add_suppression("InnoDB: The error means the system cannot find the path specified"); +call mtr.add_suppression("InnoDB: If you are installing InnoDB, remember that you must create directories yourself"); +FLUSH TABLES; +--enable_query_log + +let INNODB_PAGE_SIZE=`select @@innodb_page_size`; +let MYSQLD_DATADIR=`select @@datadir`; + +let bugdir= $MYSQLTEST_VARDIR/tmp/table_flags; +--mkdir $bugdir +--let SEARCH_FILE = $MYSQLTEST_VARDIR/log/mysqld.1.err + +--let $d=--innodb-data-home-dir=$bugdir --innodb-log-group-home-dir=$bugdir +--let $d=$d --innodb-data-file-path=ibdata1:1M:autoextend +--let $d=$d --innodb-undo-tablespaces=0 +--let $restart_parameters=$d --innodb-stats-persistent=0 --innodb-file-format=1 +--source include/restart_mysqld.inc + +SET GLOBAL innodb_file_per_table=1; +CREATE TABLE tr(a INT PRIMARY KEY)ENGINE=InnoDB ROW_FORMAT=REDUNDANT; +CREATE TABLE tc(a INT PRIMARY KEY)ENGINE=InnoDB ROW_FORMAT=COMPACT; +CREATE TABLE td(a INT PRIMARY KEY)ENGINE=InnoDB ROW_FORMAT=DYNAMIC; +SET innodb_strict_mode=OFF; +CREATE TABLE tz(a INT PRIMARY KEY)ENGINE=InnoDB ROW_FORMAT=COMPRESSED +KEY_BLOCK_SIZE=1; +SET innodb_strict_mode=ON; +# PAGE_COMPRESSED is supported starting with MariaDB 10.1.0 +CREATE TABLE tp(a INT PRIMARY KEY)ENGINE=InnoDB ROW_FORMAT=DYNAMIC +PAGE_COMPRESSED=1 PAGE_COMPRESSION_LEVEL=9; + +--source include/shutdown_mysqld.inc +--perl +use strict; +my $ps= $ENV{INNODB_PAGE_SIZE}; +my $file= "$ENV{bugdir}/ibdata1"; +open(FILE, "+<", $file) || die "Unable to open $file\n"; +# Read DICT_HDR_TABLES, the root page number of CLUST_IND (SYS_TABLES.NAME). +sysseek(FILE, 7*$ps+38+32, 0) || die "Unable to seek $file"; +die "Unable to read $file" unless sysread(FILE, $_, 4) == 4; +my $sys_tables_root = unpack("N", $_); +my $page; +print "SYS_TABLES clustered index root page ($sys_tables_root):\n"; +sysseek(FILE, $sys_tables_root*$ps, 0) || die "Unable to seek $file"; +die "Unable to read $file" unless sysread(FILE, $page, $ps) == $ps; +open(BACKUP, ">$ENV{bugdir}/sys_tables.bin") || die "Unable to open backup\n"; +syswrite(BACKUP, $page, $ps)==$ps || die "Unable to write backup\n"; +close(BACKUP) || die "Unable to close backup\n"; +print "N_RECS=", unpack("n", substr($page,38+16,2)); +print "; LEVEL=", unpack("n", substr($page,38+26,2)); +print "; INDEX_ID=0x", unpack("H*", substr($page,38+28,8)), "\n"; +my @fields=("NAME","DB_TRX_ID","DB_ROLL_PTR", + "ID","N_COLS","TYPE","MIX_ID","MIX_LEN","CLUSTER_NAME","SPACE"); +for (my $offset= 0x65; $offset; + $offset= unpack("n", substr($page,$offset-2,2))) +{ + print "header=0x", unpack("H*",substr($page,$offset-6,6)), " ("; + my $n_fields= unpack("n", substr($page,$offset-4,2)) >> 1 & 0x3ff; + my $start= 0; + my $name; + for (my $i= 0; $i < $n_fields; $i++) { + my $end= unpack("C", substr($page, $offset-7-$i, 1)); + print ",\n " if $i; + print "$fields[$i]="; + if ($end & 0x80) { + print "NULL(", ($end & 0x7f) - $start, " bytes)" + } elsif ($n_fields > 1 && $i == 0) { + $name= substr($page,$offset+$start,$end-$start); + print "'$name'" + } else { + print "0x", unpack("H*", substr($page,$offset+$start,$end-$start)) + } + # Corrupt SYS_TABLES.TYPE + if ($i == 5) + { + my $flags= 0; + if ($name eq 'test/tr') { + $flags= 0x40 # DATA_DIR (largely ignored by 10.1+) + } elsif ($name eq 'test/tc') { + $flags= 0x80 # 10.1 PAGE_COMPRESSED + } elsif ($name eq 'test/td') { + $flags= 0xf00 # PAGE_COMPRESSION_LEVEL=15 (0..9 is valid) + # As part of the MDEV-12873 fix, because the + # PAGE_COMPRESSED=YES flag was not set, we will assume that + # this table was actually created with 10.2.2..10.2.6 + # using PAGE_COMPRESSED=YES PAGE_COMPRESSION_LEVEL=7. + } elsif ($name eq 'test/tz') { + $flags= 0x3000 # 10.1 ATOMIC_WRITES=3 (0..2 is valid) + } elsif ($name eq 'test/tp') { + $flags= 0x880 # 10.1 PAGE_COMPRESSED, PAGE_COMPRESSION_LEVEL=8 + # (in 10.2.2 through 10.2.6, this is interpreted as + # PAGE_COMPRESSION_LEVEL=4 without PAGE_COMPRESSED + # but with SHARED_SPACE, which should be invalid) + } + + substr($page,$offset+$start,$end-$start)= pack( + "N", $flags ^ + unpack("N", substr($page,$offset+$start,$end-$start))) + if $flags; + } + # Corrupt SYS_TABLES.MIX_LEN (ignored for ROW_FORMAT=REDUNDANT) + if ($i == 7 && $name eq 'test/tr') + { + substr($page,$offset+$start,$end-$start)= chr(255) x 4; + } + $start= $end & 0x7f; + } + print ")\n"; +} +substr($page,0,4)=pack("N",0xdeadbeef); +substr($page,$ps-8,4)=pack("N",0xdeadbeef); +sysseek(FILE, $sys_tables_root*$ps, 0) || die "Unable to seek $file"; +syswrite(FILE, $page, $ps)==$ps || die "Unable to write $file\n"; +close(FILE) || die "Unable to close $file\n"; +EOF +--source include/start_mysqld.inc + +--error ER_NO_SUCH_TABLE_IN_ENGINE +SHOW CREATE TABLE tr; +--error ER_NO_SUCH_TABLE_IN_ENGINE +SHOW CREATE TABLE tc; +--error ER_NO_SUCH_TABLE_IN_ENGINE +SHOW CREATE TABLE td; +--error ER_NO_SUCH_TABLE_IN_ENGINE +SHOW CREATE TABLE tz; +--error ER_NO_SUCH_TABLE_IN_ENGINE +SHOW CREATE TABLE tp; + +--source include/shutdown_mysqld.inc + +let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err; +--let SEARCH_PATTERN= InnoDB: Table `test`.`t[czp]` in InnoDB data dictionary contains invalid flags\. SYS_TABLES\.TYPE=(129|289|3873|1232[13]) SYS_TABLES\.N_COLS=2147483649 +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN= InnoDB: Refusing to load '\..test.td\.ibd' \(id=3, flags=0x1?[2ae]1\); dictionary contains id=3, flags=0x10[01][2ae]1\b +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN= InnoDB: Table `test`\.`tr` in InnoDB data dictionary contains invalid flags\. SYS_TABLES\.TYPE=65 SYS_TABLES\.MIX_LEN=4294967295\b +--source include/search_pattern_in_file.inc + +# Restore the backup of the corrupted SYS_TABLES clustered index root page +--perl +use strict; +my $ps= $ENV{INNODB_PAGE_SIZE}; +my $file= "$ENV{bugdir}/ibdata1"; +open(FILE, "+<", $file) || die "Unable to open $file\n"; +open(BACKUP, "<$ENV{bugdir}/sys_tables.bin") || die "Unable to open backup\n"; +# Read DICT_HDR_TABLES, the root page number of CLUST_IND (SYS_TABLES.NAME). +sysseek(FILE, 7*$ps+38+32, 0) || die "Unable to seek $file"; +die "Unable to read $file\n" unless sysread(FILE, $_, 4) == 4; +my $sys_tables_root = unpack("N", $_); +print "Restoring SYS_TABLES clustered index root page ($sys_tables_root)\n"; +sysseek(FILE, $sys_tables_root*$ps, 0) || die "Unable to seek $file"; +die "Unable to read backup\n" unless sysread(BACKUP, $_, $ps) == $ps; +die "Unable to restore backup\n" unless syswrite(FILE, $_, $ps) == $ps; +close(BACKUP); +close(FILE) || die "Unable to close $file\n"; +EOF +--source include/start_mysqld.inc + +SHOW CREATE TABLE tr; +SHOW CREATE TABLE tc; +SHOW CREATE TABLE td; +SHOW CREATE TABLE tz; +SHOW CREATE TABLE tp; + +BEGIN; +INSERT INTO tr VALUES(1); +INSERT INTO tc VALUES(1); +INSERT INTO td VALUES(1); +INSERT INTO tz VALUES(1); +INSERT INTO tp VALUES(1); +ROLLBACK; + +SELECT * FROM tr; +SELECT * FROM tc; +SELECT * FROM td; +SELECT * FROM tz; +SELECT * FROM tp; + +DROP TABLE tr,tc,td,tz,tp; + +--let $restart_parameters= +--source include/restart_mysqld.inc + +--error 0,1 +--remove_file $bugdir/ibtmp1 +--error 0,1 +--remove_file $bugdir/ib_buffer_pool + +--list_files $bugdir +--remove_files_wildcard $bugdir +--rmdir $bugdir diff --git a/mysql-test/suite/innodb/t/temporary_table.test b/mysql-test/suite/innodb/t/temporary_table.test index f841acff1c0..4184daaf064 100644 --- a/mysql-test/suite/innodb/t/temporary_table.test +++ b/mysql-test/suite/innodb/t/temporary_table.test @@ -10,12 +10,13 @@ --source include/no_valgrind_without_big.inc --disable_query_log +call mtr.add_suppression("Can't create/write to file '/dev/null/nonexistent/ib"); +call mtr.add_suppression("InnoDB: Unable to create temporary file"); call mtr.add_suppression("last file in setting innodb_temp_data_file_path"); call mtr.add_suppression("The table 't1' is full"); call mtr.add_suppression("Plugin 'InnoDB' init function returned error"); call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed"); call mtr.add_suppression("InnoDB: Tablespace doesn't support raw devices"); -call mtr.add_suppression("InnoDB: The innodb_temporary data file 'ibtmp1' must be at least"); call mtr.add_suppression("InnoDB: Plugin initialization aborted"); call mtr.add_suppression("innodb_temporary and innodb_system file names seem to be the same"); call mtr.add_suppression("Could not create the shared innodb_temporary"); @@ -126,6 +127,33 @@ let SEARCH_ABORT = NOT FOUND; let $check_no_innodb=SELECT * FROM INFORMATION_SCHEMA.ENGINES WHERE engine = 'innodb' AND support IN ('YES', 'DEFAULT', 'ENABLED'); +# We cannot use include/restart_mysqld.inc in this particular test, +# because SHOW STATUS would fail due to unwritable (nonexistent) tmpdir. +--source include/shutdown_mysqld.inc +--exec echo "restart: --tmpdir=/dev/null/nonexistent" > $_expect_file_name +--enable_reconnect +--disable_result_log +--disable_query_log +let $counter= 5000; +let $mysql_errno= 9999; +while ($mysql_errno) +{ + --error 0,ER_SERVER_SHUTDOWN,ER_CONNECTION_KILLED,2002,2006,2013 + select 1; + + dec $counter; + if (!$counter) + { + --die Server failed to restart + } + --sleep 0.1 +} +--enable_query_log +--enable_result_log +--disable_reconnect +--let SEARCH_PATTERN= InnoDB: Unable to create temporary file +--source include/search_pattern_in_file.inc + --let $restart_parameters= --innodb_data_file_path=ibdata1:12M:autoextend --innodb_temp_data_file_path=ibdata1:12M:autoextend --source include/restart_mysqld.inc --let SEARCH_PATTERN = innodb_temporary and innodb_system file names seem to be the same @@ -143,12 +171,6 @@ eval $check_no_innodb; --source include/search_pattern_in_file.inc eval $check_no_innodb; ---let $restart_parameters= --innodb_temp_data_file_path=ibtmp1:2M:autoextend ---source include/restart_mysqld.inc ---let SEARCH_PATTERN = The innodb_temporary data file 'ibtmp1' must be at least ---source include/search_pattern_in_file.inc -eval $check_no_innodb; - --let $restart_parameters= --innodb_temp_data_file_path= --source include/restart_mysqld.inc --let SEARCH_PATTERN = InnoDB: syntax error in file path diff --git a/mysql-test/suite/innodb/t/truncate_debug.test b/mysql-test/suite/innodb/t/truncate_debug.test index fed5cf9392b..915688ed354 100644 --- a/mysql-test/suite/innodb/t/truncate_debug.test +++ b/mysql-test/suite/innodb/t/truncate_debug.test @@ -103,7 +103,6 @@ send set global innodb_adaptive_hash_index=off; connection default; SET DEBUG_SYNC= 'now SIGNAL finish_scan'; -SET DEBUG_SYNC= 'RESET'; connection con1; reap; @@ -114,6 +113,7 @@ reap; disconnect con2; connection default; +SET DEBUG_SYNC= 'RESET'; SET session lock_wait_timeout=default; set global innodb_adaptive_hash_index=on; diff --git a/mysql-test/suite/innodb/t/truncate_purge_debug.test b/mysql-test/suite/innodb/t/truncate_purge_debug.test index 70ebd28024d..e8f5768f557 100644 --- a/mysql-test/suite/innodb/t/truncate_purge_debug.test +++ b/mysql-test/suite/innodb/t/truncate_purge_debug.test @@ -33,34 +33,17 @@ COMMIT; disconnect con2; connection default; +--source include/wait_all_purged.inc -# Wait for everything to be purged. - -let $wait_counter= 300; -while ($wait_counter) -{ - --replace_regex /.*History list length ([0-9]+).*/\1/ - let $remaining= `SHOW ENGINE INNODB STATUS`; - if ($remaining == 'InnoDB 0') - { - let $wait_counter= 0; - } - if ($wait_counter) - { - real_sleep 0.1; - dec $wait_counter; - } -} -echo $remaining transactions not purged; SET GLOBAL innodb_purge_rseg_truncate_frequency = @saved_frequency; SET DEBUG_SYNC = 'now SIGNAL finish_scan'; -SET DEBUG_SYNC = 'RESET'; connection con1; reap; disconnect con1; connection default; +SET DEBUG_SYNC = 'RESET'; drop table t1; --source include/wait_until_count_sessions.inc diff --git a/mysql-test/suite/innodb/t/xa_recovery.test b/mysql-test/suite/innodb/t/xa_recovery.test index 957b758d05c..20bb52c22f2 100644 --- a/mysql-test/suite/innodb/t/xa_recovery.test +++ b/mysql-test/suite/innodb/t/xa_recovery.test @@ -15,8 +15,14 @@ connect (con1,localhost,root); XA START 'x'; UPDATE t1 set a=2; XA END 'x'; XA PREPARE 'x'; connection default; +# innodb_force_recovery=2 prevents the purge and tests that the fix of +# MDEV-13606 XA PREPARE transactions should survive innodb_force_recovery=1 or 2 +# is present. +--let $restart_parameters= --innodb-force-recovery=2 --let $shutdown_timeout=0 --source include/restart_mysqld.inc +--let $restart_parameters= +--let $shutdown_timeout= disconnect con1; connect (con1,localhost,root); diff --git a/mysql-test/suite/innodb_fts/r/innodb_fts_multiple_index.result b/mysql-test/suite/innodb_fts/r/innodb_fts_multiple_index.result index 0b011639e2e..b0f7d7727d6 100644 --- a/mysql-test/suite/innodb_fts/r/innodb_fts_multiple_index.result +++ b/mysql-test/suite/innodb_fts/r/innodb_fts_multiple_index.result @@ -46,9 +46,9 @@ id a b 1 MySQL Tutorial DBMS stands for DataBase ... select *, MATCH(a) AGAINST("Optimizing MySQL" IN BOOLEAN MODE) as x from t1; id a b x -1 MySQL Tutorial DBMS stands for DataBase ... 0.0906190574169159 -2 How To Use MySQL Well After you went through a ... 0.0906190574169159 -3 Optimizing MySQL In this tutorial we will show ... 0.6961383819580078 +1 MySQL Tutorial DBMS stands for DataBase ... 0.000000001885928302414186 +2 How To Use MySQL Well After you went through a ... 0.000000001885928302414186 +3 Optimizing MySQL In this tutorial we will show ... 0.22764469683170319 select *, MATCH(b) AGAINST("collections support" IN BOOLEAN MODE) as x from t1; id a b x 1 MySQL Tutorial DBMS stands for DataBase ... 0 @@ -90,9 +90,9 @@ id a b 1 MySQL Tutorial DBMS stands for DataBase ... select *, MATCH(a) AGAINST("Optimizing MySQL" IN BOOLEAN MODE) as x from t1; id a b x -1 MySQL Tutorial DBMS stands for DataBase ... 0.0906190574169159 -2 How To Use MySQL Well After you went through a ... 0.0906190574169159 -3 Optimizing MySQL In this tutorial we will show ... 0.6961383819580078 +1 MySQL Tutorial DBMS stands for DataBase ... 0.000000001885928302414186 +2 How To Use MySQL Well After you went through a ... 0.000000001885928302414186 +3 Optimizing MySQL In this tutorial we will show ... 0.22764469683170319 select *, MATCH(b) AGAINST("collections support" IN BOOLEAN MODE) as x from t1; id a b x 1 MySQL Tutorial DBMS stands for DataBase ... 0 diff --git a/mysql-test/suite/innodb_fts/r/innodb_fts_plugin.result b/mysql-test/suite/innodb_fts/r/innodb_fts_plugin.result index f057db1d284..b7688e9ef0f 100644 --- a/mysql-test/suite/innodb_fts/r/innodb_fts_plugin.result +++ b/mysql-test/suite/innodb_fts/r/innodb_fts_plugin.result @@ -135,12 +135,29 @@ INSERT INTO articles (title, body) VALUES ('How To Use MySQL Well','After you went through a ...'), ('Optimizing MySQL','In this tutorial we will show ...'), ('1001 MySQL Tricks','How to use full-text search engine'), -('Go MySQL Tricks','How to use full text search engine'); +('Go MariaDB Tricks','How to use full text search engine'); +SELECT * FROM articles WHERE +MATCH(title, body) AGAINST('MySQL'); +id title body +6 MySQL Tutorial DBMS stands for MySQL DataBase ... +7 How To Use MySQL Well After you went through a ... +8 Optimizing MySQL In this tutorial we will show ... +9 1001 MySQL Tricks How to use full-text search engine +SELECT * FROM articles WHERE +MATCH(title, body) AGAINST('tutorial'); +id title body +6 MySQL Tutorial DBMS stands for MySQL DataBase ... +8 Optimizing MySQL In this tutorial we will show ... SELECT * FROM articles WHERE MATCH(title, body) AGAINST('Tricks'); id title body 9 1001 MySQL Tricks How to use full-text search engine -10 Go MySQL Tricks How to use full text search engine +10 Go MariaDB Tricks How to use full text search engine +SELECT * FROM articles WHERE +MATCH(title, body) AGAINST('full text search'); +id title body +10 Go MariaDB Tricks How to use full text search engine +9 1001 MySQL Tricks How to use full-text search engine SELECT COUNT(*) FROM articles; COUNT(*) 5 diff --git a/mysql-test/suite/innodb_fts/t/innodb_fts_plugin.test b/mysql-test/suite/innodb_fts/t/innodb_fts_plugin.test index 9cc1afd4e60..cd31500b23f 100644 --- a/mysql-test/suite/innodb_fts/t/innodb_fts_plugin.test +++ b/mysql-test/suite/innodb_fts/t/innodb_fts_plugin.test @@ -145,13 +145,18 @@ INSERT INTO articles (title, body) VALUES ('How To Use MySQL Well','After you went through a ...'), ('Optimizing MySQL','In this tutorial we will show ...'), ('1001 MySQL Tricks','How to use full-text search engine'), - ('Go MySQL Tricks','How to use full text search engine'); + ('Go MariaDB Tricks','How to use full text search engine'); --source include/restart_mysqld.inc -# Simple term search - 4 records expected +SELECT * FROM articles WHERE + MATCH(title, body) AGAINST('MySQL'); +SELECT * FROM articles WHERE + MATCH(title, body) AGAINST('tutorial'); SELECT * FROM articles WHERE MATCH(title, body) AGAINST('Tricks'); +SELECT * FROM articles WHERE + MATCH(title, body) AGAINST('full text search'); SELECT COUNT(*) FROM articles; DROP TABLE articles; diff --git a/mysql-test/suite/innodb_gis/r/0.result b/mysql-test/suite/innodb_gis/r/0.result index 9f155deef23..eeeb5fe423b 100644 --- a/mysql-test/suite/innodb_gis/r/0.result +++ b/mysql-test/suite/innodb_gis/r/0.result @@ -326,8 +326,8 @@ fid IsClosed(g) 116 0 SELECT fid, AsText(Centroid(g)) FROM gis_multi_polygon ORDER by fid; fid AsText(Centroid(g)) -117 POINT(55.58852775304245 17.426536064113982) -118 POINT(55.58852775304245 17.426536064113982) +117 POINT(57.98031067576927 17.854754130800433) +118 POINT(57.98031067576927 17.854754130800433) 119 POINT(2 2) SELECT fid, Area(g) FROM gis_multi_polygon ORDER by fid; fid Area(g) @@ -610,7 +610,7 @@ set @g1 = ST_GeomFromText('Polygon((0 0,0 100,100 100,100 0,0 0))'); set transaction isolation level read uncommitted; select count(*) from t1 where ST_Within(t1.c2, @g1); count(*) -0 +1 disconnect con1; connection a; commit; diff --git a/mysql-test/suite/innodb_gis/r/1.result b/mysql-test/suite/innodb_gis/r/1.result index 094ec0185f8..5728f020918 100644 --- a/mysql-test/suite/innodb_gis/r/1.result +++ b/mysql-test/suite/innodb_gis/r/1.result @@ -319,8 +319,8 @@ fid ST_IsClosed(g) 116 0 SELECT fid, ST_AsText(ST_Centroid(g)) FROM gis_multi_polygon; fid ST_AsText(ST_Centroid(g)) -117 POINT(55.58852775304245 17.426536064113982) -118 POINT(55.58852775304245 17.426536064113982) +117 POINT(57.98031067576927 17.854754130800433) +118 POINT(57.98031067576927 17.854754130800433) 119 POINT(2 2) SELECT fid, ST_Area(g) FROM gis_multi_polygon; fid ST_Area(g) @@ -652,11 +652,11 @@ insert into t1 values ('85984',ST_GeomFromText('MULTIPOLYGON(((-115.006363 select object_id, ST_geometrytype(geo), ST_ISSIMPLE(GEO), ST_ASTEXT(ST_centroid(geo)) from t1 where object_id=85998; object_id ST_geometrytype(geo) ST_ISSIMPLE(GEO) ST_ASTEXT(ST_centroid(geo)) -85998 MULTIPOLYGON 1 POINT(115.31877315203187 -36.23747282102153) +85998 MULTIPOLYGON 1 POINT(115.2970604672862 -36.23335610879993) select object_id, ST_geometrytype(geo), ST_ISSIMPLE(GEO), ST_ASTEXT(ST_centroid(geo)) from t1 where object_id=85984; object_id ST_geometrytype(geo) ST_ISSIMPLE(GEO) ST_ASTEXT(ST_centroid(geo)) -85984 MULTIPOLYGON 1 POINT(-114.87787186923313 36.33101763469059) +85984 MULTIPOLYGON 1 POINT(-114.86854472054372 36.34725218253213) drop table t1; create table t1 (fl geometry not null); insert into t1 values (1); diff --git a/mysql-test/suite/innodb_gis/r/alter_spatial_index.result b/mysql-test/suite/innodb_gis/r/alter_spatial_index.result index 4a47f0feda8..a6279bdb196 100644 --- a/mysql-test/suite/innodb_gis/r/alter_spatial_index.result +++ b/mysql-test/suite/innodb_gis/r/alter_spatial_index.result @@ -66,6 +66,7 @@ c1 ST_Astext(c2) ST_Astext(c4) SET @g1 = ST_GeomFromText('LINESTRING( 300 300,400 400)'); SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1); c1 ST_Astext(c2) ST_Astext(c4) +4 POINT(50 50) POLYGON((300 300,400 400,500 500,300 500,300 400,300 300)) UPDATE tab SET C2 = ST_GeomFromText('POINT(100 100)') WHERE MBRContains(tab.c4, @g1); DELETE FROM tab WHERE MBRContains(tab.c4, @g1); @@ -230,7 +231,6 @@ Table Op Msg_type Msg_text test.tab check status OK SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab ORDER BY c1; c1 ST_Astext(c2) ST_Astext(c4) -4 POINT(50 50) POLYGON((300 300,400 400,500 500,300 500,300 400,300 300)) 6 POINT(3 3) POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010)) 7 POINT(60 70) POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010)) 8 POINT(0 0) POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010)) diff --git a/mysql-test/suite/innodb_gis/r/create_spatial_index.result b/mysql-test/suite/innodb_gis/r/create_spatial_index.result index 1d47fd9688c..71d3092c3b7 100644 --- a/mysql-test/suite/innodb_gis/r/create_spatial_index.result +++ b/mysql-test/suite/innodb_gis/r/create_spatial_index.result @@ -76,6 +76,7 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1; c1 ST_Astext(c4) +4 POLYGON((300 300,400 400,500 500,300 500,300 400,300 300)) EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)') WHERE MBRContains(tab.c4, @g1); id select_type table type possible_keys key key_len ref rows Extra @@ -399,6 +400,7 @@ test.tab check status OK SET @g1 = ST_GeomFromText('LINESTRING( 300 300,400 400)'); SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1; c1 ST_Astext(c4) +4 POLYGON((300 300,400 400,500 500,300 500,300 400,300 300)) DELETE FROM tab WHERE MBRContains(tab.c4, @g1); SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1; c1 ST_Astext(c4) @@ -408,7 +410,6 @@ test.tab check status OK SET @g1 = ST_GeomFromText('POLYGON((100 200,1010 1010,1020 1020,500 300,300 200,100 300,100 200))'); SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1; c1 ST_Astext(c4) -4 POLYGON((300 300,400 400,500 500,300 500,300 400,300 300)) 5 POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010)) DELETE FROM tab WHERE ST_Crosses(tab.c4, @g1); SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1; @@ -503,6 +504,7 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1; c1 ST_Astext(c4) +4 POLYGON((300 300,400 400,500 500,300 500,300 400,300 300)) EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)') WHERE MBRContains(tab.c4, @g1); id select_type table type possible_keys key key_len ref rows Extra @@ -919,6 +921,7 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1; c1 ST_Astext(c4) +4 POLYGON((300 300,400 400,500 500,300 500,300 400,300 300)) EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)') WHERE MBRContains(tab.c4, @g1); id select_type table type possible_keys key key_len ref rows Extra diff --git a/mysql-test/suite/innodb_gis/r/gis.result b/mysql-test/suite/innodb_gis/r/gis.result index c0a24a25feb..4af9d1ff77e 100644 --- a/mysql-test/suite/innodb_gis/r/gis.result +++ b/mysql-test/suite/innodb_gis/r/gis.result @@ -319,8 +319,8 @@ fid ST_IsClosed(g) 116 0 SELECT fid, ST_AsText(ST_Centroid(g)) FROM gis_multi_polygon; fid ST_AsText(ST_Centroid(g)) -117 POINT(55.58852775304245 17.426536064113982) -118 POINT(55.58852775304245 17.426536064113982) +117 POINT(57.98031067576927 17.854754130800433) +118 POINT(57.98031067576927 17.854754130800433) 119 POINT(2 2) SELECT fid, ST_Area(g) FROM gis_multi_polygon; fid ST_Area(g) @@ -652,11 +652,11 @@ insert into t1 values ('85984',ST_GeomFromText('MULTIPOLYGON(((-115.006363 select object_id, ST_geometrytype(geo), ST_ISSIMPLE(GEO), ST_ASTEXT(ST_centroid(geo)) from t1 where object_id=85998; object_id ST_geometrytype(geo) ST_ISSIMPLE(GEO) ST_ASTEXT(ST_centroid(geo)) -85998 MULTIPOLYGON 1 POINT(115.31877315203187 -36.23747282102153) +85998 MULTIPOLYGON 1 POINT(115.2970604672862 -36.23335610879993) select object_id, ST_geometrytype(geo), ST_ISSIMPLE(GEO), ST_ASTEXT(ST_centroid(geo)) from t1 where object_id=85984; object_id ST_geometrytype(geo) ST_ISSIMPLE(GEO) ST_ASTEXT(ST_centroid(geo)) -85984 MULTIPOLYGON 1 POINT(-114.87787186923313 36.33101763469059) +85984 MULTIPOLYGON 1 POINT(-114.86854472054372 36.34725218253213) drop table t1; create table t1 (fl geometry not null); insert into t1 values (1); diff --git a/mysql-test/suite/innodb_gis/r/rt_precise.result b/mysql-test/suite/innodb_gis/r/rt_precise.result index e52f2ab5aa3..9e2c6adc2d9 100644 --- a/mysql-test/suite/innodb_gis/r/rt_precise.result +++ b/mysql-test/suite/innodb_gis/r/rt_precise.result @@ -55,5 +55,8 @@ count(*) SELECT fid, ST_AsText(g) FROM t1 WHERE ST_Within(g, ST_GeomFromText('Polygon((40 40,60 40,60 60,40 40))')) ORDER BY fid; fid ST_AsText(g) +45 LINESTRING(51 51,60 60) +46 LINESTRING(51 41,60 50) +56 LINESTRING(41 41,50 50) DROP TABLE t1; End of 5.5 tests. diff --git a/mysql-test/suite/innodb_gis/r/rtree.result b/mysql-test/suite/innodb_gis/r/rtree.result index f59949c79e9..d6604314909 100644 --- a/mysql-test/suite/innodb_gis/r/rtree.result +++ b/mysql-test/suite/innodb_gis/r/rtree.result @@ -10,9 +10,12 @@ test.t1 analyze status OK set @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))'); explain select ST_astext(t1.g) from t1 where MBRWithin(t1.g, @g1); id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 range g g 34 NULL 1 Using where +1 SIMPLE t1 ALL g NULL NULL NULL 5 Using where select ST_astext(t1.g) from t1 where MBRWithin(t1.g, @g1); ST_astext(t1.g) +POINT(1 1) +POINT(1.5 1.5) +POINT(3 3) set @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))'); delete from t1 where MBRWithin(t1.g, @g1); check table t1; @@ -20,9 +23,6 @@ Table Op Msg_type Msg_text test.t1 check status OK select ST_astext(t1.g) from t1; ST_astext(t1.g) -POINT(1 1) -POINT(1.5 1.5) -POINT(3 3) POINT(3.1 3.1) POINT(5 5) set @g1 = ST_GeomFromText('Polygon((5 5,5 5,5 5,5 5,5 5))'); @@ -32,9 +32,6 @@ Table Op Msg_type Msg_text test.t1 check status OK select ST_astext(t1.g) from t1; ST_astext(t1.g) -POINT(1 1) -POINT(1.5 1.5) -POINT(3 3) POINT(3.1 3.1) POINT(2 2) show indexes from t1; @@ -157,9 +154,12 @@ test.t1 analyze status OK set @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))'); explain select ST_astext(t1.g) from t1 where MBRWithin(t1.g, @g1); id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 range g g 34 NULL 1 Using where +1 SIMPLE t1 ALL g NULL NULL NULL 5 Using where select ST_astext(t1.g) from t1 where MBRWithin(t1.g, @g1); ST_astext(t1.g) +POINT(1 1) +POINT(1.5 1.5) +POINT(3 3) set @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))'); delete from t1 where MBRWithin(t1.g, @g1); check table t1; @@ -167,9 +167,6 @@ Table Op Msg_type Msg_text test.t1 check status OK select ST_astext(t1.g) from t1; ST_astext(t1.g) -POINT(1 1) -POINT(1.5 1.5) -POINT(3 3) POINT(3.1 3.1) POINT(5 5) set @g1 = ST_GeomFromText('Polygon((5 5,5 5,5 5,5 5,5 5))'); @@ -179,9 +176,6 @@ Table Op Msg_type Msg_text test.t1 check status OK select ST_astext(t1.g) from t1; ST_astext(t1.g) -POINT(1 1) -POINT(1.5 1.5) -POINT(3 3) POINT(3.1 3.1) POINT(2 2) show indexes from t1; diff --git a/mysql-test/suite/innodb_gis/t/1.test b/mysql-test/suite/innodb_gis/t/1.test index 110a8acc18f..256cd1ab0ad 100644 --- a/mysql-test/suite/innodb_gis/t/1.test +++ b/mysql-test/suite/innodb_gis/t/1.test @@ -374,13 +374,13 @@ insert into t1 values ('85984',ST_GeomFromText('MULTIPOLYGON(((-115.006363 # Expected result is 115.31877315203187, but IA64 returns 115.31877315203188 # due to fused multiply-add instructions. ---replace_result 115.31877315203188 115.31877315203187 +--replace_result 115.29706047613604 115.2970604672862 36.23335611157958 36.23335610879993 select object_id, ST_geometrytype(geo), ST_ISSIMPLE(GEO), ST_ASTEXT(ST_centroid(geo)) from t1 where object_id=85998; # Expected result is 36.3310176346905, but IA64 returns 36.3310176346904 # due to fused multiply-add instructions. ---replace_result 36.3310176346904 36.3310176346905 -114.87787186923326 -114.87787186923313 36.33101763469053 36.33101763469059 36.33101763469043 36.33101763469059 +--replace_result 114.86854470090232 114.86854472054372 36.34725217627852 36.34725218253213 select object_id, ST_geometrytype(geo), ST_ISSIMPLE(GEO), ST_ASTEXT(ST_centroid(geo)) from t1 where object_id=85984; diff --git a/mysql-test/suite/innodb_gis/t/gis.test b/mysql-test/suite/innodb_gis/t/gis.test index f28809f393c..489934e957e 100644 --- a/mysql-test/suite/innodb_gis/t/gis.test +++ b/mysql-test/suite/innodb_gis/t/gis.test @@ -368,13 +368,13 @@ insert into t1 values ('85984',ST_GeomFromText('MULTIPOLYGON(((-115.006363 # Expected result is 115.31877315203187, but IA64 returns 115.31877315203188 # due to fused multiply-add instructions. ---replace_result 115.31877315203188 115.31877315203187 +--replace_result 115.29706047613604 115.2970604672862 36.23335611157958 36.23335610879993 select object_id, ST_geometrytype(geo), ST_ISSIMPLE(GEO), ST_ASTEXT(ST_centroid(geo)) from t1 where object_id=85998; # Expected result is 36.3310176346905, but IA64 returns 36.3310176346904 # due to fused multiply-add instructions. ---replace_result 36.3310176346904 36.3310176346905 -114.87787186923326 -114.87787186923313 36.33101763469053 36.33101763469059 36.33101763469043 36.33101763469059 +--replace_result 114.86854470090232 114.86854472054372 36.34725217627852 36.34725218253213 select object_id, ST_geometrytype(geo), ST_ISSIMPLE(GEO), ST_ASTEXT(ST_centroid(geo)) from t1 where object_id=85984; diff --git a/mysql-test/suite/innodb_zip/include/have_innodb_zip.inc b/mysql-test/suite/innodb_zip/include/have_innodb_zip.inc deleted file mode 100644 index 6af83d51304..00000000000 --- a/mysql-test/suite/innodb_zip/include/have_innodb_zip.inc +++ /dev/null @@ -1,4 +0,0 @@ -if (`SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE LOWER(variable_name) = 'innodb_page_size' AND variable_value <= 16384`) -{ - --skip Test with InnoDB zip requires page size not greater than 16k. -} diff --git a/mysql-test/suite/innodb_zip/r/bug36172.result b/mysql-test/suite/innodb_zip/r/bug36172.result index 23c5b0cc2f7..727f100d064 100644 --- a/mysql-test/suite/innodb_zip/r/bug36172.result +++ b/mysql-test/suite/innodb_zip/r/bug36172.result @@ -1 +1,4 @@ -SET default_storage_engine=InnoDB; +set @file_per_table=@@global.innodb_file_per_table; +SET GLOBAL innodb_file_per_table=on; +SET sql_mode = 'NO_ENGINE_SUBSTITUTION'; +SET GLOBAL innodb_file_per_table=@file_per_table; diff --git a/mysql-test/suite/innodb_zip/r/cmp_drop_table.result b/mysql-test/suite/innodb_zip/r/cmp_drop_table.result index c1743cac2e1..e1f63268d0b 100644 --- a/mysql-test/suite/innodb_zip/r/cmp_drop_table.result +++ b/mysql-test/suite/innodb_zip/r/cmp_drop_table.result @@ -1,12 +1,12 @@ set global innodb_file_per_table=on; -create table t1(a text) engine=innodb key_block_size=8; +create table t1(a text) engine=innodb key_block_size=4; SELECT page_size FROM information_schema.innodb_cmpmem WHERE pages_used > 0; page_size -8192 +4096 drop table t1; SELECT page_size FROM information_schema.innodb_cmpmem WHERE pages_used > 0; page_size -8192 +4096 create table t2(a text) engine=innodb; SELECT page_size FROM information_schema.innodb_cmpmem WHERE pages_used > 0; page_size diff --git a/mysql-test/suite/innodb_zip/r/innochecksum_2.result b/mysql-test/suite/innodb_zip/r/innochecksum_2.result index 78d8a1cbf90..582bb42f0cb 100644 --- a/mysql-test/suite/innodb_zip/r/innochecksum_2.result +++ b/mysql-test/suite/innodb_zip/r/innochecksum_2.result @@ -31,6 +31,7 @@ allow-mismatches 0 write crc32 page-type-summary FALSE page-type-dump MYSQLTEST_VARDIR/tmp/dump.txt +per-page-details FALSE log (No default value) leaf FALSE merge 0 @@ -41,7 +42,7 @@ innochecksum Ver #.#.# Copyright (c) YEAR, YEAR , Oracle, MariaDB Corporation Ab and others. InnoDB offline file checksum utility. -Usage: innochecksum [-c] [-s ] [-e ] [-p ] [-v] [-a ] [-n] [-C ] [-w ] [-S] [-D ] [-l ] [-e] +Usage: innochecksum [-c] [-s ] [-e ] [-p ] [-i] [-v] [-a ] [-n] [-C ] [-w ] [-S] [-D ] [-l ] [-l] [-m ] -?, --help Displays this help and exits. -I, --info Synonym for --help. -V, --version Displays version information and exits. @@ -62,8 +63,10 @@ Usage: innochecksum [-c] [-s ] [-e ] [-p ] [-v] [-a Display a count of each page type in a tablespace. -D, --page-type-dump=name Dump the page type info for each page in a tablespace. + -i, --per-page-details + Print out per-page detail information. -l, --log=name log output. - -e, --leaf Examine leaf index pages + -f, --leaf Examine leaf index pages -m, --merge=# leaf page count if merge given number of consecutive pages @@ -81,6 +84,7 @@ allow-mismatches 0 write crc32 page-type-summary FALSE page-type-dump (No default value) +per-page-details FALSE log (No default value) leaf FALSE merge 0 diff --git a/mysql-test/suite/innodb_zip/r/innochecksum_3.result b/mysql-test/suite/innodb_zip/r/innochecksum_3.result index 800556c4ff3..aaab68b3df9 100644 --- a/mysql-test/suite/innodb_zip/r/innochecksum_3.result +++ b/mysql-test/suite/innodb_zip/r/innochecksum_3.result @@ -1,5 +1,6 @@ # Set the environmental variables call mtr.add_suppression("InnoDB: Unable to read tablespace .* page no .* into the buffer pool after 100 attempts"); +call mtr.add_suppression("InnoDB: innodb_checksum_algorithm is set to.*"); [1]: Further Test are for rewrite checksum (innodb|crc32|none) for all ibd file & start the server. CREATE TABLE tab1 (pk INTEGER NOT NULL PRIMARY KEY, linestring_key GEOMETRY NOT NULL, @@ -105,6 +106,7 @@ File::tab#.ibd # Page compressed page # Page compressed encrypted page # Other type of page + =============================================== Additional information: Undo page type: # insert, # update, # other @@ -139,6 +141,7 @@ File::tab#.ibd # Page compressed page # Page compressed encrypted page # Other type of page + =============================================== Additional information: Undo page type: # insert, # update, # other @@ -160,14 +163,14 @@ Filename::tab#.ibd ============================================================================== PAGE_NO | PAGE_TYPE | EXTRA INFO ============================================================================== -#:: # | File Space Header | - -#:: # | Insert Buffer Bitmap | - -#:: # | Inode page | - -#:: # | Index page | index id=#, page level=# leaf #, No. of records=#, garbage=#, n_recs=#, - -#:: # | Index page | index id=#, page level=# leaf #, No. of records=#, garbage=#, n_recs=#, - -#:: # | Index page | index id=#, page level=# leaf #, No. of records=#, garbage=#, n_recs=#, - -#:: # | Index page | index id=#, page level=# leaf #, No. of records=#, garbage=#, n_recs=#, - -#:: # | Freshly allocated page | - +#::# | File Space Header | - +#::# | Insert Buffer Bitmap | - +#::# | Inode page | - +#::# | Index page | index id=#, page level=#, No. of records=#, garbage=#, - +#::# | Index page | index id=#, page level=#, No. of records=#, garbage=#, - +#::# | Index page | index id=#, page level=#, No. of records=#, garbage=#, - +#::# | Index page | index id=#, page level=#, No. of records=#, garbage=#, - +#::# | Freshly allocated page | - # Variables used by page type dump for ibdata1 Variables (--variable-name=value) @@ -184,6 +187,7 @@ allow-mismatches 0 write crc32 page-type-summary FALSE page-type-dump MYSQLTEST_VARDIR/tmp/dump.txt +per-page-details FALSE log (No default value) leaf FALSE merge 0 @@ -194,14 +198,14 @@ Filename::tab#.ibd ============================================================================== PAGE_NO | PAGE_TYPE | EXTRA INFO ============================================================================== -#:: # | File Space Header | - -#:: # | Insert Buffer Bitmap | - -#:: # | Inode page | - -#:: # | Index page | index id=#, page level=# leaf #, No. of records=#, garbage=#, n_recs=#, - -#:: # | Index page | index id=#, page level=# leaf #, No. of records=#, garbage=#, n_recs=#, - -#:: # | Index page | index id=#, page level=# leaf #, No. of records=#, garbage=#, n_recs=#, - -#:: # | Index page | index id=#, page level=# leaf #, No. of records=#, garbage=#, n_recs=#, - -#:: # | Freshly allocated page | - +#::# | File Space Header | - +#::# | Insert Buffer Bitmap | - +#::# | Inode page | - +#::# | Index page | index id=#, page level=#, No. of records=#, garbage=#, - +#::# | Index page | index id=#, page level=#, No. of records=#, garbage=#, - +#::# | Index page | index id=#, page level=#, No. of records=#, garbage=#, - +#::# | Index page | index id=#, page level=#, No. of records=#, garbage=#, - +#::# | Freshly allocated page | - [6]: check the valid lower bound values for option # allow-mismatches,page,start-page,end-page [9]: check the both short and long options "page" and "start-page" when diff --git a/mysql-test/suite/innodb_zip/r/innodb_bug36169.result b/mysql-test/suite/innodb_zip/r/innodb_bug36169.result deleted file mode 100644 index bae08bd54a2..00000000000 --- a/mysql-test/suite/innodb_zip/r/innodb_bug36169.result +++ /dev/null @@ -1 +0,0 @@ -call mtr.add_suppression("Cannot add field .* in table .* because after adding it, the row size is .* which is greater than maximum allowed size .* for a record on index leaf page."); diff --git a/mysql-test/suite/innodb_zip/r/innodb_bug36172.result b/mysql-test/suite/innodb_zip/r/innodb_bug36172.result deleted file mode 100644 index 195775f74c8..00000000000 --- a/mysql-test/suite/innodb_zip/r/innodb_bug36172.result +++ /dev/null @@ -1 +0,0 @@ -SET storage_engine=InnoDB; diff --git a/mysql-test/suite/innodb_zip/r/innodb_bug52745.result b/mysql-test/suite/innodb_zip/r/innodb_bug52745.result deleted file mode 100644 index 1556c313994..00000000000 --- a/mysql-test/suite/innodb_zip/r/innodb_bug52745.result +++ /dev/null @@ -1,127 +0,0 @@ -SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR -CREATE TABLE bug52745 ( -a2 int(10) unsigned DEFAULT NULL, -col37 time DEFAULT NULL, -col38 char(229) CHARACTER SET utf8 DEFAULT NULL, -col39 text, -col40 timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -col41 int(10) unsigned DEFAULT NULL, -col42 varchar(248) CHARACTER SET utf8 DEFAULT NULL, -col43 smallint(5) unsigned zerofill DEFAULT NULL, -col44 varchar(150) CHARACTER SET utf8 DEFAULT NULL, -col45 float unsigned zerofill DEFAULT NULL, -col46 binary(1) DEFAULT NULL, -col47 tinyint(4) DEFAULT NULL, -col48 tinyint(1) DEFAULT NULL, -col49 timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', -col50 binary(1) DEFAULT NULL, -col51 double unsigned zerofill DEFAULT NULL, -col52 int(10) unsigned DEFAULT NULL, -col53 time DEFAULT NULL, -col54 double unsigned DEFAULT NULL, -col55 time DEFAULT NULL, -col56 mediumtext CHARACTER SET latin2, -col57 blob, -col58 decimal(52,16) unsigned zerofill NOT NULL DEFAULT '000000000000000000000000000000000000.0000000000000000', -col59 binary(1) DEFAULT NULL, -col60 longblob, -col61 time DEFAULT NULL, -col62 longtext CHARACTER SET utf8 COLLATE utf8_persian_ci, -col63 timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', -col64 int(10) unsigned DEFAULT NULL, -col65 date DEFAULT NULL, -col66 timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', -col67 binary(1) DEFAULT NULL, -col68 tinyblob, -col69 date DEFAULT NULL, -col70 tinyint(3) unsigned zerofill DEFAULT NULL, -col71 varchar(44) CHARACTER SET utf8 DEFAULT NULL, -col72 datetime DEFAULT NULL, -col73 smallint(5) unsigned zerofill DEFAULT NULL, -col74 longblob, -col75 bit(34) DEFAULT NULL, -col76 float unsigned zerofill DEFAULT NULL, -col77 year(2) DEFAULT NULL, -col78 tinyint(3) unsigned DEFAULT NULL, -col79 set('msfheowh','tbpxbgf','by','wahnrjw','myqfasxz','rsokyumrt') CHARACTER SET latin2 DEFAULT NULL, -col80 datetime DEFAULT NULL, -col81 smallint(6) DEFAULT NULL, -col82 enum('xtaurnqfqz','rifrse','kuzwpbvb','niisabk','zxavro','rbvasv','','uulrfaove','','') DEFAULT NULL, -col83 bigint(20) unsigned zerofill DEFAULT NULL, -col84 float unsigned zerofill DEFAULT NULL, -col85 double DEFAULT NULL, -col86 enum('ylannv','','vlkhycqc','snke','cxifustp','xiaxaswzp','oxl') CHARACTER SET latin1 COLLATE latin1_german2_ci DEFAULT NULL, -col87 varbinary(221) DEFAULT NULL, -col88 double unsigned DEFAULT NULL, -col89 float unsigned zerofill DEFAULT NULL, -col90 tinyblob -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; -Warnings: -Note 1287 'YEAR(2)' is deprecated and will be removed in a future release. Please use YEAR(4) instead -Note 1291 Column 'col82' has duplicated value '' in ENUM -Note 1291 Column 'col82' has duplicated value '' in ENUM -INSERT IGNORE INTO bug52745 SET -col40='0000-00-00 00:00:00', -col51=16547, -col53='7711484', -col54=-28604, -col55='7112612', -col56='wakefulness\'', -col57=repeat('absorbefacient\'',106), -col58=11027, -col59='AM09gW7', -col60=repeat('Noelani\'',16), -col61='2520576', -col62='substitutiv', -col63='19950106155112', -col64=-12038, -col65='86238806', -col66='19600719080256', -col68=repeat('Sagittarius\'',54), -col69='38943902', -col70=1232, -col71='Elora\'', -col74=repeat('zipp',11), -col75='0', -col76=23254, -col78=13247, -col79='56219', -col80='20500609035724', -col81=11632, -col82=7, -col84=-23863, -col85=6341, -col87='HZdkf.4 s7t,5Rmq 8so fmr,ruGLUG25TrtI.yQ 2SuHq0ML7rw7.4 b2yf2E5TJxOtBBZImezDnzpj,uPYfznnEUDN1e9aQoO 2DsplB7TFWy oQJ br HLF :F,eQ p4i1oWsr lL3PG,hjCz6hYqN h1QTjLCjrv:QCdSzpYBibJAtZCxLOk3l6Blsh.W', -col88=16894, -col89=6161, -col90=repeat('gale',48); -Warnings: -Warning 1265 Data truncated for column 'col53' at row 1 -Warning 1264 Out of range value for column 'col54' at row 1 -Warning 1265 Data truncated for column 'col59' at row 1 -Warning 1265 Data truncated for column 'col61' at row 1 -Warning 1264 Out of range value for column 'col64' at row 1 -Warning 1265 Data truncated for column 'col65' at row 1 -Warning 1264 Out of range value for column 'col66' at row 1 -Warning 1265 Data truncated for column 'col68' at row 1 -Warning 1265 Data truncated for column 'col69' at row 1 -Warning 1264 Out of range value for column 'col70' at row 1 -Warning 1264 Out of range value for column 'col78' at row 1 -Warning 1265 Data truncated for column 'col79' at row 1 -Warning 1264 Out of range value for column 'col84' at row 1 -SHOW WARNINGS; -Level Code Message -Warning 1265 Data truncated for column 'col53' at row 1 -Warning 1264 Out of range value for column 'col54' at row 1 -Warning 1265 Data truncated for column 'col59' at row 1 -Warning 1265 Data truncated for column 'col61' at row 1 -Warning 1264 Out of range value for column 'col64' at row 1 -Warning 1265 Data truncated for column 'col65' at row 1 -Warning 1264 Out of range value for column 'col66' at row 1 -Warning 1265 Data truncated for column 'col68' at row 1 -Warning 1265 Data truncated for column 'col69' at row 1 -Warning 1264 Out of range value for column 'col70' at row 1 -Warning 1264 Out of range value for column 'col78' at row 1 -Warning 1265 Data truncated for column 'col79' at row 1 -Warning 1264 Out of range value for column 'col84' at row 1 -DROP TABLE bug52745; diff --git a/mysql-test/suite/innodb_zip/r/innodb_bug53591.result b/mysql-test/suite/innodb_zip/r/innodb_bug53591.result deleted file mode 100644 index 0222ad64fa2..00000000000 --- a/mysql-test/suite/innodb_zip/r/innodb_bug53591.result +++ /dev/null @@ -1,11 +0,0 @@ -SET GLOBAL innodb_strict_mode=on; -set old_alter_table=0; -CREATE TABLE bug53591(a text charset utf8 not null) -ENGINE=InnoDB KEY_BLOCK_SIZE=1; -ALTER TABLE bug53591 ADD PRIMARY KEY(a(220)); -ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is {checked_valid}. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -SHOW WARNINGS; -Level Code Message -Error 1118 Row size too large. The maximum row size for the used table type, not counting BLOBs, is {checked_valid}. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -DROP TABLE bug53591; -SET GLOBAL innodb_strict_mode=DEFAULT; diff --git a/mysql-test/suite/innodb_zip/r/innodb_bug56680.result b/mysql-test/suite/innodb_zip/r/innodb_bug56680.result deleted file mode 100644 index c509c5bad21..00000000000 --- a/mysql-test/suite/innodb_zip/r/innodb_bug56680.result +++ /dev/null @@ -1,119 +0,0 @@ -SET GLOBAL tx_isolation='REPEATABLE-READ'; -CREATE TABLE bug56680( -a INT AUTO_INCREMENT PRIMARY KEY, -b CHAR(1), -c INT, -INDEX(b)) -ENGINE=InnoDB; -INSERT INTO bug56680 VALUES(0,'x',1); -BEGIN; -SELECT b FROM bug56680; -b -x -connect con1,localhost,root,,; -connection con1; -BEGIN; -UPDATE bug56680 SET b='X'; -connection default; -SELECT b FROM bug56680; -b -x -SELECT * FROM bug56680; -a b c -1 x 1 -connection con1; -ROLLBACK; -disconnect con1; -connection default; -SELECT b FROM bug56680; -b -x -SET GLOBAL tx_isolation='READ-UNCOMMITTED'; -INSERT INTO bug56680 SELECT 0,b,c FROM bug56680; -INSERT INTO bug56680 SELECT 0,b,c FROM bug56680; -INSERT INTO bug56680 SELECT 0,b,c FROM bug56680; -INSERT INTO bug56680 SELECT 0,b,c FROM bug56680; -INSERT INTO bug56680 SELECT 0,b,c FROM bug56680; -INSERT INTO bug56680 SELECT 0,b,c FROM bug56680; -INSERT INTO bug56680 SELECT 0,b,c FROM bug56680; -INSERT INTO bug56680 SELECT 0,b,c FROM bug56680; -INSERT INTO bug56680 SELECT 0,b,c FROM bug56680; -INSERT INTO bug56680 SELECT 0,b,c FROM bug56680; -INSERT INTO bug56680 SELECT 0,b,c FROM bug56680; -BEGIN; -SELECT b FROM bug56680 LIMIT 2; -b -x -x -connect con1,localhost,root,,; -connection con1; -BEGIN; -DELETE FROM bug56680 WHERE a=1; -INSERT INTO bug56680 VALUES(1,'X',1); -SELECT b FROM bug56680 LIMIT 3; -b -X -x -x -connection default; -SELECT b FROM bug56680 LIMIT 2; -b -x -x -CHECK TABLE bug56680; -Table Op Msg_type Msg_text -test.bug56680 check status OK -connection con1; -ROLLBACK; -SELECT b FROM bug56680 LIMIT 2; -b -x -x -CHECK TABLE bug56680; -Table Op Msg_type Msg_text -test.bug56680 check status OK -connection default; -disconnect con1; -SELECT b FROM bug56680 LIMIT 2; -b -x -x -CREATE TABLE bug56680_2( -a INT AUTO_INCREMENT PRIMARY KEY, -b VARCHAR(2) CHARSET latin1 COLLATE latin1_german2_ci, -c INT, -INDEX(b)) -ENGINE=InnoDB; -INSERT INTO bug56680_2 SELECT 0,_latin1 0xdf,c FROM bug56680; -BEGIN; -SELECT HEX(b) FROM bug56680_2 LIMIT 2; -HEX(b) -DF -DF -DELETE FROM bug56680_2 WHERE a=1; -INSERT INTO bug56680_2 VALUES(1,'SS',1); -SELECT HEX(b) FROM bug56680_2 LIMIT 3; -HEX(b) -5353 -DF -DF -CHECK TABLE bug56680_2; -Table Op Msg_type Msg_text -test.bug56680_2 check status OK -ALTER TABLE bug56680_2 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; -SELECT HEX(b) FROM bug56680_2 LIMIT 2; -HEX(b) -5353 -DF -DELETE FROM bug56680_2 WHERE a=1; -INSERT INTO bug56680_2 VALUES(1,_latin1 0xdf,1); -SELECT HEX(b) FROM bug56680_2 LIMIT 3; -HEX(b) -DF -DF -DF -CHECK TABLE bug56680_2; -Table Op Msg_type Msg_text -test.bug56680_2 check status OK -DROP TABLE bug56680_2; -DROP TABLE bug56680; diff --git a/mysql-test/suite/innodb_zip/r/innodb_cmp_drop_table.result b/mysql-test/suite/innodb_zip/r/innodb_cmp_drop_table.result deleted file mode 100644 index 11e90b9e7d6..00000000000 --- a/mysql-test/suite/innodb_zip/r/innodb_cmp_drop_table.result +++ /dev/null @@ -1,18 +0,0 @@ -set global innodb_file_per_table=on; -set global innodb_file_format=`1`; -Warnings: -Warning 131 Using innodb_file_format is deprecated and the parameter may be removed in future releases. See http://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html -create table t1(a text) engine=innodb key_block_size=8; -SELECT page_size FROM information_schema.innodb_cmpmem WHERE pages_used > 0; -page_size -8192 -drop table t1; -SELECT page_size FROM information_schema.innodb_cmpmem WHERE pages_used > 0; -page_size -8192 -create table t2(a text) engine=innodb; -SELECT page_size FROM information_schema.innodb_cmpmem WHERE pages_used > 0; -page_size -drop table t2; -Warnings: -Warning 131 Using innodb_file_format is deprecated and the parameter may be removed in future releases. See http://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html diff --git a/mysql-test/suite/innodb_zip/r/innodb_index_large_prefix.result b/mysql-test/suite/innodb_zip/r/innodb_index_large_prefix.result deleted file mode 100644 index 5be18b84065..00000000000 --- a/mysql-test/suite/innodb_zip/r/innodb_index_large_prefix.result +++ /dev/null @@ -1,538 +0,0 @@ -SET default_storage_engine=InnoDB; -call mtr.add_suppression("Cannot add field .* in table .* because after adding it, the row size is .* which is greater than maximum allowed size (.*) for a record on index leaf page."); -set global innodb_large_prefix=1; -Warnings: -Warning 131 Using innodb_large_prefix is deprecated and the parameter may be removed in future releases. See http://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html -set global innodb_strict_mode=1; -### Test 1 ### -create table worklog5743(a TEXT not null, primary key (a(1000))) ROW_FORMAT=DYNAMIC; -show warnings; -Level Code Message -insert into worklog5743 values(repeat("a", 20000)); -update worklog5743 set a = (repeat("b", 16000)); -create index idx on worklog5743(a(2000)); -show warnings; -Level Code Message -begin; -update worklog5743 set a = (repeat("x", 17000)); -select @@session.tx_isolation; -@@session.tx_isolation -REPEATABLE-READ -connect con1,localhost,root,,; -select a = repeat("x", 17000) from worklog5743; -a = repeat("x", 17000) -0 -select a = repeat("b", 16000) from worklog5743; -a = repeat("b", 16000) -1 -connect con2,localhost,root,,; -SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -select @@session.tx_isolation; -@@session.tx_isolation -READ-UNCOMMITTED -select a = repeat("x", 17000) from worklog5743; -a = repeat("x", 17000) -1 -connection default; -rollback; -drop table worklog5743; -### Test 2 ### -create table worklog5743(a1 int, a2 TEXT not null) ROW_FORMAT=DYNAMIC; -show warnings; -Level Code Message -create index idx on worklog5743(a1, a2(2000)); -show warnings; -Level Code Message -insert into worklog5743 values(9, repeat("a", 10000)); -begin; -update worklog5743 set a1 = 1000; -connection con1; -select @@session.tx_isolation; -@@session.tx_isolation -REPEATABLE-READ -explain select a1, a2 = repeat("a", 10000) from worklog5743 where a1 = 9; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE worklog5743 ref idx idx 5 const 1 -select a1, a2 = repeat("a", 10000) from worklog5743 where a1 = 9; -a1 a2 = repeat("a", 10000) -9 1 -connection con2; -SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -select @@session.tx_isolation; -@@session.tx_isolation -READ-UNCOMMITTED -select a1, a2 = repeat("a", 10000) from worklog5743 where a1 = 9; -a1 a2 = repeat("a", 10000) -connection default; -rollback; -drop table worklog5743; -### Test 3 ### -create table worklog5743(a1 int, a2 TEXT not null) ROW_FORMAT=DYNAMIC; -create index idx on worklog5743(a1, a2(50)); -insert into worklog5743 values(9, repeat("a", 10000)); -begin; -update worklog5743 set a1 = 1000; -connection con1; -select @@session.tx_isolation; -@@session.tx_isolation -REPEATABLE-READ -explain select a1, a2 = repeat("a", 10000) from worklog5743 where a1 = 9; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE worklog5743 ref idx idx 5 const 1 -select a1, a2 = repeat("a", 10000) from worklog5743 where a1 = 9; -a1 a2 = repeat("a", 10000) -9 1 -connection con2; -SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -select @@session.tx_isolation; -@@session.tx_isolation -READ-UNCOMMITTED -select a1, a2 = repeat("a", 10000) from worklog5743 where a1 = 9; -a1 a2 = repeat("a", 10000) -connection default; -rollback; -drop table worklog5743; -### Test 4 ### -create table worklog5743_1(a1 int, a2 TEXT not null) KEY_BLOCK_SIZE=1; -create table worklog5743_2(a1 int, a2 TEXT not null) KEY_BLOCK_SIZE=2; -create table worklog5743_4(a1 int, a2 TEXT not null) KEY_BLOCK_SIZE=4; -create table worklog5743_8(a1 int, a2 TEXT, a3 TEXT) KEY_BLOCK_SIZE=8; -create table worklog5743_16(a1 int, a2 TEXT, a3 TEXT) KEY_BLOCK_SIZE=16; -set sql_mode=''; -set global innodb_large_prefix=0; -Warnings: -Warning 131 Using innodb_large_prefix is deprecated and the parameter may be removed in future releases. See http://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html -create index idx1 on worklog5743_1(a2(4000)); -ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -show warnings; -Level Code Message -Note 1071 Specified key was too long; max key length is 767 bytes -Error 1118 Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -set global innodb_large_prefix=1; -Warnings: -Warning 131 Using innodb_large_prefix is deprecated and the parameter may be removed in future releases. See http://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html -create index idx2 on worklog5743_1(a2(4000)); -ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -show warnings; -Level Code Message -Note 1071 Specified key was too long; max key length is 3072 bytes -Error 1118 Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -create index idx3 on worklog5743_1(a2(436)); -ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -show warnings; -Level Code Message -Error 1118 Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -create index idx4 on worklog5743_1(a2(434)); -show warnings; -Level Code Message -create index idx5 on worklog5743_1(a1, a2(430)); -ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -show warnings; -Level Code Message -Error 1118 Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -create index idx6 on worklog5743_1(a1, a2(428)); -show warnings; -Level Code Message -set global innodb_large_prefix=0; -Warnings: -Warning 131 Using innodb_large_prefix is deprecated and the parameter may be removed in future releases. See http://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html -create index idx1 on worklog5743_2(a2(4000)); -Warnings: -Note 1071 Specified key was too long; max key length is 767 bytes -show warnings; -Level Code Message -Note 1071 Specified key was too long; max key length is 767 bytes -set global innodb_large_prefix=1; -Warnings: -Warning 131 Using innodb_large_prefix is deprecated and the parameter may be removed in future releases. See http://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html -create index idx2 on worklog5743_2(a2(4000)); -ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -show warnings; -Level Code Message -Note 1071 Specified key was too long; max key length is 3072 bytes -Error 1118 Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -create index idx3 on worklog5743_2(a2(948)); -ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -show warnings; -Level Code Message -Error 1118 Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -create index idx4 on worklog5743_2(a2(946)); -show warnings; -Level Code Message -create index idx5 on worklog5743_2(a1, a2(942)); -ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -show warnings; -Level Code Message -Error 1118 Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -create index idx6 on worklog5743_2(a1, a2(940)); -show warnings; -Level Code Message -set global innodb_large_prefix=0; -Warnings: -Warning 131 Using innodb_large_prefix is deprecated and the parameter may be removed in future releases. See http://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html -create index idx1 on worklog5743_4(a2(4000)); -Warnings: -Note 1071 Specified key was too long; max key length is 767 bytes -show warnings; -Level Code Message -Note 1071 Specified key was too long; max key length is 767 bytes -set global innodb_large_prefix=1; -Warnings: -Warning 131 Using innodb_large_prefix is deprecated and the parameter may be removed in future releases. See http://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html -create index idx2 on worklog5743_4(a2(4000)); -ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -show warnings; -Level Code Message -Note 1071 Specified key was too long; max key length is 3072 bytes -Error 1118 Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -create index idx3 on worklog5743_4(a2(1972)); -ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -show warnings; -Level Code Message -Error 1118 Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -create index idx4 on worklog5743_4(a2(1970)); -show warnings; -Level Code Message -create index idx5 on worklog5743_4(a1, a2(1966)); -ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -show warnings; -Level Code Message -Error 1118 Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -create index idx6 on worklog5743_4(a1, a2(1964)); -show warnings; -Level Code Message -set global innodb_large_prefix=0; -Warnings: -Warning 131 Using innodb_large_prefix is deprecated and the parameter may be removed in future releases. See http://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html -create index idx1 on worklog5743_8(a2(1000)); -Warnings: -Note 1071 Specified key was too long; max key length is 767 bytes -show warnings; -Level Code Message -Note 1071 Specified key was too long; max key length is 767 bytes -set global innodb_large_prefix=1; -Warnings: -Warning 131 Using innodb_large_prefix is deprecated and the parameter may be removed in future releases. See http://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html -create index idx2 on worklog5743_8(a2(3073)); -Warnings: -Note 1071 Specified key was too long; max key length is 3072 bytes -show warnings; -Level Code Message -Note 1071 Specified key was too long; max key length is 3072 bytes -create index idx3 on worklog5743_8(a2(3072)); -Warnings: -Note 1831 Duplicate index `idx3`. This is deprecated and will be disallowed in a future release -show warnings; -Level Code Message -Note 1831 Duplicate index `idx3`. This is deprecated and will be disallowed in a future release -create index idx4 on worklog5743_8(a1, a2(3069)); -ERROR 42000: Specified key was too long; max key length is 3072 bytes -show warnings; -Level Code Message -Error 1071 Specified key was too long; max key length is 3072 bytes -create index idx5 on worklog5743_8(a1, a2(3068)); -show warnings; -Level Code Message -create index idx6 on worklog5743_8(a1, a2(2000), a3(1069)); -ERROR 42000: Specified key was too long; max key length is 3072 bytes -show warnings; -Level Code Message -Error 1071 Specified key was too long; max key length is 3072 bytes -create index idx7 on worklog5743_8(a1, a2(2000), a3(1068)); -show warnings; -Level Code Message -set global innodb_large_prefix=0; -Warnings: -Warning 131 Using innodb_large_prefix is deprecated and the parameter may be removed in future releases. See http://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html -create index idx1 on worklog5743_16(a2(1000)); -Warnings: -Note 1071 Specified key was too long; max key length is 767 bytes -show warnings; -Level Code Message -Note 1071 Specified key was too long; max key length is 767 bytes -set global innodb_large_prefix=1; -Warnings: -Warning 131 Using innodb_large_prefix is deprecated and the parameter may be removed in future releases. See http://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html -create index idx2 on worklog5743_16(a2(3073)); -Warnings: -Note 1071 Specified key was too long; max key length is 3072 bytes -show warnings; -Level Code Message -Note 1071 Specified key was too long; max key length is 3072 bytes -create index idx3 on worklog5743_16(a2(3072)); -Warnings: -Note 1831 Duplicate index `idx3`. This is deprecated and will be disallowed in a future release -show warnings; -Level Code Message -Note 1831 Duplicate index `idx3`. This is deprecated and will be disallowed in a future release -create index idx4 on worklog5743_16(a1, a2(3069)); -ERROR 42000: Specified key was too long; max key length is 3072 bytes -show warnings; -Level Code Message -Error 1071 Specified key was too long; max key length is 3072 bytes -create index idx5 on worklog5743_16(a1, a2(3068)); -show warnings; -Level Code Message -create index idx6 on worklog5743_16(a1, a2(2000), a3(1069)); -ERROR 42000: Specified key was too long; max key length is 3072 bytes -show warnings; -Level Code Message -Error 1071 Specified key was too long; max key length is 3072 bytes -create index idx7 on worklog5743_16(a1, a2(2000), a3(1068)); -show warnings; -Level Code Message -set sql_mode=default; -insert into worklog5743_1 values(9, repeat("a", 10000)); -insert into worklog5743_2 values(9, repeat("a", 10000)); -insert into worklog5743_4 values(9, repeat("a", 10000)); -insert into worklog5743_8 values(9, repeat("a", 10000), repeat("a", 10000)); -insert into worklog5743_16 values(9, repeat("a", 10000), repeat("a", 10000)); -set global innodb_large_prefix=0; -Warnings: -Warning 131 Using innodb_large_prefix is deprecated and the parameter may be removed in future releases. See http://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html -insert into worklog5743_1 values(2, repeat("b", 10000)); -insert into worklog5743_2 values(2, repeat("b", 10000)); -insert into worklog5743_4 values(2, repeat("b", 10000)); -insert into worklog5743_8 values(2, repeat("b", 10000), repeat("b", 10000)); -insert into worklog5743_16 values(2, repeat("b", 10000), repeat("b", 10000)); -set global innodb_large_prefix=1; -Warnings: -Warning 131 Using innodb_large_prefix is deprecated and the parameter may be removed in future releases. See http://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html -select a1, left(a2, 20) from worklog5743_1; -a1 left(a2, 20) -9 aaaaaaaaaaaaaaaaaaaa -2 bbbbbbbbbbbbbbbbbbbb -select a1, left(a2, 20) from worklog5743_2; -a1 left(a2, 20) -9 aaaaaaaaaaaaaaaaaaaa -2 bbbbbbbbbbbbbbbbbbbb -select a1, left(a2, 20) from worklog5743_4; -a1 left(a2, 20) -9 aaaaaaaaaaaaaaaaaaaa -2 bbbbbbbbbbbbbbbbbbbb -select a1, left(a2, 20) from worklog5743_8; -a1 left(a2, 20) -9 aaaaaaaaaaaaaaaaaaaa -2 bbbbbbbbbbbbbbbbbbbb -select a1, left(a2, 20) from worklog5743_16; -a1 left(a2, 20) -9 aaaaaaaaaaaaaaaaaaaa -2 bbbbbbbbbbbbbbbbbbbb -begin; -update worklog5743_1 set a1 = 1000; -update worklog5743_2 set a1 = 1000; -update worklog5743_4 set a1 = 1000; -update worklog5743_8 set a1 = 1000; -update worklog5743_16 set a1 = 1000; -select a1, left(a2, 20) from worklog5743_1; -a1 left(a2, 20) -1000 aaaaaaaaaaaaaaaaaaaa -1000 bbbbbbbbbbbbbbbbbbbb -select a1, left(a2, 20) from worklog5743_2; -a1 left(a2, 20) -1000 aaaaaaaaaaaaaaaaaaaa -1000 bbbbbbbbbbbbbbbbbbbb -select a1, left(a2, 20) from worklog5743_4; -a1 left(a2, 20) -1000 aaaaaaaaaaaaaaaaaaaa -1000 bbbbbbbbbbbbbbbbbbbb -select a1, left(a2, 20) from worklog5743_8; -a1 left(a2, 20) -1000 aaaaaaaaaaaaaaaaaaaa -1000 bbbbbbbbbbbbbbbbbbbb -select a1, left(a2, 20) from worklog5743_16; -a1 left(a2, 20) -1000 aaaaaaaaaaaaaaaaaaaa -1000 bbbbbbbbbbbbbbbbbbbb -connection con1; -select @@session.tx_isolation; -@@session.tx_isolation -REPEATABLE-READ -explain select a1, left(a2, 20) from worklog5743_1 where a1 = 9; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE worklog5743_1 ref idx6 idx6 5 const 1 -explain select a1, left(a2, 20) from worklog5743_2 where a1 = 9; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE worklog5743_2 ref idx6 idx6 5 const 1 -explain select a1, left(a2, 20) from worklog5743_4 where a1 = 9; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE worklog5743_4 ref idx6 idx6 5 const 1 -explain select a1, left(a2, 20) from worklog5743_8 where a1 = 9; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE worklog5743_8 ref idx5,idx7 idx5 5 const 1 -explain select a1, left(a2, 20) from worklog5743_16 where a1 = 9; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE worklog5743_16 ref idx5,idx7 idx5 5 const 1 -select a1, left(a2, 20) from worklog5743_1 where a1 = 9; -a1 left(a2, 20) -9 aaaaaaaaaaaaaaaaaaaa -select a1, left(a2, 20) from worklog5743_2 where a1 = 9; -a1 left(a2, 20) -9 aaaaaaaaaaaaaaaaaaaa -select a1, left(a2, 20) from worklog5743_4 where a1 = 9; -a1 left(a2, 20) -9 aaaaaaaaaaaaaaaaaaaa -select a1, left(a2, 20) from worklog5743_8 where a1 = 9; -a1 left(a2, 20) -9 aaaaaaaaaaaaaaaaaaaa -select a1, left(a2, 20) from worklog5743_16 where a1 = 9; -a1 left(a2, 20) -9 aaaaaaaaaaaaaaaaaaaa -connection con2; -SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -select @@session.tx_isolation; -@@session.tx_isolation -READ-UNCOMMITTED -select a1, left(a2, 20) from worklog5743_1 where a1 = 9; -a1 left(a2, 20) -select a1, left(a2, 20) from worklog5743_2 where a1 = 9; -a1 left(a2, 20) -select a1, left(a2, 20) from worklog5743_4 where a1 = 9; -a1 left(a2, 20) -select a1, left(a2, 20) from worklog5743_8 where a1 = 9; -a1 left(a2, 20) -select a1, left(a2, 20) from worklog5743_16 where a1 = 9; -a1 left(a2, 20) -connection default; -rollback; -drop table worklog5743_1; -drop table worklog5743_2; -drop table worklog5743_4; -drop table worklog5743_8; -drop table worklog5743_16; -### Test 5 ### -create table worklog5743(a1 int, -a2 varchar(20000), -a3 varchar(3073), -a4 varchar(3072), -a5 varchar(3069), -a6 varchar(3068)) -ROW_FORMAT=DYNAMIC; -set sql_mode=''; -create index idx1 on worklog5743(a2); -Warnings: -Warning 1071 Specified key was too long; max key length is 3072 bytes -create index idx2 on worklog5743(a3); -Warnings: -Warning 1071 Specified key was too long; max key length is 3072 bytes -create index idx3 on worklog5743(a4); -show warnings; -Level Code Message -create index idx4 on worklog5743(a1, a2); -ERROR 42000: Specified key was too long; max key length is 3072 bytes -show warnings; -Level Code Message -Warning 1071 Specified key was too long; max key length is 3072 bytes -Error 1071 Specified key was too long; max key length is 3072 bytes -create index idx5 on worklog5743(a1, a5); -ERROR 42000: Specified key was too long; max key length is 3072 bytes -show warnings; -Level Code Message -Error 1071 Specified key was too long; max key length is 3072 bytes -create index idx6 on worklog5743(a1, a6); -show warnings; -Level Code Message -show create table worklog5743; -Table Create Table -worklog5743 CREATE TABLE `worklog5743` ( - `a1` int(11) DEFAULT NULL, - `a2` varchar(20000) DEFAULT NULL, - `a3` varchar(3073) DEFAULT NULL, - `a4` varchar(3072) DEFAULT NULL, - `a5` varchar(3069) DEFAULT NULL, - `a6` varchar(3068) DEFAULT NULL, - KEY `idx1` (`a2`(3072)), - KEY `idx2` (`a3`(3072)), - KEY `idx3` (`a4`), - KEY `idx6` (`a1`,`a6`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC -set sql_mode=default; -insert into worklog5743 values(9, -repeat("a", 20000), repeat("a", 3073), -repeat("a", 3072), repeat("a", 3069), -repeat("a", 3068)); -begin; -update worklog5743 set a1 = 1000; -connection con1; -select @@session.tx_isolation; -@@session.tx_isolation -REPEATABLE-READ -explain select a1 from worklog5743 where a1 = 9; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE worklog5743 ref idx6 idx6 5 const 1 Using index -select a1 from worklog5743 where a1 = 9; -a1 -9 -connection con2; -SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -select @@session.tx_isolation; -@@session.tx_isolation -READ-UNCOMMITTED -select a1 from worklog5743 where a1 = 9; -a1 -connection default; -rollback; -drop table worklog5743; -### Test 6 ### -create table worklog5743(a TEXT not null, primary key (a(1000))) row_format=COMPACT; -ERROR HY000: Index column size too large. The maximum column size is 767 bytes -create table worklog5743(a TEXT) row_format=COMPACT; -create index idx on worklog5743(a(768)); -ERROR HY000: Index column size too large. The maximum column size is 767 bytes -create index idx on worklog5743(a(767)); -insert into worklog5743 values(repeat("a", 20000)); -begin; -insert into worklog5743 values(repeat("b", 20000)); -update worklog5743 set a = (repeat("x", 25000)); -select @@session.tx_isolation; -@@session.tx_isolation -REPEATABLE-READ -connection con1; -select a = repeat("a", 20000) from worklog5743; -a = repeat("a", 20000) -1 -disconnect con1; -connection con2; -SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -select @@session.tx_isolation; -@@session.tx_isolation -READ-UNCOMMITTED -select a = repeat("x", 25000) from worklog5743; -a = repeat("x", 25000) -1 -1 -disconnect con2; -connection default; -rollback; -drop table worklog5743; -### Test 7 ### -create table worklog5743(a TEXT not null) ROW_FORMAT=DYNAMIC; -set statement sql_mode = '' for -create index idx1 on worklog5743(a(3073)); -Warnings: -Note 1071 Specified key was too long; max key length is 3072 bytes -create index idx2 on worklog5743(a(3072)); -Warnings: -Note 1831 Duplicate index `idx2`. This is deprecated and will be disallowed in a future release -show create table worklog5743; -Table Create Table -worklog5743 CREATE TABLE `worklog5743` ( - `a` text NOT NULL, - KEY `idx1` (`a`(3072)), - KEY `idx2` (`a`(3072)) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC -drop table worklog5743; -create table worklog5743(a TEXT not null) ROW_FORMAT=REDUNDANT; -create index idx on worklog5743(a(768)); -ERROR HY000: Index column size too large. The maximum column size is 767 bytes -create index idx2 on worklog5743(a(767)); -drop table worklog5743; -create table worklog5743(a TEXT not null) ROW_FORMAT=COMPACT; -create index idx on worklog5743(a(768)); -ERROR HY000: Index column size too large. The maximum column size is 767 bytes -create index idx2 on worklog5743(a(767)); -drop table worklog5743; -SET GLOBAL innodb_large_prefix=1; -Warnings: -Warning 131 Using innodb_large_prefix is deprecated and the parameter may be removed in future releases. See http://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html -SET GLOBAL innodb_strict_mode = DEFAULT; diff --git a/mysql-test/suite/innodb_zip/r/recover.result b/mysql-test/suite/innodb_zip/r/recover.result new file mode 100644 index 00000000000..97051efb645 --- /dev/null +++ b/mysql-test/suite/innodb_zip/r/recover.result @@ -0,0 +1,17 @@ +# +# MDEV-12720 recovery fails with "Generic error" +# for ROW_FORMAT=compressed +# +CREATE TABLE a(i INT PRIMARY KEY AUTO_INCREMENT, s VARCHAR(255)) ENGINE=InnoDB +ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; +BEGIN; +insert into a(i) select null; +insert into a select null, uuid() from a a, a b, a c; +insert into a select null, uuid() from a a, a b, a c; +insert into a select null, uuid() from a a, a b, a c; +SET GLOBAL innodb_flush_log_at_trx_commit=1; +COMMIT; +SELECT COUNT(*) from a; +COUNT(*) +1010 +DROP TABLE a; diff --git a/mysql-test/suite/innodb_zip/r/restart.result b/mysql-test/suite/innodb_zip/r/restart.result index 4820914f760..88bd79cd428 100644 --- a/mysql-test/suite/innodb_zip/r/restart.result +++ b/mysql-test/suite/innodb_zip/r/restart.result @@ -145,10 +145,10 @@ t6_restart CREATE TABLE `t6_restart` ( `c5` text DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=2 - PARTITION BY HASH (c1) -(PARTITION p0 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - PARTITION p1 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - PARTITION p2 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB) + PARTITION BY HASH (`c1`) +(PARTITION `p0` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + PARTITION `p1` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + PARTITION `p2` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB) SELECT count(*) FROM t6_restart; count(*) 16 @@ -181,14 +181,14 @@ t7_restart CREATE TABLE `t7_restart` ( `c5` text DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC - PARTITION BY RANGE (c1) -SUBPARTITION BY HASH (c1) -(PARTITION p0 VALUES LESS THAN (10) - (SUBPARTITION s0 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - SUBPARTITION s1 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB), - PARTITION p1 VALUES LESS THAN MAXVALUE - (SUBPARTITION s2 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - SUBPARTITION s3 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB)) + PARTITION BY RANGE (`c1`) +SUBPARTITION BY HASH (`c1`) +(PARTITION `p0` VALUES LESS THAN (10) + (SUBPARTITION `s0` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + SUBPARTITION `s1` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB), + PARTITION `p1` VALUES LESS THAN MAXVALUE + (SUBPARTITION `s2` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + SUBPARTITION `s3` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB)) SELECT count(*) FROM t7_restart; count(*) 16 @@ -325,10 +325,10 @@ t6_restart CREATE TABLE `t6_restart` ( `c5` text DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=2 - PARTITION BY HASH (c1) -(PARTITION p0 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - PARTITION p1 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - PARTITION p2 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB) + PARTITION BY HASH (`c1`) +(PARTITION `p0` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + PARTITION `p1` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + PARTITION `p2` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB) SHOW CREATE TABLE t7_restart; Table Create Table t7_restart CREATE TABLE `t7_restart` ( @@ -339,14 +339,14 @@ t7_restart CREATE TABLE `t7_restart` ( `c5` text DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC - PARTITION BY RANGE (c1) -SUBPARTITION BY HASH (c1) -(PARTITION p0 VALUES LESS THAN (10) - (SUBPARTITION s0 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - SUBPARTITION s1 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB), - PARTITION p1 VALUES LESS THAN MAXVALUE - (SUBPARTITION s2 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - SUBPARTITION s3 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB)) + PARTITION BY RANGE (`c1`) +SUBPARTITION BY HASH (`c1`) +(PARTITION `p0` VALUES LESS THAN (10) + (SUBPARTITION `s0` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + SUBPARTITION `s1` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB), + PARTITION `p1` VALUES LESS THAN MAXVALUE + (SUBPARTITION `s2` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + SUBPARTITION `s3` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB)) INSERT INTO t1_restart (SELECT 0, c2, c3, c4, c5 FROM t1_restart); INSERT INTO t2_restart (SELECT 0, c2, c3, c4, c5 FROM t2_restart); INSERT INTO t3_restart (SELECT 0, c2, c3, c4, c5 FROM t3_restart); @@ -456,10 +456,10 @@ t6_restart CREATE TABLE `t6_restart` ( `c5` text DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=2 - PARTITION BY HASH (c1) -(PARTITION p0 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - PARTITION p1 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - PARTITION p2 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB) + PARTITION BY HASH (`c1`) +(PARTITION `p0` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + PARTITION `p1` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + PARTITION `p2` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB) SELECT count(*) FROM t7_restart; count(*) 9 @@ -473,14 +473,14 @@ t7_restart CREATE TABLE `t7_restart` ( `c5` text DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC - PARTITION BY RANGE (c1) -SUBPARTITION BY HASH (c1) -(PARTITION p0 VALUES LESS THAN (10) - (SUBPARTITION s0 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - SUBPARTITION s1 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB), - PARTITION p1 VALUES LESS THAN MAXVALUE - (SUBPARTITION s2 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - SUBPARTITION s3 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB)) + PARTITION BY RANGE (`c1`) +SUBPARTITION BY HASH (`c1`) +(PARTITION `p0` VALUES LESS THAN (10) + (SUBPARTITION `s0` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + SUBPARTITION `s1` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB), + PARTITION `p1` VALUES LESS THAN MAXVALUE + (SUBPARTITION `s2` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + SUBPARTITION `s3` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB)) # # Shutdown the server and make a backup of a tablespace # @@ -555,10 +555,10 @@ t6_restart CREATE TABLE `t6_restart` ( `c5` text DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=2 - PARTITION BY HASH (c1) -(PARTITION p0 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - PARTITION p1 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - PARTITION p2 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB) + PARTITION BY HASH (`c1`) +(PARTITION `p0` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + PARTITION `p1` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + PARTITION `p2` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB) SELECT count(*) FROM t7_restart; count(*) 9 @@ -572,14 +572,14 @@ t7_restart CREATE TABLE `t7_restart` ( `c5` text DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC - PARTITION BY RANGE (c1) -SUBPARTITION BY HASH (c1) -(PARTITION p0 VALUES LESS THAN (10) - (SUBPARTITION s0 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - SUBPARTITION s1 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB), - PARTITION p1 VALUES LESS THAN MAXVALUE - (SUBPARTITION s2 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - SUBPARTITION s3 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB)) + PARTITION BY RANGE (`c1`) +SUBPARTITION BY HASH (`c1`) +(PARTITION `p0` VALUES LESS THAN (10) + (SUBPARTITION `s0` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + SUBPARTITION `s1` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB), + PARTITION `p1` VALUES LESS THAN MAXVALUE + (SUBPARTITION `s2` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + SUBPARTITION `s3` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB)) # # Try to rename a tablespace to a file that already exists # @@ -657,10 +657,10 @@ t66_restart CREATE TABLE `t66_restart` ( `c5` text DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=2 - PARTITION BY HASH (c1) -(PARTITION p0 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - PARTITION p1 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - PARTITION p2 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB) + PARTITION BY HASH (`c1`) +(PARTITION `p0` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + PARTITION `p1` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + PARTITION `p2` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB) INSERT INTO t77_restart (SELECT 0, c2, c3, c4, c5 FROM t77_restart); SELECT count(*) FROM t77_restart; count(*) @@ -675,14 +675,14 @@ t77_restart CREATE TABLE `t77_restart` ( `c5` text DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC - PARTITION BY RANGE (c1) -SUBPARTITION BY HASH (c1) -(PARTITION p0 VALUES LESS THAN (10) - (SUBPARTITION s0 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - SUBPARTITION s1 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB), - PARTITION p1 VALUES LESS THAN MAXVALUE - (SUBPARTITION s2 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - SUBPARTITION s3 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB)) + PARTITION BY RANGE (`c1`) +SUBPARTITION BY HASH (`c1`) +(PARTITION `p0` VALUES LESS THAN (10) + (SUBPARTITION `s0` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + SUBPARTITION `s1` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB), + PARTITION `p1` VALUES LESS THAN MAXVALUE + (SUBPARTITION `s2` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + SUBPARTITION `s3` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB)) ---- MYSQL_DATA_DIR/test t4_restart.frm t4_restart.ibd @@ -753,10 +753,10 @@ t66_restart CREATE TABLE `t66_restart` ( `c5` text DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=95 DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=2 - PARTITION BY HASH (c1) -(PARTITION p0 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - PARTITION p1 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - PARTITION p2 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB) + PARTITION BY HASH (`c1`) +(PARTITION `p0` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + PARTITION `p1` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + PARTITION `p2` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB) INSERT INTO t77_restart (SELECT 0, c2, c3, c4, c5 FROM t77_restart); SELECT count(*) FROM t77_restart; count(*) @@ -771,14 +771,14 @@ t77_restart CREATE TABLE `t77_restart` ( `c5` text DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC - PARTITION BY RANGE (c1) -SUBPARTITION BY HASH (c1) -(PARTITION p0 VALUES LESS THAN (10) - (SUBPARTITION s0 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - SUBPARTITION s1 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB), - PARTITION p1 VALUES LESS THAN MAXVALUE - (SUBPARTITION s2 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, - SUBPARTITION s3 DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB)) + PARTITION BY RANGE (`c1`) +SUBPARTITION BY HASH (`c1`) +(PARTITION `p0` VALUES LESS THAN (10) + (SUBPARTITION `s0` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + SUBPARTITION `s1` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB), + PARTITION `p1` VALUES LESS THAN MAXVALUE + (SUBPARTITION `s2` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB, + SUBPARTITION `s3` DATA DIRECTORY = 'MYSQL_TMP_DIR/alt_dir' ENGINE = InnoDB)) # # Shutdown the server # @@ -898,10 +898,10 @@ t66_restart CREATE TABLE `t66_restart` ( `c5` text DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=179 DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=2 - PARTITION BY HASH (c1) -(PARTITION p0 DATA DIRECTORY = 'MYSQL_TMP_DIR/new_dir' ENGINE = InnoDB, - PARTITION p1 DATA DIRECTORY = 'MYSQL_TMP_DIR/new_dir' ENGINE = InnoDB, - PARTITION p2 DATA DIRECTORY = 'MYSQL_TMP_DIR/new_dir' ENGINE = InnoDB) + PARTITION BY HASH (`c1`) +(PARTITION `p0` DATA DIRECTORY = 'MYSQL_TMP_DIR/new_dir' ENGINE = InnoDB, + PARTITION `p1` DATA DIRECTORY = 'MYSQL_TMP_DIR/new_dir' ENGINE = InnoDB, + PARTITION `p2` DATA DIRECTORY = 'MYSQL_TMP_DIR/new_dir' ENGINE = InnoDB) INSERT INTO t77_restart (SELECT 0, c2, c3, c4, c5 FROM t77_restart); SELECT count(*) FROM t77_restart; count(*) @@ -916,14 +916,14 @@ t77_restart CREATE TABLE `t77_restart` ( `c5` text DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=73 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC - PARTITION BY RANGE (c1) -SUBPARTITION BY HASH (c1) -(PARTITION p0 VALUES LESS THAN (10) - (SUBPARTITION s0 DATA DIRECTORY = 'MYSQL_TMP_DIR/new_dir' ENGINE = InnoDB, - SUBPARTITION s1 DATA DIRECTORY = 'MYSQL_TMP_DIR/new_dir' ENGINE = InnoDB), - PARTITION p1 VALUES LESS THAN MAXVALUE - (SUBPARTITION s2 DATA DIRECTORY = 'MYSQL_TMP_DIR/new_dir' ENGINE = InnoDB, - SUBPARTITION s3 DATA DIRECTORY = 'MYSQL_TMP_DIR/new_dir' ENGINE = InnoDB)) + PARTITION BY RANGE (`c1`) +SUBPARTITION BY HASH (`c1`) +(PARTITION `p0` VALUES LESS THAN (10) + (SUBPARTITION `s0` DATA DIRECTORY = 'MYSQL_TMP_DIR/new_dir' ENGINE = InnoDB, + SUBPARTITION `s1` DATA DIRECTORY = 'MYSQL_TMP_DIR/new_dir' ENGINE = InnoDB), + PARTITION `p1` VALUES LESS THAN MAXVALUE + (SUBPARTITION `s2` DATA DIRECTORY = 'MYSQL_TMP_DIR/new_dir' ENGINE = InnoDB, + SUBPARTITION `s3` DATA DIRECTORY = 'MYSQL_TMP_DIR/new_dir' ENGINE = InnoDB)) # # Shutdown the server # @@ -1033,10 +1033,10 @@ t66_restart CREATE TABLE `t66_restart` ( `c5` text DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=347 DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=2 - PARTITION BY HASH (c1) -(PARTITION p0 ENGINE = InnoDB, - PARTITION p1 ENGINE = InnoDB, - PARTITION p2 ENGINE = InnoDB) + PARTITION BY HASH (`c1`) +(PARTITION `p0` ENGINE = InnoDB, + PARTITION `p1` ENGINE = InnoDB, + PARTITION `p2` ENGINE = InnoDB) INSERT INTO t77_restart (SELECT 0, c2, c3, c4, c5 FROM t77_restart); SELECT count(*) FROM t77_restart; count(*) @@ -1051,14 +1051,14 @@ t77_restart CREATE TABLE `t77_restart` ( `c5` text DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=145 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC - PARTITION BY RANGE (c1) -SUBPARTITION BY HASH (c1) -(PARTITION p0 VALUES LESS THAN (10) - (SUBPARTITION s0 ENGINE = InnoDB, - SUBPARTITION s1 ENGINE = InnoDB), - PARTITION p1 VALUES LESS THAN MAXVALUE - (SUBPARTITION s2 ENGINE = InnoDB, - SUBPARTITION s3 ENGINE = InnoDB)) + PARTITION BY RANGE (`c1`) +SUBPARTITION BY HASH (`c1`) +(PARTITION `p0` VALUES LESS THAN (10) + (SUBPARTITION `s0` ENGINE = InnoDB, + SUBPARTITION `s1` ENGINE = InnoDB), + PARTITION `p1` VALUES LESS THAN MAXVALUE + (SUBPARTITION `s2` ENGINE = InnoDB, + SUBPARTITION `s3` ENGINE = InnoDB)) # # Cleanup # diff --git a/mysql-test/suite/innodb_zip/r/wl5522_debug_zip.result b/mysql-test/suite/innodb_zip/r/wl5522_debug_zip.result index d20cc452612..394a2ea1f09 100644 --- a/mysql-test/suite/innodb_zip/r/wl5522_debug_zip.result +++ b/mysql-test/suite/innodb_zip/r/wl5522_debug_zip.result @@ -123,7 +123,9 @@ INDEX idx1(c2), INDEX idx2(c3(512)), INDEX idx3(c4(512))) Engine=InnoDB ROW_FORMAT=COMPRESSED; -SET GLOBAL INNODB_PURGE_STOP_NOW=ON; +connect purge_control,localhost,root; +START TRANSACTION WITH CONSISTENT SNAPSHOT; +connection default; SET GLOBAL innodb_disable_background_merge=ON; SET GLOBAL innodb_monitor_reset = ibuf_merges; SET GLOBAL innodb_monitor_reset = ibuf_merges_insert; @@ -288,7 +290,10 @@ FROM information_schema.innodb_metrics WHERE name = 'ibuf_merges_inserts' AND count > 0; name SET GLOBAL innodb_disable_background_merge=OFF; -SET GLOBAL INNODB_PURGE_RUN_NOW=ON; +connection purge_control; +COMMIT; +disconnect purge_control; +connection default; DROP TABLE test_wl5522.t1; CREATE TABLE test_wl5522.t1 ( c1 BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, diff --git a/mysql-test/suite/innodb_zip/r/wl6344_compress_level.result b/mysql-test/suite/innodb_zip/r/wl6344_compress_level.result index 5cdfe162b6a..b33d9c0c8de 100644 --- a/mysql-test/suite/innodb_zip/r/wl6344_compress_level.result +++ b/mysql-test/suite/innodb_zip/r/wl6344_compress_level.result @@ -1,28 +1,13 @@ -USE test; -DROP TABLE IF EXISTS tab5; -Warnings: -Note 1051 Unknown table 'test.tab5' -DROP TABLE IF EXISTS tab6; -Warnings: -Note 1051 Unknown table 'test.tab6' -#set the other madatory flags before test starts SET GLOBAL Innodb_file_per_table=on; -#set the compression level=0 (No compress) +SET @save_innodb_compression_level = @@global.innodb_compression_level; SET global innodb_compression_level=0; -#check the compression level and the compressed_pages is default -SELECT @@innodb_compression_level; -@@innodb_compression_level -0 -SELECT @@Innodb_file_per_table; -@@Innodb_file_per_table -1 #create table with 1K block size CREATE TABLE tab5 (col_1 CHAR (255) , col_2 VARCHAR (255), col_3 longtext, col_4 longtext,col_5 longtext, col_6 longtext , col_7 longtext , col_8 longtext ,col_9 longtext , -col_10 longtext ,col_11 int auto_increment primary key) +col_10 longtext ,col_11 int auto_increment primary key) ENGINE = innodb ROW_FORMAT=compressed key_block_size=1; #create indexes CREATE INDEX idx1 ON tab5(col_4(10)); @@ -42,7 +27,8 @@ SET @col_7 = repeat('g', 100); SET @col_8 = repeat('h', 100); SET @col_9 = repeat('i', 100); SET @col_10 = repeat('j', 100); -#insert 10 records +#insert 10 records +BEGIN; INSERT INTO tab5(col_1,col_2,col_3,col_4,col_5,col_6,col_7,col_8,col_9,col_10) VALUES (@col_1,@col_2,@col_3,@col_4,@cl_5,@col_6,@col_7,@col_8,@col_9,@col_10); INSERT INTO tab5(col_1,col_2,col_3,col_4,col_5,col_6,col_7,col_8,col_9,col_10) @@ -63,7 +49,8 @@ INSERT INTO tab5(col_1,col_2,col_3,col_4,col_5,col_6,col_7,col_8,col_9,col_10) VALUES (@col_1,@col_2,@col_3,@col_4,@cl_5,@col_6,@col_7,@col_8,@col_9,@col_10); INSERT INTO tab5(col_1,col_2,col_3,col_4,col_5,col_6,col_7,col_8,col_9,col_10) VALUES (@col_1,@col_2,@col_3,@col_4,@cl_5,@col_6,@col_7,@col_8,@col_9,@col_10); -#set the compression level=9 (High compress) +COMMIT; +#set the compression level=9 (High compress) SET global innodb_compression_level=9; #create table with 1K block size CREATE TABLE tab6 (col_1 CHAR (255) , @@ -80,18 +67,8 @@ CREATE INDEX idx3 ON tab6(col_6(10)); CREATE INDEX idx4 ON tab6(col_7(10)); CREATE INDEX idx5 ON tab6(col_8(10)); CREATE INDEX idx6 ON tab6(col_11); -#load the with repeat function -SET @col_1 = repeat('a', 100); -SET @col_2 = repeat('b', 100); -SET @col_3 = repeat('c', 100); -SET @col_4 = repeat('d', 100); -SET @col_5 = repeat('e', 100); -SET @col_6 = repeat('f', 100); -SET @col_7 = repeat('g', 100); -SET @col_8 = repeat('h', 100); -SET @col_9 = repeat('i', 100); -SET @col_10 = repeat('j', 100); -#insert 10 records +#insert 10 records +BEGIN; INSERT INTO tab6(col_1,col_2,col_3,col_4,col_5,col_6,col_7,col_8,col_9,col_10) VALUES (@col_1,@col_2,@col_3,@col_4,@cl_5,@col_6,@col_7,@col_8,@col_9,@col_10); INSERT INTO tab6(col_1,col_2,col_3,col_4,col_5,col_6,col_7,col_8,col_9,col_10) @@ -112,24 +89,21 @@ INSERT INTO tab6(col_1,col_2,col_3,col_4,col_5,col_6,col_7,col_8,col_9,col_10) VALUES (@col_1,@col_2,@col_3,@col_4,@cl_5,@col_6,@col_7,@col_8,@col_9,@col_10); INSERT INTO tab6(col_1,col_2,col_3,col_4,col_5,col_6,col_7,col_8,col_9,col_10) VALUES (@col_1,@col_2,@col_3,@col_4,@cl_5,@col_6,@col_7,@col_8,@col_9,@col_10); +COMMIT; #diff the sizes of the No compressed table and high compressed table -SET @size=(SELECT -(SELECT (SUM(DATA_LENGTH+INDEX_LENGTH)/1024/1024) -FROM INFORMATION_SCHEMA.TABLES +SET @size=(SELECT +(SELECT (SUM(DATA_LENGTH+INDEX_LENGTH)/1024/1024) +FROM INFORMATION_SCHEMA.TABLES WHERE table_name='tab5' AND ENGINE='InnoDB' AND table_schema='test') - -(SELECT SUM(DATA_LENGTH+INDEX_LENGTH)/1024/1024 -FROM INFORMATION_SCHEMA.TABLES +(SELECT SUM(DATA_LENGTH+INDEX_LENGTH)/1024/1024 +FROM INFORMATION_SCHEMA.TABLES WHERE table_name='tab6' AND ENGINE='InnoDB' AND table_schema='test') FROM DUAL); -#check the size of the table, it should not be Negative value +#check the size of the table, it should not be Negative value #The results of this query Test pass = 1 and fail=0 SELECT @size >= 0; @size >= 0 1 -# -# Cleanup -# -DROP TABLE tab5; -DROP TABLE tab6; -#reset back the compression_level to default. +DROP TABLE tab5, tab6; +SET GLOBAL innodb_compression_level = @save_innodb_compression_level; diff --git a/mysql-test/suite/innodb_zip/t/bug36169.test b/mysql-test/suite/innodb_zip/t/bug36169.test index 5452c929b92..07566b204bd 100644 --- a/mysql-test/suite/innodb_zip/t/bug36169.test +++ b/mysql-test/suite/innodb_zip/t/bug36169.test @@ -3,8 +3,7 @@ # http://bugs.mysql.com/36169 # --- source include/have_innodb.inc --- source include/have_innodb_zip.inc +-- source include/innodb_page_size_small.inc let $file_per_table=`select @@innodb_file_per_table`; SET GLOBAL innodb_file_per_table=ON; diff --git a/mysql-test/suite/innodb_zip/t/bug36172.test b/mysql-test/suite/innodb_zip/t/bug36172.test index 49590f40192..1f6533d07bf 100644 --- a/mysql-test/suite/innodb_zip/t/bug36172.test +++ b/mysql-test/suite/innodb_zip/t/bug36172.test @@ -1,12 +1,12 @@ +--source include/innodb_page_size_small.inc # # Test case for bug 36172 # --- source include/not_embedded.inc --- source include/have_innodb.inc --- source include/have_innodb_16k.inc +set @file_per_table=@@global.innodb_file_per_table; +SET GLOBAL innodb_file_per_table=on; -SET default_storage_engine=InnoDB; +SET sql_mode = 'NO_ENGINE_SUBSTITUTION'; # we do not really care about what gets printed, we are only # interested in getting success or failure according to our @@ -15,11 +15,6 @@ SET default_storage_engine=InnoDB; -- disable_query_log -- disable_result_log -let $file_per_table=`select @@innodb_file_per_table`; -SET GLOBAL innodb_file_per_table=on; - -DROP TABLE IF EXISTS `table0`; -SET sql_mode = 'NO_ENGINE_SUBSTITUTION'; CREATE TABLE `table0` ( `col0` tinyint(1) DEFAULT NULL, `col1` tinyint(1) DEFAULT NULL, `col2` tinyint(4) DEFAULT NULL, `col3` date DEFAULT NULL, `col4` time DEFAULT NULL, `col5` set('test1','test2','test3') DEFAULT NULL, `col6` time DEFAULT NULL, `col7` text, `col8` decimal(10,0) DEFAULT NULL, `col9` set('test1','test2','test3') DEFAULT NULL, `col10` float DEFAULT NULL, `col11` double DEFAULT NULL, `col12` enum('test1','test2','test3') DEFAULT NULL, `col13` tinyblob, `col14` year(4) DEFAULT NULL, `col15` set('test1','test2','test3') DEFAULT NULL, `col16` decimal(10,0) DEFAULT NULL, `col17` decimal(10,0) DEFAULT NULL, `col18` blob, `col19` datetime DEFAULT NULL, `col20` double DEFAULT NULL, `col21` decimal(10,0) DEFAULT NULL, `col22` datetime DEFAULT NULL, `col23` decimal(10,0) DEFAULT NULL, `col24` decimal(10,0) DEFAULT NULL, `col25` longtext, `col26` tinyblob, `col27` time DEFAULT NULL, `col28` tinyblob, `col29` enum('test1','test2','test3') DEFAULT NULL, `col30` smallint(6) DEFAULT NULL, `col31` double DEFAULT NULL, `col32` float DEFAULT NULL, `col33` char(175) DEFAULT NULL, `col34` tinytext, `col35` tinytext, `col36` tinyblob, `col37` tinyblob, `col38` tinytext, `col39` mediumblob, `col40` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `col41` double DEFAULT NULL, `col42` smallint(6) DEFAULT NULL, `col43` longblob, `col44` varchar(80) DEFAULT NULL, `col45` mediumtext, `col46` decimal(10,0) DEFAULT NULL, `col47` bigint(20) DEFAULT NULL, `col48` date DEFAULT NULL, `col49` tinyblob, `col50` date DEFAULT NULL, `col51` tinyint(1) DEFAULT NULL, `col52` mediumint(9) DEFAULT NULL, `col53` float DEFAULT NULL, `col54` tinyblob, `col55` longtext, `col56` smallint(6) DEFAULT NULL, `col57` enum('test1','test2','test3') DEFAULT NULL, `col58` datetime DEFAULT NULL, `col59` mediumtext, `col60` varchar(232) DEFAULT NULL, `col61` decimal(10,0) DEFAULT NULL, `col62` year(4) DEFAULT NULL, `col63` smallint(6) DEFAULT NULL, `col64` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `col65` blob, `col66` longblob, `col67` int(11) DEFAULT NULL, `col68` longtext, `col69` enum('test1','test2','test3') DEFAULT NULL, `col70` int(11) DEFAULT NULL, `col71` time DEFAULT NULL, `col72` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `col73` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `col74` varchar(170) DEFAULT NULL, `col75` set('test1','test2','test3') DEFAULT NULL, `col76` tinyblob, `col77` bigint(20) DEFAULT NULL, `col78` decimal(10,0) DEFAULT NULL, `col79` datetime DEFAULT NULL, `col80` year(4) DEFAULT NULL, `col81` decimal(10,0) DEFAULT NULL, `col82` longblob, `col83` text, `col84` char(83) DEFAULT NULL, `col85` decimal(10,0) DEFAULT NULL, `col86` float DEFAULT NULL, `col87` int(11) DEFAULT NULL, `col88` varchar(145) DEFAULT NULL, `col89` date DEFAULT NULL, `col90` decimal(10,0) DEFAULT NULL, `col91` decimal(10,0) DEFAULT NULL, `col92` mediumblob, `col93` time DEFAULT NULL, KEY `idx0` (`col69`,`col90`,`col8`), KEY `idx1` (`col60`), KEY `idx2` (`col60`,`col70`,`col74`), KEY `idx3` (`col22`,`col32`,`col72`,`col30`), KEY `idx4` (`col29`), KEY `idx5` (`col19`,`col45`(143)), KEY `idx6` (`col46`,`col48`,`col5`,`col39`(118)), KEY `idx7` (`col48`,`col61`), KEY `idx8` (`col93`), KEY `idx9` (`col31`), KEY `idx10` (`col30`,`col21`), KEY `idx11` (`col67`), KEY `idx12` (`col44`,`col6`,`col8`,`col38`(226)), KEY `idx13` (`col71`,`col41`,`col15`,`col49`(88)), KEY `idx14` (`col78`), KEY `idx15` (`col63`,`col67`,`col64`), KEY `idx16` (`col17`,`col86`), KEY `idx17` (`col77`,`col56`,`col10`,`col55`(24)), KEY `idx18` (`col62`), KEY `idx19` (`col31`,`col57`,`col56`,`col53`), KEY `idx20` (`col46`), KEY `idx21` (`col83`(54)), KEY `idx22` (`col51`,`col7`(120)), KEY `idx23` (`col7`(163),`col31`,`col71`,`col14`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=2; SET sql_mode = default; insert ignore into `table0` set `col23` = 7887371.5084383683, `col24` = 4293854615.6906948000, `col25` = 'vitalist', `col26` = 'widespread', `col27` = '3570490', `col28` = 'habitual', `col30` = -5471, `col31` = 4286985783.6771750000, `col32` = 6354540.9826654866, `col33` = 'defoliation', `col34` = 'logarithms', `col35` = 'tegument\'s', `col36` = 'scouting\'s', `col37` = 'intermittency', `col38` = 'elongates', `col39` = 'prophecies', `col40` = '20560103035939', `col41` = 4292809130.0544143000, `col42` = 22057, `col43` = 'Hess\'s', `col44` = 'bandstand', `col45` = 'phenylketonuria', `col46` = 6338767.4018677324, `col47` = 5310247, `col48` = '12592418', `col49` = 'churchman\'s', `col50` = '32226125', `col51` = -58, `col52` = -6207968, `col53` = 1244839.3255104220, `col54` = 'robotized', `col55` = 'monotonous', `col56` = -26909, `col58` = '20720107023550', `col59` = 'suggestiveness\'s', `col60` = 'gemology', `col61` = 4287800670.2229986000, `col62` = '1944', `col63` = -16827, `col64` = '20700107212324', `col65` = 'Nicolais', `col66` = 'apteryx', `col67` = 6935317, `col68` = 'stroganoff', `col70` = 3316430, `col71` = '3277608', `col72` = '19300511045918', `col73` = '20421201003327', `col74` = 'attenuant', `col75` = '15173', `col76` = 'upstroke\'s', `col77` = 8118987, `col78` = 6791516.2735374002, `col79` = '20780701144624', `col80` = '2134', `col81` = 4290682351.3127537000, `col82` = 'unexplainably', `col83` = 'Storm', `col84` = 'Greyso\'s', `col85` = 4289119212.4306774000, `col86` = 7617575.8796655172, `col87` = -6325335, `col88` = 'fondue\'s', `col89` = '40608940', `col90` = 1659421.8093508712, `col91` = 8346904.6584368423, `col92` = 'reloads', `col93` = '5188366'; @@ -27,4 +22,6 @@ CHECK TABLE table0 EXTENDED; INSERT IGNORE INTO `table0` SET `col19` = '19940127002709', `col20` = 2383927.9055146948, `col21` = 4293243420.5621204000, `col22` = '20511211123705', `col23` = 4289899778.6573381000, `col24` = 4293449279.0540481000, `col25` = 'emphysemic', `col26` = 'dentally', `col27` = '2347406', `col28` = 'eruct', `col30` = 1222, `col31` = 4294372994.9941406000, `col32` = 4291385574.1173744000, `col33` = 'borrowing\'s', `col34` = 'septics', `col35` = 'ratter\'s', `col36` = 'Kaye', `col37` = 'Florentia', `col38` = 'allium', `col39` = 'barkeep', `col40` = '19510407003441', `col41` = 4293559200.4215522000, `col42` = 22482, `col43` = 'decussate', `col44` = 'Brom\'s', `col45` = 'violated', `col46` = 4925506.4635456400, `col47` = 930549, `col48` = '51296066', `col49` = 'voluminously', `col50` = '29306676', `col51` = -88, `col52` = -2153690, `col53` = 4290250202.1464887000, `col54` = 'expropriation', `col55` = 'Aberdeen\'s', `col56` = 20343, `col58` = '19640415171532', `col59` = 'extern', `col60` = 'Ubana', `col61` = 4290487961.8539081000, `col62` = '2147', `col63` = -24271, `col64` = '20750801194548', `col65` = 'Cunaxa\'s', `col66` = 'pasticcio', `col67` = 2795817, `col68` = 'Indore\'s', `col70` = 6864127, `col71` = '1817832', `col72` = '20540506114211', `col73` = '20040101012300', `col74` = 'rationalized', `col75` = '45522', `col76` = 'indene', `col77` = -6964559, `col78` = 4247535.5266884370, `col79` = '20720416124357', `col80` = '2143', `col81` = 4292060102.4466386000, `col82` = 'striving', `col83` = 'boneblack\'s', `col84` = 'redolent', `col85` = 6489697.9009369183, `col86` = 4287473465.9731131000, `col87` = 7726015, `col88` = 'perplexed', `col89` = '17153791', `col90` = 5478587.1108127078, `col91` = 4287091404.7004304000, `col92` = 'Boulez\'s', `col93` = '2931278'; CHECK TABLE table0 EXTENDED; DROP TABLE table0; -EVAL SET GLOBAL innodb_file_per_table=$file_per_table; +-- enable_query_log +-- enable_result_log +SET GLOBAL innodb_file_per_table=@file_per_table; diff --git a/mysql-test/suite/innodb_zip/t/bug52745.test b/mysql-test/suite/innodb_zip/t/bug52745.test index a3de7323efe..be4b5c2bfcb 100644 --- a/mysql-test/suite/innodb_zip/t/bug52745.test +++ b/mysql-test/suite/innodb_zip/t/bug52745.test @@ -1,5 +1,4 @@ --- source include/have_innodb.inc --- source include/have_innodb_zip.inc +-- source include/innodb_page_size_small.inc let $file_per_table=`select @@innodb_file_per_table`; SET GLOBAL innodb_file_per_table=on; diff --git a/mysql-test/suite/innodb_zip/t/bug53591.test b/mysql-test/suite/innodb_zip/t/bug53591.test index 1943c59fe17..67223027bad 100644 --- a/mysql-test/suite/innodb_zip/t/bug53591.test +++ b/mysql-test/suite/innodb_zip/t/bug53591.test @@ -1,5 +1,4 @@ --- source include/have_innodb.inc --- source include/have_innodb_zip.inc +-- source include/innodb_page_size_small.inc let $file_per_table=`select @@innodb_file_per_table`; diff --git a/mysql-test/suite/innodb_zip/t/bug56680.test b/mysql-test/suite/innodb_zip/t/bug56680.test index 694c5ffac59..da37f6a28b4 100644 --- a/mysql-test/suite/innodb_zip/t/bug56680.test +++ b/mysql-test/suite/innodb_zip/t/bug56680.test @@ -3,8 +3,7 @@ # # Bug #56680 InnoDB may return wrong results from a case-insensitive index # --- source include/have_innodb.inc --- source include/have_innodb_zip.inc +-- source include/innodb_page_size_small.inc -- disable_query_log SET @tx_isolation_orig = @@tx_isolation; diff --git a/mysql-test/suite/innodb_zip/t/cmp_drop_table.test b/mysql-test/suite/innodb_zip/t/cmp_drop_table.test index 145f55bb160..ae6bfd9fb59 100644 --- a/mysql-test/suite/innodb_zip/t/cmp_drop_table.test +++ b/mysql-test/suite/innodb_zip/t/cmp_drop_table.test @@ -1,13 +1,15 @@ --- source include/have_innodb.inc --- source include/have_innodb_16k.inc +-- source include/innodb_page_size_small.inc +# lazy eviction might not be lazy enough when key rotation +# scans through pages +-- source include/not_encrypted.inc let $per_table=`select @@innodb_file_per_table`; -- let $query_i_s = SELECT page_size FROM information_schema.innodb_cmpmem WHERE pages_used > 0 set global innodb_file_per_table=on; - -create table t1(a text) engine=innodb key_block_size=8; + +create table t1(a text) engine=innodb key_block_size=4; -- disable_query_log @@ -20,13 +22,13 @@ while ($i) } -- enable_query_log -# we should be using some 8K pages +# we should be using some 4K pages -- eval $query_i_s drop table t1; # because of lazy eviction at drop table there should still be some -# used 8K pages +# used 4K pages -- eval $query_i_s # create a non-compressed table and insert enough into it to evict @@ -44,7 +46,7 @@ while ($i) -- enable_query_log -# now there should be no 8K pages in the buffer pool +# now there should be no 4K pages in the buffer pool -- eval $query_i_s drop table t2; diff --git a/mysql-test/suite/innodb_zip/t/create_options.test b/mysql-test/suite/innodb_zip/t/create_options.test index 86ef141cae8..e7303dee8f3 100644 --- a/mysql-test/suite/innodb_zip/t/create_options.test +++ b/mysql-test/suite/innodb_zip/t/create_options.test @@ -57,8 +57,7 @@ # since they are rejected for InnoDB page sizes of 8k and 16k. # See innodb_16k and innodb_8k for those tests. --- source include/have_innodb.inc --- source include/have_innodb_zip.inc +--source include/innodb_page_size_small.inc SET default_storage_engine=InnoDB; --disable_query_log diff --git a/mysql-test/suite/innodb_zip/t/innochecksum.test b/mysql-test/suite/innodb_zip/t/innochecksum.test index 0403251bf64..63a4b418677 100644 --- a/mysql-test/suite/innodb_zip/t/innochecksum.test +++ b/mysql-test/suite/innodb_zip/t/innochecksum.test @@ -1,8 +1,7 @@ #************************************************************ # WL6045:Improve Innochecksum #************************************************************ ---source include/have_innodb.inc ---source include/have_innodb_zip.inc +--source include/innodb_page_size_small.inc --source include/no_valgrind_without_big.inc # Embedded server does not support crashing. --source include/not_embedded.inc diff --git a/mysql-test/suite/innodb_zip/t/innochecksum_2.test b/mysql-test/suite/innodb_zip/t/innochecksum_2.test index 7f4ad336805..330bb81ba75 100644 --- a/mysql-test/suite/innodb_zip/t/innochecksum_2.test +++ b/mysql-test/suite/innodb_zip/t/innochecksum_2.test @@ -1,8 +1,7 @@ #************************************************************ # WL6045:Improve Innochecksum #************************************************************ ---source include/have_innodb.inc ---source include/have_innodb_zip.inc +--source include/innodb_page_size_small.inc --source include/have_debug.inc --source include/no_valgrind_without_big.inc # Avoid CrashReporter popup on Mac. diff --git a/mysql-test/suite/innodb_zip/t/innochecksum_3.test b/mysql-test/suite/innodb_zip/t/innochecksum_3.test index 7895510b335..dab10dcc997 100644 --- a/mysql-test/suite/innodb_zip/t/innochecksum_3.test +++ b/mysql-test/suite/innodb_zip/t/innochecksum_3.test @@ -1,8 +1,7 @@ #************************************************************ # WL6045:Improve Innochecksum #************************************************************ ---source include/have_innodb.inc ---source include/have_innodb_zip.inc +--source include/innodb_page_size_small.inc --source include/no_valgrind_without_big.inc @@ -16,7 +15,9 @@ let MYSQLD_BASEDIR= `SELECT @@basedir`; let MYSQLD_DATADIR= `SELECT @@datadir`; let SEARCH_FILE= $MYSQLTEST_VARDIR/log/my_restart.err; + call mtr.add_suppression("InnoDB: Unable to read tablespace .* page no .* into the buffer pool after 100 attempts"); +call mtr.add_suppression("InnoDB: innodb_checksum_algorithm is set to.*"); --echo [1]: Further Test are for rewrite checksum (innodb|crc32|none) for all ibd file & start the server. diff --git a/mysql-test/suite/innodb_zip/t/innodb-zip.test b/mysql-test/suite/innodb_zip/t/innodb-zip.test index 8a201cb37ae..a2b55144c61 100644 --- a/mysql-test/suite/innodb_zip/t/innodb-zip.test +++ b/mysql-test/suite/innodb_zip/t/innodb-zip.test @@ -1,4 +1,4 @@ --- source include/have_innodb.inc +--source include/innodb_page_size_small.inc CREATE DATABASE mysqltest_innodb_zip; USE mysqltest_innodb_zip; @@ -8,7 +8,6 @@ SELECT table_name, row_format, data_length, index_length let $per_table=`select @@innodb_file_per_table`; let $format=`select @@innodb_file_format`; -let $innodb_strict_mode_orig=`select @@session.innodb_strict_mode`; let $innodb_file_format_orig=`select @@innodb_file_format`; let $innodb_file_format_max_orig=`select @@innodb_file_format_max`; SET @save_innodb_stats_on_metadata=@@global.innodb_stats_on_metadata; @@ -354,7 +353,6 @@ drop table normal_table, zip_table; -- disable_query_log eval set global innodb_file_format=$format; eval set global innodb_file_per_table=$per_table; -eval set session innodb_strict_mode=$innodb_strict_mode_orig; eval SET GLOBAL innodb_file_format=$innodb_file_format_orig; eval SET GLOBAL innodb_file_format_max=$innodb_file_format_max_orig; SET @@global.innodb_stats_on_metadata=@save_innodb_stats_on_metadata; diff --git a/mysql-test/suite/innodb_zip/t/innodb_bug36169.opt b/mysql-test/suite/innodb_zip/t/innodb_bug36169.opt deleted file mode 100644 index 3a4e594f382..00000000000 --- a/mysql-test/suite/innodb_zip/t/innodb_bug36169.opt +++ /dev/null @@ -1 +0,0 @@ ---innodb_large_prefix=ON \ No newline at end of file diff --git a/mysql-test/suite/innodb_zip/t/innodb_bug36169.test b/mysql-test/suite/innodb_zip/t/innodb_bug36169.test deleted file mode 100644 index 93051d56639..00000000000 --- a/mysql-test/suite/innodb_zip/t/innodb_bug36169.test +++ /dev/null @@ -1,1153 +0,0 @@ ---source include/have_innodb.inc -# -# Bug#36169 create innodb compressed table with too large row size crashed -# http://bugs.mysql.com/36169 -# - -call mtr.add_suppression("Cannot add field .* in table .* because after adding it, the row size is .* which is greater than maximum allowed size .* for a record on index leaf page."); - -# -# The following is copied from http://bugs.mysql.com/36169 -# (http://bugs.mysql.com/file.php?id=9121) -# Probably it can be simplified but that is not obvious. -# - -# we care only that the following SQL commands do produce errors -# as expected and do not crash the server --- disable_query_log --- disable_result_log - -# Generating 10 tables -# Creating a table with 94 columns and 24 indexes -DROP TABLE IF EXISTS `table0`; -set innodb_strict_mode=on; ---error ER_TOO_BIG_ROWSIZE -CREATE TABLE IF NOT EXISTS `table0` -(`col0` BOOL, -`col1` BOOL, -`col2` TINYINT, -`col3` DATE, -`col4` TIME, -`col5` SET ('test1','test2','test3'), -`col6` TIME, -`col7` TEXT, -`col8` DECIMAL, -`col9` SET ('test1','test2','test3'), -`col10` FLOAT, -`col11` DOUBLE PRECISION, -`col12` ENUM ('test1','test2','test3'), -`col13` TINYBLOB, -`col14` YEAR, -`col15` SET ('test1','test2','test3'), -`col16` NUMERIC, -`col17` NUMERIC, -`col18` BLOB, -`col19` DATETIME, -`col20` DOUBLE PRECISION, -`col21` DECIMAL, -`col22` DATETIME, -`col23` NUMERIC, -`col24` NUMERIC, -`col25` LONGTEXT, -`col26` TINYBLOB, -`col27` TIME, -`col28` TINYBLOB, -`col29` ENUM ('test1','test2','test3'), -`col30` SMALLINT, -`col31` REAL, -`col32` FLOAT, -`col33` CHAR (175), -`col34` TINYTEXT, -`col35` TINYTEXT, -`col36` TINYBLOB, -`col37` TINYBLOB, -`col38` TINYTEXT, -`col39` MEDIUMBLOB, -`col40` TIMESTAMP, -`col41` DOUBLE, -`col42` SMALLINT, -`col43` LONGBLOB, -`col44` VARCHAR (80), -`col45` MEDIUMTEXT, -`col46` NUMERIC, -`col47` BIGINT, -`col48` DATE, -`col49` TINYBLOB, -`col50` DATE, -`col51` BOOL, -`col52` MEDIUMINT, -`col53` FLOAT, -`col54` TINYBLOB, -`col55` LONGTEXT, -`col56` SMALLINT, -`col57` ENUM ('test1','test2','test3'), -`col58` DATETIME, -`col59` MEDIUMTEXT, -`col60` VARCHAR (232), -`col61` NUMERIC, -`col62` YEAR, -`col63` SMALLINT, -`col64` TIMESTAMP, -`col65` BLOB, -`col66` LONGBLOB, -`col67` INT, -`col68` LONGTEXT, -`col69` ENUM ('test1','test2','test3'), -`col70` INT, -`col71` TIME, -`col72` TIMESTAMP, -`col73` TIMESTAMP, -`col74` VARCHAR (170), -`col75` SET ('test1','test2','test3'), -`col76` TINYBLOB, -`col77` BIGINT, -`col78` NUMERIC, -`col79` DATETIME, -`col80` YEAR, -`col81` NUMERIC, -`col82` LONGBLOB, -`col83` TEXT, -`col84` CHAR (83), -`col85` DECIMAL, -`col86` FLOAT, -`col87` INT, -`col88` VARCHAR (145), -`col89` DATE, -`col90` DECIMAL, -`col91` DECIMAL, -`col92` MEDIUMBLOB, -`col93` TIME, -KEY `idx0` (`col69`,`col90`,`col8`), -KEY `idx1` (`col60`), -KEY `idx2` (`col60`,`col70`,`col74`), -KEY `idx3` (`col22`,`col32`,`col72`,`col30`), -KEY `idx4` (`col29`), -KEY `idx5` (`col19`,`col45`(143)), -KEY `idx6` (`col46`,`col48`,`col5`,`col39`(118)), -KEY `idx7` (`col48`,`col61`), -KEY `idx8` (`col93`), -KEY `idx9` (`col31`), -KEY `idx10` (`col30`,`col21`), -KEY `idx11` (`col67`), -KEY `idx12` (`col44`,`col6`,`col8`,`col38`(226)), -KEY `idx13` (`col71`,`col41`,`col15`,`col49`(88)), -KEY `idx14` (`col78`), -KEY `idx15` (`col63`,`col67`,`col64`), -KEY `idx16` (`col17`,`col86`), -KEY `idx17` (`col77`,`col56`,`col10`,`col55`(24)), -KEY `idx18` (`col62`), -KEY `idx19` (`col31`,`col57`,`col56`,`col53`), -KEY `idx20` (`col46`), -KEY `idx21` (`col83`(54)), -KEY `idx22` (`col51`,`col7`(120)), -KEY `idx23` (`col7`(163),`col31`,`col71`,`col14`) -)engine=innodb ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; - -# Creating a table with 10 columns and 32 indexes -DROP TABLE IF EXISTS `table1`; ---error ER_TOO_BIG_ROWSIZE -CREATE TABLE IF NOT EXISTS `table1` -(`col0` CHAR (113), -`col1` FLOAT, -`col2` BIGINT, -`col3` DECIMAL, -`col4` BLOB, -`col5` LONGTEXT, -`col6` SET ('test1','test2','test3'), -`col7` BIGINT, -`col8` BIGINT, -`col9` TINYBLOB, -KEY `idx0` (`col5`(101),`col7`,`col8`), -KEY `idx1` (`col8`), -KEY `idx2` (`col4`(177),`col9`(126),`col6`,`col3`), -KEY `idx3` (`col5`(160)), -KEY `idx4` (`col9`(242)), -KEY `idx5` (`col4`(139),`col2`,`col3`), -KEY `idx6` (`col7`), -KEY `idx7` (`col6`,`col2`,`col0`,`col3`), -KEY `idx8` (`col9`(66)), -KEY `idx9` (`col5`(253)), -KEY `idx10` (`col1`,`col7`,`col2`), -KEY `idx11` (`col9`(242),`col0`,`col8`,`col5`(163)), -KEY `idx12` (`col8`), -KEY `idx13` (`col0`,`col9`(37)), -KEY `idx14` (`col0`), -KEY `idx15` (`col5`(111)), -KEY `idx16` (`col8`,`col0`,`col5`(13)), -KEY `idx17` (`col4`(139)), -KEY `idx18` (`col5`(189),`col2`,`col3`,`col9`(136)), -KEY `idx19` (`col0`,`col3`,`col1`,`col8`), -KEY `idx20` (`col8`), -KEY `idx21` (`col0`,`col7`,`col9`(227),`col3`), -KEY `idx22` (`col0`), -KEY `idx23` (`col2`), -KEY `idx24` (`col3`), -KEY `idx25` (`col2`,`col3`), -KEY `idx26` (`col0`), -KEY `idx27` (`col5`(254)), -KEY `idx28` (`col3`), -KEY `idx29` (`col3`), -KEY `idx30` (`col7`,`col3`,`col0`,`col4`(220)), -KEY `idx31` (`col4`(1),`col0`) -)engine=innodb ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; - -# Creating a table with 141 columns and 18 indexes -DROP TABLE IF EXISTS `table2`; ---error ER_TOO_BIG_ROWSIZE -CREATE TABLE IF NOT EXISTS `table2` -(`col0` BOOL, -`col1` MEDIUMINT, -`col2` VARCHAR (209), -`col3` MEDIUMBLOB, -`col4` CHAR (13), -`col5` DOUBLE, -`col6` TINYTEXT, -`col7` REAL, -`col8` SMALLINT, -`col9` BLOB, -`col10` TINYINT, -`col11` DECIMAL, -`col12` BLOB, -`col13` DECIMAL, -`col14` LONGBLOB, -`col15` SMALLINT, -`col16` LONGBLOB, -`col17` TINYTEXT, -`col18` FLOAT, -`col19` CHAR (78), -`col20` MEDIUMTEXT, -`col21` SET ('test1','test2','test3'), -`col22` MEDIUMINT, -`col23` INT, -`col24` MEDIUMBLOB, -`col25` ENUM ('test1','test2','test3'), -`col26` TINYBLOB, -`col27` VARCHAR (116), -`col28` TIMESTAMP, -`col29` BLOB, -`col30` SMALLINT, -`col31` DOUBLE PRECISION, -`col32` DECIMAL, -`col33` DECIMAL, -`col34` TEXT, -`col35` MEDIUMINT, -`col36` MEDIUMINT, -`col37` BIGINT, -`col38` VARCHAR (253), -`col39` TINYBLOB, -`col40` MEDIUMBLOB, -`col41` BIGINT, -`col42` DOUBLE, -`col43` TEXT, -`col44` BLOB, -`col45` TIME, -`col46` MEDIUMINT, -`col47` DOUBLE PRECISION, -`col48` SET ('test1','test2','test3'), -`col49` DOUBLE PRECISION, -`col50` VARCHAR (97), -`col51` TEXT, -`col52` NUMERIC, -`col53` ENUM ('test1','test2','test3'), -`col54` MEDIUMTEXT, -`col55` MEDIUMINT, -`col56` DATETIME, -`col57` DATETIME, -`col58` MEDIUMTEXT, -`col59` CHAR (244), -`col60` LONGBLOB, -`col61` MEDIUMBLOB, -`col62` DOUBLE, -`col63` SMALLINT, -`col64` BOOL, -`col65` SMALLINT, -`col66` VARCHAR (212), -`col67` TIME, -`col68` REAL, -`col69` BOOL, -`col70` BIGINT, -`col71` DATE, -`col72` TINYINT, -`col73` ENUM ('test1','test2','test3'), -`col74` DATE, -`col75` TIME, -`col76` DATETIME, -`col77` BOOL, -`col78` TINYTEXT, -`col79` MEDIUMINT, -`col80` NUMERIC, -`col81` LONGTEXT, -`col82` SET ('test1','test2','test3'), -`col83` DOUBLE PRECISION, -`col84` NUMERIC, -`col85` VARCHAR (184), -`col86` DOUBLE PRECISION, -`col87` MEDIUMTEXT, -`col88` MEDIUMBLOB, -`col89` BOOL, -`col90` SMALLINT, -`col91` TINYINT, -`col92` ENUM ('test1','test2','test3'), -`col93` BOOL, -`col94` TIMESTAMP, -`col95` BOOL, -`col96` MEDIUMTEXT, -`col97` DECIMAL, -`col98` BOOL, -`col99` DECIMAL, -`col100` MEDIUMINT, -`col101` DOUBLE PRECISION, -`col102` TINYINT, -`col103` BOOL, -`col104` MEDIUMINT, -`col105` DECIMAL, -`col106` NUMERIC, -`col107` TIMESTAMP, -`col108` MEDIUMBLOB, -`col109` TINYBLOB, -`col110` SET ('test1','test2','test3'), -`col111` YEAR, -`col112` TIMESTAMP, -`col113` CHAR (201), -`col114` BOOL, -`col115` TINYINT, -`col116` DOUBLE, -`col117` TINYINT, -`col118` TIMESTAMP, -`col119` SET ('test1','test2','test3'), -`col120` SMALLINT, -`col121` TINYBLOB, -`col122` TIMESTAMP, -`col123` BLOB, -`col124` DATE, -`col125` SMALLINT, -`col126` ENUM ('test1','test2','test3'), -`col127` MEDIUMBLOB, -`col128` DOUBLE PRECISION, -`col129` REAL, -`col130` VARCHAR (159), -`col131` MEDIUMBLOB, -`col132` BIGINT, -`col133` INT, -`col134` SET ('test1','test2','test3'), -`col135` CHAR (198), -`col136` SET ('test1','test2','test3'), -`col137` MEDIUMTEXT, -`col138` SMALLINT, -`col139` BLOB, -`col140` LONGBLOB, -KEY `idx0` (`col14`(139),`col24`(208),`col38`,`col35`), -KEY `idx1` (`col48`,`col118`,`col29`(131),`col100`), -KEY `idx2` (`col86`,`col67`,`col43`(175)), -KEY `idx3` (`col19`), -KEY `idx4` (`col40`(220),`col67`), -KEY `idx5` (`col99`,`col56`), -KEY `idx6` (`col68`,`col28`,`col137`(157)), -KEY `idx7` (`col51`(160),`col99`,`col45`,`col39`(9)), -KEY `idx8` (`col15`,`col52`,`col90`,`col94`), -KEY `idx9` (`col24`(3),`col139`(248),`col108`(118),`col41`), -KEY `idx10` (`col36`,`col92`,`col114`), -KEY `idx11` (`col115`,`col9`(116)), -KEY `idx12` (`col130`,`col93`,`col134`), -KEY `idx13` (`col123`(65)), -KEY `idx14` (`col44`(90),`col86`,`col119`), -KEY `idx15` (`col69`), -KEY `idx16` (`col132`,`col81`(118),`col18`), -KEY `idx17` (`col24`(250),`col7`,`col92`,`col45`) -)engine=innodb ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; - -# Creating a table with 199 columns and 1 indexes -DROP TABLE IF EXISTS `table3`; ---error ER_TOO_BIG_ROWSIZE -CREATE TABLE IF NOT EXISTS `table3` -(`col0` SMALLINT, -`col1` SET ('test1','test2','test3'), -`col2` TINYTEXT, -`col3` DOUBLE, -`col4` NUMERIC, -`col5` DATE, -`col6` BIGINT, -`col7` DOUBLE, -`col8` TEXT, -`col9` INT, -`col10` REAL, -`col11` TINYINT, -`col12` NUMERIC, -`col13` NUMERIC, -`col14` TIME, -`col15` DOUBLE, -`col16` REAL, -`col17` MEDIUMBLOB, -`col18` YEAR, -`col19` TINYTEXT, -`col20` YEAR, -`col21` CHAR (250), -`col22` TINYINT, -`col23` TINYINT, -`col24` SMALLINT, -`col25` DATETIME, -`col26` MEDIUMINT, -`col27` LONGBLOB, -`col28` VARCHAR (106), -`col29` FLOAT, -`col30` MEDIUMTEXT, -`col31` TINYBLOB, -`col32` BIGINT, -`col33` YEAR, -`col34` REAL, -`col35` MEDIUMBLOB, -`col36` LONGTEXT, -`col37` LONGBLOB, -`col38` BIGINT, -`col39` FLOAT, -`col40` TIME, -`col41` DATETIME, -`col42` BOOL, -`col43` BIGINT, -`col44` SMALLINT, -`col45` TIME, -`col46` DOUBLE PRECISION, -`col47` TIME, -`col48` TINYTEXT, -`col49` DOUBLE PRECISION, -`col50` BIGINT, -`col51` NUMERIC, -`col52` TINYBLOB, -`col53` DATE, -`col54` DECIMAL, -`col55` SMALLINT, -`col56` TINYTEXT, -`col57` ENUM ('test1','test2','test3'), -`col58` YEAR, -`col59` TIME, -`col60` TINYINT, -`col61` DECIMAL, -`col62` DOUBLE, -`col63` DATE, -`col64` LONGTEXT, -`col65` DOUBLE, -`col66` VARCHAR (88), -`col67` MEDIUMTEXT, -`col68` DATE, -`col69` MEDIUMINT, -`col70` DECIMAL, -`col71` MEDIUMTEXT, -`col72` LONGTEXT, -`col73` REAL, -`col74` DOUBLE, -`col75` TIME, -`col76` DATE, -`col77` DECIMAL, -`col78` MEDIUMBLOB, -`col79` NUMERIC, -`col80` BIGINT, -`col81` YEAR, -`col82` SMALLINT, -`col83` MEDIUMINT, -`col84` TINYINT, -`col85` MEDIUMBLOB, -`col86` TIME, -`col87` MEDIUMBLOB, -`col88` LONGTEXT, -`col89` BOOL, -`col90` BLOB, -`col91` LONGBLOB, -`col92` YEAR, -`col93` BLOB, -`col94` INT, -`col95` TINYTEXT, -`col96` TINYINT, -`col97` DECIMAL, -`col98` ENUM ('test1','test2','test3'), -`col99` MEDIUMINT, -`col100` TINYINT, -`col101` MEDIUMBLOB, -`col102` TINYINT, -`col103` SET ('test1','test2','test3'), -`col104` TIMESTAMP, -`col105` TEXT, -`col106` DATETIME, -`col107` MEDIUMTEXT, -`col108` CHAR (220), -`col109` TIME, -`col110` VARCHAR (131), -`col111` DECIMAL, -`col112` FLOAT, -`col113` SMALLINT, -`col114` BIGINT, -`col115` LONGBLOB, -`col116` SET ('test1','test2','test3'), -`col117` ENUM ('test1','test2','test3'), -`col118` BLOB, -`col119` MEDIUMTEXT, -`col120` SET ('test1','test2','test3'), -`col121` DATETIME, -`col122` FLOAT, -`col123` VARCHAR (242), -`col124` YEAR, -`col125` MEDIUMBLOB, -`col126` TIME, -`col127` BOOL, -`col128` TINYBLOB, -`col129` DOUBLE, -`col130` TINYINT, -`col131` BIGINT, -`col132` SMALLINT, -`col133` INT, -`col134` DOUBLE PRECISION, -`col135` MEDIUMBLOB, -`col136` SET ('test1','test2','test3'), -`col137` TINYTEXT, -`col138` DOUBLE PRECISION, -`col139` NUMERIC, -`col140` BLOB, -`col141` SET ('test1','test2','test3'), -`col142` INT, -`col143` VARCHAR (26), -`col144` BLOB, -`col145` REAL, -`col146` SET ('test1','test2','test3'), -`col147` LONGBLOB, -`col148` TEXT, -`col149` BLOB, -`col150` CHAR (189), -`col151` LONGTEXT, -`col152` INT, -`col153` FLOAT, -`col154` LONGTEXT, -`col155` DATE, -`col156` LONGBLOB, -`col157` TINYBLOB, -`col158` REAL, -`col159` DATE, -`col160` TIME, -`col161` YEAR, -`col162` DOUBLE, -`col163` VARCHAR (90), -`col164` FLOAT, -`col165` NUMERIC, -`col166` ENUM ('test1','test2','test3'), -`col167` DOUBLE PRECISION, -`col168` DOUBLE PRECISION, -`col169` TINYBLOB, -`col170` TIME, -`col171` SMALLINT, -`col172` TINYTEXT, -`col173` SMALLINT, -`col174` DOUBLE, -`col175` VARCHAR (14), -`col176` VARCHAR (90), -`col177` REAL, -`col178` MEDIUMINT, -`col179` TINYBLOB, -`col180` FLOAT, -`col181` TIMESTAMP, -`col182` REAL, -`col183` DOUBLE PRECISION, -`col184` BIGINT, -`col185` INT, -`col186` MEDIUMTEXT, -`col187` TIME, -`col188` FLOAT, -`col189` TIME, -`col190` INT, -`col191` FLOAT, -`col192` MEDIUMINT, -`col193` TINYINT, -`col194` MEDIUMTEXT, -`col195` DATE, -`col196` TIME, -`col197` YEAR, -`col198` CHAR (206), -KEY `idx0` (`col39`,`col23`) -)engine=innodb ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; - -# Creating a table with 133 columns and 16 indexes -DROP TABLE IF EXISTS `table4`; ---error ER_TOO_BIG_ROWSIZE -CREATE TABLE IF NOT EXISTS `table4` -(`col0` VARCHAR (60), -`col1` NUMERIC, -`col2` LONGTEXT, -`col3` MEDIUMTEXT, -`col4` LONGTEXT, -`col5` LONGBLOB, -`col6` LONGBLOB, -`col7` DATETIME, -`col8` TINYTEXT, -`col9` BLOB, -`col10` BOOL, -`col11` BIGINT, -`col12` TEXT, -`col13` VARCHAR (213), -`col14` TINYBLOB, -`col15` BOOL, -`col16` MEDIUMTEXT, -`col17` DOUBLE, -`col18` TEXT, -`col19` BLOB, -`col20` SET ('test1','test2','test3'), -`col21` TINYINT, -`col22` DATETIME, -`col23` TINYINT, -`col24` ENUM ('test1','test2','test3'), -`col25` REAL, -`col26` BOOL, -`col27` FLOAT, -`col28` LONGBLOB, -`col29` DATETIME, -`col30` FLOAT, -`col31` SET ('test1','test2','test3'), -`col32` LONGBLOB, -`col33` NUMERIC, -`col34` YEAR, -`col35` VARCHAR (146), -`col36` BIGINT, -`col37` DATETIME, -`col38` DATE, -`col39` SET ('test1','test2','test3'), -`col40` CHAR (112), -`col41` FLOAT, -`col42` YEAR, -`col43` TIME, -`col44` DOUBLE, -`col45` NUMERIC, -`col46` FLOAT, -`col47` DECIMAL, -`col48` BIGINT, -`col49` DECIMAL, -`col50` YEAR, -`col51` MEDIUMTEXT, -`col52` LONGBLOB, -`col53` SET ('test1','test2','test3'), -`col54` BLOB, -`col55` FLOAT, -`col56` REAL, -`col57` REAL, -`col58` TEXT, -`col59` MEDIUMBLOB, -`col60` INT, -`col61` INT, -`col62` DATE, -`col63` TEXT, -`col64` DATE, -`col65` ENUM ('test1','test2','test3'), -`col66` DOUBLE PRECISION, -`col67` TINYTEXT, -`col68` TINYBLOB, -`col69` FLOAT, -`col70` BLOB, -`col71` DATETIME, -`col72` DOUBLE, -`col73` LONGTEXT, -`col74` TIME, -`col75` DATETIME, -`col76` VARCHAR (122), -`col77` MEDIUMTEXT, -`col78` MEDIUMTEXT, -`col79` BOOL, -`col80` LONGTEXT, -`col81` TINYTEXT, -`col82` NUMERIC, -`col83` DOUBLE PRECISION, -`col84` DATE, -`col85` YEAR, -`col86` BLOB, -`col87` TINYTEXT, -`col88` DOUBLE PRECISION, -`col89` MEDIUMINT, -`col90` MEDIUMTEXT, -`col91` NUMERIC, -`col92` DATETIME, -`col93` NUMERIC, -`col94` SET ('test1','test2','test3'), -`col95` TINYTEXT, -`col96` SET ('test1','test2','test3'), -`col97` YEAR, -`col98` MEDIUMINT, -`col99` TEXT, -`col100` TEXT, -`col101` TIME, -`col102` VARCHAR (225), -`col103` TINYTEXT, -`col104` TEXT, -`col105` MEDIUMTEXT, -`col106` TINYINT, -`col107` TEXT, -`col108` LONGBLOB, -`col109` LONGTEXT, -`col110` TINYTEXT, -`col111` CHAR (56), -`col112` YEAR, -`col113` ENUM ('test1','test2','test3'), -`col114` TINYBLOB, -`col115` DATETIME, -`col116` DATE, -`col117` TIME, -`col118` MEDIUMTEXT, -`col119` DOUBLE PRECISION, -`col120` FLOAT, -`col121` TIMESTAMP, -`col122` MEDIUMINT, -`col123` YEAR, -`col124` DATE, -`col125` TEXT, -`col126` FLOAT, -`col127` TINYTEXT, -`col128` BOOL, -`col129` NUMERIC, -`col130` TIMESTAMP, -`col131` INT, -`col132` MEDIUMBLOB, -KEY `idx0` (`col130`), -KEY `idx1` (`col30`,`col55`,`col19`(31)), -KEY `idx2` (`col104`(186)), -KEY `idx3` (`col131`), -KEY `idx4` (`col64`,`col93`,`col2`(11)), -KEY `idx5` (`col34`,`col121`,`col22`), -KEY `idx6` (`col33`,`col55`,`col83`), -KEY `idx7` (`col17`,`col87`(245),`col99`(17)), -KEY `idx8` (`col65`,`col120`), -KEY `idx9` (`col82`), -KEY `idx10` (`col9`(72)), -KEY `idx11` (`col88`), -KEY `idx12` (`col128`,`col9`(200),`col71`,`col66`), -KEY `idx13` (`col77`(126)), -KEY `idx14` (`col105`(26),`col13`,`col117`), -KEY `idx15` (`col4`(246),`col130`,`col115`,`col3`(141)) -)engine=innodb ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; - -# Creating a table with 176 columns and 13 indexes -DROP TABLE IF EXISTS `table5`; ---error ER_TOO_BIG_ROWSIZE -CREATE TABLE IF NOT EXISTS `table5` -(`col0` MEDIUMTEXT, -`col1` VARCHAR (90), -`col2` TINYTEXT, -`col3` TIME, -`col4` BOOL, -`col5` TINYTEXT, -`col6` BOOL, -`col7` TIMESTAMP, -`col8` TINYBLOB, -`col9` TINYINT, -`col10` YEAR, -`col11` SET ('test1','test2','test3'), -`col12` TEXT, -`col13` CHAR (248), -`col14` BIGINT, -`col15` TEXT, -`col16` TINYINT, -`col17` NUMERIC, -`col18` SET ('test1','test2','test3'), -`col19` LONGBLOB, -`col20` FLOAT, -`col21` INT, -`col22` TEXT, -`col23` BOOL, -`col24` DECIMAL, -`col25` DOUBLE PRECISION, -`col26` FLOAT, -`col27` TINYBLOB, -`col28` NUMERIC, -`col29` MEDIUMBLOB, -`col30` DATE, -`col31` LONGTEXT, -`col32` DATE, -`col33` FLOAT, -`col34` BIGINT, -`col35` TINYTEXT, -`col36` MEDIUMTEXT, -`col37` TIME, -`col38` INT, -`col39` TINYINT, -`col40` SET ('test1','test2','test3'), -`col41` CHAR (130), -`col42` SMALLINT, -`col43` INT, -`col44` MEDIUMTEXT, -`col45` VARCHAR (126), -`col46` INT, -`col47` DOUBLE PRECISION, -`col48` BIGINT, -`col49` MEDIUMTEXT, -`col50` TINYBLOB, -`col51` MEDIUMINT, -`col52` TEXT, -`col53` VARCHAR (208), -`col54` VARCHAR (207), -`col55` NUMERIC, -`col56` DATETIME, -`col57` ENUM ('test1','test2','test3'), -`col58` NUMERIC, -`col59` TINYBLOB, -`col60` VARCHAR (73), -`col61` MEDIUMTEXT, -`col62` TINYBLOB, -`col63` DATETIME, -`col64` NUMERIC, -`col65` MEDIUMINT, -`col66` DATETIME, -`col67` NUMERIC, -`col68` TINYINT, -`col69` VARCHAR (58), -`col70` DECIMAL, -`col71` MEDIUMTEXT, -`col72` DATE, -`col73` TIME, -`col74` DOUBLE PRECISION, -`col75` DECIMAL, -`col76` MEDIUMBLOB, -`col77` REAL, -`col78` YEAR, -`col79` YEAR, -`col80` LONGBLOB, -`col81` BLOB, -`col82` BIGINT, -`col83` ENUM ('test1','test2','test3'), -`col84` NUMERIC, -`col85` SET ('test1','test2','test3'), -`col86` MEDIUMTEXT, -`col87` LONGBLOB, -`col88` TIME, -`col89` ENUM ('test1','test2','test3'), -`col90` DECIMAL, -`col91` FLOAT, -`col92` DATETIME, -`col93` TINYTEXT, -`col94` TIMESTAMP, -`col95` TIMESTAMP, -`col96` TEXT, -`col97` REAL, -`col98` VARCHAR (198), -`col99` TIME, -`col100` TINYINT, -`col101` BIGINT, -`col102` LONGBLOB, -`col103` LONGBLOB, -`col104` MEDIUMINT, -`col105` MEDIUMTEXT, -`col106` TIMESTAMP, -`col107` SMALLINT, -`col108` NUMERIC, -`col109` DECIMAL, -`col110` FLOAT, -`col111` DECIMAL, -`col112` REAL, -`col113` TINYTEXT, -`col114` FLOAT, -`col115` VARCHAR (7), -`col116` LONGTEXT, -`col117` DATE, -`col118` BIGINT, -`col119` TEXT, -`col120` BIGINT, -`col121` BLOB, -`col122` CHAR (110), -`col123` NUMERIC, -`col124` MEDIUMBLOB, -`col125` NUMERIC, -`col126` NUMERIC, -`col127` BOOL, -`col128` TIME, -`col129` TINYBLOB, -`col130` TINYBLOB, -`col131` DATE, -`col132` INT, -`col133` VARCHAR (123), -`col134` CHAR (238), -`col135` VARCHAR (225), -`col136` LONGTEXT, -`col137` LONGBLOB, -`col138` REAL, -`col139` TINYBLOB, -`col140` DATETIME, -`col141` TINYTEXT, -`col142` LONGBLOB, -`col143` BIGINT, -`col144` VARCHAR (236), -`col145` TEXT, -`col146` YEAR, -`col147` DECIMAL, -`col148` TEXT, -`col149` MEDIUMBLOB, -`col150` TINYINT, -`col151` BOOL, -`col152` VARCHAR (72), -`col153` INT, -`col154` VARCHAR (165), -`col155` TINYINT, -`col156` MEDIUMTEXT, -`col157` DOUBLE PRECISION, -`col158` TIME, -`col159` MEDIUMBLOB, -`col160` LONGBLOB, -`col161` DATETIME, -`col162` DOUBLE PRECISION, -`col163` BLOB, -`col164` ENUM ('test1','test2','test3'), -`col165` TIMESTAMP, -`col166` DATE, -`col167` TINYBLOB, -`col168` TINYBLOB, -`col169` LONGBLOB, -`col170` DATETIME, -`col171` BIGINT, -`col172` VARCHAR (30), -`col173` LONGTEXT, -`col174` TIME, -`col175` FLOAT, -KEY `idx0` (`col16`,`col156`(139),`col97`,`col120`), -KEY `idx1` (`col24`,`col0`(108)), -KEY `idx2` (`col117`,`col173`(34),`col132`,`col82`), -KEY `idx3` (`col2`(86)), -KEY `idx4` (`col2`(43)), -KEY `idx5` (`col83`,`col35`(87),`col111`), -KEY `idx6` (`col6`,`col134`,`col92`), -KEY `idx7` (`col56`), -KEY `idx8` (`col30`,`col53`,`col129`(66)), -KEY `idx9` (`col53`,`col113`(211),`col32`,`col15`(75)), -KEY `idx10` (`col34`), -KEY `idx11` (`col126`), -KEY `idx12` (`col24`) -)engine=innodb ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; - -# Creating a table with 179 columns and 46 indexes -DROP TABLE IF EXISTS `table6`; --- error ER_TOO_BIG_ROWSIZE ---error ER_TOO_BIG_ROWSIZE -CREATE TABLE IF NOT EXISTS `table6` -(`col0` ENUM ('test1','test2','test3'), -`col1` MEDIUMBLOB, -`col2` MEDIUMBLOB, -`col3` DATETIME, -`col4` DATE, -`col5` YEAR, -`col6` REAL, -`col7` NUMERIC, -`col8` MEDIUMBLOB, -`col9` TEXT, -`col10` TIMESTAMP, -`col11` DOUBLE, -`col12` DOUBLE, -`col13` SMALLINT, -`col14` TIMESTAMP, -`col15` DECIMAL, -`col16` DATE, -`col17` TEXT, -`col18` LONGBLOB, -`col19` BIGINT, -`col20` FLOAT, -`col21` DATETIME, -`col22` TINYINT, -`col23` MEDIUMBLOB, -`col24` SET ('test1','test2','test3'), -`col25` TIME, -`col26` TEXT, -`col27` LONGTEXT, -`col28` BIGINT, -`col29` REAL, -`col30` YEAR, -`col31` MEDIUMBLOB, -`col32` MEDIUMINT, -`col33` FLOAT, -`col34` TEXT, -`col35` DATE, -`col36` TIMESTAMP, -`col37` REAL, -`col38` BLOB, -`col39` BLOB, -`col40` BLOB, -`col41` TINYBLOB, -`col42` INT, -`col43` TINYINT, -`col44` REAL, -`col45` BIGINT, -`col46` TIMESTAMP, -`col47` BLOB, -`col48` ENUM ('test1','test2','test3'), -`col49` BOOL, -`col50` CHAR (109), -`col51` DOUBLE, -`col52` DOUBLE PRECISION, -`col53` ENUM ('test1','test2','test3'), -`col54` FLOAT, -`col55` DOUBLE PRECISION, -`col56` CHAR (166), -`col57` TEXT, -`col58` TIME, -`col59` DECIMAL, -`col60` TEXT, -`col61` ENUM ('test1','test2','test3'), -`col62` LONGTEXT, -`col63` YEAR, -`col64` DOUBLE, -`col65` CHAR (87), -`col66` DATE, -`col67` BOOL, -`col68` MEDIUMBLOB, -`col69` DATETIME, -`col70` DECIMAL, -`col71` TIME, -`col72` REAL, -`col73` LONGTEXT, -`col74` BLOB, -`col75` REAL, -`col76` INT, -`col77` INT, -`col78` FLOAT, -`col79` DOUBLE, -`col80` MEDIUMINT, -`col81` ENUM ('test1','test2','test3'), -`col82` VARCHAR (221), -`col83` BIGINT, -`col84` TINYINT, -`col85` BIGINT, -`col86` FLOAT, -`col87` MEDIUMBLOB, -`col88` CHAR (126), -`col89` MEDIUMBLOB, -`col90` DATETIME, -`col91` TINYINT, -`col92` DOUBLE, -`col93` NUMERIC, -`col94` DATE, -`col95` BLOB, -`col96` DATETIME, -`col97` TIME, -`col98` LONGBLOB, -`col99` INT, -`col100` SET ('test1','test2','test3'), -`col101` TINYBLOB, -`col102` INT, -`col103` MEDIUMBLOB, -`col104` MEDIUMTEXT, -`col105` FLOAT, -`col106` TINYBLOB, -`col107` VARCHAR (26), -`col108` TINYINT, -`col109` TIME, -`col110` TINYBLOB, -`col111` LONGBLOB, -`col112` TINYTEXT, -`col113` FLOAT, -`col114` TINYINT, -`col115` NUMERIC, -`col116` TIME, -`col117` SET ('test1','test2','test3'), -`col118` DATE, -`col119` SMALLINT, -`col120` BLOB, -`col121` TINYTEXT, -`col122` REAL, -`col123` YEAR, -`col124` REAL, -`col125` BOOL, -`col126` BLOB, -`col127` REAL, -`col128` MEDIUMBLOB, -`col129` TIMESTAMP, -`col130` LONGBLOB, -`col131` MEDIUMBLOB, -`col132` YEAR, -`col133` YEAR, -`col134` INT, -`col135` MEDIUMINT, -`col136` MEDIUMINT, -`col137` TINYTEXT, -`col138` TINYBLOB, -`col139` BLOB, -`col140` SET ('test1','test2','test3'), -`col141` ENUM ('test1','test2','test3'), -`col142` ENUM ('test1','test2','test3'), -`col143` TINYTEXT, -`col144` DATETIME, -`col145` TEXT, -`col146` DOUBLE PRECISION, -`col147` DECIMAL, -`col148` MEDIUMTEXT, -`col149` TINYTEXT, -`col150` SET ('test1','test2','test3'), -`col151` MEDIUMTEXT, -`col152` CHAR (126), -`col153` DOUBLE, -`col154` CHAR (243), -`col155` SET ('test1','test2','test3'), -`col156` SET ('test1','test2','test3'), -`col157` DATETIME, -`col158` DOUBLE, -`col159` NUMERIC, -`col160` DECIMAL, -`col161` FLOAT, -`col162` LONGBLOB, -`col163` LONGTEXT, -`col164` INT, -`col165` TIME, -`col166` CHAR (27), -`col167` VARCHAR (63), -`col168` TEXT, -`col169` TINYBLOB, -`col170` TINYBLOB, -`col171` ENUM ('test1','test2','test3'), -`col172` INT, -`col173` TIME, -`col174` DECIMAL, -`col175` DOUBLE, -`col176` MEDIUMBLOB, -`col177` LONGBLOB, -`col178` CHAR (43), -KEY `idx0` (`col131`(219)), -KEY `idx1` (`col67`,`col122`,`col59`,`col87`(33)), -KEY `idx2` (`col83`,`col42`,`col57`(152)), -KEY `idx3` (`col106`(124)), -KEY `idx4` (`col173`,`col80`,`col165`,`col89`(78)), -KEY `idx5` (`col174`,`col145`(108),`col23`(228),`col141`), -KEY `idx6` (`col157`,`col140`), -KEY `idx7` (`col130`(188),`col15`), -KEY `idx8` (`col52`), -KEY `idx9` (`col144`), -KEY `idx10` (`col155`), -KEY `idx11` (`col62`(230),`col1`(109)), -KEY `idx12` (`col151`(24),`col95`(85)), -KEY `idx13` (`col114`), -KEY `idx14` (`col42`,`col98`(56),`col146`), -KEY `idx15` (`col147`,`col39`(254),`col35`), -KEY `idx16` (`col79`), -KEY `idx17` (`col65`), -KEY `idx18` (`col149`(165),`col168`(119),`col32`,`col117`), -KEY `idx19` (`col64`), -KEY `idx20` (`col93`), -KEY `idx21` (`col64`,`col113`,`col104`(182)), -KEY `idx22` (`col52`,`col111`(189)), -KEY `idx23` (`col45`), -KEY `idx24` (`col154`,`col107`,`col110`(159)), -KEY `idx25` (`col149`(1),`col87`(131)), -KEY `idx26` (`col58`,`col115`,`col63`), -KEY `idx27` (`col95`(9),`col0`,`col87`(113)), -KEY `idx28` (`col92`,`col130`(1)), -KEY `idx29` (`col151`(129),`col137`(254),`col13`), -KEY `idx30` (`col49`), -KEY `idx31` (`col28`), -KEY `idx32` (`col83`,`col146`), -KEY `idx33` (`col155`,`col90`,`col17`(245)), -KEY `idx34` (`col174`,`col169`(44),`col107`), -KEY `idx35` (`col113`), -KEY `idx36` (`col52`), -KEY `idx37` (`col16`,`col120`(190)), -KEY `idx38` (`col28`), -KEY `idx39` (`col131`(165)), -KEY `idx40` (`col135`,`col26`(86)), -KEY `idx41` (`col69`,`col94`), -KEY `idx42` (`col105`,`col151`(38),`col97`), -KEY `idx43` (`col88`), -KEY `idx44` (`col176`(100),`col42`,`col73`(189),`col94`), -KEY `idx45` (`col2`(27),`col27`(116)) -)engine=innodb ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; - -DROP TABLE IF EXISTS table0; -DROP TABLE IF EXISTS table1; -DROP TABLE IF EXISTS table2; -DROP TABLE IF EXISTS table3; -DROP TABLE IF EXISTS table4; -DROP TABLE IF EXISTS table5; -DROP TABLE IF EXISTS table6; diff --git a/mysql-test/suite/innodb_zip/t/innodb_bug36172.test b/mysql-test/suite/innodb_zip/t/innodb_bug36172.test deleted file mode 100644 index 622e0c56b15..00000000000 --- a/mysql-test/suite/innodb_zip/t/innodb_bug36172.test +++ /dev/null @@ -1,22 +0,0 @@ ---source include/have_innodb.inc -# -# Test case for bug 36172 -# - --- source include/not_embedded.inc - -SET storage_engine=InnoDB; - -# we do not really care about what gets printed, we are only -# interested in getting success or failure according to our -# expectations - --- disable_query_log --- disable_result_log - -CREATE TABLE `table0` ( `col0` tinyint(1) DEFAULT NULL, `col1` tinyint(1) DEFAULT NULL, `col2` tinyint(4) DEFAULT NULL, `col3` date DEFAULT NULL, `col4` time DEFAULT NULL, `col5` set('test1','test2','test3') DEFAULT NULL, `col6` time DEFAULT NULL, `col7` text, `col8` decimal(10,0) DEFAULT NULL, `col9` set('test1','test2','test3') DEFAULT NULL, `col10` float DEFAULT NULL, `col11` double DEFAULT NULL, `col12` enum('test1','test2','test3') DEFAULT NULL, `col13` tinyblob, `col14` year(4) DEFAULT NULL, `col15` set('test1','test2','test3') DEFAULT NULL, `col16` decimal(10,0) DEFAULT NULL, `col17` decimal(10,0) DEFAULT NULL, `col18` blob, `col19` datetime DEFAULT NULL, `col20` double DEFAULT NULL, `col21` decimal(10,0) DEFAULT NULL, `col22` datetime DEFAULT NULL, `col23` decimal(10,0) DEFAULT NULL, `col24` decimal(10,0) DEFAULT NULL, `col25` longtext, `col26` tinyblob, `col27` time DEFAULT NULL, `col28` tinyblob, `col29` enum('test1','test2','test3') DEFAULT NULL, `col30` smallint(6) DEFAULT NULL, `col31` double DEFAULT NULL, `col32` float DEFAULT NULL, `col33` char(175) DEFAULT NULL, `col34` tinytext, `col35` tinytext, `col36` tinyblob, `col37` tinyblob, `col38` tinytext, `col39` mediumblob, `col40` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `col41` double DEFAULT NULL, `col42` smallint(6) DEFAULT NULL, `col43` longblob, `col44` varchar(80) DEFAULT NULL, `col45` mediumtext, `col46` decimal(10,0) DEFAULT NULL, `col47` bigint(20) DEFAULT NULL, `col48` date DEFAULT NULL, `col49` tinyblob, `col50` date DEFAULT NULL, `col51` tinyint(1) DEFAULT NULL, `col52` mediumint(9) DEFAULT NULL, `col53` float DEFAULT NULL, `col54` tinyblob, `col55` longtext, `col56` smallint(6) DEFAULT NULL, `col57` enum('test1','test2','test3') DEFAULT NULL, `col58` datetime DEFAULT NULL, `col59` mediumtext, `col60` varchar(232) DEFAULT NULL, `col61` decimal(10,0) DEFAULT NULL, `col62` year(4) DEFAULT NULL, `col63` smallint(6) DEFAULT NULL, `col64` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `col65` blob, `col66` longblob, `col67` int(11) DEFAULT NULL, `col68` longtext, `col69` enum('test1','test2','test3') DEFAULT NULL, `col70` int(11) DEFAULT NULL, `col71` time DEFAULT NULL, `col72` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `col73` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `col74` varchar(170) DEFAULT NULL, `col75` set('test1','test2','test3') DEFAULT NULL, `col76` tinyblob, `col77` bigint(20) DEFAULT NULL, `col78` decimal(10,0) DEFAULT NULL, `col79` datetime DEFAULT NULL, `col80` year(4) DEFAULT NULL, `col81` decimal(10,0) DEFAULT NULL, `col82` longblob, `col83` text, `col84` char(83) DEFAULT NULL, `col85` decimal(10,0) DEFAULT NULL, `col86` float DEFAULT NULL, `col87` int(11) DEFAULT NULL, `col88` varchar(145) DEFAULT NULL, `col89` date DEFAULT NULL, `col90` decimal(10,0) DEFAULT NULL, `col91` decimal(10,0) DEFAULT NULL, `col92` mediumblob, `col93` time DEFAULT NULL, KEY `idx0` (`col69`,`col90`,`col8`), KEY `idx1` (`col60`), KEY `idx2` (`col60`,`col70`,`col74`), KEY `idx3` (`col22`,`col32`,`col72`,`col30`), KEY `idx4` (`col29`), KEY `idx5` (`col19`,`col45`(143)), KEY `idx6` (`col46`,`col48`,`col5`,`col39`(118)), KEY `idx7` (`col48`,`col61`), KEY `idx8` (`col93`), KEY `idx9` (`col31`), KEY `idx10` (`col30`,`col21`), KEY `idx11` (`col67`), KEY `idx12` (`col44`,`col6`,`col8`,`col38`(226)), KEY `idx13` (`col71`,`col41`,`col15`,`col49`(88)), KEY `idx14` (`col78`), KEY `idx15` (`col63`,`col67`,`col64`), KEY `idx16` (`col17`,`col86`), KEY `idx17` (`col77`,`col56`,`col10`,`col55`(24)), KEY `idx18` (`col62`), KEY `idx19` (`col31`,`col57`,`col56`,`col53`), KEY `idx20` (`col46`), KEY `idx21` (`col83`(54)), KEY `idx22` (`col51`,`col7`(120)), KEY `idx23` (`col7`(163),`col31`,`col71`,`col14`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=2; -insert ignore into `table0` set `col23` = 7887371.5084383683, `col24` = 4293854615.6906948000, `col25` = 'vitalist', `col26` = 'widespread', `col27` = '3570490', `col28` = 'habitual', `col30` = -5471, `col31` = 4286985783.6771750000, `col32` = 6354540.9826654866, `col33` = 'defoliation', `col34` = 'logarithms', `col35` = 'tegument\'s', `col36` = 'scouting\'s', `col37` = 'intermittency', `col38` = 'elongates', `col39` = 'prophecies', `col40` = '20560103035939', `col41` = 4292809130.0544143000, `col42` = 22057, `col43` = 'Hess\'s', `col44` = 'bandstand', `col45` = 'phenylketonuria', `col46` = 6338767.4018677324, `col47` = 5310247, `col48` = '12592418', `col49` = 'churchman\'s', `col50` = '32226125', `col51` = -58, `col52` = -6207968, `col53` = 1244839.3255104220, `col54` = 'robotized', `col55` = 'monotonous', `col56` = -26909, `col58` = '20720107023550', `col59` = 'suggestiveness\'s', `col60` = 'gemology', `col61` = 4287800670.2229986000, `col62` = '1944', `col63` = -16827, `col64` = '20700107212324', `col65` = 'Nicolais', `col66` = 'apteryx', `col67` = 6935317, `col68` = 'stroganoff', `col70` = 3316430, `col71` = '3277608', `col72` = '19300511045918', `col73` = '20421201003327', `col74` = 'attenuant', `col75` = '15173', `col76` = 'upstroke\'s', `col77` = 8118987, `col78` = 6791516.2735374002, `col79` = '20780701144624', `col80` = '2134', `col81` = 4290682351.3127537000, `col82` = 'unexplainably', `col83` = 'Storm', `col84` = 'Greyso\'s', `col85` = 4289119212.4306774000, `col86` = 7617575.8796655172, `col87` = -6325335, `col88` = 'fondue\'s', `col89` = '40608940', `col90` = 1659421.8093508712, `col91` = 8346904.6584368423, `col92` = 'reloads', `col93` = '5188366'; -CHECK TABLE table0 EXTENDED; -INSERT IGNORE INTO `table0` SET `col19` = '19940127002709', `col20` = 2383927.9055146948, `col21` = 4293243420.5621204000, `col22` = '20511211123705', `col23` = 4289899778.6573381000, `col24` = 4293449279.0540481000, `col25` = 'emphysemic', `col26` = 'dentally', `col27` = '2347406', `col28` = 'eruct', `col30` = 1222, `col31` = 4294372994.9941406000, `col32` = 4291385574.1173744000, `col33` = 'borrowing\'s', `col34` = 'septics', `col35` = 'ratter\'s', `col36` = 'Kaye', `col37` = 'Florentia', `col38` = 'allium', `col39` = 'barkeep', `col40` = '19510407003441', `col41` = 4293559200.4215522000, `col42` = 22482, `col43` = 'decussate', `col44` = 'Brom\'s', `col45` = 'violated', `col46` = 4925506.4635456400, `col47` = 930549, `col48` = '51296066', `col49` = 'voluminously', `col50` = '29306676', `col51` = -88, `col52` = -2153690, `col53` = 4290250202.1464887000, `col54` = 'expropriation', `col55` = 'Aberdeen\'s', `col56` = 20343, `col58` = '19640415171532', `col59` = 'extern', `col60` = 'Ubana', `col61` = 4290487961.8539081000, `col62` = '2147', `col63` = -24271, `col64` = '20750801194548', `col65` = 'Cunaxa\'s', `col66` = 'pasticcio', `col67` = 2795817, `col68` = 'Indore\'s', `col70` = 6864127, `col71` = '1817832', `col72` = '20540506114211', `col73` = '20040101012300', `col74` = 'rationalized', `col75` = '45522', `col76` = 'indene', `col77` = -6964559, `col78` = 4247535.5266884370, `col79` = '20720416124357', `col80` = '2143', `col81` = 4292060102.4466386000, `col82` = 'striving', `col83` = 'boneblack\'s', `col84` = 'redolent', `col85` = 6489697.9009369183, `col86` = 4287473465.9731131000, `col87` = 7726015, `col88` = 'perplexed', `col89` = '17153791', `col90` = 5478587.1108127078, `col91` = 4287091404.7004304000, `col92` = 'Boulez\'s', `col93` = '2931278'; -CHECK TABLE table0 EXTENDED; -DROP TABLE table0; diff --git a/mysql-test/suite/innodb_zip/t/innodb_bug52745.test b/mysql-test/suite/innodb_zip/t/innodb_bug52745.test deleted file mode 100644 index 5882278ab9b..00000000000 --- a/mysql-test/suite/innodb_zip/t/innodb_bug52745.test +++ /dev/null @@ -1,100 +0,0 @@ --- source include/have_innodb.inc - -SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR -CREATE TABLE bug52745 ( - a2 int(10) unsigned DEFAULT NULL, - col37 time DEFAULT NULL, - col38 char(229) CHARACTER SET utf8 DEFAULT NULL, - col39 text, - col40 timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - col41 int(10) unsigned DEFAULT NULL, - col42 varchar(248) CHARACTER SET utf8 DEFAULT NULL, - col43 smallint(5) unsigned zerofill DEFAULT NULL, - col44 varchar(150) CHARACTER SET utf8 DEFAULT NULL, - col45 float unsigned zerofill DEFAULT NULL, - col46 binary(1) DEFAULT NULL, - col47 tinyint(4) DEFAULT NULL, - col48 tinyint(1) DEFAULT NULL, - col49 timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', - col50 binary(1) DEFAULT NULL, - col51 double unsigned zerofill DEFAULT NULL, - col52 int(10) unsigned DEFAULT NULL, - col53 time DEFAULT NULL, - col54 double unsigned DEFAULT NULL, - col55 time DEFAULT NULL, - col56 mediumtext CHARACTER SET latin2, - col57 blob, - col58 decimal(52,16) unsigned zerofill NOT NULL DEFAULT '000000000000000000000000000000000000.0000000000000000', - col59 binary(1) DEFAULT NULL, - col60 longblob, - col61 time DEFAULT NULL, - col62 longtext CHARACTER SET utf8 COLLATE utf8_persian_ci, - col63 timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', - col64 int(10) unsigned DEFAULT NULL, - col65 date DEFAULT NULL, - col66 timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', - col67 binary(1) DEFAULT NULL, - col68 tinyblob, - col69 date DEFAULT NULL, - col70 tinyint(3) unsigned zerofill DEFAULT NULL, - col71 varchar(44) CHARACTER SET utf8 DEFAULT NULL, - col72 datetime DEFAULT NULL, - col73 smallint(5) unsigned zerofill DEFAULT NULL, - col74 longblob, - col75 bit(34) DEFAULT NULL, - col76 float unsigned zerofill DEFAULT NULL, - col77 year(2) DEFAULT NULL, - col78 tinyint(3) unsigned DEFAULT NULL, - col79 set('msfheowh','tbpxbgf','by','wahnrjw','myqfasxz','rsokyumrt') CHARACTER SET latin2 DEFAULT NULL, - col80 datetime DEFAULT NULL, - col81 smallint(6) DEFAULT NULL, - col82 enum('xtaurnqfqz','rifrse','kuzwpbvb','niisabk','zxavro','rbvasv','','uulrfaove','','') DEFAULT NULL, - col83 bigint(20) unsigned zerofill DEFAULT NULL, - col84 float unsigned zerofill DEFAULT NULL, - col85 double DEFAULT NULL, - col86 enum('ylannv','','vlkhycqc','snke','cxifustp','xiaxaswzp','oxl') CHARACTER SET latin1 COLLATE latin1_german2_ci DEFAULT NULL, - col87 varbinary(221) DEFAULT NULL, - col88 double unsigned DEFAULT NULL, - col89 float unsigned zerofill DEFAULT NULL, - col90 tinyblob -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; - -INSERT IGNORE INTO bug52745 SET -col40='0000-00-00 00:00:00', -col51=16547, -col53='7711484', -col54=-28604, -col55='7112612', -col56='wakefulness\'', -col57=repeat('absorbefacient\'',106), -col58=11027, -col59='AM09gW7', -col60=repeat('Noelani\'',16), -col61='2520576', -col62='substitutiv', -col63='19950106155112', -col64=-12038, -col65='86238806', -col66='19600719080256', -col68=repeat('Sagittarius\'',54), -col69='38943902', -col70=1232, -col71='Elora\'', -col74=repeat('zipp',11), -col75='0', -col76=23254, -col78=13247, -col79='56219', -col80='20500609035724', -col81=11632, -col82=7, -col84=-23863, -col85=6341, -col87='HZdkf.4 s7t,5Rmq 8so fmr,ruGLUG25TrtI.yQ 2SuHq0ML7rw7.4 b2yf2E5TJxOtBBZImezDnzpj,uPYfznnEUDN1e9aQoO 2DsplB7TFWy oQJ br HLF :F,eQ p4i1oWsr lL3PG,hjCz6hYqN h1QTjLCjrv:QCdSzpYBibJAtZCxLOk3l6Blsh.W', -col88=16894, -col89=6161, -col90=repeat('gale',48); - -SHOW WARNINGS; - -DROP TABLE bug52745; diff --git a/mysql-test/suite/innodb_zip/t/innodb_bug53591.test b/mysql-test/suite/innodb_zip/t/innodb_bug53591.test deleted file mode 100644 index 1366e0e43ac..00000000000 --- a/mysql-test/suite/innodb_zip/t/innodb_bug53591.test +++ /dev/null @@ -1,16 +0,0 @@ --- source include/have_innodb.inc - -SET GLOBAL innodb_strict_mode=on; -set old_alter_table=0; - -CREATE TABLE bug53591(a text charset utf8 not null) -ENGINE=InnoDB KEY_BLOCK_SIZE=1; --- replace_result 8126 {checked_valid} 4030 {checked_valid} 1982 {checked_valid} --- error ER_TOO_BIG_ROWSIZE -ALTER TABLE bug53591 ADD PRIMARY KEY(a(220)); --- replace_result 8126 {checked_valid} 4030 {checked_valid} 1982 {checked_valid} -SHOW WARNINGS; - -DROP TABLE bug53591; - -SET GLOBAL innodb_strict_mode=DEFAULT; diff --git a/mysql-test/suite/innodb_zip/t/innodb_bug56680.test b/mysql-test/suite/innodb_zip/t/innodb_bug56680.test deleted file mode 100644 index 4e73b1fce0f..00000000000 --- a/mysql-test/suite/innodb_zip/t/innodb_bug56680.test +++ /dev/null @@ -1,133 +0,0 @@ ---source include/have_innodb.inc -# -# Bug #56680 InnoDB may return wrong results from a case-insensitive index -# --- disable_query_log -SET @tx_isolation_orig = @@tx_isolation; -# The flag innodb_change_buffering_debug is only available in debug builds. -# It instructs InnoDB to try to evict pages from the buffer pool when -# change buffering is possible, so that the change buffer will be used -# whenever possible. --- error 0,ER_UNKNOWN_SYSTEM_VARIABLE -SET @innodb_change_buffering_debug_orig = @@innodb_change_buffering_debug; --- error 0,ER_UNKNOWN_SYSTEM_VARIABLE -SET GLOBAL innodb_change_buffering_debug = 1; --- enable_query_log -SET GLOBAL tx_isolation='REPEATABLE-READ'; - -CREATE TABLE bug56680( - a INT AUTO_INCREMENT PRIMARY KEY, - b CHAR(1), - c INT, - INDEX(b)) -ENGINE=InnoDB; - -INSERT INTO bug56680 VALUES(0,'x',1); -BEGIN; -SELECT b FROM bug56680; - -connect (con1,localhost,root,,); -connection con1; -BEGIN; -UPDATE bug56680 SET b='X'; - -connection default; -# This should return the last committed value 'x', but would return 'X' -# due to a bug in row_search_for_mysql(). -SELECT b FROM bug56680; -# This would always return the last committed value 'x'. -SELECT * FROM bug56680; - -connection con1; -ROLLBACK; -disconnect con1; - -connection default; - -SELECT b FROM bug56680; - -# For the rest of this test, use the READ UNCOMMITTED isolation level -# to see what exists in the secondary index. -SET GLOBAL tx_isolation='READ-UNCOMMITTED'; - -# Create enough rows for the table, so that the insert buffer will be -# used for modifying the secondary index page. There must be multiple -# index pages, because changes to the root page are never buffered. - -INSERT INTO bug56680 SELECT 0,b,c FROM bug56680; -INSERT INTO bug56680 SELECT 0,b,c FROM bug56680; -INSERT INTO bug56680 SELECT 0,b,c FROM bug56680; -INSERT INTO bug56680 SELECT 0,b,c FROM bug56680; -INSERT INTO bug56680 SELECT 0,b,c FROM bug56680; -INSERT INTO bug56680 SELECT 0,b,c FROM bug56680; -INSERT INTO bug56680 SELECT 0,b,c FROM bug56680; -INSERT INTO bug56680 SELECT 0,b,c FROM bug56680; -INSERT INTO bug56680 SELECT 0,b,c FROM bug56680; -INSERT INTO bug56680 SELECT 0,b,c FROM bug56680; -INSERT INTO bug56680 SELECT 0,b,c FROM bug56680; - -BEGIN; -SELECT b FROM bug56680 LIMIT 2; - -connect (con1,localhost,root,,); -connection con1; -BEGIN; -DELETE FROM bug56680 WHERE a=1; -# This should be buffered, if innodb_change_buffering_debug = 1 is in effect. -INSERT INTO bug56680 VALUES(1,'X',1); - -# This should force an insert buffer merge, and return 'X' in the first row. -SELECT b FROM bug56680 LIMIT 3; - -connection default; -SELECT b FROM bug56680 LIMIT 2; -CHECK TABLE bug56680; - -connection con1; -ROLLBACK; -SELECT b FROM bug56680 LIMIT 2; -CHECK TABLE bug56680; - -connection default; -disconnect con1; - -SELECT b FROM bug56680 LIMIT 2; - -CREATE TABLE bug56680_2( - a INT AUTO_INCREMENT PRIMARY KEY, - b VARCHAR(2) CHARSET latin1 COLLATE latin1_german2_ci, - c INT, - INDEX(b)) -ENGINE=InnoDB; - -INSERT INTO bug56680_2 SELECT 0,_latin1 0xdf,c FROM bug56680; - -BEGIN; -SELECT HEX(b) FROM bug56680_2 LIMIT 2; -DELETE FROM bug56680_2 WHERE a=1; -# This should be buffered, if innodb_change_buffering_debug = 1 is in effect. -INSERT INTO bug56680_2 VALUES(1,'SS',1); - -# This should force an insert buffer merge, and return 'SS' in the first row. -SELECT HEX(b) FROM bug56680_2 LIMIT 3; -CHECK TABLE bug56680_2; - -# Test this with compressed tables. -ALTER TABLE bug56680_2 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; - -SELECT HEX(b) FROM bug56680_2 LIMIT 2; -DELETE FROM bug56680_2 WHERE a=1; -# This should be buffered, if innodb_change_buffering_debug = 1 is in effect. -INSERT INTO bug56680_2 VALUES(1,_latin1 0xdf,1); - -# This should force an insert buffer merge, and return 0xdf in the first row. -SELECT HEX(b) FROM bug56680_2 LIMIT 3; -CHECK TABLE bug56680_2; - -DROP TABLE bug56680_2; -DROP TABLE bug56680; - --- disable_query_log -SET GLOBAL tx_isolation = @tx_isolation_orig; --- error 0, ER_UNKNOWN_SYSTEM_VARIABLE -SET GLOBAL innodb_change_buffering_debug = @innodb_change_buffering_debug_orig; diff --git a/mysql-test/suite/innodb_zip/t/innodb_cmp_drop_table-master.opt b/mysql-test/suite/innodb_zip/t/innodb_cmp_drop_table-master.opt deleted file mode 100644 index a9a3d8c3db8..00000000000 --- a/mysql-test/suite/innodb_zip/t/innodb_cmp_drop_table-master.opt +++ /dev/null @@ -1 +0,0 @@ ---innodb-buffer-pool-size=8M diff --git a/mysql-test/suite/innodb_zip/t/innodb_cmp_drop_table.test b/mysql-test/suite/innodb_zip/t/innodb_cmp_drop_table.test deleted file mode 100644 index 35e4b2c6bf3..00000000000 --- a/mysql-test/suite/innodb_zip/t/innodb_cmp_drop_table.test +++ /dev/null @@ -1,63 +0,0 @@ ---source include/have_innodb.inc - -# lazy evition might not be lazy enough when key rotation -# scans through pages --- source include/not_encrypted.inc - -let $per_table=`select @@innodb_file_per_table`; -let $format=`select @@innodb_file_format`; - --- let $query_i_s = SELECT page_size FROM information_schema.innodb_cmpmem WHERE pages_used > 0 - -set global innodb_file_per_table=on; -set global innodb_file_format=`1`; - -create table t1(a text) engine=innodb key_block_size=8; - --- disable_query_log - -# insert some rows so we are using compressed pages --- let $i = 10 -while ($i) -{ - insert into t1 values(repeat('abcdefghijklmnopqrstuvwxyz',100)); - dec $i; -} --- enable_query_log - -# we should be using some 8K pages --- eval $query_i_s - -drop table t1; - -# because of lazy eviction at drop table in 5.5 there should be some -# used 8K pages --- eval $query_i_s - -# create a non-compressed table and insert enough into it to evict -# compressed pages -create table t2(a text) engine=innodb; - --- disable_query_log - --- let $i = 400 -while ($i) -{ - insert into t2 values(repeat('abcdefghijklmnopqrstuvwxyz',1000)); - dec $i; -} - --- enable_query_log - -# now there should be no 8K pages in the buffer pool --- eval $query_i_s - -drop table t2; - -# -# restore environment to the state it was before this test execution -# - --- disable_query_log -eval set global innodb_file_format=$format; -eval set global innodb_file_per_table=$per_table; diff --git a/mysql-test/suite/innodb_zip/t/innodb_index_large_prefix.test b/mysql-test/suite/innodb_zip/t/innodb_index_large_prefix.test deleted file mode 100644 index d071e3833e9..00000000000 --- a/mysql-test/suite/innodb_zip/t/innodb_index_large_prefix.test +++ /dev/null @@ -1,434 +0,0 @@ -# Testcase for worklog #5743: Lift the limit of index key prefixes - ---source include/have_innodb.inc ---source include/have_innodb_16k.inc -SET default_storage_engine=InnoDB; - -call mtr.add_suppression("Cannot add field .* in table .* because after adding it, the row size is .* which is greater than maximum allowed size (.*) for a record on index leaf page."); - -let $innodb_large_prefix_orig=`select @@innodb_large_prefix`; - -set global innodb_large_prefix=1; -set global innodb_strict_mode=1; - --- echo ### Test 1 ### -# Create a table of DYNAMIC format, with a primary index of 1000 bytes in -# size -create table worklog5743(a TEXT not null, primary key (a(1000))) ROW_FORMAT=DYNAMIC; -show warnings; - -# Do some insertion and update to excercise the external cache -# code path -insert into worklog5743 values(repeat("a", 20000)); - -# default session, update the table -update worklog5743 set a = (repeat("b", 16000)); - -# Create a secondary index -create index idx on worklog5743(a(2000)); -show warnings; - -# Start a few sessions to do selections on table being updated in default -# session, so it would rebuild the previous version from undo log. -# 1) Default session: Initiate an update on the externally stored column -# 2) Session con1: Select from table with repeated read -# 3) Session con2: Select from table with read uncommitted -# 4) Default session: rollback updates - -begin; -update worklog5743 set a = (repeat("x", 17000)); - -# Start a new session to select the column to force it build -# an earlier version of the clustered index through undo log. So it should -# just see the result of repeat("b", 16000) -select @@session.tx_isolation; ---connect (con1,localhost,root,,) -select a = repeat("x", 17000) from worklog5743; -select a = repeat("b", 16000) from worklog5743; - -# Start another session doing "read uncommitted" query, it -# should see the uncommitted update ---connect (con2,localhost,root,,) -SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -select @@session.tx_isolation; -select a = repeat("x", 17000) from worklog5743; - -# Roll back the transaction ---connection default -rollback; - -drop table worklog5743; - --- echo ### Test 2 ### -# Create a table with only a secondary index has large prefix column -create table worklog5743(a1 int, a2 TEXT not null) ROW_FORMAT=DYNAMIC; -show warnings; -create index idx on worklog5743(a1, a2(2000)); -show warnings; - -insert into worklog5743 values(9, repeat("a", 10000)); - -begin; - -update worklog5743 set a1 = 1000; - -# Do a select from another connection that would use the secondary index ---connection con1 -select @@session.tx_isolation; -explain select a1, a2 = repeat("a", 10000) from worklog5743 where a1 = 9; -select a1, a2 = repeat("a", 10000) from worklog5743 where a1 = 9; - -# Do read uncommitted in another session, it would show there is no -# row with a1 = 9 ---connection con2 -SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -select @@session.tx_isolation; -select a1, a2 = repeat("a", 10000) from worklog5743 where a1 = 9; - ---connection default -rollback; - -drop table worklog5743; - --- echo ### Test 3 ### -# Create a table with a secondary index has small (50 bytes) prefix column -create table worklog5743(a1 int, a2 TEXT not null) ROW_FORMAT=DYNAMIC; - -create index idx on worklog5743(a1, a2(50)); - -insert into worklog5743 values(9, repeat("a", 10000)); - -begin; - -update worklog5743 set a1 = 1000; - -# Do a select from another connection that would use the secondary index ---connection con1 -select @@session.tx_isolation; -explain select a1, a2 = repeat("a", 10000) from worklog5743 where a1 = 9; -select a1, a2 = repeat("a", 10000) from worklog5743 where a1 = 9; - -# Do read uncommitted in another session, it would show there is no -# row with a1 = 9 ---connection con2 -SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -select @@session.tx_isolation; -select a1, a2 = repeat("a", 10000) from worklog5743 where a1 = 9; - ---connection default -rollback; - -drop table worklog5743; - --- echo ### Test 4 ### -# Create compressed tables with each KEY_BLOCK_SIZE. -create table worklog5743_1(a1 int, a2 TEXT not null) KEY_BLOCK_SIZE=1; -create table worklog5743_2(a1 int, a2 TEXT not null) KEY_BLOCK_SIZE=2; -create table worklog5743_4(a1 int, a2 TEXT not null) KEY_BLOCK_SIZE=4; -create table worklog5743_8(a1 int, a2 TEXT, a3 TEXT) KEY_BLOCK_SIZE=8; -create table worklog5743_16(a1 int, a2 TEXT, a3 TEXT) KEY_BLOCK_SIZE=16; - -# The maximum overall index record (not prefix) length of a -# compressed table is dependent on innodb-page-size (IPS), -# key_block_size (KBS) and the number of fields (NF). -# "Too big row" error (HA_ERR_TO_BIG_ROW) will be returned if this -# limit is exceeded. -# See page_zip_empty_size() and Bug #47495 for more detail. - -# Test edge cases for indexes using key_block_size=1 -set sql_mode=''; -set global innodb_large_prefix=0; --- error ER_TOO_BIG_ROWSIZE -create index idx1 on worklog5743_1(a2(4000)); -show warnings; -set global innodb_large_prefix=1; --- error ER_TOO_BIG_ROWSIZE -create index idx2 on worklog5743_1(a2(4000)); -show warnings; --- error ER_TOO_BIG_ROWSIZE -create index idx3 on worklog5743_1(a2(436)); -show warnings; -# Bug#13391353 Limit is one byte less on on 32bit-Linux only -create index idx4 on worklog5743_1(a2(434)); -show warnings; --- error ER_TOO_BIG_ROWSIZE -create index idx5 on worklog5743_1(a1, a2(430)); -show warnings; -# Bug#13391353 Limit is one byte less on on 32bit-Linux only -create index idx6 on worklog5743_1(a1, a2(428)); -show warnings; - -# Test edge cases for indexes using key_block_size=2 -set global innodb_large_prefix=0; -create index idx1 on worklog5743_2(a2(4000)); -show warnings; -set global innodb_large_prefix=1; --- error ER_TOO_BIG_ROWSIZE -create index idx2 on worklog5743_2(a2(4000)); -show warnings; --- error ER_TOO_BIG_ROWSIZE -create index idx3 on worklog5743_2(a2(948)); -show warnings; -# Bug#13391353 Limit is one byte less on on 32bit-Linux only -create index idx4 on worklog5743_2(a2(946)); -show warnings; --- error ER_TOO_BIG_ROWSIZE -create index idx5 on worklog5743_2(a1, a2(942)); -show warnings; -# Bug#13391353 Limit is one byte less on on 32bit-Linux only -create index idx6 on worklog5743_2(a1, a2(940)); -show warnings; - -# Test edge cases for indexes using key_block_size=4 -set global innodb_large_prefix=0; -create index idx1 on worklog5743_4(a2(4000)); -show warnings; -set global innodb_large_prefix=1; --- error ER_TOO_BIG_ROWSIZE -create index idx2 on worklog5743_4(a2(4000)); -show warnings; --- error ER_TOO_BIG_ROWSIZE -create index idx3 on worklog5743_4(a2(1972)); -show warnings; -# Bug#13391353 Limit is one byte less on on 32bit-Linux only -create index idx4 on worklog5743_4(a2(1970)); -show warnings; --- error ER_TOO_BIG_ROWSIZE -create index idx5 on worklog5743_4(a1, a2(1966)); -show warnings; -# Bug#13391353 Limit is one byte less on on 32bit-Linux only -create index idx6 on worklog5743_4(a1, a2(1964)); -show warnings; - -# Test edge cases for indexes using key_block_size=8 -set global innodb_large_prefix=0; -create index idx1 on worklog5743_8(a2(1000)); -show warnings; -set global innodb_large_prefix=1; -create index idx2 on worklog5743_8(a2(3073)); -show warnings; -create index idx3 on worklog5743_8(a2(3072)); -show warnings; --- error ER_TOO_LONG_KEY -create index idx4 on worklog5743_8(a1, a2(3069)); -show warnings; -create index idx5 on worklog5743_8(a1, a2(3068)); -show warnings; --- error ER_TOO_LONG_KEY -create index idx6 on worklog5743_8(a1, a2(2000), a3(1069)); -show warnings; -create index idx7 on worklog5743_8(a1, a2(2000), a3(1068)); -show warnings; - -# Test edge cases for indexes using key_block_size=16 -set global innodb_large_prefix=0; -create index idx1 on worklog5743_16(a2(1000)); -show warnings; -set global innodb_large_prefix=1; -create index idx2 on worklog5743_16(a2(3073)); -show warnings; -create index idx3 on worklog5743_16(a2(3072)); -show warnings; --- error ER_TOO_LONG_KEY -create index idx4 on worklog5743_16(a1, a2(3069)); -show warnings; -create index idx5 on worklog5743_16(a1, a2(3068)); -show warnings; --- error ER_TOO_LONG_KEY -create index idx6 on worklog5743_16(a1, a2(2000), a3(1069)); -show warnings; -create index idx7 on worklog5743_16(a1, a2(2000), a3(1068)); -show warnings; -set sql_mode=default; - -# Insert a large record into each of these tables. -insert into worklog5743_1 values(9, repeat("a", 10000)); -insert into worklog5743_2 values(9, repeat("a", 10000)); -insert into worklog5743_4 values(9, repeat("a", 10000)); -insert into worklog5743_8 values(9, repeat("a", 10000), repeat("a", 10000)); -insert into worklog5743_16 values(9, repeat("a", 10000), repeat("a", 10000)); - -# Now if we change the global innodb_large_prefix back to 767, -# updates to these indexes should still be allowed. -set global innodb_large_prefix=0; -insert into worklog5743_1 values(2, repeat("b", 10000)); -insert into worklog5743_2 values(2, repeat("b", 10000)); -insert into worklog5743_4 values(2, repeat("b", 10000)); -insert into worklog5743_8 values(2, repeat("b", 10000), repeat("b", 10000)); -insert into worklog5743_16 values(2, repeat("b", 10000), repeat("b", 10000)); -set global innodb_large_prefix=1; - -select a1, left(a2, 20) from worklog5743_1; -select a1, left(a2, 20) from worklog5743_2; -select a1, left(a2, 20) from worklog5743_4; -select a1, left(a2, 20) from worklog5743_8; -select a1, left(a2, 20) from worklog5743_16; - -begin; - -update worklog5743_1 set a1 = 1000; -update worklog5743_2 set a1 = 1000; -update worklog5743_4 set a1 = 1000; -update worklog5743_8 set a1 = 1000; -update worklog5743_16 set a1 = 1000; -select a1, left(a2, 20) from worklog5743_1; -select a1, left(a2, 20) from worklog5743_2; -select a1, left(a2, 20) from worklog5743_4; -select a1, left(a2, 20) from worklog5743_8; -select a1, left(a2, 20) from worklog5743_16; - - -# Do a select from another connection that would use the secondary index ---connection con1 -select @@session.tx_isolation; -explain select a1, left(a2, 20) from worklog5743_1 where a1 = 9; -explain select a1, left(a2, 20) from worklog5743_2 where a1 = 9; -explain select a1, left(a2, 20) from worklog5743_4 where a1 = 9; -explain select a1, left(a2, 20) from worklog5743_8 where a1 = 9; -explain select a1, left(a2, 20) from worklog5743_16 where a1 = 9; -select a1, left(a2, 20) from worklog5743_1 where a1 = 9; -select a1, left(a2, 20) from worklog5743_2 where a1 = 9; -select a1, left(a2, 20) from worklog5743_4 where a1 = 9; -select a1, left(a2, 20) from worklog5743_8 where a1 = 9; -select a1, left(a2, 20) from worklog5743_16 where a1 = 9; - -# Do read uncommitted in another session, it would show there is no -# row with a1 = 9 ---connection con2 -SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -select @@session.tx_isolation; -select a1, left(a2, 20) from worklog5743_1 where a1 = 9; -select a1, left(a2, 20) from worklog5743_2 where a1 = 9; -select a1, left(a2, 20) from worklog5743_4 where a1 = 9; -select a1, left(a2, 20) from worklog5743_8 where a1 = 9; -select a1, left(a2, 20) from worklog5743_16 where a1 = 9; - ---connection default -rollback; - -drop table worklog5743_1; -drop table worklog5743_2; -drop table worklog5743_4; -drop table worklog5743_8; -drop table worklog5743_16; - --- echo ### Test 5 ### -# Create a table with large varchar columns and create indexes -# directly on these large columns to show that prefix limit is -# automatically applied and to show that limit. -create table worklog5743(a1 int, - a2 varchar(20000), - a3 varchar(3073), - a4 varchar(3072), - a5 varchar(3069), - a6 varchar(3068)) - ROW_FORMAT=DYNAMIC; -set sql_mode=''; -create index idx1 on worklog5743(a2); -create index idx2 on worklog5743(a3); -create index idx3 on worklog5743(a4); -show warnings; --- error ER_TOO_LONG_KEY -create index idx4 on worklog5743(a1, a2); -show warnings; --- error ER_TOO_LONG_KEY -create index idx5 on worklog5743(a1, a5); -show warnings; -create index idx6 on worklog5743(a1, a6); -show warnings; -show create table worklog5743; -set sql_mode=default; - -insert into worklog5743 values(9, - repeat("a", 20000), repeat("a", 3073), - repeat("a", 3072), repeat("a", 3069), - repeat("a", 3068)); - -begin; - -update worklog5743 set a1 = 1000; - -# Do a select from another connection that would use the secondary index ---connection con1 -select @@session.tx_isolation; -explain select a1 from worklog5743 where a1 = 9; -select a1 from worklog5743 where a1 = 9; - -# Do read uncommitted, it would show there is no row with a1 = 9 ---connection con2 -SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -select @@session.tx_isolation; -select a1 from worklog5743 where a1 = 9; - ---connection default -rollback; - -drop table worklog5743; - --- echo ### Test 6 ### -# Create a table with old format, and the limit is 768 bytes. --- error ER_INDEX_COLUMN_TOO_LONG -create table worklog5743(a TEXT not null, primary key (a(1000))) row_format=COMPACT; - -create table worklog5743(a TEXT) row_format=COMPACT; - -# Excercise the column length check in ha_innobase::add_index() --- error ER_INDEX_COLUMN_TOO_LONG -create index idx on worklog5743(a(768)); - -# This should be successful -create index idx on worklog5743(a(767)); - -# Perform some DMLs -insert into worklog5743 values(repeat("a", 20000)); - -begin; -insert into worklog5743 values(repeat("b", 20000)); -update worklog5743 set a = (repeat("x", 25000)); - -# Start a new session to select the table to force it build -# an earlier version of the cluster index through undo log -select @@session.tx_isolation; ---connection con1 -select a = repeat("a", 20000) from worklog5743; ---disconnect con1 - ---connection con2 -SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -select @@session.tx_isolation; -select a = repeat("x", 25000) from worklog5743; ---disconnect con2 - ---connection default -rollback; - -drop table worklog5743; - --- echo ### Test 7 ### -# Some border line tests on the column length. -# We have a limit of 3072 bytes for Barracuda table -create table worklog5743(a TEXT not null) ROW_FORMAT=DYNAMIC; - -# Length exceeds maximum supported key length -# It will be auto-truncated to 3072 -set statement sql_mode = '' for -create index idx1 on worklog5743(a(3073)); -create index idx2 on worklog5743(a(3072)); -show create table worklog5743; -drop table worklog5743; - -# We have a limit of 767 bytes for Antelope tables -create table worklog5743(a TEXT not null) ROW_FORMAT=REDUNDANT; --- error ER_INDEX_COLUMN_TOO_LONG -create index idx on worklog5743(a(768)); -create index idx2 on worklog5743(a(767)); -drop table worklog5743; - -create table worklog5743(a TEXT not null) ROW_FORMAT=COMPACT; --- error ER_INDEX_COLUMN_TOO_LONG -create index idx on worklog5743(a(768)); -create index idx2 on worklog5743(a(767)); -drop table worklog5743; - -eval SET GLOBAL innodb_large_prefix=$innodb_large_prefix_orig; -SET GLOBAL innodb_strict_mode = DEFAULT; diff --git a/mysql-test/suite/innodb_zip/t/recover.test b/mysql-test/suite/innodb_zip/t/recover.test new file mode 100644 index 00000000000..0cfc2b672fb --- /dev/null +++ b/mysql-test/suite/innodb_zip/t/recover.test @@ -0,0 +1,31 @@ +--source include/have_innodb.inc +--source include/have_innodb_max_16k.inc +--source include/not_embedded.inc + +--disable_query_log +# This test kills the server, which could corrupt some mysql.* tables +# that are not created with ENGINE=InnoDB. +# Flush any non-InnoDB tables to prevent that from happening. +FLUSH TABLES; +--enable_query_log + +--echo # +--echo # MDEV-12720 recovery fails with "Generic error" +--echo # for ROW_FORMAT=compressed +--echo # +CREATE TABLE a(i INT PRIMARY KEY AUTO_INCREMENT, s VARCHAR(255)) ENGINE=InnoDB +ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; + +BEGIN; +insert into a(i) select null; +insert into a select null, uuid() from a a, a b, a c; +insert into a select null, uuid() from a a, a b, a c; +insert into a select null, uuid() from a a, a b, a c; +SET GLOBAL innodb_flush_log_at_trx_commit=1; +COMMIT; + +--let $shutdown_timeout=0 +--source include/restart_mysqld.inc + +SELECT COUNT(*) from a; +DROP TABLE a; diff --git a/mysql-test/suite/innodb_zip/t/restart.test b/mysql-test/suite/innodb_zip/t/restart.test index a2dacdb4a05..05ac8274278 100644 --- a/mysql-test/suite/innodb_zip/t/restart.test +++ b/mysql-test/suite/innodb_zip/t/restart.test @@ -1,9 +1,7 @@ # # These test make sure that tables are visible after rebooting # - ---source include/have_innodb.inc ---source include/have_innodb_zip.inc +--source include/innodb_page_size_small.inc --source include/have_partition.inc --source include/not_embedded.inc SET default_storage_engine=InnoDB; diff --git a/mysql-test/suite/innodb_zip/t/wl5522_debug_zip.test b/mysql-test/suite/innodb_zip/t/wl5522_debug_zip.test index 392a3ed2879..986c0508891 100644 --- a/mysql-test/suite/innodb_zip/t/wl5522_debug_zip.test +++ b/mysql-test/suite/innodb_zip/t/wl5522_debug_zip.test @@ -10,8 +10,7 @@ # Avoid CrashReporter popup on Mac --source include/not_crashrep.inc --- source include/have_innodb.inc --- source include/have_innodb_zip.inc +-- source include/innodb_page_size_small.inc call mtr.add_suppression("InnoDB: Tablespace for table .* is set as discarded."); call mtr.add_suppression("InnoDB: Cannot calculate statistics for table .* because the .ibd file is missing. Please refer to .* for how to resolve the issue."); @@ -322,7 +321,9 @@ CREATE TABLE test_wl5522.t1 ( ROW_FORMAT=COMPRESSED; # Stop purge so that it doesn't remove the delete marked entries. -SET GLOBAL INNODB_PURGE_STOP_NOW=ON; +connect (purge_control,localhost,root); +START TRANSACTION WITH CONSISTENT SNAPSHOT; +connection default; # Disable change buffer merge from the master thread, additionally # enable aggressive flushing so that more changes are buffered. @@ -392,7 +393,10 @@ SELECT name SET GLOBAL innodb_disable_background_merge=OFF; # Enable normal operation -SET GLOBAL INNODB_PURGE_RUN_NOW=ON; +connection purge_control; +COMMIT; +disconnect purge_control; +connection default; DROP TABLE test_wl5522.t1; diff --git a/mysql-test/suite/innodb_zip/t/wl5522_zip.test b/mysql-test/suite/innodb_zip/t/wl5522_zip.test index 7863c2b3ffb..d92093262ac 100644 --- a/mysql-test/suite/innodb_zip/t/wl5522_zip.test +++ b/mysql-test/suite/innodb_zip/t/wl5522_zip.test @@ -1,8 +1,7 @@ # Not supported in embedded --source include/not_embedded.inc --- source include/have_innodb.inc --- source include/have_innodb_zip.inc +-- source include/innodb_page_size_small.inc call mtr.add_suppression("InnoDB: Unable to import tablespace .* because it already exists. Please DISCARD the tablespace before IMPORT."); diff --git a/mysql-test/suite/innodb_zip/t/wl6344_compress_level.test b/mysql-test/suite/innodb_zip/t/wl6344_compress_level.test index df4e66967f7..690efffed56 100644 --- a/mysql-test/suite/innodb_zip/t/wl6344_compress_level.test +++ b/mysql-test/suite/innodb_zip/t/wl6344_compress_level.test @@ -9,31 +9,20 @@ # greater than the # the size of the table when compression level=9 #******************************************************************* ---source include/have_innodb.inc ---source include/have_innodb_zip.inc +--source include/innodb_page_size_small.inc -USE test; -DROP TABLE IF EXISTS tab5; -DROP TABLE IF EXISTS tab6; - ---echo #set the other madatory flags before test starts SET GLOBAL Innodb_file_per_table=on; -let $innodb_compression_level = `SELECT @@global.innodb_compression_level`; +SET @save_innodb_compression_level = @@global.innodb_compression_level; ---echo #set the compression level=0 (No compress) SET global innodb_compression_level=0; --- echo #check the compression level and the compressed_pages is default -SELECT @@innodb_compression_level; -SELECT @@Innodb_file_per_table; - -- echo #create table with 1K block size CREATE TABLE tab5 (col_1 CHAR (255) , col_2 VARCHAR (255), col_3 longtext, col_4 longtext,col_5 longtext, col_6 longtext , col_7 longtext , col_8 longtext ,col_9 longtext , -col_10 longtext ,col_11 int auto_increment primary key) +col_10 longtext ,col_11 int auto_increment primary key) ENGINE = innodb ROW_FORMAT=compressed key_block_size=1; -- echo #create indexes @@ -56,7 +45,8 @@ SET @col_8 = repeat('h', 100); SET @col_9 = repeat('i', 100); SET @col_10 = repeat('j', 100); ---echo #insert 10 records +--echo #insert 10 records +BEGIN; let $i = 10; while ($i) { @@ -65,8 +55,9 @@ VALUES (@col_1,@col_2,@col_3,@col_4,@cl_5,@col_6,@col_7,@col_8,@col_9,@col_10); dec $i; } +COMMIT; ---echo #set the compression level=9 (High compress) +--echo #set the compression level=9 (High compress) SET global innodb_compression_level=9; -- echo #create table with 1K block size @@ -86,19 +77,8 @@ CREATE INDEX idx4 ON tab6(col_7(10)); CREATE INDEX idx5 ON tab6(col_8(10)); CREATE INDEX idx6 ON tab6(col_11); ---echo #load the with repeat function -SET @col_1 = repeat('a', 100); -SET @col_2 = repeat('b', 100); -SET @col_3 = repeat('c', 100); -SET @col_4 = repeat('d', 100); -SET @col_5 = repeat('e', 100); -SET @col_6 = repeat('f', 100); -SET @col_7 = repeat('g', 100); -SET @col_8 = repeat('h', 100); -SET @col_9 = repeat('i', 100); -SET @col_10 = repeat('j', 100); - ---echo #insert 10 records +--echo #insert 10 records +BEGIN; let $i = 10; while ($i) { @@ -106,30 +86,23 @@ eval INSERT INTO tab6(col_1,col_2,col_3,col_4,col_5,col_6,col_7,col_8,col_9,col_ VALUES (@col_1,@col_2,@col_3,@col_4,@cl_5,@col_6,@col_7,@col_8,@col_9,@col_10); dec $i; } +COMMIT; -- echo #diff the sizes of the No compressed table and high compressed table -SET @size=(SELECT -(SELECT (SUM(DATA_LENGTH+INDEX_LENGTH)/1024/1024) -FROM INFORMATION_SCHEMA.TABLES +SET @size=(SELECT +(SELECT (SUM(DATA_LENGTH+INDEX_LENGTH)/1024/1024) +FROM INFORMATION_SCHEMA.TABLES WHERE table_name='tab5' AND ENGINE='InnoDB' AND table_schema='test') - -(SELECT SUM(DATA_LENGTH+INDEX_LENGTH)/1024/1024 -FROM INFORMATION_SCHEMA.TABLES +(SELECT SUM(DATA_LENGTH+INDEX_LENGTH)/1024/1024 +FROM INFORMATION_SCHEMA.TABLES WHERE table_name='tab6' AND ENGINE='InnoDB' AND table_schema='test') FROM DUAL); ---echo #check the size of the table, it should not be Negative value +--echo #check the size of the table, it should not be Negative value --echo #The results of this query Test pass = 1 and fail=0 SELECT @size >= 0; +DROP TABLE tab5, tab6; ---echo # ---echo # Cleanup ---echo # -DROP TABLE tab5; -DROP TABLE tab6; - ---echo #reset back the compression_level to default. ---disable_query_log -eval SET GLOBAL innodb_compression_level=$innodb_compression_level; ---enable_query_log +SET GLOBAL innodb_compression_level = @save_innodb_compression_level; diff --git a/mysql-test/suite/jp/r/jp_convert_ucs2.result b/mysql-test/suite/jp/r/jp_convert_ucs2.result index aa97d30f745..842ddfa2ea7 100644 --- a/mysql-test/suite/jp/r/jp_convert_ucs2.result +++ b/mysql-test/suite/jp/r/jp_convert_ucs2.result @@ -153,13 +153,13 @@ SELECT ` íÈíÉíÊíËíÌíÍíÎíÏíÐíÑíÒíÓíÔíÕíÖí×íØíÙíÚíÛ íÈíÉíÊíËíÌíÍíÎíÏíÐíÑíÒíÓíÔíÕíÖí×íØíÙíÚíÛ SELECT `£Ã£±`, CONVERT(`£Ã£±` using sjis) FROM `£Ô£³`; £Ã£± CONVERT(`£Ã£±` using sjis) -¡¦¢µ¢¶~¢¸¢¹¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢Â¢Ã¢Ä¡¦¡¦¡¦ NULL -¡¦í¡í¢í£í¤í¥í¦í§í¨í©íªí«í¬í­í®í¯í°í±í²í³ NULL -°´°µ°¶°·°¸°¹°º°»°¼°½°¾°¿°À°Á°Â°Ã°Ä°Å°Æ°Ç NULL -°È°É°Ê°Ë°Ì°Í°Î°Ï°Ð°Ñ°Ò°Ó°Ô°Õ°Ö°×°Ø°Ù°Ú°Û NULL -°Ü°Ý°Þ°ß°à°á°â°ã°ä°å°æ°ç°è°é°ê°ë°ì°í°î°ï NULL -í´íµí¶í·í¸í¹íºí»í¼í½í¾í¿íÀíÁíÂíÃíÄíÅíÆíÇ NULL -íÈíÉíÊíËíÌíÍíÎíÏíÐíÑíÒíÓíÔíÕíÖí×íØíÙíÚíÛ NULL +¡¦¢µ¢¶~¢¸¢¹¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢Â¢Ã¢Ä¡¦¡¦¡¦ ¡¦??~??¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦???¡¦¡¦¡¦ +¡¦í¡í¢í£í¤í¥í¦í§í¨í©íªí«í¬í­í®í¯í°í±í²í³ ¡¦??????????????????? +°´°µ°¶°·°¸°¹°º°»°¼°½°¾°¿°À°Á°Â°Ã°Ä°Å°Æ°Ç ???????????????????? +°È°É°Ê°Ë°Ì°Í°Î°Ï°Ð°Ñ°Ò°Ó°Ô°Õ°Ö°×°Ø°Ù°Ú°Û ???????????????????? +°Ü°Ý°Þ°ß°à°á°â°ã°ä°å°æ°ç°è°é°ê°ë°ì°í°î°ï ???????????????????? +í´íµí¶í·í¸í¹íºí»í¼í½í¾í¿íÀíÁíÂíÃíÄíÅíÆíÇ ???????????????????? +íÈíÉíÊíËíÌíÍíÎíÏíÐíÑíÒíÓíÔíÕíÖí×íØíÙíÚíÛ ???????????????????? Warnings: Warning 1977 Cannot convert 'ucs2' character 0x02DB to 'sjis' Warning 1977 Cannot convert 'ucs2' character 0x9EF8 to 'sjis' @@ -236,13 +236,13 @@ SELECT ` íÈíÉíÊíËíÌíÍíÎíÏíÐíÑíÒíÓíÔíÕíÖí×íØíÙíÚíÛ íÈíÉíÊíËíÌíÍíÎíÏíÐíÑíÒíÓíÔíÕíÖí×íØíÙíÚíÛ SELECT `£Ã£±`, CONVERT(`£Ã£±` using sjis) FROM `£Ô£¶`; £Ã£± CONVERT(`£Ã£±` using sjis) -¡¦¢µ¢¶~¢¸¢¹¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢Â¢Ã¢Ä¡¦¡¦¡¦ NULL -¡¦í¡í¢í£í¤í¥í¦í§í¨í©íªí«í¬í­í®í¯í°í±í²í³ NULL -°´°µ°¶°·°¸°¹°º°»°¼°½°¾°¿°À°Á°Â°Ã°Ä°Å°Æ°Ç NULL -°È°É°Ê°Ë°Ì°Í°Î°Ï°Ð°Ñ°Ò°Ó°Ô°Õ°Ö°×°Ø°Ù°Ú°Û NULL -°Ü°Ý°Þ°ß°à°á°â°ã°ä°å°æ°ç°è°é°ê°ë°ì°í°î°ï NULL -í´íµí¶í·í¸í¹íºí»í¼í½í¾í¿íÀíÁíÂíÃíÄíÅíÆíÇ NULL -íÈíÉíÊíËíÌíÍíÎíÏíÐíÑíÒíÓíÔíÕíÖí×íØíÙíÚíÛ NULL +¡¦¢µ¢¶~¢¸¢¹¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢Â¢Ã¢Ä¡¦¡¦¡¦ ¡¦??~??¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦???¡¦¡¦¡¦ +¡¦í¡í¢í£í¤í¥í¦í§í¨í©íªí«í¬í­í®í¯í°í±í²í³ ¡¦??????????????????? +°´°µ°¶°·°¸°¹°º°»°¼°½°¾°¿°À°Á°Â°Ã°Ä°Å°Æ°Ç ???????????????????? +°È°É°Ê°Ë°Ì°Í°Î°Ï°Ð°Ñ°Ò°Ó°Ô°Õ°Ö°×°Ø°Ù°Ú°Û ???????????????????? +°Ü°Ý°Þ°ß°à°á°â°ã°ä°å°æ°ç°è°é°ê°ë°ì°í°î°ï ???????????????????? +í´íµí¶í·í¸í¹íºí»í¼í½í¾í¿íÀíÁíÂíÃíÄíÅíÆíÇ ???????????????????? +íÈíÉíÊíËíÌíÍíÎíÏíÐíÑíÒíÓíÔíÕíÖí×íØíÙíÚíÛ ???????????????????? Warnings: Warning 1977 Cannot convert 'ucs2' character 0x02DB to 'sjis' Warning 1977 Cannot convert 'ucs2' character 0x9EF8 to 'sjis' @@ -319,13 +319,13 @@ SELECT ` íÈíÉíÊíËíÌíÍíÎíÏíÐíÑíÒíÓíÔíÕíÖí×íØíÙíÚíÛ íÈíÉíÊíËíÌíÍíÎíÏíÐíÑíÒíÓíÔíÕíÖí×íØíÙíÚíÛ SELECT `£Ã£±`, CONVERT(`£Ã£±` using sjis) FROM `£Ô£¹`; £Ã£± CONVERT(`£Ã£±` using sjis) -¡¦¢µ¢¶~¢¸¢¹¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢Â¢Ã¢Ä¡¦¡¦¡¦ NULL -°´°µ°¶°·°¸°¹°º°»°¼°½°¾°¿°À°Á°Â°Ã°Ä°Å°Æ°Ç NULL -°È°É°Ê°Ë°Ì°Í°Î°Ï°Ð°Ñ°Ò°Ó°Ô°Õ°Ö°×°Ø°Ù°Ú°Û NULL -°Ü°Ý°Þ°ß°à°á°â°ã°ä°å°æ°ç°è°é°ê°ë°ì°í°î°ï NULL -¡¦í¡í¢í£í¤í¥í¦í§í¨í©íªí«í¬í­í®í¯í°í±í²í³ NULL -í´íµí¶í·í¸í¹íºí»í¼í½í¾í¿íÀíÁíÂíÃíÄíÅíÆíÇ NULL -íÈíÉíÊíËíÌíÍíÎíÏíÐíÑíÒíÓíÔíÕíÖí×íØíÙíÚíÛ NULL +¡¦¢µ¢¶~¢¸¢¹¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢Â¢Ã¢Ä¡¦¡¦¡¦ ¡¦??~??¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦???¡¦¡¦¡¦ +°´°µ°¶°·°¸°¹°º°»°¼°½°¾°¿°À°Á°Â°Ã°Ä°Å°Æ°Ç ???????????????????? +°È°É°Ê°Ë°Ì°Í°Î°Ï°Ð°Ñ°Ò°Ó°Ô°Õ°Ö°×°Ø°Ù°Ú°Û ???????????????????? +°Ü°Ý°Þ°ß°à°á°â°ã°ä°å°æ°ç°è°é°ê°ë°ì°í°î°ï ???????????????????? +¡¦í¡í¢í£í¤í¥í¦í§í¨í©íªí«í¬í­í®í¯í°í±í²í³ ¡¦??????????????????? +í´íµí¶í·í¸í¹íºí»í¼í½í¾í¿íÀíÁíÂíÃíÄíÅíÆíÇ ???????????????????? +íÈíÉíÊíËíÌíÍíÎíÏíÐíÑíÒíÓíÔíÕíÖí×íØíÙíÚíÛ ???????????????????? Warnings: Warning 1977 Cannot convert 'ucs2' character 0x02DB to 'sjis' Warning 1977 Cannot convert 'ucs2' character 0x4E5A to 'sjis' diff --git a/mysql-test/suite/jp/r/jp_convert_ujis.result b/mysql-test/suite/jp/r/jp_convert_ujis.result index afbc985df64..d47f6b4ef25 100644 --- a/mysql-test/suite/jp/r/jp_convert_ujis.result +++ b/mysql-test/suite/jp/r/jp_convert_ujis.result @@ -353,37 +353,37 @@ SELECT ` ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ SELECT `£Ã£±`, CONVERT(`£Ã£±` using sjis) FROM `£Ô£³`; £Ã£± CONVERT(`£Ã£±` using sjis) -¢ð¢ñ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ NULL -§È§É§Ê§Ë§Ì§Í§Î¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ NULL -©È©É©Ê©Ë©Ì©Í©Î©Ï©Ð¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ NULL -ª´ªµª¶ª·ª¸¡¦ªºª»ª¼ª½ª¾ª¿ªÀªÁªÂªÃªÄªÅªÆªÇ NULL -ªÈªÉªÊªËªÌªÍªÎªÏªÐªÑªÒªÓªÔªÕªÖª×ªØªÙªÚªÛ NULL -ªÜªÝªÞªßªàªáªâªãªäªåªæªçªèªéªêªëªìªíªîªï NULL -ªðªñªòªóªôªõªöª÷¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ NULL -«´«µ«¶«·«¸«¹«º«»¡¦«½«¾«¿«À«Á«Â«Ã¡¦«Å«Æ«Ç NULL -«È«É«Ê«Ë«Ì«Í«Î«Ï«Ð«Ñ«Ò«Ó«Ô«Õ«Ö«×«Ø«Ù«Ú«Û NULL -«Ü«Ý«Þ«ß«à«á«â«ã«ä«å«æ«ç«è«é«ê«ë«ì«í«î«ï NULL -«ð«ñ«ò«ó«ô«õ«ö«÷¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ NULL -°´°µ°¶°·°¸°¹°º°»°¼°½°¾°¿°À°Á°Â°Ã°Ä°Å°Æ°Ç NULL -°È°É°Ê°Ë°Ì°Í°Î°Ï°Ð°Ñ°Ò°Ó°Ô°Õ°Ö°×°Ø°Ù°Ú°Û NULL -°Ü°Ý°Þ°ß°à°á°â°ã°ä°å°æ°ç°è°é°ê°ë°ì°í°î°ï NULL -°ð°ñ°ò°ó°ô°õ°ö°÷°ø°ù°ú°û°ü°ý°þ¡¦¡¦¡¦¡¦¡¦ NULL -í´íµí¶í·í¸í¹íºí»í¼í½í¾í¿íÀíÁíÂíÃíÄíÅíÆíÇ NULL -íÈíÉíÊíËíÌíÍíÎíÏíÐíÑíÒíÓíÔíÕíÖí×íØíÙíÚíÛ NULL -íÜíÝíÞíßíàíáíâí㡦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ NULL -¡¦¢µ¢¶¢·¢¸¢¹¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢Â¢Ã¢Ä¡¦¡¦¡¦ NULL -¡¦¦ñ¦ò¦ó¦ô¦õ¦ö¦÷¦ø¦ù¦ú¦û¦ü¡¦¡¦¡¦¡¦¡¦¡¦¡¦ NULL -¡¦©¡©¢¡¦©¤¡¦©¦¡¦©¨©©¡¦©«©¬©­¡¦©¯©°¡¦¡¦¡¦ NULL -¡¦ª¡ª¢ª£ª¤ª¥ª¦ª§ª¨ª©ªªª«ª¬ª­ª®ª¯ª°ª±ª²ª³ NULL -¡¦«¡«¢«£«¤«¥«¦«§«¨«©«ª«««¬«­«®«¯«°«±«²«³ NULL -¡¦°¡°¢°£°¤°¥°¦°§°¨°©°ª°«°¬°­°®°¯°°°±°²°³ NULL -¡¦í¡í¢í£í¤í¥í¦í§í¨í©íªí«í¬í­í®í¯í°í±í²í³ NULL -¡¦¡¦§ò§ó§ô§õ§ö§÷§ø§ù§ú§û§ü§ý§þ¡¦¡¦¡¦¡¦¡¦ NULL -¡¦¡¦¡¦¡¦¡¦¦á¦â¦ã¦ä¦å¡¦¦ç¡¦¦é¦ê¡¦¦ì¡¦¡¦¡¦ NULL -¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦©Á©Â©Ã©Ä©Å©Æ©Ç NULL -¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦§Â§Ã§Ä§Å§Æ§Ç NULL -¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢¯¢°¢±¢²¢³ NULL -¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢ë¢ì¢í¢î¢ï NULL +¢ð¢ñ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ??¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ +§È§É§Ê§Ë§Ì§Í§Î¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ???????¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ +©È©É©Ê©Ë©Ì©Í©Î©Ï©Ð¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ?????????¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ +ª´ªµª¶ª·ª¸¡¦ªºª»ª¼ª½ª¾ª¿ªÀªÁªÂªÃªÄªÅªÆªÇ ?????¡¦?????????????? +ªÈªÉªÊªËªÌªÍªÎªÏªÐªÑªÒªÓªÔªÕªÖª×ªØªÙªÚªÛ ???????????????????? +ªÜªÝªÞªßªàªáªâªãªäªåªæªçªèªéªêªëªìªíªîªï ???????????????????? +ªðªñªòªóªôªõªöª÷¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ????????¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ +«´«µ«¶«·«¸«¹«º«»¡¦«½«¾«¿«À«Á«Â«Ã¡¦«Å«Æ«Ç ????????¡¦???????¡¦??? +«È«É«Ê«Ë«Ì«Í«Î«Ï«Ð«Ñ«Ò«Ó«Ô«Õ«Ö«×«Ø«Ù«Ú«Û ???????????????????? +«Ü«Ý«Þ«ß«à«á«â«ã«ä«å«æ«ç«è«é«ê«ë«ì«í«î«ï ???????????????????? +«ð«ñ«ò«ó«ô«õ«ö«÷¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ????????¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ +°´°µ°¶°·°¸°¹°º°»°¼°½°¾°¿°À°Á°Â°Ã°Ä°Å°Æ°Ç ???????????????????? +°È°É°Ê°Ë°Ì°Í°Î°Ï°Ð°Ñ°Ò°Ó°Ô°Õ°Ö°×°Ø°Ù°Ú°Û ???????????????????? +°Ü°Ý°Þ°ß°à°á°â°ã°ä°å°æ°ç°è°é°ê°ë°ì°í°î°ï ???????????????????? +°ð°ñ°ò°ó°ô°õ°ö°÷°ø°ù°ú°û°ü°ý°þ¡¦¡¦¡¦¡¦¡¦ ???????????????¡¦¡¦¡¦¡¦¡¦ +í´íµí¶í·í¸í¹íºí»í¼í½í¾í¿íÀíÁíÂíÃíÄíÅíÆíÇ ???????????????????? +íÈíÉíÊíËíÌíÍíÎíÏíÐíÑíÒíÓíÔíÕíÖí×íØíÙíÚíÛ ???????????????????? +íÜíÝíÞíßíàíáíâí㡦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ????????¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ +¡¦¢µ¢¶¢·¢¸¢¹¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢Â¢Ã¢Ä¡¦¡¦¡¦ ¡¦??~??¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦???¡¦¡¦¡¦ +¡¦¦ñ¦ò¦ó¦ô¦õ¦ö¦÷¦ø¦ù¦ú¦û¦ü¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦????????????¡¦¡¦¡¦¡¦¡¦¡¦¡¦ +¡¦©¡©¢¡¦©¤¡¦©¦¡¦©¨©©¡¦©«©¬©­¡¦©¯©°¡¦¡¦¡¦ ¡¦??¡¦?¡¦?¡¦??¡¦???¡¦??¡¦¡¦¡¦ +¡¦ª¡ª¢ª£ª¤ª¥ª¦ª§ª¨ª©ªªª«ª¬ª­ª®ª¯ª°ª±ª²ª³ ¡¦??????????????????? +¡¦«¡«¢«£«¤«¥«¦«§«¨«©«ª«««¬«­«®«¯«°«±«²«³ ¡¦??????????????????? +¡¦°¡°¢°£°¤°¥°¦°§°¨°©°ª°«°¬°­°®°¯°°°±°²°³ ¡¦??????????????????? +¡¦í¡í¢í£í¤í¥í¦í§í¨í©íªí«í¬í­í®í¯í°í±í²í³ ¡¦??????????????????? +¡¦¡¦§ò§ó§ô§õ§ö§÷§ø§ù§ú§û§ü§ý§þ¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦?????????????¡¦¡¦¡¦¡¦¡¦ +¡¦¡¦¡¦¡¦¡¦¦á¦â¦ã¦ä¦å¡¦¦ç¡¦¦é¦ê¡¦¦ì¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦?????¡¦?¡¦??¡¦?¡¦¡¦¡¦ +¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦©Á©Â©Ã©Ä©Å©Æ©Ç ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦??????? +¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦§Â§Ã§Ä§Å§Æ§Ç ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦?????? +¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢¯¢°¢±¢²¢³ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦????? +¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢ë¢ì¢í¢î¢ï ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦????? ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ @@ -751,37 +751,37 @@ SELECT ` ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ SELECT `£Ã£±`, CONVERT(`£Ã£±` using sjis) FROM `£Ô£¶`; £Ã£± CONVERT(`£Ã£±` using sjis) -¢ð¢ñ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ NULL -§È§É§Ê§Ë§Ì§Í§Î¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ NULL -©È©É©Ê©Ë©Ì©Í©Î©Ï©Ð¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ NULL -ª´ªµª¶ª·ª¸¡¦ªºª»ª¼ª½ª¾ª¿ªÀªÁªÂªÃªÄªÅªÆªÇ NULL -ªÈªÉªÊªËªÌªÍªÎªÏªÐªÑªÒªÓªÔªÕªÖª×ªØªÙªÚªÛ NULL -ªÜªÝªÞªßªàªáªâªãªäªåªæªçªèªéªêªëªìªíªîªï NULL -ªðªñªòªóªôªõªöª÷¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ NULL -«´«µ«¶«·«¸«¹«º«»¡¦«½«¾«¿«À«Á«Â«Ã¡¦«Å«Æ«Ç NULL -«È«É«Ê«Ë«Ì«Í«Î«Ï«Ð«Ñ«Ò«Ó«Ô«Õ«Ö«×«Ø«Ù«Ú«Û NULL -«Ü«Ý«Þ«ß«à«á«â«ã«ä«å«æ«ç«è«é«ê«ë«ì«í«î«ï NULL -«ð«ñ«ò«ó«ô«õ«ö«÷¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ NULL -°´°µ°¶°·°¸°¹°º°»°¼°½°¾°¿°À°Á°Â°Ã°Ä°Å°Æ°Ç NULL -°È°É°Ê°Ë°Ì°Í°Î°Ï°Ð°Ñ°Ò°Ó°Ô°Õ°Ö°×°Ø°Ù°Ú°Û NULL -°Ü°Ý°Þ°ß°à°á°â°ã°ä°å°æ°ç°è°é°ê°ë°ì°í°î°ï NULL -°ð°ñ°ò°ó°ô°õ°ö°÷°ø°ù°ú°û°ü°ý°þ¡¦¡¦¡¦¡¦¡¦ NULL -í´íµí¶í·í¸í¹íºí»í¼í½í¾í¿íÀíÁíÂíÃíÄíÅíÆíÇ NULL -íÈíÉíÊíËíÌíÍíÎíÏíÐíÑíÒíÓíÔíÕíÖí×íØíÙíÚíÛ NULL -íÜíÝíÞíßíàíáíâí㡦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ NULL -¡¦¢µ¢¶¢·¢¸¢¹¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢Â¢Ã¢Ä¡¦¡¦¡¦ NULL -¡¦¦ñ¦ò¦ó¦ô¦õ¦ö¦÷¦ø¦ù¦ú¦û¦ü¡¦¡¦¡¦¡¦¡¦¡¦¡¦ NULL -¡¦©¡©¢¡¦©¤¡¦©¦¡¦©¨©©¡¦©«©¬©­¡¦©¯©°¡¦¡¦¡¦ NULL -¡¦ª¡ª¢ª£ª¤ª¥ª¦ª§ª¨ª©ªªª«ª¬ª­ª®ª¯ª°ª±ª²ª³ NULL -¡¦«¡«¢«£«¤«¥«¦«§«¨«©«ª«««¬«­«®«¯«°«±«²«³ NULL -¡¦°¡°¢°£°¤°¥°¦°§°¨°©°ª°«°¬°­°®°¯°°°±°²°³ NULL -¡¦í¡í¢í£í¤í¥í¦í§í¨í©íªí«í¬í­í®í¯í°í±í²í³ NULL -¡¦¡¦§ò§ó§ô§õ§ö§÷§ø§ù§ú§û§ü§ý§þ¡¦¡¦¡¦¡¦¡¦ NULL -¡¦¡¦¡¦¡¦¡¦¦á¦â¦ã¦ä¦å¡¦¦ç¡¦¦é¦ê¡¦¦ì¡¦¡¦¡¦ NULL -¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦©Á©Â©Ã©Ä©Å©Æ©Ç NULL -¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦§Â§Ã§Ä§Å§Æ§Ç NULL -¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢¯¢°¢±¢²¢³ NULL -¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢ë¢ì¢í¢î¢ï NULL +¢ð¢ñ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ??¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ +§È§É§Ê§Ë§Ì§Í§Î¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ???????¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ +©È©É©Ê©Ë©Ì©Í©Î©Ï©Ð¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ?????????¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ +ª´ªµª¶ª·ª¸¡¦ªºª»ª¼ª½ª¾ª¿ªÀªÁªÂªÃªÄªÅªÆªÇ ?????¡¦?????????????? +ªÈªÉªÊªËªÌªÍªÎªÏªÐªÑªÒªÓªÔªÕªÖª×ªØªÙªÚªÛ ???????????????????? +ªÜªÝªÞªßªàªáªâªãªäªåªæªçªèªéªêªëªìªíªîªï ???????????????????? +ªðªñªòªóªôªõªöª÷¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ????????¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ +«´«µ«¶«·«¸«¹«º«»¡¦«½«¾«¿«À«Á«Â«Ã¡¦«Å«Æ«Ç ????????¡¦???????¡¦??? +«È«É«Ê«Ë«Ì«Í«Î«Ï«Ð«Ñ«Ò«Ó«Ô«Õ«Ö«×«Ø«Ù«Ú«Û ???????????????????? +«Ü«Ý«Þ«ß«à«á«â«ã«ä«å«æ«ç«è«é«ê«ë«ì«í«î«ï ???????????????????? +«ð«ñ«ò«ó«ô«õ«ö«÷¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ????????¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ +°´°µ°¶°·°¸°¹°º°»°¼°½°¾°¿°À°Á°Â°Ã°Ä°Å°Æ°Ç ???????????????????? +°È°É°Ê°Ë°Ì°Í°Î°Ï°Ð°Ñ°Ò°Ó°Ô°Õ°Ö°×°Ø°Ù°Ú°Û ???????????????????? +°Ü°Ý°Þ°ß°à°á°â°ã°ä°å°æ°ç°è°é°ê°ë°ì°í°î°ï ???????????????????? +°ð°ñ°ò°ó°ô°õ°ö°÷°ø°ù°ú°û°ü°ý°þ¡¦¡¦¡¦¡¦¡¦ ???????????????¡¦¡¦¡¦¡¦¡¦ +í´íµí¶í·í¸í¹íºí»í¼í½í¾í¿íÀíÁíÂíÃíÄíÅíÆíÇ ???????????????????? +íÈíÉíÊíËíÌíÍíÎíÏíÐíÑíÒíÓíÔíÕíÖí×íØíÙíÚíÛ ???????????????????? +íÜíÝíÞíßíàíáíâí㡦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ????????¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ +¡¦¢µ¢¶¢·¢¸¢¹¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢Â¢Ã¢Ä¡¦¡¦¡¦ ¡¦??~??¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦???¡¦¡¦¡¦ +¡¦¦ñ¦ò¦ó¦ô¦õ¦ö¦÷¦ø¦ù¦ú¦û¦ü¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦????????????¡¦¡¦¡¦¡¦¡¦¡¦¡¦ +¡¦©¡©¢¡¦©¤¡¦©¦¡¦©¨©©¡¦©«©¬©­¡¦©¯©°¡¦¡¦¡¦ ¡¦??¡¦?¡¦?¡¦??¡¦???¡¦??¡¦¡¦¡¦ +¡¦ª¡ª¢ª£ª¤ª¥ª¦ª§ª¨ª©ªªª«ª¬ª­ª®ª¯ª°ª±ª²ª³ ¡¦??????????????????? +¡¦«¡«¢«£«¤«¥«¦«§«¨«©«ª«««¬«­«®«¯«°«±«²«³ ¡¦??????????????????? +¡¦°¡°¢°£°¤°¥°¦°§°¨°©°ª°«°¬°­°®°¯°°°±°²°³ ¡¦??????????????????? +¡¦í¡í¢í£í¤í¥í¦í§í¨í©íªí«í¬í­í®í¯í°í±í²í³ ¡¦??????????????????? +¡¦¡¦§ò§ó§ô§õ§ö§÷§ø§ù§ú§û§ü§ý§þ¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦?????????????¡¦¡¦¡¦¡¦¡¦ +¡¦¡¦¡¦¡¦¡¦¦á¦â¦ã¦ä¦å¡¦¦ç¡¦¦é¦ê¡¦¦ì¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦?????¡¦?¡¦??¡¦?¡¦¡¦¡¦ +¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦©Á©Â©Ã©Ä©Å©Æ©Ç ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦??????? +¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦§Â§Ã§Ä§Å§Æ§Ç ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦?????? +¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢¯¢°¢±¢²¢³ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦????? +¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢ë¢ì¢í¢î¢ï ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦????? ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ @@ -1149,45 +1149,45 @@ SELECT ` ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ SELECT `£Ã£±`, CONVERT(`£Ã£±` using sjis) FROM `£Ô£¹`; £Ã£± CONVERT(`£Ã£±` using sjis) -¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢¯¢°¢±¢²¢³ NULL -¡¦¢µ¢¶¢·¢¸¢¹¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢Â¢Ã¢Ä¡¦¡¦¡¦ NULL +¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢¯¢°¢±¢²¢³ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦????? +¡¦¢µ¢¶¢·¢¸¢¹¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢Â¢Ã¢Ä¡¦¡¦¡¦ ¡¦??~??¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦???¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ -¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢ë¢ì¢í¢î¢ï NULL -¢ð¢ñ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ NULL +¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¢ë¢ì¢í¢î¢ï ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦????? +¢ð¢ñ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ??¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ -¡¦¡¦¡¦¡¦¡¦¦á¦â¦ã¦ä¦å¡¦¦ç¡¦¦é¦ê¡¦¦ì¡¦¡¦¡¦ NULL -¡¦¦ñ¦ò¦ó¦ô¦õ¦ö¦÷¦ø¦ù¦ú¦û¦ü¡¦¡¦¡¦¡¦¡¦¡¦¡¦ NULL +¡¦¡¦¡¦¡¦¡¦¦á¦â¦ã¦ä¦å¡¦¦ç¡¦¦é¦ê¡¦¦ì¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦?????¡¦?¡¦??¡¦?¡¦¡¦¡¦ +¡¦¦ñ¦ò¦ó¦ô¦õ¦ö¦÷¦ø¦ù¦ú¦û¦ü¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦????????????¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ -¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦§Â§Ã§Ä§Å§Æ§Ç NULL -§È§É§Ê§Ë§Ì§Í§Î¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ NULL +¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦§Â§Ã§Ä§Å§Æ§Ç ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦?????? +§È§É§Ê§Ë§Ì§Í§Î¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ???????¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ -¡¦¡¦§ò§ó§ô§õ§ö§÷§ø§ù§ú§û§ü§ý§þ¡¦¡¦¡¦¡¦¡¦ NULL -¡¦©¡©¢¡¦©¤¡¦©¦¡¦©¨©©¡¦©«©¬©­¡¦©¯©°¡¦¡¦¡¦ NULL -¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦©Á©Â©Ã©Ä©Å©Æ©Ç NULL -©È©É©Ê©Ë©Ì©Í©Î©Ï©Ð¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ NULL +¡¦¡¦§ò§ó§ô§õ§ö§÷§ø§ù§ú§û§ü§ý§þ¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦?????????????¡¦¡¦¡¦¡¦¡¦ +¡¦©¡©¢¡¦©¤¡¦©¦¡¦©¨©©¡¦©«©¬©­¡¦©¯©°¡¦¡¦¡¦ ¡¦??¡¦?¡¦?¡¦??¡¦???¡¦??¡¦¡¦¡¦ +¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦©Á©Â©Ã©Ä©Å©Æ©Ç ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦??????? +©È©É©Ê©Ë©Ì©Í©Î©Ï©Ð¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ?????????¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ -¡¦ª¡ª¢ª£ª¤ª¥ª¦ª§ª¨ª©ªªª«ª¬ª­ª®ª¯ª°ª±ª²ª³ NULL -ª´ªµª¶ª·ª¸¡¦ªºª»ª¼ª½ª¾ª¿ªÀªÁªÂªÃªÄªÅªÆªÇ NULL -ªÈªÉªÊªËªÌªÍªÎªÏªÐªÑªÒªÓªÔªÕªÖª×ªØªÙªÚªÛ NULL -ªÜªÝªÞªßªàªáªâªãªäªåªæªçªèªéªêªëªìªíªîªï NULL -ªðªñªòªóªôªõªöª÷¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ NULL -¡¦«¡«¢«£«¤«¥«¦«§«¨«©«ª«««¬«­«®«¯«°«±«²«³ NULL -«´«µ«¶«·«¸«¹«º«»¡¦«½«¾«¿«À«Á«Â«Ã¡¦«Å«Æ«Ç NULL -«È«É«Ê«Ë«Ì«Í«Î«Ï«Ð«Ñ«Ò«Ó«Ô«Õ«Ö«×«Ø«Ù«Ú«Û NULL -«Ü«Ý«Þ«ß«à«á«â«ã«ä«å«æ«ç«è«é«ê«ë«ì«í«î«ï NULL -«ð«ñ«ò«ó«ô«õ«ö«÷¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ NULL -¡¦°¡°¢°£°¤°¥°¦°§°¨°©°ª°«°¬°­°®°¯°°°±°²°³ NULL -°´°µ°¶°·°¸°¹°º°»°¼°½°¾°¿°À°Á°Â°Ã°Ä°Å°Æ°Ç NULL -°È°É°Ê°Ë°Ì°Í°Î°Ï°Ð°Ñ°Ò°Ó°Ô°Õ°Ö°×°Ø°Ù°Ú°Û NULL -°Ü°Ý°Þ°ß°à°á°â°ã°ä°å°æ°ç°è°é°ê°ë°ì°í°î°ï NULL -°ð°ñ°ò°ó°ô°õ°ö°÷°ø°ù°ú°û°ü°ý°þ¡¦¡¦¡¦¡¦¡¦ NULL -¡¦í¡í¢í£í¤í¥í¦í§í¨í©íªí«í¬í­í®í¯í°í±í²í³ NULL -í´íµí¶í·í¸í¹íºí»í¼í½í¾í¿íÀíÁíÂíÃíÄíÅíÆíÇ NULL -íÈíÉíÊíËíÌíÍíÎíÏíÐíÑíÒíÓíÔíÕíÖí×íØíÙíÚíÛ NULL -íÜíÝíÞíßíàíáíâí㡦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ NULL +¡¦ª¡ª¢ª£ª¤ª¥ª¦ª§ª¨ª©ªªª«ª¬ª­ª®ª¯ª°ª±ª²ª³ ¡¦??????????????????? +ª´ªµª¶ª·ª¸¡¦ªºª»ª¼ª½ª¾ª¿ªÀªÁªÂªÃªÄªÅªÆªÇ ?????¡¦?????????????? +ªÈªÉªÊªËªÌªÍªÎªÏªÐªÑªÒªÓªÔªÕªÖª×ªØªÙªÚªÛ ???????????????????? +ªÜªÝªÞªßªàªáªâªãªäªåªæªçªèªéªêªëªìªíªîªï ???????????????????? +ªðªñªòªóªôªõªöª÷¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ????????¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ +¡¦«¡«¢«£«¤«¥«¦«§«¨«©«ª«««¬«­«®«¯«°«±«²«³ ¡¦??????????????????? +«´«µ«¶«·«¸«¹«º«»¡¦«½«¾«¿«À«Á«Â«Ã¡¦«Å«Æ«Ç ????????¡¦???????¡¦??? +«È«É«Ê«Ë«Ì«Í«Î«Ï«Ð«Ñ«Ò«Ó«Ô«Õ«Ö«×«Ø«Ù«Ú«Û ???????????????????? +«Ü«Ý«Þ«ß«à«á«â«ã«ä«å«æ«ç«è«é«ê«ë«ì«í«î«ï ???????????????????? +«ð«ñ«ò«ó«ô«õ«ö«÷¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ????????¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ +¡¦°¡°¢°£°¤°¥°¦°§°¨°©°ª°«°¬°­°®°¯°°°±°²°³ ¡¦??????????????????? +°´°µ°¶°·°¸°¹°º°»°¼°½°¾°¿°À°Á°Â°Ã°Ä°Å°Æ°Ç ???????????????????? +°È°É°Ê°Ë°Ì°Í°Î°Ï°Ð°Ñ°Ò°Ó°Ô°Õ°Ö°×°Ø°Ù°Ú°Û ???????????????????? +°Ü°Ý°Þ°ß°à°á°â°ã°ä°å°æ°ç°è°é°ê°ë°ì°í°î°ï ???????????????????? +°ð°ñ°ò°ó°ô°õ°ö°÷°ø°ù°ú°û°ü°ý°þ¡¦¡¦¡¦¡¦¡¦ ???????????????¡¦¡¦¡¦¡¦¡¦ +¡¦í¡í¢í£í¤í¥í¦í§í¨í©íªí«í¬í­í®í¯í°í±í²í³ ¡¦??????????????????? +í´íµí¶í·í¸í¹íºí»í¼í½í¾í¿íÀíÁíÂíÃíÄíÅíÆíÇ ???????????????????? +íÈíÉíÊíËíÌíÍíÎíÏíÐíÑíÒíÓíÔíÕíÖí×íØíÙíÚíÛ ???????????????????? +íÜíÝíÞíßíàíáíâí㡦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ????????¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ ¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦ Warnings: Warning 1977 Cannot convert 'ujis' character 0x8FA2AF to 'sjis' diff --git a/mysql-test/suite/jp/r/jp_convert_utf8.result b/mysql-test/suite/jp/r/jp_convert_utf8.result index 89c8b582c40..e33edfb1c3f 100644 --- a/mysql-test/suite/jp/r/jp_convert_utf8.result +++ b/mysql-test/suite/jp/r/jp_convert_utf8.result @@ -111,7 +111,7 @@ SELECT `C1`, CONVERT(`C1` using ujis) FROM `ï¼´ï¼’`; ・弌ä¸ä¸•个丱丶丼丿乂乖乘亂亅豫亊舒å¼äºŽäºž ・弌ä¸ä¸•个丱丶丼丿乂乖乘亂亅豫亊舒å¼äºŽäºž ・蓮連錬呂魯櫓炉賂路露労å©å»Šå¼„æœ—æ¥¼æ¦”æµªæ¼ ãƒ»è“®é€£éŒ¬å‘‚é­¯æ«“ç‚‰è³‚è·¯éœ²åŠ´å©å»Šå¼„æœ—æ¥¼æ¦”æµªæ¼ ãƒ»éµéµžéµ¤éµ‘éµéµ™éµ²é¶‰é¶‡é¶«éµ¯éµºé¶šé¶¤é¶©é¶²é·„é·é¶» ・éµéµžéµ¤éµ‘éµéµ™éµ²é¶‰é¶‡é¶«éµ¯éµºé¶šé¶¤é¶©é¶²é·„é·é¶» -ヾã‚ゞ〃ä»ã€…〆〇ー―â€ï¼ï¼¼ã€œâ€–|…‥‘’ NULL +ヾã‚ゞ〃ä»ã€…〆〇ー―â€ï¼ï¼¼ã€œâ€–|…‥‘’ ヾã‚ゞ〃ä»ã€…〆〇ー―â€ï¼?〜‖|…‥‘’ 亟亠亢亰亳亶从ä»ä»„仆仂仗仞仭仟价伉佚估佛 亟亠亢亰亳亶从ä»ä»„仆仂仗仞仭仟价伉佚估佛 ä½ä½—佇佶侈ä¾ä¾˜ä½»ä½©ä½°ä¾‘佯來侖儘俔俟俎俘俛 ä½ä½—佇佶侈ä¾ä¾˜ä½»ä½©ä½°ä¾‘佯來侖儘俔俟俎俘俛 俑俚ä¿ä¿¤ä¿¥å€šå€¨å€”倪倥倅伜俶倡倩倬俾俯們倆 俑俚ä¿ä¿¤ä¿¥å€šå€¨å€”倪倥倅伜俶倡倩倬俾俯們倆 @@ -249,7 +249,7 @@ SELECT `C1`, CONVERT(`C1` using sjis) FROM `ï¼´ï¼’`; ・弌ä¸ä¸•个丱丶丼丿乂乖乘亂亅豫亊舒å¼äºŽäºž ・弌ä¸ä¸•个丱丶丼丿乂乖乘亂亅豫亊舒å¼äºŽäºž ・蓮連錬呂魯櫓炉賂路露労å©å»Šå¼„æœ—æ¥¼æ¦”æµªæ¼ ãƒ»è“®é€£éŒ¬å‘‚é­¯æ«“ç‚‰è³‚è·¯éœ²åŠ´å©å»Šå¼„æœ—æ¥¼æ¦”æµªæ¼ ãƒ»éµéµžéµ¤éµ‘éµéµ™éµ²é¶‰é¶‡é¶«éµ¯éµºé¶šé¶¤é¶©é¶²é·„é·é¶» ・éµéµžéµ¤éµ‘éµéµ™éµ²é¶‰é¶‡é¶«éµ¯éµºé¶šé¶¤é¶©é¶²é·„é·é¶» -ヾã‚ゞ〃ä»ã€…〆〇ー―â€ï¼ï¼¼ã€œâ€–|…‥‘’ NULL +ヾã‚ゞ〃ä»ã€…〆〇ー―â€ï¼ï¼¼ã€œâ€–|…‥‘’ ヾã‚ゞ〃ä»ã€…〆〇ー―â€ï¼?〜‖|…‥‘’ 亟亠亢亰亳亶从ä»ä»„仆仂仗仞仭仟价伉佚估佛 亟亠亢亰亳亶从ä»ä»„仆仂仗仞仭仟价伉佚估佛 ä½ä½—佇佶侈ä¾ä¾˜ä½»ä½©ä½°ä¾‘佯來侖儘俔俟俎俘俛 ä½ä½—佇佶侈ä¾ä¾˜ä½»ä½©ä½°ä¾‘佯來侖儘俔俟俎俘俛 俑俚ä¿ä¿¤ä¿¥å€šå€¨å€”倪倥倅伜俶倡倩倬俾俯們倆 俑俚ä¿ä¿¤ä¿¥å€šå€¨å€”倪倥倅伜俶倡倩倬俾俯們倆 @@ -287,7 +287,7 @@ SELECT `C1`, CONVERT(`C1` using ujis) FROM `T3`; ・ÃÀÄÂĂÇĀĄÅÃĆĈČÇĊĎÉÈË ・ÃÀÄÂĂÇĀĄÅÃĆĈČÇĊĎÉÈË ・áàäâăǎÄąåãćĉÄçċÄéèë ・áàäâăǎÄąåãćĉÄçċÄéèë ・ÆÄ・Ħ・IJ・ÅĿ・ŊØŒ・ŦÞ・・・ ・ÆÄ・Ħ・IJ・ÅĿ・ŊØŒ・ŦÞ・・・ -・˛˚~΄΅・・・・・・・・¡¦¿・・・ NULL +・˛˚~΄΅・・・・・・・・¡¦¿・・・ ・˛˚?΄΅・・・・・・・・¡¦¿・・・ ・άέήίϊÎόςÏϋΰώ・・・・・・・ ・άέήίϊÎόςÏϋΰώ・・・・・・・ ・・ђѓєѕіїјљњћќўџ・・・・・ ・・ђѓєѕіїјљњћќўџ・・・・・ ・・・・・ΆΈΉΊΪ・Ό・ΎΫ・Î・・・ ・・・・・ΆΈΉΊΪ・Ό・ΎΫ・Î・・・ @@ -359,28 +359,28 @@ SELECT `C1`, CONVERT(`C1` using ucs2) FROM `T3`; 龔龖龗龞龡龢龣龥・・・・・・・・・・・・ 龔龖龗龞龡龢龣龥・・・・・・・・・・・・ SELECT `C1`, CONVERT(`C1` using sjis) FROM `T3`; C1 CONVERT(`C1` using sjis) -êěėēęǵÄğ・ġĥíìïîÇ・īįĩ NULL -ÊĚĖĒĘ・ĜĞĢĠĤÃÃŒÃÃŽÇİĪĮĨ NULL -ĴĶĹĽĻŃŇŅÑÓÒÖÔǑÅŌÕŔŘŖ NULL -ĵķĺľļńňņñóòöôǒőÅõŕřŗ NULL -ŚŜŠŞŤŢÚÙÜÛŬǓŰŪŲŮŨǗǛǙ NULL -śŚşťţúùüûŭǔűūųůũǘǜǚ NULL -ǕŴßŶŹŽŻ・・・・・・・・・・・・ NULL -ǖŵýÿŷźžż・・・・・・・・・・・・ NULL -¤№・・・・・・・・・・・・・・・・・・ NULL -łŀʼnŋøœßŧþ・・・・・・・・・・・ NULL -ЈЉЊЋЌЎÐ・・・・・・・・・・・・・ NULL -・ÃÀÄÂĂÇĀĄÅÃĆĈČÇĊĎÉÈË NULL -・áàäâăǎÄąåãćĉÄçċÄéèë NULL -・ÆÄ・Ħ・IJ・ÅĿ・ŊØŒ・ŦÞ・・・ NULL -・˛˚~΄΅・・・・・・・・¡¦¿・・・ NULL -・άέήίϊÎόςÏϋΰώ・・・・・・・ NULL -・・ђѓєѕіїјљњћќўџ・・・・・ NULL -・・・・・ΆΈΉΊΪ・Ό・ΎΫ・Î・・・ NULL -・・・・・・・・・・・・・æđðħıijĸ NULL -・・・・・・・・・・・・・・ЂЃЄЅІЇ NULL -・・・・・・・・・・・・・・・ºª©®™ NULL -ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»Ë˜Ë‡Â¸Ë™Ë NULL +êěėēęǵÄğ・ġĥíìïîÇ・īįĩ ????????・???????・??? +ÊĚĖĒĘ・ĜĞĢĠĤÃÃŒÃÃŽÇİĪĮĨ ?????・?????????????? +ĴĶĹĽĻŃŇŅÑÓÒÖÔǑÅŌÕŔŘŖ ???????????????????? +ĵķĺľļńňņñóòöôǒőÅõŕřŗ ???????????????????? +ŚŜŠŞŤŢÚÙÜÛŬǓŰŪŲŮŨǗǛǙ ???????????????????? +śŚşťţúùüûŭǔűūųůũǘǜǚ ???????????????????? +ǕŴßŶŹŽŻ・・・・・・・・・・・・ ????????・・・・・・・・・・・・ +ǖŵýÿŷźžż・・・・・・・・・・・・ ????????・・・・・・・・・・・・ +¤№・・・・・・・・・・・・・・・・・・ ??・・・・・・・・・・・・・・・・・・ +łŀʼnŋøœßŧþ・・・・・・・・・・・ ?????????・・・・・・・・・・・ +ЈЉЊЋЌЎÐ・・・・・・・・・・・・・ ???????・・・・・・・・・・・・・ +・ÃÀÄÂĂÇĀĄÅÃĆĈČÇĊĎÉÈË ・??????????????????? +・áàäâăǎÄąåãćĉÄçċÄéèë ・??????????????????? +・ÆÄ・Ħ・IJ・ÅĿ・ŊØŒ・ŦÞ・・・ ・??・?・?・??・???・??・・・ +・˛˚~΄΅・・・・・・・・¡¦¿・・・ ・?????・・・・・・・・???・・・ +・άέήίϊÎόςÏϋΰώ・・・・・・・ ・????????????・・・・・・・ +・・ђѓєѕіїјљњћќўџ・・・・・ ・・?????????????・・・・・ +・・・・・ΆΈΉΊΪ・Ό・ΎΫ・Î・・・ ・・・・・?????・?・??・?・・・ +・・・・・・・・・・・・・æđðħıijĸ ・・・・・・・・・・・・・??????? +・・・・・・・・・・・・・・ЂЃЄЅІЇ ・・・・・・・・・・・・・・?????? +・・・・・・・・・・・・・・・ºª©®™ ・・・・・・・・・・・・・・・????? +ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»Ë˜Ë‡Â¸Ë™Ë ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»????? ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ @@ -390,15 +390,15 @@ SELECT `C1`, CONVERT(`C1` using sjis) FROM `T3`; ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ -・丂丄丅丌丒丟丣两丨丫丮丯丰丵乀ä¹ä¹„乇乑 NULL -・黸黿鼂鼃鼉é¼é¼é¼‘鼒鼔鼖鼗鼙鼚鼛鼟鼢鼦鼪 NULL -乚乜乣乨乩乴乵乹乿äºäº–亗äºäº¯äº¹ä»ƒä»ä»šä»›ä»  NULL -仡仢仨仯仱仳仵份仾仿伀伂伃伈伋伌伒伕伖众 NULL -伙伮伱你伳伵伷伹伻伾佀佂佈佉佋佌佒佔佖佘 NULL -佟佣佪佬佮佱佷佸佹佺佽佾ä¾ä¾‚侄・・・・・ NULL -鼫鼯鼱鼲鼴鼷鼹鼺鼼鼽鼿é½é½ƒé½„齅齆齇齓齕齖 NULL -齗齘齚é½é½žé½¨é½©é½­é½®é½¯é½°é½±é½³é½µé½ºé½½é¾é¾é¾‘é¾’ NULL -龔龖龗龞龡龢龣龥・・・・・・・・・・・・ NULL +・丂丄丅丌丒丟丣两丨丫丮丯丰丵乀ä¹ä¹„乇乑 ・??????????????????? +・黸黿鼂鼃鼉é¼é¼é¼‘鼒鼔鼖鼗鼙鼚鼛鼟鼢鼦鼪 ・??????????????????? +乚乜乣乨乩乴乵乹乿äºäº–亗äºäº¯äº¹ä»ƒä»ä»šä»›ä»  ???????????????????? +仡仢仨仯仱仳仵份仾仿伀伂伃伈伋伌伒伕伖众 ???????????????????? +伙伮伱你伳伵伷伹伻伾佀佂佈佉佋佌佒佔佖佘 ???????????????????? +佟佣佪佬佮佱佷佸佹佺佽佾ä¾ä¾‚侄・・・・・ ???????????????・・・・・ +鼫鼯鼱鼲鼴鼷鼹鼺鼼鼽鼿é½é½ƒé½„齅齆齇齓齕齖 ???????????????????? +齗齘齚é½é½žé½¨é½©é½­é½®é½¯é½°é½±é½³é½µé½ºé½½é¾é¾é¾‘é¾’ ???????????????????? +龔龖龗龞龡龢龣龥・・・・・・・・・・・・ ????????・・・・・・・・・・・・ Warnings: Warning 1977 Cannot convert 'utf8' character 0xC3AA to 'sjis' Warning 1977 Cannot convert 'utf8' character 0xC38A to 'sjis' @@ -515,7 +515,7 @@ SELECT `C1`, CONVERT(`C1` using ujis) FROM `T5`; ・弌ä¸ä¸•个丱丶丼丿乂乖乘亂亅豫亊舒å¼äºŽäºž ・弌ä¸ä¸•个丱丶丼丿乂乖乘亂亅豫亊舒å¼äºŽäºž ・蓮連錬呂魯櫓炉賂路露労å©å»Šå¼„æœ—æ¥¼æ¦”æµªæ¼ ãƒ»è“®é€£éŒ¬å‘‚é­¯æ«“ç‚‰è³‚è·¯éœ²åŠ´å©å»Šå¼„æœ—æ¥¼æ¦”æµªæ¼ ãƒ»éµéµžéµ¤éµ‘éµéµ™éµ²é¶‰é¶‡é¶«éµ¯éµºé¶šé¶¤é¶©é¶²é·„é·é¶» ・éµéµžéµ¤éµ‘éµéµ™éµ²é¶‰é¶‡é¶«éµ¯éµºé¶šé¶¤é¶©é¶²é·„é·é¶» -ヾã‚ゞ〃ä»ã€…〆〇ー―â€ï¼ï¼¼ã€œâ€–|…‥‘’ NULL +ヾã‚ゞ〃ä»ã€…〆〇ー―â€ï¼ï¼¼ã€œâ€–|…‥‘’ ヾã‚ゞ〃ä»ã€…〆〇ー―â€ï¼?〜‖|…‥‘’ 亟亠亢亰亳亶从ä»ä»„仆仂仗仞仭仟价伉佚估佛 亟亠亢亰亳亶从ä»ä»„仆仂仗仞仭仟价伉佚估佛 ä½ä½—佇佶侈ä¾ä¾˜ä½»ä½©ä½°ä¾‘佯來侖儘俔俟俎俘俛 ä½ä½—佇佶侈ä¾ä¾˜ä½»ä½©ä½°ä¾‘佯來侖儘俔俟俎俘俛 俑俚ä¿ä¿¤ä¿¥å€šå€¨å€”倪倥倅伜俶倡倩倬俾俯們倆 俑俚ä¿ä¿¤ä¿¥å€šå€¨å€”倪倥倅伜俶倡倩倬俾俯們倆 @@ -653,7 +653,7 @@ SELECT `C1`, CONVERT(`C1` using sjis) FROM `T5`; ・弌ä¸ä¸•个丱丶丼丿乂乖乘亂亅豫亊舒å¼äºŽäºž ・弌ä¸ä¸•个丱丶丼丿乂乖乘亂亅豫亊舒å¼äºŽäºž ・蓮連錬呂魯櫓炉賂路露労å©å»Šå¼„æœ—æ¥¼æ¦”æµªæ¼ ãƒ»è“®é€£éŒ¬å‘‚é­¯æ«“ç‚‰è³‚è·¯éœ²åŠ´å©å»Šå¼„æœ—æ¥¼æ¦”æµªæ¼ ãƒ»éµéµžéµ¤éµ‘éµéµ™éµ²é¶‰é¶‡é¶«éµ¯éµºé¶šé¶¤é¶©é¶²é·„é·é¶» ・éµéµžéµ¤éµ‘éµéµ™éµ²é¶‰é¶‡é¶«éµ¯éµºé¶šé¶¤é¶©é¶²é·„é·é¶» -ヾã‚ゞ〃ä»ã€…〆〇ー―â€ï¼ï¼¼ã€œâ€–|…‥‘’ NULL +ヾã‚ゞ〃ä»ã€…〆〇ー―â€ï¼ï¼¼ã€œâ€–|…‥‘’ ヾã‚ゞ〃ä»ã€…〆〇ー―â€ï¼?〜‖|…‥‘’ 亟亠亢亰亳亶从ä»ä»„仆仂仗仞仭仟价伉佚估佛 亟亠亢亰亳亶从ä»ä»„仆仂仗仞仭仟价伉佚估佛 ä½ä½—佇佶侈ä¾ä¾˜ä½»ä½©ä½°ä¾‘佯來侖儘俔俟俎俘俛 ä½ä½—佇佶侈ä¾ä¾˜ä½»ä½©ä½°ä¾‘佯來侖儘俔俟俎俘俛 俑俚ä¿ä¿¤ä¿¥å€šå€¨å€”倪倥倅伜俶倡倩倬俾俯們倆 俑俚ä¿ä¿¤ä¿¥å€šå€¨å€”倪倥倅伜俶倡倩倬俾俯們倆 @@ -691,7 +691,7 @@ SELECT `C1`, CONVERT(`C1` using ujis) FROM `ï¼´ï¼–`; ・ÃÀÄÂĂÇĀĄÅÃĆĈČÇĊĎÉÈË ・ÃÀÄÂĂÇĀĄÅÃĆĈČÇĊĎÉÈË ・áàäâăǎÄąåãćĉÄçċÄéèë ・áàäâăǎÄąåãćĉÄçċÄéèë ・ÆÄ・Ħ・IJ・ÅĿ・ŊØŒ・ŦÞ・・・ ・ÆÄ・Ħ・IJ・ÅĿ・ŊØŒ・ŦÞ・・・ -・˛˚~΄΅・・・・・・・・¡¦¿・・・ NULL +・˛˚~΄΅・・・・・・・・¡¦¿・・・ ・˛˚?΄΅・・・・・・・・¡¦¿・・・ ・άέήίϊÎόςÏϋΰώ・・・・・・・ ・άέήίϊÎόςÏϋΰώ・・・・・・・ ・・ђѓєѕіїјљњћќўџ・・・・・ ・・ђѓєѕіїјљњћќўџ・・・・・ ・・・・・ΆΈΉΊΪ・Ό・ΎΫ・Î・・・ ・・・・・ΆΈΉΊΪ・Ό・ΎΫ・Î・・・ @@ -763,28 +763,28 @@ SELECT `C1`, CONVERT(`C1` using ucs2) FROM `ï¼´ï¼–`; 龔龖龗龞龡龢龣龥・・・・・・・・・・・・ 龔龖龗龞龡龢龣龥・・・・・・・・・・・・ SELECT `C1`, CONVERT(`C1` using sjis) FROM `ï¼´ï¼–`; C1 CONVERT(`C1` using sjis) -êěėēęǵÄğ・ġĥíìïîÇ・īįĩ NULL -ÊĚĖĒĘ・ĜĞĢĠĤÃÃŒÃÃŽÇİĪĮĨ NULL -ĴĶĹĽĻŃŇŅÑÓÒÖÔǑÅŌÕŔŘŖ NULL -ĵķĺľļńňņñóòöôǒőÅõŕřŗ NULL -ŚŜŠŞŤŢÚÙÜÛŬǓŰŪŲŮŨǗǛǙ NULL -śŚşťţúùüûŭǔűūųůũǘǜǚ NULL -ǕŴßŶŹŽŻ・・・・・・・・・・・・ NULL -ǖŵýÿŷźžż・・・・・・・・・・・・ NULL -¤№・・・・・・・・・・・・・・・・・・ NULL -łŀʼnŋøœßŧþ・・・・・・・・・・・ NULL -ЈЉЊЋЌЎÐ・・・・・・・・・・・・・ NULL -・ÃÀÄÂĂÇĀĄÅÃĆĈČÇĊĎÉÈË NULL -・áàäâăǎÄąåãćĉÄçċÄéèë NULL -・ÆÄ・Ħ・IJ・ÅĿ・ŊØŒ・ŦÞ・・・ NULL -・˛˚~΄΅・・・・・・・・¡¦¿・・・ NULL -・άέήίϊÎόςÏϋΰώ・・・・・・・ NULL -・・ђѓєѕіїјљњћќўџ・・・・・ NULL -・・・・・ΆΈΉΊΪ・Ό・ΎΫ・Î・・・ NULL -・・・・・・・・・・・・・æđðħıijĸ NULL -・・・・・・・・・・・・・・ЂЃЄЅІЇ NULL -・・・・・・・・・・・・・・・ºª©®™ NULL -ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»Ë˜Ë‡Â¸Ë™Ë NULL +êěėēęǵÄğ・ġĥíìïîÇ・īįĩ ????????・???????・??? +ÊĚĖĒĘ・ĜĞĢĠĤÃÃŒÃÃŽÇİĪĮĨ ?????・?????????????? +ĴĶĹĽĻŃŇŅÑÓÒÖÔǑÅŌÕŔŘŖ ???????????????????? +ĵķĺľļńňņñóòöôǒőÅõŕřŗ ???????????????????? +ŚŜŠŞŤŢÚÙÜÛŬǓŰŪŲŮŨǗǛǙ ???????????????????? +śŚşťţúùüûŭǔűūųůũǘǜǚ ???????????????????? +ǕŴßŶŹŽŻ・・・・・・・・・・・・ ????????・・・・・・・・・・・・ +ǖŵýÿŷźžż・・・・・・・・・・・・ ????????・・・・・・・・・・・・ +¤№・・・・・・・・・・・・・・・・・・ ??・・・・・・・・・・・・・・・・・・ +łŀʼnŋøœßŧþ・・・・・・・・・・・ ?????????・・・・・・・・・・・ +ЈЉЊЋЌЎÐ・・・・・・・・・・・・・ ???????・・・・・・・・・・・・・ +・ÃÀÄÂĂÇĀĄÅÃĆĈČÇĊĎÉÈË ・??????????????????? +・áàäâăǎÄąåãćĉÄçċÄéèë ・??????????????????? +・ÆÄ・Ħ・IJ・ÅĿ・ŊØŒ・ŦÞ・・・ ・??・?・?・??・???・??・・・ +・˛˚~΄΅・・・・・・・・¡¦¿・・・ ・?????・・・・・・・・???・・・ +・άέήίϊÎόςÏϋΰώ・・・・・・・ ・????????????・・・・・・・ +・・ђѓєѕіїјљњћќўџ・・・・・ ・・?????????????・・・・・ +・・・・・ΆΈΉΊΪ・Ό・ΎΫ・Î・・・ ・・・・・?????・?・??・?・・・ +・・・・・・・・・・・・・æđðħıijĸ ・・・・・・・・・・・・・??????? +・・・・・・・・・・・・・・ЂЃЄЅІЇ ・・・・・・・・・・・・・・?????? +・・・・・・・・・・・・・・・ºª©®™ ・・・・・・・・・・・・・・・????? +ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»Ë˜Ë‡Â¸Ë™Ë ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»????? ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ @@ -794,15 +794,15 @@ SELECT `C1`, CONVERT(`C1` using sjis) FROM `ï¼´ï¼–`; ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ -・丂丄丅丌丒丟丣两丨丫丮丯丰丵乀ä¹ä¹„乇乑 NULL -・黸黿鼂鼃鼉é¼é¼é¼‘鼒鼔鼖鼗鼙鼚鼛鼟鼢鼦鼪 NULL -乚乜乣乨乩乴乵乹乿äºäº–亗äºäº¯äº¹ä»ƒä»ä»šä»›ä»  NULL -仡仢仨仯仱仳仵份仾仿伀伂伃伈伋伌伒伕伖众 NULL -伙伮伱你伳伵伷伹伻伾佀佂佈佉佋佌佒佔佖佘 NULL -佟佣佪佬佮佱佷佸佹佺佽佾ä¾ä¾‚侄・・・・・ NULL -鼫鼯鼱鼲鼴鼷鼹鼺鼼鼽鼿é½é½ƒé½„齅齆齇齓齕齖 NULL -齗齘齚é½é½žé½¨é½©é½­é½®é½¯é½°é½±é½³é½µé½ºé½½é¾é¾é¾‘é¾’ NULL -龔龖龗龞龡龢龣龥・・・・・・・・・・・・ NULL +・丂丄丅丌丒丟丣两丨丫丮丯丰丵乀ä¹ä¹„乇乑 ・??????????????????? +・黸黿鼂鼃鼉é¼é¼é¼‘鼒鼔鼖鼗鼙鼚鼛鼟鼢鼦鼪 ・??????????????????? +乚乜乣乨乩乴乵乹乿äºäº–亗äºäº¯äº¹ä»ƒä»ä»šä»›ä»  ???????????????????? +仡仢仨仯仱仳仵份仾仿伀伂伃伈伋伌伒伕伖众 ???????????????????? +伙伮伱你伳伵伷伹伻伾佀佂佈佉佋佌佒佔佖佘 ???????????????????? +佟佣佪佬佮佱佷佸佹佺佽佾ä¾ä¾‚侄・・・・・ ???????????????・・・・・ +鼫鼯鼱鼲鼴鼷鼹鼺鼼鼽鼿é½é½ƒé½„齅齆齇齓齕齖 ???????????????????? +齗齘齚é½é½žé½¨é½©é½­é½®é½¯é½°é½±é½³é½µé½ºé½½é¾é¾é¾‘é¾’ ???????????????????? +龔龖龗龞龡龢龣龥・・・・・・・・・・・・ ????????・・・・・・・・・・・・ Warnings: Warning 1977 Cannot convert 'utf8' character 0xC3AA to 'sjis' Warning 1977 Cannot convert 'utf8' character 0xC38A to 'sjis' @@ -874,7 +874,7 @@ pqrstuvwxyz{|}~ pqrstuvwxyz{|}~ SELECT `C1`, CONVERT(`C1` using ujis) FROM `T8`; C1 CONVERT(`C1` using ujis)   ã€ã€‚,.・:;?ï¼ã‚›ã‚œÂ´ï½€Â¨ï¼¾ï¿£ï¼¿ãƒ½   ã€ã€‚,.・:;?ï¼ã‚›ã‚œÂ´ï½€Â¨ï¼¾ï¿£ï¼¿ãƒ½ -ヾã‚ゞ〃ä»ã€…〆〇ー―â€ï¼ï¼¼ã€œâ€–|…‥‘’ NULL +ヾã‚ゞ〃ä»ã€…〆〇ー―â€ï¼ï¼¼ã€œâ€–|…‥‘’ ヾã‚ゞ〃ä»ã€…〆〇ー―â€ï¼?〜‖|…‥‘’ “â€ï¼ˆï¼‰ã€”〕[]{ï½ã€ˆã€‰ã€Šã€‹ã€Œã€ã€Žã€ã€ã€‘ “â€ï¼ˆï¼‰ã€”〕[]{ï½ã€ˆã€‰ã€Šã€‹ã€Œã€ã€Žã€ã€ã€‘ +â€Â±Ã—÷ï¼â‰ ï¼œï¼žâ‰¦â‰§âˆžâˆ´â™‚♀°′″℃¥ +â€Â±Ã—÷ï¼â‰ ï¼œï¼žâ‰¦â‰§âˆžâˆ´â™‚♀°′″℃¥ $¢£%#&*@§☆★○â—◎◇・・・・・ $¢£%#&*@§☆★○â—◎◇・・・・・ @@ -1012,7 +1012,7 @@ SELECT `C1`, CONVERT(`C1` using ucs2) FROM `T8`; SELECT `C1`, CONVERT(`C1` using sjis) FROM `T8`; C1 CONVERT(`C1` using sjis)   ã€ã€‚,.・:;?ï¼ã‚›ã‚œÂ´ï½€Â¨ï¼¾ï¿£ï¼¿ãƒ½   ã€ã€‚,.・:;?ï¼ã‚›ã‚œÂ´ï½€Â¨ï¼¾ï¿£ï¼¿ãƒ½ -ヾã‚ゞ〃ä»ã€…〆〇ー―â€ï¼ï¼¼ã€œâ€–|…‥‘’ NULL +ヾã‚ゞ〃ä»ã€…〆〇ー―â€ï¼ï¼¼ã€œâ€–|…‥‘’ ヾã‚ゞ〃ä»ã€…〆〇ー―â€ï¼?〜‖|…‥‘’ “â€ï¼ˆï¼‰ã€”〕[]{ï½ã€ˆã€‰ã€Šã€‹ã€Œã€ã€Žã€ã€ã€‘ “â€ï¼ˆï¼‰ã€”〕[]{ï½ã€ˆã€‰ã€Šã€‹ã€Œã€ã€Žã€ã€ã€‘ +â€Â±Ã—÷ï¼â‰ ï¼œï¼žâ‰¦â‰§âˆžâˆ´â™‚♀°′″℃¥ +â€Â±Ã—÷ï¼â‰ ï¼œï¼žâ‰¦â‰§âˆžâˆ´â™‚♀°′″℃¥ $¢£%#&*@§☆★○â—◎◇・・・・・ $¢£%#&*@§☆★○â—◎◇・・・・・ @@ -1082,7 +1082,7 @@ Warning 1977 Cannot convert 'utf8' character 0xEFBCBC to 'sjis' SELECT `C1`, CONVERT(`C1` using ujis) FROM `ï¼´ï¼™`; C1 CONVERT(`C1` using ujis) ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»Ë˜Ë‡Â¸Ë™Ë ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»Ë˜Ë‡Â¸Ë™Ë -・˛˚~΄΅・・・・・・・・¡¦¿・・・ NULL +・˛˚~΄΅・・・・・・・・¡¦¿・・・ ・˛˚?΄΅・・・・・・・・¡¦¿・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・ºª©®™ ・・・・・・・・・・・・・・・ºª©®™ ¤№・・・・・・・・・・・・・・・・・・ ¤№・・・・・・・・・・・・・・・・・・ @@ -1167,45 +1167,45 @@ SELECT `C1`, CONVERT(`C1` using ucs2) FROM `ï¼´ï¼™`; ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ SELECT `C1`, CONVERT(`C1` using sjis) FROM `ï¼´ï¼™`; C1 CONVERT(`C1` using sjis) -ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»Ë˜Ë‡Â¸Ë™Ë NULL -・˛˚~΄΅・・・・・・・・¡¦¿・・・ NULL +ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»Ë˜Ë‡Â¸Ë™Ë ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»ãƒ»????? +・˛˚~΄΅・・・・・・・・¡¦¿・・・ ・?????・・・・・・・・???・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ -・・・・・・・・・・・・・・・ºª©®™ NULL -¤№・・・・・・・・・・・・・・・・・・ NULL +・・・・・・・・・・・・・・・ºª©®™ ・・・・・・・・・・・・・・・????? +¤№・・・・・・・・・・・・・・・・・・ ??・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ -・・・・・ΆΈΉΊΪ・Ό・ΎΫ・Î・・・ NULL -・άέήίϊÎόςÏϋΰώ・・・・・・・ NULL +・・・・・ΆΈΉΊΪ・Ό・ΎΫ・Î・・・ ・・・・・?????・?・??・?・・・ +・άέήίϊÎόςÏϋΰώ・・・・・・・ ・????????????・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ -・・・・・・・・・・・・・・ЂЃЄЅІЇ NULL -ЈЉЊЋЌЎÐ・・・・・・・・・・・・・ NULL +・・・・・・・・・・・・・・ЂЃЄЅІЇ ・・・・・・・・・・・・・・?????? +ЈЉЊЋЌЎÐ・・・・・・・・・・・・・ ???????・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ -・・ђѓєѕіїјљњћќўџ・・・・・ NULL -・ÆÄ・Ħ・IJ・ÅĿ・ŊØŒ・ŦÞ・・・ NULL -・・・・・・・・・・・・・æđðħıijĸ NULL -łŀʼnŋøœßŧþ・・・・・・・・・・・ NULL +・・ђѓєѕіїјљњћќўџ・・・・・ ・・?????????????・・・・・ +・ÆÄ・Ħ・IJ・ÅĿ・ŊØŒ・ŦÞ・・・ ・??・?・?・??・???・??・・・ +・・・・・・・・・・・・・æđðħıijĸ ・・・・・・・・・・・・・??????? +łŀʼnŋøœßŧþ・・・・・・・・・・・ ?????????・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ -・ÃÀÄÂĂÇĀĄÅÃĆĈČÇĊĎÉÈË NULL -ÊĚĖĒĘ・ĜĞĢĠĤÃÃŒÃÃŽÇİĪĮĨ NULL -ĴĶĹĽĻŃŇŅÑÓÒÖÔǑÅŌÕŔŘŖ NULL -ŚŜŠŞŤŢÚÙÜÛŬǓŰŪŲŮŨǗǛǙ NULL -ǕŴßŶŹŽŻ・・・・・・・・・・・・ NULL -・áàäâăǎÄąåãćĉÄçċÄéèë NULL -êěėēęǵÄğ・ġĥíìïîÇ・īįĩ NULL -ĵķĺľļńňņñóòöôǒőÅõŕřŗ NULL -śŚşťţúùüûŭǔűūųůũǘǜǚ NULL -ǖŵýÿŷźžż・・・・・・・・・・・・ NULL -・丂丄丅丌丒丟丣两丨丫丮丯丰丵乀ä¹ä¹„乇乑 NULL -乚乜乣乨乩乴乵乹乿äºäº–亗äºäº¯äº¹ä»ƒä»ä»šä»›ä»  NULL -仡仢仨仯仱仳仵份仾仿伀伂伃伈伋伌伒伕伖众 NULL -伙伮伱你伳伵伷伹伻伾佀佂佈佉佋佌佒佔佖佘 NULL -佟佣佪佬佮佱佷佸佹佺佽佾ä¾ä¾‚侄・・・・・ NULL -・黸黿鼂鼃鼉é¼é¼é¼‘鼒鼔鼖鼗鼙鼚鼛鼟鼢鼦鼪 NULL -鼫鼯鼱鼲鼴鼷鼹鼺鼼鼽鼿é½é½ƒé½„齅齆齇齓齕齖 NULL -齗齘齚é½é½žé½¨é½©é½­é½®é½¯é½°é½±é½³é½µé½ºé½½é¾é¾é¾‘é¾’ NULL -龔龖龗龞龡龢龣龥・・・・・・・・・・・・ NULL +・ÃÀÄÂĂÇĀĄÅÃĆĈČÇĊĎÉÈË ・??????????????????? +ÊĚĖĒĘ・ĜĞĢĠĤÃÃŒÃÃŽÇİĪĮĨ ?????・?????????????? +ĴĶĹĽĻŃŇŅÑÓÒÖÔǑÅŌÕŔŘŖ ???????????????????? +ŚŜŠŞŤŢÚÙÜÛŬǓŰŪŲŮŨǗǛǙ ???????????????????? +ǕŴßŶŹŽŻ・・・・・・・・・・・・ ????????・・・・・・・・・・・・ +・áàäâăǎÄąåãćĉÄçċÄéèë ・??????????????????? +êěėēęǵÄğ・ġĥíìïîÇ・īįĩ ????????・???????・??? +ĵķĺľļńňņñóòöôǒőÅõŕřŗ ???????????????????? +śŚşťţúùüûŭǔűūųůũǘǜǚ ???????????????????? +ǖŵýÿŷźžż・・・・・・・・・・・・ ????????・・・・・・・・・・・・ +・丂丄丅丌丒丟丣两丨丫丮丯丰丵乀ä¹ä¹„乇乑 ・??????????????????? +乚乜乣乨乩乴乵乹乿äºäº–亗äºäº¯äº¹ä»ƒä»ä»šä»›ä»  ???????????????????? +仡仢仨仯仱仳仵份仾仿伀伂伃伈伋伌伒伕伖众 ???????????????????? +伙伮伱你伳伵伷伹伻伾佀佂佈佉佋佌佒佔佖佘 ???????????????????? +佟佣佪佬佮佱佷佸佹佺佽佾ä¾ä¾‚侄・・・・・ ???????????????・・・・・ +・黸黿鼂鼃鼉é¼é¼é¼‘鼒鼔鼖鼗鼙鼚鼛鼟鼢鼦鼪 ・??????????????????? +鼫鼯鼱鼲鼴鼷鼹鼺鼼鼽鼿é½é½ƒé½„齅齆齇齓齕齖 ???????????????????? +齗齘齚é½é½žé½¨é½©é½­é½®é½¯é½°é½±é½³é½µé½ºé½½é¾é¾é¾‘é¾’ ???????????????????? +龔龖龗龞龡龢龣龥・・・・・・・・・・・・ ????????・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ Warnings: Warning 1977 Cannot convert 'utf8' character 0xCB98 to 'sjis' diff --git a/mysql-test/suite/json/r/json_no_table.result b/mysql-test/suite/json/r/json_no_table.result index cf4cd5b8af8..034a4e6c0a6 100644 --- a/mysql-test/suite/json/r/json_no_table.result +++ b/mysql-test/suite/json/r/json_no_table.result @@ -2109,10 +2109,9 @@ ERROR 42000: Incorrect parameter count in the call to native function 'json_set' error ER_INVALID_JSON_TEXT_IN_PARAM SELECT JSON_SET('{}', '$.name', JSON_EXTRACT('', '$')); JSON_SET('{}', '$.name', JSON_EXTRACT('', '$')) -NULL +{"name": null} Warnings: Warning 4037 Unexpected end of JSON text in argument 1 to function 'json_extract' -Warning 4038 Syntax error in JSON text in argument 1 to function 'json_set' at position 2 select json_set('[1,2,3]', '$[2]', 4); json_set('[1,2,3]', '$[2]', 4) [1, 2, 4] diff --git a/mysql-test/suite/large_tests/r/rpl_slave_net_timeout.result b/mysql-test/suite/large_tests/r/rpl_slave_net_timeout.result index 4dcc2e6295f..ad704c0c683 100644 --- a/mysql-test/suite/large_tests/r/rpl_slave_net_timeout.result +++ b/mysql-test/suite/large_tests/r/rpl_slave_net_timeout.result @@ -1,20 +1,27 @@ include/master-slave.inc [connection master] +connection master; set @save_general_log = @@global.general_log; set @save_log_output = @@global.log_output; +connection slave; set @save_slave_net_timeout = @@global.slave_net_timeout; +connection master; set @@global.general_log = ON; set @@global.log_output = 'table,file'; +connection slave; include/stop_slave.inc change master to master_host = '127.0.0.1',master_port = MASTER_PORT, master_user = 'root', master_heartbeat_period = 0; set @@global.slave_net_timeout = @@global.net_read_timeout * 2; include/start_slave.inc include/stop_slave.inc +connection master; select event_time from (select event_time from mysql.general_log as t_1 where command_type like 'Connect' order by event_time desc limit 2) as t_2 order by event_time desc limit 1 into @ts_last; select event_time from (select event_time from mysql.general_log as t_1 where command_type like 'Connect' order by event_time desc limit 2) as t_2 order by event_time asc limit 1 into @ts_prev; include/assert.inc [time between last reconnection and the reconnection before that should be >= slave_net_timeout] +connection master; set @@global.general_log = @save_general_log; set @@global.log_output = @save_log_output; +connection slave; set @@global.slave_net_timeout = @save_slave_net_timeout; include/rpl_end.inc diff --git a/mysql-test/suite/maria/icp.result b/mysql-test/suite/maria/icp.result index 0ebdd726b4e..d22e705e6de 100644 --- a/mysql-test/suite/maria/icp.result +++ b/mysql-test/suite/maria/icp.result @@ -432,7 +432,7 @@ WHERE pk IN (SELECT it.pk FROM t2 JOIN t2 AS it ON it.i=it.i WHERE it.pk-t1.i<10 id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t1 ALL NULL NULL NULL NULL 3 Using where 2 DEPENDENT SUBQUERY it eq_ref PRIMARY PRIMARY 4 func 1 Using index condition -2 DEPENDENT SUBQUERY t2 index NULL PRIMARY 4 NULL 3 Using where; Using index; Using join buffer (flat, BNL join) +2 DEPENDENT SUBQUERY t2 index NULL PRIMARY 4 NULL 3 Using index; Using join buffer (flat, BNL join) SELECT * FROM t1 WHERE pk IN (SELECT it.pk FROM t2 JOIN t2 AS it ON it.i=it.i WHERE it.pk-t1.i<10); pk i @@ -806,7 +806,7 @@ id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t ALL PRIMARY,c NULL NULL NULL 64 Using where 1 PRIMARY t2 ref g g 5 test.t.c 19 Using where 2 DEPENDENT SUBQUERY t1 index PRIMARY PRIMARY 4 NULL 64 Using where; Using index -2 DEPENDENT SUBQUERY t2 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 Using index condition; Using where +2 DEPENDENT SUBQUERY t2 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 Using where SELECT COUNT(*) FROM t1 AS t, t2 WHERE c = g AND (EXISTS (SELECT * FROM t1, t2 WHERE a = f AND h <= t.e AND a > t.b) diff --git a/mysql-test/suite/maria/maria-gis-rtree-dynamic.result b/mysql-test/suite/maria/maria-gis-rtree-dynamic.result index a0535026722..8bea5edb6fb 100644 --- a/mysql-test/suite/maria/maria-gis-rtree-dynamic.result +++ b/mysql-test/suite/maria/maria-gis-rtree-dynamic.result @@ -168,7 +168,7 @@ count(*) 150 EXPLAIN SELECT fid, AsText(g) FROM t1 WHERE Within(g, GeomFromText('Polygon((140 140,160 140,160 160,140 160,140 140))')); id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ALL g NULL NULL NULL 150 Using where +1 SIMPLE t1 range g g 34 NULL 11 Using where SELECT fid, AsText(g) FROM t1 WHERE Within(g, GeomFromText('Polygon((140 140,160 140,160 160,140 160,140 140))')); fid AsText(g) 1 LINESTRING(150 150,150 150) @@ -302,7 +302,7 @@ count(*) EXPLAIN SELECT fid, AsText(g) FROM t2 WHERE Within(g, GeomFromText('Polygon((40 40,60 40,60 60,40 60,40 40))')); id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 range g g 34 NULL 1 Using where +1 SIMPLE t2 range g g 34 NULL 4 Using where SELECT fid, AsText(g) FROM t2 WHERE Within(g, GeomFromText('Polygon((40 40,60 40,60 60,40 60,40 40))')); fid AsText(g) diff --git a/mysql-test/suite/maria/maria-gis-rtree-trans.result b/mysql-test/suite/maria/maria-gis-rtree-trans.result index dbcbdeb1661..4a2f97fbd41 100644 --- a/mysql-test/suite/maria/maria-gis-rtree-trans.result +++ b/mysql-test/suite/maria/maria-gis-rtree-trans.result @@ -168,7 +168,7 @@ count(*) 150 EXPLAIN SELECT fid, AsText(g) FROM t1 WHERE Within(g, GeomFromText('Polygon((140 140,160 140,160 160,140 160,140 140))')); id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ALL g NULL NULL NULL 150 Using where +1 SIMPLE t1 range g g 34 NULL 11 Using where SELECT fid, AsText(g) FROM t1 WHERE Within(g, GeomFromText('Polygon((140 140,160 140,160 160,140 160,140 140))')); fid AsText(g) 1 LINESTRING(150 150,150 150) @@ -302,7 +302,7 @@ count(*) EXPLAIN SELECT fid, AsText(g) FROM t2 WHERE Within(g, GeomFromText('Polygon((40 40,60 40,60 60,40 60,40 40))')); id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 range g g 34 NULL 1 Using where +1 SIMPLE t2 range g g 34 NULL 4 Using where SELECT fid, AsText(g) FROM t2 WHERE Within(g, GeomFromText('Polygon((40 40,60 40,60 60,40 60,40 40))')); fid AsText(g) diff --git a/mysql-test/suite/maria/maria-gis-rtree.result b/mysql-test/suite/maria/maria-gis-rtree.result index 3ecdcc64928..901a7bee397 100644 --- a/mysql-test/suite/maria/maria-gis-rtree.result +++ b/mysql-test/suite/maria/maria-gis-rtree.result @@ -168,7 +168,7 @@ count(*) 150 EXPLAIN SELECT fid, AsText(g) FROM t1 WHERE Within(g, GeomFromText('Polygon((140 140,160 140,160 160,140 160,140 140))')); id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ALL g NULL NULL NULL 150 Using where +1 SIMPLE t1 range g g 34 NULL 11 Using where SELECT fid, AsText(g) FROM t1 WHERE Within(g, GeomFromText('Polygon((140 140,160 140,160 160,140 160,140 140))')); fid AsText(g) 1 LINESTRING(150 150,150 150) @@ -302,7 +302,7 @@ count(*) EXPLAIN SELECT fid, AsText(g) FROM t2 WHERE Within(g, GeomFromText('Polygon((40 40,60 40,60 60,40 60,40 40))')); id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 range g g 34 NULL 1 Using where +1 SIMPLE t2 range g g 34 NULL 4 Using where SELECT fid, AsText(g) FROM t2 WHERE Within(g, GeomFromText('Polygon((40 40,60 40,60 60,40 60,40 40))')); fid AsText(g) diff --git a/mysql-test/suite/maria/maria.result b/mysql-test/suite/maria/maria.result index 04b042059fb..88f39827f27 100644 --- a/mysql-test/suite/maria/maria.result +++ b/mysql-test/suite/maria/maria.result @@ -1145,6 +1145,9 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref v v 13 const # Using where; Using index alter table t1 add unique(v); ERROR 23000: Duplicate entry '{ ' for key 'v_2' +show warnings; +Level Code Message +Error 1062 Duplicate entry 'a' for key 'v_2' alter table t1 add key(v); Warnings: Note 1831 Duplicate index `v_2`. This is deprecated and will be disallowed in a future release diff --git a/mysql-test/suite/mariabackup/apply-log-only-incr.result b/mysql-test/suite/mariabackup/apply-log-only-incr.result new file mode 100644 index 00000000000..2baed8c1db9 --- /dev/null +++ b/mysql-test/suite/mariabackup/apply-log-only-incr.result @@ -0,0 +1,29 @@ +call mtr.add_suppression("InnoDB: New log files created"); +CREATE TABLE t(a INT UNSIGNED PRIMARY KEY) ENGINE INNODB; +INSERT INTO t VALUES(0); +COMMIT; +start transaction; +NOT FOUND /Rollback of trx with id/ in current_test +# expect NOT FOUND +NOT FOUND /Rollback of trx with id/ in current_test +# expect NOT FOUND +commit; +SELECT count(*) FROM t; +count(*) +201 +# Restore and check results +# shutdown server +# remove datadir +# xtrabackup move back +# restart server +SELECT COUNT(*) FROM t; +COUNT(*) +1 +SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +SELECT COUNT(*) FROM t; +COUNT(*) +201 +SELECT * FROM t; +a +0 +DROP TABLE t; diff --git a/mysql-test/suite/mariabackup/apply-log-only-incr.test b/mysql-test/suite/mariabackup/apply-log-only-incr.test new file mode 100644 index 00000000000..aa5110cc51e --- /dev/null +++ b/mysql-test/suite/mariabackup/apply-log-only-incr.test @@ -0,0 +1,63 @@ +--source include/have_innodb.inc + +call mtr.add_suppression("InnoDB: New log files created"); + +let $basedir=$MYSQLTEST_VARDIR/tmp/backup; +let $incremental_dir=$MYSQLTEST_VARDIR/tmp/backup_inc1; + +CREATE TABLE t(a INT UNSIGNED PRIMARY KEY) ENGINE INNODB; +INSERT INTO t VALUES(0); +COMMIT; + +start transaction; +--disable_query_log +let $n=100; +while ($n) { +eval INSERT t VALUES(101-$n); +dec $n; +} + +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$basedir; +--enable_result_log +let $n=100; +while ($n) { +eval INSERT t VALUES(201-$n); +dec $n; +} +--enable_query_log + +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --ftwrl-wait-timeout=5 --ftwrl-wait-threshold=300 --ftwrl-wait-query-type=all --target-dir=$incremental_dir --incremental-basedir=$basedir ; +exec $XTRABACKUP --prepare --apply-log-only --target-dir=$basedir ; +--enable_result_log + +let SEARCH_FILE=$MYSQLTEST_VARDIR/log/current_test; +--let SEARCH_PATTERN= Rollback of trx with id +--source include/search_pattern_in_file.inc +--echo # expect NOT FOUND + +exec $XTRABACKUP --prepare --apply-log-only --target-dir=$basedir --incremental-dir=$incremental_dir ; + +--source include/search_pattern_in_file.inc +--echo # expect NOT FOUND + +commit; +SELECT count(*) FROM t; +echo # Restore and check results; +--let $targetdir=$basedir +--let $restart_parameters= --innodb-force-recovery=3 +--source include/restart_and_restore.inc + +rmdir $basedir; +rmdir $incremental_dir; + +SELECT COUNT(*) FROM t; +SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +SELECT COUNT(*) FROM t; + +--let $restart_parameters= +--source include/restart_mysqld.inc + +SELECT * FROM t; +DROP TABLE t; diff --git a/mysql-test/suite/mariabackup/apply-log-only.result b/mysql-test/suite/mariabackup/apply-log-only.result new file mode 100644 index 00000000000..04b9c0d8ee2 --- /dev/null +++ b/mysql-test/suite/mariabackup/apply-log-only.result @@ -0,0 +1,10 @@ +call mtr.add_suppression("InnoDB: New log files created"); +CREATE TABLE t(a varchar(60)) ENGINE INNODB; +start transaction; +INSERT INTO t VALUES(1); +NOT FOUND /Rollback of trx with id/ in current_test +# expect NOT FOUND +SELECT count(*) FROM t; +count(*) +1 +DROP TABLE t; diff --git a/mysql-test/suite/mariabackup/apply-log-only.test b/mysql-test/suite/mariabackup/apply-log-only.test new file mode 100644 index 00000000000..96a251fc03b --- /dev/null +++ b/mysql-test/suite/mariabackup/apply-log-only.test @@ -0,0 +1,25 @@ +--source include/have_innodb.inc +call mtr.add_suppression("InnoDB: New log files created"); + +let $basedir=$MYSQLTEST_VARDIR/tmp/backup; + +CREATE TABLE t(a varchar(60)) ENGINE INNODB; +start transaction; +INSERT INTO t VALUES(1); + +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$basedir; +--enable_result_log + +exec $XTRABACKUP --prepare --apply-log-only --target-dir=$basedir ; + +let SEARCH_FILE=$MYSQLTEST_VARDIR/log/current_test; +--let SEARCH_PATTERN= Rollback of trx with id +--source include/search_pattern_in_file.inc +--echo # expect NOT FOUND + +SELECT count(*) FROM t; +DROP TABLE t; + +# Cleanup +rmdir $basedir; diff --git a/mysql-test/suite/mariabackup/auth_plugin_win.opt b/mysql-test/suite/mariabackup/auth_plugin_win.opt new file mode 100644 index 00000000000..e534ae1eae5 --- /dev/null +++ b/mysql-test/suite/mariabackup/auth_plugin_win.opt @@ -0,0 +1 @@ +--loose-enable-named-pipe diff --git a/mysql-test/suite/mariabackup/auth_plugin_win.result b/mysql-test/suite/mariabackup/auth_plugin_win.result new file mode 100644 index 00000000000..7a623be147f --- /dev/null +++ b/mysql-test/suite/mariabackup/auth_plugin_win.result @@ -0,0 +1,5 @@ +INSTALL SONAME 'auth_named_pipe'; +CREATE USER 'USERNAME' IDENTIFIED WITH named_pipe; +GRANT ALL PRIVILEGES ON *.* to USERNAME; +DROP USER 'USERNAME'; +UNINSTALL SONAME 'auth_named_pipe'; diff --git a/mysql-test/suite/mariabackup/auth_plugin_win.test b/mysql-test/suite/mariabackup/auth_plugin_win.test new file mode 100644 index 00000000000..9c8cd5ad411 --- /dev/null +++ b/mysql-test/suite/mariabackup/auth_plugin_win.test @@ -0,0 +1,31 @@ +--source include/windows.inc +--source include/not_embedded.inc + +if (!$AUTH_NAMED_PIPE_SO) { + skip No named pipe plugin; +} + +if (!$USERNAME) { + skip USERNAME variable is undefined; +} + +if (`SELECT count(*) <> 0 FROM mysql.user WHERE user = '$USERNAME'`) { + skip \$USER=$USER which exists in mysql.user; +} + +INSTALL SONAME 'auth_named_pipe'; + +--replace_result $USERNAME USERNAME +eval CREATE USER '$USERNAME' IDENTIFIED WITH named_pipe; +--replace_result $USERNAME USERNAME +eval GRANT ALL PRIVILEGES ON *.* to $USERNAME; + +let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf -u $USERNAME --backup --protocol=pipe --target-dir=$targetdir; +--enable_result_log +--replace_result $USERNAME USERNAME +eval DROP USER '$USERNAME'; +rmdir $targetdir; +UNINSTALL SONAME 'auth_named_pipe'; + diff --git a/mysql-test/suite/mariabackup/disabled.def b/mysql-test/suite/mariabackup/disabled.def new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/mysql-test/suite/mariabackup/disabled.def @@ -0,0 +1 @@ + diff --git a/mysql-test/suite/mariabackup/filekeys-data.enc b/mysql-test/suite/mariabackup/filekeys-data.enc new file mode 100644 index 00000000000..a8adb2f939c Binary files /dev/null and b/mysql-test/suite/mariabackup/filekeys-data.enc differ diff --git a/mysql-test/suite/mariabackup/filekeys-data.key b/mysql-test/suite/mariabackup/filekeys-data.key new file mode 100644 index 00000000000..85fcd1fbb81 --- /dev/null +++ b/mysql-test/suite/mariabackup/filekeys-data.key @@ -0,0 +1,2 @@ +secret + diff --git a/mysql-test/suite/mariabackup/full_backup.result b/mysql-test/suite/mariabackup/full_backup.result new file mode 100644 index 00000000000..c387f5328a7 --- /dev/null +++ b/mysql-test/suite/mariabackup/full_backup.result @@ -0,0 +1,13 @@ +CREATE TABLE t(i INT) ENGINE INNODB; +INSERT INTO t VALUES(1); +# xtrabackup backup +INSERT INTO t VALUES(2); +# xtrabackup prepare +# shutdown server +# remove datadir +# xtrabackup move back +# restart server +SELECT * FROM t; +i +1 +DROP TABLE t; diff --git a/mysql-test/suite/mariabackup/full_backup.test b/mysql-test/suite/mariabackup/full_backup.test new file mode 100644 index 00000000000..d1d2ea21c08 --- /dev/null +++ b/mysql-test/suite/mariabackup/full_backup.test @@ -0,0 +1,24 @@ +--source include/innodb_page_size.inc + +CREATE TABLE t(i INT) ENGINE INNODB; +INSERT INTO t VALUES(1); +echo # xtrabackup backup; +let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; + +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; +--enable_result_log + +INSERT INTO t VALUES(2); + + +echo # xtrabackup prepare; +--disable_result_log +exec $XTRABACKUP --prepare --target-dir=$targetdir; +-- source include/restart_and_restore.inc +--enable_result_log + +SELECT * FROM t; +DROP TABLE t; +rmdir $targetdir; + diff --git a/mysql-test/suite/mariabackup/huge_lsn.result b/mysql-test/suite/mariabackup/huge_lsn.result new file mode 100644 index 00000000000..f8c4d3b5fb3 --- /dev/null +++ b/mysql-test/suite/mariabackup/huge_lsn.result @@ -0,0 +1,17 @@ +# +# MDEV-13416 mariabackup fails with EFAULT "Bad Address" +# +FOUND 1 /InnoDB: 5\.7\.\d+ started; log sequence number 17592186044428/ in mysqld.1.err +CREATE TABLE t(i INT) ENGINE INNODB; +INSERT INTO t VALUES(1); +# xtrabackup backup +INSERT INTO t VALUES(2); +# xtrabackup prepare +# shutdown server +# remove datadir +# xtrabackup move back +# restart server +SELECT * FROM t; +i +1 +DROP TABLE t; diff --git a/mysql-test/suite/mariabackup/huge_lsn.test b/mysql-test/suite/mariabackup/huge_lsn.test new file mode 100644 index 00000000000..8b1ae338274 --- /dev/null +++ b/mysql-test/suite/mariabackup/huge_lsn.test @@ -0,0 +1,50 @@ +--source include/not_embedded.inc + +--echo # +--echo # MDEV-13416 mariabackup fails with EFAULT "Bad Address" +--echo # + +let INNODB_PAGE_SIZE=`select @@innodb_page_size`; +let MYSQLD_DATADIR=`select @@datadir`; + +--source include/shutdown_mysqld.inc + +perl; +my $file= "$ENV{MYSQLD_DATADIR}/ibdata1"; +open(FILE, "+<", $file) or die "Unable to open $file\n"; +binmode FILE; +my $ps= $ENV{INNODB_PAGE_SIZE}; +my $page; +die "Unable to read $file" unless sysread(FILE, $page, $ps) == $ps; +substr($page,26,8) = pack("NN", 4096, 0); +substr($page,0,4)=pack("N",0xdeadbeef); +substr($page,$ps-8,4)=pack("N",0xdeadbeef); +sysseek(FILE, 0, 0) || die "Unable to rewind $file\n"; +syswrite(FILE, $page, $ps)==$ps || die "Unable to write $file\n"; +close(FILE) || die "Unable to close $file\n"; +EOF + +--remove_files_wildcard $MYSQLD_DATADIR ib_logfile* + +--source include/start_mysqld.inc +let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err; +--let SEARCH_PATTERN= InnoDB: 5\.7\.\d+ started; log sequence number 17592186044428 +--source include/search_pattern_in_file.inc + +CREATE TABLE t(i INT) ENGINE INNODB; +INSERT INTO t VALUES(1); + +echo # xtrabackup backup; +let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; +--enable_result_log +INSERT INTO t VALUES(2); +echo # xtrabackup prepare; +--disable_result_log +exec $XTRABACKUP --prepare --target-dir=$targetdir; +--source include/restart_and_restore.inc +--enable_result_log +SELECT * FROM t; +DROP TABLE t; +rmdir $targetdir; diff --git a/mysql-test/suite/mariabackup/include/have_file_key_management.inc b/mysql-test/suite/mariabackup/include/have_file_key_management.inc new file mode 100644 index 00000000000..06fbb510d6b --- /dev/null +++ b/mysql-test/suite/mariabackup/include/have_file_key_management.inc @@ -0,0 +1,4 @@ +if (`SELECT COUNT(*)=0 FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'file_key_management' AND PLUGIN_STATUS='ACTIVE'`) +{ + --skip Test requires file_key_management plugin +} diff --git a/mysql-test/suite/mariabackup/include/restart_and_restore.inc b/mysql-test/suite/mariabackup/include/restart_and_restore.inc new file mode 100644 index 00000000000..9056867b07f --- /dev/null +++ b/mysql-test/suite/mariabackup/include/restart_and_restore.inc @@ -0,0 +1,9 @@ +let $_datadir= `SELECT @@datadir`; +echo # shutdown server; +--source include/shutdown_mysqld.inc +echo # remove datadir; +rmdir $_datadir; +echo # xtrabackup move back; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --copy-back --datadir=$_datadir --target-dir=$targetdir --parallel=2 --throttle=1; +echo # restart server; +--source include/start_mysqld.inc diff --git a/mysql-test/suite/mariabackup/incremental_backup.result b/mysql-test/suite/mariabackup/incremental_backup.result new file mode 100644 index 00000000000..eeedc751d83 --- /dev/null +++ b/mysql-test/suite/mariabackup/incremental_backup.result @@ -0,0 +1,20 @@ +call mtr.add_suppression("InnoDB: New log files created"); +CREATE TABLE t(i INT) ENGINE INNODB; +INSERT INTO t VALUES(1); +# Create full backup , modify table, then create incremental/differential backup +INSERT INTO t VALUES(2); +SELECT * FROM t; +i +1 +2 +# Prepare full backup, apply incremental one +# Restore and check results +# shutdown server +# remove datadir +# xtrabackup move back +# restart server +SELECT * FROM t; +i +1 +2 +DROP TABLE t; diff --git a/mysql-test/suite/mariabackup/incremental_backup.test b/mysql-test/suite/mariabackup/incremental_backup.test new file mode 100644 index 00000000000..b60b151563f --- /dev/null +++ b/mysql-test/suite/mariabackup/incremental_backup.test @@ -0,0 +1,34 @@ +--source include/innodb_page_size.inc + +call mtr.add_suppression("InnoDB: New log files created"); + +let $basedir=$MYSQLTEST_VARDIR/tmp/backup; +let $incremental_dir=$MYSQLTEST_VARDIR/tmp/backup_inc1; + +CREATE TABLE t(i INT) ENGINE INNODB; +INSERT INTO t VALUES(1); + +echo # Create full backup , modify table, then create incremental/differential backup; +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$basedir; +--enable_result_log +INSERT INTO t VALUES(2); +SELECT * FROM t; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --ftwrl-wait-timeout=5 --ftwrl-wait-threshold=300 --ftwrl-wait-query-type=all --target-dir=$incremental_dir --incremental-basedir=$basedir; + +--disable_result_log +echo # Prepare full backup, apply incremental one; +exec $XTRABACKUP --prepare --target-dir=$basedir; +exec $XTRABACKUP --prepare --target-dir=$basedir --incremental-dir=$incremental_dir ; + +echo # Restore and check results; +let $targetdir=$basedir; +-- source include/restart_and_restore.inc +--enable_result_log + +SELECT * FROM t; +DROP TABLE t; + +# Cleanup +rmdir $basedir; +rmdir $incremental_dir; diff --git a/mysql-test/suite/mariabackup/incremental_encrypted.opt b/mysql-test/suite/mariabackup/incremental_encrypted.opt new file mode 100644 index 00000000000..ea644cef6ce --- /dev/null +++ b/mysql-test/suite/mariabackup/incremental_encrypted.opt @@ -0,0 +1,3 @@ +--innodb-tablespaces-encryption +--plugin-load-add=$DEBUG_KEY_MANAGEMENT_SO +--loose-debug_key_management_version=2 diff --git a/mysql-test/suite/mariabackup/incremental_encrypted.result b/mysql-test/suite/mariabackup/incremental_encrypted.result new file mode 100644 index 00000000000..e8f81e9fa49 --- /dev/null +++ b/mysql-test/suite/mariabackup/incremental_encrypted.result @@ -0,0 +1,20 @@ +call mtr.add_suppression("InnoDB: New log files created"); +CREATE TABLE t(i INT) ENGINE INNODB ENCRYPTED=YES; +INSERT INTO t VALUES(1); +# Create full backup , modify table, then create incremental/differential backup +INSERT INTO t VALUES(2); +SELECT * FROM t; +i +1 +2 +# Prepare full backup, apply incremental one +# Restore and check results +# shutdown server +# remove datadir +# xtrabackup move back +# restart server +SELECT * FROM t; +i +1 +2 +DROP TABLE t; diff --git a/mysql-test/suite/mariabackup/incremental_encrypted.test b/mysql-test/suite/mariabackup/incremental_encrypted.test new file mode 100644 index 00000000000..8bcada493c6 --- /dev/null +++ b/mysql-test/suite/mariabackup/incremental_encrypted.test @@ -0,0 +1,42 @@ +--source include/innodb_page_size.inc + +if (!$EXAMPLE_KEY_MANAGEMENT_SO) +{ + --skip needs example_key_management plugin +} +call mtr.add_suppression("InnoDB: New log files created"); + + +let $basedir=$MYSQLTEST_VARDIR/tmp/backup; +let $incremental_dir=$MYSQLTEST_VARDIR/tmp/backup_inc1; + + +CREATE TABLE t(i INT) ENGINE INNODB ENCRYPTED=YES; +INSERT INTO t VALUES(1); + + +echo # Create full backup , modify table, then create incremental/differential backup; +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$basedir; +--enable_result_log + +INSERT INTO t VALUES(2); +SELECT * FROM t; + +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$incremental_dir --incremental-basedir=$basedir; +echo # Prepare full backup, apply incremental one; +exec $XTRABACKUP --prepare --target-dir=$basedir; +exec $XTRABACKUP --prepare --target-dir=$basedir --incremental-dir=$incremental_dir; + +echo # Restore and check results; +let $targetdir=$basedir; +-- source include/restart_and_restore.inc +--enable_result_log + +SELECT * FROM t; +DROP TABLE t; + +# Cleanup +rmdir $basedir; +rmdir $incremental_dir; diff --git a/mysql-test/suite/mariabackup/lock_ddl_per_table.result b/mysql-test/suite/mariabackup/lock_ddl_per_table.result new file mode 100644 index 00000000000..434b6852530 --- /dev/null +++ b/mysql-test/suite/mariabackup/lock_ddl_per_table.result @@ -0,0 +1,11 @@ +CREATE TABLE t(i INT) ENGINE INNODB; +INSERT INTO t VALUES(1); +# xtrabackup backup +CREATE TABLE `bobby``tables` (id INT, name VARCHAR(50), purchased DATE) ENGINE INNODB PARTITION BY RANGE( YEAR(purchased) ) ( +PARTITION p0 VALUES LESS THAN (1990), +PARTITION p1 VALUES LESS THAN (1995), +PARTITION p2 VALUES LESS THAN (2000), +PARTITION p3 VALUES LESS THAN (2005) +) ; +DROP TABLE t; +DROP TABLE `bobby``tables`; diff --git a/mysql-test/suite/mariabackup/lock_ddl_per_table.test b/mysql-test/suite/mariabackup/lock_ddl_per_table.test new file mode 100644 index 00000000000..04edb9e05e9 --- /dev/null +++ b/mysql-test/suite/mariabackup/lock_ddl_per_table.test @@ -0,0 +1,20 @@ +--source include/have_debug.inc + +CREATE TABLE t(i INT) ENGINE INNODB; +INSERT INTO t VALUES(1); +echo # xtrabackup backup; +let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; + +CREATE TABLE `bobby``tables` (id INT, name VARCHAR(50), purchased DATE) ENGINE INNODB PARTITION BY RANGE( YEAR(purchased) ) ( + PARTITION p0 VALUES LESS THAN (1990), + PARTITION p1 VALUES LESS THAN (1995), + PARTITION p2 VALUES LESS THAN (2000), + PARTITION p3 VALUES LESS THAN (2005) +) ; + +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir --lock-ddl-per-table=1 --dbug=+d,check_mdl_lock_works; +--enable_result_log +DROP TABLE t; +DROP TABLE `bobby``tables`; +rmdir $targetdir; \ No newline at end of file diff --git a/mysql-test/suite/mariabackup/partial.result b/mysql-test/suite/mariabackup/partial.result new file mode 100644 index 00000000000..8ccc8f6a6c7 --- /dev/null +++ b/mysql-test/suite/mariabackup/partial.result @@ -0,0 +1,19 @@ +CREATE TABLE t1(i INT) ENGINE INNODB; +INSERT INTO t1 VALUES(1); +CREATE TABLE t21(i INT) ENGINE INNODB; +INSERT INTO t21 VALUES(1); +CREATE TABLE t2(i int) ENGINE INNODB; +# xtrabackup backup +t1.ibd +t21.ibd +# xtrabackup prepare +t1.cfg +t21.cfg +ALTER TABLE t1 DISCARD TABLESPACE; +ALTER TABLE t1 IMPORT TABLESPACE; +SELECT * FROM t1; +i +1 +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t21; diff --git a/mysql-test/suite/mariabackup/partial.test b/mysql-test/suite/mariabackup/partial.test new file mode 100644 index 00000000000..559ba155972 --- /dev/null +++ b/mysql-test/suite/mariabackup/partial.test @@ -0,0 +1,46 @@ +#--source include/innodb_page_size.inc + +# Export single table from backup +# (xtrabackup with --prepare --export) + +CREATE TABLE t1(i INT) ENGINE INNODB; +INSERT INTO t1 VALUES(1); +CREATE TABLE t21(i INT) ENGINE INNODB; +INSERT INTO t21 VALUES(1); + +CREATE TABLE t2(i int) ENGINE INNODB; + +echo # xtrabackup backup; + +let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup "--tables=test.*1" --target-dir=$targetdir; +--enable_result_log +list_files $targetdir/test *.ibd; + +# Inject a junk .ibd file into backup dir to +# see if prepare does not choke on it. +write_file $targetdir/test/junk.ibd; +EOF +write_file $targetdir/test/junk.frm; +EOF + + +echo # xtrabackup prepare; +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --defaults-group-suffix=.1 --prepare --export --target-dir=$targetdir; +--enable_result_log + +list_files $targetdir/test *.cfg; + +let $MYSQLD_DATADIR= `select @@datadir`; +ALTER TABLE t1 DISCARD TABLESPACE; +copy_file $targetdir/test/t1.ibd $MYSQLD_DATADIR/test/t1.ibd; +copy_file $targetdir/test/t1.cfg $MYSQLD_DATADIR/test/t1.cfg; +ALTER TABLE t1 IMPORT TABLESPACE; + +SELECT * FROM t1; +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t21; +rmdir $targetdir; diff --git a/mysql-test/suite/mariabackup/partial_exclude.result b/mysql-test/suite/mariabackup/partial_exclude.result new file mode 100644 index 00000000000..0da9b547caa --- /dev/null +++ b/mysql-test/suite/mariabackup/partial_exclude.result @@ -0,0 +1,12 @@ +CREATE TABLE t1(i INT) ENGINE INNODB; +INSERT INTO t1 VALUES(1); +CREATE TABLE t2(i int) ENGINE INNODB; +CREATE DATABASE db2; +USE db2; +CREATE TABLE t1(i INT) ENGINE INNODB; +USE test; +# xtrabackup backup +t1.ibd +DROP TABLE t1; +DROP TABLE t2; +DROP DATABASE db2; diff --git a/mysql-test/suite/mariabackup/partial_exclude.test b/mysql-test/suite/mariabackup/partial_exclude.test new file mode 100644 index 00000000000..cd21ecff29b --- /dev/null +++ b/mysql-test/suite/mariabackup/partial_exclude.test @@ -0,0 +1,31 @@ +#--source include/innodb_page_size.inc + +# Test --databases-exclude and --tables-exclude feature of xtrabackup 2.3.8 + +CREATE TABLE t1(i INT) ENGINE INNODB; +INSERT INTO t1 VALUES(1); +CREATE TABLE t2(i int) ENGINE INNODB; + +CREATE DATABASE db2; +USE db2; +CREATE TABLE t1(i INT) ENGINE INNODB; + +USE test; + +echo # xtrabackup backup; + +let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup "--tables-exclude=test.*2" "--databases-exclude=db2" --target-dir=$targetdir; +--enable_result_log + +# check that only t1 table is in backup (t2 is excluded) +list_files $targetdir/test *.ibd; +# check that db2 database is not in the backup (excluded) +--error 1 +list_files $targetdir/db2 *.ibd; + +DROP TABLE t1; +DROP TABLE t2; +DROP DATABASE db2; +rmdir $targetdir; diff --git a/mysql-test/suite/mariabackup/small_ibd.result b/mysql-test/suite/mariabackup/small_ibd.result new file mode 100644 index 00000000000..1c840a7a1b6 --- /dev/null +++ b/mysql-test/suite/mariabackup/small_ibd.result @@ -0,0 +1 @@ +#backup diff --git a/mysql-test/suite/mariabackup/small_ibd.test b/mysql-test/suite/mariabackup/small_ibd.test new file mode 100644 index 00000000000..e8175fce7c9 --- /dev/null +++ b/mysql-test/suite/mariabackup/small_ibd.test @@ -0,0 +1,19 @@ +--source include/innodb_page_size.inc + +# Check if ibd smaller than page size are skipped +# It is possible, due to race conditions that new file +# is created by server while xtrabackup is running +# The first page in this file does not yet exist. +# xtrabackup should skip such file. + +let $_datadir= `SELECT @@datadir`; +write_file $_datadir/test/small.ibd; +EOF +echo #backup; + +let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; +--enable_result_log +remove_file $_datadir/test/small.ibd; +rmdir $targetdir; diff --git a/mysql-test/suite/mariabackup/suite.opt b/mysql-test/suite/mariabackup/suite.opt new file mode 100644 index 00000000000..8b1e9c7bcb2 --- /dev/null +++ b/mysql-test/suite/mariabackup/suite.opt @@ -0,0 +1 @@ +--innodb --loose-changed_page_bitmaps --innodb-file-format=Barracuda --innodb-sys-tables --partition \ No newline at end of file diff --git a/mysql-test/suite/mariabackup/suite.pm b/mysql-test/suite/mariabackup/suite.pm new file mode 100644 index 00000000000..26d5c06cdad --- /dev/null +++ b/mysql-test/suite/mariabackup/suite.pm @@ -0,0 +1,33 @@ +package My::Suite::MariaBackup; + +@ISA = qw(My::Suite); +use My::Find; +use File::Basename; +use strict; + +return "Not run for embedded server" if $::opt_embedded_server; + +my $mariabackup_exe= +::mtr_exe_maybe_exists( + "$::bindir/extra/mariabackup$::opt_vs_config/mariabackup", + "$::path_client_bindir/mariabackup"); + +return "No mariabackup" if !$mariabackup_exe; + + +$ENV{XTRABACKUP}= $mariabackup_exe; + +$ENV{XBSTREAM}= ::mtr_exe_maybe_exists( + "$::bindir/extra/mariabackup/$::opt_vs_config/mbstream", + "$::path_client_bindir/mbstream"); + +$ENV{INNOBACKUPEX}= "$mariabackup_exe --innobackupex"; + +sub skip_combinations { + my %skip; + $skip{'include/have_file_key_management.inc'} = 'needs file_key_management plugin' unless $ENV{FILE_KEY_MANAGEMENT_SO}; + %skip; +} + +bless { }; + diff --git a/mysql-test/suite/mariabackup/xb_aws_key_management.opt b/mysql-test/suite/mariabackup/xb_aws_key_management.opt new file mode 100644 index 00000000000..fceff3be28d --- /dev/null +++ b/mysql-test/suite/mariabackup/xb_aws_key_management.opt @@ -0,0 +1,3 @@ +--plugin-load-add=$AWS_KEY_MANAGEMENT_SO +--loose-aws-key-management +--loose-aws-key-management-mock=ON diff --git a/mysql-test/suite/mariabackup/xb_aws_key_management.result b/mysql-test/suite/mariabackup/xb_aws_key_management.result new file mode 100644 index 00000000000..6efc76a8be3 --- /dev/null +++ b/mysql-test/suite/mariabackup/xb_aws_key_management.result @@ -0,0 +1,16 @@ +CREATE TABLE t(c VARCHAR(10)) ENGINE INNODB encrypted=yes; +Warnings: +Note 1105 AWS KMS plugin: generated encrypted datakey for key id=1, version=1 +Note 1105 AWS KMS plugin: loaded key 1, version 1, key length 128 bit +INSERT INTO t VALUES('foobar1'); +# xtrabackup backup +# shutdown server +# remove datadir +# xtrabackup move back +# restart server +SELECT * from t; +c +foobar1 +Warnings: +Note 1105 AWS KMS plugin: loaded key 1, version 1, key length 128 bit +DROP TABLE t; diff --git a/mysql-test/suite/mariabackup/xb_aws_key_management.test b/mysql-test/suite/mariabackup/xb_aws_key_management.test new file mode 100644 index 00000000000..9f69cbec8b8 --- /dev/null +++ b/mysql-test/suite/mariabackup/xb_aws_key_management.test @@ -0,0 +1,20 @@ +--source include/innodb_page_size.inc +--source include/have_debug.inc + +if (`SELECT COUNT(*)=0 FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'aws_key_management' AND PLUGIN_STATUS='ACTIVE'`) +{ + --skip needs aws_key_management plugin +} + +CREATE TABLE t(c VARCHAR(10)) ENGINE INNODB encrypted=yes; +INSERT INTO t VALUES('foobar1'); +echo # xtrabackup backup; +let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; +exec $XTRABACKUP --prepare --target-dir=$targetdir; +-- source include/restart_and_restore.inc +--enable_result_log +SELECT * from t; +DROP TABLE t; +rmdir $targetdir; diff --git a/mysql-test/suite/mariabackup/xb_compressed_encrypted.opt b/mysql-test/suite/mariabackup/xb_compressed_encrypted.opt new file mode 100644 index 00000000000..e6cbe00bb7c --- /dev/null +++ b/mysql-test/suite/mariabackup/xb_compressed_encrypted.opt @@ -0,0 +1,9 @@ +--innodb-encryption-rotate-key-age=2 +--innodb-encryption-threads=4 +--innodb-tablespaces-encryption +--plugin-load-add=$FILE_KEY_MANAGEMENT_SO +--loose-file-key-management +--loose-file-key-management-filename=$MYSQL_TEST_DIR/std_data/logkey.txt +--innodb_strict_mode +--innodb_file_per_table +--innodb_file_format=Barracuda diff --git a/mysql-test/suite/mariabackup/xb_compressed_encrypted.result b/mysql-test/suite/mariabackup/xb_compressed_encrypted.result new file mode 100644 index 00000000000..9ba332b7ca5 --- /dev/null +++ b/mysql-test/suite/mariabackup/xb_compressed_encrypted.result @@ -0,0 +1,14 @@ +CREATE TABLE t1(c1 INT, b VARCHAR(2400), index(b(100),c1)) +ENGINE=INNODB ROW_FORMAT=compressed ENCRYPTED=YES; +BEGIN; +COMMIT; +# xtrabackup backup +drop table t1; +# shutdown server +# remove datadir +# xtrabackup move back +# restart server +select sum(c1) from t1; +sum(c1) +12497500 +DROP TABLE t1; diff --git a/mysql-test/suite/mariabackup/xb_compressed_encrypted.test b/mysql-test/suite/mariabackup/xb_compressed_encrypted.test new file mode 100644 index 00000000000..2cca740d7dd --- /dev/null +++ b/mysql-test/suite/mariabackup/xb_compressed_encrypted.test @@ -0,0 +1,31 @@ +--source include/innodb_page_size_small.inc +--source include/have_file_key_management.inc + +CREATE TABLE t1(c1 INT, b VARCHAR(2400), index(b(100),c1)) +ENGINE=INNODB ROW_FORMAT=compressed ENCRYPTED=YES; + +BEGIN; +let $n= 5000; +let $i= $n; +let $u= `SELECT uuid()`; +--disable_query_log +while ($i) { + eval INSERT INTO t1 + VALUES($n-$i, concat('$u', $n-$i, repeat('ab', floor(rand()*100)), '$u')); + dec $i; +} +--enable_query_log +COMMIT; + +echo # xtrabackup backup; +--disable_result_log +let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; +exec $INNOBACKUPEX --defaults-file=$MYSQLTEST_VARDIR/my.cnf --no-timestamp $targetdir; +drop table t1; +exec $INNOBACKUPEX --apply-log $targetdir; + +-- source include/restart_and_restore.inc +--enable_result_log +select sum(c1) from t1; +DROP TABLE t1; +rmdir $targetdir; diff --git a/mysql-test/suite/mariabackup/xb_file_key_management.opt b/mysql-test/suite/mariabackup/xb_file_key_management.opt new file mode 100644 index 00000000000..74a6450a1ef --- /dev/null +++ b/mysql-test/suite/mariabackup/xb_file_key_management.opt @@ -0,0 +1,6 @@ +--innodb-encrypt-log=ON +--plugin-load-add=$FILE_KEY_MANAGEMENT_SO +--loose-file-key-management +--loose-file-key-management-filekey=FILE:$MTR_SUITE_DIR/filekeys-data.key +--loose-file-key-management-filename=$MTR_SUITE_DIR/filekeys-data.enc +--loose-file-key-management-encryption-algorithm=aes_cbc diff --git a/mysql-test/suite/mariabackup/xb_file_key_management.result b/mysql-test/suite/mariabackup/xb_file_key_management.result new file mode 100644 index 00000000000..8972da32f8b --- /dev/null +++ b/mysql-test/suite/mariabackup/xb_file_key_management.result @@ -0,0 +1,15 @@ +CREATE TABLE t(c VARCHAR(10)) ENGINE INNODB encrypted=yes; +INSERT INTO t VALUES('foobar1'); +# xtrabackup backup +NOT FOUND /foobar1/ in ib_logfile0 +# expect NOT FOUND +INSERT INTO t VALUES('foobar2'); +# xtrabackup prepare +# shutdown server +# remove datadir +# xtrabackup move back +# restart server +SELECT * FROM t; +c +foobar1 +DROP TABLE t; diff --git a/mysql-test/suite/mariabackup/xb_file_key_management.test b/mysql-test/suite/mariabackup/xb_file_key_management.test new file mode 100644 index 00000000000..3887a889aaa --- /dev/null +++ b/mysql-test/suite/mariabackup/xb_file_key_management.test @@ -0,0 +1,30 @@ +#--source include/innodb_page_size.inc +--source include/have_file_key_management.inc + +CREATE TABLE t(c VARCHAR(10)) ENGINE INNODB encrypted=yes; +INSERT INTO t VALUES('foobar1'); +echo # xtrabackup backup; +let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; +--enable_result_log + +--let SEARCH_RANGE = 10000000 +--let SEARCH_PATTERN=foobar1 +--let SEARCH_FILE=$targetdir/ib_logfile0 +--source include/search_pattern_in_file.inc +--echo # expect NOT FOUND + +INSERT INTO t VALUES('foobar2'); +echo # xtrabackup prepare; + +--disable_result_log +exec $XTRABACKUP --prepare --target-dir=$targetdir; +-- source include/restart_and_restore.inc +--enable_result_log + +--list_files $targetdir ib_logfile* + +SELECT * FROM t; +DROP TABLE t; +rmdir $targetdir; diff --git a/mysql-test/suite/mariabackup/xb_fulltext_encrypted.opt b/mysql-test/suite/mariabackup/xb_fulltext_encrypted.opt new file mode 100644 index 00000000000..b3ef366361a --- /dev/null +++ b/mysql-test/suite/mariabackup/xb_fulltext_encrypted.opt @@ -0,0 +1,8 @@ +--plugin-load-add=$FILE_KEY_MANAGEMENT_SO +--innodb_strict_mode +--innodb_file_per_table +--innodb-encryption-rotate-key-age=2 +--innodb-encryption-threads=4 +--innodb-tablespaces-encryption +--loose-file-key-management +--loose-file-key-management-filename=$MYSQL_TEST_DIR/std_data/logkey.txt \ No newline at end of file diff --git a/mysql-test/suite/mariabackup/xb_fulltext_encrypted.result b/mysql-test/suite/mariabackup/xb_fulltext_encrypted.result new file mode 100644 index 00000000000..01a99e59200 --- /dev/null +++ b/mysql-test/suite/mariabackup/xb_fulltext_encrypted.result @@ -0,0 +1,14 @@ +CREATE TABLE film_text ( +film_id SMALLINT NOT NULL, +title VARCHAR(255) NOT NULL, +description TEXT, +PRIMARY KEY (film_id), +FULLTEXT KEY idx_title_description (title,description), +FULLTEXT KEY (description), +FULLTEXT KEY (title) +)ENGINE=InnoDB DEFAULT CHARSET=utf8 ENCRYPTED=YES; +# shutdown server +# remove datadir +# xtrabackup move back +# restart server +drop table film_text; diff --git a/mysql-test/suite/mariabackup/xb_fulltext_encrypted.test b/mysql-test/suite/mariabackup/xb_fulltext_encrypted.test new file mode 100644 index 00000000000..d5a5003c11a --- /dev/null +++ b/mysql-test/suite/mariabackup/xb_fulltext_encrypted.test @@ -0,0 +1,24 @@ +#--source include/innodb_page_size.inc +--source include/have_file_key_management.inc + +CREATE TABLE film_text ( +film_id SMALLINT NOT NULL, +title VARCHAR(255) NOT NULL, +description TEXT, +PRIMARY KEY (film_id), +FULLTEXT KEY idx_title_description (title,description), +FULLTEXT KEY (description), +FULLTEXT KEY (title) +)ENGINE=InnoDB DEFAULT CHARSET=utf8 ENCRYPTED=YES; + +let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; + +--disable_result_log + +exec $INNOBACKUPEX --defaults-file=$MYSQLTEST_VARDIR/my.cnf --no-timestamp $targetdir; +exec $INNOBACKUPEX --apply-log --rebuild-indexes --rebuild-threads=2 $targetdir; +--source include/restart_and_restore.inc + +--enable_result_log + +drop table film_text; diff --git a/mysql-test/suite/mariabackup/xb_history.result b/mysql-test/suite/mariabackup/xb_history.result new file mode 100644 index 00000000000..b6a1ac21147 --- /dev/null +++ b/mysql-test/suite/mariabackup/xb_history.result @@ -0,0 +1,5 @@ +SELECT COUNT(*) FROM PERCONA_SCHEMA.xtrabackup_history; +COUNT(*) +1 +DROP TABLE PERCONA_SCHEMA.xtrabackup_history; +DROP DATABASE PERCONA_SCHEMA; diff --git a/mysql-test/suite/mariabackup/xb_history.test b/mysql-test/suite/mariabackup/xb_history.test new file mode 100644 index 00000000000..54ec5f2e729 --- /dev/null +++ b/mysql-test/suite/mariabackup/xb_history.test @@ -0,0 +1,10 @@ +#--source include/innodb_page_size.inc + +let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --history=foo --backup --target-dir=$targetdir; +--enable_result_log +SELECT COUNT(*) FROM PERCONA_SCHEMA.xtrabackup_history; +DROP TABLE PERCONA_SCHEMA.xtrabackup_history; +DROP DATABASE PERCONA_SCHEMA; +rmdir $targetdir; diff --git a/mysql-test/suite/mariabackup/xb_page_compress.result b/mysql-test/suite/mariabackup/xb_page_compress.result new file mode 100644 index 00000000000..7380856f394 --- /dev/null +++ b/mysql-test/suite/mariabackup/xb_page_compress.result @@ -0,0 +1,28 @@ +CREATE TABLE t1(c1 INT, b CHAR(20)) ENGINE=INNODB PAGE_COMPRESSED=1; +CREATE PROCEDURE innodb_insert_proc (REPEAT_COUNT INT) +BEGIN +DECLARE CURRENT_NUM INT; +SET CURRENT_NUM = 0; +WHILE CURRENT_NUM < REPEAT_COUNT DO +INSERT INTO t1 VALUES(CURRENT_NUM,'TESTING..'); +SET CURRENT_NUM = CURRENT_NUM + 1; +END WHILE; +END// +COMMIT; +SET AUTOCOMMIT=0; +CALL innodb_insert_proc(5000); +COMMIT; +SELECT (VARIABLE_VALUE >= 0) AS HAVE_COMPRESSED_PAGES +FROM INFORMATION_SCHEMA.GLOBAL_STATUS +WHERE VARIABLE_NAME = 'INNODB_NUM_PAGES_PAGE_COMPRESSED'; +HAVE_COMPRESSED_PAGES +1 +# xtrabackup backup +# xtrabackup prepare +ALTER TABLE t1 DISCARD TABLESPACE; +ALTER TABLE t1 IMPORT TABLESPACE; +SELECT COUNT(*) FROM t1; +COUNT(*) +5000 +DROP PROCEDURE innodb_insert_proc; +DROP TABLE t1; diff --git a/mysql-test/suite/mariabackup/xb_page_compress.test b/mysql-test/suite/mariabackup/xb_page_compress.test new file mode 100644 index 00000000000..7e806e6de22 --- /dev/null +++ b/mysql-test/suite/mariabackup/xb_page_compress.test @@ -0,0 +1,45 @@ +#--source include/innodb_page_size.inc + +CREATE TABLE t1(c1 INT, b CHAR(20)) ENGINE=INNODB PAGE_COMPRESSED=1; + +DELIMITER //; +CREATE PROCEDURE innodb_insert_proc (REPEAT_COUNT INT) +BEGIN + DECLARE CURRENT_NUM INT; + SET CURRENT_NUM = 0; + WHILE CURRENT_NUM < REPEAT_COUNT DO + INSERT INTO t1 VALUES(CURRENT_NUM,'TESTING..'); + SET CURRENT_NUM = CURRENT_NUM + 1; + END WHILE; +END// +DELIMITER ;// +COMMIT; + +SET AUTOCOMMIT=0; +CALL innodb_insert_proc(5000); +COMMIT; + +SELECT (VARIABLE_VALUE >= 0) AS HAVE_COMPRESSED_PAGES + FROM INFORMATION_SCHEMA.GLOBAL_STATUS + WHERE VARIABLE_NAME = 'INNODB_NUM_PAGES_PAGE_COMPRESSED'; + +echo # xtrabackup backup; +let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; + +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup "--tables=test.*1" --target-dir=$targetdir; +echo # xtrabackup prepare; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --defaults-group-suffix=.1 --prepare --export --target-dir=$targetdir; +--enable_result_log + +ALTER TABLE t1 DISCARD TABLESPACE; +let $MYSQLD_DATADIR= `select @@datadir`; +copy_file $targetdir/test/t1.ibd $MYSQLD_DATADIR/test/t1.ibd; +copy_file $targetdir/test/t1.cfg $MYSQLD_DATADIR/test/t1.cfg; +ALTER TABLE t1 IMPORT TABLESPACE; + +SELECT COUNT(*) FROM t1; + +DROP PROCEDURE innodb_insert_proc; +DROP TABLE t1; +rmdir $targetdir; diff --git a/mysql-test/suite/mariabackup/xb_partition.result b/mysql-test/suite/mariabackup/xb_partition.result new file mode 100644 index 00000000000..f5b6ae0b24d --- /dev/null +++ b/mysql-test/suite/mariabackup/xb_partition.result @@ -0,0 +1,64 @@ +CREATE TABLE t1(a INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1), (2), (3); +CREATE TABLE t2(a INT) ENGINE=InnoDB; +INSERT INTO t2 VALUES (4), (5), (6); +CREATE TABLE p ( +a int +) ENGINE=InnoDB +PARTITION BY RANGE (a) +(PARTITION p0 VALUES LESS THAN (100), +PARTITION p1 VALUES LESS THAN (200), +PARTITION p2 VALUES LESS THAN (300), +PARTITION p3 VALUES LESS THAN (400)); +INSERT INTO p VALUES (1), (101), (201), (301); +CREATE TABLE isam_t1(a INT) ENGINE=MyISAM; +INSERT INTO isam_t1 VALUES (1), (2), (3); +CREATE TABLE isam_t2(a INT) ENGINE=MyISAM; +INSERT INTO isam_t2 VALUES (4), (5), (6); +CREATE TABLE isam_p ( +a int +) ENGINE=MyISAM +PARTITION BY RANGE (a) +(PARTITION p0 VALUES LESS THAN (100), +PARTITION p1 VALUES LESS THAN (200), +PARTITION p2 VALUES LESS THAN (300), +PARTITION p3 VALUES LESS THAN (400)); +INSERT INTO isam_p VALUES (1), (101), (201), (301); +DROP TABLE t1; +DROP TABLE t2; +CREATE TABLE t2(a INT) ENGINE=InnoDB; +INSERT INTO t2 VALUES (40), (50), (60); +ALTER TABLE p DROP PARTITION p0; +ALTER TABLE p DROP PARTITION p1; +ALTER TABLE p ADD PARTITION (PARTITION p4 VALUES LESS THAN (500)); +ALTER TABLE p ADD PARTITION (PARTITION p5 VALUES LESS THAN (600)); +INSERT INTO p VALUES (401), (501); +DROP TABLE isam_t1; +DROP TABLE isam_t2; +CREATE TABLE isam_t2(a INT) ENGINE=MyISAM; +INSERT INTO isam_t2 VALUES (40), (50), (60); +ALTER TABLE isam_p DROP PARTITION p0; +ALTER TABLE isam_p DROP PARTITION p1; +ALTER TABLE isam_p ADD PARTITION (PARTITION p4 VALUES LESS THAN (500)); +ALTER TABLE isam_p ADD PARTITION (PARTITION p5 VALUES LESS THAN (600)); +INSERT INTO isam_p VALUES (401), (501); +# shutdown server +# remove datadir +# xtrabackup move back +# restart server +SELECT * from p; +a +201 +301 +401 +501 +SELECT * from isam_p; +a +201 +301 +401 +501 +DROP TABLE isam_p; +DROP TABLE isam_t2; +DROP TABLE p; +DROP TABLE t2; diff --git a/mysql-test/suite/mariabackup/xb_partition.test b/mysql-test/suite/mariabackup/xb_partition.test new file mode 100644 index 00000000000..e6f8c5d996f --- /dev/null +++ b/mysql-test/suite/mariabackup/xb_partition.test @@ -0,0 +1,87 @@ +#--source include/innodb_page_size.inc +--source include/have_partition.inc + +CREATE TABLE t1(a INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1), (2), (3); + +CREATE TABLE t2(a INT) ENGINE=InnoDB; +INSERT INTO t2 VALUES (4), (5), (6); + +CREATE TABLE p ( + a int +) ENGINE=InnoDB +PARTITION BY RANGE (a) +(PARTITION p0 VALUES LESS THAN (100), + PARTITION p1 VALUES LESS THAN (200), + PARTITION p2 VALUES LESS THAN (300), + PARTITION p3 VALUES LESS THAN (400)); + +INSERT INTO p VALUES (1), (101), (201), (301); + +CREATE TABLE isam_t1(a INT) ENGINE=MyISAM; +INSERT INTO isam_t1 VALUES (1), (2), (3); + +CREATE TABLE isam_t2(a INT) ENGINE=MyISAM; +INSERT INTO isam_t2 VALUES (4), (5), (6); + +CREATE TABLE isam_p ( + a int +) ENGINE=MyISAM +PARTITION BY RANGE (a) +(PARTITION p0 VALUES LESS THAN (100), + PARTITION p1 VALUES LESS THAN (200), + PARTITION p2 VALUES LESS THAN (300), + PARTITION p3 VALUES LESS THAN (400)); + +INSERT INTO isam_p VALUES (1), (101), (201), (301); + +let $targetdir=$MYSQLTEST_VARDIR/tmp; + +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --no-timestamp --backup --target-dir=$targetdir/full; +--enable_result_log + +DROP TABLE t1; +DROP TABLE t2; +CREATE TABLE t2(a INT) ENGINE=InnoDB; +INSERT INTO t2 VALUES (40), (50), (60); + +ALTER TABLE p DROP PARTITION p0; +ALTER TABLE p DROP PARTITION p1; +ALTER TABLE p ADD PARTITION (PARTITION p4 VALUES LESS THAN (500)); +ALTER TABLE p ADD PARTITION (PARTITION p5 VALUES LESS THAN (600)); + +INSERT INTO p VALUES (401), (501); + + +DROP TABLE isam_t1; +DROP TABLE isam_t2; +CREATE TABLE isam_t2(a INT) ENGINE=MyISAM; + +INSERT INTO isam_t2 VALUES (40), (50), (60); + +ALTER TABLE isam_p DROP PARTITION p0; +ALTER TABLE isam_p DROP PARTITION p1; +ALTER TABLE isam_p ADD PARTITION (PARTITION p4 VALUES LESS THAN (500)); +ALTER TABLE isam_p ADD PARTITION (PARTITION p5 VALUES LESS THAN (600)); + +INSERT INTO isam_p VALUES (401), (501); + +--disable_result_log +exec $INNOBACKUPEX --defaults-file=$MYSQLTEST_VARDIR/my.cnf --incremental --no-timestamp --incremental-basedir=$targetdir/full $targetdir/inc; +exec $INNOBACKUPEX --defaults-file=$MYSQLTEST_VARDIR/my.cnf --apply-log $targetdir/full; +exec $INNOBACKUPEX --defaults-file=$MYSQLTEST_VARDIR/my.cnf --apply-log --incremental-dir=$targetdir/inc $targetdir/full; + +let $targetdir=$targetdir/full; +-- source include/restart_and_restore.inc +--enable_result_log + +SELECT * from p; +SELECT * from isam_p; + +DROP TABLE isam_p; +DROP TABLE isam_t2; +DROP TABLE p; +DROP TABLE t2; +rmdir $MYSQLTEST_VARDIR/tmp/full; +rmdir $MYSQLTEST_VARDIR/tmp/inc; diff --git a/mysql-test/suite/mariabackup/xbstream.result b/mysql-test/suite/mariabackup/xbstream.result new file mode 100644 index 00000000000..f340fedb861 --- /dev/null +++ b/mysql-test/suite/mariabackup/xbstream.result @@ -0,0 +1,13 @@ +CREATE TABLE t(i INT) ENGINE INNODB; +INSERT INTO t VALUES(1); +# xtrabackup backup to stream +# xbstream extract +# xtrabackup prepare +# shutdown server +# remove datadir +# xtrabackup move back +# restart server +SELECT * FROM t; +i +1 +DROP TABLE t; diff --git a/mysql-test/suite/mariabackup/xbstream.test b/mysql-test/suite/mariabackup/xbstream.test new file mode 100644 index 00000000000..9161d227b20 --- /dev/null +++ b/mysql-test/suite/mariabackup/xbstream.test @@ -0,0 +1,24 @@ +--source include/innodb_page_size.inc + +CREATE TABLE t(i INT) ENGINE INNODB; +INSERT INTO t VALUES(1); + +let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; +mkdir $targetdir; +let $streamfile=$MYSQLTEST_VARDIR/tmp/backup.xb; + +echo # xtrabackup backup to stream; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --stream=xbstream > $streamfile 2>$targetdir/backup_stream.log; +echo # xbstream extract; +--disable_result_log +exec $XBSTREAM -x -C $targetdir < $streamfile; + +echo # xtrabackup prepare; +exec $XTRABACKUP --prepare --target-dir=$targetdir; + +-- source include/restart_and_restore.inc +--enable_result_log +SELECT * FROM t; +DROP TABLE t; +rmdir $targetdir; + diff --git a/mysql-test/suite/multi_source/mdev-9544.cnf b/mysql-test/suite/multi_source/mdev-9544.cnf new file mode 100644 index 00000000000..b43aca5370d --- /dev/null +++ b/mysql-test/suite/multi_source/mdev-9544.cnf @@ -0,0 +1,22 @@ +!include my.cnf + +[mysqld.1] +log-bin +log-slave-updates + +[mysqld.2] +log-bin +log-slave-updates + +[mysqld.3] +log-bin +log-slave-updates + +[mysqld.4] +server-id=4 +log-bin=server4-bin +log-slave-updates + +[ENV] +SERVER_MYPORT_4= @mysqld.4.port +SERVER_MYSOCK_4= @mysqld.4.socket diff --git a/mysql-test/suite/multi_source/mdev-9544.result b/mysql-test/suite/multi_source/mdev-9544.result new file mode 100644 index 00000000000..42e6b6a9f56 --- /dev/null +++ b/mysql-test/suite/multi_source/mdev-9544.result @@ -0,0 +1,90 @@ +connect server_1,127.0.0.1,root,,,$SERVER_MYPORT_1; +connect server_2,127.0.0.1,root,,,$SERVER_MYPORT_2; +connect server_3,127.0.0.1,root,,,$SERVER_MYPORT_3; +connect server_4,127.0.0.1,root,,,$SERVER_MYPORT_4; +connection server_1; +create database a; +use a; +create table t1(a int); +insert into t1 values(1); +create table t2(a int); +insert into t2 values(1); +connection server_2; +create database b; +use b; +create table t1(a int); +insert into t1 values(1); +create table t2(a int); +insert into t2 values(1); +connection server_3; +create database c; +use c; +create table t1(a int); +insert into t1 values(1); +create table t2(a int); +insert into t2 values(1); +connection server_4; +change master 'm1' to master_port=MYPORT_1 , master_host='127.0.0.1', master_user='root'; +change master 'm2' to master_port=MYPORT_2 , master_host='127.0.0.1', master_user='root'; +change master to master_port=MYPORT_3 , master_host='127.0.0.1', master_user='root'; +start all slaves; +set default_master_connection = 'm1'; +include/wait_for_slave_to_start.inc +set default_master_connection = 'm2'; +include/wait_for_slave_to_start.inc +set default_master_connection = ''; +include/wait_for_slave_to_start.inc +use a; +show tables; +Tables_in_a +t1 +t2 +use b; +show tables; +Tables_in_b +t1 +t2 +use c; +show tables; +Tables_in_c +t1 +t2 +#TEST +SET default_master_connection = "m1"; +SET default_master_connection = "m2"; +SET default_master_connection = ""; +flush logs; +SET default_master_connection = "m1"; +#log Rotated +mysqld-relay-bin.000002 +mysqld-relay-bin.000003 +mysqld-relay-bin.index +SET default_master_connection = "m2"; +#log Rotated +mysqld-relay-bin-m1.000002 +mysqld-relay-bin-m1.000003 +mysqld-relay-bin-m1.index +SET default_master_connection = ""; +#log Rotated +mysqld-relay-bin-m2.000002 +mysqld-relay-bin-m2.000003 +mysqld-relay-bin-m2.index +#CleanUp +connection server_1; +drop database a; +connection server_2; +drop database b; +connection server_3; +drop database c; +connection server_4; +stop all slaves; +Warnings: +Note 1938 SLAVE 'm2' stopped +Note 1938 SLAVE '' stopped +Note 1938 SLAVE 'm1' stopped +SET default_master_connection = "m1"; +include/wait_for_slave_to_stop.inc +SET default_master_connection = "m2"; +include/wait_for_slave_to_stop.inc +SET default_master_connection = ""; +include/wait_for_slave_to_stop.inc diff --git a/mysql-test/suite/multi_source/mdev-9544.test b/mysql-test/suite/multi_source/mdev-9544.test new file mode 100644 index 00000000000..f532a63a585 --- /dev/null +++ b/mysql-test/suite/multi_source/mdev-9544.test @@ -0,0 +1,116 @@ +--source include/not_embedded.inc +--source include/have_innodb.inc +--source include/have_debug.inc + +--connect (server_1,127.0.0.1,root,,,$SERVER_MYPORT_1) +--connect (server_2,127.0.0.1,root,,,$SERVER_MYPORT_2) +--connect (server_3,127.0.0.1,root,,,$SERVER_MYPORT_3) +--connect (server_4,127.0.0.1,root,,,$SERVER_MYPORT_4) + +--connection server_1 +create database a; +use a; +create table t1(a int); +insert into t1 values(1); +create table t2(a int); +insert into t2 values(1); +--save_master_pos + +--connection server_2 +create database b; +use b; +create table t1(a int); +insert into t1 values(1); +create table t2(a int); +insert into t2 values(1); +--save_master_pos + +--connection server_3 +create database c; +use c; +create table t1(a int); +insert into t1 values(1); +create table t2(a int); +insert into t2 values(1); +--save_master_pos + +--connection server_4 +--disable_warnings +--replace_result $SERVER_MYPORT_1 MYPORT_1 +eval change master 'm1' to master_port=$SERVER_MYPORT_1 , master_host='127.0.0.1', master_user='root'; +--replace_result $SERVER_MYPORT_2 MYPORT_2 +eval change master 'm2' to master_port=$SERVER_MYPORT_2 , master_host='127.0.0.1', master_user='root'; +--replace_result $SERVER_MYPORT_3 MYPORT_3 +eval change master to master_port=$SERVER_MYPORT_3 , master_host='127.0.0.1', master_user='root'; +start all slaves; +set default_master_connection = 'm1'; +--source include/wait_for_slave_to_start.inc +set default_master_connection = 'm2'; +--source include/wait_for_slave_to_start.inc +set default_master_connection = ''; +--source include/wait_for_slave_to_start.inc + +--enable_warnings +--sync_with_master 0,'m1' +--sync_with_master 0,'m2' +--sync_with_master 0,'' +use a; +show tables; +use b; +show tables; +use c; +show tables; +--echo #TEST +SET default_master_connection = "m1"; +--let $old_m1 = query_get_value("show relaylog events;", "Log_name",1) +SET default_master_connection = "m2"; +--let $old_m2 = query_get_value("show relaylog events;", "Log_name",1) +SET default_master_connection = ""; +--let $old__ = query_get_value("show relaylog events;", "Log_name",1) +flush logs; +--sleep 2 +--let $MYSQLD_DATADIR = `select @@datadir` +SET default_master_connection = "m1"; +--let $new_m1 = query_get_value("show relaylog events;", "Log_name",1) +--if ($new_m1 != $old_m1) { + --echo #log Rotated + --exec ls $MYSQLD_DATADIR | grep "mysqld-relay-bin\." +} +SET default_master_connection = "m2"; +--let $new_m2 = query_get_value("show relaylog events;", "Log_name",1) +--if ($new_m2 != $old_m2) { + --echo #log Rotated + --exec ls $MYSQLD_DATADIR | grep "mysqld-relay-bin-m1" +} +SET default_master_connection = ""; +--let $new__ = query_get_value("show relaylog events;", "Log_name",1) +--if ($new__ != $old__) { + --echo #log Rotated + --exec ls $MYSQLD_DATADIR | grep "mysqld-relay-bin-m2" +} + +--echo #CleanUp +--connection server_1 +drop database a; +--save_master_pos + +--connection server_2 +drop database b; +--save_master_pos + +--connection server_3 +drop database c; +--save_master_pos + +--connection server_4 +--sync_with_master 0,'m1' +--sync_with_master 0,'m2' +--sync_with_master 0,'' +stop all slaves; +SET default_master_connection = "m1"; +--source include/wait_for_slave_to_stop.inc +SET default_master_connection = "m2"; +--source include/wait_for_slave_to_stop.inc +SET default_master_connection = ""; +--source include/wait_for_slave_to_stop.inc + diff --git a/mysql-test/suite/ndb/r/ndb_restore_discover.result b/mysql-test/suite/ndb/r/ndb_restore_discover.result deleted file mode 100644 index de10af87047..00000000000 --- a/mysql-test/suite/ndb/r/ndb_restore_discover.result +++ /dev/null @@ -1,33 +0,0 @@ -# -# 18075170 - sql node restart required to avoid deadlock after -# restore -# -CREATE TABLE t1 (id INT) ENGINE=NDBCluster; -CREATE TABLE t2 (id INT) ENGINE=NDBCluster; -INSERT INTO t1 VALUES (1); -INSERT INTO t2 VALUES (1); -DROP TABLE t1; -DROP TABLE t2; -SET autocommit = 0; -SELECT * FROM t1; -id -1 -SELECT * FROM t2; -id -1 -ROLLBACK; -SET autocommit = 1; -drop table t1; -drop table t2; -SET autocommit = 0; -SELECT * FROM t1; -id -1 -SELECT * FROM t2; -id -1 -ALTER TABLE t1 ADD val INT; -ROLLBACK; -SET autocommit = 1; -drop table t1; -drop table t2; diff --git a/mysql-test/suite/ndb/t/ndb_restore_discover.test b/mysql-test/suite/ndb/t/ndb_restore_discover.test deleted file mode 100644 index 6631c74d5c8..00000000000 --- a/mysql-test/suite/ndb/t/ndb_restore_discover.test +++ /dev/null @@ -1,70 +0,0 @@ --- source include/have_ndb.inc --- source include/count_sessions.inc - ---echo # ---echo # 18075170 - sql node restart required to avoid deadlock after ---echo # restore ---echo # -# Test Auto Discover option within a transaction -# and make sure the transaction is not broken. -CREATE TABLE t1 (id INT) ENGINE=NDBCluster; -CREATE TABLE t2 (id INT) ENGINE=NDBCluster; - -INSERT INTO t1 VALUES (1); -INSERT INTO t2 VALUES (1); - --- source include/ndb_backup.inc - -DROP TABLE t1; -DROP TABLE t2; - --- source include/ndb_restore_master.inc - -SET autocommit = 0; -SELECT * FROM t1; - -# Without fix below select was resulting in DEADLOCK error. With fix select -# should succeed. -SELECT * FROM t2; -ROLLBACK; -SET autocommit = 1; - -drop table t1; -drop table t2; - -# -# Checking lock preservation in transaction -# -# Using existing backup to create the scenario. Tables are deleted as part of -# above test cleanup. Thus restoring the backup will bring the system to -# required state. --- source include/ndb_restore_master.inc - -SET autocommit = 0; -SELECT * FROM t1; -SELECT * FROM t2; - -connect(con2, localhost, root); ---SEND ALTER TABLE t1 ADD val INT - -connection default; -# Alter from con2 will be in waiting state as there is a lock on t1 from -# default connection due to active transaction. We check for this condition -# then releasing the lock by rollbacking active transaction. -let $wait_condition= - SELECT count(*) = 1 FROM information_schema.processlist WHERE state - LIKE "Waiting%" AND info = "ALTER TABLE t1 ADD val INT"; ---source include/wait_condition.inc -ROLLBACK; -SET autocommit = 1; - -connection con2; ---REAP - -disconnect con2; -connection default; -drop table t1; -drop table t2; - -# Wait till all disconnects are completed --- source include/wait_until_count_sessions.inc diff --git a/mysql-test/suite/parts/r/longname.result b/mysql-test/suite/parts/r/longname.result new file mode 100644 index 00000000000..c95e666625e --- /dev/null +++ b/mysql-test/suite/parts/r/longname.result @@ -0,0 +1,28 @@ +set names utf8; +create database mysqltest1; +select database_name, table_name, length(table_name) from mysql.innodb_table_stats where database_name = 'mysqltest1'; +database_name table_name length(table_name) +CREATE TABLE mysqltest1.test_jfg_table_name_with_64_chars_123456789012345678901234567890 ( +id int(10) unsigned NOT NULL, +id2 int(10) unsigned NOT NULL, +PRIMARY KEY ( id, id2 ) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC +PARTITION BY RANGE ( id ) +SUBPARTITION BY HASH ( id2 ) +SUBPARTITIONS 2 ( +PARTITION test_jfg_partition_name_with_60_chars_1234567890123456789012 VALUES LESS THAN (1000) ENGINE = InnoDB, +PARTITION pmax VALUES LESS THAN MAXVALUE ENGINE = InnoDB); +select database_name, table_name, length(table_name) from mysql.innodb_table_stats where database_name = 'mysqltest1'; +database_name table_name length(table_name) +CREATE TABLE mysqltest1.éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé ( +id int(10) unsigned NOT NULL, +id2 int(10) unsigned NOT NULL, +PRIMARY KEY ( id, id2 ) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC +PARTITION BY RANGE ( id ) +SUBPARTITION BY HASH ( id2 ) +SUBPARTITIONS 2 ( +PARTITION çççççççççççççççççççççççççççççççççççççççççççççççççççççççççççç VALUES LESS THAN (1000) ENGINE = InnoDB, +PARTITION pmax VALUES LESS THAN MAXVALUE ENGINE = InnoDB); +ERROR HY000: The path specified for @0n@0n@0n@0n@0n@0n@0n@0n@0n@0n@0n@0n@0n@0n@0n@0n@0n@0n@0n@0n@0n@ is too long +drop database mysqltest1; diff --git a/mysql-test/suite/parts/r/part_supported_sql_func_innodb.result b/mysql-test/suite/parts/r/part_supported_sql_func_innodb.result index e0c16eeba74..617e2d258c2 100644 --- a/mysql-test/suite/parts/r/part_supported_sql_func_innodb.result +++ b/mysql-test/suite/parts/r/part_supported_sql_func_innodb.result @@ -620,15 +620,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (abs(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (abs(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) select * from t55 order by colint; colint col1 1 15 @@ -2317,15 +2317,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (mod(col1,10)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (`col1` % 10) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) select * from t55 order by colint; colint col1 1 15 @@ -3667,15 +3667,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (day(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (dayofmonth(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) select * from t55 order by colint; colint col1 1 2006-02-05 @@ -4184,15 +4184,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (dayofmonth(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (dayofmonth(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) select * from t55 order by colint; colint col1 1 2006-02-05 @@ -4701,15 +4701,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (dayofweek(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (dayofweek(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) select * from t55 order by colint; colint col1 1 2006-02-03 @@ -5230,15 +5230,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (dayofyear(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (dayofyear(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) select * from t55 order by colint; colint col1 1 2006-02-03 @@ -5749,15 +5749,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (extract(month from col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (extract(month from `col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) select * from t55 order by colint; colint col1 1 2006-02-03 @@ -6268,15 +6268,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` time DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (hour(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (hour(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) select * from t55 order by colint; colint col1 1 09:09:15 @@ -6793,15 +6793,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` time(6) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (microsecond(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (microsecond(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) select * from t55 order by colint; colint col1 1 05:30:34.000037 @@ -7314,15 +7314,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` time DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (minute(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (minute(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) select * from t55 order by colint; colint col1 1 10:24:23 @@ -7845,15 +7845,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` time DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (second(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (second(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) select * from t55 order by colint; colint col1 1 09:09:15 @@ -8376,15 +8376,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (month(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (month(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) select * from t55 order by colint; colint col1 1 2006-02-03 @@ -8901,15 +8901,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (quarter(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (quarter(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) select * from t55 order by colint; colint col1 1 2006-02-03 @@ -9424,15 +9424,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (weekday(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (weekday(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) select * from t55 order by colint; colint col1 1 2006-02-03 @@ -9945,15 +9945,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (year(col1)-1990) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (year(`col1`) - 1990) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) select * from t55 order by colint; colint col1 1 2006-02-03 @@ -10470,15 +10470,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (yearweek(col1)-200600) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (yearweek(`col1`,0) - 200600) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = InnoDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = InnoDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = InnoDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = InnoDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) select * from t55 order by colint; colint col1 1 2006-02-03 diff --git a/mysql-test/suite/parts/r/part_supported_sql_func_myisam.result b/mysql-test/suite/parts/r/part_supported_sql_func_myisam.result index b211340a6ff..490a79155a2 100644 --- a/mysql-test/suite/parts/r/part_supported_sql_func_myisam.result +++ b/mysql-test/suite/parts/r/part_supported_sql_func_myisam.result @@ -620,15 +620,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (abs(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (abs(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) select * from t55 order by colint; colint col1 1 15 @@ -2317,15 +2317,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (mod(col1,10)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (`col1` % 10) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) select * from t55 order by colint; colint col1 1 15 @@ -3667,15 +3667,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (day(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (dayofmonth(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) select * from t55 order by colint; colint col1 1 2006-02-05 @@ -4184,15 +4184,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (dayofmonth(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (dayofmonth(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) select * from t55 order by colint; colint col1 1 2006-02-05 @@ -4701,15 +4701,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (dayofweek(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (dayofweek(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) select * from t55 order by colint; colint col1 1 2006-02-03 @@ -5230,15 +5230,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (dayofyear(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (dayofyear(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) select * from t55 order by colint; colint col1 1 2006-02-03 @@ -5749,15 +5749,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (extract(month from col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (extract(month from `col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) select * from t55 order by colint; colint col1 1 2006-02-03 @@ -6268,15 +6268,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` time DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (hour(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (hour(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) select * from t55 order by colint; colint col1 1 09:09:15 @@ -6793,15 +6793,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` time(6) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (microsecond(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (microsecond(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) select * from t55 order by colint; colint col1 1 05:30:34.000037 @@ -7314,15 +7314,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` time DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (minute(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (minute(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) select * from t55 order by colint; colint col1 1 10:24:23 @@ -7845,15 +7845,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` time DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (second(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (second(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) select * from t55 order by colint; colint col1 1 09:09:15 @@ -8376,15 +8376,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (month(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (month(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) select * from t55 order by colint; colint col1 1 2006-02-03 @@ -8901,15 +8901,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (quarter(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (quarter(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) select * from t55 order by colint; colint col1 1 2006-02-03 @@ -9424,15 +9424,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (weekday(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (weekday(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) select * from t55 order by colint; colint col1 1 2006-02-03 @@ -9945,15 +9945,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (year(col1)-1990) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (year(`col1`) - 1990) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) select * from t55 order by colint; colint col1 1 2006-02-03 @@ -10470,15 +10470,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (yearweek(col1)-200600) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (yearweek(`col1`,0) - 200600) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = MyISAM, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = MyISAM, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = MyISAM, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = MyISAM, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) select * from t55 order by colint; colint col1 1 2006-02-03 diff --git a/mysql-test/suite/parts/r/partition_alter1_1_2_innodb.result b/mysql-test/suite/parts/r/partition_alter1_1_2_innodb.result index b126d459335..ac56faae01e 100644 --- a/mysql-test/suite/parts/r/partition_alter1_1_2_innodb.result +++ b/mysql-test/suite/parts/r/partition_alter1_1_2_innodb.result @@ -75,7 +75,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -567,7 +567,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -1067,15 +1067,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1572,13 +1572,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2071,13 +2071,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2574,20 +2574,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3084,20 +3084,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3592,12 +3592,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -4089,7 +4089,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -4581,7 +4581,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -5081,15 +5081,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5586,13 +5586,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6085,13 +6085,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6588,20 +6588,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7098,20 +7098,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7606,12 +7606,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -8104,7 +8104,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -8612,7 +8612,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -9128,15 +9128,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9649,13 +9649,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10164,13 +10164,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10683,20 +10683,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11209,20 +11209,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11733,12 +11733,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -12246,7 +12246,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -12754,7 +12754,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -13270,15 +13270,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13791,13 +13791,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14306,13 +14306,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14825,20 +14825,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15351,20 +15351,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15875,12 +15875,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -16390,7 +16390,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -16883,7 +16883,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -17384,15 +17384,15 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -17890,13 +17890,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18390,13 +18390,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18894,20 +18894,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19405,20 +19405,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19914,12 +19914,12 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -20412,7 +20412,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -20905,7 +20905,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -21406,15 +21406,15 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -21912,13 +21912,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -22412,13 +22412,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -22916,20 +22916,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -23427,20 +23427,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -23936,12 +23936,12 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -24434,7 +24434,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -24927,7 +24927,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -25428,15 +25428,15 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -25934,13 +25934,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -26434,13 +26434,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -26938,20 +26938,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -27449,20 +27449,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -27958,12 +27958,12 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 diff --git a/mysql-test/suite/parts/r/partition_alter1_1_2_myisam.result b/mysql-test/suite/parts/r/partition_alter1_1_2_myisam.result index ae352a35a36..93862512ea1 100644 --- a/mysql-test/suite/parts/r/partition_alter1_1_2_myisam.result +++ b/mysql-test/suite/parts/r/partition_alter1_1_2_myisam.result @@ -75,7 +75,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -592,7 +592,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -1123,15 +1123,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -1665,13 +1665,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -2197,13 +2197,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -2737,20 +2737,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -3284,20 +3284,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -3829,12 +3829,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -4365,7 +4365,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -4882,7 +4882,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -5413,15 +5413,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -5955,13 +5955,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -6487,13 +6487,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -7027,20 +7027,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -7574,20 +7574,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -8119,12 +8119,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD diff --git a/mysql-test/suite/parts/r/partition_alter1_1_innodb.result b/mysql-test/suite/parts/r/partition_alter1_1_innodb.result index 30dd7222570..c0a14ee8de0 100644 --- a/mysql-test/suite/parts/r/partition_alter1_1_innodb.result +++ b/mysql-test/suite/parts/r/partition_alter1_1_innodb.result @@ -393,7 +393,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -885,7 +885,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -1385,15 +1385,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1890,13 +1890,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2389,13 +2389,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2894,20 +2894,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3404,20 +3404,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3912,12 +3912,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -4409,7 +4409,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -4901,7 +4901,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -5401,15 +5401,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5906,13 +5906,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6405,13 +6405,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6910,20 +6910,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7420,20 +7420,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7928,12 +7928,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -8426,7 +8426,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -8934,7 +8934,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -9450,15 +9450,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9971,13 +9971,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10486,13 +10486,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11007,20 +11007,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11533,20 +11533,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -12057,12 +12057,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -12570,7 +12570,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -13078,7 +13078,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -13594,15 +13594,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14115,13 +14115,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14630,13 +14630,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15151,20 +15151,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15677,20 +15677,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -16201,12 +16201,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 diff --git a/mysql-test/suite/parts/r/partition_alter1_1_myisam.result b/mysql-test/suite/parts/r/partition_alter1_1_myisam.result index 6c769bd8cd9..91dd960f516 100644 --- a/mysql-test/suite/parts/r/partition_alter1_1_myisam.result +++ b/mysql-test/suite/parts/r/partition_alter1_1_myisam.result @@ -234,7 +234,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -751,7 +751,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -1282,15 +1282,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -1824,13 +1824,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -2356,13 +2356,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -2898,20 +2898,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -3445,20 +3445,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -3990,12 +3990,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -4526,7 +4526,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -5043,7 +5043,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -5574,15 +5574,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -6116,13 +6116,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -6648,13 +6648,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -7190,20 +7190,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -7737,20 +7737,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -8282,12 +8282,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD diff --git a/mysql-test/suite/parts/r/partition_alter1_2_innodb.result b/mysql-test/suite/parts/r/partition_alter1_2_innodb.result index f4765293d15..9b00fb9d7b3 100644 --- a/mysql-test/suite/parts/r/partition_alter1_2_innodb.result +++ b/mysql-test/suite/parts/r/partition_alter1_2_innodb.result @@ -73,7 +73,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -513,7 +513,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -961,15 +961,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1414,13 +1414,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1861,13 +1861,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2314,20 +2314,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2772,20 +2772,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3228,12 +3228,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3673,7 +3673,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -4113,7 +4113,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -4561,15 +4561,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5014,13 +5014,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5461,13 +5461,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5914,20 +5914,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6372,20 +6372,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6828,12 +6828,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7273,7 +7273,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -7729,7 +7729,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -8193,15 +8193,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -8662,13 +8662,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9125,13 +9125,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9594,20 +9594,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10068,20 +10068,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10540,12 +10540,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11005,7 +11005,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -11445,7 +11445,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -11893,15 +11893,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -12346,13 +12346,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -12793,13 +12793,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13244,20 +13244,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13702,20 +13702,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14158,12 +14158,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14603,7 +14603,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -15043,7 +15043,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -15491,15 +15491,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15944,13 +15944,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -16391,13 +16391,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -16842,20 +16842,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -17300,20 +17300,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -17756,12 +17756,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18202,7 +18202,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -18658,7 +18658,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -19122,15 +19122,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19591,13 +19591,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -20054,13 +20054,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -20521,20 +20521,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -20995,20 +20995,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -21467,12 +21467,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -21928,7 +21928,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -22384,7 +22384,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -22848,15 +22848,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -23317,13 +23317,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -23780,13 +23780,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -24247,20 +24247,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -24721,20 +24721,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -25193,12 +25193,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -25655,7 +25655,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -26095,7 +26095,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -26543,15 +26543,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -26996,13 +26996,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -27443,13 +27443,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -27894,20 +27894,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -28352,20 +28352,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -28808,12 +28808,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -29253,7 +29253,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -29693,7 +29693,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -30141,15 +30141,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -30594,13 +30594,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -31041,13 +31041,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -31492,20 +31492,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -31950,20 +31950,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -32406,12 +32406,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -32851,7 +32851,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -33307,7 +33307,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -33771,15 +33771,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -34240,13 +34240,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -34703,13 +34703,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -35170,20 +35170,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -35644,20 +35644,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -36116,12 +36116,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 diff --git a/mysql-test/suite/parts/r/partition_alter1_2_myisam.result b/mysql-test/suite/parts/r/partition_alter1_2_myisam.result index 7001cbd17d2..e10fb459e99 100644 --- a/mysql-test/suite/parts/r/partition_alter1_2_myisam.result +++ b/mysql-test/suite/parts/r/partition_alter1_2_myisam.result @@ -72,7 +72,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -537,7 +537,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -1016,15 +1016,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -1506,13 +1506,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -1986,13 +1986,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -2476,20 +2476,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -2971,20 +2971,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -3464,12 +3464,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -3952,7 +3952,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -4417,7 +4417,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -4896,15 +4896,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -5386,13 +5386,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -5866,13 +5866,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -6354,20 +6354,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -6849,20 +6849,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -7342,12 +7342,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -7826,7 +7826,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -8291,7 +8291,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -8770,15 +8770,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -9260,13 +9260,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -9740,13 +9740,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -10228,20 +10228,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -10723,20 +10723,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -11216,12 +11216,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -11700,7 +11700,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -12165,7 +12165,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -12644,15 +12644,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -13134,13 +13134,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -13614,13 +13614,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -14102,20 +14102,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -14597,20 +14597,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -15090,12 +15090,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD diff --git a/mysql-test/suite/parts/r/partition_alter2_1_1_innodb.result b/mysql-test/suite/parts/r/partition_alter2_1_1_innodb.result index 22317d93724..cd0a3380311 100644 --- a/mysql-test/suite/parts/r/partition_alter2_1_1_innodb.result +++ b/mysql-test/suite/parts/r/partition_alter2_1_1_innodb.result @@ -74,7 +74,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -530,7 +530,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -994,15 +994,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1463,13 +1463,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1926,13 +1926,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2395,20 +2395,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2869,20 +2869,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3341,12 +3341,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3804,7 +3804,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -4298,7 +4298,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -4800,15 +4800,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5307,13 +5307,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5808,13 +5808,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6315,20 +6315,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6827,20 +6827,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7337,12 +7337,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7836,7 +7836,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -8330,7 +8330,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -8832,15 +8832,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9339,13 +9339,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9840,13 +9840,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10347,20 +10347,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10859,20 +10859,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11369,12 +11369,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11869,7 +11869,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -12377,7 +12377,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -12893,15 +12893,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13414,13 +13414,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13929,13 +13929,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14450,20 +14450,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14976,20 +14976,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15500,12 +15500,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -16013,7 +16013,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -16521,7 +16521,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -17037,15 +17037,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -17558,13 +17558,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18073,13 +18073,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18594,20 +18594,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19120,20 +19120,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19644,12 +19644,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 diff --git a/mysql-test/suite/parts/r/partition_alter2_1_2_innodb.result b/mysql-test/suite/parts/r/partition_alter2_1_2_innodb.result index 680edaa7cc7..cfca64afa1f 100644 --- a/mysql-test/suite/parts/r/partition_alter2_1_2_innodb.result +++ b/mysql-test/suite/parts/r/partition_alter2_1_2_innodb.result @@ -70,7 +70,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -526,7 +526,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -990,15 +990,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1459,13 +1459,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1922,13 +1922,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2389,20 +2389,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2863,20 +2863,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3335,12 +3335,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3798,7 +3798,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -4293,7 +4293,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -4796,15 +4796,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5304,13 +5304,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5806,13 +5806,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6312,20 +6312,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6825,20 +6825,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7336,12 +7336,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7836,7 +7836,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -8331,7 +8331,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -8834,15 +8834,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9342,13 +9342,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9844,13 +9844,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10350,20 +10350,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10863,20 +10863,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11374,12 +11374,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11875,7 +11875,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -12383,7 +12383,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -12899,15 +12899,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13420,13 +13420,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13935,13 +13935,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14454,20 +14454,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14980,20 +14980,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15504,12 +15504,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -16017,7 +16017,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -16525,7 +16525,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -17041,15 +17041,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -17562,13 +17562,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18077,13 +18077,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18596,20 +18596,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19122,20 +19122,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19646,12 +19646,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 diff --git a/mysql-test/suite/parts/r/partition_alter2_1_maria.result b/mysql-test/suite/parts/r/partition_alter2_1_maria.result index 3ef0364c5a8..4504319a3fd 100644 --- a/mysql-test/suite/parts/r/partition_alter2_1_maria.result +++ b/mysql-test/suite/parts/r/partition_alter2_1_maria.result @@ -74,7 +74,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -539,7 +539,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -1018,15 +1018,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = Aria, - PARTITION part_2 VALUES IN (-2) ENGINE = Aria, - PARTITION part_1 VALUES IN (-1) ENGINE = Aria, - PARTITION part_N VALUES IN (NULL) ENGINE = Aria, - PARTITION part0 VALUES IN (0) ENGINE = Aria, - PARTITION part1 VALUES IN (1) ENGINE = Aria, - PARTITION part2 VALUES IN (2) ENGINE = Aria, - PARTITION part3 VALUES IN (3) ENGINE = Aria) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = Aria, + PARTITION `part_2` VALUES IN (-2) ENGINE = Aria, + PARTITION `part_1` VALUES IN (-1) ENGINE = Aria, + PARTITION `part_N` VALUES IN (NULL) ENGINE = Aria, + PARTITION `part0` VALUES IN (0) ENGINE = Aria, + PARTITION `part1` VALUES IN (1) ENGINE = Aria, + PARTITION `part2` VALUES IN (2) ENGINE = Aria, + PARTITION `part3` VALUES IN (3) ENGINE = Aria) unified filelist t1#P#part0.MAD @@ -1508,13 +1508,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (15) ENGINE = Aria, - PARTITION parte VALUES LESS THAN (20) ENGINE = Aria, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = Aria) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = Aria, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = Aria, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta.MAD @@ -1988,13 +1988,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = Aria) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta#SP#partasp0.MAD @@ -2478,20 +2478,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = Aria, - SUBPARTITION subpart12 ENGINE = Aria), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = Aria, - SUBPARTITION subpart22 ENGINE = Aria), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = Aria, - SUBPARTITION subpart32 ENGINE = Aria), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = Aria, - SUBPARTITION subpart42 ENGINE = Aria)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = Aria, + SUBPARTITION `subpart12` ENGINE = Aria), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = Aria, + SUBPARTITION `subpart22` ENGINE = Aria), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = Aria, + SUBPARTITION `subpart32` ENGINE = Aria), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = Aria, + SUBPARTITION `subpart42` ENGINE = Aria)) unified filelist t1#P#part1#SP#subpart11.MAD @@ -2973,20 +2973,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = Aria, - SUBPARTITION sp12 ENGINE = Aria), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = Aria, - SUBPARTITION sp22 ENGINE = Aria), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = Aria, - SUBPARTITION sp32 ENGINE = Aria), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = Aria, - SUBPARTITION sp42 ENGINE = Aria)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = Aria, + SUBPARTITION `sp12` ENGINE = Aria), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = Aria, + SUBPARTITION `sp22` ENGINE = Aria), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = Aria, + SUBPARTITION `sp32` ENGINE = Aria), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = Aria, + SUBPARTITION `sp42` ENGINE = Aria)) unified filelist t1#P#part1#SP#sp11.MAD @@ -3466,12 +3466,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = Aria, - PARTITION part2 VALUES IN (1) ENGINE = Aria, - PARTITION part3 VALUES IN (NULL) ENGINE = Aria) +(PARTITION `part1` VALUES IN (0) ENGINE = Aria, + PARTITION `part2` VALUES IN (1) ENGINE = Aria, + PARTITION `part3` VALUES IN (NULL) ENGINE = Aria) unified filelist t1#P#part1#SP#part1sp0.MAD @@ -3952,7 +3952,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -4469,7 +4469,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -5000,15 +5000,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = Aria, - PARTITION part_2 VALUES IN (-2) ENGINE = Aria, - PARTITION part_1 VALUES IN (-1) ENGINE = Aria, - PARTITION part_N VALUES IN (NULL) ENGINE = Aria, - PARTITION part0 VALUES IN (0) ENGINE = Aria, - PARTITION part1 VALUES IN (1) ENGINE = Aria, - PARTITION part2 VALUES IN (2) ENGINE = Aria, - PARTITION part3 VALUES IN (3) ENGINE = Aria) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = Aria, + PARTITION `part_2` VALUES IN (-2) ENGINE = Aria, + PARTITION `part_1` VALUES IN (-1) ENGINE = Aria, + PARTITION `part_N` VALUES IN (NULL) ENGINE = Aria, + PARTITION `part0` VALUES IN (0) ENGINE = Aria, + PARTITION `part1` VALUES IN (1) ENGINE = Aria, + PARTITION `part2` VALUES IN (2) ENGINE = Aria, + PARTITION `part3` VALUES IN (3) ENGINE = Aria) unified filelist t1#P#part0.MAD @@ -5542,13 +5542,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (15) ENGINE = Aria, - PARTITION parte VALUES LESS THAN (20) ENGINE = Aria, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = Aria) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = Aria, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = Aria, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta.MAD @@ -6074,13 +6074,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = Aria) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta#SP#partasp0.MAD @@ -6616,20 +6616,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = Aria, - SUBPARTITION subpart12 ENGINE = Aria), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = Aria, - SUBPARTITION subpart22 ENGINE = Aria), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = Aria, - SUBPARTITION subpart32 ENGINE = Aria), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = Aria, - SUBPARTITION subpart42 ENGINE = Aria)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = Aria, + SUBPARTITION `subpart12` ENGINE = Aria), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = Aria, + SUBPARTITION `subpart22` ENGINE = Aria), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = Aria, + SUBPARTITION `subpart32` ENGINE = Aria), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = Aria, + SUBPARTITION `subpart42` ENGINE = Aria)) unified filelist t1#P#part1#SP#subpart11.MAD @@ -7163,20 +7163,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = Aria, - SUBPARTITION sp12 ENGINE = Aria), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = Aria, - SUBPARTITION sp22 ENGINE = Aria), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = Aria, - SUBPARTITION sp32 ENGINE = Aria), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = Aria, - SUBPARTITION sp42 ENGINE = Aria)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = Aria, + SUBPARTITION `sp12` ENGINE = Aria), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = Aria, + SUBPARTITION `sp22` ENGINE = Aria), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = Aria, + SUBPARTITION `sp32` ENGINE = Aria), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = Aria, + SUBPARTITION `sp42` ENGINE = Aria)) unified filelist t1#P#part1#SP#sp11.MAD @@ -7708,12 +7708,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = Aria, - PARTITION part2 VALUES IN (1) ENGINE = Aria, - PARTITION part3 VALUES IN (NULL) ENGINE = Aria) +(PARTITION `part1` VALUES IN (0) ENGINE = Aria, + PARTITION `part2` VALUES IN (1) ENGINE = Aria, + PARTITION `part3` VALUES IN (NULL) ENGINE = Aria) unified filelist t1#P#part1#SP#part1sp0.MAD @@ -8244,7 +8244,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -8761,7 +8761,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -9292,15 +9292,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = Aria, - PARTITION part_2 VALUES IN (-2) ENGINE = Aria, - PARTITION part_1 VALUES IN (-1) ENGINE = Aria, - PARTITION part_N VALUES IN (NULL) ENGINE = Aria, - PARTITION part0 VALUES IN (0) ENGINE = Aria, - PARTITION part1 VALUES IN (1) ENGINE = Aria, - PARTITION part2 VALUES IN (2) ENGINE = Aria, - PARTITION part3 VALUES IN (3) ENGINE = Aria) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = Aria, + PARTITION `part_2` VALUES IN (-2) ENGINE = Aria, + PARTITION `part_1` VALUES IN (-1) ENGINE = Aria, + PARTITION `part_N` VALUES IN (NULL) ENGINE = Aria, + PARTITION `part0` VALUES IN (0) ENGINE = Aria, + PARTITION `part1` VALUES IN (1) ENGINE = Aria, + PARTITION `part2` VALUES IN (2) ENGINE = Aria, + PARTITION `part3` VALUES IN (3) ENGINE = Aria) unified filelist t1#P#part0.MAD @@ -9834,13 +9834,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (15) ENGINE = Aria, - PARTITION parte VALUES LESS THAN (20) ENGINE = Aria, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = Aria) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = Aria, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = Aria, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta.MAD @@ -10366,13 +10366,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = Aria) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta#SP#partasp0.MAD @@ -10908,20 +10908,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = Aria, - SUBPARTITION subpart12 ENGINE = Aria), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = Aria, - SUBPARTITION subpart22 ENGINE = Aria), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = Aria, - SUBPARTITION subpart32 ENGINE = Aria), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = Aria, - SUBPARTITION subpart42 ENGINE = Aria)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = Aria, + SUBPARTITION `subpart12` ENGINE = Aria), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = Aria, + SUBPARTITION `subpart22` ENGINE = Aria), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = Aria, + SUBPARTITION `subpart32` ENGINE = Aria), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = Aria, + SUBPARTITION `subpart42` ENGINE = Aria)) unified filelist t1#P#part1#SP#subpart11.MAD @@ -11455,20 +11455,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = Aria, - SUBPARTITION sp12 ENGINE = Aria), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = Aria, - SUBPARTITION sp22 ENGINE = Aria), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = Aria, - SUBPARTITION sp32 ENGINE = Aria), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = Aria, - SUBPARTITION sp42 ENGINE = Aria)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = Aria, + SUBPARTITION `sp12` ENGINE = Aria), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = Aria, + SUBPARTITION `sp22` ENGINE = Aria), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = Aria, + SUBPARTITION `sp32` ENGINE = Aria), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = Aria, + SUBPARTITION `sp42` ENGINE = Aria)) unified filelist t1#P#part1#SP#sp11.MAD @@ -12000,12 +12000,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = Aria, - PARTITION part2 VALUES IN (1) ENGINE = Aria, - PARTITION part3 VALUES IN (NULL) ENGINE = Aria) +(PARTITION `part1` VALUES IN (0) ENGINE = Aria, + PARTITION `part2` VALUES IN (1) ENGINE = Aria, + PARTITION `part3` VALUES IN (NULL) ENGINE = Aria) unified filelist t1#P#part1#SP#part1sp0.MAD @@ -12540,7 +12540,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -13005,7 +13005,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -13484,15 +13484,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = Aria, - PARTITION part_2 VALUES IN (-2) ENGINE = Aria, - PARTITION part_1 VALUES IN (-1) ENGINE = Aria, - PARTITION part_N VALUES IN (NULL) ENGINE = Aria, - PARTITION part0 VALUES IN (0) ENGINE = Aria, - PARTITION part1 VALUES IN (1) ENGINE = Aria, - PARTITION part2 VALUES IN (2) ENGINE = Aria, - PARTITION part3 VALUES IN (3) ENGINE = Aria) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = Aria, + PARTITION `part_2` VALUES IN (-2) ENGINE = Aria, + PARTITION `part_1` VALUES IN (-1) ENGINE = Aria, + PARTITION `part_N` VALUES IN (NULL) ENGINE = Aria, + PARTITION `part0` VALUES IN (0) ENGINE = Aria, + PARTITION `part1` VALUES IN (1) ENGINE = Aria, + PARTITION `part2` VALUES IN (2) ENGINE = Aria, + PARTITION `part3` VALUES IN (3) ENGINE = Aria) unified filelist t1#P#part0.MAD @@ -13974,13 +13974,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (15) ENGINE = Aria, - PARTITION parte VALUES LESS THAN (20) ENGINE = Aria, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = Aria) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = Aria, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = Aria, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta.MAD @@ -14454,13 +14454,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = Aria) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta#SP#partasp0.MAD @@ -14942,20 +14942,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = Aria, - SUBPARTITION subpart12 ENGINE = Aria), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = Aria, - SUBPARTITION subpart22 ENGINE = Aria), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = Aria, - SUBPARTITION subpart32 ENGINE = Aria), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = Aria, - SUBPARTITION subpart42 ENGINE = Aria)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = Aria, + SUBPARTITION `subpart12` ENGINE = Aria), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = Aria, + SUBPARTITION `subpart22` ENGINE = Aria), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = Aria, + SUBPARTITION `subpart32` ENGINE = Aria), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = Aria, + SUBPARTITION `subpart42` ENGINE = Aria)) unified filelist t1#P#part1#SP#subpart11.MAD @@ -15437,20 +15437,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = Aria, - SUBPARTITION sp12 ENGINE = Aria), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = Aria, - SUBPARTITION sp22 ENGINE = Aria), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = Aria, - SUBPARTITION sp32 ENGINE = Aria), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = Aria, - SUBPARTITION sp42 ENGINE = Aria)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = Aria, + SUBPARTITION `sp12` ENGINE = Aria), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = Aria, + SUBPARTITION `sp22` ENGINE = Aria), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = Aria, + SUBPARTITION `sp32` ENGINE = Aria), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = Aria, + SUBPARTITION `sp42` ENGINE = Aria)) unified filelist t1#P#part1#SP#sp11.MAD @@ -15930,12 +15930,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = Aria, - PARTITION part2 VALUES IN (1) ENGINE = Aria, - PARTITION part3 VALUES IN (NULL) ENGINE = Aria) +(PARTITION `part1` VALUES IN (0) ENGINE = Aria, + PARTITION `part2` VALUES IN (1) ENGINE = Aria, + PARTITION `part3` VALUES IN (NULL) ENGINE = Aria) unified filelist t1#P#part1#SP#part1sp0.MAD @@ -16416,7 +16416,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -16933,7 +16933,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -17464,15 +17464,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = Aria, - PARTITION part_2 VALUES IN (-2) ENGINE = Aria, - PARTITION part_1 VALUES IN (-1) ENGINE = Aria, - PARTITION part_N VALUES IN (NULL) ENGINE = Aria, - PARTITION part0 VALUES IN (0) ENGINE = Aria, - PARTITION part1 VALUES IN (1) ENGINE = Aria, - PARTITION part2 VALUES IN (2) ENGINE = Aria, - PARTITION part3 VALUES IN (3) ENGINE = Aria) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = Aria, + PARTITION `part_2` VALUES IN (-2) ENGINE = Aria, + PARTITION `part_1` VALUES IN (-1) ENGINE = Aria, + PARTITION `part_N` VALUES IN (NULL) ENGINE = Aria, + PARTITION `part0` VALUES IN (0) ENGINE = Aria, + PARTITION `part1` VALUES IN (1) ENGINE = Aria, + PARTITION `part2` VALUES IN (2) ENGINE = Aria, + PARTITION `part3` VALUES IN (3) ENGINE = Aria) unified filelist t1#P#part0.MAD @@ -18006,13 +18006,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (15) ENGINE = Aria, - PARTITION parte VALUES LESS THAN (20) ENGINE = Aria, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = Aria) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = Aria, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = Aria, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta.MAD @@ -18538,13 +18538,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = Aria) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta#SP#partasp0.MAD @@ -19078,20 +19078,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = Aria, - SUBPARTITION subpart12 ENGINE = Aria), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = Aria, - SUBPARTITION subpart22 ENGINE = Aria), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = Aria, - SUBPARTITION subpart32 ENGINE = Aria), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = Aria, - SUBPARTITION subpart42 ENGINE = Aria)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = Aria, + SUBPARTITION `subpart12` ENGINE = Aria), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = Aria, + SUBPARTITION `subpart22` ENGINE = Aria), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = Aria, + SUBPARTITION `subpart32` ENGINE = Aria), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = Aria, + SUBPARTITION `subpart42` ENGINE = Aria)) unified filelist t1#P#part1#SP#subpart11.MAD @@ -19625,20 +19625,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = Aria, - SUBPARTITION sp12 ENGINE = Aria), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = Aria, - SUBPARTITION sp22 ENGINE = Aria), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = Aria, - SUBPARTITION sp32 ENGINE = Aria), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = Aria, - SUBPARTITION sp42 ENGINE = Aria)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = Aria, + SUBPARTITION `sp12` ENGINE = Aria), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = Aria, + SUBPARTITION `sp22` ENGINE = Aria), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = Aria, + SUBPARTITION `sp32` ENGINE = Aria), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = Aria, + SUBPARTITION `sp42` ENGINE = Aria)) unified filelist t1#P#part1#SP#sp11.MAD @@ -20170,12 +20170,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = Aria, - PARTITION part2 VALUES IN (1) ENGINE = Aria, - PARTITION part3 VALUES IN (NULL) ENGINE = Aria) +(PARTITION `part1` VALUES IN (0) ENGINE = Aria, + PARTITION `part2` VALUES IN (1) ENGINE = Aria, + PARTITION `part3` VALUES IN (NULL) ENGINE = Aria) unified filelist t1#P#part1#SP#part1sp0.MAD @@ -20706,7 +20706,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -21223,7 +21223,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -21754,15 +21754,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = Aria, - PARTITION part_2 VALUES IN (-2) ENGINE = Aria, - PARTITION part_1 VALUES IN (-1) ENGINE = Aria, - PARTITION part_N VALUES IN (NULL) ENGINE = Aria, - PARTITION part0 VALUES IN (0) ENGINE = Aria, - PARTITION part1 VALUES IN (1) ENGINE = Aria, - PARTITION part2 VALUES IN (2) ENGINE = Aria, - PARTITION part3 VALUES IN (3) ENGINE = Aria) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = Aria, + PARTITION `part_2` VALUES IN (-2) ENGINE = Aria, + PARTITION `part_1` VALUES IN (-1) ENGINE = Aria, + PARTITION `part_N` VALUES IN (NULL) ENGINE = Aria, + PARTITION `part0` VALUES IN (0) ENGINE = Aria, + PARTITION `part1` VALUES IN (1) ENGINE = Aria, + PARTITION `part2` VALUES IN (2) ENGINE = Aria, + PARTITION `part3` VALUES IN (3) ENGINE = Aria) unified filelist t1#P#part0.MAD @@ -22296,13 +22296,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (15) ENGINE = Aria, - PARTITION parte VALUES LESS THAN (20) ENGINE = Aria, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = Aria) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = Aria, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = Aria, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta.MAD @@ -22828,13 +22828,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = Aria) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta#SP#partasp0.MAD @@ -23368,20 +23368,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = Aria, - SUBPARTITION subpart12 ENGINE = Aria), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = Aria, - SUBPARTITION subpart22 ENGINE = Aria), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = Aria, - SUBPARTITION subpart32 ENGINE = Aria), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = Aria, - SUBPARTITION subpart42 ENGINE = Aria)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = Aria, + SUBPARTITION `subpart12` ENGINE = Aria), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = Aria, + SUBPARTITION `subpart22` ENGINE = Aria), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = Aria, + SUBPARTITION `subpart32` ENGINE = Aria), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = Aria, + SUBPARTITION `subpart42` ENGINE = Aria)) unified filelist t1#P#part1#SP#subpart11.MAD @@ -23915,20 +23915,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = Aria, - SUBPARTITION sp12 ENGINE = Aria), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = Aria, - SUBPARTITION sp22 ENGINE = Aria), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = Aria, - SUBPARTITION sp32 ENGINE = Aria), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = Aria, - SUBPARTITION sp42 ENGINE = Aria)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = Aria, + SUBPARTITION `sp12` ENGINE = Aria), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = Aria, + SUBPARTITION `sp22` ENGINE = Aria), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = Aria, + SUBPARTITION `sp32` ENGINE = Aria), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = Aria, + SUBPARTITION `sp42` ENGINE = Aria)) unified filelist t1#P#part1#SP#sp11.MAD @@ -24460,12 +24460,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = Aria, - PARTITION part2 VALUES IN (1) ENGINE = Aria, - PARTITION part3 VALUES IN (NULL) ENGINE = Aria) +(PARTITION `part1` VALUES IN (0) ENGINE = Aria, + PARTITION `part2` VALUES IN (1) ENGINE = Aria, + PARTITION `part3` VALUES IN (NULL) ENGINE = Aria) unified filelist t1#P#part1#SP#part1sp0.MAD diff --git a/mysql-test/suite/parts/r/partition_alter2_1_myisam.result b/mysql-test/suite/parts/r/partition_alter2_1_myisam.result index 44550776616..ee587189113 100644 --- a/mysql-test/suite/parts/r/partition_alter2_1_myisam.result +++ b/mysql-test/suite/parts/r/partition_alter2_1_myisam.result @@ -74,7 +74,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -539,7 +539,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -1018,15 +1018,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -1508,13 +1508,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -1988,13 +1988,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -2478,20 +2478,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -2973,20 +2973,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -3466,12 +3466,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -3952,7 +3952,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -4469,7 +4469,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -5000,15 +5000,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -5542,13 +5542,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -6074,13 +6074,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -6616,20 +6616,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -7163,20 +7163,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -7708,12 +7708,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -8244,7 +8244,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -8761,7 +8761,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -9292,15 +9292,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -9834,13 +9834,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -10366,13 +10366,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -10908,20 +10908,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -11455,20 +11455,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -12000,12 +12000,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -12540,7 +12540,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -13005,7 +13005,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -13484,15 +13484,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -13974,13 +13974,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -14454,13 +14454,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -14942,20 +14942,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -15437,20 +15437,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -15930,12 +15930,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -16416,7 +16416,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -16933,7 +16933,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -17464,15 +17464,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -18006,13 +18006,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -18538,13 +18538,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -19078,20 +19078,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -19625,20 +19625,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -20170,12 +20170,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -20706,7 +20706,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -21223,7 +21223,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -21754,15 +21754,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -22296,13 +22296,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -22828,13 +22828,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -23368,20 +23368,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -23915,20 +23915,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -24460,12 +24460,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD diff --git a/mysql-test/suite/parts/r/partition_alter2_2_1_innodb.result b/mysql-test/suite/parts/r/partition_alter2_2_1_innodb.result index 113fc7bb312..d6352fb9b1f 100644 --- a/mysql-test/suite/parts/r/partition_alter2_2_1_innodb.result +++ b/mysql-test/suite/parts/r/partition_alter2_2_1_innodb.result @@ -74,7 +74,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -532,7 +532,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -998,15 +998,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1469,13 +1469,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1932,13 +1932,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2403,20 +2403,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2877,20 +2877,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3351,12 +3351,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3815,7 +3815,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -4311,7 +4311,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -4815,15 +4815,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5324,13 +5324,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5825,13 +5825,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6334,20 +6334,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6846,20 +6846,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7358,12 +7358,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7859,7 +7859,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -8355,7 +8355,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -8859,15 +8859,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9368,13 +9368,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9869,13 +9869,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10378,20 +10378,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10890,20 +10890,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11402,12 +11402,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11904,7 +11904,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -12414,7 +12414,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -12932,15 +12932,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13455,13 +13455,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13970,13 +13970,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14493,20 +14493,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15019,20 +15019,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15545,12 +15545,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -16060,7 +16060,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -16570,7 +16570,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -17088,15 +17088,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -17611,13 +17611,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18126,13 +18126,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18649,20 +18649,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19175,20 +19175,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19701,12 +19701,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 diff --git a/mysql-test/suite/parts/r/partition_alter2_2_2_innodb.result b/mysql-test/suite/parts/r/partition_alter2_2_2_innodb.result index becbaddd927..4bf99bd6acc 100644 --- a/mysql-test/suite/parts/r/partition_alter2_2_2_innodb.result +++ b/mysql-test/suite/parts/r/partition_alter2_2_2_innodb.result @@ -69,7 +69,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -528,7 +528,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -995,15 +995,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1467,13 +1467,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1935,13 +1935,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2407,20 +2407,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2886,20 +2886,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3361,12 +3361,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3827,7 +3827,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -4325,7 +4325,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -4831,15 +4831,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5342,13 +5342,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5849,13 +5849,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6360,20 +6360,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6878,20 +6878,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7392,12 +7392,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7895,7 +7895,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -8393,7 +8393,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -8899,15 +8899,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9410,13 +9410,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9917,13 +9917,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10428,20 +10428,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10946,20 +10946,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11460,12 +11460,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11964,7 +11964,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -12475,7 +12475,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -12994,15 +12994,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13518,13 +13518,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14038,13 +14038,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14562,20 +14562,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15093,20 +15093,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15620,12 +15620,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -16136,7 +16136,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -16647,7 +16647,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -17166,15 +17166,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -17690,13 +17690,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18210,13 +18210,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18734,20 +18734,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19265,20 +19265,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19792,12 +19792,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 diff --git a/mysql-test/suite/parts/r/partition_alter2_2_maria.result b/mysql-test/suite/parts/r/partition_alter2_2_maria.result index 72a497ed964..6dcdfe2d0e5 100644 --- a/mysql-test/suite/parts/r/partition_alter2_2_maria.result +++ b/mysql-test/suite/parts/r/partition_alter2_2_maria.result @@ -74,7 +74,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -541,7 +541,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -1022,15 +1022,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = Aria, - PARTITION part_2 VALUES IN (-2) ENGINE = Aria, - PARTITION part_1 VALUES IN (-1) ENGINE = Aria, - PARTITION part_N VALUES IN (NULL) ENGINE = Aria, - PARTITION part0 VALUES IN (0) ENGINE = Aria, - PARTITION part1 VALUES IN (1) ENGINE = Aria, - PARTITION part2 VALUES IN (2) ENGINE = Aria, - PARTITION part3 VALUES IN (3) ENGINE = Aria) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = Aria, + PARTITION `part_2` VALUES IN (-2) ENGINE = Aria, + PARTITION `part_1` VALUES IN (-1) ENGINE = Aria, + PARTITION `part_N` VALUES IN (NULL) ENGINE = Aria, + PARTITION `part0` VALUES IN (0) ENGINE = Aria, + PARTITION `part1` VALUES IN (1) ENGINE = Aria, + PARTITION `part2` VALUES IN (2) ENGINE = Aria, + PARTITION `part3` VALUES IN (3) ENGINE = Aria) unified filelist t1#P#part0.MAD @@ -1514,13 +1514,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (15) ENGINE = Aria, - PARTITION parte VALUES LESS THAN (20) ENGINE = Aria, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = Aria) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = Aria, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = Aria, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta.MAD @@ -1994,13 +1994,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = Aria) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta#SP#partasp0.MAD @@ -2486,20 +2486,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = Aria, - SUBPARTITION subpart12 ENGINE = Aria), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = Aria, - SUBPARTITION subpart22 ENGINE = Aria), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = Aria, - SUBPARTITION subpart32 ENGINE = Aria), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = Aria, - SUBPARTITION subpart42 ENGINE = Aria)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = Aria, + SUBPARTITION `subpart12` ENGINE = Aria), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = Aria, + SUBPARTITION `subpart22` ENGINE = Aria), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = Aria, + SUBPARTITION `subpart32` ENGINE = Aria), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = Aria, + SUBPARTITION `subpart42` ENGINE = Aria)) unified filelist t1#P#part1#SP#subpart11.MAD @@ -2981,20 +2981,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = Aria, - SUBPARTITION sp12 ENGINE = Aria), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = Aria, - SUBPARTITION sp22 ENGINE = Aria), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = Aria, - SUBPARTITION sp32 ENGINE = Aria), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = Aria, - SUBPARTITION sp42 ENGINE = Aria)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = Aria, + SUBPARTITION `sp12` ENGINE = Aria), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = Aria, + SUBPARTITION `sp22` ENGINE = Aria), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = Aria, + SUBPARTITION `sp32` ENGINE = Aria), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = Aria, + SUBPARTITION `sp42` ENGINE = Aria)) unified filelist t1#P#part1#SP#sp11.MAD @@ -3476,12 +3476,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = Aria, - PARTITION part2 VALUES IN (1) ENGINE = Aria, - PARTITION part3 VALUES IN (NULL) ENGINE = Aria) +(PARTITION `part1` VALUES IN (0) ENGINE = Aria, + PARTITION `part2` VALUES IN (1) ENGINE = Aria, + PARTITION `part3` VALUES IN (NULL) ENGINE = Aria) unified filelist t1#P#part1#SP#part1sp0.MAD @@ -3964,7 +3964,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -4483,7 +4483,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -5016,15 +5016,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = Aria, - PARTITION part_2 VALUES IN (-2) ENGINE = Aria, - PARTITION part_1 VALUES IN (-1) ENGINE = Aria, - PARTITION part_N VALUES IN (NULL) ENGINE = Aria, - PARTITION part0 VALUES IN (0) ENGINE = Aria, - PARTITION part1 VALUES IN (1) ENGINE = Aria, - PARTITION part2 VALUES IN (2) ENGINE = Aria, - PARTITION part3 VALUES IN (3) ENGINE = Aria) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = Aria, + PARTITION `part_2` VALUES IN (-2) ENGINE = Aria, + PARTITION `part_1` VALUES IN (-1) ENGINE = Aria, + PARTITION `part_N` VALUES IN (NULL) ENGINE = Aria, + PARTITION `part0` VALUES IN (0) ENGINE = Aria, + PARTITION `part1` VALUES IN (1) ENGINE = Aria, + PARTITION `part2` VALUES IN (2) ENGINE = Aria, + PARTITION `part3` VALUES IN (3) ENGINE = Aria) unified filelist t1#P#part0.MAD @@ -5560,13 +5560,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (15) ENGINE = Aria, - PARTITION parte VALUES LESS THAN (20) ENGINE = Aria, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = Aria) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = Aria, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = Aria, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta.MAD @@ -6092,13 +6092,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = Aria) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta#SP#partasp0.MAD @@ -6636,20 +6636,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = Aria, - SUBPARTITION subpart12 ENGINE = Aria), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = Aria, - SUBPARTITION subpart22 ENGINE = Aria), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = Aria, - SUBPARTITION subpart32 ENGINE = Aria), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = Aria, - SUBPARTITION subpart42 ENGINE = Aria)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = Aria, + SUBPARTITION `subpart12` ENGINE = Aria), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = Aria, + SUBPARTITION `subpart22` ENGINE = Aria), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = Aria, + SUBPARTITION `subpart32` ENGINE = Aria), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = Aria, + SUBPARTITION `subpart42` ENGINE = Aria)) unified filelist t1#P#part1#SP#subpart11.MAD @@ -7183,20 +7183,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = Aria, - SUBPARTITION sp12 ENGINE = Aria), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = Aria, - SUBPARTITION sp22 ENGINE = Aria), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = Aria, - SUBPARTITION sp32 ENGINE = Aria), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = Aria, - SUBPARTITION sp42 ENGINE = Aria)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = Aria, + SUBPARTITION `sp12` ENGINE = Aria), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = Aria, + SUBPARTITION `sp22` ENGINE = Aria), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = Aria, + SUBPARTITION `sp32` ENGINE = Aria), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = Aria, + SUBPARTITION `sp42` ENGINE = Aria)) unified filelist t1#P#part1#SP#sp11.MAD @@ -7730,12 +7730,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = Aria, - PARTITION part2 VALUES IN (1) ENGINE = Aria, - PARTITION part3 VALUES IN (NULL) ENGINE = Aria) +(PARTITION `part1` VALUES IN (0) ENGINE = Aria, + PARTITION `part2` VALUES IN (1) ENGINE = Aria, + PARTITION `part3` VALUES IN (NULL) ENGINE = Aria) unified filelist t1#P#part1#SP#part1sp0.MAD @@ -8268,7 +8268,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -8787,7 +8787,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -9320,15 +9320,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = Aria, - PARTITION part_2 VALUES IN (-2) ENGINE = Aria, - PARTITION part_1 VALUES IN (-1) ENGINE = Aria, - PARTITION part_N VALUES IN (NULL) ENGINE = Aria, - PARTITION part0 VALUES IN (0) ENGINE = Aria, - PARTITION part1 VALUES IN (1) ENGINE = Aria, - PARTITION part2 VALUES IN (2) ENGINE = Aria, - PARTITION part3 VALUES IN (3) ENGINE = Aria) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = Aria, + PARTITION `part_2` VALUES IN (-2) ENGINE = Aria, + PARTITION `part_1` VALUES IN (-1) ENGINE = Aria, + PARTITION `part_N` VALUES IN (NULL) ENGINE = Aria, + PARTITION `part0` VALUES IN (0) ENGINE = Aria, + PARTITION `part1` VALUES IN (1) ENGINE = Aria, + PARTITION `part2` VALUES IN (2) ENGINE = Aria, + PARTITION `part3` VALUES IN (3) ENGINE = Aria) unified filelist t1#P#part0.MAD @@ -9864,13 +9864,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (15) ENGINE = Aria, - PARTITION parte VALUES LESS THAN (20) ENGINE = Aria, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = Aria) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = Aria, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = Aria, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta.MAD @@ -10396,13 +10396,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = Aria) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta#SP#partasp0.MAD @@ -10940,20 +10940,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = Aria, - SUBPARTITION subpart12 ENGINE = Aria), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = Aria, - SUBPARTITION subpart22 ENGINE = Aria), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = Aria, - SUBPARTITION subpart32 ENGINE = Aria), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = Aria, - SUBPARTITION subpart42 ENGINE = Aria)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = Aria, + SUBPARTITION `subpart12` ENGINE = Aria), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = Aria, + SUBPARTITION `subpart22` ENGINE = Aria), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = Aria, + SUBPARTITION `subpart32` ENGINE = Aria), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = Aria, + SUBPARTITION `subpart42` ENGINE = Aria)) unified filelist t1#P#part1#SP#subpart11.MAD @@ -11487,20 +11487,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = Aria, - SUBPARTITION sp12 ENGINE = Aria), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = Aria, - SUBPARTITION sp22 ENGINE = Aria), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = Aria, - SUBPARTITION sp32 ENGINE = Aria), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = Aria, - SUBPARTITION sp42 ENGINE = Aria)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = Aria, + SUBPARTITION `sp12` ENGINE = Aria), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = Aria, + SUBPARTITION `sp22` ENGINE = Aria), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = Aria, + SUBPARTITION `sp32` ENGINE = Aria), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = Aria, + SUBPARTITION `sp42` ENGINE = Aria)) unified filelist t1#P#part1#SP#sp11.MAD @@ -12034,12 +12034,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = Aria, - PARTITION part2 VALUES IN (1) ENGINE = Aria, - PARTITION part3 VALUES IN (NULL) ENGINE = Aria) +(PARTITION `part1` VALUES IN (0) ENGINE = Aria, + PARTITION `part2` VALUES IN (1) ENGINE = Aria, + PARTITION `part3` VALUES IN (NULL) ENGINE = Aria) unified filelist t1#P#part1#SP#part1sp0.MAD @@ -12575,7 +12575,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -13043,7 +13043,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -13525,15 +13525,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = Aria, - PARTITION part_2 VALUES IN (-2) ENGINE = Aria, - PARTITION part_1 VALUES IN (-1) ENGINE = Aria, - PARTITION part_N VALUES IN (NULL) ENGINE = Aria, - PARTITION part0 VALUES IN (0) ENGINE = Aria, - PARTITION part1 VALUES IN (1) ENGINE = Aria, - PARTITION part2 VALUES IN (2) ENGINE = Aria, - PARTITION part3 VALUES IN (3) ENGINE = Aria) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = Aria, + PARTITION `part_2` VALUES IN (-2) ENGINE = Aria, + PARTITION `part_1` VALUES IN (-1) ENGINE = Aria, + PARTITION `part_N` VALUES IN (NULL) ENGINE = Aria, + PARTITION `part0` VALUES IN (0) ENGINE = Aria, + PARTITION `part1` VALUES IN (1) ENGINE = Aria, + PARTITION `part2` VALUES IN (2) ENGINE = Aria, + PARTITION `part3` VALUES IN (3) ENGINE = Aria) unified filelist t1#P#part0.MAD @@ -14018,13 +14018,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (15) ENGINE = Aria, - PARTITION parte VALUES LESS THAN (20) ENGINE = Aria, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = Aria) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = Aria, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = Aria, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta.MAD @@ -14503,13 +14503,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = Aria) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta#SP#partasp0.MAD @@ -14996,20 +14996,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = Aria, - SUBPARTITION subpart12 ENGINE = Aria), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = Aria, - SUBPARTITION subpart22 ENGINE = Aria), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = Aria, - SUBPARTITION subpart32 ENGINE = Aria), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = Aria, - SUBPARTITION subpart42 ENGINE = Aria)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = Aria, + SUBPARTITION `subpart12` ENGINE = Aria), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = Aria, + SUBPARTITION `subpart22` ENGINE = Aria), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = Aria, + SUBPARTITION `subpart32` ENGINE = Aria), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = Aria, + SUBPARTITION `subpart42` ENGINE = Aria)) unified filelist t1#P#part1#SP#subpart11.MAD @@ -15496,20 +15496,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = Aria, - SUBPARTITION sp12 ENGINE = Aria), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = Aria, - SUBPARTITION sp22 ENGINE = Aria), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = Aria, - SUBPARTITION sp32 ENGINE = Aria), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = Aria, - SUBPARTITION sp42 ENGINE = Aria)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = Aria, + SUBPARTITION `sp12` ENGINE = Aria), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = Aria, + SUBPARTITION `sp22` ENGINE = Aria), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = Aria, + SUBPARTITION `sp32` ENGINE = Aria), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = Aria, + SUBPARTITION `sp42` ENGINE = Aria)) unified filelist t1#P#part1#SP#sp11.MAD @@ -15992,12 +15992,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = Aria, - PARTITION part2 VALUES IN (1) ENGINE = Aria, - PARTITION part3 VALUES IN (NULL) ENGINE = Aria) +(PARTITION `part1` VALUES IN (0) ENGINE = Aria, + PARTITION `part2` VALUES IN (1) ENGINE = Aria, + PARTITION `part3` VALUES IN (NULL) ENGINE = Aria) unified filelist t1#P#part1#SP#part1sp0.MAD @@ -16481,7 +16481,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -17001,7 +17001,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -17535,15 +17535,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = Aria, - PARTITION part_2 VALUES IN (-2) ENGINE = Aria, - PARTITION part_1 VALUES IN (-1) ENGINE = Aria, - PARTITION part_N VALUES IN (NULL) ENGINE = Aria, - PARTITION part0 VALUES IN (0) ENGINE = Aria, - PARTITION part1 VALUES IN (1) ENGINE = Aria, - PARTITION part2 VALUES IN (2) ENGINE = Aria, - PARTITION part3 VALUES IN (3) ENGINE = Aria) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = Aria, + PARTITION `part_2` VALUES IN (-2) ENGINE = Aria, + PARTITION `part_1` VALUES IN (-1) ENGINE = Aria, + PARTITION `part_N` VALUES IN (NULL) ENGINE = Aria, + PARTITION `part0` VALUES IN (0) ENGINE = Aria, + PARTITION `part1` VALUES IN (1) ENGINE = Aria, + PARTITION `part2` VALUES IN (2) ENGINE = Aria, + PARTITION `part3` VALUES IN (3) ENGINE = Aria) unified filelist t1#P#part0.MAD @@ -18080,13 +18080,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (15) ENGINE = Aria, - PARTITION parte VALUES LESS THAN (20) ENGINE = Aria, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = Aria) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = Aria, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = Aria, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta.MAD @@ -18617,13 +18617,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = Aria) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta#SP#partasp0.MAD @@ -19162,20 +19162,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = Aria, - SUBPARTITION subpart12 ENGINE = Aria), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = Aria, - SUBPARTITION subpart22 ENGINE = Aria), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = Aria, - SUBPARTITION subpart32 ENGINE = Aria), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = Aria, - SUBPARTITION subpart42 ENGINE = Aria)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = Aria, + SUBPARTITION `subpart12` ENGINE = Aria), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = Aria, + SUBPARTITION `subpart22` ENGINE = Aria), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = Aria, + SUBPARTITION `subpart32` ENGINE = Aria), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = Aria, + SUBPARTITION `subpart42` ENGINE = Aria)) unified filelist t1#P#part1#SP#subpart11.MAD @@ -19714,20 +19714,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = Aria, - SUBPARTITION sp12 ENGINE = Aria), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = Aria, - SUBPARTITION sp22 ENGINE = Aria), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = Aria, - SUBPARTITION sp32 ENGINE = Aria), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = Aria, - SUBPARTITION sp42 ENGINE = Aria)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = Aria, + SUBPARTITION `sp12` ENGINE = Aria), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = Aria, + SUBPARTITION `sp22` ENGINE = Aria), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = Aria, + SUBPARTITION `sp32` ENGINE = Aria), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = Aria, + SUBPARTITION `sp42` ENGINE = Aria)) unified filelist t1#P#part1#SP#sp11.MAD @@ -20262,12 +20262,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = Aria, - PARTITION part2 VALUES IN (1) ENGINE = Aria, - PARTITION part3 VALUES IN (NULL) ENGINE = Aria) +(PARTITION `part1` VALUES IN (0) ENGINE = Aria, + PARTITION `part2` VALUES IN (1) ENGINE = Aria, + PARTITION `part3` VALUES IN (NULL) ENGINE = Aria) unified filelist t1#P#part1#SP#part1sp0.MAD @@ -20801,7 +20801,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -21321,7 +21321,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -21855,15 +21855,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = Aria, - PARTITION part_2 VALUES IN (-2) ENGINE = Aria, - PARTITION part_1 VALUES IN (-1) ENGINE = Aria, - PARTITION part_N VALUES IN (NULL) ENGINE = Aria, - PARTITION part0 VALUES IN (0) ENGINE = Aria, - PARTITION part1 VALUES IN (1) ENGINE = Aria, - PARTITION part2 VALUES IN (2) ENGINE = Aria, - PARTITION part3 VALUES IN (3) ENGINE = Aria) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = Aria, + PARTITION `part_2` VALUES IN (-2) ENGINE = Aria, + PARTITION `part_1` VALUES IN (-1) ENGINE = Aria, + PARTITION `part_N` VALUES IN (NULL) ENGINE = Aria, + PARTITION `part0` VALUES IN (0) ENGINE = Aria, + PARTITION `part1` VALUES IN (1) ENGINE = Aria, + PARTITION `part2` VALUES IN (2) ENGINE = Aria, + PARTITION `part3` VALUES IN (3) ENGINE = Aria) unified filelist t1#P#part0.MAD @@ -22400,13 +22400,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (15) ENGINE = Aria, - PARTITION parte VALUES LESS THAN (20) ENGINE = Aria, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = Aria) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = Aria, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = Aria, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta.MAD @@ -22937,13 +22937,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = Aria, - PARTITION partb VALUES LESS THAN (5) ENGINE = Aria, - PARTITION partc VALUES LESS THAN (10) ENGINE = Aria, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = Aria) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = Aria, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = Aria, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = Aria, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = Aria) unified filelist t1#P#parta#SP#partasp0.MAD @@ -23482,20 +23482,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = Aria, - SUBPARTITION subpart12 ENGINE = Aria), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = Aria, - SUBPARTITION subpart22 ENGINE = Aria), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = Aria, - SUBPARTITION subpart32 ENGINE = Aria), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = Aria, - SUBPARTITION subpart42 ENGINE = Aria)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = Aria, + SUBPARTITION `subpart12` ENGINE = Aria), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = Aria, + SUBPARTITION `subpart22` ENGINE = Aria), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = Aria, + SUBPARTITION `subpart32` ENGINE = Aria), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = Aria, + SUBPARTITION `subpart42` ENGINE = Aria)) unified filelist t1#P#part1#SP#subpart11.MAD @@ -24034,20 +24034,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = Aria, - SUBPARTITION sp12 ENGINE = Aria), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = Aria, - SUBPARTITION sp22 ENGINE = Aria), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = Aria, - SUBPARTITION sp32 ENGINE = Aria), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = Aria, - SUBPARTITION sp42 ENGINE = Aria)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = Aria, + SUBPARTITION `sp12` ENGINE = Aria), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = Aria, + SUBPARTITION `sp22` ENGINE = Aria), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = Aria, + SUBPARTITION `sp32` ENGINE = Aria), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = Aria, + SUBPARTITION `sp42` ENGINE = Aria)) unified filelist t1#P#part1#SP#sp11.MAD @@ -24582,12 +24582,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = Aria, - PARTITION part2 VALUES IN (1) ENGINE = Aria, - PARTITION part3 VALUES IN (NULL) ENGINE = Aria) +(PARTITION `part1` VALUES IN (0) ENGINE = Aria, + PARTITION `part2` VALUES IN (1) ENGINE = Aria, + PARTITION `part3` VALUES IN (NULL) ENGINE = Aria) unified filelist t1#P#part1#SP#part1sp0.MAD diff --git a/mysql-test/suite/parts/r/partition_alter2_2_myisam.result b/mysql-test/suite/parts/r/partition_alter2_2_myisam.result index aa490308295..5fef45b630d 100644 --- a/mysql-test/suite/parts/r/partition_alter2_2_myisam.result +++ b/mysql-test/suite/parts/r/partition_alter2_2_myisam.result @@ -74,7 +74,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -541,7 +541,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -1022,15 +1022,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -1514,13 +1514,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -1994,13 +1994,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -2486,20 +2486,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -2981,20 +2981,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -3476,12 +3476,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -3964,7 +3964,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -4483,7 +4483,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -5016,15 +5016,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -5560,13 +5560,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -6092,13 +6092,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -6636,20 +6636,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -7183,20 +7183,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -7730,12 +7730,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -8268,7 +8268,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -8787,7 +8787,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -9320,15 +9320,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -9864,13 +9864,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -10396,13 +10396,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -10940,20 +10940,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -11487,20 +11487,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -12034,12 +12034,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -12575,7 +12575,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -13043,7 +13043,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -13525,15 +13525,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -14018,13 +14018,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -14503,13 +14503,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -14996,20 +14996,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -15496,20 +15496,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -15992,12 +15992,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -16481,7 +16481,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -17001,7 +17001,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -17535,15 +17535,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -18080,13 +18080,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -18617,13 +18617,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -19162,20 +19162,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -19714,20 +19714,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -20262,12 +20262,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -20801,7 +20801,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -21321,7 +21321,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -21855,15 +21855,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -22400,13 +22400,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -22937,13 +22937,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -23482,20 +23482,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -24034,20 +24034,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -24582,12 +24582,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD diff --git a/mysql-test/suite/parts/r/partition_alter3_innodb.result b/mysql-test/suite/parts/r/partition_alter3_innodb.result index 57c0bc78914..a859f8200c0 100644 --- a/mysql-test/suite/parts/r/partition_alter3_innodb.result +++ b/mysql-test/suite/parts/r/partition_alter3_innodb.result @@ -78,7 +78,7 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) + PARTITION BY HASH (year(`f_date`)) t1#P#p0.ibd t1.frm t1.par @@ -97,7 +97,7 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAYOFYEAR(f_date)) + PARTITION BY HASH (dayofyear(`f_date`)) t1#P#p0.ibd t1.frm t1.par @@ -114,7 +114,7 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) + PARTITION BY HASH (year(`f_date`)) t1#P#p0.ibd t1.frm t1.par @@ -137,10 +137,10 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = InnoDB, - PARTITION part1 ENGINE = InnoDB, - PARTITION part7 ENGINE = InnoDB) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = InnoDB, + PARTITION `part1` ENGINE = InnoDB, + PARTITION `part7` ENGINE = InnoDB) t1#P#p0.ibd t1#P#part1.ibd t1#P#part7.ibd @@ -163,11 +163,11 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = InnoDB, - PARTITION part1 ENGINE = InnoDB, - PARTITION part7 ENGINE = InnoDB, - PARTITION part2 ENGINE = InnoDB) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = InnoDB, + PARTITION `part1` ENGINE = InnoDB, + PARTITION `part7` ENGINE = InnoDB, + PARTITION `part2` ENGINE = InnoDB) t1#P#p0.ibd t1#P#part1.ibd t1#P#part2.ibd @@ -188,15 +188,15 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = InnoDB, - PARTITION part1 ENGINE = InnoDB, - PARTITION part7 ENGINE = InnoDB, - PARTITION part2 ENGINE = InnoDB, - PARTITION p4 ENGINE = InnoDB, - PARTITION p5 ENGINE = InnoDB, - PARTITION p6 ENGINE = InnoDB, - PARTITION p7 ENGINE = InnoDB) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = InnoDB, + PARTITION `part1` ENGINE = InnoDB, + PARTITION `part7` ENGINE = InnoDB, + PARTITION `part2` ENGINE = InnoDB, + PARTITION `p4` ENGINE = InnoDB, + PARTITION `p5` ENGINE = InnoDB, + PARTITION `p6` ENGINE = InnoDB, + PARTITION `p7` ENGINE = InnoDB) t1#P#p0.ibd t1#P#p4.ibd t1#P#p5.ibd @@ -233,14 +233,14 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = InnoDB, - PARTITION part1 ENGINE = InnoDB, - PARTITION part7 ENGINE = InnoDB, - PARTITION part2 ENGINE = InnoDB, - PARTITION p4 ENGINE = InnoDB, - PARTITION p5 ENGINE = InnoDB, - PARTITION p6 ENGINE = InnoDB) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = InnoDB, + PARTITION `part1` ENGINE = InnoDB, + PARTITION `part7` ENGINE = InnoDB, + PARTITION `part2` ENGINE = InnoDB, + PARTITION `p4` ENGINE = InnoDB, + PARTITION `p5` ENGINE = InnoDB, + PARTITION `p6` ENGINE = InnoDB) t1#P#p0.ibd t1#P#p4.ibd t1#P#p5.ibd @@ -263,13 +263,13 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = InnoDB, - PARTITION part1 ENGINE = InnoDB, - PARTITION part7 ENGINE = InnoDB, - PARTITION part2 ENGINE = InnoDB, - PARTITION p4 ENGINE = InnoDB, - PARTITION p5 ENGINE = InnoDB) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = InnoDB, + PARTITION `part1` ENGINE = InnoDB, + PARTITION `part7` ENGINE = InnoDB, + PARTITION `part2` ENGINE = InnoDB, + PARTITION `p4` ENGINE = InnoDB, + PARTITION `p5` ENGINE = InnoDB) t1#P#p0.ibd t1#P#p4.ibd t1#P#p5.ibd @@ -291,12 +291,12 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = InnoDB, - PARTITION part1 ENGINE = InnoDB, - PARTITION part7 ENGINE = InnoDB, - PARTITION part2 ENGINE = InnoDB, - PARTITION p4 ENGINE = InnoDB) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = InnoDB, + PARTITION `part1` ENGINE = InnoDB, + PARTITION `part7` ENGINE = InnoDB, + PARTITION `part2` ENGINE = InnoDB, + PARTITION `p4` ENGINE = InnoDB) t1#P#p0.ibd t1#P#p4.ibd t1#P#part1.ibd @@ -317,11 +317,11 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = InnoDB, - PARTITION part1 ENGINE = InnoDB, - PARTITION part7 ENGINE = InnoDB, - PARTITION part2 ENGINE = InnoDB) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = InnoDB, + PARTITION `part1` ENGINE = InnoDB, + PARTITION `part7` ENGINE = InnoDB, + PARTITION `part2` ENGINE = InnoDB) t1#P#p0.ibd t1#P#part1.ibd t1#P#part2.ibd @@ -341,10 +341,10 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = InnoDB, - PARTITION part1 ENGINE = InnoDB, - PARTITION part7 ENGINE = InnoDB) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = InnoDB, + PARTITION `part1` ENGINE = InnoDB, + PARTITION `part7` ENGINE = InnoDB) t1#P#p0.ibd t1#P#part1.ibd t1#P#part7.ibd @@ -363,9 +363,9 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = InnoDB, - PARTITION part1 ENGINE = InnoDB) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = InnoDB, + PARTITION `part1` ENGINE = InnoDB) t1#P#p0.ibd t1#P#part1.ibd t1.frm @@ -383,8 +383,8 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = InnoDB) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = InnoDB) t1#P#p0.ibd t1.frm t1.par @@ -469,7 +469,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) t1#P#p0.ibd t1.frm t1.par @@ -495,10 +495,10 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = InnoDB, - PARTITION part1 ENGINE = InnoDB, - PARTITION part7 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = InnoDB, + PARTITION `part1` ENGINE = InnoDB, + PARTITION `part7` ENGINE = InnoDB) t1#P#p0.ibd t1#P#part1.ibd t1#P#part7.ibd @@ -521,11 +521,11 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = InnoDB, - PARTITION part1 ENGINE = InnoDB, - PARTITION part7 ENGINE = InnoDB, - PARTITION part2 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = InnoDB, + PARTITION `part1` ENGINE = InnoDB, + PARTITION `part7` ENGINE = InnoDB, + PARTITION `part2` ENGINE = InnoDB) t1#P#p0.ibd t1#P#part1.ibd t1#P#part2.ibd @@ -549,15 +549,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = InnoDB, - PARTITION part1 ENGINE = InnoDB, - PARTITION part7 ENGINE = InnoDB, - PARTITION part2 ENGINE = InnoDB, - PARTITION p4 ENGINE = InnoDB, - PARTITION p5 ENGINE = InnoDB, - PARTITION p6 ENGINE = InnoDB, - PARTITION p7 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = InnoDB, + PARTITION `part1` ENGINE = InnoDB, + PARTITION `part7` ENGINE = InnoDB, + PARTITION `part2` ENGINE = InnoDB, + PARTITION `p4` ENGINE = InnoDB, + PARTITION `p5` ENGINE = InnoDB, + PARTITION `p6` ENGINE = InnoDB, + PARTITION `p7` ENGINE = InnoDB) t1#P#p0.ibd t1#P#p4.ibd t1#P#p5.ibd @@ -592,14 +592,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = InnoDB, - PARTITION part1 ENGINE = InnoDB, - PARTITION part7 ENGINE = InnoDB, - PARTITION part2 ENGINE = InnoDB, - PARTITION p4 ENGINE = InnoDB, - PARTITION p5 ENGINE = InnoDB, - PARTITION p6 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = InnoDB, + PARTITION `part1` ENGINE = InnoDB, + PARTITION `part7` ENGINE = InnoDB, + PARTITION `part2` ENGINE = InnoDB, + PARTITION `p4` ENGINE = InnoDB, + PARTITION `p5` ENGINE = InnoDB, + PARTITION `p6` ENGINE = InnoDB) t1#P#p0.ibd t1#P#p4.ibd t1#P#p5.ibd @@ -625,13 +625,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = InnoDB, - PARTITION part1 ENGINE = InnoDB, - PARTITION part7 ENGINE = InnoDB, - PARTITION part2 ENGINE = InnoDB, - PARTITION p4 ENGINE = InnoDB, - PARTITION p5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = InnoDB, + PARTITION `part1` ENGINE = InnoDB, + PARTITION `part7` ENGINE = InnoDB, + PARTITION `part2` ENGINE = InnoDB, + PARTITION `p4` ENGINE = InnoDB, + PARTITION `p5` ENGINE = InnoDB) t1#P#p0.ibd t1#P#p4.ibd t1#P#p5.ibd @@ -656,12 +656,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = InnoDB, - PARTITION part1 ENGINE = InnoDB, - PARTITION part7 ENGINE = InnoDB, - PARTITION part2 ENGINE = InnoDB, - PARTITION p4 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = InnoDB, + PARTITION `part1` ENGINE = InnoDB, + PARTITION `part7` ENGINE = InnoDB, + PARTITION `part2` ENGINE = InnoDB, + PARTITION `p4` ENGINE = InnoDB) t1#P#p0.ibd t1#P#p4.ibd t1#P#part1.ibd @@ -685,11 +685,11 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = InnoDB, - PARTITION part1 ENGINE = InnoDB, - PARTITION part7 ENGINE = InnoDB, - PARTITION part2 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = InnoDB, + PARTITION `part1` ENGINE = InnoDB, + PARTITION `part7` ENGINE = InnoDB, + PARTITION `part2` ENGINE = InnoDB) t1#P#p0.ibd t1#P#part1.ibd t1#P#part2.ibd @@ -712,10 +712,10 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = InnoDB, - PARTITION part1 ENGINE = InnoDB, - PARTITION part7 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = InnoDB, + PARTITION `part1` ENGINE = InnoDB, + PARTITION `part7` ENGINE = InnoDB) t1#P#p0.ibd t1#P#part1.ibd t1#P#part7.ibd @@ -737,9 +737,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = InnoDB, - PARTITION part1 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = InnoDB, + PARTITION `part1` ENGINE = InnoDB) t1#P#p0.ibd t1#P#part1.ibd t1.frm @@ -760,8 +760,8 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = InnoDB) t1#P#p0.ibd t1.frm t1.par diff --git a/mysql-test/suite/parts/r/partition_alter3_myisam.result b/mysql-test/suite/parts/r/partition_alter3_myisam.result index 99d1587ef09..1a412bc27a4 100644 --- a/mysql-test/suite/parts/r/partition_alter3_myisam.result +++ b/mysql-test/suite/parts/r/partition_alter3_myisam.result @@ -79,7 +79,7 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) + PARTITION BY HASH (year(`f_date`)) t1#P#p0.MYD t1#P#p0.MYI t1.frm @@ -99,7 +99,7 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAYOFYEAR(f_date)) + PARTITION BY HASH (dayofyear(`f_date`)) t1#P#p0.MYD t1#P#p0.MYI t1.frm @@ -117,7 +117,7 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) + PARTITION BY HASH (year(`f_date`)) t1#P#p0.MYD t1#P#p0.MYI t1.frm @@ -141,10 +141,10 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = MyISAM, - PARTITION part1 ENGINE = MyISAM, - PARTITION part7 ENGINE = MyISAM) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = MyISAM, + PARTITION `part1` ENGINE = MyISAM, + PARTITION `part7` ENGINE = MyISAM) t1#P#p0.MYD t1#P#p0.MYI t1#P#part1.MYD @@ -170,11 +170,11 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = MyISAM, - PARTITION part1 ENGINE = MyISAM, - PARTITION part7 ENGINE = MyISAM, - PARTITION part2 ENGINE = MyISAM) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = MyISAM, + PARTITION `part1` ENGINE = MyISAM, + PARTITION `part7` ENGINE = MyISAM, + PARTITION `part2` ENGINE = MyISAM) t1#P#p0.MYD t1#P#p0.MYI t1#P#part1.MYD @@ -199,15 +199,15 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = MyISAM, - PARTITION part1 ENGINE = MyISAM, - PARTITION part7 ENGINE = MyISAM, - PARTITION part2 ENGINE = MyISAM, - PARTITION p4 ENGINE = MyISAM, - PARTITION p5 ENGINE = MyISAM, - PARTITION p6 ENGINE = MyISAM, - PARTITION p7 ENGINE = MyISAM) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = MyISAM, + PARTITION `part1` ENGINE = MyISAM, + PARTITION `part7` ENGINE = MyISAM, + PARTITION `part2` ENGINE = MyISAM, + PARTITION `p4` ENGINE = MyISAM, + PARTITION `p5` ENGINE = MyISAM, + PARTITION `p6` ENGINE = MyISAM, + PARTITION `p7` ENGINE = MyISAM) t1#P#p0.MYD t1#P#p0.MYI t1#P#p4.MYD @@ -252,14 +252,14 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = MyISAM, - PARTITION part1 ENGINE = MyISAM, - PARTITION part7 ENGINE = MyISAM, - PARTITION part2 ENGINE = MyISAM, - PARTITION p4 ENGINE = MyISAM, - PARTITION p5 ENGINE = MyISAM, - PARTITION p6 ENGINE = MyISAM) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = MyISAM, + PARTITION `part1` ENGINE = MyISAM, + PARTITION `part7` ENGINE = MyISAM, + PARTITION `part2` ENGINE = MyISAM, + PARTITION `p4` ENGINE = MyISAM, + PARTITION `p5` ENGINE = MyISAM, + PARTITION `p6` ENGINE = MyISAM) t1#P#p0.MYD t1#P#p0.MYI t1#P#p4.MYD @@ -289,13 +289,13 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = MyISAM, - PARTITION part1 ENGINE = MyISAM, - PARTITION part7 ENGINE = MyISAM, - PARTITION part2 ENGINE = MyISAM, - PARTITION p4 ENGINE = MyISAM, - PARTITION p5 ENGINE = MyISAM) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = MyISAM, + PARTITION `part1` ENGINE = MyISAM, + PARTITION `part7` ENGINE = MyISAM, + PARTITION `part2` ENGINE = MyISAM, + PARTITION `p4` ENGINE = MyISAM, + PARTITION `p5` ENGINE = MyISAM) t1#P#p0.MYD t1#P#p0.MYI t1#P#p4.MYD @@ -323,12 +323,12 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = MyISAM, - PARTITION part1 ENGINE = MyISAM, - PARTITION part7 ENGINE = MyISAM, - PARTITION part2 ENGINE = MyISAM, - PARTITION p4 ENGINE = MyISAM) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = MyISAM, + PARTITION `part1` ENGINE = MyISAM, + PARTITION `part7` ENGINE = MyISAM, + PARTITION `part2` ENGINE = MyISAM, + PARTITION `p4` ENGINE = MyISAM) t1#P#p0.MYD t1#P#p0.MYI t1#P#p4.MYD @@ -354,11 +354,11 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = MyISAM, - PARTITION part1 ENGINE = MyISAM, - PARTITION part7 ENGINE = MyISAM, - PARTITION part2 ENGINE = MyISAM) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = MyISAM, + PARTITION `part1` ENGINE = MyISAM, + PARTITION `part7` ENGINE = MyISAM, + PARTITION `part2` ENGINE = MyISAM) t1#P#p0.MYD t1#P#p0.MYI t1#P#part1.MYD @@ -382,10 +382,10 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = MyISAM, - PARTITION part1 ENGINE = MyISAM, - PARTITION part7 ENGINE = MyISAM) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = MyISAM, + PARTITION `part1` ENGINE = MyISAM, + PARTITION `part7` ENGINE = MyISAM) t1#P#p0.MYD t1#P#p0.MYI t1#P#part1.MYD @@ -407,9 +407,9 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = MyISAM, - PARTITION part1 ENGINE = MyISAM) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = MyISAM, + PARTITION `part1` ENGINE = MyISAM) t1#P#p0.MYD t1#P#p0.MYI t1#P#part1.MYD @@ -429,8 +429,8 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = MyISAM) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = MyISAM) t1#P#p0.MYD t1#P#p0.MYI t1.frm @@ -512,7 +512,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) t1#P#p0.MYD t1#P#p0.MYI t1.frm @@ -539,10 +539,10 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = MyISAM, - PARTITION part1 ENGINE = MyISAM, - PARTITION part7 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = MyISAM, + PARTITION `part1` ENGINE = MyISAM, + PARTITION `part7` ENGINE = MyISAM) t1#P#p0.MYD t1#P#p0.MYI t1#P#part1.MYD @@ -568,11 +568,11 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = MyISAM, - PARTITION part1 ENGINE = MyISAM, - PARTITION part7 ENGINE = MyISAM, - PARTITION part2 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = MyISAM, + PARTITION `part1` ENGINE = MyISAM, + PARTITION `part7` ENGINE = MyISAM, + PARTITION `part2` ENGINE = MyISAM) t1#P#p0.MYD t1#P#p0.MYI t1#P#part1.MYD @@ -600,15 +600,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = MyISAM, - PARTITION part1 ENGINE = MyISAM, - PARTITION part7 ENGINE = MyISAM, - PARTITION part2 ENGINE = MyISAM, - PARTITION p4 ENGINE = MyISAM, - PARTITION p5 ENGINE = MyISAM, - PARTITION p6 ENGINE = MyISAM, - PARTITION p7 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = MyISAM, + PARTITION `part1` ENGINE = MyISAM, + PARTITION `part7` ENGINE = MyISAM, + PARTITION `part2` ENGINE = MyISAM, + PARTITION `p4` ENGINE = MyISAM, + PARTITION `p5` ENGINE = MyISAM, + PARTITION `p6` ENGINE = MyISAM, + PARTITION `p7` ENGINE = MyISAM) t1#P#p0.MYD t1#P#p0.MYI t1#P#p4.MYD @@ -651,14 +651,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = MyISAM, - PARTITION part1 ENGINE = MyISAM, - PARTITION part7 ENGINE = MyISAM, - PARTITION part2 ENGINE = MyISAM, - PARTITION p4 ENGINE = MyISAM, - PARTITION p5 ENGINE = MyISAM, - PARTITION p6 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = MyISAM, + PARTITION `part1` ENGINE = MyISAM, + PARTITION `part7` ENGINE = MyISAM, + PARTITION `part2` ENGINE = MyISAM, + PARTITION `p4` ENGINE = MyISAM, + PARTITION `p5` ENGINE = MyISAM, + PARTITION `p6` ENGINE = MyISAM) t1#P#p0.MYD t1#P#p0.MYI t1#P#p4.MYD @@ -691,13 +691,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = MyISAM, - PARTITION part1 ENGINE = MyISAM, - PARTITION part7 ENGINE = MyISAM, - PARTITION part2 ENGINE = MyISAM, - PARTITION p4 ENGINE = MyISAM, - PARTITION p5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = MyISAM, + PARTITION `part1` ENGINE = MyISAM, + PARTITION `part7` ENGINE = MyISAM, + PARTITION `part2` ENGINE = MyISAM, + PARTITION `p4` ENGINE = MyISAM, + PARTITION `p5` ENGINE = MyISAM) t1#P#p0.MYD t1#P#p0.MYI t1#P#p4.MYD @@ -728,12 +728,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = MyISAM, - PARTITION part1 ENGINE = MyISAM, - PARTITION part7 ENGINE = MyISAM, - PARTITION part2 ENGINE = MyISAM, - PARTITION p4 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = MyISAM, + PARTITION `part1` ENGINE = MyISAM, + PARTITION `part7` ENGINE = MyISAM, + PARTITION `part2` ENGINE = MyISAM, + PARTITION `p4` ENGINE = MyISAM) t1#P#p0.MYD t1#P#p0.MYI t1#P#p4.MYD @@ -762,11 +762,11 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = MyISAM, - PARTITION part1 ENGINE = MyISAM, - PARTITION part7 ENGINE = MyISAM, - PARTITION part2 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = MyISAM, + PARTITION `part1` ENGINE = MyISAM, + PARTITION `part7` ENGINE = MyISAM, + PARTITION `part2` ENGINE = MyISAM) t1#P#p0.MYD t1#P#p0.MYI t1#P#part1.MYD @@ -793,10 +793,10 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = MyISAM, - PARTITION part1 ENGINE = MyISAM, - PARTITION part7 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = MyISAM, + PARTITION `part1` ENGINE = MyISAM, + PARTITION `part7` ENGINE = MyISAM) t1#P#p0.MYD t1#P#p0.MYI t1#P#part1.MYD @@ -821,9 +821,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = MyISAM, - PARTITION part1 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = MyISAM, + PARTITION `part1` ENGINE = MyISAM) t1#P#p0.MYD t1#P#p0.MYI t1#P#part1.MYD @@ -846,8 +846,8 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = MyISAM) t1#P#p0.MYD t1#P#p0.MYI t1.frm diff --git a/mysql-test/suite/parts/r/partition_alter4_innodb.result b/mysql-test/suite/parts/r/partition_alter4_innodb.result index 169f73d045a..1c3edcb386d 100644 --- a/mysql-test/suite/parts/r/partition_alter4_innodb.result +++ b/mysql-test/suite/parts/r/partition_alter4_innodb.result @@ -75,9 +75,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -534,12 +534,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB, - PARTITION part_3 ENGINE = InnoDB, - PARTITION part_4 ENGINE = InnoDB, - PARTITION part_5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB, + PARTITION `part_3` ENGINE = InnoDB, + PARTITION `part_4` ENGINE = InnoDB, + PARTITION `part_5` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1004,15 +1004,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1475,13 +1475,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1940,13 +1940,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2411,20 +2411,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2887,20 +2887,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3361,12 +3361,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3825,9 +3825,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -4284,12 +4284,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB, - PARTITION part_3 ENGINE = InnoDB, - PARTITION part_4 ENGINE = InnoDB, - PARTITION part_5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB, + PARTITION `part_3` ENGINE = InnoDB, + PARTITION `part_4` ENGINE = InnoDB, + PARTITION `part_5` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -4754,15 +4754,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5225,13 +5225,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5690,13 +5690,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6161,20 +6161,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6637,20 +6637,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7111,12 +7111,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7575,9 +7575,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -8034,12 +8034,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB, - PARTITION part_3 ENGINE = InnoDB, - PARTITION part_4 ENGINE = InnoDB, - PARTITION part_5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB, + PARTITION `part_3` ENGINE = InnoDB, + PARTITION `part_4` ENGINE = InnoDB, + PARTITION `part_5` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -8504,15 +8504,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -8975,13 +8975,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9440,13 +9440,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9911,20 +9911,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10387,20 +10387,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10861,12 +10861,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11325,9 +11325,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11784,12 +11784,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB, - PARTITION part_3 ENGINE = InnoDB, - PARTITION part_4 ENGINE = InnoDB, - PARTITION part_5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB, + PARTITION `part_3` ENGINE = InnoDB, + PARTITION `part_4` ENGINE = InnoDB, + PARTITION `part_5` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -12254,15 +12254,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -12725,13 +12725,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13190,13 +13190,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13661,20 +13661,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14137,20 +14137,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14611,12 +14611,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15075,9 +15075,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15534,12 +15534,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB, - PARTITION part_3 ENGINE = InnoDB, - PARTITION part_4 ENGINE = InnoDB, - PARTITION part_5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB, + PARTITION `part_3` ENGINE = InnoDB, + PARTITION `part_4` ENGINE = InnoDB, + PARTITION `part_5` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -16004,15 +16004,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -16475,13 +16475,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -16940,13 +16940,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -17411,20 +17411,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -17887,20 +17887,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18361,12 +18361,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18828,9 +18828,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19287,12 +19287,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB, - PARTITION part_3 ENGINE = InnoDB, - PARTITION part_4 ENGINE = InnoDB, - PARTITION part_5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB, + PARTITION `part_3` ENGINE = InnoDB, + PARTITION `part_4` ENGINE = InnoDB, + PARTITION `part_5` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19757,15 +19757,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -20228,13 +20228,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -20693,13 +20693,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -21164,20 +21164,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -21640,20 +21640,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -22114,12 +22114,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -22578,9 +22578,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -23037,12 +23037,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB, - PARTITION part_3 ENGINE = InnoDB, - PARTITION part_4 ENGINE = InnoDB, - PARTITION part_5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB, + PARTITION `part_3` ENGINE = InnoDB, + PARTITION `part_4` ENGINE = InnoDB, + PARTITION `part_5` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -23507,15 +23507,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -23978,13 +23978,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -24443,13 +24443,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -24914,20 +24914,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -25390,20 +25390,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -25864,12 +25864,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -26328,9 +26328,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -26787,12 +26787,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB, - PARTITION part_3 ENGINE = InnoDB, - PARTITION part_4 ENGINE = InnoDB, - PARTITION part_5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB, + PARTITION `part_3` ENGINE = InnoDB, + PARTITION `part_4` ENGINE = InnoDB, + PARTITION `part_5` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -27257,15 +27257,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -27728,13 +27728,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -28193,13 +28193,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -28664,20 +28664,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -29140,20 +29140,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -29614,12 +29614,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -30078,9 +30078,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -30537,12 +30537,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB, - PARTITION part_3 ENGINE = InnoDB, - PARTITION part_4 ENGINE = InnoDB, - PARTITION part_5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB, + PARTITION `part_3` ENGINE = InnoDB, + PARTITION `part_4` ENGINE = InnoDB, + PARTITION `part_5` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -31007,15 +31007,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -31478,13 +31478,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -31943,13 +31943,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -32414,20 +32414,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -32890,20 +32890,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -33364,12 +33364,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -33828,9 +33828,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -34287,12 +34287,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB, - PARTITION part_3 ENGINE = InnoDB, - PARTITION part_4 ENGINE = InnoDB, - PARTITION part_5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB, + PARTITION `part_3` ENGINE = InnoDB, + PARTITION `part_4` ENGINE = InnoDB, + PARTITION `part_5` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -34757,15 +34757,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -35228,13 +35228,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -35693,13 +35693,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -36164,20 +36164,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -36640,20 +36640,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -37114,12 +37114,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -37582,9 +37582,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -38042,12 +38042,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB, - PARTITION part_3 ENGINE = InnoDB, - PARTITION part_4 ENGINE = InnoDB, - PARTITION part_5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB, + PARTITION `part_3` ENGINE = InnoDB, + PARTITION `part_4` ENGINE = InnoDB, + PARTITION `part_5` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -38513,15 +38513,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -38985,13 +38985,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -39451,13 +39451,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -39923,20 +39923,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -40400,20 +40400,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -40875,12 +40875,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -41340,9 +41340,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -41800,12 +41800,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB, - PARTITION part_3 ENGINE = InnoDB, - PARTITION part_4 ENGINE = InnoDB, - PARTITION part_5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB, + PARTITION `part_3` ENGINE = InnoDB, + PARTITION `part_4` ENGINE = InnoDB, + PARTITION `part_5` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -42271,15 +42271,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -42743,13 +42743,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -43209,13 +43209,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -43681,20 +43681,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -44158,20 +44158,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -44633,12 +44633,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -45097,9 +45097,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -45556,12 +45556,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB, - PARTITION part_3 ENGINE = InnoDB, - PARTITION part_4 ENGINE = InnoDB, - PARTITION part_5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB, + PARTITION `part_3` ENGINE = InnoDB, + PARTITION `part_4` ENGINE = InnoDB, + PARTITION `part_5` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -46026,15 +46026,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -46497,13 +46497,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -46962,13 +46962,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -47433,20 +47433,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -47909,20 +47909,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -48383,12 +48383,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -48847,9 +48847,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -49306,12 +49306,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB, - PARTITION part_3 ENGINE = InnoDB, - PARTITION part_4 ENGINE = InnoDB, - PARTITION part_5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB, + PARTITION `part_3` ENGINE = InnoDB, + PARTITION `part_4` ENGINE = InnoDB, + PARTITION `part_5` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -49776,15 +49776,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -50247,13 +50247,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -50712,13 +50712,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -51183,20 +51183,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -51659,20 +51659,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -52133,12 +52133,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -52598,9 +52598,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -53058,12 +53058,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB, - PARTITION part_3 ENGINE = InnoDB, - PARTITION part_4 ENGINE = InnoDB, - PARTITION part_5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB, + PARTITION `part_3` ENGINE = InnoDB, + PARTITION `part_4` ENGINE = InnoDB, + PARTITION `part_5` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -53529,15 +53529,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -54001,13 +54001,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -54467,13 +54467,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -54939,20 +54939,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -55416,20 +55416,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -55891,12 +55891,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -56356,9 +56356,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -56813,12 +56813,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB, - PARTITION part_3 ENGINE = InnoDB, - PARTITION part_4 ENGINE = InnoDB, - PARTITION part_5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB, + PARTITION `part_3` ENGINE = InnoDB, + PARTITION `part_4` ENGINE = InnoDB, + PARTITION `part_5` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -57281,15 +57281,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -57750,13 +57750,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -58213,13 +58213,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -58682,20 +58682,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -59156,20 +59156,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -59628,12 +59628,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -60090,9 +60090,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -60547,12 +60547,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB, - PARTITION part_3 ENGINE = InnoDB, - PARTITION part_4 ENGINE = InnoDB, - PARTITION part_5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB, + PARTITION `part_3` ENGINE = InnoDB, + PARTITION `part_4` ENGINE = InnoDB, + PARTITION `part_5` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -61015,15 +61015,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -61484,13 +61484,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -61947,13 +61947,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -62416,20 +62416,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -62890,20 +62890,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -63362,12 +63362,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -64144,9 +64144,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -64601,12 +64601,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB, - PARTITION part_3 ENGINE = InnoDB, - PARTITION part_4 ENGINE = InnoDB, - PARTITION part_5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB, + PARTITION `part_3` ENGINE = InnoDB, + PARTITION `part_4` ENGINE = InnoDB, + PARTITION `part_5` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -65069,15 +65069,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -65538,13 +65538,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -66001,13 +66001,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -66470,20 +66470,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -66944,20 +66944,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -67416,12 +67416,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -67883,9 +67883,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -68342,12 +68342,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB, - PARTITION part_3 ENGINE = InnoDB, - PARTITION part_4 ENGINE = InnoDB, - PARTITION part_5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB, + PARTITION `part_3` ENGINE = InnoDB, + PARTITION `part_4` ENGINE = InnoDB, + PARTITION `part_5` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -68812,15 +68812,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -69283,13 +69283,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -69748,13 +69748,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -70219,20 +70219,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -70695,20 +70695,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -71169,12 +71169,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -71633,9 +71633,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -72092,12 +72092,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB, - PARTITION part_3 ENGINE = InnoDB, - PARTITION part_4 ENGINE = InnoDB, - PARTITION part_5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB, + PARTITION `part_3` ENGINE = InnoDB, + PARTITION `part_4` ENGINE = InnoDB, + PARTITION `part_5` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -72562,15 +72562,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -73033,13 +73033,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -73498,13 +73498,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -73969,20 +73969,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -74445,20 +74445,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -74919,12 +74919,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -75383,9 +75383,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -75842,12 +75842,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB, - PARTITION part_3 ENGINE = InnoDB, - PARTITION part_4 ENGINE = InnoDB, - PARTITION part_5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB, + PARTITION `part_3` ENGINE = InnoDB, + PARTITION `part_4` ENGINE = InnoDB, + PARTITION `part_5` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -76312,15 +76312,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -76783,13 +76783,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -77248,13 +77248,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -77719,20 +77719,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -78195,20 +78195,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -78669,12 +78669,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -79133,9 +79133,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -79592,12 +79592,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB, - PARTITION part_3 ENGINE = InnoDB, - PARTITION part_4 ENGINE = InnoDB, - PARTITION part_5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB, + PARTITION `part_3` ENGINE = InnoDB, + PARTITION `part_4` ENGINE = InnoDB, + PARTITION `part_5` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -80062,15 +80062,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -80533,13 +80533,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -80998,13 +80998,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -81469,20 +81469,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -81945,20 +81945,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -82419,12 +82419,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -82883,9 +82883,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -83342,12 +83342,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = InnoDB, - PARTITION part_2 ENGINE = InnoDB, - PARTITION part_3 ENGINE = InnoDB, - PARTITION part_4 ENGINE = InnoDB, - PARTITION part_5 ENGINE = InnoDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = InnoDB, + PARTITION `part_2` ENGINE = InnoDB, + PARTITION `part_3` ENGINE = InnoDB, + PARTITION `part_4` ENGINE = InnoDB, + PARTITION `part_5` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -83812,15 +83812,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -84283,13 +84283,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -84748,13 +84748,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -85219,20 +85219,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -85695,20 +85695,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -86169,12 +86169,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 diff --git a/mysql-test/suite/parts/r/partition_alter4_myisam.result b/mysql-test/suite/parts/r/partition_alter4_myisam.result index a4f7c05345f..326c3bb8a80 100644 --- a/mysql-test/suite/parts/r/partition_alter4_myisam.result +++ b/mysql-test/suite/parts/r/partition_alter4_myisam.result @@ -75,9 +75,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -543,12 +543,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM, - PARTITION part_3 ENGINE = MyISAM, - PARTITION part_4 ENGINE = MyISAM, - PARTITION part_5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM, + PARTITION `part_3` ENGINE = MyISAM, + PARTITION `part_4` ENGINE = MyISAM, + PARTITION `part_5` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -1028,15 +1028,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -1520,13 +1520,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -2002,13 +2002,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -2494,20 +2494,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#subpart11.MYD @@ -2991,20 +2991,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#sp11.MYD @@ -3486,12 +3486,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part_3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part_1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part_3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -3973,9 +3973,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -4441,12 +4441,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM, - PARTITION part_3 ENGINE = MyISAM, - PARTITION part_4 ENGINE = MyISAM, - PARTITION part_5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM, + PARTITION `part_3` ENGINE = MyISAM, + PARTITION `part_4` ENGINE = MyISAM, + PARTITION `part_5` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -4926,15 +4926,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -5418,13 +5418,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -5900,13 +5900,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -6392,20 +6392,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#subpart11.MYD @@ -6889,20 +6889,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#sp11.MYD @@ -7384,12 +7384,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part_3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part_1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part_3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -7871,9 +7871,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -8339,12 +8339,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM, - PARTITION part_3 ENGINE = MyISAM, - PARTITION part_4 ENGINE = MyISAM, - PARTITION part_5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM, + PARTITION `part_3` ENGINE = MyISAM, + PARTITION `part_4` ENGINE = MyISAM, + PARTITION `part_5` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -8824,15 +8824,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -9316,13 +9316,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -9798,13 +9798,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -10290,20 +10290,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#subpart11.MYD @@ -10787,20 +10787,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#sp11.MYD @@ -11282,12 +11282,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part_3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part_1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part_3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -11769,9 +11769,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -12237,12 +12237,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM, - PARTITION part_3 ENGINE = MyISAM, - PARTITION part_4 ENGINE = MyISAM, - PARTITION part_5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM, + PARTITION `part_3` ENGINE = MyISAM, + PARTITION `part_4` ENGINE = MyISAM, + PARTITION `part_5` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -12722,15 +12722,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -13214,13 +13214,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -13696,13 +13696,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -14188,20 +14188,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#subpart11.MYD @@ -14685,20 +14685,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#sp11.MYD @@ -15180,12 +15180,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part_3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part_1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part_3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -15667,9 +15667,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -16135,12 +16135,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM, - PARTITION part_3 ENGINE = MyISAM, - PARTITION part_4 ENGINE = MyISAM, - PARTITION part_5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM, + PARTITION `part_3` ENGINE = MyISAM, + PARTITION `part_4` ENGINE = MyISAM, + PARTITION `part_5` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -16620,15 +16620,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -17112,13 +17112,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -17594,13 +17594,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -18086,20 +18086,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#subpart11.MYD @@ -18583,20 +18583,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#sp11.MYD @@ -19078,12 +19078,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part_3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part_1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part_3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -19568,9 +19568,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -20036,12 +20036,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM, - PARTITION part_3 ENGINE = MyISAM, - PARTITION part_4 ENGINE = MyISAM, - PARTITION part_5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM, + PARTITION `part_3` ENGINE = MyISAM, + PARTITION `part_4` ENGINE = MyISAM, + PARTITION `part_5` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -20521,15 +20521,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -21013,13 +21013,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -21495,13 +21495,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -21987,20 +21987,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#subpart11.MYD @@ -22484,20 +22484,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#sp11.MYD @@ -22979,12 +22979,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part_3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part_1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part_3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -23466,9 +23466,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -23934,12 +23934,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM, - PARTITION part_3 ENGINE = MyISAM, - PARTITION part_4 ENGINE = MyISAM, - PARTITION part_5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM, + PARTITION `part_3` ENGINE = MyISAM, + PARTITION `part_4` ENGINE = MyISAM, + PARTITION `part_5` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -24419,15 +24419,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -24911,13 +24911,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -25393,13 +25393,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -25885,20 +25885,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#subpart11.MYD @@ -26382,20 +26382,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#sp11.MYD @@ -26877,12 +26877,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part_3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part_1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part_3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -27364,9 +27364,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -27832,12 +27832,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM, - PARTITION part_3 ENGINE = MyISAM, - PARTITION part_4 ENGINE = MyISAM, - PARTITION part_5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM, + PARTITION `part_3` ENGINE = MyISAM, + PARTITION `part_4` ENGINE = MyISAM, + PARTITION `part_5` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -28317,15 +28317,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -28809,13 +28809,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -29291,13 +29291,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -29783,20 +29783,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#subpart11.MYD @@ -30280,20 +30280,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#sp11.MYD @@ -30775,12 +30775,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part_3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part_1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part_3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -31262,9 +31262,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -31730,12 +31730,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM, - PARTITION part_3 ENGINE = MyISAM, - PARTITION part_4 ENGINE = MyISAM, - PARTITION part_5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM, + PARTITION `part_3` ENGINE = MyISAM, + PARTITION `part_4` ENGINE = MyISAM, + PARTITION `part_5` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -32215,15 +32215,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -32707,13 +32707,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -33189,13 +33189,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -33681,20 +33681,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#subpart11.MYD @@ -34178,20 +34178,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#sp11.MYD @@ -34673,12 +34673,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part_3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part_1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part_3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -35160,9 +35160,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -35628,12 +35628,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM, - PARTITION part_3 ENGINE = MyISAM, - PARTITION part_4 ENGINE = MyISAM, - PARTITION part_5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM, + PARTITION `part_3` ENGINE = MyISAM, + PARTITION `part_4` ENGINE = MyISAM, + PARTITION `part_5` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -36113,15 +36113,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -36605,13 +36605,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -37087,13 +37087,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -37579,20 +37579,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#subpart11.MYD @@ -38076,20 +38076,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#sp11.MYD @@ -38571,12 +38571,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part_3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part_1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part_3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -39061,9 +39061,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -39529,12 +39529,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM, - PARTITION part_3 ENGINE = MyISAM, - PARTITION part_4 ENGINE = MyISAM, - PARTITION part_5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM, + PARTITION `part_3` ENGINE = MyISAM, + PARTITION `part_4` ENGINE = MyISAM, + PARTITION `part_5` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -40014,15 +40014,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -40506,13 +40506,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -40988,13 +40988,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -41480,20 +41480,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#subpart11.MYD @@ -41977,20 +41977,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#sp11.MYD @@ -42472,12 +42472,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part_3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part_1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part_3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -42959,9 +42959,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -43427,12 +43427,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM, - PARTITION part_3 ENGINE = MyISAM, - PARTITION part_4 ENGINE = MyISAM, - PARTITION part_5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM, + PARTITION `part_3` ENGINE = MyISAM, + PARTITION `part_4` ENGINE = MyISAM, + PARTITION `part_5` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -43912,15 +43912,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -44404,13 +44404,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -44886,13 +44886,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -45378,20 +45378,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#subpart11.MYD @@ -45875,20 +45875,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#sp11.MYD @@ -46370,12 +46370,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part_3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part_1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part_3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -46857,9 +46857,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -47325,12 +47325,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM, - PARTITION part_3 ENGINE = MyISAM, - PARTITION part_4 ENGINE = MyISAM, - PARTITION part_5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM, + PARTITION `part_3` ENGINE = MyISAM, + PARTITION `part_4` ENGINE = MyISAM, + PARTITION `part_5` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -47810,15 +47810,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -48302,13 +48302,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -48784,13 +48784,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -49276,20 +49276,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#subpart11.MYD @@ -49773,20 +49773,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#sp11.MYD @@ -50268,12 +50268,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part_3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part_1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part_3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -50755,9 +50755,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -51223,12 +51223,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM, - PARTITION part_3 ENGINE = MyISAM, - PARTITION part_4 ENGINE = MyISAM, - PARTITION part_5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM, + PARTITION `part_3` ENGINE = MyISAM, + PARTITION `part_4` ENGINE = MyISAM, + PARTITION `part_5` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -51708,15 +51708,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -52200,13 +52200,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -52682,13 +52682,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -53174,20 +53174,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#subpart11.MYD @@ -53671,20 +53671,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#sp11.MYD @@ -54166,12 +54166,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part_3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part_1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part_3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -54653,9 +54653,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -55121,12 +55121,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM, - PARTITION part_3 ENGINE = MyISAM, - PARTITION part_4 ENGINE = MyISAM, - PARTITION part_5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM, + PARTITION `part_3` ENGINE = MyISAM, + PARTITION `part_4` ENGINE = MyISAM, + PARTITION `part_5` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -55606,15 +55606,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -56098,13 +56098,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -56580,13 +56580,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -57072,20 +57072,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#subpart11.MYD @@ -57569,20 +57569,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#sp11.MYD @@ -58064,12 +58064,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part_3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part_1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part_3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -58552,9 +58552,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -59018,12 +59018,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM, - PARTITION part_3 ENGINE = MyISAM, - PARTITION part_4 ENGINE = MyISAM, - PARTITION part_5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM, + PARTITION `part_3` ENGINE = MyISAM, + PARTITION `part_4` ENGINE = MyISAM, + PARTITION `part_5` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -59501,15 +59501,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -59991,13 +59991,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -60471,13 +60471,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -60961,20 +60961,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#subpart11.MYD @@ -61456,20 +61456,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#sp11.MYD @@ -61949,12 +61949,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part_3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part_1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part_3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -62434,9 +62434,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -62900,12 +62900,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM, - PARTITION part_3 ENGINE = MyISAM, - PARTITION part_4 ENGINE = MyISAM, - PARTITION part_5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM, + PARTITION `part_3` ENGINE = MyISAM, + PARTITION `part_4` ENGINE = MyISAM, + PARTITION `part_5` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -63383,15 +63383,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -63873,13 +63873,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -64353,13 +64353,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -64843,20 +64843,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#subpart11.MYD @@ -65338,20 +65338,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#sp11.MYD @@ -65831,12 +65831,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part_3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part_1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part_3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -66636,9 +66636,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -67102,12 +67102,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM, - PARTITION part_3 ENGINE = MyISAM, - PARTITION part_4 ENGINE = MyISAM, - PARTITION part_5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM, + PARTITION `part_3` ENGINE = MyISAM, + PARTITION `part_4` ENGINE = MyISAM, + PARTITION `part_5` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -67585,15 +67585,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -68075,13 +68075,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -68555,13 +68555,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -69045,20 +69045,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#subpart11.MYD @@ -69540,20 +69540,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#sp11.MYD @@ -70033,12 +70033,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part_3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part_1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part_3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -70523,9 +70523,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -70991,12 +70991,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM, - PARTITION part_3 ENGINE = MyISAM, - PARTITION part_4 ENGINE = MyISAM, - PARTITION part_5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM, + PARTITION `part_3` ENGINE = MyISAM, + PARTITION `part_4` ENGINE = MyISAM, + PARTITION `part_5` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -71476,15 +71476,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -71968,13 +71968,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -72450,13 +72450,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -72942,20 +72942,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#subpart11.MYD @@ -73439,20 +73439,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#sp11.MYD @@ -73934,12 +73934,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part_3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part_1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part_3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -74421,9 +74421,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -74889,12 +74889,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM, - PARTITION part_3 ENGINE = MyISAM, - PARTITION part_4 ENGINE = MyISAM, - PARTITION part_5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM, + PARTITION `part_3` ENGINE = MyISAM, + PARTITION `part_4` ENGINE = MyISAM, + PARTITION `part_5` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -75374,15 +75374,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -75866,13 +75866,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -76348,13 +76348,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -76840,20 +76840,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#subpart11.MYD @@ -77337,20 +77337,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#sp11.MYD @@ -77832,12 +77832,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part_3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part_1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part_3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -78319,9 +78319,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -78787,12 +78787,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM, - PARTITION part_3 ENGINE = MyISAM, - PARTITION part_4 ENGINE = MyISAM, - PARTITION part_5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM, + PARTITION `part_3` ENGINE = MyISAM, + PARTITION `part_4` ENGINE = MyISAM, + PARTITION `part_5` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -79272,15 +79272,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -79764,13 +79764,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -80246,13 +80246,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -80738,20 +80738,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#subpart11.MYD @@ -81235,20 +81235,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#sp11.MYD @@ -81730,12 +81730,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part_3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part_1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part_3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -82217,9 +82217,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -82685,12 +82685,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM, - PARTITION part_3 ENGINE = MyISAM, - PARTITION part_4 ENGINE = MyISAM, - PARTITION part_5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM, + PARTITION `part_3` ENGINE = MyISAM, + PARTITION `part_4` ENGINE = MyISAM, + PARTITION `part_5` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -83170,15 +83170,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -83662,13 +83662,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -84144,13 +84144,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -84636,20 +84636,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#subpart11.MYD @@ -85133,20 +85133,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#sp11.MYD @@ -85628,12 +85628,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part_3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part_1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part_3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -86115,9 +86115,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -86583,12 +86583,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = MyISAM, - PARTITION part_2 ENGINE = MyISAM, - PARTITION part_3 ENGINE = MyISAM, - PARTITION part_4 ENGINE = MyISAM, - PARTITION part_5 ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = MyISAM, + PARTITION `part_2` ENGINE = MyISAM, + PARTITION `part_3` ENGINE = MyISAM, + PARTITION `part_4` ENGINE = MyISAM, + PARTITION `part_5` ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -87068,15 +87068,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -87560,13 +87560,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1.MYD @@ -88042,13 +88042,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD @@ -88534,20 +88534,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#subpart11.MYD @@ -89031,20 +89031,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part_1#SP#sp11.MYD @@ -89526,12 +89526,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part_3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part_1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part_3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part_1#SP#part_1sp0.MYD diff --git a/mysql-test/suite/parts/r/partition_auto_increment_archive.result b/mysql-test/suite/parts/r/partition_auto_increment_archive.result index 7497e7d9cea..b600b45e8ef 100644 --- a/mysql-test/suite/parts/r/partition_auto_increment_archive.result +++ b/mysql-test/suite/parts/r/partition_auto_increment_archive.result @@ -135,7 +135,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=ARCHIVE AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1; c1 @@ -341,7 +341,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=ARCHIVE AUTO_INCREMENT=27 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -365,7 +365,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=ARCHIVE AUTO_INCREMENT=28 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -394,7 +394,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=ARCHIVE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; # Test with two threads @@ -646,7 +646,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=ARCHIVE AUTO_INCREMENT=15 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (4); # ERROR (only OK if Archive) mysql_errno: 1022 @@ -656,7 +656,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=ARCHIVE AUTO_INCREMENT=15 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (0); SHOW CREATE TABLE t1; @@ -665,7 +665,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=ARCHIVE AUTO_INCREMENT=16 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -674,7 +674,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=ARCHIVE AUTO_INCREMENT=17 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -689,7 +689,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=ARCHIVE AUTO_INCREMENT=301 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (0); # ERROR (only OK if Archive) mysql_errno: 1022 @@ -699,7 +699,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=ARCHIVE AUTO_INCREMENT=301 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -708,7 +708,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=ARCHIVE AUTO_INCREMENT=302 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -729,7 +729,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=ARCHIVE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -738,7 +738,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=ARCHIVE AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1; c1 @@ -750,7 +750,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=ARCHIVE AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -759,7 +759,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=ARCHIVE AUTO_INCREMENT=24 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SET INSERT_ID = 22; INSERT INTO t1 VALUES (NULL), (NULL), (NULL); @@ -784,7 +784,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=ARCHIVE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 FLUSH TABLE; SHOW CREATE TABLE t1; @@ -793,7 +793,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=ARCHIVE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 VALUES (4); FLUSH TABLE; @@ -803,7 +803,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=ARCHIVE AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 VALUES (NULL); FLUSH TABLE; @@ -813,7 +813,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=ARCHIVE AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 diff --git a/mysql-test/suite/parts/r/partition_auto_increment_blackhole.result b/mysql-test/suite/parts/r/partition_auto_increment_blackhole.result index 639748e7977..0276385dc29 100644 --- a/mysql-test/suite/parts/r/partition_auto_increment_blackhole.result +++ b/mysql-test/suite/parts/r/partition_auto_increment_blackhole.result @@ -166,7 +166,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=BLACKHOLE AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1; c1 @@ -324,7 +324,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=BLACKHOLE AUTO_INCREMENT=27 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -336,7 +336,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=BLACKHOLE AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -352,7 +352,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=BLACKHOLE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; # Test with two threads @@ -534,7 +534,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=BLACKHOLE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (4); SHOW CREATE TABLE t1; @@ -543,7 +543,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=BLACKHOLE AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (0); SHOW CREATE TABLE t1; @@ -552,7 +552,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=BLACKHOLE AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -561,7 +561,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=BLACKHOLE AUTO_INCREMENT=7 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -574,7 +574,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=BLACKHOLE AUTO_INCREMENT=301 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (0); SHOW CREATE TABLE t1; @@ -583,7 +583,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=BLACKHOLE AUTO_INCREMENT=301 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -592,7 +592,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=BLACKHOLE AUTO_INCREMENT=302 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -609,7 +609,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=BLACKHOLE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -618,7 +618,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=BLACKHOLE AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1; c1 @@ -629,7 +629,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=BLACKHOLE AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -638,7 +638,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=BLACKHOLE AUTO_INCREMENT=24 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SET INSERT_ID = 22; INSERT INTO t1 VALUES (NULL), (NULL), (NULL); @@ -661,7 +661,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=BLACKHOLE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 FLUSH TABLE; SHOW CREATE TABLE t1; @@ -670,7 +670,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=BLACKHOLE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 VALUES (4); FLUSH TABLE; @@ -680,7 +680,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=BLACKHOLE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 VALUES (NULL); FLUSH TABLE; @@ -690,7 +690,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=BLACKHOLE DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 diff --git a/mysql-test/suite/parts/r/partition_auto_increment_innodb.result b/mysql-test/suite/parts/r/partition_auto_increment_innodb.result index a6af2b924c0..6250f28eb00 100644 --- a/mysql-test/suite/parts/r/partition_auto_increment_innodb.result +++ b/mysql-test/suite/parts/r/partition_auto_increment_innodb.result @@ -186,7 +186,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1; c1 @@ -410,7 +410,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -423,7 +423,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -441,7 +441,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=102 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; # Test with two threads @@ -701,7 +701,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (4); SHOW CREATE TABLE t1; @@ -710,7 +710,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (0); SHOW CREATE TABLE t1; @@ -719,7 +719,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -728,7 +728,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -744,7 +744,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=301 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (0); SHOW CREATE TABLE t1; @@ -753,7 +753,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=301 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -762,7 +762,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=302 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -785,7 +785,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -794,7 +794,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1; c1 @@ -806,7 +806,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -815,7 +815,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SET INSERT_ID = 22; INSERT INTO t1 VALUES (NULL), (NULL), (NULL); @@ -839,7 +839,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 FLUSH TABLE; SHOW CREATE TABLE t1; @@ -848,7 +848,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 VALUES (4); FLUSH TABLE; @@ -858,7 +858,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 VALUES (NULL); FLUSH TABLE; @@ -868,7 +868,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 diff --git a/mysql-test/suite/parts/r/partition_auto_increment_maria.result b/mysql-test/suite/parts/r/partition_auto_increment_maria.result index 6fdbdeb2653..5acce3e9492 100644 --- a/mysql-test/suite/parts/r/partition_auto_increment_maria.result +++ b/mysql-test/suite/parts/r/partition_auto_increment_maria.result @@ -186,7 +186,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=Aria AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1; c1 @@ -410,7 +410,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=Aria AUTO_INCREMENT=27 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -423,7 +423,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=Aria AUTO_INCREMENT=28 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -440,7 +440,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=Aria AUTO_INCREMENT=102 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; # Test with two threads @@ -747,7 +747,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=Aria AUTO_INCREMENT=15 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (4); SHOW CREATE TABLE t1; @@ -756,7 +756,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=Aria AUTO_INCREMENT=15 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (0); SHOW CREATE TABLE t1; @@ -765,7 +765,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=Aria AUTO_INCREMENT=16 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -774,7 +774,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=Aria AUTO_INCREMENT=17 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -790,7 +790,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=Aria AUTO_INCREMENT=301 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (0); SHOW CREATE TABLE t1; @@ -799,7 +799,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=Aria AUTO_INCREMENT=301 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -808,7 +808,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=Aria AUTO_INCREMENT=302 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -831,7 +831,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -840,7 +840,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=Aria AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1; c1 @@ -852,7 +852,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=Aria AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -861,7 +861,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=Aria AUTO_INCREMENT=24 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SET INSERT_ID = 22; INSERT INTO t1 VALUES (NULL), (NULL), (NULL); @@ -886,7 +886,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 FLUSH TABLE; SHOW CREATE TABLE t1; @@ -895,7 +895,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=Aria DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 VALUES (4); FLUSH TABLE; @@ -905,7 +905,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=Aria AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 VALUES (NULL); FLUSH TABLE; @@ -915,7 +915,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=Aria AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 diff --git a/mysql-test/suite/parts/r/partition_auto_increment_memory.result b/mysql-test/suite/parts/r/partition_auto_increment_memory.result index 62ab0c1ca51..e622ddaa259 100644 --- a/mysql-test/suite/parts/r/partition_auto_increment_memory.result +++ b/mysql-test/suite/parts/r/partition_auto_increment_memory.result @@ -186,7 +186,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MEMORY AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1; c1 @@ -410,7 +410,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MEMORY AUTO_INCREMENT=27 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -423,7 +423,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MEMORY AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -440,7 +440,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MEMORY AUTO_INCREMENT=102 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; # Test with two threads @@ -728,7 +728,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MEMORY AUTO_INCREMENT=15 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (4); SHOW CREATE TABLE t1; @@ -737,7 +737,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MEMORY AUTO_INCREMENT=15 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (0); SHOW CREATE TABLE t1; @@ -746,7 +746,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MEMORY AUTO_INCREMENT=16 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -755,7 +755,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MEMORY AUTO_INCREMENT=17 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -771,7 +771,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MEMORY AUTO_INCREMENT=301 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (0); SHOW CREATE TABLE t1; @@ -780,7 +780,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MEMORY AUTO_INCREMENT=301 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -789,7 +789,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MEMORY AUTO_INCREMENT=302 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -812,7 +812,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -821,7 +821,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MEMORY AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1; c1 @@ -833,7 +833,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MEMORY AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -842,7 +842,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MEMORY AUTO_INCREMENT=24 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SET INSERT_ID = 22; INSERT INTO t1 VALUES (NULL), (NULL), (NULL); @@ -867,7 +867,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 FLUSH TABLE; SHOW CREATE TABLE t1; @@ -876,7 +876,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 VALUES (4); FLUSH TABLE; @@ -886,7 +886,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MEMORY AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 VALUES (NULL); FLUSH TABLE; @@ -896,7 +896,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MEMORY AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 diff --git a/mysql-test/suite/parts/r/partition_auto_increment_myisam.result b/mysql-test/suite/parts/r/partition_auto_increment_myisam.result index 27cf857abb0..4e67094b327 100644 --- a/mysql-test/suite/parts/r/partition_auto_increment_myisam.result +++ b/mysql-test/suite/parts/r/partition_auto_increment_myisam.result @@ -186,7 +186,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1; c1 @@ -410,7 +410,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MyISAM AUTO_INCREMENT=27 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -423,7 +423,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -440,7 +440,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MyISAM AUTO_INCREMENT=102 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; # Test with two threads @@ -747,7 +747,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (4); SHOW CREATE TABLE t1; @@ -756,7 +756,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (0); SHOW CREATE TABLE t1; @@ -765,7 +765,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -774,7 +774,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MyISAM AUTO_INCREMENT=17 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -790,7 +790,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MyISAM AUTO_INCREMENT=301 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (0); SHOW CREATE TABLE t1; @@ -799,7 +799,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MyISAM AUTO_INCREMENT=301 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -808,7 +808,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MyISAM AUTO_INCREMENT=302 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -831,7 +831,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -840,7 +840,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1; c1 @@ -852,7 +852,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -861,7 +861,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MyISAM AUTO_INCREMENT=24 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SET INSERT_ID = 22; INSERT INTO t1 VALUES (NULL), (NULL), (NULL); @@ -886,7 +886,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 FLUSH TABLE; SHOW CREATE TABLE t1; @@ -895,7 +895,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 VALUES (4); FLUSH TABLE; @@ -905,7 +905,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 VALUES (NULL); FLUSH TABLE; @@ -915,7 +915,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 diff --git a/mysql-test/suite/parts/r/partition_basic_innodb.result b/mysql-test/suite/parts/r/partition_basic_innodb.result index d8872e16d5e..edaeefe45b3 100644 --- a/mysql-test/suite/parts/r/partition_basic_innodb.result +++ b/mysql-test/suite/parts/r/partition_basic_innodb.result @@ -73,7 +73,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -530,7 +530,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -998,15 +998,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) unified filelist t1#P#part0.ibd @@ -1474,13 +1474,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) unified filelist t1#P#parta.ibd @@ -1942,13 +1942,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) unified filelist t1#P#parta#SP#partasp0.ibd @@ -2418,20 +2418,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) unified filelist t1#P#part1#SP#subpart11.ibd @@ -2903,20 +2903,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) unified filelist t1#P#part1#SP#sp11.ibd @@ -3382,12 +3382,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) unified filelist t1#P#part1#SP#part1sp0.ibd @@ -3852,7 +3852,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -4309,7 +4309,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -4777,15 +4777,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) unified filelist t1#P#part0.ibd @@ -5253,13 +5253,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) unified filelist t1#P#parta.ibd @@ -5721,13 +5721,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) unified filelist t1#P#parta#SP#partasp0.ibd @@ -6195,20 +6195,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) unified filelist t1#P#part1#SP#subpart11.ibd @@ -6676,20 +6676,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) unified filelist t1#P#part1#SP#sp11.ibd @@ -7155,12 +7155,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) unified filelist t1#P#part1#SP#part1sp0.ibd @@ -7631,7 +7631,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -8125,7 +8125,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -8630,15 +8630,15 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) unified filelist t1#P#part0.ibd @@ -9143,13 +9143,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) unified filelist t1#P#parta.ibd @@ -9648,13 +9648,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) unified filelist t1#P#parta#SP#partasp0.ibd @@ -10161,20 +10161,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) unified filelist t1#P#part1#SP#subpart11.ibd @@ -10683,20 +10683,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) unified filelist t1#P#part1#SP#sp11.ibd @@ -11199,12 +11199,12 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) unified filelist t1#P#part1#SP#part1sp0.ibd @@ -11705,7 +11705,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -12199,7 +12199,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -12704,15 +12704,15 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) unified filelist t1#P#part0.ibd @@ -13217,13 +13217,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) unified filelist t1#P#parta.ibd @@ -13722,13 +13722,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) unified filelist t1#P#parta#SP#partasp0.ibd @@ -14235,20 +14235,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) unified filelist t1#P#part1#SP#subpart11.ibd @@ -14757,20 +14757,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) unified filelist t1#P#part1#SP#sp11.ibd @@ -15273,12 +15273,12 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) unified filelist t1#P#part1#SP#part1sp0.ibd @@ -15779,7 +15779,7 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -16289,7 +16289,7 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -16810,15 +16810,15 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) unified filelist t1#P#part0.ibd @@ -17339,13 +17339,13 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) unified filelist t1#P#parta.ibd @@ -17860,13 +17860,13 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) unified filelist t1#P#parta#SP#partasp0.ibd @@ -18389,20 +18389,20 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) unified filelist t1#P#part1#SP#subpart11.ibd @@ -18927,20 +18927,20 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) unified filelist t1#P#part1#SP#sp11.ibd @@ -19459,12 +19459,12 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) unified filelist t1#P#part1#SP#part1sp0.ibd @@ -19986,7 +19986,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -20480,7 +20480,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -20985,15 +20985,15 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) unified filelist t1#P#part0.ibd @@ -21498,13 +21498,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) unified filelist t1#P#parta.ibd @@ -22003,13 +22003,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) unified filelist t1#P#parta#SP#partasp0.ibd @@ -22514,20 +22514,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) unified filelist t1#P#part1#SP#subpart11.ibd @@ -23032,20 +23032,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) unified filelist t1#P#part1#SP#sp11.ibd @@ -23548,12 +23548,12 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) unified filelist t1#P#part1#SP#part1sp0.ibd @@ -24054,7 +24054,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -24548,7 +24548,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -25053,15 +25053,15 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) unified filelist t1#P#part0.ibd @@ -25566,13 +25566,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) unified filelist t1#P#parta.ibd @@ -26071,13 +26071,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) unified filelist t1#P#parta#SP#partasp0.ibd @@ -26582,20 +26582,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) unified filelist t1#P#part1#SP#subpart11.ibd @@ -27100,20 +27100,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) unified filelist t1#P#part1#SP#sp11.ibd @@ -27616,12 +27616,12 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) unified filelist t1#P#part1#SP#part1sp0.ibd @@ -28122,7 +28122,7 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -28632,7 +28632,7 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -29153,15 +29153,15 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = InnoDB, - PARTITION part_2 VALUES IN (-2) ENGINE = InnoDB, - PARTITION part_1 VALUES IN (-1) ENGINE = InnoDB, - PARTITION part_N VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part0 VALUES IN (0) ENGINE = InnoDB, - PARTITION part1 VALUES IN (1) ENGINE = InnoDB, - PARTITION part2 VALUES IN (2) ENGINE = InnoDB, - PARTITION part3 VALUES IN (3) ENGINE = InnoDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = InnoDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = InnoDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = InnoDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part1` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (2) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (3) ENGINE = InnoDB) unified filelist t1#P#part0.ibd @@ -29682,13 +29682,13 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = InnoDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = InnoDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = InnoDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = InnoDB) unified filelist t1#P#parta.ibd @@ -30203,13 +30203,13 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = InnoDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = InnoDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = InnoDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = InnoDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = InnoDB) unified filelist t1#P#parta#SP#partasp0.ibd @@ -30730,20 +30730,20 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = InnoDB, - SUBPARTITION subpart42 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = InnoDB, + SUBPARTITION `subpart42` ENGINE = InnoDB)) unified filelist t1#P#part1#SP#subpart11.ibd @@ -31264,20 +31264,20 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = InnoDB, - SUBPARTITION sp12 ENGINE = InnoDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = InnoDB, - SUBPARTITION sp22 ENGINE = InnoDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = InnoDB, - SUBPARTITION sp32 ENGINE = InnoDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = InnoDB, - SUBPARTITION sp42 ENGINE = InnoDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = InnoDB, + SUBPARTITION `sp12` ENGINE = InnoDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = InnoDB, + SUBPARTITION `sp22` ENGINE = InnoDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = InnoDB, + SUBPARTITION `sp32` ENGINE = InnoDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = InnoDB, + SUBPARTITION `sp42` ENGINE = InnoDB)) unified filelist t1#P#part1#SP#sp11.ibd @@ -31796,12 +31796,12 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = InnoDB, - PARTITION part2 VALUES IN (1) ENGINE = InnoDB, - PARTITION part3 VALUES IN (NULL) ENGINE = InnoDB) +(PARTITION `part1` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (1) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = InnoDB) unified filelist t1#P#part1#SP#part1sp0.ibd diff --git a/mysql-test/suite/parts/r/partition_basic_myisam.result b/mysql-test/suite/parts/r/partition_basic_myisam.result index 69799a07076..e32cd4394ad 100644 --- a/mysql-test/suite/parts/r/partition_basic_myisam.result +++ b/mysql-test/suite/parts/r/partition_basic_myisam.result @@ -73,7 +73,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -533,7 +533,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -1007,15 +1007,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -1492,13 +1492,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -1967,13 +1967,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -2452,20 +2452,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -2946,20 +2946,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -3434,12 +3434,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -3914,7 +3914,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -4374,7 +4374,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -4848,15 +4848,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -5333,13 +5333,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -5808,13 +5808,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -6291,20 +6291,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -6781,20 +6781,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -7269,12 +7269,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -7755,7 +7755,7 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -8268,7 +8268,7 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -8795,15 +8795,15 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -9333,13 +9333,13 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -9861,13 +9861,13 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -10399,20 +10399,20 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -10946,20 +10946,20 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -11487,12 +11487,12 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -12024,7 +12024,7 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -12537,7 +12537,7 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -13064,15 +13064,15 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) ENGINE = MyISAM) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -13602,13 +13602,13 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = MyISAM) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -14130,13 +14130,13 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -14666,20 +14666,20 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -15209,20 +15209,20 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = MyISAM, - SUBPARTITION sp12 ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = MyISAM, - SUBPARTITION sp22 ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = MyISAM, - SUBPARTITION sp32 ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = MyISAM, - SUBPARTITION sp42 ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = MyISAM, + SUBPARTITION `sp12` ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = MyISAM, + SUBPARTITION `sp22` ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = MyISAM, + SUBPARTITION `sp32` ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = MyISAM, + SUBPARTITION `sp42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -15750,12 +15750,12 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD diff --git a/mysql-test/suite/parts/r/partition_basic_symlink_innodb.result b/mysql-test/suite/parts/r/partition_basic_symlink_innodb.result index f1c2a7d9af4..4d3fae27422 100644 --- a/mysql-test/suite/parts/r/partition_basic_symlink_innodb.result +++ b/mysql-test/suite/parts/r/partition_basic_symlink_innodb.result @@ -70,9 +70,9 @@ Table Create Table t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) -(PARTITION p0 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = InnoDB, - PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = InnoDB) + PARTITION BY HASH (`c1`) +(PARTITION `p0` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = InnoDB, + PARTITION `p1` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = InnoDB) # # Verify that the DATA/INDEX DIRECTORY is stored and used if we # ALTER TABLE to MyISAM. @@ -83,9 +83,9 @@ Table Create Table t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) -(PARTITION p0 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM, - PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM) + PARTITION BY HASH (`c1`) +(PARTITION `p0` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM, + PARTITION `p1` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM) # Verifying .frm, .par and MyISAM files (.MYD, MYI) ---- MYSQLD_DATADIR/test t1#P#p0.MYD @@ -110,9 +110,9 @@ Table Create Table t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) -(PARTITION p0 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = InnoDB, - PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = InnoDB) + PARTITION BY HASH (`c1`) +(PARTITION `p0` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = InnoDB, + PARTITION `p1` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = InnoDB) # Verifying .frm, .par, .isl and InnoDB .ibd files ---- MYSQLD_DATADIR/test t1#P#p0.isl diff --git a/mysql-test/suite/parts/r/partition_basic_symlink_myisam.result b/mysql-test/suite/parts/r/partition_basic_symlink_myisam.result index 89ebd5652e7..51e6f282ad0 100644 --- a/mysql-test/suite/parts/r/partition_basic_symlink_myisam.result +++ b/mysql-test/suite/parts/r/partition_basic_symlink_myisam.result @@ -83,9 +83,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION p2 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `p1` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `p2` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#p1.MYD @@ -563,12 +563,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION p2 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION p3 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION p4 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION p5 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `p1` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `p2` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `p3` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `p4` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `p5` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#p1.MYD @@ -1059,15 +1059,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -1572,13 +1572,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -2067,13 +2067,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -2572,20 +2572,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION subpart12 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION subpart22 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION subpart32 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION subpart42 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `subpart12` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `subpart22` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `subpart32` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `subpart42` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -3102,20 +3102,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION sp12 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION sp22 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION sp32 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION sp42 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `sp12` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `sp22` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `sp32` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `sp42` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -3612,12 +3612,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -4116,9 +4116,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) -(PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION p2 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) + PARTITION BY HASH (`f_int1` + `f_int2`) +(PARTITION `p1` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `p2` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#p1.MYD @@ -4596,12 +4596,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) -(PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION p2 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION p3 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION p4 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION p5 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`,`f_int2`) +(PARTITION `p1` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `p2` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `p3` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `p4` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `p5` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#p1.MYD @@ -5092,15 +5092,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -5605,13 +5605,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -6100,13 +6100,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -6603,20 +6603,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION subpart12 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION subpart22 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION subpart32 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION subpart42 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `subpart12` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `subpart22` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `subpart32` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `subpart42` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -7133,20 +7133,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION sp12 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION sp22 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION sp32 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION sp42 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `sp12` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `sp22` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `sp32` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `sp42` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -7643,12 +7643,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -8153,9 +8153,9 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION p2 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `p1` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `p2` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#p1.MYD @@ -8686,12 +8686,12 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION p2 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION p3 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION p4 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION p5 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`) +(PARTITION `p1` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `p2` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `p3` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `p4` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `p5` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#p1.MYD @@ -9235,15 +9235,15 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -9801,13 +9801,13 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -10349,13 +10349,13 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -10907,20 +10907,20 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION subpart12 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION subpart22 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION subpart32 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION subpart42 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `subpart12` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `subpart22` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `subpart32` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `subpart42` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -11490,20 +11490,20 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION sp12 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION sp22 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION sp32 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION sp42 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `sp12` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `sp22` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `sp32` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `sp42` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -12053,12 +12053,12 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -12614,9 +12614,9 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) -(PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION p2 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) + PARTITION BY HASH (`f_int1` + `f_int2`) +(PARTITION `p1` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `p2` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#p1.MYD @@ -13147,12 +13147,12 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) -(PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION p2 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION p3 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION p4 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION p5 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) + PARTITION BY KEY (`f_int1`,`f_int2`) +(PARTITION `p1` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `p2` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `p3` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `p4` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `p5` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#p1.MYD @@ -13696,15 +13696,15 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -14262,13 +14262,13 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -14810,13 +14810,13 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -15366,20 +15366,20 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION subpart12 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION subpart22 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION subpart32 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION subpart42 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `subpart12` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `subpart22` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `subpart32` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `subpart42` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -15949,20 +15949,20 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION sp12 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION sp22 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION sp32 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION sp42 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `sp12` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `sp22` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `sp32` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `sp42` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD @@ -16512,12 +16512,12 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part2 VALUES IN (1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part3 VALUES IN (NULL) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) +(PARTITION `part1` VALUES IN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part2` VALUES IN (1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part3` VALUES IN (NULL) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -17069,9 +17069,9 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION p1 INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION p2 INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `p1` INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `p2` INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#p1.MYD @@ -17595,12 +17595,12 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM, - PARTITION p2 INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION p3 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION p4 ENGINE = MyISAM, - PARTITION p5 INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `p1` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM, + PARTITION `p2` INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `p3` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `p4` ENGINE = MyISAM, + PARTITION `p5` INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#p1.MYD @@ -18139,15 +18139,15 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part_2 VALUES IN (-2) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM, - PARTITION part_1 VALUES IN (-1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part_N VALUES IN (NULL) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM, - PARTITION part0 VALUES IN (0) INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION part1 VALUES IN (1) ENGINE = MyISAM, - PARTITION part2 VALUES IN (2) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM, - PARTITION part3 VALUES IN (3) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part_2` VALUES IN (-2) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM, + PARTITION `part_1` VALUES IN (-1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part_N` VALUES IN (NULL) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM, + PARTITION `part0` VALUES IN (0) INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `part1` VALUES IN (1) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (2) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM, + PARTITION `part3` VALUES IN (3) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#part0.MYD @@ -18692,13 +18692,13 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (15) ENGINE = MyISAM, - PARTITION parte VALUES LESS THAN (20) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM, - PARTITION partf VALUES LESS THAN (2147483646) INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = MyISAM, + PARTITION `parte` VALUES LESS THAN (20) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM, + PARTITION `partf` VALUES LESS THAN (2147483646) INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#parta.MYD @@ -19230,13 +19230,13 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - PARTITION partb VALUES LESS THAN (5) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM, - PARTITION partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION partd VALUES LESS THAN (2147483646) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) +(PARTITION `parta` VALUES LESS THAN (0) INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + PARTITION `partb` VALUES LESS THAN (5) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `partd` VALUES LESS THAN (2147483646) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM) unified filelist t1#P#parta#SP#partasp0.MYD @@ -19781,20 +19781,20 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM, - SUBPARTITION subpart12 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION subpart22 INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION subpart32 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = MyISAM, - SUBPARTITION subpart42 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM, + SUBPARTITION `subpart12` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `subpart22` INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `subpart32` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = MyISAM, + SUBPARTITION `subpart42` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -20324,20 +20324,20 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION sp12 INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM, - SUBPARTITION sp22 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION sp32 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, - SUBPARTITION sp42 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `sp12` INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = MyISAM, + SUBPARTITION `sp22` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `sp32` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM, + SUBPARTITION `sp42` DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = MyISAM)) unified filelist t1#P#part1#SP#sp11.MYD diff --git a/mysql-test/suite/parts/r/partition_bigint_innodb.result b/mysql-test/suite/parts/r/partition_bigint_innodb.result index c11e72d85d3..1891625d942 100644 --- a/mysql-test/suite/parts/r/partition_bigint_innodb.result +++ b/mysql-test/suite/parts/r/partition_bigint_innodb.result @@ -10,11 +10,11 @@ t1 CREATE TABLE `t1` ( `a` bigint(20) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) insert into t1 values (18446744073709551615), (0xFFFFFFFFFFFFFFFE), (18446744073709551613), (18446744073709551612), (1), (2), (65535); select * from t1; a @@ -58,7 +58,7 @@ t2 CREATE TABLE `t2` ( `a` bigint(20) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 8 insert into t2 values (18446744073709551615), (0xFFFFFFFFFFFFFFFE), (18446744073709551613), (18446744073709551612); select * from t2; @@ -90,7 +90,7 @@ t3 CREATE TABLE `t3` ( `a` bigint(20) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 7 insert into t3 values (9223372036854775807), (9223372036854775806), (9223372036854775805), (9223372036854775804), (-9223372036854775808), (-9223372036854775807), (1), (-1), (0); select * from t3; diff --git a/mysql-test/suite/parts/r/partition_bigint_myisam.result b/mysql-test/suite/parts/r/partition_bigint_myisam.result index 6407fdf23d6..38a22164733 100644 --- a/mysql-test/suite/parts/r/partition_bigint_myisam.result +++ b/mysql-test/suite/parts/r/partition_bigint_myisam.result @@ -10,11 +10,11 @@ t1 CREATE TABLE `t1` ( `a` bigint(20) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) insert into t1 values (18446744073709551615), (0xFFFFFFFFFFFFFFFE), (18446744073709551613), (18446744073709551612), (1), (2), (65535); select * from t1; a @@ -58,7 +58,7 @@ t2 CREATE TABLE `t2` ( `a` bigint(20) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 8 insert into t2 values (18446744073709551615), (0xFFFFFFFFFFFFFFFE), (18446744073709551613), (18446744073709551612); select * from t2; @@ -90,7 +90,7 @@ t3 CREATE TABLE `t3` ( `a` bigint(20) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 7 insert into t3 values (9223372036854775807), (9223372036854775806), (9223372036854775805), (9223372036854775804), (-9223372036854775808), (-9223372036854775807), (1), (-1), (0); select * from t3; diff --git a/mysql-test/suite/parts/r/partition_bit_innodb.result b/mysql-test/suite/parts/r/partition_bit_innodb.result index 187b4a13d05..b3bf1dac15e 100644 --- a/mysql-test/suite/parts/r/partition_bit_innodb.result +++ b/mysql-test/suite/parts/r/partition_bit_innodb.result @@ -9,7 +9,7 @@ t1 CREATE TABLE `t1` ( `a` bit(1) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) drop table t1; create table t1 (a bit(0), primary key (a)) engine='INNODB' partition by key (a) ( @@ -21,9 +21,9 @@ t1 CREATE TABLE `t1` ( `a` bit(1) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 ENGINE = InnoDB, - PARTITION pa2 ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` ENGINE = InnoDB, + PARTITION `pa2` ENGINE = InnoDB) drop table t1; create table t1 (a bit(64), primary key (a)) engine='INNODB' partition by key (a) partitions 2; @@ -33,7 +33,7 @@ t1 CREATE TABLE `t1` ( `a` bit(64) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 2 insert into t1 values (b'1111111111111111111111111111111111111111111111111111111111111111'), @@ -61,11 +61,11 @@ t1 CREATE TABLE `t1` ( `a` bit(64) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) insert into t1 values (b'1111111111111111111111111111111111111111111111111111111111111111'), (b'1000000000000000000000000000000000000000000000000000000000000000'), @@ -91,7 +91,7 @@ t2 CREATE TABLE `t2` ( `a` bit(1) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 4 insert into t2 values (b'0'), (b'1'); select hex(a) from t2; @@ -104,7 +104,7 @@ Table Create Table t2 CREATE TABLE `t2` ( `a` bit(1) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 4 select hex(a) from t2; hex(a) @@ -117,7 +117,7 @@ t2 CREATE TABLE `t2` ( `a` bit(1) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 4 select hex(a) from t2; hex(a) @@ -136,13 +136,13 @@ t3 CREATE TABLE `t3` ( `a` bit(8) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -SUBPARTITION BY KEY (a) + PARTITION BY RANGE (`a`) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 2 -(PARTITION pa1 VALUES LESS THAN (3) ENGINE = InnoDB, - PARTITION pa2 VALUES LESS THAN (16) ENGINE = InnoDB, - PARTITION pa3 VALUES LESS THAN (64) ENGINE = InnoDB, - PARTITION pa4 VALUES LESS THAN (256) ENGINE = InnoDB) +(PARTITION `pa1` VALUES LESS THAN (3) ENGINE = InnoDB, + PARTITION `pa2` VALUES LESS THAN (16) ENGINE = InnoDB, + PARTITION `pa3` VALUES LESS THAN (64) ENGINE = InnoDB, + PARTITION `pa4` VALUES LESS THAN (256) ENGINE = InnoDB) 255 inserts; select hex(a) from t3 where a=b'01010101'; hex(a) @@ -419,12 +419,12 @@ t4 CREATE TABLE `t4` ( `a` bit(8) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -SUBPARTITION BY KEY (a) + PARTITION BY LIST (`a`) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 2 -(PARTITION pa1 VALUES IN (0,1,2,3) ENGINE = InnoDB, - PARTITION pa2 VALUES IN (4,5,6,7,8,9,10,11,12,13,14,15,16) ENGINE = InnoDB, - PARTITION pa3 VALUES IN (17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32) ENGINE = InnoDB) +(PARTITION `pa1` VALUES IN (0,1,2,3) ENGINE = InnoDB, + PARTITION `pa2` VALUES IN (4,5,6,7,8,9,10,11,12,13,14,15,16) ENGINE = InnoDB, + PARTITION `pa3` VALUES IN (17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32) ENGINE = InnoDB) 32 inserts; select hex(a) from t4 where a=b'00000001'; hex(a) diff --git a/mysql-test/suite/parts/r/partition_bit_myisam.result b/mysql-test/suite/parts/r/partition_bit_myisam.result index 3530743893e..6e25ea5a8d9 100644 --- a/mysql-test/suite/parts/r/partition_bit_myisam.result +++ b/mysql-test/suite/parts/r/partition_bit_myisam.result @@ -9,7 +9,7 @@ t1 CREATE TABLE `t1` ( `a` bit(1) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) drop table t1; create table t1 (a bit(0), primary key (a)) engine='MyISAM' partition by key (a) ( @@ -21,9 +21,9 @@ t1 CREATE TABLE `t1` ( `a` bit(1) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 ENGINE = MyISAM, - PARTITION pa2 ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `pa1` ENGINE = MyISAM, + PARTITION `pa2` ENGINE = MyISAM) drop table t1; create table t1 (a bit(64), primary key (a)) engine='MyISAM' partition by key (a) partitions 2; @@ -33,7 +33,7 @@ t1 CREATE TABLE `t1` ( `a` bit(64) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 2 insert into t1 values (b'1111111111111111111111111111111111111111111111111111111111111111'), @@ -61,11 +61,11 @@ t1 CREATE TABLE `t1` ( `a` bit(64) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) insert into t1 values (b'1111111111111111111111111111111111111111111111111111111111111111'), (b'1000000000000000000000000000000000000000000000000000000000000000'), @@ -91,7 +91,7 @@ t2 CREATE TABLE `t2` ( `a` bit(1) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 4 insert into t2 values (b'0'), (b'1'); select hex(a) from t2; @@ -104,7 +104,7 @@ Table Create Table t2 CREATE TABLE `t2` ( `a` bit(1) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 4 select hex(a) from t2; hex(a) @@ -117,7 +117,7 @@ t2 CREATE TABLE `t2` ( `a` bit(1) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 4 select hex(a) from t2; hex(a) @@ -136,13 +136,13 @@ t3 CREATE TABLE `t3` ( `a` bit(8) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -SUBPARTITION BY KEY (a) + PARTITION BY RANGE (`a`) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 2 -(PARTITION pa1 VALUES LESS THAN (3) ENGINE = MyISAM, - PARTITION pa2 VALUES LESS THAN (16) ENGINE = MyISAM, - PARTITION pa3 VALUES LESS THAN (64) ENGINE = MyISAM, - PARTITION pa4 VALUES LESS THAN (256) ENGINE = MyISAM) +(PARTITION `pa1` VALUES LESS THAN (3) ENGINE = MyISAM, + PARTITION `pa2` VALUES LESS THAN (16) ENGINE = MyISAM, + PARTITION `pa3` VALUES LESS THAN (64) ENGINE = MyISAM, + PARTITION `pa4` VALUES LESS THAN (256) ENGINE = MyISAM) 255 inserts; select hex(a) from t3 where a=b'01010101'; hex(a) @@ -419,12 +419,12 @@ t4 CREATE TABLE `t4` ( `a` bit(8) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -SUBPARTITION BY KEY (a) + PARTITION BY LIST (`a`) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 2 -(PARTITION pa1 VALUES IN (0,1,2,3) ENGINE = MyISAM, - PARTITION pa2 VALUES IN (4,5,6,7,8,9,10,11,12,13,14,15,16) ENGINE = MyISAM, - PARTITION pa3 VALUES IN (17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32) ENGINE = MyISAM) +(PARTITION `pa1` VALUES IN (0,1,2,3) ENGINE = MyISAM, + PARTITION `pa2` VALUES IN (4,5,6,7,8,9,10,11,12,13,14,15,16) ENGINE = MyISAM, + PARTITION `pa3` VALUES IN (17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32) ENGINE = MyISAM) 32 inserts; select hex(a) from t4 where a=b'00000001'; hex(a) diff --git a/mysql-test/suite/parts/r/partition_char_innodb.result b/mysql-test/suite/parts/r/partition_char_innodb.result index ab961222a66..d31229a1cb3 100644 Binary files a/mysql-test/suite/parts/r/partition_char_innodb.result and b/mysql-test/suite/parts/r/partition_char_innodb.result differ diff --git a/mysql-test/suite/parts/r/partition_char_myisam.result b/mysql-test/suite/parts/r/partition_char_myisam.result index 09b77cad211..eb9342ba2bc 100644 Binary files a/mysql-test/suite/parts/r/partition_char_myisam.result and b/mysql-test/suite/parts/r/partition_char_myisam.result differ diff --git a/mysql-test/suite/parts/r/partition_datetime_innodb.result b/mysql-test/suite/parts/r/partition_datetime_innodb.result index 0c7b47edcda..883f2bb1924 100644 --- a/mysql-test/suite/parts/r/partition_datetime_innodb.result +++ b/mysql-test/suite/parts/r/partition_datetime_innodb.result @@ -10,11 +10,11 @@ t1 CREATE TABLE `t1` ( `a` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) insert into t1 values ('1975-01-01 21:21:21'), ('2020-12-31 12:10:30'), ('1980-10-14 03:03'), ('2000-06-15 23:59'); select * from t1; a @@ -40,7 +40,7 @@ t2 CREATE TABLE `t2` ( `a` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 12 insert into t2 values ('1975-01-01 0:1:1'), ('2020-12-31 10:11:12'), ('1980-10-14 13:14:15'), ('2000-06-15 14:15:16'); select * from t2; @@ -137,11 +137,11 @@ t1 CREATE TABLE `t1` ( `a` date NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) insert into t1 values ('1975-01-01'), ('2020-12-31'), ('1980-10-14'), ('2000-06-15'); select * from t1; a @@ -167,7 +167,7 @@ t2 CREATE TABLE `t2` ( `a` date NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 12 insert into t2 values ('1975-01-01'), ('2020-12-31'), ('1980-10-14'), ('2000-06-15'); select * from t2; @@ -291,13 +291,13 @@ t3 CREATE TABLE `t3` ( `a` date NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (month(a)) -SUBPARTITION BY KEY (a) + PARTITION BY RANGE (month(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 3 -(PARTITION quarter1 VALUES LESS THAN (4) ENGINE = InnoDB, - PARTITION quarter2 VALUES LESS THAN (7) ENGINE = InnoDB, - PARTITION quarter3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION quarter4 VALUES LESS THAN (13) ENGINE = InnoDB) +(PARTITION `quarter1` VALUES LESS THAN (4) ENGINE = InnoDB, + PARTITION `quarter2` VALUES LESS THAN (7) ENGINE = InnoDB, + PARTITION `quarter3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `quarter4` VALUES LESS THAN (13) ENGINE = InnoDB) 12 inserts; select count(*) from t3; count(*) @@ -331,13 +331,13 @@ t4 CREATE TABLE `t4` ( `a` date NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (month(a)) -SUBPARTITION BY KEY (a) + PARTITION BY LIST (month(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 3 -(PARTITION quarter1 VALUES IN (1,2,3) ENGINE = InnoDB, - PARTITION quarter2 VALUES IN (4,5,6) ENGINE = InnoDB, - PARTITION quarter3 VALUES IN (7,8,9) ENGINE = InnoDB, - PARTITION quarter4 VALUES IN (10,11,12) ENGINE = InnoDB) +(PARTITION `quarter1` VALUES IN (1,2,3) ENGINE = InnoDB, + PARTITION `quarter2` VALUES IN (4,5,6) ENGINE = InnoDB, + PARTITION `quarter3` VALUES IN (7,8,9) ENGINE = InnoDB, + PARTITION `quarter4` VALUES IN (10,11,12) ENGINE = InnoDB) 12 inserts; select count(*) from t4; count(*) @@ -369,11 +369,11 @@ t1 CREATE TABLE `t1` ( `a` time NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) insert into t1 values ('21:21:21'), ('12:10:30'), ('03:03:03'), ('23:59'); select * from t1; a @@ -399,7 +399,7 @@ t2 CREATE TABLE `t2` ( `a` time NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 12 insert into t2 values ('0:1:1'), ('10:11:12'), ('13:14:15'), ('14:15:16'); select * from t2; @@ -498,13 +498,13 @@ t3 CREATE TABLE `t3` ( `a` time NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (second(a)) -SUBPARTITION BY KEY (a) + PARTITION BY RANGE (second(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 3 -(PARTITION quarter1 VALUES LESS THAN (16) ENGINE = InnoDB, - PARTITION quarter2 VALUES LESS THAN (31) ENGINE = InnoDB, - PARTITION quarter3 VALUES LESS THAN (46) ENGINE = InnoDB, - PARTITION quarter4 VALUES LESS THAN (61) ENGINE = InnoDB) +(PARTITION `quarter1` VALUES LESS THAN (16) ENGINE = InnoDB, + PARTITION `quarter2` VALUES LESS THAN (31) ENGINE = InnoDB, + PARTITION `quarter3` VALUES LESS THAN (46) ENGINE = InnoDB, + PARTITION `quarter4` VALUES LESS THAN (61) ENGINE = InnoDB) 59 inserts; select count(*) from t3; count(*) @@ -585,13 +585,13 @@ t4 CREATE TABLE `t4` ( `a` time NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (second(a)) -SUBPARTITION BY KEY (a) + PARTITION BY LIST (second(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 3 -(PARTITION quarter1 VALUES IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15) ENGINE = InnoDB, - PARTITION quarter2 VALUES IN (16,17,18,19,20,21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, - PARTITION quarter3 VALUES IN (31,32,33,34,35,36,37,38,39,40,41,42,43,44,45) ENGINE = InnoDB, - PARTITION quarter4 VALUES IN (46,47,48,49,50,51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) +(PARTITION `quarter1` VALUES IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15) ENGINE = InnoDB, + PARTITION `quarter2` VALUES IN (16,17,18,19,20,21,22,23,24,25,26,27,28,29,30) ENGINE = InnoDB, + PARTITION `quarter3` VALUES IN (31,32,33,34,35,36,37,38,39,40,41,42,43,44,45) ENGINE = InnoDB, + PARTITION `quarter4` VALUES IN (46,47,48,49,50,51,52,53,54,55,56,57,58,59,60) ENGINE = InnoDB) 59 inserts; select count(*) from t4; count(*) @@ -670,11 +670,11 @@ t1 CREATE TABLE `t1` ( `a` datetime NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) insert into t1 values ('1975-01-01 21:21:21'), ('2020-12-31 12:10:30'), ('1980-10-14 03:03'), ('2000-06-15 23:59'); select * from t1; a @@ -700,7 +700,7 @@ t2 CREATE TABLE `t2` ( `a` datetime NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 12 insert into t2 values ('1975-01-01 0:1:1'), ('2020-12-31 10:11:12'), ('1980-10-14 13:14:15'), ('2000-06-15 14:15:16'); select * from t2; @@ -799,13 +799,13 @@ t3 CREATE TABLE `t3` ( `a` datetime NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (month(a)) -SUBPARTITION BY KEY (a) + PARTITION BY RANGE (month(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 3 -(PARTITION quarter1 VALUES LESS THAN (4) ENGINE = InnoDB, - PARTITION quarter2 VALUES LESS THAN (7) ENGINE = InnoDB, - PARTITION quarter3 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION quarter4 VALUES LESS THAN (13) ENGINE = InnoDB) +(PARTITION `quarter1` VALUES LESS THAN (4) ENGINE = InnoDB, + PARTITION `quarter2` VALUES LESS THAN (7) ENGINE = InnoDB, + PARTITION `quarter3` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `quarter4` VALUES LESS THAN (13) ENGINE = InnoDB) 12 inserts; select count(*) from t3; count(*) @@ -839,13 +839,13 @@ t4 CREATE TABLE `t4` ( `a` datetime NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (month(a)) -SUBPARTITION BY KEY (a) + PARTITION BY LIST (month(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 3 -(PARTITION quarter1 VALUES IN (1,2,3) ENGINE = InnoDB, - PARTITION quarter2 VALUES IN (4,5,6) ENGINE = InnoDB, - PARTITION quarter3 VALUES IN (7,8,9) ENGINE = InnoDB, - PARTITION quarter4 VALUES IN (10,11,12) ENGINE = InnoDB) +(PARTITION `quarter1` VALUES IN (1,2,3) ENGINE = InnoDB, + PARTITION `quarter2` VALUES IN (4,5,6) ENGINE = InnoDB, + PARTITION `quarter3` VALUES IN (7,8,9) ENGINE = InnoDB, + PARTITION `quarter4` VALUES IN (10,11,12) ENGINE = InnoDB) 12 inserts; select count(*) from t4; count(*) @@ -877,11 +877,11 @@ t1 CREATE TABLE `t1` ( `a` year(4) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) insert into t1 values ('1975'), (2020), ('1980'), ('2000'); select * from t1; a @@ -907,7 +907,7 @@ t2 CREATE TABLE `t2` ( `a` year(4) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 12 insert into t2 values ('1975'), ('2020'), ('1980'), ('2000'); select * from t2; diff --git a/mysql-test/suite/parts/r/partition_datetime_myisam.result b/mysql-test/suite/parts/r/partition_datetime_myisam.result index 40efba9d984..34e06b1ba30 100644 --- a/mysql-test/suite/parts/r/partition_datetime_myisam.result +++ b/mysql-test/suite/parts/r/partition_datetime_myisam.result @@ -10,11 +10,11 @@ t1 CREATE TABLE `t1` ( `a` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) insert into t1 values ('1975-01-01 21:21:21'), ('2020-12-31 12:10:30'), ('1980-10-14 03:03'), ('2000-06-15 23:59'); select * from t1; a @@ -40,7 +40,7 @@ t2 CREATE TABLE `t2` ( `a` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 12 insert into t2 values ('1975-01-01 0:1:1'), ('2020-12-31 10:11:12'), ('1980-10-14 13:14:15'), ('2000-06-15 14:15:16'); select * from t2; @@ -137,11 +137,11 @@ t1 CREATE TABLE `t1` ( `a` date NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) insert into t1 values ('1975-01-01'), ('2020-12-31'), ('1980-10-14'), ('2000-06-15'); select * from t1; a @@ -167,7 +167,7 @@ t2 CREATE TABLE `t2` ( `a` date NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 12 insert into t2 values ('1975-01-01'), ('2020-12-31'), ('1980-10-14'), ('2000-06-15'); select * from t2; @@ -291,13 +291,13 @@ t3 CREATE TABLE `t3` ( `a` date NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (month(a)) -SUBPARTITION BY KEY (a) + PARTITION BY RANGE (month(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 3 -(PARTITION quarter1 VALUES LESS THAN (4) ENGINE = MyISAM, - PARTITION quarter2 VALUES LESS THAN (7) ENGINE = MyISAM, - PARTITION quarter3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION quarter4 VALUES LESS THAN (13) ENGINE = MyISAM) +(PARTITION `quarter1` VALUES LESS THAN (4) ENGINE = MyISAM, + PARTITION `quarter2` VALUES LESS THAN (7) ENGINE = MyISAM, + PARTITION `quarter3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `quarter4` VALUES LESS THAN (13) ENGINE = MyISAM) 12 inserts; select count(*) from t3; count(*) @@ -331,13 +331,13 @@ t4 CREATE TABLE `t4` ( `a` date NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (month(a)) -SUBPARTITION BY KEY (a) + PARTITION BY LIST (month(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 3 -(PARTITION quarter1 VALUES IN (1,2,3) ENGINE = MyISAM, - PARTITION quarter2 VALUES IN (4,5,6) ENGINE = MyISAM, - PARTITION quarter3 VALUES IN (7,8,9) ENGINE = MyISAM, - PARTITION quarter4 VALUES IN (10,11,12) ENGINE = MyISAM) +(PARTITION `quarter1` VALUES IN (1,2,3) ENGINE = MyISAM, + PARTITION `quarter2` VALUES IN (4,5,6) ENGINE = MyISAM, + PARTITION `quarter3` VALUES IN (7,8,9) ENGINE = MyISAM, + PARTITION `quarter4` VALUES IN (10,11,12) ENGINE = MyISAM) 12 inserts; select count(*) from t4; count(*) @@ -369,11 +369,11 @@ t1 CREATE TABLE `t1` ( `a` time NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) insert into t1 values ('21:21:21'), ('12:10:30'), ('03:03:03'), ('23:59'); select * from t1; a @@ -399,7 +399,7 @@ t2 CREATE TABLE `t2` ( `a` time NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 12 insert into t2 values ('0:1:1'), ('10:11:12'), ('13:14:15'), ('14:15:16'); select * from t2; @@ -498,13 +498,13 @@ t3 CREATE TABLE `t3` ( `a` time NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (second(a)) -SUBPARTITION BY KEY (a) + PARTITION BY RANGE (second(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 3 -(PARTITION quarter1 VALUES LESS THAN (16) ENGINE = MyISAM, - PARTITION quarter2 VALUES LESS THAN (31) ENGINE = MyISAM, - PARTITION quarter3 VALUES LESS THAN (46) ENGINE = MyISAM, - PARTITION quarter4 VALUES LESS THAN (61) ENGINE = MyISAM) +(PARTITION `quarter1` VALUES LESS THAN (16) ENGINE = MyISAM, + PARTITION `quarter2` VALUES LESS THAN (31) ENGINE = MyISAM, + PARTITION `quarter3` VALUES LESS THAN (46) ENGINE = MyISAM, + PARTITION `quarter4` VALUES LESS THAN (61) ENGINE = MyISAM) 59 inserts; select count(*) from t3; count(*) @@ -585,13 +585,13 @@ t4 CREATE TABLE `t4` ( `a` time NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (second(a)) -SUBPARTITION BY KEY (a) + PARTITION BY LIST (second(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 3 -(PARTITION quarter1 VALUES IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15) ENGINE = MyISAM, - PARTITION quarter2 VALUES IN (16,17,18,19,20,21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, - PARTITION quarter3 VALUES IN (31,32,33,34,35,36,37,38,39,40,41,42,43,44,45) ENGINE = MyISAM, - PARTITION quarter4 VALUES IN (46,47,48,49,50,51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) +(PARTITION `quarter1` VALUES IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15) ENGINE = MyISAM, + PARTITION `quarter2` VALUES IN (16,17,18,19,20,21,22,23,24,25,26,27,28,29,30) ENGINE = MyISAM, + PARTITION `quarter3` VALUES IN (31,32,33,34,35,36,37,38,39,40,41,42,43,44,45) ENGINE = MyISAM, + PARTITION `quarter4` VALUES IN (46,47,48,49,50,51,52,53,54,55,56,57,58,59,60) ENGINE = MyISAM) 59 inserts; select count(*) from t4; count(*) @@ -670,11 +670,11 @@ t1 CREATE TABLE `t1` ( `a` datetime NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) insert into t1 values ('1975-01-01 21:21:21'), ('2020-12-31 12:10:30'), ('1980-10-14 03:03'), ('2000-06-15 23:59'); select * from t1; a @@ -700,7 +700,7 @@ t2 CREATE TABLE `t2` ( `a` datetime NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 12 insert into t2 values ('1975-01-01 0:1:1'), ('2020-12-31 10:11:12'), ('1980-10-14 13:14:15'), ('2000-06-15 14:15:16'); select * from t2; @@ -799,13 +799,13 @@ t3 CREATE TABLE `t3` ( `a` datetime NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (month(a)) -SUBPARTITION BY KEY (a) + PARTITION BY RANGE (month(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 3 -(PARTITION quarter1 VALUES LESS THAN (4) ENGINE = MyISAM, - PARTITION quarter2 VALUES LESS THAN (7) ENGINE = MyISAM, - PARTITION quarter3 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION quarter4 VALUES LESS THAN (13) ENGINE = MyISAM) +(PARTITION `quarter1` VALUES LESS THAN (4) ENGINE = MyISAM, + PARTITION `quarter2` VALUES LESS THAN (7) ENGINE = MyISAM, + PARTITION `quarter3` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `quarter4` VALUES LESS THAN (13) ENGINE = MyISAM) 12 inserts; select count(*) from t3; count(*) @@ -839,13 +839,13 @@ t4 CREATE TABLE `t4` ( `a` datetime NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (month(a)) -SUBPARTITION BY KEY (a) + PARTITION BY LIST (month(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 3 -(PARTITION quarter1 VALUES IN (1,2,3) ENGINE = MyISAM, - PARTITION quarter2 VALUES IN (4,5,6) ENGINE = MyISAM, - PARTITION quarter3 VALUES IN (7,8,9) ENGINE = MyISAM, - PARTITION quarter4 VALUES IN (10,11,12) ENGINE = MyISAM) +(PARTITION `quarter1` VALUES IN (1,2,3) ENGINE = MyISAM, + PARTITION `quarter2` VALUES IN (4,5,6) ENGINE = MyISAM, + PARTITION `quarter3` VALUES IN (7,8,9) ENGINE = MyISAM, + PARTITION `quarter4` VALUES IN (10,11,12) ENGINE = MyISAM) 12 inserts; select count(*) from t4; count(*) @@ -877,11 +877,11 @@ t1 CREATE TABLE `t1` ( `a` year(4) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) insert into t1 values ('1975'), (2020), ('1980'), ('2000'); select * from t1; a @@ -907,7 +907,7 @@ t2 CREATE TABLE `t2` ( `a` year(4) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 12 insert into t2 values ('1975'), ('2020'), ('1980'), ('2000'); select * from t2; diff --git a/mysql-test/suite/parts/r/partition_debug.result b/mysql-test/suite/parts/r/partition_debug.result index aa33b3ffa57..0c43cc70c99 100644 --- a/mysql-test/suite/parts/r/partition_debug.result +++ b/mysql-test/suite/parts/r/partition_debug.result @@ -55,9 +55,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -100,9 +100,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -167,9 +167,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -212,9 +212,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -279,9 +279,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -324,9 +324,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -391,9 +391,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -436,9 +436,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -503,9 +503,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -548,9 +548,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -615,9 +615,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -660,9 +660,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -727,9 +727,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -772,9 +772,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -839,9 +839,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -884,9 +884,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -951,9 +951,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -996,9 +996,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 11 Original from partition p1 @@ -1063,9 +1063,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1098,9 +1098,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1165,9 +1165,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1200,9 +1200,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1267,9 +1267,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1302,9 +1302,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1369,9 +1369,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1404,9 +1404,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1471,9 +1471,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1506,9 +1506,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1573,9 +1573,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1608,9 +1608,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1675,9 +1675,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1710,9 +1710,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1777,9 +1777,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1812,9 +1812,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1879,9 +1879,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1914,9 +1914,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1; a b 11 Original from partition p1 diff --git a/mysql-test/suite/parts/r/partition_debug_innodb.result b/mysql-test/suite/parts/r/partition_debug_innodb.result index 0cc8b5454a2..5af7990c84b 100644 --- a/mysql-test/suite/parts/r/partition_debug_innodb.result +++ b/mysql-test/suite/parts/r/partition_debug_innodb.result @@ -30,9 +30,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -62,9 +62,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -95,9 +95,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -129,9 +129,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -162,9 +162,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -196,9 +196,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -229,9 +229,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -263,9 +263,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -296,9 +296,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -331,9 +331,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -364,9 +364,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -399,9 +399,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -432,9 +432,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -467,9 +467,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -500,9 +500,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -536,10 +536,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -570,9 +570,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -604,10 +604,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -638,9 +638,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -672,10 +672,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -707,9 +707,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -734,9 +734,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -766,9 +766,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -794,9 +794,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -828,9 +828,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -855,9 +855,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -887,9 +887,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -915,9 +915,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -949,9 +949,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -976,9 +976,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1008,9 +1008,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1036,9 +1036,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1070,9 +1070,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1097,9 +1097,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1129,9 +1129,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1157,9 +1157,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1191,9 +1191,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1218,9 +1218,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1250,9 +1250,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1278,9 +1278,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1312,9 +1312,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1339,9 +1339,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1371,9 +1371,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1399,9 +1399,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1433,9 +1433,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1460,9 +1460,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1492,9 +1492,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1520,9 +1520,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1554,9 +1554,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1582,10 +1582,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1615,9 +1615,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1644,10 +1644,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1679,9 +1679,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1707,10 +1707,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1740,9 +1740,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1769,10 +1769,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1804,9 +1804,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1832,10 +1832,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1865,9 +1865,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1894,10 +1894,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1930,9 +1930,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1961,9 +1961,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1994,9 +1994,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2027,9 +2027,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2060,9 +2060,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2093,9 +2093,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2126,9 +2126,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2158,8 +2158,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2186,9 +2186,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2218,8 +2218,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2246,9 +2246,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2278,8 +2278,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2306,9 +2306,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2336,8 +2336,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2364,9 +2364,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2393,8 +2393,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2421,9 +2421,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2450,8 +2450,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2479,9 +2479,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2505,9 +2505,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2537,9 +2537,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2564,9 +2564,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2598,9 +2598,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2624,9 +2624,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2656,9 +2656,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2683,9 +2683,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2717,9 +2717,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2743,9 +2743,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2775,9 +2775,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2802,9 +2802,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2836,9 +2836,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2861,8 +2861,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2888,9 +2888,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2914,8 +2914,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2943,9 +2943,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2968,8 +2968,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2995,9 +2995,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3021,8 +3021,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3050,9 +3050,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3075,8 +3075,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3102,9 +3102,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3128,8 +3128,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3157,9 +3157,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3182,8 +3182,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3209,9 +3209,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3235,8 +3235,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3264,9 +3264,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3289,8 +3289,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3316,9 +3316,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3342,8 +3342,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3371,9 +3371,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3396,8 +3396,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3423,9 +3423,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3449,8 +3449,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3480,9 +3480,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3513,9 +3513,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3546,9 +3546,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3581,9 +3581,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3614,9 +3614,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3649,9 +3649,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3682,9 +3682,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3719,9 +3719,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3752,9 +3752,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3789,9 +3789,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3822,9 +3822,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3859,9 +3859,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3892,9 +3892,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3930,10 +3930,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3964,9 +3964,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4002,10 +4002,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4036,9 +4036,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4072,10 +4072,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4106,9 +4106,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4142,10 +4142,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4176,9 +4176,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4211,10 +4211,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4245,9 +4245,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4280,10 +4280,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4316,9 +4316,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4344,9 +4344,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4376,9 +4376,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4405,9 +4405,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4439,9 +4439,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4467,9 +4467,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4499,9 +4499,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4528,9 +4528,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4562,9 +4562,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4590,9 +4590,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4622,9 +4622,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4651,9 +4651,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4685,9 +4685,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4713,9 +4713,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4745,9 +4745,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4774,9 +4774,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4808,9 +4808,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4836,9 +4836,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4868,9 +4868,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4897,9 +4897,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4931,9 +4931,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4959,9 +4959,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4991,9 +4991,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5020,9 +5020,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5054,9 +5054,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5083,10 +5083,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5116,9 +5116,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5146,10 +5146,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5181,9 +5181,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5210,10 +5210,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5243,9 +5243,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5273,10 +5273,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5308,9 +5308,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5337,10 +5337,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5370,9 +5370,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5400,10 +5400,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5435,9 +5435,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5464,10 +5464,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5497,9 +5497,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5527,10 +5527,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5562,9 +5562,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5591,10 +5591,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5624,9 +5624,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5654,10 +5654,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5689,9 +5689,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5718,10 +5718,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5751,9 +5751,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5781,10 +5781,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = InnoDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = InnoDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5838,9 +5838,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5877,9 +5877,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5943,9 +5943,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5982,9 +5982,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6048,9 +6048,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6087,9 +6087,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6153,9 +6153,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6192,9 +6192,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6258,9 +6258,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6297,9 +6297,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6363,9 +6363,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6402,9 +6402,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6468,9 +6468,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6507,9 +6507,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6573,9 +6573,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6612,9 +6612,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6678,9 +6678,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6717,9 +6717,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 11 Original from partition p1 @@ -6783,9 +6783,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6815,9 +6815,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6881,9 +6881,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6913,9 +6913,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6979,9 +6979,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -7011,9 +7011,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -7077,9 +7077,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -7109,9 +7109,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -7175,9 +7175,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -7207,9 +7207,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -7273,9 +7273,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -7305,9 +7305,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -7371,9 +7371,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -7403,9 +7403,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -7469,9 +7469,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -7501,9 +7501,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -7567,9 +7567,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -7599,9 +7599,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a b 11 Original from partition p1 diff --git a/mysql-test/suite/parts/r/partition_debug_myisam.result b/mysql-test/suite/parts/r/partition_debug_myisam.result index c0ddc1bfb16..ba31418bfb0 100644 --- a/mysql-test/suite/parts/r/partition_debug_myisam.result +++ b/mysql-test/suite/parts/r/partition_debug_myisam.result @@ -29,9 +29,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -65,9 +65,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -100,9 +100,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -138,9 +138,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -173,9 +173,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -211,9 +211,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -246,9 +246,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -284,9 +284,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -319,9 +319,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -359,9 +359,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -394,9 +394,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -434,9 +434,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -469,9 +469,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -509,9 +509,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -544,9 +544,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -586,10 +586,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -622,9 +622,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -662,10 +662,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -698,9 +698,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -738,10 +738,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -775,9 +775,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -804,9 +804,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -838,9 +838,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -868,9 +868,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -904,9 +904,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -933,9 +933,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -967,9 +967,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -997,9 +997,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1033,9 +1033,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1062,9 +1062,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1096,9 +1096,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1126,9 +1126,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1162,9 +1162,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1191,9 +1191,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1225,9 +1225,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1255,9 +1255,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1291,9 +1291,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1320,9 +1320,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1354,9 +1354,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1384,9 +1384,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1420,9 +1420,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1449,9 +1449,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1483,9 +1483,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1513,9 +1513,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1549,9 +1549,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1578,9 +1578,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1612,9 +1612,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1642,9 +1642,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1678,9 +1678,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1709,10 +1709,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1744,9 +1744,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1776,10 +1776,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1813,9 +1813,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1844,10 +1844,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1879,9 +1879,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1911,10 +1911,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1948,9 +1948,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1979,10 +1979,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2014,9 +2014,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2046,10 +2046,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2084,9 +2084,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2119,9 +2119,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2154,9 +2154,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2191,9 +2191,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2226,9 +2226,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2263,9 +2263,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2298,9 +2298,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2333,8 +2333,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2363,9 +2363,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2398,8 +2398,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2428,9 +2428,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2463,8 +2463,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2493,9 +2493,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2526,8 +2526,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2556,9 +2556,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2587,8 +2587,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2617,9 +2617,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2648,8 +2648,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2679,9 +2679,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2707,9 +2707,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2741,9 +2741,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2770,9 +2770,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2806,9 +2806,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2834,9 +2834,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2868,9 +2868,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2897,9 +2897,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2933,9 +2933,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2961,9 +2961,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2995,9 +2995,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3024,9 +3024,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3060,9 +3060,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3086,8 +3086,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3115,9 +3115,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3142,8 +3142,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3173,9 +3173,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3199,8 +3199,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3228,9 +3228,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3255,8 +3255,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3286,9 +3286,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3312,8 +3312,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3341,9 +3341,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3368,8 +3368,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3399,9 +3399,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3425,8 +3425,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3454,9 +3454,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3481,8 +3481,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3512,9 +3512,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3538,8 +3538,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3567,9 +3567,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3594,8 +3594,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3625,9 +3625,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3651,8 +3651,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3680,9 +3680,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3707,8 +3707,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3740,9 +3740,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3777,9 +3777,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3812,9 +3812,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3851,9 +3851,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3886,9 +3886,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3925,9 +3925,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3960,9 +3960,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4003,9 +4003,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4038,9 +4038,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4081,9 +4081,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4116,9 +4116,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4159,9 +4159,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4194,9 +4194,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4239,10 +4239,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4275,9 +4275,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4320,10 +4320,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4356,9 +4356,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4399,10 +4399,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4435,9 +4435,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4478,10 +4478,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4514,9 +4514,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4555,10 +4555,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4591,9 +4591,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4632,10 +4632,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4670,9 +4670,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4700,9 +4700,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4734,9 +4734,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4765,9 +4765,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4801,9 +4801,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4831,9 +4831,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4865,9 +4865,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4896,9 +4896,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4932,9 +4932,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4962,9 +4962,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4996,9 +4996,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5027,9 +5027,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5063,9 +5063,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5093,9 +5093,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5127,9 +5127,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5158,9 +5158,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5194,9 +5194,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5224,9 +5224,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5258,9 +5258,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5289,9 +5289,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5325,9 +5325,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5355,9 +5355,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5389,9 +5389,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5420,9 +5420,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5456,9 +5456,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5488,10 +5488,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5523,9 +5523,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5556,10 +5556,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5593,9 +5593,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5625,10 +5625,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5660,9 +5660,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5693,10 +5693,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5730,9 +5730,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5762,10 +5762,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5797,9 +5797,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5830,10 +5830,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5867,9 +5867,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5899,10 +5899,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5934,9 +5934,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5967,10 +5967,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6004,9 +6004,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6036,10 +6036,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6071,9 +6071,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6104,10 +6104,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6141,9 +6141,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6173,10 +6173,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6208,9 +6208,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6241,10 +6241,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = MyISAM, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = MyISAM, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = MyISAM) SELECT * FROM t1; a b 1 Original from partition p0 diff --git a/mysql-test/suite/parts/r/partition_debug_sync_innodb.result b/mysql-test/suite/parts/r/partition_debug_sync_innodb.result index a34085675cf..678d1968aa4 100644 --- a/mysql-test/suite/parts/r/partition_debug_sync_innodb.result +++ b/mysql-test/suite/parts/r/partition_debug_sync_innodb.result @@ -51,8 +51,8 @@ Table Create Table t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) t1#P#p0.ibd t1.frm t1.par @@ -88,9 +88,9 @@ Table Create Table t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p10 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p10` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1; a 1 diff --git a/mysql-test/suite/parts/r/partition_decimal_innodb.result b/mysql-test/suite/parts/r/partition_decimal_innodb.result index 58c51f0ed3c..648567a14ca 100644 --- a/mysql-test/suite/parts/r/partition_decimal_innodb.result +++ b/mysql-test/suite/parts/r/partition_decimal_innodb.result @@ -10,11 +10,11 @@ t1 CREATE TABLE `t1` ( `a` decimal(10,4) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) insert into t1 values (999999.9999), (-999999.9999), (123456.7899), (-123456.7899), (-1.5), (1), (0), (-1), (1.5), (1234.567), (-1234.567); select * from t1; a @@ -54,7 +54,7 @@ t2 CREATE TABLE `t2` ( `a` decimal(18,9) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 10 insert into t2 values (999999999.999999999), (-999999999.999999999), (-1.5), (-1), (0), (1.5), (1234.567), (-1234.567); select * from t2; @@ -100,14 +100,14 @@ t3 CREATE TABLE `t3` ( `a` decimal(18,9) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (floor(a)) -SUBPARTITION BY KEY (a) + PARTITION BY RANGE (floor(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 2 -(PARTITION pa2 VALUES LESS THAN (2) ENGINE = InnoDB, - PARTITION pa4 VALUES LESS THAN (4) ENGINE = InnoDB, - PARTITION pa6 VALUES LESS THAN (6) ENGINE = InnoDB, - PARTITION pa8 VALUES LESS THAN (8) ENGINE = InnoDB, - PARTITION pa10 VALUES LESS THAN (10) ENGINE = InnoDB) +(PARTITION `pa2` VALUES LESS THAN (2) ENGINE = InnoDB, + PARTITION `pa4` VALUES LESS THAN (4) ENGINE = InnoDB, + PARTITION `pa6` VALUES LESS THAN (6) ENGINE = InnoDB, + PARTITION `pa8` VALUES LESS THAN (8) ENGINE = InnoDB, + PARTITION `pa10` VALUES LESS THAN (10) ENGINE = InnoDB) 9*3 inserts; select count(*) from t3; count(*) @@ -127,14 +127,14 @@ t4 CREATE TABLE `t4` ( `a` decimal(18,9) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ceiling(a)) -SUBPARTITION BY KEY (a) + PARTITION BY LIST (ceiling(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 2 -(PARTITION pa2 VALUES IN (1,2) ENGINE = InnoDB, - PARTITION pa4 VALUES IN (3,4) ENGINE = InnoDB, - PARTITION pa6 VALUES IN (5,6) ENGINE = InnoDB, - PARTITION pa8 VALUES IN (7,8) ENGINE = InnoDB, - PARTITION pa10 VALUES IN (9,10) ENGINE = InnoDB) +(PARTITION `pa2` VALUES IN (1,2) ENGINE = InnoDB, + PARTITION `pa4` VALUES IN (3,4) ENGINE = InnoDB, + PARTITION `pa6` VALUES IN (5,6) ENGINE = InnoDB, + PARTITION `pa8` VALUES IN (7,8) ENGINE = InnoDB, + PARTITION `pa10` VALUES IN (9,10) ENGINE = InnoDB) 9*3 inserts; select count(*) from t4; count(*) diff --git a/mysql-test/suite/parts/r/partition_decimal_myisam.result b/mysql-test/suite/parts/r/partition_decimal_myisam.result index 956923117a5..14999651451 100644 --- a/mysql-test/suite/parts/r/partition_decimal_myisam.result +++ b/mysql-test/suite/parts/r/partition_decimal_myisam.result @@ -10,11 +10,11 @@ t1 CREATE TABLE `t1` ( `a` decimal(10,4) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) insert into t1 values (999999.9999), (-999999.9999), (123456.7899), (-123456.7899), (-1.5), (1), (0), (-1), (1.5), (1234.567), (-1234.567); select * from t1; a @@ -54,7 +54,7 @@ t2 CREATE TABLE `t2` ( `a` decimal(18,9) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 10 insert into t2 values (999999999.999999999), (-999999999.999999999), (-1.5), (-1), (0), (1.5), (1234.567), (-1234.567); select * from t2; @@ -100,14 +100,14 @@ t3 CREATE TABLE `t3` ( `a` decimal(18,9) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (floor(a)) -SUBPARTITION BY KEY (a) + PARTITION BY RANGE (floor(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 2 -(PARTITION pa2 VALUES LESS THAN (2) ENGINE = MyISAM, - PARTITION pa4 VALUES LESS THAN (4) ENGINE = MyISAM, - PARTITION pa6 VALUES LESS THAN (6) ENGINE = MyISAM, - PARTITION pa8 VALUES LESS THAN (8) ENGINE = MyISAM, - PARTITION pa10 VALUES LESS THAN (10) ENGINE = MyISAM) +(PARTITION `pa2` VALUES LESS THAN (2) ENGINE = MyISAM, + PARTITION `pa4` VALUES LESS THAN (4) ENGINE = MyISAM, + PARTITION `pa6` VALUES LESS THAN (6) ENGINE = MyISAM, + PARTITION `pa8` VALUES LESS THAN (8) ENGINE = MyISAM, + PARTITION `pa10` VALUES LESS THAN (10) ENGINE = MyISAM) 9*3 inserts; select count(*) from t3; count(*) @@ -127,14 +127,14 @@ t4 CREATE TABLE `t4` ( `a` decimal(18,9) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (ceiling(a)) -SUBPARTITION BY KEY (a) + PARTITION BY LIST (ceiling(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 2 -(PARTITION pa2 VALUES IN (1,2) ENGINE = MyISAM, - PARTITION pa4 VALUES IN (3,4) ENGINE = MyISAM, - PARTITION pa6 VALUES IN (5,6) ENGINE = MyISAM, - PARTITION pa8 VALUES IN (7,8) ENGINE = MyISAM, - PARTITION pa10 VALUES IN (9,10) ENGINE = MyISAM) +(PARTITION `pa2` VALUES IN (1,2) ENGINE = MyISAM, + PARTITION `pa4` VALUES IN (3,4) ENGINE = MyISAM, + PARTITION `pa6` VALUES IN (5,6) ENGINE = MyISAM, + PARTITION `pa8` VALUES IN (7,8) ENGINE = MyISAM, + PARTITION `pa10` VALUES IN (9,10) ENGINE = MyISAM) 9*3 inserts; select count(*) from t4; count(*) diff --git a/mysql-test/suite/parts/r/partition_double_innodb.result b/mysql-test/suite/parts/r/partition_double_innodb.result index f2618519930..9c6d930a490 100644 --- a/mysql-test/suite/parts/r/partition_double_innodb.result +++ b/mysql-test/suite/parts/r/partition_double_innodb.result @@ -10,11 +10,11 @@ t1 CREATE TABLE `t1` ( `a` double NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) insert into t1 values (-2.2250738585072014E+208), (-2.2250738585072014E-208), (-1.5), (-1), (0), (1.5), (1234.567), (2.2250738585072014E+208); select * from t1; a @@ -48,7 +48,7 @@ t2 CREATE TABLE `t2` ( `a` double NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 10 insert into t2 values (-2.2250738585072014E+208), (-2.2250738585072014E-208), (-1.5), (-1), (0), (1.5), (1234.567), (2.2250738585072014E+208); select * from t2; diff --git a/mysql-test/suite/parts/r/partition_double_myisam.result b/mysql-test/suite/parts/r/partition_double_myisam.result index b01db2f7d31..9ab32b1f841 100644 --- a/mysql-test/suite/parts/r/partition_double_myisam.result +++ b/mysql-test/suite/parts/r/partition_double_myisam.result @@ -10,11 +10,11 @@ t1 CREATE TABLE `t1` ( `a` double NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) insert into t1 values (-2.2250738585072014E+208), (-2.2250738585072014E-208), (-1.5), (-1), (0), (1.5), (1234.567), (2.2250738585072014E+208); select * from t1; a @@ -48,7 +48,7 @@ t2 CREATE TABLE `t2` ( `a` double NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 10 insert into t2 values (-2.2250738585072014E+208), (-2.2250738585072014E-208), (-1.5), (-1), (0), (1.5), (1234.567), (2.2250738585072014E+208); select * from t2; diff --git a/mysql-test/suite/parts/r/partition_engine_innodb.result b/mysql-test/suite/parts/r/partition_engine_innodb.result index ec306c42648..002fe90c78a 100644 --- a/mysql-test/suite/parts/r/partition_engine_innodb.result +++ b/mysql-test/suite/parts/r/partition_engine_innodb.result @@ -68,7 +68,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -525,9 +525,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part1 ENGINE = InnoDB, - PARTITION part2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part1` ENGINE = InnoDB, + PARTITION `part2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -984,14 +984,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (10) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (10) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1509,14 +1509,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (10) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (10) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2010,14 +2010,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (10) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (10) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2472,14 +2472,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (10) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (10) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2934,9 +2934,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part1 ENGINE = InnoDB, - PARTITION part2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part1` ENGINE = InnoDB, + PARTITION `part2` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3393,14 +3393,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (10) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (10) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3858,14 +3858,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (10) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (10) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -4316,8 +4316,8 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part1 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part1` ENGINE = InnoDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -4770,11 +4770,11 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (1000) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (1000) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 diff --git a/mysql-test/suite/parts/r/partition_engine_myisam.result b/mysql-test/suite/parts/r/partition_engine_myisam.result index 30f3b8116f7..f940b250c19 100644 --- a/mysql-test/suite/parts/r/partition_engine_myisam.result +++ b/mysql-test/suite/parts/r/partition_engine_myisam.result @@ -68,7 +68,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -534,9 +534,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part1 ENGINE = MyISAM, - PARTITION part2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part1` ENGINE = MyISAM, + PARTITION `part2` ENGINE = MyISAM) unified filelist t1#P#part1.MYD @@ -1002,14 +1002,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (10) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (10) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -1540,14 +1540,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (10) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (10) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -2054,14 +2054,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (10) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (10) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -2529,14 +2529,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (10) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (10) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -3004,9 +3004,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part1 ENGINE = MyISAM, - PARTITION part2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part1` ENGINE = MyISAM, + PARTITION `part2` ENGINE = MyISAM) unified filelist t1#P#part1.MYD @@ -3472,14 +3472,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (10) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (10) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -3950,14 +3950,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (10) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (10) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -4421,8 +4421,8 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part1 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part1` ENGINE = MyISAM) unified filelist t1#P#part1.MYD @@ -4882,11 +4882,11 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (1000) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (1000) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD diff --git a/mysql-test/suite/parts/r/partition_exch_qa_1_innodb.result b/mysql-test/suite/parts/r/partition_exch_qa_1_innodb.result index 12996c0668a..2b6d8e4dac2 100644 --- a/mysql-test/suite/parts/r/partition_exch_qa_1_innodb.result +++ b/mysql-test/suite/parts/r/partition_exch_qa_1_innodb.result @@ -128,10 +128,10 @@ tp CREATE TABLE `tp` ( PRIMARY KEY (`a`), UNIQUE KEY `a` (`a`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN (100) ENGINE = InnoDB, - PARTITION p2 VALUES LESS THAN (1000) ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN (100) ENGINE = InnoDB, + PARTITION `p2` VALUES LESS THAN (1000) ENGINE = InnoDB) ALTER TABLE tp DROP INDEX a; ALTER TABLE t_10 DROP INDEX a; ALTER TABLE tp ADD UNIQUE INDEX USING BTREE (a,b); @@ -153,10 +153,10 @@ tp CREATE TABLE `tp` ( PRIMARY KEY (`a`), UNIQUE KEY `a` (`a`,`b`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN (100) ENGINE = InnoDB, - PARTITION p2 VALUES LESS THAN (1000) ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN (100) ENGINE = InnoDB, + PARTITION `p2` VALUES LESS THAN (1000) ENGINE = InnoDB) DROP TABLE IF EXISTS t_10; DROP TABLE IF EXISTS t_100; DROP TABLE IF EXISTS t_1000; diff --git a/mysql-test/suite/parts/r/partition_exch_qa_1_myisam.result b/mysql-test/suite/parts/r/partition_exch_qa_1_myisam.result index d6a45d7dc5f..73d1775ab4a 100644 --- a/mysql-test/suite/parts/r/partition_exch_qa_1_myisam.result +++ b/mysql-test/suite/parts/r/partition_exch_qa_1_myisam.result @@ -128,10 +128,10 @@ tp CREATE TABLE `tp` ( PRIMARY KEY (`a`), UNIQUE KEY `a` (`a`) USING BTREE ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN (100) ENGINE = MyISAM, - PARTITION p2 VALUES LESS THAN (1000) ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN (100) ENGINE = MyISAM, + PARTITION `p2` VALUES LESS THAN (1000) ENGINE = MyISAM) ALTER TABLE tp DROP INDEX a; ALTER TABLE t_10 DROP INDEX a; ALTER TABLE tp ADD UNIQUE INDEX USING BTREE (a,b); @@ -153,10 +153,10 @@ tp CREATE TABLE `tp` ( PRIMARY KEY (`a`), UNIQUE KEY `a` (`a`,`b`) USING BTREE ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN (100) ENGINE = MyISAM, - PARTITION p2 VALUES LESS THAN (1000) ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN (100) ENGINE = MyISAM, + PARTITION `p2` VALUES LESS THAN (1000) ENGINE = MyISAM) DROP TABLE IF EXISTS t_10; DROP TABLE IF EXISTS t_100; DROP TABLE IF EXISTS t_1000; diff --git a/mysql-test/suite/parts/r/partition_exchange_innodb.result b/mysql-test/suite/parts/r/partition_exchange_innodb.result index 97aef348c59..a994910d698 100644 --- a/mysql-test/suite/parts/r/partition_exchange_innodb.result +++ b/mysql-test/suite/parts/r/partition_exchange_innodb.result @@ -13,7 +13,7 @@ tp CREATE TABLE `tp` ( `b` varchar(24) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) + PARTITION BY HASH (`a`) PARTITIONS 4 SHOW CREATE TABLE t; Table Create Table @@ -86,7 +86,7 @@ tp CREATE TABLE `tp` ( `b` varchar(24) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB AUTO_INCREMENT=112 DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) + PARTITION BY HASH (`a`) PARTITIONS 4 SHOW CREATE TABLE t; Table Create Table @@ -194,9 +194,9 @@ tp CREATE TABLE `tp` ( `b` varchar(55) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SET DEBUG_SYNC= 'now SIGNAL goto_verification'; SET DEBUG_SYNC= 'now WAIT_FOR swap_in_progress'; # select from t and select/update/delete/insert from tp should work @@ -237,9 +237,9 @@ tp CREATE TABLE `tp` ( `b` varchar(55) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SET DEBUG_SYNC= 'now SIGNAL goto_wait'; SET DEBUG_SYNC= 'now WAIT_FOR swap_in_progress'; # Both tables should now be under exclusive lock, even SHOW should fail @@ -312,9 +312,9 @@ tp CREATE TABLE `tp` ( `b` varchar(55) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM tp WHERE a = 99; a b 99 End of values @@ -346,9 +346,9 @@ tp CREATE TABLE `tp` ( `b` varchar(55) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = InnoDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = InnoDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t; a b 10 Ten diff --git a/mysql-test/suite/parts/r/partition_exchange_memory.result b/mysql-test/suite/parts/r/partition_exchange_memory.result index 9c270422e17..5aa4108980c 100644 --- a/mysql-test/suite/parts/r/partition_exchange_memory.result +++ b/mysql-test/suite/parts/r/partition_exchange_memory.result @@ -13,7 +13,7 @@ tp CREATE TABLE `tp` ( `b` varchar(24) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) + PARTITION BY HASH (`a`) PARTITIONS 4 SHOW CREATE TABLE t; Table Create Table @@ -86,7 +86,7 @@ tp CREATE TABLE `tp` ( `b` varchar(24) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=MEMORY AUTO_INCREMENT=112 DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) + PARTITION BY HASH (`a`) PARTITIONS 4 SHOW CREATE TABLE t; Table Create Table @@ -194,9 +194,9 @@ tp CREATE TABLE `tp` ( `b` varchar(55) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = MEMORY, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MEMORY) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = MEMORY, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MEMORY) SET DEBUG_SYNC= 'now SIGNAL goto_verification'; SET DEBUG_SYNC= 'now WAIT_FOR swap_in_progress'; # select from t and select/update/delete/insert from tp should work @@ -237,9 +237,9 @@ tp CREATE TABLE `tp` ( `b` varchar(55) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = MEMORY, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MEMORY) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = MEMORY, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MEMORY) SET DEBUG_SYNC= 'now SIGNAL goto_wait'; SET DEBUG_SYNC= 'now WAIT_FOR swap_in_progress'; # Both tables should now be under exclusive lock, even SHOW should fail @@ -312,9 +312,9 @@ tp CREATE TABLE `tp` ( `b` varchar(55) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = MEMORY, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MEMORY) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = MEMORY, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MEMORY) SELECT * FROM tp WHERE a = 99; a b 99 End of values @@ -346,9 +346,9 @@ tp CREATE TABLE `tp` ( `b` varchar(55) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = MEMORY, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MEMORY) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = MEMORY, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MEMORY) SELECT * FROM t; a b 10 Ten diff --git a/mysql-test/suite/parts/r/partition_exchange_myisam.result b/mysql-test/suite/parts/r/partition_exchange_myisam.result index ecabe7bde1d..c30ff60ed7c 100644 --- a/mysql-test/suite/parts/r/partition_exchange_myisam.result +++ b/mysql-test/suite/parts/r/partition_exchange_myisam.result @@ -13,7 +13,7 @@ tp CREATE TABLE `tp` ( `b` varchar(24) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) + PARTITION BY HASH (`a`) PARTITIONS 4 SHOW CREATE TABLE t; Table Create Table @@ -86,7 +86,7 @@ tp CREATE TABLE `tp` ( `b` varchar(24) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM AUTO_INCREMENT=112 DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) + PARTITION BY HASH (`a`) PARTITIONS 4 SHOW CREATE TABLE t; Table Create Table @@ -194,9 +194,9 @@ tp CREATE TABLE `tp` ( `b` varchar(55) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SET DEBUG_SYNC= 'now SIGNAL goto_verification'; SET DEBUG_SYNC= 'now WAIT_FOR swap_in_progress'; # select from t and select/update/delete/insert from tp should work @@ -237,9 +237,9 @@ tp CREATE TABLE `tp` ( `b` varchar(55) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SET DEBUG_SYNC= 'now SIGNAL goto_wait'; SET DEBUG_SYNC= 'now WAIT_FOR swap_in_progress'; # Both tables should now be under exclusive lock, even SHOW should fail @@ -312,9 +312,9 @@ tp CREATE TABLE `tp` ( `b` varchar(55) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM tp WHERE a = 99; a b 99 End of values @@ -346,9 +346,9 @@ tp CREATE TABLE `tp` ( `b` varchar(55) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t; a b 10 Ten diff --git a/mysql-test/suite/parts/r/partition_float_innodb.result b/mysql-test/suite/parts/r/partition_float_innodb.result index 863d9bfe000..1163c8dafda 100644 --- a/mysql-test/suite/parts/r/partition_float_innodb.result +++ b/mysql-test/suite/parts/r/partition_float_innodb.result @@ -10,11 +10,11 @@ t1 CREATE TABLE `t1` ( `a` float NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) insert into t1 values (-3.402823466E+38), (3.402823466E+38), (-1.5), (-1), (0), (1), (1.5); select * from t1; a @@ -46,7 +46,7 @@ t2 CREATE TABLE `t2` ( `a` float NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 10 insert into t2 values (-3.402823466E+38), (-3.402823466E+37), (-123.456), (0), (1234546.789), (123.456), (1.5); select * from t2; diff --git a/mysql-test/suite/parts/r/partition_float_myisam.result b/mysql-test/suite/parts/r/partition_float_myisam.result index ff77ae17b37..787e6a855c8 100644 --- a/mysql-test/suite/parts/r/partition_float_myisam.result +++ b/mysql-test/suite/parts/r/partition_float_myisam.result @@ -10,11 +10,11 @@ t1 CREATE TABLE `t1` ( `a` float NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) insert into t1 values (-3.402823466E+38), (3.402823466E+38), (-1.5), (-1), (0), (1), (1.5); select * from t1; a @@ -46,7 +46,7 @@ t2 CREATE TABLE `t2` ( `a` float NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 10 insert into t2 values (-3.402823466E+38), (-3.402823466E+37), (-123.456), (0), (1234546.789), (123.456), (1.5); select * from t2; diff --git a/mysql-test/suite/parts/r/partition_int_innodb.result b/mysql-test/suite/parts/r/partition_int_innodb.result index 31a61209d4d..aca367070fd 100644 --- a/mysql-test/suite/parts/r/partition_int_innodb.result +++ b/mysql-test/suite/parts/r/partition_int_innodb.result @@ -10,11 +10,11 @@ t1 CREATE TABLE `t1` ( `a` int(10) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) insert into t1 values (4294967295), (4294967294), (4294967293), (4294967292), (1), (2), (65535); select * from t1; a @@ -46,7 +46,7 @@ t2 CREATE TABLE `t2` ( `a` int(10) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 8 insert into t2 values (4294967295), (4294967294), (4294967293), (4294967292); select * from t2; @@ -78,7 +78,7 @@ t3 CREATE TABLE `t3` ( `a` int(11) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 7 insert into t3 values (2147483647), (2147483646), (2147483645), (2147483644), (-2147483648), (-2147483647), (1), (-1), (0); select * from t3; diff --git a/mysql-test/suite/parts/r/partition_int_myisam.result b/mysql-test/suite/parts/r/partition_int_myisam.result index 813d4b20e1a..2f5506d2b4d 100644 --- a/mysql-test/suite/parts/r/partition_int_myisam.result +++ b/mysql-test/suite/parts/r/partition_int_myisam.result @@ -10,11 +10,11 @@ t1 CREATE TABLE `t1` ( `a` int(10) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) insert into t1 values (4294967295), (4294967294), (4294967293), (4294967292), (1), (2), (65535); select * from t1; a @@ -46,7 +46,7 @@ t2 CREATE TABLE `t2` ( `a` int(10) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 8 insert into t2 values (4294967295), (4294967294), (4294967293), (4294967292); select * from t2; @@ -78,7 +78,7 @@ t3 CREATE TABLE `t3` ( `a` int(11) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 7 insert into t3 values (2147483647), (2147483646), (2147483645), (2147483644), (-2147483648), (-2147483647), (1), (-1), (0); select * from t3; diff --git a/mysql-test/suite/parts/r/partition_mediumint_innodb.result b/mysql-test/suite/parts/r/partition_mediumint_innodb.result index 3e04cf23754..3e579c7449d 100644 --- a/mysql-test/suite/parts/r/partition_mediumint_innodb.result +++ b/mysql-test/suite/parts/r/partition_mediumint_innodb.result @@ -10,11 +10,11 @@ t1 CREATE TABLE `t1` ( `a` mediumint(8) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) insert into t1 values (16777215), (16777214), (16777213), (16777212), (1), (2), (65535); select * from t1; a @@ -46,7 +46,7 @@ t2 CREATE TABLE `t2` ( `a` mediumint(8) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 8 insert into t2 values (16777215), (16777214), (16777213), (16777212); select * from t2; @@ -78,7 +78,7 @@ t3 CREATE TABLE `t3` ( `a` mediumint(9) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 7 insert into t3 values (8388607), (8388606), (8388605), (8388604), (-8388608), (-8388607), (1), (-1), (0); select * from t3; diff --git a/mysql-test/suite/parts/r/partition_mediumint_myisam.result b/mysql-test/suite/parts/r/partition_mediumint_myisam.result index 21e2d29ea14..f1be34338ec 100644 --- a/mysql-test/suite/parts/r/partition_mediumint_myisam.result +++ b/mysql-test/suite/parts/r/partition_mediumint_myisam.result @@ -10,11 +10,11 @@ t1 CREATE TABLE `t1` ( `a` mediumint(8) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) insert into t1 values (16777215), (16777214), (16777213), (16777212), (1), (2), (65535); select * from t1; a @@ -46,7 +46,7 @@ t2 CREATE TABLE `t2` ( `a` mediumint(8) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 8 insert into t2 values (16777215), (16777214), (16777213), (16777212); select * from t2; @@ -78,7 +78,7 @@ t3 CREATE TABLE `t3` ( `a` mediumint(9) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 7 insert into t3 values (8388607), (8388606), (8388605), (8388604), (-8388608), (-8388607), (1), (-1), (0); select * from t3; diff --git a/mysql-test/suite/parts/r/partition_mgm_lc0_innodb.result b/mysql-test/suite/parts/r/partition_mgm_lc0_innodb.result index dcc48f46251..88469a339ad 100644 --- a/mysql-test/suite/parts/r/partition_mgm_lc0_innodb.result +++ b/mysql-test/suite/parts/r/partition_mgm_lc0_innodb.result @@ -56,14 +56,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = InnoDB, - PARTITION partB ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB, - PARTITION PartD ENGINE = InnoDB, - PARTITION partE ENGINE = InnoDB, - PARTITION Partf ENGINE = InnoDB, - PARTITION PartG ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = InnoDB, + PARTITION `partB` ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB, + PARTITION `PartD` ENGINE = InnoDB, + PARTITION `partE` ENGINE = InnoDB, + PARTITION `Partf` ENGINE = InnoDB, + PARTITION `PartG` ENGINE = InnoDB) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -84,10 +84,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = InnoDB, - PARTITION partB ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = InnoDB, + PARTITION `partB` ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB) # Test of EXCHANGE PARTITION WITH TABLE SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA ='MySQL_Test_DB' AND TABLE_NAME = 'TableA'; PARTITION_NAME TABLE_ROWS @@ -112,10 +112,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = InnoDB, - PARTITION partB ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = InnoDB, + PARTITION `partB` ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB) SELECT * FROM TableB; a 10 @@ -156,10 +156,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = InnoDB, - PARTITION partB ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = InnoDB, + PARTITION `partB` ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB) # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO @@ -192,10 +192,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = InnoDB, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = InnoDB, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -271,11 +271,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = InnoDB, - PARTITION partB ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB, - PARTITION PartD ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = InnoDB, + PARTITION `partB` ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB, + PARTITION `PartD` ENGINE = InnoDB) DROP TABLE tablea; # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; @@ -364,14 +364,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = InnoDB, - PARTITION partB ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB, - PARTITION PartD ENGINE = InnoDB, - PARTITION partE ENGINE = InnoDB, - PARTITION Partf ENGINE = InnoDB, - PARTITION PartG ENGINE = InnoDB) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = InnoDB, + PARTITION `partB` ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB, + PARTITION `PartD` ENGINE = InnoDB, + PARTITION `partE` ENGINE = InnoDB, + PARTITION `Partf` ENGINE = InnoDB, + PARTITION `PartG` ENGINE = InnoDB) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -392,10 +392,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = InnoDB, - PARTITION partB ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = InnoDB, + PARTITION `partB` ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB) # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO @@ -428,10 +428,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = InnoDB, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB) + PARTITION BY HASH (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = InnoDB, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -507,11 +507,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = InnoDB, - PARTITION partB ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB, - PARTITION PartD ENGINE = InnoDB) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = InnoDB, + PARTITION `partB` ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB, + PARTITION `PartD` ENGINE = InnoDB) DROP TABLE tablea; # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; @@ -589,14 +589,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = InnoDB, - PARTITION partB VALUES LESS THAN (7) ENGINE = InnoDB, - PARTITION Partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION PartD VALUES LESS THAN (13) ENGINE = InnoDB, - PARTITION partE VALUES LESS THAN (16) ENGINE = InnoDB, - PARTITION Partf VALUES LESS THAN (19) ENGINE = InnoDB, - PARTITION PartG VALUES LESS THAN (22) ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = InnoDB, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = InnoDB, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = InnoDB, + PARTITION `partE` VALUES LESS THAN (16) ENGINE = InnoDB, + PARTITION `Partf` VALUES LESS THAN (19) ENGINE = InnoDB, + PARTITION `PartG` VALUES LESS THAN (22) ENGINE = InnoDB) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -620,12 +620,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = InnoDB, - PARTITION partB VALUES LESS THAN (7) ENGINE = InnoDB, - PARTITION Partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION PartD VALUES LESS THAN (13) ENGINE = InnoDB, - PARTITION PartE VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = InnoDB, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = InnoDB, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = InnoDB, + PARTITION `PartE` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) # Test of REORGANIZE PARTITIONS # Error since it must reorganize a consecutive range ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO @@ -658,11 +658,11 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = InnoDB, - PARTITION partD VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = InnoDB, - PARTITION partB VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = InnoDB, - PARTITION partC VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = InnoDB, + PARTITION `partD` VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = InnoDB, + PARTITION `partB` VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = InnoDB, + PARTITION `partC` VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = InnoDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -738,11 +738,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = InnoDB, - PARTITION partB VALUES LESS THAN (7) ENGINE = InnoDB, - PARTITION Partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION PartD VALUES LESS THAN (13) ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = InnoDB, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = InnoDB, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = InnoDB) DROP TABLE tablea; # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; @@ -820,14 +820,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = InnoDB, - PARTITION partB VALUES IN (2,10,11) ENGINE = InnoDB, - PARTITION Partc VALUES IN (3,4,7) ENGINE = InnoDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = InnoDB, - PARTITION partE VALUES IN (16) ENGINE = InnoDB, - PARTITION Partf VALUES IN (19) ENGINE = InnoDB, - PARTITION PartG VALUES IN (22) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = InnoDB, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = InnoDB, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = InnoDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = InnoDB, + PARTITION `partE` VALUES IN (16) ENGINE = InnoDB, + PARTITION `Partf` VALUES IN (19) ENGINE = InnoDB, + PARTITION `PartG` VALUES IN (22) ENGINE = InnoDB) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -851,12 +851,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = InnoDB, - PARTITION partB VALUES IN (2,10,11) ENGINE = InnoDB, - PARTITION Partc VALUES IN (3,4,7) ENGINE = InnoDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = InnoDB, - PARTITION PartE VALUES IN (13) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = InnoDB, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = InnoDB, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = InnoDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = InnoDB, + PARTITION `PartE` VALUES IN (13) ENGINE = InnoDB) # Test of REORGANIZE PARTITIONS ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO (PARTITION Partc VALUES IN (1,7) @@ -889,12 +889,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION Partc VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = InnoDB, - PARTITION parta VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = InnoDB, - PARTITION partB VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = InnoDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = InnoDB, - PARTITION PartE VALUES IN (13) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `Partc` VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = InnoDB, + PARTITION `parta` VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = InnoDB, + PARTITION `partB` VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = InnoDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = InnoDB, + PARTITION `PartE` VALUES IN (13) ENGINE = InnoDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -961,11 +961,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = InnoDB, - PARTITION partB VALUES IN (2,10,11) ENGINE = InnoDB, - PARTITION Partc VALUES IN (3,4,7) ENGINE = InnoDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = InnoDB, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = InnoDB, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = InnoDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = InnoDB) DROP TABLE tablea; # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; @@ -1004,10 +1004,10 @@ t1 CREATE TABLE `t1` ( `b` varchar(255) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB AUTO_INCREMENT=2002 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION LT1000 VALUES LESS THAN (1000) ENGINE = InnoDB, - PARTITION LT2000 VALUES LESS THAN (2000) ENGINE = InnoDB, - PARTITION MAX VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `LT1000` VALUES LESS THAN (1000) ENGINE = InnoDB, + PARTITION `LT2000` VALUES LESS THAN (2000) ENGINE = InnoDB, + PARTITION `MAX` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1 ORDER BY a; a b 1 First diff --git a/mysql-test/suite/parts/r/partition_mgm_lc0_memory.result b/mysql-test/suite/parts/r/partition_mgm_lc0_memory.result index 5451b5a6fd3..585bd24dca6 100644 --- a/mysql-test/suite/parts/r/partition_mgm_lc0_memory.result +++ b/mysql-test/suite/parts/r/partition_mgm_lc0_memory.result @@ -56,14 +56,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MEMORY, - PARTITION partB ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY, - PARTITION PartD ENGINE = MEMORY, - PARTITION partE ENGINE = MEMORY, - PARTITION Partf ENGINE = MEMORY, - PARTITION PartG ENGINE = MEMORY) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MEMORY, + PARTITION `partB` ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY, + PARTITION `PartD` ENGINE = MEMORY, + PARTITION `partE` ENGINE = MEMORY, + PARTITION `Partf` ENGINE = MEMORY, + PARTITION `PartG` ENGINE = MEMORY) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -84,10 +84,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MEMORY, - PARTITION partB ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MEMORY, + PARTITION `partB` ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY) # Test of EXCHANGE PARTITION WITH TABLE SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA ='MySQL_Test_DB' AND TABLE_NAME = 'TableA'; PARTITION_NAME TABLE_ROWS @@ -112,10 +112,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MEMORY, - PARTITION partB ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MEMORY, + PARTITION `partB` ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY) SELECT * FROM TableB; a 10 @@ -156,10 +156,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MEMORY, - PARTITION partB ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MEMORY, + PARTITION `partB` ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY) # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO @@ -192,10 +192,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = MEMORY, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY) + PARTITION BY KEY (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = MEMORY, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -271,11 +271,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MEMORY, - PARTITION partB ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY, - PARTITION PartD ENGINE = MEMORY) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MEMORY, + PARTITION `partB` ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY, + PARTITION `PartD` ENGINE = MEMORY) DROP TABLE tablea; # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; @@ -364,14 +364,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = MEMORY, - PARTITION partB ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY, - PARTITION PartD ENGINE = MEMORY, - PARTITION partE ENGINE = MEMORY, - PARTITION Partf ENGINE = MEMORY, - PARTITION PartG ENGINE = MEMORY) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = MEMORY, + PARTITION `partB` ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY, + PARTITION `PartD` ENGINE = MEMORY, + PARTITION `partE` ENGINE = MEMORY, + PARTITION `Partf` ENGINE = MEMORY, + PARTITION `PartG` ENGINE = MEMORY) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -392,10 +392,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = MEMORY, - PARTITION partB ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = MEMORY, + PARTITION `partB` ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY) # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO @@ -428,10 +428,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = MEMORY, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY) + PARTITION BY HASH (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = MEMORY, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -507,11 +507,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = MEMORY, - PARTITION partB ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY, - PARTITION PartD ENGINE = MEMORY) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = MEMORY, + PARTITION `partB` ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY, + PARTITION `PartD` ENGINE = MEMORY) DROP TABLE tablea; # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; @@ -589,14 +589,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MEMORY, - PARTITION partB VALUES LESS THAN (7) ENGINE = MEMORY, - PARTITION Partc VALUES LESS THAN (10) ENGINE = MEMORY, - PARTITION PartD VALUES LESS THAN (13) ENGINE = MEMORY, - PARTITION partE VALUES LESS THAN (16) ENGINE = MEMORY, - PARTITION Partf VALUES LESS THAN (19) ENGINE = MEMORY, - PARTITION PartG VALUES LESS THAN (22) ENGINE = MEMORY) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MEMORY, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = MEMORY, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = MEMORY, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = MEMORY, + PARTITION `partE` VALUES LESS THAN (16) ENGINE = MEMORY, + PARTITION `Partf` VALUES LESS THAN (19) ENGINE = MEMORY, + PARTITION `PartG` VALUES LESS THAN (22) ENGINE = MEMORY) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -620,12 +620,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MEMORY, - PARTITION partB VALUES LESS THAN (7) ENGINE = MEMORY, - PARTITION Partc VALUES LESS THAN (10) ENGINE = MEMORY, - PARTITION PartD VALUES LESS THAN (13) ENGINE = MEMORY, - PARTITION PartE VALUES LESS THAN MAXVALUE ENGINE = MEMORY) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MEMORY, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = MEMORY, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = MEMORY, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = MEMORY, + PARTITION `PartE` VALUES LESS THAN MAXVALUE ENGINE = MEMORY) # Test of REORGANIZE PARTITIONS # Error since it must reorganize a consecutive range ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO @@ -658,11 +658,11 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MEMORY, - PARTITION partD VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = MEMORY, - PARTITION partB VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = MEMORY, - PARTITION partC VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = MEMORY) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MEMORY, + PARTITION `partD` VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = MEMORY, + PARTITION `partB` VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = MEMORY, + PARTITION `partC` VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = MEMORY) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -738,11 +738,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MEMORY, - PARTITION partB VALUES LESS THAN (7) ENGINE = MEMORY, - PARTITION Partc VALUES LESS THAN (10) ENGINE = MEMORY, - PARTITION PartD VALUES LESS THAN (13) ENGINE = MEMORY) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MEMORY, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = MEMORY, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = MEMORY, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = MEMORY) DROP TABLE tablea; # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; @@ -820,14 +820,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = MEMORY, - PARTITION partB VALUES IN (2,10,11) ENGINE = MEMORY, - PARTITION Partc VALUES IN (3,4,7) ENGINE = MEMORY, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MEMORY, - PARTITION partE VALUES IN (16) ENGINE = MEMORY, - PARTITION Partf VALUES IN (19) ENGINE = MEMORY, - PARTITION PartG VALUES IN (22) ENGINE = MEMORY) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = MEMORY, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = MEMORY, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = MEMORY, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MEMORY, + PARTITION `partE` VALUES IN (16) ENGINE = MEMORY, + PARTITION `Partf` VALUES IN (19) ENGINE = MEMORY, + PARTITION `PartG` VALUES IN (22) ENGINE = MEMORY) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -851,12 +851,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = MEMORY, - PARTITION partB VALUES IN (2,10,11) ENGINE = MEMORY, - PARTITION Partc VALUES IN (3,4,7) ENGINE = MEMORY, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MEMORY, - PARTITION PartE VALUES IN (13) ENGINE = MEMORY) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = MEMORY, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = MEMORY, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = MEMORY, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MEMORY, + PARTITION `PartE` VALUES IN (13) ENGINE = MEMORY) # Test of REORGANIZE PARTITIONS ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO (PARTITION Partc VALUES IN (1,7) @@ -889,12 +889,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION Partc VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = MEMORY, - PARTITION parta VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = MEMORY, - PARTITION partB VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = MEMORY, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MEMORY, - PARTITION PartE VALUES IN (13) ENGINE = MEMORY) + PARTITION BY LIST (`a`) +(PARTITION `Partc` VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = MEMORY, + PARTITION `parta` VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = MEMORY, + PARTITION `partB` VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = MEMORY, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MEMORY, + PARTITION `PartE` VALUES IN (13) ENGINE = MEMORY) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -961,11 +961,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = MEMORY, - PARTITION partB VALUES IN (2,10,11) ENGINE = MEMORY, - PARTITION Partc VALUES IN (3,4,7) ENGINE = MEMORY, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MEMORY) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = MEMORY, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = MEMORY, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = MEMORY, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MEMORY) DROP TABLE tablea; # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; @@ -1004,10 +1004,10 @@ t1 CREATE TABLE `t1` ( `b` varchar(255) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=MEMORY AUTO_INCREMENT=2002 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION LT1000 VALUES LESS THAN (1000) ENGINE = MEMORY, - PARTITION LT2000 VALUES LESS THAN (2000) ENGINE = MEMORY, - PARTITION MAX VALUES LESS THAN MAXVALUE ENGINE = MEMORY) + PARTITION BY RANGE (`a`) +(PARTITION `LT1000` VALUES LESS THAN (1000) ENGINE = MEMORY, + PARTITION `LT2000` VALUES LESS THAN (2000) ENGINE = MEMORY, + PARTITION `MAX` VALUES LESS THAN MAXVALUE ENGINE = MEMORY) SELECT * FROM t1 ORDER BY a; a b 1 First diff --git a/mysql-test/suite/parts/r/partition_mgm_lc0_myisam.result b/mysql-test/suite/parts/r/partition_mgm_lc0_myisam.result index 40399ae3312..59181388bd0 100644 --- a/mysql-test/suite/parts/r/partition_mgm_lc0_myisam.result +++ b/mysql-test/suite/parts/r/partition_mgm_lc0_myisam.result @@ -56,14 +56,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MyISAM, - PARTITION partB ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM, - PARTITION PartD ENGINE = MyISAM, - PARTITION partE ENGINE = MyISAM, - PARTITION Partf ENGINE = MyISAM, - PARTITION PartG ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MyISAM, + PARTITION `partB` ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM, + PARTITION `PartD` ENGINE = MyISAM, + PARTITION `partE` ENGINE = MyISAM, + PARTITION `Partf` ENGINE = MyISAM, + PARTITION `PartG` ENGINE = MyISAM) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -84,10 +84,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MyISAM, - PARTITION partB ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MyISAM, + PARTITION `partB` ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM) # Test of EXCHANGE PARTITION WITH TABLE SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA ='MySQL_Test_DB' AND TABLE_NAME = 'TableA'; PARTITION_NAME TABLE_ROWS @@ -112,10 +112,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MyISAM, - PARTITION partB ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MyISAM, + PARTITION `partB` ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM) SELECT * FROM TableB; a 10 @@ -156,10 +156,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MyISAM, - PARTITION partB ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MyISAM, + PARTITION `partB` ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM) # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO @@ -192,10 +192,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = MyISAM, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = MyISAM, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -271,11 +271,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MyISAM, - PARTITION partB ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM, - PARTITION PartD ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MyISAM, + PARTITION `partB` ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM, + PARTITION `PartD` ENGINE = MyISAM) DROP TABLE tablea; # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; @@ -364,14 +364,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = MyISAM, - PARTITION partB ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM, - PARTITION PartD ENGINE = MyISAM, - PARTITION partE ENGINE = MyISAM, - PARTITION Partf ENGINE = MyISAM, - PARTITION PartG ENGINE = MyISAM) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = MyISAM, + PARTITION `partB` ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM, + PARTITION `PartD` ENGINE = MyISAM, + PARTITION `partE` ENGINE = MyISAM, + PARTITION `Partf` ENGINE = MyISAM, + PARTITION `PartG` ENGINE = MyISAM) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -392,10 +392,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = MyISAM, - PARTITION partB ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = MyISAM, + PARTITION `partB` ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM) # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO @@ -428,10 +428,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = MyISAM, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM) + PARTITION BY HASH (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = MyISAM, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -507,11 +507,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = MyISAM, - PARTITION partB ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM, - PARTITION PartD ENGINE = MyISAM) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = MyISAM, + PARTITION `partB` ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM, + PARTITION `PartD` ENGINE = MyISAM) DROP TABLE tablea; # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; @@ -589,14 +589,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MyISAM, - PARTITION partB VALUES LESS THAN (7) ENGINE = MyISAM, - PARTITION Partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION PartD VALUES LESS THAN (13) ENGINE = MyISAM, - PARTITION partE VALUES LESS THAN (16) ENGINE = MyISAM, - PARTITION Partf VALUES LESS THAN (19) ENGINE = MyISAM, - PARTITION PartG VALUES LESS THAN (22) ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MyISAM, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = MyISAM, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = MyISAM, + PARTITION `partE` VALUES LESS THAN (16) ENGINE = MyISAM, + PARTITION `Partf` VALUES LESS THAN (19) ENGINE = MyISAM, + PARTITION `PartG` VALUES LESS THAN (22) ENGINE = MyISAM) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -620,12 +620,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MyISAM, - PARTITION partB VALUES LESS THAN (7) ENGINE = MyISAM, - PARTITION Partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION PartD VALUES LESS THAN (13) ENGINE = MyISAM, - PARTITION PartE VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MyISAM, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = MyISAM, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = MyISAM, + PARTITION `PartE` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) # Test of REORGANIZE PARTITIONS # Error since it must reorganize a consecutive range ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO @@ -658,11 +658,11 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MyISAM, - PARTITION partD VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = MyISAM, - PARTITION partB VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = MyISAM, - PARTITION partC VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MyISAM, + PARTITION `partD` VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = MyISAM, + PARTITION `partB` VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = MyISAM, + PARTITION `partC` VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = MyISAM) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -738,11 +738,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MyISAM, - PARTITION partB VALUES LESS THAN (7) ENGINE = MyISAM, - PARTITION Partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION PartD VALUES LESS THAN (13) ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MyISAM, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = MyISAM, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = MyISAM) DROP TABLE tablea; # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; @@ -820,14 +820,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = MyISAM, - PARTITION partB VALUES IN (2,10,11) ENGINE = MyISAM, - PARTITION Partc VALUES IN (3,4,7) ENGINE = MyISAM, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MyISAM, - PARTITION partE VALUES IN (16) ENGINE = MyISAM, - PARTITION Partf VALUES IN (19) ENGINE = MyISAM, - PARTITION PartG VALUES IN (22) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = MyISAM, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = MyISAM, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = MyISAM, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MyISAM, + PARTITION `partE` VALUES IN (16) ENGINE = MyISAM, + PARTITION `Partf` VALUES IN (19) ENGINE = MyISAM, + PARTITION `PartG` VALUES IN (22) ENGINE = MyISAM) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -851,12 +851,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = MyISAM, - PARTITION partB VALUES IN (2,10,11) ENGINE = MyISAM, - PARTITION Partc VALUES IN (3,4,7) ENGINE = MyISAM, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MyISAM, - PARTITION PartE VALUES IN (13) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = MyISAM, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = MyISAM, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = MyISAM, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MyISAM, + PARTITION `PartE` VALUES IN (13) ENGINE = MyISAM) # Test of REORGANIZE PARTITIONS ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO (PARTITION Partc VALUES IN (1,7) @@ -889,12 +889,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION Partc VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = MyISAM, - PARTITION parta VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = MyISAM, - PARTITION partB VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = MyISAM, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MyISAM, - PARTITION PartE VALUES IN (13) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `Partc` VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = MyISAM, + PARTITION `parta` VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = MyISAM, + PARTITION `partB` VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = MyISAM, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MyISAM, + PARTITION `PartE` VALUES IN (13) ENGINE = MyISAM) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -961,11 +961,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = MyISAM, - PARTITION partB VALUES IN (2,10,11) ENGINE = MyISAM, - PARTITION Partc VALUES IN (3,4,7) ENGINE = MyISAM, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = MyISAM, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = MyISAM, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = MyISAM, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MyISAM) DROP TABLE tablea; # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; @@ -1004,10 +1004,10 @@ t1 CREATE TABLE `t1` ( `b` varchar(255) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM AUTO_INCREMENT=2002 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION LT1000 VALUES LESS THAN (1000) ENGINE = MyISAM, - PARTITION LT2000 VALUES LESS THAN (2000) ENGINE = MyISAM, - PARTITION MAX VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `LT1000` VALUES LESS THAN (1000) ENGINE = MyISAM, + PARTITION `LT2000` VALUES LESS THAN (2000) ENGINE = MyISAM, + PARTITION `MAX` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1 ORDER BY a; a b 1 First diff --git a/mysql-test/suite/parts/r/partition_mgm_lc1_innodb.result b/mysql-test/suite/parts/r/partition_mgm_lc1_innodb.result index 0aab26b189b..c4d63f663e1 100644 --- a/mysql-test/suite/parts/r/partition_mgm_lc1_innodb.result +++ b/mysql-test/suite/parts/r/partition_mgm_lc1_innodb.result @@ -56,14 +56,14 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = InnoDB, - PARTITION partB ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB, - PARTITION PartD ENGINE = InnoDB, - PARTITION partE ENGINE = InnoDB, - PARTITION Partf ENGINE = InnoDB, - PARTITION PartG ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = InnoDB, + PARTITION `partB` ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB, + PARTITION `PartD` ENGINE = InnoDB, + PARTITION `partE` ENGINE = InnoDB, + PARTITION `Partf` ENGINE = InnoDB, + PARTITION `PartG` ENGINE = InnoDB) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -84,10 +84,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = InnoDB, - PARTITION partB ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = InnoDB, + PARTITION `partB` ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB) # Test of EXCHANGE PARTITION WITH TABLE SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA ='MySQL_Test_DB' AND TABLE_NAME = 'TableA'; PARTITION_NAME TABLE_ROWS @@ -112,10 +112,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = InnoDB, - PARTITION partB ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = InnoDB, + PARTITION `partB` ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB) SELECT * FROM TableB; a 10 @@ -156,10 +156,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = InnoDB, - PARTITION partB ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = InnoDB, + PARTITION `partB` ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB) # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO @@ -192,10 +192,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = InnoDB, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = InnoDB, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -264,10 +264,10 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = InnoDB, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = InnoDB, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -355,14 +355,14 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = InnoDB, - PARTITION partB ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB, - PARTITION PartD ENGINE = InnoDB, - PARTITION partE ENGINE = InnoDB, - PARTITION Partf ENGINE = InnoDB, - PARTITION PartG ENGINE = InnoDB) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = InnoDB, + PARTITION `partB` ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB, + PARTITION `PartD` ENGINE = InnoDB, + PARTITION `partE` ENGINE = InnoDB, + PARTITION `Partf` ENGINE = InnoDB, + PARTITION `PartG` ENGINE = InnoDB) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -383,10 +383,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = InnoDB, - PARTITION partB ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = InnoDB, + PARTITION `partB` ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB) # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO @@ -419,10 +419,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = InnoDB, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB) + PARTITION BY HASH (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = InnoDB, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -491,10 +491,10 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = InnoDB, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB) + PARTITION BY HASH (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = InnoDB, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -571,14 +571,14 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = InnoDB, - PARTITION partB VALUES LESS THAN (7) ENGINE = InnoDB, - PARTITION Partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION PartD VALUES LESS THAN (13) ENGINE = InnoDB, - PARTITION partE VALUES LESS THAN (16) ENGINE = InnoDB, - PARTITION Partf VALUES LESS THAN (19) ENGINE = InnoDB, - PARTITION PartG VALUES LESS THAN (22) ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = InnoDB, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = InnoDB, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = InnoDB, + PARTITION `partE` VALUES LESS THAN (16) ENGINE = InnoDB, + PARTITION `Partf` VALUES LESS THAN (19) ENGINE = InnoDB, + PARTITION `PartG` VALUES LESS THAN (22) ENGINE = InnoDB) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -602,12 +602,12 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = InnoDB, - PARTITION partB VALUES LESS THAN (7) ENGINE = InnoDB, - PARTITION Partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION PartD VALUES LESS THAN (13) ENGINE = InnoDB, - PARTITION PartE VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = InnoDB, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = InnoDB, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = InnoDB, + PARTITION `PartE` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) # Test of REORGANIZE PARTITIONS # Error since it must reorganize a consecutive range ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO @@ -640,11 +640,11 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = InnoDB, - PARTITION partD VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = InnoDB, - PARTITION partB VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = InnoDB, - PARTITION partC VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = InnoDB, + PARTITION `partD` VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = InnoDB, + PARTITION `partB` VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = InnoDB, + PARTITION `partC` VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = InnoDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -713,11 +713,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = InnoDB, - PARTITION partD VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = InnoDB, - PARTITION partB VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = InnoDB, - PARTITION partC VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = InnoDB, + PARTITION `partD` VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = InnoDB, + PARTITION `partB` VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = InnoDB, + PARTITION `partC` VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = InnoDB) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -794,14 +794,14 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = InnoDB, - PARTITION partB VALUES IN (2,10,11) ENGINE = InnoDB, - PARTITION Partc VALUES IN (3,4,7) ENGINE = InnoDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = InnoDB, - PARTITION partE VALUES IN (16) ENGINE = InnoDB, - PARTITION Partf VALUES IN (19) ENGINE = InnoDB, - PARTITION PartG VALUES IN (22) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = InnoDB, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = InnoDB, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = InnoDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = InnoDB, + PARTITION `partE` VALUES IN (16) ENGINE = InnoDB, + PARTITION `Partf` VALUES IN (19) ENGINE = InnoDB, + PARTITION `PartG` VALUES IN (22) ENGINE = InnoDB) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -825,12 +825,12 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = InnoDB, - PARTITION partB VALUES IN (2,10,11) ENGINE = InnoDB, - PARTITION Partc VALUES IN (3,4,7) ENGINE = InnoDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = InnoDB, - PARTITION PartE VALUES IN (13) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = InnoDB, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = InnoDB, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = InnoDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = InnoDB, + PARTITION `PartE` VALUES IN (13) ENGINE = InnoDB) # Test of REORGANIZE PARTITIONS ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO (PARTITION Partc VALUES IN (1,7) @@ -863,12 +863,12 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION Partc VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = InnoDB, - PARTITION parta VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = InnoDB, - PARTITION partB VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = InnoDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = InnoDB, - PARTITION PartE VALUES IN (13) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `Partc` VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = InnoDB, + PARTITION `parta` VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = InnoDB, + PARTITION `partB` VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = InnoDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = InnoDB, + PARTITION `PartE` VALUES IN (13) ENGINE = InnoDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -928,12 +928,12 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION Partc VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = InnoDB, - PARTITION parta VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = InnoDB, - PARTITION partB VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = InnoDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = InnoDB, - PARTITION PartE VALUES IN (13) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `Partc` VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = InnoDB, + PARTITION `parta` VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = InnoDB, + PARTITION `partB` VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = InnoDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = InnoDB, + PARTITION `PartE` VALUES IN (13) ENGINE = InnoDB) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -971,10 +971,10 @@ t1 CREATE TABLE `t1` ( `b` varchar(255) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB AUTO_INCREMENT=2002 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION LT1000 VALUES LESS THAN (1000) ENGINE = InnoDB, - PARTITION LT2000 VALUES LESS THAN (2000) ENGINE = InnoDB, - PARTITION MAX VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `LT1000` VALUES LESS THAN (1000) ENGINE = InnoDB, + PARTITION `LT2000` VALUES LESS THAN (2000) ENGINE = InnoDB, + PARTITION `MAX` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1 ORDER BY a; a b 1 First diff --git a/mysql-test/suite/parts/r/partition_mgm_lc1_memory.result b/mysql-test/suite/parts/r/partition_mgm_lc1_memory.result index 5e7da61802e..d29dfd343a6 100644 --- a/mysql-test/suite/parts/r/partition_mgm_lc1_memory.result +++ b/mysql-test/suite/parts/r/partition_mgm_lc1_memory.result @@ -56,14 +56,14 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MEMORY, - PARTITION partB ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY, - PARTITION PartD ENGINE = MEMORY, - PARTITION partE ENGINE = MEMORY, - PARTITION Partf ENGINE = MEMORY, - PARTITION PartG ENGINE = MEMORY) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MEMORY, + PARTITION `partB` ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY, + PARTITION `PartD` ENGINE = MEMORY, + PARTITION `partE` ENGINE = MEMORY, + PARTITION `Partf` ENGINE = MEMORY, + PARTITION `PartG` ENGINE = MEMORY) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -84,10 +84,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MEMORY, - PARTITION partB ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MEMORY, + PARTITION `partB` ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY) # Test of EXCHANGE PARTITION WITH TABLE SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA ='MySQL_Test_DB' AND TABLE_NAME = 'TableA'; PARTITION_NAME TABLE_ROWS @@ -112,10 +112,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MEMORY, - PARTITION partB ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MEMORY, + PARTITION `partB` ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY) SELECT * FROM TableB; a 10 @@ -156,10 +156,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MEMORY, - PARTITION partB ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MEMORY, + PARTITION `partB` ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY) # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO @@ -192,10 +192,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = MEMORY, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY) + PARTITION BY KEY (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = MEMORY, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -264,10 +264,10 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = MEMORY, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY) + PARTITION BY KEY (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = MEMORY, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -355,14 +355,14 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = MEMORY, - PARTITION partB ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY, - PARTITION PartD ENGINE = MEMORY, - PARTITION partE ENGINE = MEMORY, - PARTITION Partf ENGINE = MEMORY, - PARTITION PartG ENGINE = MEMORY) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = MEMORY, + PARTITION `partB` ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY, + PARTITION `PartD` ENGINE = MEMORY, + PARTITION `partE` ENGINE = MEMORY, + PARTITION `Partf` ENGINE = MEMORY, + PARTITION `PartG` ENGINE = MEMORY) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -383,10 +383,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = MEMORY, - PARTITION partB ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = MEMORY, + PARTITION `partB` ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY) # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO @@ -419,10 +419,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = MEMORY, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY) + PARTITION BY HASH (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = MEMORY, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -491,10 +491,10 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = MEMORY, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY) + PARTITION BY HASH (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = MEMORY, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -571,14 +571,14 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MEMORY, - PARTITION partB VALUES LESS THAN (7) ENGINE = MEMORY, - PARTITION Partc VALUES LESS THAN (10) ENGINE = MEMORY, - PARTITION PartD VALUES LESS THAN (13) ENGINE = MEMORY, - PARTITION partE VALUES LESS THAN (16) ENGINE = MEMORY, - PARTITION Partf VALUES LESS THAN (19) ENGINE = MEMORY, - PARTITION PartG VALUES LESS THAN (22) ENGINE = MEMORY) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MEMORY, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = MEMORY, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = MEMORY, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = MEMORY, + PARTITION `partE` VALUES LESS THAN (16) ENGINE = MEMORY, + PARTITION `Partf` VALUES LESS THAN (19) ENGINE = MEMORY, + PARTITION `PartG` VALUES LESS THAN (22) ENGINE = MEMORY) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -602,12 +602,12 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MEMORY, - PARTITION partB VALUES LESS THAN (7) ENGINE = MEMORY, - PARTITION Partc VALUES LESS THAN (10) ENGINE = MEMORY, - PARTITION PartD VALUES LESS THAN (13) ENGINE = MEMORY, - PARTITION PartE VALUES LESS THAN MAXVALUE ENGINE = MEMORY) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MEMORY, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = MEMORY, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = MEMORY, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = MEMORY, + PARTITION `PartE` VALUES LESS THAN MAXVALUE ENGINE = MEMORY) # Test of REORGANIZE PARTITIONS # Error since it must reorganize a consecutive range ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO @@ -640,11 +640,11 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MEMORY, - PARTITION partD VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = MEMORY, - PARTITION partB VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = MEMORY, - PARTITION partC VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = MEMORY) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MEMORY, + PARTITION `partD` VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = MEMORY, + PARTITION `partB` VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = MEMORY, + PARTITION `partC` VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = MEMORY) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -713,11 +713,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MEMORY, - PARTITION partD VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = MEMORY, - PARTITION partB VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = MEMORY, - PARTITION partC VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = MEMORY) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MEMORY, + PARTITION `partD` VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = MEMORY, + PARTITION `partB` VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = MEMORY, + PARTITION `partC` VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = MEMORY) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -794,14 +794,14 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = MEMORY, - PARTITION partB VALUES IN (2,10,11) ENGINE = MEMORY, - PARTITION Partc VALUES IN (3,4,7) ENGINE = MEMORY, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MEMORY, - PARTITION partE VALUES IN (16) ENGINE = MEMORY, - PARTITION Partf VALUES IN (19) ENGINE = MEMORY, - PARTITION PartG VALUES IN (22) ENGINE = MEMORY) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = MEMORY, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = MEMORY, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = MEMORY, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MEMORY, + PARTITION `partE` VALUES IN (16) ENGINE = MEMORY, + PARTITION `Partf` VALUES IN (19) ENGINE = MEMORY, + PARTITION `PartG` VALUES IN (22) ENGINE = MEMORY) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -825,12 +825,12 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = MEMORY, - PARTITION partB VALUES IN (2,10,11) ENGINE = MEMORY, - PARTITION Partc VALUES IN (3,4,7) ENGINE = MEMORY, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MEMORY, - PARTITION PartE VALUES IN (13) ENGINE = MEMORY) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = MEMORY, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = MEMORY, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = MEMORY, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MEMORY, + PARTITION `PartE` VALUES IN (13) ENGINE = MEMORY) # Test of REORGANIZE PARTITIONS ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO (PARTITION Partc VALUES IN (1,7) @@ -863,12 +863,12 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION Partc VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = MEMORY, - PARTITION parta VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = MEMORY, - PARTITION partB VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = MEMORY, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MEMORY, - PARTITION PartE VALUES IN (13) ENGINE = MEMORY) + PARTITION BY LIST (`a`) +(PARTITION `Partc` VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = MEMORY, + PARTITION `parta` VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = MEMORY, + PARTITION `partB` VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = MEMORY, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MEMORY, + PARTITION `PartE` VALUES IN (13) ENGINE = MEMORY) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -928,12 +928,12 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION Partc VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = MEMORY, - PARTITION parta VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = MEMORY, - PARTITION partB VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = MEMORY, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MEMORY, - PARTITION PartE VALUES IN (13) ENGINE = MEMORY) + PARTITION BY LIST (`a`) +(PARTITION `Partc` VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = MEMORY, + PARTITION `parta` VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = MEMORY, + PARTITION `partB` VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = MEMORY, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MEMORY, + PARTITION `PartE` VALUES IN (13) ENGINE = MEMORY) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -971,10 +971,10 @@ t1 CREATE TABLE `t1` ( `b` varchar(255) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=MEMORY AUTO_INCREMENT=2002 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION LT1000 VALUES LESS THAN (1000) ENGINE = MEMORY, - PARTITION LT2000 VALUES LESS THAN (2000) ENGINE = MEMORY, - PARTITION MAX VALUES LESS THAN MAXVALUE ENGINE = MEMORY) + PARTITION BY RANGE (`a`) +(PARTITION `LT1000` VALUES LESS THAN (1000) ENGINE = MEMORY, + PARTITION `LT2000` VALUES LESS THAN (2000) ENGINE = MEMORY, + PARTITION `MAX` VALUES LESS THAN MAXVALUE ENGINE = MEMORY) SELECT * FROM t1 ORDER BY a; a b 1 First diff --git a/mysql-test/suite/parts/r/partition_mgm_lc1_myisam.result b/mysql-test/suite/parts/r/partition_mgm_lc1_myisam.result index 505bf6403a6..f26b975b75e 100644 --- a/mysql-test/suite/parts/r/partition_mgm_lc1_myisam.result +++ b/mysql-test/suite/parts/r/partition_mgm_lc1_myisam.result @@ -56,14 +56,14 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MyISAM, - PARTITION partB ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM, - PARTITION PartD ENGINE = MyISAM, - PARTITION partE ENGINE = MyISAM, - PARTITION Partf ENGINE = MyISAM, - PARTITION PartG ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MyISAM, + PARTITION `partB` ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM, + PARTITION `PartD` ENGINE = MyISAM, + PARTITION `partE` ENGINE = MyISAM, + PARTITION `Partf` ENGINE = MyISAM, + PARTITION `PartG` ENGINE = MyISAM) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -84,10 +84,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MyISAM, - PARTITION partB ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MyISAM, + PARTITION `partB` ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM) # Test of EXCHANGE PARTITION WITH TABLE SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA ='MySQL_Test_DB' AND TABLE_NAME = 'TableA'; PARTITION_NAME TABLE_ROWS @@ -112,10 +112,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MyISAM, - PARTITION partB ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MyISAM, + PARTITION `partB` ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM) SELECT * FROM TableB; a 10 @@ -156,10 +156,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MyISAM, - PARTITION partB ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MyISAM, + PARTITION `partB` ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM) # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO @@ -192,10 +192,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = MyISAM, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = MyISAM, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -264,10 +264,10 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = MyISAM, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = MyISAM, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -355,14 +355,14 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = MyISAM, - PARTITION partB ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM, - PARTITION PartD ENGINE = MyISAM, - PARTITION partE ENGINE = MyISAM, - PARTITION Partf ENGINE = MyISAM, - PARTITION PartG ENGINE = MyISAM) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = MyISAM, + PARTITION `partB` ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM, + PARTITION `PartD` ENGINE = MyISAM, + PARTITION `partE` ENGINE = MyISAM, + PARTITION `Partf` ENGINE = MyISAM, + PARTITION `PartG` ENGINE = MyISAM) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -383,10 +383,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = MyISAM, - PARTITION partB ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = MyISAM, + PARTITION `partB` ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM) # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO @@ -419,10 +419,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = MyISAM, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM) + PARTITION BY HASH (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = MyISAM, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -491,10 +491,10 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = MyISAM, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM) + PARTITION BY HASH (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = MyISAM, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -571,14 +571,14 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MyISAM, - PARTITION partB VALUES LESS THAN (7) ENGINE = MyISAM, - PARTITION Partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION PartD VALUES LESS THAN (13) ENGINE = MyISAM, - PARTITION partE VALUES LESS THAN (16) ENGINE = MyISAM, - PARTITION Partf VALUES LESS THAN (19) ENGINE = MyISAM, - PARTITION PartG VALUES LESS THAN (22) ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MyISAM, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = MyISAM, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = MyISAM, + PARTITION `partE` VALUES LESS THAN (16) ENGINE = MyISAM, + PARTITION `Partf` VALUES LESS THAN (19) ENGINE = MyISAM, + PARTITION `PartG` VALUES LESS THAN (22) ENGINE = MyISAM) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -602,12 +602,12 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MyISAM, - PARTITION partB VALUES LESS THAN (7) ENGINE = MyISAM, - PARTITION Partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION PartD VALUES LESS THAN (13) ENGINE = MyISAM, - PARTITION PartE VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MyISAM, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = MyISAM, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = MyISAM, + PARTITION `PartE` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) # Test of REORGANIZE PARTITIONS # Error since it must reorganize a consecutive range ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO @@ -640,11 +640,11 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MyISAM, - PARTITION partD VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = MyISAM, - PARTITION partB VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = MyISAM, - PARTITION partC VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MyISAM, + PARTITION `partD` VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = MyISAM, + PARTITION `partB` VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = MyISAM, + PARTITION `partC` VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = MyISAM) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -713,11 +713,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MyISAM, - PARTITION partD VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = MyISAM, - PARTITION partB VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = MyISAM, - PARTITION partC VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MyISAM, + PARTITION `partD` VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = MyISAM, + PARTITION `partB` VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = MyISAM, + PARTITION `partC` VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = MyISAM) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -794,14 +794,14 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = MyISAM, - PARTITION partB VALUES IN (2,10,11) ENGINE = MyISAM, - PARTITION Partc VALUES IN (3,4,7) ENGINE = MyISAM, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MyISAM, - PARTITION partE VALUES IN (16) ENGINE = MyISAM, - PARTITION Partf VALUES IN (19) ENGINE = MyISAM, - PARTITION PartG VALUES IN (22) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = MyISAM, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = MyISAM, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = MyISAM, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MyISAM, + PARTITION `partE` VALUES IN (16) ENGINE = MyISAM, + PARTITION `Partf` VALUES IN (19) ENGINE = MyISAM, + PARTITION `PartG` VALUES IN (22) ENGINE = MyISAM) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -825,12 +825,12 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = MyISAM, - PARTITION partB VALUES IN (2,10,11) ENGINE = MyISAM, - PARTITION Partc VALUES IN (3,4,7) ENGINE = MyISAM, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MyISAM, - PARTITION PartE VALUES IN (13) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = MyISAM, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = MyISAM, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = MyISAM, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MyISAM, + PARTITION `PartE` VALUES IN (13) ENGINE = MyISAM) # Test of REORGANIZE PARTITIONS ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO (PARTITION Partc VALUES IN (1,7) @@ -863,12 +863,12 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION Partc VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = MyISAM, - PARTITION parta VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = MyISAM, - PARTITION partB VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = MyISAM, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MyISAM, - PARTITION PartE VALUES IN (13) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `Partc` VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = MyISAM, + PARTITION `parta` VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = MyISAM, + PARTITION `partB` VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = MyISAM, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MyISAM, + PARTITION `PartE` VALUES IN (13) ENGINE = MyISAM) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -928,12 +928,12 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION Partc VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = MyISAM, - PARTITION parta VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = MyISAM, - PARTITION partB VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = MyISAM, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MyISAM, - PARTITION PartE VALUES IN (13) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `Partc` VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = MyISAM, + PARTITION `parta` VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = MyISAM, + PARTITION `partB` VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = MyISAM, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MyISAM, + PARTITION `PartE` VALUES IN (13) ENGINE = MyISAM) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -971,10 +971,10 @@ t1 CREATE TABLE `t1` ( `b` varchar(255) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM AUTO_INCREMENT=2002 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION LT1000 VALUES LESS THAN (1000) ENGINE = MyISAM, - PARTITION LT2000 VALUES LESS THAN (2000) ENGINE = MyISAM, - PARTITION MAX VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `LT1000` VALUES LESS THAN (1000) ENGINE = MyISAM, + PARTITION `LT2000` VALUES LESS THAN (2000) ENGINE = MyISAM, + PARTITION `MAX` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1 ORDER BY a; a b 1 First diff --git a/mysql-test/suite/parts/r/partition_mgm_lc2_innodb.result b/mysql-test/suite/parts/r/partition_mgm_lc2_innodb.result index d25371615ef..a1dad1b34b3 100644 --- a/mysql-test/suite/parts/r/partition_mgm_lc2_innodb.result +++ b/mysql-test/suite/parts/r/partition_mgm_lc2_innodb.result @@ -56,14 +56,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = InnoDB, - PARTITION partB ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB, - PARTITION PartD ENGINE = InnoDB, - PARTITION partE ENGINE = InnoDB, - PARTITION Partf ENGINE = InnoDB, - PARTITION PartG ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = InnoDB, + PARTITION `partB` ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB, + PARTITION `PartD` ENGINE = InnoDB, + PARTITION `partE` ENGINE = InnoDB, + PARTITION `Partf` ENGINE = InnoDB, + PARTITION `PartG` ENGINE = InnoDB) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -84,10 +84,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = InnoDB, - PARTITION partB ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = InnoDB, + PARTITION `partB` ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB) # Test of EXCHANGE PARTITION WITH TABLE SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA ='MySQL_Test_DB' AND TABLE_NAME = 'TableA'; PARTITION_NAME TABLE_ROWS @@ -112,10 +112,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = InnoDB, - PARTITION partB ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = InnoDB, + PARTITION `partB` ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB) SELECT * FROM TableB; a 10 @@ -156,10 +156,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = InnoDB, - PARTITION partB ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = InnoDB, + PARTITION `partB` ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB) # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO @@ -192,10 +192,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = InnoDB, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = InnoDB, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -264,10 +264,10 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = InnoDB, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = InnoDB, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -355,14 +355,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = InnoDB, - PARTITION partB ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB, - PARTITION PartD ENGINE = InnoDB, - PARTITION partE ENGINE = InnoDB, - PARTITION Partf ENGINE = InnoDB, - PARTITION PartG ENGINE = InnoDB) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = InnoDB, + PARTITION `partB` ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB, + PARTITION `PartD` ENGINE = InnoDB, + PARTITION `partE` ENGINE = InnoDB, + PARTITION `Partf` ENGINE = InnoDB, + PARTITION `PartG` ENGINE = InnoDB) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -383,10 +383,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = InnoDB, - PARTITION partB ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = InnoDB, + PARTITION `partB` ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB) # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO @@ -419,10 +419,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = InnoDB, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB) + PARTITION BY HASH (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = InnoDB, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -491,10 +491,10 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = InnoDB, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = InnoDB, - PARTITION Partc ENGINE = InnoDB) + PARTITION BY HASH (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = InnoDB, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = InnoDB, + PARTITION `Partc` ENGINE = InnoDB) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -571,14 +571,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = InnoDB, - PARTITION partB VALUES LESS THAN (7) ENGINE = InnoDB, - PARTITION Partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION PartD VALUES LESS THAN (13) ENGINE = InnoDB, - PARTITION partE VALUES LESS THAN (16) ENGINE = InnoDB, - PARTITION Partf VALUES LESS THAN (19) ENGINE = InnoDB, - PARTITION PartG VALUES LESS THAN (22) ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = InnoDB, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = InnoDB, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = InnoDB, + PARTITION `partE` VALUES LESS THAN (16) ENGINE = InnoDB, + PARTITION `Partf` VALUES LESS THAN (19) ENGINE = InnoDB, + PARTITION `PartG` VALUES LESS THAN (22) ENGINE = InnoDB) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -602,12 +602,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = InnoDB, - PARTITION partB VALUES LESS THAN (7) ENGINE = InnoDB, - PARTITION Partc VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION PartD VALUES LESS THAN (13) ENGINE = InnoDB, - PARTITION PartE VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = InnoDB, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = InnoDB, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = InnoDB, + PARTITION `PartE` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) # Test of REORGANIZE PARTITIONS # Error since it must reorganize a consecutive range ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO @@ -640,11 +640,11 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = InnoDB, - PARTITION partD VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = InnoDB, - PARTITION partB VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = InnoDB, - PARTITION partC VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = InnoDB, + PARTITION `partD` VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = InnoDB, + PARTITION `partB` VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = InnoDB, + PARTITION `partC` VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = InnoDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -713,11 +713,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = InnoDB, - PARTITION partD VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = InnoDB, - PARTITION partB VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = InnoDB, - PARTITION partC VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = InnoDB, + PARTITION `partD` VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = InnoDB, + PARTITION `partB` VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = InnoDB, + PARTITION `partC` VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = InnoDB) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -794,14 +794,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = InnoDB, - PARTITION partB VALUES IN (2,10,11) ENGINE = InnoDB, - PARTITION Partc VALUES IN (3,4,7) ENGINE = InnoDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = InnoDB, - PARTITION partE VALUES IN (16) ENGINE = InnoDB, - PARTITION Partf VALUES IN (19) ENGINE = InnoDB, - PARTITION PartG VALUES IN (22) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = InnoDB, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = InnoDB, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = InnoDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = InnoDB, + PARTITION `partE` VALUES IN (16) ENGINE = InnoDB, + PARTITION `Partf` VALUES IN (19) ENGINE = InnoDB, + PARTITION `PartG` VALUES IN (22) ENGINE = InnoDB) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -825,12 +825,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = InnoDB, - PARTITION partB VALUES IN (2,10,11) ENGINE = InnoDB, - PARTITION Partc VALUES IN (3,4,7) ENGINE = InnoDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = InnoDB, - PARTITION PartE VALUES IN (13) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = InnoDB, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = InnoDB, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = InnoDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = InnoDB, + PARTITION `PartE` VALUES IN (13) ENGINE = InnoDB) # Test of REORGANIZE PARTITIONS ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO (PARTITION Partc VALUES IN (1,7) @@ -863,12 +863,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION Partc VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = InnoDB, - PARTITION parta VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = InnoDB, - PARTITION partB VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = InnoDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = InnoDB, - PARTITION PartE VALUES IN (13) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `Partc` VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = InnoDB, + PARTITION `parta` VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = InnoDB, + PARTITION `partB` VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = InnoDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = InnoDB, + PARTITION `PartE` VALUES IN (13) ENGINE = InnoDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -928,12 +928,12 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION Partc VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = InnoDB, - PARTITION parta VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = InnoDB, - PARTITION partB VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = InnoDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = InnoDB, - PARTITION PartE VALUES IN (13) ENGINE = InnoDB) + PARTITION BY LIST (`a`) +(PARTITION `Partc` VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = InnoDB, + PARTITION `parta` VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = InnoDB, + PARTITION `partB` VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = InnoDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = InnoDB, + PARTITION `PartE` VALUES IN (13) ENGINE = InnoDB) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -971,10 +971,10 @@ t1 CREATE TABLE `t1` ( `b` varchar(255) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB AUTO_INCREMENT=2002 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION LT1000 VALUES LESS THAN (1000) ENGINE = InnoDB, - PARTITION LT2000 VALUES LESS THAN (2000) ENGINE = InnoDB, - PARTITION MAX VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`a`) +(PARTITION `LT1000` VALUES LESS THAN (1000) ENGINE = InnoDB, + PARTITION `LT2000` VALUES LESS THAN (2000) ENGINE = InnoDB, + PARTITION `MAX` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT * FROM t1 ORDER BY a; a b 1 First diff --git a/mysql-test/suite/parts/r/partition_mgm_lc2_memory.result b/mysql-test/suite/parts/r/partition_mgm_lc2_memory.result index 076079ccb00..88f59da8f13 100644 --- a/mysql-test/suite/parts/r/partition_mgm_lc2_memory.result +++ b/mysql-test/suite/parts/r/partition_mgm_lc2_memory.result @@ -56,14 +56,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MEMORY, - PARTITION partB ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY, - PARTITION PartD ENGINE = MEMORY, - PARTITION partE ENGINE = MEMORY, - PARTITION Partf ENGINE = MEMORY, - PARTITION PartG ENGINE = MEMORY) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MEMORY, + PARTITION `partB` ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY, + PARTITION `PartD` ENGINE = MEMORY, + PARTITION `partE` ENGINE = MEMORY, + PARTITION `Partf` ENGINE = MEMORY, + PARTITION `PartG` ENGINE = MEMORY) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -84,10 +84,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MEMORY, - PARTITION partB ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MEMORY, + PARTITION `partB` ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY) # Test of EXCHANGE PARTITION WITH TABLE SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA ='MySQL_Test_DB' AND TABLE_NAME = 'TableA'; PARTITION_NAME TABLE_ROWS @@ -112,10 +112,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MEMORY, - PARTITION partB ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MEMORY, + PARTITION `partB` ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY) SELECT * FROM TableB; a 10 @@ -156,10 +156,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MEMORY, - PARTITION partB ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MEMORY, + PARTITION `partB` ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY) # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO @@ -192,10 +192,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = MEMORY, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY) + PARTITION BY KEY (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = MEMORY, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -264,10 +264,10 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = MEMORY, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY) + PARTITION BY KEY (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = MEMORY, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -355,14 +355,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = MEMORY, - PARTITION partB ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY, - PARTITION PartD ENGINE = MEMORY, - PARTITION partE ENGINE = MEMORY, - PARTITION Partf ENGINE = MEMORY, - PARTITION PartG ENGINE = MEMORY) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = MEMORY, + PARTITION `partB` ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY, + PARTITION `PartD` ENGINE = MEMORY, + PARTITION `partE` ENGINE = MEMORY, + PARTITION `Partf` ENGINE = MEMORY, + PARTITION `PartG` ENGINE = MEMORY) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -383,10 +383,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = MEMORY, - PARTITION partB ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = MEMORY, + PARTITION `partB` ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY) # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO @@ -419,10 +419,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = MEMORY, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY) + PARTITION BY HASH (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = MEMORY, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -491,10 +491,10 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = MEMORY, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = MEMORY, - PARTITION Partc ENGINE = MEMORY) + PARTITION BY HASH (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = MEMORY, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = MEMORY, + PARTITION `Partc` ENGINE = MEMORY) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -571,14 +571,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MEMORY, - PARTITION partB VALUES LESS THAN (7) ENGINE = MEMORY, - PARTITION Partc VALUES LESS THAN (10) ENGINE = MEMORY, - PARTITION PartD VALUES LESS THAN (13) ENGINE = MEMORY, - PARTITION partE VALUES LESS THAN (16) ENGINE = MEMORY, - PARTITION Partf VALUES LESS THAN (19) ENGINE = MEMORY, - PARTITION PartG VALUES LESS THAN (22) ENGINE = MEMORY) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MEMORY, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = MEMORY, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = MEMORY, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = MEMORY, + PARTITION `partE` VALUES LESS THAN (16) ENGINE = MEMORY, + PARTITION `Partf` VALUES LESS THAN (19) ENGINE = MEMORY, + PARTITION `PartG` VALUES LESS THAN (22) ENGINE = MEMORY) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -602,12 +602,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MEMORY, - PARTITION partB VALUES LESS THAN (7) ENGINE = MEMORY, - PARTITION Partc VALUES LESS THAN (10) ENGINE = MEMORY, - PARTITION PartD VALUES LESS THAN (13) ENGINE = MEMORY, - PARTITION PartE VALUES LESS THAN MAXVALUE ENGINE = MEMORY) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MEMORY, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = MEMORY, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = MEMORY, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = MEMORY, + PARTITION `PartE` VALUES LESS THAN MAXVALUE ENGINE = MEMORY) # Test of REORGANIZE PARTITIONS # Error since it must reorganize a consecutive range ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO @@ -640,11 +640,11 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MEMORY, - PARTITION partD VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = MEMORY, - PARTITION partB VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = MEMORY, - PARTITION partC VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = MEMORY) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MEMORY, + PARTITION `partD` VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = MEMORY, + PARTITION `partB` VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = MEMORY, + PARTITION `partC` VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = MEMORY) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -713,11 +713,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MEMORY, - PARTITION partD VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = MEMORY, - PARTITION partB VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = MEMORY, - PARTITION partC VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = MEMORY) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MEMORY, + PARTITION `partD` VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = MEMORY, + PARTITION `partB` VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = MEMORY, + PARTITION `partC` VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = MEMORY) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -794,14 +794,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = MEMORY, - PARTITION partB VALUES IN (2,10,11) ENGINE = MEMORY, - PARTITION Partc VALUES IN (3,4,7) ENGINE = MEMORY, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MEMORY, - PARTITION partE VALUES IN (16) ENGINE = MEMORY, - PARTITION Partf VALUES IN (19) ENGINE = MEMORY, - PARTITION PartG VALUES IN (22) ENGINE = MEMORY) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = MEMORY, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = MEMORY, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = MEMORY, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MEMORY, + PARTITION `partE` VALUES IN (16) ENGINE = MEMORY, + PARTITION `Partf` VALUES IN (19) ENGINE = MEMORY, + PARTITION `PartG` VALUES IN (22) ENGINE = MEMORY) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -825,12 +825,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = MEMORY, - PARTITION partB VALUES IN (2,10,11) ENGINE = MEMORY, - PARTITION Partc VALUES IN (3,4,7) ENGINE = MEMORY, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MEMORY, - PARTITION PartE VALUES IN (13) ENGINE = MEMORY) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = MEMORY, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = MEMORY, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = MEMORY, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MEMORY, + PARTITION `PartE` VALUES IN (13) ENGINE = MEMORY) # Test of REORGANIZE PARTITIONS ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO (PARTITION Partc VALUES IN (1,7) @@ -863,12 +863,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION Partc VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = MEMORY, - PARTITION parta VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = MEMORY, - PARTITION partB VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = MEMORY, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MEMORY, - PARTITION PartE VALUES IN (13) ENGINE = MEMORY) + PARTITION BY LIST (`a`) +(PARTITION `Partc` VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = MEMORY, + PARTITION `parta` VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = MEMORY, + PARTITION `partB` VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = MEMORY, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MEMORY, + PARTITION `PartE` VALUES IN (13) ENGINE = MEMORY) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -928,12 +928,12 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION Partc VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = MEMORY, - PARTITION parta VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = MEMORY, - PARTITION partB VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = MEMORY, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MEMORY, - PARTITION PartE VALUES IN (13) ENGINE = MEMORY) + PARTITION BY LIST (`a`) +(PARTITION `Partc` VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = MEMORY, + PARTITION `parta` VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = MEMORY, + PARTITION `partB` VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = MEMORY, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MEMORY, + PARTITION `PartE` VALUES IN (13) ENGINE = MEMORY) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -971,10 +971,10 @@ t1 CREATE TABLE `t1` ( `b` varchar(255) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=MEMORY AUTO_INCREMENT=2002 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION LT1000 VALUES LESS THAN (1000) ENGINE = MEMORY, - PARTITION LT2000 VALUES LESS THAN (2000) ENGINE = MEMORY, - PARTITION MAX VALUES LESS THAN MAXVALUE ENGINE = MEMORY) + PARTITION BY RANGE (`a`) +(PARTITION `LT1000` VALUES LESS THAN (1000) ENGINE = MEMORY, + PARTITION `LT2000` VALUES LESS THAN (2000) ENGINE = MEMORY, + PARTITION `MAX` VALUES LESS THAN MAXVALUE ENGINE = MEMORY) SELECT * FROM t1 ORDER BY a; a b 1 First diff --git a/mysql-test/suite/parts/r/partition_mgm_lc2_myisam.result b/mysql-test/suite/parts/r/partition_mgm_lc2_myisam.result index e01f0e8d440..a498d4667b1 100644 --- a/mysql-test/suite/parts/r/partition_mgm_lc2_myisam.result +++ b/mysql-test/suite/parts/r/partition_mgm_lc2_myisam.result @@ -56,14 +56,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MyISAM, - PARTITION partB ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM, - PARTITION PartD ENGINE = MyISAM, - PARTITION partE ENGINE = MyISAM, - PARTITION Partf ENGINE = MyISAM, - PARTITION PartG ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MyISAM, + PARTITION `partB` ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM, + PARTITION `PartD` ENGINE = MyISAM, + PARTITION `partE` ENGINE = MyISAM, + PARTITION `Partf` ENGINE = MyISAM, + PARTITION `PartG` ENGINE = MyISAM) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -84,10 +84,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MyISAM, - PARTITION partB ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MyISAM, + PARTITION `partB` ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM) # Test of EXCHANGE PARTITION WITH TABLE SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA ='MySQL_Test_DB' AND TABLE_NAME = 'TableA'; PARTITION_NAME TABLE_ROWS @@ -112,10 +112,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MyISAM, - PARTITION partB ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MyISAM, + PARTITION `partB` ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM) SELECT * FROM TableB; a 10 @@ -156,10 +156,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = MyISAM, - PARTITION partB ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = MyISAM, + PARTITION `partB` ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM) # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO @@ -192,10 +192,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = MyISAM, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = MyISAM, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -264,10 +264,10 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = MyISAM, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = MyISAM, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -355,14 +355,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = MyISAM, - PARTITION partB ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM, - PARTITION PartD ENGINE = MyISAM, - PARTITION partE ENGINE = MyISAM, - PARTITION Partf ENGINE = MyISAM, - PARTITION PartG ENGINE = MyISAM) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = MyISAM, + PARTITION `partB` ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM, + PARTITION `PartD` ENGINE = MyISAM, + PARTITION `partE` ENGINE = MyISAM, + PARTITION `Partf` ENGINE = MyISAM, + PARTITION `PartG` ENGINE = MyISAM) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -383,10 +383,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = MyISAM, - PARTITION partB ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = MyISAM, + PARTITION `partB` ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM) # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO @@ -419,10 +419,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = MyISAM, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM) + PARTITION BY HASH (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = MyISAM, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -491,10 +491,10 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = MyISAM, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = MyISAM, - PARTITION Partc ENGINE = MyISAM) + PARTITION BY HASH (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = MyISAM, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = MyISAM, + PARTITION `Partc` ENGINE = MyISAM) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -571,14 +571,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MyISAM, - PARTITION partB VALUES LESS THAN (7) ENGINE = MyISAM, - PARTITION Partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION PartD VALUES LESS THAN (13) ENGINE = MyISAM, - PARTITION partE VALUES LESS THAN (16) ENGINE = MyISAM, - PARTITION Partf VALUES LESS THAN (19) ENGINE = MyISAM, - PARTITION PartG VALUES LESS THAN (22) ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MyISAM, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = MyISAM, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = MyISAM, + PARTITION `partE` VALUES LESS THAN (16) ENGINE = MyISAM, + PARTITION `Partf` VALUES LESS THAN (19) ENGINE = MyISAM, + PARTITION `PartG` VALUES LESS THAN (22) ENGINE = MyISAM) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -602,12 +602,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MyISAM, - PARTITION partB VALUES LESS THAN (7) ENGINE = MyISAM, - PARTITION Partc VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION PartD VALUES LESS THAN (13) ENGINE = MyISAM, - PARTITION PartE VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MyISAM, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = MyISAM, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = MyISAM, + PARTITION `PartE` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) # Test of REORGANIZE PARTITIONS # Error since it must reorganize a consecutive range ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO @@ -640,11 +640,11 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MyISAM, - PARTITION partD VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = MyISAM, - PARTITION partB VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = MyISAM, - PARTITION partC VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MyISAM, + PARTITION `partD` VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = MyISAM, + PARTITION `partB` VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = MyISAM, + PARTITION `partC` VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = MyISAM) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -713,11 +713,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = MyISAM, - PARTITION partD VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = MyISAM, - PARTITION partB VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = MyISAM, - PARTITION partC VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = MyISAM, + PARTITION `partD` VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = MyISAM, + PARTITION `partB` VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = MyISAM, + PARTITION `partC` VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = MyISAM) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -794,14 +794,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = MyISAM, - PARTITION partB VALUES IN (2,10,11) ENGINE = MyISAM, - PARTITION Partc VALUES IN (3,4,7) ENGINE = MyISAM, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MyISAM, - PARTITION partE VALUES IN (16) ENGINE = MyISAM, - PARTITION Partf VALUES IN (19) ENGINE = MyISAM, - PARTITION PartG VALUES IN (22) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = MyISAM, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = MyISAM, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = MyISAM, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MyISAM, + PARTITION `partE` VALUES IN (16) ENGINE = MyISAM, + PARTITION `Partf` VALUES IN (19) ENGINE = MyISAM, + PARTITION `PartG` VALUES IN (22) ENGINE = MyISAM) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -825,12 +825,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = MyISAM, - PARTITION partB VALUES IN (2,10,11) ENGINE = MyISAM, - PARTITION Partc VALUES IN (3,4,7) ENGINE = MyISAM, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MyISAM, - PARTITION PartE VALUES IN (13) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = MyISAM, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = MyISAM, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = MyISAM, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MyISAM, + PARTITION `PartE` VALUES IN (13) ENGINE = MyISAM) # Test of REORGANIZE PARTITIONS ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO (PARTITION Partc VALUES IN (1,7) @@ -863,12 +863,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION Partc VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = MyISAM, - PARTITION parta VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = MyISAM, - PARTITION partB VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = MyISAM, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MyISAM, - PARTITION PartE VALUES IN (13) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `Partc` VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = MyISAM, + PARTITION `parta` VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = MyISAM, + PARTITION `partB` VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = MyISAM, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MyISAM, + PARTITION `PartE` VALUES IN (13) ENGINE = MyISAM) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -928,12 +928,12 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION Partc VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = MyISAM, - PARTITION parta VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = MyISAM, - PARTITION partB VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = MyISAM, - PARTITION PartD VALUES IN (5,6,12) ENGINE = MyISAM, - PARTITION PartE VALUES IN (13) ENGINE = MyISAM) + PARTITION BY LIST (`a`) +(PARTITION `Partc` VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = MyISAM, + PARTITION `parta` VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = MyISAM, + PARTITION `partB` VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = MyISAM, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = MyISAM, + PARTITION `PartE` VALUES IN (13) ENGINE = MyISAM) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -971,10 +971,10 @@ t1 CREATE TABLE `t1` ( `b` varchar(255) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM AUTO_INCREMENT=2002 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION LT1000 VALUES LESS THAN (1000) ENGINE = MyISAM, - PARTITION LT2000 VALUES LESS THAN (2000) ENGINE = MyISAM, - PARTITION MAX VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`a`) +(PARTITION `LT1000` VALUES LESS THAN (1000) ENGINE = MyISAM, + PARTITION `LT2000` VALUES LESS THAN (2000) ENGINE = MyISAM, + PARTITION `MAX` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) SELECT * FROM t1 ORDER BY a; a b 1 First diff --git a/mysql-test/suite/parts/r/partition_smallint_innodb.result b/mysql-test/suite/parts/r/partition_smallint_innodb.result index baf9255bae1..dc4ed609212 100644 --- a/mysql-test/suite/parts/r/partition_smallint_innodb.result +++ b/mysql-test/suite/parts/r/partition_smallint_innodb.result @@ -10,11 +10,11 @@ t1 CREATE TABLE `t1` ( `a` smallint(5) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) insert into t1 values (65535), (65534), (65533), (65532), (1), (2), (256); select * from t1; a @@ -46,7 +46,7 @@ t2 CREATE TABLE `t2` ( `a` smallint(5) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 8 insert into t2 values (65535), (65534), (65533), (65532); select * from t2; @@ -78,7 +78,7 @@ t3 CREATE TABLE `t3` ( `a` smallint(6) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 7 insert into t3 values (32767), (32766), (32765), (32764), (-32768), (-32767), (1), (-1), (0); select * from t3; diff --git a/mysql-test/suite/parts/r/partition_smallint_myisam.result b/mysql-test/suite/parts/r/partition_smallint_myisam.result index 57a5dbe67a7..dac160a5e8c 100644 --- a/mysql-test/suite/parts/r/partition_smallint_myisam.result +++ b/mysql-test/suite/parts/r/partition_smallint_myisam.result @@ -10,11 +10,11 @@ t1 CREATE TABLE `t1` ( `a` smallint(5) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) insert into t1 values (65535), (65534), (65533), (65532), (1), (2), (256); select * from t1; a @@ -46,7 +46,7 @@ t2 CREATE TABLE `t2` ( `a` smallint(5) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 8 insert into t2 values (65535), (65534), (65533), (65532); select * from t2; @@ -78,7 +78,7 @@ t3 CREATE TABLE `t3` ( `a` smallint(6) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 7 insert into t3 values (32767), (32766), (32765), (32764), (-32768), (-32767), (1), (-1), (0); select * from t3; diff --git a/mysql-test/suite/parts/r/partition_special_innodb.result b/mysql-test/suite/parts/r/partition_special_innodb.result index ace37228d8d..c375c2d2232 100644 --- a/mysql-test/suite/parts/r/partition_special_innodb.result +++ b/mysql-test/suite/parts/r/partition_special_innodb.result @@ -13,11 +13,11 @@ t1 CREATE TABLE `t1` ( `d` enum('m','w') NOT NULL, PRIMARY KEY (`a`,`b`,`c`,`d`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a,b,c,d) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) + PARTITION BY KEY (`a`,`b`,`c`,`d`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) insert into t1 values ('1975-01-01', 'abcde', 'abcde','m'), ('1983-12-31', 'cdef', 'srtbvsr', 'w'), @@ -55,11 +55,11 @@ t1 CREATE TABLE `t1` ( `i` char(255) DEFAULT NULL, PRIMARY KEY (`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a,b,c,d,e,f,g,h) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) + PARTITION BY KEY (`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) insert into t1 values ('1975-01-01', 'abcde', 'abcde','m', 1234, 123.45, 32412341234, 113, 'tbhth nrzh ztfghgfh fzh ftzhj fztjh'), ('1983-12-31', 'cdef', 'srtbvsr', 'w', 45634, 13452.56, 3452346456, 127, 'liuugbzvdmrlti b itiortudirtfgtibm dfi'), @@ -105,11 +105,11 @@ t1 CREATE TABLE `t1` ( `i` char(255) DEFAULT NULL, PRIMARY KEY (`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`,`a1`,`b1`,`c1`,`d1`,`e1`,`f1`,`g1`,`h1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a,b,c,d,e,f,g,h,a1,b1,c1,d1,e1,f1,g1,h1) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) + PARTITION BY KEY (`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`,`a1`,`b1`,`c1`,`d1`,`e1`,`f1`,`g1`,`h1`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) insert into t1 values ('1975-01-01', 'abcde', 'abcde','m', 1234, 123.45, 32412341234, 113,'1975-01-01', 'abcde', 'abcde','m', 1234, 123.45, 32412341234, 113, 'tbhth nrzh ztfghgfh fzh ftzhj fztjh'), ('1983-12-31', 'cdef', 'srtbvsr', 'w', 45634, 13452.56, 3452346456, 127,'1983-12-31', 'cdef', 'srtbvsr', 'w', 45634, 13452.56, 3452346456, 127, 'liuugbzvdmrlti b itiortudirtfgtibm dfi'), @@ -185,11 +185,11 @@ t1 CREATE TABLE `t1` ( `i` char(255) DEFAULT NULL, PRIMARY KEY (`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`,`a1`,`b1`,`c1`,`d1`,`e1`,`f1`,`g1`,`h1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a,b,c,d,e,f,g,h) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) + PARTITION BY KEY (`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) insert into t1 values ('1975-01-01', 'abcde', 'abcde','m', 1234, 123.45, 32412341234, 113,'1975-01-01', 'abcde', 'abcde','m', 1234, 123.45, 32412341234, 113,'1975-01-01', 'abcde', 'abcde','m', 1234, 123.45, 32412341234, 113, '1975-01-01', 'abcde', 'abcde','m', 1234, 123.45, 32412341234, 113, 'tbhth nrzh ztfghgfh fzh ftzhj fztjh'), ('1983-12-31', 'cdef', 'srtbvsr', 'w', 45634, 13452.56, 3452346456, 127,'1983-12-31', 'cdef', 'srtbvsr', 'w', 45634, 13452.56, 3452346456, 127, '1983-12-31', 'cdef', 'srtbvsr', 'w', 45634, 13452.56, 3452346456, 127, '1983-12-31', 'cdef', 'srtbvsr', 'w', 45634, 13452.56, 3452346456, 127, 'liuugbzvdmrlti b itiortudirtfgtibm dfi'), diff --git a/mysql-test/suite/parts/r/partition_special_myisam.result b/mysql-test/suite/parts/r/partition_special_myisam.result index df184e385ae..29f3f1d61b7 100644 --- a/mysql-test/suite/parts/r/partition_special_myisam.result +++ b/mysql-test/suite/parts/r/partition_special_myisam.result @@ -13,11 +13,11 @@ t1 CREATE TABLE `t1` ( `d` enum('m','w') NOT NULL, PRIMARY KEY (`a`,`b`,`c`,`d`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a,b,c,d) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) + PARTITION BY KEY (`a`,`b`,`c`,`d`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) insert into t1 values ('1975-01-01', 'abcde', 'abcde','m'), ('1983-12-31', 'cdef', 'srtbvsr', 'w'), @@ -55,11 +55,11 @@ t1 CREATE TABLE `t1` ( `i` char(255) DEFAULT NULL, PRIMARY KEY (`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a,b,c,d,e,f,g,h) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) + PARTITION BY KEY (`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) insert into t1 values ('1975-01-01', 'abcde', 'abcde','m', 1234, 123.45, 32412341234, 113, 'tbhth nrzh ztfghgfh fzh ftzhj fztjh'), ('1983-12-31', 'cdef', 'srtbvsr', 'w', 45634, 13452.56, 3452346456, 127, 'liuugbzvdmrlti b itiortudirtfgtibm dfi'), @@ -105,11 +105,11 @@ t1 CREATE TABLE `t1` ( `i` char(255) DEFAULT NULL, PRIMARY KEY (`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`,`a1`,`b1`,`c1`,`d1`,`e1`,`f1`,`g1`,`h1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a,b,c,d,e,f,g,h,a1,b1,c1,d1,e1,f1,g1,h1) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) + PARTITION BY KEY (`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`,`a1`,`b1`,`c1`,`d1`,`e1`,`f1`,`g1`,`h1`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) insert into t1 values ('1975-01-01', 'abcde', 'abcde','m', 1234, 123.45, 32412341234, 113,'1975-01-01', 'abcde', 'abcde','m', 1234, 123.45, 32412341234, 113, 'tbhth nrzh ztfghgfh fzh ftzhj fztjh'), ('1983-12-31', 'cdef', 'srtbvsr', 'w', 45634, 13452.56, 3452346456, 127,'1983-12-31', 'cdef', 'srtbvsr', 'w', 45634, 13452.56, 3452346456, 127, 'liuugbzvdmrlti b itiortudirtfgtibm dfi'), @@ -185,11 +185,11 @@ t1 CREATE TABLE `t1` ( `i` char(255) DEFAULT NULL, PRIMARY KEY (`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`,`a1`,`b1`,`c1`,`d1`,`e1`,`f1`,`g1`,`h1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a,b,c,d,e,f,g,h) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) + PARTITION BY KEY (`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) insert into t1 values ('1975-01-01', 'abcde', 'abcde','m', 1234, 123.45, 32412341234, 113,'1975-01-01', 'abcde', 'abcde','m', 1234, 123.45, 32412341234, 113,'1975-01-01', 'abcde', 'abcde','m', 1234, 123.45, 32412341234, 113, '1975-01-01', 'abcde', 'abcde','m', 1234, 123.45, 32412341234, 113, 'tbhth nrzh ztfghgfh fzh ftzhj fztjh'), ('1983-12-31', 'cdef', 'srtbvsr', 'w', 45634, 13452.56, 3452346456, 127,'1983-12-31', 'cdef', 'srtbvsr', 'w', 45634, 13452.56, 3452346456, 127, '1983-12-31', 'cdef', 'srtbvsr', 'w', 45634, 13452.56, 3452346456, 127, '1983-12-31', 'cdef', 'srtbvsr', 'w', 45634, 13452.56, 3452346456, 127, 'liuugbzvdmrlti b itiortudirtfgtibm dfi'), diff --git a/mysql-test/suite/parts/r/partition_syntax_innodb.result b/mysql-test/suite/parts/r/partition_syntax_innodb.result index f8de7ca5249..ff1ca17bd5d 100644 --- a/mysql-test/suite/parts/r/partition_syntax_innodb.result +++ b/mysql-test/suite/parts/r/partition_syntax_innodb.result @@ -658,9 +658,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,2)) -(PARTITION part1 VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part3 VALUES IN (1) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 2) +(PARTITION `part1` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (1) ENGINE = InnoDB) DROP TABLE t1; # 3.5.3 Reveal that IN (...NULL) is not mapped to IN(0) @@ -685,10 +685,10 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,2)) -(PARTITION part1 VALUES IN (NULL) ENGINE = InnoDB, - PARTITION part2 VALUES IN (0) ENGINE = InnoDB, - PARTITION part3 VALUES IN (1) ENGINE = InnoDB) + PARTITION BY LIST (`f_int1` % 2) +(PARTITION `part1` VALUES IN (NULL) ENGINE = InnoDB, + PARTITION `part2` VALUES IN (0) ENGINE = InnoDB, + PARTITION `part3` VALUES IN (1) ENGINE = InnoDB) DROP TABLE t1; @@ -719,7 +719,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) DROP TABLE t1; # 4.1.2 no partition number, named partitions @@ -741,9 +741,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part1 ENGINE = InnoDB, - PARTITION part2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part1` ENGINE = InnoDB, + PARTITION `part2` ENGINE = InnoDB) DROP TABLE t1; # 4.1.3 variations on no partition/subpartition number, named partitions, @@ -826,17 +826,17 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (10) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (20) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB), - PARTITION part3 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart31 ENGINE = InnoDB, - SUBPARTITION subpart32 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (10) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (20) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB), + PARTITION `part3` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart31` ENGINE = InnoDB, + SUBPARTITION `subpart32` ENGINE = InnoDB)) DROP TABLE t1; #------------------------------------------------------------------------ @@ -862,7 +862,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 DROP TABLE t1; @@ -887,11 +887,11 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part1 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part2 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part1` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part2` VALUES LESS THAN (2147483646) ENGINE = InnoDB) DROP TABLE t1; CREATE TABLE t1 ( @@ -912,7 +912,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 1 DROP TABLE t1; @@ -937,11 +937,11 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 1 -(PARTITION part1 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION part2 VALUES LESS THAN (2147483646) ENGINE = InnoDB) +(PARTITION `part1` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `part2` VALUES LESS THAN (2147483646) ENGINE = InnoDB) DROP TABLE t1; CREATE TABLE t1 ( @@ -1681,9 +1681,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part1 ENGINE = InnoDB, - PARTITION part2 ENGINE = InnoDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part1` ENGINE = InnoDB, + PARTITION `part2` ENGINE = InnoDB) DROP TABLE t1; CREATE TABLE t1 ( @@ -1710,14 +1710,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (1000) - (SUBPARTITION subpart11 ENGINE = InnoDB, - SUBPARTITION subpart12 ENGINE = InnoDB), - PARTITION part2 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart21 ENGINE = InnoDB, - SUBPARTITION subpart22 ENGINE = InnoDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (1000) + (SUBPARTITION `subpart11` ENGINE = InnoDB, + SUBPARTITION `subpart12` ENGINE = InnoDB), + PARTITION `part2` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart21` ENGINE = InnoDB, + SUBPARTITION `subpart22` ENGINE = InnoDB)) DROP TABLE t1; # 4.3.2 (positive) number of partition/subpartition , diff --git a/mysql-test/suite/parts/r/partition_syntax_myisam.result b/mysql-test/suite/parts/r/partition_syntax_myisam.result index e7ae727ea02..b54591fe538 100644 --- a/mysql-test/suite/parts/r/partition_syntax_myisam.result +++ b/mysql-test/suite/parts/r/partition_syntax_myisam.result @@ -658,9 +658,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,2)) -(PARTITION part1 VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part3 VALUES IN (1) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 2) +(PARTITION `part1` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (1) ENGINE = MyISAM) unified filelist t1#P#part1.MYD @@ -693,10 +693,10 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,2)) -(PARTITION part1 VALUES IN (NULL) ENGINE = MyISAM, - PARTITION part2 VALUES IN (0) ENGINE = MyISAM, - PARTITION part3 VALUES IN (1) ENGINE = MyISAM) + PARTITION BY LIST (`f_int1` % 2) +(PARTITION `part1` VALUES IN (NULL) ENGINE = MyISAM, + PARTITION `part2` VALUES IN (0) ENGINE = MyISAM, + PARTITION `part3` VALUES IN (1) ENGINE = MyISAM) unified filelist t1#P#part1.MYD @@ -737,7 +737,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) unified filelist t1#P#p0.MYD @@ -765,9 +765,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part1 ENGINE = MyISAM, - PARTITION part2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part1` ENGINE = MyISAM, + PARTITION `part2` ENGINE = MyISAM) unified filelist t1#P#part1.MYD @@ -858,17 +858,17 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (10) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (20) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM), - PARTITION part3 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart31 ENGINE = MyISAM, - SUBPARTITION subpart32 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (10) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (20) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM), + PARTITION `part3` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart31` ENGINE = MyISAM, + SUBPARTITION `subpart32` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD @@ -910,7 +910,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -943,11 +943,11 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part1 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part2 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part1` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part2` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -980,7 +980,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 1 unified filelist @@ -1011,11 +1011,11 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 1 -(PARTITION part1 VALUES LESS THAN (10) ENGINE = MyISAM, - PARTITION part2 VALUES LESS THAN (2147483646) ENGINE = MyISAM) +(PARTITION `part1` VALUES LESS THAN (10) ENGINE = MyISAM, + PARTITION `part2` VALUES LESS THAN (2147483646) ENGINE = MyISAM) unified filelist t1#P#part1#SP#part1sp0.MYD @@ -1763,9 +1763,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part1 ENGINE = MyISAM, - PARTITION part2 ENGINE = MyISAM) + PARTITION BY HASH (`f_int1`) +(PARTITION `part1` ENGINE = MyISAM, + PARTITION `part2` ENGINE = MyISAM) unified filelist t1#P#part1.MYD @@ -1800,14 +1800,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (1000) - (SUBPARTITION subpart11 ENGINE = MyISAM, - SUBPARTITION subpart12 ENGINE = MyISAM), - PARTITION part2 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart21 ENGINE = MyISAM, - SUBPARTITION subpart22 ENGINE = MyISAM)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (1000) + (SUBPARTITION `subpart11` ENGINE = MyISAM, + SUBPARTITION `subpart12` ENGINE = MyISAM), + PARTITION `part2` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart21` ENGINE = MyISAM, + SUBPARTITION `subpart22` ENGINE = MyISAM)) unified filelist t1#P#part1#SP#subpart11.MYD diff --git a/mysql-test/suite/parts/r/partition_tinyint_innodb.result b/mysql-test/suite/parts/r/partition_tinyint_innodb.result index a607b29a78a..19f0e2c57c4 100644 --- a/mysql-test/suite/parts/r/partition_tinyint_innodb.result +++ b/mysql-test/suite/parts/r/partition_tinyint_innodb.result @@ -10,11 +10,11 @@ t1 CREATE TABLE `t1` ( `a` tinyint(3) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = InnoDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = InnoDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = InnoDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = InnoDB) insert into t1 values (255), (254), (253), (252), (1), (2), (128); select * from t1; a @@ -46,7 +46,7 @@ t2 CREATE TABLE `t2` ( `a` tinyint(3) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 8 insert into t2 values (255), (254), (253), (252); select * from t2; @@ -78,7 +78,7 @@ t3 CREATE TABLE `t3` ( `a` tinyint(4) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 7 insert into t3 values (127), (126), (125), (124), (-128), (-127), (1), (-1), (0); select * from t3; diff --git a/mysql-test/suite/parts/r/partition_tinyint_myisam.result b/mysql-test/suite/parts/r/partition_tinyint_myisam.result index dded4068b11..9ad4927697d 100644 --- a/mysql-test/suite/parts/r/partition_tinyint_myisam.result +++ b/mysql-test/suite/parts/r/partition_tinyint_myisam.result @@ -10,11 +10,11 @@ t1 CREATE TABLE `t1` ( `a` tinyint(3) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = MyISAM, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = MyISAM, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = MyISAM, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = MyISAM) insert into t1 values (255), (254), (253), (252), (1), (2), (128); select * from t1; a @@ -46,7 +46,7 @@ t2 CREATE TABLE `t2` ( `a` tinyint(3) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 8 insert into t2 values (255), (254), (253), (252); select * from t2; @@ -78,7 +78,7 @@ t3 CREATE TABLE `t3` ( `a` tinyint(4) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 7 insert into t3 values (127), (126), (125), (124), (-128), (-127), (1), (-1), (0); select * from t3; diff --git a/mysql-test/suite/parts/r/quoting.result b/mysql-test/suite/parts/r/quoting.result new file mode 100644 index 00000000000..66606832e77 --- /dev/null +++ b/mysql-test/suite/parts/r/quoting.result @@ -0,0 +1,93 @@ +set sql_mode=ansi_quotes; +create table t1 ("select" int) partition by range ("select") (partition "select" values less than maxvalue); +create table t2 (f1 int) partition by range (f1) (partition p1 values less than maxvalue); +show create table t1; +Table Create Table +t1 CREATE TABLE "t1" ( + "select" int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 + PARTITION BY RANGE ("select") +(PARTITION "select" VALUES LESS THAN MAXVALUE ENGINE = MyISAM) +show create table t2; +Table Create Table +t2 CREATE TABLE "t2" ( + "f1" int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 + PARTITION BY RANGE ("f1") +(PARTITION "p1" VALUES LESS THAN MAXVALUE ENGINE = MyISAM) +set sql_quote_show_create=0; +show create table t1; +Table Create Table +t1 CREATE TABLE t1 ( + "select" int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 + PARTITION BY RANGE ("select") +(PARTITION "select" VALUES LESS THAN MAXVALUE ENGINE = MyISAM) +show create table t2; +Table Create Table +t2 CREATE TABLE t2 ( + f1 int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 + PARTITION BY RANGE (f1) +(PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) +set sql_mode=default; +show create table t1; +Table Create Table +t1 CREATE TABLE t1 ( + `select` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 + PARTITION BY RANGE (`select`) +(PARTITION `select` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) +show create table t2; +Table Create Table +t2 CREATE TABLE t2 ( + f1 int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 + PARTITION BY RANGE (f1) +(PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) +set sql_quote_show_create=1; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `select` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 + PARTITION BY RANGE (`select`) +(PARTITION `select` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `f1` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 + PARTITION BY RANGE (`f1`) +(PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) +flush tables; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `select` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 + PARTITION BY RANGE (`select`) +(PARTITION `select` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `f1` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 + PARTITION BY RANGE (`f1`) +(PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) +set sql_mode=ansi_quotes; +show create table t1; +Table Create Table +t1 CREATE TABLE "t1" ( + "select" int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 + PARTITION BY RANGE ("select") +(PARTITION "select" VALUES LESS THAN MAXVALUE ENGINE = MyISAM) +show create table t2; +Table Create Table +t2 CREATE TABLE "t2" ( + "f1" int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 + PARTITION BY RANGE ("f1") +(PARTITION "p1" VALUES LESS THAN MAXVALUE ENGINE = MyISAM) +drop table t1, t2; diff --git a/mysql-test/suite/parts/r/rpl_partition.result b/mysql-test/suite/parts/r/rpl_partition.result index 0afe1cb478d..480ab219c34 100644 --- a/mysql-test/suite/parts/r/rpl_partition.result +++ b/mysql-test/suite/parts/r/rpl_partition.result @@ -135,20 +135,20 @@ Create Table CREATE TABLE `t3` ( `filler` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (id) -SUBPARTITION BY HASH (id) + PARTITION BY RANGE (`id`) +SUBPARTITION BY HASH (`id`) SUBPARTITIONS 2 -(PARTITION pa1 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION pa2 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION pa3 VALUES LESS THAN (30) ENGINE = InnoDB, - PARTITION pa4 VALUES LESS THAN (40) ENGINE = InnoDB, - PARTITION pa5 VALUES LESS THAN (50) ENGINE = InnoDB, - PARTITION pa6 VALUES LESS THAN (60) ENGINE = InnoDB, - PARTITION pa7 VALUES LESS THAN (70) ENGINE = InnoDB, - PARTITION pa8 VALUES LESS THAN (80) ENGINE = InnoDB, - PARTITION pa9 VALUES LESS THAN (90) ENGINE = InnoDB, - PARTITION pa10 VALUES LESS THAN (100) ENGINE = InnoDB, - PARTITION pa11 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) +(PARTITION `pa1` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `pa2` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `pa3` VALUES LESS THAN (30) ENGINE = InnoDB, + PARTITION `pa4` VALUES LESS THAN (40) ENGINE = InnoDB, + PARTITION `pa5` VALUES LESS THAN (50) ENGINE = InnoDB, + PARTITION `pa6` VALUES LESS THAN (60) ENGINE = InnoDB, + PARTITION `pa7` VALUES LESS THAN (70) ENGINE = InnoDB, + PARTITION `pa8` VALUES LESS THAN (80) ENGINE = InnoDB, + PARTITION `pa9` VALUES LESS THAN (90) ENGINE = InnoDB, + PARTITION `pa10` VALUES LESS THAN (100) ENGINE = InnoDB, + PARTITION `pa11` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) include/check_slave_is_running.inc SELECT count(*) "Slave norm" FROM t1; Slave norm 500 diff --git a/mysql-test/suite/parts/t/longname.test b/mysql-test/suite/parts/t/longname.test new file mode 100644 index 00000000000..0f7378ef8e3 --- /dev/null +++ b/mysql-test/suite/parts/t/longname.test @@ -0,0 +1,32 @@ +source include/have_innodb.inc; +source include/have_partition.inc; +set names utf8; + +create database mysqltest1; +select database_name, table_name, length(table_name) from mysql.innodb_table_stats where database_name = 'mysqltest1'; +CREATE TABLE mysqltest1.test_jfg_table_name_with_64_chars_123456789012345678901234567890 ( + id int(10) unsigned NOT NULL, + id2 int(10) unsigned NOT NULL, + PRIMARY KEY ( id, id2 ) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC +PARTITION BY RANGE ( id ) + SUBPARTITION BY HASH ( id2 ) + SUBPARTITIONS 2 ( + PARTITION test_jfg_partition_name_with_60_chars_1234567890123456789012 VALUES LESS THAN (1000) ENGINE = InnoDB, + PARTITION pmax VALUES LESS THAN MAXVALUE ENGINE = InnoDB); + +select database_name, table_name, length(table_name) from mysql.innodb_table_stats where database_name = 'mysqltest1'; + +--error ER_PATH_LENGTH +CREATE TABLE mysqltest1.éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé ( + id int(10) unsigned NOT NULL, + id2 int(10) unsigned NOT NULL, + PRIMARY KEY ( id, id2 ) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC +PARTITION BY RANGE ( id ) + SUBPARTITION BY HASH ( id2 ) + SUBPARTITIONS 2 ( + PARTITION çççççççççççççççççççççççççççççççççççççççççççççççççççççççççççç VALUES LESS THAN (1000) ENGINE = InnoDB, + PARTITION pmax VALUES LESS THAN MAXVALUE ENGINE = InnoDB); + +drop database mysqltest1; diff --git a/mysql-test/suite/parts/t/quoting.test b/mysql-test/suite/parts/t/quoting.test new file mode 100644 index 00000000000..61af8d2d345 --- /dev/null +++ b/mysql-test/suite/parts/t/quoting.test @@ -0,0 +1,32 @@ +# +# MDEV-13089 identifier quoting in partitioning +# +source include/have_partition.inc; +set sql_mode=ansi_quotes; +create table t1 ("select" int) partition by range ("select") (partition "select" values less than maxvalue); +create table t2 (f1 int) partition by range (f1) (partition p1 values less than maxvalue); +# "select", "f1", "p1" +show create table t1; +show create table t2; +set sql_quote_show_create=0; +# "select", f1, p1 +show create table t1; +show create table t2; +set sql_mode=default; +# `select`, f1, p1 +show create table t1; +show create table t2; +set sql_quote_show_create=1; +# `select`, `f1`, `p1` +show create table t1; +show create table t2; +# re-parse +flush tables; +# `select`, `f1`, `p1` +show create table t1; +show create table t2; +set sql_mode=ansi_quotes; +# "select", "f1", "p1" +show create table t1; +show create table t2; +drop table t1, t2; diff --git a/mysql-test/suite/perfschema/r/bad_option_2.result b/mysql-test/suite/perfschema/r/bad_option_2.result index d8fda2af3b6..7a5ab31aabd 100644 --- a/mysql-test/suite/perfschema/r/bad_option_2.result +++ b/mysql-test/suite/perfschema/r/bad_option_2.result @@ -1 +1 @@ -Found: ambiguous option '--performance-schema-max_=12' +FOUND 1 /ambiguous option '--performance-schema-max_=12'/ in bad_option_2.txt diff --git a/mysql-test/suite/perfschema/r/misc.result b/mysql-test/suite/perfschema/r/misc.result index 2adf2cba851..f2d40fe90b5 100644 --- a/mysql-test/suite/perfschema/r/misc.result +++ b/mysql-test/suite/perfschema/r/misc.result @@ -42,12 +42,12 @@ AND EVENT_NAME IN WHERE NAME LIKE "wait/synch/%") LIMIT 1; create table test.t1(a int) engine=performance_schema; -ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by database") +ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by the engine") SELECT object_schema, object_name FROM performance_schema.objects_summary_global_by_type WHERE object_schema='test'; object_schema object_name create table test.t1 like performance_schema.events_waits_current; -ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by database") +ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by the engine") SELECT object_schema, object_name FROM performance_schema.objects_summary_global_by_type WHERE object_schema='test'; object_schema object_name diff --git a/mysql-test/suite/perfschema/r/part_table_io.result b/mysql-test/suite/perfschema/r/part_table_io.result index 1958801d8d2..4f2bd7169d7 100644 --- a/mysql-test/suite/perfschema/r/part_table_io.result +++ b/mysql-test/suite/perfschema/r/part_table_io.result @@ -20,7 +20,7 @@ no_index_tab CREATE TABLE `no_index_tab` ( `a` varchar(255) NOT NULL, `b` int(11) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (b) + PARTITION BY KEY (`b`) PARTITIONS 2 insert into marker set a = 1; insert into test.no_index_tab set a = 'foo', b = 1; diff --git a/mysql-test/suite/perfschema/r/privilege.result b/mysql-test/suite/perfschema/r/privilege.result index 09d32a177fd..7bb7627142e 100644 --- a/mysql-test/suite/perfschema/r/privilege.result +++ b/mysql-test/suite/perfschema/r/privilege.result @@ -155,13 +155,13 @@ before insert on performance_schema.file_instances for each row begin end; ERROR 42000: Access denied for user 'root'@'localhost' to database 'performance_schema' create table test.t1(a int) engine=PERFORMANCE_SCHEMA; -ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by database") +ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by the engine") create table test.t1 like performance_schema.setup_instruments; -ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by database") +ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by the engine") create table test.t1 like performance_schema.events_waits_current; -ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by database") +ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by the engine") create table test.t1 like performance_schema.file_instances; -ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by database") +ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by the engine") insert into performance_schema.setup_instruments set name="foo"; ERROR 42000: INSERT command denied to user 'root'@'localhost' for table 'setup_instruments' @@ -254,13 +254,13 @@ before insert on performance_schema.file_instances for each row begin end; ERROR 42000: Access denied for user 'pfs_user_1'@'localhost' to database 'performance_schema' create table test.t1(a int) engine=PERFORMANCE_SCHEMA; -ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by database") +ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by the engine") create table test.t1 like performance_schema.setup_instruments; -ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by database") +ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by the engine") create table test.t1 like performance_schema.events_waits_current; -ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by database") +ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by the engine") create table test.t1 like performance_schema.file_instances; -ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by database") +ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by the engine") insert into performance_schema.setup_instruments set name="foo"; ERROR 42000: INSERT command denied to user 'pfs_user_1'@'localhost' for table 'setup_instruments' @@ -354,13 +354,13 @@ before insert on performance_schema.file_instances for each row begin end; ERROR 42000: Access denied for user 'pfs_user_2'@'localhost' to database 'performance_schema' create table test.t1(a int) engine=PERFORMANCE_SCHEMA; -ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by database") +ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by the engine") create table test.t1 like performance_schema.setup_instruments; -ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by database") +ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by the engine") create table test.t1 like performance_schema.events_waits_current; -ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by database") +ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by the engine") create table test.t1 like performance_schema.file_instances; -ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by database") +ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by the engine") insert into performance_schema.setup_instruments set name="foo"; ERROR 42000: INSERT command denied to user 'pfs_user_2'@'localhost' for table 'setup_instruments' @@ -454,13 +454,13 @@ before insert on performance_schema.file_instances for each row begin end; ERROR 42000: Access denied for user 'pfs_user_3'@'localhost' to database 'performance_schema' create table test.t1(a int) engine=PERFORMANCE_SCHEMA; -ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by database") +ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by the engine") create table test.t1 like performance_schema.setup_instruments; -ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by database") +ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by the engine") create table test.t1 like performance_schema.events_waits_current; -ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by database") +ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by the engine") create table test.t1 like performance_schema.file_instances; -ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by database") +ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by the engine") insert into performance_schema.setup_instruments set name="foo"; ERROR 42000: INSERT command denied to user 'pfs_user_3'@'localhost' for table 'setup_instruments' diff --git a/mysql-test/suite/perfschema/r/privilege_table_io.result b/mysql-test/suite/perfschema/r/privilege_table_io.result index ea5fb2bc703..b1bc1857b52 100644 --- a/mysql-test/suite/perfschema/r/privilege_table_io.result +++ b/mysql-test/suite/perfschema/r/privilege_table_io.result @@ -12,6 +12,7 @@ optimize table mysql.host; optimize table mysql.user; optimize table mysql.db; optimize table mysql.proxies_priv; +optimize table mysql.roles_mapping; optimize table mysql.tables_priv; optimize table mysql.procs_priv; optimize table mysql.servers; diff --git a/mysql-test/suite/perfschema/r/start_server_1_digest.result b/mysql-test/suite/perfschema/r/start_server_1_digest.result new file mode 100644 index 00000000000..cf07022d344 --- /dev/null +++ b/mysql-test/suite/perfschema/r/start_server_1_digest.result @@ -0,0 +1,7 @@ +SELECT "Digest table has a size 1 and is full already." as use_case; +use_case +Digest table has a size 1 and is full already. +select SCHEMA_NAME, DIGEST, DIGEST_TEXT +from performance_schema.events_statements_summary_by_digest; +SCHEMA_NAME DIGEST DIGEST_TEXT +NULL NULL NULL diff --git a/mysql-test/suite/perfschema/r/table_schema.result b/mysql-test/suite/perfschema/r/table_schema.result index 15d552ad50b..5c4cf88e9a5 100644 --- a/mysql-test/suite/perfschema/r/table_schema.result +++ b/mysql-test/suite/perfschema/r/table_schema.result @@ -246,8 +246,8 @@ def performance_schema events_statements_summary_by_digest SUM_SORT_ROWS 24 NULL def performance_schema events_statements_summary_by_digest SUM_SORT_SCAN 25 NULL NO bigint NULL NULL 20 0 NULL NULL NULL bigint(20) unsigned select,insert,update,references NEVER NULL def performance_schema events_statements_summary_by_digest SUM_NO_INDEX_USED 26 NULL NO bigint NULL NULL 20 0 NULL NULL NULL bigint(20) unsigned select,insert,update,references NEVER NULL def performance_schema events_statements_summary_by_digest SUM_NO_GOOD_INDEX_USED 27 NULL NO bigint NULL NULL 20 0 NULL NULL NULL bigint(20) unsigned select,insert,update,references NEVER NULL -def performance_schema events_statements_summary_by_digest FIRST_SEEN 28 0000-00-00 00:00:00 NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL -def performance_schema events_statements_summary_by_digest LAST_SEEN 29 0000-00-00 00:00:00 NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL +def performance_schema events_statements_summary_by_digest FIRST_SEEN 28 '0000-00-00 00:00:00' NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL +def performance_schema events_statements_summary_by_digest LAST_SEEN 29 '0000-00-00 00:00:00' NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL def performance_schema events_statements_summary_by_host_by_event_name HOST 1 NULL YES char 60 180 NULL NULL NULL utf8 utf8_bin char(60) select,insert,update,references NEVER NULL def performance_schema events_statements_summary_by_host_by_event_name EVENT_NAME 2 NULL NO varchar 128 384 NULL NULL NULL utf8 utf8_general_ci varchar(128) select,insert,update,references NEVER NULL def performance_schema events_statements_summary_by_host_by_event_name COUNT_STAR 3 NULL NO bigint NULL NULL 20 0 NULL NULL NULL bigint(20) unsigned select,insert,update,references NEVER NULL @@ -529,10 +529,10 @@ def performance_schema host_cache COUNT_DEFAULT_DATABASE_ERRORS 22 NULL NO bigin def performance_schema host_cache COUNT_INIT_CONNECT_ERRORS 23 NULL NO bigint NULL NULL 19 0 NULL NULL NULL bigint(20) select,insert,update,references NEVER NULL def performance_schema host_cache COUNT_LOCAL_ERRORS 24 NULL NO bigint NULL NULL 19 0 NULL NULL NULL bigint(20) select,insert,update,references NEVER NULL def performance_schema host_cache COUNT_UNKNOWN_ERRORS 25 NULL NO bigint NULL NULL 19 0 NULL NULL NULL bigint(20) select,insert,update,references NEVER NULL -def performance_schema host_cache FIRST_SEEN 26 0000-00-00 00:00:00 NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL -def performance_schema host_cache LAST_SEEN 27 0000-00-00 00:00:00 NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL -def performance_schema host_cache FIRST_ERROR_SEEN 28 0000-00-00 00:00:00 YES timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL -def performance_schema host_cache LAST_ERROR_SEEN 29 0000-00-00 00:00:00 YES timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL +def performance_schema host_cache FIRST_SEEN 26 '0000-00-00 00:00:00' NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL +def performance_schema host_cache LAST_SEEN 27 '0000-00-00 00:00:00' NO timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL +def performance_schema host_cache FIRST_ERROR_SEEN 28 '0000-00-00 00:00:00' YES timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL +def performance_schema host_cache LAST_ERROR_SEEN 29 '0000-00-00 00:00:00' YES timestamp NULL NULL NULL NULL 0 NULL NULL timestamp select,insert,update,references NEVER NULL def performance_schema mutex_instances NAME 1 NULL NO varchar 128 384 NULL NULL NULL utf8 utf8_general_ci varchar(128) select,insert,update,references NEVER NULL def performance_schema mutex_instances OBJECT_INSTANCE_BEGIN 2 NULL NO bigint NULL NULL 20 0 NULL NULL NULL bigint(20) unsigned select,insert,update,references NEVER NULL def performance_schema mutex_instances LOCKED_BY_THREAD_ID 3 NULL YES bigint NULL NULL 20 0 NULL NULL NULL bigint(20) unsigned select,insert,update,references NEVER NULL @@ -560,19 +560,19 @@ def performance_schema session_connect_attrs PROCESSLIST_ID 1 NULL NO int NULL N def performance_schema session_connect_attrs ATTR_NAME 2 NULL NO varchar 32 96 NULL NULL NULL utf8 utf8_bin varchar(32) select,insert,update,references NEVER NULL def performance_schema session_connect_attrs ATTR_VALUE 3 NULL YES varchar 1024 3072 NULL NULL NULL utf8 utf8_bin varchar(1024) select,insert,update,references NEVER NULL def performance_schema session_connect_attrs ORDINAL_POSITION 4 NULL YES int NULL NULL 10 0 NULL NULL NULL int(11) select,insert,update,references NEVER NULL -def performance_schema setup_actors HOST 1 % NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) select,insert,update,references NEVER NULL -def performance_schema setup_actors USER 2 % NO char 16 48 NULL NULL NULL utf8 utf8_bin char(16) select,insert,update,references NEVER NULL -def performance_schema setup_actors ROLE 3 % NO char 16 48 NULL NULL NULL utf8 utf8_bin char(16) select,insert,update,references NEVER NULL +def performance_schema setup_actors HOST 1 '%' NO char 60 180 NULL NULL NULL utf8 utf8_bin char(60) select,insert,update,references NEVER NULL +def performance_schema setup_actors USER 2 '%' NO char 16 48 NULL NULL NULL utf8 utf8_bin char(16) select,insert,update,references NEVER NULL +def performance_schema setup_actors ROLE 3 '%' NO char 16 48 NULL NULL NULL utf8 utf8_bin char(16) select,insert,update,references NEVER NULL def performance_schema setup_consumers NAME 1 NULL NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select,insert,update,references NEVER NULL def performance_schema setup_consumers ENABLED 2 NULL NO enum 3 9 NULL NULL NULL utf8 utf8_general_ci enum('YES','NO') select,insert,update,references NEVER NULL def performance_schema setup_instruments NAME 1 NULL NO varchar 128 384 NULL NULL NULL utf8 utf8_general_ci varchar(128) select,insert,update,references NEVER NULL def performance_schema setup_instruments ENABLED 2 NULL NO enum 3 9 NULL NULL NULL utf8 utf8_general_ci enum('YES','NO') select,insert,update,references NEVER NULL def performance_schema setup_instruments TIMED 3 NULL NO enum 3 9 NULL NULL NULL utf8 utf8_general_ci enum('YES','NO') select,insert,update,references NEVER NULL -def performance_schema setup_objects OBJECT_TYPE 1 TABLE NO enum 5 15 NULL NULL NULL utf8 utf8_general_ci enum('TABLE') select,insert,update,references NEVER NULL -def performance_schema setup_objects OBJECT_SCHEMA 2 % YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select,insert,update,references NEVER NULL -def performance_schema setup_objects OBJECT_NAME 3 % NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select,insert,update,references NEVER NULL -def performance_schema setup_objects ENABLED 4 YES NO enum 3 9 NULL NULL NULL utf8 utf8_general_ci enum('YES','NO') select,insert,update,references NEVER NULL -def performance_schema setup_objects TIMED 5 YES NO enum 3 9 NULL NULL NULL utf8 utf8_general_ci enum('YES','NO') select,insert,update,references NEVER NULL +def performance_schema setup_objects OBJECT_TYPE 1 'TABLE' NO enum 5 15 NULL NULL NULL utf8 utf8_general_ci enum('TABLE') select,insert,update,references NEVER NULL +def performance_schema setup_objects OBJECT_SCHEMA 2 '%' YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select,insert,update,references NEVER NULL +def performance_schema setup_objects OBJECT_NAME 3 '%' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select,insert,update,references NEVER NULL +def performance_schema setup_objects ENABLED 4 'YES' NO enum 3 9 NULL NULL NULL utf8 utf8_general_ci enum('YES','NO') select,insert,update,references NEVER NULL +def performance_schema setup_objects TIMED 5 'YES' NO enum 3 9 NULL NULL NULL utf8 utf8_general_ci enum('YES','NO') select,insert,update,references NEVER NULL def performance_schema setup_timers NAME 1 NULL NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select,insert,update,references NEVER NULL def performance_schema setup_timers TIMER_NAME 2 NULL NO enum 11 33 NULL NULL NULL utf8 utf8_general_ci enum('CYCLE','NANOSECOND','MICROSECOND','MILLISECOND','TICK') select,insert,update,references NEVER NULL def performance_schema socket_instances EVENT_NAME 1 NULL NO varchar 128 384 NULL NULL NULL utf8 utf8_general_ci varchar(128) select,insert,update,references NEVER NULL diff --git a/mysql-test/suite/perfschema/t/bad_option_2.test b/mysql-test/suite/perfschema/t/bad_option_2.test index 175767bb9f2..ce3e5c3243b 100644 --- a/mysql-test/suite/perfschema/t/bad_option_2.test +++ b/mysql-test/suite/perfschema/t/bad_option_2.test @@ -8,26 +8,9 @@ let $outfile= $MYSQLTEST_VARDIR/tmp/bad_option_2.txt; --error 0,1 --remove_file $outfile --error 3 ---exec $MYSQLD_BOOTSTRAP_CMD --loose-console --performance-schema-max_=12 > $outfile 2>&1 - -perl; - use strict; - use warnings; - my $fname= "$ENV{'MYSQLTEST_VARDIR'}/tmp/bad_option_2.txt"; - open(FILE, "<", $fname) or die; - my @lines= ; - # those must be in the file for the test to pass - my @patterns= - ("ambiguous option '--performance-schema-max_=12'"); - foreach my $one_line (@lines) - { - foreach my $one_pattern (@patterns) - { - # print pattern, not line, to get a stable output - print "Found: $one_pattern\n" if ($one_line =~ /$one_pattern/); - } - } - close FILE; -EOF +--exec $MYSQLD_BOOTSTRAP_CMD --loose-console --enable-getopt-prefix-matching --performance-schema-max_=12 > $outfile 2>&1 +--let SEARCH_PATTERN=ambiguous option '--performance-schema-max_=12' +--let SEARCH_FILE=$outfile +--source include/search_pattern_in_file.inc --remove_file $outfile diff --git a/mysql-test/suite/perfschema/t/privilege_table_io.test b/mysql-test/suite/perfschema/t/privilege_table_io.test index 8f06be5075e..6f729537072 100644 --- a/mysql-test/suite/perfschema/t/privilege_table_io.test +++ b/mysql-test/suite/perfschema/t/privilege_table_io.test @@ -21,6 +21,7 @@ optimize table mysql.host; optimize table mysql.user; optimize table mysql.db; optimize table mysql.proxies_priv; +optimize table mysql.roles_mapping; optimize table mysql.tables_priv; optimize table mysql.procs_priv; optimize table mysql.servers; diff --git a/mysql-test/suite/perfschema/t/start_server_1_digest-master.opt b/mysql-test/suite/perfschema/t/start_server_1_digest-master.opt new file mode 100644 index 00000000000..c3a6012fbac --- /dev/null +++ b/mysql-test/suite/perfschema/t/start_server_1_digest-master.opt @@ -0,0 +1 @@ +--loose-performance-schema-digests-size=1 diff --git a/mysql-test/suite/perfschema/t/start_server_1_digest.test b/mysql-test/suite/perfschema/t/start_server_1_digest.test new file mode 100644 index 00000000000..998d9a5eebe --- /dev/null +++ b/mysql-test/suite/perfschema/t/start_server_1_digest.test @@ -0,0 +1,15 @@ +# ----------------------------------------------------------------------- +# Tests for the performance schema statement Digests. +# ----------------------------------------------------------------------- + +--source include/not_embedded.inc +--source include/have_perfschema.inc +--source include/no_protocol.inc + +SELECT "Digest table has a size 1 and is full already." as use_case; + +select SCHEMA_NAME, DIGEST, DIGEST_TEXT + from performance_schema.events_statements_summary_by_digest; + + + diff --git a/mysql-test/suite/plugins/r/auth_ed25519.result b/mysql-test/suite/plugins/r/auth_ed25519.result index 5c5581d37b0..1baec60da40 100644 --- a/mysql-test/suite/plugins/r/auth_ed25519.result +++ b/mysql-test/suite/plugins/r/auth_ed25519.result @@ -27,7 +27,7 @@ PLUGIN_STATUS ACTIVE PLUGIN_TYPE AUTHENTICATION PLUGIN_TYPE_VERSION 2.1 PLUGIN_LIBRARY auth_ed25519.so -PLUGIN_LIBRARY_VERSION 1.12 +PLUGIN_LIBRARY_VERSION 1.13 PLUGIN_AUTHOR Sergei Golubchik PLUGIN_DESCRIPTION Elliptic curve ED25519 based authentication PLUGIN_LICENSE GPL diff --git a/mysql-test/suite/plugins/r/cracklib_password_check.result b/mysql-test/suite/plugins/r/cracklib_password_check.result index 479b4b00698..6b4e30b3d81 100644 --- a/mysql-test/suite/plugins/r/cracklib_password_check.result +++ b/mysql-test/suite/plugins/r/cracklib_password_check.result @@ -6,7 +6,7 @@ PLUGIN_STATUS ACTIVE PLUGIN_TYPE PASSWORD VALIDATION PLUGIN_TYPE_VERSION 1.0 PLUGIN_LIBRARY cracklib_password_check.so -PLUGIN_LIBRARY_VERSION 1.12 +PLUGIN_LIBRARY_VERSION 1.13 PLUGIN_AUTHOR Sergei Golubchik PLUGIN_DESCRIPTION Password validation via CrackLib PLUGIN_LICENSE GPL diff --git a/mysql-test/suite/plugins/r/locales.result b/mysql-test/suite/plugins/r/locales.result index 881f91e0ac5..106bf22923c 100644 --- a/mysql-test/suite/plugins/r/locales.result +++ b/mysql-test/suite/plugins/r/locales.result @@ -25,7 +25,7 @@ ID NAME DESCRIPTION MAX_MONTH_NAME_LENGTH MAX_DAY_NAME_LENGTH DECIMAL_POINT THOU 22 gl_ES Galician - Galician 8 8 , english 23 gu_IN Gujarati - India 10 8 . , english 24 he_IL Hebrew - Israel 7 5 . , english -25 hi_IN Hindi - India 7 9 . , english +25 hi_IN Hindi - India 7 9 . , hindi 26 hr_HR Croatian - Croatia 8 11 , english 27 hu_HU Hungarian - Hungary 10 9 , . hungarian 28 id_ID Indonesian - Indonesia 9 6 , . english @@ -138,7 +138,7 @@ Id Name Description Error_Message_Language 22 gl_ES Galician - Galician english 23 gu_IN Gujarati - India english 24 he_IL Hebrew - Israel english -25 hi_IN Hindi - India english +25 hi_IN Hindi - India hindi 26 hr_HR Croatian - Croatia english 27 hu_HU Hungarian - Hungary hungarian 28 id_ID Indonesian - Indonesia english diff --git a/mysql-test/suite/plugins/r/show_all_plugins.result b/mysql-test/suite/plugins/r/show_all_plugins.result index 7ed26b8aef6..dd6cbfce4c4 100644 --- a/mysql-test/suite/plugins/r/show_all_plugins.result +++ b/mysql-test/suite/plugins/r/show_all_plugins.result @@ -4,8 +4,8 @@ Variable_name Value Opened_plugin_libraries 0 select * from information_schema.all_plugins where plugin_library='ha_example.so'; PLUGIN_NAME PLUGIN_VERSION PLUGIN_STATUS PLUGIN_TYPE PLUGIN_TYPE_VERSION PLUGIN_LIBRARY PLUGIN_LIBRARY_VERSION PLUGIN_AUTHOR PLUGIN_DESCRIPTION PLUGIN_LICENSE LOAD_OPTION PLUGIN_MATURITY PLUGIN_AUTH_VERSION -EXAMPLE 0.1 NOT INSTALLED STORAGE ENGINE MYSQL_VERSION_ID ha_example.so 1.12 Brian Aker, MySQL AB Example storage engine GPL OFF Experimental 0.1 -UNUSABLE 3.14 NOT INSTALLED DAEMON MYSQL_VERSION_ID ha_example.so 1.12 Sergei Golubchik Unusable Daemon GPL OFF Experimental 3.14.15.926 +EXAMPLE 0.1 NOT INSTALLED STORAGE ENGINE MYSQL_VERSION_ID ha_example.so 1.13 Brian Aker, MySQL AB Example storage engine GPL OFF Experimental 0.1 +UNUSABLE 3.14 NOT INSTALLED DAEMON MYSQL_VERSION_ID ha_example.so 1.13 Sergei Golubchik Unusable Daemon GPL OFF Experimental 3.14.15.926 show status like '%libraries%'; Variable_name Value Opened_plugin_libraries 1 @@ -26,7 +26,7 @@ three_attempts NOT INSTALLED AUTHENTICATION dialog_examples.so GPL two_questions NOT INSTALLED AUTHENTICATION dialog_examples.so GPL show status like '%libraries%'; Variable_name Value -Opened_plugin_libraries 8 +Opened_plugin_libraries 7 show plugins soname where library = 'ha_example.so'; Name Status Type Library License EXAMPLE NOT INSTALLED STORAGE ENGINE ha_example.so GPL diff --git a/mysql-test/suite/plugins/r/simple_password_check.result b/mysql-test/suite/plugins/r/simple_password_check.result index 11385bd6b01..672d0107492 100644 --- a/mysql-test/suite/plugins/r/simple_password_check.result +++ b/mysql-test/suite/plugins/r/simple_password_check.result @@ -6,7 +6,7 @@ PLUGIN_STATUS ACTIVE PLUGIN_TYPE PASSWORD VALIDATION PLUGIN_TYPE_VERSION 1.0 PLUGIN_LIBRARY simple_password_check.so -PLUGIN_LIBRARY_VERSION 1.12 +PLUGIN_LIBRARY_VERSION 1.13 PLUGIN_AUTHOR Sergei Golubchik PLUGIN_DESCRIPTION Simple password strength checks PLUGIN_LICENSE GPL diff --git a/mysql-test/suite/plugins/t/show_all_plugins.test b/mysql-test/suite/plugins/t/show_all_plugins.test index 74f9a99aef3..f8f375976fe 100644 --- a/mysql-test/suite/plugins/t/show_all_plugins.test +++ b/mysql-test/suite/plugins/t/show_all_plugins.test @@ -21,6 +21,7 @@ show status like '%libraries%'; --sorted_result --replace_result .dll .so show plugins soname like '%example%'; +--replace_result 8 7 show status like '%libraries%'; --sorted_result --replace_result .dll .so diff --git a/mysql-test/suite/roles/current_role_view-12666.result b/mysql-test/suite/roles/current_role_view-12666.result new file mode 100644 index 00000000000..1d7a8b054df --- /dev/null +++ b/mysql-test/suite/roles/current_role_view-12666.result @@ -0,0 +1,103 @@ +CREATE USER has_role@'localhost'; +GRANT ALL PRIVILEGES ON *.* TO has_role@'localhost'; +CREATE ROLE test_role; +GRANT test_role TO has_role@'localhost'; +CREATE USER no_role@'localhost'; +GRANT ALL PRIVILEGES ON *.* TO no_role@'localhost'; +CREATE TABLE view_role_test ( +id int primary key, +role_name varchar(50) +); +INSERT INTO view_role_test VALUES (1, 'test_role'); +# +# Use the same logic for stored procedures. +# +PREPARE prepared_no_current_role FROM "SELECT * from view_role_test WHERE role_name = CURRENT_ROLE()"; +# +# Creating a view with no CURRENT_ROLE() set and one with CURRENT_ROLE() +# set. Both should produce the same SHOW CREATE VIEW output. +# +CREATE +DEFINER = no_role@localhost +SQL SECURITY INVOKER +VIEW v_view_role_test_no_current_role +AS +SELECT * FROM view_role_test WHERE role_name = CURRENT_ROLE(); +SHOW CREATE VIEW v_view_role_test_no_current_role; +View Create View character_set_client collation_connection +v_view_role_test_no_current_role CREATE ALGORITHM=UNDEFINED DEFINER=`no_role`@`localhost` SQL SECURITY INVOKER VIEW `v_view_role_test_no_current_role` AS select `view_role_test`.`id` AS `id`,`view_role_test`.`role_name` AS `role_name` from `view_role_test` where `view_role_test`.`role_name` = current_role() latin1 latin1_swedish_ci +# +# No values should be returned +# +EXECUTE prepared_no_current_role; +id role_name +SELECT * FROM view_role_test WHERE role_name = CURRENT_ROLE(); +id role_name +SELECT * FROM v_view_role_test_no_current_role; +id role_name +# +# Now let's set the role. Create identical views as before. See if +# their behaviour is different. It should not be. +# +SET ROLE test_role; +SELECT CURRENT_USER(); +CURRENT_USER() +root@localhost +SELECT CURRENT_ROLE(); +CURRENT_ROLE() +test_role +# +# Create the VIEW and prepared Statement with a CURRENT_ROLE() set. +# +CREATE +DEFINER = no_role@localhost +SQL SECURITY INVOKER +VIEW v_view_role_test_with_current_role +AS +SELECT * FROM view_role_test WHERE role_name = CURRENT_ROLE(); +PREPARE prepared_with_current_role FROM "SELECT * from view_role_test WHERE role_name = CURRENT_ROLE()"; +SHOW CREATE VIEW v_view_role_test_with_current_role; +View Create View character_set_client collation_connection +v_view_role_test_with_current_role CREATE ALGORITHM=UNDEFINED DEFINER=`no_role`@`localhost` SQL SECURITY INVOKER VIEW `v_view_role_test_with_current_role` AS select `view_role_test`.`id` AS `id`,`view_role_test`.`role_name` AS `role_name` from `view_role_test` where `view_role_test`.`role_name` = current_role() latin1 latin1_swedish_ci +# +# Values should be returned for all select statements as we do have +# a CURRENT_ROLE() active; +# +EXECUTE prepared_no_current_role; +id role_name +1 test_role +EXECUTE prepared_with_current_role; +id role_name +1 test_role +SELECT * FROM view_role_test WHERE role_name = CURRENT_ROLE(); +id role_name +1 test_role +SELECT * FROM v_view_role_test_no_current_role; +id role_name +1 test_role +SELECT * FROM v_view_role_test_with_current_role; +id role_name +1 test_role +SET ROLE NONE; +# +# No values should be returned for all select statements as we do not have +# a CURRENT_ROLE() active; +# +EXECUTE prepared_no_current_role; +id role_name +EXECUTE prepared_with_current_role; +id role_name +SELECT * FROM view_role_test WHERE role_name = CURRENT_ROLE(); +id role_name +SELECT * FROM v_view_role_test_no_current_role; +id role_name +SELECT * FROM v_view_role_test_with_current_role; +id role_name +DROP USER has_role@'localhost'; +DROP USER no_role@'localhost'; +DROP ROLE test_role; +DROP table view_role_test; +DROP VIEW v_view_role_test_no_current_role; +DROP VIEW v_view_role_test_with_current_role; +DROP PREPARE prepared_no_current_role; +DROP PREPARE prepared_with_current_role; diff --git a/mysql-test/suite/roles/current_role_view-12666.test b/mysql-test/suite/roles/current_role_view-12666.test new file mode 100644 index 00000000000..32039ffef07 --- /dev/null +++ b/mysql-test/suite/roles/current_role_view-12666.test @@ -0,0 +1,102 @@ +# +# MDEV-12666 CURRENT_ROLE() does not work in a view +# +--source include/not_embedded.inc + +CREATE USER has_role@'localhost'; +GRANT ALL PRIVILEGES ON *.* TO has_role@'localhost'; + +CREATE ROLE test_role; +GRANT test_role TO has_role@'localhost'; + +CREATE USER no_role@'localhost'; +GRANT ALL PRIVILEGES ON *.* TO no_role@'localhost'; + +CREATE TABLE view_role_test ( + id int primary key, + role_name varchar(50) + ); + +INSERT INTO view_role_test VALUES (1, 'test_role'); + +--echo # +--echo # Use the same logic for stored procedures. +--echo # +PREPARE prepared_no_current_role FROM "SELECT * from view_role_test WHERE role_name = CURRENT_ROLE()"; + +--echo # +--echo # Creating a view with no CURRENT_ROLE() set and one with CURRENT_ROLE() +--echo # set. Both should produce the same SHOW CREATE VIEW output. +--echo # +CREATE +DEFINER = no_role@localhost +SQL SECURITY INVOKER +VIEW v_view_role_test_no_current_role +AS +SELECT * FROM view_role_test WHERE role_name = CURRENT_ROLE(); + +SHOW CREATE VIEW v_view_role_test_no_current_role; + + +--echo # +--echo # No values should be returned +--echo # +EXECUTE prepared_no_current_role; +SELECT * FROM view_role_test WHERE role_name = CURRENT_ROLE(); +SELECT * FROM v_view_role_test_no_current_role; + +--echo # +--echo # Now let's set the role. Create identical views as before. See if +--echo # their behaviour is different. It should not be. +--echo # +SET ROLE test_role; + +SELECT CURRENT_USER(); +SELECT CURRENT_ROLE(); + +--echo # +--echo # Create the VIEW and prepared Statement with a CURRENT_ROLE() set. +--echo # +CREATE +DEFINER = no_role@localhost +SQL SECURITY INVOKER +VIEW v_view_role_test_with_current_role +AS +SELECT * FROM view_role_test WHERE role_name = CURRENT_ROLE(); + +PREPARE prepared_with_current_role FROM "SELECT * from view_role_test WHERE role_name = CURRENT_ROLE()"; + +SHOW CREATE VIEW v_view_role_test_with_current_role; + + +--echo # +--echo # Values should be returned for all select statements as we do have +--echo # a CURRENT_ROLE() active; +--echo # +EXECUTE prepared_no_current_role; +EXECUTE prepared_with_current_role; +SELECT * FROM view_role_test WHERE role_name = CURRENT_ROLE(); +SELECT * FROM v_view_role_test_no_current_role; +SELECT * FROM v_view_role_test_with_current_role; + +SET ROLE NONE; +--echo # +--echo # No values should be returned for all select statements as we do not have +--echo # a CURRENT_ROLE() active; +--echo # +EXECUTE prepared_no_current_role; +EXECUTE prepared_with_current_role; +SELECT * FROM view_role_test WHERE role_name = CURRENT_ROLE(); +SELECT * FROM v_view_role_test_no_current_role; +SELECT * FROM v_view_role_test_with_current_role; + + +DROP USER has_role@'localhost'; +DROP USER no_role@'localhost'; +DROP ROLE test_role; + +DROP table view_role_test; +DROP VIEW v_view_role_test_no_current_role; +DROP VIEW v_view_role_test_with_current_role; +DROP PREPARE prepared_no_current_role; +DROP PREPARE prepared_with_current_role; diff --git a/mysql-test/suite/roles/show_create_database-10463.result b/mysql-test/suite/roles/show_create_database-10463.result new file mode 100644 index 00000000000..a9b376a891f --- /dev/null +++ b/mysql-test/suite/roles/show_create_database-10463.result @@ -0,0 +1,69 @@ +drop database if exists db; +Warnings: +Note 1008 Can't drop database 'db'; database doesn't exist +create role r1; +create user beep@'%'; +create database db; +create table db.t1 (i int); +create table db.t2 (b int); +grant select on db.* to r1; +grant r1 to beep@'%'; +connect con1,localhost,beep,,; +show databases; +Database +information_schema +test +show create database db; +ERROR 42000: Access denied for user 'beep'@'localhost' to database 'db' +select table_schema, table_name from information_schema.tables +where table_schema = 'db'; +table_schema table_name +set role r1; +show databases; +Database +db +information_schema +test +show create database db; +Database Create Database +db CREATE DATABASE `db` /*!40100 DEFAULT CHARACTER SET latin1 */ +select table_schema, table_name from information_schema.tables +where table_schema = 'db'; +table_schema table_name +db t1 +db t2 +connection default; +create role r2; +create user beep2@'%'; +grant update on db.* to r2; +grant r2 to beep2; +connect con2,localhost,beep2,,; +show databases; +Database +information_schema +test +show create database db; +ERROR 42000: Access denied for user 'beep2'@'localhost' to database 'db' +select table_schema, table_name from information_schema.tables +where table_schema = 'db'; +table_schema table_name +set role r2; +show databases; +Database +db +information_schema +test +show create database db; +Database Create Database +db CREATE DATABASE `db` /*!40100 DEFAULT CHARACTER SET latin1 */ +select table_schema, table_name from information_schema.tables +where table_schema = 'db'; +table_schema table_name +db t1 +db t2 +connection default; +drop database db; +drop role r1; +drop user beep; +drop role r2; +drop user beep2; diff --git a/mysql-test/suite/roles/show_create_database-10463.test b/mysql-test/suite/roles/show_create_database-10463.test new file mode 100644 index 00000000000..2d921629c10 --- /dev/null +++ b/mysql-test/suite/roles/show_create_database-10463.test @@ -0,0 +1,55 @@ +source include/not_embedded.inc; + +drop database if exists db; + +create role r1; +create user beep@'%'; + +create database db; +create table db.t1 (i int); +create table db.t2 (b int); +grant select on db.* to r1; +grant r1 to beep@'%'; + +--connect (con1,localhost,beep,,) +show databases; +--error ER_DBACCESS_DENIED_ERROR +show create database db; +select table_schema, table_name from information_schema.tables +where table_schema = 'db'; + +set role r1; +show databases; +show create database db; +select table_schema, table_name from information_schema.tables +where table_schema = 'db'; + + +connection default; +create role r2; +create user beep2@'%'; + +grant update on db.* to r2; +grant r2 to beep2; +--connect (con2,localhost,beep2,,) +show databases; +--error ER_DBACCESS_DENIED_ERROR +show create database db; +select table_schema, table_name from information_schema.tables +where table_schema = 'db'; + +set role r2; +show databases; + +show create database db; +select table_schema, table_name from information_schema.tables +where table_schema = 'db'; + + +connection default; + +drop database db; +drop role r1; +drop user beep; +drop role r2; +drop user beep2; diff --git a/mysql-test/suite/rpl/r/circular_serverid0.result b/mysql-test/suite/rpl/r/circular_serverid0.result new file mode 100644 index 00000000000..112f9359ac4 --- /dev/null +++ b/mysql-test/suite/rpl/r/circular_serverid0.result @@ -0,0 +1,42 @@ +include/rpl_init.inc [topology=1->2->1] +include/rpl_connect.inc [creating M4] +include/rpl_connect.inc [creating M2] +SET @old_debug= @@global.debug; +connection M2; +STOP SLAVE; +SET GLOBAL debug_dbug= "+d,dbug.rows_events_to_delay_relay_logging"; +START SLAVE IO_THREAD; +include/wait_for_slave_io_to_start.inc +connection M2; +CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b VARCHAR(30000)) ENGINE=innodb; +connection M4; +connection M4; +INSERT INTO `t1` VALUES (null, repeat('a', 1024)), (null, repeat('b', 1024)); +connection M2; +SET debug_sync='now WAIT_FOR start_sql_thread'; +START SLAVE SQL_THREAD; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +slave-bin.000001 # Gtid # # GTID #-#-# +slave-bin.000001 # Query # # use `test`; CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b VARCHAR(30000)) ENGINE=innodb +SET debug_sync='now SIGNAL go_on_relay_logging'; +connection M4; +connection M4; +connection M2; +connection M2; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +slave-bin.000001 # Gtid # # GTID #-#-# +slave-bin.000001 # Query # # use `test`; CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b VARCHAR(30000)) ENGINE=innodb +slave-bin.000001 # Gtid # # BEGIN GTID #-#-# +slave-bin.000001 # Annotate_rows # # INSERT INTO `t1` VALUES (null, repeat('a', 1024)), (null, repeat('b', 1024)) +slave-bin.000001 # Table_map # # table_id: # (test.t1) +slave-bin.000001 # Write_rows_v1 # # table_id: # +slave-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F +slave-bin.000001 # Xid # # COMMIT /* XID */ +connection M4; +drop table t1; +connection M2; +SET GLOBAL debug_dbug= @old_debug; +SET debug_sync='RESET'; +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/r/rpl_extra_col_slave_innodb.result b/mysql-test/suite/rpl/r/rpl_extra_col_slave_innodb.result index a07bac9340c..456c1c24f8f 100644 --- a/mysql-test/suite/rpl/r/rpl_extra_col_slave_innodb.result +++ b/mysql-test/suite/rpl/r/rpl_extra_col_slave_innodb.result @@ -662,7 +662,7 @@ t16 CREATE TABLE `t16` ( `c5` char(5) DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 4 *** Show table on Slave **** connection slave; @@ -678,7 +678,7 @@ t16 CREATE TABLE `t16` ( `c7` timestamp NULL DEFAULT current_timestamp(), PRIMARY KEY (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 4 *** DROP TABLE t16 *** connection master; diff --git a/mysql-test/suite/rpl/r/rpl_extra_col_slave_myisam.result b/mysql-test/suite/rpl/r/rpl_extra_col_slave_myisam.result index 280afed0385..7178a2a78b8 100644 --- a/mysql-test/suite/rpl/r/rpl_extra_col_slave_myisam.result +++ b/mysql-test/suite/rpl/r/rpl_extra_col_slave_myisam.result @@ -662,7 +662,7 @@ t16 CREATE TABLE `t16` ( `c5` char(5) DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 4 *** Show table on Slave **** connection slave; @@ -678,7 +678,7 @@ t16 CREATE TABLE `t16` ( `c7` timestamp NULL DEFAULT current_timestamp(), PRIMARY KEY (`c1`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 4 *** DROP TABLE t16 *** connection master; diff --git a/mysql-test/suite/rpl/r/rpl_gtid_errorhandling.result b/mysql-test/suite/rpl/r/rpl_gtid_errorhandling.result index 7c2471ba37c..47ba3c956b1 100644 --- a/mysql-test/suite/rpl/r/rpl_gtid_errorhandling.result +++ b/mysql-test/suite/rpl/r/rpl_gtid_errorhandling.result @@ -113,7 +113,7 @@ SET @old_dbug= @@GLOBAL.debug_dbug; SET GLOBAL debug_dbug="+d,dummy_disable_default_dbug_output"; SET GLOBAL debug_dbug="+d,gtid_fail_after_record_gtid"; SET sql_log_bin=0; -CALL mtr.add_suppression('Got error 131 "Command not supported by database" during COMMIT'); +CALL mtr.add_suppression('Got error 131 "Command not supported by the engine" during COMMIT'); SET sql_log_bin=1; START SLAVE; include/wait_for_slave_sql_error.inc [errno=1180] diff --git a/mysql-test/suite/rpl/r/rpl_innodb_bug28430.result b/mysql-test/suite/rpl/r/rpl_innodb_bug28430.result index eef77303c9a..a666ae26c51 100644 --- a/mysql-test/suite/rpl/r/rpl_innodb_bug28430.result +++ b/mysql-test/suite/rpl/r/rpl_innodb_bug28430.result @@ -121,20 +121,20 @@ Create Table CREATE TABLE `byrange_tbl` ( `filler` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (id) -SUBPARTITION BY HASH (id) + PARTITION BY RANGE (`id`) +SUBPARTITION BY HASH (`id`) SUBPARTITIONS 2 -(PARTITION pa1 VALUES LESS THAN (10) ENGINE = InnoDB, - PARTITION pa2 VALUES LESS THAN (20) ENGINE = InnoDB, - PARTITION pa3 VALUES LESS THAN (30) ENGINE = InnoDB, - PARTITION pa4 VALUES LESS THAN (40) ENGINE = InnoDB, - PARTITION pa5 VALUES LESS THAN (50) ENGINE = InnoDB, - PARTITION pa6 VALUES LESS THAN (60) ENGINE = InnoDB, - PARTITION pa7 VALUES LESS THAN (70) ENGINE = InnoDB, - PARTITION pa8 VALUES LESS THAN (80) ENGINE = InnoDB, - PARTITION pa9 VALUES LESS THAN (90) ENGINE = InnoDB, - PARTITION pa10 VALUES LESS THAN (100) ENGINE = InnoDB, - PARTITION pa11 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) +(PARTITION `pa1` VALUES LESS THAN (10) ENGINE = InnoDB, + PARTITION `pa2` VALUES LESS THAN (20) ENGINE = InnoDB, + PARTITION `pa3` VALUES LESS THAN (30) ENGINE = InnoDB, + PARTITION `pa4` VALUES LESS THAN (40) ENGINE = InnoDB, + PARTITION `pa5` VALUES LESS THAN (50) ENGINE = InnoDB, + PARTITION `pa6` VALUES LESS THAN (60) ENGINE = InnoDB, + PARTITION `pa7` VALUES LESS THAN (70) ENGINE = InnoDB, + PARTITION `pa8` VALUES LESS THAN (80) ENGINE = InnoDB, + PARTITION `pa9` VALUES LESS THAN (90) ENGINE = InnoDB, + PARTITION `pa10` VALUES LESS THAN (100) ENGINE = InnoDB, + PARTITION `pa11` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) SELECT count(*) "Slave norm" FROM test.regular_tbl; Slave norm 500 SELECT count(*) "Slave bykey" FROM test.bykey_tbl; diff --git a/mysql-test/suite/rpl/r/rpl_mdev-11092.result b/mysql-test/suite/rpl/r/rpl_mdev-11092.result new file mode 100644 index 00000000000..90b809477b2 --- /dev/null +++ b/mysql-test/suite/rpl/r/rpl_mdev-11092.result @@ -0,0 +1,21 @@ +include/master-slave.inc +[connection master] +call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +call mtr.add_suppression("Slave SQL: The incident LOST_EVENTS occured on the master. .*"); +SET GLOBAL max_binlog_cache_size = 4096; +SET GLOBAL binlog_cache_size = 4096; +SET GLOBAL max_binlog_stmt_cache_size = 4096; +SET GLOBAL binlog_stmt_cache_size = 4096; +disconnect master; +connect master,127.0.0.1,root,,test,$MASTER_MYPORT,; +CREATE TABLE t1(a INT PRIMARY KEY, data VARCHAR(30000)) ENGINE=MYISAM; +connection master; +ERROR HY000: Writing one row to the row-based binary log failed +include/wait_for_slave_sql_error_and_skip.inc [errno=1590] +connection master; +SET GLOBAL max_binlog_cache_size= ORIGINAL_VALUE; +SET GLOBAL binlog_cache_size= ORIGINAL_VALUE; +SET GLOBAL max_binlog_stmt_cache_size= ORIGINAL_VALUE; +SET GLOBAL binlog_stmt_cache_size= ORIGINAL_VALUE; +DROP TABLE t1; +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/r/rpl_parallel_optimistic.result b/mysql-test/suite/rpl/r/rpl_parallel_optimistic.result index 0bb0f57e463..7c8a2a94104 100644 --- a/mysql-test/suite/rpl/r/rpl_parallel_optimistic.result +++ b/mysql-test/suite/rpl/r/rpl_parallel_optimistic.result @@ -560,6 +560,56 @@ a b 57 7 58 8 59 9 +*** MDEV-8075: DROP TEMPORARY TABLE not marked as ddl, causing optimistic parallel replication to fail *** +connection server_2; +include/stop_slave.inc +connection server_1; +INSERT INTO t1 VALUES (40, 10); +CREATE TEMPORARY TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (41); +BEGIN; +INSERT INTO t2 SELECT a, 20 FROM t1; +DROP TEMPORARY TABLE t1; +COMMIT; +INSERT INTO t1 VALUES (42, 10); +include/save_master_gtid.inc +SELECT * FROM t1 WHERE a >= 40 ORDER BY a; +a b +40 10 +42 10 +SELECT * FROM t2 WHERE a >= 40 ORDER BY a; +a b +41 20 +50 0 +51 1 +52 2 +53 3 +54 4 +55 5 +56 6 +57 7 +58 8 +59 9 +connection server_2; +include/start_slave.inc +include/sync_with_master_gtid.inc +SELECT * FROM t1 WHERE a >= 40 ORDER BY a; +a b +40 10 +42 10 +SELECT * FROM t2 WHERE a >= 40 ORDER BY a; +a b +41 20 +50 0 +51 1 +52 2 +53 3 +54 4 +55 5 +56 6 +57 7 +58 8 +59 9 connection server_2; include/stop_slave.inc SET GLOBAL slave_parallel_mode=@old_parallel_mode; diff --git a/mysql-test/suite/rpl/r/rpl_partition_innodb.result b/mysql-test/suite/rpl/r/rpl_partition_innodb.result index 4657ed7dde5..e9fa13f315b 100644 --- a/mysql-test/suite/rpl/r/rpl_partition_innodb.result +++ b/mysql-test/suite/rpl/r/rpl_partition_innodb.result @@ -62,9 +62,9 @@ byrange_tbl CREATE TABLE `byrange_tbl` ( `filler` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (id) -(PARTITION pa100 VALUES LESS THAN (100) ENGINE = InnoDB, - PARTITION paMax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`id`) +(PARTITION `pa100` VALUES LESS THAN (100) ENGINE = InnoDB, + PARTITION `paMax` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) show create table test.regular_tbl; Table Create Table regular_tbl CREATE TABLE `regular_tbl` ( @@ -106,9 +106,9 @@ byrange_tbl CREATE TABLE `byrange_tbl` ( `filler` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (id) -(PARTITION pa100 VALUES LESS THAN (100) ENGINE = InnoDB, - PARTITION paMax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) + PARTITION BY RANGE (`id`) +(PARTITION `pa100` VALUES LESS THAN (100) ENGINE = InnoDB, + PARTITION `paMax` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) show create table test.regular_tbl; Table Create Table regular_tbl CREATE TABLE `regular_tbl` ( diff --git a/mysql-test/suite/rpl/r/rpl_partition_memory.result b/mysql-test/suite/rpl/r/rpl_partition_memory.result index 1d57c48ad78..8dbfd20d260 100644 --- a/mysql-test/suite/rpl/r/rpl_partition_memory.result +++ b/mysql-test/suite/rpl/r/rpl_partition_memory.result @@ -62,9 +62,9 @@ byrange_tbl CREATE TABLE `byrange_tbl` ( `filler` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MEMORY AUTO_INCREMENT=201 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (id) -(PARTITION pa100 VALUES LESS THAN (100) ENGINE = MEMORY, - PARTITION paMax VALUES LESS THAN MAXVALUE ENGINE = MEMORY) + PARTITION BY RANGE (`id`) +(PARTITION `pa100` VALUES LESS THAN (100) ENGINE = MEMORY, + PARTITION `paMax` VALUES LESS THAN MAXVALUE ENGINE = MEMORY) show create table test.regular_tbl; Table Create Table regular_tbl CREATE TABLE `regular_tbl` ( @@ -106,9 +106,9 @@ byrange_tbl CREATE TABLE `byrange_tbl` ( `filler` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MEMORY AUTO_INCREMENT=201 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (id) -(PARTITION pa100 VALUES LESS THAN (100) ENGINE = MEMORY, - PARTITION paMax VALUES LESS THAN MAXVALUE ENGINE = MEMORY) + PARTITION BY RANGE (`id`) +(PARTITION `pa100` VALUES LESS THAN (100) ENGINE = MEMORY, + PARTITION `paMax` VALUES LESS THAN MAXVALUE ENGINE = MEMORY) show create table test.regular_tbl; Table Create Table regular_tbl CREATE TABLE `regular_tbl` ( diff --git a/mysql-test/suite/rpl/r/rpl_partition_myisam.result b/mysql-test/suite/rpl/r/rpl_partition_myisam.result index 42ad10c8cf1..16a9ea85832 100644 --- a/mysql-test/suite/rpl/r/rpl_partition_myisam.result +++ b/mysql-test/suite/rpl/r/rpl_partition_myisam.result @@ -62,9 +62,9 @@ byrange_tbl CREATE TABLE `byrange_tbl` ( `filler` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=201 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (id) -(PARTITION pa100 VALUES LESS THAN (100) ENGINE = MyISAM, - PARTITION paMax VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`id`) +(PARTITION `pa100` VALUES LESS THAN (100) ENGINE = MyISAM, + PARTITION `paMax` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) show create table test.regular_tbl; Table Create Table regular_tbl CREATE TABLE `regular_tbl` ( @@ -106,9 +106,9 @@ byrange_tbl CREATE TABLE `byrange_tbl` ( `filler` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=201 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (id) -(PARTITION pa100 VALUES LESS THAN (100) ENGINE = MyISAM, - PARTITION paMax VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (`id`) +(PARTITION `pa100` VALUES LESS THAN (100) ENGINE = MyISAM, + PARTITION `paMax` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) show create table test.regular_tbl; Table Create Table regular_tbl CREATE TABLE `regular_tbl` ( diff --git a/mysql-test/suite/rpl/r/rpl_reset_slave_fail.result b/mysql-test/suite/rpl/r/rpl_reset_slave_fail.result new file mode 100644 index 00000000000..34ce68cb079 --- /dev/null +++ b/mysql-test/suite/rpl/r/rpl_reset_slave_fail.result @@ -0,0 +1,37 @@ +include/master-slave.inc +[connection master] +connection master; +CREATE TABLE t1 (c1 INT); +INSERT INTO t1 (c1) VALUES (1); +connection slave; +connection slave; +include/stop_slave_sql.inc +connection master; +FLUSH LOGS; +FLUSH LOGS; +INSERT INTO t1 (c1) VALUES (2); +include/sync_slave_io_with_master.inc +call mtr.add_suppression("File '.*slave-relay-bin."); +call mtr.add_suppression("Could not open log file"); +call mtr.add_suppression("Failed to open the relay log"); +call mtr.add_suppression("Failed to initialize the master info structure"); +include/rpl_stop_server.inc [server_number=2] +# Removing file(s) +include/rpl_start_server.inc [server_number=2] +START SLAVE; +ERROR HY000: Could not initialize master info structure for ''; more error messages can be found in the MariaDB error log +START SLAVE; +ERROR HY000: Could not initialize master info structure for ''; more error messages can be found in the MariaDB error log +RESET SLAVE; +DROP TABLE t1; +START SLAVE UNTIL MASTER_LOG_FILE= 'MASTER_LOG_FILE', MASTER_LOG_POS= MASTER_LOG_POS;; +include/wait_for_slave_sql_to_stop.inc +include/stop_slave_io.inc +include/start_slave.inc +connection master; +connection slave; +include/diff_tables.inc [master:t1, slave:t1] +connection master; +DROP TABLE t1; +connection slave; +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/r/rpl_row_basic_8partition.result b/mysql-test/suite/rpl/r/rpl_row_basic_8partition.result index f2774d2fc62..7ced45a9eab 100644 --- a/mysql-test/suite/rpl/r/rpl_row_basic_8partition.result +++ b/mysql-test/suite/rpl/r/rpl_row_basic_8partition.result @@ -28,13 +28,13 @@ t1 CREATE TABLE `t1` ( `y` year(4) DEFAULT NULL, `t` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (YEAR(t)) -(PARTITION p0 VALUES LESS THAN (1901) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN (1946) ENGINE = MyISAM, - PARTITION p2 VALUES LESS THAN (1966) ENGINE = MyISAM, - PARTITION p3 VALUES LESS THAN (1986) ENGINE = MyISAM, - PARTITION p4 VALUES LESS THAN (2005) ENGINE = MyISAM, - PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (year(`t`)) +(PARTITION `p0` VALUES LESS THAN (1901) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN (1946) ENGINE = MyISAM, + PARTITION `p2` VALUES LESS THAN (1966) ENGINE = MyISAM, + PARTITION `p3` VALUES LESS THAN (1986) ENGINE = MyISAM, + PARTITION `p4` VALUES LESS THAN (2005) ENGINE = MyISAM, + PARTITION `p5` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) connection slave; SHOW CREATE TABLE t1; Table Create Table @@ -49,13 +49,13 @@ t1 CREATE TABLE `t1` ( `y` year(4) DEFAULT NULL, `t` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (YEAR(t)) -(PARTITION p0 VALUES LESS THAN (1901) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN (1946) ENGINE = MyISAM, - PARTITION p2 VALUES LESS THAN (1966) ENGINE = MyISAM, - PARTITION p3 VALUES LESS THAN (1986) ENGINE = MyISAM, - PARTITION p4 VALUES LESS THAN (2005) ENGINE = MyISAM, - PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (year(`t`)) +(PARTITION `p0` VALUES LESS THAN (1901) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN (1946) ENGINE = MyISAM, + PARTITION `p2` VALUES LESS THAN (1966) ENGINE = MyISAM, + PARTITION `p3` VALUES LESS THAN (1986) ENGINE = MyISAM, + PARTITION `p4` VALUES LESS THAN (2005) ENGINE = MyISAM, + PARTITION `p5` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) connection master; "--- Insert into t1 --" as ""; --- Select from t1 on master --- @@ -116,13 +116,13 @@ t1 CREATE TABLE `t1` ( `y` year(4) DEFAULT NULL, `t` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (YEAR(t)) -(PARTITION p0 VALUES LESS THAN (1901) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN (1946) ENGINE = MyISAM, - PARTITION p2 VALUES LESS THAN (1966) ENGINE = MyISAM, - PARTITION p3 VALUES LESS THAN (1986) ENGINE = MyISAM, - PARTITION p4 VALUES LESS THAN (2005) ENGINE = MyISAM, - PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (year(`t`)) +(PARTITION `p0` VALUES LESS THAN (1901) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN (1946) ENGINE = MyISAM, + PARTITION `p2` VALUES LESS THAN (1966) ENGINE = MyISAM, + PARTITION `p3` VALUES LESS THAN (1986) ENGINE = MyISAM, + PARTITION `p4` VALUES LESS THAN (2005) ENGINE = MyISAM, + PARTITION `p5` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) connection slave; SHOW CREATE TABLE t1; Table Create Table @@ -137,13 +137,13 @@ t1 CREATE TABLE `t1` ( `y` year(4) DEFAULT NULL, `t` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY RANGE (YEAR(t)) -(PARTITION p0 VALUES LESS THAN (1901) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN (1946) ENGINE = MyISAM, - PARTITION p2 VALUES LESS THAN (1966) ENGINE = MyISAM, - PARTITION p3 VALUES LESS THAN (1986) ENGINE = MyISAM, - PARTITION p4 VALUES LESS THAN (2005) ENGINE = MyISAM, - PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) + PARTITION BY RANGE (year(`t`)) +(PARTITION `p0` VALUES LESS THAN (1901) ENGINE = MyISAM, + PARTITION `p1` VALUES LESS THAN (1946) ENGINE = MyISAM, + PARTITION `p2` VALUES LESS THAN (1966) ENGINE = MyISAM, + PARTITION `p3` VALUES LESS THAN (1986) ENGINE = MyISAM, + PARTITION `p4` VALUES LESS THAN (2005) ENGINE = MyISAM, + PARTITION `p5` VALUES LESS THAN MAXVALUE ENGINE = MyISAM) connection master; "--- Insert into t1 --" as ""; --- Select from t1 on master --- @@ -213,10 +213,10 @@ t1 CREATE TABLE `t1` ( `y` year(4) DEFAULT NULL, `t` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (id) -(PARTITION p0 VALUES IN (2,4) ENGINE = MyISAM, - PARTITION p1 VALUES IN (42,142) ENGINE = MyISAM, - PARTITION p2 VALUES IN (412) ENGINE = MyISAM) + PARTITION BY LIST (`id`) +(PARTITION `p0` VALUES IN (2,4) ENGINE = MyISAM, + PARTITION `p1` VALUES IN (42,142) ENGINE = MyISAM, + PARTITION `p2` VALUES IN (412) ENGINE = MyISAM) connection slave; SHOW CREATE TABLE t1; Table Create Table @@ -231,10 +231,10 @@ t1 CREATE TABLE `t1` ( `y` year(4) DEFAULT NULL, `t` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (id) -(PARTITION p0 VALUES IN (2,4) ENGINE = MyISAM, - PARTITION p1 VALUES IN (42,142) ENGINE = MyISAM, - PARTITION p2 VALUES IN (412) ENGINE = MyISAM) + PARTITION BY LIST (`id`) +(PARTITION `p0` VALUES IN (2,4) ENGINE = MyISAM, + PARTITION `p1` VALUES IN (42,142) ENGINE = MyISAM, + PARTITION `p2` VALUES IN (412) ENGINE = MyISAM) connection master; "--- Insert into t1 --" as ""; --- Select from t1 on master --- @@ -295,10 +295,10 @@ t1 CREATE TABLE `t1` ( `y` year(4) DEFAULT NULL, `t` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (id) -(PARTITION p0 VALUES IN (2,4) ENGINE = MyISAM, - PARTITION p1 VALUES IN (42,142) ENGINE = MyISAM, - PARTITION p2 VALUES IN (412) ENGINE = MyISAM) + PARTITION BY LIST (`id`) +(PARTITION `p0` VALUES IN (2,4) ENGINE = MyISAM, + PARTITION `p1` VALUES IN (42,142) ENGINE = MyISAM, + PARTITION `p2` VALUES IN (412) ENGINE = MyISAM) connection slave; SHOW CREATE TABLE t1; Table Create Table @@ -313,10 +313,10 @@ t1 CREATE TABLE `t1` ( `y` year(4) DEFAULT NULL, `t` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY LIST (id) -(PARTITION p0 VALUES IN (2,4) ENGINE = MyISAM, - PARTITION p1 VALUES IN (42,142) ENGINE = MyISAM, - PARTITION p2 VALUES IN (412) ENGINE = MyISAM) + PARTITION BY LIST (`id`) +(PARTITION `p0` VALUES IN (2,4) ENGINE = MyISAM, + PARTITION `p1` VALUES IN (42,142) ENGINE = MyISAM, + PARTITION `p2` VALUES IN (412) ENGINE = MyISAM) connection master; "--- Insert into t1 --" as ""; --- Select from t1 on master --- @@ -384,7 +384,7 @@ t1 CREATE TABLE `t1` ( `y` year(4) DEFAULT NULL, `t` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH ( YEAR(t)) + PARTITION BY HASH (year(`t`)) PARTITIONS 4 connection slave; SHOW CREATE TABLE t1; @@ -400,7 +400,7 @@ t1 CREATE TABLE `t1` ( `y` year(4) DEFAULT NULL, `t` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH ( YEAR(t)) + PARTITION BY HASH (year(`t`)) PARTITIONS 4 connection master; "--- Insert into t1 --" as ""; @@ -461,7 +461,7 @@ t1 CREATE TABLE `t1` ( `y` year(4) DEFAULT NULL, `t` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH ( YEAR(t)) + PARTITION BY HASH (year(`t`)) PARTITIONS 4 connection slave; SHOW CREATE TABLE t1; @@ -477,7 +477,7 @@ t1 CREATE TABLE `t1` ( `y` year(4) DEFAULT NULL, `t` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 - PARTITION BY HASH ( YEAR(t)) + PARTITION BY HASH (year(`t`)) PARTITIONS 4 connection master; "--- Insert into t1 --" as ""; diff --git a/mysql-test/suite/rpl/t/circular_serverid0.cnf b/mysql-test/suite/rpl/t/circular_serverid0.cnf new file mode 100644 index 00000000000..277aac2869b --- /dev/null +++ b/mysql-test/suite/rpl/t/circular_serverid0.cnf @@ -0,0 +1,30 @@ +!include ../my.cnf + +[mysqld.1] +gtid-domain-id=4 +server-id=4 +# +log-slave-updates +slave-parallel-threads=0 +gtid-strict-mode=1 +gtid-ignore-duplicates=1 + +# +# Max-size row events to minimum with the idea to create +# a number of Rows_log_event per Query. +# +binlog-row-event-max-size=1024 + +[mysqld.2] +gtid-domain-id=2 +server-id=2 +# +log-slave-updates +slave-parallel-threads=0 +gtid-strict-mode=1 +gtid-ignore-duplicates=1 +binlog-row-event-max-size=1024 +# The slave will be initialized with a @@global.dbug-var value +skip-slave-start=1 + + diff --git a/mysql-test/suite/rpl/t/circular_serverid0.test b/mysql-test/suite/rpl/t/circular_serverid0.test new file mode 100644 index 00000000000..20ad58e2c52 --- /dev/null +++ b/mysql-test/suite/rpl/t/circular_serverid0.test @@ -0,0 +1,104 @@ +# +# Testing chain/circular replication scenario of MDEV-9670 +# The effect of the bug was that we got a commit with a GTID with server_id +# + +--source include/have_binlog_format_row.inc +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc + +--let $rpl_topology= 1->2->1 +--source include/rpl_init.inc + +--let $rpl_connection_name= M4 +--let $rpl_server_number= 1 +--source include/rpl_connect.inc + +--let $rpl_connection_name= M2 +--let $rpl_server_number= 2 +--source include/rpl_connect.inc + +# The parameter reflects binlog-row-event-max-size @cnf. +--let $row_size=1024 + +SET @old_debug= @@global.debug; + +--connection M2 +STOP SLAVE; +SET GLOBAL debug_dbug= "+d,dbug.rows_events_to_delay_relay_logging"; +START SLAVE IO_THREAD; +--source include/wait_for_slave_io_to_start.inc + +--connection M2 +# This query also creates a Gtid event group whose Gtid will remain in +# ignored status for too long causing a following group split. + +CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b VARCHAR(30000)) ENGINE=innodb; +--sync_slave_with_master M4 + +# This INSERT will be logged as two Write_log events which the buggy +# slave applier would split. + +--connection M4 +eval INSERT INTO `t1` VALUES (null, repeat('a', $row_size)), (null, repeat('b', $row_size)); + +# START M2 IO thread and wait for its signal to follow with the SQL +# thread start. At this moment the SQL thread shall be having 2 and +# "half" groups to execute. The "hafl" one would be committed by the +# buggy applier after which the IO is released to queue the rest of +# the 3rd group which the SQL thread commits separately to complete +# the split. + +--connection M2 + +# wait for IO signal to start the SQL thread. IO will be hanging upon that. +SET debug_sync='now WAIT_FOR start_sql_thread'; + +# Now the slave server has relay log whose last group is incomplete. +# An unfixed slave server would go to "insert" a "fake" +# Gtid_list_log_event event which actually would commit the incomplete +# group. However before to actual commit do_apply_event() hits some assert. +# In the fixed server the fake Gtid_list_log_event is *not* inserted +# in the middle of a group. +START SLAVE SQL_THREAD; + +# Sleep for a little time to give SQL thread a chance to commit while +# the IO thread is hanging (see +# DBUG_EXECUTE_IF("dbug.rows_events_to_delay_relay_logging"...) in +# queue_event). Alternatively to reproduce the case when buggy slave +# wait for the 1st group commit + +#--let $count= 1 +#--let $table= t1 +#--source include/wait_until_rows_count.inc + +--sleep 2 + +# Demonstrate either no split group in the correct slave or the 1nd +# group in the buggy one +--source include/show_binlog_events.inc + +# Release the IO thread +SET debug_sync='now SIGNAL go_on_relay_logging'; + +# Sync servers +--sync_slave_with_master M4 +--connection M4 +--sync_slave_with_master M2 +--connection M2 + +# Demonstrate replication goes correctly not to create any split, or +# the 2nd group in the buggy slave +--source include/show_binlog_events.inc + +# +# Cleanup +# +--connection M4 +drop table t1; + +--connection M2 +SET GLOBAL debug_dbug= @old_debug; +SET debug_sync='RESET'; +--source include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rpl_gtid_errorhandling.test b/mysql-test/suite/rpl/t/rpl_gtid_errorhandling.test index 05da466597e..517e5073b2d 100644 --- a/mysql-test/suite/rpl/t/rpl_gtid_errorhandling.test +++ b/mysql-test/suite/rpl/t/rpl_gtid_errorhandling.test @@ -132,7 +132,7 @@ SET @old_dbug= @@GLOBAL.debug_dbug; SET GLOBAL debug_dbug="+d,dummy_disable_default_dbug_output"; SET GLOBAL debug_dbug="+d,gtid_fail_after_record_gtid"; SET sql_log_bin=0; -CALL mtr.add_suppression('Got error 131 "Command not supported by database" during COMMIT'); +CALL mtr.add_suppression('Got error 131 "Command not supported by the engine" during COMMIT'); SET sql_log_bin=1; START SLAVE; --let $slave_sql_errno= 1180 diff --git a/mysql-test/suite/rpl/t/rpl_mdev-11092.opt b/mysql-test/suite/rpl/t/rpl_mdev-11092.opt new file mode 100644 index 00000000000..7f1d270d29f --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_mdev-11092.opt @@ -0,0 +1 @@ +--binlog_checksum=1 --binlog-annotate-row-events=1 diff --git a/mysql-test/suite/rpl/t/rpl_mdev-11092.test b/mysql-test/suite/rpl/t/rpl_mdev-11092.test new file mode 100644 index 00000000000..c8b2b7f2ad1 --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_mdev-11092.test @@ -0,0 +1,53 @@ +--source include/have_innodb.inc +--source include/master-slave.inc +--source include/not_embedded.inc +--source include/not_windows.inc +--source include/have_binlog_format_row.inc + +######################################################################################## +call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +call mtr.add_suppression("Slave SQL: The incident LOST_EVENTS occured on the master. .*"); + +let $old_max_binlog_cache_size= query_get_value(SHOW VARIABLES LIKE "max_binlog_cache_size", Value, 1); +let $old_binlog_cache_size= query_get_value(SHOW VARIABLES LIKE "binlog_cache_size", Value, 1); +let $old_max_binlog_stmt_cache_size= query_get_value(SHOW VARIABLES LIKE "max_binlog_stmt_cache_size", Value, 1); +let $old_binlog_stmt_cache_size= query_get_value(SHOW VARIABLES LIKE "binlog_stmt_cache_size", Value, 1); + +SET GLOBAL max_binlog_cache_size = 4096; +SET GLOBAL binlog_cache_size = 4096; +SET GLOBAL max_binlog_stmt_cache_size = 4096; +SET GLOBAL binlog_stmt_cache_size = 4096; +disconnect master; +connect (master,127.0.0.1,root,,test,$MASTER_MYPORT,); + +CREATE TABLE t1(a INT PRIMARY KEY, data VARCHAR(30000)) ENGINE=MYISAM; + +let $data = `select concat('"', repeat('a',2000), '"')`; + +connection master; + +--disable_query_log +--error ER_BINLOG_ROW_LOGGING_FAILED +eval INSERT INTO t1 (a, data) VALUES (2, + CONCAT($data, $data, $data, $data, $data, $data)); +--enable_query_log + +# Incident event +# 1590=ER_SLAVE_INCIDENT +--let $slave_sql_errno= 1590 +--source include/wait_for_slave_sql_error_and_skip.inc + +connection master; + +--replace_result $old_max_binlog_cache_size ORIGINAL_VALUE +--eval SET GLOBAL max_binlog_cache_size= $old_max_binlog_cache_size +--replace_result $old_binlog_cache_size ORIGINAL_VALUE +--eval SET GLOBAL binlog_cache_size= $old_binlog_cache_size +--replace_result $old_max_binlog_stmt_cache_size ORIGINAL_VALUE +--eval SET GLOBAL max_binlog_stmt_cache_size= $old_max_binlog_stmt_cache_size +--replace_result $old_binlog_stmt_cache_size ORIGINAL_VALUE +--eval SET GLOBAL binlog_stmt_cache_size= $old_binlog_stmt_cache_size + +DROP TABLE t1; + +--source include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rpl_parallel_optimistic.test b/mysql-test/suite/rpl/t/rpl_parallel_optimistic.test index 789f59a3637..b5d78033088 100644 --- a/mysql-test/suite/rpl/t/rpl_parallel_optimistic.test +++ b/mysql-test/suite/rpl/t/rpl_parallel_optimistic.test @@ -460,6 +460,30 @@ SELECT * FROM t2 WHERE a >= 50 ORDER BY a; SELECT * FROM t2 WHERE a >= 50 ORDER BY a; +--echo *** MDEV-8075: DROP TEMPORARY TABLE not marked as ddl, causing optimistic parallel replication to fail *** + +--connection server_2 +--source include/stop_slave.inc + +--connection server_1 +INSERT INTO t1 VALUES (40, 10); +CREATE TEMPORARY TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (41); +BEGIN; +INSERT INTO t2 SELECT a, 20 FROM t1; +DROP TEMPORARY TABLE t1; +COMMIT; +INSERT INTO t1 VALUES (42, 10); +--source include/save_master_gtid.inc +SELECT * FROM t1 WHERE a >= 40 ORDER BY a; +SELECT * FROM t2 WHERE a >= 40 ORDER BY a; + +--connection server_2 +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc +SELECT * FROM t1 WHERE a >= 40 ORDER BY a; +SELECT * FROM t2 WHERE a >= 40 ORDER BY a; + # Clean up. --connection server_2 diff --git a/mysql-test/suite/rpl/t/rpl_reset_slave_fail.test b/mysql-test/suite/rpl/t/rpl_reset_slave_fail.test new file mode 100644 index 00000000000..021dc76d50c --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_reset_slave_fail.test @@ -0,0 +1,91 @@ +############################################################################### +# Bug#24901077: RESET SLAVE ALL DOES NOT ALWAYS RESET SLAVE +# +# Problem: +# ======= +# If you have a relay log index file that has ended up with +# some relay log files that do not exists, then RESET SLAVE +# ALL is not enough to get back to a clean state. +############################################################################### +# Remove all slave-relay-bin.0* files (do not remove slave-relay-bin.index) +# During server restart rli initialization will fail as there are no +# relay logs. In case of bug RESET SLAVE will not do the required clean up +# as rli is not inited and subsequent START SLAVE will fail. +# Disable "Warning 1612 Being purged log ./slave-relay-bin.0* was not found" +# because it is different on Unix and Windows systems. + +--source include/have_binlog_format_mixed.inc +--source include/master-slave.inc + +--connection master +CREATE TABLE t1 (c1 INT); +INSERT INTO t1 (c1) VALUES (1); +--sync_slave_with_master + +--connection slave +--source include/stop_slave_sql.inc +--let $MYSQLD_SLAVE_DATADIR= `select @@datadir` + +--connection master +# Generate more relay logs on slave. +FLUSH LOGS; +FLUSH LOGS; +INSERT INTO t1 (c1) VALUES (2); + +--source include/sync_slave_io_with_master.inc +call mtr.add_suppression("File '.*slave-relay-bin."); +call mtr.add_suppression("Could not open log file"); +call mtr.add_suppression("Failed to open the relay log"); +call mtr.add_suppression("Failed to initialize the master info structure"); + +# Stop slave +--let $rpl_server_number= 2 +--source include/rpl_stop_server.inc + +# Delete file(s) +--echo # Removing $remove_pattern file(s) +--let $remove_pattern= slave-relay-bin.0* +--remove_files_wildcard $MYSQLD_SLAVE_DATADIR $remove_pattern + +# Start slave +--let $rpl_server_number= 2 +--source include/rpl_start_server.inc + +# Start slave must fail because of the removed file(s). +--error ER_MASTER_INFO +START SLAVE; + +# Try a second time, it must fail again. +--error ER_MASTER_INFO +START SLAVE; + +# Retrieve master executed position before reset slave. +--let $master_exec_file= query_get_value("SHOW SLAVE STATUS", Relay_Master_Log_File, 1) +--let $master_exec_pos= query_get_value("SHOW SLAVE STATUS", Exec_Master_Log_Pos, 1) + +# Reset slave. +# Disable "Warning 1612 Being purged log ./slave-relay-bin.0* was not found" +# because it is different on Unix and Windows systems. +--disable_warnings +RESET SLAVE; +--enable_warnings +DROP TABLE t1; +--replace_result $master_exec_file MASTER_LOG_FILE $master_exec_pos MASTER_LOG_POS +--eval START SLAVE UNTIL MASTER_LOG_FILE= '$master_exec_file', MASTER_LOG_POS= $master_exec_pos; +--source include/wait_for_slave_sql_to_stop.inc +--source include/stop_slave_io.inc + +# Start slave. +--source include/start_slave.inc + +--connection master +--sync_slave_with_master +# Check consistency. +--let $diff_tables= master:t1, slave:t1 +--source include/diff_tables.inc + +# Cleanup +--connection master +DROP TABLE t1; +--sync_slave_with_master +--source include/rpl_end.inc diff --git a/mysql-test/suite/storage_engine/alter_table.result b/mysql-test/suite/storage_engine/alter_table.result index 09696e0e6b6..85db1514421 100644 --- a/mysql-test/suite/storage_engine/alter_table.result +++ b/mysql-test/suite/storage_engine/alter_table.result @@ -13,7 +13,7 @@ ALTER TABLE t1 ALTER COLUMN a SET DEFAULT '0'; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` int(11) DEFAULT '0', + `a` int(11) DEFAULT 0, `c` char(8) DEFAULT NULL, `b` int(11) DEFAULT NULL ) ENGINE= DEFAULT CHARSET=latin1 diff --git a/mysql-test/suite/storage_engine/alter_tablespace.result b/mysql-test/suite/storage_engine/alter_tablespace.result index b54d7c99e9e..ff3da9f68bb 100644 --- a/mysql-test/suite/storage_engine/alter_tablespace.result +++ b/mysql-test/suite/storage_engine/alter_tablespace.result @@ -10,7 +10,7 @@ a 2 ALTER TABLE t1 DISCARD TABLESPACE; SELECT a FROM t1; -ERROR HY000: Tablespace has been discarded for table 't1' +ERROR HY000: Tablespace has been discarded for table `t1` ALTER TABLE t1 IMPORT TABLESPACE; Warnings: Warning 1810 IO Read error: (2, No such file or directory) Error opening './test/t1.cfg', will attempt to import without schema verification diff --git a/mysql-test/suite/storage_engine/create_table.result b/mysql-test/suite/storage_engine/create_table.result index 87bf37046ba..6936854eb65 100644 --- a/mysql-test/suite/storage_engine/create_table.result +++ b/mysql-test/suite/storage_engine/create_table.result @@ -27,7 +27,7 @@ CREATE TABLE t1 ENGINE= AS SELECT 1 UNION SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `1` bigint(20) NOT NULL DEFAULT '0' + `1` bigint(20) NOT NULL DEFAULT 0 ) ENGINE= DEFAULT CHARSET=latin1 SELECT * FROM t1; 1 diff --git a/mysql-test/suite/storage_engine/disabled.def b/mysql-test/suite/storage_engine/disabled.def index e69de29bb2d..658d0c240db 100644 --- a/mysql-test/suite/storage_engine/disabled.def +++ b/mysql-test/suite/storage_engine/disabled.def @@ -0,0 +1,12 @@ +alter_table_online : MDEV-9705 - Field type conversion warnings have changed to worse +col_opt_null : MDEV-10252 - Row count in 'out of range' warnings is off +col_opt_not_null : MDEV-10252 - Row count in 'out of range' warnings is off +col_opt_unsigned : MDEV-10252 - Row count in 'out of range' warnings is off +col_opt_zerofill : MDEV-10252 - Row count in 'out of range' warnings is off +type_binary : MDEV-10252 - Row count in 'out of range' warnings is off +type_char : MDEV-10252 - Row count in 'out of range' warnings is off +type_fixed : MDEV-10252 - Row count in 'out of range' warnings is off +type_float : MDEV-10252 - Row count in 'out of range' warnings is off +type_int : MDEV-10252 - Row count in 'out of range' warnings is off +type_varbinary : MDEV-10252 - Row count in 'out of range' warnings is off +type_varchar : MDEV-10252 - Row count in 'out of range' warnings is off diff --git a/mysql-test/suite/storage_engine/insert_delayed.test b/mysql-test/suite/storage_engine/insert_delayed.test index 3ded1686714..ece0bf3cf68 100644 --- a/mysql-test/suite/storage_engine/insert_delayed.test +++ b/mysql-test/suite/storage_engine/insert_delayed.test @@ -1,4 +1,4 @@ -# +# # INSERT DELAYED # diff --git a/mysql-test/suite/storage_engine/parts/repair_table.opt b/mysql-test/suite/storage_engine/parts/repair_table.opt new file mode 100644 index 00000000000..759bf0b6429 --- /dev/null +++ b/mysql-test/suite/storage_engine/parts/repair_table.opt @@ -0,0 +1 @@ +--myisam-recover-options=DEFAULT diff --git a/mysql-test/suite/storage_engine/parts/repair_table.result b/mysql-test/suite/storage_engine/parts/repair_table.result index d9ac215797b..727c648ef6f 100644 --- a/mysql-test/suite/storage_engine/parts/repair_table.result +++ b/mysql-test/suite/storage_engine/parts/repair_table.result @@ -88,6 +88,7 @@ call mtr.add_suppression("Got an error from thread_id=.*"); call mtr.add_suppression("MySQL thread id .*, query id .* localhost.*root Checking table"); call mtr.add_suppression(" '\..test.t1'"); call mtr.add_suppression("Couldn't repair table: test.t1"); +call mtr.add_suppression("Table 't1' is marked as crashed.*"); CREATE TABLE t1 (a , b , (a)) ENGINE= PARTITION BY HASH(a) PARTITIONS 2; REPAIR TABLE t1; Table Op Msg_type Msg_text diff --git a/mysql-test/suite/storage_engine/parts/truncate_table.result b/mysql-test/suite/storage_engine/parts/truncate_table.result index fc409b805e2..bfbca529200 100644 --- a/mysql-test/suite/storage_engine/parts/truncate_table.result +++ b/mysql-test/suite/storage_engine/parts/truncate_table.result @@ -14,7 +14,7 @@ t1 CREATE TABLE `t1` ( `c` char(8) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE= DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) + PARTITION BY HASH (`a`) PARTITIONS 2 INSERT INTO t1 (c) VALUES ('a'),('b'),('c'); SHOW CREATE TABLE t1; @@ -24,7 +24,7 @@ t1 CREATE TABLE `t1` ( `c` char(8) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE= AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) + PARTITION BY HASH (`a`) PARTITIONS 2 TRUNCATE TABLE t1; SHOW CREATE TABLE t1; @@ -34,7 +34,7 @@ t1 CREATE TABLE `t1` ( `c` char(8) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE= DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) + PARTITION BY HASH (`a`) PARTITIONS 2 INSERT INTO t1 (c) VALUES ('d'); SHOW CREATE TABLE t1; @@ -44,7 +44,7 @@ t1 CREATE TABLE `t1` ( `c` char(8) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE= AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) + PARTITION BY HASH (`a`) PARTITIONS 2 SELECT a,c FROM t1; a c diff --git a/mysql-test/suite/storage_engine/repair_table.inc b/mysql-test/suite/storage_engine/repair_table.inc index aa3b4e6304d..a295b4c19f2 100644 --- a/mysql-test/suite/storage_engine/repair_table.inc +++ b/mysql-test/suite/storage_engine/repair_table.inc @@ -91,6 +91,9 @@ if ($have_default_index) call mtr.add_suppression(" '\..test.t1'"); call mtr.add_suppression("Couldn't repair table: test.t1"); + # In 10.2 with log_warnings=2 the error message is printed to the error log + call mtr.add_suppression("Table 't1' is marked as crashed.*"); + --let $create_definition = a $int_indexed_col, b $char_col, $default_index (a) --source create_table.inc REPAIR TABLE t1; diff --git a/mysql-test/suite/storage_engine/repair_table.result b/mysql-test/suite/storage_engine/repair_table.result index a20b9be3ba1..d518e47756f 100644 --- a/mysql-test/suite/storage_engine/repair_table.result +++ b/mysql-test/suite/storage_engine/repair_table.result @@ -59,6 +59,7 @@ call mtr.add_suppression("Got an error from thread_id=.*"); call mtr.add_suppression("MySQL thread id .*, query id .* localhost.*root Checking table"); call mtr.add_suppression(" '\..test.t1'"); call mtr.add_suppression("Couldn't repair table: test.t1"); +call mtr.add_suppression("Table 't1' is marked as crashed.*"); CREATE TABLE t1 (a , b , (a)) ENGINE= ; REPAIR TABLE t1; Table Op Msg_type Msg_text @@ -85,7 +86,7 @@ Table Op Msg_type Msg_text test.t1 check error Size of datafile is: 39 Should be: 65 test.t1 check error Corrupt SELECT a,b FROM t1; -ERROR HY000: Incorrect key file for table 't1'; try to repair it +ERROR HY000: Index for table 't1' is corrupt; try to repair it # Statement ended with one of expected results (0,ER_NOT_KEYFILE,144). # If you got a difference in error message, just add it to rdiff file INSERT INTO t1 (a,b) VALUES (14,'n'),(15,'o'); diff --git a/mysql-test/suite/storage_engine/tbl_opt_data_index_dir.result b/mysql-test/suite/storage_engine/tbl_opt_data_dir.result similarity index 66% rename from mysql-test/suite/storage_engine/tbl_opt_data_index_dir.result rename to mysql-test/suite/storage_engine/tbl_opt_data_dir.result index b8c5e75c88c..19b7d539b45 100644 --- a/mysql-test/suite/storage_engine/tbl_opt_data_index_dir.result +++ b/mysql-test/suite/storage_engine/tbl_opt_data_dir.result @@ -1,16 +1,19 @@ DROP TABLE IF EXISTS t1; +# Running CREATE TABLE .. DATA DIRECTORY = <> SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` char(8) DEFAULT NULL -) ENGINE= DEFAULT CHARSET=latin1 DATA DIRECTORY='' INDEX DIRECTORY='' +) ENGINE= DEFAULT CHARSET=latin1 DATA DIRECTORY='' +# For ALTER TABLE the option is ignored +# Running ALTER TABLE .. DATA DIRECTORY = <> Warnings: -Warning 1618 option ignored +Warning 1618 option ignored SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` char(8) DEFAULT NULL -) ENGINE= DEFAULT CHARSET=latin1 DATA DIRECTORY='' INDEX DIRECTORY='' +) ENGINE= DEFAULT CHARSET=latin1 DATA DIRECTORY='' DROP TABLE t1; diff --git a/mysql-test/suite/storage_engine/tbl_opt_data_dir.test b/mysql-test/suite/storage_engine/tbl_opt_data_dir.test new file mode 100644 index 00000000000..434ca449125 --- /dev/null +++ b/mysql-test/suite/storage_engine/tbl_opt_data_dir.test @@ -0,0 +1,52 @@ +# +# Check whether DATA DIRECTORY is supported in CREATE and ALTER TABLE +# +# Note: the test does not check whether the option +# has any real effect on the table, only that it is accepted +# + +--source include/have_symlink.inc +--source have_engine.inc + +--let $data_dir1 = $MYSQLTEST_VARDIR/storage_engine_data_dir1/ +--let $data_dir2 = $MYSQLTEST_VARDIR/storage_engine_data_dir2/ +--mkdir $data_dir1 +--mkdir $data_dir2 + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +--let $table_options = DATA DIRECTORY = '$data_dir1' +# We cannot mask the folder name here and further, but we can switch off query logging +--let $disable_query_log = 1 +--echo # Running CREATE TABLE .. DATA DIRECTORY = <> +--source create_table.inc + +--source mask_engine.inc +--replace_result $data_dir1 +SHOW CREATE TABLE t1; + +--echo # For ALTER TABLE the option is ignored + +--let $alter_definition = DATA DIRECTORY = '$data_dir2' +--disable_query_log +--echo # Running ALTER TABLE .. DATA DIRECTORY = <> +--source alter_table.inc +if ($mysql_errname) +{ + --let $my_last_stmt = $alter_statement + --let $functionality = ALTER TABLE + --source unexpected_result.inc +} +--enable_query_log +--source mask_engine.inc +--replace_result $data_dir1 +SHOW CREATE TABLE t1; + +DROP TABLE t1; + +--source cleanup_engine.inc + +--rmdir $data_dir1 +--rmdir $data_dir2 diff --git a/mysql-test/suite/storage_engine/tbl_opt_data_index_dir.test b/mysql-test/suite/storage_engine/tbl_opt_data_index_dir.test deleted file mode 100644 index 4a83cc46b84..00000000000 --- a/mysql-test/suite/storage_engine/tbl_opt_data_index_dir.test +++ /dev/null @@ -1,52 +0,0 @@ -# -# Check whether DATA DIRECTORY and INDEX DIRECTORY -# are supported in CREATE and ALTER TABLE -# -# Note: the test does not check whether the options -# have any real effect on the table, only -# that they are accepted -# - ---source include/have_symlink.inc ---source have_engine.inc - ---let $data_dir = $MYSQLTEST_VARDIR/storage_engine_data_dir/ ---let $index_dir = $MYSQLTEST_VARDIR/storage_engine_index_dir/ ---mkdir $data_dir ---mkdir $index_dir - ---disable_warnings -DROP TABLE IF EXISTS t1; ---enable_warnings - ---let $table_options = DATA DIRECTORY = '$data_dir' INDEX DIRECTORY = '$index_dir' -# We cannot mask the folders name here, but we can switch off query logging ---let $disable_query_log = 1 ---source create_table.inc - ---source mask_engine.inc ---replace_result $data_dir $index_dir -SHOW CREATE TABLE t1; - ---let $alter_definition = INDEX DIRECTORY = '$data_dir' ---disable_query_log ---source alter_table.inc -if ($mysql_errname) -{ - --let $my_last_stmt = $alter_statement - --let $functionality = ALTER TABLE - --source unexpected_result.inc -} ---enable_query_log ---source mask_engine.inc ---replace_result $data_dir $index_dir -SHOW CREATE TABLE t1; - -DROP TABLE t1; - ---source cleanup_engine.inc - ---rmdir $data_dir ---rmdir $index_dir - - diff --git a/mysql-test/suite/storage_engine/tbl_opt_index_dir.result b/mysql-test/suite/storage_engine/tbl_opt_index_dir.result new file mode 100644 index 00000000000..c7368e9a84a --- /dev/null +++ b/mysql-test/suite/storage_engine/tbl_opt_index_dir.result @@ -0,0 +1,19 @@ +DROP TABLE IF EXISTS t1; +# Running CREATE TABLE .. INDEX DIRECTORY = <> +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` char(8) DEFAULT NULL +) ENGINE= DEFAULT CHARSET=latin1 INDEX DIRECTORY='' +# For ALTER TABLE the option is ignored +# Running ALTER TABLE .. INDEX DIRECTORY = <> +Warnings: +Warning 1618 option ignored +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` char(8) DEFAULT NULL +) ENGINE= DEFAULT CHARSET=latin1 INDEX DIRECTORY='' +DROP TABLE t1; diff --git a/mysql-test/suite/storage_engine/tbl_opt_index_dir.test b/mysql-test/suite/storage_engine/tbl_opt_index_dir.test new file mode 100644 index 00000000000..03d2ef2bf82 --- /dev/null +++ b/mysql-test/suite/storage_engine/tbl_opt_index_dir.test @@ -0,0 +1,52 @@ +# +# Check whether INDEX DIRECTORY is supported in CREATE and ALTER TABLE +# +# Note: the test does not check whether the option +# has any real effect on the table, only that it is accepted +# + +--source include/have_symlink.inc +--source have_engine.inc + +--let $index_dir1 = $MYSQLTEST_VARDIR/storage_engine_index_dir1/ +--let $index_dir2 = $MYSQLTEST_VARDIR/storage_engine_index_dir2/ +--mkdir $index_dir1 +--mkdir $index_dir2 + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +--let $table_options = INDEX DIRECTORY = '$index_dir1' +# We cannot mask the folder name here and further, but we can switch off query logging +--let $disable_query_log = 1 +--echo # Running CREATE TABLE .. INDEX DIRECTORY = <> +--source create_table.inc + +--source mask_engine.inc +--replace_result $index_dir1 +SHOW CREATE TABLE t1; + +--echo # For ALTER TABLE the option is ignored + +--let $alter_definition = INDEX DIRECTORY = '$index_dir2' +--disable_query_log +--echo # Running ALTER TABLE .. INDEX DIRECTORY = <> +--source alter_table.inc +if ($mysql_errname) +{ + --let $my_last_stmt = $alter_statement + --let $functionality = ALTER TABLE + --source unexpected_result.inc +} +--enable_query_log +--source mask_engine.inc +--replace_result $index_dir1 +SHOW CREATE TABLE t1; + +DROP TABLE t1; + +--source cleanup_engine.inc + +--rmdir $index_dir1 +--rmdir $index_dir2 diff --git a/mysql-test/suite/storage_engine/tbl_opt_row_format.result b/mysql-test/suite/storage_engine/tbl_opt_row_format.result index 5f1cf713bb6..57000e295f7 100644 --- a/mysql-test/suite/storage_engine/tbl_opt_row_format.result +++ b/mysql-test/suite/storage_engine/tbl_opt_row_format.result @@ -1,16 +1,30 @@ DROP TABLE IF EXISTS t1; -CREATE TABLE t1 (a , b ) ENGINE= ROW_FORMAT=FIXED; -SHOW CREATE TABLE t1; -Table Create Table -t1 CREATE TABLE `t1` ( - `a` int(11) DEFAULT NULL, - `b` char(8) DEFAULT NULL -) ENGINE= DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED -ALTER TABLE t1 ROW_FORMAT=DYNAMIC; +CREATE TABLE t1 (a , b ) ENGINE= ROW_FORMAT=DYNAMIC; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` char(8) DEFAULT NULL ) ENGINE= DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC +ALTER TABLE t1 ROW_FORMAT=FIXED; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` char(8) DEFAULT NULL +) ENGINE= DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED +ALTER TABLE t1 ROW_FORMAT=PAGE; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` char(8) DEFAULT NULL +) ENGINE= DEFAULT CHARSET=latin1 ROW_FORMAT=PAGE +ALTER TABLE t1 ROW_FORMAT=COMPACT; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` char(8) DEFAULT NULL +) ENGINE= DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT DROP TABLE t1; diff --git a/mysql-test/suite/storage_engine/tbl_opt_row_format.test b/mysql-test/suite/storage_engine/tbl_opt_row_format.test index d6347551da0..17fe2f36429 100644 --- a/mysql-test/suite/storage_engine/tbl_opt_row_format.test +++ b/mysql-test/suite/storage_engine/tbl_opt_row_format.test @@ -13,12 +13,12 @@ DROP TABLE IF EXISTS t1; --enable_warnings ---let $table_options = ROW_FORMAT=FIXED +--let $table_options = ROW_FORMAT=DYNAMIC --source create_table.inc --source mask_engine.inc SHOW CREATE TABLE t1; ---let $alter_definition = ROW_FORMAT=DYNAMIC +--let $alter_definition = ROW_FORMAT=FIXED --source alter_table.inc if ($mysql_errname) { @@ -29,6 +29,30 @@ if ($mysql_errname) --source mask_engine.inc SHOW CREATE TABLE t1; +--let $alter_definition = ROW_FORMAT=PAGE +--source alter_table.inc +if ($mysql_errname) +{ + --let $my_last_stmt = $alter_statement + --let $functionality = ALTER TABLE + --source unexpected_result.inc +} +--source mask_engine.inc +SHOW CREATE TABLE t1; + + +--let $alter_definition = ROW_FORMAT=COMPACT +--source alter_table.inc +if ($mysql_errname) +{ + --let $my_last_stmt = $alter_statement + --let $functionality = ALTER TABLE + --source unexpected_result.inc +} +--source mask_engine.inc +SHOW CREATE TABLE t1; + + DROP TABLE t1; --source cleanup_engine.inc diff --git a/mysql-test/suite/storage_engine/tbl_temporary.test b/mysql-test/suite/storage_engine/tbl_temporary.test index 963238c37a5..66b63fd2d83 100644 --- a/mysql-test/suite/storage_engine/tbl_temporary.test +++ b/mysql-test/suite/storage_engine/tbl_temporary.test @@ -26,7 +26,8 @@ if (!$mysql_errname) SHOW CREATE TABLE t1; DROP TEMPORARY TABLE t1; - DROP TABLE t1; } +DROP TABLE t1; + --source cleanup_engine.inc diff --git a/mysql-test/suite/storage_engine/type_binary_indexes.test b/mysql-test/suite/storage_engine/type_binary_indexes.test index 943593027f8..c17b0c53a68 100644 --- a/mysql-test/suite/storage_engine/type_binary_indexes.test +++ b/mysql-test/suite/storage_engine/type_binary_indexes.test @@ -131,6 +131,11 @@ if (!$mysql_errname) INSERT INTO t1 (b,b20,v16,v128) VALUES ('a','char1','varchar1a','varchar1b'),('a','char2','varchar2a','varchar2b'),('b','char3','varchar1a','varchar1b'),('c','char4','varchar3a','varchar3b'),('d','char5','varchar4a','varchar3b'),('e','char6','varchar2a','varchar3b'); INSERT INTO t1 (b,b20,v16,v128) SELECT b,b20,v16,v128 FROM t1; + --disable_result_log + --disable_query_log + ANALYZE TABLE t1; + --enable_query_log + --enable_result_log --replace_column 1 # 2 # 3 # 4 # 5 # 7 # 8 # 9 # 10 # EXPLAIN SELECT HEX(SUBSTRING(v16,0,3)) FROM t1 WHERE v16 LIKE 'varchar%'; diff --git a/mysql-test/suite/storage_engine/type_char_indexes.result b/mysql-test/suite/storage_engine/type_char_indexes.result index 5be07bdf53f..73c076863ab 100644 --- a/mysql-test/suite/storage_engine/type_char_indexes.result +++ b/mysql-test/suite/storage_engine/type_char_indexes.result @@ -97,7 +97,7 @@ varchar2b 1 varchar3b 1 SET SESSION optimizer_switch = 'engine_condition_pushdown=on'; Warnings: -Warning 1681 'engine_condition_pushdown=on' is deprecated and will be removed in a future release. +Warning 1681 'engine_condition_pushdown=on' is deprecated and will be removed in a future release EXPLAIN SELECT c,c20,v16,v128 FROM t1 WHERE c > 'a'; id select_type table type possible_keys key key_len ref rows Extra # # # range c_v c_v # # # Using index condition diff --git a/mysql-test/suite/storage_engine/type_date_time.result b/mysql-test/suite/storage_engine/type_date_time.result index 473a7e67494..f136dd93f34 100644 --- a/mysql-test/suite/storage_engine/type_date_time.result +++ b/mysql-test/suite/storage_engine/type_date_time.result @@ -13,7 +13,7 @@ SHOW COLUMNS IN t1; Field Type Null Key Default Extra d date # # # dt datetime # # # -ts timestamp # # # on update CURRENT_TIMESTAMP +ts timestamp # # # on update current_timestamp() t time # # # y year(4) # # # y4 year(4) # # # diff --git a/mysql-test/suite/storage_engine/type_spatial.result b/mysql-test/suite/storage_engine/type_spatial.result index e1ae2f1fa64..cab1942153f 100644 --- a/mysql-test/suite/storage_engine/type_spatial.result +++ b/mysql-test/suite/storage_engine/type_spatial.result @@ -350,8 +350,8 @@ fid IsClosed(g) 116 0 SELECT fid, AsText(Centroid(g)) FROM gis_multi_polygon; fid AsText(Centroid(g)) -117 POINT(55.58852775304245 17.426536064113982) -118 POINT(55.58852775304245 17.426536064113982) +117 POINT(57.98031067576927 17.854754130800433) +118 POINT(57.98031067576927 17.854754130800433) 119 POINT(2 2) SELECT fid, Area(g) FROM gis_multi_polygon; fid Area(g) diff --git a/mysql-test/suite/storage_engine/type_spatial_indexes.result b/mysql-test/suite/storage_engine/type_spatial_indexes.result index 1c9fee3ceac..f608366c217 100644 --- a/mysql-test/suite/storage_engine/type_spatial_indexes.result +++ b/mysql-test/suite/storage_engine/type_spatial_indexes.result @@ -350,8 +350,8 @@ fid IsClosed(g) 116 0 SELECT fid, AsText(Centroid(g)) FROM gis_multi_polygon; fid AsText(Centroid(g)) -117 POINT(55.58852775304245 17.426536064113982) -118 POINT(55.58852775304245 17.426536064113982) +117 POINT(57.98031067576927 17.854754130800433) +118 POINT(57.98031067576927 17.854754130800433) 119 POINT(2 2) SELECT fid, Area(g) FROM gis_multi_polygon; fid Area(g) @@ -1050,8 +1050,8 @@ fid IsClosed(g) 116 0 SELECT fid, AsText(Centroid(g)) FROM gis_multi_polygon; fid AsText(Centroid(g)) -117 POINT(55.58852775304245 17.426536064113982) -118 POINT(55.58852775304245 17.426536064113982) +117 POINT(57.98031067576927 17.854754130800433) +118 POINT(57.98031067576927 17.854754130800433) 119 POINT(2 2) SELECT fid, Area(g) FROM gis_multi_polygon; fid Area(g) diff --git a/mysql-test/suite/storage_engine/vcol.result b/mysql-test/suite/storage_engine/vcol.result index d51ab038576..e56a1b0543d 100644 --- a/mysql-test/suite/storage_engine/vcol.result +++ b/mysql-test/suite/storage_engine/vcol.result @@ -3,12 +3,12 @@ CREATE TABLE t1 (a , b GENERATED ALWAYS AS (a+1)) ENGIN SHOW COLUMNS IN t1; Field Type Null Key Default Extra a int(11) # # -b int(11) # # VIRTUAL +b int(11) # # VIRTUAL GENERATED INSERT INTO t1 (a) VALUES (1),(2); INSERT INTO t1 (a,b) VALUES (3,3),(4,4); Warnings: -Warning 1906 The value specified for computed column 'b' in table 't1' ignored -Warning 1906 The value specified for computed column 'b' in table 't1' ignored +Warning 1906 The value specified for generated column 'b' in table 't1' ignored +Warning 1906 The value specified for generated column 'b' in table 't1' ignored SELECT a,b FROM t1; a b 1 2 @@ -20,12 +20,12 @@ CREATE TABLE t1 (a , b GENERATED ALWAYS AS (a+1) PERSIS SHOW COLUMNS IN t1; Field Type Null Key Default Extra a int(11) # # -b int(11) # # PERSISTENT +b int(11) # # STORED GENERATED INSERT INTO t1 (a) VALUES (1),(2); INSERT INTO t1 (a,b) VALUES (3,3),(4,4); Warnings: -Warning 1906 The value specified for computed column 'b' in table 't1' ignored -Warning 1906 The value specified for computed column 'b' in table 't1' ignored +Warning 1906 The value specified for generated column 'b' in table 't1' ignored +Warning 1906 The value specified for generated column 'b' in table 't1' ignored SELECT a,b FROM t1; a b 1 2 @@ -37,12 +37,12 @@ CREATE TABLE t1 (a , b GENERATED ALWAYS AS (a+1) VIRTUA SHOW COLUMNS IN t1; Field Type Null Key Default Extra a int(11) # # -b int(11) # # VIRTUAL +b int(11) # # VIRTUAL GENERATED INSERT INTO t1 (a) VALUES (1),(2); INSERT INTO t1 (a,b) VALUES (3,3),(4,4); Warnings: -Warning 1906 The value specified for computed column 'b' in table 't1' ignored -Warning 1906 The value specified for computed column 'b' in table 't1' ignored +Warning 1906 The value specified for generated column 'b' in table 't1' ignored +Warning 1906 The value specified for generated column 'b' in table 't1' ignored SELECT a,b FROM t1; a b 1 2 @@ -54,12 +54,12 @@ CREATE TABLE t1 (a , b AS (a+1) PERSISTENT) ENGINE= Old style AUTOINC locking (for backward compatibility); 1 => New style AUTOINC locking; 2 => No AUTOINC locking (unsafe for SBR) NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 2 -@@ -250,10 +250,10 @@ +@@ -194,10 +194,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 134217728 VARIABLE_SCOPE GLOBAL @@ -58,7 +58,7 @@ NUMERIC_BLOCK_SIZE 1048576 ENUM_VALUE_LIST NULL READ_ONLY YES -@@ -292,7 +292,7 @@ +@@ -236,7 +236,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 25 VARIABLE_SCOPE GLOBAL @@ -67,7 +67,7 @@ VARIABLE_COMMENT Dump only the hottest N% of each buffer pool, defaults to 25 NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 100 -@@ -334,7 +334,7 @@ +@@ -278,7 +278,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -76,7 +76,7 @@ VARIABLE_COMMENT Number of buffer pool instances, set to higher value on high-end machines to increase scalability NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 64 -@@ -404,7 +404,7 @@ +@@ -362,7 +362,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -85,7 +85,68 @@ VARIABLE_COMMENT A number between [0, 100] that tells how oftern buffer pool dump status in percentages should be printed. E.g. 10 means that buffer pool dump status is printed when every 10% of number of buffer pool pages are dumped. Default is 0 (only start and end status is printed). NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 100 -@@ -516,7 +516,7 @@ +@@ -474,10 +474,10 @@ + GLOBAL_VALUE_ORIGIN COMPILE-TIME + DEFAULT_VALUE 0 + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 0 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -488,7 +488,7 @@ + GLOBAL_VALUE_ORIGIN COMPILE-TIME + DEFAULT_VALUE 0 + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 100 +@@ -502,10 +502,10 @@ + GLOBAL_VALUE_ORIGIN COMPILE-TIME + DEFAULT_VALUE 0 + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 0 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -530,10 +530,10 @@ + GLOBAL_VALUE_ORIGIN COMPILE-TIME + DEFAULT_VALUE 0 + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 0 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -544,10 +544,10 @@ + GLOBAL_VALUE_ORIGIN COMPILE-TIME + DEFAULT_VALUE 0 + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 0 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -572,7 +572,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -94,7 +155,7 @@ VARIABLE_COMMENT Helps in performance tuning in heavily concurrent environments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1000 -@@ -558,7 +558,7 @@ +@@ -614,7 +614,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 5 VARIABLE_SCOPE GLOBAL @@ -103,7 +164,7 @@ VARIABLE_COMMENT If the compression failure rate of a table is greater than this number more padding is added to the pages to reduce the failures. A value of zero implies no padding NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 100 -@@ -586,7 +586,7 @@ +@@ -642,7 +642,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 50 VARIABLE_SCOPE GLOBAL @@ -112,7 +173,7 @@ VARIABLE_COMMENT Percentage of empty space on a data page that can be reserved to make the page compressible. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 75 -@@ -600,10 +600,10 @@ +@@ -656,10 +656,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 5000 VARIABLE_SCOPE GLOBAL @@ -125,7 +186,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -852,7 +852,7 @@ +@@ -936,7 +936,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 120 VARIABLE_SCOPE GLOBAL @@ -134,16 +195,7 @@ VARIABLE_COMMENT Number of pages reserved in doublewrite buffer for batch flushing NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 127 -@@ -936,7 +936,7 @@ - GLOBAL_VALUE_ORIGIN COMPILE-TIME - DEFAULT_VALUE 1 - VARIABLE_SCOPE GLOBAL --VARIABLE_TYPE BIGINT UNSIGNED -+VARIABLE_TYPE INT UNSIGNED - VARIABLE_COMMENT Speeds up the shutdown process of the InnoDB storage engine. Possible values are 0, 1 (faster) or 2 (fastest - crash-like). - NUMERIC_MIN_VALUE 0 - NUMERIC_MAX_VALUE 2 -@@ -950,7 +950,7 @@ +@@ -1062,7 +1062,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 600 VARIABLE_SCOPE GLOBAL @@ -152,7 +204,7 @@ VARIABLE_COMMENT Maximum number of seconds that semaphore times out in InnoDB. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -1020,7 +1020,7 @@ +@@ -1132,7 +1132,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100 VARIABLE_SCOPE GLOBAL @@ -161,7 +213,7 @@ VARIABLE_COMMENT Percentage of B-tree page filled during bulk insert NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 100 -@@ -1034,7 +1034,7 @@ +@@ -1146,7 +1146,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -170,7 +222,7 @@ VARIABLE_COMMENT Make the first page of the given tablespace dirty. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -1048,7 +1048,7 @@ +@@ -1160,7 +1160,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 30 VARIABLE_SCOPE GLOBAL @@ -179,7 +231,7 @@ VARIABLE_COMMENT Number of iterations over which the background flushing is averaged. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1000 -@@ -1076,7 +1076,7 @@ +@@ -1188,7 +1188,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE GLOBAL @@ -188,7 +240,7 @@ VARIABLE_COMMENT Controls the durability/speed trade-off for commits. Set to 0 (write and flush redo log to disk only once per second), 1 (flush to disk at each commit), 2 (write to log at commit but flush to disk only once per second) or 3 (flush to disk at prepare and at commit, slower and usually redundant). 1 and 3 guarantees that after a crash, committed transactions will not be lost and will be consistent with the binlog and other transactional engines. 2 can get inconsistent and lose transactions if there is a power failure or kernel crash but not if mysqld crashes. 0 has no guarantees in case of crash. 0 and 2 can be faster than 1 or 3. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 3 -@@ -1104,7 +1104,7 @@ +@@ -1216,7 +1216,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE GLOBAL @@ -197,7 +249,7 @@ VARIABLE_COMMENT Set to 0 (don't flush neighbors from buffer pool), 1 (flush contiguous neighbors from buffer pool) or 2 (flush neighbors from buffer pool), when flushing a block NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 2 -@@ -1160,7 +1160,7 @@ +@@ -1272,7 +1272,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -206,7 +258,7 @@ VARIABLE_COMMENT Helps to save your data in case the disk image of the database becomes corrupt. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 6 -@@ -1188,7 +1188,7 @@ +@@ -1314,7 +1314,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 8000000 VARIABLE_SCOPE GLOBAL @@ -215,7 +267,7 @@ VARIABLE_COMMENT InnoDB Fulltext search cache size in bytes NUMERIC_MIN_VALUE 1600000 NUMERIC_MAX_VALUE 80000000 -@@ -1230,7 +1230,7 @@ +@@ -1356,7 +1356,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 84 VARIABLE_SCOPE GLOBAL @@ -224,7 +276,7 @@ VARIABLE_COMMENT InnoDB Fulltext search maximum token size in characters NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 84 -@@ -1244,7 +1244,7 @@ +@@ -1370,7 +1370,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 3 VARIABLE_SCOPE GLOBAL @@ -233,7 +285,7 @@ VARIABLE_COMMENT InnoDB Fulltext search minimum token size in characters NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16 -@@ -1258,7 +1258,7 @@ +@@ -1384,7 +1384,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 2000 VARIABLE_SCOPE GLOBAL @@ -242,7 +294,7 @@ VARIABLE_COMMENT InnoDB Fulltext search number of words to optimize for each optimize table call NUMERIC_MIN_VALUE 1000 NUMERIC_MAX_VALUE 10000 -@@ -1272,7 +1272,7 @@ +@@ -1398,7 +1398,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 2000000000 VARIABLE_SCOPE GLOBAL @@ -251,7 +303,7 @@ VARIABLE_COMMENT InnoDB Fulltext search query result cache limit in bytes NUMERIC_MIN_VALUE 1000000 NUMERIC_MAX_VALUE 4294967295 -@@ -1300,7 +1300,7 @@ +@@ -1426,7 +1426,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 2 VARIABLE_SCOPE GLOBAL @@ -260,7 +312,7 @@ VARIABLE_COMMENT InnoDB Fulltext search parallel sort degree, will round up to nearest power of 2 number NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 16 -@@ -1314,7 +1314,7 @@ +@@ -1440,7 +1440,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 640000000 VARIABLE_SCOPE GLOBAL @@ -269,7 +321,7 @@ VARIABLE_COMMENT Total memory allocated for InnoDB Fulltext Search cache NUMERIC_MIN_VALUE 32000000 NUMERIC_MAX_VALUE 1600000000 -@@ -1342,7 +1342,7 @@ +@@ -1468,7 +1468,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100 VARIABLE_SCOPE GLOBAL @@ -278,7 +330,7 @@ VARIABLE_COMMENT Up to what percentage of dirty pages should be flushed when innodb finds it has spare resources to do so. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 100 -@@ -1384,10 +1384,10 @@ +@@ -1510,10 +1510,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 200 VARIABLE_SCOPE GLOBAL @@ -291,7 +343,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1396,12 +1396,12 @@ +@@ -1522,12 +1522,12 @@ SESSION_VALUE NULL GLOBAL_VALUE 2000 GLOBAL_VALUE_ORIGIN COMPILE-TIME @@ -307,7 +359,16 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1468,7 +1468,7 @@ +@@ -1541,7 +1541,7 @@ + VARIABLE_TYPE BIGINT + VARIABLE_COMMENT No effect for this build. + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 9223372036854775807 ++NUMERIC_MAX_VALUE 2147483647 + NUMERIC_BLOCK_SIZE 0 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -1622,7 +1622,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 50 VARIABLE_SCOPE SESSION @@ -316,7 +377,29 @@ VARIABLE_COMMENT Timeout in seconds an InnoDB transaction may wait for a lock before being rolled back. Values above 100000000 disable the timeout. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1073741824 -@@ -1482,10 +1482,10 @@ +@@ -1664,10 +1664,10 @@ + GLOBAL_VALUE_ORIGIN COMPILE-TIME + DEFAULT_VALUE 0 + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 0 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -1678,7 +1678,7 @@ + GLOBAL_VALUE_ORIGIN COMPILE-TIME + DEFAULT_VALUE 0 + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 65536 +@@ -1692,10 +1692,10 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE 16777216 VARIABLE_SCOPE GLOBAL @@ -329,16 +412,16 @@ NUMERIC_BLOCK_SIZE 1024 ENUM_VALUE_LIST NULL READ_ONLY YES -@@ -1538,7 +1538,7 @@ +@@ -1762,7 +1762,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE 2 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED VARIABLE_COMMENT Number of log files in the log group. InnoDB writes to the files in a circular fashion. - NUMERIC_MIN_VALUE 2 + NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 100 -@@ -1580,7 +1580,7 @@ +@@ -1804,7 +1804,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 8192 VARIABLE_SCOPE GLOBAL @@ -347,7 +430,7 @@ VARIABLE_COMMENT Redo log write ahead unit size to avoid read-on-write, it should match the OS cache block IO size NUMERIC_MIN_VALUE 512 NUMERIC_MAX_VALUE 16384 -@@ -1594,10 +1594,10 @@ +@@ -1818,10 +1818,10 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE 1024 VARIABLE_SCOPE GLOBAL @@ -360,7 +443,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1650,10 +1650,10 @@ +@@ -1902,10 +1902,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -373,7 +456,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1664,7 +1664,7 @@ +@@ -1916,7 +1916,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -382,16 +465,25 @@ VARIABLE_COMMENT Maximum delay of user threads in micro-seconds NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 10000000 -@@ -1762,7 +1762,7 @@ +@@ -1958,7 +1958,7 @@ + GLOBAL_VALUE_ORIGIN COMPILE-TIME + DEFAULT_VALUE 0 + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 10 +@@ -2028,7 +2028,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 8 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT +VARIABLE_TYPE INT - VARIABLE_COMMENT Number of multi-threaded flush threads + VARIABLE_COMMENT DEPRECATED. Number of multi-threaded flush threads NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 64 -@@ -1818,10 +1818,10 @@ +@@ -2084,10 +2084,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -404,7 +496,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY YES -@@ -1846,7 +1846,7 @@ +@@ -2112,7 +2112,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4 VARIABLE_SCOPE GLOBAL @@ -413,7 +505,7 @@ VARIABLE_COMMENT Page cleaner threads can be from 1 to 64. Default is 4. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 64 -@@ -1874,7 +1874,7 @@ +@@ -2140,7 +2140,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 16 VARIABLE_SCOPE GLOBAL @@ -422,7 +514,7 @@ VARIABLE_COMMENT Number of rw_locks protecting buffer pool page_hash. Rounded up to the next power of 2 NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1024 -@@ -1888,7 +1888,7 @@ +@@ -2154,7 +2154,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 16384 VARIABLE_SCOPE GLOBAL @@ -431,7 +523,7 @@ VARIABLE_COMMENT Page size to use for all InnoDB tablespaces. NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 65536 -@@ -1930,7 +1930,7 @@ +@@ -2252,7 +2252,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 300 VARIABLE_SCOPE GLOBAL @@ -440,7 +532,7 @@ VARIABLE_COMMENT Number of UNDO log pages to purge in one batch from the history list. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 5000 -@@ -1944,7 +1944,7 @@ +@@ -2266,7 +2266,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 128 VARIABLE_SCOPE GLOBAL @@ -449,7 +541,7 @@ VARIABLE_COMMENT Dictates rate at which UNDO records are purged. Value N means purge rollback segment(s) on every Nth iteration of purge invocation NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 128 -@@ -1986,7 +1986,7 @@ +@@ -2308,7 +2308,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4 VARIABLE_SCOPE GLOBAL @@ -458,7 +550,7 @@ VARIABLE_COMMENT Purge threads can be from 1 to 32. Default is 4. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 32 -@@ -2014,7 +2014,7 @@ +@@ -2336,7 +2336,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 56 VARIABLE_SCOPE GLOBAL @@ -467,7 +559,7 @@ VARIABLE_COMMENT Number of pages that must be accessed sequentially for InnoDB to trigger a readahead. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 64 -@@ -2028,7 +2028,7 @@ +@@ -2350,7 +2350,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE 4 VARIABLE_SCOPE GLOBAL @@ -476,7 +568,7 @@ VARIABLE_COMMENT Number of background read I/O threads in InnoDB. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 64 -@@ -2056,10 +2056,10 @@ +@@ -2378,10 +2378,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -489,7 +581,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2084,7 +2084,7 @@ +@@ -2406,7 +2406,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 128 VARIABLE_SCOPE GLOBAL @@ -498,7 +590,7 @@ VARIABLE_COMMENT Number of undo logs to use (deprecated). NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 128 -@@ -2098,7 +2098,7 @@ +@@ -2420,7 +2420,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -507,7 +599,52 @@ VARIABLE_COMMENT An InnoDB page number. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2154,7 +2154,7 @@ +@@ -2434,7 +2434,7 @@ + GLOBAL_VALUE_ORIGIN COMPILE-TIME + DEFAULT_VALUE 0 + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 39 +@@ -2448,7 +2448,7 @@ + GLOBAL_VALUE_ORIGIN COMPILE-TIME + DEFAULT_VALUE 0 + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 39 +@@ -2462,7 +2462,7 @@ + GLOBAL_VALUE_ORIGIN COMPILE-TIME + DEFAULT_VALUE 0 + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 39 +@@ -2504,7 +2504,7 @@ + GLOBAL_VALUE_ORIGIN COMPILE-TIME + DEFAULT_VALUE 0 + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 1000 +@@ -2518,7 +2518,7 @@ + GLOBAL_VALUE_ORIGIN COMPILE-TIME + DEFAULT_VALUE 0 + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 1 +@@ -2546,7 +2546,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1048576 VARIABLE_SCOPE GLOBAL @@ -516,7 +653,7 @@ VARIABLE_COMMENT Memory buffer size for index creation NUMERIC_MIN_VALUE 65536 NUMERIC_MAX_VALUE 67108864 -@@ -2364,7 +2364,7 @@ +@@ -2770,7 +2770,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE GLOBAL @@ -525,7 +662,7 @@ VARIABLE_COMMENT Size of the mutex/lock wait array. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1024 -@@ -2392,10 +2392,10 @@ +@@ -2798,10 +2798,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 30 VARIABLE_SCOPE GLOBAL @@ -538,7 +675,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2434,7 +2434,7 @@ +@@ -2840,7 +2840,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -547,7 +684,7 @@ VARIABLE_COMMENT Helps in performance tuning in heavily concurrent environments. Sets the maximum number of threads allowed inside InnoDB. Value 0 will disable the thread throttling. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1000 -@@ -2448,7 +2448,7 @@ +@@ -2854,7 +2854,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 10000 VARIABLE_SCOPE GLOBAL @@ -556,7 +693,7 @@ VARIABLE_COMMENT Time of innodb thread sleeping before joining InnoDB queue (usec). Value 0 disable a sleep NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1000000 -@@ -2518,7 +2518,7 @@ +@@ -2952,7 +2952,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 128 VARIABLE_SCOPE GLOBAL @@ -565,7 +702,7 @@ VARIABLE_COMMENT Number of undo logs to use. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 128 -@@ -2546,7 +2546,7 @@ +@@ -2980,7 +2980,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -574,7 +711,7 @@ VARIABLE_COMMENT Number of undo tablespaces to use. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 127 -@@ -2630,7 +2630,7 @@ +@@ -3092,7 +3092,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE 4 VARIABLE_SCOPE GLOBAL diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb,xtradb.rdiff-disabled b/mysql-test/suite/sys_vars/r/sysvars_innodb,xtradb.rdiff-disabled index d801270c6b6..dc9a5fd05e6 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_innodb,xtradb.rdiff-disabled +++ b/mysql-test/suite/sys_vars/r/sysvars_innodb,xtradb.rdiff-disabled @@ -1,7 +1,7 @@ --- suite/sys_vars/r/sysvars_innodb.result +++ suite/sys_vars/r/sysvars_innodb,xtradb.reject @@ -47,6 +47,20 @@ - ENUM_VALUE_LIST NULL + ENUM_VALUE_LIST OFF,ON READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_ADAPTIVE_HASH_INDEX_PARTITIONS @@ -22,7 +22,7 @@ SESSION_VALUE NULL GLOBAL_VALUE 150000 @@ -355,6 +369,20 @@ - ENUM_VALUE_LIST NULL + ENUM_VALUE_LIST OFF,ON READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME INNODB_BUFFER_POOL_POPULATE @@ -177,7 +177,7 @@ VARIABLE_NAME INNODB_DATA_FILE_PATH SESSION_VALUE NULL GLOBAL_VALUE ibdata1:12M:autoextend -@@ -761,6 +901,20 @@ +@@ -775,6 +915,20 @@ ENUM_VALUE_LIST NULL READ_ONLY YES COMMAND_LINE_ARGUMENT OPTIONAL @@ -198,7 +198,7 @@ VARIABLE_NAME INNODB_ENCRYPTION_ROTATE_KEY_AGE SESSION_VALUE NULL GLOBAL_VALUE 1 -@@ -831,6 +985,20 @@ +@@ -845,6 +999,20 @@ ENUM_VALUE_LIST OFF,ON,FORCE READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL @@ -219,7 +219,7 @@ VARIABLE_NAME INNODB_FAST_SHUTDOWN SESSION_VALUE NULL GLOBAL_VALUE 1 -@@ -958,11 +1126,11 @@ +@@ -972,11 +1140,11 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME INNODB_FLUSH_LOG_AT_TRX_COMMIT @@ -296,7 +296,7 @@ VARIABLE_NAME INNODB_LOCKS_UNSAFE_FOR_BINLOG SESSION_VALUE NULL GLOBAL_VALUE OFF -@@ -1349,6 +1559,62 @@ +@@ -1363,6 +1573,62 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED @@ -359,8 +359,8 @@ VARIABLE_NAME INNODB_LOG_BUFFER_SIZE SESSION_VALUE NULL GLOBAL_VALUE 1048576 -@@ -1377,6 +1643,20 @@ - ENUM_VALUE_LIST NULL +@@ -1391,6 +1657,20 @@ + ENUM_VALUE_LIST OFF,ON READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_LOG_CHECKSUM_ALGORITHM @@ -379,8 +379,8 @@ +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME INNODB_LOG_COMPRESSED_PAGES SESSION_VALUE NULL - GLOBAL_VALUE OFF -@@ -1447,6 +1727,34 @@ + GLOBAL_VALUE ON +@@ -1461,6 +1741,34 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED @@ -415,8 +415,8 @@ VARIABLE_NAME INNODB_MAX_DIRTY_PAGES_PCT SESSION_VALUE NULL GLOBAL_VALUE 75.000000 -@@ -1713,6 +2021,62 @@ - ENUM_VALUE_LIST NULL +@@ -1727,6 +2035,62 @@ + ENUM_VALUE_LIST OFF,ON READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_PRIORITY_CLEANER @@ -478,7 +478,7 @@ VARIABLE_NAME INNODB_PURGE_BATCH_SIZE SESSION_VALUE NULL GLOBAL_VALUE 300 -@@ -1881,6 +2245,48 @@ +@@ -1895,6 +2259,48 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL @@ -527,7 +527,7 @@ VARIABLE_NAME INNODB_SCRUB_LOG SESSION_VALUE NULL GLOBAL_VALUE OFF -@@ -1909,6 +2315,34 @@ +@@ -1923,6 +2329,34 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL @@ -562,7 +562,7 @@ VARIABLE_NAME INNODB_SIMULATE_COMP_FAILURES SESSION_VALUE NULL GLOBAL_VALUE 0 -@@ -1972,7 +2406,7 @@ +@@ -2000,7 +2434,7 @@ DEFAULT_VALUE nulls_equal VARIABLE_SCOPE GLOBAL VARIABLE_TYPE ENUM @@ -571,7 +571,7 @@ NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL -@@ -2217,6 +2651,34 @@ +@@ -2245,6 +2679,34 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL @@ -606,7 +606,7 @@ VARIABLE_NAME INNODB_TRX_PURGE_VIEW_UPDATE_ONLY_DEBUG SESSION_VALUE NULL GLOBAL_VALUE OFF -@@ -2294,7 +2756,7 @@ +@@ -2322,7 +2784,7 @@ DEFAULT_VALUE OFF VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BOOLEAN @@ -615,8 +615,8 @@ NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL -@@ -2315,6 +2777,20 @@ - ENUM_VALUE_LIST NULL +@@ -2343,6 +2805,20 @@ + ENUM_VALUE_LIST OFF,ON READ_ONLY YES COMMAND_LINE_ARGUMENT NONE +VARIABLE_NAME INNODB_USE_GLOBAL_FLUSH_LOG_AT_TRX_COMMIT @@ -636,8 +636,8 @@ VARIABLE_NAME INNODB_USE_MTFLUSH SESSION_VALUE NULL GLOBAL_VALUE OFF -@@ -2329,6 +2805,20 @@ - ENUM_VALUE_LIST NULL +@@ -2357,6 +2833,20 @@ + ENUM_VALUE_LIST OFF,ON READ_ONLY YES COMMAND_LINE_ARGUMENT NONE +VARIABLE_NAME INNODB_USE_STACKTRACE @@ -657,12 +657,12 @@ VARIABLE_NAME INNODB_USE_SYS_MALLOC SESSION_VALUE NULL GLOBAL_VALUE ON -@@ -2359,12 +2849,12 @@ +@@ -2387,12 +2877,12 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME INNODB_VERSION SESSION_VALUE NULL --GLOBAL_VALUE 5.6.35 -+GLOBAL_VALUE 5.6.35-80.0 +-GLOBAL_VALUE 5.6.37 ++GLOBAL_VALUE 5.6.36-82.1 GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb.result b/mysql-test/suite/sys_vars/r/sysvars_innodb.result index 4822f43fbb2..548142ef523 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_innodb.result +++ b/mysql-test/suite/sys_vars/r/sysvars_innodb.result @@ -48,6 +48,20 @@ NUMERIC_BLOCK_SIZE NULL ENUM_VALUE_LIST OFF,ON READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_ADAPTIVE_HASH_INDEX_PARTITIONS +SESSION_VALUE NULL +GLOBAL_VALUE 8 +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE 8 +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_COMMENT It is an alias for innodb_adaptive_hash_index_parts; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE 1 +NUMERIC_MAX_VALUE 512 +NUMERIC_BLOCK_SIZE 0 +ENUM_VALUE_LIST NULL +READ_ONLY YES +COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME INNODB_ADAPTIVE_HASH_INDEX_PARTS SESSION_VALUE NULL GLOBAL_VALUE 8 @@ -314,6 +328,20 @@ NUMERIC_BLOCK_SIZE NULL ENUM_VALUE_LIST OFF,ON READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME INNODB_BUFFER_POOL_POPULATE +SESSION_VALUE NULL +GLOBAL_VALUE OFF +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE OFF +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BOOLEAN +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST OFF,ON +READ_ONLY YES +COMMAND_LINE_ARGUMENT NONE VARIABLE_NAME INNODB_BUFFER_POOL_SIZE SESSION_VALUE NULL GLOBAL_VALUE 8388608 @@ -426,6 +454,104 @@ NUMERIC_BLOCK_SIZE NULL ENUM_VALUE_LIST crc32,strict_crc32,innodb,strict_innodb,none,strict_none READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME INNODB_CLEANER_EVICTION_FACTOR +SESSION_VALUE NULL +GLOBAL_VALUE OFF +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE OFF +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BOOLEAN +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST OFF,ON +READ_ONLY NO +COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_CLEANER_FLUSH_CHUNK_SIZE +SESSION_VALUE NULL +GLOBAL_VALUE 0 +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE 0 +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE 0 +NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_BLOCK_SIZE 0 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME INNODB_CLEANER_FREE_LIST_LWM +SESSION_VALUE NULL +GLOBAL_VALUE 0 +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE 0 +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE 0 +NUMERIC_MAX_VALUE 100 +NUMERIC_BLOCK_SIZE 0 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME INNODB_CLEANER_LRU_CHUNK_SIZE +SESSION_VALUE NULL +GLOBAL_VALUE 0 +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE 0 +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE 0 +NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_BLOCK_SIZE 0 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME INNODB_CLEANER_LSN_AGE_FACTOR +SESSION_VALUE NULL +GLOBAL_VALUE DEPRECATED +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE DEPRECATED +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE ENUM +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST LEGACY,HIGH_CHECKPOINT,DEPRECATED +READ_ONLY NO +COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_CLEANER_MAX_FLUSH_TIME +SESSION_VALUE NULL +GLOBAL_VALUE 0 +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE 0 +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE 0 +NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_BLOCK_SIZE 0 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME INNODB_CLEANER_MAX_LRU_TIME +SESSION_VALUE NULL +GLOBAL_VALUE 0 +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE 0 +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE 0 +NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_BLOCK_SIZE 0 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME INNODB_CMP_PER_INDEX_ENABLED SESSION_VALUE NULL GLOBAL_VALUE OFF @@ -538,6 +664,20 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME INNODB_CORRUPT_TABLE_ACTION +SESSION_VALUE NULL +GLOBAL_VALUE deprecated +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE deprecated +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE ENUM +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST assert,warn,salvage,deprecated +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME INNODB_DATA_FILE_PATH SESSION_VALUE NULL GLOBAL_VALUE ibdata1:12M:autoextend @@ -804,6 +944,20 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY YES COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_EMPTY_FREE_LIST_ALGORITHM +SESSION_VALUE NULL +GLOBAL_VALUE DEPRECATED +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE DEPRECATED +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE ENUM +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST LEGACY,BACKOFF,DEPRECATED +READ_ONLY NO +COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME INNODB_ENCRYPTION_ROTATE_KEY_AGE SESSION_VALUE NULL GLOBAL_VALUE 1 @@ -874,6 +1028,20 @@ NUMERIC_BLOCK_SIZE NULL ENUM_VALUE_LIST OFF,ON,FORCE READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_FAKE_CHANGES +SESSION_VALUE OFF +GLOBAL_VALUE OFF +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE OFF +VARIABLE_SCOPE SESSION +VARIABLE_TYPE BOOLEAN +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST OFF,ON +READ_ONLY NO +COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME INNODB_FAST_SHUTDOWN SESSION_VALUE NULL GLOBAL_VALUE 1 @@ -1112,6 +1280,20 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME INNODB_FOREGROUND_PREFLUSH +SESSION_VALUE NULL +GLOBAL_VALUE DEPRECATED +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE DEPRECATED +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE ENUM +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST SYNC_PREFLUSH,EXPONENTIAL_BACKOFF,DEPRECATED +READ_ONLY NO +COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME INNODB_FT_AUX_TABLE SESSION_VALUE NULL GLOBAL_VALUE @@ -1350,6 +1532,20 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME INNODB_KILL_IDLE_TRANSACTION +SESSION_VALUE NULL +GLOBAL_VALUE 0 +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE 0 +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BIGINT +VARIABLE_COMMENT No effect for this build. +NUMERIC_MIN_VALUE 0 +NUMERIC_MAX_VALUE 9223372036854775807 +NUMERIC_BLOCK_SIZE 0 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME INNODB_LARGE_PREFIX SESSION_VALUE NULL GLOBAL_VALUE ON @@ -1378,6 +1574,20 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME INNODB_LOCKING_FAKE_CHANGES +SESSION_VALUE NULL +GLOBAL_VALUE OFF +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE OFF +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BOOLEAN +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST OFF,ON +READ_ONLY NO +COMMAND_LINE_ARGUMENT NONE VARIABLE_NAME INNODB_LOCKS_UNSAFE_FOR_BINLOG SESSION_VALUE NULL GLOBAL_VALUE OFF @@ -1420,6 +1630,62 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME INNODB_LOG_ARCHIVE +SESSION_VALUE NULL +GLOBAL_VALUE OFF +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE OFF +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BOOLEAN +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST OFF,ON +READ_ONLY NO +COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_LOG_ARCH_DIR +SESSION_VALUE NULL +GLOBAL_VALUE +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE VARCHAR +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST NULL +READ_ONLY YES +COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME INNODB_LOG_ARCH_EXPIRE_SEC +SESSION_VALUE NULL +GLOBAL_VALUE 0 +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE 0 +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE 0 +NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_BLOCK_SIZE 0 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_LOG_BLOCK_SIZE +SESSION_VALUE NULL +GLOBAL_VALUE 0 +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE 0 +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE 0 +NUMERIC_MAX_VALUE 65536 +NUMERIC_BLOCK_SIZE 0 +ENUM_VALUE_LIST NULL +READ_ONLY YES +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME INNODB_LOG_BUFFER_SIZE SESSION_VALUE NULL GLOBAL_VALUE 1048576 @@ -1462,6 +1728,20 @@ NUMERIC_BLOCK_SIZE NULL ENUM_VALUE_LIST OFF,ON READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME INNODB_LOG_CHECKSUM_ALGORITHM +SESSION_VALUE NULL +GLOBAL_VALUE DEPRECATED +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE DEPRECATED +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE ENUM +VARIABLE_COMMENT Deprecated and translated to innodb_log_checksums (NONE to OFF, everything else to ON); only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST CRC32,STRICT_CRC32,INNODB,STRICT_INNODB,NONE,STRICT_NONE,DEPRECATED +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME INNODB_LOG_COMPRESSED_PAGES SESSION_VALUE NULL GLOBAL_VALUE ON @@ -1496,11 +1776,11 @@ GLOBAL_VALUE 5242880 GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE 50331648 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT +VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Size of each log file in a log group. -NUMERIC_MIN_VALUE 4194304 -NUMERIC_MAX_VALUE 9223372036854775807 -NUMERIC_BLOCK_SIZE 1048576 +NUMERIC_MIN_VALUE 1048576 +NUMERIC_MAX_VALUE 549755813888 +NUMERIC_BLOCK_SIZE 65536 ENUM_VALUE_LIST NULL READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED @@ -1560,6 +1840,34 @@ NUMERIC_BLOCK_SIZE NULL ENUM_VALUE_LIST OFF,ON READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_MAX_BITMAP_FILE_SIZE +SESSION_VALUE NULL +GLOBAL_VALUE 0 +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE 0 +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE 0 +NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_BLOCK_SIZE 0 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME INNODB_MAX_CHANGED_PAGES +SESSION_VALUE NULL +GLOBAL_VALUE 0 +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE 0 +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE 0 +NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_BLOCK_SIZE 0 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME INNODB_MAX_DIRTY_PAGES_PCT SESSION_VALUE NULL GLOBAL_VALUE 75.000000 @@ -1644,6 +1952,20 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME INNODB_MIRRORED_LOG_GROUPS +SESSION_VALUE NULL +GLOBAL_VALUE 0 +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE 0 +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE 0 +NUMERIC_MAX_VALUE 10 +NUMERIC_BLOCK_SIZE 0 +ENUM_VALUE_LIST NULL +READ_ONLY YES +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME INNODB_MONITOR_DISABLE SESSION_VALUE NULL GLOBAL_VALUE @@ -1707,7 +2029,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 8 VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT -VARIABLE_COMMENT Number of multi-threaded flush threads +VARIABLE_COMMENT DEPRECATED. Number of multi-threaded flush threads NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 64 NUMERIC_BLOCK_SIZE 0 @@ -1868,6 +2190,62 @@ NUMERIC_BLOCK_SIZE NULL ENUM_VALUE_LIST OFF,ON READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_PRIORITY_CLEANER +SESSION_VALUE NULL +GLOBAL_VALUE OFF +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE OFF +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BOOLEAN +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST OFF,ON +READ_ONLY NO +COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_PRIORITY_IO +SESSION_VALUE NULL +GLOBAL_VALUE OFF +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE OFF +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BOOLEAN +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST OFF,ON +READ_ONLY NO +COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_PRIORITY_MASTER +SESSION_VALUE NULL +GLOBAL_VALUE OFF +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE OFF +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BOOLEAN +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST OFF,ON +READ_ONLY NO +COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_PRIORITY_PURGE +SESSION_VALUE NULL +GLOBAL_VALUE OFF +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE OFF +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BOOLEAN +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST OFF,ON +READ_ONLY NO +COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME INNODB_PURGE_BATCH_SIZE SESSION_VALUE NULL GLOBAL_VALUE 300 @@ -1896,34 +2274,6 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL -VARIABLE_NAME INNODB_PURGE_RUN_NOW -SESSION_VALUE NULL -GLOBAL_VALUE OFF -GLOBAL_VALUE_ORIGIN COMPILE-TIME -DEFAULT_VALUE OFF -VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT Set purge state to RUN -NUMERIC_MIN_VALUE NULL -NUMERIC_MAX_VALUE NULL -NUMERIC_BLOCK_SIZE NULL -ENUM_VALUE_LIST OFF,ON -READ_ONLY NO -COMMAND_LINE_ARGUMENT OPTIONAL -VARIABLE_NAME INNODB_PURGE_STOP_NOW -SESSION_VALUE NULL -GLOBAL_VALUE OFF -GLOBAL_VALUE_ORIGIN COMPILE-TIME -DEFAULT_VALUE OFF -VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT Set purge state to STOP -NUMERIC_MIN_VALUE NULL -NUMERIC_MAX_VALUE NULL -NUMERIC_BLOCK_SIZE NULL -ENUM_VALUE_LIST OFF,ON -READ_ONLY NO -COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME INNODB_PURGE_THREADS SESSION_VALUE NULL GLOBAL_VALUE 4 @@ -2050,6 +2400,48 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_SCHED_PRIORITY_IO +SESSION_VALUE NULL +GLOBAL_VALUE 0 +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE 0 +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE 0 +NUMERIC_MAX_VALUE 39 +NUMERIC_BLOCK_SIZE 0 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME INNODB_SCHED_PRIORITY_MASTER +SESSION_VALUE NULL +GLOBAL_VALUE 0 +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE 0 +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE 0 +NUMERIC_MAX_VALUE 39 +NUMERIC_BLOCK_SIZE 0 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME INNODB_SCHED_PRIORITY_PURGE +SESSION_VALUE NULL +GLOBAL_VALUE 0 +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE 0 +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE 0 +NUMERIC_MAX_VALUE 39 +NUMERIC_BLOCK_SIZE 0 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME INNODB_SCRUB_LOG SESSION_VALUE NULL GLOBAL_VALUE OFF @@ -2078,6 +2470,34 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_SHOW_LOCKS_HELD +SESSION_VALUE NULL +GLOBAL_VALUE 0 +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE 0 +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE 0 +NUMERIC_MAX_VALUE 1000 +NUMERIC_BLOCK_SIZE 0 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME INNODB_SHOW_VERBOSE_LOCKS +SESSION_VALUE NULL +GLOBAL_VALUE 0 +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE 0 +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE 0 +NUMERIC_MAX_VALUE 1 +NUMERIC_BLOCK_SIZE 0 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME INNODB_SIMULATE_COMP_FAILURES SESSION_VALUE NULL GLOBAL_VALUE 0 @@ -2428,6 +2848,34 @@ NUMERIC_BLOCK_SIZE NULL ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_TRACK_CHANGED_PAGES +SESSION_VALUE NULL +GLOBAL_VALUE OFF +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE OFF +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BOOLEAN +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST OFF,ON +READ_ONLY YES +COMMAND_LINE_ARGUMENT NONE +VARIABLE_NAME INNODB_TRACK_REDO_LOG_NOW +SESSION_VALUE NULL +GLOBAL_VALUE OFF +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE OFF +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BOOLEAN +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST OFF,ON +READ_ONLY NO +COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME INNODB_TRX_PURGE_VIEW_UPDATE_ONLY_DEBUG SESSION_VALUE NULL GLOBAL_VALUE OFF @@ -2540,6 +2988,20 @@ NUMERIC_BLOCK_SIZE NULL ENUM_VALUE_LIST OFF,ON READ_ONLY YES COMMAND_LINE_ARGUMENT NONE +VARIABLE_NAME INNODB_USE_GLOBAL_FLUSH_LOG_AT_TRX_COMMIT +SESSION_VALUE NULL +GLOBAL_VALUE OFF +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE OFF +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BOOLEAN +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST OFF,ON +READ_ONLY NO +COMMAND_LINE_ARGUMENT NONE VARIABLE_NAME INNODB_USE_MTFLUSH SESSION_VALUE NULL GLOBAL_VALUE OFF @@ -2547,7 +3009,21 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT Use multi-threaded flush. Default FALSE. +VARIABLE_COMMENT DEPRECATED. Use multi-threaded flush. Default FALSE. +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST OFF,ON +READ_ONLY YES +COMMAND_LINE_ARGUMENT NONE +VARIABLE_NAME INNODB_USE_STACKTRACE +SESSION_VALUE NULL +GLOBAL_VALUE OFF +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE OFF +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BOOLEAN +VARIABLE_COMMENT Deprecated and ignored; only exists to allow easier upgrade from earlier XtraDB versions. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -2570,7 +3046,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME INNODB_VERSION SESSION_VALUE NULL -GLOBAL_VALUE 5.7.14 +GLOBAL_VALUE 5.7.19 GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff b/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff index 0f34179a16d..9f2748037dd 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff +++ b/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff @@ -1,5 +1,5 @@ ---- suite/sys_vars/r/sysvars_server_embedded.result -+++ suite/sys_vars/r/sysvars_server_embedded.reject +--- a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result ++++ b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result @@ -57,7 +57,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE 1 @@ -24,7 +24,7 @@ VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED - VARIABLE_COMMENT The number of outstanding connection requests MariaDB can have. This comes into play when the main MySQL thread gets very many connection requests in a very short time + VARIABLE_COMMENT The number of outstanding connection requests MariaDB can have. This comes into play when the main MariaDB thread gets very many connection requests in a very short time NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 65535 @@ -144,7 +144,7 @@ @@ -64,7 +64,7 @@ READ_ONLY NO @@ -256,7 +256,7 @@ VARIABLE_TYPE BIGINT UNSIGNED - VARIABLE_COMMENT The size of the statement cache for updates to non-transactional engines for the binary log. If you often use statements updating a great number of rows, you can increase this to get more performance + VARIABLE_COMMENT The size of the statement cache for updates to non-transactional engines for the binary log. If you often use statements updating a great number of rows, you can increase this to get more performance. NUMERIC_MIN_VALUE 4096 -NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_MAX_VALUE 4294967295 @@ -140,7 +140,7 @@ VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED - VARIABLE_COMMENT After inserting delayed_insert_limit rows, the INSERT DELAYED handler will check if there are any SELECT statements pending. If so, it allows these to execute before continuing + VARIABLE_COMMENT After inserting delayed_insert_limit rows, the INSERT DELAYED handler will check if there are any SELECT statements pending. If so, it allows these to execute before continuing. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 @@ -659,7 +659,7 @@ @@ -226,7 +226,7 @@ NUMERIC_MAX_VALUE 1000 @@ -1012,7 +1012,7 @@ VARIABLE_TYPE BIGINT UNSIGNED - VARIABLE_COMMENT The maximum length of the result of function GROUP_CONCAT() + VARIABLE_COMMENT The maximum length of the result of function GROUP_CONCAT() NUMERIC_MIN_VALUE 4 -NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_MAX_VALUE 4294967295 @@ -289,14 +289,14 @@ READ_ONLY NO @@ -1597,7 +1597,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME - DEFAULT_VALUE 31536000 + DEFAULT_VALUE 86400 VARIABLE_SCOPE SESSION -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED VARIABLE_COMMENT Timeout in seconds to wait for a lock before returning an error. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -1709,7 +1709,7 @@ +@@ -1737,7 +1737,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION @@ -305,25 +305,25 @@ VARIABLE_COMMENT Write to slow log every #th slow query. Set to 1 to log everything. Increase it to reduce the size of the slow or the performance impact of slow logging NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -1751,7 +1751,7 @@ +@@ -1779,7 +1779,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME - DEFAULT_VALUE 1 + DEFAULT_VALUE 2 VARIABLE_SCOPE SESSION -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED VARIABLE_COMMENT Log some not critical warnings to the general log file.Value can be between 0 and 11. Higher values mean more verbosity NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -1793,7 +1793,7 @@ +@@ -1821,7 +1821,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME - DEFAULT_VALUE 4194304 + DEFAULT_VALUE 16777216 VARIABLE_SCOPE SESSION -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED VARIABLE_COMMENT Max packet length to send to or receive from the server NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -1803,14 +1803,14 @@ +@@ -1831,14 +1831,14 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_BINLOG_CACHE_SIZE SESSION_VALUE NULL @@ -341,7 +341,7 @@ NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1821,7 +1821,7 @@ +@@ -1849,7 +1849,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1073741824 VARIABLE_SCOPE GLOBAL @@ -350,7 +350,7 @@ VARIABLE_COMMENT Binary log will be rotated automatically when the size exceeds this value. NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 1073741824 -@@ -1831,14 +1831,14 @@ +@@ -1859,14 +1859,14 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_BINLOG_STMT_CACHE_SIZE SESSION_VALUE NULL @@ -368,7 +368,7 @@ NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1849,7 +1849,7 @@ +@@ -1877,7 +1877,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 151 VARIABLE_SCOPE GLOBAL @@ -377,7 +377,7 @@ VARIABLE_COMMENT The number of simultaneous clients allowed NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 100000 -@@ -1863,7 +1863,7 @@ +@@ -1891,7 +1891,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100 VARIABLE_SCOPE GLOBAL @@ -386,7 +386,7 @@ VARIABLE_COMMENT If there is more than this number of interrupted connections from a host this host will be blocked from further connections NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -1877,7 +1877,7 @@ +@@ -1905,7 +1905,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 20 VARIABLE_SCOPE SESSION @@ -395,7 +395,7 @@ VARIABLE_COMMENT Don't start more than this number of threads to handle INSERT DELAYED statements. If set to zero INSERT DELAYED will be not used NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16384 -@@ -1905,7 +1905,7 @@ +@@ -1933,7 +1933,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 64 VARIABLE_SCOPE SESSION @@ -404,7 +404,7 @@ VARIABLE_COMMENT Max number of errors/warnings to store for a statement NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 65535 -@@ -1922,7 +1922,7 @@ +@@ -1950,7 +1950,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Don't allow creation of heap tables bigger than this NUMERIC_MIN_VALUE 16384 @@ -413,7 +413,7 @@ NUMERIC_BLOCK_SIZE 1024 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1933,7 +1933,7 @@ +@@ -1961,7 +1961,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 20 VARIABLE_SCOPE SESSION @@ -422,7 +422,7 @@ VARIABLE_COMMENT Don't start more than this number of threads to handle INSERT DELAYED statements. If set to zero INSERT DELAYED will be not used NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16384 -@@ -1961,7 +1961,7 @@ +@@ -1989,7 +1989,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1024 VARIABLE_SCOPE SESSION @@ -431,7 +431,7 @@ VARIABLE_COMMENT Max number of bytes in sorted records NUMERIC_MIN_VALUE 4 NUMERIC_MAX_VALUE 8388608 -@@ -1975,7 +1975,7 @@ +@@ -2003,7 +2003,7 @@ GLOBAL_VALUE_ORIGIN AUTO DEFAULT_VALUE 1048576 VARIABLE_SCOPE GLOBAL @@ -440,7 +440,7 @@ VARIABLE_COMMENT The maximum BLOB length to send to server from mysql_send_long_data API. Deprecated option; use max_allowed_packet instead. NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -1989,7 +1989,7 @@ +@@ -2017,7 +2017,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 16382 VARIABLE_SCOPE GLOBAL @@ -449,7 +449,7 @@ VARIABLE_COMMENT Maximum number of prepared statements in the server NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2003,7 +2003,7 @@ +@@ -2031,7 +2031,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4294967295 VARIABLE_SCOPE SESSION @@ -458,7 +458,7 @@ VARIABLE_COMMENT Maximum number of iterations when executing recursive queries NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2017,7 +2017,7 @@ +@@ -2045,7 +2045,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4294967295 VARIABLE_SCOPE SESSION @@ -467,7 +467,7 @@ VARIABLE_COMMENT Limit assumed max number of seeks when looking up rows based on a key NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2031,7 +2031,7 @@ +@@ -2073,7 +2073,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1024 VARIABLE_SCOPE SESSION @@ -476,7 +476,7 @@ VARIABLE_COMMENT The number of bytes to use when sorting BLOB or TEXT values (only the first max_sort_length bytes of each value are used; the rest are ignored) NUMERIC_MIN_VALUE 4 NUMERIC_MAX_VALUE 8388608 -@@ -2045,7 +2045,7 @@ +@@ -2087,7 +2087,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE SESSION @@ -485,7 +485,7 @@ VARIABLE_COMMENT Maximum stored procedure recursion depth NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 255 -@@ -2073,7 +2073,7 @@ +@@ -2115,7 +2115,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 32 VARIABLE_SCOPE SESSION @@ -494,7 +494,7 @@ VARIABLE_COMMENT Unused, will be removed. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2101,7 +2101,7 @@ +@@ -2143,7 +2143,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4294967295 VARIABLE_SCOPE GLOBAL @@ -503,7 +503,7 @@ VARIABLE_COMMENT After this many write locks, allow some read locks to run in between NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2115,7 +2115,7 @@ +@@ -2157,7 +2157,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1024 VARIABLE_SCOPE GLOBAL @@ -512,7 +512,7 @@ VARIABLE_COMMENT Unused NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1048576 -@@ -2129,7 +2129,7 @@ +@@ -2171,7 +2171,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 8 VARIABLE_SCOPE GLOBAL @@ -521,7 +521,7 @@ VARIABLE_COMMENT Unused NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1024 -@@ -2143,7 +2143,7 @@ +@@ -2185,7 +2185,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE SESSION @@ -530,7 +530,7 @@ VARIABLE_COMMENT Don't write queries to slow log that examine fewer rows than that NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2157,7 +2157,7 @@ +@@ -2199,7 +2199,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 262144 VARIABLE_SCOPE SESSION @@ -539,7 +539,7 @@ VARIABLE_COMMENT Size of buffer to use when using MRR with range access NUMERIC_MIN_VALUE 8192 NUMERIC_MAX_VALUE 2147483647 -@@ -2171,10 +2171,10 @@ +@@ -2213,10 +2213,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 256 VARIABLE_SCOPE SESSION @@ -552,7 +552,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2185,7 +2185,7 @@ +@@ -2227,7 +2227,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1024 VARIABLE_SCOPE GLOBAL @@ -561,7 +561,7 @@ VARIABLE_COMMENT Block size to be used for MyISAM index pages NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 16384 -@@ -2199,7 +2199,7 @@ +@@ -2241,7 +2241,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 6 VARIABLE_SCOPE GLOBAL @@ -570,7 +570,7 @@ VARIABLE_COMMENT Default pointer size to be used for MyISAM tables NUMERIC_MIN_VALUE 2 NUMERIC_MAX_VALUE 7 -@@ -2209,9 +2209,9 @@ +@@ -2251,9 +2251,9 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MYISAM_MAX_SORT_FILE_SIZE SESSION_VALUE NULL @@ -582,7 +582,7 @@ VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Don't use the fast sort index method to created index if the temporary file would get bigger than this -@@ -2223,14 +2223,14 @@ +@@ -2265,14 +2265,14 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MYISAM_MMAP_SIZE SESSION_VALUE NULL @@ -600,7 +600,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY YES -@@ -2255,10 +2255,10 @@ +@@ -2297,10 +2297,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION @@ -613,7 +613,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2272,7 +2272,7 @@ +@@ -2314,7 +2314,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE NUMERIC_MIN_VALUE 4096 @@ -622,7 +622,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2325,7 +2325,7 @@ +@@ -2367,7 +2367,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 16384 VARIABLE_SCOPE SESSION @@ -631,7 +631,7 @@ VARIABLE_COMMENT Buffer length for TCP/IP and socket communication NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1048576 -@@ -2339,7 +2339,7 @@ +@@ -2381,7 +2381,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 30 VARIABLE_SCOPE SESSION @@ -640,7 +640,7 @@ VARIABLE_COMMENT Number of seconds to wait for more data from a connection before aborting the read NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -2353,7 +2353,7 @@ +@@ -2395,7 +2395,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 10 VARIABLE_SCOPE SESSION @@ -649,7 +649,7 @@ VARIABLE_COMMENT If a read on a communication port is interrupted, retry this many times before giving up NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2367,7 +2367,7 @@ +@@ -2409,7 +2409,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 60 VARIABLE_SCOPE SESSION @@ -658,7 +658,7 @@ VARIABLE_COMMENT Number of seconds to wait for a block to be written to a connection before aborting the write NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -2437,7 +2437,7 @@ +@@ -2479,7 +2479,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION @@ -667,16 +667,16 @@ VARIABLE_COMMENT Controls the heuristic(s) applied during query optimization to prune less-promising partial plans from the optimizer search space. Meaning: 0 - do not apply any heuristic, thus perform exhaustive search; 1 - prune plans based on number of retrieved rows NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1 -@@ -2451,7 +2451,7 @@ +@@ -2493,7 +2493,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 62 VARIABLE_SCOPE SESSION -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED - VARIABLE_COMMENT Maximum depth of search performed by the query optimizer. Values larger than the number of relations in a query result in better query plans, but take longer to compile a query. Values smaller than the number of tables in a relation result in faster optimization, but may produce very bad query plans. If set to 0, the system will automatically pick a reasonable value + VARIABLE_COMMENT Maximum depth of search performed by the query optimizer. Values larger than the number of relations in a query result in better query plans, but take longer to compile a query. Values smaller than the number of tables in a relation result in faster optimization, but may produce very bad query plans. If set to 0, the system will automatically pick a reasonable value. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 62 -@@ -2465,7 +2465,7 @@ +@@ -2507,7 +2507,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100 VARIABLE_SCOPE SESSION @@ -685,7 +685,7 @@ VARIABLE_COMMENT Controls number of record samples to check condition selectivity NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 4294967295 -@@ -2493,7 +2493,7 @@ +@@ -2535,7 +2535,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION @@ -694,7 +694,7 @@ VARIABLE_COMMENT Controls selectivity of which conditions the optimizer takes into account to calculate cardinality of a partial join when it searches for the best execution plan Meaning: 1 - use selectivity of index backed range conditions to calculate the cardinality of a partial join if the last joined table is accessed by full table scan or an index scan, 2 - use selectivity of index backed range conditions to calculate the cardinality of a partial join in any case, 3 - additionally always use selectivity of range conditions that are not backed by any index to calculate the cardinality of a partial join, 4 - use histograms to calculate selectivity of range conditions that are not backed by any index to calculate the cardinality of a partial join.5 - additionally use selectivity of certain non-range predicates calculated on record samples NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 5 -@@ -2521,7 +2521,7 @@ +@@ -2563,7 +2563,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -703,7 +703,7 @@ VARIABLE_COMMENT Maximum number of instrumented user@host accounts. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2535,7 +2535,7 @@ +@@ -2577,7 +2577,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -712,7 +712,7 @@ VARIABLE_COMMENT Size of the statement digest. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 200 -@@ -2549,7 +2549,7 @@ +@@ -2591,7 +2591,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -721,7 +721,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_STAGES_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2563,7 +2563,7 @@ +@@ -2605,7 +2605,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -730,7 +730,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_STAGES_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2577,7 +2577,7 @@ +@@ -2619,7 +2619,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -739,7 +739,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_STATEMENTS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2591,7 +2591,7 @@ +@@ -2633,7 +2633,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -748,7 +748,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_STATEMENTS_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2605,7 +2605,7 @@ +@@ -2647,7 +2647,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -757,7 +757,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_WAITS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2619,7 +2619,7 @@ +@@ -2661,7 +2661,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -766,7 +766,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_WAITS_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2633,7 +2633,7 @@ +@@ -2675,7 +2675,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -775,7 +775,7 @@ VARIABLE_COMMENT Maximum number of instrumented hosts. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2647,7 +2647,7 @@ +@@ -2689,7 +2689,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 80 VARIABLE_SCOPE GLOBAL @@ -784,7 +784,7 @@ VARIABLE_COMMENT Maximum number of condition instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2661,7 +2661,7 @@ +@@ -2703,7 +2703,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -793,7 +793,7 @@ VARIABLE_COMMENT Maximum number of instrumented condition objects. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2675,7 +2675,7 @@ +@@ -2717,7 +2717,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1024 VARIABLE_SCOPE GLOBAL @@ -802,7 +802,7 @@ VARIABLE_COMMENT Maximum length considered for digest text, when stored in performance_schema tables. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2689,7 +2689,7 @@ +@@ -2731,7 +2731,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 50 VARIABLE_SCOPE GLOBAL @@ -811,7 +811,7 @@ VARIABLE_COMMENT Maximum number of file instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2703,7 +2703,7 @@ +@@ -2745,7 +2745,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 32768 VARIABLE_SCOPE GLOBAL @@ -820,7 +820,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented files. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2717,7 +2717,7 @@ +@@ -2759,7 +2759,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -829,7 +829,7 @@ VARIABLE_COMMENT Maximum number of instrumented files. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2731,7 +2731,7 @@ +@@ -2773,7 +2773,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 200 VARIABLE_SCOPE GLOBAL @@ -838,7 +838,7 @@ VARIABLE_COMMENT Maximum number of mutex instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2745,7 +2745,7 @@ +@@ -2787,7 +2787,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -847,7 +847,7 @@ VARIABLE_COMMENT Maximum number of instrumented MUTEX objects. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 104857600 -@@ -2759,7 +2759,7 @@ +@@ -2801,7 +2801,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 40 VARIABLE_SCOPE GLOBAL @@ -856,7 +856,7 @@ VARIABLE_COMMENT Maximum number of rwlock instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2773,7 +2773,7 @@ +@@ -2815,7 +2815,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -865,7 +865,7 @@ VARIABLE_COMMENT Maximum number of instrumented RWLOCK objects. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 104857600 -@@ -2787,7 +2787,7 @@ +@@ -2829,7 +2829,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 10 VARIABLE_SCOPE GLOBAL @@ -874,7 +874,7 @@ VARIABLE_COMMENT Maximum number of socket instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2801,7 +2801,7 @@ +@@ -2843,7 +2843,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -883,7 +883,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented sockets. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2815,7 +2815,7 @@ +@@ -2857,7 +2857,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 150 VARIABLE_SCOPE GLOBAL @@ -892,49 +892,22 @@ VARIABLE_COMMENT Maximum number of stage instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2829,7 +2829,7 @@ +@@ -2871,7 +2871,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME - DEFAULT_VALUE 185 + DEFAULT_VALUE 188 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED VARIABLE_COMMENT Maximum number of statement instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2843,7 +2843,7 @@ - GLOBAL_VALUE_ORIGIN CONFIG - DEFAULT_VALUE -1 - VARIABLE_SCOPE GLOBAL --VARIABLE_TYPE BIGINT -+VARIABLE_TYPE INT - VARIABLE_COMMENT Maximum number of opened instrumented tables. Use 0 to disable, -1 for automated sizing. - NUMERIC_MIN_VALUE -1 - NUMERIC_MAX_VALUE 1048576 -@@ -2857,7 +2857,7 @@ - GLOBAL_VALUE_ORIGIN CONFIG - DEFAULT_VALUE -1 - VARIABLE_SCOPE GLOBAL --VARIABLE_TYPE BIGINT -+VARIABLE_TYPE INT - VARIABLE_COMMENT Maximum number of instrumented tables. Use 0 to disable, -1 for automated sizing. - NUMERIC_MIN_VALUE -1 - NUMERIC_MAX_VALUE 1048576 -@@ -2871,7 +2871,7 @@ - GLOBAL_VALUE_ORIGIN COMPILE-TIME - DEFAULT_VALUE 50 - VARIABLE_SCOPE GLOBAL --VARIABLE_TYPE BIGINT UNSIGNED -+VARIABLE_TYPE INT UNSIGNED - VARIABLE_COMMENT Maximum number of thread instruments. - NUMERIC_MIN_VALUE 0 - NUMERIC_MAX_VALUE 256 @@ -2885,7 +2885,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT +VARIABLE_TYPE INT - VARIABLE_COMMENT Maximum number of instrumented threads. Use 0 to disable, -1 for automated sizing. + VARIABLE_COMMENT Maximum number of opened instrumented tables. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 @@ -2899,7 +2899,7 @@ @@ -943,10 +916,37 @@ VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT +VARIABLE_TYPE INT - VARIABLE_COMMENT Size of session attribute string buffer per thread. Use 0 to disable, -1 for automated sizing. + VARIABLE_COMMENT Maximum number of instrumented tables. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 @@ -2913,7 +2913,7 @@ + GLOBAL_VALUE_ORIGIN COMPILE-TIME + DEFAULT_VALUE 50 + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Maximum number of thread instruments. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 256 +@@ -2927,7 +2927,7 @@ + GLOBAL_VALUE_ORIGIN CONFIG + DEFAULT_VALUE -1 + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Maximum number of instrumented threads. Use 0 to disable, -1 for automated sizing. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1048576 +@@ -2941,7 +2941,7 @@ + GLOBAL_VALUE_ORIGIN CONFIG + DEFAULT_VALUE -1 + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Size of session attribute string buffer per thread. Use 0 to disable, -1 for automated sizing. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1048576 +@@ -2955,7 +2955,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100 VARIABLE_SCOPE GLOBAL @@ -955,7 +955,7 @@ VARIABLE_COMMENT Maximum number of rows in SETUP_ACTORS. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1024 -@@ -2927,7 +2927,7 @@ +@@ -2969,7 +2969,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100 VARIABLE_SCOPE GLOBAL @@ -964,7 +964,7 @@ VARIABLE_COMMENT Maximum number of rows in SETUP_OBJECTS. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2941,7 +2941,7 @@ +@@ -2983,7 +2983,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -973,7 +973,7 @@ VARIABLE_COMMENT Maximum number of instrumented users. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3011,7 +3011,7 @@ +@@ -3053,7 +3053,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 32768 VARIABLE_SCOPE SESSION @@ -982,16 +982,16 @@ VARIABLE_COMMENT The size of the buffer that is allocated when preloading indexes NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -3039,7 +3039,7 @@ +@@ -3081,7 +3081,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 15 VARIABLE_SCOPE SESSION -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED - VARIABLE_COMMENT Limit of query profiling memory + VARIABLE_COMMENT Number of statements about which profiling information is maintained. If set to 0, no profiles are stored. See SHOW PROFILES. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 100 -@@ -3053,7 +3053,7 @@ +@@ -3095,7 +3095,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 5 VARIABLE_SCOPE SESSION @@ -1000,7 +1000,7 @@ VARIABLE_COMMENT Seconds between sending progress reports to the client for time-consuming statements. Set to 0 to disable progress reporting. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3123,7 +3123,7 @@ +@@ -3165,7 +3165,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 16384 VARIABLE_SCOPE SESSION @@ -1009,7 +1009,7 @@ VARIABLE_COMMENT Allocation block size for query parsing and execution NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -3137,7 +3137,7 @@ +@@ -3179,7 +3179,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1048576 VARIABLE_SCOPE GLOBAL @@ -1018,7 +1018,7 @@ VARIABLE_COMMENT Don't cache results that are bigger than this NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3151,7 +3151,7 @@ +@@ -3193,7 +3193,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4096 VARIABLE_SCOPE GLOBAL @@ -1027,7 +1027,7 @@ VARIABLE_COMMENT The minimum size for blocks allocated by the query cache NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3168,7 +3168,7 @@ +@@ -3210,7 +3210,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The memory allocated to store results from old queries NUMERIC_MIN_VALUE 0 @@ -1036,7 +1036,7 @@ NUMERIC_BLOCK_SIZE 1024 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3221,7 +3221,7 @@ +@@ -3263,7 +3263,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 24576 VARIABLE_SCOPE SESSION @@ -1045,7 +1045,7 @@ VARIABLE_COMMENT Persistent buffer for query parsing and execution NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -3235,7 +3235,7 @@ +@@ -3277,7 +3277,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4096 VARIABLE_SCOPE SESSION @@ -1054,7 +1054,7 @@ VARIABLE_COMMENT Allocation block size for storing ranges during optimization NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 4294967295 -@@ -3249,7 +3249,7 @@ +@@ -3291,7 +3291,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 131072 VARIABLE_SCOPE SESSION @@ -1063,7 +1063,7 @@ VARIABLE_COMMENT Each thread that does a sequential scan allocates a buffer of this size for each table it scans. If you do many sequential scans, you may want to increase this value NUMERIC_MIN_VALUE 8192 NUMERIC_MAX_VALUE 2147483647 -@@ -3277,7 +3277,7 @@ +@@ -3319,7 +3319,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 262144 VARIABLE_SCOPE SESSION @@ -1072,7 +1072,7 @@ VARIABLE_COMMENT When reading rows in sorted order after a sort, the rows are read through this buffer to avoid a disk seeks NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 2147483647 -@@ -3291,10 +3291,10 @@ +@@ -3333,10 +3333,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 8388608 VARIABLE_SCOPE SESSION @@ -1085,7 +1085,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3333,7 +3333,7 @@ +@@ -3375,7 +3375,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION @@ -1094,7 +1094,7 @@ VARIABLE_COMMENT Uniquely identifies the server instance in the community of replication partners NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -3431,7 +3431,7 @@ +@@ -3473,7 +3473,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1073741824 VARIABLE_SCOPE GLOBAL @@ -1103,7 +1103,7 @@ VARIABLE_COMMENT The maximum packet length to sent successfully from the master to slave. NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -3445,7 +3445,7 @@ +@@ -3487,7 +3487,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 2 VARIABLE_SCOPE GLOBAL @@ -1112,7 +1112,7 @@ VARIABLE_COMMENT If creating the thread takes longer than this value (in seconds), the Slow_launch_threads counter will be incremented NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 31536000 -@@ -3504,7 +3504,7 @@ +@@ -3546,7 +3546,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Each thread that needs to do a sort allocates a buffer of this size NUMERIC_MIN_VALUE 1024 @@ -1121,7 +1121,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3795,7 +3795,7 @@ +@@ -3837,7 +3837,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 256 VARIABLE_SCOPE GLOBAL @@ -1130,7 +1130,7 @@ VARIABLE_COMMENT The soft upper limit for number of cached stored routines for one connection. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 524288 -@@ -3865,7 +3865,7 @@ +@@ -3907,7 +3907,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 400 VARIABLE_SCOPE GLOBAL @@ -1139,7 +1139,7 @@ VARIABLE_COMMENT The number of cached table definitions NUMERIC_MIN_VALUE 400 NUMERIC_MAX_VALUE 524288 -@@ -3879,7 +3879,7 @@ +@@ -3921,7 +3921,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 2000 VARIABLE_SCOPE GLOBAL @@ -1148,7 +1148,7 @@ VARIABLE_COMMENT The number of cached open tables NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1048576 -@@ -3893,7 +3893,7 @@ +@@ -3949,7 +3949,7 @@ GLOBAL_VALUE_ORIGIN AUTO DEFAULT_VALUE 256 VARIABLE_SCOPE GLOBAL @@ -1157,7 +1157,7 @@ VARIABLE_COMMENT How many threads we should keep in a cache for reuse. These are freed after 5 minutes of idle time NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16384 -@@ -3907,7 +3907,7 @@ +@@ -3963,7 +3963,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 10 VARIABLE_SCOPE GLOBAL @@ -1166,16 +1166,45 @@ VARIABLE_COMMENT Permits the application to give the threads system a hint for the desired number of threads that should be run at the same time.This variable has no effect, and is deprecated. It will be removed in a future release. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 512 -@@ -4022,7 +4022,7 @@ +@@ -4070,15 +4070,15 @@ + READ_ONLY YES + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME TMP_DISK_TABLE_SIZE +-SESSION_VALUE 18446744073709551615 +-GLOBAL_VALUE 18446744073709551615 ++SESSION_VALUE 4294967295 ++GLOBAL_VALUE 4294967295 + GLOBAL_VALUE_ORIGIN COMPILE-TIME +-DEFAULT_VALUE 18446744073709551615 ++DEFAULT_VALUE 4294967295 + VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED - VARIABLE_COMMENT If an internal in-memory temporary table exceeds this size, MySQL will automatically convert it to an on-disk MyISAM or Aria table + VARIABLE_COMMENT Max size for data for an internal temporary on-disk MyISAM or Aria table. NUMERIC_MIN_VALUE 1024 -NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_MAX_VALUE 4294967295 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -4033,7 +4033,7 @@ +@@ -4092,7 +4092,7 @@ + VARIABLE_TYPE BIGINT UNSIGNED + VARIABLE_COMMENT If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table. Same as tmp_table_size. + NUMERIC_MIN_VALUE 1024 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 1 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -4106,7 +4106,7 @@ + VARIABLE_TYPE BIGINT UNSIGNED + VARIABLE_COMMENT Alias for tmp_memory_table_size. If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table. + NUMERIC_MIN_VALUE 1024 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 1 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -4117,7 +4117,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 8192 VARIABLE_SCOPE SESSION @@ -1184,7 +1213,7 @@ VARIABLE_COMMENT Allocation block size for transactions to be stored in binary log NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 134217728 -@@ -4047,7 +4047,7 @@ +@@ -4131,7 +4131,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4096 VARIABLE_SCOPE SESSION @@ -1193,7 +1222,7 @@ VARIABLE_COMMENT Persistent buffer for transactions to be stored in binary log NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 134217728 -@@ -4145,7 +4145,7 @@ +@@ -4229,7 +4229,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 28800 VARIABLE_SCOPE SESSION @@ -1202,7 +1231,7 @@ VARIABLE_COMMENT The number of seconds the server waits for activity on a connection before closing it NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -4249,7 +4249,7 @@ +@@ -4333,7 +4333,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME OPEN_FILES_LIMIT VARIABLE_SCOPE GLOBAL @@ -1211,7 +1240,7 @@ VARIABLE_COMMENT If this is not 0, then mysqld will use this value to reserve file descriptors to use with setrlimit(). If this value is 0 then mysqld will reserve max_connections*5 or max_connections + table_cache*2 (whichever is larger) number of file descriptors NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -4262,7 +4262,7 @@ +@@ -4346,7 +4346,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes NUMERIC_MIN_VALUE 0 @@ -1220,7 +1249,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -4272,7 +4272,7 @@ +@@ -4356,7 +4356,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes NUMERIC_MIN_VALUE 0 @@ -1229,7 +1258,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -4357,7 +4357,7 @@ +@@ -4441,7 +4441,7 @@ VARIABLE_NAME LOG_TC_SIZE GLOBAL_VALUE_ORIGIN AUTO VARIABLE_SCOPE GLOBAL diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result index 8880c9f8ca9..7767ef18be2 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result @@ -30,7 +30,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE ON VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT autocommit +VARIABLE_COMMENT If set to 1, the default, all queries are committed immediately. If set to 0, they are only committed upon a COMMIT statement, or rolled back with a ROLLBACK statement. If autocommit is set to 0, and then changed to 1, all open transactions are immediately committed. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -86,7 +86,7 @@ GLOBAL_VALUE_ORIGIN AUTO DEFAULT_VALUE 150 VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED -VARIABLE_COMMENT The number of outstanding connection requests MariaDB can have. This comes into play when the main MySQL thread gets very many connection requests in a very short time +VARIABLE_COMMENT The number of outstanding connection requests MariaDB can have. This comes into play when the main MariaDB thread gets very many connection requests in a very short time NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 65535 NUMERIC_BLOCK_SIZE 1 @@ -114,7 +114,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT Allow big result sets by saving all temporary sets on file (Solves most 'table full' errors) +VARIABLE_COMMENT Old variable, which if set to 1, allows large result sets by saving all temporary sets to disk, avoiding 'table full' errors. No longer needed, as the server now handles this automatically. sql_big_tables is a synonym. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -254,7 +254,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 32768 VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED -VARIABLE_COMMENT The size of the statement cache for updates to non-transactional engines for the binary log. If you often use statements updating a great number of rows, you can increase this to get more performance +VARIABLE_COMMENT The size of the statement cache for updates to non-transactional engines for the binary log. If you often use statements updating a great number of rows, you can increase this to get more performance. NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 18446744073709551615 NUMERIC_BLOCK_SIZE 4096 @@ -646,7 +646,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100 VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED -VARIABLE_COMMENT After inserting delayed_insert_limit rows, the INSERT DELAYED handler will check if there are any SELECT statements pending. If so, it allows these to execute before continuing +VARIABLE_COMMENT After inserting delayed_insert_limit rows, the INSERT DELAYED handler will check if there are any SELECT statements pending. If so, it allows these to execute before continuing. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 NUMERIC_BLOCK_SIZE 1 @@ -688,7 +688,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE ON VARIABLE_SCOPE GLOBAL VARIABLE_TYPE ENUM -VARIABLE_COMMENT Type of DELAY_KEY_WRITE +VARIABLE_COMMENT Specifies how MyISAM tables handles CREATE TABLE DELAY_KEY_WRITE. If set to ON, the default, any DELAY KEY WRITEs are honored. The key buffer is then flushed only when the table closes, speeding up writes. MyISAM tables should be automatically checked upon startup in this case, and --external locking should not be used, as it can lead to index corruption. If set to OFF, DELAY KEY WRITEs are ignored, while if set to ALL, all new opened tables are treated as if created with DELAY KEY WRITEs enabled. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -898,7 +898,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE ON VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT foreign_key_checks +VARIABLE_COMMENT If set to 1 (the default) foreign key constraints (including ON UPDATE and ON DELETE behavior) InnoDB tables are checked, while if set to 0, they are not checked. 0 is not recommended for normal use, though it can be useful in situations where you know the data is consistent, but want to reload data in a different order from that that specified by parent/child relationships. Setting this variable to 1 does not retrospectively check for inconsistencies introduced while set to 0. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -982,7 +982,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE OFF VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT Log connections and queries to a table or log file. Defaults logging to a file 'hostname'.log or a table mysql.general_logif --log-output=TABLE is used +VARIABLE_COMMENT Log connections and queries to a table or log file. Defaults logging to a file 'hostname'.log or a table mysql.general_logif --log-output=TABLE is used. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -1052,7 +1052,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT have_compress +VARIABLE_COMMENT If the zlib compression library is accessible to the server, this will be set to YES, otherwise it will be NO. The COMPRESS() and UNCOMPRESS() functions will only be available if set to YES. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -1066,7 +1066,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT have_crypt +VARIABLE_COMMENT If the crypt() system call is available this variable will be set to YES, otherwise it will be set to NO. If set to NO, the ENCRYPT() function cannot be used. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -1080,7 +1080,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT have_dynamic_loading +VARIABLE_COMMENT If the server supports dynamic loading of plugins, will be set to YES, otherwise will be set to NO. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -1094,7 +1094,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT have_geometry +VARIABLE_COMMENT If the server supports spatial data types, will be set to YES, otherwise will be set to NO. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -1108,7 +1108,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT have_profiling +VARIABLE_COMMENT If statement profiling is available, will be set to YES, otherwise will be set to NO. See SHOW PROFILES and SHOW PROFILE. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -1122,7 +1122,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT have_query_cache +VARIABLE_COMMENT If the server supports the query cache, will be set to YES, otherwise will be set to NO. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -1136,7 +1136,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT have_rtree_keys +VARIABLE_COMMENT If RTREE indexes (used for spatial indexes) are available, will be set to YES, otherwise will be set to NO. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -1150,7 +1150,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT have_ssl +VARIABLE_COMMENT If the server supports secure connections, will be set to YES, otherwise will be set to NO. If set to DISABLED, the server was compiled with TLS support, but was not started with TLS support (see the mysqld options). See also have_openssl. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -2494,7 +2494,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 62 VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED -VARIABLE_COMMENT Maximum depth of search performed by the query optimizer. Values larger than the number of relations in a query result in better query plans, but take longer to compile a query. Values smaller than the number of tables in a relation result in faster optimization, but may produce very bad query plans. If set to 0, the system will automatically pick a reasonable value +VARIABLE_COMMENT Maximum depth of search performed by the query optimizer. Values larger than the number of relations in a query result in better query plans, but take longer to compile a query. Values smaller than the number of tables in a relation result in faster optimization, but may produce very bad query plans. If set to 0, the system will automatically pick a reasonable value. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 62 NUMERIC_BLOCK_SIZE 1 @@ -2867,9 +2867,9 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STATEMENT_CLASSES SESSION_VALUE NULL -GLOBAL_VALUE 187 +GLOBAL_VALUE 188 GLOBAL_VALUE_ORIGIN COMPILE-TIME -DEFAULT_VALUE 187 +DEFAULT_VALUE 188 VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Maximum number of statement instruments. @@ -3068,7 +3068,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT profiling +VARIABLE_COMMENT If set to 1 (0 is default), statement profiling will be enabled. See SHOW PROFILES and SHOW PROFILE. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -3082,7 +3082,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 15 VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED -VARIABLE_COMMENT Limit of query profiling memory +VARIABLE_COMMENT Number of statements about which profiling information is maintained. If set to 0, no profiles are stored. See SHOW PROFILES. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 100 NUMERIC_BLOCK_SIZE 1 @@ -3110,7 +3110,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL VARIABLE_TYPE INT UNSIGNED -VARIABLE_COMMENT The version of the client/server protocol used by the MySQL server +VARIABLE_COMMENT The version of the client/server protocol used by the MariaDB server NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 NUMERIC_BLOCK_SIZE 1 @@ -3432,7 +3432,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE SESSION ONLY VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT skip_replication +VARIABLE_COMMENT Changes are logged into the binary log with the @@skip_replication flag set. Such events will not be replicated by slaves that run with --replicate-events-marked-for-skip set different from its default of REPLICATE. See Selectively skipping replication of binlog events for more information. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -3502,7 +3502,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE OFF VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT Log slow queries to a table or log file. Defaults logging to a file 'hostname'-slow.log or a table mysql.slow_log if --log-output=TABLE is used. Must be enabled to activate other slow log options +VARIABLE_COMMENT Log slow queries to a table or log file. Defaults logging to a file 'hostname'-slow.log or a table mysql.slow_log if --log-output=TABLE is used. Must be enabled to activate other slow log options. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -3558,7 +3558,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT sql_auto_is_null +VARIABLE_COMMENT If set to 1, the query SELECT * FROM table_name WHERE auto_increment_column IS NULL will return an auto-increment that has just been successfully inserted, the same as the LAST_INSERT_ID() function. Some ODBC programs make use of this IS NULL comparison. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -3572,7 +3572,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT sql_big_selects +VARIABLE_COMMENT If set to 0, MariaDB will not perform large SELECTs. See max_join_size for details. If max_join_size is set to anything but DEFAULT, sql_big_selects is automatically set to 0. If sql_big_selects is again set, max_join_size will be ignored. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -3586,7 +3586,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT sql_buffer_result +VARIABLE_COMMENT If set to 1 (0 is default), results from SELECT statements are always placed into temporary tables. This can help the server when it takes a long time to send the results to the client by allowing the table locks to be freed early. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -3600,7 +3600,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE ON VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT Controls whether logging to the binary log is done +VARIABLE_COMMENT If set to 0 (1 is the default), no logging to the binary log is done for the client. Only clients with the SUPER privilege can update this variable. Can have unintended consequences if set globally, see SET SQL_LOG_BIN. Starting MariaDB 10.1.7, this variable does not affect the replication of events in a Galera cluster. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -3614,7 +3614,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT sql_log_off +VARIABLE_COMMENT If set to 1 (0 is the default), no logging to the general query log is done for the client. Only clients with the SUPER privilege can update this variable. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -3642,7 +3642,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE ON VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT sql_notes +VARIABLE_COMMENT If set to 1, the default, warning_count is incremented each time a Note warning is encountered. If set to 0, Note warnings are not recorded. mysqldump has outputs to set this variable to 0 so that no unnecessary increments occur when data is reloaded. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -3656,7 +3656,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE ON VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT sql_quote_show_create +VARIABLE_COMMENT If set to 1, the default, the server will quote identifiers for SHOW CREATE DATABASE, SHOW CREATE TABLE and SHOW CREATE VIEW statements. Quoting is disabled if set to 0. Enable to ensure replications works when identifiers require quoting. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -3670,7 +3670,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT sql_safe_updates +VARIABLE_COMMENT If set to 1, UPDATEs and DELETEs need either a key in the WHERE clause, or a LIMIT clause, or else they will aborted. Prevents the common mistake of accidentally deleting or updating every row in a table. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -3698,7 +3698,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT sql_warnings +VARIABLE_COMMENT If set to 1, single-row INSERTs will produce a string containing warning information if a warning occurs. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -4048,7 +4048,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE SYSTEM VARIABLE_SCOPE SESSION VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT time_zone +VARIABLE_COMMENT The current time zone, used to initialize the time zone for a client when it connects. Set to SYSTEM by default, in which the client uses the system time zone value. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -4069,6 +4069,34 @@ NUMERIC_BLOCK_SIZE NULL ENUM_VALUE_LIST NULL READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME TMP_DISK_TABLE_SIZE +SESSION_VALUE 18446744073709551615 +GLOBAL_VALUE 18446744073709551615 +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE 18446744073709551615 +VARIABLE_SCOPE SESSION +VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_COMMENT Max size for data for an internal temporary on-disk MyISAM or Aria table. +NUMERIC_MIN_VALUE 1024 +NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_BLOCK_SIZE 1 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME TMP_MEMORY_TABLE_SIZE +SESSION_VALUE 16777216 +GLOBAL_VALUE 16777216 +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE 16777216 +VARIABLE_SCOPE SESSION +VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_COMMENT If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table. Same as tmp_table_size. +NUMERIC_MIN_VALUE 1024 +NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_BLOCK_SIZE 1 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME TMP_TABLE_SIZE SESSION_VALUE 16777216 GLOBAL_VALUE 16777216 @@ -4076,7 +4104,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 16777216 VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED -VARIABLE_COMMENT If an internal in-memory temporary table exceeds this size, MySQL will automatically convert it to an on-disk MyISAM or Aria table +VARIABLE_COMMENT Alias for tmp_memory_table_size. If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table. NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 18446744073709551615 NUMERIC_BLOCK_SIZE 1 @@ -4132,7 +4160,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT Set default transaction access mode to read only. +VARIABLE_COMMENT Default transaction access mode. If set to OFF, the default, access is read/write. If set to ON, access is read-only. The SET TRANSACTION statement can also change the value of this variable. See SET TRANSACTION and START TRANSACTION. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -4146,7 +4174,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE ON VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT unique_checks +VARIABLE_COMMENT If set to 1, the default, secondary indexes in InnoDB tables are performed. If set to 0, storage engines can (but are not required to) assume that duplicate keys are not present in input data. Set to 0 to speed up imports of large tables to InnoDB. The storage engine will still issue a duplicate key error if it detects one, even if set to 0. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -4246,7 +4274,7 @@ order by variable_name; VARIABLE_NAME HAVE_OPENSSL VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT have_openssl +VARIABLE_COMMENT Comparing have_openssl with have_ssl will indicate whether YaSSL or openssl was used. If YaSSL, have_ssl will be YES, but have_openssl will be NO. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -4256,7 +4284,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME HAVE_SYMLINK VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT have_symlink +VARIABLE_COMMENT If symbolic link support is enabled, will be set to YES, otherwise will be set to NO. Required for the INDEX DIRECTORY and DATA DIRECTORY table options (see CREATE TABLE) and Windows symlink support. Will be set to DISABLED if the server is started with the --skip-symbolic-links option. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -4346,7 +4374,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME VERSION VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT Server version +VARIABLE_COMMENT Server version number. It may also include a suffix with configuration or build information. -debug indicates debugging support was enabled on the server, and -log indicates at least one of the binary log, general log or slow query log are enabled, for example 10.1.1-MariaDB-mariadb1precise-log. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -4356,7 +4384,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME VERSION_COMMENT VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT version_comment +VARIABLE_COMMENT Value of the COMPILATION_COMMENT option specified by CMake when building MariaDB, for example mariadb.org binary distribution. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -4366,7 +4394,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME VERSION_COMPILE_MACHINE VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT version_compile_machine +VARIABLE_COMMENT The machine type or architecture MariaDB was built on, for example i686. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -4376,7 +4404,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME VERSION_COMPILE_OS VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT version_compile_os +VARIABLE_COMMENT Operating system that MariaDB was built on, for example debian-linux-gnu. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,32bit.rdiff b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,32bit.rdiff index 88216992587..272ddb59beb 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,32bit.rdiff +++ b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,32bit.rdiff @@ -1,5 +1,5 @@ ---- suite/sys_vars/r/sysvars_server_notembedded.result 2016-11-03 17:27:47.664855681 +0100 -+++ suite/sys_vars/r/sysvars_server_notembedded.reject 2016-11-03 17:23:05.686196749 +0100 +--- a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result ++++ b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result @@ -57,7 +57,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE 1 @@ -24,7 +24,7 @@ VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED - VARIABLE_COMMENT The number of outstanding connection requests MariaDB can have. This comes into play when the main MySQL thread gets very many connection requests in a very short time + VARIABLE_COMMENT The number of outstanding connection requests MariaDB can have. This comes into play when the main MariaDB thread gets very many connection requests in a very short time NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 65535 @@ -144,7 +144,7 @@ @@ -64,7 +64,7 @@ READ_ONLY NO @@ -256,7 +256,7 @@ VARIABLE_TYPE BIGINT UNSIGNED - VARIABLE_COMMENT The size of the statement cache for updates to non-transactional engines for the binary log. If you often use statements updating a great number of rows, you can increase this to get more performance + VARIABLE_COMMENT The size of the statement cache for updates to non-transactional engines for the binary log. If you often use statements updating a great number of rows, you can increase this to get more performance. NUMERIC_MIN_VALUE 4096 -NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_MAX_VALUE 4294967295 @@ -140,7 +140,7 @@ VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED - VARIABLE_COMMENT After inserting delayed_insert_limit rows, the INSERT DELAYED handler will check if there are any SELECT statements pending. If so, it allows these to execute before continuing + VARIABLE_COMMENT After inserting delayed_insert_limit rows, the INSERT DELAYED handler will check if there are any SELECT statements pending. If so, it allows these to execute before continuing. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 @@ -673,7 +673,7 @@ @@ -226,7 +226,7 @@ NUMERIC_MAX_VALUE 1000 @@ -1040,7 +1040,7 @@ VARIABLE_TYPE BIGINT UNSIGNED - VARIABLE_COMMENT The maximum length of the result of function GROUP_CONCAT() + VARIABLE_COMMENT The maximum length of the result of function GROUP_CONCAT() NUMERIC_MIN_VALUE 4 -NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_MAX_VALUE 4294967295 @@ -289,7 +289,7 @@ READ_ONLY NO @@ -1723,7 +1723,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME - DEFAULT_VALUE 31536000 + DEFAULT_VALUE 86400 VARIABLE_SCOPE SESSION -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED @@ -307,7 +307,7 @@ NUMERIC_MAX_VALUE 4294967295 @@ -1947,7 +1947,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME - DEFAULT_VALUE 1 + DEFAULT_VALUE 2 VARIABLE_SCOPE SESSION -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED @@ -316,7 +316,7 @@ NUMERIC_MAX_VALUE 4294967295 @@ -2003,7 +2003,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME - DEFAULT_VALUE 4194304 + DEFAULT_VALUE 16777216 VARIABLE_SCOPE SESSION -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED @@ -467,7 +467,7 @@ VARIABLE_COMMENT Limit assumed max number of seeks when looking up rows based on a key NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2255,7 +2255,7 @@ +@@ -2269,7 +2269,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1024 VARIABLE_SCOPE SESSION @@ -476,7 +476,7 @@ VARIABLE_COMMENT The number of bytes to use when sorting BLOB or TEXT values (only the first max_sort_length bytes of each value are used; the rest are ignored) NUMERIC_MIN_VALUE 4 NUMERIC_MAX_VALUE 8388608 -@@ -2269,7 +2269,7 @@ +@@ -2283,7 +2283,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE SESSION @@ -485,7 +485,7 @@ VARIABLE_COMMENT Maximum stored procedure recursion depth NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 255 -@@ -2297,7 +2297,7 @@ +@@ -2311,7 +2311,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 32 VARIABLE_SCOPE SESSION @@ -494,7 +494,7 @@ VARIABLE_COMMENT Unused, will be removed. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2325,7 +2325,7 @@ +@@ -2339,7 +2339,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4294967295 VARIABLE_SCOPE GLOBAL @@ -503,7 +503,7 @@ VARIABLE_COMMENT After this many write locks, allow some read locks to run in between NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2339,7 +2339,7 @@ +@@ -2353,7 +2353,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1024 VARIABLE_SCOPE GLOBAL @@ -512,7 +512,7 @@ VARIABLE_COMMENT Unused NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1048576 -@@ -2353,7 +2353,7 @@ +@@ -2367,7 +2367,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 8 VARIABLE_SCOPE GLOBAL @@ -521,7 +521,7 @@ VARIABLE_COMMENT Unused NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1024 -@@ -2367,7 +2367,7 @@ +@@ -2381,7 +2381,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE SESSION @@ -530,7 +530,7 @@ VARIABLE_COMMENT Don't write queries to slow log that examine fewer rows than that NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2381,7 +2381,7 @@ +@@ -2395,7 +2395,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 262144 VARIABLE_SCOPE SESSION @@ -539,7 +539,7 @@ VARIABLE_COMMENT Size of buffer to use when using MRR with range access NUMERIC_MIN_VALUE 8192 NUMERIC_MAX_VALUE 2147483647 -@@ -2395,10 +2395,10 @@ +@@ -2409,10 +2409,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 256 VARIABLE_SCOPE SESSION @@ -552,7 +552,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2409,7 +2409,7 @@ +@@ -2423,7 +2423,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1024 VARIABLE_SCOPE GLOBAL @@ -561,7 +561,7 @@ VARIABLE_COMMENT Block size to be used for MyISAM index pages NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 16384 -@@ -2423,7 +2423,7 @@ +@@ -2437,7 +2437,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 6 VARIABLE_SCOPE GLOBAL @@ -570,7 +570,7 @@ VARIABLE_COMMENT Default pointer size to be used for MyISAM tables NUMERIC_MIN_VALUE 2 NUMERIC_MAX_VALUE 7 -@@ -2433,9 +2433,9 @@ +@@ -2447,9 +2447,9 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MYISAM_MAX_SORT_FILE_SIZE SESSION_VALUE NULL @@ -582,7 +582,7 @@ VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Don't use the fast sort index method to created index if the temporary file would get bigger than this -@@ -2447,14 +2447,14 @@ +@@ -2461,14 +2461,14 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MYISAM_MMAP_SIZE SESSION_VALUE NULL @@ -600,7 +600,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY YES -@@ -2479,10 +2479,10 @@ +@@ -2493,10 +2493,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION @@ -613,7 +613,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2496,7 +2496,7 @@ +@@ -2510,7 +2510,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE NUMERIC_MIN_VALUE 4096 @@ -622,7 +622,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2549,7 +2549,7 @@ +@@ -2563,7 +2563,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 16384 VARIABLE_SCOPE SESSION @@ -631,7 +631,7 @@ VARIABLE_COMMENT Buffer length for TCP/IP and socket communication NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1048576 -@@ -2563,7 +2563,7 @@ +@@ -2577,7 +2577,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 30 VARIABLE_SCOPE SESSION @@ -640,7 +640,7 @@ VARIABLE_COMMENT Number of seconds to wait for more data from a connection before aborting the read NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -2577,7 +2577,7 @@ +@@ -2591,7 +2591,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 10 VARIABLE_SCOPE SESSION @@ -649,7 +649,7 @@ VARIABLE_COMMENT If a read on a communication port is interrupted, retry this many times before giving up NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2591,7 +2591,7 @@ +@@ -2605,7 +2605,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 60 VARIABLE_SCOPE SESSION @@ -658,7 +658,7 @@ VARIABLE_COMMENT Number of seconds to wait for a block to be written to a connection before aborting the write NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -2661,7 +2661,7 @@ +@@ -2675,7 +2675,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION @@ -667,16 +667,16 @@ VARIABLE_COMMENT Controls the heuristic(s) applied during query optimization to prune less-promising partial plans from the optimizer search space. Meaning: 0 - do not apply any heuristic, thus perform exhaustive search; 1 - prune plans based on number of retrieved rows NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1 -@@ -2675,7 +2675,7 @@ +@@ -2689,7 +2689,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 62 VARIABLE_SCOPE SESSION -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED - VARIABLE_COMMENT Maximum depth of search performed by the query optimizer. Values larger than the number of relations in a query result in better query plans, but take longer to compile a query. Values smaller than the number of tables in a relation result in faster optimization, but may produce very bad query plans. If set to 0, the system will automatically pick a reasonable value + VARIABLE_COMMENT Maximum depth of search performed by the query optimizer. Values larger than the number of relations in a query result in better query plans, but take longer to compile a query. Values smaller than the number of tables in a relation result in faster optimization, but may produce very bad query plans. If set to 0, the system will automatically pick a reasonable value. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 62 -@@ -2689,7 +2689,7 @@ +@@ -2703,7 +2703,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100 VARIABLE_SCOPE SESSION @@ -685,7 +685,7 @@ VARIABLE_COMMENT Controls number of record samples to check condition selectivity NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 4294967295 -@@ -2717,7 +2717,7 @@ +@@ -2731,7 +2731,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION @@ -694,7 +694,7 @@ VARIABLE_COMMENT Controls selectivity of which conditions the optimizer takes into account to calculate cardinality of a partial join when it searches for the best execution plan Meaning: 1 - use selectivity of index backed range conditions to calculate the cardinality of a partial join if the last joined table is accessed by full table scan or an index scan, 2 - use selectivity of index backed range conditions to calculate the cardinality of a partial join in any case, 3 - additionally always use selectivity of range conditions that are not backed by any index to calculate the cardinality of a partial join, 4 - use histograms to calculate selectivity of range conditions that are not backed by any index to calculate the cardinality of a partial join.5 - additionally use selectivity of certain non-range predicates calculated on record samples NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 5 -@@ -2745,7 +2745,7 @@ +@@ -2759,7 +2759,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -703,7 +703,7 @@ VARIABLE_COMMENT Maximum number of instrumented user@host accounts. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2759,7 +2759,7 @@ +@@ -2773,7 +2773,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -712,7 +712,7 @@ VARIABLE_COMMENT Size of the statement digest. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 200 -@@ -2773,7 +2773,7 @@ +@@ -2787,7 +2787,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -721,7 +721,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_STAGES_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2787,7 +2787,7 @@ +@@ -2801,7 +2801,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -730,7 +730,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_STAGES_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2801,7 +2801,7 @@ +@@ -2815,7 +2815,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -739,7 +739,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_STATEMENTS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2815,7 +2815,7 @@ +@@ -2829,7 +2829,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -748,7 +748,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_STATEMENTS_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2829,7 +2829,7 @@ +@@ -2843,7 +2843,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -757,7 +757,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_WAITS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2843,7 +2843,7 @@ +@@ -2857,7 +2857,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -766,7 +766,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_WAITS_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2857,7 +2857,7 @@ +@@ -2871,7 +2871,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -775,7 +775,7 @@ VARIABLE_COMMENT Maximum number of instrumented hosts. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2871,7 +2871,7 @@ +@@ -2885,7 +2885,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 80 VARIABLE_SCOPE GLOBAL @@ -784,7 +784,7 @@ VARIABLE_COMMENT Maximum number of condition instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2885,7 +2885,7 @@ +@@ -2899,7 +2899,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -793,7 +793,7 @@ VARIABLE_COMMENT Maximum number of instrumented condition objects. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2899,7 +2899,7 @@ +@@ -2913,7 +2913,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1024 VARIABLE_SCOPE GLOBAL @@ -802,7 +802,7 @@ VARIABLE_COMMENT Maximum length considered for digest text, when stored in performance_schema tables. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2913,7 +2913,7 @@ +@@ -2927,7 +2927,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 50 VARIABLE_SCOPE GLOBAL @@ -811,7 +811,7 @@ VARIABLE_COMMENT Maximum number of file instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2927,7 +2927,7 @@ +@@ -2941,7 +2941,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 32768 VARIABLE_SCOPE GLOBAL @@ -820,7 +820,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented files. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2941,7 +2941,7 @@ +@@ -2955,7 +2955,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -829,7 +829,7 @@ VARIABLE_COMMENT Maximum number of instrumented files. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2955,7 +2955,7 @@ +@@ -2969,7 +2969,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 200 VARIABLE_SCOPE GLOBAL @@ -838,7 +838,7 @@ VARIABLE_COMMENT Maximum number of mutex instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2969,7 +2969,7 @@ +@@ -2983,7 +2983,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -847,7 +847,7 @@ VARIABLE_COMMENT Maximum number of instrumented MUTEX objects. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 104857600 -@@ -2983,7 +2983,7 @@ +@@ -2997,7 +2997,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 40 VARIABLE_SCOPE GLOBAL @@ -856,7 +856,7 @@ VARIABLE_COMMENT Maximum number of rwlock instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2997,7 +2997,7 @@ +@@ -3011,7 +3011,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -865,7 +865,7 @@ VARIABLE_COMMENT Maximum number of instrumented RWLOCK objects. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 104857600 -@@ -3011,7 +3011,7 @@ +@@ -3025,7 +3025,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 10 VARIABLE_SCOPE GLOBAL @@ -874,7 +874,7 @@ VARIABLE_COMMENT Maximum number of socket instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -3025,7 +3025,7 @@ +@@ -3039,7 +3039,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -883,7 +883,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented sockets. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3039,7 +3039,7 @@ +@@ -3053,7 +3053,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 150 VARIABLE_SCOPE GLOBAL @@ -892,16 +892,16 @@ VARIABLE_COMMENT Maximum number of stage instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -3053,7 +3053,7 @@ +@@ -3067,7 +3067,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME - DEFAULT_VALUE 185 + DEFAULT_VALUE 188 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED VARIABLE_COMMENT Maximum number of statement instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -3067,7 +3067,7 @@ +@@ -3081,7 +3081,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -910,7 +910,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented tables. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3081,7 +3081,7 @@ +@@ -3095,7 +3095,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -919,7 +919,7 @@ VARIABLE_COMMENT Maximum number of instrumented tables. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3095,7 +3095,7 @@ +@@ -3109,7 +3109,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 50 VARIABLE_SCOPE GLOBAL @@ -928,7 +928,7 @@ VARIABLE_COMMENT Maximum number of thread instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -3109,7 +3109,7 @@ +@@ -3123,7 +3123,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -937,7 +937,7 @@ VARIABLE_COMMENT Maximum number of instrumented threads. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3123,7 +3123,7 @@ +@@ -3137,7 +3137,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -946,7 +946,7 @@ VARIABLE_COMMENT Size of session attribute string buffer per thread. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3137,7 +3137,7 @@ +@@ -3151,7 +3151,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100 VARIABLE_SCOPE GLOBAL @@ -955,7 +955,7 @@ VARIABLE_COMMENT Maximum number of rows in SETUP_ACTORS. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1024 -@@ -3151,7 +3151,7 @@ +@@ -3165,7 +3165,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100 VARIABLE_SCOPE GLOBAL @@ -964,7 +964,7 @@ VARIABLE_COMMENT Maximum number of rows in SETUP_OBJECTS. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -3165,7 +3165,7 @@ +@@ -3179,7 +3179,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -973,7 +973,7 @@ VARIABLE_COMMENT Maximum number of instrumented users. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3235,7 +3235,7 @@ +@@ -3249,7 +3249,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 32768 VARIABLE_SCOPE SESSION @@ -982,16 +982,16 @@ VARIABLE_COMMENT The size of the buffer that is allocated when preloading indexes NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -3263,7 +3263,7 @@ +@@ -3277,7 +3277,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 15 VARIABLE_SCOPE SESSION -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED - VARIABLE_COMMENT Limit of query profiling memory + VARIABLE_COMMENT Number of statements about which profiling information is maintained. If set to 0, no profiles are stored. See SHOW PROFILES. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 100 -@@ -3277,7 +3277,7 @@ +@@ -3291,7 +3291,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 5 VARIABLE_SCOPE SESSION @@ -1000,7 +1000,7 @@ VARIABLE_COMMENT Seconds between sending progress reports to the client for time-consuming statements. Set to 0 to disable progress reporting. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3347,7 +3347,7 @@ +@@ -3361,7 +3361,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 16384 VARIABLE_SCOPE SESSION @@ -1009,7 +1009,7 @@ VARIABLE_COMMENT Allocation block size for query parsing and execution NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -3361,7 +3361,7 @@ +@@ -3375,7 +3375,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1048576 VARIABLE_SCOPE GLOBAL @@ -1018,7 +1018,7 @@ VARIABLE_COMMENT Don't cache results that are bigger than this NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3375,7 +3375,7 @@ +@@ -3389,7 +3389,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4096 VARIABLE_SCOPE GLOBAL @@ -1027,7 +1027,7 @@ VARIABLE_COMMENT The minimum size for blocks allocated by the query cache NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3392,7 +3392,7 @@ +@@ -3406,7 +3406,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The memory allocated to store results from old queries NUMERIC_MIN_VALUE 0 @@ -1036,7 +1036,7 @@ NUMERIC_BLOCK_SIZE 1024 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3445,7 +3445,7 @@ +@@ -3459,7 +3459,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 24576 VARIABLE_SCOPE SESSION @@ -1045,7 +1045,7 @@ VARIABLE_COMMENT Persistent buffer for query parsing and execution NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -3459,7 +3459,7 @@ +@@ -3473,7 +3473,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4096 VARIABLE_SCOPE SESSION @@ -1054,7 +1054,7 @@ VARIABLE_COMMENT Allocation block size for storing ranges during optimization NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 4294967295 -@@ -3476,7 +3476,7 @@ +@@ -3490,7 +3490,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Maximum speed(KB/s) to read binlog from master (0 = no limit) NUMERIC_MIN_VALUE 0 @@ -1063,7 +1063,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3487,7 +3487,7 @@ +@@ -3501,7 +3501,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 131072 VARIABLE_SCOPE SESSION @@ -1072,7 +1072,7 @@ VARIABLE_COMMENT Each thread that does a sequential scan allocates a buffer of this size for each table it scans. If you do many sequential scans, you may want to increase this value NUMERIC_MIN_VALUE 8192 NUMERIC_MAX_VALUE 2147483647 -@@ -3515,7 +3515,7 @@ +@@ -3529,7 +3529,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 262144 VARIABLE_SCOPE SESSION @@ -1081,7 +1081,7 @@ VARIABLE_COMMENT When reading rows in sorted order after a sort, the rows are read through this buffer to avoid a disk seeks NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 2147483647 -@@ -3795,10 +3795,10 @@ +@@ -3809,10 +3809,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 8388608 VARIABLE_SCOPE SESSION @@ -1094,7 +1094,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3837,7 +3837,7 @@ +@@ -3851,7 +3851,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION @@ -1103,7 +1103,7 @@ VARIABLE_COMMENT Uniquely identifies the server instance in the community of replication partners NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -4019,7 +4019,7 @@ +@@ -4033,7 +4033,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -1112,7 +1112,7 @@ VARIABLE_COMMENT Maximum number of parallel threads to use on slave for events in a single replication domain. When using multiple domains, this can be used to limit a single domain from grabbing all threads and thus stalling other domains. The default of 0 means to allow a domain to grab as many threads as it wants, up to the value of slave_parallel_threads. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16383 -@@ -4061,7 +4061,7 @@ +@@ -4075,7 +4075,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1073741824 VARIABLE_SCOPE GLOBAL @@ -1121,7 +1121,7 @@ VARIABLE_COMMENT The maximum packet length to sent successfully from the master to slave. NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -4089,7 +4089,7 @@ +@@ -4103,7 +4103,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 131072 VARIABLE_SCOPE GLOBAL @@ -1130,7 +1130,7 @@ VARIABLE_COMMENT Limit on how much memory SQL threads should use per parallel replication thread when reading ahead in the relay log looking for opportunities for parallel replication. Only used when --slave-parallel-threads > 0. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 2147483647 -@@ -4117,7 +4117,7 @@ +@@ -4131,7 +4131,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -1139,7 +1139,7 @@ VARIABLE_COMMENT If non-zero, number of threads to spawn to apply in parallel events on the slave that were group-committed on the master or were logged with GTID in different replication domains. Note that these threads are in addition to the IO and SQL threads, which are always created by a replication slave NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16383 -@@ -4131,7 +4131,7 @@ +@@ -4145,7 +4145,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -1148,7 +1148,7 @@ VARIABLE_COMMENT Alias for slave_parallel_threads NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16383 -@@ -4187,7 +4187,7 @@ +@@ -4201,7 +4201,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 10 VARIABLE_SCOPE GLOBAL @@ -1157,7 +1157,7 @@ VARIABLE_COMMENT Number of times the slave SQL thread will retry a transaction in case it failed with a deadlock or elapsed lock wait timeout, before giving up and stopping NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -4215,7 +4215,7 @@ +@@ -4229,7 +4229,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 2 VARIABLE_SCOPE GLOBAL @@ -1166,7 +1166,7 @@ VARIABLE_COMMENT If creating the thread takes longer than this value (in seconds), the Slow_launch_threads counter will be incremented NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 31536000 -@@ -4274,7 +4274,7 @@ +@@ -4288,7 +4288,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Each thread that needs to do a sort allocates a buffer of this size NUMERIC_MIN_VALUE 1024 @@ -1175,7 +1175,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -4579,7 +4579,7 @@ +@@ -4593,7 +4593,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 256 VARIABLE_SCOPE GLOBAL @@ -1184,7 +1184,7 @@ VARIABLE_COMMENT The soft upper limit for number of cached stored routines for one connection. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 524288 -@@ -4677,7 +4677,7 @@ +@@ -4691,7 +4691,7 @@ GLOBAL_VALUE_ORIGIN AUTO DEFAULT_VALUE 400 VARIABLE_SCOPE GLOBAL @@ -1193,7 +1193,7 @@ VARIABLE_COMMENT The number of cached table definitions NUMERIC_MIN_VALUE 400 NUMERIC_MAX_VALUE 524288 -@@ -4691,7 +4691,7 @@ +@@ -4705,7 +4705,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 2000 VARIABLE_SCOPE GLOBAL @@ -1202,7 +1202,7 @@ VARIABLE_COMMENT The number of cached open tables NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1048576 -@@ -4719,7 +4719,7 @@ +@@ -4733,7 +4733,7 @@ GLOBAL_VALUE_ORIGIN AUTO DEFAULT_VALUE 256 VARIABLE_SCOPE GLOBAL @@ -1211,7 +1211,7 @@ VARIABLE_COMMENT How many threads we should keep in a cache for reuse. These are freed after 5 minutes of idle time NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16384 -@@ -4733,7 +4733,7 @@ +@@ -4747,7 +4747,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 10 VARIABLE_SCOPE GLOBAL @@ -1220,16 +1220,45 @@ VARIABLE_COMMENT Permits the application to give the threads system a hint for the desired number of threads that should be run at the same time.This variable has no effect, and is deprecated. It will be removed in a future release. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 512 -@@ -4946,7 +4946,7 @@ +@@ -4952,15 +4952,15 @@ + READ_ONLY YES + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME TMP_DISK_TABLE_SIZE +-SESSION_VALUE 18446744073709551615 +-GLOBAL_VALUE 18446744073709551615 ++SESSION_VALUE 4294967295 ++GLOBAL_VALUE 4294967295 + GLOBAL_VALUE_ORIGIN COMPILE-TIME +-DEFAULT_VALUE 18446744073709551615 ++DEFAULT_VALUE 4294967295 + VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED - VARIABLE_COMMENT If an internal in-memory temporary table exceeds this size, MySQL will automatically convert it to an on-disk MyISAM or Aria table + VARIABLE_COMMENT Max size for data for an internal temporary on-disk MyISAM or Aria table. NUMERIC_MIN_VALUE 1024 -NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_MAX_VALUE 4294967295 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -4957,7 +4957,7 @@ +@@ -4974,7 +4974,7 @@ + VARIABLE_TYPE BIGINT UNSIGNED + VARIABLE_COMMENT If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table. Same as tmp_table_size. + NUMERIC_MIN_VALUE 1024 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 1 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -4988,7 +4988,7 @@ + VARIABLE_TYPE BIGINT UNSIGNED + VARIABLE_COMMENT Alias for tmp_memory_table_size. If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table. + NUMERIC_MIN_VALUE 1024 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 1 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -4999,7 +4999,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 8192 VARIABLE_SCOPE SESSION @@ -1238,7 +1267,7 @@ VARIABLE_COMMENT Allocation block size for transactions to be stored in binary log NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 134217728 -@@ -4971,7 +4971,7 @@ +@@ -5013,7 +5013,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4096 VARIABLE_SCOPE SESSION @@ -1247,7 +1276,7 @@ VARIABLE_COMMENT Persistent buffer for transactions to be stored in binary log NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 134217728 -@@ -5069,7 +5069,7 @@ +@@ -5111,7 +5111,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 28800 VARIABLE_SCOPE SESSION @@ -1256,7 +1285,7 @@ VARIABLE_COMMENT The number of seconds the server waits for activity on a connection before closing it NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -5173,7 +5173,7 @@ +@@ -5215,7 +5215,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME OPEN_FILES_LIMIT VARIABLE_SCOPE GLOBAL @@ -1265,7 +1294,7 @@ VARIABLE_COMMENT If this is not 0, then mysqld will use this value to reserve file descriptors to use with setrlimit(). If this value is 0 then mysqld will reserve max_connections*5 or max_connections + table_cache*2 (whichever is larger) number of file descriptors NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -5186,7 +5186,7 @@ +@@ -5228,7 +5228,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes NUMERIC_MIN_VALUE 0 @@ -1274,7 +1303,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -5196,7 +5196,7 @@ +@@ -5238,7 +5238,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes NUMERIC_MIN_VALUE 0 @@ -1283,7 +1312,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -5281,7 +5281,7 @@ +@@ -5323,7 +5323,7 @@ VARIABLE_NAME LOG_TC_SIZE GLOBAL_VALUE_ORIGIN AUTO VARIABLE_SCOPE GLOBAL diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result index 11d6594ee80..8d68dce0245 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result @@ -30,7 +30,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE ON VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT autocommit +VARIABLE_COMMENT If set to 1, the default, all queries are committed immediately. If set to 0, they are only committed upon a COMMIT statement, or rolled back with a ROLLBACK statement. If autocommit is set to 0, and then changed to 1, all open transactions are immediately committed. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -86,7 +86,7 @@ GLOBAL_VALUE_ORIGIN AUTO DEFAULT_VALUE 150 VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED -VARIABLE_COMMENT The number of outstanding connection requests MariaDB can have. This comes into play when the main MySQL thread gets very many connection requests in a very short time +VARIABLE_COMMENT The number of outstanding connection requests MariaDB can have. This comes into play when the main MariaDB thread gets very many connection requests in a very short time NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 65535 NUMERIC_BLOCK_SIZE 1 @@ -114,7 +114,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT Allow big result sets by saving all temporary sets on file (Solves most 'table full' errors) +VARIABLE_COMMENT Old variable, which if set to 1, allows large result sets by saving all temporary sets to disk, avoiding 'table full' errors. No longer needed, as the server now handles this automatically. sql_big_tables is a synonym. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -254,7 +254,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 32768 VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED -VARIABLE_COMMENT The size of the statement cache for updates to non-transactional engines for the binary log. If you often use statements updating a great number of rows, you can increase this to get more performance +VARIABLE_COMMENT The size of the statement cache for updates to non-transactional engines for the binary log. If you often use statements updating a great number of rows, you can increase this to get more performance. NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 18446744073709551615 NUMERIC_BLOCK_SIZE 4096 @@ -660,7 +660,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100 VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED -VARIABLE_COMMENT After inserting delayed_insert_limit rows, the INSERT DELAYED handler will check if there are any SELECT statements pending. If so, it allows these to execute before continuing +VARIABLE_COMMENT After inserting delayed_insert_limit rows, the INSERT DELAYED handler will check if there are any SELECT statements pending. If so, it allows these to execute before continuing. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 NUMERIC_BLOCK_SIZE 1 @@ -702,7 +702,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE ON VARIABLE_SCOPE GLOBAL VARIABLE_TYPE ENUM -VARIABLE_COMMENT Type of DELAY_KEY_WRITE +VARIABLE_COMMENT Specifies how MyISAM tables handles CREATE TABLE DELAY_KEY_WRITE. If set to ON, the default, any DELAY KEY WRITEs are honored. The key buffer is then flushed only when the table closes, speeding up writes. MyISAM tables should be automatically checked upon startup in this case, and --external locking should not be used, as it can lead to index corruption. If set to OFF, DELAY KEY WRITEs are ignored, while if set to ALL, all new opened tables are treated as if created with DELAY KEY WRITEs enabled. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -926,7 +926,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE ON VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT foreign_key_checks +VARIABLE_COMMENT If set to 1 (the default) foreign key constraints (including ON UPDATE and ON DELETE behavior) InnoDB tables are checked, while if set to 0, they are not checked. 0 is not recommended for normal use, though it can be useful in situations where you know the data is consistent, but want to reload data in a different order from that that specified by parent/child relationships. Setting this variable to 1 does not retrospectively check for inconsistencies introduced while set to 0. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -1010,7 +1010,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE OFF VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT Log connections and queries to a table or log file. Defaults logging to a file 'hostname'.log or a table mysql.general_logif --log-output=TABLE is used +VARIABLE_COMMENT Log connections and queries to a table or log file. Defaults logging to a file 'hostname'.log or a table mysql.general_logif --log-output=TABLE is used. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -1164,7 +1164,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT have_compress +VARIABLE_COMMENT If the zlib compression library is accessible to the server, this will be set to YES, otherwise it will be NO. The COMPRESS() and UNCOMPRESS() functions will only be available if set to YES. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -1178,7 +1178,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT have_crypt +VARIABLE_COMMENT If the crypt() system call is available this variable will be set to YES, otherwise it will be set to NO. If set to NO, the ENCRYPT() function cannot be used. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -1192,7 +1192,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT have_dynamic_loading +VARIABLE_COMMENT If the server supports dynamic loading of plugins, will be set to YES, otherwise will be set to NO. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -1206,7 +1206,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT have_geometry +VARIABLE_COMMENT If the server supports spatial data types, will be set to YES, otherwise will be set to NO. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -1220,7 +1220,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT have_profiling +VARIABLE_COMMENT If statement profiling is available, will be set to YES, otherwise will be set to NO. See SHOW PROFILES and SHOW PROFILE. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -1234,7 +1234,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT have_query_cache +VARIABLE_COMMENT If the server supports the query cache, will be set to YES, otherwise will be set to NO. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -1248,7 +1248,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT have_rtree_keys +VARIABLE_COMMENT If RTREE indexes (used for spatial indexes) are available, will be set to YES, otherwise will be set to NO. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -1262,7 +1262,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT have_ssl +VARIABLE_COMMENT If the server supports secure connections, will be set to YES, otherwise will be set to NO. If set to DISABLED, the server was compiled with TLS support, but was not started with TLS support (see the mysqld options). See also have_openssl. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -1864,7 +1864,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT Tells the slave to log the updates from the slave thread to the binary log. You will need to turn it on if you plan to daisy-chain the slaves +VARIABLE_COMMENT Tells the slave to log the updates from the slave thread to the binary log. You will need to turn it on if you plan to daisy-chain the slaves. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -2690,7 +2690,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 62 VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED -VARIABLE_COMMENT Maximum depth of search performed by the query optimizer. Values larger than the number of relations in a query result in better query plans, but take longer to compile a query. Values smaller than the number of tables in a relation result in faster optimization, but may produce very bad query plans. If set to 0, the system will automatically pick a reasonable value +VARIABLE_COMMENT Maximum depth of search performed by the query optimizer. Values larger than the number of relations in a query result in better query plans, but take longer to compile a query. Values smaller than the number of tables in a relation result in faster optimization, but may produce very bad query plans. If set to 0, the system will automatically pick a reasonable value. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 62 NUMERIC_BLOCK_SIZE 1 @@ -3063,9 +3063,9 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STATEMENT_CLASSES SESSION_VALUE NULL -GLOBAL_VALUE 187 +GLOBAL_VALUE 188 GLOBAL_VALUE_ORIGIN COMPILE-TIME -DEFAULT_VALUE 187 +DEFAULT_VALUE 188 VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Maximum number of statement instruments. @@ -3264,7 +3264,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT profiling +VARIABLE_COMMENT If set to 1 (0 is default), statement profiling will be enabled. See SHOW PROFILES and SHOW PROFILE. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -3278,7 +3278,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 15 VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED -VARIABLE_COMMENT Limit of query profiling memory +VARIABLE_COMMENT Number of statements about which profiling information is maintained. If set to 0, no profiles are stored. See SHOW PROFILES. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 100 NUMERIC_BLOCK_SIZE 1 @@ -3306,7 +3306,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL VARIABLE_TYPE INT UNSIGNED -VARIABLE_COMMENT The version of the client/server protocol used by the MySQL server +VARIABLE_COMMENT The version of the client/server protocol used by the MariaDB server NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 NUMERIC_BLOCK_SIZE 1 @@ -3544,7 +3544,7 @@ GLOBAL_VALUE_ORIGIN AUTO DEFAULT_VALUE VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT The location and name to use for relay logs +VARIABLE_COMMENT The location and name to use for relay logs. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -3572,7 +3572,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT The location and name to use for the file that keeps a list of the last relay logs +VARIABLE_COMMENT The location and name to use for the file that keeps a list of the last relay logs. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -3586,7 +3586,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT The location and name of the file that remembers where the SQL replication thread is in the relay logs +VARIABLE_COMMENT The location and name of the file that remembers where the SQL replication thread is in the relay logs. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -3600,7 +3600,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE ON VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT if disabled - do not purge relay logs. if enabled - purge them as soon as they are no more needed +VARIABLE_COMMENT if disabled - do not purge relay logs. if enabled - purge them as soon as they are no more needed. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -3614,7 +3614,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT Enables automatic relay log recovery right after the database startup, which means that the IO Thread starts re-fetching from the master right after the last transaction processed +VARIABLE_COMMENT Enables automatic relay log recovery right after the database startup, which means that the IO Thread starts re-fetching from the master right after the last transaction processed. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -3978,7 +3978,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE SESSION ONLY VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT skip_replication +VARIABLE_COMMENT Changes are logged into the binary log with the @@skip_replication flag set. Such events will not be replicated by slaves that run with --replicate-events-marked-for-skip set different from its default of REPLICATE. See Selectively skipping replication of binlog events for more information. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -4048,7 +4048,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE STRICT VARIABLE_SCOPE GLOBAL VARIABLE_TYPE ENUM -VARIABLE_COMMENT How replication events should be executed. Legal values are STRICT (default) and IDEMPOTENT. In IDEMPOTENT mode, replication will not stop for operations that are idempotent. For example, in row based replication attempts to delete rows that doesn't exist will be ignored. In STRICT mode, replication will stop on any unexpected difference between the master and the slave +VARIABLE_COMMENT How replication events should be executed. Legal values are STRICT (default) and IDEMPOTENT. In IDEMPOTENT mode, replication will not stop for operations that are idempotent. For example, in row based replication attempts to delete rows that doesn't exist will be ignored. In STRICT mode, replication will stop on any unexpected difference between the master and the slave. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -4244,7 +4244,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE OFF VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT Log slow queries to a table or log file. Defaults logging to a file 'hostname'-slow.log or a table mysql.slow_log if --log-output=TABLE is used. Must be enabled to activate other slow log options +VARIABLE_COMMENT Log slow queries to a table or log file. Defaults logging to a file 'hostname'-slow.log or a table mysql.slow_log if --log-output=TABLE is used. Must be enabled to activate other slow log options. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -4300,7 +4300,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT sql_auto_is_null +VARIABLE_COMMENT If set to 1, the query SELECT * FROM table_name WHERE auto_increment_column IS NULL will return an auto-increment that has just been successfully inserted, the same as the LAST_INSERT_ID() function. Some ODBC programs make use of this IS NULL comparison. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -4314,7 +4314,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT sql_big_selects +VARIABLE_COMMENT If set to 0, MariaDB will not perform large SELECTs. See max_join_size for details. If max_join_size is set to anything but DEFAULT, sql_big_selects is automatically set to 0. If sql_big_selects is again set, max_join_size will be ignored. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -4328,7 +4328,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT sql_buffer_result +VARIABLE_COMMENT If set to 1 (0 is default), results from SELECT statements are always placed into temporary tables. This can help the server when it takes a long time to send the results to the client by allowing the table locks to be freed early. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -4342,7 +4342,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE ON VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT Controls whether logging to the binary log is done +VARIABLE_COMMENT If set to 0 (1 is the default), no logging to the binary log is done for the client. Only clients with the SUPER privilege can update this variable. Can have unintended consequences if set globally, see SET SQL_LOG_BIN. Starting MariaDB 10.1.7, this variable does not affect the replication of events in a Galera cluster. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -4356,7 +4356,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT sql_log_off +VARIABLE_COMMENT If set to 1 (0 is the default), no logging to the general query log is done for the client. Only clients with the SUPER privilege can update this variable. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -4384,7 +4384,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE ON VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT sql_notes +VARIABLE_COMMENT If set to 1, the default, warning_count is incremented each time a Note warning is encountered. If set to 0, Note warnings are not recorded. mysqldump has outputs to set this variable to 0 so that no unnecessary increments occur when data is reloaded. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -4398,7 +4398,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE ON VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT sql_quote_show_create +VARIABLE_COMMENT If set to 1, the default, the server will quote identifiers for SHOW CREATE DATABASE, SHOW CREATE TABLE and SHOW CREATE VIEW statements. Quoting is disabled if set to 0. Enable to ensure replications works when identifiers require quoting. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -4412,7 +4412,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT sql_safe_updates +VARIABLE_COMMENT If set to 1, UPDATEs and DELETEs need either a key in the WHERE clause, or a LIMIT clause, or else they will aborted. Prevents the common mistake of accidentally deleting or updating every row in a table. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -4454,7 +4454,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT sql_warnings +VARIABLE_COMMENT If set to 1, single-row INSERTs will produce a string containing warning information if a warning occurs. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -4930,7 +4930,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE SYSTEM VARIABLE_SCOPE SESSION VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT time_zone +VARIABLE_COMMENT The current time zone, used to initialize the time zone for a client when it connects. Set to SYSTEM by default, in which the client uses the system time zone value. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -4951,6 +4951,34 @@ NUMERIC_BLOCK_SIZE NULL ENUM_VALUE_LIST NULL READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME TMP_DISK_TABLE_SIZE +SESSION_VALUE 18446744073709551615 +GLOBAL_VALUE 18446744073709551615 +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE 18446744073709551615 +VARIABLE_SCOPE SESSION +VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_COMMENT Max size for data for an internal temporary on-disk MyISAM or Aria table. +NUMERIC_MIN_VALUE 1024 +NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_BLOCK_SIZE 1 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME TMP_MEMORY_TABLE_SIZE +SESSION_VALUE 16777216 +GLOBAL_VALUE 16777216 +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE 16777216 +VARIABLE_SCOPE SESSION +VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_COMMENT If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table. Same as tmp_table_size. +NUMERIC_MIN_VALUE 1024 +NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_BLOCK_SIZE 1 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME TMP_TABLE_SIZE SESSION_VALUE 16777216 GLOBAL_VALUE 16777216 @@ -4958,7 +4986,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 16777216 VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED -VARIABLE_COMMENT If an internal in-memory temporary table exceeds this size, MySQL will automatically convert it to an on-disk MyISAM or Aria table +VARIABLE_COMMENT Alias for tmp_memory_table_size. If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table. NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 18446744073709551615 NUMERIC_BLOCK_SIZE 1 @@ -5014,7 +5042,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT Set default transaction access mode to read only. +VARIABLE_COMMENT Default transaction access mode. If set to OFF, the default, access is read/write. If set to ON, access is read-only. The SET TRANSACTION statement can also change the value of this variable. See SET TRANSACTION and START TRANSACTION. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -5028,7 +5056,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE ON VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT unique_checks +VARIABLE_COMMENT If set to 1, the default, secondary indexes in InnoDB tables are performed. If set to 0, storage engines can (but are not required to) assume that duplicate keys are not present in input data. Set to 0 to speed up imports of large tables to InnoDB. The storage engine will still issue a duplicate key error if it detects one, even if set to 0. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -5128,7 +5156,7 @@ order by variable_name; VARIABLE_NAME HAVE_OPENSSL VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT have_openssl +VARIABLE_COMMENT Comparing have_openssl with have_ssl will indicate whether YaSSL or openssl was used. If YaSSL, have_ssl will be YES, but have_openssl will be NO. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -5138,7 +5166,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME HAVE_SYMLINK VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT have_symlink +VARIABLE_COMMENT If symbolic link support is enabled, will be set to YES, otherwise will be set to NO. Required for the INDEX DIRECTORY and DATA DIRECTORY table options (see CREATE TABLE) and Windows symlink support. Will be set to DISABLED if the server is started with the --skip-symbolic-links option. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -5228,7 +5256,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME VERSION VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT Server version +VARIABLE_COMMENT Server version number. It may also include a suffix with configuration or build information. -debug indicates debugging support was enabled on the server, and -log indicates at least one of the binary log, general log or slow query log are enabled, for example 10.1.1-MariaDB-mariadb1precise-log. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -5238,7 +5266,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME VERSION_COMMENT VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT version_comment +VARIABLE_COMMENT Value of the COMPILATION_COMMENT option specified by CMake when building MariaDB, for example mariadb.org binary distribution. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -5248,7 +5276,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME VERSION_COMPILE_MACHINE VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT version_compile_machine +VARIABLE_COMMENT The machine type or architecture MariaDB was built on, for example i686. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -5258,7 +5286,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME VERSION_COMPILE_OS VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT version_compile_os +VARIABLE_COMMENT Operating system that MariaDB was built on, for example debian-linux-gnu. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL diff --git a/mysql-test/suite/sys_vars/r/sysvars_wsrep.result b/mysql-test/suite/sys_vars/r/sysvars_wsrep.result index 802ee3b1c6d..0c206975c29 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_wsrep.result +++ b/mysql-test/suite/sys_vars/r/sysvars_wsrep.result @@ -288,7 +288,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT Node address +VARIABLE_COMMENT Specifies the node's network address, in the format ip address[:port]. Used in situations where autoguessing is not reliable. As of MariaDB 10.1.8, supports IPv6. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -316,7 +316,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE HOSTNAME VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT Node name +VARIABLE_COMMENT Name of this node. This name can be used in wsrep_sst_donor as a preferred donor. Note that multiple nodes in a cluster can have the same name. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -367,12 +367,12 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME WSREP_PATCH_VERSION SESSION_VALUE NULL -GLOBAL_VALUE wsrep_25.19 +GLOBAL_VALUE wsrep_MAJVER.MINVER GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT wsrep patch version +VARIABLE_COMMENT Wsrep patch version, for example wsrep_MAJVER.MINVER. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -400,7 +400,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT provider specific options +VARIABLE_COMMENT Semicolon (;) separated list of wsrep options (see wsrep_provider_options documentation). NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -442,7 +442,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT Should MySQL slave be restarted automatically, when node joins back to cluster +VARIABLE_COMMENT Should MariaDB slave be restarted automatically, when node joins back to cluster NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -598,7 +598,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE INT UNSIGNED VARIABLE_COMMENT Ensure "synchronous" read view before executing an operation of the type specified by bitmask: 1 - READ(includes SELECT, SHOW and BEGIN/START TRANSACTION); 2 - UPDATE and DELETE; 4 - INSERT and REPLACE NUMERIC_MIN_VALUE 0 -NUMERIC_MAX_VALUE 7 +NUMERIC_MAX_VALUE 15 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO diff --git a/mysql-test/suite/sys_vars/r/tmp_disk_table_size_basic.result b/mysql-test/suite/sys_vars/r/tmp_disk_table_size_basic.result new file mode 100644 index 00000000000..0acf8428100 --- /dev/null +++ b/mysql-test/suite/sys_vars/r/tmp_disk_table_size_basic.result @@ -0,0 +1,146 @@ +SET @start_global_value = @@global.tmp_disk_table_size; +SET @start_session_value = @@session.tmp_disk_table_size; +'#--------------------FN_DYNVARS_005_01-------------------------#' +SET @@global.tmp_disk_table_size = 100; +Warnings: +Warning 1292 Truncated incorrect tmp_disk_table_size value: '100' +SET @@global.tmp_disk_table_size = DEFAULT; +SET @@session.tmp_disk_table_size = 200; +Warnings: +Warning 1292 Truncated incorrect tmp_disk_table_size value: '200' +SET @@session.tmp_disk_table_size = DEFAULT; +'#--------------------FN_DYNVARS_005_02-------------------------#' +SELECT @@global.tmp_disk_table_size >= 16777216; +@@global.tmp_disk_table_size >= 16777216 +1 +SELECT @@session.tmp_disk_table_size >= 16777216; +@@session.tmp_disk_table_size >= 16777216 +1 +'#--------------------FN_DYNVARS_005_03-------------------------#' +SET @@global.tmp_disk_table_size = 1024; +SELECT @@global.tmp_disk_table_size; +@@global.tmp_disk_table_size +1024 +SET @@global.tmp_disk_table_size = 60020; +SELECT @@global.tmp_disk_table_size; +@@global.tmp_disk_table_size +60020 +SET @@global.tmp_disk_table_size = 4294967295; +SELECT @@global.tmp_disk_table_size; +@@global.tmp_disk_table_size +4294967295 +'#--------------------FN_DYNVARS_005_04-------------------------#' +SET @@session.tmp_disk_table_size = 1024; +SELECT @@session.tmp_disk_table_size; +@@session.tmp_disk_table_size +1024 +SET @@session.tmp_disk_table_size = 4294967295; +SELECT @@session.tmp_disk_table_size; +@@session.tmp_disk_table_size +4294967295 +SET @@session.tmp_disk_table_size = 65535; +SELECT @@session.tmp_disk_table_size; +@@session.tmp_disk_table_size +65535 +'#------------------FN_DYNVARS_005_05-----------------------#' +SET @@global.tmp_disk_table_size = 0; +Warnings: +Warning 1292 Truncated incorrect tmp_disk_table_size value: '0' +SELECT @@global.tmp_disk_table_size; +@@global.tmp_disk_table_size +1024 +SET @@global.tmp_disk_table_size = -1024; +Warnings: +Warning 1292 Truncated incorrect tmp_disk_table_size value: '-1024' +SELECT @@global.tmp_disk_table_size; +@@global.tmp_disk_table_size +1024 +SET @@global.tmp_disk_table_size = 1000; +Warnings: +Warning 1292 Truncated incorrect tmp_disk_table_size value: '1000' +SELECT @@global.tmp_disk_table_size; +@@global.tmp_disk_table_size +1024 +SET @@global.tmp_disk_table_size = ON; +ERROR 42000: Incorrect argument type to variable 'tmp_disk_table_size' +SET @@global.tmp_disk_table_size = OFF; +ERROR 42000: Incorrect argument type to variable 'tmp_disk_table_size' +SET @@global.tmp_disk_table_size = True; +Warnings: +Warning 1292 Truncated incorrect tmp_disk_table_size value: '1' +SELECT @@global.tmp_disk_table_size; +@@global.tmp_disk_table_size +1024 +SET @@global.tmp_disk_table_size = False; +Warnings: +Warning 1292 Truncated incorrect tmp_disk_table_size value: '0' +SELECT @@global.tmp_disk_table_size; +@@global.tmp_disk_table_size +1024 +SET @@global.tmp_disk_table_size = 65530.34; +ERROR 42000: Incorrect argument type to variable 'tmp_disk_table_size' +SET @@global.tmp_disk_table_size ="Test"; +ERROR 42000: Incorrect argument type to variable 'tmp_disk_table_size' +SET @@session.tmp_disk_table_size = ON; +ERROR 42000: Incorrect argument type to variable 'tmp_disk_table_size' +SET @@session.tmp_disk_table_size = OFF; +ERROR 42000: Incorrect argument type to variable 'tmp_disk_table_size' +SET @@session.tmp_disk_table_size = True; +Warnings: +Warning 1292 Truncated incorrect tmp_disk_table_size value: '1' +SELECT @@session.tmp_disk_table_size; +@@session.tmp_disk_table_size +1024 +SET @@session.tmp_disk_table_size = False; +Warnings: +Warning 1292 Truncated incorrect tmp_disk_table_size value: '0' +SELECT @@session.tmp_disk_table_size; +@@session.tmp_disk_table_size +1024 +SET @@session.tmp_disk_table_size = "Test"; +ERROR 42000: Incorrect argument type to variable 'tmp_disk_table_size' +SET @@session.tmp_disk_table_size = 12345678901; +SELECT @@session.tmp_disk_table_size IN (12345678901,4294967295); +@@session.tmp_disk_table_size IN (12345678901,4294967295) +1 +'#------------------FN_DYNVARS_005_06-----------------------#' +SELECT @@global.tmp_disk_table_size = VARIABLE_VALUE +FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES +WHERE VARIABLE_NAME='tmp_disk_table_size'; +@@global.tmp_disk_table_size = VARIABLE_VALUE +1 +'#------------------FN_DYNVARS_005_07-----------------------#' +SELECT @@session.tmp_disk_table_size = VARIABLE_VALUE +FROM INFORMATION_SCHEMA.SESSION_VARIABLES +WHERE VARIABLE_NAME='tmp_disk_table_size'; +@@session.tmp_disk_table_size = VARIABLE_VALUE +1 +'#---------------------FN_DYNVARS_001_09----------------------#' +SET @@global.tmp_disk_table_size = 1024; +SET @@tmp_disk_table_size = 4294967295; +SELECT @@tmp_disk_table_size = @@global.tmp_disk_table_size; +@@tmp_disk_table_size = @@global.tmp_disk_table_size +0 +'#---------------------FN_DYNVARS_001_10----------------------#' +SET @@tmp_disk_table_size = 100; +Warnings: +Warning 1292 Truncated incorrect tmp_disk_table_size value: '100' +SELECT @@tmp_disk_table_size = @@local.tmp_disk_table_size; +@@tmp_disk_table_size = @@local.tmp_disk_table_size +1 +SELECT @@local.tmp_disk_table_size = @@session.tmp_disk_table_size; +@@local.tmp_disk_table_size = @@session.tmp_disk_table_size +1 +'#---------------------FN_DYNVARS_001_11----------------------#' +SET tmp_disk_table_size = 1027; +SELECT @@tmp_disk_table_size; +@@tmp_disk_table_size +1027 +SELECT local.tmp_disk_table_size; +ERROR 42S02: Unknown table 'local' in field list +SELECT global.tmp_disk_table_size; +ERROR 42S02: Unknown table 'global' in field list +SELECT tmp_disk_table_size = @@session.tmp_disk_table_size; +ERROR 42S22: Unknown column 'tmp_disk_table_size' in 'field list' +SET @@global.tmp_disk_table_size = @start_global_value; +SET @@session.tmp_disk_table_size = @start_session_value; diff --git a/mysql-test/suite/sys_vars/r/tmp_disk_table_size_func.result b/mysql-test/suite/sys_vars/r/tmp_disk_table_size_func.result new file mode 100644 index 00000000000..d2a5ad46129 --- /dev/null +++ b/mysql-test/suite/sys_vars/r/tmp_disk_table_size_func.result @@ -0,0 +1,25 @@ + +"Ensure that we get an error if we exceed tmp_disk_table_size" + +SET @start_tmp_memory_table_size=@@session.tmp_memory_table_size; +SET @start_tmp_disk_table_size=@@session.tmp_disk_table_size; +set @@session.tmp_memory_table_size=1000; +Warnings: +Warning 1292 Truncated incorrect tmp_memory_table_size value: '1000' +set @@session.tmp_disk_table_size=3000000; +create table t1 (a int primary key, b varchar(2000)); +insert into t1 select seq,repeat(char(mod(seq,62)+64),seq) from seq_1_to_2000; +insert into t1 values (20000,"A"); +select count(*) as c from t1 group by b having c>1; +c +2 +show status like "created_tmp_disk%"; +Variable_name Value +Created_tmp_disk_tables 1 +set @@session.tmp_disk_table_size=1000000; +select count(*) as c from t1 group by b having c>1; +ERROR HY000: The table '#sql_xxx' is full +show status like "created_tmp_disk%"; +Variable_name Value +Created_tmp_disk_tables 2 +drop table t1; diff --git a/mysql-test/suite/sys_vars/r/tmp_memory_table_size_basic.result b/mysql-test/suite/sys_vars/r/tmp_memory_table_size_basic.result new file mode 100644 index 00000000000..dddba1a6dfe --- /dev/null +++ b/mysql-test/suite/sys_vars/r/tmp_memory_table_size_basic.result @@ -0,0 +1,165 @@ +SET @start_global_value = @@global.tmp_memory_table_size; +SET @start_session_value = @@session.tmp_memory_table_size; +'#--------------------FN_DYNVARS_005_01-------------------------#' +SET @@global.tmp_memory_table_size = 10000; +SELECT @@global.tmp_memory_table_size; +@@global.tmp_memory_table_size +10000 +SET @@global.tmp_memory_table_size = DEFAULT; +SELECT @@global.tmp_memory_table_size; +@@global.tmp_memory_table_size +16777216 +SET @@session.tmp_memory_table_size = 20000; +SELECT @@session.tmp_memory_table_size; +@@session.tmp_memory_table_size +20000 +SET @@session.tmp_memory_table_size = DEFAULT; +SELECT @@session.tmp_memory_table_size; +@@session.tmp_memory_table_size +16777216 +'#--------------------FN_DYNVARS_005_02-------------------------#' +SELECT @@global.tmp_memory_table_size >= 16777216; +@@global.tmp_memory_table_size >= 16777216 +1 +SELECT @@session.tmp_memory_table_size >= 16777216; +@@session.tmp_memory_table_size >= 16777216 +1 +'#--------------------FN_DYNVARS_005_03-------------------------#' +SET @@global.tmp_memory_table_size = 1024; +SELECT @@global.tmp_memory_table_size; +@@global.tmp_memory_table_size +1024 +SET @@global.tmp_memory_table_size = 60020; +SELECT @@global.tmp_memory_table_size; +@@global.tmp_memory_table_size +60020 +SET @@global.tmp_memory_table_size = 4294967295; +SELECT @@global.tmp_memory_table_size; +@@global.tmp_memory_table_size +4294967295 +'#--------------------FN_DYNVARS_005_04-------------------------#' +SET @@session.tmp_memory_table_size = 1024; +SELECT @@session.tmp_memory_table_size; +@@session.tmp_memory_table_size +1024 +SET @@session.tmp_memory_table_size = 4294967295; +SELECT @@session.tmp_memory_table_size; +@@session.tmp_memory_table_size +4294967295 +SET @@session.tmp_memory_table_size = 65535; +SELECT @@session.tmp_memory_table_size; +@@session.tmp_memory_table_size +65535 +'#------------------FN_DYNVARS_005_05-----------------------#' +SET @@global.tmp_memory_table_size = 0; +Warnings: +Warning 1292 Truncated incorrect tmp_memory_table_size value: '0' +SELECT @@global.tmp_memory_table_size; +@@global.tmp_memory_table_size +1024 +SET @@global.tmp_memory_table_size = -1024; +Warnings: +Warning 1292 Truncated incorrect tmp_memory_table_size value: '-1024' +SELECT @@global.tmp_memory_table_size; +@@global.tmp_memory_table_size +1024 +SET @@global.tmp_memory_table_size = 1000; +Warnings: +Warning 1292 Truncated incorrect tmp_memory_table_size value: '1000' +SELECT @@global.tmp_memory_table_size; +@@global.tmp_memory_table_size +1024 +SET @@global.tmp_memory_table_size = ON; +ERROR 42000: Incorrect argument type to variable 'tmp_memory_table_size' +SET @@global.tmp_memory_table_size = OFF; +ERROR 42000: Incorrect argument type to variable 'tmp_memory_table_size' +SET @@global.tmp_memory_table_size = True; +Warnings: +Warning 1292 Truncated incorrect tmp_memory_table_size value: '1' +SELECT @@global.tmp_memory_table_size; +@@global.tmp_memory_table_size +1024 +SET @@global.tmp_memory_table_size = False; +Warnings: +Warning 1292 Truncated incorrect tmp_memory_table_size value: '0' +SELECT @@global.tmp_memory_table_size; +@@global.tmp_memory_table_size +1024 +SET @@global.tmp_memory_table_size = 65530.34; +ERROR 42000: Incorrect argument type to variable 'tmp_memory_table_size' +SET @@global.tmp_memory_table_size ="Test"; +ERROR 42000: Incorrect argument type to variable 'tmp_memory_table_size' +SET @@session.tmp_memory_table_size = ON; +ERROR 42000: Incorrect argument type to variable 'tmp_memory_table_size' +SET @@session.tmp_memory_table_size = OFF; +ERROR 42000: Incorrect argument type to variable 'tmp_memory_table_size' +SET @@session.tmp_memory_table_size = True; +Warnings: +Warning 1292 Truncated incorrect tmp_memory_table_size value: '1' +SELECT @@session.tmp_memory_table_size; +@@session.tmp_memory_table_size +1024 +SET @@session.tmp_memory_table_size = False; +Warnings: +Warning 1292 Truncated incorrect tmp_memory_table_size value: '0' +SELECT @@session.tmp_memory_table_size; +@@session.tmp_memory_table_size +1024 +SET @@session.tmp_memory_table_size = "Test"; +ERROR 42000: Incorrect argument type to variable 'tmp_memory_table_size' +SET @@session.tmp_memory_table_size = 12345678901; +SELECT @@session.tmp_memory_table_size IN (12345678901,4294967295); +@@session.tmp_memory_table_size IN (12345678901,4294967295) +1 +'#------------------FN_DYNVARS_005_06-----------------------#' +SELECT @@global.tmp_memory_table_size = VARIABLE_VALUE +FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES +WHERE VARIABLE_NAME='tmp_memory_table_size'; +@@global.tmp_memory_table_size = VARIABLE_VALUE +1 +'#------------------FN_DYNVARS_005_07-----------------------#' +SELECT @@session.tmp_memory_table_size = VARIABLE_VALUE +FROM INFORMATION_SCHEMA.SESSION_VARIABLES +WHERE VARIABLE_NAME='tmp_memory_table_size'; +@@session.tmp_memory_table_size = VARIABLE_VALUE +1 +'#---------------------FN_DYNVARS_001_09----------------------#' +SET @@global.tmp_memory_table_size = 1024; +SET @@tmp_memory_table_size = 4294967295; +SELECT @@tmp_memory_table_size = @@global.tmp_memory_table_size; +@@tmp_memory_table_size = @@global.tmp_memory_table_size +0 +'#---------------------FN_DYNVARS_001_10----------------------#' +SET @@tmp_memory_table_size = 100; +Warnings: +Warning 1292 Truncated incorrect tmp_memory_table_size value: '100' +SELECT @@tmp_memory_table_size = @@local.tmp_memory_table_size; +@@tmp_memory_table_size = @@local.tmp_memory_table_size +1 +SELECT @@local.tmp_memory_table_size = @@session.tmp_memory_table_size; +@@local.tmp_memory_table_size = @@session.tmp_memory_table_size +1 +'#---------------------FN_DYNVARS_001_11----------------------#' +SET tmp_memory_table_size = 1027; +SELECT @@tmp_memory_table_size; +@@tmp_memory_table_size +1027 +SELECT local.tmp_memory_table_size; +ERROR 42S02: Unknown table 'local' in field list +SELECT global.tmp_memory_table_size; +ERROR 42S02: Unknown table 'global' in field list +SELECT tmp_memory_table_size = @@session.tmp_memory_table_size; +ERROR 42S22: Unknown column 'tmp_memory_table_size' in 'field list' + +"Check that tmp_memory_table_size and tmp_table_size are the same" + +set @@session.tmp_memory_table_size=100000; +select @@session.tmp_memory_table_size,@@session.tmp_table_size; +@@session.tmp_memory_table_size @@session.tmp_table_size +100000 100000 +set @@session.tmp_memory_table_size=200000; +select @@session.tmp_memory_table_size,@@session.tmp_table_size; +@@session.tmp_memory_table_size @@session.tmp_table_size +200000 200000 +SET @@global.tmp_memory_table_size = @start_global_value; +SET @@session.tmp_memory_table_size = @start_session_value; diff --git a/mysql-test/suite/sys_vars/r/wsrep_sync_wait_basic.result b/mysql-test/suite/sys_vars/r/wsrep_sync_wait_basic.result index 1e7b9364570..0df3dff8990 100644 --- a/mysql-test/suite/sys_vars/r/wsrep_sync_wait_basic.result +++ b/mysql-test/suite/sys_vars/r/wsrep_sync_wait_basic.result @@ -34,11 +34,9 @@ SELECT @@session.wsrep_sync_wait; @@session.wsrep_sync_wait 7 SET @@session.wsrep_sync_wait=8; -Warnings: -Warning 1292 Truncated incorrect wsrep_sync_wait value: '8' SELECT @@session.wsrep_sync_wait; @@session.wsrep_sync_wait -7 +8 # invalid values SET @@global.wsrep_sync_wait=NULL; diff --git a/mysql-test/suite/sys_vars/t/back_log_basic.opt b/mysql-test/suite/sys_vars/t/back_log_basic.opt new file mode 100644 index 00000000000..fefc0d536b5 --- /dev/null +++ b/mysql-test/suite/sys_vars/t/back_log_basic.opt @@ -0,0 +1 @@ +--back-log=1000 --max-connections=300 diff --git a/mysql-test/suite/sys_vars/t/back_log_basic.test b/mysql-test/suite/sys_vars/t/back_log_basic.test index 518ca2f0e5f..94a86416e49 100644 --- a/mysql-test/suite/sys_vars/t/back_log_basic.test +++ b/mysql-test/suite/sys_vars/t/back_log_basic.test @@ -2,18 +2,3 @@ # show the global and session values; # select @@global.back_log; ---error ER_INCORRECT_GLOBAL_LOCAL_VAR -select @@session.back_log; -show global variables like 'back_log'; -show session variables like 'back_log'; -select * from information_schema.global_variables where variable_name='back_log'; -select * from information_schema.session_variables where variable_name='back_log'; - -# -# show that it's read-only -# ---error ER_INCORRECT_GLOBAL_LOCAL_VAR -set global back_log=1; ---error ER_INCORRECT_GLOBAL_LOCAL_VAR -set session back_log=1; - diff --git a/mysql-test/suite/sys_vars/t/delay_key_write_func.test b/mysql-test/suite/sys_vars/t/delay_key_write_func.test index 89f40ba544b..e823e51954c 100644 --- a/mysql-test/suite/sys_vars/t/delay_key_write_func.test +++ b/mysql-test/suite/sys_vars/t/delay_key_write_func.test @@ -20,32 +20,14 @@ ############################################################################### --echo '#--------------------FN_DYNVARS_023_01-------------------------#' -####################################################################### -# Check if setting delay_key_write is changed in every new connection # -####################################################################### - SET @start_value= @@global.delay_key_write; -SET @@global.delay_key_write = ON; -SELECT @@global.delay_key_write; - -connect (user1,localhost,root,,,,); -connection user1; -SELECT @@global.delay_key_write AS res_is_ON; -SET @@global.delay_key_write = ALL; -disconnect user1; - -connect (user1,localhost,root,,,,); -connection user1; -SELECT @@global.delay_key_write AS res_is_ALL; - --echo '#--------------------FN_DYNVARS_023_02-------------------------#' ###################################################### # Begin the functionality Testing of delay_key_write # ###################################################### # create procedure to add rows ---disable_query_log DELIMITER //; CREATE PROCEDURE sp_addRecords (IN var1 INT,IN var2 INT) BEGIN @@ -55,28 +37,19 @@ BEGIN END WHILE; END// DELIMITER ;// ---enable_query_log #============================================================================== --echo '---check when delay_key_write is OFF---' #============================================================================== - SET @@global.delay_key_write = OFF; - ---disable_query_log ---disable_warnings -DROP TABLE IF EXISTS t1; ---enable_warnings # create a table with delay_key_write enabled CREATE TABLE t1( a INT PRIMARY KEY, b VARCHAR(512), c DOUBLE ) DELAY_KEY_WRITE = 1; ---enable_query_log - FLUSH STATUS; @@ -86,6 +59,7 @@ SHOW STATUS LIKE 'Key_reads'; SHOW STATUS LIKE 'Key_writes'; SHOW STATUS LIKE 'Key_write_requests'; SELECT COUNT(*) FROM t1; +DROP TABLE t1; #============================================================================== --echo '----check when delay_key_write is ON---' @@ -93,17 +67,12 @@ SELECT COUNT(*) FROM t1; SET @@global.delay_key_write = ON; ---disable_query_log ---disable_warnings -DROP TABLE IF EXISTS t1; ---enable_warnings # create a table with delay_key_write enabled CREATE TABLE t1( a INT PRIMARY KEY, b VARCHAR(512), c DOUBLE ) DELAY_KEY_WRITE = 1; ---enable_query_log FLUSH STATUS; CALL sp_addRecords(1,10); @@ -112,23 +81,19 @@ SHOW STATUS LIKE 'Key_reads'; SHOW STATUS LIKE 'Key_writes'; SHOW STATUS LIKE 'Key_write_requests'; SELECT COUNT(*) FROM t1; +DROP TABLE t1; #============================================================================== --echo '----check when delay_key_write is ALL---' #============================================================================== SET @@global.delay_key_write = ALL; ---disable_query_log ---disable_warnings -DROP TABLE IF EXISTS t1; ---enable_warnings # create a table with delay_key_write disabled CREATE TABLE t1( a INT PRIMARY KEY, b VARCHAR(512), c DOUBLE ) DELAY_KEY_WRITE = 0; ---enable_query_log FLUSH STATUS; CALL sp_addRecords(1,10); @@ -140,12 +105,9 @@ SELECT COUNT(*) FROM t1; DROP PROCEDURE sp_addRecords; DROP TABLE t1; -disconnect user1; -connection default; SET @@global.delay_key_write= @start_value; #################################################### # End of functionality testing for delay_key_write # #################################################### - diff --git a/mysql-test/suite/sys_vars/t/innodb_purge_run_now_basic.test b/mysql-test/suite/sys_vars/t/innodb_purge_run_now_basic.test deleted file mode 100644 index 0704784dbcc..00000000000 --- a/mysql-test/suite/sys_vars/t/innodb_purge_run_now_basic.test +++ /dev/null @@ -1,53 +0,0 @@ -# -# Basic test for innodb_purge_run_now, note it is a duplicate of -# innodb_purge_stop_now. -# - --- source include/have_innodb.inc - -# The config variable is a debug variable for now --- source include/have_debug.inc - ---disable_query_log -# Enable metrics for the counters we are going to use -set global innodb_monitor_enable = purge_stop_count; -set global innodb_monitor_enable = purge_resume_count; ---enable_query_log - -# Should be 0 for both -SELECT name, count - FROM information_schema.innodb_metrics - WHERE name = 'purge_stop_count' OR name = 'purge_resume_count'; - -# Check the default value -SET @orig = @@global.innodb_purge_run_now; -SELECT @orig; - -# Stop of purge -SET GLOBAL innodb_purge_stop_now = ON; - -# Stop count should now be 1 -SELECT name, count - FROM information_schema.innodb_metrics - WHERE name = 'purge_stop_count' OR name = 'purge_resume_count'; - -SET GLOBAL innodb_purge_run_now = ON; - -# Should always be OFF -SELECT @@global.innodb_purge_run_now; - -# Both should be 1 now -SELECT name, count - FROM information_schema.innodb_metrics - WHERE name = 'purge_stop_count' OR name = 'purge_resume_count'; - ---disable_query_log -set global innodb_monitor_disable = all; -set global innodb_monitor_reset_all = all; - --- disable_warnings -set global innodb_monitor_enable = default; -set global innodb_monitor_disable = default; -set global innodb_monitor_reset = default; -set global innodb_monitor_reset_all = default; --- enable_warnings diff --git a/mysql-test/suite/sys_vars/t/innodb_purge_stop_now_basic.test b/mysql-test/suite/sys_vars/t/innodb_purge_stop_now_basic.test deleted file mode 100644 index 0704784dbcc..00000000000 --- a/mysql-test/suite/sys_vars/t/innodb_purge_stop_now_basic.test +++ /dev/null @@ -1,53 +0,0 @@ -# -# Basic test for innodb_purge_run_now, note it is a duplicate of -# innodb_purge_stop_now. -# - --- source include/have_innodb.inc - -# The config variable is a debug variable for now --- source include/have_debug.inc - ---disable_query_log -# Enable metrics for the counters we are going to use -set global innodb_monitor_enable = purge_stop_count; -set global innodb_monitor_enable = purge_resume_count; ---enable_query_log - -# Should be 0 for both -SELECT name, count - FROM information_schema.innodb_metrics - WHERE name = 'purge_stop_count' OR name = 'purge_resume_count'; - -# Check the default value -SET @orig = @@global.innodb_purge_run_now; -SELECT @orig; - -# Stop of purge -SET GLOBAL innodb_purge_stop_now = ON; - -# Stop count should now be 1 -SELECT name, count - FROM information_schema.innodb_metrics - WHERE name = 'purge_stop_count' OR name = 'purge_resume_count'; - -SET GLOBAL innodb_purge_run_now = ON; - -# Should always be OFF -SELECT @@global.innodb_purge_run_now; - -# Both should be 1 now -SELECT name, count - FROM information_schema.innodb_metrics - WHERE name = 'purge_stop_count' OR name = 'purge_resume_count'; - ---disable_query_log -set global innodb_monitor_disable = all; -set global innodb_monitor_reset_all = all; - --- disable_warnings -set global innodb_monitor_enable = default; -set global innodb_monitor_disable = default; -set global innodb_monitor_reset = default; -set global innodb_monitor_reset_all = default; --- enable_warnings diff --git a/mysql-test/suite/sys_vars/t/innodb_sched_priority_cleaner_basic.test b/mysql-test/suite/sys_vars/t/innodb_sched_priority_cleaner_basic.test index b2382fd7844..2c2037f167f 100644 --- a/mysql-test/suite/sys_vars/t/innodb_sched_priority_cleaner_basic.test +++ b/mysql-test/suite/sys_vars/t/innodb_sched_priority_cleaner_basic.test @@ -4,7 +4,15 @@ # A dynamic, global variable -SET @start_value = @@GLOBAL.innodb_sched_priority_cleaner; +# Test in read-only mode +--let $restart_parameters= --innodb-read-only +--source include/restart_mysqld.inc +--let $restart_parameters= + +# This has no actual effect in innodb_read_only mode +SET GLOBAL innodb_sched_priority_cleaner=39; + +--source include/restart_mysqld.inc # Default value SELECT @@GLOBAL.innodb_sched_priority_cleaner; diff --git a/mysql-test/suite/sys_vars/t/sysvars_wsrep.test b/mysql-test/suite/sys_vars/t/sysvars_wsrep.test index 700b129fd62..c127115efe1 100644 --- a/mysql-test/suite/sys_vars/t/sysvars_wsrep.test +++ b/mysql-test/suite/sys_vars/t/sysvars_wsrep.test @@ -5,7 +5,7 @@ --replace_result $datadir DATADIR --let $hostname_regex=/^$hostname\$/HOSTNAME/ ---replace_regex $hostname_regex +--replace_regex $hostname_regex /wsrep_[0-9]{2}\.[0-9]{1,2}/wsrep_MAJVER.MINVER/ --vertical_results select * from information_schema.system_variables where variable_name like 'wsrep%' diff --git a/mysql-test/suite/sys_vars/t/tmp_disk_table_size_basic.test b/mysql-test/suite/sys_vars/t/tmp_disk_table_size_basic.test new file mode 100644 index 00000000000..123f522a3a4 --- /dev/null +++ b/mysql-test/suite/sys_vars/t/tmp_disk_table_size_basic.test @@ -0,0 +1,207 @@ +###################### tmp_disk_table_size_basic.test ###################### +# # +# Variable Name: tmp_disk_table_size # +# Scope: GLOBAL | SESSION # +# Access Type: Dynamic # +# Data Type: numeric # +# Default Value: system dependend # +# Range: 1024-system dependend # +# # +# # +# Creation Date: 2008-02-13 # +# Author: Salman # +# # +# Description: Test Cases of Dynamic System Variable tmp_table_size # +# that checks the behavior of this variable in the following ways# +# * Default Value # +# * Valid & Invalid values # +# * Scope & Access method # +# * Data Integrity # +# Modified: 2008-12-04 HHunger # +# removed the differences between 64 and 32 bit platforms # +# # +# Reference: # +# http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html # +# # +############################################################################### + +--source include/load_sysvars.inc + +############################################################## +# START OF tmp_disk_table_size TESTS # +############################################################## + +############################################################# +# Save initial value # +############################################################# + +SET @start_global_value = @@global.tmp_disk_table_size; +SET @start_session_value = @@session.tmp_disk_table_size; + +--echo '#--------------------FN_DYNVARS_005_01-------------------------#' +############################################################## +# Display the DEFAULT value of tmp_disk_table_size # +############################################################## + +SET @@global.tmp_disk_table_size = 100; +SET @@global.tmp_disk_table_size = DEFAULT; + +SET @@session.tmp_disk_table_size = 200; +SET @@session.tmp_disk_table_size = DEFAULT; + +--echo '#--------------------FN_DYNVARS_005_02-------------------------#' +######################################################################## +# Check the DEFAULT value of tmp_disk_table_size # +######################################################################## +# The DEFAULT value is system dependend. +# Therefore we have only a plausibility check here +SELECT @@global.tmp_disk_table_size >= 16777216; +SELECT @@session.tmp_disk_table_size >= 16777216; + +--echo '#--------------------FN_DYNVARS_005_03-------------------------#' +######################################################################## +# Change the value of tmp_disk_table_size to a valid value for GLOBAL Scope # +######################################################################## + +SET @@global.tmp_disk_table_size = 1024; +SELECT @@global.tmp_disk_table_size; +SET @@global.tmp_disk_table_size = 60020; +SELECT @@global.tmp_disk_table_size; +SET @@global.tmp_disk_table_size = 4294967295; +SELECT @@global.tmp_disk_table_size; + + +--echo '#--------------------FN_DYNVARS_005_04-------------------------#' +######################################################################### +# Change the value of tmp_disk_table_size to a valid value for SESSION Scope # +######################################################################### + +SET @@session.tmp_disk_table_size = 1024; +SELECT @@session.tmp_disk_table_size; + +SET @@session.tmp_disk_table_size = 4294967295; +SELECT @@session.tmp_disk_table_size; +SET @@session.tmp_disk_table_size = 65535; +SELECT @@session.tmp_disk_table_size; + + +--echo '#------------------FN_DYNVARS_005_05-----------------------#' +########################################################## +# Change the value of tmp_disk_table_size to an invalid value # +########################################################## + +SET @@global.tmp_disk_table_size = 0; +SELECT @@global.tmp_disk_table_size; + +SET @@global.tmp_disk_table_size = -1024; +SELECT @@global.tmp_disk_table_size; + +SET @@global.tmp_disk_table_size = 1000; +SELECT @@global.tmp_disk_table_size; + +--Error ER_WRONG_TYPE_FOR_VAR +SET @@global.tmp_disk_table_size = ON; + +--Error ER_WRONG_TYPE_FOR_VAR +SET @@global.tmp_disk_table_size = OFF; + +SET @@global.tmp_disk_table_size = True; +SELECT @@global.tmp_disk_table_size; + +SET @@global.tmp_disk_table_size = False; +SELECT @@global.tmp_disk_table_size; + +--Error ER_WRONG_TYPE_FOR_VAR +SET @@global.tmp_disk_table_size = 65530.34; + +--Error ER_WRONG_TYPE_FOR_VAR +SET @@global.tmp_disk_table_size ="Test"; + +--Error ER_WRONG_TYPE_FOR_VAR +SET @@session.tmp_disk_table_size = ON; + +--Error ER_WRONG_TYPE_FOR_VAR +SET @@session.tmp_disk_table_size = OFF; + +SET @@session.tmp_disk_table_size = True; +SELECT @@session.tmp_disk_table_size; + +SET @@session.tmp_disk_table_size = False; +SELECT @@session.tmp_disk_table_size; + +--Error ER_WRONG_TYPE_FOR_VAR +SET @@session.tmp_disk_table_size = "Test"; + +--disable_warnings +SET @@session.tmp_disk_table_size = 12345678901; +--enable_warnings +# With a 64 bit mysqld:12345678901,with a 32 bit mysqld: 4294967295 +SELECT @@session.tmp_disk_table_size IN (12345678901,4294967295); + +--echo '#------------------FN_DYNVARS_005_06-----------------------#' +#################################################################### +# Check if the value in GLOBAL Table matches value in variable # +#################################################################### + +SELECT @@global.tmp_disk_table_size = VARIABLE_VALUE +FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES +WHERE VARIABLE_NAME='tmp_disk_table_size'; + +--echo '#------------------FN_DYNVARS_005_07-----------------------#' +#################################################################### +# Check if the value in SESSION Table matches value in variable # +#################################################################### + +SELECT @@session.tmp_disk_table_size = VARIABLE_VALUE +FROM INFORMATION_SCHEMA.SESSION_VARIABLES +WHERE VARIABLE_NAME='tmp_disk_table_size'; + +--echo '#---------------------FN_DYNVARS_001_09----------------------#' +######################################################################## +# Check if global and session variables are independent of each other # +######################################################################## + +SET @@global.tmp_disk_table_size = 1024; +SET @@tmp_disk_table_size = 4294967295; +SELECT @@tmp_disk_table_size = @@global.tmp_disk_table_size; + +--echo '#---------------------FN_DYNVARS_001_10----------------------#' +################################################################## +# Check if accessing variable with SESSION,LOCAL and without # +# SCOPE points to same session variable # +################################################################## + +SET @@tmp_disk_table_size = 100; +SELECT @@tmp_disk_table_size = @@local.tmp_disk_table_size; +SELECT @@local.tmp_disk_table_size = @@session.tmp_disk_table_size; + + +--echo '#---------------------FN_DYNVARS_001_11----------------------#' +######################################################################### +# Check if tmp_disk_table_size can be accessed with and without @@ sign # +######################################################################### + +SET tmp_disk_table_size = 1027; +SELECT @@tmp_disk_table_size; + +--Error ER_UNKNOWN_TABLE +SELECT local.tmp_disk_table_size; + +--Error ER_UNKNOWN_TABLE +SELECT global.tmp_disk_table_size; + +--Error ER_BAD_FIELD_ERROR +SELECT tmp_disk_table_size = @@session.tmp_disk_table_size; + + +#################################### +# Restore initial value # +#################################### + +SET @@global.tmp_disk_table_size = @start_global_value; +SET @@session.tmp_disk_table_size = @start_session_value; + +################################################### +# END OF tmp_disk_table_size TESTS # +################################################### + diff --git a/mysql-test/suite/sys_vars/t/tmp_disk_table_size_func.test b/mysql-test/suite/sys_vars/t/tmp_disk_table_size_func.test new file mode 100644 index 00000000000..bf93b4646d9 --- /dev/null +++ b/mysql-test/suite/sys_vars/t/tmp_disk_table_size_func.test @@ -0,0 +1,26 @@ +###################### tmp_memory_table_size_func.test ######################## + +--source include/load_sysvars.inc +--source include/have_sequence.inc + +--echo +--echo "Ensure that we get an error if we exceed tmp_disk_table_size" +--echo + +SET @start_tmp_memory_table_size=@@session.tmp_memory_table_size; +SET @start_tmp_disk_table_size=@@session.tmp_disk_table_size; + +set @@session.tmp_memory_table_size=1000; +set @@session.tmp_disk_table_size=3000000; + +create table t1 (a int primary key, b varchar(2000)); +insert into t1 select seq,repeat(char(mod(seq,62)+64),seq) from seq_1_to_2000; +insert into t1 values (20000,"A"); +select count(*) as c from t1 group by b having c>1; +show status like "created_tmp_disk%"; +set @@session.tmp_disk_table_size=1000000; +--replace_regex /The table '.*' is full/The table '#sql_xxx' is full/ +--error ER_RECORD_FILE_FULL +select count(*) as c from t1 group by b having c>1; +show status like "created_tmp_disk%"; +drop table t1; diff --git a/mysql-test/suite/sys_vars/t/tmp_memory_table_size_basic.test b/mysql-test/suite/sys_vars/t/tmp_memory_table_size_basic.test new file mode 100644 index 00000000000..f5fcb17c8a5 --- /dev/null +++ b/mysql-test/suite/sys_vars/t/tmp_memory_table_size_basic.test @@ -0,0 +1,209 @@ +###################### tmp_memory_table_size_basic.test ###################### +# # +# Variable Name: tmp_memory_table_size # +# Scope: GLOBAL | SESSION # +# Access Type: Dynamic # +# Data Type: numeric # +# # +# Description: Test Cases of Dynamic System Variable tmp_table_size # +# that checks the behavior of this variable in the following ways# +# * Default Value # +# * Valid & Invalid values # +# * Scope & Access method # +# * Data Integrity # +# # +############################################################################### + +--source include/load_sysvars.inc + +############################################################## +# START OF tmp_memory_table_size TESTS # +############################################################## + +############################################################# +# Save initial value # +############################################################# + +SET @start_global_value = @@global.tmp_memory_table_size; +SET @start_session_value = @@session.tmp_memory_table_size; + +--echo '#--------------------FN_DYNVARS_005_01-------------------------#' +############################################################## +# Display the DEFAULT value of tmp_memory_table_size # +############################################################## + +SET @@global.tmp_memory_table_size = 10000; +SELECT @@global.tmp_memory_table_size; +SET @@global.tmp_memory_table_size = DEFAULT; +SELECT @@global.tmp_memory_table_size; + +SET @@session.tmp_memory_table_size = 20000; +SELECT @@session.tmp_memory_table_size; +SET @@session.tmp_memory_table_size = DEFAULT; +SELECT @@session.tmp_memory_table_size; + +--echo '#--------------------FN_DYNVARS_005_02-------------------------#' +######################################################################## +# Check the DEFAULT value of tmp_memory_table_size # +######################################################################## +# The DEFAULT value is system dependend. +# Therefore we have only a plausibility check here +SELECT @@global.tmp_memory_table_size >= 16777216; +SELECT @@session.tmp_memory_table_size >= 16777216; + +--echo '#--------------------FN_DYNVARS_005_03-------------------------#' +######################################################################## +# Change the value of tmp_memory_table_size to a valid value for GLOBAL Scope # +######################################################################## + +SET @@global.tmp_memory_table_size = 1024; +SELECT @@global.tmp_memory_table_size; +SET @@global.tmp_memory_table_size = 60020; +SELECT @@global.tmp_memory_table_size; +SET @@global.tmp_memory_table_size = 4294967295; +SELECT @@global.tmp_memory_table_size; + + +--echo '#--------------------FN_DYNVARS_005_04-------------------------#' +######################################################################### +# Change the value of tmp_memory_table_size to a valid value for SESSION Scope # +######################################################################### + +SET @@session.tmp_memory_table_size = 1024; +SELECT @@session.tmp_memory_table_size; + +SET @@session.tmp_memory_table_size = 4294967295; +SELECT @@session.tmp_memory_table_size; +SET @@session.tmp_memory_table_size = 65535; +SELECT @@session.tmp_memory_table_size; + + +--echo '#------------------FN_DYNVARS_005_05-----------------------#' +########################################################## +# Change the value of tmp_memory_table_size to an invalid value # +########################################################## + +SET @@global.tmp_memory_table_size = 0; +SELECT @@global.tmp_memory_table_size; + +SET @@global.tmp_memory_table_size = -1024; +SELECT @@global.tmp_memory_table_size; + +SET @@global.tmp_memory_table_size = 1000; +SELECT @@global.tmp_memory_table_size; + +--Error ER_WRONG_TYPE_FOR_VAR +SET @@global.tmp_memory_table_size = ON; + +--Error ER_WRONG_TYPE_FOR_VAR +SET @@global.tmp_memory_table_size = OFF; + +SET @@global.tmp_memory_table_size = True; +SELECT @@global.tmp_memory_table_size; + +SET @@global.tmp_memory_table_size = False; +SELECT @@global.tmp_memory_table_size; + +--Error ER_WRONG_TYPE_FOR_VAR +SET @@global.tmp_memory_table_size = 65530.34; + +--Error ER_WRONG_TYPE_FOR_VAR +SET @@global.tmp_memory_table_size ="Test"; + +--Error ER_WRONG_TYPE_FOR_VAR +SET @@session.tmp_memory_table_size = ON; + +--Error ER_WRONG_TYPE_FOR_VAR +SET @@session.tmp_memory_table_size = OFF; + +SET @@session.tmp_memory_table_size = True; +SELECT @@session.tmp_memory_table_size; + +SET @@session.tmp_memory_table_size = False; +SELECT @@session.tmp_memory_table_size; + +--Error ER_WRONG_TYPE_FOR_VAR +SET @@session.tmp_memory_table_size = "Test"; + +--disable_warnings +SET @@session.tmp_memory_table_size = 12345678901; +--enable_warnings +# With a 64 bit mysqld:12345678901,with a 32 bit mysqld: 4294967295 +SELECT @@session.tmp_memory_table_size IN (12345678901,4294967295); + +--echo '#------------------FN_DYNVARS_005_06-----------------------#' +#################################################################### +# Check if the value in GLOBAL Table matches value in variable # +#################################################################### + +SELECT @@global.tmp_memory_table_size = VARIABLE_VALUE +FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES +WHERE VARIABLE_NAME='tmp_memory_table_size'; + +--echo '#------------------FN_DYNVARS_005_07-----------------------#' +#################################################################### +# Check if the value in SESSION Table matches value in variable # +#################################################################### + +SELECT @@session.tmp_memory_table_size = VARIABLE_VALUE +FROM INFORMATION_SCHEMA.SESSION_VARIABLES +WHERE VARIABLE_NAME='tmp_memory_table_size'; + +--echo '#---------------------FN_DYNVARS_001_09----------------------#' +######################################################################## +# Check if global and session variables are independent of each other # +######################################################################## + +SET @@global.tmp_memory_table_size = 1024; +SET @@tmp_memory_table_size = 4294967295; +SELECT @@tmp_memory_table_size = @@global.tmp_memory_table_size; + +--echo '#---------------------FN_DYNVARS_001_10----------------------#' +################################################################## +# Check if accessing variable with SESSION,LOCAL and without # +# SCOPE points to same session variable # +################################################################## + +SET @@tmp_memory_table_size = 100; +SELECT @@tmp_memory_table_size = @@local.tmp_memory_table_size; +SELECT @@local.tmp_memory_table_size = @@session.tmp_memory_table_size; + + +--echo '#---------------------FN_DYNVARS_001_11----------------------#' +######################################################################### +# Check if tmp_memory_table_size can be accessed with and without @@ sign # +######################################################################### + +SET tmp_memory_table_size = 1027; +SELECT @@tmp_memory_table_size; + +--Error ER_UNKNOWN_TABLE +SELECT local.tmp_memory_table_size; + +--Error ER_UNKNOWN_TABLE +SELECT global.tmp_memory_table_size; + +--Error ER_BAD_FIELD_ERROR +SELECT tmp_memory_table_size = @@session.tmp_memory_table_size; + +--echo +--echo "Check that tmp_memory_table_size and tmp_table_size are the same" +--echo + +set @@session.tmp_memory_table_size=100000; +select @@session.tmp_memory_table_size,@@session.tmp_table_size; +set @@session.tmp_memory_table_size=200000; +select @@session.tmp_memory_table_size,@@session.tmp_table_size; + + +#################################### +# Restore initial value # +#################################### + +SET @@global.tmp_memory_table_size = @start_global_value; +SET @@session.tmp_memory_table_size = @start_session_value; + +################################################### +# END OF tmp_memory_table_size TESTS # +################################################### + diff --git a/mysql-test/suite/vcol/r/cross_db.result b/mysql-test/suite/vcol/r/cross_db.result new file mode 100644 index 00000000000..c99f8e919d9 --- /dev/null +++ b/mysql-test/suite/vcol/r/cross_db.result @@ -0,0 +1,17 @@ +create database mysqltest1; +create table mysqltest1.t1 (i int, j int as (i) persistent); +show create table mysqltest1.t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `i` int(11) DEFAULT NULL, + `j` int(11) GENERATED ALWAYS AS (`i`) STORED +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +alter table mysqltest1.t1 add index (i); +show create table mysqltest1.t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `i` int(11) DEFAULT NULL, + `j` int(11) GENERATED ALWAYS AS (`i`) STORED, + KEY `i` (`i`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +drop database mysqltest1; diff --git a/mysql-test/suite/vcol/r/innodb_virtual_fk.result b/mysql-test/suite/vcol/r/innodb_virtual_fk.result new file mode 100644 index 00000000000..58db12583e2 --- /dev/null +++ b/mysql-test/suite/vcol/r/innodb_virtual_fk.result @@ -0,0 +1,12 @@ +set default_storage_engine=innodb; +create table t1 (id int primary key, id2 int as (id) virtual, key id2 (id2)); +create table t2 (id int key, constraint fk_id foreign key (id) references t1 (id) on delete cascade); +insert into t1 (id) values (1), (2); +insert into t2 (id) values (1), (2); +delete from t1; +select * from t1; +id id2 +select * from t2; +id +drop table t2; +drop table t1; diff --git a/mysql-test/suite/vcol/r/update.result b/mysql-test/suite/vcol/r/update.result index 95b0093ed71..5c7905cf547 100644 --- a/mysql-test/suite/vcol/r/update.result +++ b/mysql-test/suite/vcol/r/update.result @@ -155,3 +155,13 @@ select * from t; a b c d e 11 11 11 11 11 drop table t, t1, t2; +create table t (f1 int, f2 int, f3 int as (f1*2) virtual, key(f3,f2)); +insert into t (f1,f2) values (1,1),(2,2); +create view v as +select a2.f1, a2.f2, a1.f3 +from t a1, t a2 +where a2.f3 <> 0 +with local check option; +update v set f3 = 52; +drop view v; +drop table t; diff --git a/mysql-test/suite/vcol/r/upgrade.result b/mysql-test/suite/vcol/r/upgrade.result new file mode 100644 index 00000000000..75684bf0e41 --- /dev/null +++ b/mysql-test/suite/vcol/r/upgrade.result @@ -0,0 +1,18 @@ +check table vcol_autoinc for upgrade; +Table Op Msg_type Msg_text +test.vcol_autoinc check Warning Function or expression 'AUTO_INCREMENT' cannot be used in the GENERATED ALWAYS AS clause of `pk` +test.vcol_autoinc check status OK +show create table vcol_autoinc; +Table Create Table +vcol_autoinc CREATE TABLE `vcol_autoinc` ( + `pk` int(11) NOT NULL AUTO_INCREMENT, + `v3` int(11) GENERATED ALWAYS AS (`pk`) VIRTUAL, + PRIMARY KEY (`pk`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +select * from vcol_autoinc; +pk v3 +insert vcol_autoinc (pk) values (1); +select * from vcol_autoinc; +pk v3 +1 1 +drop table vcol_autoinc; diff --git a/mysql-test/suite/vcol/r/vcol_supported_sql_funcs.result b/mysql-test/suite/vcol/r/vcol_supported_sql_funcs.result index 9413dbdace7..d4104c2c57e 100644 --- a/mysql-test/suite/vcol/r/vcol_supported_sql_funcs.result +++ b/mysql-test/suite/vcol/r/vcol_supported_sql_funcs.result @@ -2911,16 +2911,31 @@ drop table t1; set sql_warnings = 0; # TIME_FORMAT() set sql_warnings = 1; -create table t1 (a datetime, b varchar(10) as (time_format(a,"%d.%m.%Y"))); +create table t1 (a datetime, b varchar(10) as (time_format(a,"%H.%i.%S"))); show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `a` datetime DEFAULT NULL, - `b` varchar(10) GENERATED ALWAYS AS (time_format(`a`,'%d.%m.%Y')) VIRTUAL + `b` varchar(10) GENERATED ALWAYS AS (time_format(`a`,'%H.%i.%S')) VIRTUAL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 -insert into t1 values ('2001-01-01 02:02:02',default); +insert into t1 values ('2001-01-01 02:03:04',default); select * from t1; a b -2001-01-01 02:02:02 01.01.2001 +2001-01-01 02:03:04 02.03.04 +drop table t1; +set sql_warnings = 0; +# TIME_FORMAT() STORED +set sql_warnings = 1; +create table t1 (a datetime, b varchar(10) as (time_format(a,"%H.%i.%S")) STORED); +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` datetime DEFAULT NULL, + `b` varchar(10) GENERATED ALWAYS AS (time_format(`a`,'%H.%i.%S')) STORED +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +insert into t1 values ('2001-01-01 02:03:04',default); +select * from t1; +a b +2001-01-01 02:03:04 02.03.04 drop table t1; set sql_warnings = 0; diff --git a/mysql-test/suite/vcol/r/wrong_arena.result b/mysql-test/suite/vcol/r/wrong_arena.result index e86026852e4..c105a069b7f 100644 --- a/mysql-test/suite/vcol/r/wrong_arena.result +++ b/mysql-test/suite/vcol/r/wrong_arena.result @@ -59,3 +59,12 @@ a b Warnings: Warning 1292 Incorrect datetime value: '1' drop table t1; +create table t1 ( +id int not null , +js varchar(1000) not null, +t time AS (cast(json_value(json_extract(js,concat('$.singleDay."', dayname(curdate()),'"')),'$.start') as time)) virtual); +insert into t1(id,js) values (0, '{"default" : {"start": "00:00:00", "end":"23:59:50"}}'); +select * from t1; +id js t +0 {"default" : {"start": "00:00:00", "end":"23:59:50"}} NULL +drop table t1; diff --git a/mysql-test/suite/vcol/t/cross_db.test b/mysql-test/suite/vcol/t/cross_db.test new file mode 100644 index 00000000000..6804c459b84 --- /dev/null +++ b/mysql-test/suite/vcol/t/cross_db.test @@ -0,0 +1,9 @@ +# +# MDEV-13209 Cross-database operation with virtual columns fails +# +create database mysqltest1; +create table mysqltest1.t1 (i int, j int as (i) persistent); +show create table mysqltest1.t1; +alter table mysqltest1.t1 add index (i); +show create table mysqltest1.t1; +drop database mysqltest1; diff --git a/mysql-test/suite/vcol/t/innodb_virtual_fk.test b/mysql-test/suite/vcol/t/innodb_virtual_fk.test new file mode 100644 index 00000000000..c364adaa613 --- /dev/null +++ b/mysql-test/suite/vcol/t/innodb_virtual_fk.test @@ -0,0 +1,16 @@ +source include/have_innodb.inc; +set default_storage_engine=innodb; + +# +# MDEV-13708 Crash with indexed virtual columns and FK cascading deletes +# + +create table t1 (id int primary key, id2 int as (id) virtual, key id2 (id2)); +create table t2 (id int key, constraint fk_id foreign key (id) references t1 (id) on delete cascade); +insert into t1 (id) values (1), (2); +insert into t2 (id) values (1), (2); +delete from t1; +select * from t1; +select * from t2; +drop table t2; +drop table t1; diff --git a/mysql-test/suite/vcol/t/update.test b/mysql-test/suite/vcol/t/update.test index 062d9736ed8..1797bdd501e 100644 --- a/mysql-test/suite/vcol/t/update.test +++ b/mysql-test/suite/vcol/t/update.test @@ -111,3 +111,17 @@ check table t; select * from t; update t, t tt set t.b=11, tt.d=11 where t.a=tt.a; check table t; select * from t; drop table t, t1, t2; + +# +# MDEV-13623 Assertion `!table || (!table->read_set || bitmap_is_set(table->read_set, field_index))' failed in virtual longlong Field_long::val_int +# +create table t (f1 int, f2 int, f3 int as (f1*2) virtual, key(f3,f2)); +insert into t (f1,f2) values (1,1),(2,2); +create view v as + select a2.f1, a2.f2, a1.f3 + from t a1, t a2 + where a2.f3 <> 0 + with local check option; +update v set f3 = 52; +drop view v; +drop table t; diff --git a/mysql-test/suite/vcol/t/upgrade.test b/mysql-test/suite/vcol/t/upgrade.test new file mode 100644 index 00000000000..3e221747dfa --- /dev/null +++ b/mysql-test/suite/vcol/t/upgrade.test @@ -0,0 +1,13 @@ +# +# MDEV-12936 upgrade to 10.2.6 failed upon tables with virtual columns +# +let $datadir=`select @@datadir`; +copy_file std_data/vcol_autoinc.frm $datadir/test/vcol_autoinc.frm; +copy_file std_data/vcol_autoinc.MYD $datadir/test/vcol_autoinc.MYD; +copy_file std_data/vcol_autoinc.MYI $datadir/test/vcol_autoinc.MYI; +check table vcol_autoinc for upgrade; +show create table vcol_autoinc; +select * from vcol_autoinc; +insert vcol_autoinc (pk) values (1); +select * from vcol_autoinc; +drop table vcol_autoinc; diff --git a/mysql-test/suite/vcol/t/vcol_supported_sql_funcs_main.inc b/mysql-test/suite/vcol/t/vcol_supported_sql_funcs_main.inc index 4a95ea75534..dafc42098dd 100644 --- a/mysql-test/suite/vcol/t/vcol_supported_sql_funcs_main.inc +++ b/mysql-test/suite/vcol/t/vcol_supported_sql_funcs_main.inc @@ -1204,8 +1204,14 @@ let $rows = 1; --source suite/vcol/inc/vcol_supported_sql_funcs.inc --echo # TIME_FORMAT() -let $cols = a datetime, b varchar(10) as (time_format(a,"%d.%m.%Y")); -let $values1 = '2001-01-01 02:02:02',default; +let $cols = a datetime, b varchar(10) as (time_format(a,"%H.%i.%S")); +let $values1 = '2001-01-01 02:03:04',default; +let $rows = 1; +--source suite/vcol/inc/vcol_supported_sql_funcs.inc + +--echo # TIME_FORMAT() STORED +let $cols = a datetime, b varchar(10) as (time_format(a,"%H.%i.%S")) STORED; +let $values1 = '2001-01-01 02:03:04',default; let $rows = 1; --source suite/vcol/inc/vcol_supported_sql_funcs.inc diff --git a/mysql-test/suite/vcol/t/wrong_arena.test b/mysql-test/suite/vcol/t/wrong_arena.test index 340634422ae..3d65dac9219 100644 --- a/mysql-test/suite/vcol/t/wrong_arena.test +++ b/mysql-test/suite/vcol/t/wrong_arena.test @@ -37,3 +37,14 @@ disconnect con1; connection default; select * from t1; drop table t1; + +# +# MDEV-13435 Crash when selecting virtual columns generated using JSON functions +# +create table t1 ( + id int not null , + js varchar(1000) not null, + t time AS (cast(json_value(json_extract(js,concat('$.singleDay."', dayname(curdate()),'"')),'$.start') as time)) virtual); +insert into t1(id,js) values (0, '{"default" : {"start": "00:00:00", "end":"23:59:50"}}'); +select * from t1; +drop table t1; diff --git a/mysql-test/suite/wsrep/disabled.def b/mysql-test/suite/wsrep/disabled.def index 605f063f967..8b137891791 100644 --- a/mysql-test/suite/wsrep/disabled.def +++ b/mysql-test/suite/wsrep/disabled.def @@ -1 +1 @@ -foreign_key : MDEV-7915 + diff --git a/mysql-test/suite/wsrep/include/check_galera_version.inc b/mysql-test/suite/wsrep/include/check_galera_version.inc index 38b4ada98b9..e495da8f1ee 100644 --- a/mysql-test/suite/wsrep/include/check_galera_version.inc +++ b/mysql-test/suite/wsrep/include/check_galera_version.inc @@ -2,7 +2,7 @@ # Enable tests to check the galera library version. # # ==== Usage ==== -# --let $galera_version=25.3.6 +# --let $galera_version=3.6 # source include/check_galera_lib_version.inc; # # Parameters: @@ -12,11 +12,26 @@ --disable_query_log -eval SET @GALERA_VERSION=(SELECT CONCAT('$galera_version', '%')); +# Required Version -if (!`SELECT COUNT(*) FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE - VARIABLE_NAME LIKE 'wsrep_provider_version' AND - VARIABLE_VALUE LIKE @GALERA_VERSION`) +eval SET @GALERA_VERSION='$galera_version'; +SELECT CAST(REGEXP_REPLACE(@GALERA_VERSION,'^(\\d+)\\.(\\d+).*','\\1') AS UNSIGNED) INTO @GALERA_MAJOR_VERSION; +SELECT CAST(REGEXP_REPLACE(@GALERA_VERSION,'^(\\d+)\\.(\\d+).*','\\2') AS UNSIGNED) INTO @GALERA_MINOR_VERSION; + +# Actual +SELECT VARIABLE_VALUE INTO @ACTUAL_GALERA_VERSION FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE 'wsrep_provider_version'; + +SELECT CAST(REGEXP_REPLACE(@ACTUAL_GALERA_VERSION,'^(\\d+)\\.(\\d+).*','\\1') AS UNSIGNED) INTO @ACTUAL_GALERA_MAJOR_VERSION; +SELECT CAST(REGEXP_REPLACE(@ACTUAL_GALERA_VERSION,'^(\\d+)\\.(\\d+).*','\\2') AS UNSIGNED) INTO @ACTUAL_GALERA_MINOR_VERSION; + +# For testing +#SELECT @GALERA_MAJOR_VERSION, @GALERA_MINOR_VERSION; +#SELECT @ACTUAL_GALERA_VERSION; +#SELECT @ACTUAL_GALERA_MAJOR_VERSION, @ACTUAL_GALERA_MINOR_VERSION; + +if (!`SELECT (@ACTUAL_GALERA_MAJOR_VERSION > @GALERA_MAJOR_VERSION) OR + (@ACTUAL_GALERA_MAJOR_VERSION = @GALERA_MAJOR_VERSION AND @ACTUAL_GALERA_MINOR_VERSION >= @GALERA_MINOR_VERSION) + `) { skip Test requires Galera library version $galera_version; } diff --git a/mysql-test/suite/wsrep/t/mdev_6832.opt b/mysql-test/suite/wsrep/t/mdev_6832.opt index 459a9702707..16f8962dba2 100644 --- a/mysql-test/suite/wsrep/t/mdev_6832.opt +++ b/mysql-test/suite/wsrep/t/mdev_6832.opt @@ -1 +1 @@ ---wsrep-provider=$WSREP_PROVIDER --wsrep-cluster-address=gcomm:// --wsrep-on=1 --wsrep_causal_reads=ON +--wsrep-provider=$WSREP_PROVIDER --wsrep-cluster-address=gcomm:// --wsrep-on=1 diff --git a/mysql-test/suite/wsrep/t/mdev_7798.opt b/mysql-test/suite/wsrep/t/mdev_7798.opt index 459a9702707..1007d5c0b78 100644 --- a/mysql-test/suite/wsrep/t/mdev_7798.opt +++ b/mysql-test/suite/wsrep/t/mdev_7798.opt @@ -1 +1 @@ ---wsrep-provider=$WSREP_PROVIDER --wsrep-cluster-address=gcomm:// --wsrep-on=1 --wsrep_causal_reads=ON +--wsrep-provider=$WSREP_PROVIDER --wsrep-cluster-address=gcomm:// --wsrep-on=1 diff --git a/mysql-test/suite/wsrep/t/pool_of_threads.test b/mysql-test/suite/wsrep/t/pool_of_threads.test index dbf429e3f01..8e95d0ca495 100644 --- a/mysql-test/suite/wsrep/t/pool_of_threads.test +++ b/mysql-test/suite/wsrep/t/pool_of_threads.test @@ -1,4 +1,4 @@ ---source include/have_wsrep.inc +--source include/have_wsrep_enabled.inc --source include/have_binlog_format_row.inc --echo diff --git a/mysql-test/t/alter_table.test b/mysql-test/t/alter_table.test index 143ba80c53b..487990b61cd 100644 --- a/mysql-test/t/alter_table.test +++ b/mysql-test/t/alter_table.test @@ -1765,6 +1765,48 @@ ALTER TABLE t1 CONVERT TO CHARACTER SET utf8; SHOW CREATE TABLE t1; DROP TABLE t1; +--echo # +--echo # MDEV-8960 Can't refer the same column twice in one ALTER TABLE +--echo # + +CREATE TABLE t1 ( + `a` int(11) DEFAULT NULL +) DEFAULT CHARSET=utf8; + +ALTER TABLE t1 ADD COLUMN `consultant_id` integer NOT NULL, +ALTER COLUMN `consultant_id` DROP DEFAULT; + +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 ( + `a` int(11) DEFAULT NULL +) DEFAULT CHARSET=utf8; + +ALTER TABLE t1 ADD COLUMN `consultant_id` integer NOT NULL, +ALTER COLUMN `consultant_id` SET DEFAULT 2; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 ( + `a` int(11) DEFAULT NULL +) DEFAULT CHARSET=utf8; + +ALTER TABLE t1 ADD COLUMN `consultant_id` integer NOT NULL DEFAULT 2, +ALTER COLUMN `consultant_id` DROP DEFAULT; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 ( + `a` int(11) DEFAULT NULL +) DEFAULT CHARSET=utf8; + +ALTER TABLE t1 ADD COLUMN `consultant_id` integer NOT NULL DEFAULT 2, +ALTER COLUMN `consultant_id` DROP DEFAULT, +MODIFY COLUMN `consultant_id` BIGINT; +SHOW CREATE TABLE t1; +DROP TABLE t1; + --echo # --echo # Start of 10.1 tests --echo # @@ -1801,3 +1843,37 @@ DROP TABLE t1; --error ER_DUP_CONSTRAINT_NAME CREATE TABLE t1(a INT, b INT, CONSTRAINT min check (a>5), CONSTRAINT min check (b>5)); + +# +# MDEV-11114 Cannot drop column referenced by CHECK constraint +# +create table t1 (a int, b int, check(a>b)); +--error ER_BAD_FIELD_ERROR +alter table t1 drop column a; +--error ER_BAD_FIELD_ERROR +alter table t1 drop column b, add column b bigint first; +alter table t1 drop column a, drop constraint constraint_1; +show create table t1; +drop table t1; + +create table t1 (a int, b int, check(a>0)); +alter table t1 drop column a; +show create table t1; +drop table t1; + +create table t1 (a int, b int, check(a>0)); +alter table t1 drop column a, add column a bigint first; +show create table t1; +drop table t1; + +create table t1 (a int, b int, c int, unique(a)); +alter table t1 drop column a; +show create table t1; +drop table t1; + +create table t1 (a int, b int, c int, unique(a,b)); +--error ER_KEY_COLUMN_DOES_NOT_EXITS +alter table t1 drop column a; +alter table t1 drop column a, drop index a; +show create table t1; +drop table t1; diff --git a/mysql-test/t/alter_table_online.test b/mysql-test/t/alter_table_online.test index 22ebadd64f9..f5a40734535 100644 --- a/mysql-test/t/alter_table_online.test +++ b/mysql-test/t/alter_table_online.test @@ -285,6 +285,28 @@ CREATE TABLE t1 (a LONGTEXT COLLATE latin1_general_ci); ALTER TABLE t1 MODIFY a LONGTEXT COLLATE latin1_swedish_ci, ALGORITHM=INPLACE; DROP TABLE t1; ---echo # ---echo # End of MDEV-8948 ALTER ... INPLACE does work for BINARY, BLOB ---echo # +# End of 10.0 tests + +# +# MDEV-11335 Changing delay_key_write option for MyISAM table should not copy rows +# +select @@global.delay_key_write; +create table t1 (a int, b int, key(b)); +flush tables; +flush status; +show status like 'Feature_delay_key_write'; +insert t1 values (1,2),(2,3),(3,4); +show status like 'Feature_delay_key_write'; +alter online table t1 delay_key_write=1; +show status like 'Feature_delay_key_write'; +flush tables; +insert t1 values (1,2),(2,3),(3,4); +show status like 'Feature_delay_key_write'; +alter online table t1 delay_key_write=0; +show status like 'Feature_delay_key_write'; +flush tables; +insert t1 values (1,2),(2,3),(3,4); +show status like 'Feature_delay_key_write'; +drop table t1; + +# End of 10.1 tests diff --git a/mysql-test/t/analyze_format_json.test b/mysql-test/t/analyze_format_json.test index 88a907718d9..915e0c2bf3c 100644 --- a/mysql-test/t/analyze_format_json.test +++ b/mysql-test/t/analyze_format_json.test @@ -212,3 +212,15 @@ GROUP BY sq ORDER BY gc; drop table t1,t2,t3; + +--echo # +--echo # MDEV-13286: Floating point exception in Filesort_tracker::print_json_members(Json_writer*) +--echo # +create table t0(a int); +insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); +create table t1 (a int, b int, c int); +insert into t1 select a,a,a from t0; +create table t2 as select * from t1; +--source include/analyze-format.inc +analyze format=json select a, (select t2.b from t2 where t2.aref_count == 1' fails in plugin_init +# +--error 1 +--exec $MYSQLD_BOOTSTRAP_CMD --myisam_recover_options=NONE + --echo End of 5.5 tests --source include/not_windows_embedded.inc diff --git a/mysql-test/t/check_constraint.test b/mysql-test/t/check_constraint.test index c70a208f774..f72ce38087e 100644 --- a/mysql-test/t/check_constraint.test +++ b/mysql-test/t/check_constraint.test @@ -79,14 +79,6 @@ insert into t1(c1) values(1); insert into t1(c1) values(2); drop table t1; -# -# MDEV-11114 Cannot drop column referenced by CHECK constraint: Unknown column 'a' in 'virtual column function' -# -create table t1 (a int, b int, check(a>0)); ---error ER_BAD_FIELD_ERROR -alter table t1 drop column a; -drop table t1; - # # MDEV-11117 CHECK constraint fails on intermediate step of ALTER # @@ -100,3 +92,14 @@ create or replace table t1( c1 int auto_increment primary key, check( c1 > 0 or create table t1 (a int check (@b in (select user from mysql.user))); --error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED create table t1 (a int check (a > @b)); + +# +# MDEV-13596 CHECK constraints disallow NULL to pass through, violating SQL +# +create table t1 (a int check (a = 1)); +insert t1 values (1); +--error ER_CONSTRAINT_FAILED +insert t1 values (2); +insert t1 values (NULL); +select * from t1; +drop table t1; diff --git a/mysql-test/t/client_xml.test b/mysql-test/t/client_xml.test index 86ca0a920ad..5230922e4b8 100644 --- a/mysql-test/t/client_xml.test +++ b/mysql-test/t/client_xml.test @@ -14,7 +14,7 @@ drop table if exists t1; # sure that basic encoding issues are handled properly create table t1 ( `a&b` int, - `ab` text ); insert into t1 values (1, 2, 'a&b ab'); diff --git a/mysql-test/t/count_distinct.test b/mysql-test/t/count_distinct.test index 10b4ac6f0e7..a00574b6cba 100644 --- a/mysql-test/t/count_distinct.test +++ b/mysql-test/t/count_distinct.test @@ -107,3 +107,19 @@ create view v1 as select * from t1; select count(distinct i) from v1; drop table t1; drop view v1; + +# +# MDEV-12136 SELECT COUNT(DISTINCT) returns the wrong value when tmp_table_size is limited +# +create table t1 (user_id char(64) character set utf8); +insert t1 values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17); +set @@tmp_table_size = 1024; +select count(distinct user_id) from t1; +alter table t1 modify user_id char(128) character set utf8; +select count(distinct user_id) from t1; +drop table t1; +set @@tmp_table_size = default; + +# +# End of 5.5 tests +# diff --git a/mysql-test/t/create_drop_event.test b/mysql-test/t/create_drop_event.test index e136798ac29..d885a39e453 100644 --- a/mysql-test/t/create_drop_event.test +++ b/mysql-test/t/create_drop_event.test @@ -10,11 +10,13 @@ CREATE OR REPLACE EVENT IF NOT EXISTS ev1 ON SCHEDULE EVERY 1 SECOND DO DROP DAT CREATE EVENT ev1 ON SCHEDULE EVERY 1 SECOND DO INSERT INTO t1 VALUES (10); SELECT EVENT_NAME, EVENT_DEFINITION FROM INFORMATION_SCHEMA.EVENTS; +--source include/count_sessions.inc SET GLOBAL event_scheduler=on; let $wait_condition= SELECT count(*)>0 FROM t1; --source include/wait_condition.inc SELECT DISTINCT a FROM t1; SET GLOBAL event_scheduler=off; +--source include/wait_until_count_sessions.inc DELETE FROM t1; --error ER_EVENT_ALREADY_EXISTS @@ -30,6 +32,7 @@ let $wait_condition= SELECT count(*)>0 FROM t1; --source include/wait_condition.inc SELECT DISTINCT a FROM t1; SET GLOBAL event_scheduler=off; +--source include/wait_until_count_sessions.inc DELETE FROM t1; DROP EVENT IF EXISTS ev1; diff --git a/mysql-test/t/cte_nonrecursive.test b/mysql-test/t/cte_nonrecursive.test index 0cc63104fa5..980bff01694 100644 --- a/mysql-test/t/cte_nonrecursive.test +++ b/mysql-test/t/cte_nonrecursive.test @@ -681,3 +681,46 @@ SELECT * FROM cte; DROP TABLE cte; DROP TABLE t; + +--echo # +--echo # MDEV-13107: SHOW TABLE STATUS, SHOW CREATE VIEW +--echo # for CTEs that use derived tables +--echo # + +create table t1(a int) engine=myisam; +insert into t1 values (3), (1), (2); +create table t2 (b int) engine=myisam; +insert into t2 values (2), (10); + +create view v1 as +with t as (select s.a from (select t1.a from t1) s), + r as(select t.a from t2, t where t2.b=t.a) + select a from r; + +create view v2 as +with t as (select s.a from (select t1.a from t1) s), + r as(select t.a from t2, t where t2.b=t.a) + select a from t1; + +--disable_result_log +show table status; +--enable_result_log + +show create view v1; +show create view v2; + +select * from v1; +select * from v2; + +prepare stmt1 from "select * from v1"; +execute stmt1; +execute stmt1; +prepare stmt2 from "select * from v2"; +execute stmt2; +execute stmt2; + +deallocate prepare stmt1; +deallocate prepare stmt2; + +drop view v1,v2; +drop table t1,t2; diff --git a/mysql-test/t/ctype_ucs.test b/mysql-test/t/ctype_ucs.test index 6745d64d11b..7a054534c85 100644 --- a/mysql-test/t/ctype_ucs.test +++ b/mysql-test/t/ctype_ucs.test @@ -928,6 +928,22 @@ SELECT CONCAT(CONVERT('pi=' USING ucs2),PI()) AS PI; SET NAMES utf8, character_set_connection=ucs2; SELECT 'a','aa'; +--echo # +--echo # MDEV-10306 Wrong results with combination of CONCAT, SUBSTR and CONVERT in subquery +--echo # + +SET NAMES utf8, character_set_connection=ucs2; +SET @save_optimizer_switch=@@optimizer_switch; +SET optimizer_switch=_utf8'derived_merge=on'; +CREATE TABLE t1 (t VARCHAR(10) CHARSET latin1); +INSERT INTO t1 VALUES('abcdefghi'); +SET NAMES utf8, character_set_connection=ucs2; +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT HEX(t) t2 FROM t1) sub; +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT TO_BASE64(t) t2 FROM t1) sub; +DROP TABLE t1; +SET optimizer_switch=@save_optimizer_switch; + + --echo # --echo # End of 10.0 tests --echo # diff --git a/mysql-test/t/ctype_utf8.test b/mysql-test/t/ctype_utf8.test index d1fe93d9251..877db3f54f6 100644 --- a/mysql-test/t/ctype_utf8.test +++ b/mysql-test/t/ctype_utf8.test @@ -1990,6 +1990,18 @@ SET @@SQL_MODE=default; #DROP FUNCTION f1; #SET NAMES utf8; +--echo # +--echo # MDEV-10191 non convertible chars convert() resulted in Null instead "?" on Windows +--echo # + +SET sql_mode='STRICT_TRANS_TABLES'; +SELECT CONVERT(_utf8 0xC499 USING latin1); +SELECT CAST(_utf8 0xC499 AS CHAR CHARACTER SET latin1); + +SET sql_mode=default; +SELECT CONVERT(_utf8 0xC499 USING latin1); +SELECT CAST(_utf8 0xC499 AS CHAR CHARACTER SET latin1); + --echo # --echo # End of 10.1 tests diff --git a/mysql-test/t/date_formats.test b/mysql-test/t/date_formats.test index 972543aefc2..3bf6fabbf6d 100644 --- a/mysql-test/t/date_formats.test +++ b/mysql-test/t/date_formats.test @@ -366,3 +366,12 @@ SET NAMES latin1; --echo # --echo # End of 5.1 tests --echo # + +# +# TIME_FORMAT and non-time format specifiers +# +select time_format('2001-01-01 02:02:02', '%d.%m.%Y'); +select time_format('2001-01-01 02:02:02', '%d %T'); +select time_format('01 02:02:02', '%d %T'); +select time_format('01 02:02:02', '%T'); +select time_format('2001-01-01 02:02:02', '%T'); diff --git a/mysql-test/t/default.test b/mysql-test/t/default.test index 84ef620de04..bfea214f548 100644 --- a/mysql-test/t/default.test +++ b/mysql-test/t/default.test @@ -2095,4 +2095,14 @@ create table t1 (col1 int default(-(default(col1)))); --error ER_DATA_OUT_OF_RANGE create table t1 (col int default (yearweek((exp(710))))); +--echo # +--echo # MDEV-13707 Server in ORACLE mode crashes on ALTER with wrong DEFAULT clause +--echo # + +CREATE OR REPLACE TABLE t1(i int); +--error ER_BAD_FIELD_ERROR +ALTER TABLE t1 ADD b CHAR(255) DEFAULT `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`; +DROP TABLE t1; + + --echo # end of 10.2 test diff --git a/mysql-test/t/derived_cond_pushdown.test b/mysql-test/t/derived_cond_pushdown.test index bc448093e33..de8a479614e 100644 --- a/mysql-test/t/derived_cond_pushdown.test +++ b/mysql-test/t/derived_cond_pushdown.test @@ -1452,3 +1452,99 @@ SELECT * FROM WHERE row <> order_number; DROP TABLE sales_documents; + +--echo # +--echo # MDEV-12845: pushdown from merged derived using equalities +--echo # + +create table t1 (a int); +insert into t1 values + (4), (8), (5), (3), (10), (2), (7); + +create table t2 (b int, c int); +insert into t2 values + (2,1), (5,2), (2,2), (4,1), (4,3), + (5,3), (2,4), (4,6), (2,1); + +create view v1 as +select b, sum(c) as s from t2 group by b; + +create view v2 as +select distinct b, c from t2; + +create view v3 as +select b, max(c) as m from t2 group by b; + +let $q1= +select b +from ( select t1.a, v1.b, v1.s from t1, v1 where t1.a = v1.b ) as t +where b > 2; + +eval $q1; +eval explain format=json $q1; + +let $q2= +select a +from ( select t1.a, v1.b, v1.s from t1, v1 where t1.a = v1.b ) as t +where a > 2; + +eval $q2; +eval explain format=json $q2; + +let $q3= +select a +from ( select t1.a, v2.b, v2.c from t1, v2 where t1.a = v2.b ) as t +where a > 2; + +eval $q3; +eval explain format=json $q3; + +let $q4= +select a +from ( select t1.a, v3.b, v3.m from t1, v3 where t1.a = v3.m ) as t +where a > 2; + +eval $q4; +eval explain format=json $q4; + +drop view v1,v2,v3; +drop table t1,t2; + +--echo # +--echo # MDEV-13166: pushdown from merged derived +--echo # + +CREATE TABLE t1 (i int) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1),(2); +CREATE VIEW v1 AS SELECT MAX(i) AS f FROM t1; + +let $q= +SELECT * FROM ( SELECT * FROM v1 ) AS sq WHERE f > 0; + +eval $q; +eval explain format=json $q; + +DROP VIEW v1; +DROP TABLE t1; + +--echo # +--echo # MDEV-13193: pushdown of equality extracted from multiple equality +--echo # + +CREATE TABLE t1 (i1 int, KEY(i1)) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1),(2); + +CREATE TABLE t2 (i2 int) ENGINE=MyISAM; +INSERT INTO t2 VALUES (2),(4); + +CREATE ALGORITHM=TEMPTABLE VIEW v2 AS SELECT * FROM t2; + +let $q= +SELECT * FROM t1, ( SELECT * FROM v2 ) AS sq + WHERE i1 = 1 AND ( i1 = i2 OR i1 = 2 ); + +eval $q; +eval explain format=json $q; + +DROP VIEW v2; +DROP TABLE t1,t2; diff --git a/mysql-test/t/derived_view.test b/mysql-test/t/derived_view.test index 3a18e9a086e..9b0cf9dca7d 100644 --- a/mysql-test/t/derived_view.test +++ b/mysql-test/t/derived_view.test @@ -1899,6 +1899,56 @@ deallocate prepare stmt1; drop table t1,t2; +--echo # +--echo # Bug mdev-12670: mergeable derived / view with subqueries +--echo # subject to semi-join optimizations +--echo # (actually this is a 5.3 bug.) +--echo # + +create table t1 (a int) engine=myisam; +insert into t1 values (5),(3),(2),(7),(2),(5),(1); +create table t2 (b int, index idx(b)) engine=myisam; +insert into t2 values (2),(3),(2),(1),(3),(4); +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +analyze table t1,t2; + +explain select a from t1 where a in (select b from t2); +explain select * from (select a from t1 where a in (select b from t2)) t; +create view v1 as select a from t1 where a in (select b from t2); +explain select * from v1; + +drop view v1; +drop table t1,t2; + +--echo # +--echo # Bug mdev-12812: mergeable derived / view with subqueries +--echo # NOT subject to semi-join optimizations +--echo # + +CREATE TABLE t1 (c1 varchar(3)) ENGINE=MyISAM; +INSERT INTO t1 VALUES ('foo'),('foo'); + +CREATE TABLE t2 (c2 varchar(3)) ENGINE=MyISAM; +INSERT INTO t2 VALUES ('bar'),('qux'),('foo'); + +let $q= +SELECT STRAIGHT_JOIN * + FROM ( SELECT * FROM t1 WHERE c1 IN ( SELECT c2 FROM t2 ) ) AS sq; + +eval $q; +eval EXPLAIN EXTENDED $q; + +DROP TABLE t1, t2; + # The following command must be the last one the file set optimizer_switch=@exit_optimizer_switch; set join_cache_level=@exit_join_cache_level; diff --git a/mysql-test/t/drop_debug.test b/mysql-test/t/drop_debug.test deleted file mode 100644 index 21069b57285..00000000000 --- a/mysql-test/t/drop_debug.test +++ /dev/null @@ -1,38 +0,0 @@ -# -# DROP-related tests which execution requires debug server. -# ---source include/have_debug.inc - -########################################################################### ---echo ---echo # -- ---echo # -- Bug#43138: DROP DATABASE failure does not clean up message list. ---echo # -- ---echo - ---disable_warnings -DROP DATABASE IF EXISTS mysql_test; ---enable_warnings - ---echo -CREATE DATABASE mysql_test; -CREATE TABLE mysql_test.t1(a INT); -CREATE TABLE mysql_test.t2(b INT); -CREATE TABLE mysql_test.t3(c INT); - ---echo -SET SESSION debug_dbug= "+d,bug43138"; - ---echo ---sorted_result -DROP DATABASE mysql_test; - ---echo -SET SESSION debug_dbug= "-d,bug43138"; - ---echo ---echo # -- ---echo # -- End of Bug#43138. ---echo # -- - -########################################################################### diff --git a/mysql-test/t/errors.test b/mysql-test/t/errors.test index 6ce6e439919..55461002fd4 100644 --- a/mysql-test/t/errors.test +++ b/mysql-test/t/errors.test @@ -1,6 +1,7 @@ # # Test some error conditions # +--source include/have_sequence.inc --disable_warnings drop table if exists t1; @@ -198,3 +199,17 @@ CREATE TABLE t1 (a CHAR(3), b BLOB); UPDATE t1 SET a = 'new' WHERE COLUMN_CREATE( 1, 'v', 1, 'w' ) IS NULL; drop table t1; + +# +# errors caused by max_session_mem_used +# +--disable_result_log +set max_session_mem_used = 50000; +--error 0,ER_OPTION_PREVENTS_STATEMENT +select * from seq_1_to_1000; +set max_session_mem_used = 8192; +--error 0,ER_OPTION_PREVENTS_STATEMENT +select * from seq_1_to_1000; +--enable_result_log +# We may not be able to execute any more queries with this connection +# because of too little memory# diff --git a/mysql-test/t/events_2.test b/mysql-test/t/events_2.test index 20f17966b29..12ce9210b0a 100644 --- a/mysql-test/t/events_2.test +++ b/mysql-test/t/events_2.test @@ -15,7 +15,7 @@ use events_test; # mysql.event intact checking end # -create event e_26 on schedule at '2027-01-01 00:00:00' disable do set @a = 5; +create event e_26 on schedule at '2037-01-01 00:00:00' disable do set @a = 5; select db, name, body, definer, convert_tz(execute_at, 'UTC', 'SYSTEM'), on_completion from mysql.event; drop event e_26; --error ER_WRONG_VALUE diff --git a/mysql-test/t/func_concat.test b/mysql-test/t/func_concat.test index e56d1121808..be573f494a2 100644 --- a/mysql-test/t/func_concat.test +++ b/mysql-test/t/func_concat.test @@ -145,3 +145,94 @@ CALL p1(); DROP PROCEDURE p1; --echo # End of 5.1 tests + + +--echo # +--echo # Start of 10.0 tests +--echo # + +--echo # +--echo # MDEV-10306 Wrong results with combination of CONCAT, SUBSTR and CONVERT in subquery +--echo # + +SET @save_optimizer_switch=@@optimizer_switch; +SET optimizer_switch='derived_merge=on'; + +CREATE TABLE t1 (t VARCHAR(10) CHARSET latin1); +INSERT INTO t1 VALUES('1234567'); +SELECT CONCAT(SUBSTR(t2, 1, 3), SUBSTR(t2, 5)) c1, + CONCAT(SUBSTR(t2,1,3),'---',SUBSTR(t2,5)) c2 + FROM (SELECT CONVERT(t USING latin1) t2 FROM t1) sub; +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT CONVERT(t USING latin1) t2 FROM t1) sub; +DROP TABLE t1; + +# Other functions affected by MDEV-10306 + +CREATE TABLE t1 (t VARCHAR(10) CHARSET latin1); +INSERT INTO t1 VALUES('1234567'); +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT CONVERT(t USING latin1) t2 FROM t1) sub; +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT REVERSE(t) t2 FROM t1) sub; +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT SOUNDEX(t) t2 FROM t1) sub; +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT TO_BASE64(t) t2 FROM t1) sub; +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT WEIGHT_STRING(t) t2 FROM t1) sub; +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT HEX(t) t2 FROM t1) sub; +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT QUOTE(t) t2 FROM t1) sub; +DROP TABLE t1; + +CREATE TABLE t1 (t VARCHAR(32) CHARSET latin1); +INSERT INTO t1 VALUES(TO_BASE64('abcdefghi')); +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT FROM_BASE64(t) t2 FROM t1) sub; +DROP TABLE t1; + +CREATE TABLE t1 (t VARCHAR(32) CHARSET latin1); +INSERT INTO t1 VALUES(HEX('abcdefghi')); +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UNHEX(t) t2 FROM t1) sub; +DROP TABLE t1; + +CREATE TABLE t1 (t VARCHAR(30) CHARSET latin1); +INSERT INTO t1 VALUES('test'); +SELECT LENGTH(CONCAT(t2)) c2 FROM (SELECT AES_ENCRYPT(t,'x') t2 FROM t1) sub; +SELECT LENGTH(CONCAT(t2,'-',t2)) c2 FROM (SELECT AES_ENCRYPT(t,'x') t2 FROM t1) sub; +SELECT LENGTH(CONCAT(t2,'--',t2)) c2 FROM (SELECT AES_ENCRYPT(t,'x') t2 FROM t1) sub; +SELECT LENGTH(CONCAT(t2)) c2 FROM (SELECT AES_DECRYPT(AES_ENCRYPT(t,'x'),'x') t2 FROM t1) sub; +SELECT LENGTH(CONCAT(t2,'-',t2)) c2 FROM (SELECT AES_DECRYPT(AES_ENCRYPT(t,'x'),'x') t2 FROM t1) sub; +SELECT LENGTH(CONCAT(t2,'--',t2)) c2 FROM (SELECT AES_DECRYPT(AES_ENCRYPT(t,'x'),'x') t2 FROM t1) sub; +DROP TABLE t1; + + +# Functions not affected by MDEV-10306 +# They only had an unused tmp_value, which was removed. + +CREATE TABLE t1 (t VARCHAR(64) CHARSET latin1); +INSERT INTO t1 VALUES('123456789'); +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT MD5(t) t2 FROM t1) sub; +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT FORMAT(t,2) t2 FROM t1) sub; +DROP TABLE t1; + +# Functions not affected by MDEV-10306 +# They already use tmp_value only for internal purposes and +# return the result in the String passed to val_str() + +CREATE TABLE t1 (t VARCHAR(32) CHARSET latin1); +INSERT INTO t1 VALUES('abcdefghi'); +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT INSERT(t,3,4,'xxx') t2 FROM t1) sub; +DROP TABLE t1; + + +# Functions not affected by MDEV-10306 +# They use this code style: +# String *res= args[0]->val_str(str); +# tmp_value.set(*res, start, end); +# return &tmp_value; + +CREATE TABLE t1 (t VARCHAR(10) CHARSET latin1); +INSERT INTO t1 VALUES('abcdefghi'); +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LEFT(t,10) t2 FROM t1) sub; +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT RIGHT(t,10) t2 FROM t1) sub; +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT SUBSTR(t,1,10) t2 FROM t1) sub; +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LTRIM(t) t2 FROM t1) sub; +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT RTRIM(t) t2 FROM t1) sub; +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT TRIM(t) t2 FROM t1) sub; +DROP TABLE t1; + +SET optimizer_switch=@save_optimizer_switch; diff --git a/mysql-test/t/func_crypt.test b/mysql-test/t/func_crypt.test index ab5be573932..d091aa4ae86 100644 --- a/mysql-test/t/func_crypt.test +++ b/mysql-test/t/func_crypt.test @@ -70,6 +70,28 @@ SELECT OLD_PASSWORD(c1), PASSWORD(c1) FROM t1; DROP TABLE t1; --echo # End of 5.0 tests +--echo # +--echo # Start of 10.0 tests +--echo # + +--echo # +--echo # MDEV-10306 Wrong results with combination of CONCAT, SUBSTR and CONVERT in subquery +--echo # + +SET @save_optimizer_switch=@@optimizer_switch; +SET optimizer_switch='derived_merge=on'; +# ENCRYPT() is not affected by MDEV-10306 +# It already uses tmp_value only for internal purposes and +# returns the result in the String passed to val_str() +CREATE TABLE t1 (t VARCHAR(32) CHARSET latin1); +INSERT INTO t1 VALUES('abcdefghi'); +SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT ENCRYPT(t,'aa') t2 FROM t1) sub; +DROP TABLE t1; +SET optimizer_switch=@save_optimizer_switch; + +--echo # +--echo # End of 10.0 tests +--echo # --echo # --echo # Start of 10.1 tests diff --git a/mysql-test/t/func_group.test b/mysql-test/t/func_group.test index 1e75099a1fe..8bbc9e6a040 100644 --- a/mysql-test/t/func_group.test +++ b/mysql-test/t/func_group.test @@ -1691,3 +1691,16 @@ DROP TABLE t1; --echo # --echo # End of 10.1 tests --echo # + +--echo # +--echo # MDEV-13064: assertion `n < m_size' fails in Item::split_sum_func2() +--echo # + +create table t1 (i int) engine=MyISAM; +insert into t1 value (1),(2); + +select count(*)+sleep(0) from t1; + +drop table t1; + + diff --git a/mysql-test/t/func_json.test b/mysql-test/t/func_json.test index 72b8681ac44..c660cb14856 100644 --- a/mysql-test/t/func_json.test +++ b/mysql-test/t/func_json.test @@ -138,6 +138,11 @@ select json_keys('{"a":{"c":1, "d":2}, "b":2}'); select json_keys('{"a":{"c":1, "d":2}, "b":2}', "$.a"); select json_keys('{"a":{"c":1, "d":2}, "b":2}', "$.b"); select json_keys('foo'); +# +# mdev-12789 JSON_KEYS returns duplicate keys twice +# +select json_keys('{"a":{"c":1, "d":2}, "b":2, "c":1, "a":3, "b":1, "c":2}'); +select json_keys('{"c1": "value 1", "c1": "value 2"}'); SET @j = '["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]'; select json_search(@j, 'one', 'abc'); @@ -274,3 +279,84 @@ insert into t1 values ('{"a":1,"b":2,"c":3}','$.c'); select j, p, json_remove(j, p) from t1; drop table t1; + +# +# MDEV-12364 Server crashes in __memcpy_sse2_unaligned / String::copy on JSON_SEARCH with variables. +# +SET @str = 'bar', @path = '$'; +SELECT JSON_SEARCH('{"foo":"bar"}', 'all' , @str, '%', @path); + +# +# MDEV-12351 Assertion `cur_step->type & JSON_PATH_KEY' failed in json_find_path. +# + +SELECT JSON_VALUE('[{"foo": 1},"bar"]', '$[*][0]'); + +# +# MDEV-12363 Assertion `0' failed in Type_handler_string_result::make_sort_key(uchar*, Item*, const SORT_FIELD_ATTR*, Sort_param*) +# + +CREATE TABLE t1 (f INT NOT NULL); +INSERT INTO t1 VALUES (0); +SELECT JSON_KEYS(f) FROM t1 ORDER BY 1; +DROP TABLE t1; + +# +# MDEV-12324 Wrong result (phantom array value) on JSON_EXTRACT. +# +SELECT JSON_EXTRACT( '{"foo":"bar"}', '$[*].*' ); +SELECT JSON_EXTRACT( '{"foo":"bar"}', '$[*]' ); + +# +# MDEV-12604 Comparison of JSON_EXTRACT result differs with Mysql. +# + +select JSON_EXTRACT('{"name":"value"}', '$.name') = 'value'; +select JSON_EXTRACT('{\"asdf\":true}', "$.\"asdf\"") = true; +select JSON_EXTRACT('{\"asdf\":true}', "$.\"asdf\"") = false; +select JSON_EXTRACT('{\"asdf\":true}', "$.\"asdf\"") = 1; +select JSON_EXTRACT('{\"input1\":\"\\u00f6\"}', '$.\"input1\"'); + +# +# MDEV-129892 JSON_EXTRACT returns data for invalid JSON +# +select JSON_EXTRACT('{"foo": "bar" foobar foo invalid ', '$.foo'); + +# +# MDEV-13138 JSON_OBJECT returns null with strings containing backticks. +# +SELECT JSON_OBJECT('foo', '`'); +SELECT JSON_OBJECT("foo", "bar`bar"); + +# +# MDEV-13324 JSON_SET returns NULL instead of object. +# +SELECT JSON_SET('{}', '$.age', 87); + +# +# MDEV-13104 Json functions. +# +SELECT JSON_MERGE('[]', '{"c":"d"}'); + +# +# MDEV-12774 JSON_EXTRACT fails with some escaped unicode as key. +# + +SET @str = "{\"\\u00e4\\u00f6\":\"yes\"}"; +SET @path = "$.\"\\u00e4\\u00f6\""; +select @str, @path, JSON_EXTRACT(@str, @path); +SET @str = "{\"\\u00e4\":\"yes\"}"; +SET @path = "$.\"\\u00e4\""; +select @str, @path, JSON_EXTRACT(@str, @path); + +# +# MDEV-12877 Wrong result from JSON native function. +# +select json_array(5,json_query('[1,2]','$')); + +# +# MDEV-13633 JSON_ARRAY() - bad output with some UTF8 characters. +# + +SELECT JSON_ARRAY('1. Ä› 2. Å¡ 3. Ä 4. Å™ 5. ž 6. ý 7. á 8. í 9. é 10. ů 11. ú') AS json_data; +SELECT JSON_OBJECT("user","Jožko MrkviÄká") as json_data; diff --git a/mysql-test/t/func_math.test b/mysql-test/t/func_math.test index f1db36d605f..0b819278a44 100644 --- a/mysql-test/t/func_math.test +++ b/mysql-test/t/func_math.test @@ -608,3 +608,8 @@ select 0=0, 0=-0, 0.0= -0.0, 0.0 = -(0.0), 0.0E1=-0.0E1, 0.0E1=-(0.0E1); --echo # select CRC32(NULL), CRC32(''), CRC32('MySQL'), CRC32('mysql'), CRC32('01234567'), CRC32('012345678'); + +# +# MDEV-13673 Bad result in view +# +explain extended select (3-2)+1, (3/2)*1, 3-(2+1), 3/(2*1); diff --git a/mysql-test/t/func_regexp_pcre.test b/mysql-test/t/func_regexp_pcre.test index 26294ce2e24..d77467b559b 100644 --- a/mysql-test/t/func_regexp_pcre.test +++ b/mysql-test/t/func_regexp_pcre.test @@ -428,3 +428,38 @@ SELECT 0xE001 REGEXP @regCheck; SET NAMES latin1; SET @regCheck= '\\xE0\\x01'; SELECT CAST(0xE001 AS BINARY) REGEXP @regCheck; + +--echo # MDEV-12420: Testing recursion overflow +--replace_regex /[0-9]+ exceeded/NUM exceeded/ +SELECT 1 FROM dual WHERE ('Alpha,Bravo,Charlie,Delta,Echo,Foxtrot,StrataCentral,Golf,Hotel,India,Juliet,Kilo,Lima,Mike,StrataL3,November,Oscar,StrataL2,Sand,P3,P4SwitchTest,Arsys,Poppa,ExtensionMgr,Arp,Quebec,Romeo,StrataApiV2,PtReyes,Sierra,SandAcl,Arrow,Artools,BridgeTest,Tango,SandT,PAlaska,Namespace,Agent,Qos,PatchPanel,ProjectReport,Ark,Gimp,Agent,SliceAgent,Arnet,Bgp,Ale,Tommy,Central,AsicPktTestLib,Hsc,SandL3,Abuild,Pca9555,Standby,ControllerDut,CalSys,SandLib,Sb820,PointV2,BfnLib,Evpn,BfnSdk,Sflow,ManagementActive,AutoTest,GatedTest,Bgp,Sand,xinetd,BfnAgentLib,bf-utils,Hello,BfnState,Eos,Artest,Qos,Scd,ThermoMgr,Uniform,EosUtils,Eb,FanController,Central,BfnL3,BfnL2,tcp_wrappers,Victor,Environment,Route,Failover,Whiskey,Xray,Gimp,BfnFixed,Strata,SoCal,XApi,Msrp,XpProfile,tcpdump,PatchPanel,ArosTest,FhTest,Arbus,XpAcl,MacConc,XpApi,telnet,QosTest,Alpha2,BfnVlan,Stp,VxlanControllerTest,MplsAgent,Bravo2,Lanz,BfnMbb,Intf,XCtrl,Unicast,SandTunnel,L3Unicast,Ipsec,MplsTest,Rsvp,EthIntf,StageMgr,Sol,MplsUtils,Nat,Ira,P4NamespaceDut,Counters,Charlie2,Aqlc,Mlag,Power,OpenFlow,Lag,RestApi,BfdTest,strongs,Sfa,CEosUtils,Adt746,MaintenanceMode,MlagDut,EosImage,IpEth,MultiProtocol,Launcher,Max3179,Snmp,Acl,IpEthTest,PhyEee,bf-syslibs,tacc,XpL2,p4-ar-switch,p4-bf-switch,LdpTest,BfnPhy,Mirroring,Phy6,Ptp' REGEXP '^((?!\b(Strata|StrataApi|StrataApiV2)\b).)*$'); + +# +# MDEV-13173 An RLIKE that previously worked on 10.0 now returns "Got error 'pcre_exec: recursion limit of 100 exceeded' from regexp" +# +SELECT CONCAT(REPEAT('100,',133),'101') RLIKE '^(([1-9][0-9]*),)*[1-9][0-9]*$'; +--replace_regex /[0-9]+ exceeded/NUM exceeded/ +SELECT CONCAT(REPEAT('100,',200),'101') RLIKE '^(([1-9][0-9]*),)*[1-9][0-9]*$'; + +SELECT REGEXP_INSTR(CONCAT(REPEAT('100,',133),'101'), '^(([1-9][0-9]*),)*[1-9][0-9]*$'); +--replace_regex /[0-9]+ exceeded/NUM exceeded/ +SELECT REGEXP_INSTR(CONCAT(REPEAT('100,',200),'101'), '^(([1-9][0-9]*),)*[1-9][0-9]*$'); + +SELECT LENGTH(REGEXP_SUBSTR(CONCAT(REPEAT('100,',133),'101'), '^(([1-9][0-9]*),)*[1-9][0-9]*$')); +--replace_regex /[0-9]+ exceeded/NUM exceeded/ +SELECT LENGTH(REGEXP_SUBSTR(CONCAT(REPEAT('100,',200),'101'), '^(([1-9][0-9]*),)*[1-9][0-9]*$')); + +SELECT LENGTH(REGEXP_REPLACE(CONCAT(REPEAT('100,',133),'101'), '^(([1-9][0-9]*),)*[1-9][0-9]*$', '')); +--replace_regex /[0-9]+ exceeded/NUM exceeded/ +SELECT LENGTH(REGEXP_REPLACE(CONCAT(REPEAT('100,',200),'101'), '^(([1-9][0-9]*),)*[1-9][0-9]*$', '')); + +# +# MDEV-12942 REGEXP_INSTR returns 1 when using brackets +# +SELECT REGEXP_INSTR('a_kollision', 'oll'); +SELECT REGEXP_INSTR('a_kollision', '(oll)'); +SELECT REGEXP_INSTR('a_kollision', 'o([lm])\\1'); + +# +# MDEV-12939 A query crashes MariaDB in Item_func_regex::cleanup +# +SELECT a FROM (SELECT "aa" a) t WHERE a REGEXP '[0-9]'; diff --git a/mysql-test/t/gis-json.test b/mysql-test/t/gis-json.test index 645c21bf011..5e695fbca9c 100644 --- a/mysql-test/t/gis-json.test +++ b/mysql-test/t/gis-json.test @@ -23,6 +23,23 @@ SELECT st_astext(st_geomfromgeojson('{"type""point"}')); SELECT st_astext(st_geomfromgeojson('{ "type": "Feature", "geometry": { "type": "Point", "coordinates": [102.0, 0.5] } }')); SELECT st_astext(st_geomfromgeojson('{ "type": "FeatureCollection", "features": [{ "type": "Feature", "geometry": { "type": "Point", "coordinates": [102.0, 0.5] }, "properties": { "prop0": "value0" } }]}')); +--error ER_WRONG_VALUE_FOR_TYPE +SELECT ST_AsText(ST_GeomFromGeoJSON('{ "type": "Point", "coordinates": [5.3, 15.0, 4.3]}',5)); + +--error ER_GIS_INVALID_DATA +SELECT ST_AsText(ST_GeomFromGeoJSON('{ "type": "Point", "coordinates": [5.3, 15.0, 4.3]}',1)); + +SELECT ST_AsText(ST_GeomFromGeoJSON('{ "type": "Point", "coordinates": [5.3, 15.0, 4.3]}',2)); +SELECT ST_AsText(ST_GeomFromGeoJSON('{ "type": "Point", "coordinates": [5.3, 15.0, 4.3]}',3)); +SELECT ST_AsText(ST_GeomFromGeoJSON('{ "type": "Point", "coordinates": [5.3, 15.0, 4.3]}',4)); + +SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(5.363 7.266)'),2); +SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(5.363 7.266)'),1); +SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(5.363 7.266)'),10); + +SELECT ST_AsGeoJSON(ST_GeomFromText("POINT(10 11)"), 100, 1); +SELECT ST_AsGeoJSON(ST_GeomFromText("POINT(10 11)"), 100, 5); + --echo # --echo # End of 10.2 tests --echo # diff --git a/mysql-test/t/gis.test b/mysql-test/t/gis.test index 3bb0044c7fb..264f8d142a7 100644 --- a/mysql-test/t/gis.test +++ b/mysql-test/t/gis.test @@ -351,15 +351,15 @@ insert into t1 values ('85984',GeomFromText('MULTIPOLYGON(((-115.006363 36.248666,-115.263639 36.247466,-115.263839 36.252766,-115.261439 36.252666,-115.261439 36.247366,-115.247239 36.247066)))')); -# Expected result is 115.31877315203187, but IA64 returns 115.31877315203188 -# due to fused multiply-add instructions. ---replace_result 115.31877315203188 115.31877315203187 +# Expected results are 115.2970604672862 and 36.23335610879993, but IA64 returns +# slightly different values due to fused multiply-add instructions. +--replace_result 115.29706047613604 115.2970604672862 36.23335611157958 36.23335610879993 select object_id, geometrytype(geo), ISSIMPLE(GEO), ASTEXT(centroid(geo)) from t1 where object_id=85998; -# Expected result is 36.3310176346905, but IA64 returns 36.3310176346904 +# Expected result is 36.34725218253213, but IA64 returns 36.34725217627852 # due to fused multiply-add instructions. ---replace_result 36.3310176346904 36.3310176346905 -114.87787186923326 -114.87787186923313 36.33101763469053 36.33101763469059 36.33101763469043 36.33101763469059 +--replace_result 36.34725217627852 36.34725218253213 -114.86854470090232 -114.86854472054372 select object_id, geometrytype(geo), ISSIMPLE(GEO), ASTEXT(centroid(geo)) from t1 where object_id=85984; @@ -1453,7 +1453,35 @@ SHOW CREATE VIEW v1; SELECT ASTEXT(p) FROM v1; DROP VIEW v1; ---echo End of 5.5 tests +# --echo End of 5.5 tests + +--echo # +--echo # Start of 10.0 tests +--echo # + +--echo # +--echo # MDEV-12495 Conditional jump depends on uninitialised value for: SELECT NULL UNION geom_expression +--echo # +SELECT AsText(g) FROM (SELECT NULL AS g UNION SELECT Point(1,1)) AS t1; + +--echo # +--echo # MDEV-10306 Wrong results with combination of CONCAT, SUBSTR and CONVERT in subquery +--echo # + +SET @save_optimizer_switch=@@optimizer_switch; +SET optimizer_switch='derived_merge=on'; +CREATE TABLE t1 (x INT, y INT); +INSERT INTO t1 VALUES(0,0); +SELECT LENGTH(t2) c2 FROM (SELECT ST_BUFFER(POINT(x,y), 0) t2 FROM t1) sub; +SELECT LENGTH(CONCAT(t2,'-',t2)) c2 FROM (SELECT ST_BUFFER(POINT(x,y), 0) t2 FROM t1) sub; +SELECT LENGTH(CONCAT(t2,'--',t2)) c2 FROM (SELECT ST_BUFFER(POINT(x,y), 0) t2 FROM t1) sub; +DROP TABLE t1; +SET optimizer_switch=@save_optimizer_switch; + + +--echo # +--echo # End 10.0 tests +--echo # SHOW CREATE TABLE information_schema.geometry_columns; SHOW CREATE TABLE information_schema.spatial_ref_sys; diff --git a/mysql-test/t/group_by.test b/mysql-test/t/group_by.test index acb33c2c115..a2df97949d8 100644 --- a/mysql-test/t/group_by.test +++ b/mysql-test/t/group_by.test @@ -1751,6 +1751,44 @@ select a as x from t1 group by x having x > 1; select a from t1 group by a having a > 1; drop table t1; set sql_mode= @save_sql_mode; + +# +# MDEV-7826 Server crashes in Item_subselect::enumerate_field_refs_processor +# +create table t1 (f1 int); +insert into t1 values (5),(9); +create table t2 (f2 int); +insert into t2 values (0),(6); +create table t3 (f3 int); +insert into t3 values (6),(3); +create table t4 (f4 int); +insert into t4 values (1),(0); +--error ER_ILLEGAL_REFERENCE +select +(select min(f1) from t1 where f1 in (select min(f4) from t2)) as field7, +(select count(*) from t3 where f3 in (select max(f4) from t2 group by field7)) +from t4; +drop table t1, t2, t3, t4; + +# +# MDEV-13180 Unused left join causes server crash +# +create table t1 (i1 int); +insert into t1 values (1); +create table t2 (i int); +insert into t2 values (2); +select 1 from t1 left join t2 b on b.i = (select max(b.i) from t2); +drop table t1, t2; + + +# +# MDEV-12489 The select stmt may fail due to "having clause is ambiguous" unexpected +# +create table t1 (c1 int, c2 int); +create table t2 (c1 int, c2 int); +select t1.c1 as c1, t2.c2 as c1 from t1, t2 where t1.c1 < 20 and t2.c2 > 5 group by t1.c1, t2.c2 having t1.c1 < 3; +drop table t1, t2; + # # End of MariaDB 5.5 tests # diff --git a/mysql-test/t/innodb_ext_key.test b/mysql-test/t/innodb_ext_key.test index bf94b7dd3d5..a721943e8bc 100644 --- a/mysql-test/t/innodb_ext_key.test +++ b/mysql-test/t/innodb_ext_key.test @@ -778,5 +778,46 @@ where index_date_updated= 10 and index_id < 800; drop table t0,t1,t2; -set optimizer_switch=@save_ext_key_optimizer_switch; -SET SESSION STORAGE_ENGINE=DEFAULT; + +--echo # +--echo # MDEV-11196: Error:Run-Time Check Failure #2 - Stack around the variable 'key_buff' +--echo # was corrupted, server crashes in opt_sum_query + +CREATE TABLE t1 ( + pk INT, + f1 VARCHAR(3), + f2 VARCHAR(1024), + PRIMARY KEY (pk), + KEY(f2) +) ENGINE=InnoDB CHARSET utf8 ROW_FORMAT= DYNAMIC; + +INSERT INTO t1 VALUES (1,'foo','abc'),(2,'bar','def'); +SELECT MAX(t2.pk) FROM t1 t2 INNER JOIN t1 t3 ON t2.f1 = t3.f1 WHERE t2.pk <= 4; +drop table t1; + +CREATE TABLE t1 ( + pk1 INT, + pk2 INT, + f1 VARCHAR(3), + f2 VARCHAR(1021), + PRIMARY KEY (pk1,pk2), + KEY(f2) +) ENGINE=InnoDB CHARSET utf8 ROW_FORMAT= DYNAMIC; + +INSERT INTO t1 VALUES (1,2,'2','abc'),(2,3,'3','def'); +explain format= json +select * from t1 force index(f2) where pk1 <= 5 and pk2 <=5 and f2 = 'abc' and f1 <= '3'; +drop table t1; + +CREATE TABLE t1 ( +f2 INT, +pk2 INT, +f1 VARCHAR(3), +pk1 VARCHAR(1000), +PRIMARY KEY (pk1,pk2), +KEY k1(pk1,f2) +) ENGINE=InnoDB CHARSET utf8 ROW_FORMAT= DYNAMIC; +INSERT INTO t1 VALUES (1,2,'2','abc'),(2,3,'3','def'); +explain format= json +select * from t1 force index(k1) where f2 <= 5 and pk2 <=5 and pk1 = 'abc' and f1 <= '3'; +drop table t1; diff --git a/mysql-test/t/join_cache.test b/mysql-test/t/join_cache.test index 009e72c1c14..611f5ab8942 100644 --- a/mysql-test/t/join_cache.test +++ b/mysql-test/t/join_cache.test @@ -3900,6 +3900,18 @@ SELECT * FROM INFORMATION_SCHEMA.PROFILING, mysql.user WHERE password_expired = set join_cache_level=default; +# +# MDEV-12580 Wrong query result in join when using an index (Version > "10.2.3") +# +create table t1 (c1 date not null, key (c1)) engine=innodb; +insert t1 values ('2017-12-27'); +create table t2 (pk int, f1 int, f2 int); +insert t2 values (4,1,1), (6,1,1); +set join_buffer_size = 222222208; +select f2 from t2,t1 where f2 = 0; +drop table t1, t2; +set join_buffer_size = default; + # The following command must be the last one the file # this must be the last command in the file set @@optimizer_switch=@save_optimizer_switch; diff --git a/mysql-test/t/join_outer.test b/mysql-test/t/join_outer.test index a3a1278ef1e..88861511d79 100644 --- a/mysql-test/t/join_outer.test +++ b/mysql-test/t/join_outer.test @@ -1882,4 +1882,86 @@ WHERE v3 = 4; drop table t1,t2,t3; +--echo # +--echo # MDEV-11958: LEFT JOIN with stored routine produces incorrect result +--echo # + +CREATE TABLE t (x INT); +INSERT INTO t VALUES(1),(NULL); +CREATE FUNCTION f (val INT, ret INT) RETURNS INT DETERMINISTIC RETURN IFNULL(val, ret); + +SELECT t1.x, t2.x, IFNULL(t2.x,0), f(t2.x,0) + FROM t t1 LEFT JOIN t t2 + ON t1.x = t2.x + WHERE IFNULL(t2.x,0)=0; +explain extended +SELECT t1.x, t2.x, IFNULL(t2.x,0), f(t2.x,0) + FROM t t1 LEFT JOIN t t2 + ON t1.x = t2.x + WHERE IFNULL(t2.x,0)=0; +SELECT t1.x, t2.x, IFNULL(t2.x,0), f(t2.x,0) + FROM t t1 LEFT JOIN t t2 + ON t1.x = t2.x + WHERE f(t2.x,0)=0; +explain extended +SELECT t1.x, t2.x, IFNULL(t2.x,0), f(t2.x,0) + FROM t t1 LEFT JOIN t t2 + ON t1.x = t2.x + WHERE f(t2.x,0)=0; + +drop function f; +drop table t; +CREATE TABLE t1 ( + col1 DECIMAL(33,5) NULL DEFAULT NULL, + col2 DECIMAL(33,5) NULL DEFAULT NULL +); + +CREATE TABLE t2 ( + col1 DECIMAL(33,5) NULL DEFAULT NULL, + col2 DECIMAL(33,5) NULL DEFAULT NULL, + col3 DECIMAL(33,5) NULL DEFAULT NULL +); + +INSERT INTO t1 VALUES (2, 1.1), (2, 2.1); +INSERT INTO t2 VALUES (3, 3.1, 4), (1, 1, NULL); + +DELIMITER |; + +CREATE FUNCTION f1 ( p_num DECIMAL(45,15), p_return DECIMAL(45,15)) +RETURNS decimal(33,5) +LANGUAGE SQL +DETERMINISTIC +CONTAINS SQL +SQL SECURITY INVOKER +BEGIN + IF p_num IS NULL THEN + RETURN p_return; + ELSE + RETURN p_num; + END IF; +END | + +DELIMITER ;| + +let $q1= +SELECT t1.col1, t2.col1, t2.col3 +FROM t1 LEFT OUTER JOIN t2 ON t1.col1 = t2.col2 +WHERE IFNULL(t2.col3,0) = 0; + +eval $q1; +eval EXPLAIN EXTENDED $q1; + +let $q2= +SELECT t1.col1, t2.col1, t2.col3 +FROM t1 LEFT OUTER JOIN t2 ON t1.col1 = t2.col2 +WHERE f1(t2.col3,0) = 0; +eval $q2; +eval EXPLAIN EXTENDED $q2; + +DROP FUNCTION f1; + +DROP TABLE t1,t2; + +--echo # end of 5.5 tests + SET optimizer_switch=@save_optimizer_switch; diff --git a/mysql-test/t/limit_rows_examined.test b/mysql-test/t/limit_rows_examined.test index 29b3b411602..815394aec5c 100644 --- a/mysql-test/t/limit_rows_examined.test +++ b/mysql-test/t/limit_rows_examined.test @@ -489,7 +489,6 @@ GROUP BY field1, field2, field3, field4, field5 LIMIT ROWS EXAMINED 120; FLUSH STATUS; ---error 1028 SELECT a AS field1, alias2.d AS field2, alias2.f AS field3, alias2.e AS field4, b AS field5 FROM t1, t2 AS alias2, t2 AS alias3 WHERE alias3.c IN ( SELECT 1 UNION SELECT 6 ) diff --git a/mysql-test/t/loaddata.test b/mysql-test/t/loaddata.test index 88c4a363a57..4e355e5c3a7 100644 --- a/mysql-test/t/loaddata.test +++ b/mysql-test/t/loaddata.test @@ -294,7 +294,7 @@ SELECT * FROM v2; DELETE FROM t1; --echo ---error ER_LOAD_DATA_INVALID_COLUMN +--error ER_NONUPDATEABLE_COLUMN LOAD DATA INFILE '../../std_data/bug35469.dat' INTO TABLE v2 FIELDS ESCAPED BY '\\' TERMINATED BY ',' diff --git a/mysql-test/t/loadxml.test b/mysql-test/t/loadxml.test index 93e6e82189f..0bd97a81649 100644 --- a/mysql-test/t/loadxml.test +++ b/mysql-test/t/loadxml.test @@ -130,3 +130,16 @@ CREATE TABLE t1 (col1 VARCHAR(3), col2 VARCHAR(3), col3 INTEGER); LOAD XML INFILE '../../std_data/bug16171518_2.dat' INTO TABLE t1; SELECT * FROM t1 ORDER BY col1, col2, col3; DROP TABLE t1; + +--echo # +--echo # MDEV-12696 Crash with LOAD XML and non-updatable VIEW column +--echo # + +CREATE TABLE t1 (c1 TEXT); +CREATE VIEW v1 AS SELECT CONCAT(c1,'') AS c1, NULL AS c2 FROM t1; +--error ER_NONUPDATEABLE_COLUMN +LOAD XML INFILE '../../std_data/loaddata/mdev12696.xml' INTO TABLE v1 (c1); +--error ER_NONUPDATEABLE_COLUMN +LOAD XML INFILE '../../std_data/loaddata/mdev12696.xml' INTO TABLE v1 (c2); +DROP VIEW v1; +DROP TABLE t1; diff --git a/mysql-test/t/locale.test b/mysql-test/t/locale.test index b1fbc40f0c8..4570b968ecf 100644 --- a/mysql-test/t/locale.test +++ b/mysql-test/t/locale.test @@ -134,7 +134,22 @@ SELECT * FROM non_existent; SET lc_time_names=@old_50915_lc_time_names; +--echo # +--echo # End of 10.0 tests +--echo # --echo # ---echo # End of 5.6 tests +--echo # End of 10.1 tests +--echo # + +# Item::print +create view v1 as select + format(123456789,2) as b, + format(123456789,2,'rm_CH') as b1; +select * from v1; +show create view v1; +drop view v1; + +--echo # +--echo # End of 10.2 tests --echo # diff --git a/mysql-test/t/log_tables-big-master.opt b/mysql-test/t/log_tables-big-master.opt index b9bc885d0e4..0cdf12d284b 100644 --- a/mysql-test/t/log_tables-big-master.opt +++ b/mysql-test/t/log_tables-big-master.opt @@ -1 +1 @@ ---log-output=table,file --slow-query-log --general-log --general-log-file="" --slow-query-log-file="" +--slow-query-log --general-log --general-log-file="" --slow-query-log-file="" diff --git a/mysql-test/t/log_tables-big.test b/mysql-test/t/log_tables-big.test index 8c956fa6f55..8936a163d73 100644 --- a/mysql-test/t/log_tables-big.test +++ b/mysql-test/t/log_tables-big.test @@ -7,6 +7,8 @@ # check that CSV engine was compiled in --source include/have_csv.inc +set @@global.log_output = 'TABLE'; + connect (con1,localhost,root,,); connect (con2,localhost,root,,); @@ -18,18 +20,20 @@ set session long_query_time=10; select get_lock('bug27638', 1); connection con2; set session long_query_time=1; -truncate table mysql.slow_log; select get_lock('bug27638', 2); -select if (query_time between '00:00:01' and '00:00:10', 'OK', 'WRONG') as qt, sql_text from mysql.slow_log; -truncate table mysql.slow_log; +select if (query_time >= '00:00:01', 'OK', 'WRONG') as qt, sql_text from mysql.slow_log + where sql_text = 'select get_lock(\'bug27638\', 2)'; select get_lock('bug27638', 60); -select if (query_time between '00:00:59' and '00:01:10', 'OK', 'WRONG') as qt, sql_text from mysql.slow_log; -truncate table mysql.slow_log; +select if (query_time >= '00:00:59', 'OK', 'WRONG') as qt, sql_text from mysql.slow_log + where sql_text = 'select get_lock(\'bug27638\', 60)'; select get_lock('bug27638', 101); -select if (query_time between '00:01:40' and '00:01:50', 'OK', 'WRONG') as qt, sql_text from mysql.slow_log; +select if (query_time >= '00:01:40', 'OK', 'WRONG') as qt, sql_text from mysql.slow_log + where sql_text = 'select get_lock(\'bug27638\', 101)'; connection con1; select release_lock('bug27638'); connection default; disconnect con1; disconnect con2; + +set @@global.log_output=default; diff --git a/mysql-test/t/mdl.test b/mysql-test/t/mdl.test new file mode 100644 index 00000000000..b90c74a8f7f --- /dev/null +++ b/mysql-test/t/mdl.test @@ -0,0 +1,19 @@ +--source include/have_metadata_lock_info.inc +--source include/have_innodb.inc + +--echo # +--echo # MDEV-12882 - Assertion `mdl_ticket->m_type == MDL_SHARED_UPGRADABLE || +--echo # mdl_ticket->m_type == MDL_SHARED_NO_WRITE || +--echo # mdl_ticket->m_type == MDL_SHARED_NO_READ_WRITE || +--echo # mdl_ticket->m_type == MDL_SHARED_READ' +--echo # failed in MDL_context::upgrade_shared_lock +--echo # + +CREATE TABLE t1(a INT) ENGINE=InnoDB; +LOCK TABLES t1 WRITE CONCURRENT, t1 AS t2 READ; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info; +UNLOCK TABLES; +LOCK TABLES t1 AS t2 READ, t1 WRITE CONCURRENT; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info; +UNLOCK TABLES; +DROP TABLE t1; diff --git a/mysql-test/t/mdl_sync.test b/mysql-test/t/mdl_sync.test index 4aa191d3dfc..fbecd6bf547 100644 --- a/mysql-test/t/mdl_sync.test +++ b/mysql-test/t/mdl_sync.test @@ -4075,6 +4075,30 @@ disconnect con2; disconnect con3; +--echo # +--echo # MDEV-12620 - set lock_wait_timeout = 1;flush tables with read lock; +--echo # lock not released after timeout +--echo # +CREATE TABLE t1(a INT) ENGINE=InnoDB; +SET debug_sync='open_tables_after_open_and_process_table SIGNAL ready WAIT_FOR go'; +send SELECT * FROM t1; + +connect (con1,localhost,root,,); +SET debug_sync='now WAIT_FOR ready'; +# lock_wait_timeout should be 0 in 10.3, so that we don't have to wait at all +SET lock_wait_timeout=1; +--error ER_LOCK_WAIT_TIMEOUT +FLUSH TABLES WITH READ LOCK; +SET debug_sync='now SIGNAL go'; + +connection default; +reap; +SET debug_sync='RESET'; +DROP TABLE t1; + +disconnect con1; + + # Check that all connections opened by test cases in this file are really # gone so execution of other tests won't be affected by their presence. --source include/wait_until_count_sessions.inc diff --git a/mysql-test/t/myisam_debug.test b/mysql-test/t/myisam_debug.test index b106ecdea5e..465ecd70895 100644 --- a/mysql-test/t/myisam_debug.test +++ b/mysql-test/t/myisam_debug.test @@ -57,3 +57,16 @@ KILL QUERY @thread_id; CHECK TABLE t1; DROP TABLE t1,t2; DISCONNECT insertConn; + +# +# MDEV-12761 Error return from external_lock make the server crash +# +call mtr.add_suppression("Index for table '.*test.t1\\.MYI' is corrupt; try to repair it"); +create table t1 (a int, index(a)); +lock tables t1 write; +insert t1 values (1),(2),(1); +set @old_dbug=@@debug_dbug; +set debug_dbug='+d,mi_lock_database_failure'; +unlock tables; +set debug_dbug=@old_dbug; +drop table t1; diff --git a/mysql-test/t/mysql.test b/mysql-test/t/mysql.test index 8df9a0c82bf..300695612fd 100644 --- a/mysql-test/t/mysql.test +++ b/mysql-test/t/mysql.test @@ -645,3 +645,33 @@ EOF set GLOBAL sql_mode=default; --echo --echo End of tests + +# +# MDEV-13187 incorrect backslash parsing in clients +# +create table `a1\``b1` (a int); +show tables; +insert `a1\``b1` values (1),(2); +show create table `a1\``b1`; +--exec $MYSQL_DUMP --compact test +--exec $MYSQL_DUMP test > $MYSQLTEST_VARDIR/tmp/bug.sql +insert `a1\``b1` values (4),(5); +--exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/bug.sql +show create table `a1\``b1`; +select * from `a1\``b1`; +drop table `a1\``b1`; + +# same with ansi_quotes +set sql_mode=ansi_quotes; +create table "a1\""b1" (a int); +show tables; +insert "a1\""b1" values (1),(2); +show create table "a1\""b1"; +--exec $MYSQL_DUMP --compact --compatible=postgres test +--exec $MYSQL_DUMP --compatible=postgres test > $MYSQLTEST_VARDIR/tmp/bug.sql +insert "a1\""b1" values (4),(5); +--exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/bug.sql +show create table "a1\""b1"; +select * from "a1\""b1"; +drop table "a1\""b1"; +set sql_mode=default; diff --git a/mysql-test/t/mysql_plugin-master.opt b/mysql-test/t/mysql_plugin-master.opt deleted file mode 100644 index 061ca907902..00000000000 --- a/mysql-test/t/mysql_plugin-master.opt +++ /dev/null @@ -1 +0,0 @@ ---plugin-dir=$DAEMONEXAMPLE_DIR diff --git a/mysql-test/t/mysql_plugin.test b/mysql-test/t/mysql_plugin.test deleted file mode 100644 index 10bc03e0f06..00000000000 --- a/mysql-test/t/mysql_plugin.test +++ /dev/null @@ -1,368 +0,0 @@ -# -# Test mysql_plugin tool -# -# This test contains test cases for testing the mysql_plugin client with -# the daemon_example plugin. Test cases include tests for: -# -# - successful enable/disable -# - incorrect paths -# - missing paths/options -# -# Implementation Notes -# -# The mysql_plugin tool now accepts --mysqld the path to mysqld server. The -# mysqld path is extracted from MYSQLD_BOOTSTRAP_CMD line. We also extract -# the path of MYSQLD_BASEDIR (where mysql exists) and use it for the errmsg -# file. The directories differ between Windows and Unix but the Perl script -# included below will pick as per platform. -# -# The test is also designed to issue the --skip directive if the location of -# the mysqld, my_print_defaults, or daemon_example.ini files cannot be found. -# - ---source include/not_embedded.inc - -# Add the datadir, basedir, plugin_dir to the bootstrap command -let $MYSQLD_DATADIR= `select @@datadir`; -let $MYSQL_BASEDIR= `select @@basedir`; -let $MYSQL_ERRMSG_BASEDIR=`select @@lc_messages_dir`; -let $PLUGIN_DIR=`select @@plugin_dir`; - ---disable_abort_on_error - -# Perl script to extract the location of the basedir from environment -# variables. This is needed to ensure the test will run on the PB machines -# designed to test release as well as debug builds. It also checks for the -# location of the my_print_defaults and daemon_example.ini files. - -perl; -use File::Basename; - my ($mysqld)= split " ", $ENV{MYSQLD_BOOTSTRAP_CMD}; - my $mysqld_basedir=dirname($mysqld); - my $my_print_defaults= $ENV{MYSQL_MY_PRINT_DEFAULTS}; - my $my_print_defaults_basedir=dirname($my_print_defaults); - my $daemonexample_ini= "$ENV{DAEMONEXAMPLE_DIR}/daemon_example.ini"; - my $plugindir_ini= "$ENV{PLUGIN_DIR}/daemon_example.ini"; - my $notfound= ""; - open(FILE, ">", "$ENV{MYSQL_TMP_DIR}/mysqld.inc") or die; - print FILE "let \$MYSQLD_BASEDIR= $mysqld_basedir;\n"; - print FILE "let \$MYSQL_MY_PRINT_DEFAULTS_BASEDIR= $my_print_defaults_basedir;\n"; - if ((!-e $daemonexample_ini) || (!-r $daemonexample_ini)) - { - print FILE "let \$DAEMONEXAMPLE_DIR= $not_found;\n"; - } - if ((!-e $plugindir_ini) || (!-r $plugindir_ini)) - { - print FILE "let \$PLUGIN_DIR= $not_found;\n"; - } - close FILE; -EOF - - -source $MYSQL_TMP_DIR/mysqld.inc; -remove_file $MYSQL_TMP_DIR/mysqld.inc; - -# The mysql_plugin tool expects a directory structure like in the installed -# mysql version, so errmsg.sys will be copied to "basedir/share", we create -# and remove this structure. - ---mkdir $MYSQLD_BASEDIR/share ---mkdir $MYSQLD_BASEDIR/share/mysql ---copy_file $MYSQL_ERRMSG_BASEDIR/english/errmsg.sys $MYSQLD_BASEDIR/share/errmsg.sys ---copy_file $MYSQL_ERRMSG_BASEDIR/english/errmsg.sys $MYSQLD_BASEDIR/share/mysql/errmsg.sys - -# The mysql_plugin tool now accepts --my-print-defaults which points to the -# executable my_print_defaults.exe we can get this path from the variable -# $MYSQL_MY_PRINT_DEFAULTS. - -# Check for my_print_defaults location. Skip if not found. -if ($MYSQL_MY_PRINT_DEFAULTS_BASEDIR == '') -{ - --skip Test requires known location of my_print_defaults executable. -} - -# Check for mysqld location. Skip if not found. -if ($MYSQLD == '') -{ - --skip Test requires known location of mysqld executable. -} - -# Check for daemon_example.ini location. Skip if not found in either -# the plugin_dir path or the daemon_example_dir path. -if ($PLUGIN_DIR == '') -{ - if ($DAEMONEXAMPLE_DIR == '') - { - --skip Test requires known location of daemon_example.ini file. - } - let $PLUGIN_DIR = $DAEMONEXAMPLE_DIR; -} - -# Build client command for reuse. - -let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN --datadir=$MYSQLD_DATADIR --basedir=$MYSQLD_BASEDIR --plugin-dir=$PLUGIN_DIR --mysqld=$MYSQLD_BASEDIR --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; - ---echo # ---echo # Ensure the plugin isn't loaded. ---echo # -SELECT * FROM mysql.plugin WHERE dl like 'libdaemon%' ORDER BY name; - ---echo # ---echo # Enable the plugin... ---echo # - ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect ---shutdown_server 10 ---source include/wait_until_disconnected.inc - -# -# Enable the plugin -# ---exec $MYSQL_PLUGIN_CMD ENABLE daemon_example - -# -# Ensure enabling an enabled plugin doesn't fail ---exec $MYSQL_PLUGIN_CMD ENABLE daemon_example - -# -# Restart the server -# - ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect ---enable_reconnect ---source include/wait_until_connected_again.inc - ---echo # ---echo # Simulate loading a plugin libary with multiple entry points. ---echo # This will test the DISABLE to ensure all rows are removed. ---echo # ---replace_regex /\.dll/.so/ -eval INSERT INTO mysql.plugin VALUES ('wicky', '$DAEMONEXAMPLE'); ---replace_regex /\.dll/.so/ -eval INSERT INTO mysql.plugin VALUES ('wacky', '$DAEMONEXAMPLE'); ---replace_regex /\.dll/.so/ -eval INSERT INTO mysql.plugin VALUES ('wonky', '$DAEMONEXAMPLE'); - ---echo # ---echo # Ensure the plugin is now loaded. ---echo # ---replace_regex /\.dll/.so/ -SELECT * FROM mysql.plugin WHERE dl like 'libdaemon%' ORDER BY name; - ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect ---shutdown_server 10 ---source include/wait_until_disconnected.inc - -# -# Disable the plugin - to remove winky, wonky entries -# ---exec $MYSQL_PLUGIN_CMD DISABLE daemon_example - -# -# Enable the plugin again -# ---exec $MYSQL_PLUGIN_CMD ENABLE daemon_example - -# -# Restart the server -# ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect ---enable_reconnect ---source include/wait_until_connected_again.inc - ---echo # ---echo # Ensure the plugin is loaded. ---echo # ---replace_regex /\.dll/.so/ -SELECT * FROM mysql.plugin WHERE dl like '%libdaemon%' ORDER BY name; - ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect ---shutdown_server 10 ---source include/wait_until_disconnected.inc - -# To test the case where the same plugin is reloaded with a different soname, -# we must copy the example daemon to a new location renaming it. - -let $DAEMON_RELOAD = lib$DAEMONEXAMPLE; ---copy_file $PLUGIN_DIR/$DAEMONEXAMPLE $PLUGIN_DIR/$DAEMON_RELOAD ---copy_file include/libdaemon_example.ini $PLUGIN_DIR/libdaemon_example.ini - -# Now reload it and see that it is a different name. ---exec $MYSQL_PLUGIN_CMD ENABLE libdaemon_example - -# -# Restart the server -# ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect ---enable_reconnect ---source include/wait_until_connected_again.inc - ---echo # ---echo # Ensure the plugin is replaced. ---echo # ---replace_regex /\.dll/.so/ -SELECT * FROM mysql.plugin WHERE dl like '%libdaemon%' ORDER BY name; - ---echo # ---echo # Disable the plugin... ---echo # - ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect ---shutdown_server 10 ---source include/wait_until_disconnected.inc - -# -# Disable the plugin -# ---exec $MYSQL_PLUGIN_CMD DISABLE libdaemon_example - -# Remove files for last test case. - ---remove_file $PLUGIN_DIR/$DAEMON_RELOAD ---remove_file $DAEMONEXAMPLE_DIR/libdaemon_example.ini - -# -# Restart the server -# ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect ---enable_reconnect ---source include/wait_until_connected_again.inc - ---echo # ---echo # Ensure the plugin isn't loaded. ---echo # -SELECT * FROM mysql.plugin WHERE dl like '%libdaemon%' ORDER BY name; - -# -# Stop the server for error conditions -# - ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect ---shutdown_server 10 ---source include/wait_until_disconnected.inc - ---echo # ---echo # Attempt to load non-existant plugin ---echo # ---error 1,2,256 ---exec $MYSQL_PLUGIN_CMD DISABLE NOT_THERE_AT_ALL 2>&1 - ---echo # ---echo # Attempt to use non-existant plugin.ini file ---echo # ---error 1,2,7,256 ---exec $MYSQL_PLUGIN_CMD DISABLE daemon_example --plugin-ini=/NOT/THERE/pi.ini 2>&1 - ---echo # ---echo # Attempt to omit the plugin ---echo # ---error 1,2,256 ---exec $MYSQL_PLUGIN_CMD DISABLE 2>&1 - ---echo # ---echo # Attempt to omit DISABLE|ENABLE ---echo # ---error 1,2,256 ---exec $MYSQL_PLUGIN_CMD daemon_example 2>&1 - ---echo # ---echo # Attempt to use bad paths - datadir ---echo # -let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=/data_not_there/ --basedir=$MYSQL_BASEDIR --plugin-dir=$PLUGIN_DIR --mysqld=$MYSQLD_BASEDIR --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; ---error 1,2,256 ---exec $MYSQL_PLUGIN_CMD DISABLE daemon_example 2>&1 - ---echo # ---echo # Attempt to use bad paths - basedir ---echo # -let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=/basedir_not_there/ --plugin-dir=$PLUGIN_DIR --mysqld=$MYSQLD_BASEDIR --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; -replace_result "/basedir_not_there//" "/basedir_not_there/"; ---error 1,2,256 ---exec $MYSQL_PLUGIN_CMD DISABLE daemon_example 2>&1 - ---echo # ---echo # Attempt to use bad paths - plugin_dir ---echo # -let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=$MYSQL_BASEDIR --plugin-dir=/plugin_not_there/ --mysqld=$MYSQLD_BASEDIR --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; ---error 1,2,256 ---exec $MYSQL_PLUGIN_CMD DISABLE daemon_example 2>&1 - ---echo # ---echo # Attempt to use bad paths - mysqld ---echo # -let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=$MYSQL_BASEDIR --plugin-dir=$PLUGIN_DIR --mysqld=/mysqld_not_there/ --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; ---error 1,2,256 ---exec $MYSQL_PLUGIN_CMD DISABLE daemon_example 2>&1 - ---echo # ---echo # Attempt to use bad paths - my_print_defaults ---echo # -let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=$MYSQL_BASEDIR --plugin-dir=$PLUGIN_DIR --mysqld=$MYSQLD_BASEDIR --my-print-defaults=/my_print_defaults_not_there/; ---error 1,2,256 ---exec $MYSQL_PLUGIN_CMD DISABLE daemon_example 2>&1 - - ---echo # ---echo # Missing library ---echo # -let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=$MYSQL_BASEDIR --plugin-dir=$PLUGIN_DIR --plugin-ini=$MYSQL_TEST_DIR/include/daemon_example_bad_soname.ini --mysqld=$MYSQLD_BASEDIR --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; ---error 1,2,256 ---exec $MYSQL_PLUGIN_CMD DISABLE daemon_example 2>&1 - ---echo # ---echo # Bad format for config file ---echo # -let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=$MYSQL_BASEDIR --plugin-dir=$PLUGIN_DIR --plugin-ini=$MYSQL_TEST_DIR/include/daemon_example_bad_format.ini --mysqld=$MYSQLD_BASEDIR --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; ---error 1,2,256 ---exec $MYSQL_PLUGIN_CMD DISABLE daemon_example 2>&1 - ---echo # ---echo # Missing base_dir option ---echo # -let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --plugin-dir=$PLUGIN_DIR --mysqld=$MYSQLD_BASEDIR --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; ---error 1,2,139,256 ---exec $MYSQL_PLUGIN_CMD DISABLE daemon_example 2>&1 - ---echo # ---echo # Missing data_dir option ---echo # -let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --basedir=$MYSQL_BASEDIR --plugin-dir=$PLUGIN_DIR --mysqld=$MYSQLD_BASEDIR --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; ---error 1,2,139,256 ---exec $MYSQL_PLUGIN_CMD DISABLE daemon_example 2>&1 - ---echo # ---echo # Missing plugin_dir option ---echo # -let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQL_DATADIR --basedir=$MYSQL_BASEDIR --mysqld=$MYSQLD_BASEDIR --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; ---error 1,2,139,256 ---exec $MYSQL_PLUGIN_CMD DISABLE daemon_example 2>&1 - ---echo # ---echo # Show the help. ---echo # -replace_result $MYSQL_PLUGIN mysql_plugin; ---replace_regex /Ver [0-9.]+ Distrib [0-9.]+/Ver V.V.VV Distrib XX.XX.XX/ /XX-m[0-9]+/XX/ /XX[a-z]/XX/ ---exec $MYSQL_PLUGIN --help - -replace_result $MYSQL_PLUGIN mysql_plugin; ---replace_regex /Ver [0-9.]+ Distrib [0-9.]+/Ver V.V.VV Distrib XX.XX.XX/ /XX-m[0-9]+/XX/ /XX[a-z]/XX/ ---exec $MYSQL_PLUGIN --version - -# -# Restart the server -# ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect ---enable_reconnect ---source include/wait_until_connected_again.inc - -# -# Cleanup - ---remove_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect - -# Cleanup the share folder in the binary path. ---remove_file $MYSQLD_BASEDIR/share/errmsg.sys ---rmdir $MYSQLD_BASEDIR/share/mysql ---rmdir $MYSQLD_BASEDIR/share - ---enable_abort_on_error diff --git a/mysql-test/t/mysql_upgrade.test b/mysql-test/t/mysql_upgrade.test index 9d33dd70e3a..a19be30e68f 100644 --- a/mysql-test/t/mysql_upgrade.test +++ b/mysql-test/t/mysql_upgrade.test @@ -1,6 +1,7 @@ -- source include/mysql_upgrade_preparation.inc -- source include/have_working_dns.inc -- source include/have_innodb.inc +-- source include/have_partition.inc set sql_mode=""; @@ -168,6 +169,31 @@ SELECT grantor FROM mysql.tables_priv WHERE db = 'mysql' AND table_name = 'user' DROP USER very_long_user_name_number_1, very_long_user_name_number_2, even_longer_user_name_number_3_to_test_the_grantor_and_definer_field_length@localhost; DROP PROCEDURE test.pr; +# +# MDEV-13274 mysql_upgrade fails if dbname+tablename+partioname > 64 chars +# +use test; +call mtr.add_suppression('Column last_update in table `mysql`.`innodb_table_stats` is INT NOT NULL but should be'); +alter table mysql.innodb_table_stats modify last_update int not null; + +create table extralongname_extralongname_extralongname_extralongname_ext ( + id int(10) unsigned not null, + created_date date not null, + created timestamp not null, + primary key (created,id,created_date) +) engine=innodb stats_persistent=1 default charset=latin1 + partition by range (year(created_date)) + subpartition by hash (month(created_date)) + subpartitions 2 ( + partition p2007 values less than (2008), + partition p2008 values less than (2009) + ); +--exec $MYSQL_UPGRADE --skip-verbose --force 2>&1 +select length(table_name) from mysql.innodb_table_stats; +drop table extralongname_extralongname_extralongname_extralongname_ext; + +--echo End of 10.0 tests + set sql_mode=default; # @@ -192,4 +218,4 @@ DROP TABLE test.t1; --remove_file $MYSQLD_DATADIR/mysql_upgrade_info SET GLOBAL enforce_storage_engine=NULL; ---echo End of tests +--echo End of 10.1 tests diff --git a/mysql-test/t/mysqld--help.test b/mysql-test/t/mysqld--help.test index e6499957cd2..1613f8e7a4f 100644 --- a/mysql-test/t/mysqld--help.test +++ b/mysql-test/t/mysqld--help.test @@ -3,6 +3,7 @@ # --source include/not_embedded.inc --source include/have_perfschema.inc +--source include/have_profiling.inc --source include/platform.inc # @@ -41,6 +42,7 @@ perl; $re2=join('|', @plugins); $skip=0; open(F, '<', "$ENV{MYSQL_TMP_DIR}/mysqld--help.txt") or die; + print "Windows bug: happens when a new line is exactly at the right offset.\n"; while () { next if 1../The following groups are read/; # formatting, skip line consisting entirely of dashes and blanks diff --git a/mysql-test/t/mysqldump.test b/mysql-test/t/mysqldump.test index ea08f540cf3..9f74f4ad9c0 100644 --- a/mysql-test/t/mysqldump.test +++ b/mysql-test/t/mysqldump.test @@ -2490,6 +2490,58 @@ DROP TABLE t2; DROP DATABASE db_20772273; USE test; +--echo # +--echo # Bug #25717383: MYSQLDUMP MAY EXECUTE ANY ARBITRARY QUERY +--echo # + + +CREATE DATABASE bug25717383; +use bug25717383; + +CREATE TABLE `tab +one` (a int); +CREATE VIEW `view +one` as SELECT * FROM `tab +one`; + +CREATE PROCEDURE `proc +one`() SELECT * from `tab +one`; + +CREATE TEMPORARY TABLE `temp +one` (id INT); + +CREATE TRIGGER `trig +one` BEFORE INSERT ON `tab +one` FOR EACH ROW SET NEW.a = 1; + +CREATE EVENT `event +one` ON SCHEDULE AT '2030-01-01 00:00:00' DO SET @a=5; + +SHOW TABLES FROM bug25717383; +--replace_column 6 # +SHOW TRIGGERS FROM bug25717383; +--replace_column 6 # +SHOW EVENTS FROM bug25717383; + +SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES + WHERE ROUTINE_SCHEMA='bug25717383' AND ROUTINE_TYPE= 'PROCEDURE' + ORDER BY ROUTINE_NAME; + +--exec $MYSQL_DUMP --triggers --events --routines --add-drop-database --databases bug25717383 > $MYSQLTEST_VARDIR/tmp/bug25717383.sql + +SHOW TABLES FROM bug25717383; +--replace_column 6 # +SHOW TRIGGERS FROM bug25717383; +--replace_column 6 # +SHOW EVENTS FROM bug25717383; + +SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES + WHERE ROUTINE_SCHEMA='bug25717383' AND ROUTINE_TYPE= 'PROCEDURE' + ORDER BY ROUTINE_NAME; + +DROP DATABASE bug25717383; + # # MDEV-6091 mysqldump goes in a loop and segfaults if --dump-slave is specified and it cannot connect to the server # @@ -2582,3 +2634,15 @@ let SEARCH_FILE=$MYSQLTEST_VARDIR/tmp/bug11505.sql; let SEARCH_PATTERN=Database: mysql; exec $MYSQL_DUMP mysql func > $SEARCH_FILE; source include/search_pattern_in_file.inc; + +--echo # +--echo # Test for --add-drop-trigger +--echo # +use test; +CREATE TABLE t1 (a int, b int); +CREATE TRIGGER tt1_t1 BEFORE INSERT ON t1 FOR EACH ROW + SET NEW.b=NEW.a + 10; + +INSERT INTO t1 (a) VALUES (1),(2),(3); +--exec $MYSQL_DUMP --triggers --no-data --no-create-info --add-drop-trigger --skip-comments --databases test +DROP TABLE t1; diff --git a/mysql-test/t/mysqltest.test b/mysql-test/t/mysqltest.test index b2706a8459f..d6c68ecf3c2 100644 --- a/mysql-test/t/mysqltest.test +++ b/mysql-test/t/mysqltest.test @@ -406,7 +406,7 @@ select 3 from t1 ; --disable_abort_on_error ONCE garbage; --disable_abort_on_error ONCE ---remove_file DoesNotExist +--remove_file $MYSQLTEST_VARDIR/DoesNotExist --disable_result_log select 2; @@ -1939,8 +1939,6 @@ remove_file $MYSQLTEST_VARDIR/tmp/zero_length_file.result; remove_file $MYSQLTEST_VARDIR/tmp/zero_length_file.reject; --error 0,1 remove_file $MYSQLTEST_VARDIR/tmp/zero_length_file.log; ---error 0,1 -remove_file $MYSQL_TEST_DIR/r/zero_length_file.reject; --enable_warnings # @@ -2083,9 +2081,11 @@ drop table t1; --let $patt= /a /b / /less/more/ --replace_regex $patt select "a is a and less is more" as txt; +--replace_regex $patt /and /or / +select "a is a and less is more" as txt2; --let $patt= --replace_regex $patt -select "a is a and less is more" as txt; +select "a is a and less is more" as txt3; --enable_query_log # @@ -2193,7 +2193,7 @@ drop table t1; --exec echo "remove_file ;" | $MYSQL_TEST 2>&1 --error 1 -remove_file non_existing_file; +remove_file $MYSQLTEST_VARDIR/non_existing_file; --enable_warnings # ---------------------------------------------------------------------------- @@ -2204,10 +2204,10 @@ remove_file non_existing_file; --exec echo "remove_files_wildcard ;" | $MYSQL_TEST 2>&1 --error 1 -remove_files_wildcard non_existing_dir; +remove_files_wildcard $MYSQLTEST_VARDIR/non_existing_dir; --error 1 -remove_files_wildcard non_existing_dir non_existing_file; +remove_files_wildcard $MYSQLTEST_VARDIR/non_existing_dir non_existing_file; # ---------------------------------------------------------------------------- # test for write_file @@ -2216,7 +2216,7 @@ remove_files_wildcard non_existing_dir non_existing_file; --exec echo "write_file ;" | $MYSQL_TEST 2>&1 --error 1 ---exec echo "write_file filename ;" | $MYSQL_TEST 2>&1 +--exec echo "write_file $MYSQLTEST_VARDIR/filename ;" | $MYSQL_TEST 2>&1 # Comment out this test as it confuses cmd.exe with unmatched " #--error 1 @@ -2462,19 +2462,19 @@ remove_file $MYSQLTEST_VARDIR/tmp/file1.tmp; --exec echo "chmod ;" | $MYSQL_TEST 2>&1 --error 1 ---exec echo "chmod 0 from_file;" | $MYSQL_TEST 2>&1 +--exec echo "chmod 0 $MYSQLTEST_VARDIR/from_file;" | $MYSQL_TEST 2>&1 --error 1 ---exec echo "chmod 08 from_file;" | $MYSQL_TEST 2>&1 +--exec echo "chmod 08 $MYSQLTEST_VARDIR/from_file;" | $MYSQL_TEST 2>&1 --error 1 ---exec echo "chmod from_file;" | $MYSQL_TEST 2>&1 +--exec echo "chmod $MYSQLTEST_VARDIR/from_file;" | $MYSQL_TEST 2>&1 --error 1 ---exec echo "chmod ABZD from_file;" | $MYSQL_TEST 2>&1 +--exec echo "chmod ABZD $MYSQLTEST_VARDIR/from_file;" | $MYSQL_TEST 2>&1 --error 1 ---exec echo "chmod 06789 from_file;" | $MYSQL_TEST 2>&1 +--exec echo "chmod 06789 $MYSQLTEST_VARDIR/from_file;" | $MYSQL_TEST 2>&1 # ---------------------------------------------------------------------------- @@ -2875,8 +2875,6 @@ list_files_append_file $MYSQLTEST_VARDIR/tmp/testdir/file2.txt $MYSQLTEST_VARDIR list_files_write_file $MYSQLTEST_VARDIR/tmp/testdir/file2.txt $MYSQLTEST_VARDIR/tmp/testdir file?.txt; list_files_append_file $MYSQLTEST_VARDIR/tmp/testdir/file3.txt $MYSQLTEST_VARDIR/tmp/testdir file*.txt; diff_files $MYSQLTEST_VARDIR/tmp/testdir/file2.txt $MYSQLTEST_VARDIR/tmp/testdir/file3.txt; ---error 1 -rmdir $MYSQLTEST_VARDIR/tmp/testdir; cat_file $MYSQLTEST_VARDIR/tmp/testdir/file3.txt; @@ -2947,11 +2945,17 @@ disconnect $x; # Disconnect the selected connection disconnect $y; --echo $CURRENT_CONNECTION +connection default; +# +# MDEV-13187 incorrect backslash parsing in clients +# +set sql_mode=no_backslash_escapes; +select "foo\""bar"; +set sql_mode=default; --echo End of tests -connection default; # Wait till we reached the initial number of concurrent sessions --source include/wait_until_count_sessions.inc diff --git a/mysql-test/t/openssl_1.test b/mysql-test/t/openssl_1.test index 8e2d9133359..35bb7aca085 100644 --- a/mysql-test/t/openssl_1.test +++ b/mysql-test/t/openssl_1.test @@ -225,7 +225,7 @@ DROP TABLE t1; # Common ciphers to openssl and yassl --exec $MYSQL --host=localhost -e "SHOW STATUS LIKE 'Ssl_cipher';" --ssl-cipher=AES256-SHA ---exec $MYSQL --host=localhost -e "SHOW STATUS LIKE 'Ssl_cipher';" --ssl-cipher=DES-CBC3-SHA +--exec $MYSQL --host=localhost -e "SHOW STATUS LIKE 'Ssl_cipher';" --ssl-cipher=AES128-SHA --disable_query_log --disable_result_log diff --git a/mysql-test/t/openssl_6975.test b/mysql-test/t/openssl_6975.test index 6e8e03a0a89..6a82d013fb6 100644 --- a/mysql-test/t/openssl_6975.test +++ b/mysql-test/t/openssl_6975.test @@ -4,11 +4,13 @@ # test SSLv3 and TLSv1.2 ciphers when OpenSSL is restricted to SSLv3 or TLSv1.2 # source include/have_ssl_communication.inc; +source include/require_openssl_client.inc; # this is OpenSSL test. create user ssl_sslv3@localhost; -grant select on test.* to ssl_sslv3@localhost require cipher "RC4-SHA"; +# grant select on test.* to ssl_sslv3@localhost require cipher "AES128-SHA"; +grant select on test.* to ssl_sslv3@localhost require cipher "AES128-SHA"; create user ssl_tls12@localhost; grant select on test.* to ssl_tls12@localhost require cipher "AES128-SHA256"; @@ -17,9 +19,9 @@ let $mysql=$MYSQL --ssl-key=$MYSQL_TEST_DIR/std_data/client-key.pem --ssl-cert=$ disable_abort_on_error; echo TLS1.2 ciphers: user is ok with any cipher; exec $mysql --ssl-cipher=AES128-SHA256; ---replace_result DHE-RSA-CHACHA20-POLY1305 DHE-RSA-AES256-GCM-SHA384 +--replace_result DHE-RSA-CHACHA20-POLY1305 DHE-RSA-AES256-GCM-SHA384 ECDHE-RSA-AES256-GCM-SHA384 DHE-RSA-AES256-GCM-SHA384 exec $mysql --ssl-cipher=TLSv1.2; -echo TLS1.2 ciphers: user requires SSLv3 cipher RC4-SHA; +echo TLS1.2 ciphers: user requires SSLv3 cipher AES128-SHA; exec $mysql --user ssl_sslv3 --ssl-cipher=AES128-SHA256; exec $mysql --user ssl_sslv3 --ssl-cipher=TLSv1.2; echo TLS1.2 ciphers: user requires TLSv1.2 cipher AES128-SHA256; @@ -27,13 +29,13 @@ exec $mysql --user ssl_tls12 --ssl-cipher=AES128-SHA256; exec $mysql --user ssl_tls12 --ssl-cipher=TLSv1.2; echo SSLv3 ciphers: user is ok with any cipher; -exec $mysql --ssl-cipher=RC4-SHA; +exec $mysql --ssl-cipher=AES256-SHA; exec $mysql --ssl-cipher=SSLv3; -echo SSLv3 ciphers: user requires SSLv3 cipher RC4-SHA; -exec $mysql --user ssl_sslv3 --ssl-cipher=RC4-SHA; +echo SSLv3 ciphers: user requires SSLv3 cipher AES128-SHA; +exec $mysql --user ssl_sslv3 --ssl-cipher=AES128-SHA; exec $mysql --user ssl_sslv3 --ssl-cipher=SSLv3; echo SSLv3 ciphers: user requires TLSv1.2 cipher AES128-SHA256; -exec $mysql --user ssl_tls12 --ssl-cipher=RC4-SHA; +exec $mysql --user ssl_tls12 --ssl-cipher=AES128-SHA; exec $mysql --user ssl_tls12 --ssl-cipher=SSLv3; drop user ssl_sslv3@localhost; diff --git a/mysql-test/t/order_by.test b/mysql-test/t/order_by.test index 92c7cdf44b6..8722401ccae 100644 --- a/mysql-test/t/order_by.test +++ b/mysql-test/t/order_by.test @@ -2094,3 +2094,15 @@ set @@optimizer_switch=@tmp_8989; set optimizer_switch='orderby_uses_equalities=on'; + +--echo # +--echo # MDEV-10880: Assertions `keypart_map' or +--echo # `prebuilt->search_tuple->n_fields > 0' fail on DISTINCT and +--echo # GROUP BY constant +--echo # + +CREATE TABLE t1 (pk INT PRIMARY KEY); +INSERT INTO t1 VALUES (1),(2),(3); +SELECT DISTINCT pk FROM t1 GROUP BY 'foo'; +SELECT DISTINCT pk FROM t1; +DROP TABLE t1; diff --git a/mysql-test/t/partition_alter.test b/mysql-test/t/partition_alter.test index 592d8fdaeaa..ce6672c4b9d 100644 --- a/mysql-test/t/partition_alter.test +++ b/mysql-test/t/partition_alter.test @@ -1,3 +1,4 @@ +--source include/have_innodb.inc --source include/have_partition.inc CREATE TABLE `test_data` ( @@ -64,3 +65,52 @@ deallocate prepare stmt; drop table test_data; +# +# MDEV-12389 ADD CHECK leaves an orphaned .par file +# + +--let $datadir=`SELECT @@datadir` + +# InnoDB +create table t1(id int, d date not null, b bool not null default 0, primary key(id,d)) +engine=innodb +partition by range columns (d) ( +partition p1 values less than ('2016-10-18'), +partition p2 values less than ('2020-10-19')); +insert t1 values (0, '2000-01-02', 0); +insert t1 values (1, '2020-01-02', 10); +--replace_regex /#sql-[0-9a-f_]*/#sql-temporary/ +--error ER_CONSTRAINT_FAILED +alter table t1 add check (b in (0, 1)); +alter table t1 add check (b in (0, 10)); +show create table t1; +--error ER_CONSTRAINT_FAILED +insert t1 values (2, '2020-01-03', 20); +drop table t1; +--list_files $datadir/test + +# MyISAM, different execution path +create table t1(id int, d date not null, b bool not null default 0, primary key(id,d)) +partition by range columns (d) ( +partition p1 values less than ('2016-10-18'), +partition p2 values less than ('2020-10-19')); +insert t1 values (0, '2000-01-02', 0); +insert t1 values (1, '2020-01-02', 10); +--replace_regex /#sql-[0-9a-f_]*/#sql-temporary/ +--error ER_CONSTRAINT_FAILED +alter table t1 add check (b in (0, 1)); +alter table t1 add check (b in (0, 10)); +show create table t1; +--error ER_CONSTRAINT_FAILED +insert t1 values (2, '2020-01-03', 20); +drop table t1; +--list_files $datadir/test + +# +# MDEV-13097 Online alter of a partitioned MyISAM table with auto_increment +# +create table t1 (id_1 int auto_increment, id_2 int, id_3 int, d1 date, dt1 datetime default current_timestamp, dt2 datetime default current_timestamp on update current_timestamp, primary key (id_2, id_3), key(id_1)) partition by hash(id_2) partitions 3 (partition p01, partition p02, partition p03); +insert into t1 values(0, 1, 1, NULL, now(), now()); +alter online table t1 delay_key_write=1; +show create table t1; +drop table t1; diff --git a/mysql-test/t/query_cache_innodb.test b/mysql-test/t/query_cache_innodb.test new file mode 100644 index 00000000000..ba62ec36c16 --- /dev/null +++ b/mysql-test/t/query_cache_innodb.test @@ -0,0 +1,85 @@ +--source include/have_innodb.inc +--source include/have_query_cache.inc +--source include/not_embedded.inc + +--echo # +--echo # MDEV-12485: foreign key on delete cascade stale entries with +--echo # query cache enabled +--echo # + +SET NAMES utf8; +set global query_cache_type=1; +set global query_cache_size=1024*1024; +set query_cache_type=1; + +create table t1 ( id int unsigned auto_increment, primary key(id) ) engine=innodb; + +create table t2 ( t2id int unsigned, id int unsigned, primary key(t2id, id), foreign key (`id`) references t1(`id`) on delete cascade ) engine=innodb; + +insert into t1 values (1); +insert into t2 values (1,1); +select * from t2; +show status like "Qcache_queries_in_cache"; + +delete from t1; +show status like "Qcache_queries_in_cache"; +select * from t2; + +optimize table t2; +select * from t2; +drop table t2; +drop table t1; + +create database `testdatabase$Ñ—`; +use `testdatabase$Ñ—`; +create table `t1$Ñ—` ( id int unsigned auto_increment, primary key(id) ) engine=innodb; + +create table `t2$Ñ—` ( t2id int unsigned, id int unsigned, primary key(t2id, id), foreign key (`id`) references `t1$Ñ—`(`id`) on delete cascade ) engine=innodb; + +insert into `t1$Ñ—` values (1); +insert into `t2$Ñ—`values (1,1); +select * from `t2$Ñ—`; +show status like "Qcache_queries_in_cache"; + +delete from `t1$Ñ—`; +show status like "Qcache_queries_in_cache"; +select * from `t2$Ñ—`; + +optimize table `t2$Ñ—`; +select * from `t2$Ñ—`; + +use test; +drop database `testdatabase$Ñ—`; +SET NAMES default; + +create database `#mysql50#-`; +use `#mysql50#-`; +create table `#mysql50#t-1` ( id int unsigned auto_increment, primary key(id) ) engine=innodb; + +create table `#mysql50#t-2` ( t2id int unsigned, id int unsigned, primary key(t2id, id), foreign key (`id`) references `#mysql50#t-1`(`id`) on delete cascade ) engine=innodb; + +insert into `#mysql50#t-1` values (1); +insert into `#mysql50#t-2`values (1,1); +select * from `#mysql50#t-2`; +show status like "Qcache_queries_in_cache"; + +delete from `#mysql50#t-1`; +show status like "Qcache_queries_in_cache"; +select * from `#mysql50#t-2`; + +optimize table `#mysql50#t-2`; +select * from `#mysql50#t-2`; + +use test; +drop database `#mysql50#-`; +SET NAMES default; +--disable_query_log +call mtr.add_suppression("\\[ERROR\\] Invalid \\(old\\?\\) table or database name 't?-[12]?\\'"); +--enable_query_log +--let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let SEARCH_PATTERN=\\[ERROR\\] Invalid \\(old\\?\\) table or database name +--source include/search_pattern_in_file.inc + +set global query_cache_type=DEFAULT; +set global query_cache_size=DEFAULT; +--echo End of 10.2 tests diff --git a/mysql-test/t/range_interrupted-13751.test b/mysql-test/t/range_interrupted-13751.test new file mode 100644 index 00000000000..000a46383e8 --- /dev/null +++ b/mysql-test/t/range_interrupted-13751.test @@ -0,0 +1,25 @@ +source include/have_debug.inc; +# +# MDEV-13751 Interrupted SELECT fails with 1030: 'Got error 1 "Operation not permitted" from storage engine MyISAM' +# +CREATE TABLE t1 (i INT AUTO_INCREMENT, c VARCHAR(1), KEY(i), KEY(c,i)) ENGINE=MyISAM; +INSERT INTO t1 (c) VALUES ('a'),('b'),('c'),('d'); +INSERT INTO t1 (c) SELECT c FROM t1; +INSERT INTO t1 (c) SELECT c FROM t1; +INSERT INTO t1 (c) SELECT c FROM t1; +INSERT INTO t1 (c) SELECT c FROM t1; +INSERT INTO t1 (c) SELECT c FROM t1; +INSERT INTO t1 (c) SELECT c FROM t1; + +set @old_dbug=@@session.debug_dbug; +set debug_dbug="+d,kill_join_init_read_record"; + +--error ER_QUERY_INTERRUPTED +SELECT 1 FROM t1 AS alias1, t1 AS alias2, t1 AS alias3 +WHERE alias1.c = alias2.c OR alias1.i <= 1 +; + +set debug_dbug=@old_dbug; + +DROP TABLE t1; + diff --git a/mysql-test/t/read_only.test b/mysql-test/t/read_only.test index 3e970fc6da7..152770c1731 100644 --- a/mysql-test/t/read_only.test +++ b/mysql-test/t/read_only.test @@ -79,6 +79,9 @@ insert into t3 values(1); insert into t4 select * from t3; +--error ER_OPTION_PREVENTS_STATEMENT +create table t3 (a int); + # a non-temp table updated: --error ER_OPTION_PREVENTS_STATEMENT update t1,t3 set t1.a=t3.a+1 where t1.a=t3.a; diff --git a/mysql-test/t/sp-destruct.test b/mysql-test/t/sp-destruct.test index 6e19fd885e3..31da235d906 100644 --- a/mysql-test/t/sp-destruct.test +++ b/mysql-test/t/sp-destruct.test @@ -39,7 +39,7 @@ create table t1 (id int); create trigger t1_ai after insert on t1 for each row call bug14233(); # Unsupported tampering with the mysql.proc definition -alter table mysql.proc drop type; +alter table mysql.proc drop security_type; --error ER_COL_COUNT_DOESNT_MATCH_CORRUPTED_V2 call bug14233(); --error ER_COL_COUNT_DOESNT_MATCH_CORRUPTED_V2 @@ -238,7 +238,7 @@ let $MYSQLD_DATADIR= `select @@datadir`; create database mysqltest; --echo # Corrupt mysql.proc to make it unusable by current version of server. -alter table mysql.proc drop column type; +alter table mysql.proc drop column security_type; --echo # The below statement should not cause assertion failure. drop database mysqltest; diff --git a/mysql-test/t/sp-security.test b/mysql-test/t/sp-security.test index f719cbff11c..059a5dd0fa8 100644 --- a/mysql-test/t/sp-security.test +++ b/mysql-test/t/sp-security.test @@ -1023,3 +1023,30 @@ grant execute on procedure sp1 to current_user() identified by 'barfoo'; show grants; drop procedure sp1; set password=''; + +--echo # +--echo # MDEV-13396 Unexpected "alter routine comand defined" during CREATE OR REPLACE PROCEDURE +--echo # + +CREATE DATABASE u1; +DELIMITER $$; +CREATE PROCEDURE u1.p1() BEGIN SELECT 1; END; $$ +CREATE FUNCTION u1.f1() RETURNS INT BEGIN RETURN 1; END; $$ +DELIMITER ;$$ + +CREATE USER u1@localhost; +GRANT CREATE ROUTINE ON u1.* TO u1@localhost; +GRANT ALTER ROUTINE ON FUNCTION u1.f1 TO u1@localhost; +GRANT ALTER ROUTINE ON PROCEDURE u1.p1 TO u1@localhost; + +connect (u1, localhost, u1,,); +USE u1; +DELIMITER $$; +CREATE OR REPLACE FUNCTION f1() RETURNS INT BEGIN RETURN 2; END; $$ +CREATE OR REPLACE PROCEDURE p1() BEGIN SELECT 1; END; $$ +DELIMITER ;$$ + +disconnect u1; +connection default; +DROP DATABASE u1; +DROP USER u1@localhost; diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index 3ca210d9904..e942059369c 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -9549,6 +9549,37 @@ CALL sp1(); drop user 'foo'@'%'; drop procedure sp1; +--echo # +--echo # MDEV-10972: Insert from select / view / union -- +--echo # repeatable crash in 10.1, 10.2 Linux/Mac/Windows +--echo # + +create table t (id int auto_increment primary key); +insert into t values (9494),(9495),(9496),(9497),(9498),(9499),(9500),(9501),(9502),(9503); + +create VIEW v AS +select id from t +union +select id from t +; + +drop procedure if exists p; +create procedure p() +insert into tmp_t select t.id from ( + select id from v + union + select id from v +) sq +inner join t on (sq.id = t.id); + +--error ER_NO_SUCH_TABLE +CALL p(); +create table tmp_t (id int null); +CALL p(); + +drop procedure p; +drop view v; +drop table t, tmp_t; --echo #End of 10.1 tests @@ -9588,3 +9619,25 @@ DELIMITER ;| CALL p1(); DROP PROCEDURE p1; DROP TABLE t1; + +--echo # +--echo # MDEV-13346: CURSOR a query with GROUP BY using derived table +--echo # + +DELIMITER |; +CREATE PROCEDURE p1() +BEGIN + DECLARE c CURSOR FOR + SELECT + IFNULL(NULL,1) AS col + FROM + ( select 1 as id ) AS t + GROUP BY t.id + ; + OPEN c; +END +| +DELIMITER ;| +CALL p1(); +DROP PROCEDURE p1; + diff --git a/mysql-test/t/ssl_7937.combinations b/mysql-test/t/ssl_7937.combinations index 46a45686a9b..71b134e229a 100644 --- a/mysql-test/t/ssl_7937.combinations +++ b/mysql-test/t/ssl_7937.combinations @@ -1,3 +1,8 @@ +[x509v3] +--loose-enable-ssl +--loose-ssl-cert=$MYSQL_TEST_DIR/std_data/serversan-cert.pem +--loose-ssl-key=$MYSQL_TEST_DIR/std_data/serversan-key.pem + [ssl] --loose-enable-ssl diff --git a/mysql-test/t/ssl_7937.test b/mysql-test/t/ssl_7937.test index 8e9d1901907..aa8cd225d7b 100644 --- a/mysql-test/t/ssl_7937.test +++ b/mysql-test/t/ssl_7937.test @@ -26,7 +26,7 @@ create procedure have_ssl() # we fake the test result for yassl let yassl=`select variable_value='Unknown' from information_schema.session_status where variable_name='Ssl_session_cache_mode'`; if (!$yassl) { - --replace_result "self signed certificate in certificate chain" "Failed to verify the server certificate" + --replace_result "self signed certificate in certificate chain" "Failed to verify the server certificate" "Error in the certificate." "Failed to verify the server certificate" --exec $MYSQL --ssl --ssl-verify-server-cert -e "call test.have_ssl()" 2>&1 } if ($yassl) { diff --git a/mysql-test/t/ssl_8k_key.test b/mysql-test/t/ssl_8k_key.test index 23267a3c611..edfead46658 100644 --- a/mysql-test/t/ssl_8k_key.test +++ b/mysql-test/t/ssl_8k_key.test @@ -1,5 +1,5 @@ -# This test should work in embedded server after we fix mysqltest --- source include/not_embedded.inc +# schannel does not support keys longer than 4k +-- source include/not_windows.inc -- source include/have_ssl_communication.inc # diff --git a/mysql-test/t/stat_tables_par.test b/mysql-test/t/stat_tables_par.test index 1866eb71d3b..9d4038911ff 100644 --- a/mysql-test/t/stat_tables_par.test +++ b/mysql-test/t/stat_tables_par.test @@ -209,7 +209,7 @@ connect (con2, localhost, root,,); connection con1; set debug_sync='statistics_update_start SIGNAL parker WAIT_FOR go1 EXECUTE 1'; -set debug_sync='thr_multi_lock_after_thr_lock SIGNAL go2 EXECUTE 2'; +set debug_sync='thr_multi_lock_before_thr_lock SIGNAL go2 EXECUTE 3'; use dbt3_s001; --send analyze table lineitem persistent for all diff --git a/mysql-test/t/statistics.test b/mysql-test/t/statistics.test index 61ef20605af..e9ecb56a1cb 100644 --- a/mysql-test/t/statistics.test +++ b/mysql-test/t/statistics.test @@ -500,7 +500,7 @@ SELECT * FROM mysql.index_stats ORDER BY index_name, prefix_arity, table_name; ANALYZE TABLE t2 PERSISTENT FOR COLUMNS ALL INDEXES ALL; SELECT * FROM mysql.index_stats ORDER BY index_name, prefix_arity, table_name; -ALTER TABLE t2 DROP COLUMN b; +ALTER TABLE t2 DROP COLUMN b, DROP PRIMARY KEY, ADD PRIMARY KEY(a); SELECT * FROM mysql.index_stats ORDER BY index_name, prefix_arity, table_name; ANALYZE TABLE t2 PERSISTENT FOR COLUMNS() INDEXES ALL; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 282013222de..a7c07b78017 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -3602,7 +3602,7 @@ SET SESSION sql_mode=@old_sql_mode; drop table t2, t1; drop view v1; ---echo End of 5.0 tests. +--echo # End of 5.0 tests. # # Test [NOT] IN truth table (both as top-level and general predicate). @@ -4687,7 +4687,7 @@ select * from t2 where a=(select a from t1) and a='x'; drop table t1,t2; ---echo End of 5.1 tests +--echo # End of 5.1 tests --echo # --echo # Bug #11765713 58705: @@ -5159,7 +5159,7 @@ eval SELECT * FROM ( $subq ) AS alias3; DROP TABLE t1,t2; ---echo End of 5.2 tests +--echo # End of 5.2 tests --echo # --echo # BUG#779885: Crash in eliminate_item_equal with materialization=on in @@ -6008,11 +6008,17 @@ INSERT INTO t2 VALUES (3); CREATE ALGORITHM=MERGE VIEW v2 AS SELECT * FROM t2; +--error ER_WRONG_GROUP_FIELD +SELECT ( SELECT MIN(t2.f2) FROM t1 ) AS sq FROM t2 GROUP BY sq; +--error ER_WRONG_GROUP_FIELD SELECT ( SELECT MIN(v2.f2) FROM t1 ) AS sq FROM v2 GROUP BY sq; SELECT * FROM v2 where ( SELECT MIN(v2.f2) FROM t1 ) > 0; SELECT count(*) FROM v2 group by ( SELECT MIN(v2.f2) FROM t1 ); delete from t1; +--error ER_WRONG_GROUP_FIELD +SELECT ( SELECT MIN(t2.f2) FROM t1 ) AS sq FROM t2 GROUP BY sq; +--error ER_WRONG_GROUP_FIELD SELECT ( SELECT MIN(v2.f2) FROM t1 ) AS sq FROM v2 GROUP BY sq; drop view v2; @@ -6028,6 +6034,49 @@ SELECT * FROM t1 WHERE f2 >= SOME ( SELECT f1 FROM t1 ); SELECT * FROM t1 WHERE f2 <= SOME ( SELECT f1 FROM t1 ); DROP TABLE t1; +--echo # +--echo # MDEV-10146: Wrong result (or questionable result and behavior) +--echo # with aggregate function in uncorrelated SELECT subquery +--echo # +CREATE TABLE t1 (f1 INT); +CREATE VIEW v1 AS SELECT * FROM t1; +INSERT INTO t1 VALUES (1),(2); + +CREATE TABLE t2 (f2 int); + +INSERT INTO t2 VALUES (3); +SELECT ( SELECT MAX(f1) FROM t2 ) FROM t1; + +SELECT ( SELECT MAX(f1) FROM t2 ) FROM v1; + +INSERT INTO t2 VALUES (4); + +--error ER_SUBQUERY_NO_1_ROW +SELECT ( SELECT MAX(f1) FROM t2 ) FROM v1; +--error ER_SUBQUERY_NO_1_ROW +SELECT ( SELECT MAX(f1) FROM t2 ) FROM t1; + +drop view v1; +drop table t1,t2; + +# +# MDEV-7828 Assertion `key_read == 0' failed in TABLE::enable_keyread with SELECT SQ and WHERE SQ +# +CREATE TABLE t1 (f1 INT, KEY(f1)) ENGINE=MyISAM; +INSERT t1 VALUES (4),(8); +CREATE TABLE t2 (f2 INT, KEY(f2)) ENGINE=MyISAM; +INSERT t2 VALUES (6); +SELECT (SELECT MAX(sq.f2) FROM t1) FROM (SELECT * FROM t2) AS sq WHERE f2 = 2; +--echo # +--echo # Disable this query till MDEV-13399 is resolved +--echo # +--echo # INSERT t2 VALUES (9); +--echo # --error ER_SUBQUERY_NO_1_ROW +--echo # SELECT (SELECT MAX(sq.f2) FROM t1) FROM (SELECT * FROM t2) AS sq WHERE f2 = 2; +--echo # +drop table t1, t2; + +--echo # End of 10.0 tests --echo # --echo # MDEV-9487: Server crashes in Time_and_counter_tracker::incr_loops @@ -6055,7 +6104,7 @@ SELECT * FROM t1, t2 WHERE f3 = f2 AND f1 > ANY ( SELECT 'foo'); DROP TABLE t1, t2; SET NAMES default; ---echo End of 10.1 tests +--echo # End of 10.1 tests --echo # --echo # MDEV-12564: IN TO EXISTS transformation for rows after @@ -6072,4 +6121,4 @@ SELECT * FROM t t1 RIGHT JOIN t t2 ON (t2.pk = t1.pk) DROP TABLE t; ---echo End of 10.2 tests +--echo # End of 10.2 tests diff --git a/mysql-test/t/subselect_exists2in.test b/mysql-test/t/subselect_exists2in.test index 9450ef71494..a4fdbe5c50b 100644 --- a/mysql-test/t/subselect_exists2in.test +++ b/mysql-test/t/subselect_exists2in.test @@ -758,6 +758,34 @@ deallocate prepare stmt; drop view v1; drop table t1,t2; +--echo # +--echo #MDEV-10053: EXIST to IN transformation turned down +--echo # + +CREATE TABLE t1 ( + pk INT, f1 INT NOT NULL, f2 VARCHAR(3), f3 INT NULL, PRIMARY KEY(pk)) +ENGINE=MyISAM; +INSERT INTO t1 VALUES (1,1,'foo',8), (2,5,'bar',7); + +let $q= +SELECT STRAIGHT_JOIN sq1.f2 + FROM ( SELECT * FROM t1 ) AS sq1 + WHERE EXISTS ( SELECT * FROM t1 AS sq2 + WHERE sq1.`pk` IN ( SELECT f1 FROM t1 ) AND sq2.f1 = sq1.f1 ); + +set @optimizer_switch_save=@@optimizer_switch; + +set optimizer_switch='exists_to_in=off'; +eval explain extended $q; +eval $q; +set optimizer_switch='exists_to_in=on'; +eval explain extended $q; +eval $q; + +set optimizer_switch= @optimizer_switch_save; + +DROP TABLE t1; + --echo # End of 10.0 tests #restore defaults diff --git a/mysql-test/t/subselect_innodb.test b/mysql-test/t/subselect_innodb.test index b26c5036f3f..544bcd994ed 100644 --- a/mysql-test/t/subselect_innodb.test +++ b/mysql-test/t/subselect_innodb.test @@ -502,6 +502,27 @@ set join_cache_level = default; drop view v1; drop table t1,t2; +--echo # +--echo # MDEV-10693: cost-based choice between materialization and in-to-exists +--echo # for a subquery from the expression used in ref access +--echo # + +--source include/have_innodb.inc + +CREATE TABLE t1 (i1 INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1),(2); + +CREATE TABLE t2 (i2 INT) ENGINE=InnoDB; + +CREATE TABLE t3 (i3 INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t3 VALUES (3); + +SELECT * FROM t1 + WHERE NULL IN ( SELECT i2 FROM t2 + WHERE i1 IN ( i2 IN ( SELECT i3 FROM t3 ) ) AND i2 = 2 ); + +DROP TABLE t1,t2,t3; + --echo # --echo # MDEV-6041: ORDER BY+subqueries: subquery_table.key=outer_table.col is not recongized as binding --echo # @@ -555,3 +576,38 @@ from t1; drop table t1,t2; + +--echo # +--echo # mdev-12931: semi-join in ON expression of STRAIGHT_JOIN +--echo # joining a base table and a mergeable derived table +--echo # + +CREATE TABLE t1 (f1 int) ENGINE=InnoDB; +INSERT INTO t1 VALUES (3),(2); + +CREATE TABLE t2 (f2 int) ENGINE=InnoDB; +INSERT INTO t2 VALUES (1),(4); + +CREATE TABLE t3 (f3 int) ENGINE=InnoDB; +INSERT INTO t3 VALUES (5),(6); + +CREATE TABLE t4 (f4 int) ENGINE=InnoDB; +INSERT INTO t4 VALUES (1),(8); + +SELECT * +FROM t1 + INNER JOIN + ( t2 STRAIGHT_JOIN ( SELECT * FROM t3 ) AS sq + ON ( 1 IN ( SELECT f4 FROM t4 ) ) ) + ON ( f1 >= f2 ); + +EXPLAIN EXTENDED +SELECT * +FROM t1 + INNER JOIN + ( t2 STRAIGHT_JOIN ( SELECT * FROM t3 ) AS sq + ON ( 1 IN ( SELECT f4 FROM t4 ) ) ) + ON ( f1 >= f2 ); + +DROP TABLE t1,t2,t3,t4; + diff --git a/mysql-test/t/subselect_mat_cost_bugs.test b/mysql-test/t/subselect_mat_cost_bugs.test index 8205e94b203..35f2b9588fe 100644 --- a/mysql-test/t/subselect_mat_cost_bugs.test +++ b/mysql-test/t/subselect_mat_cost_bugs.test @@ -406,6 +406,8 @@ drop table t3, t4, t5; --echo # LP BUG#858038 The result of a query with NOT IN subquery depends on the state of the optimizer switch --echo # +set @optimizer_switch_save= @@optimizer_switch; + create table t1 (c1 char(2) not null, c2 char(2)); create table t2 (c3 char(2), c4 char(2)); @@ -424,3 +426,100 @@ explain select * from t1 where c1 = 'a2' and (c1, c2) not in (select * from t2); select * from t1 where c1 = 'a2' and (c1, c2) not in (select * from t2); drop table t1, t2; + +set optimizer_switch= @optimizer_switch_save; + +--echo # +--echo # MDEV-12673: cost-based choice between materialization and in-to-exists +--echo # + +CREATE TABLE t1 ( + pk1 int, a1 varchar(3), b1 varchar(3), PRIMARY KEY (pk1), KEY(a1), KEY(b1) +) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1,'foo','bar'),(2,'bar','foo'); + +CREATE TABLE t2 (pk2 INT PRIMARY KEY, a2 VARCHAR(3), KEY(a2)) ENGINE=MyISAM; +INSERT INTO t2 VALUES (1,'abc'),(2,'xyz'),(3,'foo'); + +SELECT 'qux' IN ( SELECT a1 FROM t1 INNER JOIN t2 WHERE a2 = b1 AND pk2 = 3 ); +SELECT 'bar' IN ( SELECT a1 FROM t1 INNER JOIN t2 WHERE a2 = b1 AND pk2 = 3 ); +EXPLAIN +SELECT 'bar' IN ( SELECT a1 FROM t1 INNER JOIN t2 WHERE a2 = b1 AND pk2 = 3 ); + +DROP TABLE t1,t2; + +CREATE TABLE t1 (i1 INT) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1); + +CREATE TABLE t2 (i2 int, c2 varchar(3), KEY(i2,c2)) ENGINE=MyISAM; +INSERT INTO t2 VALUES (1,'abc'),(2,'foo'); + +CREATE TABLE t3 (pk3 int PRIMARY KEY, c3 varchar(3)) ENGINE=MyISAM; +INSERT INTO t3 VALUES (1,'foo'),(2,'bar'); + +SELECT * FROM t1 WHERE i1 NOT IN ( + SELECT i2 FROM t2 RIGHT JOIN t3 ON (c3 = c2) WHERE pk3 = i1 +); + +EXPLAIN +SELECT * FROM t1 WHERE i1 NOT IN ( + SELECT i2 FROM t2 RIGHT JOIN t3 ON (c3 = c2) WHERE pk3 = i1 +); + +DROP TABLE t1,t2,t3; + +--echo # +--echo # MDEV-7599: in-to-exists chosen after min/max optimization +--echo # + +set @optimizer_switch_save= @@optimizer_switch; + +CREATE TABLE t1 (a INT, KEY(a)) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1),(2); + +CREATE TABLE t2 (b INT, c INT) ENGINE=MyISAM; +INSERT INTO t2 VALUES (1,6),(2,4), (8,9); + +let $q= +SELECT * FROM t2 WHERE b != ALL (SELECT MIN(a) FROM t1, t2 WHERE t2.c = t2.b); + +eval $q; +eval EXPLAIN EXTENDED $q; +set optimizer_switch= 'materialization=off'; +eval $q; +eval EXPLAIN EXTENDED $q; +set optimizer_switch= @optimizer_switch_save; + +DROP TABLE t1,t2; + +CREATE TABLE t1 (f1 varchar(10)) ENGINE=MyISAM; +INSERT INTO t1 VALUES ('foo'),('bar'); + +CREATE TABLE t2 (f2 varchar(10), key(f2)) ENGINE=MyISAM; +INSERT INTO t2 VALUES ('baz'),('qux'); + +CREATE TABLE t3 (f3 varchar(10)) ENGINE=MyISAM; +INSERT INTO t3 VALUES ('abc'),('def'); + +SELECT * FROM t1 + WHERE f1 = ALL( SELECT MAX(t2a.f2) + FROM t2 AS t2a INNER JOIN t2 t2b INNER JOIN t3 + ON (f3 = t2b.f2) ); + +DROP TABLE t1,t2,t3; + +--echo # +--echo # MDEV-12963: min/max optimization optimizing away all tables employed +--echo # for uncorrelated IN subquery used in a disjunct of WHERE +--echo # + +create table t1 (a int, index idx(a)) engine=myisam; +insert into t1 values (4),(7),(1),(3),(9); + +select * from t1 where a in (select max(a) from t1 where a < 4) or a > 5; +explain +select * from t1 where a in (select max(a) from t1 where a < 4) or a > 5; + +drop table t1; + + diff --git a/mysql-test/t/subselect_nulls.test b/mysql-test/t/subselect_nulls.test index 4b08e773b17..3e7b2189ed5 100644 --- a/mysql-test/t/subselect_nulls.test +++ b/mysql-test/t/subselect_nulls.test @@ -97,3 +97,9 @@ set optimizer_switch= @tmp_subselect_nulls; drop table x1; drop table x2; + +# +# MDEV-7339 Server crashes in Item_func_trig_cond::val_int +# +select (select 1, 2) in (select 3, 4); +select (select NULL, NULL) in (select 3, 4); diff --git a/mysql-test/t/subselect_sj.test b/mysql-test/t/subselect_sj.test index b6d6e0a5172..f90f1e2e927 100644 --- a/mysql-test/t/subselect_sj.test +++ b/mysql-test/t/subselect_sj.test @@ -2773,5 +2773,77 @@ WHERE ( SELECT z.country drop table t1, t2, t3; set optimizer_switch= @tmp_mdev6859; +--echo # +--echo # MDEV-12675: subquery subject to semi-join optimizations +--echo # in ON expression of INNER JOIN +--echo # + +set @tmp_mdev12675=@@optimizer_switch; +set optimizer_switch=default; +create table t1 (a int) engine=myisam; +insert into t1 values (5),(3),(2),(7),(2),(5),(1); +create table t2 (b int, index idx(b)) engine=myisam; +insert into t2 values (2),(3),(2),(1),(3),(4); +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +insert into t2 select b+10 from t2; +analyze table t1,t2; + +explain +select a from t1, t2 where b between 1 and 2 and a in (select b from t2); +explain +select a from t1 join t2 on b between 1 and 2 and a in (select b from t2); + +drop table t1,t2; +set optimizer_switch= @tmp_mdev12675; + +--echo # +--echo # MDEV-12817: subquery NOT subject to semi-join optimizations +--echo # in ON expression of INNER JOIN +--echo # + +CREATE TABLE t1 (c1 int) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1),(2); + +CREATE TABLE t2 (c2 int) ENGINE=MyISAM; +INSERT INTO t2 VALUES (3),(4); + +CREATE TABLE t3 (c3 int) ENGINE=MyISAM; +INSERT INTO t3 VALUES (5),(6); + +CREATE TABLE t4 (c4 int) ENGINE=MyISAM; +INSERT INTO t4 VALUES (7),(8); + +let $q1= +SELECT c1 +FROM t1 +LEFT JOIN +( t2 INNER JOIN t3 ON ( 1 IN ( SELECT c4 FROM t4 ) ) ) +ON (c1 = c3); + +eval $q1; +eval EXPLAIN EXTENDED $q1; + +let $q2= +SELECT * +FROM t1 +LEFT JOIN +( ( SELECT * FROM t2 WHERE c2 IN ( SELECT c3 FROM t3 ) ) AS sq INNER JOIN t4 ) +ON (c1 = c2); + +--echo # mdev-12820 +eval $q2; +eval EXPLAIN EXTENDED $q2; + +DROP TABLE t1,t2,t3,t4; + # The following command must be the last one the file set optimizer_switch=@subselect_sj_tmp; diff --git a/mysql-test/t/subselect_sj2_mat.test b/mysql-test/t/subselect_sj2_mat.test index 61d9b09edff..cfb6c8c2819 100644 --- a/mysql-test/t/subselect_sj2_mat.test +++ b/mysql-test/t/subselect_sj2_mat.test @@ -263,3 +263,43 @@ DROP TABLE t1,t2,t3; set join_cache_level= @save_join_cache_level; set optimizer_switch=@save_optimizer_switch; +--echo # +--echo # mdev-7791: materialization of a semi-join subquery + +--echo # RAND() in WHERE +--echo # (materialized table is accessed last) +--echo # + +set @save_optimizer_switch=@@optimizer_switch; +set optimizer_switch='materialization=on'; + +create table t1(i int); +insert into t1 values (1), (2), (3), (7), (9), (10); +create table t2(i int); +insert into t2 values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); + +select * from t1 where (rand() < 0) and i in (select i from t2); +explain extended +select * from t1 where (rand() < 0) and i in (select i from t2); + +drop table t1,t2; +set optimizer_switch=@save_optimizer_switch; + +--echo # +--echo # mdev-12855: materialization of a semi-join subquery + ORDER BY +--echo # + +CREATE TABLE t1 (f1 varchar(8), KEY(f1)) ENGINE=InnoDB; +INSERT INTO t1 VALUES ('qux'),('foo'); +CREATE TABLE t2 (f2 varchar(8)) ENGINE=InnoDB; +INSERT INTO t2 VALUES ('bar'),('foo'),('qux'); + +let $q= +SELECT f1 FROM t1 +WHERE f1 IN ( SELECT f2 FROM t2 WHERE f2 > 'bar' ) +HAVING f1 != 'foo' +ORDER BY f1; + +eval $q; +eval explain $q; + +DROP TABLE t1,t2; diff --git a/mysql-test/t/subselect_sj_mat.test b/mysql-test/t/subselect_sj_mat.test index e20291cfa67..bfd3b28a5b2 100644 --- a/mysql-test/t/subselect_sj_mat.test +++ b/mysql-test/t/subselect_sj_mat.test @@ -1857,6 +1857,306 @@ execute stmt; drop table t1; +--echo # +--echo # MDEV-12429: IN subquery used in WHERE of EXISTS subquery +--echo # + +CREATE TABLE t1 ( + pk INT, f1 INT NOT NULL, f2 VARCHAR(3), f3 INT NULL, PRIMARY KEY(pk)) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1,1,'foo',8), (2,5,'bar',7); + +SELECT sq1.f2 FROM t1 AS sq1 + WHERE EXISTS ( SELECT * FROM t1 AS sq2 + WHERE sq1.`pk` IN ( SELECT f1 FROM t1 ) AND sq2.f1 = sq1.f1 ); + +set @save_optimizer_switch= @@optimizer_switch; + +set optimizer_switch='exists_to_in=off'; +EXPLAIN +SELECT sq1.f2 FROM t1 AS sq1 + WHERE EXISTS ( SELECT * FROM t1 AS sq2 + WHERE sq1.`pk` IN ( SELECT f1 FROM t1 ) AND sq2.f1 = sq1.f1 ); + +--echo # this checks the result set above +set optimizer_switch= 'materialization=off,semijoin=off'; +SELECT sq1.f2 FROM t1 AS sq1 + WHERE EXISTS ( SELECT * FROM t1 AS sq2 + WHERE sq1.`pk` IN ( SELECT f1 FROM t1 ) AND sq2.f1 = sq1.f1 ); + +set optimizer_switch= @save_optimizer_switch; + +DROP TABLE t1; + +--echo # +--echo # MDEV-12145: IN subquery used in WHERE of EXISTS subquery +--echo # + +CREATE TABLE t1 (f1 INT) ENGINE=MyISAM; +INSERT INTO t1 VALUES (4),(6); + +CREATE TABLE t2 (i2 INT, KEY(i2)) ENGINE=MyISAM; +INSERT INTO t2 VALUES (8),(7),(1); + +CREATE TABLE t3 (f3 INT, i3 INT, KEY(i3)) ENGINE=MyISAM; +INSERT INTO t3 VALUES (8,0),(6,3),(2,8),(3,8),(1,6),(0,0),(1,0),(1,5); + +set @save_optimizer_switch= @@optimizer_switch; + +set optimizer_switch='exists_to_in=off'; +SELECT * FROM t1 + WHERE EXISTS ( SELECT * FROM t2, t3 + WHERE i3 = i2 AND f1 IN ( SELECT f3 FROM t3 ) ); +EXPLAIN EXTENDED +SELECT * FROM t1 + WHERE EXISTS ( SELECT * FROM t2, t3 + WHERE i3 = i2 AND f1 IN ( SELECT f3 FROM t3 ) ); + +--echo # this checks the result set above +set optimizer_switch= 'materialization=off,semijoin=off'; +SELECT * FROM t1 + WHERE EXISTS ( SELECT * FROM t2, t3 + WHERE i3 = i2 AND f1 IN ( SELECT f3 FROM t3 ) ); + +set optimizer_switch= @save_optimizer_switch; + +DROP TABLE t1,t2,t3; + +--echo # +--echo # MDEV-9686: IN subquery used in WHERE of a subquery from select list +--echo # + +CREATE TABLE t1 (pk INT PRIMARY KEY, f1 INT); +INSERT INTO t1 VALUES (1, 4),(2, 3),(3, 3),(4, 6),(5, 3); + +CREATE TABLE t2 (f2 INT); +INSERT INTO t2 VALUES (1),(2),(3),(4),(5); + +--echo # t1.pk is always IN ( SELECT f2 FROM t2 ), +--echo # so the IN condition should be true for every row, +--echo # and thus COUNT(*) should always return 5 + +SELECT pk, f1, ( SELECT COUNT(*) FROM t2 + WHERE t1.pk IN ( SELECT f2 FROM t2 ) ) AS sq FROM t1; +EXPLAIN EXTENDED +SELECT pk, f1, ( SELECT COUNT(*) FROM t2 + WHERE t1.pk IN ( SELECT f2 FROM t2 ) ) AS sq FROM t1; + +--echo # this checks the result set above +set @save_optimizer_switch= @@optimizer_switch; +set optimizer_switch= 'materialization=off,semijoin=off'; +SELECT pk, f1, ( SELECT COUNT(*) FROM t2 + WHERE t1.pk IN ( SELECT f2 FROM t2 ) ) AS sq FROM t1; +set optimizer_switch= @save_optimizer_switch; + +DROP TABLE t1,t2; + +--echo # +--echo # mdev-12838: scan of materialized of semi-join subquery in join +--echo # + +set @save_optimizer_switch=@@optimizer_switch; + +CREATE TABLE t1 ( + dispatch_group varchar(32), + assignment_group varchar(32), + sys_id char(32), + PRIMARY KEY (sys_id), + KEY idx1 (dispatch_group), + KEY idx2 (assignment_group) +) ENGINE=MyISAM; + +CREATE TABLE t2 ( + ugroup varchar(32), + user varchar(32), + sys_id char(32), + PRIMARY KEY (sys_id), + KEY idx3 (ugroup), + KEY idx4 (user) +) ENGINE=MyISAM; + +CREATE TABLE t3 ( + type mediumtext, + sys_id char(32), + PRIMARY KEY (sys_id) +) ENGINE=MyISAM; + +--disable_query_log + +INSERT INTO t1 VALUES +('e5d9f63237232000158bbfc8bcbe5dbf','f304ae0037332000158bbfc8bcbe5d4f', +'5398c0e037003000158bbfc8bcbe5dbb'), +('69d9f63237232000158bbfc8bcbe5dcb','7172ea0037332000158bbfc8bcbe5db6', +'5c188ca037003000158bbfc8bcbe5dbc'), +('577ed708d773020058c92cf65e61037a','699708d4d773020058c92cf65e61037c', +'623a8cd4d773020058c92cf65e6103ea'), +('96fb652637232000158bbfc8bcbe5db4','df50316637232000158bbfc8bcbe5d23', +'6835bd6637232000158bbfc8bcbe5d21'), +('e1d9f63237232000158bbfc8bcbe5db8','96346e0037332000158bbfc8bcbe5daa', +'697880e037003000158bbfc8bcbe5dcd'), +('25d9f63237232000158bbfc8bcbe5dbe','f304ae0037332000158bbfc8bcbe5d4f', +'6a9804e037003000158bbfc8bcbe5d09'), +('96fb652637232000158bbfc8bcbe5db4','e08fad2637232000158bbfc8bcbe5d39', +'6d25f96637232000158bbfc8bcbe5d79'), +('e9d9f63237232000158bbfc8bcbe5dc6','7172ea0037332000158bbfc8bcbe5db6', +'702880e037003000158bbfc8bcbe5d94'), +('a5d9f63237232000158bbfc8bcbe5dca','f304ae0037332000158bbfc8bcbe5d4f', +'7188c0e037003000158bbfc8bcbe5d75'), +('65d9f63237232000158bbfc8bcbe5dc4','f304ae0037332000158bbfc8bcbe5d4f', +'778880e037003000158bbfc8bcbe5d9e'), +('a1d9f63237232000158bbfc8bcbe5dc3','7172ea0037332000158bbfc8bcbe5db6', +'7d0840e037003000158bbfc8bcbe5dde'), +('21d9f63237232000158bbfc8bcbe5db7','96346e0037332000158bbfc8bcbe5daa', +'7f6880e037003000158bbfc8bcbe5da7'), +('96fb652637232000158bbfc8bcbe5db4','ec70316637232000158bbfc8bcbe5d60', +'8025f96637232000158bbfc8bcbe5dd0'), +('3dd9f63237232000158bbfc8bcbe5dcc','7172ea0037332000158bbfc8bcbe5db6', +'823880e037003000158bbfc8bcbe5ded'), +('96fb652637232000158bbfc8bcbe5db4','7b10fd2637232000158bbfc8bcbe5d30', +'9a353d6637232000158bbfc8bcbe5dee'), +('75d9f63237232000158bbfc8bcbe5dd0','ebb4620037332000158bbfc8bcbe5d89', +'a558c0e037003000158bbfc8bcbe5d36'), +('6dd9f63237232000158bbfc8bcbe5db5','96346e0037332000158bbfc8bcbe5daa', +'bc78cca037003000158bbfc8bcbe5d74'), +('add9f63237232000158bbfc8bcbe5dc7','7172ea0037332000158bbfc8bcbe5db6', +'c53804a037003000158bbfc8bcbe5db8'), +('fdd9f63237232000158bbfc8bcbe5dcd','7864ae0037332000158bbfc8bcbe5db8', +'cfe740e037003000158bbfc8bcbe5de8'), +('96fb652637232000158bbfc8bcbe5db4','3120fd2637232000158bbfc8bcbe5d42', +'e2257d6637232000158bbfc8bcbe5ded'), +('3c3725e237232000158bbfc8bcbe5da1','96346e0037332000158bbfc8bcbe5daa', +'ee78c0e037003000158bbfc8bcbe5db5'), +('a9d9f63237232000158bbfc8bcbe5dc0','7172ea0037332000158bbfc8bcbe5db6', +'f00888a037003000158bbfc8bcbe5dd3'), +('29d9f63237232000158bbfc8bcbe5db9','7172ea0037332000158bbfc8bcbe5db6', +'fa0880e037003000158bbfc8bcbe5d70'), +('b1d9f63237232000158bbfc8bcbe5dcf','ebb4620037332000158bbfc8bcbe5d89', +'fa48c0e037003000158bbfc8bcbe5d28'); + +INSERT INTO t2 VALUES +('17801ac21b13200050fdfbcd2c0713e8','8e826bf03710200044e0bfc8bcbe5d86', +'14c19a061b13200050fdfbcd2c07134b'), +('577ed708d773020058c92cf65e61037a','931644d4d773020058c92cf65e61034c', +'339888d4d773020058c92cf65e6103aa'), +('df50316637232000158bbfc8bcbe5d23','92826bf03710200044e0bfc8bcbe5da9', +'3682f56637232000158bbfc8bcbe5d44'), +('b4f342b237232000158bbfc8bcbe5def','86826bf03710200044e0bfc8bcbe5d70', +'38e4c2b237232000158bbfc8bcbe5dea'), +('7b10fd2637232000158bbfc8bcbe5d30','8a826bf03710200044e0bfc8bcbe5d72', +'4442b56637232000158bbfc8bcbe5d43'), +('3120fd2637232000158bbfc8bcbe5d42','82826bf03710200044e0bfc8bcbe5d89', +'49d2396637232000158bbfc8bcbe5d12'), +('96fb652637232000158bbfc8bcbe5db4','86826bf03710200044e0bfc8bcbe5d79', +'4e3ca52637232000158bbfc8bcbe5d3e'), +('17801ac21b13200050fdfbcd2c0713e8','824fd523bf4320007a6d257b3f073963', +'58c19a061b13200050fdfbcd2c07134e'), +('699708d4d773020058c92cf65e61037c','901784d4d773020058c92cf65e6103da', +'5bc708d4d773020058c92cf65e6103d5'), +('75d9f63237232000158bbfc8bcbe5dd0','86826bf03710200044e0bfc8bcbe5d79', +'6b52cb7237232000158bbfc8bcbe5ded'), +('f253da061b13200050fdfbcd2c0713ab','8e826bf03710200044e0bfc8bcbe5d86', +'81045e061b13200050fdfbcd2c071373'), +('7b10fd2637232000158bbfc8bcbe5d30','8e826bf03710200044e0bfc8bcbe5d74', +'8c42b56637232000158bbfc8bcbe5d3f'), +('e5d9f63237232000158bbfc8bcbe5dbf','7a826bf03710200044e0bfc8bcbe5df5', +'a7acfe3237232000158bbfc8bcbe5d78'), +('8a5055c9c61122780043563ef53438e3','9ee1b13dc6112271007f9d0efdb69cd0', +'a9aff553c6112276015a8006174bee21'), +('8a4dde73c6112278017a6a4baf547aa7','9ee1b13dc6112271007f9d0efdb69cd0', +'a9b2f526c61122760003ae07349d294f'), +('aaccc971c0a8001500fe1ff4302de101','9ee1b13dc6112271007f9d0efdb69cd0', +'aacceed3c0a80015009069bba51c4e21'), +('65d9f63237232000158bbfc8bcbe5dc4','8d56406a0a0a0a6b004070b354aada28', +'ac1bfa3237232000158bbfc8bcbe5dc3'), +('b85d44954a3623120004689b2d5dd60a','97000fcc0a0a0a6e0104ca999f619e5b', +'b77bc032cbb00200d71cb9c0c24c9c45'), +('220f8e71c61122840197e57c33464f70','8d56406a0a0a0a6b004070b354aada28', +'b9b74f080a0a0b343ba75b95bdb27056'), +('e08fad2637232000158bbfc8bcbe5d39','82826bf03710200044e0bfc8bcbe5d80', +'be02756637232000158bbfc8bcbe5d8b'), +('ebb4620037332000158bbfc8bcbe5d89','7682abf03710200044e0bfc8bcbe5d25', +'c0122f4437732000158bbfc8bcbe5d7d'), +('96fb652637232000158bbfc8bcbe5db4','7a82abf03710200044e0bfc8bcbe5d27', +'c23ca52637232000158bbfc8bcbe5d3b'), +('22122b37c611228400f9ff91c857581d','9ee1b13dc6112271007f9d0efdb69cd0', +'d23bbf5dac14641866947512bde59dc5'), +('db53a9290a0a0a650091abebccf833c6','9ee1b13dc6112271007f9d0efdb69cd0', +'db54a0f60a0a0a65002c54dcb72b4f41'), +('e08fad2637232000158bbfc8bcbe5d39','8e826bf03710200044e0bfc8bcbe5d86', +'f602756637232000158bbfc8bcbe5d88'), +('699708d4d773020058c92cf65e61037c','8d59d601d7b3020058c92cf65e6103c2', +'f718a241d7b3020058c92cf65e610332'), +('df50316637232000158bbfc8bcbe5d23','9e826bf03710200044e0bfc8bcbe5da6', +'fe82f56637232000158bbfc8bcbe5d4e'), +('f972d6061b13200050fdfbcd2c0713e5','780395f0df031100a9e78b6c3df2631f', +'ff4395f0df031100a9e78b6c3df2637e'); + +INSERT INTO t3 VALUES +('87245e061b13200050fdfbcd2c0713cc','7172ea0037332000158bbfc8bcbe5db6'), +('74af88c6c611227d0066386e74dc853d','74ad1ff3c611227d01d25feac2af603f'), +('59e22fb137032000158bbfc8bcbe5d52','75d9f63237232000158bbfc8bcbe5dd0'), +('98906fb137032000158bbfc8bcbe5d65','781da52637232000158bbfc8bcbe5db8'), +('87245e061b13200050fdfbcd2c0713cc','7864ae0037332000158bbfc8bcbe5db8'), +('87245e061b13200050fdfbcd2c0713cc','7b10fd2637232000158bbfc8bcbe5d30'), +('59e22fb137032000158bbfc8bcbe5d52','81a880e037003000158bbfc8bcbe5df8'), +('74af88c6c611227d0066386e74dc853d','8a4cb6d4c61122780043b1642efcd52b'), +('1cb8ab9bff500200158bffffffffff62','8a4dde73c6112278017a6a4baf547aa7'), +('1cb8ab9bff500200158bffffffffff62','8a5055c9c61122780043563ef53438e3'), +('87245e061b13200050fdfbcd2c0713cc','96346e0037332000158bbfc8bcbe5daa'), +('59e22fb137032000158bbfc8bcbe5d52','96fb652637232000158bbfc8bcbe5db4'), +('59e22fb137032000158bbfc8bcbe5d52','a1d9f63237232000158bbfc8bcbe5dc3'), +('59e22fb137032000158bbfc8bcbe5d52','a5d9f63237232000158bbfc8bcbe5dca'), +('1cb8ab9bff500200158bffffffffff62','a715cd759f2002002920bde8132e7018'), +('59e22fb137032000158bbfc8bcbe5d52','a9d9f63237232000158bbfc8bcbe5dc0'), +('74af88c6c611227d0066386e74dc853d','aacb62e2c0a80015007f67f752c2b12c'), +('74af88c6c611227d0066386e74dc853d','aaccc971c0a8001500fe1ff4302de101'), +('59e22fb137032000158bbfc8bcbe5d52','add9f63237232000158bbfc8bcbe5dbb'), +('59e22fb137032000158bbfc8bcbe5d52','add9f63237232000158bbfc8bcbe5dc7'), +('59e22fb137032000158bbfc8bcbe5d52','b1d9f63237232000158bbfc8bcbe5dcf'), +('1cb8ab9bff500200158bffffffffff62','b85d44954a3623120004689b2d5dd60a'), +('1cb8ab9bff500200158bffffffffff62','b97e89b94a36231201676b73322a0311'), +('1cb8ab9bff500200158bffffffffff62','cfcbad03d711110050f5edcb9e61038f'), +('1cb8ab9bff500200158bffffffffff62','d625dccec0a8016700a222a0f7900d06'), +('1cb8ab9bff500200158bffffffffff62','db53580b0a0a0a6501aa37c294a2ba6b'), +('1cb8ab9bff500200158bffffffffff62','db53a9290a0a0a650091abebccf833c6'), +('1cb8ab9bff500200158bffffffffff62','dc0db135c332010016194ffe5bba8f23'), +('87245e061b13200050fdfbcd2c0713cc','df50316637232000158bbfc8bcbe5d23'), +('87245e061b13200050fdfbcd2c0713cc','e08fad2637232000158bbfc8bcbe5d39'), +('59e22fb137032000158bbfc8bcbe5d52','e1d9f63237232000158bbfc8bcbe5db8'), +('59e22fb137032000158bbfc8bcbe5d52','e5d9f63237232000158bbfc8bcbe5db4'), +('59e22fb137032000158bbfc8bcbe5d52','e5d9f63237232000158bbfc8bcbe5dbf'), +('59e22fb137032000158bbfc8bcbe5d52','e9d9f63237232000158bbfc8bcbe5dba'), +('59e22fb137032000158bbfc8bcbe5d52','e9d9f63237232000158bbfc8bcbe5dc6'), +('87245e061b13200050fdfbcd2c0713cc','ebb4620037332000158bbfc8bcbe5d89'), +('87245e061b13200050fdfbcd2c0713cc','ec70316637232000158bbfc8bcbe5d60'), +('87245e061b13200050fdfbcd2c0713cc','f253da061b13200050fdfbcd2c0713ab'), +('87245e061b13200050fdfbcd2c0713cc','f304ae0037332000158bbfc8bcbe5d4f'), +('98906fb137032000158bbfc8bcbe5d65','f972d6061b13200050fdfbcd2c0713e5'), +('59e22fb137032000158bbfc8bcbe5d52','fdd9f63237232000158bbfc8bcbe5dcd'); + +--enable_query_log + +let $q= +SELECT t1.assignment_group +FROM t1, t3 +WHERE t1.assignment_group = t3.sys_id AND + t1.dispatch_group IN + (SELECT t2.ugroup + FROM t2, t3 t3_i + WHERE t2.ugroup = t3_i.sys_id AND + t3_i.type LIKE '59e22fb137032000158bbfc8bcbe5d52' AND + t2.user = '86826bf03710200044e0bfc8bcbe5d79'); + +set optimizer_switch='materialization=off'; +eval explain $q; +eval $q; + +set optimizer_switch='materialization=on'; +eval explain $q; +eval $q; + +DROP TABLE t1,t2,t3; +set optimizer_switch=@save_optimizer_switch; + --echo # End of 5.5 tests --echo # --echo # MDEV-7220: Materialization strategy is not used for REPLACE ... SELECT diff --git a/mysql-test/t/symlink.test b/mysql-test/t/symlink.test index 065be302237..e17ea07ca3c 100644 --- a/mysql-test/t/symlink.test +++ b/mysql-test/t/symlink.test @@ -300,3 +300,19 @@ select create_options from information_schema.tables where table_name='t1'; create table t2 like t1; show create table t2; drop tables t1, t2; + +--echo # +--echo # Test for bug #25514146 DB_NAME IS IGNORED WHEN CREATING TABLE +--echo # WITH DATA DIRECTORY +--echo # + +--echo # Make sure we have no current database +CREATE DATABASE x; +USE x; +DROP DATABASE x; + +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +eval CREATE TABLE test.t1(id INT(11)) ENGINE MYISAM +DATA DIRECTORY "$MYSQLTEST_VARDIR/tmp"; + +DROP TABLE test.t1; diff --git a/mysql-test/t/tc_heuristic_recover.test b/mysql-test/t/tc_heuristic_recover.test new file mode 100644 index 00000000000..c9fa767c249 --- /dev/null +++ b/mysql-test/t/tc_heuristic_recover.test @@ -0,0 +1,106 @@ +# The test verifies a few server/engine recovery option combinations. +# Specifically, MDEV-13437,13438 are concerned with no crashes +# due to InnoDB being read-only during --tc-heuristic-recover=ROLLBACK|COMMIT. +# +# Initially the test commits a transaction and in the following proceeds +# throughout some phases. +# Within them the server is shut down and attempted to restart, to succeed +# that in the end. +# All this proves no crashes and effective rollback of the transaction. +# +--source include/have_innodb.inc +# The test logics really requires --log-bin. +--source include/have_binlog_format_mixed.inc +--source include/have_debug_sync.inc +--source include/not_embedded.inc + +call mtr.add_suppression("Can't init tc log"); +call mtr.add_suppression("Found 1 prepared transactions!"); +call mtr.add_suppression("Aborting"); + +# Now take a shapshot of the last time server options. +# +# The "restart" expect-file facility can't be engaged because the server +# having conflicting options may not succeed to boot up. +# Also notice $MYSQLD_CMD is too "static" being unaware of the actual options +# of the last (before shutdown or kill) server run. +# That's why $MYSQLD_LAST_CMD that allows for the server new start +# with more options appended to a stub set which is settled at this very point. +--let $mysqld_stub_cmd= $MYSQLD_LAST_CMD +--let $error_log= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let SEARCH_FILE= $error_log +set debug_sync='RESET'; + +CREATE TABLE t1 (i INT) ENGINE=InnoDB; +SET GLOBAL innodb_flush_log_at_trx_commit=1; +FLUSH TABLES; # we need the table post crash-restart, see MDEV-8841. + +# Run transaction in a separate "prey" connection +--connect (con1,localhost,root,,) +# The signal won't arrive though +set debug_sync='ha_commit_trans_after_prepare WAIT_FOR go'; +--send INSERT INTO t1 VALUES (1); + +--connection default + +--let $table= information_schema.processlist +--let $where= where state = 'debug sync point: ha_commit_trans_after_prepare' +--let $wait_condition= SELECT count(*) = 1 FROM $table $where +--source include/wait_condition.inc + +--echo # Prove that no COMMIT or ROLLBACK occurred yet. +SELECT * FROM t1; +SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +SELECT * FROM t1; + +# TODO: MDEV-12700 Allow innodb_read_only startup without prior slow shutdown. +--source include/kill_mysqld.inc +--let $restart_parameters= --innodb-force-recovery=4 +--source include/fail_start_mysqld.inc + +--let SEARCH_PATTERN= was in the XA prepared state +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN= Found 1 prepared transactions! +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN= \\[ERROR\\] Can\\'t init tc log +--source include/search_pattern_in_file.inc + +--let $restart_parameters= --innodb-force-recovery=4 --tc-heuristic-recover=COMMIT +--source include/fail_start_mysqld.inc +--let SEARCH_PATTERN= was in the XA prepared state +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN= Found 1 prepared transactions! +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN= \\[ERROR\\] Can\\'t init tc log +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN= Please restart mysqld without --tc-heuristic-recover +--source include/search_pattern_in_file.inc + +--let $restart_parameters= --tc-heuristic-recover=ROLLBACK +--source include/fail_start_mysqld.inc + +--let SEARCH_PATTERN= was in the XA prepared state +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN= Found 1 prepared transactions! +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN= \\[ERROR\\] Can\\'t init tc log +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN= Please restart mysqld without --tc-heuristic-recover +--source include/search_pattern_in_file.inc + +--let $restart_parameters= +--source include/start_mysqld.inc + +--let SEARCH_PATTERN= was in the XA prepared state +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN= Found 1 prepared transactions! +--source include/search_pattern_in_file.inc + +SET TRANSACTION ISOLATION LEVEL READ COMMITTED; +SELECT * FROM t1; +SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +SELECT * FROM t1; +# +# Cleanup +# +DROP TABLE t1; diff --git a/mysql-test/t/trigger.test b/mysql-test/t/trigger.test index 83b6966c676..5c65e3dd13b 100644 --- a/mysql-test/t/trigger.test +++ b/mysql-test/t/trigger.test @@ -2676,3 +2676,27 @@ select trigger_name, action_order, created from information_schema.triggers where event_object_table = 't1' and trigger_schema='test'; drop table t1; set time_zone= @@global.time_zone; + +--echo # +--echo # MDEV-12992: Increasing memory consumption +--echo with each invocation of trigger +--echo # + +--let $n= 20000 + +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1); +CREATE TABLE t2 (b INT); +CREATE TRIGGER tr + AFTER UPDATE ON t1 FOR EACH ROW SELECT (SELECT b FROM t2) INTO @x; + +--disable_query_log +--echo # Running $n queries +while ($n) +{ + UPDATE t1 SET a = 2; + --dec $n +} +--enable_query_log + +DROP TABLE t1,t2; diff --git a/mysql-test/t/type_json.test b/mysql-test/t/type_json.test new file mode 100644 index 00000000000..0cff9366145 --- /dev/null +++ b/mysql-test/t/type_json.test @@ -0,0 +1,31 @@ +# +# MDEV-9144 JSON data type +# + +create or replace table t1(a json); +show create table t1; + +--error ER_PARSE_ERROR +create or replace table t1(a json character set utf8); + +create or replace table t1(a json default '{a:1}'); +show create table t1; + +create or replace table t1(a json not null check (json_valid(a))); +show create table t1; +insert t1 values ('[]'); +--error ER_CONSTRAINT_FAILED +insert t1 values ('a'); + +set timestamp=unix_timestamp('2010:11:12 13:14:15'); +create or replace table t1(a json default(json_object('now', now()))); +show create table t1; +insert t1 values (); +select * from t1; + +drop table t1; + +--error ER_PARSE_ERROR +select cast('{a:1}' as text); +--error ER_PARSE_ERROR +select cast('{a:1}' as json); diff --git a/mysql-test/t/type_num.test b/mysql-test/t/type_num.test index 87f5cc609d9..cc715d6cda2 100644 --- a/mysql-test/t/type_num.test +++ b/mysql-test/t/type_num.test @@ -678,10 +678,6 @@ SELECT # CAST('1e1000' AS DOUBLE); ---echo # ---echo # End of 10.0 tests ---echo # - --echo # --echo # Start of 10.1 tests --echo # @@ -701,7 +697,25 @@ SELECT NULL+1 AS c0, --disable_metadata --enable_ps_protocol +--echo # +--echo # Start of 10.2 tests +--echo # ---echo # ---echo # Start of 10.1 tests ---echo # +# +# MDEV-8659 Conflicting declaration is accepted: INT SIGNED ZEROFILL +# +--error ER_PARSE_ERROR +CREATE TABLE t1 (a INT SIGNED ZEROFILL); +--error ER_PARSE_ERROR +CREATE TABLE t1 (a INT SIGNED UNSIGNED); +--error ER_PARSE_ERROR +CREATE TABLE t1 (a INT ZEROFILL UNSIGNED ZEROFILL); + +# documented syntax: +CREATE OR REPLACE TABLE t1 (a INT SIGNED); +CREATE OR REPLACE TABLE t1 (a INT UNSIGNED); +CREATE OR REPLACE TABLE t1 (a INT ZEROFILL); +# not documented, supported for backward compatibility +CREATE OR REPLACE TABLE t1 (a INT UNSIGNED ZEROFILL); +CREATE OR REPLACE TABLE t1 (a INT ZEROFILL UNSIGNED); +DROP TABLE t1; diff --git a/mysql-test/t/union.test b/mysql-test/t/union.test index e0c011e3d20..65e2656c267 100644 --- a/mysql-test/t/union.test +++ b/mysql-test/t/union.test @@ -1405,6 +1405,20 @@ drop table t1; --echo End of 5.0 tests +# +# Bug #24595639: INCORRECT BEHAVIOR IN QUERY WITH UNION AND GROUP BY +# +create table t1 (a int, b int); +insert into t1 values (1,1),(2,2),(3,3); +create table t2 (c varchar(30), d varchar(30)); +insert into t1 values ('1','1'),('2','2'),('4','4'); +create table t3 (e int, f int); +insert into t3 values (1,1),(2,2),(31,31),(32,32); +select e,f, (e , f) in (select e,b from t1 union select c,d from t2) as sub from t3; +select avg(f), (e , f) in (select e,b from t1 union select c,d from t2) as sub from t3 group by sub; +drop table t1,t2,t3; + +--echo End of 5.5 tests --echo # --echo # WL#1763 Avoid creating temporary table in UNION ALL @@ -1507,3 +1521,28 @@ SELECT * FROM t1 t1_1 LEFT JOIN t1 t1_2 ON ( t1_2.b = t1_1.a ) WHERE t1_2.b NOT IN ( SELECT 4 UNION ALL SELECT 5 ); DROP TABLE t1; + +--echo # +--echo # Bug mdev-12788: UNION ALL + impossible having for derived +--echo # with IN subquery in WHERE +--echo # + +CREATE TABLE t1 (i int) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1); + +CREATE TABLE t2 (pk int PRIMARY KEY) ENGINE=MyISAM; +INSERT INTO t2 VALUES (1),(2); + +let $q= +SELECT 1, 2 +UNION ALL +SELECT i, COUNT(*) FROM ( + SELECT * FROM t1 WHERE i IN ( SELECT pk FROM t2 ) +) AS sq +GROUP BY i +HAVING i = 10; + +eval $q; +eval EXPLAIN EXTENDED $q; + +DROP TABLE t1,t2; diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index bab640e1371..a9764bf0668 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -5569,6 +5569,19 @@ select * drop view v1; drop table t1,t2,t3; +--echo # +--echo # MDEV-11240: Server crashes in check_view_single_update or +--echo # Assertion `derived->table' failed in mysql_derived_merge_for_insert +--echo # + +CREATE TABLE t3 (a INT); +CREATE ALGORITHM = MERGE VIEW v1 AS SELECT t2.a FROM t3 AS t1, t3 AS t2; +CREATE ALGORITHM = MERGE VIEW v2 AS SELECT * FROM v1; +--error ER_VIEW_NO_INSERT_FIELD_LIST +PREPARE stmt FROM 'REPLACE INTO v2 SELECT a FROM t3'; +drop view v1,v2; +drop table t3; + --echo # ----------------------------------------------------------------- --echo # -- End of 5.5 tests. --echo # ----------------------------------------------------------------- @@ -5818,6 +5831,55 @@ SELECT * FROM v1 where use_case_id = 10; drop view v1; drop table t1; +--echo # +--echo # MDEV-12666: CURRENT_ROLE() and DATABASE() does not work in a view +--echo # +--echo # DATABASE() fails only when the initial view creation features a NULL +--echo # default database. +--echo # +--echo # CREATE, USE and DROP database so that we have no "default" database. +--echo # +CREATE DATABASE temporary; +USE temporary; +DROP DATABASE temporary; +SELECT DATABASE(); + +CREATE VIEW test.v_no_db AS SELECT DATABASE() = 'temporary_two'; +SHOW CREATE VIEW test.v_no_db; +PREPARE prepared_no_database FROM "SELECT DATABASE() = 'temporary_two'"; + +--echo # +--echo # All statements should return NULL +--echo # +EXECUTE prepared_no_database; +SELECT DATABASE() = 'temporary_two'; +SELECT * FROM test.v_no_db; + +CREATE DATABASE temporary_two; +USE temporary_two; +CREATE VIEW test.v_with_db AS SELECT DATABASE() = 'temporary_two'; +PREPARE prepared_with_database FROM "SELECT DATABASE() = 'temporary_two'"; + +--echo # +--echo # All statements should return 1; +--echo # +SELECT DATABASE() = 'temporary_two'; +SELECT * FROM test.v_no_db; +SELECT * FROM test.v_with_db; +EXECUTE prepared_with_database; + +--echo # +--echo # Prepared statements maintain default database to be the same +--echo # during on creation so this should return NULL still. +--echo # See MySQL bug #25843 +--echo # +EXECUTE prepared_no_database; + +DROP DATABASE temporary_two; +DROP VIEW test.v_no_db; +DROP VIEW test.v_with_db; +USE test; + --echo # ----------------------------------------------------------------- --echo # -- End of 10.0 tests. --echo # ----------------------------------------------------------------- @@ -5892,6 +5954,27 @@ SELECT * FROM v1; drop view v1; drop table t1; +--echo # +--echo # MDEV-12819: order by ordering expression changed to empty string +--echo # when creatin view with union +--echo # + +create table t1 (t1col1 int, t1col2 int,t1col3 int ); +create table t2 (t2col1 int, t2col2 int, t2col3 int); + +create view v1 as +select t1col1,t1col2,t1col3 from t1 +union all +select t2col1,t2col2,t2col3 from t2 +order by 2,3; + +show create view v1; + +select * from v1; + +drop view v1; +drop table t1,t2; + --echo # --echo # End of 10.1 tests --echo # @@ -6198,6 +6281,90 @@ DROP TABLE IF EXISTS t; SHOW CREATE VIEW v; DROP VIEW v; +--echo # +--echo # MDEV-13439: Database permissions are not enough to run a subquery +--echo # with GROUP BY within a view +--echo # + +create database test_db; +use test_db; +create table t (i int); + +create user foo@localhost; +grant all on test_db.* to foo@localhost; + +--connect (con1,localhost,foo,,) + +use test_db; +create view v as select * from (select i from t group by i) sq; +select * from v; + +# Cleanup +--disconnect con1 +--connection default +use test; +drop database test_db; +drop user foo@localhost; + +--echo # +--echo # MDEV-13523: Group By in a View, called within a Stored Routine +--echo # causes Error Code 1356 when a non-root user runs the routine for +--echo # a second time +--echo # + +CREATE DATABASE bugTest; +USE bugTest; + +CREATE TABLE `procViewTable` (`id` int(10), `someText` varchar(50) NOT NULL); +insert into `procViewTable` values (1,'Test'), (2,'Test 2'); + +CREATE USER 'procView'@'%'; +GRANT ALL PRIVILEGES ON `bugTest`.* TO 'procView'@'%'; + +CREATE DEFINER=`procView`@`%` VIEW `procViewSimple` AS ( + select * from ( + select `id` from `bugTest`.`procViewTable` + ) `innerQuery` + group by `innerQuery`.`id` +); + +--connect (con1,localhost,procView,,) +use bugTest; + +prepare stmt from "SELECT * FROM procViewSimple"; +execute stmt; +execute stmt; + +# Cleanup +--disconnect con1 +--connection default +drop user procView; +drop view procViewSimple; +drop table procViewTable; +use test; +drop database bugTest; + +--echo # +--echo # MDEV-13436: PREPARE doesn't work as expected & throws errors but +--echo # MySQL is working fine +--echo # + +create table t1 (a int); +insert into t1 values (1),(2); +SET @sql_query = " + CREATE VIEW v1 AS + SELECT * FROM ( + SELECT CASE WHEN 1 IN (SELECT a from t1 where a < 2) THEN TRUE END AS testcase + ) testalias +"; +PREPARE stmt FROM @sql_query; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; +show create view v1; +SELECT * FROM v1; +drop view v1; +drop table t1; + --echo # --echo # End of 10.2 tests --echo # diff --git a/mysql-test/t/wait_timeout.test b/mysql-test/t/wait_timeout.test index 4ece5fd1749..84841aabb8b 100644 --- a/mysql-test/t/wait_timeout.test +++ b/mysql-test/t/wait_timeout.test @@ -122,10 +122,22 @@ SELECT 3; eval SET @@global.wait_timeout= $start_value; disconnect con1; - -# The last connect is to keep tools checking the current test happy. connect (default,localhost,root,,test,,); +# +# MDEV-7775 Wrong error message (Unknown error) when idle sessions are killed after wait_timeout +# +set global log_warnings=2; +connect (foo,localhost,root); +set @@wait_timeout=1; +sleep 2; +connection default; +let SEARCH_FILE=$MYSQLTEST_VARDIR/log/mysqld.1.err; +let SEARCH_PATTERN= Aborted.*Got timeout reading communication packets; +source include/search_pattern_in_file.inc; +set global log_warnings=@@log_warnings; + + # Wait till all disconnects are completed --source include/wait_until_count_sessions.inc diff --git a/mysql-test/t/wait_timeout_not_windows.test b/mysql-test/t/wait_timeout_not_windows.test deleted file mode 100644 index 50731779845..00000000000 --- a/mysql-test/t/wait_timeout_not_windows.test +++ /dev/null @@ -1,15 +0,0 @@ -source include/not_embedded.inc; -source include/not_windows.inc; - -# -# MDEV-7775 Wrong error message (Unknown error) when idle sessions are killed after wait_timeout -# -set global log_warnings=2; -connect (foo,localhost,root); -set @@wait_timeout=1; -sleep 2; -connection default; -let SEARCH_FILE=$MYSQLTEST_VARDIR/log/mysqld.1.err; -let SEARCH_PATTERN= Aborted.*Got timeout reading communication packets; -source include/search_pattern_in_file.inc; -set global log_warnings=@@log_warnings; diff --git a/mysql-test/t/win.test b/mysql-test/t/win.test index 82c1dadf5ad..3dedc1227fd 100644 --- a/mysql-test/t/win.test +++ b/mysql-test/t/win.test @@ -1856,3 +1856,112 @@ from ) q; drop table t1; + +--echo # +--echo # MDEV-11990: window function over min/max aggregation +--echo # + +create table t1 (id int); +insert into t1 values (1), (2), (3), (2), (4), (2); + +select sum(max(id)) over (order by max(id)) from t1; +explain +select sum(max(id)) over (order by max(id)) from t1; + +create index idx on t1(id); +select sum(max(id)) over (order by max(id)) from t1; +explain +select sum(max(id)) over (order by max(id)) from t1; +select sum(max(id)) over (order by max(id)) from t1 where id < 3; +select count(max(id)) over (order by max(id)) from t1 where id < 3; +select max(id), rank() over (order by max(id)) from t1 where id < 3; + +drop table t1; + +--echo # +--echo # main.win failure post MDEV-12336 +--echo # +create table t(a decimal(35,10), b int); +insert into t values (1, 10), (2, 20), (3, 30); + +prepare stmt from "SELECT (CASE WHEN sum(t.a) over (partition by t.b)=1 THEN 1000 ELSE 300 END) AS a FROM t"; +execute stmt; +drop table t; + +--echo # +--echo # MDEV-12851 case with window functions query crashes server +--echo # + +create table t1(dt datetime); +insert into t1 values ('2017-05-17'), ('2017-05-18'); +select dt, + case when (max(dt) over (order by dt rows between 1 following and 1 following) is null) + then '9999-12-31 12:00:00' + else max(dt) over (order by dt rows between 1 following and 1 following) + end x, + case when (max(dt) over (order by dt rows between 1 following and 1 following) is not null) + then '9999-12-31 12:00:00' + else max(dt) over (order by dt rows between 1 following and 1 following) + end x +from t1; + +drop table t1; + +create table t1(i int); +insert into t1 values (null),(1),(2); +select max(i) over (order by i), + max(i) over (order by i) is null, + max(i) over (order by i) is not null +from t1; +drop table t1; + +--echo # +--echo # MDEV-13189: Window functions crash when using INTERVAL function +--echo # +create table t1(i int); +insert into t1 values (1),(2),(10),(20),(30); +select sum(i) over (order by i), interval(sum(i) over (order by i), 10, 20) +from t1; +drop table t1; + +--echo # +--echo # MDEV-13352: Server crashes in st_join_table::remove_duplicates +--echo # +CREATE TABLE t1 (i INT); +INSERT INTO t1 VALUES (1),(2); +SELECT DISTINCT ROW_NUMBER() OVER(), i FROM t1 WHERE 0; +SELECT ROW_NUMBER() OVER(), i FROM t1 WHERE 0; +DROP TABLE t1; + +--echo # +--echo # MDEV-13344: Server crashes in in AGGR_OP::put_record on subquery +--echo # with window function and constant table +--echo # (Testcase only) +--echo # +CREATE TABLE t1 (c CHAR(8)) ENGINE=MyISAM; +INSERT IGNORE INTO t1 VALUES ('foo'); +SELECT ('bar',1) IN ( SELECT c, ROW_NUMBER() OVER (PARTITION BY c) FROM t1); +DROP TABLE t1; + +--echo # +--echo # MDEV-13351: Server crashes in st_select_lex::set_explain_type upon UNION with window function +--echo # +CREATE TABLE t1 (i INT); +INSERT INTO t1 VALUES (1),(2); +SELECT Nth_value(i,1) OVER() FROM t1 +UNION ALL +( SELECT Nth_value(i,2) OVER() FROM t1 LIMIT 0 ) +; +DROP TABLE t1; + +--echo # +--echo # A regression after MDEV-13351: +--echo # MDEV-13374 : Server crashes in first_linear_tab / st_select_lex::set_explain_type +--echo # upon UNION with aggregate function +--echo # + +CREATE TABLE t1 (i INT) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1),(2); +SELECT i AS fld FROM t1 UNION SELECT COUNT(*) AS fld FROM t1; +DROP TABLE t1; + diff --git a/mysql-test/t/win_insert_select.test b/mysql-test/t/win_insert_select.test new file mode 100644 index 00000000000..66df7324c4f --- /dev/null +++ b/mysql-test/t/win_insert_select.test @@ -0,0 +1,79 @@ +CREATE TABLE t1 (c1 INT, c2 VARCHAR(30)); + +PREPARE populate_table FROM "INSERT into t1 values (1, 'manual_insert_1'), + (4, 'manual_insert_2')"; + +INSERT INTO t1 SELECT row_number() over(), "should_have_0" FROM t1; +INSERT INTO t1 SELECT 1 + row_number() over(), "should_have_2" FROM t1; + +EXECUTE populate_table; + +INSERT INTO t1 SELECT 10 + row_number() over(), "should repeat 4 times [11-14]" FROM t1; + +SELECT c1, c2 FROM t1 ORDER BY c2, c1; + +DELETE FROM t1; +EXECUTE populate_table; + + +INSERT INTO t1 + SELECT 10 + (dense_rank() over(order by c1)), "dense_rank_insert" from t1; + +SELECT c1, c2 FROM t1 ORDER BY c2, c1; + +DELETE FROM t1; +EXECUTE populate_table; + +INSERT INTO t1 + SELECT 100 + (rank() over(order by c1)), "rank_insert" from t1; + +SELECT c1, c2 FROM t1 ORDER BY c2, c1; + +DELETE FROM t1; +EXECUTE populate_table; + +INSERT INTO t1 + SELECT 100 + (ntile(10) over(order by c1)), "ntile_insert" from t1; + +SELECT c1, c2 FROM t1 ORDER BY c2, c1; + +DELETE FROM t1; +EXECUTE populate_table; + +INSERT INTO t1 + SELECT 1000 + (percent_rank() over(order by c1)), "percent_rank_insert" from t1; + +SELECT c1, c2 FROM t1 ORDER BY c2, c1; + +DELETE FROM t1; +EXECUTE populate_table; + +INSERT INTO t1 + SELECT 1000 + (count(*) over(order by c1)), "count_insert" from t1; + +SELECT c1, c2 FROM t1 ORDER BY c2, c1; + +DELETE FROM t1; +EXECUTE populate_table; + +--echo # +--echo # Test how avg interacts when the results need to be rounded. +--echo # +SELECT 1000 + (avg(c1) over(order by c1)) as avg_expr, c1, "This will be inserted into t1" from t1; + +INSERT INTO t1 + SELECT 1000 + (avg(c1) over(order by c1)), "avg_insert" from t1; + +SELECT c1, c2 FROM t1 ORDER BY c2, c1; + +DELETE FROM t1; +EXECUTE populate_table; + +INSERT INTO t1 + SELECT 1000 + (sum(c1) over(order by c1)), "sum_insert" from t1; + +SELECT c1, c2 +FROM t1 +ORDER BY c2, c1; + +DROP table t1; diff --git a/mysql-test/unstable-tests b/mysql-test/unstable-tests index 4812456839d..a03628bdea6 100644 --- a/mysql-test/unstable-tests +++ b/mysql-test/unstable-tests @@ -23,404 +23,500 @@ # ############################################################################## -main.alter_table : Modified in 10.1.22 -main.alter_table_trans : MDEV-11805 - timeout -main.analyze_format_json : MDEV-11866 - Wrong result; also uses analyze-format.inc modified in 10.1.22 -main.analyze_stmt_orderby : MDEV-11866 - Wrong result; also uses analyze-format.inc modified in 10.1.22 -main.analyze_stmt_slow_query_log : MDEV-12237 - Wrong result; also modified in 10.1.21 -main.cast : Modified in 10.1.21 -main.create : Modified in 10.1.21 -main.create_delayed : MDEV-10605 - failed with timeout -main.ctype_ucs : Modified in 10.1.21 -main.ctype_ucs2_def : Modified in 10.1.21 -main.ctype_ucs2_query_cache : Modified in 10.1.21 -main.ctype_utf16 : Modified in 10.1.21 -main.ctype_utf16_def : Modified in 10.1.21 -main.ctype_utf16le : MDEV-10675: timeout or extra warnings -main.ctype_utf32 : Modified in 10.1.21 -main.derived : Modified in 10.1.22 -main.drop_bad_db_type : Modified in 10.1.22 -main.events_restart : MDEV-12236 - Server shutdown problem -main.events_slowlog : Added in 10.1.21 -main.explain_json : Uses analyze-format.inc modified in 10.1.22 -main.explain_json_format_partitions : Uses analyze-format.inc modified in 10.1.22 -main.func_time : Modified in 10.1.21 -main.gis : Modified in 10.1.22 -main.grant : Modified in 10.1.22 -main.host_cache_size_functionality : MDEV-10606 - sporadic failure on shutdown -main.index_intersect_innodb : MDEV-10643 - failed with timeout -main.index_merge_innodb : MDEV-7142 - Wrong execution plan, also modified in 10.1.21 -main.information_schema_part : Modified in 10.1.21 -main.innodb_mysql_lock : MDEV-7861 - sporadic lock detection failure -main.join_cache : Modified in 10.1.21 -main.join_nested : MOdified in 10.1.22 -main.kill_processlist-6619 : MDEV-10793 - wrong result in processlist -main.loaddata : Modified in 10.1.21 -main.log_slow : Modified in 10.1.21 -main.mdev-504 : MDEV-10607 - sporadic "can't connect" -main.mdev375 : MDEV-10607 - sporadic "can't connect" -main.merge : MDEV-10607 - sporadic "can't connect" -main.mysqldump : Modified in 10.1.22 -main.mysqlslap : MDEV-11801 - timeout -main.mysqltest : MDEV-9269 - fails on Alpha -main.mysql_upgrade_noengine : MDEV-12233 - Wrong result; added in 10.1.22 -main.order_by : Modified in 10.1.21 -main.order_by_optimizer_innodb : MDEV-10683 - wrong execution plan -main.partition_column : Modified in 10.1.22 -main.partition_innodb : Modified in 10.1.22 -main.partition_myisam : Modified in 10.1.22 -main.pool_of_threads : Modified in 10.1.21 -main.ps : MDEV-11017 - sporadic wrong Prepared_stmt_count; also modified in 10.1.22 -main.range_vs_index_merge : Modified in 10.1.22 -main.repair_symlink-5543 : MDEV-12215 - Wrong error codes; also modified in 10.1.22 -main.show_explain : MDEV-10674 - sporadic failure -main.signal_demo3 : MDEV-11720 - Thread stack overrun on labrador -main.sp : Modified in 10.1.22 -main.sp-prelocking : Modified in 10.1.21 -main.sp-security : MDEV-10607 - sporadic "can't connect" -main.stat_tables_par : Modified in 10.1.22 -main.status : MDEV-8510 - sporadic wrong result -main.subselect : Modified in 10.1.21 -main.subselect2 : Modified in 10.1.21 -main.subselect4 : Modified in 10.1.22 -main.subselect_cache : Modified in 10.1.22 -main.subselect_innodb : MDEV-10614 - sporadic wrong results; also modified in 10.1.22 -main.subselect_no_exists_to_in : Uses subselect.test modified in 10.1.21 -main.subselect_no_mat : Uses subselect.test modified in 10.1.21 -main.subselect_no_opts : Uses subselect.test modified in 10.1.21 -main.subselect_no_scache : Uses subselect.test modified in 10.1.21 -main.subselect_no_semijoin : Uses subselect.test modified in 10.1.21 -main.symlink-aria-11902 : MDEV-12215 - Unexpected errors; also added in 10.1.22 -main.symlink-myisam-11902 : MDEV-12215 - Unexpected errors; also added in 10.1.22 -main.table_elim : Modified in 10.1.22 -main.trigger_null-8605 : Modified in 10.1.21 -main.trigger_no_defaults-11698 : Modified in 10.1.22 -main.type_datetime_hires : MDEV-10687 - timeout -main.type_newdecimal : Modified in 10.1.22 -main.union : Modified in 10.1.21 -main.update_innodb : Modified in 10.1.22 -main.view : Modified in 10.1.22 + +main.alter_table : Modified in 10.2.8 +main.alter_table_online : Modified in 10.2.8 +main.analyze_format_json : MDEV-11866 - Mismatch; modified in 10.2.8 +main.analyze_stmt_slow_query_log : MDEV-12237 - Wrong result +main.analyze_stmt_orderby : MDEV-11866 - Mismatch +main.binary_to_hex : Added in 10.2.8 +main.bootstrap : Modified in 10.2.7 +main.check_constraint : Modified in 10.2.8 +main.client_xml : Modified in 10.2.7 +main.count_distinct : Modified in 10.2.8 +main.create_drop_event : Modified in 10.2.8 +main.cte_nonrecursive : Modified in 10.2.7 +main.ctype_ucs : Modified in 10.2.7 +main.derived_cond_pushdown : Modified in 10.2.7 +main.derived_view : Modified in 10.2.7 +main.drop-no_root : MDEV-12633 - Valgrind +main.errors : Modified in 10.2.8 +main.events_2 : MDEV-13277 - Crash +main.func_concat : Modified in 10.2.7 +main.func_crypt : Modified in 10.2.7 +main.func_group : Modified in 10.2.7 +main.func_json : MDEV-11648 - Crash, valgrind; modified in 10.2.8 +main.func_regexp_pcre : MDEV-13412 - Crash; modified in 10.2.8 +main.gis : Modified in 10.2.8 +main.gis-json : Modified in 10.2.8 +main.group_by : Modified in 10.2.8 +main.index_merge_innodb : MDEV-7142 - Plan mismatch; include file modified in 10.2.8 +main.index_merge_myisam : Include file modified in 10.2.8 +main.innodb_ext_key : Modified in 10.2.7 +main.innodb_mysql_lock : MDEV-7861 - Wrong result +main.join_outer : Modified in 10.2.7 +main.kill-2 : MDEV-13257 - Wrong result +main.loadxml : Data file modified in 10.2.8 +main.log_slow : MDEV-13263 - Wrong result +main.mdl : Added in 10.2.7 +main.mdl_sync : Modified in 10.2.7 +main.myisam_debug : Modified in 10.2.7 +main.mysql : Modified in 10.2.7 +main.mysql_client_test : MDEV-12633 - Valgrind +main.mysql_client_test_comp : MDEV-12633 - Valgrind +main.mysql_client_test_nonblock : MDEV-12633 - Valgrind, CONC-208 - Error on Power +main.mysql_upgrade : Modified in 10.2.8 +main.mysql_upgrade_ssl : MDEV-13492 - Unknown SSL error +main.mysqlcheck : MDEV-12633 - Valgrind +main.mysqld--help : Modified in 10.2.8 +main.mysqld_option_err : MDEV-12747 - Timeout +main.mysqlhotcopy_myisam : MDEV-10995 - Hang on debug +main.mysqltest : Modified in 10.2.7 +main.openssl_1 : MDEV-13492 - Unknown SSL error +main.order_by : Modified in 10.2.7 +main.partition_alter : Modified in 10.2.7 +main.read_only : Modified in 10.2.8 +main.shm : MDEV-12727 - Mismatch, ERROR 2013 +main.show_check : MDEV-12633 - Valgrind +main.sp : MDEV-7866 - Mismatch; modified in 10.2.8 +main.sp-destruct : Modified in 10.2.8 +main.sp-security : Modified in 10.2.8 +main.ssl_7937 : MDEV-11546 - Timeout on Windows +main.ssl_ca : MDEV-10895 - SSL connection error on Power +main.ssl_connect : MDEV-13492 - Unknown SSL error +main.ssl_timeout : MDEV-11244 - Crash +main.stat_tables_par : MDEV-13266 - Wrong result +main.statistics : Modified in 10.2.8 +main.status : MDEV-13255 - Wrong result +main.subselect : Modified in 10.2.8 +main.subselect_innodb : Modified in 10.2.7 +main.subselect_mat_cost_bugs : Modified in 10.2.7 +main.subselect_nulls : Modified in 10.2.8 +main.subselect_sj : Modified in 10.2.7 +main.subselect_sj_mat : Modified in 10.2.7 +main.subselect_sj2_mat : Modified in 10.2.7 +main.trigger : Modified in 10.2.7 +main.type_json : Modified in 10.2.8 +main.type_num : Modified in 10.2.8 +main.union : Modified in 10.2.8 +main.view : Modified in 10.2.8 +main.win : Modified in 10.2.8 +main.win_insert_select : Added in 10.2.7 #---------------------------------------------------------------- -archive.archive-big : MDEV-10615 - table is marked as crashed -archive.discover : MDEV-10510 - table is marked as crashed; modified in 10.1.21 +archive.mysqlhotcopy_archive : MDEV-10995 - Hang on debug #---------------------------------------------------------------- -binlog.binlog_commit_wait : MDEV-10150 - Error: too much time elapsed -binlog.binlog_max_binlog_stmt_cache_size : Added in 10.1.22 -binlog.binlog_xa_recover : MDEV-8517 - Extra checkpoint +binlog.binlog_commit_wait : MDEV-10150 - Mismatch +binlog.binlog_innodb : Modified in 10.2.8 +binlog.binlog_parallel_replication_marks_row : Added in 10.2.7 +binlog.binlog_parallel_replication_marks_stm_mix : Added in 10.2.7 +binlog.binlog_unsafe : Modified in 10.2.8 +binlog.flashback : Modified in 10.2.7 +binlog.mysqladmin : Added in 10.2.7 #---------------------------------------------------------------- -binlog_encryption.* : Added in 10.1.20, still unstable (valgrind errors and such) - -binlog_encryption.rpl_parallel : MDEV-10653 - Timeout -binlog_encryption.rpl_semi_sync : MDEV-11220 - Wrong result -binlog_encryption.rpl_ssl : MDEV-11542 - Server crash +binlog_encryption.binlog_xa_recover : MDEV-12908 - Extra checkpoint +binlog_encryption.rpl_binlog_errors : MDEV-12742 - Crash +binlog_encryption.rpl_parallel : MDEV-10653 - Timeout in include +binlog_encryption.rpl_semi_sync : MDEV-11673 - Valgrind +binlog_encryption.rpl_skip_replication : MDEV-13571 - Unexpected warning +binlog_encryption.rpl_stm_relay_ign_space : MDEV-13278 - Wrong result (test assertion) #---------------------------------------------------------------- -connect.jdbc : Modified in 10.1.21 -connect.jdbc_new : Modified in 10.1.21 -connect.tbl : MDEV-9844, MDEV-10179 - sporadic crashes, valgrind warnings, wrong results -connect.xml_zip : Added in 10.1.22 -connect.zip : Added in 10.1.22 +connect.alter_xml : Modified in 10.2.8 +connect.alter_xml2 : Added in 10.2.8 +connect.dir : Modified in 10.2.8 +connect.infoschema-9739 : Modified in 10.2.8 +connect.infoschema2-9739 : Added in 10.2.8 +connect.jdbc_new : Modified in 10.2.8 +connect.json : Enabled in 10.2.8 +connect.json_java_2 : Added in 10.2.8 +connect.json_java_3 : Added in 10.2.8 +connect.json_mongo_c : Added in 10.2.8 +connect.json_udf : Enabled in 10.2.8 +connect.json_udf_bin : Enabled in 10.2.8 +connect.mongo_c : Added in 10.2.8 +connect.mongo_java_2 : Added in 10.2.8 +connect.mongo_java_3 : Added in 10.2.8 +connect.mul_new : Added in 10.2.8 +connect.mysql_exec : Modified in 10.2.8 +connect.tbl : MDEV-10179 - Mismatch, MDEV-9844 - Valgrind, crash; modified in 10.2.8 +connect.tbl_thread : MDEV-10179 - Mismatch, MDEV-9844 - Valgrind, crash; added in 10.2.8 +connect.vcol : MDEV-12374 - Fails on Windows +connect.xml : Modified in 10.2.8 +connect.xml2 : Added in 10.2.8 +connect.xml2_grant : Added in 10.2.8 +connect.xml2_html : Added in 10.2.8 +connect.xml2_mdev5261 : Added in 10.2.8 +connect.xml2_mult : Added in 10.2.8 +connect.xml2_zip : Added in 10.2.8 +connect.xml_grant : Modified in 10.2.8 +connect.xml_html : Modified in 10.2.8 +connect.xml_mdev5261 : Modified in 10.2.8 +connect.xml_mult : Modified in 10.2.8 +connect.xml_zip : Modified in 10.2.8 +connect.zip : Modified in 10.2.8 #---------------------------------------------------------------- -encryption.create_or_replace : MDEV-9359 - Assertion failure -encryption.encrypt_and_grep : MDEV-11222 - InnoDB error -encryption.innodb-bad-key-change : Modified in 10.1.22 -encryption.innodb-bad-key-change2 : Modified in 10.1.22 -encryption.innodb-bad-key-change3 : Modified in 10.1.21 -encryption.innodb-bad-key-change4 : Modified in 10.1.22 -encryption.innodb-bad-key-change5 : Modified in 10.1.22 -encryption.innodb-bad-key-shutdown : MDEV-9105 - valgrind warnings, assertion failures; also modified in 10.1.22 -encryption.innodb-discard-import : Modified in 10.1.21 -encryption.innodb-discard-import-change : Modified in 10.1.21 -encryption.innodb-encryption-disable : Modified in 10.1.22 -encryption.innodb_encryption_discard_import : MDEV-11218 - wrong result, also modified in 10.1.21 -encryption.innodb_encryption_filekeys : MDEV-9962 - timeouts -encryption.innodb_encryption-page-compression : MDEV-11420 - Trying to access missing tablespace -encryption.innodb_encryption_tables : MDEV-9359 - Assertion failure -encryption.innodb_first_page : MDEV-10689 - crashes -encryption.innodb-log-encrypt : Modified in 10.1.21 -encryption.innodb_lotoftables : MDEV-11531 - InnoDB error, also modified in 10.1.21 -encryption.innodb-missing-key : MDEV-9359 - assertion failure; also modified in 10.1.22 -encryption.innodb_onlinealter_encryption : MDEV-10099 - wrong results -encryption.innodb-page_encryption : MDEV-10641 - mutex problem -encryption.innodb-read-only : Added in 10.1.22 -encryption.innodb_scrub : MDEV-8139, also was modified in 10.1.21 -encryption.innodb_scrub_background : MDEV_8139, also was modified in 10.1.21 -encryption.innodb_scrub_compressed : MDEV-8139; also was modified and re-enabled in 10.1.21 +csv.read_only : Added in 10.2.7 #---------------------------------------------------------------- -engines/iuds.* : Not maintained in timely manner -engines/funcs.* : Not maintained in timely manner +encryption.create_or_replace : MDEV-9359, MDEV-13516 - Assertion failure, MDEV-12694 - Timeout +encryption.innochecksum : Modified in 10.2.8 +encryption.innodb-checksum-algorithm : Added in 10.2.7 +encryption.innodb-compressed-blob : Modified in 10.2.7 +encryption.innodb-discard-import-change : MDEV-12632 - Valgrind +encryption.innodb-encryption-alter : MDEV-13566 - Lock wait timeout +encryption.innodb_encryption_discard_import : MDEV-12903 - Wrong result +encryption.innodb_encryption_filekeys : MDEV-9962 - Timeout +encryption.innodb_encrypt_log : MDEV-13253 - Wrong result; modified in 10.2.8 +encryption.innodb_encrypt_log_corruption : MDEV-13253 - Wrong result +encryption.innodb_encryption-page-compression : Re-enabled in 10.2.7 +encryption.innodb_encryption_tables : MDEV-9359 - Assertion failure +encryption.innodb-first-page-read : Added in 10.2.7 +encryption.innodb-key-rotation-disable : Modified in 10.2.7 +encryption.second_plugin-12863 : Added in 10.2.8 #---------------------------------------------------------------- -federated.federated_bug_35333 : Modified in 10.1.22 -federated.federated_innodb : MDEV-10617, MDEV-10417 - Wrong checksum, timeouts, fails on Mips -federated.federated_partition : MDEV-10417 - Fails on Mips -federated.federated_transactions : MDEV-10617, MDEV-10417 - Wrong checksum, timeouts, fails on Mips -federated.federatedx : MDEV-10617 - Wrong checksum, timeouts +engines/rr_trx.* : MDEV-10998 - Not maintained #---------------------------------------------------------------- -funcs_1.is_columns_mysql : Modified in 10.1.22 -funcs_1.processlist_val_no_prot : MDEV-11223 - Wrong result - -funcs_2.innodb_charset : Modified in 10.1.21 -funcs_2.memory_charset : MDEV-10290 - Timeout -funcs_2.myisam_charset : MDEV-11535 - Timeout +federated.assisted_discovery : Modified in 10.2.7 +federated.federated_innodb : MDEV-10617 - Wrong checksum +federated.federated_transactions : MDEV-10617 - Wrong checksum +federated.federatedx : MDEV-10617 - Wrong checksum +federated.net_thd_crash-12725 : Added in 10.2.8 #---------------------------------------------------------------- -galera.* : suite.pm modified in 10.1.22 +funcs_1.is_character_sets : Modified in 10.2.8 +funcs_1.is_coll_char_set_appl : Modified in 10.2.8 +funcs_1.is_collations : Modified in 10.2.8 +funcs_1.is_engines : Modified in 10.2.8 +funcs_1.is_events : Modified in 10.2.8 +funcs_1.is_key_column_usage : Include file modified in 10.2.8 +funcs_1.is_key_column_usage_embedded : Modified in 10.2.8 +funcs_1.is_routines_embedded : Modified in 10.2.8 +funcs_1.is_schemata_embedded : Modified in 10.2.8 +funcs_1.is_table_constraints : Modified in 10.2.8 +funcs_1.is_tables_embedded : Modified in 10.2.8 +funcs_1.is_triggers_embedded : Modified in 10.2.8 +funcs_1.is_views_embedded : Modified in 10.2.8 -galera.galera_mdev_10812 : Added in 10.1.22 -galera.galera_var_cluster_address : Modified in 10.1.21 -galera.galera_var_dirty_reads : Modified in 10.1.21 -galera.MW-284 : Modified in 10.1.21 -galera.galera_split_brain : Modified in 10.1.21 -galera.galera_var_certify_nonPK_off : Modified in 10.1.22 -galera.galera_var_max_ws_rows : Modified in 10.1.22 - -galera_3nodes.* : MDEV-11490 - Warnings not suppressed +funcs_2/charset.* : MDEV-10999 - Not maintained #---------------------------------------------------------------- -innodb.101_compatibility : Modified in 10.1.22 -innodb.alter_key_block_size-11757 : Added in 10.1.22 -innodb.binlog_consistent : MDEV-10618 - Server fails to start -innodb.doublewrite : Modified in 10.1.22 -innodb.group_commit_crash : Modified in 10.1.21 -innodb.group_commit_crash_no_optimize_thread : Modified in 10.1.21 -innodb.innodb-32k-crash : Modified in 10.1.22 -innodb.innodb-64k-crash : Modified in 10.1.22 -innodb.innodb-alter-table : MDEV-10619 - Testcase timeout -innodb.innodb-blob : MDEV-12053 - Client crash; also modified in 10.1.22 -innodb.innodb_blob_unrecoverable_crash : Modified in 10.1.22 -innodb.innodb-bug-14068765 : MDEV-9105 - valgrind warnings, assertion failures -innodb.innodb-bug-14084530 : MDEV-9105 - valgrind warnings, assertion failures -innodb.innodb_bug11754376 : Modified in 10.1.22 -innodb.innodb_bug14147491 : MDEV-11808, also modified in 10.1.22 -innodb.innodb_bug14676111 : MDEV-11802 - wrong result; also modified in 10.1.22 -innodb.innodb_bug30423 : MDEV-7311 - Wrong number of rows in the plan -innodb.innodb_bug53756 : Modified in 10.1.22 -innodb.innodb_bug56947 : Modified in 10.1.22 -innodb.innodb_bug59641 : Modified in 10.1.22 -innodb.innodb-change-buffer-recovery : Modified in 10.1.21 -innodb.innodb-get-fk : Modified in 10.1.22 -innodb.innodb-page_compression_default : Added in 10.1.22 -innodb.innodb-page_compression_zip : MDEV-10641 - mutex problem -innodb.innodb_stats : MDEV-10682 - wrong result -innodb.innodb_sys_semaphore_waits : MDEV-10331 - wrong result -innodb.innodb-wl5522 : MDEV-9105 - valgrind warnings, assertion failures -innodb.innodb-wl5522-1 : MDEV-9105 - valgrind warnings, assertion failures -innodb.innodb-wl5522-debug : Modified in 10.1.22 -innodb.innodb-wl5522-debug-zip : Modified in 10.1.22 -innodb.log_data_file_size : Added in 10.1.21 -innodb.log_file_size : Added in 10.1.22 -innodb.read_only_recovery : Added in 10.1.22 -innodb.xa_recovery : Modified in 10.1.22 - -innodb_fts.crash_recovery : Added in 10.1.22 -innodb_fts.innodb_fts_result_cache_limit : Modified in 10.1.22 -innodb_fts.misc_debug : Added in 10.1.22 +galera.galera_defaults : Modified in 10.2.7 +galera.MW-309 : Added in 10.2.7 +galera.MW-369 : Added in 10.2.7 #---------------------------------------------------------------- -mroonga/storage.column_datetime_32bit_2038 : Wrong result on Alpha -mroonga/storage.column_datetime_32bit_before_unix_epoch : Wrong result on Alpha -mroonga/storage.column_datetime_32bit_max : Wrong result on Alpha -mroonga/storage.column_datetime_32bit_out_of_range : Wrong result on Alpha -mroonga/storage.index_multiple_column_unique_date_32bit_equal : Wrong result on Alpha -mroonga/storage.index_multiple_column_unique_date_order_32bit_desc : Wrong result on Alpha -mroonga/storage.index_multiple_column_unique_datetime_index_read : MDEV-8643 - valgrind warnings -mroonga/storage.repair_table_no_index_file : MDEV-9364 - wrong result +gcol.gcol_bugfixes : Modified in 10.2.8 +gcol.gcol_keys_innodb : Modified in 10.2.8 +gcol.gcol_keys_myisam : Include file modified in 10.2.8 +gcol.gcol_rollback : Modified in 10.2.8 +gcol.innodb_virtual_basic : Modified in 10.2.8 +gcol.innodb_virtual_debug_purge : MDEV-13568 - Wrong result; modified in 10.2.8 +gcol.innodb_virtual_purge : Modified in 10.2.8 #---------------------------------------------------------------- -multi_source.gtid : MDEV-10417 - Fails on Mips -multi_source.info_logs : MDEV-10042 - wrong result -multi_source.multisource : MDEV-10417 - Fails on Mips -multi_source.reset_slave : MDEV-10690 - wrong result -multi_source.simple : MDEV-4633 - Wrong slave status output -multi_source.status_vars : MDEV-4632 - failed while waiting for Slave_received_heartbeats +innodb.101_compatibility : MDEV-13570 - Crash; perl file modified in 10.2.7 +innodb.alter_missing_tablespace : Modified in 10.2.7 +innodb.deadlock_detect : MDEV-13262 - Wrong error code +innodb.defrag_mdl-9155 : MDEV-11336 - Timeout +innodb.doublewrite : Modified in 10.2.7 +innodb.drop_table_background : Added in 10.2.7 +innodb.foreign_key : Modified in 10.2.8 +innodb.group_commit_binlog_pos : Modified in 10.2.7 +innodb.group_commit_binlog_pos_no_optimize_thread : Modified in 10.2.7 +innodb.ibuf_not_empty : MDEV-12741 - Tablespace error +innodb.index_merge_threshold : Modified in 10.2.8 +innodb.innodb-32k : Opt file modified in 10.2.8 +innodb.innodb-32k-crash : Opt file modified in 10.2.8 +innodb.innodb-64k : Modified in 10.2.8 +innodb.innodb-64k-crash : Opt file modified in 10.2.8 +innodb.innodb-alter-debug : Modified in 10.2.7 +innodb.innodb-alter-nullable : Modified in 10.2.7 +innodb.innodb-alter-table : Modified in 10.2.7 +innodb.innodb-alter-tempfile : Modified in 10.2.7 +innodb.innodb-alter-timestamp : Modified in 10.2.7 +innodb.innodb_bug14147491 : MDEV-11808 - Index is corrupt +innodb.innodb_bug53290 : MDEV-12634 - Valgrind +innodb.innodb_defragment : MDEV-11336 - Mismatch +innodb.innodb_defragment_fill_factor : Modified in 10.2.8 +innodb.innodb_defragment_small : MDEV-11336 - Mismatch +innodb.innodb_defrag_binlog : MDEV-11336 - Mismatch +innodb.innodb_defrag_concurrent : MDEV-11336 - Assertion failure, mismatch +innodb.innodb_defrag_stats : MDEV-11336 - Mismatch +innodb.innodb-enlarge-blob : Added in 10.2.8 +innodb.innodb_force_recovery : Modified in 10.2.7 +innodb.innodb-get-fk : MDEV-13276 - Server crash +innodb.innodb_information_schema : MDEV-8851 - Wrong result +innodb.innodb_max_recordsize_32k : Added in 10.2.8 +innodb.innodb_max_recordsize_64k : Added in 10.2.8 +innodb.innodb-page_compression_default : Modified in 10.2.7 +innodb.innodb-page_compression_snappy : Modified in 10.2.7 +innodb.innodb_stats_persistent : Added in 10.2.7 +innodb.innodb_sys_semaphore_waits : MDEV-10331 - Semaphore wait +innodb.innodb_zip_innochecksum : Added in 10.2.8 +innodb.innodb_zip_innochecksum2 : Added in 10.2.8 +innodb.innodb_zip_innochecksum3 : Added in 10.2.8 +innodb.log_corruption : MDEV-13251 - Wrong result +innodb.log_data_file_size : Modified in 10.2.7 +innodb.log_file : Modified in 10.2.7 +innodb.log_file_name : Modified in 10.2.7 +innodb.log_file_size : MDEV-13471 - Crash; modified in 10.2.7 +innodb.purge_thread_shutdown : Added in 10.2.8 +innodb.read_only_recovery : Modified in 10.2.8 +innodb.rename_table : Added in 10.2.8 +innodb.row_format_redundant : Added in 10.2.7 +innodb.table_flags : MDEV-13572 - Wrong result; added in 10.2.7 +innodb.temporary_table : MDEV-13265 - Wrong result; modified in 10.2.7 +innodb.truncate_debug : MDEV-13256 - Timeout +innodb.truncate_purge_debug : Modified in 10.2.7 + +innodb_fts.fulltext_misc : MDEV-12636 - Valgrind +innodb_fts.innodb_fts_plugin : Modified in 10.2.7 +innodb_fts.innodb_fts_stopword_charset : MDEV-13259 - Table crashed + +innodb_gis.1 : Modified in 10.2.8 +innodb_gis.gis : Modified in 10.2.8 + +innodb_zip.bug36169 : Modified in 10.2.7 +innodb_zip.bug36172 : Modified in 10.2.7 +innodb_zip.bug52745 : Modified in 10.2.7 +innodb_zip.bug53591 : Modified in 10.2.7 +innodb_zip.bug56680 : Modified in 10.2.7 +innodb_zip.cmp_drop_table : Modified in 10.2.7 +innodb_zip.create_options : Modified in 10.2.7 +innodb_zip.innochecksum : Modified in 10.2.7 +innodb_zip.innochecksum_2 : Modified in 10.2.7 +innodb_zip.innochecksum_3 : MDEV-13279 - Extra warnings; modified in 10.2.8 +innodb_zip.innodb-zip : Modified in 10.2.7 +innodb_zip.recover : Modified in 10.2.7 +innodb_zip.restart : Modified in 10.2.7 +innodb_zip.wl6501_1 : MDEV-10891 - Can't create UNIX socket +innodb_zip.wl5522_debug_zip : MDEV-11600 - Operating system error number 2; modified in 10.2.7 +innodb_zip.wl5522_zip : Modified in 10.2.7 +innodb_zip.wl6344_compress_level : Modified in 10.2.7 +innodb_zip.wl6501_scale_1 : MDEV-13254 - Timeout #---------------------------------------------------------------- -oqgraph.regression_mdev6282 : Modified in 10.1.22 -oqgraph.regression_mdev6345 : Modified in 10.1.22 +maria.insert_select : MDEV-12757 - Timeout #---------------------------------------------------------------- -parts.partition_bigint_innodb : Added in 10.1.22 -parts.partition_bigint_myisam : Added in 10.1.22 -parts.partition_double_innodb : Added in 10.1.22 -parts.partition_double_myisam : Added in 10.1.22 -parts.partition_float_innodb : Modified in 10.1.22 -parts.partition_float_myisam : Modified in 10.1.22 -parts.partition_int_innodb : Modified in 10.1.22 -parts.partition_int_myisam : Modified in 10.1.22 -parts.partition_mediumint_innodb : Added in 10.1.22 -parts.partition_mediumint_myisam : Added in 10.1.22 -parts.partition_smallint_innodb : Added in 10.1.22 -parts.partition_smallint_myisam : Added in 10.1.22 -parts.partition_tinyint_innodb : Added in 10.1.22 -parts.partition_tinyint_myisam : Added in 10.1.22 +mariabackup.* : suite.pm and .opt modified in 10.2.7 + +mariabackup.full_backup : Modified in 10.2.7 +mariabackup.huge_lsn : Added in 10.2.8 +mariabackup.incremental_backup : Modified in 10.2.8 +mariabackup.incremental_encrypted : Modified in 10.2.7 +mariabackup.partial : Modified in 10.2.7 +mariabackup.partial_exclude : Modified in 10.2.7 +mariabackup.small_ibd : Modified in 10.2.7 +mariabackup.xb_aws_key_management : Modified in 10.2.7 +mariabackup.xb_compressed_encrypted : Modified in 10.2.7 +mariabackup.xb_file_key_management : Modified in 10.2.7 +mariabackup.xb_partition : Modified in 10.2.7 +mariabackup.xbstream : Modified in 10.2.7 #---------------------------------------------------------------- -perfschema.csv_table_io : Uses table_io_result_helper.inc modified in 10.1.22 -perfschema.func_file_io : MDEV-5708 - fails for s390x -perfschema.func_mutex : MDEV-5708 - fails for s390x -perfschema.indexed_table_io : Uses table_io_result_helper.inc modified in 10.1.22 -perfschema.innodb_table_io : Uses table_io_result_helper.inc modified in 10.1.22 -perfschema.memory_table_io : Uses table_io_result_helper.inc modified in 10.1.22 -perfschema.merge_table_io : Uses table_io_result_helper.inc modified in 10.1.22 -perfschema.multi_table_io : Uses table_io_result_helper.inc modified in 10.1.22 -perfschema.myisam_table_io : Uses table_io_result_helper.inc modified in 10.1.22 -perfschema.part_table_io : Uses table_io_result_helper.inc modified in 10.1.22 -perfschema.privilege_table_io : Uses table_io_result_helper.inc modified in 10.1.22 -perfschema.rollback_table_io : Uses table_io_result_helper.inc modified in 10.1.22 -perfschema.setup_actors : MDEV-10679 - rare crash -perfschema.socket_summary_by_event_name_func : MDEV-10622 - Socket summary tables do not match -perfschema.stage_mdl_global : MDEV-11803 - wrong result on slow builders -perfschema.table_name : Modified in 10.1.22 -perfschema.temp_table_io : Uses table_io_result_helper.inc modified in 10.1.22 -perfschema.threads_mysql : MDEV-10677 - sporadic wrong result; also modified in 10.1.22 -perfschema.trigger_table_io : Uses table_io_result_helper.inc modified in 10.1.22 -perfschema.view_table_io : Uses table_io_result_helper.inc modified in 10.1.22 +mroonga/storage.index_multiple_column_unique_datetime_index_read : MDEV-8643 - Valgrind #---------------------------------------------------------------- -plugins.auth_ed25519 : Added in 10.1.22 -plugins.cracklib_password_check : MDEV-11650 - valgrind warnings -plugins.feedback_plugin_send : MDEV-7932 - ssl failed for url -plugins.server_audit : MDEV-9562 - crashes on sol10-sparc -plugins.thread_pool_server_audit : MDEV-9562 - crashes on sol10-sparc -plugins.two_password_validations : MDEV-11650 - valgrind warnings +multi_source.info_logs : MDEV-12629 - Valgrind +multi_source.mdev-9544 : Added in 10.2.7 +multi_source.reset_slave : MDEV-10690 - Wrong result +multi_source.simple : MDEV-4633 - Wrong result #---------------------------------------------------------------- -rpl.last_insert_id : MDEV-10625 - warnings in error log -rpl.rpl_alter_extra_persistent : Added in 10.1.21 -rpl.rpl_auto_increment : MDEV-10417 - Fails on Mips -rpl.rpl_auto_increment_bug45679 : MDEV-10417 - Fails on Mips -rpl.rpl_auto_increment_update_failure : MDEV-10625 - warnings in error log -rpl.rpl_binlog_index : MDEV-9501 - Warning: failed registering on master -rpl.rpl_checksum_cache : MDEV-12173 - Unexpected error -rpl.rpl_ddl : MDEV-10417 - Fails on Mips -rpl.rpl_domain_id_filter_restart : MDEV-10684 - Wrong result -rpl.rpl_gtid_basic : MDEV-10681 - server startup problem -rpl.rpl_gtid_crash : MDEV-9501 - Warning: failed registering on master -rpl.rpl_gtid_mdev9033 : MDEV-10680 - warnings -rpl.rpl_gtid_stop_start : MDEV-10629 - Crash on shutdown -rpl.rpl_gtid_until : MDEV-10625 - warnings in error log -rpl.rpl_heartbeat_basic : Modified in 10.1.22 -rpl.rpl_innodb_bug30888 : MDEV-10417 - Fails on Mips -rpl.rpl_insert : MDEV-9329 - Fails on Ubuntu/s390x -rpl.rpl_insert_delayed : MDEV-9329 - Fails on Ubuntu/s390x -rpl.rpl_invoked_features : MDEV-10417 - Fails on Mips -rpl.rpl_mariadb_slave_capability : MDEV-11018 - sporadic wrong events in binlog -rpl.rpl_mdev6020 : MDEV-10630, MDEV-10417 - Timeouts, fails on Mips -rpl.rpl_mdev6386 : Modified in 10.1.22 -rpl.rpl_parallel : MDEV-10653 - Timeouts -rpl.rpl_parallel_optimistic : MDEV-10511 - timeout -rpl.rpl_parallel_retry : MDEV-11119 - Server crash -rpl.rpl_parallel_temptable : MDEV-10356 - Crash in close_thread_tables -rpl.rpl_partition_innodb : MDEV-10417 - Fails on Mips -rpl.rpl_password_boundaries : MDEV-11534 - Slave IO warnings -rpl.rpl_row_log_innodb : MDEV-10688 - Wrong result -rpl.rpl_row_mysqlbinlog : Modified in 10.1.21 -rpl.rpl_row_sp001 : MDEV-9329 - Fails on Ubuntu/s390x -rpl.rpl_semi_sync : MDEV-11220 - Wrong result -rpl.rpl_semi_sync_event_after_sync : MDEV-11806 - warnings -rpl.rpl_semi_sync_uninstall_plugin : MDEV-7140 - Wrong plugin status -rpl.rpl_semi_sync_wait_point : MDEV-11807 - timeout in wait condition -rpl.rpl_show_slave_hosts : MDEV-10681 - server startup problem -rpl.rpl_skip_replication : MDEV-9268 - Fails with timeout in sync_slave_with_master on Alpha -rpl.rpl_slave_grp_exec : MDEV-10514 - Unexpected deadlock -rpl.rpl_special_charset : Modified in 10.1.21 -rpl.rpl_sync : MDEV-10633 - Database page corruption -rpl.rpl_temporary_error2 : MDEV-10634 - Wrong number of retries -rpl.sec_behind_master-5114 : Modified in 10.1.21 +parts.longname : Added in 10.2.7 +parts.partition_debug_innodb : MDEV-10891 - Can't create UNIX socket +parts.quoting : Added in 10.2.7 #---------------------------------------------------------------- -spider.* : MDEV-9329 - tests are too memory-consuming - -spider/bg.direct_aggregate : MDEV-7098 - Trying to unlock mutex that wasn't locked -spider/bg.direct_aggregate_part : MDEV-7098 - Trying to unlock mutex that wasn't locked -spider/bg.ha : MDEV-7914, MDEV-9329 - Crash, failures on s390x -spider/bg.ha_part : MDEV-9329 - Fails on Ubuntu/s390x -spider/bg.spider_fixes : MDEV-7098, MDEV-9329 - Mutex problem, failures on s390x -spider/bg.vp_fixes : MDEV-9329 - Fails on Ubuntu/s390x - -spider/handler.* : MDEV-10987, MDEV-10990 - Tests have not been maintained +percona.* : MDEV-10997 - Not maintained #---------------------------------------------------------------- -sphinx.* : MDEV-10986 - Tests have not been maintained +perfschema.bad_option_2 : Modified in 10.2.7 +perfschema.bad_option_3 : MDEV-12728 - Timeout on Power +perfschema.hostcache_ipv4_addrinfo_again_allow : MDEV-12759 - Crash +perfschema.hostcache_ipv6_addrinfo_again_allow : MDEV-12752 - Crash +perfschema.hostcache_ipv6_addrinfo_bad_allow : MDEV-13260 - Crash +perfschema.hostcache_ipv6_ssl : MDEV-10696 - Crash +perfschema.privilege_table_io : Modified in 10.2.8 +perfschema.setup_actors : MDEV-10679 - Crash +perfschema.stage_mdl_procedure : MDEV-11545 - Missing row +perfschema.start_server_1_digest : Added in 10.2.7 #---------------------------------------------------------------- -storage_engine* : Tests are not always timely maintained +perfschema_stress.* : MDEV-10996 - Not maintained #---------------------------------------------------------------- -stress.ddl_innodb : MDEV-10635 - Testcase timeout +plugins.feedback_plugin_send : MDEV-7932, MDEV-11118 - Connection problems and such #---------------------------------------------------------------- -sys_vars.autocommit_func2 : MDEV-9329 - Fails on Ubuntu/s390x -sys_vars.keep_files_on_create_basic : MDEV-10676 - timeout -sys_vars.innodb_buffer_pool_dump_pct_basic : MDEV-10651 - sporadic failure on file_exists -sys_vars.innodb_fatal_semaphore_wait_threshold : MDEV-10513 - crashes -sys_vars.innodb_stats_include_delete_marked_basic : Added in 10.1.22 -sys_vars.log_slow_admin_statements_func : MDEV-12235 - Server crash -sys_vars.rpl_init_slave_func : MDEV-10149 - wrong results -sys_vars.secure_file_priv : Modified in 10.1.22 -sys_vars.sysvars_innodb : MDEV-6958 - error-prone rdiffs -sys_vars.sysvars_server_embedded : MDEV-6958 - error-prone rdiffs +rocksdb.* : MyRocks is alpha-quality and tests are unstable #---------------------------------------------------------------- -tokudb.cluster_filter : MDEV-10678 - Wrong execution plan -tokudb.cluster_filter_hidden : MDEV-10678 - Wrong execution plan -tokudb.cluster_filter_unpack_varchar : MDEV-10636 - Wrong execution plan -tokudb.dir_per_db : MDEV-11537 - Wrong result -tokudb.dir_per_db_rename_to_nonexisting_schema : Added in 10.1.22 -tokudb.gap_lock_error : Added in 10.1.22 -tokudb.locks-select-update-3 : Modified in 10.1.22 -tokudb.percona_kill_idle_trx_tokudb : Modified in 10.1.22 - -tokudb_backup.* : suite.opt modified in 10.1.22 - -tokudb_bugs.checkpoint_lock : MDEV-10637 - Wrong processlist output -tokudb_bugs.checkpoint_lock_3 : MDEV-10637 - Wrong processlist output -tokudb_bugs.xa : MDEV-11804 - Lock wait timeout +roles.current_role_view-12666 : Added in 10.2.7 +roles.show_create_database-10463 : Added in 10.2.7 #---------------------------------------------------------------- -unit.ma_test_loghandler : MDEV-10638 - record read not ok +rpl.circular_serverid0 : Added in 10.2.7 +rpl.rpl_binlog_errors : MDEV-12742 - Crash +rpl.rpl_binlog_index : MDEV-9501 - Failed registering on master +rpl.rpl_domain_id_filter_io_crash : MDEV-12729 - Timeout in include file +rpl.rpl_domain_id_filter_restart : MDEV-10684 - Wrong result +rpl.rpl_gtid_crash : MDEV-9501 - Failed registering on master +rpl.rpl_gtid_errorhandling : MDEV-13261 - Crash +rpl.rpl_gtid_stop_start : MDEV-11621 - Table marked as crashed, MDEV-12731 - Valgrind +rpl.rpl_mariadb_slave_capability : MDEV-11018 - Extra lines in binlog +rpl.rpl_mdev-11092 : Added in 10.2.7 +rpl.rpl_parallel : MDEV-12730 - Assertion failure +rpl.rpl_parallel_mdev6589 : MDEV-12979 - Assertion failure +rpl.rpl_parallel_optimistic : Modified in 10.2.7 +rpl.rpl_parallel_optimistic_nobinlog : MDEV-12746 - Timeouts, mismatch +rpl.rpl_parallel_retry : MDEV-11119 - Crash +rpl.rpl_temporal_mysql56_to_mariadb53 : MDEV-9501 - Failed registering on master +rpl.rpl_reset_slave_fail : Added in 10.2.8 +rpl.rpl_semi_sync_uninstall_plugin : MDEV-10892 - Assertion failure +rpl.rpl_set_statement_default_master : MDEV-13258 - Extra warning +rpl.rpl_skip_replication : MDEV-13258 - Extra warning +rpl.rpl_slave_grp_exec : MDEV-10514 - Deadlock +rpl.rpl_slow_query_log : MDEV-13250 - Test abort +rpl.rpl_sp_effects : MDEV-13249 - Crash +rpl.rpl_start_stop_slave : MDEV-13567 - Sync slave timeout +rpl.rpl_stm_multi_query : MDEV-9501 - Failed registering on master +rpl.rpl_upgrade_master_info : MDEV-11620 - Table marked as crashed + +rpl/extra/rpl_tests.* : MDEV-10994 - Not maintained #---------------------------------------------------------------- -vcol.not_supported : MDEV-10639 - Testcase timeout -vcol.vcol_keys_innodb : MDEV-10639 - Testcase timeout -vcol.vcol_select_myisam : Modified in 10.1.22 +spider.basic_sql : MDEV-11186 - Internal check fails + +spider/handler.* : MDEV-10990 - Not maintained #---------------------------------------------------------------- -wsrep.binlog_format : MDEV-11532 - WSREP has not yet prepared node -wsrep.pool_of_threads : MDEV-12234 - Library problem on Power +sphinx.sphinx : MDEV-10986 - Sporadic failures +sphinx.union-5539 : MDEV-10986 - Sporadic failures + +#---------------------------------------------------------------- + +storage_engine.* : Not always timely maintained + +#---------------------------------------------------------------- + +sys_vars.back_log_basic : Modified in 10.2.8 +sys_vars.delay_key_write_func : Modified in 10.2.7 +sys_vars.innodb_sched_priority_cleaner_basic : Modified in 10.2.7 +sys_vars.rpl_init_slave_func : MDEV-10149 - Test assertion +sys_vars.tmp_disk_table_size_basic : Added in 10.2.7 +sys_vars.tmp_disk_table_size_func : Added in 10.2.7 +sys_vars.tmp_memory_table_size_basic : Added in 10.2.7 + +#---------------------------------------------------------------- + +tokudb.background_job_manager : Modified in 10.2.7 +tokudb.bug-1657908 : Added in 10.2.7 +tokudb.change_column_all_1000_10 : MDEV-12640 - Lost connection +tokudb.change_column_bin : MDEV-12640 - Lost connection +tokudb.change_column_char : MDEV-12822 - Lost connection +tokudb.dir_cmd : Added in 10.2.7 +tokudb.hotindex-insert-bigchar : MDEV-12640 - Crash +tokudb.hotindex-update-1 : MDEV-12640 - Crash +tokudb.kill_query_blocked_in_lt : Added in 10.2.8 +tokudb.locks-select-update-3 : Modified in 10.2.8 +tokudb.rows-32m-rand-insert : MDEV-12640 - Crash +tokudb.rows-32m-seq-insert : MDEV-12640 - Crash + +tokudb_mariadb.mdev12972 : Modified in 10.2.8 +tokudb_mariadb.mdev6657 : MDEV-12737 - Mismatch or valgrind + +tokudb_backup.* : MDEV-11001 - Missing include file; suite.pm modified in 10.2.7 +tokudb_sys_vars.* : MDEV-11001 - Missing include file +tokudb_rpl.* : MDEV-11001 - Missing include file + +tokudb_backup.backup_master_info : Added in 10.2.7 +tokudb_backup.backup_master_state : Added in 10.2.7 +tokudb_backup.empty_slave_info_file : Added in 10.2.7 +tokudb_backup.innodb_use_native_aio_enabled : Added in 10.2.7 +tokudb_backup.rpl_safe_slave : Include file modified in 10.2.8 +tokudb_backup.rpl_tokudb_commit_sync : Added in 10.2.7 + +tokudb_bugs.db233 : Modified in 10.2.7 +tokudb_bugs.leak172 : Modified in 10.2.7 + +tokudb_parts.partition_alter4_tokudb : MDEV-12640 - Lost connection + +rpl-tokudb.rpl_not_null_tokudb : Modified in 10.2.8 +rpl-tokudb.rpl_parallel_tokudb_delete_pk : Opt file modified in 10.2.8 +rpl-tokudb.rpl_parallel_tokudb_update_pk_uc0_lookup0 : Modified in 10.2.8 +rpl-tokudb.rpl_parallel_tokudb_write_pk : Modified in 10.2.8 +rpl-tokudb.rpl_rfr_disable_on_expl_pk_absence : Added in 10.2.8 +rpl-tokudb.rpl_row_basic_3tokudb : Modified in 10.2.8 +rpl-tokudb.rpl_tokudb_commit_after_flush : Added in 10.2.8 +rpl-tokudb.rpl_tokudb_insert_id : Added in 10.2.8 +rpl-tokudb.rpl_tokudb_insert_id_pk : Added in 10.2.8 +rpl-tokudb.rpl_tokudb_multi_update : Added in 10.2.8 +rpl-tokudb.rpl_tokudb_multi_update2 : Added in 10.2.8 +rpl-tokudb.rpl_tokudb_multi_update3 : Added in 10.2.8 +rpl-tokudb.rpl_tokudb_rfr_partition_table : Added in 10.2.8 +rpl-tokudb.rpl_tokudb_row_crash_safe : Added in 10.2.8 +rpl-tokudb.rpl_tokudb_row_img_blobs : Added in 10.2.8 +rpl-tokudb.rpl_tokudb_row_img_eng_full : Added in 10.2.8 +rpl-tokudb.rpl_tokudb_row_img_eng_min : Added in 10.2.8 +rpl-tokudb.rpl_tokudb_row_img_eng_noblob : Added in 10.2.8 +rpl-tokudb.rpl_tokudb_row_img_idx_full : Added in 10.2.8 +rpl-tokudb.rpl_tokudb_row_img_idx_min : Added in 10.2.8 +rpl-tokudb.rpl_tokudb_row_img_idx_noblob : Added in 10.2.8 +rpl-tokudb.rpl_tokudb_row_log : Added in 10.2.8 +rpl-tokudb.rpl_tokudb_row_lower_case_table_names : Added in 10.2.8 +rpl-tokudb.rpl_tokudb_row_sp003 : Added in 10.2.8 +rpl-tokudb.rpl_tokudb_row_sp006 : Added in 10.2.8 +rpl-tokudb.rpl_tokudb_row_trig004 : Added in 10.2.8 +rpl-tokudb.rpl_tokudb_stm_log : Added in 10.2.8 +rpl-tokudb.rpl_tokudb_stm_mixed_crash_safe : Added in 10.2.8 +rpl-tokudb.rpl_tokudb_stm_mixed_lower_case_table_names : Added in 10.2.8 + +#---------------------------------------------------------------- + +unit.conc_ps_bugs : MDEV-13252 - not ok 44 test_bug4236 + +#---------------------------------------------------------------- + +vcol.cross_db : Added in 10.2.7 +vcol.upgrade : Added in 10.2.7 + +#---------------------------------------------------------------- + +wsrep.pool_of_threads : MDEV-12234 - GLIBCXX_3.4.20 not found; modified in 10.2.7 + +wsrep_info.plugin : MDEV-13569 - No nodes coming from prim view -wsrep_info.* : suite.pm changed in 10.1.22 -wsrep_info.plugin : MDEV-12232 - Crash on Power diff --git a/mysql-test/valgrind.supp b/mysql-test/valgrind.supp index eb03eae6045..96a6e2ea1c2 100644 --- a/mysql-test/valgrind.supp +++ b/mysql-test/valgrind.supp @@ -1,5 +1,5 @@ # Copyright (c) 2005, 2015, Oracle and/or its affiliates. -# Copyright (c) 2008, 2016, MariaDB +# Copyright (c) 2008, 2017, MariaDB # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public diff --git a/mysys/lf_alloc-pin.c b/mysys/lf_alloc-pin.c index 6c813333d09..e2073df1e4d 100644 --- a/mysys/lf_alloc-pin.c +++ b/mysys/lf_alloc-pin.c @@ -323,12 +323,6 @@ static int match_pins(LF_PINS *el, void *addr) return 0; } -#if STACK_DIRECTION < 0 -#define available_stack_size(CUR,END) (long) ((char*)(CUR) - (char*)(END)) -#else -#define available_stack_size(CUR,END) (long) ((char*)(END) - (char*)(CUR)) -#endif - #define next_node(P, X) (*((uchar * volatile *)(((uchar *)(X)) + (P)->free_ptr_offset))) #define anext_node(X) next_node(&allocator->pinbox, (X)) diff --git a/mysys/lf_hash.c b/mysys/lf_hash.c index 41174a66ced..430f1007f30 100644 --- a/mysys/lf_hash.c +++ b/mysys/lf_hash.c @@ -550,7 +550,10 @@ static int initialize_bucket(LF_HASH *hash, LF_SLIST * volatile *node, return -1; if (*el == NULL && bucket && unlikely(initialize_bucket(hash, el, parent, pins))) + { + my_free(dummy); return -1; + } dummy->hashnr= my_reverse_bits(bucket) | 0; /* dummy node */ dummy->key= dummy_key; dummy->keylen= 0; diff --git a/mysys/ma_dyncol.c b/mysys/ma_dyncol.c index 155a4367345..125b3a4632d 100644 --- a/mysys/ma_dyncol.c +++ b/mysys/ma_dyncol.c @@ -4038,6 +4038,8 @@ mariadb_dyncol_val_double(double *dbl, DYNAMIC_COLUMN_VALUE *val) *dbl= strtod(str, &end); if (*end != '\0') rc= ER_DYNCOL_TRUNCATED; + free(str); + break; } case DYN_COL_DECIMAL: if (decimal2double(&val->x.decimal.value, dbl) != E_DEC_OK) diff --git a/mysys/mf_iocache.c b/mysys/mf_iocache.c index 23f2d7984d3..0c2c1da354c 100644 --- a/mysys/mf_iocache.c +++ b/mysys/mf_iocache.c @@ -74,34 +74,6 @@ int (*_my_b_encr_read)(IO_CACHE *info,uchar *Buffer,size_t Count)= 0; int (*_my_b_encr_write)(IO_CACHE *info,const uchar *Buffer,size_t Count)= 0; -/* - Setup internal pointers inside IO_CACHE - - SYNOPSIS - setup_io_cache() - info IO_CACHE handler - - NOTES - This is called on automatically on init or reinit of IO_CACHE - It must be called externally if one moves or copies an IO_CACHE - object. -*/ - -void setup_io_cache(IO_CACHE* info) -{ - /* Ensure that my_b_tell() and my_b_bytes_in_cache works */ - if (info->type == WRITE_CACHE) - { - info->current_pos= &info->write_pos; - info->current_end= &info->write_end; - } - else - { - info->current_pos= &info->read_pos; - info->current_end= &info->read_end; - } -} - static void init_functions(IO_CACHE* info) @@ -148,8 +120,6 @@ init_functions(IO_CACHE* info) DBUG_ASSERT(0); break; } - - setup_io_cache(info); } @@ -360,12 +330,7 @@ int init_slave_io_cache(IO_CACHE *master, IO_CACHE *slave) memcpy(slave->buffer, master->buffer, master->buffer_length); slave->read_pos= slave->buffer + (master->read_pos - master->buffer); slave->read_end= slave->buffer + (master->read_end - master->buffer); - - DBUG_ASSERT(master->current_pos == &master->read_pos); - slave->current_pos= &slave->read_pos; - DBUG_ASSERT(master->current_end == &master->read_end); - slave->current_end= &slave->read_end; - + if (master->next_file_user) { IO_CACHE *p; @@ -924,8 +889,6 @@ void init_io_cache_share(IO_CACHE *read_cache, IO_CACHE_SHARE *cshare, read_cache->share= cshare; read_cache->read_function= _my_b_cache_read_r; - read_cache->current_pos= NULL; - read_cache->current_end= NULL; if (write_cache) { diff --git a/mysys/my_fopen.c b/mysys/my_fopen.c index 0bb431dd560..c720e2c9168 100644 --- a/mysys/my_fopen.c +++ b/mysys/my_fopen.c @@ -142,7 +142,7 @@ static int no_close(void *cookie __attribute__((unused))) /* A hack around a race condition in the implementation of freopen. - The race condition steams from the fact that the current fd of + The race condition stems from the fact that the current fd of the stream is closed before its number is used to duplicate the new file descriptor. This defeats the desired atomicity of the close and duplicate of dup2(). diff --git a/mysys/my_init.c b/mysys/my_init.c index 7f0f7a8cc44..84489a994e3 100644 --- a/mysys/my_init.c +++ b/mysys/my_init.c @@ -200,7 +200,6 @@ Voluntary context switches %ld, Involuntary context switches %ld\n", _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE ); _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDERR ); _CrtCheckMemory(); - _CrtDumpMemoryLeaks(); #endif } diff --git a/mysys/my_symlink.c b/mysys/my_symlink.c index 72648d4c9a8..06f6a29e4a0 100644 --- a/mysys/my_symlink.c +++ b/mysys/my_symlink.c @@ -205,7 +205,7 @@ int my_realpath(char *to, const char *filename, myf MyFlags) const char *my_open_parent_dir_nosymlinks(const char *pathname, int *pdfd) { - char buf[PATH_MAX+1]; + char buf[FN_REFLEN + 1]; char *s= buf, *e= buf+1, *end= strnmov(buf, pathname, sizeof(buf)); int fd, dfd= -1; diff --git a/mysys/my_winerr.c b/mysys/my_winerr.c index 92e1fa83d78..a3f6229b74e 100644 --- a/mysys/my_winerr.c +++ b/mysys/my_winerr.c @@ -75,7 +75,9 @@ static struct errentry errtable[]= { { ERROR_ALREADY_EXISTS, EEXIST }, /* 183 */ { ERROR_FILENAME_EXCED_RANGE, ENOENT }, /* 206 */ { ERROR_NESTING_NOT_ALLOWED, EAGAIN }, /* 215 */ - { ERROR_NOT_ENOUGH_QUOTA, ENOMEM } /* 1816 */ + { ERROR_FILE_SYSTEM_LIMITATION, EFBIG }, /* 665 */ + { ERROR_NO_SYSTEM_RESOURCES, ENOMEM }, /* 1450 */ + { ERROR_NOT_ENOUGH_QUOTA, ENOMEM } /* 1816 */ }; /* size of the table */ diff --git a/mysys/mysys_priv.h b/mysys/mysys_priv.h index 471862a6d0b..892e09148ef 100644 --- a/mysys/mysys_priv.h +++ b/mysys/mysys_priv.h @@ -108,9 +108,13 @@ size_t sf_malloc_usable_size(void *ptr, my_bool *is_thread_specific); void my_error_unregister_all(void); -#if !defined(O_PATH) && defined(O_EXEC) /* FreeBSD */ +#ifndef O_PATH /* not Linux */ +#if defined(O_SEARCH) /* Illumos */ +#define O_PATH O_SEARCH +#elif defined(O_EXEC) /* FreeBSD */ #define O_PATH O_EXEC #endif +#endif #ifdef O_PATH #define HAVE_OPEN_PARENT_DIR_NOSYMLINKS @@ -122,12 +126,21 @@ const char *my_open_parent_dir_nosymlinks(const char *pathname, int *pdfd); res= AT; \ if (dfd >= 0) close(dfd); \ return res; -#elif defined(HAVE_REALPATH) +#elif defined(HAVE_REALPATH) && defined(PATH_MAX) #define NOSYMLINK_FUNCTION_BODY(AT,NOAT) \ char buf[PATH_MAX+1]; \ if (realpath(pathname, buf) == NULL) return -1; \ if (strcmp(pathname, buf)) { errno= ENOTDIR; return -1; } \ return NOAT; +#elif defined(HAVE_REALPATH) +#define NOSYMLINK_FUNCTION_BODY(AT,NOAT) \ + char *buf= realpath(pathname, NULL); \ + int res; \ + if (buf == NULL) return -1; \ + if (strcmp(pathname, buf)) { errno= ENOTDIR; res= -1; } \ + else res= NOAT; \ + free(buf); \ + return res; #else #define NOSYMLINK_FUNCTION_BODY(AT,NOAT) \ return NOAT; diff --git a/mysys/stacktrace.c b/mysys/stacktrace.c index 841a52944df..463cfe03f1d 100644 --- a/mysys/stacktrace.c +++ b/mysys/stacktrace.c @@ -776,7 +776,7 @@ int my_safe_print_str(const char *val, int len) size_t my_write_stderr(const void *buf, size_t count) { - return (size_t) write(STDERR_FILENO, buf, count); + return (size_t) write(fileno(stderr), buf, count); } diff --git a/mysys/thr_lock.c b/mysys/thr_lock.c index c168957097f..25113670015 100644 --- a/mysys/thr_lock.c +++ b/mysys/thr_lock.c @@ -1288,6 +1288,7 @@ thr_multi_lock(THR_LOCK_DATA **data, uint count, THR_LOCK_INFO *owner, DBUG_RETURN(THR_LOCK_SUCCESS); /* lock everything */ + DEBUG_SYNC_C("thr_multi_lock_before_thr_lock"); for (pos=data,end=data+count; pos < end ; pos++) { enum enum_thr_lock_result result= thr_lock(*pos, owner, lock_wait_timeout); @@ -1299,12 +1300,12 @@ thr_multi_lock(THR_LOCK_DATA **data, uint count, THR_LOCK_INFO *owner, (*pos)->type= TL_UNLOCK; DBUG_RETURN(result); } - DEBUG_SYNC_C("thr_multi_lock_after_thr_lock"); #ifdef MAIN printf("Thread: %s Got lock: 0x%lx type: %d\n",my_thread_name(), (long) pos[0]->lock, pos[0]->type); fflush(stdout); #endif } + DEBUG_SYNC_C("thr_multi_lock_after_thr_lock"); /* Call start_trans for all locks. diff --git a/mysys/waiting_threads.c b/mysys/waiting_threads.c index 7d8aae032ea..2549bd8a587 100644 --- a/mysys/waiting_threads.c +++ b/mysys/waiting_threads.c @@ -556,7 +556,7 @@ my_bool wt_resource_id_memcmp(const void *a, const void *b) { /* we use the fact that there's no padding in the middle of WT_RESOURCE_ID */ compile_time_assert(offsetof(WT_RESOURCE_ID, type) == sizeof(ulonglong)); - return memcmp(a, b, sizeof_WT_RESOURCE_ID); + return MY_TEST(memcmp(a, b, sizeof_WT_RESOURCE_ID)); } /** diff --git a/mysys_ssl/CMakeLists.txt b/mysys_ssl/CMakeLists.txt index 4f6f7458c5b..f8a767ed6f3 100644 --- a/mysys_ssl/CMakeLists.txt +++ b/mysys_ssl/CMakeLists.txt @@ -28,6 +28,7 @@ SET(MYSYS_SSL_HIDDEN_SOURCES my_sha384.cc my_sha512.cc my_md5.cc + openssl.c ) SET(MYSYS_SSL_SOURCES diff --git a/mysys_ssl/my_crypt.cc b/mysys_ssl/my_crypt.cc index 5411a908bf8..92f4012d175 100644 --- a/mysys_ssl/my_crypt.cc +++ b/mysys_ssl/my_crypt.cc @@ -1,6 +1,6 @@ /* Copyright (c) 2014 Google Inc. - Copyright (c) 2014, 2015 MariaDB Corporation + Copyright (c) 2014, 2017 MariaDB Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,52 +17,60 @@ #include #include -#include #ifdef HAVE_YASSL #include "yassl.cc" #else - #include #include #include - -#ifdef HAVE_ERR_remove_thread_state -#define ERR_remove_state(X) ERR_remove_thread_state(NULL) +#include #endif -#endif +#include +#include class MyCTX { public: - EVP_CIPHER_CTX ctx; - MyCTX() { EVP_CIPHER_CTX_init(&ctx); } - virtual ~MyCTX() { EVP_CIPHER_CTX_cleanup(&ctx); ERR_remove_state(0); } + char ctx_buf[EVP_CIPHER_CTX_SIZE]; + EVP_CIPHER_CTX *ctx; + + MyCTX() + { + ctx= (EVP_CIPHER_CTX *)ctx_buf; + EVP_CIPHER_CTX_init(ctx); + } + virtual ~MyCTX() + { + EVP_CIPHER_CTX_reset(ctx); + ERR_remove_state(0); + } virtual int init(const EVP_CIPHER *cipher, int encrypt, const uchar *key, uint klen, const uchar *iv, uint ivlen) { + compile_time_assert(MY_AES_CTX_SIZE >= sizeof(MyCTX)); if (unlikely(!cipher)) return MY_AES_BAD_KEYSIZE; - if (!EVP_CipherInit_ex(&ctx, cipher, NULL, key, iv, encrypt)) + if (!EVP_CipherInit_ex(ctx, cipher, NULL, key, iv, encrypt)) return MY_AES_OPENSSL_ERROR; - DBUG_ASSERT(EVP_CIPHER_CTX_key_length(&ctx) == (int)klen); - DBUG_ASSERT(EVP_CIPHER_CTX_iv_length(&ctx) <= (int)ivlen); + DBUG_ASSERT(EVP_CIPHER_CTX_key_length(ctx) == (int)klen); + DBUG_ASSERT(EVP_CIPHER_CTX_iv_length(ctx) <= (int)ivlen); return MY_AES_OK; } virtual int update(const uchar *src, uint slen, uchar *dst, uint *dlen) { - if (!EVP_CipherUpdate(&ctx, dst, (int*)dlen, src, slen)) + if (!EVP_CipherUpdate(ctx, dst, (int*)dlen, src, slen)) return MY_AES_OPENSSL_ERROR; return MY_AES_OK; } virtual int finish(uchar *dst, uint *dlen) { - if (!EVP_CipherFinal_ex(&ctx, dst, (int*)dlen)) + if (!EVP_CipherFinal_ex(ctx, dst, (int*)dlen)) return MY_AES_BAD_DATA; return MY_AES_OK; } @@ -72,7 +80,8 @@ class MyCTX_nopad : public MyCTX { public: const uchar *key; - int klen; + uint klen, buf_len; + uchar oiv[MY_AES_BLOCK_SIZE]; MyCTX_nopad() : MyCTX() { } ~MyCTX_nopad() { } @@ -83,32 +92,48 @@ public: compile_time_assert(MY_AES_CTX_SIZE >= sizeof(MyCTX_nopad)); this->key= key; this->klen= klen; + this->buf_len= 0; + memcpy(oiv, iv, ivlen); + DBUG_ASSERT(ivlen == 0 || ivlen == sizeof(oiv)); + int res= MyCTX::init(cipher, encrypt, key, klen, iv, ivlen); - memcpy(ctx.oiv, iv, ivlen); // in ECB mode OpenSSL doesn't do that itself - EVP_CIPHER_CTX_set_padding(&ctx, 0); + + EVP_CIPHER_CTX_set_padding(ctx, 0); return res; } + int update(const uchar *src, uint slen, uchar *dst, uint *dlen) + { + buf_len+= slen; + return MyCTX::update(src, slen, dst, dlen); + } + int finish(uchar *dst, uint *dlen) { - if (ctx.buf_len) + buf_len %= MY_AES_BLOCK_SIZE; + if (buf_len) { + uchar *buf= EVP_CIPHER_CTX_buf_noconst(ctx); /* Not much we can do, block ciphers cannot encrypt data that aren't a multiple of the block length. At least not without padding. Let's do something CTR-like for the last partial block. + + NOTE this assumes that there are only buf_len bytes in the buf. + If OpenSSL will change that, we'll need to change the implementation + of this class too. */ uchar mask[MY_AES_BLOCK_SIZE]; uint mlen; my_aes_crypt(MY_AES_ECB, ENCRYPTION_FLAG_ENCRYPT | ENCRYPTION_FLAG_NOPAD, - ctx.oiv, sizeof(mask), mask, &mlen, key, klen, 0, 0); + oiv, sizeof(mask), mask, &mlen, key, klen, 0, 0); DBUG_ASSERT(mlen == sizeof(mask)); - for (int i=0; i < ctx.buf_len; i++) - dst[i]= ctx.buf[i] ^ mask[i]; + for (uint i=0; i < buf_len; i++) + dst[i]= buf[i] ^ mask[i]; } - *dlen= ctx.buf_len; + *dlen= buf_len; return MY_AES_OK; } }; @@ -152,7 +177,7 @@ public: { compile_time_assert(MY_AES_CTX_SIZE >= sizeof(MyCTX_gcm)); int res= MyCTX::init(cipher, encrypt, key, klen, iv, ivlen); - int real_ivlen= EVP_CIPHER_CTX_iv_length(&ctx); + int real_ivlen= EVP_CIPHER_CTX_iv_length(ctx); aad= iv + real_ivlen; aadlen= ivlen - real_ivlen; return res; @@ -166,18 +191,18 @@ public: before decrypting the data. it can encrypt data piecewise, like, first half, then the second half, but it must decrypt all at once */ - if (!ctx.encrypt) + if (!EVP_CIPHER_CTX_encrypting(ctx)) { /* encrypted string must contain authenticaton tag (see MDEV-11174) */ if (slen < MY_AES_BLOCK_SIZE) return MY_AES_BAD_DATA; slen-= MY_AES_BLOCK_SIZE; - if(!EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_GCM_SET_TAG, MY_AES_BLOCK_SIZE, + if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, MY_AES_BLOCK_SIZE, (void*)(src + slen))) return MY_AES_OPENSSL_ERROR; } int unused; - if (aadlen && !EVP_CipherUpdate(&ctx, NULL, &unused, aad, aadlen)) + if (aadlen && !EVP_CipherUpdate(ctx, NULL, &unused, aad, aadlen)) return MY_AES_OPENSSL_ERROR; aadlen= 0; return MyCTX::update(src, slen, dst, dlen); @@ -186,13 +211,13 @@ public: int finish(uchar *dst, uint *dlen) { int fin; - if (!EVP_CipherFinal_ex(&ctx, dst, &fin)) + if (!EVP_CipherFinal_ex(ctx, dst, &fin)) return MY_AES_BAD_DATA; DBUG_ASSERT(fin == 0); - if (ctx.encrypt) + if (EVP_CIPHER_CTX_encrypting(ctx)) { - if(!EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_GCM_GET_TAG, MY_AES_BLOCK_SIZE, dst)) + if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, MY_AES_BLOCK_SIZE, dst)) return MY_AES_OPENSSL_ERROR; *dlen= MY_AES_BLOCK_SIZE; } @@ -260,15 +285,44 @@ int my_aes_crypt(enum my_aes_mode mode, int flags, { void *ctx= alloca(MY_AES_CTX_SIZE); int res1, res2; - uint d1, d2; + uint d1= 0, d2; if ((res1= my_aes_crypt_init(ctx, mode, flags, key, klen, iv, ivlen))) return res1; res1= my_aes_crypt_update(ctx, src, slen, dst, &d1); res2= my_aes_crypt_finish(ctx, dst + d1, &d2); - *dlen= d1 + d2; + if (res1 || res2) + ERR_remove_state(0); /* in case of failure clear error queue */ + else + *dlen= d1 + d2; return res1 ? res1 : res2; } + +/* + calculate the length of the cyphertext from the length of the plaintext + for different AES encryption modes with padding enabled. + Without padding (ENCRYPTION_FLAG_NOPAD) cyphertext has the same length + as the plaintext +*/ +unsigned int my_aes_get_size(enum my_aes_mode mode __attribute__((unused)), unsigned int source_length) +{ +#ifdef HAVE_EncryptAes128Ctr + if (mode == MY_AES_CTR) + return source_length; +#ifdef HAVE_EncryptAes128Gcm + if (mode == MY_AES_GCM) + return source_length + MY_AES_BLOCK_SIZE; +#endif +#endif + return (source_length / MY_AES_BLOCK_SIZE + 1) * MY_AES_BLOCK_SIZE; +} + + +unsigned int my_aes_ctx_size(enum my_aes_mode) +{ + return MY_AES_CTX_SIZE; +} + #ifdef HAVE_YASSL #include int my_random_bytes(uchar* buf, int num) @@ -278,17 +332,10 @@ int my_random_bytes(uchar* buf, int num) return MY_AES_OK; } #else -#include int my_random_bytes(uchar *buf, int num) { - /* - Unfortunately RAND_bytes manual page does not provide any guarantees - in relation to blocking behavior. Here we explicitly use SSLeay random - instead of whatever random engine is currently set in OpenSSL. That way - we are guaranteed to have a non-blocking random. - */ - RAND_METHOD *rand = RAND_SSLeay(); + RAND_METHOD *rand = RAND_OpenSSL(); if (rand == NULL || rand->bytes(buf, num) != 1) return MY_AES_OPENSSL_ERROR; return MY_AES_OK; diff --git a/mysys_ssl/my_md5.cc b/mysys_ssl/my_md5.cc index 7139ea9b6ff..582c83d0522 100644 --- a/mysys_ssl/my_md5.cc +++ b/mysys_ssl/my_md5.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2012, Oracle and/or its affiliates. - Copyright (c) 2014, SkySQL Ab. + Copyright (c) 2017, MariaDB Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,38 +29,31 @@ #if defined(HAVE_YASSL) #include "md5.hpp" +#include -typedef TaoCrypt::MD5 MD5_CONTEXT; +typedef TaoCrypt::MD5 EVP_MD_CTX; -static void md5_init(MD5_CONTEXT *context) +static void md5_init(EVP_MD_CTX *context) { - context= new(context) MD5_CONTEXT; + context= new(context) EVP_MD_CTX; context->Init(); } -/* - this is a variant of md5_init to be used in this file only. - does nothing for yassl, because the context's constructor was called automatically. -*/ -static void md5_init_fast(MD5_CONTEXT *context) -{ -} - -static void md5_input(MD5_CONTEXT *context, const uchar *buf, unsigned len) +static void md5_input(EVP_MD_CTX *context, const uchar *buf, unsigned len) { context->Update((const TaoCrypt::byte *) buf, len); } -static void md5_result(MD5_CONTEXT *context, uchar digest[MD5_HASH_SIZE]) +static void md5_result(EVP_MD_CTX *context, uchar digest[MD5_HASH_SIZE]) { context->Final((TaoCrypt::byte *) digest); } #elif defined(HAVE_OPENSSL) #include -typedef EVP_MD_CTX MD5_CONTEXT; +#include -static void md5_init(MD5_CONTEXT *context) +static void md5_init(EVP_MD_CTX *context) { EVP_MD_CTX_init(context); #ifdef EVP_MD_CTX_FLAG_NON_FIPS_ALLOW @@ -70,20 +63,15 @@ static void md5_init(MD5_CONTEXT *context) EVP_DigestInit_ex(context, EVP_md5(), NULL); } -static void md5_init_fast(MD5_CONTEXT *context) -{ - md5_init(context); -} - -static void md5_input(MD5_CONTEXT *context, const uchar *buf, unsigned len) +static void md5_input(EVP_MD_CTX *context, const uchar *buf, unsigned len) { EVP_DigestUpdate(context, buf, len); } -static void md5_result(MD5_CONTEXT *context, uchar digest[MD5_HASH_SIZE]) +static void md5_result(EVP_MD_CTX *context, uchar digest[MD5_HASH_SIZE]) { EVP_DigestFinal_ex(context, digest, NULL); - EVP_MD_CTX_cleanup(context); + EVP_MD_CTX_reset(context); } #endif /* HAVE_YASSL */ @@ -99,58 +87,58 @@ static void md5_result(MD5_CONTEXT *context, uchar digest[MD5_HASH_SIZE]) */ void my_md5(uchar *digest, const char *buf, size_t len) { - MD5_CONTEXT md5_context; - - md5_init_fast(&md5_context); - md5_input(&md5_context, (const uchar *)buf, len); - md5_result(&md5_context, digest); + char ctx_buf[EVP_MD_CTX_SIZE]; + EVP_MD_CTX * const ctx= (EVP_MD_CTX*)ctx_buf; + md5_init(ctx); + md5_input(ctx, (const uchar *)buf, len); + md5_result(ctx, digest); } /** Wrapper function to compute MD5 message digest for - two messages in order to emulate md5(msg1, msg2). + many messages, concatenated. @param digest [out] Computed MD5 digest @param buf1 [in] First message @param len1 [in] Length of first message - @param buf2 [in] Second message - @param len2 [in] Length of second message + ... + @param bufN [in] NULL terminates the list of buf,len pairs. @return void */ void my_md5_multi(uchar *digest, ...) { va_list args; + const uchar *str; + char ctx_buf[EVP_MD_CTX_SIZE]; + EVP_MD_CTX * const ctx= (EVP_MD_CTX*)ctx_buf; va_start(args, digest); - MD5_CONTEXT md5_context; - const uchar *str; - - md5_init_fast(&md5_context); + md5_init(ctx); for (str= va_arg(args, const uchar*); str; str= va_arg(args, const uchar*)) - md5_input(&md5_context, str, va_arg(args, size_t)); + md5_input(ctx, str, va_arg(args, size_t)); - md5_result(&md5_context, digest); + md5_result(ctx, digest); va_end(args); } size_t my_md5_context_size() { - return sizeof(MD5_CONTEXT); + return EVP_MD_CTX_SIZE; } void my_md5_init(void *context) { - md5_init((MD5_CONTEXT *)context); + md5_init((EVP_MD_CTX *)context); } void my_md5_input(void *context, const uchar *buf, size_t len) { - md5_input((MD5_CONTEXT *)context, buf, len); + md5_input((EVP_MD_CTX *)context, buf, len); } void my_md5_result(void *context, uchar *digest) { - md5_result((MD5_CONTEXT *)context, digest); + md5_result((EVP_MD_CTX *)context, digest); } diff --git a/mysys_ssl/openssl.c b/mysys_ssl/openssl.c new file mode 100644 index 00000000000..3f841eec92f --- /dev/null +++ b/mysys_ssl/openssl.c @@ -0,0 +1,72 @@ +/* + Copyright (c) 2017, MariaDB Corporation. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include +#include + +/* + The check is only done for OpenSSL 1.1.x. + It could run for OpenSSL 1.0.x but it doesn't make much sense + and it hits this bug: + https://bugs.launchpad.net/ubuntu/+source/openssl/+bug/1594748 +*/ + +#ifndef HAVE_OPENSSL11 +int check_openssl_compatibility() +{ + return 0; +} +#else +#include + +static uint testing, alloc_size, alloc_count; + +static void *coc_malloc(size_t size, const char *f __attribute__((unused)), + int l __attribute__((unused))) +{ + if (unlikely(testing)) + { + alloc_size+= size; + alloc_count++; + } + return malloc(size); +} + +int check_openssl_compatibility() +{ + EVP_CIPHER_CTX *evp_ctx; + EVP_MD_CTX *md5_ctx; + + if (!CRYPTO_set_mem_functions(coc_malloc, NULL, NULL)) + return 1; + + testing= 1; + alloc_size= alloc_count= 0; + evp_ctx= EVP_CIPHER_CTX_new(); + EVP_CIPHER_CTX_free(evp_ctx); + if (alloc_count != 1 || !alloc_size || alloc_size > EVP_CIPHER_CTX_SIZE) + return 1; + + alloc_size= alloc_count= 0; + md5_ctx= EVP_MD_CTX_create(); + EVP_MD_CTX_destroy(md5_ctx); + if (alloc_count != 1 || !alloc_size || alloc_size > EVP_MD_CTX_SIZE) + return 1; + + testing= 0; + return 0; +} +#endif diff --git a/mysys_ssl/yassl.cc b/mysys_ssl/yassl.cc index 5146c9a9abc..23376c82b4f 100644 --- a/mysys_ssl/yassl.cc +++ b/mysys_ssl/yassl.cc @@ -44,7 +44,6 @@ typedef struct int buf_len; int final_used; uchar tao_buf[sizeof(TaoCrypt::AES)]; // TaoCrypt::AES object - uchar oiv[TaoCrypt::AES::BLOCK_SIZE]; // original IV uchar buf[TaoCrypt::AES::BLOCK_SIZE]; // last partial input block uchar final[TaoCrypt::AES::BLOCK_SIZE]; // last decrypted (output) block } EVP_CIPHER_CTX; @@ -97,10 +96,7 @@ static int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, : TaoCrypt::DECRYPTION, cipher->mode); TAO(ctx)->SetKey(key, cipher->key_len); if (iv) - { TAO(ctx)->SetIV(iv); - memcpy(ctx->oiv, iv, TaoCrypt::AES::BLOCK_SIZE); - } ctx->encrypt= enc; ctx->key_len= cipher->key_len; ctx->flags|= cipher->mode == TaoCrypt::CBC ? EVP_CIPH_CBC_MODE : EVP_CIPH_ECB_MODE; diff --git a/pcre/CMakeLists.txt b/pcre/CMakeLists.txt index 30b06a46fef..8aaa9b57361 100644 --- a/pcre/CMakeLists.txt +++ b/pcre/CMakeLists.txt @@ -510,6 +510,6 @@ IF(PCRE_SHOW_REPORT) MESSAGE(STATUS "") ENDIF(PCRE_SHOW_REPORT) -INSTALL(FILES ${CMAKE_BINARY_DIR}/pcre/pcre.h DESTINATION ${INSTALL_INCLUDEDIR}/private COMPONENT Development) +INSTALL(FILES ${CMAKE_BINARY_DIR}/pcre/pcre.h DESTINATION ${INSTALL_INCLUDEDIR}/server/private COMPONENT Development) # end CMakeLists.txt diff --git a/pcre/ChangeLog b/pcre/ChangeLog index 01511b1327c..590a7542885 100644 --- a/pcre/ChangeLog +++ b/pcre/ChangeLog @@ -4,6 +4,53 @@ ChangeLog for PCRE Note that the PCRE 8.xx series (PCRE1) is now in a bugfix-only state. All development is happening in the PCRE2 10.xx series. +Version 8.41 05-July-2017 +------------------------- + +1. Fixed typo in CMakeLists.txt (wrong number of arguments for +PCRE_STATIC_RUNTIME (affects MSVC only). + +2. Issue 1 for 8.40 below was not correctly fixed. If pcregrep in multiline +mode with --only-matching matched several lines, it restarted scanning at the +next line instead of moving on to the end of the matched string, which can be +several lines after the start. + +3. Fix a missing else in the JIT compiler reported by 'idaifish'. + +4. A (?# style comment is now ignored between a basic quantifier and a +following '+' or '?' (example: /X+(?#comment)?Y/. + +5. Avoid use of a potentially overflowing buffer in pcregrep (patch by Petr +Pisar). + +6. Fuzzers have reported issues in pcretest. These are NOT serious (it is, +after all, just a test program). However, to stop the reports, some easy ones +are fixed: + + (a) Check for values < 256 when calling isprint() in pcretest. + (b) Give an error for too big a number after \O. + +7. In the 32-bit library in non-UTF mode, an attempt to find a Unicode +property for a character with a code point greater than 0x10ffff (the Unicode +maximum) caused a crash. + +8. The alternative matching function, pcre_dfa_exec() misbehaved if it +encountered a character class with a possessive repeat, for example [a-f]{3}+. + +9. When pcretest called pcre_copy_substring() in 32-bit mode, it set the buffer +length incorrectly, which could result in buffer overflow. + +10. Remove redundant line of code (accidentally left in ages ago). + +11. Applied C++ patch from Irfan Adilovic to guard 'using std::' directives +with namespace pcrecpp (Bugzilla #2084). + +12. Remove a duplication typo in pcre_tables.c. + +13. Fix returned offsets from regexec() when REG_STARTEND is used with a +starting offset greater than zero. + + Version 8.40 11-January-2017 ---------------------------- diff --git a/pcre/NEWS b/pcre/NEWS index b92c4f9605e..36be07cb880 100644 --- a/pcre/NEWS +++ b/pcre/NEWS @@ -1,6 +1,12 @@ News about PCRE releases ------------------------ +Release 8.41 13-June-2017 +------------------------- + +This is a bug-fix release. + + Release 8.40 11-January-2017 ---------------------------- diff --git a/pcre/configure.ac b/pcre/configure.ac index 24ef7271e05..718a18508c9 100644 --- a/pcre/configure.ac +++ b/pcre/configure.ac @@ -9,18 +9,18 @@ dnl The PCRE_PRERELEASE feature is for identifying release candidates. It might dnl be defined as -RC2, for example. For real releases, it should be empty. m4_define(pcre_major, [8]) -m4_define(pcre_minor, [40]) +m4_define(pcre_minor, [41]) m4_define(pcre_prerelease, []) -m4_define(pcre_date, [2017-01-11]) +m4_define(pcre_date, [2017-07-05]) # NOTE: The CMakeLists.txt file searches for the above variables in the first # 50 lines of this file. Please update that if the variables above are moved. # Libtool shared library interface versions (current:revision:age) -m4_define(libpcre_version, [3:8:2]) -m4_define(libpcre16_version, [2:8:2]) -m4_define(libpcre32_version, [0:8:0]) -m4_define(libpcreposix_version, [0:4:0]) +m4_define(libpcre_version, [3:9:2]) +m4_define(libpcre16_version, [2:9:2]) +m4_define(libpcre32_version, [0:9:0]) +m4_define(libpcreposix_version, [0:5:0]) m4_define(libpcrecpp_version, [0:1:0]) AC_PREREQ(2.57) diff --git a/pcre/doc/html/pcrejit.html b/pcre/doc/html/pcrejit.html index 210f1da0262..abb342522f9 100644 --- a/pcre/doc/html/pcrejit.html +++ b/pcre/doc/html/pcrejit.html @@ -79,9 +79,12 @@ API that is JIT-specific.

If your program may sometimes be linked with versions of PCRE that are older -than 8.20, but you want to use JIT when it is available, you can test -the values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT macro such -as PCRE_CONFIG_JIT, for compile-time control of your code. +than 8.20, but you want to use JIT when it is available, you can test the +values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT macro such as +PCRE_CONFIG_JIT, for compile-time control of your code. Also beware that the +pcre_jit_exec() function was not available at all before 8.32, +and may not be available at all if PCRE isn't compiled with +--enable-jit. See the "JIT FAST PATH API" section below for details.


SIMPLE USE OF JIT

@@ -119,6 +122,20 @@ when you call pcre_study(): PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE +If using pcre_jit_exec() and supporting a pre-8.32 version of +PCRE, you can insert: +

+   #if PCRE_MAJOR >= 8 && PCRE_MINOR >= 32
+   pcre_jit_exec(...);
+   #else
+   pcre_exec(...)
+   #endif
+
+but as described in the "JIT FAST PATH API" section below this assumes +version 8.32 and later are compiled with --enable-jit, which may +break. +
+
The JIT compiler generates different optimized code for each of the three modes (normal, soft partial, hard partial). When pcre_exec() is called, the appropriate code is run if it is available. Otherwise, the pattern is @@ -428,6 +445,36 @@ fast path, and if invalid data is passed, the result is undefined. Bypassing the sanity checks and the pcre_exec() wrapping can give speedups of more than 10%.

+

+Note that the pcre_jit_exec() function is not available in versions of +PCRE before 8.32 (released in November 2012). If you need to support versions +that old you must either use the slower pcre_exec(), or switch between +the two codepaths by checking the values of PCRE_MAJOR and PCRE_MINOR. +

+

+Due to an unfortunate implementation oversight, even in versions 8.32 +and later there will be no pcre_jit_exec() stub function defined +when PCRE is compiled with --disable-jit, which is the default, and +there's no way to detect whether PCRE was compiled with --enable-jit +via a macro. +

+

+If you need to support versions older than 8.32, or versions that may +not build with --enable-jit, you must either use the slower +pcre_exec(), or switch between the two codepaths by checking the +values of PCRE_MAJOR and PCRE_MINOR. +

+

+Switching between the two by checking the version assumes that all the +versions being targeted are built with --enable-jit. To also support +builds that may use --disable-jit either pcre_exec() must be +used, or a compile-time check for JIT via pcre_config() (which +assumes the runtime environment will be the same), or as the Git +project decided to do, simply assume that pcre_jit_exec() is +present in 8.32 or later unless a compile-time flag is provided, see +the "grep: un-break building with PCRE >= 8.32 without --enable-jit" +commit in git.git for an example of that. +


SEE ALSO

pcreapi(3) @@ -443,9 +490,9 @@ Cambridge CB2 3QH, England.


REVISION

-Last updated: 17 March 2013 +Last updated: 05 July 2017
-Copyright © 1997-2013 University of Cambridge. +Copyright © 1997-2017 University of Cambridge.

Return to the PCRE index page. diff --git a/pcre/doc/html/pcretest.html b/pcre/doc/html/pcretest.html index 839fabf189b..ba540d3c385 100644 --- a/pcre/doc/html/pcretest.html +++ b/pcre/doc/html/pcretest.html @@ -74,6 +74,11 @@ newline as data characters. However, in some Windows environments character 26 maximum portability, therefore, it is safest to use only ASCII characters in pcretest input files.

+

+The input is processed using using C's string functions, so must not +contain binary zeroes, even though in Unix-like environments, fgets() +treats any bytes other than newline as data characters. +


PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES

From release 8.30, two separate PCRE libraries can be built. The original one @@ -1149,9 +1154,9 @@ Cambridge CB2 3QH, England.


REVISION

-Last updated: 09 February 2014 +Last updated: 23 February 2017
-Copyright © 1997-2014 University of Cambridge. +Copyright © 1997-2017 University of Cambridge.

Return to the PCRE index page. diff --git a/pcre/doc/pcre.txt b/pcre/doc/pcre.txt index d68d5033ceb..c027538f500 100644 --- a/pcre/doc/pcre.txt +++ b/pcre/doc/pcre.txt @@ -8365,7 +8365,11 @@ AVAILABILITY OF JIT SUPPORT If your program may sometimes be linked with versions of PCRE that are older than 8.20, but you want to use JIT when it is available, you can test the values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT - macro such as PCRE_CONFIG_JIT, for compile-time control of your code. + macro such as PCRE_CONFIG_JIT, for compile-time control of your code. + Also beware that the pcre_jit_exec() function was not available at all + before 8.32, and may not be available at all if PCRE isn't compiled + with --enable-jit. See the "JIT FAST PATH API" section below for + details. SIMPLE USE OF JIT @@ -8407,6 +8411,18 @@ SIMPLE USE OF JIT PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE + If using pcre_jit_exec() and supporting a pre-8.32 version of PCRE, you + can insert: + + #if PCRE_MAJOR >= 8 && PCRE_MINOR >= 32 + pcre_jit_exec(...); + #else + pcre_exec(...) + #endif + + but as described in the "JIT FAST PATH API" section below this assumes + version 8.32 and later are compiled with --enable-jit, which may break. + The JIT compiler generates different optimized code for each of the three modes (normal, soft partial, hard partial). When pcre_exec() is called, the appropriate code is run if it is available. Otherwise, the @@ -8696,6 +8712,33 @@ JIT FAST PATH API Bypassing the sanity checks and the pcre_exec() wrapping can give speedups of more than 10%. + Note that the pcre_jit_exec() function is not available in versions of + PCRE before 8.32 (released in November 2012). If you need to support + versions that old you must either use the slower pcre_exec(), or switch + between the two codepaths by checking the values of PCRE_MAJOR and + PCRE_MINOR. + + Due to an unfortunate implementation oversight, even in versions 8.32 + and later there will be no pcre_jit_exec() stub function defined when + PCRE is compiled with --disable-jit, which is the default, and there's + no way to detect whether PCRE was compiled with --enable-jit via a + macro. + + If you need to support versions older than 8.32, or versions that may + not build with --enable-jit, you must either use the slower + pcre_exec(), or switch between the two codepaths by checking the values + of PCRE_MAJOR and PCRE_MINOR. + + Switching between the two by checking the version assumes that all the + versions being targeted are built with --enable-jit. To also support + builds that may use --disable-jit either pcre_exec() must be used, or a + compile-time check for JIT via pcre_config() (which assumes the runtime + environment will be the same), or as the Git project decided to do, + simply assume that pcre_jit_exec() is present in 8.32 or later unless a + compile-time flag is provided, see the "grep: un-break building with + PCRE >= 8.32 without --enable-jit" commit in git.git for an example of + that. + SEE ALSO @@ -8711,8 +8754,8 @@ AUTHOR REVISION - Last updated: 17 March 2013 - Copyright (c) 1997-2013 University of Cambridge. + Last updated: 05 July 2017 + Copyright (c) 1997-2017 University of Cambridge. ------------------------------------------------------------------------------ diff --git a/pcre/doc/pcrejit.3 b/pcre/doc/pcrejit.3 index 341403f7c84..3b785f0f631 100644 --- a/pcre/doc/pcrejit.3 +++ b/pcre/doc/pcrejit.3 @@ -1,4 +1,4 @@ -.TH PCREJIT 3 "17 March 2013" "PCRE 8.33" +.TH PCREJIT 3 "05 July 2017" "PCRE 8.41" .SH NAME PCRE - Perl-compatible regular expressions .SH "PCRE JUST-IN-TIME COMPILER SUPPORT" @@ -54,9 +54,12 @@ programs that need the best possible performance, there is also a "fast path" API that is JIT-specific. .P If your program may sometimes be linked with versions of PCRE that are older -than 8.20, but you want to use JIT when it is available, you can test -the values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT macro such -as PCRE_CONFIG_JIT, for compile-time control of your code. +than 8.20, but you want to use JIT when it is available, you can test the +values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT macro such as +PCRE_CONFIG_JIT, for compile-time control of your code. Also beware that the +\fBpcre_jit_exec()\fP function was not available at all before 8.32, +and may not be available at all if PCRE isn't compiled with +--enable-jit. See the "JIT FAST PATH API" section below for details. . . .SH "SIMPLE USE OF JIT" @@ -96,6 +99,19 @@ when you call \fBpcre_study()\fP: PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE .sp +If using \fBpcre_jit_exec()\fP and supporting a pre-8.32 version of +PCRE, you can insert: +.sp + #if PCRE_MAJOR >= 8 && PCRE_MINOR >= 32 + pcre_jit_exec(...); + #else + pcre_exec(...) + #endif +.sp +but as described in the "JIT FAST PATH API" section below this assumes +version 8.32 and later are compiled with --enable-jit, which may +break. +.sp The JIT compiler generates different optimized code for each of the three modes (normal, soft partial, hard partial). When \fBpcre_exec()\fP is called, the appropriate code is run if it is available. Otherwise, the pattern is @@ -404,6 +420,32 @@ fast path, and if invalid data is passed, the result is undefined. .P Bypassing the sanity checks and the \fBpcre_exec()\fP wrapping can give speedups of more than 10%. +.P +Note that the \fBpcre_jit_exec()\fP function is not available in versions of +PCRE before 8.32 (released in November 2012). If you need to support versions +that old you must either use the slower \fBpcre_exec()\fP, or switch between +the two codepaths by checking the values of PCRE_MAJOR and PCRE_MINOR. +.P +Due to an unfortunate implementation oversight, even in versions 8.32 +and later there will be no \fBpcre_jit_exec()\fP stub function defined +when PCRE is compiled with --disable-jit, which is the default, and +there's no way to detect whether PCRE was compiled with --enable-jit +via a macro. +.P +If you need to support versions older than 8.32, or versions that may +not build with --enable-jit, you must either use the slower +\fBpcre_exec()\fP, or switch between the two codepaths by checking the +values of PCRE_MAJOR and PCRE_MINOR. +.P +Switching between the two by checking the version assumes that all the +versions being targeted are built with --enable-jit. To also support +builds that may use --disable-jit either \fBpcre_exec()\fP must be +used, or a compile-time check for JIT via \fBpcre_config()\fP (which +assumes the runtime environment will be the same), or as the Git +project decided to do, simply assume that \fBpcre_jit_exec()\fP is +present in 8.32 or later unless a compile-time flag is provided, see +the "grep: un-break building with PCRE >= 8.32 without --enable-jit" +commit in git.git for an example of that. . . .SH "SEE ALSO" @@ -426,6 +468,6 @@ Cambridge CB2 3QH, England. .rs .sp .nf -Last updated: 17 March 2013 -Copyright (c) 1997-2013 University of Cambridge. +Last updated: 05 July 2017 +Copyright (c) 1997-2017 University of Cambridge. .fi diff --git a/pcre/doc/pcretest.1 b/pcre/doc/pcretest.1 index 92640da8e1b..ea7457c03d0 100644 --- a/pcre/doc/pcretest.1 +++ b/pcre/doc/pcretest.1 @@ -1,4 +1,4 @@ -.TH PCRETEST 1 "09 February 2014" "PCRE 8.35" +.TH PCRETEST 1 "23 February 2017" "PCRE 8.41" .SH NAME pcretest - a program for testing Perl-compatible regular expressions. .SH SYNOPSIS @@ -50,6 +50,10 @@ newline as data characters. However, in some Windows environments character 26 (hex 1A) causes an immediate end of file, and no further data is read. For maximum portability, therefore, it is safest to use only ASCII characters in \fBpcretest\fP input files. +.P +The input is processed using using C's string functions, so must not +contain binary zeroes, even though in Unix-like environments, \fBfgets()\fP +treats any bytes other than newline as data characters. . . .SH "PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES" @@ -1151,6 +1155,6 @@ Cambridge CB2 3QH, England. .rs .sp .nf -Last updated: 09 February 2014 -Copyright (c) 1997-2014 University of Cambridge. +Last updated: 23 February 2017 +Copyright (c) 1997-2017 University of Cambridge. .fi diff --git a/pcre/doc/pcretest.txt b/pcre/doc/pcretest.txt index 55de5024431..6d7305cfe82 100644 --- a/pcre/doc/pcretest.txt +++ b/pcre/doc/pcretest.txt @@ -39,6 +39,10 @@ INPUT DATA FORMAT For maximum portability, therefore, it is safest to use only ASCII characters in pcretest input files. + The input is processed using using C's string functions, so must not + contain binary zeroes, even though in Unix-like environments, fgets() + treats any bytes other than newline as data characters. + PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES @@ -1083,5 +1087,5 @@ AUTHOR REVISION - Last updated: 09 February 2014 - Copyright (c) 1997-2014 University of Cambridge. + Last updated: 23 February 2017 + Copyright (c) 1997-2017 University of Cambridge. diff --git a/pcre/pcre_compile.c b/pcre/pcre_compile.c index de92313e2f8..1a916693e69 100644 --- a/pcre/pcre_compile.c +++ b/pcre/pcre_compile.c @@ -1249,6 +1249,7 @@ else if ((c = *ptr) >= CHAR_8) break; + /* fall through */ /* Fall through with a digit less than 8 */ /* \0 always starts an octal number, but we may drop through to here with a @@ -5097,6 +5098,8 @@ for (;; ptr++) either not match or match, depending on whether the class is or is not negated. */ + /* fall through */ + default: if (local_negate && (xclass || tempptr[2] != CHAR_RIGHT_SQUARE_BRACKET)) @@ -5739,6 +5742,21 @@ for (;; ptr++) ptr = p - 1; /* Character before the next significant one. */ } + /* We also need to skip over (?# comments, which are not dependent on + extended mode. */ + + if (ptr[1] == CHAR_LEFT_PARENTHESIS && ptr[2] == CHAR_QUESTION_MARK && + ptr[3] == CHAR_NUMBER_SIGN) + { + ptr += 4; + while (*ptr != CHAR_NULL && *ptr != CHAR_RIGHT_PARENTHESIS) ptr++; + if (*ptr == CHAR_NULL) + { + *errorcodeptr = ERR18; + goto FAILED; + } + } + /* If the next character is '+', we have a possessive quantifier. This implies greediness, whatever the setting of the PCRE_UNGREEDY option. If the next character is '?' this is a minimizing repeat, by default, @@ -7150,7 +7168,7 @@ for (;; ptr++) goto FAILED; } /* Fall through to handle (?P< as (?< is handled */ - + /* fall through */ /* ------------------------------------------------------------ */ DEFINE_NAME: /* Come here from (?< handling */ @@ -8210,7 +8228,6 @@ for (;; ptr++) if (mclength == 1 || req_caseopt == 0) { - firstchar = mcbuffer[0] | req_caseopt; firstchar = mcbuffer[0]; firstcharflags = req_caseopt; diff --git a/pcre/pcre_dfa_exec.c b/pcre/pcre_dfa_exec.c index 170ce6a0016..bc09ced3a7c 100644 --- a/pcre/pcre_dfa_exec.c +++ b/pcre/pcre_dfa_exec.c @@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language (but see below for why this module is different). Written by Philip Hazel - Copyright (c) 1997-2014 University of Cambridge + Copyright (c) 1997-2017 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -2625,7 +2625,7 @@ for (;;) if (isinclass) { int max = (int)GET2(ecode, 1 + IMM2_SIZE); - if (*ecode == OP_CRPOSRANGE) + if (*ecode == OP_CRPOSRANGE && count >= (int)GET2(ecode, 1)) { active_count--; /* Remove non-match possibility */ next_active_state--; diff --git a/pcre/pcre_exec.c b/pcre/pcre_exec.c index 24b23ca2864..70ac2fea381 100644 --- a/pcre/pcre_exec.c +++ b/pcre/pcre_exec.c @@ -669,7 +669,7 @@ if (ecode == NULL) return match((PCRE_PUCHAR)&rdepth, NULL, NULL, 0, NULL, NULL, 1); else { - int len = (char *)&rdepth - (char *)eptr; + int len = (int)((char *)&rdepth - (char *)eptr); return (len > 0)? -len : len; } } @@ -1053,6 +1053,8 @@ for (;;) group. At this point, the return is converted into MATCH_NOMATCH so that previous backup points can be taken. */ + /* fall through */ + case OP_ONCE: case OP_BRA: case OP_SBRA: diff --git a/pcre/pcre_internal.h b/pcre/pcre_internal.h index 2923b29f82d..97ff55d03b3 100644 --- a/pcre/pcre_internal.h +++ b/pcre/pcre_internal.h @@ -2772,6 +2772,9 @@ extern const pcre_uint8 PRIV(ucd_stage1)[]; extern const pcre_uint16 PRIV(ucd_stage2)[]; extern const pcre_uint32 PRIV(ucp_gentype)[]; extern const pcre_uint32 PRIV(ucp_gbtable)[]; +#ifdef COMPILE_PCRE32 +extern const ucd_record PRIV(dummy_ucd_record)[]; +#endif #ifdef SUPPORT_JIT extern const int PRIV(ucp_typerange)[]; #endif @@ -2780,10 +2783,16 @@ extern const int PRIV(ucp_typerange)[]; /* UCD access macros */ #define UCD_BLOCK_SIZE 128 -#define GET_UCD(ch) (PRIV(ucd_records) + \ +#define REAL_GET_UCD(ch) (PRIV(ucd_records) + \ PRIV(ucd_stage2)[PRIV(ucd_stage1)[(int)(ch) / UCD_BLOCK_SIZE] * \ UCD_BLOCK_SIZE + (int)(ch) % UCD_BLOCK_SIZE]) +#ifdef COMPILE_PCRE32 +#define GET_UCD(ch) ((ch > 0x10ffff)? PRIV(dummy_ucd_record) : REAL_GET_UCD(ch)) +#else +#define GET_UCD(ch) REAL_GET_UCD(ch) +#endif + #define UCD_CHARTYPE(ch) GET_UCD(ch)->chartype #define UCD_SCRIPT(ch) GET_UCD(ch)->script #define UCD_CATEGORY(ch) PRIV(ucp_gentype)[UCD_CHARTYPE(ch)] diff --git a/pcre/pcre_jit_compile.c b/pcre/pcre_jit_compile.c index 46ce6c65d54..249edbe8e7f 100644 --- a/pcre/pcre_jit_compile.c +++ b/pcre/pcre_jit_compile.c @@ -487,7 +487,7 @@ typedef struct compare_context { #undef CMP /* Used for accessing the elements of the stack. */ -#define STACK(i) ((-(i) - 1) * (int)sizeof(sljit_sw)) +#define STACK(i) ((i) * (int)sizeof(sljit_sw)) #define TMP1 SLJIT_R0 #define TMP2 SLJIT_R2 @@ -552,13 +552,15 @@ the start pointers when the end of the capturing group has not yet reached. */ sljit_emit_cmp(compiler, (type), (src1), (src1w), (src2), (src2w)) #define CMPTO(type, src1, src1w, src2, src2w, label) \ sljit_set_label(sljit_emit_cmp(compiler, (type), (src1), (src1w), (src2), (src2w)), (label)) -#define OP_FLAGS(op, dst, dstw, src, srcw, type) \ - sljit_emit_op_flags(compiler, (op), (dst), (dstw), (src), (srcw), (type)) +#define OP_FLAGS(op, dst, dstw, type) \ + sljit_emit_op_flags(compiler, (op), (dst), (dstw), (type)) #define GET_LOCAL_BASE(dst, dstw, offset) \ sljit_get_local_base(compiler, (dst), (dstw), (offset)) #define READ_CHAR_MAX 0x7fffffff +#define INVALID_UTF_CHAR 888 + static pcre_uchar *bracketend(pcre_uchar *cc) { SLJIT_ASSERT((*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NOT) || (*cc >= OP_ONCE && *cc <= OP_SCOND)); @@ -784,7 +786,7 @@ switch(*cc) default: /* All opcodes are supported now! */ - SLJIT_ASSERT_STOP(); + SLJIT_UNREACHABLE(); return NULL; } } @@ -1660,9 +1662,9 @@ while (cc < ccend) { OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0)); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -OVECTOR(0)); - stackpos += (int)sizeof(sljit_sw); + stackpos -= (int)sizeof(sljit_sw); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0); - stackpos += (int)sizeof(sljit_sw); + stackpos -= (int)sizeof(sljit_sw); setsom_found = TRUE; } cc += 1; @@ -1676,9 +1678,9 @@ while (cc < ccend) { OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -common->mark_ptr); - stackpos += (int)sizeof(sljit_sw); + stackpos -= (int)sizeof(sljit_sw); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0); - stackpos += (int)sizeof(sljit_sw); + stackpos -= (int)sizeof(sljit_sw); setmark_found = TRUE; } cc += 1 + 2 + cc[1]; @@ -1689,27 +1691,27 @@ while (cc < ccend) { OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0)); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -OVECTOR(0)); - stackpos += (int)sizeof(sljit_sw); + stackpos -= (int)sizeof(sljit_sw); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0); - stackpos += (int)sizeof(sljit_sw); + stackpos -= (int)sizeof(sljit_sw); setsom_found = TRUE; } if (common->mark_ptr != 0 && !setmark_found) { OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -common->mark_ptr); - stackpos += (int)sizeof(sljit_sw); + stackpos -= (int)sizeof(sljit_sw); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0); - stackpos += (int)sizeof(sljit_sw); + stackpos -= (int)sizeof(sljit_sw); setmark_found = TRUE; } if (common->capture_last_ptr != 0 && !capture_last_found) { OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -common->capture_last_ptr); - stackpos += (int)sizeof(sljit_sw); + stackpos -= (int)sizeof(sljit_sw); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0); - stackpos += (int)sizeof(sljit_sw); + stackpos -= (int)sizeof(sljit_sw); capture_last_found = TRUE; } cc += 1 + LINK_SIZE; @@ -1723,20 +1725,20 @@ while (cc < ccend) { OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -common->capture_last_ptr); - stackpos += (int)sizeof(sljit_sw); + stackpos -= (int)sizeof(sljit_sw); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0); - stackpos += (int)sizeof(sljit_sw); + stackpos -= (int)sizeof(sljit_sw); capture_last_found = TRUE; } offset = (GET2(cc, 1 + LINK_SIZE)) << 1; OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, OVECTOR(offset)); - stackpos += (int)sizeof(sljit_sw); + stackpos -= (int)sizeof(sljit_sw); OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset)); OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1)); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0); - stackpos += (int)sizeof(sljit_sw); + stackpos -= (int)sizeof(sljit_sw); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP2, 0); - stackpos += (int)sizeof(sljit_sw); + stackpos -= (int)sizeof(sljit_sw); cc += 1 + LINK_SIZE + IMM2_SIZE; break; @@ -1887,18 +1889,17 @@ BOOL tmp1empty = TRUE; BOOL tmp2empty = TRUE; pcre_uchar *alternative; enum { - start, loop, end } status; -status = save ? start : loop; -stackptr = STACK(stackptr - 2); +status = loop; +stackptr = STACK(stackptr); stacktop = STACK(stacktop - 1); if (!save) { - stackptr += (needs_control_head ? 2 : 1) * sizeof(sljit_sw); + stacktop -= (needs_control_head ? 2 : 1) * sizeof(sljit_sw); if (stackptr < stacktop) { OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), stackptr); @@ -1914,196 +1915,186 @@ if (!save) /* The tmp1next must be TRUE in either way. */ } +SLJIT_ASSERT(common->recursive_head_ptr != 0); + do { count = 0; - switch(status) + if (cc >= ccend) { - case start: - SLJIT_ASSERT(save && common->recursive_head_ptr != 0); + if (!save) + break; + count = 1; srcw[0] = common->recursive_head_ptr; if (needs_control_head) { SLJIT_ASSERT(common->control_head_ptr != 0); count = 2; - srcw[1] = common->control_head_ptr; + srcw[0] = common->control_head_ptr; + srcw[1] = common->recursive_head_ptr; } - status = loop; + status = end; + } + else switch(*cc) + { + case OP_KET: + if (PRIVATE_DATA(cc) != 0) + { + count = 1; + srcw[0] = PRIVATE_DATA(cc); + SLJIT_ASSERT(PRIVATE_DATA(cc + 1) != 0); + cc += PRIVATE_DATA(cc + 1); + } + cc += 1 + LINK_SIZE; break; - case loop: - if (cc >= ccend) + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + case OP_ONCE: + case OP_ONCE_NC: + case OP_BRAPOS: + case OP_SBRA: + case OP_SBRAPOS: + case OP_SCOND: + count = 1; + srcw[0] = PRIVATE_DATA(cc); + SLJIT_ASSERT(srcw[0] != 0); + cc += 1 + LINK_SIZE; + break; + + case OP_CBRA: + case OP_SCBRA: + if (common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] == 0) { - status = end; - break; + count = 1; + srcw[0] = OVECTOR_PRIV(GET2(cc, 1 + LINK_SIZE)); } + cc += 1 + LINK_SIZE + IMM2_SIZE; + break; - switch(*cc) + case OP_CBRAPOS: + case OP_SCBRAPOS: + count = 2; + srcw[0] = PRIVATE_DATA(cc); + srcw[1] = OVECTOR_PRIV(GET2(cc, 1 + LINK_SIZE)); + SLJIT_ASSERT(srcw[0] != 0 && srcw[1] != 0); + cc += 1 + LINK_SIZE + IMM2_SIZE; + break; + + case OP_COND: + /* Might be a hidden SCOND. */ + alternative = cc + GET(cc, 1); + if (*alternative == OP_KETRMAX || *alternative == OP_KETRMIN) { - case OP_KET: - if (PRIVATE_DATA(cc) != 0) - { - count = 1; - srcw[0] = PRIVATE_DATA(cc); - SLJIT_ASSERT(PRIVATE_DATA(cc + 1) != 0); - cc += PRIVATE_DATA(cc + 1); - } - cc += 1 + LINK_SIZE; - break; - - case OP_ASSERT: - case OP_ASSERT_NOT: - case OP_ASSERTBACK: - case OP_ASSERTBACK_NOT: - case OP_ONCE: - case OP_ONCE_NC: - case OP_BRAPOS: - case OP_SBRA: - case OP_SBRAPOS: - case OP_SCOND: count = 1; srcw[0] = PRIVATE_DATA(cc); SLJIT_ASSERT(srcw[0] != 0); - cc += 1 + LINK_SIZE; - break; - - case OP_CBRA: - case OP_SCBRA: - if (common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] == 0) - { - count = 1; - srcw[0] = OVECTOR_PRIV(GET2(cc, 1 + LINK_SIZE)); - } - cc += 1 + LINK_SIZE + IMM2_SIZE; - break; - - case OP_CBRAPOS: - case OP_SCBRAPOS: - count = 2; - srcw[0] = PRIVATE_DATA(cc); - srcw[1] = OVECTOR_PRIV(GET2(cc, 1 + LINK_SIZE)); - SLJIT_ASSERT(srcw[0] != 0 && srcw[1] != 0); - cc += 1 + LINK_SIZE + IMM2_SIZE; - break; - - case OP_COND: - /* Might be a hidden SCOND. */ - alternative = cc + GET(cc, 1); - if (*alternative == OP_KETRMAX || *alternative == OP_KETRMIN) - { - count = 1; - srcw[0] = PRIVATE_DATA(cc); - SLJIT_ASSERT(srcw[0] != 0); - } - cc += 1 + LINK_SIZE; - break; - - CASE_ITERATOR_PRIVATE_DATA_1 - if (PRIVATE_DATA(cc)) - { - count = 1; - srcw[0] = PRIVATE_DATA(cc); - } - cc += 2; -#ifdef SUPPORT_UTF - if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); -#endif - break; - - CASE_ITERATOR_PRIVATE_DATA_2A - if (PRIVATE_DATA(cc)) - { - count = 2; - srcw[0] = PRIVATE_DATA(cc); - srcw[1] = PRIVATE_DATA(cc) + sizeof(sljit_sw); - } - cc += 2; -#ifdef SUPPORT_UTF - if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); -#endif - break; - - CASE_ITERATOR_PRIVATE_DATA_2B - if (PRIVATE_DATA(cc)) - { - count = 2; - srcw[0] = PRIVATE_DATA(cc); - srcw[1] = PRIVATE_DATA(cc) + sizeof(sljit_sw); - } - cc += 2 + IMM2_SIZE; -#ifdef SUPPORT_UTF - if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); -#endif - break; - - CASE_ITERATOR_TYPE_PRIVATE_DATA_1 - if (PRIVATE_DATA(cc)) - { - count = 1; - srcw[0] = PRIVATE_DATA(cc); - } - cc += 1; - break; - - CASE_ITERATOR_TYPE_PRIVATE_DATA_2A - if (PRIVATE_DATA(cc)) - { - count = 2; - srcw[0] = PRIVATE_DATA(cc); - srcw[1] = srcw[0] + sizeof(sljit_sw); - } - cc += 1; - break; - - CASE_ITERATOR_TYPE_PRIVATE_DATA_2B - if (PRIVATE_DATA(cc)) - { - count = 2; - srcw[0] = PRIVATE_DATA(cc); - srcw[1] = srcw[0] + sizeof(sljit_sw); - } - cc += 1 + IMM2_SIZE; - break; - - case OP_CLASS: - case OP_NCLASS: -#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 - case OP_XCLASS: - size = (*cc == OP_XCLASS) ? GET(cc, 1) : 1 + 32 / (int)sizeof(pcre_uchar); -#else - size = 1 + 32 / (int)sizeof(pcre_uchar); -#endif - if (PRIVATE_DATA(cc)) - switch(get_class_iterator_size(cc + size)) - { - case 1: - count = 1; - srcw[0] = PRIVATE_DATA(cc); - break; - - case 2: - count = 2; - srcw[0] = PRIVATE_DATA(cc); - srcw[1] = srcw[0] + sizeof(sljit_sw); - break; - - default: - SLJIT_ASSERT_STOP(); - break; - } - cc += size; - break; - - default: - cc = next_opcode(common, cc); - SLJIT_ASSERT(cc != NULL); - break; } + cc += 1 + LINK_SIZE; break; - case end: - SLJIT_ASSERT_STOP(); + CASE_ITERATOR_PRIVATE_DATA_1 + if (PRIVATE_DATA(cc)) + { + count = 1; + srcw[0] = PRIVATE_DATA(cc); + } + cc += 2; +#ifdef SUPPORT_UTF + if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif + break; + + CASE_ITERATOR_PRIVATE_DATA_2A + if (PRIVATE_DATA(cc)) + { + count = 2; + srcw[0] = PRIVATE_DATA(cc); + srcw[1] = PRIVATE_DATA(cc) + sizeof(sljit_sw); + } + cc += 2; +#ifdef SUPPORT_UTF + if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif + break; + + CASE_ITERATOR_PRIVATE_DATA_2B + if (PRIVATE_DATA(cc)) + { + count = 2; + srcw[0] = PRIVATE_DATA(cc); + srcw[1] = PRIVATE_DATA(cc) + sizeof(sljit_sw); + } + cc += 2 + IMM2_SIZE; +#ifdef SUPPORT_UTF + if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif + break; + + CASE_ITERATOR_TYPE_PRIVATE_DATA_1 + if (PRIVATE_DATA(cc)) + { + count = 1; + srcw[0] = PRIVATE_DATA(cc); + } + cc += 1; + break; + + CASE_ITERATOR_TYPE_PRIVATE_DATA_2A + if (PRIVATE_DATA(cc)) + { + count = 2; + srcw[0] = PRIVATE_DATA(cc); + srcw[1] = srcw[0] + sizeof(sljit_sw); + } + cc += 1; + break; + + CASE_ITERATOR_TYPE_PRIVATE_DATA_2B + if (PRIVATE_DATA(cc)) + { + count = 2; + srcw[0] = PRIVATE_DATA(cc); + srcw[1] = srcw[0] + sizeof(sljit_sw); + } + cc += 1 + IMM2_SIZE; + break; + + case OP_CLASS: + case OP_NCLASS: +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: + size = (*cc == OP_XCLASS) ? GET(cc, 1) : 1 + 32 / (int)sizeof(pcre_uchar); +#else + size = 1 + 32 / (int)sizeof(pcre_uchar); +#endif + if (PRIVATE_DATA(cc)) + switch(get_class_iterator_size(cc + size)) + { + case 1: + count = 1; + srcw[0] = PRIVATE_DATA(cc); + break; + + case 2: + count = 2; + srcw[0] = PRIVATE_DATA(cc); + srcw[1] = srcw[0] + sizeof(sljit_sw); + break; + + default: + SLJIT_UNREACHABLE(); + break; + } + cc += size; + break; + + default: + cc = next_opcode(common, cc); + SLJIT_ASSERT(cc != NULL); break; } @@ -2312,7 +2303,7 @@ static SLJIT_INLINE void count_match(compiler_common *common) { DEFINE_COMPILER; -OP2(SLJIT_SUB | SLJIT_SET_E, COUNT_MATCH, 0, COUNT_MATCH, 0, SLJIT_IMM, 1); +OP2(SLJIT_SUB | SLJIT_SET_Z, COUNT_MATCH, 0, COUNT_MATCH, 0, SLJIT_IMM, 1); add_jump(compiler, &common->calllimit, JUMP(SLJIT_ZERO)); } @@ -2322,7 +2313,7 @@ static SLJIT_INLINE void allocate_stack(compiler_common *common, int size) DEFINE_COMPILER; SLJIT_ASSERT(size > 0); -OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, size * sizeof(sljit_sw)); +OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, size * sizeof(sljit_sw)); #ifdef DESTROY_REGISTERS OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 12345); OP1(SLJIT_MOV, TMP3, 0, TMP1, 0); @@ -2330,7 +2321,7 @@ OP1(SLJIT_MOV, RETURN_ADDR, 0, TMP1, 0); OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, TMP1, 0); OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, TMP1, 0); #endif -add_stub(common, CMP(SLJIT_GREATER, STACK_TOP, 0, STACK_LIMIT, 0)); +add_stub(common, CMP(SLJIT_LESS, STACK_TOP, 0, STACK_LIMIT, 0)); } static SLJIT_INLINE void free_stack(compiler_common *common, int size) @@ -2338,7 +2329,7 @@ static SLJIT_INLINE void free_stack(compiler_common *common, int size) DEFINE_COMPILER; SLJIT_ASSERT(size > 0); -OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, size * sizeof(sljit_sw)); +OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, size * sizeof(sljit_sw)); } static sljit_uw * allocate_read_only_data(compiler_common *common, sljit_uw size) @@ -2396,7 +2387,7 @@ else OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, length - 1); loop = LABEL(); OP1(SLJIT_MOVU, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw), SLJIT_R0, 0); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, 1); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, 1); JUMPTO(SLJIT_NOT_ZERO, loop); } } @@ -2434,7 +2425,7 @@ else OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_IMM, length - 2); loop = LABEL(); OP1(SLJIT_MOVU, SLJIT_MEM1(TMP2), sizeof(sljit_sw), TMP1, 0); - OP2(SLJIT_SUB | SLJIT_SET_E, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 1); + OP2(SLJIT_SUB | SLJIT_SET_Z, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 1); JUMPTO(SLJIT_NOT_ZERO, loop); } @@ -2452,22 +2443,22 @@ static sljit_sw SLJIT_CALL do_search_mark(sljit_sw *current, const pcre_uchar *s { while (current != NULL) { - switch (current[-2]) + switch (current[1]) { case type_then_trap: break; case type_mark: - if (STRCMP_UC_UC(skip_arg, (pcre_uchar *)current[-3]) == 0) - return current[-4]; + if (STRCMP_UC_UC(skip_arg, (pcre_uchar *)current[2]) == 0) + return current[3]; break; default: - SLJIT_ASSERT_STOP(); + SLJIT_UNREACHABLE(); break; } - SLJIT_ASSERT(current > (sljit_sw*)current[-1]); - current = (sljit_sw*)current[-1]; + SLJIT_ASSERT(current[0] == 0 || current < (sljit_sw*)current[0]); + current = (sljit_sw*)current[0]; } return -1; } @@ -2501,7 +2492,7 @@ OP2(SLJIT_ADD, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, sizeof(sljit_sw)); OP2(SLJIT_ASHR, SLJIT_S1, 0, SLJIT_S1, 0, SLJIT_IMM, UCHAR_SHIFT); #endif OP1(SLJIT_MOVU_S32, SLJIT_MEM1(SLJIT_R2), sizeof(int), SLJIT_S1, 0); -OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1); +OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1); JUMPTO(SLJIT_NOT_ZERO, loop); JUMPHERE(early_quit); @@ -3106,8 +3097,8 @@ if (common->utf) OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); /* Skip low surrogate if necessary. */ OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xdc00); - OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_UNUSED, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xdc00); + OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL); OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP1, 0); return; @@ -3126,6 +3117,7 @@ struct sljit_jump *jump; if (nltype == NLTYPE_ANY) { add_jump(compiler, &common->anynewline, JUMP(SLJIT_FAST_CALL)); + sljit_set_current_flags(compiler, SLJIT_SET_Z); add_jump(compiler, backtracks, JUMP(jumpifmatch ? SLJIT_NOT_ZERO : SLJIT_ZERO)); } else if (nltype == NLTYPE_ANYCRLF) @@ -3167,7 +3159,7 @@ OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); /* Searching for the first zero. */ -OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x800); +OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x800); jump = JUMP(SLJIT_NOT_ZERO); /* Two byte sequence. */ OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); @@ -3181,7 +3173,7 @@ OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); -OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x10000); +OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x10000); jump = JUMP(SLJIT_NOT_ZERO); /* Three byte sequence. */ OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); @@ -3215,15 +3207,15 @@ OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); /* Searching for the first zero. */ -OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x800); +OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x800); jump = JUMP(SLJIT_NOT_ZERO); /* Two byte sequence. */ OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); sljit_emit_fast_return(compiler, RETURN_ADDR, 0); JUMPHERE(jump); -OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x400); -OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_NOT_ZERO); +OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x400); +OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_NOT_ZERO); /* This code runs only in 8 bit mode. No need to shift the value. */ OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0); OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); @@ -3246,7 +3238,7 @@ struct sljit_jump *compare; sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); -OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, 0x20); +OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, 0x20); jump = JUMP(SLJIT_NOT_ZERO); /* Two byte sequence. */ OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); @@ -3287,10 +3279,30 @@ static void do_getucd(compiler_common *common) /* Search the UCD record for the character comes in TMP1. Returns chartype in TMP1 and UCD offset in TMP2. */ DEFINE_COMPILER; +#ifdef COMPILE_PCRE32 +struct sljit_jump *jump; +#endif + +#if defined SLJIT_DEBUG && SLJIT_DEBUG +/* dummy_ucd_record */ +const ucd_record *record = GET_UCD(INVALID_UTF_CHAR); +SLJIT_ASSERT(record->script == ucp_Common && record->chartype == ucp_Cn && record->gbprop == ucp_gbOther); +SLJIT_ASSERT(record->caseset == 0 && record->other_case == 0); +#endif SLJIT_ASSERT(UCD_BLOCK_SIZE == 128 && sizeof(ucd_record) == 8); sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); + +#ifdef COMPILE_PCRE32 +if (!common->utf) + { + jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x10ffff + 1); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR); + JUMPHERE(jump); + } +#endif + OP2(SLJIT_LSHR, TMP2, 0, TMP1, 0, SLJIT_IMM, UCD_BLOCK_SHIFT); OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_stage1)); OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, UCD_BLOCK_MASK); @@ -3365,8 +3377,8 @@ if (newlinecheck) OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); end = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, common->newline & 0xff); - OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_UNUSED, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, common->newline & 0xff); + OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL); #if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, UCHAR_SHIFT); #endif @@ -3403,8 +3415,8 @@ if (common->utf) { singlechar = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xd800); OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xd800); - OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_UNUSED, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xd800); + OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL); OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); JUMPHERE(singlechar); @@ -3853,7 +3865,7 @@ while (TRUE) } } -#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) +#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) && !(defined SUPPORT_VALGRIND) static sljit_s32 character_to_int32(pcre_uchar chr) { @@ -4019,6 +4031,7 @@ instruction[0] = 0x0f; instruction[1] = 0xbc; instruction[2] = 0xc0 | (tmp1_ind << 3) | tmp1_ind; sljit_emit_op_custom(compiler, instruction, 3); +sljit_set_current_flags(compiler, SLJIT_SET_Z); nomatch = JUMP(SLJIT_ZERO); @@ -4119,6 +4132,7 @@ instruction[0] = 0x0f; instruction[1] = 0xbc; instruction[2] = 0xc0 | (tmp1_ind << 3) | tmp1_ind; sljit_emit_op_custom(compiler, instruction, 3); +sljit_set_current_flags(compiler, SLJIT_SET_Z); JUMPTO(SLJIT_ZERO, start); @@ -4155,18 +4169,8 @@ if (has_match_end) OP1(SLJIT_MOV, TMP3, 0, STR_END, 0); OP2(SLJIT_ADD, STR_END, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr, SLJIT_IMM, IN_UCHARS(offset + 1)); -#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) - if (sljit_x86_is_cmov_available()) - { - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, STR_END, 0, TMP3, 0); - sljit_x86_emit_cmov(compiler, SLJIT_GREATER, STR_END, TMP3, 0); - } -#endif - { - quit = CMP(SLJIT_LESS_EQUAL, STR_END, 0, TMP3, 0); - OP1(SLJIT_MOV, STR_END, 0, TMP3, 0); - JUMPHERE(quit); - } + OP2(SLJIT_SUB | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, STR_END, 0, TMP3, 0); + sljit_emit_cmov(compiler, SLJIT_GREATER, STR_END, TMP3, 0); } #if defined SUPPORT_UTF && !defined COMPILE_PCRE32 @@ -4174,11 +4178,11 @@ if (common->utf && offset > 0) utf_start = LABEL(); #endif -#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) +#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) && !(defined SUPPORT_VALGRIND) /* SSE2 accelerated first character search. */ -if (sljit_x86_is_sse2_available()) +if (sljit_has_cpu_feature(SLJIT_HAS_SSE2)) { fast_forward_first_char2_sse2(common, char1, char2); @@ -4213,16 +4217,16 @@ if (sljit_x86_is_sse2_available()) if (offset > 0) OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offset)); } - else if (sljit_x86_is_cmov_available()) - { - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, STR_PTR, 0, STR_END, 0); - sljit_x86_emit_cmov(compiler, SLJIT_GREATER_EQUAL, STR_PTR, has_match_end ? SLJIT_MEM1(SLJIT_SP) : STR_END, has_match_end ? common->match_end_ptr : 0); - } else { - quit = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0); - OP1(SLJIT_MOV, STR_PTR, 0, has_match_end ? SLJIT_MEM1(SLJIT_SP) : STR_END, has_match_end ? common->match_end_ptr : 0); - JUMPHERE(quit); + OP2(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, SLJIT_UNUSED, 0, STR_PTR, 0, STR_END, 0); + if (has_match_end) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr); + sljit_emit_cmov(compiler, SLJIT_GREATER_EQUAL, STR_PTR, TMP1, 0); + } + else + sljit_emit_cmov(compiler, SLJIT_GREATER_EQUAL, STR_PTR, STR_END, 0); } if (has_match_end) @@ -4249,10 +4253,10 @@ else } else { - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, char1); - OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_EQUAL); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, char2); - OP_FLAGS(SLJIT_OR | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, char1); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, char2); + OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL); found = JUMP(SLJIT_NOT_ZERO); } } @@ -4571,8 +4575,8 @@ if (common->nltype == NLTYPE_FIXED && common->newline > 255) firstchar = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0); OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(2)); - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, STR_PTR, 0, TMP1, 0); - OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_GREATER_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, SLJIT_UNUSED, 0, STR_PTR, 0, TMP1, 0); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_GREATER_EQUAL); #if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, UCHAR_SHIFT); #endif @@ -4616,8 +4620,8 @@ if (common->nltype == NLTYPE_ANY || common->nltype == NLTYPE_ANYCRLF) JUMPHERE(foundcr); notfoundnl = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, CHAR_NL); - OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_UNUSED, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, CHAR_NL); + OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL); #if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, UCHAR_SHIFT); #endif @@ -4670,7 +4674,7 @@ if (!check_class_ranges(common, start_bits, (start_bits[31] & 0x80) != 0, TRUE, OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 3); OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)start_bits); OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0); - OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0); + OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0); found = JUMP(SLJIT_NOT_ZERO); } @@ -4692,8 +4696,8 @@ if (common->utf) { CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xd800, start); OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xd800); - OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_UNUSED, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xd800); + OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL); OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); } @@ -4780,31 +4784,31 @@ struct sljit_jump *jump; struct sljit_label *mainloop; sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); -OP1(SLJIT_MOV, TMP1, 0, STACK_TOP, 0); -GET_LOCAL_BASE(TMP3, 0, 0); +OP1(SLJIT_MOV, TMP3, 0, STACK_TOP, 0); +GET_LOCAL_BASE(TMP1, 0, 0); /* Drop frames until we reach STACK_TOP. */ mainloop = LABEL(); -OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), 0); -OP2(SLJIT_SUB | SLJIT_SET_S, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, 0); -jump = JUMP(SLJIT_SIG_LESS_EQUAL); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), -sizeof(sljit_sw)); +jump = CMP(SLJIT_SIG_LESS_EQUAL, TMP2, 0, SLJIT_IMM, 0); -OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP3, 0); -OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), 0, SLJIT_MEM1(TMP1), sizeof(sljit_sw)); -OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), sizeof(sljit_sw), SLJIT_MEM1(TMP1), 2 * sizeof(sljit_sw)); -OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 3 * sizeof(sljit_sw)); +OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0); +OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), 0, SLJIT_MEM1(STACK_TOP), -2 * sizeof(sljit_sw)); +OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), sizeof(sljit_sw), SLJIT_MEM1(STACK_TOP), -3 * sizeof(sljit_sw)); +OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 3 * sizeof(sljit_sw)); JUMPTO(SLJIT_JUMP, mainloop); JUMPHERE(jump); -jump = JUMP(SLJIT_SIG_LESS); -/* End of dropping frames. */ +jump = CMP(SLJIT_NOT_ZERO /* SIG_LESS */, TMP2, 0, SLJIT_IMM, 0); +/* End of reverting values. */ +OP1(SLJIT_MOV, STACK_TOP, 0, TMP3, 0); sljit_emit_fast_return(compiler, RETURN_ADDR, 0); JUMPHERE(jump); OP1(SLJIT_NEG, TMP2, 0, TMP2, 0); -OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP3, 0); -OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), 0, SLJIT_MEM1(TMP1), sizeof(sljit_sw)); -OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 2 * sizeof(sljit_sw)); +OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0); +OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), 0, SLJIT_MEM1(STACK_TOP), -2 * sizeof(sljit_sw)); +OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 2 * sizeof(sljit_sw)); JUMPTO(SLJIT_JUMP, mainloop); } @@ -4837,11 +4841,11 @@ if (common->use_ucp) jump = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_UNDERSCORE); add_jump(compiler, &common->getucd, JUMP(SLJIT_FAST_CALL)); OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Ll); - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ucp_Lu - ucp_Ll); - OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_LESS_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ucp_Lu - ucp_Ll); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL); OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Nd - ucp_Ll); - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ucp_No - ucp_Nd); - OP_FLAGS(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_LESS_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ucp_No - ucp_Nd); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL); JUMPHERE(jump); OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, TMP2, 0); } @@ -4881,11 +4885,11 @@ if (common->use_ucp) jump = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_UNDERSCORE); add_jump(compiler, &common->getucd, JUMP(SLJIT_FAST_CALL)); OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Ll); - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ucp_Lu - ucp_Ll); - OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_LESS_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ucp_Lu - ucp_Ll); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL); OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Nd - ucp_Ll); - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ucp_No - ucp_Nd); - OP_FLAGS(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_LESS_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ucp_No - ucp_Nd); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL); JUMPHERE(jump); } else @@ -4913,7 +4917,7 @@ else } set_jumps(skipread_list, LABEL()); -OP2(SLJIT_XOR | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1); +OP2(SLJIT_XOR | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1); sljit_emit_fast_return(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0); } @@ -5064,7 +5068,7 @@ switch(length) return TRUE; default: - SLJIT_ASSERT_STOP(); + SLJIT_UNREACHABLE(); return FALSE; } } @@ -5077,22 +5081,22 @@ DEFINE_COMPILER; sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x0a); -OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x0d - 0x0a); -OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_LESS_EQUAL); -OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x85 - 0x0a); +OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x0d - 0x0a); +OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL); +OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x85 - 0x0a); #if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32 #ifdef COMPILE_PCRE8 if (common->utf) { #endif - OP_FLAGS(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_EQUAL); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x1); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x2029 - 0x0a); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x2029 - 0x0a); #ifdef COMPILE_PCRE8 } #endif #endif /* SUPPORT_UTF || COMPILE_PCRE16 || COMPILE_PCRE32 */ -OP_FLAGS(SLJIT_OR | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_EQUAL); +OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL); sljit_emit_fast_return(compiler, RETURN_ADDR, 0); } @@ -5103,34 +5107,34 @@ DEFINE_COMPILER; sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); -OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x09); -OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_EQUAL); -OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x20); -OP_FLAGS(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_EQUAL); -OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xa0); +OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x09); +OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL); +OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x20); +OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); +OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xa0); #if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32 #ifdef COMPILE_PCRE8 if (common->utf) { #endif - OP_FLAGS(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_EQUAL); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x1680); - OP_FLAGS(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_EQUAL); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x180e); - OP_FLAGS(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_EQUAL); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x1680); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x180e); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x2000); - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x200A - 0x2000); - OP_FLAGS(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_LESS_EQUAL); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x202f - 0x2000); - OP_FLAGS(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_EQUAL); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x205f - 0x2000); - OP_FLAGS(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_EQUAL); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x3000 - 0x2000); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x200A - 0x2000); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x202f - 0x2000); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x205f - 0x2000); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x3000 - 0x2000); #ifdef COMPILE_PCRE8 } #endif #endif /* SUPPORT_UTF || COMPILE_PCRE16 || COMPILE_PCRE32 */ -OP_FLAGS(SLJIT_OR | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_EQUAL); +OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL); sljit_emit_fast_return(compiler, RETURN_ADDR, 0); } @@ -5143,22 +5147,22 @@ DEFINE_COMPILER; sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x0a); -OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x0d - 0x0a); -OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_LESS_EQUAL); -OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x85 - 0x0a); +OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x0d - 0x0a); +OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL); +OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x85 - 0x0a); #if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32 #ifdef COMPILE_PCRE8 if (common->utf) { #endif - OP_FLAGS(SLJIT_OR | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_EQUAL); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x1); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x2029 - 0x0a); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x2029 - 0x0a); #ifdef COMPILE_PCRE8 } #endif #endif /* SUPPORT_UTF || COMPILE_PCRE16 || COMPILE_PCRE32 */ -OP_FLAGS(SLJIT_OR | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_EQUAL); +OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL); sljit_emit_fast_return(compiler, RETURN_ADDR, 0); } @@ -5183,7 +5187,7 @@ label = LABEL(); OP1(MOVU_UCHAR, CHAR1, 0, SLJIT_MEM1(TMP1), IN_UCHARS(1)); OP1(MOVU_UCHAR, CHAR2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); jump = CMP(SLJIT_NOT_EQUAL, CHAR1, 0, CHAR2, 0); -OP2(SLJIT_SUB | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1)); +OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1)); JUMPTO(SLJIT_NOT_ZERO, label); JUMPHERE(jump); @@ -5227,7 +5231,7 @@ OP1(SLJIT_MOV_U8, CHAR2, 0, SLJIT_MEM2(LCC_TABLE, CHAR2), 0); JUMPHERE(jump); #endif jump = CMP(SLJIT_NOT_EQUAL, CHAR1, 0, CHAR2, 0); -OP2(SLJIT_SUB | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1)); +OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1)); JUMPTO(SLJIT_NOT_ZERO, label); JUMPHERE(jump); @@ -5394,7 +5398,7 @@ do #endif default: - SLJIT_ASSERT_STOP(); + SLJIT_UNREACHABLE(); break; } context->ucharptr = 0; @@ -5568,7 +5572,7 @@ while (*cc != XCL_END) break; default: - SLJIT_ASSERT_STOP(); + SLJIT_UNREACHABLE(); break; } cc += 2; @@ -5592,7 +5596,7 @@ if ((cc[-1] & XCL_HASPROP) == 0) OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 3); OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)cc); OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0); - OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0); + OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0); add_jump(compiler, &found, JUMP(SLJIT_NOT_ZERO)); } @@ -5625,7 +5629,7 @@ else if ((cc[-1] & XCL_MAP) != 0) OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 3); OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)cc); OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0); - OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0); + OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0); add_jump(compiler, list, JUMP(SLJIT_NOT_ZERO)); #ifdef COMPILE_PCRE8 @@ -5644,6 +5648,15 @@ if (needstype || needsscript) if (needschar && !charsaved) OP1(SLJIT_MOV, RETURN_ADDR, 0, TMP1, 0); +#ifdef COMPILE_PCRE32 + if (!common->utf) + { + jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x10ffff + 1); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR); + JUMPHERE(jump); + } +#endif + OP2(SLJIT_LSHR, TMP2, 0, TMP1, 0, SLJIT_IMM, UCD_BLOCK_SHIFT); OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_stage1)); OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, UCD_BLOCK_MASK); @@ -5735,14 +5748,14 @@ while (*cc != XCL_END) if (numberofcmps < 3 && (*cc == XCL_SINGLE || *cc == XCL_RANGE)) { - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset)); - OP_FLAGS(numberofcmps == 0 ? SLJIT_MOV : SLJIT_OR, TMP2, 0, numberofcmps == 0 ? SLJIT_UNUSED : TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset)); + OP_FLAGS(numberofcmps == 0 ? SLJIT_MOV : SLJIT_OR, TMP2, 0, SLJIT_EQUAL); numberofcmps++; } else if (numberofcmps > 0) { - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset)); - OP_FLAGS(SLJIT_OR | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset)); + OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL); jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp); numberofcmps = 0; } @@ -5761,14 +5774,14 @@ while (*cc != XCL_END) if (numberofcmps < 3 && (*cc == XCL_SINGLE || *cc == XCL_RANGE)) { - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset)); - OP_FLAGS(numberofcmps == 0 ? SLJIT_MOV : SLJIT_OR, TMP2, 0, numberofcmps == 0 ? SLJIT_UNUSED : TMP2, 0, SLJIT_LESS_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset)); + OP_FLAGS(numberofcmps == 0 ? SLJIT_MOV : SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL); numberofcmps++; } else if (numberofcmps > 0) { - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset)); - OP_FLAGS(SLJIT_OR | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_LESS_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset)); + OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_LESS_EQUAL); jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp); numberofcmps = 0; } @@ -5793,12 +5806,12 @@ while (*cc != XCL_END) break; case PT_LAMP: - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Lu - typeoffset); - OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_EQUAL); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Ll - typeoffset); - OP_FLAGS(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_EQUAL); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Lt - typeoffset); - OP_FLAGS(SLJIT_OR | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Lu - typeoffset); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Ll - typeoffset); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Lt - typeoffset); + OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL); jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp); break; @@ -5820,33 +5833,33 @@ while (*cc != XCL_END) case PT_SPACE: case PT_PXSPACE: SET_CHAR_OFFSET(9); - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xd - 0x9); - OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_LESS_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xd - 0x9); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x85 - 0x9); - OP_FLAGS(SLJIT_OR | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x85 - 0x9); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x180e - 0x9); - OP_FLAGS(SLJIT_OR | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x180e - 0x9); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); SET_TYPE_OFFSET(ucp_Zl); - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Zs - ucp_Zl); - OP_FLAGS(SLJIT_OR | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_LESS_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Zs - ucp_Zl); + OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_LESS_EQUAL); jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp); break; case PT_WORD: - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(CHAR_UNDERSCORE - charoffset)); - OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(CHAR_UNDERSCORE - charoffset)); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL); /* Fall through. */ case PT_ALNUM: SET_TYPE_OFFSET(ucp_Ll); - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Lu - ucp_Ll); - OP_FLAGS((*cc == PT_ALNUM) ? SLJIT_MOV : SLJIT_OR, TMP2, 0, (*cc == PT_ALNUM) ? SLJIT_UNUSED : TMP2, 0, SLJIT_LESS_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Lu - ucp_Ll); + OP_FLAGS((*cc == PT_ALNUM) ? SLJIT_MOV : SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL); SET_TYPE_OFFSET(ucp_Nd); - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_No - ucp_Nd); - OP_FLAGS(SLJIT_OR | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_LESS_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_No - ucp_Nd); + OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_LESS_EQUAL); jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp); break; @@ -5868,8 +5881,8 @@ while (*cc != XCL_END) OP2(SLJIT_ADD, TMP2, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)charoffset); OP2(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_IMM, other_cases[1] ^ other_cases[0]); } - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, other_cases[1]); - OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, other_cases[1]); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL); other_cases += 2; } else if (is_powerof2(other_cases[2] ^ other_cases[1])) @@ -5881,63 +5894,63 @@ while (*cc != XCL_END) OP2(SLJIT_ADD, TMP2, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)charoffset); OP2(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_IMM, other_cases[1] ^ other_cases[0]); } - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, other_cases[2]); - OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, other_cases[2]); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(other_cases[0] - charoffset)); - OP_FLAGS(SLJIT_OR | ((other_cases[3] == NOTACHAR) ? SLJIT_SET_E : 0), TMP2, 0, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(other_cases[0] - charoffset)); + OP_FLAGS(SLJIT_OR | ((other_cases[3] == NOTACHAR) ? SLJIT_SET_Z : 0), TMP2, 0, SLJIT_EQUAL); other_cases += 3; } else { - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(*other_cases++ - charoffset)); - OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(*other_cases++ - charoffset)); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL); } while (*other_cases != NOTACHAR) { - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(*other_cases++ - charoffset)); - OP_FLAGS(SLJIT_OR | ((*other_cases == NOTACHAR) ? SLJIT_SET_E : 0), TMP2, 0, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(*other_cases++ - charoffset)); + OP_FLAGS(SLJIT_OR | ((*other_cases == NOTACHAR) ? SLJIT_SET_Z : 0), TMP2, 0, SLJIT_EQUAL); } jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp); break; case PT_UCNC: - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(CHAR_DOLLAR_SIGN - charoffset)); - OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_EQUAL); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(CHAR_COMMERCIAL_AT - charoffset)); - OP_FLAGS(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_EQUAL); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(CHAR_GRAVE_ACCENT - charoffset)); - OP_FLAGS(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(CHAR_DOLLAR_SIGN - charoffset)); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(CHAR_COMMERCIAL_AT - charoffset)); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(CHAR_GRAVE_ACCENT - charoffset)); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); SET_CHAR_OFFSET(0xa0); - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(0xd7ff - charoffset)); - OP_FLAGS(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_LESS_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(0xd7ff - charoffset)); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL); SET_CHAR_OFFSET(0); - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xe000 - 0); - OP_FLAGS(SLJIT_OR | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_GREATER_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xe000 - 0); + OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_GREATER_EQUAL); jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp); break; case PT_PXGRAPH: /* C and Z groups are the farthest two groups. */ SET_TYPE_OFFSET(ucp_Ll); - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_So - ucp_Ll); - OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_GREATER); + OP2(SLJIT_SUB | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_So - ucp_Ll); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_GREATER); jump = CMP(SLJIT_NOT_EQUAL, typereg, 0, SLJIT_IMM, ucp_Cf - ucp_Ll); /* In case of ucp_Cf, we overwrite the result. */ SET_CHAR_OFFSET(0x2066); - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x2069 - 0x2066); - OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_LESS_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x2069 - 0x2066); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x061c - 0x2066); - OP_FLAGS(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x061c - 0x2066); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x180e - 0x2066); - OP_FLAGS(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x180e - 0x2066); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); JUMPHERE(jump); jump = CMP(SLJIT_ZERO ^ invertcmp, TMP2, 0, SLJIT_IMM, 0); @@ -5946,21 +5959,21 @@ while (*cc != XCL_END) case PT_PXPRINT: /* C and Z groups are the farthest two groups. */ SET_TYPE_OFFSET(ucp_Ll); - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_So - ucp_Ll); - OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_GREATER); + OP2(SLJIT_SUB | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_So - ucp_Ll); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_GREATER); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Zs - ucp_Ll); - OP_FLAGS(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_NOT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Zs - ucp_Ll); + OP_FLAGS(SLJIT_AND, TMP2, 0, SLJIT_NOT_EQUAL); jump = CMP(SLJIT_NOT_EQUAL, typereg, 0, SLJIT_IMM, ucp_Cf - ucp_Ll); /* In case of ucp_Cf, we overwrite the result. */ SET_CHAR_OFFSET(0x2066); - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x2069 - 0x2066); - OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_LESS_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x2069 - 0x2066); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x061c - 0x2066); - OP_FLAGS(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x061c - 0x2066); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); JUMPHERE(jump); jump = CMP(SLJIT_ZERO ^ invertcmp, TMP2, 0, SLJIT_IMM, 0); @@ -5968,21 +5981,21 @@ while (*cc != XCL_END) case PT_PXPUNCT: SET_TYPE_OFFSET(ucp_Sc); - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_So - ucp_Sc); - OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_LESS_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_So - ucp_Sc); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL); SET_CHAR_OFFSET(0); - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x7f); - OP_FLAGS(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_LESS_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x7f); + OP_FLAGS(SLJIT_AND, TMP2, 0, SLJIT_LESS_EQUAL); SET_TYPE_OFFSET(ucp_Pc); - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Ps - ucp_Pc); - OP_FLAGS(SLJIT_OR | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_LESS_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Ps - ucp_Pc); + OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_LESS_EQUAL); jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp); break; default: - SLJIT_ASSERT_STOP(); + SLJIT_UNREACHABLE(); break; } cc += 2; @@ -6028,6 +6041,7 @@ switch(type) case OP_NOT_WORD_BOUNDARY: case OP_WORD_BOUNDARY: add_jump(compiler, &common->wordboundary, JUMP(SLJIT_FAST_CALL)); + sljit_set_current_flags(compiler, SLJIT_SET_Z); add_jump(compiler, backtracks, JUMP(type == OP_NOT_WORD_BOUNDARY ? SLJIT_NOT_ZERO : SLJIT_ZERO)); return cc; @@ -6043,10 +6057,10 @@ switch(type) else { jump[1] = CMP(SLJIT_EQUAL, TMP2, 0, STR_END, 0); - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP2, 0, STR_END, 0); - OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_LESS); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff); - OP_FLAGS(SLJIT_OR | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_NOT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP2, 0, STR_END, 0); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff); + OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_NOT_EQUAL); add_jump(compiler, backtracks, JUMP(SLJIT_NOT_EQUAL)); check_partial(common, TRUE); add_jump(compiler, backtracks, JUMP(SLJIT_JUMP)); @@ -6068,9 +6082,9 @@ switch(type) OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); jump[1] = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR); OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); - OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP2, 0, STR_END, 0); + OP2(SLJIT_SUB | SLJIT_SET_Z | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, TMP2, 0, STR_END, 0); jump[2] = JUMP(SLJIT_GREATER); - add_jump(compiler, backtracks, JUMP(SLJIT_LESS)); + add_jump(compiler, backtracks, JUMP(SLJIT_NOT_EQUAL) /* LESS */); /* Equal. */ OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); jump[3] = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_NL); @@ -6089,6 +6103,7 @@ switch(type) read_char_range(common, common->nlmin, common->nlmax, TRUE); add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, STR_END, 0)); add_jump(compiler, &common->anynewline, JUMP(SLJIT_FAST_CALL)); + sljit_set_current_flags(compiler, SLJIT_SET_Z); add_jump(compiler, backtracks, JUMP(SLJIT_ZERO)); OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1); } @@ -6204,7 +6219,7 @@ switch(type) label = LABEL(); add_jump(compiler, backtracks, CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP3, 0)); skip_char_back(common); - OP2(SLJIT_SUB | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_IMM, 1); + OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, 1); JUMPTO(SLJIT_NOT_ZERO, label); } else @@ -6217,7 +6232,7 @@ switch(type) check_start_used_ptr(common); return cc + LINK_SIZE; } -SLJIT_ASSERT_STOP(); +SLJIT_UNREACHABLE(); return cc; } @@ -6250,7 +6265,7 @@ switch(type) #endif read_char8_type(common, type == OP_NOT_DIGIT); /* Flip the starting bit in the negative case. */ - OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_digit); + OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_digit); add_jump(compiler, backtracks, JUMP(type == OP_DIGIT ? SLJIT_ZERO : SLJIT_NOT_ZERO)); return cc; @@ -6264,7 +6279,7 @@ switch(type) else #endif read_char8_type(common, type == OP_NOT_WHITESPACE); - OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_space); + OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_space); add_jump(compiler, backtracks, JUMP(type == OP_WHITESPACE ? SLJIT_ZERO : SLJIT_NOT_ZERO)); return cc; @@ -6278,7 +6293,7 @@ switch(type) else #endif read_char8_type(common, type == OP_NOT_WORDCHAR); - OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_word); + OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_word); add_jump(compiler, backtracks, JUMP(type == OP_WORDCHAR ? SLJIT_ZERO : SLJIT_NOT_ZERO)); return cc; @@ -6320,8 +6335,8 @@ switch(type) #elif defined COMPILE_PCRE16 jump[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xd800); OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xd800); - OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_UNUSED, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xd800); + OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL); OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); #endif @@ -6383,6 +6398,7 @@ switch(type) detect_partial_match(common, backtracks); read_char_range(common, 0x9, 0x3000, type == OP_NOT_HSPACE); add_jump(compiler, &common->hspace, JUMP(SLJIT_FAST_CALL)); + sljit_set_current_flags(compiler, SLJIT_SET_Z); add_jump(compiler, backtracks, JUMP(type == OP_NOT_HSPACE ? SLJIT_NOT_ZERO : SLJIT_ZERO)); return cc; @@ -6392,6 +6408,7 @@ switch(type) detect_partial_match(common, backtracks); read_char_range(common, 0xa, 0x2029, type == OP_NOT_VSPACE); add_jump(compiler, &common->vspace, JUMP(SLJIT_FAST_CALL)); + sljit_set_current_flags(compiler, SLJIT_SET_Z); add_jump(compiler, backtracks, JUMP(type == OP_NOT_VSPACE ? SLJIT_NOT_ZERO : SLJIT_ZERO)); return cc; @@ -6418,7 +6435,7 @@ switch(type) OP1(SLJIT_MOV_U32, TMP1, 0, SLJIT_MEM1(STACK_TOP), (sljit_sw)PRIV(ucp_gbtable)); OP1(SLJIT_MOV, STACK_TOP, 0, TMP2, 0); OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0); - OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0); + OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0); JUMPTO(SLJIT_NOT_ZERO, label); OP1(SLJIT_MOV, STR_PTR, 0, TMP3, 0); @@ -6587,7 +6604,7 @@ switch(type) OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 3); OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)cc); OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0); - OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0); + OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0); add_jump(compiler, backtracks, JUMP(SLJIT_ZERO)); #if defined SUPPORT_UTF || !defined COMPILE_PCRE8 @@ -6604,7 +6621,7 @@ switch(type) return cc + GET(cc, 0) - 1; #endif } -SLJIT_ASSERT_STOP(); +SLJIT_UNREACHABLE(); return cc; } @@ -6790,9 +6807,9 @@ else #endif /* SUPPORT_UTF && SUPPORT_UCP */ { if (ref) - OP2(SLJIT_SUB | SLJIT_SET_E, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), TMP1, 0); + OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), TMP1, 0); else - OP2(SLJIT_SUB | SLJIT_SET_E, TMP2, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw), TMP1, 0); + OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw), TMP1, 0); if (withchecks) jump = JUMP(SLJIT_ZERO); @@ -6883,7 +6900,7 @@ switch(type) cc += 1 + IMM2_SIZE + 1 + 2 * IMM2_SIZE; break; default: - SLJIT_ASSERT_STOP(); + SLJIT_UNREACHABLE(); break; } @@ -6897,7 +6914,7 @@ if (!minimize) OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, 0); /* Temporary release of STR_PTR. */ - OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw)); + OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw)); /* Handles both invalid and empty cases. Since the minimum repeat, is zero the invalid case is basically the same as an empty case. */ if (ref) @@ -6910,7 +6927,7 @@ if (!minimize) zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw)); } /* Restore if not zero length. */ - OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw)); + OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw)); } else { @@ -7157,7 +7174,7 @@ return (*PUBL(callout))(callout_block); (((int)sizeof(PUBL(callout_block)) + 7) & ~7) #define CALLOUT_ARG_OFFSET(arg) \ - (-CALLOUT_ARG_SIZE + SLJIT_OFFSETOF(PUBL(callout_block), arg)) + SLJIT_OFFSETOF(PUBL(callout_block), arg) static SLJIT_INLINE pcre_uchar *compile_callout_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent) { @@ -7187,7 +7204,8 @@ OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(mark), (common->mark_pt /* Needed to save important temporary registers. */ OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STACK_TOP, 0); -OP2(SLJIT_SUB, SLJIT_R1, 0, STACK_TOP, 0, SLJIT_IMM, CALLOUT_ARG_SIZE); +/* SLJIT_R0 = arguments */ +OP1(SLJIT_MOV, SLJIT_R1, 0, STACK_TOP, 0); GET_LOCAL_BASE(SLJIT_R2, 0, OVECTOR_START); sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_IMM, SLJIT_FUNC_OFFSET(do_callout)); OP1(SLJIT_MOV_S32, SLJIT_RETURN_REG, 0, SLJIT_RETURN_REG, 0); @@ -7195,12 +7213,12 @@ OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); free_stack(common, CALLOUT_ARG_SIZE / sizeof(sljit_sw)); /* Check return value. */ -OP2(SLJIT_SUB | SLJIT_SET_S, SLJIT_UNUSED, 0, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0); +OP2(SLJIT_SUB | SLJIT_SET_Z | SLJIT_SET_SIG_GREATER, SLJIT_UNUSED, 0, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0); add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_SIG_GREATER)); if (common->forced_quit_label == NULL) - add_jump(compiler, &common->forced_quit, JUMP(SLJIT_SIG_LESS)); + add_jump(compiler, &common->forced_quit, JUMP(SLJIT_NOT_EQUAL) /* SIG_LESS */); else - JUMPTO(SLJIT_SIG_LESS, common->forced_quit_label); + JUMPTO(SLJIT_NOT_EQUAL /* SIG_LESS */, common->forced_quit_label); return cc + 2 + 2 * LINK_SIZE; } @@ -7321,7 +7339,7 @@ else allocate_stack(common, framesize + extrasize); OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); - OP2(SLJIT_SUB, TMP2, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + extrasize) * sizeof(sljit_sw)); + OP2(SLJIT_ADD, TMP2, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + extrasize) * sizeof(sljit_sw)); OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP2, 0); if (needs_control_head) OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr); @@ -7392,22 +7410,22 @@ while (1) free_stack(common, extrasize); if (needs_control_head) - OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(-1)); } else { if ((opcode != OP_ASSERT_NOT && opcode != OP_ASSERTBACK_NOT) || conditional) { /* We don't need to keep the STR_PTR, only the previous private_data_ptr. */ - OP2(SLJIT_ADD, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, (framesize + 1) * sizeof(sljit_sw)); + OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, (framesize + 1) * sizeof(sljit_sw)); if (needs_control_head) - OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(-1)); } else { OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); if (needs_control_head) - OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), (framesize + 1) * sizeof(sljit_sw)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(-framesize - 2)); add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); } } @@ -7418,25 +7436,25 @@ while (1) if (conditional) { if (extrasize > 0) - OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), needs_control_head ? sizeof(sljit_sw) : 0); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), needs_control_head ? STACK(-2) : STACK(-1)); } else if (bra == OP_BRAZERO) { if (framesize < 0) - OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), (extrasize - 1) * sizeof(sljit_sw)); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(-extrasize)); else { - OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), framesize * sizeof(sljit_sw)); - OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), (framesize + extrasize - 1) * sizeof(sljit_sw)); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(-framesize - 1)); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(-framesize - extrasize)); OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP1, 0); } - OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw)); + OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw)); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); } else if (framesize >= 0) { /* For OP_BRA and OP_BRAMINZERO. */ - OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), framesize * sizeof(sljit_sw)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-framesize - 1)); } } add_jump(compiler, found, JUMP(SLJIT_JUMP)); @@ -7480,12 +7498,12 @@ if (common->positive_assert_quit != NULL) set_jumps(common->positive_assert_quit, LABEL()); SLJIT_ASSERT(framesize != no_stack); if (framesize < 0) - OP2(SLJIT_ADD, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, extrasize * sizeof(sljit_sw)); + OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, extrasize * sizeof(sljit_sw)); else { OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); - OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + extrasize) * sizeof(sljit_sw)); + OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + extrasize) * sizeof(sljit_sw)); } JUMPHERE(jump); } @@ -7534,18 +7552,18 @@ if (opcode == OP_ASSERT || opcode == OP_ASSERTBACK) { /* We know that STR_PTR was stored on the top of the stack. */ if (extrasize > 0) - OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), (extrasize - 1) * sizeof(sljit_sw)); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(-extrasize)); /* Keep the STR_PTR on the top of the stack. */ if (bra == OP_BRAZERO) { - OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw)); + OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw)); if (extrasize == 2) OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); } else if (bra == OP_BRAMINZERO) { - OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw)); + OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw)); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); } } @@ -7554,13 +7572,13 @@ if (opcode == OP_ASSERT || opcode == OP_ASSERTBACK) if (bra == OP_BRA) { /* We don't need to keep the STR_PTR, only the previous private_data_ptr. */ - OP2(SLJIT_ADD, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, (framesize + 1) * sizeof(sljit_sw)); - OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), (extrasize - 2) * sizeof(sljit_sw)); + OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, (framesize + 1) * sizeof(sljit_sw)); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(-extrasize + 1)); } else { /* We don't need to keep the STR_PTR, only the previous private_data_ptr. */ - OP2(SLJIT_ADD, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, (framesize + 2) * sizeof(sljit_sw)); + OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, (framesize + 2) * sizeof(sljit_sw)); if (extrasize == 2) { OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); @@ -7588,7 +7606,7 @@ if (opcode == OP_ASSERT || opcode == OP_ASSERTBACK) { OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); - OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), framesize * sizeof(sljit_sw)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-framesize - 1)); } set_jumps(backtrack->common.topbacktracks, LABEL()); } @@ -7675,23 +7693,23 @@ if (framesize < 0) } if (needs_control_head) - OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), (ket != OP_KET || has_alternatives) ? sizeof(sljit_sw) : 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), (ket != OP_KET || has_alternatives) ? STACK(-2) : STACK(-1)); /* TMP2 which is set here used by OP_KETRMAX below. */ if (ket == OP_KETRMAX) - OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), 0); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(-1)); else if (ket == OP_KETRMIN) { /* Move the STR_PTR to the private_data_ptr. */ - OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-1)); } } else { stacksize = (ket != OP_KET || has_alternatives) ? 2 : 1; - OP2(SLJIT_ADD, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, (framesize + stacksize) * sizeof(sljit_sw)); + OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, (framesize + stacksize) * sizeof(sljit_sw)); if (needs_control_head) - OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(-1)); if (ket == OP_KETRMAX) { @@ -7927,7 +7945,7 @@ if (bra == OP_BRAMINZERO) { /* Except when the whole stack frame must be saved. */ OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); - braminzero = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_MEM1(TMP1), (BACKTRACK_AS(bracket_backtrack)->u.framesize + 1) * sizeof(sljit_sw)); + braminzero = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_MEM1(TMP1), STACK(-BACKTRACK_AS(bracket_backtrack)->u.framesize - 2)); } JUMPHERE(skip); } @@ -8000,7 +8018,7 @@ if (opcode == OP_ONCE) OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), STR_PTR, 0); if (BACKTRACK_AS(bracket_backtrack)->u.framesize == no_frame) - OP2(SLJIT_SUB, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STACK_TOP, 0, SLJIT_IMM, needs_control_head ? (2 * sizeof(sljit_sw)) : sizeof(sljit_sw)); + OP2(SLJIT_ADD, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STACK_TOP, 0, SLJIT_IMM, needs_control_head ? (2 * sizeof(sljit_sw)) : sizeof(sljit_sw)); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize + 1), TMP2, 0); } else if (ket == OP_KETRMAX || has_alternatives) @@ -8018,7 +8036,7 @@ if (opcode == OP_ONCE) OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0); OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); - OP2(SLJIT_SUB, TMP2, 0, STACK_TOP, 0, SLJIT_IMM, stacksize * sizeof(sljit_sw)); + OP2(SLJIT_ADD, TMP2, 0, STACK_TOP, 0, SLJIT_IMM, stacksize * sizeof(sljit_sw)); stacksize = needs_control_head ? 1 : 0; if (ket != OP_KET || has_alternatives) @@ -8090,13 +8108,13 @@ if (opcode == OP_COND || opcode == OP_SCOND) slot = common->name_table + GET2(matchingpath, 1) * common->name_entry_size; OP1(SLJIT_MOV, TMP3, 0, STR_PTR, 0); OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1)); - OP2(SLJIT_SUB | SLJIT_SET_E, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(GET2(slot, 0) << 1), TMP1, 0); + OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(GET2(slot, 0) << 1), TMP1, 0); slot += common->name_entry_size; i--; while (i-- > 0) { OP2(SLJIT_SUB, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(GET2(slot, 0) << 1), TMP1, 0); - OP2(SLJIT_OR | SLJIT_SET_E, TMP2, 0, TMP2, 0, STR_PTR, 0); + OP2(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, TMP2, 0, STR_PTR, 0); slot += common->name_entry_size; } OP1(SLJIT_MOV, STR_PTR, 0, TMP3, 0); @@ -8111,7 +8129,7 @@ if (opcode == OP_COND || opcode == OP_SCOND) if (*matchingpath == OP_FAIL) stacksize = 0; - if (*matchingpath == OP_RREF) + else if (*matchingpath == OP_RREF) { stacksize = GET2(matchingpath, 1); if (common->currententry == NULL) @@ -8244,7 +8262,7 @@ if (ket == OP_KETRMAX) { if (has_alternatives) BACKTRACK_AS(bracket_backtrack)->alternative_matchingpath = LABEL(); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_IMM, 1); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_IMM, 1); JUMPTO(SLJIT_NOT_ZERO, rmax_label); /* Drop STR_PTR for greedy plus quantifier. */ if (opcode != OP_ONCE) @@ -8274,7 +8292,7 @@ if (ket == OP_KETRMAX) if (repeat_type == OP_EXACT) { count_match(common); - OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_IMM, 1); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_IMM, 1); JUMPTO(SLJIT_NOT_ZERO, rmax_label); } else if (repeat_type == OP_UPTO) @@ -8374,7 +8392,7 @@ switch(opcode) break; default: - SLJIT_ASSERT_STOP(); + SLJIT_UNREACHABLE(); break; } @@ -8452,7 +8470,7 @@ else OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); if (needs_control_head) OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr); - OP2(SLJIT_SUB, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STACK_TOP, 0, SLJIT_IMM, -STACK(stacksize - 1)); + OP2(SLJIT_ADD, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STACK_TOP, 0, SLJIT_IMM, stacksize * sizeof(sljit_sw)); stack = 0; if (!zero) @@ -8524,7 +8542,7 @@ while (*cc != OP_KETRPOS) { if (offset != 0) { - OP2(SLJIT_ADD, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, stacksize * sizeof(sljit_sw)); + OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, stacksize * sizeof(sljit_sw)); OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), cbraprivptr); OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), STR_PTR, 0); OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), cbraprivptr, STR_PTR, 0); @@ -8535,10 +8553,10 @@ while (*cc != OP_KETRPOS) else { OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); - OP2(SLJIT_ADD, STACK_TOP, 0, TMP2, 0, SLJIT_IMM, stacksize * sizeof(sljit_sw)); + OP2(SLJIT_SUB, STACK_TOP, 0, TMP2, 0, SLJIT_IMM, stacksize * sizeof(sljit_sw)); if (opcode == OP_SBRAPOS) - OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), (framesize + 1) * sizeof(sljit_sw)); - OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), (framesize + 1) * sizeof(sljit_sw), STR_PTR, 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), STACK(-framesize - 2)); + OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), STACK(-framesize - 2), STR_PTR, 0); } /* Even if the match is empty, we need to reset the control head. */ @@ -8584,7 +8602,7 @@ while (*cc != OP_KETRPOS) else { OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); - OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(TMP2), (framesize + 1) * sizeof(sljit_sw)); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(TMP2), STACK(-framesize - 2)); } } @@ -8601,7 +8619,7 @@ if (!zero) if (framesize < 0) add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(stacksize - 1), SLJIT_IMM, 0)); else /* TMP2 is set to [private_data_ptr] above. */ - add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(TMP2), (stacksize - 1) * sizeof(sljit_sw), SLJIT_IMM, 0)); + add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(TMP2), STACK(-stacksize), SLJIT_IMM, 0)); } /* None of them matched. */ @@ -8824,7 +8842,7 @@ if (exact > 1) OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, exact); label = LABEL(); compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, FALSE); - OP2(SLJIT_SUB | SLJIT_SET_E, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); + OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); JUMPTO(SLJIT_NOT_ZERO, label); } else @@ -8832,7 +8850,7 @@ if (exact > 1) OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, exact); label = LABEL(); compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, TRUE); - OP2(SLJIT_SUB | SLJIT_SET_E, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); + OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); JUMPTO(SLJIT_NOT_ZERO, label); } } @@ -8862,7 +8880,7 @@ switch(opcode) if (opcode == OP_UPTO) { OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0); - OP2(SLJIT_SUB | SLJIT_SET_E, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + OP2(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); jump = JUMP(SLJIT_ZERO); OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0, TMP1, 0); } @@ -8924,7 +8942,7 @@ switch(opcode) label = LABEL(); if (opcode == OP_UPTO) { - OP2(SLJIT_SUB | SLJIT_SET_E, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); + OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_ZERO)); } compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, FALSE); @@ -8944,7 +8962,7 @@ switch(opcode) OP1(SLJIT_MOV, base, offset1, STR_PTR, 0); if (opcode == OP_UPTO) { - OP2(SLJIT_SUB | SLJIT_SET_E, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); + OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); add_jump(compiler, &no_match, JUMP(SLJIT_ZERO)); } @@ -8971,7 +8989,7 @@ switch(opcode) if (opcode == OP_UPTO) { - OP2(SLJIT_SUB | SLJIT_SET_E, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); + OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); JUMPTO(SLJIT_NOT_ZERO, label); } else @@ -9000,7 +9018,7 @@ switch(opcode) if (opcode == OP_UPTO) { - OP2(SLJIT_SUB | SLJIT_SET_E, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); + OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); JUMPTO(SLJIT_NOT_ZERO, label); } else @@ -9026,7 +9044,7 @@ switch(opcode) compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE); if (opcode == OP_UPTO) { - OP2(SLJIT_SUB | SLJIT_SET_E, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); + OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); JUMPTO(SLJIT_NOT_ZERO, label); OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); } @@ -9113,7 +9131,7 @@ switch(opcode) label = LABEL(); compile_char1_matchingpath(common, type, cc, &no_match, TRUE); OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, STR_PTR, 0); - OP2(SLJIT_SUB | SLJIT_SET_E, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); + OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); JUMPTO(SLJIT_NOT_ZERO, label); set_jumps(no_match, LABEL()); OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1); @@ -9124,7 +9142,7 @@ switch(opcode) label = LABEL(); detect_partial_match(common, &no_match); compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE); - OP2(SLJIT_SUB | SLJIT_SET_E, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); + OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); JUMPTO(SLJIT_NOT_ZERO, label); OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); set_jumps(no_char1_match, LABEL()); @@ -9142,7 +9160,7 @@ switch(opcode) break; default: - SLJIT_ASSERT_STOP(); + SLJIT_UNREACHABLE(); break; } @@ -9264,7 +9282,7 @@ size = 3 + (size < 0 ? 0 : size); OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr); allocate_stack(common, size); if (size > 3) - OP2(SLJIT_SUB, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, STACK_TOP, 0, SLJIT_IMM, (size - 3) * sizeof(sljit_sw)); + OP2(SLJIT_ADD, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, STACK_TOP, 0, SLJIT_IMM, (size - 3) * sizeof(sljit_sw)); else OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, STACK_TOP, 0); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(size - 1), SLJIT_IMM, BACKTRACK_AS(then_trap_backtrack)->start); @@ -9569,7 +9587,7 @@ while (cc < ccend) break; default: - SLJIT_ASSERT_STOP(); + SLJIT_UNREACHABLE(); return; } if (cc == NULL) @@ -9677,7 +9695,7 @@ switch(opcode) case OP_MINUPTO: OP1(SLJIT_MOV, TMP1, 0, base, offset1); OP1(SLJIT_MOV, STR_PTR, 0, base, offset0); - OP2(SLJIT_SUB | SLJIT_SET_E, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + OP2(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); add_jump(compiler, &jumplist, JUMP(SLJIT_ZERO)); OP1(SLJIT_MOV, base, offset1, TMP1, 0); @@ -9723,7 +9741,7 @@ switch(opcode) break; default: - SLJIT_ASSERT_STOP(); + SLJIT_UNREACHABLE(); break; } @@ -9831,7 +9849,7 @@ if (*cc == OP_ASSERT || *cc == OP_ASSERTBACK) { OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), CURRENT_AS(assert_backtrack)->private_data_ptr); add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); - OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), CURRENT_AS(assert_backtrack)->private_data_ptr, SLJIT_MEM1(STACK_TOP), CURRENT_AS(assert_backtrack)->framesize * sizeof(sljit_sw)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), CURRENT_AS(assert_backtrack)->private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-CURRENT_AS(assert_backtrack)->framesize - 1)); set_jumps(current->topbacktracks, LABEL()); } @@ -9841,7 +9859,7 @@ else if (bra == OP_BRAZERO) { /* We know there is enough place on the stack. */ - OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw)); + OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw)); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); JUMPTO(SLJIT_JUMP, CURRENT_AS(assert_backtrack)->matchingpath); JUMPHERE(brajump); @@ -9954,7 +9972,7 @@ else if (ket == OP_KETRMIN) else { OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); - CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_MEM1(TMP1), (CURRENT_AS(bracket_backtrack)->u.framesize + 1) * sizeof(sljit_sw), CURRENT_AS(bracket_backtrack)->recursive_matchingpath); + CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_MEM1(TMP1), STACK(-CURRENT_AS(bracket_backtrack)->u.framesize - 2), CURRENT_AS(bracket_backtrack)->recursive_matchingpath); } /* Drop STR_PTR for non-greedy plus quantifier. */ if (opcode != OP_ONCE) @@ -10060,7 +10078,7 @@ if (SLJIT_UNLIKELY(opcode == OP_COND) || SLJIT_UNLIKELY(opcode == OP_SCOND)) { OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), assert->private_data_ptr); add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); - OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), assert->private_data_ptr, SLJIT_MEM1(STACK_TOP), assert->framesize * sizeof(sljit_sw)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), assert->private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-assert->framesize - 1)); } cond = JUMP(SLJIT_JUMP); set_jumps(CURRENT_AS(bracket_backtrack)->u.assert->condfailed, LABEL()); @@ -10201,7 +10219,7 @@ if (has_alternatives) { OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), assert->private_data_ptr); add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); - OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), assert->private_data_ptr, SLJIT_MEM1(STACK_TOP), assert->framesize * sizeof(sljit_sw)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), assert->private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-assert->framesize - 1)); } JUMPHERE(cond); } @@ -10256,7 +10274,7 @@ else if (opcode == OP_ONCE) JUMPHERE(once); /* Restore previous private_data_ptr */ if (CURRENT_AS(bracket_backtrack)->u.framesize >= 0) - OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), CURRENT_AS(bracket_backtrack)->u.framesize * sizeof(sljit_sw)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-CURRENT_AS(bracket_backtrack)->u.framesize - 1)); else if (ket == OP_KETRMIN) { OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); @@ -10346,7 +10364,7 @@ if (current->topbacktracks) free_stack(common, CURRENT_AS(bracketpos_backtrack)->stacksize); JUMPHERE(jump); } -OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), CURRENT_AS(bracketpos_backtrack)->private_data_ptr, SLJIT_MEM1(STACK_TOP), CURRENT_AS(bracketpos_backtrack)->framesize * sizeof(sljit_sw)); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), CURRENT_AS(bracketpos_backtrack)->private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-CURRENT_AS(bracketpos_backtrack)->framesize - 1)); } static SLJIT_INLINE void compile_braminzero_backtrackingpath(compiler_common *common, struct backtrack_common *current) @@ -10392,10 +10410,10 @@ if (opcode == OP_THEN || opcode == OP_THEN_ARG) jump = JUMP(SLJIT_JUMP); loop = LABEL(); - OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), -(int)sizeof(sljit_sw)); + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); JUMPHERE(jump); - CMPTO(SLJIT_NOT_EQUAL, SLJIT_MEM1(STACK_TOP), -(int)(2 * sizeof(sljit_sw)), TMP1, 0, loop); - CMPTO(SLJIT_NOT_EQUAL, SLJIT_MEM1(STACK_TOP), -(int)(3 * sizeof(sljit_sw)), TMP2, 0, loop); + CMPTO(SLJIT_NOT_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0, loop); + CMPTO(SLJIT_NOT_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(2), TMP2, 0, loop); add_jump(compiler, &common->then_trap->quit, JUMP(SLJIT_JUMP)); return; } @@ -10645,7 +10663,7 @@ while (current) break; default: - SLJIT_ASSERT_STOP(); + SLJIT_UNREACHABLE(); break; } current = current->prev; @@ -10684,7 +10702,7 @@ sljit_emit_fast_enter(compiler, TMP2, 0); count_match(common); allocate_stack(common, private_data_size + framesize + alternativesize); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(private_data_size + framesize + alternativesize - 1), TMP2, 0); -copy_private_data(common, ccbegin, ccend, TRUE, private_data_size + framesize + alternativesize, framesize + alternativesize, needs_control_head); +copy_private_data(common, ccbegin, ccend, TRUE, framesize + alternativesize, private_data_size + framesize + alternativesize, needs_control_head); if (needs_control_head) OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0); OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->recursive_head_ptr, STACK_TOP, 0); @@ -10737,9 +10755,9 @@ if (common->quit != NULL) OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), common->recursive_head_ptr); if (needs_frame) { - OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + alternativesize) * sizeof(sljit_sw)); - add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + alternativesize) * sizeof(sljit_sw)); + add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); + OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + alternativesize) * sizeof(sljit_sw)); } OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, 0); common->quit = NULL; @@ -10750,32 +10768,32 @@ set_jumps(common->accept, LABEL()); OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), common->recursive_head_ptr); if (needs_frame) { - OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + alternativesize) * sizeof(sljit_sw)); - add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + alternativesize) * sizeof(sljit_sw)); + add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); + OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + alternativesize) * sizeof(sljit_sw)); } OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, 1); JUMPHERE(jump); if (common->quit != NULL) set_jumps(common->quit, LABEL()); -copy_private_data(common, ccbegin, ccend, FALSE, private_data_size + framesize + alternativesize, framesize + alternativesize, needs_control_head); +copy_private_data(common, ccbegin, ccend, FALSE, framesize + alternativesize, private_data_size + framesize + alternativesize, needs_control_head); free_stack(common, private_data_size + framesize + alternativesize); if (needs_control_head) { - OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), 2 * sizeof(sljit_sw)); - OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), sizeof(sljit_sw)); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(-3)); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(-2)); OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->recursive_head_ptr, TMP1, 0); OP1(SLJIT_MOV, TMP1, 0, TMP3, 0); OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, TMP2, 0); } else { - OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), sizeof(sljit_sw)); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(-2)); OP1(SLJIT_MOV, TMP1, 0, TMP3, 0); OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->recursive_head_ptr, TMP2, 0); } -sljit_emit_fast_return(compiler, SLJIT_MEM1(STACK_TOP), 0); +sljit_emit_fast_return(compiler, SLJIT_MEM1(STACK_TOP), STACK(-1)); } #undef COMPILE_BACKTRACKINGPATH @@ -11237,7 +11255,7 @@ OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, TMP2, 0); OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, stack)); OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(struct sljit_stack, top), STACK_TOP, 0); -OP2(SLJIT_ADD, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(struct sljit_stack, limit), SLJIT_IMM, STACK_GROWTH_RATE); +OP2(SLJIT_SUB, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(struct sljit_stack, limit), SLJIT_IMM, STACK_GROWTH_RATE); sljit_emit_ijump(compiler, SLJIT_CALL2, SLJIT_IMM, SLJIT_FUNC_OFFSET(sljit_stack_resize)); jump = CMP(SLJIT_NOT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0); @@ -11391,10 +11409,10 @@ union { sljit_u8 local_space[MACHINE_STACK_SIZE]; struct sljit_stack local_stack; -local_stack.top = (sljit_sw)&local_space; -local_stack.base = local_stack.top; -local_stack.limit = local_stack.base + MACHINE_STACK_SIZE; -local_stack.max_limit = local_stack.limit; +local_stack.max_limit = local_space; +local_stack.limit = local_space; +local_stack.base = local_space + MACHINE_STACK_SIZE; +local_stack.top = local_space + MACHINE_STACK_SIZE; arguments->stack = &local_stack; convert_executable_func.executable_func = executable_func; return convert_executable_func.call_executable_func(arguments); diff --git a/pcre/pcre_scanner_unittest.cc b/pcre/pcre_scanner_unittest.cc index c00312c4f63..623e2afda80 100644 --- a/pcre/pcre_scanner_unittest.cc +++ b/pcre/pcre_scanner_unittest.cc @@ -57,6 +57,7 @@ } while (0) using std::vector; +using std::string; using pcrecpp::StringPiece; using pcrecpp::Scanner; diff --git a/pcre/pcre_stringpiece.h.in b/pcre/pcre_stringpiece.h.in index eb25826b453..f54f3f3b31b 100644 --- a/pcre/pcre_stringpiece.h.in +++ b/pcre/pcre_stringpiece.h.in @@ -52,12 +52,12 @@ #include +namespace pcrecpp { + using std::memcmp; using std::strlen; using std::string; -namespace pcrecpp { - class PCRECPP_EXP_DEFN StringPiece { private: const char* ptr_; diff --git a/pcre/pcre_stringpiece_unittest.cc b/pcre/pcre_stringpiece_unittest.cc index 1c4759da3b0..88e73a1f976 100644 --- a/pcre/pcre_stringpiece_unittest.cc +++ b/pcre/pcre_stringpiece_unittest.cc @@ -24,6 +24,7 @@ } \ } while (0) +using std::string; using pcrecpp::StringPiece; static void CheckSTLComparator() { diff --git a/pcre/pcre_tables.c b/pcre/pcre_tables.c index 4960af57c4d..5e18e8cf904 100644 --- a/pcre/pcre_tables.c +++ b/pcre/pcre_tables.c @@ -6,7 +6,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel - Copyright (c) 1997-2012 University of Cambridge + Copyright (c) 1997-2017 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -161,7 +161,7 @@ const pcre_uint32 PRIV(ucp_gbtable[]) = { (1< #include "pcrecpp.h" +using std::string; using pcrecpp::StringPiece; using pcrecpp::RE; using pcrecpp::RE_Options; diff --git a/pcre/pcregrep.c b/pcre/pcregrep.c index fd2a67622ba..317f7454e13 100644 --- a/pcre/pcregrep.c +++ b/pcre/pcregrep.c @@ -1804,11 +1804,6 @@ while (ptr < endptr) if (line_buffered) fflush(stdout); rc = 0; /* Had some success */ - /* If the current match ended past the end of the line (only possible - in multiline mode), we are done with this line. */ - - if ((unsigned int)offsets[1] > linelength) goto END_ONE_MATCH; - startoffset = offsets[1]; /* Restart after the match */ if (startoffset <= oldstartoffset) { @@ -1818,6 +1813,22 @@ while (ptr < endptr) if (utf8) while ((matchptr[startoffset] & 0xc0) == 0x80) startoffset++; } + + /* If the current match ended past the end of the line (only possible + in multiline mode), we must move on to the line in which it did end + before searching for more matches. */ + + while (startoffset > (int)linelength) + { + matchptr = ptr += linelength + endlinelength; + filepos += (int)(linelength + endlinelength); + linenumber++; + startoffset -= (int)(linelength + endlinelength); + t = end_of_line(ptr, endptr, &endlinelength); + linelength = t - ptr - endlinelength; + length = (size_t)(endptr - ptr); + } + goto ONLY_MATCHING_RESTART; } } @@ -3179,9 +3190,11 @@ for (j = 1, cp = patterns; cp != NULL; j++, cp = cp->next) cp->hint = pcre_study(cp->compiled, study_options, &error); if (error != NULL) { - char s[16]; - if (patterns->next == NULL) s[0] = 0; else sprintf(s, " number %d", j); - fprintf(stderr, "pcregrep: Error while studying regex%s: %s\n", s, error); + if (patterns->next == NULL) + fprintf(stderr, "pcregrep: Error while studying regex: %s\n", error); + else + fprintf(stderr, "pcregrep: Error while studying regex number %d: %s\n", + j, error); goto EXIT2; } #ifdef SUPPORT_PCREGREP_JIT diff --git a/pcre/pcreposix.c b/pcre/pcreposix.c index cf75588c40d..7b404a71100 100644 --- a/pcre/pcreposix.c +++ b/pcre/pcreposix.c @@ -6,7 +6,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel - Copyright (c) 1997-2016 University of Cambridge + Copyright (c) 1997-2017 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -389,8 +389,8 @@ if (rc >= 0) { for (i = 0; i < (size_t)rc; i++) { - pmatch[i].rm_so = ovector[i*2]; - pmatch[i].rm_eo = ovector[i*2+1]; + pmatch[i].rm_so = ovector[i*2] + so; + pmatch[i].rm_eo = ovector[i*2+1] + so; } if (allocated_ovector) free(ovector); for (; i < nmatch; i++) pmatch[i].rm_so = pmatch[i].rm_eo = -1; diff --git a/pcre/pcretest.c b/pcre/pcretest.c index 5b73a918075..f1303037281 100644 --- a/pcre/pcretest.c +++ b/pcre/pcretest.c @@ -177,7 +177,7 @@ that differ in their output from isprint() even in the "C" locale. */ #define PRINTABLE(c) ((c) >= 32 && (c) < 127) #endif -#define PRINTOK(c) (locale_set? isprint(c) : PRINTABLE(c)) +#define PRINTOK(c) (locale_set? (((c) < 256) && isprint(c)) : PRINTABLE(c)) /* Posix support is disabled in 16 or 32 bit only mode. */ #if !defined SUPPORT_PCRE8 && !defined NOPOSIX @@ -426,11 +426,11 @@ argument, the casting might be incorrectly applied. */ #define PCRE_COPY_NAMED_SUBSTRING32(rc, re, bptr, offsets, count, \ namesptr, cbuffer, size) \ rc = pcre32_copy_named_substring((pcre32 *)re, (PCRE_SPTR32)bptr, offsets, \ - count, (PCRE_SPTR32)namesptr, (PCRE_UCHAR32 *)cbuffer, size/2) + count, (PCRE_SPTR32)namesptr, (PCRE_UCHAR32 *)cbuffer, size/4) #define PCRE_COPY_SUBSTRING32(rc, bptr, offsets, count, i, cbuffer, size) \ rc = pcre32_copy_substring((PCRE_SPTR32)bptr, offsets, count, i, \ - (PCRE_UCHAR32 *)cbuffer, size/2) + (PCRE_UCHAR32 *)cbuffer, size/4) #define PCRE_DFA_EXEC32(count, re, extra, bptr, len, start_offset, options, \ offsets, size_offsets, workspace, size_workspace) \ @@ -4834,7 +4834,16 @@ while (!done) continue; case 'O': - while(isdigit(*p)) n = n * 10 + *p++ - '0'; + while(isdigit(*p)) + { + if (n > (INT_MAX-10)/10) /* Hack to stop fuzzers */ + { + printf("** \\O argument is too big\n"); + yield = 1; + goto EXIT; + } + n = n * 10 + *p++ - '0'; + } if (n > size_offsets_max) { size_offsets_max = n; diff --git a/pcre/testdata/testinput1 b/pcre/testdata/testinput1 index 93abab3c851..5c23f41fa81 100644 --- a/pcre/testdata/testinput1 +++ b/pcre/testdata/testinput1 @@ -5739,4 +5739,7 @@ AbcdCBefgBhiBqz /(?=.*X)X$/ \ X +/X+(?#comment)?/ + >XXX< + /-- End of testinput1 --/ diff --git a/pcre/testdata/testinput12 b/pcre/testdata/testinput12 index 944be6943f5..89ed4564bcd 100644 --- a/pcre/testdata/testinput12 +++ b/pcre/testdata/testinput12 @@ -104,4 +104,6 @@ and a couple of things that are different with JIT. --/ /(.|.)*?bx/ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabax +/((?(?!))x)(?'name')(?1)/S++ + /-- End of testinput12 --/ diff --git a/pcre/testdata/testinput15 b/pcre/testdata/testinput15 index 83e26773471..c065105b1ec 100644 --- a/pcre/testdata/testinput15 +++ b/pcre/testdata/testinput15 @@ -363,4 +363,7 @@ correctly, but that messes up comparisons). --/ /abc/89 +//8+L + \xf1\xad\xae\xae + /-- End of testinput15 --/ diff --git a/pcre/testdata/testinput8 b/pcre/testdata/testinput8 index 7f8fa8292c5..e931410479f 100644 --- a/pcre/testdata/testinput8 +++ b/pcre/testdata/testinput8 @@ -4845,4 +4845,7 @@ aaa\D a\D +/(02-)?[0-9]{3}-[0-9]{3}/ + 02-123-123 + /-- End of testinput8 --/ diff --git a/pcre/testdata/testoutput1 b/pcre/testdata/testoutput1 index a2b3cffe9d4..eff8ecc948c 100644 --- a/pcre/testdata/testoutput1 +++ b/pcre/testdata/testoutput1 @@ -9442,4 +9442,8 @@ No match \ X 0: X +/X+(?#comment)?/ + >XXX< + 0: X + /-- End of testinput1 --/ diff --git a/pcre/testdata/testoutput12 b/pcre/testdata/testoutput12 index 87911086f49..7632c4e5801 100644 --- a/pcre/testdata/testoutput12 +++ b/pcre/testdata/testoutput12 @@ -201,4 +201,6 @@ No match, mark = m (JIT) aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabax Error -8 (match limit exceeded) +/((?(?!))x)(?'name')(?1)/S++ + /-- End of testinput12 --/ diff --git a/pcre/testdata/testoutput15 b/pcre/testdata/testoutput15 index bad2807c2fd..e4e123c3983 100644 --- a/pcre/testdata/testoutput15 +++ b/pcre/testdata/testoutput15 @@ -1136,4 +1136,9 @@ Failed: setting UTF is disabled by the application at offset 0 /abc/89 Failed: setting UTF is disabled by the application at offset 0 +//8+L + \xf1\xad\xae\xae + 0: + 0+ \x{6dbae} + /-- End of testinput15 --/ diff --git a/pcre/testdata/testoutput8 b/pcre/testdata/testoutput8 index 17b667a980c..4984376d3c8 100644 --- a/pcre/testdata/testoutput8 +++ b/pcre/testdata/testoutput8 @@ -7801,4 +7801,8 @@ No match ** Show all captures ignored after DFA matching 0: a +/(02-)?[0-9]{3}-[0-9]{3}/ + 02-123-123 + 0: 02-123-123 + /-- End of testinput8 --/ diff --git a/plugin/auth_gssapi/gssapi_server.cc b/plugin/auth_gssapi/gssapi_server.cc index ac75a4f1593..50c34ecc573 100644 --- a/plugin/auth_gssapi/gssapi_server.cc +++ b/plugin/auth_gssapi/gssapi_server.cc @@ -44,26 +44,30 @@ static char* get_default_principal_name() if(krb5_init_context(&context)) { - sql_print_warning("GSSAPI plugin : krb5_init_context failed"); + my_printf_error(0, "GSSAPI plugin : krb5_init_context failed", + ME_ERROR_LOG | ME_WARNING); goto cleanup; } if (krb5_sname_to_principal(context, NULL, "mariadb", KRB5_NT_SRV_HST, &principal)) { - sql_print_warning("GSSAPI plugin : krb5_sname_to_principal failed"); + my_printf_error(0, "GSSAPI plugin : krb5_sname_to_principal failed", + ME_ERROR_LOG | ME_WARNING); goto cleanup; } if (krb5_unparse_name(context, principal, &unparsed_name)) { - sql_print_warning("GSSAPI plugin : krb5_unparse_name failed"); + my_printf_error(0, "GSSAPI plugin : krb5_unparse_name failed", + ME_ERROR_LOG | ME_WARNING); goto cleanup; } /* Check for entry in keytab */ if (krb5_kt_read_service_key(context, NULL, principal, 0, (krb5_enctype)0, &key)) { - sql_print_warning("GSSAPI plugin : default principal '%s' not found in keytab", unparsed_name); + my_printf_error(0, "GSSAPI plugin : default principal '%s' not found in keytab", + ME_ERROR_LOG | ME_WARNING, unparsed_name); goto cleanup; } @@ -100,7 +104,8 @@ int plugin_init() /* import service principal from plain text */ if(srv_principal_name && srv_principal_name[0]) { - sql_print_information("GSSAPI plugin : using principal name '%s'", srv_principal_name); + my_printf_error(0, "GSSAPI plugin : using principal name '%s'", + ME_ERROR_LOG | ME_NOTE, srv_principal_name); principal_name_buf.length= strlen(srv_principal_name); principal_name_buf.value= srv_principal_name; major= gss_import_name(&minor, &principal_name_buf, GSS_C_NT_USER_NAME, &service_name); @@ -115,8 +120,6 @@ int plugin_init() service_name= GSS_C_NO_NAME; } - - /* Check if SPN configuration is OK */ major= gss_acquire_cred(&minor, service_name, GSS_C_INDEFINITE, GSS_C_NO_OID_SET, GSS_C_ACCEPT, &cred, NULL, diff --git a/plugin/auth_gssapi/sspi_server.cc b/plugin/auth_gssapi/sspi_server.cc index 1dfd2986aaa..d2c2ae7e4b9 100644 --- a/plugin/auth_gssapi/sspi_server.cc +++ b/plugin/auth_gssapi/sspi_server.cc @@ -284,8 +284,8 @@ int plugin_init() { srv_principal_name= get_default_principal_name(); } - sql_print_information("SSPI: using principal name '%s', mech '%s'", - srv_principal_name, srv_mech_name); + my_printf_error(0, "SSPI: using principal name '%s', mech '%s'", + ME_ERROR_LOG | ME_NOTE, srv_principal_name, srv_mech_name); ret = AcquireCredentialsHandle( srv_principal_name, diff --git a/plugin/auth_pam/auth_pam.c b/plugin/auth_pam/auth_pam.c index 1f25163b371..ffc3d6f5537 100644 --- a/plugin/auth_pam/auth_pam.c +++ b/plugin/auth_pam/auth_pam.c @@ -162,10 +162,11 @@ static int pam_auth(MYSQL_PLUGIN_VIO *vio, MYSQL_SERVER_AUTH_INFO *info) if (new_username && strcmp(new_username, info->user_name)) strncpy(info->authenticated_as, new_username, sizeof(info->authenticated_as)); + info->authenticated_as[sizeof(info->authenticated_as)-1]= 0; end: pam_end(pamh, status); - PAM_DEBUG((stderr, "PAM: status = %d user = %s\n", status, new_username)); + PAM_DEBUG((stderr, "PAM: status = %d user = %s\n", status, info->authenticated_as)); return status == PAM_SUCCESS ? CR_OK : CR_ERROR; } diff --git a/plugin/aws_key_management/CMakeLists.txt b/plugin/aws_key_management/CMakeLists.txt index 2202efe9e41..913bd8b16ed 100644 --- a/plugin/aws_key_management/CMakeLists.txt +++ b/plugin/aws_key_management/CMakeLists.txt @@ -15,6 +15,7 @@ MACRO(SKIP_AWS_PLUGIN msg) MESSAGE_ONCE(SKIP_AWS_PLUGIN "Skip aws_key_management - ${msg}") RETURN() ENDMACRO() +SET(CMAKE_CXX_STANDARD 11) @@ -86,6 +87,10 @@ ELSE() IF(NOT UUID_LIBRARIES) SKIP_AWS_PLUGIN("AWS C++ SDK requires uuid development package") ENDIF() + FIND_PACKAGE(OpenSSL) + IF(NOT OPENSSL_FOUND) + SKIP_AWS_PLUGIN("AWS C++ SDK requires openssl development package") + ENDIF() ENDIF() ENDIF() IF(MSVC) @@ -109,11 +114,10 @@ ELSE() ENDFOREACH() # To be compatible with older cmake, we use older version of the SDK - # We increase the version for macs however, so the newest mac could built it. - IF(APPLE) - SET(GIT_TAG "1.0.100") + IF(CMAKE_VERSION LESS "3.0") + SET(GIT_TAG "1.0.8") ELSE() - SET(GIT_TAG "1.0.8") + SET(GIT_TAG "1.1.27") ENDIF() SET(AWS_SDK_PATCH_COMMAND ) @@ -135,6 +139,7 @@ ELSE() "-DCMAKE_CXX_FLAGS_MINSIZEREL=${CMAKE_CXX_FLAGS_MINSIZEREL} ${PIC_FLAG}" ${EXTRA_SDK_CMAKE_FLAGS} -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/aws_sdk_cpp + -DCMAKE_INSTALL_LIBDIR=lib TEST_COMMAND "" ) SET_TARGET_PROPERTIES(aws_sdk_cpp PROPERTIES EXCLUDE_FROM_ALL TRUE) @@ -156,7 +161,7 @@ ENDIF() IF(WIN32) SET(AWS_CPP_SDK_DEPENDENCIES bcrypt winhttp wininet userenv version) ELSE() - SET(AWS_CPP_SDK_DEPENDENCIES ${SSL_LIBRARIES} ${CURL_LIBRARIES} ${UUID_LIBRARIES}) + SET(AWS_CPP_SDK_DEPENDENCIES ${OPENSSL_LIBRARIES} ${CURL_LIBRARIES} ${UUID_LIBRARIES}) ENDIF() MYSQL_ADD_PLUGIN(aws_key_management aws_key_management_plugin.cc LINK_LIBRARIES ${AWS_SDK_LIBS} ${AWS_CPP_SDK_DEPENDENCIES} diff --git a/plugin/aws_key_management/aws_key_management_plugin.cc b/plugin/aws_key_management/aws_key_management_plugin.cc index 83966b97c17..60ca6fd1ff3 100644 --- a/plugin/aws_key_management/aws_key_management_plugin.cc +++ b/plugin/aws_key_management/aws_key_management_plugin.cc @@ -16,15 +16,14 @@ #include -#include -#include -#include +#include #include #include #include #include #include #include +#include #include #include #include @@ -33,6 +32,10 @@ #include #include +#ifndef _WIN32 +#include +#endif + #include #include #include @@ -48,9 +51,6 @@ using namespace std; using namespace Aws::KMS; using namespace Aws::KMS::Model; using namespace Aws::Utils::Logging; -extern void sql_print_error(const char *format, ...); -extern void sql_print_warning(const char *format, ...); -extern void sql_print_information(const char *format, ...); /* Plaintext key info struct */ @@ -82,25 +82,59 @@ static unsigned long log_level; static int rotate_key; static int request_timeout; +#ifndef DBUG_OFF +#define WITH_AWS_MOCK 1 +#else +#define WITH_AWS_MOCK 0 +#endif + +#if WITH_AWS_MOCK +static char mock; +#endif + + /* AWS functionality*/ -static int aws_decrypt_key(const char *path, KEY_INFO *info); -static int aws_generate_datakey(uint key_id, uint version); +static int read_and_decrypt_key(const char *path, KEY_INFO *info); +static int generate_and_save_datakey(uint key_id, uint version); static int extract_id_and_version(const char *name, uint *id, uint *ver); static unsigned int get_latest_key_version(unsigned int key_id); static unsigned int get_latest_key_version_nolock(unsigned int key_id); static int load_key(KEY_INFO *info); +static std::mutex mtx; -/* Mutex to serialize access to caches */ -static mysql_mutex_t mtx; - -#ifdef HAVE_PSI_INTERFACE -static uint mtx_key; -static PSI_mutex_info mtx_info = {&mtx_key, "mtx", 0}; -#endif static Aws::KMS::KMSClient *client; +#if WITH_AWS_MOCK +/* + Mock routines to test plugin without actual AWS KMS interaction + we only need to mock 2 functions - generating encrypted key, and decrypt + + This mock functions do no-op encryption, i.e encrypt and decrypt of + a buffer return the buffer itself. +*/ + +/* + Generate random "encrypted" key. We do not encrypt anything in mock mode. +*/ +static int mock_generate_encrypted_key(Aws::Utils::ByteBuffer *result) +{ + size_t len = key_spec == 0?16 : 32; + *result = Aws::Utils::ByteBuffer(len); + my_random_bytes(result->GetUnderlyingData(), (int)len); + return 0; +} + + +static int mock_decrypt(Aws::Utils::ByteBuffer input, Aws::Utils::ByteBuffer* output, Aws::String *errmsg) +{ + /* We do not encrypt or decrypt in mock mode.*/ + *output = input; + return 0; +} +#endif + /* Redirect AWS trace to error log */ class MySQLLogSystem : public Aws::Utils::Logging::FormattedLogSystem { @@ -140,17 +174,37 @@ protected: } }; +/* Get list of files in current directory */ +static vector traverse_current_directory() +{ + vector v; +#ifdef _WIN32 + WIN32_FIND_DATA find_data; + HANDLE h= FindFirstFile("*.*", &find_data); + if (h == INVALID_HANDLE_VALUE) + return v; + do + { + v.push_back(find_data.cFileName); + } + while (FindNextFile(h, &find_data)); + FindClose(h); +#else + DIR *dir = opendir("."); + if (!dir) + return v; + struct dirent *e; + while ((e= readdir(dir))) + v.push_back(e->d_name); + closedir(dir); +#endif + return v; +} + Aws::SDKOptions sdkOptions; -/* - Plugin initialization. - - Create KMS client and scan datadir to find out which keys and versions - are present. -*/ -static int plugin_init(void *p) +static int aws_init() { - DBUG_ENTER("plugin_init"); #ifdef HAVE_YASSL sdkOptions.cryptoOptions.initAndCleanupOpenSSL = true; @@ -175,47 +229,71 @@ static int plugin_init(void *p) client = new KMSClient(clientConfiguration); if (!client) { - sql_print_error("Can not initialize KMS client"); - DBUG_RETURN(-1); + my_printf_error(ER_UNKNOWN_ERROR, "Can not initialize KMS client", ME_ERROR_LOG | ME_WARNING); + return -1; } - -#ifdef HAVE_PSI_INTERFACE - mysql_mutex_register("aws_key_management", &mtx_info, 1); -#endif - mysql_mutex_init(mtx_key, &mtx, NULL); + return 0; +} - MY_DIR *dirp = my_dir(".", MYF(0)); - if (!dirp) - { - sql_print_error("Can't scan current directory"); - DBUG_RETURN(-1); - } - for (unsigned int i=0; i < dirp->number_of_files; i++) +static int init() +{ +#if WITH_AWS_MOCK + if(mock) + return 0; +#endif + return aws_init(); +} + +/* + Plugin initialization. + + Create KMS client and scan datadir to find out which keys and versions + are present. +*/ +static int plugin_init(void *p) +{ + if (init()) + return -1; + + vector files= traverse_current_directory(); + for (size_t i=0; i < files.size(); i++) { KEY_INFO info; - if (extract_id_and_version(dirp->dir_entry[i].name, &info.key_id, &info.key_version) == 0) + if (extract_id_and_version(files[i].c_str(), &info.key_id, &info.key_version) == 0) { key_info_cache[KEY_ID_AND_VERSION(info.key_id, info.key_version)]= info; latest_version_cache[info.key_id]= max(info.key_version, latest_version_cache[info.key_id]); } } - my_dirend(dirp); - DBUG_RETURN(0); + return 0; +} + + +static void aws_shutdown() +{ + delete client; + ShutdownAWSLogging(); + Aws::ShutdownAPI(sdkOptions); +} + + +static void shutdown() +{ +#if WITH_AWS_MOCK + if(mock) + return; +#endif + aws_shutdown(); } static int plugin_deinit(void *p) { - DBUG_ENTER("plugin_deinit"); latest_version_cache.clear(); key_info_cache.clear(); - mysql_mutex_destroy(&mtx); - delete client; - ShutdownAWSLogging(); - - Aws::ShutdownAPI(sdkOptions); - DBUG_RETURN(0); + shutdown(); + return 0; } /* Generate filename to store the ciphered key */ @@ -242,10 +320,9 @@ static int load_key(KEY_INFO *info) { int ret; char path[256]; - DBUG_ENTER("load_key"); - DBUG_PRINT("enter", ("id=%u,ver=%u", info->key_id, info->key_version)); + format_keyfile_name(path, sizeof(path), info->key_id, info->key_version); - ret= aws_decrypt_key(path, info); + ret= read_and_decrypt_key(path, info); if (ret) info->load_failed= true; @@ -254,15 +331,15 @@ static int load_key(KEY_INFO *info) if (!ret) { - sql_print_information("AWS KMS plugin: loaded key %u, version %u, key length %u bit", + my_printf_error(ER_UNKNOWN_ERROR, "AWS KMS plugin: loaded key %u, version %u, key length %u bit", ME_ERROR_LOG | ME_NOTE, info->key_id, info->key_version,(uint)info->length*8); } else { - sql_print_warning("AWS KMS plugin: key %u, version %u could not be decrypted", + my_printf_error(ER_UNKNOWN_ERROR, "AWS KMS plugin: key %u, version %u could not be decrypted", ME_ERROR_LOG | ME_WARNING, info->key_id, info->key_version); } - DBUG_RETURN(ret); + return ret; } @@ -281,19 +358,17 @@ static int load_key(KEY_INFO *info) static unsigned int get_latest_key_version(unsigned int key_id) { unsigned int ret; - DBUG_ENTER("get_latest_key_version"); - mysql_mutex_lock(&mtx); + mtx.lock(); ret= get_latest_key_version_nolock(key_id); - mysql_mutex_unlock(&mtx); - DBUG_PRINT("info", ("key=%u,ret=%u", key_id, ret)); - DBUG_RETURN(ret); + mtx.unlock(); + return ret; } static unsigned int get_latest_key_version_nolock(unsigned int key_id) { KEY_INFO info; uint ver; - DBUG_ENTER("get_latest_key_version_nolock"); + ver= latest_version_cache[key_id]; if (ver > 0) { @@ -302,91 +377,112 @@ static unsigned int get_latest_key_version_nolock(unsigned int key_id) if (info.load_failed) { /* Decryption failed previously, don't retry */ - DBUG_RETURN(ENCRYPTION_KEY_VERSION_INVALID); + return(ENCRYPTION_KEY_VERSION_INVALID); } else if (ver > 0) { /* Key exists already, return it*/ if (info.length > 0) - DBUG_RETURN(ver); + return(ver); } else // (ver == 0) { /* Generate a new key, version 1 */ - if (!master_key_id[0]) - { - my_printf_error(ER_UNKNOWN_ERROR, - "Can't generate encryption key %u, because 'aws_key_management_master_key_id' parameter is not set", - MYF(0), key_id); - DBUG_RETURN(ENCRYPTION_KEY_VERSION_INVALID); - } - if (aws_generate_datakey(key_id, 1) != 0) - DBUG_RETURN(ENCRYPTION_KEY_VERSION_INVALID); + if (generate_and_save_datakey(key_id, 1) != 0) + return(ENCRYPTION_KEY_VERSION_INVALID); info.key_id= key_id; info.key_version= 1; info.length= 0; } if (load_key(&info)) - DBUG_RETURN(ENCRYPTION_KEY_VERSION_INVALID); - DBUG_RETURN(info.key_version); + return(ENCRYPTION_KEY_VERSION_INVALID); + return(info.key_version); } +/* Decrypt Byte buffer with AWS. */ +static int aws_decrypt(Aws::Utils::ByteBuffer input, Aws::Utils::ByteBuffer* output, Aws::String *errmsg) +{ + DecryptRequest request; + request.SetCiphertextBlob(input); + DecryptOutcome outcome = client->Decrypt(request); + if (!outcome.IsSuccess()) + { + *errmsg = outcome.GetError().GetMessage(); + return -1; + } + *output= outcome.GetResult().GetPlaintext(); + return 0; +} + + +static int decrypt(Aws::Utils::ByteBuffer input, Aws::Utils::ByteBuffer* output, Aws::String *errmsg) +{ +#if WITH_AWS_MOCK + if(mock) + return mock_decrypt(input,output, errmsg); +#endif + return aws_decrypt(input, output, errmsg); +} /* Decrypt a file with KMS */ -static int aws_decrypt_key(const char *path, KEY_INFO *info) +static int read_and_decrypt_key(const char *path, KEY_INFO *info) { - DBUG_ENTER("aws_decrypt_key"); /* Read file content into memory */ ifstream ifs(path, ios::binary | ios::ate); if (!ifs.good()) { - sql_print_error("can't open file %s", path); - DBUG_RETURN(-1); + my_printf_error(ER_UNKNOWN_ERROR, "can't open file %s", ME_ERROR_LOG, path); + return(-1); } size_t pos = (size_t)ifs.tellg(); if (!pos || pos == SIZE_T_MAX) { - sql_print_error("invalid key file %s", path); - DBUG_RETURN(-1); + my_printf_error(ER_UNKNOWN_ERROR, "invalid key file %s", ME_ERROR_LOG, path); + return(-1); } std::vector contents(pos); ifs.seekg(0, ios::beg); ifs.read(&contents[0], pos); /* Decrypt data the with AWS */ - DecryptRequest request; - Aws::Utils::ByteBuffer byteBuffer((unsigned char *)contents.data(), pos); - request.SetCiphertextBlob(byteBuffer); - DecryptOutcome outcome = client->Decrypt(request); - if (!outcome.IsSuccess()) + + Aws::Utils::ByteBuffer input((unsigned char *)contents.data(), pos); + Aws::Utils::ByteBuffer plaintext; + Aws::String errmsg; + + if (decrypt(input, &plaintext, &errmsg)) { - sql_print_error("AWS KMS plugin: Decrypt failed for %s : %s", path, - outcome.GetError().GetMessage().c_str()); - DBUG_RETURN(-1); + my_printf_error(ER_UNKNOWN_ERROR, "AWS KMS plugin: Decrypt failed for %s : %s", ME_ERROR_LOG, path, + errmsg.c_str()); + return -1; } - Aws::Utils::ByteBuffer plaintext = outcome.GetResult().GetPlaintext(); + size_t len = plaintext.GetLength(); - if (len > (int)sizeof(info->data)) + if (len > sizeof(info->data)) { - sql_print_error("AWS KMS plugin: encoding key too large for %s", path); - DBUG_RETURN(ENCRYPTION_KEY_BUFFER_TOO_SMALL); + my_printf_error(ER_UNKNOWN_ERROR, "AWS KMS plugin: encoding key too large for %s", ME_ERROR_LOG, path); + return(ENCRYPTION_KEY_BUFFER_TOO_SMALL); } memcpy(info->data, plaintext.GetUnderlyingData(), len); info->length= len; - DBUG_RETURN(0); + return(0); } -/* Generate a new datakey and store it a file */ -static int aws_generate_datakey(uint keyid, uint version) +int aws_generate_encrypted_key(Aws::Utils::ByteBuffer *result) { - - DBUG_ENTER("aws_generate_datakey"); + if (!master_key_id[0]) + { + my_printf_error(ER_UNKNOWN_ERROR, + "Can't generate encryption key, because 'aws_key_management_master_key_id' parameter is not set", + MYF(0)); + return(-1); + } GenerateDataKeyWithoutPlaintextRequest request; request.SetKeyId(master_key_id); request.SetKeySpec(DataKeySpecMapper::GetDataKeySpecForName(key_spec_names[key_spec])); @@ -395,35 +491,54 @@ static int aws_generate_datakey(uint keyid, uint version) outcome= client->GenerateDataKeyWithoutPlaintext(request); if (!outcome.IsSuccess()) { - sql_print_error("AWS KMS plugin : GenerateDataKeyWithoutPlaintext failed : %s - %s", + my_printf_error(ER_UNKNOWN_ERROR, "AWS KMS plugin : GenerateDataKeyWithoutPlaintext failed : %s - %s", ME_ERROR_LOG, outcome.GetError().GetExceptionName().c_str(), outcome.GetError().GetMessage().c_str()); - DBUG_RETURN(-1); + return(-1); } + *result = outcome.GetResult().GetCiphertextBlob(); + return 0; +} + + +static int generate_encrypted_key(Aws::Utils::ByteBuffer *output) +{ +#if WITH_AWS_MOCK + if(mock) + return mock_generate_encrypted_key(output); +#endif + return aws_generate_encrypted_key(output); +} + +/* Generate a new datakey and store it a file */ +static int generate_and_save_datakey(uint keyid, uint version) +{ + Aws::Utils::ByteBuffer byteBuffer; + + if (generate_encrypted_key(&byteBuffer)) + return -1; string out; char filename[20]; - Aws::Utils::ByteBuffer byteBuffer = outcome.GetResult().GetCiphertextBlob(); - format_keyfile_name(filename, sizeof(filename), keyid, version); - int fd= my_open(filename, O_RDWR | O_CREAT, 0); + int fd= open(filename, O_WRONLY |O_CREAT|O_BINARY, IF_WIN(_S_IREAD, S_IRUSR| S_IRGRP| S_IROTH)); if (fd < 0) { - sql_print_error("AWS KMS plugin: Can't create file %s", filename); - DBUG_RETURN(-1); + my_printf_error(ER_UNKNOWN_ERROR, "AWS KMS plugin: Can't create file %s", ME_ERROR_LOG, filename); + return(-1); } size_t len= byteBuffer.GetLength(); - if (my_write(fd, byteBuffer.GetUnderlyingData(), len, 0) != len) + if (write(fd, byteBuffer.GetUnderlyingData(), len) != len) { - sql_print_error("AWS KMS plugin: can't write to %s", filename); - my_close(fd, 0); - my_delete(filename, 0); - DBUG_RETURN(-1); + my_printf_error(ER_UNKNOWN_ERROR, "AWS KMS plugin: can't write to %s", ME_ERROR_LOG, filename); + close(fd); + unlink(filename); + return(-1); } - my_close(fd, 0); - sql_print_information("AWS KMS plugin: generated encrypted datakey for key id=%u, version=%u", + close(fd); + my_printf_error(ER_UNKNOWN_ERROR, "AWS KMS plugin: generated encrypted datakey for key id=%u, version=%u", ME_ERROR_LOG | ME_NOTE, keyid, version); - DBUG_RETURN(0); + return(0); } /* Key rotation for a single key */ @@ -437,7 +552,7 @@ static int rotate_single_key(uint key_id) my_printf_error(ER_UNKNOWN_ERROR, "key %u does not exist", MYF(ME_JUST_WARNING), key_id); return -1; } - else if (aws_generate_datakey(key_id, ver + 1)) + else if (generate_and_save_datakey(key_id, ver + 1)) { my_printf_error(ER_UNKNOWN_ERROR, "Could not generate datakey for key id= %u, ver= %u", MYF(ME_JUST_WARNING), key_id, ver); @@ -479,7 +594,7 @@ static void update_rotate(MYSQL_THD, struct st_mysql_sys_var *, void *, const vo "aws_key_management_master_key_id must be set to generate new data keys", MYF(ME_JUST_WARNING)); return; } - mysql_mutex_lock(&mtx); + mtx.lock(); rotate_key= *(int *)val; switch (rotate_key) { @@ -493,7 +608,7 @@ static void update_rotate(MYSQL_THD, struct st_mysql_sys_var *, void *, const vo break; } rotate_key= 0; - mysql_mutex_unlock(&mtx); + mtx.unlock(); } static unsigned int get_key( @@ -504,8 +619,7 @@ static unsigned int get_key( { KEY_INFO info; - DBUG_ENTER("get_key"); - mysql_mutex_lock(&mtx); + mtx.lock(); info= key_info_cache[KEY_ID_AND_VERSION(key_id, version)]; if (info.length == 0 && !info.load_failed) { @@ -513,17 +627,17 @@ static unsigned int get_key( info.key_version= version; load_key(&info); } - mysql_mutex_unlock(&mtx); + mtx.unlock(); if (info.load_failed) - DBUG_RETURN(ENCRYPTION_KEY_VERSION_INVALID); + return(ENCRYPTION_KEY_VERSION_INVALID); if (*buflen < info.length) { *buflen= info.length; - DBUG_RETURN(ENCRYPTION_KEY_BUFFER_TOO_SMALL); + return(ENCRYPTION_KEY_BUFFER_TOO_SMALL); } *buflen= info.length; memcpy(dstbuf, info.data, info.length); - DBUG_RETURN(0); + return(0); } @@ -594,6 +708,13 @@ static MYSQL_SYSVAR_STR(region, region, "AWS region. For example us-east-1, or eu-central-1. If no value provided, SDK default is used.", NULL, NULL, ""); +#if WITH_AWS_MOCK +static MYSQL_SYSVAR_BOOL(mock, mock, + PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, + "Mock AWS KMS calls (for testing).", + NULL, NULL, 0); +#endif + static struct st_mysql_sys_var* settings[]= { MYSQL_SYSVAR(master_key_id), MYSQL_SYSVAR(key_spec), @@ -601,6 +722,9 @@ static struct st_mysql_sys_var* settings[]= { MYSQL_SYSVAR(log_level), MYSQL_SYSVAR(request_timeout), MYSQL_SYSVAR(region), +#if WITH_AWS_MOCK + MYSQL_SYSVAR(mock), +#endif NULL }; @@ -621,6 +745,6 @@ maria_declare_plugin(aws_key_management) NULL, settings, "1.0", - MariaDB_PLUGIN_MATURITY_BETA + MariaDB_PLUGIN_MATURITY_STABLE } maria_declare_plugin_end; diff --git a/plugin/cracklib_password_check/cracklib_password_check.c b/plugin/cracklib_password_check/cracklib_password_check.c index 7861d5fd83e..94587a6d659 100644 --- a/plugin/cracklib_password_check/cracklib_password_check.c +++ b/plugin/cracklib_password_check/cracklib_password_check.c @@ -30,6 +30,7 @@ static int crackme(MYSQL_LEX_STRING *username, MYSQL_LEX_STRING *password) const char *res; memcpy(user, username->str, username->length); + user[username->length]= 0; if ((host= strchr(user, '@'))) *host++= 0; diff --git a/plugin/daemon_example/CMakeLists.txt b/plugin/daemon_example/CMakeLists.txt index 3d674c4ef3e..28fbff78302 100644 --- a/plugin/daemon_example/CMakeLists.txt +++ b/plugin/daemon_example/CMakeLists.txt @@ -13,7 +13,8 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -MYSQL_ADD_PLUGIN(daemon_example daemon_example.cc +MYSQL_ADD_PLUGIN(daemon_example daemon_example.cc RECOMPILE_FOR_EMBEDDED MODULE_ONLY MODULE_OUTPUT_NAME "libdaemon_example" COMPONENT Test) -INSTALL(FILES daemon_example.ini DESTINATION ${INSTALL_PLUGINDIR} COMPONENT Test) +INSTALL(FILES daemon_example.ini DESTINATION ${INSTALL_PLUGINDIR} + COMPONENT Test) diff --git a/plugin/example_key_management/example_key_management_plugin.cc b/plugin/example_key_management/example_key_management_plugin.cc index 2b417866406..2b43729e3f7 100644 --- a/plugin/example_key_management/example_key_management_plugin.cc +++ b/plugin/example_key_management/example_key_management_plugin.cc @@ -28,18 +28,24 @@ #include #include #include -#include #include /* rotate key randomly between 45 and 90 seconds */ #define KEY_ROTATION_MIN 45 #define KEY_ROTATION_MAX 90 -static struct my_rnd_struct seed; static time_t key_version = 0; static time_t next_key_version = 0; static pthread_mutex_t mutex; + +/* Random double value in 0..1 range */ +static double double_rnd() +{ + return ((double)rand()) / RAND_MAX; +} + + static unsigned int get_latest_key_version(unsigned int key_id) { @@ -50,7 +56,7 @@ get_latest_key_version(unsigned int key_id) key_version = now; unsigned int interval = KEY_ROTATION_MAX - KEY_ROTATION_MIN; next_key_version = (time_t) (now + KEY_ROTATION_MIN + - my_rnd(&seed) * interval); + double_rnd() * interval); } pthread_mutex_unlock(&mutex); @@ -101,7 +107,6 @@ static unsigned int get_length(unsigned int slen, unsigned int key_id, static int example_key_management_plugin_init(void *p) { /* init */ - my_rnd_init(&seed, time(0), 0); pthread_mutex_init(&mutex, NULL); get_latest_key_version(1); @@ -114,14 +119,32 @@ static int example_key_management_plugin_deinit(void *p) return 0; } + +static int ctx_update(void *ctx, const unsigned char *src, unsigned int slen, + unsigned char *dst, unsigned int *dlen) +{ + return my_aes_crypt_update(ctx, src, slen, dst, dlen); +} + + +int ctx_finish(void *ctx, unsigned char *dst, unsigned int *dlen) +{ + return my_aes_crypt_finish(ctx, dst, dlen); +} + +static uint ctx_size(unsigned int , unsigned int key_version) +{ + return my_aes_ctx_size(mode(key_version)); +} + struct st_mariadb_encryption example_key_management_plugin= { MariaDB_ENCRYPTION_INTERFACE_VERSION, get_latest_key_version, get_key, - (uint (*)(unsigned int, unsigned int))my_aes_ctx_size, + ctx_size, ctx_init, - my_aes_crypt_update, - my_aes_crypt_finish, + ctx_update, + ctx_finish, get_length }; diff --git a/plugin/feedback/sender_thread.cc b/plugin/feedback/sender_thread.cc index 66f47e7302a..4742d5f4920 100644 --- a/plugin/feedback/sender_thread.cc +++ b/plugin/feedback/sender_thread.cc @@ -204,7 +204,7 @@ static void send_report(const char *when) /* otherwise, prepare the THD and TABLE_LIST, create and fill the temporary table with data just like - SELECT * FROM INFORMATION_SCHEMA.feedback is doing, + SELECT * FROM INFORMATION_SCHEMA.FEEDBACK is doing, read and concatenate table data into a String. */ if (!(thd= new THD(thd_thread_id))) diff --git a/plugin/file_key_management/file_key_management_plugin.cc b/plugin/file_key_management/file_key_management_plugin.cc index a1f1ed1fad4..141599c53de 100644 --- a/plugin/file_key_management/file_key_management_plugin.cc +++ b/plugin/file_key_management/file_key_management_plugin.cc @@ -13,7 +13,8 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - +#include +#include #include "parser.h" #include #include @@ -65,22 +66,14 @@ static struct st_mysql_sys_var* settings[] = { NULL }; -Dynamic_array keys(static_cast(0)); +std::map keys; static keyentry *get_key(unsigned int key_id) { - keyentry *a= keys.front(), *b= keys.back() + 1, *c; - while (b - a > 1) - { - c= a + (b - a)/2; - if (c->id == key_id) - return c; - else if (c->id < key_id) - a= c; - else - b= c; - } - return a->id == key_id ? a : 0; + keyentry &key= keys[key_id]; + if (key.id == 0) + return 0; + return &key; } /* the version is always the same, no automatic key rotation */ @@ -146,20 +139,37 @@ static int ctx_init(void *ctx, const unsigned char* key, unsigned int klen, return my_aes_crypt_init(ctx, mode(flags), flags, key, klen, iv, ivlen); } +static int ctx_update(void *ctx, const unsigned char *src, unsigned int slen, + unsigned char *dst, unsigned int *dlen) +{ + return my_aes_crypt_update(ctx, src, slen, dst, dlen); +} + + +static int ctx_finish(void *ctx, unsigned char *dst, unsigned int *dlen) +{ + return my_aes_crypt_finish(ctx, dst, dlen); +} + static unsigned int get_length(unsigned int slen, unsigned int key_id, unsigned int key_version) { return my_aes_get_size(mode(0), slen); } +static uint ctx_size(uint, uint) +{ + return my_aes_ctx_size(mode(0)); +} + struct st_mariadb_encryption file_key_management_plugin= { MariaDB_ENCRYPTION_INTERFACE_VERSION, get_latest_version, get_key_from_key_file, - (uint (*)(unsigned int, unsigned int))my_aes_ctx_size, + ctx_size, ctx_init, - my_aes_crypt_update, - my_aes_crypt_finish, + ctx_update, + ctx_finish, get_length }; @@ -171,7 +181,7 @@ static int file_key_management_plugin_init(void *p) static int file_key_management_plugin_deinit(void *p) { - keys.free_memory(); + keys.clear(); return 0; } diff --git a/plugin/file_key_management/parser.cc b/plugin/file_key_management/parser.cc index 047e9153ec2..ac78186a488 100644 --- a/plugin/file_key_management/parser.cc +++ b/plugin/file_key_management/parser.cc @@ -143,13 +143,13 @@ void Parser::bytes_to_key(const unsigned char *salt, const char *input, } -bool Parser::parse(Dynamic_array *keys) +bool Parser::parse(std::map *keys) { const char *secret= filekey; char buf[MAX_SECRET_SIZE + 1]; //If secret starts with FILE: interpret the secret as a filename. - if (is_prefix(filekey, FILE_PREFIX)) + if (strncmp(filekey, FILE_PREFIX,sizeof(FILE_PREFIX) -1) == 0) { if (read_filekey(filekey + sizeof(FILE_PREFIX) - 1, buf)) return 1; @@ -166,22 +166,26 @@ bool Parser::parse(Dynamic_array *keys) bool Parser::read_filekey(const char *filekey, char *secret) { - int f= my_open(filekey, O_RDONLY, MYF(MY_WME)); + int f= open(filekey, O_RDONLY|O_BINARY); if (f == -1) + { + my_error(EE_FILENOTFOUND,ME_ERROR_LOG, filekey, errno); return 1; - int len= my_read(f, (uchar*)secret, MAX_SECRET_SIZE, MYF(MY_WME)); - my_close(f, MYF(MY_WME)); + } + + int len= read(f, secret, MAX_SECRET_SIZE); if (len <= 0) + { + my_error(EE_READ,ME_ERROR_LOG, filekey, errno); + close(f); return 1; + } + close(f); while (secret[len - 1] == '\r' || secret[len - 1] == '\n') len--; secret[len]= '\0'; return 0; } -static int sort_keys(const keyentry *k1, const keyentry *k2) -{ - return k1->id < k2->id ? -1 : k1->id > k2->id; -} /** Get the keys from the key file and decrypt it with the @@ -191,7 +195,7 @@ static int sort_keys(const keyentry *k1, const keyentry *k2) @return 0 when ok, 1 for an error */ -bool Parser::parse_file(Dynamic_array *keys, const char *secret) +bool Parser::parse_file(std::map *keys, const char *secret) { char *buffer= read_and_decrypt_file(secret); @@ -208,19 +212,16 @@ bool Parser::parse_file(Dynamic_array *keys, const char *secret) case 1: // comment break; case -1: // error - my_free(buffer); + free(buffer); return 1; case 0: - if (keys->push(key)) - return 1; + (*keys)[key.id] = key; break; } } - keys->sort(sort_keys); - my_free(buffer); - - if (keys->elements() == 0 || keys->at(0).id != 1) + free(buffer); + if (keys->size() == 0 || (*keys)[1].id == 0) { report_error("System key id 1 is missing", 0); return 1; @@ -232,7 +233,7 @@ bool Parser::parse_file(Dynamic_array *keys, const char *secret) void Parser::report_error(const char *reason, uint position) { my_printf_error(EE_READ, "%s at %s line %u, column %u", - MYF(ME_NOREFRESH), reason, filename, line_number, position + 1); + ME_ERROR_LOG, reason, filename, line_number, position + 1); } /* @@ -247,16 +248,25 @@ int Parser::parse_line(char **line_ptr, keyentry *key) while (isspace(*p) && *p != '\n') p++; if (*p != '#' && *p != '\n') { - int error; - p+= 100; // the number will surely end here (on a non-digit or with an overflow) - longlong id= my_strtoll10(p - 100, &p, &error); - if (error) + if (!isdigit(*p)) { report_error("Syntax error", p - *line_ptr); return -1; } - if (id < 1 || id > UINT_MAX32) + longlong id = 0; + while (isdigit(*p)) + { + id = id * 10 + *p - '0'; + if (id > UINT_MAX32) + { + report_error("Invalid key id", p - *line_ptr); + return -1; + } + p++; + } + + if (id < 1) { report_error("Invalid key id", p - *line_ptr); return -1; @@ -269,7 +279,7 @@ int Parser::parse_line(char **line_ptr, keyentry *key) } p++; - key->id= id; + key->id= (unsigned int)id; key->length=0; while (isxdigit(p[0]) && isxdigit(p[1]) && key->length < sizeof(key->key)) { @@ -295,26 +305,35 @@ int Parser::parse_line(char **line_ptr, keyentry *key) 'secret'. Store the content of the decrypted file in 'buffer'. The buffer has to be freed in the calling function. */ +#ifdef _WIN32 +#define lseek _lseeki64 +#endif char* Parser::read_and_decrypt_file(const char *secret) { + int f; if (!filename || !filename[0]) { - my_printf_error(EE_CANT_OPEN_STREAM, - "file-key-management-filename is not set", - MYF(ME_NOREFRESH)); + my_printf_error(EE_CANT_OPEN_STREAM, "file-key-management-filename is not set", + ME_ERROR_LOG); goto err0; } - int f; - if ((f= my_open(filename, O_RDONLY, MYF(MY_WME))) < 0) + f= open(filename, O_RDONLY|O_BINARY, 0); + if (f < 0) + { + my_error(EE_FILENOTFOUND, ME_ERROR_LOG, filename, errno); goto err0; + } my_off_t file_size; - file_size= my_seek(f, 0, SEEK_END, MYF(MY_WME)); + file_size= lseek(f, 0, SEEK_END); - if (file_size == MY_FILEPOS_ERROR) + if (file_size == MY_FILEPOS_ERROR || (my_off_t)lseek(f, 0, SEEK_SET) == MY_FILEPOS_ERROR) + { + my_error(EE_CANT_SEEK, MYF(0), filename, errno); goto err1; + } if (file_size > MAX_KEY_FILE_SIZE) { @@ -324,57 +343,67 @@ char* Parser::read_and_decrypt_file(const char *secret) //Read file into buffer uchar *buffer; - buffer= (uchar*)my_malloc(file_size + 1, MYF(MY_WME)); + buffer= (uchar*)malloc((size_t)file_size + 1); if (!buffer) + { + my_error(EE_OUTOFMEMORY, ME_ERROR_LOG| ME_FATAL, file_size); goto err1; + } - if (my_pread(f, buffer, file_size, 0, MYF(MY_WME)) != file_size) + if (read(f, buffer, (int)file_size) != (int)file_size) + { + my_printf_error(EE_READ, + "read from %s failed, errno %d", + MYF(ME_ERROR_LOG|ME_FATAL), filename, errno); goto err2; + } // Check for file encryption uchar *decrypted; - if (file_size > OpenSSL_prefix_len && is_prefix((char*)buffer, OpenSSL_prefix)) + if (file_size > OpenSSL_prefix_len && strncmp((char*)buffer, OpenSSL_prefix, OpenSSL_prefix_len) == 0) { uchar key[OpenSSL_key_len]; uchar iv[OpenSSL_iv_len]; - decrypted= (uchar*)my_malloc(file_size, MYF(MY_WME)); + decrypted= (uchar*)malloc((size_t)file_size); if (!decrypted) + { + my_error(EE_OUTOFMEMORY, ME_ERROR_LOG | ME_FATAL, file_size); goto err2; - + } bytes_to_key(buffer + OpenSSL_prefix_len, secret, key, iv); uint32 d_size; if (my_aes_crypt(MY_AES_CBC, ENCRYPTION_FLAG_DECRYPT, buffer + OpenSSL_prefix_len + OpenSSL_salt_len, - file_size - OpenSSL_prefix_len - OpenSSL_salt_len, + (unsigned int)file_size - OpenSSL_prefix_len - OpenSSL_salt_len, decrypted, &d_size, key, OpenSSL_key_len, iv, OpenSSL_iv_len)) { - my_printf_error(EE_READ, "Cannot decrypt %s. Wrong key?", MYF(ME_NOREFRESH), filename); + my_printf_error(EE_READ, "Cannot decrypt %s. Wrong key?", ME_ERROR_LOG, filename); goto err3; } - my_free(buffer); + free(buffer); buffer= decrypted; file_size= d_size; } else if (*secret) { - my_printf_error(EE_READ, "Cannot decrypt %s. Not encrypted", MYF(ME_NOREFRESH), filename); + my_printf_error(EE_READ, "Cannot decrypt %s. Not encrypted", ME_ERROR_LOG, filename); goto err2; } buffer[file_size]= '\0'; - my_close(f, MYF(MY_WME)); + close(f); return (char*) buffer; err3: - my_free(decrypted); + free(decrypted); err2: - my_free(buffer); + free(buffer); err1: - my_close(f, MYF(MY_WME)); + close(f); err0: return NULL; } diff --git a/plugin/file_key_management/parser.h b/plugin/file_key_management/parser.h index c8349db70a0..627b7fd84a6 100644 --- a/plugin/file_key_management/parser.h +++ b/plugin/file_key_management/parser.h @@ -22,7 +22,7 @@ Created 09/15/2014 #include #include -#include +#include struct keyentry { unsigned int id; @@ -42,7 +42,7 @@ class Parser void bytes_to_key(const unsigned char *salt, const char *secret, unsigned char *key, unsigned char *iv); bool read_filekey(const char *filekey, char *secret); - bool parse_file(Dynamic_array *keys, const char *secret); + bool parse_file(std::map *keys, const char *secret); void report_error(const char *reason, unsigned int position); int parse_line(char **line_ptr, keyentry *key); char* read_and_decrypt_file(const char *secret); @@ -50,5 +50,5 @@ class Parser public: Parser(const char* fn, const char *fk) : filename(fn), filekey(fk), line_number(0) { } - bool parse(Dynamic_array *keys); + bool parse(std::map *keys); }; diff --git a/plugin/handler_socket/CMakeLists.txt b/plugin/handler_socket/CMakeLists.txt index 2e7caa80897..a10743210e9 100644 --- a/plugin/handler_socket/CMakeLists.txt +++ b/plugin/handler_socket/CMakeLists.txt @@ -34,6 +34,6 @@ SET(HANDLERSOCKET_SOURCES MYSQL_ADD_PLUGIN(handlersocket ${HANDLERSOCKET_SOURCES} MODULE_ONLY COMPONENT Server - LINK_LIBRARIES hsclient + LINK_LIBRARIES hsclient RECOMPILE_FOR_EMBEDDED ) diff --git a/plugin/locale_info/CMakeLists.txt b/plugin/locale_info/CMakeLists.txt index 1ace6619041..8f1dfa0d715 100644 --- a/plugin/locale_info/CMakeLists.txt +++ b/plugin/locale_info/CMakeLists.txt @@ -1,5 +1,5 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/sql ${CMAKE_SOURCE_DIR}/regex ${CMAKE_SOURCE_DIR}/extra/yassl/include) -MYSQL_ADD_PLUGIN(LOCALES locale_info.cc) +MYSQL_ADD_PLUGIN(LOCALES locale_info.cc RECOMPILE_FOR_EMBEDDED) diff --git a/plugin/metadata_lock_info/CMakeLists.txt b/plugin/metadata_lock_info/CMakeLists.txt index 44393c09eb6..6b1f5108bf1 100644 --- a/plugin/metadata_lock_info/CMakeLists.txt +++ b/plugin/metadata_lock_info/CMakeLists.txt @@ -1,2 +1,3 @@ SET(METADATA_LOCK_INFO_SOURCES metadata_lock_info.cc) -MYSQL_ADD_PLUGIN(metadata_lock_info ${METADATA_LOCK_INFO_SOURCES} MODULE_OUTPUT_NAME "metadata_lock_info") +MYSQL_ADD_PLUGIN(metadata_lock_info ${METADATA_LOCK_INFO_SOURCES} + RECOMPILE_FOR_EMBEDDED) diff --git a/plugin/metadata_lock_info/metadata_lock_info.cc b/plugin/metadata_lock_info/metadata_lock_info.cc index f2cdb99b82b..a2e3667dbab 100644 --- a/plugin/metadata_lock_info/metadata_lock_info.cc +++ b/plugin/metadata_lock_info/metadata_lock_info.cc @@ -45,12 +45,6 @@ static const LEX_STRING metadata_lock_info_lock_mode[] = { { C_STRING_WITH_LEN("MDL_EXCLUSIVE") }, }; -static const LEX_STRING metadata_lock_info_duration[] = { - { C_STRING_WITH_LEN("MDL_STATEMENT") }, - { C_STRING_WITH_LEN("MDL_TRANSACTION") }, - { C_STRING_WITH_LEN("MDL_EXPLICIT") }, -}; - static ST_FIELD_INFO i_s_metadata_lock_info_fields_info[] = { {"THREAD_ID", 20, MYSQL_TYPE_LONGLONG, 0, @@ -129,8 +123,6 @@ static int i_s_metadata_lock_info_init( == MDL_key::NAMESPACE_END); compile_time_assert(sizeof(metadata_lock_info_lock_mode)/sizeof(LEX_STRING) == MDL_TYPE_END); - compile_time_assert(sizeof(metadata_lock_info_duration)/sizeof(LEX_STRING) - == MDL_DURATION_END); ST_SCHEMA_TABLE *schema = (ST_SCHEMA_TABLE *) p; DBUG_ENTER("i_s_metadata_lock_info_init"); diff --git a/plugin/qc_info/CMakeLists.txt b/plugin/qc_info/CMakeLists.txt index d10f4547227..821ffb79225 100644 --- a/plugin/qc_info/CMakeLists.txt +++ b/plugin/qc_info/CMakeLists.txt @@ -2,4 +2,4 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/sql ${PCRE_INCLUDES} ${CMAKE_SOURCE_DIR}/extra/yassl/include) -MYSQL_ADD_PLUGIN(QUERY_CACHE_INFO qc_info.cc) +MYSQL_ADD_PLUGIN(QUERY_CACHE_INFO qc_info.cc RECOMPILE_FOR_EMBEDDED) diff --git a/plugin/query_response_time/CMakeLists.txt b/plugin/query_response_time/CMakeLists.txt index f008d0256fc..112d72e429a 100644 --- a/plugin/query_response_time/CMakeLists.txt +++ b/plugin/query_response_time/CMakeLists.txt @@ -1,2 +1,3 @@ ADD_DEFINITIONS(-DHAVE_RESPONSE_TIME_DISTRIBUTION) -MYSQL_ADD_PLUGIN(QUERY_RESPONSE_TIME query_response_time.cc plugin.cc) +MYSQL_ADD_PLUGIN(QUERY_RESPONSE_TIME query_response_time.cc plugin.cc + RECOMPILE_FOR_EMBEDDED) diff --git a/plugin/semisync/CMakeLists.txt b/plugin/semisync/CMakeLists.txt index 33c0895e5e1..88998fb3093 100644 --- a/plugin/semisync/CMakeLists.txt +++ b/plugin/semisync/CMakeLists.txt @@ -17,10 +17,12 @@ SET(SEMISYNC_MASTER_SOURCES semisync.cc semisync_master.cc semisync_master_plugin.cc semisync.h semisync_master.h) -MYSQL_ADD_PLUGIN(semisync_master ${SEMISYNC_MASTER_SOURCES}) +MYSQL_ADD_PLUGIN(semisync_master ${SEMISYNC_MASTER_SOURCES} + RECOMPILE_FOR_EMBEDDED) SET(SEMISYNC_SLAVE_SOURCES semisync.cc semisync_slave.cc semisync_slave_plugin.cc semisync.h semisync_slave.h ) -MYSQL_ADD_PLUGIN(semisync_slave ${SEMISYNC_SLAVE_SOURCES}) +MYSQL_ADD_PLUGIN(semisync_slave ${SEMISYNC_SLAVE_SOURCES} + RECOMPILE_FOR_EMBEDDED) diff --git a/plugin/semisync/semisync_master.cc b/plugin/semisync/semisync_master.cc index 7901853c3f8..ab437bcfa7e 100644 --- a/plugin/semisync/semisync_master.cc +++ b/plugin/semisync/semisync_master.cc @@ -555,7 +555,7 @@ int ReplSemiSyncMaster::reportReplyBinlog(uint32 server_id, if (need_copy_send_pos) { - strcpy(reply_file_name_, log_file_name); + strmake_buf(reply_file_name_, log_file_name); reply_file_pos_ = log_file_pos; reply_file_name_inited_ = true; @@ -663,7 +663,7 @@ int ReplSemiSyncMaster::commitTrx(const char* trx_wait_binlog_name, if (cmp <= 0) { /* This thd has a lower position, let's update the minimum info. */ - strcpy(wait_file_name_, trx_wait_binlog_name); + strmake_buf(wait_file_name_, trx_wait_binlog_name); wait_file_pos_ = trx_wait_binlog_pos; rpl_semi_sync_master_wait_pos_backtraverse++; @@ -674,7 +674,7 @@ int ReplSemiSyncMaster::commitTrx(const char* trx_wait_binlog_name, } else { - strcpy(wait_file_name_, trx_wait_binlog_name); + strmake_buf(wait_file_name_, trx_wait_binlog_name); wait_file_pos_ = trx_wait_binlog_pos; wait_file_name_inited_ = true; diff --git a/plugin/server_audit/CMakeLists.txt b/plugin/server_audit/CMakeLists.txt index 2c9964543bf..056a11f3753 100644 --- a/plugin/server_audit/CMakeLists.txt +++ b/plugin/server_audit/CMakeLists.txt @@ -13,7 +13,6 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA -SET(SERVER_AUDIT_SOURCES - server_audit.c test_audit_v4.c plugin_audit_v4.h) +SET(SOURCES server_audit.c test_audit_v4.c plugin_audit_v4.h) - MYSQL_ADD_PLUGIN(server_audit ${SERVER_AUDIT_SOURCES} MODULE_ONLY) +MYSQL_ADD_PLUGIN(server_audit ${SOURCES} MODULE_ONLY RECOMPILE_FOR_EMBEDDED) diff --git a/plugin/server_audit/server_audit.c b/plugin/server_audit/server_audit.c index c0ec9aa6b8d..65de695ac9e 100644 --- a/plugin/server_audit/server_audit.c +++ b/plugin/server_audit/server_audit.c @@ -1041,6 +1041,7 @@ static int start_logging() error_header(); fprintf(stderr, "logging started to the file %s.\n", alt_fname); strncpy(current_log_buf, alt_fname, sizeof(current_log_buf)); + current_log_buf[sizeof(current_log_buf)-1]= 0; } else if (output_type == OUTPUT_SYSLOG) { @@ -1144,7 +1145,7 @@ static void setup_connection_initdb(struct connection_info *cn, } else { - get_str_n(cn->user, &cn->user_length, sizeof(cn->db), + get_str_n(cn->user, &cn->user_length, sizeof(cn->user), uh_buffer, user_len); get_str_n(cn->host, &cn->host_length, sizeof(cn->host), uh_buffer+user_len+1, host_len); @@ -1195,7 +1196,7 @@ static void setup_connection_query(struct connection_info *cn, } else { - get_str_n(cn->user, &cn->user_length, sizeof(cn->db), + get_str_n(cn->user, &cn->user_length, sizeof(cn->user), uh_buffer, user_len); get_str_n(cn->host, &cn->host_length, sizeof(cn->host), uh_buffer+user_len+1, host_len); @@ -1955,7 +1956,7 @@ void auditing(MYSQL_THD thd, unsigned int event_class, const void *ev) /* That one is important as this function can be called with */ /* &lock_operations locked when the server logs an error reported */ /* by this plugin. */ - if (internal_stop_logging) + if (!thd || internal_stop_logging) return; flogger_mutex_lock(&lock_operations); @@ -2570,6 +2571,7 @@ static void update_file_path(MYSQL_THD thd, } strncpy(path_buffer, new_name, sizeof(path_buffer)); + path_buffer[sizeof(path_buffer)-1]= 0; file_path= path_buffer; exit_func: internal_stop_logging= 0; @@ -2622,6 +2624,7 @@ static void update_incl_users(MYSQL_THD thd, flogger_mutex_lock(&lock_operations); mark_always_logged(thd); strncpy(incl_user_buffer, new_users, sizeof(incl_user_buffer)); + incl_user_buffer[sizeof(incl_user_buffer)-1]= 0; incl_users= incl_user_buffer; user_coll_fill(&incl_user_coll, incl_users, &excl_user_coll, 1); error_header(); @@ -2640,6 +2643,7 @@ static void update_excl_users(MYSQL_THD thd __attribute__((unused)), flogger_mutex_lock(&lock_operations); mark_always_logged(thd); strncpy(excl_user_buffer, new_users, sizeof(excl_user_buffer)); + excl_user_buffer[sizeof(excl_user_buffer)-1]= 0; excl_users= excl_user_buffer; user_coll_fill(&excl_user_coll, excl_users, &incl_user_coll, 0); error_header(); @@ -2771,6 +2775,7 @@ static void update_syslog_ident(MYSQL_THD thd __attribute__((unused)), { char *new_ident= (*(char **) save) ? *(char **) save : empty_str; strncpy(syslog_ident_buffer, new_ident, sizeof(syslog_ident_buffer)); + syslog_ident_buffer[sizeof(syslog_ident_buffer)-1]= 0; syslog_ident= syslog_ident_buffer; error_header(); fprintf(stderr, "SYSYLOG ident was changed to '%s'\n", syslog_ident); diff --git a/plugin/wsrep_info/CMakeLists.txt b/plugin/wsrep_info/CMakeLists.txt index 4dee10c34c1..34aee9fba2c 100644 --- a/plugin/wsrep_info/CMakeLists.txt +++ b/plugin/wsrep_info/CMakeLists.txt @@ -1,5 +1,5 @@ IF (WITH_WSREP) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/sql ${CMAKE_SOURCE_DIR}/wsrep) - MYSQL_ADD_PLUGIN(WSREP_INFO plugin.cc MODULE_ONLY) + MYSQL_ADD_PLUGIN(WSREP_INFO plugin.cc MODULE_ONLY RECOMPILE_FOR_EMBEDDED) ENDIF() diff --git a/plugin/wsrep_info/mysql-test/wsrep_info/my.cnf b/plugin/wsrep_info/mysql-test/wsrep_info/my.cnf index 4af933f1633..70682178ca1 100644 --- a/plugin/wsrep_info/mysql-test/wsrep_info/my.cnf +++ b/plugin/wsrep_info/mysql-test/wsrep_info/my.cnf @@ -8,8 +8,6 @@ innodb-autoinc-lock-mode=2 innodb-locks-unsafe-for-binlog=1 wsrep-cluster-address=gcomm:// wsrep_provider=@ENV.WSREP_PROVIDER -# enforce read-committed characteristics across the cluster -wsrep_causal_reads=ON [mysqld.1] #galera_port=@OPT.port diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt index e7f20e78a63..6ee016a3ca9 100644 --- a/scripts/CMakeLists.txt +++ b/scripts/CMakeLists.txt @@ -1,4 +1,5 @@ -# Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2017, Oracle and/or its affiliates. +# Copyright (c) 2011, 2017, MariaDB Corporation # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -116,6 +117,13 @@ IF(CMAKE_GENERATOR MATCHES "Makefiles|Ninja") ENDFOREACH() ENDIF() + +IF(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") + SET (PERL_PATH "/usr/local/bin/perl") +ELSE() + SET (PERL_PATH "/usr/bin/perl") +ENDIF() + IF(UNIX) # FIND_PROC and CHECK_PID are used by mysqld_safe IF(CMAKE_SYSTEM_NAME MATCHES "Linux") @@ -255,13 +263,16 @@ ELSE() IF(WITH_WSREP) SET(WSREP_SCRIPTS wsrep_sst_mysqldump - wsrep_sst_common wsrep_sst_rsync wsrep_sst_xtrabackup wsrep_sst_xtrabackup-v2 + wsrep_sst_mariabackup + ) + # The following script is sourced from other SST scripts, so it should + # not be made executable. + SET(WSREP_SOURCE + wsrep_sst_common ) - INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/wsrep_sst_common - DESTINATION ${INSTALL_BINDIR} COMPONENT Server) ENDIF() IF (NOT WITHOUT_SERVER) SET(SERVER_SCRIPTS @@ -300,6 +311,9 @@ ELSE() MESSAGE(FATAL_ERROR "Can not find ${file}.sh or ${file} in " "${CMAKE_CURRENT_SOURCE_DIR}" ) ENDIF() + # TODO: The following EXECUTE could be redundant as INSTALL_SCRIPT + # macro does an INSTALL(PROGRAMS ..) that automatically sets +x on + # the executable. EXECUTE_PROCESS(COMMAND chmod +x ${CMAKE_CURRENT_BINARY_DIR}/${file}) IF(NOT ${file}_COMPONENT) SET(${file}_COMPONENT Server) @@ -310,6 +324,20 @@ ELSE() COMPONENT ${${file}_COMPONENT} ) ENDFOREACH() + + FOREACH(file ${WSREP_SOURCE}) + CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${file}.sh + ${CMAKE_CURRENT_BINARY_DIR}/${file} ESCAPE_QUOTES @ONLY) + IF(NOT ${file}_COMPONENT) + SET(${file}_COMPONENT Server) + ENDIF() + INSTALL(FILES + ${CMAKE_CURRENT_BINARY_DIR}/${file} + DESTINATION ${INSTALL_BINDIR} + COMPONENT ${${file}_COMPONENT} + ) + ENDFOREACH() + ENDIF() # Install libgcc as mylibgcc.a @@ -327,4 +355,3 @@ IF(CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_FLAGS MATCHES "-static") COMPONENT Development) ENDIF() ENDIF() - diff --git a/scripts/dheadgen.pl b/scripts/dheadgen.pl old mode 100755 new mode 100644 index c42bd49b32e..69ece2e7c81 --- a/scripts/dheadgen.pl +++ b/scripts/dheadgen.pl @@ -1,10 +1,4 @@ -#!/usr/bin/perl -w - -# -# Copyright (c) 2008, 2009 Sun Microsystems, Inc. -# Use is subject to license terms. -# - +# Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/scripts/galera_new_cluster.sh b/scripts/galera_new_cluster.sh index cf81bd0b95a..8bf2fa35cec 100755 --- a/scripts/galera_new_cluster.sh +++ b/scripts/galera_new_cluster.sh @@ -5,6 +5,22 @@ # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. +if [ "${1}" = "-h" ] || [ "${1}" = "--help" ]; then + cat < host; +# fix bad data when upgrading from unfixed InnoDB (MDEV-13360) +set @str="delete from innodb_index_stats where length(table_name) > 64"; +set @str=if(@have_innodb <> 0, @str, "set @dummy = 0"); +prepare stmt from @str; +execute stmt; +set @str=replace(@str, "innodb_index_stats", "innodb_table_stats"); +prepare stmt from @str; +execute stmt; + # update timestamp fields in the innodb stat tables set @str="alter table mysql.innodb_index_stats modify last_update timestamp not null default current_timestamp on update current_timestamp"; set @str=if(@have_innodb <> 0, @str, "set @dummy = 0"); diff --git a/scripts/mysqlaccess.sh b/scripts/mysqlaccess.sh index 59d1bded245..519a9b45c3c 100644 --- a/scripts/mysqlaccess.sh +++ b/scripts/mysqlaccess.sh @@ -1,6 +1,6 @@ -#!/usr/bin/perl +#!@PERL_PATH@ -# Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public @@ -477,15 +477,22 @@ MySQLaccess::Report::Print_Header(); # ***************************** # Read configuration-file MySQLaccess::Debug::Print(1, "Reading configuration file..."); - if (-f "./$script_conf") { - require "./$script_conf"; - } - elsif (-f "@prefix@/$script_conf") { - require "@prefix@/$script_conf"; - } - elsif (-f "@sysconfdir@/$script_conf") { + if (-f "@sysconfdir@/$script_conf") { + print "Configuration file '$script_conf' is found in '@sysconfdir@/'\n"; require "@sysconfdir@/$script_conf"; } + elsif (-f "@prefix@/$script_conf") { + print "Configuration file '$script_conf' is found in '@prefix@/'\n"; + require "@prefix@/$script_conf"; + } + elsif (-f "./$script_conf") { + print "\nERROR! Configuration file '$script_conf' is found in the current "; + print "directory.\nThe permissible locations for this file are either "; + print "@sysconfdir@/ or @prefix@/\n"; + print "Please move it to one of these locations and retry.\n\n"; + exit 0; + } + # **************************** # Read in all parameters diff --git a/scripts/mysqld_multi.sh b/scripts/mysqld_multi.sh index a0bc06e5e58..c6515a3986b 100644 --- a/scripts/mysqld_multi.sh +++ b/scripts/mysqld_multi.sh @@ -1,23 +1,7 @@ -#!/usr/bin/perl -# Copyright (c) 2000, 2010, Oracle and/or its affiliates. -# Copyright (c) 2000-2011 Monty Program Ab, Jani Tolonen -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Library General Public -# License as published by the Free Software Foundation; version 2 -# of the License. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Library General Public License for more details. -# -# You should have received a copy of the GNU Library General Public -# License along with this library; if not, write to the Free -# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, -# MA 02110-1301, USA +#!@PERL_PATH@ -# Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2000, 2017, Oracle and/or its affiliates. +# Copyright (c) 2010, 2017, MariaDB Corporation # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public diff --git a/scripts/mysqldumpslow.sh b/scripts/mysqldumpslow.sh index d8b6158ecbe..98241da3cba 100644 --- a/scripts/mysqldumpslow.sh +++ b/scripts/mysqldumpslow.sh @@ -1,7 +1,6 @@ -#!/usr/bin/perl +#!@PERL_PATH@ -# Copyright (c) 2000-2002, 2005-2008 MySQL AB, 2008, 2009 Sun Microsystems, Inc. -# Use is subject to license terms. +# Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public diff --git a/scripts/mysqlhotcopy.sh b/scripts/mysqlhotcopy.sh index b6ff7e1b28d..d6184d9ef10 100644 --- a/scripts/mysqlhotcopy.sh +++ b/scripts/mysqlhotcopy.sh @@ -1,6 +1,6 @@ -#!/usr/bin/perl +#!@PERL_PATH@ -# Copyright (c) 2000, 2010, Oracle and/or its affiliates +# Copyright (c) 2000, 2017, Oracle and/or its affiliates. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public diff --git a/scripts/wsrep_sst_common b/scripts/wsrep_sst_common.sh similarity index 69% rename from scripts/wsrep_sst_common rename to scripts/wsrep_sst_common.sh index 466bb46b382..7bfca799a77 100644 --- a/scripts/wsrep_sst_common +++ b/scripts/wsrep_sst_common.sh @@ -32,6 +32,22 @@ while [ $# -gt 0 ]; do case "$1" in '--address') readonly WSREP_SST_OPT_ADDR="$2" + # + # Break address string into host:port/path parts + # + if echo $WSREP_SST_OPT_ADDR | grep -qe '^\[.*\]' + then + # IPv6 notation + readonly WSREP_SST_OPT_HOST=${WSREP_SST_OPT_ADDR/\]*/\]} + readonly WSREP_SST_OPT_HOST_UNESCAPED=$(echo $WSREP_SST_OPT_HOST | \ + cut -d '[' -f 2 | cut -d ']' -f 1) + else + # "traditional" notation + readonly WSREP_SST_OPT_HOST=${WSREP_SST_OPT_ADDR%%[:/]*} + fi + readonly WSREP_SST_OPT_PORT=$(echo $WSREP_SST_OPT_ADDR | \ + cut -d ']' -f 2 | cut -s -d ':' -f 2 | cut -d '/' -f 1) + readonly WSREP_SST_OPT_PATH=${WSREP_SST_OPT_ADDR#*/} shift ;; '--bypass') @@ -180,6 +196,11 @@ wsrep_log_error() wsrep_log "[ERROR] $*" } +wsrep_log_warning() +{ + wsrep_log "[WARNING] $*" +} + wsrep_log_info() { wsrep_log "[INFO] $*" @@ -213,3 +234,39 @@ wsrep_check_programs() return $ret } + +# +# user can specify xtrabackup specific settings that will be used during sst +# process like encryption, etc..... +# parse such configuration option. (group for xb settings is [sst] in my.cnf +# +# 1st param: group : name of the config file section, e.g. mysqld +# 2nd param: var : name of the variable in the section, e.g. server-id +# 3rd param: - : default value for the param +parse_cnf() +{ + local group=$1 + local var=$2 + local reval="" + + # print the default settings for given group using my_print_default. + # normalize the variable names specified in cnf file (user can use _ or - for example log-bin or log_bin) + # then grep for needed variable + # finally get the variable value (if variables has been specified multiple time use the last value only) + + # look in group+suffix + if [[ -n $WSREP_SST_OPT_CONF_SUFFIX ]]; then + reval=$($MY_PRINT_DEFAULTS -c $WSREP_SST_OPT_CONF "${group}${WSREP_SST_OPT_CONF_SUFFIX}" | awk -F= '{if ($1 ~ /_/) { gsub(/_/,"-",$1); print $1"="$2 } else { print $0 }}' | grep -- "--$var=" | cut -d= -f2- | tail -1) + fi + + # look in group + if [[ -z $reval ]]; then + reval=$($MY_PRINT_DEFAULTS -c $WSREP_SST_OPT_CONF $group | awk -F= '{if ($1 ~ /_/) { gsub(/_/,"-",$1); print $1"="$2 } else { print $0 }}' | grep -- "--$var=" | cut -d= -f2- | tail -1) + fi + + # use default if we haven't found a value + if [[ -z $reval ]]; then + [[ -n $3 ]] && reval=$3 + fi + echo $reval +} diff --git a/scripts/wsrep_sst_mariabackup.sh b/scripts/wsrep_sst_mariabackup.sh new file mode 100644 index 00000000000..6f0218fcc88 --- /dev/null +++ b/scripts/wsrep_sst_mariabackup.sh @@ -0,0 +1,1040 @@ +#!/bin/bash -ue +# Copyright (C) 2013 Percona Inc +# Copyright (C) 2017 MariaDB +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING. If not, write to the +# Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston +# MA 02110-1301 USA. + +# Documentation: +# http://www.percona.com/doc/percona-xtradb-cluster/manual/xtrabackup_sst.html +# Make sure to read that before proceeding! + +. $(dirname $0)/wsrep_sst_common + +ealgo="" +ekey="" +ekeyfile="" +encrypt=0 +nproc=1 +ecode=0 +ssyslog="" +ssystag="" +XTRABACKUP_PID="" +SST_PORT="" +REMOTEIP="" +REMOTEHOST="" +tcert="" +tpem="" +tkey="" +sockopt="" +progress="" +ttime=0 +totime=0 +lsn="" +ecmd="" +rlimit="" +# Initially +stagemsg="${WSREP_SST_OPT_ROLE}" +cpat="" +speciald=1 +ib_home_dir="" +ib_log_dir="" +ib_undo_dir="" + +sfmt="tar" +strmcmd="" +tfmt="" +tcmd="" +rebuild=0 +rebuildcmd="" +payload=0 +pvformat="-F '%N => Rate:%r Avg:%a Elapsed:%t %e Bytes: %b %p' " +pvopts="-f -i 10 -N $WSREP_SST_OPT_ROLE " +STATDIR="" +uextra=0 +disver="" + +tmpopts="" +itmpdir="" +xtmpdir="" + +scomp="" +sdecomp="" + +# Required for backup locks +# For backup locks it is 1 sent by joiner +# 5.6.21 PXC and later can't donate to an older joiner +sst_ver=1 + +if which pv &>/dev/null && pv --help | grep -q FORMAT;then + pvopts+=$pvformat +fi +pcmd="pv $pvopts" +declare -a RC + +INNOBACKUPEX_BIN=mariabackup +XBSTREAM_BIN=mbstream +XBCRYPT_BIN=xbcrypt # Not available in MariaBackup + +DATA="${WSREP_SST_OPT_DATA}" +INFO_FILE="xtrabackup_galera_info" +IST_FILE="xtrabackup_ist" +MAGIC_FILE="${DATA}/${INFO_FILE}" + +# Setting the path for ss and ip +export PATH="/usr/sbin:/sbin:$PATH" + +timeit(){ + local stage=$1 + shift + local cmd="$@" + local x1 x2 took extcode + + if [[ $ttime -eq 1 ]];then + x1=$(date +%s) + wsrep_log_info "Evaluating $cmd" + eval "$cmd" + extcode=$? + x2=$(date +%s) + took=$(( x2-x1 )) + wsrep_log_info "NOTE: $stage took $took seconds" + totime=$(( totime+took )) + else + wsrep_log_info "Evaluating $cmd" + eval "$cmd" + extcode=$? + fi + return $extcode +} + +get_keys() +{ + # $encrypt -eq 1 is for internal purposes only + if [[ $encrypt -ge 2 || $encrypt -eq -1 ]];then + return + fi + + if [[ $encrypt -eq 0 ]];then + if $MY_PRINT_DEFAULTS xtrabackup | grep -q encrypt;then + wsrep_log_error "Unexpected option combination. SST may fail. Refer to http://www.percona.com/doc/percona-xtradb-cluster/manual/xtrabackup_sst.html " + fi + return + fi + + if [[ $sfmt == 'tar' ]];then + wsrep_log_info "NOTE: Xtrabackup-based encryption - encrypt=1 - cannot be enabled with tar format" + encrypt=-1 + return + fi + + wsrep_log_info "Xtrabackup based encryption enabled in my.cnf - Supported only from Xtrabackup 2.1.4" + + if [[ -z $ealgo ]];then + wsrep_log_error "FATAL: Encryption algorithm empty from my.cnf, bailing out" + exit 3 + fi + + if [[ -z $ekey && ! -r $ekeyfile ]];then + wsrep_log_error "FATAL: Either key or keyfile must be readable" + exit 3 + fi + + if [[ -z $ekey ]];then + ecmd="${XBCRYPT_BIN} --encrypt-algo=$ealgo --encrypt-key-file=$ekeyfile" + else + ecmd="${XBCRYPT_BIN} --encrypt-algo=$ealgo --encrypt-key=$ekey" + fi + + if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]];then + ecmd+=" -d" + fi + + stagemsg+="-XB-Encrypted" +} + +get_transfer() +{ + if [[ -z $SST_PORT ]];then + TSST_PORT=4444 + else + TSST_PORT=$SST_PORT + fi + + if [[ $tfmt == 'nc' ]];then + if [[ ! -x `which nc` ]];then + wsrep_log_error "nc(netcat) not found in path: $PATH" + exit 2 + fi + wsrep_log_info "Using netcat as streamer" + if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]];then + if nc -h 2>&1 | grep -q ncat;then + tcmd="nc -l ${TSST_PORT}" + else + tcmd="nc -dl ${TSST_PORT}" + fi + else + tcmd="nc ${REMOTEIP} ${TSST_PORT}" + fi + else + tfmt='socat' + wsrep_log_info "Using socat as streamer" + if [[ ! -x `which socat` ]];then + wsrep_log_error "socat not found in path: $PATH" + exit 2 + fi + + if [[ $encrypt -eq 2 || $encrypt -eq 3 ]] && ! socat -V | grep -q "WITH_OPENSSL 1";then + wsrep_log_error "Encryption requested, but socat is not OpenSSL enabled (encrypt=$encrypt)" + exit 2 + fi + + if [[ $encrypt -eq 2 ]];then + wsrep_log_info "Using openssl based encryption with socat: with crt and pem" + if [[ -z $tpem || -z $tcert ]];then + wsrep_log_error "Both PEM and CRT files required" + exit 22 + fi + stagemsg+="-OpenSSL-Encrypted-2" + if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]];then + wsrep_log_info "Decrypting with cert=${tpem}, cafile=${tcert}" + tcmd="socat -u openssl-listen:${TSST_PORT},reuseaddr,cert=${tpem},cafile=${tcert}${sockopt} stdio" + else + wsrep_log_info "Encrypting with cert=${tpem}, cafile=${tcert}" + tcmd="socat -u stdio openssl-connect:${REMOTEHOST}:${TSST_PORT},cert=${tpem},cafile=${tcert}${sockopt}" + fi + elif [[ $encrypt -eq 3 ]];then + wsrep_log_info "Using openssl based encryption with socat: with key and crt" + if [[ -z $tpem || -z $tkey ]];then + wsrep_log_error "Both certificate and key files required" + exit 22 + fi + stagemsg+="-OpenSSL-Encrypted-3" + if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]];then + if [[ -z $tcert ]];then + wsrep_log_info "Decrypting with cert=${tpem}, key=${tkey}, verify=0" + tcmd="socat -u openssl-listen:${TSST_PORT},reuseaddr,cert=${tpem},key=${tkey},verify=0${sockopt} stdio" + else + wsrep_log_info "Decrypting with cert=${tpem}, key=${tkey}, cafile=${tcert}" + tcmd="socat -u openssl-listen:${TSST_PORT},reuseaddr,cert=${tpem},key=${tkey},cafile=${tcert}${sockopt} stdio" + fi + else + if [[ -z $tcert ]];then + wsrep_log_info "Encrypting with cert=${tpem}, key=${tkey}, verify=0" + tcmd="socat -u stdio openssl-connect:${REMOTEIP}:${TSST_PORT},cert=${tpem},key=${tkey},verify=0${sockopt}" + else + wsrep_log_info "Encrypting with cert=${tpem}, key=${tkey}, cafile=${tcert}" + tcmd="socat -u stdio openssl-connect:${REMOTEHOST}:${TSST_PORT},cert=${tpem},key=${tkey},cafile=${tcert}${sockopt}" + fi + fi + + else + if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]];then + tcmd="socat -u TCP-LISTEN:${TSST_PORT},reuseaddr${sockopt} stdio" + else + tcmd="socat -u stdio TCP:${REMOTEIP}:${TSST_PORT}${sockopt}" + fi + fi + fi + +} + +parse_cnf() +{ + local group=$1 + local var=$2 + # print the default settings for given group using my_print_default. + # normalize the variable names specified in cnf file (user can use _ or - for example log-bin or log_bin) + # then grep for needed variable + # finally get the variable value (if variables has been specified multiple time use the last value only) + reval=$($MY_PRINT_DEFAULTS $group | awk -F= '{if ($1 ~ /_/) { gsub(/_/,"-",$1); print $1"="$2 } else { print $0 }}' | grep -- "--$var=" | cut -d= -f2- | tail -1) + if [[ -z $reval ]];then + [[ -n $3 ]] && reval=$3 + fi + echo $reval +} + +get_footprint() +{ + pushd $WSREP_SST_OPT_DATA 1>/dev/null + payload=$(find . -regex '.*\.ibd$\|.*\.MYI$\|.*\.MYD$\|.*ibdata1$' -type f -print0 | du --files0-from=- --block-size=1 -c | awk 'END { print $1 }') + if $MY_PRINT_DEFAULTS xtrabackup | grep -q -- "--compress";then + # QuickLZ has around 50% compression ratio + # When compression/compaction used, the progress is only an approximate. + payload=$(( payload*1/2 )) + fi + popd 1>/dev/null + pcmd+=" -s $payload" + adjust_progress +} + +adjust_progress() +{ + + if [[ ! -x `which pv` ]];then + wsrep_log_error "pv not found in path: $PATH" + wsrep_log_error "Disabling all progress/rate-limiting" + pcmd="" + rlimit="" + progress="" + return + fi + + if [[ -n $progress && $progress != '1' ]];then + if [[ -e $progress ]];then + pcmd+=" 2>>$progress" + else + pcmd+=" 2>$progress" + fi + elif [[ -z $progress && -n $rlimit ]];then + # When rlimit is non-zero + pcmd="pv -q" + fi + + if [[ -n $rlimit && "$WSREP_SST_OPT_ROLE" == "donor" ]];then + wsrep_log_info "Rate-limiting SST to $rlimit" + pcmd+=" -L \$rlimit" + fi +} + +read_cnf() +{ + sfmt=$(parse_cnf sst streamfmt "xbstream") + tfmt=$(parse_cnf sst transferfmt "socat") + tcert=$(parse_cnf sst tca "") + tpem=$(parse_cnf sst tcert "") + tkey=$(parse_cnf sst tkey "") + encrypt=$(parse_cnf sst encrypt 0) + sockopt=$(parse_cnf sst sockopt "") + progress=$(parse_cnf sst progress "") + rebuild=$(parse_cnf sst rebuild 0) + ttime=$(parse_cnf sst time 0) + cpat=$(parse_cnf sst cpat '.*galera\.cache$\|.*sst_in_progress$\|.*\.sst$\|.*gvwstate\.dat$\|.*grastate\.dat$\|.*\.err$\|.*\.log$\|.*RPM_UPGRADE_MARKER$\|.*RPM_UPGRADE_HISTORY$') + ealgo=$(parse_cnf xtrabackup encrypt "") + ekey=$(parse_cnf xtrabackup encrypt-key "") + ekeyfile=$(parse_cnf xtrabackup encrypt-key-file "") + scomp=$(parse_cnf sst compressor "") + sdecomp=$(parse_cnf sst decompressor "") + + # Refer to http://www.percona.com/doc/percona-xtradb-cluster/manual/xtrabackup_sst.html + if [[ -z $ealgo ]];then + ealgo=$(parse_cnf sst encrypt-algo "") + ekey=$(parse_cnf sst encrypt-key "") + ekeyfile=$(parse_cnf sst encrypt-key-file "") + fi + + rlimit=$(parse_cnf sst rlimit "") + uextra=$(parse_cnf sst use-extra 0) + speciald=$(parse_cnf sst sst-special-dirs 1) + iopts=$(parse_cnf sst inno-backup-opts "") + iapts=$(parse_cnf sst inno-apply-opts "") + impts=$(parse_cnf sst inno-move-opts "") + stimeout=$(parse_cnf sst sst-initial-timeout 100) + ssyslog=$(parse_cnf sst sst-syslog 0) + ssystag=$(parse_cnf mysqld_safe syslog-tag "${SST_SYSLOG_TAG:-}") + ssystag+="-" + + if [[ $speciald -eq 0 ]];then + wsrep_log_error "sst-special-dirs equal to 0 is not supported, falling back to 1" + speciald=1 + fi + + if [[ $ssyslog -ne -1 ]];then + if $MY_PRINT_DEFAULTS mysqld_safe | tr '_' '-' | grep -q -- "--syslog";then + ssyslog=1 + fi + fi + + if [[ $encrypt -eq 1 ]]; then + wsrep_log_error "Xtrabackup-based encryption is currently not" \ + "supported with MariaBackup" + exit 2 + fi +} + +get_stream() +{ + if [[ $sfmt == 'xbstream' ]];then + wsrep_log_info "Streaming with xbstream" + if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]];then + strmcmd="${XBSTREAM_BIN} -x" + else + strmcmd="${XBSTREAM_BIN} -c \${INFO_FILE}" + fi + else + sfmt="tar" + wsrep_log_info "Streaming with tar" + if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]];then + strmcmd="tar xfi - " + else + strmcmd="tar cf - \${INFO_FILE} " + fi + + fi +} + +get_proc() +{ + set +e + nproc=$(grep -c processor /proc/cpuinfo) + [[ -z $nproc || $nproc -eq 0 ]] && nproc=1 + set -e +} + +sig_joiner_cleanup() +{ + wsrep_log_error "Removing $MAGIC_FILE file due to signal" + rm -f "$MAGIC_FILE" +} + +cleanup_joiner() +{ + # Since this is invoked just after exit NNN + local estatus=$? + if [[ $estatus -ne 0 ]];then + wsrep_log_error "Cleanup after exit with status:$estatus" + elif [ "${WSREP_SST_OPT_ROLE}" = "joiner" ];then + wsrep_log_info "Removing the sst_in_progress file" + wsrep_cleanup_progress_file + fi + if [[ -n $progress && -p $progress ]];then + wsrep_log_info "Cleaning up fifo file $progress" + rm $progress + fi + if [[ -n ${STATDIR:-} ]];then + [[ -d $STATDIR ]] && rm -rf $STATDIR + fi + + # Final cleanup + pgid=$(ps -o pgid= $$ | grep -o '[0-9]*') + + # This means no setsid done in mysqld. + # We don't want to kill mysqld here otherwise. + if [[ $$ -eq $pgid ]];then + + # This means a signal was delivered to the process. + # So, more cleanup. + if [[ $estatus -ge 128 ]];then + kill -KILL -$$ || true + fi + + fi + + exit $estatus +} + +check_pid() +{ + local pid_file="$1" + [ -r "$pid_file" ] && ps -p $(cat "$pid_file") >/dev/null 2>&1 +} + +cleanup_donor() +{ + # Since this is invoked just after exit NNN + local estatus=$? + if [[ $estatus -ne 0 ]];then + wsrep_log_error "Cleanup after exit with status:$estatus" + fi + + if [[ -n ${XTRABACKUP_PID:-} ]];then + if check_pid $XTRABACKUP_PID + then + wsrep_log_error "xtrabackup process is still running. Killing... " + kill_xtrabackup + fi + + fi + rm -f ${DATA}/${IST_FILE} || true + + if [[ -n $progress && -p $progress ]];then + wsrep_log_info "Cleaning up fifo file $progress" + rm -f $progress || true + fi + + wsrep_log_info "Cleaning up temporary directories" + + if [[ -n $xtmpdir ]];then + [[ -d $xtmpdir ]] && rm -rf $xtmpdir || true + fi + + if [[ -n $itmpdir ]];then + [[ -d $itmpdir ]] && rm -rf $itmpdir || true + fi + + # Final cleanup + pgid=$(ps -o pgid= $$ | grep -o '[0-9]*') + + # This means no setsid done in mysqld. + # We don't want to kill mysqld here otherwise. + if [[ $$ -eq $pgid ]];then + + # This means a signal was delivered to the process. + # So, more cleanup. + if [[ $estatus -ge 128 ]];then + kill -KILL -$$ || true + fi + + fi + + exit $estatus + +} + +kill_xtrabackup() +{ + local PID=$(cat $XTRABACKUP_PID) + [ -n "$PID" -a "0" != "$PID" ] && kill $PID && (kill $PID && kill -9 $PID) || : + wsrep_log_info "Removing xtrabackup pid file $XTRABACKUP_PID" + rm -f "$XTRABACKUP_PID" || true +} + +setup_ports() +{ + if [[ "$WSREP_SST_OPT_ROLE" == "donor" ]];then + SST_PORT=$(echo $WSREP_SST_OPT_ADDR | awk -F '[:/]' '{ print $2 }') + REMOTEIP=$(echo $WSREP_SST_OPT_ADDR | awk -F ':' '{ print $1 }') + REMOTEHOST=$(getent hosts $REMOTEIP | awk '{ print $2 }') + if [[ -z $REMOTEHOST ]];then + REMOTEHOST=$REMOTEIP + fi + lsn=$(echo $WSREP_SST_OPT_ADDR | awk -F '[:/]' '{ print $4 }') + sst_ver=$(echo $WSREP_SST_OPT_ADDR | awk -F '[:/]' '{ print $5 }') + else + SST_PORT=$(echo ${WSREP_SST_OPT_ADDR} | awk -F ':' '{ print $2 }') + fi +} + +# waits ~10 seconds for nc to open the port and then reports ready +# (regardless of timeout) +wait_for_listen() +{ + local PORT=$1 + local ADDR=$2 + local MODULE=$3 + for i in {1..50} + do + ss -p state listening "( sport = :$PORT )" | grep -qE 'socat|nc' && break + sleep 0.2 + done + echo "ready ${ADDR}/${MODULE}//$sst_ver" +} + +check_extra() +{ + local use_socket=1 + if [[ $uextra -eq 1 ]];then + if $MY_PRINT_DEFAULTS --mysqld | tr '_' '-' | grep -- "--thread-handling=" | grep -q 'pool-of-threads';then + local eport=$($MY_PRINT_DEFAULTS --mysqld | tr '_' '-' | grep -- "--extra-port=" | cut -d= -f2) + if [[ -n $eport ]];then + # Xtrabackup works only locally. + # Hence, setting host to 127.0.0.1 unconditionally. + wsrep_log_info "SST through extra_port $eport" + INNOEXTRA+=" --host=127.0.0.1 --port=$eport " + use_socket=0 + else + wsrep_log_error "Extra port $eport null, failing" + exit 1 + fi + else + wsrep_log_info "Thread pool not set, ignore the option use_extra" + fi + fi + if [[ $use_socket -eq 1 ]] && [[ -n "${WSREP_SST_OPT_SOCKET}" ]];then + INNOEXTRA+=" --socket=${WSREP_SST_OPT_SOCKET}" + fi +} + +recv_joiner() +{ + local dir=$1 + local msg=$2 + local tmt=$3 + local checkf=$4 + local ltcmd + + if [[ ! -d ${dir} ]];then + # This indicates that IST is in progress + return + fi + + pushd ${dir} 1>/dev/null + set +e + + if [[ $tmt -gt 0 && -x `which timeout` ]];then + if timeout --help | grep -q -- '-k';then + ltcmd="timeout -k $(( tmt+10 )) $tmt $tcmd" + else + ltcmd="timeout -s9 $tmt $tcmd" + fi + timeit "$msg" "$ltcmd | $strmcmd; RC=( "\${PIPESTATUS[@]}" )" + else + timeit "$msg" "$tcmd | $strmcmd; RC=( "\${PIPESTATUS[@]}" )" + fi + + set -e + popd 1>/dev/null + + if [[ ${RC[0]} -eq 124 ]];then + wsrep_log_error "Possible timeout in receving first data from donor in gtid stage" + exit 32 + fi + + for ecode in "${RC[@]}";do + if [[ $ecode -ne 0 ]];then + wsrep_log_error "Error while getting data from donor node: " \ + "exit codes: ${RC[@]}" + exit 32 + fi + done + + if [[ $checkf -eq 1 && ! -r "${MAGIC_FILE}" ]];then + # this message should cause joiner to abort + wsrep_log_error "xtrabackup process ended without creating '${MAGIC_FILE}'" + wsrep_log_info "Contents of datadir" + wsrep_log_info "$(ls -l ${dir}/*)" + exit 32 + fi +} + + +send_donor() +{ + local dir=$1 + local msg=$2 + + pushd ${dir} 1>/dev/null + set +e + timeit "$msg" "$strmcmd | $tcmd; RC=( "\${PIPESTATUS[@]}" )" + set -e + popd 1>/dev/null + + + for ecode in "${RC[@]}";do + if [[ $ecode -ne 0 ]];then + wsrep_log_error "Error while getting data from donor node: " \ + "exit codes: ${RC[@]}" + exit 32 + fi + done + +} + +if [[ ! -x `which $INNOBACKUPEX_BIN` ]];then + wsrep_log_error "${INNOBACKUPEX_BIN} not in path: $PATH" + exit 2 +fi + +rm -f "${MAGIC_FILE}" + +if [[ ! ${WSREP_SST_OPT_ROLE} == 'joiner' && ! ${WSREP_SST_OPT_ROLE} == 'donor' ]];then + wsrep_log_error "Invalid role ${WSREP_SST_OPT_ROLE}" + exit 22 +fi + +read_cnf +setup_ports + +if ${INNOBACKUPEX_BIN} /tmp --help 2>/dev/null | grep -q -- '--version-check'; then + disver="--no-version-check" +fi + +if [[ ${FORCE_FTWRL:-0} -eq 1 ]];then + wsrep_log_info "Forcing FTWRL due to environment variable FORCE_FTWRL equal to $FORCE_FTWRL" + iopts+=" --no-backup-locks " +fi + + +INNOEXTRA="" + +if [[ $ssyslog -eq 1 ]];then + + if [[ ! -x `which logger` ]];then + wsrep_log_error "logger not in path: $PATH. Ignoring" + else + + wsrep_log_info "Logging all stderr of SST/Innobackupex to syslog" + + exec 2> >(logger -p daemon.err -t ${ssystag}wsrep-sst-$WSREP_SST_OPT_ROLE) + + wsrep_log_error() + { + logger -p daemon.err -t ${ssystag}wsrep-sst-$WSREP_SST_OPT_ROLE "$@" + } + + wsrep_log_info() + { + logger -p daemon.info -t ${ssystag}wsrep-sst-$WSREP_SST_OPT_ROLE "$@" + } + + INNOAPPLY="${INNOBACKUPEX_BIN} --innobackupex $disver $iapts --apply-log \$rebuildcmd \${DATA} 2>&1 | logger -p daemon.err -t ${ssystag}innobackupex-apply " + INNOMOVE="${INNOBACKUPEX_BIN} --innobackupex ${WSREP_SST_OPT_CONF} $disver $impts --move-back --force-non-empty-directories \${DATA} 2>&1 | logger -p daemon.err -t ${ssystag}innobackupex-move " + INNOBACKUP="${INNOBACKUPEX_BIN} --innobackupex ${WSREP_SST_OPT_CONF} $disver $iopts \$tmpopts \$INNOEXTRA --galera-info --stream=\$sfmt \$itmpdir 2> >(logger -p daemon.err -t ${ssystag}innobackupex-backup)" + fi + +else + INNOAPPLY="${INNOBACKUPEX_BIN} --innobackupex $disver $iapts --apply-log \$rebuildcmd \${DATA} &>\${DATA}/innobackup.prepare.log" + INNOMOVE="${INNOBACKUPEX_BIN} --innobackupex ${WSREP_SST_OPT_CONF} $disver $impts --move-back --force-non-empty-directories \${DATA} &>\${DATA}/innobackup.move.log" + INNOBACKUP="${INNOBACKUPEX_BIN} --innobackupex ${WSREP_SST_OPT_CONF} $disver $iopts \$tmpopts \$INNOEXTRA --galera-info --stream=\$sfmt \$itmpdir 2>\${DATA}/innobackup.backup.log" +fi + +get_stream +get_transfer + +if [ "$WSREP_SST_OPT_ROLE" = "donor" ] +then + trap cleanup_donor EXIT + + if [ $WSREP_SST_OPT_BYPASS -eq 0 ] + then + usrst=0 + if [[ -z $sst_ver ]];then + wsrep_log_error "Upgrade joiner to 5.6.21 or higher for backup locks support" + wsrep_log_error "The joiner is not supported for this version of donor" + exit 93 + fi + + if [[ -z $(parse_cnf mysqld tmpdir "") && -z $(parse_cnf xtrabackup tmpdir "") ]];then + xtmpdir=$(mktemp -d) + tmpopts=" --tmpdir=$xtmpdir " + wsrep_log_info "Using $xtmpdir as xtrabackup temporary directory" + fi + + itmpdir=$(mktemp -d) + wsrep_log_info "Using $itmpdir as innobackupex temporary directory" + + if [[ -n "${WSREP_SST_OPT_USER:-}" && "$WSREP_SST_OPT_USER" != "(null)" ]]; then + INNOEXTRA+=" --user=$WSREP_SST_OPT_USER" + usrst=1 + fi + + if [ -n "${WSREP_SST_OPT_PSWD:-}" ]; then + INNOEXTRA+=" --password=$WSREP_SST_OPT_PSWD" + elif [[ $usrst -eq 1 ]];then + # Empty password, used for testing, debugging etc. + INNOEXTRA+=" --password=" + fi + + get_keys + if [[ $encrypt -eq 1 ]];then + if [[ -n $ekey ]];then + INNOEXTRA+=" --encrypt=$ealgo --encrypt-key=$ekey " + else + INNOEXTRA+=" --encrypt=$ealgo --encrypt-key-file=$ekeyfile " + fi + fi + + + check_extra + + wsrep_log_info "Streaming GTID file before SST" + + # Store donor's wsrep GTID (state ID) and wsrep_gtid_domain_id + # (separated by a space). + echo "${WSREP_SST_OPT_GTID} ${WSREP_SST_OPT_GTID_DOMAIN_ID}" > "${MAGIC_FILE}" + + ttcmd="$tcmd" + + if [[ $encrypt -eq 1 ]];then + if [[ -n $scomp ]];then + tcmd=" $ecmd | $scomp | $tcmd " + else + tcmd=" $ecmd | $tcmd " + fi + elif [[ -n $scomp ]];then + tcmd=" $scomp | $tcmd " + fi + + + send_donor $DATA "${stagemsg}-gtid" + + tcmd="$ttcmd" + if [[ -n $progress ]];then + get_footprint + tcmd="$pcmd | $tcmd" + elif [[ -n $rlimit ]];then + adjust_progress + tcmd="$pcmd | $tcmd" + fi + + wsrep_log_info "Sleeping before data transfer for SST" + sleep 10 + + wsrep_log_info "Streaming the backup to joiner at ${REMOTEIP} ${SST_PORT:-4444}" + + if [[ -n $scomp ]];then + tcmd="$scomp | $tcmd" + fi + + set +e + timeit "${stagemsg}-SST" "$INNOBACKUP | $tcmd; RC=( "\${PIPESTATUS[@]}" )" + set -e + + if [ ${RC[0]} -ne 0 ]; then + wsrep_log_error "${INNOBACKUPEX_BIN} finished with error: ${RC[0]}. " \ + "Check ${DATA}/innobackup.backup.log" + exit 22 + elif [[ ${RC[$(( ${#RC[@]}-1 ))]} -eq 1 ]];then + wsrep_log_error "$tcmd finished with error: ${RC[1]}" + exit 22 + fi + + # innobackupex implicitly writes PID to fixed location in $xtmpdir + XTRABACKUP_PID="$xtmpdir/xtrabackup_pid" + + + else # BYPASS FOR IST + + wsrep_log_info "Bypassing the SST for IST" + echo "continue" # now server can resume updating data + + # Store donor's wsrep GTID (state ID) and wsrep_gtid_domain_id + # (separated by a space). + echo "${WSREP_SST_OPT_GTID} ${WSREP_SST_OPT_GTID_DOMAIN_ID}" > "${MAGIC_FILE}" + echo "1" > "${DATA}/${IST_FILE}" + get_keys + if [[ $encrypt -eq 1 ]];then + if [[ -n $scomp ]];then + tcmd=" $ecmd | $scomp | $tcmd " + else + tcmd=" $ecmd | $tcmd " + fi + elif [[ -n $scomp ]];then + tcmd=" $scomp | $tcmd " + fi + strmcmd+=" \${IST_FILE}" + + send_donor $DATA "${stagemsg}-IST" + + fi + + echo "done ${WSREP_SST_OPT_GTID}" + wsrep_log_info "Total time on donor: $totime seconds" + +elif [ "${WSREP_SST_OPT_ROLE}" = "joiner" ] +then + [[ -e $SST_PROGRESS_FILE ]] && wsrep_log_info "Stale sst_in_progress file: $SST_PROGRESS_FILE" + [[ -n $SST_PROGRESS_FILE ]] && touch $SST_PROGRESS_FILE + + ib_home_dir=$(parse_cnf mysqld innodb-data-home-dir "") + ib_log_dir=$(parse_cnf mysqld innodb-log-group-home-dir "") + ib_undo_dir=$(parse_cnf mysqld innodb-undo-directory "") + + stagemsg="Joiner-Recv" + + + sencrypted=1 + nthreads=1 + + MODULE="xtrabackup_sst" + + rm -f "${DATA}/${IST_FILE}" + + # May need xtrabackup_checkpoints later on + rm -f ${DATA}/xtrabackup_binary ${DATA}/xtrabackup_galera_info ${DATA}/ib_logfile0 + + ADDR=${WSREP_SST_OPT_ADDR} + if [ -z "${SST_PORT}" ] + then + SST_PORT=4444 + ADDR="$(echo ${WSREP_SST_OPT_ADDR} | awk -F ':' '{ print $1 }'):${SST_PORT}" + fi + + wait_for_listen ${SST_PORT} ${ADDR} ${MODULE} & + + trap sig_joiner_cleanup HUP PIPE INT TERM + trap cleanup_joiner EXIT + + if [[ -n $progress ]];then + adjust_progress + tcmd+=" | $pcmd" + fi + + get_keys + if [[ $encrypt -eq 1 && $sencrypted -eq 1 ]];then + if [[ -n $sdecomp ]];then + strmcmd=" $sdecomp | $ecmd | $strmcmd" + else + strmcmd=" $ecmd | $strmcmd" + fi + elif [[ -n $sdecomp ]];then + strmcmd=" $sdecomp | $strmcmd" + fi + + STATDIR=$(mktemp -d) + MAGIC_FILE="${STATDIR}/${INFO_FILE}" + recv_joiner $STATDIR "${stagemsg}-gtid" $stimeout 1 + + + if ! ps -p ${WSREP_SST_OPT_PARENT} &>/dev/null + then + wsrep_log_error "Parent mysqld process (PID:${WSREP_SST_OPT_PARENT}) terminated unexpectedly." + exit 32 + fi + + if [ ! -r "${STATDIR}/${IST_FILE}" ] + then + + if [[ -d ${DATA}/.sst ]];then + wsrep_log_info "WARNING: Stale temporary SST directory: ${DATA}/.sst from previous state transfer. Removing" + rm -rf ${DATA}/.sst + fi + mkdir -p ${DATA}/.sst + (recv_joiner $DATA/.sst "${stagemsg}-SST" 0 0) & + jpid=$! + wsrep_log_info "Proceeding with SST" + + + wsrep_log_info "Cleaning the existing datadir and innodb-data/log directories" + find $ib_home_dir $ib_log_dir $ib_undo_dir $DATA -mindepth 1 -regex $cpat -prune -o -exec rm -rfv {} 1>&2 \+ + + tempdir=$(parse_cnf mysqld log-bin "") + if [[ -n ${tempdir:-} ]];then + binlog_dir=$(dirname $tempdir) + binlog_file=$(basename $tempdir) + if [[ -n ${binlog_dir:-} && $binlog_dir != '.' && $binlog_dir != $DATA ]];then + pattern="$binlog_dir/$binlog_file\.[0-9]+$" + wsrep_log_info "Cleaning the binlog directory $binlog_dir as well" + find $binlog_dir -maxdepth 1 -type f -regex $pattern -exec rm -fv {} 1>&2 \+ || true + rm $binlog_dir/*.index || true + fi + fi + + + + TDATA=${DATA} + DATA="${DATA}/.sst" + + + MAGIC_FILE="${DATA}/${INFO_FILE}" + wsrep_log_info "Waiting for SST streaming to complete!" + wait $jpid + + get_proc + + if [[ ! -s ${DATA}/xtrabackup_checkpoints ]];then + wsrep_log_error "xtrabackup_checkpoints missing, failed innobackupex/SST on donor" + exit 2 + fi + + # Rebuild indexes for compact backups + if grep -q 'compact = 1' ${DATA}/xtrabackup_checkpoints;then + wsrep_log_info "Index compaction detected" + rebuild=1 + fi + + if [[ $rebuild -eq 1 ]];then + nthreads=$(parse_cnf xtrabackup rebuild-threads $nproc) + wsrep_log_info "Rebuilding during prepare with $nthreads threads" + rebuildcmd="--rebuild-indexes --rebuild-threads=$nthreads" + fi + + if test -n "$(find ${DATA} -maxdepth 1 -type f -name '*.qp' -print -quit)";then + + wsrep_log_info "Compressed qpress files found" + + if [[ ! -x `which qpress` ]];then + wsrep_log_error "qpress not found in path: $PATH" + exit 22 + fi + + if [[ -n $progress ]] && pv --help | grep -q 'line-mode';then + count=$(find ${DATA} -type f -name '*.qp' | wc -l) + count=$(( count*2 )) + if pv --help | grep -q FORMAT;then + pvopts="-f -s $count -l -N Decompression -F '%N => Rate:%r Elapsed:%t %e Progress: [%b/$count]'" + else + pvopts="-f -s $count -l -N Decompression" + fi + pcmd="pv $pvopts" + adjust_progress + dcmd="$pcmd | xargs -n 2 qpress -T${nproc}d" + else + dcmd="xargs -n 2 qpress -T${nproc}d" + fi + + + # Decompress the qpress files + wsrep_log_info "Decompression with $nproc threads" + timeit "Joiner-Decompression" "find ${DATA} -type f -name '*.qp' -printf '%p\n%h\n' | $dcmd" + extcode=$? + + if [[ $extcode -eq 0 ]];then + wsrep_log_info "Removing qpress files after decompression" + find ${DATA} -type f -name '*.qp' -delete + if [[ $? -ne 0 ]];then + wsrep_log_error "Something went wrong with deletion of qpress files. Investigate" + fi + else + wsrep_log_error "Decompression failed. Exit code: $extcode" + exit 22 + fi + fi + + + if [[ ! -z $WSREP_SST_OPT_BINLOG ]];then + + BINLOG_DIRNAME=$(dirname $WSREP_SST_OPT_BINLOG) + BINLOG_FILENAME=$(basename $WSREP_SST_OPT_BINLOG) + + # To avoid comparing data directory and BINLOG_DIRNAME + mv $DATA/${BINLOG_FILENAME}.* $BINLOG_DIRNAME/ 2>/dev/null || true + + pushd $BINLOG_DIRNAME &>/dev/null + for bfiles in $(ls -1 ${BINLOG_FILENAME}.[0-9]*);do + echo ${BINLOG_DIRNAME}/${bfiles} >> ${BINLOG_FILENAME}.index + done + popd &> /dev/null + + fi + + wsrep_log_info "Preparing the backup at ${DATA}" + timeit "Xtrabackup prepare stage" "$INNOAPPLY" + + if [ $? -ne 0 ]; + then + wsrep_log_error "${INNOBACKUPEX_BIN} apply finished with errors. Check ${DATA}/innobackup.prepare.log" + exit 22 + fi + + MAGIC_FILE="${TDATA}/${INFO_FILE}" + set +e + rm $TDATA/innobackup.prepare.log $TDATA/innobackup.move.log + set -e + wsrep_log_info "Moving the backup to ${TDATA}" + timeit "Xtrabackup move stage" "$INNOMOVE" + if [[ $? -eq 0 ]];then + wsrep_log_info "Move successful, removing ${DATA}" + rm -rf $DATA + DATA=${TDATA} + else + wsrep_log_error "Move failed, keeping ${DATA} for further diagnosis" + wsrep_log_error "Check ${DATA}/innobackup.move.log for details" + exit 22 + fi + + + else + wsrep_log_info "${IST_FILE} received from donor: Running IST" + fi + + if [[ ! -r ${MAGIC_FILE} ]];then + wsrep_log_error "SST magic file ${MAGIC_FILE} not found/readable" + exit 2 + fi + wsrep_log_info "Galera co-ords from recovery: $(cat ${MAGIC_FILE})" + cat "${MAGIC_FILE}" # Output : UUID:seqno wsrep_gtid_domain_id + wsrep_log_info "Total time on joiner: $totime seconds" +fi + +exit 0 diff --git a/scripts/wsrep_sst_mysqldump.sh b/scripts/wsrep_sst_mysqldump.sh index 5f25c2c9d13..f7f911ec1e8 100644 --- a/scripts/wsrep_sst_mysqldump.sh +++ b/scripts/wsrep_sst_mysqldump.sh @@ -30,6 +30,7 @@ local_ip() { [ "$1" = "127.0.0.1" ] && return 0 [ "$1" = "localhost" ] && return 0 + [ "$1" = "[::1]" ] && return 0 [ "$1" = "$(hostname -s)" ] && return 0 [ "$1" = "$(hostname -f)" ] && return 0 [ "$1" = "$(hostname -d)" ] && return 0 @@ -56,7 +57,7 @@ then fi # Check client version -if ! $MYSQL_CLIENT --version | grep 'Distrib 10.1' >/dev/null +if ! $MYSQL_CLIENT --version | grep 'Distrib 10.' >/dev/null then $MYSQL_CLIENT --version >&2 wsrep_log_error "this operation requires MySQL client version 10 or newer" @@ -116,8 +117,9 @@ GTID_BINLOG_STATE=$(echo "SHOW GLOBAL VARIABLES LIKE 'gtid_binlog_state'" |\ $MYSQL_CLIENT $AUTH -S$WSREP_SST_OPT_SOCKET --disable-reconnect --connect_timeout=10 |\ tail -1 | awk -F ' ' '{ print $2 }') -MYSQL="$MYSQL_CLIENT $AUTH -h$WSREP_SST_OPT_HOST -P$WSREP_SST_OPT_PORT "\ -"--disable-reconnect --connect_timeout=10" +MYSQL="$MYSQL_CLIENT --defaults-extra-file=$WSREP_SST_OPT_CONF "\ +"$AUTH -h${WSREP_SST_OPT_HOST_UNESCAPED:-$WSREP_SST_OPT_HOST} "\ +"-P$WSREP_SST_OPT_PORT --disable-reconnect --connect_timeout=10" # Check if binary logging is enabled on the joiner node. # Note: SELECT cannot be used at this point. @@ -133,7 +135,7 @@ SET_GTID_BINLOG_STATE="" SQL_LOG_BIN_OFF="" # Safety check -if echo $SERVER_VERSION | grep '^10.1' > /dev/null +if echo $SERVER_VERSION | grep '^10.' > /dev/null then # If binary logging is enabled on the joiner node, we need to copy donor's # gtid_binlog_state to joiner. In order to do that, a RESET MASTER must be diff --git a/scripts/wsrep_sst_rsync.sh b/scripts/wsrep_sst_rsync.sh index 9e3d9560807..24720ff3587 100644 --- a/scripts/wsrep_sst_rsync.sh +++ b/scripts/wsrep_sst_rsync.sh @@ -68,7 +68,7 @@ check_pid_and_port() local port_info="$(sockstat -46lp ${rsync_port} 2>/dev/null | \ grep ":${rsync_port}")" local is_rsync="$(echo $port_info | \ - grep -w '[[:space:]]\+rsync[[:space:]]\+'"$rsync_pid" 2>/dev/null)" + grep '[[:space:]]\+rsync[[:space:]]\+'"$rsync_pid" 2>/dev/null)" ;; *) if ! which lsof > /dev/null; then @@ -135,9 +135,19 @@ fi WSREP_LOG_DIR=${WSREP_LOG_DIR:-""} # if WSREP_LOG_DIR env. variable is not set, try to get it from my.cnf if [ -z "$WSREP_LOG_DIR" ]; then - WSREP_LOG_DIR=$($MY_PRINT_DEFAULTS --mysqld \ - | grep -- '--innodb[-_]log[-_]group[-_]home[-_]dir=' \ - | cut -b 29- ) + WSREP_LOG_DIR=$(parse_cnf mariadb-10.0 innodb_log_group_home_dir "") +fi +if [ -z "$WSREP_LOG_DIR" ]; then + WSREP_LOG_DIR=$(parse_cnf mysqld innodb_log_group_home_dir "") +fi +if [ -z "$WSREP_LOG_DIR" ]; then + WSREP_LOG_DIR=$(parse_cnf server innodb_log_group_home_dir "") +fi +if [ -z "$WSREP_LOG_DIR" ]; then + WSREP_LOG_DIR=$(parse_cnf mariadb innodb_log_group_home_dir "") +fi +if [ -z "$WSREP_LOG_DIR" ]; then + WSREP_LOG_DIR=$(parse_cnf mysqld-10.0 innodb_log_group_home_dir "") fi if [ -n "$WSREP_LOG_DIR" ]; then @@ -263,8 +273,8 @@ then [ "$OS" = "Linux" ] && count=$(grep -c processor /proc/cpuinfo) [ "$OS" = "Darwin" -o "$OS" = "FreeBSD" ] && count=$(sysctl -n hw.ncpu) - find . -maxdepth 1 -mindepth 1 -type d -not -name "lost+found" -print0 | \ - xargs -I{} -0 -P $count \ + find . -maxdepth 1 -mindepth 1 -type d -not -name "lost+found" \ + -print0 | xargs -I{} -0 -P $count \ rsync --owner --group --perms --links --specials \ --ignore-times --inplace --recursive --delete --quiet \ $WHOLE_FILE_OPT --exclude '*/ib_logfile*' "$WSREP_SST_OPT_DATA"/{}/ \ @@ -326,9 +336,9 @@ then RSYNC_CONF="$WSREP_SST_OPT_DATA/$MODULE.conf" if [ -n "${MYSQL_TMP_DIR:-}" ] ; then - SILENT="log file = $MYSQL_TMP_DIR/rsynd.log" + SILENT="log file = $MYSQL_TMP_DIR/rsyncd.log" else - SILENT="" + SILENT="" fi cat << EOF > "$RSYNC_CONF" @@ -345,24 +355,25 @@ EOF # rm -rf "$DATA"/ib_logfile* # we don't want old logs around + readonly RSYNC_PORT=${WSREP_SST_OPT_PORT:-4444} # If the IP is local listen only in it - if is_local_ip $RSYNC_ADDR + if is_local_ip "$RSYNC_ADDR" then - rsync --daemon --no-detach --address $RSYNC_ADDR --port $RSYNC_PORT --config "$RSYNC_CONF" & + rsync --daemon --no-detach --address "$RSYNC_ADDR" --port "$RSYNC_PORT" --config "$RSYNC_CONF" & else # Not local, possibly a NAT, listen in all interface - rsync --daemon --no-detach --port $RSYNC_PORT --config "$RSYNC_CONF" & + rsync --daemon --no-detach --port "$RSYNC_PORT" --config "$RSYNC_CONF" & # Overwrite address with all RSYNC_ADDR="*" fi RSYNC_REAL_PID=$! - until check_pid_and_port $RSYNC_PID $RSYNC_REAL_PID $RSYNC_ADDR $RSYNC_PORT + until check_pid_and_port "$RSYNC_PID" "$RSYNC_REAL_PID" "$RSYNC_ADDR" "$RSYNC_PORT" do sleep 0.2 done - echo "ready $ADDR/$MODULE" + echo "ready $WSREP_SST_OPT_HOST:$RSYNC_PORT/$MODULE" # wait for SST to complete by monitoring magic file while [ ! -r "$MAGIC_FILE" ] && check_pid "$RSYNC_PID" && \ diff --git a/scripts/wsrep_sst_xtrabackup-v2.sh b/scripts/wsrep_sst_xtrabackup-v2.sh index 565e62e4dbe..78a7d76da09 100644 --- a/scripts/wsrep_sst_xtrabackup-v2.sh +++ b/scripts/wsrep_sst_xtrabackup-v2.sh @@ -35,6 +35,7 @@ XTRABACKUP_PID="" SST_PORT="" REMOTEIP="" REMOTEHOST="" +tca="" tcert="" tpem="" tkey="" @@ -48,7 +49,6 @@ rlimit="" # Initially stagemsg="${WSREP_SST_OPT_ROLE}" cpat="" -speciald=1 ib_home_dir="" ib_log_dir="" ib_undo_dir="" @@ -72,6 +72,11 @@ xtmpdir="" scomp="" sdecomp="" +ssl_dhparams="" + +ssl_cert="" +ssl_ca="" +ssl_key="" # Required for backup locks # For backup locks it is 1 sent by joiner @@ -151,6 +156,10 @@ get_keys() if [[ -z $ekey ]];then ecmd="xbcrypt --encrypt-algo=$ealgo --encrypt-key-file=$ekeyfile" else + wsrep_log_warning "Using the 'encrypt-key' option causes the encryption key" + wsrep_log_warning "to be set via the command-line and is considered insecure." + wsrep_log_warning "It is recommended to use the 'encrypt-key-file' option instead." + ecmd="xbcrypt --encrypt-algo=$ealgo --encrypt-key=$ekey" fi @@ -161,6 +170,86 @@ get_keys() stagemsg+="-XB-Encrypted" } +# +# If the ssl_dhparams variable is already set, uses that as a source +# of dh parameters for OpenSSL. Otherwise, looks for dhparams.pem in the +# datadir, and creates it there if it can't find the file. +# No input parameters +# +check_for_dhparams() +{ + if [[ -z "$ssl_dhparams" ]]; then + if ! [[ -r "$DATA/dhparams.pem" ]]; then + wsrep_check_programs openssl + wsrep_log_info "Could not find dhparams file, creating $DATA/dhparams.pem" + + if ! openssl dhparam -out "$DATA/dhparams.pem" 2048 >/dev/null 2>&1 + then + wsrep_log_error "******** FATAL ERROR ********************************* " + wsrep_log_error "* Could not create the dhparams.pem file with OpenSSL. " + wsrep_log_error "****************************************************** " + exit 22 + fi + fi + ssl_dhparams="$DATA/dhparams.pem" + fi +} + +# +# verifies that the certificate matches the private key +# doing this will save us having to wait for a timeout that would +# otherwise occur. +# +# 1st param: path to the cert +# 2nd param: path to the private key +# +verify_cert_matches_key() +{ + local cert_path=$1 + local key_path=$2 + + wsrep_check_programs openssl diff + + # generate the public key from the cert and the key + # they should match (otherwise we can't create an SSL connection) + if ! diff <(openssl x509 -in "$cert_path" -pubkey -noout) <(openssl rsa -in "$key_path" -pubout 2>/dev/null) >/dev/null 2>&1 + then + wsrep_log_error "******** FATAL ERROR ************************* " + wsrep_log_error "* The certifcate and private key do not match. " + wsrep_log_error "* Please check your certificate and key files. " + wsrep_log_error "********************************************** " + exit 22 + fi +} + +# Checks to see if the file exists +# If the file does not exist (or cannot be read), issues an error +# and exits +# +# 1st param: file name to be checked (for read access) +# 2nd param: 1st error message (header) +# 3rd param: 2nd error message (footer, optional) +# +verify_file_exists() +{ + local file_path=$1 + local error_message1=$2 + local error_message2=$3 + + if ! [[ -r "$file_path" ]]; then + wsrep_log_error "******** FATAL ERROR ************************* " + wsrep_log_error "* $error_message1 " + wsrep_log_error "* Could not find/access : $file_path " + + if ! [[ -z "$error_message2" ]]; then + wsrep_log_error "* $error_message2 " + fi + + wsrep_log_error "********************************************** " + exit 22 + fi +} + get_transfer() { if [[ -z $SST_PORT ]];then @@ -174,15 +263,25 @@ get_transfer() wsrep_log_error "nc(netcat) not found in path: $PATH" exit 2 fi + + if [[ $encrypt -eq 2 || $encrypt -eq 3 || $encrypt -eq 4 ]]; then + wsrep_log_error "******** FATAL ERROR *********************** " + wsrep_log_error "* Using SSL encryption (encrypt= 2, 3, or 4) " + wsrep_log_error "* is not supported when using nc(netcat). " + wsrep_log_error "******************************************** " + exit 22 + fi + wsrep_log_info "Using netcat as streamer" if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]];then - if nc -h 2>&1 | grep -q ncat;then - tcmd="nc -l ${TSST_PORT}" + if nc -h 2>&1 | grep -q ncat; then + tcmd="nc $sockopt -l ${TSST_PORT}" else - tcmd="nc -dl ${TSST_PORT}" + tcmd="nc $sockopt -dl ${TSST_PORT}" fi else - tcmd="nc ${REMOTEIP} ${TSST_PORT}" + # netcat doesn't understand [] around IPv6 address + tcmd="nc ${REMOTEIP//[\[\]]/} ${TSST_PORT}" fi else tfmt='socat' @@ -192,74 +291,112 @@ get_transfer() exit 2 fi - if [[ $encrypt -eq 2 || $encrypt -eq 3 ]] && ! socat -V | grep -q "WITH_OPENSSL 1";then - wsrep_log_error "Encryption requested, but socat is not OpenSSL enabled (encrypt=$encrypt)" - exit 2 + donor_extra="" + joiner_extra="" + if [[ $encrypt -eq 2 || $encrypt -eq 3 || $encrypt -eq 4 ]]; then + if ! socat -V | grep -q WITH_OPENSSL; then + wsrep_log_error "******** FATAL ERROR ****************** " + wsrep_log_error "* socat is not openssl enabled. " + wsrep_log_error "* Unable to encrypt SST communications. " + wsrep_log_error "*************************************** " + exit 2 + fi + + # Determine the socat version + SOCAT_VERSION=`socat -V 2>&1 | grep -oe '[0-9]\.[0-9][\.0-9]*' | head -n1` + if [[ -z "$SOCAT_VERSION" ]]; then + wsrep_log_error "******** FATAL ERROR **************** " + wsrep_log_error "* Cannot determine the socat version. " + wsrep_log_error "************************************* " + exit 2 + fi + + # socat versions < 1.7.3 will have 512-bit dhparams (too small) + # so create 2048-bit dhparams and send that as a parameter + # socat version >= 1.7.3, checks to see if the peername matches the hostname + # set commonname="" to disable the peername checks + # + if ! check_for_version "$SOCAT_VERSION" "1.7.3"; then + if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]]; then + # dhparams check (will create ssl_dhparams if needed) + check_for_dhparams + joiner_extra=",dhparam=$ssl_dhparams" + fi + fi + if check_for_version "$SOCAT_VERSION" "1.7.3"; then + donor_extra=',commonname=""' + fi fi - if [[ $encrypt -eq 2 ]];then - wsrep_log_info "Using openssl based encryption with socat: with crt and pem" - if [[ -z $tpem || -z $tcert ]];then - wsrep_log_error "Both PEM and CRT files required" - exit 22 - fi + if [[ $encrypt -eq 2 ]]; then + wsrep_log_warning "**** WARNING **** encrypt=2 is deprecated and will be removed in a future release" + wsrep_log_info "Using openssl based encryption with socat: with crt and ca" + + verify_file_exists "$tcert" "Both certificate and CA files are required." \ + "Please check the 'tcert' option. " + verify_file_exists "$tca" "Both certificate and CA files are required." \ + "Please check the 'tca' option. " + stagemsg+="-OpenSSL-Encrypted-2" if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]];then - wsrep_log_info "Decrypting with cert=${tpem}, cafile=${tcert}" - tcmd="socat -u openssl-listen:${TSST_PORT},reuseaddr,cert=${tpem},cafile=${tcert}${sockopt} stdio" + wsrep_log_info "Decrypting with CERT: $tcert, CA: $tca" + tcmd="socat -u openssl-listen:${TSST_PORT},reuseaddr,cert=${tcert},cafile=${tca}${joiner_extra}${sockopt} stdio" else - wsrep_log_info "Encrypting with cert=${tpem}, cafile=${tcert}" - tcmd="socat -u stdio openssl-connect:${REMOTEHOST}:${TSST_PORT},cert=${tpem},cafile=${tcert}${sockopt}" + wsrep_log_info "Encrypting with CERT: $tcert, CA: $tca" + tcmd="socat -u stdio openssl-connect:${REMOTEIP}:${TSST_PORT},cert=${tcert},cafile=${tca}${donor_extra}${sockopt}" fi elif [[ $encrypt -eq 3 ]];then + wsrep_log_warning "**** WARNING **** encrypt=3 is deprecated and will be removed in a future release" wsrep_log_info "Using openssl based encryption with socat: with key and crt" - if [[ -z $tpem || -z $tkey ]];then - wsrep_log_error "Both certificate and key files required" - exit 22 - fi + + verify_file_exists "$tcert" "Both certificate and key files are required." \ + "Please check the 'tcert' option. " + verify_file_exists "$tkey" "Both certificate and key files are required." \ + "Please check the 'tkey' option. " + stagemsg+="-OpenSSL-Encrypted-3" if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]];then - if [[ -z $tcert ]];then - wsrep_log_info "Decrypting with cert=${tpem}, key=${tkey}, verify=0" + wsrep_log_info "Decrypting with CERT: $tcert, KEY: $tkey" + tcmd="socat -u openssl-listen:${TSST_PORT},reuseaddr,cert=${tcert},key=${tkey},verify=0${joiner_extra}${sockopt} stdio" tcmd="socat -u openssl-listen:${TSST_PORT},reuseaddr,cert=${tpem},key=${tkey},verify=0${sockopt} stdio" else - wsrep_log_info "Decrypting with cert=${tpem}, key=${tkey}, cafile=${tcert}" - tcmd="socat -u openssl-listen:${TSST_PORT},reuseaddr,cert=${tpem},key=${tkey},cafile=${tcert}${sockopt} stdio" - fi + wsrep_log_info "Encrypting with CERT: $tcert, KEY: $tkey" + tcmd="socat -u stdio openssl-connect:${REMOTEIP}:${TSST_PORT},cert=${tcert},key=${tkey},verify=0${sockopt}" + fi + elif [[ $encrypt -eq 4 ]]; then + wsrep_log_info "Using openssl based encryption with socat: with key, crt, and ca" + + verify_file_exists "$ssl_ca" "CA, certificate, and key files are required." \ + "Please check the 'ssl-ca' option. " + verify_file_exists "$ssl_cert" "CA, certificate, and key files are required." \ + "Please check the 'ssl-cert' option. " + verify_file_exists "$ssl_key" "CA, certificate, and key files are required." \ + "Please check the 'ssl-key' option. " + + # Check to see that the key matches the cert + verify_cert_matches_key $ssl_cert $ssl_key + + stagemsg+="-OpenSSL-Encrypted-4" + if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]]; then + wsrep_log_info "Decrypting with CERT: $ssl_cert, KEY: $ssl_key, CA: $ssl_ca" + tcmd="socat -u openssl-listen:${TSST_PORT},reuseaddr,cert=${ssl_cert},key=${ssl_key},cafile=${ssl_ca},verify=1${joiner_extra}${sockopt} stdio" else - if [[ -z $tcert ]];then - wsrep_log_info "Encrypting with cert=${tpem}, key=${tkey}, verify=0" - tcmd="socat -u stdio openssl-connect:${REMOTEIP}:${TSST_PORT},cert=${tpem},key=${tkey},verify=0${sockopt}" - else - wsrep_log_info "Encrypting with cert=${tpem}, key=${tkey}, cafile=${tcert}" - tcmd="socat -u stdio openssl-connect:${REMOTEHOST}:${TSST_PORT},cert=${tpem},key=${tkey},cafile=${tcert}${sockopt}" - fi + wsrep_log_info "Encrypting with CERT: $ssl_cert, KEY: $ssl_key, CA: $ssl_ca" + tcmd="socat -u stdio openssl-connect:${REMOTEIP}:${TSST_PORT},cert=${ssl_cert},key=${ssl_key},cafile=${ssl_ca},verify=1${donor_extra}${sockopt}" fi - else - if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]];then + else + if [[ $encrypt -eq 1 ]]; then + wsrep_log_warning "**** WARNING **** encrypt=1 is deprecated and will be removed in a future release" + fi + + if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]]; then tcmd="socat -u TCP-LISTEN:${TSST_PORT},reuseaddr${sockopt} stdio" else tcmd="socat -u stdio TCP:${REMOTEIP}:${TSST_PORT}${sockopt}" fi fi fi - -} - -parse_cnf() -{ - local group=$1 - local var=$2 - # print the default settings for given group using my_print_default. - # normalize the variable names specified in cnf file (user can use _ or - for example log-bin or log_bin) - # then grep for needed variable - # finally get the variable value (if variables has been specified multiple time use the last value only) - reval=$($MY_PRINT_DEFAULTS $group | awk -F= '{if ($1 ~ /_/) { gsub(/_/,"-",$1); print $1"="$2 } else { print $0 }}' | grep -- "--$var=" | cut -d= -f2- | tail -1) - if [[ -z $reval ]];then - [[ -n $3 ]] && reval=$3 - fi - echo $reval } get_footprint() @@ -309,15 +446,15 @@ read_cnf() { sfmt=$(parse_cnf sst streamfmt "xbstream") tfmt=$(parse_cnf sst transferfmt "socat") - tcert=$(parse_cnf sst tca "") - tpem=$(parse_cnf sst tcert "") + tca=$(parse_cnf sst tca "") + tcert=$(parse_cnf sst tcert "") tkey=$(parse_cnf sst tkey "") encrypt=$(parse_cnf sst encrypt 0) sockopt=$(parse_cnf sst sockopt "") progress=$(parse_cnf sst progress "") rebuild=$(parse_cnf sst rebuild 0) ttime=$(parse_cnf sst time 0) - cpat=$(parse_cnf sst cpat '.*galera\.cache$\|.*sst_in_progress$\|.*\.sst$\|.*gvwstate\.dat$\|.*grastate\.dat$\|.*\.err$\|.*\.log$\|.*RPM_UPGRADE_MARKER$\|.*RPM_UPGRADE_HISTORY$') + cpat=$(parse_cnf sst cpat '.*\.pem$\|.*init\.ok$\|.*galera\.cache$\|.*sst_in_progress$\|.*\.sst$\|.*gvwstate\.dat$\|.*grastate\.dat$\|.*\.err$\|.*\.log$\|.*RPM_UPGRADE_MARKER$\|.*RPM_UPGRADE_HISTORY$') ealgo=$(parse_cnf xtrabackup encrypt "") ekey=$(parse_cnf xtrabackup encrypt-key "") ekeyfile=$(parse_cnf xtrabackup encrypt-key-file "") @@ -331,9 +468,23 @@ read_cnf() ekey=$(parse_cnf sst encrypt-key "") ekeyfile=$(parse_cnf sst encrypt-key-file "") fi + + # Pull the parameters needed for encrypt=4 + ssl_ca=$(parse_cnf sst ssl-ca "") + if [[ -z "$ssl_ca" ]]; then + ssl_ca=$(parse_cnf mysqld ssl-ca "") + fi + ssl_cert=$(parse_cnf sst ssl-cert "") + if [[ -z "$ssl_cert" ]]; then + ssl_cert=$(parse_cnf mysqld ssl-cert "") + fi + ssl_key=$(parse_cnf sst ssl-key "") + if [[ -z "$ssl_key" ]]; then + ssl_key=$(parse_cnf mysqld ssl-key "") + fi + rlimit=$(parse_cnf sst rlimit "") uextra=$(parse_cnf sst use-extra 0) - speciald=$(parse_cnf sst sst-special-dirs 1) iopts=$(parse_cnf sst inno-backup-opts "") iapts=$(parse_cnf sst inno-apply-opts "") impts=$(parse_cnf sst inno-move-opts "") @@ -342,13 +493,8 @@ read_cnf() ssystag=$(parse_cnf mysqld_safe syslog-tag "${SST_SYSLOG_TAG:-}") ssystag+="-" - if [[ $speciald -eq 0 ]];then - wsrep_log_error "sst-special-dirs equal to 0 is not supported, falling back to 1" - speciald=1 - fi - if [[ $ssyslog -ne -1 ]];then - if $MY_PRINT_DEFAULTS mysqld_safe | tr '_' '-' | grep -q -- "--syslog";then + if $MY_PRINT_DEFAULTS -c $WSREP_SST_OPT_CONF mysqld_safe | tr '_' '-' | grep -q -- "--syslog";then ssyslog=1 fi fi @@ -494,32 +640,30 @@ kill_xtrabackup() setup_ports() { if [[ "$WSREP_SST_OPT_ROLE" == "donor" ]];then - SST_PORT=$(echo $WSREP_SST_OPT_ADDR | awk -F '[:/]' '{ print $2 }') - REMOTEIP=$(echo $WSREP_SST_OPT_ADDR | awk -F ':' '{ print $1 }') - REMOTEHOST=$(getent hosts $REMOTEIP | awk '{ print $2 }') - if [[ -z $REMOTEHOST ]];then - REMOTEHOST=$REMOTEIP - fi - lsn=$(echo $WSREP_SST_OPT_ADDR | awk -F '[:/]' '{ print $4 }') - sst_ver=$(echo $WSREP_SST_OPT_ADDR | awk -F '[:/]' '{ print $5 }') + SST_PORT=$WSREP_SST_OPT_PORT + REMOTEIP=$WSREP_SST_OPT_HOST + lsn=$(echo $WSREP_SST_OPT_PATH | awk -F '[/]' '{ print $2 }') + sst_ver=$(echo $WSREP_SST_OPT_PATH | awk -F '[/]' '{ print $3 }') else - SST_PORT=$(echo ${WSREP_SST_OPT_ADDR} | awk -F ':' '{ print $2 }') + SST_PORT=$WSREP_SST_OPT_PORT fi } -# waits ~10 seconds for nc to open the port and then reports ready +# waits ~1 minute for nc/socat to open the port and then reports ready # (regardless of timeout) wait_for_listen() { - local PORT=$1 - local ADDR=$2 + local HOST=$1 + local PORT=$2 local MODULE=$3 - for i in {1..50} + + for i in {1..300} do ss -p state listening "( sport = :$PORT )" | grep -qE 'socat|nc' && break sleep 0.2 done - echo "ready ${ADDR}/${MODULE}//$sst_ver" + + echo "ready ${HOST}:${PORT}/${MODULE}//$sst_ver" } check_extra() @@ -527,7 +671,7 @@ check_extra() local use_socket=1 if [[ $uextra -eq 1 ]];then if $MY_PRINT_DEFAULTS --mysqld | tr '_' '-' | grep -- "--thread-handling=" | grep -q 'pool-of-threads';then - local eport=$($MY_PRINT_DEFAULTS --mysqld | tr '_' '-' | grep -- "--extra-port=" | cut -d= -f2) + local eport=$($MY_PRINT_DEFAULTS -c $WSREP_SST_OPT_CONF mysqld | tr '_' '-' | grep -- "--extra-port=" | cut -d= -f2) if [[ -n $eport ]];then # Xtrabackup works only locally. # Hence, setting host to 127.0.0.1 unconditionally. @@ -622,11 +766,64 @@ send_donor() } +# Returns the version string in a standardized format +# Input "1.2.3" => echoes "010203" +# Wrongly formatted values => echoes "000000" +normalize_version() +{ + local major=0 + local minor=0 + local patch=0 + + # Only parses purely numeric version numbers, 1.2.3 + # Everything after the first three values are ignored + if [[ $1 =~ ^([0-9]+)\.([0-9]+)\.?([0-9]*)([\.0-9])*$ ]]; then + major=${BASH_REMATCH[1]} + minor=${BASH_REMATCH[2]} + patch=${BASH_REMATCH[3]} + fi + + printf %02d%02d%02d $major $minor $patch +} + +# Compares two version strings +# The first parameter is the version to be checked +# The second parameter is the minimum version required +# Returns 1 (failure) if $1 >= $2, 0 (success) otherwise +check_for_version() +{ + local local_version_str="$( normalize_version $1 )" + local required_version_str="$( normalize_version $2 )" + + if [[ "$local_version_str" < "$required_version_str" ]]; then + return 1 + else + return 0 + fi +} + + if [[ ! -x `which $INNOBACKUPEX_BIN` ]];then wsrep_log_error "innobackupex not in path: $PATH" exit 2 fi +# check the version, we require XB-2.4 to ensure that we can pass the +# datadir via the command-line option +XB_REQUIRED_VERSION="2.3.5" + +XB_VERSION=`$INNOBACKUPEX_BIN --version 2>&1 | grep -oe '[0-9]\.[0-9][\.0-9]*' | head -n1` +if [[ -z $XB_VERSION ]]; then + wsrep_log_error "FATAL: Cannot determine the $INNOBACKUPEX_BIN version. Needs xtrabackup-$XB_REQUIRED_VERSION or higher to perform SST" + exit 2 +fi + +if ! check_for_version $XB_VERSION $XB_REQUIRED_VERSION; then + wsrep_log_error "FATAL: The $INNOBACKUPEX_BIN version is $XB_VERSION. Needs xtrabackup-$XB_REQUIRED_VERSION or higher to perform SST" + exit 2 +fi + + rm -f "${MAGIC_FILE}" if [[ ! ${WSREP_SST_OPT_ROLE} == 'joiner' && ! ${WSREP_SST_OPT_ROLE} == 'donor' ]];then @@ -670,13 +867,13 @@ if [[ $ssyslog -eq 1 ]];then } INNOAPPLY="${INNOBACKUPEX_BIN} $disver $iapts --apply-log \$rebuildcmd \${DATA} 2>&1 | logger -p daemon.err -t ${ssystag}innobackupex-apply " - INNOMOVE="${INNOBACKUPEX_BIN} ${WSREP_SST_OPT_CONF} $disver $impts --move-back --force-non-empty-directories \${DATA} 2>&1 | logger -p daemon.err -t ${ssystag}innobackupex-move " + INNOMOVE="${INNOBACKUPEX_BIN} --defaults-file=${WSREP_SST_OPT_CONF} $disver $impts --datadir=${DATA} --move-back --force-non-empty-directories \${DATA} 2>&1 | logger -p daemon.err -t ${ssystag}innobackupex-move " INNOBACKUP="${INNOBACKUPEX_BIN} ${WSREP_SST_OPT_CONF} $disver $iopts \$tmpopts \$INNOEXTRA --galera-info --stream=\$sfmt \$itmpdir 2> >(logger -p daemon.err -t ${ssystag}innobackupex-backup)" fi else INNOAPPLY="${INNOBACKUPEX_BIN} $disver $iapts --apply-log \$rebuildcmd \${DATA} &>\${DATA}/innobackup.prepare.log" - INNOMOVE="${INNOBACKUPEX_BIN} ${WSREP_SST_OPT_CONF} $disver $impts --move-back --force-non-empty-directories \${DATA} &>\${DATA}/innobackup.move.log" + INNOMOVE="${INNOBACKUPEX_BIN} --defaults-file=${WSREP_SST_OPT_CONF} --defaults-group=mysqld${WSREP_SST_OPT_CONF_SUFFIX} $disver $impts --datadir=${DATA} --move-back --force-non-empty-directories \${DATA} &>\${DATA}/innobackup.move.log" INNOBACKUP="${INNOBACKUPEX_BIN} ${WSREP_SST_OPT_CONF} $disver $iopts \$tmpopts \$INNOEXTRA --galera-info --stream=\$sfmt \$itmpdir 2>\${DATA}/innobackup.backup.log" fi @@ -718,15 +915,6 @@ then fi get_keys - if [[ $encrypt -eq 1 ]];then - if [[ -n $ekey ]];then - INNOEXTRA+=" --encrypt=$ealgo --encrypt-key=$ekey " - else - INNOEXTRA+=" --encrypt=$ealgo --encrypt-key-file=$ekeyfile " - fi - fi - - check_extra wsrep_log_info "Streaming GTID file before SST" @@ -739,17 +927,17 @@ then if [[ $encrypt -eq 1 ]];then if [[ -n $scomp ]];then - tcmd=" $ecmd | $scomp | $tcmd " + tcmd=" \$ecmd | $scomp | $tcmd " else - tcmd=" $ecmd | $tcmd " + tcmd=" \$ecmd | $tcmd " fi elif [[ -n $scomp ]];then tcmd=" $scomp | $tcmd " fi - send_donor $DATA "${stagemsg}-gtid" + # Restore the transport commmand to its original state tcmd="$ttcmd" if [[ -n $progress ]];then get_footprint @@ -764,10 +952,16 @@ then wsrep_log_info "Streaming the backup to joiner at ${REMOTEIP} ${SST_PORT:-4444}" - if [[ -n $scomp ]];then + # Add compression to the head of the stream (if specified) + if [[ -n $scomp ]]; then tcmd="$scomp | $tcmd" fi + # Add encryption to the head of the stream (if specified) + if [[ $encrypt -eq 1 ]]; then + tcmd=" \$ecmd | $tcmd " + fi + set +e timeit "${stagemsg}-SST" "$INNOBACKUP | $tcmd; RC=( "\${PIPESTATUS[@]}" )" set -e @@ -797,9 +991,9 @@ then get_keys if [[ $encrypt -eq 1 ]];then if [[ -n $scomp ]];then - tcmd=" $ecmd | $scomp | $tcmd " + tcmd=" \$ecmd | $scomp | $tcmd " else - tcmd=" $ecmd | $tcmd " + tcmd=" \$ecmd | $tcmd " fi elif [[ -n $scomp ]];then tcmd=" $scomp | $tcmd " @@ -824,7 +1018,6 @@ then stagemsg="Joiner-Recv" - sencrypted=1 nthreads=1 @@ -835,14 +1028,7 @@ then # May need xtrabackup_checkpoints later on rm -f ${DATA}/xtrabackup_binary ${DATA}/xtrabackup_galera_info ${DATA}/xtrabackup_logfile - ADDR=${WSREP_SST_OPT_ADDR} - if [ -z "${SST_PORT}" ] - then - SST_PORT=4444 - ADDR="$(echo ${WSREP_SST_OPT_ADDR} | awk -F ':' '{ print $1 }'):${SST_PORT}" - fi - - wait_for_listen ${SST_PORT} ${ADDR} ${MODULE} & + wait_for_listen ${WSREP_SST_OPT_HOST} ${WSREP_SST_OPT_PORT:-4444} ${MODULE} & trap sig_joiner_cleanup HUP PIPE INT TERM trap cleanup_joiner EXIT @@ -855,9 +1041,9 @@ then get_keys if [[ $encrypt -eq 1 && $sencrypted -eq 1 ]];then if [[ -n $sdecomp ]];then - strmcmd=" $sdecomp | $ecmd | $strmcmd" + strmcmd=" $sdecomp | \$ecmd | $strmcmd" else - strmcmd=" $ecmd | $strmcmd" + strmcmd=" \$ecmd | $strmcmd" fi elif [[ -n $sdecomp ]];then strmcmd=" $sdecomp | $strmcmd" diff --git a/sql-bench/CMakeLists.txt b/sql-bench/CMakeLists.txt index a837746bb98..b5532b2445c 100644 --- a/sql-bench/CMakeLists.txt +++ b/sql-bench/CMakeLists.txt @@ -34,38 +34,44 @@ INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Data/Wisconsin INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/limits DESTINATION ${prefix}sql-bench COMPONENT SqlBench) -FILE(GLOB all_files ${CMAKE_CURRENT_SOURCE_DIR}/*) +SET(all_files README bench-count-distinct.sh bench-init.pl.sh + compare-results.sh copy-db.sh crash-me.sh example.bat + graph-compare-results.sh innotest1.sh innotest1a.sh innotest1b.sh + innotest2.sh innotest2a.sh innotest2b.sh myisam.cnf pwd.bat + run-all-tests.sh server-cfg.sh test-ATIS.sh test-alter-table.sh + test-big-tables.sh test-connect.sh test-create.sh test-insert.sh + test-select.sh test-table-elimination.sh test-transactions.sh + test-wisconsin.sh uname.bat + ) FOREACH(file ${all_files}) - IF(NOT IS_DIRECTORY ${file} AND NOT ${file} MATCHES "Make|as3ap|/example$" ) - GET_FILENAME_COMPONENT(ext ${file} EXT) - GET_FILENAME_COMPONENT(name ${file} NAME) - SET(target ${name}) - IF(ext MATCHES ".sh$") - # Those are perl files actually - STRING(REPLACE ".sh" "" target ${target} ) - IF(WIN32) - IF(NOT ext MATCHES ".pl") - SET(target "${target}.pl") - ENDIF() + GET_FILENAME_COMPONENT(ext ${file} EXT) + GET_FILENAME_COMPONENT(name ${file} NAME) + SET(target ${name}) + IF(ext MATCHES ".sh$") + # Those are perl files actually + STRING(REPLACE ".sh" "" target ${target} ) + IF(WIN32) + IF(NOT ext MATCHES ".pl") + SET(target "${target}.pl") ENDIF() ENDIF() - SET(target "${CMAKE_CURRENT_BINARY_DIR}/${target}") - CONFIGURE_FILE(${file} ${target} COPYONLY) - IF (UNIX AND NOT ${name} MATCHES "README") - EXECUTE_PROCESS(COMMAND chmod +x ${target}) - ENDIF() - IF (ext MATCHES ".bat") - IF(WIN32) - INSTALL(PROGRAMS ${target} - DESTINATION ${prefix}sql-bench COMPONENT SqlBench) - ENDIF() - ELSEIF(name MATCHES "README") - INSTALL(FILES ${target} - DESTINATION ${prefix}sql-bench COMPONENT SqlBench) - ELSE() + ENDIF() + SET(target "${CMAKE_CURRENT_BINARY_DIR}/${target}") + CONFIGURE_FILE(${file} ${target} COPYONLY) + IF (UNIX AND NOT ${name} MATCHES "README") + EXECUTE_PROCESS(COMMAND chmod +x ${target}) + ENDIF() + IF (ext MATCHES ".bat") + IF(WIN32) INSTALL(PROGRAMS ${target} DESTINATION ${prefix}sql-bench COMPONENT SqlBench) ENDIF() + ELSEIF(name MATCHES "README") + INSTALL(FILES ${target} + DESTINATION ${prefix}sql-bench COMPONENT SqlBench) + ELSE() + INSTALL(PROGRAMS ${target} + DESTINATION ${prefix}sql-bench COMPONENT SqlBench) ENDIF() ENDFOREACH() diff --git a/sql-common/client.c b/sql-common/client.c index 24e6bcf92e9..2792c575aef 100644 --- a/sql-common/client.c +++ b/sql-common/client.c @@ -105,6 +105,7 @@ my_bool net_flush(NET *net); #endif #include "client_settings.h" +#include #include #include #include @@ -1149,6 +1150,7 @@ void mysql_read_default_options(struct st_mysql_options *options, break; case OPT_pipe: options->protocol = MYSQL_PROTOCOL_PIPE; + break; case OPT_connect_timeout: case OPT_timeout: if (opt_arg) @@ -1679,8 +1681,8 @@ mysql_ssl_set(MYSQL *mysql __attribute__((unused)) , mysql_options(mysql, MYSQL_OPT_SSL_CAPATH, capath) | mysql_options(mysql, MYSQL_OPT_SSL_CIPHER, cipher) ? 1 : 0); - mysql->options.use_ssl= TRUE; #endif /* HAVE_OPENSSL && !EMBEDDED_LIBRARY */ + mysql->options.use_ssl= TRUE; DBUG_RETURN(result); } @@ -1769,15 +1771,21 @@ mysql_get_ssl_cipher(MYSQL *mysql __attribute__((unused))) #if defined(HAVE_OPENSSL) +#ifdef HAVE_X509_check_host +#include +#endif + static int ssl_verify_server_cert(Vio *vio, const char* server_hostname, const char **errptr) { SSL *ssl; X509 *server_cert= NULL; +#ifndef HAVE_X509_check_host char *cn= NULL; int cn_loc= -1; ASN1_STRING *cn_asn1= NULL; X509_NAME_ENTRY *cn_entry= NULL; X509_NAME *subject= NULL; +#endif int ret_validation= 1; DBUG_ENTER("ssl_verify_server_cert"); @@ -1812,14 +1820,9 @@ static int ssl_verify_server_cert(Vio *vio, const char* server_hostname, const c are what we expect. */ - /* - Some notes for future development - We should check host name in alternative name first and then if needed check in common name. - Currently yssl doesn't support alternative name. - openssl 1.0.2 support X509_check_host method for host name validation, we may need to start using - X509_check_host in the future. - */ - +#ifdef HAVE_X509_check_host + ret_validation= X509_check_host(server_cert, server_hostname, 0, 0, 0) != 1; +#else subject= X509_get_subject_name(server_cert); cn_loc= X509_NAME_get_index_by_NID(subject, NID_commonName, -1); if (cn_loc < 0) @@ -1827,7 +1830,6 @@ static int ssl_verify_server_cert(Vio *vio, const char* server_hostname, const c *errptr= "Failed to get CN location in the certificate subject"; goto error; } - cn_entry= X509_NAME_get_entry(subject, cn_loc); if (cn_entry == NULL) { @@ -1842,7 +1844,7 @@ static int ssl_verify_server_cert(Vio *vio, const char* server_hostname, const c goto error; } - cn= (char *) ASN1_STRING_data(cn_asn1); + cn= (char *) ASN1_STRING_get0_data(cn_asn1); if ((size_t)ASN1_STRING_length(cn_asn1) != strlen(cn)) { @@ -1856,7 +1858,7 @@ static int ssl_verify_server_cert(Vio *vio, const char* server_hostname, const c /* Success */ ret_validation= 0; } - +#endif *errptr= "SSL certificate validation failure"; error: @@ -2541,7 +2543,6 @@ static int send_client_reply_packet(MCPVIO_EXT *mpvio, int3store(buff+2, net->max_packet_size); end= buff+5; } -#ifdef HAVE_OPENSSL /* If client uses ssl and client also has to verify the server @@ -2559,6 +2560,7 @@ static int send_client_reply_packet(MCPVIO_EXT *mpvio, goto error; } +#ifdef HAVE_OPENSSL if (mysql->client_flag & CLIENT_SSL) { /* Do the SSL layering. */ @@ -3408,7 +3410,7 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user, if (mysql->options.extension && mysql->options.extension->async_context) net->vio->async_context= mysql->options.extension->async_context; - if (my_net_init(net, net->vio, 0, MYF(0))) + if (my_net_init(net, net->vio, _current_thd(), MYF(0))) { vio_delete(net->vio); net->vio = 0; diff --git a/sql-common/client_plugin.c b/sql-common/client_plugin.c index dd87b01d932..f93e50125c5 100644 --- a/sql-common/client_plugin.c +++ b/sql-common/client_plugin.c @@ -375,8 +375,7 @@ mysql_load_plugin_v(MYSQL *mysql, const char *name, int type, if (!(sym= dlsym(dlhandle, plugin_declarations_sym))) { errmsg= "not a plugin"; - (void)dlclose(dlhandle); - goto err; + goto errc; } plugin= (struct st_mysql_client_plugin*)sym; @@ -384,19 +383,19 @@ mysql_load_plugin_v(MYSQL *mysql, const char *name, int type, if (type >=0 && type != plugin->type) { errmsg= "type mismatch"; - goto err; + goto errc; } if (strcmp(name, plugin->name)) { errmsg= "name mismatch"; - goto err; + goto errc; } if (type < 0 && find_plugin(name, plugin->type)) { errmsg= "it is already loaded"; - goto err; + goto errc; } plugin= add_plugin(mysql, plugin, dlhandle, argc, args); @@ -406,6 +405,8 @@ mysql_load_plugin_v(MYSQL *mysql, const char *name, int type, DBUG_PRINT ("leave", ("plugin loaded ok")); DBUG_RETURN (plugin); +errc: + dlclose(dlhandle); err: mysql_mutex_unlock(&LOCK_load_client_plugin); DBUG_PRINT ("leave", ("plugin load error : %s", errmsg)); diff --git a/sql/CMakeLists.txt b/sql/CMakeLists.txt index f46d8e4ee83..3b9da7ef150 100644 --- a/sql/CMakeLists.txt +++ b/sql/CMakeLists.txt @@ -60,14 +60,22 @@ SET_SOURCE_FILES_PROPERTIES(${GEN_SOURCES} # Gen_lex_token # Make sure sql_yacc.h is generated before compiling gen_lex_token + +IF(NOT CMAKE_GENERATOR MATCHES "Visual Studio") + SET(DEPENDS_gen_lex_token DEPENDS gen_lex_token) + SET(DEPENDS_gen_lex_hash DEPENDS gen_lex_hash) +ENDIF() + + IF(NOT CMAKE_CROSSCOMPILING) - ADD_EXECUTABLE(gen_lex_token gen_lex_token.cc) - ADD_DEPENDENCIES(gen_lex_token GenServerSource) + ADD_EXECUTABLE(gen_lex_token gen_lex_token.cc + ${CMAKE_CURRENT_BINARY_DIR}/sql_yacc.h) ENDIF() ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/lex_token.h COMMAND gen_lex_token > lex_token.h + ${DEPENDS_gen_lex_token} ) ADD_DEFINITIONS(-DMYSQL_SERVER -DHAVE_EVENT_SCHEDULER) @@ -82,39 +90,39 @@ SET (SQL_SOURCE filesort_utils.cc filesort.cc gstream.cc signal_handler.cc - handler.cc hash_filo.h + handler.cc hostname.cc init.cc item.cc item_buff.cc item_cmpfunc.cc item_create.cc item_func.cc item_geofunc.cc item_row.cc item_strfunc.cc item_subselect.cc item_sum.cc item_timefunc.cc key.cc log.cc lock.cc log_event.cc rpl_record.cc rpl_reporting.cc log_event_old.cc rpl_record_old.cc - message.h mf_iocache.cc my_decimal.cc + mf_iocache.cc my_decimal.cc mysqld.cc net_serv.cc keycaches.cc ../sql-common/client_plugin.c - opt_range.cc opt_range.h opt_sum.cc + opt_range.cc opt_sum.cc ../sql-common/pack.c parse_file.cc password.c procedure.cc protocol.cc records.cc repl_failsafe.cc rpl_filter.cc session_tracker.cc set_var.cc slave.cc sp.cc sp_cache.cc sp_head.cc sp_pcontext.cc sp_rcontext.cc spatial.cc sql_acl.cc sql_analyse.cc sql_base.cc - sql_cache.cc sql_class.cc sql_client.cc sql_crypt.cc sql_crypt.h + sql_cache.cc sql_class.cc sql_client.cc sql_crypt.cc sql_cursor.cc sql_db.cc sql_delete.cc sql_derived.cc sql_digest.cc sql_do.cc sql_error.cc sql_handler.cc sql_get_diagnostics.cc sql_help.cc sql_insert.cc sql_lex.cc sql_list.cc sql_load.cc sql_manager.cc - sql_parse.cc sql_bootstrap.cc sql_bootstrap.h + sql_parse.cc sql_bootstrap.cc sql_partition.cc sql_plugin.cc sql_prepare.cc sql_rename.cc - debug_sync.cc debug_sync.h + debug_sync.cc sql_repl.cc sql_select.cc sql_show.cc sql_state.c group_by_handler.cc sql_statistics.cc sql_string.cc sql_table.cc sql_test.cc sql_trigger.cc sql_udf.cc sql_union.cc sql_update.cc sql_view.cc strfunc.cc table.cc thr_malloc.cc sql_time.cc tztime.cc unireg.cc item_xmlfunc.cc - uniques.cc uniques.h + uniques.cc rpl_tblmap.cc sql_binlog.cc event_scheduler.cc event_data_objects.cc event_queue.cc event_db_repository.cc sql_tablespace.cc events.cc ../sql-common/my_user.c @@ -124,23 +132,23 @@ SET (SQL_SOURCE sql_profile.cc event_parse_data.cc sql_alter.cc sql_signal.cc rpl_handler.cc mdl.cc sql_admin.cc transaction.cc sys_vars.cc sql_truncate.cc datadict.cc - sql_reload.cc sql_cmd.h item_inetfunc.cc + sql_reload.cc item_inetfunc.cc # added in MariaDB: - sql_explain.h sql_explain.cc - sql_analyze_stmt.h sql_analyze_stmt.cc - sql_lifo_buffer.h sql_join_cache.h sql_join_cache.cc + sql_explain.cc + sql_analyze_stmt.cc + sql_join_cache.cc create_options.cc multi_range_read.cc opt_index_cond_pushdown.cc opt_subselect.cc opt_table_elimination.cc sql_expression_cache.cc gcalc_slicescan.cc gcalc_tools.cc threadpool_common.cc ../sql-common/mysql_async.c - my_apc.cc my_apc.h mf_iocache_encr.cc item_jsonfunc.cc - my_json_writer.cc my_json_writer.h + my_apc.cc mf_iocache_encr.cc item_jsonfunc.cc + my_json_writer.cc rpl_gtid.cc rpl_parallel.cc - sql_type.cc sql_type.h + sql_type.cc item_windowfunc.cc sql_window.cc - sql_cte.cc sql_cte.h + sql_cte.cc ${WSREP_SOURCES} table_cache.cc encryption.cc temporary_tables.cc ${CMAKE_CURRENT_BINARY_DIR}/sql_builtin.cc @@ -176,7 +184,7 @@ TARGET_LINK_LIBRARIES(sql ${MYSQLD_STATIC_PLUGIN_LIBS} ${LIBSYSTEMD}) IF(WIN32) - SET(MYSQLD_SOURCE main.cc nt_servc.cc nt_servc.h message.rc) + SET(MYSQLD_SOURCE main.cc nt_servc.cc message.rc) TARGET_LINK_LIBRARIES(sql psapi) ELSE() SET(MYSQLD_SOURCE main.cc ${DTRACE_PROBES_ALL}) @@ -217,23 +225,35 @@ IF(MSVC AND NOT WITHOUT_DYNAMIC_PLUGINS) SET(_PLATFORM x64) ENDIF() + # Create a cmake script to generate import and export libs + # from a .def file + SET(CMAKE_CONFIGURABLE_FILE_CONTENT " + IF ((mysqld_lib.def IS_NEWER_THAN mysqld_lib.lib) OR + (mysqld_lib.def IS_NEWER_THAN mysqld_lib.exp)) + SET(ENV{VS_UNICODE_OUTPUT}) + EXECUTE_PROCESS ( + COMMAND \"${CMAKE_LINKER}\" /lib /NAME:mysqld.exe \"/DEF:${MYSQLD_DEF}\" /MACHINE:${_PLATFORM} + RESULT_VARIABLE ret) + IF(NOT ret EQUAL 0) + MESSAGE(FATAL_ERROR \"process failed ret=\${ret}\") + ENDIF() + ENDIF() + ") + + CONFIGURE_FILE( + ${PROJECT_SOURCE_DIR}/cmake/configurable_file_content.in + make_mysqld_lib.cmake) + ADD_CUSTOM_COMMAND( - OUTPUT ${MYSQLD_DEF} + OUTPUT ${MYSQLD_DEF} ${MYSQLD_LIB} ${MYSQLD_EXP} COMMAND cscript ARGS //nologo ${PROJECT_SOURCE_DIR}/win/create_def_file.js ${_PLATFORM} /forLib ${LIB_LOCATIONS} > mysqld_lib.def.tmp COMMAND ${CMAKE_COMMAND} -E copy_if_different mysqld_lib.def.tmp mysqld_lib.def - COMMAND ${CMAKE_COMMAND} -E remove mysqld_lib.def.tmp + COMMAND ${CMAKE_COMMAND} -P make_mysqld_lib.cmake WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} DEPENDS ${MYSQLD_CORELIBS} ) - ADD_CUSTOM_COMMAND( - OUTPUT ${MYSQLD_LIB} - COMMAND lib - ARGS /NAME:mysqld.exe "/DEF:${MYSQLD_DEF}" "/MACHINE:${_PLATFORM}" - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - DEPENDS ${MYSQLD_DEF} - ) ADD_CUSTOM_TARGET(gen_mysqld_lib DEPENDS ${MYSQLD_LIB}) ADD_LIBRARY(mysqld_import_lib UNKNOWN IMPORTED GLOBAL) SET_TARGET_PROPERTIES(mysqld_import_lib PROPERTIES IMPORTED_LOCATION ${MYSQLD_LIB}) @@ -250,7 +270,10 @@ IF(APPLE) ENDIF() IF(NOT WITHOUT_DYNAMIC_PLUGINS) - SET_TARGET_PROPERTIES(mysqld PROPERTIES ENABLE_EXPORTS TRUE) + IF(NOT MSVC) + SET_TARGET_PROPERTIES(mysqld PROPERTIES ENABLE_EXPORTS TRUE) + ENDIF() + GET_TARGET_PROPERTY(mysqld_link_flags mysqld LINK_FLAGS) IF(NOT mysqld_link_flags) SET(mysqld_link_flags) @@ -264,7 +287,6 @@ IF(NOT WITHOUT_DYNAMIC_PLUGINS) ENDIF() ENDIF(NOT WITHOUT_DYNAMIC_PLUGINS) -SET_TARGET_PROPERTIES(mysqld PROPERTIES ENABLE_EXPORTS TRUE) TARGET_LINK_LIBRARIES(mysqld sql) # Provide plugins with minimal set of libraries @@ -327,6 +349,7 @@ ENDIF() ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/lex_hash.h COMMAND gen_lex_hash > lex_hash.h + ${DEPENDS_gen_lex_hash} ) MYSQL_ADD_EXECUTABLE(mysql_tzinfo_to_sql tztime.cc COMPONENT Server) @@ -399,15 +422,15 @@ IF(WIN32 AND MYSQLD_EXECUTABLE) ENDIF() MAKE_DIRECTORY(${CMAKE_CURRENT_BINARY_DIR}/data) ADD_CUSTOM_COMMAND( - OUTPUT initdb.dep - COMMAND ${CMAKE_COMMAND} - ${CONFIG_PARAM} -P ${CMAKE_CURRENT_BINARY_DIR}/create_initial_db.cmake + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/initdb.dep + COMMAND ${CMAKE_COMMAND} ${CONFIG_PARAM} -P ${CMAKE_CURRENT_BINARY_DIR}/create_initial_db.cmake + COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/initdb.dep WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/data DEPENDS mysqld ) ADD_CUSTOM_TARGET(initial_database ALL - DEPENDS initdb.dep + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/initdb.dep ) INSTALL(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/data DESTINATION . COMPONENT DataFiles @@ -444,7 +467,7 @@ IF(WIN32) ${CMAKE_CURRENT_BINARY_DIR}/my_bootstrap.sql mysql_bootstrap_sql.c WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - DEPENDS ${my_bootstrap_sql} + DEPENDS comp_sql ${my_bootstrap_sql} ) MYSQL_ADD_EXECUTABLE(mysql_install_db @@ -463,7 +486,7 @@ IF(WIN32) TARGET_LINK_LIBRARIES(mysql_upgrade_service mysys winservice) ENDIF(WIN32) -INSTALL(DIRECTORY . DESTINATION ${INSTALL_INCLUDEDIR}/private COMPONENT Development +INSTALL(DIRECTORY . DESTINATION ${INSTALL_INCLUDEDIR}/server/private COMPONENT Development FILES_MATCHING PATTERN "*.h" PATTERN share EXCLUDE PATTERN CMakeFiles EXCLUDE) diff --git a/sql/contributors.h b/sql/contributors.h index 3a771e2b493..88a4a088acf 100644 --- a/sql/contributors.h +++ b/sql/contributors.h @@ -39,9 +39,11 @@ struct show_table_contributors_st show_table_contributors[]= { /* MariaDB foundation sponsors, in contribution, size , time order */ {"Booking.com", "https://www.booking.com", "Founding member, Platinum Sponsor of the MariaDB Foundation"}, {"Alibaba Cloud", "https://intl.aliyun.com", "Platinum Sponsor of the MariaDB Foundation"}, + {"Tencent Cloud", "https://cloud.tencent.com", "Platinum Sponsor of the MariaDB Foundation"}, {"MariaDB Corporation", "https://mariadb.com", "Founding member, Gold Sponsor of the MariaDB Foundation"}, {"Visma", "https://visma.com", "Gold Sponsor of the MariaDB Foundation"}, {"DBS", "https://dbs.com", "Gold Sponsor of the MariaDB Foundation"}, + {"IBM", "https://www.ibm.com", "Gold Sponsor of the MariaDB Foundation"}, {"Nexedi", "https://www.nexedi.com", "Silver Sponsor of the MariaDB Foundation"}, {"Acronis", "http://www.acronis.com", "Silver Sponsor of the MariaDB Foundation"}, {"Auttomattic", "https://automattic.com", "Bronze Sponsor of the MariaDB Foundation"}, diff --git a/sql/debug_sync.cc b/sql/debug_sync.cc index b2a187b07cb..ab022c770b8 100644 --- a/sql/debug_sync.cc +++ b/sql/debug_sync.cc @@ -1505,7 +1505,7 @@ static void debug_sync_execute(THD *thd, st_debug_sync_action *action) { if (!--action->hit_limit) { - thd->killed= KILL_QUERY; + thd->set_killed(KILL_QUERY); my_error(ER_DEBUG_SYNC_HIT_LIMIT, MYF(0)); } DBUG_PRINT("debug_sync_exec", ("hit_limit: %lu at: '%s'", diff --git a/sql/discover.cc b/sql/discover.cc index d8ed718fc58..d8bf6ca79c5 100644 --- a/sql/discover.cc +++ b/sql/discover.cc @@ -89,8 +89,7 @@ int readfrm(const char *name, const uchar **frmdata, size_t *len) error= 0; err: - if (file > 0) - (void) mysql_file_close(file, MYF(MY_WME)); + (void) mysql_file_close(file, MYF(MY_WME)); err_end: /* Here when no file */ DBUG_RETURN (error); diff --git a/sql/encryption.cc b/sql/encryption.cc index a92296e8b66..52eab262570 100644 --- a/sql/encryption.cc +++ b/sql/encryption.cc @@ -98,19 +98,27 @@ int initialize_encryption_plugin(st_plugin_int *plugin) int finalize_encryption_plugin(st_plugin_int *plugin) { - encryption_handler.encryption_key_get_func= - (uint (*)(uint, uint, uchar*, uint*))no_key; - encryption_handler.encryption_key_get_latest_version_func= no_key; - encryption_handler.encryption_ctx_size_func= zero_size; + bool used= plugin_ref_to_int(encryption_manager) == plugin; + + if (used) + { + encryption_handler.encryption_key_get_func= + (uint (*)(uint, uint, uchar*, uint*))no_key; + encryption_handler.encryption_key_get_latest_version_func= no_key; + encryption_handler.encryption_ctx_size_func= zero_size; + } if (plugin && plugin->plugin->deinit && plugin->plugin->deinit(NULL)) { DBUG_PRINT("warning", ("Plugin '%s' deinit function returned error.", plugin->name.str)); } - if (encryption_manager) + + if (used) + { plugin_unlock(NULL, encryption_manager); - encryption_manager= 0; + encryption_manager= 0; + } return 0; } diff --git a/sql/events.cc b/sql/events.cc index 2daf99abffc..ecba97649b7 100644 --- a/sql/events.cc +++ b/sql/events.cc @@ -1,5 +1,6 @@ /* Copyright (c) 2005, 2013, Oracle and/or its affiliates. + Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -242,6 +243,7 @@ common_1_lev_code: break; case INTERVAL_WEEK: expr/= 7; + /* fall through */ default: close_quote= FALSE; break; diff --git a/sql/field.cc b/sql/field.cc index b85bdeb7091..a872fab2520 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -10026,7 +10026,7 @@ bool Column_definition::check(THD *thd) case MYSQL_TYPE_DATE: /* We don't support creation of MYSQL_TYPE_DATE anymore */ sql_type= MYSQL_TYPE_NEWDATE; - /* fall trough */ + /* fall through */ case MYSQL_TYPE_NEWDATE: length= MAX_DATE_WIDTH; break; diff --git a/sql/field.h b/sql/field.h index 14f14afdaf7..91c24327b28 100644 --- a/sql/field.h +++ b/sql/field.h @@ -681,7 +681,7 @@ public: in_partitioning_expr= TRUE; } inline bool is_equal(const Virtual_column_info* vcol) const; - void print(String*); + inline void print(String*); }; class Field: public Value_source @@ -3092,6 +3092,7 @@ private: class Field_varstring :public Field_longstr { +public: uchar *get_data() const { return ptr + length_bytes; @@ -3100,7 +3101,6 @@ class Field_varstring :public Field_longstr { { return length_bytes == 1 ? (uint) *ptr : uint2korr(ptr); } -public: /* The maximum space available in a Field_varstring, in bytes. See length_bytes. diff --git a/sql/filesort.cc b/sql/filesort.cc index baeb75b3b0b..2388dd759b5 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -182,12 +182,6 @@ SORT_INFO *filesort(THD *thd, TABLE *table, Filesort *filesort, outfile= &sort->io_cache; - /* - Release InnoDB's adaptive hash index latch (if holding) before - running a sort. - */ - ha_release_temporary_latches(thd); - my_b_clear(&tempfile); my_b_clear(&buffpek_pointers); buffpek=0; @@ -951,6 +945,7 @@ write_keys(Sort_param *param, SORT_INFO *fs_info, uint count, /* check we won't have more buffpeks than we can possibly keep in memory */ if (my_b_tell(buffpek_pointers) + sizeof(BUFFPEK) > (ulonglong)UINT_MAX) goto err; + bzero(&buffpek, sizeof(buffpek)); buffpek.file_pos= my_b_tell(tempfile); if ((ha_rows) count > param->max_rows) count=(uint) param->max_rows; /* purecov: inspected */ @@ -1488,8 +1483,6 @@ int merge_many_buff(Sort_param *param, uchar *sort_buffer, if (flush_io_cache(to_file)) break; /* purecov: inspected */ temp=from_file; from_file=to_file; to_file=temp; - setup_io_cache(from_file); - setup_io_cache(to_file); *maxbuffer= (uint) (lastbuff-buffpek)-1; } cleanup: @@ -1497,7 +1490,6 @@ cleanup: if (to_file == t_file) { *t_file=t_file2; // Copy result file - setup_io_cache(t_file); } DBUG_RETURN(*maxbuffer >= MERGEBUFF2); /* Return 1 if interrupted */ diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index 7f156c80205..54c777975e0 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -413,8 +413,12 @@ ha_partition::~ha_partition() destroy_record_priority_queue(); my_free(m_part_ids_sorted_by_num_of_records); + if (m_added_file) + { + for (handler **ph= m_added_file; *ph; ph++) + delete (*ph); + } clear_handler_file(); - free_root(&m_mem_root, MYF(0)); DBUG_VOID_RETURN; @@ -674,7 +678,7 @@ int ha_partition::create(const char *name, TABLE *table_arg, HA_CREATE_INFO *create_info) { int error; - char name_buff[FN_REFLEN], name_lc_buff[FN_REFLEN]; + char name_buff[FN_REFLEN + 1], name_lc_buff[FN_REFLEN]; char *name_buffer_ptr; const char *path; uint i; @@ -716,8 +720,9 @@ int ha_partition::create(const char *name, TABLE *table_arg, for (j= 0; j < m_part_info->num_subparts; j++) { part_elem= sub_it++; - create_partition_name(name_buff, path, name_buffer_ptr, - NORMAL_PART_NAME, FALSE); + if ((error= create_partition_name(name_buff, sizeof(name_buff), path, + name_buffer_ptr, NORMAL_PART_NAME, FALSE))) + goto create_error; if ((error= set_up_table_before_create(table_arg, name_buff, create_info, part_elem)) || ((error= (*file)->ha_create(name_buff, table_arg, create_info)))) @@ -729,8 +734,9 @@ int ha_partition::create(const char *name, TABLE *table_arg, } else { - create_partition_name(name_buff, path, name_buffer_ptr, - NORMAL_PART_NAME, FALSE); + if ((error= create_partition_name(name_buff, sizeof(name_buff), path, + name_buffer_ptr, NORMAL_PART_NAME, FALSE))) + goto create_error; if ((error= set_up_table_before_create(table_arg, name_buff, create_info, part_elem)) || ((error= (*file)->ha_create(name_buff, table_arg, create_info)))) @@ -746,9 +752,9 @@ create_error: name_buffer_ptr= m_name_buffer_ptr; for (abort_file= file, file= m_file; file < abort_file; file++) { - create_partition_name(name_buff, path, name_buffer_ptr, NORMAL_PART_NAME, - FALSE); - (void) (*file)->ha_delete_table((const char*) name_buff); + if (!create_partition_name(name_buff, sizeof(name_buff), path, + name_buffer_ptr, NORMAL_PART_NAME, FALSE)) + (void) (*file)->ha_delete_table((const char*) name_buff); name_buffer_ptr= strend(name_buffer_ptr) + 1; } handler::delete_table(name); @@ -775,7 +781,7 @@ create_error: int ha_partition::drop_partitions(const char *path) { List_iterator part_it(m_part_info->partitions); - char part_name_buff[FN_REFLEN]; + char part_name_buff[FN_REFLEN + 1]; uint num_parts= m_part_info->partitions.elements; uint num_subparts= m_part_info->num_subparts; uint i= 0; @@ -808,9 +814,11 @@ int ha_partition::drop_partitions(const char *path) { partition_element *sub_elem= sub_it++; part= i * num_subparts + j; - create_subpartition_name(part_name_buff, path, - part_elem->partition_name, - sub_elem->partition_name, name_variant); + if ((ret_error= create_subpartition_name(part_name_buff, + sizeof(part_name_buff), path, + part_elem->partition_name, + sub_elem->partition_name, name_variant))) + error= ret_error; file= m_file[part]; DBUG_PRINT("info", ("Drop subpartition %s", part_name_buff)); if ((ret_error= file->ha_delete_table(part_name_buff))) @@ -821,15 +829,19 @@ int ha_partition::drop_partitions(const char *path) } else { - create_partition_name(part_name_buff, path, - part_elem->partition_name, name_variant, - TRUE); - file= m_file[i]; - DBUG_PRINT("info", ("Drop partition %s", part_name_buff)); - if ((ret_error= file->ha_delete_table(part_name_buff))) + if ((ret_error= create_partition_name(part_name_buff, + sizeof(part_name_buff), path, + part_elem->partition_name, name_variant, TRUE))) error= ret_error; - if (deactivate_ddl_log_entry(part_elem->log_entry->entry_pos)) - error= 1; + else + { + file= m_file[i]; + DBUG_PRINT("info", ("Drop partition %s", part_name_buff)); + if ((ret_error= file->ha_delete_table(part_name_buff))) + error= ret_error; + if (deactivate_ddl_log_entry(part_elem->log_entry->entry_pos)) + error= 1; + } } if (part_elem->part_state == PART_IS_CHANGED) part_elem->part_state= PART_NORMAL; @@ -865,8 +877,8 @@ int ha_partition::rename_partitions(const char *path) { List_iterator part_it(m_part_info->partitions); List_iterator temp_it(m_part_info->temp_partitions); - char part_name_buff[FN_REFLEN]; - char norm_name_buff[FN_REFLEN]; + char part_name_buff[FN_REFLEN + 1]; + char norm_name_buff[FN_REFLEN + 1]; uint num_parts= m_part_info->partitions.elements; uint part_count= 0; uint num_subparts= m_part_info->num_subparts; @@ -908,10 +920,11 @@ int ha_partition::rename_partitions(const char *path) { sub_elem= sub_it++; file= m_reorged_file[part_count++]; - create_subpartition_name(norm_name_buff, path, - part_elem->partition_name, - sub_elem->partition_name, - NORMAL_PART_NAME); + if ((ret_error= create_subpartition_name(norm_name_buff, + sizeof(norm_name_buff), path, + part_elem->partition_name, + sub_elem->partition_name, NORMAL_PART_NAME))) + error= ret_error; DBUG_PRINT("info", ("Delete subpartition %s", norm_name_buff)); if ((ret_error= file->ha_delete_table(norm_name_buff))) error= ret_error; @@ -924,16 +937,20 @@ int ha_partition::rename_partitions(const char *path) else { file= m_reorged_file[part_count++]; - create_partition_name(norm_name_buff, path, - part_elem->partition_name, NORMAL_PART_NAME, - TRUE); - DBUG_PRINT("info", ("Delete partition %s", norm_name_buff)); - if ((ret_error= file->ha_delete_table(norm_name_buff))) + if ((ret_error= create_partition_name(norm_name_buff, + sizeof(norm_name_buff), path, + part_elem->partition_name, NORMAL_PART_NAME, TRUE))) error= ret_error; - else if (deactivate_ddl_log_entry(part_elem->log_entry->entry_pos)) - error= 1; else - part_elem->log_entry= NULL; /* Indicate success */ + { + DBUG_PRINT("info", ("Delete partition %s", norm_name_buff)); + if ((ret_error= file->ha_delete_table(norm_name_buff))) + error= ret_error; + else if (deactivate_ddl_log_entry(part_elem->log_entry->entry_pos)) + error= 1; + else + part_elem->log_entry= NULL; /* Indicate success */ + } } } while (++i < temp_partitions); (void) sync_ddl_log(); @@ -976,10 +993,11 @@ int ha_partition::rename_partitions(const char *path) { sub_elem= sub_it++; part= i * num_subparts + j; - create_subpartition_name(norm_name_buff, path, - part_elem->partition_name, - sub_elem->partition_name, - NORMAL_PART_NAME); + if ((ret_error= create_subpartition_name(norm_name_buff, + sizeof(norm_name_buff), path, + part_elem->partition_name, + sub_elem->partition_name, NORMAL_PART_NAME))) + error= ret_error; if (part_elem->part_state == PART_IS_CHANGED) { file= m_reorged_file[part_count++]; @@ -991,10 +1009,11 @@ int ha_partition::rename_partitions(const char *path) (void) sync_ddl_log(); } file= m_new_file[part]; - create_subpartition_name(part_name_buff, path, - part_elem->partition_name, - sub_elem->partition_name, - TEMP_PART_NAME); + if ((ret_error= create_subpartition_name(part_name_buff, + sizeof(part_name_buff), path, + part_elem->partition_name, + sub_elem->partition_name, TEMP_PART_NAME))) + error= ret_error; DBUG_PRINT("info", ("Rename subpartition from %s to %s", part_name_buff, norm_name_buff)); if ((ret_error= file->ha_rename_table(part_name_buff, @@ -1008,32 +1027,36 @@ int ha_partition::rename_partitions(const char *path) } else { - create_partition_name(norm_name_buff, path, - part_elem->partition_name, NORMAL_PART_NAME, - TRUE); - if (part_elem->part_state == PART_IS_CHANGED) + if ((ret_error= create_partition_name(norm_name_buff, + sizeof(norm_name_buff), path, + part_elem->partition_name, NORMAL_PART_NAME, TRUE)) || + (ret_error= create_partition_name(part_name_buff, + sizeof(part_name_buff), path, + part_elem->partition_name, TEMP_PART_NAME, TRUE))) + error= ret_error; + else { - file= m_reorged_file[part_count++]; - DBUG_PRINT("info", ("Delete partition %s", norm_name_buff)); - if ((ret_error= file->ha_delete_table(norm_name_buff))) + if (part_elem->part_state == PART_IS_CHANGED) + { + file= m_reorged_file[part_count++]; + DBUG_PRINT("info", ("Delete partition %s", norm_name_buff)); + if ((ret_error= file->ha_delete_table(norm_name_buff))) + error= ret_error; + else if (deactivate_ddl_log_entry(part_elem->log_entry->entry_pos)) + error= 1; + (void) sync_ddl_log(); + } + file= m_new_file[i]; + DBUG_PRINT("info", ("Rename partition from %s to %s", + part_name_buff, norm_name_buff)); + if ((ret_error= file->ha_rename_table(part_name_buff, + norm_name_buff))) error= ret_error; else if (deactivate_ddl_log_entry(part_elem->log_entry->entry_pos)) error= 1; - (void) sync_ddl_log(); + else + part_elem->log_entry= NULL; } - file= m_new_file[i]; - create_partition_name(part_name_buff, path, - part_elem->partition_name, TEMP_PART_NAME, - TRUE); - DBUG_PRINT("info", ("Rename partition from %s to %s", - part_name_buff, norm_name_buff)); - if ((ret_error= file->ha_rename_table(part_name_buff, - norm_name_buff))) - error= ret_error; - else if (deactivate_ddl_log_entry(part_elem->log_entry->entry_pos)) - error= 1; - else - part_elem->log_entry= NULL; } } } while (++i < num_parts); @@ -1649,7 +1672,7 @@ int ha_partition::change_partitions(HA_CREATE_INFO *create_info, { List_iterator part_it(m_part_info->partitions); List_iterator t_it(m_part_info->temp_partitions); - char part_name_buff[FN_REFLEN]; + char part_name_buff[FN_REFLEN + 1]; uint num_parts= m_part_info->partitions.elements; uint num_subparts= m_part_info->num_subparts; uint i= 0; @@ -1878,10 +1901,14 @@ int ha_partition::change_partitions(HA_CREATE_INFO *create_info, do { partition_element *sub_elem= sub_it++; - create_subpartition_name(part_name_buff, path, - part_elem->partition_name, - sub_elem->partition_name, - name_variant); + if ((error= create_subpartition_name(part_name_buff, + sizeof(part_name_buff), path, + part_elem->partition_name, sub_elem->partition_name, + name_variant))) + { + cleanup_new_partition(part_count); + DBUG_RETURN(error); + } part= i * num_subparts + j; DBUG_PRINT("info", ("Add subpartition %s", part_name_buff)); if ((error= prepare_new_partition(table, create_info, @@ -1899,9 +1926,14 @@ int ha_partition::change_partitions(HA_CREATE_INFO *create_info, } else { - create_partition_name(part_name_buff, path, - part_elem->partition_name, name_variant, - TRUE); + if ((error= create_partition_name(part_name_buff, + sizeof(part_name_buff), path, part_elem->partition_name, + name_variant, TRUE))) + { + cleanup_new_partition(part_count); + DBUG_RETURN(error); + } + DBUG_PRINT("info", ("Add partition %s", part_name_buff)); if ((error= prepare_new_partition(table, create_info, new_file_array[i], @@ -2272,8 +2304,8 @@ uint ha_partition::del_ren_table(const char *from, const char *to) { int save_error= 0; int error; - char from_buff[FN_REFLEN], to_buff[FN_REFLEN], from_lc_buff[FN_REFLEN], - to_lc_buff[FN_REFLEN]; + char from_buff[FN_REFLEN + 1], to_buff[FN_REFLEN + 1], + from_lc_buff[FN_REFLEN], to_lc_buff[FN_REFLEN]; char *name_buffer_ptr; const char *from_path; const char *to_path= NULL; @@ -2309,13 +2341,15 @@ uint ha_partition::del_ren_table(const char *from, const char *to) i= 0; do { - create_partition_name(from_buff, from_path, name_buffer_ptr, - NORMAL_PART_NAME, FALSE); + if ((error= create_partition_name(from_buff, sizeof(from_buff), from_path, + name_buffer_ptr, NORMAL_PART_NAME, FALSE))) + goto rename_error; if (to != NULL) { // Rename branch - create_partition_name(to_buff, to_path, name_buffer_ptr, - NORMAL_PART_NAME, FALSE); + if ((error= create_partition_name(to_buff, sizeof(to_buff), to_path, + name_buffer_ptr, NORMAL_PART_NAME, FALSE))) + goto rename_error; error= (*file)->ha_rename_table(from_buff, to_buff); if (error) goto rename_error; @@ -2344,12 +2378,14 @@ rename_error: for (abort_file= file, file= m_file; file < abort_file; file++) { /* Revert the rename, back from 'to' to the original 'from' */ - create_partition_name(from_buff, from_path, name_buffer_ptr, - NORMAL_PART_NAME, FALSE); - create_partition_name(to_buff, to_path, name_buffer_ptr, - NORMAL_PART_NAME, FALSE); - /* Ignore error here */ - (void) (*file)->ha_rename_table(to_buff, from_buff); + if (!create_partition_name(from_buff, sizeof(from_buff), from_path, + name_buffer_ptr, NORMAL_PART_NAME, FALSE) && + !create_partition_name(to_buff, sizeof(to_buff), to_path, + name_buffer_ptr, NORMAL_PART_NAME, FALSE)) + { + /* Ignore error here */ + (void) (*file)->ha_rename_table(to_buff, from_buff); + } name_buffer_ptr= strend(name_buffer_ptr) + 1; } DBUG_RETURN(error); @@ -3416,7 +3452,7 @@ int ha_partition::open(const char *name, int mode, uint test_if_locked) char *name_buffer_ptr; int error= HA_ERR_INITIALIZATION; handler **file; - char name_buff[FN_REFLEN]; + char name_buff[FN_REFLEN + 1]; ulonglong check_table_flags; DBUG_ENTER("ha_partition::open"); @@ -3470,8 +3506,9 @@ int ha_partition::open(const char *name, int mode, uint test_if_locked) file= m_is_clone_of->m_file; for (i= 0; i < m_tot_parts; i++) { - create_partition_name(name_buff, name, name_buffer_ptr, NORMAL_PART_NAME, - FALSE); + if ((error= create_partition_name(name_buff, sizeof(name_buff), name, + name_buffer_ptr, NORMAL_PART_NAME, FALSE))) + goto err_handler; /* ::clone() will also set ha_share from the original. */ if (!(m_file[i]= file[i]->clone(name_buff, m_clone_mem_root))) { @@ -3487,8 +3524,9 @@ int ha_partition::open(const char *name, int mode, uint test_if_locked) file= m_file; do { - create_partition_name(name_buff, name, name_buffer_ptr, NORMAL_PART_NAME, - FALSE); + if ((error= create_partition_name(name_buff, sizeof(name_buff), name, + name_buffer_ptr, NORMAL_PART_NAME, FALSE))) + goto err_handler; table->s->connect_string = m_connect_string[(uint)(file-m_file)]; if ((error= (*file)->ha_open(table, name_buff, mode, test_if_locked | HA_OPEN_NO_PSI_CALL))) @@ -7867,7 +7905,7 @@ uint32 ha_partition::calculate_key_hash_value(Field **field_array) case MYSQL_TYPE_BLOB: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_GEOMETRY: - /* fall through. */ + /* fall through */ default: DBUG_ASSERT(0); // New type? /* Fall through for default hashing (5.5). */ @@ -9053,8 +9091,6 @@ int ha_partition::check_for_upgrade(HA_CHECK_OPT *check_opt) !(part_buf= generate_partition_syntax(thd, m_part_info, &part_buf_len, true, - true, - NULL, NULL, NULL)) || print_admin_msg(thd, SQL_ADMIN_MSG_TEXT_SIZE + 1, "error", diff --git a/sql/ha_partition.h b/sql/ha_partition.h index 70cd3760783..a5a584287cf 100644 --- a/sql/ha_partition.h +++ b/sql/ha_partition.h @@ -21,13 +21,6 @@ #include "sql_partition.h" /* part_id_range, partition_element */ #include "queues.h" /* QUEUE */ -enum partition_keywords -{ - PKW_HASH= 0, PKW_RANGE, PKW_LIST, PKW_KEY, PKW_MAXVALUE, PKW_LINEAR, - PKW_COLUMNS, PKW_ALGORITHM -}; - - #define PARTITION_BYTES_IN_POS 2 diff --git a/sql/handler.cc b/sql/handler.cc index a6016646d3c..034a3f5f750 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -72,6 +72,14 @@ KEY_CREATE_INFO default_key_create_info= ulong total_ha= 0; /* number of storage engines (from handlertons[]) that support 2pc */ ulong total_ha_2pc= 0; +#ifndef DBUG_OFF +/* + Number of non-mandatory 2pc handlertons whose initialization failed + to estimate total_ha_2pc value under supposition of the failures + have not occcured. +*/ +ulong failed_ha_2pc= 0; +#endif /* size of savepoint storage area (see ha_init) */ ulong savepoint_alloc_size= 0; @@ -648,6 +656,10 @@ err_deinit: (void) plugin->plugin->deinit(NULL); err: +#ifndef DBUG_OFF + if (hton->prepare && hton->state == SHOW_OPTION_YES) + failed_ha_2pc++; +#endif my_free(hton); err_no_hton_memory: plugin->data= NULL; @@ -1659,6 +1671,11 @@ int ha_rollback_trans(THD *thd, bool all) { // cannot happen my_error(ER_ERROR_DURING_ROLLBACK, MYF(0), err); error=1; +#ifdef WITH_WSREP + WSREP_WARN("handlerton rollback failed, thd %llu %lld conf %d SQL %s", + thd->thread_id, thd->query_id, thd->wsrep_conflict_state, + thd->query()); +#endif /* WITH_WSREP */ } status_var_increment(thd->status_var.ha_rollback_count); ha_info_next= ha_info->next(); @@ -1853,7 +1870,7 @@ static my_bool xarecover_handlerton(THD *unused, plugin_ref plugin, { #ifndef DBUG_OFF char buf[XIDDATASIZE*4+6]; // see xid_to_str - sql_print_information("ignore xid %s", xid_to_str(buf, info->list+i)); + DBUG_PRINT("info", ("ignore xid %s", xid_to_str(buf, info->list+i))); #endif xid_cache_insert(info->list+i, XA_PREPARED); info->found_foreign_xids++; @@ -1870,19 +1887,31 @@ static my_bool xarecover_handlerton(THD *unused, plugin_ref plugin, tc_heuristic_recover == TC_HEURISTIC_RECOVER_COMMIT) { #ifndef DBUG_OFF - char buf[XIDDATASIZE*4+6]; // see xid_to_str - sql_print_information("commit xid %s", xid_to_str(buf, info->list+i)); + int rc= +#endif + hton->commit_by_xid(hton, info->list+i); +#ifndef DBUG_OFF + if (rc == 0) + { + char buf[XIDDATASIZE*4+6]; // see xid_to_str + DBUG_PRINT("info", ("commit xid %s", xid_to_str(buf, info->list+i))); + } #endif - hton->commit_by_xid(hton, info->list+i); } else { #ifndef DBUG_OFF - char buf[XIDDATASIZE*4+6]; // see xid_to_str - sql_print_information("rollback xid %s", - xid_to_str(buf, info->list+i)); + int rc= +#endif + hton->rollback_by_xid(hton, info->list+i); +#ifndef DBUG_OFF + if (rc == 0) + { + char buf[XIDDATASIZE*4+6]; // see xid_to_str + DBUG_PRINT("info", ("rollback xid %s", + xid_to_str(buf, info->list+i))); + } #endif - hton->rollback_by_xid(hton, info->list+i); } } if (got < info->len) @@ -1904,7 +1933,8 @@ int ha_recover(HASH *commit_list) /* commit_list and tc_heuristic_recover cannot be set both */ DBUG_ASSERT(info.commit_list==0 || tc_heuristic_recover==0); /* if either is set, total_ha_2pc must be set too */ - DBUG_ASSERT(info.dry_run || total_ha_2pc>(ulong)opt_bin_log); + DBUG_ASSERT(info.dry_run || + (failed_ha_2pc + total_ha_2pc) > (ulong)opt_bin_log); if (total_ha_2pc <= (ulong)opt_bin_log) DBUG_RETURN(0); @@ -2015,44 +2045,6 @@ commit_checkpoint_notify_ha(handlerton *hton, void *cookie) } -/** - @details - This function should be called when MySQL sends rows of a SELECT result set - or the EOF mark to the client. It releases a possible adaptive hash index - S-latch held by thd in InnoDB and also releases a possible InnoDB query - FIFO ticket to enter InnoDB. To save CPU time, InnoDB allows a thd to - keep them over several calls of the InnoDB handler interface when a join - is executed. But when we let the control to pass to the client they have - to be released because if the application program uses mysql_use_result(), - it may deadlock on the S-latch if the application on another connection - performs another SQL query. In MySQL-4.1 this is even more important because - there a connection can have several SELECT queries open at the same time. - - @param thd the thread handle of the current connection - - @return - always 0 -*/ - -int ha_release_temporary_latches(THD *thd) -{ - Ha_trx_info *info; - - /* - Note that below we assume that only transactional storage engines - may need release_temporary_latches(). If this will ever become false, - we could iterate on thd->open_tables instead (and remove duplicates - as if (!seen[hton->slot]) { seen[hton->slot]=1; ... }). - */ - for (info= thd->transaction.stmt.ha_list; info; info= info->next()) - { - handlerton *hton= info->ht(); - if (hton && hton->release_temporary_latches) - hton->release_temporary_latches(hton, thd); - } - return 0; -} - /** Check if all storage engines used in transaction agree that after rollback to savepoint it is safe to release MDL locks acquired after @@ -3383,6 +3375,12 @@ void handler::print_error(int error, myf errflag) DBUG_ENTER("handler::print_error"); DBUG_PRINT("enter",("error: %d",error)); + if (ha_thd()->transaction_rollback_request) + { + /* Ensure this becomes a true error */ + errflag&= ~(ME_JUST_WARNING | ME_JUST_INFO); + } + int textno= -1; // impossible value switch (error) { case EACCES: @@ -3528,10 +3526,14 @@ void handler::print_error(int error, myf errflag) textno=ER_LOCK_TABLE_FULL; break; case HA_ERR_LOCK_DEADLOCK: - textno=ER_LOCK_DEADLOCK; - /* cannot continue. the statement was already aborted in the engine */ - SET_FATAL_ERROR; - break; + { + String str, full_err_msg(ER_DEFAULT(ER_LOCK_DEADLOCK), system_charset_info); + + get_error_message(error, &str); + full_err_msg.append(str); + my_printf_error(ER_LOCK_DEADLOCK, "%s", errflag, full_err_msg.c_ptr_safe()); + DBUG_VOID_RETURN; + } case HA_ERR_READ_ONLY_TRANSACTION: textno=ER_READ_ONLY_TRANSACTION; break; @@ -4894,7 +4896,12 @@ static my_bool discover_handlerton(THD *thd, plugin_ref plugin, { if (error) { - DBUG_ASSERT(share->error); // tdc_lock_share needs that + if (!share->error) + { + share->error= OPEN_FRM_ERROR_ALREADY_ISSUED; + plugin_unlock(0, share->db_plugin); + } + /* report an error, unless it is "generic" and a more specific one was already reported @@ -5668,6 +5675,20 @@ bool handler::check_table_binlog_row_based_internal(bool binlog_row) table->file->partition_ht()->db_type != DB_TYPE_INNODB) || (thd->wsrep_ignore_table == true))) return 0; + + /* enforce wsrep_max_ws_rows */ + if (WSREP(thd) && table->s->tmp_table == NO_TMP_TABLE) + { + thd->wsrep_affected_rows++; + if (wsrep_max_ws_rows && + thd->wsrep_exec_mode != REPL_RECV && + thd->wsrep_affected_rows > wsrep_max_ws_rows) + { + trans_rollback_stmt(thd) || trans_rollback(thd); + my_message(ER_ERROR_DURING_COMMIT, "wsrep_max_ws_rows exceeded", MYF(0)); + return ER_ERROR_DURING_COMMIT; + } + } #endif return (table->s->cached_row_logging_check && @@ -5878,7 +5899,7 @@ int handler::ha_external_lock(THD *thd, int lock_type) DBUG_EXECUTE_IF("external_lock_failure", error= HA_ERR_GENERIC;); - if (error == 0) + if (error == 0 || lock_type == F_UNLCK) { m_lock_type= lock_type; cached_table_flags= table_flags(); diff --git a/sql/handler.h b/sql/handler.h index 7750c8ad7fb..d021edf28d2 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -1211,7 +1211,6 @@ struct handlerton enum_binlog_command binlog_command, const char *query, uint query_length, const char *db, const char *table_name); - int (*release_temporary_latches)(handlerton *hton, THD *thd); /* Get log status. @@ -1466,16 +1465,30 @@ struct THD_TRANS static unsigned int const CREATED_TEMP_TABLE= 0x02; static unsigned int const DROPPED_TEMP_TABLE= 0x04; static unsigned int const DID_WAIT= 0x08; + static unsigned int const DID_DDL= 0x10; void mark_created_temp_table() { DBUG_PRINT("debug", ("mark_created_temp_table")); m_unsafe_rollback_flags|= CREATED_TEMP_TABLE; } + void mark_dropped_temp_table() + { + DBUG_PRINT("debug", ("mark_dropped_temp_table")); + m_unsafe_rollback_flags|= DROPPED_TEMP_TABLE; + } + bool has_created_dropped_temp_table() const { + return + (m_unsafe_rollback_flags & (CREATED_TEMP_TABLE|DROPPED_TEMP_TABLE)) != 0; + } void mark_trans_did_wait() { m_unsafe_rollback_flags|= DID_WAIT; } bool trans_did_wait() const { return (m_unsafe_rollback_flags & DID_WAIT) != 0; } + void mark_trans_did_ddl() { m_unsafe_rollback_flags|= DID_DDL; } + bool trans_did_ddl() const { + return (m_unsafe_rollback_flags & DID_DDL) != 0; + } }; @@ -4282,9 +4295,6 @@ int ha_change_key_cache_param(KEY_CACHE *key_cache); int ha_repartition_key_cache(KEY_CACHE *key_cache); int ha_change_key_cache(KEY_CACHE *old_key_cache, KEY_CACHE *new_key_cache); -/* report to InnoDB that control passes to the client */ -int ha_release_temporary_latches(THD *thd); - /* transactions: interface to handlerton functions */ int ha_start_consistent_snapshot(THD *thd); int ha_commit_or_rollback_by_xid(XID *xid, bool commit); diff --git a/sql/init.h b/sql/init.h index 88cd8e6e178..af2621e5e70 100644 --- a/sql/init.h +++ b/sql/init.h @@ -19,6 +19,6 @@ #include "my_global.h" /* ulong */ void unireg_init(ulong options); -void unireg_end(void) __attribute__((noreturn)); +ATTRIBUTE_NORETURN void unireg_end(void); #endif /* INIT_INCLUDED */ diff --git a/sql/innodb_priv.h b/sql/innodb_priv.h index ec85aa352f8..27aa9ac8645 100644 --- a/sql/innodb_priv.h +++ b/sql/innodb_priv.h @@ -28,6 +28,7 @@ void localtime_to_TIME(MYSQL_TIME *to, struct tm *from); uint strconvert(CHARSET_INFO *from_cs, const char *from, uint from_length, CHARSET_INFO *to_cs, char *to, uint to_length, uint *errors); + void sql_print_error(const char *format, ...); #define thd_binlog_pos(X, Y, Z) mysql_bin_log_commit_pos(X, Z, Y) diff --git a/sql/item.cc b/sql/item.cc index 579b6539fb4..d4c860a009c 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2016, Oracle and/or its affiliates. - Copyright (c) 2010, 2016, MariaDB + Copyright (c) 2010, 2017, MariaDB Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -494,8 +494,7 @@ Item::Item(THD *thd): { enum_parsing_place place= thd->lex->current_select->parsing_place; - if (place == SELECT_LIST || - place == IN_HAVING) + if (place == SELECT_LIST || place == IN_HAVING) thd->lex->current_select->select_n_having_items++; } } @@ -757,6 +756,7 @@ Item_ident::Item_ident(THD *thd, Name_resolution_context *context_arg, cached_table(0), depended_from(0), can_be_depended(TRUE) { name = (char*) field_name_arg; + name_length= name ? strlen(name) : 0; } @@ -770,6 +770,7 @@ Item_ident::Item_ident(THD *thd, TABLE_LIST *view_arg, const char *field_name_ar cached_table(NULL), depended_from(NULL), can_be_depended(TRUE) { name = (char*) field_name_arg; + name_length= name ? strlen(name) : 0; } @@ -1445,9 +1446,9 @@ static inline void mark_unsupported_func(const char *where, const char *processor_name) { char buff[64]; - sprintf(buff, "%s::%s", where ? where: "", processor_name); + my_snprintf(buff, sizeof(buff), "%s::%s", where ? where: "", processor_name); DBUG_ENTER(buff); - sprintf(buff, "%s returns TRUE: unsupported function", processor_name); + my_snprintf(buff, sizeof(buff), "%s returns TRUE: unsupported function", processor_name); DBUG_PRINT("info", ("%s", buff)); DBUG_VOID_RETURN; } @@ -1920,6 +1921,9 @@ void Item::split_sum_func2(THD *thd, Ref_ptr_array ref_pointer_array, point to the temporary table. */ split_sum_func(thd, ref_pointer_array, fields, split_flags); + if (type() == FUNC_ITEM) { + return; + } } else { @@ -1979,9 +1983,6 @@ void Item::split_sum_func2(THD *thd, Ref_ptr_array ref_pointer_array, &ref_pointer_array[el], 0, name)))) return; // fatal_error is set } - else if (type() == FUNC_ITEM && - ((Item_func *) this)->with_window_func) - return; else { if (!(item_ref= (new (thd->mem_root) @@ -2670,22 +2671,21 @@ void Item_ident::print(String *str, enum_query_type query_type) use_db_name= !(cached_table && cached_table->belong_to_view && cached_table->belong_to_view->compact_view_format); - if (!use_db_name && use_table_name && - (query_type & QT_ITEM_IDENT_SKIP_TABLE_NAMES)) + if (use_table_name && (query_type & QT_ITEM_IDENT_SKIP_TABLE_NAMES)) { /* Don't print the table name if it's the only table in the context XXX technically, that's a sufficient, but too strong condition */ if (!context) - use_table_name= false; + use_db_name= use_table_name= false; else if (context->outer_context) use_table_name= true; else if (context->last_name_resolution_table == context->first_name_resolution_table) - use_table_name= false; + use_db_name= use_table_name= false; else if (!context->last_name_resolution_table && !context->first_name_resolution_table->next_name_resolution_table) - use_table_name= false; + use_db_name= use_table_name= false; } if (!field_name || !field_name[0]) @@ -3346,7 +3346,7 @@ Item_param::Item_param(THD *thd, uint pos_in_query_arg): state(NO_VALUE), /* Don't pretend to be a literal unless value for this item is set. */ item_type(PARAM_ITEM), - indicators(0), indicator(STMT_INDICATOR_NONE), + indicator(STMT_INDICATOR_NONE), set_param_func(default_set_param_func), m_out_param_info(NULL), /* @@ -4816,7 +4816,7 @@ static Item** find_field_in_group_list(Item *find_item, ORDER *group_list) int cur_match_degree= 0; /* SELECT list element with explicit alias */ - if ((*(cur_group->item))->name && + if ((*(cur_group->item))->name && !table_name && !(*(cur_group->item))->is_autogenerated_name && !my_strcasecmp(system_charset_info, (*(cur_group->item))->name, field_name)) @@ -5237,6 +5237,12 @@ Item_field::fix_outer_field(THD *thd, Field **from_field, Item **reference) ((ref_type == REF_ITEM || ref_type == FIELD_ITEM) ? (Item_ident*) (*reference) : 0)); + if (thd->lex->in_sum_func && + thd->lex->in_sum_func->nest_level >= select->nest_level) + { + set_if_bigger(thd->lex->in_sum_func->max_arg_level, + select->nest_level); + } /* A reference to a view field had been found and we substituted it instead of this Item (find_field_in_tables @@ -5512,7 +5518,7 @@ bool Item_field::fix_fields(THD *thd, Item **reference) SELECT_LEX *select= thd->lex->current_select; thd->change_item_tree(reference, - select->parsing_place == IN_GROUP_BY && + select->context_analysis_place == IN_GROUP_BY && alias_name_used ? *rf->ref : rf); /* @@ -5976,7 +5982,7 @@ String_copier_for_item::copy_with_warn(CHARSET_INFO *dstcs, String *dst, srccs == &my_charset_bin ? dstcs->csname : srccs->csname, err.ptr()); - return m_thd->is_strict_mode(); + return false; } if (const char *pos= cannot_convert_error_pos()) { @@ -5988,7 +5994,7 @@ String_copier_for_item::copy_with_warn(CHARSET_INFO *dstcs, String *dst, ER_CANNOT_CONVERT_CHARACTER, ER_THD(m_thd, ER_CANNOT_CONVERT_CHARACTER), srccs->csname, buf, dstcs->csname); - return m_thd->is_strict_mode(); + return false; } return false; } @@ -6179,7 +6185,7 @@ Field *Item::tmp_table_field_from_field_type(TABLE *table, Field_string(max_length, maybe_null, name, collation.collation); break; } - /* Fall through to make_string_field() */ + /* Fall through */ case MYSQL_TYPE_ENUM: case MYSQL_TYPE_SET: case MYSQL_TYPE_VAR_STRING: @@ -7120,121 +7126,181 @@ Item *Item_field::update_value_transformer(THD *thd, uchar *select_arg) } -Item *Item_field::derived_field_transformer_for_having(THD *thd, uchar *arg) +static +Item *get_field_item_for_having(THD *thd, Item *item, st_select_lex *sel) { - st_select_lex *sl= (st_select_lex *)arg; - table_map map= sl->master_unit()->derived->table->map; - if (!((Item_field*)this)->item_equal) - { - if (used_tables() == map) - { - Item_ref *rf= - new (thd->mem_root) Item_ref(thd, &sl->context, - NullS, NullS, - ((Item_field*) this)->field_name); - if (!rf) - return 0; - return rf; - } - } + DBUG_ASSERT(item->type() == Item::FIELD_ITEM || + (item->type() == Item::REF_ITEM && + ((Item_ref *) item)->ref_type() == Item_ref::VIEW_REF)); + Item_field *field_item= NULL; + table_map map= sel->master_unit()->derived->table->map; + Item_equal *item_equal= item->get_item_equal(); + if (!item_equal) + field_item= (Item_field *)(item->real_item()); else { - Item_equal *cond= (Item_equal *) ((Item_field*)this)->item_equal; - Item_equal_fields_iterator li(*cond); - Item *item; - while ((item=li++)) + Item_equal_fields_iterator li(*item_equal); + Item *equal_item; + while ((equal_item= li++)) { - if (item->used_tables() == map && item->real_item()->type() == FIELD_ITEM) + if (equal_item->used_tables() == map) { - Item_ref *rf= - new (thd->mem_root) Item_ref(thd, &sl->context, - NullS, NullS, - ((Item_field*) (item->real_item()))->field_name); - if (!rf) - return 0; - return rf; + field_item= (Item_field *)(equal_item->real_item()); + break; } } } - return this; + if (field_item) + { + Item_ref *ref= new (thd->mem_root) Item_ref(thd, &sel->context, + NullS, NullS, + field_item->field_name); + return ref; + } + DBUG_ASSERT(0); + return NULL; } +Item *Item_field::derived_field_transformer_for_having(THD *thd, uchar *arg) +{ + st_select_lex *sel= (st_select_lex *)arg; + table_map tab_map= sel->master_unit()->derived->table->map; + if (item_equal && !(item_equal->used_tables() & tab_map)) + return this; + if (!item_equal && used_tables() != tab_map) + return this; + return get_field_item_for_having(thd, this, sel); +} + + +Item *Item_direct_view_ref::derived_field_transformer_for_having(THD *thd, + uchar *arg) +{ + st_select_lex *sel= (st_select_lex *)arg; + table_map tab_map= sel->master_unit()->derived->table->map; + if ((item_equal && !(item_equal->used_tables() & tab_map)) || + !item_equal) + return this; + return get_field_item_for_having(thd, this, sel); +} + + +static +Item *find_producing_item(Item *item, st_select_lex *sel) +{ + DBUG_ASSERT(item->type() == Item::FIELD_ITEM || + (item->type() == Item::REF_ITEM && + ((Item_ref *) item)->ref_type() == Item_ref::VIEW_REF)); + Item *producing_item; + Item_field *field_item= NULL; + Item_equal *item_equal= item->get_item_equal(); + table_map tab_map= sel->master_unit()->derived->table->map; + if (item->used_tables() == tab_map) + field_item= (Item_field *) (item->real_item()); + if (!field_item && item_equal) + { + Item_equal_fields_iterator it(*item_equal); + Item *equal_item; + while ((equal_item= it++)) + { + if (equal_item->used_tables() == tab_map) + { + field_item= (Item_field *) (equal_item->real_item()); + break; + } + } + } + List_iterator_fast li(sel->item_list); + if (field_item) + { + uint field_no= field_item->field->field_index; + for (uint i= 0; i <= field_no; i++) + producing_item= li++; + return producing_item; + } + return NULL; +} + Item *Item_field::derived_field_transformer_for_where(THD *thd, uchar *arg) { - Item *producing_item; - st_select_lex *sl= (st_select_lex *)arg; - List_iterator_fast li(sl->item_list); - table_map map= sl->master_unit()->derived->table->map; - if (used_tables() == map) - { - uint field_no= ((Item_field*) this)->field->field_index; - for (uint i= 0; i <= field_no; i++) - producing_item= li++; + st_select_lex *sel= (st_select_lex *)arg; + Item *producing_item= find_producing_item(this, sel); + if (producing_item) return producing_item->build_clone(thd, thd->mem_root); - } - else if (((Item_field*)this)->item_equal) + return this; +} + +Item *Item_direct_view_ref::derived_field_transformer_for_where(THD *thd, + uchar *arg) +{ + if (item_equal) { - Item_equal *cond= (Item_equal *) ((Item_field*)this)->item_equal; - Item_equal_fields_iterator it(*cond); - Item *item; - while ((item=it++)) - { - if (item->used_tables() == map && item->real_item()->type() == FIELD_ITEM) - { - Item_field *field_item= (Item_field *) (item->real_item()); - li.rewind(); - uint field_no= field_item->field->field_index; - for (uint i= 0; i <= field_no; i++) - producing_item= li++; - return producing_item->build_clone(thd, thd->mem_root); - } - } + st_select_lex *sel= (st_select_lex *)arg; + Item *producing_item= find_producing_item(this, sel); + DBUG_ASSERT (producing_item != NULL); + return producing_item->build_clone(thd, thd->mem_root); } return this; } +static +Grouping_tmp_field *find_matching_grouping_field(Item *item, + st_select_lex *sel) +{ + DBUG_ASSERT(item->type() == Item::FIELD_ITEM || + (item->type() == Item::REF_ITEM && + ((Item_ref *) item)->ref_type() == Item_ref::VIEW_REF)); + List_iterator li(sel->grouping_tmp_fields); + Grouping_tmp_field *gr_field; + Item_field *field_item= (Item_field *) (item->real_item()); + while ((gr_field= li++)) + { + if (field_item->field == gr_field->tmp_field) + return gr_field; + } + Item_equal *item_equal= item->get_item_equal(); + if (item_equal) + { + Item_equal_fields_iterator it(*item_equal); + Item *equal_item; + while ((equal_item= it++)) + { + field_item= (Item_field *) (equal_item->real_item()); + li.rewind(); + while ((gr_field= li++)) + { + if (field_item->field == gr_field->tmp_field) + return gr_field; + } + } + } + return NULL; +} + Item *Item_field::derived_grouping_field_transformer_for_where(THD *thd, uchar *arg) { - st_select_lex *sl= (st_select_lex *)arg; - List_iterator li(sl->grouping_tmp_fields); - Grouping_tmp_field *field; - table_map map= sl->master_unit()->derived->table->map; - if (used_tables() == map) - { - while ((field=li++)) - { - if (((Item_field*) this)->field == field->tmp_field) - return field->producing_item->build_clone(thd, thd->mem_root); - } - } - else if (((Item_field*)this)->item_equal) - { - Item_equal *cond= (Item_equal *) ((Item_field*)this)->item_equal; - Item_equal_fields_iterator it(*cond); - Item *item; - while ((item=it++)) - { - if (item->used_tables() == map && item->real_item()->type() == FIELD_ITEM) - { - Item_field *field_item= (Item_field *) (item->real_item()); - li.rewind(); - while ((field=li++)) - { - if (field_item->field == field->tmp_field) - { - return field->producing_item->build_clone(thd, thd->mem_root); - } - } - } - } - } + st_select_lex *sel= (st_select_lex *)arg; + Grouping_tmp_field *gr_field= find_matching_grouping_field(this, sel); + if (gr_field) + return gr_field->producing_item->build_clone(thd, thd->mem_root); return this; } +Item * +Item_direct_view_ref::derived_grouping_field_transformer_for_where(THD *thd, + uchar *arg) +{ + if (!item_equal) + return this; + st_select_lex *sel= (st_select_lex *)arg; + Grouping_tmp_field *gr_field= find_matching_grouping_field(this, sel); + return gr_field->producing_item->build_clone(thd, thd->mem_root); +} + void Item_field::print(String *str, enum_query_type query_type) { if (field && field->table->const_table && @@ -8702,6 +8768,32 @@ Item *Item_direct_view_ref::replace_equal_field(THD *thd, uchar *arg) } +bool Item_direct_view_ref::excl_dep_on_table(table_map tab_map) +{ + table_map used= used_tables(); + if (used & OUTER_REF_TABLE_BIT) + return false; + if (!(used & ~tab_map)) + return true; + if (item_equal) + { + DBUG_ASSERT(real_item()->type() == Item::FIELD_ITEM); + return item_equal->used_tables() & tab_map; + } + return (*ref)->excl_dep_on_table(tab_map); +} + +bool Item_direct_view_ref::excl_dep_on_grouping_fields(st_select_lex *sel) +{ + if (item_equal) + { + DBUG_ASSERT(real_item()->type() == Item::FIELD_ITEM); + return find_matching_grouping_field(this, sel) != NULL; + } + return (*ref)->excl_dep_on_grouping_fields(sel); +} + + bool Item_default_value::eq(const Item *item, bool binary_cmp) const { return item->type() == DEFAULT_VALUE_ITEM && @@ -10036,7 +10128,8 @@ void Item_cache_row::set_null() Item_type_holder::Item_type_holder(THD *thd, Item *item) :Item(thd, item), Type_handler_hybrid_real_field_type(get_real_type(item)), - enum_set_typelib(0) + enum_set_typelib(0), + geometry_type(Field::GEOM_GEOMETRY) { DBUG_ASSERT(item->fixed); maybe_null= item->maybe_null; @@ -10612,46 +10705,16 @@ const char *dbug_print_unit(SELECT_LEX_UNIT *un) #endif /*DBUG_OFF*/ -bool Item_field::exclusive_dependence_on_table_processor(void *map) +bool Item_field::excl_dep_on_table(table_map tab_map) { - table_map tab_map= *((table_map *) map); - return !((used_tables() == tab_map || - (item_equal && item_equal->used_tables() & tab_map))); + return used_tables() == tab_map || + (item_equal && (item_equal->used_tables() & tab_map)); } -bool Item_field::exclusive_dependence_on_grouping_fields_processor(void *arg) +bool +Item_field::excl_dep_on_grouping_fields(st_select_lex *sel) { - st_select_lex *sl= (st_select_lex *)arg; - List_iterator li(sl->grouping_tmp_fields); - Grouping_tmp_field *field; - table_map map= sl->master_unit()->derived->table->map; - if (used_tables() == map) - { - while ((field=li++)) - { - if (((Item_field*) this)->field == field->tmp_field) - return false; - } - } - else if (((Item_field*)this)->item_equal) - { - Item_equal *cond= (Item_equal *) ((Item_field*)this)->item_equal; - Item_equal_fields_iterator it(*cond); - Item *item; - while ((item=it++)) - { - if (item->used_tables() == map && item->real_item()->type() == FIELD_ITEM) - { - li.rewind(); - while ((field=li++)) - { - if (((Item_field *)(item->real_item()))->field == field->tmp_field) - return false; - } - } - } - } - return true; + return find_matching_grouping_field(this, sel) != NULL; } void Item::register_in(THD *thd) @@ -10659,14 +10722,3 @@ void Item::register_in(THD *thd) next= thd->free_list; thd->free_list= this; } - -void Virtual_column_info::print(String *str) -{ - expr->print_parenthesised(str, - (enum_query_type)(QT_ITEM_ORIGINAL_FUNC_NULLIF | - QT_ITEM_IDENT_SKIP_DB_NAMES | - QT_ITEM_IDENT_SKIP_TABLE_NAMES | - QT_NO_DATA_EXPANSION | - QT_TO_SYSTEM_CHARSET), - LOWEST_PRECEDENCE); -} diff --git a/sql/item.h b/sql/item.h index 42e9fd94331..3bf1fd1113c 100644 --- a/sql/item.h +++ b/sql/item.h @@ -587,8 +587,7 @@ class Item_func_not; class Item_splocal; /** - String_copier that honors the current sql_mode (strict vs non strict) - and can send warnings. + String_copier that sends Item specific warnings. */ class String_copier_for_item: public String_copier { @@ -994,25 +993,20 @@ public: store return value of this method. NOTE - Buffer passed via argument should only be used if the item itself - doesn't have an own String buffer. In case when the item maintains - it's own string buffer, it's preferable to return it instead to - minimize number of mallocs/memcpys. - The caller of this method can modify returned string, but only in case - when it was allocated on heap, (is_alloced() is true). This allows - the caller to efficiently use a buffer allocated by a child without - having to allocate a buffer of it's own. The buffer, given to - val_str() as argument, belongs to the caller and is later used by the - caller at it's own choosing. - A few implications from the above: - - unless you return a string object which only points to your buffer - but doesn't manages it you should be ready that it will be - modified. - - even for not allocated strings (is_alloced() == false) the caller - can change charset (see Item_func_{typecast/binary}. XXX: is this - a bug? - - still you should try to minimize data copying and return internal - object whenever possible. + The caller can modify the returned String, if it's not marked + "const" (with the String::mark_as_const() method). That means that + if the item returns its own internal buffer (e.g. tmp_value), it + *must* be marked "const" [1]. So normally it's preferrable to + return the result value in the String, that was passed as an + argument. But, for example, SUBSTR() returns a String that simply + points into the buffer of SUBSTR()'s args[0]->val_str(). Such a + String is always "const", so it's ok to use tmp_value for that and + avoid reallocating/copying of the argument String. + + [1] consider SELECT CONCAT(f, ":", f) FROM (SELECT func() AS f); + here the return value of f() is used twice in the top-level + select, and if they share the same tmp_value buffer, modifying the + first one will implicitly modify the second too. RETURN In case of NULL value return 0 (NULL pointer) and set null_value flag @@ -1292,6 +1286,24 @@ public: virtual enum precedence precedence() const { return DEFAULT_PRECEDENCE; } void print_parenthesised(String *str, enum_query_type query_type, enum precedence parent_prec); + /** + This helper is used to print expressions as a part of a table definition, + in particular for + - generated columns + - check constraints + - default value expressions + - partitioning expressions + */ + void print_for_table_def(String *str) + { + print_parenthesised(str, + (enum_query_type)(QT_ITEM_ORIGINAL_FUNC_NULLIF | + QT_ITEM_IDENT_SKIP_DB_NAMES | + QT_ITEM_IDENT_SKIP_TABLE_NAMES | + QT_NO_DATA_EXPANSION | + QT_TO_SYSTEM_CHARSET), + LOWEST_PRECEDENCE); + } virtual void print(String *str, enum_query_type query_type); void print_item_w_name(String *str, enum_query_type query_type); void print_value(String *str); @@ -1580,8 +1592,20 @@ public: virtual bool limit_index_condition_pushdown_processor(void *arg) { return 0; } virtual bool exists2in_processor(void *arg) { return 0; } virtual bool find_selective_predicates_list_processor(void *arg) { return 0; } - virtual bool exclusive_dependence_on_table_processor(void *arg) { return 0; } - virtual bool exclusive_dependence_on_grouping_fields_processor(void *arg) { return 0; } + + /* + TRUE if the expression depends only on the table indicated by tab_map + or can be converted to such an exression using equalities. + Not to be used for AND/OR formulas. + */ + virtual bool excl_dep_on_table(table_map tab_map) { return false; } + /* + TRUE if the expression depends only on grouping fields of sel + or can be converted to such an exression using equalities. + Not to be used for AND/OR formulas. + */ + virtual bool excl_dep_on_grouping_fields(st_select_lex *sel) { return false; } + virtual bool switch_to_nullable_fields_processor(void *arg) { return 0; } virtual bool find_function_processor (void *arg) { return 0; } /* @@ -1741,7 +1765,7 @@ public: { return this; } virtual bool expr_cache_is_needed(THD *) { return FALSE; } virtual Item *safe_charset_converter(THD *thd, CHARSET_INFO *tocs); - bool needs_charset_converter(uint32 length, CHARSET_INFO *tocs) + bool needs_charset_converter(uint32 length, CHARSET_INFO *tocs) const { /* This will return "true" if conversion happens: @@ -2633,8 +2657,8 @@ public: Item *derived_field_transformer_for_where(THD *thd, uchar *arg); Item *derived_grouping_field_transformer_for_where(THD *thd, uchar *arg); virtual void print(String *str, enum_query_type query_type); - bool exclusive_dependence_on_table_processor(void *map); - bool exclusive_dependence_on_grouping_fields_processor(void *arg); + bool excl_dep_on_table(table_map tab_map); + bool excl_dep_on_grouping_fields(st_select_lex *sel); bool cleanup_excluding_fields_processor(void *arg) { return field ? 0 : cleanup_processor(arg); } bool cleanup_excluding_const_fields_processor(void *arg) @@ -2873,10 +2897,8 @@ public: }; /* - Used for bulk protocol. Indicates if we should expect - indicators byte before value of the parameter + Used for bulk protocol only. */ - my_bool indicators; enum enum_indicator_type indicator; /* @@ -3855,6 +3877,28 @@ protected: } bool transform_args(THD *thd, Item_transformer transformer, uchar *arg); void propagate_equal_fields(THD *, const Item::Context &, COND_EQUAL *); + bool excl_dep_on_table(table_map tab_map) + { + for (uint i= 0; i < arg_count; i++) + { + if (args[i]->const_item()) + continue; + if (!args[i]->excl_dep_on_table(tab_map)) + return false; + } + return true; + } + bool excl_dep_on_grouping_fields(st_select_lex *sel) + { + for (uint i= 0; i < arg_count; i++) + { + if (args[i]->const_item()) + continue; + if (!args[i]->excl_dep_on_grouping_fields(sel)) + return false; + } + return true; + } public: Item_args(void) :args(NULL), arg_count(0) @@ -4323,10 +4367,15 @@ public: } Item *get_copy(THD *thd, MEM_ROOT *mem_root) { return get_item_copy(thd, mem_root, this); } - bool exclusive_dependence_on_table_processor(void *map) - { return depended_from != NULL; } - bool exclusive_dependence_on_grouping_fields_processor(void *arg) - { return depended_from != NULL; } + bool excl_dep_on_table(table_map tab_map) + { + table_map used= used_tables(); + if (used & OUTER_REF_TABLE_BIT) + return false; + return (used == tab_map) || (*ref)->excl_dep_on_table(tab_map); + } + bool excl_dep_on_grouping_fields(st_select_lex *sel) + { return (*ref)->excl_dep_on_grouping_fields(sel); } bool cleanup_excluding_fields_processor(void *arg) { Item *item= real_item(); @@ -4623,13 +4672,20 @@ public: return (*ref)->walk(processor, walk_subquery, arg) || (this->*processor)(arg); } - bool view_used_tables_processor(void *arg) + bool view_used_tables_processor(void *arg) { TABLE_LIST *view_arg= (TABLE_LIST *) arg; if (view_arg == view) view_arg->view_used_tables|= (*ref)->used_tables(); return 0; } + bool excl_dep_on_table(table_map tab_map); + bool excl_dep_on_grouping_fields(st_select_lex *sel); + Item *derived_field_transformer_for_having(THD *thd, uchar *arg); + Item *derived_field_transformer_for_where(THD *thd, uchar *arg); + Item *derived_grouping_field_transformer_for_where(THD *thd, + uchar *arg); + void save_val(Field *to) { if (check_null_ref()) @@ -4711,6 +4767,8 @@ public: item_equal= NULL; Item_direct_ref::cleanup(); } + Item *get_copy(THD *thd, MEM_ROOT *mem_root) + { return get_item_copy(thd, mem_root, this); } }; @@ -5931,4 +5989,9 @@ inline bool Virtual_column_info::is_equal(const Virtual_column_info* vcol) const && expr->eq(vcol->expr, true); } +inline void Virtual_column_info::print(String* str) +{ + expr->print_for_table_def(str); +} + #endif /* SQL_ITEM_INCLUDED */ diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 689ce656d60..31cd4e67338 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -627,6 +627,21 @@ int Arg_comparator::set_cmp_func(Item_func_or_sum *owner_arg, */ if (owner->agg_arg_charsets_for_comparison(&m_compare_collation, a, b)) return 1; + + if ((*a)->type() == Item::FUNC_ITEM && + ((Item_func *) (*a))->functype() == Item_func::JSON_EXTRACT_FUNC) + { + func= is_owner_equal_func() ? &Arg_comparator::compare_e_json_str: + &Arg_comparator::compare_json_str; + return 0; + } + else if ((*b)->type() == Item::FUNC_ITEM && + ((Item_func *) (*b))->functype() == Item_func::JSON_EXTRACT_FUNC) + { + func= is_owner_equal_func() ? &Arg_comparator::compare_e_json_str: + &Arg_comparator::compare_str_json; + return 0; + } } if (m_compare_type == TIME_RESULT) @@ -1160,6 +1175,30 @@ int Arg_comparator::compare_e_row() } +int Arg_comparator::compare_json_str() +{ + return compare_json_str_basic(*a, *b); +} + + +int Arg_comparator::compare_str_json() +{ + return -compare_json_str_basic(*b, *a); +} + + +int Arg_comparator::compare_e_json_str() +{ + return compare_e_json_str_basic(*a, *b); +} + + +int Arg_comparator::compare_e_str_json() +{ + return compare_e_json_str_basic(*b, *a); +} + + void Item_func_truth::fix_length_and_dec() { maybe_null= 0; @@ -5359,6 +5398,15 @@ int Regexp_processor_pcre::default_regex_flags() return default_regex_flags_pcre(current_thd); } +void Regexp_processor_pcre::set_recursion_limit(THD *thd) +{ + long stack_used; + DBUG_ASSERT(thd == current_thd); + stack_used= available_stack_size(thd->thread_stack, &stack_used); + m_pcre_extra.match_limit_recursion= + (my_thread_stack_size - STACK_MIN_SIZE - stack_used)/my_pcre_frame_size; +} + /** Convert string to lib_charset, if needed. @@ -5399,9 +5447,8 @@ bool Regexp_processor_pcre::compile(String *pattern, bool send_error) { if (!stringcmp(pattern, &m_prev_pattern)) return false; + cleanup(); m_prev_pattern.copy(*pattern); - pcre_free(m_pcre); - m_pcre= NULL; } if (!(pattern= convert_if_needed(pattern, &pattern_converter))) @@ -5450,15 +5497,77 @@ void Regexp_processor_pcre::pcre_exec_warn(int rc) const */ switch (rc) { + case PCRE_ERROR_NULL: + errmsg= "pcre_exec: null arguement passed"; + break; + case PCRE_ERROR_BADOPTION: + errmsg= "pcre_exec: bad option"; + break; + case PCRE_ERROR_BADMAGIC: + errmsg= "pcre_exec: bad magic - not a compiled regex"; + break; + case PCRE_ERROR_UNKNOWN_OPCODE: + errmsg= "pcre_exec: error in compiled regex"; + break; case PCRE_ERROR_NOMEMORY: errmsg= "pcre_exec: Out of memory"; break; + case PCRE_ERROR_NOSUBSTRING: + errmsg= "pcre_exec: no substring"; + break; + case PCRE_ERROR_MATCHLIMIT: + errmsg= "pcre_exec: match limit exceeded"; + break; + case PCRE_ERROR_CALLOUT: + errmsg= "pcre_exec: callout error"; + break; case PCRE_ERROR_BADUTF8: errmsg= "pcre_exec: Invalid utf8 byte sequence in the subject string"; break; + case PCRE_ERROR_BADUTF8_OFFSET: + errmsg= "pcre_exec: Started at invalid location within utf8 byte sequence"; + break; + case PCRE_ERROR_PARTIAL: + errmsg= "pcre_exec: partial match"; + break; + case PCRE_ERROR_INTERNAL: + errmsg= "pcre_exec: internal error"; + break; + case PCRE_ERROR_BADCOUNT: + errmsg= "pcre_exec: ovesize is negative"; + break; + case PCRE_ERROR_RECURSIONLIMIT: + my_snprintf(buf, sizeof(buf), "pcre_exec: recursion limit of %ld exceeded", + m_pcre_extra.match_limit_recursion); + errmsg= buf; + break; + case PCRE_ERROR_BADNEWLINE: + errmsg= "pcre_exec: bad newline options"; + break; + case PCRE_ERROR_BADOFFSET: + errmsg= "pcre_exec: start offset negative or greater than string length"; + break; + case PCRE_ERROR_SHORTUTF8: + errmsg= "pcre_exec: ended in middle of utf8 sequence"; + break; + case PCRE_ERROR_JIT_STACKLIMIT: + errmsg= "pcre_exec: insufficient stack memory for JIT compile"; + break; case PCRE_ERROR_RECURSELOOP: errmsg= "pcre_exec: Recursion loop detected"; break; + case PCRE_ERROR_BADMODE: + errmsg= "pcre_exec: compiled pattern passed to wrong bit library function"; + break; + case PCRE_ERROR_BADENDIANNESS: + errmsg= "pcre_exec: compiled pattern passed to wrong endianness processor"; + break; + case PCRE_ERROR_JIT_BADOPTION: + errmsg= "pcre_exec: bad jit option"; + break; + case PCRE_ERROR_BADLENGTH: + errmsg= "pcre_exec: negative length"; + break; default: /* As other error codes should normally not happen, @@ -5494,8 +5603,8 @@ int Regexp_processor_pcre::pcre_exec_with_warn(const pcre *code, bool Regexp_processor_pcre::exec(const char *str, int length, int offset) { - m_pcre_exec_rc= pcre_exec_with_warn(m_pcre, NULL, str, length, offset, 0, - m_SubStrVec, m_subpatterns_needed * 3); + m_pcre_exec_rc= pcre_exec_with_warn(m_pcre, &m_pcre_extra, str, length, offset, 0, + m_SubStrVec, array_elements(m_SubStrVec)); return false; } @@ -5505,10 +5614,10 @@ bool Regexp_processor_pcre::exec(String *str, int offset, { if (!(str= convert_if_needed(str, &subject_converter))) return true; - m_pcre_exec_rc= pcre_exec_with_warn(m_pcre, NULL, + m_pcre_exec_rc= pcre_exec_with_warn(m_pcre, &m_pcre_extra, str->c_ptr_safe(), str->length(), offset, 0, - m_SubStrVec, m_subpatterns_needed * 3); + m_SubStrVec, array_elements(m_SubStrVec)); if (m_pcre_exec_rc > 0) { uint i; @@ -5558,6 +5667,12 @@ void Regexp_processor_pcre::fix_owner(Item_func *owner, } +bool Item_func_regex::fix_fields(THD *thd, Item **ref) +{ + re.set_recursion_limit(thd); + return Item_bool_func::fix_fields(thd, ref); +} + void Item_func_regex::fix_length_and_dec() { @@ -5566,7 +5681,7 @@ Item_func_regex::fix_length_and_dec() if (agg_arg_charsets_for_comparison(cmp_collation, args, 2)) return; - re.init(cmp_collation.collation, 0, 0); + re.init(cmp_collation.collation, 0); re.fix_owner(this, args[0], args[1]); } @@ -5584,13 +5699,20 @@ longlong Item_func_regex::val_int() } +bool Item_func_regexp_instr::fix_fields(THD *thd, Item **ref) +{ + re.set_recursion_limit(thd); + return Item_int_func::fix_fields(thd, ref); +} + + void Item_func_regexp_instr::fix_length_and_dec() { if (agg_arg_charsets_for_comparison(cmp_collation, args, 2)) return; - re.init(cmp_collation.collation, 0, 1); + re.init(cmp_collation.collation, 0); re.fix_owner(this, args[0], args[1]); } diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index 9c277220771..ceca57264b7 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -106,6 +106,12 @@ public: int compare_e_datetime() { return compare_e_temporal(MYSQL_TYPE_DATETIME); } int compare_time() { return compare_temporal(MYSQL_TYPE_TIME); } int compare_e_time() { return compare_e_temporal(MYSQL_TYPE_TIME); } + int compare_json_str_basic(Item *j, Item *s); + int compare_json_str(); + int compare_str_json(); + int compare_e_json_str_basic(Item *j, Item *s); + int compare_e_json_str(); + int compare_e_str_json(); Item** cache_converted_constant(THD *thd, Item **value, Item **cache, Item_result type); @@ -1770,11 +1776,6 @@ public: Item_func_isnull(THD *thd, Item *a): Item_func_null_predicate(thd, a) {} longlong val_int(); enum Functype functype() const { return ISNULL_FUNC; } - void fix_length_and_dec() - { - Item_func_null_predicate::fix_length_and_dec(); - update_used_tables(); - } const char *func_name() const { return "isnull"; } void print(String *str, enum_query_type query_type); enum precedence precedence() const { return CMP_PRECEDENCE; } @@ -2011,6 +2012,7 @@ public: class Regexp_processor_pcre { pcre *m_pcre; + pcre_extra m_pcre_extra; bool m_conversion_is_needed; bool m_is_const; int m_library_flags; @@ -2019,7 +2021,6 @@ class Regexp_processor_pcre String m_prev_pattern; int m_pcre_exec_rc; int m_SubStrVec[30]; - uint m_subpatterns_needed; void pcre_exec_warn(int rc) const; int pcre_exec_with_warn(const pcre *code, const pcre_extra *extra, const char *subject, int length, int startoffset, @@ -2033,11 +2034,14 @@ public: m_pcre(NULL), m_conversion_is_needed(true), m_is_const(0), m_library_flags(0), m_data_charset(&my_charset_utf8_general_ci), - m_library_charset(&my_charset_utf8_general_ci), - m_subpatterns_needed(0) - {} + m_library_charset(&my_charset_utf8_general_ci) + { + m_pcre_extra.flags= PCRE_EXTRA_MATCH_LIMIT_RECURSION; + m_pcre_extra.match_limit_recursion= 100L; + } int default_regex_flags(); - void init(CHARSET_INFO *data_charset, int extra_flags, uint nsubpatterns_arg) + void set_recursion_limit(THD *); + void init(CHARSET_INFO *data_charset, int extra_flags) { m_library_flags= default_regex_flags() | extra_flags | (data_charset != &my_charset_bin ? @@ -2051,7 +2055,6 @@ public: m_conversion_is_needed= (data_charset != &my_charset_bin) && !my_charset_same(data_charset, m_library_charset); - m_subpatterns_needed= nsubpatterns_arg; } void fix_owner(Item_func *owner, Item *subject_arg, Item *pattern_arg); bool compile(String *pattern, bool send_error); @@ -2077,14 +2080,15 @@ public: { return subpattern_end(n) - subpattern_start(n); } + void reset() + { + m_pcre= NULL; + m_prev_pattern.length(0); + } void cleanup() { - if (m_pcre) - { - pcre_free(m_pcre); - m_pcre= NULL; - } - m_prev_pattern.length(0); + pcre_free(m_pcre); + reset(); } bool is_compiled() const { return m_pcre != NULL; } bool is_const() const { return m_is_const; } @@ -2108,11 +2112,19 @@ public: DBUG_VOID_RETURN; } longlong val_int(); + bool fix_fields(THD *thd, Item **ref); void fix_length_and_dec(); const char *func_name() const { return "regexp"; } enum precedence precedence() const { return CMP_PRECEDENCE; } Item *get_copy(THD *thd, MEM_ROOT *mem_root) { return get_item_copy(thd, mem_root, this); } + Item *build_clone(THD *thd, MEM_ROOT *mem_root) + { + Item_func_regex *clone= (Item_func_regex*) Item_bool_func::build_clone(thd, mem_root); + if (clone) + clone->re.reset(); + return clone; + } void print(String *str, enum_query_type query_type) { @@ -2138,6 +2150,7 @@ public: DBUG_VOID_RETURN; } longlong val_int(); + bool fix_fields(THD *thd, Item **ref); void fix_length_and_dec(); const char *func_name() const { return "regexp_instr"; } Item *get_copy(THD *thd, MEM_ROOT *mem_root) @@ -2393,6 +2406,14 @@ public: void set_context_field(Item_field *ctx_field) { context_field= ctx_field; } void set_link_equal_fields(bool flag) { link_equal_fields= flag; } Item* get_copy(THD *thd, MEM_ROOT *mem_root) { return 0; } + /* + This does not comply with the specification of the virtual method, + but Item_equal items are processed distinguishly anyway + */ + bool excl_dep_on_table(table_map tab_map) + { + return used_tables() & tab_map; + } friend class Item_equal_fields_iterator; bool count_sargable_conds(void *arg); friend class Item_equal_iterator; diff --git a/sql/item_func.cc b/sql/item_func.cc index 903d792db75..f452b820090 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2000, 2015, Oracle and/or its affiliates. - Copyright (c) 2009, 2015, MariaDB + Copyright (c) 2009, 2017, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -153,8 +153,9 @@ void Item_func::sync_with_sum_func_and_with_field(List &list) is to allow all Item_field() objects to setup pointers to the table fields. Sets as a side effect the following class variables: - maybe_null Set if any argument may return NULL - with_sum_func Set if any of the arguments contains a sum function + maybe_null Set if any argument may return NULL + with_sum_func Set if any of the arguments contains a sum function + with_window_func Set if any of the arguments contain a window function with_field Set if any of the arguments contains or is a field used_tables_cache Set to union of the tables used by arguments @@ -478,7 +479,8 @@ void Item_func::print_op(String *str, enum_query_type query_type) str->append(func_name()); str->append(' '); } - args[arg_count-1]->print_parenthesised(str, query_type, precedence()); + args[arg_count-1]->print_parenthesised(str, query_type, + (enum precedence)(precedence() + 1)); } @@ -1902,6 +1904,7 @@ my_decimal *Item_func_mod::decimal_op(my_decimal *decimal_value) return decimal_value; case E_DEC_DIV_ZERO: signal_divide_by_null(); + /* fall through */ default: null_value= 1; return 0; @@ -3916,6 +3919,7 @@ longlong Item_master_gtid_wait::val_int() { DBUG_ASSERT(fixed == 1); longlong result= 0; + String *gtid_pos __attribute__((unused)) = args[0]->val_str(&value); if (args[0]->null_value) { @@ -3927,7 +3931,6 @@ longlong Item_master_gtid_wait::val_int() #ifdef HAVE_REPLICATION THD* thd= current_thd; longlong timeout_us; - String *gtid_pos = args[0]->val_str(&value); if (arg_count==2 && !args[1]->null_value) timeout_us= (longlong)(1e6*args[1]->val_real()); diff --git a/sql/item_func.h b/sql/item_func.h index 133074122dd..9aa9b09db1d 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -67,7 +67,7 @@ public: NOW_FUNC, NOW_UTC_FUNC, SYSDATE_FUNC, TRIG_COND_FUNC, SUSERVAR_FUNC, GUSERVAR_FUNC, COLLATE_FUNC, EXTRACT_FUNC, CHAR_TYPECAST_FUNC, FUNC_SP, UDF_FUNC, - NEG_FUNC, GSYSVAR_FUNC, DYNCOL_FUNC }; + NEG_FUNC, GSYSVAR_FUNC, DYNCOL_FUNC, JSON_EXTRACT_FUNC }; enum Type type() const { return FUNC_ITEM; } virtual enum Functype functype() const { return UNKNOWN_FUNC; } Item_func(THD *thd): Item_func_or_sum(thd), allowed_arg_cols(1) @@ -316,6 +316,19 @@ public: return this; } + bool excl_dep_on_table(table_map tab_map) + { + if (used_tables() & OUTER_REF_TABLE_BIT) + return false; + return !(used_tables() & ~tab_map) || + Item_args::excl_dep_on_table(tab_map); + } + + bool excl_dep_on_grouping_fields(st_select_lex *sel) + { + return Item_args::excl_dep_on_grouping_fields(sel); + } + /* We assume the result of any function that has a TIMESTAMP argument to be timezone-dependent, since a TIMESTAMP value in both numeric and string @@ -1270,7 +1283,11 @@ public: longlong val_int(); const char *func_name() const { return "coercibility"; } void fix_length_and_dec() { max_length=10; maybe_null= 0; } - table_map not_null_tables() const { return 0; } + bool eval_not_null_tables(void *) + { + not_null_tables_cache= 0; + return false; + } Item* propagate_equal_fields(THD *thd, const Context &ctx, COND_EQUAL *cond) { return this; } bool const_item() const { return true; } @@ -1588,7 +1605,11 @@ public: } void cleanup(); Item_result result_type () const { return udf.result_type(); } - table_map not_null_tables() const { return 0; } + bool eval_not_null_tables(void *opt_arg) + { + not_null_tables_cache= 0; + return 0; + } bool is_expensive() { return 1; } virtual void print(String *str, enum_query_type query_type); bool check_vcol_func_processor(void *arg) @@ -1835,7 +1856,7 @@ public: Item_master_gtid_wait(THD *thd, Item *a, Item *b): Item_int_func(thd, a, b) {} longlong val_int(); const char *func_name() const { return "master_gtid_wait"; } - void fix_length_and_dec() { max_length=10+1+10+1+20+1; maybe_null=0;} + void fix_length_and_dec() { max_length=2; } bool check_vcol_func_processor(void *arg) { return mark_unsupported_function(func_name(), "()", arg, VCOL_IMPOSSIBLE); @@ -2118,7 +2139,11 @@ public: bool is_expensive_processor(void *arg) { return TRUE; } enum Functype functype() const { return FT_FUNC; } const char *func_name() const { return "match"; } - table_map not_null_tables() const { return 0; } + bool eval_not_null_tables(void *opt_arg) + { + not_null_tables_cache= 0; + return 0; + } bool fix_fields(THD *thd, Item **ref); bool eq(const Item *, bool binary_cmp) const; /* The following should be safe, even if we compare doubles */ @@ -2401,6 +2426,11 @@ public: clone->sp_result_field= NULL; return clone; } + bool eval_not_null_tables(void *opt_arg) + { + not_null_tables_cache= 0; + return 0; + } }; @@ -2453,7 +2483,11 @@ public: void fix_length_and_dec(); enum Item_result result_type () const { return last_value->result_type(); } const char *func_name() const { return "last_value"; } - table_map not_null_tables() const { return 0; } + bool eval_not_null_tables(void *) + { + not_null_tables_cache= 0; + return 0; + } enum_field_types field_type() const { return last_value->field_type(); } bool const_item() const { return 0; } void evaluate_sideeffects(); diff --git a/sql/item_geofunc.cc b/sql/item_geofunc.cc index 7ac2e054e8c..3f0efbfa871 100644 --- a/sql/item_geofunc.cc +++ b/sql/item_geofunc.cc @@ -131,13 +131,27 @@ String *Item_func_geometry_from_json::val_str(String *str) Geometry_buffer buffer; String *js= args[0]->val_str_ascii(&tmp_js); uint32 srid= 0; + longlong options= 0; json_engine_t je; if ((null_value= args[0]->null_value)) return 0; - if ((arg_count == 2) && !args[1]->null_value) - srid= (uint32)args[1]->val_int(); + if (arg_count > 1 && !args[1]->null_value) + { + options= args[1]->val_int(); + if (options > 4 || options < 1) + { + String *sv= args[1]->val_str(&tmp_js); + my_error(ER_WRONG_VALUE_FOR_TYPE, MYF(0), + "option", sv->c_ptr(), "ST_GeometryFromJSON"); + null_value= 1; + return 0; + } + } + + if ((arg_count == 3) && !args[2]->null_value) + srid= (uint32)args[2]->val_int(); str->set_charset(&my_charset_bin); if (str->reserve(SRID_SIZE, 512)) @@ -148,7 +162,7 @@ String *Item_func_geometry_from_json::val_str(String *str) json_scan_start(&je, js->charset(), (const uchar *) js->ptr(), (const uchar *) js->end()); - if ((null_value= !Geometry::create_from_json(&buffer, &je, str))) + if ((null_value= !Geometry::create_from_json(&buffer, &je, options==1, str))) { int code= 0; @@ -163,6 +177,9 @@ String *Item_func_geometry_from_json::val_str(String *str) case Geometry::GEOJ_POLYGON_NOT_CLOSED: code= ER_GEOJSON_NOT_CLOSED; break; + case Geometry::GEOJ_DIMENSION_NOT_SUPPORTED: + my_error(ER_GIS_INVALID_DATA, MYF(0), "ST_GeometryFromJSON"); + break; default: report_json_error_ex(js, &je, func_name(), 0, Sql_condition::WARN_LEVEL_WARN); return NULL; @@ -242,6 +259,8 @@ String *Item_func_as_geojson::val_str_ascii(String *str) DBUG_ASSERT(fixed == 1); String arg_val; String *swkb= args[0]->val_str(&arg_val); + uint max_dec= FLOATING_POINT_DECIMALS; + longlong options= 0; Geometry_buffer buffer; Geometry *geom= NULL; const char *dummy; @@ -251,12 +270,41 @@ String *Item_func_as_geojson::val_str_ascii(String *str) !(geom= Geometry::construct(&buffer, swkb->ptr(), swkb->length()))))) return 0; + if (arg_count > 1) + { + max_dec= (uint) args[1]->val_int(); + if (args[1]->null_value) + max_dec= FLOATING_POINT_DECIMALS; + if (arg_count > 2) + { + options= args[2]->val_int(); + if (args[2]->null_value) + options= 0; + } + } + str->length(0); str->set_charset(&my_charset_latin1); - if ((null_value= geom->as_json(str, FLOATING_POINT_DECIMALS, &dummy))) + + if (str->reserve(1, 512)) return 0; + str->qs_append('{'); + + if (options & 1) + { + if (geom->bbox_as_json(str) || str->append(", ", 2)) + goto error; + } + + if ((geom->as_json(str, max_dec, &dummy) || str->append("}", 1))) + goto error; + return str; + +error: + null_value= 1; + return 0; } @@ -1072,11 +1120,11 @@ Item_func_spatial_rel::get_mm_leaf(RANGE_OPT_PARAM *param, tree->max_flag= NO_MAX_RANGE; break; case SP_WITHIN_FUNC: - tree->min_flag= GEOM_FLAG | HA_READ_MBR_WITHIN;// NEAR_MIN;//512; + tree->min_flag= GEOM_FLAG | HA_READ_MBR_CONTAIN;// NEAR_MIN;//512; tree->max_flag= NO_MAX_RANGE; break; case SP_CONTAINS_FUNC: - tree->min_flag= GEOM_FLAG | HA_READ_MBR_CONTAIN;// NEAR_MIN;//512; + tree->min_flag= GEOM_FLAG | HA_READ_MBR_WITHIN;// NEAR_MIN;//512; tree->max_flag= NO_MAX_RANGE; break; case SP_OVERLAPS_FUNC: @@ -1949,7 +1997,7 @@ String *Item_func_buffer::val_str(String *str_value) { DBUG_ENTER("Item_func_buffer::val_str"); DBUG_ASSERT(fixed == 1); - String *obj= args[0]->val_str(&tmp_value); + String *obj= args[0]->val_str(str_value); double dist= args[1]->val_real(); Geometry_buffer buffer; Geometry *g; diff --git a/sql/item_geofunc.h b/sql/item_geofunc.h index a164f9dec89..199bc1f47de 100644 --- a/sql/item_geofunc.h +++ b/sql/item_geofunc.h @@ -297,7 +297,6 @@ public: class Item_func_spatial_collection: public Item_geometry_func { - String tmp_value; enum Geometry::wkbType coll_type; enum Geometry::wkbType item_type; public: @@ -350,7 +349,18 @@ public: maybe_null= true; } enum Functype functype() const { return spatial_rel; } - enum Functype rev_functype() const { return spatial_rel; } + enum Functype rev_functype() const + { + switch (spatial_rel) + { + case SP_CONTAINS_FUNC: + return SP_WITHIN_FUNC; + case SP_WITHIN_FUNC: + return SP_CONTAINS_FUNC; + default: + return spatial_rel; + } + } bool is_null() { (void) val_int(); return null_value; } void add_key_fields(JOIN *join, KEY_FIELD **key_fields, uint *and_level, table_map usable_tables, @@ -483,7 +493,6 @@ protected: Gcalc_result_receiver res_receiver; Gcalc_operation_reducer operation; - String tmp_value; public: Item_func_buffer(THD *thd, Item *obj, Item *distance): diff --git a/sql/item_jsonfunc.cc b/sql/item_jsonfunc.cc index b8471dc8244..6398929defc 100644 --- a/sql/item_jsonfunc.cc +++ b/sql/item_jsonfunc.cc @@ -444,6 +444,7 @@ void Item_func_json_value::fix_length_and_dec() collation.set(args[0]->collation); max_length= args[0]->max_length; path.set_constant_flag(args[1]->const_item()); + maybe_null= 1; } @@ -582,27 +583,44 @@ void Item_func_json_unquote::fix_length_and_dec() { collation.set(&my_charset_utf8_general_ci); max_length= args[0]->max_length; + maybe_null= 1; +} + + +String *Item_func_json_unquote::read_json(json_engine_t *je) +{ + String *js= args[0]->val_json(&tmp_s); + + if ((null_value= args[0]->null_value)) + return 0; + + json_scan_start(je, js->charset(),(const uchar *) js->ptr(), + (const uchar *) js->ptr() + js->length()); + + je->value_type= (enum json_value_types) -1; /* To report errors right. */ + + if (json_read_value(je)) + goto error; + + return js; + +error: + if (je->value_type == JSON_VALUE_STRING) + report_json_error(js, je, 0); + return js; } String *Item_func_json_unquote::val_str(String *str) { - String *js= args[0]->val_json(&tmp_s); json_engine_t je; int c_len; + String *js; - if ((null_value= args[0]->null_value)) + if (!(js= read_json(&je))) return NULL; - json_scan_start(&je, js->charset(),(const uchar *) js->ptr(), - (const uchar *) js->ptr() + js->length()); - - je.value_type= (enum json_value_types) -1; /* To report errors right. */ - - if (json_read_value(&je)) - goto error; - - if (je.value_type != JSON_VALUE_STRING) + if (je.s.error || je.value_type != JSON_VALUE_STRING) return js; str->length(0); @@ -619,25 +637,30 @@ String *Item_func_json_unquote::val_str(String *str) return str; error: - if (je.value_type == JSON_VALUE_STRING) - report_json_error(js, &je, 0); - /* We just return the argument's value in the case of error. */ + report_json_error(js, &je, 0); return js; } static int alloc_tmp_paths(THD *thd, uint n_paths, - json_path_with_flags **paths,String **tmp_paths) + json_path_with_flags **paths, String **tmp_paths) { if (n_paths > 0) { - *paths= (json_path_with_flags *) alloc_root(thd->mem_root, - sizeof(json_path_with_flags) * n_paths); - *tmp_paths= (String *) alloc_root(thd->mem_root, sizeof(String) * n_paths); - if (*paths == 0 || *tmp_paths == 0) - return 1; + if (*tmp_paths == 0) + { + MEM_ROOT *root= thd->stmt_arena->mem_root; - bzero(*tmp_paths, sizeof(String) * n_paths); + *paths= (json_path_with_flags *) alloc_root(root, + sizeof(json_path_with_flags) * n_paths); + *tmp_paths= (String *) alloc_root(root, sizeof(String) * n_paths); + if (*paths == 0 || *tmp_paths == 0) + return 1; + + bzero(*tmp_paths, sizeof(String) * n_paths); + for (uint c_path=0; c_path < n_paths; c_path++) + (*tmp_paths)[c_path].set_charset(&my_charset_utf8_general_ci); + } return 0; } @@ -671,7 +694,6 @@ void Item_json_str_multipath::cleanup() { for (uint i= get_n_paths(); i>0; i--) tmp_paths[i-1].free(); - tmp_paths= 0; } Item_str_func::cleanup(); } @@ -683,11 +705,12 @@ void Item_func_json_extract::fix_length_and_dec() max_length= args[0]->max_length * (arg_count - 1); mark_constant_paths(paths, args+1, arg_count-1); + maybe_null= 1; } static bool path_exact(const json_path_with_flags *paths_list, int n_paths, - const json_path_t *p, enum json_value_types vt) + const json_path_t *p, json_value_types vt) { for (; n_paths > 0; n_paths--, paths_list++) { @@ -699,7 +722,7 @@ static bool path_exact(const json_path_with_flags *paths_list, int n_paths, static bool path_ok(const json_path_with_flags *paths_list, int n_paths, - const json_path_t *p, enum json_value_types vt) + const json_path_t *p, json_value_types vt) { for (; n_paths > 0; n_paths--, paths_list++) { @@ -710,7 +733,9 @@ static bool path_ok(const json_path_with_flags *paths_list, int n_paths, } -String *Item_func_json_extract::val_str(String *str) +String *Item_func_json_extract::read_json(String *str, + json_value_types *type, + char **out_val, int *value_len) { String *js= args[0]->val_json(&tmp_js); json_engine_t je, sav_je; @@ -746,8 +771,13 @@ String *Item_func_json_extract::val_str(String *str) possible_multiple_values= arg_count > 2 || (paths[0].p.types_used & (JSON_PATH_WILD | JSON_PATH_DOUBLE_WILD)); - str->set_charset(js->charset()); - str->length(0); + *type= possible_multiple_values ? JSON_VALUE_ARRAY : JSON_VALUE_NULL; + + if (str) + { + str->set_charset(js->charset()); + str->length(0); + } if (possible_multiple_values && str->append("[", 1)) goto error; @@ -762,6 +792,18 @@ String *Item_func_json_extract::val_str(String *str) value= je.value_begin; + if (*type == JSON_VALUE_NULL) + { + *type= je.value_type; + *out_val= (char *) je.value; + *value_len= je.value_len; + } + if (!str) + { + /* If str is NULL, we only care about the first found value. */ + goto return_ok; + } + if (json_value_scalar(&je)) v_len= je.value_end - value; else @@ -782,7 +824,11 @@ String *Item_func_json_extract::val_str(String *str) not_first_value= 1; if (!possible_multiple_values) + { + /* Loop to the end of the JSON just to make sure it's valid. */ + while (json_get_path_next(&je, &p) == 0) {} break; + } } if (je.s.error) @@ -805,6 +851,7 @@ String *Item_func_json_extract::val_str(String *str) if (json_nice(&je, &tmp_js, Item_func_json_format::LOOSE)) goto error; +return_ok: return &tmp_js; error: @@ -815,68 +862,74 @@ return_null: } +String *Item_func_json_extract::val_str(String *str) +{ + json_value_types type; + char *value; + int value_len; + return read_json(str, &type, &value, &value_len); +} + + longlong Item_func_json_extract::val_int() { - String *js= args[0]->val_json(&tmp_js); - json_engine_t je; - uint n_arg; - uint array_counters[JSON_DEPTH_LIMIT]; + json_value_types type; + char *value; + int value_len; + longlong i= 0; - if ((null_value= args[0]->null_value)) - return 0; - - for (n_arg=1; n_arg < arg_count; n_arg++) + if (read_json(NULL, &type, &value, &value_len) != NULL) { - json_path_with_flags *c_path= paths + n_arg - 1; - if (!c_path->parsed) + switch (type) { - String *s_p= args[n_arg]->val_str(tmp_paths+(n_arg-1)); - if (s_p && - json_path_setup(&c_path->p,s_p->charset(),(const uchar *) s_p->ptr(), - (const uchar *) s_p->ptr() + s_p->length())) - goto error; - c_path->parsed= c_path->constant; - } + case JSON_VALUE_NUMBER: + case JSON_VALUE_STRING: + { + char *end; + int err; + i= my_strntoll(collation.collation, value, value_len, 10, &end, &err); + break; + } + case JSON_VALUE_TRUE: + i= 1; + break; + default: + i= 0; + break; + }; + } + return i; +} - if (args[n_arg]->null_value) - goto error; - json_scan_start(&je, js->charset(),(const uchar *) js->ptr(), - (const uchar *) js->ptr() + js->length()); +double Item_func_json_extract::val_real() +{ + json_value_types type; + char *value; + int value_len; + double d= 0.0; - c_path->cur_step= c_path->p.steps; - - if (json_find_path(&je, &c_path->p, &c_path->cur_step, array_counters)) + if (read_json(NULL, &type, &value, &value_len) != NULL) + { + switch (type) { - /* Path wasn't found. */ - if (je.s.error) - goto error; - - continue; - } - - if (json_read_value(&je)) - goto error; - - if (json_value_scalar(&je)) - { - int err; - char *v_end= (char *) je.value_end; - return (je.s.cs->cset->strtoll10)(je.s.cs, (const char *) je.value_begin, - &v_end, &err); - } - else - break; + case JSON_VALUE_STRING: + case JSON_VALUE_NUMBER: + { + char *end; + int err; + d= my_strntod(collation.collation, value, value_len, &end, &err); + break; + } + case JSON_VALUE_TRUE: + d= 1.0; + break; + default: + break; + }; } - /* Nothing was found. */ - null_value= 1; - return 0; - -error: - /* TODO: launch error messages. */ - null_value= 1; - return 0; + return d; } @@ -884,6 +937,7 @@ void Item_func_json_contains::fix_length_and_dec() { a2_constant= args[1]->const_item(); a2_parsed= FALSE; + maybe_null= 1; if (arg_count > 2) path.set_constant_flag(args[2]->const_item()); Item_int_func::fix_length_and_dec(); @@ -1129,6 +1183,7 @@ void Item_func_json_contains_path::fix_length_and_dec() { ooa_constant= args[1]->const_item(); ooa_parsed= FALSE; + maybe_null= 1; mark_constant_paths(paths, args+2, arg_count-2); Item_int_func::fix_length_and_dec(); } @@ -1391,6 +1446,8 @@ void Item_func_json_array::fix_length_and_dec() ulonglong char_length= 2; uint n_arg; + result_limit= 0; + if (arg_count == 0) { collation.set(&my_charset_utf8_general_ci); @@ -1407,7 +1464,6 @@ void Item_func_json_array::fix_length_and_dec() fix_char_length_ulonglong(char_length); tmp_val.set_charset(collation.collation); - result_limit= 0; } @@ -1417,6 +1473,7 @@ String *Item_func_json_array::val_str(String *str) uint n_arg; str->length(0); + str->set_charset(collation.collation); if (str->append("[", 1) || ((arg_count > 0) && append_json_value(str, args[0], &tmp_val))) @@ -1741,6 +1798,7 @@ String *Item_func_json_object::val_str(String *str) uint n_arg; str->length(0); + str->set_charset(collation.collation); if (str->append("{", 1) || (arg_count > 0 && @@ -1918,14 +1976,25 @@ continue_j2: else { const uchar *end1, *beg1, *end2, *beg2; + int empty_array= 0; beg1= je1->value_begin; /* Merge as a single array. */ if (je1->value_type == JSON_VALUE_ARRAY) { - if (json_skip_level(je1)) + int cur_level= je1->stack_p; + empty_array= 1; + while (json_scan_next(je1) == 0) + { + if (je1->stack_p < cur_level) + break; + empty_array= 0; + } + + if (je1->s.error) return 1; + end1= je1->s.c_str - je1->sav_c_len; } else @@ -1942,8 +2011,8 @@ continue_j2: end1= je1->value_end; } - if (str->append((const char*) beg1, end1 - beg1), - str->append(", ", 2)) + if (str->append((const char*) beg1, end1 - beg1) || + (!empty_array && str->append(", ", 2))) return 3; if (json_value_scalar(je2)) @@ -2042,6 +2111,7 @@ void Item_func_json_length::fix_length_and_dec() { if (arg_count > 1) path.set_constant_flag(args[1]->const_item()); + maybe_null= 1; } @@ -2178,6 +2248,7 @@ void Item_func_json_type::fix_length_and_dec() { collation.set(&my_charset_utf8_general_ci); max_length= 12; + maybe_null= 1; } @@ -2245,6 +2316,7 @@ void Item_func_json_insert::fix_length_and_dec() } fix_char_length_ulonglong(char_length); + maybe_null= 1; } @@ -2394,6 +2466,8 @@ String *Item_func_json_insert::val_str(String *str) } else /*JSON_PATH_KEY*/ { + uint n_key= 0; + if (je.value_type != JSON_VALUE_OBJECT) continue; @@ -2405,6 +2479,7 @@ String *Item_func_json_insert::val_str(String *str) json_string_set_str(&key_name, lp->key, lp->key_end); if (json_key_matches(&je, &key_name)) goto v_found; + n_key++; if (json_skip_key(&je)) goto js_error; break; @@ -2422,7 +2497,8 @@ String *Item_func_json_insert::val_str(String *str) v_to= (const char *) (je.s.c_str - je.sav_c_len); str->length(0); if (append_simple(str, js->ptr(), v_to - js->ptr()) || - str->append(", \"", 3) || + (n_key > 0 && str->append(", ", 2)) || + str->append("\"", 1) || append_simple(str, lp->key, lp->key_end - lp->key) || str->append("\":", 2) || append_json_value(str, args[n_arg+1], &tmp_val) || @@ -2491,6 +2567,7 @@ void Item_func_json_remove::fix_length_and_dec() max_length= args[0]->max_length; mark_constant_paths(paths, args+1, arg_count-1); + maybe_null= 1; } @@ -2674,11 +2751,47 @@ void Item_func_json_keys::fix_length_and_dec() { collation.set(args[0]->collation); max_length= args[0]->max_length; + maybe_null= 1; if (arg_count > 1) path.set_constant_flag(args[1]->const_item()); } +/* + That function is for Item_func_json_keys::val_str exclusively. + It utilizes the fact the resulting string is in specific format: + ["key1", "key2"...] +*/ +static int check_key_in_list(String *res, + const uchar *key, int key_len) +{ + const uchar *c= (const uchar *) res->ptr() + 2; /* beginning '["' */ + const uchar *end= (const uchar *) res->end() - 1; /* ending '"' */ + + while (c < end) + { + int n_char; + for (n_char=0; c[n_char] != '"' && n_char < key_len; n_char++) + { + if (c[n_char] != key[n_char]) + break; + } + if (c[n_char] == '"') + { + if (n_char == key_len) + return 1; + } + else + { + while (c[n_char] != '"') + n_char++; + } + c+= n_char + 4; /* skip ', "' */ + } + return 0; +} + + String *Item_func_json_keys::val_str(String *str) { json_engine_t je; @@ -2735,6 +2848,7 @@ skip_search: while (json_scan_next(&je) == 0 && je.state != JST_OBJ_END) { const uchar *key_start, *key_end; + int key_len; switch (je.state) { @@ -2744,13 +2858,19 @@ skip_search: { key_end= je.s.c_str; } while (json_read_keyname_chr(&je) == 0); - if (je.s.error || - (n_keys > 0 && str->append(", ", 2)) || + if (je.s.error) + goto err_return; + key_len= key_end - key_start; + + if (!check_key_in_list(str, key_start, key_len)) + { + if ((n_keys > 0 && str->append(", ", 2)) || str->append("\"", 1) || - append_simple(str, key_start, key_end - key_start) || + append_simple(str, key_start, key_len) || str->append("\"", 1)) goto err_return; - n_keys++; + n_keys++; + } break; case JST_OBJ_START: case JST_ARRAY_START: @@ -2815,6 +2935,7 @@ void Item_func_json_search::fix_length_and_dec() if (arg_count > 4) mark_constant_paths(paths, args+4, arg_count-4); + maybe_null= 1; } @@ -2898,7 +3019,7 @@ String *Item_func_json_search::val_str(String *str) json_path_with_flags *c_path= paths + n_arg - 4; if (!c_path->parsed) { - String *s_p= args[n_arg]->val_str(tmp_paths + (n_arg-1)); + String *s_p= args[n_arg]->val_str(tmp_paths + (n_arg-4)); if (s_p && json_path_setup(&c_path->p,s_p->charset(),(const uchar *) s_p->ptr(), (const uchar *) s_p->ptr() + s_p->length())) @@ -2996,6 +3117,7 @@ void Item_func_json_format::fix_length_and_dec() { decimals= 0; max_length= args[0]->max_length; + maybe_null= 1; } @@ -3049,4 +3171,71 @@ String *Item_func_json_format::val_json(String *str) return js; } +int Arg_comparator::compare_json_str_basic(Item *j, Item *s) +{ + String *res1,*res2; + json_value_types type; + char *value; + int value_len, c_len; + Item_func_json_extract *e= (Item_func_json_extract *) j; + + if ((res1= e->read_json(&value1, &type, &value, &value_len))) + { + if ((res2= s->val_str(&value2))) + { + if (type == JSON_VALUE_STRING) + { + if (value1.realloc_with_extra_if_needed(value_len) || + (c_len= json_unescape(value1.charset(), (uchar *) value, + (uchar *) value+value_len, + &my_charset_utf8_general_ci, + (uchar *) value1.ptr(), + (uchar *) (value1.ptr() + value_len))) < 0) + goto error; + value1.length(c_len); + res1= &value1; + } + + if (set_null) + owner->null_value= 0; + return sortcmp(res1, res2, compare_collation()); + } + } +error: + if (set_null) + owner->null_value= 1; + return -1; +} + + +int Arg_comparator::compare_e_json_str_basic(Item *j, Item *s) +{ + String *res1,*res2; + json_value_types type; + char *value; + int value_len, c_len; + Item_func_json_extract *e= (Item_func_json_extract *) j; + + res1= e->read_json(&value1, &type, &value, &value_len); + res2= s->val_str(&value2); + + if (!res1 || !res2) + return MY_TEST(res1 == res2); + + if (type == JSON_VALUE_STRING) + { + if (value1.realloc_with_extra_if_needed(value_len) || + (c_len= json_unescape(value1.charset(), (uchar *) value, + (uchar *) value+value_len, + &my_charset_utf8_general_ci, + (uchar *) value1.ptr(), + (uchar *) (value1.ptr() + value_len))) < 0) + return 1; + value1.length(c_len); + res1= &value1; + } + + return MY_TEST(sortcmp(res1, res2, compare_collation()) == 0); +} + diff --git a/sql/item_jsonfunc.h b/sql/item_jsonfunc.h index 394ed5f189a..927b60015b8 100644 --- a/sql/item_jsonfunc.h +++ b/sql/item_jsonfunc.h @@ -101,6 +101,7 @@ class Item_func_json_query: public Item_func_json_value public: Item_func_json_query(THD *thd, Item *js, Item *i_path): Item_func_json_value(thd, js, i_path) {} + bool is_json_type() { return true; } const char *func_name() const { return "json_query"; } bool check_and_get_value(json_engine_t *je, String *res, int *error); Item *get_copy(THD *thd, MEM_ROOT *mem_root) @@ -127,7 +128,7 @@ class Item_func_json_unquote: public Item_str_func { protected: String tmp_s; - + String *read_json(json_engine_t *je); public: Item_func_json_unquote(THD *thd, Item *s): Item_str_func(thd, s) {} const char *func_name() const { return "json_unquote"; } @@ -158,12 +159,16 @@ class Item_func_json_extract: public Item_json_str_multipath protected: String tmp_js; public: + String *read_json(String *str, json_value_types *type, + char **out_val, int *value_len); Item_func_json_extract(THD *thd, List &list): Item_json_str_multipath(thd, list) {} const char *func_name() const { return "json_extract"; } + enum Functype functype() const { return JSON_EXTRACT_FUNC; } void fix_length_and_dec(); String *val_str(String *); longlong val_int(); + double val_real(); uint get_n_paths() const { return arg_count - 1; } Item *get_copy(THD *thd, MEM_ROOT *mem_root) { return get_item_copy(thd, mem_root, this); } diff --git a/sql/item_row.cc b/sql/item_row.cc index ddbb0736d54..fc484f560ee 100644 --- a/sql/item_row.cc +++ b/sql/item_row.cc @@ -63,6 +63,7 @@ bool Item_row::fix_fields(THD *thd, Item **ref) } maybe_null|= item->maybe_null; with_sum_func= with_sum_func || item->with_sum_func; + with_window_func = with_window_func || item->with_window_func; with_field= with_field || item->with_field; with_subselect|= item->with_subselect; } diff --git a/sql/item_row.h b/sql/item_row.h index 26468336dc8..cd58e15fe8b 100644 --- a/sql/item_row.h +++ b/sql/item_row.h @@ -126,6 +126,16 @@ public: return this; } + bool excl_dep_on_table(table_map tab_map) + { + return Item_args::excl_dep_on_table(tab_map); + } + + bool excl_dep_on_grouping_fields(st_select_lex *sel) + { + return Item_args::excl_dep_on_grouping_fields(sel); + } + bool check_vcol_func_processor(void *arg) {return FALSE; } Item *get_copy(THD *thd, MEM_ROOT *mem_root) { return get_item_copy(thd, mem_root, this); } diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index b34f9fd1b58..02bfc98b293 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1,6 +1,6 @@ /* - Copyright (c) 2000, 2013, Oracle and/or its affiliates. - Copyright (c) 2009, 2013, Monty Program Ab. + Copyright (c) 2000, 2017, Oracle and/or its affiliates. + Copyright (c) 2009, 2017, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -66,8 +66,14 @@ size_t username_char_length= 80; Conversion happens only in case of "tricky" Item character set (e.g. UCS2). Normally conversion does not happen, and val_str_ascii() is immediately returned instead. + + No matter if conversion is needed or not needed, + the result is always returned in "str" (see MDEV-10306 why). + + @param [OUT] str - Store the result here + @param [IN] ascii_buffer - Use this temporary buffer to call val_str_ascii() */ -String *Item_func::val_str_from_val_str_ascii(String *str, String *str2) +String *Item_func::val_str_from_val_str_ascii(String *str, String *ascii_buffer) { DBUG_ASSERT(fixed == 1); @@ -79,19 +85,19 @@ String *Item_func::val_str_from_val_str_ascii(String *str, String *str2) return res; } - DBUG_ASSERT(str != str2); + DBUG_ASSERT(str != ascii_buffer); uint errors; - String *res= val_str_ascii(str); + String *res= val_str_ascii(ascii_buffer); if (!res) return 0; - if ((null_value= str2->copy(res->ptr(), res->length(), - &my_charset_latin1, collation.collation, - &errors))) + if ((null_value= str->copy(res->ptr(), res->length(), + &my_charset_latin1, collation.collation, + &errors))) return 0; - return str2; + return str; } @@ -225,7 +231,7 @@ String *Item_func_sha2::val_str_ascii(String *str) break; case 0: // SHA-256 is the default digest_length= 256; - /* fall trough */ + /* fall through */ case 256: my_sha256(digest_buf, input_ptr, input_len); break; @@ -271,7 +277,7 @@ void Item_func_sha2::fix_length_and_dec() switch (sha_variant) { case 0: // SHA-256 is the default sha_variant= 256; - /* fall trough */ + /* fall through */ case 512: case 384: case 256: @@ -307,11 +313,11 @@ void Item_aes_crypt::create_key(String *user_key, uchar *real_key) } -String *Item_aes_crypt::val_str(String *str) +String *Item_aes_crypt::val_str(String *str2) { DBUG_ASSERT(fixed == 1); StringBuffer<80> user_key_buf; - String *sptr= args[0]->val_str(str); + String *sptr= args[0]->val_str(&str_value); String *user_key= args[1]->val_str(&user_key_buf); uint32 aes_length; @@ -320,17 +326,17 @@ String *Item_aes_crypt::val_str(String *str) null_value=0; aes_length=my_aes_get_size(MY_AES_ECB, sptr->length()); - if (!str_value.alloc(aes_length)) // Ensure that memory is free + if (!str2->alloc(aes_length)) // Ensure that memory is free { uchar rkey[AES_KEY_LENGTH / 8]; create_key(user_key, rkey); if (!my_aes_crypt(MY_AES_ECB, what, (uchar*)sptr->ptr(), sptr->length(), - (uchar*)str_value.ptr(), &aes_length, + (uchar*)str2->ptr(), &aes_length, rkey, AES_KEY_LENGTH / 8, 0, 0)) { - str_value.length((uint) aes_length); - return &str_value; + str2->length((uint) aes_length); + return str2; } } } @@ -345,6 +351,7 @@ void Item_func_aes_encrypt::fix_length_and_dec() } + void Item_func_aes_decrypt::fix_length_and_dec() { max_length=args[0]->max_length; @@ -373,7 +380,7 @@ void Item_func_to_base64::fix_length_and_dec() String *Item_func_to_base64::val_str_ascii(String *str) { - String *res= args[0]->val_str(str); + String *res= args[0]->val_str(&tmp_value); bool too_long= false; int length; if (!res || @@ -381,7 +388,7 @@ String *Item_func_to_base64::val_str_ascii(String *str) (too_long= ((uint) (length= my_base64_needed_encoded_length((int) res->length())) > current_thd->variables.max_allowed_packet)) || - tmp_value.alloc((uint) length)) + str->alloc((uint) length)) { null_value= 1; // NULL input, too long input, or OOM. if (too_long) @@ -395,11 +402,11 @@ String *Item_func_to_base64::val_str_ascii(String *str) } return 0; } - my_base64_encode(res->ptr(), (int) res->length(), (char*) tmp_value.ptr()); + my_base64_encode(res->ptr(), (int) res->length(), (char*) str->ptr()); DBUG_ASSERT(length > 0); - tmp_value.length((uint) length - 1); // Without trailing '\0' + str->length((uint) length - 1); // Without trailing '\0' null_value= 0; - return &tmp_value; + return str; } @@ -420,7 +427,7 @@ void Item_func_from_base64::fix_length_and_dec() String *Item_func_from_base64::val_str(String *str) { - String *res= args[0]->val_str_ascii(str); + String *res= args[0]->val_str_ascii(&tmp_value); int length; const char *end_ptr; @@ -440,11 +447,11 @@ String *Item_func_from_base64::val_str(String *str) goto err; } - if (tmp_value.alloc((uint) length)) + if (str->alloc((uint) length)) goto err; if ((length= my_base64_decode(res->ptr(), (int) res->length(), - (char *) tmp_value.ptr(), &end_ptr, 0)) < 0 || + (char *) str->ptr(), &end_ptr, 0)) < 0 || end_ptr < res->ptr() + res->length()) { THD *thd= current_thd; @@ -454,9 +461,9 @@ String *Item_func_from_base64::val_str(String *str) goto err; } - tmp_value.length((uint) length); + str->length((uint) length); null_value= 0; - return &tmp_value; + return str; err: null_value= 1; // NULL input, too long input, OOM, or badly formed input return 0; @@ -712,7 +719,7 @@ String *Item_func_des_encrypt::val_str(String *str) struct st_des_keyschedule keyschedule; const char *append_str="********"; uint key_number, res_length, tail; - String *res= args[0]->val_str(str); + String *res= args[0]->val_str(&tmp_value); if ((null_value= args[0]->null_value)) return 0; // ENCRYPT(NULL) == NULL @@ -736,7 +743,7 @@ String *Item_func_des_encrypt::val_str(String *str) } else { - String *keystr=args[1]->val_str(&tmp_value); + String *keystr= args[1]->val_str(str); if (!keystr) goto error; key_number=127; // User key string @@ -768,23 +775,23 @@ String *Item_func_des_encrypt::val_str(String *str) tmp_arg.length(0); tmp_arg.append(res->ptr(), res->length()); code= ER_OUT_OF_RESOURCES; - if (tmp_arg.append(append_str, tail) || tmp_value.alloc(res_length+1)) + if (tmp_arg.append(append_str, tail) || str->alloc(res_length+1)) goto error; tmp_arg[res_length-1]=tail; // save extra length - tmp_value.realloc(res_length+1); - tmp_value.length(res_length+1); - tmp_value.set_charset(&my_charset_bin); - tmp_value[0]=(char) (128 | key_number); + str->realloc(res_length+1); + str->length(res_length+1); + str->set_charset(&my_charset_bin); + (*str)[0]=(char) (128 | key_number); // Real encryption bzero((char*) &ivec,sizeof(ivec)); DES_ede3_cbc_encrypt((const uchar*) (tmp_arg.ptr()), - (uchar*) (tmp_value.ptr()+1), + (uchar*) (str->ptr()+1), res_length, &keyschedule.ks1, &keyschedule.ks2, &keyschedule.ks3, &ivec, TRUE); - return &tmp_value; + return str; error: THD *thd= current_thd; @@ -810,7 +817,7 @@ String *Item_func_des_decrypt::val_str(String *str) DES_cblock ivec; struct st_des_keyblock keyblock; struct st_des_keyschedule keyschedule; - String *res= args[0]->val_str(str); + String *res= args[0]->val_str(&tmp_value); uint length,tail; if ((null_value= args[0]->null_value)) @@ -834,7 +841,7 @@ String *Item_func_des_decrypt::val_str(String *str) else { // We make good 24-byte (168 bit) key from given plaintext key with MD5 - String *keystr=args[1]->val_str(&tmp_value); + String *keystr= args[1]->val_str(str); if (!keystr) goto error; @@ -849,23 +856,23 @@ String *Item_func_des_decrypt::val_str(String *str) DES_set_key_unchecked(&keyblock.key3,&keyschedule.ks3); } code= ER_OUT_OF_RESOURCES; - if (tmp_value.alloc(length-1)) + if (str->alloc(length-1)) goto error; bzero((char*) &ivec,sizeof(ivec)); DES_ede3_cbc_encrypt((const uchar*) res->ptr()+1, - (uchar*) (tmp_value.ptr()), + (uchar*) (str->ptr()), length-1, &keyschedule.ks1, &keyschedule.ks2, &keyschedule.ks3, &ivec, FALSE); /* Restore old length of key */ - if ((tail=(uint) (uchar) tmp_value[length-2]) > 8) + if ((tail=(uint) (uchar) (*str)[length-2]) > 8) goto wrong_key; // Wrong key - tmp_value.length(length-1-tail); - tmp_value.set_charset(&my_charset_bin); - return &tmp_value; + str->length(length-1-tail); + str->set_charset(&my_charset_bin); + return str; error: { @@ -1063,25 +1070,26 @@ void Item_func_concat_ws::fix_length_and_dec() String *Item_func_reverse::val_str(String *str) { DBUG_ASSERT(fixed == 1); - String *res = args[0]->val_str(str); - char *ptr, *end, *tmp; + String *res= args[0]->val_str(&tmp_value); + const char *ptr, *end; + char *tmp; if ((null_value=args[0]->null_value)) return 0; /* An empty string is a special case as the string pointer may be null */ if (!res->length()) return make_empty_result(); - if (tmp_value.alloced_length() < res->length() && - tmp_value.realloc(res->length())) + if (str->alloced_length() < res->length() && + str->realloc(res->length())) { null_value= 1; return 0; } - tmp_value.length(res->length()); - tmp_value.set_charset(res->charset()); - ptr= (char *) res->ptr(); - end= ptr + res->length(); - tmp= (char *) tmp_value.ptr() + tmp_value.length(); + str->length(res->length()); + str->set_charset(res->charset()); + ptr= res->ptr(); + end= res->end(); + tmp= (char *) str->end(); #ifdef USE_MB if (use_mb(res->charset())) { @@ -1091,7 +1099,7 @@ String *Item_func_reverse::val_str(String *str) if ((l= my_ismbchar(res->charset(),ptr,end))) { tmp-= l; - DBUG_ASSERT(tmp >= tmp_value.ptr()); + DBUG_ASSERT(tmp >= str->ptr()); memcpy(tmp,ptr,l); ptr+= l; } @@ -1105,7 +1113,7 @@ String *Item_func_reverse::val_str(String *str) while (ptr < end) *--tmp= *ptr++; } - return &tmp_value; + return str; } @@ -1272,12 +1280,19 @@ void Item_func_replace::fix_length_and_dec() /*********************************************************************/ +bool Item_func_regexp_replace::fix_fields(THD *thd, Item **ref) +{ + re.set_recursion_limit(thd); + return Item_str_func::fix_fields(thd, ref); +} + + void Item_func_regexp_replace::fix_length_and_dec() { if (agg_arg_charsets_for_string_result_with_comparison(collation, args, 3)) return; max_length= MAX_BLOB_WIDTH; - re.init(collation.collation, 0, 10); + re.init(collation.collation, 0); re.fix_owner(this, args[0], args[1]); } @@ -1407,12 +1422,19 @@ err: } +bool Item_func_regexp_substr::fix_fields(THD *thd, Item **ref) +{ + re.set_recursion_limit(thd); + return Item_str_func::fix_fields(thd, ref); +} + + void Item_func_regexp_substr::fix_length_and_dec() { if (agg_arg_charsets_for_string_result_with_comparison(collation, args, 2)) return; fix_char_length(args[0]->max_char_length()); - re.init(collation.collation, 0, 10); + re.init(collation.collation, 0); re.fix_owner(this, args[0], args[1]); } @@ -2285,6 +2307,7 @@ String *Item_func_database::val_str(String *str) } else str->copy(thd->db, thd->db_length, system_charset_info); + null_value= 0; return str; } @@ -2319,6 +2342,28 @@ bool Item_func_user::init(const char *user, const char *host) } +Item *Item_func_sysconst::safe_charset_converter(THD *thd, CHARSET_INFO *tocs) +{ + /* + During view or prepared statement creation, the item should not + make use of const_charset_converter as it would imply substitution + with constant items which is not correct. Functions can have different + values during view creation and view execution based on context. + + Return the identical item during view creation and prepare. + */ + if (thd->lex->is_ps_or_view_context_analysis()) + return this; + return const_charset_converter(thd, tocs, true, fully_qualified_func_name()); +} + +bool Item_func_sysconst::const_item() const +{ + if (current_thd->lex->is_ps_or_view_context_analysis()) + return false; + return true; +} + bool Item_func_user::fix_fields(THD *thd, Item **ref) { return (Item_func_sysconst::fix_fields(thd, ref) || @@ -2344,15 +2389,13 @@ bool Item_func_current_role::fix_fields(THD *thd, Item **ref) Security_context *ctx= context && context->security_ctx ? context->security_ctx : thd->security_ctx; - if (ctx->priv_role[0]) { if (str_value.copy(ctx->priv_role, strlen(ctx->priv_role), system_charset_info)) return 1; - - null_value= maybe_null= 0; str_value.mark_as_const(); + null_value= maybe_null= 0; return 0; } null_value= maybe_null= 1; @@ -2366,7 +2409,6 @@ void Item_func_soundex::fix_length_and_dec() DBUG_ASSERT(collation.collation != NULL); set_if_bigger(char_length, 4); fix_char_length(char_length); - tmp_value.set_charset(collation.collation); } @@ -2411,7 +2453,7 @@ static bool my_uni_isalpha(int wc) String *Item_func_soundex::val_str(String *str) { DBUG_ASSERT(fixed == 1); - String *res =args[0]->val_str(str); + String *res= args[0]->val_str(&tmp_value); char last_ch,ch; CHARSET_INFO *cs= collation.collation; my_wc_t wc; @@ -2421,10 +2463,11 @@ String *Item_func_soundex::val_str(String *str) if ((null_value= args[0]->null_value)) return 0; /* purecov: inspected */ - if (tmp_value.alloc(MY_MAX(res->length(), 4 * cs->mbminlen))) - return str; /* purecov: inspected */ - char *to= (char *) tmp_value.ptr(); - char *to_end= to + tmp_value.alloced_length(); + if (str->alloc(MY_MAX(res->length(), 4 * cs->mbminlen))) + return &tmp_value; /* purecov: inspected */ + str->set_charset(collation.collation); + char *to= (char *) str->ptr(); + char *to_end= to + str->alloced_length(); char *from= (char *) res->ptr(), *end= from + res->length(); for ( ; ; ) /* Skip pre-space */ @@ -2509,8 +2552,8 @@ String *Item_func_soundex::val_str(String *str) to+= nbytes; } - tmp_value.length((uint) (to-tmp_value.ptr())); - return &tmp_value; + str->length((uint) (to - str->ptr())); + return str; } @@ -2664,20 +2707,6 @@ String *Item_func_format::val_str_ascii(String *str) } -void Item_func_format::print(String *str, enum_query_type query_type) -{ - str->append(STRING_WITH_LEN("format(")); - args[0]->print(str, query_type); - str->append(','); - args[1]->print(str, query_type); - if(arg_count > 2) - { - str->append(','); - args[2]->print(str,query_type); - } - str->append(')'); -} - void Item_func_elt::fix_length_and_dec() { uint32 char_length= 0; @@ -3332,13 +3361,13 @@ String *Item_func_conv_charset::val_str(String *str) DBUG_ASSERT(fixed == 1); if (use_cached_value) return null_value ? 0 : &str_value; - String *arg= args[0]->val_str(str); + String *arg= args[0]->val_str(&tmp_value); String_copier_for_item copier(current_thd); return ((null_value= args[0]->null_value || - copier.copy_with_warn(collation.collation, &tmp_value, + copier.copy_with_warn(collation.collation, str, arg->charset(), arg->ptr(), arg->length(), arg->length()))) ? - 0 : &tmp_value; + 0 : str; } void Item_func_conv_charset::fix_length_and_dec() @@ -3479,7 +3508,7 @@ String *Item_func_weight_string::val_str(String *str) DBUG_ASSERT(fixed == 1); if (args[0]->result_type() != STRING_RESULT || - !(res= args[0]->val_str(str))) + !(res= args[0]->val_str(&tmp_value))) goto nl; /* @@ -3529,19 +3558,20 @@ String *Item_func_weight_string::val_str(String *str) goto nl; } } - if (tmp_value.alloc(tmp_length)) + + if (str->alloc(tmp_length)) goto nl; frm_length= cs->coll->strnxfrm(cs, - (uchar *) tmp_value.ptr(), tmp_length, + (uchar *) str->ptr(), tmp_length, nweights ? nweights : tmp_length, (const uchar *) res->ptr(), res->length(), flags); DBUG_ASSERT(frm_length <= tmp_length); - tmp_value.length(frm_length); + str->length(frm_length); null_value= 0; - return &tmp_value; + return str; nl: null_value= 1; @@ -3597,18 +3627,18 @@ String *Item_func_hex::val_str_ascii(String *str) } /* Convert given string to a hex string, character by character */ - res= args[0]->val_str(str); - if (!res || tmp_value.alloc(res->length()*2+1)) + res= args[0]->val_str(&tmp_value); + if (!res || str->alloc(res->length()*2+1)) { null_value=1; return 0; } null_value=0; - tmp_value.length(res->length()*2); - tmp_value.set_charset(&my_charset_latin1); + str->length(res->length()*2); + str->set_charset(&my_charset_latin1); - octet2hex((char*) tmp_value.ptr(), res->ptr(), res->length()); - return &tmp_value; + octet2hex((char*) str->ptr(), res->ptr(), res->length()); + return str; } /** Convert given hex string to a binary string. */ @@ -3621,8 +3651,8 @@ String *Item_func_unhex::val_str(String *str) uint length; DBUG_ASSERT(fixed == 1); - res= args[0]->val_str(str); - if (!res || tmp_value.alloc(length= (1+res->length())/2)) + res= args[0]->val_str(&tmp_value); + if (!res || str->alloc(length= (1+res->length())/2)) { null_value=1; return 0; @@ -3630,8 +3660,8 @@ String *Item_func_unhex::val_str(String *str) from= res->ptr(); null_value= 0; - tmp_value.length(length); - to= (char*) tmp_value.ptr(); + str->length(length); + to= (char*) str->ptr(); if (res->length() % 2) { int hex_char; @@ -3649,7 +3679,7 @@ String *Item_func_unhex::val_str(String *str) if ((null_value= (hex_char == -1))) return 0; } - return &tmp_value; + return str; } @@ -3898,8 +3928,9 @@ String *Item_func_quote::val_str(String *str) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + ulong max_allowed_packet= current_thd->variables.max_allowed_packet; char *from, *to, *end, *start; - String *arg= args[0]->val_str(str); + String *arg= args[0]->val_str(&tmp_value); uint arg_length, new_length; if (!arg) // Null argument { @@ -3916,14 +3947,17 @@ String *Item_func_quote::val_str(String *str) new_length= arg_length + 2; /* for beginning and ending ' signs */ for (from= (char*) arg->ptr(), end= from + arg_length; from < end; from++) new_length+= get_esc_bit(escmask, (uchar) *from); + if (new_length > max_allowed_packet) + goto toolong; } else { new_length= (arg_length * 2) + /* For string characters */ (2 * collation.collation->mbmaxlen); /* For quotes */ + set_if_smaller(new_length, max_allowed_packet); } - if (tmp_value.alloc(new_length)) + if (str->alloc(new_length)) goto null; if (collation.collation->mbmaxlen > 1) @@ -3931,12 +3965,12 @@ String *Item_func_quote::val_str(String *str) CHARSET_INFO *cs= collation.collation; int mblen; uchar *to_end; - to= (char*) tmp_value.ptr(); + to= (char*) str->ptr(); to_end= (uchar*) to + new_length; /* Put leading quote */ if ((mblen= cs->cset->wc_mb(cs, '\'', (uchar *) to, to_end)) <= 0) - goto null; + goto toolong; to+= mblen; for (start= (char*) arg->ptr(), end= start + arg_length; start < end; ) @@ -3956,26 +3990,26 @@ String *Item_func_quote::val_str(String *str) if (escape) { if ((mblen= cs->cset->wc_mb(cs, '\\', (uchar*) to, to_end)) <= 0) - goto null; + goto toolong; to+= mblen; } if ((mblen= cs->cset->wc_mb(cs, wc, (uchar*) to, to_end)) <= 0) - goto null; + goto toolong; to+= mblen; } /* Put trailing quote */ if ((mblen= cs->cset->wc_mb(cs, '\'', (uchar *) to, to_end)) <= 0) - goto null; + goto toolong; to+= mblen; - new_length= to - tmp_value.ptr(); + new_length= to - str->ptr(); goto ret; } /* We replace characters from the end to the beginning */ - to= (char*) tmp_value.ptr() + new_length - 1; + to= (char*) str->ptr() + new_length - 1; *to--= '\''; for (start= (char*) arg->ptr(),end= start + arg_length; end-- != start; to--) { @@ -4005,11 +4039,16 @@ String *Item_func_quote::val_str(String *str) *to= '\''; ret: - tmp_value.length(new_length); - tmp_value.set_charset(collation.collation); + str->length(new_length); + str->set_charset(collation.collation); null_value= 0; - return &tmp_value; + return str; +toolong: + push_warning_printf(current_thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_ALLOWED_PACKET_OVERFLOWED, + ER_THD(current_thd, ER_WARN_ALLOWED_PACKET_OVERFLOWED), + func_name(), max_allowed_packet); null: null_value= 1; return 0; @@ -4077,7 +4116,7 @@ String *Item_func_compress::val_str(String *str) char *tmp, *last_char; DBUG_ASSERT(fixed == 1); - if (!(res= args[0]->val_str(str))) + if (!(res= args[0]->val_str(&tmp_value))) { null_value= 1; return 0; @@ -4098,13 +4137,13 @@ String *Item_func_compress::val_str(String *str) // Check new_size overflow: new_size <= res->length() if (((uint32) (new_size+5) <= res->length()) || - buffer.realloc((uint32) new_size + 4 + 1)) + str->realloc((uint32) new_size + 4 + 1)) { null_value= 1; return 0; } - body= ((Byte*)buffer.ptr()) + 4; + body= ((Byte*)str->ptr()) + 4; // As far as we have checked res->is_empty() we can use ptr() if ((err= my_compress_buffer(body, &new_size, (const uchar *)res->ptr(), @@ -4118,7 +4157,7 @@ String *Item_func_compress::val_str(String *str) return 0; } - tmp= (char*)buffer.ptr(); // int4store is a macro; avoid side effects + tmp= (char*) str->ptr(); // int4store is a macro; avoid side effects int4store(tmp, res->length() & 0x3FFFFFFF); /* This is to ensure that things works for CHAR fields, which trim ' ': */ @@ -4129,15 +4168,15 @@ String *Item_func_compress::val_str(String *str) new_size++; } - buffer.length((uint32)new_size + 4); - return &buffer; + str->length((uint32)new_size + 4); + return str; } String *Item_func_uncompress::val_str(String *str) { DBUG_ASSERT(fixed == 1); - String *res= args[0]->val_str(str); + String *res= args[0]->val_str(&tmp_value); ulong new_size; int err; uint code; @@ -4170,14 +4209,14 @@ String *Item_func_uncompress::val_str(String *str) max_allowed_packet)); goto err; } - if (buffer.realloc((uint32)new_size)) + if (str->realloc((uint32)new_size)) goto err; - if ((err= uncompress((Byte*)buffer.ptr(), &new_size, + if ((err= uncompress((Byte*)str->ptr(), &new_size, ((const Bytef*)res->ptr())+4,res->length()-4)) == Z_OK) { - buffer.length((uint32) new_size); - return &buffer; + str->length((uint32) new_size); + return str; } code= ((err == Z_BUF_ERROR) ? ER_ZLIB_Z_BUF_ERROR : @@ -5047,7 +5086,7 @@ bool Item_dyncol_get::get_date(MYSQL_TIME *ltime, ulonglong fuzzy_date) goto null; case DYN_COL_INT: signed_value= 1; // For error message - /* fall_trough */ + /* fall through */ case DYN_COL_UINT: if (signed_value || val.x.ulong_value <= LONGLONG_MAX) { @@ -5061,7 +5100,7 @@ bool Item_dyncol_get::get_date(MYSQL_TIME *ltime, ulonglong fuzzy_date) } /* let double_to_datetime_with_warn() issue the warning message */ val.x.double_value= static_cast(ULONGLONG_MAX); - /* fall_trough */ + /* fall through */ case DYN_COL_DOUBLE: if (double_to_datetime_with_warn(val.x.double_value, ltime, fuzzy_date, 0 /* TODO */)) diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 65c6dacbc73..9c7dfc03aa3 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -93,7 +93,7 @@ public: { return val_str_from_val_str_ascii(str, &ascii_buf); } - virtual String *val_str_ascii(String *)= 0; + String *val_str_ascii(String *)= 0; }; @@ -142,7 +142,6 @@ public: class Item_func_md5 :public Item_str_ascii_checksum_func { - String tmp_value; public: Item_func_md5(THD *thd, Item *a): Item_str_ascii_checksum_func(thd, a) {} String *val_str_ascii(String *); @@ -258,7 +257,6 @@ public: class Item_func_decode_histogram :public Item_str_func { - String tmp_value; public: Item_func_decode_histogram(THD *thd, Item *a, Item *b): Item_str_func(thd, a, b) {} @@ -332,6 +330,7 @@ public: DBUG_VOID_RETURN; } String *val_str(String *str); + bool fix_fields(THD *thd, Item **ref); void fix_length_and_dec(); const char *func_name() const { return "regexp_replace"; } Item *get_copy(THD *thd, MEM_ROOT *mem_root) @@ -354,6 +353,7 @@ public: DBUG_VOID_RETURN; } String *val_str(String *str); + bool fix_fields(THD *thd, Item **ref); void fix_length_and_dec(); const char *func_name() const { return "regexp_substr"; } Item *get_copy(THD *thd, MEM_ROOT *mem_root) @@ -490,7 +490,7 @@ public: String *val_str(String *); void fix_length_and_dec(); const char *func_name() const { return "trim"; } - virtual void print(String *str, enum_query_type query_type); + void print(String *str, enum_query_type query_type); virtual const char *mode_name() const { return "both"; } Item *get_copy(THD *thd, MEM_ROOT *mem_root) { return get_item_copy(thd, mem_root, this); } @@ -684,10 +684,7 @@ class Item_func_sysconst :public Item_str_func public: Item_func_sysconst(THD *thd): Item_str_func(thd) { collation.set(system_charset_info,DERIVATION_SYSCONST); } - Item *safe_charset_converter(THD *thd, CHARSET_INFO *tocs) - { - return const_charset_converter(thd, tocs, true, fully_qualified_func_name()); - } + Item *safe_charset_converter(THD *thd, CHARSET_INFO *tocs); /* Used to create correct Item name in new converted item in safe_charset_converter, return string representation of this function @@ -699,6 +696,7 @@ public: return mark_unsupported_function(fully_qualified_func_name(), arg, VCOL_SESSION_FUNC); } + bool const_item() const; }; @@ -787,7 +785,7 @@ public: String *val_str(String *) { DBUG_ASSERT(fixed == 1); - return (null_value ? 0 : &str_value); + return null_value ? NULL : &str_value; } bool check_vcol_func_processor(void *arg) { @@ -844,7 +842,6 @@ public: class Item_func_format :public Item_str_ascii_func { - String tmp_str; MY_LOCALE *locale; public: Item_func_format(THD *thd, Item *org, Item *dec): @@ -856,7 +853,6 @@ public: String *val_str_ascii(String *); void fix_length_and_dec(); const char *func_name() const { return "format"; } - virtual void print(String *str, enum_query_type query_type); Item *get_copy(THD *thd, MEM_ROOT *mem_root) { return get_item_copy(thd, mem_root, this); } }; @@ -909,7 +905,6 @@ public: class Item_func_binlog_gtid_pos :public Item_str_func { - String tmp_value; public: Item_func_binlog_gtid_pos(THD *thd, Item *arg1, Item *arg2): Item_str_func(thd, arg1, arg2) {} @@ -918,7 +913,6 @@ public: const char *func_name() const { return "binlog_gtid_pos"; } bool check_vcol_func_processor(void *arg) { - return mark_unsupported_function(func_name(), "()", arg, VCOL_IMPOSSIBLE); } Item *get_copy(THD *thd, MEM_ROOT *mem_root) @@ -1074,7 +1068,7 @@ public: collation.set(&my_charset_bin); max_length=args[0]->max_length; } - virtual void print(String *str, enum_query_type query_type); + void print(String *str, enum_query_type query_type); const char *func_name() const { return "cast_as_binary"; } bool need_parentheses_in_default() { return true; } Item *get_copy(THD *thd, MEM_ROOT *mem_root) @@ -1218,7 +1212,7 @@ public: } void fix_length_and_dec(); const char *func_name() const { return "convert"; } - virtual void print(String *str, enum_query_type query_type); + void print(String *str, enum_query_type query_type); Item *get_copy(THD *thd, MEM_ROOT *mem_root) { return get_item_copy(thd, mem_root, this); } }; @@ -1234,7 +1228,7 @@ public: const char *func_name() const { return "collate"; } enum precedence precedence() const { return COLLATE_PRECEDENCE; } enum Functype functype() const { return COLLATE_FUNC; } - virtual void print(String *str, enum_query_type query_type); + void print(String *str, enum_query_type query_type); Item_field *field_for_view_update() { /* this function is transparent for view updating */ @@ -1354,7 +1348,7 @@ public: class Item_func_compress: public Item_str_binary_checksum_func { - String buffer; + String tmp_value; public: Item_func_compress(THD *thd, Item *a) :Item_str_binary_checksum_func(thd, a) {} @@ -1367,7 +1361,7 @@ public: class Item_func_uncompress: public Item_str_binary_checksum_func { - String buffer; + String tmp_value; public: Item_func_uncompress(THD *thd, Item *a) :Item_str_binary_checksum_func(thd, a) {} @@ -1416,8 +1410,8 @@ public: void fix_length_and_dec(); const char *func_name() const{ return "column_create"; } String *val_str(String *); - virtual void print(String *str, enum_query_type query_type); - virtual enum Functype functype() const { return DYNCOL_FUNC; } + void print(String *str, enum_query_type query_type); + enum Functype functype() const { return DYNCOL_FUNC; } Item *get_copy(THD *thd, MEM_ROOT *mem_root) { return get_item_copy(thd, mem_root, this); } }; @@ -1431,7 +1425,7 @@ public: {} const char *func_name() const{ return "column_add"; } String *val_str(String *); - virtual void print(String *str, enum_query_type query_type); + void print(String *str, enum_query_type query_type); Item *get_copy(THD *thd, MEM_ROOT *mem_root) { return get_item_copy(thd, mem_root, this); } }; diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 5f15e386b8d..191380b38b1 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -116,9 +116,8 @@ void Item_subselect::init(st_select_lex *select_lex, do not take into account expression inside aggregate functions because they can access original table fields */ - parsing_place= (outer_select->in_sum_expr ? - NO_MATTER : - outer_select->parsing_place); + parsing_place= (outer_select->in_sum_expr ? NO_MATTER + : outer_select->parsing_place); if (unit->is_union()) engine= new subselect_union_engine(unit, result, this); else @@ -337,7 +336,8 @@ bool Item_subselect::enumerate_field_refs_processor(void *arg) while ((upper= it++)) { - if (upper->item->walk(&Item::enumerate_field_refs_processor, FALSE, arg)) + if (upper->item && + upper->item->walk(&Item::enumerate_field_refs_processor, FALSE, arg)) return TRUE; } return FALSE; @@ -1440,8 +1440,9 @@ Item_in_subselect::Item_in_subselect(THD *thd, Item * left_exp, st_select_lex *select_lex): Item_exists_subselect(thd), left_expr_cache(0), first_execution(TRUE), in_strategy(SUBS_NOT_TRANSFORMED), - pushed_cond_guards(NULL), is_jtbm_merged(FALSE), is_jtbm_const_tab(FALSE), - is_flattenable_semijoin(FALSE), is_registered_semijoin(FALSE), + pushed_cond_guards(NULL), do_not_convert_to_sj(FALSE), is_jtbm_merged(FALSE), + is_jtbm_const_tab(FALSE), is_flattenable_semijoin(FALSE), + is_registered_semijoin(FALSE), upper_item(0) { DBUG_ENTER("Item_in_subselect::Item_in_subselect"); @@ -2599,6 +2600,27 @@ bool Item_in_subselect::inject_in_to_exists_cond(JOIN *join_arg) DBUG_ENTER("Item_in_subselect::inject_in_to_exists_cond"); DBUG_ASSERT(thd == join_arg->thd); + if (select_lex->min_max_opt_list.elements) + { + /* + MIN/MAX optimizations have been applied to Item_sum objects + of the subquery this subquery predicate in opt_sum_query(). + Injection of new condition invalidates this optimizations. + Thus those optimizations must be rolled back. + */ + List_iterator_fast it(select_lex->min_max_opt_list); + Item_sum *item; + while ((item= it++)) + { + item->clear(); + item->reset_forced_const(); + } + if (where_item) + where_item->update_used_tables(); + if (having_item) + having_item->update_used_tables(); + } + if (where_item) { List *and_args= NULL; @@ -3407,7 +3429,8 @@ bool Item_in_subselect::init_cond_guards() { DBUG_ASSERT(thd); uint cols_num= left_expr->cols(); - if (!abort_on_null && left_expr->maybe_null && !pushed_cond_guards) + if (!abort_on_null && !pushed_cond_guards && + (left_expr->maybe_null || cols_num > 1)) { if (!(pushed_cond_guards= (bool*)thd->alloc(sizeof(bool) * cols_num))) return TRUE; @@ -3776,7 +3799,10 @@ int subselect_single_select_engine::exec() } } if (item->engine_changed(this)) + { + thd->lex->current_select= save_select; DBUG_RETURN(1); + } } if (select_lex->uncacheable && select_lex->uncacheable != UNCACHEABLE_EXPLAIN diff --git a/sql/item_subselect.h b/sql/item_subselect.h index 83bd9ed0bdf..7f827bbe982 100644 --- a/sql/item_subselect.h +++ b/sql/item_subselect.h @@ -508,6 +508,8 @@ public: Item *left_expr_orig; /* Priority of this predicate in the convert-to-semi-join-nest process. */ int sj_convert_priority; + /* May be TRUE only for the candidates to semi-join conversion */ + bool do_not_convert_to_sj; /* Types of left_expr and subquery's select list allow to perform subquery materialization. Currently, we set this to FALSE when it as well could @@ -598,8 +600,8 @@ public: Item_in_subselect(THD *thd_arg): Item_exists_subselect(thd_arg), left_expr_cache(0), first_execution(TRUE), in_strategy(SUBS_NOT_TRANSFORMED), - pushed_cond_guards(NULL), func(NULL), is_jtbm_merged(FALSE), - is_jtbm_const_tab(FALSE), upper_item(0) {} + pushed_cond_guards(NULL), func(NULL), do_not_convert_to_sj(FALSE), + is_jtbm_merged(FALSE), is_jtbm_const_tab(FALSE), upper_item(0) {} void cleanup(); subs_type substype() { return IN_SUBS; } void reset() @@ -654,6 +656,8 @@ public: */ int get_identifier(); + void block_conversion_to_sj () { do_not_convert_to_sj= TRUE; } + bool test_strategy(uchar strategy) { return MY_TEST(in_strategy & strategy); } @@ -724,6 +728,13 @@ public: in_strategy= (SUBS_STRATEGY_CHOSEN | strategy); DBUG_VOID_RETURN; } + + bool walk(Item_processor processor, bool walk_subquery, void *arg) + { + return left_expr->walk(processor, walk_subquery, arg) || + Item_subselect::walk(processor, walk_subquery, arg); + } + bool exists2in_processor(void *opt_arg __attribute__((unused))) { return 0; diff --git a/sql/item_sum.cc b/sql/item_sum.cc index cb2d3e839b8..35e8dea46a7 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -38,8 +38,8 @@ ulonglong Item_sum::ram_limitation(THD *thd) { - return MY_MIN(thd->variables.tmp_table_size, - thd->variables.max_heap_table_size); + return MY_MIN(thd->variables.tmp_memory_table_size, + thd->variables.max_heap_table_size); } diff --git a/sql/item_sum.h b/sql/item_sum.h index 57375b29114..852df778087 100644 --- a/sql/item_sum.h +++ b/sql/item_sum.h @@ -486,6 +486,7 @@ public: used_tables_cache= 0; const_item_cache= true; } + void reset_forced_const() { const_item_cache= false; } virtual bool const_during_execution() const { return false; } virtual void print(String *str, enum_query_type query_type); void fix_num_length_and_dec(); diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 0a564780ac2..6e476dfa746 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -477,14 +477,14 @@ static bool make_date_time(DATE_TIME_FORMAT *format, MYSQL_TIME *l_time, { switch (*++ptr) { case 'M': - if (!l_time->month) + if (type == MYSQL_TIMESTAMP_TIME || !l_time->month) return 1; str->append(locale->month_names->type_names[l_time->month-1], (uint) strlen(locale->month_names->type_names[l_time->month-1]), system_charset_info); break; case 'b': - if (!l_time->month) + if (type == MYSQL_TIMESTAMP_TIME || !l_time->month) return 1; str->append(locale->ab_month_names->type_names[l_time->month-1], (uint) strlen(locale->ab_month_names->type_names[l_time->month-1]), @@ -534,26 +534,38 @@ static bool make_date_time(DATE_TIME_FORMAT *format, MYSQL_TIME *l_time, } break; case 'Y': + if (type == MYSQL_TIMESTAMP_TIME) + return 1; length= (uint) (int10_to_str(l_time->year, intbuff, 10) - intbuff); str->append_with_prefill(intbuff, length, 4, '0'); break; case 'y': + if (type == MYSQL_TIMESTAMP_TIME) + return 1; length= (uint) (int10_to_str(l_time->year%100, intbuff, 10) - intbuff); str->append_with_prefill(intbuff, length, 2, '0'); break; case 'm': + if (type == MYSQL_TIMESTAMP_TIME) + return 1; length= (uint) (int10_to_str(l_time->month, intbuff, 10) - intbuff); str->append_with_prefill(intbuff, length, 2, '0'); break; case 'c': + if (type == MYSQL_TIMESTAMP_TIME) + return 1; length= (uint) (int10_to_str(l_time->month, intbuff, 10) - intbuff); str->append_with_prefill(intbuff, length, 1, '0'); break; case 'd': + if (type == MYSQL_TIMESTAMP_TIME) + return 1; length= (uint) (int10_to_str(l_time->day, intbuff, 10) - intbuff); str->append_with_prefill(intbuff, length, 2, '0'); break; case 'e': + if (type == MYSQL_TIMESTAMP_TIME) + return 1; length= (uint) (int10_to_str(l_time->day, intbuff, 10) - intbuff); str->append_with_prefill(intbuff, length, 1, '0'); break; @@ -2422,7 +2434,7 @@ String *Item_char_typecast::copy(String *str, CHARSET_INFO *strcs) if (copier.copy_with_warn(cast_cs, &tmp_value, strcs, str->ptr(), str->length(), cast_length)) { - null_value= 1; // In strict mode: malformed data or could not convert + null_value= 1; // EOM return 0; } check_truncation_with_warn(str, copier.source_end_pos() - str->ptr()); @@ -3122,7 +3134,7 @@ get_date_time_result_type(const char *format, uint length) const char *val= format; const char *end= format + length; - for (; val != end && val != end; val++) + for (; val != end; val++) { if (*val == '%' && val+1 != end) { diff --git a/sql/item_timefunc.h b/sql/item_timefunc.h index d8f69e2098d..b0a083bf24f 100644 --- a/sql/item_timefunc.h +++ b/sql/item_timefunc.h @@ -199,7 +199,6 @@ public: } bool check_vcol_func_processor(void *arg) { - return mark_unsupported_function(func_name(), "()", arg, VCOL_SESSION_FUNC); } Item *get_copy(THD *thd, MEM_ROOT *mem_root) @@ -693,8 +692,7 @@ public: virtual void store_now_in_TIME(THD *thd, MYSQL_TIME *now_time)=0; bool check_vcol_func_processor(void *arg) { - return mark_unsupported_function(func_name(), "()", arg, - VCOL_TIME_FUNC); + return mark_unsupported_function(func_name(), "()", arg, VCOL_TIME_FUNC); } }; @@ -832,6 +830,8 @@ public: bool eq(const Item *item, bool binary_cmp) const; bool check_vcol_func_processor(void *arg) { + if (is_time_format) + return false; return mark_unsupported_function(func_name(), "()", arg, VCOL_SESSION_FUNC); } Item *get_copy(THD *thd, MEM_ROOT *mem_root) diff --git a/sql/item_windowfunc.cc b/sql/item_windowfunc.cc index 59a22c63ed5..27b007201c5 100644 --- a/sql/item_windowfunc.cc +++ b/sql/item_windowfunc.cc @@ -71,7 +71,7 @@ Item_window_func::fix_fields(THD *thd, Item **ref) { DBUG_ASSERT(fixed == 0); - enum_parsing_place place= thd->lex->current_select->parsing_place; + enum_parsing_place place= thd->lex->current_select->context_analysis_place; if (!(place == SELECT_LIST || place == IN_ORDER_BY)) { diff --git a/sql/item_windowfunc.h b/sql/item_windowfunc.h index b4953c8a6ac..0dee60915f8 100644 --- a/sql/item_windowfunc.h +++ b/sql/item_windowfunc.h @@ -848,6 +848,17 @@ public: read_value_from_result_field= true; } + bool is_null() + { + if (force_return_blank) + return false; + + if (read_value_from_result_field) + return result_field->is_null(); + + return window_func()->is_null(); + } + double val_real() { double res; diff --git a/sql/item_xmlfunc.cc b/sql/item_xmlfunc.cc index 4d848a0f737..10dda8f20e8 100644 --- a/sql/item_xmlfunc.cc +++ b/sql/item_xmlfunc.cc @@ -1,4 +1,5 @@ -/* Copyright (c) 2005, 2013, Oracle and/or its affiliates. +/* Copyright (c) 2005, 2016, Oracle and/or its affiliates. + Copyright (c) 2009, 2017, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -2836,9 +2837,9 @@ int xml_enter(MY_XML_PARSER *st,const char *attr, size_t len) node.parent= data->parent; // Set parent for the new node to old parent data->parent= numnodes; // Remember current node as new parent - DBUG_ASSERT(data->level <= MAX_LEVEL); + DBUG_ASSERT(data->level < MAX_LEVEL); data->pos[data->level]= numnodes; - if (data->level < MAX_LEVEL) + if (data->level < MAX_LEVEL - 1) node.level= data->level++; else return MY_XML_ERROR; diff --git a/sql/lock.cc b/sql/lock.cc index a51c34365fa..06cb00fe32d 100644 --- a/sql/lock.cc +++ b/sql/lock.cc @@ -422,6 +422,7 @@ void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock) void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock, bool free_lock) { DBUG_ENTER("mysql_unlock_tables"); + bool errors= thd->is_error(); THD_STAGE_INFO(thd, stage_unlocking_tables); if (sql_lock->table_count) @@ -430,6 +431,8 @@ void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock, bool free_lock) thr_multi_unlock(sql_lock->locks, sql_lock->lock_count, 0); if (free_lock) my_free(sql_lock); + if (!errors) + thd->clear_error(); DBUG_VOID_RETURN; } diff --git a/sql/log.cc b/sql/log.cc index a6ece712099..de501d94100 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -5636,13 +5636,20 @@ int THD::binlog_write_table_map(TABLE *table, bool is_transactional, IO_CACHE *file= cache_mngr->get_binlog_cache_log(use_trans_cache(this, is_transactional)); Log_event_writer writer(file); + binlog_cache_data *cache_data= + cache_mngr->get_binlog_cache_data(use_trans_cache(this, is_transactional)); + if (with_annotate && *with_annotate) { Annotate_rows_log_event anno(table->in_use, is_transactional, false); /* Annotate event should be written not more than once */ *with_annotate= 0; if ((error= writer.write(&anno))) + { + if (my_errno == EFBIG) + cache_data->set_incident(); DBUG_RETURN(error); + } } if ((error= writer.write(&the_event))) DBUG_RETURN(error); @@ -9181,8 +9188,10 @@ void TC_LOG_MMAP::close() mysql_cond_destroy(&COND_pool); mysql_cond_destroy(&COND_active); mysql_cond_destroy(&COND_queue_busy); + /* fall through */ case 5: data[0]='A'; // garble the first (signature) byte, in case mysql_file_delete fails + /* fall through */ case 4: for (i=0; i < npages; i++) { @@ -9191,10 +9200,13 @@ void TC_LOG_MMAP::close() mysql_mutex_destroy(&pages[i].lock); mysql_cond_destroy(&pages[i].cond); } + /* fall through */ case 3: my_free(pages); + /* fall through */ case 2: my_munmap((char*)data, (size_t)file_length); + /* fall through */ case 1: mysql_file_close(fd, MYF(0)); } @@ -9305,8 +9317,10 @@ int TC_LOG_BINLOG::open(const char *opt_name) if (using_heuristic_recover()) { + mysql_mutex_lock(&LOCK_log); /* generate a new binlog to mask a corrupted one */ open(opt_name, LOG_BIN, 0, 0, WRITE_CACHE, max_binlog_size, 0, TRUE); + mysql_mutex_unlock(&LOCK_log); cleanup(); return 1; } @@ -9623,6 +9637,8 @@ binlog_background_thread(void *arg __attribute__((unused))) { THD_STAGE_INFO(thd, stage_binlog_processing_checkpoint_notify); DEBUG_SYNC(thd, "binlog_background_thread_before_mark_xid_done"); + /* Set the thread start time */ + thd->set_time(); /* Grab next pointer first, as mark_xid_done() may free the element. */ next= queue->next_in_queue; mysql_bin_log.mark_xid_done(queue->binlog_id, true); @@ -9750,8 +9766,8 @@ int TC_LOG_BINLOG::recover(LOG_INFO *linfo, const char *last_log_name, sizeof(xev->xid)); if (!x || my_hash_insert(&xids, x)) goto err2; - break; } + break; } case BINLOG_CHECKPOINT_EVENT: if (first_round && do_xa) diff --git a/sql/log_event.cc b/sql/log_event.cc index 406b14cc2a9..b4fdd9eb8e7 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -390,12 +390,6 @@ static void pretty_print_str(IO_CACHE* cache, const char* str, int len) #if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT) -static void clear_all_errors(THD *thd, Relay_log_info *rli) -{ - thd->is_slave_error = 0; - thd->clear_error(); -} - inline int idempotent_error_code(int err_code) { int ret= 0; @@ -3477,7 +3471,8 @@ void Log_event::print_base64(IO_CACHE* file, #ifdef WHEN_FLASHBACK_REVIEW_READY if (print_event_info->verbose || need_flashback_review) #else - if (print_event_info->verbose) + // Flashback need the table_map to parse the event + if (print_event_info->verbose || is_flashback) #endif { Rows_log_event *ev= NULL; @@ -3564,7 +3559,8 @@ void Log_event::print_base64(IO_CACHE* file, close_cached_file(&tmp_cache); } #else - ev->print_verbose(file, print_event_info); + if (print_event_info->verbose) + ev->print_verbose(file, print_event_info); #endif delete ev; } @@ -5056,7 +5052,7 @@ int Query_log_event::do_apply_event(rpl_group_info *rgi, DBUG_PRINT("info", ("log_pos: %lu", (ulong) log_pos)); - clear_all_errors(thd, const_cast(rli)); + thd->clear_error(1); current_stmt_is_commit= is_commit(); DBUG_ASSERT(!current_stmt_is_commit || !rgi->tables_to_lock); @@ -5277,7 +5273,7 @@ int Query_log_event::do_apply_event(rpl_group_info *rgi, to check/fix it. */ if (mysql_test_parse_for_slave(thd, thd->query(), thd->query_length())) - clear_all_errors(thd, const_cast(rli)); /* Can ignore query */ + thd->clear_error(1); else { rli->report(ERROR_LEVEL, expected_error, rgi->gtid_info(), @@ -5358,7 +5354,7 @@ compare_errors: ignored_error_code(actual_error)) { DBUG_PRINT("info",("error ignored")); - clear_all_errors(thd, const_cast(rli)); + thd->clear_error(1); if (actual_error == ER_QUERY_INTERRUPTED || actual_error == ER_CONNECTION_KILLED) thd->reset_killed(); @@ -6836,8 +6832,7 @@ int Load_log_event::do_apply_event(NET* net, rpl_group_info *rgi, new_db.str= (char *) rpl_filter->get_rewrite_db(db, &new_db.length); thd->set_db(new_db.str, new_db.length); DBUG_ASSERT(thd->query() == 0); - thd->is_slave_error= 0; - clear_all_errors(thd, const_cast(rli)); + thd->clear_error(1); /* see Query_log_event::do_apply_event() and BUG#13360 */ DBUG_ASSERT(!rgi->m_table_map.count()); @@ -6847,7 +6842,7 @@ int Load_log_event::do_apply_event(NET* net, rpl_group_info *rgi, */ lex_start(thd); thd->lex->local_file= local_fname; - thd->reset_for_next_command(); + thd->reset_for_next_command(0); // Errors are cleared above /* We test replicate_*_db rules. Note that we have already prepared @@ -7449,8 +7444,10 @@ Gtid_log_event::Gtid_log_event(THD *thd_arg, uint64 seq_no_arg, if (thd_arg->transaction.stmt.trans_did_wait() || thd_arg->transaction.all.trans_did_wait()) flags2|= FL_WAITED; - if (sql_command_flags[thd->lex->sql_command] & - (CF_DISALLOW_IN_RO_TRANS | CF_AUTO_COMMIT_TRANS)) + if (thd_arg->transaction.stmt.trans_did_ddl() || + thd_arg->transaction.stmt.has_created_dropped_temp_table() || + thd_arg->transaction.all.trans_did_ddl() || + thd_arg->transaction.all.has_created_dropped_temp_table()) flags2|= FL_DDL; else if (is_transactional) flags2|= FL_TRANSACTIONAL; @@ -8402,7 +8399,6 @@ int Xid_log_event::do_apply_event(rpl_group_info *rgi) consistent. */ #ifdef WITH_WSREP - /*Set wsrep_affected_rows = 0 */ thd->wsrep_affected_rows= 0; #endif @@ -10252,6 +10248,7 @@ Rows_log_event::Rows_log_event(const char *buf, uint event_len, post_start+= RW_FLAGS_OFFSET; } + m_flags_pos= post_start - buf; m_flags= uint2korr(post_start); post_start+= 2; @@ -10946,7 +10943,7 @@ int Rows_log_event::do_apply_event(rpl_group_info *rgi) slave_rows_error_report(WARNING_LEVEL, error, rgi, thd, table, get_type_str(), RPL_LOG_NAME, (ulong) log_pos); - clear_all_errors(thd, const_cast(rli)); + thd->clear_error(1); error= 0; if (idempotent_error == 0) break; @@ -10998,7 +10995,7 @@ int Rows_log_event::do_apply_event(rpl_group_info *rgi) slave_rows_error_report(WARNING_LEVEL, error, rgi, thd, table, get_type_str(), RPL_LOG_NAME, (ulong) log_pos); - clear_all_errors(thd, const_cast(rli)); + thd->clear_error(1); error= 0; } } // if (table) @@ -11300,18 +11297,18 @@ void Rows_log_event::print_helper(FILE *file, if (get_flags(STMT_END_F)) { - reinit_io_cache(head, READ_CACHE, 0L, FALSE, FALSE); - output_buf.append(head, head->end_of_file); - reinit_io_cache(head, WRITE_CACHE, 0, FALSE, TRUE); - - reinit_io_cache(body, READ_CACHE, 0L, FALSE, FALSE); - output_buf.append(body, body->end_of_file); - reinit_io_cache(body, WRITE_CACHE, 0, FALSE, TRUE); + LEX_STRING tmp_str; + copy_event_cache_to_string_and_reinit(head, &tmp_str); + output_buf.append(&tmp_str); + my_free(tmp_str.str); + copy_event_cache_to_string_and_reinit(body, &tmp_str); + output_buf.append(&tmp_str); + my_free(tmp_str.str); #ifdef WHEN_FLASHBACK_REVIEW_READY - reinit_io_cache(sql, READ_CACHE, 0L, FALSE, FALSE); - output_buf.append(sql, sql->end_of_file); - reinit_io_cache(sql, WRITE_CACHE, 0, FALSE, TRUE); + copy_event_cache_to_string_and_reinit(sql, &tmp_str); + output_buf.append(&tmp_str); + my_free(tmp_str.str); #endif } } diff --git a/sql/log_event.h b/sql/log_event.h index 6c6dce7e18e..a06781aebeb 100644 --- a/sql/log_event.h +++ b/sql/log_event.h @@ -4397,6 +4397,7 @@ public: void set_flags(flag_set flags_arg) { m_flags |= flags_arg; } void clear_flags(flag_set flags_arg) { m_flags &= ~flags_arg; } flag_set get_flags(flag_set flags_arg) const { return m_flags & flags_arg; } + void update_flags() { int2store(temp_buf + m_flags_pos, m_flags); } Log_event_type get_type_code() { return m_type; } /* Specific type (_V1 etc) */ virtual Log_event_type get_general_type_code() = 0; /* General rows op type, no version */ @@ -4555,6 +4556,7 @@ protected: uchar *m_rows_end; /* One-after the end of the allocated space */ size_t m_rows_before_size; /* The length before m_rows_buf */ + size_t m_flags_pos; /* The position of the m_flags */ flag_set m_flags; /* Flags for row-level events */ diff --git a/sql/log_event_old.cc b/sql/log_event_old.cc index 381f4129321..8f1cfe17656 100644 --- a/sql/log_event_old.cc +++ b/sql/log_event_old.cc @@ -221,6 +221,8 @@ Old_rows_log_event::do_apply_event(Old_rows_log_event *ev, rpl_group_info *rgi) /* A small test to verify that objects have consistent types */ DBUG_ASSERT(sizeof(ev_thd->variables.option_bits) == sizeof(OPTION_RELAXED_UNIQUE_CHECKS)); + table->rpl_write_set= table->write_set; + error= do_before_row_operations(table); while (error == 0 && row_start < ev->m_rows_end) { @@ -1585,7 +1587,7 @@ int Old_rows_log_event::do_apply_event(rpl_group_info *rgi) rli->report(ERROR_LEVEL, thd->net.last_errno, NULL, "Error in %s event: row application failed. %s", get_type_str(), thd->net.last_error); - thd->is_slave_error = 1; + thd->is_slave_error= 1; break; } diff --git a/sql/mdl.cc b/sql/mdl.cc index f1a505f3d84..25809c3d9cc 100644 --- a/sql/mdl.cc +++ b/sql/mdl.cc @@ -2320,11 +2320,12 @@ MDL_context::upgrade_shared_lock(MDL_ticket *mdl_ticket, if (mdl_ticket->has_stronger_or_equal_type(new_type)) DBUG_RETURN(FALSE); - /* Only allow upgrades from SHARED_UPGRADABLE/NO_WRITE/NO_READ_WRITE/READ */ + /* Only allow upgrades from UPGRADABLE/NO_WRITE/NO_READ_WRITE/READ/WRITE */ DBUG_ASSERT(mdl_ticket->m_type == MDL_SHARED_UPGRADABLE || mdl_ticket->m_type == MDL_SHARED_NO_WRITE || mdl_ticket->m_type == MDL_SHARED_NO_READ_WRITE || - mdl_ticket->m_type == MDL_SHARED_READ); + mdl_ticket->m_type == MDL_SHARED_READ || + mdl_ticket->m_type == MDL_SHARED_WRITE); mdl_xlock_request.init(&mdl_ticket->m_lock->key, new_type, MDL_TRANSACTION); diff --git a/sql/multi_range_read.cc b/sql/multi_range_read.cc index 53d0c3204a1..50918d8dcf2 100644 --- a/sql/multi_range_read.cc +++ b/sql/multi_range_read.cc @@ -1224,28 +1224,18 @@ bool DsMrr_impl::setup_buffer_sharing(uint key_size_in_keybuf, ptrdiff_t bytes_for_keys= (full_buf_end - full_buf) - bytes_for_rowids; - if (bytes_for_keys < key_buff_elem_size + 1) - { - ptrdiff_t add= key_buff_elem_size + 1 - bytes_for_keys; - bytes_for_keys= key_buff_elem_size + 1; - bytes_for_rowids -= add; - } - - if (bytes_for_rowids < (ptrdiff_t)rowid_buf_elem_size + 1) - { - ptrdiff_t add= (ptrdiff_t)(rowid_buf_elem_size + 1 - bytes_for_rowids); - bytes_for_rowids= (ptrdiff_t)rowid_buf_elem_size + 1; - bytes_for_keys -= add; - } + if (bytes_for_keys < key_buff_elem_size + 1 || + bytes_for_rowids < (ptrdiff_t)rowid_buf_elem_size + 1) + return TRUE; /* Failed to provide minimum space for one of the buffers */ rowid_buffer_end= full_buf + bytes_for_rowids; rowid_buffer.set_buffer_space(full_buf, rowid_buffer_end); key_buffer= &backward_key_buf; key_buffer->set_buffer_space(rowid_buffer_end, full_buf_end); - if (!key_buffer->have_space_for(key_buff_elem_size) || - !rowid_buffer.have_space_for((size_t)rowid_buf_elem_size)) - return TRUE; /* Failed to provide minimum space for one of the buffers */ + /* The above code guarantees that the buffers are big enough */ + DBUG_ASSERT(key_buffer->have_space_for(key_buff_elem_size) && + rowid_buffer.have_space_for((size_t)rowid_buf_elem_size)); return FALSE; } diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 6108ed6ffd4..f464ec807f6 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -79,6 +79,10 @@ #include "sql_callback.h" #include "threadpool.h" +#ifdef HAVE_OPENSSL +#include +#endif + #ifdef WITH_PERFSCHEMA_STORAGE_ENGINE #include "../storage/perfschema/pfs_server.h" #endif /* WITH_PERFSCHEMA_STORAGE_ENGINE */ @@ -105,6 +109,7 @@ #include "sp_rcontext.h" #include "sp_cache.h" #include "sql_reload.h" // reload_acl_and_cache +#include "pcre.h" #ifdef HAVE_POLL_H #include @@ -337,7 +342,7 @@ static PSI_thread_key key_thread_handle_con_sockets; static PSI_thread_key key_thread_handle_shutdown; #endif /* __WIN__ */ -#if defined (HAVE_OPENSSL) && !defined(HAVE_YASSL) +#ifdef HAVE_OPENSSL10 static PSI_rwlock_key key_rwlock_openssl; #endif #endif /* HAVE_PSI_INTERFACE */ @@ -360,6 +365,7 @@ static bool volatile select_thread_in_use, signal_thread_in_use; static volatile bool ready_to_exit; static my_bool opt_debugging= 0, opt_external_locking= 0, opt_console= 0; static my_bool opt_short_log_format= 0, opt_silent_startup= 0; +bool my_disable_leak_check= false; uint kill_cached_threads; static uint wake_thread; @@ -630,6 +636,7 @@ Time_zone *default_tz; const char *mysql_real_data_home_ptr= mysql_real_data_home; char server_version[SERVER_VERSION_LENGTH], *server_version_ptr; +bool using_custom_server_version= false; char *mysqld_unix_port, *opt_mysql_tmpdir; ulong thread_handling; @@ -913,7 +920,7 @@ PSI_mutex_key key_BINLOG_LOCK_index, key_BINLOG_LOCK_xid_list, key_LOCK_prepared_stmt_count, key_LOCK_rpl_status, key_LOCK_server_started, key_LOCK_status, key_LOCK_show_status, - key_LOCK_system_variables_hash, key_LOCK_thd_data, + key_LOCK_system_variables_hash, key_LOCK_thd_data, key_LOCK_thd_kill, key_LOCK_user_conn, key_LOCK_uuid_short_generator, key_LOG_LOCK_log, key_master_info_data_lock, key_master_info_run_lock, key_master_info_sleep_lock, key_master_info_start_stop_lock, @@ -985,6 +992,7 @@ static PSI_mutex_info all_server_mutexes[]= { &key_LOCK_wait_commit, "wait_for_commit::LOCK_wait_commit", 0}, { &key_LOCK_gtid_waiting, "gtid_waiting::LOCK_gtid_waiting", 0}, { &key_LOCK_thd_data, "THD::LOCK_thd_data", 0}, + { &key_LOCK_thd_kill, "THD::LOCK_thd_kill", 0}, { &key_LOCK_user_conn, "LOCK_user_conn", PSI_FLAG_GLOBAL}, { &key_LOCK_uuid_short_generator, "LOCK_uuid_short_generator", PSI_FLAG_GLOBAL}, { &key_LOG_LOCK_log, "LOG::LOCK_log", 0}, @@ -1023,7 +1031,7 @@ PSI_rwlock_key key_rwlock_LOCK_grant, key_rwlock_LOCK_logger, static PSI_rwlock_info all_server_rwlocks[]= { -#if defined (HAVE_OPENSSL) && !defined(HAVE_YASSL) +#ifdef HAVE_OPENSSL10 { &key_rwlock_openssl, "CRYPTO_dynlock_value::lock", 0}, #endif { &key_rwlock_LOCK_grant, "LOCK_grant", PSI_FLAG_GLOBAL}, @@ -1499,7 +1507,7 @@ scheduler_functions *thread_scheduler= &thread_scheduler_struct, #ifdef HAVE_OPENSSL #include -#ifndef HAVE_YASSL +#ifdef HAVE_OPENSSL10 typedef struct CRYPTO_dynlock_value { mysql_rwlock_t lock; @@ -1510,7 +1518,7 @@ static openssl_lock_t *openssl_dynlock_create(const char *, int); static void openssl_dynlock_destroy(openssl_lock_t *, const char *, int); static void openssl_lock_function(int, int, const char *, int); static void openssl_lock(int, openssl_lock_t *, const char *, int); -#endif +#endif /* HAVE_OPENSSL10 */ char *des_key_file; #ifndef EMBEDDED_LIBRARY struct st_VioSSLFd *ssl_acceptor_fd; @@ -1562,7 +1570,7 @@ static void close_server_sock(); static void clean_up_mutexes(void); static void wait_for_signal_thread_to_end(void); static void create_pid_file(); -static void mysqld_exit(int exit_code) __attribute__((noreturn)); +ATTRIBUTE_NORETURN static void mysqld_exit(int exit_code); #endif static void delete_pid_file(myf flags); static void end_ssl(); @@ -1684,16 +1692,20 @@ static void close_connections(void) { DBUG_PRINT("quit",("Informing thread %ld that it's time to die", (ulong) tmp->thread_id)); - /* We skip slave threads & scheduler on this first loop through. */ + /* We skip slave threads on this first loop through. */ if (tmp->slave_thread) continue; + /* cannot use 'continue' inside DBUG_EXECUTE_IF()... */ + if (DBUG_EVALUATE_IF("only_kill_system_threads", !tmp->system_thread, 0)) + continue; + #ifdef WITH_WSREP /* skip wsrep system threads as well */ if (WSREP(tmp) && (tmp->wsrep_exec_mode==REPL_RECV || tmp->wsrep_applier)) continue; #endif - tmp->killed= KILL_SERVER_HARD; + tmp->set_killed(KILL_SERVER_HARD); MYSQL_CALLBACK(thread_scheduler, post_kill_notification, (tmp)); mysql_mutex_lock(&tmp->LOCK_thd_data); if (tmp->mysys_var) @@ -1783,7 +1795,7 @@ static void close_connections(void) if (WSREP(tmp) && tmp->wsrep_exec_mode==REPL_RECV) { sql_print_information("closing wsrep system thread"); - tmp->killed= KILL_CONNECTION; + tmp->set_killed(KILL_CONNECTION); MYSQL_CALLBACK(thread_scheduler, post_kill_notification, (tmp)); if (tmp->mysys_var) { @@ -2149,7 +2161,7 @@ static void mysqld_exit(int exit_code) shutdown_performance_schema(); // we do it as late as possible #endif set_malloc_size_cb(NULL); - if (!opt_debugging) + if (!opt_debugging && !my_disable_leak_check) { DBUG_ASSERT(global_status_var.global_memory_used == 0); } @@ -2329,11 +2341,11 @@ static void clean_up_mutexes() mysql_mutex_destroy(&LOCK_global_index_stats); #ifdef HAVE_OPENSSL mysql_mutex_destroy(&LOCK_des_key_file); -#ifndef HAVE_YASSL +#ifdef HAVE_OPENSSL10 for (int i= 0; i < CRYPTO_num_locks(); ++i) mysql_rwlock_destroy(&openssl_stdlocks[i].lock); OPENSSL_free(openssl_stdlocks); -#endif /* HAVE_YASSL */ +#endif /* HAVE_OPENSSL10 */ #endif /* HAVE_OPENSSL */ #ifdef HAVE_REPLICATION mysql_mutex_destroy(&LOCK_rpl_status); @@ -3188,7 +3200,7 @@ LONG WINAPI my_unhandler_exception_filter(EXCEPTION_POINTERS *ex_pointers) } -static void init_signals(void) +void init_signals(void) { if(opt_console) SetConsoleCtrlHandler(console_event_handler,TRUE); @@ -3319,7 +3331,7 @@ static size_t my_setstacksize(pthread_attr_t *attr, size_t stacksize) #ifndef EMBEDDED_LIBRARY -static void init_signals(void) +void init_signals(void) { sigset_t set; struct sigaction sa; @@ -3673,7 +3685,6 @@ sizeof(load_default_groups)/sizeof(load_default_groups[0]); #endif -#ifndef EMBEDDED_LIBRARY /** This function is used to check for stack overrun for pathological cases of regular expressions and 'like' expressions. @@ -3702,8 +3713,6 @@ check_enough_stack_size(int recurse_level) return 0; return check_enough_stack_size_slow(); } -#endif - /* @@ -3719,14 +3728,18 @@ static void init_libstrings() #endif } +ulonglong my_pcre_frame_size; static void init_pcre() { pcre_malloc= pcre_stack_malloc= my_str_malloc_mysqld; pcre_free= pcre_stack_free= my_str_free_mysqld; -#ifndef EMBEDDED_LIBRARY pcre_stack_guard= check_enough_stack_size_slow; -#endif + /* See http://pcre.org/original/doc/html/pcrestack.html */ + my_pcre_frame_size= -pcre_exec(NULL, NULL, NULL, -999, -999, 0, NULL, 0); + // pcre can underestimate its stack usage. Use a safe value, as in the manual + set_if_bigger(my_pcre_frame_size, 500); + my_pcre_frame_size += 16; // Again, safety margin, see the manual } @@ -4027,14 +4040,20 @@ static void my_malloc_size_cb_func(long long size, my_bool is_thread_specific) (longlong) thd->status_var.local_memory_used, size)); thd->status_var.local_memory_used+= size; - if (thd->status_var.local_memory_used > (int64)thd->variables.max_mem_used && - !thd->killed) + if (size > 0 && + thd->status_var.local_memory_used > (int64)thd->variables.max_mem_used && + !thd->killed && !thd->get_stmt_da()->is_set()) { - char buf[1024]; - thd->killed= KILL_QUERY; + /* Ensure we don't get called here again */ + char buf[50], *buf2; + thd->set_killed(KILL_QUERY); my_snprintf(buf, sizeof(buf), "--max-thread-mem-used=%llu", thd->variables.max_mem_used); - my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), buf); + if ((buf2= (char*) thd->alloc(256))) + { + my_snprintf(buf2, 256, ER_THD(thd, ER_OPTION_PREVENTS_STATEMENT), buf); + thd->set_killed(KILL_QUERY, ER_OPTION_PREVENTS_STATEMENT, buf2); + } } DBUG_ASSERT((longlong) thd->status_var.local_memory_used >= 0 || !debug_assert_on_not_freed_memory); @@ -4117,7 +4136,6 @@ static int init_common_variables() init_libstrings(); tzset(); // Set tzname - sf_leaking_memory= 0; // no memory leaks from now on #ifdef SAFEMALLOC sf_malloc_dbug_id= mariadb_dbug_id; #endif @@ -4131,15 +4149,22 @@ static int init_common_variables() if (!global_rpl_filter || !binlog_filter) { sql_perror("Could not allocate replication and binlog filters"); - return 1; + exit(1); } - if (init_thread_environment() || - mysql_init_variables()) - return 1; +#ifdef HAVE_OPENSSL + if (check_openssl_compatibility()) + { + sql_print_error("Incompatible OpenSSL version. Cannot continue..."); + exit(1); + } +#endif + + if (init_thread_environment() || mysql_init_variables()) + exit(1); if (ignore_db_dirs_init()) - return 1; + exit(1); #ifdef HAVE_TZNAME struct tm tm_tmp; @@ -4193,7 +4218,7 @@ static int init_common_variables() if (!IS_TIME_T_VALID_FOR_TIMESTAMP(server_start_time)) { sql_print_error("This MySQL server doesn't support dates later then 2038"); - return 1; + exit(1); } opt_log_basename= const_cast("mysql"); @@ -4242,7 +4267,7 @@ static int init_common_variables() new entries could be added to that list. */ if (add_status_vars(status_vars)) - return 1; // an error was already reported + exit(1); // an error was already reported #ifndef DBUG_OFF /* @@ -4273,7 +4298,7 @@ static int init_common_variables() #endif if (get_options(&remaining_argc, &remaining_argv)) - return 1; + exit(1); if (IS_SYSVAR_AUTOSIZE(&server_version_ptr)) set_server_version(server_version, sizeof(server_version)); @@ -4292,6 +4317,8 @@ static int init_common_variables() } } + sf_leaking_memory= 0; // no memory leaks from now on + #ifndef EMBEDDED_LIBRARY if (opt_abort && !opt_verbose) unireg_abort(0); @@ -4386,12 +4413,7 @@ static int init_common_variables() /* Fix back_log (back_log == 0 added for MySQL compatibility) */ if (back_log == 0 || IS_SYSVAR_AUTOSIZE(&back_log)) - { - if ((900 - 50) * 5 >= max_connections) - SYSVAR_AUTOSIZE(back_log, (50 + max_connections / 5)); - else - SYSVAR_AUTOSIZE(back_log, 900); - } + SYSVAR_AUTOSIZE(back_log, MY_MIN(900, (50 + max_connections / 5))); /* connections and databases needs lots of files */ { @@ -4693,7 +4715,7 @@ static int init_thread_environment() #ifdef HAVE_OPENSSL mysql_mutex_init(key_LOCK_des_key_file, &LOCK_des_key_file, MY_MUTEX_INIT_FAST); -#ifndef HAVE_YASSL +#ifdef HAVE_OPENSSL10 openssl_stdlocks= (openssl_lock_t*) OPENSSL_malloc(CRYPTO_num_locks() * sizeof(openssl_lock_t)); for (int i= 0; i < CRYPTO_num_locks(); ++i) @@ -4702,8 +4724,8 @@ static int init_thread_environment() CRYPTO_set_dynlock_destroy_callback(openssl_dynlock_destroy); CRYPTO_set_dynlock_lock_callback(openssl_lock); CRYPTO_set_locking_callback(openssl_lock_function); -#endif -#endif +#endif /* HAVE_OPENSSL10 */ +#endif /* HAVE_OPENSSL */ mysql_rwlock_init(key_rwlock_LOCK_sys_init_connect, &LOCK_sys_init_connect); mysql_rwlock_init(key_rwlock_LOCK_sys_init_slave, &LOCK_sys_init_slave); mysql_rwlock_init(key_rwlock_LOCK_grant, &LOCK_grant); @@ -4737,7 +4759,7 @@ static int init_thread_environment() } -#if defined(HAVE_OPENSSL) && !defined(HAVE_YASSL) +#ifdef HAVE_OPENSSL10 static openssl_lock_t *openssl_dynlock_create(const char *file, int line) { openssl_lock_t *lock= new openssl_lock_t; @@ -4797,8 +4819,7 @@ static void openssl_lock(int mode, openssl_lock_t *lock, const char *file, abort(); } } -#endif /* HAVE_OPENSSL */ - +#endif /* HAVE_OPENSSL10 */ static void init_ssl() { @@ -4963,6 +4984,11 @@ static int init_server_components() help information. Since the implementation of plugin server variables the help output is now written much later. */ +#ifdef _WIN32 + if (opt_console) + opt_error_log= false; +#endif + if (opt_error_log && !opt_abort) { if (!log_error_file_ptr[0]) @@ -6296,7 +6322,7 @@ static void bootstrap(MYSQL_FILE *file) thd->variables.wsrep_on= 0; #endif thd->bootstrap=1; - my_net_init(&thd->net,(st_vio*) 0, (void*) 0, MYF(0)); + my_net_init(&thd->net,(st_vio*) 0, thd, MYF(0)); thd->max_client_packet_length= thd->net.max_packet; thd->security_ctx->master_access= ~(ulong)0; in_bootstrap= TRUE; @@ -8124,7 +8150,7 @@ static int show_ssl_get_cipher_list(THD *thd, SHOW_VAR *var, char *buff, #ifdef HAVE_YASSL static char * -my_asn1_time_to_string(ASN1_TIME *time, char *buf, size_t len) +my_asn1_time_to_string(const ASN1_TIME *time, char *buf, size_t len) { return yaSSL_ASN1_TIME_to_string(time, buf, len); } @@ -8132,7 +8158,7 @@ my_asn1_time_to_string(ASN1_TIME *time, char *buf, size_t len) #else /* openssl */ static char * -my_asn1_time_to_string(ASN1_TIME *time, char *buf, size_t len) +my_asn1_time_to_string(const ASN1_TIME *time, char *buf, size_t len) { int n_read; char *res= NULL; @@ -8180,7 +8206,7 @@ show_ssl_get_server_not_before(THD *thd, SHOW_VAR *var, char *buff, { SSL *ssl= (SSL*) thd->net.vio->ssl_arg; X509 *cert= SSL_get_certificate(ssl); - ASN1_TIME *not_before= X509_get_notBefore(cert); + const ASN1_TIME *not_before= X509_get0_notBefore(cert); var->value= my_asn1_time_to_string(not_before, buff, SHOW_VAR_FUNC_BUFF_SIZE); @@ -8214,7 +8240,7 @@ show_ssl_get_server_not_after(THD *thd, SHOW_VAR *var, char *buff, { SSL *ssl= (SSL*) thd->net.vio->ssl_arg; X509 *cert= SSL_get_certificate(ssl); - ASN1_TIME *not_after= X509_get_notAfter(cert); + const ASN1_TIME *not_after= X509_get0_notAfter(cert); var->value= my_asn1_time_to_string(not_after, buff, SHOW_VAR_FUNC_BUFF_SIZE); @@ -8233,7 +8259,7 @@ static int show_default_keycache(THD *thd, SHOW_VAR *var, char *buff, { struct st_data { KEY_CACHE_STATISTICS stats; - SHOW_VAR var[8]; + SHOW_VAR var[9]; } *data; SHOW_VAR *v; @@ -8960,6 +8986,7 @@ mysqld_get_one_option(int optid, const struct my_option *opt, char *argument) { strmake(server_version, argument, sizeof(server_version) - 1); set_sys_var_value_origin(&server_version_ptr, sys_var::CONFIG); + using_custom_server_version= true; } #ifndef EMBEDDED_LIBRARY else @@ -9289,8 +9316,29 @@ mysqld_get_one_option(int optid, const struct my_option *opt, char *argument) } #ifdef WITH_WSREP case OPT_WSREP_CAUSAL_READS: - wsrep_causal_reads_update(&global_system_variables); + { + if (global_system_variables.wsrep_causal_reads) + { + WSREP_WARN("option --wsrep-causal-reads is deprecated"); + if (!(global_system_variables.wsrep_sync_wait & WSREP_SYNC_WAIT_BEFORE_READ)) + { + WSREP_WARN("--wsrep-causal-reads=ON takes precedence over --wsrep-sync-wait=%u. " + "WSREP_SYNC_WAIT_BEFORE_READ is on", + global_system_variables.wsrep_sync_wait); + global_system_variables.wsrep_sync_wait |= WSREP_SYNC_WAIT_BEFORE_READ; + } + } + else + { + if (global_system_variables.wsrep_sync_wait & WSREP_SYNC_WAIT_BEFORE_READ) { + WSREP_WARN("--wsrep-sync-wait=%u takes precedence over --wsrep-causal-reads=OFF. " + "WSREP_SYNC_WAIT_BEFORE_READ is on", + global_system_variables.wsrep_sync_wait); + global_system_variables.wsrep_causal_reads = 1; + } + } break; + } case OPT_WSREP_SYNC_WAIT: global_system_variables.wsrep_causal_reads= MY_TEST(global_system_variables.wsrep_sync_wait & @@ -9342,7 +9390,10 @@ mysql_getopt_value(const char *name, uint length, return (uchar**) &key_cache->changed_blocks_hash_size; } } + /* We return in all cases above. Let us silence -Wimplicit-fallthrough */ + DBUG_ASSERT(0); #ifdef HAVE_REPLICATION + /* fall through */ case OPT_REPLICATE_DO_DB: case OPT_REPLICATE_DO_TABLE: case OPT_REPLICATE_IGNORE_DB: @@ -9439,14 +9490,6 @@ static int get_options(int *argc_ptr, char ***argv_ptr) between options, setting of multiple variables, etc. Do them here. */ - - if ((opt_log_slow_admin_statements || opt_log_queries_not_using_indexes || - opt_log_slow_slave_statements) && - !global_system_variables.sql_log_slow) - sql_print_information("options --log-slow-admin-statements, " - "--log-queries-not-using-indexes and " - "--log-slow-slave-statements have no " - "effect if --log-slow-queries is not set"); if (global_system_variables.net_buffer_length > global_system_variables.max_allowed_packet) { @@ -9661,8 +9704,6 @@ static int get_options(int *argc_ptr, char ***argv_ptr) #endif /* Ensure that some variables are not set higher than needed */ - if (back_log > max_connections) - SYSVAR_AUTOSIZE(back_log, max_connections); if (thread_cache_size > max_connections) SYSVAR_AUTOSIZE(thread_cache_size, max_connections); diff --git a/sql/mysqld.h b/sql/mysqld.h index 613b57b133d..912fe3696ae 100644 --- a/sql/mysqld.h +++ b/sql/mysqld.h @@ -133,7 +133,7 @@ extern ulong slave_retried_transactions; extern ulong slave_run_triggers_for_rbr; extern ulonglong slave_type_conversions_options; extern my_bool read_only, opt_readonly; -extern my_bool lower_case_file_system; +extern MYSQL_PLUGIN_IMPORT my_bool lower_case_file_system; extern my_bool opt_enable_named_pipe, opt_sync_frm, opt_allow_suspicious_udfs; extern my_bool opt_secure_auth; extern const char *current_dbug_option; @@ -292,7 +292,7 @@ extern PSI_mutex_key key_BINLOG_LOCK_index, key_BINLOG_LOCK_xid_list, key_LOCK_prepared_stmt_count, key_LOCK_rpl_status, key_LOCK_server_started, key_LOCK_status, key_LOCK_show_status, - key_LOCK_thd_data, + key_LOCK_thd_data, key_LOCK_thd_kill, key_LOCK_user_conn, key_LOG_LOCK_log, key_master_info_data_lock, key_master_info_run_lock, key_master_info_sleep_lock, key_master_info_start_stop_lock, @@ -526,6 +526,8 @@ extern pthread_t signal_thread; extern struct st_VioSSLFd * ssl_acceptor_fd; #endif /* HAVE_OPENSSL */ +extern ulonglong my_pcre_frame_size; + /* The following variables were under INNODB_COMPABILITY_HOOKS */ @@ -544,6 +546,7 @@ extern const char *mysql_real_data_home_ptr; extern ulong thread_handling; extern "C" MYSQL_PLUGIN_IMPORT char server_version[SERVER_VERSION_LENGTH]; extern char *server_version_ptr; +extern bool using_custom_server_version; extern MYSQL_PLUGIN_IMPORT char mysql_real_data_home[]; extern char mysql_unpacked_real_data_home[]; extern MYSQL_PLUGIN_IMPORT struct system_variables global_system_variables; @@ -705,7 +708,7 @@ enum enum_query_type /* query_id */ extern query_id_t global_query_id; -void unireg_end(void) __attribute__((noreturn)); +ATTRIBUTE_NORETURN void unireg_end(void); /* increment query_id and return it. */ inline __attribute__((warn_unused_result)) query_id_t next_query_id() @@ -778,20 +781,6 @@ inline void dec_thread_running() extern void set_server_version(char *buf, size_t size); -#if defined(MYSQL_DYNAMIC_PLUGIN) && defined(_WIN32) -extern "C" THD *_current_thd_noinline(); -#define _current_thd() _current_thd_noinline() -#else -/* - THR_THD is a key which will be used to set/get THD* for a thread, - using my_pthread_setspecific_ptr()/my_thread_getspecific_ptr(). -*/ -extern pthread_key(THD*, THR_THD); -inline THD *_current_thd(void) -{ - return my_pthread_getspecific_ptr(THD*,THR_THD); -} -#endif #define current_thd _current_thd() inline int set_current_thd(THD *thd) { diff --git a/sql/net_serv.cc b/sql/net_serv.cc index f9635689e63..d9d35c5ed3f 100644 --- a/sql/net_serv.cc +++ b/sql/net_serv.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2000, 2016, Oracle and/or its affiliates. - Copyright (c) 2012, 2016, MariaDB + Copyright (c) 2012, 2017, MariaDB Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/sql/opt_range.cc b/sql/opt_range.cc index d5de96b860a..c15810ba686 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -6955,7 +6955,10 @@ QUICK_SELECT_I *TRP_ROR_UNION::make_quick(PARAM *param, { if (!(quick= (*scan)->make_quick(param, FALSE, &quick_roru->alloc)) || quick_roru->push_quick_back(quick)) + { + delete quick_roru; DBUG_RETURN(NULL); + } } quick_roru->records= records; quick_roru->read_time= read_cost; @@ -10773,9 +10776,7 @@ QUICK_RANGE_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table, */ thd->mem_root= old_root; - if (!quick || create_err) - return 0; /* no ranges found */ - if (quick->init()) + if (!quick || create_err || quick->init()) goto err; quick->records= records; @@ -10888,13 +10889,13 @@ int read_keys_and_merge_scans(THD *thd, DBUG_ENTER("read_keys_and_merge"); /* We're going to just read rowids. */ - head->file->ha_start_keyread(head->s->primary_key); head->prepare_for_position(); cur_quick_it.rewind(); cur_quick= cur_quick_it++; bool first_quick= TRUE; DBUG_ASSERT(cur_quick != 0); + head->file->ha_start_keyread(cur_quick->index); /* We reuse the same instance of handler so we need to call both init and diff --git a/sql/opt_subselect.cc b/sql/opt_subselect.cc index 15b803ac49a..f37db88957a 100644 --- a/sql/opt_subselect.cc +++ b/sql/opt_subselect.cc @@ -1005,6 +1005,25 @@ bool check_for_outer_joins(List *join_list) } +void find_and_block_conversion_to_sj(Item *to_find, + List_iterator_fast &li) +{ + if (to_find->type() != Item::SUBSELECT_ITEM || + ((Item_subselect *) to_find)->substype() != Item_subselect::IN_SUBS) + return; + Item_in_subselect *in_subq; + li.rewind(); + while ((in_subq= li++)) + { + if (in_subq == to_find) + { + in_subq->block_conversion_to_sj(); + return; + } + } +} + + /* Convert semi-join subquery predicates into semi-join join nests @@ -1057,7 +1076,6 @@ bool convert_join_subqueries_to_semijoins(JOIN *join) Query_arena *arena, backup; Item_in_subselect *in_subq; THD *thd= join->thd; - List_iterator ti(join->select_lex->leaf_tables); DBUG_ENTER("convert_join_subqueries_to_semijoins"); if (join->select_lex->sj_subselects.is_empty()) @@ -1075,6 +1093,89 @@ bool convert_join_subqueries_to_semijoins(JOIN *join) subq_sel->update_used_tables(); } + /* + Check all candidates to semi-join conversion that occur + in ON expressions of outer join. Set the flag blocking + this conversion for them. + */ + TABLE_LIST *tbl; + List_iterator ti(join->select_lex->leaf_tables); + while ((tbl= ti++)) + { + TABLE_LIST *embedded; + TABLE_LIST *embedding= tbl; + do + { + embedded= embedding; + bool block_conversion_to_sj= false; + if (embedded->on_expr) + { + /* + Conversion of an IN subquery predicate into semi-join + is blocked now if the predicate occurs: + - in the ON expression of an outer join + - in the ON expression of an inner join embedded directly + or indirectly in the inner nest of an outer join + */ + for (TABLE_LIST *tl= embedded; tl; tl= tl->embedding) + { + if (tl->outer_join) + { + block_conversion_to_sj= true; + break; + } + } + } + if (block_conversion_to_sj) + { + Item *cond= embedded->on_expr; + if (!cond) + ; + else if (cond->type() != Item::COND_ITEM) + find_and_block_conversion_to_sj(cond, li); + else if (((Item_cond*) cond)->functype() == + Item_func::COND_AND_FUNC) + { + Item *item; + List_iterator it(*(((Item_cond*) cond)->argument_list())); + while ((item= it++)) + { + find_and_block_conversion_to_sj(item, li); + } + } + } + embedding= embedded->embedding; + } + while (embedding && + embedding->nested_join->join_list.head() == embedded); + } + + /* + Block conversion to semi-joins for those candidates that + are encountered in the WHERE condition of the multi-table view + with CHECK OPTION if this view is used in UPDATE/DELETE. + (This limitation can be, probably, easily lifted.) + */ + li.rewind(); + while ((in_subq= li++)) + { + if (in_subq->emb_on_expr_nest != NO_JOIN_NEST && + in_subq->emb_on_expr_nest->effective_with_check) + { + in_subq->block_conversion_to_sj(); + } + } + + if (join->select_options & SELECT_STRAIGHT_JOIN) + { + /* Block conversion to semijoins for all candidates */ + li.rewind(); + while ((in_subq= li++)) + { + in_subq->block_conversion_to_sj(); + } + } + li.rewind(); /* First, convert child join's subqueries. We proceed bottom-up here */ while ((in_subq= li++)) @@ -1093,8 +1194,10 @@ bool convert_join_subqueries_to_semijoins(JOIN *join) if (convert_join_subqueries_to_semijoins(child_join)) DBUG_RETURN(TRUE); + + in_subq->sj_convert_priority= - MY_TEST(in_subq->emb_on_expr_nest != NO_JOIN_NEST) * MAX_TABLES * 2 + + MY_TEST(in_subq->do_not_convert_to_sj) * MAX_TABLES * 2 + in_subq->is_correlated * MAX_TABLES + child_join->outer_tables; } @@ -1127,7 +1230,7 @@ bool convert_join_subqueries_to_semijoins(JOIN *join) bool remove_item= TRUE; /* Stop processing if we've reached a subquery that's attached to the ON clause */ - if (in_subq->emb_on_expr_nest != NO_JOIN_NEST) + if (in_subq->do_not_convert_to_sj) break; if (in_subq->is_flattenable_semijoin) @@ -3340,6 +3443,7 @@ void fix_semijoin_strategies_for_picked_join_order(JOIN *join) table_map remaining_tables= 0; table_map handled_tabs= 0; join->sjm_lookup_tables= 0; + join->sjm_scan_tables= 0; for (tablenr= table_count - 1 ; tablenr != join->const_tables - 1; tablenr--) { POSITION *pos= join->best_positions + tablenr; @@ -3397,6 +3501,9 @@ void fix_semijoin_strategies_for_picked_join_order(JOIN *join) for (i= tablenr; i != (first + sjm->tables - 1); i--) rem_tables |= join->best_positions[i].table->table->map; + for (i= first; i < first+ sjm->tables; i++) + join->sjm_scan_tables |= join->best_positions[i].table->table->map; + POSITION dummy; join->cur_sj_inner_tables= 0; for (i= first + sjm->tables; i <= tablenr; i++) @@ -4135,13 +4242,13 @@ SJ_TMP_TABLE::create_sj_weedout_tmp_table(THD *thd) field->set_table_name(&table->alias); } - if (thd->variables.tmp_table_size == ~ (ulonglong) 0) // No limit + if (thd->variables.tmp_memory_table_size == ~ (ulonglong) 0) // No limit share->max_rows= ~(ha_rows) 0; else share->max_rows= (ha_rows) (((share->db_type() == heap_hton) ? - MY_MIN(thd->variables.tmp_table_size, - thd->variables.max_heap_table_size) : - thd->variables.tmp_table_size) / + MY_MIN(thd->variables.tmp_memory_table_size, + thd->variables.max_heap_table_size) : + thd->variables.tmp_memory_table_size) / share->reclength); set_if_bigger(share->max_rows,1); // For dummy start options diff --git a/sql/opt_sum.cc b/sql/opt_sum.cc index e7bf4658d5c..ab587b8b279 100644 --- a/sql/opt_sum.cc +++ b/sql/opt_sum.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2000, 2011, Oracle and/or its affiliates. - Copyright (c) 2008-2011 Monty Program Ab + Copyright (c) 2008, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -254,6 +254,8 @@ int opt_sum_query(THD *thd, int error= 0; DBUG_ENTER("opt_sum_query"); + thd->lex->current_select->min_max_opt_list.empty(); + if (conds) where_tables= conds->used_tables(); @@ -447,7 +449,14 @@ int opt_sum_query(THD *thd, item_sum->aggregator_clear(); } else + { item_sum->reset_and_add(); + /* + Save a reference to the item for possible rollback + of the min/max optimizations for this select + */ + thd->lex->current_select->min_max_opt_list.push_back(item_sum); + } item_sum->make_const(); recalc_const_item= 1; break; @@ -461,7 +470,7 @@ int opt_sum_query(THD *thd, { if (recalc_const_item) item->update_used_tables(); - if (!item->const_item()) + if (!item->const_item() && item->type() != Item::WINDOW_FUNC_ITEM) const_result= 0; } } @@ -1042,6 +1051,7 @@ static int maxmin_in_range(bool max_fl, Field* field, COND *cond) case Item_func::LT_FUNC: case Item_func::LE_FUNC: less_fl= 1; + /* fall through */ case Item_func::GT_FUNC: case Item_func::GE_FUNC: { diff --git a/sql/partition_info.cc b/sql/partition_info.cc index 24506434a76..535ed4612e0 100644 --- a/sql/partition_info.cc +++ b/sql/partition_info.cc @@ -394,9 +394,9 @@ bool partition_info::set_up_default_partitions(THD *thd, handler *file, { const char *error_string; if (part_type == RANGE_PARTITION) - error_string= partition_keywords[PKW_RANGE].str; + error_string= "RANGE"; else - error_string= partition_keywords[PKW_LIST].str; + error_string= "LIST"; my_error(ER_PARTITIONS_MUST_BE_DEFINED_ERROR, MYF(0), error_string); goto end; } @@ -608,6 +608,7 @@ char* partition_info::find_duplicate_field() */ partition_element *partition_info::get_part_elem(const char *partition_name, char *file_name, + size_t file_name_size, uint32 *part_id) { List_iterator part_it(partitions); @@ -629,10 +630,10 @@ partition_element *partition_info::get_part_elem(const char *partition_name, sub_part_elem->partition_name, partition_name)) { if (file_name) - create_subpartition_name(file_name, "", - part_elem->partition_name, - partition_name, - NORMAL_PART_NAME); + if (create_subpartition_name(file_name, file_name_size, "", + part_elem->partition_name, + partition_name, NORMAL_PART_NAME)) + DBUG_RETURN(NULL); *part_id= j + (i * num_subparts); DBUG_RETURN(sub_part_elem); } @@ -647,8 +648,9 @@ partition_element *partition_info::get_part_elem(const char *partition_name, part_elem->partition_name, partition_name)) { if (file_name) - create_partition_name(file_name, "", partition_name, - NORMAL_PART_NAME, TRUE); + if (create_partition_name(file_name, file_name_size, "", + partition_name, NORMAL_PART_NAME, TRUE)) + DBUG_RETURN(NULL); *part_id= i; DBUG_RETURN(part_elem); } @@ -1683,15 +1685,11 @@ bool partition_info::set_part_expr(THD *thd, char *start_token, Item *item_ptr, { list_of_subpart_fields= FALSE; subpart_expr= item_ptr; - subpart_func_string= func_string; - subpart_func_len= expr_len; } else { list_of_part_fields= FALSE; part_expr= item_ptr; - part_func_string= func_string; - part_func_len= expr_len; } return FALSE; } diff --git a/sql/partition_info.h b/sql/partition_info.h index d4c180ddcdd..91ceee70ea4 100644 --- a/sql/partition_info.h +++ b/sql/partition_info.h @@ -165,9 +165,6 @@ public: longlong err_value; char* part_info_string; - char *part_func_string; - char *subpart_func_string; - partition_element *curr_part_elem; // part or sub part partition_element *current_partition; // partition part_elem_value *curr_list_val; @@ -188,8 +185,6 @@ public: partition_type subpart_type; uint part_info_len; - uint part_func_len; - uint subpart_func_len; uint num_parts; uint num_subparts; @@ -257,13 +252,11 @@ public: bitmaps_are_initialized(FALSE), list_array(NULL), err_value(0), part_info_string(NULL), - part_func_string(NULL), subpart_func_string(NULL), curr_part_elem(NULL), current_partition(NULL), curr_list_object(0), num_columns(0), table(NULL), default_engine_type(NULL), part_type(NOT_A_PARTITION), subpart_type(NOT_A_PARTITION), part_info_len(0), - part_func_len(0), subpart_func_len(0), num_parts(0), num_subparts(0), count_curr_subparts(0), num_list_values(0), num_part_fields(0), num_subpart_fields(0), @@ -335,9 +328,8 @@ public: bool check_partition_field_length(); bool init_column_part(THD *thd); bool add_column_list_value(THD *thd, Item *item); - partition_element *get_part_elem(const char *partition_name, - char *file_name, - uint32 *part_id); + partition_element *get_part_elem(const char *partition_name, char *file_name, + size_t file_name_size, uint32 *part_id); void report_part_expr_error(bool use_subpart_expr); bool has_same_partitioning(partition_info *new_part_info); private: diff --git a/sql/records.cc b/sql/records.cc index 3ec9ea814cc..f16bdcff6e6 100644 --- a/sql/records.cc +++ b/sql/records.cc @@ -1,5 +1,6 @@ /* Copyright (c) 2000, 2010, Oracle and/or its affiliates. + Copyright (c) 2009, 2017, MariaDB Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/sql/rpl_gtid.cc b/sql/rpl_gtid.cc index 1d9cb39075b..30b8b62b607 100644 --- a/sql/rpl_gtid.cc +++ b/sql/rpl_gtid.cc @@ -2045,7 +2045,7 @@ gtid_waiting::wait_for_pos(THD *thd, String *gtid_str, longlong timeout_us) { case -1: status_var_increment(thd->status_var.master_gtid_wait_timeouts); - /* Deliberate fall through. */ + /* fall through */ case 0: status_var_add(thd->status_var.master_gtid_wait_time, microsecond_interval_timer() - before); diff --git a/sql/rpl_handler.cc b/sql/rpl_handler.cc index 733af6c61c8..520fb61d8c4 100644 --- a/sql/rpl_handler.cc +++ b/sql/rpl_handler.cc @@ -267,7 +267,7 @@ int Binlog_storage_delegate::after_flush(THD *thd, thd->semisync_info= log_info; } - strcpy(log_info->log_file, log_file+dirname_length(log_file)); + strmake_buf(log_info->log_file, log_file+dirname_length(log_file)); log_info->log_pos = log_pos; FOREACH_OBSERVER(ret, after_flush, false, diff --git a/sql/rpl_mi.cc b/sql/rpl_mi.cc index f30b7e161f2..3b0de3deb1c 100644 --- a/sql/rpl_mi.cc +++ b/sql/rpl_mi.cc @@ -1,5 +1,5 @@ -/* Copyright (c) 2006, 2012, Oracle and/or its affiliates. - Copyright (c) 2010, 2011, Monty Program Ab +/* Copyright (c) 2006, 2017, Oracle and/or its affiliates. + Copyright (c) 2010, 2017, MariaDB Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -41,7 +41,7 @@ Master_info::Master_info(LEX_STRING *connection_name_arg, master_id(0), prev_master_id(0), using_gtid(USE_GTID_NO), events_queued_since_last_gtid(0), gtid_reconnect_event_skip_count(0), gtid_event_seen(false), - in_start_all_slaves(0), in_stop_all_slaves(0), + in_start_all_slaves(0), in_stop_all_slaves(0), in_flush_all_relay_logs(0), users(0), killed(0) { host[0] = 0; user[0] = 0; password[0] = 0; @@ -664,7 +664,7 @@ file '%s')", fname); mi->connect_retry= (uint) connect_retry; mi->ssl= (my_bool) ssl; mi->ssl_verify_server_cert= ssl_verify_server_cert; - mi->heartbeat_period= master_heartbeat_period; + mi->heartbeat_period= MY_MIN(SLAVE_MAX_HEARTBEAT_PERIOD, master_heartbeat_period); } DBUG_PRINT("master_info",("log_file_name: %s position: %ld", mi->master_log_name, @@ -799,8 +799,8 @@ int flush_master_info(Master_info* mi, contents of file). But because of number of lines in the first line of file we don't care about this garbage. */ - char heartbeat_buf[sizeof(mi->heartbeat_period) * 4]; // buffer to suffice always - sprintf(heartbeat_buf, "%.3f", mi->heartbeat_period); + char heartbeat_buf[FLOATING_POINT_BUFFER]; + my_fcvt(mi->heartbeat_period, 3, heartbeat_buf, NULL); my_b_seek(file, 0L); my_b_printf(file, "%u\n%s\n%s\n%s\n%s\n%s\n%d\n%d\n%d\n%s\n%s\n%s\n%s\n%s\n%d\n%s\n%s\n%s\n%s\n%d\n%s\n%s\n" @@ -844,7 +844,6 @@ void end_master_info(Master_info* mi) if (!mi->inited) DBUG_VOID_RETURN; - end_relay_log_info(&mi->rli); if (mi->fd >= 0) { end_io_cache(&mi->file); @@ -883,6 +882,7 @@ void free_key_master_info(Master_info *mi) /* We use 2 here instead of 1 just to make it easier when debugging */ mi->killed= 2; end_master_info(mi); + end_relay_log_info(&mi->rli); mi->unlock_slave_threads(); delete mi; @@ -1980,4 +1980,53 @@ void prot_store_ids(THD *thd, DYNAMIC_ARRAY *ids) return; } +bool Master_info_index::flush_all_relay_logs() +{ + DBUG_ENTER("flush_all_relay_logs"); + bool result= false; + int error= 0; + mysql_mutex_lock(&LOCK_active_mi); + for (uint i= 0; i< master_info_hash.records; i++) + { + Master_info *mi; + mi= (Master_info *) my_hash_element(&master_info_hash, i); + mi->in_flush_all_relay_logs= 0; + } + for (uint i=0; i < master_info_hash.records;) + { + Master_info *mi; + mi= (Master_info *)my_hash_element(&master_info_hash, i); + DBUG_ASSERT(mi); + + if (mi->in_flush_all_relay_logs) + { + i++; + continue; + } + mi->in_flush_all_relay_logs= 1; + + mysql_mutex_lock(&mi->sleep_lock); + mi->users++; // Mark used + mysql_mutex_unlock(&mi->sleep_lock); + mysql_mutex_unlock(&LOCK_active_mi); + + mysql_mutex_lock(&mi->data_lock); + error= rotate_relay_log(mi); + mysql_mutex_unlock(&mi->data_lock); + mi->release(); + mysql_mutex_lock(&LOCK_active_mi); + + if (error) + { + result= true; + break; + } + /* Restart from first element as master_info_hash may have changed */ + i= 0; + continue; + } + mysql_mutex_unlock(&LOCK_active_mi); + DBUG_RETURN(result); +} + #endif /* HAVE_REPLICATION */ diff --git a/sql/rpl_mi.h b/sql/rpl_mi.h index 31c0f280ac1..d0f6171815c 100644 --- a/sql/rpl_mi.h +++ b/sql/rpl_mi.h @@ -302,6 +302,7 @@ class Master_info : public Slave_reporting_capability /* gtid_event_seen is false until we receive first GTID event from master. */ bool gtid_event_seen; bool in_start_all_slaves, in_stop_all_slaves; + bool in_flush_all_relay_logs; uint users; /* Active user for object */ uint killed; @@ -354,6 +355,7 @@ public: bool start_all_slaves(THD *thd); bool stop_all_slaves(THD *thd); void free_connections(); + bool flush_all_relay_logs(); }; diff --git a/sql/rpl_parallel.cc b/sql/rpl_parallel.cc index aaa72da29db..433e7ea03c8 100644 --- a/sql/rpl_parallel.cc +++ b/sql/rpl_parallel.cc @@ -720,9 +720,7 @@ do_retry: DBUG_EXECUTE_IF("inject_mdev8031", { /* Simulate that we get deadlock killed at this exact point. */ rgi->killed_for_retry= rpl_group_info::RETRY_KILL_KILLED; - mysql_mutex_lock(&thd->LOCK_thd_data); - thd->killed= KILL_CONNECTION; - mysql_mutex_unlock(&thd->LOCK_thd_data); + thd->set_killed(KILL_CONNECTION); }); rgi->cleanup_context(thd, 1); wait_for_pending_deadlock_kill(thd, rgi); @@ -868,9 +866,7 @@ do_retry: /* Simulate that we get deadlock killed during open_binlog(). */ thd->reset_for_next_command(); rgi->killed_for_retry= rpl_group_info::RETRY_KILL_KILLED; - mysql_mutex_lock(&thd->LOCK_thd_data); - thd->killed= KILL_CONNECTION; - mysql_mutex_unlock(&thd->LOCK_thd_data); + thd->set_killed(KILL_CONNECTION); thd->send_kill_message(); fd= (File)-1; err= 1; diff --git a/sql/rpl_rli.cc b/sql/rpl_rli.cc index fda922c3e12..f5069682223 100644 --- a/sql/rpl_rli.cc +++ b/sql/rpl_rli.cc @@ -1,6 +1,5 @@ -/* Copyright (c) 2006, 2013, Oracle and/or its affiliates. - Copyright (c) 2010, 2013, Monty Program Ab - Copyright (c) 2016, MariaDB Corporation +/* Copyright (c) 2006, 2017, Oracle and/or its affiliates. + Copyright (c) 2010, 2017, MariaDB Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -52,8 +51,8 @@ Relay_log_info::Relay_log_info(bool is_slave_recovery) sync_counter(0), is_relay_log_recovery(is_slave_recovery), save_temporary_tables(0), mi(0), inuse_relaylog_list(0), last_inuse_relaylog(0), - cur_log_old_open_count(0), group_relay_log_pos(0), - event_relay_log_pos(0), + cur_log_old_open_count(0), error_on_rli_init_info(false), + group_relay_log_pos(0), event_relay_log_pos(0), group_master_log_pos(0), log_space_total(0), ignore_log_space_limit(0), last_master_timestamp(0), sql_thread_caught_up(true), slave_skip_counter(0), abort_pos_wait(0), slave_run_id(0), sql_driver_thd(), @@ -124,10 +123,13 @@ int Relay_log_info::init(const char* info_fname) char fname[FN_REFLEN+128]; const char* msg = 0; int error = 0; + mysql_mutex_t *log_lock; DBUG_ENTER("Relay_log_info::init"); if (inited) // Set if this function called DBUG_RETURN(0); + + log_lock= relay_log.get_log_lock(); fn_format(fname, info_fname, mysql_data_home, "", 4+32); mysql_mutex_lock(&data_lock); cur_log_fd = -1; @@ -136,6 +138,9 @@ int Relay_log_info::init(const char* info_fname) log_space_limit= relay_log_space_limit; log_space_total= 0; + if (error_on_rli_init_info) + goto err; + char pattern[FN_REFLEN]; (void) my_realpath(pattern, slave_load_tmpdir, 0); if (fn_format(pattern, PREFIX_SQL_LOAD, pattern, "", @@ -207,7 +212,6 @@ a file name for --relay-log-index option", opt_relaylog_index_name); /* For multimaster, add connection name to relay log filenames */ char buf_relay_logname[FN_REFLEN], buf_relaylog_index_name_buff[FN_REFLEN]; char *buf_relaylog_index_name= opt_relaylog_index_name; - mysql_mutex_t *log_lock; create_logfile_name_with_suffix(buf_relay_logname, sizeof(buf_relay_logname), @@ -227,7 +231,6 @@ a file name for --relay-log-index option", opt_relaylog_index_name); note, that if open() fails, we'll still have index file open but a destructor will take care of that */ - log_lock= relay_log.get_log_lock(); mysql_mutex_lock(log_lock); if (relay_log.open_index_file(buf_relaylog_index_name, ln, TRUE) || relay_log.open(ln, LOG_BIN, 0, 0, SEQ_READ_APPEND, @@ -253,8 +256,8 @@ a file name for --relay-log-index option", opt_relaylog_index_name); if ((info_fd= mysql_file_open(key_file_relay_log_info, fname, O_CREAT|O_RDWR|O_BINARY, MYF(MY_WME))) < 0) { - sql_print_error("Failed to create a new relay log info file (\ -file '%s', errno %d)", fname, my_errno); + sql_print_error("Failed to create a new relay log info file (" + "file '%s', errno %d)", fname, my_errno); msg= current_thd->get_stmt_da()->message(); goto err; } @@ -304,7 +307,9 @@ Failed to open the existing relay log info file '%s' (errno %d)", if (info_fd >= 0) mysql_file_close(info_fd, MYF(0)); info_fd= -1; + mysql_mutex_lock(log_lock); relay_log.close(LOG_CLOSE_INDEX | LOG_CLOSE_STOP_EVENT); + mysql_mutex_unlock(log_lock); mysql_mutex_unlock(&data_lock); DBUG_RETURN(1); } @@ -417,16 +422,21 @@ Failed to open the existing relay log info file '%s' (errno %d)", goto err; } inited= 1; + error_on_rli_init_info= false; mysql_mutex_unlock(&data_lock); DBUG_RETURN(0); err: - sql_print_error("%s", msg); + error_on_rli_init_info= true; + if (msg) + sql_print_error("%s", msg); end_io_cache(&info_file); if (info_fd >= 0) mysql_file_close(info_fd, MYF(0)); info_fd= -1; + mysql_mutex_lock(log_lock); relay_log.close(LOG_CLOSE_INDEX | LOG_CLOSE_STOP_EVENT); + mysql_mutex_unlock(log_lock); mysql_mutex_unlock(&data_lock); DBUG_RETURN(1); } @@ -1124,6 +1134,8 @@ int purge_relay_logs(Relay_log_info* rli, THD *thd, bool just_reset, const char** errmsg) { int error=0; + const char *ln; + char name_buf[FN_REFLEN]; DBUG_ENTER("purge_relay_logs"); /* @@ -1150,12 +1162,37 @@ int purge_relay_logs(Relay_log_info* rli, THD *thd, bool just_reset, if (!rli->inited) { DBUG_PRINT("info", ("rli->inited == 0")); - DBUG_RETURN(0); + if (rli->error_on_rli_init_info) + { + ln= rli->relay_log.generate_name(opt_relay_logname, "-relay-bin", + 1, name_buf); + + if (rli->relay_log.open_index_file(opt_relaylog_index_name, ln, TRUE)) + { + sql_print_error("Unable to purge relay log files. Failed to open relay " + "log index file:%s.", rli->relay_log.get_index_fname()); + DBUG_RETURN(1); + } + mysql_mutex_lock(rli->relay_log.get_log_lock()); + if (rli->relay_log.open(ln, LOG_BIN, 0, 0, SEQ_READ_APPEND, + (rli->max_relay_log_size ? rli->max_relay_log_size : + max_binlog_size), 1, TRUE)) + { + sql_print_error("Unable to purge relay log files. Failed to open relay " + "log file:%s.", rli->relay_log.get_log_fname()); + mysql_mutex_unlock(rli->relay_log.get_log_lock()); + DBUG_RETURN(1); + } + mysql_mutex_unlock(rli->relay_log.get_log_lock()); + } + else + DBUG_RETURN(0); + } + else + { + DBUG_ASSERT(rli->slave_running == 0); + DBUG_ASSERT(rli->mi->slave_running == 0); } - - DBUG_ASSERT(rli->slave_running == 0); - DBUG_ASSERT(rli->mi->slave_running == 0); - mysql_mutex_lock(&rli->data_lock); /* @@ -1202,6 +1239,12 @@ int purge_relay_logs(Relay_log_info* rli, THD *thd, bool just_reset, rli->group_relay_log_name[0]= rli->event_relay_log_name[0]= 0; } + if (!rli->inited && rli->error_on_rli_init_info) + { + mysql_mutex_lock(rli->relay_log.get_log_lock()); + rli->relay_log.close(LOG_CLOSE_INDEX | LOG_CLOSE_STOP_EVENT); + mysql_mutex_unlock(rli->relay_log.get_log_lock()); + } err: DBUG_PRINT("info",("log_space_total: %llu",rli->log_space_total)); mysql_mutex_unlock(&rli->data_lock); diff --git a/sql/rpl_rli.h b/sql/rpl_rli.h index 448fc231b2b..d88bc9f6ecd 100644 --- a/sql/rpl_rli.h +++ b/sql/rpl_rli.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2005, 2012, Oracle and/or its affiliates. +/* Copyright (c) 2005, 2017, Oracle and/or its affiliates. + Copyright (c) 2009, 2017, MariaDB Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -177,7 +178,14 @@ public: a different log under our feet */ uint32 cur_log_old_open_count; - + + /* + If on init_info() call error_on_rli_init_info is true that means + that previous call to init_info() terminated with an error, RESET + SLAVE must be executed and the problem fixed manually. + */ + bool error_on_rli_init_info; + /* Let's call a group (of events) : - a transaction diff --git a/sql/share/CMakeLists.txt b/sql/share/CMakeLists.txt index e0d5fb6c1a7..1461c57c5c3 100644 --- a/sql/share/CMakeLists.txt +++ b/sql/share/CMakeLists.txt @@ -38,6 +38,7 @@ russian czech french serbian +hindi ) SET(files diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index a42ed90fc9f..4ed645071a9 100644 --- a/sql/share/errmsg-utf8.txt +++ b/sql/share/errmsg-utf8.txt @@ -1,4 +1,4 @@ -languages czech=cze latin2, danish=dan latin1, dutch=nla latin1, english=eng latin1, estonian=est latin7, french=fre latin1, german=ger latin1, greek=greek greek, hungarian=hun latin2, italian=ita latin1, japanese=jpn ujis, korean=kor euckr, norwegian-ny=norwegian-ny latin1, norwegian=nor latin1, polish=pol latin2, portuguese=por latin1, romanian=rum latin2, russian=rus koi8r, serbian=serbian cp1250, slovak=slo latin2, spanish=spa latin1, swedish=swe latin1, ukrainian=ukr koi8u, bulgarian=bgn cp1251; +languages czech=cze latin2, danish=dan latin1, dutch=nla latin1, english=eng latin1, estonian=est latin7, french=fre latin1, german=ger latin1, greek=greek greek, hungarian=hun latin2, italian=ita latin1, japanese=jpn ujis, korean=kor euckr, norwegian-ny=norwegian-ny latin1, norwegian=nor latin1, polish=pol latin2, portuguese=por latin1, romanian=rum latin2, russian=rus koi8r, serbian=serbian cp1250, slovak=slo latin2, spanish=spa latin1, swedish=swe latin1, ukrainian=ukr koi8u, bulgarian=bgn cp1251, hindi=hindi utf8; default-language eng @@ -17,6 +17,7 @@ ER_NO fre "NON" ger "Nein" greek "ΟΧΙ" + hindi "नहीं" hun "NEM" kor "아니오" nor "NEI" @@ -37,6 +38,7 @@ ER_YES fre "OUI" ger "Ja" greek "ÎΑΙ" + hindi "हाà¤" hun "IGEN" ita "SI" kor "예" @@ -59,6 +61,7 @@ ER_CANT_CREATE_FILE fre "Ne peut créer le fichier '%-.200s' (Errcode: %M)" ger "Kann Datei '%-.200s' nicht erzeugen (Fehler: %M)" greek "ΑδÏνατη η δημιουÏγία του αÏχείου '%-.200s' (κωδικός λάθους: %M)" + hindi "फ़ाइल '%-.200s' नहीं बन सका (errno: %M)" hun "A '%-.200s' file nem hozhato letre (hibakod: %M)" ita "Impossibile creare il file '%-.200s' (errno: %M)" jpn "ファイル '%-.200s' を作æˆã§ãã¾ã›ã‚“。(エラー番å·: %M)" @@ -84,6 +87,7 @@ ER_CANT_CREATE_TABLE fre "Ne peut créer la table %`s.%`s (Errcode: %M)" ger "Kann Tabelle %`s.%`s nicht erzeugen (Fehler: %M)" greek "ΑδÏνατη η δημιουÏγία του πίνακα %`s.%`s (κωδικός λάθους: %M)" + hindi "टेबल '%`s.%`s' नहीं बन सका (errno: %M)" hun "A %`s.%`s tabla nem hozhato letre (hibakod: %M)" ita "Impossibile creare la tabella %`s.%`s (errno: %M)" jpn "%`s.%`s テーブルãŒä½œã‚Œã¾ã›ã‚“.(errno: %M)" @@ -108,6 +112,7 @@ ER_CANT_CREATE_DB fre "Ne peut créer la base '%-.192s' (Erreur %M)" ger "Kann Datenbank '%-.192s' nicht erzeugen (Fehler: %M)" greek "ΑδÏνατη η δημιουÏγία της βάσης δεδομένων '%-.192s' (κωδικός λάθους: %M)" + hindi "डेटाबेस '%-.192s' नहीं बन सका (errno: %M)" hun "Az '%-.192s' adatbazis nem hozhato letre (hibakod: %M)" ita "Impossibile creare il database '%-.192s' (errno: %M)" jpn "データベース '%-.192s' を作æˆã§ãã¾ã›ã‚“。(エラー番å·: %M)" @@ -132,6 +137,7 @@ ER_DB_CREATE_EXISTS fre "Ne peut créer la base '%-.192s'; elle existe déjà" ger "Kann Datenbank '%-.192s' nicht erzeugen. Datenbank existiert bereits" greek "ΑδÏνατη η δημιουÏγία της βάσης δεδομένων '%-.192s'; Η βάση δεδομένων υπάÏχει ήδη" + hindi "डेटाबेस '%-.192s' नहीं बन सकता है; यह डेटाबेस पहले से ही मौजूद है" hun "Az '%-.192s' adatbazis nem hozhato letre Az adatbazis mar letezik" ita "Impossibile creare il database '%-.192s'; il database esiste" jpn "データベース '%-.192s' を作æˆã§ãã¾ã›ã‚“。データベースã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™ã€‚" @@ -156,6 +162,7 @@ ER_DB_DROP_EXISTS fre "Ne peut effacer la base '%-.192s'; elle n'existe pas" ger "Kann Datenbank '%-.192s' nicht löschen; Datenbank nicht vorhanden" greek "ΑδÏνατη η διαγÏαφή της βάσης δεδομένων '%-.192s'. Η βάση δεδομένων δεν υπάÏχει" + hindi "डेटाबेस '%-.192s' डà¥à¤°à¥‰à¤ª नहीं कर सकते हैं; यह डेटाबेस मौजूद नहीं है" hun "A(z) '%-.192s' adatbazis nem szuntetheto meg. Az adatbazis nem letezik" ita "Impossibile cancellare '%-.192s'; il database non esiste" jpn "データベース '%-.192s' を削除ã§ãã¾ã›ã‚“。データベースã¯å­˜åœ¨ã—ã¾ã›ã‚“。" @@ -180,6 +187,7 @@ ER_DB_DROP_DELETE fre "Ne peut effacer la base '%-.192s' (erreur %M)" ger "Fehler beim Löschen der Datenbank ('%-.192s' kann nicht gelöscht werden, Fehler: %M)" greek "ΠαÏουσιάστηκε Ï€Ïόβλημα κατά τη διαγÏαφή της βάσης δεδομένων (αδÏνατη η διαγÏαφή '%-.192s', κωδικός λάθους: %M)" + hindi "डेटाबेस डà¥à¤°à¥‰à¤ª में तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ ('%-.192s' हटा नहीं सकते, errno: %M)" hun "Adatbazis megszuntetesi hiba ('%-.192s' nem torolheto, hibakod: %M)" ita "Errore durante la cancellazione del database (impossibile cancellare '%-.192s', errno: %M)" jpn "データベース削除エラー ('%-.192s' を削除ã§ãã¾ã›ã‚“。エラー番å·: %M)" @@ -204,6 +212,7 @@ ER_DB_DROP_RMDIR fre "Erreur en effaçant la base (rmdir '%-.192s', erreur %M)" ger "Fehler beim Löschen der Datenbank (Verzeichnis '%-.192s' kann nicht gelöscht werden, Fehler: %M)" greek "ΠαÏουσιάστηκε Ï€Ïόβλημα κατά τη διαγÏαφή της βάσης δεδομένων (αδÏνατη η διαγÏαφή του φακέλλου '%-.192s', κωδικός λάθους: %M)" + hindi "डेटाबेस डà¥à¤°à¥‰à¤ª में तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ ('%-.192s' rmdir नहीं कर सकते, errno: %M)" hun "Adatbazis megszuntetesi hiba ('%-.192s' nem szuntetheto meg, hibakod: %M)" ita "Errore durante la cancellazione del database (impossibile rmdir '%-.192s', errno: %M)" jpn "データベース削除エラー (ディレクトリ '%-.192s' を削除ã§ãã¾ã›ã‚“。エラー番å·: %M)" @@ -228,6 +237,7 @@ ER_CANT_DELETE_FILE fre "Erreur en effaçant '%-.192s' (Errcode: %M)" ger "Fehler beim Löschen von '%-.192s' (Fehler: %M)" greek "ΠαÏουσιάστηκε Ï€Ïόβλημα κατά τη διαγÏαφή '%-.192s' (κωδικός λάθους: %M)" + hindi "'%-.192s' के हटाने पर तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ (errno: %M)" hun "Torlesi hiba: '%-.192s' (hibakod: %M)" ita "Errore durante la cancellazione di '%-.192s' (errno: %M)" jpn "ファイル '%-.192s' ã®å‰Šé™¤ã‚¨ãƒ©ãƒ¼ (エラー番å·: %M)" @@ -252,6 +262,7 @@ ER_CANT_FIND_SYSTEM_REC fre "Ne peut lire un enregistrement de la table 'system'" ger "Datensatz in der Systemtabelle nicht lesbar" greek "ΑδÏνατη η ανάγνωση εγγÏαφής από πίνακα του συστήματος" + hindi "सिसà¥à¤Ÿà¤® टेबल से रिकॉरà¥à¤¡ नहीं पढ़ सके" hun "Nem olvashato rekord a rendszertablaban" ita "Impossibile leggere il record dalla tabella di sistema" jpn "システム表ã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚’読ã¿è¾¼ã‚ã¾ã›ã‚“。" @@ -276,6 +287,7 @@ ER_CANT_GET_STAT fre "Ne peut obtenir le status de '%-.200s' (Errcode: %M)" ger "Kann Status von '%-.200s' nicht ermitteln (Fehler: %M)" greek "ΑδÏνατη η λήψη πληÏοφοÏιών για την κατάσταση του '%-.200s' (κωδικός λάθους: %M)" + hindi "'%-.200s' की अवसà¥à¤¥à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं कर सके (errno: %M)" hun "A(z) '%-.200s' statusza nem allapithato meg (hibakod: %M)" ita "Impossibile leggere lo stato di '%-.200s' (errno: %M)" jpn "'%-.200s' ã®çŠ¶æ…‹ã‚’å–å¾—ã§ãã¾ã›ã‚“。(エラー番å·: %M)" @@ -300,6 +312,7 @@ ER_CANT_GET_WD fre "Ne peut obtenir le répertoire de travail (Errcode: %M)" ger "Kann Arbeitsverzeichnis nicht ermitteln (Fehler: %M)" greek "Ο φάκελλος εÏγασίας δεν βÏέθηκε (κωδικός λάθους: %M)" + hindi "Working डाइरेकà¥à¤Ÿà¤°à¥€ पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं कर सके (errno: %M)" hun "A munkakonyvtar nem allapithato meg (hibakod: %M)" ita "Impossibile leggere la directory di lavoro (errno: %M)" jpn "作業ディレクトリをå–å¾—ã§ãã¾ã›ã‚“。(エラー番å·: %M)" @@ -324,6 +337,7 @@ ER_CANT_LOCK fre "Ne peut verrouiller le fichier (Errcode: %M)" ger "Datei kann nicht gesperrt werden (Fehler: %M)" greek "Το αÏχείο δεν μποÏεί να κλειδωθεί (κωδικός λάθους: %M)" + hindi "फ़ाइल लॉक नहीं कर सके (errno: %M)" hun "A file nem zarolhato. (hibakod: %M)" ita "Impossibile il locking il file (errno: %M)" jpn "ファイルをロックã§ãã¾ã›ã‚“。(エラー番å·: %M)" @@ -348,6 +362,7 @@ ER_CANT_OPEN_FILE fre "Ne peut ouvrir le fichier: '%-.200s' (Errcode: %M)" ger "Kann Datei '%-.200s' nicht öffnen (Fehler: %M)" greek "Δεν είναι δυνατό να ανοιχτεί το αÏχείο: '%-.200s' (κωδικός λάθους: %M)" + hindi "फ़ाइल '%-.200s' नहीं खोल सकते (errno: %M)" hun "A '%-.200s' file nem nyithato meg (hibakod: %M)" ita "Impossibile aprire il file: '%-.200s' (errno: %M)" jpn "ファイル '%-.200s' をオープンã§ãã¾ã›ã‚“。(エラー番å·: %M)" @@ -372,6 +387,7 @@ ER_FILE_NOT_FOUND fre "Ne peut trouver le fichier: '%-.200s' (Errcode: %M)" ger "Kann Datei '%-.200s' nicht finden (Fehler: %M)" greek "Δεν βÏέθηκε το αÏχείο: '%-.200s' (κωδικός λάθους: %M)" + hindi "फ़ाइल '%-.200s' नहीं मिला (errno: %M)" hun "A(z) '%-.200s' file nem talalhato (hibakod: %M)" ita "Impossibile trovare il file: '%-.200s' (errno: %M)" jpn "ファイル '%-.200s' ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。(エラー番å·: %M)" @@ -396,6 +412,7 @@ ER_CANT_READ_DIR fre "Ne peut lire le répertoire de '%-.192s' (Errcode: %M)" ger "Verzeichnis von '%-.192s' nicht lesbar (Fehler: %M)" greek "Δεν είναι δυνατό να διαβαστεί ο φάκελλος του '%-.192s' (κωδικός λάθους: %M)" + hindi "'%-.192s' की डायरेकà¥à¤Ÿà¤°à¥€ नहीं पढ़ सके (errno: %M)" hun "A(z) '%-.192s' konyvtar nem olvashato. (hibakod: %M)" ita "Impossibile leggere la directory di '%-.192s' (errno: %M)" jpn "ディレクトリ '%-.192s' を読ã¿è¾¼ã‚ã¾ã›ã‚“。(エラー番å·: %M)" @@ -420,6 +437,7 @@ ER_CANT_SET_WD fre "Ne peut changer le répertoire pour '%-.192s' (Errcode: %M)" ger "Kann nicht in das Verzeichnis '%-.192s' wechseln (Fehler: %M)" greek "ΑδÏνατη η αλλαγή του Ï„Ïέχοντος καταλόγου σε '%-.192s' (κωδικός λάθους: %M)" + hindi "'%-.192s' डायरेकà¥à¤Ÿà¤°à¥€ में नहीं बदल सके (errno: %M)" hun "Konyvtarvaltas nem lehetseges a(z) '%-.192s'-ba. (hibakod: %M)" ita "Impossibile cambiare la directory in '%-.192s' (errno: %M)" jpn "ディレクトリ '%-.192s' ã«ç§»å‹•ã§ãã¾ã›ã‚“。(エラー番å·: %M)" @@ -444,6 +462,7 @@ ER_CHECKREAD fre "Enregistrement modifié depuis sa dernière lecture dans la table '%-.192s'" ger "Datensatz hat sich seit dem letzten Zugriff auf Tabelle '%-.192s' geändert" greek "Η εγγÏαφή έχει αλλάξει από την τελευταία φοÏά που ανασÏÏθηκε από τον πίνακα '%-.192s'" + hindi "रिकॉरà¥à¤¡ टेबल '%-.192s' पिछली बार पà¥à¥‡ जाने के बाद से बदल गया है" hun "A(z) '%-.192s' tablaban talalhato rekord megvaltozott az utolso olvasas ota" ita "Il record e` cambiato dall'ultima lettura della tabella '%-.192s'" jpn "表 '%-.192s' ã®æœ€å¾Œã®èª­ã¿è¾¼ã¿æ™‚点ã‹ã‚‰ã€ãƒ¬ã‚³ãƒ¼ãƒ‰ãŒå¤‰åŒ–ã—ã¾ã—ãŸã€‚" @@ -468,6 +487,7 @@ ER_DISK_FULL fre "Disque plein (%s). J'attend que quelqu'un libère de l'espace... (Errcode: %M)" ger "Festplatte voll (%s). Warte, bis jemand Platz schafft ... (Fehler: %M)" greek "Δεν υπάÏχει χώÏος στο δίσκο (%s). ΠαÏακαλώ, πεÏιμένετε να ελευθεÏωθεί χώÏος... (κωδικός λάθους: %M)" + hindi "डिसà¥à¤• पूरी तरह से भरा हà¥à¤† है (%s); कà¥à¤› सà¥à¤¥à¤¾à¤¨ खाली करें (errno: %M)" hun "A lemez megtelt (%s). (hibakod: %M)" ita "Disco pieno (%s). In attesa che qualcuno liberi un po' di spazio... (errno: %M)" jpn "ディスク領域ä¸è¶³ã§ã™(%s)。(エラー番å·: %M)" @@ -492,6 +512,7 @@ ER_DUP_KEY 23000 fre "Ecriture impossible, doublon dans une clé de la table '%-.192s'" ger "Kann nicht speichern, Grund: doppelter Schlüssel in Tabelle '%-.192s'" greek "Δεν είναι δυνατή η καταχώÏηση, η τιμή υπάÏχει ήδη στον πίνακα '%-.192s'" + hindi "टेबल '%-.192s' में DUPLICATE KEY मौजूद होने के कारण नहीं लिख सके" hun "Irasi hiba, duplikalt kulcs a '%-.192s' tablaban" ita "Scrittura impossibile: chiave duplicata nella tabella '%-.192s'" jpn "書ãè¾¼ã‚ã¾ã›ã‚“。表 '%-.192s' ã«é‡è¤‡ã™ã‚‹ã‚­ãƒ¼ãŒã‚りã¾ã™ã€‚" @@ -516,6 +537,7 @@ ER_ERROR_ON_CLOSE fre "Erreur a la fermeture de '%-.192s' (Errcode: %M)" ger "Fehler beim Schließen von '%-.192s' (Fehler: %M)" greek "ΠαÏουσιάστηκε Ï€Ïόβλημα κλείνοντας το '%-.192s' (κωδικός λάθους: %M)" + hindi "'%-.192s' के बंद पर तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ (errno: %M)" hun "Hiba a(z) '%-.192s' zarasakor. (hibakod: %M)" ita "Errore durante la chiusura di '%-.192s' (errno: %M)" jpn "'%-.192s' ã®ã‚¯ãƒ­ãƒ¼ã‚ºæ™‚エラー (エラー番å·: %M)" @@ -540,6 +562,7 @@ ER_ERROR_ON_READ fre "Erreur en lecture du fichier '%-.200s' (Errcode: %M)" ger "Fehler beim Lesen der Datei '%-.200s' (Fehler: %M)" greek "ΠÏόβλημα κατά την ανάγνωση του αÏχείου '%-.200s' (κωδικός λάθους: %M)" + hindi "फ़ाइल '%-.200s' पढ़ने में तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ (errno: %M)" hun "Hiba a '%-.200s'file olvasasakor. (hibakod: %M)" ita "Errore durante la lettura del file '%-.200s' (errno: %M)" jpn "ファイル '%-.200s' ã®èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼ (エラー番å·: %M)" @@ -564,6 +587,7 @@ ER_ERROR_ON_RENAME fre "Erreur en renommant '%-.210s' en '%-.210s' (Errcode: %M)" ger "Fehler beim Umbenennen von '%-.210s' in '%-.210s' (Fehler: %M)" greek "ΠÏόβλημα κατά την μετονομασία του αÏχείου '%-.210s' to '%-.210s' (κωδικός λάθους: %M)" + hindi "'%-.210s' का नाम '%-.210s' बदलने पर तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ (errno: %M)" hun "Hiba a '%-.210s' file atnevezesekor '%-.210s'. (hibakod: %M)" ita "Errore durante la rinominazione da '%-.210s' a '%-.210s' (errno: %M)" jpn "'%-.210s' ã®åå‰ã‚’ '%-.210s' ã«å¤‰æ›´ã§ãã¾ã›ã‚“ (エラー番å·: %M)" @@ -588,6 +612,7 @@ ER_ERROR_ON_WRITE fre "Erreur d'écriture du fichier '%-.200s' (Errcode: %M)" ger "Fehler beim Speichern der Datei '%-.200s' (Fehler: %M)" greek "ΠÏόβλημα κατά την αποθήκευση του αÏχείου '%-.200s' (κωδικός λάθους: %M)" + hindi "फ़ाइल '%-.200s' लिखने में तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ (errno: %M)" hun "Hiba a '%-.200s' file irasakor. (hibakod: %M)" ita "Errore durante la scrittura del file '%-.200s' (errno: %M)" jpn "ファイル '%-.200s' ã®æ›¸ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼ (エラー番å·: %M)" @@ -612,6 +637,7 @@ ER_FILE_USED fre "'%-.192s' est verrouillé contre les modifications" ger "'%-.192s' ist für Änderungen gesperrt" greek "'%-.192s' δεν επιτÏέπονται αλλαγές" + hindi "फ़ाइल '%-.192s' में कोई बदलाव नहीं कर सकते" hun "'%-.192s' a valtoztatas ellen zarolva" ita "'%-.192s' e` soggetto a lock contro i cambiamenti" jpn "'%-.192s' ã¯ãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚" @@ -636,6 +662,7 @@ ER_FILSORT_ABORT fre "Tri alphabétique abandonné" ger "Sortiervorgang abgebrochen" greek "Η διαδικασία ταξινόμισης ακυÏώθηκε" + hindi "SORT निरसà¥à¤¤" hun "Sikertelen rendezes" ita "Operazione di ordinamento abbandonata" jpn "ソート処ç†ã‚’中断ã—ã¾ã—ãŸã€‚" @@ -660,6 +687,7 @@ ER_FORM_NOT_FOUND fre "La vue (View) '%-.192s' n'existe pas pour '%-.192s'" ger "View '%-.192s' existiert für '%-.192s' nicht" greek "Το View '%-.192s' δεν υπάÏχει για '%-.192s'" + hindi "VIEW '%-.192s', '%-.192s' के लिठमौजूद नहीं है" hun "A(z) '%-.192s' nezet nem letezik a(z) '%-.192s'-hoz" ita "La view '%-.192s' non esiste per '%-.192s'" jpn "ビュー '%-.192s' 㯠'%-.192s' ã«å­˜åœ¨ã—ã¾ã›ã‚“。" @@ -681,6 +709,7 @@ ER_GET_ERRNO fre "Reçu l'erreur %M du handler de la table %s" ger "Fehler %M von Speicher-Engine %s" greek "Ελήφθη μήνυμα λάθους %M από τον χειÏιστή πίνακα (table handler) %s" + hindi "%M तà¥à¤°à¥à¤Ÿà¤¿ %s सà¥à¤Ÿà¥‹à¤°à¥‡à¤œ इंजन से" ita "Rilevato l'errore %M dal gestore delle tabelle %s" nor "Mottok feil %M fra tabell hÃ¥ndterer %s" norwegian-ny "Mottok feil %M fra tabell handterar %s" @@ -694,6 +723,7 @@ ER_GET_ERRNO ER_ILLEGAL_HA eng "Storage engine %s of the table %`s.%`s doesn't have this option" ger "Diese Option gibt es nicht in Speicher-Engine %s für %`s.%`s" + hindi "सà¥à¤Ÿà¥‹à¤°à¥‡à¤œ इंजन %s में यह विकलà¥à¤ª उपलबà¥à¤§ नहीं है (टेबल: %`s.%`s)" rus "Обработчик %s таблицы %`s.%`s не поддерживает Ñту возможноÑть" ukr "ДеÑкриптор %s таблиці %`s.%`s не має цієї влаÑтивоÑті" ER_KEY_NOT_FOUND @@ -705,6 +735,7 @@ ER_KEY_NOT_FOUND fre "Ne peut trouver l'enregistrement dans '%-.192s'" ger "Kann Datensatz in '%-.192s' nicht finden" greek "ΑδÏνατη η ανεÏÏεση εγγÏαφής στο '%-.192s'" + hindi "'%-.192s' में रिकॉरà¥à¤¡ नहीं मिला" hun "Nem talalhato a rekord '%-.192s'-ben" ita "Impossibile trovare il record in '%-.192s'" jpn "'%-.192s' ã«ãƒ¬ã‚³ãƒ¼ãƒ‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。" @@ -729,6 +760,7 @@ ER_NOT_FORM_FILE fre "Information erronnée dans le fichier: '%-.200s'" ger "Falsche Information in Datei '%-.200s'" greek "Λάθος πληÏοφοÏίες στο αÏχείο: '%-.200s'" + hindi "फ़ाइल '%-.200s' में गलत जानकारी है" hun "Ervenytelen info a file-ban: '%-.200s'" ita "Informazione errata nel file: '%-.200s'" jpn "ファイル '%-.200s' å†…ã®æƒ…å ±ãŒä¸æ­£ã§ã™ã€‚" @@ -753,6 +785,7 @@ ER_NOT_KEYFILE fre "Index corrompu dans la table: '%-.200s'; essayez de le réparer" ger "Fehlerhafte Index-Datei für Tabelle '%-.200s'; versuche zu reparieren" greek "Λάθος αÏχείο ταξινόμισης (key file) για τον πίνακα: '%-.200s'; ΠαÏακαλώ, διοÏθώστε το!" + hindi "टेबल '%-.200s' का इंडेकà¥à¤¸ CORRUPT हो गया है; इसे REPAIR करने की कोशिश करें" hun "Ervenytelen kulcsfile a tablahoz: '%-.200s'; probalja kijavitani!" ita "File chiave errato per la tabella : '%-.200s'; prova a riparalo" jpn "表 '%-.200s' ã®ç´¢å¼•ファイル(key file)ã®å†…容ãŒä¸æ­£ã§ã™ã€‚修復を試行ã—ã¦ãã ã•ã„。" @@ -777,6 +810,7 @@ ER_OLD_KEYFILE fre "Vieux fichier d'index pour la table '%-.192s'; réparez le!" ger "Alte Index-Datei für Tabelle '%-.192s'. Bitte reparieren" greek "Παλαιό αÏχείο ταξινόμισης (key file) για τον πίνακα '%-.192s'; ΠαÏακαλώ, διοÏθώστε το!" + hindi "टेबल '%-.192s' के लिठपà¥à¤°à¤¾à¤¨à¥€ KEY फ़ाइल; इसे REPAIR करने की कोशिश करें" hun "Regi kulcsfile a '%-.192s'tablahoz; probalja kijavitani!" ita "File chiave vecchio per la tabella '%-.192s'; riparalo!" jpn "表 '%-.192s' ã®ç´¢å¼•ファイル(key file)ã¯å¤ã„å½¢å¼ã§ã™ã€‚修復ã—ã¦ãã ã•ã„。" @@ -801,6 +835,7 @@ ER_OPEN_AS_READONLY fre "'%-.192s' est en lecture seulement" ger "Tabelle '%-.192s' ist nur lesbar" greek "'%-.192s' επιτÏέπεται μόνο η ανάγνωση" + hindi "टेबल '%-.192s' READ-ONLY है" hun "'%-.192s' irasvedett" ita "'%-.192s' e` di sola lettura" jpn "表 '%-.192s' ã¯èª­ã¿è¾¼ã¿å°‚用ã§ã™ã€‚" @@ -897,6 +932,7 @@ ER_CON_COUNT_ERROR 08004 fre "Trop de connexions" ger "Zu viele Verbindungen" greek "ΥπάÏχουν πολλές συνδέσεις..." + hindi "अतà¥à¤¯à¤§à¤¿à¤• कनेकà¥à¤¶à¤¨" hun "Tul sok kapcsolat" ita "Troppe connessioni" jpn "接続ãŒå¤šã™ãŽã¾ã™ã€‚" @@ -945,6 +981,7 @@ ER_BAD_HOST_ERROR 08S01 fre "Ne peut obtenir de hostname pour votre adresse" ger "Kann Hostnamen für diese Adresse nicht erhalten" greek "Δεν έγινε γνωστό το hostname για την address σας" + hindi "आपके I.P. à¤à¤¡à¥à¤°à¥‡à¤¸ के लिठहोसà¥à¤Ÿà¤¨à¥‡à¤® पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में विफल रहे" hun "A gepnev nem allapithato meg a cimbol" ita "Impossibile risalire al nome dell'host dall'indirizzo (risoluzione inversa)" jpn "IPアドレスã‹ã‚‰ãƒ›ã‚¹ãƒˆåを解決ã§ãã¾ã›ã‚“。" @@ -969,6 +1006,7 @@ ER_HANDSHAKE_ERROR 08S01 fre "Mauvais 'handshake'" ger "Ungültiger Handshake" greek "Η αναγνώÏιση (handshake) δεν έγινε σωστά" + hindi "संपरà¥à¤• सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ करते समय तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ (BAD HANDSHAKE)" hun "A kapcsolatfelvetel nem sikerult (Bad handshake)" ita "Negoziazione impossibile" jpn "ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚¨ãƒ©ãƒ¼" @@ -994,6 +1032,7 @@ ER_DBACCESS_DENIED_ERROR 42000 ger "Benutzer '%s'@'%s' hat keine Zugriffsberechtigung für Datenbank '%-.192s'" greek "Δεν επιτέÏεται η Ï€Ïόσβαση στο χÏήστη: '%s'@'%s' στη βάση δεδομένων '%-.192s'" hun "A(z) '%s'@'%s' felhasznalo szamara tiltott eleres az '%-.192s' adabazishoz" + hindi "यूज़र '%s'@'%s' को डेटाबेस '%-.192s' की अनà¥à¤®à¤¤à¤¿ नहीं है" ita "Accesso non consentito per l'utente: '%s'@'%s' al database '%-.192s'" jpn "ユーザー '%s'@'%s' ã® '%-.192s' データベースã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ã¾ã™" kor "'%s'@'%s' 사용ìžëŠ” '%-.192s' ë°ì´íƒ€ë² ì´ìŠ¤ì— ì ‘ê·¼ì´ ê±°ë¶€ ë˜ì—ˆìŠµë‹ˆë‹¤." @@ -1017,6 +1056,7 @@ ER_ACCESS_DENIED_ERROR 28000 fre "Accès refusé pour l'utilisateur: '%s'@'%s' (mot de passe: %s)" ger "Benutzer '%s'@'%s' hat keine Zugriffsberechtigung (verwendetes Passwort: %s)" greek "Δεν επιτέÏεται η Ï€Ïόσβαση στο χÏήστη: '%s'@'%s' (χÏήση password: %s)" + hindi "यूज़र '%s'@'%s' को अनà¥à¤®à¤¤à¤¿ नहीं है (पासवरà¥à¤¡ का उपयोग: %s)" hun "A(z) '%s'@'%s' felhasznalo szamara tiltott eleres. (Hasznalja a jelszot: %s)" ita "Accesso non consentito per l'utente: '%s'@'%s' (Password: %s)" jpn "ユーザー '%s'@'%s' ã‚’æ‹’å¦ã—ã¾ã™.uUsing password: %s)" @@ -1040,6 +1080,7 @@ ER_NO_DB_ERROR 3D000 fre "Aucune base n'a été sélectionnée" ger "Keine Datenbank ausgewählt" greek "Δεν επιλέχθηκε βάση δεδομένων" + hindi "किसी भी डेटाबेस का चयन नहीं किया गया है" hun "Nincs kivalasztott adatbazis" ita "Nessun database selezionato" jpn "データベースãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。" @@ -1064,6 +1105,7 @@ ER_UNKNOWN_COM_ERROR 08S01 fre "Commande inconnue" ger "Unbekannter Befehl" greek "Αγνωστη εντολή" + hindi "अजà¥à¤žà¤¾à¤¤ आदेश" hun "Ervenytelen parancs" ita "Comando sconosciuto" jpn "䏿˜Žãªã‚³ãƒžãƒ³ãƒ‰ã§ã™ã€‚" @@ -1088,6 +1130,7 @@ ER_BAD_NULL_ERROR 23000 fre "Le champ '%-.192s' ne peut être vide (null)" ger "Feld '%-.192s' darf nicht NULL sein" greek "Το πεδίο '%-.192s' δεν μποÏεί να είναι κενό (null)" + hindi "काà¤à¤²à¤® '%-.192s' NULL नहीं हो सकता" hun "A(z) '%-.192s' oszlop erteke nem lehet nulla" ita "La colonna '%-.192s' non puo` essere nulla" jpn "列 '%-.192s' 㯠null ã«ã§ãã¾ã›ã‚“。" @@ -1112,6 +1155,7 @@ ER_BAD_DB_ERROR 42000 fre "Base '%-.192s' inconnue" ger "Unbekannte Datenbank '%-.192s'" greek "Αγνωστη βάση δεδομένων '%-.192s'" + hindi "अजà¥à¤žà¤¾à¤¤ डाटाबेस '%-.192s'" hun "Ervenytelen adatbazis: '%-.192s'" ita "Database '%-.192s' sconosciuto" jpn "'%-.192s' ã¯ä¸æ˜Žãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã§ã™ã€‚" @@ -1136,6 +1180,7 @@ ER_TABLE_EXISTS_ERROR 42S01 fre "La table '%-.192s' existe déjà" ger "Tabelle '%-.192s' bereits vorhanden" greek "Ο πίνακας '%-.192s' υπάÏχει ήδη" + hindi "टेबल '%-.192s' पहले से ही मौजूद है" hun "A(z) '%-.192s' tabla mar letezik" ita "La tabella '%-.192s' esiste gia`" jpn "表 '%-.192s' ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™ã€‚" @@ -1160,6 +1205,7 @@ ER_BAD_TABLE_ERROR 42S02 fre "Table '%-.100s' inconnue" ger "Unbekannte Tabelle '%-.100s'" greek "Αγνωστος πίνακας '%-.100s'" + hindi "अजà¥à¤žà¤¾à¤¤ टेबल '%-.100s'" hun "Ervenytelen tabla: '%-.100s'" ita "Tabella '%-.100s' sconosciuta" jpn "'%-.100s' ã¯ä¸æ˜Žãªè¡¨ã§ã™ã€‚" @@ -1184,6 +1230,7 @@ ER_NON_UNIQ_ERROR 23000 fre "Champ: '%-.192s' dans %-.192s est ambigu" ger "Feld '%-.192s' in %-.192s ist nicht eindeutig" greek "Το πεδίο: '%-.192s' σε %-.192s δεν έχει καθοÏιστεί" + hindi "काà¤à¤²à¤® '%-.192s' असà¥à¤ªà¤·à¥à¤Ÿ है (टेबल: %-.192s)" hun "A(z) '%-.192s' oszlop %-.192s-ben ketertelmu" ita "Colonna: '%-.192s' di %-.192s e` ambigua" jpn "列 '%-.192s' 㯠%-.192s å†…ã§æ›–昧ã§ã™ã€‚" @@ -1208,6 +1255,7 @@ ER_SERVER_SHUTDOWN 08S01 fre "Arrêt du serveur en cours" ger "Der Server wird heruntergefahren" greek "ΕναÏξη διαδικασίας αποσÏνδεσης του εξυπηÏετητή (server shutdown)" + hindi "सरà¥à¤µà¤° बंद हो रहा है" hun "A szerver leallitasa folyamatban" ita "Shutdown del server in corso" jpn "サーãƒãƒ¼ã‚’シャットダウン中ã§ã™ã€‚" @@ -1232,6 +1280,7 @@ ER_BAD_FIELD_ERROR 42S22 S0022 fre "Champ '%-.192s' inconnu dans %-.192s" ger "Unbekanntes Tabellenfeld '%-.192s' in %-.192s" greek "Αγνωστο πεδίο '%-.192s' σε '%-.192s'" + hindi "अजà¥à¤žà¤¾à¤¤ काà¤à¤²à¤® '%-.192s'(टेबल: '%-.192s')" hun "A(z) '%-.192s' oszlop ervenytelen '%-.192s'-ben" ita "Colonna sconosciuta '%-.192s' in '%-.192s'" jpn "列 '%-.192s' 㯠'%-.192s' ã«ã¯ã‚りã¾ã›ã‚“。" @@ -1256,6 +1305,7 @@ ER_WRONG_FIELD_WITH_GROUP 42000 S1009 fre "'%-.192s' n'est pas dans 'group by'" ger "'%-.192s' ist nicht in GROUP BY vorhanden" greek "ΧÏησιμοποιήθηκε '%-.192s' που δεν υπήÏχε στο group by" + hindi "'%-.192s' GROUP BY में नहीं है" hun "Used '%-.192s' with wasn't in group by" ita "Usato '%-.192s' che non e` nel GROUP BY" jpn "'%-.192s' ã¯GROUP BYå¥ã§æŒ‡å®šã•れã¦ã„ã¾ã›ã‚“。" @@ -1280,6 +1330,7 @@ ER_WRONG_GROUP_FIELD 42000 S1009 fre "Ne peut regrouper '%-.192s'" ger "Gruppierung über '%-.192s' nicht möglich" greek "ΑδÏνατη η ομαδοποίηση (group on) '%-.192s'" + hindi "'%-.192s' पर GROUP नहीं कर सकते" hun "A group nem hasznalhato: '%-.192s'" ita "Impossibile raggruppare per '%-.192s'" jpn "'%-.192s' ã§ã®ã‚°ãƒ«ãƒ¼ãƒ—化ã¯ã§ãã¾ã›ã‚“。" @@ -1326,6 +1377,7 @@ ER_WRONG_VALUE_COUNT 21S01 est "Tulpade arv erineb väärtuste arvust" ger "Die Anzahl der Spalten entspricht nicht der Anzahl der Werte" greek "Το Column count δεν ταιÏιάζει με το value count" + hindi "कॉलम की गिनती मूलà¥à¤¯ की गिनती के समान नही है" hun "Az oszlopban levo ertek nem egyezik meg a szamitott ertekkel" ita "Il numero delle colonne non e` uguale al numero dei valori" jpn "列数ãŒå€¤ã®å€‹æ•°ã¨ä¸€è‡´ã—ã¾ã›ã‚“。" @@ -1350,6 +1402,7 @@ ER_TOO_LONG_IDENT 42000 S1009 fre "Le nom de l'identificateur '%-.100s' est trop long" ger "Name des Bezeichners '%-.100s' ist zu lang" greek "Το identifier name '%-.100s' είναι Ï€Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î¿" + hindi "पहचानकरà¥à¤¤à¤¾ का नाम '%-.100s' बहà¥à¤¤ लंबा है" hun "A(z) '%-.100s' azonositonev tul hosszu" ita "Il nome dell'identificatore '%-.100s' e` troppo lungo" jpn "識別å­å '%-.100s' ã¯é•·ã™ãŽã¾ã™ã€‚" @@ -1374,6 +1427,7 @@ ER_DUP_FIELDNAME 42S21 S1009 fre "Nom du champ '%-.192s' déjà utilisé" ger "Doppelter Spaltenname: '%-.192s'" greek "Επανάληψη column name '%-.192s'" + hindi "समान कॉलम '%-.192s' मौजूद है" hun "Duplikalt oszlopazonosito: '%-.192s'" ita "Nome colonna duplicato '%-.192s'" jpn "列å '%-.192s' ã¯é‡è¤‡ã—ã¦ã¾ã™ã€‚" @@ -1398,6 +1452,7 @@ ER_DUP_KEYNAME 42000 S1009 fre "Nom de clef '%-.192s' déjà utilisé" ger "Doppelter Name für Schlüssel vorhanden: '%-.192s'" greek "Επανάληψη key name '%-.192s'" + hindi "समान KEY '%-.192s' मौजूद है" hun "Duplikalt kulcsazonosito: '%-.192s'" ita "Nome chiave duplicato '%-.192s'" jpn "索引å '%-.192s' ã¯é‡è¤‡ã—ã¦ã„ã¾ã™ã€‚" @@ -1424,6 +1479,7 @@ ER_DUP_ENTRY 23000 S1009 fre "Duplicata du champ '%-.192s' pour la clef %d" ger "Doppelter Eintrag '%-.192s' für Schlüssel %d" greek "Διπλή εγγÏαφή '%-.192s' για το κλειδί %d" + hindi "सामान पà¥à¤°à¤µà¥‡à¤¶ '%-.192s' KEY %d के लिà¤" hun "Duplikalt bejegyzes '%-.192s' a %d kulcs szerint" ita "Valore duplicato '%-.192s' per la chiave %d" jpn "'%-.192s' ã¯ç´¢å¼• %d ã§é‡è¤‡ã—ã¦ã„ã¾ã™ã€‚" @@ -1448,6 +1504,7 @@ ER_WRONG_FIELD_SPEC 42000 S1009 fre "Mauvais paramètre de champ pour le champ '%-.192s'" ger "Falsche Spezifikation für Feld '%-.192s'" greek "Εσφαλμένο column specifier για το πεδίο '%-.192s'" + hindi "कॉलम '%-.192s' के लिठगलत कॉलम विनिरà¥à¤¦à¥‡à¤¶à¤•" hun "Rossz oszlopazonosito: '%-.192s'" ita "Specifica errata per la colonna '%-.192s'" jpn "列 '%-.192s' ã®å®šç¾©ãŒä¸æ­£ã§ã™ã€‚" @@ -1472,6 +1529,7 @@ ER_PARSE_ERROR 42000 s1009 fre "%s près de '%-.80s' à la ligne %d" ger "%s bei '%-.80s' in Zeile %d" greek "%s πλησίον '%-.80s' στη γÏαμμή %d" + hindi "%s के पास '%-.80s' लाइन %d में" hun "A %s a '%-.80s'-hez kozeli a %d sorban" ita "%s vicino a '%-.80s' linea %d" jpn "%s : '%-.80s' 付近 %d 行目" @@ -1496,6 +1554,7 @@ ER_EMPTY_QUERY 42000 fre "Query est vide" ger "Leere Abfrage" greek "Το εÏώτημα (query) που θέσατε ήταν κενό" + hindi "कà¥à¤µà¥‡à¤°à¥€ खली थी" hun "Ures lekerdezes" ita "La query e` vuota" jpn "クエリãŒç©ºã§ã™ã€‚" @@ -1520,6 +1579,7 @@ ER_NONUNIQ_TABLE 42000 S1009 fre "Table/alias: '%-.192s' non unique" ger "Tabellenname/Alias '%-.192s' nicht eindeutig" greek "ΑδÏνατη η ανεÏÏεση unique table/alias: '%-.192s'" + hindi "टेबल या उसका उपनाम '%-.192s' अदà¥à¤µà¤¿à¤¤à¥€à¤¯ नहीं है" hun "Nem egyedi tabla/alias: '%-.192s'" ita "Tabella/alias non unico: '%-.192s'" jpn "表åï¼åˆ¥å '%-.192s' ã¯ä¸€æ„ã§ã¯ã‚りã¾ã›ã‚“。" @@ -1544,6 +1604,7 @@ ER_INVALID_DEFAULT 42000 S1009 fre "Valeur par défaut invalide pour '%-.192s'" ger "Fehlerhafter Vorgabewert (DEFAULT) für '%-.192s'" greek "Εσφαλμένη Ï€ÏοκαθοÏισμένη τιμή (default value) για '%-.192s'" + hindi "'%-.192s' के लिठअवैध डिफ़ॉलà¥à¤Ÿ मान" hun "Ervenytelen ertek: '%-.192s'" ita "Valore di default non valido per '%-.192s'" jpn "'%-.192s' ã¸ã®ãƒ‡ãƒ•ォルト値ãŒç„¡åйã§ã™ã€‚" @@ -1568,6 +1629,7 @@ ER_MULTIPLE_PRI_KEY 42000 S1009 fre "Plusieurs clefs primaires définies" ger "Mehrere Primärschlüssel (PRIMARY KEY) definiert" greek "ΠεÏισσότεÏα από ένα primary key οÏίστηκαν" + hindi "कई PRIMARY KEY परिभाषित" hun "Tobbszoros elsodleges kulcs definialas" ita "Definite piu` chiave primarie" jpn "PRIMARY KEY ãŒè¤‡æ•°å®šç¾©ã•れã¦ã„ã¾ã™ã€‚" @@ -1593,6 +1655,7 @@ ER_TOO_MANY_KEYS 42000 S1009 ger "Zu viele Schlüssel definiert. Maximal %d Schlüssel erlaubt" greek "ΠάÏα πολλά key οÏίσθηκαν. Το Ï€Î¿Î»Ï %d επιτÏέπονται" hun "Tul sok kulcs. Maximum %d kulcs engedelyezett" + hindi "बहà¥à¤¤ सारी KEYS निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ हैं; अधिकतम %d KEYS की अनà¥à¤®à¤¤à¤¿ है" ita "Troppe chiavi. Sono ammesse max %d chiavi" jpn "ç´¢å¼•ã®æ•°ãŒå¤šã™ãŽã¾ã™ã€‚最大 %d 個ã¾ã§ã§ã™ã€‚" kor "너무 ë§Žì€ í‚¤ê°€ ì •ì˜ë˜ì–´ 있ì니다.. 최대 %dì˜ í‚¤ê°€ 가능함" @@ -1616,6 +1679,7 @@ ER_TOO_MANY_KEY_PARTS 42000 S1009 fre "Trop de parties specifiées dans la clef. Maximum de %d parties" ger "Zu viele Teilschlüssel definiert. Maximal %d Teilschlüssel erlaubt" greek "ΠάÏα πολλά key parts οÏίσθηκαν. Το Ï€Î¿Î»Ï %d επιτÏέπονται" + hindi "बहà¥à¤¤ सारे KEY के भाग निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ हैं; अधिकतम %d भागों की अनà¥à¤®à¤¤à¤¿ है" hun "Tul sok kulcsdarabot definialt. Maximum %d resz engedelyezett" ita "Troppe parti di chiave specificate. Sono ammesse max %d parti" jpn "索引ã®ã‚­ãƒ¼åˆ—指定ãŒå¤šã™ãŽã¾ã™ã€‚最大 %d 個ã¾ã§ã§ã™ã€‚" @@ -1640,6 +1704,7 @@ ER_TOO_LONG_KEY 42000 S1009 fre "La clé est trop longue. Longueur maximale: %d" ger "Schlüssel ist zu lang. Die maximale Schlüssellänge beträgt %d" greek "Το κλειδί που οÏίσθηκε είναι Ï€Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î¿. Το μέγιστο μήκος είναι %d" + hindi "निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ KEY बहà¥à¤¤ लंबी थी; KEY की अधिकतम लंबाई %d बाइट है" hun "A megadott kulcs tul hosszu. Maximalis kulcshosszusag: %d" ita "La chiave specificata e` troppo lunga. La max lunghezza della chiave e` %d" jpn "索引ã®ã‚­ãƒ¼ãŒé•·ã™ãŽã¾ã™ã€‚最大 %d ãƒã‚¤ãƒˆã¾ã§ã§ã™ã€‚" @@ -1664,6 +1729,7 @@ ER_KEY_COLUMN_DOES_NOT_EXITS 42000 S1009 fre "La clé '%-.192s' n'existe pas dans la table" ger "In der Tabelle gibt es kein Schlüsselfeld '%-.192s'" greek "Το πεδίο κλειδί '%-.192s' δεν υπάÏχει στον πίνακα" + hindi "KEY कॉलम '%-.192s' टेबल में मौजूद नहीं है" hun "A(z) '%-.192s'kulcsoszlop nem letezik a tablaban" ita "La colonna chiave '%-.192s' non esiste nella tabella" jpn "キー列 '%-.192s' ã¯è¡¨ã«ã‚りã¾ã›ã‚“。" @@ -1682,6 +1748,7 @@ ER_KEY_COLUMN_DOES_NOT_EXITS 42000 S1009 ER_BLOB_USED_AS_KEY 42000 S1009 eng "BLOB column %`s can't be used in key specification in the %s table" ger "BLOB-Feld %`s kann beim %s Tabellen nicht als Schlüssel verwendet werden" + hindi "BLOB कॉलम %`s टेबल %s में KEY विनिरà¥à¤¦à¥‡à¤¶ में इसà¥à¤¤à¥‡à¤®à¤¾à¤² नहीं किया जा सकता" rus "Столбец типа BLOB %`s не может быть иÑпользован как значение ключа в %s таблице" ukr "BLOB Ñтовбець %`s не може бути викориÑтаний у визначенні ключа в %s таблиці" ER_TOO_BIG_FIELDLENGTH 42000 S1009 @@ -1693,6 +1760,7 @@ ER_TOO_BIG_FIELDLENGTH 42000 S1009 fre "Champ '%-.192s' trop long (max = %lu). Utilisez un BLOB" ger "Feldlänge für Feld '%-.192s' zu groß (maximal %lu). BLOB- oder TEXT-Spaltentyp verwenden!" greek "Î Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î¿ μήκος για το πεδίο '%-.192s' (max = %lu). ΠαÏακαλώ χÏησιμοποιείστε τον Ï„Ïπο BLOB" + hindi "कॉलम की लंबाई कॉलम '%-.192s' के लिठबड़ी है (अधिकतम = %lu); BLOB या TEXT का उपयोग करें" hun "A(z) '%-.192s' oszlop tul hosszu. (maximum = %lu). Hasznaljon BLOB tipust inkabb" ita "La colonna '%-.192s' e` troppo grande (max=%lu). Utilizza un BLOB" jpn "列 '%-.192s' ã®ã‚µã‚¤ã‚ºå®šç¾©ãŒå¤§ãã™ãŽã¾ã™ (最大 %lu ã¾ã§)。代ã‚り㫠BLOB ã¾ãŸã¯ TEXT を使用ã—ã¦ãã ã•ã„。" @@ -1717,6 +1785,7 @@ ER_WRONG_AUTO_KEY 42000 S1009 fre "Un seul champ automatique est permis et il doit être indexé" ger "Falsche Tabellendefinition. Es darf nur eine AUTO_INCREMENT-Spalte geben, und diese muss als Schlüssel definiert werden" greek "ΜποÏεί να υπάÏχει μόνο ένα auto field και Ï€Ïέπει να έχει οÏισθεί σαν key" + hindi "गलत टेबल परिभाषा; टेबल में केवल à¤à¤• AUTO_INCREMENT कॉलम हो सकता है और इसे à¤à¤• KEY के रूप में परिभाषित किया जाना चाहिà¤" hun "Csak egy auto mezo lehetseges, es azt kulcskent kell definialni" ita "Puo` esserci solo un campo AUTO e deve essere definito come chiave" jpn "䏿­£ãªè¡¨å®šç¾©ã§ã™ã€‚AUTO_INCREMENT列ã¯ï¼‘個ã¾ã§ã§ã€ç´¢å¼•を定義ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" @@ -1743,6 +1812,7 @@ ER_NORMAL_SHUTDOWN fre "%s (%s): Arrêt normal du serveur\n" ger "%s (%s): Normal heruntergefahren\n" greek "%s (%s): Φυσιολογική διαδικασία shutdown\n" + hindi "%s (%s): सामानà¥à¤¯ शटडाउन\n" hun "%s (%s): Normal leallitas\n" ita "%s (%s): Shutdown normale\n" jpn "%s (%s): 通常シャットダウン\n" @@ -1767,6 +1837,7 @@ ER_GOT_SIGNAL fre "%s: Reçu le signal %d. Abandonne!\n" ger "%s: Signal %d erhalten. Abbruch!\n" greek "%s: Ελήφθη το μήνυμα %d. Η διαδικασία εγκαταλείπεται!\n" + hindi "%s: सिगà¥à¤¨à¤² %d मिलने के कारण सिसà¥à¤Ÿà¤® बंद किया जा रहा है!\n" hun "%s: %d jelzes. Megszakitva!\n" ita "%s: Ricevuto segnale %d. Interruzione!\n" jpn "%s: シグナル %d ã‚’å—ä¿¡ã—ã¾ã—ãŸã€‚強制終了ã—ã¾ã™ï¼\n" @@ -1791,6 +1862,7 @@ ER_SHUTDOWN_COMPLETE fre "%s: Arrêt du serveur terminé\n" ger "%s: Herunterfahren beendet\n" greek "%s: Η διαδικασία Shutdown ολοκληÏώθηκε\n" + hindi "%s: शटडाउन पूरà¥à¤£\n" hun "%s: A leallitas kesz\n" ita "%s: Shutdown completato\n" jpn "%s: シャットダウン完了\n" @@ -1815,6 +1887,7 @@ ER_FORCING_CLOSE 08S01 fre "%s: Arrêt forcé de la tâche (thread) %ld utilisateur: '%-.48s'\n" ger "%s: Thread %ld zwangsweise beendet. Benutzer: '%-.48s'\n" greek "%s: Το thread θα κλείσει %ld user: '%-.48s'\n" + hindi "%s: %ld थà¥à¤°à¥‡à¤¡ बंद किया जा रहा है (यूज़र: '%-.48s')\n" hun "%s: A(z) %ld thread kenyszeritett zarasa. Felhasznalo: '%-.48s'\n" ita "%s: Forzata la chiusura del thread %ld utente: '%-.48s'\n" jpn "%s: スレッド %ld を強制終了ã—ã¾ã™ (ユーザー: '%-.48s')\n" @@ -1839,6 +1912,7 @@ ER_IPSOCK_ERROR 08S01 fre "Ne peut créer la connexion IP (socket)" ger "Kann IP-Socket nicht erzeugen" greek "Δεν είναι δυνατή η δημιουÏγία IP socket" + hindi "IP SOCKET नहीं बना सकते" hun "Az IP socket nem hozhato letre" ita "Impossibile creare il socket IP" jpn "IPソケットを作æˆã§ãã¾ã›ã‚“。" @@ -1863,6 +1937,7 @@ ER_NO_SUCH_INDEX 42S12 S1009 fre "La table '%-.192s' n'a pas d'index comme celle utilisée dans CREATE INDEX. Recréez la table" ger "Tabelle '%-.192s' besitzt keinen wie den in CREATE INDEX verwendeten Index. Tabelle neu anlegen" greek "Ο πίνακας '%-.192s' δεν έχει ευÏετήÏιο (index) σαν αυτό που χÏησιμοποιείτε στην CREATE INDEX. ΠαÏακαλώ, ξαναδημιουÏγήστε τον πίνακα" + hindi "CREATE INDEX में इसà¥à¤¤à¥‡à¤®à¤¾à¤² की गयी सूचि टेबल '%-.192s' में उपलबà¥à¤§ नहीं है; टेबल को पà¥à¤¨à¤ƒ बनायें" hun "A(z) '%-.192s' tablahoz nincs meg a CREATE INDEX altal hasznalt index. Alakitsa at a tablat" ita "La tabella '%-.192s' non ha nessun indice come quello specificatato dalla CREATE INDEX. Ricrea la tabella" jpn "表 '%-.192s' ã«ä»¥å‰CREATE INDEXã§ä½œæˆã•れãŸç´¢å¼•ãŒã‚りã¾ã›ã‚“。表を作り直ã—ã¦ãã ã•ã„。" @@ -1887,6 +1962,7 @@ ER_WRONG_FIELD_TERMINATORS 42000 S1009 fre "Séparateur de champs inconnu. Vérifiez dans le manuel" ger "Feldbegrenzer-Argument ist nicht in der erwarteten Form. Bitte im Handbuch nachlesen" greek "Ο διαχωÏιστής πεδίων δεν είναι αυτός που αναμενόταν. ΠαÏακαλώ ανατÏέξτε στο manual" + hindi "फीलà¥à¤¡ विभाजक आरà¥à¤—à¥à¤®à¥‡à¤‚ट गलत है; मैनà¥à¤…ल की जाà¤à¤š करें" hun "A mezoelvalaszto argumentumok nem egyeznek meg a varttal. Nezze meg a kezikonyvben!" ita "L'argomento 'Field separator' non e` quello atteso. Controlla il manuale" jpn "フィールド区切り文字ãŒäºˆæœŸã›ã¬ä½¿ã‚れ方をã—ã¦ã„ã¾ã™ã€‚マニュアルを確èªã—ã¦ä¸‹ã•ã„。" @@ -1911,6 +1987,7 @@ ER_BLOBS_AND_NO_TERMINATED 42000 S1009 fre "Vous ne pouvez utiliser des lignes de longueur fixe avec des BLOBs. Utiliser 'fields terminated by'" ger "Eine feste Zeilenlänge kann für BLOB-Felder nicht verwendet werden. Bitte 'fields terminated by' verwenden" greek "Δεν μποÏείτε να χÏησιμοποιήσετε fixed rowlength σε BLOBs. ΠαÏακαλώ χÏησιμοποιείστε 'fields terminated by'" + hindi "BLOBs को निशà¥à¤šà¤¿à¤¤ लंबाई की पंकà¥à¤¤à¤¿ के साथ पà¥à¤°à¤¯à¥‹à¤— नहीं किया जा सकता है; 'FIELDS TERMINATED BY' का इसà¥à¤¤à¥‡à¤®à¤¾à¤² करें" hun "Fix hosszusagu BLOB-ok nem hasznalhatok. Hasznalja a 'mezoelvalaszto jelet' " ita "Non possono essere usate righe a lunghezza fissa con i BLOB. Usa 'FIELDS TERMINATED BY'" jpn "BLOBã«ã¯å›ºå®šé•·ãƒ¬ã‚³ãƒ¼ãƒ‰ãŒä½¿ç”¨ã§ãã¾ã›ã‚“。'FIELDS TERMINATED BY'å¥ã‚’使用ã—ã¦ä¸‹ã•ã„。" @@ -1935,6 +2012,7 @@ ER_TEXTFILE_NOT_READABLE fre "Le fichier '%-.128s' doit être dans le répertoire de la base et lisible par tous" ger "Datei '%-.128s' muss im Datenbank-Verzeichnis vorhanden oder lesbar für alle sein" greek "Το αÏχείο '%-.128s' Ï€Ïέπει να υπάÏχει στο database directory ή να μποÏεί να διαβαστεί από όλους" + hindi "फ़ाइल '%-.128s' डेटाबेस डायरेकà¥à¤Ÿà¤°à¥€ में या सभी के दà¥à¤µà¤¾à¤°à¤¾ पठनीय होना चाहिà¤" hun "A(z) '%-.128s'-nak az adatbazis konyvtarban kell lennie, vagy mindenki szamara olvashatonak" ita "Il file '%-.128s' deve essere nella directory del database e deve essere leggibile da tutti" jpn "ファイル '%-.128s' ã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ã‚ã‚‹ã‹ã€å…¨ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‹ã‚‰èª­ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" @@ -1959,6 +2037,7 @@ ER_FILE_EXISTS_ERROR fre "Le fichier '%-.200s' existe déjà" ger "Datei '%-.200s' bereits vorhanden" greek "Το αÏχείο '%-.200s' υπάÏχει ήδη" + hindi "फ़ाइल '%-.200s' पहले से मौजूद है" hun "A '%-.200s' file mar letezik" ita "Il file '%-.200s' esiste gia`" jpn "ファイル '%-.200s' ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™ã€‚" @@ -1983,6 +2062,7 @@ ER_LOAD_INFO fre "Enregistrements: %ld Effacés: %ld Non traités: %ld Avertissements: %ld" ger "Datensätze: %ld Gelöscht: %ld Ausgelassen: %ld Warnungen: %ld" greek "ΕγγÏαφές: %ld ΔιαγÏαφές: %ld ΠαÏεκάμφθησαν: %ld ΠÏοειδοποιήσεις: %ld" + hindi "रिकॉरà¥à¤¡: %ld हटाठगà¤: %ld छोड़ दिठगà¤: %ld चेतावनी: %ld" hun "Rekordok: %ld Torolve: %ld Skipped: %ld Warnings: %ld" ita "Records: %ld Cancellati: %ld Saltati: %ld Avvertimenti: %ld" jpn "レコード数: %ld 削除: %ld スキップ: %ld 警告: %ld" @@ -2007,6 +2087,7 @@ ER_ALTER_INFO fre "Enregistrements: %ld Doublons: %ld" ger "Datensätze: %ld Duplikate: %ld" greek "ΕγγÏαφές: %ld Επαναλήψεις: %ld" + hindi "रिकॉरà¥à¤¡: %ld डà¥à¤ªà¥à¤²à¤¿à¤•ेट: %ld" hun "Rekordok: %ld Duplikalva: %ld" ita "Records: %ld Duplicati: %ld" jpn "レコード数: %ld é‡è¤‡: %ld" @@ -2055,6 +2136,7 @@ ER_CANT_REMOVE_ALL_FIELDS 42000 fre "Vous ne pouvez effacer tous les champs avec ALTER TABLE. Utilisez DROP TABLE" ger "Mit ALTER TABLE können nicht alle Felder auf einmal gelöscht werden. Dafür DROP TABLE verwenden" greek "Δεν είναι δυνατή η διαγÏαφή όλων των πεδίων με ALTER TABLE. ΠαÏακαλώ χÏησιμοποιείστε DROP TABLE" + hindi "ALTER TABLE का इसà¥à¤¤à¥‡à¤®à¤¾à¤² कर सभी कॉलमà¥à¤¸ को हटाया नहीं जा सकता; DROP TABLE का इसà¥à¤¤à¥‡à¤®à¤¾à¤² करें" hun "Az osszes mezo nem torolheto az ALTER TABLE-lel. Hasznalja a DROP TABLE-t helyette" ita "Non si possono cancellare tutti i campi con una ALTER TABLE. Utilizzare DROP TABLE" jpn "ALTER TABLE ã§ã¯å…¨ã¦ã®åˆ—ã®å‰Šé™¤ã¯ã§ãã¾ã›ã‚“。DROP TABLE を使用ã—ã¦ãã ã•ã„。" @@ -2079,6 +2161,7 @@ ER_CANT_DROP_FIELD_OR_KEY 42000 fre "Ne peut effacer (DROP %s) %`-.192s. Vérifiez s'il existe" ger "DROP %s: Kann %`-.192s nicht löschen. Existiert es?" greek "ΑδÏνατη η διαγÏαφή (DROP %s) %`-.192s. ΠαÏακαλώ ελέγξτε αν το πεδίο/κλειδί υπάÏχει" + hindi "%s %`-.192s को डà¥à¤°à¥‰à¤ª नहीं कर सकते हैं; कृपया जाà¤à¤š करें कि यह मौजूद है" hun "A DROP %s %`-.192s nem lehetseges. Ellenorizze, hogy a mezo/kulcs letezik-e" ita "Impossibile cancellare (DROP %s) %`-.192s. Controllare che il campo chiave esista" nor "Kan ikke DROP %s %`-.192s. Undersøk om felt/nøkkel eksisterer" @@ -2101,6 +2184,7 @@ ER_INSERT_INFO fre "Enregistrements: %ld Doublons: %ld Avertissements: %ld" ger "Datensätze: %ld Duplikate: %ld Warnungen: %ld" greek "ΕγγÏαφές: %ld Επαναλήψεις: %ld ΠÏοειδοποιήσεις: %ld" + hindi "रिकॉरà¥à¤¡: %ld डà¥à¤ªà¥à¤²à¤¿à¤•ेट: %ld चेतावनी: %ld" hun "Rekordok: %ld Duplikalva: %ld Warnings: %ld" ita "Records: %ld Duplicati: %ld Avvertimenti: %ld" jpn "レコード数: %ld é‡è¤‡æ•°: %ld 警告: %ld" @@ -2128,6 +2212,7 @@ ER_NO_SUCH_THREAD fre "Numéro de tâche inconnu: %lu" ger "Unbekannte Thread-ID: %lu" greek "Αγνωστο thread id: %lu" + hindi "अजà¥à¤žà¤¾à¤¤ थà¥à¤°à¥‡à¤¡ ID: %lu" hun "Ervenytelen szal (thread) id: %lu" ita "Thread id: %lu sconosciuto" jpn "䏿˜Žãªã‚¹ãƒ¬ãƒƒãƒ‰IDã§ã™: %lu" @@ -2152,6 +2237,7 @@ ER_KILL_DENIED_ERROR fre "Vous n'êtes pas propriétaire de la tâche no: %lu" ger "Sie sind nicht Eigentümer von Thread %lu" greek "Δεν είσθε owner του thread %lu" + hindi "आप थà¥à¤°à¥‡à¤¡ %lu के OWNER नहीं हैं" hun "A %lu thread-nek mas a tulajdonosa" ita "Utente non proprietario del thread %lu" jpn "スレッド %lu ã®ã‚ªãƒ¼ãƒŠãƒ¼ã§ã¯ã‚りã¾ã›ã‚“。" @@ -2176,6 +2262,7 @@ ER_NO_TABLES_USED fre "Aucune table utilisée" ger "Keine Tabellen verwendet" greek "Δεν χÏησιμοποιήθηκαν πίνακες" + hindi "कोई टेबल का इसà¥à¤¤à¥‡à¤®à¤¾à¤² नहीं हà¥à¤†" hun "Nincs hasznalt tabla" ita "Nessuna tabella usata" jpn "è¡¨ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“。" @@ -2224,6 +2311,7 @@ ER_NO_UNIQUE_LOGFILE fre "Ne peut générer un unique nom de journal %-.200s.(1-999)\n" ger "Kann keinen eindeutigen Dateinamen für die Logdatei %-.200s(1-999) erzeugen\n" greek "ΑδÏνατη η δημιουÏγία unique log-filename %-.200s.(1-999)\n" + hindi "à¤à¤• अनूठा लॉग-फ़ाइल नाम %-.200s.(1-999) उतà¥à¤ªà¤¨à¥à¤¨ नहीं कर सके\n" hun "Egyedi log-filenev nem generalhato: %-.200s.(1-999)\n" ita "Impossibile generare un nome del file log unico %-.200s.(1-999)\n" jpn "一æ„ãªãƒ­ã‚°ãƒ•ァイルå %-.200s.(1-999) を生æˆã§ãã¾ã›ã‚“。\n" @@ -2248,6 +2336,7 @@ ER_TABLE_NOT_LOCKED_FOR_WRITE fre "Table '%-.192s' verrouillée lecture (READ): modification impossible" ger "Tabelle '%-.192s' ist mit Lesesperre versehen und kann nicht aktualisiert werden" greek "Ο πίνακας '%-.192s' έχει κλειδωθεί με READ lock και δεν επιτÏέπονται αλλαγές" + hindi "टेबल '%-.192s' READ लॉक से बंद है और उसे बदल नहीं सकते" hun "A(z) '%-.192s' tabla zarolva lett (READ lock) es nem lehet frissiteni" ita "La tabella '%-.192s' e` soggetta a lock in lettura e non puo` essere aggiornata" jpn "表 '%-.192s' ã¯READロックã•れã¦ã„ã¦ã€æ›´æ–°ã§ãã¾ã›ã‚“。" @@ -2272,6 +2361,7 @@ ER_TABLE_NOT_LOCKED fre "Table '%-.192s' non verrouillée: utilisez LOCK TABLES" ger "Tabelle '%-.192s' wurde nicht mit LOCK TABLES gesperrt" greek "Ο πίνακας '%-.192s' δεν έχει κλειδωθεί με LOCK TABLES" + hindi "टेबल '%-.192s' LOCK TABLES से बंद नहीं है" hun "A(z) '%-.192s' tabla nincs zarolva a LOCK TABLES-szel" ita "Non e` stato impostato il lock per la tabella '%-.192s' con LOCK TABLES" jpn "表 '%-.192s' 㯠LOCK TABLES ã§ãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã›ã‚“。" @@ -2296,6 +2386,7 @@ ER_BLOB_CANT_HAVE_DEFAULT 42000 fre "BLOB '%-.192s' ne peut avoir de valeur par défaut" ger "BLOB/TEXT-Feld '%-.192s' darf keinen Vorgabewert (DEFAULT) haben" greek "Τα Blob πεδία '%-.192s' δεν μποÏοÏν να έχουν Ï€ÏοκαθοÏισμένες τιμές (default value)" + hindi "BLOB/TEXT कॉलम '%-.192s' का डिफ़ॉलà¥à¤Ÿ मान नहीं हो सकता" hun "A(z) '%-.192s' blob objektumnak nem lehet alapertelmezett erteke" ita "Il campo BLOB '%-.192s' non puo` avere un valore di default" jpn "BLOB/TEXT 列 '%-.192s' ã«ã¯ãƒ‡ãƒ•ォルト値を指定ã§ãã¾ã›ã‚“。" @@ -2320,6 +2411,7 @@ ER_WRONG_DB_NAME 42000 fre "Nom de base de donnée illégal: '%-.100s'" ger "Unerlaubter Datenbankname '%-.100s'" greek "Λάθος όνομα βάσης δεδομένων '%-.100s'" + hindi "डेटाबेस नाम '%-.100s' गलत है" hun "Hibas adatbazisnev: '%-.100s'" ita "Nome database errato '%-.100s'" jpn "データベースå '%-.100s' ã¯ä¸æ­£ã§ã™ã€‚" @@ -2344,6 +2436,7 @@ ER_WRONG_TABLE_NAME 42000 fre "Nom de table illégal: '%-.100s'" ger "Unerlaubter Tabellenname '%-.100s'" greek "Λάθος όνομα πίνακα '%-.100s'" + hindi "टेबल नाम '%-.100s' गलत है" hun "Hibas tablanev: '%-.100s'" ita "Nome tabella errato '%-.100s'" jpn "表å '%-.100s' ã¯ä¸æ­£ã§ã™ã€‚" @@ -2369,6 +2462,7 @@ ER_TOO_BIG_SELECT 42000 ger "Die Ausführung des SELECT würde zu viele Datensätze untersuchen und wahrscheinlich sehr lange dauern. Bitte WHERE-Klausel überprüfen und gegebenenfalls SET SQL_BIG_SELECTS=1 oder SET MAX_JOIN_SIZE=# verwenden" greek "Το SELECT θα εξετάσει μεγάλο αÏιθμό εγγÏαφών και πιθανώς θα καθυστεÏήσει. ΠαÏακαλώ εξετάστε τις παÏαμέτÏους του WHERE και χÏησιμοποιείστε SET SQL_BIG_SELECTS=1 αν το SELECT είναι σωστό" hun "A SELECT tul sok rekordot fog megvizsgalni es nagyon sokaig fog tartani. Ellenorizze a WHERE-t es hasznalja a SET SQL_BIG_SELECTS=1 beallitast, ha a SELECT okay" + hindi "SELECT कमांड MAX_JOIN_SIZE पंकà¥à¤¤à¤¿à¤¯à¥‹à¤‚ से भी जà¥à¤¯à¤¾à¤¦à¤¾ की जांच करेगा; कृपया WHERE कà¥à¤²à¥‰à¥› को जाचें अथवा SET SQL_BIG_SELECTS=1 या SET MAX_JOIN_SIZE=# का इसà¥à¤¤à¥‡à¤®à¤¾à¤² करें" ita "La SELECT dovrebbe esaminare troppi record e usare troppo tempo. Controllare la WHERE e usa SET SQL_BIG_SELECTS=1 se e` tutto a posto" jpn "SELECTãŒMAX_JOIN_SIZEã‚’è¶…ãˆã‚‹è¡Œæ•°ã‚’処ç†ã—ã¾ã—ãŸã€‚WHEREå¥ã‚’確èªã—ã€SELECTæ–‡ã«å•題ãŒãªã‘れã°ã€ SET SQL_BIG_SELECTS=1 ã¾ãŸã¯ SET MAX_JOIN_SIZE=# を使用ã—ã¦ä¸‹ã•ã„。" kor "SELECT 명령ì—서 너무 ë§Žì€ ë ˆì½”ë“œë¥¼ 찾기 ë•Œë¬¸ì— ë§Žì€ ì‹œê°„ì´ ì†Œìš”ë©ë‹ˆë‹¤. ë”°ë¼ì„œ WHERE ë¬¸ì„ ì ê²€í•˜ê±°ë‚˜, 만약 SELECTê°€ okë˜ë©´ SET SQL_BIG_SELECTS=1 ì˜µì…˜ì„ ì‚¬ìš©í•˜ì„¸ìš”." @@ -2392,6 +2486,7 @@ ER_UNKNOWN_ERROR fre "Erreur inconnue" ger "Unbekannter Fehler" greek "ΠÏοέκυψε άγνωστο λάθος" + hindi "अजà¥à¤žà¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ" hun "Ismeretlen hiba" ita "Errore sconosciuto" jpn "䏿˜Žãªã‚¨ãƒ©ãƒ¼" @@ -2415,6 +2510,7 @@ ER_UNKNOWN_PROCEDURE 42000 fre "Procédure %-.192s inconnue" ger "Unbekannte Prozedur '%-.192s'" greek "Αγνωστη διαδικασία '%-.192s'" + hindi "अजà¥à¤žà¤¾à¤¤ पà¥à¤°à¥‹à¤¸à¥€à¤œà¤° '%-.192s'" hun "Ismeretlen eljaras: '%-.192s'" ita "Procedura '%-.192s' sconosciuta" jpn "'%-.192s' ã¯ä¸æ˜Žãªãƒ—ロシージャã§ã™ã€‚" @@ -2439,6 +2535,7 @@ ER_WRONG_PARAMCOUNT_TO_PROCEDURE 42000 fre "Mauvais nombre de paramètres pour la procedure %-.192s" ger "Falsche Parameterzahl für Prozedur '%-.192s'" greek "Λάθος αÏιθμός παÏαμέτÏων στη διαδικασία '%-.192s'" + hindi "पà¥à¤°à¥‹à¤¸à¥€à¤œà¤° '%-.192s' के लिठपैरामीटर की संखà¥à¤¯à¤¾ गलत है" hun "Rossz parameter a(z) '%-.192s'eljaras szamitasanal" ita "Numero di parametri errato per la procedura '%-.192s'" jpn "プロシージャ '%-.192s' ã¸ã®ãƒ‘ラメータ数ãŒä¸æ­£ã§ã™ã€‚" @@ -2463,6 +2560,7 @@ ER_WRONG_PARAMETERS_TO_PROCEDURE fre "Paramètre erroné pour la procedure %-.192s" ger "Falsche Parameter für Prozedur '%-.192s'" greek "Λάθος παÏάμετÏοι στην διαδικασία '%-.192s'" + hindi "पà¥à¤°à¥‹à¤¸à¥€à¤œà¤° '%-.192s' के लिठपैरामीटरà¥à¤¸ गलत हैं" hun "Rossz parameter a(z) '%-.192s' eljarasban" ita "Parametri errati per la procedura '%-.192s'" jpn "プロシージャ '%-.192s' ã¸ã®ãƒ‘ラメータãŒä¸æ­£ã§ã™ã€‚" @@ -2487,6 +2585,7 @@ ER_UNKNOWN_TABLE 42S02 fre "Table inconnue '%-.192s' dans %-.32s" ger "Unbekannte Tabelle '%-.192s' in '%-.32s'" greek "Αγνωστος πίνακας '%-.192s' σε %-.32s" + hindi "टेबल '%-.192s', %-.32s में नहीं मिला" hun "Ismeretlen tabla: '%-.192s' %-.32s-ban" ita "Tabella '%-.192s' sconosciuta in %-.32s" jpn "'%-.192s' 㯠%-.32s ã§ã¯ä¸æ˜Žãªè¡¨ã§ã™ã€‚" @@ -2511,6 +2610,7 @@ ER_FIELD_SPECIFIED_TWICE 42000 fre "Champ '%-.192s' spécifié deux fois" ger "Feld '%-.192s' wurde zweimal angegeben" greek "Το πεδίο '%-.192s' έχει οÏισθεί δÏο φοÏές" + hindi "कॉलम '%-.192s' दो बार निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ किया गया है" hun "A(z) '%-.192s' mezot ketszer definialta" ita "Campo '%-.192s' specificato 2 volte" jpn "列 '%-.192s' ã¯2回指定ã•れã¦ã„ã¾ã™ã€‚" @@ -2535,6 +2635,7 @@ ER_INVALID_GROUP_FUNC_USE fre "Utilisation invalide de la clause GROUP" ger "Falsche Verwendung einer Gruppierungsfunktion" greek "Εσφαλμένη χÏήση της group function" + hindi "गà¥à¤°à¥à¤ª फंकà¥à¤¶à¤¨ का अवैध उपयोग" hun "A group funkcio ervenytelen hasznalata" ita "Uso non valido di una funzione di raggruppamento" jpn "集計関数ã®ä½¿ç”¨æ–¹æ³•ãŒä¸æ­£ã§ã™ã€‚" @@ -2556,6 +2657,7 @@ ER_UNSUPPORTED_EXTENSION 42000 fre "Table '%-.192s' : utilise une extension invalide pour cette version de MariaDB" ger "Tabelle '%-.192s' verwendet eine Erweiterung, die in dieser MariaDB-Version nicht verfügbar ist" greek "Ο πίνακς '%-.192s' χÏησιμοποιεί κάποιο extension που δεν υπάÏχει στην έκδοση αυτή της MariaDB" + hindi "टेबल '%-.192s' जिस इकà¥à¤¸à¥à¤Ÿà¥‡à¤¨à¥à¤¶à¤¨ का उपयोग कर रहा है, वह इस MariaDB संसà¥à¤•रण में उपलबà¥à¤§ नहीं है" hun "A(z) '%-.192s' tabla olyan bovitest hasznal, amely nem letezik ebben a MariaDB versioban" ita "La tabella '%-.192s' usa un'estensione che non esiste in questa versione di MariaDB" jpn "表 '%-.192s' ã¯ã€ã“ã®MySQLãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã¯ç„¡ã„機能を使用ã—ã¦ã„ã¾ã™ã€‚" @@ -2580,6 +2682,7 @@ ER_TABLE_MUST_HAVE_COLUMNS 42000 fre "Une table doit comporter au moins une colonne" ger "Eine Tabelle muss mindestens eine Spalte besitzen" greek "Ενας πίνακας Ï€Ïέπει να έχει τουλάχιστον ένα πεδίο" + hindi "à¤à¤• टेबल में कम से कम à¤à¤• कॉलम होना चाहिà¤" hun "A tablanak legalabb egy oszlopot tartalmazni kell" ita "Una tabella deve avere almeno 1 colonna" jpn "表ã«ã¯æœ€ä½Žã§ã‚‚1個ã®åˆ—ãŒå¿…è¦ã§ã™ã€‚" @@ -2601,6 +2704,7 @@ ER_RECORD_FILE_FULL fre "La table '%-.192s' est pleine" ger "Tabelle '%-.192s' ist voll" greek "Ο πίνακας '%-.192s' είναι γεμάτος" + hindi "टेबल '%-.192s' पूरा भरा है" hun "A '%-.192s' tabla megtelt" ita "La tabella '%-.192s' e` piena" jpn "表 '%-.192s' ã¯æº€æ¯ã§ã™ã€‚" @@ -2622,6 +2726,7 @@ ER_UNKNOWN_CHARACTER_SET 42000 fre "Jeu de caractères inconnu: '%-.64s'" ger "Unbekannter Zeichensatz: '%-.64s'" greek "Αγνωστο character set: '%-.64s'" + hindi "अजà¥à¤žà¤¾à¤¤ CHARACTER SET: '%-.64s'" hun "Ervenytelen karakterkeszlet: '%-.64s'" ita "Set di caratteri '%-.64s' sconosciuto" jpn "䏿˜Žãªæ–‡å­—コードセット: '%-.64s'" @@ -2643,6 +2748,7 @@ ER_TOO_MANY_TABLES fre "Trop de tables. MariaDB ne peut utiliser que %d tables dans un JOIN" ger "Zu viele Tabellen. MariaDB kann in einem Join maximal %d Tabellen verwenden" greek "Î Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î¿Ï‚ αÏιθμός πινάκων. Η MariaDB μποÏεί να χÏησιμοποιήσει %d πίνακες σε διαδικασία join" + hindi "बहà¥à¤¤ अधिक टेबलà¥à¤¸, MariaDB à¤à¤• JOIN में केवल %d टेबलà¥à¤¸ का उपयोग कर सकता है" hun "Tul sok tabla. A MariaDB csak %d tablat tud kezelni osszefuzeskor" ita "Troppe tabelle. MariaDB puo` usare solo %d tabelle in una join" jpn "表ãŒå¤šã™ãŽã¾ã™ã€‚MySQLãŒJOINã§ãる表㯠%d 個ã¾ã§ã§ã™ã€‚" @@ -2664,6 +2770,7 @@ ER_TOO_MANY_FIELDS fre "Trop de champs" ger "Zu viele Felder" greek "Î Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î¿Ï‚ αÏιθμός πεδίων" + hindi "बहà¥à¤¤ अधिक कॉलमà¥à¤¸" hun "Tul sok mezo" ita "Troppi campi" jpn "列ãŒå¤šã™ãŽã¾ã™ã€‚" @@ -2749,6 +2856,7 @@ ER_CANT_FIND_UDF fre "Imposible de charger la fonction '%-.192s'" ger "Kann Funktion '%-.192s' nicht laden" greek "Δεν είναι δυνατή η διαδικασία load για τη συνάÏτηση '%-.192s'" + hindi "फंकà¥à¤¶à¤¨ '%-.192s' लोड नहीं किया जा सका" hun "A(z) '%-.192s' fuggveny nem toltheto be" ita "Impossibile caricare la funzione '%-.192s'" jpn "関数 '%-.192s' をロードã§ãã¾ã›ã‚“。" @@ -2770,6 +2878,7 @@ ER_CANT_INITIALIZE_UDF fre "Impossible d'initialiser la fonction '%-.192s'; %-.80s" ger "Kann Funktion '%-.192s' nicht initialisieren: %-.80s" greek "Δεν είναι δυνατή η έναÏξη της συνάÏτησης '%-.192s'; %-.80s" + hindi "फंकà¥à¤¶à¤¨ '%-.192s' को पà¥à¤°à¤¾à¤°à¤‚भ नहीं किया जा सका; %-.80s" hun "A(z) '%-.192s' fuggveny nem inicializalhato; %-.80s" ita "Impossibile inizializzare la funzione '%-.192s'; %-.80s" jpn "関数 '%-.192s' ã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“。; %-.80s" @@ -2812,6 +2921,7 @@ ER_UDF_EXISTS fre "La fonction '%-.192s' existe déjà" ger "Funktion '%-.192s' existiert schon" greek "Η συνάÏτηση '%-.192s' υπάÏχει ήδη" + hindi "फंकà¥à¤¶à¤¨ '%-.192s' पहले से मौजूद है" hun "A '%-.192s' fuggveny mar letezik" ita "La funzione '%-.192s' esiste gia`" jpn "関数 '%-.192s' ã¯ã™ã§ã«å®šç¾©ã•れã¦ã„ã¾ã™ã€‚" @@ -2878,6 +2988,7 @@ ER_FUNCTION_NOT_DEFINED fre "La fonction '%-.192s' n'est pas définie" ger "Funktion '%-.192s' ist nicht definiert" greek "Η συνάÏτηση '%-.192s' δεν έχει οÏισθεί" + hindi "फंकà¥à¤¶à¤¨ '%-.192s' की परिभाषा नहीं मिली" hun "A '%-.192s' fuggveny nem definialt" ita "La funzione '%-.192s' non e` definita" jpn "関数 '%-.192s' ã¯å®šç¾©ã•れã¦ã„ã¾ã›ã‚“。" @@ -2899,6 +3010,7 @@ ER_HOST_IS_BLOCKED fre "L'hôte '%-.64s' est bloqué à cause d'un trop grand nombre d'erreur de connexion. Débloquer le par 'mysqladmin flush-hosts'" ger "Host '%-.64s' blockiert wegen zu vieler Verbindungsfehler. Aufheben der Blockierung mit 'mysqladmin flush-hosts'" greek "Ο υπολογιστής '%-.64s' έχει αποκλεισθεί λόγω πολλαπλών λαθών σÏνδεσης. ΠÏοσπαθήστε να διοÏώσετε με 'mysqladmin flush-hosts'" + hindi "होसà¥à¤Ÿ '%-.64s' को कई कनेकà¥à¤¶à¤¨ में तà¥à¤°à¥à¤Ÿà¤¿à¤¯à¥‹à¤‚ के कारण बà¥à¤²à¥‰à¤• कर दिया गया है; 'mysqladmin flush-hosts' का इसà¥à¤¤à¥‡à¤®à¤¾à¤² कर अनबà¥à¤²à¥‰à¤• करें" hun "A '%-.64s' host blokkolodott, tul sok kapcsolodasi hiba miatt. Hasznalja a 'mysqladmin flush-hosts' parancsot" ita "Sistema '%-.64s' bloccato a causa di troppi errori di connessione. Per sbloccarlo: 'mysqladmin flush-hosts'" jpn "接続エラーãŒå¤šã„ãŸã‚ã€ãƒ›ã‚¹ãƒˆ '%-.64s' ã¯æ‹’å¦ã•れã¾ã—ãŸã€‚'mysqladmin flush-hosts' ã§è§£é™¤ã§ãã¾ã™ã€‚" @@ -2919,6 +3031,7 @@ ER_HOST_NOT_PRIVILEGED fre "Le hôte '%-.64s' n'est pas authorisé à se connecter à ce serveur MariaDB" ger "Host '%-.64s' hat keine Berechtigung, sich mit diesem MariaDB-Server zu verbinden" greek "Ο υπολογιστής '%-.64s' δεν έχει δικαίωμα σÏνδεσης με τον MariaDB server" + hindi "होसà¥à¤Ÿ '%-.64s' को इस MariaDB सरà¥à¤µà¤° से कनेकà¥à¤Ÿ करने के लिठअनà¥à¤®à¤¤à¤¿ नहीं है" hun "A '%-.64s' host szamara nem engedelyezett a kapcsolodas ehhez a MariaDB szerverhez" ita "Al sistema '%-.64s' non e` consentita la connessione a questo server MariaDB" jpn "ホスト '%-.64s' ã‹ã‚‰ã®ã“ã® MySQL server ã¸ã®æŽ¥ç¶šã¯è¨±å¯ã•れã¦ã„ã¾ã›ã‚“。" @@ -2939,6 +3052,7 @@ ER_PASSWORD_ANONYMOUS_USER 42000 fre "Vous utilisez un utilisateur anonyme et les utilisateurs anonymes ne sont pas autorisés à changer les mots de passe" ger "Sie benutzen MariaDB als anonymer Benutzer und dürfen daher keine Passwörter ändern" greek "ΧÏησιμοποιείτε την MariaDB σαν anonymous user και έτσι δεν μποÏείτε να αλλάξετε τα passwords άλλων χÏηστών" + hindi "आप MariaDB का उपयोग à¤à¤• बेनाम यूज़र की तरह कर रहे हैं; बेनाम यूज़रà¥à¤¸ को 'यूज़र सेटिंगà¥à¤¸' बदलने की अनà¥à¤®à¤¤à¤¿ नहीं है" hun "Nevtelen (anonymous) felhasznalokent nem negedelyezett a jelszovaltoztatas" ita "Impossibile cambiare la password usando MariaDB come utente anonimo" jpn "MySQL を匿åユーザーã§ä½¿ç”¨ã—ã¦ã„ã‚‹ã®ã§ã€ãƒ‘スワードã®å¤‰æ›´ã¯ã§ãã¾ã›ã‚“。" @@ -2979,6 +3093,7 @@ ER_PASSWORD_NO_MATCH 28000 fre "Impossible de trouver un enregistrement correspondant dans la table user" ger "Kann keinen passenden Datensatz in Tabelle 'user' finden" greek "Δεν είναι δυνατή η ανεÏÏεση της αντίστοιχης εγγÏαφής στον πίνακα των χÏηστών" + hindi "यूज़र टेबल में रिकॉरà¥à¤¡ नहीं मिला" hun "Nincs megegyezo sor a user tablaban" ita "Impossibile trovare la riga corrispondente nella tabella user" jpn "ユーザーテーブルã«è©²å½“ã™ã‚‹ãƒ¬ã‚³ãƒ¼ãƒ‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。" @@ -3057,6 +3172,7 @@ ER_CANT_REOPEN_TABLE est "Ei suuda taasavada tabelit '%-.192s'" fre "Impossible de réouvrir la table: '%-.192s" ger "Kann Tabelle'%-.192s' nicht erneut öffnen" + hindi "टेबल '%-.192s' फिर से खोल नहीं सकते" hun "Nem lehet ujra-megnyitni a tablat: '%-.192s" ita "Impossibile riaprire la tabella: '%-.192s'" jpn "表をå†ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“。: '%-.192s'" @@ -3080,6 +3196,7 @@ ER_INVALID_USE_OF_NULL 22004 est "NULL väärtuse väärkasutus" fre "Utilisation incorrecte de la valeur NULL" ger "Unerlaubte Verwendung eines NULL-Werts" + hindi "NULL मान का अवैध उपयोग" hun "A NULL ervenytelen hasznalata" ita "Uso scorretto del valore NULL" jpn "NULL 値ã®ä½¿ç”¨æ–¹æ³•ãŒä¸é©åˆ‡ã§ã™ã€‚" @@ -3099,6 +3216,7 @@ ER_REGEXP_ERROR 42000 est "regexp tagastas vea '%-.64s'" fre "Erreur '%-.64s' provenant de regexp" ger "regexp lieferte Fehler '%-.64s'" + hindi "regexp में '%-.64s' तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ" hun "'%-.64s' hiba a regularis kifejezes hasznalata soran (regexp)" ita "Errore '%-.64s' da regexp" jpn "regexp ãŒã‚¨ãƒ©ãƒ¼ '%-.64s' ã‚’è¿”ã—ã¾ã—ãŸã€‚" @@ -3220,6 +3338,7 @@ ER_GRANT_WRONG_HOST_OR_USER 42000 est "Masina või kasutaja nimi GRANT lauses on liiga pikk" fre "L'hôte ou l'utilisateur donné en argument à GRANT est trop long" ger "Das Host- oder User-Argument für GRANT ist zu lang" + hindi "GRANT के लिठहोसà¥à¤Ÿ या यूज़र आरà¥à¤—à¥à¤®à¥‡à¤‚ट बहà¥à¤¤ लंबा है" hun "A host vagy felhasznalo argumentuma tul hosszu a GRANT parancsban" ita "L'argomento host o utente per la GRANT e` troppo lungo" jpn "GRANTコマンドã¸ã®ã€ãƒ›ã‚¹ãƒˆåやユーザーåãŒé•·ã™ãŽã¾ã™ã€‚" @@ -3239,6 +3358,7 @@ ER_NO_SUCH_TABLE 42S02 est "Tabelit '%-.192s.%-.192s' ei eksisteeri" fre "La table '%-.192s.%-.192s' n'existe pas" ger "Tabelle '%-.192s.%-.192s' existiert nicht" + hindi "टेबल '%-.192s.%-.192s' मौजूद नहीं है" hun "A '%-.192s.%-.192s' tabla nem letezik" ita "La tabella '%-.192s.%-.192s' non esiste" jpn "表 '%-.192s.%-.192s' ã¯å­˜åœ¨ã—ã¾ã›ã‚“。" @@ -3281,6 +3401,7 @@ ER_NOT_ALLOWED_COMMAND 42000 est "Antud käsk ei ole lubatud käesolevas MariaDB versioonis" fre "Cette commande n'existe pas dans cette version de MariaDB" ger "Der verwendete Befehl ist in dieser MariaDB-Version nicht zulässig" + hindi "यह कमांड इस MariaDB संसà¥à¤•रण के साथ इसà¥à¤¤à¥‡à¤®à¤¾à¤² नहीं किया जा सकता है" hun "A hasznalt parancs nem engedelyezett ebben a MariaDB verzioban" ita "Il comando utilizzato non e` supportato in questa versione di MariaDB" jpn "ã“ã®MySQLãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯åˆ©ç”¨ã§ããªã„コマンドã§ã™ã€‚" @@ -3301,6 +3422,7 @@ ER_SYNTAX_ERROR 42000 fre "Erreur de syntaxe" ger "Fehler in der SQL-Syntax. Bitte die korrekte Syntax im Handbuch nachschlagen" greek "You have an error in your SQL syntax" + hindi "आपके SQL सिंटेकà¥à¤¸ मैं गलती है; सही सिंटेकà¥à¤¸ के लिठअपने MariaDB सरà¥à¤µà¤° संसà¥à¤•रण के मैनà¥à¤¯à¥à¤…ल की सहायता लें" hun "Szintaktikai hiba" ita "Errore di sintassi nella query SQL" jpn "SQL構文エラーã§ã™ã€‚ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«å¯¾å¿œã™ã‚‹ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã‚’å‚ç…§ã—ã¦æ­£ã—ã„æ§‹æ–‡ã‚’確èªã—ã¦ãã ã•ã„。" @@ -3343,6 +3465,7 @@ ER_TOO_MANY_DELAYED_THREADS est "Liiga palju DELAYED lõimesid kasutusel" fre "Trop de tâche 'delayed' en cours" ger "Zu viele verzögerte (DELAYED) Threads in Verwendung" + hindi "बहà¥à¤¤ से DELAYED थà¥à¤°à¥‡à¤¡à¥à¤¸ उपयोग में हैं" hun "Tul sok kesletetett thread (delayed)" ita "Troppi threads ritardati in uso" jpn "'Delayed insert'スレッドãŒå¤šã™ãŽã¾ã™ã€‚" @@ -3385,6 +3508,7 @@ ER_NET_PACKET_TOO_LARGE 08S01 est "Saabus suurem pakett kui lubatud 'max_allowed_packet' muutujaga" fre "Paquet plus grand que 'max_allowed_packet' reçu" ger "Empfangenes Paket ist größer als 'max_allowed_packet' Bytes" + hindi "'max_allowed_packet' से भी बड़ा à¤à¤• पैकेट मिला" hun "A kapott csomag nagyobb, mint a maximalisan engedelyezett: 'max_allowed_packet'" ita "Ricevuto un pacchetto piu` grande di 'max_allowed_packet'" jpn "'max_allowed_packet'よりも大ããªãƒ‘ケットをå—ä¿¡ã—ã¾ã—ãŸã€‚" @@ -3404,6 +3528,7 @@ ER_NET_READ_ERROR_FROM_PIPE 08S01 est "Viga ühendustoru lugemisel" fre "Erreur de lecture reçue du pipe de connexion" ger "Lese-Fehler bei einer Verbindungs-Pipe" + hindi "कनेकà¥à¤¶à¤¨ पाइप से à¤à¤• READ तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ" hun "Olvasasi hiba a kapcsolat soran" ita "Rilevato un errore di lettura dalla pipe di connessione" jpn "接続パイプã®èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼ã§ã™ã€‚" @@ -3423,6 +3548,7 @@ ER_NET_FCNTL_ERROR 08S01 est "fcntl() tagastas vea" fre "Erreur reçue de fcntl() " ger "fcntl() lieferte einen Fehler" + hindi "fcntl() से à¤à¤• तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ" hun "Hiba a fcntl() fuggvenyben" ita "Rilevato un errore da fcntl()" jpn "fcntl()ãŒã‚¨ãƒ©ãƒ¼ã‚’è¿”ã—ã¾ã—ãŸã€‚" @@ -3442,6 +3568,7 @@ ER_NET_PACKETS_OUT_OF_ORDER 08S01 est "Paketid saabusid vales järjekorras" fre "Paquets reçus dans le désordre" ger "Pakete nicht in der richtigen Reihenfolge empfangen" + hindi "पैकेटà¥à¤¸ कà¥à¤°à¤® में नहीं पà¥à¤°à¤¾à¤ªà¥à¤¤ हà¥à¤" hun "Helytelen sorrendben erkezett adatcsomagok" ita "Ricevuti pacchetti non in ordine" jpn "䏿­£ãªé †åºã®ãƒ‘ケットをå—ä¿¡ã—ã¾ã—ãŸã€‚" @@ -3461,6 +3588,7 @@ ER_NET_UNCOMPRESS_ERROR 08S01 est "Viga andmepaketi lahtipakkimisel" fre "Impossible de décompresser le paquet reçu" ger "Kommunikationspaket lässt sich nicht entpacken" + hindi "संचार पैकेट UNCOMPRESS नहीं कर सके" hun "A kommunikacios adatcsomagok nem tomorithetok ki" ita "Impossibile scompattare i pacchetti di comunicazione" jpn "圧縮パケットã®å±•é–‹ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" @@ -3480,6 +3608,7 @@ ER_NET_READ_ERROR 08S01 est "Viga andmepaketi lugemisel" fre "Erreur de lecture des paquets reçus" ger "Fehler beim Lesen eines Kommunikationspakets" + hindi "संचार पैकेटà¥à¤¸ पढ़ते समय à¤à¤• तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ" hun "HIba a kommunikacios adatcsomagok olvasasa soran" ita "Rilevato un errore ricevendo i pacchetti di comunicazione" jpn "パケットã®å—ä¿¡ã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚" @@ -3499,6 +3628,7 @@ ER_NET_READ_INTERRUPTED 08S01 est "Kontrollaja ületamine andmepakettide lugemisel" fre "Timeout en lecture des paquets reçus" ger "Zeitüberschreitung beim Lesen eines Kommunikationspakets" + hindi "संचार पैकेटà¥à¤¸ पà¥à¤¨à¥‡ के दौरान टाइमआउट" hun "Idotullepes a kommunikacios adatcsomagok olvasasa soran" ita "Rilevato un timeout ricevendo i pacchetti di comunicazione" jpn "パケットã®å—ä¿¡ã§ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚" @@ -3518,6 +3648,7 @@ ER_NET_ERROR_ON_WRITE 08S01 est "Viga andmepaketi kirjutamisel" fre "Erreur d'écriture des paquets envoyés" ger "Fehler beim Schreiben eines Kommunikationspakets" + hindi "संचार पैकेटà¥à¤¸ लिखते समय à¤à¤• तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ" hun "Hiba a kommunikacios csomagok irasa soran" ita "Rilevato un errore inviando i pacchetti di comunicazione" jpn "パケットã®é€ä¿¡ã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚" @@ -3537,6 +3668,7 @@ ER_NET_WRITE_INTERRUPTED 08S01 est "Kontrollaja ületamine andmepakettide kirjutamisel" fre "Timeout d'écriture des paquets envoyés" ger "Zeitüberschreitung beim Schreiben eines Kommunikationspakets" + hindi "संचार पैकेटà¥à¤¸ लिखने के दौरान टाइमआउट" hun "Idotullepes a kommunikacios csomagok irasa soran" ita "Rilevato un timeout inviando i pacchetti di comunicazione" jpn "パケットã®é€ä¿¡ã§ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚" @@ -3556,6 +3688,7 @@ ER_TOO_LONG_STRING 42000 est "Tulemus on pikem kui lubatud 'max_allowed_packet' muutujaga" fre "La chaîne résultat est plus grande que 'max_allowed_packet'" ger "Ergebnis-String ist länger als 'max_allowed_packet' Bytes" + hindi "रिजलà¥à¤Ÿ सà¥à¤Ÿà¥à¤°à¤¿à¤‚ग 'max_allowed_packet' से लंबा है" hun "Ez eredmeny sztring nagyobb, mint a lehetseges maximum: 'max_allowed_packet'" ita "La stringa di risposta e` piu` lunga di 'max_allowed_packet'" jpn "çµæžœã®æ–‡å­—列㌠'max_allowed_packet' よりも大ãã„ã§ã™ã€‚" @@ -3574,6 +3707,7 @@ ER_TABLE_CANT_HANDLE_BLOB 42000 est "Valitud tabelitüüp (%s) ei toeta BLOB/TEXT tüüpi välju" fre "Ce type de table (%s) ne supporte pas les colonnes BLOB/TEXT" ger "Der verwendete Tabellentyp (%s) unterstützt keine BLOB- und TEXT-Felder" + hindi "सà¥à¤Ÿà¥‹à¤°à¥‡à¤œ इंजन %s BLOB/TEXT कॉलमà¥à¤¸ को सपोरà¥à¤Ÿ नहीं करता" hun "A hasznalt tabla tipus (%s) nem tamogatja a BLOB/TEXT mezoket" ita "Il tipo di tabella usata (%s) non supporta colonne di tipo BLOB/TEXT" por "Tipo de tabela usado (%s) não permite colunas BLOB/TEXT" @@ -3591,6 +3725,7 @@ ER_TABLE_CANT_HANDLE_AUTO_INCREMENT 42000 est "Valitud tabelitüüp (%s) ei toeta AUTO_INCREMENT tüüpi välju" fre "Ce type de table (%s) ne supporte pas les colonnes AUTO_INCREMENT" ger "Der verwendete Tabellentyp (%s) unterstützt keine AUTO_INCREMENT-Felder" + hindi "सà¥à¤Ÿà¥‹à¤°à¥‡à¤œ इंजन %s AUTO_INCREMENT कॉलमà¥à¤¸ को सपोरà¥à¤Ÿ नहीं करता" hun "A hasznalt tabla tipus (%s) nem tamogatja az AUTO_INCREMENT tipusu mezoket" ita "Il tipo di tabella usata (%s) non supporta colonne di tipo AUTO_INCREMENT" por "Tipo de tabela usado (%s) não permite colunas AUTO_INCREMENT" @@ -3632,6 +3767,7 @@ ER_WRONG_COLUMN_NAME 42000 est "Vigane tulba nimi '%-.100s'" fre "Nom de colonne '%-.100s' incorrect" ger "Falscher Spaltenname '%-.100s'" + hindi "कॉलम नाम '%-.100s' गलत है" hun "Ervenytelen mezonev: '%-.100s'" ita "Nome colonna '%-.100s' non corretto" jpn "列å '%-.100s' ã¯ä¸æ­£ã§ã™ã€‚" @@ -3645,6 +3781,7 @@ ER_WRONG_COLUMN_NAME 42000 ER_WRONG_KEY_COLUMN 42000 eng "The storage engine %s can't index column %`s" ger "Die Speicher-Engine %s kann die Spalte %`s nicht indizieren" + hindi "सà¥à¤Ÿà¥‹à¤°à¥‡à¤œ इंजन %s, कॉलम %`s को इंडेकà¥à¤¸ नहीं कर सकता" rus "Обработчик таблиц %s не может проиндекÑировать Ñтолбец %`s" ukr "Вказівник таблиц %s не може індекÑувати Ñтовбець %`s" ER_WRONG_MRG_TABLE @@ -3720,6 +3857,7 @@ ER_PRIMARY_CANT_HAVE_NULL 42000 est "Kõik PRIMARY KEY peavad olema määratletud NOT NULL piiranguga; vajadusel kasuta UNIQUE tüüpi võtit" fre "Toutes les parties d'un index PRIMARY KEY doivent être NOT NULL; Si vous avez besoin d'un NULL dans l'index, utilisez un index UNIQUE" ger "Alle Teile eines PRIMARY KEY müssen als NOT NULL definiert sein. Wenn NULL in einem Schlüssel benötigt wird, muss ein UNIQUE-Schlüssel verwendet werden" + hindi "PRIMARY KEY के सभी भागों को NOT NULL होना चाहिà¤; यदि आपको à¤à¤• KEY में NULL की जरूरत है, तो UNIQUE का उपयोग करें" hun "Az elsodleges kulcs teljes egeszeben csak NOT NULL tipusu lehet; Ha NULL mezot szeretne a kulcskent, hasznalja inkabb a UNIQUE-ot" ita "Tutte le parti di una chiave primaria devono essere dichiarate NOT NULL; se necessitano valori NULL nelle chiavi utilizzare UNIQUE" jpn "PRIMARY KEYã®åˆ—ã¯å…¨ã¦NOT NULLã§ãªã‘れã°ã„ã‘ã¾ã›ã‚“。UNIQUE索引ã§ã‚れã°NULLã‚’å«ã‚€ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚" @@ -3738,6 +3876,7 @@ ER_TOO_MANY_ROWS 42000 est "Tulemis oli rohkem kui üks kirje" fre "Le résultat contient plus d'un enregistrement" ger "Ergebnis besteht aus mehr als einer Zeile" + hindi "परिणाम à¤à¤• से अधिक पंकà¥à¤¤à¤¿ का है" hun "Az eredmeny tobb, mint egy sort tartalmaz" ita "Il risultato consiste di piu` di una riga" jpn "çµæžœãŒ2行以上ã§ã™ã€‚" @@ -3756,6 +3895,7 @@ ER_REQUIRES_PRIMARY_KEY 42000 est "Antud tabelitüüp nõuab primaarset võtit" fre "Ce type de table nécessite une clé primaire (PRIMARY KEY)" ger "Dieser Tabellentyp benötigt einen Primärschlüssel (PRIMARY KEY)" + hindi "इस पà¥à¤°à¤•ार के टेबल को à¤à¤• PRIMARY KEY की आवशà¥à¤¯à¤•ता है" hun "Az adott tablatipushoz elsodleges kulcs hasznalata kotelezo" ita "Questo tipo di tabella richiede una chiave primaria" jpn "使用ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚¨ãƒ³ã‚¸ãƒ³ã§ã¯ã€PRIMARY KEYãŒå¿…è¦ã§ã™ã€‚" @@ -3774,6 +3914,7 @@ ER_NO_RAID_COMPILED est "Antud MariaDB versioon on kompileeritud ilma RAID toeta" fre "Cette version de MariaDB n'est pas compilée avec le support RAID" ger "Diese MariaDB-Version ist nicht mit RAID-Unterstützung kompiliert" + hindi "MariaDB का यह संसà¥à¤•रण RAID सपोरà¥à¤Ÿ के साथ कॉमà¥à¤ªà¤¾à¤ˆà¤²à¥à¤¡ नहीं है" hun "Ezen leforditott MariaDB verzio nem tartalmaz RAID support-ot" ita "Questa versione di MYSQL non e` compilata con il supporto RAID" jpn "ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®MySQLã¯RAIDサãƒãƒ¼ãƒˆã‚’å«ã‚ã¦ã‚³ãƒ³ãƒ‘イルã•れã¦ã„ã¾ã›ã‚“。" @@ -3809,6 +3950,7 @@ ER_KEY_DOES_NOT_EXITS 42000 S1009 est "Võti '%-.192s' ei eksisteeri tabelis '%-.192s'" fre "L'index '%-.192s' n'existe pas sur la table '%-.192s'" ger "Schlüssel '%-.192s' existiert in der Tabelle '%-.192s' nicht" + hindi "KEY '%-.192s', टेबल '%-.192s' में मौजूद नहीं है" hun "A '%-.192s' kulcs nem letezik a '%-.192s' tablaban" ita "La chiave '%-.192s' non esiste nella tabella '%-.192s'" jpn "索引 '%-.192s' ã¯è¡¨ '%-.192s' ã«ã¯å­˜åœ¨ã—ã¾ã›ã‚“。" @@ -3826,6 +3968,7 @@ ER_CHECK_NO_SUCH_TABLE 42000 est "Ei suuda avada tabelit" fre "Impossible d'ouvrir la table" ger "Kann Tabelle nicht öffnen" + hindi "टेबल नहीं खà¥à¤² सकता है" hun "Nem tudom megnyitni a tablat" ita "Impossibile aprire la tabella" jpn "表をオープンã§ãã¾ã›ã‚“。" @@ -3844,6 +3987,7 @@ ER_CHECK_NOT_IMPLEMENTED 42000 fre "Ce type de table ne supporte pas les %s" ger "Die Speicher-Engine für diese Tabelle unterstützt kein %s" greek "The handler for the table doesn't support %s" + hindi "इस टेबल का सà¥à¤Ÿà¥‹à¤°à¥‡à¤œ इंजन '%s' को सपोरà¥à¤Ÿ नहीं करता" hun "A tabla kezeloje (handler) nem tamogatja az %s" ita "Il gestore per la tabella non supporta il %s" jpn "ã“ã®è¡¨ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚¨ãƒ³ã‚¸ãƒ³ã¯ '%s' を利用ã§ãã¾ã›ã‚“。" @@ -3884,6 +4028,7 @@ ER_ERROR_DURING_COMMIT est "Viga %M käsu COMMIT täitmisel" fre "Erreur %M lors du COMMIT" ger "Fehler %M beim COMMIT" + hindi "COMMIT के दौरान %M तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ" hun "%M hiba a COMMIT vegrehajtasa soran" ita "Rilevato l'errore %M durante il COMMIT" jpn "COMMIT中ã«ã‚¨ãƒ©ãƒ¼ %M ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚" @@ -3901,6 +4046,7 @@ ER_ERROR_DURING_ROLLBACK est "Viga %M käsu ROLLBACK täitmisel" fre "Erreur %M lors du ROLLBACK" ger "Fehler %M beim ROLLBACK" + hindi "ROLLBACK के दौरान %M तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ" hun "%M hiba a ROLLBACK vegrehajtasa soran" ita "Rilevato l'errore %M durante il ROLLBACK" jpn "ROLLBACK中ã«ã‚¨ãƒ©ãƒ¼ %M ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚" @@ -3918,6 +4064,7 @@ ER_ERROR_DURING_FLUSH_LOGS est "Viga %M käsu FLUSH_LOGS täitmisel" fre "Erreur %M lors du FLUSH_LOGS" ger "Fehler %M bei FLUSH_LOGS" + hindi "FLUSH_LOGS के दौरान %M तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ" hun "%M hiba a FLUSH_LOGS vegrehajtasa soran" ita "Rilevato l'errore %M durante il FLUSH_LOGS" jpn "FLUSH_LOGS中ã«ã‚¨ãƒ©ãƒ¼ %M ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚" @@ -3935,6 +4082,7 @@ ER_ERROR_DURING_CHECKPOINT est "Viga %M käsu CHECKPOINT täitmisel" fre "Erreur %M lors du CHECKPOINT" ger "Fehler %M bei CHECKPOINT" + hindi "CHECKPOINT के दौरान %M तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ" hun "%M hiba a CHECKPOINT vegrehajtasa soran" ita "Rilevato l'errore %M durante il CHECKPOINT" jpn "CHECKPOINT中ã«ã‚¨ãƒ©ãƒ¼ %M ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚" @@ -4071,6 +4219,7 @@ ER_UNKNOWN_SYSTEM_VARIABLE est "Tundmatu süsteemne muutuja '%-.*s'" fre "Variable système '%-.*s' inconnue" ger "Unbekannte Systemvariable '%-.*s'" + hindi "अजà¥à¤žà¤¾à¤¤ सिसà¥à¤Ÿà¤® वैरिà¤à¤¬à¤² '%-.*s'" ita "Variabile di sistema '%-.*s' sconosciuta" jpn "'%-.*s' ã¯ä¸æ˜Žãªã‚·ã‚¹ãƒ†ãƒ å¤‰æ•°ã§ã™ã€‚" por "Variável de sistema '%-.*s' desconhecida" @@ -4209,6 +4358,7 @@ ER_TOO_MANY_USER_CONNECTIONS 42000 est "Kasutajal %-.64s on juba rohkem ühendusi kui lubatud 'max_user_connections' muutujaga" fre "L'utilisateur %-.64s possède déjà plus de 'max_user_connections' connexions actives" ger "Benutzer '%-.64s' hat mehr als 'max_user_connections' aktive Verbindungen" + hindi "यूज़र %-.64s के पहले से ही 'max_user_connections' से अधिक सकà¥à¤°à¤¿à¤¯ कनेकà¥à¤¶à¤¨à¥à¤¸ हैं" ita "L'utente %-.64s ha gia' piu' di 'max_user_connections' connessioni attive" jpn "ユーザー '%-.64s' ã¯ã™ã§ã« 'max_user_connections' 以上ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªæŽ¥ç¶šã‚’è¡Œã£ã¦ã„ã¾ã™ã€‚" por "Usuário '%-.64s' já possui mais que o valor máximo de conexões (max_user_connections) ativas" @@ -4224,6 +4374,7 @@ ER_SET_CONSTANTS_ONLY est "Ainult konstantsed suurused on lubatud SET klauslis" fre "Seules les expressions constantes sont autorisées avec SET" ger "Bei diesem Befehl dürfen nur konstante Ausdrücke verwendet werden" + hindi "इस सà¥à¤Ÿà¥‡à¤Ÿà¤®à¥‡à¤‚ट में आप केवल CONSTANT EXPRESSIONS का उपयोग कर सकते हैं" ita "Si possono usare solo espressioni costanti con SET" jpn "SET処ç†ãŒå¤±æ•—ã—ã¾ã—ãŸã€‚" por "Você pode usar apenas expressões constantes com SET" @@ -4254,6 +4405,7 @@ ER_LOCK_TABLE_FULL est "Lukkude koguarv ületab lukutabeli suuruse" fre "Le nombre total de verrou dépasse la taille de la table des verrous" ger "Die Gesamtzahl der Sperren überschreitet die Größe der Sperrtabelle" + hindi "लॉकà¥à¤¸ की कà¥à¤² संखà¥à¤¯à¤¾ लॉक टेबल के साइज से अधिक है" ita "Il numero totale di lock e' maggiore della grandezza della tabella di lock" jpn "ãƒ­ãƒƒã‚¯ã®æ•°ãŒå¤šã™ãŽã¾ã™ã€‚" por "O número total de travamentos excede o tamanho da tabela de travamentos" @@ -4313,6 +4465,7 @@ ER_WRONG_ARGUMENTS est "Vigased parameetrid %s-le" fre "Mauvais arguments à %s" ger "Falsche Argumente für %s" + hindi "%s को गलत आरà¥à¤—à¥à¤¯à¥‚मेंटà¥à¤¸" ita "Argomenti errati a %s" jpn "%s ã®å¼•æ•°ãŒä¸æ­£ã§ã™" por "Argumentos errados para %s" @@ -4327,6 +4480,7 @@ ER_NO_PERMISSION_TO_CREATE_USER 42000 est "Kasutajal '%s'@'%s' ei ole lubatud luua uusi kasutajaid" fre "'%s'@'%s' n'est pas autorisé à créer de nouveaux utilisateurs" ger "'%s'@'%s' ist nicht berechtigt, neue Benutzer hinzuzufügen" + hindi "'%s'@'%s' को नठयूज़रà¥à¤¸ बनाने की अनà¥à¤®à¤¤à¤¿ नहीं है" ita "A '%s'@'%s' non e' permesso creare nuovi utenti" por "Não é permitido a '%s'@'%s' criar novos usuários" rus "'%s'@'%s' не разрешаетÑÑ Ñоздавать новых пользователей" @@ -4366,6 +4520,7 @@ ER_TABLE_CANT_HANDLE_FT est "Antud tabelitüüp (%s) ei toeta FULLTEXT indekseid" fre "Le type de table utilisé (%s) ne supporte pas les index FULLTEXT" ger "Der verwendete Tabellentyp (%s) unterstützt keine FULLTEXT-Indizes" + hindi "सà¥à¤Ÿà¥‹à¤°à¥‡à¤œ इंजन '%s' FULLTEXT इनà¥à¤¡à¥‡à¤•à¥à¤¸à¥‡à¤¸ को सपोरà¥à¤Ÿ नहीं करता" ita "La tabella usata (%s) non supporta gli indici FULLTEXT" por "O tipo de tabela utilizado (%s) não suporta índices de texto completo (fulltext indexes)" rus "ИÑпользуемый тип таблиц (%s) не поддерживает полнотекÑтовых индекÑов" @@ -4840,6 +4995,7 @@ WARN_DATA_TRUNCATED 01000 ER_WARN_USING_OTHER_HANDLER eng "Using storage engine %s for table '%s'" ger "Speicher-Engine %s wird für Tabelle '%s' benutzt" + hindi "सà¥à¤Ÿà¥‹à¤°à¥‡à¤œ इंजन %s का इसà¥à¤¤à¥‡à¤®à¤¾à¤² टेबल '%s' के लिठकिया जा रहा है" jpn "ストレージエンジン %s ãŒè¡¨ '%s' ã«åˆ©ç”¨ã•れã¦ã„ã¾ã™ã€‚" por "Usando engine de armazenamento %s para tabela '%s'" spa "Usando motor de almacenamiento %s para tabla '%s'" @@ -4967,6 +5123,7 @@ ER_WARN_HOSTNAME_WONT_WORK ER_UNKNOWN_STORAGE_ENGINE 42000 eng "Unknown storage engine '%s'" ger "Unbekannte Speicher-Engine '%s'" + hindi "अजà¥à¤žà¤¾à¤¤ सà¥à¤Ÿà¥‹à¤°à¥‡à¤œ इंजन '%s'" jpn "'%s' ã¯ä¸æ˜Žãªã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚¨ãƒ³ã‚¸ãƒ³ã§ã™ã€‚" por "Motor de tabela desconhecido '%s'" spa "Desconocido motor de tabla '%s'" @@ -5061,15 +5218,19 @@ ER_SP_NO_RECURSIVE_CREATE 2F003 ER_SP_ALREADY_EXISTS 42000 eng "%s %s already exists" ger "%s %s existiert bereits" + hindi "%s %s पहले से ही मौजूद है" ER_SP_DOES_NOT_EXIST 42000 eng "%s %s does not exist" ger "%s %s existiert nicht" + hindi "%s %s मौजूद नहीं है" ER_SP_DROP_FAILED eng "Failed to DROP %s %s" ger "DROP %s %s ist fehlgeschlagen" + hindi "%s %s को डà¥à¤°à¥‰à¤ª करने में असफल रहे" ER_SP_STORE_FAILED eng "Failed to CREATE %s %s" ger "CREATE %s %s ist fehlgeschlagen" + hindi "%s %s को बनाने में असफल रहे" ER_SP_LILABEL_MISMATCH 42000 eng "%s with no matching label: %s" ger "%s ohne passende Marke: %s" @@ -5088,9 +5249,11 @@ ER_SP_BADSELECT 0A000 ER_SP_BADRETURN 42000 eng "RETURN is only allowed in a FUNCTION" ger "RETURN ist nur innerhalb einer FUNCTION erlaubt" + hindi "RETURN को केवल FUNCTION में इसà¥à¤¤à¥‡à¤®à¤¾à¤² किया जा सकता है" ER_SP_BADSTATEMENT 0A000 eng "%s is not allowed in stored procedures" ger "%s ist in gespeicherten Prozeduren nicht erlaubt" + hindi "%s को STORED PROCEDURE में इसà¥à¤¤à¥‡à¤®à¤¾à¤² नहीं किया जा सकता है" ER_UPDATE_LOG_DEPRECATED_IGNORED 42000 eng "The update log is deprecated and replaced by the binary log; SET SQL_LOG_UPDATE has been ignored. This option will be removed in MariaDB 5.6" ger "Das Update-Log ist veraltet und wurde durch das Binär-Log ersetzt. SET SQL_LOG_UPDATE wird ignoriert. Diese Option wird in MariaDB 5.6 entfernt" @@ -5109,9 +5272,11 @@ ER_SP_COND_MISMATCH 42000 ER_SP_NORETURN 42000 eng "No RETURN found in FUNCTION %s" ger "Kein RETURN in FUNCTION %s gefunden" + hindi "FUNCTION %s में कोई RETURN है" ER_SP_NORETURNEND 2F005 eng "FUNCTION %s ended without RETURN" ger "FUNCTION %s endete ohne RETURN" + hindi "FUNCTION %s RETURN के बिना समापà¥à¤¤ हो गया" ER_SP_BAD_CURSOR_QUERY 42000 eng "Cursor statement must be a SELECT" ger "Cursor-Anweisung muss ein SELECT sein" @@ -5121,9 +5286,11 @@ ER_SP_BAD_CURSOR_SELECT 42000 ER_SP_CURSOR_MISMATCH 42000 eng "Undefined CURSOR: %s" ger "Undefinierter CURSOR: %s" + hindi "CURSOR %s अपरिभाषित है" ER_SP_CURSOR_ALREADY_OPEN 24000 eng "Cursor is already open" ger "Cursor ist schon geöffnet" + hindi "CURSOR पहले से ही खà¥à¤²à¤¾ है" ER_SP_CURSOR_NOT_OPEN 24000 eng "Cursor is not open" ger "Cursor ist nicht geöffnet" @@ -5151,6 +5318,7 @@ ER_SP_DUP_CURS 42000 ER_SP_CANT_ALTER eng "Failed to ALTER %s %s" ger "ALTER %s %s fehlgeschlagen" + hindi "%s %s को ALTER करने में असफल रहे" ER_SP_SUBSELECT_NYI 0A000 eng "Subquery value not supported" ger "Subquery-Wert wird nicht unterstützt" @@ -5259,9 +5427,11 @@ ER_SP_GOTO_IN_HNDLR ER_TRG_ALREADY_EXISTS eng "Trigger already exists" ger "Trigger existiert bereits" + hindi "TRIGGER पहले से मौजूद है" ER_TRG_DOES_NOT_EXIST eng "Trigger does not exist" ger "Trigger existiert nicht" + hindi "TRIGGER मौजूद नहीं है" ER_TRG_ON_VIEW_OR_TEMP_TABLE eng "Trigger's '%-.192s' is view or temporary table" ger "'%-.192s' des Triggers ist View oder temporäre Tabelle" @@ -5277,6 +5447,7 @@ ER_NO_DEFAULT_FOR_FIELD ER_DIVISION_BY_ZERO 22012 eng "Division by 0" ger "Division durch 0" + hindi "0 से विभाजन" ER_TRUNCATED_WRONG_VALUE_FOR_FIELD 22007 eng "Incorrect %-.32s value: '%-.128s' for column '%.192s' at row %lu" ger "Falscher %-.32s-Wert: '%-.128s' für Feld '%.192s' in Zeile %lu" @@ -5314,6 +5485,7 @@ ER_BINLOG_PURGE_PROHIBITED ER_FSEEK_FAIL eng "Failed on fseek()" ger "fseek() fehlgeschlagen" + hindi "fseek() विफल रहा" ER_BINLOG_PURGE_FATAL_ERR eng "Fatal error during log purge" ger "Schwerwiegender Fehler bei der Log-Bereinigung" @@ -5597,12 +5769,15 @@ ER_REMOVED_SPACES ER_AUTOINC_READ_FAILED eng "Failed to read auto-increment value from storage engine" ger "Lesen des Autoincrement-Werts von der Speicher-Engine fehlgeschlagen" + hindi "सà¥à¤Ÿà¥‹à¤°à¥‡à¤œ इंजन से auto-increment का मान पà¥à¤¨à¥‡ में असफल रहे" ER_USERNAME eng "user name" ger "Benutzername" + hindi "यूज़र का नाम" ER_HOSTNAME eng "host name" ger "Hostname" + hindi "होसà¥à¤Ÿ का नाम" ER_WRONG_STRING_LENGTH eng "String '%-.70s' is too long for %s (should be no longer than %d)" ger "String '%-.70s' ist zu lang für %s (sollte nicht länger sein als %d)" @@ -5823,9 +5998,11 @@ ER_FILEGROUP_OPTION_ONLY_ONCE ER_CREATE_FILEGROUP_FAILED eng "Failed to create %s" ger "Anlegen von %s fehlgeschlagen" + hindi "%s को बनाने में असफल रहे" ER_DROP_FILEGROUP_FAILED eng "Failed to drop %s" ger "Löschen von %s fehlgeschlagen" + hindi "%s को हटाने में असफल रहे" ER_TABLESPACE_AUTO_EXTEND_ERROR eng "The handler doesn't support autoextend of tablespaces" ger "Der Handler unterstützt keine automatische Erweiterung (Autoextend) von Tablespaces" @@ -5838,6 +6015,7 @@ ER_SIZE_OVERFLOW_ERROR ER_ALTER_FILEGROUP_FAILED eng "Failed to alter: %s" ger "Änderung von %s fehlgeschlagen" + hindi "%s को ALTER करने में असफल रहे" ER_BINLOG_ROW_LOGGING_FAILED eng "Writing one row to the row-based binary log failed" ger "Schreiben einer Zeilen ins zeilenbasierte Binärlog fehlgeschlagen" @@ -5859,9 +6037,11 @@ ER_EVENT_DOES_NOT_EXIST ER_EVENT_CANT_ALTER eng "Failed to alter event '%-.192s'" ger "Ändern des Events '%-.192s' fehlgeschlagen" + hindi "'%-.192s' EVENT को ALTER करने में असफल रहे" ER_EVENT_DROP_FAILED eng "Failed to drop %s" ger "Löschen von %s fehlgeschlagen" + hindi "%s को हटाने में असफल रहे" ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG eng "INTERVAL is either not positive or too big" ger "INTERVAL ist entweder nicht positiv oder zu groß" @@ -5874,6 +6054,7 @@ ER_EVENT_EXEC_TIME_IN_THE_PAST ER_EVENT_OPEN_TABLE_FAILED eng "Failed to open mysql.event" ger "Öffnen von mysql.event fehlgeschlagen" + hindi "mysql.event को खोलने में असफल रहे" ER_EVENT_NEITHER_M_EXPR_NOR_M_AT eng "No datetime expression provided" ger "Kein DATETIME-Ausdruck angegeben" @@ -5885,6 +6066,7 @@ ER_UNUSED_3 ER_EVENT_CANNOT_DELETE eng "Failed to delete the event from mysql.event" ger "Löschen des Events aus mysql.event fehlgeschlagen" + hindi "EVENT को mysql.event से हटाने मैं असफल रहे" ER_EVENT_COMPILE_ERROR eng "Error during compilation of event's body" ger "Fehler beim Kompilieren des Event-Bodys" @@ -5924,6 +6106,7 @@ ER_UNUSED_13 ER_PARTITION_NO_TEMPORARY eng "Cannot create temporary table with partitions" ger "Anlegen temporärer Tabellen mit Partitionen nicht möglich" + hindi "असà¥à¤¥à¤¾à¤ˆ टेबल को पारà¥à¤Ÿà¤¿à¤¶à¤¨à¥à¤¸ के साथ नहीं बनाया जा सकता" ER_PARTITION_CONST_DOMAIN_ERROR eng "Partition constant is out of partition function domain" ger "Partitionskonstante liegt außerhalb der Partitionsfunktionsdomäne" @@ -5935,6 +6118,7 @@ ER_PARTITION_FUNCTION_IS_NOT_ALLOWED ER_DDL_LOG_ERROR eng "Error in DDL log" ger "Fehler im DDL-Log" + hindi "DDL लॉग में तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ" ER_NULL_IN_VALUES_LESS_THAN eng "Not allowed to use NULL value in VALUES LESS THAN" ger "In VALUES LESS THAN dürfen keine NULL-Werte verwendet werden" @@ -5942,6 +6126,7 @@ ER_NULL_IN_VALUES_LESS_THAN ER_WRONG_PARTITION_NAME eng "Incorrect partition name" ger "Falscher Partitionsname" + hindi "पारà¥à¤Ÿà¥€à¤¶à¤¨ का नाम गलत है" swe "Felaktigt partitionsnamn" ER_CANT_CHANGE_TX_CHARACTERISTICS 25001 eng "Transaction characteristics can't be changed while a transaction is in progress" @@ -5980,6 +6165,7 @@ ER_ONLY_INTEGERS_ALLOWED ER_UNSUPORTED_LOG_ENGINE eng "Storage engine %s cannot be used for log tables" ger "Speicher-Engine %s kann für Logtabellen nicht verwendet werden" + hindi "सà¥à¤Ÿà¥‹à¤°à¥‡à¤œ इंजन %s को लॉग टेबलà¥à¤¸ के लिठइसà¥à¤¤à¥‡à¤®à¤¾à¤² नहीं किया जा सकता है" ER_BAD_LOG_STATEMENT eng "You cannot '%s' a log table if logging is enabled" ger "Sie können eine Logtabelle nicht '%s', wenn Loggen angeschaltet ist" @@ -6055,6 +6241,7 @@ ER_SLAVE_RELAY_LOG_WRITE_FAILURE ER_SLAVE_CREATE_EVENT_FAILURE eng "Failed to create %s" ger "Erzeugen von %s fehlgeschlagen" + hindi "%s को बनाने मैं असफल रहे" ER_SLAVE_MASTER_COM_FAILURE eng "Master command %s failed: %s" ger "Master-Befehl %s fehlgeschlagen: %s" @@ -6162,22 +6349,27 @@ ER_DATABASE_NAME eng "Database" swe "Databas" ger "Datenbank" + hindi "डेटाबेस" ER_TABLE_NAME eng "Table" swe "Tabell" ger "Tabelle" + hindi "टेबल" ER_PARTITION_NAME eng "Partition" swe "Partition" ger "Partition" + hindi "पारà¥à¤Ÿà¥€à¤¶à¤¨" ER_SUBPARTITION_NAME eng "Subpartition" swe "Subpartition" ger "Unterpartition" + hindi "सब-पारà¥à¤Ÿà¥€à¤¶à¤¨" ER_TEMPORARY_NAME eng "Temporary" swe "Temporär" ger "Temporär" + hindi "असà¥à¤¥à¤¾à¤¯à¥€" ER_RENAMED_NAME eng "Renamed" swe "Namnändrad" @@ -6299,6 +6491,7 @@ ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT eng "Cannot modify @@session.binlog_format inside a transaction" ER_PATH_LENGTH eng "The path specified for %.64s is too long" + hindi "%.64s के लिठनिरà¥à¤¦à¤¿à¤·à¥à¤Ÿ पथ बहà¥à¤¤ लंबा है" ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT eng "'%s' is deprecated and will be removed in a future release" ger "'%s' ist veraltet und wird in einer zukünftigen Version entfernt werden" @@ -6308,6 +6501,7 @@ ER_WRONG_NATIVE_TABLE_STRUCTURE ER_WRONG_PERFSCHEMA_USAGE eng "Invalid performance_schema usage" + hindi "performance_schema का अवैध उपयोग" ER_WARN_I_S_SKIPPED_TABLE eng "Table '%s'.'%s' was skipped since its definition is being modified by concurrent DDL statement" @@ -6344,6 +6538,7 @@ ER_STORED_FUNCTION_PREVENTS_SWITCH_SQL_LOG_BIN ER_FAILED_READ_FROM_PAR_FILE eng "Failed to read from the .par file" + hindi ".par फ़ाइल से पढ़ने में असफल रहे" swe "Misslyckades läsa frÃ¥n .par filen" ER_VALUES_IS_NOT_INT_TYPE_ERROR @@ -6359,6 +6554,7 @@ ER_ACCESS_DENIED_NO_PASSWORD_ERROR 28000 fre "Accès refusé pour l'utilisateur: '%s'@'%s'" ger "Benutzer '%s'@'%s' hat keine Zugriffsberechtigung" greek "Δεν επιτέÏεται η Ï€Ïόσβαση στο χÏήστη: '%s'@'%s'" + hindi "यूज़र '%s'@'%s' को अनà¥à¤®à¤¤à¤¿ नहीं है" hun "A(z) '%s'@'%s' felhasznalo szamara tiltott eleres" ita "Accesso non consentito per l'utente: '%s'@'%s'" kor "'%s'@'%s' 사용ìžëŠ” ì ‘ê·¼ì´ ê±°ë¶€ ë˜ì—ˆìŠµë‹ˆë‹¤." @@ -6935,6 +7131,7 @@ ER_ACCESS_DENIED_CHANGE_USER_ERROR 28000 ER_INNODB_READ_ONLY eng "InnoDB is in read only mode" + hindi "InnoDB केवल READ-ONLY मोड में है" ER_STOP_SLAVE_SQL_THREAD_TIMEOUT eng "STOP SLAVE command execution is incomplete: Slave SQL thread got the stop signal, thread is busy, SQL thread will stop once the current task is complete" @@ -6987,10 +7184,13 @@ ER_UNUSED_21 eng "" ER_UNSUPPORTED_ENGINE_FOR_GENERATED_COLUMNS eng "%s storage engine does not support generated columns" + hindi "सà¥à¤Ÿà¥‹à¤°à¥‡à¤œ इंजन %s COMPUTED कॉलमà¥à¤¸ को सपोरà¥à¤Ÿ नहीं करता" ER_UNKNOWN_OPTION eng "Unknown option '%-.64s'" + hindi "अजà¥à¤žà¤¾à¤¤ विकलà¥à¤ª '%-.64s'" ER_BAD_OPTION_VALUE eng "Incorrect value '%-.64s' for option '%-.64s'" + hindi "गलत मान '%-.64s' विकलà¥à¤ª '%-.64s' के लिà¤" ER_UNUSED_6 eng "You should never see it" ER_UNUSED_7 @@ -7013,14 +7213,17 @@ ER_DYN_COL_WRONG_CHARSET eng "Dynamic column contains unknown character set" ER_ILLEGAL_SUBQUERY_OPTIMIZER_SWITCHES eng "At least one of the 'in_to_exists' or 'materialization' optimizer_switch flags must be 'on'" + hindi "कम से कम 'in_to_exists' या 'materialization' optimizer_switch फà¥à¤²à¥ˆà¤— 'ON' होना चाहिà¤" ER_QUERY_CACHE_IS_DISABLED eng "Query cache is disabled (resize or similar command in progress); repeat this command later" ER_QUERY_CACHE_IS_GLOBALY_DISABLED eng "Query cache is globally disabled and you can't enable it only for this session" + hindi "कà¥à¤µà¥‡à¤°à¥€ कैश गà¥à¤²à¥‹à¤¬à¤² सà¥à¤¤à¤° पर DISABLED है और आप इसे केवल सतà¥à¤° के लिठENABLE नहीं कर सकते" ER_VIEW_ORDERBY_IGNORED eng "View '%-.192s'.'%-.192s' ORDER BY clause ignored because there is other ORDER BY clause already" ER_CONNECTION_KILLED 70100 eng "Connection was killed" + hindi "कनेकà¥à¤¶à¤¨ को समापà¥à¤¤ कर दिया गया है" ER_UNUSED_12 eng "You should never see it" ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SKIP_REPLICATION @@ -7031,6 +7234,7 @@ ER_QUERY_EXCEEDED_ROWS_EXAMINED_LIMIT eng "Query execution was interrupted. The query examined at least %llu rows, which exceeds LIMIT ROWS EXAMINED (%llu). The query result may be incomplete" ER_NO_SUCH_TABLE_IN_ENGINE 42S02 eng "Table '%-.192s.%-.192s' doesn't exist in engine" + hindi "टेबल '%-.192s.%-.192s' इंजन में मौजूद नहीं है" swe "Det finns ingen tabell som heter '%-.192s.%-.192s' i handlern" ER_TARGET_NOT_EXPLAINABLE eng "Target is not running an EXPLAINable command" @@ -7084,20 +7288,25 @@ ER_BINLOG_MUST_BE_EMPTY ER_NO_SUCH_QUERY eng "Unknown query id: %lld" ger "Unbekannte Abfrage-ID: %lld" + hindi "अजà¥à¤žà¤¾à¤¤ कà¥à¤µà¥‡à¤°à¥€ ID: %lld" rus "ÐеизвеÑтный номер запроÑа: %lld" ER_BAD_BASE64_DATA eng "Bad base64 data as position %u" ER_INVALID_ROLE OP000 eng "Invalid role specification %`s" + hindi "अमानà¥à¤¯ रोल विनिरà¥à¤¦à¥‡à¤¶ %`s" rum "Rolul %`s este invalid" ER_INVALID_CURRENT_USER 0L000 eng "The current user is invalid" + hindi "वरà¥à¤¤à¤®à¤¾à¤¨ यूज़र अमानà¥à¤¯ है" rum "Utilizatorul curent este invalid" ER_CANNOT_GRANT_ROLE eng "Cannot grant role '%s' to: %s" + hindi "रोल '%s', %s को पà¥à¤°à¤¦à¤¾à¤¨ नहीं कर सकते" rum "Rolul '%s' nu poate fi acordat catre: %s" ER_CANNOT_REVOKE_ROLE eng "Cannot revoke role '%s' from: %s" + hindi "रोल '%s', %s से हटाया नहीं जा सका" rum "Rolul '%s' nu poate fi revocat de la: %s" ER_CHANGE_SLAVE_PARALLEL_THREADS_ACTIVE eng "Cannot change @@slave_parallel_threads while another change is in progress" @@ -7105,12 +7314,15 @@ ER_PRIOR_COMMIT_FAILED eng "Commit failed due to failure of an earlier commit on which this one depends" ER_IT_IS_A_VIEW 42S02 eng "'%-.192s' is a view" + hindi "'%-.192s' à¤à¤• VIEW है" ER_SLAVE_SKIP_NOT_IN_GTID eng "When using parallel replication and GTID with multiple replication domains, @@sql_slave_skip_counter can not be used. Instead, setting @@gtid_slave_pos explicitly can be used to skip to after a given GTID position" ER_TABLE_DEFINITION_TOO_BIG eng "The definition for table %`s is too big" + hindi "टेबल %`s की परिभाषा बहà¥à¤¤ बड़ी है" ER_PLUGIN_INSTALLED eng "Plugin '%-.192s' already installed" + hindi "पà¥à¤²à¤—-इन '%-.192s' पहले से ही इनà¥à¤¸à¥à¤Ÿà¥‰à¤²à¥à¤¡ है" rus "Плагин '%-.192s' уже уÑтановлен" ER_STATEMENT_TIMEOUT 70100 eng "Query execution was interrupted (max_statement_time exceeded)" @@ -7122,22 +7334,29 @@ ER_UNUSED_17 eng "You should never see it" ER_USER_CREATE_EXISTS eng "Can't create user '%-.64s'@'%-.64s'; it already exists" + hindi "यूज़र '%-.64s'@'%-.64s' को नहीं बना सकते; यह पहले से ही मौजूद है" ER_USER_DROP_EXISTS eng "Can't drop user '%-.64s'@'%-.64s'; it doesn't exist" + hindi "यूज़र '%-.64s'@'%-.64s' को डà¥à¤°à¥‰à¤ª नहीं कर सकते; यह मौजूद नहीं है" ER_ROLE_CREATE_EXISTS eng "Can't create role '%-.64s'; it already exists" + hindi "रोल '%-.64s' को नहीं बना सकते; यह पहले से ही मौजूद है" ER_ROLE_DROP_EXISTS eng "Can't drop role '%-.64s'; it doesn't exist" + hindi "रोल '%-.64s' को डà¥à¤°à¥‰à¤ª नहीं कर सकते; यह मौजूद नहीं है" ER_CANNOT_CONVERT_CHARACTER eng "Cannot convert '%s' character 0x%-.64s to '%s'" ER_INVALID_DEFAULT_VALUE_FOR_FIELD 22007 eng "Incorrect default value '%-.128s' for column '%.192s'" + hindi "गलत डिफ़ॉलà¥à¤Ÿ मान '%-.128s' कॉलम '%.192s' के लिà¤" ER_KILL_QUERY_DENIED_ERROR eng "You are not owner of query %lu" ger "Sie sind nicht Eigentümer von Abfrage %lu" + hindi "आप कà¥à¤µà¥‡à¤°à¥€ %lu के OWNER नहीं हैं" rus "Ð’Ñ‹ не ÑвлÑетеÑÑŒ владельцем запроÑа %lu" ER_NO_EIS_FOR_FIELD eng "Engine-independent statistics are not collected for column '%s'" + hindi "Engine-independent सांखà¥à¤¯à¤¿à¤•ी कॉलम '%s' के लिठà¤à¤•तà¥à¤°à¤¿à¤¤ नहीं किया जा रहा है" ukr "Ðезалежна від типу таблиці ÑтатиÑтика не збираєтьÑÑ Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð±Ñ†Ñ '%s'" ER_WARN_AGGFUNC_DEPENDENCE eng "Aggregate function '%-.192s)' of SELECT #%d belongs to SELECT #%d" @@ -7456,18 +7675,41 @@ ER_SLAVE_SAME_ID ER_FLASHBACK_NOT_SUPPORTED eng "Flashback does not support %s %s" +# +# MyRocks error messages +# +ER_KEYS_OUT_OF_ORDER + eng "Keys are out order during bulk load" + +ER_OVERLAPPING_KEYS + eng "Bulk load rows overlap existing rows" + +ER_REQUIRE_ROW_BINLOG_FORMAT + eng "Can't execute updates on master with binlog_format != ROW." + +ER_ISOLATION_MODE_NOT_SUPPORTED + eng "MyRocks supports only READ COMMITTED and REPEATABLE READ isolation levels. Please change from current isolation level %s" + +ER_ON_DUPLICATE_DISABLED + eng "When unique checking is disabled in MyRocks, INSERT,UPDATE,LOAD statements with clauses that update or replace the key (i.e. INSERT ON DUPLICATE KEY UPDATE, REPLACE) are not allowed. Query: %s" + +ER_UPDATES_WITH_CONSISTENT_SNAPSHOT + eng "Can't execute updates when you started a transaction with START TRANSACTION WITH CONSISTENT [ROCKSDB] SNAPSHOT." + ER_ROLLBACK_ONLY - eng "This transaction was rolled back and cannot be committed. Only supported operation is to roll it back, so all pending changes will be discarded. Please restart another transaction." + eng "This transaction was rolled back and cannot be committed. Only supported operation is to roll it back, so all pending changes will be discarded. Please restart another transaction." ER_ROLLBACK_TO_SAVEPOINT - eng "MyRocks currently does not support ROLLBACK TO SAVEPOINT if modifying rows." + eng "MyRocks currently does not support ROLLBACK TO SAVEPOINT if modifying rows." -ER_KEYS_OUT_OF_ORDER - eng "Keys are out order during bulk load" -ER_OVERLAPPING_KEYS - eng "Bulk load rows overlap existing rows" ER_ISOLATION_LEVEL_WITH_CONSISTENT_SNAPSHOT - eng "Only REPEATABLE READ isolation level is supported for START TRANSACTION WITH CONSISTENT SNAPSHOT in RocksDB Storage Engine." + eng "Only REPEATABLE READ isolation level is supported for START TRANSACTION WITH CONSISTENT SNAPSHOT in RocksDB Storage Engine." + +ER_UNSUPPORTED_COLLATION + eng "Unsupported collation on string indexed column %s.%s Use binary collation (%s)." + +ER_METADATA_INCONSISTENCY + eng "Table '%s' does not exist, but metadata information exists inside MyRocks. This is a sign of data inconsistency. Please check if '%s.frm' exists, and try to restore it if it does not exist." ER_CF_DIFFERENT eng "Column family ('%s') flag (%d) is different from an existing flag (%d). Assign a new CF flag, or do not change existing CF flag." @@ -7490,29 +7732,14 @@ ER_RDB_TTL_COL_FORMAT ER_PER_INDEX_CF_DEPRECATED eng "The per-index column family option has been deprecated" - -ER_UNSUPPORTED_COLLATION - eng "Unsupported collation on string indexed column %s.%s Use binary collation (%s)." - -ER_METADATA_INCONSISTENCY - eng "Table '%s' does not exist, but metadata information exists inside MyRocks. This is a sign of data inconsistency. Please check if '%s.frm' exists, and try to restore it if it does not exist." - -ER_ISOLATION_MODE_NOT_SUPPORTED - eng "MyRocks supports only READ COMMITTED and REPEATABLE READ isolation levels. Please change from current isolation level %s" - -ER_REQUIRE_ROW_BINLOG_FORMAT - eng "Can't execute updates on master with binlog_format != ROW." - -ER_ON_DUPLICATE_DISABLED - eng "When unique checking is disabled in MyRocks, INSERT,UPDATE,LOAD statements with clauses that update or replace the key (i.e. INSERT ON DUPLICATE KEY UPDATE, REPLACE) are not allowed. Query: %s" -ER_UPDATES_WITH_CONSISTENT_SNAPSHOT - eng "Can't execute updates when you started a transaction with START TRANSACTION WITH CONSISTENT [ROCKSDB] SNAPSHOT." - ER_KEY_CREATE_DURING_ALTER eng "MyRocks failed creating new key definitions during alter." ER_SK_POPULATE_DURING_ALTER eng "MyRocks failed populating secondary key during alter." +# MyRocks messages end +ER_NET_OK_PACKET_TOO_LARGE + eng "OK packet too large" diff --git a/sql/signal_handler.cc b/sql/signal_handler.cc index efcc9a3f0b2..6e21d6249ab 100644 --- a/sql/signal_handler.cc +++ b/sql/signal_handler.cc @@ -204,6 +204,10 @@ extern "C" sig_handler handle_fatal_signal(int sig) case KILL_SLAVE_SAME_ID: kreason= "KILL_SLAVE_SAME_ID"; break; + case KILL_WAIT_TIMEOUT: + case KILL_WAIT_TIMEOUT_HARD: + kreason= "KILL_WAIT_TIMEOUT"; + break; } my_safe_printf_stderr("%s", "\n" "Trying to get some variables.\n" diff --git a/sql/slave.cc b/sql/slave.cc index 7e7144f08e7..828f74772ef 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -1,5 +1,5 @@ -/* Copyright (c) 2000, 2016, Oracle and/or its affiliates. - Copyright (c) 2009, 2016, MariaDB +/* Copyright (c) 2000, 2017, Oracle and/or its affiliates. + Copyright (c) 2009, 2017, MariaDB Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include "rpl_handler.h" @@ -60,7 +61,6 @@ #include "debug_sync.h" #include "rpl_parallel.h" - #define FLAGSTR(V,F) ((V)&(F)?#F" ":"") #define MAX_SLAVE_RETRY_PAUSE 5 @@ -481,6 +481,7 @@ int init_slave() { delete active_mi; active_mi= 0; + sql_print_error("Failed to allocate memory for the Master Info structure"); goto err; } @@ -543,7 +544,6 @@ end: DBUG_RETURN(error); err: - sql_print_error("Failed to allocate memory for the Master Info structure"); error= 1; goto end; } @@ -2468,6 +2468,7 @@ static void write_ignored_events_info_to_relay_log(THD *thd, Master_info *mi) } if (rli->ign_gtids.count()) { + DBUG_ASSERT(!rli->is_in_group()); // Ensure no active transaction glev= new Gtid_list_log_event(&rli->ign_gtids, Gtid_list_log_event::FLAG_IGN_GTIDS); rli->ign_gtids.reset(); @@ -3728,7 +3729,9 @@ int apply_event_and_update_pos_for_parallel(Log_event* ev, THD* thd, rpl_group_info *rgi) { +#ifndef DBUG_OFF Relay_log_info* rli= rgi->rli; +#endif mysql_mutex_assert_not_owner(&rli->data_lock); int reason= apply_event_and_update_pos_setup(ev, thd, rgi); /* @@ -4672,9 +4675,7 @@ err_during_init: DBUG_LEAVE; // Must match DBUG_ENTER() my_thread_end(); -#ifdef HAVE_OPENSSL ERR_remove_state(0); -#endif pthread_exit(0); return 0; // Avoid compiler warnings } @@ -5337,9 +5338,7 @@ err_during_init: DBUG_LEAVE; // Must match DBUG_ENTER() my_thread_end(); -#ifdef HAVE_OPENSSL ERR_remove_state(0); -#endif pthread_exit(0); return 0; // Avoid compiler warnings } @@ -5754,6 +5753,7 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len) bool gtid_skip_enqueue= false; bool got_gtid_event= false; rpl_gtid event_gtid; + static uint dbug_rows_event_count __attribute__((unused))= 0; bool is_compress_event = false; char* new_buf = NULL; char new_buf_arr[4096]; @@ -5825,6 +5825,26 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len) (uchar)buf[EVENT_TYPE_OFFSET] != FORMAT_DESCRIPTION_EVENT /* a way to escape */) DBUG_RETURN(queue_old_event(mi,buf,event_len)); +#ifdef ENABLED_DEBUG_SYNC + /* + A (+d,dbug.rows_events_to_delay_relay_logging)-test is supposed to + create a few Write_log_events and after receiving the 1st of them + the IO thread signals to launch the SQL thread, and sets itself to + wait for a release signal. + */ + DBUG_EXECUTE_IF("dbug.rows_events_to_delay_relay_logging", + if ((buf[EVENT_TYPE_OFFSET] == WRITE_ROWS_EVENT_V1 || + buf[EVENT_TYPE_OFFSET] == WRITE_ROWS_EVENT) && + ++dbug_rows_event_count == 2) + { + const char act[]= + "now SIGNAL start_sql_thread " + "WAIT_FOR go_on_relay_logging"; + DBUG_ASSERT(debug_sync_service); + DBUG_ASSERT(!debug_sync_set_action(current_thd, + STRING_WITH_LEN(act))); + };); +#endif mysql_mutex_lock(&mi->data_lock); switch ((uchar)buf[EVENT_TYPE_OFFSET]) { @@ -6291,9 +6311,8 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len) mi->last_queued_gtid.seq_no == 1000) goto skip_relay_logging; }); - /* Fall through to default case ... */ #endif - + /* fall through */ default: default_action: DBUG_EXECUTE_IF("kill_slave_io_after_2_events", @@ -6540,6 +6559,7 @@ void end_relay_log_info(Relay_log_info* rli) mysql_mutex_t *log_lock; DBUG_ENTER("end_relay_log_info"); + rli->error_on_rli_init_info= false; if (!rli->inited) DBUG_VOID_RETURN; if (rli->info_fd >= 0) @@ -7054,9 +7074,12 @@ static Log_event* next_event(rpl_group_info *rgi, ulonglong *event_size) DBUG_RETURN(ev); } - if (rli->ign_gtids.count()) + if (rli->ign_gtids.count() && !rli->is_in_group()) { - /* We generate and return a Gtid_list, to update gtid_slave_pos. */ + /* + We generate and return a Gtid_list, to update gtid_slave_pos, + unless being in the middle of a group. + */ DBUG_PRINT("info",("seeing ignored end gtids")); ev= new Gtid_list_log_event(&rli->ign_gtids, Gtid_list_log_event::FLAG_IGN_GTIDS); diff --git a/sql/sp.cc b/sql/sp.cc index a1662cefb9e..a31b2a2cfc5 100644 --- a/sql/sp.cc +++ b/sql/sp.cc @@ -1,6 +1,6 @@ /* - Copyright (c) 2002, 2015, Oracle and/or its affiliates. - Copyright (c) 2009, 2015, MariaDB + Copyright (c) 2002, 2016, Oracle and/or its affiliates. + Copyright (c) 2009, 2017, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -760,6 +760,7 @@ static sp_head *sp_compile(THD *thd, String *defstr, sql_mode_t sql_mode, else { sp= thd->lex->sphead; + sp->set_select_number(thd->select_number); } thd->pop_internal_handler(); diff --git a/sql/sp_head.cc b/sql/sp_head.cc index 251b829fb1d..473e1929369 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -1,6 +1,6 @@ /* Copyright (c) 2002, 2016, Oracle and/or its affiliates. - Copyright (c) 2011, 2016, MariaDB + Copyright (c) 2011, 2017, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -120,6 +120,7 @@ sp_get_item_value(THD *thd, Item *item, String *str) if (item->field_type() != MYSQL_TYPE_BIT) return item->val_str(str); else {/* Bit type is handled as binary string */} + /* fall through */ case STRING_RESULT: { String *result= item->val_str(str); @@ -578,7 +579,7 @@ sp_head::sp_head() m_flags(0), m_sp_cache_version(0), m_creation_ctx(0), - unsafe_flags(0), + unsafe_flags(0), m_select_number(1), m_recursion_level(0), m_next_cached_sp(0), m_cont_level(0) @@ -2109,8 +2110,26 @@ sp_head::execute_procedure(THD *thd, List *args) if (!err_status) { + /* + Normally the counter is not reset between parsing and first execution, + but it is possible in case of error to have parsing on one CALL and + first execution (where VIEW will be parsed and added). So we store the + counter after parsing and restore it before execution just to avoid + repeating SELECT numbers. + */ + thd->select_number= m_select_number; + err_status= execute(thd, TRUE); DBUG_PRINT("info", ("execute returned %d", (int) err_status)); + /* + This execution of the SP was aborted with an error (e.g. "Table not + found"). However it might still have consumed some numbers from the + thd->select_number counter. The next sp->exec() call must not use the + consumed numbers, so we remember the first free number (We know that + nobody will use it as this execution has stopped with an error). + */ + if (err_status) + set_select_number(thd->select_number); } if (save_log_general) diff --git a/sql/sp_head.h b/sql/sp_head.h index 9f1745f2aab..ed9fef5116f 100644 --- a/sql/sp_head.h +++ b/sql/sp_head.h @@ -229,6 +229,7 @@ private: */ uint32 unsafe_flags; + uint m_select_number; public: inline Stored_program_creation_ctx *get_creation_ctx() { @@ -517,6 +518,8 @@ public: sp_pcontext *get_parse_context() { return m_pcont; } + void set_select_number(uint num) { m_select_number= num; } + private: MEM_ROOT *m_thd_root; ///< Temp. store for thd's mem_root diff --git a/sql/sp_rcontext.cc b/sql/sp_rcontext.cc index 6e724468966..08f942b7d6d 100644 --- a/sql/sp_rcontext.cc +++ b/sql/sp_rcontext.cc @@ -331,8 +331,7 @@ bool sp_rcontext::handle_sql_condition(THD *thd, /* Reset error state. */ thd->clear_error(); - thd->killed= NOT_KILLED; // Some errors set thd->killed - // (e.g. "bad data"). + thd->reset_killed(); // Some errors set thd->killed, (e.g. "bad data"). /* Add a frame to handler-call-stack. */ Sql_condition_info *cond_info= diff --git a/sql/spatial.cc b/sql/spatial.cc index 7c9d8bb771e..8817e82d6c4 100644 --- a/sql/spatial.cc +++ b/sql/spatial.cc @@ -21,6 +21,10 @@ #include "gstream.h" // Gis_read_stream #include "sql_string.h" // String +/* This is from item_func.h. Didn't want to #include the whole file. */ +double my_double_round(double value, longlong dec, bool dec_unsigned, + bool truncate); + #ifdef HAVE_SPATIAL /* @@ -250,6 +254,8 @@ static const uchar feature_type[]= "feature"; static const int feature_type_len= 7; static const uchar feature_coll_type[]= "featurecollection"; static const int feature_coll_type_len= 17; +static const uchar bbox_keyname[]= "bbox"; +static const int bbox_keyname_len= 4; int Geometry::as_json(String *wkt, uint max_dec_digits, const char **end) @@ -258,7 +264,7 @@ int Geometry::as_json(String *wkt, uint max_dec_digits, const char **end) if (wkt->reserve(4 + type_keyname_len + 2 + len + 2 + 2 + coord_keyname_len + 4, 512)) return 1; - wkt->qs_append("{\"", 2); + wkt->qs_append("\"", 1); wkt->qs_append((const char *) type_keyname, type_keyname_len); wkt->qs_append("\": \"", 4); wkt->qs_append(get_class_info()->m_geojson_name.str, len); @@ -269,10 +275,35 @@ int Geometry::as_json(String *wkt, uint max_dec_digits, const char **end) wkt->qs_append((const char *) coord_keyname, coord_keyname_len); wkt->qs_append("\": ", 3); - if (get_data_as_json(wkt, max_dec_digits, end) || - wkt->reserve(1)) + if (get_data_as_json(wkt, max_dec_digits, end)) return 1; - wkt->qs_append('}'); + + return 0; +} + + +int Geometry::bbox_as_json(String *wkt) +{ + MBR mbr; + const char *end; + if (wkt->reserve(5 + bbox_keyname_len + (FLOATING_POINT_DECIMALS+2)*4, 512)) + return 1; + wkt->qs_append("\"", 1); + wkt->qs_append((const char *) bbox_keyname, bbox_keyname_len); + wkt->qs_append("\": [", 4); + + if (get_mbr(&mbr, &end)) + return 1; + + wkt->qs_append(mbr.xmin); + wkt->qs_append(", ", 2); + wkt->qs_append(mbr.ymin); + wkt->qs_append(", ", 2); + wkt->qs_append(mbr.xmax); + wkt->qs_append(", ", 2); + wkt->qs_append(mbr.ymax); + wkt->qs_append("]", 1); + return 0; } @@ -339,7 +370,7 @@ Geometry *Geometry::create_from_wkb(Geometry_buffer *buffer, Geometry *Geometry::create_from_json(Geometry_buffer *buffer, - json_engine_t *je, String *res) + json_engine_t *je, bool er_on_3D, String *res) { Class_info *ci= NULL; const uchar *coord_start= NULL, *geom_start= NULL, @@ -514,14 +545,14 @@ create_geom: result= (*ci->m_create_func)(buffer->data); res->q_append((char) wkb_ndr); res->q_append((uint32) result->get_class_info()->m_type_id); - if (result->init_from_json(je, res)) + if (result->init_from_json(je, er_on_3D, res)) goto err_return; return result; handle_geometry_key: json_scan_start(je, je->s.cs, geometry_start, je->s.str_end); - return create_from_json(buffer, je, res); + return create_from_json(buffer, je, er_on_3D, res); err_return: return NULL; @@ -670,6 +701,11 @@ static void append_json_point(String *txt, uint max_dec, const char *data) { double x,y; get_point(&x, &y, data); + if (max_dec < FLOATING_POINT_DECIMALS) + { + x= my_double_round(x, max_dec, FALSE, FALSE); + y= my_double_round(y, max_dec, FALSE, FALSE); + } txt->qs_append('['); txt->qs_append(x); txt->qs_append(", ", 2); @@ -780,7 +816,8 @@ uint Gis_point::init_from_wkb(const char *wkb, uint len, } -static int read_point_from_json(json_engine_t *je, double *x, double *y) +static int read_point_from_json(json_engine_t *je, bool er_on_3D, + double *x, double *y) { int n_coord= 0, err; double tmp, *d; @@ -803,14 +840,17 @@ static int read_point_from_json(json_engine_t *je, double *x, double *y) n_coord++; } - return 0; + if (n_coord <= 2 || !er_on_3D) + return 0; + je->s.error= Geometry::GEOJ_DIMENSION_NOT_SUPPORTED; + return 1; bad_coordinates: je->s.error= Geometry::GEOJ_INCORRECT_GEOJSON; return 1; } -bool Gis_point::init_from_json(json_engine_t *je, String *wkb) +bool Gis_point::init_from_json(json_engine_t *je, bool er_on_3D, String *wkb) { double x, y; if (json_read_value(je)) @@ -822,7 +862,7 @@ bool Gis_point::init_from_json(json_engine_t *je, String *wkb) return TRUE; } - if (read_point_from_json(je, &x, &y) || + if (read_point_from_json(je, er_on_3D, &x, &y) || wkb->reserve(POINT_DATA_SIZE)) return TRUE; @@ -971,7 +1011,8 @@ uint Gis_line_string::init_from_wkb(const char *wkb, uint len, } -bool Gis_line_string::init_from_json(json_engine_t *je, String *wkb) +bool Gis_line_string::init_from_json(json_engine_t *je, bool er_on_3D, + String *wkb) { uint32 n_points= 0; uint32 np_pos= wkb->length(); @@ -994,7 +1035,7 @@ bool Gis_line_string::init_from_json(json_engine_t *je, String *wkb) { DBUG_ASSERT(je->state == JST_VALUE); - if (p.init_from_json(je, wkb)) + if (p.init_from_json(je, er_on_3D, wkb)) return TRUE; n_points++; } @@ -1364,7 +1405,7 @@ uint Gis_polygon::init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, } -bool Gis_polygon::init_from_json(json_engine_t *je, String *wkb) +bool Gis_polygon::init_from_json(json_engine_t *je, bool er_on_3D, String *wkb) { uint32 n_linear_rings= 0; uint32 lr_pos= wkb->length(); @@ -1389,7 +1430,7 @@ bool Gis_polygon::init_from_json(json_engine_t *je, String *wkb) DBUG_ASSERT(je->state == JST_VALUE); uint32 ls_pos=wkb->length(); - if (ls.init_from_json(je, wkb)) + if (ls.init_from_json(je, er_on_3D, wkb)) return TRUE; ls.set_data_ptr(wkb->ptr() + ls_pos, wkb->length() - ls_pos); if (ls.is_closed(&closed) || !closed) @@ -1622,8 +1663,8 @@ int Gis_polygon::centroid_xy(double *x, double *y) const uint32 n_points, org_n_points; double prev_x, prev_y; double cur_area= 0; - double cur_cx= 0; - double cur_cy= 0; + double cur_cx= 0, cur_cy= 0; + double sum_cx= 0, sum_cy= 0; if (no_data(data, 4)) return 1; @@ -1637,17 +1678,32 @@ int Gis_polygon::centroid_xy(double *x, double *y) const while (--n_points) // One point is already read { double tmp_x, tmp_y; + double loc_area; get_point(&tmp_x, &tmp_y, data); data+= POINT_DATA_SIZE; - cur_area+= (prev_x + tmp_x) * (prev_y - tmp_y); + loc_area= prev_x * tmp_y - tmp_x * prev_y; + cur_area+= loc_area; cur_cx+= tmp_x; cur_cy+= tmp_y; + sum_cx+= (prev_x + tmp_x) * loc_area; + sum_cy+= (prev_y + tmp_y) * loc_area; + prev_x= tmp_x; prev_y= tmp_y; } - cur_area= fabs(cur_area) / 2; - cur_cx= cur_cx / (org_n_points - 1); - cur_cy= cur_cy / (org_n_points - 1); + + if (fabs(cur_area) > 1e-10) + { + cur_cx= sum_cx / cur_area / 3.0; + cur_cy= sum_cy / cur_area / 3.0; + } + else + { + cur_cx= cur_cx / (org_n_points - 1); + cur_cy= cur_cy / (org_n_points - 1); + } + + cur_area= fabs(cur_area); if (!first_loop) { @@ -1855,7 +1911,8 @@ uint Gis_multi_point::init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, } -bool Gis_multi_point::init_from_json(json_engine_t *je, String *wkb) +bool Gis_multi_point::init_from_json(json_engine_t *je, bool er_on_3D, + String *wkb) { uint32 n_points= 0; uint32 np_pos= wkb->length(); @@ -1883,7 +1940,7 @@ bool Gis_multi_point::init_from_json(json_engine_t *je, String *wkb) wkb->q_append((char) wkb_ndr); wkb->q_append((uint32) wkb_point); - if (p.init_from_json(je, wkb)) + if (p.init_from_json(je, er_on_3D, wkb)) return TRUE; n_points++; } @@ -2123,7 +2180,8 @@ uint Gis_multi_line_string::init_from_wkb(const char *wkb, uint len, } -bool Gis_multi_line_string::init_from_json(json_engine_t *je, String *wkb) +bool Gis_multi_line_string::init_from_json(json_engine_t *je, bool er_on_3D, + String *wkb) { uint32 n_line_strings= 0; uint32 ls_pos= wkb->length(); @@ -2151,7 +2209,7 @@ bool Gis_multi_line_string::init_from_json(json_engine_t *je, String *wkb) wkb->q_append((char) wkb_ndr); wkb->q_append((uint32) wkb_linestring); - if (ls.init_from_json(je, wkb)) + if (ls.init_from_json(je, er_on_3D, wkb)) return TRUE; n_line_strings++; @@ -2511,7 +2569,8 @@ uint Gis_multi_polygon::init_from_opresult(String *bin, } -bool Gis_multi_polygon::init_from_json(json_engine_t *je, String *wkb) +bool Gis_multi_polygon::init_from_json(json_engine_t *je, bool er_on_3D, + String *wkb) { uint32 n_polygons= 0; int np_pos= wkb->length(); @@ -2539,7 +2598,7 @@ bool Gis_multi_polygon::init_from_json(json_engine_t *je, String *wkb) wkb->q_append((char) wkb_ndr); wkb->q_append((uint32) wkb_polygon); - if (p.init_from_json(je, wkb)) + if (p.init_from_json(je, er_on_3D, wkb)) return TRUE; n_polygons++; @@ -2986,7 +3045,8 @@ uint Gis_geometry_collection::init_from_wkb(const char *wkb, uint len, } -bool Gis_geometry_collection::init_from_json(json_engine_t *je, String *wkb) +bool Gis_geometry_collection::init_from_json(json_engine_t *je, bool er_on_3D, + String *wkb) { uint32 n_objects= 0; uint32 no_pos= wkb->length(); @@ -3012,7 +3072,7 @@ bool Gis_geometry_collection::init_from_json(json_engine_t *je, String *wkb) DBUG_ASSERT(je->state == JST_VALUE); - if (!(g= create_from_json(&buffer, je, wkb))) + if (!(g= create_from_json(&buffer, je, er_on_3D, wkb))) return TRUE; *je= sav_je; @@ -3097,12 +3157,14 @@ bool Gis_geometry_collection::get_data_as_json(String *txt, uint max_dec_digits, if (!(geom= create_by_typeid(&buffer, wkb_type))) return 1; geom->set_data_ptr(data, (uint) (m_data_end - data)); - if (geom->as_json(txt, max_dec_digits, &data) || - txt->append(STRING_WITH_LEN(", "), 512)) + if (txt->append("{", 1) || + geom->as_json(txt, max_dec_digits, &data) || + txt->append(STRING_WITH_LEN("}, "), 512)) return 1; } txt->length(txt->length() - 2); - txt->qs_append(']'); + if (txt->append("]", 1)) + return 1; *end= data; return 0; diff --git a/sql/spatial.h b/sql/spatial.h index 3858c0d2e51..78e850dc2d7 100644 --- a/sql/spatial.h +++ b/sql/spatial.h @@ -255,6 +255,7 @@ public: GEOJ_INCORRECT_GEOJSON= 1, GEOJ_TOO_FEW_POINTS= 2, GEOJ_POLYGON_NOT_CLOSED= 3, + GEOJ_DIMENSION_NOT_SUPPORTED= 4, }; @@ -281,7 +282,8 @@ public: virtual uint init_from_opresult(String *bin, const char *opres, uint res_len) { return init_from_wkb(opres + 4, UINT_MAX32, wkb_ndr, bin) + 4; } - virtual bool init_from_json(json_engine_t *je, String *wkb) {return true;} + virtual bool init_from_json(json_engine_t *je, bool er_on_3D, String *wkb) + { return true; } virtual bool get_data_as_wkt(String *txt, const char **end) const=0; virtual bool get_data_as_json(String *txt, uint max_dec_digits, @@ -315,12 +317,13 @@ public: bool init_stream=1); static Geometry *create_from_wkb(Geometry_buffer *buffer, const char *wkb, uint32 len, String *res); - static Geometry *create_from_json(Geometry_buffer *buffer, - json_engine_t *je, String *res); + static Geometry *create_from_json(Geometry_buffer *buffer, json_engine_t *je, + bool er_on_3D, String *res); static Geometry *create_from_opresult(Geometry_buffer *g_buf, String *res, Gcalc_result_receiver &rr); int as_wkt(String *wkt, const char **end); int as_json(String *wkt, uint max_dec_digits, const char **end); + int bbox_as_json(String *wkt); inline void set_data_ptr(const char *data, uint32 data_len) { @@ -395,7 +398,7 @@ public: uint32 get_data_size() const; bool init_from_wkt(Gis_read_stream *trs, String *wkb); uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res); - bool init_from_json(json_engine_t *je, String *wkb); + bool init_from_json(json_engine_t *je, bool er_on_3D, String *wkb); bool get_data_as_wkt(String *txt, const char **end) const; bool get_data_as_json(String *txt, uint max_dec_digits, const char **end) const; @@ -450,7 +453,7 @@ public: uint32 get_data_size() const; bool init_from_wkt(Gis_read_stream *trs, String *wkb); uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res); - bool init_from_json(json_engine_t *je, String *wkb); + bool init_from_json(json_engine_t *je, bool er_on_3D, String *wkb); bool get_data_as_wkt(String *txt, const char **end) const; bool get_data_as_json(String *txt, uint max_dec_digits, const char **end) const; @@ -484,7 +487,7 @@ public: bool init_from_wkt(Gis_read_stream *trs, String *wkb); uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res); uint init_from_opresult(String *bin, const char *opres, uint res_len); - bool init_from_json(json_engine_t *je, String *wkb); + bool init_from_json(json_engine_t *je, bool er_on_3D, String *wkb); bool get_data_as_wkt(String *txt, const char **end) const; bool get_data_as_json(String *txt, uint max_dec_digits, const char **end) const; @@ -521,7 +524,7 @@ public: bool init_from_wkt(Gis_read_stream *trs, String *wkb); uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res); uint init_from_opresult(String *bin, const char *opres, uint res_len); - bool init_from_json(json_engine_t *je, String *wkb); + bool init_from_json(json_engine_t *je, bool er_on_3D, String *wkb); bool get_data_as_wkt(String *txt, const char **end) const; bool get_data_as_json(String *txt, uint max_dec_digits, const char **end) const; @@ -550,7 +553,7 @@ public: bool init_from_wkt(Gis_read_stream *trs, String *wkb); uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res); uint init_from_opresult(String *bin, const char *opres, uint res_len); - bool init_from_json(json_engine_t *je, String *wkb); + bool init_from_json(json_engine_t *je, bool er_on_3D, String *wkb); bool get_data_as_wkt(String *txt, const char **end) const; bool get_data_as_json(String *txt, uint max_dec_digits, const char **end) const; @@ -580,7 +583,7 @@ public: uint32 get_data_size() const; bool init_from_wkt(Gis_read_stream *trs, String *wkb); uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res); - bool init_from_json(json_engine_t *je, String *wkb); + bool init_from_json(json_engine_t *je, bool er_on_3D, String *wkb); bool get_data_as_wkt(String *txt, const char **end) const; bool get_data_as_json(String *txt, uint max_dec_digits, const char **end) const; @@ -612,7 +615,7 @@ public: bool init_from_wkt(Gis_read_stream *trs, String *wkb); uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res); uint init_from_opresult(String *bin, const char *opres, uint res_len); - bool init_from_json(json_engine_t *je, String *wkb); + bool init_from_json(json_engine_t *je, bool er_on_3D, String *wkb); bool get_data_as_wkt(String *txt, const char **end) const; bool get_data_as_json(String *txt, uint max_dec_digits, const char **end) const; diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 5e3311d502a..6032c7a9742 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -7594,8 +7594,11 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables, /* It is subquery in the FROM clause. VIEW set t_ref->derived after table opening, but this function always called before table opening. + + NOTE: is_derived() can't be used here because subquery in this case + the FROM clase (derived tables) can be not be marked yet. */ - if (!t_ref->referencing_view) + if (t_ref->is_anonymous_derived_table() || t_ref->schema_table) { /* If it's a temporary table created for a subquery in the FROM @@ -11684,12 +11687,6 @@ void fill_effective_table_privileges(THD *thd, GRANT_INFO *grant, /* global privileges */ grant->privilege= sctx->master_access; - if (!sctx->priv_user[0] && !sctx->priv_role[0]) - { - DBUG_PRINT("info", ("privilege 0x%lx", grant->privilege)); - DBUG_VOID_RETURN; // it is slave - } - if (!thd->db || strcmp(db, thd->db)) { /* db privileges */ @@ -12062,7 +12059,13 @@ static bool send_server_handshake_packet(MPVIO_EXT *mpvio, data_len= SCRAMBLE_LENGTH; } - end= strxnmov(end, SERVER_VERSION_LENGTH, RPL_VERSION_HACK, server_version, NullS) + 1; + /* When server version is specified in config file, don't include + the replication hack prefix. */ + if (using_custom_server_version) + end= strnmov(end, server_version, SERVER_VERSION_LENGTH) + 1; + else + end= strxnmov(end, SERVER_VERSION_LENGTH, RPL_VERSION_HACK, server_version, NullS) + 1; + int4store((uchar*) end, mpvio->auth_info.thd->thread_id); end+= 4; diff --git a/sql/sql_analyze_stmt.cc b/sql/sql_analyze_stmt.cc index cc6e0f89f75..ac3797aae60 100644 --- a/sql/sql_analyze_stmt.cc +++ b/sql/sql_analyze_stmt.cc @@ -26,7 +26,11 @@ void Filesort_tracker::print_json_members(Json_writer *writer) { const char *varied_str= "(varied across executions)"; - writer->add_member("r_loops").add_ll(get_r_loops()); + + if (!get_r_loops()) + writer->add_member("r_loops").add_null(); + else + writer->add_member("r_loops").add_ll(get_r_loops()); if (get_r_loops() && time_tracker.timed) { @@ -36,22 +40,29 @@ void Filesort_tracker::print_json_members(Json_writer *writer) if (r_limit != HA_POS_ERROR) { writer->add_member("r_limit"); - if (r_limit == 0) + if (!get_r_loops()) + writer->add_null(); + else if (r_limit == 0) writer->add_str(varied_str); else writer->add_ll((longlong) rint(r_limit/get_r_loops())); } writer->add_member("r_used_priority_queue"); - if (r_used_pq == get_r_loops()) + if (!get_r_loops()) + writer->add_null(); + else if (r_used_pq == get_r_loops()) writer->add_bool(true); else if (r_used_pq == 0) writer->add_bool(false); else writer->add_str(varied_str); - writer->add_member("r_output_rows").add_ll((longlong) rint(r_output_rows / - get_r_loops())); + if (!get_r_loops()) + writer->add_member("r_output_rows").add_null(); + else + writer->add_member("r_output_rows").add_ll((longlong) rint(r_output_rows / + get_r_loops())); if (sort_passes) { diff --git a/sql/sql_audit.cc b/sql/sql_audit.cc index 8a523ebbf4b..8134adca13f 100644 --- a/sql/sql_audit.cc +++ b/sql/sql_audit.cc @@ -240,7 +240,7 @@ void mysql_audit_finalize() /** Initialize an Audit plug-in - + @param[in] plugin @retval FALSE OK @@ -251,12 +251,13 @@ int initialize_audit_plugin(st_plugin_int *plugin) { st_mysql_audit *data= (st_mysql_audit*) plugin->plugin->info; - if (!data->event_notify || !data->class_mask[0]) { + if (!data->event_notify || !data->class_mask[0]) + { sql_print_error("Plugin '%s' has invalid data.", plugin->name.str); return 1; } - + if (plugin->plugin->init && plugin->plugin->init(NULL)) { sql_print_error("Plugin '%s' init function returned error.", @@ -266,7 +267,7 @@ int initialize_audit_plugin(st_plugin_int *plugin) /* Make the interface info more easily accessible */ plugin->data= plugin->plugin->info; - + /* Add the bits the plugin is interested in to the global mask */ mysql_mutex_lock(&LOCK_audit_mask); add_audit_mask(mysql_global_audit_mask, data->class_mask); diff --git a/sql/sql_audit.h b/sql/sql_audit.h index 5f530c676c3..f7ad8d3cd20 100644 --- a/sql/sql_audit.h +++ b/sql/sql_audit.h @@ -170,6 +170,8 @@ void mysql_audit_general(THD *thd, uint event_subtype, } else { + event.general_user= NULL; + event.general_user_length= 0; event.general_thread_id= 0; event.general_query= NULL; event.general_query_length= 0; diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 93511bb9188..5ecb897b295 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -4255,8 +4255,9 @@ handle_table(THD *thd, Query_tables_list *prelocking_ctx, else lock_type= TL_READ; - if (table_already_fk_prelocked(table_list, fk->foreign_db, - fk->foreign_table, lock_type)) + if (table_already_fk_prelocked(prelocking_ctx->query_tables, + fk->foreign_db, fk->foreign_table, + lock_type)) continue; TABLE_LIST *tl= (TABLE_LIST *) thd->alloc(sizeof(TABLE_LIST)); @@ -7067,10 +7068,13 @@ bool setup_fields(THD *thd, Ref_ptr_array ref_pointer_array, split_sum_func() must be called for Window Function items, see Item_window_func::split_sum_func. */ - if ((item->with_sum_func && item->type() != Item::SUM_FUNC_ITEM && - sum_func_list) || item->with_window_func) + if (sum_func_list && + ((item->with_sum_func && item->type() != Item::SUM_FUNC_ITEM) || + item->with_window_func)) + { item->split_sum_func(thd, ref_pointer_array, *sum_func_list, SPLIT_SUM_SELECT); + } thd->lex->current_select->select_list_tables|= item->used_tables(); thd->lex->used_tables|= item->used_tables(); thd->lex->current_select->cur_pos_in_select_list++; @@ -8331,7 +8335,7 @@ bool mysql_notify_thread_having_shared_lock(THD *thd, THD *in_use, if ((in_use->system_thread & SYSTEM_THREAD_DELAYED_INSERT) && !in_use->killed) { - in_use->killed= KILL_SYSTEM_THREAD; + in_use->set_killed(KILL_SYSTEM_THREAD); mysql_mutex_lock(&in_use->mysys_var->mutex); if (in_use->mysys_var->current_cond) { diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc index 0bf83915ba8..b43b6af96e1 100644 --- a/sql/sql_cache.cc +++ b/sql/sql_cache.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2000, 2013, Oracle and/or its affiliates. - Copyright (c) 2010, 2013, Monty Program Ab + Copyright (c) 2010, 2017, MariaDB Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -1413,6 +1413,8 @@ void Query_cache::store_query(THD *thd, TABLE_LIST *tables_used) flags.client_long_flag= MY_TEST(thd->client_capabilities & CLIENT_LONG_FLAG); flags.client_protocol_41= MY_TEST(thd->client_capabilities & CLIENT_PROTOCOL_41); + flags.client_depr_eof= MY_TEST(thd->client_capabilities & + CLIENT_DEPRECATE_EOF); /* Protocol influences result format, so statement results in the binary protocol (COM_EXECUTE) cannot be served to statements asking for results @@ -1443,12 +1445,13 @@ void Query_cache::store_query(THD *thd, TABLE_LIST *tables_used) flags.div_precision_increment= thd->variables.div_precincrement; flags.default_week_format= thd->variables.default_week_format; DBUG_PRINT("qcache", ("\ -long %d, 4.1: %d, bin_proto: %d, more results %d, pkt_nr: %d, \ +long %d, 4.1: %d, eof: %d, bin_proto: %d, more results %d, pkt_nr: %d, \ CS client: %u, CS result: %u, CS conn: %u, limit: %lu, TZ: 0x%lx, \ sql mode: 0x%llx, sort len: %lu, conncat len: %lu, div_precision: %lu, \ def_week_frmt: %lu, in_trans: %d, autocommit: %d", (int)flags.client_long_flag, (int)flags.client_protocol_41, + (int)flags.client_depr_eof, (int)flags.protocol_type, (int)flags.more_results_exists, flags.pkt_nr, @@ -1465,12 +1468,6 @@ def_week_frmt: %lu, in_trans: %d, autocommit: %d", (int)flags.in_trans, (int)flags.autocommit)); - /* - Make InnoDB to release the adaptive hash index latch before - acquiring the query cache mutex. - */ - ha_release_temporary_latches(thd); - /* A table- or a full flush operation can potentially take a long time to finish. We choose not to wait for them and skip caching statements @@ -1923,6 +1920,8 @@ Query_cache::send_result_to_client(THD *thd, char *org_sql, uint query_length) flags.client_long_flag= MY_TEST(thd->client_capabilities & CLIENT_LONG_FLAG); flags.client_protocol_41= MY_TEST(thd->client_capabilities & CLIENT_PROTOCOL_41); + flags.client_depr_eof= MY_TEST(thd->client_capabilities & + CLIENT_DEPRECATE_EOF); flags.protocol_type= (unsigned int) thd->protocol->type(); flags.more_results_exists= MY_TEST(thd->server_status & SERVER_MORE_RESULTS_EXISTS); @@ -1944,12 +1943,13 @@ Query_cache::send_result_to_client(THD *thd, char *org_sql, uint query_length) flags.default_week_format= thd->variables.default_week_format; flags.lc_time_names= thd->variables.lc_time_names; DBUG_PRINT("qcache", ("\ -long %d, 4.1: %d, bin_proto: %d, more results %d, pkt_nr: %d, \ +long %d, 4.1: %d, eof: %d, bin_proto: %d, more results %d, pkt_nr: %d, \ CS client: %u, CS result: %u, CS conn: %u, limit: %lu, TZ: 0x%lx, \ sql mode: 0x%llx, sort len: %lu, conncat len: %lu, div_precision: %lu, \ def_week_frmt: %lu, in_trans: %d, autocommit: %d", (int)flags.client_long_flag, (int)flags.client_protocol_41, + (int)flags.client_depr_eof, (int)flags.protocol_type, (int)flags.more_results_exists, flags.pkt_nr, @@ -2189,8 +2189,7 @@ lookup: response, we can't handle it anyway. */ (void) trans_commit_stmt(thd); - if (!thd->get_stmt_da()->is_set()) - thd->get_stmt_da()->disable_status(); + thd->get_stmt_da()->disable_status(); BLOCK_UNLOCK_RD(query_block); MYSQL_QUERY_CACHE_HIT(thd->query(), (ulong) thd->limit_found_rows); @@ -4644,7 +4643,7 @@ void Query_cache::wreck(uint line, const char *message) DBUG_PRINT("warning", ("%5d QUERY CACHE WRECK => DISABLED",line)); DBUG_PRINT("warning", ("==================================")); if (thd) - thd->killed= KILL_CONNECTION; + thd->set_killed(KILL_CONNECTION); cache_dump(); /* check_integrity(0); */ /* Can't call it here because of locks */ bins_dump(); diff --git a/sql/sql_cache.h b/sql/sql_cache.h index 945de307ffb..6b8bf0b2d05 100644 --- a/sql/sql_cache.h +++ b/sql/sql_cache.h @@ -545,6 +545,7 @@ struct Query_cache_query_flags { unsigned int client_long_flag:1; unsigned int client_protocol_41:1; + unsigned int client_depr_eof:1; unsigned int protocol_type:2; unsigned int more_results_exists:1; unsigned int in_trans:1; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index f8ba23298e0..82b2faf6a02 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -236,7 +236,7 @@ bool Foreign_key::validate(List &table_fields) sql_field->field_name)) {} if (!sql_field) { - my_error(ER_KEY_COLUMN_DOES_NOT_EXITS, MYF(0), column->field_name); + my_error(ER_KEY_COLUMN_DOES_NOT_EXITS, MYF(0), column->field_name.str); DBUG_RETURN(TRUE); } if (type == Key::FOREIGN_KEY && sql_field->vcol_info) @@ -536,6 +536,9 @@ char *thd_get_error_context_description(THD *thd, char *buffer, const Security_context *sctx= &thd->main_security_ctx; char header[256]; int len; + + mysql_mutex_lock(&LOCK_thread_count); + /* The pointers thd->query and thd->proc_info might change since they are being modified concurrently. This is acceptable for proc_info since its @@ -591,6 +594,7 @@ char *thd_get_error_context_description(THD *thd, char *buffer, } mysql_mutex_unlock(&thd->LOCK_thd_data); } + mysql_mutex_unlock(&LOCK_thread_count); if (str.c_ptr_safe() == buffer) return buffer; @@ -694,6 +698,7 @@ THD::THD(my_thread_id id, bool is_wsrep_applier) /* statement id */ 0), rli_fake(0), rgi_fake(0), rgi_slave(NULL), protocol_text(this), protocol_binary(this), + m_current_stage_key(0), in_sub_stmt(0), log_all_errors(0), binlog_unsafe_warning_flags(0), binlog_table_maps(0), @@ -724,6 +729,7 @@ THD::THD(my_thread_id id, bool is_wsrep_applier) debug_sync_control(0), #endif /* defined(ENABLED_DEBUG_SYNC) */ wait_for_commit_ptr(0), + m_internal_handler(0), main_da(0, false, false), m_stmt_da(&main_da), tdc_hash_pins(0), @@ -781,6 +787,7 @@ THD::THD(my_thread_id id, bool is_wsrep_applier) query_start_used= query_start_sec_part_used= 0; count_cuted_fields= CHECK_FIELD_IGNORE; killed= NOT_KILLED; + killed_err= 0; col_access=0; is_slave_error= thread_specific_used= FALSE; my_hash_clear(&handler_tables_hash); @@ -836,6 +843,7 @@ THD::THD(my_thread_id id, bool is_wsrep_applier) #endif mysql_mutex_init(key_LOCK_thd_data, &LOCK_thd_data, MY_MUTEX_INIT_FAST); mysql_mutex_init(key_LOCK_wakeup_ready, &LOCK_wakeup_ready, MY_MUTEX_INIT_FAST); + mysql_mutex_init(key_LOCK_thd_kill, &LOCK_thd_kill, MY_MUTEX_INIT_FAST); mysql_cond_init(key_COND_wakeup_ready, &COND_wakeup_ready, 0); /* LOCK_thread_count goes before LOCK_thd_data - the former is called around @@ -866,6 +874,8 @@ THD::THD(my_thread_id id, bool is_wsrep_applier) wsrep_info[sizeof(wsrep_info) - 1] = '\0'; /* make sure it is 0-terminated */ wsrep_sync_wait_gtid = WSREP_GTID_UNDEFINED; wsrep_affected_rows = 0; + wsrep_replicate_GTID = false; + wsrep_skip_wsrep_GTID = false; #endif /* Call to init() below requires fully initialized Open_tables_state. */ reset_open_tables_state(this); @@ -916,7 +926,6 @@ THD::THD(my_thread_id id, bool is_wsrep_applier) MYF(MY_WME|MY_THREAD_SPECIFIC)); } - m_internal_handler= NULL; m_binlog_invoker= INVOKER_NONE; memset(&invoker_user, 0, sizeof(invoker_user)); memset(&invoker_host, 0, sizeof(invoker_host)); @@ -1252,6 +1261,8 @@ void THD::init(void) server_status= SERVER_STATUS_AUTOCOMMIT; if (variables.sql_mode & MODE_NO_BACKSLASH_ESCAPES) server_status|= SERVER_STATUS_NO_BACKSLASH_ESCAPES; + if (variables.sql_mode & MODE_ANSI_QUOTES) + server_status|= SERVER_STATUS_ANSI_QUOTES; transaction.all.modified_non_trans_table= transaction.stmt.modified_non_trans_table= FALSE; @@ -1296,6 +1307,8 @@ void THD::init(void) wsrep_TOI_pre_query_len = 0; wsrep_sync_wait_gtid = WSREP_GTID_UNDEFINED; wsrep_affected_rows = 0; + wsrep_replicate_GTID = false; + wsrep_skip_wsrep_GTID = false; #endif /* WITH_WSREP */ if (variables.sql_log_bin) @@ -1428,7 +1441,7 @@ void THD::cleanup(void) DBUG_ENTER("THD::cleanup"); DBUG_ASSERT(cleanup_done == 0); - killed= KILL_CONNECTION; + set_killed(KILL_CONNECTION); #ifdef ENABLE_WHEN_BINLOG_WILL_BE_ABLE_TO_PREPARE if (transaction.xid_state.xa_state == XA_PREPARED) { @@ -1587,6 +1600,7 @@ THD::~THD() mysql_cond_destroy(&COND_wakeup_ready); mysql_mutex_destroy(&LOCK_wakeup_ready); mysql_mutex_destroy(&LOCK_thd_data); + mysql_mutex_destroy(&LOCK_thd_kill); #ifndef DBUG_OFF dbug_sentry= THD_SENTRY_GONE; #endif @@ -1764,7 +1778,8 @@ void THD::awake(killed_state state_to_set) state_to_set= killed; /* Set the 'killed' flag of 'this', which is the target THD object. */ - killed= state_to_set; + mysql_mutex_lock(&LOCK_thd_kill); + set_killed_no_mutex(state_to_set); if (state_to_set >= KILL_CONNECTION || state_to_set == NOT_KILLED) { @@ -1850,6 +1865,7 @@ void THD::awake(killed_state state_to_set) } mysql_mutex_unlock(&mysys_var->mutex); } + mysql_mutex_unlock(&LOCK_thd_kill); DBUG_VOID_RETURN; } @@ -1867,7 +1883,7 @@ void THD::disconnect() mysql_mutex_lock(&LOCK_thd_data); - killed= KILL_CONNECTION; + set_killed(KILL_CONNECTION); #ifdef SIGNAL_WITH_VIO_CLOSE /* @@ -1903,7 +1919,7 @@ bool THD::notify_shared_lock(MDL_context_owner *ctx_in_use, DBUG_PRINT("info", ("kill delayed thread")); mysql_mutex_lock(&in_use->LOCK_thd_data); if (in_use->killed < KILL_CONNECTION) - in_use->killed= KILL_CONNECTION; + in_use->set_killed(KILL_CONNECTION); if (in_use->mysys_var) { mysql_mutex_lock(&in_use->mysys_var->mutex); @@ -1938,7 +1954,7 @@ bool THD::notify_shared_lock(MDL_context_owner *ctx_in_use, if (!thd_table->needs_reopen()) { signalled|= mysql_lock_abort_for_thread(this, thd_table); - if (this && WSREP(this) && wsrep_thd_is_BF(this, FALSE)) + if (WSREP(this) && wsrep_thd_is_BF(this, FALSE)) { WSREP_DEBUG("remove_table_from_cache: %llu", (unsigned long long) this->real_id); @@ -1956,13 +1972,21 @@ bool THD::notify_shared_lock(MDL_context_owner *ctx_in_use, /* Get error number for killed state Note that the error message can't have any parameters. + If one needs parameters, one should use THD::killed_err_msg See thd::kill_message() */ -int killed_errno(killed_state killed) +int THD::killed_errno() { DBUG_ENTER("killed_errno"); - DBUG_PRINT("enter", ("killed: %d", killed)); + DBUG_PRINT("enter", ("killed: %d killed_errno: %d", + killed, killed_err ? killed_err->no: 0)); + + /* Ensure that killed_err is not set if we are not killed */ + DBUG_ASSERT(!killed_err || killed != NOT_KILLED); + + if (killed_err) + DBUG_RETURN(killed_err->no); switch (killed) { case NOT_KILLED: @@ -1989,6 +2013,9 @@ int killed_errno(killed_state killed) DBUG_RETURN(ER_SERVER_SHUTDOWN); case KILL_SLAVE_SAME_ID: DBUG_RETURN(ER_SLAVE_SAME_ID); + case KILL_WAIT_TIMEOUT: + case KILL_WAIT_TIMEOUT_HARD: + DBUG_RETURN(ER_NET_READ_INTERRUPTED); } DBUG_RETURN(0); // Keep compiler happy } @@ -2418,7 +2445,7 @@ CHANGED_TABLE_LIST* THD::changed_table_dup(const char *key, long key_length) { my_error(EE_OUTOFMEMORY, MYF(ME_BELL+ME_FATALERROR), ALIGN_SIZE(sizeof(TABLE_LIST)) + key_length + 1); - killed= KILL_CONNECTION; + set_killed(KILL_CONNECTION); return 0; } @@ -2751,13 +2778,6 @@ int select_send::send_data(List &items) if (thd->killed == ABORT_QUERY) DBUG_RETURN(FALSE); - /* - We may be passing the control from mysqld to the client: release the - InnoDB adaptive hash S-latch to avoid thread deadlocks if it was reserved - by thd - */ - ha_release_temporary_latches(thd); - protocol->prepare_for_resend(); if (protocol->send_result_set_row(&items)) { @@ -2776,13 +2796,6 @@ int select_send::send_data(List &items) bool select_send::send_eof() { - /* - We may be passing the control from mysqld to the client: release the - InnoDB adaptive hash S-latch to avoid thread deadlocks if it was reserved - by thd - */ - ha_release_temporary_latches(thd); - /* Don't send EOF if we're in error condition (which implies we've already sent or are sending an error) @@ -4006,16 +4019,12 @@ my_bool thd_net_is_killed() void thd_increment_bytes_received(void *thd, ulong length) { - if (unlikely(!thd)) // Called from federatedx - thd= current_thd; ((THD*) thd)->status_var.bytes_received+= length; } void thd_increment_net_big_packet_count(void *thd, ulong length) { - if (unlikely(!thd)) // Called from federatedx - thd= current_thd; ((THD*) thd)->status_var.net_big_packet_count+= length; } @@ -4057,7 +4066,7 @@ void Security_context::destroy() if (external_user) { my_free(external_user); - user= NULL; + external_user= NULL; } my_free(ip); @@ -4275,6 +4284,10 @@ extern "C" enum thd_kill_levels thd_kill_level(const MYSQL_THD thd) however not more often than global.progress_report_time. If global.progress_report_time is 0, then don't send progress reports, but check every second if the value has changed + + We clear any errors that we get from sending the progress packet to + the client as we don't want to set an error without the caller knowing + about it. */ static void thd_send_progress(THD *thd) @@ -4291,8 +4304,12 @@ static void thd_send_progress(THD *thd) thd->progress.next_report_time= (report_time + seconds_to_next * 1000000000ULL); if (global_system_variables.progress_report_time && - thd->variables.progress_report_time) + thd->variables.progress_report_time && !thd->is_error()) + { net_send_progress_packet(thd); + if (thd->is_error()) + thd->clear_error(); + } } } @@ -4466,6 +4483,14 @@ TABLE *open_purge_table(THD *thd, const char *db, size_t dblen, DBUG_RETURN(error ? NULL : tl->table); } +TABLE *get_purge_table(THD *thd) +{ + /* see above, at most one table can be opened */ + DBUG_ASSERT(thd->open_tables == NULL || thd->open_tables->next == NULL); + return thd->open_tables; +} + + /** Find an open table in the list of prelocked tabled Used for foreign key actions, for example, in UPDATE t1 SET a=1; @@ -4527,26 +4552,47 @@ extern "C" const struct charset_info_st *thd_charset(MYSQL_THD thd) return(thd->charset()); } -/** - OBSOLETE : there's no way to ensure the string is null terminated. - Use thd_query_string instead() -*/ -extern "C" char **thd_query(MYSQL_THD thd) -{ - return (&thd->query_string.string.str); -} /** Get the current query string for the thread. + This function is not thread safe and can be used only by thd owner thread. + @param The MySQL internal thread pointer @return query string and length. May be non-null-terminated. */ extern "C" LEX_STRING * thd_query_string (MYSQL_THD thd) { + DBUG_ASSERT(thd == current_thd); return(&thd->query_string.string); } + +/** + Get the current query string for the thread. + + @param thd The MySQL internal thread pointer + @param buf Buffer where the query string will be copied + @param buflen Length of the buffer + + @return Length of the query + + @note This function is thread safe as the query string is + accessed under mutex protection and the string is copied + into the provided buffer. @see thd_query_string(). +*/ + +extern "C" size_t thd_query_safe(MYSQL_THD thd, char *buf, size_t buflen) +{ + mysql_mutex_lock(&thd->LOCK_thd_data); + size_t len= MY_MIN(buflen - 1, thd->query_length()); + memcpy(buf, thd->query(), len); + mysql_mutex_unlock(&thd->LOCK_thd_data); + buf[len]= '\0'; + return len; +} + + extern "C" int thd_slave_thread(const MYSQL_THD thd) { return(thd->slave_thread); @@ -4806,9 +4852,15 @@ extern "C" int thd_non_transactional_update(const MYSQL_THD thd) extern "C" int thd_binlog_format(const MYSQL_THD thd) { - if (((WSREP(thd) && wsrep_emulate_bin_log) || mysql_bin_log.is_open()) && - thd->variables.option_bits & OPTION_BIN_LOG) - return (int) thd->wsrep_binlog_format(); +#ifdef WITH_WSREP + if (WSREP(thd)) + { + /* for wsrep binlog format is meaningful also when binlogging is off */ + return (int) WSREP_BINLOG_FORMAT(thd->variables.binlog_format); + } +#endif /* WITH_WSREP */ + if (mysql_bin_log.is_open() && (thd->variables.option_bits & OPTION_BIN_LOG)) + return (int) thd->variables.binlog_format; else return BINLOG_FORMAT_UNSPEC; } @@ -5505,6 +5557,7 @@ bool xid_cache_insert(THD *thd, XID_STATE *xid_state) break; case 1: my_error(ER_XAER_DUPID, MYF(0)); + /* fall through */ default: xid_state->xid_cache_element= 0; } diff --git a/sql/sql_class.h b/sql/sql_class.h index 986cb1c4793..e1be5dc91f0 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -153,7 +153,7 @@ extern MYSQL_PLUGIN_IMPORT const char **errmesg; extern bool volatile shutdown_in_progress; extern "C" LEX_STRING * thd_query_string (MYSQL_THD thd); -extern "C" char **thd_query(MYSQL_THD thd); +extern "C" size_t thd_query_safe(MYSQL_THD thd, char *buf, size_t buflen); /** @class CSET_STRING @@ -183,7 +183,6 @@ public: CHARSET_INFO *charset() const { return cs; } friend LEX_STRING * thd_query_string (MYSQL_THD thd); - friend char **thd_query(MYSQL_THD thd); }; @@ -493,10 +492,14 @@ enum killed_state KILL_SYSTEM_THREAD_HARD= 15, KILL_SERVER= 16, KILL_SERVER_HARD= 17, + /* + Used in threadpool to signal wait timeout. + */ + KILL_WAIT_TIMEOUT= 18, + KILL_WAIT_TIMEOUT_HARD= 19 }; -extern int killed_errno(killed_state killed); #define killed_mask_hard(killed) ((killed_state) ((killed) & ~KILL_HARD_BIT)) enum killed_type @@ -537,7 +540,8 @@ typedef struct system_variables uint dynamic_variables_size; /* how many bytes are in use */ ulonglong max_heap_table_size; - ulonglong tmp_table_size; + ulonglong tmp_memory_table_size; + ulonglong tmp_disk_table_size; ulonglong long_query_time; ulonglong max_statement_time; ulonglong optimizer_switch; @@ -2056,7 +2060,7 @@ public: rpl_sql_thread_info *rpl_sql_info; } system_thread_info; - void reset_for_next_command(); + void reset_for_next_command(bool do_clear_errors= 1); /* Constant for THD::where initialization in the beginning of every query. @@ -2112,6 +2116,8 @@ public: Is locked when THD is deleted. */ mysql_mutex_t LOCK_thd_data; + /* Protect kill information */ + mysql_mutex_t LOCK_thd_kill; /* all prepared statements and cursors of this connection */ Statement_map stmt_map; @@ -2756,7 +2762,7 @@ public: void check_limit_rows_examined() { if (++accessed_rows_and_keys > lex->limit_rows_examined_cnt) - killed= ABORT_QUERY; + set_killed(ABORT_QUERY); } USER_CONN *user_connect; @@ -2857,6 +2863,16 @@ public: */ killed_state volatile killed; + /* + The following is used if one wants to have a specific error number and + text for the kill + */ + struct err_info + { + int no; + const char msg[256]; + } *killed_err; + /* See also thd_killed() */ inline bool check_killed() { @@ -3428,18 +3444,18 @@ public: @todo: To silence an error, one should use Internal_error_handler mechanism. Issuing an error that can be possibly later "cleared" is not compatible with other installed error handlers and audit plugins. - In future this function will be removed. */ - inline void clear_error() + inline void clear_error(bool clear_diagnostics= 0) { DBUG_ENTER("clear_error"); - if (get_stmt_da()->is_error()) + if (get_stmt_da()->is_error() || clear_diagnostics) get_stmt_da()->reset_diagnostics_area(); is_slave_error= 0; if (killed == KILL_BAD_DATA) - killed= NOT_KILLED; // KILL_BAD_DATA can be reset w/o a mutex + reset_killed(); DBUG_VOID_RETURN; } + #ifndef EMBEDDED_LIBRARY inline bool vio_ok() const { return net.vio != 0; } /** Return FALSE if connection to client is broken. */ @@ -3571,10 +3587,54 @@ public: state after execution of a non-prepared SQL statement. */ void end_statement(); - inline int killed_errno() const + + /* + Mark thread to be killed, with optional error number and string. + string is not released, so it has to be allocted on thd mem_root + or be a global string + + Ensure that we don't replace a kill with a lesser one. For example + if user has done 'kill_connection' we shouldn't replace it with + KILL_QUERY. + */ + inline void set_killed(killed_state killed_arg, + int killed_errno_arg= 0, + const char *killed_err_msg_arg= 0) { - return ::killed_errno(killed); + mysql_mutex_lock(&LOCK_thd_kill); + set_killed_no_mutex(killed_arg, killed_errno_arg, killed_err_msg_arg); + mysql_mutex_unlock(&LOCK_thd_kill); } + /* + This is only used by THD::awake where we need to keep the lock mutex + locked over some time. + It's ok to have this inline, as in most cases killed_errno_arg will + be a constant 0 and most of the function will disappear. + */ + inline void set_killed_no_mutex(killed_state killed_arg, + int killed_errno_arg= 0, + const char *killed_err_msg_arg= 0) + { + if (killed <= killed_arg) + { + killed= killed_arg; + if (killed_errno_arg) + { + /* + If alloc fails, we only remember the killed flag. + The worst things that can happen is that we get + a suboptimal error message. + */ + if ((killed_err= (err_info*) alloc(sizeof(*killed_err)))) + { + killed_err->no= killed_errno_arg; + ::strmake((char*) killed_err->msg, killed_err_msg_arg, + sizeof(killed_err->msg)-1); + } + } + } + } + int killed_errno(); inline void reset_killed() { /* @@ -3583,9 +3643,10 @@ public: */ if (killed != NOT_KILLED) { - mysql_mutex_lock(&LOCK_thd_data); + mysql_mutex_lock(&LOCK_thd_kill); killed= NOT_KILLED; - mysql_mutex_unlock(&LOCK_thd_data); + killed_err= 0; + mysql_mutex_unlock(&LOCK_thd_kill); } } inline void reset_kill_query() @@ -3596,11 +3657,14 @@ public: mysys_var->abort= 0; } } - inline void send_kill_message() const + inline void send_kill_message() { + mysql_mutex_lock(&LOCK_thd_kill); int err= killed_errno(); if (err) - my_message(err, ER_THD(this, err), MYF(0)); + my_message(err, killed_err ? killed_err->msg : ER_THD(this, err), + MYF(0)); + mysql_mutex_unlock(&LOCK_thd_kill); } /* return TRUE if we will abort query if we make a warning now */ inline bool really_abort_on_warning() @@ -4244,6 +4308,8 @@ public: bool wsrep_ignore_table; wsrep_gtid_t wsrep_sync_wait_gtid; ulong wsrep_affected_rows; + bool wsrep_replicate_GTID; + bool wsrep_skip_wsrep_GTID; #endif /* WITH_WSREP */ /* Handling of timeouts for commands */ @@ -4279,7 +4345,16 @@ public: { main_lex.restore_set_statement_var(); } - + /* Copy relevant `stmt` transaction flags to `all` transaction. */ + void merge_unsafe_rollback_flags() + { + if (transaction.stmt.modified_non_trans_table) + transaction.all.modified_non_trans_table= TRUE; + transaction.all.m_unsafe_rollback_flags|= + (transaction.stmt.m_unsafe_rollback_flags & + (THD_TRANS::DID_WAIT | THD_TRANS::CREATED_TEMP_TABLE | + THD_TRANS::DROPPED_TEMP_TABLE | THD_TRANS::DID_DDL)); + } /* Reset current_linfo Setting current_linfo to 0 needs to be done with LOCK_thread_count to @@ -4553,7 +4628,7 @@ public: select_result(thd_arg), suppress_my_ok(false) { DBUG_ENTER("select_result_interceptor::select_result_interceptor"); - DBUG_PRINT("enter", ("this 0x%lx", (ulong) this)); + DBUG_PRINT("enter", ("this %p", this)); DBUG_VOID_RETURN; } /* Remove gcc warning */ uint field_count(List &fields) const { return 0; } diff --git a/sql/sql_connect.cc b/sql/sql_connect.cc index 5cb4cd87296..d778f381a50 100644 --- a/sql/sql_connect.cc +++ b/sql/sql_connect.cc @@ -1196,7 +1196,7 @@ void prepare_new_connection_state(THD* thd) if (thd->is_error()) { Host_errors errors; - thd->killed= KILL_CONNECTION; + thd->set_killed(KILL_CONNECTION); thd->print_aborted_warning(0, "init_connect command failed"); sql_print_warning("%s", thd->get_stmt_da()->message()); @@ -1462,7 +1462,7 @@ THD *CONNECT::create_thd(THD *thd) res= my_net_init(&thd->net, vio, thd, MYF(MY_THREAD_SPECIFIC)); vio= 0; // Vio now handled by thd - if (res) + if (res || thd->is_error()) { if (!thd_reused) delete thd; diff --git a/sql/sql_const.h b/sql/sql_const.h index c8e60305eab..95960ac131a 100644 --- a/sql/sql_const.h +++ b/sql/sql_const.h @@ -69,6 +69,7 @@ #define RAND_TABLE_BIT (((table_map) 1) << (sizeof(table_map)*8-1)) #define PSEUDO_TABLE_BITS (PARAM_TABLE_BIT | OUTER_REF_TABLE_BIT | \ RAND_TABLE_BIT) +#define CONNECT_STRING_MAXLEN 65535 /* stored in 2 bytes in .frm */ #define MAX_FIELDS 4096 /* Limit in the .frm file */ #define MAX_PARTITIONS 8192 diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index 8f0410b4284..bc5007e0880 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -520,6 +520,8 @@ bool mysql_derived_merge_for_insert(THD *thd, LEX *lex, TABLE_LIST *derived) derived->merge_underlying_list != 0)); if (derived->merged_for_insert) DBUG_RETURN(FALSE); + if (derived->init_derived(thd, FALSE)) + DBUG_RETURN(TRUE); if (derived->is_materialized_derived()) DBUG_RETURN(mysql_derived_prepare(thd, lex, derived)); if ((thd->lex->sql_command == SQLCOM_UPDATE_MULTI || @@ -822,13 +824,14 @@ exit: table->derived_select_number= first_select->select_number; table->s->tmp_table= INTERNAL_TMP_TABLE; #ifndef NO_EMBEDDED_ACCESS_CHECKS - if (derived->referencing_view) + if (derived->is_view()) table->grant= derived->grant; else { + DBUG_ASSERT(derived->is_derived()); + DBUG_ASSERT(derived->is_anonymous_derived_table()); table->grant.privilege= SELECT_ACL; - if (derived->is_derived()) - derived->grant.privilege= SELECT_ACL; + derived->grant.privilege= SELECT_ACL; } #endif /* Add new temporary table to list of open derived tables */ @@ -1246,7 +1249,7 @@ bool pushdown_cond_for_derived(THD *thd, Item *cond, TABLE_LIST *derived) Item *cond_over_grouping_fields; sl->collect_grouping_fields(thd); sl->check_cond_extraction_for_grouping_fields(extracted_cond_copy, - &Item::exclusive_dependence_on_grouping_fields_processor); + derived); cond_over_grouping_fields= sl->build_cond_for_grouping_fields(thd, extracted_cond_copy, true); @@ -1285,7 +1288,8 @@ bool pushdown_cond_for_derived(THD *thd, Item *cond, TABLE_LIST *derived) if (!extracted_cond_copy) continue; - extracted_cond_copy->walk(&Item::cleanup_processor, 0, 0); + extracted_cond_copy->walk(&Item::cleanup_excluding_const_fields_processor, + 0, 0); sl->cond_pushed_into_having= extracted_cond_copy; } thd->lex->current_select= save_curr_select; diff --git a/sql/sql_digest.cc b/sql/sql_digest.cc index 7f6f3bbfe9b..6605d0af0a9 100644 --- a/sql/sql_digest.cc +++ b/sql/sql_digest.cc @@ -1,4 +1,5 @@ /* Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved. + Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -454,7 +455,8 @@ sql_digest_state* digest_add_token(sql_digest_state *state, } } while (found_unary); } - /* fall through, for case NULL_SYM below */ + /* for case NULL_SYM below */ + /* fall through */ case LEX_HOSTNAME: case TEXT_STRING: case NCHAR_STRING: diff --git a/sql/sql_explain.cc b/sql/sql_explain.cc index 6b5db7e923b..9b474fd5dee 100644 --- a/sql/sql_explain.cc +++ b/sql/sql_explain.cc @@ -350,10 +350,13 @@ int print_explain_row(select_result_sink *result, item_list.push_back(new (mem_root) Item_string_sys(thd, jtype_str), mem_root); - /* 'possible_keys' */ + /* 'possible_keys' + The buffer must not be deallocated before we call send_data, otherwise + we may end up reading freed memory. + */ + StringBuffer<64> possible_keys_buf; if (possible_keys && !possible_keys->is_empty()) { - StringBuffer<64> possible_keys_buf; push_string_list(thd, &item_list, *possible_keys, &possible_keys_buf); } else diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 8e5dfb4f69c..3a9bcf39555 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2016, Oracle and/or its affiliates. - Copyright (c) 2010, 2016, MariaDB + Copyright (c) 2010, 2017, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -697,9 +697,9 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list, bool using_bulk_insert= 0; uint value_count; ulong counter = 1; - ulong iteration= 0; + /* counter of iteration in bulk PS operation*/ + ulonglong iteration= 0; ulonglong id; - ulong bulk_iterations= bulk_parameters_iterations(thd); COPY_INFO info; TABLE *table= 0; List_iterator_fast its(values_list); @@ -767,7 +767,6 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list, DBUG_RETURN(TRUE); value_count= values->elements; - DBUG_ASSERT(bulk_iterations > 0); if (mysql_prepare_insert(thd, table_list, table, fields, values, update_fields, update_values, duplic, &unused_conds, FALSE)) @@ -939,6 +938,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list, } do { + DBUG_PRINT("info", ("iteration %llu", iteration)); if (iteration && bulk_parameters_set(thd)) goto abort; @@ -1059,7 +1059,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list, } its.rewind(); iteration++; - } while (iteration < bulk_iterations); + } while (bulk_parameters_iterations(thd)); values_loop_end: free_underlaid_joins(thd, &thd->lex->select_lex); @@ -1206,7 +1206,7 @@ values_loop_end: retval= thd->lex->explain->send_explain(thd); goto abort; } - if ((bulk_iterations * values_list.elements) == 1 && (!(thd->variables.option_bits & OPTION_WARNINGS) || + if ((iteration * values_list.elements) == 1 && (!(thd->variables.option_bits & OPTION_WARNINGS) || !thd->cuted_fields)) { my_ok(thd, info.copied + info.deleted + @@ -2700,7 +2700,7 @@ void kill_delayed_threads(void) { mysql_mutex_lock(&di->thd.LOCK_thd_data); if (di->thd.killed < KILL_CONNECTION) - di->thd.killed= KILL_CONNECTION; + di->thd.set_killed(KILL_CONNECTION); if (di->thd.mysys_var) { mysql_mutex_lock(&di->thd.mysys_var->mutex); @@ -2844,7 +2844,7 @@ pthread_handler_t handle_delayed_insert(void *arg) thd->set_current_time(); add_to_active_threads(thd); if (abort_loop) - thd->killed= KILL_CONNECTION; + thd->set_killed(KILL_CONNECTION); else thd->reset_killed(); @@ -2990,7 +2990,7 @@ pthread_handler_t handle_delayed_insert(void *arg) } #endif if (error == ETIMEDOUT || error == ETIME) - thd->killed= KILL_CONNECTION; + thd->set_killed(KILL_CONNECTION); } /* We can't lock di->mutex and mysys_var->mutex at the same time */ mysql_mutex_unlock(&di->mutex); @@ -3019,7 +3019,7 @@ pthread_handler_t handle_delayed_insert(void *arg) if (! (thd->lock= mysql_lock_tables(thd, &di->table, 1, 0))) { /* Fatal error */ - thd->killed= KILL_CONNECTION; + thd->set_killed(KILL_CONNECTION); } mysql_cond_broadcast(&di->cond_client); } @@ -3028,7 +3028,7 @@ pthread_handler_t handle_delayed_insert(void *arg) if (di->handle_inserts()) { /* Some fatal error */ - thd->killed= KILL_CONNECTION; + thd->set_killed(KILL_CONNECTION); } } di->status=0; @@ -3072,7 +3072,7 @@ pthread_handler_t handle_delayed_insert(void *arg) this. */ mysql_mutex_lock(&thd->LOCK_thd_data); - thd->killed= KILL_CONNECTION_HARD; // If error + thd->set_killed(KILL_CONNECTION_HARD); // If error thd->mdl_context.set_needs_thr_lock_abort(0); mysql_mutex_unlock(&thd->LOCK_thd_data); @@ -3173,7 +3173,7 @@ bool Delayed_insert::handle_inserts(void) max_rows= delayed_insert_limit; if (thd.killed || table->s->tdc->flushed) { - thd.killed= KILL_SYSTEM_THREAD; + thd.set_killed(KILL_SYSTEM_THREAD); max_rows= ULONG_MAX; // Do as much as possible } @@ -3751,9 +3751,6 @@ int select_insert::send_data(List &values) } } - // Release latches in case bulk insert takes a long time - ha_release_temporary_latches(thd); - error= write_record(thd, table, &info); table->auto_increment_field_not_null= FALSE; @@ -4422,6 +4419,15 @@ void select_create::store_values(List &values) bool select_create::send_eof() { DBUG_ENTER("select_create::send_eof"); + + /* + The routine that writes the statement in the binary log + is in select_insert::prepare_eof(). For that reason, we + mark the flag at this point. + */ + if (table->s->tmp_table) + thd->transaction.stmt.mark_created_temp_table(); + if (prepare_eof()) { abort_result_set(); diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index c52bfd0e62e..f9330bc4375 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2000, 2014, Oracle and/or its affiliates. - Copyright (c) 2009, 2016, MariaDB + Copyright (c) 2009, 2017, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -1399,12 +1399,14 @@ static int lex_one_token(YYSTYPE *yylval, THD *thd) state= MY_LEX_HEX_NUMBER; break; } + /* fall through */ case MY_LEX_IDENT_OR_BIN: if (lip->yyPeek() == '\'') { // Found b'bin-number' state= MY_LEX_BIN_NUMBER; break; } + /* fall through */ case MY_LEX_IDENT: const char *start; #if defined(USE_MB) && defined(USE_MB_IDENT) @@ -1741,6 +1743,7 @@ static int lex_one_token(YYSTYPE *yylval, THD *thd) break; } /* " used for strings */ + /* fall through */ case MY_LEX_STRING: // Incomplete text string { uint sep; @@ -2094,6 +2097,7 @@ void st_select_lex::init_query() leaf_tables_prep.empty(); leaf_tables.empty(); item_list.empty(); + min_max_opt_list.empty(); join= 0; having= prep_having= where= prep_where= 0; cond_pushed_into_where= cond_pushed_into_having= 0; @@ -2661,16 +2665,6 @@ bool st_select_lex::setup_ref_array(THD *thd, uint order_group_num) order_group_num) * 5; if (!ref_pointer_array.is_null()) { - /* - We need to take 'n_sum_items' into account when allocating the array, - and this may actually increase during the optimization phase due to - MIN/MAX rewrite in Item_in_subselect::single_value_transformer. - In the usual case we can reuse the array from the prepare phase. - If we need a bigger array, we must allocate a new one. - */ - if (ref_pointer_array.size() == n_elems) - return false; - /* We need to take 'n_sum_items' into account when allocating the array, and this may actually increase during the optimization phase due to @@ -2678,7 +2672,7 @@ bool st_select_lex::setup_ref_array(THD *thd, uint order_group_num) In the usual case we can reuse the array from the prepare phase. If we need a bigger array, we must allocate a new one. */ - if (ref_pointer_array.size() == n_elems) + if (ref_pointer_array.size() >= n_elems) return false; } Item **array= static_cast(arena->alloc(sizeof(Item*) * n_elems)); @@ -4401,10 +4395,16 @@ void st_select_lex::set_explain_type(bool on_the_fly) if (join) { bool uses_cte= false; - for (JOIN_TAB *tab= first_explain_order_tab(join); tab; - tab= next_explain_order_tab(join, tab)) + for (JOIN_TAB *tab= first_linear_tab(join, WITHOUT_BUSH_ROOTS, + WITH_CONST_TABLES); + tab; + tab= next_linear_tab(join, tab, WITHOUT_BUSH_ROOTS)) { - if (tab->table && tab->table->pos_in_table_list->with) + /* + pos_in_table_list=NULL for e.g. post-join aggregation JOIN_TABs. + */ + if (tab->table && tab->table->pos_in_table_list && + tab->table->pos_in_table_list->with) { uses_cte= true; break; @@ -5002,8 +5002,9 @@ void st_select_lex::collect_grouping_fields(THD *thd) from cond. */ -void st_select_lex::check_cond_extraction_for_grouping_fields(Item *cond, - Item_processor check_processor) +void +st_select_lex::check_cond_extraction_for_grouping_fields(Item *cond, + TABLE_LIST *derived) { cond->clear_extraction_flag(); if (cond->type() == Item::COND_ITEM) @@ -5016,7 +5017,7 @@ void st_select_lex::check_cond_extraction_for_grouping_fields(Item *cond, Item *item; while ((item=li++)) { - check_cond_extraction_for_grouping_fields(item, check_processor); + check_cond_extraction_for_grouping_fields(item, derived); if (item->get_extraction_flag() != NO_EXTRACTION_FL) { count++; @@ -5037,10 +5038,12 @@ void st_select_lex::check_cond_extraction_for_grouping_fields(Item *cond, item->clear_extraction_flag(); } } - else - cond->set_extraction_flag(cond->walk(check_processor, - 0, (uchar *) this) ? - NO_EXTRACTION_FL : FULL_EXTRACTION_FL); + else + { + int fl= cond->excl_dep_on_grouping_fields(this) ? + FULL_EXTRACTION_FL : NO_EXTRACTION_FL; + cond->set_extraction_flag(fl); + } } diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 3b45b1ad40c..a1ef42861b4 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -789,6 +789,11 @@ public: */ List *ftfunc_list; List ftfunc_list_alloc; + /* + The list of items to which MIN/MAX optimizations of opt_sum_query() + have been applied. Used to rollback those optimizations if it's needed. + */ + List min_max_opt_list; JOIN *join; /* after JOIN::prepare it is pointer to corresponding JOIN */ List top_join_list; /* join list of the top level */ List *join_list; /* list for the currently parsed join */ @@ -850,6 +855,7 @@ public: /* reserved for exists 2 in */ uint select_n_reserved; enum_parsing_place parsing_place; /* where we are parsing expression */ + enum_parsing_place context_analysis_place; /* where we are in prepare */ bool with_sum_func; /* sum function indicator */ ulong table_join_options; @@ -1133,7 +1139,7 @@ public: bool check_subqueries_with_recursive_references(); void collect_grouping_fields(THD *thd); void check_cond_extraction_for_grouping_fields(Item *cond, - Item_processor processor); + TABLE_LIST *derived); Item *build_cond_for_grouping_fields(THD *thd, Item *cond, bool no_to_clones); diff --git a/sql/sql_load.cc b/sql/sql_load.cc index 6f0e97a61c9..ea05d42673f 100644 --- a/sql/sql_load.cc +++ b/sql/sql_load.cc @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2016, Oracle and/or its affiliates. - Copyright (c) 2010, 2016, MariaDB + Copyright (c) 2010, 2017, MariaDB Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -634,7 +634,7 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list, DBUG_EXECUTE_IF("simulate_kill_bug27571", { error=1; - thd->killed= KILL_QUERY; + thd->set_killed(KILL_QUERY); };); #ifndef EMBEDDED_LIBRARY @@ -1061,7 +1061,7 @@ read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, { uint length; uchar *pos; - Item *real_item; + Item_field *real_item; if (read_info.read_field()) break; @@ -1073,16 +1073,26 @@ read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, pos=read_info.row_start; length=(uint) (read_info.row_end-pos); - real_item= item->real_item(); + real_item= item->field_for_view_update(); if ((!read_info.enclosed && (enclosed_length && length == 4 && !memcmp(pos, STRING_WITH_LEN("NULL")))) || (length == 1 && read_info.found_null)) { - if (real_item->type() == Item::FIELD_ITEM) + if (item->type() == Item::STRING_ITEM) { - Field *field= ((Item_field *)real_item)->field; + ((Item_user_var_as_out_param *)item)->set_null_value( + read_info.read_charset); + } + else if (!real_item) + { + my_error(ER_NONUPDATEABLE_COLUMN, MYF(0), item->name); + DBUG_RETURN(1); + } + else + { + Field *field= real_item->field; if (field->reset()) { my_error(ER_WARN_NULL_TO_NOTNULL, MYF(0), field->field_name, @@ -1105,23 +1115,23 @@ read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, /* Do not auto-update this field. */ field->set_has_explicit_value(); } - else if (item->type() == Item::STRING_ITEM) - { - ((Item_user_var_as_out_param *)item)->set_null_value( - read_info.read_charset); - } - else - { - my_error(ER_LOAD_DATA_INVALID_COLUMN, MYF(0), item->full_name()); - DBUG_RETURN(1); - } continue; } - if (real_item->type() == Item::FIELD_ITEM) + if (item->type() == Item::STRING_ITEM) { - Field *field= ((Item_field *)real_item)->field; + ((Item_user_var_as_out_param *)item)->set_value((char*) pos, length, + read_info.read_charset); + } + else if (!real_item) + { + my_error(ER_NONUPDATEABLE_COLUMN, MYF(0), item->name); + DBUG_RETURN(1); + } + else + { + Field *field= real_item->field; field->set_notnull(); read_info.row_end[0]=0; // Safe to change end marker if (field == table->next_number_field) @@ -1129,16 +1139,6 @@ read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, field->store((char*) pos, length, read_info.read_charset); field->set_has_explicit_value(); } - else if (item->type() == Item::STRING_ITEM) - { - ((Item_user_var_as_out_param *)item)->set_value((char*) pos, length, - read_info.read_charset); - } - else - { - my_error(ER_LOAD_DATA_INVALID_COLUMN, MYF(0), item->full_name()); - DBUG_RETURN(1); - } } if (thd->is_error()) @@ -1158,10 +1158,20 @@ read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, break; for (; item ; item= it++) { - Item *real_item= item->real_item(); - if (real_item->type() == Item::FIELD_ITEM) + Item_field *real_item= item->field_for_view_update(); + if (item->type() == Item::STRING_ITEM) { - Field *field= ((Item_field *)real_item)->field; + ((Item_user_var_as_out_param *)item)->set_null_value( + read_info.read_charset); + } + else if (!real_item) + { + my_error(ER_NONUPDATEABLE_COLUMN, MYF(0), item->name); + DBUG_RETURN(1); + } + else + { + Field *field= real_item->field; if (field->reset()) { my_error(ER_WARN_NULL_TO_NOTNULL, MYF(0),field->field_name, @@ -1183,16 +1193,6 @@ read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, ER_THD(thd, ER_WARN_TOO_FEW_RECORDS), thd->get_stmt_da()->current_row_for_warning()); } - else if (item->type() == Item::STRING_ITEM) - { - ((Item_user_var_as_out_param *)item)->set_null_value( - read_info.read_charset); - } - else - { - my_error(ER_LOAD_DATA_INVALID_COLUMN, MYF(0), item->full_name()); - DBUG_RETURN(1); - } } } @@ -1299,11 +1299,19 @@ read_xml_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, while(tag && strcmp(tag->field.c_ptr(), item->name) != 0) tag= xmlit++; + Item_field *real_item= item->field_for_view_update(); if (!tag) // found null { - if (item->type() == Item::FIELD_ITEM) + if (item->type() == Item::STRING_ITEM) + ((Item_user_var_as_out_param *) item)->set_null_value(cs); + else if (!real_item) { - Field *field= ((Item_field *) item)->field; + my_error(ER_NONUPDATEABLE_COLUMN, MYF(0), item->name); + DBUG_RETURN(1); + } + else + { + Field *field= real_item->field; field->reset(); field->set_null(); if (field == table->next_number_field) @@ -1319,12 +1327,19 @@ read_xml_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, /* Do not auto-update this field. */ field->set_has_explicit_value(); } - else - ((Item_user_var_as_out_param *) item)->set_null_value(cs); continue; } - if (item->type() == Item::FIELD_ITEM) + if (item->type() == Item::STRING_ITEM) + ((Item_user_var_as_out_param *) item)->set_value( + (char *) tag->value.ptr(), + tag->value.length(), cs); + else if (!real_item) + { + my_error(ER_NONUPDATEABLE_COLUMN, MYF(0), item->name); + DBUG_RETURN(1); + } + else { Field *field= ((Item_field *)item)->field; @@ -1334,10 +1349,6 @@ read_xml_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, field->store((char *) tag->value.ptr(), tag->value.length(), cs); field->set_has_explicit_value(); } - else - ((Item_user_var_as_out_param *) item)->set_value( - (char *) tag->value.ptr(), - tag->value.length(), cs); } if (read_info.error) @@ -1357,7 +1368,15 @@ read_xml_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, for ( ; item; item= it++) { - if (item->type() == Item::FIELD_ITEM) + Item_field *real_item= item->field_for_view_update(); + if (item->type() == Item::STRING_ITEM) + ((Item_user_var_as_out_param *)item)->set_null_value(cs); + else if (!real_item) + { + my_error(ER_NONUPDATEABLE_COLUMN, MYF(0), item->name); + DBUG_RETURN(1); + } + else { /* QQ: We probably should not throw warning for each field. @@ -1371,8 +1390,6 @@ read_xml_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, ER_THD(thd, ER_WARN_TOO_FEW_RECORDS), thd->get_stmt_da()->current_row_for_warning()); } - else - ((Item_user_var_as_out_param *)item)->set_null_value(cs); } } diff --git a/sql/sql_locale.cc b/sql/sql_locale.cc index 58443a9a977..a2efa5e072c 100644 --- a/sql/sql_locale.cc +++ b/sql/sql_locale.cc @@ -32,7 +32,7 @@ enum err_msgs_index { en_US= 0, cs_CZ, da_DK, nl_NL, et_EE, fr_FR, de_DE, el_GR, hu_HU, it_IT, ja_JP, ko_KR, no_NO, nn_NO, pl_PL, pt_PT, ro_RO, ru_RU, sr_RS, sk_SK, - es_ES, sv_SE, uk_UA + es_ES, sv_SE, uk_UA, hi_IN } ERR_MSGS_INDEX; @@ -61,6 +61,7 @@ MY_LOCALE_ERRMSGS global_errmsgs[]= {"spanish", NULL}, {"swedish", NULL}, {"ukrainian", NULL}, + {"hindi", NULL}, {NULL, NULL} }; @@ -889,7 +890,7 @@ MY_LOCALE my_locale_hi_IN '.', /* decimal point hi_IN */ ',', /* thousands_sep hi_IN */ "\x03", /* grouping hi_IN */ - &global_errmsgs[en_US] + &global_errmsgs[hi_IN] ); /***** LOCALE END hi_IN *****/ diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 590d2dfe681..efa48c6e241 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1,5 +1,5 @@ -/* Copyright (c) 2000, 2015, Oracle and/or its affiliates. - Copyright (c) 2008, 2016, MariaDB Corporation +/* Copyright (c) 2000, 2017, Oracle and/or its affiliates. + Copyright (c) 2008, 2017, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -391,7 +391,7 @@ const LEX_STRING command_name[257]={ { 0, 0 }, //247 { 0, 0 }, //248 { 0, 0 }, //249 - { 0, 0 }, //250 + { C_STRING_WITH_LEN("Bulk_execute") }, //250 { C_STRING_WITH_LEN("Slave_worker") }, //251 { C_STRING_WITH_LEN("Slave_IO") }, //252 { C_STRING_WITH_LEN("Slave_SQL") }, //253 @@ -913,6 +913,7 @@ void execute_init_command(THD *thd, LEX_STRING *init_command, */ save_vio= thd->net.vio; thd->net.vio= 0; + thd->clear_error(1); dispatch_command(COM_QUERY, thd, buf, len, FALSE, FALSE); thd->client_capabilities= save_client_capabilities; thd->net.vio= save_vio; @@ -1044,6 +1045,7 @@ static void handle_bootstrap_impl(THD *thd) if (bootstrap_error) break; + thd->reset_kill_query(); /* Ensure that killed_errmsg is released */ free_root(thd->mem_root,MYF(MY_KEEP_PREALLOC)); free_root(&thd->transaction.mem_root,MYF(MY_KEEP_PREALLOC)); thd->lex->restore_set_statement_var(); @@ -1213,12 +1215,8 @@ bool do_command(THD *thd) if(!thd->skip_wait_timeout) my_net_set_read_timeout(net, thd->variables.net_wait_timeout); - /* - XXX: this code is here only to clear possible errors of init_connect. - Consider moving to init_connect() instead. - */ - thd->clear_error(); // Clear error message - thd->get_stmt_da()->reset_diagnostics_area(); + /* Errors and diagnostics are cleared once here before query */ + thd->clear_error(1); net_new_transaction(net); @@ -1376,6 +1374,7 @@ bool do_command(THD *thd) WSREP_WARN("For retry temporally setting character set to : %s", my_charset_latin1.csname); } + thd->clear_error(); return_value= dispatch_command(command, thd, thd->wsrep_retry_query, thd->wsrep_retry_query_len, FALSE, FALSE); thd->variables.character_set_client = current_charset; @@ -1439,18 +1438,14 @@ static my_bool deny_updates_if_read_only_option(THD *thd, if (lex->sql_command == SQLCOM_UPDATE_MULTI) DBUG_RETURN(FALSE); - const my_bool create_temp_tables= - (lex->sql_command == SQLCOM_CREATE_TABLE) && lex->tmp_table(); + /* + a table-to-be-created is not in the temp table list yet, + so CREATE TABLE needs a special treatment + */ + const bool update_real_tables= lex->sql_command == SQLCOM_CREATE_TABLE ? + !lex->tmp_table() : some_non_temp_table_to_be_updated(thd, all_tables); - const my_bool drop_temp_tables= - (lex->sql_command == SQLCOM_DROP_TABLE) && lex->tmp_table(); - - const my_bool update_real_tables= - some_non_temp_table_to_be_updated(thd, all_tables) && - !(create_temp_tables || drop_temp_tables); - - - const my_bool create_or_drop_databases= + const bool create_or_drop_databases= (lex->sql_command == SQLCOM_CREATE_DB) || (lex->sql_command == SQLCOM_DROP_DB); @@ -1577,7 +1572,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, my_error(ER_LOCK_DEADLOCK, MYF(0), "wsrep aborted transaction"); WSREP_DEBUG("Deadlock error for: %s", thd->query()); mysql_mutex_unlock(&thd->LOCK_wsrep_thd); - thd->killed = NOT_KILLED; + thd->reset_killed(); thd->mysys_var->abort = 0; thd->wsrep_conflict_state = NO_CONFLICT; thd->wsrep_retry_counter = 0; @@ -1749,6 +1744,11 @@ bool dispatch_command(enum enum_server_command command, THD *thd, } break; } + case COM_STMT_BULK_EXECUTE: + { + mysqld_stmt_bulk_execute(thd, packet, packet_length); + break; + } case COM_STMT_EXECUTE: { mysqld_stmt_execute(thd, packet, packet_length); @@ -1950,7 +1950,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, break; } packet= arg_end + 1; - thd->reset_for_next_command(); + thd->reset_for_next_command(0); // Don't clear errors // thd->reset_for_next_command reset state => restore it if (is_next_command) { @@ -2027,7 +2027,10 @@ bool dispatch_command(enum enum_server_command command, THD *thd, } #endif case COM_QUIT: - /* We don't calculate statistics for this command */ + /* Note: We don't calculate statistics for this command */ + + /* Ensure that quit works even if max_mem_used is set */ + thd->variables.max_mem_used= LONGLONG_MAX; general_log_print(thd, command, NullS); net->error=0; // Don't give 'abort' message thd->get_stmt_da()->disable_status(); // Don't send anything back @@ -2055,9 +2058,12 @@ bool dispatch_command(enum enum_server_command command, THD *thd, kill_zombie_dump_threads(slave_server_id); thd->variables.server_id = slave_server_id; - general_log_print(thd, command, "Log: '%s' Pos: %ld", packet+10, - (long) pos); - mysql_binlog_send(thd, thd->strdup(packet + 10), (my_off_t) pos, flags); + const char *name= packet + 10; + size_t nlen= strlen(name); + + general_log_print(thd, command, "Log: '%s' Pos: %lu", name, pos); + if (nlen < FN_REFLEN) + mysql_binlog_send(thd, thd->strmake(name, nlen), (my_off_t)pos, flags); unregister_slave(thd,1,1); /* fake COM_QUIT -- if we get here, the thread needs to terminate */ error = TRUE; @@ -2393,6 +2399,7 @@ com_multi_end: dec_thread_running(); thd->packet.shrink(thd->variables.net_buffer_length); // Reclaim some memory } + thd->reset_kill_query(); /* Ensure that killed_errmsg is released */ free_root(thd->mem_root,MYF(MY_KEEP_PREALLOC)); #if defined(ENABLED_PROFILING) @@ -2782,6 +2789,7 @@ retry: ! table->prelocking_placeholder && table->table->file->lock_count() == 0) { + enum enum_mdl_type lock_type; /* In case when LOCK TABLE ... READ LOCAL was issued for table with storage engine which doesn't support READ LOCAL option and doesn't @@ -2794,9 +2802,12 @@ retry: deadlock_handler.init(); thd->push_internal_handler(&deadlock_handler); + lock_type= table->table->mdl_ticket->get_type() == MDL_SHARED_WRITE ? + MDL_SHARED_NO_READ_WRITE : MDL_SHARED_READ_ONLY; + bool result= thd->mdl_context.upgrade_shared_lock( table->table->mdl_ticket, - MDL_SHARED_READ_ONLY, + lock_type, thd->variables.lock_wait_timeout); thd->pop_internal_handler(); @@ -3316,6 +3327,7 @@ mysql_execute_command(THD *thd) goto error; } } + thd->transaction.stmt.mark_trans_did_ddl(); } #ifndef DBUG_OFF @@ -3373,6 +3385,7 @@ mysql_execute_command(THD *thd) #endif case SQLCOM_SHOW_STATUS: { + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); execute_show_status(thd, all_tables); break; } @@ -3401,8 +3414,8 @@ mysql_execute_command(THD *thd) MYF(0)); goto error; } - /* no break; fall through */ } + /* fall through */ case SQLCOM_SHOW_STATUS_PROC: case SQLCOM_SHOW_STATUS_FUNC: case SQLCOM_SHOW_DATABASES: @@ -3411,21 +3424,21 @@ mysql_execute_command(THD *thd) case SQLCOM_SHOW_TABLE_STATUS: case SQLCOM_SHOW_OPEN_TABLES: case SQLCOM_SHOW_GENERIC: + case SQLCOM_SHOW_PLUGINS: case SQLCOM_SHOW_FIELDS: case SQLCOM_SHOW_KEYS: - case SQLCOM_SELECT: - if (WSREP_CLIENT(thd) && wsrep_sync_wait(thd)) - goto error; - - case SQLCOM_SHOW_PLUGINS: case SQLCOM_SHOW_VARIABLES: case SQLCOM_SHOW_CHARSETS: case SQLCOM_SHOW_COLLATIONS: case SQLCOM_SHOW_STORAGE_ENGINES: case SQLCOM_SHOW_PROFILE: - { + case SQLCOM_SELECT: + { #ifdef WITH_WSREP - DBUG_ASSERT(thd->wsrep_exec_mode != REPL_RECV); + if (lex->sql_command == SQLCOM_SELECT) + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_READ) + else + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW) #endif /* WITH_WSREP */ thd->status_var.last_query_cost= 0.0; @@ -3554,6 +3567,7 @@ mysql_execute_command(THD *thd) case SQLCOM_SHOW_RELAYLOG_EVENTS: /* fall through */ case SQLCOM_SHOW_BINLOG_EVENTS: { + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); if (check_global_access(thd, REPL_SLAVE_ACL)) goto error; res = mysql_show_binlog_events(thd); @@ -4132,6 +4146,7 @@ end_with_restore_list: { if (check_global_access(thd, SUPER_ACL | REPL_CLIENT_ACL)) goto error; + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); res = show_binlogs(thd); break; } @@ -4139,15 +4154,13 @@ end_with_restore_list: #endif /* EMBEDDED_LIBRARY */ case SQLCOM_SHOW_CREATE: { - DBUG_ASSERT(first_table == all_tables && first_table != 0); + DBUG_ASSERT(first_table == all_tables && first_table != 0); #ifdef DONT_ALLOW_SHOW_COMMANDS my_message(ER_NOT_ALLOWED_COMMAND, ER_THD(thd, ER_NOT_ALLOWED_COMMAND), MYF(0)); /* purecov: inspected */ goto error; #else - - if (WSREP_CLIENT(thd) && wsrep_sync_wait(thd)) - goto error; + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); /* Access check: @@ -4211,8 +4224,7 @@ end_with_restore_list: case SQLCOM_CHECKSUM: { DBUG_ASSERT(first_table == all_tables && first_table != 0); - if (WSREP_CLIENT(thd) && wsrep_sync_wait(thd)) - goto error; + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_READ); if (check_table_access(thd, SELECT_ACL, all_tables, FALSE, UINT_MAX, FALSE)) @@ -4223,6 +4235,7 @@ end_with_restore_list: } case SQLCOM_UPDATE: { + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_UPDATE_DELETE); ha_rows found= 0, updated= 0; DBUG_ASSERT(first_table == all_tables && first_table != 0); if (WSREP_CLIENT(thd) && @@ -4257,17 +4270,15 @@ end_with_restore_list: /* mysql_update return 2 if we need to switch to multi-update */ if (up_result != 2) break; - /* Fall through */ } + /* Fall through */ case SQLCOM_UPDATE_MULTI: { DBUG_ASSERT(first_table == all_tables && first_table != 0); /* if we switched from normal update, rights are checked */ if (up_result != 2) { - if (WSREP_CLIENT(thd) && - wsrep_sync_wait(thd, WSREP_SYNC_WAIT_BEFORE_UPDATE_DELETE)) - goto error; + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_UPDATE_DELETE); if ((res= multi_update_precheck(thd, all_tables))) break; } @@ -4337,10 +4348,6 @@ end_with_restore_list: break; } case SQLCOM_REPLACE: - { - if (WSREP_CLIENT(thd) && - wsrep_sync_wait(thd, WSREP_SYNC_WAIT_BEFORE_INSERT_REPLACE)) - goto error; #ifndef DBUG_OFF if (mysql_bin_log.is_open()) { @@ -4375,9 +4382,10 @@ end_with_restore_list: DBUG_PRINT("debug", ("Just after generate_incident()")); } #endif - } + /* fall through */ case SQLCOM_INSERT: { + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_INSERT_REPLACE); DBUG_ASSERT(first_table == all_tables && first_table != 0); if (WSREP_CLIENT(thd) && @@ -4436,6 +4444,7 @@ end_with_restore_list: case SQLCOM_REPLACE_SELECT: case SQLCOM_INSERT_SELECT: { + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_INSERT_REPLACE); select_result *sel_result; bool explain= MY_TEST(lex->describe); DBUG_ASSERT(first_table == all_tables && first_table != 0); @@ -4559,6 +4568,7 @@ end_with_restore_list: } case SQLCOM_DELETE: { + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_UPDATE_DELETE); select_result *sel_result=lex->result; DBUG_ASSERT(first_table == all_tables && first_table != 0); if (WSREP_CLIENT(thd) && @@ -4619,6 +4629,7 @@ end_with_restore_list: } case SQLCOM_DELETE_MULTI: { + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_UPDATE_DELETE); DBUG_ASSERT(first_table == all_tables && first_table != 0); TABLE_LIST *aux_tables= thd->lex->auxiliary_table_list.first; multi_delete *result; @@ -4699,19 +4710,6 @@ end_with_restore_list: /* So that DROP TEMPORARY TABLE gets to binlog at commit/rollback */ thd->variables.option_bits|= OPTION_KEEP_LOG; } - if (WSREP(thd)) - { - for (TABLE_LIST *table= all_tables; table; table= table->next_global) - { - if (!lex->tmp_table() && - (!thd->is_current_stmt_binlog_format_row() || - !thd->find_temporary_table(table))) - { - WSREP_TO_ISOLATION_BEGIN(NULL, NULL, all_tables); - break; - } - } - } /* If we are a slave, we should add IF EXISTS if the query executed on the master without an error. This will help a slave to @@ -4721,6 +4719,20 @@ end_with_restore_list: if (thd->slave_thread && !thd->slave_expected_error && slave_ddl_exec_mode_options == SLAVE_EXEC_MODE_IDEMPOTENT) lex->create_info.set(DDL_options_st::OPT_IF_EXISTS); + + if (WSREP(thd)) + { + for (TABLE_LIST *table= all_tables; table; table= table->next_global) + { + if (!lex->tmp_table() && + (!thd->is_current_stmt_binlog_format_row() || + !thd->find_temporary_table(table))) + { + WSREP_TO_ISOLATION_BEGIN(NULL, NULL, all_tables); + break; + } + } + } /* DDL and binlog write order are protected by metadata locks. */ res= mysql_rm_table(thd, first_table, lex->if_exists(), lex->tmp_table()); @@ -4810,7 +4822,8 @@ end_with_restore_list: goto error; if (!(res= sql_set_variables(thd, lex_var_list, true))) { - my_ok(thd); + if (!thd->is_error()) + my_ok(thd); } else { @@ -5033,9 +5046,7 @@ end_with_restore_list: db_name.length= lex->name.length; strmov(db_name.str, lex->name.str); -#ifdef WITH_WSREP - if (WSREP_CLIENT(thd) && wsrep_sync_wait(thd)) goto error; -#endif /* WITH_WSREP */ + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); if (check_db_name(&db_name)) { @@ -5090,9 +5101,7 @@ end_with_restore_list: /* lex->unit.cleanup() is called outside, no need to call it here */ break; case SQLCOM_SHOW_CREATE_EVENT: -#ifdef WITH_WSREP - if (WSREP_CLIENT(thd) && wsrep_sync_wait(thd)) goto error; -#endif /* WITH_WSREP */ + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); res= Events::show_create_event(thd, lex->spname->m_db, lex->spname->m_name); break; @@ -5304,6 +5313,7 @@ end_with_restore_list: initialize this variable because RESET shares the same code as FLUSH */ lex->no_write_to_binlog= 1; + /* fall through */ case SQLCOM_FLUSH: { int write_to_binlog; @@ -5475,6 +5485,7 @@ end_with_restore_list: if (!grant_user) goto error; + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); res = mysql_show_grants(thd, grant_user); break; } @@ -5549,7 +5560,7 @@ end_with_restore_list: /* Disconnect the current client connection. */ if (tx_release) { - thd->killed= KILL_CONNECTION; + thd->set_killed(KILL_CONNECTION); thd->print_aborted_warning(3, "RELEASE"); } #ifdef WITH_WSREP @@ -5595,7 +5606,7 @@ end_with_restore_list: } /* Disconnect the current client connection. */ if (tx_release) - thd->killed= KILL_CONNECTION; + thd->set_killed(KILL_CONNECTION); #ifdef WITH_WSREP if (WSREP(thd) && thd->wsrep_conflict_state != NO_CONFLICT) { @@ -5648,7 +5659,7 @@ end_with_restore_list: { if (check_routine_access(thd, ALTER_PROC_ACL, lex->spname->m_db.str, lex->spname->m_name.str, - lex->sql_command == SQLCOM_DROP_PROCEDURE, 0)) + lex->sql_command == SQLCOM_CREATE_PROCEDURE, 0)) goto error; } @@ -5954,18 +5965,14 @@ end_with_restore_list: } case SQLCOM_SHOW_CREATE_PROC: { -#ifdef WITH_WSREP - if (WSREP_CLIENT(thd) && wsrep_sync_wait(thd)) goto error; -#endif /* WITH_WSREP */ + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); if (sp_show_create_routine(thd, TYPE_ENUM_PROCEDURE, lex->spname)) goto error; break; } case SQLCOM_SHOW_CREATE_FUNC: { -#ifdef WITH_WSREP - if (WSREP_CLIENT(thd) && wsrep_sync_wait(thd)) goto error; -#endif /* WITH_WSREP */ + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); if (sp_show_create_routine(thd, TYPE_ENUM_FUNCTION, lex->spname)) goto error; break; @@ -5978,9 +5985,7 @@ end_with_restore_list: stored_procedure_type type= (lex->sql_command == SQLCOM_SHOW_PROC_CODE ? TYPE_ENUM_PROCEDURE : TYPE_ENUM_FUNCTION); -#ifdef WITH_WSREP - if (WSREP_CLIENT(thd) && wsrep_sync_wait(thd)) goto error; -#endif /* WITH_WSREP */ + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); if (sp_cache_routine(thd, type, lex->spname, FALSE, &sp)) goto error; if (!sp || sp->show_routine_code(thd)) @@ -6002,9 +6007,7 @@ end_with_restore_list: if (check_ident_length(&lex->spname->m_name)) goto error; -#ifdef WITH_WSREP - if (WSREP_CLIENT(thd) && wsrep_sync_wait(thd)) goto error; -#endif /* WITH_WSREP */ + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); if (show_create_trigger(thd, lex->spname)) goto error; /* Error has been already logged. */ @@ -6462,6 +6465,7 @@ static bool execute_show_status(THD *thd, TABLE_LIST *all_tables) if (!(res= check_table_access(thd, SELECT_ACL, all_tables, FALSE, UINT_MAX, FALSE))) res= execute_sqlcom_select(thd, all_tables); + /* Don't log SHOW STATUS commands to slow query log */ thd->server_status&= ~(SERVER_QUERY_NO_INDEX_USED | SERVER_QUERY_NO_GOOD_INDEX_USED); @@ -7305,12 +7309,6 @@ bool check_fk_parent_table_access(THD *thd, ****************************************************************************/ -#if STACK_DIRECTION < 0 -#define used_stack(A,B) (long) (A - B) -#else -#define used_stack(A,B) (long) (B - A) -#endif - #ifndef DBUG_OFF long max_stack_used; #endif @@ -7327,7 +7325,7 @@ bool check_stack_overrun(THD *thd, long margin, { long stack_used; DBUG_ASSERT(thd == current_thd); - if ((stack_used=used_stack(thd->thread_stack,(char*) &stack_used)) >= + if ((stack_used= available_stack_size(thd->thread_stack, &stack_used)) >= (long) (my_thread_stack_size - margin)) { thd->is_fatal_error= 1; @@ -7393,6 +7391,8 @@ bool my_yyoverflow(short **yyss, YYSTYPE **yyvs, ulong *yystacksize) Reset the part of THD responsible for the state of command processing. + @param do_clear_error Set if we should clear errors + This needs to be called before execution of every statement (prepared or conventional). It is not called by substatements of routines. @@ -7400,12 +7400,16 @@ bool my_yyoverflow(short **yyss, YYSTYPE **yyvs, ulong *yystacksize) @todo Call it after we use THD for queries, not before. */ -void THD::reset_for_next_command() +void THD::reset_for_next_command(bool do_clear_error) { THD *thd= this; DBUG_ENTER("THD::reset_for_next_command"); DBUG_ASSERT(!thd->spcont); /* not for substatements of routines */ DBUG_ASSERT(! thd->in_sub_stmt); + + if (do_clear_error) + clear_error(1); + thd->free_list= 0; thd->select_number= 1; /* @@ -7451,8 +7455,7 @@ void THD::reset_for_next_command() if (!thd->in_multi_stmt_transaction_mode()) { thd->variables.option_bits&= ~OPTION_KEEP_LOG; - thd->transaction.all.modified_non_trans_table= FALSE; - thd->transaction.all.m_unsafe_rollback_flags&= ~THD_TRANS::DID_WAIT; + thd->transaction.all.reset(); } DBUG_ASSERT(thd->security_ctx== &thd->main_security_ctx); thd->thread_specific_used= FALSE; @@ -7462,8 +7465,6 @@ void THD::reset_for_next_command() reset_dynamic(&thd->user_var_events); thd->user_var_events_alloc= thd->mem_root; } - thd->clear_error(); - thd->get_stmt_da()->reset_diagnostics_area(); thd->get_stmt_da()->reset_for_next_command(); thd->rand_used= 0; thd->m_sent_row_count= thd->m_examined_row_count= 0; @@ -7706,7 +7707,7 @@ static void wsrep_mysql_parse(THD *thd, char *rawbuf, uint length, thd->wsrep_conflict_state == CERT_FAILURE) { thd->reset_for_next_command(); - thd->killed= NOT_KILLED; + thd->reset_killed(); if (is_autocommit && thd->lex->sql_command != SQLCOM_SELECT && (thd->wsrep_retry_counter < thd->variables.wsrep_retry_autocommit)) @@ -7735,7 +7736,7 @@ static void wsrep_mysql_parse(THD *thd, char *rawbuf, uint length, thd->wsrep_retry_counter, thd->variables.wsrep_retry_autocommit, thd->query()); my_error(ER_LOCK_DEADLOCK, MYF(0), "wsrep aborted transaction"); - thd->killed= NOT_KILLED; + thd->reset_killed(); thd->wsrep_conflict_state= NO_CONFLICT; if (thd->wsrep_conflict_state != REPLAYING) thd->wsrep_retry_counter= 0; // reset @@ -8867,10 +8868,10 @@ void sql_kill(THD *thd, longlong id, killed_state state, killed_type type) uint error; if (!(error= kill_one_thread(thd, id, state, type))) { - if ((!thd->killed)) + if (!thd->killed) my_ok(thd); else - my_error(killed_errno(thd->killed), MYF(0), id); + thd->send_kill_message(); } else my_error(error, MYF(0), id); diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index 0a146aeb12b..6d202477b76 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -83,27 +83,6 @@ using std::min; /* Partition related functions declarations and some static constants; */ -const LEX_STRING partition_keywords[]= -{ - { C_STRING_WITH_LEN("HASH") }, - { C_STRING_WITH_LEN("RANGE") }, - { C_STRING_WITH_LEN("LIST") }, - { C_STRING_WITH_LEN("KEY") }, - { C_STRING_WITH_LEN("MAXVALUE") }, - { C_STRING_WITH_LEN("LINEAR ") }, - { C_STRING_WITH_LEN(" COLUMNS") }, - { C_STRING_WITH_LEN("ALGORITHM") } - -}; -static const char *part_str= "PARTITION"; -static const char *sub_str= "SUB"; -static const char *by_str= "BY"; -static const char *space_str= " "; -static const char *equal_str= "="; -static const char *end_paren_str= ")"; -static const char *begin_paren_str= "("; -static const char *comma_str= ","; - static int get_partition_id_list_col(partition_info *, uint32 *, longlong *); static int get_partition_id_list(partition_info *, uint32 *, longlong *); static int get_partition_id_range_col(partition_info *, uint32 *, longlong *); @@ -1011,9 +990,7 @@ static bool fix_fields_part_func(THD *thd, Item* func_expr, TABLE *table, result= set_up_field_array(thd, table, is_sub_part); end: end_lex_with_single_table(thd, table, old_lex); -#if !defined(DBUG_OFF) func_expr->walk(&Item::change_context_processor, 0, 0); -#endif DBUG_RETURN(result); } @@ -1675,13 +1652,13 @@ bool fix_partition_func(THD *thd, TABLE *table, part_info->fixed= TRUE; if (part_info->part_type == RANGE_PARTITION) { - error_str= partition_keywords[PKW_RANGE].str; + error_str= "HASH"; if (unlikely(part_info->check_range_constants(thd))) goto end; } else if (part_info->part_type == LIST_PARTITION) { - error_str= partition_keywords[PKW_LIST].str; + error_str= "LIST"; if (unlikely(part_info->check_list_constants(thd))) goto end; } @@ -1759,160 +1736,48 @@ end: ALTER TABLE commands. Finally it is used for SHOW CREATE TABLES. */ -static int add_write(File fptr, const char *buf, uint len) +static int add_part_field_list(THD *thd, String *str, List field_list) { - uint ret_code= mysql_file_write(fptr, (const uchar*)buf, len, MYF(MY_FNABP)); - - if (likely(ret_code == 0)) - return 0; - else - return 1; -} - -static int add_string_object(File fptr, String *string) -{ - return add_write(fptr, string->ptr(), string->length()); -} - -static int add_string(File fptr, const char *string) -{ - return add_write(fptr, string, strlen(string)); -} - -static int add_string_len(File fptr, const char *string, uint len) -{ - return add_write(fptr, string, len); -} - -static int add_space(File fptr) -{ - return add_string(fptr, space_str); -} - -static int add_comma(File fptr) -{ - return add_string(fptr, comma_str); -} - -static int add_equal(File fptr) -{ - return add_string(fptr, equal_str); -} - -static int add_end_parenthesis(File fptr) -{ - return add_string(fptr, end_paren_str); -} - -static int add_begin_parenthesis(File fptr) -{ - return add_string(fptr, begin_paren_str); -} - -static int add_part_key_word(File fptr, const char *key_string) -{ - int err= add_string(fptr, key_string); - err+= add_space(fptr); - return err; -} - -static int add_partition(File fptr) -{ - char buff[22]; - strxmov(buff, part_str, space_str, NullS); - return add_string(fptr, buff); -} - -static int add_subpartition(File fptr) -{ - int err= add_string(fptr, sub_str); - - return err + add_partition(fptr); -} - -static int add_partition_by(File fptr) -{ - char buff[22]; - strxmov(buff, part_str, space_str, by_str, space_str, NullS); - return add_string(fptr, buff); -} - -static int add_subpartition_by(File fptr) -{ - int err= add_string(fptr, sub_str); - - return err + add_partition_by(fptr); -} - -static int add_part_field_list(File fptr, List field_list) -{ - uint i, num_fields; int err= 0; - + const char *field_name; List_iterator part_it(field_list); - num_fields= field_list.elements; - i= 0; - err+= add_begin_parenthesis(fptr); - while (i < num_fields) + + err+= str->append('('); + while ((field_name= part_it++)) { - const char *field_str= part_it++; - String field_string("", 0, system_charset_info); - THD *thd= current_thd; - ulonglong save_options= thd->variables.option_bits; - thd->variables.option_bits&= ~OPTION_QUOTE_SHOW_CREATE; - append_identifier(thd, &field_string, field_str, - strlen(field_str)); - thd->variables.option_bits= save_options; - err+= add_string_object(fptr, &field_string); - if (i != (num_fields-1)) - err+= add_comma(fptr); - i++; + err+= append_identifier(thd, str, field_name, strlen(field_name)); + err+= str->append(','); } - err+= add_end_parenthesis(fptr); + if (field_list.elements) + str->length(str->length()-1); + err+= str->append(')'); return err; } -static int add_name_string(File fptr, const char *name) -{ - int err; - String name_string("", 0, system_charset_info); - THD *thd= current_thd; - ulonglong save_options= thd->variables.option_bits; - thd->variables.option_bits&= ~OPTION_QUOTE_SHOW_CREATE; - append_identifier(thd, &name_string, name, - strlen(name)); - thd->variables.option_bits= save_options; - err= add_string_object(fptr, &name_string); - return err; -} - -static int add_int(File fptr, longlong number) -{ - char buff[32]; - llstr(number, buff); - return add_string(fptr, buff); -} - -static int add_uint(File fptr, ulonglong number) -{ - char buff[32]; - longlong2str(number, buff, 10); - return add_string(fptr, buff); -} - /* Must escape strings in partitioned tables frm-files, parsing it later with mysql_unpack_partition will fail otherwise. */ -static int add_quoted_string(File fptr, const char *quotestr) + +static int add_keyword_string(String *str, const char *keyword, + bool quoted, const char *keystr) { - String escapedstr; - int err= add_string(fptr, "'"); - err+= escapedstr.append_for_single_quote(quotestr); - err+= add_string(fptr, escapedstr.c_ptr_safe()); - return err + add_string(fptr, "'"); + int err= str->append(' '); + err+= str->append(keyword); + + str->append(STRING_WITH_LEN(" = ")); + if (quoted) + { + err+= str->append('\''); + err+= str->append_for_single_quote(keystr); + err+= str->append('\''); + } + else + err+= str->append(keystr); + return err; } + /** @brief Truncate the partition file name from a path it it exists. @@ -1945,7 +1810,6 @@ void truncate_partition_filename(char *path) } } - /** @brief Output a filepath. Similar to add_keyword_string except it also converts \ to / on Windows and skips the partition file name at @@ -1957,15 +1821,9 @@ table. So when the storage engine is asked for the DATA DIRECTORY string after a restart through Handler::update_create_options(), the storage engine may include the filename. */ -static int add_keyword_path(File fptr, const char *keyword, +static int add_keyword_path(String *str, const char *keyword, const char *path) { - int err= add_string(fptr, keyword); - - err+= add_space(fptr); - err+= add_equal(fptr); - err+= add_space(fptr); - char temp_path[FN_REFLEN]; strcpy(temp_path, path); #ifdef __WIN__ @@ -1985,73 +1843,44 @@ static int add_keyword_path(File fptr, const char *keyword, */ truncate_partition_filename(temp_path); - err+= add_quoted_string(fptr, temp_path); - - return err + add_space(fptr); + return add_keyword_string(str, keyword, true, temp_path); } -static int add_keyword_string(File fptr, const char *keyword, - bool should_use_quotes, - const char *keystr) +static int add_keyword_int(String *str, const char *keyword, longlong num) { - int err= add_string(fptr, keyword); - - err+= add_space(fptr); - err+= add_equal(fptr); - err+= add_space(fptr); - if (should_use_quotes) - err+= add_quoted_string(fptr, keystr); - else - err+= add_string(fptr, keystr); - return err + add_space(fptr); + int err= str->append(' '); + err+= str->append(keyword); + str->append(STRING_WITH_LEN(" = ")); + return err + str->append_longlong(num); } -static int add_keyword_int(File fptr, const char *keyword, longlong num) -{ - int err= add_string(fptr, keyword); - - err+= add_space(fptr); - err+= add_equal(fptr); - err+= add_space(fptr); - err+= add_int(fptr, num); - return err + add_space(fptr); -} - -static int add_engine(File fptr, handlerton *engine_type) -{ - const char *engine_str= ha_resolve_storage_engine_name(engine_type); - DBUG_PRINT("info", ("ENGINE: %s", engine_str)); - int err= add_string(fptr, "ENGINE = "); - return err + add_string(fptr, engine_str); -} - -static int add_partition_options(File fptr, partition_element *p_elem) +static int add_partition_options(String *str, partition_element *p_elem) { int err= 0; - err+= add_space(fptr); if (p_elem->tablespace_name) - err+= add_keyword_string(fptr,"TABLESPACE", FALSE, - p_elem->tablespace_name); + err+= add_keyword_string(str,"TABLESPACE", false, p_elem->tablespace_name); if (p_elem->nodegroup_id != UNDEF_NODEGROUP) - err+= add_keyword_int(fptr,"NODEGROUP",(longlong)p_elem->nodegroup_id); + err+= add_keyword_int(str,"NODEGROUP",(longlong)p_elem->nodegroup_id); if (p_elem->part_max_rows) - err+= add_keyword_int(fptr,"MAX_ROWS",(longlong)p_elem->part_max_rows); + err+= add_keyword_int(str,"MAX_ROWS",(longlong)p_elem->part_max_rows); if (p_elem->part_min_rows) - err+= add_keyword_int(fptr,"MIN_ROWS",(longlong)p_elem->part_min_rows); + err+= add_keyword_int(str,"MIN_ROWS",(longlong)p_elem->part_min_rows); if (!(current_thd->variables.sql_mode & MODE_NO_DIR_IN_CREATE)) { if (p_elem->data_file_name) - err+= add_keyword_path(fptr, "DATA DIRECTORY", p_elem->data_file_name); + err+= add_keyword_path(str, "DATA DIRECTORY", p_elem->data_file_name); if (p_elem->index_file_name) - err+= add_keyword_path(fptr, "INDEX DIRECTORY", p_elem->index_file_name); + err+= add_keyword_path(str, "INDEX DIRECTORY", p_elem->index_file_name); } if (p_elem->part_comment) - err+= add_keyword_string(fptr, "COMMENT", TRUE, p_elem->part_comment); + err+= add_keyword_string(str, "COMMENT", true, p_elem->part_comment); if (p_elem->connect_string.length) - err+= add_keyword_string(fptr, "CONNECTION", TRUE, + err+= add_keyword_string(str, "CONNECTION", true, p_elem->connect_string.str); - return err + add_engine(fptr,p_elem->engine_type); + err += add_keyword_string(str, "ENGINE", false, + ha_resolve_storage_engine_name(p_elem->engine_type)); + return err; } @@ -2162,7 +1991,7 @@ static Create_field* get_sql_field(char *field_name, } -static int add_column_list_values(File fptr, partition_info *part_info, +static int add_column_list_values(String *str, partition_info *part_info, part_elem_value *list_value, HA_CREATE_INFO *create_info, Alter_info *alter_info) @@ -2175,25 +2004,22 @@ static int add_column_list_values(File fptr, partition_info *part_info, part_info->num_columns > 1U); if (use_parenthesis) - err+= add_begin_parenthesis(fptr); + err+= str->append('('); for (i= 0; i < num_elements; i++) { part_column_list_val *col_val= &list_value->col_val_array[i]; char *field_name= it++; if (col_val->max_value) - err+= add_string(fptr, partition_keywords[PKW_MAXVALUE].str); + err+= str->append(STRING_WITH_LEN("MAXVALUE")); else if (col_val->null_value) - err+= add_string(fptr, "NULL"); + err+= str->append(STRING_WITH_LEN("NULL")); else { - char buffer[MAX_KEY_LENGTH]; - String str(buffer, sizeof(buffer), &my_charset_bin); Item *item_expr= col_val->item_expression; if (item_expr->null_value) - err+= add_string(fptr, "NULL"); + err+= str->append(STRING_WITH_LEN("NULL")); else { - String *res; CHARSET_INFO *field_cs; bool need_cs_check= FALSE; Item_result result_type= STRING_RESULT; @@ -2254,27 +2080,28 @@ static int add_column_list_values(File fptr, partition_info *part_info, } } { - String val_conv; + StringBuffer buf; + String val_conv, *res; val_conv.set_charset(system_charset_info); - res= item_expr->val_str(&str); + res= item_expr->val_str(&buf); if (get_cs_converted_part_value_from_string(current_thd, item_expr, res, &val_conv, field_cs, (bool)(alter_info != NULL))) return 1; - err+= add_string_object(fptr, &val_conv); + err+= str->append(val_conv); } } } if (i != (num_elements - 1)) - err+= add_string(fptr, comma_str); + err+= str->append(','); } if (use_parenthesis) - err+= add_end_parenthesis(fptr); + err+= str->append(')'); return err; } -static int add_partition_values(File fptr, partition_info *part_info, +static int add_partition_values(String *str, partition_info *part_info, partition_element *p_elem, HA_CREATE_INFO *create_info, Alter_info *alter_info) @@ -2283,29 +2110,29 @@ static int add_partition_values(File fptr, partition_info *part_info, if (part_info->part_type == RANGE_PARTITION) { - err+= add_string(fptr, " VALUES LESS THAN "); + err+= str->append(STRING_WITH_LEN(" VALUES LESS THAN ")); if (part_info->column_list) { List_iterator list_val_it(p_elem->list_val_list); part_elem_value *list_value= list_val_it++; - err+= add_begin_parenthesis(fptr); - err+= add_column_list_values(fptr, part_info, list_value, + err+= str->append('('); + err+= add_column_list_values(str, part_info, list_value, create_info, alter_info); - err+= add_end_parenthesis(fptr); + err+= str->append(')'); } else { if (!p_elem->max_value) { - err+= add_begin_parenthesis(fptr); + err+= str->append('('); if (p_elem->signed_flag) - err+= add_int(fptr, p_elem->range_value); + err+= str->append_longlong(p_elem->range_value); else - err+= add_uint(fptr, p_elem->range_value); - err+= add_end_parenthesis(fptr); + err+= str->append_ulonglong(p_elem->range_value); + err+= str->append(')'); } else - err+= add_string(fptr, partition_keywords[PKW_MAXVALUE].str); + err+= str->append(STRING_WITH_LEN("MAXVALUE")); } } else if (part_info->part_type == LIST_PARTITION) @@ -2317,23 +2144,23 @@ static int add_partition_values(File fptr, partition_info *part_info, { DBUG_ASSERT(part_info->defined_max_value || current_thd->lex->sql_command == SQLCOM_ALTER_TABLE); - err+= add_string(fptr, " DEFAULT"); + err+= str->append(STRING_WITH_LEN(" DEFAULT")); return err; } - err+= add_string(fptr, " VALUES IN "); + err+= str->append(STRING_WITH_LEN(" VALUES IN ")); uint num_items= p_elem->list_val_list.elements; - err+= add_begin_parenthesis(fptr); + err+= str->append('('); if (p_elem->has_null_value) { - err+= add_string(fptr, "NULL"); + err+= str->append(STRING_WITH_LEN("NULL")); if (num_items == 0) { - err+= add_end_parenthesis(fptr); + err+= str->append(')'); goto end; } - err+= add_comma(fptr); + err+= str->append(','); } i= 0; do @@ -2341,19 +2168,19 @@ static int add_partition_values(File fptr, partition_info *part_info, part_elem_value *list_value= list_val_it++; if (part_info->column_list) - err+= add_column_list_values(fptr, part_info, list_value, + err+= add_column_list_values(str, part_info, list_value, create_info, alter_info); else { if (!list_value->unsigned_flag) - err+= add_int(fptr, list_value->value); + err+= str->append_longlong(list_value->value); else - err+= add_uint(fptr, list_value->value); + err+= str->append_ulonglong(list_value->value); } if (i != (num_items-1)) - err+= add_comma(fptr); + err+= str->append(','); } while (++i < num_items); - err+= add_end_parenthesis(fptr); + err+= str->append(')'); } end: return err; @@ -2363,49 +2190,24 @@ end: /** Add 'KEY' word, with optional 'ALGORTIHM = N'. - @param fptr File to write to. + @param str String to write to. @param part_info partition_info holding the used key_algorithm - @param current_comment_start NULL, or comment string encapsulating the - PARTITION BY clause. @return Operation status. @retval 0 Success @retval != 0 Failure */ -static int add_key_with_algorithm(File fptr, partition_info *part_info, - const char *current_comment_start) +static int add_key_with_algorithm(String *str, partition_info *part_info) { int err= 0; - err+= add_part_key_word(fptr, partition_keywords[PKW_KEY].str); + err+= str->append(STRING_WITH_LEN("KEY ")); - /* - current_comment_start is given when called from SHOW CREATE TABLE, - Then only add ALGORITHM = 1, not the default 2 or non-set 0! - For .frm current_comment_start is NULL, then add ALGORITHM if != 0. - */ - if (part_info->key_algorithm == partition_info::KEY_ALGORITHM_51 || // SHOW - (!current_comment_start && // .frm - (part_info->key_algorithm != partition_info::KEY_ALGORITHM_NONE))) + if (part_info->key_algorithm == partition_info::KEY_ALGORITHM_51) { - /* If we already are within a comment, end that comment first. */ - if (current_comment_start) - err+= add_string(fptr, "*/ "); - err+= add_string(fptr, "/*!50611 "); - err+= add_part_key_word(fptr, partition_keywords[PKW_ALGORITHM].str); - err+= add_equal(fptr); - err+= add_space(fptr); - err+= add_int(fptr, part_info->key_algorithm); - err+= add_space(fptr); - err+= add_string(fptr, "*/ "); - if (current_comment_start) - { - /* Skip new line. */ - if (current_comment_start[0] == '\n') - current_comment_start++; - err+= add_string(fptr, current_comment_start); - err+= add_space(fptr); - } + err+= str->append(STRING_WITH_LEN("ALGORITHM = ")); + err+= str->append_longlong(part_info->key_algorithm); + err+= str->append(' '); } return err; } @@ -2420,8 +2222,6 @@ static int add_key_with_algorithm(File fptr, partition_info *part_info, generate_partition_syntax() part_info The partitioning data structure buf_length A pointer to the returned buffer length - use_sql_alloc Allocate buffer from sql_alloc if true - otherwise use my_malloc show_partition_options Should we display partition options create_info Info generated by parser alter_info Info generated by parser @@ -2438,64 +2238,42 @@ static int add_key_with_algorithm(File fptr, partition_info *part_info, type ALTER TABLE commands focusing on changing the PARTITION structure in any fashion. - The implementation writes the syntax to a temporary file (essentially - an abstraction of a dynamic array) and if all writes goes well it - allocates a buffer and writes the syntax into this one and returns it. - - As a security precaution the file is deleted before writing into it. This - means that no other processes on the machine can open and read the file - while this processing is ongoing. - The code is optimised for minimal code size since it is not used in any common queries. */ char *generate_partition_syntax(THD *thd, partition_info *part_info, uint *buf_length, - bool use_sql_alloc, bool show_partition_options, HA_CREATE_INFO *create_info, - Alter_info *alter_info, - const char *current_comment_start) + Alter_info *alter_info) { uint i,j, tot_num_parts, num_subparts; partition_element *part_elem; - ulonglong buffer_length; - char path[FN_REFLEN]; int err= 0; List_iterator part_it(part_info->partitions); - File fptr; - char *buf= NULL; //Return buffer + StringBuffer<1024> str; DBUG_ENTER("generate_partition_syntax"); - if (unlikely(((fptr= create_temp_file(path,mysql_tmpdir,"psy", - O_RDWR | O_BINARY | O_TRUNC | - O_TEMPORARY, MYF(MY_WME)))) < 0)) - DBUG_RETURN(NULL); -#ifndef __WIN__ - unlink(path); -#endif - err+= add_space(fptr); - err+= add_partition_by(fptr); + err+= str.append(STRING_WITH_LEN(" PARTITION BY ")); switch (part_info->part_type) { case RANGE_PARTITION: - err+= add_part_key_word(fptr, partition_keywords[PKW_RANGE].str); + err+= str.append(STRING_WITH_LEN("RANGE ")); break; case LIST_PARTITION: - err+= add_part_key_word(fptr, partition_keywords[PKW_LIST].str); + err+= str.append(STRING_WITH_LEN("LIST ")); break; case HASH_PARTITION: if (part_info->linear_hash_ind) - err+= add_string(fptr, partition_keywords[PKW_LINEAR].str); + err+= str.append(STRING_WITH_LEN("LINEAR ")); if (part_info->list_of_part_fields) { - err+= add_key_with_algorithm(fptr, part_info, - current_comment_start); - err+= add_part_field_list(fptr, part_info->part_field_list); + err+= add_key_with_algorithm(&str, part_info); + err+= add_part_field_list(thd, &str, part_info->part_field_list); } else - err+= add_part_key_word(fptr, partition_keywords[PKW_HASH].str); + err+= str.append(STRING_WITH_LEN("HASH ")); break; default: DBUG_ASSERT(0); @@ -2505,51 +2283,45 @@ char *generate_partition_syntax(THD *thd, partition_info *part_info, } if (part_info->part_expr) { - err+= add_begin_parenthesis(fptr); - err+= add_string_len(fptr, part_info->part_func_string, - part_info->part_func_len); - err+= add_end_parenthesis(fptr); + err+= str.append('('); + part_info->part_expr->print_for_table_def(&str); + err+= str.append(')'); } else if (part_info->column_list) { - err+= add_string(fptr, partition_keywords[PKW_COLUMNS].str); - err+= add_part_field_list(fptr, part_info->part_field_list); + err+= str.append(STRING_WITH_LEN(" COLUMNS")); + err+= add_part_field_list(thd, &str, part_info->part_field_list); } if ((!part_info->use_default_num_partitions) && part_info->use_default_partitions) { - err+= add_string(fptr, "\n"); - err+= add_string(fptr, "PARTITIONS "); - err+= add_int(fptr, part_info->num_parts); + err+= str.append(STRING_WITH_LEN("\nPARTITIONS ")); + err+= str.append_ulonglong(part_info->num_parts); } if (part_info->is_sub_partitioned()) { - err+= add_string(fptr, "\n"); - err+= add_subpartition_by(fptr); + err+= str.append(STRING_WITH_LEN("\nSUBPARTITION BY ")); /* Must be hash partitioning for subpartitioning */ if (part_info->linear_hash_ind) - err+= add_string(fptr, partition_keywords[PKW_LINEAR].str); + err+= str.append(STRING_WITH_LEN("LINEAR ")); if (part_info->list_of_subpart_fields) { - err+= add_key_with_algorithm(fptr, part_info, - current_comment_start); - err+= add_part_field_list(fptr, part_info->subpart_field_list); + err+= add_key_with_algorithm(&str, part_info); + err+= add_part_field_list(thd, &str, part_info->subpart_field_list); } else - err+= add_part_key_word(fptr, partition_keywords[PKW_HASH].str); + err+= str.append(STRING_WITH_LEN("HASH ")); if (part_info->subpart_expr) { - err+= add_begin_parenthesis(fptr); - err+= add_string_len(fptr, part_info->subpart_func_string, - part_info->subpart_func_len); - err+= add_end_parenthesis(fptr); + err+= str.append('('); + part_info->subpart_expr->print_for_table_def(&str); + err+= str.append(')'); } if ((!part_info->use_default_num_subpartitions) && part_info->use_default_subpartitions) { - err+= add_string(fptr, "\n"); - err+= add_string(fptr, "SUBPARTITIONS "); - err+= add_int(fptr, part_info->num_subparts); + err+= str.append(STRING_WITH_LEN("\nSUBPARTITIONS ")); + err+= str.append_ulonglong(part_info->num_subparts); } } tot_num_parts= part_info->partitions.elements; @@ -2558,8 +2330,7 @@ char *generate_partition_syntax(THD *thd, partition_info *part_info, if (!part_info->use_default_partitions) { bool first= TRUE; - err+= add_string(fptr, "\n"); - err+= add_begin_parenthesis(fptr); + err+= str.append(STRING_WITH_LEN("\n(")); i= 0; do { @@ -2568,80 +2339,47 @@ char *generate_partition_syntax(THD *thd, partition_info *part_info, part_elem->part_state != PART_REORGED_DROPPED) { if (!first) - { - err+= add_comma(fptr); - err+= add_string(fptr, "\n"); - err+= add_space(fptr); - } + err+= str.append(STRING_WITH_LEN(",\n ")); first= FALSE; - err+= add_partition(fptr); - err+= add_name_string(fptr, part_elem->partition_name); - err+= add_partition_values(fptr, part_info, part_elem, + err+= str.append(STRING_WITH_LEN("PARTITION ")); + err+= append_identifier(thd, &str, part_elem->partition_name, + strlen(part_elem->partition_name)); + err+= add_partition_values(&str, part_info, part_elem, create_info, alter_info); if (!part_info->is_sub_partitioned() || part_info->use_default_subpartitions) { if (show_partition_options) - err+= add_partition_options(fptr, part_elem); + err+= add_partition_options(&str, part_elem); } else { - err+= add_string(fptr, "\n"); - err+= add_space(fptr); - err+= add_begin_parenthesis(fptr); + err+= str.append(STRING_WITH_LEN("\n (")); List_iterator sub_it(part_elem->subpartitions); j= 0; do { part_elem= sub_it++; - err+= add_subpartition(fptr); - err+= add_name_string(fptr, part_elem->partition_name); + err+= str.append(STRING_WITH_LEN("SUBPARTITION ")); + err+= append_identifier(thd, &str, part_elem->partition_name, + strlen(part_elem->partition_name)); if (show_partition_options) - err+= add_partition_options(fptr, part_elem); + err+= add_partition_options(&str, part_elem); if (j != (num_subparts-1)) - { - err+= add_comma(fptr); - err+= add_string(fptr, "\n"); - err+= add_space(fptr); - err+= add_space(fptr); - } + err+= str.append(STRING_WITH_LEN(",\n ")); else - err+= add_end_parenthesis(fptr); + err+= str.append(')'); } while (++j < num_subparts); } } if (i == (tot_num_parts-1)) - err+= add_end_parenthesis(fptr); + err+= str.append(')'); } while (++i < tot_num_parts); } if (err) - goto close_file; - buffer_length= mysql_file_seek(fptr, 0L, MY_SEEK_END, MYF(0)); - if (unlikely(buffer_length == MY_FILEPOS_ERROR)) - goto close_file; - if (unlikely(mysql_file_seek(fptr, 0L, MY_SEEK_SET, MYF(0)) - == MY_FILEPOS_ERROR)) - goto close_file; - *buf_length= (uint)buffer_length; - if (use_sql_alloc) - buf= (char*) thd->alloc(*buf_length + 1); - else - buf= (char*) my_malloc(*buf_length+1, MYF(MY_WME)); - if (!buf) - goto close_file; - - if (unlikely(mysql_file_read(fptr, (uchar*)buf, *buf_length, MYF(MY_FNABP)))) - { - if (!use_sql_alloc) - my_free(buf); - buf= NULL; - } - else - buf[*buf_length]= 0; - -close_file: - mysql_file_close(fptr, MYF(0)); - DBUG_RETURN(buf); + DBUG_RETURN(NULL); + *buf_length= str.length(); + DBUG_RETURN(thd->strmake(str.ptr(), str.length())); } @@ -4372,39 +4110,6 @@ bool mysql_unpack_partition(THD *thd, DBUG_ASSERT(part_info->default_engine_type == default_db_type); DBUG_ASSERT(part_info->default_engine_type->db_type != DB_TYPE_UNKNOWN); DBUG_ASSERT(part_info->default_engine_type != partition_hton); - - { - /* - This code part allocates memory for the serialised item information for - the partition functions. In most cases this is not needed but if the - table is used for SHOW CREATE TABLES or ALTER TABLE that modifies - partition information it is needed and the info is lost if we don't - save it here so unfortunately we have to do it here even if in most - cases it is not needed. This is a consequence of that item trees are - not serialisable. - */ - uint part_func_len= part_info->part_func_len; - uint subpart_func_len= part_info->subpart_func_len; - char *part_func_string= NULL; - char *subpart_func_string= NULL; - if ((part_func_len && - !((part_func_string= (char*) thd->alloc(part_func_len)))) || - (subpart_func_len && - !((subpart_func_string= (char*) thd->alloc(subpart_func_len))))) - { - mem_alloc_error(part_func_len); - thd->free_items(); - goto end; - } - if (part_func_len) - memcpy(part_func_string, part_info->part_func_string, part_func_len); - if (subpart_func_len) - memcpy(subpart_func_string, part_info->subpart_func_string, - subpart_func_len); - part_info->part_func_string= part_func_string; - part_info->subpart_func_string= subpart_func_string; - } - result= FALSE; end: end_lex_with_single_table(thd, table, old_lex); @@ -6011,8 +5716,8 @@ static bool write_log_changed_partitions(ALTER_PARTITION_PARAM_TYPE *lpt, DDL_LOG_ENTRY ddl_log_entry; partition_info *part_info= lpt->part_info; DDL_LOG_MEMORY_ENTRY *log_entry; - char tmp_path[FN_REFLEN]; - char normal_path[FN_REFLEN]; + char tmp_path[FN_REFLEN + 1]; + char normal_path[FN_REFLEN + 1]; List_iterator part_it(part_info->partitions); uint temp_partitions= part_info->temp_partitions.elements; uint num_elements= part_info->partitions.elements; @@ -6036,14 +5741,15 @@ static bool write_log_changed_partitions(ALTER_PARTITION_PARAM_TYPE *lpt, ddl_log_entry.next_entry= *next_entry; ddl_log_entry.handler_name= ha_resolve_storage_engine_name(sub_elem->engine_type); - create_subpartition_name(tmp_path, path, - part_elem->partition_name, - sub_elem->partition_name, - TEMP_PART_NAME); - create_subpartition_name(normal_path, path, - part_elem->partition_name, - sub_elem->partition_name, - NORMAL_PART_NAME); + if (create_subpartition_name(tmp_path, sizeof(tmp_path), path, + part_elem->partition_name, + sub_elem->partition_name, + TEMP_PART_NAME) || + create_subpartition_name(normal_path, sizeof(normal_path), path, + part_elem->partition_name, + sub_elem->partition_name, + NORMAL_PART_NAME)) + DBUG_RETURN(TRUE); ddl_log_entry.name= normal_path; ddl_log_entry.from_name= tmp_path; if (part_elem->part_state == PART_IS_CHANGED) @@ -6064,12 +5770,13 @@ static bool write_log_changed_partitions(ALTER_PARTITION_PARAM_TYPE *lpt, ddl_log_entry.next_entry= *next_entry; ddl_log_entry.handler_name= ha_resolve_storage_engine_name(part_elem->engine_type); - create_partition_name(tmp_path, path, - part_elem->partition_name, - TEMP_PART_NAME, TRUE); - create_partition_name(normal_path, path, - part_elem->partition_name, - NORMAL_PART_NAME, TRUE); + if (create_partition_name(tmp_path, sizeof(tmp_path), path, + part_elem->partition_name, TEMP_PART_NAME, + TRUE) || + create_partition_name(normal_path, sizeof(normal_path), path, + part_elem->partition_name, NORMAL_PART_NAME, + TRUE)) + DBUG_RETURN(TRUE); ddl_log_entry.name= normal_path; ddl_log_entry.from_name= tmp_path; if (part_elem->part_state == PART_IS_CHANGED) @@ -6108,7 +5815,7 @@ static bool write_log_dropped_partitions(ALTER_PARTITION_PARAM_TYPE *lpt, DDL_LOG_ENTRY ddl_log_entry; partition_info *part_info= lpt->part_info; DDL_LOG_MEMORY_ENTRY *log_entry; - char tmp_path[FN_LEN]; + char tmp_path[FN_REFLEN + 1]; List_iterator part_it(part_info->partitions); List_iterator temp_it(part_info->temp_partitions); uint num_temp_partitions= part_info->temp_partitions.elements; @@ -6147,10 +5854,10 @@ static bool write_log_dropped_partitions(ALTER_PARTITION_PARAM_TYPE *lpt, ddl_log_entry.next_entry= *next_entry; ddl_log_entry.handler_name= ha_resolve_storage_engine_name(sub_elem->engine_type); - create_subpartition_name(tmp_path, path, - part_elem->partition_name, - sub_elem->partition_name, - name_variant); + if (create_subpartition_name(tmp_path, sizeof(tmp_path), path, + part_elem->partition_name, + sub_elem->partition_name, name_variant)) + DBUG_RETURN(TRUE); ddl_log_entry.name= tmp_path; if (write_ddl_log_entry(&ddl_log_entry, &log_entry)) { @@ -6166,9 +5873,10 @@ static bool write_log_dropped_partitions(ALTER_PARTITION_PARAM_TYPE *lpt, ddl_log_entry.next_entry= *next_entry; ddl_log_entry.handler_name= ha_resolve_storage_engine_name(part_elem->engine_type); - create_partition_name(tmp_path, path, - part_elem->partition_name, - name_variant, TRUE); + if (create_partition_name(tmp_path, sizeof(tmp_path), path, + part_elem->partition_name, name_variant, + TRUE)) + DBUG_RETURN(TRUE); ddl_log_entry.name= tmp_path; if (write_ddl_log_entry(&ddl_log_entry, &log_entry)) { @@ -8326,31 +8034,41 @@ static uint32 get_next_subpartition_via_walking(PARTITION_ITERATOR *part_iter) return res; } +/* used in error messages below */ +static const char *longest_str(const char *s1, const char *s2, + const char *s3=0) +{ + if (strlen(s2) > strlen(s1)) s1= s2; + if (s3 && strlen(s3) > strlen(s1)) s1= s3; + return s1; +} + /* Create partition names SYNOPSIS create_partition_name() - out:out Created partition name string + out:out The buffer for the created partition name string + must be *at least* of FN_REFLEN+1 bytes in1 First part in2 Second part name_variant Normal, temporary or renamed partition name RETURN VALUE - NONE + 0 if ok, error if name too long DESCRIPTION This method is used to calculate the partition name, service routine to the del_ren_cre_table method. */ -void create_partition_name(char *out, const char *in1, - const char *in2, uint name_variant, - bool translate) +int create_partition_name(char *out, size_t outlen, const char *in1, + const char *in2, uint name_variant, bool translate) { char transl_part_name[FN_REFLEN]; - const char *transl_part; + const char *transl_part, *end; + DBUG_ASSERT(outlen >= FN_REFLEN + 1); // consistency! same limit everywhere if (translate) { @@ -8360,11 +8078,17 @@ void create_partition_name(char *out, const char *in1, else transl_part= in2; if (name_variant == NORMAL_PART_NAME) - strxmov(out, in1, "#P#", transl_part, NullS); + end= strxnmov(out, outlen-1, in1, "#P#", transl_part, NullS); else if (name_variant == TEMP_PART_NAME) - strxmov(out, in1, "#P#", transl_part, "#TMP#", NullS); + end= strxnmov(out, outlen-1, in1, "#P#", transl_part, "#TMP#", NullS); else if (name_variant == RENAMED_PART_NAME) - strxmov(out, in1, "#P#", transl_part, "#REN#", NullS); + end= strxnmov(out, outlen-1, in1, "#P#", transl_part, "#REN#", NullS); + if (end - out == static_cast(outlen-1)) + { + my_error(ER_PATH_LENGTH, MYF(0), longest_str(in1, transl_part)); + return HA_WRONG_CREATE_OPTION; + } + return 0; } @@ -8373,37 +8097,46 @@ void create_partition_name(char *out, const char *in1, SYNOPSIS create_subpartition_name() - out:out Created partition name string + out:out The buffer for the created partition name string + must be *at least* of FN_REFLEN+1 bytes in1 First part in2 Second part in3 Third part name_variant Normal, temporary or renamed partition name RETURN VALUE - NONE + 0 if ok, error if name too long DESCRIPTION This method is used to calculate the subpartition name, service routine to the del_ren_cre_table method. */ -void create_subpartition_name(char *out, const char *in1, - const char *in2, const char *in3, - uint name_variant) +int create_subpartition_name(char *out, size_t outlen, + const char *in1, const char *in2, + const char *in3, uint name_variant) { - char transl_part_name[FN_REFLEN], transl_subpart_name[FN_REFLEN]; + char transl_part_name[FN_REFLEN], transl_subpart_name[FN_REFLEN], *end; + DBUG_ASSERT(outlen >= FN_REFLEN + 1); // consistency! same limit everywhere tablename_to_filename(in2, transl_part_name, FN_REFLEN); tablename_to_filename(in3, transl_subpart_name, FN_REFLEN); if (name_variant == NORMAL_PART_NAME) - strxmov(out, in1, "#P#", transl_part_name, - "#SP#", transl_subpart_name, NullS); + end= strxnmov(out, outlen-1, in1, "#P#", transl_part_name, + "#SP#", transl_subpart_name, NullS); else if (name_variant == TEMP_PART_NAME) - strxmov(out, in1, "#P#", transl_part_name, - "#SP#", transl_subpart_name, "#TMP#", NullS); + end= strxnmov(out, outlen-1, in1, "#P#", transl_part_name, + "#SP#", transl_subpart_name, "#TMP#", NullS); else if (name_variant == RENAMED_PART_NAME) - strxmov(out, in1, "#P#", transl_part_name, - "#SP#", transl_subpart_name, "#REN#", NullS); + end= strxnmov(out, outlen-1, in1, "#P#", transl_part_name, + "#SP#", transl_subpart_name, "#REN#", NullS); + if (end - out == static_cast(outlen-1)) + { + my_error(ER_PATH_LENGTH, MYF(0), + longest_str(in1, transl_part_name, transl_subpart_name)); + return HA_WRONG_CREATE_OPTION; + } + return 0; } uint get_partition_field_store_length(Field *field) diff --git a/sql/sql_partition.h b/sql/sql_partition.h index c2665a8366b..2d0ec788332 100644 --- a/sql/sql_partition.h +++ b/sql/sql_partition.h @@ -267,11 +267,10 @@ uint prep_alter_part_table(THD *thd, TABLE *table, Alter_info *alter_info, bool *partition_changed, bool *fast_alter_table); char *generate_partition_syntax(THD *thd, partition_info *part_info, - uint *buf_length, bool use_sql_alloc, + uint *buf_length, bool show_partition_options, HA_CREATE_INFO *create_info, - Alter_info *alter_info, - const char *current_comment_start); + Alter_info *alter_info); bool verify_data_with_partition(TABLE *table, TABLE *part_table, uint32 part_id); bool compare_partition_options(HA_CREATE_INFO *table_create_info, @@ -281,16 +280,14 @@ bool partition_key_modified(TABLE *table, const MY_BITMAP *fields); #define partition_key_modified(X,Y) 0 #endif -void create_partition_name(char *out, const char *in1, - const char *in2, uint name_variant, - bool translate); -void create_subpartition_name(char *out, const char *in1, - const char *in2, const char *in3, - uint name_variant); +int __attribute__((warn_unused_result)) + create_partition_name(char *out, size_t outlen, const char *in1, const char + *in2, uint name_variant, bool translate); +int __attribute__((warn_unused_result)) + create_subpartition_name(char *out, size_t outlen, const char *in1, const + char *in2, const char *in3, uint name_variant); void set_key_field_ptr(KEY *key_info, const uchar *new_buf, const uchar *old_buf); -extern const LEX_STRING partition_keywords[]; - #endif /* SQL_PARTITION_INCLUDED */ diff --git a/sql/sql_partition_admin.cc b/sql/sql_partition_admin.cc index 18f25ab7cf7..ff6c05c4215 100644 --- a/sql/sql_partition_admin.cc +++ b/sql/sql_partition_admin.cc @@ -89,9 +89,15 @@ bool Sql_cmd_alter_table_exchange_partition::execute(THD *thd) /* Not allowed with EXCHANGE PARTITION */ DBUG_ASSERT(!create_info.data_file_name && !create_info.index_file_name); + WSREP_TO_ISOLATION_BEGIN_WRTCHK(NULL, NULL, first_table); thd->enable_slow_log= opt_log_slow_admin_statements; DBUG_RETURN(exchange_partition(thd, first_table, &alter_info)); +#ifdef WITH_WSREP + error: + /* handle errors in TO_ISOLATION here */ + DBUG_RETURN(true); +#endif /* WITH_WSREP */ } @@ -493,7 +499,7 @@ bool Sql_cmd_alter_table_exchange_partition:: partition_element *part_elem; char *partition_name; char temp_name[FN_REFLEN+1]; - char part_file_name[FN_REFLEN+1]; + char part_file_name[2*FN_REFLEN+1]; char swap_file_name[FN_REFLEN+1]; char temp_file_name[FN_REFLEN+1]; uint swap_part_id; @@ -532,21 +538,6 @@ bool Sql_cmd_alter_table_exchange_partition:: &alter_prelocking_strategy)) DBUG_RETURN(true); -#ifdef WITH_WSREP - if (WSREP_ON) - { - if ((!thd->is_current_stmt_binlog_format_row() || - /* TODO: Do we really need to check for temp tables in this case? */ - !thd->find_temporary_table(table_list)) && - wsrep_to_isolation_begin(thd, table_list->db, table_list->table_name, - NULL)) - { - WSREP_WARN("ALTER TABLE EXCHANGE PARTITION isolation failure"); - DBUG_RETURN(TRUE); - } - } -#endif /* WITH_WSREP */ - part_table= table_list->table; swap_table= swap_table_list->table; @@ -588,9 +579,9 @@ bool Sql_cmd_alter_table_exchange_partition:: temp_name, "", FN_IS_TMP); if (!(part_elem= part_table->part_info->get_part_elem(partition_name, - part_file_name + - part_file_name_len, - &swap_part_id))) + part_file_name + part_file_name_len, + sizeof(part_file_name) - part_file_name_len, + &swap_part_id))) { // my_error(ER_UNKNOWN_PARTITION, MYF(0), partition_name, // part_table->alias); @@ -785,7 +776,7 @@ bool Sql_cmd_alter_table_truncate_partition::execute(THD *thd) (!thd->is_current_stmt_binlog_format_row() || !thd->find_temporary_table(first_table)) && wsrep_to_isolation_begin( - thd, first_table->db, first_table->table_name, NULL) + thd, first_table->db, first_table->table_name, NULL) ) { WSREP_WARN("ALTER TABLE TRUNCATE PARTITION isolation failure"); diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc index 101ea3fd3c7..97ef24f44ed 100644 --- a/sql/sql_plugin.cc +++ b/sql/sql_plugin.cc @@ -1,6 +1,6 @@ /* Copyright (c) 2005, 2013, Oracle and/or its affiliates. - Copyright (c) 2010, 2014, SkySQL Ab. + Copyright (c) 2010, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -327,6 +327,12 @@ static plugin_ref intern_plugin_lock(LEX *lex, plugin_ref plugin); static void intern_plugin_unlock(LEX *lex, plugin_ref plugin); static void reap_plugins(void); +bool plugin_is_forced(struct st_plugin_int *p) +{ + return p->load_option == PLUGIN_FORCE || + p->load_option == PLUGIN_FORCE_PLUS_PERMANENT; +} + static void report_error(int where_to, uint error, ...) { va_list args; @@ -1397,7 +1403,7 @@ static int plugin_initialize(MEM_ROOT *tmp_root, struct st_plugin_int *plugin, if (options_only || state == PLUGIN_IS_DISABLED) { - ret= 0; + ret= !options_only && plugin_is_forced(plugin); state= PLUGIN_IS_DISABLED; goto err; } @@ -1617,22 +1623,28 @@ int plugin_init(int *argc, char **argv, int flags) } } - /* First, we initialize only MyISAM - that should always succeed */ - plugin_ptr= plugin_find_internal(&MyISAM, MYSQL_STORAGE_ENGINE_PLUGIN); - DBUG_ASSERT(plugin_ptr); - DBUG_ASSERT(plugin_ptr->load_option == PLUGIN_FORCE); - - if (plugin_initialize(&tmp_root, plugin_ptr, argc, argv, false)) - goto err_unlock; - /* - set the global default storage engine variable so that it will - not be null in any child thread. + First, we initialize only MyISAM - that should almost always succeed + (almost always, because plugins can be loaded outside of the server, too). */ - global_system_variables.table_plugin= - intern_plugin_lock(NULL, plugin_int_to_ref(plugin_ptr)); - DBUG_ASSERT(plugin_ptr->ref_count == 1); + plugin_ptr= plugin_find_internal(&MyISAM, MYSQL_STORAGE_ENGINE_PLUGIN); + DBUG_ASSERT(plugin_ptr || !mysql_mandatory_plugins[0]); + if (plugin_ptr) + { + DBUG_ASSERT(plugin_ptr->load_option == PLUGIN_FORCE); + if (plugin_initialize(&tmp_root, plugin_ptr, argc, argv, false)) + goto err_unlock; + + /* + set the global default storage engine variable so that it will + not be null in any child thread. + */ + global_system_variables.table_plugin = + intern_plugin_lock(NULL, plugin_int_to_ref(plugin_ptr)); + DBUG_ASSERT(plugin_ptr->ref_count == 1); + + } mysql_mutex_unlock(&LOCK_plugin); /* Register (not initialize!) all dynamic plugins */ @@ -1705,8 +1717,7 @@ int plugin_init(int *argc, char **argv, int flags) while ((plugin_ptr= *(--reap))) { mysql_mutex_unlock(&LOCK_plugin); - if (plugin_ptr->load_option == PLUGIN_FORCE || - plugin_ptr->load_option == PLUGIN_FORCE_PLUS_PERMANENT) + if (plugin_is_forced(plugin_ptr)) reaped_mandatory_plugin= TRUE; plugin_deinitialize(plugin_ptr, true); mysql_mutex_lock(&LOCK_plugin); @@ -1854,8 +1865,8 @@ static bool plugin_load_list(MEM_ROOT *tmp_root, const char *list) switch ((*(p++)= *(list++))) { case '\0': list= NULL; /* terminate the loop */ - /* fall through */ #ifndef __WIN__ + /* fall through */ case ':': /* can't use this as delimiter as it may be drive letter */ #endif case ';': @@ -1896,6 +1907,7 @@ static bool plugin_load_list(MEM_ROOT *tmp_root, const char *list) str->str= p; continue; } + /* fall through */ default: str->length++; continue; @@ -3659,8 +3671,7 @@ static int construct_options(MEM_ROOT *mem_root, struct st_plugin_int *tmp, plugin_dash.length + 1); strxmov(plugin_name_with_prefix_ptr, plugin_dash.str, plugin_name_ptr, NullS); - if (tmp->load_option != PLUGIN_FORCE && - tmp->load_option != PLUGIN_FORCE_PLUS_PERMANENT) + if (!plugin_is_forced(tmp)) { /* support --skip-plugin-foo syntax */ options[0].name= plugin_name_ptr; @@ -4047,8 +4058,11 @@ static int test_plugin_options(MEM_ROOT *tmp_root, struct st_plugin_int *tmp, my_afree(tmp_backup); } - if (tmp->load_option != PLUGIN_FORCE && - tmp->load_option != PLUGIN_FORCE_PLUS_PERMANENT) + /* + We adjust the default value to account for the hardcoded exceptions + we have set for the federated and ndbcluster storage engines. + */ + if (!plugin_is_forced(tmp)) opts[0].def_value= opts[1].def_value= plugin_load_option; error= handle_options(argc, &argv, opts, mark_changed); @@ -4064,8 +4078,7 @@ static int test_plugin_options(MEM_ROOT *tmp_root, struct st_plugin_int *tmp, Set plugin loading policy from option value. First element in the option list is always the option value. */ - if (tmp->load_option != PLUGIN_FORCE && - tmp->load_option != PLUGIN_FORCE_PLUS_PERMANENT) + if (!plugin_is_forced(tmp)) plugin_load_option= (enum_plugin_load_option) *(ulong*) opts[0].value; } diff --git a/sql/sql_plugin_services.ic b/sql/sql_plugin_services.ic index 2e71fac50be..ea6aefa5993 100644 --- a/sql/sql_plugin_services.ic +++ b/sql/sql_plugin_services.ic @@ -133,7 +133,7 @@ static struct base64_service_st base64_handler= { my_base64_decode }; -static struct thd_error_context_service_st thd_error_conext_handler= { +static struct thd_error_context_service_st thd_error_context_handler= { thd_get_error_message, thd_get_error_number, thd_get_error_row, @@ -196,6 +196,24 @@ static struct encryption_scheme_service_st encryption_scheme_handler= encryption_scheme_decrypt }; +static struct my_crypt_service_st crypt_handler= +{ + my_aes_crypt_init, + my_aes_crypt_update, + my_aes_crypt_finish, + my_aes_crypt, + my_aes_get_size, + my_aes_ctx_size, + my_random_bytes +}; + +static struct my_print_error_service_st my_print_error_handler= +{ + my_error, + my_printf_error, + my_printv_error +}; + static struct st_service_ref list_of_services[]= { { "base64_service", VERSION_base64, &base64_handler }, @@ -203,19 +221,21 @@ static struct st_service_ref list_of_services[]= { "encryption_scheme_service", VERSION_encryption_scheme, &encryption_scheme_handler }, { "encryption_service", VERSION_encryption, &encryption_handler }, { "logger_service", VERSION_logger, &logger_service_handler }, + { "my_crypt_service", VERSION_my_crypt, &crypt_handler}, { "my_md5_service", VERSION_my_md5, &my_md5_handler}, + { "my_print_error_service", VERSION_my_print_error, &my_print_error_handler}, { "my_sha1_service", VERSION_my_sha1, &my_sha1_handler}, { "my_sha2_service", VERSION_my_sha2, &my_sha2_handler}, { "my_snprintf_service", VERSION_my_snprintf, &my_snprintf_handler }, { "progress_report_service", VERSION_progress_report, &progress_report_handler }, { "thd_alloc_service", VERSION_thd_alloc, &thd_alloc_handler }, { "thd_autoinc_service", VERSION_thd_autoinc, &thd_autoinc_handler }, - { "thd_error_context_service", VERSION_thd_error_context, &thd_error_conext_handler }, + { "thd_error_context_service", VERSION_thd_error_context, &thd_error_context_handler }, { "thd_kill_statement_service", VERSION_kill_statement, &thd_kill_statement_handler }, { "thd_rnd_service", VERSION_thd_rnd, &thd_rnd_handler }, { "thd_specifics_service", VERSION_thd_specifics, &thd_specifics_handler }, { "thd_timezone_service", VERSION_thd_timezone, &thd_timezone_handler }, { "thd_wait_service", VERSION_thd_wait, &thd_wait_handler }, - { "wsrep_service", VERSION_wsrep, &wsrep_handler }, + { "wsrep_service", VERSION_wsrep, &wsrep_handler } }; diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 4b2d8b5fb36..c8ebbb08f15 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2002, 2015, Oracle and/or its affiliates. - Copyright (c) 2008, 2016, MariaDB + Copyright (c) 2008, 2017, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -164,7 +164,6 @@ public: Server_side_cursor *cursor; uchar *packet; uchar *packet_end; - ulong iterations; uint param_count; uint last_errno; uint flags; @@ -183,7 +182,9 @@ public: */ uint select_number_after_prepare; char last_error[MYSQL_ERRMSG_SIZE]; + my_bool iterations; my_bool start_param; + my_bool read_types; #ifndef EMBEDDED_LIBRARY bool (*set_params)(Prepared_statement *st, uchar *data, uchar *data_end, uchar *read_pos, String *expanded_query); @@ -213,11 +214,10 @@ public: uchar *packet_arg, uchar *packet_end_arg); bool execute_bulk_loop(String *expanded_query, bool open_cursor, - uchar *packet_arg, uchar *packet_end_arg, - ulong iterations); + uchar *packet_arg, uchar *packet_end_arg); bool execute_server_runnable(Server_runnable *server_runnable); my_bool set_bulk_parameters(bool reset); - ulong bulk_iterations(); + bool bulk_iterations() { return iterations; }; /* Destroy this statement */ void deallocate(); bool execute_immediate(const char *query, uint query_length); @@ -825,8 +825,10 @@ static void setup_one_conversion_function(THD *thd, Item_param *param, */ inline bool is_param_long_data_type(Item_param *param) { - return ((param->field_type() >= MYSQL_TYPE_TINY_BLOB) && - (param->field_type() <= MYSQL_TYPE_STRING)); + enum_field_types field_type= param->field_type(); + return (((field_type >= MYSQL_TYPE_TINY_BLOB) && + (field_type <= MYSQL_TYPE_STRING)) || + field_type == MYSQL_TYPE_VARCHAR); } @@ -935,6 +937,7 @@ static bool insert_params(Prepared_statement *stmt, uchar *null_array, for (Item_param **it= begin; it < end; ++it) { Item_param *param= *it; + param->indicator= STMT_INDICATOR_NONE; // only for bulk parameters if (!param->has_long_data_value()) { if (is_param_null(null_array, (uint) (it - begin))) @@ -979,10 +982,7 @@ static bool insert_bulk_params(Prepared_statement *stmt, param->reset(); if (!param->has_long_data_value()) { - if (param->indicators) - param->indicator= (enum_indicator_type) *((*read_pos)++); - else - param->indicator= STMT_INDICATOR_NONE; + param->indicator= (enum_indicator_type) *((*read_pos)++); if ((*read_pos) > data_end) DBUG_RETURN(1); switch (param->indicator) @@ -993,6 +993,8 @@ static bool insert_bulk_params(Prepared_statement *stmt, param->set_param_func(param, read_pos, (uint) (data_end - (*read_pos))); if (param->has_no_value()) DBUG_RETURN(1); + if (param->convert_str_value(stmt->thd)) + DBUG_RETURN(1); /* out of memory */ break; case STMT_INDICATOR_NULL: param->set_null(); @@ -1011,6 +1013,36 @@ static bool insert_bulk_params(Prepared_statement *stmt, DBUG_RETURN(0); } +static bool set_conversion_functions(Prepared_statement *stmt, + uchar **data, uchar *data_end) +{ + uchar *read_pos= *data; + const uint signed_bit= 1 << 15; + DBUG_ENTER("set_conversion_functions"); + /* + First execute or types altered by the client, setup the + conversion routines for all parameters (one time) + */ + Item_param **it= stmt->param_array; + Item_param **end= it + stmt->param_count; + THD *thd= stmt->thd; + for (; it < end; ++it) + { + ushort typecode; + + if (read_pos >= data_end) + DBUG_RETURN(1); + + typecode= sint2korr(read_pos); + read_pos+= 2; + (**it).unsigned_flag= MY_TEST(typecode & signed_bit); + setup_one_conversion_function(thd, *it, (uchar) (typecode & 0xff)); + } + *data= read_pos; + DBUG_RETURN(0); +} + + static bool setup_conversion_functions(Prepared_statement *stmt, uchar **data, uchar *data_end, bool bulk_protocol= 0) @@ -1024,30 +1056,9 @@ static bool setup_conversion_functions(Prepared_statement *stmt, if (*read_pos++) //types supplied / first execute { - /* - First execute or types altered by the client, setup the - conversion routines for all parameters (one time) - */ - Item_param **it= stmt->param_array; - Item_param **end= it + stmt->param_count; - THD *thd= stmt->thd; - for (; it < end; ++it) - { - ushort typecode; - const uint signed_bit= 1 << 15; - const uint indicators_bit= 1 << 14; - - if (read_pos >= data_end) - DBUG_RETURN(1); - - typecode= sint2korr(read_pos); - read_pos+= 2; - (**it).unsigned_flag= MY_TEST(typecode & signed_bit); - if (bulk_protocol) - (**it).indicators= MY_TEST(typecode & indicators_bit); - setup_one_conversion_function(thd, *it, - (uchar) (typecode & 0xff)); - } + *data= read_pos; + bool res= set_conversion_functions(stmt, data, data_end); + DBUG_RETURN(res); } *data= read_pos; DBUG_RETURN(0); @@ -1579,7 +1590,7 @@ static int mysql_test_select(Prepared_statement *stmt, } if (open_normal_and_derived_tables(thd, tables, MYSQL_OPEN_FORCE_SHARED_MDL, - DT_PREPARE | DT_CREATE)) + DT_INIT | DT_PREPARE | DT_CREATE)) goto error; thd->lex->used_tables= 0; // Updated by setup_fields @@ -2086,11 +2097,11 @@ static bool mysql_test_create_view(Prepared_statement *stmt) if (thd->open_temporary_tables(tables)) goto err; + lex->context_analysis_only|= CONTEXT_ANALYSIS_ONLY_VIEW; if (open_normal_and_derived_tables(thd, tables, MYSQL_OPEN_FORCE_SHARED_MDL, DT_PREPARE)) goto err; - lex->context_analysis_only|= CONTEXT_ANALYSIS_ONLY_VIEW; res= select_like_stmt_test(stmt, 0, 0); err: @@ -2356,7 +2367,7 @@ static bool check_prepared_statement(Prepared_statement *stmt) /* mysql_test_update returns 2 if we need to switch to multi-update */ if (res != 2) break; - + /* fall through */ case SQLCOM_UPDATE_MULTI: res= mysql_test_multiupdate(stmt, tables, res == 2); break; @@ -3032,6 +3043,14 @@ static void reset_stmt_params(Prepared_statement *stmt) } +static void mysql_stmt_execute_common(THD *thd, + ulong stmt_id, + uchar *packet, + uchar *packet_end, + ulong cursor_flags, + bool iteration, + bool types); + /** COM_STMT_EXECUTE handler: execute a previously prepared statement. @@ -3054,21 +3073,92 @@ void mysqld_stmt_execute(THD *thd, char *packet_arg, uint packet_length) uchar *packet= (uchar*)packet_arg; // GCC 4.0.1 workaround ulong stmt_id= uint4korr(packet); ulong flags= (ulong) packet[4]; -#ifndef EMBEDDED_LIBRARY - ulong iterations= uint4korr(packet + 5); -#else - ulong iterations= 0; // no support -#endif - /* Query text for binary, general or slow log, if any of them is open */ - String expanded_query; uchar *packet_end= packet + packet_length; - Prepared_statement *stmt; - Protocol *save_protocol= thd->protocol; - bool open_cursor; DBUG_ENTER("mysqld_stmt_execute"); packet+= 9; /* stmt_id + 5 bytes of flags */ + mysql_stmt_execute_common(thd, stmt_id, packet, packet_end, flags, FALSE, + FALSE); + DBUG_VOID_RETURN; +} + + +/** + COM_STMT_BULK_EXECUTE handler: execute a previously prepared statement. + + If there are any parameters, then replace parameter markers with the + data supplied from the client, and then execute the statement. + This function uses binary protocol to send a possible result set + to the client. + + @param thd current thread + @param packet_arg parameter types and data, if any + @param packet_length packet length, including the terminator character. + + @return + none: in case of success OK packet or a result set is sent to the + client, otherwise an error message is set in THD. +*/ + +void mysqld_stmt_bulk_execute(THD *thd, char *packet_arg, uint packet_length) +{ + uchar *packet= (uchar*)packet_arg; // GCC 4.0.1 workaround + ulong stmt_id= uint4korr(packet); + uint flags= (uint) uint2korr(packet + 4); + uchar *packet_end= packet + packet_length; + DBUG_ENTER("mysqld_stmt_execute_bulk"); + + if (!(thd->client_capabilities & + MARIADB_CLIENT_STMT_BULK_OPERATIONS)) + { + DBUG_PRINT("error", + ("An attempt to execute bulk operation without support")); + my_error(ER_UNSUPPORTED_PS, MYF(0)); + } + /* Check for implemented parameters */ + if (flags & (~STMT_BULK_FLAG_CLIENT_SEND_TYPES)) + { + DBUG_PRINT("error", ("unsupported bulk execute flags %x", flags)); + my_error(ER_UNSUPPORTED_PS, MYF(0)); + } + + /* stmt id and two bytes of flags */ + packet+= 4 + 2; + mysql_stmt_execute_common(thd, stmt_id, packet, packet_end, 0, TRUE, + (flags & STMT_BULK_FLAG_CLIENT_SEND_TYPES)); + DBUG_VOID_RETURN; +} + + +/** + Common part of prepared statement execution + + @param thd THD handle + @param stmt_id id of the prepared statement + @param paket packet with parameters to bind + @param packet_end pointer to the byte after parameters end + @param cursor_flags cursor flags + @param bulk_op id it bulk operation + @param read_types flag say that types muast been read +*/ + +static void mysql_stmt_execute_common(THD *thd, + ulong stmt_id, + uchar *packet, + uchar *packet_end, + ulong cursor_flags, + bool bulk_op, + bool read_types) +{ + /* Query text for binary, general or slow log, if any of them is open */ + String expanded_query; + Prepared_statement *stmt; + Protocol *save_protocol= thd->protocol; + bool open_cursor; + DBUG_ENTER("mysqld_stmt_execute_common"); + DBUG_ASSERT((!read_types) || (read_types && bulk_op)); + /* First of all clear possible warnings from the previous command */ thd->reset_for_next_command(); @@ -3079,21 +3169,21 @@ void mysqld_stmt_execute(THD *thd, char *packet_arg, uint packet_length) llstr(stmt_id, llbuf), "mysqld_stmt_execute"); DBUG_VOID_RETURN; } + stmt->read_types= read_types; #if defined(ENABLED_PROFILING) thd->profiling.set_query_source(stmt->query(), stmt->query_length()); #endif DBUG_PRINT("exec_query", ("%s", stmt->query())); - DBUG_PRINT("info",("stmt: %p iterations: %lu", stmt, iterations)); + DBUG_PRINT("info",("stmt: %p bulk_op %d", stmt, bulk_op)); - open_cursor= MY_TEST(flags & (ulong) CURSOR_TYPE_READ_ONLY); + open_cursor= MY_TEST(cursor_flags & (ulong) CURSOR_TYPE_READ_ONLY); thd->protocol= &thd->protocol_binary; - if (iterations <= 1) + if (!bulk_op) stmt->execute_loop(&expanded_query, open_cursor, packet, packet_end); else - stmt->execute_bulk_loop(&expanded_query, open_cursor, packet, packet_end, - iterations); + stmt->execute_bulk_loop(&expanded_query, open_cursor, packet, packet_end); thd->protocol= save_protocol; sp_cache_enforce_limit(thd->sp_proc_cache, stored_program_cache_size); @@ -3436,7 +3526,7 @@ void mysql_stmt_get_longdata(THD *thd, char *packet, ulong packet_length) { stmt->state= Query_arena::STMT_ERROR; stmt->last_errno= thd->get_stmt_da()->sql_errno(); - strncpy(stmt->last_error, thd->get_stmt_da()->message(), MYSQL_ERRMSG_SIZE); + strmake_buf(stmt->last_error, thd->get_stmt_da()->message()); } thd->set_stmt_da(save_stmt_da); @@ -3600,11 +3690,12 @@ Prepared_statement::Prepared_statement(THD *thd_arg) cursor(0), packet(0), packet_end(0), - iterations(0), param_count(0), last_errno(0), flags((uint) IS_IN_USE), + iterations(0), start_param(0), + read_types(0), m_sql_mode(thd->variables.sql_mode) { init_sql_alloc(&main_mem_root, thd_arg->variables.query_alloc_block_size, @@ -3641,7 +3732,7 @@ void Prepared_statement::setup_set_params() set_params_from_actual_params= insert_params_from_actual_params_with_log; #ifndef EMBEDDED_LIBRARY set_params= insert_params_with_log; - set_bulk_params= insert_bulk_params; // TODO: add binlog support + set_bulk_params= insert_bulk_params; // RBR is on for bulk operation #else //TODO: add bulk support for bulk parameters set_params_data= emb_insert_params_with_log; @@ -4023,7 +4114,7 @@ Prepared_statement::execute_loop(String *expanded_query, Reprepare_observer reprepare_observer; bool error; int reprepare_attempt= 0; - iterations= 0; + iterations= FALSE; /* - In mysql_sql_stmt_execute() we hide all "external" Items @@ -4126,11 +4217,11 @@ my_bool bulk_parameters_set(THD *thd) DBUG_RETURN(FALSE); } -ulong bulk_parameters_iterations(THD *thd) +my_bool bulk_parameters_iterations(THD *thd) { Prepared_statement *stmt= (Prepared_statement *) thd->bulk_param; if (!stmt) - return 1; + return FALSE; return stmt->bulk_iterations(); } @@ -4138,7 +4229,8 @@ ulong bulk_parameters_iterations(THD *thd) my_bool Prepared_statement::set_bulk_parameters(bool reset) { DBUG_ENTER("Prepared_statement::set_bulk_parameters"); - DBUG_PRINT("info", ("iteration: %lu", iterations)); + DBUG_PRINT("info", ("iteration: %d", iterations)); + if (iterations) { #ifndef EMBEDDED_LIBRARY @@ -4152,31 +4244,24 @@ my_bool Prepared_statement::set_bulk_parameters(bool reset) reset_stmt_params(this); DBUG_RETURN(true); } - iterations--; + if (packet >= packet_end) + iterations= FALSE; } start_param= 0; DBUG_RETURN(false); } -ulong Prepared_statement::bulk_iterations() -{ - if (iterations) - return iterations; - return start_param ? 1 : 0; -} - bool Prepared_statement::execute_bulk_loop(String *expanded_query, bool open_cursor, uchar *packet_arg, - uchar *packet_end_arg, - ulong iterations_arg) + uchar *packet_end_arg) { Reprepare_observer reprepare_observer; bool error= 0; packet= packet_arg; packet_end= packet_end_arg; - iterations= iterations_arg; + iterations= TRUE; start_param= true; #ifndef DBUG_OFF Item *free_list_state= thd->free_list; @@ -4190,16 +4275,26 @@ Prepared_statement::execute_bulk_loop(String *expanded_query, thd->set_bulk_execution(0); return TRUE; } + /* Check for non zero parameter count*/ + if (param_count == 0) + { + DBUG_PRINT("error", ("Statement with no parameters for bulk execution.")); + my_error(ER_UNSUPPORTED_PS, MYF(0)); + thd->set_bulk_execution(0); + return TRUE; + } if (!(sql_command_flags[lex->sql_command] & CF_SP_BULK_SAFE)) { + DBUG_PRINT("error", ("Command is not supported in bulk execution.")); my_error(ER_UNSUPPORTED_PS, MYF(0)); thd->set_bulk_execution(0); return TRUE; } #ifndef EMBEDDED_LIBRARY - if (setup_conversion_functions(this, &packet, packet_end, TRUE)) + if (read_types && + set_conversion_functions(this, &packet, packet_end)) #else // bulk parameters are not supported for embedded, so it will an error #endif @@ -4210,6 +4305,7 @@ Prepared_statement::execute_bulk_loop(String *expanded_query, thd->set_bulk_execution(0); return true; } + read_types= FALSE; #ifdef NOT_YET_FROM_MYSQL_5_6 if (unlikely(thd->security_ctx->password_expired && diff --git a/sql/sql_prepare.h b/sql/sql_prepare.h index 820cb43e6d5..203b37b3b26 100644 --- a/sql/sql_prepare.h +++ b/sql/sql_prepare.h @@ -72,6 +72,7 @@ private: void mysqld_stmt_prepare(THD *thd, const char *packet, uint packet_length); void mysqld_stmt_execute(THD *thd, char *packet, uint packet_length); +void mysqld_stmt_execute_bulk(THD *thd, char *packet, uint packet_length); void mysqld_stmt_bulk_execute(THD *thd, char *packet, uint packet_length); void mysqld_stmt_close(THD *thd, char *packet); void mysql_sql_stmt_prepare(THD *thd); @@ -83,7 +84,7 @@ void mysqld_stmt_reset(THD *thd, char *packet); void mysql_stmt_get_longdata(THD *thd, char *pos, ulong packet_length); void reinit_stmt_before_use(THD *thd, LEX *lex); -ulong bulk_parameters_iterations(THD *thd); +my_bool bulk_parameters_iterations(THD *thd); my_bool bulk_parameters_set(THD *thd); /** Execute a fragment of server code in an isolated context, so that diff --git a/sql/sql_priv.h b/sql/sql_priv.h index 67547f7a030..6c9df6a9606 100644 --- a/sql/sql_priv.h +++ b/sql/sql_priv.h @@ -122,7 +122,7 @@ #define OPTION_AUTOCOMMIT (1ULL << 8) // THD, user #define OPTION_BIG_SELECTS (1ULL << 9) // THD, user #define OPTION_LOG_OFF (1ULL << 10) // THD, user -#define OPTION_QUOTE_SHOW_CREATE (1ULL << 11) // THD, user, unused +#define OPTION_QUOTE_SHOW_CREATE (1ULL << 11) // THD, user #define TMP_TABLE_ALL_COLUMNS (1ULL << 12) // SELECT, intern #define OPTION_WARNINGS (1ULL << 13) // THD, user #define OPTION_AUTO_IS_NULL (1ULL << 14) // THD, user, binlog diff --git a/sql/sql_reload.cc b/sql/sql_reload.cc index 463989b3805..73b996e738e 100644 --- a/sql/sql_reload.cc +++ b/sql/sql_reload.cc @@ -181,8 +181,12 @@ bool reload_acl_and_cache(THD *thd, unsigned long long options, slave is not likely to have the same connection names. */ tmp_write_to_binlog= 0; - - if (!(mi= (get_master_info(&connection_name, + if (connection_name.length == 0) + { + if (master_info_index->flush_all_relay_logs()) + *write_to_binlog= -1; + } + else if (!(mi= (get_master_info(&connection_name, Sql_condition::WARN_LEVEL_ERROR)))) { result= 1; @@ -249,7 +253,8 @@ bool reload_acl_and_cache(THD *thd, unsigned long long options, NOTE: my_error() has been already called by reopen_tables() within close_cached_tables(). */ - result= 1; + thd->global_read_lock.unlock_global_read_lock(thd); + return 1; } if (thd->global_read_lock.make_global_read_lock_block_commit(thd)) // Killed diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index 7c30aa38f1a..e3a082b680d 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -1,5 +1,5 @@ -/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. - Copyright (c) 2008, 2014, SkySQL Ab. +/* Copyright (c) 2000, 2017, Oracle and/or its affiliates. + Copyright (c) 2008, 2017, MariaDB Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -3342,6 +3342,7 @@ int reset_slave(THD *thd, Master_info* mi) // close master_info_file, relay_log_info_file, set mi->inited=rli->inited=0 end_master_info(mi); + end_relay_log_info(&mi->rli); // and delete these two files create_logfile_name_with_suffix(master_info_file_tmp, sizeof(master_info_file_tmp), @@ -3913,9 +3914,6 @@ bool mysql_show_binlog_events(THD* thd) Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF)) DBUG_RETURN(TRUE); - Format_description_log_event *description_event= new - Format_description_log_event(3); /* MySQL 4.0 by default */ - DBUG_ASSERT(thd->lex->sql_command == SQLCOM_SHOW_BINLOG_EVENTS || thd->lex->sql_command == SQLCOM_SHOW_RELAYLOG_EVENTS); @@ -3936,6 +3934,9 @@ bool mysql_show_binlog_events(THD* thd) binary_log= &(mi->rli.relay_log); } + Format_description_log_event *description_event= new + Format_description_log_event(3); /* MySQL 4.0 by default */ + if (binary_log->is_open()) { SELECT_LEX_UNIT *unit= &thd->lex->unit; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index fbddab20908..326e87f9d91 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -648,17 +648,15 @@ setup_without_group(THD *thd, Ref_ptr_array ref_pointer_array, thd->lex->allow_sum_func|= (nesting_map)1 << select->nest_level; - save_place= thd->lex->current_select->parsing_place; - thd->lex->current_select->parsing_place= IN_ORDER_BY; + save_place= thd->lex->current_select->context_analysis_place; + thd->lex->current_select->context_analysis_place= IN_ORDER_BY; res= res || setup_order(thd, ref_pointer_array, tables, fields, all_fields, order); - thd->lex->current_select->parsing_place= save_place; - thd->lex->allow_sum_func&= ~((nesting_map)1 << select->nest_level); - save_place= thd->lex->current_select->parsing_place; - thd->lex->current_select->parsing_place= IN_GROUP_BY; + thd->lex->allow_sum_func&= ~((nesting_map)1 << select->nest_level); + thd->lex->current_select->context_analysis_place= IN_GROUP_BY; res= res || setup_group(thd, ref_pointer_array, tables, fields, all_fields, group, hidden_group_fields); - thd->lex->current_select->parsing_place= save_place; + thd->lex->current_select->context_analysis_place= save_place; thd->lex->allow_sum_func|= (nesting_map)1 << select->nest_level; res= res || setup_windows(thd, ref_pointer_array, tables, fields, all_fields, win_specs, win_funcs); @@ -712,6 +710,7 @@ JOIN::prepare(TABLE_LIST *tables_init, if (select_lex->handle_derived(thd->lex, DT_PREPARE)) DBUG_RETURN(1); + thd->lex->current_select->context_analysis_place= NO_MATTER; thd->lex->current_select->is_item_list_lookup= 1; /* If we have already executed SELECT, then it have not sense to prevent @@ -801,12 +800,13 @@ JOIN::prepare(TABLE_LIST *tables_init, ref_ptrs= ref_ptr_array_slice(0); - enum_parsing_place save_place= thd->lex->current_select->parsing_place; - thd->lex->current_select->parsing_place= SELECT_LIST; + enum_parsing_place save_place= + thd->lex->current_select->context_analysis_place; + thd->lex->current_select->context_analysis_place= SELECT_LIST; if (setup_fields(thd, ref_ptrs, fields_list, MARK_COLUMNS_READ, &all_fields, 1)) DBUG_RETURN(-1); - thd->lex->current_select->parsing_place= save_place; + thd->lex->current_select->context_analysis_place= save_place; if (setup_without_group(thd, ref_ptrs, tables_list, select_lex->leaf_tables, fields_list, @@ -1092,7 +1092,7 @@ int JOIN::optimize() !skip_sort_order && !no_order && (order || group_list), select_distinct); uint select_nr= select_lex->select_number; - JOIN_TAB *curr_tab= join_tab + top_join_tab_count; + JOIN_TAB *curr_tab= join_tab + exec_join_tab_cnt(); for (uint i= 0; i < aggr_tables; i++, curr_tab++) { if (select_nr == INT_MAX) @@ -1138,6 +1138,8 @@ int JOIN::init_join_caches() } if (tab->cache && tab->cache->init(select_options & SELECT_DESCRIBE)) revise_cache_usage(tab); + else + tab->remove_redundant_bnl_scan_conds(); } return 0; } @@ -1446,8 +1448,10 @@ JOIN::optimize_inner() } DBUG_PRINT("info",("Select tables optimized away")); - zero_result_cause= "Select tables optimized away"; + if (!select_lex->have_window_funcs()) + zero_result_cause= "Select tables optimized away"; tables_list= 0; // All tables resolved + select_lex->min_max_opt_list.empty(); const_tables= top_join_tab_count= table_count; /* Extract all table-independent conditions and replace the WHERE @@ -1981,7 +1985,8 @@ JOIN::optimize_inner() having= new (thd->mem_root) Item_int(thd, (longlong) 0,1); zero_result_cause= "Impossible HAVING noticed after reading const tables"; error= 0; - DBUG_RETURN(0); + select_lex->mark_const_derived(zero_result_cause); + goto setup_subq_exit; } } @@ -2232,13 +2237,14 @@ bool JOIN::make_aggr_tables_info() bool implicit_grouping_with_window_funcs= implicit_grouping && select_lex->have_window_funcs(); - + bool implicit_grouping_without_tables= implicit_grouping && + !tables_list; /* Setup last table to provide fields and all_fields lists to the next node in the plan. */ - if (join_tab && top_join_tab_count) + if (join_tab && top_join_tab_count && tables_list) { join_tab[top_join_tab_count - 1].fields= &fields_list; join_tab[top_join_tab_count - 1].all_fields= &all_fields; @@ -2284,7 +2290,7 @@ bool JOIN::make_aggr_tables_info() order= query.order_by; aggr_tables++; - curr_tab= join_tab + top_join_tab_count; + curr_tab= join_tab + exec_join_tab_cnt(); bzero(curr_tab, sizeof(JOIN_TAB)); curr_tab->ref.key= -1; curr_tab->join= this; @@ -2362,7 +2368,7 @@ bool JOIN::make_aggr_tables_info() single table queries, thus it is sufficient to test only the first join_tab element of the plan for its access method. */ - if (join_tab && top_join_tab_count && + if (join_tab && top_join_tab_count && tables_list && join_tab->is_using_loose_index_scan()) tmp_table_param.precomputed_group_by= !join_tab->is_using_agg_loose_index_scan(); @@ -2372,7 +2378,7 @@ bool JOIN::make_aggr_tables_info() if (need_tmp) { aggr_tables++; - curr_tab= join_tab + top_join_tab_count; + curr_tab= join_tab + exec_join_tab_cnt(); bzero(curr_tab, sizeof(JOIN_TAB)); curr_tab->ref.key= -1; if (only_const_tables()) @@ -2431,8 +2437,9 @@ bool JOIN::make_aggr_tables_info() /* Change sum_fields reference to calculated fields in tmp_table */ items1= ref_ptr_array_slice(2); - if (sort_and_group || curr_tab->table->group || - tmp_table_param.precomputed_group_by) + if ((sort_and_group || curr_tab->table->group || + tmp_table_param.precomputed_group_by) && + !implicit_grouping_without_tables) { if (change_to_use_tmp_fields(thd, items1, tmp_fields_list1, tmp_all_fields1, @@ -2656,8 +2663,11 @@ bool JOIN::make_aggr_tables_info() if (sort_table_cond) { if (!curr_tab->select) + { if (!(curr_tab->select= new SQL_SELECT)) DBUG_RETURN(true); + curr_tab->select->head= curr_tab->table; + } if (!curr_tab->select->cond) curr_tab->select->cond= sort_table_cond; else @@ -2772,7 +2782,7 @@ bool JOIN::make_aggr_tables_info() - duplicate value removal Both of these operations are done after window function computation step. */ - curr_tab= join_tab + top_join_tab_count + aggr_tables - 1; + curr_tab= join_tab + exec_join_tab_cnt() + aggr_tables - 1; if (select_lex->window_funcs.elements) { curr_tab->window_funcs_step= new Window_funcs_computation; @@ -2787,7 +2797,7 @@ bool JOIN::make_aggr_tables_info() // Reset before execution set_items_ref_array(items0); if (join_tab) - join_tab[top_join_tab_count + aggr_tables - 1].next_select= + join_tab[exec_join_tab_cnt() + aggr_tables - 1].next_select= setup_end_select_func(this, NULL); group= has_group_by; @@ -2828,7 +2838,7 @@ JOIN::create_postjoin_aggr_table(JOIN_TAB *tab, List *table_fields, tmp_table_param.using_outer_summary_function= tab->tmp_table_param->using_outer_summary_function; tab->join= this; - DBUG_ASSERT(tab > join_tab || select_lex->have_window_funcs()); + DBUG_ASSERT(tab > tab->join->join_tab || !top_join_tab_count || !tables_list); if (tab > join_tab) (tab - 1)->next_select= sub_select_postjoin_aggr; tab->aggr= new (thd->mem_root) AGGR_OP(tab); @@ -2855,7 +2865,8 @@ JOIN::create_postjoin_aggr_table(JOIN_TAB *tab, List *table_fields, if (make_sum_func_list(all_fields, fields_list, true)) goto err; if (prepare_sum_aggregators(sum_funcs, - !join_tab->is_using_agg_loose_index_scan())) + !(tables_list && + join_tab->is_using_agg_loose_index_scan()))) goto err; if (setup_sum_funcs(thd, sum_funcs)) goto err; @@ -3116,7 +3127,7 @@ JOIN::reinit() if (aggr_tables) { - JOIN_TAB *curr_tab= join_tab + top_join_tab_count; + JOIN_TAB *curr_tab= join_tab + exec_join_tab_cnt(); JOIN_TAB *end_tab= curr_tab + aggr_tables; for ( ; curr_tab < end_tab; curr_tab++) { @@ -3243,7 +3254,7 @@ void JOIN::save_explain_data(Explain_query *output, bool can_overwrite, Explain_union *eu= output->get_union(nr); explain= &eu->fake_select_lex_explain; join_tab[0].tracker= eu->get_fake_select_lex_tracker(); - for (uint i=0 ; i < top_join_tab_count + aggr_tables; i++) + for (uint i=0 ; i < exec_join_tab_cnt() + aggr_tables; i++) { if (join_tab[i].filesort) { @@ -3312,7 +3323,8 @@ void JOIN::exec_inner() if (result->prepare2()) DBUG_VOID_RETURN; - if (!tables_list && (table_count || !select_lex->with_sum_func)) + if (!tables_list && (table_count || !select_lex->with_sum_func) && + !select_lex->have_window_funcs()) { // Only test of functions if (select_options & SELECT_DESCRIBE) select_describe(this, FALSE, FALSE, FALSE, @@ -3370,7 +3382,8 @@ void JOIN::exec_inner() condtions may be arbitrarily costly, and because the optimize phase might not have produced a complete executable plan for EXPLAINs. */ - if (exec_const_cond && !(select_options & SELECT_DESCRIBE) && + if (!zero_result_cause && + exec_const_cond && !(select_options & SELECT_DESCRIBE) && !exec_const_cond->val_int()) zero_result_cause= "Impossible WHERE noticed after reading const tables"; @@ -3385,8 +3398,14 @@ void JOIN::exec_inner() if (zero_result_cause) { - if (select_lex->have_window_funcs()) + if (select_lex->have_window_funcs() && send_row_on_empty_set()) { + /* + The query produces just one row but it has window functions. + + The only way to compute the value of window function(s) is to + run the entire window function computation step (there is no shortcut). + */ const_tables= table_count; first_select= sub_select_postjoin_aggr; } @@ -3803,7 +3822,7 @@ make_join_statistics(JOIN *join, List &tables_list, #endif DBUG_EXECUTE_IF("bug11747970_raise_error", - { join->thd->killed= KILL_QUERY_HARD; }); + { join->thd->set_killed(KILL_QUERY_HARD); }); if (error) { table->file->print_error(error, MYF(0)); @@ -5962,7 +5981,7 @@ add_group_and_distinct_keys(JOIN *join, JOIN_TAB *join_tab) Item_field *cur_item; key_map possible_keys(0); - if (join->group_list) + if (join->group_list || join->simple_group) { /* Collect all query fields referenced in the GROUP clause. */ for (cur_group= join->group_list; cur_group; cur_group= cur_group->next) (*cur_group->item)->walk(&Item::collect_item_field_processor, 0, @@ -8358,6 +8377,63 @@ bool JOIN_TAB::hash_join_is_possible() } +/** + @brief + Check whether a KEYUSE can be really used for access this join table + + @param join Join structure with the best join order + for which the check is performed + @param keyuse Evaluated KEYUSE structure + + @details + This function is supposed to be used after the best execution plan have been + already chosen and the JOIN_TAB array for the best join order been already set. + For a given KEYUSE to access this JOIN_TAB in the best execution plan the + function checks whether it really can be used. The function first performs + the check with access_from_tables_is_allowed(). If it succeeds it checks + whether the keyuse->val does not use some fields of a materialized semijoin + nest that cannot be used to build keys to access outer tables. + Such KEYUSEs exists for the query like this: + select * from ot + where ot.c in (select it1.c from it1, it2 where it1.c=f(it2.c)) + Here we have two KEYUSEs to access table ot: with val=it1.c and val=f(it2.c). + However if the subquery was materialized the second KEYUSE cannot be employed + to access ot. + + @retval true the given keyuse can be used for ref access of this JOIN_TAB + @retval false otherwise +*/ + +bool JOIN_TAB::keyuse_is_valid_for_access_in_chosen_plan(JOIN *join, + KEYUSE *keyuse) +{ + if (!access_from_tables_is_allowed(keyuse->used_tables, + join->sjm_lookup_tables)) + return false; + if (join->sjm_scan_tables & table->map) + return true; + table_map keyuse_sjm_scan_tables= keyuse->used_tables & + join->sjm_scan_tables; + if (!keyuse_sjm_scan_tables) + return true; + uint sjm_tab_nr= 0; + while (!(keyuse_sjm_scan_tables & table_map(1) << sjm_tab_nr)) + sjm_tab_nr++; + JOIN_TAB *sjm_tab= join->map2table[sjm_tab_nr]; + TABLE_LIST *emb_sj_nest= sjm_tab->emb_sj_nest; + if (!(emb_sj_nest->sj_mat_info && emb_sj_nest->sj_mat_info->is_used && + emb_sj_nest->sj_mat_info->is_sj_scan)) + return true; + st_select_lex *sjm_sel= emb_sj_nest->sj_subq_pred->unit->first_select(); + for (uint i= 0; i < sjm_sel->item_list.elements; i++) + { + if (sjm_sel->ref_pointer_array[i] == keyuse->val) + return true; + } + return false; +} + + static uint cache_record_length(JOIN *join,uint idx) { @@ -8551,7 +8627,7 @@ JOIN_TAB *first_top_level_tab(JOIN *join, enum enum_with_const_tables const_tbls JOIN_TAB *tab= join->join_tab; if (const_tbls == WITHOUT_CONST_TABLES) { - if (join->const_tables == join->table_count) + if (join->const_tables == join->table_count || !tab) return NULL; tab += join->const_tables; } @@ -8574,6 +8650,10 @@ JOIN_TAB *first_linear_tab(JOIN *join, enum enum_with_const_tables const_tbls) { JOIN_TAB *first= join->join_tab; + + if (!first) + return NULL; + if (const_tbls == WITHOUT_CONST_TABLES) first+= join->const_tables; @@ -8660,7 +8740,7 @@ JOIN_TAB *first_depth_first_tab(JOIN* join) { JOIN_TAB* tab; /* This means we're starting the enumeration */ - if (join->const_tables == join->top_join_tab_count) + if (join->const_tables == join->top_join_tab_count || !join->join_tab) return NULL; tab= join->join_tab + join->const_tables; @@ -8773,8 +8853,6 @@ bool JOIN::get_best_combination() full_join=0; hash_join= FALSE; - used_tables= OUTER_REF_TABLE_BIT; // Outer row is already read - fix_semijoin_strategies_for_picked_join_order(this); JOIN_TAB_RANGE *root_range; @@ -8838,7 +8916,6 @@ bool JOIN::get_best_combination() j->bush_root_tab= sjm_nest_root; form= table[tablenr]= j->table; - used_tables|= form->map; form->reginfo.join_tab=j; DBUG_PRINT("info",("type: %d", j->type)); if (j->type == JT_CONST) @@ -8865,9 +8942,6 @@ bool JOIN::get_best_combination() best_positions[tablenr].loosescan_picker.loosescan_key); j->index= best_positions[tablenr].loosescan_picker.loosescan_key; }*/ - - if (keyuse && create_ref_for_key(this, j, keyuse, TRUE, used_tables)) - DBUG_RETURN(TRUE); // Something went wrong if ((j->type == JT_REF || j->type == JT_EQ_REF) && is_hash_join_key_no(j->ref.key)) @@ -8893,6 +8967,23 @@ bool JOIN::get_best_combination() } root_range->end= j; + used_tables= OUTER_REF_TABLE_BIT; // Outer row is already read + for (j=join_tab, tablenr=0 ; tablenr < table_count ; tablenr++,j++) + { + if (j->bush_children) + j= j->bush_children->start; + + used_tables|= j->table->map; + if (j->type != JT_CONST && j->type != JT_SYSTEM) + { + if ((keyuse= best_positions[tablenr].key) && + create_ref_for_key(this, j, keyuse, TRUE, used_tables)) + DBUG_RETURN(TRUE); // Something went wrong + } + if (j->last_leaf_in_bush) + j= j->bush_root_tab; + } + top_join_tab_count= join_tab_ranges.head()->end - join_tab_ranges.head()->start; @@ -8936,6 +9027,7 @@ static bool create_hj_key_for_table(JOIN *join, JOIN_TAB *join_tab, do { if (!(~used_tables & keyuse->used_tables) && + join_tab->keyuse_is_valid_for_access_in_chosen_plan(join, keyuse) && are_tables_local(join_tab, keyuse->used_tables)) { if (first_keyuse) @@ -8950,6 +9042,8 @@ static bool create_hj_key_for_table(JOIN *join, JOIN_TAB *join_tab, { if (curr->keypart == keyuse->keypart && !(~used_tables & curr->used_tables) && + join_tab->keyuse_is_valid_for_access_in_chosen_plan(join, + keyuse) && are_tables_local(join_tab, curr->used_tables)) break; } @@ -8984,6 +9078,7 @@ static bool create_hj_key_for_table(JOIN *join, JOIN_TAB *join_tab, do { if (!(~used_tables & keyuse->used_tables) && + join_tab->keyuse_is_valid_for_access_in_chosen_plan(join, keyuse) && are_tables_local(join_tab, keyuse->used_tables)) { bool add_key_part= TRUE; @@ -8993,7 +9088,9 @@ static bool create_hj_key_for_table(JOIN *join, JOIN_TAB *join_tab, { if (curr->keypart == keyuse->keypart && !(~used_tables & curr->used_tables) && - are_tables_local(join_tab, curr->used_tables)) + join_tab->keyuse_is_valid_for_access_in_chosen_plan(join, + curr) && + are_tables_local(join_tab, curr->used_tables)) { keyuse->keypart= NO_KEYPART; add_key_part= FALSE; @@ -9095,8 +9192,7 @@ static bool create_ref_for_key(JOIN *join, JOIN_TAB *j, do { if (!(~used_tables & keyuse->used_tables) && - j->access_from_tables_is_allowed(keyuse->used_tables, - join->sjm_lookup_tables)) + j->keyuse_is_valid_for_access_in_chosen_plan(join, keyuse)) { if (are_tables_local(j, keyuse->val->used_tables())) { @@ -9166,8 +9262,7 @@ static bool create_ref_for_key(JOIN *join, JOIN_TAB *j, for (i=0 ; i < keyparts ; keyuse++,i++) { while (((~used_tables) & keyuse->used_tables) || - !j->access_from_tables_is_allowed(keyuse->used_tables, - join->sjm_lookup_tables) || + !j->keyuse_is_valid_for_access_in_chosen_plan(join, keyuse) || keyuse->keypart == NO_KEYPART || (keyuse->keypart != (is_hash_join_key_no(key) ? @@ -9700,12 +9795,20 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond) /* Step #2: Extract WHERE/ON parts */ + uint i; + for (i= join->top_join_tab_count - 1; i >= join->const_tables; i--) + { + if (!join->join_tab[i].bush_children) + break; + } + uint last_top_base_tab_idx= i; + table_map save_used_tables= 0; used_tables=((select->const_tables=join->const_table_map) | OUTER_REF_TABLE_BIT | RAND_TABLE_BIT); JOIN_TAB *tab; table_map current_map; - uint i= join->const_tables; + i= join->const_tables; for (tab= first_depth_first_tab(join); tab; tab= next_depth_first_tab(join, tab), i++) { @@ -9744,8 +9847,8 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond) Following force including random expression in last table condition. It solve problem with select like SELECT * FROM t1 WHERE rand() > 0.5 */ - if (tab == join->join_tab + join->top_join_tab_count - 1) - current_map|= OUTER_REF_TABLE_BIT | RAND_TABLE_BIT; + if (tab == join->join_tab + last_top_base_tab_idx) + current_map|= RAND_TABLE_BIT; used_tables|=current_map; if (tab->type == JT_REF && tab->quick && @@ -9784,10 +9887,10 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond) save_used_tables= 0; } else - { - tmp= make_cond_for_table(thd, cond, used_tables, current_map, i, + { + tmp= make_cond_for_table(thd, cond, used_tables, current_map, i, FALSE, FALSE); - } + } /* Add conditions added by add_not_null_conds(). */ if (tab->select_cond) add_cond_and_fix(thd, &tmp, tab->select_cond); @@ -11156,8 +11259,8 @@ void JOIN_TAB::remove_redundant_bnl_scan_conds() select->cond is not processed separately. This method assumes it is always the same as select_cond. */ - DBUG_ASSERT(!select || !select->cond || - (select->cond == select_cond)); + if (select && select->cond != select_cond) + return; if (is_cond_and(select_cond)) { @@ -11467,7 +11570,6 @@ make_join_readinfo(JOIN *join, ulonglong options, uint no_jbuf_after) /* purecov: end */ } - tab->remove_redundant_bnl_scan_conds(); DBUG_EXECUTE("where", char buff[256]; String str(buff,sizeof(buff),system_charset_info); @@ -12004,7 +12106,7 @@ void JOIN::cleanup(bool full) w/o tables: they don't have some members initialized and WALK_OPTIMIZATION_TABS may not work correctly for them. */ - if (table_count) + if (top_join_tab_count && tables_list) { for (tab= first_breadth_first_tab(); tab; tab= next_breadth_first_tab(first_breadth_first_tab(), @@ -12018,7 +12120,7 @@ void JOIN::cleanup(bool full) cleaned= true; //psergey2: added (Q: why not in the above loop?) { - JOIN_TAB *curr_tab= join_tab + top_join_tab_count; + JOIN_TAB *curr_tab= join_tab + exec_join_tab_cnt(); for (uint i= 0; i < aggr_tables; i++, curr_tab++) { if (curr_tab->aggr) @@ -14525,7 +14627,8 @@ simplify_joins(JOIN *join, List *join_list, COND *conds, bool top, table->table->maybe_null= FALSE; table->outer_join= 0; if (!(straight_join || table->straight)) - table->dep_tables= table->embedding? table->embedding->dep_tables: 0; + table->dep_tables= table->embedding && !table->embedding->sj_subq_pred ? + table->embedding->dep_tables : 0; if (table->on_expr) { /* Add ON expression to the WHERE or upper-level ON condition. */ @@ -16469,7 +16572,12 @@ create_tmp_table(THD *thd, TMP_TABLE_PARAM *param, List &fields, Field **tmp_from_field=from_field; while ((item=li++)) { - Item::Type type=item->type(); + Item::Type type= item->type(); + if (type == Item::COPY_STR_ITEM) + { + item= ((Item_copy *)item)->get_item(); + type= item->type(); + } if (not_all_columns) { if (item->with_sum_func && type != Item::SUM_FUNC_ITEM) @@ -16675,7 +16783,7 @@ create_tmp_table(THD *thd, TMP_TABLE_PARAM *param, List &fields, if (blob_count || using_unique_constraint || (thd->variables.big_tables && !(select_options & SELECT_SMALL_RESULT)) || (select_options & TMP_TABLE_FORCE_MYISAM) - || thd->variables.tmp_table_size == 0) + || thd->variables.tmp_memory_table_size == 0) { share->db_plugin= ha_lock_engine(0, TMP_ENGINE_HTON); table->file= get_new_handler(share, &table->mem_root, @@ -16839,14 +16947,14 @@ create_tmp_table(THD *thd, TMP_TABLE_PARAM *param, List &fields, param->recinfo= recinfo; // Pointer to after last field store_record(table,s->default_values); // Make empty default record - if (thd->variables.tmp_table_size == ~ (ulonglong) 0) // No limit + if (thd->variables.tmp_memory_table_size == ~ (ulonglong) 0) // No limit share->max_rows= ~(ha_rows) 0; else share->max_rows= (ha_rows) (((share->db_type() == heap_hton) ? - MY_MIN(thd->variables.tmp_table_size, + MY_MIN(thd->variables.tmp_memory_table_size, thd->variables.max_heap_table_size) : - thd->variables.tmp_table_size) / - share->reclength); + thd->variables.tmp_memory_table_size) / + share->reclength); set_if_bigger(share->max_rows,1); // For dummy start options /* Push the LIMIT clause to the temporary table creation, so that we @@ -17384,10 +17492,7 @@ bool create_internal_tmp_table(TABLE *table, KEY *keyinfo, } } bzero((char*) &create_info,sizeof(create_info)); - - /* Use long data format, to ensure we never get a 'table is full' error */ - if (!(options & SELECT_SMALL_RESULT)) - create_info.data_file_length= ~(ulonglong) 0; + create_info.data_file_length= table->in_use->variables.tmp_disk_table_size; /* The logic for choosing the record format: @@ -17583,9 +17688,7 @@ bool create_internal_tmp_table(TABLE *table, KEY *keyinfo, } MI_CREATE_INFO create_info; bzero((char*) &create_info,sizeof(create_info)); - - if (!(options & SELECT_SMALL_RESULT)) - create_info.data_file_length= ~(ulonglong) 0; + create_info.data_file_length= table->in_use->variables.tmp_disk_table_size; if ((error=mi_create(share->table_name.str, share->keys, &keydef, (uint) (*recinfo-start_recinfo), @@ -17832,7 +17935,7 @@ void set_postjoin_aggr_write_func(JOIN_TAB *tab) } } else if (join->sort_and_group && !tmp_tbl->precomputed_group_by && - !join->sort_and_group_aggr_tab) + !join->sort_and_group_aggr_tab && join->tables_list) { DBUG_PRINT("info",("Using end_write_group")); aggr->set_write_func(end_write_group); @@ -17924,7 +18027,8 @@ do_select(JOIN *join, Procedure *procedure) if (join->pushdown_query->store_data_in_temp_table) { - JOIN_TAB *last_tab= join->join_tab + join->table_count; + JOIN_TAB *last_tab= join->join_tab + join->table_count - + join->exec_join_tab_cnt(); last_tab->next_select= end_send; enum_nested_loop_state state= last_tab->aggr->end_send(); @@ -17995,7 +18099,8 @@ do_select(JOIN *join, Procedure *procedure) dbug_serve_apcs(join->thd, 1); ); - JOIN_TAB *join_tab= join->join_tab + join->const_tables; + JOIN_TAB *join_tab= join->join_tab + + (join->tables_list ? join->const_tables : 0); if (join->outer_ref_cond && !join->outer_ref_cond->val_int()) error= NESTED_LOOP_NO_MORE_ROWS; else @@ -19351,7 +19456,6 @@ bool test_if_use_dynamic_range_scan(JOIN_TAB *join_tab) int join_init_read_record(JOIN_TAB *tab) { - int error; /* Note: the query plan tree for the below operations is constructed in save_agg_explain_data. @@ -19361,12 +19465,18 @@ int join_init_read_record(JOIN_TAB *tab) if (tab->filesort && tab->sort_table()) // Sort table. return 1; - if (tab->select && tab->select->quick && (error= tab->select->quick->reset())) + DBUG_EXECUTE_IF("kill_join_init_read_record", + tab->join->thd->set_killed(KILL_QUERY);); + if (tab->select && tab->select->quick && tab->select->quick->reset()) { - /* Ensures error status is propageted back to client */ - report_error(tab->table, error); + /* Ensures error status is propagated back to client */ + report_error(tab->table, + tab->join->thd->killed ? HA_ERR_QUERY_INTERRUPTED : HA_ERR_OUT_OF_MEM); return 1; } + /* make sure we won't get ER_QUERY_INTERRUPTED from any code below */ + DBUG_EXECUTE_IF("kill_join_init_read_record", + tab->join->thd->reset_killed();); if (!tab->preread_init_done && tab->preread_init()) return 1; if (init_read_record(&tab->read_record, tab->join->thd, tab->table, @@ -22205,14 +22315,16 @@ int setup_order(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables, List &fields, List &all_fields, ORDER *order, bool from_window_spec) { - enum_parsing_place parsing_place= thd->lex->current_select->parsing_place; + enum_parsing_place context_analysis_place= + thd->lex->current_select->context_analysis_place; thd->where="order clause"; for (; order; order=order->next) { if (find_order_in_list(thd, ref_pointer_array, tables, order, fields, all_fields, FALSE, from_window_spec)) return 1; - if ((*order->item)->with_window_func && parsing_place != IN_ORDER_BY) + if ((*order->item)->with_window_func && + context_analysis_place != IN_ORDER_BY) { my_error(ER_WINDOW_FUNCTION_IN_WINDOW_SPEC, MYF(0)); return 1; @@ -22254,7 +22366,8 @@ setup_group(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables, List &fields, List &all_fields, ORDER *order, bool *hidden_group_fields, bool from_window_spec) { - enum_parsing_place parsing_place= thd->lex->current_select->parsing_place; + enum_parsing_place context_analysis_place= + thd->lex->current_select->context_analysis_place; *hidden_group_fields=0; ORDER *ord; @@ -22270,14 +22383,14 @@ setup_group(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables, all_fields, TRUE, from_window_spec)) return 1; (*ord->item)->marker= UNDEF_POS; /* Mark found */ - if ((*ord->item)->with_sum_func && parsing_place == IN_GROUP_BY) + if ((*ord->item)->with_sum_func && context_analysis_place == IN_GROUP_BY) { my_error(ER_WRONG_GROUP_FIELD, MYF(0), (*ord->item)->full_name()); return 1; } if ((*ord->item)->with_window_func) { - if (parsing_place == IN_GROUP_BY) + if (context_analysis_place == IN_GROUP_BY) my_error(ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION, MYF(0)); else my_error(ER_WINDOW_FUNCTION_IN_WINDOW_SPEC, MYF(0)); @@ -23234,8 +23347,11 @@ change_refs_to_tmp_fields(THD *thd, Ref_ptr_array ref_pointer_array, uint i, border= all_fields.elements - elements; for (i= 0; (item= it++); i++) { - res_all_fields.push_back(new_item= item->get_tmp_table_item(thd), - thd->mem_root); + if (item->type() == Item::SUM_FUNC_ITEM && item->const_item()) + new_item= item; + else + new_item= item->get_tmp_table_item(thd); + res_all_fields.push_back(new_item, thd->mem_root); ref_pointer_array[((i < border)? all_fields.elements-i-1 : i-border)]= new_item; } @@ -24489,7 +24605,7 @@ void JOIN_TAB::save_explain_data(Explain_table_access *eta, void save_agg_explain_data(JOIN *join, Explain_select *xpl_sel) { - JOIN_TAB *join_tab=join->join_tab + join->top_join_tab_count; + JOIN_TAB *join_tab=join->join_tab + join->exec_join_tab_cnt(); Explain_aggr_node *prev_node; Explain_aggr_node *node= xpl_sel->aggr_tree; bool is_analyze= join->thd->lex->analyze_stmt; @@ -24580,6 +24696,7 @@ int JOIN::save_explain_data_intern(Explain_query *output, if (select_lex->master_unit()->derived) explain->connection_type= Explain_node::EXPLAIN_NODE_DERIVED; + save_agg_explain_data(this, explain); output->add_node(explain); } else if (pushdown_query) @@ -26272,7 +26389,8 @@ AGGR_OP::put_record(bool end_of_records) { // Lasy tmp table creation/initialization if (!join_tab->table->file->inited) - prepare_tmp_table(); + if (prepare_tmp_table()) + return NESTED_LOOP_ERROR; enum_nested_loop_state rc= (*write_func)(join_tab->join, join_tab, end_of_records); return rc; diff --git a/sql/sql_select.h b/sql/sql_select.h index 4327646cdee..886a66c3ef4 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -604,6 +604,8 @@ typedef struct st_join_table { !(used_sjm_lookup_tables & ~emb_sj_nest->sj_inner_tables)); } + bool keyuse_is_valid_for_access_in_chosen_plan(JOIN *join, KEYUSE *keyuse); + void remove_redundant_bnl_scan_conds(); void save_explain_data(Explain_table_access *eta, table_map prefix_tables, @@ -1120,6 +1122,11 @@ public: to materialize and access by lookups */ table_map sjm_lookup_tables; + /** + Bitmap of semijoin tables that the chosen plan decided + to materialize to scan the results of materialization + */ + table_map sjm_scan_tables; /* Constant tables for which we have found a row (as opposed to those for which we didn't). @@ -1488,10 +1495,13 @@ public: in_to_exists_having= NULL; emb_sjm_nest= NULL; sjm_lookup_tables= 0; + sjm_scan_tables= 0; } /* True if the plan guarantees that it will be returned zero or one row */ bool only_const_tables() { return const_tables == table_count; } + /* Number of tables actually joined at the top level */ + uint exec_join_tab_cnt() { return tables_list ? top_join_tab_count : 0; } int prepare(TABLE_LIST *tables, uint wind_num, COND *conds, uint og_num, ORDER *order, bool skip_order_by, diff --git a/sql/sql_show.cc b/sql/sql_show.cc index d1d1410d51a..229d284bc3d 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2000, 2015, Oracle and/or its affiliates. - Copyright (c) 2009, 2016, MariaDB + Copyright (c) 2009, 2017, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -1092,6 +1092,7 @@ public: is_handled= FALSE; break; } + /* fall through */ case ER_COLUMNACCESS_DENIED_ERROR: case ER_VIEW_NO_EXPLAIN: /* Error was anonymized, ignore all the same. */ case ER_PROCACCESS_DENIED_ERROR: @@ -1162,7 +1163,7 @@ mysqld_show_create_get_fields(THD *thd, TABLE_LIST *table_list, bool open_error= open_tables(thd, &table_list, &counter, MYSQL_OPEN_FORCE_SHARED_HIGH_PRIO_MDL) || - mysql_handle_derived(thd->lex, DT_PREPARE); + mysql_handle_derived(thd->lex, DT_INIT | DT_PREPARE); thd->pop_internal_handler(); if (open_error && (thd->killed || thd->is_error())) goto exit; @@ -1335,8 +1336,13 @@ bool mysqld_show_create_db(THD *thd, LEX_STRING *dbname, if (test_all_bits(sctx->master_access, DB_ACLS)) db_access=DB_ACLS; else - db_access= (acl_get(sctx->host, sctx->ip, sctx->priv_user, dbname->str, 0) | - sctx->master_access); + { + db_access= acl_get(sctx->host, sctx->ip, sctx->priv_user, dbname->str, 0) | + sctx->master_access; + if (sctx->priv_role[0]) + db_access|= acl_get("", "", sctx->priv_role, dbname->str, 0); + } + if (!(db_access & DB_ACLS) && check_grant_db(thd,dbname->str)) { status_var_increment(thd->status_var.access_denied_errors); @@ -1415,7 +1421,7 @@ mysqld_list_fields(THD *thd, TABLE_LIST *table_list, const char *wild) if (open_normal_and_derived_tables(thd, table_list, MYSQL_OPEN_FORCE_SHARED_HIGH_PRIO_MDL, - DT_PREPARE | DT_CREATE)) + DT_INIT | DT_PREPARE | DT_CREATE)) DBUG_VOID_RETURN; table= table_list->table; @@ -2224,19 +2230,14 @@ int show_create_table(THD *thd, TABLE_LIST *table_list, String *packet, */ uint part_syntax_len; char *part_syntax; - String comment_start; - comment_start.append(STRING_WITH_LEN("\n")); if ((part_syntax= generate_partition_syntax(thd, table->part_info, &part_syntax_len, - FALSE, show_table_options, - NULL, NULL, - comment_start.c_ptr()))) + NULL, NULL))) { - packet->append(comment_start); + packet->append('\n'); if (packet->append(part_syntax, part_syntax_len)) error= 1; - my_free(part_syntax); } } } @@ -4273,7 +4274,7 @@ fill_schema_table_by_open(THD *thd, bool is_show_fields_or_keys, MYSQL_OPEN_FORCE_SHARED_HIGH_PRIO_MDL | (can_deadlock ? MYSQL_OPEN_FAIL_ON_MDL_CONFLICT : 0)), - DT_PREPARE | DT_CREATE)); + DT_INIT | DT_PREPARE | DT_CREATE)); /* Restore old value of sql_command back as it is being looked at in process_table() function. @@ -4999,8 +5000,10 @@ int fill_schema_schemata(THD *thd, TABLE_LIST *tables, COND *cond) } #ifndef NO_EMBEDDED_ACCESS_CHECKS if (sctx->master_access & (DB_ACLS | SHOW_DB_ACL) || - acl_get(sctx->host, sctx->ip, sctx->priv_user, db_name->str, 0) || - !check_grant_db(thd, db_name->str)) + acl_get(sctx->host, sctx->ip, sctx->priv_user, db_name->str, false) || + (sctx->priv_role[0] ? + acl_get("", "", sctx->priv_role, db_name->str, false) : 0) || + !check_grant_db(thd, db_name->str)) #endif { load_db_opt_by_name(thd, db_name->str, &create); @@ -5451,6 +5454,7 @@ static int get_schema_column_record(THD *thd, TABLE_LIST *tables, TABLE *show_table; Field **ptr, *field; int count; + bool quoted_defaults= lex->sql_command != SQLCOM_SHOW_FIELDS; DBUG_ENTER("get_schema_column_record"); if (res) @@ -5520,7 +5524,7 @@ static int get_schema_column_record(THD *thd, TABLE_LIST *tables, cs); table->field[4]->store((longlong) count, TRUE); - if (get_field_default_value(thd, field, &type, 0)) + if (get_field_default_value(thd, field, &type, quoted_defaults)) { table->field[5]->store(type.ptr(), type.length(), cs); table->field[5]->set_notnull(); @@ -6821,7 +6825,7 @@ get_partition_column_description(THD *thd, { part_column_list_val *col_val= &list_value->col_val_array[i]; if (col_val->max_value) - tmp_str.append(partition_keywords[PKW_MAXVALUE].str); + tmp_str.append(STRING_WITH_LEN("MAXVALUE")); else if (col_val->null_value) tmp_str.append("NULL"); else @@ -6898,27 +6902,21 @@ static int get_schema_partitions_record(THD *thd, TABLE_LIST *tables, case LIST_PARTITION: tmp_res.length(0); if (part_info->part_type == RANGE_PARTITION) - tmp_res.append(partition_keywords[PKW_RANGE].str, - partition_keywords[PKW_RANGE].length); + tmp_res.append(STRING_WITH_LEN("RANGE")); else - tmp_res.append(partition_keywords[PKW_LIST].str, - partition_keywords[PKW_LIST].length); + tmp_res.append(STRING_WITH_LEN("LIST")); if (part_info->column_list) - tmp_res.append(partition_keywords[PKW_COLUMNS].str, - partition_keywords[PKW_COLUMNS].length); + tmp_res.append(STRING_WITH_LEN(" COLUMNS")); table->field[7]->store(tmp_res.ptr(), tmp_res.length(), cs); break; case HASH_PARTITION: tmp_res.length(0); if (part_info->linear_hash_ind) - tmp_res.append(partition_keywords[PKW_LINEAR].str, - partition_keywords[PKW_LINEAR].length); + tmp_res.append(STRING_WITH_LEN("LINEAR ")); if (part_info->list_of_part_fields) - tmp_res.append(partition_keywords[PKW_KEY].str, - partition_keywords[PKW_KEY].length); + tmp_res.append(STRING_WITH_LEN("KEY")); else - tmp_res.append(partition_keywords[PKW_HASH].str, - partition_keywords[PKW_HASH].length); + tmp_res.append(STRING_WITH_LEN("HASH")); table->field[7]->store(tmp_res.ptr(), tmp_res.length(), cs); break; default: @@ -6931,8 +6929,9 @@ static int get_schema_partitions_record(THD *thd, TABLE_LIST *tables, /* Partition expression */ if (part_info->part_expr) { - table->field[9]->store(part_info->part_func_string, - part_info->part_func_len, cs); + StringBuffer str(cs); + part_info->part_expr->print_for_table_def(&str); + table->field[9]->store(str.ptr(), str.length(), str.charset()); } else if (part_info->list_of_part_fields) { @@ -6946,22 +6945,20 @@ static int get_schema_partitions_record(THD *thd, TABLE_LIST *tables, /* Subpartition method */ tmp_res.length(0); if (part_info->linear_hash_ind) - tmp_res.append(partition_keywords[PKW_LINEAR].str, - partition_keywords[PKW_LINEAR].length); + tmp_res.append(STRING_WITH_LEN("LINEAR ")); if (part_info->list_of_subpart_fields) - tmp_res.append(partition_keywords[PKW_KEY].str, - partition_keywords[PKW_KEY].length); + tmp_res.append(STRING_WITH_LEN("KEY")); else - tmp_res.append(partition_keywords[PKW_HASH].str, - partition_keywords[PKW_HASH].length); + tmp_res.append(STRING_WITH_LEN("HASH")); table->field[8]->store(tmp_res.ptr(), tmp_res.length(), cs); table->field[8]->set_notnull(); /* Subpartition expression */ if (part_info->subpart_expr) { - table->field[10]->store(part_info->subpart_func_string, - part_info->subpart_func_len, cs); + StringBuffer str(cs); + part_info->subpart_expr->print_for_table_def(&str); + table->field[10]->store(str.ptr(), str.length(), str.charset()); } else if (part_info->list_of_subpart_fields) { @@ -7002,8 +6999,7 @@ static int get_schema_partitions_record(THD *thd, TABLE_LIST *tables, if (part_elem->range_value != LONGLONG_MAX) table->field[11]->store((longlong) part_elem->range_value, FALSE); else - table->field[11]->store(partition_keywords[PKW_MAXVALUE].str, - partition_keywords[PKW_MAXVALUE].length, cs); + table->field[11]->store(STRING_WITH_LEN("MAXVALUE"), cs); } table->field[11]->set_notnull(); } diff --git a/sql/sql_string.cc b/sql/sql_string.cc index 62473e082c3..c16b2ef9844 100644 --- a/sql/sql_string.cc +++ b/sql/sql_string.cc @@ -480,6 +480,14 @@ bool String::append(const char *s) return append(s, (uint) strlen(s)); } +bool String::append_longlong(longlong val) +{ + if (realloc(str_length+MAX_BIGINT_WIDTH+2)) + return TRUE; + char *end= (char*) longlong10_to_str(val, (char*) Ptr + str_length, -10); + str_length= end - Ptr; + return FALSE; +} bool String::append_ulonglong(ulonglong val) diff --git a/sql/sql_string.h b/sql/sql_string.h index 18f5f4cac5c..9a9fff8522c 100644 --- a/sql/sql_string.h +++ b/sql/sql_string.h @@ -471,6 +471,7 @@ public: bool append(const char *s, uint32 arg_length); bool append(const char *s, uint32 arg_length, CHARSET_INFO *cs); bool append_ulonglong(ulonglong val); + bool append_longlong(longlong val); bool append(IO_CACHE* file, uint32 arg_length); bool append_with_prefill(const char *s, uint32 arg_length, uint32 full_length, char fill_char); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index f5f2ffb0b63..8a68d86659a 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -1820,11 +1820,9 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags) if (part_info) { if (!(part_syntax_buf= generate_partition_syntax(lpt->thd, part_info, - &syntax_len, - TRUE, TRUE, + &syntax_len, TRUE, lpt->create_info, - lpt->alter_info, - NULL))) + lpt->alter_info))) { DBUG_RETURN(TRUE); } @@ -1903,11 +1901,9 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags) TABLE_SHARE *share= lpt->table->s; char *tmp_part_syntax_str; if (!(part_syntax_buf= generate_partition_syntax(lpt->thd, part_info, - &syntax_len, - TRUE, TRUE, + &syntax_len, TRUE, lpt->create_info, - lpt->alter_info, - NULL))) + lpt->alter_info))) { error= 1; goto err; @@ -2094,6 +2090,7 @@ bool mysql_rm_table(THD *thd,TABLE_LIST *tables, my_bool if_exists, DBUG_RETURN(TRUE); my_ok(thd); DBUG_RETURN(FALSE); + } @@ -2140,7 +2137,6 @@ static uint32 comment_length(THD *thd, uint32 comment_pos, return 0; } - /** Execute the drop of a normal or temporary table. @@ -2522,10 +2518,6 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables, bool if_exists, DBUG_PRINT("table", ("table: 0x%lx s: 0x%lx", (long) table->table, table->table ? (long) table->table->s : (long) -1)); - - DBUG_EXECUTE_IF("bug43138", - my_error(ER_BAD_TABLE_ERROR, MYF(0), - table->table_name);); } DEBUG_SYNC(thd, "rm_table_no_locks_before_binlog"); thd->thread_specific_used|= (trans_tmp_table_deleted || @@ -2557,6 +2549,9 @@ err: if (non_trans_tmp_table_deleted || trans_tmp_table_deleted || non_tmp_table_deleted) { + if (non_trans_tmp_table_deleted || trans_tmp_table_deleted) + thd->transaction.stmt.mark_dropped_temp_table(); + query_cache_invalidate3(thd, tables, 0); if (!dont_log_query && mysql_bin_log.is_open()) { @@ -2565,6 +2560,9 @@ err: /* Chop of the last comma */ built_non_trans_tmp_query.chop(); built_non_trans_tmp_query.append(" /* generated by server */"); +#ifdef WITH_WSREP + thd->wsrep_skip_wsrep_GTID = true; +#endif /* WITH_WSREP */ error |= thd->binlog_query(THD::STMT_QUERY_TYPE, built_non_trans_tmp_query.ptr(), built_non_trans_tmp_query.length(), @@ -2577,6 +2575,9 @@ err: /* Chop of the last comma */ built_trans_tmp_query.chop(); built_trans_tmp_query.append(" /* generated by server */"); +#ifdef WITH_WSREP + thd->wsrep_skip_wsrep_GTID = true; +#endif /* WITH_WSREP */ error |= thd->binlog_query(THD::STMT_QUERY_TYPE, built_trans_tmp_query.ptr(), built_trans_tmp_query.length(), @@ -2591,6 +2592,9 @@ err: built_query.append(" /* generated by server */"); int error_code = non_tmp_error ? thd->get_stmt_da()->sql_errno() : 0; +#ifdef WITH_WSREP + thd->wsrep_skip_wsrep_GTID = false; +#endif /* WITH_WSREP */ error |= thd->binlog_query(THD::STMT_QUERY_TYPE, built_query.ptr(), built_query.length(), @@ -2639,6 +2643,9 @@ err: } end: +#ifdef WITH_WSREP + thd->wsrep_skip_wsrep_GTID = false; +#endif /* WITH_WSREP */ DBUG_RETURN(error); } @@ -3014,10 +3021,9 @@ int prepare_create_field(Column_definition *sql_field, */ if (decimals >= FLOATING_POINT_DECIMALS) decimals= FLOATING_POINT_DECIMALS; - /* fall-trough */ + /* fall through */ case MYSQL_TYPE_TIMESTAMP: case MYSQL_TYPE_TIMESTAMP2: - /* fall-through */ default: sql_field->pack_flag=(FIELDFLAG_NUMBER | (sql_field->flags & UNSIGNED_FLAG ? 0 : @@ -3236,6 +3242,21 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, bool tmp_table= create_table_mode == C_ALTER_TABLE; DBUG_ENTER("mysql_prepare_create_table"); + LEX_STRING* connect_string = &create_info->connect_string; + if (connect_string->length != 0 && + connect_string->length > CONNECT_STRING_MAXLEN && + (system_charset_info->cset->charpos(system_charset_info, + connect_string->str, + (connect_string->str + + connect_string->length), + CONNECT_STRING_MAXLEN) + < connect_string->length)) + { + my_error(ER_WRONG_STRING_LENGTH, MYF(0), + connect_string->str, "CONNECTION", CONNECT_STRING_MAXLEN); + DBUG_RETURN(TRUE); + } + select_field_pos= alter_info->create_list.elements - select_field_count; null_fields=blob_columns=0; create_info->varchar= 0; @@ -4536,12 +4557,12 @@ handler *mysql_create_frm_image(THD *thd, We reverse the partitioning parser and generate a standard format for syntax stored in frm file. */ - if (!(part_syntax_buf= generate_partition_syntax(thd, part_info, - &syntax_len, - TRUE, TRUE, - create_info, - alter_info, - NULL))) + sql_mode_t old_mode= thd->variables.sql_mode; + thd->variables.sql_mode &= ~MODE_ANSI_QUOTES; + part_syntax_buf= generate_partition_syntax(thd, part_info, &syntax_len, + true, create_info, alter_info); + thd->variables.sql_mode= old_mode; + if (!part_syntax_buf) goto err; part_info->part_info_string= part_syntax_buf; part_info->part_info_len= syntax_len; @@ -4796,7 +4817,7 @@ int create_table_impl(THD *thd, thd->variables.option_bits|= OPTION_KEEP_LOG; thd->log_current_statement= 1; create_info->table_was_deleted= 1; - DBUG_EXECUTE_IF("send_kill_after_delete", thd->killed= KILL_QUERY; ); + DBUG_EXECUTE_IF("send_kill_after_delete", thd->set_killed(KILL_QUERY); ); /* Restart statement transactions for the case of CREATE ... SELECT. @@ -5084,6 +5105,9 @@ err: if (thd->is_current_stmt_binlog_format_row() && create_info->tmp_table()) DBUG_RETURN(result); + if (create_info->tmp_table()) + thd->transaction.stmt.mark_created_temp_table(); + /* Write log if no error or if we already deleted a table */ if (!result || thd->log_current_statement) { @@ -5610,13 +5634,17 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table, DBUG_PRINT("info", ("res: %d tmp_table: %d create_info->table: %p", res, create_info->tmp_table(), local_create_info.table)); - if (!res && create_info->tmp_table() && local_create_info.table) + if (create_info->tmp_table()) { - /* - Remember that tmp table creation was logged so that we know if - we should log a delete of it. - */ - local_create_info.table->s->table_creation_was_logged= 1; + thd->transaction.stmt.mark_created_temp_table(); + if (!res && local_create_info.table) + { + /* + Remember that tmp table creation was logged so that we know if + we should log a delete of it. + */ + local_create_info.table->s->table_creation_was_logged= 1; + } } do_logging= TRUE; } @@ -7022,7 +7050,8 @@ bool alter_table_manage_keys(TABLE *table, int indexes_were_disabled, case Alter_info::LEAVE_AS_IS: if (!indexes_were_disabled) break; - /* fall-through: disabled indexes */ + /* disabled indexes */ + /* fall through */ case Alter_info::DISABLE: error= table->file->ha_disable_indexes(HA_KEY_SWITCH_NONUNIQ_SAVE); } @@ -7161,6 +7190,7 @@ static bool mysql_inplace_alter_table(THD *thd, HA_CREATE_INFO *create_info= ha_alter_info->create_info; Alter_info *alter_info= ha_alter_info->alter_info; bool reopen_tables= false; + bool res; DBUG_ENTER("mysql_inplace_alter_table"); @@ -7295,11 +7325,12 @@ static bool mysql_inplace_alter_table(THD *thd, DEBUG_SYNC(thd, "alter_table_inplace_after_lock_downgrade"); THD_STAGE_INFO(thd, stage_alter_inplace); - if (table->file->ha_inplace_alter_table(altered_table, - ha_alter_info)) - { + /* We can abort alter table for any table type */ + thd->abort_on_warning= !ha_alter_info->ignore && thd->is_strict_mode(); + res= table->file->ha_inplace_alter_table(altered_table, ha_alter_info); + thd->abort_on_warning= false; + if (res) goto rollback; - } // Upgrade to EXCLUSIVE before commit. if (wait_while_table_is_used(thd, table, HA_EXTRA_PREPARE_FOR_RENAME)) @@ -7531,6 +7562,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, bool modified_primary_key= FALSE; Create_field *def; Field **f_ptr,*field; + MY_BITMAP *dropped_fields= NULL; // if it's NULL - no dropped fields DBUG_ENTER("mysql_prepare_alter_table"); /* @@ -7587,6 +7619,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, /* First collect all fields from table which isn't in drop_list */ + bitmap_clear_all(&table->tmp_set); for (f_ptr=table->field ; (field= *f_ptr) ; f_ptr++) { Alter_drop *drop; @@ -7597,23 +7630,23 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, while ((drop=drop_it++)) { if (drop->type == Alter_drop::COLUMN && - !my_strcasecmp(system_charset_info,field->field_name, drop->name)) - { - /* Reset auto_increment value if it was dropped */ - if (MTYP_TYPENR(field->unireg_check) == Field::NEXT_NUMBER && - !(used_fields & HA_CREATE_USED_AUTO)) - { - create_info->auto_increment_value=0; - create_info->used_fields|=HA_CREATE_USED_AUTO; - } + !my_strcasecmp(system_charset_info, field->field_name, drop->name)) break; - } } if (drop) { + /* Reset auto_increment value if it was dropped */ + if (MTYP_TYPENR(field->unireg_check) == Field::NEXT_NUMBER && + !(used_fields & HA_CREATE_USED_AUTO)) + { + create_info->auto_increment_value=0; + create_info->used_fields|=HA_CREATE_USED_AUTO; + } if (table->s->tmp_table == NO_TMP_TABLE) (void) delete_statistics_for_column(thd, table, field); drop_it.remove(); + dropped_fields= &table->tmp_set; + bitmap_set_bit(dropped_fields, field->field_index); continue; } /* Check if field is changed */ @@ -7680,9 +7713,25 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, { if (def->change && ! def->field) { - my_error(ER_BAD_FIELD_ERROR, MYF(0), def->change, - table->s->table_name.str); - goto err; + /* + Check if there is modify for newly added field. + */ + Create_field *find; + find_it.rewind(); + while((find=find_it++)) + { + if (!my_strcasecmp(system_charset_info,find->field_name, def->field_name)) + break; + } + + if (find && !find->field) + find_it.remove(); + else + { + my_error(ER_BAD_FIELD_ERROR, MYF(0), def->change, + table->s->table_name.str); + goto err; + } } /* Check that the DATE/DATETIME not null field we are going to add is @@ -7748,6 +7797,29 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, find_it.after(def); // Put column after this } } + /* + Check if there is alter for newly added field. + */ + alter_it.rewind(); + Alter_column *alter; + while ((alter=alter_it++)) + { + if (!my_strcasecmp(system_charset_info,def->field_name, alter->name)) + break; + } + if (alter) + { + if (def->sql_type == MYSQL_TYPE_BLOB) + { + my_error(ER_BLOB_CANT_HAVE_DEFAULT, MYF(0), def->change); + goto err; + } + if ((def->default_value= alter->default_value)) // Use new default + def->flags&= ~NO_DEFAULT_VALUE_FLAG; + else + def->flags|= NO_DEFAULT_VALUE_FLAG; + alter_it.remove(); + } } if (alter_info->alter_list.elements) { @@ -7800,6 +7872,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, continue; } + const char *dropped_key_part= NULL; KEY_PART_INFO *key_part= key_info->key_part; key_parts.empty(); bool delete_index_stat= FALSE; @@ -7829,6 +7902,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, if (table->s->primary_key == i) modified_primary_key= TRUE; delete_index_stat= TRUE; + dropped_key_part= key_part_name; continue; // Field is removed } key_part_length= key_part->length; @@ -7911,6 +7985,11 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, key_type= Key::PRIMARY; else key_type= Key::UNIQUE; + if (dropped_key_part) + { + my_error(ER_KEY_COLUMN_DOES_NOT_EXITS, MYF(0), dropped_key_part); + goto err; + } } else if (key_info->flags & HA_FULLTEXT) key_type= Key::FULLTEXT; @@ -7961,6 +8040,23 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, break; } } + /* see if the constraint depends on *only* on dropped fields */ + if (!drop && dropped_fields) + { + table->default_column_bitmaps(); + bitmap_clear_all(table->read_set); + check->expr->walk(&Item::register_field_in_read_map, 1, 0); + if (bitmap_is_subset(table->read_set, dropped_fields)) + drop= (Alter_drop*)1; + else if (bitmap_is_overlapping(dropped_fields, table->read_set)) + { + bitmap_intersect(table->read_set, dropped_fields); + uint field_nr= bitmap_get_first_set(table->read_set); + my_error(ER_BAD_FIELD_ERROR, MYF(0), + table->field[field_nr]->field_name, "CHECK"); + goto err; + } + } if (!drop) new_constraint_list.push_back(check, thd->mem_root); } @@ -8957,11 +9053,8 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, alter_info->requested_algorithm != Alter_info::ALTER_TABLE_ALGORITHM_INPLACE) || is_inplace_alter_impossible(table, create_info, alter_info) -#ifdef WITH_PARTITION_STORAGE_ENGINE - || (partition_changed && - !(table->s->db_type()->partition_flags() & HA_USE_AUTO_PARTITION)) -#endif - ) + || IF_PARTITIONING((partition_changed && + !(table->s->db_type()->partition_flags() & HA_USE_AUTO_PARTITION)), 0)) { if (alter_info->requested_algorithm == Alter_info::ALTER_TABLE_ALGORITHM_INPLACE) @@ -9119,7 +9212,9 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, TODO don't create the frm in the first place */ - deletefrm(alter_ctx.get_tmp_path()); + const char *path= alter_ctx.get_tmp_path(); + table->file->ha_create_partitioning_metadata(path, NULL, CHF_DELETE_FLAG); + deletefrm(path); my_free(const_cast(frm.str)); goto end_inplace; } @@ -9645,8 +9740,12 @@ bool mysql_trans_prepare_alter_copy_data(THD *thd) bool mysql_trans_commit_alter_copy_data(THD *thd) { bool error= FALSE; + uint save_unsafe_rollback_flags; DBUG_ENTER("mysql_trans_commit_alter_copy_data"); + /* Save flags as transcommit_implicit_are_deleting_them */ + save_unsafe_rollback_flags= thd->transaction.stmt.m_unsafe_rollback_flags; + if (ha_enable_transaction(thd, TRUE)) DBUG_RETURN(TRUE); @@ -9661,6 +9760,7 @@ bool mysql_trans_commit_alter_copy_data(THD *thd) if (trans_commit_implicit(thd)) error= TRUE; + thd->transaction.stmt.m_unsafe_rollback_flags= save_unsafe_rollback_flags; DBUG_RETURN(error); } @@ -9923,7 +10023,9 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, } if (to->file->ha_end_bulk_insert() && error <= 0) { - to->file->print_error(my_errno,MYF(0)); + /* Give error, if not already given */ + if (!thd->is_error()) + to->file->print_error(my_errno,MYF(0)); error= 1; } to->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY); diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 431d6822f0e..7cbc69f2ee7 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -1,5 +1,5 @@ -/* Copyright (c) 2000, 2014, Oracle and/or its affiliates. - Copyright (c) 2010, 2014, SkySQL Ab. +/* Copyright (c) 2000, 2017, Oracle and/or its affiliates. + Copyright (c) 2010, 2017, Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -610,6 +610,19 @@ bool st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result, Item *item_tmp; while ((item_tmp= it++)) { + /* + If the outer query has a GROUP BY clause, an outer reference to this + query block may have been wrapped in a Item_outer_ref, which has not + been fixed yet. An Item_type_holder must be created based on a fixed + Item, so use the inner Item instead. + */ + DBUG_ASSERT(item_tmp->fixed || + (item_tmp->type() == Item::REF_ITEM && + ((Item_ref *)(item_tmp))->ref_type() == + Item_ref::OUTER_REF)); + if (!item_tmp->fixed) + item_tmp= item_tmp->real_item(); + /* Error's in 'new' will be detected after loop */ types.push_back(new (thd_arg->mem_root) Item_type_holder(thd_arg, item_tmp)); @@ -772,7 +785,9 @@ bool st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result, if (saved_error) goto err; - if (fake_select_lex != NULL && thd->stmt_arena->is_stmt_prepare()) + if (fake_select_lex != NULL && + (thd->stmt_arena->is_stmt_prepare() || + (thd->lex->context_analysis_only & CONTEXT_ANALYSIS_ONLY_VIEW))) { /* Validate the global parameters of this union */ @@ -1510,4 +1525,3 @@ void st_select_lex_unit::set_unique_exclude() } } } - diff --git a/sql/sql_update.cc b/sql/sql_update.cc index 35e1fe24b97..4488435491e 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -918,7 +918,7 @@ int mysql_update(THD *thd, // simulated killing after the loop must be ineffective for binlogging DBUG_EXECUTE_IF("simulate_kill_bug27571", { - thd->killed= KILL_QUERY; + thd->set_killed(KILL_QUERY); };); error= (killed_status == NOT_KILLED)? error : 1; @@ -2308,6 +2308,26 @@ int multi_update::do_updates() do_update= 0; // Don't retry this function if (!found) DBUG_RETURN(0); + + /* + Update read_set to include all fields that virtual columns may depend on. + Usually they're already in the read_set, but if the previous access + method was keyread, only the virtual column itself will be in read_set, + not its dependencies + */ + while(TABLE *tbl= check_opt_it++) + { + if (tbl->vcol_set) + { + bitmap_clear_all(tbl->vcol_set); + for (Field **vf= tbl->vfield; *vf; vf++) + { + if (bitmap_is_set(tbl->read_set, (*vf)->field_index)) + tbl->mark_virtual_col(*vf); + } + } + } + for (cur_table= update_tables; cur_table; cur_table= cur_table->next_local) { bool can_compare_record; diff --git a/sql/sql_window.cc b/sql/sql_window.cc index 557c7503306..0e407308d4e 100644 --- a/sql/sql_window.cc +++ b/sql/sql_window.cc @@ -2761,7 +2761,7 @@ bool Window_func_runner::exec(THD *thd, TABLE *tbl, SORT_INFO *filesort_result) bool Window_funcs_sort::exec(JOIN *join) { THD *thd= join->thd; - JOIN_TAB *join_tab= &join->join_tab[join->top_join_tab_count]; + JOIN_TAB *join_tab= join->join_tab + join->exec_join_tab_cnt(); /* Sort the table based on the most specific sorting criteria of the window functions. */ @@ -2841,11 +2841,6 @@ bool Window_funcs_sort::setup(THD *thd, SQL_SELECT *sel, sort_order= order; } filesort= new (thd->mem_root) Filesort(sort_order, HA_POS_ERROR, true, NULL); - if (!join_tab->join->top_join_tab_count) - { - filesort->tracker= - new (thd->mem_root) Filesort_tracker(thd->lex->analyze_stmt); - } /* Apply the same condition that the subsequent sort has. */ filesort->select= sel; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index fdb40407ffb..5f956e02bcf 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1952,8 +1952,8 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); procedure_list procedure_list2 procedure_item field_def handler opt_generated_always opt_ignore opt_column opt_restrict - grant revoke set lock unlock string_list field_options field_option - field_opt_list opt_binary table_lock_list table_lock + grant revoke set lock unlock string_list field_options + opt_binary table_lock_list table_lock ref_list opt_match_clause opt_on_update_delete use opt_delete_options opt_delete_option varchar nchar nvarchar opt_outer table_list table_name table_alias_ref_list table_alias_ref @@ -4774,9 +4774,11 @@ size_number: case 'g': case 'G': text_shift_number+=10; + /* fall through */ case 'm': case 'M': text_shift_number+=10; + /* fall through */ case 'k': case 'K': text_shift_number+=10; @@ -6476,6 +6478,11 @@ field_type: { $$.set(MYSQL_TYPE_SET); } | LONG_SYM opt_binary { $$.set(MYSQL_TYPE_MEDIUM_BLOB); } + | JSON_SYM + { + Lex->charset= &my_charset_utf8mb4_bin; + $$.set(MYSQL_TYPE_LONG_BLOB); + } ; spatial_type: @@ -6553,18 +6560,11 @@ precision: field_options: /* empty */ {} - | field_opt_list {} - ; - -field_opt_list: - field_opt_list field_option {} - | field_option {} - ; - -field_option: - SIGNED_SYM {} + | SIGNED_SYM {} | UNSIGNED { Lex->last_field->flags|= UNSIGNED_FLAG;} | ZEROFILL { Lex->last_field->flags|= UNSIGNED_FLAG | ZEROFILL_FLAG; } + | UNSIGNED ZEROFILL { Lex->last_field->flags|= UNSIGNED_FLAG | ZEROFILL_FLAG; } + | ZEROFILL UNSIGNED { Lex->last_field->flags|= UNSIGNED_FLAG | ZEROFILL_FLAG; } ; field_length: @@ -6631,19 +6631,7 @@ serial_attribute: lex->last_field->flags|= PRI_KEY_FLAG | NOT_NULL_FLAG; lex->alter_info.flags|= Alter_info::ALTER_ADD_INDEX; } - | UNIQUE_SYM - { - LEX *lex=Lex; - lex->last_field->flags|= UNIQUE_KEY_FLAG; - lex->alter_info.flags|= Alter_info::ALTER_ADD_INDEX; - } - | UNIQUE_SYM KEY_SYM - { - LEX *lex=Lex; - lex->last_field->flags|= UNIQUE_KEY_FLAG; - lex->alter_info.flags|= Alter_info::ALTER_ADD_INDEX; - } - | COMMENT_SYM TEXT_STRING_sys { Lex->last_field->comment= $2; } + | vcol_attribute | IDENT_sys equal TEXT_STRING_sys { if ($3.length > ENGINE_OPTION_MAX_LENGTH) @@ -14996,8 +14984,9 @@ set_stmt_option_value_following_option_type_list: */ option_value_following_option_type | set_stmt_option_value_following_option_type_list ',' option_value_following_option_type + ; -// Start of option value list +/* Start of option value list */ start_option_value_list: option_value_no_option_type { @@ -15022,7 +15011,7 @@ start_option_value_list: ; -// Start of option value list, option_type was given +/* Start of option value list, option_type was given */ start_option_value_list_following_option_type: option_value_following_option_type { @@ -15037,13 +15026,13 @@ start_option_value_list_following_option_type: } ; -// Remainder of the option value list after first option value. +/* Remainder of the option value list after first option value. */ option_value_list_continued: /* empty */ | ',' option_value_list ; -// Repeating list of option values after first option value. +/* Repeating list of option values after first option value. */ option_value_list: { sp_create_assignment_lex(thd, yychar == YYEMPTY); @@ -15064,7 +15053,7 @@ option_value_list: } ; -// Wrapper around option values following the first option value in the stmt. +/* Wrapper around option values following the first option value in the stmt. */ option_value: option_type { @@ -15094,7 +15083,7 @@ opt_var_ident_type: | SESSION_SYM '.' { $$=OPT_SESSION; } ; -// Option values with preceding option_type. +/* Option values with preceding option_type. */ option_value_following_option_type: internal_variable_name equal set_expr_or_default { @@ -15118,7 +15107,7 @@ option_value_following_option_type: } ; -// Option values without preceding option_type. +/* Option values without preceding option_type. */ option_value_no_option_type: internal_variable_name equal set_expr_or_default { diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 209b17ff377..7405ca7e884 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -62,6 +62,7 @@ #include "sql_repl.h" #include "opt_range.h" #include "rpl_parallel.h" +#include /* The rule for this file: everything should be 'static'. When a sys_var @@ -371,7 +372,7 @@ static Sys_var_mybool Sys_automatic_sp_privileges( static Sys_var_ulong Sys_back_log( "back_log", "The number of outstanding connection requests " - "MariaDB can have. This comes into play when the main MySQL thread " + "MariaDB can have. This comes into play when the main MariaDB thread " "gets very many connection requests in a very short time", AUTO_SET READ_ONLY GLOBAL_VAR(back_log), CMD_LINE(REQUIRED_ARG), VALID_RANGE(0, 65535), DEFAULT(150), BLOCK_SIZE(1)); @@ -395,7 +396,7 @@ static Sys_var_ulonglong Sys_binlog_stmt_cache_size( "binlog_stmt_cache_size", "The size of the statement cache for " "updates to non-transactional engines for the binary log. " "If you often use statements updating a great number of rows, " - "you can increase this to get more performance", + "you can increase this to get more performance.", GLOBAL_VAR(binlog_stmt_cache_size), CMD_LINE(REQUIRED_ARG), VALID_RANGE(IO_SIZE, SIZE_T_MAX), DEFAULT(32768), BLOCK_SIZE(IO_SIZE)); @@ -823,7 +824,15 @@ export bool fix_delay_key_write(sys_var *self, THD *thd, enum_var_type type) } static const char *delay_key_write_names[]= { "OFF", "ON", "ALL", NullS }; static Sys_var_enum Sys_delay_key_write( - "delay_key_write", "Type of DELAY_KEY_WRITE", + "delay_key_write", "Specifies how MyISAM tables handles CREATE " + "TABLE DELAY_KEY_WRITE. If set to ON, the default, any DELAY KEY " + "WRITEs are honored. The key buffer is then flushed only when the " + "table closes, speeding up writes. MyISAM tables should be " + "automatically checked upon startup in this case, and " + "--external locking should not be used, as it can lead to index " + "corruption. If set to OFF, DELAY KEY WRITEs are ignored, while if " + "set to ALL, all new opened tables are treated as if created with " + "DELAY KEY WRITEs enabled.", GLOBAL_VAR(delay_key_write_options), CMD_LINE(OPT_ARG), delay_key_write_names, DEFAULT(DELAY_KEY_WRITE_ON), NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0), @@ -833,7 +842,7 @@ static Sys_var_ulong Sys_delayed_insert_limit( "delayed_insert_limit", "After inserting delayed_insert_limit rows, the INSERT DELAYED " "handler will check if there are any SELECT statements pending. " - "If so, it allows these to execute before continuing", + "If so, it allows these to execute before continuing.", GLOBAL_VAR(delayed_insert_limit), CMD_LINE(REQUIRED_ARG), VALID_RANGE(1, UINT_MAX), DEFAULT(DELAYED_LIMIT), BLOCK_SIZE(1)); @@ -1740,7 +1749,10 @@ Sys_var_gtid_binlog_state::do_check(THD *thd, set_var *var) return true; } if (res->length() == 0) + { list= NULL; + list_len= 0; + } else if (!(list= gtid_parse_string_to_list(res->ptr(), res->length(), &list_len))) { @@ -2351,7 +2363,7 @@ static Sys_var_ulong Sys_optimizer_search_depth( "query plans, but take longer to compile a query. Values smaller " "than the number of tables in a relation result in faster " "optimization, but may produce very bad query plans. If set to 0, " - "the system will automatically pick a reasonable value", + "the system will automatically pick a reasonable value.", SESSION_VAR(optimizer_search_depth), CMD_LINE(REQUIRED_ARG), VALID_RANGE(0, MAX_TABLES+1), DEFAULT(MAX_TABLES+1), BLOCK_SIZE(1), NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0), ON_UPDATE(0)); @@ -2433,7 +2445,7 @@ static Sys_var_ulong Sys_preload_buff_size( static Sys_var_uint Sys_protocol_version( "protocol_version", - "The version of the client/server protocol used by the MySQL server", + "The version of the client/server protocol used by the MariaDB server", READ_ONLY GLOBAL_VAR(protocol_version), CMD_LINE_HELP_ONLY, VALID_RANGE(0, ~0U), DEFAULT(PROTOCOL_VERSION), BLOCK_SIZE(1)); @@ -2883,7 +2895,7 @@ static Sys_var_enum Slave_exec_mode( "For example, in row based replication attempts to delete rows that " "doesn't exist will be ignored. " "In STRICT mode, replication will stop on any unexpected difference " - "between the master and the slave", + "between the master and the slave.", GLOBAL_VAR(slave_exec_mode_options), CMD_LINE(REQUIRED_ARG), slave_exec_mode_names, DEFAULT(SLAVE_EXEC_MODE_STRICT)); @@ -3049,6 +3061,10 @@ static bool fix_sql_mode(sys_var *self, THD *thd, enum_var_type type) thd->server_status|= SERVER_STATUS_NO_BACKSLASH_ESCAPES; else thd->server_status&= ~SERVER_STATUS_NO_BACKSLASH_ESCAPES; + if (thd->variables.sql_mode & MODE_ANSI_QUOTES) + thd->server_status|= SERVER_STATUS_ANSI_QUOTES; + else + thd->server_status&= ~SERVER_STATUS_ANSI_QUOTES; } return false; } @@ -3412,18 +3428,39 @@ bool Sys_var_tx_read_only::session_update(THD *thd, set_var *var) static Sys_var_tx_read_only Sys_tx_read_only( - "tx_read_only", "Set default transaction access mode to read only.", + "tx_read_only", "Default transaction access mode. If set to OFF, " + "the default, access is read/write. If set to ON, access is read-only. " + "The SET TRANSACTION statement can also change the value of this variable. " + "See SET TRANSACTION and START TRANSACTION.", SESSION_VAR(tx_read_only), NO_CMD_LINE, DEFAULT(0), NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(check_tx_read_only)); static Sys_var_ulonglong Sys_tmp_table_size( "tmp_table_size", - "If an internal in-memory temporary table exceeds this size, MySQL " - "will automatically convert it to an on-disk MyISAM or Aria table", - SESSION_VAR(tmp_table_size), CMD_LINE(REQUIRED_ARG), + "Alias for tmp_memory_table_size. " + "If an internal in-memory temporary table exceeds this size, MariaDB " + "will automatically convert it to an on-disk MyISAM or Aria table.", + SESSION_VAR(tmp_memory_table_size), CMD_LINE(REQUIRED_ARG), VALID_RANGE(1024, (ulonglong)~(intptr)0), DEFAULT(16*1024*1024), BLOCK_SIZE(1)); +static Sys_var_ulonglong Sys_tmp_memory_table_size( + "tmp_memory_table_size", + "If an internal in-memory temporary table exceeds this size, MariaDB " + "will automatically convert it to an on-disk MyISAM or Aria table. " + "Same as tmp_table_size.", + SESSION_VAR(tmp_memory_table_size), CMD_LINE(REQUIRED_ARG), + VALID_RANGE(1024, (ulonglong)~(intptr)0), DEFAULT(16*1024*1024), + BLOCK_SIZE(1)); + +static Sys_var_ulonglong Sys_tmp_disk_table_size( + "tmp_disk_table_size", + "Max size for data for an internal temporary on-disk MyISAM or Aria table.", + SESSION_VAR(tmp_disk_table_size), CMD_LINE(REQUIRED_ARG), + VALID_RANGE(1024, (ulonglong)~(intptr)0), + DEFAULT((ulonglong)~(intptr)0), + BLOCK_SIZE(1)); + static Sys_var_mybool Sys_timed_mutexes( "timed_mutexes", "Specify whether to time mutexes. Deprecated, has no effect.", @@ -3432,27 +3469,35 @@ static Sys_var_mybool Sys_timed_mutexes( DEPRECATED("")); static Sys_var_charptr Sys_version( - "version", "Server version", + "version", "Server version number. It may also include a suffix " + "with configuration or build information. -debug indicates " + "debugging support was enabled on the server, and -log indicates " + "at least one of the binary log, general log or slow query log are " + "enabled, for example 10.1.1-MariaDB-mariadb1precise-log.", READ_ONLY GLOBAL_VAR(server_version_ptr), CMD_LINE_HELP_ONLY, IN_SYSTEM_CHARSET, DEFAULT(server_version)); static char *server_version_comment_ptr; static Sys_var_charptr Sys_version_comment( - "version_comment", "version_comment", + "version_comment", "Value of the COMPILATION_COMMENT option " + "specified by CMake when building MariaDB, for example " + "mariadb.org binary distribution.", READ_ONLY GLOBAL_VAR(server_version_comment_ptr), CMD_LINE_HELP_ONLY, IN_SYSTEM_CHARSET, DEFAULT(MYSQL_COMPILATION_COMMENT)); static char *server_version_compile_machine_ptr; static Sys_var_charptr Sys_version_compile_machine( - "version_compile_machine", "version_compile_machine", + "version_compile_machine", "The machine type or architecture " + "MariaDB was built on, for example i686.", READ_ONLY GLOBAL_VAR(server_version_compile_machine_ptr), CMD_LINE_HELP_ONLY, IN_SYSTEM_CHARSET, DEFAULT(DEFAULT_MACHINE)); static char *server_version_compile_os_ptr; static Sys_var_charptr Sys_version_compile_os( - "version_compile_os", "version_compile_os", + "version_compile_os", "Operating system that MariaDB was built " + "on, for example debian-linux-gnu.", READ_ONLY GLOBAL_VAR(server_version_compile_os_ptr), CMD_LINE_HELP_ONLY, IN_SYSTEM_CHARSET, DEFAULT(SYSTEM_TYPE)); @@ -3484,16 +3529,6 @@ static Sys_var_charptr Sys_malloc_library( READ_ONLY GLOBAL_VAR(malloc_library), CMD_LINE_HELP_ONLY, IN_SYSTEM_CHARSET, DEFAULT(guess_malloc_library())); -#ifdef HAVE_YASSL -#include -#define SSL_LIBRARY "YaSSL " YASSL_VERSION -#elif HAVE_OPENSSL -#include -#define SSL_LIBRARY SSLeay_version(SSLEAY_VERSION) -#else -#error No SSL? -#endif - static char *ssl_library; static Sys_var_charptr Sys_ssl_library( "version_ssl_library", "Version of the used SSL library", @@ -3638,24 +3673,34 @@ static bool fix_autocommit(sys_var *self, THD *thd, enum_var_type type) } static Sys_var_bit Sys_autocommit( - "autocommit", "autocommit", + "autocommit", "If set to 1, the default, all queries are committed " + "immediately. If set to 0, they are only committed upon a COMMIT statement" + ", or rolled back with a ROLLBACK statement. If autocommit is set to 0, " + "and then changed to 1, all open transactions are immediately committed.", NO_SET_STMT SESSION_VAR(option_bits), NO_CMD_LINE, OPTION_AUTOCOMMIT, DEFAULT(TRUE), NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0), ON_UPDATE(fix_autocommit)); export sys_var *Sys_autocommit_ptr= &Sys_autocommit; // for sql_yacc.yy static Sys_var_mybool Sys_big_tables( - "big_tables", "Allow big result sets by saving all " - "temporary sets on file (Solves most 'table full' errors)", + "big_tables", "Old variable, which if set to 1, allows large result sets " + "by saving all temporary sets to disk, avoiding 'table full' errors. No " + "longer needed, as the server now handles this automatically. " + "sql_big_tables is a synonym.", SESSION_VAR(big_tables), CMD_LINE(OPT_ARG), DEFAULT(FALSE)); static Sys_var_bit Sys_big_selects( - "sql_big_selects", "sql_big_selects", + "sql_big_selects", "If set to 0, MariaDB will not perform large SELECTs." + " See max_join_size for details. If max_join_size is set to anything but " + "DEFAULT, sql_big_selects is automatically set to 0. If sql_big_selects " + "is again set, max_join_size will be ignored.", SESSION_VAR(option_bits), NO_CMD_LINE, OPTION_BIG_SELECTS, DEFAULT(FALSE)); static Sys_var_bit Sys_log_off( - "sql_log_off", "sql_log_off", + "sql_log_off", "If set to 1 (0 is the default), no logging to the general " + "query log is done for the client. Only clients with the SUPER privilege " + "can update this variable.", NO_SET_STMT SESSION_VAR(option_bits), NO_CMD_LINE, OPTION_LOG_OFF, DEFAULT(FALSE), NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(check_has_super)); @@ -3712,50 +3757,80 @@ static bool check_sql_log_bin(sys_var *self, THD *thd, set_var *var) return FALSE; } -static Sys_var_mybool Sys_log_binlog( - "sql_log_bin", "Controls whether logging to the binary log is done", +static Sys_var_mybool Sys_log_binlog( + "sql_log_bin", "If set to 0 (1 is the default), no logging to the binary " + "log is done for the client. Only clients with the SUPER privilege can " + "update this variable. Can have unintended consequences if set globally, " + "see SET SQL_LOG_BIN. Starting MariaDB 10.1.7, this variable does not " + "affect the replication of events in a Galera cluster.", SESSION_VAR(sql_log_bin), NO_CMD_LINE, DEFAULT(TRUE), NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(check_sql_log_bin), ON_UPDATE(fix_sql_log_bin_after_update)); static Sys_var_bit Sys_sql_warnings( - "sql_warnings", "sql_warnings", + "sql_warnings", "If set to 1, single-row INSERTs will produce a string " + "containing warning information if a warning occurs.", SESSION_VAR(option_bits), NO_CMD_LINE, OPTION_WARNINGS, DEFAULT(FALSE)); static Sys_var_bit Sys_sql_notes( - "sql_notes", "sql_notes", + "sql_notes", "If set to 1, the default, warning_count is incremented each " + "time a Note warning is encountered. If set to 0, Note warnings are not " + "recorded. mysqldump has outputs to set this variable to 0 so that no " + "unnecessary increments occur when data is reloaded.", SESSION_VAR(option_bits), NO_CMD_LINE, OPTION_SQL_NOTES, DEFAULT(TRUE)); static Sys_var_bit Sys_auto_is_null( - "sql_auto_is_null", "sql_auto_is_null", + "sql_auto_is_null", "If set to 1, the query SELECT * FROM table_name WHERE " + "auto_increment_column IS NULL will return an auto-increment that has just " + "been successfully inserted, the same as the LAST_INSERT_ID() function. Some" + " ODBC programs make use of this IS NULL comparison.", SESSION_VAR(option_bits), NO_CMD_LINE, OPTION_AUTO_IS_NULL, DEFAULT(FALSE), NO_MUTEX_GUARD, IN_BINLOG); static Sys_var_bit Sys_safe_updates( - "sql_safe_updates", "sql_safe_updates", + "sql_safe_updates", "If set to 1, UPDATEs and DELETEs need either a key in " + "the WHERE clause, or a LIMIT clause, or else they will aborted. Prevents " + "the common mistake of accidentally deleting or updating every row in a table.", SESSION_VAR(option_bits), NO_CMD_LINE, OPTION_SAFE_UPDATES, DEFAULT(FALSE)); static Sys_var_bit Sys_buffer_results( - "sql_buffer_result", "sql_buffer_result", + "sql_buffer_result", "If set to 1 (0 is default), results from SELECT " + "statements are always placed into temporary tables. This can help the " + "server when it takes a long time to send the results to the client by " + "allowing the table locks to be freed early.", SESSION_VAR(option_bits), NO_CMD_LINE, OPTION_BUFFER_RESULT, DEFAULT(FALSE)); static Sys_var_bit Sys_quote_show_create( - "sql_quote_show_create", "sql_quote_show_create", + "sql_quote_show_create", "If set to 1, the default, the server will " + "quote identifiers for SHOW CREATE DATABASE, SHOW CREATE TABLE and " + "SHOW CREATE VIEW statements. Quoting is disabled if set to 0. Enable " + "to ensure replications works when identifiers require quoting.", SESSION_VAR(option_bits), NO_CMD_LINE, OPTION_QUOTE_SHOW_CREATE, DEFAULT(TRUE)); static Sys_var_bit Sys_foreign_key_checks( - "foreign_key_checks", "foreign_key_checks", + "foreign_key_checks", "If set to 1 (the default) foreign key constraints" + " (including ON UPDATE and ON DELETE behavior) InnoDB tables are checked," + " while if set to 0, they are not checked. 0 is not recommended for normal " + "use, though it can be useful in situations where you know the data is " + "consistent, but want to reload data in a different order from that that " + "specified by parent/child relationships. Setting this variable to 1 does " + "not retrospectively check for inconsistencies introduced while set to 0.", SESSION_VAR(option_bits), NO_CMD_LINE, REVERSE(OPTION_NO_FOREIGN_KEY_CHECKS), DEFAULT(TRUE), NO_MUTEX_GUARD, IN_BINLOG); static Sys_var_bit Sys_unique_checks( - "unique_checks", "unique_checks", + "unique_checks", "If set to 1, the default, secondary indexes in InnoDB " + "tables are performed. If set to 0, storage engines can (but are not " + "required to) assume that duplicate keys are not present in input data. " + "Set to 0 to speed up imports of large tables to InnoDB. The storage " + "engine will still issue a duplicate key error if it detects one, even " + "if set to 0.", SESSION_VAR(option_bits), NO_CMD_LINE, REVERSE(OPTION_RELAXED_UNIQUE_CHECKS), DEFAULT(TRUE), NO_MUTEX_GUARD, IN_BINLOG); @@ -3775,13 +3850,16 @@ static bool update_profiling(sys_var *self, THD *thd, enum_var_type type) } static Sys_var_bit Sys_profiling( - "profiling", "profiling", + "profiling", "If set to 1 (0 is default), statement profiling will be " + "enabled. See SHOW PROFILES and SHOW PROFILE.", NO_SET_STMT SESSION_VAR(option_bits), NO_CMD_LINE, OPTION_PROFILING, DEFAULT(FALSE), NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0), ON_UPDATE(update_profiling)); static Sys_var_ulong Sys_profiling_history_size( - "profiling_history_size", "Limit of query profiling memory", + "profiling_history_size", "Number of statements about which profiling " + "information is maintained. If set to 0, no profiles are stored. " + "See SHOW PROFILES.", NO_SET_STMT SESSION_VAR(profiling_history_size), CMD_LINE(REQUIRED_ARG), VALID_RANGE(0, 100), DEFAULT(15), BLOCK_SIZE(1)); #endif @@ -3815,7 +3893,11 @@ static bool check_skip_replication(sys_var *self, THD *thd, set_var *var) } static Sys_var_bit Sys_skip_replication( - "skip_replication", "skip_replication", + "skip_replication", "Changes are logged into the binary log with the " + "@@skip_replication flag set. Such events will not be replicated by " + "slaves that run with --replicate-events-marked-for-skip set different " + "from its default of REPLICATE. See Selectively skipping replication " + "of binlog events for more information.", NO_SET_STMT SESSION_ONLY(option_bits), NO_CMD_LINE, OPTION_SKIP_REPLICATION, DEFAULT(FALSE), NO_MUTEX_GUARD, NOT_IN_BINLOG, @@ -4158,43 +4240,61 @@ static Sys_var_charptr Sys_slow_log_path( ON_CHECK(check_log_path), ON_UPDATE(fix_slow_log_file)); static Sys_var_have Sys_have_compress( - "have_compress", "have_compress", + "have_compress", "If the zlib compression library is accessible to the " + "server, this will be set to YES, otherwise it will be NO. The COMPRESS() " + "and UNCOMPRESS() functions will only be available if set to YES.", READ_ONLY GLOBAL_VAR(have_compress), NO_CMD_LINE); static Sys_var_have Sys_have_crypt( - "have_crypt", "have_crypt", + "have_crypt", "If the crypt() system call is available this variable will " + "be set to YES, otherwise it will be set to NO. If set to NO, the " + "ENCRYPT() function cannot be used.", READ_ONLY GLOBAL_VAR(have_crypt), NO_CMD_LINE); static Sys_var_have Sys_have_dlopen( - "have_dynamic_loading", "have_dynamic_loading", + "have_dynamic_loading", "If the server supports dynamic loading of plugins, " + "will be set to YES, otherwise will be set to NO.", READ_ONLY GLOBAL_VAR(have_dlopen), NO_CMD_LINE); static Sys_var_have Sys_have_geometry( - "have_geometry", "have_geometry", + "have_geometry", "If the server supports spatial data types, will be set to " + "YES, otherwise will be set to NO.", READ_ONLY GLOBAL_VAR(have_geometry), NO_CMD_LINE); static Sys_var_have Sys_have_openssl( - "have_openssl", "have_openssl", + "have_openssl", "Comparing have_openssl with have_ssl will indicate whether " + "YaSSL or openssl was used. If YaSSL, have_ssl will be YES, but have_openssl " + "will be NO.", READ_ONLY GLOBAL_VAR(have_openssl), NO_CMD_LINE); static Sys_var_have Sys_have_profiling( - "have_profiling", "have_profiling", + "have_profiling", "If statement profiling is available, will be set to YES, " + "otherwise will be set to NO. See SHOW PROFILES and SHOW PROFILE.", READ_ONLY GLOBAL_VAR(have_profiling), NO_CMD_LINE); static Sys_var_have Sys_have_query_cache( - "have_query_cache", "have_query_cache", + "have_query_cache", "If the server supports the query cache, will be set to " + "YES, otherwise will be set to NO.", READ_ONLY GLOBAL_VAR(have_query_cache), NO_CMD_LINE); static Sys_var_have Sys_have_rtree_keys( - "have_rtree_keys", "have_rtree_keys", + "have_rtree_keys", "If RTREE indexes (used for spatial indexes) " + "are available, will be set to YES, otherwise will be set to NO.", READ_ONLY GLOBAL_VAR(have_rtree_keys), NO_CMD_LINE); static Sys_var_have Sys_have_ssl( - "have_ssl", "have_ssl", + "have_ssl", "If the server supports secure connections, will be set to YES, " + "otherwise will be set to NO. If set to DISABLED, the server was compiled with " + "TLS support, but was not started with TLS support (see the mysqld options). " + "See also have_openssl.", READ_ONLY GLOBAL_VAR(have_ssl), NO_CMD_LINE); static Sys_var_have Sys_have_symlink( - "have_symlink", "have_symlink", + "have_symlink", "If symbolic link support is enabled, will be set to YES, " + "otherwise will be set to NO. Required for the INDEX DIRECTORY and DATA " + "DIRECTORY table options (see CREATE TABLE) and Windows symlink support. " + "Will be set to DISABLED if the server is started with the " + "--skip-symbolic-links option.", READ_ONLY GLOBAL_VAR(have_symlink), NO_CMD_LINE); static bool fix_log_state(sys_var *self, THD *thd, enum_var_type type); @@ -4202,7 +4302,7 @@ static bool fix_log_state(sys_var *self, THD *thd, enum_var_type type); static Sys_var_mybool Sys_general_log( "general_log", "Log connections and queries to a table or log file. " "Defaults logging to a file 'hostname'.log or a table mysql.general_log" - "if --log-output=TABLE is used", + "if --log-output=TABLE is used.", GLOBAL_VAR(opt_log), CMD_LINE(OPT_ARG), DEFAULT(FALSE), NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0), ON_UPDATE(fix_log_state)); @@ -4211,7 +4311,7 @@ static Sys_var_mybool Sys_slow_query_log( "slow_query_log", "Log slow queries to a table or log file. Defaults logging to a file " "'hostname'-slow.log or a table mysql.slow_log if --log-output=TABLE is " - "used. Must be enabled to activate other slow log options", + "used. Must be enabled to activate other slow log options.", SESSION_VAR(sql_log_slow), CMD_LINE(OPT_ARG), DEFAULT(FALSE), NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0), ON_UPDATE(fix_log_state)); @@ -4283,12 +4383,12 @@ static Sys_var_set Sys_log_output( static Sys_var_mybool Sys_log_slave_updates( "log_slave_updates", "Tells the slave to log the updates from " "the slave thread to the binary log. You will need to turn it on if " - "you plan to daisy-chain the slaves", + "you plan to daisy-chain the slaves.", READ_ONLY GLOBAL_VAR(opt_log_slave_updates), CMD_LINE(OPT_ARG), DEFAULT(0)); static Sys_var_charptr Sys_relay_log( - "relay_log", "The location and name to use for relay logs", + "relay_log", "The location and name to use for relay logs.", READ_ONLY GLOBAL_VAR(opt_relay_logname), CMD_LINE(REQUIRED_ARG), IN_FS_CHARSET, DEFAULT(0)); @@ -4299,7 +4399,7 @@ static Sys_var_charptr Sys_relay_log( */ static Sys_var_charptr Sys_relay_log_index( "relay_log_index", "The location and name to use for the file " - "that keeps a list of the last relay logs", + "that keeps a list of the last relay logs.", READ_ONLY GLOBAL_VAR(relay_log_index), NO_CMD_LINE, IN_FS_CHARSET, DEFAULT(0)); @@ -4327,20 +4427,20 @@ static Sys_var_charptr Sys_log_bin_basename( static Sys_var_charptr Sys_relay_log_info_file( "relay_log_info_file", "The location and name of the file that " - "remembers where the SQL replication thread is in the relay logs", + "remembers where the SQL replication thread is in the relay logs.", READ_ONLY GLOBAL_VAR(relay_log_info_file), CMD_LINE(REQUIRED_ARG), IN_FS_CHARSET, DEFAULT(0)); static Sys_var_mybool Sys_relay_log_purge( "relay_log_purge", "if disabled - do not purge relay logs. " - "if enabled - purge them as soon as they are no more needed", + "if enabled - purge them as soon as they are no more needed.", GLOBAL_VAR(relay_log_purge), CMD_LINE(OPT_ARG), DEFAULT(TRUE)); static Sys_var_mybool Sys_relay_log_recovery( "relay_log_recovery", "Enables automatic relay log recovery " "right after the database startup, which means that the IO Thread " "starts re-fetching from the master right after the last transaction " - "processed", + "processed.", GLOBAL_VAR(relay_log_recovery), CMD_LINE(OPT_ARG), DEFAULT(FALSE)); @@ -4749,7 +4849,9 @@ static Sys_var_struct Sys_lc_time_names( NO_MUTEX_GUARD, IN_BINLOG, ON_CHECK(check_locale)); static Sys_var_tz Sys_time_zone( - "time_zone", "time_zone", + "time_zone", "The current time zone, used to initialize the time " + "zone for a client when it connects. Set to SYSTEM by default, in " + "which the client uses the system time zone value.", SESSION_VAR(time_zone), NO_CMD_LINE, DEFAULT(&default_tz), NO_MUTEX_GUARD, IN_BINLOG); @@ -4766,7 +4868,8 @@ static Sys_var_charptr Sys_wsrep_provider( ON_CHECK(wsrep_provider_check), ON_UPDATE(wsrep_provider_update)); static Sys_var_charptr Sys_wsrep_provider_options( - "wsrep_provider_options", "provider specific options", + "wsrep_provider_options", "Semicolon (;) separated list of wsrep " + "options (see wsrep_provider_options documentation).", PREALLOCATED GLOBAL_VAR(wsrep_provider_options), CMD_LINE(REQUIRED_ARG), IN_SYSTEM_CHARSET, DEFAULT(""), NO_MUTEX_GUARD, NOT_IN_BINLOG, @@ -4797,13 +4900,17 @@ static Sys_var_charptr Sys_wsrep_cluster_address ( ON_UPDATE(wsrep_cluster_address_update)); static Sys_var_charptr Sys_wsrep_node_name ( - "wsrep_node_name", "Node name", + "wsrep_node_name", "Name of this node. This name can be used in " + "wsrep_sst_donor as a preferred donor. Note that multiple nodes " + "in a cluster can have the same name.", PREALLOCATED GLOBAL_VAR(wsrep_node_name), CMD_LINE(REQUIRED_ARG), IN_SYSTEM_CHARSET, DEFAULT(glob_hostname), NO_MUTEX_GUARD, NOT_IN_BINLOG, wsrep_node_name_check, wsrep_node_name_update); static Sys_var_charptr Sys_wsrep_node_address ( - "wsrep_node_address", "Node address", + "wsrep_node_address", "Specifies the node's network address, in " + "the format ip address[:port]. Used in situations where autoguessing " + "is not reliable. As of MariaDB 10.1.8, supports IPv6.", PREALLOCATED GLOBAL_VAR(wsrep_node_address), CMD_LINE(REQUIRED_ARG), IN_SYSTEM_CHARSET, DEFAULT(""), NO_MUTEX_GUARD, NOT_IN_BINLOG, @@ -4820,7 +4927,7 @@ static Sys_var_ulong Sys_wsrep_slave_threads( GLOBAL_VAR(wsrep_slave_threads), CMD_LINE(REQUIRED_ARG), VALID_RANGE(1, 512), DEFAULT(1), BLOCK_SIZE(1), &PLock_wsrep_slave_threads, NOT_IN_BINLOG, - ON_CHECK(wsrep_slave_threads_check), + ON_CHECK(NULL), ON_UPDATE(wsrep_slave_threads_update)); static Sys_var_charptr Sys_wsrep_dbug_option( @@ -4932,21 +5039,13 @@ static Sys_var_mybool Sys_wsrep_certify_nonPK( GLOBAL_VAR(wsrep_certify_nonPK), CMD_LINE(OPT_ARG), DEFAULT(TRUE)); -static bool fix_wsrep_causal_reads(sys_var *self, THD* thd, enum_var_type var_type) -{ - if (var_type == OPT_GLOBAL) - wsrep_causal_reads_update(&global_system_variables); - else - wsrep_causal_reads_update(&thd->variables); - return false; -} static Sys_var_mybool Sys_wsrep_causal_reads( "wsrep_causal_reads", "Setting this variable is equivalent " "to setting wsrep_sync_wait READ flag", SESSION_VAR(wsrep_causal_reads), CMD_LINE(OPT_ARG, OPT_WSREP_CAUSAL_READS), DEFAULT(FALSE), NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0), - ON_UPDATE(fix_wsrep_causal_reads), + ON_UPDATE(wsrep_causal_reads_update), DEPRECATED("'@@wsrep_sync_wait=1'")); static Sys_var_uint Sys_wsrep_sync_wait( @@ -5021,7 +5120,7 @@ static Sys_var_mybool Sys_wsrep_slave_UK_checks( CMD_LINE(OPT_ARG), DEFAULT(FALSE)); static Sys_var_mybool Sys_wsrep_restart_slave( - "wsrep_restart_slave", "Should MySQL slave be restarted automatically, when node joins back to cluster", + "wsrep_restart_slave", "Should MariaDB slave be restarted automatically, when node joins back to cluster", GLOBAL_VAR(wsrep_restart_slave), CMD_LINE(OPT_ARG), DEFAULT(FALSE)); static Sys_var_mybool Sys_wsrep_dirty_reads( @@ -5048,7 +5147,7 @@ static Sys_var_mybool Sys_wsrep_gtid_mode( static char *wsrep_patch_version_ptr; static Sys_var_charptr Sys_wsrep_patch_version( - "wsrep_patch_version", "wsrep patch version", + "wsrep_patch_version", "Wsrep patch version, for example wsrep_25.10.", READ_ONLY GLOBAL_VAR(wsrep_patch_version_ptr), CMD_LINE_HELP_ONLY, IN_SYSTEM_CHARSET, DEFAULT(WSREP_PATCH_VERSION)); diff --git a/sql/table.cc b/sql/table.cc index 398383efccd..e80a938ee72 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -1860,7 +1860,9 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write, interval_nr= (uint)vcol_screen_pos[3]; else if ((uint)vcol_screen_pos[0] != 1) goto err; - vcol_info->stored_in_db= vcol_screen_pos[2] & 1; + bool stored= vcol_screen_pos[2] & 1; + vcol_info->stored_in_db= stored; + vcol_info->set_vcol_type(stored ? VCOL_GENERATED_STORED : VCOL_GENERATED_VIRTUAL); vcol_expr_length= vcol_info_length - (uint)(FRM_VCOL_OLD_HEADER_SIZE(opt_interval_id)); vcol_info->utf8= 0; // before 10.2.1 the charset was unknown @@ -2039,6 +2041,7 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write, keyinfo= share->key_info; uint primary_key= my_strcasecmp(system_charset_info, share->keynames.type_names[0], primary_key_name) ? MAX_KEY : 0; + KEY* key_first_info; if (primary_key >= MAX_KEY && keyinfo->flags & HA_NOSAME) { @@ -2118,19 +2121,38 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write, keyinfo->name_length+1); } + if (!key) + key_first_info= keyinfo; + if (ext_key_parts > share->key_parts && key) { KEY_PART_INFO *new_key_part= (keyinfo-1)->key_part + (keyinfo-1)->ext_key_parts; uint add_keyparts_for_this_key= add_first_key_parts; + uint length_bytes= 0, len_null_byte= 0, ext_key_length= 0; + Field *field; /* Do not extend the key that contains a component defined over the beginning of a field. */ for (i= 0; i < keyinfo->user_defined_key_parts; i++) - { + { uint fieldnr= keyinfo->key_part[i].fieldnr; + field= share->field[keyinfo->key_part[i].fieldnr-1]; + + if (field->null_ptr) + len_null_byte= HA_KEY_NULL_LENGTH; + + if (field->type() == MYSQL_TYPE_BLOB || + field->real_type() == MYSQL_TYPE_VARCHAR || + field->type() == MYSQL_TYPE_GEOMETRY) + { + length_bytes= HA_KEY_BLOB_LENGTH; + } + + ext_key_length+= keyinfo->key_part[i].length + len_null_byte + + length_bytes; if (share->field[fieldnr-1]->key_length() != keyinfo->key_part[i].length) { @@ -2139,6 +2161,23 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write, } } + if (add_keyparts_for_this_key) + { + for (i= 0; i < add_keyparts_for_this_key; i++) + { + uint pk_part_length= key_first_info->key_part[i].store_length; + if (keyinfo->ext_key_part_map & 1< MAX_KEY_LENGTH) + { + add_keyparts_for_this_key= i; + break; + } + ext_key_length+= pk_part_length; + } + } + } + if (add_keyparts_for_this_key < (keyinfo->ext_key_parts - keyinfo->user_defined_key_parts)) { @@ -2707,7 +2746,7 @@ static bool fix_vcol_expr(THD *thd, Virtual_column_info *vcol) { StringBuffer str; vcol->print(&str); - my_error(ER_ERROR_EVALUATING_EXPRESSION, MYF(0), str.c_ptr()); + my_error(ER_ERROR_EVALUATING_EXPRESSION, MYF(0), str.c_ptr_safe()); DBUG_RETURN(1); } @@ -2825,9 +2864,11 @@ static bool fix_and_check_vcol_expr(THD *thd, TABLE *table, of the statement because the field item does not have a field pointer at that time */ - my_error(ER_VIRTUAL_COLUMN_FUNCTION_IS_NOT_ALLOWED, MYF(0), + myf warn= table->s->frm_version < FRM_VER_EXPRESSSIONS ? ME_JUST_WARNING : 0; + my_error(ER_VIRTUAL_COLUMN_FUNCTION_IS_NOT_ALLOWED, MYF(warn), "AUTO_INCREMENT", vcol->get_vcol_type_name(), res.name); - DBUG_RETURN(1); + if (!warn) + DBUG_RETURN(1); } vcol->flags= res.errors; @@ -4458,16 +4499,7 @@ void TABLE::init(THD *thd, TABLE_LIST *tl) DBUG_ASSERT(!file->keyread_enabled()); - /* mark the record[0] uninitialized */ - TRASH_ALLOC(record[0], s->reclength); - - /* - Initialize the null marker bits, to ensure that if we are doing a read - of only selected columns (like in keyread), all null markers are - initialized. - */ - memset(record[0], 255, s->null_bytes); - memset(record[1], 255, s->null_bytes); + restore_record(this, s->default_values); /* Tables may be reused in a sub statement. */ DBUG_ASSERT(!file->extra(HA_EXTRA_IS_ATTACHED_CHILDREN)); @@ -5058,7 +5090,8 @@ int TABLE::verify_constraints(bool ignore_failure) { for (Virtual_column_info **chk= check_constraints ; *chk ; chk++) { - if ((*chk)->expr->val_int() == 0) + /* yes! NULL is ok, see 4.23.3.4 Table check constraints, part 2, SQL:2016 */ + if ((*chk)->expr->val_int() == 0 && !(*chk)->expr->null_value) { my_error(ER_CONSTRAINT_FAILED, MYF(ignore_failure ? ME_JUST_WARNING : 0), (*chk)->name.str, @@ -7436,7 +7469,7 @@ int TABLE::update_virtual_field(Field *vf) vf->vcol_info->expr->walk(&Item::update_vcol_processor, 0, &tmp_set); vf->vcol_info->expr->save_in_field(vf, 0); in_use->restore_active_arena(expr_arena, &backup_arena); - DBUG_RETURN(0); + DBUG_RETURN(in_use->is_error()); } @@ -8091,8 +8124,7 @@ void TABLE_LIST::check_pushable_cond_for_table(Item *cond) item->clear_extraction_flag(); } } - else if (cond->walk(&Item::exclusive_dependence_on_table_processor, - 0, (void *) &tab_map)) + else if (!cond->excl_dep_on_table(tab_map)) cond->set_extraction_flag(NO_EXTRACTION_FL); } @@ -8201,8 +8233,12 @@ Item* TABLE_LIST::build_pushable_cond_for_table(THD *thd, Item *cond) Item *left_item_clone= left_item->build_clone(thd, thd->mem_root); Item *right_item_clone= item->build_clone(thd, thd->mem_root); if (left_item_clone && right_item_clone) + { + left_item_clone->set_item_equal(NULL); + right_item_clone->set_item_equal(NULL); eq= new (thd->mem_root) Item_func_eq(thd, right_item_clone, left_item_clone); + } if (eq) { i++; diff --git a/sql/temporary_tables.cc b/sql/temporary_tables.cc index c05fc632a94..42ebb87cbe4 100644 --- a/sql/temporary_tables.cc +++ b/sql/temporary_tables.cc @@ -320,16 +320,6 @@ bool THD::open_temporary_table(TABLE_LIST *tl) TMP_TABLE_SHARE *share; TABLE *table= NULL; - /* - Since temporary tables are not safe for parallel replication, lets - wait for the prior commits in case the table is found to be in use. - */ - if (rgi_slave && - rgi_slave->is_parallel_exec && - find_temporary_table(tl) && - wait_for_prior_commit()) - DBUG_RETURN(true); - /* Code in open_table() assumes that TABLE_LIST::table can be non-zero only for pre-opened temporary tables. @@ -350,6 +340,22 @@ bool THD::open_temporary_table(TABLE_LIST *tl) DBUG_RETURN(false); } + /* + Temporary tables are not safe for parallel replication. They were + designed to be visible to one thread only, so have no table locking. + Thus there is no protection against two conflicting transactions + committing in parallel and things like that. + + So for now, anything that uses temporary tables will be serialised + with anything before it, when using parallel replication. + */ + + if (rgi_slave && + rgi_slave->is_parallel_exec && + find_temporary_table(tl) && + wait_for_prior_commit()) + DBUG_RETURN(true); + /* First check if there is a reusable open table available in the open table list. @@ -378,26 +384,6 @@ bool THD::open_temporary_table(TABLE_LIST *tl) DBUG_RETURN(false); } - /* - Temporary tables are not safe for parallel replication. They were - designed to be visible to one thread only, so have no table locking. - Thus there is no protection against two conflicting transactions - committing in parallel and things like that. - - So for now, anything that uses temporary tables will be serialised - with anything before it, when using parallel replication. - - TODO: We might be able to introduce a reference count or something - on temp tables, and have slave worker threads wait for it to reach - zero before being allowed to use the temp table. Might not be worth - it though, as statement-based replication using temporary tables is - in any case rather fragile. - */ - if (rgi_slave && - rgi_slave->is_parallel_exec && - wait_for_prior_commit()) - DBUG_RETURN(true); - #ifdef WITH_PARTITION_STORAGE_ENGINE if (tl->partition_names) { @@ -1398,6 +1384,7 @@ bool THD::log_events_and_free_tmp_shares() variables.character_set_client= cs_save; get_stmt_da()->set_overwrite_status(true); + transaction.stmt.mark_dropped_temp_table(); if ((error= (mysql_bin_log.write(&qinfo) || error))) { /* diff --git a/sql/threadpool_common.cc b/sql/threadpool_common.cc index c6a3c7e44f8..598951da406 100644 --- a/sql/threadpool_common.cc +++ b/sql/threadpool_common.cc @@ -308,6 +308,24 @@ static void threadpool_remove_connection(THD *thd) my_thread_end(); } + +/* + Ensure that proper error message is sent to client, + and "aborted" message appears in the log in case of + wait timeout. + + See also timeout handling in net_serv.cc +*/ +static void handle_wait_timeout(THD *thd) +{ + thd->get_stmt_da()->reset_diagnostics_area(); + thd->reset_killed(); + my_error(ER_NET_READ_INTERRUPTED, MYF(0)); + thd->net.last_errno= ER_NET_READ_INTERRUPTED; + thd->net.error= 2; +} + + /** Process a single client request or a single batch. */ @@ -323,6 +341,8 @@ static int threadpool_process_request(THD *thd) or KILL command. Return error. */ retval= 1; + if(thd->killed == KILL_WAIT_TIMEOUT) + handle_wait_timeout(thd); goto end; } @@ -458,7 +478,7 @@ void tp_timeout_handler(TP_connection *c) return; THD *thd=c->thd; mysql_mutex_lock(&thd->LOCK_thd_data); - thd->killed= KILL_CONNECTION; + thd->set_killed(KILL_WAIT_TIMEOUT); c->priority= TP_PRIORITY_HIGH; post_kill_notification(thd); mysql_mutex_unlock(&thd->LOCK_thd_data); diff --git a/sql/transaction.cc b/sql/transaction.cc index 9bacfb81bba..d01519b8bd4 100644 --- a/sql/transaction.cc +++ b/sql/transaction.cc @@ -198,11 +198,10 @@ bool trans_begin(THD *thd, uint flags) thd->variables.option_bits&= ~(OPTION_BEGIN | OPTION_KEEP_LOG); /* - The following set should not be needed as the flag should always be 0 - when we come here. We should at some point change this to an assert. + The following set should not be needed as transaction state should + already be reset. We should at some point change this to an assert. */ - thd->transaction.all.modified_non_trans_table= FALSE; - thd->transaction.all.m_unsafe_rollback_flags&= ~THD_TRANS::DID_WAIT; + thd->transaction.all.reset(); thd->has_waiter= false; thd->waiting_on_group_commit= false; @@ -323,8 +322,7 @@ bool trans_commit(THD *thd) else (void) RUN_HOOK(transaction, after_commit, (thd, FALSE)); thd->variables.option_bits&= ~(OPTION_BEGIN | OPTION_KEEP_LOG); - thd->transaction.all.modified_non_trans_table= FALSE; - thd->transaction.all.m_unsafe_rollback_flags&= ~THD_TRANS::DID_WAIT; + thd->transaction.all.reset(); thd->lex->start_transaction_opt= 0; trans_track_end_trx(thd); @@ -373,8 +371,7 @@ bool trans_commit_implicit(THD *thd) } thd->variables.option_bits&= ~(OPTION_BEGIN | OPTION_KEEP_LOG); - thd->transaction.all.modified_non_trans_table= FALSE; - thd->transaction.all.m_unsafe_rollback_flags&= ~THD_TRANS::DID_WAIT; + thd->transaction.all.reset(); /* Upon implicit commit, reset the current transaction @@ -420,8 +417,7 @@ bool trans_rollback(THD *thd) thd->variables.option_bits&= ~(OPTION_BEGIN | OPTION_KEEP_LOG); /* Reset the binlog transaction marker */ thd->variables.option_bits&= ~OPTION_GTID_BEGIN; - thd->transaction.all.modified_non_trans_table= FALSE; - thd->transaction.all.m_unsafe_rollback_flags&= ~THD_TRANS::DID_WAIT; + thd->transaction.all.reset(); thd->lex->start_transaction_opt= 0; trans_track_end_trx(thd); @@ -467,8 +463,7 @@ bool trans_rollback_implicit(THD *thd) preserve backward compatibility. */ thd->variables.option_bits&= ~(OPTION_KEEP_LOG); - thd->transaction.all.modified_non_trans_table= false; - thd->transaction.all.m_unsafe_rollback_flags&= ~THD_TRANS::DID_WAIT; + thd->transaction.all.reset(); /* Rollback should clear transaction_rollback_request flag. */ DBUG_ASSERT(! thd->transaction_rollback_request); @@ -506,6 +501,8 @@ bool trans_commit_stmt(THD *thd) */ DBUG_ASSERT(! thd->in_sub_stmt); + thd->merge_unsafe_rollback_flags(); + if (thd->transaction.stmt.ha_list) { if (WSREP_ON) @@ -559,6 +556,8 @@ bool trans_rollback_stmt(THD *thd) */ DBUG_ASSERT(! thd->in_sub_stmt); + thd->merge_unsafe_rollback_flags(); + if (thd->transaction.stmt.ha_list) { if (WSREP_ON) @@ -979,8 +978,7 @@ bool trans_xa_commit(THD *thd) } thd->variables.option_bits&= ~(OPTION_BEGIN | OPTION_KEEP_LOG); - thd->transaction.all.modified_non_trans_table= FALSE; - thd->transaction.all.m_unsafe_rollback_flags&= ~THD_TRANS::DID_WAIT; + thd->transaction.all.reset(); thd->server_status&= ~(SERVER_STATUS_IN_TRANS | SERVER_STATUS_IN_TRANS_READONLY); DBUG_PRINT("info", ("clearing SERVER_STATUS_IN_TRANS")); @@ -1037,8 +1035,7 @@ bool trans_xa_rollback(THD *thd) res= xa_trans_force_rollback(thd); thd->variables.option_bits&= ~(OPTION_BEGIN | OPTION_KEEP_LOG); - thd->transaction.all.modified_non_trans_table= FALSE; - thd->transaction.all.m_unsafe_rollback_flags&= ~THD_TRANS::DID_WAIT; + thd->transaction.all.reset(); thd->server_status&= ~(SERVER_STATUS_IN_TRANS | SERVER_STATUS_IN_TRANS_READONLY); DBUG_PRINT("info", ("clearing SERVER_STATUS_IN_TRANS")); diff --git a/sql/uniques.cc b/sql/uniques.cc index f2fa0bf7b1a..71d2093b828 100644 --- a/sql/uniques.cc +++ b/sql/uniques.cc @@ -486,7 +486,7 @@ void put_counter_into_merged_element(void *ptr, uint ofs, element_count cnt) <> 0 error */ -static bool merge_walk(uchar *merge_buffer, ulong merge_buffer_size, +static bool merge_walk(uchar *merge_buffer, size_t merge_buffer_size, uint key_length, BUFFPEK *begin, BUFFPEK *end, tree_walk_action walk_action, void *walk_action_arg, qsort_cmp2 compare, void *compare_arg, @@ -495,7 +495,7 @@ static bool merge_walk(uchar *merge_buffer, ulong merge_buffer_size, BUFFPEK_COMPARE_CONTEXT compare_context = { compare, compare_arg }; QUEUE queue; if (end <= begin || - merge_buffer_size < (ulong) (key_length * (end - begin + 1)) || + merge_buffer_size < (size_t) (key_length * (end - begin + 1)) || init_queue(&queue, (uint) (end - begin), offsetof(BUFFPEK, key), 0, buffpek_compare, &compare_context, 0, 0)) return 1; @@ -645,15 +645,19 @@ bool Unique::walk(TABLE *table, tree_walk_action action, void *walk_action_arg) return 1; if (flush_io_cache(&file) || reinit_io_cache(&file, READ_CACHE, 0L, 0, 0)) return 1; - size_t buff_sz= (max_in_memory_size / full_size + 1) * full_size; + /* + merge_buffer must fit at least MERGEBUFF2 keys, because + merge_index() can merge that many BUFFPEKs at once. + */ + size_t buff_sz= MY_MAX(MERGEBUFF2, max_in_memory_size/full_size+1) * full_size; if (!(merge_buffer = (uchar *)my_malloc(buff_sz, MYF(MY_THREAD_SPECIFIC|MY_WME)))) return 1; if (buff_sz < full_size * (file_ptrs.elements + 1UL)) res= merge(table, merge_buffer, buff_sz >= full_size * MERGEBUFF2) ; - + if (!res) - { - res= merge_walk(merge_buffer, (ulong) max_in_memory_size, full_size, + { + res= merge_walk(merge_buffer, buff_sz, full_size, (BUFFPEK *) file_ptrs.buffer, (BUFFPEK *) file_ptrs.buffer + file_ptrs.elements, action, walk_action_arg, diff --git a/sql/unireg.h b/sql/unireg.h index b1cab841092..b0cfb3841ef 100644 --- a/sql/unireg.h +++ b/sql/unireg.h @@ -54,8 +54,8 @@ #define ER(X) ER_THD(current_thd, (X)) #define ER_THD_OR_DEFAULT(thd,X) ((thd) ? ER_THD(thd, (X)) : ER_DEFAULT(X)) -#define ME_INFO (ME_HOLDTANG+ME_OLDWIN+ME_NOREFRESH) -#define ME_ERROR (ME_BELL+ME_OLDWIN+ME_NOREFRESH) +#define ME_INFO (ME_HOLDTANG | ME_NOREFRESH) +#define ME_ERROR (ME_BELL | ME_NOREFRESH) #define MYF_RW MYF(MY_WME+MY_NABP) /* Vid my_read & my_write */ #define SPECIAL_USE_LOCKS 1 /* Lock used databases */ diff --git a/sql/wsrep_applier.cc b/sql/wsrep_applier.cc index cef59513485..a299ddf074f 100644 --- a/sql/wsrep_applier.cc +++ b/sql/wsrep_applier.cc @@ -217,12 +217,15 @@ wsrep_cb_status_t wsrep_apply_cb(void* const ctx, { THD* const thd((THD*)ctx); + assert(thd->wsrep_apply_toi == false); + // Allow tests to block the applier thread using the DBUG facilities. DBUG_EXECUTE_IF("sync.wsrep_apply_cb", { const char act[]= "now " - "wait_for signal.wsrep_apply_cb"; + "SIGNAL sync.wsrep_apply_cb_reached " + "WAIT_FOR signal.wsrep_apply_cb"; DBUG_ASSERT(!debug_sync_set_action(thd, STRING_WITH_LEN(act))); };); @@ -382,7 +385,7 @@ wsrep_cb_status_t wsrep_commit_cb(void* const ctx, mysql_mutex_unlock(&LOCK_wsrep_slave_threads); } - if (*exit == false && thd->wsrep_applier) + if (thd->wsrep_applier) { /* From trans_begin() */ thd->variables.option_bits|= OPTION_BEGIN; diff --git a/sql/wsrep_hton.cc b/sql/wsrep_hton.cc index e34f1b92d52..b21ae10b371 100644 --- a/sql/wsrep_hton.cc +++ b/sql/wsrep_hton.cc @@ -42,6 +42,7 @@ void wsrep_cleanup_transaction(THD *thd) thd->wsrep_trx_meta.depends_on= WSREP_SEQNO_UNDEFINED; thd->wsrep_exec_mode= LOCAL_STATE; thd->wsrep_affected_rows= 0; + thd->wsrep_skip_wsrep_GTID= false; return; } @@ -537,6 +538,7 @@ wsrep_run_wsrep_commit(THD *thd, bool all) break; case WSREP_BF_ABORT: DBUG_ASSERT(thd->wsrep_trx_meta.gtid.seqno != WSREP_SEQNO_UNDEFINED); + /* fall through */ case WSREP_TRX_FAIL: WSREP_DEBUG("commit failed for reason: %d", rcode); DBUG_PRINT("wsrep", ("replicating commit fail")); diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index 9a99dffc724..d95c85f3008 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -2,7 +2,7 @@ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; version 2 of the License. + the Free Software Foundation; version 2 of the License.x1 This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -16,6 +16,7 @@ #include #include #include +#include /* find_temporary_table() */ #include "slave.h" #include "rpl_mi.h" #include "sql_repl.h" @@ -983,8 +984,6 @@ bool wsrep_must_sync_wait (THD* thd, uint mask) { return (thd->variables.wsrep_sync_wait & mask) && thd->variables.wsrep_on && - !(thd->variables.wsrep_dirty_reads && - !is_update_query(thd->lex->sql_command)) && !thd->in_active_multi_stmt_transaction() && thd->wsrep_conflict_state != REPLAYING && thd->wsrep_sync_wait_gtid.seqno == WSREP_SEQNO_UNDEFINED; @@ -1113,83 +1112,70 @@ static bool wsrep_prepare_keys_for_isolation(THD* thd, const TABLE_LIST* table_list, wsrep_key_arr_t* ka) { - ka->keys= 0; - ka->keys_len= 0; + ka->keys= 0; + ka->keys_len= 0; - if (db || table) + if (db || table) + { + if (!(ka->keys= (wsrep_key_t*)my_malloc(sizeof(wsrep_key_t), MYF(0)))) { - TABLE_LIST tmp_table; - - memset(&tmp_table, 0, sizeof(tmp_table)); - tmp_table.table_name= (char*)table; - tmp_table.db= (char*)db; - tmp_table.mdl_request.init(MDL_key::GLOBAL, (db) ? db : "", - (table) ? table : "", - MDL_INTENTION_EXCLUSIVE, MDL_STATEMENT); - - if (!table || !thd->find_temporary_table(&tmp_table)) - { - if (!(ka->keys= (wsrep_key_t*)my_malloc(sizeof(wsrep_key_t), MYF(0)))) - { - WSREP_ERROR("Can't allocate memory for key_array"); - goto err; - } - ka->keys_len= 1; - if (!(ka->keys[0].key_parts= (wsrep_buf_t*) - my_malloc(sizeof(wsrep_buf_t)*2, MYF(0)))) - { - WSREP_ERROR("Can't allocate memory for key_parts"); - goto err; - } - ka->keys[0].key_parts_num= 2; - if (!wsrep_prepare_key_for_isolation( - db, table, - (wsrep_buf_t*)ka->keys[0].key_parts, - &ka->keys[0].key_parts_num)) - { - WSREP_ERROR("Preparing keys for isolation failed"); - goto err; - } - } + WSREP_ERROR("Can't allocate memory for key_array"); + goto err; } - - for (const TABLE_LIST* table= table_list; table; table= table->next_global) + ka->keys_len= 1; + if (!(ka->keys[0].key_parts= (wsrep_buf_t*) + my_malloc(sizeof(wsrep_buf_t)*2, MYF(0)))) { - if (!thd->find_temporary_table(table)) - { - wsrep_key_t* tmp; - tmp= (wsrep_key_t*)my_realloc( - ka->keys, (ka->keys_len + 1) * sizeof(wsrep_key_t), - MYF(MY_ALLOW_ZERO_PTR)); - - if (!tmp) - { - WSREP_ERROR("Can't allocate memory for key_array"); - goto err; - } - ka->keys= tmp; - if (!(ka->keys[ka->keys_len].key_parts= (wsrep_buf_t*) - my_malloc(sizeof(wsrep_buf_t)*2, MYF(0)))) - { - WSREP_ERROR("Can't allocate memory for key_parts"); - goto err; - } - ka->keys[ka->keys_len].key_parts_num= 2; - ++ka->keys_len; - if (!wsrep_prepare_key_for_isolation( - table->db, table->table_name, - (wsrep_buf_t*)ka->keys[ka->keys_len - 1].key_parts, - &ka->keys[ka->keys_len - 1].key_parts_num)) - { - WSREP_ERROR("Preparing keys for isolation failed"); - goto err; - } - } + WSREP_ERROR("Can't allocate memory for key_parts"); + goto err; + } + ka->keys[0].key_parts_num= 2; + if (!wsrep_prepare_key_for_isolation( + db, table, + (wsrep_buf_t*)ka->keys[0].key_parts, + &ka->keys[0].key_parts_num)) + { + WSREP_ERROR("Preparing keys for isolation failed (1)"); + goto err; } - return true; + } + + for (const TABLE_LIST* table= table_list; table; table= table->next_global) + { + wsrep_key_t* tmp; + if (ka->keys) + tmp= (wsrep_key_t*)my_realloc(ka->keys, + (ka->keys_len + 1) * sizeof(wsrep_key_t), + MYF(0)); + else + tmp= (wsrep_key_t*)my_malloc((ka->keys_len + 1) * sizeof(wsrep_key_t), MYF(0)); + + if (!tmp) + { + WSREP_ERROR("Can't allocate memory for key_array"); + goto err; + } + ka->keys= tmp; + if (!(ka->keys[ka->keys_len].key_parts= (wsrep_buf_t*) + my_malloc(sizeof(wsrep_buf_t)*2, MYF(0)))) + { + WSREP_ERROR("Can't allocate memory for key_parts"); + goto err; + } + ka->keys[ka->keys_len].key_parts_num= 2; + ++ka->keys_len; + if (!wsrep_prepare_key_for_isolation(table->db, table->table_name, + (wsrep_buf_t*)ka->keys[ka->keys_len - 1].key_parts, + &ka->keys[ka->keys_len - 1].key_parts_num)) + { + WSREP_ERROR("Preparing keys for isolation failed (2)"); + goto err; + } + } + return 0; err: wsrep_keys_free(ka); - return false; + return 1; } @@ -1403,6 +1389,84 @@ create_view_query(THD *thd, uchar** buf, size_t* buf_len) static int wsrep_create_sp(THD *thd, uchar** buf, size_t* buf_len); static int wsrep_create_trigger_query(THD *thd, uchar** buf, size_t* buf_len); +/* + Decide if statement should run in TOI. + + Look if table or table_list contain temporary tables. If the + statement affects only temporary tables, statement should not run + in TOI. If the table list contains mix of regular and temporary tables + (DROP TABLE, OPTIMIZE, ANALYZE), statement should be run in TOI but + should be rewritten at later time for replication to contain only + non-temporary tables. + */ +static bool wsrep_can_run_in_toi(THD *thd, const char *db, const char *table, + const TABLE_LIST *table_list) +{ + DBUG_ASSERT(!table || db); + DBUG_ASSERT(table_list || db); + + LEX* lex= thd->lex; + SELECT_LEX* select_lex= &lex->select_lex; + TABLE_LIST* first_table= select_lex->table_list.first; + + switch (lex->sql_command) + { + case SQLCOM_CREATE_TABLE: + DBUG_ASSERT(!table_list); + if (thd->lex->create_info.options & HA_LEX_CREATE_TMP_TABLE) + { + return false; + } + return true; + + case SQLCOM_CREATE_VIEW: + + DBUG_ASSERT(!table_list); + DBUG_ASSERT(first_table); /* First table is view name */ + /* + If any of the remaining tables refer to temporary table error + is returned to client, so TOI can be skipped + */ + for (TABLE_LIST* it= first_table->next_global; it; it= it->next_global) + { + if (thd->find_temporary_table(it)) + { + return false; + } + } + return true; + + case SQLCOM_CREATE_TRIGGER: + + DBUG_ASSERT(!table_list); + DBUG_ASSERT(first_table); + + if (thd->find_temporary_table(first_table)) + { + return false; + } + return true; + + default: + if (table && !thd->find_temporary_table(db, table)) + { + return true; + } + + if (table_list) + { + for (TABLE_LIST* table= first_table; table; table= table->next_global) + { + if (!thd->find_temporary_table(table->db, table->table_name)) + { + return true; + } + } + } + return !(table || table_list); + } +} + /* returns: 0: statement was replicated as TOI @@ -1418,6 +1482,12 @@ static int wsrep_TOI_begin(THD *thd, char *db_, char *table_, int buf_err; int rc= 0; + if (wsrep_can_run_in_toi(thd, db_, table_, table_list) == false) + { + WSREP_DEBUG("No TOI for %s", WSREP_QUERY(thd)); + return 1; + } + WSREP_DEBUG("TO BEGIN: %lld, %d : %s", (long long)wsrep_thd_trx_seqno(thd), thd->wsrep_exec_mode, thd->query() ); switch (thd->lex->sql_command) @@ -1445,16 +1515,16 @@ static int wsrep_TOI_begin(THD *thd, char *db_, char *table_, } /* fallthrough */ default: - buf_err= wsrep_to_buf_helper(thd, thd->query(), thd->query_length(), &buf, - &buf_len); + buf_err= wsrep_to_buf_helper(thd, thd->query(), thd->query_length(), + &buf, &buf_len); break; } wsrep_key_arr_t key_arr= {0, 0}; struct wsrep_buf buff = { buf, buf_len }; - if (!buf_err && - wsrep_prepare_keys_for_isolation(thd, db_, table_, table_list, &key_arr)&& - key_arr.keys_len > 0 && + if (!buf_err && + !wsrep_prepare_keys_for_isolation(thd, db_, table_, table_list, &key_arr) && + key_arr.keys_len > 0 && WSREP_OK == (ret = wsrep->to_execute_start(wsrep, thd->thread_id, key_arr.keys, key_arr.keys_len, &buff, 1, @@ -1651,9 +1721,12 @@ int wsrep_to_isolation_begin(THD *thd, char *db_, char *table_, if (thd->variables.wsrep_on && thd->wsrep_exec_mode==LOCAL_STATE) { switch (thd->variables.wsrep_OSU_method) { - case WSREP_OSU_TOI: ret = wsrep_TOI_begin(thd, db_, table_, - table_list); break; - case WSREP_OSU_RSU: ret = wsrep_RSU_begin(thd, db_, table_); break; + case WSREP_OSU_TOI: + ret = wsrep_TOI_begin(thd, db_, table_, table_list); + break; + case WSREP_OSU_RSU: + ret = wsrep_RSU_begin(thd, db_, table_); + break; default: WSREP_ERROR("Unsupported OSU method: %lu", thd->variables.wsrep_OSU_method); @@ -2008,7 +2081,7 @@ static bool have_client_connections() static void wsrep_close_thread(THD *thd) { - thd->killed= KILL_CONNECTION; + thd->set_killed(KILL_CONNECTION); MYSQL_CALLBACK(thread_scheduler, post_kill_notification, (thd)); if (thd->mysys_var) { @@ -2088,7 +2161,7 @@ void wsrep_close_client_connections(my_bool wait_to_end) if (is_replaying_connection(tmp)) { - tmp->killed= KILL_CONNECTION; + tmp->set_killed(KILL_CONNECTION); continue; } diff --git a/sql/wsrep_mysqld.h b/sql/wsrep_mysqld.h index 069801b43e3..f154b51516b 100644 --- a/sql/wsrep_mysqld.h +++ b/sql/wsrep_mysqld.h @@ -99,11 +99,12 @@ enum enum_wsrep_OSU_method { enum enum_wsrep_sync_wait { WSREP_SYNC_WAIT_NONE = 0x0, - // show, select, begin + // select, begin WSREP_SYNC_WAIT_BEFORE_READ = 0x1, WSREP_SYNC_WAIT_BEFORE_UPDATE_DELETE = 0x2, WSREP_SYNC_WAIT_BEFORE_INSERT_REPLACE = 0x4, - WSREP_SYNC_WAIT_MAX = 0x7 + WSREP_SYNC_WAIT_BEFORE_SHOW = 0x8, + WSREP_SYNC_WAIT_MAX = 0xF }; // MySQL status variables @@ -223,6 +224,8 @@ extern wsrep_seqno_t wsrep_locked_seqno; #define WSREP_PROVIDER_EXISTS \ (wsrep_provider && strncasecmp(wsrep_provider, WSREP_NONE, FN_REFLEN)) +#define WSREP_QUERY(thd) (thd->query()) + extern void wsrep_ready_wait(); class Ha_trx_info; @@ -317,6 +320,10 @@ bool wsrep_create_like_table(THD* thd, TABLE_LIST* table, bool wsrep_node_is_donor(); bool wsrep_node_is_synced(); +#define WSREP_BINLOG_FORMAT(my_format) \ + ((wsrep_forced_binlog_format != BINLOG_FORMAT_UNSPEC) ? \ + wsrep_forced_binlog_format : my_format) + #else /* WITH_WSREP */ #define WSREP(T) (0) @@ -346,6 +353,7 @@ bool wsrep_node_is_synced(); #define wsrep_thr_init() do {} while(0) #define wsrep_thr_deinit() do {} while(0) #define wsrep_running_threads (0) +#define WSREP_BINLOG_FORMAT(my_format) my_format #endif /* WITH_WSREP */ #endif /* WSREP_MYSQLD_H */ diff --git a/sql/wsrep_sst.cc b/sql/wsrep_sst.cc index 076da23967a..05cf36fd9dc 100644 --- a/sql/wsrep_sst.cc +++ b/sql/wsrep_sst.cc @@ -746,7 +746,7 @@ ssize_t wsrep_sst_prepare (void** msg) // Attempt 1: wsrep_sst_receive_address if (wsrep_sst_receive_address && - strcmp (wsrep_sst_receive_address, WSREP_SST_ADDRESS_AUTO)) + strcmp (wsrep_sst_receive_address, WSREP_SST_ADDRESS_AUTO)) { addr_in= wsrep_sst_receive_address; } @@ -886,16 +886,13 @@ static int sst_donate_mysqldump (const char* addr, { char host[256]; wsp::Address address(addr); - if (!address.is_valid()) { WSREP_ERROR("Could not parse SST address : %s", addr); return 0; } - memcpy(host, address.get_address(), address.get_address_len()); int port= address.get_port(); - int const cmd_len= 4096; wsp::string cmd_str(cmd_len); @@ -912,7 +909,7 @@ static int sst_donate_mysqldump (const char* addr, int ret= snprintf (cmd_str(), cmd_len, "wsrep_sst_mysqldump " - WSREP_SST_OPT_HOST" '%s' " + WSREP_SST_OPT_ADDR" '%s' " WSREP_SST_OPT_PORT" '%d' " WSREP_SST_OPT_LPORT" '%u' " WSREP_SST_OPT_SOCKET" '%s' " @@ -920,7 +917,7 @@ static int sst_donate_mysqldump (const char* addr, WSREP_SST_OPT_GTID" '%s:%lld' " WSREP_SST_OPT_GTID_DOMAIN_ID" '%d'" "%s", - host, port, mysqld_port, mysqld_unix_port, + addr, port, mysqld_port, mysqld_unix_port, wsrep_defaults_file, uuid_str, (long long)seqno, wsrep_gtid_domain_id, bypass ? " " WSREP_SST_OPT_BYPASS : ""); diff --git a/sql/wsrep_thd.cc b/sql/wsrep_thd.cc index 445d3aa20ab..d62c38580b6 100644 --- a/sql/wsrep_thd.cc +++ b/sql/wsrep_thd.cc @@ -234,7 +234,7 @@ void wsrep_replay_transaction(THD *thd) mysql_mutex_unlock(&thd->LOCK_wsrep_thd); thd->reset_for_next_command(); - thd->killed= NOT_KILLED; + thd->reset_killed(); close_thread_tables(thd); if (thd->locked_tables_mode && thd->lock) { @@ -385,7 +385,8 @@ static void wsrep_replication_process(THD *thd) case WSREP_TRX_MISSING: /* these suggests a bug in provider code */ WSREP_WARN("bad return from recv() call: %d", rcode); - /* fall through to node shutdown */ + /* Shut down this node. */ + /* fall through */ case WSREP_FATAL: /* Cluster connectivity is lost. * diff --git a/sql/wsrep_utils.cc b/sql/wsrep_utils.cc index 9c77cb49256..1a358877a35 100644 --- a/sql/wsrep_utils.cc +++ b/sql/wsrep_utils.cc @@ -573,3 +573,17 @@ done: return ret; } +/* returns the length of the host part of the address string */ +size_t wsrep_host_len(const char* const addr, size_t const addr_len) +{ + // check for IPv6 notation first + const char* const bracket= ('[' == addr[0] ? strchr(addr, ']') : NULL); + + if (bracket) { // IPv6 + return (bracket - addr + 1); + } + else { // host part ends at ':' or end of string + const char* const colon= strchr(addr, ':'); + return (colon ? colon - addr : addr_len); + } +} diff --git a/sql/wsrep_utils.h b/sql/wsrep_utils.h index e4f421930f4..277cea9dc31 100644 --- a/sql/wsrep_utils.h +++ b/sql/wsrep_utils.h @@ -22,6 +22,9 @@ unsigned int wsrep_check_ip (const char* const addr, bool *is_ipv6); size_t wsrep_guess_ip (char* buf, size_t buf_len); +/* returns the length of the host part of the address string */ +size_t wsrep_host_len(const char* addr, size_t addr_len); + namespace wsp { class Address { diff --git a/sql/wsrep_var.cc b/sql/wsrep_var.cc index b34fdf8b7ed..41a8f6c7eb0 100644 --- a/sql/wsrep_var.cc +++ b/sql/wsrep_var.cc @@ -27,6 +27,8 @@ #include +static long wsrep_prev_slave_threads = wsrep_slave_threads; + int wsrep_init_vars() { wsrep_provider = my_strdup(WSREP_NONE, MYF(MY_WME)); @@ -49,12 +51,23 @@ bool wsrep_on_update (sys_var *self, THD* thd, enum_var_type var_type) return false; } -bool wsrep_causal_reads_update (SV *sv) +bool wsrep_causal_reads_update (sys_var *self, THD* thd, enum_var_type var_type) { - if (sv->wsrep_causal_reads) { - sv->wsrep_sync_wait |= WSREP_SYNC_WAIT_BEFORE_READ; + // global setting should not affect session setting. + // if (var_type == OPT_GLOBAL) { + // thd->variables.wsrep_causal_reads = global_system_variables.wsrep_causal_reads; + // } + if (thd->variables.wsrep_causal_reads) { + thd->variables.wsrep_sync_wait |= WSREP_SYNC_WAIT_BEFORE_READ; } else { - sv->wsrep_sync_wait &= ~WSREP_SYNC_WAIT_BEFORE_READ; + thd->variables.wsrep_sync_wait &= ~WSREP_SYNC_WAIT_BEFORE_READ; + } + + // update global settings too. + if (global_system_variables.wsrep_causal_reads) { + global_system_variables.wsrep_sync_wait |= WSREP_SYNC_WAIT_BEFORE_READ; + } else { + global_system_variables.wsrep_sync_wait &= ~WSREP_SYNC_WAIT_BEFORE_READ; } return false; @@ -62,12 +75,17 @@ bool wsrep_causal_reads_update (SV *sv) bool wsrep_sync_wait_update (sys_var* self, THD* thd, enum_var_type var_type) { - if (var_type == OPT_GLOBAL) - global_system_variables.wsrep_causal_reads = - MY_TEST(global_system_variables.wsrep_sync_wait & WSREP_SYNC_WAIT_BEFORE_READ); - else - thd->variables.wsrep_causal_reads = - MY_TEST(thd->variables.wsrep_sync_wait & WSREP_SYNC_WAIT_BEFORE_READ); + // global setting should not affect session setting. + // if (var_type == OPT_GLOBAL) { + // thd->variables.wsrep_sync_wait = global_system_variables.wsrep_sync_wait; + // } + thd->variables.wsrep_causal_reads = thd->variables.wsrep_sync_wait & + WSREP_SYNC_WAIT_BEFORE_READ; + + // update global settings too + global_system_variables.wsrep_causal_reads = global_system_variables.wsrep_sync_wait & + WSREP_SYNC_WAIT_BEFORE_READ; + return false; } @@ -528,18 +546,15 @@ void wsrep_node_address_init (const char* value) wsrep_node_address = (value) ? my_strdup(value, MYF(0)) : NULL; } -bool wsrep_slave_threads_check (sys_var *self, THD* thd, set_var* var) +static void wsrep_slave_count_change_update () { - mysql_mutex_lock(&LOCK_wsrep_slave_threads); - wsrep_slave_count_change += (var->save_result.ulonglong_value - - wsrep_slave_threads); - mysql_mutex_unlock(&LOCK_wsrep_slave_threads); - - return 0; + wsrep_slave_count_change += (wsrep_slave_threads - wsrep_prev_slave_threads); + wsrep_prev_slave_threads = wsrep_slave_threads; } bool wsrep_slave_threads_update (sys_var *self, THD* thd, enum_var_type type) { + wsrep_slave_count_change_update(); if (wsrep_slave_count_change > 0) { wsrep_create_appliers(wsrep_slave_count_change); diff --git a/sql/wsrep_var.h b/sql/wsrep_var.h index 1509fc7d589..dde59d1503f 100644 --- a/sql/wsrep_var.h +++ b/sql/wsrep_var.h @@ -41,9 +41,7 @@ int wsrep_init_vars(); #define DEFAULT_ARGS (THD* thd, enum_var_type var_type) #define INIT_ARGS (const char* opt) -struct system_variables; -bool wsrep_causal_reads_update(struct system_variables *sv); - +extern bool wsrep_causal_reads_update UPDATE_ARGS; extern bool wsrep_on_update UPDATE_ARGS; extern bool wsrep_sync_wait_update UPDATE_ARGS; extern bool wsrep_start_position_check CHECK_ARGS; diff --git a/storage/archive/ha_archive.cc b/storage/archive/ha_archive.cc index 810c0fd9c4d..7f83905547b 100644 --- a/storage/archive/ha_archive.cc +++ b/storage/archive/ha_archive.cc @@ -1708,7 +1708,6 @@ int ha_archive::info(uint flag) stats.update_time= (ulong) file_stat.st_mtime; if (flag & HA_STATUS_CONST) { - stats.max_data_file_length= share->rows_recorded * stats.mean_rec_length; stats.max_data_file_length= MAX_FILE_SIZE; stats.create_time= (ulong) file_stat.st_ctime; } diff --git a/storage/connect/CMakeLists.txt b/storage/connect/CMakeLists.txt index a602084b5bd..2fabd12dcd0 100644 --- a/storage/connect/CMakeLists.txt +++ b/storage/connect/CMakeLists.txt @@ -18,10 +18,10 @@ SET(CONNECT_PLUGIN_DYNAMIC "connect") SET(CONNECT_SOURCES ha_connect.cc connect.cc user_connect.cc mycat.cc -fmdlex.c osutil.c plugutil.c rcmsg.c rcmsg.h +fmdlex.c osutil.c rcmsg.c rcmsg.h array.cpp blkfil.cpp colblk.cpp csort.cpp -filamap.cpp filamdbf.cpp filamfix.cpp filamgz.cpp filamtxt.cpp -filter.cpp json.cpp jsonudf.cpp maputil.cpp myconn.cpp myutil.cpp plgdbutl.cpp +filamap.cpp filamdbf.cpp filamfix.cpp filamgz.cpp filamtxt.cpp filter.cpp +json.cpp jsonudf.cpp maputil.cpp myconn.cpp myutil.cpp plgdbutl.cpp plugutil.cpp reldef.cpp tabcol.cpp tabdos.cpp tabext.cpp tabfix.cpp tabfmt.cpp tabjson.cpp table.cpp tabmul.cpp tabmysql.cpp taboccur.cpp tabpivot.cpp tabsys.cpp tabtbl.cpp tabutil.cpp tabvir.cpp tabxcl.cpp valblk.cpp value.cpp xindex.cpp xobject.cpp @@ -38,7 +38,7 @@ user_connect.h valblk.h value.h xindex.h xobject.h xtable.h) # Definitions that are shared for all OSes # add_definitions( -DMARIADB -DFORCE_INIT_OF_VARS -Dconnect_EXPORTS) -add_definitions( -DHUGE_SUPPORT -DGZ_SUPPORT -DPIVOT_SUPPORT ) +add_definitions( -DNEW_MAR -DHUGE_SUPPORT -DGZ_SUPPORT -DPIVOT_SUPPORT ) # @@ -245,13 +245,10 @@ int main() { ENDIF(CONNECT_WITH_ODBC) # -# JDBC +# JDBC and MongoDB Java Driver # -IF(APPLE) - OPTION(CONNECT_WITH_JDBC "Compile CONNECT storage engine without JDBC support" OFF) -ELSE() - OPTION(CONNECT_WITH_JDBC "Compile CONNECT storage engine with JDBC support" ON) -ENDIF() +OPTION(CONNECT_WITH_MONGO "Compile CONNECT storage engine with MONGO support" ON) +OPTION(CONNECT_WITH_JDBC "Compile CONNECT storage engine with JDBC support" ON) IF(CONNECT_WITH_JDBC) FIND_PACKAGE(Java 1.6) @@ -262,18 +259,19 @@ IF(CONNECT_WITH_JDBC) INCLUDE_DIRECTORIES(${JAVA_INCLUDE_PATH2}) # SET(JDBC_LIBRARY ${JAVA_JVM_LIBRARY}) will be dynamically linked SET(CONNECT_SOURCES ${CONNECT_SOURCES} - jdbconn.cpp tabjdbc.cpp jdbconn.h tabjdbc.h jdbccat.h + javaconn.cpp jdbconn.cpp tabjdbc.cpp + jdbccat.h javaconn.h jdbconn.h tabjdbc.h JdbcInterface.java ApacheInterface.java MariadbInterface.java MysqlInterface.java OracleInterface.java PostgresqlInterface.java JavaWrappers.jar) - # TODO: Find how to compile and install the java wrapper classes - # Find required libraries and include directories - SET (JAVA_SOURCES JdbcInterface.java) - add_jar(JdbcInterface ${JAVA_SOURCES}) - install_jar(JdbcInterface DESTINATION ${INSTALL_PLUGINDIR} COMPONENT connect-engine) - INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/JavaWrappers.jar - DESTINATION ${INSTALL_PLUGINDIR} COMPONENT connect-engine) add_definitions(-DJDBC_SUPPORT) + IF(CONNECT_WITH_MONGO) + SET(CONNECT_SOURCES ${CONNECT_SOURCES} + jmgfam.cpp jmgoconn.cpp mongo.cpp tabjmg.cpp + jmgfam.h jmgoconn.h mongo.h tabjmg.h + Mongo2Interface.java Mongo3Interface.java) + add_definitions(-DMONGO_SUPPORT) + ENDIF() ELSE() SET(JDBC_LIBRARY "") ENDIF() @@ -291,6 +289,35 @@ IF(CONNECT_WITH_ZIP) add_definitions(-DZIP_SUPPORT -DNOCRYPT) ENDIF(CONNECT_WITH_ZIP) +# +# MONGO C Driver (CMAKE NOT YET WORKING) +# + +#IF(CONNECT_WITH_MONGO) +# IF(WIN32) +# # Adding some typical places to search in +# SET(PC_MONGO_INCLUDE_DIRS +# C:/mongo-c-driver/include +# D:/mongo-c-driver/include) +# SET(PC_MONGO_LIBRARY_DIRS +# C:/mongo-c-driver/lib +# D:/mongo-c-driver/lib) +# ENDIF(WIN32) +# FIND_PACKAGE(libmongoc 1.7) +# IF (MONGO_FOUND) +# INCLUDE_DIRECTORIES(${MONGO_INCLUDE_DIR}) +# SET(MONGO_LIBRARY ${MONGO_LIBRARIES}) +# SET(CONNECT_SOURCES ${CONNECT_SOURCES} +# cmgoconn.cpp cmgfam.cpp tabcmg.cpp +# cmgoconn.h cmgfam.h tabcmg.h) +# add_definitions(-DCMGO_SUPPORT) +# IF (NOT JAVA_FOUND AND JNI_FOUND) +# SET(CONNECT_SOURCES ${CONNECT_SOURCES} mongo.cpp mongo.h) +# add_definitions(-DMONGO_SUPPORT) +# ENDIF (NOT JAVA_FOUND AND JNI_FOUND) +# ENDIF(MONGO_FOUND) +#ENDIF(CONNECT_WITH_MONGO) + # # XMAP @@ -310,6 +337,35 @@ MYSQL_ADD_PLUGIN(connect ${CONNECT_SOURCES} STORAGE_ENGINE COMPONENT connect-engine RECOMPILE_FOR_EMBEDDED +# LINK_LIBRARIES ${ZLIB_LIBRARY} ${XML_LIBRARY} ${ICONV_LIBRARY} $(MONGO_LIBRARY) LINK_LIBRARIES ${ZLIB_LIBRARY} ${XML_LIBRARY} ${ICONV_LIBRARY} ${ODBC_LIBRARY} ${JDBC_LIBRARY} ${IPHLPAPI_LIBRARY}) +IF(NOT TARGET connect) + RETURN() +ENDIF() + +# Install some extra files that belong to connect engine +IF(WIN32) + # install ha_connect.lib + GET_TARGET_PROPERTY(CONNECT_LOCATION connect LOCATION) + STRING(REPLACE "dll" "lib" CONNECT_LIB ${CONNECT_LOCATION}) + IF(CMAKE_CONFIGURATION_TYPES) + STRING(REPLACE "${CMAKE_CFG_INTDIR}" "\${CMAKE_INSTALL_CONFIG_NAME}" + CONNECT_LIB ${CONNECT_LIB}) + ENDIF() + INSTALL(FILES ${CONNECT_LIB} + DESTINATION ${INSTALL_PLUGINDIR} COMPONENT connect-engine) +ENDIF(WIN32) + +IF(CONNECT_WITH_JDBC AND JAVA_FOUND AND JNI_FOUND) + # TODO: Find how to compile and install the java wrapper classes + # Find required libraries and include directories + SET (JAVA_SOURCES JdbcInterface.java) + add_jar(JdbcInterface ${JAVA_SOURCES}) + INSTALL(FILES + ${CMAKE_CURRENT_SOURCE_DIR}/JavaWrappers.jar + ${CMAKE_CURRENT_BINARY_DIR}/JdbcInterface.jar + DESTINATION ${INSTALL_PLUGINDIR} COMPONENT connect-engine) +ENDIF() + diff --git a/storage/connect/JavaWrappers.jar b/storage/connect/JavaWrappers.jar index 8c01c364a3f..ef407f6a9c2 100644 Binary files a/storage/connect/JavaWrappers.jar and b/storage/connect/JavaWrappers.jar differ diff --git a/storage/connect/Mongo2Interface.java b/storage/connect/Mongo2Interface.java new file mode 100644 index 00000000000..106dd4a4d63 --- /dev/null +++ b/storage/connect/Mongo2Interface.java @@ -0,0 +1,437 @@ +package wrappers; + +import java.util.Date; +import java.util.List; +import java.util.Set; + +import com.mongodb.AggregationOptions; +import com.mongodb.BasicDBList; +import com.mongodb.BasicDBObject; +import com.mongodb.Cursor; +import com.mongodb.DB; +import com.mongodb.DBCollection; +import com.mongodb.DBObject; +import com.mongodb.MongoClient; +import com.mongodb.MongoClientURI; +import com.mongodb.MongoException; +import com.mongodb.WriteConcernException; +import com.mongodb.WriteResult; +import com.mongodb.util.JSON; + +public class Mongo2Interface { + boolean DEBUG = false; + String Errmsg = "No error"; + Set Colnames = null; + Cursor cursor = null; + MongoClient client = null; + DB db = null; + DBCollection coll = null; + BasicDBObject doc = null; + BasicDBObject dbq = null; + BasicDBObject dbf = null; + List pip = null; + AggregationOptions aop = null; + + // === Constructors/finalize ========================================= + public Mongo2Interface() { + this(false); + } // end of default constructor + + public Mongo2Interface(boolean b) { + DEBUG = b; + } // end of constructor + + protected void SetErrmsg(String str) { + if (DEBUG) + System.out.println(str); + + Errmsg = str; + } // end of SetErrmsg + + protected void SetErrmsg(Exception e) { + if (DEBUG) + System.out.println(e.getMessage()); + + Errmsg = e.toString(); + } // end of SetErrmsg + + public String GetErrmsg() { + String err = Errmsg; + + Errmsg = "No error"; + return err; + } // end of GetErrmsg + + public int MongoConnect(String[] parms) { + int rc = 0; + + if (DEBUG) + System.out.println("Mongo2: URI=" + parms[0] + " DB=" + parms[1]); + + try { + MongoClientURI uri = new MongoClientURI(parms[0]); + + client = new MongoClient(uri); + + if (DEBUG) + System.out.println("Connection " + client.toString() + " established"); + + // Now connect to your databases + db = client.getDB(parms[1]); + + if (parms[2] != null && !parms[2].isEmpty()) { + if (DEBUG) + System.out.println("user=" + parms[2] + " pwd=" + parms[3]); + + @SuppressWarnings("deprecation") + boolean auth = db.authenticate(parms[2], parms[3].toCharArray()); + + if (DEBUG) + System.out.println("Authentication: " + auth); + + } // endif user + + } catch (MongoException me) { + SetErrmsg(me); + rc = -1; + } catch (Exception e) { + SetErrmsg(e); + rc = -3; + } // end try/catch + + return rc; + } // end of MongoConnect + + public int MongoDisconnect() { + int rc = 0; + + try { + if (cursor != null) { + if (DEBUG) + System.out.println("Closing cursor"); + + cursor.close(); + cursor = null; + } // endif client + + if (client != null) { + if (DEBUG) + System.out.println("Closing connection"); + + client.close(); + client = null; + } // endif client + + } catch (MongoException se) { + SetErrmsg(se); + rc += 8; + } // end try/catch + + return rc; + } // end of MongoDisconnect + + public boolean GetCollection(String name) { + if (DEBUG) + System.out.println("GetCollection: name=" + name); + + try { + coll = db.getCollection(name); + } catch (Exception e) { + SetErrmsg(e); + return true; + } // end try/catch + + return false; + } // end of GetCollection + + public long GetCollSize() { + return (coll != null) ? coll.count() : 0; + } // end of GetCollSize + + public boolean FindColl(String query, String fields) { + if (DEBUG) + System.out.println("FindColl: query=" + query + " fields=" + fields); + + try { + if (query != null || fields != null) { + dbq = (BasicDBObject) JSON.parse((query != null) ? query : "{}"); + + if (fields != null) { + dbf = (BasicDBObject) JSON.parse(fields); + cursor = coll.find(dbq, dbf); + } else + cursor = coll.find(dbq); + + } else + cursor = coll.find(); + + } catch (Exception e) { + SetErrmsg(e); + return true; + } // end try/catch + + return false; + } // end of FindColl + + @SuppressWarnings("unchecked") + public boolean AggregateColl(String pipeline) { + if (DEBUG) + System.out.println("AggregateColl: pipeline=" + pipeline); + + try { + DBObject pipe = (DBObject) JSON.parse(pipeline); + + pip = (List) pipe.get("pipeline"); + aop = AggregationOptions.builder().batchSize(0).allowDiskUse(true) + .outputMode(AggregationOptions.OutputMode.CURSOR).build(); + cursor = coll.aggregate(pip, aop); + } catch (MongoException me) { + SetErrmsg(me); + return true; + } // end try/catch + + return false; + } // end of AggregateColl + + public boolean Rewind() { + if (cursor != null) + cursor.close(); + + if (pip == null) { + if (dbf != null) + cursor = coll.find(dbq, dbf); + else if (dbq != null) + cursor = coll.find(dbq); + else + cursor = coll.find(); + + } else + cursor = coll.aggregate(pip, aop); + + return (cursor == null); + } // end of Rewind + + public int ReadNext() { + try { + if (cursor.hasNext()) { + doc = (BasicDBObject) cursor.next(); + + if (DEBUG) + System.out.println("Class doc = " + doc.getClass()); + + Colnames = doc.keySet(); + return 1; + } else + return 0; + + } catch (MongoException me) { + SetErrmsg(me); + return -1; + } // end try/catch + + } // end of ReadNext + + public boolean Fetch(int row) { + if (cursor.hasNext()) { + doc = (BasicDBObject) cursor.next(); + Colnames = doc.keySet(); + return true; + } else + return false; + + } // end of Fetch + + public String GetDoc() { + return (doc != null) ? doc.toString() : null; + } // end of GetDoc + + public Set GetColumns() { + if (doc != null) + return doc.keySet(); + else + return null; + + } // end of GetColumns + + public String ColumnDesc(int n, int[] val) { + // if (rsmd == null) { + // System.out.println("No result metadata"); + // return null; + // } else try { + // val[0] = rsmd.getColumnType(n); + // val[1] = rsmd.getPrecision(n); + // val[2] = rsmd.getScale(n); + // val[3] = rsmd.isNullable(n); + // return rsmd.getColumnLabel(n); + // } catch (SQLException se) { + // SetErrmsg(se); + // } //end try/catch + + return null; + } // end of ColumnDesc + + protected Object GetFieldObject(String path) { + Object o = null; + BasicDBObject dob = null; + BasicDBList lst = null; + String[] names = null; + + if (path == null || path.equals("*")) + return doc; + else if (doc instanceof BasicDBObject) + dob = doc; + // else if (o instanceof BasicDBList) + // lst = (BasicDBList) doc; + else + return doc; + + try { + names = path.split("\\."); + + for (String name : names) { + if (lst != null) { + o = lst.get(Integer.parseInt(name)); + } else + o = dob.get(name); + + if (o == null) + break; + + if (DEBUG) + System.out.println("Class o = " + o.getClass()); + + if (o instanceof BasicDBObject) { + dob = (BasicDBObject) o; + lst = null; + } else if (o instanceof BasicDBList) { + lst = (BasicDBList) o; + } else + break; + + } // endfor name + + } catch (IndexOutOfBoundsException x) { + o = null; + } catch (MongoException se) { + SetErrmsg(se); + o = null; + } // end try/catch + + return o; + } // end of GetFieldObject + + public String GetField(String path) { + Object o = GetFieldObject(path); + + if (o != null) { + if (o instanceof Date) { + Integer TS = (int) (((Date) o).getTime() / 1000); + return TS.toString(); + } // endif Date + + return o.toString(); + } else + return null; + + } // end of GetField + + public Object MakeDocument() { + return new BasicDBObject(); + } // end of MakeDocument + + public boolean DocAdd(Object bdc, String key, Object val) { + try { + ((BasicDBObject) bdc).append(key, val); + } catch (MongoException me) { + SetErrmsg(me); + return true; + } // end try/catch + + return false; + } // end of DocAdd + + public Object MakeArray() { + return new BasicDBList(); + } // end of MakeArray + + public boolean ArrayAdd(Object bar, int n, Object val) { + try { + ((BasicDBList) bar).put(n, val); + } catch (MongoException me) { + SetErrmsg(me); + return true; + } catch (Exception ex) { + SetErrmsg(ex); + return true; + } // end try/catch + + return false; + } // end of ArrayAdd + + public boolean CollInsert(Object dob) { + try { + coll.insert((BasicDBObject) dob); + } catch (MongoException me) { + SetErrmsg(me); + return true; + } catch (Exception ex) { + SetErrmsg(ex); + return true; + } // end try/catch + + return false; + } // end of CollInsert + + public long CollUpdate(Object upd) { + long n = -1; + + if (DEBUG) + System.out.println("upd: " + upd.toString()); + + try { + DBObject qry = new BasicDBObject("_id", doc.get("_id")); + + WriteResult res = coll.update(qry, (DBObject) upd); + + if (DEBUG) + System.out.println("CollUpdate: " + res.toString()); + + n = res.getN(); + } catch (MongoException me) { + SetErrmsg(me); + } catch (Exception ex) { + SetErrmsg(ex); + } // end try/catch + + return n; + } // end of CollUpdate + + public long CollDelete(boolean all) { + long n = -1; + + try { + WriteResult res; + BasicDBObject qry = new BasicDBObject(); + + if (!all) + qry.append("_id", doc.get("_id")); + + res = coll.remove(qry); + + if (DEBUG) + System.out.println("CollDelete: " + res.toString()); + + n = res.getN(); + } catch (WriteConcernException wx) { + SetErrmsg(wx); + } catch (MongoException me) { + SetErrmsg(me); + } catch (UnsupportedOperationException ux) { + SetErrmsg(ux); + n = 0; + } // end try/catch + + return n; + } // end of CollDelete + +} // end of class MongoInterface diff --git a/storage/connect/Mongo3Interface.java b/storage/connect/Mongo3Interface.java new file mode 100644 index 00000000000..f587c01b391 --- /dev/null +++ b/storage/connect/Mongo3Interface.java @@ -0,0 +1,504 @@ +package wrappers; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Set; + +import org.bson.BsonArray; +import org.bson.BsonBoolean; +import org.bson.BsonDateTime; +import org.bson.BsonDocument; +import org.bson.BsonDouble; +import org.bson.BsonInt32; +import org.bson.BsonInt64; +import org.bson.BsonNull; +import org.bson.BsonString; +import org.bson.BsonValue; +import org.bson.Document; +import org.bson.conversions.Bson; + +import com.mongodb.MongoClient; +import com.mongodb.MongoClientURI; +import com.mongodb.MongoException; +import com.mongodb.client.AggregateIterable; +import com.mongodb.client.FindIterable; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoCursor; +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.model.Filters; +import com.mongodb.client.result.DeleteResult; +import com.mongodb.client.result.UpdateResult; + +public class Mongo3Interface { + boolean DEBUG = false; + String Errmsg = "No error"; + Set Colnames = null; + MongoClient client = null; + MongoDatabase db = null; + MongoCollection coll = null; + FindIterable finditer = null; + AggregateIterable aggiter = null; + MongoCursor cursor = null; + BsonDocument doc = null; + BsonDocument util = null; + BsonNull bsonull = new BsonNull(); + + // === Constructors/finalize ========================================= + public Mongo3Interface() { + this(false); + } // end of default constructor + + public Mongo3Interface(boolean b) { + DEBUG = b; + } // end of constructor + + protected void SetErrmsg(String str) { + if (DEBUG) + System.out.println(str); + + Errmsg = str; + } // end of SetErrmsg + + protected void SetErrmsg(Exception e) { + if (DEBUG) + System.out.println(e.getMessage()); + + Errmsg = e.toString(); + } // end of SetErrmsg + + public String GetErrmsg() { + String err = Errmsg; + + Errmsg = "No error"; + return err; + } // end of GetErrmsg + + public int MongoConnect(String[] parms) { + int rc = 0; + + if (DEBUG) + System.out.println("Mongo3: URI=" + parms[0] + " DB=" + parms[1]); + + try { + MongoClientURI uri = new MongoClientURI(parms[0]); + + client = new MongoClient(uri); + + if (DEBUG) + System.out.println("Connection " + client.toString() + " established"); + + // Now connect to your databases + db = client.getDatabase(parms[1]); + + // if (parms[2] != null && !parms[2].isEmpty()) { + // if (DEBUG) + // System.out.println("user=" + parms[2] + " pwd=" + parms[3]); + + // @SuppressWarnings("deprecation") + // boolean auth = db.authenticate(parms[2], parms[3].toCharArray()); + + // if (DEBUG) + // System.out.println("Authentication: " + auth); + + // } // endif user + + } catch (MongoException me) { + SetErrmsg(me); + rc = -1; + } catch (Exception e) { + SetErrmsg(e); + rc = -3; + } // end try/catch + + return rc; + } // end of MongoConnect + + public int MongoDisconnect() { + int rc = 0; + + try { + if (cursor != null) { + if (DEBUG) + System.out.println("Closing cursor"); + + cursor.close(); + cursor = null; + } // endif client + + if (client != null) { + if (DEBUG) + System.out.println("Closing connection"); + + client.close(); + client = null; + } // endif client + + } catch (MongoException se) { + SetErrmsg(se); + rc += 8; + } // end try/catch + + return rc; + } // end of MongoDisconnect + + public boolean GetCollection(String name) { + if (DEBUG) + System.out.println("GetCollection: name=" + name); + + try { + coll = db.getCollection(name).withDocumentClass(BsonDocument.class); + } catch (Exception e) { + SetErrmsg(e); + return true; + } // end try/catch + + return false; + } // end of GetCollection + + public long GetCollSize() { + return (coll != null) ? coll.count() : 0; + } // end of GetCollSize + + public boolean FindColl(String query, String fields) { + if (DEBUG) + System.out.println("FindColl: query=" + query + " fields=" + fields); + + try { + if (query != null) { + Bson dbq = Document.parse((query != null) ? query : "{}"); + finditer = coll.find(dbq); + } else + finditer = coll.find(); + + if (fields != null) { + Bson dbf = BsonDocument.parse(fields); + finditer = finditer.projection(dbf); + } // endif fields + + cursor = finditer.iterator(); + } catch (Exception e) { + SetErrmsg(e); + return true; + } // end try/catch + + return false; + } // end of FindColl + + @SuppressWarnings("unchecked") + public boolean AggregateColl(String pipeline) { + if (DEBUG) + System.out.println("AggregateColl: pipeline=" + pipeline); + + try { + Document pipe = Document.parse(pipeline); + ArrayList pip = (ArrayList) pipe.get("pipeline"); + + aggiter = coll.aggregate((List) pip); + cursor = aggiter.iterator(); + } catch (MongoException me) { + SetErrmsg(me); + return true; + } // end try/catch + + return false; + } // end of AggregateColl + + public boolean Rewind() { + if (cursor != null) + cursor.close(); + + if (finditer != null) + cursor = finditer.iterator(); + else if (aggiter != null) + cursor = aggiter.iterator(); + + return (cursor == null); + } // end of Rewind + + public int ReadNext() { + if (cursor.hasNext()) { + doc = cursor.next(); + + if (DEBUG) + System.out.println("Class doc = " + doc.getClass()); + + Colnames = doc.keySet(); + return 1; + } else + return 0; + + } // end of ReadNext + + public boolean Fetch(int row) { + if (cursor.hasNext()) { + doc = cursor.next(); + Colnames = doc.keySet(); + return true; + } else + return false; + + } // end of Fetch + + public String GetDoc() { + return (doc != null) ? doc.toJson() : null; + } // end of GetDoc + + public Set GetColumns() { + if (doc != null) + return doc.keySet(); + else + return null; + + } // end of GetColumns + + public String ColumnName(int n) { + int i = 1; + + for (String name : Colnames) + if (i++ == n) + return name; + + return null; + } // end of ColumnName + + public int ColumnType(int n, String name) { + // if (rsmd == null) { + // System.out.println("No result metadata"); + // } else try { + // if (n == 0) + // n = rs.findColumn(name); + + // return rsmd.getColumnType(n); + // } catch (SQLException se) { + // SetErrmsg(se); + // } //end try/catch + + return 666; // Not a type + } // end of ColumnType + + public String ColumnDesc(int n, int[] val) { + // if (rsmd == null) { + // System.out.println("No result metadata"); + // return null; + // } else try { + // val[0] = rsmd.getColumnType(n); + // val[1] = rsmd.getPrecision(n); + // val[2] = rsmd.getScale(n); + // val[3] = rsmd.isNullable(n); + // return rsmd.getColumnLabel(n); + // } catch (SQLException se) { + // SetErrmsg(se); + // } //end try/catch + + return null; + } // end of ColumnDesc + + protected BsonValue GetFieldObject(String path) { + BsonValue o = doc; + BsonDocument dob = null; + BsonArray ary = null; + String[] names = null; + + if (path == null || path.equals("*")) + return doc; + else if (o instanceof BsonDocument) + dob = doc; + else if (o instanceof BsonArray) + ary = (BsonArray) o; + else + return doc; + + try { + names = path.split("\\."); + + for (String name : names) { + if (ary != null) { + o = ary.get(Integer.parseInt(name)); + } else + o = dob.get(name); + + if (o == null) + break; + + if (DEBUG) + System.out.println("Class o = " + o.getClass()); + + if (o instanceof BsonDocument) { + dob = (BsonDocument) o; + ary = null; + } else if (o instanceof BsonArray) { + ary = (BsonArray) o; + } else + break; + + } // endfor name + + } catch (IndexOutOfBoundsException x) { + o = null; + } catch (MongoException me) { + SetErrmsg(me); + o = null; + } // end try/catch + + return o; + } // end of GetFieldObject + + public String GetField(String path) { + BsonValue o = GetFieldObject(path); + + if (o != null) { + if (o.isString()) { + return o.asString().getValue(); + } else if (o.isInt32()) { + return Integer.toString(o.asInt32().getValue()); + } else if (o.isInt64()) { + return Long.toString(o.asInt64().getValue()); + } else if (o.isObjectId()) { + return o.asObjectId().getValue().toString(); + } else if (o.isDateTime()) { + Integer TS = (int) (o.asDateTime().getValue() / 1000); + return TS.toString(); + } else if (o.isDouble()) { + return Double.toString(o.asDouble().getValue()); + } else if (o.isDocument()) { + return o.asDocument().toJson(); + } else if (o.isArray()) { + util = new BsonDocument("arr", o.asArray()); + String s = util.toJson(); + int i1 = s.indexOf('['); + int i2 = s.lastIndexOf(']'); + return s.substring(i1, i2 + 1); + } else if (o.isNull()) { + return null; + } else + return o.toString(); + + } else + return null; + + } // end of GetField + + protected BsonValue ObjToBson(Object val) { + BsonValue bval = null; + + if (val == null) + bval = bsonull; + else if (val.getClass() == String.class) + bval = new BsonString((String) val); + else if (val.getClass() == Integer.class) + bval = new BsonInt32((int) val); + else if (val.getClass() == Double.class) + bval = new BsonDouble((double) val); + else if (val.getClass() == BigInteger.class) + bval = new BsonInt64((long) val); + else if (val.getClass() == Boolean.class) + bval = new BsonBoolean((Boolean) val); + else if (val.getClass() == Date.class) + bval = new BsonDateTime(((Date) val).getTime() * 1000); + else if (val.getClass() == BsonDocument.class) + bval = (BsonDocument) val; + else if (val.getClass() == BsonArray.class) + bval = (BsonArray) val; + + return bval; + } // end of ObjToBson + + public Object MakeDocument() { + return new BsonDocument(); + } // end of MakeDocument + + public boolean DocAdd(Object bdc, String key, Object val) { + try { + ((BsonDocument) bdc).append(key, ObjToBson(val)); + } catch (MongoException me) { + SetErrmsg(me); + return true; + } // end try/catch + + return false; + } // end of DocAdd + + public Object MakeArray() { + return new BsonArray(); + } // end of MakeArray + + public boolean ArrayAdd(Object bar, int n, Object val) { + try { + for (int i = ((BsonArray) bar).size(); i < n; i++) + ((BsonArray) bar).add(bsonull); + + ((BsonArray) bar).add(ObjToBson(val)); + } catch (MongoException me) { + SetErrmsg(me); + return true; + } catch (Exception ex) { + SetErrmsg(ex); + return true; + } // end try/catch + + return false; + } // end of ArrayAdd + + public boolean CollInsert(Object dob) { + try { + coll.insertOne((BsonDocument) dob); + } catch (MongoException me) { + SetErrmsg(me); + return true; + } catch (Exception ex) { + SetErrmsg(ex); + return true; + } // end try/catch + + return false; + } // end of CollInsert + + public long CollUpdate(Object upd) { + long n = -1; + + if (DEBUG) + System.out.println("upd: " + upd.toString()); + + try { + UpdateResult res = coll.updateOne(Filters.eq("_id", doc.get("_id")), (Bson) upd); + + if (DEBUG) + System.out.println("CollUpdate: " + res.toString()); + + n = res.getModifiedCount(); + } catch (MongoException me) { + SetErrmsg(me); + } catch (Exception ex) { + SetErrmsg(ex); + } // end try/catch + + return n; + } // end of CollUpdate + + public long CollDelete(boolean all) { + long n = -1; + + try { + DeleteResult res; + + if (all) + res = coll.deleteMany(new Document()); + else + res = coll.deleteOne(Filters.eq("_id", doc.get("_id"))); + + if (DEBUG) + System.out.println("CollDelete: " + res.toString()); + + n = res.getDeletedCount(); + } catch (MongoException me) { + SetErrmsg(me); + } catch (Exception ex) { + SetErrmsg(ex); + } // end try/catch + + return n; + } // end of CollDelete + +} // end of class MongoInterface diff --git a/storage/connect/array.cpp b/storage/connect/array.cpp index 1998ab890e9..59a53487a7e 100644 --- a/storage/connect/array.cpp +++ b/storage/connect/array.cpp @@ -155,6 +155,7 @@ ARRAY::ARRAY(PGLOBAL g, int type, int size, int length, int prec) switch (type) { case TYPE_STRING: Len = length; + /* fall through */ case TYPE_SHORT: case TYPE_INT: case TYPE_DOUBLE: @@ -518,8 +519,8 @@ bool ARRAY::FilTest(PGLOBAL g, PVAL valp, OPVAL opc, int opm) vp = valp; } else if (opc != OP_EXIST) { - sprintf(g->Message, MSG(MISSING_ARG), opc); - longjmp(g->jumper[g->jump_level], TYPE_ARRAY); + sprintf(g->Message, MSG(MISSING_ARG), opc); + throw (int)TYPE_ARRAY; } else // OP_EXIST return Nval > 0; @@ -592,6 +593,7 @@ int ARRAY::Convert(PGLOBAL g, int k, PVAL vp) switch (Type) { case TYPE_DOUBLE: prec = 2; + /* fall through */ case TYPE_SHORT: case TYPE_INT: case TYPE_DATE: @@ -681,15 +683,15 @@ void ARRAY::SetPrecision(PGLOBAL g, int p) { if (Vblp == NULL) { strcpy(g->Message, MSG(PREC_VBLP_NULL)); - longjmp(g->jumper[g->jump_level], TYPE_ARRAY); + throw (int)TYPE_ARRAY; } // endif Vblp bool was = Vblp->IsCi(); if (was && !p) { strcpy(g->Message, MSG(BAD_SET_CASE)); - longjmp(g->jumper[g->jump_level], TYPE_ARRAY); - } // endif Vblp + throw (int)TYPE_ARRAY; + } // endif Vblp if (was || !p) return; @@ -699,7 +701,7 @@ void ARRAY::SetPrecision(PGLOBAL g, int p) if (!was && Type == TYPE_STRING) // Must be resorted to eliminate duplicate strings if (Sort(g)) - longjmp(g->jumper[g->jump_level], TYPE_ARRAY); + throw (int)TYPE_ARRAY; } // end of SetPrecision @@ -973,18 +975,18 @@ int ARRAY::BlockTest(PGLOBAL, int opc, int opm, PSZ ARRAY::MakeArrayList(PGLOBAL g) { char *p, *tp; - int i; + int i; size_t z, len = 2; if (Type == TYPE_LIST) - return "(?" "?" "?)"; // To be implemented + return (PSZ)("(?" "?" "?)"); // To be implemented z = MY_MAX(24, GetTypeSize(Type, Len) + 4); tp = (char*)PlugSubAlloc(g, NULL, z); for (i = 0; i < Nval; i++) { Value->SetValue_pvblk(Vblp, i); - Value->Print(g, tp, z); + Value->Prints(g, tp, z); len += strlen(tp); } // enfor i @@ -996,7 +998,7 @@ PSZ ARRAY::MakeArrayList(PGLOBAL g) for (i = 0; i < Nval;) { Value->SetValue_pvblk(Vblp, i); - Value->Print(g, tp, z); + Value->Prints(g, tp, z); strcat(p, tp); strcat(p, (++i == Nval) ? ")" : ","); } // enfor i @@ -1010,7 +1012,7 @@ PSZ ARRAY::MakeArrayList(PGLOBAL g) /***********************************************************************/ /* Make file output of ARRAY contents. */ /***********************************************************************/ -void ARRAY::Print(PGLOBAL g, FILE *f, uint n) +void ARRAY::Printf(PGLOBAL g, FILE *f, uint n) { char m[64]; int lim = MY_MIN(Nval,10); @@ -1027,25 +1029,25 @@ void ARRAY::Print(PGLOBAL g, FILE *f, uint n) if (Vblp) for (int i = 0; i < lim; i++) { Value->SetValue_pvblk(Vblp, i); - Value->Print(g, f, n+4); + Value->Printf(g, f, n+4); } // endfor i } else fprintf(f, "%sVALLST: numval=%d\n", m, Nval); - } // end of Print + } // end of Printf /***********************************************************************/ /* Make string output of ARRAY contents. */ /***********************************************************************/ -void ARRAY::Print(PGLOBAL, char *ps, uint z) +void ARRAY::Prints(PGLOBAL, char *ps, uint z) { if (z < 16) return; sprintf(ps, "ARRAY: type=%d\n", Type); // More to be implemented later - } // end of Print + } // end of Prints /* -------------------------- Class MULAR ---------------------------- */ diff --git a/storage/connect/array.h b/storage/connect/array.h index dfc3638de8a..bd38344de06 100644 --- a/storage/connect/array.h +++ b/storage/connect/array.h @@ -56,8 +56,8 @@ class DllExport ARRAY : public XOBJECT, public CSORT { // Array descblock virtual bool Compare(PXOB) {assert(false); return false;} virtual bool SetFormat(PGLOBAL, FORMAT&) {assert(false); return false;} //virtual int CheckSpcCol(PTDB, int) {return 0;} - virtual void Print(PGLOBAL g, FILE *f, uint n); - virtual void Print(PGLOBAL g, char *ps, uint z); + virtual void Printf(PGLOBAL g, FILE *f, uint n); + virtual void Prints(PGLOBAL g, char *ps, uint z); // void Empty(void); void SetPrecision(PGLOBAL g, int p); bool AddValue(PGLOBAL g, PSZ sp); diff --git a/storage/connect/blkfil.cpp b/storage/connect/blkfil.cpp index 50535d20a3d..802095f2f82 100644 --- a/storage/connect/blkfil.cpp +++ b/storage/connect/blkfil.cpp @@ -1,11 +1,11 @@ /************* BlkFil C++ Program Source Code File (.CPP) **************/ /* PROGRAM NAME: BLKFIL */ /* ------------- */ -/* Version 2.5 */ +/* Version 2.6 */ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 2004-2015 */ +/* (C) Copyright to the author Olivier BERTRAND 2004-2017 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -56,7 +56,7 @@ BLOCKFILTER::BLOCKFILTER(PTDBDOS tdbp, int op) /***********************************************************************/ /* Make file output of BLOCKFILTER contents. */ /***********************************************************************/ -void BLOCKFILTER::Print(PGLOBAL, FILE *f, uint n) +void BLOCKFILTER::Printf(PGLOBAL, FILE *f, uint n) { char m[64]; @@ -65,15 +65,15 @@ void BLOCKFILTER::Print(PGLOBAL, FILE *f, uint n) fprintf(f, "%sBLOCKFILTER: at %p opc=%d opm=%d result=%d\n", m, this, Opc, Opm, Result); - } // end of Print + } // end of Printf /***********************************************************************/ /* Make string output of BLOCKFILTER contents. */ /***********************************************************************/ -void BLOCKFILTER::Print(PGLOBAL, char *ps, uint z) +void BLOCKFILTER::Prints(PGLOBAL, char *ps, uint z) { strncat(ps, "BlockFilter(s)", z); - } // end of Print + } // end of Prints /* ---------------------- Class BLKFILLOG ---------------------------- */ @@ -412,7 +412,7 @@ void BLKFILMR2::MakeValueBitmap(void) Void = !Bmp[N]; // There are no good values in the file for (i = 0; i < N; i++) { - Bxp[i] = ~0U; + Bxp[i] = ~0; if (noteq) Bmp[i] = Bxp[i]; @@ -595,8 +595,8 @@ BLKFILIN::BLKFILIN(PGLOBAL g, PTDBDOS tdbp, int op, int opm, PXOB *xp) if (Colp->GetResultType() != Type) { sprintf(g->Message, "BLKFILIN: %s", MSG(VALTYPE_NOMATCH)); - longjmp(g->jumper[g->jump_level], 99); - } else if (Colp->GetValue()->IsCi()) + throw g->Message; + } else if (Colp->GetValue()->IsCi()) Arap->SetPrecision(g, 1); // Case insensitive Sorted = Colp->IsSorted() > 0; @@ -708,7 +708,7 @@ void BLKFILIN2::MakeValueBitmap(void) Void = !Bmp[N]; // There are no good values in the file for (i = 0; i < N; i++) { - Bxp[i] = ~0U; + Bxp[i] = ~0; if (noteq) { Bmp[i] = Bxp[i]; @@ -828,7 +828,7 @@ BLKFILIN2::BLKFILIN2(PGLOBAL g, PTDBDOS tdbp, int op, int opm, PXOB *xp) Bxp[i] |= btp; for (N = i--; i >= 0; i--) - Bxp[i] = ~0U; + Bxp[i] = ~0; break; } // endif Bmp @@ -995,7 +995,7 @@ int BLOCKINDEX::BlockEval(PGLOBAL g) /***********************************************************************/ /* Make file output of BLOCKINDEX contents. */ /***********************************************************************/ -void BLOCKINDEX::Print(PGLOBAL g, FILE *f, UINT n) +void BLOCKINDEX::Printf(PGLOBAL g, FILE *f, UINT n) { char m[64]; @@ -1006,17 +1006,17 @@ void BLOCKINDEX::Print(PGLOBAL g, FILE *f, UINT n) m, this, Next, (Colp) ? Colp->GetName() : "Rowid", Kxp, Result); if (Next) - Next->Print(g, f, n); + Next->Printf(g, f, n); - } // end of Print + } // end of Printf /***********************************************************************/ /* Make string output of BLOCKINDEX contents. */ /***********************************************************************/ -void BLOCKINDEX::Print(PGLOBAL g, char *ps, UINT z) +void BLOCKINDEX::Prints(PGLOBAL g, char *ps, UINT z) { strncat(ps, "BlockIndex(es)", z); - } // end of Print + } // end of Prints /* ------------------------------------------------------------------- */ diff --git a/storage/connect/blkfil.h b/storage/connect/blkfil.h index 00b00139042..61b02c53c14 100644 --- a/storage/connect/blkfil.h +++ b/storage/connect/blkfil.h @@ -27,8 +27,8 @@ class DllExport BLOCKFILTER : public BLOCK { /* Block Filter */ // Methods virtual void Reset(PGLOBAL) = 0; virtual int BlockEval(PGLOBAL) = 0; - virtual void Print(PGLOBAL g, FILE *f, uint n); - virtual void Print(PGLOBAL g, char *ps, uint z); + virtual void Printf(PGLOBAL g, FILE *f, uint n); + virtual void Prints(PGLOBAL g, char *ps, uint z); protected: BLOCKFILTER(void) {} // Standard constructor not to be used @@ -234,8 +234,8 @@ class DllExport BLOCKINDEX : public BLOCK { /* Indexing Test Block */ // Methods void Reset(void); virtual int BlockEval(PGLOBAL); - virtual void Print(PGLOBAL g, FILE *f, UINT n); - virtual void Print(PGLOBAL g, char *ps, UINT z); + virtual void Printf(PGLOBAL g, FILE *f, UINT n); + virtual void Prints(PGLOBAL g, char *ps, UINT z); protected: BLOCKINDEX(void) {} // Standard constructor not to be used diff --git a/storage/connect/block.h b/storage/connect/block.h index aa4edde5ec9..8ac7be80988 100644 --- a/storage/connect/block.h +++ b/storage/connect/block.h @@ -44,8 +44,8 @@ class DllExport BLOCK { return (PlugSubAlloc(g, p, size)); } // end of new - virtual void Print(PGLOBAL, FILE *, uint) {} // Produce file desc - virtual void Print(PGLOBAL, char *, uint) {} // Produce string desc + virtual void Printf(PGLOBAL, FILE *, uint) {} // Produce file desc + virtual void Prints(PGLOBAL, char *, uint) {} // Produce string desc #if !defined(__BORLANDC__) // Avoid warning C4291 by defining a matching dummy delete operator diff --git a/storage/connect/catalog.h b/storage/connect/catalog.h index 70304c410cc..48347d7519e 100644 --- a/storage/connect/catalog.h +++ b/storage/connect/catalog.h @@ -36,7 +36,7 @@ typedef struct _curtab { /* Defines the structure used to get column catalog info. */ /***********************************************************************/ typedef struct _colinfo { - char *Name; + PCSZ Name; int Type; int Offset; int Length; @@ -45,9 +45,9 @@ typedef struct _colinfo { int Scale; int Opt; int Freq; - char *Remark; - char *Datefmt; - char *Fieldfmt; + PCSZ Remark; + PCSZ Datefmt; + PCSZ Fieldfmt; ushort Flags; // Used by MariaDB CONNECT handlers } COLINFO, *PCOLINFO; @@ -68,11 +68,9 @@ class DllExport CATALOG { bool GetDefHuge(void) {return DefHuge;} void SetDefHuge(bool b) {DefHuge = b;} char *GetCbuf(void) {return Cbuf;} -//char *GetDataPath(void) {return (char*)DataPath;} // Methods virtual void Reset(void) {} -//virtual void SetDataPath(PGLOBAL g, const char *path) {} virtual bool CheckName(PGLOBAL, char*) {return true;} virtual bool ClearName(PGLOBAL, PSZ) {return true;} virtual PRELDEF MakeOneTableDesc(PGLOBAL, LPCSTR, LPCSTR) {return NULL;} @@ -102,7 +100,6 @@ class DllExport CATALOG { int Cblen; /* Length of suballoc. buffer */ CURTAB Ctb; /* Used to enumerate tables */ bool DefHuge; /* true: tables default to huge */ -//LPCSTR DataPath; /* Is the Path of DB data dir */ }; // end of class CATALOG #endif // __CATALOG__H diff --git a/storage/connect/cmgfam.cpp b/storage/connect/cmgfam.cpp new file mode 100644 index 00000000000..579b5b919a7 --- /dev/null +++ b/storage/connect/cmgfam.cpp @@ -0,0 +1,271 @@ +/************** CMGFAM C++ Program Source Code File (.CPP) *************/ +/* PROGRAM NAME: cmgfam.cpp */ +/* ------------- */ +/* Version 1.4 */ +/* */ +/* COPYRIGHT: */ +/* ---------- */ +/* (C) Copyright to the author Olivier BERTRAND 20017 */ +/* */ +/* WHAT THIS PROGRAM DOES: */ +/* ----------------------- */ +/* This program are the MongoDB access method classes. */ +/* */ +/***********************************************************************/ + +/***********************************************************************/ +/* Include relevant sections of the System header files. */ +/***********************************************************************/ +#include "my_global.h" + +/***********************************************************************/ +/* Include application header files: */ +/* global.h is header containing all global declarations. */ +/* plgdbsem.h is header containing the DB application declarations. */ +/* filamtxt.h is header containing the file AM classes declarations. */ +/***********************************************************************/ +#include "global.h" +#include "plgdbsem.h" +#include "reldef.h" +#include "filamtxt.h" +#include "tabdos.h" +#include "tabjson.h" +#include "cmgfam.h" + +#if defined(UNIX) || defined(UNIV_LINUX) +#include "osutil.h" +#endif + +/* --------------------------- Class CMGFAM -------------------------- */ + +/***********************************************************************/ +/* Constructors. */ +/***********************************************************************/ +CMGFAM::CMGFAM(PJDEF tdp) : DOSFAM((PDOSDEF)NULL) +{ + Cmgp = NULL; + Pcg.Tdbp = NULL; + + if (tdp) { + Pcg.Uristr = tdp->Uri; + Pcg.Db_name = tdp->Schema; + Pcg.Coll_name = tdp->Collname; + Pcg.Options = tdp->Options; + Pcg.Filter = tdp->Filter; + Pcg.Pipe = tdp->Pipe && tdp->Options != NULL; + } else { + Pcg.Uristr = NULL; + Pcg.Db_name = NULL; + Pcg.Coll_name = NULL; + Pcg.Options = NULL; + Pcg.Filter = NULL; + Pcg.Pipe = false; + } // endif tdp + + To_Fbt = NULL; + Mode = MODE_ANY; + Done = false; + Lrecl = tdp->Lrecl + tdp->Ending; +} // end of CMGFAM standard constructor + + CMGFAM::CMGFAM(PCMGFAM tdfp) : DOSFAM(tdfp) +{ + Pcg = tdfp->Pcg; + To_Fbt = tdfp->To_Fbt; + Mode = tdfp->Mode; + Done = tdfp->Done; + } // end of CMGFAM copy constructor + +/***********************************************************************/ +/* Reset: reset position values at the beginning of file. */ +/***********************************************************************/ +void CMGFAM::Reset(void) +{ + TXTFAM::Reset(); + Fpos = Tpos = Spos = 0; +} // end of Reset + +/***********************************************************************/ +/* MGO GetFileLength: returns file size in number of bytes. */ +/***********************************************************************/ +int CMGFAM::GetFileLength(PGLOBAL g) +{ + return 0; +} // end of GetFileLength + +/***********************************************************************/ +/* Cardinality: returns the number of documents in the collection. */ +/* This function can be called with a null argument to test the */ +/* availability of Cardinality implementation (1 yes, 0 no). */ +/***********************************************************************/ +int CMGFAM::Cardinality(PGLOBAL g) +{ + if (!g) + return 1; + + return (!Init(g)) ? Cmgp->CollSize(g) : 0; +} // end of Cardinality + +/***********************************************************************/ +/* Note: This function is not really implemented yet. */ +/***********************************************************************/ +int CMGFAM::MaxBlkSize(PGLOBAL, int s) +{ + return s; +} // end of MaxBlkSize + +/***********************************************************************/ +/* Init: initialize MongoDB processing. */ +/***********************************************************************/ +bool CMGFAM::Init(PGLOBAL g) +{ + if (Done) + return false; + + /*********************************************************************/ + /* Open an C connection for this table. */ + /*********************************************************************/ + if (!Cmgp) { + Pcg.Tdbp = Tdbp; + Cmgp = new(g) CMgoConn(g, &Pcg); + } else if (Cmgp->IsConnected()) + Cmgp->Close(); + + if (Cmgp->Connect(g)) + return true; + + Done = true; + return false; +} // end of Init + +/***********************************************************************/ +/* OpenTableFile: Open a MongoDB table. */ +/***********************************************************************/ +bool CMGFAM::OpenTableFile(PGLOBAL g) +{ + Mode = Tdbp->GetMode(); + + if (Pcg.Pipe && Mode != MODE_READ) { + strcpy(g->Message, "Pipeline tables are read only"); + return true; + } // endif Pipe + + if (Init(g)) + return true; + + if (Mode == MODE_DELETE && !Tdbp->GetNext()) + // Delete all documents + return Cmgp->DocDelete(g); + else if (Mode == MODE_INSERT) + Cmgp->MakeColumnGroups(g); + + return false; +} // end of OpenTableFile + +/***********************************************************************/ +/* GetRowID: return the RowID of last read record. */ +/***********************************************************************/ +int CMGFAM::GetRowID(void) +{ + return Rows; +} // end of GetRowID + +/***********************************************************************/ +/* GetPos: return the position of last read record. */ +/***********************************************************************/ +int CMGFAM::GetPos(void) +{ + return Fpos; +} // end of GetPos + +/***********************************************************************/ +/* GetNextPos: return the position of next record. */ +/***********************************************************************/ +int CMGFAM::GetNextPos(void) +{ + return Fpos; // TODO +} // end of GetNextPos + +/***********************************************************************/ +/* SetPos: Replace the table at the specified position. */ +/***********************************************************************/ +bool CMGFAM::SetPos(PGLOBAL g, int pos) +{ + Fpos = pos; + Placed = true; + return false; +} // end of SetPos + +/***********************************************************************/ +/* Record file position in case of UPDATE or DELETE. */ +/***********************************************************************/ +bool CMGFAM::RecordPos(PGLOBAL g) +{ + strcpy(g->Message, "CMGFAM::RecordPos NIY"); + return true; +} // end of RecordPos + +/***********************************************************************/ +/* Initialize Fpos and the current position for indexed DELETE. */ +/***********************************************************************/ +int CMGFAM::InitDelete(PGLOBAL g, int fpos, int spos) +{ + strcpy(g->Message, "CMGFAM::InitDelete NIY"); + return RC_FX; +} // end of InitDelete + +/***********************************************************************/ +/* Skip one record in file. */ +/***********************************************************************/ +int CMGFAM::SkipRecord(PGLOBAL g, bool header) +{ + return RC_OK; // Dummy +} // end of SkipRecord + +/***********************************************************************/ +/* ReadBuffer: Get next document from a collection. */ +/***********************************************************************/ +int CMGFAM::ReadBuffer(PGLOBAL g) +{ + int rc = Cmgp->ReadNext(g); + + if (rc != RC_OK) + return rc; + + strncpy(Tdbp->GetLine(), Cmgp->GetDocument(g), Lrecl); + return RC_OK; +} // end of ReadBuffer + +/***********************************************************************/ +/* WriteBuffer: File write routine for MGO access method. */ +/***********************************************************************/ +int CMGFAM::WriteBuffer(PGLOBAL g) +{ + return Cmgp->Write(g); +} // end of WriteBuffer + +/***********************************************************************/ +/* Data Base delete line routine for MGO and BLK access methods. */ +/***********************************************************************/ +int CMGFAM::DeleteRecords(PGLOBAL g, int irc) +{ + return (irc == RC_OK) ? WriteBuffer(g) : RC_OK; +} // end of DeleteRecords + +/***********************************************************************/ +/* Table file close routine for MGO access method. */ +/***********************************************************************/ +void CMGFAM::CloseTableFile(PGLOBAL g, bool) +{ + Cmgp->Close(); + Done = false; +} // end of CloseTableFile + +/***********************************************************************/ +/* Rewind routine for MGO access method. */ +/***********************************************************************/ +void CMGFAM::Rewind(void) +{ + Cmgp->Rewind(); +} // end of Rewind + diff --git a/storage/connect/cmgfam.h b/storage/connect/cmgfam.h new file mode 100644 index 00000000000..7571f5c5309 --- /dev/null +++ b/storage/connect/cmgfam.h @@ -0,0 +1,65 @@ +/*************** CMGFam H Declares Source Code File (.H) ***************/ +/* Name: cmgfam.h Version 1.5 */ +/* */ +/* (C) Copyright to the author Olivier BERTRAND 2017 */ +/* */ +/* This file contains the MongoDB access method classes declares. */ +/***********************************************************************/ +#include "cmgoconn.h" + +typedef class TXTFAM *PTXF; +typedef class CMGFAM *PCMGFAM; +typedef class MGODEF *PMGODEF; +typedef class TDBCMG *PTDBCMG; + +/***********************************************************************/ +/* This is the MongoDB Access Method class declaration. */ +/***********************************************************************/ +class DllExport CMGFAM : public DOSFAM { + friend void mongo_init(bool); +public: + // Constructor + CMGFAM(PJDEF tdp); + CMGFAM(PCMGFAM txfp); + + // Implementation + virtual AMT GetAmType(void) { return TYPE_AM_MGO; } + virtual bool GetUseTemp(void) { return false; } + virtual int GetPos(void); + virtual int GetNextPos(void); + void SetTdbp(PTDBDOS tdbp) { Tdbp = tdbp; } + virtual PTXF Duplicate(PGLOBAL g) { return (PTXF)new(g) CMGFAM(this); } + void SetLrecl(int lrecl) { Lrecl = lrecl; } + + // Methods + virtual void Reset(void); + virtual int GetFileLength(PGLOBAL g); + virtual int Cardinality(PGLOBAL g); + virtual int MaxBlkSize(PGLOBAL g, int s); + virtual bool AllocateBuffer(PGLOBAL g) { return false; } + virtual int GetRowID(void); + virtual bool RecordPos(PGLOBAL g); + virtual bool SetPos(PGLOBAL g, int recpos); + virtual int SkipRecord(PGLOBAL g, bool header); + virtual bool OpenTableFile(PGLOBAL g); + virtual int ReadBuffer(PGLOBAL g); + virtual int WriteBuffer(PGLOBAL g); + virtual int DeleteRecords(PGLOBAL g, int irc); + virtual void CloseTableFile(PGLOBAL g, bool abort); + virtual void Rewind(void); + +protected: + virtual bool OpenTempFile(PGLOBAL g) { return false; } + virtual bool MoveIntermediateLines(PGLOBAL g, bool *b) { return false; } + virtual int RenameTempFile(PGLOBAL g) { return RC_OK; } + virtual int InitDelete(PGLOBAL g, int fpos, int spos); + bool Init(PGLOBAL g); + + // Members + CMgoConn *Cmgp; // Points to a C Mongo connection class + CMGOPARM Pcg; // Parms passed to Cmgp + PFBLOCK To_Fbt; // Pointer to temp file block + MODE Mode; + bool Done; // Init done +}; // end of class CMGFAM + diff --git a/storage/connect/cmgoconn.cpp b/storage/connect/cmgoconn.cpp new file mode 100644 index 00000000000..fdd59040257 --- /dev/null +++ b/storage/connect/cmgoconn.cpp @@ -0,0 +1,935 @@ +/************ CMgoConn C++ Functions Source Code File (.CPP) ***********/ +/* Name: CMgoConn.CPP Version 1.0 */ +/* */ +/* (C) Copyright to the author Olivier BERTRAND 2017 */ +/* */ +/* This file contains the MongoDB C connection classes functions. */ +/***********************************************************************/ + +/***********************************************************************/ +/* Include relevant MariaDB header file. */ +/***********************************************************************/ +#include + +/***********************************************************************/ +/* Required objects includes. */ +/***********************************************************************/ +#include "global.h" +#include "plgdbsem.h" +#include "colblk.h" +#include "xobject.h" +#include "xtable.h" +#include "filter.h" +#include "cmgoconn.h" + +bool IsNum(PSZ s); + +// Required to initialize libmongoc's internals +void mongo_init(bool init) +{ + if (init) + mongoc_init(); + else + mongoc_cleanup(); + +} // end of mongo_init + +/* --------------------------- Class INCOL --------------------------- */ + +/***********************************************************************/ +/* Add a column in the column list. */ +/***********************************************************************/ +void INCOL::AddCol(PGLOBAL g, PCOL colp, char *jp) +{ + char *p; + PKC kp, kcp; + + if ((p = strchr(jp, '.'))) { + PINCOL icp; + + *p++ = 0; + + for (kp = Klist; kp; kp = kp->Next) + if (kp->Incolp && !strcmp(jp, kp->Key)) + break; + + if (!kp) { + icp = new(g) INCOL(IsNum(p)); + kcp = (PKC)PlugSubAlloc(g, NULL, sizeof(KEYCOL)); + kcp->Next = NULL; + kcp->Incolp = icp; + kcp->Colp = NULL; + kcp->Key = PlugDup(g, jp); + + if (Klist) { + for (kp = Klist; kp->Next; kp = kp->Next); + + kp->Next = kcp; + } else + Klist = kcp; + + } else + icp = kp->Incolp; + + *(p - 1) = '.'; + icp->AddCol(g, colp, p); + } else { + kcp = (PKC)PlugSubAlloc(g, NULL, sizeof(KEYCOL)); + + kcp->Next = NULL; + kcp->Incolp = NULL; + kcp->Colp = colp; + kcp->Key = jp; + + if (Klist) { + for (kp = Klist; kp->Next; kp = kp->Next); + + kp->Next = kcp; + } else + Klist = kcp; + + } // endif jp + +} // end of AddCol + +/***********************************************************************/ +/* Clear. */ +/***********************************************************************/ +void INCOL::Init(void) +{ + bson_init(Child); + + for (PKC kp = Klist; kp; kp = kp->Next) + if (kp->Incolp) + kp->Incolp->Init(); + +} // end of init + +/***********************************************************************/ +/* Destroy. */ +/***********************************************************************/ +void INCOL::Destroy(void) +{ + bson_destroy(Child); + + for (PKC kp = Klist; kp; kp = kp->Next) + if (kp->Incolp) + kp->Incolp->Destroy(); + +} // end of Destroy + +/* -------------------------- Class CMgoConn ------------------------- */ + +/***********************************************************************/ +/* Implementation of the CMgoConn class. */ +/***********************************************************************/ +CMgoConn::CMgoConn(PGLOBAL g, PCPARM pcg) +{ + Pcg = pcg; + Uri = NULL; + Pool = NULL; + Client = NULL; + Database = NULL; + Collection = NULL; + Cursor = NULL; + Query = NULL; + Opts = NULL; + Fpc = NULL; + fp = NULL; + m_Connected = false; +} // end of CMgoConn standard constructor + +/***********************************************************************/ +/* Connect to the MongoDB server and get the collection. */ +/***********************************************************************/ +bool CMgoConn::Connect(PGLOBAL g) +{ + Uri = mongoc_uri_new(Pcg->Uristr); + + if (!Uri) { + sprintf(g->Message, "Failed to parse URI: \"%s\"", Pcg->Uristr); + return true; + } // endif Uri + + // Create a new client pool instance + Pool = mongoc_client_pool_new(Uri); + mongoc_client_pool_set_error_api(Pool, 2); + + // Register the application name so we can track it in the profile logs + // on the server. This can also be done from the URI. + mongoc_client_pool_set_appname(Pool, "Connect"); + + // Create a new client instance + Client = mongoc_client_pool_pop(Pool); + + if (!Client) { + sprintf(g->Message, "Failed to get Client"); + return true; + } // endif Client + + // Get a handle on the collection Coll_name + Collection = mongoc_client_get_collection(Client, Pcg->Db_name, Pcg->Coll_name); + + if (!Collection) { + sprintf(g->Message, "Failed to get Collection %s.%s", + Pcg->Db_name, Pcg->Coll_name); + return true; + } // endif Collection + + /*********************************************************************/ + /* Link a Fblock. This make possible to automatically close it */ + /* in case of error (throw). */ + /*********************************************************************/ + PDBUSER dbuserp = (PDBUSER)g->Activityp->Aptr; + + fp = (PFBLOCK)PlugSubAlloc(g, NULL, sizeof(FBLOCK)); + fp->Type = TYPE_FB_MONGO; + fp->Fname = NULL; + fp->Next = dbuserp->Openlist; + dbuserp->Openlist = fp; + fp->Count = 1; + fp->Length = 0; + fp->Memory = NULL; + fp->Mode = MODE_ANY; + fp->File = this; + fp->Handle = 0; + + m_Connected = true; + return false; +} // end of Connect + +/***********************************************************************/ +/* CollSize: returns the number of documents in the collection. */ +/***********************************************************************/ +int CMgoConn::CollSize(PGLOBAL g) +{ + int cnt; + bson_t *query; + const char *jf = NULL; + + if (Pcg->Pipe) + return 10; + else if (Pcg->Filter) + jf = Pcg->Filter; + + if (jf) { + query = bson_new_from_json((const uint8_t *)jf, -1, &Error); + + if (!query) { + htrc("Wrong filter: %s", Error.message); + return 10; + } // endif Query + + } else + query = bson_new(); + + cnt = (int)mongoc_collection_count(Collection, + MONGOC_QUERY_NONE, query, 0, 0, NULL, &Error); + + if (cnt < 0) { + htrc("Collection count: %s", Error.message); + cnt = 2; + } // endif Cardinal + + bson_destroy(query); + return cnt; +} // end of CollSize + +/***********************************************************************/ +/* OpenDB: Data Base open routine for MONGO access method. */ +/***********************************************************************/ +bool CMgoConn::MakeCursor(PGLOBAL g) +{ + const char *p; + bool id, b = false, all = false; + PCSZ options = Pcg->Options; + PTDB tp = Pcg->Tdbp; + PCOL cp; + PSTRG s = NULL; + + id = (tp->GetMode() != MODE_READ); + + if (options && !stricmp(options, "all")) { + options = NULL; + all = true; + } // endif Options + + for (cp = tp->GetColumns(); cp; cp = cp->GetNext()) + if (!strcmp(cp->GetName(), "_id")) + id = true; + else if (cp->GetFmt() && !strcmp(cp->GetFmt(), "*") && !options) + all = true; + + if (Pcg->Pipe) { + if (trace) + htrc("Pipeline: %s\n", options); + + p = strrchr(options, ']'); + + if (!p) { + strcpy(g->Message, "Missing ] in pipeline"); + return true; + } else + *(char*)p = 0; + + s = new(g) STRING(g, 1023, (PSZ)options); + + if (tp->GetFilter()) { + s->Append(",{\"$match\":"); + + if (tp->GetFilter()->MakeSelector(g, s)) { + strcpy(g->Message, "Failed making selector"); + return true; + } else + s->Append('}'); + + tp->SetFilter(NULL); // Not needed anymore + } // endif To_Filter + + if (!all && tp->GetColumns()) { + // Project list + s->Append(",{\"$project\":{\""); + + if (!id) + s->Append("_id\":0,\""); + + for (cp = tp->GetColumns(); cp; cp = cp->GetNext()) { + if (b) + s->Append(",\""); + else + b = true; + + s->Append(cp->GetJpath(g, true)); + s->Append("\":1"); + } // endfor cp + + s->Append("}}"); + } // endif all + + s->Append("]}"); + s->Resize(s->GetLength() + 1); + *(char*)p = ']'; // Restore Colist for discovery + p = s->GetStr(); + + if (trace) + htrc("New Pipeline: %s\n", p); + + Query = bson_new_from_json((const uint8_t *)p, -1, &Error); + + if (!Query) { + sprintf(g->Message, "Wrong pipeline: %s", Error.message); + return true; + } // endif Query + + Cursor = mongoc_collection_aggregate(Collection, MONGOC_QUERY_NONE, + Query, NULL, NULL); + + if (mongoc_cursor_error(Cursor, &Error)) { + sprintf(g->Message, "Mongo aggregate Failure: %s", Error.message); + return true; + } // endif error + + } else { + if (Pcg->Filter || tp->GetFilter()) { + if (trace) { + if (Pcg->Filter) + htrc("Filter: %s\n", Pcg->Filter); + + if (tp->GetFilter()) { + char buf[512]; + + tp->GetFilter()->Prints(g, buf, 511); + htrc("To_Filter: %s\n", buf); + } // endif To_Filter + + } // endif trace + + s = new(g) STRING(g, 1023, (PSZ)Pcg->Filter); + + if (tp->GetFilter()) { + if (Pcg->Filter) + s->Append(','); + + if (tp->GetFilter()->MakeSelector(g, s)) { + strcpy(g->Message, "Failed making selector"); + return NULL; + } // endif Selector + + tp->SetFilter(NULL); // Not needed anymore + } // endif To_Filter + + if (trace) + htrc("selector: %s\n", s->GetStr()); + + s->Resize(s->GetLength() + 1); + Query = bson_new_from_json((const uint8_t *)s->GetStr(), -1, &Error); + + if (!Query) { + sprintf(g->Message, "Wrong filter: %s", Error.message); + return NULL; + } // endif Query + + } else + Query = bson_new(); + + if (!all) { + if (options && *options) { + if (trace) + htrc("options=%s\n", options); + + p = options; + } else if (tp->GetColumns()) { + // Projection list + if (s) + s->Set("{\"projection\":{\""); + else + s = new(g) STRING(g, 511, "{\"projection\":{\""); + + if (!id) + s->Append("_id\":0,\""); + + for (cp = tp->GetColumns(); cp; cp = cp->GetNext()) { + if (b) + s->Append(",\""); + else + b = true; + + s->Append(cp->GetJpath(g, true)); + s->Append("\":1"); + } // endfor cp + + s->Append("}}"); + s->Resize(s->GetLength() + 1); + p = s->GetStr(); + } else { + // count(*) ? + p = "{\"projection\":{\"_id\":1}}"; + } // endif Options + + Opts = bson_new_from_json((const uint8_t *)p, -1, &Error); + + if (!Opts) { + sprintf(g->Message, "Wrong options: %s", Error.message); + return NULL; + } // endif Opts + + } // endif all + + Cursor = mongoc_collection_find_with_opts(Collection, Query, Opts, NULL); + } // endif Pipe + + return false; +} // end of MakeCursor + +/***********************************************************************/ +/* Fetch next document. */ +/***********************************************************************/ +int CMgoConn::ReadNext(PGLOBAL g) +{ + int rc = RC_OK; + + if (!Cursor && MakeCursor(g)) { + rc = RC_FX; + } else if (mongoc_cursor_next(Cursor, &Document)) { + if (trace > 1) { + bson_iter_t iter; + ShowDocument(&iter, Document, ""); + } else if (trace == 1) + htrc("%s\n", GetDocument(g)); + + } else if (mongoc_cursor_error(Cursor, &Error)) { + sprintf(g->Message, "Mongo Cursor Failure: %s", Error.message); + rc = RC_FX; + } else + rc = RC_EF; + + return rc; +} // end of Fetch + +/***********************************************************************/ +/* Get the Json string of the current document. */ +/***********************************************************************/ +PSZ CMgoConn::GetDocument(PGLOBAL g) +{ + char *str = bson_as_json(Document, NULL); + PSZ doc = PlugDup(g, str); + + bson_free(str); + return doc; +} // end of GetDocument + +/***********************************************************************/ +/* Use to trace restaurants document contains. */ +/***********************************************************************/ +void CMgoConn::ShowDocument(bson_iter_t *iter, const bson_t *doc, const char *k) +{ + if (!doc || bson_iter_init(iter, doc)) { + const char *key; + + while (bson_iter_next(iter)) { + key = bson_iter_key(iter); + htrc("Found element key: \"%s\"\n", key); + + if (BSON_ITER_HOLDS_UTF8(iter)) + htrc("%s.%s=\"%s\"\n", k, key, bson_iter_utf8(iter, NULL)); + else if (BSON_ITER_HOLDS_INT32(iter)) + htrc("%s.%s=%d\n", k, key, bson_iter_int32(iter)); + else if (BSON_ITER_HOLDS_INT64(iter)) + htrc("%s.%s=%lld\n", k, key, bson_iter_int64(iter)); + else if (BSON_ITER_HOLDS_DOUBLE(iter)) + htrc("%s.%s=%g\n", k, key, bson_iter_double(iter)); + else if (BSON_ITER_HOLDS_DATE_TIME(iter)) + htrc("%s.%s=date(%lld)\n", k, key, bson_iter_date_time(iter)); + else if (BSON_ITER_HOLDS_OID(iter)) { + char str[25]; + + bson_oid_to_string(bson_iter_oid(iter), str); + htrc("%s.%s=%s\n", k, key, str); + } else if (BSON_ITER_HOLDS_DECIMAL128(iter)) { + char *str = NULL; + bson_decimal128_t dec; + + bson_iter_decimal128(iter, &dec); + bson_decimal128_to_string(&dec, str); + htrc("%s.%s=%s\n", k, key, str); + } else if (BSON_ITER_HOLDS_DOCUMENT(iter)) { + bson_iter_t child; + + if (bson_iter_recurse(iter, &child)) + ShowDocument(&child, NULL, key); + + } else if (BSON_ITER_HOLDS_ARRAY(iter)) { + bson_t *arr; + bson_iter_t itar; + const uint8_t *data = NULL; + uint32_t len = 0; + + bson_iter_array(iter, &len, &data); + arr = bson_new_from_data(data, len); + ShowDocument(&itar, arr, key); + } // endif's + + } // endwhile bson_iter_next + + } // endif bson_iter_init + +} // end of ShowDocument + +/***********************************************************************/ +/* Group columns for inserting or updating. */ +/***********************************************************************/ +void CMgoConn::MakeColumnGroups(PGLOBAL g) +{ + Fpc = new(g) INCOL(false); + + for (PCOL colp = Pcg->Tdbp->GetColumns(); colp; colp = colp->GetNext()) + if (!colp->IsSpecial()) + Fpc->AddCol(g, colp, colp->GetJpath(g, false)); + +} // end of MakeColumnGroups + +/***********************************************************************/ +/* DocWrite. */ +/***********************************************************************/ +bool CMgoConn::DocWrite(PGLOBAL g, PINCOL icp) +{ + for (PKC kp = icp->Klist; kp; kp = kp->Next) + if (kp->Incolp) { + bool isdoc = !kp->Incolp->Array; + + if (isdoc) + BSON_APPEND_DOCUMENT_BEGIN(icp->Child, kp->Key, kp->Incolp->Child); + else + BSON_APPEND_ARRAY_BEGIN(icp->Child, kp->Key, kp->Incolp->Child); + + if (DocWrite(g, kp->Incolp)) + return true; + + if (isdoc) + bson_append_document_end(icp->Child, kp->Incolp->Child); + else + bson_append_array_end(icp->Child, kp->Incolp->Child); + + } else if (AddValue(g, kp->Colp, icp->Child, kp->Key, false)) + return true; + + return false; +} // end of DocWrite + +/***********************************************************************/ +/* WriteDB: Data Base write routine for DOS access method. */ +/***********************************************************************/ +int CMgoConn::Write(PGLOBAL g) +{ + int rc = RC_OK; + PTDB tp = Pcg->Tdbp; + + if (tp->GetMode() == MODE_INSERT) { + Fpc->Init(); + + if (DocWrite(g, Fpc)) + return RC_FX; + + if (trace) { + char *str = bson_as_json(Fpc->Child, NULL); + htrc("Inserting: %s\n", str); + bson_free(str); + } // endif trace + + if (!mongoc_collection_insert(Collection, MONGOC_INSERT_NONE, + Fpc->Child, NULL, &Error)) { + sprintf(g->Message, "Mongo insert: %s", Error.message); + rc = RC_FX; + } // endif insert + + } else { + bool b = false; + bson_iter_t iter; + bson_t *query = bson_new(); + + bson_iter_init(&iter, Document); + + if (bson_iter_find(&iter, "_id")) { + if (BSON_ITER_HOLDS_OID(&iter)) + b = BSON_APPEND_OID(query, "_id", bson_iter_oid(&iter)); + else if (BSON_ITER_HOLDS_INT32(&iter)) + b = BSON_APPEND_INT32(query, "_id", bson_iter_int32(&iter)); + else if (BSON_ITER_HOLDS_INT64(&iter)) + b = BSON_APPEND_INT64(query, "_id", bson_iter_int64(&iter)); + else if (BSON_ITER_HOLDS_DOUBLE(&iter)) + b = BSON_APPEND_DOUBLE(query, "_id", bson_iter_double(&iter)); + else if (BSON_ITER_HOLDS_UTF8(&iter)) + b = BSON_APPEND_UTF8(query, "_id", bson_iter_utf8(&iter, NULL)); + + } // endif iter + + if (b) { + if (trace) { + char *str = bson_as_json(query, NULL); + htrc("update query: %s\n", str); + bson_free(str); + } // endif trace + + if (tp->GetMode() == MODE_UPDATE) { + bson_t child; + bson_t *update = bson_new(); + + BSON_APPEND_DOCUMENT_BEGIN(update, "$set", &child); + + for (PCOL colp = tp->GetSetCols(); colp; colp = colp->GetNext()) + if (AddValue(g, colp, &child, colp->GetJpath(g, false), true)) + rc = RC_FX; + + bson_append_document_end(update, &child); + + if (rc == RC_OK) + if (!mongoc_collection_update(Collection, MONGOC_UPDATE_NONE, + query, update, NULL, &Error)) { + sprintf(g->Message, "Mongo update: %s", Error.message); + rc = RC_FX; + } // endif update + + bson_destroy(update); + } else if (!mongoc_collection_remove(Collection, + MONGOC_REMOVE_SINGLE_REMOVE, query, NULL, &Error)) { + sprintf(g->Message, "Mongo delete: %s", Error.message); + rc = RC_FX; + } // endif remove + + } else { + strcpy(g->Message, "Mongo update: cannot find _id"); + rc = RC_FX; + } // endif b + + bson_destroy(query); + } // endif Mode + + return rc; +} // end of Write + +/***********************************************************************/ +/* Remove all documents from the collection. */ +/***********************************************************************/ +bool CMgoConn::DocDelete(PGLOBAL g) +{ + Query = bson_new(); + + if (!mongoc_collection_remove(Collection, MONGOC_REMOVE_NONE, + Query, NULL, &Error)) { + sprintf(g->Message, "Mongo remove all: %s", Error.message); + return true; + } // endif remove + + return false; +} // end of DocDelete + +/***********************************************************************/ +/* Rewind the collection. */ +/***********************************************************************/ +void CMgoConn::Rewind(void) +{ + mongoc_cursor_t *cursor = mongoc_cursor_clone(Cursor); + + mongoc_cursor_destroy(Cursor); + Cursor = cursor; +} // end of Rewind + +/***********************************************************************/ +/* Table close routine for MONGO tables. */ +/***********************************************************************/ +void CMgoConn::Close(void) +{ + if (Query) bson_destroy(Query); + if (Opts) bson_destroy(Opts); + if (Cursor) mongoc_cursor_destroy(Cursor); + if (Collection) mongoc_collection_destroy(Collection); + if (Client) mongoc_client_pool_push(Pool, Client); + if (Pool) mongoc_client_pool_destroy(Pool); + if (Uri) mongoc_uri_destroy(Uri); + if (Fpc) Fpc->Destroy(); + if (fp) fp->Count = 0; +} // end of Close + +/***********************************************************************/ +/* Mini: used to suppress blanks to json strings. */ +/***********************************************************************/ +char *CMgoConn::Mini(PGLOBAL g, PCOL colp, const bson_t *bson, bool b) +{ + char *s, *str = NULL; + char *Mbuf = (char*)PlugSubAlloc(g, NULL, colp->GetLength() + 1); + int i, k = 0; + bool ok = true; + + if (b) + s = str = bson_array_as_json(bson, NULL); + else + s = str = bson_as_json(bson, NULL); + + for (i = 0; i < colp->GetLength() && s[i]; i++) { + switch (s[i]) { + case ' ': + if (ok) continue; + case '"': + ok = !ok; + default: + break; + } // endswitch s[i] + + Mbuf[k++] = s[i]; + } // endfor i + + bson_free(str); + + if (i >= colp->GetLength()) { + sprintf(g->Message, "Value too long for column %s", colp->GetName()); + throw (int)TYPE_AM_MGO; + } // endif i + + Mbuf[k] = 0; + return Mbuf; +} // end of Mini + +/***********************************************************************/ +/* Retrieve the column value from the document. */ +/***********************************************************************/ +void CMgoConn::GetColumnValue(PGLOBAL g, PCOL colp) +{ + char *jpath = colp->GetJpath(g, false); + PVAL value = colp->GetValue(); + + if (!strcmp(jpath, "*")) { + value->SetValue_psz(Mini(g, colp, Document, false)); + } else if (bson_iter_init(&Iter, Document) && + bson_iter_find_descendant(&Iter, jpath, &Desc)) { + if (BSON_ITER_HOLDS_UTF8(&Desc)) + value->SetValue_psz((PSZ)bson_iter_utf8(&Desc, NULL)); + else if (BSON_ITER_HOLDS_INT32(&Desc)) + value->SetValue(bson_iter_int32(&Desc)); + else if (BSON_ITER_HOLDS_INT64(&Desc)) + value->SetValue(bson_iter_int64(&Desc)); + else if (BSON_ITER_HOLDS_DOUBLE(&Desc)) + value->SetValue(bson_iter_double(&Desc)); + else if (BSON_ITER_HOLDS_DATE_TIME(&Desc)) + value->SetValue(bson_iter_date_time(&Desc) / 1000); + else if (BSON_ITER_HOLDS_BOOL(&Desc)) { + bool b = bson_iter_bool(&Desc); + + if (value->IsTypeNum()) + value->SetValue(b ? 1 : 0); + else + value->SetValue_psz(b ? "true" : "false"); + + } else if (BSON_ITER_HOLDS_OID(&Desc)) { + char str[25]; + + bson_oid_to_string(bson_iter_oid(&Desc), str); + value->SetValue_psz(str); + } else if (BSON_ITER_HOLDS_NULL(&Iter)) { + // Apparently this does not work... + value->Reset(); + value->SetNull(true); + } else if (BSON_ITER_HOLDS_DECIMAL128(&Desc)) { + char *str = NULL; + bson_decimal128_t dec; + + bson_iter_decimal128(&Desc, &dec); + bson_decimal128_to_string(&dec, str); + value->SetValue_psz(str); + bson_free(str); + } else if (BSON_ITER_HOLDS_DOCUMENT(&Iter)) { + bson_t *doc; + const uint8_t *data = NULL; + uint32_t len = 0; + + bson_iter_document(&Desc, &len, &data); + + if (data) { + doc = bson_new_from_data(data, len); + value->SetValue_psz(Mini(g, colp, doc, false)); + bson_destroy(doc); + } else { + // ... but we can come here in case of NULL! + value->Reset(); + value->SetNull(true); + } // endif data + + } else if (BSON_ITER_HOLDS_ARRAY(&Iter)) { + bson_t *arr; + const uint8_t *data = NULL; + uint32_t len = 0; + + bson_iter_array(&Desc, &len, &data); + + if (data) { + arr = bson_new_from_data(data, len); + value->SetValue_psz(Mini(g, colp, arr, true)); + bson_destroy(arr); + } else { + // This is a bug in returning the wrong type + // This fix is only for document items + bson_t *doc; + + bson_iter_document(&Desc, &len, &data); + + if (data) { + doc = bson_new_from_data(data, len); + value->SetValue_psz(Mini(g, colp, doc, false)); + bson_destroy(doc); + } else { + // ... or we can also come here in case of NULL! + value->Reset(); + value->SetNull(true); + } // endif data + + } // endif data + + } else + value->Reset(); + + } else { + // Field does not exist + value->Reset(); + value->SetNull(true); + } // endif Iter + +} // end of GetColumnValue + +/***********************************************************************/ +/* AddValue: Add column value to the document to insert or update. */ +/***********************************************************************/ +bool CMgoConn::AddValue(PGLOBAL g, PCOL colp, bson_t *doc, char *key, bool upd) +{ + bool rc = false; + PVAL value = colp->GetValue(); + + if (value->IsNull()) { + if (upd) + rc = BSON_APPEND_NULL(doc, key); + else + return false; + + } else switch (colp->GetResultType()) { + case TYPE_STRING: + rc = BSON_APPEND_UTF8(doc, key, value->GetCharValue()); + break; + case TYPE_INT: + case TYPE_SHORT: + rc = BSON_APPEND_INT32(doc, key, value->GetIntValue()); + break; + case TYPE_TINY: + rc = BSON_APPEND_BOOL(doc, key, value->GetIntValue()); + break; + case TYPE_BIGINT: + rc = BSON_APPEND_INT64(doc, key, value->GetBigintValue()); + break; + case TYPE_DOUBLE: + rc = BSON_APPEND_DOUBLE(doc, key, value->GetFloatValue()); + break; + case TYPE_DECIM: + {bson_decimal128_t dec; + + if (bson_decimal128_from_string(value->GetCharValue(), &dec)) + rc = BSON_APPEND_DECIMAL128(doc, key, &dec); + + } break; + case TYPE_DATE: + rc = BSON_APPEND_DATE_TIME(doc, key, value->GetBigintValue() * 1000); + break; + default: + sprintf(g->Message, "Type %d not supported yet", colp->GetResultType()); + return true; + } // endswitch Buf_Type + + if (!rc) { + strcpy(g->Message, "Adding value failed"); + return true; + } else + return false; + +} // end of AddValue + +#if 0 +void *CMgoConn::mgo_alloc(size_t n) +{ + char *mst = (char*)PlgDBSubAlloc(G, NULL, n + sizeof(size_t)); + + if (mst) { + *(size_t*)mst = n; + return mst + sizeof(size_t); + } // endif mst + + return NULL; +} // end of mgo_alloc + +void *CMgoConn::mgo_calloc(size_t n, size_t sz) +{ + void *m = mgo_alloc(n * sz); + + if (m) + memset(m, 0, n * sz); + + return m; +} // end of mgo_calloc + +void *CMgoConn::mgo_realloc(void *m, size_t n) +{ + if (!m) + return n ? mgo_alloc(n) : NULL; + + size_t *osz = (size_t*)((char*)m - sizeof(size_t)); + + if (n > *osz) { + void *nwm = mgo_alloc(n); + + if (nwm) + memcpy(nwm, m, *osz); + + return nwm; + } else { + *osz = n; + return m; + } // endif n + +} // end of mgo_realloc +#endif // 0 + diff --git a/storage/connect/cmgoconn.h b/storage/connect/cmgoconn.h new file mode 100644 index 00000000000..f5cefea3442 --- /dev/null +++ b/storage/connect/cmgoconn.h @@ -0,0 +1,115 @@ +/***********************************************************************/ +/* CMgoConn.h : header file for the MongoDB connection classes. */ +/***********************************************************************/ + +/***********************************************************************/ +/* Include MongoDB library header files. */ +/***********************************************************************/ +#include +#include +#include + +// C connection to a MongoDB data source +class TDBCMG; +class MGOCOL; + +/***********************************************************************/ +/* Include MongoDB library header files. */ +/***********************************************************************/ +typedef class INCOL *PINCOL; +typedef class MGODEF *PMGODEF; +typedef class TDBCMG *PTDBCMG; +typedef class MGOCOL *PMGOCOL; + +typedef struct mongo_parms { + PTDB Tdbp; + PCSZ Uristr; // Driver URI + PCSZ Db_name; + PCSZ Coll_name; + PCSZ Options; + PCSZ Filter; + bool Pipe; +//PCSZ User; // User connect info +//PCSZ Pwd; // Password connect info +//int Fsize; // Fetch size +//bool Scrollable; // Scrollable cursor +} CMGOPARM, *PCPARM; + +typedef struct KEYCOL { + KEYCOL *Next; + PINCOL Incolp; + PCOL Colp; + char *Key; +} *PKC; + +/***********************************************************************/ +/* Used when inserting values in a MongoDB collection. */ +/***********************************************************************/ +class INCOL : public BLOCK { +public: + // Constructor + INCOL(bool ar) { Child = bson_new(); Klist = NULL; Array = ar; } + + // Methods + void AddCol(PGLOBAL g, PCOL colp, char *jp); + void Init(void); + void Destroy(void); + + //Members + bson_t *Child; + PKC Klist; + bool Array; +}; // end of INCOL; + +/***********************************************************************/ +/* CMgoConn class. */ +/***********************************************************************/ +class CMgoConn : public BLOCK { + friend class TDBCMG; + friend class CMGDISC; +public: + // Constructor + CMgoConn(PGLOBAL g, PCPARM pcg); + + //static void *mgo_alloc(size_t n); + //static void *mgo_calloc(size_t n, size_t sz); + //static void *mgo_realloc(void *m, size_t n); + //static void mgo_free(void *) {} + + // Implementation + bool IsConnected(void) { return m_Connected; } + bool Connect(PGLOBAL g); + int CollSize(PGLOBAL g); + bool MakeCursor(PGLOBAL g); + int ReadNext(PGLOBAL g); + PSZ GetDocument(PGLOBAL g); + void ShowDocument(bson_iter_t *iter, const bson_t *doc, const char *k); + void MakeColumnGroups(PGLOBAL g); + bool DocWrite(PGLOBAL g, PINCOL icp); + int Write(PGLOBAL g); + bool DocDelete(PGLOBAL g); + void Rewind(void); + void Close(void); + PSZ Mini(PGLOBAL g, PCOL colp, const bson_t *bson, bool b); + void GetColumnValue(PGLOBAL g, PCOL colp); + bool AddValue(PGLOBAL g, PCOL colp, bson_t *doc, char *key, bool upd); + +protected: + // Members + PCPARM Pcg; + mongoc_uri_t *Uri; + mongoc_client_pool_t *Pool; // Thread safe client pool + mongoc_client_t *Client; // The MongoDB client + mongoc_database_t *Database; // The MongoDB database + mongoc_collection_t *Collection; // The MongoDB collection + mongoc_cursor_t *Cursor; + const bson_t *Document; + bson_t *Query; // MongoDB cursor filter + bson_t *Opts; // MongoDB cursor options + bson_error_t Error; + bson_iter_t Iter; // Used to retrieve column value + bson_iter_t Desc; // Descendant iter + PINCOL Fpc; // To insert INCOL classes + PFBLOCK fp; + bool m_Connected; +}; // end of class CMgoConn diff --git a/storage/connect/colblk.cpp b/storage/connect/colblk.cpp index 58841387249..5cd6a4f2be4 100644 --- a/storage/connect/colblk.cpp +++ b/storage/connect/colblk.cpp @@ -195,10 +195,10 @@ int COLBLK::GetLengthEx(void) /* corresponding to this column and convert it to buffer type. */ /***********************************************************************/ void COLBLK::ReadColumn(PGLOBAL g) - { +{ sprintf(g->Message, MSG(UNDEFINED_AM), "ReadColumn"); - longjmp(g->jumper[g->jump_level], TYPE_COLBLK); - } // end of ReadColumn + throw (int)TYPE_COLBLK; +} // end of ReadColumn /***********************************************************************/ /* WriteColumn: what this routine does is to access the last line */ @@ -206,15 +206,15 @@ void COLBLK::ReadColumn(PGLOBAL g) /* corresponding to this column from the column buffer and type. */ /***********************************************************************/ void COLBLK::WriteColumn(PGLOBAL g) - { +{ sprintf(g->Message, MSG(UNDEFINED_AM), "WriteColumn"); - longjmp(g->jumper[g->jump_level], TYPE_COLBLK); - } // end of WriteColumn + throw (int)TYPE_COLBLK; +} // end of WriteColumn /***********************************************************************/ /* Make file output of a column descriptor block. */ /***********************************************************************/ -void COLBLK::Print(PGLOBAL, FILE *f, uint n) +void COLBLK::Printf(PGLOBAL, FILE *f, uint n) { char m[64]; int i; @@ -232,15 +232,15 @@ void COLBLK::Print(PGLOBAL, FILE *f, uint n) fprintf(f, " coluse=%04X status=%04X buftyp=%d value=%p name=%s\n", ColUse, Status, Buf_Type, Value, Name); - } // end of Print + } // end of Printf /***********************************************************************/ /* Make string output of a column descriptor block. */ /***********************************************************************/ -void COLBLK::Print(PGLOBAL, char *ps, uint) +void COLBLK::Prints(PGLOBAL, char *ps, uint) { sprintf(ps, "R%d.%s", To_Tdb->GetTdb_No(), Name); - } // end of Print + } // end of Prints /***********************************************************************/ @@ -260,10 +260,10 @@ SPCBLK::SPCBLK(PCOLUMN cp) /* corresponding to this column from the column buffer and type. */ /***********************************************************************/ void SPCBLK::WriteColumn(PGLOBAL g) - { +{ sprintf(g->Message, MSG(SPCOL_READONLY), Name); - longjmp(g->jumper[g->jump_level], TYPE_COLBLK); - } // end of WriteColumn + throw (int)TYPE_COLBLK; +} // end of WriteColumn /***********************************************************************/ /* RIDBLK constructor for the ROWID special column. */ @@ -377,7 +377,7 @@ PRTBLK::PRTBLK(PCOLUMN cp) : SPCBLK(cp) void PRTBLK::ReadColumn(PGLOBAL g) { if (Pname == NULL) { - char *p; + const char *p; Pname = To_Tdb->GetDef()->GetStringCatInfo(g, "partname", "?"); p = strrchr(Pname, '#'); @@ -407,9 +407,8 @@ SIDBLK::SIDBLK(PCOLUMN cp) : SPCBLK(cp) void SIDBLK::ReadColumn(PGLOBAL) { //if (Sname == NULL) { - Sname = (char*)To_Tdb->GetServer(); + Sname = To_Tdb->GetServer(); Value->SetValue_psz(Sname); // } // endif Sname } // end of ReadColumn - diff --git a/storage/connect/colblk.h b/storage/connect/colblk.h index c64f9d95129..b22933d9ebb 100644 --- a/storage/connect/colblk.h +++ b/storage/connect/colblk.h @@ -38,7 +38,8 @@ class DllExport COLBLK : public XOBJECT { virtual PTDB GetTo_Tdb(void) {return To_Tdb;} virtual int GetClustered(void) {return 0;} virtual int IsClustered(void) {return FALSE;} - PCOL GetNext(void) {return Next;} + virtual PSZ GetJpath(PGLOBAL g, bool proj) {return NULL;} + PCOL GetNext(void) {return Next;} PSZ GetName(void) {return Name;} int GetIndex(void) {return Index;} ushort GetColUse(void) {return ColUse;} @@ -72,8 +73,8 @@ class DllExport COLBLK : public XOBJECT { virtual void SetTo_Val(PVAL) {} virtual void ReadColumn(PGLOBAL g); virtual void WriteColumn(PGLOBAL g); - virtual void Print(PGLOBAL g, FILE *, uint); - virtual void Print(PGLOBAL g, char *, uint); + virtual void Printf(PGLOBAL g, FILE *, uint); + virtual void Prints(PGLOBAL g, char *, uint); virtual bool VarSize(void) {return false;} bool InitValue(PGLOBAL g); @@ -154,7 +155,7 @@ class DllExport FIDBLK : public SPCBLK { virtual void ReadColumn(PGLOBAL g); protected: - PSZ Fn; // The current To_File of the table + PCSZ Fn; // The current To_File of the table OPVAL Op; // The file part operator }; // end of class FIDBLK @@ -178,7 +179,7 @@ class DllExport TIDBLK : public SPCBLK { TIDBLK(void) {} // Members - PSZ Tname; // The current table name + PCSZ Tname; // The current table name }; // end of class TIDBLK /***********************************************************************/ @@ -201,7 +202,7 @@ class DllExport PRTBLK : public SPCBLK { PRTBLK(void) {} // Members - PSZ Pname; // The current partition name + PCSZ Pname; // The current partition name }; // end of class PRTBLK /***********************************************************************/ @@ -224,7 +225,7 @@ class DllExport SIDBLK : public SPCBLK { SIDBLK(void) {} // Members - PSZ Sname; // The current server name + PCSZ Sname; // The current server name }; // end of class SIDBLK #endif // __COLBLK__H diff --git a/storage/connect/connect.cc b/storage/connect/connect.cc index 098119e7be1..5e80201fccf 100644 --- a/storage/connect/connect.cc +++ b/storage/connect/connect.cc @@ -1,4 +1,5 @@ -/* Copyright (C) Olivier Bertrand 2004 - 2015 +/* Copyright (C) Olivier Bertrand 2004 - 2017 + Copyright (C) MariaDB Corporation Ab This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -15,10 +16,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ /***********************************************************************/ -/* Author Olivier BERTRAND bertrandop@gmail.com 2004-2015 */ +/* Author Olivier BERTRAND bertrandop@gmail.com 2004-2017 */ /* */ -/* WHAT THIS PROGRAM DOES: */ -/* ----------------------- */ +/* WHAT THIS PROGRAM DOES: */ +/* ----------------------- */ /* This program are the CONNECT general purpose semantic routines. */ /***********************************************************************/ #ifdef USE_PRAGMA_IMPLEMENTATION @@ -66,8 +67,10 @@ PGLOBAL CntExit(PGLOBAL g) if (g) { CntEndDB(g); - if (g->Activityp) - delete g->Activityp; + if (g->Activityp) { + delete g->Activityp; + g->Activityp = NULL; + } // endif Activityp PlugExit(g); g= NULL; @@ -80,7 +83,7 @@ PGLOBAL CntExit(PGLOBAL g) /* CntEndDB: DB termination semantic routine. */ /***********************************************************************/ void CntEndDB(PGLOBAL g) - { +{ PDBUSER dbuserp= PlgGetUser(g); if (dbuserp) { @@ -88,9 +91,14 @@ void CntEndDB(PGLOBAL g) delete dbuserp->Catalog; free(dbuserp); - } // endif dbuserp - } // end of CntEndDB + if (trace) + htrc("CntEndDB: Freeing Dup\n"); + + g->Activityp->Aptr = NULL; + } // endif dbuserp + +} // end of CntEndDB /***********************************************************************/ /* CntCheckDB: Initialize a DB application session. */ @@ -117,11 +125,10 @@ bool CntCheckDB(PGLOBAL g, PHC handler, const char *pathname) handler); // Set the database path for this table - handler->SetDataPath(g, pathname); + if (handler->SetDataPath(g, pathname)) + return true; if (dbuserp->Catalog) { -// ((MYCAT *)dbuserp->Catalog)->SetHandler(handler); done later -// ((MYCAT *)dbuserp->Catalog)->SetDataPath(g, pathname); return false; // Nothing else to do } // endif Catalog @@ -138,9 +145,6 @@ bool CntCheckDB(PGLOBAL g, PHC handler, const char *pathname) if (!(dbuserp->Catalog= new MYCAT(handler))) return true; -//((MYCAT *)dbuserp->Catalog)->SetDataPath(g, pathname); -//dbuserp->UseTemp= TMP_AUTO; - /*********************************************************************/ /* All is correct. */ /*********************************************************************/ @@ -172,7 +176,7 @@ bool CntInfo(PGLOBAL g, PTDB tp, PXF info) // info->mean_rec_length= tdbp->GetLrecl(); info->mean_rec_length= 0; - info->data_file_name= (b) ? NULL : tdbp->GetFile(g); + info->data_file_name= (b) ? NULL : (char*)tdbp->GetFile(g); return true; } else { info->data_file_length= 0; @@ -188,49 +192,43 @@ bool CntInfo(PGLOBAL g, PTDB tp, PXF info) /* GetTDB: Get the table description block of a CONNECT table. */ /***********************************************************************/ PTDB CntGetTDB(PGLOBAL g, LPCSTR name, MODE mode, PHC h) - { - int rc; - PTDB tdbp; - PTABLE tabp; - PDBUSER dup= PlgGetUser(g); - volatile PCATLG cat= (dup) ? dup->Catalog : NULL; // Safe over longjmp +{ + PTDB tdbp = NULL; + PTABLE tabp; + PDBUSER dup = PlgGetUser(g); + volatile PCATLG cat = (dup) ? dup->Catalog : NULL; // Safe over throw - if (trace) - printf("CntGetTDB: name=%s mode=%d cat=%p\n", name, mode, cat); + if (trace) + printf("CntGetTDB: name=%s mode=%d cat=%p\n", name, mode, cat); - if (!cat) - return NULL; + if (!cat) + return NULL; - // Save stack and allocation environment and prepare error return - if (g->jump_level == MAX_JUMP) { - strcpy(g->Message, MSG(TOO_MANY_JUMPS)); - return NULL; - } // endif jump_level + try { + // Get table object from the catalog + tabp = new(g) XTAB(name); - if ((rc= setjmp(g->jumper[++g->jump_level])) != 0) { - tdbp= NULL; - goto err; - } // endif rc + if (trace) + printf("CntGetTDB: tabp=%p\n", tabp); - // Get table object from the catalog - tabp= new(g) XTAB(name); + // Perhaps this should be made thread safe + ((MYCAT*)cat)->SetHandler(h); - if (trace) - printf("CntGetTDB: tabp=%p\n", tabp); + if (!(tdbp = cat->GetTable(g, tabp, mode))) + printf("CntGetTDB: %s\n", g->Message); - // Perhaps this should be made thread safe - ((MYCAT*)cat)->SetHandler(h); + } catch (int n) { + if (trace) + htrc("Exception %d: %s\n", n, g->Message); + } catch (const char *msg) { + strcpy(g->Message, msg); + } // end catch - if (!(tdbp= cat->GetTable(g, tabp, mode))) - printf("CntGetTDB: %s\n", g->Message); - - err: if (trace) printf("Returning tdbp=%p mode=%d\n", tdbp, mode); - g->jump_level--; return tdbp; - } // end of CntGetTDB +} // end of CntGetTDB /***********************************************************************/ /* OPENTAB: Open a Table. */ @@ -239,7 +237,7 @@ bool CntOpenTable(PGLOBAL g, PTDB tdbp, MODE mode, char *c1, char *c2, bool del, PHC) { char *p; - int i, n, rc; + int i, n; bool rcop= true; PCOL colp; //PCOLUMN cp; @@ -254,120 +252,116 @@ bool CntOpenTable(PGLOBAL g, PTDB tdbp, MODE mode, char *c1, char *c2, return true; } // endif tdbp - // Save stack and allocation environment and prepare error return - if (g->jump_level == MAX_JUMP) { - strcpy(g->Message, MSG(TOO_MANY_JUMPS)); - return true; - } // endif jump_level + try { + if (!c1) { + if (mode == MODE_INSERT) + // Allocate all column blocks for that table + tdbp->ColDB(g, NULL, 0); - if ((rc= setjmp(g->jumper[++g->jump_level])) != 0) { - goto err; - } // endif rc + } else for (p = c1; *p; p += n) { + // Allocate only used column blocks + if (trace) + printf("Allocating column %s\n", p); - if (!c1) { - if (mode == MODE_INSERT) - // Allocate all column blocks for that table - tdbp->ColDB(g, NULL, 0); + g->Message[0] = 0; // To check whether ColDB made an error message + colp = tdbp->ColDB(g, p, 0); - } else for (p= c1; *p; p+= n) { - // Allocate only used column blocks - if (trace) - printf("Allocating column %s\n", p); + if (!colp && !(mode == MODE_INSERT && tdbp->IsSpecial(p))) { + if (g->Message[0] == 0) + sprintf(g->Message, MSG(COL_ISNOT_TABLE), p, tdbp->GetName()); - g->Message[0] = 0; // To check whether ColDB made an error message - colp= tdbp->ColDB(g, p, 0); + throw 1; + } // endif colp - if (!colp && !(mode == MODE_INSERT && tdbp->IsSpecial(p))) { - if (g->Message[0] == 0) - sprintf(g->Message, MSG(COL_ISNOT_TABLE), p, tdbp->GetName()); + n = strlen(p) + 1; + } // endfor p - goto err; - } // endif colp + for (i = 0, colp = tdbp->GetColumns(); colp; i++, colp = colp->GetNext()) { + if (colp->InitValue(g)) + throw 2; - n= strlen(p) + 1; - } // endfor p + if (mode == MODE_INSERT) + // Allow type conversion + if (colp->SetBuffer(g, colp->GetValue(), true, false)) + throw 3; - for (i= 0, colp= tdbp->GetColumns(); colp; i++, colp= colp->GetNext()) { - if (colp->InitValue(g)) - goto err; + colp->AddColUse(U_P); // For PLG tables + } // endfor colp - if (mode == MODE_INSERT) - // Allow type conversion - if (colp->SetBuffer(g, colp->GetValue(), true, false)) - goto err; + /*******************************************************************/ + /* In Update mode, the updated column blocks must be distinct from */ + /* the read column blocks. So make a copy of the TDB and allocate */ + /* its column blocks in mode write (required by XML tables). */ + /*******************************************************************/ + if (mode == MODE_UPDATE) { + PTDBASE utp; - colp->AddColUse(U_P); // For PLG tables - } // endfor colp + if (!(utp = (PTDBASE)tdbp->Duplicate(g))) { + sprintf(g->Message, MSG(INV_UPDT_TABLE), tdbp->GetName()); + throw 4; + } // endif tp - /*********************************************************************/ - /* In Update mode, the updated column blocks must be distinct from */ - /* the read column blocks. So make a copy of the TDB and allocate */ - /* its column blocks in mode write (required by XML tables). */ - /*********************************************************************/ - if (mode == MODE_UPDATE) { - PTDBASE utp; + if (!c2) + // Allocate all column blocks for that table + utp->ColDB(g, NULL, 0); + else for (p = c2; *p; p += n) { + // Allocate only used column blocks + colp = utp->ColDB(g, p, 0); + n = strlen(p) + 1; + } // endfor p - if (!(utp= (PTDBASE)tdbp->Duplicate(g))) { - sprintf(g->Message, MSG(INV_UPDT_TABLE), tdbp->GetName()); - goto err; - } // endif tp + for (i = 0, colp = utp->GetColumns(); colp; i++, colp = colp->GetNext()) { + if (colp->InitValue(g)) + throw 5; - if (!c2) - // Allocate all column blocks for that table - utp->ColDB(g, NULL, 0); - else for (p= c2; *p; p+= n) { - // Allocate only used column blocks - colp= utp->ColDB(g, p, 0); - n= strlen(p) + 1; - } // endfor p + if (colp->SetBuffer(g, colp->GetValue(), true, false)) + throw 6; - for (i= 0, colp= utp->GetColumns(); colp; i++, colp= colp->GetNext()) { - if (colp->InitValue(g)) - goto err; + } // endfor colp - if (colp->SetBuffer(g, colp->GetValue(), true, false)) - goto err; + // Attach the updated columns list to the main table + tdbp->SetSetCols(utp->GetColumns()); + } else if (tdbp && mode == MODE_INSERT) + tdbp->SetSetCols(tdbp->GetColumns()); - } // endfor colp + // Now do open the physical table + if (trace) + printf("Opening table %s in mode %d tdbp=%p\n", + tdbp->GetName(), mode, tdbp); - // Attach the updated columns list to the main table - tdbp->SetSetCols(utp->GetColumns()); - } else if (tdbp && mode == MODE_INSERT) - tdbp->SetSetCols(tdbp->GetColumns()); + //tdbp->SetMode(mode); - // Now do open the physical table - if (trace) - printf("Opening table %s in mode %d tdbp=%p\n", - tdbp->GetName(), mode, tdbp); - -//tdbp->SetMode(mode); - - if (del/* && (tdbp->GetFtype() != RECFM_NAF*/) { - // To avoid erasing the table when doing a partial delete - // make a fake Next + if (del/* && (tdbp->GetFtype() != RECFM_NAF*/) { + // To avoid erasing the table when doing a partial delete + // make a fake Next // PDOSDEF ddp= new(g) DOSDEF; // PTDB tp= new(g) TDBDOS(ddp, NULL); - tdbp->SetNext((PTDB)1); - dup->Check &= ~CHK_DELETE; - } // endif del + tdbp->SetNext((PTDB)1); + dup->Check &= ~CHK_DELETE; + } // endif del - if (trace) - printf("About to open the table: tdbp=%p\n", tdbp); + if (trace) + printf("About to open the table: tdbp=%p\n", tdbp); - if (mode != MODE_ANY && mode != MODE_ALTER) { - if (tdbp->OpenDB(g)) { - printf("%s\n", g->Message); - goto err; - } else - tdbp->SetNext(NULL); + if (mode != MODE_ANY && mode != MODE_ALTER) { + if (tdbp->OpenDB(g)) { + printf("%s\n", g->Message); + throw 7; + } else + tdbp->SetNext(NULL); - } // endif mode + } // endif mode - rcop= false; + rcop = false; + + } catch (int n) { + if (trace) + htrc("Exception %d: %s\n", n, g->Message); + } catch (const char *msg) { + strcpy(g->Message, msg); + } // end catch - err: - g->jump_level--; return rcop; } // end of CntOpenTable @@ -387,50 +381,40 @@ bool CntRewindTable(PGLOBAL g, PTDB tdbp) /* Evaluate all columns after a record is read. */ /***********************************************************************/ RCODE EvalColumns(PGLOBAL g, PTDB tdbp, bool reset, bool mrr) - { +{ RCODE rc= RC_OK; PCOL colp; - // Save stack and allocation environment and prepare error return - if (g->jump_level == MAX_JUMP) { - if (trace) { - strcpy(g->Message, MSG(TOO_MANY_JUMPS)); - printf("EvalColumns: %s\n", g->Message); - } // endif + try { + for (colp = tdbp->GetColumns(); rc == RC_OK && colp; + colp = colp->GetNext()) { + if (reset) + colp->Reset(); - return RC_FX; - } // endif jump_level + // Virtual columns are computed by MariaDB + if (!colp->GetColUse(U_VIRTUAL) && (!mrr || colp->GetKcol())) + if (colp->Eval(g)) + rc = RC_FX; - if (setjmp(g->jumper[++g->jump_level]) != 0) { - if (trace) - printf("Error reading columns: %s\n", g->Message); + } // endfor colp - rc= RC_FX; - goto err; - } // endif rc + } catch (int n) { + if (trace) + printf("Error %d reading columns: %s\n", n, g->Message); - for (colp= tdbp->GetColumns(); rc == RC_OK && colp; - colp= colp->GetNext()) { - if (reset) - colp->Reset(); + rc = RC_FX; + } catch (const char *msg) { + strcpy(g->Message, msg); + } // end catch - // Virtual columns are computed by MariaDB - if (!colp->GetColUse(U_VIRTUAL) && (!mrr || colp->GetKcol())) - if (colp->Eval(g)) - rc= RC_FX; - - } // endfor colp - - err: - g->jump_level--; return rc; - } // end of EvalColumns +} // end of EvalColumns /***********************************************************************/ /* ReadNext: Read next record sequentially. */ /***********************************************************************/ RCODE CntReadNext(PGLOBAL g, PTDB tdbp) - { +{ RCODE rc; if (!tdbp) @@ -445,76 +429,66 @@ RCODE CntReadNext(PGLOBAL g, PTDB tdbp) ((PTDBASE)tdbp)->ResetKindex(g, NULL); } // endif index - // Save stack and allocation environment and prepare error return - if (g->jump_level == MAX_JUMP) { - strcpy(g->Message, MSG(TOO_MANY_JUMPS)); - return RC_FX; - } // endif jump_level + try { + // Do it now to avoid double eval when filtering + for (PCOL colp = tdbp->GetColumns(); colp; colp = colp->GetNext()) + colp->Reset(); - if ((setjmp(g->jumper[++g->jump_level])) != 0) { - rc= RC_FX; - goto err; - } // endif rc + do { + if ((rc = (RCODE)tdbp->ReadDB(g)) == RC_OK) + if (!ApplyFilter(g, tdbp->GetFilter())) + rc = RC_NF; - // Do it now to avoid double eval when filtering - for (PCOL colp= tdbp->GetColumns(); colp; colp= colp->GetNext()) - colp->Reset(); + } while (rc == RC_NF); - do { - if ((rc= (RCODE)tdbp->ReadDB(g)) == RC_OK) - if (!ApplyFilter(g, tdbp->GetFilter())) - rc= RC_NF; + if (rc == RC_OK) + rc = EvalColumns(g, tdbp, false); - } while (rc == RC_NF); + } catch (int) { + rc = RC_FX; + } catch (const char *msg) { + strcpy(g->Message, msg); + rc = RC_FX; + } // end catch - if (rc == RC_OK) - rc= EvalColumns(g, tdbp, false); - - err: - g->jump_level--; return rc; - } // end of CntReadNext +} // end of CntReadNext /***********************************************************************/ /* WriteRow: Insert a new row into a table. */ /***********************************************************************/ RCODE CntWriteRow(PGLOBAL g, PTDB tdbp) - { - RCODE rc; - PCOL colp; -//PTDBASE tp= (PTDBASE)tdbp; +{ + RCODE rc; + PCOL colp; + //PTDBASE tp= (PTDBASE)tdbp; - if (!tdbp) - return RC_FX; + if (!tdbp) + return RC_FX; - // Save stack and allocation environment and prepare error return - if (g->jump_level == MAX_JUMP) { - strcpy(g->Message, MSG(TOO_MANY_JUMPS)); - return RC_FX; - } // endif jump_level + try { + // Store column values in table write buffer(s) + for (colp = tdbp->GetSetCols(); colp; colp = colp->GetNext()) + if (!colp->GetColUse(U_VIRTUAL)) + colp->WriteColumn(g); - if (setjmp(g->jumper[++g->jump_level]) != 0) { - printf("%s\n", g->Message); - rc= RC_FX; - goto err; - } // endif rc + if (tdbp->IsIndexed()) + // Index values must be sorted before updating + rc = (RCODE)((PTDBDOS)tdbp)->GetTxfp()->StoreValues(g, true); + else + // Return result code from write operation + rc = (RCODE)tdbp->WriteDB(g); - // Store column values in table write buffer(s) - for (colp= tdbp->GetSetCols(); colp; colp= colp->GetNext()) - if (!colp->GetColUse(U_VIRTUAL)) - colp->WriteColumn(g); + } catch (int n) { + printf("Exception %d: %s\n", n, g->Message); + rc = RC_FX; + } catch (const char *msg) { + strcpy(g->Message, msg); + rc = RC_FX; + } // end catch - if (tdbp->IsIndexed()) - // Index values must be sorted before updating - rc= (RCODE)((PTDBDOS)tdbp)->GetTxfp()->StoreValues(g, true); - else - // Return result code from write operation - rc= (RCODE)tdbp->WriteDB(g); - - err: - g->jump_level--; - return rc; - } // end of CntWriteRow + return rc; +} // end of CntWriteRow /***********************************************************************/ /* UpdateRow: Update a row into a table. */ @@ -562,88 +536,78 @@ RCODE CntDeleteRow(PGLOBAL g, PTDB tdbp, bool all) /* CLOSETAB: Close a table. */ /***********************************************************************/ int CntCloseTable(PGLOBAL g, PTDB tdbp, bool nox, bool abort) - { - int rc= RC_OK; -//TDBASE *tbxp= (PTDBASE)tdbp; +{ + int rc = RC_OK; + //TDBASE *tbxp= (PTDBASE)tdbp; - if (!tdbp) - return rc; // Nothing to do - else if (tdbp->GetUse() != USE_OPEN) { - if (tdbp->GetAmType() == TYPE_AM_XML) - tdbp->CloseDB(g); // Opened by GetMaxSize + if (!tdbp) + return rc; // Nothing to do + else if (tdbp->GetUse() != USE_OPEN) { + if (tdbp->GetAmType() == TYPE_AM_XML) + tdbp->CloseDB(g); // Opened by GetMaxSize - return rc; - } // endif !USE_OPEN + return rc; + } // endif !USE_OPEN - if (trace) - printf("CntCloseTable: tdbp=%p mode=%d nox=%d abort=%d\n", - tdbp, tdbp->GetMode(), nox, abort); + if (trace) + printf("CntCloseTable: tdbp=%p mode=%d nox=%d abort=%d\n", + tdbp, tdbp->GetMode(), nox, abort); - if (tdbp->GetMode() == MODE_DELETE && tdbp->GetUse() == USE_OPEN) { - if (tdbp->IsIndexed()) - rc= ((PTDBDOS)tdbp)->GetTxfp()->DeleteSortedRows(g); + if (tdbp->GetMode() == MODE_DELETE && tdbp->GetUse() == USE_OPEN) { + if (tdbp->IsIndexed()) + rc = ((PTDBDOS)tdbp)->GetTxfp()->DeleteSortedRows(g); - if (!rc) - rc= tdbp->DeleteDB(g, RC_EF); // Specific A.M. delete routine + if (!rc) + rc = tdbp->DeleteDB(g, RC_EF); // Specific A.M. delete routine - } else if (tdbp->GetMode() == MODE_UPDATE && tdbp->IsIndexed()) - rc= ((PTDBDOX)tdbp)->Txfp->UpdateSortedRows(g); + } else if (tdbp->GetMode() == MODE_UPDATE && tdbp->IsIndexed()) + rc = ((PTDBDOX)tdbp)->Txfp->UpdateSortedRows(g); - switch(rc) { - case RC_FX: - abort= true; - break; - case RC_INFO: - PushWarning(g, tdbp); - break; - } // endswitch rc + switch (rc) { + case RC_FX: + abort = true; + break; + case RC_INFO: + PushWarning(g, tdbp); + break; + } // endswitch rc - // Prepare error return - if (g->jump_level == MAX_JUMP) { - strcpy(g->Message, MSG(TOO_MANY_JUMPS)); - rc= RC_FX; - goto err; - } // endif + try { + // This will close the table file(s) and also finalize write + // operations such as Insert, Update, or Delete. + tdbp->SetAbort(abort); + tdbp->CloseDB(g); + tdbp->SetAbort(false); - if ((rc = setjmp(g->jumper[++g->jump_level])) != 0) { - rc= RC_FX; - g->jump_level--; - goto err; - } // endif + if (trace > 1) + printf("Table %s closed\n", tdbp->GetName()); - // This will close the table file(s) and also finalize write - // operations such as Insert, Update, or Delete. - tdbp->SetAbort(abort); - tdbp->CloseDB(g); - tdbp->SetAbort(false); - g->jump_level--; + if (!nox && tdbp->GetMode() != MODE_READ && tdbp->GetMode() != MODE_ANY) { + if (trace > 1) + printf("About to reset opt\n"); - if (trace > 1) - printf("Table %s closed\n", tdbp->GetName()); + if (!tdbp->IsRemote()) { + // Make all the eventual indexes + PTDBDOX tbxp = (PTDBDOX)tdbp; + tbxp->ResetKindex(g, NULL); + tbxp->SetKey_Col(NULL); + rc = tbxp->ResetTableOpt(g, true, tbxp->GetDef()->Indexable() == 1); + } // endif remote -//if (!((PTDBDOX)tdbp)->GetModified()) -// return 0; + } // endif nox - if (nox || tdbp->GetMode() == MODE_READ || tdbp->GetMode() == MODE_ANY) - return 0; + } catch (int) { + rc = RC_FX; + } catch (const char *msg) { + strcpy(g->Message, msg); + rc = RC_FX; + } // end catch - if (trace > 1) - printf("About to reset opt\n"); + if (trace > 1) + htrc("Done rc=%d\n", rc); - if (!tdbp->IsRemote()) { - // Make all the eventual indexes - PTDBDOX tbxp = (PTDBDOX)tdbp; - tbxp->ResetKindex(g, NULL); - tbxp->SetKey_Col(NULL); - rc = tbxp->ResetTableOpt(g, true, tbxp->GetDef()->Indexable() == 1); - } // endif remote - - err: - if (trace > 1) - printf("Done rc=%d\n", rc); - - return (rc == RC_OK || rc == RC_INFO) ? 0 : rc; - } // end of CntCloseTable + return (rc == RC_OK || rc == RC_INFO) ? 0 : rc; +} // end of CntCloseTable /***********************************************************************/ /* Load and initialize the use of an index. */ @@ -752,8 +716,9 @@ RCODE CntIndexRead(PGLOBAL g, PTDB ptdb, OPVAL op, sprintf(g->Message, MSG(TABLE_NO_INDEX), ptdb->GetName()); return RC_FX; } else if (x == 2) { - // Remote index - if (op != OP_SAME && ptdb->ReadKey(g, op, kr)) + // Remote index. Only used in read mode + if ((ptdb->GetMode() == MODE_READ || ptdb->GetMode() == MODE_READX) + && op != OP_SAME && ptdb->ReadKey(g, op, kr)) return RC_FX; goto rnd; diff --git a/storage/connect/connect.h b/storage/connect/connect.h index 128561b80f3..2bca8bf54cb 100644 --- a/storage/connect/connect.h +++ b/storage/connect/connect.h @@ -1,4 +1,4 @@ -/* Copyright (C) Olivier Bertrand 2004 - 2011 +/* Copyright (C) MariaDB Corporation Ab This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -15,6 +15,7 @@ /**************** Cnt H Declares Source Code File (.H) *****************/ /* Name: CONNECT.H Version 2.4 */ +/* Author Olivier BERTRAND bertrandop@gmail.com */ /* This file contains the some based classes declares. */ /***********************************************************************/ #include "filamtxt.h" diff --git a/storage/connect/csort.h b/storage/connect/csort.h index 55ff6268a4b..6e700059881 100644 --- a/storage/connect/csort.h +++ b/storage/connect/csort.h @@ -49,8 +49,8 @@ class DllExport CSORT { public: // Methods int Qsort(PGLOBAL g, int n); /* Sort calling routine */ -//virtual void Print(PGLOBAL g, FILE *f, uint n); -//virtual void Print(PGLOBAL g, char *ps, uint z); +//virtual void Printf(PGLOBAL g, FILE *f, uint n); +//virtual void Prints(PGLOBAL g, char *ps, uint z); #ifdef DEBTRACE int GetNcmp(void) {return num_comp;} #endif diff --git a/storage/connect/domdoc.cpp b/storage/connect/domdoc.cpp index 1622ec16c68..e24e10835c1 100644 --- a/storage/connect/domdoc.cpp +++ b/storage/connect/domdoc.cpp @@ -58,13 +58,15 @@ void CloseXMLFile(PGLOBAL g, PFBLOCK fp, bool all) if (xp && xp->Count > 1 && !all) { xp->Count--; } else if (xp && xp->Count > 0) { - try { + try { if (xp->Docp) xp->Docp->Release(); - } catch(_com_error e) { - sprintf(g->Message, "%s %s", MSG(COM_ERROR), e.Description()); - } catch(...) {} + } catch(_com_error e) { + char *p = _com_util::ConvertBSTRToString(e.Description()); + sprintf(g->Message, "%s %s", MSG(COM_ERROR), p); + delete[] p; + } catch(...) {} CoUninitialize(); xp->Count = 0; @@ -89,7 +91,7 @@ DOMDOC::DOMDOC(char *nsl, char *nsdf, char *enc, PFBLOCK fp) /******************************************************************/ /* Initialize XML parser and check library compatibility. */ /******************************************************************/ -bool DOMDOC::Initialize(PGLOBAL g, char *entry, bool zipped) +bool DOMDOC::Initialize(PGLOBAL g, PCSZ entry, bool zipped) { if (zipped && InitZip(g, entry)) return true; @@ -155,7 +157,7 @@ PFBLOCK DOMDOC::LinkXblock(PGLOBAL g, MODE m, int rc, char *fn) /******************************************************************/ /* Create the XML node. */ /******************************************************************/ -bool DOMDOC::NewDoc(PGLOBAL g, char *ver) +bool DOMDOC::NewDoc(PGLOBAL g, PCSZ ver) { char buf[64]; MSXML2::IXMLDOMProcessingInstructionPtr pip; @@ -490,9 +492,9 @@ PXATTR DOMNODE::GetAttribute(PGLOBAL g, char *name, PXATTR ap) /******************************************************************/ /* Add a new element child node to this node and return it. */ /******************************************************************/ -PXNODE DOMNODE::AddChildNode(PGLOBAL g, char *name, PXNODE np) +PXNODE DOMNODE::AddChildNode(PGLOBAL g, PCSZ name, PXNODE np) { - char *p, *pn; + const char *p, *pn; // char *p, *pn, *epf, *pf = NULL; MSXML2::IXMLDOMNodePtr ep; // _bstr_t uri((wchar_t*)NULL); @@ -585,7 +587,7 @@ PXATTR DOMNODE::AddProperty(PGLOBAL g, char *name, PXATTR ap) /******************************************************************/ /* Add a new text node to this node. */ /******************************************************************/ -void DOMNODE::AddText(PGLOBAL g, char *txtp) +void DOMNODE::AddText(PGLOBAL g, PCSZ txtp) { MSXML2::IXMLDOMTextPtr tp= Docp->createTextNode((_bstr_t)txtp); diff --git a/storage/connect/domdoc.h b/storage/connect/domdoc.h index 7f269002d59..dd8936097e2 100644 --- a/storage/connect/domdoc.h +++ b/storage/connect/domdoc.h @@ -37,9 +37,9 @@ class DOMDOC : public XMLDOCUMENT { virtual void SetNofree(bool b) {} // Only libxml2 // Methods - virtual bool Initialize(PGLOBAL g, char *entry, bool zipped); + virtual bool Initialize(PGLOBAL g, PCSZ entry, bool zipped); virtual bool ParseFile(PGLOBAL g, char *fn); - virtual bool NewDoc(PGLOBAL g, char *ver); + virtual bool NewDoc(PGLOBAL g, PCSZ ver); virtual void AddComment(PGLOBAL g, char *com); virtual PXNODE GetRoot(PGLOBAL g); virtual PXNODE NewRoot(PGLOBAL g, char *name); @@ -78,9 +78,9 @@ class DOMNODE : public XMLNODE { virtual PXLIST SelectNodes(PGLOBAL g, char *xp, PXLIST lp); virtual PXNODE SelectSingleNode(PGLOBAL g, char *xp, PXNODE np); virtual PXATTR GetAttribute(PGLOBAL g, char *name, PXATTR ap); - virtual PXNODE AddChildNode(PGLOBAL g, char *name, PXNODE np); + virtual PXNODE AddChildNode(PGLOBAL g, PCSZ name, PXNODE np); virtual PXATTR AddProperty(PGLOBAL g, char *name, PXATTR ap); - virtual void AddText(PGLOBAL g, char *txtp); + virtual void AddText(PGLOBAL g, PCSZ txtp); virtual void DeleteChild(PGLOBAL g, PXNODE dnp); protected: diff --git a/storage/connect/engmsg.h b/storage/connect/engmsg.h index 14808758efd..c072511065e 100644 --- a/storage/connect/engmsg.h +++ b/storage/connect/engmsg.h @@ -1,3 +1,4 @@ +/* Copyright (C) MariaDB Corporation Ab */ #define MSG_ACCESS_VIOLATN "Access violation" #define MSG_ADD_BAD_TYPE "Array add value type mismatch (%s -> %s)" #define MSG_ALLOC_ERROR "Error allocating %s" diff --git a/storage/connect/filamap.cpp b/storage/connect/filamap.cpp index 8fffaca3d06..84dff422db7 100644 --- a/storage/connect/filamap.cpp +++ b/storage/connect/filamap.cpp @@ -301,10 +301,9 @@ int MAPFAM::SkipRecord(PGLOBAL g, bool header) PDBUSER dup = (PDBUSER)g->Activityp->Aptr; // Skip this record - while (*Mempos++ != '\n') ; // What about Unix ??? - - if (Mempos >= Top) - return RC_EF; + while (*Mempos++ != '\n') // What about Unix ??? + if (Mempos == Top) + return RC_EF; // Update progress information dup->ProgCur = GetPos(); @@ -320,7 +319,7 @@ int MAPFAM::SkipRecord(PGLOBAL g, bool header) /***********************************************************************/ int MAPFAM::ReadBuffer(PGLOBAL g) { - int rc, len; + int rc, len, n = 1; // Are we at the end of the memory if (Mempos >= Top) { @@ -362,10 +361,14 @@ int MAPFAM::ReadBuffer(PGLOBAL g) Placed = false; // Immediately calculate next position (Used by DeleteDB) - while (*Mempos++ != '\n') ; // What about Unix ??? + while (*Mempos++ != '\n') // What about Unix ??? + if (Mempos == Top) { + n = 0; + break; + } // endif Mempos // Set caller line buffer - len = (Mempos - Fpos) - 1; + len = (Mempos - Fpos) - n; // Don't rely on ENDING setting if (len > 0 && *(Mempos - 2) == '\r') @@ -619,7 +622,9 @@ int MBKFAM::ReadBuffer(PGLOBAL g) } // endif's // Immediately calculate next position (Used by DeleteDB) - while (*Mempos++ != '\n') ; // What about Unix ??? + while (*Mempos++ != '\n') // What about Unix ??? + if (Mempos == Top) + break; // Set caller line buffer len = (Mempos - Fpos) - Ending; diff --git a/storage/connect/filamdbf.cpp b/storage/connect/filamdbf.cpp index 55feaa02bc4..44abd962c56 100644 --- a/storage/connect/filamdbf.cpp +++ b/storage/connect/filamdbf.cpp @@ -128,7 +128,7 @@ typedef struct _descriptor { /* Moves file pointer to byte 32; fills buffer at buf with */ /* first 32 bytes of file. */ /****************************************************************************/ -static int dbfhead(PGLOBAL g, FILE *file, PSZ fn, DBFHEADER *buf) +static int dbfhead(PGLOBAL g, FILE *file, PCSZ fn, DBFHEADER *buf) { char endmark[2]; int dbc = 2, rc = RC_OK; @@ -186,7 +186,7 @@ static int dbfhead(PGLOBAL g, FILE *file, PSZ fn, DBFHEADER *buf) /* DBFColumns: constructs the result blocks containing the description */ /* of all the columns of a DBF file that will be retrieved by #GetData. */ /****************************************************************************/ -PQRYRES DBFColumns(PGLOBAL g, char *dp, const char *fn, bool info) +PQRYRES DBFColumns(PGLOBAL g, PCSZ dp, PCSZ fn, bool info) { int buftyp[] = {TYPE_STRING, TYPE_SHORT, TYPE_STRING, TYPE_INT, TYPE_INT, TYPE_SHORT}; @@ -393,7 +393,7 @@ DBFBASE::DBFBASE(DBFBASE *txfp) /* and header length. Set Records, check that Reclen is equal to lrecl and */ /* return the header length or 0 in case of error. */ /****************************************************************************/ -int DBFBASE::ScanHeader(PGLOBAL g, PSZ fn, int lrecl, int *rln, char *defpath) +int DBFBASE::ScanHeader(PGLOBAL g, PCSZ fn, int lrecl, int *rln, PCSZ defpath) { int rc; char filename[_MAX_PATH]; @@ -503,7 +503,8 @@ bool DBFFAM::OpenTableFile(PGLOBAL g) break; } // endif - // Selective delete, pass thru + // Selective delete + /* fall through */ case MODE_UPDATE: UseTemp = Tdbp->IsUsingTemp(g); strcpy(opmode, (UseTemp) ? "rb" : "r+b"); @@ -623,6 +624,7 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g) case 'L': // Large (big) integer case 'T': // Tiny integer c = 'N'; // Numeric + /* fall through */ case 'N': // Numeric (integer) case 'F': // Float (double) descp->Decimals = (uchar)cdp->F.Prec; @@ -694,7 +696,7 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g) } // endif Headlen /**************************************************************************/ - /* Position the file at the beginning of the data. */ + /* Position the file at the begining of the data. */ /**************************************************************************/ if (Tdbp->GetMode() == MODE_INSERT) rc = fseek(Stream, 0, SEEK_END); @@ -1034,7 +1036,7 @@ bool DBMFAM::AllocateBuffer(PGLOBAL g) } // endif Headlen /**************************************************************************/ - /* Position the file at the beginning of the data. */ + /* Position the file at the begining of the data. */ /**************************************************************************/ Fpos = Mempos = Memory + Headlen; Top--; // Because of EOF marker diff --git a/storage/connect/filamdbf.h b/storage/connect/filamdbf.h index 66458a10eaa..640fc349b4c 100644 --- a/storage/connect/filamdbf.h +++ b/storage/connect/filamdbf.h @@ -19,7 +19,7 @@ typedef class DBMFAM *PDBMFAM; /****************************************************************************/ /* Functions used externally. */ /****************************************************************************/ -PQRYRES DBFColumns(PGLOBAL g, char *dp, const char *fn, bool info); +PQRYRES DBFColumns(PGLOBAL g, PCSZ dp, PCSZ fn, bool info); /****************************************************************************/ /* This is the base class for dBASE file access methods. */ @@ -31,7 +31,7 @@ class DllExport DBFBASE { DBFBASE(PDBF txfp); // Implementation - int ScanHeader(PGLOBAL g, PSZ fname, int lrecl, int *rlen, char *defpath); + int ScanHeader(PGLOBAL g, PCSZ fname, int lrecl, int *rlen, PCSZ defpath); protected: // Default constructor, not to be used diff --git a/storage/connect/filamfix.cpp b/storage/connect/filamfix.cpp index cd25429318a..1d6194b154d 100644 --- a/storage/connect/filamfix.cpp +++ b/storage/connect/filamfix.cpp @@ -761,7 +761,8 @@ bool BGXFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req) htrc("after write req=%d brc=%d nbw=%d\n", req, brc, nbw); if (!brc || nbw != len) { - char buf[256], *fn = (h == Hfile) ? To_File : "Tempfile"; + char buf[256]; + PCSZ fn = (h == Hfile) ? To_File : "Tempfile"; if (brc) strcpy(buf, MSG(BAD_BYTE_NUM)); @@ -919,7 +920,8 @@ bool BGXFAM::OpenTableFile(PGLOBAL g) break; } // endif - // Selective delete, pass thru + // Selective delete + /* fall through */ case MODE_UPDATE: UseTemp = Tdbp->IsUsingTemp(g); oflag |= (UseTemp) ? O_RDONLY : O_RDWR; diff --git a/storage/connect/filamgz.cpp b/storage/connect/filamgz.cpp index dc6f277ee27..df366ef15f9 100644 --- a/storage/connect/filamgz.cpp +++ b/storage/connect/filamgz.cpp @@ -920,8 +920,8 @@ int ZLBFAM::GetFileLength(PGLOBAL g) /***********************************************************************/ bool ZLBFAM::AllocateBuffer(PGLOBAL g) { - char *msg; - int n, zrc; + PCSZ msg; + int n, zrc; #if 0 if (!Optimized && Tdbp->NeedIndexing(g)) { diff --git a/storage/connect/filamtxt.cpp b/storage/connect/filamtxt.cpp index e53cdcd9ba9..c456ee9e9b7 100644 --- a/storage/connect/filamtxt.cpp +++ b/storage/connect/filamtxt.cpp @@ -1,11 +1,11 @@ /*********** File AM Txt C++ Program Source Code File (.CPP) ***********/ /* PROGRAM NAME: FILAMTXT */ /* ------------- */ -/* Version 1.6 */ +/* Version 1.7 */ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 2005-2015 */ +/* (C) Copyright to the author Olivier BERTRAND 2005-2017 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -71,8 +71,23 @@ TXTFAM::TXTFAM(PDOSDEF tdp) { Tdbp = NULL; To_Fb = NULL; - To_File = tdp->Fn; - Lrecl = tdp->Lrecl; + + if (tdp) { + To_File = tdp->Fn; + Lrecl = tdp->Lrecl; + Eof = tdp->Eof; + Ending = tdp->Ending; + } else { + To_File = NULL; + Lrecl = 0; + Eof = false; +#if defined(__WIN__) + Ending = 2; +#else + Ending = 1; +#endif + } // endif tdp + Placed = false; IsRead = true; Blocked = false; @@ -103,8 +118,6 @@ TXTFAM::TXTFAM(PDOSDEF tdp) Blksize = 0; Fpos = Spos = Tpos = 0; Padded = false; - Eof = tdp->Eof; - Ending = tdp->Ending; Abort = false; CrLf = (char*)(Ending == 1 ? "\n" : "\r\n"); } // end of TXTFAM standard constructor @@ -561,6 +574,7 @@ bool DOSFAM::OpenTableFile(PGLOBAL g) // Selective delete, pass thru Bin = true; + /* fall through */ case MODE_UPDATE: if ((UseTemp = Tdbp->IsUsingTemp(g))) { strcpy(opmode, "r"); @@ -973,7 +987,7 @@ int DOSFAM::DeleteRecords(PGLOBAL g, int irc) } else { /*****************************************************************/ - /* Move of eventual preceding lines is not required here. */ + /* Move of eventual preceding lines is not required here. */ /* Set the target file as being the source file itself. */ /* Set the future Tpos, and give Spos a value to block copying. */ /*****************************************************************/ @@ -1161,13 +1175,13 @@ int DOSFAM::RenameTempFile(PGLOBAL g) if (rename(filename, filetemp)) { // Save file for security sprintf(g->Message, MSG(RENAME_ERROR), filename, filetemp, strerror(errno)); - longjmp(g->jumper[g->jump_level], 51); - } else if (rename(tempname, filename)) { + throw 51; + } else if (rename(tempname, filename)) { sprintf(g->Message, MSG(RENAME_ERROR), tempname, filename, strerror(errno)); rc = rename(filetemp, filename); // Restore saved file - longjmp(g->jumper[g->jump_level], 52); - } else if (remove(filetemp)) { + throw 52; + } else if (remove(filetemp)) { sprintf(g->Message, MSG(REMOVE_ERROR), filetemp, strerror(errno)); rc = RC_INFO; // Acceptable diff --git a/storage/connect/filamtxt.h b/storage/connect/filamtxt.h index ae8f74a9830..1fdae8fcd37 100644 --- a/storage/connect/filamtxt.h +++ b/storage/connect/filamtxt.h @@ -80,7 +80,7 @@ class DllExport TXTFAM : public BLOCK { protected: // Members PTDBDOS Tdbp; // To table class - PSZ To_File; // Points to table file name + PCSZ To_File; // Points to table file name PFBLOCK To_Fb; // Pointer to file block PPARM To_Pos; // Pointer to position list PPARM To_Sos; // Pointer to start position list diff --git a/storage/connect/filamvct.cpp b/storage/connect/filamvct.cpp index fdc5433f4a4..871613cb4b4 100755 --- a/storage/connect/filamvct.cpp +++ b/storage/connect/filamvct.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 2005-2015 */ +/* (C) Copyright to the author Olivier BERTRAND 2005-2017 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -143,9 +143,9 @@ int VCTFAM::GetFileLength(PGLOBAL g) { if (Split) { // Get the total file length - char filename[_MAX_PATH]; - char *savfile = To_File; - int i, len = 0; + char filename[_MAX_PATH]; + PCSZ savfile = To_File; + int i, len = 0; // Initialize the array of file structures if (!Colfn) { @@ -313,8 +313,8 @@ int VCTFAM::Cardinality(PGLOBAL g) // and Last must be set from the file cardinality. // Only happens when called by sub classes. char filename[_MAX_PATH]; - PSZ savfn = To_File; - int len, clen, card = -1; + PCSZ savfn = To_File; + int len, clen, card = -1; PCOLDEF cdp = Tdbp->GetDef()->GetCols(); if (!Colfn) { @@ -368,7 +368,7 @@ int VCTFAM::GetRowID(void) /***********************************************************************/ /* VCT Create an empty file for Vector formatted tables. */ /***********************************************************************/ -bool VCTFAM::MakeEmptyFile(PGLOBAL g, char *fn) +bool VCTFAM::MakeEmptyFile(PGLOBAL g, PCSZ fn) { // Vector formatted file: this will create an empty file of the // required length if it does not exists yet. @@ -440,6 +440,7 @@ bool VCTFAM::OpenTableFile(PGLOBAL g) } // endif // Selective delete, pass thru + /* fall through */ case MODE_UPDATE: UseTemp = Tdbp->IsUsingTemp(g); strcpy(opmode, (UseTemp) ? "rb" : "r+b"); @@ -559,41 +560,42 @@ bool VCTFAM::AllocateBuffer(PGLOBAL g) /* Do initial action when inserting. */ /***********************************************************************/ bool VCTFAM::InitInsert(PGLOBAL g) - { +{ + bool rc = false; + // We come here in MODE_INSERT only if (Last == Nrec) { CurBlk = Block; CurNum = 0; AddBlock = !MaxBlk; } else { - int rc; PVCTCOL cp = (PVCTCOL)Tdbp->GetColumns(); // The starting point must be at the end of file as for append. CurBlk = Block - 1; CurNum = Last; - // Prepare error return - if (g->jump_level == MAX_JUMP) { - strcpy(g->Message, MSG(TOO_MANY_JUMPS)); - return true; - } // endif + try { + // Last block must be updated by new values + for (; cp; cp = (PVCTCOL)cp->Next) + cp->ReadBlock(g); - if ((rc = setjmp(g->jumper[++g->jump_level])) != 0) { - g->jump_level--; - return true; - } // endif + } catch (int n) { + if (trace) + htrc("Exception %d: %s\n", n, g->Message); + rc = true; + } catch (const char *msg) { + strcpy(g->Message, msg); + rc = true; + } // end catch - // Last block must be updated by new values - for (; cp; cp = (PVCTCOL)cp->Next) - cp->ReadBlock(g); - - g->jump_level--; } // endif Last - // We are not currently using a temporary file for Insert - T_Stream = Stream; - return false; + if (!rc) + // We are not currently using a temporary file for Insert + T_Stream = Stream; + + return rc; } // end of InitInsert /***********************************************************************/ @@ -878,8 +880,9 @@ int VCTFAM::DeleteRecords(PGLOBAL g, int irc) /***********************************************************************/ bool VCTFAM::OpenTempFile(PGLOBAL g) { - char *opmode, tempname[_MAX_PATH]; - bool rc = false; + PCSZ opmode; + char tempname[_MAX_PATH]; + bool rc = false; /*********************************************************************/ /* Open the temporary file, Spos is at the beginning of file. */ @@ -1107,7 +1110,7 @@ void VCTFAM::CloseTableFile(PGLOBAL g, bool abort) } else if (AddBlock) { // Last block was not written rc = ResetTableSize(g, CurBlk, Nrec); - longjmp(g->jumper[g->jump_level], 44); + throw 44; } // endif } else if (mode == MODE_UPDATE) { @@ -1527,8 +1530,8 @@ bool VCMFAM::AllocateBuffer(PGLOBAL g) /* Do initial action when inserting. */ /***********************************************************************/ bool VCMFAM::InitInsert(PGLOBAL g) - { - int rc; +{ + bool rc = false; volatile PVCTCOL cp = (PVCTCOL)Tdbp->GetColumns(); // We come here in MODE_INSERT only @@ -1542,24 +1545,22 @@ bool VCMFAM::InitInsert(PGLOBAL g) CurNum = Last; } // endif Last - // Prepare error return - if (g->jump_level == MAX_JUMP) { - strcpy(g->Message, MSG(TOO_MANY_JUMPS)); - return true; - } // endif + try { + // Initialize the column block pointer + for (; cp; cp = (PVCTCOL)cp->Next) + cp->ReadBlock(g); - if ((rc = setjmp(g->jumper[++g->jump_level])) != 0) { - g->jump_level--; - return true; - } // endif + } catch (int n) { + if (trace) + htrc("Exception %d: %s\n", n, g->Message); + rc = true; + } catch (const char *msg) { + strcpy(g->Message, msg); + rc = true; + } // end catch - // Initialize the column block pointer - for (; cp; cp = (PVCTCOL)cp->Next) - cp->ReadBlock(g); - - g->jump_level--; - return false; - } // end of InitInsert + return rc; +} // end of InitInsert /***********************************************************************/ /* Data Base write routine for VMP access method. */ @@ -1918,6 +1919,7 @@ bool VECFAM::OpenTableFile(PGLOBAL g) } // endif filter // Selective delete, pass thru + /* fall through */ case MODE_UPDATE: UseTemp = Tdbp->IsUsingTemp(g); strcpy(opmode, (UseTemp) ? "rb": "r+b"); @@ -1998,7 +2000,7 @@ bool VECFAM::OpenTableFile(PGLOBAL g) /***********************************************************************/ /* Open the file corresponding to one column. */ /***********************************************************************/ -bool VECFAM::OpenColumnFile(PGLOBAL g, char *opmode, int i) +bool VECFAM::OpenColumnFile(PGLOBAL g, PCSZ opmode, int i) { char filename[_MAX_PATH]; PDBUSER dup = PlgGetUser(g); @@ -2503,7 +2505,7 @@ void VECFAM::CloseTableFile(PGLOBAL g, bool abort) if (wrc != RC_FX) rc = ResetTableSize(g, Block, Last); else - longjmp(g->jumper[g->jump_level], 44); + throw 44; } else if (mode == MODE_UPDATE) { if (UseTemp && !InitUpdate && !Abort) { @@ -3143,7 +3145,8 @@ bool BGVFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req) htrc("after write req=%d brc=%d nbw=%d\n", req, brc, nbw); if (!brc || nbw != len) { - char buf[256], *fn = (h == Hfile) ? To_File : "Tempfile"; + char buf[256]; + PCSZ fn = (h == Hfile) ? To_File : "Tempfile"; if (brc) strcpy(buf, MSG(BAD_BYTE_NUM)); @@ -3319,7 +3322,7 @@ bool BGVFAM::SetBlockInfo(PGLOBAL g) /***********************************************************************/ /* VEC Create an empty file for new Vector formatted tables. */ /***********************************************************************/ -bool BGVFAM::MakeEmptyFile(PGLOBAL g, char *fn) +bool BGVFAM::MakeEmptyFile(PGLOBAL g, PCSZ fn) { // Vector formatted file this will create an empty file of the // required length if it does not exists yet. @@ -3329,7 +3332,7 @@ bool BGVFAM::MakeEmptyFile(PGLOBAL g, char *fn) PlugSetPath(filename, fn, Tdbp->GetPath()); #if defined(__WIN__) - char *p; + PCSZ p; DWORD rc; bool brc; LARGE_INTEGER of; @@ -3584,6 +3587,7 @@ bool BGVFAM::OpenTableFile(PGLOBAL g) } // endif // Selective delete, pass thru + /* fall through */ case MODE_UPDATE: UseTemp = Tdbp->IsUsingTemp(g); oflag = (UseTemp) ? O_RDONLY : O_RDWR; @@ -4164,8 +4168,8 @@ void BGVFAM::CloseTableFile(PGLOBAL g, bool abort) } else if (AddBlock) { // Last block was not written rc = ResetTableSize(g, CurBlk, Nrec); - longjmp(g->jumper[g->jump_level], 44); - } // endif + throw 44; + } // endif } else if (mode == MODE_UPDATE) { // Write back to file any pending modifications diff --git a/storage/connect/filamvct.h b/storage/connect/filamvct.h index be66232acfb..85982403270 100644 --- a/storage/connect/filamvct.h +++ b/storage/connect/filamvct.h @@ -61,7 +61,7 @@ class DllExport VCTFAM : public FIXFAM { virtual bool WriteBlock(PGLOBAL g, PVCTCOL colp); protected: - virtual bool MakeEmptyFile(PGLOBAL g, char *fn); + virtual bool MakeEmptyFile(PGLOBAL g, PCSZ fn); virtual bool OpenTempFile(PGLOBAL g); virtual bool MoveLines(PGLOBAL g) {return false;} virtual bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL); @@ -160,7 +160,7 @@ class DllExport VECFAM : public VCTFAM { virtual bool MoveLines(PGLOBAL g); virtual bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL); virtual int RenameTempFile(PGLOBAL g); - bool OpenColumnFile(PGLOBAL g, char *opmode, int i); + bool OpenColumnFile(PGLOBAL g, PCSZ opmode, int i); // Members FILE* *Streams; // Points to Dos file structure array @@ -235,7 +235,7 @@ class BGVFAM : public VCTFAM { bool BigSeek(PGLOBAL g, HANDLE h, BIGINT pos, bool b = false); bool BigRead(PGLOBAL g, HANDLE h, void *inbuf, int req); bool BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req); - virtual bool MakeEmptyFile(PGLOBAL g, char *fn); + virtual bool MakeEmptyFile(PGLOBAL g, PCSZ fn); virtual bool OpenTempFile(PGLOBAL g); virtual bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL); virtual bool CleanUnusedSpace(PGLOBAL g); diff --git a/storage/connect/filamzip.cpp b/storage/connect/filamzip.cpp index 3d157da5e87..dfd9343af76 100644 --- a/storage/connect/filamzip.cpp +++ b/storage/connect/filamzip.cpp @@ -1,7 +1,7 @@ /*********** File AM Zip C++ Program Source Code File (.CPP) ***********/ /* PROGRAM NAME: FILAMZIP */ /* ------------- */ -/* Version 1.1 */ +/* Version 1.3 */ /* */ /* COPYRIGHT: */ /* ---------- */ @@ -45,12 +45,12 @@ #define WRITEBUFFERSIZE (16384) -bool ZipLoadFile(PGLOBAL g, char *zfn, char *fn, char *entry, bool append, bool mul); +bool ZipLoadFile(PGLOBAL g, PCSZ zfn, PCSZ fn, PCSZ entry, bool append, bool mul); /***********************************************************************/ /* Compress a file in zip when creating a table. */ /***********************************************************************/ -static bool ZipFile(PGLOBAL g, ZIPUTIL *zutp, char *fn, char *entry, char *buf) +static bool ZipFile(PGLOBAL g, ZIPUTIL *zutp, PCSZ fn, PCSZ entry, char *buf) { int rc = RC_OK, size_read, size_buf = WRITEBUFFERSIZE; FILE *fin; @@ -88,7 +88,7 @@ static bool ZipFile(PGLOBAL g, ZIPUTIL *zutp, char *fn, char *entry, char *buf) /***********************************************************************/ /* Find and Compress several files in zip when creating a table. */ /***********************************************************************/ -static bool ZipFiles(PGLOBAL g, ZIPUTIL *zutp, char *pat, char *buf) +static bool ZipFiles(PGLOBAL g, ZIPUTIL *zutp, PCSZ pat, char *buf) { char filename[_MAX_PATH]; int rc; @@ -203,7 +203,7 @@ static bool ZipFiles(PGLOBAL g, ZIPUTIL *zutp, char *pat, char *buf) /***********************************************************************/ /* Load and Compress a file in zip when creating a table. */ /***********************************************************************/ -bool ZipLoadFile(PGLOBAL g, char *zfn, char *fn, char *entry, bool append, bool mul) +bool ZipLoadFile(PGLOBAL g, PCSZ zfn, PCSZ fn, PCSZ entry, bool append, bool mul) { char *buf; bool err; @@ -228,7 +228,7 @@ bool ZipLoadFile(PGLOBAL g, char *zfn, char *fn, char *entry, bool append, bool /***********************************************************************/ /* Constructors. */ /***********************************************************************/ -ZIPUTIL::ZIPUTIL(PSZ tgt) +ZIPUTIL::ZIPUTIL(PCSZ tgt) { zipfile = NULL; target = tgt; @@ -269,7 +269,7 @@ void ZIPUTIL::getTime(tm_zip& tmZip) /* append: set true to append the zip file */ /* return: true if open, false otherwise. */ /***********************************************************************/ -bool ZIPUTIL::open(PGLOBAL g, char *filename, bool append) +bool ZIPUTIL::open(PGLOBAL g, PCSZ filename, bool append) { if (!zipfile && !(zipfile = zipOpen64(filename, append ? APPEND_STATUS_ADDINZIP @@ -290,12 +290,15 @@ void ZIPUTIL::close() zipfile = NULL; } // endif zipfile + if (fp) + fp->Count = 0; + } // end of close /***********************************************************************/ /* OpenTableFile: Open a DOS/UNIX table file from a ZIP file. */ /***********************************************************************/ -bool ZIPUTIL::OpenTable(PGLOBAL g, MODE mode, char *fn, bool append) +bool ZIPUTIL::OpenTable(PGLOBAL g, MODE mode, PCSZ fn, bool append) { /*********************************************************************/ /* The file will be compressed. */ @@ -338,10 +341,10 @@ bool ZIPUTIL::OpenTable(PGLOBAL g, MODE mode, char *fn, bool append) /***********************************************************************/ /* Add target in zip file. */ /***********************************************************************/ -bool ZIPUTIL::addEntry(PGLOBAL g, char *entry) +bool ZIPUTIL::addEntry(PGLOBAL g, PCSZ entry) { //?? we dont need the stinking time - zip_fileinfo zi = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + zip_fileinfo zi = { {0, 0, 0, 0, 0, 0}, 0, 0, 0 }; getTime(zi.tmz_date); target = entry; @@ -382,10 +385,11 @@ void ZIPUTIL::closeEntry() /***********************************************************************/ /* Constructors. */ /***********************************************************************/ -UNZIPUTL::UNZIPUTL(PSZ tgt, bool mul) +UNZIPUTL::UNZIPUTL(PCSZ tgt, bool mul) { zipfile = NULL; target = tgt; + pwd = NULL; fp = NULL; memory = NULL; size = 0; @@ -401,6 +405,26 @@ UNZIPUTL::UNZIPUTL(PSZ tgt, bool mul) #endif } // end of UNZIPUTL standard constructor +UNZIPUTL::UNZIPUTL(PDOSDEF tdp) +{ + zipfile = NULL; + target = tdp->GetEntry(); + pwd = tdp->Pwd; + fp = NULL; + memory = NULL; + size = 0; + entryopen = false; + multiple = tdp->GetMul(); + memset(fn, 0, sizeof(fn)); + + // Init the case mapping table. +#if defined(__WIN__) + for (int i = 0; i < 256; ++i) mapCaseTable[i] = toupper(i); +#else + for (int i = 0; i < 256; ++i) mapCaseTable[i] = i; +#endif +} // end of UNZIPUTL standard constructor + #if 0 UNZIPUTL::UNZIPUTL(PZIPUTIL zutp) { @@ -418,8 +442,8 @@ UNZIPUTL::UNZIPUTL(PZIPUTIL zutp) /* This code is the copyright property of Alessandro Felice Cantatore. */ /* http://xoomer.virgilio.it/acantato/dev/wildcard/wildmatch.html */ /***********************************************************************/ -bool UNZIPUTL::WildMatch(PSZ pat, PSZ str) { - PSZ s, p; +bool UNZIPUTL::WildMatch(PCSZ pat, PCSZ str) { + PCSZ s, p; bool star = FALSE; loopStart: @@ -434,7 +458,7 @@ loopStart: if (!*++pat) return TRUE; goto loopStart; default: - if (mapCaseTable[(uchar)*s] != mapCaseTable[(uchar)*p]) + if (mapCaseTable[(uint)*s] != mapCaseTable[(uint)*p]) goto starCheck; break; } /* endswitch */ @@ -453,7 +477,7 @@ starCheck: /* param: filename path and the filename of the zip file to open. */ /* return: true if open, false otherwise. */ /***********************************************************************/ -bool UNZIPUTL::open(PGLOBAL g, char *filename) +bool UNZIPUTL::open(PGLOBAL g, PCSZ filename) { if (!zipfile && !(zipfile = unzOpen64(filename))) sprintf(g->Message, "Zipfile open error on %s", filename); @@ -472,6 +496,9 @@ void UNZIPUTL::close() zipfile = NULL; } // endif zipfile + if (fp) + fp->Count = 0; + } // end of close /***********************************************************************/ @@ -543,7 +570,7 @@ int UNZIPUTL::nextEntry(PGLOBAL g) /***********************************************************************/ /* OpenTableFile: Open a DOS/UNIX table file from a ZIP file. */ /***********************************************************************/ -bool UNZIPUTL::OpenTable(PGLOBAL g, MODE mode, char *fn) +bool UNZIPUTL::OpenTable(PGLOBAL g, MODE mode, PCSZ fn) { /*********************************************************************/ /* The file will be decompressed into virtual memory. */ @@ -581,7 +608,7 @@ bool UNZIPUTL::OpenTable(PGLOBAL g, MODE mode, char *fn) if (openEntry(g)) return true; - if (size > 0) { + if (size > 0) { /*******************************************************************/ /* Link a Fblock. This make possible to automatically close it */ /* in case of error g->jump. */ @@ -612,6 +639,28 @@ bool UNZIPUTL::OpenTable(PGLOBAL g, MODE mode, char *fn) return false; } // end of OpenTableFile +/***********************************************************************/ +/* Insert only if the entry does not exist. */ +/***********************************************************************/ +bool UNZIPUTL::IsInsertOk(PGLOBAL g, PCSZ fn) +{ + bool ok = true, b = open(g, fn); + + if (!b) { + if (!target || *target == 0) { + unz_global_info64 ginfo; + int err = unzGetGlobalInfo64(zipfile, &ginfo); + + ok = !(err == UNZ_OK && ginfo.number_entry > 0); + } else // Check if the target exist + ok = (unzLocateFile(zipfile, target, 0) != UNZ_OK); + + unzClose(zipfile); + } // endif b + + return ok; +} // end of IsInsertOk + /***********************************************************************/ /* Open target in zip file. */ /***********************************************************************/ @@ -625,18 +674,24 @@ bool UNZIPUTL::openEntry(PGLOBAL g) if (rc != UNZ_OK) { sprintf(g->Message, "unzGetCurrentFileInfo64 rc=%d", rc); return true; - } else if ((rc = unzOpenCurrentFile(zipfile)) != UNZ_OK) { + } else if ((rc = unzOpenCurrentFilePassword(zipfile, pwd)) != UNZ_OK) { sprintf(g->Message, "unzOpen fn=%s rc=%d", fn, rc); return true; } // endif rc size = finfo.uncompressed_size; - memory = new char[size + 1]; + + try { + memory = new char[size + 1]; + } catch (...) { + strcpy(g->Message, "Out of memory"); + return true; + } // end try/catch if ((rc = unzReadCurrentFile(zipfile, memory, size)) < 0) { sprintf(g->Message, "unzReadCurrentFile rc = %d", rc); unzCloseCurrentFile(zipfile); - free(memory); + delete[] memory; memory = NULL; entryopen = false; } else { @@ -661,7 +716,7 @@ void UNZIPUTL::closeEntry() } // endif entryopen if (memory) { - free(memory); + delete[] memory; memory = NULL; } // endif memory @@ -675,15 +730,17 @@ void UNZIPUTL::closeEntry() UNZFAM::UNZFAM(PDOSDEF tdp) : MAPFAM(tdp) { zutp = NULL; - target = tdp->GetEntry(); - mul = tdp->GetMul(); + tdfp = tdp; + //target = tdp->GetEntry(); + //mul = tdp->GetMul(); } // end of UNZFAM standard constructor UNZFAM::UNZFAM(PUNZFAM txfp) : MAPFAM(txfp) { zutp = txfp->zutp; - target = txfp->target; - mul = txfp->mul; + tdfp = txfp->tdfp; + //target = txfp->target; + //mul = txfp->mul; } // end of UNZFAM copy constructor /***********************************************************************/ @@ -711,7 +768,13 @@ int UNZFAM::Cardinality(PGLOBAL g) int card = -1; int len = GetFileLength(g); - card = (len / (int)Lrecl) * 2; // Estimated ??? + if (len) { + // Estimated ??? + card = (len / (int)Lrecl) * 2; + card = card ? card : 10; // Lrecl can be too big + } else + card = 0; + return card; } // end of Cardinality @@ -726,7 +789,7 @@ bool UNZFAM::OpenTableFile(PGLOBAL g) /*********************************************************************/ /* Allocate the ZIP utility class. */ /*********************************************************************/ - zutp = new(g) UNZIPUTL(target, mul); + zutp = new(g) UNZIPUTL(tdfp); // We used the file name relative to recorded datapath PlugSetPath(filename, To_File, Tdbp->GetPath()); @@ -841,17 +904,19 @@ void UNZFAM::CloseTableFile(PGLOBAL g, bool) UZXFAM::UZXFAM(PDOSDEF tdp) : MPXFAM(tdp) { zutp = NULL; - target = tdp->GetEntry(); - mul = tdp->GetMul(); + tdfp = tdp; + //target = tdp->GetEntry(); + //mul = tdp->GetMul(); //Lrecl = tdp->GetLrecl(); } // end of UZXFAM standard constructor UZXFAM::UZXFAM(PUZXFAM txfp) : MPXFAM(txfp) { zutp = txfp->zutp; - target = txfp->target; - mul = txfp->mul; -//Lrecl = txfp->Lrecl; + tdfp = txfp->tdfp; + //target = txfp->target; + //mul = txfp->mul; + //Lrecl = txfp->Lrecl; } // end of UZXFAM copy constructor /***********************************************************************/ @@ -907,7 +972,7 @@ bool UZXFAM::OpenTableFile(PGLOBAL g) /* Allocate the ZIP utility class. */ /*********************************************************************/ if (!zutp) - zutp = new(g)UNZIPUTL(target, mul); + zutp = new(g)UNZIPUTL(tdfp); // We used the file name relative to recorded datapath PlugSetPath(filename, To_File, Tdbp->GetPath()); @@ -969,6 +1034,25 @@ bool ZIPFAM::OpenTableFile(PGLOBAL g) { char filename[_MAX_PATH]; MODE mode = Tdbp->GetMode(); + int len = TXTFAM::GetFileLength(g); + + // We used the file name relative to recorded datapath + PlugSetPath(filename, To_File, Tdbp->GetPath()); + + if (len < 0) + return true; + else if (!append && len > 0) { + strcpy(g->Message, "No insert into existing zip file"); + return true; + } else if (append && len > 0) { + UNZIPUTL *zutp = new(g) UNZIPUTL(target, false); + + if (!zutp->IsInsertOk(g, filename)) { + strcpy(g->Message, "No insert into existing entry"); + return true; + } // endif Ok + + } // endif's /*********************************************************************/ /* Allocate the ZIP utility class. */ @@ -1028,15 +1112,31 @@ ZPXFAM::ZPXFAM(PDOSDEF tdp) : FIXFAM(tdp) target = tdp->GetEntry(); append = tdp->GetAppend(); //Lrecl = tdp->GetLrecl(); -} // end of UZXFAM standard constructor +} // end of ZPXFAM standard constructor /***********************************************************************/ /* OpenTableFile: Open a DOS/UNIX table file from a ZIP file. */ /***********************************************************************/ bool ZPXFAM::OpenTableFile(PGLOBAL g) { - char filename[_MAX_PATH]; - MODE mode = Tdbp->GetMode(); + char filename[_MAX_PATH]; + MODE mode = Tdbp->GetMode(); + int len = TXTFAM::GetFileLength(g); + + if (len < 0) + return true; + else if (!append && len > 0) { + strcpy(g->Message, "No insert into existing zip file"); + return true; + } else if (append && len > 0) { + UNZIPUTL *zutp = new(g) UNZIPUTL(target, false); + + if (!zutp->IsInsertOk(g, filename)) { + strcpy(g->Message, "No insert into existing entry"); + return true; + } // endif Ok + + } // endif's /*********************************************************************/ /* Allocate the ZIP utility class. */ diff --git a/storage/connect/filamzip.h b/storage/connect/filamzip.h index 3160703bd20..be17d954728 100644 --- a/storage/connect/filamzip.h +++ b/storage/connect/filamzip.h @@ -1,5 +1,5 @@ /************** filamzip H Declares Source Code File (.H) **************/ -/* Name: filamzip.h Version 1.1 */ +/* Name: filamzip.h Version 1.2 */ /* */ /* (C) Copyright to the author Olivier BERTRAND 2016-2017 */ /* */ @@ -27,16 +27,13 @@ typedef class ZPXFAM *PZPXFAM; class DllExport ZIPUTIL : public BLOCK { public: // Constructor - ZIPUTIL(PSZ tgt); + ZIPUTIL(PCSZ tgt); //ZIPUTIL(ZIPUTIL *zutp); - // Implementation - //PTXF Duplicate(PGLOBAL g) { return (PTXF) new(g)UNZFAM(this); } - // Methods - bool OpenTable(PGLOBAL g, MODE mode, char *fn, bool append); - bool open(PGLOBAL g, char *fn, bool append); - bool addEntry(PGLOBAL g, char *entry); + bool OpenTable(PGLOBAL g, MODE mode, PCSZ fn, bool append); + bool open(PGLOBAL g, PCSZ fn, bool append); + bool addEntry(PGLOBAL g, PCSZ entry); void close(void); void closeEntry(void); int writeEntry(PGLOBAL g, char *buf, int len); @@ -44,15 +41,10 @@ class DllExport ZIPUTIL : public BLOCK { // Members zipFile zipfile; // The ZIP container file - PSZ target; // The target file name -//unz_file_info finfo; // The current file info + PCSZ target; // The target file name + PCSZ pwd; // The ZIP file password PFBLOCK fp; -//char *memory; -//uint size; -//int multiple; // Multiple targets bool entryopen; // True when open current entry -//char fn[FILENAME_MAX]; // The current entry file name -//char mapCaseTable[256]; }; // end of ZIPUTIL /***********************************************************************/ @@ -61,25 +53,27 @@ class DllExport ZIPUTIL : public BLOCK { class DllExport UNZIPUTL : public BLOCK { public: // Constructor - UNZIPUTL(PSZ tgt, bool mul); -//UNZIPUTL(UNZIPUTL *zutp); + UNZIPUTL(PCSZ tgt, bool mul); + UNZIPUTL(PDOSDEF tdp); // Implementation //PTXF Duplicate(PGLOBAL g) { return (PTXF) new(g)UNZFAM(this); } // Methods - bool OpenTable(PGLOBAL g, MODE mode, char *fn); - bool open(PGLOBAL g, char *fn); + bool OpenTable(PGLOBAL g, MODE mode, PCSZ fn); + bool open(PGLOBAL g, PCSZ fn); bool openEntry(PGLOBAL g); void close(void); void closeEntry(void); - bool WildMatch(PSZ pat, PSZ str); + bool WildMatch(PCSZ pat, PCSZ str); int findEntry(PGLOBAL g, bool next); int nextEntry(PGLOBAL g); + bool IsInsertOk(PGLOBAL g, PCSZ fn); // Members unzFile zipfile; // The ZIP container file - PSZ target; // The target file name + PCSZ target; // The target file name + PCSZ pwd; // The ZIP file password unz_file_info finfo; // The current file info PFBLOCK fp; char *memory; @@ -119,8 +113,7 @@ class DllExport UNZFAM : public MAPFAM { protected: // Members UNZIPUTL *zutp; - PSZ target; - bool mul; + PDOSDEF tdfp; }; // end of UNZFAM /***********************************************************************/ @@ -147,8 +140,7 @@ class DllExport UZXFAM : public MPXFAM { protected: // Members UNZIPUTL *zutp; - PSZ target; - bool mul; + PDOSDEF tdfp; }; // end of UZXFAM /***********************************************************************/ @@ -175,8 +167,9 @@ class DllExport ZIPFAM : public DOSFAM { protected: // Members ZIPUTIL *zutp; - PSZ target; + PCSZ target; bool append; +//bool replace; }; // end of ZIPFAM /***********************************************************************/ @@ -200,7 +193,7 @@ class DllExport ZPXFAM : public FIXFAM { protected: // Members ZIPUTIL *zutp; - PSZ target; + PCSZ target; bool append; }; // end of ZPXFAM diff --git a/storage/connect/filter.cpp b/storage/connect/filter.cpp index 262d6b58a70..bb3be629ea4 100644 --- a/storage/connect/filter.cpp +++ b/storage/connect/filter.cpp @@ -1,7 +1,7 @@ /***************** Filter C++ Class Filter Code (.CPP) *****************/ -/* Name: FILTER.CPP Version 3.9 */ +/* Name: FILTER.CPP Version 4.0 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 1998-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 1998-2017 */ /* */ /* This file contains the class FILTER function code. */ /***********************************************************************/ @@ -33,11 +33,11 @@ #include "tabcol.h" #include "xtable.h" #include "array.h" -//#include "subquery.h" #include "filter.h" -//#include "token.h" -//#include "select.h" #include "xindex.h" +#if defined(MONGO_SUPPORT) || defined(JDBC_SUPPORT) +#include "tabext.h" +#endif // MONGO_SUPPORT || JDBC_SUPPORT /***********************************************************************/ /* Utility routines. */ @@ -87,8 +87,8 @@ BYTE OpBmp(PGLOBAL g, OPVAL opc) case OP_EXIST: bt = 0x00; break; default: sprintf(g->Message, MSG(BAD_FILTER_OP), opc); - longjmp(g->jumper[g->jump_level], TYPE_ARRAY); - } // endswitch opc + throw (int)TYPE_FILTER; + } // endswitch opc return bt; } // end of OpBmp @@ -1193,7 +1193,7 @@ bool FILTER::Convert(PGLOBAL g, bool having) Arg(0) = pXVOID; } // endif void - // pass thru + // fall through case OP_IN: // For IN operator do optimize if operand is an array if (GetArgType(1) != TYPE_ARRAY) @@ -1260,6 +1260,7 @@ bool FILTER::Eval(PGLOBAL g) } // endif Opm // For modified operators, pass thru + /* fall through */ case OP_IN: case OP_EXIST: // For IN operations, special processing is done here @@ -1405,10 +1406,90 @@ PFIL FILTER::Copy(PTABS t) } // end of Copy #endif // 0 +#if defined(MONGO_SUPPORT) +/***********************************************************************/ +/* Make selector json representation for Mongo tables. */ +/***********************************************************************/ +bool FILTER::MakeSelector(PGLOBAL g, PSTRG s) +{ + s->Append('{'); + + if (Opc == OP_AND || Opc == OP_OR) { + if (GetArgType(0) != TYPE_FILTER || GetArgType(1) != TYPE_FILTER) + return true; + + s->Append("\"$"); + s->Append(Opc == OP_AND ? "and" : "or"); + s->Append("\":["); + + if (((PFIL)Arg(0))->MakeSelector(g, s)) + return true; + + s->Append(','); + + if (((PFIL)Arg(1))->MakeSelector(g, s)) + return true; + + s->Append(']'); + } else { + if (GetArgType(0) != TYPE_COLBLK) + return true; + + s->Append('"'); + s->Append(((PCOL)Arg(0))->GetJpath(g, false)); + s->Append("\":{\"$"); + + switch (Opc) { + case OP_EQ: + s->Append("eq"); + break; + case OP_NE: + s->Append("ne"); + break; + case OP_GT: + s->Append("gt"); + break; + case OP_GE: + s->Append("gte"); + break; + case OP_LT: + s->Append("lt"); + break; + case OP_LE: + s->Append("lte"); + break; + case OP_NULL: + case OP_LIKE: + case OP_EXIST: + default: + return true; + } // endswitch Opc + + s->Append("\":"); + + if (GetArgType(1) == TYPE_COLBLK) { + s->Append("\"$"); + s->Append(((PEXTCOL)Arg(1))->GetJpath(g, false)); + s->Append('"'); + } else { + char buf[501]; + + Arg(1)->Prints(g, buf, 500); + s->Append(buf); + } // endif Type + + s->Append('}'); + } // endif Opc + + s->Append('}'); + return false; +} // end of MakeSelector +#endif // MONGO_SUPPORT + /*********************************************************************/ /* Make file output of FILTER contents. */ /*********************************************************************/ -void FILTER::Print(PGLOBAL g, FILE *f, uint n) +void FILTER::Printf(PGLOBAL g, FILE *f, uint n) { char m[64]; @@ -1430,18 +1511,18 @@ void FILTER::Print(PGLOBAL g, FILE *f, uint n) if (lin && fp->GetArgType(i) == TYPE_FILTER) fprintf(f, "%s Filter at %p\n", m, fp->Arg(i)); else - fp->Arg(i)->Print(g, f, n + 2); + fp->Arg(i)->Printf(g, f, n + 2); } // endfor i } // endfor fp - } // end of Print + } // end of Printf /***********************************************************************/ /* Make string output of TABLE contents (z should be checked). */ /***********************************************************************/ -void FILTER::Print(PGLOBAL g, char *ps, uint z) +void FILTER::Prints(PGLOBAL g, char *ps, uint z) { #define FLEN 100 @@ -1469,7 +1550,7 @@ void FILTER::Print(PGLOBAL g, char *ps, uint z) bcp = bxp; p = bcp->Cold; n = FLEN; - fp->Arg(0)->Print(g, p, n); + fp->Arg(0)->Prints(g, p, n); n = FLEN - strlen(p); switch (fp->Opc) { @@ -1515,7 +1596,7 @@ void FILTER::Print(PGLOBAL g, char *ps, uint z) n = FLEN - strlen(p); p += strlen(p); - fp->Arg(1)->Print(g, p, n); + fp->Arg(1)->Prints(g, p, n); } else if (!bcp) { strncat(ps, "???", z); @@ -1578,7 +1659,7 @@ void FILTER::Print(PGLOBAL g, char *ps, uint z) bcp = bxp; } while (bcp); // enddo - } // end of Print + } // end of Prints /* -------------------- Derived Classes Functions -------------------- */ @@ -1696,8 +1777,6 @@ PFIL PrepareFilter(PGLOBAL g, PFIL fp, bool having) if (trace) htrc("PrepareFilter: fp=%p having=%d\n", fp, having); -//if (fp) -// fp->Print(g, debug, 0); while (fp) { if (fp->Opc == OP_SEP) @@ -1711,7 +1790,7 @@ PFIL PrepareFilter(PGLOBAL g, PFIL fp, bool having) break; // Remove eventual ending separator(s) // if (fp->Convert(g, having)) -// longjmp(g->jumper[g->jump_level], TYPE_FILTER); +// throw (int)TYPE_FILTER; filp = fp; fp = fp->Next; @@ -1720,8 +1799,6 @@ PFIL PrepareFilter(PGLOBAL g, PFIL fp, bool having) if (trace) htrc(" returning filp=%p\n", filp); -//if (filp) -// filp->Print(g, debug, 0); return filp; } // end of PrepareFilter @@ -1744,7 +1821,7 @@ DllExport bool ApplyFilter(PGLOBAL g, PFIL filp) // return TRUE; if (filp->Eval(g)) - longjmp(g->jumper[g->jump_level], TYPE_FILTER); + throw (int)TYPE_FILTER; if (trace > 1) htrc("PlugFilter filp=%p result=%d\n", diff --git a/storage/connect/filter.h b/storage/connect/filter.h index 15730e2cc44..11b77aec132 100644 --- a/storage/connect/filter.h +++ b/storage/connect/filter.h @@ -1,7 +1,7 @@ /*************** Filter H Declares Source Code File (.H) ***************/ -/* Name: FILTER.H Version 1.2 */ +/* Name: FILTER.H Version 1.3 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2010-2015 */ +/* (C) Copyright to the author Olivier BERTRAND 2010-2017 */ /* */ /* This file contains the FILTER and derived classes declares. */ /***********************************************************************/ @@ -61,8 +61,11 @@ class DllExport FILTER : public XOBJECT { /* Filter description block */ //virtual PXOB CheckSubQuery(PGLOBAL, PSQL); //virtual bool CheckLocal(PTDB); //virtual int CheckSpcCol(PTDB tdbp, int n); - virtual void Print(PGLOBAL g, FILE *f, uint n); - virtual void Print(PGLOBAL g, char *ps, uint z); +#if defined(MONGO_SUPPORT) + bool MakeSelector(PGLOBAL g, PSTRG s); +#endif // MONGO_SUPPORT + virtual void Printf(PGLOBAL g, FILE *f, uint n); + virtual void Prints(PGLOBAL g, char *ps, uint z); // PFIL Linearize(bool nosep); // PFIL Link(PGLOBAL g, PFIL fil2); // PFIL RemoveLastSep(void); diff --git a/storage/connect/fmdlex.c b/storage/connect/fmdlex.c index 548a7ae5b7e..ef4f7bfc65a 100644 --- a/storage/connect/fmdlex.c +++ b/storage/connect/fmdlex.c @@ -529,7 +529,7 @@ YY_DECL pp->Num = 0; if (pp->InFmt) {*pp->InFmt = '\0'; pp->InFmt[pp->Outsize -1] = '\0'; } if (pp->OutFmt) {*pp->OutFmt = '\0'; pp->OutFmt[pp->Outsize -1] = '\0'; } - pp->Curp = pp->Format; + pp->Curp = (char*) pp->Format; yy_init = 1; /* This is a new input */ diff --git a/storage/connect/global.h b/storage/connect/global.h index 4d01a3ff05b..de7a9fb3c03 100644 --- a/storage/connect/global.h +++ b/storage/connect/global.h @@ -1,6 +1,7 @@ /***********************************************************************/ /* GLOBAL.H: Declaration file used by all CONNECT implementations. */ -/* (C) Copyright Olivier Bertrand 1993-2014 */ +/* (C) Copyright MariaDB Corporation Ab */ +/* Author Olivier Bertrand 1993-2017 */ /***********************************************************************/ /***********************************************************************/ @@ -57,31 +58,10 @@ /* Miscellaneous Constants */ /***********************************************************************/ #define NO_IVAL -95684275 /* Used by GetIntegerOption */ -#define VMLANG 370 /* Size of olf VM lang blocks */ #define MAX_JUMP 24 /* Maximum jump level number */ -#define MAX_STR 1024 /* Maximum string length */ -#define STR_SIZE 501 /* Length of char strings. */ -#define STD_INPUT 0 /* Standard language input */ -#define STD_OUTPUT 1 /* Standard language output */ -#define ERROR_OUTPUT 2 /* Error message output */ -#define DEBUG_OUTPUT 3 /* Debug info output */ -#define PROMPT_OUTPUT 4 /* Prompt message output */ -#define COPY_OUTPUT 5 /* Copy of language input */ -#define STD_MSG 6 /* System message file */ -#define DEBUG_MSG 7 /* Debug message file */ -#define DUMMY 0 /* Dummy file index in Ldm block */ -#define STDIN 1 /* stdin file index in Ldm block */ -#define STDOUT 2 /* stdout file index in Ldm block */ -#define STDERR 3 /* stderr file index in Ldm block */ -#define STDEBUG 4 /* debug file index in Ldm block */ -#define STDPRN 5 /* stdprn file index in Ldm block */ -#define STDFREE 6 /* Free file index in Ldm block */ +#define MAX_STR 4160 /* Maximum message length */ -#define TYPE_SEM -2 /* Returned semantic function */ -#define TYPE_DFONC -2 /* Indirect sem ref in FPARM */ #define TYPE_VOID -1 -#define TYPE_SBPAR -1 /* Phrase reference in FPARM */ -#define TYPE_SEMX 0 /* Initial semantic function type? */ #define TYPE_ERROR 0 #define TYPE_STRING 1 #define TYPE_DOUBLE 2 @@ -90,26 +70,11 @@ #define TYPE_BIGINT 5 #define TYPE_LIST 6 #define TYPE_INT 7 +#define TYPE_DATE 8 #define TYPE_DECIM 9 #define TYPE_BIN 10 #define TYPE_PCHAR 11 -#if defined(OS32) - #define SYS_STAMP "OS32" -#elif defined(UNIX) || defined(LINUX) || defined(UNIV_LINUX) - #define SYS_STAMP "UNIX" -#elif defined(OS16) - #define SYS_STAMP "OS16" -#elif defined(DOSR) - #define SYS_STAMP "DOSR" -#elif defined(WIN) - #define SYS_STAMP "WIN1" -#elif defined(__WIN__) - #define SYS_STAMP "WIN2" -#else - #define SYS_STAMP "XXXX" -#endif - #if defined(__cplusplus) extern "C" { #endif @@ -117,11 +82,6 @@ extern "C" { /***********************************************************************/ /* Static variables */ /***********************************************************************/ -#if defined(STORAGE) - char sys_stamp[5] = SYS_STAMP; -#else - extern char sys_stamp[]; -#endif /***********************************************************************/ /* File-Selection Indicators */ @@ -229,9 +189,10 @@ typedef struct _parm { typedef struct _global { /* Global structure */ void *Sarea; /* Points to work area */ uint Sarea_Size; /* Work area size */ - PACTIVITY Activityp, ActivityStart; + PACTIVITY Activityp; char Message[MAX_STR]; - int Createas; /* To pass info to created table */ + ulong More; /* Used by jsonudf */ + int Createas; /* To pass info to created table */ void *Xchk; /* indexes in create/alter */ short Alchecked; /* Checked for ALTER */ short Mrr; /* True when doing mrr */ diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index f2727ba15f7..458369cd981 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -1,4 +1,4 @@ -/* Copyright (C) Olivier Bertrand 2004 - 2017 +/* Copyright (C) MariaDB Corporation Ab This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -98,9 +98,8 @@ rnd_next signals that it has reached the end of its data. Calls to ha_connect::extra() are hints as to what will be occuring to the request. - Happy use!
- -Olivier -*/ + Author Olivier Bertrand + */ #ifdef USE_PRAGMA_IMPLEMENTATION #pragma implementation // gcc: Class implementation @@ -172,15 +171,19 @@ #define JSONMAX 10 // JSON Default max grp size extern "C" { - char version[]= "Version 1.05.0003 February 27, 2017"; + char version[]= "Version 1.06.0001 April 17, 2017"; #if defined(__WIN__) - char compver[]= "Version 1.05.0003 " __DATE__ " " __TIME__; + char compver[]= "Version 1.06.0001 " __DATE__ " " __TIME__; char slash= '\\'; #else // !__WIN__ char slash= '/'; #endif // !__WIN__ } // extern "C" +#if defined(NEW_MAR) +#define stored_in_db stored_in_db() +#endif // NEW_MAR) + #if defined(XMAP) my_bool xmap= false; #endif // XMAP @@ -198,28 +201,33 @@ extern "C" { char *ClassPath; #endif // JDBC_SUPPORT -#if defined(__WIN__) -CRITICAL_SECTION parsec; // Used calling the Flex parser -#else // !__WIN__ -pthread_mutex_t parmut = PTHREAD_MUTEX_INITIALIZER; -#endif // !__WIN__ +pthread_mutex_t parmut; +pthread_mutex_t usrmut; +pthread_mutex_t tblmut; /***********************************************************************/ /* Utility functions. */ /***********************************************************************/ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info); PQRYRES VirColumns(PGLOBAL g, bool info); -PQRYRES JSONColumns(PGLOBAL g, char *db, PTOS topt, bool info); +PQRYRES JSONColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt, bool info); PQRYRES XMLColumns(PGLOBAL g, char *db, char *tab, PTOS topt, bool info); +#if defined(MONGO_SUPPORT) +PQRYRES MGOColumns(PGLOBAL g, PCSZ db, PCSZ url, PTOS topt, bool info); +#endif // MONGO_SUPPORT int TranslateJDBCType(int stp, char *tn, int prec, int& len, char& v); void PushWarning(PGLOBAL g, THD *thd, int level); -bool CheckSelf(PGLOBAL g, TABLE_SHARE *s, const char *host, - const char *db, char *tab, const char *src, int port); -bool ZipLoadFile(PGLOBAL, char*, char*, char*, bool, bool); +bool CheckSelf(PGLOBAL g, TABLE_SHARE *s, PCSZ host, PCSZ db, + PCSZ tab, PCSZ src, int port); +bool ZipLoadFile(PGLOBAL, PCSZ, PCSZ, PCSZ, bool, bool); bool ExactInfo(void); +#if defined(CMGO_SUPPORT) +void mongo_init(bool); +#endif // CMGO_SUPPORT USETEMP UseTemp(void); int GetConvSize(void); TYPCONV GetTypeConv(void); +char *GetJsonNull(void); uint GetJsonGrpSize(void); char *GetJavaWrapper(void); uint GetWorkSize(void); @@ -329,6 +337,13 @@ static MYSQL_THDVAR_ENUM( 0, // def (no) &xconv_typelib); // typelib +// Null representation for JSON values +static MYSQL_THDVAR_STR(json_null, + PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_MEMALLOC, + "Representation of Json null values", + // check_json_null, update_json_null, + NULL, NULL, ""); + // Estimate max number of rows for JSON aggregate functions static MYSQL_THDVAR_UINT(json_grp_size, PLUGIN_VAR_RQCMDARG, // opt @@ -340,7 +355,7 @@ static MYSQL_THDVAR_UINT(json_grp_size, static MYSQL_THDVAR_STR(java_wrapper, PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_MEMALLOC, "Java wrapper class name", - // check_class_path, update_class_path, + // check_java_wrapper, update_java_wrapper, NULL, NULL, "wrappers/JdbcInterface"); #endif // JDBC_SUPPORT @@ -380,6 +395,8 @@ bool ExactInfo(void) {return THDVAR(current_thd, exact_info);} USETEMP UseTemp(void) {return (USETEMP)THDVAR(current_thd, use_tempfile);} int GetConvSize(void) {return THDVAR(current_thd, conv_size);} TYPCONV GetTypeConv(void) {return (TYPCONV)THDVAR(current_thd, type_conv);} +char *GetJsonNull(void) + {return connect_hton ? THDVAR(current_thd, json_null) : NULL;} uint GetJsonGrpSize(void) {return connect_hton ? THDVAR(current_thd, json_grp_size) : 10;} uint GetWorkSize(void) {return THDVAR(current_thd, work_size);} @@ -504,12 +521,13 @@ ha_create_table_option connect_table_option_list[]= HA_TOPTION_STRING("CATFUNC", catfunc), HA_TOPTION_STRING("SRCDEF", srcdef), HA_TOPTION_STRING("COLIST", colist), - HA_TOPTION_STRING("OPTION_LIST", oplist), + HA_TOPTION_STRING("FILTER", filter), + HA_TOPTION_STRING("OPTION_LIST", oplist), HA_TOPTION_STRING("DATA_CHARSET", data_charset), HA_TOPTION_NUMBER("LRECL", lrecl, 0, 0, INT_MAX32, 1), HA_TOPTION_NUMBER("BLOCK_SIZE", elements, 0, 0, INT_MAX32, 1), //HA_TOPTION_NUMBER("ESTIMATE", estimate, 0, 0, INT_MAX32, 1), - HA_TOPTION_NUMBER("MULTIPLE", multiple, 0, 0, 2, 1), + HA_TOPTION_NUMBER("MULTIPLE", multiple, 0, 0, 3, 1), HA_TOPTION_NUMBER("HEADER", header, 0, 0, 3, 1), HA_TOPTION_NUMBER("QUOTED", quoted, (ulonglong) -1, 0, 3, 1), HA_TOPTION_NUMBER("ENDING", ending, (ulonglong) -1, 0, INT_MAX32, 1), @@ -665,15 +683,21 @@ static int connect_init_func(void *p) #if defined(__WIN__) sql_print_information("CONNECT: %s", compver); - InitializeCriticalSection((LPCRITICAL_SECTION)&parsec); #else // !__WIN__ sql_print_information("CONNECT: %s", version); #endif // !__WIN__ + pthread_mutex_init(&parmut, NULL); + pthread_mutex_init(&usrmut, NULL); + pthread_mutex_init(&tblmut, NULL); -#ifdef LIBXML2_SUPPORT +#if defined(LIBXML2_SUPPORT) XmlInitParserLib(); #endif // LIBXML2_SUPPORT +#if defined(CMGO_SUPPORT) + mongo_init(true); +#endif // CMGO_SUPPORT + init_connect_psi_keys(); connect_hton= (handlerton *)p; @@ -692,7 +716,7 @@ static int connect_init_func(void *p) DTVAL::SetTimeShift(); // Initialize time zone shift once for all BINCOL::SetEndian(); // Initialize host endian setting #if defined(JDBC_SUPPORT) - JDBConn::SetJVM(); + JAVAConn::SetJVM(); #endif // JDBC_SUPPORT DBUG_RETURN(0); } // end of connect_init_func @@ -712,17 +736,20 @@ static int connect_done_func(void *) XmlCleanupParserLib(); #endif // LIBXML2_SUPPORT +#if defined(CMGO_SUPPORT) + mongo_init(false); +#endif // CMGO_SUPPORT + #ifdef JDBC_SUPPORT - JDBConn::ResetJVM(); + JAVAConn::ResetJVM(); #endif // JDBC_SUPPORT -#if defined(__WIN__) - DeleteCriticalSection((LPCRITICAL_SECTION)&parsec); -#else // !__WIN__ +#if !defined(__WIN__) PROFILE_End(); #endif // !__WIN__ - for (pc= user_connect::to_users; pc; pc= pn) { + pthread_mutex_lock(&usrmut); + for (pc= user_connect::to_users; pc; pc= pn) { if (pc->g) PlugCleanup(pc->g, true); @@ -730,6 +757,11 @@ static int connect_done_func(void *) delete pc; } // endfor pc + pthread_mutex_unlock(&usrmut); + + pthread_mutex_destroy(&usrmut); + pthread_mutex_destroy(&parmut); + pthread_mutex_destroy(&tblmut); connect_hton= NULL; DBUG_RETURN(error); } // end of connect_done_func @@ -842,6 +874,7 @@ ha_connect::~ha_connect(void) static void PopUser(PCONNECT xp) { if (xp) { + pthread_mutex_lock(&usrmut); xp->count--; if (!xp->count) { @@ -866,6 +899,7 @@ static void PopUser(PCONNECT xp) delete xp; } // endif count + pthread_mutex_unlock(&usrmut); } // endif xp } // end of PopUser @@ -879,23 +913,36 @@ static PCONNECT GetUser(THD *thd, PCONNECT xp) if (!thd) return NULL; - if (xp && thd == xp->thdp) - return xp; + if (xp) { + if (thd == xp->thdp) + return xp; - for (xp= user_connect::to_users; xp; xp= xp->next) + PopUser(xp); // Avoid memory leak + } // endif xp + + pthread_mutex_lock(&usrmut); + + for (xp= user_connect::to_users; xp; xp= xp->next) if (thd == xp->thdp) break; - if (!xp) { - xp= new user_connect(thd); + if (xp) + xp->count++; - if (xp->user_init()) { - delete xp; - xp= NULL; - } // endif user_init + pthread_mutex_unlock(&usrmut); - } else - xp->count++; + if (!xp) { + xp = new user_connect(thd); + + if (xp->user_init()) { + delete xp; + xp = NULL; + } // endif user_init + + } // endif xp + + //} else + // xp->count++; return xp; } // end of GetUser @@ -1018,43 +1065,60 @@ ulonglong ha_connect::table_flags() const /****************************************************************************/ /* Return the value of an option specified in an option list. */ /****************************************************************************/ -char *GetListOption(PGLOBAL g, const char *opname, - const char *oplist, const char *def) +PCSZ GetListOption(PGLOBAL g, PCSZ opname, PCSZ oplist, PCSZ def) { if (!oplist) return (char*)def; - char key[16], val[256]; - char *pk, *pv, *pn; - char *opval= (char*)def; - int n; + char key[16], val[256]; + char *pv, *pn, *pk = (char*)oplist; + PCSZ opval = def; + int n; - for (pk= (char*)oplist; pk; pk= ++pn) { - pn= strchr(pk, ','); - pv= strchr(pk, '='); + while (*pk == ' ') + pk++; - if (pv && (!pn || pv < pn)) { - n= MY_MIN(static_cast(pv - pk), sizeof(key) - 1); - memcpy(key, pk, n); - key[n]= 0; - pv++; - n= MY_MIN((pn ? pn - pv : strlen(pv)), sizeof(val) - 1); - memcpy(val, pv, n); - val[n]= 0; - } else { - n= MY_MIN((pn ? pn - pk : strlen(pk)), sizeof(key) - 1); - memcpy(key, pk, n); - key[n]= 0; - val[0]= 0; - } // endif pv + for (; pk; pk = pn) { + pn = strchr(pk, ','); + pv = strchr(pk, '='); - if (!stricmp(opname, key)) { - opval= PlugDup(g, val); - break; - } else if (!pn) - break; + if (pv && (!pn || pv < pn)) { + n = MY_MIN(static_cast(pv - pk), sizeof(key) - 1); + memcpy(key, pk, n); - } // endfor pk + while (n && key[n - 1] == ' ') + n--; + + key[n] = 0; + + while (*(++pv) == ' '); + + n = MY_MIN((pn ? pn - pv : strlen(pv)), sizeof(val) - 1); + memcpy(val, pv, n); + + while (n && val[n - 1] == ' ') + n--; + + val[n] = 0; + } else { + n = MY_MIN((pn ? pn - pk : strlen(pk)), sizeof(key) - 1); + memcpy(key, pk, n); + + while (n && key[n - 1] == ' ') + n--; + + key[n] = 0; + val[0] = 0; + } // endif pv + + if (!stricmp(opname, key)) { + opval = PlugDup(g, val); + break; + } else if (!pn) + break; + + while (*(++pn) == ' '); + } // endfor pk return opval; } // end of GetListOption @@ -1062,9 +1126,9 @@ char *GetListOption(PGLOBAL g, const char *opname, /****************************************************************************/ /* Return the value of a string option or NULL if not specified. */ /****************************************************************************/ -char *GetStringTableOption(PGLOBAL g, PTOS options, char *opname, char *sdef) +PCSZ GetStringTableOption(PGLOBAL g, PTOS options, PCSZ opname, PCSZ sdef) { - const char *opval= NULL; + PCSZ opval= NULL; if (!options) return sdef; @@ -1095,7 +1159,9 @@ char *GetStringTableOption(PGLOBAL g, PTOS options, char *opname, char *sdef) opval= options->srcdef; else if (!stricmp(opname, "Colist")) opval= options->colist; - else if (!stricmp(opname, "Data_charset")) + else if (!stricmp(opname, "Filter")) + opval = options->filter; + else if (!stricmp(opname, "Data_charset")) opval= options->data_charset; if (!opval && options->oplist) @@ -1107,10 +1173,10 @@ char *GetStringTableOption(PGLOBAL g, PTOS options, char *opname, char *sdef) /****************************************************************************/ /* Return the value of a Boolean option or bdef if not specified. */ /****************************************************************************/ -bool GetBooleanTableOption(PGLOBAL g, PTOS options, char *opname, bool bdef) +bool GetBooleanTableOption(PGLOBAL g, PTOS options, PCSZ opname, bool bdef) { - bool opval= bdef; - char *pv; + bool opval= bdef; + PCSZ pv; if (!options) return bdef; @@ -1138,7 +1204,7 @@ bool GetBooleanTableOption(PGLOBAL g, PTOS options, char *opname, bool bdef) /****************************************************************************/ /* Return the value of an integer option or NO_IVAL if not specified. */ /****************************************************************************/ -int GetIntegerTableOption(PGLOBAL g, PTOS options, char *opname, int idef) +int GetIntegerTableOption(PGLOBAL g, PTOS options, PCSZ opname, int idef) { ulonglong opval= (ulonglong) NO_IVAL; @@ -1160,10 +1226,10 @@ int GetIntegerTableOption(PGLOBAL g, PTOS options, char *opname, int idef) opval= (options->compressed); if ((ulonglong) opval == (ulonglong)NO_IVAL) { - char *pv; + PCSZ pv; if ((pv= GetListOption(g, opname, options->oplist))) - opval= CharToNumber(pv, strlen(pv), ULONGLONG_MAX, true); + opval= CharToNumber((char*)pv, strlen(pv), ULONGLONG_MAX, true); else return idef; @@ -1188,11 +1254,11 @@ PTOS ha_connect::GetTableOptionStruct(TABLE_SHARE *s) /****************************************************************************/ /* Return the string eventually formatted with partition name. */ /****************************************************************************/ -char *ha_connect::GetRealString(const char *s) +char *ha_connect::GetRealString(PCSZ s) { char *sv; - if (IsPartitioned() && s && *partname) { + if (IsPartitioned() && s && partname && *partname) { sv= (char*)PlugSubAlloc(xp->g, NULL, 0); sprintf(sv, s, partname); PlugSubAlloc(xp->g, NULL, strlen(sv) + 1); @@ -1205,10 +1271,10 @@ char *ha_connect::GetRealString(const char *s) /****************************************************************************/ /* Return the value of a string option or sdef if not specified. */ /****************************************************************************/ -char *ha_connect::GetStringOption(char *opname, char *sdef) +PCSZ ha_connect::GetStringOption(PCSZ opname, PCSZ sdef) { - char *opval= NULL; - PTOS options= GetTableOptionStruct(); + PCSZ opval= NULL; + PTOS options= GetTableOptionStruct(); if (!stricmp(opname, "Connect")) { LEX_STRING cnc= (tshp) ? tshp->connect_string @@ -1267,7 +1333,7 @@ char *ha_connect::GetStringOption(char *opname, char *sdef) /****************************************************************************/ /* Return the value of a Boolean option or bdef if not specified. */ /****************************************************************************/ -bool ha_connect::GetBooleanOption(char *opname, bool bdef) +bool ha_connect::GetBooleanOption(PCSZ opname, bool bdef) { bool opval; PTOS options= GetTableOptionStruct(); @@ -1284,7 +1350,7 @@ bool ha_connect::GetBooleanOption(char *opname, bool bdef) /* Set the value of the opname option (does not work for oplist options) */ /* Currently used only to set the Sepindex value. */ /****************************************************************************/ -bool ha_connect::SetBooleanOption(char *opname, bool b) +bool ha_connect::SetBooleanOption(PCSZ opname, bool b) { PTOS options= GetTableOptionStruct(); @@ -1302,7 +1368,7 @@ bool ha_connect::SetBooleanOption(char *opname, bool b) /****************************************************************************/ /* Return the value of an integer option or NO_IVAL if not specified. */ /****************************************************************************/ -int ha_connect::GetIntegerOption(char *opname) +int ha_connect::GetIntegerOption(PCSZ opname) { int opval; PTOS options= GetTableOptionStruct(); @@ -1322,7 +1388,7 @@ int ha_connect::GetIntegerOption(char *opname) /* Set the value of the opname option (does not work for oplist options) */ /* Currently used only to set the Lrecl value. */ /****************************************************************************/ -bool ha_connect::SetIntegerOption(char *opname, int n) +bool ha_connect::SetIntegerOption(PCSZ opname, int n) { PTOS options= GetTableOptionStruct(); @@ -1427,7 +1493,7 @@ void *ha_connect::GetColumnOption(PGLOBAL g, void *field, PCOLINFO pcf) case MYSQL_TYPE_VARCHAR: case MYSQL_TYPE_VAR_STRING: pcf->Flags |= U_VAR; - /* no break */ + // fall through default: pcf->Type= MYSQLtoPLG(fp->type(), &v); break; @@ -1497,7 +1563,7 @@ void *ha_connect::GetColumnOption(PGLOBAL g, void *field, PCOLINFO pcf) pcf->Flags |= U_NULLS; // Mark virtual columns as such - if (!fp->stored_in_db()) + if (fp->vcol_info && !fp->stored_in_db) pcf->Flags |= U_VIRTUAL; pcf->Key= 0; // Not used when called from MySQL @@ -1522,7 +1588,7 @@ PXOS ha_connect::GetIndexOptionStruct(KEY *kp) /****************************************************************************/ /* Return a Boolean index option or false if not specified. */ /****************************************************************************/ -bool ha_connect::GetIndexOption(KEY *kp, char *opname) +bool ha_connect::GetIndexOption(KEY *kp, PCSZ opname) { bool opval= false; PXOS options= GetIndexOptionStruct(kp); @@ -1534,7 +1600,7 @@ bool ha_connect::GetIndexOption(KEY *kp, char *opname) opval= options->mapped; } else if (kp->comment.str && kp->comment.length) { - char *pv, *oplist= strz(xp->g, kp->comment); + PCSZ pv, oplist= strz(xp->g, kp->comment); if ((pv= GetListOption(xp->g, opname, oplist))) opval= (!*pv || *pv == 'y' || *pv == 'Y' || atoi(pv) != 0); @@ -1739,9 +1805,9 @@ void ha_connect::AddColName(char *cp, Field *fp) /***********************************************************************/ /* This function sets the current database path. */ /***********************************************************************/ -void ha_connect::SetDataPath(PGLOBAL g, const char *path) +bool ha_connect::SetDataPath(PGLOBAL g, const char *path) { - datapath= SetPath(g, path); + return (!(datapath= SetPath(g, path))); } // end of SetDataPath /****************************************************************************/ @@ -1895,40 +1961,36 @@ int ha_connect::OpenTable(PGLOBAL g, bool del) bool ha_connect::CheckColumnList(PGLOBAL g) { // Check the list of used fields (columns) - int rc; bool brc= false; PCOL colp; Field* *field; Field* fp; MY_BITMAP *map= table->read_set; - // Save stack and allocation environment and prepare error return - if (g->jump_level == MAX_JUMP) { - strcpy(g->Message, MSG(TOO_MANY_JUMPS)); - return true; - } // endif jump_level - - if ((rc= setjmp(g->jumper[++g->jump_level])) == 0) { + try { for (field= table->field; fp= *field; field++) if (bitmap_is_set(map, fp->field_index)) { if (!(colp= tdbp->ColDB(g, (PSZ)fp->field_name, 0))) { sprintf(g->Message, "Column %s not found in %s", fp->field_name, tdbp->GetName()); - brc= true; - goto fin; - } // endif colp + throw 1; + } // endif colp if ((brc= colp->InitValue(g))) - goto fin; + throw 2; colp->AddColUse(U_P); // For PLG tables } // endif - } else - brc= true; + } catch (int n) { + if (trace) + htrc("Exception %d: %s\n", n, g->Message); + brc = true; + } catch (const char *msg) { + strcpy(g->Message, msg); + brc = true; + } // end catch - fin: - g->jump_level--; return brc; } // end of CheckColumnList @@ -1965,7 +2027,8 @@ int ha_connect::CloseTable(PGLOBAL g) /***********************************************************************/ int ha_connect::MakeRecord(char *buf) { - char *p, *fmt, val[32]; + PCSZ fmt; + char *p, val[32]; int rc= 0; Field* *field; Field *fp; @@ -1996,7 +2059,7 @@ int ha_connect::MakeRecord(char *buf) for (field= table->field; *field && !rc; field++) { fp= *field; - if (!fp->stored_in_db()) + if (fp->vcol_info && !fp->stored_in_db) continue; // This is a virtual column if (bitmap_is_set(map, fp->field_index) || alter) { @@ -2101,7 +2164,7 @@ int ha_connect::ScanRecord(PGLOBAL g, uchar *) { char attr_buffer[1024]; char data_buffer[1024]; - char *fmt; + PCSZ fmt; int rc= 0; PCOL colp; PVAL value, sdvalin; @@ -2117,7 +2180,8 @@ int ha_connect::ScanRecord(PGLOBAL g, uchar *) for (Field **field=table->field ; *field ; field++) { fp= *field; - if (!fp->stored_in_db() || fp->option_struct->special) + if ((fp->vcol_info && !fp->stored_in_db) || + fp->option_struct->special) continue; // Is a virtual column possible here ??? if ((xmod == MODE_INSERT && tdbp->GetAmType() != TYPE_AM_MYSQL @@ -2274,7 +2338,7 @@ bool ha_connect::MakeKeyWhere(PGLOBAL g, PSTRG qry, OPVAL vop, char q, const uchar *ptr; //uint i, rem, len, klen, stlen; uint i, rem, len, stlen; - bool nq, both, oom= false; + bool nq, both, oom; OPVAL op; Field *fp; const key_range *ranges[2]; @@ -2302,9 +2366,9 @@ bool ha_connect::MakeKeyWhere(PGLOBAL g, PSTRG qry, OPVAL vop, char q, continue; if (both && i > 0) - oom|= qry->Append(") AND ("); + qry->Append(") AND ("); else - oom|= qry->Append(" WHERE ("); + qry->Append(" WHERE ("); // klen= len= ranges[i]->length; len= ranges[i]->length; @@ -2317,14 +2381,14 @@ bool ha_connect::MakeKeyWhere(PGLOBAL g, PSTRG qry, OPVAL vop, char q, nq= fp->str_needs_quotes(); if (kpart != kfp->key_part) - oom|= qry->Append(" AND "); + qry->Append(" AND "); if (q) { - oom|= qry->Append(q); - oom|= qry->Append((PSZ)fp->field_name); - oom|= qry->Append(q); + qry->Append(q); + qry->Append((PSZ)fp->field_name); + qry->Append(q); } else - oom|= qry->Append((PSZ)fp->field_name); + qry->Append((PSZ)fp->field_name); switch (ranges[i]->flag) { case HA_READ_KEY_EXACT: @@ -2349,10 +2413,10 @@ bool ha_connect::MakeKeyWhere(PGLOBAL g, PSTRG qry, OPVAL vop, char q, goto err; } // endswitch flag - oom|= qry->Append((PSZ)GetValStr(op, false)); + qry->Append((PSZ)GetValStr(op, false)); if (nq) - oom|= qry->Append('\''); + qry->Append('\''); if (kpart->key_part_flag & HA_VAR_LENGTH_PART) { String varchar; @@ -2360,17 +2424,17 @@ bool ha_connect::MakeKeyWhere(PGLOBAL g, PSTRG qry, OPVAL vop, char q, varchar.set_quick((char*)ptr + HA_KEY_BLOB_LENGTH, var_length, &my_charset_bin); - oom|= qry->Append(varchar.ptr(), varchar.length(), nq); + qry->Append(varchar.ptr(), varchar.length(), nq); } else { char strbuff[MAX_FIELD_WIDTH]; String str(strbuff, sizeof(strbuff), kpart->field->charset()), *res; res= fp->val_str(&str, ptr); - oom|= qry->Append(res->ptr(), res->length(), nq); + qry->Append(res->ptr(), res->length(), nq); } // endif flag if (nq) - oom |= qry->Append('\''); + qry->Append('\''); if (stlen >= len) break; @@ -2385,7 +2449,9 @@ bool ha_connect::MakeKeyWhere(PGLOBAL g, PSTRG qry, OPVAL vop, char q, } // endfor i - if ((oom|= qry->Append(")"))) + qry->Append(')'); + + if ((oom= qry->IsTruncated())) strcpy(g->Message, "Out of memory"); dbug_tmp_restore_column_map(table->write_set, old_map); @@ -2546,7 +2612,7 @@ PFIL ha_connect::CondFilter(PGLOBAL g, Item *cond) case Item_func::LE_FUNC: vop= OP_LE; break; case Item_func::GE_FUNC: vop= OP_GE; break; case Item_func::GT_FUNC: vop= OP_GT; break; - case Item_func::IN_FUNC: vop= OP_IN; + case Item_func::IN_FUNC: vop= OP_IN; /* fall through */ case Item_func::BETWEEN: ismul= true; neg= ((Item_func_opt_neg *)condf)->negated; @@ -2698,6 +2764,8 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, const Item *cond) if (x) return NULL; + else + pb0= pb1= pb2= ph0= ph1= ph2= NULL; if (trace) htrc("Cond: Ftype=%d name=%s\n", cond_item->functype(), @@ -2799,9 +2867,10 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, const Item *cond) case Item_func::GT_FUNC: vop= OP_GT; break; case Item_func::LIKE_FUNC: vop= OP_LIKE; break; case Item_func::ISNOTNULL_FUNC: - neg = true; + neg = true; + // fall through case Item_func::ISNULL_FUNC: vop= OP_NULL; break; - case Item_func::IN_FUNC: vop= OP_IN; + case Item_func::IN_FUNC: vop= OP_IN; /* fall through */ case Item_func::BETWEEN: ismul= true; neg= ((Item_func_opt_neg *)condf)->negated; @@ -2922,12 +2991,13 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, const Item *cond) strncat(s, res->ptr(), res->length()); if (res->length() < 19) - strcat(s, &"1970-01-01 00:00:00"[res->length()]); + strcat(s, "1970-01-01 00:00:00" + res->length()); strcat(s, "'}"); break; } // endif ODBC + // fall through case MYSQL_TYPE_DATE: if (tty == TYPE_AM_ODBC) { strcat(s, "{d '"); @@ -2951,7 +3021,7 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, const Item *cond) strncat(s, res->ptr(), res->length()); if (res->length() < 19) - strcat(s, &"1970-01-01 00:00:00"[res->length()]); + strcat(s, "1970-01-01 00:00:00" + res->length()); strcat(s, "'}"); break; @@ -3053,7 +3123,6 @@ const COND *ha_connect::cond_push(const COND *cond) DBUG_ENTER("ha_connect::cond_push"); if (tdbp) { - int rc; PGLOBAL& g= xp->g; AMT tty= tdbp->GetAmType(); bool x= (tty == TYPE_AM_MYX || tty == TYPE_AM_XDBC); @@ -3061,58 +3130,66 @@ const COND *ha_connect::cond_push(const COND *cond) tty == TYPE_AM_TBL || tty == TYPE_AM_MYSQL || tty == TYPE_AM_PLG || tty == TYPE_AM_JDBC || x); - // Save stack and allocation environment and prepare error return - if (g->jump_level == MAX_JUMP) { - strcpy(g->Message, MSG(TOO_MANY_JUMPS)); - DBUG_RETURN(cond); - } // endif jump_level + // This should never happen but is done to avoid crashing + try { + if (b) { + PCFIL filp; + int rc; - // This should never happen but is done to avoid crashing - if ((rc= setjmp(g->jumper[++g->jump_level])) != 0) - goto fin; + if ((filp = tdbp->GetCondFil()) && tdbp->GetCond() == cond && + filp->Idx == active_index && filp->Type == tty) + goto fin; - if (b) { - PCFIL filp; - int rc; + filp = new(g) CONDFIL(active_index, tty); + rc = filp->Init(g, this); - if ((filp= tdbp->GetCondFil()) && filp->Cond == cond && - filp->Idx == active_index && filp->Type == tty) - goto fin; // Already done + if (rc == RC_INFO) { + filp->Having = (char*)PlugSubAlloc(g, NULL, 256); + *filp->Having = 0; + } else if (rc == RC_FX) + goto fin; - filp= new(g) CONDFIL(cond, active_index, tty); - rc = filp->Init(g, this); + filp->Body = (char*)PlugSubAlloc(g, NULL, (x) ? 128 : 0); + *filp->Body = 0; - if (rc == RC_INFO) { - filp->Having = (char*)PlugSubAlloc(g, NULL, 256); - *filp->Having = 0; - } else if (rc == RC_FX) - goto fin; + if (CheckCond(g, filp, cond)) { + if (filp->Having && strlen(filp->Having) > 255) + goto fin; // Memory collapse - filp->Body = (char*)PlugSubAlloc(g, NULL, (x) ? 128 : 0); - *filp->Body = 0; + if (trace) + htrc("cond_push: %s\n", filp->Body); - if (CheckCond(g, filp, cond)) { - if (filp->Having && strlen(filp->Having) > 255) - goto fin; // Memory collapse + tdbp->SetCond(cond); - if (trace) - htrc("cond_push: %s\n", filp->Body); + if (!x) + PlugSubAlloc(g, NULL, strlen(filp->Body) + 1); + else + cond = NULL; // Does this work? - if (!x) - PlugSubAlloc(g, NULL, strlen(filp->Body) + 1); - else - cond= NULL; // Does this work? + tdbp->SetCondFil(filp); + } else if (x && cond) + tdbp->SetCondFil(filp); // Wrong filter - tdbp->SetCondFil(filp); - } else if (x && cond) - tdbp->SetCondFil(filp); // Wrong filter + } else if (tdbp->CanBeFiltered()) { + if (!tdbp->GetCond() || tdbp->GetCond() != cond) { + tdbp->SetFilter(CondFilter(g, (Item *)cond)); - } else if (tty != TYPE_AM_JSN && tty != TYPE_AM_JSON) - tdbp->SetFilter(CondFilter(g, (Item *)cond)); + if (tdbp->GetFilter()) + tdbp->SetCond(cond); - fin: - g->jump_level--; - } // endif tdbp + } // endif cond + + } // endif tty + + } catch (int n) { + if (trace) + htrc("Exception %d: %s\n", n, g->Message); + } catch (const char *msg) { + strcpy(g->Message, msg); + } // end catch + + fin:; + } // endif tdbp // Let MySQL do the filtering DBUG_RETURN(cond); @@ -3262,26 +3339,36 @@ int ha_connect::optimize(THD* thd, HA_CHECK_OPT*) PGLOBAL& g= xp->g; PDBUSER dup= PlgGetUser(g); - // Ignore error on the opt file - dup->Check &= ~CHK_OPT; - tdbp= GetTDB(g); - dup->Check |= CHK_OPT; + try { + // Ignore error on the opt file + dup->Check &= ~CHK_OPT; + tdbp = GetTDB(g); + dup->Check |= CHK_OPT; - if (tdbp && !tdbp->IsRemote()) { - bool dop= IsTypeIndexable(GetRealType(NULL)); - bool dox= (tdbp->GetDef()->Indexable() == 1); + if (tdbp && !tdbp->IsRemote()) { + bool dop = IsTypeIndexable(GetRealType(NULL)); + bool dox = (tdbp->GetDef()->Indexable() == 1); - if ((rc= ((PTDBASE)tdbp)->ResetTableOpt(g, dop, dox))) { - if (rc == RC_INFO) { - push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message); - rc= 0; - } else - rc= HA_ERR_INTERNAL_ERROR; + if ((rc = ((PTDBASE)tdbp)->ResetTableOpt(g, dop, dox))) { + if (rc == RC_INFO) { + push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message); + rc = 0; + } else + rc = HA_ERR_INTERNAL_ERROR; - } // endif rc + } // endif rc - } else if (!tdbp) - rc= HA_ERR_INTERNAL_ERROR; + } else if (!tdbp) + rc = HA_ERR_INTERNAL_ERROR; + + } catch (int n) { + if (trace) + htrc("Exception %d: %s\n", n, g->Message); + rc = HA_ERR_INTERNAL_ERROR; + } catch (const char *msg) { + strcpy(g->Message, msg); + rc = HA_ERR_INTERNAL_ERROR; + } // end catch return rc; } // end of optimize @@ -3476,7 +3563,7 @@ int ha_connect::delete_row(const uchar *) /****************************************************************************/ -/* We seem to come here at the beginning of an index use. */ +/* We seem to come here at the begining of an index use. */ /****************************************************************************/ int ha_connect::index_init(uint idx, bool sorted) { @@ -3976,8 +4063,12 @@ int ha_connect::rnd_pos(uchar *buf, uchar *pos) tdbp->SetFilter(NULL); rc= rnd_next(buf); - } else - rc= HA_ERR_KEY_NOT_FOUND; + } else { + PGLOBAL g = GetPlug((table) ? table->in_use : NULL, xp); + strcpy(g->Message, "Not supported by this table type"); + my_message(ER_ILLEGAL_HA, g->Message, MYF(0)); + rc= HA_ERR_INTERNAL_ERROR; + } // endif SetRecpos DBUG_RETURN(rc); } // end of rnd_pos @@ -4028,7 +4119,12 @@ int ha_connect::info(uint flag) DBUG_ENTER("ha_connect::info"); - if (trace) + if (!g) { + my_message(ER_UNKNOWN_ERROR, "Cannot get g pointer", MYF(0)); + DBUG_RETURN(HA_ERR_INTERNAL_ERROR); + } // endif g + + if (trace) htrc("%p In info: flag=%u valid_info=%d\n", this, flag, valid_info); // tdbp must be available to get updated info @@ -4039,17 +4135,23 @@ int ha_connect::info(uint flag) if (xmod == MODE_ANY || xmod == MODE_ALTER) { // Pure info, not a query pure= true; - xp->CheckCleanup(); + xp->CheckCleanup(xmod == MODE_ANY && valid_query_id == 0); } // endif xmod // This is necessary for getting file length - if (table) - SetDataPath(g, table->s->db.str); - else + if (table) { + if (SetDataPath(g, table->s->db.str)) { + my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); + DBUG_RETURN(HA_ERR_INTERNAL_ERROR); + } // endif SetDataPath + + } else DBUG_RETURN(HA_ERR_INTERNAL_ERROR); // Should never happen - if (!(tdbp= GetTDB(g))) - DBUG_RETURN(HA_ERR_INTERNAL_ERROR); // Should never happen + if (!(tdbp = GetTDB(g))) { + my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); + DBUG_RETURN(HA_ERR_INTERNAL_ERROR); + } // endif tdbp valid_info = false; } // endif tdbp @@ -4195,35 +4297,37 @@ bool ha_connect::check_privileges(THD *thd, PTOS options, char *dbn, bool quick) case TAB_INI: case TAB_VEC: case TAB_JSON: - if (options->filename && *options->filename) { - if (!quick) { - char *s, path[FN_REFLEN], dbpath[FN_REFLEN]; + if (options->filename && *options->filename) { + if (!quick) { + char path[FN_REFLEN], dbpath[FN_REFLEN]; + + strcpy(dbpath, mysql_real_data_home); + + if (db) #if defined(__WIN__) - s= "\\"; + strcat(strcat(dbpath, db), "\\"); #else // !__WIN__ - s= "/"; + strcat(strcat(dbpath, db), "/"); #endif // !__WIN__ - strcpy(dbpath, mysql_real_data_home); - if (db) - strcat(strcat(dbpath, db), s); + (void)fn_format(path, options->filename, dbpath, "", + MY_RELATIVE_PATH | MY_UNPACK_FILENAME); - (void) fn_format(path, options->filename, dbpath, "", - MY_RELATIVE_PATH | MY_UNPACK_FILENAME); - - if (!is_secure_file_path(path)) { - my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--secure-file-priv"); - return true; - } // endif path - } - } else + if (!is_secure_file_path(path)) { + my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--secure-file-priv"); + return true; + } // endif path + } + } else return false; - /* Fall through to check FILE_ACL */ + // check FILE_ACL + // fall through case TAB_ODBC: case TAB_JDBC: case TAB_MYSQL: - case TAB_DIR: + case TAB_MONGO: + case TAB_DIR: case TAB_MAC: case TAB_WMI: case TAB_ZIP: @@ -4295,7 +4399,11 @@ bool ha_connect::IsSameIndex(PIXDEF xp1, PIXDEF xp2) MODE ha_connect::CheckMode(PGLOBAL g, THD *thd, MODE newmode, bool *chk, bool *cras) { +#if defined(DEVELOPMENT) + if (true) { +#else if (trace) { +#endif LEX_STRING *query_string= thd_query_string(thd); htrc("%p check_mode: cmdtype=%d\n", this, thd_sql_command(thd)); htrc("Cmd=%.*s\n", (int) query_string->length, query_string->str); @@ -4307,7 +4415,7 @@ MODE ha_connect::CheckMode(PGLOBAL g, THD *thd, if (newmode == MODE_WRITE) { switch (thd_sql_command(thd)) { case SQLCOM_LOCK_TABLES: - locked= 2; + locked= 2; // fall through case SQLCOM_CREATE_TABLE: case SQLCOM_INSERT: case SQLCOM_LOAD: @@ -4401,9 +4509,9 @@ MODE ha_connect::CheckMode(PGLOBAL g, THD *thd, break; // } // endif partitioned - case SQLCOM_END: - // Met in procedures: IF(EXISTS(SELECT... - newmode= MODE_READ; + case SQLCOM_CHECK: // TODO implement it + case SQLCOM_END: // Met in procedures: IF(EXISTS(SELECT... + newmode= MODE_READ; break; default: htrc("Unsupported sql_command=%d\n", thd_sql_command(thd)); @@ -4528,9 +4636,11 @@ int ha_connect::external_lock(THD *thd, int lock_type) DBUG_RETURN(0); } else if (g->Xchk) { if (!tdbp) { - if (!(tdbp= GetTDB(g))) - DBUG_RETURN(HA_ERR_INTERNAL_ERROR); - else if (!tdbp->GetDef()->Indexable()) { + if (!(tdbp = GetTDB(g))) { +// DBUG_RETURN(HA_ERR_INTERNAL_ERROR); causes assert error + push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message); + DBUG_RETURN(0); + } else if (!tdbp->GetDef()->Indexable()) { sprintf(g->Message, "external_lock: Table %s is not indexable", tdbp->GetName()); // DBUG_RETURN(HA_ERR_INTERNAL_ERROR); causes assert error push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message); @@ -4614,7 +4724,9 @@ int ha_connect::external_lock(THD *thd, int lock_type) push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message); rc= 0; - } // endif MakeIndex + //my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); + //rc= HA_ERR_INTERNAL_ERROR; + } // endif MakeIndex } else if (tdbp->GetDef()->Indexable() == 3) { if (CheckVirtualIndex(NULL)) { @@ -4635,9 +4747,12 @@ int ha_connect::external_lock(THD *thd, int lock_type) // Make it a warning to avoid crash push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message); rc= 0; - } // endif Close + //my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); + //rc = HA_ERR_INTERNAL_ERROR; + } // endif Close locked= 0; +// m_lock_type= lock_type; xmod= MODE_ANY; // For info commands DBUG_RETURN(rc); } // endif MODE_ANY @@ -4995,8 +5110,8 @@ ha_rows ha_connect::records_in_range(uint inx, key_range *min_key, } // end of records_in_range // Used to check whether a MYSQL table is created on itself -bool CheckSelf(PGLOBAL g, TABLE_SHARE *s, const char *host, - const char *db, char *tab, const char *src, int port) +bool CheckSelf(PGLOBAL g, TABLE_SHARE *s, PCSZ host, + PCSZ db, PCSZ tab, PCSZ src, int port) { if (src) return false; @@ -5232,47 +5347,48 @@ static int connect_assisted_discovery(handlerton *, THD* thd, TABLE_SHARE *table_s, HA_CREATE_INFO *create_info) { - char v=0; - const char *fncn= "?"; - const char *user, *fn, *db, *host, *pwd, *sep, *tbl, *src; - const char *col, *ocl, *rnk, *pic, *fcl, *skc, *zfn; - char *tab, *dsn, *shm, *dpath; + char v=0; + PCSZ fncn= "?"; + PCSZ user, fn, db, host, pwd, sep, tbl, src; + PCSZ col, ocl, rnk, pic, fcl, skc, zfn; + char *tab, *dsn, *shm, *dpath; #if defined(__WIN__) - char *nsp= NULL, *cls= NULL; + PCSZ nsp= NULL, cls= NULL; #endif // __WIN__ -//int hdr, mxe; - int port = 0, mxr = 0, rc = 0, mul = 0, lrecl = 0; +//int hdr, mxe; + int port = 0, mxr = 0, rc = 0, mul = 0, lrecl = 0; + PCSZ tabtyp = NULL; #if defined(ODBC_SUPPORT) - POPARM sop= NULL; - char *ucnc= NULL; - bool cnc= false; - int cto= -1, qto= -1; + POPARM sop= NULL; + PCSZ ucnc= NULL; + bool cnc= false; + int cto= -1, qto= -1; #endif // ODBC_SUPPORT +#if defined(JDBC_SUPPORT) || defined(MONGO_SUPPORT) #if defined(JDBC_SUPPORT) - PJPARM sjp= NULL; - char *driver= NULL; - char *url= NULL; -//char *prop= NULL; - char *tabtyp= NULL; + PJPARM sjp= NULL; #endif // JDBC_SUPPORT - uint tm, fnc= FNC_NO, supfnc= (FNC_NO | FNC_COL); - bool bif, ok= false, dbf= false; - TABTYPE ttp= TAB_UNDEF; - PQRYRES qrp= NULL; - PCOLRES crp; - PCONNECT xp= NULL; - PGLOBAL g= GetPlug(thd, xp); - PDBUSER dup= PlgGetUser(g); - PCATLG cat= (dup) ? dup->Catalog : NULL; - PTOS topt= table_s->option_struct; - char buf[1024]; - String sql(buf, sizeof(buf), system_charset_info); - - sql.copy(STRING_WITH_LEN("CREATE TABLE whatever ("), system_charset_info); + PCSZ driver= NULL; + char *url= NULL; +#endif // JDBC_SUPPORT || MONGO_SUPPORT + uint tm, fnc= FNC_NO, supfnc= (FNC_NO | FNC_COL); + bool bif, ok= false, dbf= false; + TABTYPE ttp= TAB_UNDEF; + PQRYRES qrp= NULL; + PCOLRES crp; + PCONNECT xp= NULL; + PGLOBAL g= GetPlug(thd, xp); if (!g) return HA_ERR_INTERNAL_ERROR; + PDBUSER dup= PlgGetUser(g); + PCATLG cat= (dup) ? dup->Catalog : NULL; + PTOS topt= table_s->option_struct; + char buf[1024]; + String sql(buf, sizeof(buf), system_charset_info); + + sql.copy(STRING_WITH_LEN("CREATE TABLE whatever ("), system_charset_info); user= host= pwd= tbl= src= col= ocl= pic= fcl= skc= rnk= zfn= dsn= NULL; // Get the useful create options @@ -5291,7 +5407,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, if (topt->oplist) { host= GetListOption(g, "host", topt->oplist, "localhost"); user= GetListOption(g, "user", topt->oplist, - (ttp == TAB_ODBC ? NULL : "root")); + ((ttp == TAB_ODBC || ttp == TAB_JDBC) ? NULL : "root")); // Default value db can come from the DBNAME=xxx option. db= GetListOption(g, "database", topt->oplist, db); col= GetListOption(g, "colist", topt->oplist, col); @@ -5307,19 +5423,17 @@ static int connect_assisted_discovery(handlerton *, THD* thd, #endif // __WIN__ port= atoi(GetListOption(g, "port", topt->oplist, "0")); #if defined(ODBC_SUPPORT) - mxr= atoi(GetListOption(g,"maxres", topt->oplist, "0")); + tabtyp = GetListOption(g, "Tabtype", topt->oplist, NULL); + mxr= atoi(GetListOption(g,"maxres", topt->oplist, "0")); cto= atoi(GetListOption(g,"ConnectTimeout", topt->oplist, "-1")); qto= atoi(GetListOption(g,"QueryTimeout", topt->oplist, "-1")); if ((ucnc= GetListOption(g, "UseDSN", topt->oplist))) cnc= (!*ucnc || *ucnc == 'y' || *ucnc == 'Y' || atoi(ucnc) != 0); #endif -#if defined(JDBC_SUPPORT) +#if defined(JDBC_SUPPORT) || defined(MONGO_SUPPORT) driver= GetListOption(g, "Driver", topt->oplist, NULL); -// url= GetListOption(g, "URL", topt->oplist, NULL); -// prop = GetListOption(g, "Properties", topt->oplist, NULL); - tabtyp = GetListOption(g, "Tabtype", topt->oplist, NULL); -#endif // JDBC_SUPPORT +#endif // JDBC_SUPPORT || MONGO_SUPPORT #if defined(PROMPT_OK) cop= atoi(GetListOption(g, "checkdsn", topt->oplist, "0")); #endif // PROMPT_OK @@ -5328,549 +5442,514 @@ static int connect_assisted_discovery(handlerton *, THD* thd, #endif // ZIP_SUPPORT } else { host= "localhost"; - user= (ttp == TAB_ODBC ? NULL : "root"); + user= ((ttp == TAB_ODBC || ttp == TAB_JDBC) ? NULL : "root"); } // endif option_list if (!(shm= (char*)db)) db= table_s->db.str; // Default value - // Save stack and allocation environment and prepare error return - if (g->jump_level == MAX_JUMP) { - strcpy(g->Message, MSG(TOO_MANY_JUMPS)); - goto jer; - } // endif jump_level + try { + // Check table type + if (ttp == TAB_UNDEF) { + topt->type = (src) ? "MYSQL" : (tab) ? "PROXY" : "DOS"; + ttp = GetTypeID(topt->type); + sprintf(g->Message, "No table_type. Was set to %s", topt->type); + push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message); + } else if (ttp == TAB_NIY) { + sprintf(g->Message, "Unsupported table type %s", topt->type); + rc = HA_ERR_INTERNAL_ERROR; + goto err; + } // endif ttp - if ((rc= setjmp(g->jumper[++g->jump_level])) != 0) { - my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); - goto err; - } // endif rc + if (!tab) { + if (ttp == TAB_TBL) { + // Make tab the first table of the list + char *p; - // Check table type - if (ttp == TAB_UNDEF) { - topt->type= (src) ? "MYSQL" : (tab) ? "PROXY" : "DOS"; - ttp= GetTypeID(topt->type); - sprintf(g->Message, "No table_type. Was set to %s", topt->type); - push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message); - } else if (ttp == TAB_NIY) { - sprintf(g->Message, "Unsupported table type %s", topt->type); - my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); - goto err; - } // endif ttp + if (!tbl) { + strcpy(g->Message, "Missing table list"); + rc = HA_ERR_INTERNAL_ERROR; + goto err; + } // endif tbl - if (!tab) { - if (ttp == TAB_TBL) { - // Make tab the first table of the list - char *p; + tab = PlugDup(g, tbl); - if (!tbl) { - strcpy(g->Message, "Missing table list"); - my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); - goto err; - } // endif tbl + if ((p = strchr(tab, ','))) + *p = 0; - tab= PlugDup(g, tbl); + if ((p = strchr(tab, '.'))) { + *p = 0; + db = tab; + tab = p + 1; + } // endif p - if ((p= strchr(tab, ','))) - *p= 0; + } else if (ttp != TAB_ODBC || !(fnc & (FNC_TABLE | FNC_COL))) + tab = table_s->table_name.str; // Default value - if ((p=strchr(tab, '.'))) { - *p= 0; - db= tab; - tab= p + 1; - } // endif p + } // endif tab - } else if (ttp != TAB_ODBC || !(fnc & (FNC_TABLE | FNC_COL))) - tab= table_s->table_name.str; // Default value - - } // endif tab - - switch (ttp) { + switch (ttp) { #if defined(ODBC_SUPPORT) - case TAB_ODBC: - dsn= strz(g, create_info->connect_string); + case TAB_ODBC: + dsn = strz(g, create_info->connect_string); - if (fnc & (FNC_DSN | FNC_DRIVER)) { - ok= true; + if (fnc & (FNC_DSN | FNC_DRIVER)) { + ok = true; #if defined(PROMPT_OK) - } else if (!stricmp(thd->main_security_ctx.host, "localhost") - && cop == 1) { - if ((dsn = ODBCCheckConnection(g, dsn, cop)) != NULL) { - thd->make_lex_string(&create_info->connect_string, dsn, strlen(dsn)); - ok= true; - } // endif dsn + } else if (!stricmp(thd->main_security_ctx.host, "localhost") + && cop == 1) { + if ((dsn = ODBCCheckConnection(g, dsn, cop)) != NULL) { + thd->make_lex_string(&create_info->connect_string, dsn, strlen(dsn)); + ok = true; + } // endif dsn #endif // PROMPT_OK - } else if (!dsn) { - sprintf(g->Message, "Missing %s connection string", topt->type); - } else { - // Store ODBC additional parameters - sop= (POPARM)PlugSubAlloc(g, NULL, sizeof(ODBCPARM)); - sop->User= (char*)user; - sop->Pwd= (char*)pwd; - sop->Cto= cto; - sop->Qto= qto; - sop->UseCnc= cnc; - ok= true; - } // endif's + } else if (!dsn) { + sprintf(g->Message, "Missing %s connection string", topt->type); + } else { + // Store ODBC additional parameters + sop = (POPARM)PlugSubAlloc(g, NULL, sizeof(ODBCPARM)); + sop->User = (char*)user; + sop->Pwd = (char*)pwd; + sop->Cto = cto; + sop->Qto = qto; + sop->UseCnc = cnc; + ok = true; + } // endif's - supfnc |= (FNC_TABLE | FNC_DSN | FNC_DRIVER); - break; -#endif // ODBC_SUPPORT -#if defined(JDBC_SUPPORT) - case TAB_JDBC: - if (fnc & FNC_DRIVER) { - ok= true; - } else if (!(url= strz(g, create_info->connect_string))) { - strcpy(g->Message, "Missing URL"); - } else { - // Store JDBC additional parameters - int rc; - PJDBCDEF jdef= new(g) JDBCDEF(); - - jdef->SetName(create_info->alias); - sjp= (PJPARM)PlugSubAlloc(g, NULL, sizeof(JDBCPARM)); - sjp->Driver= driver; -// sjp->Properties = prop; - sjp->Fsize= 0; - sjp->Scrollable= false; - - if ((rc = jdef->ParseURL(g, url, false)) == RC_OK) { - sjp->Url= url; - sjp->User= (char*)user; - sjp->Pwd= (char*)pwd; - ok= true; - } else if (rc == RC_NF) { - if (jdef->GetTabname()) - tab= jdef->GetTabname(); - - ok= jdef->SetParms(sjp); - } // endif rc - - } // endif's - - supfnc |= (FNC_DRIVER | FNC_TABLE); - break; -#endif // JDBC_SUPPORT - case TAB_DBF: - dbf= true; - // Passthru - case TAB_CSV: - if (!fn && fnc != FNC_NO) - sprintf(g->Message, "Missing %s file name", topt->type); - else if (sep && strlen(sep) > 1) - sprintf(g->Message, "Invalid separator %s", sep); - else - ok= true; - - break; - case TAB_MYSQL: - ok= true; - - if (create_info->connect_string.str && - create_info->connect_string.length) { - PMYDEF mydef= new(g) MYSQLDEF(); - - dsn= strz(g, create_info->connect_string); - mydef->SetName(create_info->alias); - - if (!mydef->ParseURL(g, dsn, false)) { - if (mydef->GetHostname()) - host= mydef->GetHostname(); - - if (mydef->GetUsername()) - user= mydef->GetUsername(); - - if (mydef->GetPassword()) - pwd= mydef->GetPassword(); - - if (mydef->GetTabschema()) - db = mydef->GetTabschema(); - - if (mydef->GetTabname()) - tab= mydef->GetTabname(); - - if (mydef->GetPortnumber()) - port= mydef->GetPortnumber(); - - } else - ok= false; - - } else if (!user) - user= "root"; - - if (ok && CheckSelf(g, table_s, host, db, tab, src, port)) - ok= false; - - break; -#if defined(__WIN__) - case TAB_WMI: - ok= true; - break; -#endif // __WIN__ -#if defined(PIVOT_SUPPORT) - case TAB_PIVOT: - supfnc= FNC_NO; -#endif // PIVOT_SUPPORT - case TAB_PRX: - case TAB_TBL: - case TAB_XCL: - case TAB_OCCUR: - if (!src && !stricmp(tab, create_info->alias) && - (!db || !stricmp(db, table_s->db.str))) - sprintf(g->Message, "A %s table cannot refer to itself", topt->type); - else - ok= true; - - break; - case TAB_OEM: - if (topt->module && topt->subtype) - ok= true; - else - strcpy(g->Message, "Missing OEM module or subtype"); - - break; -#if defined(LIBXML2_SUPPORT) || defined(DOMDOC_SUPPORT) - case TAB_XML: -#endif // LIBXML2_SUPPORT || DOMDOC_SUPPORT - case TAB_JSON: - if (!fn && !zfn && !mul) - sprintf(g->Message, "Missing %s file name", topt->type); - else - ok= true; - - break; - case TAB_VIR: - ok= true; - break; - default: - sprintf(g->Message, "Cannot get column info for table type %s", topt->type); - break; - } // endif ttp - - // Check for supported catalog function - if (ok && !(supfnc & fnc)) { - sprintf(g->Message, "Unsupported catalog function %s for table type %s", - fncn, topt->type); - ok= false; - } // endif supfnc - - if (src && fnc != FNC_NO) { - strcpy(g->Message, "Cannot make catalog table from srcdef"); - ok= false; - } // endif src - - if (ok) { - char *cnm, *rem, *dft, *xtra, *key, *fmt; - int i, len, prec, dec, typ, flg; - -// if (cat) -// cat->SetDataPath(g, table_s->db.str); -// else -// return HA_ERR_INTERNAL_ERROR; // Should never happen - - dpath= SetPath(g, table_s->db.str); - - if (src && ttp != TAB_PIVOT && ttp != TAB_ODBC && ttp != TAB_JDBC) { - qrp= SrcColumns(g, host, db, user, pwd, src, port); - - if (qrp && ttp == TAB_OCCUR) - if (OcrSrcCols(g, qrp, col, ocl, rnk)) { - my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); - goto err; - } // endif OcrSrcCols - - } else switch (ttp) { - case TAB_DBF: - qrp= DBFColumns(g, dpath, fn, fnc == FNC_COL); - break; -#if defined(ODBC_SUPPORT) - case TAB_ODBC: - switch (fnc) { - case FNC_NO: - case FNC_COL: - if (src) { - qrp= ODBCSrcCols(g, dsn, (char*)src, sop); - src= NULL; // for next tests - } else - qrp= ODBCColumns(g, dsn, shm, tab, NULL, - mxr, fnc == FNC_COL, sop); - - break; - case FNC_TABLE: - qrp= ODBCTables(g, dsn, shm, tab, NULL, mxr, true, sop); - break; - case FNC_DSN: - qrp= ODBCDataSources(g, mxr, true); - break; - case FNC_DRIVER: - qrp= ODBCDrivers(g, mxr, true); - break; - default: - sprintf(g->Message, "invalid catfunc %s", fncn); - break; - } // endswitch info - - break; + supfnc |= (FNC_TABLE | FNC_DSN | FNC_DRIVER); + break; #endif // ODBC_SUPPORT #if defined(JDBC_SUPPORT) case TAB_JDBC: - switch (fnc) { - case FNC_NO: - case FNC_COL: - if (src) { - qrp= JDBCSrcCols(g, (char*)src, sjp); - src= NULL; // for next tests - } else - qrp= JDBCColumns(g, shm, tab, NULL, mxr, fnc == FNC_COL, sjp); + if (fnc & FNC_DRIVER) { + ok = true; + } else if (!(url = strz(g, create_info->connect_string))) { + strcpy(g->Message, "Missing URL"); + } else { + // Store JDBC additional parameters + int rc; + PJDBCDEF jdef = new(g) JDBCDEF(); - break; - case FNC_TABLE: - qrp= JDBCTables(g, shm, tab, tabtyp, mxr, true, sjp); - break; -#if 0 - case FNC_DSN: - qrp= JDBCDataSources(g, mxr, true); - break; -#endif // 0 - case FNC_DRIVER: - qrp= JDBCDrivers(g, mxr, true); - break; - default: - sprintf(g->Message, "invalid catfunc %s", fncn); - break; - } // endswitch info + jdef->SetName(create_info->alias); + sjp = (PJPARM)PlugSubAlloc(g, NULL, sizeof(JDBCPARM)); + sjp->Driver = driver; + // sjp->Properties = prop; + sjp->Fsize = 0; + sjp->Scrollable = false; + if ((rc = jdef->ParseURL(g, url, false)) == RC_OK) { + sjp->Url = url; + sjp->User = (char*)user; + sjp->Pwd = (char*)pwd; + ok = true; + } else if (rc == RC_NF) { + if (jdef->GetTabname()) + tab = (char*)jdef->GetTabname(); + + ok = jdef->SetParms(sjp); + } // endif rc + + } // endif's + + supfnc |= (FNC_DRIVER | FNC_TABLE); break; #endif // JDBC_SUPPORT + case TAB_DBF: + dbf = true; + // fall through + case TAB_CSV: + if (!fn && fnc != FNC_NO) + sprintf(g->Message, "Missing %s file name", topt->type); + else if (sep && strlen(sep) > 1) + sprintf(g->Message, "Invalid separator %s", sep); + else + ok = true; + + break; case TAB_MYSQL: - qrp= MyColumns(g, thd, host, db, user, pwd, tab, - NULL, port, fnc == FNC_COL); - break; - case TAB_CSV: - qrp = CSVColumns(g, dpath, topt, fnc == FNC_COL); - break; + ok = true; + + if (create_info->connect_string.str && + create_info->connect_string.length) { + PMYDEF mydef = new(g) MYSQLDEF(); + + dsn = strz(g, create_info->connect_string); + mydef->SetName(create_info->alias); + + if (!mydef->ParseURL(g, dsn, false)) { + if (mydef->GetHostname()) + host = mydef->GetHostname(); + + if (mydef->GetUsername()) + user = mydef->GetUsername(); + + if (mydef->GetPassword()) + pwd = mydef->GetPassword(); + + if (mydef->GetTabschema()) + db = mydef->GetTabschema(); + + if (mydef->GetTabname()) + tab = (char*)mydef->GetTabname(); + + if (mydef->GetPortnumber()) + port = mydef->GetPortnumber(); + + } else + ok = false; + + } else if (!user) + user = "root"; + + if (ok && CheckSelf(g, table_s, host, db, tab, src, port)) + ok = false; + + break; #if defined(__WIN__) - case TAB_WMI: - qrp= WMIColumns(g, nsp, cls, fnc == FNC_COL); - break; + case TAB_WMI: + ok = true; + break; #endif // __WIN__ - case TAB_PRX: - case TAB_TBL: - case TAB_XCL: - case TAB_OCCUR: - bif= fnc == FNC_COL; - qrp= TabColumns(g, thd, db, tab, bif); - - if (!qrp && bif && fnc != FNC_COL) // tab is a view - qrp= MyColumns(g, thd, host, db, user, pwd, tab, NULL, port, false); - - if (qrp && ttp == TAB_OCCUR && fnc != FNC_COL) - if (OcrColumns(g, qrp, col, ocl, rnk)) { - my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); - goto err; - } // endif OcrColumns - - break; #if defined(PIVOT_SUPPORT) - case TAB_PIVOT: - qrp= PivotColumns(g, tab, src, pic, fcl, skc, host, db, user, pwd, port); - break; + case TAB_PIVOT: + supfnc = FNC_NO; #endif // PIVOT_SUPPORT - case TAB_VIR: - qrp= VirColumns(g, fnc == FNC_COL); - break; - case TAB_JSON: - qrp= JSONColumns(g, (char*)db, topt, fnc == FNC_COL); - break; + case TAB_PRX: + case TAB_TBL: + case TAB_XCL: + case TAB_OCCUR: + if (!src && !stricmp(tab, create_info->alias) && + (!db || !stricmp(db, table_s->db.str))) + sprintf(g->Message, "A %s table cannot refer to itself", topt->type); + else + ok = true; + + break; + case TAB_OEM: + if (topt->module && topt->subtype) + ok = true; + else + strcpy(g->Message, "Missing OEM module or subtype"); + + break; #if defined(LIBXML2_SUPPORT) || defined(DOMDOC_SUPPORT) - case TAB_XML: - qrp= XMLColumns(g, (char*)db, tab, topt, fnc == FNC_COL); - break; + case TAB_XML: #endif // LIBXML2_SUPPORT || DOMDOC_SUPPORT - case TAB_OEM: - qrp= OEMColumns(g, topt, tab, (char*)db, fnc == FNC_COL); - break; - default: - strcpy(g->Message, "System error during assisted discovery"); - break; - } // endswitch ttp + case TAB_JSON: + dsn = strz(g, create_info->connect_string); - if (!qrp) { - my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); - goto err; - } // endif !qrp + if (!fn && !zfn && !mul && !dsn) + sprintf(g->Message, "Missing %s file name", topt->type); + else + ok = true; - if (fnc != FNC_NO || src || ttp == TAB_PIVOT) { - // Catalog like table - for (crp= qrp->Colresp; !rc && crp; crp= crp->Next) { - cnm= (ttp == TAB_PIVOT) ? crp->Name : encode(g, crp->Name); - typ= crp->Type; - len= crp->Length; - dec= crp->Prec; - flg= crp->Flag; - v= (crp->Kdata->IsUnsigned()) ? 'U' : crp->Var; - tm= (crp->Kdata->IsNullable()) ? 0 : NOT_NULL_FLAG; + break; +#if defined(MONGO_SUPPORT) + case TAB_MONGO: + if (!topt->tabname) + topt->tabname = tab; - if (!len && typ == TYPE_STRING) - len= 256; // STRBLK's have 0 length + ok = true; + break; +#endif // MONGO_SUPPORT + case TAB_VIR: + ok = true; + break; + default: + sprintf(g->Message, "Cannot get column info for table type %s", topt->type); + break; + } // endif ttp - // Now add the field - if (add_field(&sql, cnm, typ, len, dec, NULL, tm, - NULL, NULL, NULL, NULL, flg, dbf, v)) - rc= HA_ERR_OUT_OF_MEM; - } // endfor crp + // Check for supported catalog function + if (ok && !(supfnc & fnc)) { + sprintf(g->Message, "Unsupported catalog function %s for table type %s", + fncn, topt->type); + ok = false; + } // endif supfnc - } else { - char *schem= NULL; - char *tn= NULL; + if (src && fnc != FNC_NO) { + strcpy(g->Message, "Cannot make catalog table from srcdef"); + ok = false; + } // endif src - // Not a catalog table - if (!qrp->Nblin) { - if (tab) - sprintf(g->Message, "Cannot get columns from %s", tab); - else - strcpy(g->Message, "Fail to retrieve columns"); + if (ok) { + const char *cnm, *rem; + char *dft, *xtra, *key, *fmt; + int i, len, prec, dec, typ, flg; - my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); - goto err; - } // endif !nblin + if (!(dpath = SetPath(g, table_s->db.str))) { + rc = HA_ERR_INTERNAL_ERROR; + goto err; + } // endif dpath - for (i= 0; !rc && i < qrp->Nblin; i++) { - typ= len= prec= dec= 0; - tm= NOT_NULL_FLAG; - cnm= (char*)"noname"; - dft= xtra= key= fmt= tn= NULL; - v= ' '; - rem= NULL; + if (src && ttp != TAB_PIVOT && ttp != TAB_ODBC && ttp != TAB_JDBC) { + qrp = SrcColumns(g, host, db, user, pwd, src, port); - for (crp= qrp->Colresp; crp; crp= crp->Next) - switch (crp->Fld) { - case FLD_NAME: - if (ttp == TAB_PRX || - (ttp == TAB_CSV && topt->data_charset && - (!stricmp(topt->data_charset, "UTF8") || - !stricmp(topt->data_charset, "UTF-8")))) - cnm= crp->Kdata->GetCharValue(i); - else - cnm= encode(g, crp->Kdata->GetCharValue(i)); - - break; - case FLD_TYPE: - typ= crp->Kdata->GetIntValue(i); - v = (crp->Nulls) ? crp->Nulls[i] : 0; - break; - case FLD_TYPENAME: - tn= crp->Kdata->GetCharValue(i); - break; - case FLD_PREC: - // PREC must be always before LENGTH - len= prec= crp->Kdata->GetIntValue(i); - break; - case FLD_LENGTH: - len= crp->Kdata->GetIntValue(i); - break; - case FLD_SCALE: - dec = (!crp->Kdata->IsNull(i)) ? crp->Kdata->GetIntValue(i) : -1; - break; - case FLD_NULL: - if (crp->Kdata->GetIntValue(i)) - tm= 0; // Nullable - - break; - case FLD_FORMAT: - fmt= (crp->Kdata) ? crp->Kdata->GetCharValue(i) : NULL; - break; - case FLD_REM: - rem= crp->Kdata->GetCharValue(i); - break; -// case FLD_CHARSET: - // No good because remote table is already translated -// if (*(csn= crp->Kdata->GetCharValue(i))) -// cs= get_charset_by_name(csn, 0); - -// break; - case FLD_DEFAULT: - dft= crp->Kdata->GetCharValue(i); - break; - case FLD_EXTRA: - xtra= crp->Kdata->GetCharValue(i); - - // Auto_increment is not supported yet - if (!stricmp(xtra, "AUTO_INCREMENT")) - xtra= NULL; - - break; - case FLD_KEY: - if (ttp == TAB_VIR) - key= crp->Kdata->GetCharValue(i); - - break; - case FLD_SCHEM: -#if defined(ODBC_SUPPORT) || defined(JDBC_SUPPORT) - if ((ttp == TAB_ODBC || ttp == TAB_JDBC) && crp->Kdata) { - if (schem && stricmp(schem, crp->Kdata->GetCharValue(i))) { - sprintf(g->Message, - "Several %s tables found, specify DBNAME", tab); - my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); - goto err; - } else if (!schem) - schem= crp->Kdata->GetCharValue(i); - - } // endif ttp -#endif // ODBC_SUPPORT || JDBC_SUPPORT - default: - break; // Ignore - } // endswitch Fld + if (qrp && ttp == TAB_OCCUR) + if (OcrSrcCols(g, qrp, col, ocl, rnk)) { + rc = HA_ERR_INTERNAL_ERROR; + goto err; + } // endif OcrSrcCols + } else switch (ttp) { + case TAB_DBF: + qrp = DBFColumns(g, dpath, fn, fnc == FNC_COL); + break; #if defined(ODBC_SUPPORT) - if (ttp == TAB_ODBC) { - int plgtyp; - bool w= false; // Wide character type + case TAB_ODBC: + switch (fnc) { + case FNC_NO: + case FNC_COL: + if (src) { + qrp = ODBCSrcCols(g, dsn, (char*)src, sop); + src = NULL; // for next tests + } else + qrp = ODBCColumns(g, dsn, shm, tab, NULL, + mxr, fnc == FNC_COL, sop); - // typ must be PLG type, not SQL type - if (!(plgtyp= TranslateSQLType(typ, dec, prec, v, w))) { - if (GetTypeConv() == TPC_SKIP) { - // Skip this column - sprintf(g->Message, "Column %s skipped (unsupported type %d)", - cnm, typ); - push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message); - continue; - } else { - sprintf(g->Message, "Unsupported SQL type %d", typ); - my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); - goto err; - } // endif type_conv + break; + case FNC_TABLE: + qrp = ODBCTables(g, dsn, shm, tab, NULL, mxr, true, sop); + break; + case FNC_DSN: + qrp = ODBCDataSources(g, mxr, true); + break; + case FNC_DRIVER: + qrp = ODBCDrivers(g, mxr, true); + break; + default: + sprintf(g->Message, "invalid catfunc %s", fncn); + break; + } // endswitch info - } else - typ= plgtyp; - - switch (typ) { - case TYPE_STRING: - if (w) { - sprintf(g->Message, "Column %s is wide characters", cnm); - push_warning(thd, Sql_condition::WARN_LEVEL_NOTE, 0, g->Message); - } // endif w - - break; - case TYPE_DOUBLE: - // Some data sources do not count dec in length (prec) - prec += (dec + 2); // To be safe - break; - case TYPE_DECIM: - prec= len; - break; - default: - dec= 0; - } // endswitch typ - - } else + break; #endif // ODBC_SUPPORT #if defined(JDBC_SUPPORT) - if (ttp == TAB_JDBC) { + case TAB_JDBC: + switch (fnc) { + case FNC_NO: + case FNC_COL: + if (src) { + qrp = JDBCSrcCols(g, (char*)src, sjp); + src = NULL; // for next tests + } else + qrp = JDBCColumns(g, shm, tab, NULL, mxr, fnc == FNC_COL, sjp); + + break; + case FNC_TABLE: + qrp = JDBCTables(g, shm, tab, tabtyp, mxr, true, sjp); + break; +#if 0 + case FNC_DSN: + qrp = JDBCDataSources(g, mxr, true); + break; +#endif // 0 + case FNC_DRIVER: + qrp = JDBCDrivers(g, mxr, true); + break; + default: + sprintf(g->Message, "invalid catfunc %s", fncn); + break; + } // endswitch info + + break; +#endif // JDBC_SUPPORT + case TAB_MYSQL: + qrp = MyColumns(g, thd, host, db, user, pwd, tab, + NULL, port, fnc == FNC_COL); + break; + case TAB_CSV: + qrp = CSVColumns(g, dpath, topt, fnc == FNC_COL); + break; +#if defined(__WIN__) + case TAB_WMI: + qrp = WMIColumns(g, nsp, cls, fnc == FNC_COL); + break; +#endif // __WIN__ + case TAB_PRX: + case TAB_TBL: + case TAB_XCL: + case TAB_OCCUR: + bif = fnc == FNC_COL; + qrp = TabColumns(g, thd, db, tab, bif); + + if (!qrp && bif && fnc != FNC_COL) // tab is a view + qrp = MyColumns(g, thd, host, db, user, pwd, tab, NULL, port, false); + + if (qrp && ttp == TAB_OCCUR && fnc != FNC_COL) + if (OcrColumns(g, qrp, col, ocl, rnk)) { + rc = HA_ERR_INTERNAL_ERROR; + goto err; + } // endif OcrColumns + + break; +#if defined(PIVOT_SUPPORT) + case TAB_PIVOT: + qrp = PivotColumns(g, tab, src, pic, fcl, skc, host, db, user, pwd, port); + break; +#endif // PIVOT_SUPPORT + case TAB_VIR: + qrp = VirColumns(g, fnc == FNC_COL); + break; + case TAB_JSON: + qrp = JSONColumns(g, db, dsn, topt, fnc == FNC_COL); + break; +#if defined(MONGO_SUPPORT) + case TAB_MONGO: + if (!(url = strz(g, create_info->connect_string)) || !*url) + url = "mongodb://localhost:27017"; + + qrp = MGOColumns(g, db, url, topt, fnc == FNC_COL); + break; +#endif // MONGO_SUPPORT +#if defined(LIBXML2_SUPPORT) || defined(DOMDOC_SUPPORT) + case TAB_XML: + qrp = XMLColumns(g, (char*)db, tab, topt, fnc == FNC_COL); + break; +#endif // LIBXML2_SUPPORT || DOMDOC_SUPPORT + case TAB_OEM: + qrp = OEMColumns(g, topt, tab, (char*)db, fnc == FNC_COL); + break; + default: + strcpy(g->Message, "System error during assisted discovery"); + break; + } // endswitch ttp + + if (!qrp) { + rc = HA_ERR_INTERNAL_ERROR; + goto err; + } // endif !qrp + + if (fnc != FNC_NO || src || ttp == TAB_PIVOT) { + // Catalog like table + for (crp = qrp->Colresp; !rc && crp; crp = crp->Next) { + cnm = (ttp == TAB_PIVOT) ? crp->Name : encode(g, crp->Name); + typ = crp->Type; + len = crp->Length; + dec = crp->Prec; + flg = crp->Flag; + v = (crp->Kdata->IsUnsigned()) ? 'U' : crp->Var; + tm = (crp->Kdata->IsNullable()) ? 0 : NOT_NULL_FLAG; + + if (!len && typ == TYPE_STRING) + len = 256; // STRBLK's have 0 length + + // Now add the field + if (add_field(&sql, cnm, typ, len, dec, NULL, tm, + NULL, NULL, NULL, NULL, flg, dbf, v)) + rc = HA_ERR_OUT_OF_MEM; + } // endfor crp + + } else { + char *schem = NULL; + char *tn = NULL; + + // Not a catalog table + if (!qrp->Nblin) { + if (tab) + sprintf(g->Message, "Cannot get columns from %s", tab); + else + strcpy(g->Message, "Fail to retrieve columns"); + + rc = HA_ERR_INTERNAL_ERROR; + goto err; + } // endif !nblin + + for (i = 0; !rc && i < qrp->Nblin; i++) { + typ = len = prec = dec = 0; + tm = NOT_NULL_FLAG; + cnm = (char*)"noname"; + dft = xtra = key = fmt = tn = NULL; + v = ' '; + rem = NULL; + + for (crp = qrp->Colresp; crp; crp = crp->Next) + switch (crp->Fld) { + case FLD_NAME: + if (ttp == TAB_PRX || + (ttp == TAB_CSV && topt->data_charset && + (!stricmp(topt->data_charset, "UTF8") || + !stricmp(topt->data_charset, "UTF-8")))) + cnm = crp->Kdata->GetCharValue(i); + else + cnm = encode(g, crp->Kdata->GetCharValue(i)); + + break; + case FLD_TYPE: + typ = crp->Kdata->GetIntValue(i); + v = (crp->Nulls) ? crp->Nulls[i] : 0; + break; + case FLD_TYPENAME: + tn = crp->Kdata->GetCharValue(i); + break; + case FLD_PREC: + // PREC must be always before LENGTH + len = prec = crp->Kdata->GetIntValue(i); + break; + case FLD_LENGTH: + len = crp->Kdata->GetIntValue(i); + break; + case FLD_SCALE: + dec = (!crp->Kdata->IsNull(i)) ? crp->Kdata->GetIntValue(i) : -1; + break; + case FLD_NULL: + if (crp->Kdata->GetIntValue(i)) + tm = 0; // Nullable + + break; + case FLD_FORMAT: + fmt = (crp->Kdata) ? crp->Kdata->GetCharValue(i) : NULL; + break; + case FLD_REM: + rem = crp->Kdata->GetCharValue(i); + break; + // case FLD_CHARSET: + // No good because remote table is already translated + // if (*(csn= crp->Kdata->GetCharValue(i))) + // cs= get_charset_by_name(csn, 0); + + // break; + case FLD_DEFAULT: + dft = crp->Kdata->GetCharValue(i); + break; + case FLD_EXTRA: + xtra = crp->Kdata->GetCharValue(i); + + // Auto_increment is not supported yet + if (!stricmp(xtra, "AUTO_INCREMENT")) + xtra = NULL; + + break; + case FLD_KEY: + if (ttp == TAB_VIR) + key = crp->Kdata->GetCharValue(i); + + break; + case FLD_SCHEM: +#if defined(ODBC_SUPPORT) || defined(JDBC_SUPPORT) + if ((ttp == TAB_ODBC || ttp == TAB_JDBC) && crp->Kdata) { + if (schem && stricmp(schem, crp->Kdata->GetCharValue(i))) { + sprintf(g->Message, + "Several %s tables found, specify DBNAME", tab); + rc = HA_ERR_INTERNAL_ERROR; + goto err; + } else if (!schem) + schem = crp->Kdata->GetCharValue(i); + + } // endif ttp +#endif // ODBC_SUPPORT || JDBC_SUPPORT + default: + break; // Ignore + } // endswitch Fld + +#if defined(ODBC_SUPPORT) + if (ttp == TAB_ODBC) { int plgtyp; + bool w = false; // Wide character type // typ must be PLG type, not SQL type - if (!(plgtyp= TranslateJDBCType(typ, tn, dec, prec, v))) { + if (!(plgtyp = TranslateSQLType(typ, dec, prec, v, w))) { if (GetTypeConv() == TPC_SKIP) { // Skip this column sprintf(g->Message, "Column %s skipped (unsupported type %d)", @@ -5879,55 +5958,107 @@ static int connect_assisted_discovery(handlerton *, THD* thd, continue; } else { sprintf(g->Message, "Unsupported SQL type %d", typ); - my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); + rc = HA_ERR_INTERNAL_ERROR; goto err; } // endif type_conv } else - typ= plgtyp; + typ = plgtyp; switch (typ) { - case TYPE_DOUBLE: - case TYPE_DECIM: - // Some data sources do not count dec in length (prec) - prec += (dec + 2); // To be safe - break; - default: - dec= 0; + case TYPE_STRING: + if (w) { + sprintf(g->Message, "Column %s is wide characters", cnm); + push_warning(thd, Sql_condition::WARN_LEVEL_NOTE, 0, g->Message); + } // endif w + + break; + case TYPE_DOUBLE: + // Some data sources do not count dec in length (prec) + prec += (dec + 2); // To be safe + break; + case TYPE_DECIM: + prec = len; + break; + default: + dec = 0; } // endswitch typ } else #endif // ODBC_SUPPORT - // Make the arguments as required by add_fields - if (typ == TYPE_DOUBLE) - prec= len; +#if defined(JDBC_SUPPORT) + if (ttp == TAB_JDBC) { + int plgtyp; - if (typ == TYPE_DATE) - prec= 0; + // typ must be PLG type, not SQL type + if (!(plgtyp = TranslateJDBCType(typ, tn, dec, prec, v))) { + if (GetTypeConv() == TPC_SKIP) { + // Skip this column + sprintf(g->Message, "Column %s skipped (unsupported type %d)", + cnm, typ); + push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message); + continue; + } else { + sprintf(g->Message, "Unsupported SQL type %d", typ); + rc = HA_ERR_INTERNAL_ERROR; + goto err; + } // endif type_conv - // Now add the field - if (add_field(&sql, cnm, typ, prec, dec, key, tm, rem, dft, xtra, - fmt, 0, dbf, v)) - rc= HA_ERR_OUT_OF_MEM; - } // endfor i + } else + typ = plgtyp; - } // endif fnc + switch (typ) { + case TYPE_DOUBLE: + case TYPE_DECIM: + // Some data sources do not count dec in length (prec) + prec += (dec + 2); // To be safe + break; + default: + dec = 0; + } // endswitch typ - if (!rc) - rc= init_table_share(thd, table_s, create_info, &sql); + } else +#endif // ODBC_SUPPORT + // Make the arguments as required by add_fields + if (typ == TYPE_DOUBLE) + prec = len; - g->jump_level--; - PopUser(xp); - return rc; - } // endif ok + if (typ == TYPE_DATE) + prec = 0; - my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); + // Now add the field + if (add_field(&sql, cnm, typ, prec, dec, key, tm, rem, dft, xtra, + fmt, 0, dbf, v)) + rc = HA_ERR_OUT_OF_MEM; + } // endfor i + + } // endif fnc + + if (!rc) + rc = init_table_share(thd, table_s, create_info, &sql); + + //g->jump_level--; + //PopUser(xp); + //return rc; + } else { + rc = HA_ERR_UNSUPPORTED; + } // endif ok + + } catch (int n) { + if (trace) + htrc("Exception %d: %s\n", n, g->Message); + rc = HA_ERR_INTERNAL_ERROR; + } catch (const char *msg) { + strcpy(g->Message, msg); + rc = HA_ERR_INTERNAL_ERROR; + } // end catch err: - g->jump_level--; - jer: + if (rc) + my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); + PopUser(xp); - return HA_ERR_INTERNAL_ERROR; + return rc; } // end of connect_assisted_discovery /** @@ -5987,6 +6118,7 @@ int ha_connect::create(const char *name, TABLE *table_arg, TABTYPE type; TABLE *st= table; // Probably unuseful THD *thd= ha_thd(); + LEX_STRING cnc = table_arg->s->connect_string; #if defined(WITH_PARTITION_STORAGE_ENGINE) partition_info *part_info= table_arg->part_info; #endif // WITH_PARTITION_STORAGE_ENGINE @@ -6034,7 +6166,8 @@ int ha_connect::create(const char *name, TABLE *table_arg, if (check_privileges(thd, options, GetDBfromName(name))) DBUG_RETURN(HA_ERR_INTERNAL_ERROR); - inward= IsFileType(type) && !options->filename; + inward= IsFileType(type) && !options->filename && + (type != TAB_JSON || !cnc.length); if (options->data_charset) { const CHARSET_INFO *data_charset; @@ -6087,13 +6220,14 @@ int ha_connect::create(const char *name, TABLE *table_arg, DBUG_RETURN(HA_ERR_INTERNAL_ERROR); } // endif tabname + // fall through case TAB_MYSQL: #if defined(WITH_PARTITION_STORAGE_ENGINE) if (!part_info) #endif // WITH_PARTITION_STORAGE_ENGINE {const char *src= options->srcdef; - char *host, *db, *tab= (char*)options->tabname; - int port; + PCSZ host, db, tab= options->tabname; + int port; host= GetListOption(g, "host", options->oplist, NULL); db= GetStringOption("database", NULL); @@ -6131,18 +6265,18 @@ int ha_connect::create(const char *name, TABLE *table_arg, DBUG_RETURN(HA_ERR_INTERNAL_ERROR); } // endif CheckSelf - }break; + } break; default: /* do nothing */; break; } // endswitch ttp if (type == TAB_XML) { - bool dom; // True: MS-DOM, False libxml2 - char *xsup= GetListOption(g, "Xmlsup", options->oplist, "*"); + bool dom; // True: MS-DOM, False libxml2 + PCSZ xsup= GetListOption(g, "Xmlsup", options->oplist, "*"); // Note that if no support is specified, the default is MS-DOM // on Windows and libxml2 otherwise - switch (*xsup) { + switch (toupper(*xsup)) { case '*': #if defined(__WIN__) dom= true; @@ -6209,7 +6343,7 @@ int ha_connect::create(const char *name, TABLE *table_arg, for (field= table_arg->field; *field; field++) { fp= *field; - if (!fp->stored_in_db()) + if (fp->vcol_info && !fp->stored_in_db) continue; // This is a virtual column if (fp->flags & AUTO_INCREMENT_FLAG) { @@ -6398,15 +6532,15 @@ int ha_connect::create(const char *name, TABLE *table_arg, if (options->zipped) { // Check whether the zip entry must be made from a file - char *fn = GetListOption(g, "Load", options->oplist, NULL); + PCSZ fn = GetListOption(g, "Load", options->oplist, NULL); if (fn) { - char zbuf[_MAX_PATH], buf[_MAX_PATH], dbpath[_MAX_PATH]; - char *entry = GetListOption(g, "Entry", options->oplist, NULL); - char *a = GetListOption(g, "Append", options->oplist, "NO"); - bool append = *a == '1' || *a == 'Y' || *a == 'y' || !stricmp(a, "ON"); - char *m = GetListOption(g, "Mulentries", options->oplist, "NO"); - bool mul = *m == '1' || *m == 'Y' || *m == 'y' || !stricmp(m, "ON"); + char zbuf[_MAX_PATH], buf[_MAX_PATH], dbpath[_MAX_PATH]; + PCSZ entry = GetListOption(g, "Entry", options->oplist, NULL); + PCSZ a = GetListOption(g, "Append", options->oplist, "NO"); + bool append = *a == '1' || *a == 'Y' || *a == 'y' || !stricmp(a, "ON"); + PCSZ m = GetListOption(g, "Mulentries", options->oplist, "NO"); + bool mul = *m == '1' || *m == 'Y' || *m == 'y' || !stricmp(m, "ON"); if (!entry && !mul) { my_message(ER_UNKNOWN_ERROR, "Missing entry name", MYF(0)); @@ -6474,11 +6608,10 @@ int ha_connect::create(const char *name, TABLE *table_arg, PDBUSER dup= PlgGetUser(g); PCATLG cat= (dup) ? dup->Catalog : NULL; - SetDataPath(g, table_arg->s->db.str); - - if (cat) { -// cat->SetDataPath(g, table_arg->s->db.str); - + if (SetDataPath(g, table_arg->s->db.str)) { + my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); + rc = HA_ERR_INTERNAL_ERROR; + } else if (cat) { #if defined(WITH_PARTITION_STORAGE_ENGINE) if (part_info) strncpy(partname, @@ -6534,8 +6667,9 @@ bool ha_connect::FileExists(const char *fn, bool bf) return true; if (table) { - char *s, tfn[_MAX_PATH], filename[_MAX_PATH], path[_MAX_PATH]; - bool b= false; + const char *s; + char tfn[_MAX_PATH], filename[_MAX_PATH], path[_MAX_PATH]; + bool b= false; int n; struct stat info; @@ -6577,7 +6711,7 @@ bool ha_connect::FileExists(const char *fn, bool bf) } // end of FileExists // Called by SameString and NoFieldOptionChange -bool ha_connect::CheckString(const char *str1, const char *str2) +bool ha_connect::CheckString(PCSZ str1, PCSZ str2) { bool b1= (!str1 || !*str1), b2= (!str2 || !*str2); @@ -6592,9 +6726,9 @@ bool ha_connect::CheckString(const char *str1, const char *str2) /** check whether a string option have changed */ -bool ha_connect::SameString(TABLE *tab, char *opn) +bool ha_connect::SameString(TABLE *tab, PCSZ opn) { - char *str1, *str2; + PCSZ str1, str2; tshp= tab->s; // The altered table str1= GetStringOption(opn); @@ -6606,7 +6740,7 @@ bool ha_connect::SameString(TABLE *tab, char *opn) /** check whether a Boolean option have changed */ -bool ha_connect::SameBool(TABLE *tab, char *opn) +bool ha_connect::SameBool(TABLE *tab, PCSZ opn) { bool b1, b2; @@ -6620,7 +6754,7 @@ bool ha_connect::SameBool(TABLE *tab, char *opn) /** check whether an integer option have changed */ -bool ha_connect::SameInt(TABLE *tab, char *opn) +bool ha_connect::SameInt(TABLE *tab, PCSZ opn) { int i1, i2; @@ -6799,7 +6933,7 @@ ha_connect::check_if_supported_inplace_alter(TABLE *altered_table, // Conversion to outward table is only allowed for file based // tables whose file does not exist. tshp= altered_table->s; - char *fn= GetStringOption("filename"); + PCSZ fn= GetStringOption("filename"); tshp= NULL; if (FileExists(fn, false)) { @@ -7025,6 +7159,7 @@ static struct st_mysql_sys_var* connect_system_variables[]= { #if defined(XMSG) MYSQL_SYSVAR(errmsg_dir_path), #endif // XMSG + MYSQL_SYSVAR(json_null), MYSQL_SYSVAR(json_grp_size), #if defined(JDBC_SUPPORT) MYSQL_SYSVAR(jvm_path), @@ -7044,10 +7179,10 @@ maria_declare_plugin(connect) PLUGIN_LICENSE_GPL, connect_init_func, /* Plugin Init */ connect_done_func, /* Plugin Deinit */ - 0x0105, /* version number (1.05) */ + 0x0106, /* version number (1.05) */ NULL, /* status variables */ connect_system_variables, /* system variables */ - "1.05.0003", /* string version */ - MariaDB_PLUGIN_MATURITY_GAMMA /* maturity */ + "1.06.0001", /* string version */ + MariaDB_PLUGIN_MATURITY_BETA /* maturity */ } maria_declare_plugin_end; diff --git a/storage/connect/ha_connect.h b/storage/connect/ha_connect.h index cb15d371b5c..a5dcd4f65f1 100644 --- a/storage/connect/ha_connect.h +++ b/storage/connect/ha_connect.h @@ -1,4 +1,4 @@ -/* Copyright (C) Olivier Bertrand 2004 - 2015 +/* Copyright (C) MariaDB Corporation Ab This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -14,6 +14,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ /** @file ha_connect.h + Author Olivier Bertrand @brief The ha_connect engine is a prototype storage engine to access external data. @@ -61,7 +62,7 @@ public: oldopn= newopn= NULL; oldpix= newpix= NULL;} - inline char *SetName(PGLOBAL g, char *name) {return PlugDup(g, name);} + inline char *SetName(PGLOBAL g, PCSZ name) {return PlugDup(g, name);} bool oldsep; // Sepindex before create/alter bool newsep; // Sepindex after create/alter @@ -165,21 +166,21 @@ public: ~ha_connect(); // CONNECT Implementation - static bool connect_init(void); - static bool connect_end(void); +//static bool connect_init(void); +//static bool connect_end(void); TABTYPE GetRealType(PTOS pos= NULL); - char *GetRealString(const char *s); - char *GetStringOption(char *opname, char *sdef= NULL); + char *GetRealString(PCSZ s); + PCSZ GetStringOption(PCSZ opname, PCSZ sdef= NULL); PTOS GetTableOptionStruct(TABLE_SHARE *s= NULL); - bool GetBooleanOption(char *opname, bool bdef); - bool SetBooleanOption(char *opname, bool b); - int GetIntegerOption(char *opname); - bool GetIndexOption(KEY *kp, char *opname); - bool CheckString(const char *str1, const char *str2); - bool SameString(TABLE *tab, char *opn); - bool SetIntegerOption(char *opname, int n); - bool SameInt(TABLE *tab, char *opn); - bool SameBool(TABLE *tab, char *opn); + bool GetBooleanOption(PCSZ opname, bool bdef); + bool SetBooleanOption(PCSZ opname, bool b); + int GetIntegerOption(PCSZ opname); + bool GetIndexOption(KEY *kp, PCSZ opname); + bool CheckString(PCSZ str1, PCSZ str2); + bool SameString(TABLE *tab, PCSZ opn); + bool SetIntegerOption(PCSZ opname, int n); + bool SameInt(TABLE *tab, PCSZ opn); + bool SameBool(TABLE *tab, PCSZ opn); bool FileExists(const char *fn, bool bf); bool NoFieldOptionChange(TABLE *tab); PFOS GetFieldOptionStruct(Field *fp); @@ -187,8 +188,8 @@ public: PXOS GetIndexOptionStruct(KEY *kp); PIXDEF GetIndexInfo(TABLE_SHARE *s= NULL); bool CheckVirtualIndex(TABLE_SHARE *s); - const char *GetDBName(const char *name); - const char *GetTableName(void); + PCSZ GetDBName(PCSZ name); + PCSZ GetTableName(void); char *GetPartName(void); //int GetColNameLen(Field *fp); //char *GetColName(Field *fp); @@ -197,9 +198,9 @@ public: bool IsSameIndex(PIXDEF xp1, PIXDEF xp2); bool IsPartitioned(void); bool IsUnique(uint n); - char *GetDataPath(void) {return (char*)datapath;} + PCSZ GetDataPath(void) {return datapath;} - void SetDataPath(PGLOBAL g, const char *path); + bool SetDataPath(PGLOBAL g, PCSZ path); PTDB GetTDB(PGLOBAL g); int OpenTable(PGLOBAL g, bool del= false); bool CheckColumnList(PGLOBAL g); @@ -513,7 +514,7 @@ protected: ulong hnum; // The number of this handler query_id_t valid_query_id; // The one when tdbp was allocated query_id_t creat_query_id; // The one when handler was allocated - char *datapath; // Is the Path of DB data directory + PCSZ datapath; // Is the Path of DB data directory PTDB tdbp; // To table class object PVAL sdvalin1; // Used to convert date values PVAL sdvalin2; // Used to convert date values diff --git a/storage/connect/inihandl.c b/storage/connect/inihandl.c index e5eb3567779..0ce0eb9fa0d 100644 --- a/storage/connect/inihandl.c +++ b/storage/connect/inihandl.c @@ -193,7 +193,7 @@ static void PROFILE_Save( FILE *file, PROFILESECTION *section ) } for (key = section->key; key; key = key->next) - if (key->name[0]) { + if (key->name && key->name[0]) { fprintf(file, "%s", SVP(key->name)); if (key->value) diff --git a/storage/connect/javaconn.cpp b/storage/connect/javaconn.cpp new file mode 100644 index 00000000000..3ba99ed89f8 --- /dev/null +++ b/storage/connect/javaconn.cpp @@ -0,0 +1,621 @@ +/************ Javaconn C++ Functions Source Code File (.CPP) ***********/ +/* Name: JAVAConn.CPP Version 1.0 */ +/* */ +/* (C) Copyright to the author Olivier BERTRAND 2017 */ +/* */ +/* This file contains the JAVA connection classes functions. */ +/***********************************************************************/ + +#if defined(__WIN__) +// This is needed for RegGetValue +#define _WINVER 0x0601 +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x0601 +#endif // __WIN__ + +/***********************************************************************/ +/* Include relevant MariaDB header file. */ +/***********************************************************************/ +#include +#include +#if defined(__WIN__) +#include // for getcwd +#if defined(__BORLANDC__) +#define __MFC_COMPAT__ // To define min/max as macro +#endif // __BORLANDC__ +#else // !__WIN__ +#if defined(UNIX) +#include +#else // !UNIX +#endif // !UNIX +#include +#include // for getenv +#define NODW +#endif // !__WIN__ + +/***********************************************************************/ +/* Required objects includes. */ +/***********************************************************************/ +#include "global.h" +#include "plgdbsem.h" +#include "colblk.h" +#include "xobject.h" +#include "xtable.h" +#include "tabext.h" +#include "javaconn.h" +#include "resource.h" +#include "valblk.h" +#include "osutil.h" + +#if defined(__WIN__) +extern "C" HINSTANCE s_hModule; // Saved module handle +#endif // __WIN__ +#define nullptr 0 + +//TYPCONV GetTypeConv(); +//int GetConvSize(); +extern char *JvmPath; // The connect_jvm_path global variable value +extern char *ClassPath; // The connect_class_path global variable value + +char *GetJavaWrapper(void); // The connect_java_wrapper variable value + +/***********************************************************************/ +/* Static JAVAConn objects. */ +/***********************************************************************/ +void *JAVAConn::LibJvm = NULL; +CRTJVM JAVAConn::CreateJavaVM = NULL; +GETJVM JAVAConn::GetCreatedJavaVMs = NULL; +#if defined(_DEBUG) +GETDEF JAVAConn::GetDefaultJavaVMInitArgs = NULL; +#endif // _DEBUG + +/***********************************************************************/ +/* Some macro's (should be defined elsewhere to be more accessible) */ +/***********************************************************************/ +#if defined(_DEBUG) +#define ASSERT(f) assert(f) +#define DEBUG_ONLY(f) (f) +#else // !_DEBUG +#define ASSERT(f) ((void)0) +#define DEBUG_ONLY(f) ((void)0) +#endif // !_DEBUG + +/***********************************************************************/ +/* Allocate the structure used to refer to the result set. */ +/***********************************************************************/ +static JCATPARM *AllocCatInfo(PGLOBAL g, JCATINFO fid, PCSZ db, + PCSZ tab, PQRYRES qrp) +{ + JCATPARM *cap; + +#if defined(_DEBUG) + assert(qrp); +#endif + + if ((cap = (JCATPARM *)PlgDBSubAlloc(g, NULL, sizeof(JCATPARM)))) { + memset(cap, 0, sizeof(JCATPARM)); + cap->Id = fid; + cap->Qrp = qrp; + cap->DB = db; + cap->Tab = tab; + } // endif cap + + return cap; +} // end of AllocCatInfo + +/***********************************************************************/ +/* JAVAConn construction/destruction. */ +/***********************************************************************/ +JAVAConn::JAVAConn(PGLOBAL g, PCSZ wrapper) +{ + m_G = g; + jvm = nullptr; // Pointer to the JVM (Java Virtual Machine) + env = nullptr; // Pointer to native interface + jdi = nullptr; // Pointer to the java wrapper class + job = nullptr; // The java wrapper class object + errid = nullptr; + DiscFunc = "Disconnect"; + Msg = NULL; + m_Wrap = (wrapper) ? wrapper : GetJavaWrapper(); + + if (!strchr(m_Wrap, '/')) { + // Add the wrapper package name + char *wn = (char*)PlugSubAlloc(g, NULL, strlen(m_Wrap) + 10); + m_Wrap = strcat(strcpy(wn, "wrappers/"), m_Wrap); + } // endif m_Wrap + + fp = NULL; + m_Opened = false; + m_Connected = false; + m_Rows = 0; +//*m_ErrMsg = '\0'; +} // end of JAVAConn + +//JAVAConn::~JAVAConn() +// { +//if (Connected()) +// EndCom(); + +// } // end of ~JAVAConn + +/***********************************************************************/ +/* Screen for errors. */ +/***********************************************************************/ +bool JAVAConn::Check(jint rc) +{ + jstring s; + + if (env->ExceptionCheck()) { + jthrowable exc = env->ExceptionOccurred(); + jmethodID tid = env->GetMethodID(env->FindClass("java/lang/Object"), + "toString", "()Ljava/lang/String;"); + + if (exc != nullptr && tid != nullptr) { + jstring s = (jstring)env->CallObjectMethod(exc, tid); + const char *utf = env->GetStringUTFChars(s, (jboolean)false); + env->DeleteLocalRef(s); + Msg = PlugDup(m_G, utf); + } else + Msg = "Exception occured"; + + env->ExceptionClear(); + } else if (rc < 0) { + s = (jstring)env->CallObjectMethod(job, errid); + Msg = (char*)env->GetStringUTFChars(s, (jboolean)false); + } else + Msg = NULL; + + return (Msg != NULL); +} // end of Check + +/***********************************************************************/ +/* Get MethodID if not exists yet. */ +/***********************************************************************/ +bool JAVAConn::gmID(PGLOBAL g, jmethodID& mid, const char *name, const char *sig) +{ + if (mid == nullptr) { + mid = env->GetMethodID(jdi, name, sig); + + if (Check()) { + strcpy(g->Message, Msg); + return true; + } else + return false; + + } else + return false; + +} // end of gmID + +#if 0 +/***********************************************************************/ +/* Utility routine. */ +/***********************************************************************/ +int JAVAConn::GetMaxValue(int n) +{ + jint m; + jmethodID maxid = nullptr; + + if (gmID(m_G, maxid, "GetMaxValue", "(I)I")) + return -1; + + // call method + if (Check(m = env->CallIntMethod(job, maxid, n))) + htrc("GetMaxValue: %s", Msg); + + return (int)m; +} // end of GetMaxValue +#endif // 0 + +/***********************************************************************/ +/* Reset the JVM library. */ +/***********************************************************************/ +void JAVAConn::ResetJVM(void) +{ + if (LibJvm) { +#if defined(__WIN__) + FreeLibrary((HMODULE)LibJvm); +#else // !__WIN__ + dlclose(LibJvm); +#endif // !__WIN__ + LibJvm = NULL; + CreateJavaVM = NULL; + GetCreatedJavaVMs = NULL; +#if defined(_DEBUG) + GetDefaultJavaVMInitArgs = NULL; +#endif // _DEBUG + } // endif LibJvm + +} // end of ResetJVM + +/***********************************************************************/ +/* Dynamically link the JVM library. */ +/* The purpose of this function is to allow using the CONNECT plugin */ +/* for other table types when the Java JDK is not installed. */ +/***********************************************************************/ +bool JAVAConn::GetJVM(PGLOBAL g) +{ + int ntry; + + if (!LibJvm) { + char soname[512]; + +#if defined(__WIN__) + for (ntry = 0; !LibJvm && ntry < 3; ntry++) { + if (!ntry && JvmPath) { + strcat(strcpy(soname, JvmPath), "\\jvm.dll"); + ntry = 3; // No other try + } else if (ntry < 2 && getenv("JAVA_HOME")) { + strcpy(soname, getenv("JAVA_HOME")); + + if (ntry == 1) + strcat(soname, "\\jre"); + + strcat(soname, "\\bin\\client\\jvm.dll"); + } else { + // Try to find it through the registry + char version[16]; + char javaKey[64] = "SOFTWARE\\JavaSoft\\Java Runtime Environment"; + LONG rc; + DWORD BufferSize = 16; + + strcpy(soname, "jvm.dll"); // In case it fails + + if ((rc = RegGetValue(HKEY_LOCAL_MACHINE, javaKey, "CurrentVersion", + RRF_RT_ANY, NULL, (PVOID)&version, &BufferSize)) == ERROR_SUCCESS) { + strcat(strcat(javaKey, "\\"), version); + BufferSize = sizeof(soname); + + if ((rc = RegGetValue(HKEY_LOCAL_MACHINE, javaKey, "RuntimeLib", + RRF_RT_ANY, NULL, (PVOID)&soname, &BufferSize)) != ERROR_SUCCESS) + printf("RegGetValue: rc=%ld\n", rc); + + } // endif rc + + ntry = 3; // Try this only once + } // endelse + + // Load the desired shared library + LibJvm = LoadLibrary(soname); + } // endfor ntry + + // Get the needed entries + if (!LibJvm) { + char buf[256]; + DWORD rc = GetLastError(); + + sprintf(g->Message, MSG(DLL_LOAD_ERROR), rc, soname); + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, NULL, rc, 0, + (LPTSTR)buf, sizeof(buf), NULL); + strcat(strcat(g->Message, ": "), buf); + } else if (!(CreateJavaVM = (CRTJVM)GetProcAddress((HINSTANCE)LibJvm, + "JNI_CreateJavaVM"))) { + sprintf(g->Message, MSG(PROCADD_ERROR), GetLastError(), "JNI_CreateJavaVM"); + FreeLibrary((HMODULE)LibJvm); + LibJvm = NULL; + } else if (!(GetCreatedJavaVMs = (GETJVM)GetProcAddress((HINSTANCE)LibJvm, + "JNI_GetCreatedJavaVMs"))) { + sprintf(g->Message, MSG(PROCADD_ERROR), GetLastError(), "JNI_GetCreatedJavaVMs"); + FreeLibrary((HMODULE)LibJvm); + LibJvm = NULL; +#if defined(_DEBUG) + } else if (!(GetDefaultJavaVMInitArgs = (GETDEF)GetProcAddress((HINSTANCE)LibJvm, + "JNI_GetDefaultJavaVMInitArgs"))) { + sprintf(g->Message, MSG(PROCADD_ERROR), GetLastError(), + "JNI_GetDefaultJavaVMInitArgs"); + FreeLibrary((HMODULE)LibJvm); + LibJvm = NULL; +#endif // _DEBUG + } // endif LibJvm +#else // !__WIN__ + const char *error = NULL; + + for (ntry = 0; !LibJvm && ntry < 2; ntry++) { + if (!ntry && JvmPath) { + strcat(strcpy(soname, JvmPath), "/libjvm.so"); + ntry = 2; + } else if (!ntry && getenv("JAVA_HOME")) { + // TODO: Replace i386 by a better guess + strcat(strcpy(soname, getenv("JAVA_HOME")), "/jre/lib/i386/client/libjvm.so"); + } else { // Will need LD_LIBRARY_PATH to be set + strcpy(soname, "libjvm.so"); + ntry = 2; + } // endelse + + LibJvm = dlopen(soname, RTLD_LAZY); + } // endfor ntry + + // Load the desired shared library + if (!LibJvm) { + error = dlerror(); + sprintf(g->Message, MSG(SHARED_LIB_ERR), soname, SVP(error)); + } else if (!(CreateJavaVM = (CRTJVM)dlsym(LibJvm, "JNI_CreateJavaVM"))) { + error = dlerror(); + sprintf(g->Message, MSG(GET_FUNC_ERR), "JNI_CreateJavaVM", SVP(error)); + dlclose(LibJvm); + LibJvm = NULL; + } else if (!(GetCreatedJavaVMs = (GETJVM)dlsym(LibJvm, "JNI_GetCreatedJavaVMs"))) { + error = dlerror(); + sprintf(g->Message, MSG(GET_FUNC_ERR), "JNI_GetCreatedJavaVMs", SVP(error)); + dlclose(LibJvm); + LibJvm = NULL; +#if defined(_DEBUG) + } else if (!(GetDefaultJavaVMInitArgs = (GETDEF)dlsym(LibJvm, + "JNI_GetDefaultJavaVMInitArgs"))) { + error = dlerror(); + sprintf(g->Message, MSG(GET_FUNC_ERR), "JNI_GetDefaultJavaVMInitArgs", SVP(error)); + dlclose(LibJvm); + LibJvm = NULL; +#endif // _DEBUG + } // endif LibJvm +#endif // !__WIN__ + + } // endif LibJvm + + return LibJvm == NULL; +} // end of GetJVM + +/***********************************************************************/ +/* Open: connect to a data source. */ +/***********************************************************************/ +bool JAVAConn::Open(PGLOBAL g) +{ + bool brc = true, err = false; + jboolean jt = (trace > 0); + + // Link or check whether jvm library was linked + if (GetJVM(g)) + return true; + + // Firstly check whether the jvm was already created + JavaVM* jvms[1]; + jsize jsz; + jint rc = GetCreatedJavaVMs(jvms, 1, &jsz); + + if (rc == JNI_OK && jsz == 1) { + // jvm already existing + jvm = jvms[0]; + rc = jvm->AttachCurrentThread((void**)&env, nullptr); + + if (rc != JNI_OK) { + strcpy(g->Message, "Cannot attach jvm to the current thread"); + return true; + } // endif rc + + } else { + /*******************************************************************/ + /* Create a new jvm */ + /*******************************************************************/ + PSTRG jpop = new(g)STRING(g, 512, "-Djava.class.path=."); + char *cp = NULL; + char sep; + +#if defined(__WIN__) + sep = ';'; +#define N 1 + //#define N 2 + //#define N 3 +#else + sep = ':'; +#define N 1 +#endif + + // Add wrappers jar files + AddJars(jpop, sep); + + //================== prepare loading of Java VM ============================ + JavaVMInitArgs vm_args; // Initialization arguments + JavaVMOption* options = new JavaVMOption[N]; // JVM invocation options + + // where to find java .class + if (ClassPath && *ClassPath) { + jpop->Append(sep); + jpop->Append(ClassPath); + } // endif ClassPath + + // Java source will be compiled as a jar file installed in the plugin dir + jpop->Append(sep); + jpop->Append(GetPluginDir()); + jpop->Append("JdbcInterface.jar"); + + // All wrappers are pre-compiled in JavaWrappers.jar in the plugin dir + jpop->Append(sep); + jpop->Append(GetPluginDir()); + jpop->Append("JavaWrappers.jar"); + + if ((cp = getenv("CLASSPATH"))) { + jpop->Append(sep); + jpop->Append(cp); + } // endif cp + + if (trace) { + htrc("ClassPath=%s\n", ClassPath); + htrc("CLASSPATH=%s\n", cp); + htrc("%s\n", jpop->GetStr()); + } // endif trace + + options[0].optionString = jpop->GetStr(); +#if N == 2 + options[1].optionString = "-Xcheck:jni"; +#endif +#if N == 3 + options[1].optionString = "-Xms256M"; + options[2].optionString = "-Xmx512M"; +#endif +#if defined(_DEBUG) + vm_args.version = JNI_VERSION_1_2; // minimum Java version + rc = GetDefaultJavaVMInitArgs(&vm_args); +#else + vm_args.version = JNI_VERSION_1_6; // minimum Java version +#endif // _DEBUG + vm_args.nOptions = N; // number of options + vm_args.options = options; + vm_args.ignoreUnrecognized = false; // invalid options make the JVM init fail + + //=============== load and initialize Java VM and JNI interface ============= + rc = CreateJavaVM(&jvm, (void**)&env, &vm_args); // YES !! + delete options; // we then no longer need the initialisation options. + + switch (rc) { + case JNI_OK: + strcpy(g->Message, "VM successfully created"); + brc = false; + break; + case JNI_ERR: + strcpy(g->Message, "Initialising JVM failed: unknown error"); + break; + case JNI_EDETACHED: + strcpy(g->Message, "Thread detached from the VM"); + break; + case JNI_EVERSION: + strcpy(g->Message, "JNI version error"); + break; + case JNI_ENOMEM: + strcpy(g->Message, "Not enough memory"); + break; + case JNI_EEXIST: + strcpy(g->Message, "VM already created"); + break; + case JNI_EINVAL: + strcpy(g->Message, "Invalid arguments"); + break; + default: + sprintf(g->Message, "Unknown return code %d", (int)rc); + break; + } // endswitch rc + + if (trace) + htrc("%s\n", g->Message); + + if (brc) + return true; + + //=============== Display JVM version =============== + jint ver = env->GetVersion(); + printf("JVM Version %d.%d\n", ((ver >> 16) & 0x0f), (ver & 0x0f)); + } // endif rc + + // try to find the java wrapper class + jdi = env->FindClass(m_Wrap); + + if (jdi == nullptr) { + sprintf(g->Message, "ERROR: class %s not found!", m_Wrap); + return true; + } // endif jdi + +#if 0 // Suppressed because it does not make any usable change + if (b && jpath && *jpath) { + // Try to add that path the the jvm class path + jmethodID alp = env->GetStaticMethodID(jdi, "addLibraryPath", + "(Ljava/lang/String;)I"); + + if (alp == nullptr) { + env->ExceptionDescribe(); + env->ExceptionClear(); + } else { + char *msg; + jstring path = env->NewStringUTF(jpath); + rc = env->CallStaticIntMethod(jdi, alp, path); + + if ((msg = Check(rc))) { + strcpy(g->Message, msg); + env->DeleteLocalRef(path); + return RC_FX; + } else switch (rc) { + case JNI_OK: + printf("jpath added\n"); + break; + case JNI_EEXIST: + printf("jpath already exist\n"); + break; + case JNI_ERR: + default: + strcpy(g->Message, "Error adding jpath"); + env->DeleteLocalRef(path); + return RC_FX; + } // endswitch rc + + env->DeleteLocalRef(path); + } // endif alp + + } // endif jpath +#endif // 0 + + // if class found, continue + jmethodID ctor = env->GetMethodID(jdi, "", "(Z)V"); + + if (ctor == nullptr) { + sprintf(g->Message, "ERROR: %s constructor not found!", m_Wrap); + return true; + } else + job = env->NewObject(jdi, ctor, jt); + + if (job == nullptr) { + sprintf(g->Message, "%s class object not constructed!", m_Wrap); + return true; + } // endif job + + // If the object is successfully constructed, + // we can then search for the method we want to call, + // and invoke it for the object: + errid = env->GetMethodID(jdi, "GetErrmsg", "()Ljava/lang/String;"); + + if (env->ExceptionCheck()) { + strcpy(g->Message, "ERROR: method GetErrmsg() not found!"); + env->ExceptionDescribe(); + env->ExceptionClear(); + return true; + } // endif Check + + /*********************************************************************/ + /* Link a Fblock. This make possible to automatically close it */ + /* in case of error (throw). */ + /*********************************************************************/ + PDBUSER dbuserp = (PDBUSER)g->Activityp->Aptr; + + fp = (PFBLOCK)PlugSubAlloc(g, NULL, sizeof(FBLOCK)); + fp->Type = TYPE_FB_JAVA; + fp->Fname = NULL; + fp->Next = dbuserp->Openlist; + dbuserp->Openlist = fp; + fp->Count = 1; + fp->Length = 0; + fp->Memory = NULL; + fp->Mode = MODE_ANY; + fp->File = this; + fp->Handle = 0; + + m_Opened = true; + return false; +} // end of Open + +/***********************************************************************/ +/* Disconnect connection */ +/***********************************************************************/ +void JAVAConn::Close() +{ + jint rc; + + if (m_Connected) { + jmethodID did = nullptr; + + // Could have been detached in case of join + rc = jvm->AttachCurrentThread((void**)&env, nullptr); + + if (gmID(m_G, did, DiscFunc, "()I")) + printf("%s\n", Msg); + else if (Check(env->CallIntMethod(job, did))) + printf("%s: %s\n", DiscFunc, Msg); + + m_Connected = false; + } // endif m_Connected + + if ((rc = jvm->DetachCurrentThread()) != JNI_OK) + printf("DetachCurrentThread: rc=%d\n", (int)rc); + + if (fp) + fp->Count = 0; + + m_Opened = false; +} // end of Close diff --git a/storage/connect/javaconn.h b/storage/connect/javaconn.h new file mode 100644 index 00000000000..5d82570365b --- /dev/null +++ b/storage/connect/javaconn.h @@ -0,0 +1,129 @@ +/***********************************************************************/ +/* JavaConn.h : header file for the Java connection classes. */ +/***********************************************************************/ + +/***********************************************************************/ +/* Included C-definition files required by the interface. */ +/***********************************************************************/ +#include "block.h" +#include "jdbccat.h" + +/***********************************************************************/ +/* Java native interface. */ +/***********************************************************************/ +#include + +/***********************************************************************/ +/* Constants and defines. */ +/***********************************************************************/ +// Miscellaneous sizing info +#define MAX_NUM_OF_MSG 10 // Max number of error messages +//efine MAX_CURRENCY 30 // Max size of Currency($) string +#define MAX_TNAME_LEN 32 // Max size of table names +//efine MAX_FNAME_LEN 256 // Max size of field names +//efine MAX_STRING_INFO 256 // Max size of string from SQLGetInfo +//efine MAX_DNAME_LEN 256 // Max size of Recordset names +//efine MAX_CONNECT_LEN 512 // Max size of Connect string +//efine MAX_CURSOR_NAME 18 // Max size of a cursor name +//efine DEFAULT_FIELD_TYPE 0 // TYPE_NULL + +#if !defined(__WIN__) +typedef unsigned char *PUCHAR; +#endif // !__WIN__ + +enum JCATINFO { + JCAT_TAB = 1, // JDBC Tables + JCAT_COL = 2, // JDBC Columns + JCAT_KEY = 3, // JDBC PrimaryKeys +}; + +/***********************************************************************/ +/* This structure is used to control the catalog functions. */ +/***********************************************************************/ +typedef struct tagJCATPARM { + JCATINFO Id; // Id to indicate function + PQRYRES Qrp; // Result set pointer + PCSZ DB; // Database (Schema) + PCSZ Tab; // Table name or pattern + PCSZ Pat; // Table type or column pattern +} JCATPARM; + +typedef jint(JNICALL *CRTJVM) (JavaVM **, void **, void *); +typedef jint(JNICALL *GETJVM) (JavaVM **, jsize, jsize *); +#if defined(_DEBUG) +typedef jint(JNICALL *GETDEF) (void *); +#endif // _DEBUG + +class JAVAConn; + +/***********************************************************************/ +/* JAVAConn class. */ +/***********************************************************************/ +class JAVAConn : public BLOCK { + friend class TDBJMG; + friend class JMGDISC; +private: + JAVAConn(); // Standard (unused) constructor + +public: + // Constructor + JAVAConn(PGLOBAL g, PCSZ wrapper); + + // Set static variables + static void SetJVM(void) { + LibJvm = NULL; + CreateJavaVM = NULL; + GetCreatedJavaVMs = NULL; +#if defined(_DEBUG) + GetDefaultJavaVMInitArgs = NULL; +#endif // _DEBUG + } // end of SetJVM + + static void ResetJVM(void); + static bool GetJVM(PGLOBAL g); + + // Implementation +public: + //virtual ~JAVAConn(); + bool IsOpen(void) { return m_Opened; } + bool IsConnected(void) { return m_Connected; } + + // Java operations +protected: + bool gmID(PGLOBAL g, jmethodID& mid, const char *name, const char *sig); + bool Check(jint rc = 0); + +public: + virtual void AddJars(PSTRG jpop, char sep) = 0; + virtual bool Connect(PJPARM sop) = 0; + virtual bool Open(PGLOBAL g); + virtual bool MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options, + PCSZ filter, bool pipe) = 0; + virtual void Close(void); + +protected: + // Members +#if defined(__WIN__) + static HANDLE LibJvm; // Handle to the jvm DLL +#else // !__WIN__ + static void *LibJvm; // Handle for the jvm shared library +#endif // !__WIN__ + static CRTJVM CreateJavaVM; + static GETJVM GetCreatedJavaVMs; +#if defined(_DEBUG) + static GETDEF GetDefaultJavaVMInitArgs; +#endif // _DEBUG + PGLOBAL m_G; + JavaVM *jvm; // Pointer to the JVM (Java Virtual Machine) + JNIEnv *env; // Pointer to native interface + jclass jdi; // Pointer to the java wrapper class + jobject job; // The java wrapper class object + jmethodID errid; // The GetErrmsg method ID + PFBLOCK fp; + bool m_Opened; + bool m_Connected; + PCSZ DiscFunc; + PCSZ Msg; + PCSZ m_Wrap; + int m_Rows; +}; // end of JAVAConn class definition diff --git a/storage/connect/jdbccat.h b/storage/connect/jdbccat.h index 7108aa376ce..1210aff77d8 100644 --- a/storage/connect/jdbccat.h +++ b/storage/connect/jdbccat.h @@ -1,16 +1,19 @@ +#ifndef __JDBCCAT_H +#define __JDBCCAT_H + // Timeout and net wait defaults #define DEFAULT_LOGIN_TIMEOUT -1 // means do not set #define DEFAULT_QUERY_TIMEOUT -1 // means do not set typedef struct jdbc_parms { int CheckSize(int rows); - char *Driver; // JDBC driver - char *Url; // Driver URL - char *User; // User connect info - char *Pwd; // Password connect info -//char *Properties; // Connection property list + PCSZ Driver; // JDBC driver + PCSZ Url; // Driver URL + PCSZ User; // User connect info + PCSZ Pwd; // Password connect info //int Cto; // Connect timeout //int Qto; // Query timeout + int Version; // Driver version int Fsize; // Fetch size bool Scrollable; // Scrollable cursor } JDBCPARM, *PJPARM; @@ -19,12 +22,14 @@ typedef struct jdbc_parms { /* JDBC catalog function prototypes. */ /***********************************************************************/ #if defined(PROMPT_OK) -char *JDBCCheckConnection(PGLOBAL g, char *dsn, int cop); +char *JDBCCheckConnection(PGLOBAL g, PCSZ dsn, int cop); #endif // PROMPT_OK //PQRYRES JDBCDataSources(PGLOBAL g, int maxres, bool info); -PQRYRES JDBCColumns(PGLOBAL g, char *db, char *table, - char *colpat, int maxres, bool info, PJPARM sop); -PQRYRES JDBCSrcCols(PGLOBAL g, char *src, PJPARM sop); -PQRYRES JDBCTables(PGLOBAL g, char *db, char *tabpat, - char *tabtyp, int maxres, bool info, PJPARM sop); +PQRYRES JDBCColumns(PGLOBAL g, PCSZ db, PCSZ table, + PCSZ colpat, int maxres, bool info, PJPARM sop); +PQRYRES JDBCSrcCols(PGLOBAL g, PCSZ src, PJPARM sop); +PQRYRES JDBCTables(PGLOBAL g, PCSZ db, PCSZ tabpat, + PCSZ tabtyp, int maxres, bool info, PJPARM sop); PQRYRES JDBCDrivers(PGLOBAL g, int maxres, bool info); + +#endif // __JDBCCAT_H diff --git a/storage/connect/jdbconn.cpp b/storage/connect/jdbconn.cpp index c1d077406b7..9746a66e6c8 100644 --- a/storage/connect/jdbconn.cpp +++ b/storage/connect/jdbconn.cpp @@ -53,38 +53,28 @@ #include "osutil.h" -#if defined(__WIN__) -extern "C" HINSTANCE s_hModule; // Saved module handle -#endif // __WIN__ +//#if defined(__WIN__) +//extern "C" HINSTANCE s_hModule; // Saved module handle +//#endif // __WIN__ #define nullptr 0 TYPCONV GetTypeConv(); int GetConvSize(); -extern char *JvmPath; // The connect_jvm_path global variable value -extern char *ClassPath; // The connect_class_path global variable value +//extern char *JvmPath; // The connect_jvm_path global variable value +//extern char *ClassPath; // The connect_class_path global variable value -char *GetJavaWrapper(void); // The connect_java_wrapper variable value - -/***********************************************************************/ -/* Static JDBConn objects. */ -/***********************************************************************/ -void *JDBConn::LibJvm = NULL; -CRTJVM JDBConn::CreateJavaVM = NULL; -GETJVM JDBConn::GetCreatedJavaVMs = NULL; -#if defined(_DEBUG) -GETDEF JDBConn::GetDefaultJavaVMInitArgs = NULL; -#endif // _DEBUG +//char *GetJavaWrapper(void); // The connect_java_wrapper variable value /***********************************************************************/ /* Some macro's (should be defined elsewhere to be more accessible) */ /***********************************************************************/ -#if defined(_DEBUG) -#define ASSERT(f) assert(f) -#define DEBUG_ONLY(f) (f) -#else // !_DEBUG -#define ASSERT(f) ((void)0) -#define DEBUG_ONLY(f) ((void)0) -#endif // !_DEBUG +//#if defined(_DEBUG) +//#define ASSERT(f) assert(f) +//#define DEBUG_ONLY(f) (f) +//#else // !_DEBUG +//#define ASSERT(f) ((void)0) +//#define DEBUG_ONLY(f) ((void)0) +//#endif // !_DEBUG // To avoid gcc warning int TranslateJDBCType(int stp, char *tn, int prec, int& len, char& v); @@ -120,66 +110,82 @@ int TranslateJDBCType(int stp, char *tn, int prec, int& len, char& v) int type; switch (stp) { - case -1: // LONGVARCHAR + case -1: // LONGVARCHAR, TEXT + case -16: // LONGNVARCHAR, NTEXT (unicode) if (GetTypeConv() != TPC_YES) return TYPE_ERROR; else len = MY_MIN(abs(len), GetConvSize()); - case 12: // VARCHAR + // Pass through + case 12: // VARCHAR + case -9: // NVARCHAR (unicode) v = 'V'; - case 1: // CHAR + case 1: // CHAR + case -15: // NCHAR (unicode) + case -8: // ROWID type = TYPE_STRING; break; - case 2: // NUMERIC - case 3: // DECIMAL - case -3: // VARBINARY + case 2: // NUMERIC + case 3: // DECIMAL + case -3: // VARBINARY type = TYPE_DECIM; break; - case 4: // INTEGER + case 4: // INTEGER type = TYPE_INT; break; - case 5: // SMALLINT + case 5: // SMALLINT type = TYPE_SHORT; break; - case -6: // TINYINT - case -7: // BIT + case -6: // TINYINT + case -7: // BIT + case 16: // BOOLEAN type = TYPE_TINY; break; - case 6: // FLOAT - case 7: // REAL - case 8: // DOUBLE + case 6: // FLOAT + case 7: // REAL + case 8: // DOUBLE type = TYPE_DOUBLE; break; - case 93: // TIMESTAMP, DATETIME + case 93: // TIMESTAMP, DATETIME type = TYPE_DATE; len = 19 + ((prec) ? (prec+1) : 0); v = (tn && toupper(tn[0]) == 'T') ? 'S' : 'E'; break; - case 91: // DATE, YEAR + case 91: // DATE, YEAR type = TYPE_DATE; - if (!tn || toupper(tn[0]) != 'Y') { - len = 10; - v = 'D'; - } else { - len = 4; - v = 'Y'; - } // endif len + if (!tn || toupper(tn[0]) != 'Y') { + len = 10; + v = 'D'; + } else { + len = 4; + v = 'Y'; + } // endif len - break; - case 92: // TIME - type = TYPE_DATE; - len = 8 + ((prec) ? (prec+1) : 0); - v = 'T'; - break; - case -5: // BIGINT - type = TYPE_BIGINT; - break; - case 0: // NULL - case -2: // BINARY - case -4: // LONGVARBINARY - default: - type = TYPE_ERROR; + break; + case 92: // TIME + type = TYPE_DATE; + len = 8 + ((prec) ? (prec + 1) : 0); + v = 'T'; + break; + case -5: // BIGINT + type = TYPE_BIGINT; + break; + case 0: // NULL + case -2: // BINARY + case -4: // LONGVARBINARY + case 70: // DATALINK + case 2000: // JAVA_OBJECT + case 2001: // DISTINCT + case 2002: // STRUCT + case 2003: // ARRAY + case 2004: // BLOB + case 2005: // CLOB + case 2006: // REF + case 2009: // SQLXML + case 2011: // NCLOB + default: + type = TYPE_ERROR; len = 0; } // endswitch type @@ -189,8 +195,8 @@ int TranslateJDBCType(int stp, char *tn, int prec, int& len, char& v) /***********************************************************************/ /* Allocate the structure used to refer to the result set. */ /***********************************************************************/ -static JCATPARM *AllocCatInfo(PGLOBAL g, JCATINFO fid, char *db, - char *tab, PQRYRES qrp) +static JCATPARM *AllocCatInfo(PGLOBAL g, JCATINFO fid, PCSZ db, + PCSZ tab, PQRYRES qrp) { JCATPARM *cap; @@ -213,7 +219,7 @@ static JCATPARM *AllocCatInfo(PGLOBAL g, JCATINFO fid, char *db, /* JDBCColumns: constructs the result blocks containing all columns */ /* of a JDBC table that will be retrieved by GetData commands. */ /***********************************************************************/ -PQRYRES JDBCColumns(PGLOBAL g, char *db, char *table, char *colpat, +PQRYRES JDBCColumns(PGLOBAL g, PCSZ db, PCSZ table, PCSZ colpat, int maxres, bool info, PJPARM sjp) { int buftyp[] = {TYPE_STRING, TYPE_STRING, TYPE_STRING, TYPE_STRING, @@ -224,11 +230,11 @@ PQRYRES JDBCColumns(PGLOBAL g, char *db, char *table, char *colpat, FLD_SCALE, FLD_RADIX, FLD_NULL, FLD_REM}; unsigned int length[] = {0, 0, 0, 0, 6, 0, 10, 10, 6, 6, 6, 0}; bool b[] = {true, true, false, false, false, false, false, false, true, true, false, true}; - int i, n, ncol = 12; - PCOLRES crp; - PQRYRES qrp; + int i, n, ncol = 12; + PCOLRES crp; + PQRYRES qrp; JCATPARM *cap; - JDBConn *jcp = NULL; + JDBConn *jcp = NULL; /************************************************************************/ /* Do an evaluation of the result size. */ @@ -236,7 +242,7 @@ PQRYRES JDBCColumns(PGLOBAL g, char *db, char *table, char *colpat, if (!info) { jcp = new(g)JDBConn(g, NULL); - if (jcp->Open(sjp) != RC_OK) // openReadOnly + noJDBCdialog + if (jcp->Connect(sjp)) // openReadOnly + noJDBCdialog return NULL; if (table && !strchr(table, '%')) { @@ -284,7 +290,7 @@ PQRYRES JDBCColumns(PGLOBAL g, char *db, char *table, char *colpat, if (trace) htrc("Getting col results ncol=%d\n", qrp->Nbcol); - if (!(cap = AllocCatInfo(g, CAT_COL, db, table, qrp))) + if (!(cap = AllocCatInfo(g, JCAT_COL, db, table, qrp))) return NULL; // Colpat cannot be null or empty for some drivers @@ -316,13 +322,13 @@ PQRYRES JDBCColumns(PGLOBAL g, char *db, char *table, char *colpat, /* JDBCSrcCols: constructs the result blocks containing the */ /* description of all the columns of a Srcdef option. */ /**************************************************************************/ -PQRYRES JDBCSrcCols(PGLOBAL g, char *src, PJPARM sjp) +PQRYRES JDBCSrcCols(PGLOBAL g, PCSZ src, PJPARM sjp) { char *sqry; PQRYRES qrp; JDBConn *jcp = new(g)JDBConn(g, NULL); - if (jcp->Open(sjp)) + if (jcp->Connect(sjp)) return NULL; if (strstr(src, "%s")) { @@ -330,7 +336,7 @@ PQRYRES JDBCSrcCols(PGLOBAL g, char *src, PJPARM sjp) sqry = (char*)PlugSubAlloc(g, NULL, strlen(src) + 2); sprintf(sqry, src, "1=1"); // dummy where clause } else - sqry = src; + sqry = (char*)src; qrp = jcp->GetMetaData(g, sqry); jcp->Close(); @@ -341,7 +347,7 @@ PQRYRES JDBCSrcCols(PGLOBAL g, char *src, PJPARM sjp) /* JDBCTables: constructs the result blocks containing all tables in */ /* an JDBC database that will be retrieved by GetData commands. */ /**************************************************************************/ -PQRYRES JDBCTables(PGLOBAL g, char *db, char *tabpat, char *tabtyp, +PQRYRES JDBCTables(PGLOBAL g, PCSZ db, PCSZ tabpat, PCSZ tabtyp, int maxres, bool info, PJPARM sjp) { int buftyp[] = {TYPE_STRING, TYPE_STRING, TYPE_STRING, @@ -364,7 +370,7 @@ PQRYRES JDBCTables(PGLOBAL g, char *db, char *tabpat, char *tabtyp, /**********************************************************************/ jcp = new(g)JDBConn(g, NULL); - if (jcp->Open(sjp) == RC_FX) + if (jcp->Connect(sjp)) return NULL; if (!maxres) @@ -405,7 +411,7 @@ PQRYRES JDBCTables(PGLOBAL g, char *db, char *tabpat, char *tabtyp, return qrp; // Tabpat cannot be null or empty for some drivers - if (!(cap = AllocCatInfo(g, CAT_TAB, db, + if (!(cap = AllocCatInfo(g, JCAT_TAB, db, (tabpat && *tabpat) ? tabpat : PlugDup(g, "%"), qrp))) return NULL; @@ -460,7 +466,7 @@ PQRYRES JDBCDrivers(PGLOBAL g, int maxres, bool info) if (!info) { jcp = new(g) JDBConn(g, NULL); - if (jcp->Open(NULL) != RC_OK) + if (jcp->Open(g) != RC_OK) return NULL; if (!maxres) @@ -508,37 +514,16 @@ PQRYRES JDBCDrivers(PGLOBAL g, int maxres, bool info) /***********************************************************************/ /* JDBConn construction/destruction. */ /***********************************************************************/ -JDBConn::JDBConn(PGLOBAL g, TDBJDBC *tdbp) +JDBConn::JDBConn(PGLOBAL g, PCSZ wrapper) : JAVAConn(g, wrapper) { - m_G = g; - m_Tdb = tdbp; - jvm = nullptr; // Pointer to the JVM (Java Virtual Machine) - env= nullptr; // Pointer to native interface - jdi = nullptr; // Pointer to the java wrapper class - job = nullptr; // The java wrapper class object xqid = xuid = xid = grs = readid = fetchid = typid = errid = nullptr; prepid = xpid = pcid = nullptr; chrfldid = intfldid = dblfldid = fltfldid = bigfldid = nullptr; objfldid = datfldid = timfldid = tspfldid = nullptr; - //m_LoginTimeout = DEFAULT_LOGIN_TIMEOUT; -//m_QueryTimeout = DEFAULT_QUERY_TIMEOUT; -//m_UpdateOptions = 0; - Msg = NULL; - m_Wrap = (tdbp && tdbp->WrapName) ? tdbp->WrapName : GetJavaWrapper(); - - if (!strchr(m_Wrap, '/')) { - // Add the wrapper package name - char *wn = (char*)PlugSubAlloc(g, NULL, strlen(m_Wrap) + 10); - m_Wrap = strcat(strcpy(wn, "wrappers/"), m_Wrap); - } // endif m_Wrap - -//m_Driver = NULL; -//m_Url = NULL; -//m_User = NULL; -//m_Pwd = NULL; + DiscFunc = "JdbcDisconnect"; m_Ncol = 0; m_Aff = 0; - m_Rows = 0; + //m_Rows = 0; m_Fetch = 0; m_RowsetSize = 0; m_Updatable = true; @@ -548,7 +533,6 @@ JDBConn::JDBConn(PGLOBAL g, TDBJDBC *tdbp) m_Opened = false; m_IDQuoteChar[0] = '"'; m_IDQuoteChar[1] = 0; - //*m_ErrMsg = '\0'; } // end of JDBConn //JDBConn::~JDBConn() @@ -558,55 +542,6 @@ JDBConn::JDBConn(PGLOBAL g, TDBJDBC *tdbp) // } // end of ~JDBConn -/***********************************************************************/ -/* Screen for errors. */ -/***********************************************************************/ -bool JDBConn::Check(jint rc) -{ - jstring s; - - if (env->ExceptionCheck()) { - jthrowable exc = env->ExceptionOccurred(); - jmethodID tid = env->GetMethodID(env->FindClass("java/lang/Object"), - "toString", "()Ljava/lang/String;"); - - if (exc != nullptr && tid != nullptr) { - jstring s = (jstring)env->CallObjectMethod(exc, tid); - const char *utf = env->GetStringUTFChars(s, (jboolean)false); - env->DeleteLocalRef(s); - Msg = PlugDup(m_G, utf); - } else - Msg = "Exception occured"; - - env->ExceptionClear(); - } else if (rc < 0) { - s = (jstring)env->CallObjectMethod(job, errid); - Msg = (char*)env->GetStringUTFChars(s, (jboolean)false); - } else - Msg = NULL; - - return (Msg != NULL); -} // end of Check - -/***********************************************************************/ -/* Get MethodID if not exists yet. */ -/***********************************************************************/ -bool JDBConn::gmID(PGLOBAL g, jmethodID& mid, const char *name, const char *sig) -{ - if (mid == nullptr) { - mid = env->GetMethodID(jdi, name, sig); - - if (Check()) { - strcpy(g->Message, Msg); - return true; - } else - return false; - - } else - return false; - -} // end of gmID - /***********************************************************************/ /* Utility routine. */ /***********************************************************************/ @@ -626,381 +561,52 @@ int JDBConn::GetMaxValue(int n) } // end of GetMaxValue /***********************************************************************/ -/* Reset the JVM library. */ +/* AddJars: add some jar file to the Class path. */ /***********************************************************************/ -void JDBConn::ResetJVM(void) +void JDBConn::AddJars(PSTRG jpop, char sep) { - if (LibJvm) { -#if defined(__WIN__) - FreeLibrary((HMODULE)LibJvm); -#else // !__WIN__ - dlclose(LibJvm); -#endif // !__WIN__ - LibJvm = NULL; - CreateJavaVM = NULL; - GetCreatedJavaVMs = NULL; -#if defined(_DEBUG) - GetDefaultJavaVMInitArgs = NULL; -#endif // _DEBUG - } // endif LibJvm - -} // end of ResetJVM +#if defined(DEVELOPMENT) + jpop->Append( + ";C:/Jconnectors/postgresql-9.4.1208.jar" + ";C:/Oracle/ojdbc7.jar" + ";C:/Apache/commons-dbcp2-2.1.1/commons-dbcp2-2.1.1.jar" + ";C:/Apache/commons-pool2-2.4.2/commons-pool2-2.4.2.jar" + ";C:/Apache/commons-logging-1.2/commons-logging-1.2.jar" + ";C:/Jconnectors/mysql-connector-java-6.0.2-bin.jar" + ";C:/Jconnectors/mariadb-java-client-2.0.1.jar" + ";C:/Jconnectors/sqljdbc42.jar"); +#endif // DEVELOPMENT +} // end of AddJars /***********************************************************************/ -/* Dynamically link the JVM library. */ -/* The purpose of this function is to allow using the CONNECT plugin */ -/* for other table types when the Java JDK is not installed. */ +/* Connect: connect to a data source. */ /***********************************************************************/ -bool JDBConn::GetJVM(PGLOBAL g) -{ - int ntry; - - if (!LibJvm) { - char soname[512]; - -#if defined(__WIN__) - for (ntry = 0; !LibJvm && ntry < 3; ntry++) { - if (!ntry && JvmPath) { - strcat(strcpy(soname, JvmPath), "\\jvm.dll"); - ntry = 3; // No other try - } else if (ntry < 2 && getenv("JAVA_HOME")) { - strcpy(soname, getenv("JAVA_HOME")); - - if (ntry == 1) - strcat(soname, "\\jre"); - - strcat(soname, "\\bin\\client\\jvm.dll"); - } else { - // Try to find it through the registry - char version[16]; - char javaKey[64] = "SOFTWARE\\JavaSoft\\Java Runtime Environment"; - LONG rc; - DWORD BufferSize = 16; - - strcpy(soname, "jvm.dll"); // In case it fails - - if ((rc = RegGetValue(HKEY_LOCAL_MACHINE, javaKey, "CurrentVersion", - RRF_RT_ANY, NULL, (PVOID)&version, &BufferSize)) == ERROR_SUCCESS) { - strcat(strcat(javaKey, "\\"), version); - BufferSize = sizeof(soname); - - if ((rc = RegGetValue(HKEY_LOCAL_MACHINE, javaKey, "RuntimeLib", - RRF_RT_ANY, NULL, (PVOID)&soname, &BufferSize)) != ERROR_SUCCESS) - printf("RegGetValue: rc=%ld\n", rc); - - } // endif rc - - ntry = 3; // Try this only once - } // endelse - - // Load the desired shared library - LibJvm = LoadLibrary(soname); - } // endfor ntry - - // Get the needed entries - if (!LibJvm) { - char buf[256]; - DWORD rc = GetLastError(); - - sprintf(g->Message, MSG(DLL_LOAD_ERROR), rc, soname); - FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, NULL, rc, 0, - (LPTSTR)buf, sizeof(buf), NULL); - strcat(strcat(g->Message, ": "), buf); - } else if (!(CreateJavaVM = (CRTJVM)GetProcAddress((HINSTANCE)LibJvm, - "JNI_CreateJavaVM"))) { - sprintf(g->Message, MSG(PROCADD_ERROR), GetLastError(), "JNI_CreateJavaVM"); - FreeLibrary((HMODULE)LibJvm); - LibJvm = NULL; - } else if (!(GetCreatedJavaVMs = (GETJVM)GetProcAddress((HINSTANCE)LibJvm, - "JNI_GetCreatedJavaVMs"))) { - sprintf(g->Message, MSG(PROCADD_ERROR), GetLastError(), "JNI_GetCreatedJavaVMs"); - FreeLibrary((HMODULE)LibJvm); - LibJvm = NULL; -#if defined(_DEBUG) - } else if (!(GetDefaultJavaVMInitArgs = (GETDEF)GetProcAddress((HINSTANCE)LibJvm, - "JNI_GetDefaultJavaVMInitArgs"))) { - sprintf(g->Message, MSG(PROCADD_ERROR), GetLastError(), - "JNI_GetDefaultJavaVMInitArgs"); - FreeLibrary((HMODULE)LibJvm); - LibJvm = NULL; -#endif // _DEBUG - } // endif LibJvm -#else // !__WIN__ - const char *error = NULL; - - for (ntry = 0; !LibJvm && ntry < 2; ntry++) { - if (!ntry && JvmPath) { - strcat(strcpy(soname, JvmPath), "/libjvm.so"); - ntry = 2; - } else if (!ntry && getenv("JAVA_HOME")) { - // TODO: Replace i386 by a better guess - strcat(strcpy(soname, getenv("JAVA_HOME")), "/jre/lib/i386/client/libjvm.so"); - } else { // Will need LD_LIBRARY_PATH to be set - strcpy(soname, "libjvm.so"); - ntry = 2; - } // endelse - - LibJvm = dlopen(soname, RTLD_LAZY); - } // endfor ntry - - // Load the desired shared library - if (!LibJvm) { - error = dlerror(); - sprintf(g->Message, MSG(SHARED_LIB_ERR), soname, SVP(error)); - } else if (!(CreateJavaVM = (CRTJVM)dlsym(LibJvm, "JNI_CreateJavaVM"))) { - error = dlerror(); - sprintf(g->Message, MSG(GET_FUNC_ERR), "JNI_CreateJavaVM", SVP(error)); - dlclose(LibJvm); - LibJvm = NULL; - } else if (!(GetCreatedJavaVMs = (GETJVM)dlsym(LibJvm, "JNI_GetCreatedJavaVMs"))) { - error = dlerror(); - sprintf(g->Message, MSG(GET_FUNC_ERR), "JNI_GetCreatedJavaVMs", SVP(error)); - dlclose(LibJvm); - LibJvm = NULL; -#if defined(_DEBUG) - } else if (!(GetDefaultJavaVMInitArgs = (GETDEF)dlsym(LibJvm, - "JNI_GetDefaultJavaVMInitArgs"))) { - error = dlerror(); - sprintf(g->Message, MSG(GET_FUNC_ERR), "JNI_GetDefaultJavaVMInitArgs", SVP(error)); - dlclose(LibJvm); - LibJvm = NULL; -#endif // _DEBUG - } // endif LibJvm -#endif // !__WIN__ - - } // endif LibJvm - - return LibJvm == NULL; -} // end of GetJVM - -/***********************************************************************/ -/* Open: connect to a data source. */ -/***********************************************************************/ -int JDBConn::Open(PJPARM sop) +bool JDBConn::Connect(PJPARM sop) { int irc = RC_FX; bool err = false; + jint rc; jboolean jt = (trace > 0); PGLOBAL& g = m_G; - // Link or check whether jvm library was linked - if (GetJVM(g)) - return RC_FX; - - // Firstly check whether the jvm was already created - JavaVM* jvms[1]; - jsize jsz; - jint rc = GetCreatedJavaVMs(jvms, 1, &jsz); - - if (rc == JNI_OK && jsz == 1) { - // jvm already existing - jvm = jvms[0]; - rc = jvm->AttachCurrentThread((void**)&env, nullptr); - - if (rc != JNI_OK) { - strcpy(g->Message, "Cannot attach jvm to the current thread"); - return RC_FX; - } // endif rc - - } else { - /*******************************************************************/ - /* Create a new jvm */ - /*******************************************************************/ - PSTRG jpop = new(g)STRING(g, 512, "-Djava.class.path=."); - char *cp = NULL; - char sep; - -#if defined(__WIN__) - sep = ';'; -#define N 1 -//#define N 2 -//#define N 3 -#else - sep = ':'; -#define N 1 -#endif - - // Java source will be compiled as a jar file installed in the plugin dir - jpop->Append(sep); - jpop->Append(GetPluginDir()); - jpop->Append("JdbcInterface.jar"); - - // All wrappers are pre-compiled in JavaWrappers.jar in the plugin dir - jpop->Append(sep); - jpop->Append(GetPluginDir()); - jpop->Append("JavaWrappers.jar"); - - //================== prepare loading of Java VM ============================ - JavaVMInitArgs vm_args; // Initialization arguments - JavaVMOption* options = new JavaVMOption[N]; // JVM invocation options - - // where to find java .class - if (ClassPath && *ClassPath) { - jpop->Append(sep); - jpop->Append(ClassPath); - } // endif ClassPath - - if ((cp = getenv("CLASSPATH"))) { - jpop->Append(sep); - jpop->Append(cp); - } // endif cp - - if (trace) { - htrc("ClassPath=%s\n", ClassPath); - htrc("CLASSPATH=%s\n", cp); - htrc("%s\n", jpop->GetStr()); - } // endif trace - - options[0].optionString = jpop->GetStr(); -#if N == 2 - options[1].optionString = "-Xcheck:jni"; -#endif -#if N == 3 - options[1].optionString = "-Xms256M"; - options[2].optionString = "-Xmx512M"; -#endif -#if defined(_DEBUG) - vm_args.version = JNI_VERSION_1_2; // minimum Java version - rc = GetDefaultJavaVMInitArgs(&vm_args); -#else - vm_args.version = JNI_VERSION_1_6; // minimum Java version -#endif // _DEBUG - vm_args.nOptions = N; // number of options - vm_args.options = options; - vm_args.ignoreUnrecognized = false; // invalid options make the JVM init fail - - //=============== load and initialize Java VM and JNI interface ============= - rc = CreateJavaVM(&jvm, (void**)&env, &vm_args); // YES !! - delete options; // we then no longer need the initialisation options. - - switch (rc) { - case JNI_OK: - strcpy(g->Message, "VM successfully created"); - irc = RC_OK; - break; - case JNI_ERR: - strcpy(g->Message, "Initialising JVM failed: unknown error"); - break; - case JNI_EDETACHED: - strcpy(g->Message, "Thread detached from the VM"); - break; - case JNI_EVERSION: - strcpy(g->Message, "JNI version error"); - break; - case JNI_ENOMEM: - strcpy(g->Message, "Not enough memory"); - break; - case JNI_EEXIST: - strcpy(g->Message, "VM already created"); - break; - case JNI_EINVAL: - strcpy(g->Message, "Invalid arguments"); - break; - default: - sprintf(g->Message, "Unknown return code %d", (int)rc); - break; - } // endswitch rc - - if (trace) - htrc("%s\n", g->Message); - - if (irc != RC_OK) - return irc; - - //=============== Display JVM version =============== - jint ver = env->GetVersion(); - printf("JVM Version %d.%d\n", ((ver>>16)&0x0f), (ver&0x0f)); - } // endif rc - - // try to find the java wrapper class - jdi = env->FindClass(m_Wrap); - - if (jdi == nullptr) { - sprintf(g->Message, "ERROR: class %s not found!", m_Wrap); - return RC_FX; - } // endif jdi - -#if 0 // Suppressed because it does not make any usable change - if (b && jpath && *jpath) { - // Try to add that path the the jvm class path - jmethodID alp = env->GetStaticMethodID(jdi, "addLibraryPath", - "(Ljava/lang/String;)I"); - - if (alp == nullptr) { - env->ExceptionDescribe(); - env->ExceptionClear(); - } else { - char *msg; - jstring path = env->NewStringUTF(jpath); - rc = env->CallStaticIntMethod(jdi, alp, path); - - if ((msg = Check(rc))) { - strcpy(g->Message, msg); - env->DeleteLocalRef(path); - return RC_FX; - } else switch (rc) { - case JNI_OK: - printf("jpath added\n"); - break; - case JNI_EEXIST: - printf("jpath already exist\n"); - break; - case JNI_ERR: - default: - strcpy(g->Message, "Error adding jpath"); - env->DeleteLocalRef(path); - return RC_FX; - } // endswitch rc - - env->DeleteLocalRef(path); - } // endif alp - - } // endif jpath -#endif // 0 - - // if class found, continue - jmethodID ctor = env->GetMethodID(jdi, "", "(Z)V"); - - if (ctor == nullptr) { - sprintf(g->Message, "ERROR: %s constructor not found!", m_Wrap); - return RC_FX; - } else - job = env->NewObject(jdi, ctor, jt); - - // If the object is successfully constructed, - // we can then search for the method we want to call, - // and invoke it for the object: - if (job == nullptr) { - sprintf(g->Message, "%s class object not constructed!", m_Wrap); - return RC_FX; - } // endif job - - errid = env->GetMethodID(jdi, "GetErrmsg", "()Ljava/lang/String;"); - - if (env->ExceptionCheck()) { - strcpy(g->Message, "ERROR: method GetErrmsg() not found!"); - env->ExceptionDescribe(); - env->ExceptionClear(); - return RC_FX; - } // endif Check + /*******************************************************************/ + /* Create or attach a JVM. */ + /*******************************************************************/ + if (Open(g)) + return true; if (!sop) // DRIVER catalog table - return RC_OK; + return false; jmethodID cid = nullptr; if (gmID(g, cid, "JdbcConnect", "([Ljava/lang/String;IZ)I")) - return RC_FX; + return true; // Build the java string array jobjectArray parms = env->NewObjectArray(4, // constructs java array of 4 env->FindClass("java/lang/String"), NULL); // Strings -//m_Driver = sop->Driver; -//m_Url = sop->Url; -//m_User = sop->User; -//m_Pwd = sop->Pwd; m_Scrollable = sop->Scrollable; m_RowsetSize = sop->Fsize; //m_LoginTimeout = sop->Cto; @@ -1020,9 +626,6 @@ int JDBConn::Open(PJPARM sop) if (sop->Pwd) env->SetObjectArrayElement(parms, 3, env->NewStringUTF(sop->Pwd)); -//if (sop->Properties) -// env->SetObjectArrayElement(parms, 4, env->NewStringUTF(sop->Properties)); - // call method rc = env->CallIntMethod(job, cid, parms, m_RowsetSize, m_Scrollable); err = Check(rc); @@ -1030,7 +633,7 @@ int JDBConn::Open(PJPARM sop) if (err) { sprintf(g->Message, "Connecting: %s rc=%d", Msg, (int)rc); - return RC_FX; + return true; } // endif Msg jmethodID qcid = nullptr; @@ -1049,17 +652,18 @@ int JDBConn::Open(PJPARM sop) } // endif qcid if (gmID(g, typid, "ColumnType", "(ILjava/lang/String;)I")) - return RC_FX; + return true; else m_Opened = true; - return RC_OK; -} // end of Open + return false; +} // end of Connect + /***********************************************************************/ /* Execute an SQL command. */ /***********************************************************************/ -int JDBConn::ExecSQLcommand(char *sql) +int JDBConn::ExecuteCommand(PCSZ sql) { int rc; jint n; @@ -1095,7 +699,7 @@ int JDBConn::ExecSQLcommand(char *sql) } // endif ncol return rc; -} // end of ExecSQLcommand +} // end of ExecuteCommand /***********************************************************************/ /* Fetch next row. */ @@ -1142,7 +746,7 @@ int JDBConn::Fetch(int pos) /***********************************************************************/ /* Restart from beginning of result set */ /***********************************************************************/ -int JDBConn::Rewind(char *sql) +int JDBConn::Rewind(PCSZ sql) { int rbuf = -1; @@ -1155,38 +759,12 @@ int JDBConn::Rewind(char *sql) jboolean b = env->CallBooleanMethod(job, fetchid, 0); rbuf = m_Rows; - } else if (ExecSQLcommand(sql) != RC_FX) + } else if (ExecuteCommand(sql) != RC_FX) rbuf = 0; return rbuf; } // end of Rewind -/***********************************************************************/ -/* Disconnect connection */ -/***********************************************************************/ -void JDBConn::Close() -{ - if (m_Opened) { - jint rc; - jmethodID did = nullptr; - - // Could have been detached in case of join - rc = jvm->AttachCurrentThread((void**)&env, nullptr); - - if (gmID(m_G, did, "JdbcDisconnect", "()I")) - printf("%s\n", Msg); - else if (Check(env->CallIntMethod(job, did))) - printf("jdbcDisconnect: %s\n", Msg); - - if ((rc = jvm->DetachCurrentThread()) != JNI_OK) - printf("DetachCurrentThread: rc=%d\n", (int)rc); - - //rc = jvm->DestroyJavaVM(); - m_Opened = false; - } // endif m_Opened - -} // end of Close - /***********************************************************************/ /* Retrieve and set the column value from the result set. */ /***********************************************************************/ @@ -1200,7 +778,7 @@ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val) if (rank == 0) if (!name || (jn = env->NewStringUTF(name)) == nullptr) { sprintf(g->Message, "Fail to allocate jstring %s", SVP(name)); - longjmp(g->jumper[g->jump_level], TYPE_AM_JDBC); + throw (int)TYPE_AM_JDBC; } // endif name // Returns 666 is case of error @@ -1208,7 +786,7 @@ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val) if (Check((ctyp == 666) ? -1 : 1)) { sprintf(g->Message, "Getting ctyp: %s", Msg); - longjmp(g->jumper[g->jump_level], TYPE_AM_JDBC); + throw (int)TYPE_AM_JDBC; } // endif Check if (val->GetNullable()) @@ -1225,9 +803,14 @@ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val) switch (ctyp) { case 12: // VARCHAR - case -1: // LONGVARCHAR + case -9: // NVARCHAR + case -1: // LONGVARCHAR, TEXT case 1: // CHAR - if (jb) + case -15: // NCHAR + case -16: // LONGNVARCHAR, NTEXT + case 3: // DECIMAL + case -8: // ROWID + if (jb && ctyp != 3) cn = (jstring)jb; else if (!gmID(g, chrfldid, "StringField", "(ILjava/lang/String;)Ljava/lang/String;")) cn = (jstring)env->CallObjectMethod(job, chrfldid, (jint)rank, jn); @@ -1244,6 +827,7 @@ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val) case 4: // INTEGER case 5: // SMALLINT case -6: // TINYINT + case 16: // BOOLEAN case -7: // BIT if (!gmID(g, intfldid, "IntField", "(ILjava/lang/String;)I")) val->SetValue((int)env->CallIntMethod(job, intfldid, rank, jn)); @@ -1253,7 +837,7 @@ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val) break; case 8: // DOUBLE case 2: // NUMERIC - case 3: // DECIMAL +//case 3: // DECIMAL if (!gmID(g, dblfldid, "DoubleField", "(ILjava/lang/String;)D")) val->SetValue((double)env->CallDoubleMethod(job, dblfldid, rank, jn)); else @@ -1314,7 +898,7 @@ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val) env->DeleteLocalRef(jn); sprintf(g->Message, "SetColumnValue: %s rank=%d ctyp=%d", Msg, rank, (int)ctyp); - longjmp(g->jumper[g->jump_level], TYPE_AM_JDBC); + throw (int)TYPE_AM_JDBC; } // endif Check if (rank == 0) @@ -1325,7 +909,7 @@ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val) /***********************************************************************/ /* Prepare an SQL statement for insert. */ /***********************************************************************/ -bool JDBConn::PrepareSQL(char *sql) +bool JDBConn::PrepareSQL(PCSZ sql) { bool b = true; PGLOBAL& g = m_G; @@ -1348,7 +932,7 @@ bool JDBConn::PrepareSQL(char *sql) /***********************************************************************/ /* Execute an SQL query that returns a result set. */ /***********************************************************************/ -int JDBConn::ExecuteQuery(char *sql) +int JDBConn::ExecuteQuery(PCSZ sql) { int rc = RC_FX; jint ncol; @@ -1376,7 +960,7 @@ int JDBConn::ExecuteQuery(char *sql) /***********************************************************************/ /* Execute an SQL query and get the affected rows. */ /***********************************************************************/ -int JDBConn::ExecuteUpdate(char *sql) +int JDBConn::ExecuteUpdate(PCSZ sql) { int rc = RC_FX; jint n; @@ -1404,7 +988,7 @@ int JDBConn::ExecuteUpdate(char *sql) /***********************************************************************/ /* Get the number of lines of the result set. */ /***********************************************************************/ -int JDBConn::GetResultSize(char *sql, JDBCCOL *colp) +int JDBConn::GetResultSize(PCSZ sql, PCOL colp) { int rc, n = 0; @@ -1545,53 +1129,6 @@ bool JDBConn::SetParam(JDBCCOL *colp) return rc; } // end of SetParam -#if 0 - /***********************************************************************/ - /* Get the list of Data Sources and set it in qrp. */ - /***********************************************************************/ - bool JDBConn::GetDataSources(PQRYRES qrp) - { - bool rv = false; - UCHAR *dsn, *des; - UWORD dir = SQL_FETCH_FIRST; - SWORD n1, n2, p1, p2; - PCOLRES crp1 = qrp->Colresp, crp2 = qrp->Colresp->Next; - RETCODE rc; - - n1 = crp1->Clen; - n2 = crp2->Clen; - - try { - rc = SQLAllocEnv(&m_henv); - - if (!Check(rc)) - ThrowDJX(rc, "SQLAllocEnv"); // Fatal - - for (int i = 0; i < qrp->Maxres; i++) { - dsn = (UCHAR*)crp1->Kdata->GetValPtr(i); - des = (UCHAR*)crp2->Kdata->GetValPtr(i); - rc = SQLDataSources(m_henv, dir, dsn, n1, &p1, des, n2, &p2); - - if (rc == SQL_NO_DATA_FOUND) - break; - else if (!Check(rc)) - ThrowDJX(rc, "SQLDataSources"); - - qrp->Nblin++; - dir = SQL_FETCH_NEXT; - } // endfor i - - } - catch (DJX *x) { - sprintf(m_G->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); - rv = true; - } // end try/catch - - Close(); - return rv; - } // end of GetDataSources -#endif // 0 - /***********************************************************************/ /* Get the list of Drivers and set it in qrp. */ /***********************************************************************/ @@ -1642,7 +1179,7 @@ bool JDBConn::SetParam(JDBCCOL *colp) /* GetMetaData: constructs the result blocks containing the */ /* description of all the columns of an SQL command. */ /**************************************************************************/ - PQRYRES JDBConn::GetMetaData(PGLOBAL g, char *src) + PQRYRES JDBConn::GetMetaData(PGLOBAL g, PCSZ src) { static int buftyp[] = {TYPE_STRING, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT}; @@ -1657,7 +1194,7 @@ bool JDBConn::SetParam(JDBCCOL *colp) jint *n = nullptr; jstring label; jmethodID colid = nullptr; - int rc = ExecSQLcommand(src); + int rc = ExecuteCommand(src); if (rc == RC_NF) { strcpy(g->Message, "Srcdef is not returning a result set"); @@ -1691,7 +1228,7 @@ bool JDBConn::SetParam(JDBCCOL *colp) case 5: crp->Name = "Nullable"; break; } // endswitch i - // Build the java string array + // Build the java int array jintArray val = env->NewIntArray(4); if (val == nullptr) { @@ -1844,7 +1381,7 @@ bool JDBConn::SetParam(JDBCCOL *colp) PGLOBAL& g = m_G; // void *buffer; int i, ncol; - PSZ fnc = "Unknown"; + PCSZ fnc = "Unknown"; uint n; short len, tp; int crow = 0; @@ -1872,28 +1409,19 @@ bool JDBConn::SetParam(JDBCCOL *colp) // Now do call the proper JDBC API switch (cap->Id) { - case CAT_COL: + case JCAT_COL: fnc = "GetColumns"; break; - case CAT_TAB: + case JCAT_TAB: fnc = "GetTables"; break; #if 0 - case CAT_KEY: + case JCAT_KEY: fnc = "SQLPrimaryKeys"; rc = SQLPrimaryKeys(hstmt, name.ptr(2), name.length(2), name.ptr(1), name.length(1), name.ptr(0), name.length(0)); break; - case CAT_STAT: - fnc = "SQLStatistics"; - rc = SQLStatistics(hstmt, name.ptr(2), name.length(2), - name.ptr(1), name.length(1), - name.ptr(0), name.length(0), - cap->Unique, cap->Accuracy); - break; - case CAT_SPC: - ThrowDJX("SQLSpecialColumns not available yet"); #endif // 0 default: sprintf(g->Message, "Invalid SQL function id"); @@ -1942,6 +1470,7 @@ bool JDBConn::SetParam(JDBCCOL *colp) } // endif len pval[n] = AllocateValue(g, crp->Type, len); + pval[n]->SetNullable(true); if (crp->Type == TYPE_STRING) { pbuf[n] = (char*)PlugSubAlloc(g, NULL, len); @@ -1981,10 +1510,10 @@ bool JDBConn::SetParam(JDBCCOL *colp) /***********************************************************************/ /* Allocate a CONNECT result structure from the JDBC result. */ /***********************************************************************/ - PQRYRES JDBConn::AllocateResult(PGLOBAL g) + PQRYRES JDBConn::AllocateResult(PGLOBAL g, PTDB tdbp) { bool uns; - PJDBCCOL colp; + PCOL colp; PCOLRES *pcrp, crp; PQRYRES qrp; @@ -2009,8 +1538,7 @@ bool JDBConn::SetParam(JDBCCOL *colp) qrp->Nblin = 0; qrp->Cursor = 0; - for (colp = (PJDBCCOL)m_Tdb->Columns; colp; - colp = (PJDBCCOL)colp->GetNext()) + for (colp = tdbp->GetColumns(); colp; colp = colp->GetNext()) if (!colp->IsSpecial()) { *pcrp = (PCOLRES)PlugSubAlloc(g, NULL, sizeof(COLRES)); crp = *pcrp; @@ -2038,10 +1566,9 @@ bool JDBConn::SetParam(JDBCCOL *colp) memset(crp->Nulls, ' ', m_Rows); } // endelse Nullable - colp->SetCrp(crp); + ((EXTCOL*)colp)->SetCrp(crp); } // endif colp *pcrp = NULL; - //qrp->Nblin = n; return qrp; } // end of AllocateResult diff --git a/storage/connect/jdbconn.h b/storage/connect/jdbconn.h index 9d428142839..56f318d238b 100644 --- a/storage/connect/jdbconn.h +++ b/storage/connect/jdbconn.h @@ -1,61 +1,7 @@ /***********************************************************************/ /* JDBConn.h : header file for the JDBC connection classes. */ /***********************************************************************/ -//nclude /* Windows include file */ -//nclude /* Message crackers */ - -/***********************************************************************/ -/* Included C-definition files required by the interface. */ -/***********************************************************************/ -#include "block.h" - -/***********************************************************************/ -/* JDBC interface. */ -/***********************************************************************/ -#include - -/***********************************************************************/ -/* Constants and defines. */ -/***********************************************************************/ -// Miscellaneous sizing info -#define MAX_NUM_OF_MSG 10 // Max number of error messages -//efine MAX_CURRENCY 30 // Max size of Currency($) string -#define MAX_TNAME_LEN 32 // Max size of table names -//efine MAX_FNAME_LEN 256 // Max size of field names -//efine MAX_STRING_INFO 256 // Max size of string from SQLGetInfo -//efine MAX_DNAME_LEN 256 // Max size of Recordset names -//efine MAX_CONNECT_LEN 512 // Max size of Connect string -//efine MAX_CURSOR_NAME 18 // Max size of a cursor name -#define DEFAULT_FIELD_TYPE 0 // TYPE_NULL - -#if !defined(__WIN__) -typedef unsigned char *PUCHAR; -#endif // !__WIN__ - -enum JCATINFO { - CAT_TAB = 1, // JDBC Tables - CAT_COL = 2, // JDBC Columns - CAT_KEY = 3, // JDBC PrimaryKeys -//CAT_STAT = 4, // SQLStatistics -//CAT_SPC = 5 // SQLSpecialColumns -}; - -/***********************************************************************/ -/* This structure is used to control the catalog functions. */ -/***********************************************************************/ -typedef struct tagJCATPARM { - JCATINFO Id; // Id to indicate function - PQRYRES Qrp; // Result set pointer - char *DB; // Database (Schema) - char *Tab; // Table name or pattern - char *Pat; // Table type or column pattern -} JCATPARM; - -typedef jint(JNICALL *CRTJVM) (JavaVM **, void **, void *); -typedef jint(JNICALL *GETJVM) (JavaVM **, jsize, jsize *); -#if defined(_DEBUG) -typedef jint(JNICALL *GETDEF) (void *); -#endif // _DEBUG +#include "javaconn.h" // JDBC connection to a data source class TDBJDBC; @@ -66,7 +12,7 @@ class TDBXJDC; /***********************************************************************/ /* JDBConn class. */ /***********************************************************************/ -class JDBConn : public BLOCK { +class JDBConn : public JAVAConn { friend class TDBJDBC; friend class TDBXJDC; //friend PQRYRES GetColumnInfo(PGLOBAL, char*&, char *, int, PVBLK&); @@ -74,124 +20,80 @@ private: JDBConn(); // Standard (unused) constructor public: - JDBConn(PGLOBAL g, TDBJDBC *tdbp); + // Constructor + JDBConn(PGLOBAL g, PCSZ wrapper); - int Open(PJPARM sop); - int Rewind(char *sql); - void Close(void); - PQRYRES AllocateResult(PGLOBAL g); + virtual void AddJars(PSTRG jpop, char sep); + PQRYRES AllocateResult(PGLOBAL g, PTDB tdbp); // Attributes public: - char *GetQuoteChar(void) { return m_IDQuoteChar; } - // Database successfully opened? - bool IsOpen(void) { return m_Opened; } -//PSZ GetStringInfo(ushort infotype); - int GetMaxValue(int infotype); -//PSZ GetConnect(void) { return m_Connect; } + char *GetQuoteChar(void) { return m_IDQuoteChar; } + virtual int GetMaxValue(int infotype); public: // Operations - //void SetLoginTimeout(DWORD sec) {m_LoginTimeout = sec;} - //void SetQueryTimeout(DWORD sec) {m_QueryTimeout = sec;} - //void SetUserName(PSZ user) {m_User = user;} - //void SetUserPwd(PSZ pwd) {m_Pwd = pwd;} - int GetResultSize(char *sql, JDBCCOL *colp); - int ExecuteQuery(char *sql); - int ExecuteUpdate(char *sql); - int Fetch(int pos = 0); - bool PrepareSQL(char *sql); - int ExecuteSQL(void); + virtual bool Connect(PJPARM sop); + virtual bool MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options, + PCSZ filter, bool pipe) {return true;} + virtual int GetResultSize(PCSZ sql, PCOL colp); + virtual int ExecuteCommand(PCSZ sql); + virtual int ExecuteQuery(PCSZ sql); + virtual int ExecuteUpdate(PCSZ sql); + virtual int Fetch(int pos = 0); + virtual void SetColumnValue(int rank, PSZ name, PVAL val); + + // Jdbc operations + bool PrepareSQL(PCSZ sql); + int ExecuteSQL(void); // Prepared statement bool SetParam(JDBCCOL *colp); - int ExecSQLcommand(char *sql); - void SetColumnValue(int rank, PSZ name, PVAL val); int GetCatInfo(JCATPARM *cap); - //bool GetDataSources(PQRYRES qrp); bool GetDrivers(PQRYRES qrp); - PQRYRES GetMetaData(PGLOBAL g, char *src); - -public: - // Set static variables - static void SetJVM(void) { - LibJvm = NULL; - CreateJavaVM = NULL; - GetCreatedJavaVMs = NULL; -#if defined(_DEBUG) - GetDefaultJavaVMInitArgs = NULL; -#endif // _DEBUG - } // end of SetJVM - - static void ResetJVM(void); - static bool GetJVM(PGLOBAL g); + PQRYRES GetMetaData(PGLOBAL g, PCSZ src); + int Rewind(PCSZ sql); // Implementation public: //virtual ~JDBConn(); - // JDBC operations -protected: - bool gmID(PGLOBAL g, jmethodID& mid, const char *name, const char *sig); - bool Check(jint rc = 0); -//void ThrowDJX(int rc, PSZ msg/*, HSTMT hstmt = SQL_NULL_HSTMT*/); -//void ThrowDJX(PSZ msg); -//void Free(void); - protected: // Members -#if defined(__WIN__) - static HANDLE LibJvm; // Handle to the jvm DLL -#else // !__WIN__ - static void *LibJvm; // Handle for the jvm shared library -#endif // !__WIN__ - static CRTJVM CreateJavaVM; - static GETJVM GetCreatedJavaVMs; -#if defined(_DEBUG) - static GETDEF GetDefaultJavaVMInitArgs; -#endif // _DEBUG - PGLOBAL m_G; - TDBJDBC *m_Tdb; - JavaVM *jvm; // Pointer to the JVM (Java Virtual Machine) - JNIEnv *env; // Pointer to native interface - jclass jdi; // Pointer to the java wrapper class - jobject job; // The java wrapper class object - jmethodID xqid; // The ExecuteQuery method ID - jmethodID xuid; // The ExecuteUpdate method ID - jmethodID xid; // The Execute method ID - jmethodID grs; // The GetResult method ID - jmethodID readid; // The ReadNext method ID - jmethodID fetchid; // The Fetch method ID - jmethodID typid; // The ColumnType method ID - jmethodID prepid; // The CreatePrepStmt method ID - jmethodID xpid; // The ExecutePrep method ID - jmethodID pcid; // The ClosePrepStmt method ID - jmethodID errid; // The GetErrmsg method ID - jmethodID objfldid; // The ObjectField method ID - jmethodID chrfldid; // The StringField method ID - jmethodID intfldid; // The IntField method ID - jmethodID dblfldid; // The DoubleField method ID - jmethodID fltfldid; // The FloatField method ID - jmethodID datfldid; // The DateField method ID - jmethodID timfldid; // The TimeField method ID - jmethodID tspfldid; // The TimestampField method ID - jmethodID bigfldid; // The BigintField method ID - //DWORD m_LoginTimeout; -//DWORD m_QueryTimeout; -//DWORD m_UpdateOptions; - char *Msg; - char *m_Wrap; +#if 0 + JavaVM *jvm; // Pointer to the JVM (Java Virtual Machine) + JNIEnv *env; // Pointer to native interface + jclass jdi; // Pointer to the java wrapper class + jobject job; // The java wrapper class object + jmethodID errid; // The GetErrmsg method ID +#endif // 0 + jmethodID xqid; // The ExecuteQuery method ID + jmethodID xuid; // The ExecuteUpdate method ID + jmethodID xid; // The Execute method ID + jmethodID grs; // The GetResult method ID + jmethodID readid; // The ReadNext method ID + jmethodID fetchid; // The Fetch method ID + jmethodID typid; // The ColumnType method ID + jmethodID prepid; // The CreatePrepStmt method ID + jmethodID xpid; // The ExecutePrep method ID + jmethodID pcid; // The ClosePrepStmt method ID + jmethodID objfldid; // The ObjectField method ID + jmethodID chrfldid; // The StringField method ID + jmethodID intfldid; // The IntField method ID + jmethodID dblfldid; // The DoubleField method ID + jmethodID fltfldid; // The FloatField method ID + jmethodID datfldid; // The DateField method ID + jmethodID timfldid; // The TimeField method ID + jmethodID tspfldid; // The TimestampField method ID + jmethodID bigfldid; // The BigintField method ID +// PCSZ Msg; +// PCSZ m_Wrap; char m_IDQuoteChar[2]; -//PSZ m_Driver; -//PSZ m_Url; -//PSZ m_User; - PSZ m_Pwd; + PCSZ m_Pwd; int m_Ncol; int m_Aff; - int m_Rows; int m_Fetch; int m_RowsetSize; jboolean m_Updatable; jboolean m_Transact; jboolean m_Scrollable; - bool m_Opened; bool m_Full; }; // end of JDBConn class definition diff --git a/storage/connect/jmgfam.cpp b/storage/connect/jmgfam.cpp new file mode 100644 index 00000000000..c7115cdd720 --- /dev/null +++ b/storage/connect/jmgfam.cpp @@ -0,0 +1,357 @@ +/************ JMONGO FAM C++ Program Source Code File (.CPP) ***********/ +/* PROGRAM NAME: jmgfam.cpp */ +/* ------------- */ +/* Version 1.0 */ +/* */ +/* COPYRIGHT: */ +/* ---------- */ +/* (C) Copyright to the author Olivier BERTRAND 20017 */ +/* */ +/* WHAT THIS PROGRAM DOES: */ +/* ----------------------- */ +/* This program are the Java MongoDB access method classes. */ +/* */ +/***********************************************************************/ + +/***********************************************************************/ +/* Include relevant sections of the System header files. */ +/***********************************************************************/ +#include "my_global.h" +#if defined(__WIN__) +//#include +//#include +//#include +#if defined(__BORLANDC__) +#define __MFC_COMPAT__ // To define min/max as macro +#endif // __BORLANDC__ +//#include +#else // !__WIN__ +#if defined(UNIX) || defined(UNIV_LINUX) +//#include +#include +//#if !defined(sun) // Sun has the ftruncate fnc. +//#define USETEMP // Force copy mode for DELETE +//#endif // !sun +#else // !UNIX +//#include +#endif // !UNIX +//#include +#endif // !__WIN__ + +/***********************************************************************/ +/* Include application header files: */ +/* global.h is header containing all global declarations. */ +/* plgdbsem.h is header containing the DB application declarations. */ +/* filamtxt.h is header containing the file AM classes declarations. */ +/***********************************************************************/ +#include "global.h" +#include "plgdbsem.h" +#include "reldef.h" +#include "filamtxt.h" +#include "tabdos.h" +#include "tabjson.h" +#include "jmgfam.h" + +#if defined(UNIX) || defined(UNIV_LINUX) +#include "osutil.h" +//#define _fileno fileno +//#define _O_RDONLY O_RDONLY +#endif + +/* --------------------------- Class JMGFAM -------------------------- */ + +/***********************************************************************/ +/* Constructors. */ +/***********************************************************************/ +JMGFAM::JMGFAM(PJDEF tdp) : DOSFAM((PDOSDEF)NULL) +{ + Jcp = NULL; + //Client = NULL; + //Database = NULL; + //Collection = NULL; + //Cursor = NULL; + //Query = NULL; + //Opts = NULL; + Ops.Driver = tdp->Schema; + Ops.Url = tdp->Uri; + Ops.User = NULL; + Ops.Pwd = NULL; + Ops.Scrollable = false; + Ops.Fsize = 0; + Ops.Version = tdp->Version; + To_Fbt = NULL; + Mode = MODE_ANY; + Uristr = tdp->Uri; + Db_name = tdp->Schema; + Coll_name = tdp->Collname; + Options = tdp->Options; + Filter = tdp->Filter; + Wrapname = tdp->Wrapname; + Done = false; + Pipe = tdp->Pipe; + Version = tdp->Version; + Lrecl = tdp->Lrecl + tdp->Ending; + Curpos = 0; +} // end of JMGFAM standard constructor + +JMGFAM::JMGFAM(PJMGFAM tdfp) : DOSFAM(tdfp) +{ + //Client = tdfp->Client; + //Database = NULL; + //Collection = tdfp->Collection; + //Cursor = tdfp->Cursor; + //Query = tdfp->Query; + //Opts = tdfp->Opts; + Ops = tdfp->Ops; + To_Fbt = tdfp->To_Fbt; + Mode = tdfp->Mode; + Uristr = tdfp->Uristr; + Db_name = tdfp->Db_name; + Coll_name = tdfp->Coll_name; + Options = tdfp->Options; + Filter = NULL; + Wrapname = tdfp->Wrapname; + Done = tdfp->Done; + Pipe = tdfp->Pipe; + Version = tdfp->Version; +} // end of JMGFAM copy constructor + +/***********************************************************************/ +/* Reset: reset position values at the beginning of file. */ +/***********************************************************************/ +void JMGFAM::Reset(void) +{ + TXTFAM::Reset(); + Fpos = Tpos = Spos = 0; +} // end of Reset + +/***********************************************************************/ +/* MGO GetFileLength: returns file size in number of bytes. */ +/***********************************************************************/ +int JMGFAM::GetFileLength(PGLOBAL g) +{ + return 0; +} // end of GetFileLength + +/***********************************************************************/ +/* Cardinality: returns table cardinality in number of rows. */ +/* This function can be called with a null argument to test the */ +/* availability of Cardinality implementation (1 yes, 0 no). */ +/***********************************************************************/ +int JMGFAM::Cardinality(PGLOBAL g) +{ + if (!g) + return 1; + + return (!Init(g)) ? Jcp->CollSize(g) : 0; +} // end of Cardinality + +/***********************************************************************/ +/* Note: This function is not really implemented yet. */ +/***********************************************************************/ +int JMGFAM::MaxBlkSize(PGLOBAL, int s) +{ + return s; +} // end of MaxBlkSize + +/***********************************************************************/ +/* Init: initialize MongoDB processing. */ +/***********************************************************************/ +bool JMGFAM::Init(PGLOBAL g) +{ + if (Done) + return false; + + /*********************************************************************/ + /* Open an JDBC connection for this table. */ + /* Note: this may not be the proper way to do. Perhaps it is better */ + /* to test whether a connection is already open for this datasource */ + /* and if so to allocate just a new result set. But this only for */ + /* drivers allowing concurency in getting results ??? */ + /*********************************************************************/ + if (!Jcp) + Jcp = new(g) JMgoConn(g, Coll_name, Wrapname); + else if (Jcp->IsOpen()) + Jcp->Close(); + + if (Jcp->Connect(&Ops)) + return true; + + Done = true; + return false; +} // end of Init + +/***********************************************************************/ +/* OpenTableFile: Open a MongoDB table. */ +/***********************************************************************/ +bool JMGFAM::OpenTableFile(PGLOBAL g) +{ + Mode = Tdbp->GetMode(); + + if (Pipe && Mode != MODE_READ) { + strcpy(g->Message, "Pipeline tables are read only"); + return true; + } // endif Pipe + + if (Init(g)) + return true; + + if (Jcp->GetMethodId(g, Mode)) + return true; + + if (Mode == MODE_DELETE && !Tdbp->GetNext()) { + // Delete all documents + if (!Jcp->MakeCursor(g, Tdbp, "all", Filter, false)) + if (Jcp->DocDelete(g, true) == RC_OK) + return false; + + return true; + } // endif Mode + + if (Mode == MODE_INSERT) + Jcp->MakeColumnGroups(g, Tdbp); + + if (Mode != MODE_UPDATE) + return Jcp->MakeCursor(g, Tdbp, Options, Filter, Pipe); + + return false; + } // end of OpenTableFile + +/***********************************************************************/ +/* GetRowID: return the RowID of last read record. */ +/***********************************************************************/ +int JMGFAM::GetRowID(void) +{ + return Rows; +} // end of GetRowID + +/***********************************************************************/ +/* GetPos: return the position of last read record. */ +/***********************************************************************/ +int JMGFAM::GetPos(void) +{ + return Fpos; +} // end of GetPos + +/***********************************************************************/ +/* GetNextPos: return the position of next record. */ +/***********************************************************************/ +int JMGFAM::GetNextPos(void) +{ + return Fpos; // TODO +} // end of GetNextPos + +/***********************************************************************/ +/* SetPos: Replace the table at the specified position. */ +/***********************************************************************/ +bool JMGFAM::SetPos(PGLOBAL g, int pos) +{ + Fpos = pos; + Placed = true; + return false; +} // end of SetPos + +/***********************************************************************/ +/* Record file position in case of UPDATE or DELETE. */ +/***********************************************************************/ +bool JMGFAM::RecordPos(PGLOBAL g) +{ + strcpy(g->Message, "JMGFAM::RecordPos NIY"); + return true; +} // end of RecordPos + +/***********************************************************************/ +/* Initialize Fpos and the current position for indexed DELETE. */ +/***********************************************************************/ +int JMGFAM::InitDelete(PGLOBAL g, int fpos, int spos) +{ + strcpy(g->Message, "JMGFAM::InitDelete NIY"); + return RC_FX; +} // end of InitDelete + +/***********************************************************************/ +/* Skip one record in file. */ +/***********************************************************************/ +int JMGFAM::SkipRecord(PGLOBAL g, bool header) +{ + return RC_OK; // Dummy +} // end of SkipRecord + +/***********************************************************************/ +/* ReadBuffer: Get next document from a collection. */ +/***********************************************************************/ +int JMGFAM::ReadBuffer(PGLOBAL g) +{ + int rc = RC_FX; + + if (!Curpos && Mode == MODE_UPDATE) + if (Jcp->MakeCursor(g, Tdbp, Options, Filter, Pipe)) + return RC_FX; + + if (++CurNum >= Rbuf) { + Rbuf = Jcp->Fetch(); + Curpos++; + CurNum = 0; + } // endif CurNum + + if (Rbuf > 0) { + PSZ str = Jcp->GetDocument(); + + if (str) { + if (trace == 1) + htrc("%s\n", str); + + strncpy(Tdbp->GetLine(), str, Lrecl); + rc = RC_OK; + } else + strcpy(g->Message, "Null document"); + + } else if (!Rbuf) + rc = RC_EF; + + return rc; +} // end of ReadBuffer + +/***********************************************************************/ +/* WriteBuffer: File write routine for MGO access method. */ +/***********************************************************************/ +int JMGFAM::WriteBuffer(PGLOBAL g) +{ + int rc = RC_OK; + + if (Mode == MODE_INSERT) { + rc = Jcp->DocWrite(g); + } else if (Mode == MODE_DELETE) { + rc = Jcp->DocDelete(g, false); + } else if (Mode == MODE_UPDATE) { + rc = Jcp->DocUpdate(g, Tdbp); + } // endif Mode + + return rc; +} // end of WriteBuffer + +/***********************************************************************/ +/* Data Base delete line routine for MGO and BLK access methods. */ +/***********************************************************************/ +int JMGFAM::DeleteRecords(PGLOBAL g, int irc) +{ + return (irc == RC_OK) ? WriteBuffer(g) : RC_OK; +} // end of DeleteRecords + +/***********************************************************************/ +/* Table file close routine for MGO access method. */ +/***********************************************************************/ +void JMGFAM::CloseTableFile(PGLOBAL g, bool) +{ + Jcp->Close(); + Done = false; +} // end of CloseTableFile + +/***********************************************************************/ +/* Rewind routine for MGO access method. */ +/***********************************************************************/ +void JMGFAM::Rewind(void) +{ + Jcp->Rewind(); +} // end of Rewind + diff --git a/storage/connect/jmgfam.h b/storage/connect/jmgfam.h new file mode 100644 index 00000000000..5c80d993833 --- /dev/null +++ b/storage/connect/jmgfam.h @@ -0,0 +1,79 @@ +/************** MongoFam H Declares Source Code File (.H) **************/ +/* Name: jmgfam.h Version 1.0 */ +/* */ +/* (C) Copyright to the author Olivier BERTRAND 2017 */ +/* */ +/* This file contains the JAVA MongoDB access method classes declares */ +/***********************************************************************/ +#pragma once + +/***********************************************************************/ +/* Include MongoDB library header files. */ +/***********************************************************************/ +#include "block.h" +//#include "mongo.h" +#include "jmgoconn.h" + +typedef class JMGFAM *PJMGFAM; +typedef class MGODEF *PMGODEF; + +/***********************************************************************/ +/* This is the Java MongoDB Access Method class declaration. */ +/***********************************************************************/ +class DllExport JMGFAM : public DOSFAM { + friend void mongo_init(bool); +public: + // Constructor + JMGFAM(PJDEF tdp); + JMGFAM(PJMGFAM txfp); + + // Implementation + virtual AMT GetAmType(void) { return TYPE_AM_MGO; } + virtual bool GetUseTemp(void) { return false; } + virtual int GetPos(void); + virtual int GetNextPos(void); + virtual PTXF Duplicate(PGLOBAL g) { return (PTXF)new(g) JMGFAM(this); } + void SetLrecl(int lrecl) { Lrecl = lrecl; } + + // Methods + virtual void Reset(void); + virtual int GetFileLength(PGLOBAL g); + virtual int Cardinality(PGLOBAL g); + virtual int MaxBlkSize(PGLOBAL g, int s); + virtual bool AllocateBuffer(PGLOBAL g) { return false; } + virtual int GetRowID(void); + virtual bool RecordPos(PGLOBAL g); + virtual bool SetPos(PGLOBAL g, int recpos); + virtual int SkipRecord(PGLOBAL g, bool header); + virtual bool OpenTableFile(PGLOBAL g); + virtual int ReadBuffer(PGLOBAL g); + virtual int WriteBuffer(PGLOBAL g); + virtual int DeleteRecords(PGLOBAL g, int irc); + virtual void CloseTableFile(PGLOBAL g, bool abort); + virtual void Rewind(void); + +protected: + virtual bool OpenTempFile(PGLOBAL g) { return false; } + virtual bool MoveIntermediateLines(PGLOBAL g, bool *b) { return false; } + virtual int RenameTempFile(PGLOBAL g) { return RC_OK; } + virtual int InitDelete(PGLOBAL g, int fpos, int spos); + bool Init(PGLOBAL g); +//bool MakeCursor(PGLOBAL g); + + // Members + JMgoConn *Jcp; // Points to a Mongo connection class + JDBCPARM Ops; // Additional parameters + PFBLOCK To_Fbt; // Pointer to temp file block + MODE Mode; + PCSZ Uristr; + PCSZ Db_name; + PCSZ Coll_name; + PCSZ Options; + PCSZ Filter; + PSZ Wrapname; + bool Done; // Init done + bool Pipe; + int Version; + int Curpos; // Cursor position of last fetch +}; // end of class JMGFAM + diff --git a/storage/connect/jmgoconn.cpp b/storage/connect/jmgoconn.cpp new file mode 100644 index 00000000000..7535431c82e --- /dev/null +++ b/storage/connect/jmgoconn.cpp @@ -0,0 +1,813 @@ +/************ JMgoConn C++ Functions Source Code File (.CPP) ***********/ +/* Name: JMgoConn.CPP Version 1.1 */ +/* */ +/* (C) Copyright to the author Olivier BERTRAND 2017 */ +/* */ +/* This file contains the MongoDB Java connection classes functions. */ +/***********************************************************************/ + +/***********************************************************************/ +/* Include relevant MariaDB header file. */ +/***********************************************************************/ +#include + +/***********************************************************************/ +/* Required objects includes. */ +/***********************************************************************/ +#include "global.h" +#include "plgdbsem.h" +#include "colblk.h" +#include "xobject.h" +#include "xtable.h" +#include "filter.h" +#include "jmgoconn.h" + +#define nullptr 0 + +bool IsNum(PSZ s); + +/* --------------------------- Class JNCOL --------------------------- */ + +/***********************************************************************/ +/* Add a column in the column list. */ +/***********************************************************************/ +void JNCOL::AddCol(PGLOBAL g, PCOL colp, PSZ jp) +{ + char *p; + PJKC kp, kcp; + + if ((p = strchr(jp, '.'))) { + PJNCOL icp; + + *p++ = 0; + + for (kp = Klist; kp; kp = kp->Next) + if (kp->Jncolp && !strcmp(jp, kp->Key)) + break; + + if (!kp) { + icp = new(g) JNCOL(IsNum(p)); + kcp = (PJKC)PlugSubAlloc(g, NULL, sizeof(JKCOL)); + kcp->Next = NULL; + kcp->Jncolp = icp; + kcp->Colp = NULL; + + if (Array) { + kcp->Key = NULL; + kcp->N = atoi(p); + } else { + kcp->Key = PlugDup(g, jp); + kcp->N = 0; + } // endif Array + + if (Klist) { + for (kp = Klist; kp->Next; kp = kp->Next); + + kp->Next = kcp; + } else + Klist = kcp; + + } else + icp = kp->Jncolp; + + *(p - 1) = '.'; + icp->AddCol(g, colp, p); + } else { + kcp = (PJKC)PlugSubAlloc(g, NULL, sizeof(JKCOL)); + + kcp->Next = NULL; + kcp->Jncolp = NULL; + kcp->Colp = colp; + + if (Array) { + kcp->Key = NULL; + kcp->N = atoi(jp); + } else { + kcp->Key = jp; + kcp->N = 0; + } // endif Array + + if (Klist) { + for (kp = Klist; kp->Next; kp = kp->Next); + + kp->Next = kcp; + } else + Klist = kcp; + + } // endif jp + +} // end of AddCol + +/***********************************************************************/ +/* JMgoConn construction/destruction. */ +/***********************************************************************/ +JMgoConn::JMgoConn(PGLOBAL g, PCSZ collname, PCSZ wrapper) + : JAVAConn(g, wrapper) +{ + CollName = collname; + readid = fetchid = getdocid = objfldid = fcollid = acollid = + mkdocid = docaddid = mkarid = araddid = insertid = updateid = + deleteid = gcollid = countid = rewindid = nullptr; + DiscFunc = "MongoDisconnect"; + Fpc = NULL; + m_Fetch = 0; + m_Ncol = 0; + m_Version = 0; +} // end of JMgoConn + +/***********************************************************************/ +/* AddJars: add some jar file to the Class path. */ +/***********************************************************************/ +void JMgoConn::AddJars(PSTRG jpop, char sep) +{ +#if defined(DEVELOPMENT) + if (m_Version == 2) { + jpop->Append(sep); + jpop->Append("C:/Eclipse/workspace/MongoWrap2/bin"); + jpop->Append(sep); + jpop->Append("C:/mongo-java-driver/mongo-java-driver-2.13.3.jar"); + } else { + jpop->Append(sep); + jpop->Append("C:/Eclipse/workspace/MongoWrap3/bin"); + jpop->Append(sep); + jpop->Append("C:/mongo-java-driver/mongo-java-driver-3.4.2.jar"); + } // endif m_Version +#endif // DEVELOPMENT +} // end of AddJars + +/***********************************************************************/ +/* Connect: connect to a data source. */ +/***********************************************************************/ +bool JMgoConn::Connect(PJPARM sop) +{ + bool err = false; + jint rc; + jboolean brc; + jstring cln; + PGLOBAL& g = m_G; + + m_Version = sop->Version; + + /*******************************************************************/ + /* Create or attach a JVM. */ + /*******************************************************************/ + if (Open(g)) + return true; + + /*******************************************************************/ + /* Connect to MongoDB. */ + /*******************************************************************/ + jmethodID cid = nullptr; + + if (gmID(g, cid, "MongoConnect", "([Ljava/lang/String;)I")) + return true; + + // Build the java string array + jobjectArray parms = env->NewObjectArray(4, // constructs java array of 4 + env->FindClass("java/lang/String"), NULL); // Strings + + //m_Scrollable = sop->Scrollable; + //m_RowsetSize = sop->Fsize; + + // change some elements + if (sop->Driver) + env->SetObjectArrayElement(parms, 0, env->NewStringUTF(sop->Url)); + + if (sop->Url) + env->SetObjectArrayElement(parms, 1, env->NewStringUTF(sop->Driver)); + + if (sop->User) + env->SetObjectArrayElement(parms, 2, env->NewStringUTF(sop->User)); + + if (sop->Pwd) + env->SetObjectArrayElement(parms, 3, env->NewStringUTF(sop->Pwd)); + + // call method + rc = env->CallIntMethod(job, cid, parms); + err = Check(rc); + env->DeleteLocalRef(parms); // Not used anymore + + if (err) { + sprintf(g->Message, "Connecting: %s rc=%d", Msg, (int)rc); + return true; + } // endif Msg + + /*********************************************************************/ + /* Get the collection. */ + /*********************************************************************/ + if (gmID(g, gcollid, "GetCollection", "(Ljava/lang/String;)Z")) + return true; + + cln = env->NewStringUTF(CollName); + brc = env->CallBooleanMethod(job, gcollid, cln); + env->DeleteLocalRef(cln); + + if (Check(brc ? -1 : 0)) { + sprintf(g->Message, "GetCollection: %s", Msg); + return true; + } // endif Msg + + m_Connected = true; + return false; +} // end of Connect + +/***********************************************************************/ +/* CollSize: returns the number of documents in the collection. */ +/***********************************************************************/ +int JMgoConn::CollSize(PGLOBAL g) +{ + if (!gmID(g, countid, "GetCollSize", "()J")) { + jlong card = env->CallLongMethod(job, countid); + + return (int)card; + } else + return 2; // Make MariaDB happy + +} // end of CollSize + +/***********************************************************************/ +/* OpenDB: Data Base open routine for MONGO access method. */ +/***********************************************************************/ +bool JMgoConn::MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options, + PCSZ filter, bool pipe) +{ + const char *p; + bool b = false, id = (tdbp->GetMode() != MODE_READ), all = false; + uint len; + PCOL cp; + PSZ jp; + PCSZ op = NULL, sf = NULL, Options = options; + PSTRG s = NULL; + + if (Options && !stricmp(Options, "all")) { + Options = NULL; + all = true; + } // endif Options + + for (cp = tdbp->GetColumns(); cp; cp = cp->GetNext()) + if (!strcmp(cp->GetName(), "_id")) + id = true; + else if (cp->GetFmt() && !strcmp(cp->GetFmt(), "*") && (!Options || pipe)) + all = true; + + if (pipe && Options) { + if (trace) + htrc("Pipeline: %s\n", Options); + + p = strrchr(Options, ']'); + + if (!p) { + strcpy(g->Message, "Missing ] in pipeline"); + return true; + } else + *(char*)p = 0; + + s = new(g) STRING(g, 1023, (PSZ)Options); + + if (tdbp->GetFilter()) { + s->Append(",{\"$match\":"); + + if (tdbp->GetFilter()->MakeSelector(g, s)) { + strcpy(g->Message, "Failed making selector"); + return NULL; + } else + s->Append('}'); + + tdbp->SetFilter(NULL); // Not needed anymore + } // endif To_Filter + + if (!all && tdbp->GetColumns()) { + // Project list + len = s->GetLength(); + s->Append(",{\"$project\":{\""); + + if (!id) + s->Append("_id\":0,\""); + + for (PCOL cp = tdbp->GetColumns(); cp; cp = cp->GetNext()) { + if (b) + s->Append(",\""); + else + b = true; + + if ((jp = cp->GetJpath(g, true))) + s->Append(jp); + else { + s->Truncate(len); + goto nop; + } // endif Jpath + + s->Append("\":1"); + } // endfor cp + + s->Append("}}"); + } // endif all + + nop: + s->Append("]}"); + s->Resize(s->GetLength() + 1); + *(char*)p = ']'; // Restore Colist for discovery + p = s->GetStr(); + + if (trace) + htrc("New Pipeline: %s\n", p); + + return AggregateCollection(p); + } else { + if (filter || tdbp->GetFilter()) { + if (trace) { + if (filter) + htrc("Filter: %s\n", filter); + + if (tdbp->GetFilter()) { + char buf[512]; + + tdbp->GetFilter()->Prints(g, buf, 511); + htrc("To_Filter: %s\n", buf); + } // endif To_Filter + + } // endif trace + + s = new(g) STRING(g, 1023, (PSZ)filter); + len = s->GetLength(); + + if (tdbp->GetFilter()) { + if (filter) + s->Append(','); + + if (tdbp->GetFilter()->MakeSelector(g, s)) { + strcpy(g->Message, "Failed making selector"); + return NULL; + } // endif Selector + + tdbp->SetFilter(NULL); // Not needed anymore + } // endif To_Filter + + if (trace) + htrc("selector: %s\n", s->GetStr()); + + s->Resize(s->GetLength() + 1); + sf = PlugDup(g, s->GetStr()); + } // endif Filter + + if (!all) { + if (Options && *Options) { + if (trace) + htrc("options=%s\n", Options); + + op = Options; + } else if (tdbp->GetColumns()) { + // Projection list + if (s) + s->Set("{\""); + else + s = new(g) STRING(g, 511, "{\""); + + if (!id) + s->Append("_id\":0,\""); + + for (PCOL cp = tdbp->GetColumns(); cp; cp = cp->GetNext()) { + if (b) + s->Append(",\""); + else + b = true; + + if ((jp = cp->GetJpath(g, true))) + s->Append(jp); + else { + // Can this happen? + htrc("Fail getting projection path of %s\n", cp->GetName()); + goto nope; + } // endif Jpath + + s->Append("\":1"); + } // endfor cp + + s->Append("}"); + s->Resize(s->GetLength() + 1); + op = s->GetStr(); + } else { + // count(*) ? + op = "{\"_id\":1}"; + } // endif Options + + } // endif all + + nope: + return FindCollection(sf, op); + } // endif Pipe + +} // end of MakeCursor + +/***********************************************************************/ +/* Find a collection and make cursor. */ +/***********************************************************************/ +bool JMgoConn::FindCollection(PCSZ query, PCSZ proj) +{ + bool rc = true; + jboolean brc; + jstring qry = nullptr, prj = nullptr; + PGLOBAL& g = m_G; + + // Get the methods used to execute a query and get the result + if (!gmID(g, fcollid, "FindColl", "(Ljava/lang/String;Ljava/lang/String;)Z")) { + if (query) + qry = env->NewStringUTF(query); + + if (proj) + prj = env->NewStringUTF(proj); + + brc = env->CallBooleanMethod(job, fcollid, qry, prj); + + if (!Check(brc ? -1 : 0)) { + rc = false; + } else + sprintf(g->Message, "FindColl: %s", Msg); + + if (query) + env->DeleteLocalRef(qry); + + if (proj) + env->DeleteLocalRef(prj); + + } // endif xqid + + return rc; +} // end of FindCollection + +/***********************************************************************/ +/* Find a collection and make cursor. */ +/***********************************************************************/ +bool JMgoConn::AggregateCollection(PCSZ pipeline) +{ + bool rc = true; + jboolean brc; + jstring pip = nullptr; + PGLOBAL& g = m_G; + + // Get the methods used to execute a query and get the result + if (!gmID(g, acollid, "AggregateColl", "(Ljava/lang/String;)Z")) { + pip = env->NewStringUTF(pipeline); + + brc = env->CallBooleanMethod(job, acollid, pip); + + if (!Check(brc ? -1 : 0)) { + rc = false; + } else + sprintf(g->Message, "AggregateColl: %s", Msg); + + env->DeleteLocalRef(pip); + } // endif acollid + + return rc; +} // end of AggregateCollection + +/***********************************************************************/ +/* Fetch next row. */ +/***********************************************************************/ +int JMgoConn::Fetch(int pos) +{ + jint rc = JNI_ERR; + PGLOBAL& g = m_G; + + //if (m_Full) // Result set has one row + // return 1; + + //if (pos) { + // if (!m_Scrollable) { + // strcpy(g->Message, "Cannot fetch(pos) if FORWARD ONLY"); + // return rc; + // } else if (gmID(m_G, fetchid, "Fetch", "(I)Z")) + // return rc; + + // if (env->CallBooleanMethod(job, fetchid, pos)) + // rc = m_Rows; + + //} else { + if (gmID(g, readid, "ReadNext", "()I")) + return (int)rc; + + rc = env->CallIntMethod(job, readid); + + if (!Check(rc)) { + //if (rc == 0) + // m_Full = (m_Fetch == 1); + //else + // m_Fetch++; + + m_Ncol = (int)rc; + rc = MY_MIN(rc, 1); + m_Rows += rc; + } else + sprintf(g->Message, "Fetch: %s", Msg); + + //} // endif pos + + return rc; +} // end of Fetch + +/***********************************************************************/ +/* Get the Json string of the current document. */ +/***********************************************************************/ +PSZ JMgoConn::GetDocument(void) +{ + PGLOBAL& g = m_G; + PSZ doc = NULL; + jstring jdc; + + if (!gmID(g, getdocid, "GetDoc", "()Ljava/lang/String;")) { + jdc = (jstring)env->CallObjectMethod(job, getdocid); + + if (jdc) + doc = (PSZ)env->GetStringUTFChars(jdc, (jboolean)false); + + } // endif getdocid + + return doc; + } // end of GetDocument + +/***********************************************************************/ +/* Group columns for inserting or updating. */ +/***********************************************************************/ +void JMgoConn::MakeColumnGroups(PGLOBAL g, PTDB tdbp) +{ + Fpc = new(g) JNCOL(false); + + for (PCOL colp = tdbp->GetColumns(); colp; colp = colp->GetNext()) + if (!colp->IsSpecial()) + Fpc->AddCol(g, colp, colp->GetJpath(g, false)); + +} // end of MakeColumnGroups + +/***********************************************************************/ +/* Get additional method ID. */ +/***********************************************************************/ +bool JMgoConn::GetMethodId(PGLOBAL g, MODE mode) +{ + if (mode == MODE_UPDATE) { + if (gmID(g, mkdocid, "MakeDocument", "()Ljava/lang/Object;")) + return true; + + if (gmID(g, docaddid, "DocAdd", + "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)Z")) + return true; + + if (gmID(g, updateid, "CollUpdate", "(Ljava/lang/Object;)J")) + return true; + + } else if (mode == MODE_INSERT) { + if (gmID(g, mkdocid, "MakeDocument", "()Ljava/lang/Object;")) + return true; + + if (gmID(g, docaddid, "DocAdd", + "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)Z")) + return true; + + if (gmID(g, mkarid, "MakeArray", "()Ljava/lang/Object;")) + return true; + + if (gmID(g, araddid, "ArrayAdd", "(Ljava/lang/Object;ILjava/lang/Object;)Z")) + return true; + + if (gmID(g, insertid, "CollInsert", "(Ljava/lang/Object;)Z")) + return true; + + } else if (mode == MODE_DELETE) + if (gmID(g, deleteid, "CollDelete", "(Z)J")) + return true; + + return gmID(g, rewindid, "Rewind", "()Z"); +} // end of GetMethodId + +/***********************************************************************/ +/* MakeObject. */ +/***********************************************************************/ +jobject JMgoConn::MakeObject(PGLOBAL g, PCOL colp, bool&error ) +{ + jclass cls; + jmethodID cns = nullptr; // Constructor + jobject val = nullptr; + PVAL valp = colp->GetValue(); + + error = false; + + if (valp->IsNull()) + return NULL; + + try { + switch (valp->GetType()) { + case TYPE_STRING: + val = env->NewStringUTF(valp->GetCharValue()); + break; + case TYPE_INT: + case TYPE_SHORT: + cls = env->FindClass("java/lang/Integer"); + cns = env->GetMethodID(cls, "", "(I)V"); + val = env->NewObject(cls, cns, valp->GetIntValue()); + break; + case TYPE_TINY: + cls = env->FindClass("java/lang/Boolean"); + cns = env->GetMethodID(cls, "", "(Z)V"); + val = env->NewObject(cls, cns, (valp->GetIntValue() != 0)); + break; + case TYPE_BIGINT: + cls = env->FindClass("java/lang/Long"); + cns = env->GetMethodID(cls, "", "(J)V"); + val = env->NewObject(cls, cns, valp->GetBigintValue()); + break; + case TYPE_DOUBLE: + cls = env->FindClass("java/lang/Double"); + cns = env->GetMethodID(cls, "", "(D)V"); + val = env->NewObject(cls, cns, valp->GetFloatValue()); + break; + default: + sprintf(g->Message, "Cannot make object from %d type", valp->GetType()); + error = true; + break; + } // endswitch Type + + } catch (...) { + sprintf(g->Message, "Cannot make object from %s value", colp->GetName()); + error = true; + } // end try/catch + + return val; +} // end of MakeObject + +/***********************************************************************/ +/* MakeDoc. */ +/***********************************************************************/ +jobject JMgoConn::MakeDoc(PGLOBAL g, PJNCOL jcp) +{ + bool error = false; + jobject parent, child, val; + jstring jkey; + + if (jcp->Array) + parent = env->CallObjectMethod(job, mkarid); + else + parent = env->CallObjectMethod(job, mkdocid); + + for (PJKC kp = jcp->Klist; kp; kp = kp->Next) + if (kp->Jncolp) { + if (!(child = MakeDoc(g, kp->Jncolp))) + return NULL; + + if (!jcp->Array) { + jkey = env->NewStringUTF(kp->Key); + + if (env->CallBooleanMethod(job, docaddid, parent, jkey, child)) + return NULL; + + env->DeleteLocalRef(jkey); + } else + if (env->CallBooleanMethod(job, araddid, parent, kp->N, child)) + return NULL; + + } else { + if (!(val = MakeObject(g, kp->Colp, error))) { + if (error) + return NULL; + + } else if (!jcp->Array) { + jkey = env->NewStringUTF(kp->Key); + + if (env->CallBooleanMethod(job, docaddid, parent, jkey, val)) + return NULL; + + env->DeleteLocalRef(jkey); + } else if (env->CallBooleanMethod(job, araddid, parent, kp->N, val)) { + if (Check(-1)) + sprintf(g->Message, "ArrayAdd: %s", Msg); + else + sprintf(g->Message, "ArrayAdd: unknown error"); + + return NULL; + } // endif ArrayAdd + + } // endif Jncolp + + return parent; +} // end of MakeDoc + +/***********************************************************************/ +/* Insert a new document in the collation. */ +/***********************************************************************/ +int JMgoConn::DocWrite(PGLOBAL g) +{ + jobject doc; + + if (!Fpc || !(doc = MakeDoc(g, Fpc))) + return RC_FX; + + if (env->CallBooleanMethod(job, insertid, doc)) { + if (Check(-1)) + sprintf(g->Message, "CollInsert: %s", Msg); + else + sprintf(g->Message, "CollInsert: unknown error"); + + return RC_FX; + } // endif Insert + + return RC_OK; +} // end of DocWrite + +/***********************************************************************/ +/* Update the current document from the collection. */ +/***********************************************************************/ +int JMgoConn::DocUpdate(PGLOBAL g, PTDB tdbp) +{ + int rc = RC_OK; + bool error; + PCOL colp; + jstring jkey; + jobject val, upd, updlist = env->CallObjectMethod(job, mkdocid); + + // Make the list of changes to do + for (colp = tdbp->GetSetCols(); colp; colp = colp->GetNext()) { + jkey = env->NewStringUTF(colp->GetJpath(g, false)); + val = MakeObject(g, colp, error); + + if (error) + return RC_FX; + + if (env->CallBooleanMethod(job, docaddid, updlist, jkey, val)) + return RC_OK; + + env->DeleteLocalRef(jkey); + } // endfor colp + + // Make the update parameter + upd = env->CallObjectMethod(job, mkdocid); + jkey = env->NewStringUTF("$set"); + + if (env->CallBooleanMethod(job, docaddid, upd, jkey, updlist)) + return RC_OK; + + env->DeleteLocalRef(jkey); + + jlong ar = env->CallLongMethod(job, updateid, upd); + + if (trace) + htrc("DocUpdate: ar = %ld\n", ar); + + if (Check((int)ar)) { + sprintf(g->Message, "CollUpdate: %s", Msg); + rc = RC_FX; + } // endif ar + + return rc; +} // end of DocUpdate + +/***********************************************************************/ +/* Remove all or only the current document from the collection. */ +/***********************************************************************/ +int JMgoConn::DocDelete(PGLOBAL g, bool all) +{ + int rc = RC_OK; + jlong ar = env->CallLongMethod(job, deleteid, all); + + if (trace) + htrc("DocDelete: ar = %ld\n", ar); + + if (Check((int)ar)) { + sprintf(g->Message, "CollDelete: %s", Msg); + rc = RC_FX; + } // endif ar + + return rc; +} // end of DocDelete + +/***********************************************************************/ +/* Rewind the collection. */ +/***********************************************************************/ +bool JMgoConn::Rewind(void) +{ + return env->CallBooleanMethod(job, rewindid); +} // end of Rewind + +/***********************************************************************/ +/* Retrieve the column string value from the document. */ +/***********************************************************************/ +PSZ JMgoConn::GetColumnValue(PSZ path) +{ + PGLOBAL& g = m_G; + PSZ fld = NULL; + jstring fn, jn = nullptr; + + if (!path || (jn = env->NewStringUTF(path)) == nullptr) { + sprintf(g->Message, "Fail to allocate jstring %s", SVP(path)); + throw (int)TYPE_AM_MGO; + } // endif name + + if (!gmID(g, objfldid, "GetField", "(Ljava/lang/String;)Ljava/lang/String;")) { + fn = (jstring)env->CallObjectMethod(job, objfldid, jn); + + if (fn) + fld = (PSZ)env->GetStringUTFChars(fn, (jboolean)false); + + } // endif objfldid + + return fld; +} // end of GetColumnValue + diff --git a/storage/connect/jmgoconn.h b/storage/connect/jmgoconn.h new file mode 100644 index 00000000000..8ee7985d760 --- /dev/null +++ b/storage/connect/jmgoconn.h @@ -0,0 +1,113 @@ +/***********************************************************************/ +/* JMgoConn.h : header file for the MongoDB connection classes. */ +/***********************************************************************/ + +/***********************************************************************/ +/* Java interface. */ +/***********************************************************************/ +#include "javaconn.h" + +// Java connection to a MongoDB data source +class TDBJMG; +class JMGCOL; + +/***********************************************************************/ +/* Include MongoDB library header files. */ +/***********************************************************************/ +typedef class JNCOL *PJNCOL; +typedef class MGODEF *PMGODEF; +typedef class TDBJMG *PTDBJMG; +typedef class JMGCOL *PJMGCOL; + +typedef struct JKCOL { + JKCOL *Next; + PJNCOL Jncolp; + PCOL Colp; + char *Key; + int N; +} *PJKC; + +/***********************************************************************/ +/* Used when inserting values in a MongoDB collection. */ +/***********************************************************************/ +class JNCOL : public BLOCK { +public: + // Constructor + JNCOL(bool ar) { Klist = NULL; Array = ar; } + + // Methods + void AddCol(PGLOBAL g, PCOL colp, PSZ jp); + + //Members + PJKC Klist; + bool Array; +}; // end of JNCOL; + +/***********************************************************************/ +/* JMgoConn class. */ +/***********************************************************************/ +class JMgoConn : public JAVAConn { + friend class TDBJMG; + friend class JMGDISC; + //friend class TDBXJDC; + //friend PQRYRES GetColumnInfo(PGLOBAL, char*&, char *, int, PVBLK&); +private: + JMgoConn(); // Standard (unused) constructor + +public: + // Constructor + JMgoConn(PGLOBAL g, PCSZ collname, PCSZ wrapper); + + // Implementation +public: + virtual void AddJars(PSTRG jpop, char sep); + virtual bool Connect(PJPARM sop); + virtual bool MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options, PCSZ filter, bool pipe); +// PQRYRES AllocateResult(PGLOBAL g, TDBEXT *tdbp, int n); + + // Attributes +public: +// virtual int GetMaxValue(int infotype); + +public: + // Operations + virtual int Fetch(int pos = 0); + virtual PSZ GetColumnValue(PSZ name); + + int CollSize(PGLOBAL g); + bool FindCollection(PCSZ query, PCSZ proj); + bool AggregateCollection(PCSZ pipeline); + void MakeColumnGroups(PGLOBAL g, PTDB tdbp); + bool GetMethodId(PGLOBAL g, MODE mode); + jobject MakeObject(PGLOBAL g, PCOL colp, bool& error); + jobject MakeDoc(PGLOBAL g, PJNCOL jcp); + int DocWrite(PGLOBAL g); + int DocUpdate(PGLOBAL g, PTDB tdbp); + int DocDelete(PGLOBAL g, bool all); + bool Rewind(void); + PSZ GetDocument(void); + +protected: + // Members + PCSZ CollName; // The collation name + jmethodID gcollid; // The GetCollection method ID + jmethodID countid; // The GetCollSize method ID + jmethodID fcollid; // The FindColl method ID + jmethodID acollid; // The AggregateColl method ID + jmethodID readid; // The ReadNext method ID + jmethodID fetchid; // The Fetch method ID + jmethodID rewindid; // The Rewind method ID + jmethodID getdocid; // The GetDoc method ID + jmethodID objfldid; // The ObjectField method ID + jmethodID mkdocid; // The MakeDocument method ID + jmethodID docaddid; // The DocAdd method ID + jmethodID mkarid; // The MakeArray method ID + jmethodID araddid; // The ArrayAdd method ID + jmethodID insertid; // The CollInsert method ID + jmethodID updateid; // The CollUpdate method ID + jmethodID deleteid; // The CollDelete method ID + PJNCOL Fpc; // To JNCOL classes + int m_Fetch; + int m_Ncol; + int m_Version; // Java driver version (2 or 3) +}; // end of JMgoConn class definition diff --git a/storage/connect/json.cpp b/storage/connect/json.cpp index b473871e9f7..b86d2da21b7 100644 --- a/storage/connect/json.cpp +++ b/storage/connect/json.cpp @@ -1,5 +1,5 @@ /*************** json CPP Declares Source Code File (.H) ***************/ -/* Name: json.cpp Version 1.3 */ +/* Name: json.cpp Version 1.4 */ /* */ /* (C) Copyright to the author Olivier BERTRAND 2014 - 2017 */ /* */ @@ -53,6 +53,38 @@ void trans_func(unsigned int u, _EXCEPTION_POINTERS* pExp) char *GetExceptionDesc(PGLOBAL g, unsigned int e); #endif // SE_CATCH +char *GetJsonNull(void); + +/***********************************************************************/ +/* IsNum: check whether this string is all digits. */ +/***********************************************************************/ +bool IsNum(PSZ s) +{ + for (char *p = s; *p; p++) + if (*p == ']') + break; + else if (!isdigit(*p) || *p == '-') + return false; + + return true; +} // end of IsNum + +/***********************************************************************/ +/* NextChr: return the first found '[' or Sep pointer. */ +/***********************************************************************/ +char *NextChr(PSZ s, char sep) +{ + char *p1 = strchr(s, '['); + char *p2 = strchr(s, sep); + + if (!p2) + return p1; + else if (p1) + return MY_MIN(p1, p2); + + return p2; +} // end of NextChr + /***********************************************************************/ /* Parse a json string. */ @@ -60,7 +92,7 @@ char *GetExceptionDesc(PGLOBAL g, unsigned int e); /***********************************************************************/ PJSON ParseJson(PGLOBAL g, char *s, int len, int *ptyp, bool *comma) { - int i, rc, pretty = (ptyp) ? *ptyp : 3; + int i, pretty = (ptyp) ? *ptyp : 3; bool b = false, pty[3] = {true, true, true}; PJSON jsp = NULL; STRG src; @@ -81,117 +113,91 @@ PJSON ParseJson(PGLOBAL g, char *s, int len, int *ptyp, bool *comma) if (s[0] == '[' && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n'))) pty[0] = false; - - // Save stack and allocation environment and prepare error return - if (g->jump_level == MAX_JUMP) { - strcpy(g->Message, MSG(TOO_MANY_JUMPS)); - return NULL; - } // endif jump_level - -#if defined(SE_CATCH) - // Let's try to recover from any kind of interrupt - _se_translator_function f = _set_se_translator(trans_func); - try { -#endif // SE_CATCH --------------------- try section -------------------- - if ((rc = setjmp(g->jumper[++g->jump_level])) != 0) { - goto err; - } // endif rc + for (i = 0; i < len; i++) + switch (s[i]) { + case '[': + if (jsp) + goto tryit; + else if (!(jsp = ParseArray(g, ++i, src, pty))) + throw 1; -#if defined(SE_CATCH) // ------------- end of try section ----------------- - } catch (SE_Exception e) { - sprintf(g->Message, "ParseJson: exception doing setjmp: %s (rc=%hd)", - GetExceptionDesc(g, e.nSE), e.nSE); - _set_se_translator(f); - goto err; - } catch (...) { - strcpy(g->Message, "Exception doing setjmp"); - _set_se_translator(f); - goto err; - } // end of try-catches + break; + case '{': + if (jsp) + goto tryit; + else if (!(jsp = ParseObject(g, ++i, src, pty))) + throw 2; - _set_se_translator(f); -#endif // SE_CATCH + break; + case ' ': + case '\t': + case '\n': + case '\r': + break; + case ',': + if (jsp && (pretty == 1 || pretty == 3)) { + if (comma) + *comma = true; - for (i = 0; i < len; i++) - switch (s[i]) { - case '[': - if (jsp) - goto tryit; - else if (!(jsp = ParseArray(g, ++i, src, pty))) - goto err; + pty[0] = pty[2] = false; + break; + } // endif pretty - break; - case '{': - if (jsp) - goto tryit; - else if (!(jsp = ParseObject(g, ++i, src, pty))) - goto err; + sprintf(g->Message, "Unexpected ',' (pretty=%d)", pretty); + throw 3; + case '(': + b = true; + break; + case ')': + if (b) { + b = false; + break; + } // endif b - break; - case ' ': - case '\t': - case '\n': - case '\r': - break; - case ',': - if (jsp && (pretty == 1 || pretty == 3)) { - if (comma) - *comma = true; + default: + if (jsp) + goto tryit; + else if (!(jsp = ParseValue(g, i, src, pty))) + throw 4; - pty[0] = pty[2] = false; - break; - } // endif pretty + break; + }; // endswitch s[i] - sprintf(g->Message, "Unexpected ',' (pretty=%d)", pretty); - goto err; - case '(': - b = true; - break; - case ')': - if (b) { - b = false; - break; - } // endif b + if (!jsp) + sprintf(g->Message, "Invalid Json string '%.*s'", 50, s); + else if (ptyp && pretty == 3) { + *ptyp = 3; // Not recognized pretty - default: - if (jsp) - goto tryit; - else if (!(jsp = ParseValue(g, i, src, pty))) - goto err; + for (i = 0; i < 3; i++) + if (pty[i]) { + *ptyp = i; + break; + } // endif pty - break; - }; // endswitch s[i] + } // endif ptyp - if (!jsp) - sprintf(g->Message, "Invalid Json string '%.*s'", 50, s); - else if (ptyp && pretty == 3) { - *ptyp = 3; // Not recognized pretty + } catch (int n) { + if (trace) + htrc("Exception %d: %s\n", n, g->Message); + jsp = NULL; + } catch (const char *msg) { + strcpy(g->Message, msg); + jsp = NULL; + } // end catch - for (i = 0; i < 3; i++) - if (pty[i]) { - *ptyp = i; - break; - } // endif pty - - } // endif ptyp - - g->jump_level--; - return jsp; + return jsp; tryit: if (pty[0] && (!pretty || pretty > 2)) { if ((jsp = ParseArray(g, (i = 0), src, pty)) && ptyp && pretty == 3) *ptyp = (pty[0]) ? 0 : 3; - g->jump_level--; return jsp; } else strcpy(g->Message, "More than one item in file"); -err: - g->jump_level--; - return NULL; + return NULL; } // end of ParseJson /***********************************************************************/ @@ -335,16 +341,16 @@ PJVAL ParseValue(PGLOBAL g, int& i, STRG& src, bool *pty) PJVAL jvp = new(g) JVALUE; for (; i < len; i++) - switch (s[i]) { - case '\n': - pty[0] = pty[1] = false; - case '\r': - case ' ': - case '\t': - break; - default: - goto suite; - } // endswitch + switch (s[i]) { + case '\n': + pty[0] = pty[1] = false; + case '\r': + case ' ': + case '\t': + break; + default: + goto suite; + } // endswitch suite: switch (s[i]) { @@ -533,7 +539,7 @@ PVAL ParseNumeric(PGLOBAL g, int& i, STRG& src) if (!has_e) goto err; - // passthru + // fall through case '-': if (found_digit) goto err; @@ -585,78 +591,75 @@ PVAL ParseNumeric(PGLOBAL g, int& i, STRG& src) PSZ Serialize(PGLOBAL g, PJSON jsp, char *fn, int pretty) { PSZ str = NULL; - bool b = false, err = true; - JOUT *jp; + bool b = false, err = true; + JOUT *jp; FILE *fs = NULL; g->Message[0] = 0; - // Save stack and allocation environment and prepare error return - if (g->jump_level == MAX_JUMP) { - strcpy(g->Message, MSG(TOO_MANY_JUMPS)); - return NULL; - } // endif jump_level - - if (setjmp(g->jumper[++g->jump_level])) { - str = NULL; - goto fin; - } // endif jmp - - if (!jsp) { - strcpy(g->Message, "Null json tree"); - goto fin; - } else if (!fn) { - // Serialize to a string - jp = new(g) JOUTSTR(g); - b = pretty == 1; - } else { - if (!(fs = fopen(fn, "wb"))) { - sprintf(g->Message, MSG(OPEN_MODE_ERROR), - "w", (int)errno, fn); - strcat(strcat(g->Message, ": "), strerror(errno)); - goto fin;; - } else if (pretty >= 2) { - // Serialize to a pretty file - jp = new(g)JOUTPRT(g, fs); + try { + if (!jsp) { + strcpy(g->Message, "Null json tree"); + throw 1; + } else if (!fn) { + // Serialize to a string + jp = new(g) JOUTSTR(g); + b = pretty == 1; } else { - // Serialize to a flat file - b = true; - jp = new(g)JOUTFILE(g, fs, pretty); + if (!(fs = fopen(fn, "wb"))) { + sprintf(g->Message, MSG(OPEN_MODE_ERROR), + "w", (int)errno, fn); + strcat(strcat(g->Message, ": "), strerror(errno)); + throw 2; + } else if (pretty >= 2) { + // Serialize to a pretty file + jp = new(g)JOUTPRT(g, fs); + } else { + // Serialize to a flat file + b = true; + jp = new(g)JOUTFILE(g, fs, pretty); + } // endif's + + } // endif's + + switch (jsp->GetType()) { + case TYPE_JAR: + err = SerializeArray(jp, (PJAR)jsp, b); + break; + case TYPE_JOB: + err = ((b && jp->Prty()) && jp->WriteChr('\t')); + err |= SerializeObject(jp, (PJOB)jsp); + break; + case TYPE_JVAL: + err = SerializeValue(jp, (PJVAL)jsp); + break; + default: + strcpy(g->Message, "Invalid json tree"); + } // endswitch Type + + if (fs) { + fputs(EL, fs); + fclose(fs); + str = (err) ? NULL : strcpy(g->Message, "Ok"); + } else if (!err) { + str = ((JOUTSTR*)jp)->Strp; + jp->WriteChr('\0'); + PlugSubAlloc(g, NULL, ((JOUTSTR*)jp)->N); + } else { + if (!g->Message[0]) + strcpy(g->Message, "Error in Serialize"); + } // endif's - } // endif's + } catch (int n) { + if (trace) + htrc("Exception %d: %s\n", n, g->Message); + str = NULL; + } catch (const char *msg) { + strcpy(g->Message, msg); + str = NULL; + } // end catch - switch (jsp->GetType()) { - case TYPE_JAR: - err = SerializeArray(jp, (PJAR)jsp, b); - break; - case TYPE_JOB: - err = ((b && jp->Prty()) && jp->WriteChr('\t')); - err |= SerializeObject(jp, (PJOB)jsp); - break; - case TYPE_JVAL: - err = SerializeValue(jp, (PJVAL)jsp); - break; - default: - strcpy(g->Message, "Invalid json tree"); - } // endswitch Type - - if (fs) { - fputs(EL, fs); - fclose(fs); - str = (err) ? NULL : strcpy(g->Message, "Ok"); - } else if (!err) { - str = ((JOUTSTR*)jp)->Strp; - jp->WriteChr('\0'); - PlugSubAlloc(g, NULL, ((JOUTSTR*)jp)->N); - } else { - if (!g->Message[0]) - strcpy(g->Message, "Error in Serialize"); - - } // endif's - -fin: - g->jump_level--; return str; } // end of Serialize @@ -826,7 +829,7 @@ bool JOUTSTR::Escape(const char *s) case '\r': case '\b': case '\f': WriteChr('\\'); - // passthru + // fall through default: WriteChr(s[i]); break; @@ -962,10 +965,29 @@ return false; /* -------------------------- Class JOBJECT -------------------------- */ +/***********************************************************************/ +/* Return the number of pairs in this object. */ +/***********************************************************************/ +int JOBJECT::GetSize(bool b) +{ + if (b) { + // Return only non null pairs + int n = 0; + + for (PJPR jpp = First; jpp; jpp = jpp->Next) + if (jpp->Val && !jpp->Val->IsNull()) + n++; + + return n; + } else + return Size; + +} // end of GetSize + /***********************************************************************/ /* Add a new pair to an Object. */ /***********************************************************************/ -PJPR JOBJECT::AddPair(PGLOBAL g, PSZ key) +PJPR JOBJECT::AddPair(PGLOBAL g, PCSZ key) { PJPR jpp = new(g) JPAIR(key); @@ -1021,14 +1043,31 @@ PSZ JOBJECT::GetText(PGLOBAL g, PSZ text) if (!First && n) return NULL; - else for (PJPR jp = First; jp; jp = jp->Next) + else if (n == 1 && Size == 1 && !strcmp(First->GetKey(), "$date")) { + int i; + + First->Val->GetText(g, text); + i = (text[1] == '-' ? 2 : 1); + + if (IsNum(text + i)) { + // Date is in milliseconds + int j = (int)strlen(text); + + if (j >= 4 + i) + text[j - 3] = 0; // Change it to seconds + else + strcpy(text, " 0"); + + } // endif text + + } else for (PJPR jp = First; jp; jp = jp->Next) jp->Val->GetText(g, text); if (n) PlugSubAlloc(g, NULL, strlen(text) + 1); return text + n; -} // end of GetValue; +} // end of GetText; /***********************************************************************/ /* Merge two objects. */ @@ -1051,7 +1090,7 @@ bool JOBJECT::Merge(PGLOBAL g, PJSON jsp) /***********************************************************************/ /* Set or add a value corresponding to the given key. */ /***********************************************************************/ -void JOBJECT::SetValue(PGLOBAL g, PJVAL jvp, PSZ key) +void JOBJECT::SetValue(PGLOBAL g, PJVAL jvp, PCSZ key) { PJPR jp; @@ -1069,9 +1108,9 @@ void JOBJECT::SetValue(PGLOBAL g, PJVAL jvp, PSZ key) } // end of SetValue /***********************************************************************/ -/* Delete a value corresponding to the given key. */ +/* Delete a value corresponding to the given key. */ /***********************************************************************/ -void JOBJECT::DeleteKey(PSZ key) +void JOBJECT::DeleteKey(PCSZ key) { PJPR jp, *pjp = &First; @@ -1099,6 +1138,25 @@ bool JOBJECT::IsNull(void) /* -------------------------- Class JARRAY --------------------------- */ +/***********************************************************************/ +/* Return the number of values in this object. */ +/***********************************************************************/ +int JARRAY::GetSize(bool b) +{ + if (b) { + // Return only non null values + int n = 0; + + for (PJVAL jvp = First; jvp; jvp = jvp->Next) + if (!jvp->IsNull()) + n++; + + return n; + } else + return Size; + +} // end of GetSize + /***********************************************************************/ /* Make the array of values from the values list. */ /***********************************************************************/ @@ -1207,18 +1265,42 @@ bool JARRAY::SetValue(PGLOBAL g, PJVAL jvp, int n) return false; } // end of SetValue +/***********************************************************************/ +/* Return the text corresponding to all values. */ +/***********************************************************************/ +PSZ JARRAY::GetText(PGLOBAL g, PSZ text) +{ + int n; + PJVAL jp; + + if (!text) { + text = (char*)PlugSubAlloc(g, NULL, 0); + text[0] = 0; + n = 1; + } else + n = 0; + + for (jp = First; jp; jp = jp->Next) + jp->GetText(g, text); + + if (n) + PlugSubAlloc(g, NULL, strlen(text) + 1); + + return text + n; +} // end of GetText; + /***********************************************************************/ /* Delete a Value from the Arrays Value list. */ /***********************************************************************/ bool JARRAY::DeleteValue(int n) { - PJVAL jvp = GetValue(n); + PJVAL jvp = GetValue(n); - if (jvp) { - jvp->Del = true; - return false; - } else - return true; + if (jvp) { + jvp->Del = true; + return false; + } else + return true; } // end of DeleteValue @@ -1250,10 +1332,10 @@ JVALUE::JVALUE(PGLOBAL g, PVAL valp) : JSON() /***********************************************************************/ /* Constructor for a given string. */ /***********************************************************************/ -JVALUE::JVALUE(PGLOBAL g, PSZ strp) : JSON() +JVALUE::JVALUE(PGLOBAL g, PCSZ strp) : JSON() { Jsp = NULL; - Value = AllocateValue(g, strp, TYPE_STRING); + Value = AllocateValue(g, (void*)strp, TYPE_STRING); Next = NULL; Del = false; } // end of JVALUE constructor @@ -1268,7 +1350,7 @@ JTYP JVALUE::GetValType(void) else if (Value) return (JTYP)Value->GetType(); else - return (JTYP)TYPE_VOID; + return TYPE_NULL; } // end of GetValType @@ -1321,10 +1403,20 @@ double JVALUE::GetFloat(void) /***********************************************************************/ /* Return the Value's String value. */ /***********************************************************************/ -PSZ JVALUE::GetString(void) +PSZ JVALUE::GetString(PGLOBAL g) { - char buf[32]; - return (Value) ? Value->GetCharString(buf) : NULL; + char *p; + + if (Value) { + char buf[32]; + + if ((p = Value->GetCharString(buf)) == buf) + p = PlugDup(g, buf); + + } else + p = NULL; + + return p; } // end of GetString /***********************************************************************/ @@ -1332,7 +1424,7 @@ PSZ JVALUE::GetString(void) /***********************************************************************/ PSZ JVALUE::GetText(PGLOBAL g, PSZ text) { - if (Jsp && Jsp->GetType() == TYPE_JOB) + if (Jsp) return Jsp->GetText(g, text); char buf[32]; @@ -1340,8 +1432,8 @@ PSZ JVALUE::GetText(PGLOBAL g, PSZ text) if (s) strcat(strcat(text, " "), s); - else - strcat(text, " ???"); + else if (GetJsonNull()) + strcat(strcat(text, " "), GetJsonNull()); return text; } // end of GetText @@ -1374,7 +1466,7 @@ void JVALUE::SetTiny(PGLOBAL g, char n) { Value = AllocateValue(g, &n, TYPE_TINY); Jsp = NULL; -} // end of SetInteger +} // end of SetTiny /***********************************************************************/ /* Set the Value's value as the given big integer. */ @@ -1408,6 +1500,6 @@ void JVALUE::SetString(PGLOBAL g, PSZ s, short c) /***********************************************************************/ bool JVALUE::IsNull(void) { - return (Jsp) ? Jsp->IsNull() : (Value) ? Value->IsZero() : true; + return (Jsp) ? Jsp->IsNull() : (Value) ? Value->IsNull() : true; } // end of IsNull diff --git a/storage/connect/json.h b/storage/connect/json.h index 4ea169e1b18..fd6c029df99 100644 --- a/storage/connect/json.h +++ b/storage/connect/json.h @@ -1,7 +1,7 @@ /**************** json H Declares Source Code File (.H) ****************/ /* Name: json.h Version 1.2 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2014 - 2015 */ +/* (C) Copyright to the author Olivier BERTRAND 2014 - 2017 */ /* */ /* This file contains the JSON classes declares. */ /***********************************************************************/ @@ -13,11 +13,13 @@ #define X #endif -enum JTYP {TYPE_STRG = 1, - TYPE_DBL = 2, - TYPE_BOOL = 4, - TYPE_BINT = 5, - TYPE_INTG = 7, +enum JTYP {TYPE_NULL = TYPE_VOID, + TYPE_STRG = TYPE_STRING, + TYPE_DBL = TYPE_DOUBLE, + TYPE_BOOL = TYPE_TINY, + TYPE_BINT = TYPE_BIGINT, + TYPE_DTM = TYPE_DATE, + TYPE_INTG = TYPE_INT, TYPE_JSON = 12, TYPE_JAR, TYPE_JOB, @@ -41,6 +43,10 @@ typedef struct { int len; } STRG, *PSG; +bool IsNum(PSZ s); +char *NextChr(PSZ s, char sep); +char *GetJsonNull(void); + PJSON ParseJson(PGLOBAL g, char *s, int n, int *prty = NULL, bool *b = NULL); PJAR ParseArray(PGLOBAL g, int& i, STRG& src, bool *pty); PJOB ParseObject(PGLOBAL g, int& i, STRG& src, bool *pty); @@ -51,6 +57,8 @@ PSZ Serialize(PGLOBAL g, PJSON jsp, char *fn, int pretty); bool SerializeArray(JOUT *js, PJAR jarp, bool b); bool SerializeObject(JOUT *js, PJOB jobp); bool SerializeValue(JOUT *js, PJVAL jvp); +bool IsNum(PSZ s); +char *NextChr(PSZ s, char sep); /***********************************************************************/ /* Class JOUT. Used by Serialize. */ @@ -125,14 +133,14 @@ class JPAIR : public BLOCK { friend PJOB ParseObject(PGLOBAL, int&, STRG&, bool*); friend bool SerializeObject(JOUT *, PJOB); public: - JPAIR(PSZ key) : BLOCK() {Key = key; Val = NULL; Next = NULL;} + JPAIR(PCSZ key) : BLOCK() {Key = key; Val = NULL; Next = NULL;} - inline PSZ GetKey(void) {return Key;} + inline PCSZ GetKey(void) {return Key;} inline PJVAL GetVal(void) {return Val;} inline PJPR GetNext(void) {return Next;} protected: - PSZ Key; // This pair key name + PCSZ Key; // This pair key name PJVAL Val; // To the value of the pair PJPR Next; // To the next pair }; // end of class JPAIR @@ -145,12 +153,13 @@ class JSON : public BLOCK { JSON(void) {Size = 0;} int size(void) {return Size;} + virtual int GetSize(bool b) {return Size;} virtual void Clear(void) {Size = 0;} virtual JTYP GetType(void) {return TYPE_JSON;} virtual JTYP GetValType(void) {X return TYPE_JSON;} virtual void InitArray(PGLOBAL g) {X} //virtual PJVAL AddValue(PGLOBAL g, PJVAL jvp = NULL, int *x = NULL) {X return NULL;} - virtual PJPR AddPair(PGLOBAL g, PSZ key) {X return NULL;} + virtual PJPR AddPair(PGLOBAL g, PCSZ key) {X return NULL;} virtual PJAR GetKeyList(PGLOBAL g) {X return NULL;} virtual PJVAL GetValue(const char *key) {X return NULL;} virtual PJOB GetObject(void) {return NULL;} @@ -162,17 +171,17 @@ class JSON : public BLOCK { virtual PJPR GetFirst(void) {X return NULL;} virtual int GetInteger(void) {X return 0;} virtual double GetFloat() {X return 0.0;} - virtual PSZ GetString() {X return NULL;} + virtual PSZ GetString(PGLOBAL g) {X return NULL;} virtual PSZ GetText(PGLOBAL g, PSZ text) {X return NULL;} virtual bool Merge(PGLOBAL g, PJSON jsp) { X return true; } virtual bool SetValue(PGLOBAL g, PJVAL jvp, int i) { X return true; } - virtual void SetValue(PGLOBAL g, PJVAL jvp, PSZ key) {X} + virtual void SetValue(PGLOBAL g, PJVAL jvp, PCSZ key) {X} virtual void SetValue(PVAL valp) {X} virtual void SetValue(PJSON jsp) {X} virtual void SetString(PGLOBAL g, PSZ s, short c) {X} virtual void SetInteger(PGLOBAL g, int n) {X} virtual void SetFloat(PGLOBAL g, double f) {X} - virtual void DeleteKey(char *k) {X} + virtual void DeleteKey(PCSZ k) {X} virtual bool DeleteValue(int i) {X return true;} virtual bool IsNull(void) {X return true;} @@ -192,17 +201,18 @@ class JOBJECT : public JSON { using JSON::GetValue; using JSON::SetValue; - virtual void Clear(void) {First = Last = NULL; Size = 0;} + virtual void Clear(void) {First = Last = NULL; Size = 0;} virtual JTYP GetType(void) {return TYPE_JOB;} virtual PJPR GetFirst(void) {return First;} - virtual PJPR AddPair(PGLOBAL g, PSZ key); + virtual int GetSize(bool b); + virtual PJPR AddPair(PGLOBAL g, PCSZ key); virtual PJOB GetObject(void) {return this;} virtual PJVAL GetValue(const char* key); virtual PJAR GetKeyList(PGLOBAL g); virtual PSZ GetText(PGLOBAL g, PSZ text); virtual bool Merge(PGLOBAL g, PJSON jsp); - virtual void SetValue(PGLOBAL g, PJVAL jvp, PSZ key); - virtual void DeleteKey(char *k); + virtual void SetValue(PGLOBAL g, PJVAL jvp, PCSZ key); + virtual void DeleteKey(PCSZ k); virtual bool IsNull(void); protected: @@ -221,11 +231,13 @@ class JARRAY : public JSON { using JSON::GetValue; using JSON::SetValue; virtual void Clear(void) {First = Last = NULL; Size = 0;} - virtual JTYP GetType(void) {return TYPE_JAR;} + virtual JTYP GetType(void) {return TYPE_JAR;} virtual PJAR GetArray(void) {return this;} - PJVAL AddValue(PGLOBAL g, PJVAL jvp = NULL, int *x = NULL); + virtual int GetSize(bool b); + PJVAL AddValue(PGLOBAL g, PJVAL jvp = NULL, int *x = NULL); virtual void InitArray(PGLOBAL g); virtual PJVAL GetValue(int i); + virtual PSZ GetText(PGLOBAL g, PSZ text); virtual bool Merge(PGLOBAL g, PJSON jsp); virtual bool SetValue(PGLOBAL g, PJVAL jvp, int i); virtual bool DeleteValue(int n); @@ -245,20 +257,20 @@ class JARRAY : public JSON { class JVALUE : public JSON { friend class JARRAY; friend class JSNX; + friend class JSONCOL; friend PJVAL ParseValue(PGLOBAL, int&, STRG&, bool*); friend bool SerializeValue(JOUT *, PJVAL); public: - JVALUE(void) : JSON() - {Jsp = NULL; Value = NULL; Next = NULL; Del = false;} + JVALUE(void) : JSON() {Clear();} JVALUE(PJSON jsp) : JSON() - {Jsp = jsp; Value = NULL; Next = NULL; Del = false;} - JVALUE(PGLOBAL g, PVAL valp); - JVALUE(PGLOBAL g, PSZ strp); + {Jsp = jsp; Value = NULL; Next = NULL; Del = false; Size = 1;} + JVALUE(PGLOBAL g, PVAL valp); + JVALUE(PGLOBAL g, PCSZ strp); using JSON::GetValue; using JSON::SetValue; virtual void Clear(void) - {Jsp = NULL; Value = NULL; Next = NULL; Del = false; Size = 0;} + {Jsp = NULL; Value = NULL; Next = NULL; Del = false; Size = 1;} virtual JTYP GetType(void) {return TYPE_JVAL;} virtual JTYP GetValType(void); virtual PJOB GetObject(void); @@ -269,7 +281,7 @@ class JVALUE : public JSON { virtual int GetInteger(void); virtual long long GetBigint(void); virtual double GetFloat(void); - virtual PSZ GetString(void); + virtual PSZ GetString(PGLOBAL g); virtual PSZ GetText(PGLOBAL g, PSZ text); virtual void SetValue(PJSON jsp); virtual void SetValue(PVAL valp) { Value = valp; Jsp = NULL; } @@ -286,4 +298,3 @@ class JVALUE : public JSON { PJVAL Next; // Next value in array bool Del; // True when deleted }; // end of class JVALUE - diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index f07a1ac818f..00627669d60 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -1,5 +1,5 @@ /****************** jsonudf C++ Program Source Code File (.CPP) ******************/ -/* PROGRAM NAME: jsonudf Version 1.5 */ +/* PROGRAM NAME: jsonudf Version 1.6 */ /* (C) Copyright to the author Olivier BERTRAND 2015-2017 */ /* This program are the JSON User Defined Functions . */ /*********************************************************************************/ @@ -27,7 +27,10 @@ #endif #define M 7 -uint GetJsonGrpSize(void); +bool IsNum(PSZ s); +char *NextChr(PSZ s, char sep); +char *GetJsonNull(void); +uint GetJsonGrpSize(void); static int IsJson(UDF_ARGS *args, uint i); static PSZ MakePSZ(PGLOBAL g, UDF_ARGS *args, int i); static char *handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -35,6 +38,8 @@ static char *handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, static char *bin_handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *error); +void json_array_deinit(UDF_INIT* initid); + static uint JsonGrpSize = 10; /* ----------------------------------- JSNX ------------------------------------ */ @@ -111,10 +116,9 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) PJNODE jnp = &Nodes[i]; if (*p) { - if (p[--n] == ']') { - p[n--] = 0; - p++; - } else { + if (p[n - 1] == ']') { + p[--n] = 0; + } else if (!IsNum(p)) { // Wrong array specification sprintf(g->Message, "Invalid array specification %s", p); return true; @@ -124,8 +128,7 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) b = true; // To check whether a numeric Rank was specified - for (int k = 0; dg && p[k]; k++) - dg = isdigit(p[k]) > 0; + dg = IsNum(p); if (!n) { // Default specifications @@ -142,7 +145,7 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) jnp->Rank = B; jnp->Op = OP_LE; } else if (!Value->IsTypeNum()) { - jnp->CncVal = AllocateValue(g, (void*)", ", TYPE_STRING); + jnp->CncVal = AllocateValue(g, PlugDup(g, ", "), TYPE_STRING); jnp->Op = OP_CNC; } else jnp->Op = OP_ADD; @@ -160,13 +163,12 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) // Set the Op value; switch (*p) { case '+': jnp->Op = OP_ADD; break; - case '*': jnp->Op = OP_MULT; break; + case 'x': jnp->Op = OP_MULT; break; case '>': jnp->Op = OP_MAX; break; case '<': jnp->Op = OP_MIN; break; case '!': jnp->Op = OP_SEP; break; // Average case '#': jnp->Op = OP_NUM; break; - case 'x': - case 'X': // Expand this array + case '*': // Expand this array strcpy(g->Message, "Expand not supported by this function"); return true; default: @@ -181,6 +183,10 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) if (n > 2) { // Set concat intermediate string p[n - 1] = 0; + + if (trace) + htrc("Concat string=%s\n", p + 1); + jnp->CncVal = AllocateValue(g, p + 1, TYPE_STRING); } // endif n @@ -232,9 +238,9 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) /*********************************************************************************/ my_bool JSNX::ParseJpath(PGLOBAL g) { - char *p, *p2 = NULL, *pbuf = NULL; + char *p, *p1 = NULL, *p2 = NULL, *pbuf = NULL; int i; - my_bool mul = false; + my_bool a, mul = false; if (Parsed) return false; // Already done @@ -242,11 +248,18 @@ my_bool JSNX::ParseJpath(PGLOBAL g) // Jpath = Name; return true; + if (trace) + htrc("ParseJpath %s\n", SVP(Jpath)); + if (!(pbuf = PlgDBDup(g, Jpath))) return true; - // The Jpath must be analyzed - for (i = 0, p = pbuf; (p = strchr(p, ':')); i++, p++) + if (*pbuf == '$') pbuf++; + if (*pbuf == '.') pbuf++; + if (*pbuf == '[') p1 = pbuf++; + + // Estimate the required number of nodes + for (i = 0, p = pbuf; (p = NextChr(p, '.')); i++, p++) Nod++; // One path node found if (!(Nodes = (PJNODE)PlgDBSubAlloc(g, NULL, (++Nod) * sizeof(JNODE)))) @@ -255,12 +268,28 @@ my_bool JSNX::ParseJpath(PGLOBAL g) memset(Nodes, 0, (Nod)* sizeof(JNODE)); // Analyze the Jpath for this column - for (i = 0, p = pbuf; i < Nod; i++, p = (p2 ? p2 + 1 : p + strlen(p))) { - if ((p2 = strchr(p, ':'))) - *p2 = 0; + for (i = 0, p = pbuf; p && i < Nod; i++, p = (p2 ? p2 : NULL)) { + a = (p1 != NULL); + p1 = strchr(p, '['); + p2 = strchr(p, '.'); + + if (!p2) + p2 = p1; + else if (p1) { + if (p1 < p2) + p2 = p1; + else if (p1 == p2 + 1) + *p2++ = 0; // Old syntax .[ + else + p1 = NULL; + + } // endif p1 + + if (p2) + *p2++ = 0; // Jpath must be explicit - if (*p == 0 || *p == '[') { + if (a || *p == 0 || *p == '[' || IsNum(p)) { // Analyse intermediate array processing if (SetArrayOptions(g, p, i, Nodes[i-1].Key)) return true; @@ -279,7 +308,14 @@ my_bool JSNX::ParseJpath(PGLOBAL g) } // endfor i, p + Nod = i; MulVal = AllocateValue(g, Value); + + if (trace) + for (i = 0; i < Nod; i++) + htrc("Node(%d) Key=%s Op=%d Rank=%d\n", + i, SVP(Nodes[i].Key), Nodes[i].Op, Nodes[i].Rank); + Parsed = true; return false; } // end of ParseJpath @@ -307,6 +343,8 @@ PVAL JSNX::MakeJson(PGLOBAL g, PJSON jsp) void JSNX::SetJsonValue(PGLOBAL g, PVAL vp, PJVAL val, int n) { if (val) { + vp->SetNull(false); + if (Jb) { vp->SetValue_psz(Serialize(g, val->GetJsp(), NULL, 0)); } else switch (val->GetValType()) { @@ -327,11 +365,13 @@ void JSNX::SetJsonValue(PGLOBAL g, PVAL vp, PJVAL val, int n) SetJsonValue(g, vp, val->GetArray()->GetValue(0), n); break; case TYPE_JOB: - // if (!vp->IsTypeNum() || !Strict) { +// if (!vp->IsTypeNum() || !Strict) { vp->SetValue_psz(val->GetObject()->GetText(g, NULL)); break; - // } // endif Type +// } // endif Type + case TYPE_NULL: + vp->SetNull(true); default: vp->Reset(); } // endswitch Type @@ -460,7 +500,7 @@ PVAL JSNX::ExpandArray(PGLOBAL g, PJAR arp, int n) PVAL JSNX::CalculateArray(PGLOBAL g, PJAR arp, int n) { //int i, ars, nv = 0, nextsame = Tjp->NextSame; - int i, ars, nv = 0, nextsame = 0; + int i, nv = 0, nextsame = 0; my_bool err; OPVAL op = Nodes[n].Op; PVAL val[2], vp = Nodes[n].Valp; @@ -468,15 +508,25 @@ PVAL JSNX::CalculateArray(PGLOBAL g, PJAR arp, int n) JVALUE jval; vp->Reset(); -//ars = MY_MIN(Tjp->Limit, arp->size()); - ars = arp->size(); +//ars = arp->size(); - for (i = 0; i < ars; i++) { + if (trace) + htrc("CalculateArray size=%d\n", arp->size()); +// htrc("CalculateArray size=%d\n", ars); + + for (i = 0; i < arp->size(); i++) { +//for (i = 0; i < ars; i++) { because compiler bug jvrp = arp->GetValue(i); -// do { - if (n < Nod - 1 && jvrp->GetJson()) { -// Tjp->NextSame = nextsame; + if (trace) + htrc("Value %s null=%d nv=%d\n", + jvrp->GetString(g), jvrp->IsNull() ? 1 : 0, nv); + + if (!jvrp->IsNull() || (op == OP_CNC && GetJsonNull())) { + if (jvrp->IsNull()) { + jvrp->Value = AllocateValue(g, GetJsonNull(), TYPE_STRING); + jvp = jvrp; + } else if (n < Nod - 1 && jvrp->GetJson()) { jval.SetValue(GetColumnValue(g, jvrp->GetJson(), n + 1)); jvp = &jval; } else @@ -488,27 +538,27 @@ PVAL JSNX::CalculateArray(PGLOBAL g, PJAR arp, int n) } else SetJsonValue(g, MulVal, jvp, n); - if (!MulVal->IsZero()) { - switch (op) { - case OP_CNC: - if (Nodes[n].CncVal) { - val[0] = Nodes[n].CncVal; - err = vp->Compute(g, val, 1, op); - } // endif CncVal + if (!MulVal->IsNull()) { + switch (op) { + case OP_CNC: + if (Nodes[n].CncVal) { + val[0] = Nodes[n].CncVal; + err = vp->Compute(g, val, 1, op); + } // endif CncVal - val[0] = MulVal; - err = vp->Compute(g, val, 1, op); - break; - // case OP_NUM: - case OP_SEP: - val[0] = Nodes[n].Valp; - val[1] = MulVal; - err = vp->Compute(g, val, 2, OP_ADD); - break; - default: - val[0] = Nodes[n].Valp; - val[1] = MulVal; - err = vp->Compute(g, val, 2, op); + val[0] = MulVal; + err = vp->Compute(g, val, 1, op); + break; +// case OP_NUM: + case OP_SEP: + val[0] = Nodes[n].Valp; + val[1] = MulVal; + err = vp->Compute(g, val, 2, OP_ADD); + break; + default: + val[0] = Nodes[n].Valp; + val[1] = MulVal; + err = vp->Compute(g, val, 2, op); } // endswitch Op if (err) @@ -516,7 +566,7 @@ PVAL JSNX::CalculateArray(PGLOBAL g, PJAR arp, int n) } // endif Zero -// } while (Tjp->NextSame > nextsame); + } // endif jvrp } // endfor i @@ -711,6 +761,7 @@ PSZ JSNX::Locate(PGLOBAL g, PJSON jsp, PJVAL jvp, int k) // Write to the path string Jp = new(g) JOUTSTR(g); + Jp->WriteChr('$'); Jvalp = jvp; K = k; @@ -769,7 +820,12 @@ my_bool JSNX::LocateArray(PJAR jarp) /*********************************************************************************/ my_bool JSNX::LocateObject(PJOB jobp) { - size_t m = Jp->N; + size_t m; + + if (Jp->WriteChr('.')) + return true; + + m = Jp->N; for (PJPR pair = jobp->First; pair && !Found; pair = pair->Next) { Jp->N = m; @@ -790,19 +846,12 @@ my_bool JSNX::LocateObject(PJOB jobp) /*********************************************************************************/ my_bool JSNX::LocateValue(PJVAL jvp) { - if (CompareTree(Jvalp, jvp)) { + if (CompareTree(Jvalp, jvp)) Found = (--K == 0); - } else if (jvp->GetArray()) { - if (Jp->WriteChr(':')) - return true; - + else if (jvp->GetArray()) return LocateArray(jvp->GetArray()); - } else if (jvp->GetObject()) { - if (Jp->WriteChr(':')) - return true; - + else if (jvp->GetObject()) return LocateObject(jvp->GetObject()); - } // endif's return false; } // end of LocateValue @@ -848,6 +897,7 @@ PSZ JSNX::LocateAll(PGLOBAL g, PJSON jsp, PJVAL jvp, int mx) if (!g->Message[0]) strcpy(g->Message, "Invalid json tree"); + return NULL; } else { if (Jp->N > 1) Jp->N--; @@ -858,7 +908,6 @@ PSZ JSNX::LocateAll(PGLOBAL g, PJSON jsp, PJVAL jvp, int mx) return Jp->Strp; } // endif's - return NULL; } // end of LocateAll /*********************************************************************************/ @@ -964,26 +1013,26 @@ my_bool JSNX::CompareTree(PJSON jp1, PJSON jp2) /*********************************************************************************/ my_bool JSNX::AddPath(void) { - char s[16]; - my_bool b = false; + char s[16]; - if (Jp->WriteChr('"')) + if (Jp->WriteStr("\"$")) return true; for (int i = 0; i <= I; i++) { - if (b) { - if (Jp->WriteChr(':')) return true; - } else - b = true; - if (Jpnp[i].Type == TYPE_JAR) { sprintf(s, "[%d]", Jpnp[i].N + B); if (Jp->WriteStr(s)) return true; - } else if (Jp->WriteStr(Jpnp[i].Key)) - return true; + } else { + if (Jp->WriteChr('.')) + return true; + + if (Jp->WriteStr(Jpnp[i].Key)) + return true; + + } // endif's } // endfor i @@ -1081,6 +1130,7 @@ inline void JsonMemSave(PGLOBAL g) /*********************************************************************************/ inline void JsonFreeMem(PGLOBAL g) { + g->Activityp = NULL; PlugExit(g); } /* end of JsonFreeMem */ @@ -1092,7 +1142,7 @@ static my_bool JsonInit(UDF_INIT *initid, UDF_ARGS *args, unsigned long reslen, unsigned long memlen, unsigned long more = 0) { - PGLOBAL g = PlugInit(NULL, memlen + more); + PGLOBAL g = PlugInit(NULL, memlen + more + 500); // +500 to avoid CheckMem if (!g) { strcpy(message, "Allocation error"); @@ -1104,7 +1154,7 @@ static my_bool JsonInit(UDF_INIT *initid, UDF_ARGS *args, } // endif g g->Mrr = (args->arg_count && args->args[0]) ? 1 : 0; - g->ActivityStart = (PACTIVITY)more; + g->More = more; initid->maybe_null = mbn; initid->max_length = reslen; initid->ptr = (char*)g; @@ -1379,6 +1429,7 @@ static my_bool CalcLen(UDF_ARGS *args, my_bool obj, memlen += (k + sizeof(JOBJECT) + sizeof(JPAIR)); } else memlen += sizeof(JARRAY); + switch (args->arg_type[i]) { case STRING_RESULT: if (n == 2 && args->args[i]) { @@ -1448,13 +1499,18 @@ static my_bool CheckMemory(PGLOBAL g, UDF_INIT *initid, UDF_ARGS *args, uint n, } // endif b - ml += (unsigned long)g->ActivityStart; // more + ml += g->More; if (ml > g->Sarea_Size) { +#if !defined(DEVELOPMENT) + if (trace) +#endif + htrc("Freeing Sarea at %p size=%d\n", g->Sarea, g->Sarea_Size); + free(g->Sarea); if (!(g->Sarea = PlugAllocMem(g, ml))) { - char errmsg[256]; + char errmsg[MAX_STR]; sprintf(errmsg, MSG(WORK_AREA), g->Message); strcpy(g->Message, errmsg); @@ -1495,7 +1551,7 @@ static PSZ MakePSZ(PGLOBAL g, UDF_ARGS *args, int i) /*********************************************************************************/ /* Make a valid key from the passed argument. */ /*********************************************************************************/ -static PSZ MakeKey(PGLOBAL g, UDF_ARGS *args, int i) +static PCSZ MakeKey(PGLOBAL g, UDF_ARGS *args, int i) { if (args->arg_count > (unsigned)i) { int j = 0, n = args->attribute_lengths[i]; @@ -1756,16 +1812,16 @@ void jsonvalue_deinit(UDF_INIT* initid) /*********************************************************************************/ /* Make a Json array containing all the parameters. */ /*********************************************************************************/ -my_bool json_array_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool json_make_array_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; CalcLen(args, false, reslen, memlen); return JsonInit(initid, args, message, false, reslen, memlen); -} // end of json_array_init +} // end of json_make_array_init -char *json_array(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) +char *json_make_array(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *) { char *str; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -1792,12 +1848,12 @@ char *json_array(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = strlen(str); return str; -} // end of json_array +} // end of json_make_array -void json_array_deinit(UDF_INIT* initid) +void json_make_array_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of json_array_deinit +} // end of json_make_array_deinit /*********************************************************************************/ /* Add one or several values to a Json array. */ @@ -1844,7 +1900,7 @@ char *json_array_add_values(UDF_INIT *initid, UDF_ARGS *args, char *result, PJAR arp; PJVAL jvp = MakeValue(g, args, 0, &top); - if ((p = jvp->GetString())) { + if ((p = jvp->GetString(g))) { if (!(top = ParseJson(g, p, strlen(p)))) { PUSH_WARNING(g->Message); return NULL; @@ -2077,19 +2133,219 @@ void json_array_delete_deinit(UDF_INIT* initid) JsonFreeMem((PGLOBAL)initid->ptr); } // end of json_array_delete_deinit +/*********************************************************************************/ +/* Sum big integer values from a Json array. */ +/*********************************************************************************/ +my_bool jsonsum_int_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen, more; + + if (args->arg_count != 1) { + strcpy(message, "This function must have 1 argument"); + return true; + } else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) { + strcpy(message, "First argument must be a json item"); + return true; + } else + CalcLen(args, false, reslen, memlen); + + // TODO: calculate this + more = (IsJson(args, 0) != 3) ? 1000 : 0; + + return JsonInit(initid, args, message, true, reslen, memlen, more); +} // end of jsonsum_int_init + +long long jsonsum_int(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) +{ + long long n = 0LL; + PGLOBAL g = (PGLOBAL)initid->ptr; + + if (g->N) { + if (!g->Activityp) { + *is_null = 1; + return 0LL; + } else + return *(long long*)g->Activityp; + + } else if (initid->const_item) + g->N = 1; + + if (!CheckMemory(g, initid, args, 1, false, false, true)) { + PJVAL jvp = MakeValue(g, args, 0); + + if (jvp && jvp->GetValType() == TYPE_JAR) { + PJAR arp = jvp->GetArray(); + + for (int i = 0; i < arp->size(); i++) + n += arp->GetValue(i)->GetBigint(); + + } else { + PUSH_WARNING("First argument target is not an array"); + } // endif jvp + + } else { + *error = 1; + n = -1LL; + } // end of CheckMemory + + if (g->N) { + // Keep result of constant function + long long *np = (long long*)PlugSubAlloc(g, NULL, sizeof(long long)); + *np = n; + g->Activityp = (PACTIVITY)np; + } // endif const_item + + return n; +} // end of jsonsum_int + +void jsonsum_int_deinit(UDF_INIT* initid) +{ + JsonFreeMem((PGLOBAL)initid->ptr); +} // end of jsonsum_int_deinit + +/*********************************************************************************/ +/* Sum big integer values from a Json array. */ +/*********************************************************************************/ +my_bool jsonsum_real_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen, more; + + if (args->arg_count != 1) { + strcpy(message, "This function must have 1 argument"); + return true; + } else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) { + strcpy(message, "First argument must be a json item"); + return true; + } else + CalcLen(args, false, reslen, memlen); + + // TODO: calculate this + more = (IsJson(args, 0) != 3) ? 1000 : 0; + + return JsonInit(initid, args, message, true, reslen, memlen, more); +} // end of jsonsum_real_init + +double jsonsum_real(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) +{ + double n = 0.0; + PGLOBAL g = (PGLOBAL)initid->ptr; + + if (g->N) { + if (!g->Activityp) { + *is_null = 1; + return 0.0; + } else + return *(double*)g->Activityp; + + } else if (initid->const_item) + g->N = 1; + + if (!CheckMemory(g, initid, args, 1, false, false, true)) { + PJVAL jvp = MakeValue(g, args, 0); + + if (jvp && jvp->GetValType() == TYPE_JAR) { + PJAR arp = jvp->GetArray(); + + for (int i = 0; i < arp->size(); i++) + n += arp->GetValue(i)->GetFloat(); + + } else { + PUSH_WARNING("First argument target is not an array"); + } // endif jvp + + } else { + *error = 1; + n = -1.0; + } // end of CheckMemory + + if (g->N) { + // Keep result of constant function + double *np = (double*)PlugSubAlloc(g, NULL, sizeof(double)); + *np = n; + g->Activityp = (PACTIVITY)np; + } // endif const_item + + return n; +} // end of jsonsum_real + +void jsonsum_real_deinit(UDF_INIT* initid) +{ + JsonFreeMem((PGLOBAL)initid->ptr); +} // end of jsonsum_real_deinit + +/*********************************************************************************/ +/* Returns the average of big integer values from a Json array. */ +/*********************************************************************************/ +my_bool jsonavg_real_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + return jsonsum_real_init(initid, args, message); +} // end of jsonavg_real_init + +double jsonavg_real(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) +{ + double n = 0.0; + PGLOBAL g = (PGLOBAL)initid->ptr; + + if (g->N) { + if (!g->Activityp) { + *is_null = 1; + return 0.0; + } else + return *(double*)g->Activityp; + + } else if (initid->const_item) + g->N = 1; + + if (!CheckMemory(g, initid, args, 1, false, false, true)) { + PJVAL jvp = MakeValue(g, args, 0); + + if (jvp && jvp->GetValType() == TYPE_JAR) { + PJAR arp = jvp->GetArray(); + + if (arp->size()) { + for (int i = 0; i < arp->size(); i++) + n += arp->GetValue(i)->GetFloat(); + + n /= arp->size(); + } // endif size + + } else { + PUSH_WARNING("First argument target is not an array"); + } // endif jvp + + } else { + *error = 1; + n = -1.0; + } // end of CheckMemory + + if (g->N) { + // Keep result of constant function + double *np = (double*)PlugSubAlloc(g, NULL, sizeof(double)); + *np = n; + g->Activityp = (PACTIVITY)np; + } // endif const_item + + return n; +} // end of jsonavg_real + +void jsonavg_real_deinit(UDF_INIT* initid) +{ + JsonFreeMem((PGLOBAL)initid->ptr); +} // end of jsonavg_real_deinit + /*********************************************************************************/ /* Make a Json Object containing all the parameters. */ /*********************************************************************************/ -my_bool json_object_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool json_make_object_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; CalcLen(args, true, reslen, memlen); return JsonInit(initid, args, message, false, reslen, memlen); -} // end of json_object_init +} // end of json_make_object_init -char *json_object(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) +char *json_make_object(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2114,12 +2370,12 @@ char *json_object(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = strlen(str); return str; -} // end of json_object +} // end of json_make_object -void json_object_deinit(UDF_INIT* initid) +void json_make_object_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of json_object_deinit +} // end of json_make_object_deinit /*********************************************************************************/ /* Make a Json Object containing all not null parameters. */ @@ -2252,7 +2508,8 @@ my_bool json_object_add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) char *json_object_add(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *error) { - char *key, *str = NULL; + PCSZ key; + char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; if (g->Xchk) { @@ -2357,7 +2614,7 @@ char *json_object_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, } // endif Xchk if (!CheckMemory(g, initid, args, 1, false, true, true)) { - char *key; + PCSZ key; PJOB jobp; PJSON jsp, top; PJVAL jvp = MakeValue(g, args, 0, &top); @@ -2433,7 +2690,7 @@ char *json_object_list(UDF_INIT *initid, UDF_ARGS *args, char *result, PJSON jsp; PJVAL jvp = MakeValue(g, args, 0); - if ((p = jvp->GetString())) { + if ((p = jvp->GetString(g))) { if (!(jsp = ParseJson(g, p, strlen(p)))) { PUSH_WARNING(g->Message); return NULL; @@ -2817,7 +3074,7 @@ char *json_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result, } else jvp = MakeValue(g, args, 0); - if ((p = jvp->GetString())) { + if ((p = jvp->GetString(g))) { if (!(jsp = ParseJson(g, p, strlen(p)))) { PUSH_WARNING(g->Message); return NULL; @@ -2913,7 +3170,6 @@ char *jsonget_string(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *) { char *p, *path, *str = NULL; - int rc; PJSON jsp; PJSNX jsx; PJVAL jvp; @@ -2921,68 +3177,65 @@ char *jsonget_string(UDF_INIT *initid, UDF_ARGS *args, char *result, if (g->N) { str = (char*)g->Activityp; - goto fin; + goto err; } else if (initid->const_item) g->N = 1; - // Save stack and allocation environment and prepare error return - if (g->jump_level == MAX_JUMP) { - PUSH_WARNING(MSG(TOO_MANY_JUMPS)); - *is_null = 1; - return NULL; - } // endif jump_level + try { + if (!g->Xchk) { + if (CheckMemory(g, initid, args, 1, true)) { + PUSH_WARNING("CheckMemory error"); + goto err; + } else + jvp = MakeValue(g, args, 0); + + if ((p = jvp->GetString(g))) { + if (!(jsp = ParseJson(g, p, strlen(p)))) { + PUSH_WARNING(g->Message); + goto err; + } // endif jsp + + } else + jsp = jvp->GetJson(); + + if (g->Mrr) { // First argument is a constant + g->Xchk = jsp; + JsonMemSave(g); + } // endif Mrr + + } else + jsp = (PJSON)g->Xchk; + + path = MakePSZ(g, args, 1); + jsx = new(g) JSNX(g, jsp, TYPE_STRING, initid->max_length); + + if (jsx->SetJpath(g, path)) { + PUSH_WARNING(g->Message); + goto err; + } // endif SetJpath + + jsx->ReadValue(g); + + if (!jsx->GetValue()->IsNull()) + str = jsx->GetValue()->GetCharValue(); + + if (initid->const_item) + // Keep result of constant function + g->Activityp = (PACTIVITY)str; + + } catch (int n) { + if (trace) + htrc("Exception %d: %s\n", n, g->Message); - if ((rc= setjmp(g->jumper[++g->jump_level])) != 0) { PUSH_WARNING(g->Message); str = NULL; - goto err; - } // endif rc - - if (!g->Xchk) { - if (CheckMemory(g, initid, args, 1, true)) { - PUSH_WARNING("CheckMemory error"); - goto err; - } else - jvp = MakeValue(g, args, 0); - - if ((p = jvp->GetString())) { - if (!(jsp = ParseJson(g, p, strlen(p)))) { - PUSH_WARNING(g->Message); - goto err; - } // endif jsp - - } else - jsp = jvp->GetJson(); - - if (g->Mrr) { // First argument is a constant - g->Xchk = jsp; - JsonMemSave(g); - } // endif Mrr - - } else - jsp = (PJSON)g->Xchk; - - path = MakePSZ(g, args, 1); - jsx = new(g) JSNX(g, jsp, TYPE_STRING, initid->max_length); - - if (jsx->SetJpath(g, path)) { + } catch (const char *msg) { + strcpy(g->Message, msg); PUSH_WARNING(g->Message); - goto err; - } // endif SetJpath - - jsx->ReadValue(g); - - if (!jsx->GetValue()->IsNull()) - str = jsx->GetValue()->GetCharValue(); - - if (initid->const_item) - // Keep result of constant function - g->Activityp = (PACTIVITY)str; + str = NULL; + } // end catch err: - g->jump_level--; - - fin: if (!str) { *is_null = 1; *res_length = 0; @@ -3023,7 +3276,7 @@ my_bool jsonget_int_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jsonget_int_init long long jsonget_int(UDF_INIT *initid, UDF_ARGS *args, - char *is_null, char *error) + char *is_null, char *error) { char *p, *path; long long n; @@ -3051,7 +3304,7 @@ long long jsonget_int(UDF_INIT *initid, UDF_ARGS *args, } else jvp = MakeValue(g, args, 0); - if ((p = jvp->GetString())) { + if ((p = jvp->GetString(g))) { if (!(jsp = ParseJson(g, p, strlen(p)))) { PUSH_WARNING(g->Message); if (g->Mrr) *error = 1; @@ -3166,7 +3419,7 @@ double jsonget_real(UDF_INIT *initid, UDF_ARGS *args, } else jvp = MakeValue(g, args, 0); - if ((p = jvp->GetString())) { + if ((p = jvp->GetString(g))) { if (!(jsp = ParseJson(g, p, strlen(p)))) { PUSH_WARNING(g->Message); *is_null = 1; @@ -3253,7 +3506,7 @@ char *jsonlocate(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *error) { char *p, *path = NULL; - int k, rc; + int k; PJVAL jvp, jvp2; PJSON jsp; PJSNX jsx; @@ -3273,61 +3526,59 @@ char *jsonlocate(UDF_INIT *initid, UDF_ARGS *args, char *result, } else if (initid->const_item) g->N = 1; - // Save stack and allocation environment and prepare error return - if (g->jump_level == MAX_JUMP) { - PUSH_WARNING(MSG(TOO_MANY_JUMPS)); - *error = 1; - *is_null = 1; - return NULL; - } // endif jump_level + try { + if (!g->Xchk) { + if (CheckMemory(g, initid, args, 1, !g->Xchk)) { + PUSH_WARNING("CheckMemory error"); + *error = 1; + goto err; + } else + jvp = MakeValue(g, args, 0); + + if ((p = jvp->GetString(g))) { + if (!(jsp = ParseJson(g, p, strlen(p)))) { + PUSH_WARNING(g->Message); + goto err; + } // endif jsp + + } else + jsp = jvp->GetJson(); + + if (g->Mrr) { // First argument is a constant + g->Xchk = jsp; + JsonMemSave(g); + } // endif Mrr + + } else + jsp = (PJSON)g->Xchk; + + // The item to locate + jvp2 = MakeValue(g, args, 1); + + k = (args->arg_count > 2) ? (int)*(long long*)args->args[2] : 1; + + jsx = new(g) JSNX(g, jsp, TYPE_STRING); + path = jsx->Locate(g, jsp, jvp2, k); + + if (initid->const_item) + // Keep result of constant function + g->Activityp = (PACTIVITY)path; + + } catch (int n) { + if (trace) + htrc("Exception %d: %s\n", n, g->Message); - if ((rc= setjmp(g->jumper[++g->jump_level])) != 0) { PUSH_WARNING(g->Message); *error = 1; path = NULL; - goto err; - } // endif rc - - if (!g->Xchk) { - if (CheckMemory(g, initid, args, 1, !g->Xchk)) { - PUSH_WARNING("CheckMemory error"); - *error = 1; - goto err; - } else - jvp = MakeValue(g, args, 0); - - if ((p = jvp->GetString())) { - if (!(jsp = ParseJson(g, p, strlen(p)))) { - PUSH_WARNING(g->Message); - goto err; - } // endif jsp - - } else - jsp = jvp->GetJson(); - - if (g->Mrr) { // First argument is a constant - g->Xchk = jsp; - JsonMemSave(g); - } // endif Mrr - - } else - jsp = (PJSON)g->Xchk; - - // The item to locate - jvp2 = MakeValue(g, args, 1); - - k = (args->arg_count > 2) ? (int)*(long long*)args->args[2] : 1; - - jsx = new(g) JSNX(g, jsp, TYPE_STRING); - path = jsx->Locate(g, jsp, jvp2, k); - - if (initid->const_item) - // Keep result of constant function - g->Activityp = (PACTIVITY)path; + } catch (const char *msg) { + strcpy(g->Message, msg); + PUSH_WARNING(g->Message); + *error = 1; + path = NULL; + } // end catch err: - g->jump_level--; - if (!path) { *res_length = 0; *is_null = 1; @@ -3378,7 +3629,7 @@ char *json_locate_all(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *error) { char *p, *path = NULL; - int rc, mx = 10; + int mx = 10; PJVAL jvp, jvp2; PJSON jsp; PJSNX jsx; @@ -3399,62 +3650,60 @@ char *json_locate_all(UDF_INIT *initid, UDF_ARGS *args, char *result, } else if (initid->const_item) g->N = 1; - // Save stack and allocation environment and prepare error return - if (g->jump_level == MAX_JUMP) { - PUSH_WARNING(MSG(TOO_MANY_JUMPS)); - *error = 1; - *is_null = 1; - return NULL; - } // endif jump_level + try { + if (!g->Xchk) { + if (CheckMemory(g, initid, args, 1, true)) { + PUSH_WARNING("CheckMemory error"); + *error = 1; + goto err; + } else + jvp = MakeValue(g, args, 0); + + if ((p = jvp->GetString(g))) { + if (!(jsp = ParseJson(g, p, strlen(p)))) { + PUSH_WARNING(g->Message); + goto err; + } // endif jsp + + } else + jsp = jvp->GetJson(); + + if (g->Mrr) { // First argument is a constant + g->Xchk = jsp; + JsonMemSave(g); + } // endif Mrr + + } else + jsp = (PJSON)g->Xchk; + + // The item to locate + jvp2 = MakeValue(g, args, 1); + + if (args->arg_count > 2) + mx = (int)*(long long*)args->args[2]; + + jsx = new(g) JSNX(g, jsp, TYPE_STRING); + path = jsx->LocateAll(g, jsp, jvp2, mx); + + if (initid->const_item) + // Keep result of constant function + g->Activityp = (PACTIVITY)path; + + } catch (int n) { + if (trace) + htrc("Exception %d: %s\n", n, g->Message); - if ((rc= setjmp(g->jumper[++g->jump_level])) != 0) { PUSH_WARNING(g->Message); *error = 1; path = NULL; - goto err; - } // endif rc - - if (!g->Xchk) { - if (CheckMemory(g, initid, args, 1, true)) { - PUSH_WARNING("CheckMemory error"); - *error = 1; - goto err; - } else - jvp = MakeValue(g, args, 0); - - if ((p = jvp->GetString())) { - if (!(jsp = ParseJson(g, p, strlen(p)))) { - PUSH_WARNING(g->Message); - goto err; - } // endif jsp - - } else - jsp = jvp->GetJson(); - - if (g->Mrr) { // First argument is a constant - g->Xchk = jsp; - JsonMemSave(g); - } // endif Mrr - - } else - jsp = (PJSON)g->Xchk; - - // The item to locate - jvp2 = MakeValue(g, args, 1); - - if (args->arg_count > 2) - mx = (int)*(long long*)args->args[2]; - - jsx = new(g) JSNX(g, jsp, TYPE_STRING); - path = jsx->LocateAll(g, jsp, jvp2, mx); - - if (initid->const_item) - // Keep result of constant function - g->Activityp = (PACTIVITY)path; + } catch (const char *msg) { + strcpy(g->Message, msg); + PUSH_WARNING(g->Message); + *error = 1; + path = NULL; + } // end catch err: - g->jump_level--; - if (!path) { *res_length = 0; *is_null = 1; @@ -3582,7 +3831,7 @@ long long jsoncontains_path(UDF_INIT *initid, UDF_ARGS *args, char *result, } else jvp = MakeValue(g, args, 0); - if ((p = jvp->GetString())) { + if ((p = jvp->GetString(g))) { if (!(jsp = ParseJson(g, p, strlen(p)))) { PUSH_WARNING(g->Message); goto err; @@ -3632,11 +3881,11 @@ void jsoncontains_path_deinit(UDF_INIT* initid) /*********************************************************************************/ /* This function is used by the json_set/insert/update_item functions. */ /*********************************************************************************/ -static char *handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *error) { char *p, *path, *str = NULL; - int w, rc; + int w; my_bool b = true; PJSON jsp; PJSNX jsx; @@ -3658,78 +3907,74 @@ static char *handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, w = 2; else { PUSH_WARNING("Logical error, please contact CONNECT developer"); - goto err; + goto fin; } // endelse - // Save stack and allocation environment and prepare error return - if (g->jump_level == MAX_JUMP) { - PUSH_WARNING(MSG(TOO_MANY_JUMPS)); - *error = 1; - goto fin; - } // endif jump_level + try { + if (!g->Xchk) { + if (CheckMemory(g, initid, args, 1, true, false, true)) { + PUSH_WARNING("CheckMemory error"); + throw 1; + } else + jvp = MakeValue(g, args, 0); + + if ((p = jvp->GetString(g))) { + if (!(jsp = ParseJson(g, p, strlen(p)))) { + throw 2; + } // endif jsp + + } else + jsp = jvp->GetJson(); + + if (g->Mrr) { // First argument is a constant + g->Xchk = jsp; + JsonMemSave(g); + } // endif Mrr + + } else + jsp = (PJSON)g->Xchk; + + jsx = new(g)JSNX(g, jsp, TYPE_STRING, initid->max_length, 0, true); + + for (uint i = 1; i + 1 < args->arg_count; i += 2) { + jvp = MakeValue(gb, args, i); + path = MakePSZ(g, args, i + 1); + + if (jsx->SetJpath(g, path, false)) { + PUSH_WARNING(g->Message); + continue; + } // endif SetJpath + + if (w) { + jsx->ReadValue(g); + b = jsx->GetValue()->IsNull(); + b = (w == 1) ? b : !b; + } // endif w + + if (b && jsx->WriteValue(gb, jvp)) + PUSH_WARNING(g->Message); + + } // endfor i + + // In case of error or file, return unchanged argument + if (!(str = MakeResult(g, args, jsp, INT_MAX32))) + str = MakePSZ(g, args, 0); + + if (g->N) + // Keep result of constant function + g->Activityp = (PACTIVITY)str; + + } catch (int n) { + if (trace) + htrc("Exception %d: %s\n", n, g->Message); - if ((rc= setjmp(g->jumper[++g->jump_level])) != 0) { PUSH_WARNING(g->Message); str = NULL; - goto err; - } // endif rc - - if (!g->Xchk) { - if (CheckMemory(g, initid, args, 1, true, false, true)) { - PUSH_WARNING("CheckMemory error"); - goto err; - } else - jvp = MakeValue(g, args, 0); - - if ((p = jvp->GetString())) { - if (!(jsp = ParseJson(g, p, strlen(p)))) { - PUSH_WARNING(g->Message); - goto err; - } // endif jsp - - } else - jsp = jvp->GetJson(); - - if (g->Mrr) { // First argument is a constant - g->Xchk = jsp; - JsonMemSave(g); - } // endif Mrr - - } else - jsp = (PJSON)g->Xchk; - - jsx = new(g)JSNX(g, jsp, TYPE_STRING, initid->max_length, 0, true); - - for (uint i = 1; i+1 < args->arg_count; i += 2) { - jvp = MakeValue(gb, args, i); - path = MakePSZ(g, args, i+1); - - if (jsx->SetJpath(g, path, false)) { - PUSH_WARNING(g->Message); - continue; - } // endif SetJpath - - if (w) { - jsx->ReadValue(g); - b = jsx->GetValue()->IsNull(); - b = (w == 1) ? b : !b; - } // endif w - - if (b && jsx->WriteValue(gb, jvp)) - PUSH_WARNING(g->Message); - - } // endfor i - - // In case of error or file, return unchanged argument - if (!(str = MakeResult(g, args, jsp, INT_MAX32))) - str = MakePSZ(g, args, 0); - - if (g->N) - // Keep result of constant function - g->Activityp = (PACTIVITY)str; - -err: - g->jump_level--; + } catch (const char *msg) { + strcpy(g->Message, msg); + PUSH_WARNING(g->Message); + str = NULL; + } // end catch fin: if (!str) { @@ -4009,14 +4254,14 @@ char *jfile_make(UDF_INIT *initid, UDF_ARGS *args, char *result, } else jvp = MakeValue(g, args, 0); - if ((p = jvp->GetString())) { + if ((p = jvp->GetString(g))) { if (!strchr("[{ \t\r\n", *p)) { // Is this a file name? if (!(p = GetJsonFile(g, p))) { PUSH_WARNING(g->Message); goto fin; } else - fn = jvp->GetString(); + fn = jvp->GetString(g); } // endif p @@ -4159,7 +4404,7 @@ char *jbin_array_add_values(UDF_INIT *initid, UDF_ARGS *args, char *result, PJVAL jvp = MakeValue(g, args, 0, &top); PGLOBAL gb = GetMemPtr(g, args, 0); - if ((p = jvp->GetString())) { + if ((p = jvp->GetString(g))) { if (!(top = ParseJson(g, p, strlen(p)))) { PUSH_WARNING(g->Message); return NULL; @@ -4556,7 +4801,7 @@ char *jbin_object_add(UDF_INIT *initid, UDF_ARGS *args, char *result, } // endif bsp if (!CheckMemory(g, initid, args, 2, false, true, true)) { - char *key; + PCSZ key; PJOB jobp; PJVAL jvp = MakeValue(g, args, 0, &top); PJSON jsp = jvp->GetJson(); @@ -4636,7 +4881,7 @@ char *jbin_object_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, } // endif bsp if (!CheckMemory(g, initid, args, 1, false, true, true)) { - char *key; + PCSZ key; PJOB jobp; PJVAL jvp = MakeValue(g, args, 0, &top); PJSON jsp = jvp->GetJson(); @@ -4697,7 +4942,7 @@ char *jbin_object_list(UDF_INIT *initid, UDF_ARGS *args, char *result, PJSON jsp; PJVAL jvp = MakeValue(g, args, 0); - if ((p = jvp->GetString())) { + if ((p = jvp->GetString(g))) { if (!(jsp = ParseJson(g, p, strlen(p)))) { PUSH_WARNING(g->Message); return NULL; @@ -4768,7 +5013,7 @@ char *jbin_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result, } else jvp = MakeValue(g, args, 0); - if ((p = jvp->GetString())) { + if ((p = jvp->GetString(g))) { if (!(jsp = ParseJson(g, p, strlen(p)))) { PUSH_WARNING(g->Message); goto fin; @@ -4905,7 +5150,7 @@ void jbin_item_merge_deinit(UDF_INIT* initid) /*********************************************************************************/ /* This function is used by the jbin_set/insert/update functions. */ /*********************************************************************************/ -static char *bin_handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *bin_handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *error) { char *p, *path; @@ -4942,7 +5187,7 @@ static char *bin_handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, } else jvp = MakeValue(g, args, 0); - if ((p = jvp->GetString())) { + if ((p = jvp->GetString(g))) { if (!(jsp = ParseJson(g, p, strlen(p)))) { PUSH_WARNING(g->Message); goto fin; @@ -5320,4 +5565,3 @@ long long countin(UDF_INIT *initid, UDF_ARGS *args, char *result, free(str2); return n; } // end of countin - diff --git a/storage/connect/jsonudf.h b/storage/connect/jsonudf.h index d2890421c62..cd3b9768f7a 100644 --- a/storage/connect/jsonudf.h +++ b/storage/connect/jsonudf.h @@ -1,7 +1,7 @@ /******************** tabjson H Declares Source Code File (.H) *******************/ -/* Name: jsonudf.h Version 1.2 */ +/* Name: jsonudf.h Version 1.3 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2015 */ +/* (C) Copyright to the author Olivier BERTRAND 2015-2017 */ /* */ /* This file contains the JSON UDF function and class declares. */ /*********************************************************************************/ @@ -37,9 +37,9 @@ extern "C" { DllExport char *jsonvalue(UDF_EXEC_ARGS); DllExport void jsonvalue_deinit(UDF_INIT*); - DllExport my_bool json_array_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *json_array(UDF_EXEC_ARGS); - DllExport void json_array_deinit(UDF_INIT*); + DllExport my_bool json_make_array_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *json_make_array(UDF_EXEC_ARGS); + DllExport void json_make_array_deinit(UDF_INIT*); DllExport my_bool json_array_add_values_init(UDF_INIT*, UDF_ARGS*, char*); DllExport char *json_array_add_values(UDF_EXEC_ARGS); @@ -53,9 +53,21 @@ extern "C" { DllExport char *json_array_delete(UDF_EXEC_ARGS); DllExport void json_array_delete_deinit(UDF_INIT*); - DllExport my_bool json_object_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *json_object(UDF_EXEC_ARGS); - DllExport void json_object_deinit(UDF_INIT*); + DllExport my_bool jsonsum_int_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport long long jsonsum_int(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport void jsonsum_int_deinit(UDF_INIT*); + + DllExport my_bool jsonsum_real_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport double jsonsum_real(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport void jsonsum_real_deinit(UDF_INIT*); + + DllExport my_bool jsonavg_real_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport double jsonavg_real(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport void jsonavg_real_deinit(UDF_INIT*); + + DllExport my_bool json_make_object_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *json_make_object(UDF_EXEC_ARGS); + DllExport void json_make_object_deinit(UDF_INIT*); DllExport my_bool json_object_nonull_init(UDF_INIT*, UDF_ARGS*, char*); DllExport char *json_object_nonull(UDF_EXEC_ARGS); @@ -232,7 +244,7 @@ extern "C" { /*********************************************************************************/ typedef struct _jpn { enum JTYP Type; - PSZ Key; + PCSZ Key; int N; } JPN, *PJPN; diff --git a/storage/connect/libdoc.cpp b/storage/connect/libdoc.cpp index 2470d37c353..700d247da38 100644 --- a/storage/connect/libdoc.cpp +++ b/storage/connect/libdoc.cpp @@ -68,9 +68,9 @@ class LIBXMLDOC : public XMLDOCUMENT { virtual void SetNofree(bool b) {Nofreelist = b;} // Methods - virtual bool Initialize(PGLOBAL g, char *entry, bool zipped); + virtual bool Initialize(PGLOBAL g, PCSZ entry, bool zipped); virtual bool ParseFile(PGLOBAL g, char *fn); - virtual bool NewDoc(PGLOBAL g, char *ver); + virtual bool NewDoc(PGLOBAL g, PCSZ ver); virtual void AddComment(PGLOBAL g, char *com); virtual PXNODE GetRoot(PGLOBAL g); virtual PXNODE NewRoot(PGLOBAL g, char *name); @@ -119,9 +119,9 @@ class XML2NODE : public XMLNODE { virtual PXLIST SelectNodes(PGLOBAL g, char *xp, PXLIST lp); virtual PXNODE SelectSingleNode(PGLOBAL g, char *xp, PXNODE np); virtual PXATTR GetAttribute(PGLOBAL g, char *name, PXATTR ap); - virtual PXNODE AddChildNode(PGLOBAL g, char *name, PXNODE np); + virtual PXNODE AddChildNode(PGLOBAL g, PCSZ name, PXNODE np); virtual PXATTR AddProperty(PGLOBAL g, char *name, PXATTR ap); - virtual void AddText(PGLOBAL g, char *txtp); + virtual void AddText(PGLOBAL g, PCSZ txtp); virtual void DeleteChild(PGLOBAL g, PXNODE dnp); protected: @@ -373,7 +373,7 @@ LIBXMLDOC::LIBXMLDOC(char *nsl, char *nsdf, char *enc, PFBLOCK fp) /******************************************************************/ /* Initialize XML parser and check library compatibility. */ /******************************************************************/ -bool LIBXMLDOC::Initialize(PGLOBAL g, char *entry, bool zipped) +bool LIBXMLDOC::Initialize(PGLOBAL g, PCSZ entry, bool zipped) { if (zipped && InitZip(g, entry)) return true; @@ -434,7 +434,7 @@ PFBLOCK LIBXMLDOC::LinkXblock(PGLOBAL g, MODE m, int rc, char *fn) /******************************************************************/ /* Construct and add the XML processing instruction node. */ /******************************************************************/ -bool LIBXMLDOC::NewDoc(PGLOBAL g, char *ver) +bool LIBXMLDOC::NewDoc(PGLOBAL g, PCSZ ver) { if (trace) htrc("NewDoc\n"); @@ -863,14 +863,13 @@ RCODE XML2NODE::GetContent(PGLOBAL g, char *buf, int len) xmlFree(Content); if ((Content = xmlNodeGetContent(Nodep))) { - char *extra = " \t\r\n"; char *p1 = (char*)Content, *p2 = buf; bool b = false; // Copy content eliminating extra characters for (; *p1; p1++) if ((p2 - buf) < len) { - if (strchr(extra, *p1)) { + if (strchr(" \t\r\n", *p1)) { if (b) { // This to have one blank between sub-nodes *p2++ = ' '; @@ -1020,19 +1019,19 @@ PXATTR XML2NODE::GetAttribute(PGLOBAL g, char *name, PXATTR ap) /******************************************************************/ /* Add a new child node to this node and return it. */ /******************************************************************/ -PXNODE XML2NODE::AddChildNode(PGLOBAL g, char *name, PXNODE np) +PXNODE XML2NODE::AddChildNode(PGLOBAL g, PCSZ name, PXNODE np) { - char *p, *pn, *pf = NULL; + char *p, *pn, *pf = NULL, *nmp = PlugDup(g, name); if (trace) htrc("AddChildNode: %s\n", name); // Is a prefix specified - if ((pn = strchr(name, ':'))) { - pf = name; + if ((pn = strchr(nmp, ':'))) { + pf = nmp; *pn++ = '\0'; // Separate name from prefix } else - pn = name; + pn = nmp; // If name has the format m[n] only m is taken as node name if ((p = strchr(pn, '['))) @@ -1096,7 +1095,7 @@ PXATTR XML2NODE::AddProperty(PGLOBAL g, char *name, PXATTR ap) /******************************************************************/ /* Add a new text node to this node. */ /******************************************************************/ -void XML2NODE::AddText(PGLOBAL g, char *txtp) +void XML2NODE::AddText(PGLOBAL g, PCSZ txtp) { if (trace) htrc("AddText: %s\n", txtp); diff --git a/storage/connect/macutil.cpp b/storage/connect/macutil.cpp index f5d3bb11fe9..b9600bdac2e 100644 --- a/storage/connect/macutil.cpp +++ b/storage/connect/macutil.cpp @@ -192,7 +192,7 @@ bool MACINFO::GetOneInfo(PGLOBAL g, int flag, void *v, int lv) case 23: break; default: - p = ""; + p = PlugDup(g, ""); } // endswitch flag } else switch (flag) { diff --git a/storage/connect/mongo.cpp b/storage/connect/mongo.cpp new file mode 100644 index 00000000000..12f2f428112 --- /dev/null +++ b/storage/connect/mongo.cpp @@ -0,0 +1,372 @@ +/************** mongo C++ Program Source Code File (.CPP) **************/ +/* PROGRAM NAME: mongo Version 1.0 */ +/* (C) Copyright to the author Olivier BERTRAND 2017 */ +/* These programs are the MGODEF class execution routines. */ +/***********************************************************************/ + +/***********************************************************************/ +/* Include relevant sections of the MariaDB header file. */ +/***********************************************************************/ +#include + +/***********************************************************************/ +/* Include application header files: */ +/* global.h is header containing all global declarations. */ +/* plgdbsem.h is header containing the DB application declarations. */ +/***********************************************************************/ +#include "global.h" +#include "plgdbsem.h" +#include "xtable.h" +#include "tabext.h" +#if defined(CMGO_SUPPORT) +#include "tabcmg.h" +#endif // MONGO_SUPPORT +#if defined(JDBC_SUPPORT) +#include "tabjmg.h" +#endif // JDBC_SUPPORT +#include "resource.h" + +/***********************************************************************/ +/* This should be an option. */ +/***********************************************************************/ +#define MAXCOL 200 /* Default max column nb in result */ +#define TYPE_UNKNOWN 12 /* Must be greater than other types */ + +bool IsNum(PSZ s); + +/***********************************************************************/ +/* MGOColumns: construct the result blocks containing the description */ +/* of all the columns of a document contained inside MongoDB. */ +/***********************************************************************/ +PQRYRES MGOColumns(PGLOBAL g, PCSZ db, PCSZ uri, PTOS topt, bool info) +{ + static int buftyp[] = {TYPE_STRING, TYPE_SHORT, TYPE_STRING, TYPE_INT, + TYPE_INT, TYPE_SHORT, TYPE_SHORT, TYPE_STRING}; + static XFLD fldtyp[] = {FLD_NAME, FLD_TYPE, FLD_TYPENAME, FLD_PREC, + FLD_LENGTH, FLD_SCALE, FLD_NULL, FLD_FORMAT}; + unsigned int length[] = {0, 6, 8, 10, 10, 6, 6, 0}; + int ncol = sizeof(buftyp) / sizeof(int); + int i, n = 0; + PCSZ drv; + PBCOL bcp; + MGODISC *cmgd; + PQRYRES qrp; + PCOLRES crp; + + if (info) { + length[0] = 128; + length[7] = 256; + goto skipit; + } // endif info + + /*********************************************************************/ + /* Open MongoDB. */ + /*********************************************************************/ + drv = GetStringTableOption(g, topt, "Driver", NULL); + + if (drv && toupper(*drv) == 'C') { +#if defined(CMGO_SUPPORT) + cmgd = new(g) CMGDISC(g, (int*)length); +#else + sprintf(g->Message, "Mongo %s Driver not available", "C"); + goto err; +#endif + } else if (drv && toupper(*drv) == 'J') { +#if defined(JDBC_SUPPORT) + cmgd = new(g) JMGDISC(g, (int*)length); +#else + sprintf(g->Message, "Mongo %s Driver not available", "Java"); + goto err; +#endif + } else { // Driver not specified +#if defined(CMGO_SUPPORT) + cmgd = new(g) CMGDISC(g, (int*)length); +#else + cmgd = new(g) JMGDISC(g, (int*)length); +#endif + } // endif drv + + if ((n = cmgd->GetColumns(g, db, uri, topt)) < 0) + goto err; + +skipit: + if (trace) + htrc("MGOColumns: n=%d len=%d\n", n, length[0]); + + /*********************************************************************/ + /* Allocate the structures used to refer to the result set. */ + /*********************************************************************/ + qrp = PlgAllocResult(g, ncol, n, IDS_COLUMNS + 3, + buftyp, fldtyp, length, false, false); + + crp = qrp->Colresp->Next->Next->Next->Next->Next->Next; + crp->Name = "Nullable"; + crp->Next->Name = "Bpath"; + + if (info || !qrp) + return qrp; + + qrp->Nblin = n; + + /*********************************************************************/ + /* Now get the results into blocks. */ + /*********************************************************************/ + for (i = 0, bcp = cmgd->fbcp; bcp; i++, bcp = bcp->Next) { + if (bcp->Type == TYPE_UNKNOWN) // Void column + bcp->Type = TYPE_STRING; + + crp = qrp->Colresp; // Column Name + crp->Kdata->SetValue(bcp->Name, i); + crp = crp->Next; // Data Type + crp->Kdata->SetValue(bcp->Type, i); + crp = crp->Next; // Type Name + crp->Kdata->SetValue(GetTypeName(bcp->Type), i); + crp = crp->Next; // Precision + crp->Kdata->SetValue(bcp->Len, i); + crp = crp->Next; // Length + crp->Kdata->SetValue(bcp->Len, i); + crp = crp->Next; // Scale (precision) + crp->Kdata->SetValue(bcp->Scale, i); + crp = crp->Next; // Nullable + crp->Kdata->SetValue(bcp->Cbn ? 1 : 0, i); + crp = crp->Next; // Field format + + if (crp->Kdata) + crp->Kdata->SetValue(bcp->Fmt, i); + + } // endfor i + + /*********************************************************************/ + /* Return the result pointer. */ + /*********************************************************************/ + return qrp; + +err: + if (cmgd->tmgp) + cmgd->tmgp->CloseDB(g); + + return NULL; +} // end of MGOColumns + +/***********************************************************************/ +/* Class used to get the columns of a mongo collection. */ +/***********************************************************************/ +MGODISC::MGODISC(PGLOBAL g, int *lg) { + length = lg; + fbcp = NULL; + pbcp = NULL; + tmgp = NULL; + drv = NULL; + i = ncol = lvl = 0; + all = false; +} // end of MGODISC constructor + +/***********************************************************************/ +/* Class used to get the columns of a mongo collection. */ +/***********************************************************************/ +int MGODISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ uri, PTOS topt) +{ + PCSZ level = GetStringTableOption(g, topt, "Level", NULL); + PMGODEF tdp; + + if (level) { + lvl = atoi(level); + lvl = (lvl > 16) ? 16 : lvl; + } else + lvl = 0; + + all = GetBooleanTableOption(g, topt, "Fullarray", false); + + /*********************************************************************/ + /* Open the MongoDB collection. */ + /*********************************************************************/ + tdp = new(g) MGODEF; + tdp->Uri = uri; + tdp->Driver = drv; + tdp->Tabname = GetStringTableOption(g, topt, "Name", NULL); + tdp->Tabname = GetStringTableOption(g, topt, "Tabname", tdp->Tabname); + tdp->Tabschema = GetStringTableOption(g, topt, "Dbname", db); + tdp->Base = GetIntegerTableOption(g, topt, "Base", 0) ? 1 : 0; + tdp->Colist = GetStringTableOption(g, topt, "Colist", "all"); + tdp->Filter = GetStringTableOption(g, topt, "Filter", NULL); + tdp->Pipe = GetBooleanTableOption(g, topt, "Pipeline", false); + tdp->Version = GetIntegerTableOption(g, topt, "Version", 3); + tdp->Wrapname = (PSZ)GetStringTableOption(g, topt, "Wrapper", + (tdp->Version == 2) ? "Mongo2Interface" : "Mongo3Interface"); + + if (trace) + htrc("Uri %s coll=%s db=%s colist=%s filter=%s lvl=%d\n", + tdp->Uri, tdp->Tabname, tdp->Tabschema, tdp->Colist, tdp->Filter, lvl); + + tmgp = tdp->GetTable(g, MODE_READ); + tmgp->SetMode(MODE_READ); + + if (tmgp->OpenDB(g)) + return -1; + + bcol.Next = NULL; + bcol.Name = bcol.Fmt = NULL; + bcol.Type = TYPE_UNKNOWN; + bcol.Len = bcol.Scale = 0; + bcol.Found = true; + bcol.Cbn = false; + + if (Init(g)) + return -1; + + /*********************************************************************/ + /* Analyse the BSON tree and define columns. */ + /*********************************************************************/ + for (i = 1; ; i++) { + switch (tmgp->ReadDB(g)) { + case RC_EF: + return ncol; + case RC_FX: + return -1; + default: + GetDoc(); + } // endswitch ReadDB + + if (Find(g)) + return -1; + + // Missing columns can be null + for (bcp = fbcp; bcp; bcp = bcp->Next) { + bcp->Cbn |= !bcp->Found; + bcp->Found = false; + } // endfor bcp + + } // endfor i + + return ncol; +} // end of GetColumns + +/***********************************************************************/ +/* Add a new column in the column list. */ +/***********************************************************************/ +void MGODISC::AddColumn(PGLOBAL g, PCSZ colname, PCSZ fmt, int k) +{ + // Check whether this column was already found + for (bcp = fbcp; bcp; bcp = bcp->Next) + if (!strcmp(colname, bcp->Name)) + break; + + if (bcp) { + if (bcp->Type != bcol.Type) + bcp->Type = TYPE_STRING; + + if (k && *fmt && (!bcp->Fmt || strlen(bcp->Fmt) < strlen(fmt))) { + bcp->Fmt = PlugDup(g, fmt); + length[7] = MY_MAX(length[7], (signed)strlen(fmt)); + } // endif *fmt + + bcp->Len = MY_MAX(bcp->Len, bcol.Len); + bcp->Scale = MY_MAX(bcp->Scale, bcol.Scale); + bcp->Cbn |= bcol.Cbn; + bcp->Found = true; + } else { + // New column + bcp = (PBCOL)PlugSubAlloc(g, NULL, sizeof(BCOL)); + *bcp = bcol; + bcp->Cbn |= (i > 1); + bcp->Name = PlugDup(g, colname); + length[0] = MY_MAX(length[0], (signed)strlen(colname)); + + if (k) { + bcp->Fmt = PlugDup(g, fmt); + length[7] = MY_MAX(length[7], (signed)strlen(fmt)); + } else + bcp->Fmt = NULL; + + if (pbcp) { + bcp->Next = pbcp->Next; + pbcp->Next = bcp; + } else + fbcp = bcp; + + ncol++; + } // endif jcp + + pbcp = bcp; +} // end of AddColumn + +/* -------------------------- Class MGODEF --------------------------- */ + +MGODEF::MGODEF(void) +{ + Driver = NULL; + Uri = NULL; + Colist = NULL; + Filter = NULL; + Level = 0; + Base = 0; + Version = 0; + Pipe = false; +} // end of MGODEF constructor + +/***********************************************************************/ +/* DefineAM: define specific AM block values. */ +/***********************************************************************/ +bool MGODEF::DefineAM(PGLOBAL g, LPCSTR, int poff) +{ + if (EXTDEF::DefineAM(g, "MGO", poff)) + return true; + else if (!Tabschema) + Tabschema = GetStringCatInfo(g, "Dbname", "*"); + + Driver = GetStringCatInfo(g, "Driver", NULL); + Uri = GetStringCatInfo(g, "Connect", "mongodb://localhost:27017"); + Colist = GetStringCatInfo(g, "Colist", NULL); + Filter = GetStringCatInfo(g, "Filter", NULL); + Base = GetIntCatInfo("Base", 0) ? 1 : 0; + Version = GetIntCatInfo("Version", 3); + + if (Version == 2) + Wrapname = GetStringCatInfo(g, "Wrapper", "Mongo2Interface"); + else + Wrapname = GetStringCatInfo(g, "Wrapper", "Mongo3Interface"); + + Pipe = GetBoolCatInfo("Pipeline", false); + return false; +} // end of DefineAM + +/***********************************************************************/ +/* GetTable: makes a new Table Description Block. */ +/***********************************************************************/ +PTDB MGODEF::GetTable(PGLOBAL g, MODE m) +{ + if (Driver && toupper(*Driver) == 'C') { +#if defined(CMGO_SUPPORT) + if (Catfunc == FNC_COL) + return new(g) TDBGOL(this); + else + return new(g) TDBCMG(this); +#else + sprintf(g->Message, "Mongo %s Driver not available", "C"); + return NULL; +#endif + } else if (Driver && toupper(*Driver) == 'J') { +#if defined(JDBC_SUPPORT) + if (Catfunc == FNC_COL) + return new(g) TDBJGL(this); + else + return new(g) TDBJMG(this); +#else + sprintf(g->Message, "Mongo %s Driver not available", "Java"); + return NULL; +#endif + } else { // Driver not specified +#if defined(CMGO_SUPPORT) + if (Catfunc == FNC_COL) + return new(g) TDBGOL(this); + else + return new(g) TDBCMG(this); +#else + if (Catfunc == FNC_COL) + return new(g) TDBJGL(this); + else + return new(g) TDBJMG(this); +#endif + } // endif Driver + +} // end of GetTable diff --git a/storage/connect/mongo.h b/storage/connect/mongo.h new file mode 100644 index 00000000000..af69226ea8b --- /dev/null +++ b/storage/connect/mongo.h @@ -0,0 +1,91 @@ +/**************** mongo H Declares Source Code File (.H) ***************/ +/* Name: mongo.h Version 1.0 */ +/* */ +/* (C) Copyright to the author Olivier BERTRAND 2017 */ +/* */ +/* This file contains the common MongoDB classes declares. */ +/***********************************************************************/ +#ifndef __MONGO_H +#define __MONGO_H + +#include "osutil.h" +#include "block.h" +#include "colblk.h" + +typedef class MGODEF *PMGODEF; + +typedef struct _bncol { + struct _bncol *Next; + char *Name; + char *Fmt; + int Type; + int Len; + int Scale; + bool Cbn; + bool Found; +} BCOL, *PBCOL; + +/***********************************************************************/ +/* Class used to get the columns of a mongo collection. */ +/***********************************************************************/ +class MGODISC : public BLOCK { +public: + // Constructor + MGODISC(PGLOBAL g, int *lg); + + // Methods + virtual bool Init(PGLOBAL g) { return false; } + virtual void GetDoc(void) {} + virtual bool Find(PGLOBAL g) = 0; + + // Functions + int GetColumns(PGLOBAL g, PCSZ db, PCSZ uri, PTOS topt); + void AddColumn(PGLOBAL g, PCSZ colname, PCSZ fmt, int k); + + // Members + BCOL bcol; + PBCOL bcp, fbcp, pbcp; + PMGODEF tdp; + PTDB tmgp; + PCSZ drv; + int *length; + int i, ncol, lvl; + bool all; +}; // end of MGODISC + +/***********************************************************************/ +/* MongoDB table. */ +/***********************************************************************/ +class DllExport MGODEF : public EXTDEF { /* Table description */ + friend class TDBCMG; + friend class TDBJMG; + friend class TDBGOL; + friend class TDBJGL; + friend class CMGFAM; + friend class MGODISC; + friend PQRYRES MGOColumns(PGLOBAL, PCSZ, PCSZ, PTOS, bool); +public: + // Constructor + MGODEF(void); + + // Implementation + virtual const char *GetType(void) { return "MONGO"; } + + // Methods + virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); + virtual PTDB GetTable(PGLOBAL g, MODE m); + +protected: + // Members + PCSZ Driver; /* MongoDB Driver (C or JAVA) */ + PCSZ Uri; /* MongoDB connection URI */ + PSZ Wrapname; /* Java wrapper name */ + PCSZ Colist; /* Options list */ + PCSZ Filter; /* Filtering query */ + int Level; /* Used for catalog table */ + int Base; /* The array index base */ + int Version; /* The Java driver version */ + bool Pipe; /* True is Colist is a pipeline */ +}; // end of MGODEF + +#endif // __MONGO_H diff --git a/storage/connect/msgid.h b/storage/connect/msgid.h index 0e9c036dc49..cee78aa1783 100644 --- a/storage/connect/msgid.h +++ b/storage/connect/msgid.h @@ -1,3 +1,4 @@ +/* Copyright (C) MariaDB Corporation Ab */ #define MSG_ACCESS_VIOLATN 200 #define MSG_ADD_BAD_TYPE 201 #define MSG_ALLOC_ERROR 202 diff --git a/storage/connect/mycat.cc b/storage/connect/mycat.cc index 1fcd8ac78da..23005db5272 100644 --- a/storage/connect/mycat.cc +++ b/storage/connect/mycat.cc @@ -1,4 +1,4 @@ -/* Copyright (C) Olivier Bertrand 2004 - 2017 +/* Copyright (C) MariaDB Corporation Ab This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -86,7 +86,7 @@ #if defined(JDBC_SUPPORT) #define NJDBC #include "tabjdbc.h" -#endif // ODBC_SUPPORT +#endif // JDBC_SUPPORT #if defined(PIVOT_SUPPORT) #include "tabpivot.h" #endif // PIVOT_SUPPORT @@ -96,6 +96,9 @@ #if defined(XML_SUPPORT) #include "tabxml.h" #endif // XML_SUPPORT +#if defined(MONGO_SUPPORT) +#include "mongo.h" +#endif // MONGO_SUPPORT #if defined(ZIP_SUPPORT) #include "tabzip.h" #endif // ZIP_SUPPORT @@ -130,21 +133,21 @@ TABTYPE GetTypeID(const char *type) : (!stricmp(type, "CSV")) ? TAB_CSV : (!stricmp(type, "FMT")) ? TAB_FMT : (!stricmp(type, "DBF")) ? TAB_DBF -#ifdef XML_SUPPORT +#if defined(XML_SUPPORT) : (!stricmp(type, "XML")) ? TAB_XML #endif : (!stricmp(type, "INI")) ? TAB_INI : (!stricmp(type, "VEC")) ? TAB_VEC -#ifdef ODBC_SUPPORT +#if defined(ODBC_SUPPORT) : (!stricmp(type, "ODBC")) ? TAB_ODBC #endif -#ifdef JDBC_SUPPORT +#if defined(JDBC_SUPPORT) : (!stricmp(type, "JDBC")) ? TAB_JDBC #endif : (!stricmp(type, "MYSQL")) ? TAB_MYSQL : (!stricmp(type, "MYPRX")) ? TAB_MYSQL : (!stricmp(type, "DIR")) ? TAB_DIR -#ifdef __WIN__ +#if defined(__WIN__) : (!stricmp(type, "MAC")) ? TAB_MAC : (!stricmp(type, "WMI")) ? TAB_WMI #endif @@ -153,15 +156,18 @@ TABTYPE GetTypeID(const char *type) : (!stricmp(type, "OCCUR")) ? TAB_OCCUR : (!stricmp(type, "CATLG")) ? TAB_PRX // Legacy : (!stricmp(type, "PROXY")) ? TAB_PRX -#ifdef PIVOT_SUPPORT +#if defined(PIVOT_SUPPORT) : (!stricmp(type, "PIVOT")) ? TAB_PIVOT #endif : (!stricmp(type, "VIR")) ? TAB_VIR : (!stricmp(type, "JSON")) ? TAB_JSON -#ifdef ZIP_SUPPORT +#if defined(ZIP_SUPPORT) : (!stricmp(type, "ZIP")) ? TAB_ZIP #endif - : (!stricmp(type, "OEM")) ? TAB_OEM : TAB_NIY; +#if defined(MONGO_SUPPORT) + : (!stricmp(type, "MONGO")) ? TAB_MONGO +#endif + : (!stricmp(type, "OEM")) ? TAB_OEM : TAB_NIY; } // end of GetTypeID /***********************************************************************/ @@ -307,6 +313,7 @@ int GetIndexType(TABTYPE type) case TAB_MYSQL: case TAB_ODBC: case TAB_JDBC: + case TAB_MONGO: xtyp= 2; break; case TAB_VIR: @@ -477,39 +484,6 @@ void MYCAT::Reset(void) { } // end of Reset -#if 0 -/***********************************************************************/ -/* This function sets the current database path. */ -/***********************************************************************/ -void MYCAT::SetPath(PGLOBAL g, LPCSTR *datapath, const char *path) - { - if (path) { - size_t len= strlen(path) + (*path != '.' ? 4 : 1); - char *buf= (char*)PlugSubAlloc(g, NULL, len); - - if (PlugIsAbsolutePath(path)) - { - strcpy(buf, path); - *datapath= buf; - return; - } - - if (*path != '.') { -#if defined(__WIN__) - char *s= "\\"; -#else // !__WIN__ - char *s= "/"; -#endif // !__WIN__ - strcat(strcat(strcat(strcpy(buf, "."), s), path), s); - } else - strcpy(buf, path); - - *datapath= buf; - } // endif path - - } // end of SetDataPath -#endif // 0 - /***********************************************************************/ /* GetTableDesc: retrieve a table descriptor. */ /* Look for a table descriptor matching the name and type. */ @@ -583,6 +557,9 @@ PRELDEF MYCAT::MakeTableDesc(PGLOBAL g, PTABLE tablep, LPCSTR am) #endif // PIVOT_SUPPORT case TAB_VIR: tdp= new(g) VIRDEF; break; case TAB_JSON: tdp= new(g) JSONDEF; break; +#if defined(MONGO_SUPPORT) + case TAB_MONGO: tdp = new(g) MGODEF; break; +#endif // MONGO_SUPPORT #if defined(ZIP_SUPPORT) case TAB_ZIP: tdp= new(g) ZIPDEF; break; #endif // ZIP_SUPPORT diff --git a/storage/connect/mycat.h b/storage/connect/mycat.h index a3682b31f17..f0f889722dd 100644 --- a/storage/connect/mycat.h +++ b/storage/connect/mycat.h @@ -1,4 +1,4 @@ -/* Copyright (C) Olivier Bertrand 2004 - 2015 +/* Copyright (C) MariaDB Corporation Ab This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -15,7 +15,7 @@ /**************** MYCAT H Declares Source Code File (.H) ***************/ /* Name: MYCAT.H Version 2.3 */ -/* */ +/* Author: Olivier Bertrand */ /* This file contains the CONNECT plugin MYCAT class definitions. */ /***********************************************************************/ #ifndef __MYCAT__H @@ -47,6 +47,7 @@ struct ha_table_option_struct { const char *catfunc; const char *srcdef; const char *colist; + const char *filter; const char *oplist; const char *data_charset; ulonglong lrecl; @@ -98,10 +99,7 @@ class MYCAT : public CATALOG { // Methods void Reset(void); -//void SetDataPath(PGLOBAL g, const char *path) -// {SetPath(g, &DataPath, path);} bool StoreIndex(PGLOBAL, PTABDEF) {return false;} // Temporary -// PRELDEF GetTableDesc(PGLOBAL g, LPCSTR name, PRELDEF GetTableDesc(PGLOBAL g, PTABLE tablep, LPCSTR type, PRELDEF *prp = NULL); PTDB GetTable(PGLOBAL g, PTABLE tablep, @@ -109,9 +107,7 @@ class MYCAT : public CATALOG { void ClearDB(PGLOBAL g); protected: -// PRELDEF MakeTableDesc(PGLOBAL g, LPCSTR name, LPCSTR am); PRELDEF MakeTableDesc(PGLOBAL g, PTABLE tablep, LPCSTR am); - //void SetPath(PGLOBAL g, LPCSTR *datapath, const char *path); // Members ha_connect *Hc; // The Connect handler diff --git a/storage/connect/myconn.cpp b/storage/connect/myconn.cpp index d05254a32a6..d2d55f33611 100644 --- a/storage/connect/myconn.cpp +++ b/storage/connect/myconn.cpp @@ -135,10 +135,13 @@ PQRYRES MyColumns(PGLOBAL g, THD *thd, const char *host, const char *db, FLD_KEY, FLD_SCALE, FLD_RADIX, FLD_NULL, FLD_REM, FLD_NO, FLD_DEFAULT, FLD_EXTRA, FLD_CHARSET}; - unsigned int length[] = {0, 4, 16, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0}; - char *fld, *colname, *chset, *fmt, v, buf[128], uns[16], zero[16]; - int i, n, nf, ncol = sizeof(buftyp) / sizeof(int); + //unsigned int length[] = {0, 4, 16, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0}; + unsigned int length[] = {0, 4, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0}; + PCSZ fmt; + char *fld, *colname, *chset, v, buf[128], uns[16], zero[16]; + int i, n, nf = 0, ncol = sizeof(buftyp) / sizeof(int); int len, type, prec, rc, k = 0; + bool b; PQRYRES qrp; PCOLRES crp; MYSQLC myc; @@ -157,7 +160,9 @@ PQRYRES MyColumns(PGLOBAL g, THD *thd, const char *host, const char *db, /* Do an evaluation of the result size. */ /********************************************************************/ STRING cmd(g, 64, "SHOW FULL COLUMNS FROM "); - bool b = cmd.Append((PSZ)table); + b = cmd.Append('`'); + b |= cmd.Append((PSZ)table); + b |= cmd.Append('`'); b |= cmd.Append(" FROM "); b |= cmd.Append((PSZ)(db ? db : PlgGetUser(g)->DBName)); @@ -232,11 +237,31 @@ PQRYRES MyColumns(PGLOBAL g, THD *thd, const char *host, const char *db, fld = myc.GetCharField(1); prec = 0; len = 0; - v = (chset && !strcmp(chset, "binary")) ? 'B' : 0; +// v = (chset && !strcmp(chset, "binary")) ? 'B' : 0; + v = 0; *uns = 0; *zero = 0; + b = false; - switch ((nf = sscanf(fld, "%[^(](%d,%d", buf, &len, &prec))) { + if (!strnicmp(fld, "enum", 4)) { + char *p2, *p1 = fld + 6; // to skip enum(' + + while (true) { + p2 = strchr(p1, '\''); + len = MY_MAX(len, p2 - p1); + if (*++p2 != ',') break; + p1 = p2 + 2; + } // endwhile + + v = (len > 255) ? 'V' : 0; + strcpy(buf, "enum"); + b = true; + } else if (!strnicmp(fld, "set", 3)) { + len = (int)strlen(fld) - 2; + v = 'V'; + strcpy(buf, "set"); + b = true; + } else switch ((nf = sscanf(fld, "%[^(](%d,%d", buf, &len, &prec))) { case 3: nf = sscanf(fld, "%[^(](%d,%d) %s %s", buf, &len, &prec, uns, zero); break; @@ -271,7 +296,7 @@ PQRYRES MyColumns(PGLOBAL g, THD *thd, const char *host, const char *db, colname, len); PushWarning(g, thd); v = 'V'; - } else + } else len = MY_MIN(len, 4096); } // endif type @@ -286,6 +311,9 @@ PQRYRES MyColumns(PGLOBAL g, THD *thd, const char *host, const char *db, default: crp->Nulls[i] = v; break; } // endswitch nf + if (b) // enum or set + nf = sscanf(fld, "%s ", buf); // get values + crp = crp->Next; // Type_Name crp->Kdata->SetValue(buf, i); @@ -849,7 +877,8 @@ MYSQL_FIELD *MYSQLC::GetNextField(void) /***********************************************************************/ PQRYRES MYSQLC::GetResult(PGLOBAL g, bool pdb) { - char *fmt, v; + PCSZ fmt; + char *name, v; int n; bool uns; PCOLRES *pcrp, crp; @@ -887,8 +916,9 @@ PQRYRES MYSQLC::GetResult(PGLOBAL g, bool pdb) memset(crp, 0, sizeof(COLRES)); crp->Ncol = ++qrp->Nbcol; - crp->Name = (char*)PlugSubAlloc(g, NULL, fld->name_length + 1); - strcpy(crp->Name, fld->name); + name = (char*)PlugSubAlloc(g, NULL, fld->name_length + 1); + strcpy(name, fld->name); + crp->Name = name; if ((crp->Type = MYSQLtoPLG(fld->type, &v)) == TYPE_ERROR) { sprintf(g->Message, "Type %d not supported for column %s", diff --git a/storage/connect/mysql-test/connect/disabled.def b/storage/connect/mysql-test/connect/disabled.def index 0e5a5fc64e3..6d59369a4df 100644 --- a/storage/connect/mysql-test/connect/disabled.def +++ b/storage/connect/mysql-test/connect/disabled.def @@ -9,10 +9,13 @@ # Do not use any TAB characters for whitespace. # ############################################################################## -#jdbc : Variable settings depend on machine configuration -#jdbc_new : Variable settings depend on machine configuration +jdbc : Variable settings depend on machine configuration +jdbc_new : Variable settings depend on machine configuration jdbc_oracle : Variable settings depend on machine configuration jdbc_postgresql : Variable settings depend on machine configuration -json : TABLE_TYPE = JSON conflicts with the SQL syntax -json_udf : conflicts with the server JSON functions -json_udf_bin : conflicts with the server JSON functions +json_mongo_c : Need MongoDB running and its C Driver installed +json_java_2 : Need MongoDB running and its Java Driver installed +json_java_3 : Need MongoDB running and its Java Driver installed +mongo_c : Need MongoDB running and its C Driver installed +mongo_java_2 : Need MongoDB running and its Java Driver installed +mongo_java_3 : Need MongoDB running and its Java Driver installed diff --git a/storage/connect/mysql-test/connect/r/alter_xml.result b/storage/connect/mysql-test/connect/r/alter_xml.result index f2250b78d2d..7cdb1e5d21c 100644 --- a/storage/connect/mysql-test/connect/r/alter_xml.result +++ b/storage/connect/mysql-test/connect/r/alter_xml.result @@ -1,5 +1,3 @@ -Warnings: -Warning 1105 No file name. Table will use t1.xml # # Testing changing table type (not in-place) # @@ -16,7 +14,7 @@ c d # This is because the XML top node name defaults to the table name. # Sure enough the temporary table name begins with '#' and is rejected by XML. # Therefore the top node name must be specified (along with the row nodes name). -ALTER TABLE t1 TABLE_TYPE=XML TABNAME=t1 OPTION_LIST='rownode=row'; +ALTER TABLE t1 TABLE_TYPE=XML TABNAME=t1 OPTION_LIST='xmlsup=domdoc,rownode=row'; SELECT * FROM t1; c d 1 One @@ -27,7 +25,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `c` int(11) NOT NULL, `d` char(10) NOT NULL -) ENGINE=CONNECT DEFAULT CHARSET=latin1 `HEADER`=1 `QUOTED`=1 `TABLE_TYPE`=XML `TABNAME`=t1 `OPTION_LIST`='rownode=row' +) ENGINE=CONNECT DEFAULT CHARSET=latin1 `HEADER`=1 `QUOTED`=1 `TABLE_TYPE`=XML `TABNAME`=t1 `OPTION_LIST`='xmlsup=domdoc,rownode=row' # Let us see the XML file CREATE TABLE t2 (line VARCHAR(100) NOT NULL) ENGINE=CONNECT FILE_NAME='t1.xml'; Warnings: @@ -67,7 +65,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `c` int(11) NOT NULL, `d` char(10) NOT NULL `FIELD_FORMAT`='@' -) ENGINE=CONNECT DEFAULT CHARSET=latin1 `QUOTED`=1 `TABLE_TYPE`=XML `TABNAME`=t1 `OPTION_LIST`='rownode=row' `HEADER`=0 +) ENGINE=CONNECT DEFAULT CHARSET=latin1 `QUOTED`=1 `TABLE_TYPE`=XML `TABNAME`=t1 `OPTION_LIST`='xmlsup=domdoc,rownode=row' `HEADER`=0 SELECT * FROM t2; line diff --git a/storage/connect/mysql-test/connect/r/alter_xml2.result b/storage/connect/mysql-test/connect/r/alter_xml2.result new file mode 100644 index 00000000000..8eb56e3dcc3 --- /dev/null +++ b/storage/connect/mysql-test/connect/r/alter_xml2.result @@ -0,0 +1,86 @@ +Warnings: +Warning 1105 No file name. Table will use t1.xml +# +# Testing changing table type (not in-place) +# +CREATE TABLE t1 (c INT NOT NULL, d CHAR(10) NOT NULL) ENGINE=CONNECT TABLE_TYPE=CSV HEADER=1 QUOTED=1; +Warnings: +Warning 1105 No file name. Table will use t1.csv +INSERT INTO t1 VALUES (1,'One'), (2,'Two'), (3,'Three'); +SELECT * FROM t1; +c d +1 One +2 Two +3 Three +# This would fail if the top node name is not specified. +# This is because the XML top node name defaults to the table name. +# Sure enough the temporary table name begins with '#' and is rejected by XML. +# Therefore the top node name must be specified (along with the row nodes name). +ALTER TABLE t1 TABLE_TYPE=XML TABNAME=t1 OPTION_LIST='xmlsup=libxml2,rownode=row'; +SELECT * FROM t1; +c d +1 One +2 Two +3 Three +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c` int(11) NOT NULL, + `d` char(10) NOT NULL +) ENGINE=CONNECT DEFAULT CHARSET=latin1 `HEADER`=1 `QUOTED`=1 `TABLE_TYPE`=XML `TABNAME`=t1 `OPTION_LIST`='xmlsup=libxml2,rownode=row' +# Let us see the XML file +CREATE TABLE t2 (line VARCHAR(100) NOT NULL) ENGINE=CONNECT FILE_NAME='t1.xml'; +Warnings: +Warning 1105 No table_type. Will be set to DOS +SELECT * FROM t2; +line + + + + + c + d + + + 1 + One + + + 2 + Two + + + 3 + Three + + +# NOTE: The first (ignored) row is due to the remaining HEADER=1 option. +# Testing field option modification +ALTER TABLE t1 MODIFY d CHAR(10) NOT NULL FIELD_FORMAT='@', HEADER=0; +SELECT * FROM t1; +c d +1 One +2 Two +3 Three +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c` int(11) NOT NULL, + `d` char(10) NOT NULL `FIELD_FORMAT`='@' +) ENGINE=CONNECT DEFAULT CHARSET=latin1 `QUOTED`=1 `TABLE_TYPE`=XML `TABNAME`=t1 `OPTION_LIST`='xmlsup=libxml2,rownode=row' `HEADER`=0 +SELECT * FROM t2; +line + + + + + 1 + + + 2 + + + 3 + + +DROP TABLE t1, t2; diff --git a/storage/connect/mysql-test/connect/r/dir.result b/storage/connect/mysql-test/connect/r/dir.result index 99556c9b72d..e10bb458d62 100644 --- a/storage/connect/mysql-test/connect/r/dir.result +++ b/storage/connect/mysql-test/connect/r/dir.result @@ -25,9 +25,8 @@ SELECT fname, ftype, size FROM t1 ORDER BY fname, ftype, size; fname ftype size boys .txt 282 boyswin .txt 288 -SET STATEMENT sql_mode = '' FOR INSERT INTO t1 VALUES ('','','',''); -ERROR HY000: Got error 174 'COLBLK SetBuffer: undefined Access Method' from CONNECT +ERROR 22007: Incorrect double value: '' for column 'size' at row 1 DROP TABLE t1; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=DIR FILE_NAME='*.txt'; ERROR HY000: Cannot get column info for table type DIR diff --git a/storage/connect/mysql-test/connect/r/infoschema-9739.result b/storage/connect/mysql-test/connect/r/infoschema-9739.result index bcebec1d0e0..992f4ed0d58 100644 --- a/storage/connect/mysql-test/connect/r/infoschema-9739.result +++ b/storage/connect/mysql-test/connect/r/infoschema-9739.result @@ -1,6 +1,4 @@ -Warnings: -Warning 1105 No file name. Table will use t1.xml -create table t1 (i int) engine=Connect table_type=XML; +create table t1 (i int) engine=Connect table_type=XML option_list='xmlsup=domdoc'; Warnings: Warning 1105 No file name. Table will use t1.xml select * from information_schema.tables where create_options like '%table_type=XML%'; diff --git a/storage/connect/mysql-test/connect/r/infoschema2-9739.result b/storage/connect/mysql-test/connect/r/infoschema2-9739.result new file mode 100644 index 00000000000..7d8a6839ea5 --- /dev/null +++ b/storage/connect/mysql-test/connect/r/infoschema2-9739.result @@ -0,0 +1,12 @@ +Warnings: +Warning 1105 No file name. Table will use t1.xml +create table t1 (i int) engine=Connect table_type=XML option_list='xmlsup=libxml2'; +Warnings: +Warning 1105 No file name. Table will use t1.xml +select * from information_schema.tables where create_options like '%table_type=XML%'; +TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT +Warnings: +Warning 1286 Unknown storage engine 'InnoDB' +Warning 1286 Unknown storage engine 'InnoDB' +Warning 1296 Got error 174 'File t1.xml not found' from CONNECT +drop table t1; diff --git a/storage/connect/mysql-test/connect/r/jdbc_new.result b/storage/connect/mysql-test/connect/r/jdbc_new.result index 5cc4826213d..33d8bd3b7d8 100644 --- a/storage/connect/mysql-test/connect/r/jdbc_new.result +++ b/storage/connect/mysql-test/connect/r/jdbc_new.result @@ -1,3 +1,7 @@ +connect master,127.0.0.1,root,,test,$MASTER_MYPORT,; +connect slave,127.0.0.1,root,,test,$SLAVE_MYPORT,; +connection master; +connection slave; SET GLOBAL time_zone='+1:00'; CREATE TABLE t1 (a int, b char(10)); INSERT INTO t1 VALUES (NULL,NULL),(0,'test00'),(1,'test01'),(2,'test02'),(3,'test03'); @@ -11,12 +15,11 @@ NULL NULL # # Testing errors # +connection master; SET GLOBAL time_zone='+1:00'; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=unknown'; -SELECT * FROM t1; -ERROR HY000: Got error 174 'Connecting: java.sql.SQLException: Access denied for user 'unknown'@'localhost' (using password: NO) rc=-2' from CONNECT -DROP TABLE t1; +ERROR HY000: Connecting: java.sql.SQLException: Access denied for user 'unknown'@'localhost' (using password: NO) rc=-2 CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/unknown?user=root'; ERROR HY000: Connecting: java.sql.SQLSyntaxErrorException: Unknown database 'unknown' rc=-2 @@ -38,10 +41,14 @@ ERROR HY000: Got error 174 'ExecuteQuery: java.sql.SQLSyntaxErrorException: Unkn DROP TABLE t1; CREATE TABLE t1 (a int, b char(10)) ENGINE=CONNECT TABLE_TYPE=JDBC CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root'; +connection slave; ALTER TABLE t1 RENAME t1backup; +connection master; SELECT * FROM t1; ERROR HY000: Got error 174 'ExecuteQuery: java.sql.SQLSyntaxErrorException: Table 'test.t1' doesn't exist' from CONNECT +connection slave; ALTER TABLE t1backup RENAME t1; +connection master; DROP TABLE t1; # # Testing SELECT, etc. @@ -110,6 +117,7 @@ NULL NULL 2 0 3 0 DROP TABLE t1; +connection slave; DROP TABLE t1; # # Testing numeric data types @@ -128,6 +136,7 @@ t1 CREATE TABLE `t1` ( `h` decimal(20,5) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 INSERT INTO t1 VALUES(100,3333,41235,1234567890,235000000000,3.14159265,3.14159265,3141.59265); +connection master; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root'; SHOW CREATE TABLE t1; @@ -146,6 +155,7 @@ SELECT * FROM t1; a b c d e f g h 100 3333 41235 1234567890 235000000000 3 3 3141.59265 DROP TABLE t1; +connection slave; DROP TABLE t1; # # Testing character data types @@ -161,6 +171,7 @@ INSERT INTO t1 VALUES('Welcome','Hello, World'); SELECT * FROM t1; a b Welcome Hello, World +connection master; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root'; SHOW CREATE TABLE t1; @@ -173,6 +184,7 @@ SELECT * FROM t1; a b Welcome Hello, World DROP TABLE t1; +connection slave; DROP TABLE t1; # # Testing temporal data types @@ -184,10 +196,10 @@ t1 CREATE TABLE `t1` ( `a` date DEFAULT NULL, `b` datetime DEFAULT NULL, `c` time DEFAULT NULL, - `d` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `d` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), `e` year(4) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 -INSERT INTO t1 VALUES('2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23'); +INSERT IGNORE INTO t1 VALUES('2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23'); Warnings: Note 1265 Data truncated for column 'a' at row 1 Note 1265 Data truncated for column 'c' at row 1 @@ -195,6 +207,7 @@ Warning 1265 Data truncated for column 'e' at row 1 SELECT * FROM t1; a b c d e 2003-05-27 2003-05-27 10:45:23 10:45:23 2003-05-27 10:45:23 2003 +connection master; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root'; SHOW CREATE TABLE t1; @@ -203,13 +216,15 @@ t1 CREATE TABLE `t1` ( `a` date DEFAULT NULL, `b` datetime DEFAULT NULL, `c` time DEFAULT NULL, - `d` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `d` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), `e` year(4) DEFAULT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root' `TABLE_TYPE`='JDBC' SELECT * FROM t1; a b c d e 2003-05-27 2003-05-27 11:45:23 10:45:23 2003-05-27 10:45:23 2003 DROP TABLE t1; +connection slave; DROP TABLE t1; SET GLOBAL time_zone=SYSTEM; +connection master; SET GLOBAL time_zone=SYSTEM; diff --git a/storage/connect/mysql-test/connect/r/json.result b/storage/connect/mysql-test/connect/r/json.result index aa6b04c58c7..6b6f40d2c47 100644 --- a/storage/connect/mysql-test/connect/r/json.result +++ b/storage/connect/mysql-test/connect/r/json.result @@ -24,15 +24,15 @@ DROP TABLE t1; CREATE TABLE t1 ( ISBN CHAR(15), -Language CHAR(2) FIELD_FORMAT='LANG', -Subject CHAR(32) FIELD_FORMAT='SUBJECT', -Authors INT(2) FIELD_FORMAT='AUTHOR:[#]', -Title CHAR(32) FIELD_FORMAT='TITLE', -Translation CHAR(32) FIELD_FORMAT='TRANSLATION', -Translator CHAR(80) FIELD_FORMAT='TRANSLATOR', -Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', -Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', -Year int(4) FIELD_FORMAT='DATEPUB' +Language CHAR(2) FIELD_FORMAT='$.LANG', +Subject CHAR(32) FIELD_FORMAT='$.SUBJECT', +Authors INT(2) FIELD_FORMAT='$.AUTHOR[#]', +Title CHAR(32) FIELD_FORMAT='$.TITLE', +Translation CHAR(32) FIELD_FORMAT='$.TRANSLATION', +Translator CHAR(80) FIELD_FORMAT='$.TRANSLATOR', +Publisher CHAR(20) FIELD_FORMAT='$.PUBLISHER.NAME', +Location CHAR(16) FIELD_FORMAT='$.PUBLISHER.PLACE', +Year int(4) FIELD_FORMAT='$.DATEPUB' ) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; SELECT * FROM t1; @@ -46,16 +46,16 @@ DROP TABLE t1; CREATE TABLE t1 ( ISBN CHAR(15), -Language CHAR(2) FIELD_FORMAT='LANG', -Subject CHAR(32) FIELD_FORMAT='SUBJECT', -AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[" and "]:FIRSTNAME', -AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[" and "]:LASTNAME', -Title CHAR(32) FIELD_FORMAT='TITLE', -Translation CHAR(32) FIELD_FORMAT='TRANSLATION', -Translator CHAR(80) FIELD_FORMAT='TRANSLATOR', -Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', -Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', -Year int(4) FIELD_FORMAT='DATEPUB' +Language CHAR(2) FIELD_FORMAT='$.LANG', +Subject CHAR(32) FIELD_FORMAT='$.SUBJECT', +AuthorFN CHAR(128) FIELD_FORMAT='$.AUTHOR[" and "].FIRSTNAME', +AuthorLN CHAR(128) FIELD_FORMAT='$.AUTHOR[" and "].LASTNAME', +Title CHAR(32) FIELD_FORMAT='$.TITLE', +Translation CHAR(32) FIELD_FORMAT='$.TRANSLATION', +Translator CHAR(80) FIELD_FORMAT='$.TRANSLATOR', +Publisher CHAR(20) FIELD_FORMAT='$.PUBLISHER.NAME', +Location CHAR(16) FIELD_FORMAT='$.PUBLISHER.PLACE', +Year int(4) FIELD_FORMAT='$.DATEPUB' ) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; SELECT * FROM t1; @@ -69,16 +69,16 @@ DROP TABLE t1; CREATE TABLE t1 ( ISBN CHAR(15), -Language CHAR(2) FIELD_FORMAT='LANG', -Subject CHAR(32) FIELD_FORMAT='SUBJECT', -AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:FIRSTNAME', -AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:LASTNAME', -Title CHAR(32) FIELD_FORMAT='TITLE', -Translation CHAR(32) FIELD_FORMAT='TRANSLATION', -Translator CHAR(80) FIELD_FORMAT='TRANSLATOR', -Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', -Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', -Year int(4) FIELD_FORMAT='DATEPUB' +Language CHAR(2) FIELD_FORMAT='$.LANG', +Subject CHAR(32) FIELD_FORMAT='$.SUBJECT', +AuthorFN CHAR(128) FIELD_FORMAT='$.AUTHOR[*].FIRSTNAME', +AuthorLN CHAR(128) FIELD_FORMAT='$.AUTHOR[*].LASTNAME', +Title CHAR(32) FIELD_FORMAT='$.TITLE', +Translation CHAR(32) FIELD_FORMAT='$.TRANSLATION', +Translator CHAR(80) FIELD_FORMAT='$.TRANSLATOR', +Publisher CHAR(20) FIELD_FORMAT='$.PUBLISHER.NAME', +Location CHAR(16) FIELD_FORMAT='$.PUBLISHER.PLACE', +Year int(4) FIELD_FORMAT='$.DATEPUB' ) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; SELECT * FROM t1; @@ -97,7 +97,7 @@ ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher L CREATE TABLE t2 ( FIRSTNAME CHAR(32), LASTNAME CHAR(32)) -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json' OPTION_LIST='Object=[1]:AUTHOR'; +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json' OPTION_LIST='Object=$[1].AUTHOR'; SELECT * FROM t2; FIRSTNAME LASTNAME William J. Pardi @@ -176,17 +176,17 @@ DROP TABLE t1; CREATE TABLE t1 ( ISBN CHAR(15) NOT NULL, -Language CHAR(2) FIELD_FORMAT='LANG', -Subject CHAR(32) FIELD_FORMAT='SUBJECT', -AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:FIRSTNAME', -AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:LASTNAME', -Title CHAR(32) FIELD_FORMAT='TITLE', -Translation CHAR(32) FIELD_FORMAT='TRANSLATED:PREFIX', -TranslatorFN CHAR(80) FIELD_FORMAT='TRANSLATED:TRANSLATOR:FIRSTNAME', -TranslatorLN CHAR(80) FIELD_FORMAT='TRANSLATED:TRANSLATOR:LASTNAME', -Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', -Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', -Year int(4) FIELD_FORMAT='DATEPUB', +Language CHAR(2) FIELD_FORMAT='$.LANG', +Subject CHAR(32) FIELD_FORMAT='$.SUBJECT', +AuthorFN CHAR(128) FIELD_FORMAT='$.AUTHOR[*].FIRSTNAME', +AuthorLN CHAR(128) FIELD_FORMAT='$.AUTHOR[*].LASTNAME', +Title CHAR(32) FIELD_FORMAT='$.TITLE', +Translation CHAR(32) FIELD_FORMAT='$.TRANSLATED.PREFIX', +TranslatorFN CHAR(80) FIELD_FORMAT='$.TRANSLATED.TRANSLATOR.FIRSTNAME', +TranslatorLN CHAR(80) FIELD_FORMAT='$.TRANSLATED.TRANSLATOR.LASTNAME', +Publisher CHAR(20) FIELD_FORMAT='$.PUBLISHER.NAME', +Location CHAR(16) FIELD_FORMAT='$.PUBLISHER.PLACE', +Year int(4) FIELD_FORMAT='$.DATEPUB', INDEX IX(ISBN) ) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='bib0.json' LRECL=320 OPTION_LIST='Pretty=0'; @@ -209,9 +209,9 @@ DROP TABLE t1; # CREATE TABLE t1 ( WHO CHAR(12), -WEEK INT(2) FIELD_FORMAT='WEEK:[X]:NUMBER', -WHAT CHAR(32) FIELD_FORMAT='WEEK::EXPENSE:["+"]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK::EXPENSE:[+]:AMOUNT') +WEEK INT(2) FIELD_FORMAT='$.WEEK[*].NUMBER', +WHAT CHAR(32) FIELD_FORMAT='$.WEEK[].EXPENSE["+"].WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[].EXPENSE[+].AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; SELECT * FROM t1; WHO WEEK WHAT AMOUNT @@ -230,9 +230,9 @@ DROP TABLE t1; # CREATE TABLE t1 ( WHO CHAR(12), -WEEK INT(2) FIELD_FORMAT='WEEK:[X]:NUMBER', -WHAT CHAR(32) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:AMOUNT') +WEEK INT(2) FIELD_FORMAT='$.WEEK[*].NUMBER', +WHAT CHAR(32) FIELD_FORMAT='$.WEEK[*].EXPENSE[*].WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[*].EXPENSE[*].AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; SELECT * FROM t1; WHO WEEK WHAT AMOUNT @@ -266,14 +266,14 @@ DROP TABLE t1; # CREATE TABLE t1 ( WHO CHAR(12) NOT NULL, -WEEKS CHAR(12) NOT NULL FIELD_FORMAT='WEEK:[", "]:NUMBER', -SUMS CHAR(64) NOT NULL FIELD_FORMAT='WEEK:["+"]:EXPENSE:[+]:AMOUNT', -SUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[+]:EXPENSE:[+]:AMOUNT', -AVGS CHAR(64) NOT NULL FIELD_FORMAT='WEEK:["+"]:EXPENSE:[!]:AMOUNT', -SUMAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[+]:EXPENSE:[!]:AMOUNT', -AVGSUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[!]:EXPENSE:[+]:AMOUNT', -AVGAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[!]:EXPENSE:[!]:AMOUNT', -AVERAGE DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[!]:EXPENSE:[X]:AMOUNT') +WEEKS CHAR(12) NOT NULL FIELD_FORMAT='$.WEEK[", "].NUMBER', +SUMS CHAR(64) NOT NULL FIELD_FORMAT='$.WEEK["+"].EXPENSE[+].AMOUNT', +SUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[+].EXPENSE[+].AMOUNT', +AVGS CHAR(64) NOT NULL FIELD_FORMAT='$.WEEK["+"].EXPENSE[!].AMOUNT', +SUMAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[+].EXPENSE[!].AMOUNT', +AVGSUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[!].EXPENSE[+].AMOUNT', +AVGAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[!].EXPENSE[!].AMOUNT', +AVERAGE DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[!].EXPENSE[*].AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; SELECT * FROM t1; WHO WEEKS SUMS SUM AVGS SUMAVG AVGSUM AVGAVG AVERAGE @@ -286,9 +286,9 @@ DROP TABLE t1; # CREATE TABLE t2 ( WHO CHAR(12), -WEEK INT(2) FIELD_FORMAT='WEEK:[0]:NUMBER', -WHAT CHAR(32) FIELD_FORMAT='WEEK:[0]:EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[0]:EXPENSE:[X]:AMOUNT') +WEEK INT(2) FIELD_FORMAT='$.WEEK[0].NUMBER', +WHAT CHAR(32) FIELD_FORMAT='$.WEEK[0].EXPENSE[*].WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[0].EXPENSE[*].AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; SELECT * FROM t2; WHO WEEK WHAT AMOUNT @@ -302,9 +302,9 @@ Janet 3 Food 18.00 Janet 3 Beer 18.00 CREATE TABLE t3 ( WHO CHAR(12), -WEEK INT(2) FIELD_FORMAT='WEEK:[1]:NUMBER', -WHAT CHAR(32) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:AMOUNT') +WEEK INT(2) FIELD_FORMAT='$.WEEK[1].NUMBER', +WHAT CHAR(32) FIELD_FORMAT='$.WEEK[1].EXPENSE[*].WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[1].EXPENSE[*].AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; SELECT * FROM t3; WHO WEEK WHAT AMOUNT @@ -318,9 +318,9 @@ Beth 4 Beer 15.00 Janet 4 Car 17.00 CREATE TABLE t4 ( WHO CHAR(12), -WEEK INT(2) FIELD_FORMAT='WEEK:[2]:NUMBER', -WHAT CHAR(32) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:AMOUNT') +WEEK INT(2) FIELD_FORMAT='$.WEEK[2].NUMBER', +WHAT CHAR(32) FIELD_FORMAT='$.WEEK[2].EXPENSE[*].WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[2].EXPENSE[*].AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; SELECT * FROM t4; WHO WEEK WHAT AMOUNT @@ -374,8 +374,8 @@ DROP TABLE t1, t2, t3, t4; CREATE TABLE t2 ( WHO CHAR(12), WEEK INT(2), -WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') +WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp3.json'; SELECT * FROM t2; WHO WEEK WHAT AMOUNT @@ -390,8 +390,8 @@ Janet 3 Beer 18.00 CREATE TABLE t3 ( WHO CHAR(12), WEEK INT(2), -WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') +WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp4.json'; SELECT * FROM t3; WHO WEEK WHAT AMOUNT @@ -406,8 +406,8 @@ Janet 4 Car 17.00 CREATE TABLE t4 ( WHO CHAR(12), WEEK INT(2), -WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') +WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp5.json'; SELECT * FROM t4; WHO WEEK WHAT AMOUNT @@ -425,8 +425,8 @@ Janet 5 Food 12.00 CREATE TABLE t1 ( WHO CHAR(12), WEEK INT(2), -WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') +WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp*.json' MULTIPLE=1; SELECT * FROM t1 ORDER BY WHO, WEEK, WHAT, AMOUNT; WHO WEEK WHAT AMOUNT @@ -461,8 +461,8 @@ DROP TABLE t1; CREATE TABLE t1 ( WHO CHAR(12), WEEK INT(2), -WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') +WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp%s.json'; ALTER TABLE t1 PARTITION BY LIST COLUMNS(WEEK) ( diff --git a/storage/connect/mysql-test/connect/r/json_java_2.result b/storage/connect/mysql-test/connect/r/json_java_2.result new file mode 100644 index 00000000000..83272ec00ce --- /dev/null +++ b/storage/connect/mysql-test/connect/r/json_java_2.result @@ -0,0 +1,386 @@ +SET GLOBAL connect_class_path='C:/MariaDB-10.2/MariaDB/storage/connect/mysql-test/connect/std_data/Mongo2.jar'; +# +# Test the MONGO table type +# +CREATE TABLE t1 (Document varchar(1024) field_format='*') +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants CONNECTION='mongodb://localhost:27017' LRECL=4096 +OPTION_LIST='Driver=Java,Version=2' DATA_CHARSET=utf8; +SELECT * from t1 limit 3; +Document +{"_id":{"$oid":"58ada47de5a51ddfcd5ed51c"},"address":{"building":"1007","coord":[-73.856077,40.848447],"street":"Morris Park Ave","zipcode":"10462"},"borough":"Bronx","cuisine":"Bakery","grades":[{"date":{"$date":"2014-03-03T00:00:00.000Z"},"grade":"A","score":2},{"date":{"$date":"2013-09-11T00:00:00.000Z"},"grade":"A","score":6},{"date":{"$date":"2013-01-24T00:00:00.000Z"},"grade":"A","score":10},{"date":{"$date":"2011-11-23T00:00:00.000Z"},"grade":"A","score":9},{"date":{"$date":"2011-03-10T00:00:00.000Z"},"grade":"B","score":14}],"name":"Morris Park Bake Shop","restaurant_id":"30075445"} +{"_id":{"$oid":"58ada47de5a51ddfcd5ed51d"},"address":{"building":"469","coord":[-73.961704,40.662942],"street":"Flatbush Avenue","zipcode":"11225"},"borough":"Brooklyn","cuisine":"Hamburgers","grades":[{"date":{"$date":"2014-12-30T00:00:00.000Z"},"grade":"A","score":8},{"date":{"$date":"2014-07-01T00:00:00.000Z"},"grade":"B","score":23},{"date":{"$date":"2013-04-30T00:00:00.000Z"},"grade":"A","score":12},{"date":{"$date":"2012-05-08T00:00:00.000Z"},"grade":"A","score":12}],"name":"Wendy'S","restaurant_id":"30112340"} +{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.98513559999999,40.7676919],"street":"West 57 Street","zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":"2014-09-06T00:00:00.000Z"},"grade":"A","score":2},{"date":{"$date":"2013-07-22T00:00:00.000Z"},"grade":"A","score":11},{"date":{"$date":"2012-07-31T00:00:00.000Z"},"grade":"A","score":12},{"date":{"$date":"2011-12-29T00:00:00.000Z"},"grade":"A","score":12}],"name":"Dj Reynolds Pub And Restaurant","restaurant_id":"30191841"} +DROP TABLE t1; +# +# Test catfunc +# +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants CATFUNC=columns +OPTION_LIST='Level=1,Driver=Java,Version=2' DATA_CHARSET=utf8 CONNECTION='mongodb://localhost:27017' LRECL=4096; +SELECT * from t1; +Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Nullable Jpath +_id 1 CHAR 24 24 0 0 _id +address_building 1 CHAR 10 10 0 0 address.building +address_coord 1 CHAR 256 256 0 1 address.coord +address_street 1 CHAR 38 38 0 0 address.street +address_zipcode 1 CHAR 5 5 0 0 address.zipcode +borough 1 CHAR 13 13 0 0 +cuisine 1 CHAR 64 64 0 0 +grades 1 CHAR 0 0 0 1 +grades_date 1 CHAR 256 256 0 1 grades.0.date +grades_grade 1 CHAR 14 14 0 1 grades.0.grade +grades_score 5 BIGINT 2 2 0 1 grades.0.score +name 1 CHAR 98 98 0 0 +restaurant_id 1 CHAR 8 8 0 0 +DROP TABLE t1; +# +# Explicit columns +# +CREATE TABLE t1 ( +_id VARCHAR(24) NOT NULL, +name VARCHAR(255) NOT NULL, +cuisine VARCHAR(255) NOT NULL, +borough VARCHAR(255) NOT NULL, +restaurant_id VARCHAR(255) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants +CONNECTION='mongodb://localhost:27017' LRECL=1024 DATA_CHARSET=utf8 +OPTION_LIST='Driver=Java,Version=2'; +SELECT * FROM t1 LIMIT 10; +_id name cuisine borough restaurant_id +58ada47de5a51ddfcd5ed51c Morris Park Bake Shop Bakery Bronx 30075445 +58ada47de5a51ddfcd5ed51d Wendy'S Hamburgers Brooklyn 30112340 +58ada47de5a51ddfcd5ed51e Dj Reynolds Pub And Restaurant Irish Manhattan 30191841 +58ada47de5a51ddfcd5ed51f Riviera Caterer American Brooklyn 40356018 +58ada47de5a51ddfcd5ed520 Tov Kosher Kitchen Jewish/Kosher Queens 40356068 +58ada47de5a51ddfcd5ed521 Brunos On The Boulevard American Queens 40356151 +58ada47de5a51ddfcd5ed522 Kosher Island Jewish/Kosher Staten Island 40356442 +58ada47de5a51ddfcd5ed523 Wilken'S Fine Food Delicatessen Brooklyn 40356483 +58ada47de5a51ddfcd5ed524 Regina Caterers American Brooklyn 40356649 +58ada47de5a51ddfcd5ed525 Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn 40356731 +DROP TABLE t1; +# +# Test discovery +# +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants +OPTION_LIST='Level=1,Driver=Java,Version=2' CONNECTION='mongodb://localhost:27017' LRECL=4096 DATA_CHARSET=utf8; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `_id` char(24) NOT NULL `FIELD_FORMAT`='_id', + `address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building', + `address_coord` varchar(256) DEFAULT NULL `FIELD_FORMAT`='address.coord', + `address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street', + `address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode', + `borough` char(13) NOT NULL, + `cuisine` char(64) NOT NULL, + `grades` char(1) DEFAULT NULL, + `grades_date` varchar(256) DEFAULT NULL `FIELD_FORMAT`='grades.0.date', + `grades_grade` char(14) DEFAULT NULL `FIELD_FORMAT`='grades.0.grade', + `grades_score` bigint(2) DEFAULT NULL `FIELD_FORMAT`='grades.0.score', + `name` char(98) NOT NULL, + `restaurant_id` char(8) NOT NULL +) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='mongodb://localhost:27017' `TABLE_TYPE`='JSON' `TABNAME`='restaurants' `OPTION_LIST`='Level=1,Driver=Java,Version=2' `DATA_CHARSET`='utf8' `LRECL`=4096 +SELECT * FROM t1 LIMIT 5; +_id address_building address_coord address_street address_zipcode borough cuisine grades grades_date grades_grade grades_score name restaurant_id +58ada47de5a51ddfcd5ed51c 1007 -73.856077 Morris Park Ave 10462 Bronx Bakery 2 2014-03-03T00:00:00.000Z A 2 Morris Park Bake Shop 30075445 +58ada47de5a51ddfcd5ed51d 469 -73.961704 Flatbush Avenue 11225 Brooklyn Hamburgers 2 2014-12-30T00:00:00.000Z A 8 Wendy'S 30112340 +58ada47de5a51ddfcd5ed51e 351 -73.98513559999999 West 57 Street 10019 Manhattan Irish 2 2014-09-06T00:00:00.000Z A 2 Dj Reynolds Pub And Restaurant 30191841 +58ada47de5a51ddfcd5ed51f 2780 -73.98241999999999 Stillwell Avenue 11224 Brooklyn American 2 2014-06-10T00:00:00.000Z A 5 Riviera Caterer 40356018 +58ada47de5a51ddfcd5ed520 97-22 -73.8601152 63 Road 11374 Queens Jewish/Kosher 2 2014-11-24T00:00:00.000Z Z 20 Tov Kosher Kitchen 40356068 +DROP TABLE t1; +# +# Dropping a column +# +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants DATA_CHARSET=utf8 +COLIST='{"grades":0}' OPTION_LIST='Driver=Java,Version=2,level=0' CONNECTION='mongodb://localhost:27017' LRECL=4096; +SELECT * FROM t1 LIMIT 10; +_id address borough cuisine name restaurant_id +58ada47de5a51ddfcd5ed51c 1007 -73.856077 40.848447 Morris Park Ave 10462 Bronx Bakery Morris Park Bake Shop 30075445 +58ada47de5a51ddfcd5ed51d 469 -73.961704 40.662942 Flatbush Avenue 11225 Brooklyn Hamburgers Wendy'S 30112340 +58ada47de5a51ddfcd5ed51e 351 -73.98513559999999 40.7676919 West 57 Street 10019 Manhattan Irish Dj Reynolds Pub And Restaurant 30191841 +58ada47de5a51ddfcd5ed51f 2780 -73.98241999999999 40.579505 Stillwell Avenue 11224 Brooklyn American Riviera Caterer 40356018 +58ada47de5a51ddfcd5ed520 97-22 -73.8601152 40.7311739 63 Road 11374 Queens Jewish/Kosher Tov Kosher Kitchen 40356068 +58ada47de5a51ddfcd5ed521 8825 -73.8803827 40.7643124 Astoria Boulevard 11369 Queens American Brunos On The Boulevard 40356151 +58ada47de5a51ddfcd5ed522 2206 -74.1377286 40.6119572 Victory Boulevard 10314 Staten Island Jewish/Kosher Kosher Island 40356442 +58ada47de5a51ddfcd5ed523 7114 -73.9068506 40.6199034 Avenue U 11234 Brooklyn Delicatessen Wilken'S Fine Food 40356483 +58ada47de5a51ddfcd5ed524 6409 -74.00528899999999 40.628886 11 Avenue 11219 Brooklyn American Regina Caterers 40356649 +58ada47de5a51ddfcd5ed525 1839 -73.9482609 40.6408271 Nostrand Avenue 11226 Brooklyn Ice Cream, Gelato, Yogurt, Ices Taste The Tropics Ice Cream 40356731 +DROP TABLE t1; +# +# Specifying Jpath +# +CREATE TABLE t1 ( +_id VARCHAR(24) NOT NULL, +name VARCHAR(64) NOT NULL, +cuisine CHAR(200) NOT NULL, +borough CHAR(16) NOT NULL, +street VARCHAR(65) FIELD_FORMAT='address.street', +building CHAR(16) FIELD_FORMAT='address.building', +zipcode CHAR(5) FIELD_FORMAT='address.zipcode', +grade CHAR(1) FIELD_FORMAT='grades.0.grade', +score INT(4) NOT NULL FIELD_FORMAT='grades.0.score', +`date` DATE FIELD_FORMAT='grades.0.date', +restaurant_id VARCHAR(255) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='restaurants' DATA_CHARSET=utf8 +OPTION_LIST='Driver=Java,Version=2' CONNECTION='mongodb://localhost:27017' LRECL=4096; +SELECT * FROM t1 LIMIT 1; +_id 58ada47de5a51ddfcd5ed51c +name Morris Park Bake Shop +cuisine Bakery +borough Bronx +street Morris Park Ave +building 1007 +zipcode 10462 +grade A +score 2 +date 1970-01-01 +restaurant_id 30075445 +SELECT name, street, score, date FROM t1 LIMIT 5; +name street score date +Morris Park Bake Shop Morris Park Ave 2 1970-01-01 +Wendy'S Flatbush Avenue 8 1970-01-01 +Dj Reynolds Pub And Restaurant West 57 Street 2 1970-01-01 +Riviera Caterer Stillwell Avenue 5 1970-01-01 +Tov Kosher Kitchen 63 Road 20 1970-01-01 +SELECT name, cuisine, borough FROM t1 WHERE grade = 'A' LIMIT 10; +name cuisine borough +Morris Park Bake Shop Bakery Bronx +Wendy'S Hamburgers Brooklyn +Dj Reynolds Pub And Restaurant Irish Manhattan +Riviera Caterer American Brooklyn +Kosher Island Jewish/Kosher Staten Island +Wilken'S Fine Food Delicatessen Brooklyn +Regina Caterers American Brooklyn +Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn +Wild Asia American Bronx +C & C Catering Service American Brooklyn +SELECT COUNT(*) FROM t1 WHERE grade = 'A'; +COUNT(*) +20687 +SELECT * FROM t1 WHERE cuisine = 'English'; +_id name cuisine borough street building zipcode grade score date restaurant_id +58ada47de5a51ddfcd5ed83d Tea And Sympathy English Manhattan Greenwich Avenue 108 10011 A 8 1970-01-01 40391531 +58ada47de5a51ddfcd5ed85c Tartine English Manhattan West 11 Street 253 10014 A 11 1970-01-01 40392496 +58ada47de5a51ddfcd5ee1f3 The Park Slope Chipshop English Brooklyn 5 Avenue 383 11215 B 17 1970-01-01 40816202 +58ada47de5a51ddfcd5ee7e4 Pound And Pence English Manhattan Liberty Street 55 10005 A 7 1970-01-01 41022701 +58ada47de5a51ddfcd5ee999 Chip Shop English Brooklyn Atlantic Avenue 129 11201 A 9 1970-01-01 41076583 +58ada47ee5a51ddfcd5efe3f The Breslin Bar & Dining Room English Manhattan West 29 Street 16 10001 A 13 1970-01-01 41443706 +58ada47ee5a51ddfcd5efe99 Highlands Restaurant English Manhattan West 10 Street 150 10014 A 12 1970-01-01 41448559 +58ada47ee5a51ddfcd5f0413 The Fat Radish English Manhattan Orchard Street 17 10002 A 12 1970-01-01 41513545 +58ada47ee5a51ddfcd5f0777 Jones Wood Foundry English Manhattan East 76 Street 401 10021 A 12 1970-01-01 41557377 +58ada47ee5a51ddfcd5f0ea2 Whitehall English Manhattan Greenwich Avenue 19 10014 Z 15 1970-01-01 41625263 +58ada47ee5a51ddfcd5f1004 The Churchill Tavern English Manhattan East 28 Street 45 10016 A 13 1970-01-01 41633327 +58ada47ee5a51ddfcd5f13d5 The Monro English Brooklyn 5 Avenue 481 11215 A 7 1970-01-01 41660253 +58ada47ee5a51ddfcd5f1454 The Cock & Bull English Manhattan West 45 Street 23 10036 A 7 1970-01-01 41664704 +58ada47ee5a51ddfcd5f176e Dear Bushwick English Brooklyn Wilson Avenue 41 11237 A 12 1970-01-01 41690534 +58ada47ee5a51ddfcd5f1e91 Snowdonia Pub English Queens 32 Street 34-55 11106 A 12 1970-01-01 50000290 +58ada47ee5a51ddfcd5f2ddc Oscar'S Place English Manhattan Hudson Street 466 10014 A 10 1970-01-01 50011097 +SELECT * FROM t1 WHERE score = building; +_id name cuisine borough street building zipcode grade score date restaurant_id +DROP TABLE t1; +# +# Specifying Filter +# +CREATE TABLE t1 ( +_id CHAR(24) NOT NULL, +name CHAR(64) NOT NULL, +borough CHAR(16) NOT NULL, +restaurant_id CHAR(8) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants DATA_CHARSET=utf8 +FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' +OPTION_LIST='Driver=Java,Version=2' CONNECTION='mongodb://localhost:27017' LRECL=4096; +SELECT name FROM t1 WHERE borough = 'Queens'; +name +La Baraka Restaurant +Air France Lounge +Tournesol +Winegasm +Cafe Henri +Bistro 33 +Domaine Wine Bar +Cafe Triskell +Cannelle Patisserie +La Vie +Dirty Pierres Bistro +Fresca La Crepe +Bliss 46 Bistro +Bear +Cuisine By Claudette +Paris Baguette +The Baroness Bar +Francis Cafe +Madame Sou Sou +Crepe 'N' Tearia +Aperitif Bayside Llc +DROP TABLE t1; +# +# Testing pipeline +# +CREATE TABLE t1 ( +name VARCHAR(64) NOT NULL, +borough CHAR(16) NOT NULL, +date DATETIME NOT NULL, +grade CHAR(1) NOT NULL, +score INT(4) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='restaurants' DATA_CHARSET=utf8 +COLIST='{"pipeline":[{"$match":{"cuisine":"French"}},{"$unwind":"$grades"},{"$project":{"_id":0,"name":1,"borough":1,"date":"$grades.date","grade":"$grades.grade","score":"$grades.score"}}]}' +OPTION_LIST='Driver=Java,Version=2,Pipeline=1' CONNECTION='mongodb://localhost:27017' LRECL=4096; +SELECT * FROM t1 LIMIT 10; +name borough date grade score +Tout Va Bien Manhattan 1970-01-01 01:33:34 B 15 +Tout Va Bien Manhattan 1970-01-01 01:33:34 A 13 +Tout Va Bien Manhattan 1970-01-01 01:33:33 C 36 +Tout Va Bien Manhattan 1970-01-01 01:33:33 B 22 +Tout Va Bien Manhattan 1970-01-01 01:33:32 C 36 +Tout Va Bien Manhattan 1970-01-01 01:33:32 C 7 +La Grenouille Manhattan 1970-01-01 01:33:34 A 10 +La Grenouille Manhattan 1970-01-01 01:33:33 A 9 +La Grenouille Manhattan 1970-01-01 01:33:32 A 13 +Le Perigord Manhattan 1970-01-01 01:33:34 B 14 +SELECT name, grade, score, date FROM t1 WHERE borough = 'Bronx'; +name grade score date +Bistro Sk A 10 1970-01-01 01:33:34 +Bistro Sk A 12 1970-01-01 01:33:34 +Bistro Sk B 18 1970-01-01 01:33:33 +DROP TABLE t1; +# +# try level 2 discovery +# +CREATE TABLE t1 +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants +FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' +COLIST='{"cuisine":0}' CONNECTION='mongodb://localhost:27017' LRECL=4096 +OPTION_LIST='Driver=Java,level=2,version=2'; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `_id` char(24) NOT NULL `FIELD_FORMAT`='_id', + `address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building', + `address_coord` double(18,16) DEFAULT NULL `FIELD_FORMAT`='address.coord.0', + `address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street', + `address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode', + `borough` char(13) NOT NULL, + `grades` char(1) DEFAULT NULL, + `grades_date` char(24) DEFAULT NULL `FIELD_FORMAT`='grades.0.date', + `grades_grade` char(14) DEFAULT NULL `FIELD_FORMAT`='grades.0.grade', + `grades_score` bigint(2) DEFAULT NULL `FIELD_FORMAT`='grades.0.score', + `name` char(98) NOT NULL, + `restaurant_id` char(8) NOT NULL +) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='mongodb://localhost:27017' `TABLE_TYPE`='JSON' `TABNAME`='restaurants' `COLIST`='{"cuisine":0}' `FILTER`='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' `OPTION_LIST`='Driver=Java,level=2,version=2' `LRECL`=4096 +SELECT name, borough, address_street, grades_score AS score FROM t1 WHERE grades_grade = 'B'; +name borough address_street score +Le Gamin Brooklyn Vanderbilt Avenue 24 +Bistro 33 Queens Ditmars Boulevard 15 +Dirty Pierres Bistro Queens Station Square 22 +Santos Anne Brooklyn Union Avenue 26 +Le Paddock Brooklyn Prospect Avenue 17 +La Crepe Et La Vie Brooklyn Foster Avenue 24 +Francis Cafe Queens Ditmars Boulevard 19 +DROP TABLE t1; +# +# try CRUD operations +# +false +CREATE TABLE t1 (_id INT(4) NOT NULL, msg CHAR(64)) +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='testcoll' +OPTION_LIST='Driver=Java,Version=2' CONNECTION='mongodb://localhost:27017' LRECL=4096; +DELETE FROM t1; +INSERT INTO t1 VALUES(0,NULL),(1,'One'),(2,'Two'),(3,'Three'); +SELECT * FROM t1; +_id msg +0 NULL +1 One +2 Two +3 Three +UPDATE t1 SET msg = 'Deux' WHERE _id = 2; +DELETE FROM t1 WHERE msg IS NULL; +SELECT * FROM t1; +_id msg +1 One +2 Deux +3 Three +DELETE FROM t1; +DROP TABLE t1; +true +# +# List states whose population is equal or more than 10 millions +# +false +CREATE TABLE t1 ( +_id char(5) NOT NULL, +city char(16) NOT NULL, +loc_0 double(12,6) NOT NULL `FIELD_FORMAT`='loc.0', +loc_1 char(12) NOT NULL `FIELD_FORMAT`='loc.1', +pop int(11) NOT NULL, +state char(2) NOT NULL) +ENGINE=CONNECT CONNECTION='mongodb://localhost:27017' TABLE_TYPE='MONGO' TABNAME='cities' +OPTION_LIST='Driver=Java,Version=2' CONNECTION='mongodb://localhost:27017' LRECL=4096 DATA_CHARSET='utf8'; +# Using SQL for grouping +SELECT state, sum(pop) AS totalPop FROM t1 GROUP BY state HAVING totalPop >= 10000000 ORDER BY totalPop DESC; +state totalPop +CA 29754890 +NY 17990402 +TX 16984601 +FL 12686644 +PA 11881643 +IL 11427576 +OH 10846517 +DROP TABLE t1; +# Using a pipeline for grouping +CREATE TABLE t1 (_id CHAR(2) NOT NULL, totalPop INT(11) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='cities' DATA_CHARSET=utf8 +COLIST='{"pipeline":[{"$group":{"_id":"$state","totalPop":{"$sum":"$pop"}}},{"$match":{"totalPop":{"$gte":10000000}}},{"$sort":{"totalPop":-1}}]}' +OPTION_LIST='Driver=Java,Version=2,Pipeline=1' CONNECTION='mongodb://localhost:27017' LRECL=4096; +SELECT * FROM t1; +_id totalPop +CA 29754890 +NY 17990402 +TX 16984601 +FL 12686644 +PA 11881643 +IL 11427576 +OH 10846517 +DROP TABLE t1; +true +# +# Test making array +# +CREATE TABLE t1 ( +_id int(4) NOT NULL, +item CHAR(8) NOT NULL, +prices_0 INT(6) FIELD_FORMAT='prices.0', +prices_1 INT(6) FIELD_FORMAT='prices.1', +prices_2 INT(6) FIELD_FORMAT='prices.2', +prices_3 INT(6) FIELD_FORMAT='prices.3', +prices_4 INT(6) FIELD_FORMAT='prices.4') +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='testcoll' DATA_CHARSET=utf8 +OPTION_LIST='Driver=Java,Version=2' CONNECTION='mongodb://localhost:27017' LRECL=4096; +INSERT INTO t1 VALUES +(1,'journal',87,45,63,12,78), +(2,'notebook',123,456,789,NULL,NULL), +(3,'paper',5,7,3,8,NULL), +(4,'planner',25,71,NULL,44,27), +(5,'postcard',5,7,3,8,NULL); +SELECT * FROM t1; +_id item prices_0 prices_1 prices_2 prices_3 prices_4 +1 journal 87 45 63 12 78 +2 notebook 123 456 789 NULL NULL +3 paper 5 7 3 8 NULL +4 planner 25 71 NULL 44 27 +5 postcard 5 7 3 8 NULL +DROP TABLE t1; +# +# Test array aggregation +# +CREATE TABLE t1 +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='testcoll' +COLIST='{"pipeline":[{"$project":{"_id":0,"item":1,"total":{"$sum":"$prices"},"average":{"$avg":"$prices"}}}]}' +OPTION_LIST='Driver=Java,Version=2,Pipeline=YES' CONNECTION='mongodb://localhost:27017' LRECL=4096; +SELECT * FROM t1; +item total average +journal 285 57.00 +notebook 1368 456.00 +paper 23 5.75 +planner 167 41.75 +postcard 23 5.75 +DROP TABLE t1; +true diff --git a/storage/connect/mysql-test/connect/r/json_java_3.result b/storage/connect/mysql-test/connect/r/json_java_3.result new file mode 100644 index 00000000000..563bcef7321 --- /dev/null +++ b/storage/connect/mysql-test/connect/r/json_java_3.result @@ -0,0 +1,386 @@ +SET GLOBAL connect_class_path='C:/MariaDB-10.2/MariaDB/storage/connect/mysql-test/connect/std_data/Mongo3.jar'; +# +# Test the MONGO table type +# +CREATE TABLE t1 (Document varchar(1024) field_format='*') +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants CONNECTION='mongodb://localhost:27017' LRECL=4096 +OPTION_LIST='Driver=Java,Version=3' DATA_CHARSET=utf8; +SELECT * from t1 limit 3; +Document +{"_id":{"$oid":"58ada47de5a51ddfcd5ed51c"},"address":{"building":"1007","coord":[-73.856077,40.848447],"street":"Morris Park Ave","zipcode":"10462"},"borough":"Bronx","cuisine":"Bakery","grades":[{"date":{"$date":1393804800000},"grade":"A","score":2},{"date":{"$date":1378857600000},"grade":"A","score":6},{"date":{"$date":1358985600000},"grade":"A","score":10},{"date":{"$date":1322006400000},"grade":"A","score":9},{"date":{"$date":1299715200000},"grade":"B","score":14}],"name":"Morris Park Bake Shop","restaurant_id":"30075445"} +{"_id":{"$oid":"58ada47de5a51ddfcd5ed51d"},"address":{"building":"469","coord":[-73.961704,40.662942],"street":"Flatbush Avenue","zipcode":"11225"},"borough":"Brooklyn","cuisine":"Hamburgers","grades":[{"date":{"$date":1419897600000},"grade":"A","score":8},{"date":{"$date":1404172800000},"grade":"B","score":23},{"date":{"$date":1367280000000},"grade":"A","score":12},{"date":{"$date":1336435200000},"grade":"A","score":12}],"name":"Wendy'S","restaurant_id":"30112340"} +{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.98513559999999,40.7676919],"street":"West 57 Street","zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":1409961600000},"grade":"A","score":2},{"date":{"$date":1374451200000},"grade":"A","score":11},{"date":{"$date":1343692800000},"grade":"A","score":12},{"date":{"$date":1325116800000},"grade":"A","score":12}],"name":"Dj Reynolds Pub And Restaurant","restaurant_id":"30191841"} +DROP TABLE t1; +# +# Test catfunc +# +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants CATFUNC=columns +OPTION_LIST='Level=1,Driver=Java,Version=3' DATA_CHARSET=utf8 CONNECTION='mongodb://localhost:27017' LRECL=4096; +SELECT * from t1; +Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Nullable Jpath +_id 1 CHAR 24 24 0 0 _id +address_building 1 CHAR 10 10 0 0 address.building +address_coord 1 CHAR 256 256 0 1 address.coord +address_street 1 CHAR 38 38 0 0 address.street +address_zipcode 1 CHAR 5 5 0 0 address.zipcode +borough 1 CHAR 13 13 0 0 +cuisine 1 CHAR 64 64 0 0 +grades 1 CHAR 0 0 0 1 +grades_date 1 CHAR 256 256 0 1 grades.0.date +grades_grade 1 CHAR 14 14 0 1 grades.0.grade +grades_score 5 BIGINT 2 2 0 1 grades.0.score +name 1 CHAR 98 98 0 0 +restaurant_id 1 CHAR 8 8 0 0 +DROP TABLE t1; +# +# Explicit columns +# +CREATE TABLE t1 ( +_id VARCHAR(24) NOT NULL, +name VARCHAR(255) NOT NULL, +cuisine VARCHAR(255) NOT NULL, +borough VARCHAR(255) NOT NULL, +restaurant_id VARCHAR(255) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants +CONNECTION='mongodb://localhost:27017' LRECL=1024 DATA_CHARSET=utf8 +OPTION_LIST='Driver=Java,Version=3'; +SELECT * FROM t1 LIMIT 10; +_id name cuisine borough restaurant_id +58ada47de5a51ddfcd5ed51c Morris Park Bake Shop Bakery Bronx 30075445 +58ada47de5a51ddfcd5ed51d Wendy'S Hamburgers Brooklyn 30112340 +58ada47de5a51ddfcd5ed51e Dj Reynolds Pub And Restaurant Irish Manhattan 30191841 +58ada47de5a51ddfcd5ed51f Riviera Caterer American Brooklyn 40356018 +58ada47de5a51ddfcd5ed520 Tov Kosher Kitchen Jewish/Kosher Queens 40356068 +58ada47de5a51ddfcd5ed521 Brunos On The Boulevard American Queens 40356151 +58ada47de5a51ddfcd5ed522 Kosher Island Jewish/Kosher Staten Island 40356442 +58ada47de5a51ddfcd5ed523 Wilken'S Fine Food Delicatessen Brooklyn 40356483 +58ada47de5a51ddfcd5ed524 Regina Caterers American Brooklyn 40356649 +58ada47de5a51ddfcd5ed525 Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn 40356731 +DROP TABLE t1; +# +# Test discovery +# +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants +OPTION_LIST='Level=1,Driver=Java,Version=3' CONNECTION='mongodb://localhost:27017' LRECL=4096 DATA_CHARSET=utf8; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `_id` char(24) NOT NULL `FIELD_FORMAT`='_id', + `address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building', + `address_coord` varchar(256) DEFAULT NULL `FIELD_FORMAT`='address.coord', + `address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street', + `address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode', + `borough` char(13) NOT NULL, + `cuisine` char(64) NOT NULL, + `grades` char(1) DEFAULT NULL, + `grades_date` varchar(256) DEFAULT NULL `FIELD_FORMAT`='grades.0.date', + `grades_grade` char(14) DEFAULT NULL `FIELD_FORMAT`='grades.0.grade', + `grades_score` bigint(2) DEFAULT NULL `FIELD_FORMAT`='grades.0.score', + `name` char(98) NOT NULL, + `restaurant_id` char(8) NOT NULL +) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='mongodb://localhost:27017' `TABLE_TYPE`='JSON' `TABNAME`='restaurants' `OPTION_LIST`='Level=1,Driver=Java,Version=3' `DATA_CHARSET`='utf8' `LRECL`=4096 +SELECT * FROM t1 LIMIT 5; +_id address_building address_coord address_street address_zipcode borough cuisine grades grades_date grades_grade grades_score name restaurant_id +58ada47de5a51ddfcd5ed51c 1007 -73.856077 Morris Park Ave 10462 Bronx Bakery 1 1393804800 A 2 Morris Park Bake Shop 30075445 +58ada47de5a51ddfcd5ed51d 469 -73.961704 Flatbush Avenue 11225 Brooklyn Hamburgers 1 1419897600 A 8 Wendy'S 30112340 +58ada47de5a51ddfcd5ed51e 351 -73.98513559999999 West 57 Street 10019 Manhattan Irish 1 1409961600 A 2 Dj Reynolds Pub And Restaurant 30191841 +58ada47de5a51ddfcd5ed51f 2780 -73.98241999999999 Stillwell Avenue 11224 Brooklyn American 1 1402358400 A 5 Riviera Caterer 40356018 +58ada47de5a51ddfcd5ed520 97-22 -73.8601152 63 Road 11374 Queens Jewish/Kosher 1 1416787200 Z 20 Tov Kosher Kitchen 40356068 +DROP TABLE t1; +# +# Dropping a column +# +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants DATA_CHARSET=utf8 +COLIST='{"grades":0}' OPTION_LIST='Driver=Java,Version=3,level=0' CONNECTION='mongodb://localhost:27017' LRECL=4096; +SELECT * FROM t1 LIMIT 10; +_id address borough cuisine name restaurant_id +58ada47de5a51ddfcd5ed51c 1007 -73.856077 40.848447 Morris Park Ave 10462 Bronx Bakery Morris Park Bake Shop 30075445 +58ada47de5a51ddfcd5ed51d 469 -73.961704 40.662942 Flatbush Avenue 11225 Brooklyn Hamburgers Wendy'S 30112340 +58ada47de5a51ddfcd5ed51e 351 -73.98513559999999 40.7676919 West 57 Street 10019 Manhattan Irish Dj Reynolds Pub And Restaurant 30191841 +58ada47de5a51ddfcd5ed51f 2780 -73.98241999999999 40.579505 Stillwell Avenue 11224 Brooklyn American Riviera Caterer 40356018 +58ada47de5a51ddfcd5ed520 97-22 -73.8601152 40.7311739 63 Road 11374 Queens Jewish/Kosher Tov Kosher Kitchen 40356068 +58ada47de5a51ddfcd5ed521 8825 -73.8803827 40.7643124 Astoria Boulevard 11369 Queens American Brunos On The Boulevard 40356151 +58ada47de5a51ddfcd5ed522 2206 -74.1377286 40.6119572 Victory Boulevard 10314 Staten Island Jewish/Kosher Kosher Island 40356442 +58ada47de5a51ddfcd5ed523 7114 -73.9068506 40.6199034 Avenue U 11234 Brooklyn Delicatessen Wilken'S Fine Food 40356483 +58ada47de5a51ddfcd5ed524 6409 -74.00528899999999 40.628886 11 Avenue 11219 Brooklyn American Regina Caterers 40356649 +58ada47de5a51ddfcd5ed525 1839 -73.9482609 40.6408271 Nostrand Avenue 11226 Brooklyn Ice Cream, Gelato, Yogurt, Ices Taste The Tropics Ice Cream 40356731 +DROP TABLE t1; +# +# Specifying Jpath +# +CREATE TABLE t1 ( +_id VARCHAR(24) NOT NULL, +name VARCHAR(64) NOT NULL, +cuisine CHAR(200) NOT NULL, +borough CHAR(16) NOT NULL, +street VARCHAR(65) FIELD_FORMAT='address.street', +building CHAR(16) FIELD_FORMAT='address.building', +zipcode CHAR(5) FIELD_FORMAT='address.zipcode', +grade CHAR(1) FIELD_FORMAT='grades.0.grade', +score INT(4) NOT NULL FIELD_FORMAT='grades.0.score', +`date` DATE FIELD_FORMAT='grades.0.date', +restaurant_id VARCHAR(255) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='restaurants' DATA_CHARSET=utf8 +OPTION_LIST='Driver=Java,Version=3' CONNECTION='mongodb://localhost:27017' LRECL=4096; +SELECT * FROM t1 LIMIT 1; +_id 58ada47de5a51ddfcd5ed51c +name Morris Park Bake Shop +cuisine Bakery +borough Bronx +street Morris Park Ave +building 1007 +zipcode 10462 +grade A +score 2 +date 2014-03-03 +restaurant_id 30075445 +SELECT name, street, score, date FROM t1 LIMIT 5; +name street score date +Morris Park Bake Shop Morris Park Ave 2 2014-03-03 +Wendy'S Flatbush Avenue 8 2014-12-30 +Dj Reynolds Pub And Restaurant West 57 Street 2 2014-09-06 +Riviera Caterer Stillwell Avenue 5 2014-06-10 +Tov Kosher Kitchen 63 Road 20 2014-11-24 +SELECT name, cuisine, borough FROM t1 WHERE grade = 'A' LIMIT 10; +name cuisine borough +Morris Park Bake Shop Bakery Bronx +Wendy'S Hamburgers Brooklyn +Dj Reynolds Pub And Restaurant Irish Manhattan +Riviera Caterer American Brooklyn +Kosher Island Jewish/Kosher Staten Island +Wilken'S Fine Food Delicatessen Brooklyn +Regina Caterers American Brooklyn +Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn +Wild Asia American Bronx +C & C Catering Service American Brooklyn +SELECT COUNT(*) FROM t1 WHERE grade = 'A'; +COUNT(*) +20687 +SELECT * FROM t1 WHERE cuisine = 'English'; +_id name cuisine borough street building zipcode grade score date restaurant_id +58ada47de5a51ddfcd5ed83d Tea And Sympathy English Manhattan Greenwich Avenue 108 10011 A 8 2014-10-23 40391531 +58ada47de5a51ddfcd5ed85c Tartine English Manhattan West 11 Street 253 10014 A 11 2014-08-14 40392496 +58ada47de5a51ddfcd5ee1f3 The Park Slope Chipshop English Brooklyn 5 Avenue 383 11215 B 17 2014-09-29 40816202 +58ada47de5a51ddfcd5ee7e4 Pound And Pence English Manhattan Liberty Street 55 10005 A 7 2014-02-11 41022701 +58ada47de5a51ddfcd5ee999 Chip Shop English Brooklyn Atlantic Avenue 129 11201 A 9 2014-10-08 41076583 +58ada47ee5a51ddfcd5efe3f The Breslin Bar & Dining Room English Manhattan West 29 Street 16 10001 A 13 2014-06-09 41443706 +58ada47ee5a51ddfcd5efe99 Highlands Restaurant English Manhattan West 10 Street 150 10014 A 12 2014-10-22 41448559 +58ada47ee5a51ddfcd5f0413 The Fat Radish English Manhattan Orchard Street 17 10002 A 12 2014-07-26 41513545 +58ada47ee5a51ddfcd5f0777 Jones Wood Foundry English Manhattan East 76 Street 401 10021 A 12 2014-12-03 41557377 +58ada47ee5a51ddfcd5f0ea2 Whitehall English Manhattan Greenwich Avenue 19 10014 Z 15 2015-01-16 41625263 +58ada47ee5a51ddfcd5f1004 The Churchill Tavern English Manhattan East 28 Street 45 10016 A 13 2014-08-27 41633327 +58ada47ee5a51ddfcd5f13d5 The Monro English Brooklyn 5 Avenue 481 11215 A 7 2014-06-03 41660253 +58ada47ee5a51ddfcd5f1454 The Cock & Bull English Manhattan West 45 Street 23 10036 A 7 2014-08-07 41664704 +58ada47ee5a51ddfcd5f176e Dear Bushwick English Brooklyn Wilson Avenue 41 11237 A 12 2014-12-27 41690534 +58ada47ee5a51ddfcd5f1e91 Snowdonia Pub English Queens 32 Street 34-55 11106 A 12 2014-10-28 50000290 +58ada47ee5a51ddfcd5f2ddc Oscar'S Place English Manhattan Hudson Street 466 10014 A 10 2014-08-18 50011097 +SELECT * FROM t1 WHERE score = building; +_id name cuisine borough street building zipcode grade score date restaurant_id +DROP TABLE t1; +# +# Specifying Filter +# +CREATE TABLE t1 ( +_id CHAR(24) NOT NULL, +name CHAR(64) NOT NULL, +borough CHAR(16) NOT NULL, +restaurant_id CHAR(8) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants DATA_CHARSET=utf8 +FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' +OPTION_LIST='Driver=Java,Version=3' CONNECTION='mongodb://localhost:27017' LRECL=4096; +SELECT name FROM t1 WHERE borough = 'Queens'; +name +La Baraka Restaurant +Air France Lounge +Tournesol +Winegasm +Cafe Henri +Bistro 33 +Domaine Wine Bar +Cafe Triskell +Cannelle Patisserie +La Vie +Dirty Pierres Bistro +Fresca La Crepe +Bliss 46 Bistro +Bear +Cuisine By Claudette +Paris Baguette +The Baroness Bar +Francis Cafe +Madame Sou Sou +Crepe 'N' Tearia +Aperitif Bayside Llc +DROP TABLE t1; +# +# Testing pipeline +# +CREATE TABLE t1 ( +name VARCHAR(64) NOT NULL, +borough CHAR(16) NOT NULL, +date DATETIME NOT NULL, +grade CHAR(1) NOT NULL, +score INT(4) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='restaurants' DATA_CHARSET=utf8 +COLIST='{"pipeline":[{"$match":{"cuisine":"French"}},{"$unwind":"$grades"},{"$project":{"_id":0,"name":1,"borough":1,"date":"$grades.date","grade":"$grades.grade","score":"$grades.score"}}]}' +OPTION_LIST='Driver=Java,Version=3,Pipeline=1' CONNECTION='mongodb://localhost:27017' LRECL=4096; +SELECT * FROM t1 LIMIT 10; +name borough date grade score +Tout Va Bien Manhattan 2014-11-10 01:00:00 B 15 +Tout Va Bien Manhattan 2014-04-03 02:00:00 A 13 +Tout Va Bien Manhattan 2013-07-17 02:00:00 C 36 +Tout Va Bien Manhattan 2013-02-06 01:00:00 B 22 +Tout Va Bien Manhattan 2012-07-16 02:00:00 C 36 +Tout Va Bien Manhattan 2012-03-08 01:00:00 C 7 +La Grenouille Manhattan 2014-04-09 02:00:00 A 10 +La Grenouille Manhattan 2013-03-05 01:00:00 A 9 +La Grenouille Manhattan 2012-02-02 01:00:00 A 13 +Le Perigord Manhattan 2014-07-14 02:00:00 B 14 +SELECT name, grade, score, date FROM t1 WHERE borough = 'Bronx'; +name grade score date +Bistro Sk A 10 2014-11-21 01:00:00 +Bistro Sk A 12 2014-02-19 01:00:00 +Bistro Sk B 18 2013-06-12 02:00:00 +DROP TABLE t1; +# +# try level 2 discovery +# +CREATE TABLE t1 +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants +FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' +COLIST='{"cuisine":0}' CONNECTION='mongodb://localhost:27017' LRECL=4096 +OPTION_LIST='Driver=Java,level=2,version=3'; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `_id` char(24) NOT NULL `FIELD_FORMAT`='_id', + `address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building', + `address_coord` double(18,16) DEFAULT NULL `FIELD_FORMAT`='address.coord.0', + `address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street', + `address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode', + `borough` char(13) NOT NULL, + `grades` char(1) DEFAULT NULL, + `grades_date` bigint(13) DEFAULT NULL `FIELD_FORMAT`='grades.0.date', + `grades_grade` char(14) DEFAULT NULL `FIELD_FORMAT`='grades.0.grade', + `grades_score` bigint(2) DEFAULT NULL `FIELD_FORMAT`='grades.0.score', + `name` char(98) NOT NULL, + `restaurant_id` char(8) NOT NULL +) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='mongodb://localhost:27017' `TABLE_TYPE`='JSON' `TABNAME`='restaurants' `COLIST`='{"cuisine":0}' `FILTER`='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' `OPTION_LIST`='Driver=Java,level=2,version=3' `LRECL`=4096 +SELECT name, borough, address_street, grades_score AS score FROM t1 WHERE grades_grade = 'B'; +name borough address_street score +Le Gamin Brooklyn Vanderbilt Avenue 24 +Bistro 33 Queens Ditmars Boulevard 15 +Dirty Pierres Bistro Queens Station Square 22 +Santos Anne Brooklyn Union Avenue 26 +Le Paddock Brooklyn Prospect Avenue 17 +La Crepe Et La Vie Brooklyn Foster Avenue 24 +Francis Cafe Queens Ditmars Boulevard 19 +DROP TABLE t1; +# +# try CRUD operations +# +false +CREATE TABLE t1 (_id INT(4) NOT NULL, msg CHAR(64)) +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='testcoll' +OPTION_LIST='Driver=Java,Version=3' CONNECTION='mongodb://localhost:27017' LRECL=4096; +DELETE FROM t1; +INSERT INTO t1 VALUES(0,NULL),(1,'One'),(2,'Two'),(3,'Three'); +SELECT * FROM t1; +_id msg +0 NULL +1 One +2 Two +3 Three +UPDATE t1 SET msg = 'Deux' WHERE _id = 2; +DELETE FROM t1 WHERE msg IS NULL; +SELECT * FROM t1; +_id msg +1 One +2 Deux +3 Three +DELETE FROM t1; +DROP TABLE t1; +true +# +# List states whose population is equal or more than 10 millions +# +false +CREATE TABLE t1 ( +_id char(5) NOT NULL, +city char(16) NOT NULL, +loc_0 double(12,6) NOT NULL `FIELD_FORMAT`='loc.0', +loc_1 char(12) NOT NULL `FIELD_FORMAT`='loc.1', +pop int(11) NOT NULL, +state char(2) NOT NULL) +ENGINE=CONNECT CONNECTION='mongodb://localhost:27017' TABLE_TYPE='MONGO' TABNAME='cities' +OPTION_LIST='Driver=Java,Version=3' CONNECTION='mongodb://localhost:27017' LRECL=4096 DATA_CHARSET='utf8'; +# Using SQL for grouping +SELECT state, sum(pop) AS totalPop FROM t1 GROUP BY state HAVING totalPop >= 10000000 ORDER BY totalPop DESC; +state totalPop +CA 29754890 +NY 17990402 +TX 16984601 +FL 12686644 +PA 11881643 +IL 11427576 +OH 10846517 +DROP TABLE t1; +# Using a pipeline for grouping +CREATE TABLE t1 (_id CHAR(2) NOT NULL, totalPop INT(11) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='cities' DATA_CHARSET=utf8 +COLIST='{"pipeline":[{"$group":{"_id":"$state","totalPop":{"$sum":"$pop"}}},{"$match":{"totalPop":{"$gte":10000000}}},{"$sort":{"totalPop":-1}}]}' +OPTION_LIST='Driver=Java,Version=3,Pipeline=1' CONNECTION='mongodb://localhost:27017' LRECL=4096; +SELECT * FROM t1; +_id totalPop +CA 29754890 +NY 17990402 +TX 16984601 +FL 12686644 +PA 11881643 +IL 11427576 +OH 10846517 +DROP TABLE t1; +true +# +# Test making array +# +CREATE TABLE t1 ( +_id int(4) NOT NULL, +item CHAR(8) NOT NULL, +prices_0 INT(6) FIELD_FORMAT='prices.0', +prices_1 INT(6) FIELD_FORMAT='prices.1', +prices_2 INT(6) FIELD_FORMAT='prices.2', +prices_3 INT(6) FIELD_FORMAT='prices.3', +prices_4 INT(6) FIELD_FORMAT='prices.4') +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='testcoll' DATA_CHARSET=utf8 +OPTION_LIST='Driver=Java,Version=3' CONNECTION='mongodb://localhost:27017' LRECL=4096; +INSERT INTO t1 VALUES +(1,'journal',87,45,63,12,78), +(2,'notebook',123,456,789,NULL,NULL), +(3,'paper',5,7,3,8,NULL), +(4,'planner',25,71,NULL,44,27), +(5,'postcard',5,7,3,8,NULL); +SELECT * FROM t1; +_id item prices_0 prices_1 prices_2 prices_3 prices_4 +1 journal 87 45 63 12 78 +2 notebook 123 456 789 NULL NULL +3 paper 5 7 3 8 NULL +4 planner 25 71 NULL 44 27 +5 postcard 5 7 3 8 NULL +DROP TABLE t1; +# +# Test array aggregation +# +CREATE TABLE t1 +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='testcoll' +COLIST='{"pipeline":[{"$project":{"_id":0,"item":1,"total":{"$sum":"$prices"},"average":{"$avg":"$prices"}}}]}' +OPTION_LIST='Driver=Java,Version=3,Pipeline=YES' CONNECTION='mongodb://localhost:27017' LRECL=4096; +SELECT * FROM t1; +item total average +journal 285 57.00 +notebook 1368 456.00 +paper 23 5.75 +planner 167 41.75 +postcard 23 5.75 +DROP TABLE t1; +true diff --git a/storage/connect/mysql-test/connect/r/json_mongo_c.result b/storage/connect/mysql-test/connect/r/json_mongo_c.result new file mode 100644 index 00000000000..d3363f39eab --- /dev/null +++ b/storage/connect/mysql-test/connect/r/json_mongo_c.result @@ -0,0 +1,385 @@ +# +# Test the MONGO table type +# +CREATE TABLE t1 (Document varchar(1024) field_format='*') +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants CONNECTION='mongodb://localhost:27017' LRECL=1024 +OPTION_LIST='Driver=C,Version=0' DATA_CHARSET=utf8; +SELECT * from t1 limit 3; +Document +{"_id":{"$oid":"58ada47de5a51ddfcd5ed51c"},"address":{"building":"1007","coord":[-73.856076999999999089,40.848447000000000173],"street":"Morris Park Ave","zipcode":"10462"},"borough":"Bronx","cuisine":"Bakery","grades":[{"date":{"$date":1393804800000},"grade":"A","score":2},{"date":{"$date":1378857600000},"grade":"A","score":6},{"date":{"$date":1358985600000},"grade":"A","score":10},{"date":{"$date":1322006400000},"grade":"A","score":9},{"date":{"$date":1299715200000},"grade":"B","score":14}],"name":"Morris Park Bake Shop","restaurant_id":"30075445"} +{"_id":{"$oid":"58ada47de5a51ddfcd5ed51d"},"address":{"building":"469","coord":[-73.96170399999999745,40.66294200000000103],"street":"Flatbush Avenue","zipcode":"11225"},"borough":"Brooklyn","cuisine":"Hamburgers","grades":[{"date":{"$date":1419897600000},"grade":"A","score":8},{"date":{"$date":1404172800000},"grade":"B","score":23},{"date":{"$date":1367280000000},"grade":"A","score":12},{"date":{"$date":1336435200000},"grade":"A","score":12}],"name":"Wendy'S","restaurant_id":"30112340"} +{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.985135599999992451,40.767691900000002647],"street":"West 57 Street","zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":1409961600000},"grade":"A","score":2},{"date":{"$date":1374451200000},"grade":"A","score":11},{"date":{"$date":1343692800000},"grade":"A","score":12},{"date":{"$date":1325116800000},"grade":"A","score":12}],"name":"Dj Reynolds Pub And Restaurant","restaurant_id":"30191841"} +DROP TABLE t1; +# +# Test catfunc +# +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants CATFUNC=columns +OPTION_LIST='Level=1,Driver=C,Version=0' DATA_CHARSET=utf8 CONNECTION='mongodb://localhost:27017' LRECL=1024; +SELECT * from t1; +Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Nullable Jpath +_id 1 CHAR 24 24 0 0 _id +address_building 1 CHAR 10 10 0 0 address.building +address_coord 1 CHAR 256 256 0 1 address.coord +address_street 1 CHAR 38 38 0 0 address.street +address_zipcode 1 CHAR 5 5 0 0 address.zipcode +borough 1 CHAR 13 13 0 0 +cuisine 1 CHAR 64 64 0 0 +grades 1 CHAR 0 0 0 1 +grades_date 1 CHAR 256 256 0 1 grades.0.date +grades_grade 1 CHAR 14 14 0 1 grades.0.grade +grades_score 5 BIGINT 2 2 0 1 grades.0.score +name 1 CHAR 98 98 0 0 +restaurant_id 1 CHAR 8 8 0 0 +DROP TABLE t1; +# +# Explicit columns +# +CREATE TABLE t1 ( +_id VARCHAR(24) NOT NULL, +name VARCHAR(255) NOT NULL, +cuisine VARCHAR(255) NOT NULL, +borough VARCHAR(255) NOT NULL, +restaurant_id VARCHAR(255) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants +CONNECTION='mongodb://localhost:27017' LRECL=1024 DATA_CHARSET=utf8 +OPTION_LIST='Driver=C,Version=0'; +SELECT * FROM t1 LIMIT 10; +_id name cuisine borough restaurant_id +58ada47de5a51ddfcd5ed51c Morris Park Bake Shop Bakery Bronx 30075445 +58ada47de5a51ddfcd5ed51d Wendy'S Hamburgers Brooklyn 30112340 +58ada47de5a51ddfcd5ed51e Dj Reynolds Pub And Restaurant Irish Manhattan 30191841 +58ada47de5a51ddfcd5ed51f Riviera Caterer American Brooklyn 40356018 +58ada47de5a51ddfcd5ed520 Tov Kosher Kitchen Jewish/Kosher Queens 40356068 +58ada47de5a51ddfcd5ed521 Brunos On The Boulevard American Queens 40356151 +58ada47de5a51ddfcd5ed522 Kosher Island Jewish/Kosher Staten Island 40356442 +58ada47de5a51ddfcd5ed523 Wilken'S Fine Food Delicatessen Brooklyn 40356483 +58ada47de5a51ddfcd5ed524 Regina Caterers American Brooklyn 40356649 +58ada47de5a51ddfcd5ed525 Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn 40356731 +DROP TABLE t1; +# +# Test discovery +# +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants +OPTION_LIST='Level=1,Driver=C,Version=0' CONNECTION='mongodb://localhost:27017' LRECL=1024 DATA_CHARSET=utf8; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `_id` char(24) NOT NULL `FIELD_FORMAT`='_id', + `address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building', + `address_coord` varchar(256) DEFAULT NULL `FIELD_FORMAT`='address.coord', + `address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street', + `address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode', + `borough` char(13) NOT NULL, + `cuisine` char(64) NOT NULL, + `grades` char(1) DEFAULT NULL, + `grades_date` varchar(256) DEFAULT NULL `FIELD_FORMAT`='grades.0.date', + `grades_grade` char(14) DEFAULT NULL `FIELD_FORMAT`='grades.0.grade', + `grades_score` bigint(2) DEFAULT NULL `FIELD_FORMAT`='grades.0.score', + `name` char(98) NOT NULL, + `restaurant_id` char(8) NOT NULL +) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='mongodb://localhost:27017' `TABLE_TYPE`='JSON' `TABNAME`='restaurants' `OPTION_LIST`='Level=1,Driver=C,Version=0' `DATA_CHARSET`='utf8' `LRECL`=1024 +SELECT * FROM t1 LIMIT 5; +_id address_building address_coord address_street address_zipcode borough cuisine grades grades_date grades_grade grades_score name restaurant_id +58ada47de5a51ddfcd5ed51c 1007 -73.856076999999999089 Morris Park Ave 10462 Bronx Bakery 1 1393804800 A 2 Morris Park Bake Shop 30075445 +58ada47de5a51ddfcd5ed51d 469 -73.96170399999999745 Flatbush Avenue 11225 Brooklyn Hamburgers 1 1419897600 A 8 Wendy'S 30112340 +58ada47de5a51ddfcd5ed51e 351 -73.985135599999992451 West 57 Street 10019 Manhattan Irish 1 1409961600 A 2 Dj Reynolds Pub And Restaurant 30191841 +58ada47de5a51ddfcd5ed51f 2780 -73.982419999999990523 Stillwell Avenue 11224 Brooklyn American 1 1402358400 A 5 Riviera Caterer 40356018 +58ada47de5a51ddfcd5ed520 97-22 -73.860115199999995639 63 Road 11374 Queens Jewish/Kosher 1 1416787200 Z 20 Tov Kosher Kitchen 40356068 +DROP TABLE t1; +# +# Dropping a column +# +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants DATA_CHARSET=utf8 +COLIST='{"projection":{"grades":0}}' OPTION_LIST='Driver=C,Version=0,level=0' CONNECTION='mongodb://localhost:27017' LRECL=1024; +SELECT * FROM t1 LIMIT 10; +_id address borough cuisine name restaurant_id +58ada47de5a51ddfcd5ed51c 1007 -73.856076999999999089 40.848447000000000173 Morris Park Ave 10462 Bronx Bakery Morris Park Bake Shop 30075445 +58ada47de5a51ddfcd5ed51d 469 -73.96170399999999745 40.66294200000000103 Flatbush Avenue 11225 Brooklyn Hamburgers Wendy'S 30112340 +58ada47de5a51ddfcd5ed51e 351 -73.985135599999992451 40.767691900000002647 West 57 Street 10019 Manhattan Irish Dj Reynolds Pub And Restaurant 30191841 +58ada47de5a51ddfcd5ed51f 2780 -73.982419999999990523 40.579504999999997494 Stillwell Avenue 11224 Brooklyn American Riviera Caterer 40356018 +58ada47de5a51ddfcd5ed520 97-22 -73.860115199999995639 40.731173900000001709 63 Road 11374 Queens Jewish/Kosher Tov Kosher Kitchen 40356068 +58ada47de5a51ddfcd5ed521 8825 -73.880382699999998408 40.764312400000001446 Astoria Boulevard 11369 Queens American Brunos On The Boulevard 40356151 +58ada47de5a51ddfcd5ed522 2206 -74.137728600000002643 40.611957199999999091 Victory Boulevard 10314 Staten Island Jewish/Kosher Kosher Island 40356442 +58ada47de5a51ddfcd5ed523 7114 -73.906850599999998508 40.619903399999998328 Avenue U 11234 Brooklyn Delicatessen Wilken'S Fine Food 40356483 +58ada47de5a51ddfcd5ed524 6409 -74.005288999999990551 40.628886000000001388 11 Avenue 11219 Brooklyn American Regina Caterers 40356649 +58ada47de5a51ddfcd5ed525 1839 -73.948260899999993967 40.640827100000002758 Nostrand Avenue 11226 Brooklyn Ice Cream, Gelato, Yogurt, Ices Taste The Tropics Ice Cream 40356731 +DROP TABLE t1; +# +# Specifying Jpath +# +CREATE TABLE t1 ( +_id VARCHAR(24) NOT NULL, +name VARCHAR(64) NOT NULL, +cuisine CHAR(200) NOT NULL, +borough CHAR(16) NOT NULL, +street VARCHAR(65) FIELD_FORMAT='address.street', +building CHAR(16) FIELD_FORMAT='address.building', +zipcode CHAR(5) FIELD_FORMAT='address.zipcode', +grade CHAR(1) FIELD_FORMAT='grades.0.grade', +score INT(4) NOT NULL FIELD_FORMAT='grades.0.score', +`date` DATE FIELD_FORMAT='grades.0.date', +restaurant_id VARCHAR(255) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='restaurants' DATA_CHARSET=utf8 +OPTION_LIST='Driver=C,Version=0' CONNECTION='mongodb://localhost:27017' LRECL=1024; +SELECT * FROM t1 LIMIT 1; +_id 58ada47de5a51ddfcd5ed51c +name Morris Park Bake Shop +cuisine Bakery +borough Bronx +street Morris Park Ave +building 1007 +zipcode 10462 +grade A +score 2 +date 2014-03-03 +restaurant_id 30075445 +SELECT name, street, score, date FROM t1 LIMIT 5; +name street score date +Morris Park Bake Shop Morris Park Ave 2 2014-03-03 +Wendy'S Flatbush Avenue 8 2014-12-30 +Dj Reynolds Pub And Restaurant West 57 Street 2 2014-09-06 +Riviera Caterer Stillwell Avenue 5 2014-06-10 +Tov Kosher Kitchen 63 Road 20 2014-11-24 +SELECT name, cuisine, borough FROM t1 WHERE grade = 'A' LIMIT 10; +name cuisine borough +Morris Park Bake Shop Bakery Bronx +Wendy'S Hamburgers Brooklyn +Dj Reynolds Pub And Restaurant Irish Manhattan +Riviera Caterer American Brooklyn +Kosher Island Jewish/Kosher Staten Island +Wilken'S Fine Food Delicatessen Brooklyn +Regina Caterers American Brooklyn +Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn +Wild Asia American Bronx +C & C Catering Service American Brooklyn +SELECT COUNT(*) FROM t1 WHERE grade = 'A'; +COUNT(*) +20687 +SELECT * FROM t1 WHERE cuisine = 'English'; +_id name cuisine borough street building zipcode grade score date restaurant_id +58ada47de5a51ddfcd5ed83d Tea And Sympathy English Manhattan Greenwich Avenue 108 10011 A 8 2014-10-23 40391531 +58ada47de5a51ddfcd5ed85c Tartine English Manhattan West 11 Street 253 10014 A 11 2014-08-14 40392496 +58ada47de5a51ddfcd5ee1f3 The Park Slope Chipshop English Brooklyn 5 Avenue 383 11215 B 17 2014-09-29 40816202 +58ada47de5a51ddfcd5ee7e4 Pound And Pence English Manhattan Liberty Street 55 10005 A 7 2014-02-11 41022701 +58ada47de5a51ddfcd5ee999 Chip Shop English Brooklyn Atlantic Avenue 129 11201 A 9 2014-10-08 41076583 +58ada47ee5a51ddfcd5efe3f The Breslin Bar & Dining Room English Manhattan West 29 Street 16 10001 A 13 2014-06-09 41443706 +58ada47ee5a51ddfcd5efe99 Highlands Restaurant English Manhattan West 10 Street 150 10014 A 12 2014-10-22 41448559 +58ada47ee5a51ddfcd5f0413 The Fat Radish English Manhattan Orchard Street 17 10002 A 12 2014-07-26 41513545 +58ada47ee5a51ddfcd5f0777 Jones Wood Foundry English Manhattan East 76 Street 401 10021 A 12 2014-12-03 41557377 +58ada47ee5a51ddfcd5f0ea2 Whitehall English Manhattan Greenwich Avenue 19 10014 Z 15 2015-01-16 41625263 +58ada47ee5a51ddfcd5f1004 The Churchill Tavern English Manhattan East 28 Street 45 10016 A 13 2014-08-27 41633327 +58ada47ee5a51ddfcd5f13d5 The Monro English Brooklyn 5 Avenue 481 11215 A 7 2014-06-03 41660253 +58ada47ee5a51ddfcd5f1454 The Cock & Bull English Manhattan West 45 Street 23 10036 A 7 2014-08-07 41664704 +58ada47ee5a51ddfcd5f176e Dear Bushwick English Brooklyn Wilson Avenue 41 11237 A 12 2014-12-27 41690534 +58ada47ee5a51ddfcd5f1e91 Snowdonia Pub English Queens 32 Street 34-55 11106 A 12 2014-10-28 50000290 +58ada47ee5a51ddfcd5f2ddc Oscar'S Place English Manhattan Hudson Street 466 10014 A 10 2014-08-18 50011097 +SELECT * FROM t1 WHERE score = building; +_id name cuisine borough street building zipcode grade score date restaurant_id +DROP TABLE t1; +# +# Specifying Filter +# +CREATE TABLE t1 ( +_id CHAR(24) NOT NULL, +name CHAR(64) NOT NULL, +borough CHAR(16) NOT NULL, +restaurant_id CHAR(8) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants DATA_CHARSET=utf8 +FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' +OPTION_LIST='Driver=C,Version=0' CONNECTION='mongodb://localhost:27017' LRECL=1024; +SELECT name FROM t1 WHERE borough = 'Queens'; +name +La Baraka Restaurant +Air France Lounge +Tournesol +Winegasm +Cafe Henri +Bistro 33 +Domaine Wine Bar +Cafe Triskell +Cannelle Patisserie +La Vie +Dirty Pierres Bistro +Fresca La Crepe +Bliss 46 Bistro +Bear +Cuisine By Claudette +Paris Baguette +The Baroness Bar +Francis Cafe +Madame Sou Sou +Crepe 'N' Tearia +Aperitif Bayside Llc +DROP TABLE t1; +# +# Testing pipeline +# +CREATE TABLE t1 ( +name VARCHAR(64) NOT NULL, +borough CHAR(16) NOT NULL, +date DATETIME NOT NULL, +grade CHAR(1) NOT NULL, +score INT(4) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='restaurants' DATA_CHARSET=utf8 +COLIST='{"pipeline":[{"$match":{"cuisine":"French"}},{"$unwind":"$grades"},{"$project":{"_id":0,"name":1,"borough":1,"date":"$grades.date","grade":"$grades.grade","score":"$grades.score"}}]}' +OPTION_LIST='Driver=C,Version=0,Pipeline=1' CONNECTION='mongodb://localhost:27017' LRECL=1024; +SELECT * FROM t1 LIMIT 10; +name borough date grade score +Tout Va Bien Manhattan 2014-11-10 01:00:00 B 15 +Tout Va Bien Manhattan 2014-04-03 02:00:00 A 13 +Tout Va Bien Manhattan 2013-07-17 02:00:00 C 36 +Tout Va Bien Manhattan 2013-02-06 01:00:00 B 22 +Tout Va Bien Manhattan 2012-07-16 02:00:00 C 36 +Tout Va Bien Manhattan 2012-03-08 01:00:00 C 7 +La Grenouille Manhattan 2014-04-09 02:00:00 A 10 +La Grenouille Manhattan 2013-03-05 01:00:00 A 9 +La Grenouille Manhattan 2012-02-02 01:00:00 A 13 +Le Perigord Manhattan 2014-07-14 02:00:00 B 14 +SELECT name, grade, score, date FROM t1 WHERE borough = 'Bronx'; +name grade score date +Bistro Sk A 10 2014-11-21 01:00:00 +Bistro Sk A 12 2014-02-19 01:00:00 +Bistro Sk B 18 2013-06-12 02:00:00 +DROP TABLE t1; +# +# try level 2 discovery +# +CREATE TABLE t1 +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants +FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' +COLIST='{"projection":{"cuisine":0}}' CONNECTION='mongodb://localhost:27017' LRECL=1024 +OPTION_LIST='Driver=C,level=2,version=0'; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `_id` char(24) NOT NULL `FIELD_FORMAT`='_id', + `address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building', + `address_coord` double(23,20) DEFAULT NULL `FIELD_FORMAT`='address.coord.0', + `address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street', + `address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode', + `borough` char(13) NOT NULL, + `grades` char(1) DEFAULT NULL, + `grades_date` bigint(13) DEFAULT NULL `FIELD_FORMAT`='grades.0.date', + `grades_grade` char(14) DEFAULT NULL `FIELD_FORMAT`='grades.0.grade', + `grades_score` bigint(2) DEFAULT NULL `FIELD_FORMAT`='grades.0.score', + `name` char(98) NOT NULL, + `restaurant_id` char(8) NOT NULL +) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='mongodb://localhost:27017' `TABLE_TYPE`='JSON' `TABNAME`='restaurants' `COLIST`='{"projection":{"cuisine":0}}' `FILTER`='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' `OPTION_LIST`='Driver=C,level=2,version=0' `LRECL`=1024 +SELECT name, borough, address_street, grades_score AS score FROM t1 WHERE grades_grade = 'B'; +name borough address_street score +Le Gamin Brooklyn Vanderbilt Avenue 24 +Bistro 33 Queens Ditmars Boulevard 15 +Dirty Pierres Bistro Queens Station Square 22 +Santos Anne Brooklyn Union Avenue 26 +Le Paddock Brooklyn Prospect Avenue 17 +La Crepe Et La Vie Brooklyn Foster Avenue 24 +Francis Cafe Queens Ditmars Boulevard 19 +DROP TABLE t1; +# +# try CRUD operations +# +false +CREATE TABLE t1 (_id INT(4) NOT NULL, msg CHAR(64)) +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='testcoll' +OPTION_LIST='Driver=C,Version=0' CONNECTION='mongodb://localhost:27017' LRECL=1024; +DELETE FROM t1; +INSERT INTO t1 VALUES(0,NULL),(1,'One'),(2,'Two'),(3,'Three'); +SELECT * FROM t1; +_id msg +0 NULL +1 One +2 Two +3 Three +UPDATE t1 SET msg = 'Deux' WHERE _id = 2; +DELETE FROM t1 WHERE msg IS NULL; +SELECT * FROM t1; +_id msg +1 One +2 Deux +3 Three +DELETE FROM t1; +DROP TABLE t1; +true +# +# List states whose population is equal or more than 10 millions +# +false +CREATE TABLE t1 ( +_id char(5) NOT NULL, +city char(16) NOT NULL, +loc_0 double(12,6) NOT NULL `FIELD_FORMAT`='loc.0', +loc_1 char(12) NOT NULL `FIELD_FORMAT`='loc.1', +pop int(11) NOT NULL, +state char(2) NOT NULL) +ENGINE=CONNECT CONNECTION='mongodb://localhost:27017' TABLE_TYPE='MONGO' TABNAME='cities' +OPTION_LIST='Driver=C,Version=0' CONNECTION='mongodb://localhost:27017' LRECL=1024 DATA_CHARSET='utf8'; +# Using SQL for grouping +SELECT state, sum(pop) AS totalPop FROM t1 GROUP BY state HAVING totalPop >= 10000000 ORDER BY totalPop DESC; +state totalPop +CA 29754890 +NY 17990402 +TX 16984601 +FL 12686644 +PA 11881643 +IL 11427576 +OH 10846517 +DROP TABLE t1; +# Using a pipeline for grouping +CREATE TABLE t1 (_id CHAR(2) NOT NULL, totalPop INT(11) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='cities' DATA_CHARSET=utf8 +COLIST='{"pipeline":[{"$group":{"_id":"$state","totalPop":{"$sum":"$pop"}}},{"$match":{"totalPop":{"$gte":10000000}}},{"$sort":{"totalPop":-1}}]}' +OPTION_LIST='Driver=C,Version=0,Pipeline=1' CONNECTION='mongodb://localhost:27017' LRECL=1024; +SELECT * FROM t1; +_id totalPop +CA 29754890 +NY 17990402 +TX 16984601 +FL 12686644 +PA 11881643 +IL 11427576 +OH 10846517 +DROP TABLE t1; +true +# +# Test making array +# +CREATE TABLE t1 ( +_id int(4) NOT NULL, +item CHAR(8) NOT NULL, +prices_0 INT(6) FIELD_FORMAT='prices.0', +prices_1 INT(6) FIELD_FORMAT='prices.1', +prices_2 INT(6) FIELD_FORMAT='prices.2', +prices_3 INT(6) FIELD_FORMAT='prices.3', +prices_4 INT(6) FIELD_FORMAT='prices.4') +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='testcoll' DATA_CHARSET=utf8 +OPTION_LIST='Driver=C,Version=0' CONNECTION='mongodb://localhost:27017' LRECL=1024; +INSERT INTO t1 VALUES +(1,'journal',87,45,63,12,78), +(2,'notebook',123,456,789,NULL,NULL), +(3,'paper',5,7,3,8,NULL), +(4,'planner',25,71,NULL,44,27), +(5,'postcard',5,7,3,8,NULL); +SELECT * FROM t1; +_id item prices_0 prices_1 prices_2 prices_3 prices_4 +1 journal 87 45 63 12 78 +2 notebook 123 456 789 NULL NULL +3 paper 5 7 3 8 NULL +4 planner 25 71 44 27 NULL +5 postcard 5 7 3 8 NULL +DROP TABLE t1; +# +# Test array aggregation +# +CREATE TABLE t1 +ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='testcoll' +COLIST='{"pipeline":[{"$project":{"_id":0,"item":1,"total":{"$sum":"$prices"},"average":{"$avg":"$prices"}}}]}' +OPTION_LIST='Driver=C,Version=0,Pipeline=YES' CONNECTION='mongodb://localhost:27017' LRECL=1024; +SELECT * FROM t1; +item total average +journal 285 57.00 +notebook 1368 456.00 +paper 23 5.75 +planner 167 41.75 +postcard 23 5.75 +DROP TABLE t1; +true diff --git a/storage/connect/mysql-test/connect/r/json_udf.result b/storage/connect/mysql-test/connect/r/json_udf.result index 1e83834cb8f..7d81ca5e73d 100644 --- a/storage/connect/mysql-test/connect/r/json_udf.result +++ b/storage/connect/mysql-test/connect/r/json_udf.result @@ -35,18 +35,18 @@ JsonValue('[11, 22, 33]' json_) [11,22,33] [11,22,33] [11,22,33] -SELECT Json_Array(); -Json_Array() +SELECT Json_Make_Array(); +Json_Make_Array() [] -SELECT Json_Array(56, 3.1416, 'My name is "Foo"', NULL); -Json_Array(56, 3.1416, 'My name is "Foo"', NULL) +SELECT Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL); +Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL) [56,3.141600,"My name is \"Foo\"",null] -SELECT Json_Array(Json_Array(56, 3.1416, 'foo'), TRUE); -Json_Array(Json_Array(56, 3.1416, 'foo'), TRUE) +SELECT Json_Make_Array(Json_Make_Array(56, 3.1416, 'foo'), TRUE); +Json_Make_Array(Json_Make_Array(56, 3.1416, 'foo'), TRUE) [[56,3.141600,"foo"],true] -SELECT Json_Array_Add(Json_Array(56, 3.1416, 'foo', NULL)) Array; +SELECT Json_Array_Add(Json_Make_Array(56, 3.1416, 'foo', NULL)) Array; ERROR HY000: Can't initialize function 'json_array_add'; This function must have at least 2 arguments -SELECT Json_Array_Add(Json_Array(56, 3.1416, 'foo', NULL), 'One more') Array; +SELECT Json_Array_Add(Json_Make_Array(56, 3.1416, 'foo', NULL), 'One more') Array; Array [56,3.141600,"foo",null,"One more"] SELECT Json_Array_Add(JsonValue('one value'), 'One more'); @@ -70,33 +70,33 @@ Array SELECT Json_Array_Add('[5,3,8,7,9]' json_, 4, 9); Json_Array_Add('[5,3,8,7,9]' json_, 4, 9) [5,3,8,7,9,4] -SELECT Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), '[2]', 33, 1); -Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), '[2]', 33, 1) +SELECT Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), '[2]', 33, 1); +Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), '[2]', 33, 1) [1,2,[11,22],"[2]"] -SELECT Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), 33, '[2]', 1); -Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), 33, '[2]', 1) +SELECT Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), 33, '[2]', 1); +Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), 33, '[2]', 1) [1,2,[11,33,22]] -SELECT Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), 33, 1, '[2]'); -Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), 33, 1, '[2]') +SELECT Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), 33, 1, '[2]'); +Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), 33, 1, '[2]') [1,2,[11,33,22]] -SELECT Json_Array_Add_Values(Json_Array(56, 3.1416, 'machin', NULL), 'One more', 'Two more') Array; +SELECT Json_Array_Add_Values(Json_Make_Array(56, 3.1416, 'machin', NULL), 'One more', 'Two more') Array; Array [56,3.141600,"machin",null,"One more","Two more"] -SELECT Json_Array_Add_Values(Json_Array(56, 3.1416, 'machin'), 'One more', 'Two more') Array FROM t1; +SELECT Json_Array_Add_Values(Json_Make_Array(56, 3.1416, 'machin'), 'One more', 'Two more') Array FROM t1; Array [56,3.141600,"machin","One more","Two more"] [56,3.141600,"machin","One more","Two more"] [56,3.141600,"machin","One more","Two more"] [56,3.141600,"machin","One more","Two more"] [56,3.141600,"machin","One more","Two more"] -SELECT Json_Array_Add_Values(Json_Array(56, 3.1416, 'machin'), n) Array FROM t1; +SELECT Json_Array_Add_Values(Json_Make_Array(56, 3.1416, 'machin'), n) Array FROM t1; Array [56,3.141600,"machin",1] [56,3.141600,"machin",2] [56,3.141600,"machin",3] [56,3.141600,"machin",4] [56,3.141600,"machin",5] -SELECT Json_Array_Add_Values(Json_Array(n, 3.1416, 'machin'), n) Array FROM t1; +SELECT Json_Array_Add_Values(Json_Make_Array(n, 3.1416, 'machin'), n) Array FROM t1; Array [1,3.141600,"machin",1] [2,3.141600,"machin",2] @@ -106,49 +106,49 @@ Array SELECT Json_Array_Add_Values('[56]', 3.1416, 'machin') Array; Array [56,3.141600,"machin"] -SELECT Json_Array_Delete(Json_Array(56, 3.1416, 'My name is "Foo"', NULL), 0); -Json_Array_Delete(Json_Array(56, 3.1416, 'My name is "Foo"', NULL), 0) +SELECT Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), 0); +Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), 0) [3.141600,"My name is \"Foo\"",null] -SELECT Json_Array_Delete(Json_Object(56, 3.1416, 'My name is Foo', NULL), 2); -Json_Array_Delete(Json_Object(56, 3.1416, 'My name is Foo', NULL), 2) +SELECT Json_Array_Delete(Json_Make_Object(56, 3.1416, 'My name is Foo', NULL), 2); +Json_Array_Delete(Json_Make_Object(56, 3.1416, 'My name is Foo', NULL), 2) {"56":56,"3.1416":3.141600,"My name is Foo":"My name is Foo","NULL":null} Warnings: Warning 1105 First argument target is not an array -SELECT Json_Array_Delete(Json_Array(56, 3.1416, 'My name is "Foo"', NULL), '2'); -Json_Array_Delete(Json_Array(56, 3.1416, 'My name is "Foo"', NULL), '2') +SELECT Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), '2'); +Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), '2') [56,3.141600,"My name is \"Foo\"",null] Warnings: Warning 1105 Missing or null array index -SELECT Json_Array_Delete(json_array(56, 3.1416, 'My name is "Foo"', NULL), '2', 2); -Json_Array_Delete(json_array(56, 3.1416, 'My name is "Foo"', NULL), '2', 2) +SELECT Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), '2', 2); +Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), '2', 2) [56,3.141600,"My name is \"Foo\"",null] Warnings: -Warning 1105 No sub-item at '2' -SELECT Json_Object(56, 3.1416, 'foo', NULL); -Json_Object(56, 3.1416, 'foo', NULL) +Warning 1105 First argument target is not an array +SELECT Json_Make_Object(56, 3.1416, 'foo', NULL); +Json_Make_Object(56, 3.1416, 'foo', NULL) {"56":56,"3.1416":3.141600,"foo":"foo","NULL":null} -SELECT Json_Object(56 qty, 3.1416 price, 'foo' truc, NULL garanty); -Json_Object(56 qty, 3.1416 price, 'foo' truc, NULL garanty) +SELECT Json_Make_Object(56 qty, 3.1416 price, 'foo' truc, NULL garanty); +Json_Make_Object(56 qty, 3.1416 price, 'foo' truc, NULL garanty) {"qty":56,"price":3.141600,"truc":"foo","garanty":null} -SELECT Json_Object(); -Json_Object() +SELECT Json_Make_Object(); +Json_Make_Object() {} -SELECT Json_Object(Json_Array(56, 3.1416, 'foo'), NULL); -Json_Object(Json_Array(56, 3.1416, 'foo'), NULL) -{"Array(56, 3.1416, 'foo')":[56,3.141600,"foo"],"NULL":null} -SELECT Json_Array(Json_Object(56 "qty", 3.1416 "price", 'foo') ,NULL); -Json_Array(Json_Object(56 "qty", 3.1416 "price", 'foo') ,NULL) +SELECT Json_Make_Object(Json_Make_Array(56, 3.1416, 'foo'), NULL); +Json_Make_Object(Json_Make_Array(56, 3.1416, 'foo'), NULL) +{"Make_Array(56, 3.1416, 'foo')":[56,3.141600,"foo"],"NULL":null} +SELECT Json_Make_Array(Json_Make_Object(56 "qty", 3.1416 "price", 'foo') ,NULL); +Json_Make_Array(Json_Make_Object(56 "qty", 3.1416 "price", 'foo') ,NULL) [{"qty":56,"price":3.141600,"foo":"foo"},null] SELECT Json_Object_Key('qty', 56, 'price', 3.1416, 'truc', 'machin', 'garanty', NULL); Json_Object_Key('qty', 56, 'price', 3.1416, 'truc', 'machin', 'garanty', NULL) {"qty":56,"price":3.141600,"truc":"machin","garanty":null} SELECT Json_Object_Key('qty', 56, 'price', 3.1416, 'truc', 'machin', 'garanty'); ERROR HY000: Can't initialize function 'json_object_key'; This function must have an even number of arguments -SELECT Json_Object_Add(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'blue' color); -Json_Object_Add(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'blue' color) +SELECT Json_Object_Add(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'blue' color); +Json_Object_Add(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'blue' color) {"qty":56,"price":3.141600,"truc":"machin","garanty":null,"color":"blue"} -SELECT Json_Object_Add(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 45.99 price); -Json_Object_Add(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 45.99 price) +SELECT Json_Object_Add(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 45.99 price); +Json_Object_Add(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 45.99 price) {"qty":56,"price":45.990000,"truc":"machin","garanty":null} SELECT Json_Object_Add(Json_File('notexist.json'), 'cheese' item, '[1]', 1); Json_Object_Add(Json_File('notexist.json'), 'cheese' item, '[1]', 1) @@ -156,13 +156,13 @@ NULL Warnings: Warning 1105 Error 2 opening notexist.json Warning 1105 First argument target is not an object -SELECT Json_Object_Delete(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'truc'); -Json_Object_Delete(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'truc') +SELECT Json_Object_Delete(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'truc'); +Json_Object_Delete(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'truc') {"qty":56,"price":3.141600,"garanty":null} -SELECT Json_Object_Delete(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'chose'); -Json_Object_Delete(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'chose') +SELECT Json_Object_Delete(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'chose'); +Json_Object_Delete(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'chose') {"qty":56,"price":3.141600,"truc":"machin","garanty":null} -SELECT Json_Object_List(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty)) "Key List"; +SELECT Json_Object_List(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty)) "Key List"; Key List ["qty","price","truc","garanty"] SELECT Json_Object_List('{"qty":56, "price":3.1416, "truc":"machin", "garanty":null}') "Key List"; @@ -183,12 +183,12 @@ TRANSLATOR CHAR(80), PUBLISHER CHAR(32), DATEPUB int(4) ) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; -SELECT Json_Array(AUTHOR, TITLE, DATEPUB) FROM t2; -Json_Array(AUTHOR, TITLE, DATEPUB) +SELECT Json_Make_Array(AUTHOR, TITLE, DATEPUB) FROM t2; +Json_Make_Array(AUTHOR, TITLE, DATEPUB) ["Jean-Christophe Bernadac","Construire une application XML",1999] ["William J. Pardi","XML en Action",1999] -SELECT Json_Object(AUTHOR, TITLE, DATEPUB) FROM t2; -Json_Object(AUTHOR, TITLE, DATEPUB) +SELECT Json_Make_Object(AUTHOR, TITLE, DATEPUB) FROM t2; +Json_Make_Object(AUTHOR, TITLE, DATEPUB) {"AUTHOR":"Jean-Christophe Bernadac","TITLE":"Construire une application XML","DATEPUB":1999} {"AUTHOR":"William J. Pardi","TITLE":"XML en Action","DATEPUB":1999} SELECT Json_Array_Grp(TITLE, DATEPUB) FROM t2; @@ -206,8 +206,8 @@ DEPARTMENT CHAr(4) NOT NULL FLAG=41, SECRETARY CHAR(5) DEFAULT NULL FLAG=46, SALARY DOUBLE(8,2) NOT NULL FLAG=52 ) ENGINE=CONNECT TABLE_TYPE=FIX BLOCK_SIZE=8 FILE_NAME='employee.dat' ENDING=1; -SELECT Json_Object(SERIALNO, NAME, TITLE, SALARY) FROM t3 WHERE NAME = 'MERCHANT'; -Json_Object(SERIALNO, NAME, TITLE, SALARY) +SELECT Json_Make_Object(SERIALNO, NAME, TITLE, SALARY) FROM t3 WHERE NAME = 'MERCHANT'; +Json_Make_Object(SERIALNO, NAME, TITLE, SALARY) {"SERIALNO":"78943","NAME":"MERCHANT","TITLE":"SALESMAN","SALARY":8700.000000} SELECT DEPARTMENT, Json_Array_Grp(NAME) FROM t3 GROUP BY DEPARTMENT; DEPARTMENT Json_Array_Grp(NAME) @@ -220,8 +220,8 @@ Warning 1105 Result truncated to json_grp_size values SELECT JsonSet_Grp_Size(30); JsonSet_Grp_Size(30) 30 -SELECT Json_Object(title, Json_Array_Grp(name) `json_names`) from t3 GROUP BY title; -Json_Object(title, Json_Array_Grp(name) `json_names`) +SELECT Json_Make_Object(title, Json_Array_Grp(name) `json_names`) from t3 GROUP BY title; +Json_Make_Object(title, Json_Array_Grp(name) `json_names`) {"title":"ADMINISTRATOR","names":["GOOSEPEN","FUNNIGUY","SHRINKY"]} {"title":"DIRECTOR","names":["QUINN","WERTHER","STRONG"]} {"title":"ENGINEER","names":["BROWNY","ORELLY","MARTIN","TONGHO","WALTER","SMITH"]} @@ -230,26 +230,26 @@ Json_Object(title, Json_Array_Grp(name) `json_names`) {"title":"SCIENTIST","names":["BIGHEAD","BIGHORN"]} {"title":"SECRETARY","names":["MESSIFUL","HONEY","SHORTSIGHT","CHERRY","MONAPENNY"]} {"title":"TYPIST","names":["KITTY","PLUMHEAD"]} -SELECT Json_Array(DEPARTMENT, Json_Array_Grp(NAME)) FROM t3 GROUP BY DEPARTMENT; -Json_Array(DEPARTMENT, Json_Array_Grp(NAME)) +SELECT Json_Make_Array(DEPARTMENT, Json_Array_Grp(NAME)) FROM t3 GROUP BY DEPARTMENT; +Json_Make_Array(DEPARTMENT, Json_Array_Grp(NAME)) ["0021",["STRONG","SHORTSIGHT"]] ["0318",["BANCROFT","PLUMHEAD","HONEY","TONGHO","WALTER","SHRINKY","WERTHER","MERCHANT","WHEELFOR"]] ["0319",["BULLOZER","QUINN","BROWNY","KITTY","MONAPENNY","MARTIN","FUNNIGUY","BUGHAPPY","FODDERMAN","MESSIFUL","GOOSEPEN"]] ["2452",["BIGHEAD","ORELLY","BIGHORN","SMITH","CHERRY"]] -SELECT Json_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES) FROM t3 GROUP BY DEPARTMENT; -Json_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES) +SELECT Json_Make_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES) FROM t3 GROUP BY DEPARTMENT; +Json_Make_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES) {"DEPARTMENT":"0021","NAMES":["STRONG","SHORTSIGHT"]} {"DEPARTMENT":"0318","NAMES":["BANCROFT","PLUMHEAD","HONEY","TONGHO","WALTER","SHRINKY","WERTHER","MERCHANT","WHEELFOR"]} {"DEPARTMENT":"0319","NAMES":["BULLOZER","QUINN","BROWNY","KITTY","MONAPENNY","MARTIN","FUNNIGUY","BUGHAPPY","FODDERMAN","MESSIFUL","GOOSEPEN"]} {"DEPARTMENT":"2452","NAMES":["BIGHEAD","ORELLY","BIGHORN","SMITH","CHERRY"]} -SELECT Json_Object(DEPARTMENT, Json_Array_Grp(Json_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT; -Json_Object(DEPARTMENT, Json_Array_Grp(Json_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES) +SELECT Json_Make_Object(DEPARTMENT, Json_Array_Grp(Json_Make_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT; +Json_Make_Object(DEPARTMENT, Json_Array_Grp(Json_Make_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES) {"DEPARTMENT":"0021","EMPLOYES":[{"SERIALNO":"87777","NAME":"STRONG","TITLE":"DIRECTOR","SALARY":23000.000000},{"SERIALNO":"22222","NAME":"SHORTSIGHT","TITLE":"SECRETARY","SALARY":5500.000000}]} {"DEPARTMENT":"0318","EMPLOYES":[{"SERIALNO":"74200","NAME":"BANCROFT","TITLE":"SALESMAN","SALARY":9600.000000},{"SERIALNO":"24888","NAME":"PLUMHEAD","TITLE":"TYPIST","SALARY":2800.000000},{"SERIALNO":"27845","NAME":"HONEY","TITLE":"SECRETARY","SALARY":4900.000000},{"SERIALNO":"73452","NAME":"TONGHO","TITLE":"ENGINEER","SALARY":6800.000000},{"SERIALNO":"74234","NAME":"WALTER","TITLE":"ENGINEER","SALARY":7400.000000},{"SERIALNO":"77777","NAME":"SHRINKY","TITLE":"ADMINISTRATOR","SALARY":7500.000000},{"SERIALNO":"70012","NAME":"WERTHER","TITLE":"DIRECTOR","SALARY":14500.000000},{"SERIALNO":"78943","NAME":"MERCHANT","TITLE":"SALESMAN","SALARY":8700.000000},{"SERIALNO":"73111","NAME":"WHEELFOR","TITLE":"SALESMAN","SALARY":10030.000000}]} {"DEPARTMENT":"0319","EMPLOYES":[{"SERIALNO":"76543","NAME":"BULLOZER","TITLE":"SALESMAN","SALARY":14800.000000},{"SERIALNO":"40567","NAME":"QUINN","TITLE":"DIRECTOR","SALARY":14000.000000},{"SERIALNO":"00137","NAME":"BROWNY","TITLE":"ENGINEER","SALARY":10500.000000},{"SERIALNO":"12345","NAME":"KITTY","TITLE":"TYPIST","SALARY":3000.450000},{"SERIALNO":"33333","NAME":"MONAPENNY","TITLE":"SECRETARY","SALARY":3800.000000},{"SERIALNO":"00023","NAME":"MARTIN","TITLE":"ENGINEER","SALARY":10000.000000},{"SERIALNO":"07654","NAME":"FUNNIGUY","TITLE":"ADMINISTRATOR","SALARY":8500.000000},{"SERIALNO":"45678","NAME":"BUGHAPPY","TITLE":"PROGRAMMER","SALARY":8500.000000},{"SERIALNO":"56789","NAME":"FODDERMAN","TITLE":"SALESMAN","SALARY":7000.000000},{"SERIALNO":"55555","NAME":"MESSIFUL","TITLE":"SECRETARY","SALARY":5000.500000},{"SERIALNO":"98765","NAME":"GOOSEPEN","TITLE":"ADMINISTRATOR","SALARY":4700.000000}]} {"DEPARTMENT":"2452","EMPLOYES":[{"SERIALNO":"34567","NAME":"BIGHEAD","TITLE":"SCIENTIST","SALARY":8000.000000},{"SERIALNO":"31416","NAME":"ORELLY","TITLE":"ENGINEER","SALARY":13400.000000},{"SERIALNO":"36666","NAME":"BIGHORN","TITLE":"SCIENTIST","SALARY":11000.000000},{"SERIALNO":"02345","NAME":"SMITH","TITLE":"ENGINEER","SALARY":9000.000000},{"SERIALNO":"11111","NAME":"CHERRY","TITLE":"SECRETARY","SALARY":4500.000000}]} -SELECT Json_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT, TITLE; -Json_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES) +SELECT Json_Make_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Make_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT, TITLE; +Json_Make_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Make_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES) {"DEPARTMENT":"0021","TITLE":"DIRECTOR","EMPLOYES":[{"SERIALNO":"87777","NAME":"STRONG","SALARY":23000.000000}]} {"DEPARTMENT":"0021","TITLE":"SECRETARY","EMPLOYES":[{"SERIALNO":"22222","NAME":"SHORTSIGHT","SALARY":5500.000000}]} {"DEPARTMENT":"0318","TITLE":"ADMINISTRATOR","EMPLOYES":[{"SERIALNO":"77777","NAME":"SHRINKY","SALARY":7500.000000}]} @@ -273,8 +273,8 @@ ERROR HY000: Can't initialize function 'json_object_grp'; This function requires SELECT Json_Object_Grp(NAME, SALARY) FROM t3; Json_Object_Grp(NAME, SALARY) {"BANCROFT":9600.000000,"SMITH":9000.000000,"MERCHANT":8700.000000,"FUNNIGUY":8500.000000,"BUGHAPPY":8500.000000,"BIGHEAD":8000.000000,"SHRINKY":7500.000000,"WALTER":7400.000000,"FODDERMAN":7000.000000,"TONGHO":6800.000000,"SHORTSIGHT":5500.000000,"MESSIFUL":5000.500000,"HONEY":4900.000000,"GOOSEPEN":4700.000000,"CHERRY":4500.000000,"MONAPENNY":3800.000000,"KITTY":3000.450000,"PLUMHEAD":2800.000000,"STRONG":23000.000000,"BULLOZER":14800.000000,"WERTHER":14500.000000,"QUINN":14000.000000,"ORELLY":13400.000000,"BIGHORN":11000.000000,"BROWNY":10500.000000,"WHEELFOR":10030.000000,"MARTIN":10000.000000} -SELECT Json_Object(DEPARTMENT, Json_Object_Grp(NAME, SALARY) "Json_SALARIES") FROM t3 GROUP BY DEPARTMENT; -Json_Object(DEPARTMENT, Json_Object_Grp(NAME, SALARY) "Json_SALARIES") +SELECT Json_Make_Object(DEPARTMENT, Json_Object_Grp(NAME, SALARY) "Json_SALARIES") FROM t3 GROUP BY DEPARTMENT; +Json_Make_Object(DEPARTMENT, Json_Object_Grp(NAME, SALARY) "Json_SALARIES") {"DEPARTMENT":"0021","SALARIES":{"STRONG":23000.000000,"SHORTSIGHT":5500.000000}} {"DEPARTMENT":"0318","SALARIES":{"BANCROFT":9600.000000,"PLUMHEAD":2800.000000,"HONEY":4900.000000,"TONGHO":6800.000000,"WALTER":7400.000000,"SHRINKY":7500.000000,"WERTHER":14500.000000,"MERCHANT":8700.000000,"WHEELFOR":10030.000000}} {"DEPARTMENT":"0319","SALARIES":{"BULLOZER":14800.000000,"QUINN":14000.000000,"BROWNY":10500.000000,"KITTY":3000.450000,"MONAPENNY":3800.000000,"MARTIN":10000.000000,"FUNNIGUY":8500.000000,"BUGHAPPY":8500.000000,"FODDERMAN":7000.000000,"MESSIFUL":5000.500000,"GOOSEPEN":4700.000000}} @@ -309,26 +309,26 @@ SELECT JsonGet_String(Json_Array_Grp(name),'[>]') FROM t3; JsonGet_String(Json_Array_Grp(name),'[>]') WHEELFOR SET @j1 = '[45,28,36,45,89]'; -SELECT JsonGet_String(@j1,'[1]'); -JsonGet_String(@j1,'[1]') +SELECT JsonGet_String(@j1,'1'); +JsonGet_String(@j1,'1') 28 -SELECT JsonGet_String(@j1 json_,'[3]'); -JsonGet_String(@j1 json_,'[3]') +SELECT JsonGet_String(@j1 json_,'3'); +JsonGet_String(@j1 json_,'3') 45 -SELECT JsonGet_String(Json_Array(45,28,36,45,89),'[3]'); -JsonGet_String(Json_Array(45,28,36,45,89),'[3]') +SELECT JsonGet_String(Json_Make_Array(45,28,36,45,89),'3'); +JsonGet_String(Json_Make_Array(45,28,36,45,89),'3') 45 -SELECT JsonGet_String(Json_Array(45,28,36,45,89),'["+"]') "list",'=' as "egal",JsonGet_String(Json_Array(45,28,36,45,89),'[+]') "sum"; +SELECT JsonGet_String(Json_Make_Array(45,28,36,45,89),'["+"]') "list",'=' as "egal",JsonGet_String(Json_Make_Array(45,28,36,45,89),'[+]') "sum"; list egal sum 45+28+36+45+89 = 243.00 -SELECT JsonGet_String(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:[0]'); -JsonGet_String(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:[0]') +SELECT JsonGet_String(Json_Make_Array(Json_Make_Array(45,28),Json_Make_Array(36,45,89)),'1.0'); +JsonGet_String(Json_Make_Array(Json_Make_Array(45,28),Json_Make_Array(36,45,89)),'1.0') 36 -SELECT JsonGet_String(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:*'); -JsonGet_String(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:*') +SELECT JsonGet_String(Json_Make_Array(Json_Make_Array(45,28),Json_Make_Array(36,45,89)),'1.*'); +JsonGet_String(Json_Make_Array(Json_Make_Array(45,28),Json_Make_Array(36,45,89)),'1.*') [36,45,89] -SELECT JsonGet_String(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'truc'); -JsonGet_String(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'truc') +SELECT JsonGet_String(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'truc'); +JsonGet_String(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'truc') machin SET @j2 = '{"qty":56,"price":3.141600,"truc":"machin","garanty":null}'; SELECT JsonGet_String(@j2 json_,'truc'); @@ -345,14 +345,14 @@ JsonGet_String(NULL json_, NULL) NULL Warnings: Warning 1105 -SELECT department, JsonGet_String(Json_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries:[+]') Sumsal FROM t3 GROUP BY department; +SELECT department, JsonGet_String(Json_Make_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries.[+]') Sumsal FROM t3 GROUP BY department; department Sumsal 0021 28500.00 0318 72230.00 0319 89800.95 2452 45900.00 -SELECT JsonGet_Int(@j1, '[4]'); -JsonGet_Int(@j1, '[4]') +SELECT JsonGet_Int(@j1, '4'); +JsonGet_Int(@j1, '4') 89 SELECT JsonGet_Int(@j1, '[#]'); JsonGet_Int(@j1, '[#]') @@ -360,26 +360,26 @@ JsonGet_Int(@j1, '[#]') SELECT JsonGet_Int(@j1, '[+]'); JsonGet_Int(@j1, '[+]') 243 -SELECT JsonGet_Int(@j1 json_, '[3]'); -JsonGet_Int(@j1 json_, '[3]') +SELECT JsonGet_Int(@j1 json_, '3'); +JsonGet_Int(@j1 json_, '3') 45 -SELECT JsonGet_Int(Json_Array(45,28,36,45,89), '[3]'); -JsonGet_Int(Json_Array(45,28,36,45,89), '[3]') +SELECT JsonGet_Int(Json_Make_Array(45,28,36,45,89), '3'); +JsonGet_Int(Json_Make_Array(45,28,36,45,89), '3') 45 -SELECT JsonGet_Int(Json_Array(45,28,36,45,89), '["+"]'); -JsonGet_Int(Json_Array(45,28,36,45,89), '["+"]') +SELECT JsonGet_Int(Json_Make_Array(45,28,36,45,89), '["+"]'); +JsonGet_Int(Json_Make_Array(45,28,36,45,89), '["+"]') 45 -SELECT JsonGet_Int(Json_Array(45,28,36,45,89), '[+]'); -JsonGet_Int(Json_Array(45,28,36,45,89), '[+]') +SELECT JsonGet_Int(Json_Make_Array(45,28,36,45,89), '[+]'); +JsonGet_Int(Json_Make_Array(45,28,36,45,89), '[+]') 243 -SELECT JsonGet_Int(Json_Array(json_array(45,28), json_array(36,45,89)), '[1]:[0]'); -JsonGet_Int(Json_Array(json_array(45,28), json_array(36,45,89)), '[1]:[0]') +SELECT JsonGet_Int(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '1.0'); +JsonGet_Int(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '1.0') 36 -SELECT JsonGet_Int(Json_Array(json_array(45,28), json_array(36,45,89)), '[0]:[1]'); -JsonGet_Int(Json_Array(json_array(45,28), json_array(36,45,89)), '[0]:[1]') +SELECT JsonGet_Int(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '0.1'); +JsonGet_Int(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '0.1') 28 -SELECT JsonGet_Int(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'qty'); -JsonGet_Int(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'qty') +SELECT JsonGet_Int(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'qty'); +JsonGet_Int(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'qty') 56 SELECT JsonGet_Int(@j2 json_, 'price'); JsonGet_Int(@j2 json_, 'price') @@ -390,38 +390,38 @@ JsonGet_Int(@j2, 'qty') SELECT JsonGet_Int('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}', 'chose'); JsonGet_Int('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}', 'chose') NULL -SELECT JsonGet_Int(JsonGet_String(Json_Array(Json_Array(45,28),Json_Array(36,45,89)), '[1]:*'), '[+]') sum; +SELECT JsonGet_Int(JsonGet_String(Json_Make_Array(Json_Make_Array(45,28),Json_Make_Array(36,45,89)), '1.*'), '[+]') sum; sum 170 -SELECT department, JsonGet_Int(Json_Object(department, Json_Array_Grp(salary) "Json_salaries"), 'salaries:[+]') Sumsal FROM t3 GROUP BY department; +SELECT department, JsonGet_Int(Json_Make_Object(department, Json_Array_Grp(salary) "Json_salaries"), 'salaries.[+]') Sumsal FROM t3 GROUP BY department; department Sumsal 0021 28500 0318 72230 0319 89800 2452 45900 -SELECT JsonGet_Real(@j1, '[2]'); -JsonGet_Real(@j1, '[2]') +SELECT JsonGet_Real(@j1, '2'); +JsonGet_Real(@j1, '2') 36.000000000000000 -SELECT JsonGet_Real(@j1 json_, '[3]', 2); -JsonGet_Real(@j1 json_, '[3]', 2) +SELECT JsonGet_Real(@j1 json_, '3', 2); +JsonGet_Real(@j1 json_, '3', 2) 45.00 -SELECT JsonGet_Real(Json_Array(45,28,36,45,89), '[3]'); -JsonGet_Real(Json_Array(45,28,36,45,89), '[3]') +SELECT JsonGet_Real(Json_Make_Array(45,28,36,45,89), '3'); +JsonGet_Real(Json_Make_Array(45,28,36,45,89), '3') 45.000000000000000 -SELECT JsonGet_Real(Json_Array(45,28,36,45,89), '["+"]'); -JsonGet_Real(Json_Array(45,28,36,45,89), '["+"]') +SELECT JsonGet_Real(Json_Make_Array(45,28,36,45,89), '["+"]'); +JsonGet_Real(Json_Make_Array(45,28,36,45,89), '["+"]') 45.000000000000000 -SELECT JsonGet_Real(Json_Array(45,28,36,45,89), '[+]'); -JsonGet_Real(Json_Array(45,28,36,45,89), '[+]') +SELECT JsonGet_Real(Json_Make_Array(45,28,36,45,89), '[+]'); +JsonGet_Real(Json_Make_Array(45,28,36,45,89), '[+]') 243.000000000000000 -SELECT JsonGet_Real(Json_Array(45,28,36,45,89), '[!]'); -JsonGet_Real(Json_Array(45,28,36,45,89), '[!]') +SELECT JsonGet_Real(Json_Make_Array(45,28,36,45,89), '[!]'); +JsonGet_Real(Json_Make_Array(45,28,36,45,89), '[!]') 48.600000000000000 -SELECT JsonGet_Real(Json_Array(json_array(45,28), json_array(36,45,89)), '[1]:[0]'); -JsonGet_Real(Json_Array(json_array(45,28), json_array(36,45,89)), '[1]:[0]') +SELECT JsonGet_Real(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '1.0'); +JsonGet_Real(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '1.0') 36.000000000000000 -SELECT JsonGet_Real(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'price'); -JsonGet_Real(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'price') +SELECT JsonGet_Real(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'price'); +JsonGet_Real(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'price') 3.141600000000000 SELECT JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}' json_, 'qty'); JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}' json_, 'qty') @@ -435,7 +435,7 @@ JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}', 'pric SELECT JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}', 'chose'); JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}', 'chose') NULL -SELECT department, JsonGet_Real(Json_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries:[+]') Sumsal FROM t3 GROUP BY department; +SELECT department, JsonGet_Real(Json_Make_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries.[+]') Sumsal FROM t3 GROUP BY department; department Sumsal 0021 28500.000000000000000 0318 72230.000000000000000 @@ -445,11 +445,11 @@ department Sumsal # Documentation examples # SELECT -JsonGet_Int(Json_Array(45,28,36,45,89), '[4]') "Rank", -JsonGet_Int(Json_Array(45,28,36,45,89), '[#]') "Number", -JsonGet_String(Json_Array(45,28,36,45,89), '[","]') "Concat", -JsonGet_Int(Json_Array(45,28,36,45,89), '[+]') "Sum", -JsonGet_Real(Json_Array(45,28,36,45,89), '[!]', 2) "Avg"; +JsonGet_Int(Json_Make_Array(45,28,36,45,89), '4') "Rank", +JsonGet_Int(Json_Make_Array(45,28,36,45,89), '[#]') "Number", +JsonGet_String(Json_Make_Array(45,28,36,45,89), '[","]') "Concat", +JsonGet_Int(Json_Make_Array(45,28,36,45,89), '[+]') "Sum", +JsonGet_Real(Json_Make_Array(45,28,36,45,89), '[!]', 2) "Avg"; Rank Number Concat Sum Avg 89 5 45,28,36,45,89 243 48.60 SELECT @@ -464,33 +464,33 @@ Real # # Testing Locate # -SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'machin'); -JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'machin') -truc -SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),56); -JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),56) -qty -SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),3.1416); -JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),3.1416) -price -SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'chose'); -JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'chose') +SELECT JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'machin'); +JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'machin') +$.truc +SELECT JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),56); +JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),56) +$.qty +SELECT JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),3.1416); +JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),3.1416) +$.price +SELECT JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'chose'); +JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'chose') NULL SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, 'Jack') Path; Path -AUTHORS:[1]:FN +$.AUTHORS[1].FN SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, 'jack' ci) Path; Path -AUTHORS:[1]:FN +$.AUTHORS[1].FN SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, '{"FN":"Jack", "LN":"London"}' json_) Path; Path -AUTHORS:[1] +$.AUTHORS[1] SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, '{"FN":"jack", "LN":"London"}' json_) Path; Path NULL SELECT JsonLocate('[45,28,36,45,89]',36); JsonLocate('[45,28,36,45,89]',36) -[2] +$[2] SELECT JsonLocate('[45,28,36,45,89]' json_,28.0); JsonLocate('[45,28,36,45,89]' json_,28.0) NULL @@ -499,71 +499,71 @@ Json_Locate_All('[45,28,36,45,89]',10) [] SELECT Json_Locate_All('[45,28,36,45,89]',45); Json_Locate_All('[45,28,36,45,89]',45) -["[0]","[3]"] +["$[0]","$[3]"] SELECT Json_Locate_All('[[45,28],36,45,89]',45); Json_Locate_All('[[45,28],36,45,89]',45) -["[0]:[0]","[2]"] +["$[0][0]","$[2]"] SELECT Json_Locate_All('[[45,28,45],36,45,89]',45); Json_Locate_All('[[45,28,45],36,45,89]',45) -["[0]:[0]","[0]:[2]","[2]"] +["$[0][0]","$[0][2]","$[2]"] SELECT Json_Locate_All('[[45,28,45],36,45,89]',JsonGet_Int('[3,45]','[1]')); Json_Locate_All('[[45,28,45],36,45,89]',JsonGet_Int('[3,45]','[1]')) -["[0]:[0]","[0]:[2]","[2]"] +["$[0][0]","$[0][2]","$[2]"] SELECT JsonLocate('[[45,28,45],36,45,89]',45,n) from t1; JsonLocate('[[45,28,45],36,45,89]',45,n) -[0]:[0] -[0]:[2] -[2] +$[0][0] +$[0][2] +$[2] NULL NULL SELECT JsonGet_String(Json_Locate_All('[[45,28,45],36,45,89]',45),concat('[',n-1,']')) FROM t1; JsonGet_String(Json_Locate_All('[[45,28,45],36,45,89]',45),concat('[',n-1,']')) -[0]:[0] -[0]:[2] -[2] +$[0][0] +$[0][2] +$[2] NULL NULL SELECT JsonGet_String(Json_Locate_All('[[45,28,45],36,45,89]',45),concat('[',n-1,']')) AS `Path` FROM t1 GROUP BY n HAVING `Path` IS NOT NULL; Path -[0]:[0] -[0]:[2] -[2] +$[0][0] +$[0][2] +$[2] SELECT Json_Locate_All('[45,28,[36,45,89]]',45); Json_Locate_All('[45,28,[36,45,89]]',45) -["[0]","[2]:[1]"] +["$[0]","$[2][1]"] SELECT Json_Locate_All('[[45,28],[36,45.0,89]]',JsonValue(45.0)); Json_Locate_All('[[45,28],[36,45.0,89]]',JsonValue(45.0)) [] SELECT Json_Locate_All('[[45,28],[36,45.0,89]]',45.0); Json_Locate_All('[[45,28],[36,45.0,89]]',45.0) -["[1]:[1]"] +["$[1][1]"] SELECT JsonLocate('[[45,28],[36,45,89]]','[36,45,89]' json_); JsonLocate('[[45,28],[36,45,89]]','[36,45,89]' json_) -[1] +$[1] SELECT JsonLocate('[[45,28],[36,45,89]]','[45,28]' json_); JsonLocate('[[45,28],[36,45,89]]','[45,28]' json_) -[0] +$[0] SELECT Json_Locate_All('[[45,28],[[36,45],89]]','45') "All paths"; All paths [] SELECT Json_Locate_All('[[45,28],[[36,45],89]]','[36,45]' json_); Json_Locate_All('[[45,28],[[36,45],89]]','[36,45]' json_) -["[1]:[0]"] +["$[1][0]"] SELECT JsonGet_Int(Json_Locate_All('[[45,28],[[36,45],89]]',45), '[#]') "Nb of occurs"; Nb of occurs 2 SELECT Json_Locate_All('[[45,28],[[36,45],89]]',45,2); Json_Locate_All('[[45,28],[[36,45],89]]',45,2) -["[0]:[0]"] -SELECT JsonGet_String(Json_Locate_All('[45,28,36,45,89]',45),'[0]'); -JsonGet_String(Json_Locate_All('[45,28,36,45,89]',45),'[0]') -[0] +["$[0][0]"] +SELECT JsonGet_String(Json_Locate_All('[45,28,36,45,89]',45),'0'); +JsonGet_String(Json_Locate_All('[45,28,36,45,89]',45),'0') +$[0] SELECT JsonLocate(Json_File('test/biblio.json'), 'Knab'); JsonLocate(Json_File('test/biblio.json'), 'Knab') -[0]:AUTHOR:[1]:LASTNAME +$[0].AUTHOR[1].LASTNAME SELECT Json_Locate_All('test/biblio.json' jfile_, 'Knab'); Json_Locate_All('test/biblio.json' jfile_, 'Knab') -["[0]:AUTHOR:[1]:LASTNAME"] +["$[0].AUTHOR[1].LASTNAME"] # # Testing json files # @@ -595,54 +595,54 @@ Warning 1105 File pretty format doesn't match the specified pretty value SELECT Json_File('test/fx.json', 0); Json_File('test/fx.json', 0) [{"_id":5,"type":"food","item":"beer","taste":"light","price":5.65,"ratings":[5,8,9]},{"_id":6,"type":"car","item":"roadster","mileage":56000,"ratings":[6,9]},{"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,4]},{"_id":8,"type":"furniture","item":"table","size":{"W":60,"L":80,"H":40},"ratings":[5,8,7]}] -SELECT Json_File('test/fx.json', '[0]'); -Json_File('test/fx.json', '[0]') +SELECT Json_File('test/fx.json', '0'); +Json_File('test/fx.json', '0') {"_id":5,"type":"food","item":"beer","taste":"light","price":5.65,"ratings":[5,8,9]} SELECT Json_File('test/fx.json', '[?]'); Json_File('test/fx.json', '[?]') NULL Warnings: Warning 1105 Invalid function specification ? -SELECT JsonGet_String(Json_File('test/fx.json'), '[1]:*'); -JsonGet_String(Json_File('test/fx.json'), '[1]:*') +SELECT JsonGet_String(Json_File('test/fx.json'), '1.*'); +JsonGet_String(Json_File('test/fx.json'), '1.*') {"_id":6,"type":"car","item":"roadster","mileage":56000,"ratings":[6,9]} -SELECT JsonGet_String(Json_File('test/fx.json'), '[1]'); -JsonGet_String(Json_File('test/fx.json'), '[1]') -6 car roadster 56000 ??? -SELECT JsonGet_Int(Json_File('test/fx.json'), '[1]:mileage') AS Mileage; +SELECT JsonGet_String(Json_File('test/fx.json'), '1'); +JsonGet_String(Json_File('test/fx.json'), '1') +6 car roadster 56000 6 9 +SELECT JsonGet_Int(Json_File('test/fx.json'), '1.mileage') AS Mileage; Mileage 56000 -SELECT JsonGet_Real(Json_File('test/fx.json'), '[0]:price', 2) AS Price; +SELECT JsonGet_Real(Json_File('test/fx.json'), '0.price', 2) AS Price; Price 5.65 -SELECT Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 'ratings'); -Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 'ratings') +SELECT Json_Array_Add(Json_File('test/fx.json', '2'), 6, 'ratings'); +Json_Array_Add(Json_File('test/fx.json', '2'), 6, 'ratings') {"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,4,6]} -SELECT Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 1, 'ratings'); -Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 1, 'ratings') +SELECT Json_Array_Add(Json_File('test/fx.json', '2'), 6, 1, 'ratings'); +Json_Array_Add(Json_File('test/fx.json', '2'), 6, 1, 'ratings') {"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,6,4]} -SELECT Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 'ratings', 1); -Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 'ratings', 1) +SELECT Json_Array_Add(Json_File('test/fx.json', '2'), 6, 'ratings', 1); +Json_Array_Add(Json_File('test/fx.json', '2'), 6, 'ratings', 1) {"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,6,4]} -SELECT Json_Array_Add(Json_File('test/fx.json', '[2]:ratings'), 6, 0); -Json_Array_Add(Json_File('test/fx.json', '[2]:ratings'), 6, 0) +SELECT Json_Array_Add(Json_File('test/fx.json', '2.ratings'), 6, 0); +Json_Array_Add(Json_File('test/fx.json', '2.ratings'), 6, 0) [6,2,4] -SELECT Json_Array_Delete(Json_File('test/fx.json', '[2]'), 'ratings', 1); -Json_Array_Delete(Json_File('test/fx.json', '[2]'), 'ratings', 1) +SELECT Json_Array_Delete(Json_File('test/fx.json', '2'), 'ratings', 1); +Json_Array_Delete(Json_File('test/fx.json', '2'), 'ratings', 1) {"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2]} -SELECT Json_Object_Add(Json_File('test/fx.json', '[2]'), 'france' origin); -Json_Object_Add(Json_File('test/fx.json', '[2]'), 'france' origin) +SELECT Json_Object_Add(Json_File('test/fx.json', '2'), 'france' origin); +Json_Object_Add(Json_File('test/fx.json', '2'), 'france' origin) {"_id":7,"type":"food","item":"meat","origin":"france","ratings":[2,4]} -SELECT Json_Object_Add(Json_File('test/fx.json', '[2]'), 70 H, 'size'); -Json_Object_Add(Json_File('test/fx.json', '[2]'), 70 H, 'size') +SELECT Json_Object_Add(Json_File('test/fx.json', '2'), 70 H, 'size'); +Json_Object_Add(Json_File('test/fx.json', '2'), 70 H, 'size') {"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,4]} Warnings: Warning 1105 No sub-item at 'size' -SELECT Json_Object_Add(Json_File('test/fx.json', '[3]'), 70 H, 'size'); -Json_Object_Add(Json_File('test/fx.json', '[3]'), 70 H, 'size') +SELECT Json_Object_Add(Json_File('test/fx.json', '3'), 70 H, 'size'); +Json_Object_Add(Json_File('test/fx.json', '3'), 70 H, 'size') {"_id":8,"type":"furniture","item":"table","size":{"W":60,"L":80,"H":70},"ratings":[5,8,7]} -SELECT Json_Object_List(Json_File('test/fx.json', '[3]:size')); -Json_Object_List(Json_File('test/fx.json', '[3]:size')) +SELECT Json_Object_List(Json_File('test/fx.json', '3.size')); +Json_Object_List(Json_File('test/fx.json', '3.size')) ["W","L","H"] DROP TABLE t1; DROP TABLE t2; diff --git a/storage/connect/mysql-test/connect/r/json_udf_bin.result b/storage/connect/mysql-test/connect/r/json_udf_bin.result index 4e59b51c529..0c009d612fe 100644 --- a/storage/connect/mysql-test/connect/r/json_udf_bin.result +++ b/storage/connect/mysql-test/connect/r/json_udf_bin.result @@ -29,8 +29,8 @@ Json_Array_Delete(Jbin_Array(56, Jbin_Array(3.1416, 'My name is "Foo"'), NULL), SELECT Json_Array_Delete(Jbin_Array(56, Jbin_Array(3.1416, 'My name is "Foo"'), TRUE), 1, '[1]'); Json_Array_Delete(Jbin_Array(56, Jbin_Array(3.1416, 'My name is "Foo"'), TRUE), 1, '[1]') [56,[3.141600],true] -SELECT Json_Array(1, TRUE, 0, FALSE); -Json_Array(1, TRUE, 0, FALSE) +SELECT Json_Make_Array(1, TRUE, 0, FALSE); +Json_Make_Array(1, TRUE, 0, FALSE) [1,true,0,false] SELECT Json_Serialize(Jbin_Array(TRUE, FALSE)); Json_Serialize(Jbin_Array(TRUE, FALSE)) @@ -63,94 +63,94 @@ Json_Serialize(Jbin_File('gloss.json')) {"glossary":{"title":"example glossary","GlossDiv":{"title":"S","GlossList":{"GlossEntry":{"ID":"SGML","SortAs":"SGML","GlossTerm":"Standard Generalized Markup Language","Acronym":"SGML","Abbrev":"ISO 8879:1986","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso":["GML","XML"]},"GlossSee":"markup"}}}}} SELECT JsonLocate(Jbin_File('gloss.json'),'XML'); JsonLocate(Jbin_File('gloss.json'),'XML') -glossary:GlossDiv:GlossList:GlossEntry:GlossDef:GlossSeeAlso:[1] +$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso[1] SELECT Json_Object_Key('first', 'foo', 'second', Jbin_Array('a', 33)); Json_Object_Key('first', 'foo', 'second', Jbin_Array('a', 33)) {"first":"foo","second":["a",33]} -SELECT Json_Get_Item(Json_Array('a','b','c'), '[1]'); -Json_Get_Item(Json_Array('a','b','c'), '[1]') +SELECT Json_Get_Item(Json_Make_Array('a','b','c'), '$[1]'); +Json_Get_Item(Json_Make_Array('a','b','c'), '$[1]') NULL -SELECT Json_Get_Item(Json_Object('foo' AS "first", Json_Array('a', 33) AS "json_second"), 'second') AS "item"; +SELECT Json_Get_Item(Json_Make_Object('foo' AS "first", Json_Make_Array('a', 33) AS "json_second"), '$.second') AS "item"; item ["a",33] -SELECT Json_Get_Item(Jbin_Object('foo' first, Jbin_Array('a', 33) jbin_second), 'second:*') item; +SELECT Json_Get_Item(Jbin_Object('foo' first, Jbin_Array('a', 33) jbin_second), '$.second') item; item ["a",33] -SELECT Json_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv'); -Json_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv') +SELECT Json_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv'); +Json_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv') {"title":"S","GlossList":{"GlossEntry":{"ID":"SGML","SortAs":"SGML","GlossTerm":"Standard Generalized Markup Language","Acronym":"SGML","Abbrev":"ISO 8879:1986","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso":["GML","XML"]},"GlossSee":"markup"}}} -SELECT Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv')); -Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv')) +SELECT Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv')); +Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv')) {"title":"S","GlossList":{"GlossEntry":{"ID":"SGML","SortAs":"SGML","GlossTerm":"Standard Generalized Markup Language","Acronym":"SGML","Abbrev":"ISO 8879:1986","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso":["GML","XML"]},"GlossSee":"markup"}}} -SELECT Json_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv:*'); -Json_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv:*') +SELECT Json_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv'); +Json_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv') {"title":"S","GlossList":{"GlossEntry":{"ID":"SGML","SortAs":"SGML","GlossTerm":"Standard Generalized Markup Language","Acronym":"SGML","Abbrev":"ISO 8879:1986","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso":["GML","XML"]},"GlossSee":"markup"}}} -SELECT JsonGet_String(Json_File('gloss.json'),'glossary:GlossDiv:GlossList:GlossEntry:GlossDef:GlossSeeAlso') lang; +SELECT JsonGet_String(Json_File('gloss.json'),'$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso') lang; lang GML -SELECT Json_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv:GlossList:GlossEntry:GlossDef:GlossSeeAlso') "See also"; +SELECT Json_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso') "See also"; See also ["GML","XML"] -SELECT Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv:GlossList:GlossEntry:GlossDef:GlossSeeAlso')) "See also"; +SELECT Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso')) "See also"; See also ["GML","XML"] -SELECT JsonGet_String(Json_Get_Item(Json_File('gloss.json'),'glossary:GlossDiv:GlossList:GlossEntry:GlossDef:GlossSeeAlso'),'[0]') lang; +SELECT JsonGet_String(Json_Get_Item(Json_File('gloss.json'),'$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso'),'$[0]') lang; lang GML # # Test Item Get/Set/Insert/Update UDF's # -SELECT Json_Get_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '[]'); -Json_Get_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '[]') +SELECT Json_Get_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '$[]'); +Json_Get_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '$[]') [1,2,{"trois":3,"quatre":4}] -SELECT Json_Get_Item(Jbin_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '[1]'); -Json_Get_Item(Jbin_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '[1]') +SELECT Json_Get_Item(Jbin_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '$[1]'); +Json_Get_Item(Jbin_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '$[1]') NULL -SELECT Json_Get_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), '[1]'); -Json_Get_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), '[1]') +SELECT Json_Get_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), '$[1]'); +Json_Get_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), '$[1]') NULL -SELECT Json_Set_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4))); -Json_Set_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4))) +SELECT Json_Set_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4))); +Json_Set_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4))) [1,2,{"trois":3,"quatre":4}] -SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 'foo'); +SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), '$.foo'); ERROR HY000: Can't initialize function 'json_set_item'; This function must have an odd number of arguments -SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq'); -Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq') +SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq'); +Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq') [1,2,{"trois":3,"quatre":4,"cinq":5}] -SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 7, '[1]'); -Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 7, '[1]') +SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 7, '$[1]'); +Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 7, '$[1]') [1,7,{"trois":3,"quatre":4}] -SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 7, '[1]'); -Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 7, '[1]') +SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 7, '$[1]'); +Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 7, '$[1]') [1,7,{"trois":3,"quatre":4,"cinq":5}] -SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Json_Array(7, 8, 9), '[1]'); -Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Json_Array(7, 8, 9), '[1]') +SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Json_Make_Array(7, 8, 9), '$[1]'); +Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Json_Make_Array(7, 8, 9), '$[1]') [1,[7,8,9],{"trois":3,"quatre":4}] -SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[2]'); -Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[2]') +SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[2]'); +Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[2]') [1,2,[7,8,9]] -SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[2]:*'); -Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[2]:*') +SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[2].*'); +Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[2].*') [1,2,{"trois":3,"quatre":4}] Warnings: Warning 1105 Invalid specification * in a write path -SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 3.1416, 'foo'); -Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 3.1416, 'foo') +SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 3.1416, '$.foo'); +Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 3.1416, '$.foo') [1,2,{"trois":3,"quatre":4}] -SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 'toto', '[1]:[2]'); -Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 'toto', '[1]:[2]') +SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 'toto', '$[1][2]'); +Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 'toto', '$[1][2]') [1,[7,8,"toto"],{"trois":3,"quatre":4}] -SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 300, '[2]:nxt:total:[]'); -Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 300, '[2]:nxt:total:[]') +SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 300, '$[2].nxt.total[]'); +Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 300, '$[2].nxt.total[]') [1,[7,8,9],{"trois":3,"quatre":4,"nxt":{"total":[300]}}] -SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 300, '[2]:nxt:total:[]'); -Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 300, '[2]:nxt:total:[]') +SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 300, '$[2].nxt.total[]'); +Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 300, '$[2].nxt.total[]') [1,[7,8,9,10],{"trois":3,"quatre":4,"cinq":5,"nxt":{"total":[300]}}] -SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[1]', 5, '[2]:cinq', 10, '[1]:[]'); -Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[1]', 5, '[2]:cinq', 10, '[1]:[]') +SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[1]', 5, '$[2].cinq', 10, '$[1][]'); +Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[1]', 5, '$[2].cinq', 10, '$[1][]') [1,[7,8,9,10],{"trois":3,"quatre":4,"cinq":5}] -SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 44, '[2]:quatre'); -Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 44, '[2]:quatre') +SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 44, '$[2].quatre'); +Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 44, '$[2].quatre') [1,2,{"trois":3,"quatre":44}] SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, 'truc'); Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, 'truc') @@ -163,32 +163,32 @@ Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '*' [1,2,{"trois":3,"quatre":4}] Warnings: Warning 1105 Invalid specification * in a write path -SELECT Json_Serialize(Jbin_Set_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq')); -Json_Serialize(Jbin_Set_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq')) +SELECT Json_Serialize(Jbin_Set_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq')); +Json_Serialize(Jbin_Set_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq')) [1,2,{"trois":3,"quatre":4,"cinq":5}] -SELECT Json_Insert_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq'); -Json_Insert_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq') +SELECT Json_Insert_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq'); +Json_Insert_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq') [1,2,{"trois":3,"quatre":4,"cinq":5}] -SELECT Json_Update_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq'); -Json_Update_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq') +SELECT Json_Update_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq'); +Json_Update_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq') [1,2,{"trois":3,"quatre":4}] -SELECT Json_Insert_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 44, '[2]:quatre'); -Json_Insert_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 44, '[2]:quatre') +SELECT Json_Insert_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 44, '$[2].quatre'); +Json_Insert_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 44, '$[2].quatre') [1,[7,8,9,10],{"trois":3,"quatre":4,"cinq":5}] -SELECT Json_Update_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 44, '[2]:quatre'); -Json_Update_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 44, '[2]:quatre') +SELECT Json_Update_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 44, '$[2].quatre'); +Json_Update_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 44, '$[2].quatre') [1,[7,8,9],{"trois":3,"quatre":44}] -SELECT Json_Insert_Item(Json_Array(1, Json_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[1]', 300, '[2]:nxt:total:[]'); -Json_Insert_Item(Json_Array(1, Json_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[1]', 300, '[2]:nxt:total:[]') +SELECT Json_Insert_Item(Json_Make_Array(1, Json_Make_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][1]', 300, '$[2].nxt.total[]'); +Json_Insert_Item(Json_Make_Array(1, Json_Make_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][1]', 300, '$[2].nxt.total[]') [1,[7,8,9],{"trois":3,"quatre":4,"cinq":5,"nxt":{"total":[300]}}] -SELECT Json_Update_Item(Json_Array(1, Json_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[1]', 300, '[2]:nxt:total:[]'); -Json_Update_Item(Json_Array(1, Json_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[1]', 300, '[2]:nxt:total:[]') +SELECT Json_Update_Item(Json_Make_Array(1, Json_Make_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][1]', 300, '$[2].nxt.total[]'); +Json_Update_Item(Json_Make_Array(1, Json_Make_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][1]', 300, '$[2].nxt.total[]') [1,[7,10,9],{"trois":3,"quatre":4}] -SELECT Json_Insert_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[]'); -Json_Insert_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[]') +SELECT Json_Insert_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[]'); +Json_Insert_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[]') [1,2,{"trois":3,"quatre":4},5] -SELECT Json_Update_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[]'); -Json_Update_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[]') +SELECT Json_Update_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[]'); +Json_Update_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[]') [1,2,{"trois":3,"quatre":4}] # # Test merging items UDF's @@ -196,7 +196,7 @@ Json_Update_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, SELECT Json_Item_Merge(Jbin_Array('a','b','c'), Jbin_Array('d','e','f')); Json_Item_Merge(Jbin_Array('a','b','c'), Jbin_Array('d','e','f')) ["a","b","c","d","e","f"] -SELECT Json_Item_Merge(Json_Array('a','b','c'), Json_Array('d','e','f')) AS "Result"; +SELECT Json_Item_Merge(Json_Make_Array('a','b','c'), Json_Make_Array('d','e','f')) AS "Result"; Result ["a","b","c","d","e","f"] SELECT Json_Array_Add(Jbin_Item_Merge(Jbin_Array('a','b','c'), Jbin_Array('d','e','f')), 'and', 3); @@ -216,7 +216,7 @@ Json_Object_Add(Jbin_Item_Merge(Jbin_Object(1 "a",2 "b",3 "c"), Jbin_Object(4 "d SELECT Json_Item_Merge(Jbin_Object(1 "a",2 "b",3 "c"), Jbin_Object(4 "a",5 "e",6 "f")); Json_Item_Merge(Jbin_Object(1 "a",2 "b",3 "c"), Jbin_Object(4 "a",5 "e",6 "f")) {"a":4,"b":2,"c":3,"e":5,"f":6} -SELECT Json_Item_Merge('foo', Json_Array('d','e','f')); +SELECT Json_Item_Merge('foo', Json_Make_Array('d','e','f')); ERROR HY000: Can't initialize function 'json_item_merge'; First argument must be a json item # # Test making file UDF's @@ -294,17 +294,17 @@ Json_File('bt1.json', 2) SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json'); Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json') bt1.json -SELECT Json_Object(Jbin_Array_Add(Jbin_Array('a','b','c'), 'd') "Jbin_foo") AS "Result"; +SELECT Json_Make_Object(Jbin_Array_Add(Jbin_Array('a','b','c'), 'd') "Jbin_foo") AS "Result"; Result {"foo":["a","b","c","d"]} -SELECT Json_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd')) AS "Result"; +SELECT Json_Make_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd')) AS "Result"; Result {"Array_Add(Jbin_File('bt1.json'), 'd')":["a","b","c","d"]} -SELECT Json_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1") AS "Result"; +SELECT Json_Make_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1") AS "Result"; Result {"bt1":["a","b","c","d"]} # This does modify the file -SELECT Json_Object(Json_Array_Add(Jbin_File('bt1.json'), 'd') "Jfile_bt1") AS "Result"; +SELECT Json_Make_Object(Json_Array_Add(Jbin_File('bt1.json'), 'd') "Jfile_bt1") AS "Result"; Result {"bt1":["a","b","c","d"]} SELECT Json_File('bt1.json'); @@ -319,7 +319,7 @@ Json_File('bt1.json') SELECT Json_File(Json_Array_Delete(Jbin_File('bt1.json'), 3), 2); Json_File(Json_Array_Delete(Jbin_File('bt1.json'), 3), 2) ["a","b","c"] -SELECT Json_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1", n "t1") AS "Result" from t1; +SELECT Json_Make_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1", n "t1") AS "Result" from t1; Result {"bt1":["a","b","c","d"],"t1":1} {"bt1":["a","b","c","d"],"t1":2} @@ -432,23 +432,23 @@ SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json'); Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json') bt1.json # Test DELETE from file -SELECT Json_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 1)) AS "Result"; +SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 1)) AS "Result"; Result {"Array_Delete(Jbin_File('bt1.json'), 1)":["a","c"]} -SELECT Json_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 2) "Jbin_bt1") AS "Result"; +SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 2) "Jbin_bt1") AS "Result"; Result {"bt1":["a","b"]} -SELECT Json_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 0) "Jbin_bt1", n "t1") AS "Result" from t1; +SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 0) "Jbin_bt1", n "t1") AS "Result" from t1; Result {"bt1":["b","c"],"t1":1} {"bt1":["b","c"],"t1":2} {"bt1":["b","c"],"t1":3} -SELECT Json_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1; +SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1; Result {"bt1":["a","b"]} {"bt1":["a"]} {"bt1":[]} -SELECT Json_Object(Json_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1; +SELECT Json_Make_Object(Json_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1; Result {"bt1":["a","b"]} {"bt1":["a"]} @@ -475,17 +475,17 @@ SELECT Json_Serialize(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d")); Json_Serialize(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d")) {"a":1,"b":2,"c":3,"d":4} # First query (file not modified) -SELECT Json_Object(Jbin_Object_Add(Jbin_File('bt2.json'), 4 AS "d") AS "Jbin_new") AS "Result"; +SELECT Json_Make_Object(Jbin_Object_Add(Jbin_File('bt2.json'), 4 AS "d") AS "Jbin_new") AS "Result"; Result {"new":{"a":1,"b":2,"c":3,"d":4}} # First query (file modified) -SELECT Json_Object(Json_Object_Add(Jbin_File('bt2.json'), 4 AS "d") AS "Jfile_new") AS "Result"; +SELECT Json_Make_Object(Json_Object_Add(Jbin_File('bt2.json'), 4 AS "d") AS "Jfile_new") AS "Result"; Result {"new":{"a":1,"b":2,"c":3,"d":4}} SELECT Jfile_Make(Jbin_Object(1 "a", 2 "b", 3 "c"), 'bt2.json', 0); Jfile_Make(Jbin_Object(1 "a", 2 "b", 3 "c"), 'bt2.json', 0) bt2.json -SELECT Json_Object(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d") "Jbin_new", n "t1") AS "Result" from t1; +SELECT Json_Make_Object(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d") "Jbin_new", n "t1") AS "Result" from t1; Result {"new":{"a":1,"b":2,"c":3,"d":4},"t1":1} {"new":{"a":1,"b":2,"c":3,"d":4},"t1":2} @@ -526,22 +526,22 @@ SELECT Json_File(Json_Item_Merge(Jbin_File('bt2.json'), Jbin_Object(4 "d",5 "e", Result {"a":1,"b":2,"c":3,"d":4,"e":5,"f":6} -SELECT Json_Item_Merge(Json_Object(1 "a", 2 "b", 3 "c"), Json_Object(4 "d",5 "b",6 "f")) AS "Result"; +SELECT Json_Item_Merge(Json_Make_Object(1 "a", 2 "b", 3 "c"), Json_Make_Object(4 "d",5 "b",6 "f")) AS "Result"; Result {"a":1,"b":5,"c":3,"d":4,"f":6} -SELECT Json_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'b')) AS "Result"; +SELECT Json_Make_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'b')) AS "Result"; Result {"Object_Delete(Jbin_File('bt2.json'), 'b')":{"a":1,"c":3,"d":4,"e":5,"f":6}} -SELECT Json_Object(Jbin_Object_Delete(Jbin_File('bt2.json'), 'c') "Jbin_bt1") AS "Result"; +SELECT Json_Make_Object(Jbin_Object_Delete(Jbin_File('bt2.json'), 'c') "Jbin_bt1") AS "Result"; Result {"bt1":{"a":1,"d":4,"e":5,"f":6}} -SELECT Json_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'c') "Jbin_bt1") AS "Result"; +SELECT Json_Make_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'c') "Jbin_bt1") AS "Result"; Result {"bt1":{"a":1,"d":4,"e":5,"f":6}} -SELECT Json_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'c') "Jfile_bt1") AS "Result"; +SELECT Json_Make_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'c') "Jfile_bt1") AS "Result"; Result {"bt1":{"a":1,"d":4,"e":5,"f":6}} -SELECT Json_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'a') "Jbin_bt1", n "t1") AS "Result" from t1; +SELECT Json_Make_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'a') "Jbin_bt1", n "t1") AS "Result" from t1; Result {"bt1":{"d":4,"e":5,"f":6},"t1":1} {"bt1":{"d":4,"e":5,"f":6},"t1":2} @@ -552,14 +552,14 @@ Key list SELECT Jfile_Make('{"a":1, "b":[44, 55]}' json_, 'bt3.json', 0); Jfile_Make('{"a":1, "b":[44, 55]}' json_, 'bt3.json', 0) bt3.json -SELECT Json_Array_Add(Json_File('bt3.json', 'b'), 66); -Json_Array_Add(Json_File('bt3.json', 'b'), 66) +SELECT Json_Array_Add(Json_File('bt3.json', '$.b'), 66); +Json_Array_Add(Json_File('bt3.json', '$.b'), 66) [44,55,66] -SELECT Json_Array_Add(Json_File('bt3.json'), 66, 'b'); -Json_Array_Add(Json_File('bt3.json'), 66, 'b') +SELECT Json_Array_Add(Json_File('bt3.json'), 66, '$.b'); +Json_Array_Add(Json_File('bt3.json'), 66, '$.b') {"a":1,"b":[44,55,66]} -SELECT Json_Array_Add(Jbin_File('bt3.json', 'b'), 66); -Json_Array_Add(Jbin_File('bt3.json', 'b'), 66) +SELECT Json_Array_Add(Jbin_File('bt3.json', '$.b'), 66); +Json_Array_Add(Jbin_File('bt3.json', '$.b'), 66) bt3.json SELECT Json_File('bt3.json', 3); Json_File('bt3.json', 3) @@ -573,15 +573,15 @@ jfile_cols CHAR(12) NOT NULL) ENGINE= MYISAM; INSERT INTO t2 VALUES(1,'bt3.json'); # In this table, the jfile_cols column just contains a file name -UPDATE t2 SET jfile_cols = Json_Array_Add(Jbin_File('bt3.json', 'b'), 66) WHERE n = 1; +UPDATE t2 SET jfile_cols = Json_Array_Add(Jbin_File('bt3.json', '$.b'), 66) WHERE n = 1; SELECT JsonGet_String(jfile_cols, '*') FROM t2; JsonGet_String(jfile_cols, '*') {"a":1,"b":[44,55,66]} -UPDATE t2 SET jfile_cols = Json_Insert_Item(jfile_cols, 77, 'b:[]') WHERE n = 1; -SELECT JsonGet_String(jfile_cols, 'b:*') FROM t2; -JsonGet_String(jfile_cols, 'b:*') +UPDATE t2 SET jfile_cols = Json_Insert_Item(jfile_cols, 77, '$.b[]') WHERE n = 1; +SELECT JsonGet_String(jfile_cols, '$.b.*') FROM t2; +JsonGet_String(jfile_cols, '$.b.*') [44,55,66,77] -UPDATE t2 SET jfile_cols = Json_Insert_Item(Jbin_Insert_Item(jfile_cols, 88, 'b:') , 99, 'b:') WHERE n = 1; +UPDATE t2 SET jfile_cols = Json_Insert_Item(Jbin_Insert_Item(jfile_cols, 88, '$.b[]') , 99, '$.b[]') WHERE n = 1; SELECT JsonGet_String(jfile_cols, '*') FROM t2; JsonGet_String(jfile_cols, '*') {"a":1,"b":[44,55,66,77,88,99]} diff --git a/storage/connect/mysql-test/connect/r/mongo_c.result b/storage/connect/mysql-test/connect/r/mongo_c.result new file mode 100644 index 00000000000..da0832994c2 --- /dev/null +++ b/storage/connect/mysql-test/connect/r/mongo_c.result @@ -0,0 +1,378 @@ +# +# Test the MONGO table type +# +CREATE TABLE t1 (Document varchar(1024) field_format='*') +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants +OPTION_LIST='Driver=C,Version=0' DATA_CHARSET=utf8; +SELECT * from t1 limit 3; +Document +{"_id":{"$oid":"58ada47de5a51ddfcd5ed51c"},"address":{"building":"1007","coord":[-73.856076999999999089,40.848447000000000173],"street":"Morris ParkAve", "zipcode":"10462"},"borough":"Bronx","cuisine":"Bakery","grades":[{"date":{"$date":1393804800000},"grade":"A","score":2},{"date":{"$date":1378857600000},"grade":"A","score":6},{"date":{"$date":1358985600000},"grade":"A","score":10},{"date":{"$date":1322006400000},"grade":"A","score":9},{"date":{"$date":1299715200000},"grade":"B","score":14}],"name":"Morris ParkBakeShop", "restaurant_id":"30075445"} +{"_id":{"$oid":"58ada47de5a51ddfcd5ed51d"},"address":{"building":"469","coord":[-73.96170399999999745,40.66294200000000103],"street":"Flatbush Avenue", "zipcode":"11225"},"borough":"Brooklyn","cuisine":"Hamburgers","grades":[{"date":{"$date":1419897600000},"grade":"A","score":8},{"date":{"$date":1404172800000},"grade":"B","score":23},{"date":{"$date":1367280000000},"grade":"A","score":12},{"date":{"$date":1336435200000},"grade":"A","score":12}],"name":"Wendy'S","restaurant_id":"30112340"} +{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.985135599999992451,40.767691900000002647],"street":"West 57Street", "zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":1409961600000},"grade":"A","score":2},{"date":{"$date":1374451200000},"grade":"A","score":11},{"date":{"$date":1343692800000},"grade":"A","score":12},{"date":{"$date":1325116800000},"grade":"A","score":12}],"name":"Dj ReynoldsPubAndRestaurant", "restaurant_id":"30191841"} +DROP TABLE t1; +# +# Test catfunc +# +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants CATFUNC=columns +OPTION_LIST='Level=1,Driver=C,Version=0' DATA_CHARSET=utf8 ; +SELECT * from t1; +Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Nullable Bpath +_id 1 CHAR 24 24 0 0 +address_building 1 CHAR 10 10 0 0 address.building +address_coord 1 CHAR 512 512 0 0 address.coord +address_street 1 CHAR 38 38 0 0 address.street +address_zipcode 1 CHAR 5 5 0 0 address.zipcode +borough 1 CHAR 13 13 0 0 +cuisine 1 CHAR 64 64 0 0 +grades_0 1 CHAR 512 512 0 1 grades.0 +name 1 CHAR 98 98 0 0 +restaurant_id 1 CHAR 8 8 0 0 +DROP TABLE t1; +# +# Explicit columns +# +CREATE TABLE t1 ( +_id VARCHAR(24) NOT NULL, +name VARCHAR(255) NOT NULL, +cuisine VARCHAR(255) NOT NULL, +borough VARCHAR(255) NOT NULL, +restaurant_id VARCHAR(255) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants +CONNECTION='mongodb://localhost:27017' LRECL=1024 DATA_CHARSET=utf8 +OPTION_LIST='Driver=C,Version=0'; +SELECT * FROM t1 LIMIT 10; +_id name cuisine borough restaurant_id +58ada47de5a51ddfcd5ed51c Morris Park Bake Shop Bakery Bronx 30075445 +58ada47de5a51ddfcd5ed51d Wendy'S Hamburgers Brooklyn 30112340 +58ada47de5a51ddfcd5ed51e Dj Reynolds Pub And Restaurant Irish Manhattan 30191841 +58ada47de5a51ddfcd5ed51f Riviera Caterer American Brooklyn 40356018 +58ada47de5a51ddfcd5ed520 Tov Kosher Kitchen Jewish/Kosher Queens 40356068 +58ada47de5a51ddfcd5ed521 Brunos On The Boulevard American Queens 40356151 +58ada47de5a51ddfcd5ed522 Kosher Island Jewish/Kosher Staten Island 40356442 +58ada47de5a51ddfcd5ed523 Wilken'S Fine Food Delicatessen Brooklyn 40356483 +58ada47de5a51ddfcd5ed524 Regina Caterers American Brooklyn 40356649 +58ada47de5a51ddfcd5ed525 Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn 40356731 +DROP TABLE t1; +# +# Test discovery +# +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants +OPTION_LIST='Level=1,Driver=C,Version=0' DATA_CHARSET=utf8; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `_id` char(24) NOT NULL, + `address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building', + `address_coord` varchar(512) NOT NULL `FIELD_FORMAT`='address.coord', + `address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street', + `address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode', + `borough` char(13) NOT NULL, + `cuisine` char(64) NOT NULL, + `grades_0` varchar(512) DEFAULT NULL `FIELD_FORMAT`='grades.0', + `name` char(98) NOT NULL, + `restaurant_id` char(8) NOT NULL +) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `OPTION_LIST`='Level=1,Driver=C,Version=0' `DATA_CHARSET`='utf8' +SELECT * FROM t1 LIMIT 5; +_id address_building address_coord address_street address_zipcode borough cuisine grades_0 name restaurant_id +58ada47de5a51ddfcd5ed51c 1007 Morris Park Ave 10462 Bronx Bakery {"date":{"$date":1393804800000},"grade":"A","score":2} Morris Park Bake Shop 30075445 +58ada47de5a51ddfcd5ed51d 469 Flatbush Avenue 11225 Brooklyn Hamburgers {"date":{"$date":1419897600000},"grade":"A","score":8} Wendy'S 30112340 +58ada47de5a51ddfcd5ed51e 351 West 57 Street 10019 Manhattan Irish {"date":{"$date":1409961600000},"grade":"A","score":2} Dj Reynolds Pub And Restaurant 30191841 +58ada47de5a51ddfcd5ed51f 2780 Stillwell Avenue 11224 Brooklyn American {"date":{"$date":1402358400000},"grade":"A","score":5} Riviera Caterer 40356018 +58ada47de5a51ddfcd5ed520 97-22 63 Road 11374 Queens Jewish/Kosher {"date":{"$date":1416787200000},"grade":"Z","score":20} Tov Kosher Kitchen 40356068 +DROP TABLE t1; +# +# Dropping a column +# +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants DATA_CHARSET=utf8 +COLIST='{"projection":{"grades":0}}' OPTION_LIST='Driver=C,Version=0,level=0' ; +SELECT * FROM t1 LIMIT 10; +_id address borough cuisine name restaurant_id +58ada47de5a51ddfcd5ed51c {"building":"1007","coord":[-73.856076999999999089,40.848447000000000173],"street":"Morris ParkAve", "zipcode":"10462"} Bronx Bakery Morris Park Bake Shop 30075445 +58ada47de5a51ddfcd5ed51d {"building":"469","coord":[-73.96170399999999745,40.66294200000000103],"street":"Flatbush Avenue", "zipcode":"11225"} Brooklyn Hamburgers Wendy'S 30112340 +58ada47de5a51ddfcd5ed51e {"building":"351","coord":[-73.985135599999992451,40.767691900000002647],"street":"West 57Street", "zipcode":"10019"} Manhattan Irish Dj Reynolds Pub And Restaurant 30191841 +58ada47de5a51ddfcd5ed51f {"building":"2780","coord":[-73.982419999999990523,40.579504999999997494],"street":"Stillwell Avenue", "zipcode":"11224"} Brooklyn American Riviera Caterer 40356018 +58ada47de5a51ddfcd5ed520 {"building":"97-22","coord":[-73.860115199999995639,40.731173900000001709],"street":"63 Road", "zipcode":"11374"} Queens Jewish/Kosher Tov Kosher Kitchen 40356068 +58ada47de5a51ddfcd5ed521 {"building":"8825","coord":[-73.880382699999998408,40.764312400000001446],"street":"Astoria Boulevard", "zipcode":"11369"} Queens American Brunos On The Boulevard 40356151 +58ada47de5a51ddfcd5ed522 {"building":"2206","coord":[-74.137728600000002643,40.611957199999999091],"street":"Victory Boulevard", "zipcode":"10314"} Staten Island Jewish/Kosher Kosher Island 40356442 +58ada47de5a51ddfcd5ed523 {"building":"7114","coord":[-73.906850599999998508,40.619903399999998328],"street":"Avenue U", "zipcode":"11234"} Brooklyn Delicatessen Wilken'S Fine Food 40356483 +58ada47de5a51ddfcd5ed524 {"building":"6409","coord":[-74.005288999999990551,40.628886000000001388],"street":"11 Avenue", "zipcode":"11219"} Brooklyn American Regina Caterers 40356649 +58ada47de5a51ddfcd5ed525 {"building":"1839","coord":[-73.948260899999993967,40.640827100000002758],"street":"Nostrand Avenue", "zipcode":"11226"} Brooklyn Ice Cream, Gelato, Yogurt, Ices Taste The Tropics Ice Cream 40356731 +DROP TABLE t1; +# +# Specifying Jpath +# +CREATE TABLE t1 ( +_id VARCHAR(24) NOT NULL, +name VARCHAR(64) NOT NULL, +cuisine CHAR(200) NOT NULL, +borough CHAR(16) NOT NULL, +street VARCHAR(65) FIELD_FORMAT='address.street', +building CHAR(16) FIELD_FORMAT='address.building', +zipcode CHAR(5) FIELD_FORMAT='address.zipcode', +grade CHAR(1) FIELD_FORMAT='grades.0.grade', +score INT(4) NOT NULL FIELD_FORMAT='grades.0.score', +`date` DATE FIELD_FORMAT='grades.0.date', +restaurant_id VARCHAR(255) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='restaurants' DATA_CHARSET=utf8 +OPTION_LIST='Driver=C,Version=0' ; +SELECT * FROM t1 LIMIT 1; +_id 58ada47de5a51ddfcd5ed51c +name Morris Park Bake Shop +cuisine Bakery +borough Bronx +street Morris Park Ave +building 1007 +zipcode 10462 +grade A +score 2 +date 2014-03-03 +restaurant_id 30075445 +SELECT name, street, score, date FROM t1 LIMIT 5; +name street score date +Morris Park Bake Shop Morris Park Ave 2 2014-03-03 +Wendy'S Flatbush Avenue 8 2014-12-30 +Dj Reynolds Pub And Restaurant West 57 Street 2 2014-09-06 +Riviera Caterer Stillwell Avenue 5 2014-06-10 +Tov Kosher Kitchen 63 Road 20 2014-11-24 +SELECT name, cuisine, borough FROM t1 WHERE grade = 'A' LIMIT 10; +name cuisine borough +Morris Park Bake Shop Bakery Bronx +Wendy'S Hamburgers Brooklyn +Dj Reynolds Pub And Restaurant Irish Manhattan +Riviera Caterer American Brooklyn +Kosher Island Jewish/Kosher Staten Island +Wilken'S Fine Food Delicatessen Brooklyn +Regina Caterers American Brooklyn +Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn +Wild Asia American Bronx +C & C Catering Service American Brooklyn +SELECT COUNT(*) FROM t1 WHERE grade = 'A'; +COUNT(*) +20687 +SELECT * FROM t1 WHERE cuisine = 'English'; +_id name cuisine borough street building zipcode grade score date restaurant_id +58ada47de5a51ddfcd5ed83d Tea And Sympathy English Manhattan Greenwich Avenue 108 10011 A 8 2014-10-23 40391531 +58ada47de5a51ddfcd5ed85c Tartine English Manhattan West 11 Street 253 10014 A 11 2014-08-14 40392496 +58ada47de5a51ddfcd5ee1f3 The Park Slope Chipshop English Brooklyn 5 Avenue 383 11215 B 17 2014-09-29 40816202 +58ada47de5a51ddfcd5ee7e4 Pound And Pence English Manhattan Liberty Street 55 10005 A 7 2014-02-11 41022701 +58ada47de5a51ddfcd5ee999 Chip Shop English Brooklyn Atlantic Avenue 129 11201 A 9 2014-10-08 41076583 +58ada47ee5a51ddfcd5efe3f The Breslin Bar & Dining Room English Manhattan West 29 Street 16 10001 A 13 2014-06-09 41443706 +58ada47ee5a51ddfcd5efe99 Highlands Restaurant English Manhattan West 10 Street 150 10014 A 12 2014-10-22 41448559 +58ada47ee5a51ddfcd5f0413 The Fat Radish English Manhattan Orchard Street 17 10002 A 12 2014-07-26 41513545 +58ada47ee5a51ddfcd5f0777 Jones Wood Foundry English Manhattan East 76 Street 401 10021 A 12 2014-12-03 41557377 +58ada47ee5a51ddfcd5f0ea2 Whitehall English Manhattan Greenwich Avenue 19 10014 Z 15 2015-01-16 41625263 +58ada47ee5a51ddfcd5f1004 The Churchill Tavern English Manhattan East 28 Street 45 10016 A 13 2014-08-27 41633327 +58ada47ee5a51ddfcd5f13d5 The Monro English Brooklyn 5 Avenue 481 11215 A 7 2014-06-03 41660253 +58ada47ee5a51ddfcd5f1454 The Cock & Bull English Manhattan West 45 Street 23 10036 A 7 2014-08-07 41664704 +58ada47ee5a51ddfcd5f176e Dear Bushwick English Brooklyn Wilson Avenue 41 11237 A 12 2014-12-27 41690534 +58ada47ee5a51ddfcd5f1e91 Snowdonia Pub English Queens 32 Street 34-55 11106 A 12 2014-10-28 50000290 +58ada47ee5a51ddfcd5f2ddc Oscar'S Place English Manhattan Hudson Street 466 10014 A 10 2014-08-18 50011097 +SELECT * FROM t1 WHERE score = building; +_id name cuisine borough street building zipcode grade score date restaurant_id +DROP TABLE t1; +# +# Specifying Filter +# +CREATE TABLE t1 ( +_id CHAR(24) NOT NULL, +name CHAR(64) NOT NULL, +borough CHAR(16) NOT NULL, +restaurant_id CHAR(8) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants DATA_CHARSET=utf8 +FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' +OPTION_LIST='Driver=C,Version=0' ; +SELECT name FROM t1 WHERE borough = 'Queens'; +name +La Baraka Restaurant +Air France Lounge +Tournesol +Winegasm +Cafe Henri +Bistro 33 +Domaine Wine Bar +Cafe Triskell +Cannelle Patisserie +La Vie +Dirty Pierres Bistro +Fresca La Crepe +Bliss 46 Bistro +Bear +Cuisine By Claudette +Paris Baguette +The Baroness Bar +Francis Cafe +Madame Sou Sou +Crepe 'N' Tearia +Aperitif Bayside Llc +DROP TABLE t1; +# +# Testing pipeline +# +CREATE TABLE t1 ( +name VARCHAR(64) NOT NULL, +borough CHAR(16) NOT NULL, +date DATETIME NOT NULL, +grade CHAR(1) NOT NULL, +score INT(4) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='restaurants' DATA_CHARSET=utf8 +COLIST='{"pipeline":[{"$match":{"cuisine":"French"}},{"$unwind":"$grades"},{"$project":{"_id":0,"name":1,"borough":1,"date":"$grades.date","grade":"$grades.grade","score":"$grades.score"}}]}' +OPTION_LIST='Driver=C,Version=0,Pipeline=1' ; +SELECT * FROM t1 LIMIT 10; +name borough date grade score +Tout Va Bien Manhattan 2014-11-10 01:00:00 B 15 +Tout Va Bien Manhattan 2014-04-03 02:00:00 A 13 +Tout Va Bien Manhattan 2013-07-17 02:00:00 C 36 +Tout Va Bien Manhattan 2013-02-06 01:00:00 B 22 +Tout Va Bien Manhattan 2012-07-16 02:00:00 C 36 +Tout Va Bien Manhattan 2012-03-08 01:00:00 C 7 +La Grenouille Manhattan 2014-04-09 02:00:00 A 10 +La Grenouille Manhattan 2013-03-05 01:00:00 A 9 +La Grenouille Manhattan 2012-02-02 01:00:00 A 13 +Le Perigord Manhattan 2014-07-14 02:00:00 B 14 +SELECT name, grade, score, date FROM t1 WHERE borough = 'Bronx'; +name grade score date +Bistro Sk A 10 2014-11-21 01:00:00 +Bistro Sk A 12 2014-02-19 01:00:00 +Bistro Sk B 18 2013-06-12 02:00:00 +DROP TABLE t1; +# +# try level 2 discovery +# +CREATE TABLE t1 +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants +FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' +COLIST='{"projection":{"cuisine":0}}' +OPTION_LIST='Driver=C,level=2,version=0'; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `_id` char(24) NOT NULL, + `address_building` char(6) NOT NULL `FIELD_FORMAT`='address.building', + `address_coord_0` double(12,6) NOT NULL `FIELD_FORMAT`='address.coord.0', + `address_street` char(25) NOT NULL `FIELD_FORMAT`='address.street', + `address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode', + `borough` char(13) NOT NULL, + `grades_0_date` datetime NOT NULL `FIELD_FORMAT`='grades.0.date', + `grades_0_grade` char(14) NOT NULL `FIELD_FORMAT`='grades.0.grade', + `grades_0_score` int(11) NOT NULL `FIELD_FORMAT`='grades.0.score', + `name` char(32) NOT NULL, + `restaurant_id` char(8) NOT NULL +) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `COLIST`='{"projection":{"cuisine":0}}' `FILTER`='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' `OPTION_LIST`='Driver=C,level=2,version=0' +SELECT name, borough, address_street, grades_0_score AS score FROM t1 WHERE grades_0_grade = 'B'; +name borough address_street score +Le Gamin Brooklyn Vanderbilt Avenue 24 +Bistro 33 Queens Ditmars Boulevard 15 +Dirty Pierres Bistro Queens Station Square 22 +Santos Anne Brooklyn Union Avenue 26 +Le Paddock Brooklyn Prospect Avenue 17 +La Crepe Et La Vie Brooklyn Foster Avenue 24 +Francis Cafe Queens Ditmars Boulevard 19 +DROP TABLE t1; +# +# try CRUD operations +# +false +CREATE TABLE t1 (_id INT(4) NOT NULL, msg CHAR(64)) +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='testcoll' +OPTION_LIST='Driver=C,Version=0' ; +DELETE FROM t1; +INSERT INTO t1 VALUES(0,NULL),(1,'One'),(2,'Two'),(3,'Three'); +SELECT * FROM t1; +_id msg +0 NULL +1 One +2 Two +3 Three +UPDATE t1 SET msg = 'Deux' WHERE _id = 2; +DELETE FROM t1 WHERE msg IS NULL; +SELECT * FROM t1; +_id msg +1 One +2 Deux +3 Three +DELETE FROM t1; +DROP TABLE t1; +true +# +# List states whose population is equal or more than 10 millions +# +false +CREATE TABLE t1 ( +_id char(5) NOT NULL, +city char(16) NOT NULL, +loc_0 double(12,6) NOT NULL `FIELD_FORMAT`='loc.0', +loc_1 char(12) NOT NULL `FIELD_FORMAT`='loc.1', +pop int(11) NOT NULL, +state char(2) NOT NULL) +ENGINE=CONNECT CONNECTION='mongodb://localhost:27017' TABLE_TYPE='MONGO' TABNAME='cities' +OPTION_LIST='Driver=C,Version=0' DATA_CHARSET='utf8'; +# Using SQL for grouping +SELECT state, sum(pop) AS totalPop FROM t1 GROUP BY state HAVING totalPop >= 10000000 ORDER BY totalPop DESC; +state totalPop +CA 29754890 +NY 17990402 +TX 16984601 +FL 12686644 +PA 11881643 +IL 11427576 +OH 10846517 +DROP TABLE t1; +# Using a pipeline for grouping +CREATE TABLE t1 (_id CHAR(2) NOT NULL, totalPop INT(11) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='cities' DATA_CHARSET=utf8 +COLIST='{"pipeline":[{"$group":{"_id":"$state","totalPop":{"$sum":"$pop"}}},{"$match":{"totalPop":{"$gte":10000000}}},{"$sort":{"totalPop":-1}}]}' +OPTION_LIST='Driver=C,Version=0,Pipeline=1' ; +SELECT * FROM t1; +_id totalPop +CA 29754890 +NY 17990402 +TX 16984601 +FL 12686644 +PA 11881643 +IL 11427576 +OH 10846517 +DROP TABLE t1; +true +# +# Test making array +# +CREATE TABLE t1 ( +_id int(4) NOT NULL, +item CHAR(8) NOT NULL, +prices_0 INT(6) FIELD_FORMAT='prices.0', +prices_1 INT(6) FIELD_FORMAT='prices.1', +prices_2 INT(6) FIELD_FORMAT='prices.2', +prices_3 INT(6) FIELD_FORMAT='prices.3', +prices_4 INT(6) FIELD_FORMAT='prices.4') +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='testcoll' DATA_CHARSET=utf8 +OPTION_LIST='Driver=C,Version=0' ; +INSERT INTO t1 VALUES +(1,'journal',87,45,63,12,78), +(2,'notebook',123,456,789,NULL,NULL), +(3,'paper',5,7,3,8,NULL), +(4,'planner',25,71,NULL,44,27), +(5,'postcard',5,7,3,8,NULL); +SELECT * FROM t1; +_id item prices_0 prices_1 prices_2 prices_3 prices_4 +1 journal 87 45 63 12 78 +2 notebook 123 456 789 NULL NULL +3 paper 5 7 3 8 NULL +4 planner 25 71 NULL 44 27 +5 postcard 5 7 3 8 NULL +DROP TABLE t1; +# +# Test array aggregation +# +CREATE TABLE t1 +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='testcoll' +COLIST='{"pipeline":[{"$project":{"_id":0,"item":1,"total":{"$sum":"$prices"},"average":{"$avg":"$prices"}}}]}' +OPTION_LIST='Driver=C,Version=0,Pipeline=YES' ; +SELECT * FROM t1; +item total average +journal 285 57.000000 +notebook 1368 456.000000 +paper 23 5.750000 +planner 167 41.750000 +postcard 23 5.750000 +DROP TABLE t1; +true diff --git a/storage/connect/mysql-test/connect/r/mongo_java_2.result b/storage/connect/mysql-test/connect/r/mongo_java_2.result new file mode 100644 index 00000000000..b1e9ea74f72 --- /dev/null +++ b/storage/connect/mysql-test/connect/r/mongo_java_2.result @@ -0,0 +1,379 @@ +SET GLOBAL connect_class_path='C:/MariaDB-10.2/MariaDB/storage/connect/mysql-test/connect/std_data/Mongo2.jar'; +# +# Test the MONGO table type +# +CREATE TABLE t1 (Document varchar(1024) field_format='*') +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants +OPTION_LIST='Driver=Java,Version=2' DATA_CHARSET=utf8; +SELECT * from t1 limit 3; +Document +{ "_id" : { "$oid" : "58ada47de5a51ddfcd5ed51c"} , "address" : { "building" : "1007" , "coord" : [ -73.856077 , 40.848447] , "street" : "Morris Park Ave" , "zipcode" : "10462"} , "borough" : "Bronx" , "cuisine" : "Bakery" , "grades" : [ { "date" : { "$date" : "2014-03-03T00:00:00.000Z"} , "grade" : "A" , "score" : 2} , { "date" : { "$date" : "2013-09-11T00:00:00.000Z"} , "grade" : "A" , "score" : 6} , { "date" : { "$date" : "2013-01-24T00:00:00.000Z"} , "grade" : "A" , "score" : 10} , { "date" : { "$date" : "2011-11-23T00:00:00.000Z"} , "grade" : "A" , "score" : 9} , { "date" : { "$date" : "2011-03-10T00:00:00.000Z"} , "grade" : "B" , "score" : 14}] , "name" : "Morris Park Bake Shop" , "restaurant_id" : "30075445"} +{ "_id" : { "$oid" : "58ada47de5a51ddfcd5ed51d"} , "address" : { "building" : "469" , "coord" : [ -73.961704 , 40.662942] , "street" : "Flatbush Avenue" , "zipcode" : "11225"} , "borough" : "Brooklyn" , "cuisine" : "Hamburgers" , "grades" : [ { "date" : { "$date" : "2014-12-30T00:00:00.000Z"} , "grade" : "A" , "score" : 8} , { "date" : { "$date" : "2014-07-01T00:00:00.000Z"} , "grade" : "B" , "score" : 23} , { "date" : { "$date" : "2013-04-30T00:00:00.000Z"} , "grade" : "A" , "score" : 12} , { "date" : { "$date" : "2012-05-08T00:00:00.000Z"} , "grade" : "A" , "score" : 12}] , "name" : "Wendy'S" , "restaurant_id" : "30112340"} +{ "_id" : { "$oid" : "58ada47de5a51ddfcd5ed51e"} , "address" : { "building" : "351" , "coord" : [ -73.98513559999999 , 40.7676919] , "street" : "West 57 Street" , "zipcode" : "10019"} , "borough" : "Manhattan" , "cuisine" : "Irish" , "grades" : [ { "date" : { "$date" : "2014-09-06T00:00:00.000Z"} , "grade" : "A" , "score" : 2} , { "date" : { "$date" : "2013-07-22T00:00:00.000Z"} , "grade" : "A" , "score" : 11} , { "date" : { "$date" : "2012-07-31T00:00:00.000Z"} , "grade" : "A" , "score" : 12} , { "date" : { "$date" : "2011-12-29T00:00:00.000Z"} , "grade" : "A" , "score" : 12}] , "name" : "Dj Reynolds Pub And Restaurant" , "restaurant_id" : "30191841"} +DROP TABLE t1; +# +# Test catfunc +# +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants CATFUNC=columns +OPTION_LIST='Level=1,Driver=Java,Version=2' DATA_CHARSET=utf8 ; +SELECT * from t1; +Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Nullable Bpath +_id 1 CHAR 24 24 0 0 +address_building 1 CHAR 10 10 0 0 address.building +address_coord 1 CHAR 41 41 0 0 address.coord +address_street 1 CHAR 38 38 0 0 address.street +address_zipcode 1 CHAR 5 5 0 0 address.zipcode +borough 1 CHAR 13 13 0 0 +cuisine 1 CHAR 64 64 0 0 +grades_0 1 CHAR 99 99 0 1 grades.0 +name 1 CHAR 98 98 0 0 +restaurant_id 1 CHAR 8 8 0 0 +DROP TABLE t1; +# +# Explicit columns +# +CREATE TABLE t1 ( +_id VARCHAR(24) NOT NULL, +name VARCHAR(255) NOT NULL, +cuisine VARCHAR(255) NOT NULL, +borough VARCHAR(255) NOT NULL, +restaurant_id VARCHAR(255) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants +CONNECTION='mongodb://localhost:27017' LRECL=1024 DATA_CHARSET=utf8 +OPTION_LIST='Driver=Java,Version=2'; +SELECT * FROM t1 LIMIT 10; +_id name cuisine borough restaurant_id +58ada47de5a51ddfcd5ed51c Morris Park Bake Shop Bakery Bronx 30075445 +58ada47de5a51ddfcd5ed51d Wendy'S Hamburgers Brooklyn 30112340 +58ada47de5a51ddfcd5ed51e Dj Reynolds Pub And Restaurant Irish Manhattan 30191841 +58ada47de5a51ddfcd5ed51f Riviera Caterer American Brooklyn 40356018 +58ada47de5a51ddfcd5ed520 Tov Kosher Kitchen Jewish/Kosher Queens 40356068 +58ada47de5a51ddfcd5ed521 Brunos On The Boulevard American Queens 40356151 +58ada47de5a51ddfcd5ed522 Kosher Island Jewish/Kosher Staten Island 40356442 +58ada47de5a51ddfcd5ed523 Wilken'S Fine Food Delicatessen Brooklyn 40356483 +58ada47de5a51ddfcd5ed524 Regina Caterers American Brooklyn 40356649 +58ada47de5a51ddfcd5ed525 Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn 40356731 +DROP TABLE t1; +# +# Test discovery +# +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants +OPTION_LIST='Level=1,Driver=Java,Version=2' DATA_CHARSET=utf8; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `_id` char(24) NOT NULL, + `address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building', + `address_coord` char(41) NOT NULL `FIELD_FORMAT`='address.coord', + `address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street', + `address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode', + `borough` char(13) NOT NULL, + `cuisine` char(64) NOT NULL, + `grades_0` char(99) DEFAULT NULL `FIELD_FORMAT`='grades.0', + `name` char(98) NOT NULL, + `restaurant_id` char(8) NOT NULL +) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `OPTION_LIST`='Level=1,Driver=Java,Version=2' `DATA_CHARSET`='utf8' +SELECT * FROM t1 LIMIT 5; +_id address_building address_coord address_street address_zipcode borough cuisine grades_0 name restaurant_id +58ada47de5a51ddfcd5ed51c 1007 [ -73.856077 , 40.848447] Morris Park Ave 10462 Bronx Bakery { "date" : { "$date" : "2014-03-03T00:00:00.000Z"} , "grade" : "A" , "score" : 2} Morris Park Bake Shop 30075445 +58ada47de5a51ddfcd5ed51d 469 [ -73.961704 , 40.662942] Flatbush Avenue 11225 Brooklyn Hamburgers { "date" : { "$date" : "2014-12-30T00:00:00.000Z"} , "grade" : "A" , "score" : 8} Wendy'S 30112340 +58ada47de5a51ddfcd5ed51e 351 [ -73.98513559999999 , 40.7676919] West 57 Street 10019 Manhattan Irish { "date" : { "$date" : "2014-09-06T00:00:00.000Z"} , "grade" : "A" , "score" : 2} Dj Reynolds Pub And Restaurant 30191841 +58ada47de5a51ddfcd5ed51f 2780 [ -73.98241999999999 , 40.579505] Stillwell Avenue 11224 Brooklyn American { "date" : { "$date" : "2014-06-10T00:00:00.000Z"} , "grade" : "A" , "score" : 5} Riviera Caterer 40356018 +58ada47de5a51ddfcd5ed520 97-22 [ -73.8601152 , 40.7311739] 63 Road 11374 Queens Jewish/Kosher { "date" : { "$date" : "2014-11-24T00:00:00.000Z"} , "grade" : "Z" , "score" : 20} Tov Kosher Kitchen 40356068 +DROP TABLE t1; +# +# Dropping a column +# +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants DATA_CHARSET=utf8 +COLIST='{"grades":0}' OPTION_LIST='Driver=Java,Version=2,level=0' ; +SELECT * FROM t1 LIMIT 10; +_id address borough cuisine name restaurant_id +58ada47de5a51ddfcd5ed51c { "building" : "1007" , "coord" : [ -73.856077 , 40.848447] , "street" : "Morris Park Ave" , "zipcode" : "10462"} Bronx Bakery Morris Park Bake Shop 30075445 +58ada47de5a51ddfcd5ed51d { "building" : "469" , "coord" : [ -73.961704 , 40.662942] , "street" : "Flatbush Avenue" , "zipcode" : "11225"} Brooklyn Hamburgers Wendy'S 30112340 +58ada47de5a51ddfcd5ed51e { "building" : "351" , "coord" : [ -73.98513559999999 , 40.7676919] , "street" : "West 57 Street" , "zipcode" : "10019"} Manhattan Irish Dj Reynolds Pub And Restaurant 30191841 +58ada47de5a51ddfcd5ed51f { "building" : "2780" , "coord" : [ -73.98241999999999 , 40.579505] , "street" : "Stillwell Avenue" , "zipcode" : "11224"} Brooklyn American Riviera Caterer 40356018 +58ada47de5a51ddfcd5ed520 { "building" : "97-22" , "coord" : [ -73.8601152 , 40.7311739] , "street" : "63 Road" , "zipcode" : "11374"} Queens Jewish/Kosher Tov Kosher Kitchen 40356068 +58ada47de5a51ddfcd5ed521 { "building" : "8825" , "coord" : [ -73.8803827 , 40.7643124] , "street" : "Astoria Boulevard" , "zipcode" : "11369"} Queens American Brunos On The Boulevard 40356151 +58ada47de5a51ddfcd5ed522 { "building" : "2206" , "coord" : [ -74.1377286 , 40.6119572] , "street" : "Victory Boulevard" , "zipcode" : "10314"} Staten Island Jewish/Kosher Kosher Island 40356442 +58ada47de5a51ddfcd5ed523 { "building" : "7114" , "coord" : [ -73.9068506 , 40.6199034] , "street" : "Avenue U" , "zipcode" : "11234"} Brooklyn Delicatessen Wilken'S Fine Food 40356483 +58ada47de5a51ddfcd5ed524 { "building" : "6409" , "coord" : [ -74.00528899999999 , 40.628886] , "street" : "11 Avenue" , "zipcode" : "11219"} Brooklyn American Regina Caterers 40356649 +58ada47de5a51ddfcd5ed525 { "building" : "1839" , "coord" : [ -73.9482609 , 40.6408271] , "street" : "Nostrand Avenue" , "zipcode" : "11226"} Brooklyn Ice Cream, Gelato, Yogurt, Ices Taste The Tropics Ice Cream 40356731 +DROP TABLE t1; +# +# Specifying Jpath +# +CREATE TABLE t1 ( +_id VARCHAR(24) NOT NULL, +name VARCHAR(64) NOT NULL, +cuisine CHAR(200) NOT NULL, +borough CHAR(16) NOT NULL, +street VARCHAR(65) FIELD_FORMAT='address.street', +building CHAR(16) FIELD_FORMAT='address.building', +zipcode CHAR(5) FIELD_FORMAT='address.zipcode', +grade CHAR(1) FIELD_FORMAT='grades.0.grade', +score INT(4) NOT NULL FIELD_FORMAT='grades.0.score', +`date` DATE FIELD_FORMAT='grades.0.date', +restaurant_id VARCHAR(255) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='restaurants' DATA_CHARSET=utf8 +OPTION_LIST='Driver=Java,Version=2' ; +SELECT * FROM t1 LIMIT 1; +_id 58ada47de5a51ddfcd5ed51c +name Morris Park Bake Shop +cuisine Bakery +borough Bronx +street Morris Park Ave +building 1007 +zipcode 10462 +grade A +score 2 +date 2014-03-03 +restaurant_id 30075445 +SELECT name, street, score, date FROM t1 LIMIT 5; +name street score date +Morris Park Bake Shop Morris Park Ave 2 2014-03-03 +Wendy'S Flatbush Avenue 8 2014-12-30 +Dj Reynolds Pub And Restaurant West 57 Street 2 2014-09-06 +Riviera Caterer Stillwell Avenue 5 2014-06-10 +Tov Kosher Kitchen 63 Road 20 2014-11-24 +SELECT name, cuisine, borough FROM t1 WHERE grade = 'A' LIMIT 10; +name cuisine borough +Morris Park Bake Shop Bakery Bronx +Wendy'S Hamburgers Brooklyn +Dj Reynolds Pub And Restaurant Irish Manhattan +Riviera Caterer American Brooklyn +Kosher Island Jewish/Kosher Staten Island +Wilken'S Fine Food Delicatessen Brooklyn +Regina Caterers American Brooklyn +Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn +Wild Asia American Bronx +C & C Catering Service American Brooklyn +SELECT COUNT(*) FROM t1 WHERE grade = 'A'; +COUNT(*) +20687 +SELECT * FROM t1 WHERE cuisine = 'English'; +_id name cuisine borough street building zipcode grade score date restaurant_id +58ada47de5a51ddfcd5ed83d Tea And Sympathy English Manhattan Greenwich Avenue 108 10011 A 8 2014-10-23 40391531 +58ada47de5a51ddfcd5ed85c Tartine English Manhattan West 11 Street 253 10014 A 11 2014-08-14 40392496 +58ada47de5a51ddfcd5ee1f3 The Park Slope Chipshop English Brooklyn 5 Avenue 383 11215 B 17 2014-09-29 40816202 +58ada47de5a51ddfcd5ee7e4 Pound And Pence English Manhattan Liberty Street 55 10005 A 7 2014-02-11 41022701 +58ada47de5a51ddfcd5ee999 Chip Shop English Brooklyn Atlantic Avenue 129 11201 A 9 2014-10-08 41076583 +58ada47ee5a51ddfcd5efe3f The Breslin Bar & Dining Room English Manhattan West 29 Street 16 10001 A 13 2014-06-09 41443706 +58ada47ee5a51ddfcd5efe99 Highlands Restaurant English Manhattan West 10 Street 150 10014 A 12 2014-10-22 41448559 +58ada47ee5a51ddfcd5f0413 The Fat Radish English Manhattan Orchard Street 17 10002 A 12 2014-07-26 41513545 +58ada47ee5a51ddfcd5f0777 Jones Wood Foundry English Manhattan East 76 Street 401 10021 A 12 2014-12-03 41557377 +58ada47ee5a51ddfcd5f0ea2 Whitehall English Manhattan Greenwich Avenue 19 10014 Z 15 2015-01-16 41625263 +58ada47ee5a51ddfcd5f1004 The Churchill Tavern English Manhattan East 28 Street 45 10016 A 13 2014-08-27 41633327 +58ada47ee5a51ddfcd5f13d5 The Monro English Brooklyn 5 Avenue 481 11215 A 7 2014-06-03 41660253 +58ada47ee5a51ddfcd5f1454 The Cock & Bull English Manhattan West 45 Street 23 10036 A 7 2014-08-07 41664704 +58ada47ee5a51ddfcd5f176e Dear Bushwick English Brooklyn Wilson Avenue 41 11237 A 12 2014-12-27 41690534 +58ada47ee5a51ddfcd5f1e91 Snowdonia Pub English Queens 32 Street 34-55 11106 A 12 2014-10-28 50000290 +58ada47ee5a51ddfcd5f2ddc Oscar'S Place English Manhattan Hudson Street 466 10014 A 10 2014-08-18 50011097 +SELECT * FROM t1 WHERE score = building; +_id name cuisine borough street building zipcode grade score date restaurant_id +DROP TABLE t1; +# +# Specifying Filter +# +CREATE TABLE t1 ( +_id CHAR(24) NOT NULL, +name CHAR(64) NOT NULL, +borough CHAR(16) NOT NULL, +restaurant_id CHAR(8) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants DATA_CHARSET=utf8 +FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' +OPTION_LIST='Driver=Java,Version=2' ; +SELECT name FROM t1 WHERE borough = 'Queens'; +name +La Baraka Restaurant +Air France Lounge +Tournesol +Winegasm +Cafe Henri +Bistro 33 +Domaine Wine Bar +Cafe Triskell +Cannelle Patisserie +La Vie +Dirty Pierres Bistro +Fresca La Crepe +Bliss 46 Bistro +Bear +Cuisine By Claudette +Paris Baguette +The Baroness Bar +Francis Cafe +Madame Sou Sou +Crepe 'N' Tearia +Aperitif Bayside Llc +DROP TABLE t1; +# +# Testing pipeline +# +CREATE TABLE t1 ( +name VARCHAR(64) NOT NULL, +borough CHAR(16) NOT NULL, +date DATETIME NOT NULL, +grade CHAR(1) NOT NULL, +score INT(4) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='restaurants' DATA_CHARSET=utf8 +COLIST='{"pipeline":[{"$match":{"cuisine":"French"}},{"$unwind":"$grades"},{"$project":{"_id":0,"name":1,"borough":1,"date":"$grades.date","grade":"$grades.grade","score":"$grades.score"}}]}' +OPTION_LIST='Driver=Java,Version=2,Pipeline=1' ; +SELECT * FROM t1 LIMIT 10; +name borough date grade score +Tout Va Bien Manhattan 2014-11-10 01:00:00 B 15 +Tout Va Bien Manhattan 2014-04-03 02:00:00 A 13 +Tout Va Bien Manhattan 2013-07-17 02:00:00 C 36 +Tout Va Bien Manhattan 2013-02-06 01:00:00 B 22 +Tout Va Bien Manhattan 2012-07-16 02:00:00 C 36 +Tout Va Bien Manhattan 2012-03-08 01:00:00 C 7 +La Grenouille Manhattan 2014-04-09 02:00:00 A 10 +La Grenouille Manhattan 2013-03-05 01:00:00 A 9 +La Grenouille Manhattan 2012-02-02 01:00:00 A 13 +Le Perigord Manhattan 2014-07-14 02:00:00 B 14 +SELECT name, grade, score, date FROM t1 WHERE borough = 'Bronx'; +name grade score date +Bistro Sk A 10 2014-11-21 01:00:00 +Bistro Sk A 12 2014-02-19 01:00:00 +Bistro Sk B 18 2013-06-12 02:00:00 +DROP TABLE t1; +# +# try level 2 discovery +# +CREATE TABLE t1 +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants +FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' +COLIST='{"cuisine":0}' +OPTION_LIST='Driver=Java,level=2,version=2'; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `_id` char(24) NOT NULL, + `address_building` char(6) NOT NULL `FIELD_FORMAT`='address.building', + `address_coord_0` double(18,14) NOT NULL `FIELD_FORMAT`='address.coord.0', + `address_street` char(25) NOT NULL `FIELD_FORMAT`='address.street', + `address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode', + `borough` char(13) NOT NULL, + `grades_0_date` datetime NOT NULL `FIELD_FORMAT`='grades.0.date', + `grades_0_grade` char(14) NOT NULL `FIELD_FORMAT`='grades.0.grade', + `grades_0_score` int(2) NOT NULL `FIELD_FORMAT`='grades.0.score', + `name` char(32) NOT NULL, + `restaurant_id` char(8) NOT NULL +) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `COLIST`='{"cuisine":0}' `FILTER`='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' `OPTION_LIST`='Driver=Java,level=2,version=2' +SELECT name, borough, address_street, grades_0_score AS score FROM t1 WHERE grades_0_grade = 'B'; +name borough address_street score +Le Gamin Brooklyn Vanderbilt Avenue 24 +Bistro 33 Queens Ditmars Boulevard 15 +Dirty Pierres Bistro Queens Station Square 22 +Santos Anne Brooklyn Union Avenue 26 +Le Paddock Brooklyn Prospect Avenue 17 +La Crepe Et La Vie Brooklyn Foster Avenue 24 +Francis Cafe Queens Ditmars Boulevard 19 +DROP TABLE t1; +# +# try CRUD operations +# +false +CREATE TABLE t1 (_id INT(4) NOT NULL, msg CHAR(64)) +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='testcoll' +OPTION_LIST='Driver=Java,Version=2' ; +DELETE FROM t1; +INSERT INTO t1 VALUES(0,NULL),(1,'One'),(2,'Two'),(3,'Three'); +SELECT * FROM t1; +_id msg +0 NULL +1 One +2 Two +3 Three +UPDATE t1 SET msg = 'Deux' WHERE _id = 2; +DELETE FROM t1 WHERE msg IS NULL; +SELECT * FROM t1; +_id msg +1 One +2 Deux +3 Three +DELETE FROM t1; +DROP TABLE t1; +true +# +# List states whose population is equal or more than 10 millions +# +false +CREATE TABLE t1 ( +_id char(5) NOT NULL, +city char(16) NOT NULL, +loc_0 double(12,6) NOT NULL `FIELD_FORMAT`='loc.0', +loc_1 char(12) NOT NULL `FIELD_FORMAT`='loc.1', +pop int(11) NOT NULL, +state char(2) NOT NULL) +ENGINE=CONNECT CONNECTION='mongodb://localhost:27017' TABLE_TYPE='MONGO' TABNAME='cities' +OPTION_LIST='Driver=Java,Version=2' DATA_CHARSET='utf8'; +# Using SQL for grouping +SELECT state, sum(pop) AS totalPop FROM t1 GROUP BY state HAVING totalPop >= 10000000 ORDER BY totalPop DESC; +state totalPop +CA 29754890 +NY 17990402 +TX 16984601 +FL 12686644 +PA 11881643 +IL 11427576 +OH 10846517 +DROP TABLE t1; +# Using a pipeline for grouping +CREATE TABLE t1 (_id CHAR(2) NOT NULL, totalPop INT(11) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='cities' DATA_CHARSET=utf8 +COLIST='{"pipeline":[{"$group":{"_id":"$state","totalPop":{"$sum":"$pop"}}},{"$match":{"totalPop":{"$gte":10000000}}},{"$sort":{"totalPop":-1}}]}' +OPTION_LIST='Driver=Java,Version=2,Pipeline=1' ; +SELECT * FROM t1; +_id totalPop +CA 29754890 +NY 17990402 +TX 16984601 +FL 12686644 +PA 11881643 +IL 11427576 +OH 10846517 +DROP TABLE t1; +true +# +# Test making array +# +CREATE TABLE t1 ( +_id int(4) NOT NULL, +item CHAR(8) NOT NULL, +prices_0 INT(6) FIELD_FORMAT='prices.0', +prices_1 INT(6) FIELD_FORMAT='prices.1', +prices_2 INT(6) FIELD_FORMAT='prices.2', +prices_3 INT(6) FIELD_FORMAT='prices.3', +prices_4 INT(6) FIELD_FORMAT='prices.4') +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='testcoll' DATA_CHARSET=utf8 +OPTION_LIST='Driver=Java,Version=2' ; +INSERT INTO t1 VALUES +(1,'journal',87,45,63,12,78), +(2,'notebook',123,456,789,NULL,NULL), +(3,'paper',5,7,3,8,NULL), +(4,'planner',25,71,NULL,44,27), +(5,'postcard',5,7,3,8,NULL); +SELECT * FROM t1; +_id item prices_0 prices_1 prices_2 prices_3 prices_4 +1 journal 87 45 63 12 78 +2 notebook 123 456 789 NULL NULL +3 paper 5 7 3 8 NULL +4 planner 25 71 NULL 44 27 +5 postcard 5 7 3 8 NULL +DROP TABLE t1; +# +# Test array aggregation +# +CREATE TABLE t1 +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='testcoll' +COLIST='{"pipeline":[{"$project":{"_id":0,"item":1,"total":{"$sum":"$prices"},"average":{"$avg":"$prices"}}}]}' +OPTION_LIST='Driver=Java,Version=2,Pipeline=YES' ; +SELECT * FROM t1; +item total average +journal 285 57.00 +notebook 1368 456.00 +paper 23 5.75 +planner 167 41.75 +postcard 23 5.75 +DROP TABLE t1; +true diff --git a/storage/connect/mysql-test/connect/r/mongo_java_3.result b/storage/connect/mysql-test/connect/r/mongo_java_3.result new file mode 100644 index 00000000000..e2fe584620f --- /dev/null +++ b/storage/connect/mysql-test/connect/r/mongo_java_3.result @@ -0,0 +1,379 @@ +SET GLOBAL connect_class_path='C:/MariaDB-10.2/MariaDB/storage/connect/mysql-test/connect/std_data/Mongo3.jar'; +# +# Test the MONGO table type +# +CREATE TABLE t1 (Document varchar(1024) field_format='*') +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants +OPTION_LIST='Driver=Java,Version=3' DATA_CHARSET=utf8; +SELECT * from t1 limit 3; +Document +{ "_id" : { "$oid" : "58ada47de5a51ddfcd5ed51c" }, "address" : { "building" : "1007", "coord" : [-73.856077, 40.848447], "street" : "Morris Park Ave", "zipcode" : "10462" }, "borough" : "Bronx", "cuisine" : "Bakery", "grades" : [{ "date" : { "$date" : 1393804800000 }, "grade" : "A", "score" : 2 }, { "date" : { "$date" : 1378857600000 }, "grade" : "A", "score" : 6 }, { "date" : { "$date" : 1358985600000 }, "grade" : "A", "score" : 10 }, { "date" : { "$date" : 1322006400000 }, "grade" : "A", "score" : 9 }, { "date" : { "$date" : 1299715200000 }, "grade" : "B", "score" : 14 }], "name" : "Morris Park Bake Shop", "restaurant_id" : "30075445" } +{ "_id" : { "$oid" : "58ada47de5a51ddfcd5ed51d" }, "address" : { "building" : "469", "coord" : [-73.961704, 40.662942], "street" : "Flatbush Avenue", "zipcode" : "11225" }, "borough" : "Brooklyn", "cuisine" : "Hamburgers", "grades" : [{ "date" : { "$date" : 1419897600000 }, "grade" : "A", "score" : 8 }, { "date" : { "$date" : 1404172800000 }, "grade" : "B", "score" : 23 }, { "date" : { "$date" : 1367280000000 }, "grade" : "A", "score" : 12 }, { "date" : { "$date" : 1336435200000 }, "grade" : "A", "score" : 12 }], "name" : "Wendy'S", "restaurant_id" : "30112340" } +{ "_id" : { "$oid" : "58ada47de5a51ddfcd5ed51e" }, "address" : { "building" : "351", "coord" : [-73.98513559999999, 40.7676919], "street" : "West 57 Street", "zipcode" : "10019" }, "borough" : "Manhattan", "cuisine" : "Irish", "grades" : [{ "date" : { "$date" : 1409961600000 }, "grade" : "A", "score" : 2 }, { "date" : { "$date" : 1374451200000 }, "grade" : "A", "score" : 11 }, { "date" : { "$date" : 1343692800000 }, "grade" : "A", "score" : 12 }, { "date" : { "$date" : 1325116800000 }, "grade" : "A", "score" : 12 }], "name" : "Dj Reynolds Pub And Restaurant", "restaurant_id" : "30191841" } +DROP TABLE t1; +# +# Test catfunc +# +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants CATFUNC=columns +OPTION_LIST='Level=1,Driver=Java,Version=3' DATA_CHARSET=utf8 ; +SELECT * from t1; +Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Nullable Bpath +_id 1 CHAR 24 24 0 0 +address_building 1 CHAR 10 10 0 0 address.building +address_coord 1 CHAR 39 39 0 0 address.coord +address_street 1 CHAR 38 38 0 0 address.street +address_zipcode 1 CHAR 5 5 0 0 address.zipcode +borough 1 CHAR 13 13 0 0 +cuisine 1 CHAR 64 64 0 0 +grades_0 1 CHAR 84 84 0 1 grades.0 +name 1 CHAR 98 98 0 0 +restaurant_id 1 CHAR 8 8 0 0 +DROP TABLE t1; +# +# Explicit columns +# +CREATE TABLE t1 ( +_id VARCHAR(24) NOT NULL, +name VARCHAR(255) NOT NULL, +cuisine VARCHAR(255) NOT NULL, +borough VARCHAR(255) NOT NULL, +restaurant_id VARCHAR(255) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants +CONNECTION='mongodb://localhost:27017' LRECL=1024 DATA_CHARSET=utf8 +OPTION_LIST='Driver=Java,Version=3'; +SELECT * FROM t1 LIMIT 10; +_id name cuisine borough restaurant_id +58ada47de5a51ddfcd5ed51c Morris Park Bake Shop Bakery Bronx 30075445 +58ada47de5a51ddfcd5ed51d Wendy'S Hamburgers Brooklyn 30112340 +58ada47de5a51ddfcd5ed51e Dj Reynolds Pub And Restaurant Irish Manhattan 30191841 +58ada47de5a51ddfcd5ed51f Riviera Caterer American Brooklyn 40356018 +58ada47de5a51ddfcd5ed520 Tov Kosher Kitchen Jewish/Kosher Queens 40356068 +58ada47de5a51ddfcd5ed521 Brunos On The Boulevard American Queens 40356151 +58ada47de5a51ddfcd5ed522 Kosher Island Jewish/Kosher Staten Island 40356442 +58ada47de5a51ddfcd5ed523 Wilken'S Fine Food Delicatessen Brooklyn 40356483 +58ada47de5a51ddfcd5ed524 Regina Caterers American Brooklyn 40356649 +58ada47de5a51ddfcd5ed525 Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn 40356731 +DROP TABLE t1; +# +# Test discovery +# +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants +OPTION_LIST='Level=1,Driver=Java,Version=3' DATA_CHARSET=utf8; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `_id` char(24) NOT NULL, + `address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building', + `address_coord` char(39) NOT NULL `FIELD_FORMAT`='address.coord', + `address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street', + `address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode', + `borough` char(13) NOT NULL, + `cuisine` char(64) NOT NULL, + `grades_0` char(84) DEFAULT NULL `FIELD_FORMAT`='grades.0', + `name` char(98) NOT NULL, + `restaurant_id` char(8) NOT NULL +) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `OPTION_LIST`='Level=1,Driver=Java,Version=3' `DATA_CHARSET`='utf8' +SELECT * FROM t1 LIMIT 5; +_id address_building address_coord address_street address_zipcode borough cuisine grades_0 name restaurant_id +58ada47de5a51ddfcd5ed51c 1007 [-73.856077, 40.848447] Morris Park Ave 10462 Bronx Bakery { "date" : { "$date" : 1393804800000 }, "grade" : "A", "score" : 2 } Morris Park Bake Shop 30075445 +58ada47de5a51ddfcd5ed51d 469 [-73.961704, 40.662942] Flatbush Avenue 11225 Brooklyn Hamburgers { "date" : { "$date" : 1419897600000 }, "grade" : "A", "score" : 8 } Wendy'S 30112340 +58ada47de5a51ddfcd5ed51e 351 [-73.98513559999999, 40.7676919] West 57 Street 10019 Manhattan Irish { "date" : { "$date" : 1409961600000 }, "grade" : "A", "score" : 2 } Dj Reynolds Pub And Restaurant 30191841 +58ada47de5a51ddfcd5ed51f 2780 [-73.98241999999999, 40.579505] Stillwell Avenue 11224 Brooklyn American { "date" : { "$date" : 1402358400000 }, "grade" : "A", "score" : 5 } Riviera Caterer 40356018 +58ada47de5a51ddfcd5ed520 97-22 [-73.8601152, 40.7311739] 63 Road 11374 Queens Jewish/Kosher { "date" : { "$date" : 1416787200000 }, "grade" : "Z", "score" : 20 } Tov Kosher Kitchen 40356068 +DROP TABLE t1; +# +# Dropping a column +# +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants DATA_CHARSET=utf8 +COLIST='{"grades":0}' OPTION_LIST='Driver=Java,Version=3,level=0' ; +SELECT * FROM t1 LIMIT 10; +_id address borough cuisine name restaurant_id +58ada47de5a51ddfcd5ed51c { "building" : "1007", "coord" : [-73.856077, 40.848447], "street" : "Morris Park Ave", "zipcode" : "10462" } Bronx Bakery Morris Park Bake Shop 30075445 +58ada47de5a51ddfcd5ed51d { "building" : "469", "coord" : [-73.961704, 40.662942], "street" : "Flatbush Avenue", "zipcode" : "11225" } Brooklyn Hamburgers Wendy'S 30112340 +58ada47de5a51ddfcd5ed51e { "building" : "351", "coord" : [-73.98513559999999, 40.7676919], "street" : "West 57 Street", "zipcode" : "10019" } Manhattan Irish Dj Reynolds Pub And Restaurant 30191841 +58ada47de5a51ddfcd5ed51f { "building" : "2780", "coord" : [-73.98241999999999, 40.579505], "street" : "Stillwell Avenue", "zipcode" : "11224" } Brooklyn American Riviera Caterer 40356018 +58ada47de5a51ddfcd5ed520 { "building" : "97-22", "coord" : [-73.8601152, 40.7311739], "street" : "63 Road", "zipcode" : "11374" } Queens Jewish/Kosher Tov Kosher Kitchen 40356068 +58ada47de5a51ddfcd5ed521 { "building" : "8825", "coord" : [-73.8803827, 40.7643124], "street" : "Astoria Boulevard", "zipcode" : "11369" } Queens American Brunos On The Boulevard 40356151 +58ada47de5a51ddfcd5ed522 { "building" : "2206", "coord" : [-74.1377286, 40.6119572], "street" : "Victory Boulevard", "zipcode" : "10314" } Staten Island Jewish/Kosher Kosher Island 40356442 +58ada47de5a51ddfcd5ed523 { "building" : "7114", "coord" : [-73.9068506, 40.6199034], "street" : "Avenue U", "zipcode" : "11234" } Brooklyn Delicatessen Wilken'S Fine Food 40356483 +58ada47de5a51ddfcd5ed524 { "building" : "6409", "coord" : [-74.00528899999999, 40.628886], "street" : "11 Avenue", "zipcode" : "11219" } Brooklyn American Regina Caterers 40356649 +58ada47de5a51ddfcd5ed525 { "building" : "1839", "coord" : [-73.9482609, 40.6408271], "street" : "Nostrand Avenue", "zipcode" : "11226" } Brooklyn Ice Cream, Gelato, Yogurt, Ices Taste The Tropics Ice Cream 40356731 +DROP TABLE t1; +# +# Specifying Jpath +# +CREATE TABLE t1 ( +_id VARCHAR(24) NOT NULL, +name VARCHAR(64) NOT NULL, +cuisine CHAR(200) NOT NULL, +borough CHAR(16) NOT NULL, +street VARCHAR(65) FIELD_FORMAT='address.street', +building CHAR(16) FIELD_FORMAT='address.building', +zipcode CHAR(5) FIELD_FORMAT='address.zipcode', +grade CHAR(1) FIELD_FORMAT='grades.0.grade', +score INT(4) NOT NULL FIELD_FORMAT='grades.0.score', +`date` DATE FIELD_FORMAT='grades.0.date', +restaurant_id VARCHAR(255) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='restaurants' DATA_CHARSET=utf8 +OPTION_LIST='Driver=Java,Version=3' ; +SELECT * FROM t1 LIMIT 1; +_id 58ada47de5a51ddfcd5ed51c +name Morris Park Bake Shop +cuisine Bakery +borough Bronx +street Morris Park Ave +building 1007 +zipcode 10462 +grade A +score 2 +date 2014-03-03 +restaurant_id 30075445 +SELECT name, street, score, date FROM t1 LIMIT 5; +name street score date +Morris Park Bake Shop Morris Park Ave 2 2014-03-03 +Wendy'S Flatbush Avenue 8 2014-12-30 +Dj Reynolds Pub And Restaurant West 57 Street 2 2014-09-06 +Riviera Caterer Stillwell Avenue 5 2014-06-10 +Tov Kosher Kitchen 63 Road 20 2014-11-24 +SELECT name, cuisine, borough FROM t1 WHERE grade = 'A' LIMIT 10; +name cuisine borough +Morris Park Bake Shop Bakery Bronx +Wendy'S Hamburgers Brooklyn +Dj Reynolds Pub And Restaurant Irish Manhattan +Riviera Caterer American Brooklyn +Kosher Island Jewish/Kosher Staten Island +Wilken'S Fine Food Delicatessen Brooklyn +Regina Caterers American Brooklyn +Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn +Wild Asia American Bronx +C & C Catering Service American Brooklyn +SELECT COUNT(*) FROM t1 WHERE grade = 'A'; +COUNT(*) +20687 +SELECT * FROM t1 WHERE cuisine = 'English'; +_id name cuisine borough street building zipcode grade score date restaurant_id +58ada47de5a51ddfcd5ed83d Tea And Sympathy English Manhattan Greenwich Avenue 108 10011 A 8 2014-10-23 40391531 +58ada47de5a51ddfcd5ed85c Tartine English Manhattan West 11 Street 253 10014 A 11 2014-08-14 40392496 +58ada47de5a51ddfcd5ee1f3 The Park Slope Chipshop English Brooklyn 5 Avenue 383 11215 B 17 2014-09-29 40816202 +58ada47de5a51ddfcd5ee7e4 Pound And Pence English Manhattan Liberty Street 55 10005 A 7 2014-02-11 41022701 +58ada47de5a51ddfcd5ee999 Chip Shop English Brooklyn Atlantic Avenue 129 11201 A 9 2014-10-08 41076583 +58ada47ee5a51ddfcd5efe3f The Breslin Bar & Dining Room English Manhattan West 29 Street 16 10001 A 13 2014-06-09 41443706 +58ada47ee5a51ddfcd5efe99 Highlands Restaurant English Manhattan West 10 Street 150 10014 A 12 2014-10-22 41448559 +58ada47ee5a51ddfcd5f0413 The Fat Radish English Manhattan Orchard Street 17 10002 A 12 2014-07-26 41513545 +58ada47ee5a51ddfcd5f0777 Jones Wood Foundry English Manhattan East 76 Street 401 10021 A 12 2014-12-03 41557377 +58ada47ee5a51ddfcd5f0ea2 Whitehall English Manhattan Greenwich Avenue 19 10014 Z 15 2015-01-16 41625263 +58ada47ee5a51ddfcd5f1004 The Churchill Tavern English Manhattan East 28 Street 45 10016 A 13 2014-08-27 41633327 +58ada47ee5a51ddfcd5f13d5 The Monro English Brooklyn 5 Avenue 481 11215 A 7 2014-06-03 41660253 +58ada47ee5a51ddfcd5f1454 The Cock & Bull English Manhattan West 45 Street 23 10036 A 7 2014-08-07 41664704 +58ada47ee5a51ddfcd5f176e Dear Bushwick English Brooklyn Wilson Avenue 41 11237 A 12 2014-12-27 41690534 +58ada47ee5a51ddfcd5f1e91 Snowdonia Pub English Queens 32 Street 34-55 11106 A 12 2014-10-28 50000290 +58ada47ee5a51ddfcd5f2ddc Oscar'S Place English Manhattan Hudson Street 466 10014 A 10 2014-08-18 50011097 +SELECT * FROM t1 WHERE score = building; +_id name cuisine borough street building zipcode grade score date restaurant_id +DROP TABLE t1; +# +# Specifying Filter +# +CREATE TABLE t1 ( +_id CHAR(24) NOT NULL, +name CHAR(64) NOT NULL, +borough CHAR(16) NOT NULL, +restaurant_id CHAR(8) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants DATA_CHARSET=utf8 +FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' +OPTION_LIST='Driver=Java,Version=3' ; +SELECT name FROM t1 WHERE borough = 'Queens'; +name +La Baraka Restaurant +Air France Lounge +Tournesol +Winegasm +Cafe Henri +Bistro 33 +Domaine Wine Bar +Cafe Triskell +Cannelle Patisserie +La Vie +Dirty Pierres Bistro +Fresca La Crepe +Bliss 46 Bistro +Bear +Cuisine By Claudette +Paris Baguette +The Baroness Bar +Francis Cafe +Madame Sou Sou +Crepe 'N' Tearia +Aperitif Bayside Llc +DROP TABLE t1; +# +# Testing pipeline +# +CREATE TABLE t1 ( +name VARCHAR(64) NOT NULL, +borough CHAR(16) NOT NULL, +date DATETIME NOT NULL, +grade CHAR(1) NOT NULL, +score INT(4) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='restaurants' DATA_CHARSET=utf8 +COLIST='{"pipeline":[{"$match":{"cuisine":"French"}},{"$unwind":"$grades"},{"$project":{"_id":0,"name":1,"borough":1,"date":"$grades.date","grade":"$grades.grade","score":"$grades.score"}}]}' +OPTION_LIST='Driver=Java,Version=3,Pipeline=1' ; +SELECT * FROM t1 LIMIT 10; +name borough date grade score +Tout Va Bien Manhattan 2014-11-10 01:00:00 B 15 +Tout Va Bien Manhattan 2014-04-03 02:00:00 A 13 +Tout Va Bien Manhattan 2013-07-17 02:00:00 C 36 +Tout Va Bien Manhattan 2013-02-06 01:00:00 B 22 +Tout Va Bien Manhattan 2012-07-16 02:00:00 C 36 +Tout Va Bien Manhattan 2012-03-08 01:00:00 C 7 +La Grenouille Manhattan 2014-04-09 02:00:00 A 10 +La Grenouille Manhattan 2013-03-05 01:00:00 A 9 +La Grenouille Manhattan 2012-02-02 01:00:00 A 13 +Le Perigord Manhattan 2014-07-14 02:00:00 B 14 +SELECT name, grade, score, date FROM t1 WHERE borough = 'Bronx'; +name grade score date +Bistro Sk A 10 2014-11-21 01:00:00 +Bistro Sk A 12 2014-02-19 01:00:00 +Bistro Sk B 18 2013-06-12 02:00:00 +DROP TABLE t1; +# +# try level 2 discovery +# +CREATE TABLE t1 +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants +FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' +COLIST='{"cuisine":0}' +OPTION_LIST='Driver=Java,level=2,version=3'; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `_id` char(24) NOT NULL, + `address_building` char(6) NOT NULL `FIELD_FORMAT`='address.building', + `address_coord_0` double(18,14) NOT NULL `FIELD_FORMAT`='address.coord.0', + `address_street` char(25) NOT NULL `FIELD_FORMAT`='address.street', + `address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode', + `borough` char(13) NOT NULL, + `grades_0_date` datetime NOT NULL `FIELD_FORMAT`='grades.0.date', + `grades_0_grade` char(14) NOT NULL `FIELD_FORMAT`='grades.0.grade', + `grades_0_score` int(2) NOT NULL `FIELD_FORMAT`='grades.0.score', + `name` char(32) NOT NULL, + `restaurant_id` char(8) NOT NULL +) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `COLIST`='{"cuisine":0}' `FILTER`='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' `OPTION_LIST`='Driver=Java,level=2,version=3' +SELECT name, borough, address_street, grades_0_score AS score FROM t1 WHERE grades_0_grade = 'B'; +name borough address_street score +Le Gamin Brooklyn Vanderbilt Avenue 24 +Bistro 33 Queens Ditmars Boulevard 15 +Dirty Pierres Bistro Queens Station Square 22 +Santos Anne Brooklyn Union Avenue 26 +Le Paddock Brooklyn Prospect Avenue 17 +La Crepe Et La Vie Brooklyn Foster Avenue 24 +Francis Cafe Queens Ditmars Boulevard 19 +DROP TABLE t1; +# +# try CRUD operations +# +false +CREATE TABLE t1 (_id INT(4) NOT NULL, msg CHAR(64)) +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='testcoll' +OPTION_LIST='Driver=Java,Version=3' ; +DELETE FROM t1; +INSERT INTO t1 VALUES(0,NULL),(1,'One'),(2,'Two'),(3,'Three'); +SELECT * FROM t1; +_id msg +0 NULL +1 One +2 Two +3 Three +UPDATE t1 SET msg = 'Deux' WHERE _id = 2; +DELETE FROM t1 WHERE msg IS NULL; +SELECT * FROM t1; +_id msg +1 One +2 Deux +3 Three +DELETE FROM t1; +DROP TABLE t1; +true +# +# List states whose population is equal or more than 10 millions +# +false +CREATE TABLE t1 ( +_id char(5) NOT NULL, +city char(16) NOT NULL, +loc_0 double(12,6) NOT NULL `FIELD_FORMAT`='loc.0', +loc_1 char(12) NOT NULL `FIELD_FORMAT`='loc.1', +pop int(11) NOT NULL, +state char(2) NOT NULL) +ENGINE=CONNECT CONNECTION='mongodb://localhost:27017' TABLE_TYPE='MONGO' TABNAME='cities' +OPTION_LIST='Driver=Java,Version=3' DATA_CHARSET='utf8'; +# Using SQL for grouping +SELECT state, sum(pop) AS totalPop FROM t1 GROUP BY state HAVING totalPop >= 10000000 ORDER BY totalPop DESC; +state totalPop +CA 29754890 +NY 17990402 +TX 16984601 +FL 12686644 +PA 11881643 +IL 11427576 +OH 10846517 +DROP TABLE t1; +# Using a pipeline for grouping +CREATE TABLE t1 (_id CHAR(2) NOT NULL, totalPop INT(11) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='cities' DATA_CHARSET=utf8 +COLIST='{"pipeline":[{"$group":{"_id":"$state","totalPop":{"$sum":"$pop"}}},{"$match":{"totalPop":{"$gte":10000000}}},{"$sort":{"totalPop":-1}}]}' +OPTION_LIST='Driver=Java,Version=3,Pipeline=1' ; +SELECT * FROM t1; +_id totalPop +CA 29754890 +NY 17990402 +TX 16984601 +FL 12686644 +PA 11881643 +IL 11427576 +OH 10846517 +DROP TABLE t1; +true +# +# Test making array +# +CREATE TABLE t1 ( +_id int(4) NOT NULL, +item CHAR(8) NOT NULL, +prices_0 INT(6) FIELD_FORMAT='prices.0', +prices_1 INT(6) FIELD_FORMAT='prices.1', +prices_2 INT(6) FIELD_FORMAT='prices.2', +prices_3 INT(6) FIELD_FORMAT='prices.3', +prices_4 INT(6) FIELD_FORMAT='prices.4') +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='testcoll' DATA_CHARSET=utf8 +OPTION_LIST='Driver=Java,Version=3' ; +INSERT INTO t1 VALUES +(1,'journal',87,45,63,12,78), +(2,'notebook',123,456,789,NULL,NULL), +(3,'paper',5,7,3,8,NULL), +(4,'planner',25,71,NULL,44,27), +(5,'postcard',5,7,3,8,NULL); +SELECT * FROM t1; +_id item prices_0 prices_1 prices_2 prices_3 prices_4 +1 journal 87 45 63 12 78 +2 notebook 123 456 789 NULL NULL +3 paper 5 7 3 8 NULL +4 planner 25 71 NULL 44 27 +5 postcard 5 7 3 8 NULL +DROP TABLE t1; +# +# Test array aggregation +# +CREATE TABLE t1 +ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='testcoll' +COLIST='{"pipeline":[{"$project":{"_id":0,"item":1,"total":{"$sum":"$prices"},"average":{"$avg":"$prices"}}}]}' +OPTION_LIST='Driver=Java,Version=3,Pipeline=YES' ; +SELECT * FROM t1; +item total average +journal 285 57.00 +notebook 1368 456.00 +paper 23 5.75 +planner 167 41.75 +postcard 23 5.75 +DROP TABLE t1; +true diff --git a/storage/connect/mysql-test/connect/r/mul_new.result b/storage/connect/mysql-test/connect/r/mul_new.result new file mode 100644 index 00000000000..ba8112f5d1f --- /dev/null +++ b/storage/connect/mysql-test/connect/r/mul_new.result @@ -0,0 +1,136 @@ +# +# Testing multiple 1 +# +CREATE TABLE t1 ( +Chiffre int(3) NOT NULL, +Lettre char(16) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=CSV FILE_NAME='num1.csv' LRECL=20 HEADER=1; +INSERT INTO t1 VALUES(1,'One'),(2,'Two'),(3,'Three'),(4,'Four'),(5,'Five'),(6,'Six'); +SELECT * FROM t1; +Chiffre Lettre +1 One +2 Two +3 Three +4 Four +5 Five +6 Six +CREATE TABLE t2 ( +Chiffre int(3) NOT NULL, +Lettre char(16) NOT NULL) +ENGINE=CONNECT TABLE_TYPE='CSV' FILE_NAME='subdir/num2.csv' LRECL=20 HEADER=1; +INSERT INTO t2 VALUES(7,'Seven'),(8,'Eight'),(9,'Nine'),(10,'Ten'),(11,'Eleven'),(12,'Twelve'); +SELECT * FROM t2; +Chiffre Lettre +7 Seven +8 Eight +9 Nine +10 Ten +11 Eleven +12 Twelve +CREATE TABLE t3 ( +Chiffre int(3) NOT NULL, +Lettre char(16) NOT NULL) +ENGINE=CONNECT TABLE_TYPE='CSV' FILE_NAME='num3.csv' LRECL=20 HEADER=1; +INSERT INTO t3 VALUES(13,'Thirteen'),(14,'Fourteen'),(15,'Fifteen'),(16,'Sixteen'),(17,'Seventeen'),(18,'Eighteen'); +SELECT * FROM t3; +Chiffre Lettre +13 Thirteen +14 Fourteen +15 Fifteen +16 Sixteen +17 Seventeen +18 Eighteen +CREATE TABLE t4 ( +Chiffre int(3) NOT NULL, +Lettre char(16) NOT NULL) +ENGINE=CONNECT TABLE_TYPE='CSV' FILE_NAME='subdir/num4.csv' LRECL=20 HEADER=1; +INSERT INTO t4 VALUES(19,'Nineteen'),(20,'Twenty'),(21,'Twenty one'),(22,'Twenty two'),(23,'Tenty three'),(24,'Twenty four'); +SELECT * FROM t4; +Chiffre Lettre +19 Nineteen +20 Twenty +21 Twenty one +22 Twenty two +23 Tenty three +24 Twenty four +CREATE TABLE t5 ( +Chiffre int(3) NOT NULL, +Lettre char(16) NOT NULL) +ENGINE=CONNECT TABLE_TYPE='CSV' FILE_NAME='num5.csv' LRECL=20 HEADER=1; +INSERT INTO t5 VALUES(25,'Twenty five'),(26,'Twenty six'),(27,'Twenty seven'),(28,'Twenty eight'),(29,'Tenty eight'),(30,'Thirty'); +SELECT * FROM t5; +Chiffre Lettre +25 Twenty five +26 Twenty six +27 Twenty seven +28 Twenty eight +29 Tenty eight +30 Thirty +CREATE TABLE t_all ( +Chiffre int(3) not null, +Lettre char(16) not null) +ENGINE=CONNECT TABLE_TYPE=CSV FILE_NAME='num?.csv' HEADER=1 LRECL=20 MULTIPLE=1; +SELECT * FROM t_all ORDER BY Chiffre; +Chiffre Lettre +1 One +2 Two +3 Three +4 Four +5 Five +6 Six +13 Thirteen +14 Fourteen +15 Fifteen +16 Sixteen +17 Seventeen +18 Eighteen +25 Twenty five +26 Twenty six +27 Twenty seven +28 Twenty eight +29 Tenty eight +30 Thirty +# +# Testing multiple 3 +# +ALTER TABLE t_all MULTIPLE=3; +Warnings: +Warning 1105 This is an outward table, table data were not modified. +SELECT * FROM t_all ORDER BY Chiffre; +Chiffre Lettre +1 One +2 Two +3 Three +4 Four +5 Five +6 Six +7 Seven +8 Eight +9 Nine +10 Ten +11 Eleven +12 Twelve +13 Thirteen +14 Fourteen +15 Fifteen +16 Sixteen +17 Seventeen +18 Eighteen +19 Nineteen +20 Twenty +21 Twenty one +22 Twenty two +23 Tenty three +24 Twenty four +25 Twenty five +26 Twenty six +27 Twenty seven +28 Twenty eight +29 Tenty eight +30 Thirty +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; +DROP TABLE t4; +DROP TABLE t5; +DROP TABLE t_all; diff --git a/storage/connect/mysql-test/connect/r/mysql.result b/storage/connect/mysql-test/connect/r/mysql.result index 29f077c3d9f..3ac23394cbc 100644 --- a/storage/connect/mysql-test/connect/r/mysql.result +++ b/storage/connect/mysql-test/connect/r/mysql.result @@ -17,7 +17,7 @@ ERROR HY000: (1049) Unknown database 'unknown' CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL OPTION_LIST='host=localhost,user=root,port=PORT' DBNAME='unknown' TABNAME='t1'; ERROR HY000: (1049) Unknown database 'unknown' CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='unknown' OPTION_LIST='host=localhost,user=root,port=PORT'; -ERROR HY000: (1146) Table 'test.unknown' doesn't exist [SHOW FULL COLUMNS FROM unknown FROM test] +ERROR HY000: (1146) Table 'test.unknown' doesn't exist [SHOW FULL COLUMNS FROM `unknown` FROM test] SHOW CREATE TABLE t2; ERROR 42S02: Table 'test.t2' doesn't exist CREATE TABLE t2 (x int, y char(10)) ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=PORT'; diff --git a/storage/connect/mysql-test/connect/r/mysql_exec.result b/storage/connect/mysql-test/connect/r/mysql_exec.result index 1801456fd74..c0400bc82e7 100644 --- a/storage/connect/mysql-test/connect/r/mysql_exec.result +++ b/storage/connect/mysql-test/connect/r/mysql_exec.result @@ -20,7 +20,7 @@ SELECT * FROM t1 WHERE command IN ('Warning','Note', "insert into t1(msg) values('One'),(NULL),('Three')", "insert into t1 values(2,'Deux') on duplicate key update msg = 'Two'", "insert into t1(message) values('Four'),('Five'),('Six')", -'insert into t1(id) values(NULL)', +'insert ignore into t1(id) values(NULL)', "update t1 set msg = 'Four' where id = 4", 'select * from t1'); command warnings number message @@ -31,8 +31,9 @@ insert into t1(msg) values('One'),(NULL),('Three') 1 3 Affected rows Warning 0 1048 Column 'msg' cannot be null insert into t1 values(2,'Deux') on duplicate key update msg = 'Two' 0 2 Affected rows insert into t1(message) values('Four'),('Five'),('Six') 0 1054 Remote: Unknown column 'message' in 'field list' -insert into t1(id) values(NULL) 0 1364 Remote: Field 'msg' doesn't have a default value -update t1 set msg = 'Four' where id = 4 0 0 Affected rows +insert ignore into t1(id) values(NULL) 1 1 Affected rows +Warning 0 1364 Field 'msg' doesn't have a default value +update t1 set msg = 'Four' where id = 4 0 1 Affected rows select * from t1 0 2 Result set columns # # Checking Using Procedure @@ -43,12 +44,13 @@ Note 1305 PROCEDURE test.p1 does not exist CREATE PROCEDURE p1(cmd varchar(512)) READS SQL DATA SELECT * FROM t1 WHERE command IN ('Warning','Note',cmd); -CALL p1('insert into t1(id) values(NULL)'); +CALL p1('insert ignore into t1(id) values(NULL)'); command warnings number message -insert into t1(id) values(NULL) 0 1364 Remote: Field 'msg' doesn't have a default value +insert ignore into t1(id) values(NULL) 1 1 Affected rows +Warning 0 1364 Field 'msg' doesn't have a default value CALL p1('update t1 set msg = "Five" where id = 5'); command warnings number message -update t1 set msg = "Five" where id = 5 0 0 Affected rows +update t1 set msg = "Five" where id = 5 0 1 Affected rows DROP PROCEDURE p1; DROP TABLE t1; connection slave; @@ -57,6 +59,8 @@ id msg 1 One 2 Two 3 Three +4 Four +5 Five DROP TABLE t1; connection master; DROP TABLE IF EXISTS connect.t1; diff --git a/storage/connect/mysql-test/connect/r/mysql_new.result b/storage/connect/mysql-test/connect/r/mysql_new.result index 69402ff7532..0394caac8af 100644 --- a/storage/connect/mysql-test/connect/r/mysql_new.result +++ b/storage/connect/mysql-test/connect/r/mysql_new.result @@ -29,7 +29,7 @@ OPTION_LIST='host=127.0.0.1,user=root,port=SLAVE_PORT' DBNAME='unknown' TABNAME= ERROR HY000: (1049) Unknown database 'unknown' CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/test/unknown'; -ERROR HY000: (1146) Table 'test.unknown' doesn't exist [SHOW FULL COLUMNS FROM unknown FROM test] +ERROR HY000: (1146) Table 'test.unknown' doesn't exist [SHOW FULL COLUMNS FROM `unknown` FROM test] SHOW CREATE TABLE t1; ERROR 42S02: Table 'test.t1' doesn't exist CREATE TABLE t1 (x int, y char(10)) ENGINE=CONNECT TABLE_TYPE=MYSQL diff --git a/storage/connect/mysql-test/connect/r/odbc_oracle.result b/storage/connect/mysql-test/connect/r/odbc_oracle.result index 8dc7dc07bb1..db7f78f67cd 100644 --- a/storage/connect/mysql-test/connect/r/odbc_oracle.result +++ b/storage/connect/mysql-test/connect/r/odbc_oracle.result @@ -72,11 +72,11 @@ TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtr' CATFUNC=Columns; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks - MTR T1 A 3 DECIMAL 38 40 0 10 1 - MTR T1 B 6 NUMBER 38 40 NULL NULL 1 - MTR T2 A 12 VARCHAR2 64 64 NULL NULL 1 - MTR V1 A 3 DECIMAL 38 40 0 10 1 - MTR V1 B 6 NUMBER 38 40 NULL NULL 1 +NULL MTR T1 A 3 DECIMAL 38 40 0 10 1 NULL +NULL MTR T1 B 6 NUMBER 38 40 NULL NULL 1 NULL +NULL MTR T2 A 12 VARCHAR2 64 64 NULL NULL 1 NULL +NULL MTR V1 A 3 DECIMAL 38 40 0 10 1 NULL +NULL MTR V1 B 6 NUMBER 38 40 NULL NULL 1 NULL DROP TABLE t1; # All columns in all schemas (limited with WHERE) CREATE TABLE t1 ENGINE=CONNECT @@ -84,18 +84,18 @@ TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtr' CATFUNC=Columns TABNAME='%.%'; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks - MTR T1 A 3 DECIMAL 38 40 0 10 1 - MTR T1 B 6 NUMBER 38 40 NULL NULL 1 - MTR T2 A 12 VARCHAR2 64 64 NULL NULL 1 - MTR V1 A 3 DECIMAL 38 40 0 10 1 - MTR V1 B 6 NUMBER 38 40 NULL NULL 1 +NULL MTR T1 A 3 DECIMAL 38 40 0 10 1 NULL +NULL MTR T1 B 6 NUMBER 38 40 NULL NULL 1 NULL +NULL MTR T2 A 12 VARCHAR2 64 64 NULL NULL 1 NULL +NULL MTR V1 A 3 DECIMAL 38 40 0 10 1 NULL +NULL MTR V1 B 6 NUMBER 38 40 NULL NULL 1 NULL DROP TABLE t1; # All tables "T1" in all schemas (limited with WHERE) CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtr' CATFUNC=Columns TABNAME='%.T1'; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks - MTR T1 A 3 DECIMAL 38 40 0 10 1 - MTR T1 B 6 NUMBER 38 40 NULL NULL 1 +NULL MTR T1 A 3 DECIMAL 38 40 0 10 1 NULL +NULL MTR T1 B 6 NUMBER 38 40 NULL NULL 1 NULL DROP TABLE t1; # Table "T1" in the schema "MTR" CREATE TABLE t1 ENGINE=CONNECT @@ -103,8 +103,8 @@ TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtr' CATFUNC=Columns TABNAME='MTR.T1'; SELECT * FROM t1 ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks - MTR T1 A 3 DECIMAL 38 40 0 10 1 - MTR T1 B 6 NUMBER 38 40 NULL NULL 1 +NULL MTR T1 A 3 DECIMAL 38 40 0 10 1 NULL +NULL MTR T1 B 6 NUMBER 38 40 NULL NULL 1 NULL DROP TABLE t1; # All tables "T1" in all schemas (filtered with WHERE) CREATE TABLE t1 ENGINE=CONNECT @@ -112,8 +112,8 @@ TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtr' CATFUNC=Columns TABNAME='%.T1'; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks - MTR T1 A 3 DECIMAL 38 40 0 10 1 - MTR T1 B 6 NUMBER 38 40 NULL NULL 1 +NULL MTR T1 A 3 DECIMAL 38 40 0 10 1 NULL +NULL MTR T1 B 6 NUMBER 38 40 NULL NULL 1 NULL DROP TABLE t1; # # Checking tables diff --git a/storage/connect/mysql-test/connect/r/tbl.result b/storage/connect/mysql-test/connect/r/tbl.result index f51b4dfa57f..d3d1c550530 100644 --- a/storage/connect/mysql-test/connect/r/tbl.result +++ b/storage/connect/mysql-test/connect/r/tbl.result @@ -141,22 +141,3 @@ DROP TABLE t1; DROP TABLE t2; DROP TABLE t3; DROP TABLE t4; -# -# Checking thread TBL tables -# -CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL SRCDEF='select 11 as v'; -SELECT * FROM t1; -v -11 -CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL SRCDEF='select 22 as v'; -SELECT * FROM t2; -v -22 -CREATE TABLE total (v BIGINT(20) UNSIGNED NOT NULL) ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t1,t2' OPTION_LIST='thread=yes,port=PORT';; -SELECT * FROM total order by v desc; -v -22 -11 -DROP TABLE total; -DROP TABLE t1; -DROP TABLE t2; diff --git a/storage/connect/mysql-test/connect/r/tbl_thread.result b/storage/connect/mysql-test/connect/r/tbl_thread.result new file mode 100644 index 00000000000..ef6439462bb --- /dev/null +++ b/storage/connect/mysql-test/connect/r/tbl_thread.result @@ -0,0 +1,119 @@ +connect master,127.0.0.1,root,,test,$MASTER_MYPORT,; +connect slave,127.0.0.1,root,,test,$SLAVE_MYPORT,; +connection master; +CREATE DATABASE connect; +connection slave; +CREATE DATABASE connect; +connection default; +# +# Checking thread TBL tables +# +CREATE TABLE t1 (a int, b char(10)); +INSERT INTO t1 VALUES (0,'test00'),(1,'test01'),(2,'test02'),(3,'test03'); +SELECT * FROM t1; +a b +0 test00 +1 test01 +2 test02 +3 test03 +connection master; +CREATE TABLE rt2 (a int, b char(10)); +INSERT INTO rt2 VALUES (4,'test04'),(5,'test05'),(6,'test06'),(7,'test07'); +SELECT * FROM rt2; +a b +4 test04 +5 test05 +6 test06 +7 test07 +connection slave; +USE test; +CREATE TABLE rt3 (a int, b char(10)); +INSERT INTO rt3 VALUES (8,'test08'),(9,'test09'),(10,'test10'),(11,'test11'); +SELECT * FROM rt3; +a b +8 test08 +9 test09 +10 test10 +11 test11 +connection default; +CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL +CONNECTION='mysql://root@127.0.0.1:MASTER_PORT/test/rt2'; +SELECT * FROM t2; +a b +4 test04 +5 test05 +6 test06 +7 test07 +CREATE TABLE t3 ENGINE=CONNECT TABLE_TYPE=MYSQL +CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/test/rt3'; +SELECT * FROM t3; +a b +8 test08 +9 test09 +10 test10 +11 test11 +CREATE TABLE total (a int, b char(10)) +ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t1,t2,t3' +OPTION_LIST='thread=yes,port=PORT'; +SELECT * FROM total order by a desc; +a b +11 test11 +10 test10 +9 test09 +8 test08 +7 test07 +6 test06 +5 test05 +4 test04 +3 test03 +2 test02 +1 test01 +0 test00 +connection master; +DROP TABLE rt2; +connection slave; +DROP TABLE rt3; +connection default; +DROP TABLE t1,t2,t3,total; +# +# Old thread TBL tables test modified +# +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL SRCDEF='select 11 as v' OPTION_LIST='port=MASTER_PORT'; +SELECT * FROM t1; +v +11 +CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL SRCDEF='select 22 as v' OPTION_LIST='port=SLAVE_PORT'; +SELECT * FROM t2; +v +22 +CREATE TABLE total (v BIGINT(20) UNSIGNED NOT NULL) ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t1,t2' OPTION_LIST='thread=yes,port=PORT';; +SELECT * FROM total order by v desc; +v +22 +11 +DROP TABLE t1,t2,total; +# +# Old thread TBL tables test not modified +# +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL SRCDEF='select 11 as v'; +SELECT * FROM t1; +v +11 +CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL SRCDEF='select 22 as v'; +SELECT * FROM t2; +v +22 +CREATE TABLE total (v BIGINT(20) UNSIGNED NOT NULL) ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t1,t2' OPTION_LIST='thread=yes,port=PORT';; +SELECT * FROM total order by v desc; +v +22 +11 +DROP TABLE total; +DROP TABLE t1; +DROP TABLE t2; +connection master; +DROP TABLE IF EXISTS connect.t1; +DROP DATABASE IF EXISTS connect; +connection slave; +DROP TABLE IF EXISTS connect.t1; +DROP DATABASE IF EXISTS connect; diff --git a/storage/connect/mysql-test/connect/r/xml.result b/storage/connect/mysql-test/connect/r/xml.result index eea53bf55c7..99739b1ec10 100644 --- a/storage/connect/mysql-test/connect/r/xml.result +++ b/storage/connect/mysql-test/connect/r/xml.result @@ -1,5 +1,3 @@ -Warnings: -Warning 1105 No file name. Table will use t1.xml SET NAMES utf8; # # Testing tag values @@ -12,7 +10,7 @@ TRANSLATOR CHAR(40), PUBLISHER CHAR(40), DATEPUB INT(4) ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' - OPTION_LIST='xmlsup=libxml2'; + OPTION_LIST='xmlsup=domdoc'; SELECT * FROM t1; AUTHOR Jean-Christophe Bernadac TITLE Construire une application XML @@ -36,7 +34,7 @@ TRANSLATOR CHAR(40), PUBLISHER CHAR(40), DATEPUB INT(4) ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' - OPTION_LIST='xmlsup=libxml2'; + OPTION_LIST='xmlsup=domdoc'; SELECT * FROM t1; author NULL TITLE Construire une application XML @@ -57,7 +55,7 @@ ISBN CHAR(15), LANG CHAR(2), SUBJECT CHAR(32) ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' - OPTION_LIST='Coltype=@,xmlsup=libxml2'; + OPTION_LIST='Coltype=@,xmlsup=domdoc'; SELECT * FROM t1; ISBN 9782212090819 LANG fr @@ -74,7 +72,7 @@ isbn CHAR(15), LANG CHAR(2), SUBJECT CHAR(32) ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' - OPTION_LIST='Coltype=@,xmlsup=libxml2'; + OPTION_LIST='Coltype=@,xmlsup=domdoc'; SELECT * FROM t1; isbn NULL LANG fr @@ -97,7 +95,7 @@ PUBLISHER CHAR(40), DATEPUB INT(4) ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK' - OPTION_LIST='xmlsup=libxml2'; + OPTION_LIST='xmlsup=domdoc'; SELECT * FROM t1; ISBN 9782212090819 LANG fr @@ -130,7 +128,7 @@ PUBLISHER CHAR(40), DATEPUB INT(4) ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample2.xml' TABNAME='BIBLIO' - OPTION_LIST='rownode=BOOK,xmlsup=libxml2'; + OPTION_LIST='rownode=BOOK,xmlsup=domdoc'; INSERT INTO t1 (ISBN, LANG, SUBJECT, AUTHOR, TITLE, PUBLISHEr, DATEPUB) VALUES('9782212090529','fr','général','Alain Michard', 'XML, Langage et Applications','Eyrolles Paris',1998); @@ -160,47 +158,47 @@ TRANSLATOR NULL PUBLISHER Eyrolles Paris DATEPUB 1998 SELECT LOAD_FILE('MYSQLD_DATADIR/test/xsample2.xml') AS xml; -xml - - - - Jean-Christophe - Bernadac - - - François - Knab - - Construire une application XML - - Eyrolles - Paris - - 1999 - - - - William J. - Pardi - - - James - Guerin - - XML en Action - - Microsoft Press - Paris - - 1999 - - - Alain Michard - XML, Langage et Applications - Eyrolles Paris - 1998 - - +xml + + + + Jean-Christophe + Bernadac + + + François + Knab + + Construire une application XML + + Eyrolles + Paris + + 1999 + + + + William J. + Pardi + + + James + Guerin + + XML en Action + + Microsoft Press + Paris + + 1999 + + + Alain Michard + XML, Langage et Applications + Eyrolles Paris + 1998 + + DROP TABLE t1; # @@ -220,7 +218,7 @@ publisher CHAR(20) FIELD_FORMAT='PUBLISHER/NAME', location CHAR(20) FIELD_FORMAT='PUBLISHER/PLACE', year INT(4) FIELD_FORMAT='DATEPUB' ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' - TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK,skipnull=1,xmlsup=libxml2'; + TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK,skipnull=1,xmlsup=domdoc'; SELECT * FROM t1; isbn 9782212090819 language fr @@ -262,7 +260,7 @@ CREATE TABLE t1 ( isbn CHAR(15) FIELD_FORMAT='@isbn' ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' - TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK,skipnull=1,xmlsup=libxml2'; + TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK,skipnull=1,xmlsup=domdoc'; SELECT * FROM t1; isbn NULL isbn NULL @@ -274,20 +272,20 @@ CREATE TABLE t1 ( c CHAR(16) ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml' - OPTION_LIST='xmlsup=libxml2' + OPTION_LIST='xmlsup=domdoc' DATA_CHARSET=latin1; ERROR HY000: DATA_CHARSET='latin1' is not supported for TABLE_TYPE=XML CREATE TABLE t1 ( c CHAR(16) ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml' - OPTION_LIST='xmlsup=libxml2' + OPTION_LIST='xmlsup=domdoc' DATA_CHARSET=utf8; SHOW CREATE TABLE t1; Table t1 Create Table CREATE TABLE `t1` ( `c` char(16) DEFAULT NULL -) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`=XML `FILE_NAME`='latin1.xml' `OPTION_LIST`='xmlsup=libxml2' `DATA_CHARSET`=utf8 +) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`=XML `FILE_NAME`='latin1.xml' `OPTION_LIST`='xmlsup=domdoc' `DATA_CHARSET`=utf8 SELECT c, HEX(c) FROM t1; c ÃÂÃÄÅÆÇ HEX(c) C1C2C3C4C5C6C7 @@ -296,7 +294,7 @@ CREATE TABLE t1 ( c CHAR(16) ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml' - OPTION_LIST='xmlsup=libxml2'; + OPTION_LIST='xmlsup=domdoc'; SELECT c, HEX(c) FROM t1; c ÃÂÃÄÅÆÇ HEX(c) C1C2C3C4C5C6C7 @@ -305,7 +303,7 @@ CREATE TABLE t1 ( c CHAR(16) CHARACTER SET utf8 ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml' - OPTION_LIST='xmlsup=libxml2'; + OPTION_LIST='xmlsup=domdoc'; SELECT c, HEX(c) FROM t1; c ÃÂÃÄÅÆÇ HEX(c) C381C382C383C384C385C386C387 @@ -318,7 +316,7 @@ CREATE TABLE t1 ( c CHAR(16) CHARACTER SET cp1251 ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml' - OPTION_LIST='xmlsup=libxml2'; + OPTION_LIST='xmlsup=domdoc'; SELECT c, HEX(c) FROM t1; c ??????? HEX(c) 3F3F3F3F3F3F3F @@ -333,44 +331,13 @@ DROP TABLE t1; # # Testing Cyrillic # -CREATE TABLE t1 -( -c CHAR(16) CHARACTER SET utf8 -) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='cp1251.xml' - OPTION_LIST='xmlsup=libxml2,rownode=b'; -SELECT * FROM t1; -c БВГДЕЖЗ -INSERT INTO t1 VALUES ('ИКЛМÐ'); -SELECT c, HEX(c) FROM t1; -c БВГДЕЖЗ -HEX(c) D091D092D093D094D095D096D097 -c ИКЛМР-HEX(c) D098D09AD09BD09CD09D -DROP TABLE t1; -CREATE TABLE t1 -( -c CHAR(16) CHARACTER SET cp1251 -) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='cp1251.xml' - OPTION_LIST='xmlsup=libxml2,rownode=b'; -SELECT * FROM t1; -c БВГДЕЖЗ -c ИКЛМР-INSERT INTO t1 VALUES ('ОПРСТ'); -SELECT c, HEX(c) FROM t1; -c БВГДЕЖЗ -HEX(c) C1C2C3C4C5C6C7 -c ИКЛМР-HEX(c) C8CACBCCCD -c ОПРСТ -HEX(c) CECFD0D1D2 -DROP TABLE t1; # # Testing that the underlying file is created with a proper Encoding # CREATE TABLE t1 (node VARCHAR(50)) CHARACTER SET latin1 ENGINE=connect TABLE_TYPE=xml FILE_NAME='t1.xml' - OPTION_LIST='xmlsup=libxml2,rownode=line,encoding=utf-8'; + OPTION_LIST='xmlsup=domdoc,rownode=line,encoding=utf-8'; INSERT INTO t1 VALUES (_latin1 0xC0C1C2C3); SELECT node, hex(node) FROM t1; node ÀÃÂÃ @@ -384,7 +351,7 @@ HEX(EXTRACTVALUE(@a,'/t1/line/node')) C380C381C382C383 CREATE TABLE t1 (node VARCHAR(50)) CHARACTER SET latin1 ENGINE=connect TABLE_TYPE=xml FILE_NAME='t1.xml' - OPTION_LIST='xmlsup=libxml2,rownode=line,encoding=iso-8859-1'; + OPTION_LIST='xmlsup=domdoc,rownode=line,encoding=iso-8859-1'; INSERT INTO t1 VALUES (_latin1 0xC0C1C2C3); SELECT node, hex(node) FROM t1; node ÀÃÂÃ @@ -401,31 +368,26 @@ HEX(EXTRACTVALUE(@a,'/t1/line/node')) C0C1C2C3 CREATE TABLE t1 (node VARCHAR(50)) CHARACTER SET utf8 ENGINE=connect TABLE_TYPE=xml FILE_NAME='t1.xml' - OPTION_LIST='xmlsup=libxml2,rownode=line,encoding=iso-8859-1'; + OPTION_LIST='xmlsup=domdoc,rownode=line,encoding=iso-8859-1'; INSERT INTO t1 VALUES (_latin1 0xC0C1C2C3); INSERT INTO t1 VALUES (_cp1251 0xC0C1C2C3); +Warnings: +Level Warning +Code 1105 +Message Com error: Unable to save character to 'iso-8859-1' encoding. + INSERT INTO t1 VALUES ('&<>"\''); SELECT node, hex(node) FROM t1; -node ÀÃÂÃ -hex(node) C380C381C382C383 -node ÐБВГ -hex(node) D090D091D092D093 node &<>"' hex(node) 263C3E2227 DROP TABLE t1; SET @a=LOAD_FILE('MYSQLD_DATADIR/test/t1.xml'); SELECT CAST(@a AS CHAR CHARACTER SET latin1); -CAST(@a AS CHAR CHARACTER SET latin1) - - - - ÀÃÂÃ - - - АБВГ - - - &<>"' - - +CAST(@a AS CHAR CHARACTER SET latin1) + + + + &<>"' + + diff --git a/storage/connect/mysql-test/connect/r/xml2.result b/storage/connect/mysql-test/connect/r/xml2.result new file mode 100644 index 00000000000..eea53bf55c7 --- /dev/null +++ b/storage/connect/mysql-test/connect/r/xml2.result @@ -0,0 +1,431 @@ +Warnings: +Warning 1105 No file name. Table will use t1.xml +SET NAMES utf8; +# +# Testing tag values +# +CREATE TABLE t1 +( +AUTHOR CHAR(50), +TITLE CHAR(32), +TRANSLATOR CHAR(40), +PUBLISHER CHAR(40), +DATEPUB INT(4) +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' + OPTION_LIST='xmlsup=libxml2'; +SELECT * FROM t1; +AUTHOR Jean-Christophe Bernadac +TITLE Construire une application XML +TRANSLATOR NULL +PUBLISHER Eyrolles Paris +DATEPUB 1999 +AUTHOR William J. Pardi +TITLE XML en Action +TRANSLATOR James Guerin +PUBLISHER Microsoft Press Paris +DATEPUB 1999 +DROP TABLE t1; +# +# Testing that tag names are case sensitive +# +CREATE TABLE t1 +( +author CHAR(50), +TITLE CHAR(32), +TRANSLATOR CHAR(40), +PUBLISHER CHAR(40), +DATEPUB INT(4) +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' + OPTION_LIST='xmlsup=libxml2'; +SELECT * FROM t1; +author NULL +TITLE Construire une application XML +TRANSLATOR NULL +PUBLISHER Eyrolles Paris +DATEPUB 1999 +author NULL +TITLE XML en Action +TRANSLATOR James Guerin +PUBLISHER Microsoft Press Paris +DATEPUB 1999 +DROP TABLE t1; +# +# Testing attribute values +# +CREATE TABLE t1 ( +ISBN CHAR(15), +LANG CHAR(2), +SUBJECT CHAR(32) +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' + OPTION_LIST='Coltype=@,xmlsup=libxml2'; +SELECT * FROM t1; +ISBN 9782212090819 +LANG fr +SUBJECT applications +ISBN 9782840825685 +LANG fr +SUBJECT applications +DROP TABLE t1; +# +# Testing that attribute names are case sensitive +# +CREATE TABLE t1 ( +isbn CHAR(15), +LANG CHAR(2), +SUBJECT CHAR(32) +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' + OPTION_LIST='Coltype=@,xmlsup=libxml2'; +SELECT * FROM t1; +isbn NULL +LANG fr +SUBJECT applications +isbn NULL +LANG fr +SUBJECT applications +DROP TABLE t1; +# +# Testing mixed tag and attribute values +# +CREATE TABLE t1 ( +ISBN CHAR(15) FIELD_FORMAT='@', +LANG CHAR(2) FIELD_FORMAT='@', +SUBJECT CHAR(32) FIELD_FORMAT='@', +AUTHOR CHAR(50), +TITLE CHAR(32), +TRANSLATOR CHAR(40), +PUBLISHER CHAR(40), +DATEPUB INT(4) +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' + TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK' + OPTION_LIST='xmlsup=libxml2'; +SELECT * FROM t1; +ISBN 9782212090819 +LANG fr +SUBJECT applications +AUTHOR Jean-Christophe Bernadac +TITLE Construire une application XML +TRANSLATOR NULL +PUBLISHER Eyrolles Paris +DATEPUB 1999 +ISBN 9782840825685 +LANG fr +SUBJECT applications +AUTHOR William J. Pardi +TITLE XML en Action +TRANSLATOR James Guerin +PUBLISHER Microsoft Press Paris +DATEPUB 1999 +DROP TABLE t1; +# +# Testing INSERT on mixed tag and attribute values +# +CREATE TABLE t1 ( +ISBN CHAR(15) FIELD_FORMAT='@', +LANG CHAR(2) FIELD_FORMAT='@', +SUBJECT CHAR(32) FIELD_FORMAT='@', +AUTHOR CHAR(50), +TITLE CHAR(32), +TRANSLATOR CHAR(40), +PUBLISHER CHAR(40), +DATEPUB INT(4) +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample2.xml' + TABNAME='BIBLIO' + OPTION_LIST='rownode=BOOK,xmlsup=libxml2'; +INSERT INTO t1 (ISBN, LANG, SUBJECT, AUTHOR, TITLE, PUBLISHEr, DATEPUB) +VALUES('9782212090529','fr','général','Alain Michard', +'XML, Langage et Applications','Eyrolles Paris',1998); +SELECT * FROM t1; +ISBN 9782212090819 +LANG fr +SUBJECT applications +AUTHOR Jean-Christophe Bernadac +TITLE Construire une application XML +TRANSLATOR NULL +PUBLISHER Eyrolles Paris +DATEPUB 1999 +ISBN 9782840825685 +LANG fr +SUBJECT applications +AUTHOR William J. Pardi +TITLE XML en Action +TRANSLATOR James Guerin +PUBLISHER Microsoft Press Paris +DATEPUB 1999 +ISBN 9782212090529 +LANG fr +SUBJECT général +AUTHOR Alain Michard +TITLE XML, Langage et Applications +TRANSLATOR NULL +PUBLISHER Eyrolles Paris +DATEPUB 1998 +SELECT LOAD_FILE('MYSQLD_DATADIR/test/xsample2.xml') AS xml; +xml + + + + Jean-Christophe + Bernadac + + + François + Knab + + Construire une application XML + + Eyrolles + Paris + + 1999 + + + + William J. + Pardi + + + James + Guerin + + XML en Action + + Microsoft Press + Paris + + 1999 + + + Alain Michard + XML, Langage et Applications + Eyrolles Paris + 1998 + + + +DROP TABLE t1; +# +# Testing XPath +# +CREATE TABLE t1 ( +isbn CHAR(15) FIELD_FORMAT='@ISBN', +language CHAR(2) FIELD_FORMAT='@LANG', +subject CHAR(32) FIELD_FORMAT='@SUBJECT', +authorfn CHAR(20) FIELD_FORMAT='AUTHOR/FIRSTNAME', +authorln CHAR(20) FIELD_FORMAT='AUTHOR/LASTNAME', +title CHAR(32) FIELD_FORMAT='TITLE', +translated CHAR(32) FIELD_FORMAT='TRANSLATOR/@PREFIX', +tranfn CHAR(20) FIELD_FORMAT='TRANSLATOR/FIRSTNAME', +tranln CHAR(20) FIELD_FORMAT='TRANSLATOR/LASTNAME', +publisher CHAR(20) FIELD_FORMAT='PUBLISHER/NAME', +location CHAR(20) FIELD_FORMAT='PUBLISHER/PLACE', +year INT(4) FIELD_FORMAT='DATEPUB' +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' + TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK,skipnull=1,xmlsup=libxml2'; +SELECT * FROM t1; +isbn 9782212090819 +language fr +subject applications +authorfn Jean-Christophe +authorln Bernadac +title Construire une application XML +translated NULL +tranfn NULL +tranln NULL +publisher Eyrolles +location Paris +year 1999 +isbn 9782840825685 +language fr +subject applications +authorfn William J. +authorln Pardi +title XML en Action +translated adapté de l'anglais par +tranfn James +tranln Guerin +publisher Microsoft Press +location Paris +year 1999 +SELECT isbn, title, translated, tranfn, tranln, location FROM t1 +WHERE translated <> ''; +isbn 9782840825685 +title XML en Action +translated adapté de l'anglais par +tranfn James +tranln Guerin +location Paris +DROP TABLE t1; +# +# Testing that XPath is case sensitive +# +CREATE TABLE t1 +( +isbn CHAR(15) FIELD_FORMAT='@isbn' +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' + TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK,skipnull=1,xmlsup=libxml2'; +SELECT * FROM t1; +isbn NULL +isbn NULL +DROP TABLE t1; +# +# Testing character sets +# +CREATE TABLE t1 +( +c CHAR(16) +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml' + OPTION_LIST='xmlsup=libxml2' + DATA_CHARSET=latin1; +ERROR HY000: DATA_CHARSET='latin1' is not supported for TABLE_TYPE=XML +CREATE TABLE t1 +( +c CHAR(16) +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml' + OPTION_LIST='xmlsup=libxml2' + DATA_CHARSET=utf8; +SHOW CREATE TABLE t1; +Table t1 +Create Table CREATE TABLE `t1` ( + `c` char(16) DEFAULT NULL +) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`=XML `FILE_NAME`='latin1.xml' `OPTION_LIST`='xmlsup=libxml2' `DATA_CHARSET`=utf8 +SELECT c, HEX(c) FROM t1; +c ÃÂÃÄÅÆÇ +HEX(c) C1C2C3C4C5C6C7 +DROP TABLE t1; +CREATE TABLE t1 +( +c CHAR(16) +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml' + OPTION_LIST='xmlsup=libxml2'; +SELECT c, HEX(c) FROM t1; +c ÃÂÃÄÅÆÇ +HEX(c) C1C2C3C4C5C6C7 +DROP TABLE t1; +CREATE TABLE t1 +( +c CHAR(16) CHARACTER SET utf8 +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml' + OPTION_LIST='xmlsup=libxml2'; +SELECT c, HEX(c) FROM t1; +c ÃÂÃÄÅÆÇ +HEX(c) C381C382C383C384C385C386C387 +DROP TABLE t1; +# +# Conversion from latin1 to cp1251 produces a warning. +# Question marks are returned. +# +CREATE TABLE t1 +( +c CHAR(16) CHARACTER SET cp1251 +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml' + OPTION_LIST='xmlsup=libxml2'; +SELECT c, HEX(c) FROM t1; +c ??????? +HEX(c) 3F3F3F3F3F3F3F +Warnings: +Level Warning +Code 1366 +Message Incorrect string value: '\xC3\x81\xC3\x82\xC3\x83...' for column 'c' at row 1 +Level Warning +Code 1105 +Message Out of range value ÃÂÃÄÅÆÇ for column 'c' at row 1 +DROP TABLE t1; +# +# Testing Cyrillic +# +CREATE TABLE t1 +( +c CHAR(16) CHARACTER SET utf8 +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='cp1251.xml' + OPTION_LIST='xmlsup=libxml2,rownode=b'; +SELECT * FROM t1; +c БВГДЕЖЗ +INSERT INTO t1 VALUES ('ИКЛМÐ'); +SELECT c, HEX(c) FROM t1; +c БВГДЕЖЗ +HEX(c) D091D092D093D094D095D096D097 +c ИКЛМР+HEX(c) D098D09AD09BD09CD09D +DROP TABLE t1; +CREATE TABLE t1 +( +c CHAR(16) CHARACTER SET cp1251 +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='cp1251.xml' + OPTION_LIST='xmlsup=libxml2,rownode=b'; +SELECT * FROM t1; +c БВГДЕЖЗ +c ИКЛМР+INSERT INTO t1 VALUES ('ОПРСТ'); +SELECT c, HEX(c) FROM t1; +c БВГДЕЖЗ +HEX(c) C1C2C3C4C5C6C7 +c ИКЛМР+HEX(c) C8CACBCCCD +c ОПРСТ +HEX(c) CECFD0D1D2 +DROP TABLE t1; +# +# Testing that the underlying file is created with a proper Encoding +# +CREATE TABLE t1 (node VARCHAR(50)) +CHARACTER SET latin1 +ENGINE=connect TABLE_TYPE=xml FILE_NAME='t1.xml' + OPTION_LIST='xmlsup=libxml2,rownode=line,encoding=utf-8'; +INSERT INTO t1 VALUES (_latin1 0xC0C1C2C3); +SELECT node, hex(node) FROM t1; +node ÀÃÂÃ +hex(node) C0C1C2C3 +DROP TABLE t1; +SET @a=LOAD_FILE('MYSQLD_DATADIR/test/t1.xml'); +SELECT LEFT(@a,38); +LEFT(@a,38) +SELECT HEX(EXTRACTVALUE(@a,'/t1/line/node')); +HEX(EXTRACTVALUE(@a,'/t1/line/node')) C380C381C382C383 +CREATE TABLE t1 (node VARCHAR(50)) +CHARACTER SET latin1 +ENGINE=connect TABLE_TYPE=xml FILE_NAME='t1.xml' + OPTION_LIST='xmlsup=libxml2,rownode=line,encoding=iso-8859-1'; +INSERT INTO t1 VALUES (_latin1 0xC0C1C2C3); +SELECT node, hex(node) FROM t1; +node ÀÃÂÃ +hex(node) C0C1C2C3 +DROP TABLE t1; +SET @a=LOAD_FILE('MYSQLD_DATADIR/test/t1.xml'); +SELECT LEFT(@a,43); +LEFT(@a,43) +SELECT HEX(EXTRACTVALUE(@a,'/t1/line/node')); +HEX(EXTRACTVALUE(@a,'/t1/line/node')) C0C1C2C3 +# +# Testing XML entities +# +CREATE TABLE t1 (node VARCHAR(50)) +CHARACTER SET utf8 +ENGINE=connect TABLE_TYPE=xml FILE_NAME='t1.xml' + OPTION_LIST='xmlsup=libxml2,rownode=line,encoding=iso-8859-1'; +INSERT INTO t1 VALUES (_latin1 0xC0C1C2C3); +INSERT INTO t1 VALUES (_cp1251 0xC0C1C2C3); +INSERT INTO t1 VALUES ('&<>"\''); +SELECT node, hex(node) FROM t1; +node ÀÃÂÃ +hex(node) C380C381C382C383 +node ÐБВГ +hex(node) D090D091D092D093 +node &<>"' +hex(node) 263C3E2227 +DROP TABLE t1; +SET @a=LOAD_FILE('MYSQLD_DATADIR/test/t1.xml'); +SELECT CAST(@a AS CHAR CHARACTER SET latin1); +CAST(@a AS CHAR CHARACTER SET latin1) + + + + ÀÃÂÃ + + + АБВГ + + + &<>"' + + + diff --git a/storage/connect/mysql-test/connect/r/xml2_grant.result b/storage/connect/mysql-test/connect/r/xml2_grant.result new file mode 100644 index 00000000000..817d3f5bf57 --- /dev/null +++ b/storage/connect/mysql-test/connect/r/xml2_grant.result @@ -0,0 +1,107 @@ +Warnings: +Warning 1105 No file name. Table will use t1.xml +# +# Beginning of grant.inc +# +CREATE USER user@localhost; +GRANT ALL PRIVILEGES ON *.* TO user@localhost; +REVOKE FILE ON *.* FROM user@localhost; +connect user,localhost,user,,; +connection user; +SELECT user(); +user() +user@localhost +CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2,rownode=row'; +Warnings: +Warning 1105 No file name. Table will use t1.xml +INSERT INTO t1 VALUES (10); +SELECT * FROM t1; +a +10 +UPDATE t1 SET a=20; +SELECT * FROM t1; +a +20 +DELETE FROM t1; +SELECT * FROM t1; +a +INSERT INTO t1 VALUES(10); +TRUNCATE TABLE t1; +SELECT * FROM t1; +a +CREATE VIEW v1 AS SELECT * FROM t1; +SELECT * FROM v1; +a +DROP VIEW v1; +DROP TABLE t1; +CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2,rownode=row' FILE_NAME='t1.EXT'; +ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; +SELECT user(); +user() +root@localhost +CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2,rownode=row' FILE_NAME='t1.EXT'; +INSERT INTO t1 VALUES (10); +connection user; +SELECT user(); +user() +user@localhost +INSERT INTO t1 VALUES (10); +ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +SELECT * FROM t1; +ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +UPDATE t1 SET a=20; +ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +DELETE FROM t1; +ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +TRUNCATE TABLE t1; +ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +ALTER TABLE t1 READONLY=1; +ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +ALTER TABLE t1 FILE_NAME='t2.EXT'; +ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +DROP TABLE t1; +ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +CREATE VIEW v1 AS SELECT * FROM t1; +ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +# Testing a VIEW created with FILE privileges but accessed with no FILE +connection default; +SELECT user(); +user() +root@localhost +CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT * FROM t1; +connection user; +SELECT user(); +user() +user@localhost +SELECT * FROM v1; +ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +INSERT INTO v1 VALUES (2); +ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +UPDATE v1 SET a=123; +ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +DELETE FROM v1; +ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; +SELECT user(); +user() +root@localhost +DROP VIEW v1; +DROP TABLE t1; +CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2,rownode=row'; +Warnings: +Warning 1105 No file name. Table will use t1.xml +INSERT INTO t1 VALUES (10); +connection user; +SELECT user(); +user() +user@localhost +ALTER TABLE t1 FILE_NAME='t1.EXT'; +ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) +connection default; +DROP TABLE t1; +disconnect user; +DROP USER user@localhost; +# +# End of grant.inc +# diff --git a/storage/connect/mysql-test/connect/r/xml2_html.result b/storage/connect/mysql-test/connect/r/xml2_html.result new file mode 100644 index 00000000000..143f46529f6 --- /dev/null +++ b/storage/connect/mysql-test/connect/r/xml2_html.result @@ -0,0 +1,32 @@ +Warnings: +Warning 1105 No file name. Table will use t1.xml +SET NAMES utf8; +# +# Testing HTML like XML file +# +CREATE TABLE beers ( +`Name` CHAR(16) FIELD_FORMAT='brandName', +`Origin` CHAR(16) FIELD_FORMAT='origin', +`Description` CHAR(32) FIELD_FORMAT='details') +ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='beers.xml' +TABNAME='table' OPTION_LIST='xmlsup=libxml2,rownode=tr,colnode=td'; +SELECT * FROM beers; +Name Origin Description +Huntsman Bath, UK Wonderful hop, light alcohol +Tuborg Danmark In small bottles +DROP TABLE beers; +# +# Testing HTML file +# +CREATE TABLE coffee ( +`Name` CHAR(16), +`Cups` INT(8), +`Type` CHAR(16), +`Sugar` CHAR(4)) +ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='coffee.htm' +TABNAME='TABLE' HEADER=1 OPTION_LIST='xmlsup=libxml2,Coltype=HTML'; +SELECT * FROM coffee; +Name Cups Type Sugar +T. Sexton 10 Espresso No +J. Dinnen 5 Decaf Yes +DROP TABLE coffee; diff --git a/storage/connect/mysql-test/connect/r/xml2_mdev5261.result b/storage/connect/mysql-test/connect/r/xml2_mdev5261.result new file mode 100644 index 00000000000..0ee5712dd02 --- /dev/null +++ b/storage/connect/mysql-test/connect/r/xml2_mdev5261.result @@ -0,0 +1,25 @@ +Warnings: +Warning 1105 No file name. Table will use t1.xml +SET NAMES utf8; +CREATE TABLE t1 (i INT UNIQUE NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='xmlsup=libxml2,Rownode=N'; +ERROR HY000: Table type XML is not indexable +CREATE TABLE t1 (i INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='xmlsup=libxml2,Rownode=N'; +DESCRIBE t1; +Field Type Null Key Default Extra +i int(11) NO NULL +ALTER TABLE t1 ADD UNIQUE(i); +ERROR HY000: Table type XML is not indexable +CREATE UNIQUE INDEX i ON t1(i); +ERROR HY000: Table type XML is not indexable +DESCRIBE t1; +Field Type Null Key Default Extra +i int(11) NO NULL +INSERT INTO t1 VALUES(2),(5),(7); +SELECT * FROM t1 WHERE i = 5; +i +5 +ALTER TABLE t1 DROP INDEX i; +ERROR 42000: Can't DROP INDEX `i`; check that it exists +DROP INDEX i ON t1; +ERROR 42000: Can't DROP INDEX `i`; check that it exists +DROP TABLE t1; diff --git a/storage/connect/mysql-test/connect/r/xml2_mult.result b/storage/connect/mysql-test/connect/r/xml2_mult.result new file mode 100644 index 00000000000..a9592e986c0 --- /dev/null +++ b/storage/connect/mysql-test/connect/r/xml2_mult.result @@ -0,0 +1,102 @@ +Warnings: +Warning 1105 No file name. Table will use t1.xml +SET NAMES utf8; +# +# Testing expanded values +# +CREATE TABLE `bookstore` ( +`category` CHAR(16) NOT NULL FIELD_FORMAT='@', +`title` VARCHAR(50) NOT NULL, +`lang` char(2) NOT NULL FIELD_FORMAT='title/@', +`author` VARCHAR(24) NOT NULL, +`year` INT(4) NOT NULL, +`price` DOUBLE(8,2) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='bookstore.xml' OPTION_LIST='expand=1,mulnode=author,limit=6,xmlsup=libxml2'; +SELECT * FROM bookstore; +category title lang author year price +COOKING Everyday Italian en Giada De Laurentiis 2005 30.00 +CHILDREN Harry Potter en J K. Rowling 2005 29.99 +WEB XQuery Kick Start en James McGovern 2003 49.99 +WEB XQuery Kick Start en Per Bothner 2003 49.99 +WEB XQuery Kick Start en Kurt Cagle 2003 49.99 +WEB XQuery Kick Start en James Linn 2003 49.99 +WEB XQuery Kick Start en Vaidyanathan Nagarajan 2003 49.99 +WEB Learning XML en Erik T. Ray 2003 39.95 +SELECT category, title, price FROM bookstore; +category title price +COOKING Everyday Italian 30.00 +CHILDREN Harry Potter 29.99 +WEB XQuery Kick Start 49.99 +WEB Learning XML 39.95 +SELECT category, title, author, price FROM bookstore WHERE author LIKE '%K%'; +category title author price +CHILDREN Harry Potter J K. Rowling 29.99 +WEB XQuery Kick Start Kurt Cagle 49.99 +WEB Learning XML Erik T. Ray 39.95 +SELECT category, title, price FROM bookstore WHERE author LIKE 'J%'; +category title price +CHILDREN Harry Potter 29.99 +WEB XQuery Kick Start 49.99 +WEB XQuery Kick Start 49.99 +# +# Limiting expanded values +# +ALTER TABLE bookstore OPTION_LIST='expand=1,mulnode=author,limit=3,xmlsup=libxml2'; +SELECT * FROM bookstore; +category title lang author year price +COOKING Everyday Italian en Giada De Laurentiis 2005 30.00 +CHILDREN Harry Potter en J K. Rowling 2005 29.99 +WEB XQuery Kick Start en James McGovern 2003 49.99 +WEB XQuery Kick Start en Per Bothner 2003 49.99 +WEB XQuery Kick Start en Kurt Cagle 2003 49.99 +WEB Learning XML en Erik T. Ray 2003 39.95 +Warnings: +Warning 1105 Mutiple values limited to 3 +# One line lost because the where clause is applied only on the first 3 rows +SELECT category, title, author, price FROM bookstore WHERE author LIKE 'J%'; +category title author price +CHILDREN Harry Potter J K. Rowling 29.99 +WEB XQuery Kick Start James McGovern 49.99 +Warnings: +Warning 1105 Mutiple values limited to 3 +# +# Testing concatenated values +# +ALTER TABLE bookstore OPTION_LIST='mulnode=author,limit=6,xmlsup=libxml2'; +# truncated +SELECT * FROM bookstore; +category title lang author year price +COOKING Everyday Italian en Giada De Laurentiis 2005 30.00 +CHILDREN Harry Potter en J K. Rowling 2005 29.99 +WEB XQuery Kick Start en James McGovern, Per Both 2003 49.99 +WEB Learning XML en Erik T. Ray 2003 39.95 +Warnings: +Warning 1105 Truncated author content +# increase author size +ALTER TABLE bookstore MODIFY `author` VARCHAR(128) NOT NULL; +SELECT * FROM bookstore; +category title lang author year price +COOKING Everyday Italian en Giada De Laurentiis 2005 30.00 +CHILDREN Harry Potter en J K. Rowling 2005 29.99 +WEB XQuery Kick Start en James McGovern, Per Bothner, Kurt Cagle, James Linn, Vaidyanathan Nagarajan 2003 49.99 +WEB Learning XML en Erik T. Ray 2003 39.95 +# +# Limiting concatenated values +# +ALTER TABLE bookstore OPTION_LIST='mulnode=author,limit=4,xmlsup=libxml2'; +SELECT * FROM bookstore; +category title lang author year price +COOKING Everyday Italian en Giada De Laurentiis 2005 30.00 +CHILDREN Harry Potter en J K. Rowling 2005 29.99 +WEB XQuery Kick Start en James McGovern, Per Bothner, Kurt Cagle, James Linn 2003 49.99 +WEB Learning XML en Erik T. Ray 2003 39.95 +Warnings: +Warning 1105 Mutiple values limited to 4 +# The where clause is applied on the concatenated column result +SELECT category, title, author, price FROM bookstore WHERE author LIKE 'J%'; +category title author price +CHILDREN Harry Potter J K. Rowling 29.99 +WEB XQuery Kick Start James McGovern, Per Bothner, Kurt Cagle, James Linn 49.99 +Warnings: +Warning 1105 Mutiple values limited to 4 +DROP TABLE bookstore; diff --git a/storage/connect/mysql-test/connect/r/xml2_zip.result b/storage/connect/mysql-test/connect/r/xml2_zip.result new file mode 100644 index 00000000000..f176149c53f --- /dev/null +++ b/storage/connect/mysql-test/connect/r/xml2_zip.result @@ -0,0 +1,98 @@ +Warnings: +Warning 1105 No file name. Table will use t1.xml +# +# Testing zipped XML tables +# +CREATE TABLE t1 ( +ISBN CHAR(13) NOT NULL FIELD_FORMAT='@', +LANG CHAR(2) NOT NULL FIELD_FORMAT='@', +SUBJECT CHAR(12) NOT NULL FIELD_FORMAT='@', +AUTHOR_FIRSTNAME CHAR(15) NOT NULL FIELD_FORMAT='AUTHOR/FIRSTNAME', +AUTHOR_LASTNAME CHAR(8) NOT NULL FIELD_FORMAT='AUTHOR/LASTNAME', +TRANSLATOR_PREFIX CHAR(24) DEFAULT NULL FIELD_FORMAT='TRANSLATOR/@PREFIX', +TRANSLATOR_FIRSTNAME CHAR(6) DEFAULT NULL FIELD_FORMAT='TRANSLATOR/FIRSTNAME', +TRANSLATOR_LASTNAME CHAR(6) DEFAULT NULL FIELD_FORMAT='TRANSLATOR/LASTNAME', +TITLE CHAR(30) NOT NULL, +PUBLISHER_NAME CHAR(15) NOT NULL FIELD_FORMAT='PUBLISHER/NAME', +PUBLISHER_PLACE CHAR(5) NOT NULL FIELD_FORMAT='PUBLISHER/PLACE', +DATEPUB CHAR(4) NOT NULL +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample2.zip' ZIPPED=YES +OPTION_LIST='entry=xsample2.xml,load=xsample2.xml,rownode=BOOK,xmlsup=libxml2,expand=1,mulnode=AUTHOR'; +SELECT * FROM t1; +ISBN 9782212090819 +LANG fr +SUBJECT applications +AUTHOR_FIRSTNAME Jean-Christophe +AUTHOR_LASTNAME Bernadac +TRANSLATOR_PREFIX NULL +TRANSLATOR_FIRSTNAME NULL +TRANSLATOR_LASTNAME NULL +TITLE Construire une application XML +PUBLISHER_NAME Eyrolles +PUBLISHER_PLACE Paris +DATEPUB 1999 +ISBN 9782212090819 +LANG fr +SUBJECT applications +AUTHOR_FIRSTNAME François +AUTHOR_LASTNAME Knab +TRANSLATOR_PREFIX NULL +TRANSLATOR_FIRSTNAME NULL +TRANSLATOR_LASTNAME NULL +TITLE Construire une application XML +PUBLISHER_NAME Eyrolles +PUBLISHER_PLACE Paris +DATEPUB 1999 +ISBN 9782840825685 +LANG fr +SUBJECT applications +AUTHOR_FIRSTNAME William J. +AUTHOR_LASTNAME Pardi +TRANSLATOR_PREFIX adapté de l'anglais par +TRANSLATOR_FIRSTNAME James +TRANSLATOR_LASTNAME Guerin +TITLE XML en Action +PUBLISHER_NAME Microsoft Press +PUBLISHER_PLACE Paris +DATEPUB 1999 +ISBN 9782212090529 +LANG fr +SUBJECT général +AUTHOR_FIRSTNAME Alain +AUTHOR_LASTNAME Michard +TRANSLATOR_PREFIX NULL +TRANSLATOR_FIRSTNAME NULL +TRANSLATOR_LASTNAME NULL +TITLE XML, Langage et Applications +PUBLISHER_NAME Eyrolles +PUBLISHER_PLACE Paris +DATEPUB 2003 +CREATE TABLE t2 +ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample2.zip' ZIPPED=YES +OPTION_LIST='xmlsup=libxml2'; +SELECT * FROM t2; +ISBN 9782212090819 +LANG fr +SUBJECT applications +AUTHOR Jean-Christophe Bernadac +TRANSLATOR NULL +TITLE Construire une application XML +PUBLISHER Eyrolles Paris +DATEPUB 1999 +ISBN 9782840825685 +LANG fr +SUBJECT applications +AUTHOR William J. Pardi +TRANSLATOR James Guerin +TITLE XML en Action +PUBLISHER Microsoft Press Paris +DATEPUB 1999 +ISBN 9782212090529 +LANG fr +SUBJECT général +AUTHOR Alain Michard +TRANSLATOR NULL +TITLE XML, Langage et Applications +PUBLISHER Eyrolles Paris +DATEPUB 2003 +DROP TABLE t1,t2; diff --git a/storage/connect/mysql-test/connect/r/xml_grant.result b/storage/connect/mysql-test/connect/r/xml_grant.result index 817d3f5bf57..950ae4a3b35 100644 --- a/storage/connect/mysql-test/connect/r/xml_grant.result +++ b/storage/connect/mysql-test/connect/r/xml_grant.result @@ -1,5 +1,3 @@ -Warnings: -Warning 1105 No file name. Table will use t1.xml # # Beginning of grant.inc # @@ -11,7 +9,7 @@ connection user; SELECT user(); user() user@localhost -CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2,rownode=row'; +CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=domdoc,rownode=row'; Warnings: Warning 1105 No file name. Table will use t1.xml INSERT INTO t1 VALUES (10); @@ -34,13 +32,13 @@ SELECT * FROM v1; a DROP VIEW v1; DROP TABLE t1; -CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2,rownode=row' FILE_NAME='t1.EXT'; +CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=domdoc,rownode=row' FILE_NAME='t1.EXT'; ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO) connection default; SELECT user(); user() root@localhost -CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2,rownode=row' FILE_NAME='t1.EXT'; +CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=domdoc,rownode=row' FILE_NAME='t1.EXT'; INSERT INTO t1 VALUES (10); connection user; SELECT user(); @@ -88,7 +86,7 @@ user() root@localhost DROP VIEW v1; DROP TABLE t1; -CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2,rownode=row'; +CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=domdoc,rownode=row'; Warnings: Warning 1105 No file name. Table will use t1.xml INSERT INTO t1 VALUES (10); diff --git a/storage/connect/mysql-test/connect/r/xml_html.result b/storage/connect/mysql-test/connect/r/xml_html.result index 143f46529f6..4b984a49901 100644 --- a/storage/connect/mysql-test/connect/r/xml_html.result +++ b/storage/connect/mysql-test/connect/r/xml_html.result @@ -1,5 +1,3 @@ -Warnings: -Warning 1105 No file name. Table will use t1.xml SET NAMES utf8; # # Testing HTML like XML file @@ -9,7 +7,7 @@ CREATE TABLE beers ( `Origin` CHAR(16) FIELD_FORMAT='origin', `Description` CHAR(32) FIELD_FORMAT='details') ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='beers.xml' -TABNAME='table' OPTION_LIST='xmlsup=libxml2,rownode=tr,colnode=td'; +TABNAME='table' OPTION_LIST='xmlsup=domdoc,rownode=tr,colnode=td'; SELECT * FROM beers; Name Origin Description Huntsman Bath, UK Wonderful hop, light alcohol @@ -24,7 +22,7 @@ CREATE TABLE coffee ( `Type` CHAR(16), `Sugar` CHAR(4)) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='coffee.htm' -TABNAME='TABLE' HEADER=1 OPTION_LIST='xmlsup=libxml2,Coltype=HTML'; +TABNAME='TABLE' HEADER=1 OPTION_LIST='xmlsup=domdoc,Coltype=HTML'; SELECT * FROM coffee; Name Cups Type Sugar T. Sexton 10 Espresso No diff --git a/storage/connect/mysql-test/connect/r/xml_mdev5261.result b/storage/connect/mysql-test/connect/r/xml_mdev5261.result index f91194d570c..b5ae32c7784 100644 --- a/storage/connect/mysql-test/connect/r/xml_mdev5261.result +++ b/storage/connect/mysql-test/connect/r/xml_mdev5261.result @@ -1,9 +1,7 @@ -Warnings: -Warning 1105 No file name. Table will use t1.xml SET NAMES utf8; -CREATE TABLE t1 (i INT UNIQUE NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='Rownode=N'; +CREATE TABLE t1 (i INT UNIQUE NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='xmlsup=domdoc,Rownode=N'; ERROR HY000: Table type XML is not indexable -CREATE TABLE t1 (i INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='Rownode=N'; +CREATE TABLE t1 (i INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='xmlsup=domdoc,Rownode=N'; DESCRIBE t1; Field Type Null Key Default Extra i int(11) NO NULL diff --git a/storage/connect/mysql-test/connect/r/xml_mult.result b/storage/connect/mysql-test/connect/r/xml_mult.result index a9592e986c0..d89debadfab 100644 --- a/storage/connect/mysql-test/connect/r/xml_mult.result +++ b/storage/connect/mysql-test/connect/r/xml_mult.result @@ -1,5 +1,3 @@ -Warnings: -Warning 1105 No file name. Table will use t1.xml SET NAMES utf8; # # Testing expanded values @@ -11,7 +9,7 @@ CREATE TABLE `bookstore` ( `author` VARCHAR(24) NOT NULL, `year` INT(4) NOT NULL, `price` DOUBLE(8,2) NOT NULL) -ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='bookstore.xml' OPTION_LIST='expand=1,mulnode=author,limit=6,xmlsup=libxml2'; +ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='bookstore.xml' OPTION_LIST='expand=1,mulnode=author,limit=6,xmlsup=domdoc'; SELECT * FROM bookstore; category title lang author year price COOKING Everyday Italian en Giada De Laurentiis 2005 30.00 @@ -41,7 +39,7 @@ WEB XQuery Kick Start 49.99 # # Limiting expanded values # -ALTER TABLE bookstore OPTION_LIST='expand=1,mulnode=author,limit=3,xmlsup=libxml2'; +ALTER TABLE bookstore OPTION_LIST='expand=1,mulnode=author,limit=3,xmlsup=domdoc'; SELECT * FROM bookstore; category title lang author year price COOKING Everyday Italian en Giada De Laurentiis 2005 30.00 @@ -62,7 +60,7 @@ Warning 1105 Mutiple values limited to 3 # # Testing concatenated values # -ALTER TABLE bookstore OPTION_LIST='mulnode=author,limit=6,xmlsup=libxml2'; +ALTER TABLE bookstore OPTION_LIST='mulnode=author,limit=6,xmlsup=domdoc'; # truncated SELECT * FROM bookstore; category title lang author year price @@ -83,7 +81,7 @@ WEB Learning XML en Erik T. Ray 2003 39.95 # # Limiting concatenated values # -ALTER TABLE bookstore OPTION_LIST='mulnode=author,limit=4,xmlsup=libxml2'; +ALTER TABLE bookstore OPTION_LIST='mulnode=author,limit=4,xmlsup=domdoc'; SELECT * FROM bookstore; category title lang author year price COOKING Everyday Italian en Giada De Laurentiis 2005 30.00 diff --git a/storage/connect/mysql-test/connect/r/xml_zip.result b/storage/connect/mysql-test/connect/r/xml_zip.result index f176149c53f..f7790e4cfff 100644 --- a/storage/connect/mysql-test/connect/r/xml_zip.result +++ b/storage/connect/mysql-test/connect/r/xml_zip.result @@ -1,5 +1,3 @@ -Warnings: -Warning 1105 No file name. Table will use t1.xml # # Testing zipped XML tables # @@ -17,7 +15,7 @@ PUBLISHER_NAME CHAR(15) NOT NULL FIELD_FORMAT='PUBLISHER/NAME', PUBLISHER_PLACE CHAR(5) NOT NULL FIELD_FORMAT='PUBLISHER/PLACE', DATEPUB CHAR(4) NOT NULL ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample2.zip' ZIPPED=YES -OPTION_LIST='entry=xsample2.xml,load=xsample2.xml,rownode=BOOK,xmlsup=libxml2,expand=1,mulnode=AUTHOR'; +OPTION_LIST='entry=xsample2.xml,load=xsample2.xml,rownode=BOOK,xmlsup=domdoc,expand=1,mulnode=AUTHOR'; SELECT * FROM t1; ISBN 9782212090819 LANG fr @@ -69,7 +67,7 @@ PUBLISHER_PLACE Paris DATEPUB 2003 CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample2.zip' ZIPPED=YES -OPTION_LIST='xmlsup=libxml2'; +OPTION_LIST='xmlsup=domdoc'; SELECT * FROM t2; ISBN 9782212090819 LANG fr diff --git a/storage/connect/mysql-test/connect/r/zip.result b/storage/connect/mysql-test/connect/r/zip.result index c03b27bd428..c81546a4689 100644 --- a/storage/connect/mysql-test/connect/r/zip.result +++ b/storage/connect/mysql-test/connect/r/zip.result @@ -171,16 +171,16 @@ DROP TABLE t1,t2,t3,t4; # CREATE TABLE t1 ( _id INT(2) NOT NULL, -name_first CHAR(9) NOT NULL FIELD_FORMAT='name:first', -name_aka CHAR(4) DEFAULT NULL FIELD_FORMAT='name:aka', -name_last CHAR(10) NOT NULL FIELD_FORMAT='name:last', +name_first CHAR(9) NOT NULL FIELD_FORMAT='$.name.first', +name_aka CHAR(4) DEFAULT NULL FIELD_FORMAT='$.name.aka', +name_last CHAR(10) NOT NULL FIELD_FORMAT='$.name.last', title CHAR(12) DEFAULT NULL, birth CHAR(20) DEFAULT NULL, death CHAR(20) DEFAULT NULL, -contribs CHAR(7) NOT NULL FIELD_FORMAT='contribs:', -awards_award CHAR(42) DEFAULT NULL FIELD_FORMAT='awards::award', -awards_year CHAR(4) DEFAULT NULL FIELD_FORMAT='awards::year', -awards_by CHAR(38) DEFAULT NULL FIELD_FORMAT='awards::by' +contribs CHAR(7) NOT NULL FIELD_FORMAT='$.contribs', +awards_award CHAR(42) DEFAULT NULL FIELD_FORMAT='$.awards.award', +awards_year CHAR(4) DEFAULT NULL FIELD_FORMAT='$.awards.year', +awards_by CHAR(38) DEFAULT NULL FIELD_FORMAT='$.awards.by' ) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='bios.zip' OPTION_LIST='ENTRY=bios.json,LOAD=bios.json' ZIPPED=YES; SELECT * FROM t1; _id name_first name_aka name_last title birth death contribs awards_award awards_year awards_by @@ -211,16 +211,16 @@ _id name_first name_aka name_last title birth death contribs awards_award awards 10 Martin NULL Odersky NULL NULL NULL Scala NULL NULL NULL CREATE TABLE t3 ( _id INT(2) NOT NULL, -firstname CHAR(9) NOT NULL FIELD_FORMAT='name:first', -aka CHAR(4) DEFAULT NULL FIELD_FORMAT='name:aka', -lastname CHAR(10) NOT NULL FIELD_FORMAT='name:last', +firstname CHAR(9) NOT NULL FIELD_FORMAT='$.name.first', +aka CHAR(4) DEFAULT NULL FIELD_FORMAT='$.name.aka', +lastname CHAR(10) NOT NULL FIELD_FORMAT='$.name.last', title CHAR(12) DEFAULT NULL, birth date DEFAULT NULL date_format="YYYY-DD-MM'T'hh:mm:ss'Z'", death date DEFAULT NULL date_format="YYYY-DD-MM'T'hh:mm:ss'Z'", -contribs CHAR(64) NOT NULL FIELD_FORMAT='contribs:[", "]', -award CHAR(42) DEFAULT NULL FIELD_FORMAT='awards:[x]:award', -year CHAR(4) DEFAULT NULL FIELD_FORMAT='awards:[x]:year', -`by` CHAR(38) DEFAULT NULL FIELD_FORMAT='awards:[x]:by' +contribs CHAR(64) NOT NULL FIELD_FORMAT='$.contribs.[", "]', +award CHAR(42) DEFAULT NULL FIELD_FORMAT='$.awards[*].award', +year CHAR(4) DEFAULT NULL FIELD_FORMAT='$.awards[*].year', +`by` CHAR(38) DEFAULT NULL FIELD_FORMAT='$.awards[*].by' ) ENGINE=CONNECT TABLE_TYPE='json' FILE_NAME='bios.zip' ZIPPED=YES; SELECT * FROM t3 WHERE _id = 1; _id firstname aka lastname title birth death contribs award year by diff --git a/storage/connect/mysql-test/connect/std_data/Mongo2.jar b/storage/connect/mysql-test/connect/std_data/Mongo2.jar new file mode 100644 index 00000000000..d019bf6906b Binary files /dev/null and b/storage/connect/mysql-test/connect/std_data/Mongo2.jar differ diff --git a/storage/connect/mysql-test/connect/std_data/Mongo3.jar b/storage/connect/mysql-test/connect/std_data/Mongo3.jar new file mode 100644 index 00000000000..73eb3571290 Binary files /dev/null and b/storage/connect/mysql-test/connect/std_data/Mongo3.jar differ diff --git a/storage/connect/mysql-test/connect/std_data/cities.json b/storage/connect/mysql-test/connect/std_data/cities.json new file mode 100644 index 00000000000..dc13a5e0d8d --- /dev/null +++ b/storage/connect/mysql-test/connect/std_data/cities.json @@ -0,0 +1,29353 @@ +{ "_id" : "01001", "city" : "AGAWAM", "loc" : [ -72.622739, 42.070206 ], "pop" : 15338, "state" : "MA" } +{ "_id" : "01002", "city" : "CUSHMAN", "loc" : [ -72.51564999999999, 42.377017 ], "pop" : 36963, "state" : "MA" } +{ "_id" : "01005", "city" : "BARRE", "loc" : [ -72.10835400000001, 42.409698 ], "pop" : 4546, "state" : "MA" } +{ "_id" : "01007", "city" : "BELCHERTOWN", "loc" : [ -72.41095300000001, 42.275103 ], "pop" : 10579, "state" : "MA" } +{ "_id" : "01008", "city" : "BLANDFORD", "loc" : [ -72.936114, 42.182949 ], "pop" : 1240, "state" : "MA" } +{ "_id" : "01010", "city" : "BRIMFIELD", "loc" : [ -72.188455, 42.116543 ], "pop" : 3706, "state" : "MA" } +{ "_id" : "01011", "city" : "CHESTER", "loc" : [ -72.988761, 42.279421 ], "pop" : 1688, "state" : "MA" } +{ "_id" : "01012", "city" : "CHESTERFIELD", "loc" : [ -72.833309, 42.38167 ], "pop" : 177, "state" : "MA" } +{ "_id" : "01013", "city" : "CHICOPEE", "loc" : [ -72.607962, 42.162046 ], "pop" : 23396, "state" : "MA" } +{ "_id" : "01020", "city" : "CHICOPEE", "loc" : [ -72.576142, 42.176443 ], "pop" : 31495, "state" : "MA" } +{ "_id" : "01022", "city" : "WESTOVER AFB", "loc" : [ -72.558657, 42.196672 ], "pop" : 1764, "state" : "MA" } +{ "_id" : "01026", "city" : "CUMMINGTON", "loc" : [ -72.905767, 42.435296 ], "pop" : 1484, "state" : "MA" } +{ "_id" : "01027", "city" : "MOUNT TOM", "loc" : [ -72.67992099999999, 42.264319 ], "pop" : 16864, "state" : "MA" } +{ "_id" : "01028", "city" : "EAST LONGMEADOW", "loc" : [ -72.505565, 42.067203 ], "pop" : 13367, "state" : "MA" } +{ "_id" : "01030", "city" : "FEEDING HILLS", "loc" : [ -72.675077, 42.07182 ], "pop" : 11985, "state" : "MA" } +{ "_id" : "01031", "city" : "GILBERTVILLE", "loc" : [ -72.19858499999999, 42.332194 ], "pop" : 2385, "state" : "MA" } +{ "_id" : "01032", "city" : "GOSHEN", "loc" : [ -72.844092, 42.466234 ], "pop" : 122, "state" : "MA" } +{ "_id" : "01033", "city" : "GRANBY", "loc" : [ -72.52000099999999, 42.255704 ], "pop" : 5526, "state" : "MA" } +{ "_id" : "01034", "city" : "TOLLAND", "loc" : [ -72.908793, 42.070234 ], "pop" : 1652, "state" : "MA" } +{ "_id" : "01035", "city" : "HADLEY", "loc" : [ -72.571499, 42.36062 ], "pop" : 4231, "state" : "MA" } +{ "_id" : "01036", "city" : "HAMPDEN", "loc" : [ -72.43182299999999, 42.064756 ], "pop" : 4709, "state" : "MA" } +{ "_id" : "01038", "city" : "HATFIELD", "loc" : [ -72.61673500000001, 42.38439 ], "pop" : 3184, "state" : "MA" } +{ "_id" : "01039", "city" : "HAYDENVILLE", "loc" : [ -72.70317799999999, 42.381799 ], "pop" : 1387, "state" : "MA" } +{ "_id" : "01040", "city" : "HOLYOKE", "loc" : [ -72.626193, 42.202007 ], "pop" : 43704, "state" : "MA" } +{ "_id" : "01050", "city" : "HUNTINGTON", "loc" : [ -72.873341, 42.265301 ], "pop" : 2084, "state" : "MA" } +{ "_id" : "01053", "city" : "LEEDS", "loc" : [ -72.70340299999999, 42.354292 ], "pop" : 1350, "state" : "MA" } +{ "_id" : "01054", "city" : "LEVERETT", "loc" : [ -72.499334, 42.46823 ], "pop" : 1748, "state" : "MA" } +{ "_id" : "01056", "city" : "LUDLOW", "loc" : [ -72.471012, 42.172823 ], "pop" : 18820, "state" : "MA" } +{ "_id" : "01057", "city" : "MONSON", "loc" : [ -72.31963399999999, 42.101017 ], "pop" : 8194, "state" : "MA" } +{ "_id" : "01060", "city" : "FLORENCE", "loc" : [ -72.654245, 42.324662 ], "pop" : 27939, "state" : "MA" } +{ "_id" : "01068", "city" : "OAKHAM", "loc" : [ -72.051265, 42.348033 ], "pop" : 1503, "state" : "MA" } +{ "_id" : "01069", "city" : "PALMER", "loc" : [ -72.328785, 42.176233 ], "pop" : 9778, "state" : "MA" } +{ "_id" : "01070", "city" : "PLAINFIELD", "loc" : [ -72.918289, 42.514393 ], "pop" : 571, "state" : "MA" } +{ "_id" : "01071", "city" : "RUSSELL", "loc" : [ -72.840343, 42.147063 ], "pop" : 608, "state" : "MA" } +{ "_id" : "01072", "city" : "SHUTESBURY", "loc" : [ -72.421342, 42.481968 ], "pop" : 1533, "state" : "MA" } +{ "_id" : "01073", "city" : "SOUTHAMPTON", "loc" : [ -72.719381, 42.224697 ], "pop" : 4478, "state" : "MA" } +{ "_id" : "01075", "city" : "SOUTH HADLEY", "loc" : [ -72.581137, 42.237537 ], "pop" : 16699, "state" : "MA" } +{ "_id" : "01077", "city" : "SOUTHWICK", "loc" : [ -72.770588, 42.051099 ], "pop" : 7667, "state" : "MA" } +{ "_id" : "01080", "city" : "THREE RIVERS", "loc" : [ -72.362352, 42.181894 ], "pop" : 2425, "state" : "MA" } +{ "_id" : "01081", "city" : "WALES", "loc" : [ -72.20459200000001, 42.062734 ], "pop" : 1732, "state" : "MA" } +{ "_id" : "01082", "city" : "WARE", "loc" : [ -72.258285, 42.261831 ], "pop" : 9808, "state" : "MA" } +{ "_id" : "01085", "city" : "MONTGOMERY", "loc" : [ -72.754318, 42.129484 ], "pop" : 40117, "state" : "MA" } +{ "_id" : "01089", "city" : "WEST SPRINGFIELD", "loc" : [ -72.641109, 42.115066 ], "pop" : 27537, "state" : "MA" } +{ "_id" : "01092", "city" : "WEST WARREN", "loc" : [ -72.203639, 42.20734 ], "pop" : 4441, "state" : "MA" } +{ "_id" : "01095", "city" : "WILBRAHAM", "loc" : [ -72.446415, 42.124506 ], "pop" : 12635, "state" : "MA" } +{ "_id" : "01096", "city" : "WILLIAMSBURG", "loc" : [ -72.77798900000001, 42.408522 ], "pop" : 2295, "state" : "MA" } +{ "_id" : "01098", "city" : "WORTHINGTON", "loc" : [ -72.931427, 42.384293 ], "pop" : 877, "state" : "MA" } +{ "_id" : "01103", "city" : "SPRINGFIELD", "loc" : [ -72.588735, 42.1029 ], "pop" : 2323, "state" : "MA" } +{ "_id" : "01104", "city" : "SPRINGFIELD", "loc" : [ -72.577769, 42.128848 ], "pop" : 22115, "state" : "MA" } +{ "_id" : "01105", "city" : "SPRINGFIELD", "loc" : [ -72.578312, 42.099931 ], "pop" : 14970, "state" : "MA" } +{ "_id" : "01106", "city" : "LONGMEADOW", "loc" : [ -72.5676, 42.050658 ], "pop" : 15688, "state" : "MA" } +{ "_id" : "01107", "city" : "SPRINGFIELD", "loc" : [ -72.606544, 42.117907 ], "pop" : 12739, "state" : "MA" } +{ "_id" : "01108", "city" : "SPRINGFIELD", "loc" : [ -72.558432, 42.085314 ], "pop" : 25519, "state" : "MA" } +{ "_id" : "01109", "city" : "SPRINGFIELD", "loc" : [ -72.554349, 42.114455 ], "pop" : 32635, "state" : "MA" } +{ "_id" : "01118", "city" : "SPRINGFIELD", "loc" : [ -72.527445, 42.092937 ], "pop" : 14618, "state" : "MA" } +{ "_id" : "01119", "city" : "SPRINGFIELD", "loc" : [ -72.51211000000001, 42.12473 ], "pop" : 13040, "state" : "MA" } +{ "_id" : "01128", "city" : "SPRINGFIELD", "loc" : [ -72.48890299999999, 42.094397 ], "pop" : 3272, "state" : "MA" } +{ "_id" : "01129", "city" : "SPRINGFIELD", "loc" : [ -72.487622, 42.122263 ], "pop" : 6831, "state" : "MA" } +{ "_id" : "01151", "city" : "INDIAN ORCHARD", "loc" : [ -72.505048, 42.153225 ], "pop" : 8702, "state" : "MA" } +{ "_id" : "01201", "city" : "PITTSFIELD", "loc" : [ -73.24708800000001, 42.453086 ], "pop" : 50655, "state" : "MA" } +{ "_id" : "01220", "city" : "ADAMS", "loc" : [ -73.117225, 42.622319 ], "pop" : 9901, "state" : "MA" } +{ "_id" : "01222", "city" : "ASHLEY FALLS", "loc" : [ -73.320195, 42.059552 ], "pop" : 561, "state" : "MA" } +{ "_id" : "01223", "city" : "BECKET", "loc" : [ -73.12032499999999, 42.359363 ], "pop" : 1070, "state" : "MA" } +{ "_id" : "01225", "city" : "CHESHIRE", "loc" : [ -73.15796400000001, 42.561059 ], "pop" : 3094, "state" : "MA" } +{ "_id" : "01226", "city" : "DALTON", "loc" : [ -73.160259, 42.475046 ], "pop" : 7357, "state" : "MA" } +{ "_id" : "01230", "city" : "GREAT BARRINGTON", "loc" : [ -73.36065000000001, 42.195922 ], "pop" : 10603, "state" : "MA" } +{ "_id" : "01235", "city" : "PERU", "loc" : [ -73.092433, 42.434604 ], "pop" : 2559, "state" : "MA" } +{ "_id" : "01236", "city" : "HOUSATONIC", "loc" : [ -73.374544, 42.265296 ], "pop" : 802, "state" : "MA" } +{ "_id" : "01237", "city" : "HANCOCK", "loc" : [ -73.24873700000001, 42.541961 ], "pop" : 2328, "state" : "MA" } +{ "_id" : "01238", "city" : "LEE", "loc" : [ -73.231696, 42.298994 ], "pop" : 6916, "state" : "MA" } +{ "_id" : "01240", "city" : "LENOX", "loc" : [ -73.271322, 42.364241 ], "pop" : 5001, "state" : "MA" } +{ "_id" : "01243", "city" : "MIDDLEFIELD", "loc" : [ -73.006226, 42.34795 ], "pop" : 384, "state" : "MA" } +{ "_id" : "01245", "city" : "WEST OTIS", "loc" : [ -73.213452, 42.187847 ], "pop" : 329, "state" : "MA" } +{ "_id" : "01247", "city" : "CLARKSBURG", "loc" : [ -73.10999, 42.69865 ], "pop" : 19054, "state" : "MA" } +{ "_id" : "01253", "city" : "OTIS", "loc" : [ -73.082093, 42.18988 ], "pop" : 1060, "state" : "MA" } +{ "_id" : "01254", "city" : "RICHMOND", "loc" : [ -73.364457, 42.378398 ], "pop" : 1134, "state" : "MA" } +{ "_id" : "01255", "city" : "SANDISFIELD", "loc" : [ -73.116285, 42.109429 ], "pop" : 651, "state" : "MA" } +{ "_id" : "01256", "city" : "SAVOY", "loc" : [ -73.023281, 42.576964 ], "pop" : 632, "state" : "MA" } +{ "_id" : "01257", "city" : "SHEFFIELD", "loc" : [ -73.361091, 42.100102 ], "pop" : 1839, "state" : "MA" } +{ "_id" : "01258", "city" : "SOUTH EGREMONT", "loc" : [ -73.456575, 42.101153 ], "pop" : 135, "state" : "MA" } +{ "_id" : "01259", "city" : "SOUTHFIELD", "loc" : [ -73.26093299999999, 42.078014 ], "pop" : 622, "state" : "MA" } +{ "_id" : "01262", "city" : "STOCKBRIDGE", "loc" : [ -73.32226300000001, 42.30104 ], "pop" : 2200, "state" : "MA" } +{ "_id" : "01266", "city" : "WEST STOCKBRIDGE", "loc" : [ -73.38251, 42.334752 ], "pop" : 1173, "state" : "MA" } +{ "_id" : "01267", "city" : "WILLIAMSTOWN", "loc" : [ -73.20363999999999, 42.708883 ], "pop" : 8220, "state" : "MA" } +{ "_id" : "01270", "city" : "WINDSOR", "loc" : [ -73.04661, 42.509494 ], "pop" : 770, "state" : "MA" } +{ "_id" : "01301", "city" : "LEYDEN", "loc" : [ -72.60184700000001, 42.601222 ], "pop" : 18968, "state" : "MA" } +{ "_id" : "01330", "city" : "ASHFIELD", "loc" : [ -72.810998, 42.523207 ], "pop" : 1535, "state" : "MA" } +{ "_id" : "01331", "city" : "NEW SALEM", "loc" : [ -72.21464400000001, 42.592065 ], "pop" : 14077, "state" : "MA" } +{ "_id" : "01337", "city" : "LEYDEN", "loc" : [ -72.563439, 42.683784 ], "pop" : 2426, "state" : "MA" } +{ "_id" : "01338", "city" : "BUCKLAND", "loc" : [ -72.764124, 42.615174 ], "pop" : 16, "state" : "MA" } +{ "_id" : "01339", "city" : "HAWLEY", "loc" : [ -72.880162, 42.621802 ], "pop" : 1325, "state" : "MA" } +{ "_id" : "01340", "city" : "COLRAIN", "loc" : [ -72.726508, 42.67905 ], "pop" : 2050, "state" : "MA" } +{ "_id" : "01341", "city" : "CONWAY", "loc" : [ -72.702473, 42.513832 ], "pop" : 1524, "state" : "MA" } +{ "_id" : "01342", "city" : "DEERFIELD", "loc" : [ -72.60723400000001, 42.540636 ], "pop" : 1281, "state" : "MA" } +{ "_id" : "01344", "city" : "ERVING", "loc" : [ -72.41663800000001, 42.604957 ], "pop" : 635, "state" : "MA" } +{ "_id" : "01346", "city" : "HEATH", "loc" : [ -72.839101, 42.685347 ], "pop" : 174, "state" : "MA" } +{ "_id" : "01349", "city" : "MILLERS FALLS", "loc" : [ -72.494626, 42.576206 ], "pop" : 1893, "state" : "MA" } +{ "_id" : "01350", "city" : "MONROE", "loc" : [ -72.960156, 42.723885 ], "pop" : 97, "state" : "MA" } +{ "_id" : "01351", "city" : "MONTAGUE", "loc" : [ -72.532837, 42.542864 ], "pop" : 1699, "state" : "MA" } +{ "_id" : "01355", "city" : "NEW SALEM", "loc" : [ -72.306241, 42.514643 ], "pop" : 456, "state" : "MA" } +{ "_id" : "01360", "city" : "NORTHFIELD", "loc" : [ -72.45099500000001, 42.688705 ], "pop" : 2829, "state" : "MA" } +{ "_id" : "01364", "city" : "NEW SALEM", "loc" : [ -72.30586700000001, 42.591231 ], "pop" : 8544, "state" : "MA" } +{ "_id" : "01366", "city" : "PETERSHAM", "loc" : [ -72.18934900000001, 42.489761 ], "pop" : 1131, "state" : "MA" } +{ "_id" : "01367", "city" : "ROWE", "loc" : [ -72.925776, 42.695289 ], "pop" : 630, "state" : "MA" } +{ "_id" : "01370", "city" : "SHELBURNE FALLS", "loc" : [ -72.739059, 42.602203 ], "pop" : 4525, "state" : "MA" } +{ "_id" : "01373", "city" : "SOUTH DEERFIELD", "loc" : [ -72.615268, 42.475616 ], "pop" : 5118, "state" : "MA" } +{ "_id" : "01375", "city" : "SUNDERLAND", "loc" : [ -72.56756900000001, 42.453947 ], "pop" : 3399, "state" : "MA" } +{ "_id" : "01376", "city" : "TURNERS FALLS", "loc" : [ -72.54701, 42.606521 ], "pop" : 7100, "state" : "MA" } +{ "_id" : "01379", "city" : "WENDELL", "loc" : [ -72.400851, 42.565644 ], "pop" : 393, "state" : "MA" } +{ "_id" : "01420", "city" : "FITCHBURG", "loc" : [ -71.803133, 42.579563 ], "pop" : 41194, "state" : "MA" } +{ "_id" : "01430", "city" : "ASHBURNHAM", "loc" : [ -71.92666, 42.649614 ], "pop" : 5433, "state" : "MA" } +{ "_id" : "01431", "city" : "ASHBY", "loc" : [ -71.817369, 42.674462 ], "pop" : 2649, "state" : "MA" } +{ "_id" : "01432", "city" : "AYER", "loc" : [ -71.578763, 42.55914 ], "pop" : 6871, "state" : "MA" } +{ "_id" : "01433", "city" : "FT DEVENS", "loc" : [ -71.621819, 42.532416 ], "pop" : 8480, "state" : "MA" } +{ "_id" : "01436", "city" : "BALDWINVILLE", "loc" : [ -72.06464699999999, 42.593568 ], "pop" : 4386, "state" : "MA" } +{ "_id" : "01440", "city" : "GARDNER", "loc" : [ -71.9898, 42.57405 ], "pop" : 20125, "state" : "MA" } +{ "_id" : "01450", "city" : "GROTON", "loc" : [ -71.55837099999999, 42.612351 ], "pop" : 7504, "state" : "MA" } +{ "_id" : "01451", "city" : "HARVARD", "loc" : [ -71.575293, 42.498565 ], "pop" : 4445, "state" : "MA" } +{ "_id" : "01452", "city" : "HUBBARDSTON", "loc" : [ -72.001159, 42.486538 ], "pop" : 2797, "state" : "MA" } +{ "_id" : "01453", "city" : "LEOMINSTER", "loc" : [ -71.756308, 42.52744 ], "pop" : 38145, "state" : "MA" } +{ "_id" : "01460", "city" : "LITTLETON", "loc" : [ -71.487667, 42.540132 ], "pop" : 7066, "state" : "MA" } +{ "_id" : "01462", "city" : "LUNENBURG", "loc" : [ -71.726642, 42.58843 ], "pop" : 9117, "state" : "MA" } +{ "_id" : "01463", "city" : "PEPPERELL", "loc" : [ -71.59339199999999, 42.668888 ], "pop" : 10178, "state" : "MA" } +{ "_id" : "01464", "city" : "SHIRLEY CENTER", "loc" : [ -71.646444, 42.558653 ], "pop" : 6118, "state" : "MA" } +{ "_id" : "01468", "city" : "TEMPLETON", "loc" : [ -72.064971, 42.545976 ], "pop" : 2058, "state" : "MA" } +{ "_id" : "01469", "city" : "TOWNSEND", "loc" : [ -71.689646, 42.652511 ], "pop" : 6112, "state" : "MA" } +{ "_id" : "01473", "city" : "WESTMINSTER", "loc" : [ -71.909599, 42.548319 ], "pop" : 6191, "state" : "MA" } +{ "_id" : "01474", "city" : "W TOWNSEND", "loc" : [ -71.74057000000001, 42.670404 ], "pop" : 2452, "state" : "MA" } +{ "_id" : "01475", "city" : "WINCHENDON", "loc" : [ -72.047524, 42.678943 ], "pop" : 8805, "state" : "MA" } +{ "_id" : "01501", "city" : "AUBURN", "loc" : [ -71.839144, 42.205502 ], "pop" : 15007, "state" : "MA" } +{ "_id" : "01503", "city" : "BERLIN", "loc" : [ -71.635634, 42.384438 ], "pop" : 2293, "state" : "MA" } +{ "_id" : "01504", "city" : "BLACKSTONE", "loc" : [ -71.52691, 42.028708 ], "pop" : 8023, "state" : "MA" } +{ "_id" : "01505", "city" : "BOYLSTON", "loc" : [ -71.731042, 42.337727 ], "pop" : 3517, "state" : "MA" } +{ "_id" : "01506", "city" : "BROOKFIELD", "loc" : [ -72.098887, 42.199141 ], "pop" : 2968, "state" : "MA" } +{ "_id" : "01507", "city" : "CHARLTON", "loc" : [ -71.96638400000001, 42.137902 ], "pop" : 9576, "state" : "MA" } +{ "_id" : "01510", "city" : "CLINTON", "loc" : [ -71.682847, 42.418147 ], "pop" : 13269, "state" : "MA" } +{ "_id" : "01515", "city" : "EAST BROOKFIELD", "loc" : [ -72.048078, 42.219308 ], "pop" : 2033, "state" : "MA" } +{ "_id" : "01516", "city" : "EAST DOUGLAS", "loc" : [ -71.72661100000001, 42.060566 ], "pop" : 5594, "state" : "MA" } +{ "_id" : "01518", "city" : "FISKDALE", "loc" : [ -72.11776399999999, 42.122762 ], "pop" : 774, "state" : "MA" } +{ "_id" : "01519", "city" : "GRAFTON", "loc" : [ -71.686848, 42.200371 ], "pop" : 4910, "state" : "MA" } +{ "_id" : "01520", "city" : "HOLDEN", "loc" : [ -71.84142, 42.341983 ], "pop" : 12051, "state" : "MA" } +{ "_id" : "01521", "city" : "HOLLAND", "loc" : [ -72.15437300000001, 42.040264 ], "pop" : 747, "state" : "MA" } +{ "_id" : "01522", "city" : "JEFFERSON", "loc" : [ -71.87058, 42.375519 ], "pop" : 2478, "state" : "MA" } +{ "_id" : "01523", "city" : "LANCASTER", "loc" : [ -71.686831, 42.450984 ], "pop" : 6018, "state" : "MA" } +{ "_id" : "01524", "city" : "LEICESTER", "loc" : [ -71.918829, 42.237047 ], "pop" : 6527, "state" : "MA" } +{ "_id" : "01527", "city" : "MILLBURY", "loc" : [ -71.764438, 42.196779 ], "pop" : 12228, "state" : "MA" } +{ "_id" : "01529", "city" : "MILLVILLE", "loc" : [ -71.579813, 42.033102 ], "pop" : 2236, "state" : "MA" } +{ "_id" : "01531", "city" : "NEW BRAINTREE", "loc" : [ -72.13064199999999, 42.31977 ], "pop" : 881, "state" : "MA" } +{ "_id" : "01532", "city" : "NORTHBOROUGH", "loc" : [ -71.646372, 42.318242 ], "pop" : 11930, "state" : "MA" } +{ "_id" : "01534", "city" : "NORTHBRIDGE", "loc" : [ -71.65636600000001, 42.1494 ], "pop" : 4564, "state" : "MA" } +{ "_id" : "01535", "city" : "NORTH BROOKFIELD", "loc" : [ -72.08212899999999, 42.266455 ], "pop" : 4755, "state" : "MA" } +{ "_id" : "01536", "city" : "NORTH GRAFTON", "loc" : [ -71.70369100000001, 42.229726 ], "pop" : 5401, "state" : "MA" } +{ "_id" : "01537", "city" : "NORTH OXFORD", "loc" : [ -71.885953, 42.16549 ], "pop" : 3031, "state" : "MA" } +{ "_id" : "01540", "city" : "OXFORD", "loc" : [ -71.86867700000001, 42.11285 ], "pop" : 9557, "state" : "MA" } +{ "_id" : "01541", "city" : "PRINCETON", "loc" : [ -71.876245, 42.450812 ], "pop" : 3189, "state" : "MA" } +{ "_id" : "01542", "city" : "ROCHDALE", "loc" : [ -71.906882, 42.199685 ], "pop" : 1154, "state" : "MA" } +{ "_id" : "01543", "city" : "RUTLAND", "loc" : [ -71.94895099999999, 42.376199 ], "pop" : 4936, "state" : "MA" } +{ "_id" : "01545", "city" : "SHREWSBURY", "loc" : [ -71.72050299999999, 42.284801 ], "pop" : 24146, "state" : "MA" } +{ "_id" : "01550", "city" : "SOUTHBRIDGE", "loc" : [ -72.035347, 42.075024 ], "pop" : 17816, "state" : "MA" } +{ "_id" : "01560", "city" : "SOUTH GRAFTON", "loc" : [ -71.692725, 42.176042 ], "pop" : 2719, "state" : "MA" } +{ "_id" : "01562", "city" : "SPENCER", "loc" : [ -71.990617, 42.244103 ], "pop" : 11598, "state" : "MA" } +{ "_id" : "01564", "city" : "STERLING", "loc" : [ -71.775192, 42.435351 ], "pop" : 6481, "state" : "MA" } +{ "_id" : "01566", "city" : "STURBRIDGE", "loc" : [ -72.084233, 42.112619 ], "pop" : 7001, "state" : "MA" } +{ "_id" : "01568", "city" : "WEST UPTON", "loc" : [ -71.608014, 42.173275 ], "pop" : 4682, "state" : "MA" } +{ "_id" : "01569", "city" : "UXBRIDGE", "loc" : [ -71.632869, 42.074426 ], "pop" : 10364, "state" : "MA" } +{ "_id" : "01570", "city" : "DUDLEY HILL", "loc" : [ -71.839467, 42.047574 ], "pop" : 3735, "state" : "MA" } +{ "_id" : "01571", "city" : "DUDLEY", "loc" : [ -71.89322799999999, 42.048894 ], "pop" : 22001, "state" : "MA" } +{ "_id" : "01581", "city" : "WESTBOROUGH", "loc" : [ -71.617604, 42.267891 ], "pop" : 14132, "state" : "MA" } +{ "_id" : "01583", "city" : "WEST BOYLSTON", "loc" : [ -71.783822, 42.35836 ], "pop" : 6611, "state" : "MA" } +{ "_id" : "01585", "city" : "WEST BROOKFIELD", "loc" : [ -72.15113700000001, 42.244137 ], "pop" : 3528, "state" : "MA" } +{ "_id" : "01588", "city" : "WHITINSVILLE", "loc" : [ -71.664357, 42.115319 ], "pop" : 8807, "state" : "MA" } +{ "_id" : "01590", "city" : "WILKINSONVILLE", "loc" : [ -71.74841600000001, 42.140586 ], "pop" : 6719, "state" : "MA" } +{ "_id" : "01602", "city" : "WORCESTER", "loc" : [ -71.841678, 42.270251 ], "pop" : 19988, "state" : "MA" } +{ "_id" : "01603", "city" : "WORCESTER", "loc" : [ -71.83799500000001, 42.245033 ], "pop" : 18605, "state" : "MA" } +{ "_id" : "01604", "city" : "WORCESTER", "loc" : [ -71.774626, 42.254084 ], "pop" : 29036, "state" : "MA" } +{ "_id" : "01605", "city" : "WORCESTER", "loc" : [ -71.78879499999999, 42.289391 ], "pop" : 25695, "state" : "MA" } +{ "_id" : "01606", "city" : "WORCESTER", "loc" : [ -71.79577399999999, 42.311029 ], "pop" : 18213, "state" : "MA" } +{ "_id" : "01607", "city" : "WORCESTER", "loc" : [ -71.793837, 42.230294 ], "pop" : 9048, "state" : "MA" } +{ "_id" : "01608", "city" : "WORCESTER", "loc" : [ -71.800262, 42.262425 ], "pop" : 3646, "state" : "MA" } +{ "_id" : "01609", "city" : "WORCESTER", "loc" : [ -71.81745600000001, 42.275387 ], "pop" : 21905, "state" : "MA" } +{ "_id" : "01610", "city" : "WORCESTER", "loc" : [ -71.81079800000001, 42.249186 ], "pop" : 23720, "state" : "MA" } +{ "_id" : "01611", "city" : "CHERRY VALLEY", "loc" : [ -71.874971, 42.237287 ], "pop" : 2510, "state" : "MA" } +{ "_id" : "01612", "city" : "PAXTON", "loc" : [ -71.92023399999999, 42.306646 ], "pop" : 4047, "state" : "MA" } +{ "_id" : "01701", "city" : "FRAMINGHAM", "loc" : [ -71.42548600000001, 42.300665 ], "pop" : 65046, "state" : "MA" } +{ "_id" : "01718", "city" : "VILLAGE OF NAGOG", "loc" : [ -71.422354, 42.514941 ], "pop" : 2330, "state" : "MA" } +{ "_id" : "01719", "city" : "BOXBORO", "loc" : [ -71.51822900000001, 42.486876 ], "pop" : 3343, "state" : "MA" } +{ "_id" : "01720", "city" : "ACTON", "loc" : [ -71.448255, 42.475076 ], "pop" : 15514, "state" : "MA" } +{ "_id" : "01721", "city" : "ASHLAND", "loc" : [ -71.458347, 42.253909 ], "pop" : 12066, "state" : "MA" } +{ "_id" : "01730", "city" : "BEDFORD", "loc" : [ -71.276796, 42.484287 ], "pop" : 16147, "state" : "MA" } +{ "_id" : "01740", "city" : "BOLTON", "loc" : [ -71.60759299999999, 42.436523 ], "pop" : 3134, "state" : "MA" } +{ "_id" : "01741", "city" : "CARLISLE", "loc" : [ -71.35189200000001, 42.528562 ], "pop" : 4333, "state" : "MA" } +{ "_id" : "01742", "city" : "CONCORD", "loc" : [ -71.374741, 42.456701 ], "pop" : 17076, "state" : "MA" } +{ "_id" : "01745", "city" : "SOUTHBOROUGH", "loc" : [ -71.502256, 42.293221 ], "pop" : 506, "state" : "MA" } +{ "_id" : "01746", "city" : "HOLLISTON", "loc" : [ -71.436059, 42.202641 ], "pop" : 12917, "state" : "MA" } +{ "_id" : "01747", "city" : "HOPEDALE", "loc" : [ -71.537601, 42.126796 ], "pop" : 5649, "state" : "MA" } +{ "_id" : "01748", "city" : "HOPKINTON", "loc" : [ -71.53017800000001, 42.219046 ], "pop" : 9191, "state" : "MA" } +{ "_id" : "01749", "city" : "HUDSON", "loc" : [ -71.560896, 42.391796 ], "pop" : 17233, "state" : "MA" } +{ "_id" : "01752", "city" : "MARLBOROUGH", "loc" : [ -71.54335500000001, 42.350861 ], "pop" : 31813, "state" : "MA" } +{ "_id" : "01754", "city" : "MAYNARD", "loc" : [ -71.454975, 42.432118 ], "pop" : 10325, "state" : "MA" } +{ "_id" : "01756", "city" : "MENDON", "loc" : [ -71.549882, 42.096744 ], "pop" : 4010, "state" : "MA" } +{ "_id" : "01757", "city" : "MILFORD", "loc" : [ -71.527402, 42.151142 ], "pop" : 25372, "state" : "MA" } +{ "_id" : "01760", "city" : "NATICK", "loc" : [ -71.35741, 42.287476 ], "pop" : 30432, "state" : "MA" } +{ "_id" : "01770", "city" : "SHERBORN", "loc" : [ -71.37871699999999, 42.233088 ], "pop" : 3998, "state" : "MA" } +{ "_id" : "01772", "city" : "SOUTHBOROUGH", "loc" : [ -71.531997, 42.293919 ], "pop" : 6122, "state" : "MA" } +{ "_id" : "01773", "city" : "LINCOLN", "loc" : [ -71.313723, 42.421723 ], "pop" : 4515, "state" : "MA" } +{ "_id" : "01775", "city" : "STOW", "loc" : [ -71.515019, 42.430785 ], "pop" : 5328, "state" : "MA" } +{ "_id" : "01776", "city" : "SUDBURY", "loc" : [ -71.42815899999999, 42.383655 ], "pop" : 14358, "state" : "MA" } +{ "_id" : "01778", "city" : "WAYLAND", "loc" : [ -71.35878099999999, 42.348629 ], "pop" : 11874, "state" : "MA" } +{ "_id" : "01801", "city" : "WOBURN", "loc" : [ -71.157404, 42.482894 ], "pop" : 36152, "state" : "MA" } +{ "_id" : "01803", "city" : "BURLINGTON", "loc" : [ -71.20043699999999, 42.508942 ], "pop" : 23093, "state" : "MA" } +{ "_id" : "01810", "city" : "ANDOVER", "loc" : [ -71.156481, 42.64956 ], "pop" : 29161, "state" : "MA" } +{ "_id" : "01821", "city" : "BILLERICA", "loc" : [ -71.25175400000001, 42.551874 ], "pop" : 28899, "state" : "MA" } +{ "_id" : "01824", "city" : "SOUTH CHELMSFORD", "loc" : [ -71.35752100000001, 42.59356 ], "pop" : 24457, "state" : "MA" } +{ "_id" : "01826", "city" : "DRACUT", "loc" : [ -71.318592, 42.676422 ], "pop" : 25594, "state" : "MA" } +{ "_id" : "01827", "city" : "DUNSTABLE", "loc" : [ -71.49520099999999, 42.673917 ], "pop" : 2166, "state" : "MA" } +{ "_id" : "01830", "city" : "HAVERHILL", "loc" : [ -71.072057, 42.785605 ], "pop" : 22445, "state" : "MA" } +{ "_id" : "01832", "city" : "HAVERHILL", "loc" : [ -71.10951900000001, 42.779154 ], "pop" : 16860, "state" : "MA" } +{ "_id" : "01833", "city" : "GEORGETOWN", "loc" : [ -70.98223900000001, 42.728067 ], "pop" : 6384, "state" : "MA" } +{ "_id" : "01834", "city" : "GROVELAND", "loc" : [ -71.027018, 42.753027 ], "pop" : 5214, "state" : "MA" } +{ "_id" : "01835", "city" : "BRADFORD", "loc" : [ -71.08548999999999, 42.758597 ], "pop" : 12078, "state" : "MA" } +{ "_id" : "01840", "city" : "LAWRENCE", "loc" : [ -71.16381, 42.707958 ], "pop" : 2728, "state" : "MA" } +{ "_id" : "01841", "city" : "LAWRENCE", "loc" : [ -71.16699699999999, 42.711545 ], "pop" : 45555, "state" : "MA" } +{ "_id" : "01843", "city" : "LAWRENCE", "loc" : [ -71.160506, 42.691053 ], "pop" : 22285, "state" : "MA" } +{ "_id" : "01844", "city" : "METHUEN", "loc" : [ -71.181031, 42.728019 ], "pop" : 39664, "state" : "MA" } +{ "_id" : "01845", "city" : "NORTH ANDOVER", "loc" : [ -71.109004, 42.682583 ], "pop" : 22792, "state" : "MA" } +{ "_id" : "01850", "city" : "LOWELL", "loc" : [ -71.30507799999999, 42.656035 ], "pop" : 15434, "state" : "MA" } +{ "_id" : "01851", "city" : "LOWELL", "loc" : [ -71.332882, 42.631548 ], "pop" : 28154, "state" : "MA" } +{ "_id" : "01852", "city" : "LOWELL", "loc" : [ -71.298331, 42.634413 ], "pop" : 33379, "state" : "MA" } +{ "_id" : "01854", "city" : "LOWELL", "loc" : [ -71.335464, 42.649254 ], "pop" : 26472, "state" : "MA" } +{ "_id" : "01860", "city" : "MERRIMAC", "loc" : [ -71.00465800000001, 42.834629 ], "pop" : 5196, "state" : "MA" } +{ "_id" : "01862", "city" : "NORTH BILLERICA", "loc" : [ -71.290217, 42.575694 ], "pop" : 8720, "state" : "MA" } +{ "_id" : "01863", "city" : "NORTH CHELMSFORD", "loc" : [ -71.390834, 42.634737 ], "pop" : 7878, "state" : "MA" } +{ "_id" : "01864", "city" : "NORTH READING", "loc" : [ -71.094711, 42.581898 ], "pop" : 12002, "state" : "MA" } +{ "_id" : "01867", "city" : "READING", "loc" : [ -71.109021, 42.527986 ], "pop" : 22539, "state" : "MA" } +{ "_id" : "01876", "city" : "TEWKSBURY", "loc" : [ -71.223224, 42.60283 ], "pop" : 27269, "state" : "MA" } +{ "_id" : "01879", "city" : "TYNGSBORO", "loc" : [ -71.415766, 42.672383 ], "pop" : 8643, "state" : "MA" } +{ "_id" : "01880", "city" : "WAKEFIELD", "loc" : [ -71.068471, 42.500886 ], "pop" : 24830, "state" : "MA" } +{ "_id" : "01886", "city" : "GRANITEVILLE", "loc" : [ -71.438143, 42.589959 ], "pop" : 16430, "state" : "MA" } +{ "_id" : "01887", "city" : "WILMINGTON", "loc" : [ -71.17230600000001, 42.558143 ], "pop" : 17647, "state" : "MA" } +{ "_id" : "01890", "city" : "WINCHESTER", "loc" : [ -71.14407, 42.453028 ], "pop" : 20232, "state" : "MA" } +{ "_id" : "01901", "city" : "LYNN", "loc" : [ -70.945516, 42.463378 ], "pop" : 1187, "state" : "MA" } +{ "_id" : "01902", "city" : "LYNN", "loc" : [ -70.94198900000001, 42.469814 ], "pop" : 41625, "state" : "MA" } +{ "_id" : "01904", "city" : "EAST LYNN", "loc" : [ -70.96279800000001, 42.487453 ], "pop" : 17073, "state" : "MA" } +{ "_id" : "01905", "city" : "WEST LYNN", "loc" : [ -70.97382500000001, 42.46453 ], "pop" : 21360, "state" : "MA" } +{ "_id" : "01906", "city" : "SAUGUS", "loc" : [ -71.011093, 42.463344 ], "pop" : 25487, "state" : "MA" } +{ "_id" : "01907", "city" : "SWAMPSCOTT", "loc" : [ -70.909774, 42.474611 ], "pop" : 13650, "state" : "MA" } +{ "_id" : "01908", "city" : "NAHANT", "loc" : [ -70.927739, 42.426098 ], "pop" : 3828, "state" : "MA" } +{ "_id" : "01913", "city" : "AMESBURY", "loc" : [ -70.93668099999999, 42.855879 ], "pop" : 14970, "state" : "MA" } +{ "_id" : "01915", "city" : "BEVERLY", "loc" : [ -70.875939, 42.560825 ], "pop" : 38259, "state" : "MA" } +{ "_id" : "01921", "city" : "BOXFORD", "loc" : [ -71.01137199999999, 42.679719 ], "pop" : 6249, "state" : "MA" } +{ "_id" : "01922", "city" : "BYFIELD", "loc" : [ -70.935053, 42.756792 ], "pop" : 2006, "state" : "MA" } +{ "_id" : "01923", "city" : "DANVERS", "loc" : [ -70.94246099999999, 42.569402 ], "pop" : 23977, "state" : "MA" } +{ "_id" : "01929", "city" : "ESSEX", "loc" : [ -70.782794, 42.628629 ], "pop" : 3260, "state" : "MA" } +{ "_id" : "01930", "city" : "GLOUCESTER", "loc" : [ -70.672149, 42.620836 ], "pop" : 28716, "state" : "MA" } +{ "_id" : "01938", "city" : "IPSWICH", "loc" : [ -70.84935299999999, 42.680877 ], "pop" : 11864, "state" : "MA" } +{ "_id" : "01940", "city" : "LYNNFIELD", "loc" : [ -71.033873, 42.532711 ], "pop" : 11274, "state" : "MA" } +{ "_id" : "01944", "city" : "MANCHESTER", "loc" : [ -70.76743399999999, 42.57963 ], "pop" : 5286, "state" : "MA" } +{ "_id" : "01945", "city" : "MARBLEHEAD", "loc" : [ -70.865291, 42.498431 ], "pop" : 19971, "state" : "MA" } +{ "_id" : "01949", "city" : "MIDDLETON", "loc" : [ -71.013004, 42.594184 ], "pop" : 4921, "state" : "MA" } +{ "_id" : "01950", "city" : "NEWBURYPORT", "loc" : [ -70.884668, 42.812964 ], "pop" : 16317, "state" : "MA" } +{ "_id" : "01951", "city" : "NEWBURY", "loc" : [ -70.84737699999999, 42.783475 ], "pop" : 3710, "state" : "MA" } +{ "_id" : "01952", "city" : "SALISBURY", "loc" : [ -70.858822, 42.850678 ], "pop" : 6879, "state" : "MA" } +{ "_id" : "01960", "city" : "PEABODY", "loc" : [ -70.96119400000001, 42.532579 ], "pop" : 47685, "state" : "MA" } +{ "_id" : "01966", "city" : "ROCKPORT", "loc" : [ -70.619424, 42.657973 ], "pop" : 7482, "state" : "MA" } +{ "_id" : "01969", "city" : "ROWLEY", "loc" : [ -70.90696, 42.713753 ], "pop" : 4368, "state" : "MA" } +{ "_id" : "01970", "city" : "SALEM", "loc" : [ -70.90034300000001, 42.515114 ], "pop" : 37642, "state" : "MA" } +{ "_id" : "01982", "city" : "SOUTH HAMILTON", "loc" : [ -70.856132, 42.618478 ], "pop" : 7288, "state" : "MA" } +{ "_id" : "01983", "city" : "TOPSFIELD", "loc" : [ -70.948843, 42.641546 ], "pop" : 5763, "state" : "MA" } +{ "_id" : "01984", "city" : "WENHAM", "loc" : [ -70.87862199999999, 42.60166 ], "pop" : 4148, "state" : "MA" } +{ "_id" : "01985", "city" : "WEST NEWBURY", "loc" : [ -70.977811, 42.794865 ], "pop" : 3421, "state" : "MA" } +{ "_id" : "02019", "city" : "BELLINGHAM", "loc" : [ -71.476829, 42.074573 ], "pop" : 14873, "state" : "MA" } +{ "_id" : "02021", "city" : "CANTON", "loc" : [ -71.135536, 42.164454 ], "pop" : 18530, "state" : "MA" } +{ "_id" : "02025", "city" : "COHASSET", "loc" : [ -70.812788, 42.239484 ], "pop" : 7075, "state" : "MA" } +{ "_id" : "02026", "city" : "DEDHAM", "loc" : [ -71.163741, 42.243685 ], "pop" : 23782, "state" : "MA" } +{ "_id" : "02030", "city" : "DOVER", "loc" : [ -71.285363, 42.236233 ], "pop" : 4915, "state" : "MA" } +{ "_id" : "02032", "city" : "EAST WALPOLE", "loc" : [ -71.2179, 42.15324 ], "pop" : 3844, "state" : "MA" } +{ "_id" : "02035", "city" : "FOXBORO", "loc" : [ -71.24412700000001, 42.064938 ], "pop" : 14293, "state" : "MA" } +{ "_id" : "02038", "city" : "FRANKLIN", "loc" : [ -71.40578600000001, 42.09347 ], "pop" : 22128, "state" : "MA" } +{ "_id" : "02043", "city" : "HINGHAM", "loc" : [ -70.891051, 42.224485 ], "pop" : 19821, "state" : "MA" } +{ "_id" : "02045", "city" : "HULL", "loc" : [ -70.87544200000001, 42.285346 ], "pop" : 10466, "state" : "MA" } +{ "_id" : "02048", "city" : "MANSFIELD", "loc" : [ -71.217775, 42.021238 ], "pop" : 16676, "state" : "MA" } +{ "_id" : "02050", "city" : "MARSHFIELD", "loc" : [ -70.69931, 42.106177 ], "pop" : 21782, "state" : "MA" } +{ "_id" : "02052", "city" : "MEDFIELD", "loc" : [ -71.304813, 42.184525 ], "pop" : 10531, "state" : "MA" } +{ "_id" : "02053", "city" : "MEDWAY", "loc" : [ -71.42171500000001, 42.151363 ], "pop" : 9902, "state" : "MA" } +{ "_id" : "02054", "city" : "MILLIS", "loc" : [ -71.360693, 42.166938 ], "pop" : 7613, "state" : "MA" } +{ "_id" : "02056", "city" : "NORFOLK", "loc" : [ -71.32693399999999, 42.117746 ], "pop" : 9259, "state" : "MA" } +{ "_id" : "02061", "city" : "NORWELL", "loc" : [ -70.82172, 42.159574 ], "pop" : 9279, "state" : "MA" } +{ "_id" : "02062", "city" : "NORWOOD", "loc" : [ -71.20331299999999, 42.186843 ], "pop" : 28700, "state" : "MA" } +{ "_id" : "02066", "city" : "SCITUATE", "loc" : [ -70.752476, 42.203235 ], "pop" : 16535, "state" : "MA" } +{ "_id" : "02067", "city" : "SHARON", "loc" : [ -71.175872, 42.109388 ], "pop" : 15873, "state" : "MA" } +{ "_id" : "02071", "city" : "SOUTH WALPOLE", "loc" : [ -71.275235, 42.099203 ], "pop" : 752, "state" : "MA" } +{ "_id" : "02072", "city" : "STOUGHTON", "loc" : [ -71.10735699999999, 42.125279 ], "pop" : 26777, "state" : "MA" } +{ "_id" : "02081", "city" : "WALPOLE", "loc" : [ -71.254391, 42.144413 ], "pop" : 15615, "state" : "MA" } +{ "_id" : "02090", "city" : "WESTWOOD", "loc" : [ -71.210426, 42.214824 ], "pop" : 12557, "state" : "MA" } +{ "_id" : "02093", "city" : "WRENTHAM", "loc" : [ -71.339568, 42.061746 ], "pop" : 9006, "state" : "MA" } +{ "_id" : "02108", "city" : "BOSTON", "loc" : [ -71.068432, 42.357603 ], "pop" : 3697, "state" : "MA" } +{ "_id" : "02109", "city" : "BOSTON", "loc" : [ -71.053386, 42.362963 ], "pop" : 3926, "state" : "MA" } +{ "_id" : "02110", "city" : "BOSTON", "loc" : [ -71.051417, 42.357636 ], "pop" : 957, "state" : "MA" } +{ "_id" : "02111", "city" : "BOSTON", "loc" : [ -71.0629, 42.350348 ], "pop" : 3759, "state" : "MA" } +{ "_id" : "02113", "city" : "BOSTON", "loc" : [ -71.055958, 42.365656 ], "pop" : 6698, "state" : "MA" } +{ "_id" : "02114", "city" : "BOSTON", "loc" : [ -71.06823, 42.361111 ], "pop" : 10246, "state" : "MA" } +{ "_id" : "02115", "city" : "BOSTON", "loc" : [ -71.092215, 42.342706 ], "pop" : 25597, "state" : "MA" } +{ "_id" : "02116", "city" : "BOSTON", "loc" : [ -71.076798, 42.349201 ], "pop" : 17459, "state" : "MA" } +{ "_id" : "02118", "city" : "ROXBURY", "loc" : [ -71.075627, 42.340154 ], "pop" : 21914, "state" : "MA" } +{ "_id" : "02119", "city" : "ROXBURY", "loc" : [ -71.086923, 42.322414 ], "pop" : 25207, "state" : "MA" } +{ "_id" : "02120", "city" : "ROXBURY", "loc" : [ -71.097978, 42.332844 ], "pop" : 14212, "state" : "MA" } +{ "_id" : "02121", "city" : "DORCHESTER", "loc" : [ -71.08305, 42.307503 ], "pop" : 25602, "state" : "MA" } +{ "_id" : "02122", "city" : "DORCHESTER", "loc" : [ -71.05830400000001, 42.297278 ], "pop" : 21266, "state" : "MA" } +{ "_id" : "02124", "city" : "DORCHESTER", "loc" : [ -71.072898, 42.287984 ], "pop" : 48560, "state" : "MA" } +{ "_id" : "02125", "city" : "DORCHESTER", "loc" : [ -71.061924, 42.315305 ], "pop" : 31393, "state" : "MA" } +{ "_id" : "02126", "city" : "MATTAPAN", "loc" : [ -71.09387099999999, 42.273889 ], "pop" : 27808, "state" : "MA" } +{ "_id" : "02127", "city" : "SOUTH BOSTON", "loc" : [ -71.043792, 42.333454 ], "pop" : 29170, "state" : "MA" } +{ "_id" : "02128", "city" : "EAST BOSTON", "loc" : [ -71.028682, 42.378137 ], "pop" : 32941, "state" : "MA" } +{ "_id" : "02129", "city" : "CHARLESTOWN", "loc" : [ -71.062715, 42.377815 ], "pop" : 14775, "state" : "MA" } +{ "_id" : "02130", "city" : "JAMAICA PLAIN", "loc" : [ -71.11149500000001, 42.312596 ], "pop" : 36571, "state" : "MA" } +{ "_id" : "02131", "city" : "ROSLINDALE", "loc" : [ -71.129543, 42.283615 ], "pop" : 32677, "state" : "MA" } +{ "_id" : "02132", "city" : "WEST ROXBURY", "loc" : [ -71.158868, 42.27868 ], "pop" : 26366, "state" : "MA" } +{ "_id" : "02134", "city" : "ALLSTON", "loc" : [ -71.13286600000001, 42.353519 ], "pop" : 23775, "state" : "MA" } +{ "_id" : "02135", "city" : "BRIGHTON", "loc" : [ -71.156599, 42.34779 ], "pop" : 35011, "state" : "MA" } +{ "_id" : "02136", "city" : "HYDE PARK", "loc" : [ -71.126052, 42.253989 ], "pop" : 24260, "state" : "MA" } +{ "_id" : "02138", "city" : "CAMBRIDGE", "loc" : [ -71.12561100000001, 42.377045 ], "pop" : 33841, "state" : "MA" } +{ "_id" : "02139", "city" : "CAMBRIDGE", "loc" : [ -71.10415500000001, 42.364688 ], "pop" : 33149, "state" : "MA" } +{ "_id" : "02140", "city" : "NORTH CAMBRIDGE", "loc" : [ -71.129379, 42.391366 ], "pop" : 16313, "state" : "MA" } +{ "_id" : "02141", "city" : "EAST CAMBRIDGE", "loc" : [ -71.08827700000001, 42.370701 ], "pop" : 10392, "state" : "MA" } +{ "_id" : "02142", "city" : "CAMBRIDGE", "loc" : [ -71.083011, 42.362025 ], "pop" : 1336, "state" : "MA" } +{ "_id" : "02143", "city" : "SOMERVILLE", "loc" : [ -71.102814, 42.382945 ], "pop" : 25597, "state" : "MA" } +{ "_id" : "02144", "city" : "SOMERVILLE", "loc" : [ -71.12205899999999, 42.40032 ], "pop" : 26374, "state" : "MA" } +{ "_id" : "02145", "city" : "SOMERVILLE", "loc" : [ -71.092944, 42.390678 ], "pop" : 24422, "state" : "MA" } +{ "_id" : "02146", "city" : "BROOKLINE", "loc" : [ -71.128917, 42.339158 ], "pop" : 56614, "state" : "MA" } +{ "_id" : "02148", "city" : "MALDEN", "loc" : [ -71.060507, 42.42911 ], "pop" : 54114, "state" : "MA" } +{ "_id" : "02149", "city" : "EVERETT", "loc" : [ -71.05144799999999, 42.411199 ], "pop" : 35493, "state" : "MA" } +{ "_id" : "02150", "city" : "CHELSEA", "loc" : [ -71.032521, 42.396252 ], "pop" : 28790, "state" : "MA" } +{ "_id" : "02151", "city" : "REVERE", "loc" : [ -71.00516500000001, 42.413767 ], "pop" : 42766, "state" : "MA" } +{ "_id" : "02152", "city" : "WINTHROP", "loc" : [ -70.98004299999999, 42.376294 ], "pop" : 18907, "state" : "MA" } +{ "_id" : "02154", "city" : "NORTH WALTHAM", "loc" : [ -71.236497, 42.382492 ], "pop" : 57871, "state" : "MA" } +{ "_id" : "02155", "city" : "MEDFORD", "loc" : [ -71.10868600000001, 42.417335 ], "pop" : 57338, "state" : "MA" } +{ "_id" : "02158", "city" : "NEWTONVILLE", "loc" : [ -71.1902, 42.353835 ], "pop" : 13271, "state" : "MA" } +{ "_id" : "02159", "city" : "NEWTON CENTER", "loc" : [ -71.191839, 42.318889 ], "pop" : 18726, "state" : "MA" } +{ "_id" : "02160", "city" : "NEWTONVILLE", "loc" : [ -71.208771, 42.351961 ], "pop" : 8872, "state" : "MA" } +{ "_id" : "02161", "city" : "NEWTON HIGHLANDS", "loc" : [ -71.20934699999999, 42.318512 ], "pop" : 6657, "state" : "MA" } +{ "_id" : "02162", "city" : "NEWTONVILLE", "loc" : [ -71.258025, 42.330296 ], "pop" : 1427, "state" : "MA" } +{ "_id" : "02163", "city" : "CAMBRIDGE", "loc" : [ -71.141879, 42.364005 ], "pop" : 0, "state" : "MA" } +{ "_id" : "02164", "city" : "NEWTON UPPER FAL", "loc" : [ -71.221615, 42.312562 ], "pop" : 2597, "state" : "MA" } +{ "_id" : "02165", "city" : "NEWTONVILLE", "loc" : [ -71.22795000000001, 42.352366 ], "pop" : 12027, "state" : "MA" } +{ "_id" : "02166", "city" : "AUBURNDALE", "loc" : [ -71.247598, 42.345928 ], "pop" : 6123, "state" : "MA" } +{ "_id" : "02167", "city" : "BOSTON COLLEGE", "loc" : [ -71.16271999999999, 42.31903 ], "pop" : 15619, "state" : "MA" } +{ "_id" : "02168", "city" : "WABAN", "loc" : [ -71.23070300000001, 42.327049 ], "pop" : 5759, "state" : "MA" } +{ "_id" : "02169", "city" : "QUINCY", "loc" : [ -70.997816, 42.249133 ], "pop" : 48920, "state" : "MA" } +{ "_id" : "02170", "city" : "QUINCY", "loc" : [ -71.01864399999999, 42.26713 ], "pop" : 18330, "state" : "MA" } +{ "_id" : "02171", "city" : "QUINCY", "loc" : [ -71.024141, 42.282519 ], "pop" : 18251, "state" : "MA" } +{ "_id" : "02172", "city" : "EAST WATERTOWN", "loc" : [ -71.180266, 42.371497 ], "pop" : 33930, "state" : "MA" } +{ "_id" : "02173", "city" : "LEXINGTON", "loc" : [ -71.225916, 42.445384 ], "pop" : 28994, "state" : "MA" } +{ "_id" : "02174", "city" : "ARLINGTON", "loc" : [ -71.16251699999999, 42.417098 ], "pop" : 44539, "state" : "MA" } +{ "_id" : "02176", "city" : "MELROSE", "loc" : [ -71.063191, 42.458066 ], "pop" : 28228, "state" : "MA" } +{ "_id" : "02178", "city" : "BELMONT", "loc" : [ -71.17464699999999, 42.389656 ], "pop" : 24733, "state" : "MA" } +{ "_id" : "02180", "city" : "STONEHAM", "loc" : [ -71.09780000000001, 42.482778 ], "pop" : 22147, "state" : "MA" } +{ "_id" : "02181", "city" : "WELLESLEY", "loc" : [ -71.287966, 42.305593 ], "pop" : 26615, "state" : "MA" } +{ "_id" : "02184", "city" : "BRAINTREE", "loc" : [ -70.99630399999999, 42.209284 ], "pop" : 33836, "state" : "MA" } +{ "_id" : "02186", "city" : "MILTON", "loc" : [ -71.077051, 42.253663 ], "pop" : 25558, "state" : "MA" } +{ "_id" : "02188", "city" : "WEYMOUTH", "loc" : [ -70.958248, 42.211327 ], "pop" : 13187, "state" : "MA" } +{ "_id" : "02189", "city" : "WEYMOUTH", "loc" : [ -70.93167099999999, 42.211606 ], "pop" : 14055, "state" : "MA" } +{ "_id" : "02190", "city" : "WEYMOUTH", "loc" : [ -70.94869, 42.172817 ], "pop" : 17668, "state" : "MA" } +{ "_id" : "02191", "city" : "WEYMOUTH", "loc" : [ -70.944318, 42.243564 ], "pop" : 9153, "state" : "MA" } +{ "_id" : "02192", "city" : "NEEDHAM", "loc" : [ -71.23517200000001, 42.278908 ], "pop" : 19570, "state" : "MA" } +{ "_id" : "02193", "city" : "WESTON", "loc" : [ -71.300291, 42.359422 ], "pop" : 10221, "state" : "MA" } +{ "_id" : "02194", "city" : "NEEDHAM", "loc" : [ -71.234363, 42.297702 ], "pop" : 8006, "state" : "MA" } +{ "_id" : "02199", "city" : "BOSTON", "loc" : [ -71.082543, 42.347873 ], "pop" : 886, "state" : "MA" } +{ "_id" : "02210", "city" : "BOSTON", "loc" : [ -71.046511, 42.348921 ], "pop" : 308, "state" : "MA" } +{ "_id" : "02215", "city" : "BOSTON", "loc" : [ -71.102689, 42.347088 ], "pop" : 17769, "state" : "MA" } +{ "_id" : "02322", "city" : "AVON", "loc" : [ -71.043738, 42.125825 ], "pop" : 4594, "state" : "MA" } +{ "_id" : "02324", "city" : "BRIDGEWATER", "loc" : [ -70.97234, 41.977341 ], "pop" : 21198, "state" : "MA" } +{ "_id" : "02330", "city" : "CARVER", "loc" : [ -70.767754, 41.888265 ], "pop" : 10573, "state" : "MA" } +{ "_id" : "02332", "city" : "DUXBURY", "loc" : [ -70.716257, 42.039936 ], "pop" : 13913, "state" : "MA" } +{ "_id" : "02333", "city" : "EAST BRIDGEWATER", "loc" : [ -70.944964, 42.031478 ], "pop" : 11104, "state" : "MA" } +{ "_id" : "02338", "city" : "HALIFAX", "loc" : [ -70.84479399999999, 42.000159 ], "pop" : 6526, "state" : "MA" } +{ "_id" : "02339", "city" : "HANOVER", "loc" : [ -70.857006, 42.121406 ], "pop" : 11912, "state" : "MA" } +{ "_id" : "02341", "city" : "HANSON", "loc" : [ -70.865053, 42.061627 ], "pop" : 9037, "state" : "MA" } +{ "_id" : "02343", "city" : "HOLBROOK", "loc" : [ -71.008273, 42.14641 ], "pop" : 11041, "state" : "MA" } +{ "_id" : "02346", "city" : "MIDDLEBORO", "loc" : [ -70.892965, 41.888396 ], "pop" : 17867, "state" : "MA" } +{ "_id" : "02347", "city" : "LAKEVILLE", "loc" : [ -70.958195, 41.837377 ], "pop" : 7785, "state" : "MA" } +{ "_id" : "02351", "city" : "ABINGTON", "loc" : [ -70.95429300000001, 42.116715 ], "pop" : 13849, "state" : "MA" } +{ "_id" : "02356", "city" : "NORTH EASTON", "loc" : [ -71.112337, 42.058956 ], "pop" : 10397, "state" : "MA" } +{ "_id" : "02359", "city" : "PEMBROKE", "loc" : [ -70.80440400000001, 42.062072 ], "pop" : 14535, "state" : "MA" } +{ "_id" : "02360", "city" : "PLYMOUTH", "loc" : [ -70.642004, 41.910404 ], "pop" : 45629, "state" : "MA" } +{ "_id" : "02364", "city" : "KINGSTON", "loc" : [ -70.740993, 41.995022 ], "pop" : 9045, "state" : "MA" } +{ "_id" : "02367", "city" : "PLYMPTON", "loc" : [ -70.804582, 41.96549 ], "pop" : 2384, "state" : "MA" } +{ "_id" : "02368", "city" : "RANDOLPH", "loc" : [ -71.05139200000001, 42.173587 ], "pop" : 30057, "state" : "MA" } +{ "_id" : "02370", "city" : "ROCKLAND", "loc" : [ -70.913263, 42.129286 ], "pop" : 16123, "state" : "MA" } +{ "_id" : "02375", "city" : "SOUTH EASTON", "loc" : [ -71.098814, 42.025704 ], "pop" : 9247, "state" : "MA" } +{ "_id" : "02379", "city" : "WEST BRIDGEWATER", "loc" : [ -71.016054, 42.025511 ], "pop" : 6440, "state" : "MA" } +{ "_id" : "02382", "city" : "WHITMAN", "loc" : [ -70.93812699999999, 42.081603 ], "pop" : 13208, "state" : "MA" } +{ "_id" : "02401", "city" : "BROCKTON", "loc" : [ -71.03434799999999, 42.081571 ], "pop" : 59498, "state" : "MA" } +{ "_id" : "02402", "city" : "BROCKTON", "loc" : [ -71.001947, 42.088396 ], "pop" : 33290, "state" : "MA" } +{ "_id" : "02532", "city" : "ONSET", "loc" : [ -70.59316800000001, 41.752918 ], "pop" : 12047, "state" : "MA" } +{ "_id" : "02535", "city" : "CHILMARK", "loc" : [ -70.741613, 41.357523 ], "pop" : 952, "state" : "MA" } +{ "_id" : "02536", "city" : "TEATICKET", "loc" : [ -70.565174, 41.58504 ], "pop" : 15976, "state" : "MA" } +{ "_id" : "02537", "city" : "EAST SANDWICH", "loc" : [ -70.46822, 41.684603 ], "pop" : 7254, "state" : "MA" } +{ "_id" : "02538", "city" : "EAST WAREHAM", "loc" : [ -70.653237, 41.768247 ], "pop" : 4778, "state" : "MA" } +{ "_id" : "02539", "city" : "EDGARTOWN", "loc" : [ -70.53389300000001, 41.388856 ], "pop" : 3062, "state" : "MA" } +{ "_id" : "02540", "city" : "FALMOUTH", "loc" : [ -70.621663, 41.564754 ], "pop" : 8588, "state" : "MA" } +{ "_id" : "02542", "city" : "OTIS A F B", "loc" : [ -70.57383, 41.660927 ], "pop" : 2078, "state" : "MA" } +{ "_id" : "02543", "city" : "WOODS HOLE", "loc" : [ -70.66431, 41.526272 ], "pop" : 833, "state" : "MA" } +{ "_id" : "02554", "city" : "NANTUCKET", "loc" : [ -70.093216, 41.272529 ], "pop" : 6012, "state" : "MA" } +{ "_id" : "02556", "city" : "NORTH FALMOUTH", "loc" : [ -70.623043, 41.641677 ], "pop" : 2651, "state" : "MA" } +{ "_id" : "02559", "city" : "POCASSET", "loc" : [ -70.610512, 41.688115 ], "pop" : 3907, "state" : "MA" } +{ "_id" : "02563", "city" : "SANDWICH", "loc" : [ -70.469325, 41.698304 ], "pop" : 9007, "state" : "MA" } +{ "_id" : "02568", "city" : "VINEYARD HAVEN", "loc" : [ -70.593737, 41.449955 ], "pop" : 5924, "state" : "MA" } +{ "_id" : "02571", "city" : "WAREHAM", "loc" : [ -70.71159400000001, 41.754084 ], "pop" : 9304, "state" : "MA" } +{ "_id" : "02575", "city" : "WEST TISBURY", "loc" : [ -70.65580199999999, 41.413717 ], "pop" : 1603, "state" : "MA" } +{ "_id" : "02576", "city" : "WEST WAREHAM", "loc" : [ -70.764179, 41.779617 ], "pop" : 3919, "state" : "MA" } +{ "_id" : "02601", "city" : "WEST YARMOUTH", "loc" : [ -70.298176, 41.653682 ], "pop" : 14543, "state" : "MA" } +{ "_id" : "02630", "city" : "BARNSTABLE", "loc" : [ -70.300067, 41.698289 ], "pop" : 1776, "state" : "MA" } +{ "_id" : "02631", "city" : "BREWSTER", "loc" : [ -70.069868, 41.749179 ], "pop" : 8535, "state" : "MA" } +{ "_id" : "02632", "city" : "CENTERVILLE", "loc" : [ -70.353196, 41.660585 ], "pop" : 10636, "state" : "MA" } +{ "_id" : "02633", "city" : "SOUTH CHATHAM", "loc" : [ -69.98075799999999, 41.687634 ], "pop" : 4744, "state" : "MA" } +{ "_id" : "02635", "city" : "COTUIT", "loc" : [ -70.433431, 41.696025 ], "pop" : 3266, "state" : "MA" } +{ "_id" : "02638", "city" : "DENNIS", "loc" : [ -70.19105399999999, 41.732166 ], "pop" : 3216, "state" : "MA" } +{ "_id" : "02639", "city" : "DENNIS PORT", "loc" : [ -70.132711, 41.664873 ], "pop" : 2510, "state" : "MA" } +{ "_id" : "02642", "city" : "EASTHAM", "loc" : [ -69.984865, 41.840781 ], "pop" : 4582, "state" : "MA" } +{ "_id" : "02644", "city" : "FORESTDALE", "loc" : [ -70.51431700000001, 41.682695 ], "pop" : 2712, "state" : "MA" } +{ "_id" : "02645", "city" : "HARWICH", "loc" : [ -70.057929, 41.70082 ], "pop" : 7363, "state" : "MA" } +{ "_id" : "02646", "city" : "HARWICH PORT", "loc" : [ -70.07675500000001, 41.67128 ], "pop" : 1843, "state" : "MA" } +{ "_id" : "02648", "city" : "MARSTONS MILLS", "loc" : [ -70.416321, 41.670274 ], "pop" : 5777, "state" : "MA" } +{ "_id" : "02649", "city" : "MASHPEE", "loc" : [ -70.485361, 41.618116 ], "pop" : 4469, "state" : "MA" } +{ "_id" : "02650", "city" : "NORTH CHATHAM", "loc" : [ -69.966607, 41.70298 ], "pop" : 995, "state" : "MA" } +{ "_id" : "02652", "city" : "NORTH TRURO", "loc" : [ -70.08750999999999, 42.033779 ], "pop" : 834, "state" : "MA" } +{ "_id" : "02653", "city" : "ORLEANS", "loc" : [ -69.982198, 41.779161 ], "pop" : 5860, "state" : "MA" } +{ "_id" : "02655", "city" : "OSTERVILLE", "loc" : [ -70.383726, 41.63005 ], "pop" : 2330, "state" : "MA" } +{ "_id" : "02657", "city" : "PROVINCETOWN", "loc" : [ -70.186504, 42.053364 ], "pop" : 3561, "state" : "MA" } +{ "_id" : "02659", "city" : "SOUTH CHATHAM", "loc" : [ -70.024106, 41.680126 ], "pop" : 840, "state" : "MA" } +{ "_id" : "02660", "city" : "SOUTH DENNIS", "loc" : [ -70.15851000000001, 41.709711 ], "pop" : 6680, "state" : "MA" } +{ "_id" : "02664", "city" : "BASS RIVER", "loc" : [ -70.19731, 41.672805 ], "pop" : 8514, "state" : "MA" } +{ "_id" : "02666", "city" : "TRURO", "loc" : [ -70.05636199999999, 41.998792 ], "pop" : 739, "state" : "MA" } +{ "_id" : "02667", "city" : "WELLFLEET", "loc" : [ -70.018587, 41.928934 ], "pop" : 2373, "state" : "MA" } +{ "_id" : "02668", "city" : "WEST BARNSTABLE", "loc" : [ -70.371985, 41.700212 ], "pop" : 2311, "state" : "MA" } +{ "_id" : "02670", "city" : "WEST DENNIS", "loc" : [ -70.168092, 41.662557 ], "pop" : 1347, "state" : "MA" } +{ "_id" : "02671", "city" : "WEST HARWICH", "loc" : [ -70.113501, 41.669367 ], "pop" : 1061, "state" : "MA" } +{ "_id" : "02673", "city" : "WEST YARMOUTH", "loc" : [ -70.23629699999999, 41.661367 ], "pop" : 6972, "state" : "MA" } +{ "_id" : "02675", "city" : "YARMOUTH PORT", "loc" : [ -70.227014, 41.705149 ], "pop" : 5735, "state" : "MA" } +{ "_id" : "02702", "city" : "ASSONET", "loc" : [ -71.06073600000001, 41.797458 ], "pop" : 3614, "state" : "MA" } +{ "_id" : "02703", "city" : "ATTLEBORO", "loc" : [ -71.30092, 41.929599 ], "pop" : 38528, "state" : "MA" } +{ "_id" : "02713", "city" : "CUTTYHUNK", "loc" : [ -70.87854, 41.443601 ], "pop" : 98, "state" : "MA" } +{ "_id" : "02715", "city" : "DIGHTON", "loc" : [ -71.142723, 41.812505 ], "pop" : 1828, "state" : "MA" } +{ "_id" : "02717", "city" : "EAST FREETOWN", "loc" : [ -70.967709, 41.763455 ], "pop" : 4883, "state" : "MA" } +{ "_id" : "02718", "city" : "EAST TAUNTON", "loc" : [ -71.01922500000001, 41.873585 ], "pop" : 4800, "state" : "MA" } +{ "_id" : "02719", "city" : "FAIRHAVEN", "loc" : [ -70.889608, 41.640924 ], "pop" : 16141, "state" : "MA" } +{ "_id" : "02720", "city" : "FALL RIVER", "loc" : [ -71.13999099999999, 41.718221 ], "pop" : 30600, "state" : "MA" } +{ "_id" : "02721", "city" : "FALL RIVER", "loc" : [ -71.15742400000001, 41.688305 ], "pop" : 26884, "state" : "MA" } +{ "_id" : "02723", "city" : "FALL RIVER", "loc" : [ -71.133214, 41.692612 ], "pop" : 16801, "state" : "MA" } +{ "_id" : "02724", "city" : "FALL RIVER", "loc" : [ -71.17482200000001, 41.684975 ], "pop" : 18141, "state" : "MA" } +{ "_id" : "02725", "city" : "SOMERSET", "loc" : [ -71.177971, 41.722299 ], "pop" : 2528, "state" : "MA" } +{ "_id" : "02726", "city" : "SOMERSET", "loc" : [ -71.14920600000001, 41.756012 ], "pop" : 15117, "state" : "MA" } +{ "_id" : "02738", "city" : "MARION", "loc" : [ -70.761261, 41.709526 ], "pop" : 4496, "state" : "MA" } +{ "_id" : "02739", "city" : "MATTAPOISETT", "loc" : [ -70.816357, 41.661845 ], "pop" : 5850, "state" : "MA" } +{ "_id" : "02740", "city" : "NEW BEDFORD", "loc" : [ -70.9372, 41.634749 ], "pop" : 46426, "state" : "MA" } +{ "_id" : "02743", "city" : "ACUSHNET", "loc" : [ -70.908652, 41.6997 ], "pop" : 9601, "state" : "MA" } +{ "_id" : "02744", "city" : "NEW BEDFORD", "loc" : [ -70.916746, 41.612716 ], "pop" : 13424, "state" : "MA" } +{ "_id" : "02745", "city" : "NEW BEDFORD", "loc" : [ -70.935545, 41.691337 ], "pop" : 23661, "state" : "MA" } +{ "_id" : "02746", "city" : "NEW BEDFORD", "loc" : [ -70.93243, 41.659972 ], "pop" : 16236, "state" : "MA" } +{ "_id" : "02747", "city" : "NORTH DARTMOUTH", "loc" : [ -70.995769, 41.633789 ], "pop" : 16383, "state" : "MA" } +{ "_id" : "02748", "city" : "PADANARAM VILLAG", "loc" : [ -70.956521, 41.591728 ], "pop" : 10980, "state" : "MA" } +{ "_id" : "02760", "city" : "NORTH ATTLEBORO", "loc" : [ -71.329757, 41.977542 ], "pop" : 22289, "state" : "MA" } +{ "_id" : "02762", "city" : "PLAINVILLE", "loc" : [ -71.327454, 42.012403 ], "pop" : 6874, "state" : "MA" } +{ "_id" : "02763", "city" : "NORTH ATTLEBORO", "loc" : [ -71.31035300000001, 41.970979 ], "pop" : 2737, "state" : "MA" } +{ "_id" : "02764", "city" : "NORTH DIGHTON", "loc" : [ -71.148523, 41.852874 ], "pop" : 3779, "state" : "MA" } +{ "_id" : "02766", "city" : "NORTON", "loc" : [ -71.189441, 41.971801 ], "pop" : 14329, "state" : "MA" } +{ "_id" : "02767", "city" : "RAYNHAM", "loc" : [ -71.04685600000001, 41.932361 ], "pop" : 9804, "state" : "MA" } +{ "_id" : "02769", "city" : "REHOBOTH", "loc" : [ -71.254453, 41.85152 ], "pop" : 7762, "state" : "MA" } +{ "_id" : "02770", "city" : "ROCHESTER", "loc" : [ -70.85225699999999, 41.759082 ], "pop" : 3270, "state" : "MA" } +{ "_id" : "02771", "city" : "SEEKONK", "loc" : [ -71.322406, 41.837835 ], "pop" : 13375, "state" : "MA" } +{ "_id" : "02777", "city" : "SWANSEA", "loc" : [ -71.21216699999999, 41.74734 ], "pop" : 15865, "state" : "MA" } +{ "_id" : "02779", "city" : "BERKLEY", "loc" : [ -71.076534, 41.835325 ], "pop" : 4438, "state" : "MA" } +{ "_id" : "02780", "city" : "TAUNTON", "loc" : [ -71.10261, 41.905007 ], "pop" : 44894, "state" : "MA" } +{ "_id" : "02790", "city" : "WESTPORT", "loc" : [ -71.08900300000001, 41.621127 ], "pop" : 14154, "state" : "MA" } +{ "_id" : "02804", "city" : "ASHAWAY", "loc" : [ -71.783745, 41.423054 ], "pop" : 2472, "state" : "RI" } +{ "_id" : "02806", "city" : "BARRINGTON", "loc" : [ -71.317497, 41.744334 ], "pop" : 15849, "state" : "RI" } +{ "_id" : "02807", "city" : "BLOCK ISLAND", "loc" : [ -71.574825, 41.171546 ], "pop" : 836, "state" : "RI" } +{ "_id" : "02808", "city" : "BRADFORD", "loc" : [ -71.746453, 41.411448 ], "pop" : 2184, "state" : "RI" } +{ "_id" : "02809", "city" : "BRISTOL", "loc" : [ -71.26755799999999, 41.68247 ], "pop" : 21625, "state" : "RI" } +{ "_id" : "02812", "city" : "RICHMOND", "loc" : [ -71.650279, 41.46941 ], "pop" : 1011, "state" : "RI" } +{ "_id" : "02813", "city" : "CHARLESTOWN", "loc" : [ -71.661455, 41.400749 ], "pop" : 6663, "state" : "RI" } +{ "_id" : "02814", "city" : "CHEPACHET", "loc" : [ -71.679483, 41.91549 ], "pop" : 8191, "state" : "RI" } +{ "_id" : "02815", "city" : "CLAYVILLE", "loc" : [ -71.67058900000001, 41.777762 ], "pop" : 45, "state" : "RI" } +{ "_id" : "02816", "city" : "COVENTRY", "loc" : [ -71.57679400000001, 41.69143 ], "pop" : 29842, "state" : "RI" } +{ "_id" : "02817", "city" : "WEST GREENWICH", "loc" : [ -71.64354899999999, 41.639977 ], "pop" : 3246, "state" : "RI" } +{ "_id" : "02818", "city" : "EAST GREENWICH", "loc" : [ -71.474009, 41.649777 ], "pop" : 16180, "state" : "RI" } +{ "_id" : "02822", "city" : "EXETER", "loc" : [ -71.607626, 41.574031 ], "pop" : 3774, "state" : "RI" } +{ "_id" : "02825", "city" : "FOSTER", "loc" : [ -71.71874800000001, 41.781455 ], "pop" : 5175, "state" : "RI" } +{ "_id" : "02827", "city" : "GREENE", "loc" : [ -71.735607, 41.706151 ], "pop" : 1241, "state" : "RI" } +{ "_id" : "02828", "city" : "GREENVILLE", "loc" : [ -71.556923, 41.873409 ], "pop" : 6945, "state" : "RI" } +{ "_id" : "02830", "city" : "HARRISVILLE", "loc" : [ -71.65340500000001, 41.976379 ], "pop" : 6384, "state" : "RI" } +{ "_id" : "02831", "city" : "HOPE", "loc" : [ -71.56122499999999, 41.751603 ], "pop" : 3653, "state" : "RI" } +{ "_id" : "02832", "city" : "RICHMOND", "loc" : [ -71.73486200000001, 41.506974 ], "pop" : 3466, "state" : "RI" } +{ "_id" : "02835", "city" : "JAMESTOWN", "loc" : [ -71.376108, 41.516405 ], "pop" : 4999, "state" : "RI" } +{ "_id" : "02836", "city" : "RICHMOND", "loc" : [ -71.683992, 41.477694 ], "pop" : 183, "state" : "RI" } +{ "_id" : "02837", "city" : "LITTLE COMPTON", "loc" : [ -71.161215, 41.52204 ], "pop" : 3341, "state" : "RI" } +{ "_id" : "02838", "city" : "MANVILLE", "loc" : [ -71.474113, 41.96888 ], "pop" : 3259, "state" : "RI" } +{ "_id" : "02840", "city" : "MIDDLETOWN", "loc" : [ -71.30347999999999, 41.504502 ], "pop" : 47687, "state" : "RI" } +{ "_id" : "02852", "city" : "NORTH KINGSTOWN", "loc" : [ -71.46249400000001, 41.589426 ], "pop" : 22325, "state" : "RI" } +{ "_id" : "02857", "city" : "NORTH SCITUATE", "loc" : [ -71.62418700000001, 41.8439 ], "pop" : 9563, "state" : "RI" } +{ "_id" : "02858", "city" : "OAKLAND", "loc" : [ -71.64292500000001, 41.963637 ], "pop" : 462, "state" : "RI" } +{ "_id" : "02859", "city" : "PASCOAG", "loc" : [ -71.70986600000001, 41.962728 ], "pop" : 7156, "state" : "RI" } +{ "_id" : "02860", "city" : "PAWTUCKET", "loc" : [ -71.39071300000001, 41.872873 ], "pop" : 45442, "state" : "RI" } +{ "_id" : "02861", "city" : "PAWTUCKET", "loc" : [ -71.35600100000001, 41.881384 ], "pop" : 27013, "state" : "RI" } +{ "_id" : "02863", "city" : "CENTRAL FALLS", "loc" : [ -71.394527, 41.888263 ], "pop" : 17380, "state" : "RI" } +{ "_id" : "02864", "city" : "CUMBERLAND", "loc" : [ -71.415419, 41.948352 ], "pop" : 29327, "state" : "RI" } +{ "_id" : "02865", "city" : "LINCOLN", "loc" : [ -71.434777, 41.908906 ], "pop" : 14765, "state" : "RI" } +{ "_id" : "02871", "city" : "PORTSMOUTH", "loc" : [ -71.25201800000001, 41.594397 ], "pop" : 16707, "state" : "RI" } +{ "_id" : "02872", "city" : "PRUDENCE ISLAND", "loc" : [ -71.31182699999999, 41.613606 ], "pop" : 150, "state" : "RI" } +{ "_id" : "02874", "city" : "SAUNDERSTOWN", "loc" : [ -71.44269300000001, 41.510528 ], "pop" : 3196, "state" : "RI" } +{ "_id" : "02876", "city" : "SLATERSVILLE", "loc" : [ -71.5682, 42.001478 ], "pop" : 639, "state" : "RI" } +{ "_id" : "02877", "city" : "SLOCUM", "loc" : [ -71.53716900000001, 41.521237 ], "pop" : 1114, "state" : "RI" } +{ "_id" : "02878", "city" : "TIVERTON", "loc" : [ -71.180823, 41.633839 ], "pop" : 14310, "state" : "RI" } +{ "_id" : "02879", "city" : "NARRAGANSETT", "loc" : [ -71.525138, 41.430195 ], "pop" : 13422, "state" : "RI" } +{ "_id" : "02881", "city" : "KINGSTON", "loc" : [ -71.529239, 41.480295 ], "pop" : 7683, "state" : "RI" } +{ "_id" : "02882", "city" : "NARRAGANSETT", "loc" : [ -71.46164, 41.435313 ], "pop" : 13596, "state" : "RI" } +{ "_id" : "02883", "city" : "PEACE DALE", "loc" : [ -71.500057, 41.45157 ], "pop" : 1652, "state" : "RI" } +{ "_id" : "02885", "city" : "WARREN", "loc" : [ -71.27016500000001, 41.725618 ], "pop" : 11385, "state" : "RI" } +{ "_id" : "02886", "city" : "WARWICK", "loc" : [ -71.447591, 41.702601 ], "pop" : 40845, "state" : "RI" } +{ "_id" : "02888", "city" : "WARWICK", "loc" : [ -71.40836, 41.74936 ], "pop" : 20869, "state" : "RI" } +{ "_id" : "02889", "city" : "WARWICK", "loc" : [ -71.390146, 41.714069 ], "pop" : 20849, "state" : "RI" } +{ "_id" : "02891", "city" : "WESTERLY", "loc" : [ -71.81264299999999, 41.369128 ], "pop" : 20290, "state" : "RI" } +{ "_id" : "02892", "city" : "RICHMOND", "loc" : [ -71.599076, 41.506716 ], "pop" : 3943, "state" : "RI" } +{ "_id" : "02893", "city" : "WEST WARWICK", "loc" : [ -71.518349, 41.700433 ], "pop" : 27821, "state" : "RI" } +{ "_id" : "02894", "city" : "WOOD RIVER JUNCT", "loc" : [ -71.709512, 41.453771 ], "pop" : 684, "state" : "RI" } +{ "_id" : "02895", "city" : "NORTH SMITHFIELD", "loc" : [ -71.513683, 41.99948 ], "pop" : 53733, "state" : "RI" } +{ "_id" : "02898", "city" : "RICHMOND", "loc" : [ -71.68397299999999, 41.523362 ], "pop" : 1508, "state" : "RI" } +{ "_id" : "02903", "city" : "PROVIDENCE", "loc" : [ -71.415801, 41.820002 ], "pop" : 9093, "state" : "RI" } +{ "_id" : "02904", "city" : "CENTREDALE", "loc" : [ -71.438102, 41.860461 ], "pop" : 28119, "state" : "RI" } +{ "_id" : "02905", "city" : "CRANSTON", "loc" : [ -71.40314600000001, 41.786568 ], "pop" : 24885, "state" : "RI" } +{ "_id" : "02906", "city" : "PROVIDENCE", "loc" : [ -71.397065, 41.835104 ], "pop" : 31069, "state" : "RI" } +{ "_id" : "02907", "city" : "CRANSTON", "loc" : [ -71.42403899999999, 41.800842 ], "pop" : 25668, "state" : "RI" } +{ "_id" : "02908", "city" : "PROVIDENCE", "loc" : [ -71.437684, 41.838294 ], "pop" : 35933, "state" : "RI" } +{ "_id" : "02909", "city" : "CRANSTON", "loc" : [ -71.448165, 41.816777 ], "pop" : 34261, "state" : "RI" } +{ "_id" : "02910", "city" : "CRANSTON", "loc" : [ -71.43833100000001, 41.776572 ], "pop" : 21128, "state" : "RI" } +{ "_id" : "02911", "city" : "CENTREDALE", "loc" : [ -71.474058, 41.853412 ], "pop" : 13858, "state" : "RI" } +{ "_id" : "02914", "city" : "EAST PROVIDENCE", "loc" : [ -71.368785, 41.813777 ], "pop" : 22965, "state" : "RI" } +{ "_id" : "02915", "city" : "RIVERSIDE", "loc" : [ -71.35424399999999, 41.772313 ], "pop" : 18934, "state" : "RI" } +{ "_id" : "02916", "city" : "RUMFORD", "loc" : [ -71.35593799999999, 41.842472 ], "pop" : 8550, "state" : "RI" } +{ "_id" : "02917", "city" : "SMITHFIELD", "loc" : [ -71.52066600000001, 41.896382 ], "pop" : 12213, "state" : "RI" } +{ "_id" : "02919", "city" : "CRANSTON", "loc" : [ -71.497646, 41.826431 ], "pop" : 26575, "state" : "RI" } +{ "_id" : "02920", "city" : "CRANSTON", "loc" : [ -71.465889, 41.77157 ], "pop" : 37385, "state" : "RI" } +{ "_id" : "02921", "city" : "CRANSTON", "loc" : [ -71.506102, 41.761357 ], "pop" : 6502, "state" : "RI" } +{ "_id" : "03031", "city" : "AMHERST", "loc" : [ -71.607536, 42.856944 ], "pop" : 8998, "state" : "NH" } +{ "_id" : "03032", "city" : "AUBURN", "loc" : [ -71.344892, 42.992529 ], "pop" : 4085, "state" : "NH" } +{ "_id" : "03033", "city" : "BROOKLINE", "loc" : [ -71.666254, 42.738442 ], "pop" : 2410, "state" : "NH" } +{ "_id" : "03034", "city" : "CANDIA", "loc" : [ -71.304857, 43.058514 ], "pop" : 3557, "state" : "NH" } +{ "_id" : "03036", "city" : "CHESTER", "loc" : [ -71.244962, 42.967756 ], "pop" : 2691, "state" : "NH" } +{ "_id" : "03037", "city" : "DEERFIELD", "loc" : [ -71.25126400000001, 43.137756 ], "pop" : 3124, "state" : "NH" } +{ "_id" : "03038", "city" : "DERRY", "loc" : [ -71.30197099999999, 42.887404 ], "pop" : 29556, "state" : "NH" } +{ "_id" : "03042", "city" : "EPPING", "loc" : [ -71.076367, 43.041052 ], "pop" : 6797, "state" : "NH" } +{ "_id" : "03043", "city" : "FRANCESTOWN", "loc" : [ -71.81131000000001, 42.991952 ], "pop" : 1219, "state" : "NH" } +{ "_id" : "03044", "city" : "FREMONT", "loc" : [ -71.121836, 42.984016 ], "pop" : 2677, "state" : "NH" } +{ "_id" : "03045", "city" : "DUNBARTON", "loc" : [ -71.56264, 43.018224 ], "pop" : 9428, "state" : "NH" } +{ "_id" : "03047", "city" : "GREENFIELD", "loc" : [ -71.872755, 42.949277 ], "pop" : 1422, "state" : "NH" } +{ "_id" : "03048", "city" : "MASON", "loc" : [ -71.784487, 42.7489 ], "pop" : 3443, "state" : "NH" } +{ "_id" : "03049", "city" : "HOLLIS", "loc" : [ -71.577206, 42.748513 ], "pop" : 5705, "state" : "NH" } +{ "_id" : "03051", "city" : "HUDSON", "loc" : [ -71.412144, 42.769038 ], "pop" : 26489, "state" : "NH" } +{ "_id" : "03053", "city" : "LONDONDERRY", "loc" : [ -71.37719, 42.865555 ], "pop" : 19687, "state" : "NH" } +{ "_id" : "03054", "city" : "MERRIMACK", "loc" : [ -71.51278000000001, 42.866689 ], "pop" : 21632, "state" : "NH" } +{ "_id" : "03055", "city" : "MILFORD", "loc" : [ -71.660569, 42.828497 ], "pop" : 11795, "state" : "NH" } +{ "_id" : "03057", "city" : "MONT VERNON", "loc" : [ -71.676243, 42.897597 ], "pop" : 1812, "state" : "NH" } +{ "_id" : "03060", "city" : "NASHUA", "loc" : [ -71.466684, 42.756395 ], "pop" : 41438, "state" : "NH" } +{ "_id" : "03062", "city" : "NASHUA", "loc" : [ -71.489282, 42.723472 ], "pop" : 23927, "state" : "NH" } +{ "_id" : "03063", "city" : "NASHUA", "loc" : [ -71.513156, 42.771686 ], "pop" : 14891, "state" : "NH" } +{ "_id" : "03070", "city" : "NEW BOSTON", "loc" : [ -71.686402, 42.97217 ], "pop" : 2701, "state" : "NH" } +{ "_id" : "03071", "city" : "NEW IPSWICH", "loc" : [ -71.870318, 42.751142 ], "pop" : 4014, "state" : "NH" } +{ "_id" : "03076", "city" : "PELHAM", "loc" : [ -71.304551, 42.72881 ], "pop" : 6012, "state" : "NH" } +{ "_id" : "03077", "city" : "RAYMOND", "loc" : [ -71.191159, 43.032512 ], "pop" : 9005, "state" : "NH" } +{ "_id" : "03079", "city" : "SALEM", "loc" : [ -71.21760999999999, 42.78465 ], "pop" : 25746, "state" : "NH" } +{ "_id" : "03082", "city" : "LYNDEBOROUGH", "loc" : [ -71.774373, 42.895449 ], "pop" : 1294, "state" : "NH" } +{ "_id" : "03084", "city" : "TEMPLE", "loc" : [ -71.85234699999999, 42.820035 ], "pop" : 1194, "state" : "NH" } +{ "_id" : "03086", "city" : "WILTON", "loc" : [ -71.75406599999999, 42.836761 ], "pop" : 3122, "state" : "NH" } +{ "_id" : "03087", "city" : "WINDHAM", "loc" : [ -71.306735, 42.805106 ], "pop" : 9000, "state" : "NH" } +{ "_id" : "03101", "city" : "MANCHESTER", "loc" : [ -71.463255, 42.992858 ], "pop" : 2697, "state" : "NH" } +{ "_id" : "03102", "city" : "MANCHESTER", "loc" : [ -71.488433, 42.99442 ], "pop" : 29308, "state" : "NH" } +{ "_id" : "03103", "city" : "MANCHESTER", "loc" : [ -71.449325, 42.965563 ], "pop" : 36613, "state" : "NH" } +{ "_id" : "03104", "city" : "MANCHESTER", "loc" : [ -71.448233, 43.007307 ], "pop" : 29950, "state" : "NH" } +{ "_id" : "03106", "city" : "HOOKSETT", "loc" : [ -71.444446, 43.061708 ], "pop" : 8668, "state" : "NH" } +{ "_id" : "03109", "city" : "MANCHESTER", "loc" : [ -71.41347399999999, 42.971349 ], "pop" : 7884, "state" : "NH" } +{ "_id" : "03110", "city" : "BEDFORD", "loc" : [ -71.52127, 42.940307 ], "pop" : 12468, "state" : "NH" } +{ "_id" : "03216", "city" : "ANDOVER", "loc" : [ -71.78295199999999, 43.428668 ], "pop" : 1638, "state" : "NH" } +{ "_id" : "03217", "city" : "ASHLAND", "loc" : [ -71.61208499999999, 43.703428 ], "pop" : 2056, "state" : "NH" } +{ "_id" : "03218", "city" : "BARNSTEAD", "loc" : [ -71.286946, 43.36513 ], "pop" : 793, "state" : "NH" } +{ "_id" : "03220", "city" : "BELMONT", "loc" : [ -71.488991, 43.451189 ], "pop" : 2997, "state" : "NH" } +{ "_id" : "03221", "city" : "BRADFORD", "loc" : [ -71.98504800000001, 43.294343 ], "pop" : 3273, "state" : "NH" } +{ "_id" : "03222", "city" : "BRISTOL", "loc" : [ -71.750664, 43.611994 ], "pop" : 4288, "state" : "NH" } +{ "_id" : "03223", "city" : "BEEBE RIVER", "loc" : [ -71.63614200000001, 43.888507 ], "pop" : 2802, "state" : "NH" } +{ "_id" : "03224", "city" : "CANTERBURY", "loc" : [ -71.557008, 43.357041 ], "pop" : 2085, "state" : "NH" } +{ "_id" : "03225", "city" : "CENTER BARNSTEAD", "loc" : [ -71.24244, 43.356563 ], "pop" : 2307, "state" : "NH" } +{ "_id" : "03226", "city" : "CENTER HARBOR", "loc" : [ -71.47973, 43.710688 ], "pop" : 470, "state" : "NH" } +{ "_id" : "03227", "city" : "CENTER SANDWICH", "loc" : [ -71.450614, 43.816169 ], "pop" : 615, "state" : "NH" } +{ "_id" : "03229", "city" : "HOPKINTON", "loc" : [ -71.696299, 43.218898 ], "pop" : 6071, "state" : "NH" } +{ "_id" : "03230", "city" : "DANBURY", "loc" : [ -71.869074, 43.5115 ], "pop" : 1098, "state" : "NH" } +{ "_id" : "03231", "city" : "EAST ANDOVER", "loc" : [ -71.75960600000001, 43.47766 ], "pop" : 177, "state" : "NH" } +{ "_id" : "03232", "city" : "EAST HEBRON", "loc" : [ -71.76790699999999, 43.696969 ], "pop" : 47, "state" : "NH" } +{ "_id" : "03234", "city" : "EPSOM", "loc" : [ -71.35457599999999, 43.217398 ], "pop" : 2931, "state" : "NH" } +{ "_id" : "03235", "city" : "FRANKLIN", "loc" : [ -71.64912200000001, 43.442569 ], "pop" : 9780, "state" : "NH" } +{ "_id" : "03237", "city" : "GILMANTON", "loc" : [ -71.412063, 43.417476 ], "pop" : 1308, "state" : "NH" } +{ "_id" : "03240", "city" : "GRAFTON", "loc" : [ -71.96338900000001, 43.572743 ], "pop" : 890, "state" : "NH" } +{ "_id" : "03241", "city" : "HEBRON", "loc" : [ -71.82696, 43.718571 ], "pop" : 657, "state" : "NH" } +{ "_id" : "03242", "city" : "HENNIKER", "loc" : [ -71.815921, 43.179091 ], "pop" : 4151, "state" : "NH" } +{ "_id" : "03243", "city" : "HILL", "loc" : [ -71.729168, 43.527422 ], "pop" : 778, "state" : "NH" } +{ "_id" : "03244", "city" : "HILLSBORO", "loc" : [ -71.902818, 43.120709 ], "pop" : 5246, "state" : "NH" } +{ "_id" : "03246", "city" : "GILFORD", "loc" : [ -71.452907, 43.538713 ], "pop" : 24409, "state" : "NH" } +{ "_id" : "03251", "city" : "LINCOLN", "loc" : [ -71.672707, 44.058159 ], "pop" : 1229, "state" : "NH" } +{ "_id" : "03253", "city" : "MEREDITH", "loc" : [ -71.51132699999999, 43.650208 ], "pop" : 5959, "state" : "NH" } +{ "_id" : "03254", "city" : "MOULTONBOROUGH", "loc" : [ -71.392245, 43.728133 ], "pop" : 3208, "state" : "NH" } +{ "_id" : "03256", "city" : "NEW HAMPTON", "loc" : [ -71.643513, 43.618393 ], "pop" : 1214, "state" : "NH" } +{ "_id" : "03257", "city" : "NEW LONDON", "loc" : [ -71.985674, 43.414501 ], "pop" : 3280, "state" : "NH" } +{ "_id" : "03259", "city" : "NORTH SANDWICH", "loc" : [ -71.385025, 43.845182 ], "pop" : 338, "state" : "NH" } +{ "_id" : "03261", "city" : "NORTHWOOD", "loc" : [ -71.200423, 43.206965 ], "pop" : 3013, "state" : "NH" } +{ "_id" : "03262", "city" : "NORTH WOODSTOCK", "loc" : [ -71.697684, 44.019831 ], "pop" : 1091, "state" : "NH" } +{ "_id" : "03263", "city" : "PITTSFIELD", "loc" : [ -71.33302999999999, 43.287384 ], "pop" : 5806, "state" : "NH" } +{ "_id" : "03264", "city" : "PLYMOUTH", "loc" : [ -71.684714, 43.763524 ], "pop" : 8980, "state" : "NH" } +{ "_id" : "03266", "city" : "RUMNEY", "loc" : [ -71.84801899999999, 43.804389 ], "pop" : 1912, "state" : "NH" } +{ "_id" : "03268", "city" : "SALISBURY", "loc" : [ -71.70446800000001, 43.406652 ], "pop" : 140, "state" : "NH" } +{ "_id" : "03269", "city" : "SANBORNTON", "loc" : [ -71.600348, 43.549552 ], "pop" : 699, "state" : "NH" } +{ "_id" : "03275", "city" : "ALLENSTOWN", "loc" : [ -71.439663, 43.147554 ], "pop" : 11565, "state" : "NH" } +{ "_id" : "03276", "city" : "TILTON", "loc" : [ -71.57741300000001, 43.46033 ], "pop" : 7356, "state" : "NH" } +{ "_id" : "03278", "city" : "WARNER", "loc" : [ -71.83534899999999, 43.303512 ], "pop" : 3265, "state" : "NH" } +{ "_id" : "03279", "city" : "WARREN", "loc" : [ -71.89013, 43.944667 ], "pop" : 886, "state" : "NH" } +{ "_id" : "03280", "city" : "WASHINGTON", "loc" : [ -72.082407, 43.174705 ], "pop" : 628, "state" : "NH" } +{ "_id" : "03281", "city" : "WEARE", "loc" : [ -71.70376, 43.071422 ], "pop" : 7481, "state" : "NH" } +{ "_id" : "03282", "city" : "WENTWORTH", "loc" : [ -71.909651, 43.868456 ], "pop" : 556, "state" : "NH" } +{ "_id" : "03284", "city" : "WEST SPRINGFIELD", "loc" : [ -72.057855, 43.491615 ], "pop" : 788, "state" : "NH" } +{ "_id" : "03287", "city" : "WILMOT FLAT", "loc" : [ -71.900983, 43.432177 ], "pop" : 931, "state" : "NH" } +{ "_id" : "03290", "city" : "NOTTINGHAM", "loc" : [ -71.110983, 43.119632 ], "pop" : 598, "state" : "NH" } +{ "_id" : "03291", "city" : "WEST NOTTINGHAM", "loc" : [ -71.111006, 43.133971 ], "pop" : 27, "state" : "NH" } +{ "_id" : "03301", "city" : "CONCORD", "loc" : [ -71.527734, 43.218525 ], "pop" : 34035, "state" : "NH" } +{ "_id" : "03303", "city" : "BOSCAWEN", "loc" : [ -71.612723, 43.285285 ], "pop" : 12046, "state" : "NH" } +{ "_id" : "03304", "city" : "BOW", "loc" : [ -71.544814, 43.138788 ], "pop" : 5500, "state" : "NH" } +{ "_id" : "03431", "city" : "SURRY", "loc" : [ -72.28954, 42.943127 ], "pop" : 23882, "state" : "NH" } +{ "_id" : "03440", "city" : "ANTRIM", "loc" : [ -71.938698, 43.059547 ], "pop" : 3379, "state" : "NH" } +{ "_id" : "03441", "city" : "ASHUELOT", "loc" : [ -72.434899, 42.785057 ], "pop" : 285, "state" : "NH" } +{ "_id" : "03442", "city" : "BENNINGTON", "loc" : [ -71.91534, 43.010309 ], "pop" : 1236, "state" : "NH" } +{ "_id" : "03443", "city" : "CHESTERFIELD", "loc" : [ -72.487219, 42.900785 ], "pop" : 1455, "state" : "NH" } +{ "_id" : "03444", "city" : "DUBLIN", "loc" : [ -72.050538, 42.897198 ], "pop" : 1474, "state" : "NH" } +{ "_id" : "03445", "city" : "EAST SULLIVAN", "loc" : [ -72.191778, 42.994005 ], "pop" : 169, "state" : "NH" } +{ "_id" : "03446", "city" : "EAST SWANZEY", "loc" : [ -72.249298, 42.884137 ], "pop" : 796, "state" : "NH" } +{ "_id" : "03447", "city" : "FITZWILLIAM", "loc" : [ -72.145014, 42.7611 ], "pop" : 2016, "state" : "NH" } +{ "_id" : "03448", "city" : "GILSUM", "loc" : [ -72.263272, 43.043105 ], "pop" : 745, "state" : "NH" } +{ "_id" : "03449", "city" : "HANCOCK", "loc" : [ -71.981858, 42.976817 ], "pop" : 1526, "state" : "NH" } +{ "_id" : "03450", "city" : "HARRISVILLE", "loc" : [ -72.09724300000001, 42.939874 ], "pop" : 981, "state" : "NH" } +{ "_id" : "03451", "city" : "HINSDALE", "loc" : [ -72.501474, 42.802714 ], "pop" : 3936, "state" : "NH" } +{ "_id" : "03452", "city" : "JAFFREY", "loc" : [ -72.027514, 42.81779 ], "pop" : 5334, "state" : "NH" } +{ "_id" : "03455", "city" : "MARLBOROUGH", "loc" : [ -72.201292, 42.898804 ], "pop" : 1927, "state" : "NH" } +{ "_id" : "03456", "city" : "MARLOW", "loc" : [ -72.21087900000001, 43.132585 ], "pop" : 650, "state" : "NH" } +{ "_id" : "03457", "city" : "MUNSONVILLE", "loc" : [ -72.133702, 42.998646 ], "pop" : 535, "state" : "NH" } +{ "_id" : "03458", "city" : "PETERBOROUGH", "loc" : [ -71.94696399999999, 42.88559 ], "pop" : 5713, "state" : "NH" } +{ "_id" : "03461", "city" : "RINDGE", "loc" : [ -72.01903799999999, 42.754391 ], "pop" : 4968, "state" : "NH" } +{ "_id" : "03462", "city" : "SPOFFORD", "loc" : [ -72.41027699999999, 42.911973 ], "pop" : 1266, "state" : "NH" } +{ "_id" : "03464", "city" : "STODDARD", "loc" : [ -72.108811, 43.073944 ], "pop" : 622, "state" : "NH" } +{ "_id" : "03465", "city" : "TROY", "loc" : [ -72.184753, 42.82697 ], "pop" : 2097, "state" : "NH" } +{ "_id" : "03466", "city" : "WEST CHESTERFIEL", "loc" : [ -72.511216, 42.873152 ], "pop" : 391, "state" : "NH" } +{ "_id" : "03467", "city" : "WESTMORELAND", "loc" : [ -72.435784, 42.968999 ], "pop" : 1596, "state" : "NH" } +{ "_id" : "03469", "city" : "WEST SWANZEY", "loc" : [ -72.29768799999999, 42.870313 ], "pop" : 5440, "state" : "NH" } +{ "_id" : "03470", "city" : "RICHMOND", "loc" : [ -72.36367199999999, 42.773922 ], "pop" : 4625, "state" : "NH" } +{ "_id" : "03561", "city" : "LITTLETON", "loc" : [ -71.776816, 44.311187 ], "pop" : 6663, "state" : "NH" } +{ "_id" : "03570", "city" : "BERLIN", "loc" : [ -71.18923599999999, 44.48107 ], "pop" : 12892, "state" : "NH" } +{ "_id" : "03574", "city" : "BETHLEHEM", "loc" : [ -71.682929, 44.280846 ], "pop" : 1885, "state" : "NH" } +{ "_id" : "03576", "city" : "COLEBROOK", "loc" : [ -71.47934100000001, 44.907776 ], "pop" : 4232, "state" : "NH" } +{ "_id" : "03579", "city" : "ERROL", "loc" : [ -71.143612, 44.800273 ], "pop" : 366, "state" : "NH" } +{ "_id" : "03580", "city" : "FRANCONIA", "loc" : [ -71.751822, 44.205273 ], "pop" : 1090, "state" : "NH" } +{ "_id" : "03581", "city" : "GORHAM", "loc" : [ -71.17998299999999, 44.399601 ], "pop" : 3610, "state" : "NH" } +{ "_id" : "03582", "city" : "GROVETON", "loc" : [ -71.506421, 44.598367 ], "pop" : 2527, "state" : "NH" } +{ "_id" : "03583", "city" : "JEFFERSON", "loc" : [ -71.45183400000001, 44.399907 ], "pop" : 986, "state" : "NH" } +{ "_id" : "03584", "city" : "LANCASTER", "loc" : [ -71.55911500000001, 44.492074 ], "pop" : 3825, "state" : "NH" } +{ "_id" : "03585", "city" : "LISBON", "loc" : [ -71.896565, 44.214837 ], "pop" : 2295, "state" : "NH" } +{ "_id" : "03588", "city" : "MILAN", "loc" : [ -71.181031, 44.586968 ], "pop" : 987, "state" : "NH" } +{ "_id" : "03590", "city" : "NORTH STRATFORD", "loc" : [ -71.564368, 44.714915 ], "pop" : 927, "state" : "NH" } +{ "_id" : "03592", "city" : "PITTSBURG", "loc" : [ -71.36359299999999, 45.086564 ], "pop" : 1104, "state" : "NH" } +{ "_id" : "03598", "city" : "WHITEFIELD", "loc" : [ -71.603453, 44.36811 ], "pop" : 3139, "state" : "NH" } +{ "_id" : "03602", "city" : "ALSTEAD", "loc" : [ -72.328052, 43.126484 ], "pop" : 1721, "state" : "NH" } +{ "_id" : "03603", "city" : "CHARLESTOWN", "loc" : [ -72.40638, 43.257339 ], "pop" : 4678, "state" : "NH" } +{ "_id" : "03605", "city" : "EAST LEMPSTER", "loc" : [ -72.16620500000001, 43.21863 ], "pop" : 323, "state" : "NH" } +{ "_id" : "03607", "city" : "SOUTH ACWORTH", "loc" : [ -72.341053, 43.176942 ], "pop" : 1008, "state" : "NH" } +{ "_id" : "03608", "city" : "WALPOLE", "loc" : [ -72.41548899999999, 43.076533 ], "pop" : 2466, "state" : "NH" } +{ "_id" : "03609", "city" : "NORTH WALPOLE", "loc" : [ -72.44825299999999, 43.142759 ], "pop" : 744, "state" : "NH" } +{ "_id" : "03740", "city" : "BATH", "loc" : [ -71.95674099999999, 44.173419 ], "pop" : 155, "state" : "NH" } +{ "_id" : "03741", "city" : "CANAAN", "loc" : [ -72.029724, 43.660092 ], "pop" : 3065, "state" : "NH" } +{ "_id" : "03743", "city" : "CLAREMONT", "loc" : [ -72.342186, 43.367942 ], "pop" : 14820, "state" : "NH" } +{ "_id" : "03745", "city" : "CORNISH", "loc" : [ -72.339426, 43.496339 ], "pop" : 2275, "state" : "NH" } +{ "_id" : "03748", "city" : "ENFIELD", "loc" : [ -72.127014, 43.625584 ], "pop" : 4118, "state" : "NH" } +{ "_id" : "03750", "city" : "ETNA", "loc" : [ -72.212479, 43.711333 ], "pop" : 944, "state" : "NH" } +{ "_id" : "03752", "city" : "GOSHEN", "loc" : [ -72.124117, 43.302623 ], "pop" : 742, "state" : "NH" } +{ "_id" : "03753", "city" : "GRANTHAM", "loc" : [ -72.133437, 43.510324 ], "pop" : 1247, "state" : "NH" } +{ "_id" : "03755", "city" : "HANOVER", "loc" : [ -72.28496, 43.704532 ], "pop" : 7070, "state" : "NH" } +{ "_id" : "03765", "city" : "HAVERHILL", "loc" : [ -72.057276, 44.039438 ], "pop" : 498, "state" : "NH" } +{ "_id" : "03766", "city" : "LEBANON", "loc" : [ -72.242818, 43.644688 ], "pop" : 9032, "state" : "NH" } +{ "_id" : "03768", "city" : "LYME", "loc" : [ -72.161993, 43.791327 ], "pop" : 2172, "state" : "NH" } +{ "_id" : "03770", "city" : "MERIDEN", "loc" : [ -72.275644, 43.529873 ], "pop" : 126, "state" : "NH" } +{ "_id" : "03771", "city" : "MONROE", "loc" : [ -72.02502800000001, 44.273358 ], "pop" : 760, "state" : "NH" } +{ "_id" : "03773", "city" : "NEWPORT", "loc" : [ -72.183789, 43.353228 ], "pop" : 8073, "state" : "NH" } +{ "_id" : "03774", "city" : "NORTH HAVERHILL", "loc" : [ -72.01911200000001, 44.097841 ], "pop" : 1744, "state" : "NH" } +{ "_id" : "03777", "city" : "ORFORD", "loc" : [ -72.097846, 43.894101 ], "pop" : 1008, "state" : "NH" } +{ "_id" : "03779", "city" : "PIERMONT", "loc" : [ -72.081299, 43.990572 ], "pop" : 431, "state" : "NH" } +{ "_id" : "03780", "city" : "PIKE", "loc" : [ -72.009587, 44.025511 ], "pop" : 751, "state" : "NH" } +{ "_id" : "03781", "city" : "PLAINFIELD", "loc" : [ -72.270398, 43.551919 ], "pop" : 1314, "state" : "NH" } +{ "_id" : "03782", "city" : "SUNAPEE", "loc" : [ -72.095044, 43.386816 ], "pop" : 2570, "state" : "NH" } +{ "_id" : "03784", "city" : "WEST LEBANON", "loc" : [ -72.300735, 43.64401 ], "pop" : 3784, "state" : "NH" } +{ "_id" : "03785", "city" : "WOODSVILLE", "loc" : [ -71.989215, 44.138549 ], "pop" : 2292, "state" : "NH" } +{ "_id" : "03801", "city" : "NEWINGTON", "loc" : [ -70.780412, 43.066524 ], "pop" : 27430, "state" : "NH" } +{ "_id" : "03809", "city" : "ALTON", "loc" : [ -71.229709, 43.46302 ], "pop" : 2939, "state" : "NH" } +{ "_id" : "03810", "city" : "ALTON BAY", "loc" : [ -71.24888, 43.484468 ], "pop" : 157, "state" : "NH" } +{ "_id" : "03811", "city" : "ATKINSON", "loc" : [ -71.16030000000001, 42.836981 ], "pop" : 5145, "state" : "NH" } +{ "_id" : "03812", "city" : "BARTLETT", "loc" : [ -71.2491, 44.08656 ], "pop" : 1379, "state" : "NH" } +{ "_id" : "03813", "city" : "CENTER CONWAY", "loc" : [ -71.060677, 43.98776 ], "pop" : 2394, "state" : "NH" } +{ "_id" : "03814", "city" : "CENTER OSSIPEE", "loc" : [ -71.134882, 43.768189 ], "pop" : 2492, "state" : "NH" } +{ "_id" : "03815", "city" : "CENTER STRAFFORD", "loc" : [ -71.107122, 43.262888 ], "pop" : 436, "state" : "NH" } +{ "_id" : "03816", "city" : "CENTER TUFTONBOR", "loc" : [ -71.26505899999999, 43.690205 ], "pop" : 885, "state" : "NH" } +{ "_id" : "03817", "city" : "CHOCORUA", "loc" : [ -71.24071600000001, 43.890851 ], "pop" : 70, "state" : "NH" } +{ "_id" : "03818", "city" : "CONWAY", "loc" : [ -71.15028, 43.974161 ], "pop" : 1875, "state" : "NH" } +{ "_id" : "03819", "city" : "DANVILLE", "loc" : [ -71.120985, 42.923432 ], "pop" : 2471, "state" : "NH" } +{ "_id" : "03820", "city" : "MADBURY", "loc" : [ -70.88488099999999, 43.190006 ], "pop" : 27182, "state" : "NH" } +{ "_id" : "03824", "city" : "LEE", "loc" : [ -70.952333, 43.133821 ], "pop" : 15487, "state" : "NH" } +{ "_id" : "03825", "city" : "BARRINGTON", "loc" : [ -71.03767499999999, 43.2027 ], "pop" : 5842, "state" : "NH" } +{ "_id" : "03826", "city" : "EAST HAMPSTEAD", "loc" : [ -71.127978, 42.887656 ], "pop" : 1880, "state" : "NH" } +{ "_id" : "03827", "city" : "SOUTH HAMPTON", "loc" : [ -70.976904, 42.911289 ], "pop" : 3197, "state" : "NH" } +{ "_id" : "03830", "city" : "EAST WAKEFIELD", "loc" : [ -71.007712, 43.641022 ], "pop" : 675, "state" : "NH" } +{ "_id" : "03833", "city" : "BRENTWOOD", "loc" : [ -70.96430599999999, 42.977169 ], "pop" : 14374, "state" : "NH" } +{ "_id" : "03835", "city" : "FARMINGTON", "loc" : [ -71.06469300000001, 43.388373 ], "pop" : 4676, "state" : "NH" } +{ "_id" : "03836", "city" : "FREEDOM", "loc" : [ -71.062815, 43.817242 ], "pop" : 935, "state" : "NH" } +{ "_id" : "03837", "city" : "GILMANTON IRON W", "loc" : [ -71.330315, 43.425281 ], "pop" : 1301, "state" : "NH" } +{ "_id" : "03838", "city" : "GLEN", "loc" : [ -71.192457, 44.101777 ], "pop" : 84, "state" : "NH" } +{ "_id" : "03839", "city" : "GONIC", "loc" : [ -70.976642, 43.268374 ], "pop" : 4474, "state" : "NH" } +{ "_id" : "03840", "city" : "GREENLAND", "loc" : [ -70.847476, 43.035294 ], "pop" : 2450, "state" : "NH" } +{ "_id" : "03841", "city" : "HAMPSTEAD", "loc" : [ -71.175802, 42.881957 ], "pop" : 5291, "state" : "NH" } +{ "_id" : "03842", "city" : "HAMPTON", "loc" : [ -70.824336, 42.935883 ], "pop" : 12278, "state" : "NH" } +{ "_id" : "03844", "city" : "HAMPTON FALLS", "loc" : [ -70.887608, 42.926323 ], "pop" : 1503, "state" : "NH" } +{ "_id" : "03845", "city" : "INTERVALE", "loc" : [ -71.119415, 44.095479 ], "pop" : 1811, "state" : "NH" } +{ "_id" : "03846", "city" : "JACKSON", "loc" : [ -71.187808, 44.166989 ], "pop" : 689, "state" : "NH" } +{ "_id" : "03848", "city" : "KINGSTON", "loc" : [ -71.063914, 42.913258 ], "pop" : 6111, "state" : "NH" } +{ "_id" : "03849", "city" : "MADISON", "loc" : [ -71.125412, 43.915206 ], "pop" : 1669, "state" : "NH" } +{ "_id" : "03852", "city" : "MILTON MILLS", "loc" : [ -70.969729, 43.502494 ], "pop" : 514, "state" : "NH" } +{ "_id" : "03853", "city" : "MIRROR LAKE", "loc" : [ -71.272858, 43.636552 ], "pop" : 696, "state" : "NH" } +{ "_id" : "03854", "city" : "NEW CASTLE", "loc" : [ -70.719922, 43.068114 ], "pop" : 840, "state" : "NH" } +{ "_id" : "03855", "city" : "NEW DURHAM", "loc" : [ -71.140828, 43.443045 ], "pop" : 2148, "state" : "NH" } +{ "_id" : "03857", "city" : "NEWMARKET", "loc" : [ -70.95531699999999, 43.072628 ], "pop" : 9049, "state" : "NH" } +{ "_id" : "03858", "city" : "NEWTON", "loc" : [ -71.04202100000001, 42.867805 ], "pop" : 2944, "state" : "NH" } +{ "_id" : "03860", "city" : "NORTH CONWAY", "loc" : [ -71.123811, 44.033613 ], "pop" : 3458, "state" : "NH" } +{ "_id" : "03862", "city" : "NORTH HAMPTON", "loc" : [ -70.82673800000001, 42.977625 ], "pop" : 3637, "state" : "NH" } +{ "_id" : "03864", "city" : "OSSIPEE", "loc" : [ -71.11287299999999, 43.694506 ], "pop" : 1490, "state" : "NH" } +{ "_id" : "03865", "city" : "PLAISTOW", "loc" : [ -71.093397, 42.835551 ], "pop" : 7124, "state" : "NH" } +{ "_id" : "03867", "city" : "ROCHESTER", "loc" : [ -71.055753, 43.309203 ], "pop" : 3793, "state" : "NH" } +{ "_id" : "03868", "city" : "EAST ROCHESTER", "loc" : [ -70.968581, 43.31256 ], "pop" : 20616, "state" : "NH" } +{ "_id" : "03869", "city" : "ROLLINSFORD", "loc" : [ -70.833207, 43.226936 ], "pop" : 2395, "state" : "NH" } +{ "_id" : "03870", "city" : "RYE", "loc" : [ -70.765153, 43.009468 ], "pop" : 4415, "state" : "NH" } +{ "_id" : "03872", "city" : "SANBORNVILLE", "loc" : [ -71.020005, 43.551278 ], "pop" : 2382, "state" : "NH" } +{ "_id" : "03873", "city" : "SANDOWN", "loc" : [ -71.18606, 42.930819 ], "pop" : 4060, "state" : "NH" } +{ "_id" : "03874", "city" : "SEABROOK", "loc" : [ -70.86463999999999, 42.88536 ], "pop" : 6503, "state" : "NH" } +{ "_id" : "03875", "city" : "SILVER LAKE", "loc" : [ -71.190501, 43.878974 ], "pop" : 640, "state" : "NH" } +{ "_id" : "03878", "city" : "SOMERSWORTH", "loc" : [ -70.87558900000001, 43.252546 ], "pop" : 11170, "state" : "NH" } +{ "_id" : "03882", "city" : "SOUTH EFFINGHAM", "loc" : [ -71.002109, 43.721216 ], "pop" : 201, "state" : "NH" } +{ "_id" : "03883", "city" : "SOUTH TAMWORTH", "loc" : [ -71.311654, 43.833613 ], "pop" : 188, "state" : "NH" } +{ "_id" : "03884", "city" : "STRAFFORD", "loc" : [ -71.162475, 43.250575 ], "pop" : 1618, "state" : "NH" } +{ "_id" : "03885", "city" : "STRATHAM", "loc" : [ -70.899714, 43.019432 ], "pop" : 4967, "state" : "NH" } +{ "_id" : "03886", "city" : "TAMWORTH", "loc" : [ -71.264454, 43.862049 ], "pop" : 1285, "state" : "NH" } +{ "_id" : "03887", "city" : "UNION", "loc" : [ -71.02085700000001, 43.4382 ], "pop" : 4229, "state" : "NH" } +{ "_id" : "03890", "city" : "WEST OSSIPEE", "loc" : [ -71.205141, 43.835956 ], "pop" : 362, "state" : "NH" } +{ "_id" : "03894", "city" : "WOLFEBORO", "loc" : [ -71.190843, 43.594996 ], "pop" : 5586, "state" : "NH" } +{ "_id" : "03901", "city" : "BERWICK", "loc" : [ -70.85503799999999, 43.28992 ], "pop" : 5942, "state" : "ME" } +{ "_id" : "03902", "city" : "CAPE NEDDICK", "loc" : [ -70.639685, 43.213318 ], "pop" : 953, "state" : "ME" } +{ "_id" : "03903", "city" : "ELIOT", "loc" : [ -70.78221600000001, 43.130943 ], "pop" : 6506, "state" : "ME" } +{ "_id" : "03904", "city" : "KITTERY", "loc" : [ -70.742876, 43.092128 ], "pop" : 3537, "state" : "ME" } +{ "_id" : "03905", "city" : "KITTERY POINT", "loc" : [ -70.712108, 43.097571 ], "pop" : 4589, "state" : "ME" } +{ "_id" : "03906", "city" : "NORTH BERWICK", "loc" : [ -70.72117299999999, 43.325401 ], "pop" : 6465, "state" : "ME" } +{ "_id" : "03907", "city" : "OGUNQUIT", "loc" : [ -70.597176, 43.228457 ], "pop" : 852, "state" : "ME" } +{ "_id" : "03908", "city" : "SOUTH BERWICK", "loc" : [ -70.785949, 43.229201 ], "pop" : 5982, "state" : "ME" } +{ "_id" : "03909", "city" : "YORK", "loc" : [ -70.657826, 43.154447 ], "pop" : 8477, "state" : "ME" } +{ "_id" : "04001", "city" : "ACTON", "loc" : [ -70.93068700000001, 43.549405 ], "pop" : 767, "state" : "ME" } +{ "_id" : "04002", "city" : "ALFRED", "loc" : [ -70.69608700000001, 43.487503 ], "pop" : 4730, "state" : "ME" } +{ "_id" : "04003", "city" : "BAILEY ISLAND", "loc" : [ -69.995175, 43.734147 ], "pop" : 464, "state" : "ME" } +{ "_id" : "04005", "city" : "ARUNDEL", "loc" : [ -70.47192800000001, 43.483647 ], "pop" : 23646, "state" : "ME" } +{ "_id" : "04006", "city" : "BIDDEFORD POOL", "loc" : [ -70.352024, 43.442722 ], "pop" : 269, "state" : "ME" } +{ "_id" : "04008", "city" : "BOWDOINHAM", "loc" : [ -69.91884899999999, 44.036806 ], "pop" : 4328, "state" : "ME" } +{ "_id" : "04009", "city" : "BRIDGTON", "loc" : [ -70.724081, 44.052049 ], "pop" : 3980, "state" : "ME" } +{ "_id" : "04010", "city" : "BROWNFIELD", "loc" : [ -70.90322500000001, 43.971316 ], "pop" : 1148, "state" : "ME" } +{ "_id" : "04011", "city" : "BIRCH ISLAND", "loc" : [ -69.95546899999999, 43.897591 ], "pop" : 22557, "state" : "ME" } +{ "_id" : "04013", "city" : "BUSTINS ISLAND", "loc" : [ -70.042247, 43.79602 ], "pop" : 0, "state" : "ME" } +{ "_id" : "04015", "city" : "CASCO", "loc" : [ -70.52601300000001, 43.959623 ], "pop" : 3010, "state" : "ME" } +{ "_id" : "04016", "city" : "CENTER LOVELL", "loc" : [ -70.883618, 44.168139 ], "pop" : 148, "state" : "ME" } +{ "_id" : "04017", "city" : "CHEBEAGUE ISLAND", "loc" : [ -70.116878, 43.735363 ], "pop" : 337, "state" : "ME" } +{ "_id" : "04019", "city" : "CLIFF ISLAND", "loc" : [ -70.107097, 43.695547 ], "pop" : 87, "state" : "ME" } +{ "_id" : "04020", "city" : "CORNISH", "loc" : [ -70.77843300000001, 43.779612 ], "pop" : 1736, "state" : "ME" } +{ "_id" : "04021", "city" : "CUMBERLAND CENTE", "loc" : [ -70.2484, 43.809818 ], "pop" : 8544, "state" : "ME" } +{ "_id" : "04022", "city" : "DENMARK", "loc" : [ -70.79240900000001, 43.975499 ], "pop" : 679, "state" : "ME" } +{ "_id" : "04024", "city" : "EAST BALDWIN", "loc" : [ -70.692159, 43.864604 ], "pop" : 976, "state" : "ME" } +{ "_id" : "04027", "city" : "WEST LEBANON", "loc" : [ -70.91098599999999, 43.410304 ], "pop" : 5224, "state" : "ME" } +{ "_id" : "04029", "city" : "NORTH SEBAGO", "loc" : [ -70.633865, 43.882247 ], "pop" : 597, "state" : "ME" } +{ "_id" : "04030", "city" : "EAST WATERBORO", "loc" : [ -70.69062599999999, 43.599537 ], "pop" : 1153, "state" : "ME" } +{ "_id" : "04032", "city" : "FREEPORT", "loc" : [ -70.113854, 43.851093 ], "pop" : 8081, "state" : "ME" } +{ "_id" : "04037", "city" : "FRYEBURG", "loc" : [ -70.966841, 44.031278 ], "pop" : 2551, "state" : "ME" } +{ "_id" : "04038", "city" : "GORHAM", "loc" : [ -70.467968, 43.684329 ], "pop" : 13642, "state" : "ME" } +{ "_id" : "04039", "city" : "GRAY", "loc" : [ -70.342939, 43.894202 ], "pop" : 5383, "state" : "ME" } +{ "_id" : "04040", "city" : "HARRISON", "loc" : [ -70.65385499999999, 44.107099 ], "pop" : 2274, "state" : "ME" } +{ "_id" : "04041", "city" : "HIRAM", "loc" : [ -70.853076, 43.862217 ], "pop" : 1905, "state" : "ME" } +{ "_id" : "04042", "city" : "HOLLIS CENTER", "loc" : [ -70.605074, 43.594578 ], "pop" : 2243, "state" : "ME" } +{ "_id" : "04043", "city" : "KENNEBUNK", "loc" : [ -70.547802, 43.388055 ], "pop" : 7826, "state" : "ME" } +{ "_id" : "04046", "city" : "KENNEBUNKPORT", "loc" : [ -70.47286699999999, 43.392288 ], "pop" : 5220, "state" : "ME" } +{ "_id" : "04047", "city" : "KEZAR FALLS", "loc" : [ -70.892717, 43.785361 ], "pop" : 852, "state" : "ME" } +{ "_id" : "04048", "city" : "LIMERICK", "loc" : [ -70.786556, 43.696265 ], "pop" : 2982, "state" : "ME" } +{ "_id" : "04049", "city" : "LIMINGTON", "loc" : [ -70.675178, 43.726031 ], "pop" : 776, "state" : "ME" } +{ "_id" : "04050", "city" : "LONG ISLAND", "loc" : [ -70.15509, 43.692014 ], "pop" : 201, "state" : "ME" } +{ "_id" : "04051", "city" : "LOVELL", "loc" : [ -70.929951, 44.161404 ], "pop" : 763, "state" : "ME" } +{ "_id" : "04053", "city" : "MEREPOINT", "loc" : [ -70.00346999999999, 43.843496 ], "pop" : 269, "state" : "ME" } +{ "_id" : "04055", "city" : "NAPLES", "loc" : [ -70.598754, 43.968121 ], "pop" : 2868, "state" : "ME" } +{ "_id" : "04058", "city" : "NORTH FRYEBURG", "loc" : [ -70.981286, 44.132936 ], "pop" : 185, "state" : "ME" } +{ "_id" : "04060", "city" : "NORTH SHAPLEIGH", "loc" : [ -70.874392, 43.583458 ], "pop" : 302, "state" : "ME" } +{ "_id" : "04061", "city" : "NORTH WATERBORO", "loc" : [ -70.729799, 43.639976 ], "pop" : 1516, "state" : "ME" } +{ "_id" : "04062", "city" : "WINDHAM", "loc" : [ -70.414281, 43.795771 ], "pop" : 13482, "state" : "ME" } +{ "_id" : "04064", "city" : "OLD ORCHARD BEAC", "loc" : [ -70.392053, 43.517449 ], "pop" : 8451, "state" : "ME" } +{ "_id" : "04066", "city" : "ORRS ISLAND", "loc" : [ -69.966793, 43.77267 ], "pop" : 861, "state" : "ME" } +{ "_id" : "04068", "city" : "PORTER", "loc" : [ -70.924266, 43.826216 ], "pop" : 985, "state" : "ME" } +{ "_id" : "04069", "city" : "POWNAL", "loc" : [ -70.195497, 43.890042 ], "pop" : 1690, "state" : "ME" } +{ "_id" : "04071", "city" : "RAYMOND", "loc" : [ -70.449834, 43.921917 ], "pop" : 3516, "state" : "ME" } +{ "_id" : "04072", "city" : "SACO", "loc" : [ -70.454632, 43.520946 ], "pop" : 16192, "state" : "ME" } +{ "_id" : "04073", "city" : "SANFORD", "loc" : [ -70.75847899999999, 43.428541 ], "pop" : 15723, "state" : "ME" } +{ "_id" : "04074", "city" : "SCARBOROUGH", "loc" : [ -70.345668, 43.583476 ], "pop" : 12550, "state" : "ME" } +{ "_id" : "04075", "city" : "SEBAGO LAKE", "loc" : [ -70.573454, 43.758355 ], "pop" : 4141, "state" : "ME" } +{ "_id" : "04076", "city" : "SHAPLEIGH", "loc" : [ -70.828619, 43.567353 ], "pop" : 314, "state" : "ME" } +{ "_id" : "04077", "city" : "SOUTH CASCO", "loc" : [ -70.51293800000001, 43.876736 ], "pop" : 250, "state" : "ME" } +{ "_id" : "04079", "city" : "SOUTH HARPSWELL", "loc" : [ -69.993709, 43.781932 ], "pop" : 1767, "state" : "ME" } +{ "_id" : "04081", "city" : "SOUTH WATERFORD", "loc" : [ -70.792061, 44.151256 ], "pop" : 439, "state" : "ME" } +{ "_id" : "04083", "city" : "SPRINGVALE", "loc" : [ -70.806445, 43.471499 ], "pop" : 5472, "state" : "ME" } +{ "_id" : "04084", "city" : "STANDISH", "loc" : [ -70.48065699999999, 43.814211 ], "pop" : 1592, "state" : "ME" } +{ "_id" : "04085", "city" : "STEEP FALLS", "loc" : [ -70.645627, 43.757137 ], "pop" : 2060, "state" : "ME" } +{ "_id" : "04086", "city" : "PEJEPSCOT", "loc" : [ -69.964479, 43.941286 ], "pop" : 8535, "state" : "ME" } +{ "_id" : "04087", "city" : "WATERBORO", "loc" : [ -70.743115, 43.566097 ], "pop" : 1797, "state" : "ME" } +{ "_id" : "04090", "city" : "WELLS", "loc" : [ -70.59688300000001, 43.314352 ], "pop" : 5590, "state" : "ME" } +{ "_id" : "04091", "city" : "WEST BALDWIN", "loc" : [ -70.749015, 43.829873 ], "pop" : 770, "state" : "ME" } +{ "_id" : "04092", "city" : "WESTBROOK", "loc" : [ -70.35803300000001, 43.684268 ], "pop" : 16121, "state" : "ME" } +{ "_id" : "04093", "city" : "WEST BUXTON", "loc" : [ -70.601546, 43.661586 ], "pop" : 4910, "state" : "ME" } +{ "_id" : "04095", "city" : "MAPLEWOOD", "loc" : [ -70.913476, 43.643417 ], "pop" : 1126, "state" : "ME" } +{ "_id" : "04096", "city" : "YARMOUTH", "loc" : [ -70.174958, 43.800933 ], "pop" : 3068, "state" : "ME" } +{ "_id" : "04101", "city" : "PORTLAND", "loc" : [ -70.258864, 43.660564 ], "pop" : 17147, "state" : "ME" } +{ "_id" : "04102", "city" : "PORTLAND", "loc" : [ -70.28981, 43.660168 ], "pop" : 17660, "state" : "ME" } +{ "_id" : "04103", "city" : "PORTLAND", "loc" : [ -70.2876, 43.687568 ], "pop" : 28461, "state" : "ME" } +{ "_id" : "04105", "city" : "FALMOUTH", "loc" : [ -70.26253, 43.734038 ], "pop" : 7609, "state" : "ME" } +{ "_id" : "04106", "city" : "SOUTH PORTLAND", "loc" : [ -70.270878, 43.631847 ], "pop" : 23131, "state" : "ME" } +{ "_id" : "04107", "city" : "CAPE ELIZABETH", "loc" : [ -70.230099, 43.601735 ], "pop" : 8854, "state" : "ME" } +{ "_id" : "04108", "city" : "PEAKS ISLAND", "loc" : [ -70.194017, 43.658921 ], "pop" : 775, "state" : "ME" } +{ "_id" : "04109", "city" : "CUSHING ISLAND", "loc" : [ -70.202201, 43.674971 ], "pop" : 28, "state" : "ME" } +{ "_id" : "04110", "city" : "CUMBERLAND FORES", "loc" : [ -70.188333, 43.774485 ], "pop" : 2879, "state" : "ME" } +{ "_id" : "04210", "city" : "AUBURN", "loc" : [ -70.238978, 44.094785 ], "pop" : 24160, "state" : "ME" } +{ "_id" : "04216", "city" : "ANDOVER", "loc" : [ -70.79666, 44.663703 ], "pop" : 878, "state" : "ME" } +{ "_id" : "04217", "city" : "BETHEL", "loc" : [ -70.803685, 44.416176 ], "pop" : 2775, "state" : "ME" } +{ "_id" : "04219", "city" : "BRYANT POND", "loc" : [ -70.643468, 44.395714 ], "pop" : 1563, "state" : "ME" } +{ "_id" : "04220", "city" : "BUCKFIELD", "loc" : [ -70.36829299999999, 44.287676 ], "pop" : 1551, "state" : "ME" } +{ "_id" : "04221", "city" : "CANTON", "loc" : [ -70.321719, 44.418894 ], "pop" : 1673, "state" : "ME" } +{ "_id" : "04223", "city" : "DANVILLE", "loc" : [ -70.27205499999999, 44.036528 ], "pop" : 1086, "state" : "ME" } +{ "_id" : "04224", "city" : "DIXFIELD", "loc" : [ -70.424099, 44.554799 ], "pop" : 3032, "state" : "ME" } +{ "_id" : "04225", "city" : "DRYDEN", "loc" : [ -70.223962, 44.600218 ], "pop" : 4520, "state" : "ME" } +{ "_id" : "04226", "city" : "EAST ANDOVER", "loc" : [ -70.729555, 44.603011 ], "pop" : 154, "state" : "ME" } +{ "_id" : "04228", "city" : "EAST LIVERMORE", "loc" : [ -70.130334, 44.399402 ], "pop" : 560, "state" : "ME" } +{ "_id" : "04231", "city" : "EAST STONEHAM", "loc" : [ -70.852936, 44.238201 ], "pop" : 429, "state" : "ME" } +{ "_id" : "04235", "city" : "FRYE", "loc" : [ -70.565319, 44.599482 ], "pop" : 28, "state" : "ME" } +{ "_id" : "04236", "city" : "GREENE", "loc" : [ -70.145532, 44.189059 ], "pop" : 3661, "state" : "ME" } +{ "_id" : "04237", "city" : "HANOVER", "loc" : [ -70.716735, 44.495875 ], "pop" : 272, "state" : "ME" } +{ "_id" : "04238", "city" : "HEBRON", "loc" : [ -70.37536900000001, 44.202136 ], "pop" : 826, "state" : "ME" } +{ "_id" : "04239", "city" : "JAY", "loc" : [ -70.209883, 44.515994 ], "pop" : 4631, "state" : "ME" } +{ "_id" : "04240", "city" : "LEWISTON", "loc" : [ -70.191619, 44.098538 ], "pop" : 40173, "state" : "ME" } +{ "_id" : "04250", "city" : "LISBON", "loc" : [ -70.113933, 44.025511 ], "pop" : 3633, "state" : "ME" } +{ "_id" : "04252", "city" : "LISBON FALLS", "loc" : [ -70.073375, 43.997759 ], "pop" : 8095, "state" : "ME" } +{ "_id" : "04254", "city" : "LIVERMORE FALLS", "loc" : [ -70.193614, 44.445756 ], "pop" : 4845, "state" : "ME" } +{ "_id" : "04256", "city" : "MECHANIC FALLS", "loc" : [ -70.368206, 44.099957 ], "pop" : 6247, "state" : "ME" } +{ "_id" : "04257", "city" : "MEXICO", "loc" : [ -70.535797, 44.562776 ], "pop" : 3316, "state" : "ME" } +{ "_id" : "04259", "city" : "MONMOUTH", "loc" : [ -70.02627, 44.22083 ], "pop" : 1838, "state" : "ME" } +{ "_id" : "04260", "city" : "NEW GLOUCESTER", "loc" : [ -70.297381, 43.960835 ], "pop" : 3916, "state" : "ME" } +{ "_id" : "04261", "city" : "NEWRY", "loc" : [ -70.79261099999999, 44.407937 ], "pop" : 300, "state" : "ME" } +{ "_id" : "04263", "city" : "LEEDS", "loc" : [ -70.125277, 44.28343 ], "pop" : 1669, "state" : "ME" } +{ "_id" : "04265", "city" : "NORTH MONMOUTH", "loc" : [ -70.036686, 44.275328 ], "pop" : 616, "state" : "ME" } +{ "_id" : "04266", "city" : "NORTH TURNER", "loc" : [ -70.256147, 44.335031 ], "pop" : 953, "state" : "ME" } +{ "_id" : "04267", "city" : "NORTH WATERFORD", "loc" : [ -70.717393, 44.206511 ], "pop" : 1168, "state" : "ME" } +{ "_id" : "04268", "city" : "NORWAY", "loc" : [ -70.560135, 44.212654 ], "pop" : 5258, "state" : "ME" } +{ "_id" : "04270", "city" : "OXFORD", "loc" : [ -70.509799, 44.11183 ], "pop" : 2822, "state" : "ME" } +{ "_id" : "04273", "city" : "POLAND", "loc" : [ -70.41181899999999, 44.059187 ], "pop" : 179, "state" : "ME" } +{ "_id" : "04274", "city" : "POLAND SPRING", "loc" : [ -70.37966400000001, 44.021162 ], "pop" : 1375, "state" : "ME" } +{ "_id" : "04275", "city" : "ROXBURY", "loc" : [ -70.609188, 44.65657 ], "pop" : 548, "state" : "ME" } +{ "_id" : "04276", "city" : "RUMFORD", "loc" : [ -70.564475, 44.543446 ], "pop" : 7035, "state" : "ME" } +{ "_id" : "04278", "city" : "RUMFORD CENTER", "loc" : [ -70.700058, 44.592334 ], "pop" : 92, "state" : "ME" } +{ "_id" : "04279", "city" : "RUMFORD POINT", "loc" : [ -70.700276, 44.557104 ], "pop" : 36, "state" : "ME" } +{ "_id" : "04280", "city" : "SABATTUS", "loc" : [ -70.074792, 44.113269 ], "pop" : 4809, "state" : "ME" } +{ "_id" : "04281", "city" : "SOUTH PARIS", "loc" : [ -70.50117899999999, 44.216674 ], "pop" : 6054, "state" : "ME" } +{ "_id" : "04282", "city" : "TURNER", "loc" : [ -70.249444, 44.255669 ], "pop" : 3365, "state" : "ME" } +{ "_id" : "04284", "city" : "WAYNE", "loc" : [ -70.0712, 44.349283 ], "pop" : 546, "state" : "ME" } +{ "_id" : "04285", "city" : "WELD", "loc" : [ -70.42489999999999, 44.701624 ], "pop" : 430, "state" : "ME" } +{ "_id" : "04289", "city" : "WEST PARIS", "loc" : [ -70.573167, 44.32527 ], "pop" : 2149, "state" : "ME" } +{ "_id" : "04290", "city" : "PERU", "loc" : [ -70.443459, 44.494408 ], "pop" : 1541, "state" : "ME" } +{ "_id" : "04291", "city" : "WEST POLAND", "loc" : [ -70.450166, 44.047167 ], "pop" : 733, "state" : "ME" } +{ "_id" : "04292", "city" : "WEST SUMNER", "loc" : [ -70.43231400000001, 44.372804 ], "pop" : 761, "state" : "ME" } +{ "_id" : "04294", "city" : "WILTON", "loc" : [ -70.296064, 44.59107 ], "pop" : 227, "state" : "ME" } +{ "_id" : "04330", "city" : "AUGUSTA", "loc" : [ -69.766548, 44.323228 ], "pop" : 25195, "state" : "ME" } +{ "_id" : "04341", "city" : "COOPERS MILLS", "loc" : [ -69.507672, 44.258823 ], "pop" : 1082, "state" : "ME" } +{ "_id" : "04342", "city" : "DRESDEN", "loc" : [ -69.745726, 44.078507 ], "pop" : 1336, "state" : "ME" } +{ "_id" : "04344", "city" : "FARMINGDALE", "loc" : [ -69.791313, 44.25233 ], "pop" : 2917, "state" : "ME" } +{ "_id" : "04345", "city" : "GARDINER", "loc" : [ -69.785774, 44.207029 ], "pop" : 8387, "state" : "ME" } +{ "_id" : "04346", "city" : "RANDOLPH", "loc" : [ -69.774918, 44.228704 ], "pop" : 6619, "state" : "ME" } +{ "_id" : "04347", "city" : "HALLOWELL", "loc" : [ -69.80573800000001, 44.286414 ], "pop" : 2613, "state" : "ME" } +{ "_id" : "04348", "city" : "JEFFERSON", "loc" : [ -69.483895, 44.189419 ], "pop" : 1488, "state" : "ME" } +{ "_id" : "04349", "city" : "KENTS HILL", "loc" : [ -70.074822, 44.438259 ], "pop" : 755, "state" : "ME" } +{ "_id" : "04350", "city" : "LITCHFIELD", "loc" : [ -69.958071, 44.163437 ], "pop" : 2354, "state" : "ME" } +{ "_id" : "04351", "city" : "MANCHESTER", "loc" : [ -69.884657, 44.308375 ], "pop" : 603, "state" : "ME" } +{ "_id" : "04352", "city" : "MOUNT VERNON", "loc" : [ -69.990336, 44.499342 ], "pop" : 1396, "state" : "ME" } +{ "_id" : "04353", "city" : "NORTH WHITEFIELD", "loc" : [ -69.602164, 44.217844 ], "pop" : 1931, "state" : "ME" } +{ "_id" : "04354", "city" : "PALERMO", "loc" : [ -69.43337, 44.384282 ], "pop" : 752, "state" : "ME" } +{ "_id" : "04355", "city" : "READFIELD", "loc" : [ -69.95063399999999, 44.403221 ], "pop" : 1725, "state" : "ME" } +{ "_id" : "04357", "city" : "RICHMOND", "loc" : [ -69.821077, 44.104213 ], "pop" : 3072, "state" : "ME" } +{ "_id" : "04358", "city" : "SOUTH CHINA", "loc" : [ -69.58036, 44.395334 ], "pop" : 182, "state" : "ME" } +{ "_id" : "04361", "city" : "WEEKS MILLS", "loc" : [ -69.541738, 44.407543 ], "pop" : 2942, "state" : "ME" } +{ "_id" : "04363", "city" : "WINDSOR", "loc" : [ -69.58058699999999, 44.300878 ], "pop" : 1618, "state" : "ME" } +{ "_id" : "04364", "city" : "WINTHROP", "loc" : [ -69.973128, 44.314031 ], "pop" : 7929, "state" : "ME" } +{ "_id" : "04401", "city" : "BANGOR", "loc" : [ -68.791839, 44.824199 ], "pop" : 40434, "state" : "ME" } +{ "_id" : "04406", "city" : "ABBOT VILLAGE", "loc" : [ -69.52513999999999, 45.279838 ], "pop" : 1193, "state" : "ME" } +{ "_id" : "04408", "city" : "AURORA", "loc" : [ -68.295929, 44.886113 ], "pop" : 141, "state" : "ME" } +{ "_id" : "04410", "city" : "BRADFORD", "loc" : [ -68.923491, 45.08552 ], "pop" : 1103, "state" : "ME" } +{ "_id" : "04411", "city" : "BRADLEY", "loc" : [ -68.626328, 44.901454 ], "pop" : 1136, "state" : "ME" } +{ "_id" : "04412", "city" : "BREWER", "loc" : [ -68.753896, 44.787433 ], "pop" : 9021, "state" : "ME" } +{ "_id" : "04413", "city" : "BROOKTON", "loc" : [ -67.70782800000001, 45.5686 ], "pop" : 236, "state" : "ME" } +{ "_id" : "04414", "city" : "BROWNVILLE", "loc" : [ -69.042331, 45.341229 ], "pop" : 1426, "state" : "ME" } +{ "_id" : "04416", "city" : "BUCKSPORT", "loc" : [ -68.77682299999999, 44.601546 ], "pop" : 5340, "state" : "ME" } +{ "_id" : "04417", "city" : "BURLINGTON", "loc" : [ -68.442701, 45.218438 ], "pop" : 643, "state" : "ME" } +{ "_id" : "04418", "city" : "CARDVILLE", "loc" : [ -68.60327700000001, 45.077599 ], "pop" : 1309, "state" : "ME" } +{ "_id" : "04419", "city" : "CARMEL", "loc" : [ -68.99415, 44.805315 ], "pop" : 3328, "state" : "ME" } +{ "_id" : "04422", "city" : "CHARLESTON", "loc" : [ -69.086856, 45.067017 ], "pop" : 1819, "state" : "ME" } +{ "_id" : "04423", "city" : "COSTIGAN", "loc" : [ -68.61296900000001, 44.975336 ], "pop" : 1895, "state" : "ME" } +{ "_id" : "04424", "city" : "DANFORTH", "loc" : [ -67.86877800000001, 45.668654 ], "pop" : 965, "state" : "ME" } +{ "_id" : "04426", "city" : "DOVER FOXCROFT", "loc" : [ -69.204472, 45.18774 ], "pop" : 5924, "state" : "ME" } +{ "_id" : "04427", "city" : "EAST CORINTH", "loc" : [ -69.008532, 44.983655 ], "pop" : 2177, "state" : "ME" } +{ "_id" : "04428", "city" : "EAST EDDINGTON", "loc" : [ -68.61883, 44.820642 ], "pop" : 2263, "state" : "ME" } +{ "_id" : "04429", "city" : "EAST HOLDEN", "loc" : [ -68.648307, 44.742209 ], "pop" : 4472, "state" : "ME" } +{ "_id" : "04430", "city" : "EAST MILLINOCKET", "loc" : [ -68.572822, 45.629967 ], "pop" : 2198, "state" : "ME" } +{ "_id" : "04431", "city" : "EAST ORLAND", "loc" : [ -68.70174, 44.57249 ], "pop" : 1281, "state" : "ME" } +{ "_id" : "04433", "city" : "ENFIELD", "loc" : [ -68.605802, 45.266477 ], "pop" : 1483, "state" : "ME" } +{ "_id" : "04434", "city" : "ETNA", "loc" : [ -69.13222500000001, 44.793232 ], "pop" : 966, "state" : "ME" } +{ "_id" : "04435", "city" : "EXETER", "loc" : [ -69.107934, 44.967927 ], "pop" : 561, "state" : "ME" } +{ "_id" : "04438", "city" : "FRANKFORT", "loc" : [ -68.933981, 44.59794 ], "pop" : 1141, "state" : "ME" } +{ "_id" : "04441", "city" : "GREENVILLE", "loc" : [ -69.58437600000001, 45.471566 ], "pop" : 2054, "state" : "ME" } +{ "_id" : "04442", "city" : "GREENVILLE JUNCT", "loc" : [ -69.63752599999999, 45.488394 ], "pop" : 99, "state" : "ME" } +{ "_id" : "04443", "city" : "GUILFORD", "loc" : [ -69.397491, 45.173455 ], "pop" : 2833, "state" : "ME" } +{ "_id" : "04444", "city" : "HAMPDEN", "loc" : [ -68.87305000000001, 44.741073 ], "pop" : 6756, "state" : "ME" } +{ "_id" : "04446", "city" : "HAYNESVILLE", "loc" : [ -67.98858, 45.837991 ], "pop" : 244, "state" : "ME" } +{ "_id" : "04448", "city" : "SEBOEIS", "loc" : [ -68.669252, 45.247813 ], "pop" : 1628, "state" : "ME" } +{ "_id" : "04449", "city" : "HUDSON", "loc" : [ -68.88783100000001, 44.991415 ], "pop" : 1048, "state" : "ME" } +{ "_id" : "04450", "city" : "KENDUSKEAG", "loc" : [ -68.934179, 44.918251 ], "pop" : 1234, "state" : "ME" } +{ "_id" : "04451", "city" : "KINGMAN", "loc" : [ -68.23662, 45.598433 ], "pop" : 378, "state" : "ME" } +{ "_id" : "04453", "city" : "LAGRANGE", "loc" : [ -68.83448, 45.178918 ], "pop" : 707, "state" : "ME" } +{ "_id" : "04455", "city" : "LEE", "loc" : [ -68.290885, 45.363504 ], "pop" : 832, "state" : "ME" } +{ "_id" : "04456", "city" : "LEVANT", "loc" : [ -68.98367, 44.884279 ], "pop" : 1627, "state" : "ME" } +{ "_id" : "04457", "city" : "LINCOLN", "loc" : [ -68.507693, 45.350832 ], "pop" : 4715, "state" : "ME" } +{ "_id" : "04458", "city" : "LINCOLN CENTER", "loc" : [ -68.457065, 45.431731 ], "pop" : 1556, "state" : "ME" } +{ "_id" : "04459", "city" : "MATTAWAMKEAG", "loc" : [ -68.35195, 45.526387 ], "pop" : 841, "state" : "ME" } +{ "_id" : "04460", "city" : "MEDWAY", "loc" : [ -68.52270900000001, 45.60704 ], "pop" : 1986, "state" : "ME" } +{ "_id" : "04461", "city" : "MILFORD", "loc" : [ -68.629597, 44.939263 ], "pop" : 1732, "state" : "ME" } +{ "_id" : "04462", "city" : "MILLINOCKET", "loc" : [ -68.710117, 45.659563 ], "pop" : 7265, "state" : "ME" } +{ "_id" : "04463", "city" : "DERBY", "loc" : [ -68.977098, 45.250697 ], "pop" : 3091, "state" : "ME" } +{ "_id" : "04464", "city" : "MONSON", "loc" : [ -69.48798600000001, 45.298088 ], "pop" : 263, "state" : "ME" } +{ "_id" : "04468", "city" : "OLD TOWN", "loc" : [ -68.67496, 44.943044 ], "pop" : 9290, "state" : "ME" } +{ "_id" : "04471", "city" : "NORTH AMITY", "loc" : [ -67.83774099999999, 45.805639 ], "pop" : 138, "state" : "ME" } +{ "_id" : "04472", "city" : "ORLAND", "loc" : [ -68.731312, 44.545818 ], "pop" : 524, "state" : "ME" } +{ "_id" : "04473", "city" : "ORONO", "loc" : [ -68.675466, 44.892472 ], "pop" : 10484, "state" : "ME" } +{ "_id" : "04474", "city" : "ORRINGTON", "loc" : [ -68.78759700000001, 44.726347 ], "pop" : 3309, "state" : "ME" } +{ "_id" : "04475", "city" : "PASSADUMKEAG", "loc" : [ -68.604328, 45.183687 ], "pop" : 428, "state" : "ME" } +{ "_id" : "04476", "city" : "PENOBSCOT", "loc" : [ -68.757409, 44.434371 ], "pop" : 2290, "state" : "ME" } +{ "_id" : "04478", "city" : "ROCKWOOD", "loc" : [ -69.822442, 45.659329 ], "pop" : 367, "state" : "ME" } +{ "_id" : "04479", "city" : "SANGERVILLE", "loc" : [ -69.321772, 45.140571 ], "pop" : 984, "state" : "ME" } +{ "_id" : "04487", "city" : "SPRINGFIELD", "loc" : [ -68.11075599999999, 45.42638 ], "pop" : 985, "state" : "ME" } +{ "_id" : "04488", "city" : "STETSON", "loc" : [ -69.106877, 44.884337 ], "pop" : 738, "state" : "ME" } +{ "_id" : "04490", "city" : "TOPSFIELD", "loc" : [ -67.747253, 45.430403 ], "pop" : 274, "state" : "ME" } +{ "_id" : "04491", "city" : "VANCEBORO", "loc" : [ -67.463419, 45.558761 ], "pop" : 217, "state" : "ME" } +{ "_id" : "04492", "city" : "WAITE", "loc" : [ -67.64281200000001, 45.357741 ], "pop" : 233, "state" : "ME" } +{ "_id" : "04495", "city" : "WINN", "loc" : [ -68.357465, 45.456786 ], "pop" : 479, "state" : "ME" } +{ "_id" : "04496", "city" : "WINTERPORT", "loc" : [ -68.886174, 44.655247 ], "pop" : 3175, "state" : "ME" } +{ "_id" : "04497", "city" : "WYTOPITLOCK", "loc" : [ -68.105541, 45.664476 ], "pop" : 384, "state" : "ME" } +{ "_id" : "04530", "city" : "BATH", "loc" : [ -69.826565, 43.906155 ], "pop" : 12628, "state" : "ME" } +{ "_id" : "04537", "city" : "BOOTHBAY", "loc" : [ -69.62732200000001, 43.894497 ], "pop" : 1701, "state" : "ME" } +{ "_id" : "04538", "city" : "CAPITOL ISLAND", "loc" : [ -69.61844000000001, 43.854559 ], "pop" : 2800, "state" : "ME" } +{ "_id" : "04539", "city" : "BRISTOL", "loc" : [ -69.495367, 43.951864 ], "pop" : 1220, "state" : "ME" } +{ "_id" : "04541", "city" : "CHAMBERLAIN", "loc" : [ -69.49861799999999, 43.884154 ], "pop" : 482, "state" : "ME" } +{ "_id" : "04543", "city" : "DAMARISCOTTA", "loc" : [ -69.504237, 44.029313 ], "pop" : 1217, "state" : "ME" } +{ "_id" : "04544", "city" : "EAST BOOTHBAY", "loc" : [ -69.593903, 43.826241 ], "pop" : 156, "state" : "ME" } +{ "_id" : "04547", "city" : "FRIENDSHIP", "loc" : [ -69.29160400000001, 44.006741 ], "pop" : 2085, "state" : "ME" } +{ "_id" : "04548", "city" : "MAC MAHAN", "loc" : [ -69.747424, 43.819649 ], "pop" : 936, "state" : "ME" } +{ "_id" : "04551", "city" : "MEDOMAK", "loc" : [ -69.43066399999999, 44.006292 ], "pop" : 540, "state" : "ME" } +{ "_id" : "04553", "city" : "NEWCASTLE", "loc" : [ -69.533113, 44.049866 ], "pop" : 1551, "state" : "ME" } +{ "_id" : "04554", "city" : "NEW HARBOR", "loc" : [ -69.50793400000001, 43.860541 ], "pop" : 362, "state" : "ME" } +{ "_id" : "04555", "city" : "NOBLEBORO", "loc" : [ -69.482786, 44.094301 ], "pop" : 1455, "state" : "ME" } +{ "_id" : "04556", "city" : "EDGECOMB", "loc" : [ -69.619742, 43.979179 ], "pop" : 1238, "state" : "ME" } +{ "_id" : "04558", "city" : "PEMAQUID", "loc" : [ -69.528919, 43.892389 ], "pop" : 103, "state" : "ME" } +{ "_id" : "04562", "city" : "PHIPPSBURG", "loc" : [ -69.814982, 43.768816 ], "pop" : 426, "state" : "ME" } +{ "_id" : "04563", "city" : "CUSHING", "loc" : [ -69.27206099999999, 43.986741 ], "pop" : 12, "state" : "ME" } +{ "_id" : "04564", "city" : "ROUND POND", "loc" : [ -69.46617000000001, 43.924983 ], "pop" : 159, "state" : "ME" } +{ "_id" : "04565", "city" : "SEBASCO ESTATES", "loc" : [ -69.857557, 43.769342 ], "pop" : 479, "state" : "ME" } +{ "_id" : "04567", "city" : "SMALL POINT", "loc" : [ -69.84116299999999, 43.731724 ], "pop" : 66, "state" : "ME" } +{ "_id" : "04568", "city" : "SOUTH BRISTOL", "loc" : [ -69.561367, 43.867714 ], "pop" : 476, "state" : "ME" } +{ "_id" : "04570", "city" : "SQUIRREL ISLAND", "loc" : [ -69.63097399999999, 43.809031 ], "pop" : 3, "state" : "ME" } +{ "_id" : "04571", "city" : "TREVETT", "loc" : [ -69.674601, 43.893508 ], "pop" : 338, "state" : "ME" } +{ "_id" : "04572", "city" : "WALDOBORO", "loc" : [ -69.374537, 44.104601 ], "pop" : 4702, "state" : "ME" } +{ "_id" : "04573", "city" : "WALPOLE", "loc" : [ -69.55165, 43.946235 ], "pop" : 349, "state" : "ME" } +{ "_id" : "04574", "city" : "WASHINGTON", "loc" : [ -69.384237, 44.269281 ], "pop" : 1261, "state" : "ME" } +{ "_id" : "04576", "city" : "WEST SOUTHPORT", "loc" : [ -69.667343, 43.823775 ], "pop" : 642, "state" : "ME" } +{ "_id" : "04578", "city" : "WISCASSET", "loc" : [ -69.682576, 44.007444 ], "pop" : 5928, "state" : "ME" } +{ "_id" : "04579", "city" : "WOOLWICH", "loc" : [ -69.789098, 43.950317 ], "pop" : 1781, "state" : "ME" } +{ "_id" : "04605", "city" : "ELLSWORTH", "loc" : [ -68.412093, 44.554824 ], "pop" : 10671, "state" : "ME" } +{ "_id" : "04606", "city" : "ADDISON", "loc" : [ -67.714573, 44.583038 ], "pop" : 1114, "state" : "ME" } +{ "_id" : "04607", "city" : "GOULDSBORO", "loc" : [ -68.08985699999999, 44.473054 ], "pop" : 1064, "state" : "ME" } +{ "_id" : "04609", "city" : "BAR HARBOR", "loc" : [ -68.24479100000001, 44.373799 ], "pop" : 5513, "state" : "ME" } +{ "_id" : "04611", "city" : "BEALS", "loc" : [ -67.605554, 44.512967 ], "pop" : 667, "state" : "ME" } +{ "_id" : "04612", "city" : "BERNARD", "loc" : [ -68.35803, 44.241543 ], "pop" : 186, "state" : "ME" } +{ "_id" : "04613", "city" : "BIRCH HARBOR", "loc" : [ -68.03168599999999, 44.384195 ], "pop" : 229, "state" : "ME" } +{ "_id" : "04614", "city" : "BLUE HILL", "loc" : [ -68.58851300000001, 44.434265 ], "pop" : 1417, "state" : "ME" } +{ "_id" : "04615", "city" : "BLUE HILL FALLS", "loc" : [ -68.590282, 44.390244 ], "pop" : 375, "state" : "ME" } +{ "_id" : "04616", "city" : "BROOKLIN", "loc" : [ -68.556518, 44.254134 ], "pop" : 260, "state" : "ME" } +{ "_id" : "04617", "city" : "BROOKSVILLE", "loc" : [ -68.731279, 44.375635 ], "pop" : 594, "state" : "ME" } +{ "_id" : "04618", "city" : "BUCKS HARBOR", "loc" : [ -67.396382, 44.624762 ], "pop" : 402, "state" : "ME" } +{ "_id" : "04619", "city" : "CALAIS", "loc" : [ -67.26408000000001, 45.171478 ], "pop" : 3963, "state" : "ME" } +{ "_id" : "04622", "city" : "CHERRYFIELD", "loc" : [ -67.943617, 44.622791 ], "pop" : 1341, "state" : "ME" } +{ "_id" : "04623", "city" : "COLUMBIA FALLS", "loc" : [ -67.75341, 44.66988 ], "pop" : 960, "state" : "ME" } +{ "_id" : "04624", "city" : "COREA", "loc" : [ -67.985032, 44.405281 ], "pop" : 507, "state" : "ME" } +{ "_id" : "04626", "city" : "CUTLER", "loc" : [ -67.249869, 44.67531 ], "pop" : 779, "state" : "ME" } +{ "_id" : "04627", "city" : "DEER ISLE", "loc" : [ -68.644839, 44.233951 ], "pop" : 949, "state" : "ME" } +{ "_id" : "04628", "city" : "DENNYSVILLE", "loc" : [ -67.224431, 44.896105 ], "pop" : 684, "state" : "ME" } +{ "_id" : "04630", "city" : "EAST MACHIAS", "loc" : [ -67.38206599999999, 44.742362 ], "pop" : 1574, "state" : "ME" } +{ "_id" : "04631", "city" : "EASTPORT", "loc" : [ -67.00739, 44.919966 ], "pop" : 2514, "state" : "ME" } +{ "_id" : "04634", "city" : "FRANKLIN", "loc" : [ -68.241653, 44.608734 ], "pop" : 1433, "state" : "ME" } +{ "_id" : "04640", "city" : "HANCOCK", "loc" : [ -68.2402, 44.50459 ], "pop" : 769, "state" : "ME" } +{ "_id" : "04642", "city" : "HARBORSIDE", "loc" : [ -68.800901, 44.338584 ], "pop" : 122, "state" : "ME" } +{ "_id" : "04643", "city" : "HARRINGTON", "loc" : [ -67.814722, 44.612218 ], "pop" : 986, "state" : "ME" } +{ "_id" : "04645", "city" : "ISLE AU HAUT", "loc" : [ -68.620598, 44.056057 ], "pop" : 46, "state" : "ME" } +{ "_id" : "04648", "city" : "JONESBORO", "loc" : [ -67.577692, 44.658153 ], "pop" : 585, "state" : "ME" } +{ "_id" : "04649", "city" : "JONESPORT", "loc" : [ -67.604403, 44.550936 ], "pop" : 1520, "state" : "ME" } +{ "_id" : "04650", "city" : "LITTLE DEER ISLE", "loc" : [ -68.70666300000001, 44.285213 ], "pop" : 235, "state" : "ME" } +{ "_id" : "04652", "city" : "LUBEC", "loc" : [ -67.04601599999999, 44.834772 ], "pop" : 2349, "state" : "ME" } +{ "_id" : "04653", "city" : "BASS HARBOR", "loc" : [ -68.380387, 44.1993 ], "pop" : 827, "state" : "ME" } +{ "_id" : "04654", "city" : "MACHIAS", "loc" : [ -67.481996, 44.72154 ], "pop" : 3766, "state" : "ME" } +{ "_id" : "04655", "city" : "MACHIASPORT", "loc" : [ -67.40727699999999, 44.682039 ], "pop" : 602, "state" : "ME" } +{ "_id" : "04656", "city" : "MANSET", "loc" : [ -68.314408, 44.262573 ], "pop" : 445, "state" : "ME" } +{ "_id" : "04657", "city" : "MEDDYBEMPS", "loc" : [ -67.382852, 45.019306 ], "pop" : 242, "state" : "ME" } +{ "_id" : "04658", "city" : "MILBRIDGE", "loc" : [ -67.884433, 44.536601 ], "pop" : 1587, "state" : "ME" } +{ "_id" : "04660", "city" : "MOUNT DESERT", "loc" : [ -68.352253, 44.311547 ], "pop" : 2184, "state" : "ME" } +{ "_id" : "04661", "city" : "NORTH BROOKLIN", "loc" : [ -68.577326, 44.308469 ], "pop" : 674, "state" : "ME" } +{ "_id" : "04666", "city" : "PEMBROKE", "loc" : [ -67.200204, 44.965396 ], "pop" : 1151, "state" : "ME" } +{ "_id" : "04667", "city" : "PERRY", "loc" : [ -67.092882, 44.988824 ], "pop" : 781, "state" : "ME" } +{ "_id" : "04668", "city" : "PRINCETON", "loc" : [ -67.600826, 45.213091 ], "pop" : 1918, "state" : "ME" } +{ "_id" : "04669", "city" : "PROSPECT HARBOR", "loc" : [ -68.02794299999999, 44.419489 ], "pop" : 385, "state" : "ME" } +{ "_id" : "04671", "city" : "ROBBINSTON", "loc" : [ -67.14330099999999, 45.067007 ], "pop" : 495, "state" : "ME" } +{ "_id" : "04673", "city" : "SARGENTVILLE", "loc" : [ -68.70522099999999, 44.3345 ], "pop" : 43, "state" : "ME" } +{ "_id" : "04676", "city" : "SEDGWICK", "loc" : [ -68.637659, 44.33552 ], "pop" : 908, "state" : "ME" } +{ "_id" : "04677", "city" : "SORRENTO", "loc" : [ -68.178665, 44.490696 ], "pop" : 295, "state" : "ME" } +{ "_id" : "04678", "city" : "SOUTH GOULDSBORO", "loc" : [ -68.030406, 44.47163 ], "pop" : 58, "state" : "ME" } +{ "_id" : "04679", "city" : "SOUTHWEST HARBOR", "loc" : [ -68.326471, 44.2823 ], "pop" : 927, "state" : "ME" } +{ "_id" : "04680", "city" : "STEUBEN", "loc" : [ -67.95031899999999, 44.497082 ], "pop" : 773, "state" : "ME" } +{ "_id" : "04681", "city" : "STONINGTON", "loc" : [ -68.674617, 44.175197 ], "pop" : 1746, "state" : "ME" } +{ "_id" : "04683", "city" : "SUNSET", "loc" : [ -68.707002, 44.217404 ], "pop" : 149, "state" : "ME" } +{ "_id" : "04684", "city" : "SURRY", "loc" : [ -68.506272, 44.488272 ], "pop" : 1004, "state" : "ME" } +{ "_id" : "04690", "city" : "WEST TREMONT", "loc" : [ -68.380365, 44.252778 ], "pop" : 119, "state" : "ME" } +{ "_id" : "04693", "city" : "WINTER HARBOR", "loc" : [ -68.084316, 44.390038 ], "pop" : 1157, "state" : "ME" } +{ "_id" : "04694", "city" : "WOODLAND", "loc" : [ -67.417519, 45.133234 ], "pop" : 2909, "state" : "ME" } +{ "_id" : "04730", "city" : "HOULTON", "loc" : [ -67.86301400000001, 46.11885 ], "pop" : 10382, "state" : "ME" } +{ "_id" : "04732", "city" : "ASHLAND", "loc" : [ -68.387608, 46.618438 ], "pop" : 2022, "state" : "ME" } +{ "_id" : "04733", "city" : "BENEDICTA", "loc" : [ -68.408855, 45.812484 ], "pop" : 192, "state" : "ME" } +{ "_id" : "04735", "city" : "BRIDGEWATER", "loc" : [ -67.841469, 46.422154 ], "pop" : 652, "state" : "ME" } +{ "_id" : "04736", "city" : "CARIBOU", "loc" : [ -68.020352, 46.870569 ], "pop" : 10928, "state" : "ME" } +{ "_id" : "04737", "city" : "CLAYTON LAKE", "loc" : [ -69.626445, 46.629805 ], "pop" : 54, "state" : "ME" } +{ "_id" : "04740", "city" : "EASTON", "loc" : [ -67.901777, 46.635697 ], "pop" : 1056, "state" : "ME" } +{ "_id" : "04742", "city" : "FORT FAIRFIELD", "loc" : [ -67.840204, 46.762272 ], "pop" : 4474, "state" : "ME" } +{ "_id" : "04743", "city" : "FORT KENT", "loc" : [ -68.590855, 47.196857 ], "pop" : 6076, "state" : "ME" } +{ "_id" : "04746", "city" : "GRAND ISLE", "loc" : [ -68.15423800000001, 47.304428 ], "pop" : 318, "state" : "ME" } +{ "_id" : "04747", "city" : "ISLAND FALLS", "loc" : [ -68.266722, 46.016866 ], "pop" : 1444, "state" : "ME" } +{ "_id" : "04749", "city" : "LILLE", "loc" : [ -68.110393, 47.263623 ], "pop" : 253, "state" : "ME" } +{ "_id" : "04750", "city" : "LIMESTONE", "loc" : [ -67.84508599999999, 46.924786 ], "pop" : 2693, "state" : "ME" } +{ "_id" : "04751", "city" : "LORING AFB", "loc" : [ -67.89858, 46.9416 ], "pop" : 7844, "state" : "ME" } +{ "_id" : "04756", "city" : "MADAWASKA", "loc" : [ -68.33280999999999, 47.329447 ], "pop" : 5860, "state" : "ME" } +{ "_id" : "04757", "city" : "MAPLETON", "loc" : [ -68.153584, 46.674634 ], "pop" : 1982, "state" : "ME" } +{ "_id" : "04758", "city" : "MARS HILL", "loc" : [ -67.862973, 46.522268 ], "pop" : 2010, "state" : "ME" } +{ "_id" : "04760", "city" : "MONTICELLO", "loc" : [ -67.84143899999999, 46.300658 ], "pop" : 1174, "state" : "ME" } +{ "_id" : "04762", "city" : "NEW SWEDEN", "loc" : [ -68.11545, 46.955916 ], "pop" : 935, "state" : "ME" } +{ "_id" : "04763", "city" : "OAKFIELD", "loc" : [ -68.129805, 46.108753 ], "pop" : 1113, "state" : "ME" } +{ "_id" : "04764", "city" : "OXBOW", "loc" : [ -68.521792, 46.401955 ], "pop" : 76, "state" : "ME" } +{ "_id" : "04765", "city" : "PATTEN", "loc" : [ -68.464669, 46.01316 ], "pop" : 1595, "state" : "ME" } +{ "_id" : "04768", "city" : "PORTAGE", "loc" : [ -68.487675, 46.775303 ], "pop" : 445, "state" : "ME" } +{ "_id" : "04769", "city" : "PRESQUE ISLE", "loc" : [ -68.01179, 46.684151 ], "pop" : 11058, "state" : "ME" } +{ "_id" : "04772", "city" : "SAINT AGATHA", "loc" : [ -68.32323700000001, 47.238655 ], "pop" : 919, "state" : "ME" } +{ "_id" : "04773", "city" : "SAINT DAVID", "loc" : [ -68.231368, 47.334328 ], "pop" : 285, "state" : "ME" } +{ "_id" : "04774", "city" : "SAINT FRANCIS", "loc" : [ -68.950309, 47.14071 ], "pop" : 1048, "state" : "ME" } +{ "_id" : "04776", "city" : "SHERMAN MILLS", "loc" : [ -68.369587, 45.877727 ], "pop" : 1139, "state" : "ME" } +{ "_id" : "04777", "city" : "SHERMAN STATION", "loc" : [ -68.461844, 45.885892 ], "pop" : 527, "state" : "ME" } +{ "_id" : "04779", "city" : "SINCLAIR", "loc" : [ -68.267922, 47.174384 ], "pop" : 216, "state" : "ME" } +{ "_id" : "04780", "city" : "SMYRNA MILLS", "loc" : [ -68.206363, 46.146412 ], "pop" : 453, "state" : "ME" } +{ "_id" : "04781", "city" : "SOLDIER POND", "loc" : [ -68.59808099999999, 47.151529 ], "pop" : 484, "state" : "ME" } +{ "_id" : "04783", "city" : "STOCKHOLM", "loc" : [ -68.208614, 47.064299 ], "pop" : 665, "state" : "ME" } +{ "_id" : "04785", "city" : "VAN BUREN", "loc" : [ -67.94589000000001, 47.158857 ], "pop" : 3391, "state" : "ME" } +{ "_id" : "04786", "city" : "WASHBURN", "loc" : [ -68.133836, 46.788271 ], "pop" : 2783, "state" : "ME" } +{ "_id" : "04787", "city" : "WESTFIELD", "loc" : [ -67.89736499999999, 46.508687 ], "pop" : 854, "state" : "ME" } +{ "_id" : "04841", "city" : "ROCKLAND", "loc" : [ -69.113938, 44.112326 ], "pop" : 8975, "state" : "ME" } +{ "_id" : "04843", "city" : "CAMDEN", "loc" : [ -69.07668200000001, 44.213718 ], "pop" : 5060, "state" : "ME" } +{ "_id" : "04847", "city" : "HOPE", "loc" : [ -69.146743, 44.258902 ], "pop" : 143, "state" : "ME" } +{ "_id" : "04848", "city" : "ISLESBORO", "loc" : [ -68.907346, 44.30823 ], "pop" : 580, "state" : "ME" } +{ "_id" : "04849", "city" : "LINCOLNVILLE", "loc" : [ -69.082446, 44.304825 ], "pop" : 2458, "state" : "ME" } +{ "_id" : "04852", "city" : "MONHEGAN", "loc" : [ -69.316429, 43.764222 ], "pop" : 88, "state" : "ME" } +{ "_id" : "04853", "city" : "NORTH HAVEN", "loc" : [ -68.866744, 44.143598 ], "pop" : 333, "state" : "ME" } +{ "_id" : "04854", "city" : "OWLS HEAD", "loc" : [ -69.089416, 44.073186 ], "pop" : 1624, "state" : "ME" } +{ "_id" : "04856", "city" : "ROCKPORT", "loc" : [ -69.090114, 44.188787 ], "pop" : 1421, "state" : "ME" } +{ "_id" : "04857", "city" : "SAINT GEORGE", "loc" : [ -69.201984, 43.998687 ], "pop" : 225, "state" : "ME" } +{ "_id" : "04858", "city" : "SOUTH THOMASTON", "loc" : [ -69.135937, 44.037785 ], "pop" : 1172, "state" : "ME" } +{ "_id" : "04859", "city" : "SPRUCE HEAD", "loc" : [ -69.17071, 44.010405 ], "pop" : 719, "state" : "ME" } +{ "_id" : "04860", "city" : "TENANTS HARBOR", "loc" : [ -69.23150099999999, 43.955473 ], "pop" : 1322, "state" : "ME" } +{ "_id" : "04861", "city" : "THOMASTON", "loc" : [ -69.18880299999999, 44.084568 ], "pop" : 3560, "state" : "ME" } +{ "_id" : "04862", "city" : "UNION", "loc" : [ -69.25243500000001, 44.242404 ], "pop" : 3853, "state" : "ME" } +{ "_id" : "04863", "city" : "VINALHAVEN", "loc" : [ -68.836816, 44.03968 ], "pop" : 1139, "state" : "ME" } +{ "_id" : "04864", "city" : "WARREN", "loc" : [ -69.247894, 44.127066 ], "pop" : 2816, "state" : "ME" } +{ "_id" : "04865", "city" : "WEST ROCKPORT", "loc" : [ -69.151049, 44.181966 ], "pop" : 555, "state" : "ME" } +{ "_id" : "04901", "city" : "WINSLOW", "loc" : [ -69.63591700000001, 44.547967 ], "pop" : 24915, "state" : "ME" } +{ "_id" : "04910", "city" : "ALBION", "loc" : [ -69.46828600000001, 44.535527 ], "pop" : 2616, "state" : "ME" } +{ "_id" : "04911", "city" : "ANSON", "loc" : [ -69.93085600000001, 44.783107 ], "pop" : 1698, "state" : "ME" } +{ "_id" : "04912", "city" : "ATHENS", "loc" : [ -69.669482, 44.938844 ], "pop" : 897, "state" : "ME" } +{ "_id" : "04915", "city" : "BELFAST", "loc" : [ -69.014753, 44.435436 ], "pop" : 9637, "state" : "ME" } +{ "_id" : "04917", "city" : "BELGRADE", "loc" : [ -69.860636, 44.46875 ], "pop" : 1513, "state" : "ME" } +{ "_id" : "04918", "city" : "BELGRADE LAKES", "loc" : [ -69.863681, 44.511103 ], "pop" : 316, "state" : "ME" } +{ "_id" : "04920", "city" : "BINGHAM", "loc" : [ -69.885721, 45.068241 ], "pop" : 1712, "state" : "ME" } +{ "_id" : "04921", "city" : "BROOKS", "loc" : [ -69.140393, 44.567807 ], "pop" : 1846, "state" : "ME" } +{ "_id" : "04922", "city" : "BURNHAM", "loc" : [ -69.380049, 44.684766 ], "pop" : 961, "state" : "ME" } +{ "_id" : "04923", "city" : "CAMBRIDGE", "loc" : [ -69.44193, 45.051281 ], "pop" : 863, "state" : "ME" } +{ "_id" : "04924", "city" : "CANAAN", "loc" : [ -69.54977700000001, 44.744976 ], "pop" : 1083, "state" : "ME" } +{ "_id" : "04925", "city" : "CARATUNK", "loc" : [ -69.93861699999999, 45.240999 ], "pop" : 124, "state" : "ME" } +{ "_id" : "04927", "city" : "CLINTON", "loc" : [ -69.52840500000001, 44.643995 ], "pop" : 4598, "state" : "ME" } +{ "_id" : "04928", "city" : "CORINNA", "loc" : [ -69.23234100000001, 44.926045 ], "pop" : 2363, "state" : "ME" } +{ "_id" : "04929", "city" : "DETROIT", "loc" : [ -69.316081, 44.777526 ], "pop" : 751, "state" : "ME" } +{ "_id" : "04930", "city" : "DEXTER", "loc" : [ -69.27965399999999, 45.020347 ], "pop" : 5875, "state" : "ME" } +{ "_id" : "04932", "city" : "DIXMONT", "loc" : [ -69.102532, 44.699078 ], "pop" : 1660, "state" : "ME" } +{ "_id" : "04936", "city" : "EUSTIS", "loc" : [ -70.457067, 45.162559 ], "pop" : 539, "state" : "ME" } +{ "_id" : "04937", "city" : "BENTON STATION", "loc" : [ -69.63321000000001, 44.609639 ], "pop" : 6718, "state" : "ME" } +{ "_id" : "04938", "city" : "FARMINGTON", "loc" : [ -70.13287800000001, 44.665339 ], "pop" : 9133, "state" : "ME" } +{ "_id" : "04941", "city" : "FREEDOM", "loc" : [ -69.319045, 44.463311 ], "pop" : 1775, "state" : "ME" } +{ "_id" : "04942", "city" : "WELLINGTON", "loc" : [ -69.56871, 45.003926 ], "pop" : 1217, "state" : "ME" } +{ "_id" : "04943", "city" : "HARTLAND", "loc" : [ -69.471754, 44.878155 ], "pop" : 1821, "state" : "ME" } +{ "_id" : "04945", "city" : "JACKMAN", "loc" : [ -70.249227, 45.635081 ], "pop" : 1207, "state" : "ME" } +{ "_id" : "04947", "city" : "KINGFIELD", "loc" : [ -70.183177, 44.985403 ], "pop" : 1501, "state" : "ME" } +{ "_id" : "04949", "city" : "LIBERTY", "loc" : [ -69.33058, 44.374085 ], "pop" : 790, "state" : "ME" } +{ "_id" : "04950", "city" : "MADISON", "loc" : [ -69.8449, 44.809623 ], "pop" : 4725, "state" : "ME" } +{ "_id" : "04951", "city" : "MONROE", "loc" : [ -69.03169, 44.592674 ], "pop" : 616, "state" : "ME" } +{ "_id" : "04952", "city" : "MORRILL", "loc" : [ -69.147105, 44.410693 ], "pop" : 1433, "state" : "ME" } +{ "_id" : "04953", "city" : "NEWPORT", "loc" : [ -69.267498, 44.839264 ], "pop" : 3272, "state" : "ME" } +{ "_id" : "04954", "city" : "NEW PORTLAND", "loc" : [ -70.092857, 44.885571 ], "pop" : 312, "state" : "ME" } +{ "_id" : "04955", "city" : "NEW SHARON", "loc" : [ -70.013927, 44.645803 ], "pop" : 1175, "state" : "ME" } +{ "_id" : "04956", "city" : "NEW VINEYARD", "loc" : [ -70.121953, 44.796658 ], "pop" : 661, "state" : "ME" } +{ "_id" : "04957", "city" : "NORRIDGEWOCK", "loc" : [ -69.830583, 44.68994 ], "pop" : 4520, "state" : "ME" } +{ "_id" : "04958", "city" : "NORTH ANSON", "loc" : [ -69.911946, 44.879662 ], "pop" : 1967, "state" : "ME" } +{ "_id" : "04961", "city" : "NORTH NEW PORTLA", "loc" : [ -70.043268, 44.95524 ], "pop" : 537, "state" : "ME" } +{ "_id" : "04962", "city" : "NORTH VASSALBORO", "loc" : [ -69.57808, 44.477748 ], "pop" : 2457, "state" : "ME" } +{ "_id" : "04963", "city" : "OAKLAND", "loc" : [ -69.740082, 44.51729 ], "pop" : 8695, "state" : "ME" } +{ "_id" : "04965", "city" : "PALMYRA", "loc" : [ -69.381084, 44.857578 ], "pop" : 1093, "state" : "ME" } +{ "_id" : "04966", "city" : "PHILLIPS", "loc" : [ -70.360079, 44.837486 ], "pop" : 1930, "state" : "ME" } +{ "_id" : "04967", "city" : "PITTSFIELD", "loc" : [ -69.40223, 44.787109 ], "pop" : 4719, "state" : "ME" } +{ "_id" : "04969", "city" : "PLYMOUTH", "loc" : [ -69.226562, 44.769938 ], "pop" : 974, "state" : "ME" } +{ "_id" : "04970", "city" : "RANGELEY", "loc" : [ -70.66584400000001, 44.96306 ], "pop" : 1391, "state" : "ME" } +{ "_id" : "04971", "city" : "SAINT ALBANS", "loc" : [ -69.399179, 44.929264 ], "pop" : 1575, "state" : "ME" } +{ "_id" : "04973", "city" : "SEARSMONT", "loc" : [ -69.219579, 44.377035 ], "pop" : 422, "state" : "ME" } +{ "_id" : "04974", "city" : "SEARSPORT", "loc" : [ -68.93112499999999, 44.487672 ], "pop" : 1927, "state" : "ME" } +{ "_id" : "04976", "city" : "SKOWHEGAN", "loc" : [ -69.697571, 44.777212 ], "pop" : 10166, "state" : "ME" } +{ "_id" : "04978", "city" : "SMITHFIELD", "loc" : [ -69.807496, 44.630107 ], "pop" : 715, "state" : "ME" } +{ "_id" : "04979", "city" : "SOLON", "loc" : [ -69.833018, 44.967605 ], "pop" : 1236, "state" : "ME" } +{ "_id" : "04981", "city" : "STOCKTON SPRINGS", "loc" : [ -68.855974, 44.514056 ], "pop" : 1925, "state" : "ME" } +{ "_id" : "04982", "city" : "STRATTON", "loc" : [ -70.431928, 45.123197 ], "pop" : 262, "state" : "ME" } +{ "_id" : "04983", "city" : "STRONG", "loc" : [ -70.222054, 44.82236 ], "pop" : 1631, "state" : "ME" } +{ "_id" : "04984", "city" : "TEMPLE", "loc" : [ -70.24263500000001, 44.695417 ], "pop" : 560, "state" : "ME" } +{ "_id" : "04985", "city" : "WEST FORKS", "loc" : [ -69.98405700000001, 45.383905 ], "pop" : 86, "state" : "ME" } +{ "_id" : "04986", "city" : "THORNDIKE", "loc" : [ -69.24865800000001, 44.574406 ], "pop" : 962, "state" : "ME" } +{ "_id" : "04987", "city" : "TROY", "loc" : [ -69.25488, 44.675657 ], "pop" : 802, "state" : "ME" } +{ "_id" : "04988", "city" : "UNITY", "loc" : [ -69.332778, 44.600676 ], "pop" : 1817, "state" : "ME" } +{ "_id" : "04989", "city" : "VASSALBORO", "loc" : [ -69.651904, 44.440455 ], "pop" : 1929, "state" : "ME" } +{ "_id" : "05001", "city" : "WHITE RIVER JUNC", "loc" : [ -72.350351, 43.663431 ], "pop" : 9500, "state" : "VT" } +{ "_id" : "05032", "city" : "BETHEL", "loc" : [ -72.652807, 43.819464 ], "pop" : 2725, "state" : "VT" } +{ "_id" : "05033", "city" : "BRADFORD", "loc" : [ -72.140638, 44.0006 ], "pop" : 2480, "state" : "VT" } +{ "_id" : "05034", "city" : "BRIDGEWATER", "loc" : [ -72.646704, 43.580428 ], "pop" : 130, "state" : "VT" } +{ "_id" : "05035", "city" : "BRIDGEWATER CORN", "loc" : [ -72.68221200000001, 43.602147 ], "pop" : 662, "state" : "VT" } +{ "_id" : "05036", "city" : "BROOKFIELD", "loc" : [ -72.595259, 44.032083 ], "pop" : 453, "state" : "VT" } +{ "_id" : "05037", "city" : "BROWNSVILLE", "loc" : [ -72.494405, 43.464584 ], "pop" : 415, "state" : "VT" } +{ "_id" : "05038", "city" : "CHELSEA", "loc" : [ -72.479303, 44.003931 ], "pop" : 1022, "state" : "VT" } +{ "_id" : "05039", "city" : "CORINTH", "loc" : [ -72.282241, 44.032533 ], "pop" : 1035, "state" : "VT" } +{ "_id" : "05040", "city" : "EAST CORINTH", "loc" : [ -72.215144, 44.061851 ], "pop" : 279, "state" : "VT" } +{ "_id" : "05041", "city" : "EAST RANDOLPH", "loc" : [ -72.54874599999999, 43.955297 ], "pop" : 322, "state" : "VT" } +{ "_id" : "05042", "city" : "RYEGATE", "loc" : [ -72.072669, 44.193453 ], "pop" : 328, "state" : "VT" } +{ "_id" : "05043", "city" : "EAST THETFORD", "loc" : [ -72.19668, 43.825757 ], "pop" : 657, "state" : "VT" } +{ "_id" : "05045", "city" : "FAIRLEE", "loc" : [ -72.190214, 43.90105 ], "pop" : 1631, "state" : "VT" } +{ "_id" : "05046", "city" : "GROTON", "loc" : [ -72.21754799999999, 44.220435 ], "pop" : 862, "state" : "VT" } +{ "_id" : "05048", "city" : "HARTLAND", "loc" : [ -72.41310300000001, 43.570764 ], "pop" : 1730, "state" : "VT" } +{ "_id" : "05051", "city" : "NEWBURY", "loc" : [ -72.107231, 44.096555 ], "pop" : 1488, "state" : "VT" } +{ "_id" : "05052", "city" : "NORTH HARTLAND", "loc" : [ -72.352591, 43.596721 ], "pop" : 429, "state" : "VT" } +{ "_id" : "05053", "city" : "NORTH POMFRET", "loc" : [ -72.494287, 43.720401 ], "pop" : 254, "state" : "VT" } +{ "_id" : "05055", "city" : "NORWICH", "loc" : [ -72.30162, 43.740373 ], "pop" : 2969, "state" : "VT" } +{ "_id" : "05056", "city" : "PLYMOUTH", "loc" : [ -72.710655, 43.498653 ], "pop" : 319, "state" : "VT" } +{ "_id" : "05058", "city" : "POST MILLS", "loc" : [ -72.26203099999999, 43.893288 ], "pop" : 511, "state" : "VT" } +{ "_id" : "05060", "city" : "RANDOLPH", "loc" : [ -72.67258, 43.944399 ], "pop" : 4421, "state" : "VT" } +{ "_id" : "05061", "city" : "RANDOLPH CENTER", "loc" : [ -72.596975, 43.9379 ], "pop" : 1567, "state" : "VT" } +{ "_id" : "05062", "city" : "READING", "loc" : [ -72.570446, 43.47935 ], "pop" : 614, "state" : "VT" } +{ "_id" : "05065", "city" : "SHARON", "loc" : [ -72.424283, 43.774843 ], "pop" : 599, "state" : "VT" } +{ "_id" : "05067", "city" : "SOUTH POMFRET", "loc" : [ -72.534907, 43.679665 ], "pop" : 281, "state" : "VT" } +{ "_id" : "05068", "city" : "SOUTH ROYALTON", "loc" : [ -72.523228, 43.808931 ], "pop" : 3169, "state" : "VT" } +{ "_id" : "05069", "city" : "SOUTH RYEGATE", "loc" : [ -72.129558, 44.211075 ], "pop" : 730, "state" : "VT" } +{ "_id" : "05070", "city" : "SOUTH STRAFFORD", "loc" : [ -72.36995899999999, 43.828238 ], "pop" : 331, "state" : "VT" } +{ "_id" : "05071", "city" : "SOUTH WOODSTOCK", "loc" : [ -72.538383, 43.560137 ], "pop" : 406, "state" : "VT" } +{ "_id" : "05072", "city" : "STRAFFORD", "loc" : [ -72.36363, 43.872306 ], "pop" : 554, "state" : "VT" } +{ "_id" : "05073", "city" : "TAFTSVILLE", "loc" : [ -72.467331, 43.629819 ], "pop" : 35, "state" : "VT" } +{ "_id" : "05075", "city" : "THETFORD CENTER", "loc" : [ -72.266204, 43.814883 ], "pop" : 1014, "state" : "VT" } +{ "_id" : "05077", "city" : "TUNBRIDGE", "loc" : [ -72.478578, 43.9169 ], "pop" : 1352, "state" : "VT" } +{ "_id" : "05079", "city" : "VERSHIRE", "loc" : [ -72.31901499999999, 43.961811 ], "pop" : 565, "state" : "VT" } +{ "_id" : "05081", "city" : "WELLS RIVER", "loc" : [ -72.052958, 44.152438 ], "pop" : 473, "state" : "VT" } +{ "_id" : "05083", "city" : "WEST FAIRLEE", "loc" : [ -72.26163, 43.92232 ], "pop" : 153, "state" : "VT" } +{ "_id" : "05084", "city" : "WEST HARTFORD", "loc" : [ -72.44461800000001, 43.716068 ], "pop" : 135, "state" : "VT" } +{ "_id" : "05086", "city" : "WEST TOPSHAM", "loc" : [ -72.270051, 44.119925 ], "pop" : 1050, "state" : "VT" } +{ "_id" : "05089", "city" : "WINDSOR", "loc" : [ -72.41099800000001, 43.476032 ], "pop" : 5406, "state" : "VT" } +{ "_id" : "05091", "city" : "WOODSTOCK", "loc" : [ -72.538455, 43.62482 ], "pop" : 3742, "state" : "VT" } +{ "_id" : "05101", "city" : "BELLOWS FALLS", "loc" : [ -72.466373, 43.148198 ], "pop" : 5433, "state" : "VT" } +{ "_id" : "05141", "city" : "CAMBRIDGEPORT", "loc" : [ -72.565511, 43.153363 ], "pop" : 118, "state" : "VT" } +{ "_id" : "05142", "city" : "CAVENDISH", "loc" : [ -72.609247, 43.376621 ], "pop" : 258, "state" : "VT" } +{ "_id" : "05143", "city" : "CHESTER", "loc" : [ -72.60312500000001, 43.283124 ], "pop" : 3449, "state" : "VT" } +{ "_id" : "05146", "city" : "GRAFTON", "loc" : [ -72.597229, 43.160095 ], "pop" : 823, "state" : "VT" } +{ "_id" : "05148", "city" : "BROMLEY MTN", "loc" : [ -72.801756, 43.223961 ], "pop" : 986, "state" : "VT" } +{ "_id" : "05149", "city" : "LUDLOW", "loc" : [ -72.70018399999999, 43.392909 ], "pop" : 2420, "state" : "VT" } +{ "_id" : "05150", "city" : "NORTH SPRINGFIEL", "loc" : [ -72.529096, 43.335452 ], "pop" : 824, "state" : "VT" } +{ "_id" : "05151", "city" : "PERKINSVILLE", "loc" : [ -72.50381299999999, 43.387885 ], "pop" : 1181, "state" : "VT" } +{ "_id" : "05152", "city" : "PERU", "loc" : [ -72.886797, 43.256532 ], "pop" : 458, "state" : "VT" } +{ "_id" : "05153", "city" : "PROCTORSVILLE", "loc" : [ -72.61962, 43.4005 ], "pop" : 1065, "state" : "VT" } +{ "_id" : "05154", "city" : "SAXTONS RIVER", "loc" : [ -72.508107, 43.137861 ], "pop" : 681, "state" : "VT" } +{ "_id" : "05155", "city" : "SOUTH LONDONDERR", "loc" : [ -72.811787, 43.183082 ], "pop" : 546, "state" : "VT" } +{ "_id" : "05156", "city" : "SPRINGFIELD", "loc" : [ -72.477769, 43.303433 ], "pop" : 9231, "state" : "VT" } +{ "_id" : "05161", "city" : "WESTON", "loc" : [ -72.79352299999999, 43.29409 ], "pop" : 488, "state" : "VT" } +{ "_id" : "05201", "city" : "BENNINGTON", "loc" : [ -73.19232100000001, 42.882658 ], "pop" : 14757, "state" : "VT" } +{ "_id" : "05250", "city" : "ARLINGTON", "loc" : [ -73.159364, 43.085681 ], "pop" : 3006, "state" : "VT" } +{ "_id" : "05251", "city" : "DORSET", "loc" : [ -73.07660300000001, 43.263561 ], "pop" : 1402, "state" : "VT" } +{ "_id" : "05252", "city" : "EAST ARLINGTON", "loc" : [ -73.138904, 43.063801 ], "pop" : 443, "state" : "VT" } +{ "_id" : "05253", "city" : "EAST DORSET", "loc" : [ -73.008146, 43.236982 ], "pop" : 516, "state" : "VT" } +{ "_id" : "05255", "city" : "MANCHESTER CENTE", "loc" : [ -73.052313, 43.175223 ], "pop" : 3622, "state" : "VT" } +{ "_id" : "05257", "city" : "NORTH BENNINGTON", "loc" : [ -73.237531, 42.92385 ], "pop" : 2037, "state" : "VT" } +{ "_id" : "05260", "city" : "NORTH POWNAL", "loc" : [ -73.25342999999999, 42.809775 ], "pop" : 523, "state" : "VT" } +{ "_id" : "05261", "city" : "POWNAL", "loc" : [ -73.21624, 42.787955 ], "pop" : 2962, "state" : "VT" } +{ "_id" : "05262", "city" : "SHAFTSBURY", "loc" : [ -73.21659099999999, 42.96144 ], "pop" : 3363, "state" : "VT" } +{ "_id" : "05301", "city" : "BRATTLEBORO", "loc" : [ -72.593322, 42.857353 ], "pop" : 17522, "state" : "VT" } +{ "_id" : "05340", "city" : "BONDVILLE", "loc" : [ -72.912768, 43.161831 ], "pop" : 482, "state" : "VT" } +{ "_id" : "05341", "city" : "EAST DOVER", "loc" : [ -72.78303200000001, 42.950508 ], "pop" : 253, "state" : "VT" } +{ "_id" : "05342", "city" : "JACKSONVILLE", "loc" : [ -72.807121, 42.777752 ], "pop" : 406, "state" : "VT" } +{ "_id" : "05343", "city" : "JAMAICA", "loc" : [ -72.794409, 43.104235 ], "pop" : 603, "state" : "VT" } +{ "_id" : "05345", "city" : "NEWFANE", "loc" : [ -72.678078, 42.97043 ], "pop" : 1389, "state" : "VT" } +{ "_id" : "05346", "city" : "PUTNEY", "loc" : [ -72.512272, 43.035561 ], "pop" : 4971, "state" : "VT" } +{ "_id" : "05350", "city" : "READSBORO", "loc" : [ -72.960886, 42.78367 ], "pop" : 762, "state" : "VT" } +{ "_id" : "05352", "city" : "STAMFORD", "loc" : [ -73.069068, 42.76962 ], "pop" : 773, "state" : "VT" } +{ "_id" : "05353", "city" : "TOWNSHEND", "loc" : [ -72.668676, 43.062174 ], "pop" : 920, "state" : "VT" } +{ "_id" : "05354", "city" : "VERNON", "loc" : [ -72.51154699999999, 42.756468 ], "pop" : 1850, "state" : "VT" } +{ "_id" : "05355", "city" : "WARDSBORO", "loc" : [ -72.807687, 43.032649 ], "pop" : 573, "state" : "VT" } +{ "_id" : "05356", "city" : "MOUNT SNOW", "loc" : [ -72.854235, 42.956029 ], "pop" : 743, "state" : "VT" } +{ "_id" : "05358", "city" : "WEST HALIFAX", "loc" : [ -72.750142, 42.776103 ], "pop" : 202, "state" : "VT" } +{ "_id" : "05359", "city" : "WEST TOWNSHEND", "loc" : [ -72.720985, 43.130044 ], "pop" : 402, "state" : "VT" } +{ "_id" : "05360", "city" : "WEST WARDSBORO", "loc" : [ -72.880537, 43.047221 ], "pop" : 228, "state" : "VT" } +{ "_id" : "05361", "city" : "WHITINGHAM", "loc" : [ -72.85600100000001, 42.790071 ], "pop" : 921, "state" : "VT" } +{ "_id" : "05362", "city" : "WILLIAMSVILLE", "loc" : [ -72.658406, 42.948151 ], "pop" : 166, "state" : "VT" } +{ "_id" : "05363", "city" : "WILMINGTON", "loc" : [ -72.861316, 42.881216 ], "pop" : 2053, "state" : "VT" } +{ "_id" : "05401", "city" : "BURLINGTON", "loc" : [ -73.219875, 44.484023 ], "pop" : 39127, "state" : "VT" } +{ "_id" : "05403", "city" : "SOUTH BURLINGTON", "loc" : [ -73.17961699999999, 44.451324 ], "pop" : 12809, "state" : "VT" } +{ "_id" : "05404", "city" : "WINOOSKI", "loc" : [ -73.18741300000001, 44.494898 ], "pop" : 6649, "state" : "VT" } +{ "_id" : "05405", "city" : "UNIV OF VERMONT", "loc" : [ -73.2002, 44.477733 ], "pop" : 0, "state" : "VT" } +{ "_id" : "05440", "city" : "ALBURG", "loc" : [ -73.280963, 44.968454 ], "pop" : 1362, "state" : "VT" } +{ "_id" : "05441", "city" : "BAKERSFIELD", "loc" : [ -72.796834, 44.790518 ], "pop" : 973, "state" : "VT" } +{ "_id" : "05443", "city" : "BRISTOL", "loc" : [ -73.071742, 44.146031 ], "pop" : 6685, "state" : "VT" } +{ "_id" : "05444", "city" : "CAMBRIDGE", "loc" : [ -72.865728, 44.651013 ], "pop" : 3491, "state" : "VT" } +{ "_id" : "05445", "city" : "CHARLOTTE", "loc" : [ -73.227969, 44.311277 ], "pop" : 3009, "state" : "VT" } +{ "_id" : "05446", "city" : "COLCHESTER", "loc" : [ -73.20221600000001, 44.535956 ], "pop" : 14731, "state" : "VT" } +{ "_id" : "05447", "city" : "EAST BERKSHIRE", "loc" : [ -72.706564, 44.929798 ], "pop" : 94, "state" : "VT" } +{ "_id" : "05448", "city" : "EAST FAIRFIELD", "loc" : [ -72.910995, 44.801805 ], "pop" : 1076, "state" : "VT" } +{ "_id" : "05450", "city" : "ENOSBURG FALLS", "loc" : [ -72.791037, 44.898491 ], "pop" : 2268, "state" : "VT" } +{ "_id" : "05452", "city" : "ESSEX JUNCTION", "loc" : [ -73.090644, 44.503466 ], "pop" : 17050, "state" : "VT" } +{ "_id" : "05454", "city" : "FAIRFAX", "loc" : [ -73.024078, 44.692387 ], "pop" : 2990, "state" : "VT" } +{ "_id" : "05455", "city" : "FAIRFIELD", "loc" : [ -73.022187, 44.784087 ], "pop" : 359, "state" : "VT" } +{ "_id" : "05456", "city" : "FERRISBURG", "loc" : [ -73.25857499999999, 44.212822 ], "pop" : 951, "state" : "VT" } +{ "_id" : "05457", "city" : "FRANKLIN", "loc" : [ -72.903694, 44.961408 ], "pop" : 1475, "state" : "VT" } +{ "_id" : "05458", "city" : "GRAND ISLE", "loc" : [ -73.30561, 44.719711 ], "pop" : 1590, "state" : "VT" } +{ "_id" : "05459", "city" : "HIGHGATE CENTER", "loc" : [ -73.015468, 44.940395 ], "pop" : 1567, "state" : "VT" } +{ "_id" : "05461", "city" : "HINESBURG", "loc" : [ -73.097955, 44.334621 ], "pop" : 3187, "state" : "VT" } +{ "_id" : "05462", "city" : "HUNTINGTON", "loc" : [ -72.996432, 44.322655 ], "pop" : 2223, "state" : "VT" } +{ "_id" : "05463", "city" : "ISLE LA MOTTE", "loc" : [ -73.339095, 44.874829 ], "pop" : 408, "state" : "VT" } +{ "_id" : "05464", "city" : "SMUGGLERS NOTCH", "loc" : [ -72.78057699999999, 44.662499 ], "pop" : 300, "state" : "VT" } +{ "_id" : "05465", "city" : "JERICHO CENTER", "loc" : [ -72.979398, 44.484318 ], "pop" : 3449, "state" : "VT" } +{ "_id" : "05468", "city" : "MILTON", "loc" : [ -73.131692, 44.648275 ], "pop" : 10627, "state" : "VT" } +{ "_id" : "05471", "city" : "MONTGOMERY CENTE", "loc" : [ -72.599352, 44.874606 ], "pop" : 603, "state" : "VT" } +{ "_id" : "05472", "city" : "NEW HAVEN", "loc" : [ -73.17346999999999, 44.112575 ], "pop" : 858, "state" : "VT" } +{ "_id" : "05473", "city" : "NORTH FERRISBURG", "loc" : [ -73.203254, 44.251461 ], "pop" : 1126, "state" : "VT" } +{ "_id" : "05474", "city" : "NORTH HERO", "loc" : [ -73.28416900000001, 44.829392 ], "pop" : 502, "state" : "VT" } +{ "_id" : "05476", "city" : "RICHFORD", "loc" : [ -72.690472, 44.971453 ], "pop" : 3794, "state" : "VT" } +{ "_id" : "05477", "city" : "BOLTON VALLEY", "loc" : [ -72.993256, 44.399846 ], "pop" : 3758, "state" : "VT" } +{ "_id" : "05478", "city" : "SAINT ALBANS", "loc" : [ -73.08902500000001, 44.811138 ], "pop" : 13555, "state" : "VT" } +{ "_id" : "05482", "city" : "SHELBURNE", "loc" : [ -73.217124, 44.389967 ], "pop" : 5871, "state" : "VT" } +{ "_id" : "05483", "city" : "SHELDON", "loc" : [ -72.952989, 44.887167 ], "pop" : 1556, "state" : "VT" } +{ "_id" : "05486", "city" : "SOUTH HERO", "loc" : [ -73.31134400000001, 44.640044 ], "pop" : 1456, "state" : "VT" } +{ "_id" : "05487", "city" : "STARKSBORO", "loc" : [ -73.0157, 44.2261 ], "pop" : 1020, "state" : "VT" } +{ "_id" : "05488", "city" : "SWANTON", "loc" : [ -73.12112399999999, 44.916754 ], "pop" : 6570, "state" : "VT" } +{ "_id" : "05489", "city" : "UNDERHILL", "loc" : [ -72.925845, 44.539069 ], "pop" : 3637, "state" : "VT" } +{ "_id" : "05491", "city" : "VERGENNES", "loc" : [ -73.279293, 44.132569 ], "pop" : 6041, "state" : "VT" } +{ "_id" : "05492", "city" : "WATERVILLE", "loc" : [ -72.759557, 44.712375 ], "pop" : 532, "state" : "VT" } +{ "_id" : "05494", "city" : "WESTFORD", "loc" : [ -73.006021, 44.618191 ], "pop" : 1102, "state" : "VT" } +{ "_id" : "05495", "city" : "WILLISTON", "loc" : [ -73.095704, 44.436745 ], "pop" : 5592, "state" : "VT" } +{ "_id" : "05602", "city" : "MONTPELIER", "loc" : [ -72.576992, 44.264082 ], "pop" : 12475, "state" : "VT" } +{ "_id" : "05640", "city" : "ADAMANT", "loc" : [ -72.504649, 44.35747 ], "pop" : 456, "state" : "VT" } +{ "_id" : "05641", "city" : "BARRE", "loc" : [ -72.493619, 44.194522 ], "pop" : 14994, "state" : "VT" } +{ "_id" : "05647", "city" : "CABOT", "loc" : [ -72.306443, 44.404215 ], "pop" : 1043, "state" : "VT" } +{ "_id" : "05648", "city" : "CALAIS", "loc" : [ -72.474113, 44.393438 ], "pop" : 319, "state" : "VT" } +{ "_id" : "05649", "city" : "EAST BARRE", "loc" : [ -72.446003, 44.158277 ], "pop" : 381, "state" : "VT" } +{ "_id" : "05650", "city" : "EAST CALAIS", "loc" : [ -72.439829, 44.355599 ], "pop" : 746, "state" : "VT" } +{ "_id" : "05651", "city" : "EAST MONTPELIER", "loc" : [ -72.492636, 44.282844 ], "pop" : 1018, "state" : "VT" } +{ "_id" : "05652", "city" : "EDEN", "loc" : [ -72.58629999999999, 44.734267 ], "pop" : 913, "state" : "VT" } +{ "_id" : "05653", "city" : "EDEN MILLS", "loc" : [ -72.513447, 44.693123 ], "pop" : 155, "state" : "VT" } +{ "_id" : "05654", "city" : "GRANITEVILLE", "loc" : [ -72.48452899999999, 44.157326 ], "pop" : 2321, "state" : "VT" } +{ "_id" : "05655", "city" : "HYDE PARK", "loc" : [ -72.594971, 44.622453 ], "pop" : 2094, "state" : "VT" } +{ "_id" : "05656", "city" : "JOHNSON", "loc" : [ -72.671154, 44.64204 ], "pop" : 3156, "state" : "VT" } +{ "_id" : "05658", "city" : "MARSHFIELD", "loc" : [ -72.374994, 44.321841 ], "pop" : 1331, "state" : "VT" } +{ "_id" : "05660", "city" : "MORETOWN", "loc" : [ -72.74939500000001, 44.259602 ], "pop" : 1896, "state" : "VT" } +{ "_id" : "05661", "city" : "MORRISVILLE", "loc" : [ -72.602625, 44.554335 ], "pop" : 4935, "state" : "VT" } +{ "_id" : "05663", "city" : "RIVERTON", "loc" : [ -72.659795, 44.149961 ], "pop" : 6245, "state" : "VT" } +{ "_id" : "05666", "city" : "NORTH MONTPELIER", "loc" : [ -72.482119, 44.256612 ], "pop" : 469, "state" : "VT" } +{ "_id" : "05667", "city" : "PLAINFIELD", "loc" : [ -72.42243000000001, 44.262164 ], "pop" : 1304, "state" : "VT" } +{ "_id" : "05669", "city" : "ROXBURY", "loc" : [ -72.720151, 44.084571 ], "pop" : 575, "state" : "VT" } +{ "_id" : "05672", "city" : "STOWE", "loc" : [ -72.69228200000001, 44.469512 ], "pop" : 3433, "state" : "VT" } +{ "_id" : "05673", "city" : "WAITSFIELD", "loc" : [ -72.828321, 44.188917 ], "pop" : 1751, "state" : "VT" } +{ "_id" : "05674", "city" : "SUGARBUSH VALLEY", "loc" : [ -72.848179, 44.114222 ], "pop" : 1172, "state" : "VT" } +{ "_id" : "05675", "city" : "WASHGTIN", "loc" : [ -72.430002, 44.086448 ], "pop" : 1022, "state" : "VT" } +{ "_id" : "05676", "city" : "WATERBURY", "loc" : [ -72.779768, 44.345103 ], "pop" : 4751, "state" : "VT" } +{ "_id" : "05677", "city" : "WATERBURY CENTER", "loc" : [ -72.708006, 44.382797 ], "pop" : 1645, "state" : "VT" } +{ "_id" : "05679", "city" : "WILLIAMSTOWN", "loc" : [ -72.53811, 44.118191 ], "pop" : 2964, "state" : "VT" } +{ "_id" : "05680", "city" : "WOLCOTT", "loc" : [ -72.484416, 44.555753 ], "pop" : 1850, "state" : "VT" } +{ "_id" : "05681", "city" : "WOODBURY", "loc" : [ -72.417766, 44.432507 ], "pop" : 766, "state" : "VT" } +{ "_id" : "05682", "city" : "WORCESTER", "loc" : [ -72.560925, 44.394389 ], "pop" : 906, "state" : "VT" } +{ "_id" : "05701", "city" : "RUTLAND", "loc" : [ -72.97077299999999, 43.614131 ], "pop" : 22576, "state" : "VT" } +{ "_id" : "05730", "city" : "BELMONT", "loc" : [ -72.825701, 43.428441 ], "pop" : 223, "state" : "VT" } +{ "_id" : "05732", "city" : "HUBBARDTON", "loc" : [ -73.206424, 43.622413 ], "pop" : 914, "state" : "VT" } +{ "_id" : "05733", "city" : "BRANDON", "loc" : [ -73.088182, 43.806467 ], "pop" : 5027, "state" : "VT" } +{ "_id" : "05734", "city" : "BRIDPORT", "loc" : [ -73.34755699999999, 43.95383 ], "pop" : 641, "state" : "VT" } +{ "_id" : "05735", "city" : "CASTLETON", "loc" : [ -73.17079699999999, 43.622312 ], "pop" : 2897, "state" : "VT" } +{ "_id" : "05736", "city" : "CENTER RUTLAND", "loc" : [ -73.016986, 43.602345 ], "pop" : 299, "state" : "VT" } +{ "_id" : "05737", "city" : "CHITTENDEN", "loc" : [ -72.936001, 43.703382 ], "pop" : 526, "state" : "VT" } +{ "_id" : "05738", "city" : "CUTTINGSVILLE", "loc" : [ -72.869089, 43.522084 ], "pop" : 1101, "state" : "VT" } +{ "_id" : "05739", "city" : "DANBY", "loc" : [ -73.01285, 43.358341 ], "pop" : 1170, "state" : "VT" } +{ "_id" : "05742", "city" : "EAST WALLINGFORD", "loc" : [ -72.88437500000001, 43.446063 ], "pop" : 588, "state" : "VT" } +{ "_id" : "05743", "city" : "FAIR HAVEN", "loc" : [ -73.27006799999999, 43.62345 ], "pop" : 4283, "state" : "VT" } +{ "_id" : "05744", "city" : "FLORENCE", "loc" : [ -73.078988, 43.709294 ], "pop" : 257, "state" : "VT" } +{ "_id" : "05746", "city" : "GAYSVILLE", "loc" : [ -72.731149, 43.752912 ], "pop" : 198, "state" : "VT" } +{ "_id" : "05747", "city" : "GRANVILLE", "loc" : [ -72.8245, 43.984912 ], "pop" : 309, "state" : "VT" } +{ "_id" : "05748", "city" : "HANCOCK", "loc" : [ -72.913285, 43.912525 ], "pop" : 98, "state" : "VT" } +{ "_id" : "05751", "city" : "KILLINGTON", "loc" : [ -72.79631000000001, 43.663364 ], "pop" : 738, "state" : "VT" } +{ "_id" : "05753", "city" : "BREAD LOAF", "loc" : [ -73.16613, 44.007042 ], "pop" : 9990, "state" : "VT" } +{ "_id" : "05757", "city" : "MIDDLETOWN SPRIN", "loc" : [ -73.11452, 43.484864 ], "pop" : 966, "state" : "VT" } +{ "_id" : "05758", "city" : "MOUNT HOLLY", "loc" : [ -72.795562, 43.44865 ], "pop" : 693, "state" : "VT" } +{ "_id" : "05759", "city" : "NORTH CLARENDON", "loc" : [ -72.956096, 43.552208 ], "pop" : 2517, "state" : "VT" } +{ "_id" : "05760", "city" : "ORWELL", "loc" : [ -73.294855, 43.783722 ], "pop" : 1315, "state" : "VT" } +{ "_id" : "05761", "city" : "PAWLET", "loc" : [ -73.14440399999999, 43.358679 ], "pop" : 935, "state" : "VT" } +{ "_id" : "05762", "city" : "PITTSFIELD", "loc" : [ -72.853376, 43.753823 ], "pop" : 450, "state" : "VT" } +{ "_id" : "05763", "city" : "PITTSFORD", "loc" : [ -73.013492, 43.71524 ], "pop" : 2864, "state" : "VT" } +{ "_id" : "05764", "city" : "POULTNEY", "loc" : [ -73.225281, 43.53321 ], "pop" : 4012, "state" : "VT" } +{ "_id" : "05765", "city" : "PROCTOR", "loc" : [ -73.03481600000001, 43.657951 ], "pop" : 1868, "state" : "VT" } +{ "_id" : "05766", "city" : "RIPTON", "loc" : [ -73.01873999999999, 43.992862 ], "pop" : 433, "state" : "VT" } +{ "_id" : "05767", "city" : "ROCHESTER", "loc" : [ -72.815917, 43.880382 ], "pop" : 1551, "state" : "VT" } +{ "_id" : "05769", "city" : "SALISBURY", "loc" : [ -73.100793, 43.90172 ], "pop" : 1885, "state" : "VT" } +{ "_id" : "05770", "city" : "SHOREHAM", "loc" : [ -73.305385, 43.886214 ], "pop" : 946, "state" : "VT" } +{ "_id" : "05772", "city" : "STOCKBRIDGE", "loc" : [ -72.78139400000001, 43.773808 ], "pop" : 124, "state" : "VT" } +{ "_id" : "05773", "city" : "WALLINGFORD", "loc" : [ -72.98772200000001, 43.4573 ], "pop" : 2172, "state" : "VT" } +{ "_id" : "05774", "city" : "WELLS", "loc" : [ -73.202684, 43.430456 ], "pop" : 837, "state" : "VT" } +{ "_id" : "05775", "city" : "WEST PAWLET", "loc" : [ -73.23132699999999, 43.36673 ], "pop" : 604, "state" : "VT" } +{ "_id" : "05776", "city" : "WEST RUPERT", "loc" : [ -73.20284700000001, 43.261792 ], "pop" : 654, "state" : "VT" } +{ "_id" : "05777", "city" : "WEST RUTLAND", "loc" : [ -73.04242000000001, 43.578072 ], "pop" : 3415, "state" : "VT" } +{ "_id" : "05778", "city" : "LEICESTER JUNCTI", "loc" : [ -73.213312, 43.874972 ], "pop" : 615, "state" : "VT" } +{ "_id" : "05819", "city" : "SAINT JOHNSBURY", "loc" : [ -72.005062, 44.427195 ], "pop" : 8797, "state" : "VT" } +{ "_id" : "05820", "city" : "ALBANY", "loc" : [ -72.34181, 44.734427 ], "pop" : 782, "state" : "VT" } +{ "_id" : "05821", "city" : "BARNET", "loc" : [ -72.078326, 44.317923 ], "pop" : 1415, "state" : "VT" } +{ "_id" : "05822", "city" : "BARTON", "loc" : [ -72.160005, 44.739465 ], "pop" : 1270, "state" : "VT" } +{ "_id" : "05824", "city" : "CONCORD", "loc" : [ -71.867554, 44.446055 ], "pop" : 1242, "state" : "VT" } +{ "_id" : "05825", "city" : "COVENTRY", "loc" : [ -72.254471, 44.880853 ], "pop" : 722, "state" : "VT" } +{ "_id" : "05826", "city" : "CRAFTSBURY", "loc" : [ -72.366007, 44.64341 ], "pop" : 623, "state" : "VT" } +{ "_id" : "05827", "city" : "CRAFTSBURY COMMO", "loc" : [ -72.41457800000001, 44.652917 ], "pop" : 399, "state" : "VT" } +{ "_id" : "05828", "city" : "DANVILLE", "loc" : [ -72.113319, 44.433241 ], "pop" : 1482, "state" : "VT" } +{ "_id" : "05829", "city" : "DERBY", "loc" : [ -72.13755500000001, 44.950182 ], "pop" : 2607, "state" : "VT" } +{ "_id" : "05830", "city" : "DERBY LINE", "loc" : [ -72.082367, 44.990183 ], "pop" : 2040, "state" : "VT" } +{ "_id" : "05832", "city" : "EAST BURKE", "loc" : [ -71.93567400000001, 44.607849 ], "pop" : 875, "state" : "VT" } +{ "_id" : "05833", "city" : "EAST CHARLESTON", "loc" : [ -71.97627, 44.829896 ], "pop" : 246, "state" : "VT" } +{ "_id" : "05836", "city" : "EAST HARDWICK", "loc" : [ -72.30335100000001, 44.528833 ], "pop" : 493, "state" : "VT" } +{ "_id" : "05837", "city" : "EAST HAVEN", "loc" : [ -71.867491, 44.651724 ], "pop" : 269, "state" : "VT" } +{ "_id" : "05839", "city" : "GLOVER", "loc" : [ -72.203819, 44.719979 ], "pop" : 795, "state" : "VT" } +{ "_id" : "05841", "city" : "GREENSBORO", "loc" : [ -72.285017, 44.595069 ], "pop" : 461, "state" : "VT" } +{ "_id" : "05842", "city" : "GREENSBORO BEND", "loc" : [ -72.252478, 44.548488 ], "pop" : 405, "state" : "VT" } +{ "_id" : "05843", "city" : "HARDWICK", "loc" : [ -72.36381799999999, 44.507026 ], "pop" : 2450, "state" : "VT" } +{ "_id" : "05845", "city" : "IRASBURG", "loc" : [ -72.276269, 44.808056 ], "pop" : 907, "state" : "VT" } +{ "_id" : "05846", "city" : "ISLAND POND", "loc" : [ -71.88396400000001, 44.809452 ], "pop" : 1585, "state" : "VT" } +{ "_id" : "05847", "city" : "LOWELL", "loc" : [ -72.450132, 44.796107 ], "pop" : 594, "state" : "VT" } +{ "_id" : "05850", "city" : "LYNDON CENTER", "loc" : [ -72.03106200000001, 44.54719 ], "pop" : 519, "state" : "VT" } +{ "_id" : "05851", "city" : "LYNDONVILLE", "loc" : [ -72.009168, 44.540766 ], "pop" : 5417, "state" : "VT" } +{ "_id" : "05853", "city" : "MORGAN CTR", "loc" : [ -71.994052, 44.90659 ], "pop" : 497, "state" : "VT" } +{ "_id" : "05855", "city" : "NEWPORT", "loc" : [ -72.20650500000001, 44.939344 ], "pop" : 4773, "state" : "VT" } +{ "_id" : "05857", "city" : "NEWPORT CENTER", "loc" : [ -72.29741199999999, 44.944175 ], "pop" : 1367, "state" : "VT" } +{ "_id" : "05858", "city" : "NORTH CONCORD", "loc" : [ -71.78666200000001, 44.550099 ], "pop" : 191, "state" : "VT" } +{ "_id" : "05859", "city" : "JAY PEAK", "loc" : [ -72.45723099999999, 44.961861 ], "pop" : 370, "state" : "VT" } +{ "_id" : "05860", "city" : "ORLEANS", "loc" : [ -72.165328, 44.80544 ], "pop" : 2467, "state" : "VT" } +{ "_id" : "05862", "city" : "PEACHAM", "loc" : [ -72.17703899999999, 44.335563 ], "pop" : 627, "state" : "VT" } +{ "_id" : "05866", "city" : "SHEFFIELD", "loc" : [ -72.12392699999999, 44.61784 ], "pop" : 600, "state" : "VT" } +{ "_id" : "05867", "city" : "SUTTON", "loc" : [ -72.02113300000001, 44.646543 ], "pop" : 854, "state" : "VT" } +{ "_id" : "05868", "city" : "TROY", "loc" : [ -72.39380800000001, 44.959381 ], "pop" : 1609, "state" : "VT" } +{ "_id" : "05871", "city" : "WEST BURKE", "loc" : [ -71.95717999999999, 44.663647 ], "pop" : 885, "state" : "VT" } +{ "_id" : "05872", "city" : "WEST CHARLESTON", "loc" : [ -72.05209000000001, 44.872894 ], "pop" : 598, "state" : "VT" } +{ "_id" : "05873", "city" : "WEST DANVILLE", "loc" : [ -72.21977099999999, 44.446509 ], "pop" : 1130, "state" : "VT" } +{ "_id" : "05874", "city" : "WESTFIELD", "loc" : [ -72.439628, 44.882457 ], "pop" : 398, "state" : "VT" } +{ "_id" : "05875", "city" : "WEST GLOVER", "loc" : [ -72.259936, 44.703145 ], "pop" : 265, "state" : "VT" } +{ "_id" : "05901", "city" : "AVERILL", "loc" : [ -71.70026799999999, 44.992304 ], "pop" : 7, "state" : "VT" } +{ "_id" : "05902", "city" : "BEECHER FALLS", "loc" : [ -71.519901, 45.006103 ], "pop" : 579, "state" : "VT" } +{ "_id" : "05903", "city" : "CANAAN", "loc" : [ -71.560214, 44.976439 ], "pop" : 542, "state" : "VT" } +{ "_id" : "05904", "city" : "GILMAN", "loc" : [ -71.71786, 44.413985 ], "pop" : 322, "state" : "VT" } +{ "_id" : "05905", "city" : "GUILDHALL", "loc" : [ -71.599057, 44.690218 ], "pop" : 848, "state" : "VT" } +{ "_id" : "05906", "city" : "LUNENBURG", "loc" : [ -71.69304, 44.466262 ], "pop" : 854, "state" : "VT" } +{ "_id" : "05907", "city" : "NORTON", "loc" : [ -71.78843999999999, 44.988781 ], "pop" : 171, "state" : "VT" } +{ "_id" : "06001", "city" : "AVON", "loc" : [ -72.865323, 41.790498 ], "pop" : 13988, "state" : "CT" } +{ "_id" : "06002", "city" : "BLOOMFIELD", "loc" : [ -72.72493, 41.831647 ], "pop" : 19524, "state" : "CT" } +{ "_id" : "06010", "city" : "BRISTOL", "loc" : [ -72.930193, 41.682293 ], "pop" : 60670, "state" : "CT" } +{ "_id" : "06013", "city" : "BURLINGTON", "loc" : [ -72.94438599999999, 41.757296 ], "pop" : 7017, "state" : "CT" } +{ "_id" : "06016", "city" : "WINDSORVILLE", "loc" : [ -72.543667, 41.911405 ], "pop" : 5067, "state" : "CT" } +{ "_id" : "06018", "city" : "CANAAN", "loc" : [ -73.323177, 42.024821 ], "pop" : 2948, "state" : "CT" } +{ "_id" : "06019", "city" : "CANTON", "loc" : [ -72.898731, 41.838401 ], "pop" : 4125, "state" : "CT" } +{ "_id" : "06020", "city" : "CANTON CENTER", "loc" : [ -72.90584699999999, 41.871586 ], "pop" : 192, "state" : "CT" } +{ "_id" : "06021", "city" : "COLEBROOK", "loc" : [ -73.104069, 42.028217 ], "pop" : 203, "state" : "CT" } +{ "_id" : "06022", "city" : "COLLINSVILLE", "loc" : [ -72.92827, 41.851319 ], "pop" : 4630, "state" : "CT" } +{ "_id" : "06023", "city" : "EAST BERLIN", "loc" : [ -72.719007, 41.61277 ], "pop" : 1021, "state" : "CT" } +{ "_id" : "06024", "city" : "EAST CANAAN", "loc" : [ -73.278462, 42.011686 ], "pop" : 519, "state" : "CT" } +{ "_id" : "06026", "city" : "EAST GRANBY", "loc" : [ -72.74588900000001, 41.932215 ], "pop" : 4301, "state" : "CT" } +{ "_id" : "06027", "city" : "EAST HARTLAND", "loc" : [ -72.92421299999999, 42.001617 ], "pop" : 1833, "state" : "CT" } +{ "_id" : "06029", "city" : "ELLINGTON", "loc" : [ -72.462599, 41.911417 ], "pop" : 9070, "state" : "CT" } +{ "_id" : "06031", "city" : "FALLS VILLAGE", "loc" : [ -73.351659, 41.95784 ], "pop" : 1192, "state" : "CT" } +{ "_id" : "06032", "city" : "FARMINGTON", "loc" : [ -72.841476, 41.72839 ], "pop" : 14953, "state" : "CT" } +{ "_id" : "06033", "city" : "GLASTONBURY", "loc" : [ -72.572705, 41.707329 ], "pop" : 24287, "state" : "CT" } +{ "_id" : "06035", "city" : "GRANBY", "loc" : [ -72.79937700000001, 41.960227 ], "pop" : 6939, "state" : "CT" } +{ "_id" : "06037", "city" : "BERLIN", "loc" : [ -72.770482, 41.620826 ], "pop" : 15755, "state" : "CT" } +{ "_id" : "06039", "city" : "LAKEVILLE", "loc" : [ -73.43765999999999, 41.951631 ], "pop" : 2086, "state" : "CT" } +{ "_id" : "06040", "city" : "MANCHESTER", "loc" : [ -72.52444, 41.777732 ], "pop" : 51618, "state" : "CT" } +{ "_id" : "06043", "city" : "BOLTON", "loc" : [ -72.43958000000001, 41.768888 ], "pop" : 4569, "state" : "CT" } +{ "_id" : "06051", "city" : "NEW BRITAIN", "loc" : [ -72.77220800000001, 41.666683 ], "pop" : 28705, "state" : "CT" } +{ "_id" : "06052", "city" : "NEW BRITAIN", "loc" : [ -72.798858, 41.658792 ], "pop" : 8798, "state" : "CT" } +{ "_id" : "06053", "city" : "NEW BRITAIN", "loc" : [ -72.790835, 41.686667 ], "pop" : 37995, "state" : "CT" } +{ "_id" : "06057", "city" : "NEW HARTFORD", "loc" : [ -73.010369, 41.846797 ], "pop" : 4521, "state" : "CT" } +{ "_id" : "06058", "city" : "NORFOLK", "loc" : [ -73.199197, 41.985386 ], "pop" : 2060, "state" : "CT" } +{ "_id" : "06059", "city" : "NORTH CANTON", "loc" : [ -72.90414, 41.923516 ], "pop" : 783, "state" : "CT" } +{ "_id" : "06060", "city" : "NORTH GRANBY", "loc" : [ -72.84093799999999, 42.021925 ], "pop" : 1455, "state" : "CT" } +{ "_id" : "06062", "city" : "PLAINVILLE", "loc" : [ -72.864373, 41.672653 ], "pop" : 17320, "state" : "CT" } +{ "_id" : "06063", "city" : "PLEASANT VALLEY", "loc" : [ -72.982675, 41.924873 ], "pop" : 838, "state" : "CT" } +{ "_id" : "06065", "city" : "RIVERTON", "loc" : [ -73.025469, 41.961395 ], "pop" : 155, "state" : "CT" } +{ "_id" : "06066", "city" : "VERNON ROCKVILLE", "loc" : [ -72.464855, 41.850073 ], "pop" : 31966, "state" : "CT" } +{ "_id" : "06067", "city" : "ROCKY HILL", "loc" : [ -72.663197, 41.658295 ], "pop" : 16638, "state" : "CT" } +{ "_id" : "06068", "city" : "SALISBURY", "loc" : [ -73.421492, 42.001452 ], "pop" : 1686, "state" : "CT" } +{ "_id" : "06069", "city" : "SHARON", "loc" : [ -73.457758, 41.871446 ], "pop" : 2794, "state" : "CT" } +{ "_id" : "06070", "city" : "SIMSBURY", "loc" : [ -72.82126700000001, 41.873712 ], "pop" : 14589, "state" : "CT" } +{ "_id" : "06071", "city" : "SOMERS", "loc" : [ -72.45826599999999, 41.997813 ], "pop" : 9685, "state" : "CT" } +{ "_id" : "06073", "city" : "SOUTH GLASTONBUR", "loc" : [ -72.55430800000001, 41.660682 ], "pop" : 3614, "state" : "CT" } +{ "_id" : "06074", "city" : "SOUTH WINDSOR", "loc" : [ -72.557585, 41.834081 ], "pop" : 22090, "state" : "CT" } +{ "_id" : "06076", "city" : "STAFFORD SPRINGS", "loc" : [ -72.289857, 41.966127 ], "pop" : 12392, "state" : "CT" } +{ "_id" : "06078", "city" : "SUFFIELD", "loc" : [ -72.641997, 41.990029 ], "pop" : 8518, "state" : "CT" } +{ "_id" : "06081", "city" : "TARIFFVILLE", "loc" : [ -72.767786, 41.907715 ], "pop" : 1477, "state" : "CT" } +{ "_id" : "06082", "city" : "ENFIELD", "loc" : [ -72.565218, 41.989016 ], "pop" : 45558, "state" : "CT" } +{ "_id" : "06084", "city" : "TOLLAND", "loc" : [ -72.37178900000001, 41.869647 ], "pop" : 10973, "state" : "CT" } +{ "_id" : "06085", "city" : "UNIONVILLE", "loc" : [ -72.887406, 41.747711 ], "pop" : 5604, "state" : "CT" } +{ "_id" : "06088", "city" : "EAST WINDSOR", "loc" : [ -72.60294500000001, 41.9099 ], "pop" : 4988, "state" : "CT" } +{ "_id" : "06089", "city" : "WEATOGUE", "loc" : [ -72.825254, 41.837152 ], "pop" : 2308, "state" : "CT" } +{ "_id" : "06090", "city" : "WEST GRANBY", "loc" : [ -72.855496, 41.965509 ], "pop" : 948, "state" : "CT" } +{ "_id" : "06092", "city" : "WEST SIMSBURY", "loc" : [ -72.857749, 41.871797 ], "pop" : 3691, "state" : "CT" } +{ "_id" : "06093", "city" : "WEST SUFFIELD", "loc" : [ -72.736232, 42.011464 ], "pop" : 2912, "state" : "CT" } +{ "_id" : "06095", "city" : "WINDSOR", "loc" : [ -72.663893, 41.856122 ], "pop" : 27815, "state" : "CT" } +{ "_id" : "06096", "city" : "WINDSOR LOCKS", "loc" : [ -72.645762, 41.926078 ], "pop" : 12358, "state" : "CT" } +{ "_id" : "06098", "city" : "WINSTED", "loc" : [ -73.06634099999999, 41.925214 ], "pop" : 14584, "state" : "CT" } +{ "_id" : "06103", "city" : "HARTFORD", "loc" : [ -72.675966, 41.767196 ], "pop" : 1202, "state" : "CT" } +{ "_id" : "06105", "city" : "HARTFORD", "loc" : [ -72.70100600000001, 41.769116 ], "pop" : 20887, "state" : "CT" } +{ "_id" : "06106", "city" : "HARTFORD", "loc" : [ -72.694734, 41.749841 ], "pop" : 47841, "state" : "CT" } +{ "_id" : "06107", "city" : "W HARTFORD", "loc" : [ -72.75322, 41.755553 ], "pop" : 18466, "state" : "CT" } +{ "_id" : "06108", "city" : "EAST HARTFORD", "loc" : [ -72.618014, 41.780291 ], "pop" : 23698, "state" : "CT" } +{ "_id" : "06109", "city" : "WETHERSFIELD", "loc" : [ -72.67630800000001, 41.701332 ], "pop" : 25583, "state" : "CT" } +{ "_id" : "06110", "city" : "W HARTFORD", "loc" : [ -72.73369099999999, 41.732566 ], "pop" : 11817, "state" : "CT" } +{ "_id" : "06111", "city" : "MAPLE HILL", "loc" : [ -72.729747, 41.686402 ], "pop" : 29192, "state" : "CT" } +{ "_id" : "06112", "city" : "HARTFORD", "loc" : [ -72.69641, 41.79053 ], "pop" : 29714, "state" : "CT" } +{ "_id" : "06114", "city" : "HARTFORD", "loc" : [ -72.68072600000001, 41.740293 ], "pop" : 23302, "state" : "CT" } +{ "_id" : "06117", "city" : "W HARTFORD", "loc" : [ -72.745689, 41.790021 ], "pop" : 14774, "state" : "CT" } +{ "_id" : "06118", "city" : "EAST HARTFORD", "loc" : [ -72.610265, 41.747211 ], "pop" : 26754, "state" : "CT" } +{ "_id" : "06119", "city" : "W HARTFORD", "loc" : [ -72.726799, 41.762765 ], "pop" : 15066, "state" : "CT" } +{ "_id" : "06120", "city" : "HARTFORD", "loc" : [ -72.67580700000001, 41.78596 ], "pop" : 16739, "state" : "CT" } +{ "_id" : "06226", "city" : "WILLIMANTIC", "loc" : [ -72.213396, 41.714918 ], "pop" : 16023, "state" : "CT" } +{ "_id" : "06231", "city" : "AMSTON", "loc" : [ -72.36460099999999, 41.628969 ], "pop" : 2887, "state" : "CT" } +{ "_id" : "06232", "city" : "ANDOVER", "loc" : [ -72.37671899999999, 41.733215 ], "pop" : 2546, "state" : "CT" } +{ "_id" : "06234", "city" : "BROOKLYN", "loc" : [ -71.95412899999999, 41.780747 ], "pop" : 4835, "state" : "CT" } +{ "_id" : "06235", "city" : "CHAPLIN", "loc" : [ -72.137197, 41.802584 ], "pop" : 902, "state" : "CT" } +{ "_id" : "06237", "city" : "COLUMBIA", "loc" : [ -72.30717, 41.697274 ], "pop" : 4510, "state" : "CT" } +{ "_id" : "06238", "city" : "COVENTRY", "loc" : [ -72.333249, 41.782195 ], "pop" : 10776, "state" : "CT" } +{ "_id" : "06239", "city" : "DANIELSON", "loc" : [ -71.880703, 41.798246 ], "pop" : 12754, "state" : "CT" } +{ "_id" : "06241", "city" : "DAYVILLE", "loc" : [ -71.868342, 41.854045 ], "pop" : 5860, "state" : "CT" } +{ "_id" : "06242", "city" : "EASTFORD", "loc" : [ -72.089451, 41.877104 ], "pop" : 76, "state" : "CT" } +{ "_id" : "06243", "city" : "EAST KILLINGLY", "loc" : [ -71.798534, 41.848756 ], "pop" : 25, "state" : "CT" } +{ "_id" : "06247", "city" : "HAMPTON", "loc" : [ -72.06797899999999, 41.761668 ], "pop" : 2139, "state" : "CT" } +{ "_id" : "06248", "city" : "HEBRON", "loc" : [ -72.39855300000001, 41.684161 ], "pop" : 4192, "state" : "CT" } +{ "_id" : "06249", "city" : "LEBANON", "loc" : [ -72.244035, 41.632988 ], "pop" : 6043, "state" : "CT" } +{ "_id" : "06250", "city" : "MANSFIELD CENTER", "loc" : [ -72.20111199999999, 41.769814 ], "pop" : 4306, "state" : "CT" } +{ "_id" : "06254", "city" : "NORTH FRANKLIN", "loc" : [ -72.142544, 41.616141 ], "pop" : 1654, "state" : "CT" } +{ "_id" : "06255", "city" : "NORTH GROSVENORD", "loc" : [ -71.902734, 41.987878 ], "pop" : 5641, "state" : "CT" } +{ "_id" : "06256", "city" : "NORTH WINDHAM", "loc" : [ -72.160106, 41.745144 ], "pop" : 3825, "state" : "CT" } +{ "_id" : "06259", "city" : "POMFRET CENTER", "loc" : [ -71.98201, 41.869683 ], "pop" : 3325, "state" : "CT" } +{ "_id" : "06260", "city" : "PUTNAM", "loc" : [ -71.896804, 41.91853 ], "pop" : 9031, "state" : "CT" } +{ "_id" : "06262", "city" : "QUINEBAUG", "loc" : [ -71.939137, 42.021747 ], "pop" : 72, "state" : "CT" } +{ "_id" : "06264", "city" : "SCOTLAND", "loc" : [ -72.07826300000001, 41.689849 ], "pop" : 102, "state" : "CT" } +{ "_id" : "06266", "city" : "SOUTH WINDHAM", "loc" : [ -72.16811199999999, 41.667724 ], "pop" : 372, "state" : "CT" } +{ "_id" : "06268", "city" : "STORRS MANSFIELD", "loc" : [ -72.257172, 41.805364 ], "pop" : 16117, "state" : "CT" } +{ "_id" : "06277", "city" : "THOMPSON", "loc" : [ -71.837587, 41.980285 ], "pop" : 2960, "state" : "CT" } +{ "_id" : "06278", "city" : "WARRENVILLE", "loc" : [ -72.15873000000001, 41.86434 ], "pop" : 2720, "state" : "CT" } +{ "_id" : "06279", "city" : "WEST WILLINGTON", "loc" : [ -72.272774, 41.873996 ], "pop" : 5981, "state" : "CT" } +{ "_id" : "06280", "city" : "WINDHAM", "loc" : [ -72.15261, 41.702652 ], "pop" : 3337, "state" : "CT" } +{ "_id" : "06281", "city" : "WOODSTOCK", "loc" : [ -72.00402699999999, 41.960218 ], "pop" : 5698, "state" : "CT" } +{ "_id" : "06282", "city" : "WOODSTOCK VALLEY", "loc" : [ -72.09366, 41.915296 ], "pop" : 1099, "state" : "CT" } +{ "_id" : "06320", "city" : "NEW LONDON", "loc" : [ -72.106245, 41.350718 ], "pop" : 28367, "state" : "CT" } +{ "_id" : "06330", "city" : "BALTIC", "loc" : [ -72.077499, 41.62629 ], "pop" : 3188, "state" : "CT" } +{ "_id" : "06331", "city" : "CANTERBURY", "loc" : [ -72.000985, 41.684403 ], "pop" : 4345, "state" : "CT" } +{ "_id" : "06333", "city" : "EAST LYME", "loc" : [ -72.23298699999999, 41.366806 ], "pop" : 6095, "state" : "CT" } +{ "_id" : "06334", "city" : "BOZRAH", "loc" : [ -72.17107799999999, 41.546515 ], "pop" : 2297, "state" : "CT" } +{ "_id" : "06335", "city" : "GALES FERRY", "loc" : [ -72.06719, 41.42852 ], "pop" : 6994, "state" : "CT" } +{ "_id" : "06336", "city" : "GILMAN", "loc" : [ -72.126623, 41.58117 ], "pop" : 156, "state" : "CT" } +{ "_id" : "06339", "city" : "LEDYARD", "loc" : [ -71.995626, 41.44014 ], "pop" : 7602, "state" : "CT" } +{ "_id" : "06340", "city" : "GROTON", "loc" : [ -72.057947, 41.357171 ], "pop" : 32435, "state" : "CT" } +{ "_id" : "06349", "city" : "GROTON", "loc" : [ -72.090058, 41.397648 ], "pop" : 5398, "state" : "CT" } +{ "_id" : "06351", "city" : "JEWETT CITY", "loc" : [ -71.98075900000001, 41.605182 ], "pop" : 11674, "state" : "CT" } +{ "_id" : "06353", "city" : "MONTVILLE", "loc" : [ -72.126476, 41.445331 ], "pop" : 258, "state" : "CT" } +{ "_id" : "06354", "city" : "MOOSUP", "loc" : [ -71.884962, 41.721031 ], "pop" : 7048, "state" : "CT" } +{ "_id" : "06355", "city" : "MYSTIC", "loc" : [ -71.97736399999999, 41.361626 ], "pop" : 11183, "state" : "CT" } +{ "_id" : "06357", "city" : "NIANTIC", "loc" : [ -72.210819, 41.3253 ], "pop" : 9245, "state" : "CT" } +{ "_id" : "06359", "city" : "NORTH STONINGTON", "loc" : [ -71.87270100000001, 41.453113 ], "pop" : 4882, "state" : "CT" } +{ "_id" : "06360", "city" : "NORWICH", "loc" : [ -72.08494, 41.537055 ], "pop" : 30145, "state" : "CT" } +{ "_id" : "06365", "city" : "PRESTON", "loc" : [ -72.021079, 41.522061 ], "pop" : 11191, "state" : "CT" } +{ "_id" : "06370", "city" : "OAKDALE", "loc" : [ -72.190358, 41.470573 ], "pop" : 6505, "state" : "CT" } +{ "_id" : "06371", "city" : "OLD LYME", "loc" : [ -72.30856199999999, 41.334745 ], "pop" : 8484, "state" : "CT" } +{ "_id" : "06374", "city" : "PLAINFIELD", "loc" : [ -71.92196800000001, 41.67753 ], "pop" : 6533, "state" : "CT" } +{ "_id" : "06375", "city" : "QUAKER HILL", "loc" : [ -72.11722, 41.40324 ], "pop" : 2886, "state" : "CT" } +{ "_id" : "06377", "city" : "STERLING", "loc" : [ -71.819588, 41.715629 ], "pop" : 2324, "state" : "CT" } +{ "_id" : "06378", "city" : "STONINGTON", "loc" : [ -71.915544, 41.366437 ], "pop" : 5282, "state" : "CT" } +{ "_id" : "06379", "city" : "PAWCATUCK", "loc" : [ -71.84776100000001, 41.373475 ], "pop" : 8082, "state" : "CT" } +{ "_id" : "06380", "city" : "TAFTVILLE", "loc" : [ -72.052877, 41.565263 ], "pop" : 2538, "state" : "CT" } +{ "_id" : "06382", "city" : "UNCASVILLE", "loc" : [ -72.112556, 41.462168 ], "pop" : 9909, "state" : "CT" } +{ "_id" : "06384", "city" : "VOLUNTOWN", "loc" : [ -71.855002, 41.583053 ], "pop" : 3167, "state" : "CT" } +{ "_id" : "06385", "city" : "WATERFORD", "loc" : [ -72.145816, 41.346853 ], "pop" : 15217, "state" : "CT" } +{ "_id" : "06390", "city" : "FISHERS ISLAND", "loc" : [ -72.01783399999999, 41.263934 ], "pop" : 329, "state" : "NY" } +{ "_id" : "06401", "city" : "ANSONIA", "loc" : [ -73.07421100000001, 41.342712 ], "pop" : 18430, "state" : "CT" } +{ "_id" : "06403", "city" : "BEACON FALLS", "loc" : [ -73.059656, 41.436917 ], "pop" : 5083, "state" : "CT" } +{ "_id" : "06405", "city" : "BRANFORD", "loc" : [ -72.810643, 41.279991 ], "pop" : 27726, "state" : "CT" } +{ "_id" : "06409", "city" : "CENTERBROOK", "loc" : [ -72.41731, 41.34743 ], "pop" : 483, "state" : "CT" } +{ "_id" : "06410", "city" : "CHESHIRE", "loc" : [ -72.90812699999999, 41.505473 ], "pop" : 25684, "state" : "CT" } +{ "_id" : "06412", "city" : "CHESTER", "loc" : [ -72.464293, 41.404903 ], "pop" : 3417, "state" : "CT" } +{ "_id" : "06413", "city" : "CLINTON", "loc" : [ -72.527973, 41.29117 ], "pop" : 12772, "state" : "CT" } +{ "_id" : "06415", "city" : "COLCHESTER", "loc" : [ -72.344123, 41.566198 ], "pop" : 10978, "state" : "CT" } +{ "_id" : "06416", "city" : "CROMWELL", "loc" : [ -72.66631700000001, 41.61049 ], "pop" : 12286, "state" : "CT" } +{ "_id" : "06417", "city" : "DEEP RIVER", "loc" : [ -72.44856799999999, 41.376478 ], "pop" : 4332, "state" : "CT" } +{ "_id" : "06418", "city" : "DERBY", "loc" : [ -73.080035, 41.322858 ], "pop" : 12199, "state" : "CT" } +{ "_id" : "06419", "city" : "KILLINGWORTH", "loc" : [ -72.571192, 41.369622 ], "pop" : 4809, "state" : "CT" } +{ "_id" : "06420", "city" : "SALEM", "loc" : [ -72.272454, 41.496627 ], "pop" : 4041, "state" : "CT" } +{ "_id" : "06422", "city" : "DURHAM", "loc" : [ -72.68752000000001, 41.464951 ], "pop" : 5737, "state" : "CT" } +{ "_id" : "06423", "city" : "EAST HADDAM", "loc" : [ -72.40587600000001, 41.469575 ], "pop" : 3451, "state" : "CT" } +{ "_id" : "06424", "city" : "EAST HAMPTON", "loc" : [ -72.509345, 41.576058 ], "pop" : 10309, "state" : "CT" } +{ "_id" : "06426", "city" : "ESSEX", "loc" : [ -72.39650399999999, 41.354944 ], "pop" : 2710, "state" : "CT" } +{ "_id" : "06430", "city" : "FAIRFIELD", "loc" : [ -73.257109, 41.166442 ], "pop" : 40889, "state" : "CT" } +{ "_id" : "06432", "city" : "FAIRFIELD", "loc" : [ -73.23540800000001, 41.201651 ], "pop" : 8634, "state" : "CT" } +{ "_id" : "06437", "city" : "GUILFORD", "loc" : [ -72.69678999999999, 41.31537 ], "pop" : 19717, "state" : "CT" } +{ "_id" : "06438", "city" : "HADDAM", "loc" : [ -72.504988, 41.462718 ], "pop" : 2245, "state" : "CT" } +{ "_id" : "06441", "city" : "HIGGANUM", "loc" : [ -72.575143, 41.468246 ], "pop" : 4248, "state" : "CT" } +{ "_id" : "06442", "city" : "IVORYTON", "loc" : [ -72.440387, 41.342101 ], "pop" : 2748, "state" : "CT" } +{ "_id" : "06443", "city" : "MADISON", "loc" : [ -72.61525399999999, 41.309019 ], "pop" : 15488, "state" : "CT" } +{ "_id" : "06447", "city" : "MARLBOROUGH", "loc" : [ -72.460871, 41.641226 ], "pop" : 5535, "state" : "CT" } +{ "_id" : "06450", "city" : "MERIDEN", "loc" : [ -72.799734, 41.533396 ], "pop" : 59441, "state" : "CT" } +{ "_id" : "06455", "city" : "MIDDLEFIELD", "loc" : [ -72.71862400000001, 41.516789 ], "pop" : 2515, "state" : "CT" } +{ "_id" : "06457", "city" : "MIDDLETOWN", "loc" : [ -72.66522500000001, 41.556895 ], "pop" : 42846, "state" : "CT" } +{ "_id" : "06460", "city" : "MILFORD", "loc" : [ -73.054948, 41.217466 ], "pop" : 49940, "state" : "CT" } +{ "_id" : "06468", "city" : "MONROE", "loc" : [ -73.224333, 41.331171 ], "pop" : 16845, "state" : "CT" } +{ "_id" : "06469", "city" : "MOODUS", "loc" : [ -72.441879, 41.507807 ], "pop" : 2634, "state" : "CT" } +{ "_id" : "06470", "city" : "NEWTOWN", "loc" : [ -73.316744, 41.393095 ], "pop" : 12787, "state" : "CT" } +{ "_id" : "06471", "city" : "NORTH BRANFORD", "loc" : [ -72.776034, 41.327985 ], "pop" : 6767, "state" : "CT" } +{ "_id" : "06472", "city" : "NORTHFORD", "loc" : [ -72.78090899999999, 41.396219 ], "pop" : 6229, "state" : "CT" } +{ "_id" : "06473", "city" : "NORTH HAVEN", "loc" : [ -72.85852, 41.382156 ], "pop" : 22481, "state" : "CT" } +{ "_id" : "06475", "city" : "OLD SAYBROOK", "loc" : [ -72.38502200000001, 41.291297 ], "pop" : 9552, "state" : "CT" } +{ "_id" : "06477", "city" : "ORANGE", "loc" : [ -73.02872499999999, 41.281527 ], "pop" : 12828, "state" : "CT" } +{ "_id" : "06478", "city" : "OXFORD", "loc" : [ -73.12961, 41.420237 ], "pop" : 9286, "state" : "CT" } +{ "_id" : "06479", "city" : "PLANTSVILLE", "loc" : [ -72.89903099999999, 41.579747 ], "pop" : 10024, "state" : "CT" } +{ "_id" : "06480", "city" : "PORTLAND", "loc" : [ -72.612797, 41.585223 ], "pop" : 8673, "state" : "CT" } +{ "_id" : "06481", "city" : "ROCKFALL", "loc" : [ -72.699674, 41.534094 ], "pop" : 1330, "state" : "CT" } +{ "_id" : "06482", "city" : "SANDY HOOK", "loc" : [ -73.24852199999999, 41.408706 ], "pop" : 8046, "state" : "CT" } +{ "_id" : "06483", "city" : "SEYMOUR", "loc" : [ -73.081745, 41.386209 ], "pop" : 13660, "state" : "CT" } +{ "_id" : "06484", "city" : "SHELTON", "loc" : [ -73.129439, 41.304689 ], "pop" : 35447, "state" : "CT" } +{ "_id" : "06488", "city" : "SOUTHBURY", "loc" : [ -73.22407699999999, 41.476695 ], "pop" : 15818, "state" : "CT" } +{ "_id" : "06489", "city" : "SOUTHINGTON", "loc" : [ -72.872681, 41.605221 ], "pop" : 28567, "state" : "CT" } +{ "_id" : "06490", "city" : "SOUTHPORT", "loc" : [ -73.290205, 41.14527 ], "pop" : 3701, "state" : "CT" } +{ "_id" : "06492", "city" : "WALLINGFORD", "loc" : [ -72.82217900000001, 41.459997 ], "pop" : 40838, "state" : "CT" } +{ "_id" : "06497", "city" : "STRATFORD", "loc" : [ -73.135594, 41.2044 ], "pop" : 49495, "state" : "CT" } +{ "_id" : "06498", "city" : "WESTBROOK", "loc" : [ -72.45631299999999, 41.292662 ], "pop" : 5377, "state" : "CT" } +{ "_id" : "06510", "city" : "NEW HAVEN", "loc" : [ -72.92706, 41.308701 ], "pop" : 4448, "state" : "CT" } +{ "_id" : "06511", "city" : "NEW HAVEN", "loc" : [ -72.931771, 41.318364 ], "pop" : 54142, "state" : "CT" } +{ "_id" : "06512", "city" : "EAST HAVEN", "loc" : [ -72.874144, 41.280522 ], "pop" : 28963, "state" : "CT" } +{ "_id" : "06513", "city" : "EAST HAVEN", "loc" : [ -72.882554, 41.314215 ], "pop" : 31342, "state" : "CT" } +{ "_id" : "06514", "city" : "HAMDEN", "loc" : [ -72.93613000000001, 41.361987 ], "pop" : 23883, "state" : "CT" } +{ "_id" : "06515", "city" : "NEW HAVEN", "loc" : [ -72.96644499999999, 41.329301 ], "pop" : 18603, "state" : "CT" } +{ "_id" : "06516", "city" : "WEST HAVEN", "loc" : [ -72.963842, 41.270079 ], "pop" : 53642, "state" : "CT" } +{ "_id" : "06517", "city" : "HAMDEN", "loc" : [ -72.91167799999999, 41.348393 ], "pop" : 14604, "state" : "CT" } +{ "_id" : "06518", "city" : "HAMDEN", "loc" : [ -72.911001, 41.409664 ], "pop" : 13802, "state" : "CT" } +{ "_id" : "06519", "city" : "NEW HAVEN", "loc" : [ -72.937307, 41.296284 ], "pop" : 19410, "state" : "CT" } +{ "_id" : "06524", "city" : "BETHANY", "loc" : [ -73.000704, 41.426194 ], "pop" : 4730, "state" : "CT" } +{ "_id" : "06525", "city" : "WOODBRIDGE", "loc" : [ -73.013902, 41.351668 ], "pop" : 7802, "state" : "CT" } +{ "_id" : "06604", "city" : "BRIDGEPORT", "loc" : [ -73.201859, 41.179574 ], "pop" : 28219, "state" : "CT" } +{ "_id" : "06605", "city" : "BRIDGEPORT", "loc" : [ -73.216251, 41.166796 ], "pop" : 23800, "state" : "CT" } +{ "_id" : "06606", "city" : "BRIDGEPORT", "loc" : [ -73.208619, 41.20907 ], "pop" : 41879, "state" : "CT" } +{ "_id" : "06607", "city" : "BRIDGEPORT", "loc" : [ -73.165048, 41.178382 ], "pop" : 9292, "state" : "CT" } +{ "_id" : "06608", "city" : "BRIDGEPORT", "loc" : [ -73.181141, 41.189466 ], "pop" : 17721, "state" : "CT" } +{ "_id" : "06610", "city" : "BRIDGEPORT", "loc" : [ -73.16877100000001, 41.200508 ], "pop" : 20727, "state" : "CT" } +{ "_id" : "06611", "city" : "TRUMBULL", "loc" : [ -73.211063, 41.25641 ], "pop" : 32213, "state" : "CT" } +{ "_id" : "06612", "city" : "EASTON", "loc" : [ -73.287108, 41.252328 ], "pop" : 6213, "state" : "CT" } +{ "_id" : "06702", "city" : "WATERBURY", "loc" : [ -73.038545, 41.556568 ], "pop" : 4522, "state" : "CT" } +{ "_id" : "06704", "city" : "WATERBURY", "loc" : [ -73.03180500000001, 41.575435 ], "pop" : 26018, "state" : "CT" } +{ "_id" : "06705", "city" : "WATERBURY", "loc" : [ -72.996268, 41.550328 ], "pop" : 25128, "state" : "CT" } +{ "_id" : "06706", "city" : "WATERBURY", "loc" : [ -73.03064000000001, 41.536261 ], "pop" : 15431, "state" : "CT" } +{ "_id" : "06708", "city" : "WATERBURY", "loc" : [ -73.06449499999999, 41.551102 ], "pop" : 27661, "state" : "CT" } +{ "_id" : "06710", "city" : "WATERBURY", "loc" : [ -73.04682099999999, 41.567503 ], "pop" : 9921, "state" : "CT" } +{ "_id" : "06712", "city" : "PROSPECT", "loc" : [ -72.978803, 41.502198 ], "pop" : 7775, "state" : "CT" } +{ "_id" : "06716", "city" : "WOLCOTT", "loc" : [ -72.982799, 41.596995 ], "pop" : 13787, "state" : "CT" } +{ "_id" : "06750", "city" : "BANTAM", "loc" : [ -73.252028, 41.721483 ], "pop" : 1418, "state" : "CT" } +{ "_id" : "06751", "city" : "BETHLEHEM", "loc" : [ -73.209098, 41.638683 ], "pop" : 3071, "state" : "CT" } +{ "_id" : "06752", "city" : "BRIDGEWATER", "loc" : [ -73.360936, 41.528684 ], "pop" : 1654, "state" : "CT" } +{ "_id" : "06754", "city" : "WARREN", "loc" : [ -73.36747200000001, 41.770084 ], "pop" : 1278, "state" : "CT" } +{ "_id" : "06755", "city" : "GAYLORDSVILLE", "loc" : [ -73.483524, 41.648635 ], "pop" : 890, "state" : "CT" } +{ "_id" : "06756", "city" : "GOSHEN", "loc" : [ -73.242876, 41.833452 ], "pop" : 2314, "state" : "CT" } +{ "_id" : "06757", "city" : "KENT", "loc" : [ -73.45834499999999, 41.731619 ], "pop" : 2035, "state" : "CT" } +{ "_id" : "06758", "city" : "LAKESIDE", "loc" : [ -73.238235, 41.69001 ], "pop" : 997, "state" : "CT" } +{ "_id" : "06759", "city" : "LITCHFIELD", "loc" : [ -73.200011, 41.754069 ], "pop" : 5573, "state" : "CT" } +{ "_id" : "06762", "city" : "MIDDLEBURY", "loc" : [ -73.11306999999999, 41.534277 ], "pop" : 6338, "state" : "CT" } +{ "_id" : "06763", "city" : "MORRIS", "loc" : [ -73.176509, 41.688121 ], "pop" : 849, "state" : "CT" } +{ "_id" : "06770", "city" : "NAUGATUCK", "loc" : [ -73.049342, 41.492039 ], "pop" : 30625, "state" : "CT" } +{ "_id" : "06776", "city" : "NEW MILFORD", "loc" : [ -73.412752, 41.581745 ], "pop" : 22750, "state" : "CT" } +{ "_id" : "06777", "city" : "NEW PRESTON MARB", "loc" : [ -73.349296, 41.689373 ], "pop" : 1697, "state" : "CT" } +{ "_id" : "06778", "city" : "NORTHFIELD", "loc" : [ -73.132079, 41.707382 ], "pop" : 442, "state" : "CT" } +{ "_id" : "06779", "city" : "OAKVILLE", "loc" : [ -73.087311, 41.590932 ], "pop" : 8455, "state" : "CT" } +{ "_id" : "06782", "city" : "PLYMOUTH", "loc" : [ -73.044887, 41.661121 ], "pop" : 2910, "state" : "CT" } +{ "_id" : "06783", "city" : "ROXBURY", "loc" : [ -73.299346, 41.5509 ], "pop" : 1825, "state" : "CT" } +{ "_id" : "06784", "city" : "SHERMAN", "loc" : [ -73.494694, 41.571366 ], "pop" : 2808, "state" : "CT" } +{ "_id" : "06785", "city" : "SOUTH KENT", "loc" : [ -73.46902300000001, 41.695051 ], "pop" : 719, "state" : "CT" } +{ "_id" : "06786", "city" : "TERRYVILLE", "loc" : [ -73.009214, 41.676197 ], "pop" : 8912, "state" : "CT" } +{ "_id" : "06787", "city" : "THOMASTON", "loc" : [ -73.08855699999999, 41.678643 ], "pop" : 8179, "state" : "CT" } +{ "_id" : "06790", "city" : "TORRINGTON", "loc" : [ -73.115579, 41.813065 ], "pop" : 33969, "state" : "CT" } +{ "_id" : "06791", "city" : "HARWINTON", "loc" : [ -73.072819, 41.770145 ], "pop" : 5228, "state" : "CT" } +{ "_id" : "06793", "city" : "WASHINGTON DEPOT", "loc" : [ -73.29351800000001, 41.634595 ], "pop" : 1381, "state" : "CT" } +{ "_id" : "06794", "city" : "WASHINGTON DEPOT", "loc" : [ -73.327352, 41.655924 ], "pop" : 1323, "state" : "CT" } +{ "_id" : "06795", "city" : "WATERTOWN", "loc" : [ -73.122122, 41.605654 ], "pop" : 12021, "state" : "CT" } +{ "_id" : "06796", "city" : "WEST CORNWALL", "loc" : [ -73.331271, 41.868888 ], "pop" : 1042, "state" : "CT" } +{ "_id" : "06798", "city" : "WOODBURY", "loc" : [ -73.208264, 41.552061 ], "pop" : 8131, "state" : "CT" } +{ "_id" : "06801", "city" : "BETHEL", "loc" : [ -73.40082700000001, 41.381298 ], "pop" : 17538, "state" : "CT" } +{ "_id" : "06804", "city" : "BROOKFIELD", "loc" : [ -73.397986, 41.46504 ], "pop" : 14223, "state" : "CT" } +{ "_id" : "06807", "city" : "COS COB", "loc" : [ -73.593498, 41.052952 ], "pop" : 7000, "state" : "CT" } +{ "_id" : "06810", "city" : "DANBURY", "loc" : [ -73.453165, 41.391663 ], "pop" : 37764, "state" : "CT" } +{ "_id" : "06811", "city" : "DANBURY", "loc" : [ -73.471587, 41.423983 ], "pop" : 27609, "state" : "CT" } +{ "_id" : "06812", "city" : "NEW FAIRFIELD", "loc" : [ -73.497784, 41.472999 ], "pop" : 13013, "state" : "CT" } +{ "_id" : "06820", "city" : "DARIEN", "loc" : [ -73.485254, 41.076759 ], "pop" : 18062, "state" : "CT" } +{ "_id" : "06830", "city" : "BYRAM", "loc" : [ -73.630047, 41.030238 ], "pop" : 22685, "state" : "CT" } +{ "_id" : "06831", "city" : "GREENWICH", "loc" : [ -73.65940500000001, 41.054885 ], "pop" : 14545, "state" : "CT" } +{ "_id" : "06840", "city" : "NEW CANAAN", "loc" : [ -73.494356, 41.151024 ], "pop" : 17937, "state" : "CT" } +{ "_id" : "06850", "city" : "NORWALK", "loc" : [ -73.435827, 41.12222 ], "pop" : 17332, "state" : "CT" } +{ "_id" : "06851", "city" : "NORWALK", "loc" : [ -73.40580199999999, 41.132346 ], "pop" : 24412, "state" : "CT" } +{ "_id" : "06853", "city" : "NORWALK", "loc" : [ -73.439667, 41.070243 ], "pop" : 3979, "state" : "CT" } +{ "_id" : "06854", "city" : "NORWALK", "loc" : [ -73.42848499999999, 41.095722 ], "pop" : 25358, "state" : "CT" } +{ "_id" : "06855", "city" : "NORWALK", "loc" : [ -73.40111899999999, 41.101382 ], "pop" : 7311, "state" : "CT" } +{ "_id" : "06870", "city" : "OLD GREENWICH", "loc" : [ -73.56725299999999, 41.035437 ], "pop" : 6511, "state" : "CT" } +{ "_id" : "06877", "city" : "RIDGEFIELD", "loc" : [ -73.49726800000001, 41.297683 ], "pop" : 21691, "state" : "CT" } +{ "_id" : "06878", "city" : "RIVERSIDE", "loc" : [ -73.581136, 41.037998 ], "pop" : 7765, "state" : "CT" } +{ "_id" : "06880", "city" : "WESTPORT", "loc" : [ -73.34957900000001, 41.143433 ], "pop" : 24705, "state" : "CT" } +{ "_id" : "06883", "city" : "WESTON", "loc" : [ -73.37147400000001, 41.219499 ], "pop" : 8517, "state" : "CT" } +{ "_id" : "06896", "city" : "WEST REDDING", "loc" : [ -73.3935, 41.306915 ], "pop" : 7183, "state" : "CT" } +{ "_id" : "06897", "city" : "WILTON", "loc" : [ -73.438323, 41.201761 ], "pop" : 15795, "state" : "CT" } +{ "_id" : "06901", "city" : "STAMFORD", "loc" : [ -73.539039, 41.053083 ], "pop" : 5860, "state" : "CT" } +{ "_id" : "06902", "city" : "STAMFORD", "loc" : [ -73.53742800000001, 41.052552 ], "pop" : 54605, "state" : "CT" } +{ "_id" : "06903", "city" : "STAMFORD", "loc" : [ -73.56835599999999, 41.135235 ], "pop" : 14172, "state" : "CT" } +{ "_id" : "06905", "city" : "RIDGEWAY", "loc" : [ -73.543757, 41.082576 ], "pop" : 17839, "state" : "CT" } +{ "_id" : "06906", "city" : "STAMFORD", "loc" : [ -73.523563, 41.069218 ], "pop" : 7019, "state" : "CT" } +{ "_id" : "06907", "city" : "STAMFORD", "loc" : [ -73.520297, 41.094206 ], "pop" : 8498, "state" : "CT" } +{ "_id" : "07001", "city" : "AVENEL", "loc" : [ -74.278522, 40.582568 ], "pop" : 14953, "state" : "NJ" } +{ "_id" : "07002", "city" : "BAYONNE", "loc" : [ -74.119169, 40.666399 ], "pop" : 61444, "state" : "NJ" } +{ "_id" : "07003", "city" : "BLOOMFIELD", "loc" : [ -74.18907400000001, 40.803456 ], "pop" : 46131, "state" : "NJ" } +{ "_id" : "07004", "city" : "FAIRFIELD", "loc" : [ -74.296027, 40.882178 ], "pop" : 7567, "state" : "NJ" } +{ "_id" : "07005", "city" : "BOONTON", "loc" : [ -74.414035, 40.911528 ], "pop" : 13961, "state" : "NJ" } +{ "_id" : "07006", "city" : "WEST CALDWELL", "loc" : [ -74.276771, 40.849059 ], "pop" : 24946, "state" : "NJ" } +{ "_id" : "07008", "city" : "CARTERET", "loc" : [ -74.231345, 40.582278 ], "pop" : 19025, "state" : "NJ" } +{ "_id" : "07009", "city" : "CEDAR GROVE", "loc" : [ -74.22967199999999, 40.85344 ], "pop" : 11787, "state" : "NJ" } +{ "_id" : "07010", "city" : "CLIFFSIDE PARK", "loc" : [ -73.987982, 40.822168 ], "pop" : 20687, "state" : "NJ" } +{ "_id" : "07011", "city" : "CLIFTON", "loc" : [ -74.142459, 40.878876 ], "pop" : 31569, "state" : "NJ" } +{ "_id" : "07012", "city" : "CLIFTON", "loc" : [ -74.16117199999999, 40.848835 ], "pop" : 10107, "state" : "NJ" } +{ "_id" : "07013", "city" : "CLIFTON", "loc" : [ -74.171144, 40.869334 ], "pop" : 25503, "state" : "NJ" } +{ "_id" : "07014", "city" : "CLIFTON", "loc" : [ -74.137682, 40.834375 ], "pop" : 4288, "state" : "NJ" } +{ "_id" : "07016", "city" : "CRANFORD", "loc" : [ -74.305685, 40.655357 ], "pop" : 22866, "state" : "NJ" } +{ "_id" : "07017", "city" : "EAST ORANGE", "loc" : [ -74.207723, 40.769614 ], "pop" : 41737, "state" : "NJ" } +{ "_id" : "07018", "city" : "EAST ORANGE", "loc" : [ -74.21982199999999, 40.755799 ], "pop" : 32618, "state" : "NJ" } +{ "_id" : "07020", "city" : "EDGEWATER", "loc" : [ -73.973821, 40.831654 ], "pop" : 5001, "state" : "NJ" } +{ "_id" : "07021", "city" : "ESSEX FELLS", "loc" : [ -74.27970500000001, 40.827924 ], "pop" : 2102, "state" : "NJ" } +{ "_id" : "07022", "city" : "FAIRVIEW", "loc" : [ -73.999967, 40.816985 ], "pop" : 10682, "state" : "NJ" } +{ "_id" : "07023", "city" : "FANWOOD", "loc" : [ -74.386762, 40.641856 ], "pop" : 6528, "state" : "NJ" } +{ "_id" : "07024", "city" : "FORT LEE", "loc" : [ -73.97445500000001, 40.850312 ], "pop" : 32030, "state" : "NJ" } +{ "_id" : "07026", "city" : "GARFIELD", "loc" : [ -74.108141, 40.878886 ], "pop" : 26727, "state" : "NJ" } +{ "_id" : "07027", "city" : "GARWOOD", "loc" : [ -74.323864, 40.65121 ], "pop" : 4277, "state" : "NJ" } +{ "_id" : "07028", "city" : "GLEN RIDGE", "loc" : [ -74.205477, 40.804015 ], "pop" : 7751, "state" : "NJ" } +{ "_id" : "07029", "city" : "KEARNY", "loc" : [ -74.155871, 40.74754 ], "pop" : 15587, "state" : "NJ" } +{ "_id" : "07030", "city" : "HOBOKEN", "loc" : [ -74.03286300000001, 40.7445 ], "pop" : 33397, "state" : "NJ" } +{ "_id" : "07031", "city" : "NORTH ARLINGTON", "loc" : [ -74.134288, 40.78977 ], "pop" : 13629, "state" : "NJ" } +{ "_id" : "07032", "city" : "KEARNY", "loc" : [ -74.147108, 40.76466 ], "pop" : 34869, "state" : "NJ" } +{ "_id" : "07033", "city" : "KENILWORTH", "loc" : [ -74.294419, 40.675869 ], "pop" : 7516, "state" : "NJ" } +{ "_id" : "07034", "city" : "LAKE HIAWATHA", "loc" : [ -74.38301300000001, 40.88252 ], "pop" : 9361, "state" : "NJ" } +{ "_id" : "07035", "city" : "LINCOLN PARK", "loc" : [ -74.29951199999999, 40.920769 ], "pop" : 10814, "state" : "NJ" } +{ "_id" : "07036", "city" : "LINDEN", "loc" : [ -74.255567, 40.635366 ], "pop" : 37859, "state" : "NJ" } +{ "_id" : "07039", "city" : "LIVINGSTON", "loc" : [ -74.3202, 40.789633 ], "pop" : 26677, "state" : "NJ" } +{ "_id" : "07040", "city" : "MAPLEWOOD", "loc" : [ -74.265573, 40.727906 ], "pop" : 21588, "state" : "NJ" } +{ "_id" : "07041", "city" : "MILLBURN", "loc" : [ -74.301469, 40.722798 ], "pop" : 6501, "state" : "NJ" } +{ "_id" : "07042", "city" : "MONTCLAIR", "loc" : [ -74.21646699999999, 40.81307 ], "pop" : 24938, "state" : "NJ" } +{ "_id" : "07043", "city" : "MONTCLAIR", "loc" : [ -74.201104, 40.843023 ], "pop" : 11891, "state" : "NJ" } +{ "_id" : "07044", "city" : "VERONA", "loc" : [ -74.242847, 40.831928 ], "pop" : 13583, "state" : "NJ" } +{ "_id" : "07045", "city" : "MONTVILLE", "loc" : [ -74.36456, 40.904914 ], "pop" : 6571, "state" : "NJ" } +{ "_id" : "07046", "city" : "MOUNTAIN LAKES", "loc" : [ -74.441487, 40.890447 ], "pop" : 4250, "state" : "NJ" } +{ "_id" : "07047", "city" : "NORTH BERGEN", "loc" : [ -74.017715, 40.793019 ], "pop" : 50823, "state" : "NJ" } +{ "_id" : "07050", "city" : "ORANGE", "loc" : [ -74.2355, 40.769223 ], "pop" : 28789, "state" : "NJ" } +{ "_id" : "07052", "city" : "WEST ORANGE", "loc" : [ -74.256765, 40.785926 ], "pop" : 38639, "state" : "NJ" } +{ "_id" : "07054", "city" : "PARSIPPANY", "loc" : [ -74.411663, 40.862106 ], "pop" : 27179, "state" : "NJ" } +{ "_id" : "07055", "city" : "PASSAIC", "loc" : [ -74.128348, 40.860132 ], "pop" : 58325, "state" : "NJ" } +{ "_id" : "07057", "city" : "WALLINGTON", "loc" : [ -74.10793700000001, 40.85356 ], "pop" : 10816, "state" : "NJ" } +{ "_id" : "07058", "city" : "PINE BROOK", "loc" : [ -74.350009, 40.874207 ], "pop" : 4345, "state" : "NJ" } +{ "_id" : "07059", "city" : "WARREN", "loc" : [ -74.510456, 40.631787 ], "pop" : 10867, "state" : "NJ" } +{ "_id" : "07060", "city" : "NORTH PLAINFIELD", "loc" : [ -74.425298, 40.61978 ], "pop" : 43471, "state" : "NJ" } +{ "_id" : "07062", "city" : "NORTH PLAINFIELD", "loc" : [ -74.406042, 40.631992 ], "pop" : 12756, "state" : "NJ" } +{ "_id" : "07063", "city" : "NORTH PLAINFIELD", "loc" : [ -74.445325, 40.604838 ], "pop" : 14285, "state" : "NJ" } +{ "_id" : "07064", "city" : "PORT READING", "loc" : [ -74.24664300000001, 40.570935 ], "pop" : 4083, "state" : "NJ" } +{ "_id" : "07065", "city" : "RAHWAY", "loc" : [ -74.281881, 40.608668 ], "pop" : 25296, "state" : "NJ" } +{ "_id" : "07066", "city" : "CLARK", "loc" : [ -74.310581, 40.620256 ], "pop" : 14973, "state" : "NJ" } +{ "_id" : "07067", "city" : "COLONIA", "loc" : [ -74.316368, 40.593743 ], "pop" : 18488, "state" : "NJ" } +{ "_id" : "07068", "city" : "ROSELAND", "loc" : [ -74.304688, 40.82034 ], "pop" : 4820, "state" : "NJ" } +{ "_id" : "07070", "city" : "RUTHERFORD", "loc" : [ -74.112146, 40.829245 ], "pop" : 17790, "state" : "NJ" } +{ "_id" : "07071", "city" : "LYNDHURST", "loc" : [ -74.12452999999999, 40.809433 ], "pop" : 18423, "state" : "NJ" } +{ "_id" : "07072", "city" : "CARLSTADT", "loc" : [ -74.09249800000001, 40.840298 ], "pop" : 5541, "state" : "NJ" } +{ "_id" : "07073", "city" : "EAST RUTHERFORD", "loc" : [ -74.104069, 40.838527 ], "pop" : 7874, "state" : "NJ" } +{ "_id" : "07074", "city" : "MOONACHIE", "loc" : [ -74.056646, 40.839352 ], "pop" : 2817, "state" : "NJ" } +{ "_id" : "07075", "city" : "WOOD RIDGE", "loc" : [ -74.087845, 40.849348 ], "pop" : 7548, "state" : "NJ" } +{ "_id" : "07076", "city" : "SCOTCH PLAINS", "loc" : [ -74.381663, 40.642162 ], "pop" : 18514, "state" : "NJ" } +{ "_id" : "07077", "city" : "SEWAREN", "loc" : [ -74.26073599999999, 40.554181 ], "pop" : 2463, "state" : "NJ" } +{ "_id" : "07078", "city" : "SHORT HILLS", "loc" : [ -74.327085, 40.73678 ], "pop" : 12129, "state" : "NJ" } +{ "_id" : "07079", "city" : "SOUTH ORANGE", "loc" : [ -74.257532, 40.746453 ], "pop" : 16115, "state" : "NJ" } +{ "_id" : "07080", "city" : "SOUTH PLAINFIELD", "loc" : [ -74.41469499999999, 40.583884 ], "pop" : 20540, "state" : "NJ" } +{ "_id" : "07081", "city" : "SPRINGFIELD", "loc" : [ -74.322705, 40.701461 ], "pop" : 13452, "state" : "NJ" } +{ "_id" : "07082", "city" : "TOWACO", "loc" : [ -74.34280699999999, 40.927691 ], "pop" : 4355, "state" : "NJ" } +{ "_id" : "07083", "city" : "UNION", "loc" : [ -74.267653, 40.695184 ], "pop" : 46608, "state" : "NJ" } +{ "_id" : "07087", "city" : "WEEHAWKEN", "loc" : [ -74.030558, 40.768153 ], "pop" : 69646, "state" : "NJ" } +{ "_id" : "07088", "city" : "VAUXHALL", "loc" : [ -74.28287400000001, 40.717927 ], "pop" : 3481, "state" : "NJ" } +{ "_id" : "07090", "city" : "WESTFIELD", "loc" : [ -74.345056, 40.647851 ], "pop" : 31885, "state" : "NJ" } +{ "_id" : "07092", "city" : "MOUNTAINSIDE", "loc" : [ -74.358785, 40.678461 ], "pop" : 6660, "state" : "NJ" } +{ "_id" : "07093", "city" : "GUTTENBERG", "loc" : [ -74.01285900000001, 40.788192 ], "pop" : 44735, "state" : "NJ" } +{ "_id" : "07094", "city" : "SECAUCUS", "loc" : [ -74.063416, 40.79101 ], "pop" : 14061, "state" : "NJ" } +{ "_id" : "07095", "city" : "WOODBRIDGE", "loc" : [ -74.284542, 40.555973 ], "pop" : 15827, "state" : "NJ" } +{ "_id" : "07102", "city" : "NEWARK", "loc" : [ -74.17650500000001, 40.73201 ], "pop" : 10328, "state" : "NJ" } +{ "_id" : "07103", "city" : "NEWARK", "loc" : [ -74.196364, 40.736975 ], "pop" : 36949, "state" : "NJ" } +{ "_id" : "07104", "city" : "NEWARK", "loc" : [ -74.1695, 40.766446 ], "pop" : 47183, "state" : "NJ" } +{ "_id" : "07105", "city" : "NEWARK", "loc" : [ -74.156346, 40.727086 ], "pop" : 38104, "state" : "NJ" } +{ "_id" : "07106", "city" : "NEWARK", "loc" : [ -74.233023, 40.741485 ], "pop" : 35013, "state" : "NJ" } +{ "_id" : "07107", "city" : "NEWARK", "loc" : [ -74.18816, 40.760656 ], "pop" : 36649, "state" : "NJ" } +{ "_id" : "07108", "city" : "NEWARK", "loc" : [ -74.201538, 40.723647 ], "pop" : 29730, "state" : "NJ" } +{ "_id" : "07109", "city" : "BELLEVILLE", "loc" : [ -74.16311899999999, 40.79458 ], "pop" : 34924, "state" : "NJ" } +{ "_id" : "07110", "city" : "NUTLEY", "loc" : [ -74.158934, 40.818548 ], "pop" : 26441, "state" : "NJ" } +{ "_id" : "07111", "city" : "IRVINGTON", "loc" : [ -74.23127100000001, 40.7261 ], "pop" : 60986, "state" : "NJ" } +{ "_id" : "07112", "city" : "NEWARK", "loc" : [ -74.21307299999999, 40.71071 ], "pop" : 30356, "state" : "NJ" } +{ "_id" : "07114", "city" : "NEWARK", "loc" : [ -74.189105, 40.708246 ], "pop" : 11260, "state" : "NJ" } +{ "_id" : "07201", "city" : "ELIZABETH", "loc" : [ -74.204335, 40.67169 ], "pop" : 25826, "state" : "NJ" } +{ "_id" : "07202", "city" : "ELIZABETH", "loc" : [ -74.22154399999999, 40.65652 ], "pop" : 33981, "state" : "NJ" } +{ "_id" : "07203", "city" : "ROSELLE", "loc" : [ -74.261044, 40.652972 ], "pop" : 20159, "state" : "NJ" } +{ "_id" : "07204", "city" : "ROSELLE PARK", "loc" : [ -74.267003, 40.665134 ], "pop" : 12784, "state" : "NJ" } +{ "_id" : "07205", "city" : "HILLSIDE", "loc" : [ -74.228065, 40.696811 ], "pop" : 20860, "state" : "NJ" } +{ "_id" : "07206", "city" : "ELIZABETH", "loc" : [ -74.192487, 40.653207 ], "pop" : 23830, "state" : "NJ" } +{ "_id" : "07208", "city" : "ELIZABETH", "loc" : [ -74.22392000000001, 40.674659 ], "pop" : 26609, "state" : "NJ" } +{ "_id" : "07302", "city" : "JERSEY CITY", "loc" : [ -74.04687800000001, 40.722126 ], "pop" : 32876, "state" : "NJ" } +{ "_id" : "07304", "city" : "JERSEY CITY", "loc" : [ -74.07535799999999, 40.717973 ], "pop" : 42101, "state" : "NJ" } +{ "_id" : "07305", "city" : "JERSEY CITY", "loc" : [ -74.088998, 40.702007 ], "pop" : 58655, "state" : "NJ" } +{ "_id" : "07306", "city" : "JERSEY CITY", "loc" : [ -74.06603800000001, 40.732125 ], "pop" : 53257, "state" : "NJ" } +{ "_id" : "07307", "city" : "JERSEY CITY", "loc" : [ -74.049752, 40.748167 ], "pop" : 40704, "state" : "NJ" } +{ "_id" : "07310", "city" : "JERSEY CITY", "loc" : [ -74.043149, 40.732354 ], "pop" : 944, "state" : "NJ" } +{ "_id" : "07401", "city" : "ALLENDALE", "loc" : [ -74.134185, 41.032654 ], "pop" : 5907, "state" : "NJ" } +{ "_id" : "07403", "city" : "BLOOMINGDALE", "loc" : [ -74.33375599999999, 41.012845 ], "pop" : 7520, "state" : "NJ" } +{ "_id" : "07405", "city" : "KINNELON", "loc" : [ -74.364065, 40.992118 ], "pop" : 15325, "state" : "NJ" } +{ "_id" : "07407", "city" : "ELMWOOD PARK", "loc" : [ -74.120896, 40.906896 ], "pop" : 17649, "state" : "NJ" } +{ "_id" : "07410", "city" : "FAIR LAWN", "loc" : [ -74.11660000000001, 40.934297 ], "pop" : 30522, "state" : "NJ" } +{ "_id" : "07416", "city" : "FRANKLIN", "loc" : [ -74.58649, 41.116355 ], "pop" : 5380, "state" : "NJ" } +{ "_id" : "07417", "city" : "FRANKLIN LAKES", "loc" : [ -74.211347, 41.008095 ], "pop" : 9873, "state" : "NJ" } +{ "_id" : "07418", "city" : "GLENWOOD", "loc" : [ -74.48848099999999, 41.235618 ], "pop" : 2446, "state" : "NJ" } +{ "_id" : "07419", "city" : "HAMBURG", "loc" : [ -74.587379, 41.146714 ], "pop" : 4198, "state" : "NJ" } +{ "_id" : "07420", "city" : "HASKELL", "loc" : [ -74.296542, 41.030111 ], "pop" : 4813, "state" : "NJ" } +{ "_id" : "07421", "city" : "HEWITT", "loc" : [ -74.368566, 41.170867 ], "pop" : 6907, "state" : "NJ" } +{ "_id" : "07422", "city" : "HIGHLAND LAKES", "loc" : [ -74.456442, 41.182622 ], "pop" : 7615, "state" : "NJ" } +{ "_id" : "07423", "city" : "HO HO KUS", "loc" : [ -74.102532, 41.000412 ], "pop" : 3967, "state" : "NJ" } +{ "_id" : "07424", "city" : "WEST PATERSON", "loc" : [ -74.21145, 40.885353 ], "pop" : 22626, "state" : "NJ" } +{ "_id" : "07430", "city" : "MAHWAH", "loc" : [ -74.155974, 41.074473 ], "pop" : 17991, "state" : "NJ" } +{ "_id" : "07432", "city" : "MIDLAND PARK", "loc" : [ -74.14090400000001, 40.995668 ], "pop" : 6693, "state" : "NJ" } +{ "_id" : "07435", "city" : "NEWFOUNDLAND", "loc" : [ -74.435857, 41.064691 ], "pop" : 1624, "state" : "NJ" } +{ "_id" : "07436", "city" : "OAKLAND", "loc" : [ -74.233754, 41.029436 ], "pop" : 11997, "state" : "NJ" } +{ "_id" : "07438", "city" : "MILTON", "loc" : [ -74.50880100000001, 41.028401 ], "pop" : 10453, "state" : "NJ" } +{ "_id" : "07439", "city" : "OGDENSBURG", "loc" : [ -74.59818799999999, 41.076707 ], "pop" : 2722, "state" : "NJ" } +{ "_id" : "07440", "city" : "PEQUANNOCK", "loc" : [ -74.29601, 40.947308 ], "pop" : 4932, "state" : "NJ" } +{ "_id" : "07442", "city" : "POMPTON LAKES", "loc" : [ -74.287566, 40.999284 ], "pop" : 10539, "state" : "NJ" } +{ "_id" : "07444", "city" : "POMPTON PLAINS", "loc" : [ -74.301602, 40.965515 ], "pop" : 8028, "state" : "NJ" } +{ "_id" : "07446", "city" : "RAMSEY", "loc" : [ -74.14446700000001, 41.057743 ], "pop" : 13135, "state" : "NJ" } +{ "_id" : "07450", "city" : "RIDGEWOOD", "loc" : [ -74.113134, 40.982023 ], "pop" : 24452, "state" : "NJ" } +{ "_id" : "07452", "city" : "GLEN ROCK", "loc" : [ -74.125367, 40.960183 ], "pop" : 10942, "state" : "NJ" } +{ "_id" : "07456", "city" : "RINGWOOD", "loc" : [ -74.265872, 41.092816 ], "pop" : 12645, "state" : "NJ" } +{ "_id" : "07457", "city" : "RIVERDALE", "loc" : [ -74.308756, 40.993109 ], "pop" : 2365, "state" : "NJ" } +{ "_id" : "07458", "city" : "UPPER SADDLE RIV", "loc" : [ -74.09677499999999, 41.053083 ], "pop" : 10148, "state" : "NJ" } +{ "_id" : "07460", "city" : "STOCKHOLM", "loc" : [ -74.528256, 41.099204 ], "pop" : 3375, "state" : "NJ" } +{ "_id" : "07461", "city" : "SUSSEX", "loc" : [ -74.59915599999999, 41.229211 ], "pop" : 15969, "state" : "NJ" } +{ "_id" : "07462", "city" : "VERNON", "loc" : [ -74.533196, 41.184981 ], "pop" : 6460, "state" : "NJ" } +{ "_id" : "07463", "city" : "WALDWICK", "loc" : [ -74.124259, 41.012968 ], "pop" : 9720, "state" : "NJ" } +{ "_id" : "07465", "city" : "WANAQUE", "loc" : [ -74.27896800000001, 41.054447 ], "pop" : 4941, "state" : "NJ" } +{ "_id" : "07470", "city" : "WAYNE", "loc" : [ -74.246565, 40.947112 ], "pop" : 46815, "state" : "NJ" } +{ "_id" : "07480", "city" : "WEST MILFORD", "loc" : [ -74.374996, 41.091513 ], "pop" : 15417, "state" : "NJ" } +{ "_id" : "07481", "city" : "WYCKOFF", "loc" : [ -74.166009, 40.997834 ], "pop" : 15372, "state" : "NJ" } +{ "_id" : "07501", "city" : "PATERSON", "loc" : [ -74.167141, 40.914273 ], "pop" : 33364, "state" : "NJ" } +{ "_id" : "07502", "city" : "PATERSON", "loc" : [ -74.19323799999999, 40.919926 ], "pop" : 12698, "state" : "NJ" } +{ "_id" : "07503", "city" : "PATERSON", "loc" : [ -74.15727200000001, 40.897046 ], "pop" : 18683, "state" : "NJ" } +{ "_id" : "07504", "city" : "PATERSON", "loc" : [ -74.145247, 40.912179 ], "pop" : 12152, "state" : "NJ" } +{ "_id" : "07505", "city" : "PATERSON", "loc" : [ -74.171947, 40.915581 ], "pop" : 1837, "state" : "NJ" } +{ "_id" : "07506", "city" : "HAWTHORNE", "loc" : [ -74.156897, 40.956355 ], "pop" : 16920, "state" : "NJ" } +{ "_id" : "07508", "city" : "HALEDON", "loc" : [ -74.182599, 40.945689 ], "pop" : 19757, "state" : "NJ" } +{ "_id" : "07512", "city" : "TOTOWA", "loc" : [ -74.21675, 40.904811 ], "pop" : 10147, "state" : "NJ" } +{ "_id" : "07513", "city" : "PATERSON", "loc" : [ -74.152862, 40.906994 ], "pop" : 10088, "state" : "NJ" } +{ "_id" : "07514", "city" : "PATERSON", "loc" : [ -74.146717, 40.924764 ], "pop" : 18860, "state" : "NJ" } +{ "_id" : "07522", "city" : "PATERSON", "loc" : [ -74.178078, 40.925168 ], "pop" : 21813, "state" : "NJ" } +{ "_id" : "07524", "city" : "PATERSON", "loc" : [ -74.155457, 40.930916 ], "pop" : 11887, "state" : "NJ" } +{ "_id" : "07601", "city" : "HACKENSACK", "loc" : [ -74.050301, 40.888191 ], "pop" : 36963, "state" : "NJ" } +{ "_id" : "07603", "city" : "BOGOTA", "loc" : [ -74.028122, 40.874441 ], "pop" : 7824, "state" : "NJ" } +{ "_id" : "07604", "city" : "HASBROUCK HEIGHT", "loc" : [ -74.075971, 40.862241 ], "pop" : 11499, "state" : "NJ" } +{ "_id" : "07605", "city" : "LEONIA", "loc" : [ -73.98787299999999, 40.862929 ], "pop" : 8326, "state" : "NJ" } +{ "_id" : "07606", "city" : "SOUTH HACKENSACK", "loc" : [ -74.045601, 40.863391 ], "pop" : 2150, "state" : "NJ" } +{ "_id" : "07607", "city" : "MAYWOOD", "loc" : [ -74.062916, 40.902412 ], "pop" : 9473, "state" : "NJ" } +{ "_id" : "07608", "city" : "TETERBORO", "loc" : [ -74.054204, 40.86175 ], "pop" : 22, "state" : "NJ" } +{ "_id" : "07620", "city" : "ALPINE", "loc" : [ -73.930842, 40.951097 ], "pop" : 1716, "state" : "NJ" } +{ "_id" : "07621", "city" : "BERGENFIELD", "loc" : [ -73.998918, 40.923837 ], "pop" : 24613, "state" : "NJ" } +{ "_id" : "07624", "city" : "CLOSTER", "loc" : [ -73.958985, 40.972051 ], "pop" : 8101, "state" : "NJ" } +{ "_id" : "07626", "city" : "CRESSKILL", "loc" : [ -73.96520599999999, 40.941847 ], "pop" : 7633, "state" : "NJ" } +{ "_id" : "07627", "city" : "DEMAREST", "loc" : [ -73.960221, 40.954775 ], "pop" : 4718, "state" : "NJ" } +{ "_id" : "07628", "city" : "DUMONT", "loc" : [ -73.99213899999999, 40.944692 ], "pop" : 17187, "state" : "NJ" } +{ "_id" : "07630", "city" : "EMERSON", "loc" : [ -74.028515, 40.975459 ], "pop" : 6519, "state" : "NJ" } +{ "_id" : "07631", "city" : "ENGLEWOOD", "loc" : [ -73.977182, 40.894251 ], "pop" : 24869, "state" : "NJ" } +{ "_id" : "07632", "city" : "ENGLEWOOD CLIFFS", "loc" : [ -73.954449, 40.882043 ], "pop" : 5644, "state" : "NJ" } +{ "_id" : "07640", "city" : "HARRINGTON PARK", "loc" : [ -73.980017, 40.991791 ], "pop" : 4628, "state" : "NJ" } +{ "_id" : "07641", "city" : "HAWORTH", "loc" : [ -73.987376, 40.960808 ], "pop" : 3384, "state" : "NJ" } +{ "_id" : "07642", "city" : "HILLSDALE", "loc" : [ -74.042625, 41.006945 ], "pop" : 9771, "state" : "NJ" } +{ "_id" : "07643", "city" : "LITTLE FERRY", "loc" : [ -74.040502, 40.849319 ], "pop" : 9970, "state" : "NJ" } +{ "_id" : "07644", "city" : "LODI", "loc" : [ -74.083827, 40.876363 ], "pop" : 22345, "state" : "NJ" } +{ "_id" : "07645", "city" : "MONTVALE", "loc" : [ -74.03836200000001, 41.049458 ], "pop" : 6935, "state" : "NJ" } +{ "_id" : "07646", "city" : "NEW MILFORD", "loc" : [ -74.01951699999999, 40.933115 ], "pop" : 15799, "state" : "NJ" } +{ "_id" : "07647", "city" : "ROCKLEIGH", "loc" : [ -73.952375, 41.011196 ], "pop" : 4833, "state" : "NJ" } +{ "_id" : "07648", "city" : "NORWOOD", "loc" : [ -73.95817, 40.995231 ], "pop" : 4858, "state" : "NJ" } +{ "_id" : "07649", "city" : "ORADELL", "loc" : [ -74.033525, 40.953456 ], "pop" : 8069, "state" : "NJ" } +{ "_id" : "07650", "city" : "PALISADES PARK", "loc" : [ -73.995436, 40.846238 ], "pop" : 14536, "state" : "NJ" } +{ "_id" : "07652", "city" : "PARAMUS", "loc" : [ -74.06724, 40.947683 ], "pop" : 25085, "state" : "NJ" } +{ "_id" : "07656", "city" : "PARK RIDGE", "loc" : [ -74.039574, 41.034349 ], "pop" : 8120, "state" : "NJ" } +{ "_id" : "07657", "city" : "RIDGEFIELD", "loc" : [ -74.001531, 40.832568 ], "pop" : 9753, "state" : "NJ" } +{ "_id" : "07660", "city" : "RIDGEFIELD PARK", "loc" : [ -74.02296200000001, 40.856218 ], "pop" : 12454, "state" : "NJ" } +{ "_id" : "07661", "city" : "RIVER EDGE", "loc" : [ -74.03924000000001, 40.926476 ], "pop" : 10603, "state" : "NJ" } +{ "_id" : "07662", "city" : "SADDLE BROOK", "loc" : [ -74.091296, 40.904928 ], "pop" : 18883, "state" : "NJ" } +{ "_id" : "07666", "city" : "TEANECK", "loc" : [ -74.011928, 40.89148 ], "pop" : 37822, "state" : "NJ" } +{ "_id" : "07670", "city" : "TENAFLY", "loc" : [ -73.965906, 40.921596 ], "pop" : 13297, "state" : "NJ" } +{ "_id" : "07675", "city" : "OLD TAPPAN", "loc" : [ -74.03258599999999, 41.001696 ], "pop" : 39036, "state" : "NJ" } +{ "_id" : "07701", "city" : "SUBURBAN", "loc" : [ -74.080003, 40.354083 ], "pop" : 22320, "state" : "NJ" } +{ "_id" : "07702", "city" : "SHREWSBURY", "loc" : [ -74.058892, 40.328198 ], "pop" : 3096, "state" : "NJ" } +{ "_id" : "07703", "city" : "FORT MONMOUTH", "loc" : [ -74.039001, 40.317667 ], "pop" : 919, "state" : "NJ" } +{ "_id" : "07704", "city" : "FAIR HAVEN", "loc" : [ -74.03889100000001, 40.359873 ], "pop" : 5176, "state" : "NJ" } +{ "_id" : "07711", "city" : "ALLENHURST", "loc" : [ -74.00670599999999, 40.236675 ], "pop" : 2030, "state" : "NJ" } +{ "_id" : "07712", "city" : "OCEAN", "loc" : [ -74.02948600000001, 40.235571 ], "pop" : 35939, "state" : "NJ" } +{ "_id" : "07716", "city" : "ATLANTIC HIGHLAN", "loc" : [ -74.032411, 40.40772 ], "pop" : 8440, "state" : "NJ" } +{ "_id" : "07717", "city" : "AVON BY THE SEA", "loc" : [ -74.01673700000001, 40.191796 ], "pop" : 2165, "state" : "NJ" } +{ "_id" : "07718", "city" : "BELFORD", "loc" : [ -74.088887, 40.417281 ], "pop" : 6601, "state" : "NJ" } +{ "_id" : "07719", "city" : "WALL", "loc" : [ -74.047247, 40.17434 ], "pop" : 19146, "state" : "NJ" } +{ "_id" : "07720", "city" : "BRADLEY BEACH", "loc" : [ -74.013166, 40.202308 ], "pop" : 4475, "state" : "NJ" } +{ "_id" : "07721", "city" : "CLIFFWOOD", "loc" : [ -74.235759, 40.435281 ], "pop" : 2332, "state" : "NJ" } +{ "_id" : "07722", "city" : "COLTS NECK", "loc" : [ -74.177988, 40.301225 ], "pop" : 8623, "state" : "NJ" } +{ "_id" : "07723", "city" : "DEAL", "loc" : [ -74.001998, 40.250568 ], "pop" : 1722, "state" : "NJ" } +{ "_id" : "07724", "city" : "EATONTOWN", "loc" : [ -74.06977999999999, 40.302815 ], "pop" : 23682, "state" : "NJ" } +{ "_id" : "07726", "city" : "MANALAPAN", "loc" : [ -74.330613, 40.306274 ], "pop" : 28928, "state" : "NJ" } +{ "_id" : "07727", "city" : "FARMINGDALE", "loc" : [ -74.177864, 40.204312 ], "pop" : 4794, "state" : "NJ" } +{ "_id" : "07728", "city" : "FREEHOLD", "loc" : [ -74.276822, 40.245776 ], "pop" : 42567, "state" : "NJ" } +{ "_id" : "07730", "city" : "HAZLET", "loc" : [ -74.179896, 40.422554 ], "pop" : 17181, "state" : "NJ" } +{ "_id" : "07731", "city" : "HOWELL", "loc" : [ -74.213683, 40.148096 ], "pop" : 31114, "state" : "NJ" } +{ "_id" : "07732", "city" : "FORT HANCOCK", "loc" : [ -73.99091199999999, 40.402377 ], "pop" : 4962, "state" : "NJ" } +{ "_id" : "07733", "city" : "HOLMDEL", "loc" : [ -74.17397099999999, 40.385853 ], "pop" : 11165, "state" : "NJ" } +{ "_id" : "07734", "city" : "KEANSBURG", "loc" : [ -74.130633, 40.441363 ], "pop" : 21931, "state" : "NJ" } +{ "_id" : "07735", "city" : "KEYPORT", "loc" : [ -74.199563, 40.439862 ], "pop" : 21082, "state" : "NJ" } +{ "_id" : "07737", "city" : "LEONARDO", "loc" : [ -74.062265, 40.417704 ], "pop" : 5027, "state" : "NJ" } +{ "_id" : "07738", "city" : "LINCROFT", "loc" : [ -74.120469, 40.33689 ], "pop" : 6214, "state" : "NJ" } +{ "_id" : "07739", "city" : "LITTLE SILVER", "loc" : [ -74.041319, 40.335393 ], "pop" : 5683, "state" : "NJ" } +{ "_id" : "07740", "city" : "LONG BRANCH", "loc" : [ -73.991176, 40.299204 ], "pop" : 29053, "state" : "NJ" } +{ "_id" : "07746", "city" : "MARLBORO", "loc" : [ -74.26387099999999, 40.31825 ], "pop" : 14956, "state" : "NJ" } +{ "_id" : "07747", "city" : "MATAWAN", "loc" : [ -74.237955, 40.410876 ], "pop" : 26130, "state" : "NJ" } +{ "_id" : "07748", "city" : "NEW MONMOUTH", "loc" : [ -74.113908, 40.396018 ], "pop" : 22727, "state" : "NJ" } +{ "_id" : "07750", "city" : "MONMOUTH BEACH", "loc" : [ -73.98089, 40.333032 ], "pop" : 3329, "state" : "NJ" } +{ "_id" : "07751", "city" : "MORGANVILLE", "loc" : [ -74.277863, 40.352917 ], "pop" : 11680, "state" : "NJ" } +{ "_id" : "07753", "city" : "NEPTUNE CITY", "loc" : [ -74.054045, 40.211153 ], "pop" : 32147, "state" : "NJ" } +{ "_id" : "07755", "city" : "OAKHURST", "loc" : [ -74.018413, 40.26479 ], "pop" : 5637, "state" : "NJ" } +{ "_id" : "07756", "city" : "OCEAN GROVE", "loc" : [ -74.009306, 40.211606 ], "pop" : 4723, "state" : "NJ" } +{ "_id" : "07757", "city" : "OCEANPORT", "loc" : [ -74.016372, 40.31573 ], "pop" : 5227, "state" : "NJ" } +{ "_id" : "07758", "city" : "PORT MONMOUTH", "loc" : [ -74.108259, 40.428886 ], "pop" : 4698, "state" : "NJ" } +{ "_id" : "07760", "city" : "SEA BRIGHT", "loc" : [ -74.000618, 40.371829 ], "pop" : 9700, "state" : "NJ" } +{ "_id" : "07762", "city" : "SPRING LAKE", "loc" : [ -74.037885, 40.154198 ], "pop" : 9384, "state" : "NJ" } +{ "_id" : "07764", "city" : "WEST LONG BRANCH", "loc" : [ -74.016221, 40.287811 ], "pop" : 7666, "state" : "NJ" } +{ "_id" : "07801", "city" : "MINE HILL", "loc" : [ -74.559702, 40.887218 ], "pop" : 25588, "state" : "NJ" } +{ "_id" : "07821", "city" : "ANDOVER", "loc" : [ -74.75241800000001, 40.961386 ], "pop" : 8931, "state" : "NJ" } +{ "_id" : "07822", "city" : "AUGUSTA", "loc" : [ -74.684753, 41.145086 ], "pop" : 1555, "state" : "NJ" } +{ "_id" : "07823", "city" : "BELVIDERE", "loc" : [ -75.05026100000001, 40.830819 ], "pop" : 5790, "state" : "NJ" } +{ "_id" : "07825", "city" : "BLAIRSTOWN", "loc" : [ -74.965097, 40.967386 ], "pop" : 8815, "state" : "NJ" } +{ "_id" : "07826", "city" : "BRANCHVILLE", "loc" : [ -74.75002499999999, 41.170512 ], "pop" : 5009, "state" : "NJ" } +{ "_id" : "07827", "city" : "MONTAGUE", "loc" : [ -74.753956, 41.302259 ], "pop" : 3228, "state" : "NJ" } +{ "_id" : "07828", "city" : "BUDD LAKE", "loc" : [ -74.742552, 40.873108 ], "pop" : 11588, "state" : "NJ" } +{ "_id" : "07830", "city" : "CALIFON", "loc" : [ -74.815218, 40.716209 ], "pop" : 5526, "state" : "NJ" } +{ "_id" : "07832", "city" : "COLUMBIA", "loc" : [ -75.05498299999999, 40.938805 ], "pop" : 3185, "state" : "NJ" } +{ "_id" : "07834", "city" : "DENVILLE", "loc" : [ -74.484379, 40.889735 ], "pop" : 14075, "state" : "NJ" } +{ "_id" : "07836", "city" : "FLANDERS", "loc" : [ -74.70188, 40.845316 ], "pop" : 10548, "state" : "NJ" } +{ "_id" : "07838", "city" : "GREAT MEADOWS", "loc" : [ -74.941806, 40.85196 ], "pop" : 2303, "state" : "NJ" } +{ "_id" : "07840", "city" : "HACKETTSTOWN", "loc" : [ -74.834315, 40.852891 ], "pop" : 23440, "state" : "NJ" } +{ "_id" : "07843", "city" : "HOPATCONG", "loc" : [ -74.66163, 40.938983 ], "pop" : 11920, "state" : "NJ" } +{ "_id" : "07847", "city" : "KENVIL", "loc" : [ -74.62098400000001, 40.881901 ], "pop" : 1356, "state" : "NJ" } +{ "_id" : "07848", "city" : "LAFAYETTE", "loc" : [ -74.69122299999999, 41.076099 ], "pop" : 2992, "state" : "NJ" } +{ "_id" : "07849", "city" : "LAKE HOPATCONG", "loc" : [ -74.61443800000001, 40.965882 ], "pop" : 7241, "state" : "NJ" } +{ "_id" : "07850", "city" : "LANDING", "loc" : [ -74.65542499999999, 40.908684 ], "pop" : 6482, "state" : "NJ" } +{ "_id" : "07851", "city" : "LAYTON", "loc" : [ -74.81721899999999, 41.205913 ], "pop" : 807, "state" : "NJ" } +{ "_id" : "07852", "city" : "LEDGEWOOD", "loc" : [ -74.655405, 40.878028 ], "pop" : 997, "state" : "NJ" } +{ "_id" : "07853", "city" : "LONG VALLEY", "loc" : [ -74.78698, 40.787817 ], "pop" : 12345, "state" : "NJ" } +{ "_id" : "07856", "city" : "MOUNT ARLINGTON", "loc" : [ -74.636331, 40.928267 ], "pop" : 2240, "state" : "NJ" } +{ "_id" : "07857", "city" : "NETCONG", "loc" : [ -74.698454, 40.898497 ], "pop" : 3330, "state" : "NJ" } +{ "_id" : "07860", "city" : "FREDON TOWNSHIP", "loc" : [ -74.780191, 41.058275 ], "pop" : 25022, "state" : "NJ" } +{ "_id" : "07863", "city" : "OXFORD", "loc" : [ -75.00194, 40.810537 ], "pop" : 2610, "state" : "NJ" } +{ "_id" : "07865", "city" : "PORT MURRAY", "loc" : [ -74.91674999999999, 40.790615 ], "pop" : 2124, "state" : "NJ" } +{ "_id" : "07866", "city" : "ROCKAWAY", "loc" : [ -74.50937, 40.922916 ], "pop" : 20388, "state" : "NJ" } +{ "_id" : "07869", "city" : "RANDOLPH", "loc" : [ -74.572519, 40.845557 ], "pop" : 20870, "state" : "NJ" } +{ "_id" : "07871", "city" : "SPARTA", "loc" : [ -74.64070100000001, 41.027697 ], "pop" : 15324, "state" : "NJ" } +{ "_id" : "07874", "city" : "STANHOPE", "loc" : [ -74.70044, 40.921743 ], "pop" : 9375, "state" : "NJ" } +{ "_id" : "07876", "city" : "SUCCASUNNA", "loc" : [ -74.65360099999999, 40.85385 ], "pop" : 10640, "state" : "NJ" } +{ "_id" : "07881", "city" : "WALLPACK CENTER", "loc" : [ -74.91759500000001, 41.134332 ], "pop" : 67, "state" : "NJ" } +{ "_id" : "07882", "city" : "WASHINGTON", "loc" : [ -74.991361, 40.75818 ], "pop" : 13409, "state" : "NJ" } +{ "_id" : "07885", "city" : "WHARTON", "loc" : [ -74.58634000000001, 40.913883 ], "pop" : 7842, "state" : "NJ" } +{ "_id" : "07901", "city" : "SUMMIT", "loc" : [ -74.364159, 40.71494 ], "pop" : 20151, "state" : "NJ" } +{ "_id" : "07920", "city" : "BASKING RIDGE", "loc" : [ -74.560463, 40.678937 ], "pop" : 17810, "state" : "NJ" } +{ "_id" : "07921", "city" : "BEDMINSTER", "loc" : [ -74.643236, 40.657109 ], "pop" : 6515, "state" : "NJ" } +{ "_id" : "07922", "city" : "BERKELEY HEIGHTS", "loc" : [ -74.43459900000001, 40.67522 ], "pop" : 11155, "state" : "NJ" } +{ "_id" : "07924", "city" : "BERNARDSVILLE", "loc" : [ -74.57781199999999, 40.72251 ], "pop" : 6454, "state" : "NJ" } +{ "_id" : "07927", "city" : "CEDAR KNOLLS", "loc" : [ -74.456861, 40.822335 ], "pop" : 3449, "state" : "NJ" } +{ "_id" : "07928", "city" : "CHATHAM", "loc" : [ -74.401701, 40.730526 ], "pop" : 16708, "state" : "NJ" } +{ "_id" : "07930", "city" : "CHESTER", "loc" : [ -74.677649, 40.789193 ], "pop" : 6635, "state" : "NJ" } +{ "_id" : "07931", "city" : "FAR HILLS", "loc" : [ -74.653959, 40.704035 ], "pop" : 2728, "state" : "NJ" } +{ "_id" : "07932", "city" : "FLORHAM PARK", "loc" : [ -74.392819, 40.775701 ], "pop" : 8473, "state" : "NJ" } +{ "_id" : "07933", "city" : "GILLETTE", "loc" : [ -74.46813400000001, 40.687678 ], "pop" : 3296, "state" : "NJ" } +{ "_id" : "07934", "city" : "GLADSTONE", "loc" : [ -74.67065599999999, 40.721948 ], "pop" : 887, "state" : "NJ" } +{ "_id" : "07935", "city" : "GREEN VILLAGE", "loc" : [ -74.451685, 40.741618 ], "pop" : 893, "state" : "NJ" } +{ "_id" : "07936", "city" : "EAST HANOVER", "loc" : [ -74.36357, 40.819165 ], "pop" : 9904, "state" : "NJ" } +{ "_id" : "07940", "city" : "MADISON", "loc" : [ -74.417868, 40.759939 ], "pop" : 15960, "state" : "NJ" } +{ "_id" : "07945", "city" : "MENDHAM", "loc" : [ -74.60003500000001, 40.778919 ], "pop" : 7756, "state" : "NJ" } +{ "_id" : "07946", "city" : "MILLINGTON", "loc" : [ -74.518292, 40.672716 ], "pop" : 2506, "state" : "NJ" } +{ "_id" : "07950", "city" : "GREYSTONE PARK", "loc" : [ -74.479645, 40.843982 ], "pop" : 16528, "state" : "NJ" } +{ "_id" : "07960", "city" : "MORRISTOWN", "loc" : [ -74.48728800000001, 40.795236 ], "pop" : 38516, "state" : "NJ" } +{ "_id" : "07974", "city" : "NEW PROVIDENCE", "loc" : [ -74.40229100000001, 40.700403 ], "pop" : 11838, "state" : "NJ" } +{ "_id" : "07976", "city" : "NEW VERNON", "loc" : [ -74.484471, 40.734685 ], "pop" : 682, "state" : "NJ" } +{ "_id" : "07980", "city" : "STIRLING", "loc" : [ -74.49683, 40.677366 ], "pop" : 2355, "state" : "NJ" } +{ "_id" : "07981", "city" : "WHIPPANY", "loc" : [ -74.419971, 40.821862 ], "pop" : 7233, "state" : "NJ" } +{ "_id" : "08002", "city" : "CHERRY HILL", "loc" : [ -75.017538, 39.930808 ], "pop" : 21271, "state" : "NJ" } +{ "_id" : "08003", "city" : "CHERRY HILL", "loc" : [ -74.970568, 39.880453 ], "pop" : 29058, "state" : "NJ" } +{ "_id" : "08004", "city" : "WINSLOW", "loc" : [ -74.879368, 39.770909 ], "pop" : 14312, "state" : "NJ" } +{ "_id" : "08005", "city" : "BARNEGAT", "loc" : [ -74.246988, 39.755248 ], "pop" : 13036, "state" : "NJ" } +{ "_id" : "08007", "city" : "BARRINGTON", "loc" : [ -75.056361, 39.865062 ], "pop" : 5185, "state" : "NJ" } +{ "_id" : "08008", "city" : "HARVEY CEDARS", "loc" : [ -74.18903299999999, 39.636347 ], "pop" : 8647, "state" : "NJ" } +{ "_id" : "08009", "city" : "BERLIN", "loc" : [ -74.930808, 39.778839 ], "pop" : 14034, "state" : "NJ" } +{ "_id" : "08010", "city" : "BEVERLY", "loc" : [ -74.91136299999999, 40.056452 ], "pop" : 11361, "state" : "NJ" } +{ "_id" : "08012", "city" : "WASHINGTON", "loc" : [ -75.058747, 39.774104 ], "pop" : 35874, "state" : "NJ" } +{ "_id" : "08014", "city" : "BRIDGEPORT", "loc" : [ -75.34782, 39.801616 ], "pop" : 702, "state" : "NJ" } +{ "_id" : "08015", "city" : "BROWNS MILLS", "loc" : [ -74.565549, 39.95974 ], "pop" : 21735, "state" : "NJ" } +{ "_id" : "08016", "city" : "BURLINGTON", "loc" : [ -74.845353, 40.068015 ], "pop" : 25065, "state" : "NJ" } +{ "_id" : "08019", "city" : "CHATSWORTH", "loc" : [ -74.52561900000001, 39.801945 ], "pop" : 215, "state" : "NJ" } +{ "_id" : "08020", "city" : "CLARKSBORO", "loc" : [ -75.22365499999999, 39.799228 ], "pop" : 3169, "state" : "NJ" } +{ "_id" : "08021", "city" : "LAUREL SPRINGS", "loc" : [ -75.003997, 39.80703 ], "pop" : 48953, "state" : "NJ" } +{ "_id" : "08022", "city" : "COLUMBUS", "loc" : [ -74.68988, 40.064238 ], "pop" : 5709, "state" : "NJ" } +{ "_id" : "08026", "city" : "GIBBSBORO", "loc" : [ -74.970996, 39.836532 ], "pop" : 2383, "state" : "NJ" } +{ "_id" : "08027", "city" : "GIBBSTOWN", "loc" : [ -75.275128, 39.82314 ], "pop" : 5102, "state" : "NJ" } +{ "_id" : "08028", "city" : "GLASSBORO", "loc" : [ -75.11724700000001, 39.706823 ], "pop" : 15492, "state" : "NJ" } +{ "_id" : "08029", "city" : "GLENDORA", "loc" : [ -75.069744, 39.840376 ], "pop" : 5205, "state" : "NJ" } +{ "_id" : "08030", "city" : "GLOUCESTER CITY", "loc" : [ -75.116962, 39.891105 ], "pop" : 14454, "state" : "NJ" } +{ "_id" : "08031", "city" : "BELLMAWR", "loc" : [ -75.094368, 39.868878 ], "pop" : 12568, "state" : "NJ" } +{ "_id" : "08033", "city" : "HADDONFIELD", "loc" : [ -75.041726, 39.895449 ], "pop" : 17496, "state" : "NJ" } +{ "_id" : "08034", "city" : "CHERRY HILL", "loc" : [ -75.00076199999999, 39.9074 ], "pop" : 18836, "state" : "NJ" } +{ "_id" : "08035", "city" : "HADDON HEIGHTS", "loc" : [ -75.06639, 39.878832 ], "pop" : 8034, "state" : "NJ" } +{ "_id" : "08037", "city" : "BATSTO", "loc" : [ -74.790735, 39.638878 ], "pop" : 22484, "state" : "NJ" } +{ "_id" : "08041", "city" : "JOBSTOWN", "loc" : [ -74.68730499999999, 40.038698 ], "pop" : 115, "state" : "NJ" } +{ "_id" : "08043", "city" : "VOORHEES", "loc" : [ -74.964614, 39.850422 ], "pop" : 21308, "state" : "NJ" } +{ "_id" : "08045", "city" : "LAWNSIDE", "loc" : [ -75.03168100000001, 39.867601 ], "pop" : 2840, "state" : "NJ" } +{ "_id" : "08046", "city" : "WILLINGBORO", "loc" : [ -74.883482, 40.028959 ], "pop" : 36471, "state" : "NJ" } +{ "_id" : "08048", "city" : "LUMBERTON", "loc" : [ -74.806736, 39.96512 ], "pop" : 170, "state" : "NJ" } +{ "_id" : "08049", "city" : "MAGNOLIA", "loc" : [ -75.039254, 39.853807 ], "pop" : 5931, "state" : "NJ" } +{ "_id" : "08050", "city" : "MANAHAWKIN", "loc" : [ -74.260391, 39.705017 ], "pop" : 12188, "state" : "NJ" } +{ "_id" : "08051", "city" : "MANTUA", "loc" : [ -75.17853100000001, 39.786983 ], "pop" : 8080, "state" : "NJ" } +{ "_id" : "08052", "city" : "MAPLE SHADE", "loc" : [ -74.99464399999999, 39.951085 ], "pop" : 19365, "state" : "NJ" } +{ "_id" : "08053", "city" : "MARLTON", "loc" : [ -74.90674, 39.884517 ], "pop" : 33299, "state" : "NJ" } +{ "_id" : "08054", "city" : "MOUNT LAUREL", "loc" : [ -74.903588, 39.947808 ], "pop" : 29805, "state" : "NJ" } +{ "_id" : "08055", "city" : "MEDFORD LAKES", "loc" : [ -74.823384, 39.868099 ], "pop" : 25033, "state" : "NJ" } +{ "_id" : "08056", "city" : "MICKLETON", "loc" : [ -75.24977699999999, 39.785653 ], "pop" : 1850, "state" : "NJ" } +{ "_id" : "08057", "city" : "MOORESTOWN", "loc" : [ -74.953323, 39.9683 ], "pop" : 16092, "state" : "NJ" } +{ "_id" : "08059", "city" : "MOUNT EPHRAIM", "loc" : [ -75.09289, 39.882749 ], "pop" : 5267, "state" : "NJ" } +{ "_id" : "08060", "city" : "EASTAMPTON TWP", "loc" : [ -74.79552200000001, 39.993028 ], "pop" : 31606, "state" : "NJ" } +{ "_id" : "08061", "city" : "MOUNT ROYAL", "loc" : [ -75.208153, 39.809741 ], "pop" : 239, "state" : "NJ" } +{ "_id" : "08062", "city" : "MULLICA HILL", "loc" : [ -75.20654, 39.725228 ], "pop" : 8720, "state" : "NJ" } +{ "_id" : "08063", "city" : "NATIONAL PARK", "loc" : [ -75.17939699999999, 39.866412 ], "pop" : 3398, "state" : "NJ" } +{ "_id" : "08065", "city" : "PALMYRA", "loc" : [ -75.025685, 40.003654 ], "pop" : 6916, "state" : "NJ" } +{ "_id" : "08066", "city" : "PAULSBORO", "loc" : [ -75.224233, 39.831157 ], "pop" : 10269, "state" : "NJ" } +{ "_id" : "08067", "city" : "PEDRICKTOWN", "loc" : [ -75.412046, 39.743451 ], "pop" : 1565, "state" : "NJ" } +{ "_id" : "08068", "city" : "PEMBERTON", "loc" : [ -74.66762900000001, 39.971206 ], "pop" : 11000, "state" : "NJ" } +{ "_id" : "08069", "city" : "CARNEYS POINT", "loc" : [ -75.46562299999999, 39.717938 ], "pop" : 14138, "state" : "NJ" } +{ "_id" : "08070", "city" : "PENNSVILLE", "loc" : [ -75.51553, 39.649107 ], "pop" : 12717, "state" : "NJ" } +{ "_id" : "08071", "city" : "PITMAN", "loc" : [ -75.129679, 39.731162 ], "pop" : 9697, "state" : "NJ" } +{ "_id" : "08075", "city" : "DELANCO", "loc" : [ -74.95612800000001, 40.024684 ], "pop" : 24468, "state" : "NJ" } +{ "_id" : "08077", "city" : "CINNAMINSON", "loc" : [ -74.995141, 39.996393 ], "pop" : 17498, "state" : "NJ" } +{ "_id" : "08078", "city" : "RUNNEMEDE", "loc" : [ -75.074224, 39.850825 ], "pop" : 8589, "state" : "NJ" } +{ "_id" : "08079", "city" : "SALEM", "loc" : [ -75.452096, 39.559124 ], "pop" : 14129, "state" : "NJ" } +{ "_id" : "08080", "city" : "SEWELL", "loc" : [ -75.08985199999999, 39.747345 ], "pop" : 23121, "state" : "NJ" } +{ "_id" : "08081", "city" : "SICKLERVILLE", "loc" : [ -74.986385, 39.735385 ], "pop" : 29949, "state" : "NJ" } +{ "_id" : "08083", "city" : "SOMERDALE", "loc" : [ -75.030913, 39.839988 ], "pop" : 11913, "state" : "NJ" } +{ "_id" : "08084", "city" : "STRATFORD", "loc" : [ -75.014707, 39.828798 ], "pop" : 7217, "state" : "NJ" } +{ "_id" : "08085", "city" : "SWEDESBORO", "loc" : [ -75.336202, 39.752853 ], "pop" : 7968, "state" : "NJ" } +{ "_id" : "08086", "city" : "THOROFARE", "loc" : [ -75.176698, 39.859178 ], "pop" : 3395, "state" : "NJ" } +{ "_id" : "08087", "city" : "TUCKERTON", "loc" : [ -74.364586, 39.588149 ], "pop" : 17728, "state" : "NJ" } +{ "_id" : "08088", "city" : "SOUTHAMPTON", "loc" : [ -74.71102500000001, 39.867631 ], "pop" : 25480, "state" : "NJ" } +{ "_id" : "08089", "city" : "WATERFORD WORKS", "loc" : [ -74.860933, 39.721512 ], "pop" : 4344, "state" : "NJ" } +{ "_id" : "08090", "city" : "WENONAH", "loc" : [ -75.153644, 39.799283 ], "pop" : 9129, "state" : "NJ" } +{ "_id" : "08091", "city" : "WEST BERLIN", "loc" : [ -74.941678, 39.81959 ], "pop" : 5244, "state" : "NJ" } +{ "_id" : "08092", "city" : "WEST CREEK", "loc" : [ -74.28850799999999, 39.662665 ], "pop" : 2502, "state" : "NJ" } +{ "_id" : "08093", "city" : "WESTVILLE", "loc" : [ -75.132278, 39.860494 ], "pop" : 9696, "state" : "NJ" } +{ "_id" : "08094", "city" : "WILLIAMSTOWN", "loc" : [ -74.97102700000001, 39.665006 ], "pop" : 30978, "state" : "NJ" } +{ "_id" : "08096", "city" : "DEPTFORD", "loc" : [ -75.13796600000001, 39.829477 ], "pop" : 34147, "state" : "NJ" } +{ "_id" : "08097", "city" : "WOODBURY HEIGHTS", "loc" : [ -75.15297200000001, 39.814162 ], "pop" : 3625, "state" : "NJ" } +{ "_id" : "08098", "city" : "WOODSTOWN", "loc" : [ -75.324806, 39.645663 ], "pop" : 8013, "state" : "NJ" } +{ "_id" : "08102", "city" : "CAMDEN", "loc" : [ -75.118644, 39.951244 ], "pop" : 10107, "state" : "NJ" } +{ "_id" : "08103", "city" : "CAMDEN", "loc" : [ -75.11170799999999, 39.935099 ], "pop" : 17818, "state" : "NJ" } +{ "_id" : "08104", "city" : "CAMDEN", "loc" : [ -75.10783499999999, 39.918575 ], "pop" : 26375, "state" : "NJ" } +{ "_id" : "08105", "city" : "CAMDEN", "loc" : [ -75.086382, 39.948417 ], "pop" : 34450, "state" : "NJ" } +{ "_id" : "08106", "city" : "AUDUBON", "loc" : [ -75.072425, 39.891035 ], "pop" : 10355, "state" : "NJ" } +{ "_id" : "08107", "city" : "OAKLYN", "loc" : [ -75.08489, 39.90799 ], "pop" : 14161, "state" : "NJ" } +{ "_id" : "08108", "city" : "COLLINGSWOOD", "loc" : [ -75.063383, 39.915682 ], "pop" : 18125, "state" : "NJ" } +{ "_id" : "08109", "city" : "MERCHANTVILLE", "loc" : [ -75.048204, 39.95193 ], "pop" : 22294, "state" : "NJ" } +{ "_id" : "08110", "city" : "DELAIR", "loc" : [ -75.063446, 39.962742 ], "pop" : 15447, "state" : "NJ" } +{ "_id" : "08201", "city" : "SMITHVILLE", "loc" : [ -74.503106, 39.462368 ], "pop" : 26645, "state" : "NJ" } +{ "_id" : "08202", "city" : "AVALON", "loc" : [ -74.72617700000001, 39.095095 ], "pop" : 1813, "state" : "NJ" } +{ "_id" : "08203", "city" : "BRIGANTINE", "loc" : [ -74.377644, 39.403709 ], "pop" : 9388, "state" : "NJ" } +{ "_id" : "08204", "city" : "NORTH CAPE MAY", "loc" : [ -74.92624000000001, 38.969208 ], "pop" : 18084, "state" : "NJ" } +{ "_id" : "08210", "city" : "CAPE MAY COURT H", "loc" : [ -74.826846, 39.101434 ], "pop" : 13521, "state" : "NJ" } +{ "_id" : "08215", "city" : "EGG HARBOR CITY", "loc" : [ -74.617709, 39.533123 ], "pop" : 10362, "state" : "NJ" } +{ "_id" : "08221", "city" : "LINWOOD", "loc" : [ -74.580744, 39.346883 ], "pop" : 9353, "state" : "NJ" } +{ "_id" : "08223", "city" : "MARMORA", "loc" : [ -74.659297, 39.258562 ], "pop" : 4420, "state" : "NJ" } +{ "_id" : "08225", "city" : "NORTHFIELD", "loc" : [ -74.55523700000001, 39.370256 ], "pop" : 7503, "state" : "NJ" } +{ "_id" : "08226", "city" : "OCEAN CITY", "loc" : [ -74.587514, 39.270894 ], "pop" : 15512, "state" : "NJ" } +{ "_id" : "08230", "city" : "OCEAN VIEW", "loc" : [ -74.707548, 39.215425 ], "pop" : 4443, "state" : "NJ" } +{ "_id" : "08232", "city" : "PLEASANTVILLE", "loc" : [ -74.55236499999999, 39.401518 ], "pop" : 30292, "state" : "NJ" } +{ "_id" : "08241", "city" : "PORT REPUBLIC", "loc" : [ -74.490263, 39.527196 ], "pop" : 992, "state" : "NJ" } +{ "_id" : "08242", "city" : "RIO GRANDE", "loc" : [ -74.875642, 39.019583 ], "pop" : 2943, "state" : "NJ" } +{ "_id" : "08243", "city" : "TOWNSENDS INLET", "loc" : [ -74.701432, 39.144929 ], "pop" : 2675, "state" : "NJ" } +{ "_id" : "08244", "city" : "SOMERS POINT", "loc" : [ -74.600796, 39.322308 ], "pop" : 11227, "state" : "NJ" } +{ "_id" : "08247", "city" : "STONE HARBOR", "loc" : [ -74.762049, 39.053338 ], "pop" : 1076, "state" : "NJ" } +{ "_id" : "08248", "city" : "STRATHMERE", "loc" : [ -74.655446, 39.199246 ], "pop" : 163, "state" : "NJ" } +{ "_id" : "08251", "city" : "VILLAS", "loc" : [ -74.935396, 39.021943 ], "pop" : 9308, "state" : "NJ" } +{ "_id" : "08260", "city" : "NORTH WILDWOOD", "loc" : [ -74.819096, 38.989901 ], "pop" : 14194, "state" : "NJ" } +{ "_id" : "08270", "city" : "CORBIN CITY", "loc" : [ -74.802628, 39.248915 ], "pop" : 7370, "state" : "NJ" } +{ "_id" : "08302", "city" : "SEABROOK", "loc" : [ -75.22672799999999, 39.445294 ], "pop" : 45485, "state" : "NJ" } +{ "_id" : "08310", "city" : "BUENA", "loc" : [ -74.889495, 39.536988 ], "pop" : 1501, "state" : "NJ" } +{ "_id" : "08311", "city" : "CEDARVILLE", "loc" : [ -75.19936199999999, 39.337028 ], "pop" : 1521, "state" : "NJ" } +{ "_id" : "08312", "city" : "CLAYTON", "loc" : [ -75.094188, 39.658969 ], "pop" : 6584, "state" : "NJ" } +{ "_id" : "08314", "city" : "DELMONT", "loc" : [ -74.970505, 39.202258 ], "pop" : 135, "state" : "NJ" } +{ "_id" : "08317", "city" : "DOROTHY", "loc" : [ -74.831577, 39.40313 ], "pop" : 1018, "state" : "NJ" } +{ "_id" : "08318", "city" : "ELMER", "loc" : [ -75.163023, 39.569146 ], "pop" : 8050, "state" : "NJ" } +{ "_id" : "08319", "city" : "ESTELL MANOR", "loc" : [ -74.816512, 39.37825 ], "pop" : 1130, "state" : "NJ" } +{ "_id" : "08322", "city" : "FRANKLINVILLE", "loc" : [ -75.04088, 39.615557 ], "pop" : 10484, "state" : "NJ" } +{ "_id" : "08324", "city" : "HEISLERVILLE", "loc" : [ -74.993942, 39.245013 ], "pop" : 264, "state" : "NJ" } +{ "_id" : "08326", "city" : "LANDISVILLE", "loc" : [ -74.93768799999999, 39.523942 ], "pop" : 1915, "state" : "NJ" } +{ "_id" : "08327", "city" : "LEESBURG", "loc" : [ -75.001211, 39.238724 ], "pop" : 49, "state" : "NJ" } +{ "_id" : "08328", "city" : "MALAGA", "loc" : [ -75.058155, 39.575495 ], "pop" : 1348, "state" : "NJ" } +{ "_id" : "08330", "city" : "MAYS LANDING", "loc" : [ -74.69619, 39.432011 ], "pop" : 24487, "state" : "NJ" } +{ "_id" : "08332", "city" : "MILLVILLE", "loc" : [ -75.02931100000001, 39.367313 ], "pop" : 36591, "state" : "NJ" } +{ "_id" : "08340", "city" : "MILMAY", "loc" : [ -74.866671, 39.445078 ], "pop" : 463, "state" : "NJ" } +{ "_id" : "08341", "city" : "MINOTOLA", "loc" : [ -74.946685, 39.515512 ], "pop" : 1548, "state" : "NJ" } +{ "_id" : "08343", "city" : "MONROEVILLE", "loc" : [ -75.156848, 39.644224 ], "pop" : 5068, "state" : "NJ" } +{ "_id" : "08344", "city" : "NEWFIELD", "loc" : [ -75.027558, 39.555257 ], "pop" : 5363, "state" : "NJ" } +{ "_id" : "08345", "city" : "NEWPORT", "loc" : [ -75.17164699999999, 39.283205 ], "pop" : 1190, "state" : "NJ" } +{ "_id" : "08346", "city" : "NEWTONVILLE", "loc" : [ -74.859049, 39.564477 ], "pop" : 682, "state" : "NJ" } +{ "_id" : "08349", "city" : "PORT NORRIS", "loc" : [ -75.050608, 39.256263 ], "pop" : 2726, "state" : "NJ" } +{ "_id" : "08350", "city" : "RICHLAND", "loc" : [ -74.87761500000001, 39.485048 ], "pop" : 1046, "state" : "NJ" } +{ "_id" : "08360", "city" : "VINELAND", "loc" : [ -75.00908699999999, 39.48177 ], "pop" : 56319, "state" : "NJ" } +{ "_id" : "08401", "city" : "ATLANTIC CITY", "loc" : [ -74.431727, 39.366411 ], "pop" : 31907, "state" : "NJ" } +{ "_id" : "08402", "city" : "MARGATE CITY", "loc" : [ -74.509038, 39.328621 ], "pop" : 9484, "state" : "NJ" } +{ "_id" : "08403", "city" : "LONGPORT", "loc" : [ -74.542143, 39.309712 ], "pop" : 318, "state" : "NJ" } +{ "_id" : "08406", "city" : "VENTNOR CITY", "loc" : [ -74.472343, 39.345992 ], "pop" : 19050, "state" : "NJ" } +{ "_id" : "08501", "city" : "ALLENTOWN", "loc" : [ -74.59093, 40.158922 ], "pop" : 4041, "state" : "NJ" } +{ "_id" : "08502", "city" : "BELLE MEAD", "loc" : [ -74.62899299999999, 40.467732 ], "pop" : 12677, "state" : "NJ" } +{ "_id" : "08505", "city" : "BORDENTOWN", "loc" : [ -74.703249, 40.143141 ], "pop" : 12835, "state" : "NJ" } +{ "_id" : "08510", "city" : "CLARKSBURG", "loc" : [ -74.434387, 40.199751 ], "pop" : 3364, "state" : "NJ" } +{ "_id" : "08511", "city" : "COOKSTOWN", "loc" : [ -74.559524, 40.048109 ], "pop" : 262, "state" : "NJ" } +{ "_id" : "08512", "city" : "CRANBURY", "loc" : [ -74.506531, 40.303868 ], "pop" : 13743, "state" : "NJ" } +{ "_id" : "08514", "city" : "CREAMRIDGE", "loc" : [ -74.499425, 40.127907 ], "pop" : 3522, "state" : "NJ" } +{ "_id" : "08515", "city" : "CROSSWICKS", "loc" : [ -74.666838, 40.158353 ], "pop" : 1700, "state" : "NJ" } +{ "_id" : "08518", "city" : "FLORENCE", "loc" : [ -74.805515, 40.118025 ], "pop" : 5091, "state" : "NJ" } +{ "_id" : "08520", "city" : "HIGHTSTOWN", "loc" : [ -74.52499299999999, 40.266885 ], "pop" : 25674, "state" : "NJ" } +{ "_id" : "08525", "city" : "HOPEWELL", "loc" : [ -74.77096299999999, 40.390224 ], "pop" : 3858, "state" : "NJ" } +{ "_id" : "08526", "city" : "IMLAYSTOWN", "loc" : [ -74.51093899999999, 40.166215 ], "pop" : 17, "state" : "NJ" } +{ "_id" : "08527", "city" : "JACKSON", "loc" : [ -74.301709, 40.120964 ], "pop" : 33075, "state" : "NJ" } +{ "_id" : "08528", "city" : "KINGSTON", "loc" : [ -74.61607100000001, 40.380465 ], "pop" : 160, "state" : "NJ" } +{ "_id" : "08530", "city" : "LAMBERTVILLE", "loc" : [ -74.926605, 40.373122 ], "pop" : 6466, "state" : "NJ" } +{ "_id" : "08533", "city" : "NEW EGYPT", "loc" : [ -74.506721, 40.071343 ], "pop" : 4601, "state" : "NJ" } +{ "_id" : "08534", "city" : "PENNINGTON", "loc" : [ -74.794352, 40.333858 ], "pop" : 7690, "state" : "NJ" } +{ "_id" : "08535", "city" : "PERRINEVILLE", "loc" : [ -74.440381, 40.214971 ], "pop" : 329, "state" : "NJ" } +{ "_id" : "08536", "city" : "PLAINSBORO", "loc" : [ -74.568836, 40.332432 ], "pop" : 13008, "state" : "NJ" } +{ "_id" : "08540", "city" : "PRINCETON", "loc" : [ -74.640832, 40.366633 ], "pop" : 33831, "state" : "NJ" } +{ "_id" : "08542", "city" : "PRINCETON", "loc" : [ -74.659378, 40.353545 ], "pop" : 2675, "state" : "NJ" } +{ "_id" : "08544", "city" : "PRINCETON UNIVER", "loc" : [ -74.65754, 40.346029 ], "pop" : 4227, "state" : "NJ" } +{ "_id" : "08550", "city" : "PRINCETON JUNCTI", "loc" : [ -74.61459600000001, 40.297684 ], "pop" : 5807, "state" : "NJ" } +{ "_id" : "08551", "city" : "RINGOES", "loc" : [ -74.828839, 40.44587 ], "pop" : 5106, "state" : "NJ" } +{ "_id" : "08553", "city" : "ROCKY HILL", "loc" : [ -74.64004199999999, 40.400985 ], "pop" : 693, "state" : "NJ" } +{ "_id" : "08554", "city" : "ROEBLING", "loc" : [ -74.777224, 40.115352 ], "pop" : 3826, "state" : "NJ" } +{ "_id" : "08556", "city" : "ROSEMONT", "loc" : [ -74.991928, 40.422005 ], "pop" : 42, "state" : "NJ" } +{ "_id" : "08558", "city" : "SKILLMAN", "loc" : [ -74.693828, 40.417312 ], "pop" : 3935, "state" : "NJ" } +{ "_id" : "08559", "city" : "STOCKTON", "loc" : [ -74.95541900000001, 40.43974 ], "pop" : 6090, "state" : "NJ" } +{ "_id" : "08560", "city" : "TITUSVILLE", "loc" : [ -74.865469, 40.307728 ], "pop" : 3354, "state" : "NJ" } +{ "_id" : "08562", "city" : "WRIGHTSTOWN", "loc" : [ -74.573098, 40.071953 ], "pop" : 3116, "state" : "NJ" } +{ "_id" : "08608", "city" : "TRENTON", "loc" : [ -74.762237, 40.220437 ], "pop" : 827, "state" : "NJ" } +{ "_id" : "08609", "city" : "HAMILTON", "loc" : [ -74.742598, 40.223338 ], "pop" : 15904, "state" : "NJ" } +{ "_id" : "08610", "city" : "HAMILTON", "loc" : [ -74.71720500000001, 40.19894 ], "pop" : 29852, "state" : "NJ" } +{ "_id" : "08611", "city" : "HAMILTON", "loc" : [ -74.751997, 40.207297 ], "pop" : 25084, "state" : "NJ" } +{ "_id" : "08618", "city" : "TRENTON", "loc" : [ -74.782062, 40.237687 ], "pop" : 40280, "state" : "NJ" } +{ "_id" : "08619", "city" : "MERCERVILLE", "loc" : [ -74.690377, 40.241977 ], "pop" : 23627, "state" : "NJ" } +{ "_id" : "08620", "city" : "YARDVILLE", "loc" : [ -74.671699, 40.178477 ], "pop" : 12373, "state" : "NJ" } +{ "_id" : "08628", "city" : "WEST TRENTON", "loc" : [ -74.82618600000001, 40.267232 ], "pop" : 8335, "state" : "NJ" } +{ "_id" : "08629", "city" : "HAMILTON", "loc" : [ -74.732764, 40.219843 ], "pop" : 10670, "state" : "NJ" } +{ "_id" : "08638", "city" : "TRENTON", "loc" : [ -74.762699, 40.251006 ], "pop" : 26982, "state" : "NJ" } +{ "_id" : "08640", "city" : "FORT DIX", "loc" : [ -74.618296, 40.009946 ], "pop" : 10101, "state" : "NJ" } +{ "_id" : "08641", "city" : "MC GUIRE AFB", "loc" : [ -74.588195, 40.044026 ], "pop" : 9971, "state" : "NJ" } +{ "_id" : "08648", "city" : "LAWRENCEVILLE", "loc" : [ -74.723956, 40.277646 ], "pop" : 25497, "state" : "NJ" } +{ "_id" : "08690", "city" : "HAMILTON", "loc" : [ -74.659138, 40.223852 ], "pop" : 21547, "state" : "NJ" } +{ "_id" : "08691", "city" : "HAMILTON", "loc" : [ -74.606262, 40.231785 ], "pop" : 6524, "state" : "NJ" } +{ "_id" : "08701", "city" : "LAKEWOOD", "loc" : [ -74.204199, 40.085043 ], "pop" : 47458, "state" : "NJ" } +{ "_id" : "08721", "city" : "BAYVILLE", "loc" : [ -74.190529, 39.914708 ], "pop" : 18991, "state" : "NJ" } +{ "_id" : "08722", "city" : "BEACHWOOD", "loc" : [ -74.196145, 39.930246 ], "pop" : 9324, "state" : "NJ" } +{ "_id" : "08723", "city" : "OSBORNSVILLE", "loc" : [ -74.12685999999999, 40.040817 ], "pop" : 28128, "state" : "NJ" } +{ "_id" : "08724", "city" : "BRICK", "loc" : [ -74.11523699999999, 40.087432 ], "pop" : 34507, "state" : "NJ" } +{ "_id" : "08730", "city" : "BRIELLE", "loc" : [ -74.06351100000001, 40.107727 ], "pop" : 4290, "state" : "NJ" } +{ "_id" : "08731", "city" : "FORKED RIVER", "loc" : [ -74.197301, 39.844425 ], "pop" : 16664, "state" : "NJ" } +{ "_id" : "08732", "city" : "ISLAND HEIGHTS", "loc" : [ -74.146787, 39.943197 ], "pop" : 1470, "state" : "NJ" } +{ "_id" : "08733", "city" : "LAKEHURST NAEC", "loc" : [ -74.29090100000001, 40.020054 ], "pop" : 14205, "state" : "NJ" } +{ "_id" : "08734", "city" : "LANOKA HARBOR", "loc" : [ -74.166765, 39.861993 ], "pop" : 5473, "state" : "NJ" } +{ "_id" : "08735", "city" : "LAVALLETTE", "loc" : [ -74.070424, 39.977486 ], "pop" : 3985, "state" : "NJ" } +{ "_id" : "08736", "city" : "MANASQUAN", "loc" : [ -74.061055, 40.121693 ], "pop" : 10341, "state" : "NJ" } +{ "_id" : "08738", "city" : "MANTOLOKING", "loc" : [ -74.05618800000001, 40.026125 ], "pop" : 1186, "state" : "NJ" } +{ "_id" : "08740", "city" : "OCEAN GATE", "loc" : [ -74.13512799999999, 39.925975 ], "pop" : 2028, "state" : "NJ" } +{ "_id" : "08741", "city" : "PINE BEACH", "loc" : [ -74.167992, 39.934746 ], "pop" : 2354, "state" : "NJ" } +{ "_id" : "08742", "city" : "BAY HEAD", "loc" : [ -74.065719, 40.080226 ], "pop" : 25071, "state" : "NJ" } +{ "_id" : "08750", "city" : "SEA GIRT", "loc" : [ -74.043604, 40.134522 ], "pop" : 3624, "state" : "NJ" } +{ "_id" : "08751", "city" : "SEASIDE HEIGHTS", "loc" : [ -74.07647900000001, 39.946639 ], "pop" : 4044, "state" : "NJ" } +{ "_id" : "08752", "city" : "SEASIDE PARK", "loc" : [ -74.079521, 39.922175 ], "pop" : 2369, "state" : "NJ" } +{ "_id" : "08753", "city" : "TOMS RIVER", "loc" : [ -74.156508, 39.977083 ], "pop" : 58001, "state" : "NJ" } +{ "_id" : "08755", "city" : "TOMS RIVER", "loc" : [ -74.222819, 39.999946 ], "pop" : 14892, "state" : "NJ" } +{ "_id" : "08757", "city" : "TOMS RIVER", "loc" : [ -74.25116800000001, 39.971471 ], "pop" : 29794, "state" : "NJ" } +{ "_id" : "08758", "city" : "WARETOWN", "loc" : [ -74.195376, 39.789646 ], "pop" : 4774, "state" : "NJ" } +{ "_id" : "08759", "city" : "WHITING", "loc" : [ -74.360713, 39.950983 ], "pop" : 16321, "state" : "NJ" } +{ "_id" : "08801", "city" : "ANNANDALE", "loc" : [ -74.88551200000001, 40.628731 ], "pop" : 6465, "state" : "NJ" } +{ "_id" : "08802", "city" : "PATTENBURG", "loc" : [ -75.01585, 40.650175 ], "pop" : 2176, "state" : "NJ" } +{ "_id" : "08804", "city" : "BLOOMSBURY", "loc" : [ -75.09663999999999, 40.64366 ], "pop" : 2111, "state" : "NJ" } +{ "_id" : "08805", "city" : "BOUND BROOK", "loc" : [ -74.53973499999999, 40.568115 ], "pop" : 11275, "state" : "NJ" } +{ "_id" : "08807", "city" : "BRIDGEWATER", "loc" : [ -74.626741, 40.590388 ], "pop" : 26496, "state" : "NJ" } +{ "_id" : "08809", "city" : "CLINTON", "loc" : [ -74.908846, 40.641194 ], "pop" : 2994, "state" : "NJ" } +{ "_id" : "08810", "city" : "DAYTON", "loc" : [ -74.51110199999999, 40.38249 ], "pop" : 6198, "state" : "NJ" } +{ "_id" : "08812", "city" : "GREEN BROOK", "loc" : [ -74.47187, 40.594237 ], "pop" : 10892, "state" : "NJ" } +{ "_id" : "08816", "city" : "EAST BRUNSWICK", "loc" : [ -74.406381, 40.428395 ], "pop" : 42319, "state" : "NJ" } +{ "_id" : "08817", "city" : "EDISON", "loc" : [ -74.39728599999999, 40.517079 ], "pop" : 41245, "state" : "NJ" } +{ "_id" : "08820", "city" : "EDISON", "loc" : [ -74.358863, 40.57804 ], "pop" : 33581, "state" : "NJ" } +{ "_id" : "08822", "city" : "FLEMINGTON", "loc" : [ -74.845316, 40.517976 ], "pop" : 23579, "state" : "NJ" } +{ "_id" : "08823", "city" : "FRANKLIN PARK", "loc" : [ -74.536908, 40.442097 ], "pop" : 154, "state" : "NJ" } +{ "_id" : "08824", "city" : "KENDALL PARK", "loc" : [ -74.552921, 40.4208 ], "pop" : 10272, "state" : "NJ" } +{ "_id" : "08825", "city" : "FRENCHTOWN", "loc" : [ -75.03246799999999, 40.520795 ], "pop" : 4383, "state" : "NJ" } +{ "_id" : "08826", "city" : "GLEN GARDNER", "loc" : [ -74.916207, 40.713437 ], "pop" : 5525, "state" : "NJ" } +{ "_id" : "08827", "city" : "HAMPTON", "loc" : [ -74.962221, 40.677351 ], "pop" : 4441, "state" : "NJ" } +{ "_id" : "08828", "city" : "HELMETTA", "loc" : [ -74.420393, 40.377742 ], "pop" : 1211, "state" : "NJ" } +{ "_id" : "08829", "city" : "HIGH BRIDGE", "loc" : [ -74.89366699999999, 40.668438 ], "pop" : 3886, "state" : "NJ" } +{ "_id" : "08830", "city" : "ISELIN", "loc" : [ -74.316677, 40.571593 ], "pop" : 16313, "state" : "NJ" } +{ "_id" : "08831", "city" : "JAMESBURG", "loc" : [ -74.43356799999999, 40.342475 ], "pop" : 15743, "state" : "NJ" } +{ "_id" : "08832", "city" : "KEASBEY", "loc" : [ -74.302119, 40.519171 ], "pop" : 2746, "state" : "NJ" } +{ "_id" : "08833", "city" : "LEBANON", "loc" : [ -74.829035, 40.646623 ], "pop" : 7270, "state" : "NJ" } +{ "_id" : "08835", "city" : "MANVILLE", "loc" : [ -74.593377, 40.539871 ], "pop" : 10419, "state" : "NJ" } +{ "_id" : "08836", "city" : "MARTINSVILLE", "loc" : [ -74.557191, 40.599962 ], "pop" : 3024, "state" : "NJ" } +{ "_id" : "08837", "city" : "EDISON", "loc" : [ -74.337503, 40.532476 ], "pop" : 9447, "state" : "NJ" } +{ "_id" : "08840", "city" : "METUCHEN", "loc" : [ -74.351721, 40.54493 ], "pop" : 20017, "state" : "NJ" } +{ "_id" : "08846", "city" : "MIDDLESEX", "loc" : [ -74.500835, 40.575882 ], "pop" : 13055, "state" : "NJ" } +{ "_id" : "08848", "city" : "MILFORD", "loc" : [ -75.102519, 40.592942 ], "pop" : 7586, "state" : "NJ" } +{ "_id" : "08850", "city" : "MILLTOWN", "loc" : [ -74.439046, 40.449346 ], "pop" : 8362, "state" : "NJ" } +{ "_id" : "08852", "city" : "MONMOUTH JUNCTIO", "loc" : [ -74.547021, 40.394391 ], "pop" : 6881, "state" : "NJ" } +{ "_id" : "08853", "city" : "NESHANIC STATION", "loc" : [ -74.71434000000001, 40.509551 ], "pop" : 9526, "state" : "NJ" } +{ "_id" : "08854", "city" : "PISCATAWAY", "loc" : [ -74.458996, 40.55152 ], "pop" : 47038, "state" : "NJ" } +{ "_id" : "08857", "city" : "OLD BRIDGE", "loc" : [ -74.323553, 40.398045 ], "pop" : 33884, "state" : "NJ" } +{ "_id" : "08859", "city" : "PARLIN", "loc" : [ -74.304981, 40.458701 ], "pop" : 20773, "state" : "NJ" } +{ "_id" : "08861", "city" : "PERTH AMBOY", "loc" : [ -74.27542699999999, 40.517551 ], "pop" : 43920, "state" : "NJ" } +{ "_id" : "08863", "city" : "FORDS", "loc" : [ -74.311707, 40.53925 ], "pop" : 13568, "state" : "NJ" } +{ "_id" : "08865", "city" : "ALPHA", "loc" : [ -75.1741, 40.692819 ], "pop" : 28782, "state" : "NJ" } +{ "_id" : "08867", "city" : "PITTSTOWN", "loc" : [ -74.957587, 40.599169 ], "pop" : 5635, "state" : "NJ" } +{ "_id" : "08869", "city" : "RARITAN", "loc" : [ -74.637691, 40.57109 ], "pop" : 6306, "state" : "NJ" } +{ "_id" : "08872", "city" : "SAYREVILLE", "loc" : [ -74.347808, 40.459958 ], "pop" : 14405, "state" : "NJ" } +{ "_id" : "08873", "city" : "SOMERSET", "loc" : [ -74.50126, 40.500743 ], "pop" : 36850, "state" : "NJ" } +{ "_id" : "08876", "city" : "NORTH BRANCH", "loc" : [ -74.645926, 40.549393 ], "pop" : 34212, "state" : "NJ" } +{ "_id" : "08879", "city" : "LAURENCE HARBOR", "loc" : [ -74.27863499999999, 40.464733 ], "pop" : 20993, "state" : "NJ" } +{ "_id" : "08880", "city" : "SOUTH BOUND BROO", "loc" : [ -74.529078, 40.552804 ], "pop" : 4330, "state" : "NJ" } +{ "_id" : "08882", "city" : "SOUTH RIVER", "loc" : [ -74.380099, 40.444363 ], "pop" : 13692, "state" : "NJ" } +{ "_id" : "08884", "city" : "SPOTSWOOD", "loc" : [ -74.389377, 40.384679 ], "pop" : 13444, "state" : "NJ" } +{ "_id" : "08886", "city" : "STEWARTSVILLE", "loc" : [ -75.082517, 40.695703 ], "pop" : 3582, "state" : "NJ" } +{ "_id" : "08887", "city" : "THREE BRIDGES", "loc" : [ -74.79980500000001, 40.52156 ], "pop" : 378, "state" : "NJ" } +{ "_id" : "08889", "city" : "WHITEHOUSE STATI", "loc" : [ -74.764129, 40.599872 ], "pop" : 8303, "state" : "NJ" } +{ "_id" : "08901", "city" : "NEW BRUNSWICK", "loc" : [ -74.448193, 40.489073 ], "pop" : 41710, "state" : "NJ" } +{ "_id" : "08902", "city" : "NORTH BRUNSWICK", "loc" : [ -74.482285, 40.453767 ], "pop" : 31071, "state" : "NJ" } +{ "_id" : "08904", "city" : "HIGHLAND PARK", "loc" : [ -74.426602, 40.499141 ], "pop" : 13165, "state" : "NJ" } +{ "_id" : "10001", "city" : "NEW YORK", "loc" : [ -73.99670500000001, 40.74838 ], "pop" : 18913, "state" : "NY" } +{ "_id" : "10002", "city" : "NEW YORK", "loc" : [ -73.98768099999999, 40.715231 ], "pop" : 84143, "state" : "NY" } +{ "_id" : "10003", "city" : "NEW YORK", "loc" : [ -73.989223, 40.731253 ], "pop" : 51224, "state" : "NY" } +{ "_id" : "10004", "city" : "GOVERNORS ISLAND", "loc" : [ -74.019025, 40.693604 ], "pop" : 3593, "state" : "NY" } +{ "_id" : "10005", "city" : "NEW YORK", "loc" : [ -74.00834399999999, 40.705649 ], "pop" : 202, "state" : "NY" } +{ "_id" : "10006", "city" : "NEW YORK", "loc" : [ -74.013474, 40.708451 ], "pop" : 119, "state" : "NY" } +{ "_id" : "10007", "city" : "NEW YORK", "loc" : [ -74.00702200000001, 40.713905 ], "pop" : 3374, "state" : "NY" } +{ "_id" : "10009", "city" : "NEW YORK", "loc" : [ -73.979591, 40.726188 ], "pop" : 57426, "state" : "NY" } +{ "_id" : "10010", "city" : "NEW YORK", "loc" : [ -73.981328, 40.737476 ], "pop" : 24907, "state" : "NY" } +{ "_id" : "10011", "city" : "NEW YORK", "loc" : [ -73.99963, 40.740225 ], "pop" : 46560, "state" : "NY" } +{ "_id" : "10012", "city" : "NEW YORK", "loc" : [ -73.998284, 40.72553 ], "pop" : 26365, "state" : "NY" } +{ "_id" : "10013", "city" : "NEW YORK", "loc" : [ -74.002529, 40.718511 ], "pop" : 21860, "state" : "NY" } +{ "_id" : "10014", "city" : "NEW YORK", "loc" : [ -74.005421, 40.73393 ], "pop" : 31147, "state" : "NY" } +{ "_id" : "10016", "city" : "NEW YORK", "loc" : [ -73.978134, 40.744281 ], "pop" : 51561, "state" : "NY" } +{ "_id" : "10017", "city" : "NEW YORK", "loc" : [ -73.97066100000001, 40.75172 ], "pop" : 12465, "state" : "NY" } +{ "_id" : "10018", "city" : "NEW YORK", "loc" : [ -73.992503, 40.754713 ], "pop" : 4834, "state" : "NY" } +{ "_id" : "10019", "city" : "NEW YORK", "loc" : [ -73.985834, 40.765069 ], "pop" : 36602, "state" : "NY" } +{ "_id" : "10020", "city" : "NEW YORK", "loc" : [ -73.982347, 40.759729 ], "pop" : 393, "state" : "NY" } +{ "_id" : "10021", "city" : "NEW YORK", "loc" : [ -73.958805, 40.768476 ], "pop" : 106564, "state" : "NY" } +{ "_id" : "10022", "city" : "NEW YORK", "loc" : [ -73.965703, 40.757091 ], "pop" : 31870, "state" : "NY" } +{ "_id" : "10023", "city" : "NEW YORK", "loc" : [ -73.982652, 40.77638 ], "pop" : 57385, "state" : "NY" } +{ "_id" : "10024", "city" : "NEW YORK", "loc" : [ -73.97638499999999, 40.786446 ], "pop" : 65141, "state" : "NY" } +{ "_id" : "10025", "city" : "NEW YORK", "loc" : [ -73.968312, 40.797466 ], "pop" : 100027, "state" : "NY" } +{ "_id" : "10026", "city" : "NEW YORK", "loc" : [ -73.953069, 40.801942 ], "pop" : 28453, "state" : "NY" } +{ "_id" : "10027", "city" : "NEW YORK", "loc" : [ -73.954978, 40.811556 ], "pop" : 54631, "state" : "NY" } +{ "_id" : "10028", "city" : "NEW YORK", "loc" : [ -73.952866, 40.776267 ], "pop" : 42757, "state" : "NY" } +{ "_id" : "10029", "city" : "NEW YORK", "loc" : [ -73.94475, 40.791817 ], "pop" : 74643, "state" : "NY" } +{ "_id" : "10030", "city" : "NEW YORK", "loc" : [ -73.94259700000001, 40.818333 ], "pop" : 21132, "state" : "NY" } +{ "_id" : "10031", "city" : "NEW YORK", "loc" : [ -73.950712, 40.82455 ], "pop" : 55989, "state" : "NY" } +{ "_id" : "10032", "city" : "NEW YORK", "loc" : [ -73.94197800000001, 40.83819 ], "pop" : 61332, "state" : "NY" } +{ "_id" : "10033", "city" : "NEW YORK", "loc" : [ -73.935649, 40.84955 ], "pop" : 58648, "state" : "NY" } +{ "_id" : "10034", "city" : "NEW YORK", "loc" : [ -73.922077, 40.866222 ], "pop" : 41131, "state" : "NY" } +{ "_id" : "10035", "city" : "NEW YORK", "loc" : [ -73.93709800000001, 40.801116 ], "pop" : 28099, "state" : "NY" } +{ "_id" : "10036", "city" : "NEW YORK", "loc" : [ -73.991826, 40.759724 ], "pop" : 16748, "state" : "NY" } +{ "_id" : "10037", "city" : "NEW YORK", "loc" : [ -73.93810000000001, 40.813491 ], "pop" : 14982, "state" : "NY" } +{ "_id" : "10038", "city" : "NEW YORK", "loc" : [ -74.00129800000001, 40.710092 ], "pop" : 14015, "state" : "NY" } +{ "_id" : "10039", "city" : "NEW YORK", "loc" : [ -73.938266, 40.826458 ], "pop" : 25293, "state" : "NY" } +{ "_id" : "10040", "city" : "NEW YORK", "loc" : [ -73.92960100000001, 40.858308 ], "pop" : 39780, "state" : "NY" } +{ "_id" : "10044", "city" : "NEW YORK", "loc" : [ -73.949136, 40.762998 ], "pop" : 8190, "state" : "NY" } +{ "_id" : "10128", "city" : "NEW YORK", "loc" : [ -73.95111199999999, 40.781618 ], "pop" : 52311, "state" : "NY" } +{ "_id" : "10280", "city" : "NEW YORK", "loc" : [ -74.016323, 40.710537 ], "pop" : 5574, "state" : "NY" } +{ "_id" : "10301", "city" : "STATEN ISLAND", "loc" : [ -74.092663, 40.631602 ], "pop" : 35314, "state" : "NY" } +{ "_id" : "10302", "city" : "STATEN ISLAND", "loc" : [ -74.137918, 40.630597 ], "pop" : 13369, "state" : "NY" } +{ "_id" : "10303", "city" : "STATEN ISLAND", "loc" : [ -74.160679, 40.630062 ], "pop" : 17695, "state" : "NY" } +{ "_id" : "10304", "city" : "STATEN ISLAND", "loc" : [ -74.087836, 40.610249 ], "pop" : 33028, "state" : "NY" } +{ "_id" : "10305", "city" : "STATEN ISLAND", "loc" : [ -74.076795, 40.597296 ], "pop" : 30513, "state" : "NY" } +{ "_id" : "10306", "city" : "STATEN ISLAND", "loc" : [ -74.118386, 40.568183 ], "pop" : 49849, "state" : "NY" } +{ "_id" : "10307", "city" : "STATEN ISLAND", "loc" : [ -74.244482, 40.508452 ], "pop" : 7627, "state" : "NY" } +{ "_id" : "10308", "city" : "STATEN ISLAND", "loc" : [ -74.152649, 40.55181 ], "pop" : 24947, "state" : "NY" } +{ "_id" : "10309", "city" : "STATEN ISLAND", "loc" : [ -74.211572, 40.535179 ], "pop" : 18651, "state" : "NY" } +{ "_id" : "10310", "city" : "STATEN ISLAND", "loc" : [ -74.11715, 40.632427 ], "pop" : 20282, "state" : "NY" } +{ "_id" : "10312", "city" : "STATEN ISLAND", "loc" : [ -74.179165, 40.545745 ], "pop" : 49584, "state" : "NY" } +{ "_id" : "10314", "city" : "STATEN ISLAND", "loc" : [ -74.147218, 40.603915 ], "pop" : 78118, "state" : "NY" } +{ "_id" : "10451", "city" : "BRONX", "loc" : [ -73.921735, 40.8222 ], "pop" : 42854, "state" : "NY" } +{ "_id" : "10452", "city" : "BRONX", "loc" : [ -73.921555, 40.837594 ], "pop" : 55890, "state" : "NY" } +{ "_id" : "10453", "city" : "BRONX", "loc" : [ -73.912937, 40.852047 ], "pop" : 70544, "state" : "NY" } +{ "_id" : "10454", "city" : "BRONX", "loc" : [ -73.919821, 40.808549 ], "pop" : 35994, "state" : "NY" } +{ "_id" : "10455", "city" : "BRONX", "loc" : [ -73.907172, 40.815309 ], "pop" : 31882, "state" : "NY" } +{ "_id" : "10456", "city" : "BRONX", "loc" : [ -73.909893, 40.831557 ], "pop" : 70157, "state" : "NY" } +{ "_id" : "10457", "city" : "BRONX", "loc" : [ -73.899907, 40.848635 ], "pop" : 62133, "state" : "NY" } +{ "_id" : "10458", "city" : "BRONX", "loc" : [ -73.889464, 40.863307 ], "pop" : 70612, "state" : "NY" } +{ "_id" : "10459", "city" : "BRONX", "loc" : [ -73.894047, 40.824699 ], "pop" : 30983, "state" : "NY" } +{ "_id" : "10460", "city" : "BRONX", "loc" : [ -73.879409, 40.840949 ], "pop" : 47250, "state" : "NY" } +{ "_id" : "10461", "city" : "BRONX", "loc" : [ -73.840953, 40.846506 ], "pop" : 45273, "state" : "NY" } +{ "_id" : "10462", "city" : "BRONX", "loc" : [ -73.860185, 40.843369 ], "pop" : 61478, "state" : "NY" } +{ "_id" : "10463", "city" : "BRONX", "loc" : [ -73.90673700000001, 40.879812 ], "pop" : 67435, "state" : "NY" } +{ "_id" : "10464", "city" : "BRONX", "loc" : [ -73.787436, 40.846941 ], "pop" : 4113, "state" : "NY" } +{ "_id" : "10465", "city" : "BRONX", "loc" : [ -73.819581, 40.826065 ], "pop" : 37457, "state" : "NY" } +{ "_id" : "10466", "city" : "BRONX", "loc" : [ -73.85033300000001, 40.890375 ], "pop" : 58394, "state" : "NY" } +{ "_id" : "10467", "city" : "BRONX", "loc" : [ -73.871242, 40.873671 ], "pop" : 85710, "state" : "NY" } +{ "_id" : "10468", "city" : "BRONX", "loc" : [ -73.90025900000001, 40.866231 ], "pop" : 65854, "state" : "NY" } +{ "_id" : "10469", "city" : "BRONX", "loc" : [ -73.849465, 40.870193 ], "pop" : 53962, "state" : "NY" } +{ "_id" : "10470", "city" : "BRONX", "loc" : [ -73.862194, 40.900029 ], "pop" : 13254, "state" : "NY" } +{ "_id" : "10471", "city" : "BRONX", "loc" : [ -73.905283, 40.901084 ], "pop" : 23348, "state" : "NY" } +{ "_id" : "10472", "city" : "BRONX", "loc" : [ -73.871557, 40.829464 ], "pop" : 61122, "state" : "NY" } +{ "_id" : "10473", "city" : "BRONX", "loc" : [ -73.860626, 40.819364 ], "pop" : 53981, "state" : "NY" } +{ "_id" : "10474", "city" : "BRONX", "loc" : [ -73.886376, 40.801518 ], "pop" : 22823, "state" : "NY" } +{ "_id" : "10475", "city" : "BRONX", "loc" : [ -73.827817, 40.872903 ], "pop" : 37045, "state" : "NY" } +{ "_id" : "10501", "city" : "AMAWALK", "loc" : [ -73.761079, 41.294618 ], "pop" : 745, "state" : "NY" } +{ "_id" : "10502", "city" : "ARDSLEY", "loc" : [ -73.841311, 41.011332 ], "pop" : 5529, "state" : "NY" } +{ "_id" : "10504", "city" : "ARMONK", "loc" : [ -73.700942, 41.136002 ], "pop" : 7077, "state" : "NY" } +{ "_id" : "10506", "city" : "BEDFORD", "loc" : [ -73.635548, 41.190913 ], "pop" : 4332, "state" : "NY" } +{ "_id" : "10507", "city" : "BEDFORD HILLS", "loc" : [ -73.691517, 41.234439 ], "pop" : 6161, "state" : "NY" } +{ "_id" : "10509", "city" : "BREWSTER", "loc" : [ -73.59917900000001, 41.409704 ], "pop" : 15852, "state" : "NY" } +{ "_id" : "10510", "city" : "BRIARCLIFF MANOR", "loc" : [ -73.83495600000001, 41.144364 ], "pop" : 8509, "state" : "NY" } +{ "_id" : "10511", "city" : "BUCHANAN", "loc" : [ -73.941238, 41.258285 ], "pop" : 2008, "state" : "NY" } +{ "_id" : "10512", "city" : "CARMEL", "loc" : [ -73.68152600000001, 41.443216 ], "pop" : 20716, "state" : "NY" } +{ "_id" : "10514", "city" : "CHAPPAQUA", "loc" : [ -73.771458, 41.170497 ], "pop" : 11097, "state" : "NY" } +{ "_id" : "10516", "city" : "COLD SPRING", "loc" : [ -73.933485, 41.44142 ], "pop" : 4904, "state" : "NY" } +{ "_id" : "10518", "city" : "CROSS RIVER", "loc" : [ -73.60202700000001, 41.27218 ], "pop" : 691, "state" : "NY" } +{ "_id" : "10520", "city" : "CROTON ON HUDSON", "loc" : [ -73.892408, 41.218037 ], "pop" : 12527, "state" : "NY" } +{ "_id" : "10522", "city" : "DOBBS FERRY", "loc" : [ -73.866494, 41.011835 ], "pop" : 9896, "state" : "NY" } +{ "_id" : "10523", "city" : "ELMSFORD", "loc" : [ -73.813597, 41.057171 ], "pop" : 6266, "state" : "NY" } +{ "_id" : "10524", "city" : "GARRISON", "loc" : [ -73.92000299999999, 41.362065 ], "pop" : 3572, "state" : "NY" } +{ "_id" : "10527", "city" : "GRANITE SPRINGS", "loc" : [ -73.75300799999999, 41.309791 ], "pop" : 963, "state" : "NY" } +{ "_id" : "10528", "city" : "HARRISON", "loc" : [ -73.718068, 40.971876 ], "pop" : 11601, "state" : "NY" } +{ "_id" : "10530", "city" : "HARTSDALE", "loc" : [ -73.80740400000001, 41.019658 ], "pop" : 13995, "state" : "NY" } +{ "_id" : "10532", "city" : "HAWTHORNE", "loc" : [ -73.80168500000001, 41.095316 ], "pop" : 7258, "state" : "NY" } +{ "_id" : "10533", "city" : "IRVINGTON", "loc" : [ -73.859666, 41.038113 ], "pop" : 7498, "state" : "NY" } +{ "_id" : "10535", "city" : "JEFFERSON VALLEY", "loc" : [ -73.794697, 41.338522 ], "pop" : 213, "state" : "NY" } +{ "_id" : "10536", "city" : "KATONAH", "loc" : [ -73.68411500000001, 41.270884 ], "pop" : 12263, "state" : "NY" } +{ "_id" : "10537", "city" : "LAKE PEEKSKILL", "loc" : [ -73.883787, 41.337437 ], "pop" : 1604, "state" : "NY" } +{ "_id" : "10538", "city" : "LARCHMONT", "loc" : [ -73.75715, 40.935055 ], "pop" : 16840, "state" : "NY" } +{ "_id" : "10541", "city" : "MAHOPAC", "loc" : [ -73.750755, 41.371708 ], "pop" : 23687, "state" : "NY" } +{ "_id" : "10543", "city" : "MAMARONECK", "loc" : [ -73.73503700000001, 40.952481 ], "pop" : 18193, "state" : "NY" } +{ "_id" : "10546", "city" : "MILLWOOD", "loc" : [ -73.792626, 41.201519 ], "pop" : 681, "state" : "NY" } +{ "_id" : "10547", "city" : "MOHEGAN LAKE", "loc" : [ -73.850836, 41.314348 ], "pop" : 5753, "state" : "NY" } +{ "_id" : "10548", "city" : "MONTROSE", "loc" : [ -73.944593, 41.249585 ], "pop" : 4350, "state" : "NY" } +{ "_id" : "10549", "city" : "MOUNT KISCO", "loc" : [ -73.729921, 41.204966 ], "pop" : 14361, "state" : "NY" } +{ "_id" : "10550", "city" : "MOUNT VERNON", "loc" : [ -73.83796100000001, 40.907863 ], "pop" : 37889, "state" : "NY" } +{ "_id" : "10552", "city" : "MOUNT VERNON", "loc" : [ -73.829919, 40.923056 ], "pop" : 18167, "state" : "NY" } +{ "_id" : "10553", "city" : "MOUNT VERNON", "loc" : [ -73.82211100000001, 40.908645 ], "pop" : 12452, "state" : "NY" } +{ "_id" : "10560", "city" : "NORTH SALEM", "loc" : [ -73.592947, 41.341388 ], "pop" : 2601, "state" : "NY" } +{ "_id" : "10562", "city" : "OSSINING", "loc" : [ -73.853791, 41.167344 ], "pop" : 29926, "state" : "NY" } +{ "_id" : "10566", "city" : "CORTLANDT MANOR", "loc" : [ -73.902562, 41.293722 ], "pop" : 37431, "state" : "NY" } +{ "_id" : "10570", "city" : "PLEASANTVILLE", "loc" : [ -73.78448400000001, 41.134977 ], "pop" : 11812, "state" : "NY" } +{ "_id" : "10573", "city" : "RYE BROOK", "loc" : [ -73.672045, 41.007755 ], "pop" : 32552, "state" : "NY" } +{ "_id" : "10576", "city" : "POUND RIDGE", "loc" : [ -73.573215, 41.204196 ], "pop" : 4720, "state" : "NY" } +{ "_id" : "10577", "city" : "PURCHASE", "loc" : [ -73.71562900000001, 41.038396 ], "pop" : 4453, "state" : "NY" } +{ "_id" : "10578", "city" : "PURDYS", "loc" : [ -73.654313, 41.322427 ], "pop" : 2534, "state" : "NY" } +{ "_id" : "10579", "city" : "PUTNAM VALLEY", "loc" : [ -73.85024, 41.372815 ], "pop" : 7453, "state" : "NY" } +{ "_id" : "10580", "city" : "RYE", "loc" : [ -73.690721, 40.973403 ], "pop" : 16479, "state" : "NY" } +{ "_id" : "10583", "city" : "HEATHCOTE", "loc" : [ -73.797566, 40.988365 ], "pop" : 35302, "state" : "NY" } +{ "_id" : "10588", "city" : "SHRUB OAK", "loc" : [ -73.82732, 41.328608 ], "pop" : 2103, "state" : "NY" } +{ "_id" : "10589", "city" : "SOMERS", "loc" : [ -73.695145, 41.334568 ], "pop" : 6618, "state" : "NY" } +{ "_id" : "10590", "city" : "SOUTH SALEM", "loc" : [ -73.54022399999999, 41.255261 ], "pop" : 6936, "state" : "NY" } +{ "_id" : "10591", "city" : "NORTH TARRYTOWN", "loc" : [ -73.859335, 41.078108 ], "pop" : 20080, "state" : "NY" } +{ "_id" : "10594", "city" : "THORNWOOD", "loc" : [ -73.773329, 41.118163 ], "pop" : 5455, "state" : "NY" } +{ "_id" : "10595", "city" : "VALHALLA", "loc" : [ -73.777596, 41.085559 ], "pop" : 5255, "state" : "NY" } +{ "_id" : "10597", "city" : "WACCABUC", "loc" : [ -73.603207, 41.303208 ], "pop" : 415, "state" : "NY" } +{ "_id" : "10598", "city" : "YORKTOWN HEIGHTS", "loc" : [ -73.79239800000001, 41.299947 ], "pop" : 28501, "state" : "NY" } +{ "_id" : "10601", "city" : "WHITE PLAINS", "loc" : [ -73.765231, 41.032955 ], "pop" : 8397, "state" : "NY" } +{ "_id" : "10603", "city" : "WHITE PLAINS", "loc" : [ -73.77758, 41.049913 ], "pop" : 14342, "state" : "NY" } +{ "_id" : "10604", "city" : "EAST WHITE PLAIN", "loc" : [ -73.750727, 41.043295 ], "pop" : 8899, "state" : "NY" } +{ "_id" : "10605", "city" : "WHITE PLAINS", "loc" : [ -73.755247, 41.014053 ], "pop" : 17843, "state" : "NY" } +{ "_id" : "10606", "city" : "WHITE PLAINS", "loc" : [ -73.778097, 41.024714 ], "pop" : 13436, "state" : "NY" } +{ "_id" : "10607", "city" : "WHITE PLAINS", "loc" : [ -73.81169199999999, 41.039813 ], "pop" : 7148, "state" : "NY" } +{ "_id" : "10701", "city" : "YONKERS", "loc" : [ -73.888317, 40.940716 ], "pop" : 59476, "state" : "NY" } +{ "_id" : "10703", "city" : "YONKERS", "loc" : [ -73.88516300000001, 40.951763 ], "pop" : 19958, "state" : "NY" } +{ "_id" : "10704", "city" : "YONKERS", "loc" : [ -73.859347, 40.917633 ], "pop" : 31604, "state" : "NY" } +{ "_id" : "10705", "city" : "YONKERS", "loc" : [ -73.89504100000001, 40.917665 ], "pop" : 36141, "state" : "NY" } +{ "_id" : "10706", "city" : "HASTINGS ON HUDS", "loc" : [ -73.875912, 40.99071 ], "pop" : 8546, "state" : "NY" } +{ "_id" : "10707", "city" : "TUCKAHOE", "loc" : [ -73.819771, 40.95691 ], "pop" : 15275, "state" : "NY" } +{ "_id" : "10708", "city" : "BRONXVILLE", "loc" : [ -73.83533199999999, 40.939133 ], "pop" : 20406, "state" : "NY" } +{ "_id" : "10709", "city" : "EASTCHESTER", "loc" : [ -73.80858000000001, 40.954966 ], "pop" : 2515, "state" : "NY" } +{ "_id" : "10710", "city" : "YONKERS", "loc" : [ -73.843435, 40.965574 ], "pop" : 24952, "state" : "NY" } +{ "_id" : "10801", "city" : "NEW ROCHELLE", "loc" : [ -73.787729, 40.916628 ], "pop" : 30929, "state" : "NY" } +{ "_id" : "10803", "city" : "PELHAM", "loc" : [ -73.807304, 40.904455 ], "pop" : 11997, "state" : "NY" } +{ "_id" : "10804", "city" : "NEW ROCHELLE", "loc" : [ -73.786018, 40.948335 ], "pop" : 14359, "state" : "NY" } +{ "_id" : "10805", "city" : "NEW ROCHELLE", "loc" : [ -73.781043, 40.900236 ], "pop" : 18471, "state" : "NY" } +{ "_id" : "10901", "city" : "SUFFERN", "loc" : [ -74.124098, 41.117654 ], "pop" : 21296, "state" : "NY" } +{ "_id" : "10911", "city" : "BEAR MOUNTAIN", "loc" : [ -73.99610800000001, 41.306734 ], "pop" : 14, "state" : "NY" } +{ "_id" : "10913", "city" : "BLAUVELT", "loc" : [ -73.962924, 41.062597 ], "pop" : 4770, "state" : "NY" } +{ "_id" : "10916", "city" : "CAMPBELL HALL", "loc" : [ -74.250466, 41.442993 ], "pop" : 3065, "state" : "NY" } +{ "_id" : "10917", "city" : "CENTRAL VALLEY", "loc" : [ -74.12203599999999, 41.326836 ], "pop" : 1407, "state" : "NY" } +{ "_id" : "10918", "city" : "CHESTER", "loc" : [ -74.26511600000001, 41.355381 ], "pop" : 9196, "state" : "NY" } +{ "_id" : "10919", "city" : "CIRCLEVILLE", "loc" : [ -74.38504399999999, 41.524387 ], "pop" : 79, "state" : "NY" } +{ "_id" : "10920", "city" : "CONGERS", "loc" : [ -73.94131, 41.148689 ], "pop" : 8088, "state" : "NY" } +{ "_id" : "10921", "city" : "FLORIDA", "loc" : [ -74.352805, 41.329507 ], "pop" : 2698, "state" : "NY" } +{ "_id" : "10923", "city" : "GARNERVILLE", "loc" : [ -74.000501, 41.202057 ], "pop" : 9650, "state" : "NY" } +{ "_id" : "10924", "city" : "GOSHEN", "loc" : [ -74.330162, 41.394586 ], "pop" : 11019, "state" : "NY" } +{ "_id" : "10925", "city" : "GREENWOOD LAKE", "loc" : [ -74.30000699999999, 41.212718 ], "pop" : 4723, "state" : "NY" } +{ "_id" : "10926", "city" : "HARRIMAN", "loc" : [ -74.155805, 41.299681 ], "pop" : 3249, "state" : "NY" } +{ "_id" : "10927", "city" : "HAVERSTRAW", "loc" : [ -73.968959, 41.197095 ], "pop" : 9438, "state" : "NY" } +{ "_id" : "10928", "city" : "HIGHLAND FALLS", "loc" : [ -73.97461800000001, 41.358177 ], "pop" : 5704, "state" : "NY" } +{ "_id" : "10930", "city" : "HIGHLAND MILLS", "loc" : [ -74.11967799999999, 41.353592 ], "pop" : 5629, "state" : "NY" } +{ "_id" : "10931", "city" : "HILLBURN", "loc" : [ -74.17019500000001, 41.123981 ], "pop" : 892, "state" : "NY" } +{ "_id" : "10940", "city" : "SCOTCHTOWN", "loc" : [ -74.412023, 41.457222 ], "pop" : 51211, "state" : "NY" } +{ "_id" : "10950", "city" : "MONROE", "loc" : [ -74.18852099999999, 41.328578 ], "pop" : 30829, "state" : "NY" } +{ "_id" : "10952", "city" : "MONSEY", "loc" : [ -74.0736, 41.116255 ], "pop" : 25251, "state" : "NY" } +{ "_id" : "10954", "city" : "BARDONIA", "loc" : [ -74.00958900000001, 41.099176 ], "pop" : 16390, "state" : "NY" } +{ "_id" : "10956", "city" : "NEW CITY", "loc" : [ -73.996206, 41.147247 ], "pop" : 33340, "state" : "NY" } +{ "_id" : "10958", "city" : "NEW HAMPTON", "loc" : [ -74.443483, 41.362714 ], "pop" : 3918, "state" : "NY" } +{ "_id" : "10960", "city" : "NYACK", "loc" : [ -73.92522599999999, 41.091351 ], "pop" : 14542, "state" : "NY" } +{ "_id" : "10962", "city" : "ORANGEBURG", "loc" : [ -73.96087300000001, 41.044183 ], "pop" : 6324, "state" : "NY" } +{ "_id" : "10963", "city" : "OTISVILLE", "loc" : [ -74.52941300000001, 41.481806 ], "pop" : 4748, "state" : "NY" } +{ "_id" : "10964", "city" : "PALISADES", "loc" : [ -73.92498500000001, 41.010263 ], "pop" : 996, "state" : "NY" } +{ "_id" : "10965", "city" : "PEARL RIVER", "loc" : [ -74.01587000000001, 41.062939 ], "pop" : 14791, "state" : "NY" } +{ "_id" : "10968", "city" : "PIERMONT", "loc" : [ -73.91918699999999, 41.03955 ], "pop" : 2104, "state" : "NY" } +{ "_id" : "10969", "city" : "PINE ISLAND", "loc" : [ -74.379457, 41.323796 ], "pop" : 589, "state" : "NY" } +{ "_id" : "10970", "city" : "POMONA", "loc" : [ -74.043564, 41.190105 ], "pop" : 7356, "state" : "NY" } +{ "_id" : "10973", "city" : "SLATE HILL", "loc" : [ -74.484658, 41.376004 ], "pop" : 2127, "state" : "NY" } +{ "_id" : "10974", "city" : "STERLINGTON", "loc" : [ -74.188107, 41.16047 ], "pop" : 3322, "state" : "NY" } +{ "_id" : "10975", "city" : "SOUTHFIELDS", "loc" : [ -74.176182, 41.247959 ], "pop" : 5, "state" : "NY" } +{ "_id" : "10976", "city" : "SPARKILL", "loc" : [ -73.92288000000001, 41.025573 ], "pop" : 894, "state" : "NY" } +{ "_id" : "10977", "city" : "CHESTNUT RIDGE", "loc" : [ -74.04625299999999, 41.117977 ], "pop" : 43435, "state" : "NY" } +{ "_id" : "10980", "city" : "STONY POINT", "loc" : [ -73.99616399999999, 41.229174 ], "pop" : 11437, "state" : "NY" } +{ "_id" : "10983", "city" : "TAPPAN", "loc" : [ -73.949065, 41.027751 ], "pop" : 6181, "state" : "NY" } +{ "_id" : "10984", "city" : "THIELLS", "loc" : [ -74.015441, 41.207826 ], "pop" : 3971, "state" : "NY" } +{ "_id" : "10985", "city" : "THOMPSON RIDGE", "loc" : [ -74.37744499999999, 41.580957 ], "pop" : 82, "state" : "NY" } +{ "_id" : "10986", "city" : "TOMKINS COVE", "loc" : [ -73.98916, 41.259763 ], "pop" : 1615, "state" : "NY" } +{ "_id" : "10987", "city" : "TUXEDO PARK", "loc" : [ -74.215912, 41.192486 ], "pop" : 2481, "state" : "NY" } +{ "_id" : "10989", "city" : "VALLEY COTTAGE", "loc" : [ -73.943006, 41.118338 ], "pop" : 9132, "state" : "NY" } +{ "_id" : "10990", "city" : "WARWICK", "loc" : [ -74.36037, 41.265563 ], "pop" : 16960, "state" : "NY" } +{ "_id" : "10992", "city" : "WASHINGTONVILLE", "loc" : [ -74.1601, 41.423701 ], "pop" : 8842, "state" : "NY" } +{ "_id" : "10993", "city" : "WEST HAVERSTRAW", "loc" : [ -73.982123, 41.209016 ], "pop" : 3591, "state" : "NY" } +{ "_id" : "10994", "city" : "WEST NYACK", "loc" : [ -73.97684599999999, 41.097324 ], "pop" : 6655, "state" : "NY" } +{ "_id" : "10996", "city" : "WEST POINT", "loc" : [ -73.97366599999999, 41.394545 ], "pop" : 7979, "state" : "NY" } +{ "_id" : "10998", "city" : "WESTTOWN", "loc" : [ -74.55294600000001, 41.321414 ], "pop" : 2097, "state" : "NY" } +{ "_id" : "11001", "city" : "FLORAL PARK", "loc" : [ -73.70576, 40.723586 ], "pop" : 26498, "state" : "NY" } +{ "_id" : "11003", "city" : "ALDEN MANOR", "loc" : [ -73.70575100000001, 40.699615 ], "pop" : 34741, "state" : "NY" } +{ "_id" : "11004", "city" : "GLEN OAKS", "loc" : [ -73.71143600000001, 40.7481 ], "pop" : 19058, "state" : "NY" } +{ "_id" : "11010", "city" : "FRANKLIN SQUARE", "loc" : [ -73.67580700000001, 40.701049 ], "pop" : 24595, "state" : "NY" } +{ "_id" : "11020", "city" : "GREAT NECK", "loc" : [ -73.718918, 40.774235 ], "pop" : 6144, "state" : "NY" } +{ "_id" : "11021", "city" : "GREAT NECK", "loc" : [ -73.726984, 40.786674 ], "pop" : 17198, "state" : "NY" } +{ "_id" : "11023", "city" : "GREAT NECK", "loc" : [ -73.734257, 40.799307 ], "pop" : 7981, "state" : "NY" } +{ "_id" : "11024", "city" : "KINGS POINT CONT", "loc" : [ -73.74139099999999, 40.813307 ], "pop" : 7298, "state" : "NY" } +{ "_id" : "11030", "city" : "PLANDOME", "loc" : [ -73.68836899999999, 40.798641 ], "pop" : 15271, "state" : "NY" } +{ "_id" : "11040", "city" : "HILLSIDE MANOR", "loc" : [ -73.68042, 40.743926 ], "pop" : 37695, "state" : "NY" } +{ "_id" : "11042", "city" : "NEW HYDE PARK", "loc" : [ -73.69497800000001, 40.7602 ], "pop" : 1, "state" : "NY" } +{ "_id" : "11050", "city" : "PORT WASHINGTON", "loc" : [ -73.69635599999999, 40.834995 ], "pop" : 28264, "state" : "NY" } +{ "_id" : "11101", "city" : "ASTORIA", "loc" : [ -73.939393, 40.750316 ], "pop" : 23142, "state" : "NY" } +{ "_id" : "11102", "city" : "ASTORIA", "loc" : [ -73.926462, 40.77063 ], "pop" : 30078, "state" : "NY" } +{ "_id" : "11103", "city" : "ASTORIA", "loc" : [ -73.914886, 40.762651 ], "pop" : 38597, "state" : "NY" } +{ "_id" : "11104", "city" : "SUNNYSIDE", "loc" : [ -73.921556, 40.743641 ], "pop" : 25898, "state" : "NY" } +{ "_id" : "11105", "city" : "ASTORIA", "loc" : [ -73.910965, 40.77627 ], "pop" : 37297, "state" : "NY" } +{ "_id" : "11106", "city" : "ASTORIA", "loc" : [ -73.92952699999999, 40.760813 ], "pop" : 36515, "state" : "NY" } +{ "_id" : "11201", "city" : "BROOKLYN", "loc" : [ -73.99034, 40.694021 ], "pop" : 46980, "state" : "NY" } +{ "_id" : "11203", "city" : "BROOKLYN", "loc" : [ -73.934888, 40.650496 ], "pop" : 80566, "state" : "NY" } +{ "_id" : "11204", "city" : "BROOKLYN", "loc" : [ -73.985623, 40.617871 ], "pop" : 64780, "state" : "NY" } +{ "_id" : "11205", "city" : "BROOKLYN", "loc" : [ -73.96662000000001, 40.692433 ], "pop" : 36852, "state" : "NY" } +{ "_id" : "11206", "city" : "BROOKLYN", "loc" : [ -73.943617, 40.701195 ], "pop" : 74825, "state" : "NY" } +{ "_id" : "11207", "city" : "BROOKLYN", "loc" : [ -73.893957, 40.670486 ], "pop" : 83158, "state" : "NY" } +{ "_id" : "11208", "city" : "BROOKLYN", "loc" : [ -73.873649, 40.676191 ], "pop" : 78322, "state" : "NY" } +{ "_id" : "11209", "city" : "BROOKLYN", "loc" : [ -74.030304, 40.625106 ], "pop" : 62346, "state" : "NY" } +{ "_id" : "11210", "city" : "BROOKLYN", "loc" : [ -73.946682, 40.628064 ], "pop" : 62445, "state" : "NY" } +{ "_id" : "11211", "city" : "BROOKLYN", "loc" : [ -73.956283, 40.709476 ], "pop" : 78338, "state" : "NY" } +{ "_id" : "11212", "city" : "BROOKLYN", "loc" : [ -73.914483, 40.662474 ], "pop" : 87079, "state" : "NY" } +{ "_id" : "11213", "city" : "BROOKLYN", "loc" : [ -73.93665, 40.669961 ], "pop" : 62607, "state" : "NY" } +{ "_id" : "11214", "city" : "BROOKLYN", "loc" : [ -73.99681, 40.601563 ], "pop" : 73076, "state" : "NY" } +{ "_id" : "11215", "city" : "BROOKLYN", "loc" : [ -73.982783, 40.666863 ], "pop" : 63338, "state" : "NY" } +{ "_id" : "11216", "city" : "BROOKLYN", "loc" : [ -73.949639, 40.67943 ], "pop" : 58862, "state" : "NY" } +{ "_id" : "11217", "city" : "BROOKLYN", "loc" : [ -73.979797, 40.68165 ], "pop" : 36232, "state" : "NY" } +{ "_id" : "11218", "city" : "BROOKLYN", "loc" : [ -73.97580600000001, 40.642373 ], "pop" : 66569, "state" : "NY" } +{ "_id" : "11219", "city" : "BROOKLYN", "loc" : [ -73.996011, 40.633568 ], "pop" : 73527, "state" : "NY" } +{ "_id" : "11220", "city" : "BROOKLYN", "loc" : [ -74.01328700000001, 40.641165 ], "pop" : 76923, "state" : "NY" } +{ "_id" : "11221", "city" : "BROOKLYN", "loc" : [ -73.927373, 40.690695 ], "pop" : 70583, "state" : "NY" } +{ "_id" : "11222", "city" : "BROOKLYN", "loc" : [ -73.94984599999999, 40.727164 ], "pop" : 38158, "state" : "NY" } +{ "_id" : "11223", "city" : "BROOKLYN", "loc" : [ -73.97429099999999, 40.597874 ], "pop" : 70904, "state" : "NY" } +{ "_id" : "11224", "city" : "BROOKLYN", "loc" : [ -73.988395, 40.576729 ], "pop" : 52480, "state" : "NY" } +{ "_id" : "11225", "city" : "BROOKLYN", "loc" : [ -73.954588, 40.662776 ], "pop" : 66752, "state" : "NY" } +{ "_id" : "11226", "city" : "BROOKLYN", "loc" : [ -73.956985, 40.646694 ], "pop" : 111396, "state" : "NY" } +{ "_id" : "11228", "city" : "BROOKLYN", "loc" : [ -74.012067, 40.617441 ], "pop" : 39220, "state" : "NY" } +{ "_id" : "11229", "city" : "BROOKLYN", "loc" : [ -73.94749, 40.601094 ], "pop" : 72660, "state" : "NY" } +{ "_id" : "11230", "city" : "BROOKLYN", "loc" : [ -73.965007, 40.622493 ], "pop" : 72733, "state" : "NY" } +{ "_id" : "11231", "city" : "BROOKLYN", "loc" : [ -74.00141000000001, 40.679437 ], "pop" : 32101, "state" : "NY" } +{ "_id" : "11232", "city" : "BROOKLYN", "loc" : [ -74.001797, 40.652113 ], "pop" : 22777, "state" : "NY" } +{ "_id" : "11233", "city" : "BROOKLYN", "loc" : [ -73.921104, 40.678415 ], "pop" : 58827, "state" : "NY" } +{ "_id" : "11234", "city" : "BROOKLYN", "loc" : [ -73.92391499999999, 40.620475 ], "pop" : 74953, "state" : "NY" } +{ "_id" : "11235", "city" : "BROOKLYN", "loc" : [ -73.953599, 40.583898 ], "pop" : 67088, "state" : "NY" } +{ "_id" : "11236", "city" : "BROOKLYN", "loc" : [ -73.902764, 40.640685 ], "pop" : 77253, "state" : "NY" } +{ "_id" : "11237", "city" : "BROOKLYN", "loc" : [ -73.917979, 40.700616 ], "pop" : 48339, "state" : "NY" } +{ "_id" : "11238", "city" : "BROOKLYN", "loc" : [ -73.964387, 40.679015 ], "pop" : 42507, "state" : "NY" } +{ "_id" : "11239", "city" : "BROOKLYN", "loc" : [ -73.882375, 40.649748 ], "pop" : 14948, "state" : "NY" } +{ "_id" : "11251", "city" : "BROOKLYN NAVY YA", "loc" : [ -73.966511, 40.703578 ], "pop" : 18, "state" : "NY" } +{ "_id" : "11354", "city" : "FLUSHING", "loc" : [ -73.82414199999999, 40.766722 ], "pop" : 51947, "state" : "NY" } +{ "_id" : "11355", "city" : "FLUSHING", "loc" : [ -73.822609, 40.753573 ], "pop" : 69164, "state" : "NY" } +{ "_id" : "11356", "city" : "COLLEGE POINT", "loc" : [ -73.844955, 40.785511 ], "pop" : 17723, "state" : "NY" } +{ "_id" : "11357", "city" : "WHITESTONE", "loc" : [ -73.809594, 40.785147 ], "pop" : 39093, "state" : "NY" } +{ "_id" : "11358", "city" : "FLUSHING", "loc" : [ -73.79678800000001, 40.760636 ], "pop" : 34045, "state" : "NY" } +{ "_id" : "11359", "city" : "FORT TOTTEN", "loc" : [ -73.777244, 40.789967 ], "pop" : 734, "state" : "NY" } +{ "_id" : "11360", "city" : "BAYSIDE", "loc" : [ -73.781216, 40.780684 ], "pop" : 20337, "state" : "NY" } +{ "_id" : "11361", "city" : "BAYSIDE", "loc" : [ -73.774457, 40.76268 ], "pop" : 25529, "state" : "NY" } +{ "_id" : "11362", "city" : "LITTLE NECK", "loc" : [ -73.73262200000001, 40.759131 ], "pop" : 16226, "state" : "NY" } +{ "_id" : "11363", "city" : "LITTLE NECK", "loc" : [ -73.745401, 40.772166 ], "pop" : 6909, "state" : "NY" } +{ "_id" : "11364", "city" : "FLUSHING", "loc" : [ -73.758646, 40.745847 ], "pop" : 32080, "state" : "NY" } +{ "_id" : "11365", "city" : "FRESH MEADOWS", "loc" : [ -73.79506000000001, 40.737424 ], "pop" : 34087, "state" : "NY" } +{ "_id" : "11366", "city" : "FRESH MEADOWS", "loc" : [ -73.794922, 40.727231 ], "pop" : 12089, "state" : "NY" } +{ "_id" : "11367", "city" : "FLUSHING", "loc" : [ -73.81953, 40.727966 ], "pop" : 36877, "state" : "NY" } +{ "_id" : "11368", "city" : "CORONA", "loc" : [ -73.861069, 40.745288 ], "pop" : 75746, "state" : "NY" } +{ "_id" : "11369", "city" : "EAST ELMHURST", "loc" : [ -73.873902, 40.761254 ], "pop" : 28106, "state" : "NY" } +{ "_id" : "11370", "city" : "EAST ELMHURST", "loc" : [ -73.891586, 40.761111 ], "pop" : 23910, "state" : "NY" } +{ "_id" : "11371", "city" : "FLUSHING", "loc" : [ -73.873535, 40.772117 ], "pop" : 49, "state" : "NY" } +{ "_id" : "11372", "city" : "JACKSON HEIGHTS", "loc" : [ -73.882975, 40.751329 ], "pop" : 57726, "state" : "NY" } +{ "_id" : "11373", "city" : "JACKSON HEIGHTS", "loc" : [ -73.878551, 40.740388 ], "pop" : 88241, "state" : "NY" } +{ "_id" : "11374", "city" : "REGO PARK", "loc" : [ -73.860191, 40.72775 ], "pop" : 40024, "state" : "NY" } +{ "_id" : "11375", "city" : "FOREST HILLS", "loc" : [ -73.847306, 40.722854 ], "pop" : 65180, "state" : "NY" } +{ "_id" : "11377", "city" : "WOODSIDE", "loc" : [ -73.90691099999999, 40.744972 ], "pop" : 75894, "state" : "NY" } +{ "_id" : "11378", "city" : "MASPETH", "loc" : [ -73.899682, 40.723865 ], "pop" : 31292, "state" : "NY" } +{ "_id" : "11379", "city" : "MIDDLE VILLAGE", "loc" : [ -73.879228, 40.717286 ], "pop" : 28981, "state" : "NY" } +{ "_id" : "11385", "city" : "RIDGEWOOD", "loc" : [ -73.89612200000001, 40.703613 ], "pop" : 85732, "state" : "NY" } +{ "_id" : "11411", "city" : "CAMBRIA HEIGHTS", "loc" : [ -73.73744499999999, 40.694741 ], "pop" : 20094, "state" : "NY" } +{ "_id" : "11412", "city" : "KEW GARDENS", "loc" : [ -73.758641, 40.698097 ], "pop" : 32003, "state" : "NY" } +{ "_id" : "11413", "city" : "SPRINGFIELD GARD", "loc" : [ -73.75071, 40.67295 ], "pop" : 36679, "state" : "NY" } +{ "_id" : "11414", "city" : "KEW GARDENS", "loc" : [ -73.84504099999999, 40.660603 ], "pop" : 27256, "state" : "NY" } +{ "_id" : "11415", "city" : "KEW GARDENS", "loc" : [ -73.82971499999999, 40.706865 ], "pop" : 16703, "state" : "NY" } +{ "_id" : "11416", "city" : "OZONE PARK", "loc" : [ -73.85139700000001, 40.683753 ], "pop" : 17876, "state" : "NY" } +{ "_id" : "11417", "city" : "OZONE PARK", "loc" : [ -73.84477800000001, 40.676854 ], "pop" : 22768, "state" : "NY" } +{ "_id" : "11418", "city" : "RICHMOND HILL", "loc" : [ -73.834484, 40.698171 ], "pop" : 29382, "state" : "NY" } +{ "_id" : "11419", "city" : "S RICHMOND HILL", "loc" : [ -73.823871, 40.688113 ], "pop" : 37530, "state" : "NY" } +{ "_id" : "11420", "city" : "S OZONE PARK", "loc" : [ -73.81577299999999, 40.675379 ], "pop" : 38096, "state" : "NY" } +{ "_id" : "11421", "city" : "WOODHAVEN", "loc" : [ -73.858514, 40.691345 ], "pop" : 29442, "state" : "NY" } +{ "_id" : "11422", "city" : "ROSEDALE", "loc" : [ -73.735265, 40.662141 ], "pop" : 26674, "state" : "NY" } +{ "_id" : "11423", "city" : "HOLLIS", "loc" : [ -73.767685, 40.714156 ], "pop" : 29102, "state" : "NY" } +{ "_id" : "11426", "city" : "BELLEROSE", "loc" : [ -73.723018, 40.734735 ], "pop" : 18145, "state" : "NY" } +{ "_id" : "11427", "city" : "QUEENS VILLAGE", "loc" : [ -73.748908, 40.727707 ], "pop" : 21004, "state" : "NY" } +{ "_id" : "11428", "city" : "QUEENS VILLAGE", "loc" : [ -73.743312, 40.720756 ], "pop" : 16793, "state" : "NY" } +{ "_id" : "11429", "city" : "QUEENS VILLAGE", "loc" : [ -73.740064, 40.70902 ], "pop" : 24311, "state" : "NY" } +{ "_id" : "11430", "city" : "JAMAICA", "loc" : [ -73.782663, 40.647221 ], "pop" : 398, "state" : "NY" } +{ "_id" : "11432", "city" : "JAMAICA", "loc" : [ -73.79442, 40.711867 ], "pop" : 53011, "state" : "NY" } +{ "_id" : "11433", "city" : "JAMAICA", "loc" : [ -73.78766899999999, 40.69691 ], "pop" : 26325, "state" : "NY" } +{ "_id" : "11434", "city" : "JAMAICA", "loc" : [ -73.77584, 40.677483 ], "pop" : 50464, "state" : "NY" } +{ "_id" : "11435", "city" : "JAMAICA", "loc" : [ -73.811121, 40.702934 ], "pop" : 47987, "state" : "NY" } +{ "_id" : "11436", "city" : "JAMAICA", "loc" : [ -73.79659599999999, 40.676347 ], "pop" : 17020, "state" : "NY" } +{ "_id" : "11501", "city" : "MINEOLA", "loc" : [ -73.63976099999999, 40.746927 ], "pop" : 19087, "state" : "NY" } +{ "_id" : "11507", "city" : "ALBERTSON", "loc" : [ -73.651419, 40.77032 ], "pop" : 7091, "state" : "NY" } +{ "_id" : "11509", "city" : "ATLANTIC BEACH", "loc" : [ -73.725545, 40.588652 ], "pop" : 2831, "state" : "NY" } +{ "_id" : "11510", "city" : "BALDWIN", "loc" : [ -73.60968800000001, 40.654755 ], "pop" : 30959, "state" : "NY" } +{ "_id" : "11514", "city" : "CARLE PLACE", "loc" : [ -73.611941, 40.75115 ], "pop" : 4863, "state" : "NY" } +{ "_id" : "11516", "city" : "CEDARHURST", "loc" : [ -73.726404, 40.623619 ], "pop" : 7113, "state" : "NY" } +{ "_id" : "11518", "city" : "EAST ROCKAWAY", "loc" : [ -73.667376, 40.640445 ], "pop" : 11027, "state" : "NY" } +{ "_id" : "11520", "city" : "FREEPORT", "loc" : [ -73.58661499999999, 40.65359 ], "pop" : 40662, "state" : "NY" } +{ "_id" : "11530", "city" : "GARDEN CITY", "loc" : [ -73.648718, 40.72452 ], "pop" : 27951, "state" : "NY" } +{ "_id" : "11542", "city" : "GLEN COVE", "loc" : [ -73.62772, 40.864958 ], "pop" : 24997, "state" : "NY" } +{ "_id" : "11545", "city" : "GLEN HEAD", "loc" : [ -73.60763, 40.828098 ], "pop" : 13565, "state" : "NY" } +{ "_id" : "11548", "city" : "GREENVALE", "loc" : [ -73.626124, 40.812503 ], "pop" : 1021, "state" : "NY" } +{ "_id" : "11550", "city" : "HEMPSTEAD", "loc" : [ -73.61764100000001, 40.70492 ], "pop" : 50933, "state" : "NY" } +{ "_id" : "11552", "city" : "WEST HEMPSTEAD", "loc" : [ -73.653859, 40.692915 ], "pop" : 22972, "state" : "NY" } +{ "_id" : "11553", "city" : "UNIONDALE", "loc" : [ -73.591995, 40.702029 ], "pop" : 20397, "state" : "NY" } +{ "_id" : "11554", "city" : "EAST MEADOW", "loc" : [ -73.556088, 40.714915 ], "pop" : 36692, "state" : "NY" } +{ "_id" : "11557", "city" : "HEWLETT", "loc" : [ -73.695667, 40.640392 ], "pop" : 8023, "state" : "NY" } +{ "_id" : "11558", "city" : "ISLAND PARK", "loc" : [ -73.655411, 40.604044 ], "pop" : 8857, "state" : "NY" } +{ "_id" : "11559", "city" : "LAWRENCE", "loc" : [ -73.732969, 40.61396 ], "pop" : 6703, "state" : "NY" } +{ "_id" : "11560", "city" : "LOCUST VALLEY", "loc" : [ -73.59271, 40.881728 ], "pop" : 6771, "state" : "NY" } +{ "_id" : "11561", "city" : "LONG BEACH", "loc" : [ -73.65946700000001, 40.587697 ], "pop" : 39066, "state" : "NY" } +{ "_id" : "11563", "city" : "LYNBROOK", "loc" : [ -73.674143, 40.657107 ], "pop" : 22659, "state" : "NY" } +{ "_id" : "11565", "city" : "MALVERNE", "loc" : [ -73.673073, 40.674982 ], "pop" : 8660, "state" : "NY" } +{ "_id" : "11566", "city" : "NORTH MERRICK", "loc" : [ -73.555001, 40.668312 ], "pop" : 36427, "state" : "NY" } +{ "_id" : "11568", "city" : "OLD WESTBURY", "loc" : [ -73.587515, 40.78821 ], "pop" : 5524, "state" : "NY" } +{ "_id" : "11570", "city" : "ROCKVILLE CENTRE", "loc" : [ -73.63800000000001, 40.663745 ], "pop" : 27127, "state" : "NY" } +{ "_id" : "11572", "city" : "OCEANSIDE", "loc" : [ -73.637533, 40.636199 ], "pop" : 31406, "state" : "NY" } +{ "_id" : "11575", "city" : "ROOSEVELT", "loc" : [ -73.586697, 40.680171 ], "pop" : 14595, "state" : "NY" } +{ "_id" : "11576", "city" : "ROSLYN", "loc" : [ -73.653362, 40.790668 ], "pop" : 13114, "state" : "NY" } +{ "_id" : "11577", "city" : "ROSLYN HEIGHTS", "loc" : [ -73.640292, 40.784497 ], "pop" : 10665, "state" : "NY" } +{ "_id" : "11579", "city" : "SEA CLIFF", "loc" : [ -73.643598, 40.845984 ], "pop" : 5068, "state" : "NY" } +{ "_id" : "11580", "city" : "VALLEY STREAM", "loc" : [ -73.705738, 40.674184 ], "pop" : 34327, "state" : "NY" } +{ "_id" : "11581", "city" : "NORTH WOODMERE", "loc" : [ -73.710705, 40.651838 ], "pop" : 19582, "state" : "NY" } +{ "_id" : "11590", "city" : "WESTBURY", "loc" : [ -73.57226, 40.755749 ], "pop" : 38026, "state" : "NY" } +{ "_id" : "11596", "city" : "WILLISTON PARK", "loc" : [ -73.644892, 40.759198 ], "pop" : 11057, "state" : "NY" } +{ "_id" : "11598", "city" : "WOODMERE", "loc" : [ -73.714146, 40.63262 ], "pop" : 13084, "state" : "NY" } +{ "_id" : "11691", "city" : "FAR ROCKAWAY", "loc" : [ -73.757971, 40.600645 ], "pop" : 52162, "state" : "NY" } +{ "_id" : "11692", "city" : "FAR ROCKAWAY", "loc" : [ -73.79744599999999, 40.59257 ], "pop" : 21192, "state" : "NY" } +{ "_id" : "11693", "city" : "FAR ROCKAWAY", "loc" : [ -73.819804, 40.607644 ], "pop" : 1630, "state" : "NY" } +{ "_id" : "11694", "city" : "FAR ROCKAWAY", "loc" : [ -73.839192, 40.579471 ], "pop" : 21972, "state" : "NY" } +{ "_id" : "11696", "city" : "INWOOD", "loc" : [ -73.746988, 40.617784 ], "pop" : 6660, "state" : "NY" } +{ "_id" : "11697", "city" : "FAR ROCKAWAY", "loc" : [ -73.914873, 40.560032 ], "pop" : 3690, "state" : "NY" } +{ "_id" : "11701", "city" : "AMITYVILLE", "loc" : [ -73.417106, 40.684197 ], "pop" : 29047, "state" : "NY" } +{ "_id" : "11702", "city" : "OAK BEACH", "loc" : [ -73.324583, 40.634183 ], "pop" : 456, "state" : "NY" } +{ "_id" : "11703", "city" : "NORTH BABYLON", "loc" : [ -73.323581, 40.732102 ], "pop" : 17916, "state" : "NY" } +{ "_id" : "11704", "city" : "WEST BABYLON", "loc" : [ -73.354591, 40.713476 ], "pop" : 45519, "state" : "NY" } +{ "_id" : "11705", "city" : "BAYPORT", "loc" : [ -73.05420700000001, 40.744408 ], "pop" : 7616, "state" : "NY" } +{ "_id" : "11706", "city" : "KISMET", "loc" : [ -73.252708, 40.733744 ], "pop" : 5507, "state" : "NY" } +{ "_id" : "11709", "city" : "BAYVILLE", "loc" : [ -73.560141, 40.907382 ], "pop" : 7185, "state" : "NY" } +{ "_id" : "11710", "city" : "NORTH BELLMORE", "loc" : [ -73.53451699999999, 40.677028 ], "pop" : 34237, "state" : "NY" } +{ "_id" : "11713", "city" : "BELLPORT", "loc" : [ -72.94689099999999, 40.77327 ], "pop" : 7927, "state" : "NY" } +{ "_id" : "11714", "city" : "BETHPAGE", "loc" : [ -73.485727, 40.740014 ], "pop" : 21957, "state" : "NY" } +{ "_id" : "11715", "city" : "BLUE POINT", "loc" : [ -73.035213, 40.750089 ], "pop" : 4189, "state" : "NY" } +{ "_id" : "11716", "city" : "BOHEMIA", "loc" : [ -73.116339, 40.767788 ], "pop" : 10448, "state" : "NY" } +{ "_id" : "11717", "city" : "WEST BRENTWOOD", "loc" : [ -73.248189, 40.777918 ], "pop" : 60425, "state" : "NY" } +{ "_id" : "11718", "city" : "BRIGHTWATERS", "loc" : [ -73.264639, 40.727957 ], "pop" : 20866, "state" : "NY" } +{ "_id" : "11719", "city" : "BROOKHAVEN", "loc" : [ -72.89212499999999, 40.78428 ], "pop" : 7493, "state" : "NY" } +{ "_id" : "11720", "city" : "CENTEREACH", "loc" : [ -73.08216299999999, 40.870508 ], "pop" : 27519, "state" : "NY" } +{ "_id" : "11721", "city" : "CENTERPORT", "loc" : [ -73.3754, 40.892899 ], "pop" : 5770, "state" : "NY" } +{ "_id" : "11722", "city" : "CENTRAL ISLIP", "loc" : [ -73.196145, 40.786618 ], "pop" : 29418, "state" : "NY" } +{ "_id" : "11724", "city" : "COLD SPRING HARB", "loc" : [ -73.45003199999999, 40.863056 ], "pop" : 2860, "state" : "NY" } +{ "_id" : "11725", "city" : "COMMACK", "loc" : [ -73.27992399999999, 40.843032 ], "pop" : 29847, "state" : "NY" } +{ "_id" : "11726", "city" : "COPIAGUE", "loc" : [ -73.396271, 40.677833 ], "pop" : 15640, "state" : "NY" } +{ "_id" : "11727", "city" : "CORAM", "loc" : [ -73.00688100000001, 40.884988 ], "pop" : 25002, "state" : "NY" } +{ "_id" : "11729", "city" : "DEER PARK", "loc" : [ -73.32572, 40.759083 ], "pop" : 32146, "state" : "NY" } +{ "_id" : "11730", "city" : "EAST ISLIP", "loc" : [ -73.180471, 40.72816 ], "pop" : 15777, "state" : "NY" } +{ "_id" : "11731", "city" : "ELWOOD", "loc" : [ -73.319506, 40.867066 ], "pop" : 30333, "state" : "NY" } +{ "_id" : "11732", "city" : "EAST NORWICH", "loc" : [ -73.534876, 40.847162 ], "pop" : 3276, "state" : "NY" } +{ "_id" : "11733", "city" : "SETAUKET", "loc" : [ -73.101467, 40.930004 ], "pop" : 16470, "state" : "NY" } +{ "_id" : "11735", "city" : "SOUTH FARMINGDAL", "loc" : [ -73.445055, 40.725061 ], "pop" : 31358, "state" : "NY" } +{ "_id" : "11738", "city" : "FARMINGVILLE", "loc" : [ -73.04125000000001, 40.836602 ], "pop" : 14967, "state" : "NY" } +{ "_id" : "11740", "city" : "GREENLAWN", "loc" : [ -73.36464100000001, 40.862121 ], "pop" : 9967, "state" : "NY" } +{ "_id" : "11741", "city" : "HOLBROOK", "loc" : [ -73.071789, 40.796426 ], "pop" : 25964, "state" : "NY" } +{ "_id" : "11742", "city" : "HOLTSVILLE", "loc" : [ -73.04161000000001, 40.810478 ], "pop" : 10141, "state" : "NY" } +{ "_id" : "11743", "city" : "HALESITE", "loc" : [ -73.41092399999999, 40.866945 ], "pop" : 41511, "state" : "NY" } +{ "_id" : "11746", "city" : "DIX HILLS", "loc" : [ -73.375472, 40.821754 ], "pop" : 62162, "state" : "NY" } +{ "_id" : "11747", "city" : "MELVILLE", "loc" : [ -73.402963, 40.794606 ], "pop" : 14534, "state" : "NY" } +{ "_id" : "11751", "city" : "ISLIP", "loc" : [ -73.22211, 40.734821 ], "pop" : 21721, "state" : "NY" } +{ "_id" : "11752", "city" : "ISLIP TERRACE", "loc" : [ -73.18274599999999, 40.75482 ], "pop" : 9514, "state" : "NY" } +{ "_id" : "11753", "city" : "JERICHO", "loc" : [ -73.533067, 40.788118 ], "pop" : 9837, "state" : "NY" } +{ "_id" : "11754", "city" : "KINGS PARK", "loc" : [ -73.243763, 40.886121 ], "pop" : 19036, "state" : "NY" } +{ "_id" : "11755", "city" : "LAKE GROVE", "loc" : [ -73.11675099999999, 40.856681 ], "pop" : 8245, "state" : "NY" } +{ "_id" : "11756", "city" : "LEVITTOWN", "loc" : [ -73.516578, 40.725428 ], "pop" : 44967, "state" : "NY" } +{ "_id" : "11757", "city" : "LINDENHURST", "loc" : [ -73.374493, 40.688373 ], "pop" : 44726, "state" : "NY" } +{ "_id" : "11758", "city" : "NORTH MASSAPEQUA", "loc" : [ -73.46972700000001, 40.685738 ], "pop" : 42863, "state" : "NY" } +{ "_id" : "11762", "city" : "MASSAPEQUA PARK", "loc" : [ -73.444447, 40.680673 ], "pop" : 31693, "state" : "NY" } +{ "_id" : "11763", "city" : "MEDFORD", "loc" : [ -72.985214, 40.817416 ], "pop" : 20669, "state" : "NY" } +{ "_id" : "11764", "city" : "MILLER PLACE", "loc" : [ -72.991349, 40.943572 ], "pop" : 9601, "state" : "NY" } +{ "_id" : "11765", "city" : "MILL NECK", "loc" : [ -73.55260199999999, 40.88574 ], "pop" : 877, "state" : "NY" } +{ "_id" : "11766", "city" : "MOUNT SINAI", "loc" : [ -73.012732, 40.927092 ], "pop" : 8759, "state" : "NY" } +{ "_id" : "11767", "city" : "NESCONSET", "loc" : [ -73.1482, 40.846206 ], "pop" : 9681, "state" : "NY" } +{ "_id" : "11768", "city" : "NORTHPORT", "loc" : [ -73.330889, 40.905062 ], "pop" : 21714, "state" : "NY" } +{ "_id" : "11769", "city" : "OAKDALE", "loc" : [ -73.12969, 40.738224 ], "pop" : 9366, "state" : "NY" } +{ "_id" : "11771", "city" : "OYSTER BAY", "loc" : [ -73.52721200000001, 40.866012 ], "pop" : 9806, "state" : "NY" } +{ "_id" : "11772", "city" : "DAVIS PARK", "loc" : [ -72.998108, 40.773501 ], "pop" : 40962, "state" : "NY" } +{ "_id" : "11776", "city" : "PORT JEFFERSON S", "loc" : [ -73.052136, 40.911722 ], "pop" : 19800, "state" : "NY" } +{ "_id" : "11777", "city" : "PORT JEFFERSON", "loc" : [ -73.061093, 40.945687 ], "pop" : 8512, "state" : "NY" } +{ "_id" : "11778", "city" : "ROCKY POINT", "loc" : [ -72.935681, 40.949206 ], "pop" : 11913, "state" : "NY" } +{ "_id" : "11779", "city" : "LAKE RONKONKOMA", "loc" : [ -73.1208, 40.820763 ], "pop" : 43424, "state" : "NY" } +{ "_id" : "11780", "city" : "SAINT JAMES", "loc" : [ -73.159121, 40.881299 ], "pop" : 14211, "state" : "NY" } +{ "_id" : "11782", "city" : "CHERRY GROVE", "loc" : [ -73.082297, 40.74606 ], "pop" : 15718, "state" : "NY" } +{ "_id" : "11783", "city" : "SEAFORD", "loc" : [ -73.491015, 40.679513 ], "pop" : 21644, "state" : "NY" } +{ "_id" : "11784", "city" : "SELDEN", "loc" : [ -73.044848, 40.869883 ], "pop" : 23753, "state" : "NY" } +{ "_id" : "11786", "city" : "SHOREHAM", "loc" : [ -72.892685, 40.948493 ], "pop" : 5114, "state" : "NY" } +{ "_id" : "11787", "city" : "SMITHTOWN", "loc" : [ -73.21381599999999, 40.854186 ], "pop" : 29932, "state" : "NY" } +{ "_id" : "11788", "city" : "HAUPPAUGE", "loc" : [ -73.195762, 40.823069 ], "pop" : 19713, "state" : "NY" } +{ "_id" : "11789", "city" : "SOUND BEACH", "loc" : [ -72.974172, 40.956707 ], "pop" : 6497, "state" : "NY" } +{ "_id" : "11790", "city" : "STONY BROOK", "loc" : [ -73.125085, 40.900257 ], "pop" : 13767, "state" : "NY" } +{ "_id" : "11791", "city" : "SYOSSET", "loc" : [ -73.502397, 40.81462 ], "pop" : 24949, "state" : "NY" } +{ "_id" : "11792", "city" : "WADING RIVER", "loc" : [ -72.834774, 40.952049 ], "pop" : 6186, "state" : "NY" } +{ "_id" : "11793", "city" : "WANTAGH", "loc" : [ -73.51033, 40.684998 ], "pop" : 31972, "state" : "NY" } +{ "_id" : "11794", "city" : "SUNY STONY BROOK", "loc" : [ -73.125456, 40.914127 ], "pop" : 5504, "state" : "NY" } +{ "_id" : "11795", "city" : "WEST ISLIP", "loc" : [ -73.30072, 40.711734 ], "pop" : 39344, "state" : "NY" } +{ "_id" : "11796", "city" : "WEST SAYVILLE", "loc" : [ -73.100019, 40.731971 ], "pop" : 3575, "state" : "NY" } +{ "_id" : "11797", "city" : "WOODBURY", "loc" : [ -73.47161199999999, 40.815441 ], "pop" : 8104, "state" : "NY" } +{ "_id" : "11798", "city" : "WHEATLEY HEIGHTS", "loc" : [ -73.36596, 40.753258 ], "pop" : 13312, "state" : "NY" } +{ "_id" : "11801", "city" : "HICKSVILLE", "loc" : [ -73.52297, 40.762305 ], "pop" : 38307, "state" : "NY" } +{ "_id" : "11803", "city" : "PLAINVIEW", "loc" : [ -73.481638, 40.778099 ], "pop" : 28207, "state" : "NY" } +{ "_id" : "11804", "city" : "OLD BETHPAGE", "loc" : [ -73.457481, 40.764991 ], "pop" : 5233, "state" : "NY" } +{ "_id" : "11901", "city" : "RIVERHEAD", "loc" : [ -72.651966, 40.926202 ], "pop" : 20705, "state" : "NY" } +{ "_id" : "11933", "city" : "CALVERTON", "loc" : [ -72.74229, 40.929662 ], "pop" : 3954, "state" : "NY" } +{ "_id" : "11934", "city" : "CENTER MORICHES", "loc" : [ -72.797048, 40.799657 ], "pop" : 6265, "state" : "NY" } +{ "_id" : "11935", "city" : "CUTCHOGUE", "loc" : [ -72.480255, 41.013918 ], "pop" : 3678, "state" : "NY" } +{ "_id" : "11937", "city" : "EAST HAMPTON", "loc" : [ -72.17895799999999, 40.992964 ], "pop" : 12205, "state" : "NY" } +{ "_id" : "11939", "city" : "EAST MARION", "loc" : [ -72.34186, 41.126425 ], "pop" : 717, "state" : "NY" } +{ "_id" : "11940", "city" : "EAST MORICHES", "loc" : [ -72.753778, 40.808975 ], "pop" : 3822, "state" : "NY" } +{ "_id" : "11941", "city" : "EASTPORT", "loc" : [ -72.705388, 40.809947 ], "pop" : 1331, "state" : "NY" } +{ "_id" : "11942", "city" : "EAST QUOGUE", "loc" : [ -72.58129700000001, 40.84277 ], "pop" : 4181, "state" : "NY" } +{ "_id" : "11944", "city" : "GREENPORT", "loc" : [ -72.36741499999999, 41.103905 ], "pop" : 3657, "state" : "NY" } +{ "_id" : "11946", "city" : "HAMPTON BAYS", "loc" : [ -72.52020899999999, 40.872596 ], "pop" : 9586, "state" : "NY" } +{ "_id" : "11948", "city" : "LAUREL", "loc" : [ -72.55404, 40.9674 ], "pop" : 954, "state" : "NY" } +{ "_id" : "11949", "city" : "MANORVILLE", "loc" : [ -72.800208, 40.842102 ], "pop" : 9660, "state" : "NY" } +{ "_id" : "11950", "city" : "MASTIC", "loc" : [ -72.85660799999999, 40.80644 ], "pop" : 20374, "state" : "NY" } +{ "_id" : "11951", "city" : "MASTIC BEACH", "loc" : [ -72.853701, 40.765653 ], "pop" : 18812, "state" : "NY" } +{ "_id" : "11952", "city" : "MATTITUCK", "loc" : [ -72.53629599999999, 40.994336 ], "pop" : 3896, "state" : "NY" } +{ "_id" : "11953", "city" : "MIDDLE ISLAND", "loc" : [ -72.952539, 40.878212 ], "pop" : 9411, "state" : "NY" } +{ "_id" : "11954", "city" : "MONTAUK", "loc" : [ -71.943963, 41.045853 ], "pop" : 3008, "state" : "NY" } +{ "_id" : "11955", "city" : "MORICHES", "loc" : [ -72.822918, 40.809502 ], "pop" : 2045, "state" : "NY" } +{ "_id" : "11957", "city" : "ORIENT", "loc" : [ -72.28789399999999, 41.143741 ], "pop" : 817, "state" : "NY" } +{ "_id" : "11961", "city" : "RIDGE", "loc" : [ -72.88813500000001, 40.901846 ], "pop" : 12817, "state" : "NY" } +{ "_id" : "11963", "city" : "SAG HARBOR", "loc" : [ -72.30674, 40.981996 ], "pop" : 7384, "state" : "NY" } +{ "_id" : "11964", "city" : "SHELTER ISLAND", "loc" : [ -72.33661600000001, 41.064046 ], "pop" : 1144, "state" : "NY" } +{ "_id" : "11965", "city" : "SHELTER ISLAND H", "loc" : [ -72.34808200000001, 41.074205 ], "pop" : 1119, "state" : "NY" } +{ "_id" : "11967", "city" : "SHIRLEY", "loc" : [ -72.876043, 40.743932 ], "pop" : 97, "state" : "NY" } +{ "_id" : "11968", "city" : "SOUTHAMPTON", "loc" : [ -72.41027099999999, 40.904341 ], "pop" : 10810, "state" : "NY" } +{ "_id" : "11971", "city" : "SOUTHOLD", "loc" : [ -72.429039, 41.05555 ], "pop" : 5788, "state" : "NY" } +{ "_id" : "11976", "city" : "WATER MILL", "loc" : [ -72.349069, 40.920929 ], "pop" : 1410, "state" : "NY" } +{ "_id" : "11977", "city" : "WESTHAMPTON", "loc" : [ -72.66993100000001, 40.818031 ], "pop" : 1306, "state" : "NY" } +{ "_id" : "11978", "city" : "WESTHAMPTON BEAC", "loc" : [ -72.644757, 40.822783 ], "pop" : 2863, "state" : "NY" } +{ "_id" : "11980", "city" : "YAPHANK", "loc" : [ -72.917435, 40.837037 ], "pop" : 5366, "state" : "NY" } +{ "_id" : "12007", "city" : "ALCOVE", "loc" : [ -74.034721, 42.453818 ], "pop" : 233, "state" : "NY" } +{ "_id" : "12008", "city" : "ALPLAUS", "loc" : [ -73.900188, 42.857329 ], "pop" : 340, "state" : "NY" } +{ "_id" : "12009", "city" : "ALTAMONT", "loc" : [ -74.019339, 42.70627 ], "pop" : 5683, "state" : "NY" } +{ "_id" : "12010", "city" : "WEST CHARLTON", "loc" : [ -74.18393, 42.948822 ], "pop" : 32028, "state" : "NY" } +{ "_id" : "12015", "city" : "ATHENS", "loc" : [ -73.815175, 42.2736 ], "pop" : 2538, "state" : "NY" } +{ "_id" : "12017", "city" : "AUSTERLITZ", "loc" : [ -73.454965, 42.322272 ], "pop" : 355, "state" : "NY" } +{ "_id" : "12018", "city" : "AVERILL PARK", "loc" : [ -73.550437, 42.636511 ], "pop" : 6528, "state" : "NY" } +{ "_id" : "12019", "city" : "BALLSTON LAKE", "loc" : [ -73.855171, 42.919176 ], "pop" : 16331, "state" : "NY" } +{ "_id" : "12020", "city" : "BALLSTON SPA", "loc" : [ -73.84858, 43.004956 ], "pop" : 25126, "state" : "NY" } +{ "_id" : "12022", "city" : "BERLIN", "loc" : [ -73.370186, 42.691893 ], "pop" : 275, "state" : "NY" } +{ "_id" : "12023", "city" : "BERNE", "loc" : [ -74.14657699999999, 42.610848 ], "pop" : 2293, "state" : "NY" } +{ "_id" : "12024", "city" : "BRAINARD", "loc" : [ -73.61587400000001, 42.405101 ], "pop" : 285, "state" : "NY" } +{ "_id" : "12025", "city" : "BROADALBIN", "loc" : [ -74.168367, 43.072687 ], "pop" : 4055, "state" : "NY" } +{ "_id" : "12027", "city" : "BURNT HILLS", "loc" : [ -73.89604300000001, 42.932902 ], "pop" : 945, "state" : "NY" } +{ "_id" : "12028", "city" : "BUSKIRK", "loc" : [ -73.44967699999999, 42.960134 ], "pop" : 1272, "state" : "NY" } +{ "_id" : "12029", "city" : "CANAAN", "loc" : [ -73.41588900000001, 42.413168 ], "pop" : 1298, "state" : "NY" } +{ "_id" : "12031", "city" : "CARLISLE", "loc" : [ -74.456284, 42.749754 ], "pop" : 420, "state" : "NY" } +{ "_id" : "12032", "city" : "CAROGA LAKE", "loc" : [ -74.516915, 43.192159 ], "pop" : 545, "state" : "NY" } +{ "_id" : "12033", "city" : "CASTLETON ON HUD", "loc" : [ -73.709529, 42.538243 ], "pop" : 7029, "state" : "NY" } +{ "_id" : "12035", "city" : "CENTRAL BRIDGE", "loc" : [ -74.345107, 42.73696 ], "pop" : 315, "state" : "NY" } +{ "_id" : "12036", "city" : "CHARLOTTEVILLE", "loc" : [ -74.68186300000001, 42.533034 ], "pop" : 166, "state" : "NY" } +{ "_id" : "12037", "city" : "CHATHAM", "loc" : [ -73.587281, 42.349578 ], "pop" : 4616, "state" : "NY" } +{ "_id" : "12041", "city" : "CLARKSVILLE", "loc" : [ -73.96877499999999, 42.566974 ], "pop" : 388, "state" : "NY" } +{ "_id" : "12042", "city" : "CLIMAX", "loc" : [ -73.862459, 42.370808 ], "pop" : 316, "state" : "NY" } +{ "_id" : "12043", "city" : "COBLESKILL", "loc" : [ -74.493866, 42.684047 ], "pop" : 7419, "state" : "NY" } +{ "_id" : "12046", "city" : "COEYMANS HOLLOW", "loc" : [ -73.920588, 42.486537 ], "pop" : 979, "state" : "NY" } +{ "_id" : "12047", "city" : "COHOES", "loc" : [ -73.712356, 42.775362 ], "pop" : 19033, "state" : "NY" } +{ "_id" : "12051", "city" : "COXSACKIE", "loc" : [ -73.819881, 42.350142 ], "pop" : 5615, "state" : "NY" } +{ "_id" : "12052", "city" : "CROPSEYVILLE", "loc" : [ -73.471869, 42.766718 ], "pop" : 1339, "state" : "NY" } +{ "_id" : "12053", "city" : "DELANSON", "loc" : [ -74.18680999999999, 42.74802 ], "pop" : 4476, "state" : "NY" } +{ "_id" : "12054", "city" : "DELMAR", "loc" : [ -73.837329, 42.61579 ], "pop" : 15502, "state" : "NY" } +{ "_id" : "12055", "city" : "DORMANSVILLE", "loc" : [ -74.198966, 42.437859 ], "pop" : 465, "state" : "NY" } +{ "_id" : "12056", "city" : "DUANESBURG", "loc" : [ -74.083911, 42.770839 ], "pop" : 2675, "state" : "NY" } +{ "_id" : "12057", "city" : "WHITE CREEK", "loc" : [ -73.351974, 42.961527 ], "pop" : 2252, "state" : "NY" } +{ "_id" : "12058", "city" : "EARLTON", "loc" : [ -73.906222, 42.352689 ], "pop" : 1015, "state" : "NY" } +{ "_id" : "12059", "city" : "EAST BERNE", "loc" : [ -74.055488, 42.61913 ], "pop" : 2224, "state" : "NY" } +{ "_id" : "12060", "city" : "EAST CHATHAM", "loc" : [ -73.49026000000001, 42.433028 ], "pop" : 1695, "state" : "NY" } +{ "_id" : "12061", "city" : "EAST GREENBUSH", "loc" : [ -73.682644, 42.595096 ], "pop" : 7282, "state" : "NY" } +{ "_id" : "12062", "city" : "EAST NASSAU", "loc" : [ -73.498407, 42.535215 ], "pop" : 2088, "state" : "NY" } +{ "_id" : "12064", "city" : "EAST WORCESTER", "loc" : [ -74.676348, 42.621423 ], "pop" : 322, "state" : "NY" } +{ "_id" : "12065", "city" : "CLIFTON PARK", "loc" : [ -73.785094, 42.849865 ], "pop" : 31352, "state" : "NY" } +{ "_id" : "12066", "city" : "ESPERANCE", "loc" : [ -74.288246, 42.771677 ], "pop" : 1254, "state" : "NY" } +{ "_id" : "12067", "city" : "FEURA BUSH", "loc" : [ -73.923743, 42.554998 ], "pop" : 1142, "state" : "NY" } +{ "_id" : "12068", "city" : "FONDA", "loc" : [ -74.402129, 42.957078 ], "pop" : 2307, "state" : "NY" } +{ "_id" : "12070", "city" : "FORT JOHNSON", "loc" : [ -74.248436, 42.976535 ], "pop" : 1811, "state" : "NY" } +{ "_id" : "12071", "city" : "FULTONHAM", "loc" : [ -74.38759, 42.585914 ], "pop" : 379, "state" : "NY" } +{ "_id" : "12072", "city" : "FULTONVILLE", "loc" : [ -74.359765, 42.903601 ], "pop" : 2356, "state" : "NY" } +{ "_id" : "12074", "city" : "GALWAY", "loc" : [ -74.029043, 43.021693 ], "pop" : 3988, "state" : "NY" } +{ "_id" : "12075", "city" : "GHENT", "loc" : [ -73.64864, 42.303637 ], "pop" : 2381, "state" : "NY" } +{ "_id" : "12076", "city" : "GILBOA", "loc" : [ -74.40027499999999, 42.410835 ], "pop" : 1400, "state" : "NY" } +{ "_id" : "12077", "city" : "GLENMONT", "loc" : [ -73.795884, 42.597147 ], "pop" : 4298, "state" : "NY" } +{ "_id" : "12078", "city" : "GLOVERSVILLE", "loc" : [ -74.337526, 43.061603 ], "pop" : 25292, "state" : "NY" } +{ "_id" : "12083", "city" : "GREENVILLE", "loc" : [ -74.022222, 42.411342 ], "pop" : 3645, "state" : "NY" } +{ "_id" : "12084", "city" : "GUILDERLAND", "loc" : [ -73.897454, 42.697273 ], "pop" : 4112, "state" : "NY" } +{ "_id" : "12086", "city" : "HAGAMAN", "loc" : [ -74.166764, 42.959715 ], "pop" : 114, "state" : "NY" } +{ "_id" : "12087", "city" : "HANNACROIX", "loc" : [ -73.86802900000001, 42.428533 ], "pop" : 1665, "state" : "NY" } +{ "_id" : "12090", "city" : "HOOSICK FALLS", "loc" : [ -73.35810499999999, 42.893712 ], "pop" : 5910, "state" : "NY" } +{ "_id" : "12092", "city" : "HOWES CAVE", "loc" : [ -74.364825, 42.704526 ], "pop" : 2351, "state" : "NY" } +{ "_id" : "12093", "city" : "JEFFERSON", "loc" : [ -74.611744, 42.499869 ], "pop" : 1353, "state" : "NY" } +{ "_id" : "12094", "city" : "JOHNSONVILLE", "loc" : [ -73.49889899999999, 42.876875 ], "pop" : 2010, "state" : "NY" } +{ "_id" : "12095", "city" : "JOHNSTOWN", "loc" : [ -74.37148999999999, 43.006923 ], "pop" : 13170, "state" : "NY" } +{ "_id" : "12106", "city" : "KINDERHOOK", "loc" : [ -73.718259, 42.376675 ], "pop" : 2795, "state" : "NY" } +{ "_id" : "12108", "city" : "LAKE PLEASANT", "loc" : [ -74.422563, 43.472543 ], "pop" : 487, "state" : "NY" } +{ "_id" : "12110", "city" : "LATHAM", "loc" : [ -73.762985, 42.74616 ], "pop" : 20091, "state" : "NY" } +{ "_id" : "12113", "city" : "LAWYERSVILLE", "loc" : [ -74.506969, 42.692682 ], "pop" : 91, "state" : "NY" } +{ "_id" : "12115", "city" : "MALDEN BRIDGE", "loc" : [ -73.587958, 42.460201 ], "pop" : 56, "state" : "NY" } +{ "_id" : "12116", "city" : "MARYLAND", "loc" : [ -74.90303299999999, 42.537075 ], "pop" : 871, "state" : "NY" } +{ "_id" : "12117", "city" : "MAYFIELD", "loc" : [ -74.24439700000001, 43.141133 ], "pop" : 3046, "state" : "NY" } +{ "_id" : "12118", "city" : "MECHANICVILLE", "loc" : [ -73.67317300000001, 42.967613 ], "pop" : 5890, "state" : "NY" } +{ "_id" : "12120", "city" : "MEDUSA", "loc" : [ -74.131524, 42.451504 ], "pop" : 617, "state" : "NY" } +{ "_id" : "12121", "city" : "MELROSE", "loc" : [ -73.60766700000001, 42.841163 ], "pop" : 1968, "state" : "NY" } +{ "_id" : "12122", "city" : "MIDDLEBURGH", "loc" : [ -74.329168, 42.563734 ], "pop" : 4005, "state" : "NY" } +{ "_id" : "12123", "city" : "NASSAU", "loc" : [ -73.61175299999999, 42.527141 ], "pop" : 5560, "state" : "NY" } +{ "_id" : "12125", "city" : "NEW LEBANON", "loc" : [ -73.377295, 42.475865 ], "pop" : 557, "state" : "NY" } +{ "_id" : "12130", "city" : "NIVERVILLE", "loc" : [ -73.485614, 42.927575 ], "pop" : 300, "state" : "NY" } +{ "_id" : "12131", "city" : "NORTH BLENHEIM", "loc" : [ -74.428174, 42.489938 ], "pop" : 50, "state" : "NY" } +{ "_id" : "12134", "city" : "EDINBURG", "loc" : [ -74.168361, 43.237126 ], "pop" : 3216, "state" : "NY" } +{ "_id" : "12135", "city" : "NORTON HILL", "loc" : [ -74.078945, 42.420014 ], "pop" : 163, "state" : "NY" } +{ "_id" : "12136", "city" : "OLD CHATHAM", "loc" : [ -73.55446999999999, 42.435692 ], "pop" : 1037, "state" : "NY" } +{ "_id" : "12137", "city" : "PATTERSONVILLE", "loc" : [ -74.123126, 42.84995 ], "pop" : 1423, "state" : "NY" } +{ "_id" : "12138", "city" : "TACONIC LAKE", "loc" : [ -73.371033, 42.736367 ], "pop" : 3891, "state" : "NY" } +{ "_id" : "12139", "city" : "PISECO", "loc" : [ -74.52628199999999, 43.448125 ], "pop" : 223, "state" : "NY" } +{ "_id" : "12140", "city" : "POESTENKILL", "loc" : [ -73.588846, 42.679548 ], "pop" : 1904, "state" : "NY" } +{ "_id" : "12143", "city" : "RAVENA", "loc" : [ -73.821991, 42.475371 ], "pop" : 5976, "state" : "NY" } +{ "_id" : "12144", "city" : "RENSSELAER", "loc" : [ -73.721895, 42.635855 ], "pop" : 19146, "state" : "NY" } +{ "_id" : "12147", "city" : "RENSSELAERVILLE", "loc" : [ -74.147431, 42.513288 ], "pop" : 547, "state" : "NY" } +{ "_id" : "12148", "city" : "REXFORD", "loc" : [ -73.87009999999999, 42.852411 ], "pop" : 2306, "state" : "NY" } +{ "_id" : "12149", "city" : "RICHMONDVILLE", "loc" : [ -74.571001, 42.642445 ], "pop" : 1502, "state" : "NY" } +{ "_id" : "12150", "city" : "ROTTERDAM JUNCTI", "loc" : [ -74.046857, 42.87296 ], "pop" : 1128, "state" : "NY" } +{ "_id" : "12151", "city" : "ROUND LAKE", "loc" : [ -73.770127, 42.925994 ], "pop" : 451, "state" : "NY" } +{ "_id" : "12153", "city" : "SAND LAKE", "loc" : [ -73.498949, 42.637912 ], "pop" : 851, "state" : "NY" } +{ "_id" : "12154", "city" : "SCHAGHTICOKE", "loc" : [ -73.61542799999999, 42.914356 ], "pop" : 3035, "state" : "NY" } +{ "_id" : "12155", "city" : "SCHENEVUS", "loc" : [ -74.814863, 42.59004 ], "pop" : 1895, "state" : "NY" } +{ "_id" : "12156", "city" : "SCHODACK LANDING", "loc" : [ -73.747996, 42.481644 ], "pop" : 902, "state" : "NY" } +{ "_id" : "12157", "city" : "SCHOHARIE", "loc" : [ -74.30473000000001, 42.661503 ], "pop" : 4095, "state" : "NY" } +{ "_id" : "12158", "city" : "SELKIRK", "loc" : [ -73.81286299999999, 42.54861 ], "pop" : 6062, "state" : "NY" } +{ "_id" : "12159", "city" : "SLINGERLANDS", "loc" : [ -73.871065, 42.648461 ], "pop" : 5431, "state" : "NY" } +{ "_id" : "12160", "city" : "SLOANSVILLE", "loc" : [ -74.36417400000001, 42.759852 ], "pop" : 1152, "state" : "NY" } +{ "_id" : "12164", "city" : "SPECULATOR", "loc" : [ -74.36667, 43.504159 ], "pop" : 400, "state" : "NY" } +{ "_id" : "12165", "city" : "SPENCERTOWN", "loc" : [ -73.500754, 42.30908 ], "pop" : 127, "state" : "NY" } +{ "_id" : "12166", "city" : "SPRAKERS", "loc" : [ -74.453558, 42.848446 ], "pop" : 1608, "state" : "NY" } +{ "_id" : "12167", "city" : "STAMFORD", "loc" : [ -74.609831, 42.417409 ], "pop" : 2734, "state" : "NY" } +{ "_id" : "12168", "city" : "STEPHENTOWN", "loc" : [ -73.42244700000001, 42.523323 ], "pop" : 1036, "state" : "NY" } +{ "_id" : "12169", "city" : "STEPHENTOWN", "loc" : [ -73.37496400000001, 42.556224 ], "pop" : 1566, "state" : "NY" } +{ "_id" : "12170", "city" : "STILLWATER", "loc" : [ -73.697163, 42.905652 ], "pop" : 9226, "state" : "NY" } +{ "_id" : "12173", "city" : "STUYVESANT", "loc" : [ -73.761329, 42.359572 ], "pop" : 1806, "state" : "NY" } +{ "_id" : "12175", "city" : "SUMMIT", "loc" : [ -74.574952, 42.587122 ], "pop" : 1247, "state" : "NY" } +{ "_id" : "12176", "city" : "SURPRISE", "loc" : [ -73.95154100000001, 42.361171 ], "pop" : 162, "state" : "NY" } +{ "_id" : "12180", "city" : "TROY", "loc" : [ -73.668263, 42.728748 ], "pop" : 56849, "state" : "NY" } +{ "_id" : "12182", "city" : "TROY", "loc" : [ -73.664806, 42.782921 ], "pop" : 14688, "state" : "NY" } +{ "_id" : "12183", "city" : "GREEN ISLAND", "loc" : [ -73.693707, 42.743812 ], "pop" : 2432, "state" : "NY" } +{ "_id" : "12184", "city" : "VALATIE", "loc" : [ -73.668322, 42.432051 ], "pop" : 8072, "state" : "NY" } +{ "_id" : "12185", "city" : "VALLEY FALLS", "loc" : [ -73.543674, 42.885458 ], "pop" : 1835, "state" : "NY" } +{ "_id" : "12186", "city" : "VOORHEESVILLE", "loc" : [ -73.944773, 42.643108 ], "pop" : 7069, "state" : "NY" } +{ "_id" : "12187", "city" : "WARNERVILLE", "loc" : [ -74.48704600000001, 42.638826 ], "pop" : 782, "state" : "NY" } +{ "_id" : "12188", "city" : "WATERFORD", "loc" : [ -73.69948100000001, 42.809957 ], "pop" : 11576, "state" : "NY" } +{ "_id" : "12189", "city" : "WATERVLIET", "loc" : [ -73.71234200000001, 42.729843 ], "pop" : 16509, "state" : "NY" } +{ "_id" : "12190", "city" : "WELLS", "loc" : [ -74.288583, 43.401219 ], "pop" : 706, "state" : "NY" } +{ "_id" : "12192", "city" : "WEST COXSACKIE", "loc" : [ -73.817033, 42.415055 ], "pop" : 1982, "state" : "NY" } +{ "_id" : "12193", "city" : "WESTERLO", "loc" : [ -74.039383, 42.515621 ], "pop" : 1880, "state" : "NY" } +{ "_id" : "12194", "city" : "WEST FULTON", "loc" : [ -74.463105, 42.550615 ], "pop" : 72, "state" : "NY" } +{ "_id" : "12196", "city" : "WEST SAND LAKE", "loc" : [ -73.610896, 42.637969 ], "pop" : 2511, "state" : "NY" } +{ "_id" : "12197", "city" : "WORCESTER", "loc" : [ -74.72992000000001, 42.604889 ], "pop" : 2239, "state" : "NY" } +{ "_id" : "12198", "city" : "WYNANTSKILL", "loc" : [ -73.63826, 42.687785 ], "pop" : 6192, "state" : "NY" } +{ "_id" : "12202", "city" : "ALBANY", "loc" : [ -73.764071, 42.641314 ], "pop" : 11097, "state" : "NY" } +{ "_id" : "12203", "city" : "MC KOWNVILLE", "loc" : [ -73.821988, 42.676757 ], "pop" : 33356, "state" : "NY" } +{ "_id" : "12204", "city" : "ALBANY", "loc" : [ -73.735364, 42.684667 ], "pop" : 6927, "state" : "NY" } +{ "_id" : "12205", "city" : "ROESSLEVILLE", "loc" : [ -73.82017399999999, 42.713116 ], "pop" : 26008, "state" : "NY" } +{ "_id" : "12206", "city" : "ALBANY", "loc" : [ -73.774406, 42.668326 ], "pop" : 17230, "state" : "NY" } +{ "_id" : "12207", "city" : "ALBANY", "loc" : [ -73.75232699999999, 42.658133 ], "pop" : 2709, "state" : "NY" } +{ "_id" : "12208", "city" : "ALBANY", "loc" : [ -73.796357, 42.655989 ], "pop" : 22041, "state" : "NY" } +{ "_id" : "12209", "city" : "ALBANY", "loc" : [ -73.78538500000001, 42.641665 ], "pop" : 10008, "state" : "NY" } +{ "_id" : "12210", "city" : "ALBANY", "loc" : [ -73.76052, 42.65677 ], "pop" : 9374, "state" : "NY" } +{ "_id" : "12211", "city" : "LOUDONVILLE", "loc" : [ -73.769982, 42.704693 ], "pop" : 12283, "state" : "NY" } +{ "_id" : "12302", "city" : "MAYFAIR", "loc" : [ -73.955051, 42.858839 ], "pop" : 27516, "state" : "NY" } +{ "_id" : "12303", "city" : "ROTTERDAM", "loc" : [ -73.938776, 42.769645 ], "pop" : 28448, "state" : "NY" } +{ "_id" : "12304", "city" : "SCHENECTADY", "loc" : [ -73.909432, 42.784083 ], "pop" : 20431, "state" : "NY" } +{ "_id" : "12305", "city" : "SCHENECTADY", "loc" : [ -73.939786, 42.816131 ], "pop" : 6253, "state" : "NY" } +{ "_id" : "12306", "city" : "SCHENECTADY", "loc" : [ -73.98087599999999, 42.790384 ], "pop" : 23182, "state" : "NY" } +{ "_id" : "12307", "city" : "SCHENECTADY", "loc" : [ -73.93634900000001, 42.804653 ], "pop" : 8534, "state" : "NY" } +{ "_id" : "12308", "city" : "SCHENECTADY", "loc" : [ -73.920591, 42.817928 ], "pop" : 14055, "state" : "NY" } +{ "_id" : "12309", "city" : "NISKAYUNA", "loc" : [ -73.87826800000001, 42.796168 ], "pop" : 27928, "state" : "NY" } +{ "_id" : "12401", "city" : "EDDYVILLE", "loc" : [ -74.02357499999999, 41.930126 ], "pop" : 32883, "state" : "NY" } +{ "_id" : "12404", "city" : "ACCORD", "loc" : [ -74.235336, 41.808308 ], "pop" : 2695, "state" : "NY" } +{ "_id" : "12405", "city" : "ACRA", "loc" : [ -74.085723, 42.330367 ], "pop" : 525, "state" : "NY" } +{ "_id" : "12406", "city" : "ARKVILLE", "loc" : [ -74.554453, 42.082262 ], "pop" : 141, "state" : "NY" } +{ "_id" : "12407", "city" : "ASHLAND", "loc" : [ -74.307925, 42.237174 ], "pop" : 28, "state" : "NY" } +{ "_id" : "12409", "city" : "SHADY", "loc" : [ -74.17129799999999, 42.041991 ], "pop" : 960, "state" : "NY" } +{ "_id" : "12410", "city" : "OLIVEREA", "loc" : [ -74.44665500000001, 42.143884 ], "pop" : 69, "state" : "NY" } +{ "_id" : "12411", "city" : "BLOOMINGTON", "loc" : [ -74.066889, 41.856165 ], "pop" : 148, "state" : "NY" } +{ "_id" : "12412", "city" : "BOICEVILLE", "loc" : [ -74.26580800000001, 42.004761 ], "pop" : 556, "state" : "NY" } +{ "_id" : "12413", "city" : "CAIRO", "loc" : [ -74.01154, 42.30965 ], "pop" : 3057, "state" : "NY" } +{ "_id" : "12414", "city" : "CATSKILL", "loc" : [ -73.89853599999999, 42.227598 ], "pop" : 12128, "state" : "NY" } +{ "_id" : "12416", "city" : "CHICHESTER", "loc" : [ -74.281565, 42.087965 ], "pop" : 642, "state" : "NY" } +{ "_id" : "12418", "city" : "CORNWALLVILLE", "loc" : [ -74.16309200000001, 42.362874 ], "pop" : 380, "state" : "NY" } +{ "_id" : "12419", "city" : "COTTEKILL", "loc" : [ -74.103774, 41.846706 ], "pop" : 399, "state" : "NY" } +{ "_id" : "12421", "city" : "DENVER", "loc" : [ -74.540654, 42.252204 ], "pop" : 62, "state" : "NY" } +{ "_id" : "12422", "city" : "DURHAM", "loc" : [ -74.184926, 42.402037 ], "pop" : 216, "state" : "NY" } +{ "_id" : "12423", "city" : "EAST DURHAM", "loc" : [ -74.11169, 42.385978 ], "pop" : 1097, "state" : "NY" } +{ "_id" : "12424", "city" : "EAST JEWETT", "loc" : [ -74.207981, 42.280567 ], "pop" : 241, "state" : "NY" } +{ "_id" : "12427", "city" : "ELKA PARK", "loc" : [ -74.124539, 42.164309 ], "pop" : 389, "state" : "NY" } +{ "_id" : "12428", "city" : "ELLENVILLE", "loc" : [ -74.414125, 41.721805 ], "pop" : 6902, "state" : "NY" } +{ "_id" : "12430", "city" : "HALCOTT CENTER", "loc" : [ -74.531908, 42.178765 ], "pop" : 1151, "state" : "NY" } +{ "_id" : "12431", "city" : "FREEHOLD", "loc" : [ -74.06226599999999, 42.3815 ], "pop" : 255, "state" : "NY" } +{ "_id" : "12433", "city" : "GLENFORD", "loc" : [ -74.153154, 42.005342 ], "pop" : 354, "state" : "NY" } +{ "_id" : "12434", "city" : "GRAND GORGE", "loc" : [ -74.531173, 42.387358 ], "pop" : 13, "state" : "NY" } +{ "_id" : "12435", "city" : "GREENFIELD PARK", "loc" : [ -74.52007399999999, 41.728133 ], "pop" : 241, "state" : "NY" } +{ "_id" : "12439", "city" : "EAST WINDHAM", "loc" : [ -74.21306300000001, 42.259032 ], "pop" : 57, "state" : "NY" } +{ "_id" : "12440", "city" : "HIGH FALLS", "loc" : [ -74.131122, 41.816749 ], "pop" : 2168, "state" : "NY" } +{ "_id" : "12442", "city" : "HUNTER", "loc" : [ -74.20375300000001, 42.237316 ], "pop" : 616, "state" : "NY" } +{ "_id" : "12443", "city" : "HURLEY", "loc" : [ -74.06873, 41.932743 ], "pop" : 1229, "state" : "NY" } +{ "_id" : "12444", "city" : "JEWETT", "loc" : [ -74.279274, 42.269383 ], "pop" : 231, "state" : "NY" } +{ "_id" : "12446", "city" : "KERHONKSON", "loc" : [ -74.30345699999999, 41.793866 ], "pop" : 4220, "state" : "NY" } +{ "_id" : "12448", "city" : "LAKE HILL", "loc" : [ -74.212338, 42.073271 ], "pop" : 73, "state" : "NY" } +{ "_id" : "12449", "city" : "LAKE KATRINE", "loc" : [ -73.992379, 41.991787 ], "pop" : 3763, "state" : "NY" } +{ "_id" : "12450", "city" : "LANESVILLE", "loc" : [ -74.19714999999999, 42.189149 ], "pop" : 1131, "state" : "NY" } +{ "_id" : "12451", "city" : "LEEDS", "loc" : [ -73.94572599999999, 42.304506 ], "pop" : 779, "state" : "NY" } +{ "_id" : "12454", "city" : "MAPLECREST", "loc" : [ -74.165522, 42.299485 ], "pop" : 342, "state" : "NY" } +{ "_id" : "12455", "city" : "KELLY CORNERS", "loc" : [ -74.648853, 42.163702 ], "pop" : 2756, "state" : "NY" } +{ "_id" : "12456", "city" : "MOUNT MARION", "loc" : [ -74.00021099999999, 42.035704 ], "pop" : 753, "state" : "NY" } +{ "_id" : "12457", "city" : "MOUNT TREMPER", "loc" : [ -74.248481, 42.043545 ], "pop" : 941, "state" : "NY" } +{ "_id" : "12458", "city" : "NAPANOCH", "loc" : [ -74.380354, 41.758965 ], "pop" : 3502, "state" : "NY" } +{ "_id" : "12460", "city" : "OAK HILL", "loc" : [ -74.152832, 42.406902 ], "pop" : 294, "state" : "NY" } +{ "_id" : "12461", "city" : "KRUMVILLE", "loc" : [ -74.246954, 41.895906 ], "pop" : 1423, "state" : "NY" } +{ "_id" : "12463", "city" : "PALENVILLE", "loc" : [ -74.01667399999999, 42.17294 ], "pop" : 1195, "state" : "NY" } +{ "_id" : "12464", "city" : "PHOENICIA", "loc" : [ -74.33932799999999, 42.054426 ], "pop" : 966, "state" : "NY" } +{ "_id" : "12465", "city" : "PINE HILL", "loc" : [ -74.487562, 42.133974 ], "pop" : 392, "state" : "NY" } +{ "_id" : "12466", "city" : "PORT EWEN", "loc" : [ -73.987161, 41.913113 ], "pop" : 7283, "state" : "NY" } +{ "_id" : "12468", "city" : "PRATTSVILLE", "loc" : [ -74.38950199999999, 42.297904 ], "pop" : 1669, "state" : "NY" } +{ "_id" : "12469", "city" : "PRESTON HOLLOW", "loc" : [ -74.24199, 42.456348 ], "pop" : 421, "state" : "NY" } +{ "_id" : "12470", "city" : "PURLING", "loc" : [ -74.01138, 42.275497 ], "pop" : 516, "state" : "NY" } +{ "_id" : "12472", "city" : "ROSENDALE", "loc" : [ -74.072999, 41.840248 ], "pop" : 2939, "state" : "NY" } +{ "_id" : "12473", "city" : "ROUND TOP", "loc" : [ -74.052279, 42.267782 ], "pop" : 454, "state" : "NY" } +{ "_id" : "12474", "city" : "ROXBURY", "loc" : [ -74.540519, 42.311688 ], "pop" : 2178, "state" : "NY" } +{ "_id" : "12477", "city" : "SAUGERTIES", "loc" : [ -73.97968400000001, 42.07376 ], "pop" : 18932, "state" : "NY" } +{ "_id" : "12480", "city" : "SHANDAKEN", "loc" : [ -74.40908399999999, 42.108353 ], "pop" : 593, "state" : "NY" } +{ "_id" : "12481", "city" : "SHOKAN", "loc" : [ -74.21194300000001, 41.976678 ], "pop" : 1494, "state" : "NY" } +{ "_id" : "12482", "city" : "SOUTH CAIRO", "loc" : [ -73.963982, 42.27338 ], "pop" : 360, "state" : "NY" } +{ "_id" : "12484", "city" : "STONE RIDGE", "loc" : [ -74.169748, 41.861562 ], "pop" : 2389, "state" : "NY" } +{ "_id" : "12485", "city" : "TANNERSVILLE", "loc" : [ -74.10144099999999, 42.203179 ], "pop" : 492, "state" : "NY" } +{ "_id" : "12486", "city" : "TILLSON", "loc" : [ -74.072219, 41.816279 ], "pop" : 377, "state" : "NY" } +{ "_id" : "12487", "city" : "ULSTER PARK", "loc" : [ -73.994843, 41.865109 ], "pop" : 3625, "state" : "NY" } +{ "_id" : "12491", "city" : "WEST HURLEY", "loc" : [ -74.11523200000001, 41.990816 ], "pop" : 2365, "state" : "NY" } +{ "_id" : "12492", "city" : "WEST KILL", "loc" : [ -74.361994, 42.204584 ], "pop" : 413, "state" : "NY" } +{ "_id" : "12494", "city" : "WEST SHOKAN", "loc" : [ -74.285117, 41.955478 ], "pop" : 809, "state" : "NY" } +{ "_id" : "12495", "city" : "WILLOW", "loc" : [ -74.20253700000001, 42.092318 ], "pop" : 145, "state" : "NY" } +{ "_id" : "12496", "city" : "WINDHAM", "loc" : [ -74.262017, 42.317465 ], "pop" : 1559, "state" : "NY" } +{ "_id" : "12498", "city" : "WOODSTOCK", "loc" : [ -74.111974, 42.034793 ], "pop" : 4827, "state" : "NY" } +{ "_id" : "12501", "city" : "AMENIA", "loc" : [ -73.554158, 41.844695 ], "pop" : 2325, "state" : "NY" } +{ "_id" : "12502", "city" : "ANCRAM", "loc" : [ -73.642368, 42.085093 ], "pop" : 600, "state" : "NY" } +{ "_id" : "12503", "city" : "ANCRAMDALE", "loc" : [ -73.58187, 42.038103 ], "pop" : 918, "state" : "NY" } +{ "_id" : "12507", "city" : "BARRYTOWN", "loc" : [ -73.92148400000001, 42.0006 ], "pop" : 388, "state" : "NY" } +{ "_id" : "12508", "city" : "BEACON", "loc" : [ -73.963384, 41.509681 ], "pop" : 20022, "state" : "NY" } +{ "_id" : "12513", "city" : "CLAVERACK", "loc" : [ -73.72284399999999, 42.2183 ], "pop" : 447, "state" : "NY" } +{ "_id" : "12514", "city" : "CLINTON CORNERS", "loc" : [ -73.765867, 41.869262 ], "pop" : 2667, "state" : "NY" } +{ "_id" : "12515", "city" : "CLINTONDALE", "loc" : [ -74.055713, 41.674939 ], "pop" : 1171, "state" : "NY" } +{ "_id" : "12516", "city" : "COPAKE", "loc" : [ -73.552588, 42.111329 ], "pop" : 1511, "state" : "NY" } +{ "_id" : "12517", "city" : "COPAKE FALLS", "loc" : [ -73.510773, 42.136737 ], "pop" : 163, "state" : "NY" } +{ "_id" : "12518", "city" : "CORNWALL", "loc" : [ -74.053877, 41.430944 ], "pop" : 8120, "state" : "NY" } +{ "_id" : "12520", "city" : "CORNWALL ON HUDS", "loc" : [ -74.01641100000001, 41.443031 ], "pop" : 2980, "state" : "NY" } +{ "_id" : "12521", "city" : "CRARYVILLE", "loc" : [ -73.657128, 42.175961 ], "pop" : 1377, "state" : "NY" } +{ "_id" : "12522", "city" : "DOVER PLAINS", "loc" : [ -73.587024, 41.735054 ], "pop" : 4775, "state" : "NY" } +{ "_id" : "12523", "city" : "ELIZAVILLE", "loc" : [ -73.781814, 42.090173 ], "pop" : 2158, "state" : "NY" } +{ "_id" : "12524", "city" : "FISHKILL", "loc" : [ -73.89791, 41.540352 ], "pop" : 11165, "state" : "NY" } +{ "_id" : "12525", "city" : "GARDINER", "loc" : [ -74.16715499999999, 41.657615 ], "pop" : 3900, "state" : "NY" } +{ "_id" : "12526", "city" : "GERMANTOWN", "loc" : [ -73.86245099999999, 42.1219 ], "pop" : 4061, "state" : "NY" } +{ "_id" : "12528", "city" : "HIGHLAND", "loc" : [ -73.992825, 41.716691 ], "pop" : 11011, "state" : "NY" } +{ "_id" : "12529", "city" : "HILLSDALE", "loc" : [ -73.548306, 42.186816 ], "pop" : 3084, "state" : "NY" } +{ "_id" : "12531", "city" : "HOLMES", "loc" : [ -73.662751, 41.532461 ], "pop" : 3248, "state" : "NY" } +{ "_id" : "12533", "city" : "HOPEWELL JUNCTIO", "loc" : [ -73.79758099999999, 41.576639 ], "pop" : 18770, "state" : "NY" } +{ "_id" : "12534", "city" : "HUDSON", "loc" : [ -73.75524799999999, 42.246978 ], "pop" : 21205, "state" : "NY" } +{ "_id" : "12538", "city" : "HYDE PARK", "loc" : [ -73.906347, 41.788724 ], "pop" : 15184, "state" : "NY" } +{ "_id" : "12540", "city" : "LAGRANGEVILLE", "loc" : [ -73.744955, 41.661471 ], "pop" : 5539, "state" : "NY" } +{ "_id" : "12542", "city" : "MARLBORO", "loc" : [ -73.988017, 41.605612 ], "pop" : 4489, "state" : "NY" } +{ "_id" : "12543", "city" : "MAYBROOK", "loc" : [ -74.216312, 41.48865 ], "pop" : 2860, "state" : "NY" } +{ "_id" : "12545", "city" : "MILLBROOK", "loc" : [ -73.688491, 41.780334 ], "pop" : 4503, "state" : "NY" } +{ "_id" : "12546", "city" : "MILLERTON", "loc" : [ -73.52870900000001, 41.953623 ], "pop" : 3131, "state" : "NY" } +{ "_id" : "12547", "city" : "MILTON", "loc" : [ -73.977194, 41.653487 ], "pop" : 2834, "state" : "NY" } +{ "_id" : "12548", "city" : "MODENA", "loc" : [ -74.103578, 41.650347 ], "pop" : 810, "state" : "NY" } +{ "_id" : "12549", "city" : "MONTGOMERY", "loc" : [ -74.253417, 41.53332 ], "pop" : 7421, "state" : "NY" } +{ "_id" : "12550", "city" : "MIDDLE HOPE", "loc" : [ -74.03598, 41.517833 ], "pop" : 47939, "state" : "NY" } +{ "_id" : "12553", "city" : "NEW WINDSOR", "loc" : [ -74.056596, 41.472374 ], "pop" : 20576, "state" : "NY" } +{ "_id" : "12561", "city" : "MOHONK LAKE", "loc" : [ -74.08387500000001, 41.743346 ], "pop" : 16394, "state" : "NY" } +{ "_id" : "12563", "city" : "PATTERSON", "loc" : [ -73.58149, 41.488761 ], "pop" : 6107, "state" : "NY" } +{ "_id" : "12564", "city" : "PAWLING", "loc" : [ -73.594847, 41.574893 ], "pop" : 4511, "state" : "NY" } +{ "_id" : "12566", "city" : "PINE BUSH", "loc" : [ -74.326311, 41.617758 ], "pop" : 7589, "state" : "NY" } +{ "_id" : "12567", "city" : "PINE PLAINS", "loc" : [ -73.66022700000001, 41.989569 ], "pop" : 2771, "state" : "NY" } +{ "_id" : "12569", "city" : "PLEASANT VALLEY", "loc" : [ -73.81427600000001, 41.747032 ], "pop" : 7978, "state" : "NY" } +{ "_id" : "12570", "city" : "POUGHQUAG", "loc" : [ -73.67832799999999, 41.61936 ], "pop" : 3867, "state" : "NY" } +{ "_id" : "12571", "city" : "RED HOOK", "loc" : [ -73.85457700000001, 42.006439 ], "pop" : 8890, "state" : "NY" } +{ "_id" : "12572", "city" : "RHINEBECK", "loc" : [ -73.88875400000001, 41.927206 ], "pop" : 9458, "state" : "NY" } +{ "_id" : "12575", "city" : "ROCK TAVERN", "loc" : [ -74.16588, 41.457523 ], "pop" : 2202, "state" : "NY" } +{ "_id" : "12577", "city" : "SALISBURY MILLS", "loc" : [ -74.12137800000001, 41.449714 ], "pop" : 573, "state" : "NY" } +{ "_id" : "12578", "city" : "SALT POINT", "loc" : [ -73.801329, 41.805041 ], "pop" : 1521, "state" : "NY" } +{ "_id" : "12580", "city" : "STAATSBURG", "loc" : [ -73.898838, 41.850193 ], "pop" : 2957, "state" : "NY" } +{ "_id" : "12581", "city" : "STANFORDVILLE", "loc" : [ -73.694467, 41.887726 ], "pop" : 2356, "state" : "NY" } +{ "_id" : "12582", "city" : "STORMVILLE", "loc" : [ -73.725548, 41.551193 ], "pop" : 6735, "state" : "NY" } +{ "_id" : "12583", "city" : "TIVOLI", "loc" : [ -73.902514, 42.057945 ], "pop" : 1614, "state" : "NY" } +{ "_id" : "12585", "city" : "VERBANK", "loc" : [ -73.71841000000001, 41.722664 ], "pop" : 989, "state" : "NY" } +{ "_id" : "12586", "city" : "WALDEN", "loc" : [ -74.176395, 41.559631 ], "pop" : 10479, "state" : "NY" } +{ "_id" : "12589", "city" : "WALLKILL", "loc" : [ -74.14385299999999, 41.615952 ], "pop" : 11209, "state" : "NY" } +{ "_id" : "12590", "city" : "NEW HAMBURG", "loc" : [ -73.89058799999999, 41.592199 ], "pop" : 31950, "state" : "NY" } +{ "_id" : "12592", "city" : "WASSAIC", "loc" : [ -73.554382, 41.775884 ], "pop" : 2064, "state" : "NY" } +{ "_id" : "12594", "city" : "WINGDALE", "loc" : [ -73.555621, 41.653824 ], "pop" : 3716, "state" : "NY" } +{ "_id" : "12601", "city" : "SOUTH ROAD", "loc" : [ -73.9218, 41.702082 ], "pop" : 38212, "state" : "NY" } +{ "_id" : "12603", "city" : "ARLINGTON", "loc" : [ -73.885217, 41.676775 ], "pop" : 40724, "state" : "NY" } +{ "_id" : "12701", "city" : "MONTICELLO", "loc" : [ -74.700748, 41.65158 ], "pop" : 12122, "state" : "NY" } +{ "_id" : "12719", "city" : "BARRYVILLE", "loc" : [ -74.915234, 41.491162 ], "pop" : 772, "state" : "NY" } +{ "_id" : "12720", "city" : "BETHEL", "loc" : [ -74.893984, 41.669326 ], "pop" : 139, "state" : "NY" } +{ "_id" : "12721", "city" : "BLOOMINGBURG", "loc" : [ -74.430351, 41.564427 ], "pop" : 6139, "state" : "NY" } +{ "_id" : "12723", "city" : "CALLICOON", "loc" : [ -75.025688, 41.7754 ], "pop" : 2492, "state" : "NY" } +{ "_id" : "12725", "city" : "CLARYVILLE", "loc" : [ -74.529287, 41.965666 ], "pop" : 137, "state" : "NY" } +{ "_id" : "12726", "city" : "FOSTERDALE", "loc" : [ -74.980687, 41.698208 ], "pop" : 1120, "state" : "NY" } +{ "_id" : "12727", "city" : "COCHECTON CENTER", "loc" : [ -74.977116, 41.645776 ], "pop" : 131, "state" : "NY" } +{ "_id" : "12729", "city" : "CUDDEBACKVILLE", "loc" : [ -74.59756400000001, 41.477601 ], "pop" : 1191, "state" : "NY" } +{ "_id" : "12732", "city" : "ELDRED", "loc" : [ -74.89676900000001, 41.532793 ], "pop" : 899, "state" : "NY" } +{ "_id" : "12733", "city" : "FALLSBURG", "loc" : [ -74.615409, 41.7273 ], "pop" : 866, "state" : "NY" } +{ "_id" : "12734", "city" : "GROSSINGER", "loc" : [ -74.754873, 41.730029 ], "pop" : 851, "state" : "NY" } +{ "_id" : "12736", "city" : "FREMONT CENTER", "loc" : [ -75.029635, 41.847134 ], "pop" : 349, "state" : "NY" } +{ "_id" : "12737", "city" : "GLEN SPEY", "loc" : [ -74.799493, 41.48576 ], "pop" : 840, "state" : "NY" } +{ "_id" : "12738", "city" : "GLEN WILD", "loc" : [ -74.58328899999999, 41.654536 ], "pop" : 158, "state" : "NY" } +{ "_id" : "12739", "city" : "GODEFFROY", "loc" : [ -74.605716, 41.442347 ], "pop" : 615, "state" : "NY" } +{ "_id" : "12740", "city" : "GRAHAMSVILLE", "loc" : [ -74.512697, 41.880659 ], "pop" : 1305, "state" : "NY" } +{ "_id" : "12741", "city" : "MILESES", "loc" : [ -75.09980899999999, 41.831288 ], "pop" : 73, "state" : "NY" } +{ "_id" : "12742", "city" : "HARRIS", "loc" : [ -74.7218, 41.714055 ], "pop" : 272, "state" : "NY" } +{ "_id" : "12743", "city" : "HIGHLAND LAKE", "loc" : [ -74.851615, 41.530925 ], "pop" : 292, "state" : "NY" } +{ "_id" : "12745", "city" : "HORTONVILLE", "loc" : [ -75.026329, 41.78568 ], "pop" : 59, "state" : "NY" } +{ "_id" : "12746", "city" : "HUGUENOT", "loc" : [ -74.64261, 41.437162 ], "pop" : 885, "state" : "NY" } +{ "_id" : "12747", "city" : "HURLEYVILLE", "loc" : [ -74.65344, 41.760882 ], "pop" : 3303, "state" : "NY" } +{ "_id" : "12748", "city" : "JEFFERSONVILLE", "loc" : [ -74.919574, 41.778394 ], "pop" : 1698, "state" : "NY" } +{ "_id" : "12750", "city" : "KENOZA LAKE", "loc" : [ -74.935384, 41.777802 ], "pop" : 443, "state" : "NY" } +{ "_id" : "12751", "city" : "KIAMESHA LAKE", "loc" : [ -74.67240200000001, 41.683825 ], "pop" : 320, "state" : "NY" } +{ "_id" : "12752", "city" : "LAKE HUNTINGTON", "loc" : [ -74.994933, 41.678158 ], "pop" : 111, "state" : "NY" } +{ "_id" : "12753", "city" : "LEW BEACH", "loc" : [ -74.728835, 42.015762 ], "pop" : 126, "state" : "NY" } +{ "_id" : "12754", "city" : "LIBERTY", "loc" : [ -74.748397, 41.79618 ], "pop" : 7361, "state" : "NY" } +{ "_id" : "12758", "city" : "LIVINGSTON MANOR", "loc" : [ -74.827028, 41.87779 ], "pop" : 4510, "state" : "NY" } +{ "_id" : "12759", "city" : "LOCH SHELDRAKE", "loc" : [ -74.661406, 41.778899 ], "pop" : 466, "state" : "NY" } +{ "_id" : "12760", "city" : "LONG EDDY", "loc" : [ -75.094157, 41.864359 ], "pop" : 279, "state" : "NY" } +{ "_id" : "12762", "city" : "MONGAUP VALLEY", "loc" : [ -74.802772, 41.681017 ], "pop" : 228, "state" : "NY" } +{ "_id" : "12763", "city" : "MOUNTAIN DALE", "loc" : [ -74.53576200000001, 41.691763 ], "pop" : 841, "state" : "NY" } +{ "_id" : "12764", "city" : "NARROWSBURG", "loc" : [ -75.010687, 41.592108 ], "pop" : 1576, "state" : "NY" } +{ "_id" : "12765", "city" : "NEVERSINK", "loc" : [ -74.61272599999999, 41.849205 ], "pop" : 868, "state" : "NY" } +{ "_id" : "12766", "city" : "NORTH BRANCH", "loc" : [ -74.982388, 41.814184 ], "pop" : 409, "state" : "NY" } +{ "_id" : "12768", "city" : "PARKSVILLE", "loc" : [ -74.735933, 41.851686 ], "pop" : 1199, "state" : "NY" } +{ "_id" : "12770", "city" : "POND EDDY", "loc" : [ -74.84102900000001, 41.451068 ], "pop" : 448, "state" : "NY" } +{ "_id" : "12771", "city" : "PORT JERVIS", "loc" : [ -74.66909699999999, 41.378557 ], "pop" : 14959, "state" : "NY" } +{ "_id" : "12775", "city" : "ROCK HILL", "loc" : [ -74.58722299999999, 41.613351 ], "pop" : 1027, "state" : "NY" } +{ "_id" : "12776", "city" : "COOK FALLS", "loc" : [ -74.923704, 41.945774 ], "pop" : 2737, "state" : "NY" } +{ "_id" : "12777", "city" : "FORESTBURGH", "loc" : [ -74.724087, 41.569093 ], "pop" : 581, "state" : "NY" } +{ "_id" : "12779", "city" : "SOUTH FALLSBURG", "loc" : [ -74.644401, 41.704192 ], "pop" : 1838, "state" : "NY" } +{ "_id" : "12780", "city" : "SPARROWBUSH", "loc" : [ -74.723647, 41.435886 ], "pop" : 1527, "state" : "NY" } +{ "_id" : "12782", "city" : "SUNDOWN", "loc" : [ -74.550838, 41.823822 ], "pop" : 635, "state" : "NY" } +{ "_id" : "12783", "city" : "SWAN LAKE", "loc" : [ -74.834092, 41.728479 ], "pop" : 1707, "state" : "NY" } +{ "_id" : "12786", "city" : "WHITE LAKE", "loc" : [ -74.865437, 41.648498 ], "pop" : 178, "state" : "NY" } +{ "_id" : "12787", "city" : "WHITE SULPHUR SP", "loc" : [ -74.828065, 41.790042 ], "pop" : 161, "state" : "NY" } +{ "_id" : "12788", "city" : "WOODBOURNE", "loc" : [ -74.592828, 41.770807 ], "pop" : 2561, "state" : "NY" } +{ "_id" : "12789", "city" : "WOODRIDGE", "loc" : [ -74.581518, 41.716955 ], "pop" : 2047, "state" : "NY" } +{ "_id" : "12790", "city" : "WURTSBORO", "loc" : [ -74.503891, 41.587667 ], "pop" : 4589, "state" : "NY" } +{ "_id" : "12791", "city" : "YOUNGSVILLE", "loc" : [ -74.88877599999999, 41.803238 ], "pop" : 115, "state" : "NY" } +{ "_id" : "12792", "city" : "YULAN", "loc" : [ -74.926224, 41.538378 ], "pop" : 107, "state" : "NY" } +{ "_id" : "12801", "city" : "QUEENSBURY", "loc" : [ -73.648816, 43.312539 ], "pop" : 15023, "state" : "NY" } +{ "_id" : "12803", "city" : "SOUTH GLENS FALL", "loc" : [ -73.637947, 43.283911 ], "pop" : 8758, "state" : "NY" } +{ "_id" : "12804", "city" : "QUEENSBURY", "loc" : [ -73.68184599999999, 43.328983 ], "pop" : 20993, "state" : "NY" } +{ "_id" : "12808", "city" : "ADIRONDACK", "loc" : [ -73.78248600000001, 43.716479 ], "pop" : 105, "state" : "NY" } +{ "_id" : "12809", "city" : "ARGYLE", "loc" : [ -73.46407600000001, 43.238084 ], "pop" : 2930, "state" : "NY" } +{ "_id" : "12810", "city" : "ATHOL", "loc" : [ -73.88169499999999, 43.483872 ], "pop" : 588, "state" : "NY" } +{ "_id" : "12812", "city" : "BLUE MOUNTAIN LA", "loc" : [ -74.42983099999999, 43.837499 ], "pop" : 234, "state" : "NY" } +{ "_id" : "12814", "city" : "BOLTON LANDING", "loc" : [ -73.671392, 43.576641 ], "pop" : 1298, "state" : "NY" } +{ "_id" : "12815", "city" : "BRANT LAKE", "loc" : [ -73.72045799999999, 43.698875 ], "pop" : 807, "state" : "NY" } +{ "_id" : "12816", "city" : "CAMBRIDGE", "loc" : [ -73.38137500000001, 43.046585 ], "pop" : 4243, "state" : "NY" } +{ "_id" : "12817", "city" : "CHESTERTOWN", "loc" : [ -73.806641, 43.645053 ], "pop" : 2141, "state" : "NY" } +{ "_id" : "12819", "city" : "CLEMONS", "loc" : [ -73.432613, 43.643544 ], "pop" : 169, "state" : "NY" } +{ "_id" : "12821", "city" : "COMSTOCK", "loc" : [ -73.360607, 43.456706 ], "pop" : 1226, "state" : "NY" } +{ "_id" : "12822", "city" : "CORINTH", "loc" : [ -73.836901, 43.242569 ], "pop" : 6492, "state" : "NY" } +{ "_id" : "12823", "city" : "COSSAYUNA", "loc" : [ -73.41237, 43.175059 ], "pop" : 241, "state" : "NY" } +{ "_id" : "12824", "city" : "DIAMOND POINT", "loc" : [ -73.700123, 43.515553 ], "pop" : 770, "state" : "NY" } +{ "_id" : "12826", "city" : "EAST GREENWICH", "loc" : [ -73.392425, 43.157918 ], "pop" : 116, "state" : "NY" } +{ "_id" : "12827", "city" : "FORT ANN", "loc" : [ -73.478381, 43.428457 ], "pop" : 6818, "state" : "NY" } +{ "_id" : "12828", "city" : "FORT EDWARD", "loc" : [ -73.58216899999999, 43.265321 ], "pop" : 5507, "state" : "NY" } +{ "_id" : "12831", "city" : "GANSEVOORT", "loc" : [ -73.70526700000001, 43.180343 ], "pop" : 14485, "state" : "NY" } +{ "_id" : "12832", "city" : "GRANVILLE", "loc" : [ -73.297825, 43.377562 ], "pop" : 6201, "state" : "NY" } +{ "_id" : "12833", "city" : "GREENFIELD CENTE", "loc" : [ -73.860193, 43.122488 ], "pop" : 4753, "state" : "NY" } +{ "_id" : "12834", "city" : "THOMSON", "loc" : [ -73.506658, 43.096183 ], "pop" : 6028, "state" : "NY" } +{ "_id" : "12835", "city" : "HADLEY", "loc" : [ -73.949905, 43.301268 ], "pop" : 1840, "state" : "NY" } +{ "_id" : "12836", "city" : "HAGUE", "loc" : [ -73.528172, 43.74631 ], "pop" : 692, "state" : "NY" } +{ "_id" : "12837", "city" : "HAMPTON", "loc" : [ -73.273072, 43.462135 ], "pop" : 419, "state" : "NY" } +{ "_id" : "12838", "city" : "HARTFORD", "loc" : [ -73.404946, 43.349281 ], "pop" : 679, "state" : "NY" } +{ "_id" : "12839", "city" : "HUDSON FALLS", "loc" : [ -73.574607, 43.314863 ], "pop" : 12866, "state" : "NY" } +{ "_id" : "12842", "city" : "INDIAN LAKE", "loc" : [ -74.27663800000001, 43.760594 ], "pop" : 1247, "state" : "NY" } +{ "_id" : "12843", "city" : "JOHNSBURG", "loc" : [ -74.021254, 43.634081 ], "pop" : 1437, "state" : "NY" } +{ "_id" : "12844", "city" : "PILOT KNOB", "loc" : [ -73.62988300000001, 43.515561 ], "pop" : 23, "state" : "NY" } +{ "_id" : "12845", "city" : "LAKE GEORGE", "loc" : [ -73.697547, 43.416725 ], "pop" : 4677, "state" : "NY" } +{ "_id" : "12846", "city" : "LAKE LUZERNE", "loc" : [ -73.822821, 43.316487 ], "pop" : 2816, "state" : "NY" } +{ "_id" : "12847", "city" : "LONG LAKE", "loc" : [ -74.46624300000001, 43.947653 ], "pop" : 930, "state" : "NY" } +{ "_id" : "12849", "city" : "MIDDLE GRANVILLE", "loc" : [ -73.303077, 43.450773 ], "pop" : 249, "state" : "NY" } +{ "_id" : "12850", "city" : "MIDDLE GROVE", "loc" : [ -74.016687, 43.097548 ], "pop" : 1760, "state" : "NY" } +{ "_id" : "12851", "city" : "MINERVA", "loc" : [ -73.983542, 43.781058 ], "pop" : 308, "state" : "NY" } +{ "_id" : "12852", "city" : "NEWCOMB", "loc" : [ -74.12991100000001, 43.945991 ], "pop" : 544, "state" : "NY" } +{ "_id" : "12853", "city" : "NORTH CREEK", "loc" : [ -73.892802, 43.713802 ], "pop" : 2447, "state" : "NY" } +{ "_id" : "12854", "city" : "NORTH GRANVILLE", "loc" : [ -73.33011399999999, 43.506212 ], "pop" : 185, "state" : "NY" } +{ "_id" : "12855", "city" : "NORTH HUDSON", "loc" : [ -73.712065, 43.986872 ], "pop" : 266, "state" : "NY" } +{ "_id" : "12857", "city" : "OLMSTEDVILLE", "loc" : [ -73.93347900000001, 43.779931 ], "pop" : 450, "state" : "NY" } +{ "_id" : "12858", "city" : "PARADOX", "loc" : [ -73.64495599999999, 43.891382 ], "pop" : 29, "state" : "NY" } +{ "_id" : "12859", "city" : "PORTER CORNERS", "loc" : [ -73.88391799999999, 43.172358 ], "pop" : 1028, "state" : "NY" } +{ "_id" : "12860", "city" : "POTTERSVILLE", "loc" : [ -73.756438, 43.692956 ], "pop" : 252, "state" : "NY" } +{ "_id" : "12861", "city" : "PUTNAM STATION", "loc" : [ -73.412299, 43.755976 ], "pop" : 477, "state" : "NY" } +{ "_id" : "12863", "city" : "ROCK CITY FALLS", "loc" : [ -73.92152299999999, 43.066248 ], "pop" : 553, "state" : "NY" } +{ "_id" : "12865", "city" : "SALEM", "loc" : [ -73.332703, 43.182785 ], "pop" : 1965, "state" : "NY" } +{ "_id" : "12866", "city" : "WILTON", "loc" : [ -73.780644, 43.080094 ], "pop" : 30086, "state" : "NY" } +{ "_id" : "12870", "city" : "SCHROON LAKE", "loc" : [ -73.767382, 43.841159 ], "pop" : 1656, "state" : "NY" } +{ "_id" : "12871", "city" : "SCHUYLERVILLE", "loc" : [ -73.60068, 43.087778 ], "pop" : 3929, "state" : "NY" } +{ "_id" : "12872", "city" : "SEVERANCE", "loc" : [ -73.730127, 43.876903 ], "pop" : 36, "state" : "NY" } +{ "_id" : "12873", "city" : "SHUSHAN", "loc" : [ -73.323148, 43.110575 ], "pop" : 755, "state" : "NY" } +{ "_id" : "12874", "city" : "SILVER BAY", "loc" : [ -73.507062, 43.697804 ], "pop" : 7, "state" : "NY" } +{ "_id" : "12878", "city" : "STONY CREEK", "loc" : [ -73.949467, 43.421389 ], "pop" : 625, "state" : "NY" } +{ "_id" : "12883", "city" : "TICONDEROGA", "loc" : [ -73.442592, 43.846302 ], "pop" : 5149, "state" : "NY" } +{ "_id" : "12885", "city" : "WARRENSBURG", "loc" : [ -73.79202100000001, 43.500253 ], "pop" : 4399, "state" : "NY" } +{ "_id" : "12886", "city" : "WEVERTOWN", "loc" : [ -73.930909, 43.64129 ], "pop" : 137, "state" : "NY" } +{ "_id" : "12887", "city" : "WHITEHALL", "loc" : [ -73.38641200000001, 43.5531 ], "pop" : 5372, "state" : "NY" } +{ "_id" : "12901", "city" : "PLATTSBURGH", "loc" : [ -73.465969, 44.692715 ], "pop" : 40905, "state" : "NY" } +{ "_id" : "12910", "city" : "ALTONA", "loc" : [ -73.640767, 44.881584 ], "pop" : 2456, "state" : "NY" } +{ "_id" : "12911", "city" : "AU SABLE CHASM", "loc" : [ -73.508976, 44.521594 ], "pop" : 514, "state" : "NY" } +{ "_id" : "12912", "city" : "AU SABLE FORKS", "loc" : [ -73.685672, 44.44994 ], "pop" : 2143, "state" : "NY" } +{ "_id" : "12913", "city" : "BLOOMINGDALE", "loc" : [ -74.08293, 44.398477 ], "pop" : 1016, "state" : "NY" } +{ "_id" : "12914", "city" : "BOMBAY", "loc" : [ -74.59473699999999, 44.947861 ], "pop" : 1042, "state" : "NY" } +{ "_id" : "12916", "city" : "BRUSHTON", "loc" : [ -74.522274, 44.828212 ], "pop" : 1936, "state" : "NY" } +{ "_id" : "12917", "city" : "BURKE", "loc" : [ -74.17311599999999, 44.917722 ], "pop" : 1279, "state" : "NY" } +{ "_id" : "12918", "city" : "CADYVILLE", "loc" : [ -73.670242, 44.686473 ], "pop" : 2122, "state" : "NY" } +{ "_id" : "12919", "city" : "CHAMPLAIN", "loc" : [ -73.446603, 44.977292 ], "pop" : 2827, "state" : "NY" } +{ "_id" : "12920", "city" : "CHATEAUGAY", "loc" : [ -74.07409800000001, 44.908768 ], "pop" : 2088, "state" : "NY" } +{ "_id" : "12921", "city" : "CHAZY", "loc" : [ -73.450076, 44.888379 ], "pop" : 2664, "state" : "NY" } +{ "_id" : "12922", "city" : "CHILDWOLD", "loc" : [ -74.675878, 44.286715 ], "pop" : 0, "state" : "NY" } +{ "_id" : "12923", "city" : "CHURUBUSCO", "loc" : [ -73.935484, 44.943232 ], "pop" : 663, "state" : "NY" } +{ "_id" : "12924", "city" : "KEESEVILLE", "loc" : [ -73.567971, 44.504814 ], "pop" : 377, "state" : "NY" } +{ "_id" : "12926", "city" : "CONSTABLE", "loc" : [ -74.329713, 44.941688 ], "pop" : 1949, "state" : "NY" } +{ "_id" : "12928", "city" : "CROWN POINT", "loc" : [ -73.466486, 43.952633 ], "pop" : 1963, "state" : "NY" } +{ "_id" : "12930", "city" : "DICKINSON CENTER", "loc" : [ -74.552346, 44.723328 ], "pop" : 549, "state" : "NY" } +{ "_id" : "12932", "city" : "ELIZABETHTOWN", "loc" : [ -73.601131, 44.224518 ], "pop" : 1274, "state" : "NY" } +{ "_id" : "12934", "city" : "ELLENBURG CENTER", "loc" : [ -73.86854599999999, 44.844353 ], "pop" : 1494, "state" : "NY" } +{ "_id" : "12935", "city" : "ELLENBURG DEPOT", "loc" : [ -73.787572, 44.916266 ], "pop" : 981, "state" : "NY" } +{ "_id" : "12936", "city" : "ESSEX", "loc" : [ -73.373147, 44.280695 ], "pop" : 406, "state" : "NY" } +{ "_id" : "12937", "city" : "FORT COVINGTON", "loc" : [ -74.492879, 44.973096 ], "pop" : 1568, "state" : "NY" } +{ "_id" : "12938", "city" : "NICHOLVILLE", "loc" : [ -74.53647100000001, 44.638703 ], "pop" : 1229, "state" : "NY" } +{ "_id" : "12941", "city" : "JAY", "loc" : [ -73.72470199999999, 44.373351 ], "pop" : 1245, "state" : "NY" } +{ "_id" : "12942", "city" : "KEENE", "loc" : [ -73.79145699999999, 44.25548 ], "pop" : 520, "state" : "NY" } +{ "_id" : "12943", "city" : "SAINT HUBERTS", "loc" : [ -73.795923, 44.177978 ], "pop" : 392, "state" : "NY" } +{ "_id" : "12944", "city" : "KEESEVILLE", "loc" : [ -73.474538, 44.499933 ], "pop" : 4129, "state" : "NY" } +{ "_id" : "12945", "city" : "UPPER SAINT REGI", "loc" : [ -74.243336, 44.359392 ], "pop" : 412, "state" : "NY" } +{ "_id" : "12946", "city" : "NORTH POLE", "loc" : [ -73.98635400000001, 44.274986 ], "pop" : 4656, "state" : "NY" } +{ "_id" : "12949", "city" : "LAWRENCEVILLE", "loc" : [ -74.662927, 44.758988 ], "pop" : 41, "state" : "NY" } +{ "_id" : "12950", "city" : "LEWIS", "loc" : [ -73.54912899999999, 44.307507 ], "pop" : 432, "state" : "NY" } +{ "_id" : "12952", "city" : "LYON MOUNTAIN", "loc" : [ -73.91945200000001, 44.725491 ], "pop" : 623, "state" : "NY" } +{ "_id" : "12953", "city" : "MALONE", "loc" : [ -74.29280799999999, 44.848164 ], "pop" : 13798, "state" : "NY" } +{ "_id" : "12955", "city" : "MERRILL", "loc" : [ -73.97783200000001, 44.799364 ], "pop" : 452, "state" : "NY" } +{ "_id" : "12956", "city" : "MINEVILLE", "loc" : [ -73.523588, 44.087631 ], "pop" : 1868, "state" : "NY" } +{ "_id" : "12957", "city" : "MOIRA", "loc" : [ -74.560273, 44.850412 ], "pop" : 1511, "state" : "NY" } +{ "_id" : "12958", "city" : "MOOERS", "loc" : [ -73.58341299999999, 44.959244 ], "pop" : 1569, "state" : "NY" } +{ "_id" : "12959", "city" : "MOOERS FORKS", "loc" : [ -73.672967, 44.960232 ], "pop" : 963, "state" : "NY" } +{ "_id" : "12960", "city" : "MORIAH", "loc" : [ -73.507862, 44.043755 ], "pop" : 889, "state" : "NY" } +{ "_id" : "12961", "city" : "MORIAH CENTER", "loc" : [ -73.511071, 44.066197 ], "pop" : 209, "state" : "NY" } +{ "_id" : "12962", "city" : "MORRISONVILLE", "loc" : [ -73.577168, 44.68936 ], "pop" : 4665, "state" : "NY" } +{ "_id" : "12964", "city" : "NEW RUSSIA", "loc" : [ -73.605881, 44.159532 ], "pop" : 216, "state" : "NY" } +{ "_id" : "12965", "city" : "NICHOLVILLE", "loc" : [ -74.653379, 44.708182 ], "pop" : 153, "state" : "NY" } +{ "_id" : "12966", "city" : "BANGOR", "loc" : [ -74.413369, 44.829997 ], "pop" : 2867, "state" : "NY" } +{ "_id" : "12967", "city" : "NORTH LAWRENCE", "loc" : [ -74.665307, 44.774982 ], "pop" : 943, "state" : "NY" } +{ "_id" : "12968", "city" : "ONCHIOTA", "loc" : [ -74.170991, 44.458163 ], "pop" : 1407, "state" : "NY" } +{ "_id" : "12969", "city" : "OWLS HEAD", "loc" : [ -74.134173, 44.730791 ], "pop" : 329, "state" : "NY" } +{ "_id" : "12970", "city" : "PAUL SMITHS", "loc" : [ -74.26643199999999, 44.444967 ], "pop" : 245, "state" : "NY" } +{ "_id" : "12972", "city" : "PERU", "loc" : [ -73.52932199999999, 44.585109 ], "pop" : 5640, "state" : "NY" } +{ "_id" : "12973", "city" : "PIERCEFIELD", "loc" : [ -74.573228, 44.234037 ], "pop" : 112, "state" : "NY" } +{ "_id" : "12974", "city" : "PORT HENRY", "loc" : [ -73.47054199999999, 44.04645 ], "pop" : 1841, "state" : "NY" } +{ "_id" : "12978", "city" : "REDFORD", "loc" : [ -73.801948, 44.606926 ], "pop" : 495, "state" : "NY" } +{ "_id" : "12979", "city" : "ROUSES POINT", "loc" : [ -73.369083, 44.988413 ], "pop" : 2508, "state" : "NY" } +{ "_id" : "12980", "city" : "SAINT REGIS FALL", "loc" : [ -74.66032, 44.677298 ], "pop" : 321, "state" : "NY" } +{ "_id" : "12981", "city" : "SARANAC", "loc" : [ -73.748135, 44.703168 ], "pop" : 6545, "state" : "NY" } +{ "_id" : "12983", "city" : "SARANAC LAKE", "loc" : [ -74.13295100000001, 44.324331 ], "pop" : 9125, "state" : "NY" } +{ "_id" : "12985", "city" : "SCHUYLER FALLS", "loc" : [ -73.689481, 44.588224 ], "pop" : 652, "state" : "NY" } +{ "_id" : "12986", "city" : "SUNMOUNT", "loc" : [ -74.463172, 44.228461 ], "pop" : 6379, "state" : "NY" } +{ "_id" : "12987", "city" : "UPPER JAY", "loc" : [ -73.807864, 44.325586 ], "pop" : 159, "state" : "NY" } +{ "_id" : "12989", "city" : "VERMONTVILLE", "loc" : [ -74.057278, 44.460134 ], "pop" : 623, "state" : "NY" } +{ "_id" : "12992", "city" : "WEST CHAZY", "loc" : [ -73.511188, 44.796967 ], "pop" : 3944, "state" : "NY" } +{ "_id" : "12993", "city" : "WESTPORT", "loc" : [ -73.470223, 44.204983 ], "pop" : 2007, "state" : "NY" } +{ "_id" : "12994", "city" : "WHALLONSBURG", "loc" : [ -73.432205, 44.292637 ], "pop" : 169, "state" : "NY" } +{ "_id" : "12996", "city" : "WILLSBORO", "loc" : [ -73.396292, 44.360396 ], "pop" : 1729, "state" : "NY" } +{ "_id" : "12997", "city" : "WILMINGTON", "loc" : [ -73.816553, 44.387976 ], "pop" : 958, "state" : "NY" } +{ "_id" : "13021", "city" : "AUBURN", "loc" : [ -76.562605, 42.929958 ], "pop" : 43447, "state" : "NY" } +{ "_id" : "13026", "city" : "AURORA", "loc" : [ -76.67749000000001, 42.747231 ], "pop" : 1557, "state" : "NY" } +{ "_id" : "13027", "city" : "BALDWINSVILLE", "loc" : [ -76.323718, 43.162039 ], "pop" : 28132, "state" : "NY" } +{ "_id" : "13028", "city" : "BERNHARDS BAY", "loc" : [ -75.937299, 43.271722 ], "pop" : 1228, "state" : "NY" } +{ "_id" : "13029", "city" : "BREWERTON", "loc" : [ -76.135132, 43.225194 ], "pop" : 4823, "state" : "NY" } +{ "_id" : "13030", "city" : "BRIDGEPORT", "loc" : [ -75.970009, 43.159015 ], "pop" : 4507, "state" : "NY" } +{ "_id" : "13031", "city" : "CAMILLUS", "loc" : [ -76.280728, 43.041651 ], "pop" : 15236, "state" : "NY" } +{ "_id" : "13032", "city" : "CANASTOTA", "loc" : [ -75.76019700000001, 43.087764 ], "pop" : 12909, "state" : "NY" } +{ "_id" : "13033", "city" : "CATO", "loc" : [ -76.564791, 43.179443 ], "pop" : 3873, "state" : "NY" } +{ "_id" : "13034", "city" : "CAYUGA", "loc" : [ -76.70240200000001, 42.914198 ], "pop" : 2357, "state" : "NY" } +{ "_id" : "13035", "city" : "CAZENOVIA", "loc" : [ -75.839229, 42.937955 ], "pop" : 7748, "state" : "NY" } +{ "_id" : "13036", "city" : "CENTRAL SQUARE", "loc" : [ -76.18485200000001, 43.308986 ], "pop" : 7720, "state" : "NY" } +{ "_id" : "13037", "city" : "CHITTENANGO", "loc" : [ -75.87684, 43.05524 ], "pop" : 8756, "state" : "NY" } +{ "_id" : "13039", "city" : "CICERO", "loc" : [ -76.09618500000001, 43.170693 ], "pop" : 12600, "state" : "NY" } +{ "_id" : "13040", "city" : "CINCINNATUS", "loc" : [ -75.903029, 42.538539 ], "pop" : 2416, "state" : "NY" } +{ "_id" : "13041", "city" : "CLAY", "loc" : [ -76.170748, 43.173734 ], "pop" : 8609, "state" : "NY" } +{ "_id" : "13042", "city" : "CLEVELAND", "loc" : [ -75.853691, 43.243199 ], "pop" : 2428, "state" : "NY" } +{ "_id" : "13044", "city" : "CONSTANTIA", "loc" : [ -76.004155, 43.272751 ], "pop" : 2603, "state" : "NY" } +{ "_id" : "13045", "city" : "CORTLAND", "loc" : [ -76.185675, 42.595175 ], "pop" : 29180, "state" : "NY" } +{ "_id" : "13050", "city" : "CUYLER", "loc" : [ -75.938367, 42.740571 ], "pop" : 920, "state" : "NY" } +{ "_id" : "13052", "city" : "DE RUYTER", "loc" : [ -75.858226, 42.749444 ], "pop" : 1914, "state" : "NY" } +{ "_id" : "13053", "city" : "DRYDEN", "loc" : [ -76.28722399999999, 42.486118 ], "pop" : 4659, "state" : "NY" } +{ "_id" : "13054", "city" : "DURHAMVILLE", "loc" : [ -75.671409, 43.157912 ], "pop" : 1470, "state" : "NY" } +{ "_id" : "13055", "city" : "EAST FREETOWN", "loc" : [ -75.998924, 42.579845 ], "pop" : 833, "state" : "NY" } +{ "_id" : "13057", "city" : "EAST SYRACUSE", "loc" : [ -76.05578, 43.073359 ], "pop" : 14722, "state" : "NY" } +{ "_id" : "13060", "city" : "ELBRIDGE", "loc" : [ -76.435164, 43.025246 ], "pop" : 1770, "state" : "NY" } +{ "_id" : "13061", "city" : "ERIEVILLE", "loc" : [ -75.754255, 42.856166 ], "pop" : 1100, "state" : "NY" } +{ "_id" : "13063", "city" : "FABIUS", "loc" : [ -75.983645, 42.853117 ], "pop" : 1785, "state" : "NY" } +{ "_id" : "13066", "city" : "FAYETTEVILLE", "loc" : [ -76.014503, 43.026774 ], "pop" : 11793, "state" : "NY" } +{ "_id" : "13068", "city" : "FREEVILLE", "loc" : [ -76.36362200000001, 42.499768 ], "pop" : 5181, "state" : "NY" } +{ "_id" : "13069", "city" : "FULTON", "loc" : [ -76.40342, 43.321108 ], "pop" : 23858, "state" : "NY" } +{ "_id" : "13071", "city" : "GENOA", "loc" : [ -76.54175499999999, 42.674624 ], "pop" : 1160, "state" : "NY" } +{ "_id" : "13072", "city" : "GEORGETOWN", "loc" : [ -75.74427900000001, 42.763059 ], "pop" : 611, "state" : "NY" } +{ "_id" : "13073", "city" : "GROTON", "loc" : [ -76.363286, 42.58549 ], "pop" : 5940, "state" : "NY" } +{ "_id" : "13074", "city" : "HANNIBAL", "loc" : [ -76.54603400000001, 43.311115 ], "pop" : 5248, "state" : "NY" } +{ "_id" : "13076", "city" : "HASTINGS", "loc" : [ -76.14770799999999, 43.35268 ], "pop" : 2259, "state" : "NY" } +{ "_id" : "13077", "city" : "HOMER", "loc" : [ -76.18783000000001, 42.672586 ], "pop" : 7192, "state" : "NY" } +{ "_id" : "13078", "city" : "JAMESVILLE", "loc" : [ -76.076571, 42.982973 ], "pop" : 8230, "state" : "NY" } +{ "_id" : "13080", "city" : "JORDAN", "loc" : [ -76.45977999999999, 43.065141 ], "pop" : 4766, "state" : "NY" } +{ "_id" : "13081", "city" : "KING FERRY", "loc" : [ -76.62160299999999, 42.66351 ], "pop" : 979, "state" : "NY" } +{ "_id" : "13082", "city" : "KIRKVILLE", "loc" : [ -75.955003, 43.098095 ], "pop" : 4798, "state" : "NY" } +{ "_id" : "13083", "city" : "LACONA", "loc" : [ -76.050335, 43.642883 ], "pop" : 2199, "state" : "NY" } +{ "_id" : "13084", "city" : "LA FAYETTE", "loc" : [ -76.106116, 42.890959 ], "pop" : 4450, "state" : "NY" } +{ "_id" : "13085", "city" : "LEBANON", "loc" : [ -75.67758499999999, 42.77451 ], "pop" : 164, "state" : "NY" } +{ "_id" : "13088", "city" : "LIVERPOOL", "loc" : [ -76.186999, 43.109925 ], "pop" : 23093, "state" : "NY" } +{ "_id" : "13090", "city" : "BAYBERRY", "loc" : [ -76.223269, 43.148048 ], "pop" : 31387, "state" : "NY" } +{ "_id" : "13092", "city" : "LOCKE", "loc" : [ -76.415436, 42.655789 ], "pop" : 2746, "state" : "NY" } +{ "_id" : "13101", "city" : "MC GRAW", "loc" : [ -76.081958, 42.594758 ], "pop" : 2511, "state" : "NY" } +{ "_id" : "13103", "city" : "MALLORY", "loc" : [ -76.089208, 43.33782 ], "pop" : 1267, "state" : "NY" } +{ "_id" : "13104", "city" : "MANLIUS", "loc" : [ -75.97034499999999, 42.990441 ], "pop" : 12754, "state" : "NY" } +{ "_id" : "13108", "city" : "MARCELLUS", "loc" : [ -76.33228, 42.982056 ], "pop" : 6077, "state" : "NY" } +{ "_id" : "13110", "city" : "MARIETTA", "loc" : [ -76.28055000000001, 42.897441 ], "pop" : 1778, "state" : "NY" } +{ "_id" : "13111", "city" : "MARTVILLE", "loc" : [ -76.628936, 43.26608 ], "pop" : 1342, "state" : "NY" } +{ "_id" : "13112", "city" : "MEMPHIS", "loc" : [ -76.40300999999999, 43.093438 ], "pop" : 1888, "state" : "NY" } +{ "_id" : "13114", "city" : "MEXICO", "loc" : [ -76.24458799999999, 43.460533 ], "pop" : 6641, "state" : "NY" } +{ "_id" : "13116", "city" : "MINOA", "loc" : [ -76.009812, 43.077212 ], "pop" : 3790, "state" : "NY" } +{ "_id" : "13118", "city" : "MORAVIA", "loc" : [ -76.39897999999999, 42.735456 ], "pop" : 6267, "state" : "NY" } +{ "_id" : "13120", "city" : "NEDROW", "loc" : [ -76.15293200000001, 42.955855 ], "pop" : 2349, "state" : "NY" } +{ "_id" : "13122", "city" : "NEW WOODSTOCK", "loc" : [ -75.86352599999999, 42.844135 ], "pop" : 842, "state" : "NY" } +{ "_id" : "13124", "city" : "NORTH PITCHER", "loc" : [ -75.81635900000001, 42.637243 ], "pop" : 160, "state" : "NY" } +{ "_id" : "13126", "city" : "OSWEGO", "loc" : [ -76.497489, 43.443836 ], "pop" : 38426, "state" : "NY" } +{ "_id" : "13131", "city" : "PARISH", "loc" : [ -76.10002299999999, 43.415295 ], "pop" : 3039, "state" : "NY" } +{ "_id" : "13132", "city" : "PENNELLVILLE", "loc" : [ -76.23946599999999, 43.260946 ], "pop" : 4566, "state" : "NY" } +{ "_id" : "13135", "city" : "PHOENIX", "loc" : [ -76.306449, 43.24679 ], "pop" : 5342, "state" : "NY" } +{ "_id" : "13136", "city" : "PITCHER", "loc" : [ -75.846464, 42.596941 ], "pop" : 678, "state" : "NY" } +{ "_id" : "13140", "city" : "PORT BYRON", "loc" : [ -76.644919, 43.042653 ], "pop" : 4391, "state" : "NY" } +{ "_id" : "13141", "city" : "PREBLE", "loc" : [ -76.214105, 42.79501 ], "pop" : 502, "state" : "NY" } +{ "_id" : "13142", "city" : "PULASKI", "loc" : [ -76.125231, 43.55617 ], "pop" : 7355, "state" : "NY" } +{ "_id" : "13143", "city" : "RED CREEK", "loc" : [ -76.714556, 43.229068 ], "pop" : 3289, "state" : "NY" } +{ "_id" : "13144", "city" : "RICHLAND", "loc" : [ -76.00291799999999, 43.577578 ], "pop" : 1267, "state" : "NY" } +{ "_id" : "13145", "city" : "SANDY CREEK", "loc" : [ -76.126439, 43.651681 ], "pop" : 801, "state" : "NY" } +{ "_id" : "13146", "city" : "SAVANNAH", "loc" : [ -76.75646999999999, 43.093439 ], "pop" : 2141, "state" : "NY" } +{ "_id" : "13147", "city" : "VENICE CENTER", "loc" : [ -76.574175, 42.778472 ], "pop" : 1520, "state" : "NY" } +{ "_id" : "13148", "city" : "SENECA FALLS", "loc" : [ -76.79253799999999, 42.909377 ], "pop" : 10987, "state" : "NY" } +{ "_id" : "13152", "city" : "SKANEATELES", "loc" : [ -76.405174, 42.925751 ], "pop" : 9182, "state" : "NY" } +{ "_id" : "13155", "city" : "SOUTH OTSELIC", "loc" : [ -75.766919, 42.66256 ], "pop" : 789, "state" : "NY" } +{ "_id" : "13156", "city" : "STERLING", "loc" : [ -76.67473099999999, 43.329578 ], "pop" : 2252, "state" : "NY" } +{ "_id" : "13158", "city" : "TRUXTON", "loc" : [ -76.018946, 42.708547 ], "pop" : 593, "state" : "NY" } +{ "_id" : "13159", "city" : "TULLY", "loc" : [ -76.13936, 42.806977 ], "pop" : 4777, "state" : "NY" } +{ "_id" : "13160", "city" : "UNION SPRINGS", "loc" : [ -76.673959, 42.833546 ], "pop" : 1984, "state" : "NY" } +{ "_id" : "13164", "city" : "WARNERS", "loc" : [ -76.290413, 43.09317 ], "pop" : 816, "state" : "NY" } +{ "_id" : "13165", "city" : "WATERLOO", "loc" : [ -76.87549799999999, 42.904515 ], "pop" : 10845, "state" : "NY" } +{ "_id" : "13166", "city" : "WEEDSPORT", "loc" : [ -76.542502, 43.048882 ], "pop" : 5847, "state" : "NY" } +{ "_id" : "13167", "city" : "WEST MONROE", "loc" : [ -76.079747, 43.288235 ], "pop" : 3369, "state" : "NY" } +{ "_id" : "13202", "city" : "SYRACUSE", "loc" : [ -76.14885599999999, 43.040988 ], "pop" : 5442, "state" : "NY" } +{ "_id" : "13203", "city" : "SYRACUSE", "loc" : [ -76.136931, 43.060703 ], "pop" : 17585, "state" : "NY" } +{ "_id" : "13204", "city" : "SYRACUSE", "loc" : [ -76.17576699999999, 43.044398 ], "pop" : 25414, "state" : "NY" } +{ "_id" : "13205", "city" : "SYRACUSE", "loc" : [ -76.14518, 43.012314 ], "pop" : 23048, "state" : "NY" } +{ "_id" : "13206", "city" : "SYRACUSE", "loc" : [ -76.110226, 43.06773 ], "pop" : 17644, "state" : "NY" } +{ "_id" : "13207", "city" : "SYRACUSE", "loc" : [ -76.16501, 43.019482 ], "pop" : 16380, "state" : "NY" } +{ "_id" : "13208", "city" : "SYRACUSE", "loc" : [ -76.148616, 43.073007 ], "pop" : 22242, "state" : "NY" } +{ "_id" : "13209", "city" : "SOLVAY", "loc" : [ -76.23844800000001, 43.078204 ], "pop" : 13467, "state" : "NY" } +{ "_id" : "13210", "city" : "SYRACUSE", "loc" : [ -76.12816599999999, 43.035414 ], "pop" : 31197, "state" : "NY" } +{ "_id" : "13211", "city" : "MATTYDALE", "loc" : [ -76.14218099999999, 43.09951 ], "pop" : 6940, "state" : "NY" } +{ "_id" : "13212", "city" : "NORTH SYRACUSE", "loc" : [ -76.13729499999999, 43.130623 ], "pop" : 22829, "state" : "NY" } +{ "_id" : "13214", "city" : "DE WITT", "loc" : [ -76.07844, 43.042529 ], "pop" : 9501, "state" : "NY" } +{ "_id" : "13215", "city" : "ONONDAGA", "loc" : [ -76.211851, 42.997544 ], "pop" : 12557, "state" : "NY" } +{ "_id" : "13219", "city" : "SYRACUSE", "loc" : [ -76.226159, 43.040943 ], "pop" : 16166, "state" : "NY" } +{ "_id" : "13224", "city" : "SYRACUSE", "loc" : [ -76.104609, 43.042134 ], "pop" : 9845, "state" : "NY" } +{ "_id" : "13301", "city" : "ALDER CREEK", "loc" : [ -75.213748, 43.415659 ], "pop" : 74, "state" : "NY" } +{ "_id" : "13302", "city" : "ALTMAR", "loc" : [ -75.971934, 43.497022 ], "pop" : 1761, "state" : "NY" } +{ "_id" : "13303", "city" : "AVA", "loc" : [ -75.450919, 43.344519 ], "pop" : 1708, "state" : "NY" } +{ "_id" : "13304", "city" : "BARNEVELD", "loc" : [ -75.16115600000001, 43.223697 ], "pop" : 1383, "state" : "NY" } +{ "_id" : "13308", "city" : "BLOSSVALE", "loc" : [ -75.687313, 43.230293 ], "pop" : 4489, "state" : "NY" } +{ "_id" : "13309", "city" : "BOONVILLE", "loc" : [ -75.34397300000001, 43.478615 ], "pop" : 5768, "state" : "NY" } +{ "_id" : "13310", "city" : "BOUCKVILLE", "loc" : [ -75.567841, 42.894024 ], "pop" : 650, "state" : "NY" } +{ "_id" : "13314", "city" : "BROOKFIELD", "loc" : [ -75.34385899999999, 42.807538 ], "pop" : 5, "state" : "NY" } +{ "_id" : "13315", "city" : "BURLINGTON FLATS", "loc" : [ -75.169044, 42.75162 ], "pop" : 1145, "state" : "NY" } +{ "_id" : "13316", "city" : "CAMDEN", "loc" : [ -75.75425799999999, 43.339197 ], "pop" : 6987, "state" : "NY" } +{ "_id" : "13317", "city" : "AMES", "loc" : [ -74.583522, 42.88239 ], "pop" : 3986, "state" : "NY" } +{ "_id" : "13318", "city" : "CASSVILLE", "loc" : [ -75.260704, 42.906931 ], "pop" : 1566, "state" : "NY" } +{ "_id" : "13319", "city" : "CHADWICKS", "loc" : [ -75.26564500000001, 43.022563 ], "pop" : 274, "state" : "NY" } +{ "_id" : "13320", "city" : "CHERRY VALLEY", "loc" : [ -74.744439, 42.782315 ], "pop" : 1642, "state" : "NY" } +{ "_id" : "13322", "city" : "CLAYVILLE", "loc" : [ -75.206126, 42.97119 ], "pop" : 641, "state" : "NY" } +{ "_id" : "13323", "city" : "CLINTON", "loc" : [ -75.38079, 43.05856 ], "pop" : 12483, "state" : "NY" } +{ "_id" : "13324", "city" : "COLD BROOK", "loc" : [ -74.997651, 43.302391 ], "pop" : 1853, "state" : "NY" } +{ "_id" : "13325", "city" : "CONSTABLEVILLE", "loc" : [ -75.458406, 43.562982 ], "pop" : 931, "state" : "NY" } +{ "_id" : "13326", "city" : "COOPERSTOWN", "loc" : [ -74.918148, 42.70319 ], "pop" : 5402, "state" : "NY" } +{ "_id" : "13327", "city" : "CROGHAN", "loc" : [ -75.354192, 43.909461 ], "pop" : 1841, "state" : "NY" } +{ "_id" : "13328", "city" : "DEANSBORO", "loc" : [ -75.438309, 42.981788 ], "pop" : 639, "state" : "NY" } +{ "_id" : "13329", "city" : "DOLGEVILLE", "loc" : [ -74.76430499999999, 43.104161 ], "pop" : 4205, "state" : "NY" } +{ "_id" : "13331", "city" : "EAGLE BAY", "loc" : [ -74.96538099999999, 43.723659 ], "pop" : 1416, "state" : "NY" } +{ "_id" : "13332", "city" : "EARLVILLE", "loc" : [ -75.541653, 42.752218 ], "pop" : 2413, "state" : "NY" } +{ "_id" : "13333", "city" : "EAST SPRINGFIELD", "loc" : [ -74.75974100000001, 42.832947 ], "pop" : 0, "state" : "NY" } +{ "_id" : "13334", "city" : "EATON", "loc" : [ -75.631359, 42.848417 ], "pop" : 1583, "state" : "NY" } +{ "_id" : "13335", "city" : "EDMESTON", "loc" : [ -75.252522, 42.730281 ], "pop" : 788, "state" : "NY" } +{ "_id" : "13337", "city" : "FLY CREEK", "loc" : [ -74.986921, 42.725177 ], "pop" : 1033, "state" : "NY" } +{ "_id" : "13338", "city" : "FORESTPORT", "loc" : [ -75.178742, 43.473651 ], "pop" : 1013, "state" : "NY" } +{ "_id" : "13339", "city" : "FORT PLAIN", "loc" : [ -74.643298, 42.937158 ], "pop" : 6144, "state" : "NY" } +{ "_id" : "13340", "city" : "FRANKFORT", "loc" : [ -75.10715500000001, 43.044041 ], "pop" : 8546, "state" : "NY" } +{ "_id" : "13342", "city" : "GARRATTSVILLE", "loc" : [ -75.23270100000001, 42.635634 ], "pop" : 293, "state" : "NY" } +{ "_id" : "13343", "city" : "GLENFIELD", "loc" : [ -75.366902, 43.732306 ], "pop" : 1909, "state" : "NY" } +{ "_id" : "13345", "city" : "GREIG", "loc" : [ -75.312393, 43.689184 ], "pop" : 456, "state" : "NY" } +{ "_id" : "13346", "city" : "HAMILTON", "loc" : [ -75.54338199999999, 42.82306 ], "pop" : 5821, "state" : "NY" } +{ "_id" : "13348", "city" : "HARTWICK", "loc" : [ -75.055009, 42.695033 ], "pop" : 1424, "state" : "NY" } +{ "_id" : "13350", "city" : "HERKIMER", "loc" : [ -74.98757000000001, 43.030696 ], "pop" : 10090, "state" : "NY" } +{ "_id" : "13353", "city" : "HOFFMEISTER", "loc" : [ -74.739974, 43.391545 ], "pop" : 106, "state" : "NY" } +{ "_id" : "13354", "city" : "HOLLAND PATENT", "loc" : [ -75.253506, 43.248406 ], "pop" : 3970, "state" : "NY" } +{ "_id" : "13355", "city" : "HUBBARDSVILLE", "loc" : [ -75.436707, 42.823663 ], "pop" : 810, "state" : "NY" } +{ "_id" : "13357", "city" : "ILION", "loc" : [ -75.04836, 43.006391 ], "pop" : 11603, "state" : "NY" } +{ "_id" : "13360", "city" : "INLET", "loc" : [ -74.784631, 43.748024 ], "pop" : 343, "state" : "NY" } +{ "_id" : "13361", "city" : "JORDANVILLE", "loc" : [ -74.820919, 42.89478 ], "pop" : 395, "state" : "NY" } +{ "_id" : "13363", "city" : "LEE CENTER", "loc" : [ -75.505532, 43.314804 ], "pop" : 2076, "state" : "NY" } +{ "_id" : "13365", "city" : "LITTLE FALLS", "loc" : [ -74.860598, 43.047371 ], "pop" : 10379, "state" : "NY" } +{ "_id" : "13367", "city" : "BEAVER RIVER", "loc" : [ -75.47537800000001, 43.801055 ], "pop" : 8238, "state" : "NY" } +{ "_id" : "13368", "city" : "LYONS FALLS", "loc" : [ -75.355312, 43.626165 ], "pop" : 1210, "state" : "NY" } +{ "_id" : "13401", "city" : "MC CONNELLSVILLE", "loc" : [ -75.652477, 43.289552 ], "pop" : 412, "state" : "NY" } +{ "_id" : "13402", "city" : "MADISON", "loc" : [ -75.50756199999999, 42.896854 ], "pop" : 1472, "state" : "NY" } +{ "_id" : "13403", "city" : "MARCY", "loc" : [ -75.278335, 43.163926 ], "pop" : 7937, "state" : "NY" } +{ "_id" : "13406", "city" : "MIDDLEVILLE", "loc" : [ -74.92397800000001, 43.136933 ], "pop" : 180, "state" : "NY" } +{ "_id" : "13407", "city" : "MOHAWK", "loc" : [ -74.985298, 42.989986 ], "pop" : 5907, "state" : "NY" } +{ "_id" : "13408", "city" : "MORRISVILLE", "loc" : [ -75.648656, 42.910805 ], "pop" : 4491, "state" : "NY" } +{ "_id" : "13409", "city" : "MUNNSVILLE", "loc" : [ -75.594032, 42.986326 ], "pop" : 2116, "state" : "NY" } +{ "_id" : "13411", "city" : "NEW BERLIN", "loc" : [ -75.34740600000001, 42.622414 ], "pop" : 2569, "state" : "NY" } +{ "_id" : "13413", "city" : "NEW HARTFORD", "loc" : [ -75.29055099999999, 43.065412 ], "pop" : 14035, "state" : "NY" } +{ "_id" : "13415", "city" : "NEW LISBON", "loc" : [ -75.32743600000001, 42.578968 ], "pop" : 19, "state" : "NY" } +{ "_id" : "13416", "city" : "NEWPORT", "loc" : [ -74.986133, 43.180002 ], "pop" : 2554, "state" : "NY" } +{ "_id" : "13417", "city" : "NEW YORK MILLS", "loc" : [ -75.29369, 43.100038 ], "pop" : 3646, "state" : "NY" } +{ "_id" : "13418", "city" : "NORTH BROOKFIELD", "loc" : [ -75.381489, 42.850088 ], "pop" : 258, "state" : "NY" } +{ "_id" : "13420", "city" : "OLD FORGE", "loc" : [ -74.893511, 43.74347 ], "pop" : 221, "state" : "NY" } +{ "_id" : "13421", "city" : "ONEIDA", "loc" : [ -75.650814, 43.086248 ], "pop" : 11876, "state" : "NY" } +{ "_id" : "13424", "city" : "ORISKANY", "loc" : [ -75.34343699999999, 43.152427 ], "pop" : 3566, "state" : "NY" } +{ "_id" : "13425", "city" : "ORISKANY FALLS", "loc" : [ -75.483807, 42.957585 ], "pop" : 2192, "state" : "NY" } +{ "_id" : "13428", "city" : "PALATINE BRIDGE", "loc" : [ -74.570825, 42.922119 ], "pop" : 1738, "state" : "NY" } +{ "_id" : "13431", "city" : "POLAND", "loc" : [ -75.07313000000001, 43.211458 ], "pop" : 1789, "state" : "NY" } +{ "_id" : "13433", "city" : "PORT LEYDEN", "loc" : [ -75.326257, 43.580245 ], "pop" : 1951, "state" : "NY" } +{ "_id" : "13436", "city" : "RAQUETTE LAKE", "loc" : [ -74.537959, 43.866224 ], "pop" : 0, "state" : "NY" } +{ "_id" : "13437", "city" : "REDFIELD", "loc" : [ -75.82423, 43.565794 ], "pop" : 482, "state" : "NY" } +{ "_id" : "13438", "city" : "REMSEN", "loc" : [ -75.161618, 43.338456 ], "pop" : 4400, "state" : "NY" } +{ "_id" : "13439", "city" : "RICHFIELD SPRING", "loc" : [ -74.992214, 42.850298 ], "pop" : 3825, "state" : "NY" } +{ "_id" : "13440", "city" : "ROME", "loc" : [ -75.449758, 43.219349 ], "pop" : 56424, "state" : "NY" } +{ "_id" : "13450", "city" : "ROSEBOOM", "loc" : [ -74.74160999999999, 42.788246 ], "pop" : 8, "state" : "NY" } +{ "_id" : "13452", "city" : "SAINT JOHNSVILLE", "loc" : [ -74.64604, 43.016995 ], "pop" : 4992, "state" : "NY" } +{ "_id" : "13454", "city" : "SALISBURY CENTER", "loc" : [ -74.78093200000001, 43.162509 ], "pop" : 896, "state" : "NY" } +{ "_id" : "13456", "city" : "SAUQUOIT", "loc" : [ -75.26259, 43.007291 ], "pop" : 5652, "state" : "NY" } +{ "_id" : "13459", "city" : "SHARON SPRINGS", "loc" : [ -74.591911, 42.763357 ], "pop" : 2919, "state" : "NY" } +{ "_id" : "13460", "city" : "SHERBURNE", "loc" : [ -75.48302700000001, 42.685885 ], "pop" : 4013, "state" : "NY" } +{ "_id" : "13461", "city" : "SHERRILL", "loc" : [ -75.598975, 43.070397 ], "pop" : 2864, "state" : "NY" } +{ "_id" : "13464", "city" : "SMYRNA", "loc" : [ -75.61212399999999, 42.689565 ], "pop" : 1209, "state" : "NY" } +{ "_id" : "13466", "city" : "SOUTH EDMESTON", "loc" : [ -75.262919, 42.676754 ], "pop" : 1224, "state" : "NY" } +{ "_id" : "13468", "city" : "SPRINGFIELD CENT", "loc" : [ -74.938051, 42.850106 ], "pop" : 1402, "state" : "NY" } +{ "_id" : "13469", "city" : "STITTVILLE", "loc" : [ -75.28985400000001, 43.222889 ], "pop" : 567, "state" : "NY" } +{ "_id" : "13470", "city" : "STRATFORD", "loc" : [ -74.67678600000001, 43.179101 ], "pop" : 773, "state" : "NY" } +{ "_id" : "13471", "city" : "TABERG", "loc" : [ -75.602706, 43.336571 ], "pop" : 2393, "state" : "NY" } +{ "_id" : "13473", "city" : "TURIN", "loc" : [ -75.41319900000001, 43.644074 ], "pop" : 1004, "state" : "NY" } +{ "_id" : "13475", "city" : "VAN HORNESVILLE", "loc" : [ -74.83466199999999, 42.894812 ], "pop" : 40, "state" : "NY" } +{ "_id" : "13476", "city" : "VERNON", "loc" : [ -75.56272, 43.094509 ], "pop" : 4118, "state" : "NY" } +{ "_id" : "13477", "city" : "VERNON CENTER", "loc" : [ -75.521028, 43.044309 ], "pop" : 1440, "state" : "NY" } +{ "_id" : "13478", "city" : "VERONA", "loc" : [ -75.572399, 43.147311 ], "pop" : 2325, "state" : "NY" } +{ "_id" : "13480", "city" : "WATERVILLE", "loc" : [ -75.381466, 42.933244 ], "pop" : 4059, "state" : "NY" } +{ "_id" : "13482", "city" : "WEST BURLINGTON", "loc" : [ -75.190603, 42.706229 ], "pop" : 22, "state" : "NY" } +{ "_id" : "13483", "city" : "WESTDALE", "loc" : [ -75.822587, 43.411671 ], "pop" : 161, "state" : "NY" } +{ "_id" : "13485", "city" : "WEST EDMESTON", "loc" : [ -75.30372300000001, 42.794543 ], "pop" : 1337, "state" : "NY" } +{ "_id" : "13486", "city" : "WESTERNVILLE", "loc" : [ -75.315118, 43.329413 ], "pop" : 657, "state" : "NY" } +{ "_id" : "13488", "city" : "WESTFORD", "loc" : [ -75.10037800000001, 42.503512 ], "pop" : 253, "state" : "NY" } +{ "_id" : "13489", "city" : "WEST LEYDEN", "loc" : [ -75.51270700000001, 43.459713 ], "pop" : 500, "state" : "NY" } +{ "_id" : "13490", "city" : "WESTMORELAND", "loc" : [ -75.453259, 43.101686 ], "pop" : 904, "state" : "NY" } +{ "_id" : "13491", "city" : "WEST WINFIELD", "loc" : [ -75.183491, 42.882566 ], "pop" : 3825, "state" : "NY" } +{ "_id" : "13492", "city" : "WHITESBORO", "loc" : [ -75.309479, 43.115805 ], "pop" : 10411, "state" : "NY" } +{ "_id" : "13493", "city" : "WILLIAMSTOWN", "loc" : [ -75.904411, 43.410559 ], "pop" : 1798, "state" : "NY" } +{ "_id" : "13494", "city" : "WOODGATE", "loc" : [ -75.119111, 43.54881 ], "pop" : 169, "state" : "NY" } +{ "_id" : "13495", "city" : "YORKVILLE", "loc" : [ -75.275565, 43.111582 ], "pop" : 2482, "state" : "NY" } +{ "_id" : "13501", "city" : "UTICA", "loc" : [ -75.23146300000001, 43.087112 ], "pop" : 40223, "state" : "NY" } +{ "_id" : "13502", "city" : "UTICA", "loc" : [ -75.23138299999999, 43.106723 ], "pop" : 36632, "state" : "NY" } +{ "_id" : "13601", "city" : "WATERTOWN", "loc" : [ -75.912212, 43.974258 ], "pop" : 39515, "state" : "NY" } +{ "_id" : "13602", "city" : "FORT DRUM", "loc" : [ -75.753972, 44.035434 ], "pop" : 11895, "state" : "NY" } +{ "_id" : "13603", "city" : "FORT DRUM", "loc" : [ -75.791884, 44.072122 ], "pop" : 30, "state" : "NY" } +{ "_id" : "13605", "city" : "SMITHVILLE", "loc" : [ -76.05430200000001, 43.81614 ], "pop" : 4489, "state" : "NY" } +{ "_id" : "13606", "city" : "ADAMS CENTER", "loc" : [ -76.00415, 43.863106 ], "pop" : 2649, "state" : "NY" } +{ "_id" : "13607", "city" : "POINT VIVIAN", "loc" : [ -75.93061899999999, 44.326982 ], "pop" : 2024, "state" : "NY" } +{ "_id" : "13608", "city" : "ANTWERP", "loc" : [ -75.60048399999999, 44.235775 ], "pop" : 1830, "state" : "NY" } +{ "_id" : "13611", "city" : "BELLEVILLE", "loc" : [ -76.115053, 43.785373 ], "pop" : 72, "state" : "NY" } +{ "_id" : "13612", "city" : "BLACK RIVER", "loc" : [ -75.795777, 44.004156 ], "pop" : 3651, "state" : "NY" } +{ "_id" : "13613", "city" : "BRASHER FALLS", "loc" : [ -74.747303, 44.846718 ], "pop" : 1950, "state" : "NY" } +{ "_id" : "13614", "city" : "BRIER HILL", "loc" : [ -75.672203, 44.552542 ], "pop" : 481, "state" : "NY" } +{ "_id" : "13616", "city" : "CALCIUM", "loc" : [ -75.849884, 44.026484 ], "pop" : 1839, "state" : "NY" } +{ "_id" : "13617", "city" : "CANTON", "loc" : [ -75.162792, 44.592442 ], "pop" : 11781, "state" : "NY" } +{ "_id" : "13618", "city" : "CAPE VINCENT", "loc" : [ -76.31644300000001, 44.124419 ], "pop" : 1207, "state" : "NY" } +{ "_id" : "13619", "city" : "CARTHAGE", "loc" : [ -75.61600799999999, 43.981039 ], "pop" : 11741, "state" : "NY" } +{ "_id" : "13620", "city" : "CASTORLAND", "loc" : [ -75.460432, 43.88432 ], "pop" : 2335, "state" : "NY" } +{ "_id" : "13621", "city" : "CHASE MILLS", "loc" : [ -75.073002, 44.867246 ], "pop" : 431, "state" : "NY" } +{ "_id" : "13622", "city" : "CHAUMONT", "loc" : [ -76.12316300000001, 44.08481 ], "pop" : 2329, "state" : "NY" } +{ "_id" : "13624", "city" : "FRONTENAC", "loc" : [ -76.107056, 44.217016 ], "pop" : 5480, "state" : "NY" } +{ "_id" : "13625", "city" : "COLTON", "loc" : [ -74.932672, 44.50156 ], "pop" : 2382, "state" : "NY" } +{ "_id" : "13626", "city" : "COPENHAGEN", "loc" : [ -75.683913, 43.880136 ], "pop" : 1891, "state" : "NY" } +{ "_id" : "13630", "city" : "DE KALB JUNCTION", "loc" : [ -75.287088, 44.489551 ], "pop" : 1320, "state" : "NY" } +{ "_id" : "13633", "city" : "DE PEYSTER", "loc" : [ -75.43281399999999, 44.541341 ], "pop" : 95, "state" : "NY" } +{ "_id" : "13634", "city" : "DEXTER", "loc" : [ -76.06498999999999, 44.006923 ], "pop" : 3753, "state" : "NY" } +{ "_id" : "13635", "city" : "EDWARDS", "loc" : [ -75.25222599999999, 44.311048 ], "pop" : 1069, "state" : "NY" } +{ "_id" : "13636", "city" : "ELLISBURG", "loc" : [ -76.125871, 43.737202 ], "pop" : 372, "state" : "NY" } +{ "_id" : "13637", "city" : "EVANS MILLS", "loc" : [ -75.830516, 44.081668 ], "pop" : 3041, "state" : "NY" } +{ "_id" : "13638", "city" : "FELTS MILLS", "loc" : [ -75.752443, 44.020374 ], "pop" : 384, "state" : "NY" } +{ "_id" : "13642", "city" : "GOUVERNEUR", "loc" : [ -75.46506100000001, 44.328302 ], "pop" : 8425, "state" : "NY" } +{ "_id" : "13646", "city" : "HAMMOND", "loc" : [ -75.672749, 44.450155 ], "pop" : 2287, "state" : "NY" } +{ "_id" : "13648", "city" : "HARRISVILLE", "loc" : [ -75.32515100000001, 44.161294 ], "pop" : 2395, "state" : "NY" } +{ "_id" : "13650", "city" : "HENDERSON", "loc" : [ -76.235212, 43.846742 ], "pop" : 300, "state" : "NY" } +{ "_id" : "13652", "city" : "HERMON", "loc" : [ -75.19866399999999, 44.444845 ], "pop" : 1636, "state" : "NY" } +{ "_id" : "13654", "city" : "HEUVELTON", "loc" : [ -75.420345, 44.593034 ], "pop" : 2487, "state" : "NY" } +{ "_id" : "13655", "city" : "HOGANSBURG", "loc" : [ -74.662649, 44.982511 ], "pop" : 1774, "state" : "NY" } +{ "_id" : "13656", "city" : "LA FARGEVILLE", "loc" : [ -75.956902, 44.198709 ], "pop" : 2443, "state" : "NY" } +{ "_id" : "13658", "city" : "LISBON", "loc" : [ -75.269364, 44.718424 ], "pop" : 1265, "state" : "NY" } +{ "_id" : "13659", "city" : "LORRAINE", "loc" : [ -75.905339, 43.756845 ], "pop" : 462, "state" : "NY" } +{ "_id" : "13660", "city" : "MADRID", "loc" : [ -75.14134, 44.768978 ], "pop" : 1840, "state" : "NY" } +{ "_id" : "13661", "city" : "MANNSVILLE", "loc" : [ -76.08203, 43.717905 ], "pop" : 1750, "state" : "NY" } +{ "_id" : "13662", "city" : "MASSENA", "loc" : [ -74.886205, 44.932411 ], "pop" : 16145, "state" : "NY" } +{ "_id" : "13665", "city" : "NATURAL BRIDGE", "loc" : [ -75.503883, 44.062982 ], "pop" : 954, "state" : "NY" } +{ "_id" : "13666", "city" : "NEWTON FALLS", "loc" : [ -74.98456, 44.198584 ], "pop" : 351, "state" : "NY" } +{ "_id" : "13667", "city" : "NORFOLK", "loc" : [ -74.957736, 44.84235 ], "pop" : 4313, "state" : "NY" } +{ "_id" : "13668", "city" : "NORWOOD", "loc" : [ -74.999188, 44.747193 ], "pop" : 4305, "state" : "NY" } +{ "_id" : "13669", "city" : "OGDENSBURG", "loc" : [ -75.477403, 44.690203 ], "pop" : 19659, "state" : "NY" } +{ "_id" : "13670", "city" : "OSWEGATCHIE", "loc" : [ -75.06594699999999, 44.193328 ], "pop" : 287, "state" : "NY" } +{ "_id" : "13672", "city" : "PARISHVILLE", "loc" : [ -74.794062, 44.592655 ], "pop" : 300, "state" : "NY" } +{ "_id" : "13673", "city" : "PHILADELPHIA", "loc" : [ -75.709917, 44.158896 ], "pop" : 2393, "state" : "NY" } +{ "_id" : "13675", "city" : "PLESSIS", "loc" : [ -75.849577, 44.277364 ], "pop" : 111, "state" : "NY" } +{ "_id" : "13676", "city" : "POTSDAM", "loc" : [ -74.968076, 44.659246 ], "pop" : 16342, "state" : "NY" } +{ "_id" : "13679", "city" : "REDWOOD", "loc" : [ -75.814975, 44.321077 ], "pop" : 1735, "state" : "NY" } +{ "_id" : "13680", "city" : "RENSSELAER FALLS", "loc" : [ -75.32261, 44.590635 ], "pop" : 1027, "state" : "NY" } +{ "_id" : "13681", "city" : "RICHVILLE", "loc" : [ -75.402455, 44.40454 ], "pop" : 1502, "state" : "NY" } +{ "_id" : "13682", "city" : "RODMAN", "loc" : [ -75.87187900000001, 43.862217 ], "pop" : 1097, "state" : "NY" } +{ "_id" : "13684", "city" : "DEGRASSE", "loc" : [ -75.113778, 44.380668 ], "pop" : 717, "state" : "NY" } +{ "_id" : "13685", "city" : "SACKETS HARBOR", "loc" : [ -76.105039, 43.93983 ], "pop" : 1943, "state" : "NY" } +{ "_id" : "13687", "city" : "SOUTH COLTON", "loc" : [ -74.860726, 44.504097 ], "pop" : 169, "state" : "NY" } +{ "_id" : "13690", "city" : "STAR LAKE", "loc" : [ -75.03301500000001, 44.157762 ], "pop" : 1108, "state" : "NY" } +{ "_id" : "13691", "city" : "THERESA", "loc" : [ -75.801419, 44.211288 ], "pop" : 2558, "state" : "NY" } +{ "_id" : "13693", "city" : "THREE MILE BAY", "loc" : [ -76.26893, 44.055102 ], "pop" : 250, "state" : "NY" } +{ "_id" : "13694", "city" : "WADDINGTON", "loc" : [ -75.204887, 44.856373 ], "pop" : 1380, "state" : "NY" } +{ "_id" : "13695", "city" : "WANAKENA", "loc" : [ -75.090765, 44.2184 ], "pop" : 705, "state" : "NY" } +{ "_id" : "13696", "city" : "WEST STOCKHOLM", "loc" : [ -74.891932, 44.728951 ], "pop" : 301, "state" : "NY" } +{ "_id" : "13697", "city" : "WINTHROP", "loc" : [ -74.806586, 44.758289 ], "pop" : 2805, "state" : "NY" } +{ "_id" : "13698", "city" : "WOODVILLE", "loc" : [ -76.17200200000001, 43.781245 ], "pop" : 847, "state" : "NY" } +{ "_id" : "13730", "city" : "AFTON", "loc" : [ -75.536604, 42.241737 ], "pop" : 2801, "state" : "NY" } +{ "_id" : "13731", "city" : "ANDES", "loc" : [ -74.788726, 42.156925 ], "pop" : 985, "state" : "NY" } +{ "_id" : "13732", "city" : "APALACHIN", "loc" : [ -76.15194, 42.055579 ], "pop" : 8712, "state" : "NY" } +{ "_id" : "13733", "city" : "BAINBRIDGE", "loc" : [ -75.489411, 42.311975 ], "pop" : 5073, "state" : "NY" } +{ "_id" : "13734", "city" : "BARTON", "loc" : [ -76.398349, 42.069534 ], "pop" : 2081, "state" : "NY" } +{ "_id" : "13736", "city" : "BERKSHIRE", "loc" : [ -76.192008, 42.307435 ], "pop" : 2652, "state" : "NY" } +{ "_id" : "13739", "city" : "BLOOMVILLE", "loc" : [ -74.807118, 42.352236 ], "pop" : 1022, "state" : "NY" } +{ "_id" : "13740", "city" : "BOVINA CENTER", "loc" : [ -74.76611200000001, 42.27094 ], "pop" : 492, "state" : "NY" } +{ "_id" : "13743", "city" : "CANDOR", "loc" : [ -76.332196, 42.206274 ], "pop" : 4850, "state" : "NY" } +{ "_id" : "13744", "city" : "CASTLE CREEK", "loc" : [ -75.90874599999999, 42.256805 ], "pop" : 581, "state" : "NY" } +{ "_id" : "13746", "city" : "CHENANGO FORKS", "loc" : [ -75.824236, 42.263659 ], "pop" : 3833, "state" : "NY" } +{ "_id" : "13748", "city" : "CONKLIN", "loc" : [ -75.807624, 42.045429 ], "pop" : 4058, "state" : "NY" } +{ "_id" : "13750", "city" : "DAVENPORT", "loc" : [ -74.83570899999999, 42.471081 ], "pop" : 777, "state" : "NY" } +{ "_id" : "13751", "city" : "DAVENPORT CENTER", "loc" : [ -74.906975, 42.452303 ], "pop" : 62, "state" : "NY" } +{ "_id" : "13752", "city" : "DE LANCEY", "loc" : [ -74.922899, 42.188984 ], "pop" : 785, "state" : "NY" } +{ "_id" : "13753", "city" : "MEREDITH", "loc" : [ -74.92282299999999, 42.287851 ], "pop" : 5399, "state" : "NY" } +{ "_id" : "13754", "city" : "DEPOSIT", "loc" : [ -75.42874500000001, 42.066581 ], "pop" : 3047, "state" : "NY" } +{ "_id" : "13755", "city" : "DOWNSVILLE", "loc" : [ -75.015216, 42.071634 ], "pop" : 615, "state" : "NY" } +{ "_id" : "13756", "city" : "EAST BRANCH", "loc" : [ -75.12518900000001, 41.984366 ], "pop" : 839, "state" : "NY" } +{ "_id" : "13757", "city" : "EAST MEREDITH", "loc" : [ -74.89869899999999, 42.410098 ], "pop" : 1478, "state" : "NY" } +{ "_id" : "13760", "city" : "ENDWELL", "loc" : [ -76.056927, 42.114089 ], "pop" : 46236, "state" : "NY" } +{ "_id" : "13775", "city" : "FRANKLIN", "loc" : [ -75.148475, 42.342117 ], "pop" : 1807, "state" : "NY" } +{ "_id" : "13776", "city" : "GILBERTSVILLE", "loc" : [ -75.360929, 42.432951 ], "pop" : 10, "state" : "NY" } +{ "_id" : "13777", "city" : "GLEN AUBREY", "loc" : [ -75.98054399999999, 42.257289 ], "pop" : 1380, "state" : "NY" } +{ "_id" : "13778", "city" : "GREENE", "loc" : [ -75.75954, 42.337301 ], "pop" : 5025, "state" : "NY" } +{ "_id" : "13780", "city" : "GUILFORD", "loc" : [ -75.48231800000001, 42.426901 ], "pop" : 738, "state" : "NY" } +{ "_id" : "13782", "city" : "HAMDEN", "loc" : [ -74.998391, 42.17873 ], "pop" : 928, "state" : "NY" } +{ "_id" : "13783", "city" : "CADOSIA", "loc" : [ -75.265306, 41.959667 ], "pop" : 2766, "state" : "NY" } +{ "_id" : "13786", "city" : "HARPERSFIELD", "loc" : [ -74.687059, 42.449901 ], "pop" : 309, "state" : "NY" } +{ "_id" : "13787", "city" : "HARPURSVILLE", "loc" : [ -75.654538, 42.18232 ], "pop" : 4349, "state" : "NY" } +{ "_id" : "13788", "city" : "HOBART", "loc" : [ -74.675889, 42.359409 ], "pop" : 975, "state" : "NY" } +{ "_id" : "13790", "city" : "JOHNSON CITY", "loc" : [ -75.968492, 42.126683 ], "pop" : 20788, "state" : "NY" } +{ "_id" : "13795", "city" : "KIRKWOOD", "loc" : [ -75.796711, 42.069463 ], "pop" : 4133, "state" : "NY" } +{ "_id" : "13796", "city" : "LAURENS", "loc" : [ -75.12794700000001, 42.538261 ], "pop" : 1703, "state" : "NY" } +{ "_id" : "13797", "city" : "LISLE", "loc" : [ -76.030237, 42.340923 ], "pop" : 2331, "state" : "NY" } +{ "_id" : "13801", "city" : "MC DONOUGH", "loc" : [ -75.762305, 42.506807 ], "pop" : 881, "state" : "NY" } +{ "_id" : "13802", "city" : "MAINE", "loc" : [ -76.05952600000001, 42.196204 ], "pop" : 254, "state" : "NY" } +{ "_id" : "13803", "city" : "MARATHON", "loc" : [ -76.039526, 42.452725 ], "pop" : 3586, "state" : "NY" } +{ "_id" : "13804", "city" : "MASONVILLE", "loc" : [ -75.215485, 42.262346 ], "pop" : 15, "state" : "NY" } +{ "_id" : "13806", "city" : "MERIDALE", "loc" : [ -74.98025800000001, 42.377987 ], "pop" : 16, "state" : "NY" } +{ "_id" : "13807", "city" : "MILFORD", "loc" : [ -74.968498, 42.614801 ], "pop" : 1409, "state" : "NY" } +{ "_id" : "13808", "city" : "MORRIS", "loc" : [ -75.244764, 42.547807 ], "pop" : 1359, "state" : "NY" } +{ "_id" : "13809", "city" : "MOUNT UPTON", "loc" : [ -75.400268, 42.408064 ], "pop" : 1462, "state" : "NY" } +{ "_id" : "13810", "city" : "MOUNT VISION", "loc" : [ -75.126366, 42.606763 ], "pop" : 1261, "state" : "NY" } +{ "_id" : "13811", "city" : "NEWARK VALLEY", "loc" : [ -76.16248, 42.228136 ], "pop" : 4968, "state" : "NY" } +{ "_id" : "13812", "city" : "NICHOLS", "loc" : [ -76.36103900000001, 42.031961 ], "pop" : 2888, "state" : "NY" } +{ "_id" : "13813", "city" : "NINEVEH", "loc" : [ -75.54840900000001, 42.162481 ], "pop" : 975, "state" : "NY" } +{ "_id" : "13815", "city" : "NORWICH", "loc" : [ -75.52743100000001, 42.54145 ], "pop" : 15380, "state" : "NY" } +{ "_id" : "13820", "city" : "ONEONTA", "loc" : [ -75.049072, 42.462453 ], "pop" : 18196, "state" : "NY" } +{ "_id" : "13825", "city" : "OTEGO", "loc" : [ -75.207883, 42.41333 ], "pop" : 5075, "state" : "NY" } +{ "_id" : "13826", "city" : "OUAQUAGA", "loc" : [ -75.647351, 42.119293 ], "pop" : 75, "state" : "NY" } +{ "_id" : "13827", "city" : "OWEGO", "loc" : [ -76.252797, 42.113809 ], "pop" : 11378, "state" : "NY" } +{ "_id" : "13830", "city" : "BRISBEN", "loc" : [ -75.606256, 42.443375 ], "pop" : 5086, "state" : "NY" } +{ "_id" : "13832", "city" : "PLYMOUTH", "loc" : [ -75.61716300000001, 42.633592 ], "pop" : 445, "state" : "NY" } +{ "_id" : "13833", "city" : "SANITARIA SPRING", "loc" : [ -75.790978, 42.195735 ], "pop" : 4777, "state" : "NY" } +{ "_id" : "13834", "city" : "PORTLANDVILLE", "loc" : [ -74.97605900000001, 42.510303 ], "pop" : 916, "state" : "NY" } +{ "_id" : "13835", "city" : "RICHFORD", "loc" : [ -76.18650100000001, 42.394521 ], "pop" : 1383, "state" : "NY" } +{ "_id" : "13838", "city" : "SIDNEY", "loc" : [ -75.3908, 42.307368 ], "pop" : 4946, "state" : "NY" } +{ "_id" : "13839", "city" : "SIDNEY CENTER", "loc" : [ -75.287057, 42.244085 ], "pop" : 2020, "state" : "NY" } +{ "_id" : "13841", "city" : "SMITHVILLE FLATS", "loc" : [ -75.823719, 42.398894 ], "pop" : 484, "state" : "NY" } +{ "_id" : "13842", "city" : "SOUTH KORTRIGHT", "loc" : [ -74.72590099999999, 42.376994 ], "pop" : 253, "state" : "NY" } +{ "_id" : "13843", "city" : "SOUTH NEW BERLIN", "loc" : [ -75.35249, 42.530569 ], "pop" : 2702, "state" : "NY" } +{ "_id" : "13844", "city" : "SOUTH PLYMOUTH", "loc" : [ -75.633, 42.605254 ], "pop" : 510, "state" : "NY" } +{ "_id" : "13846", "city" : "TREADWELL", "loc" : [ -75.05875399999999, 42.362963 ], "pop" : 60, "state" : "NY" } +{ "_id" : "13849", "city" : "UNADILLA", "loc" : [ -75.336589, 42.325199 ], "pop" : 4027, "state" : "NY" } +{ "_id" : "13850", "city" : "VESTAL", "loc" : [ -76.011757, 42.077106 ], "pop" : 27686, "state" : "NY" } +{ "_id" : "13856", "city" : "WALTON", "loc" : [ -75.153177, 42.175647 ], "pop" : 7282, "state" : "NY" } +{ "_id" : "13859", "city" : "WELLS BRIDGE", "loc" : [ -75.25656499999999, 42.357973 ], "pop" : 232, "state" : "NY" } +{ "_id" : "13861", "city" : "WEST ONEONTA", "loc" : [ -75.09568899999999, 42.453854 ], "pop" : 3471, "state" : "NY" } +{ "_id" : "13862", "city" : "WHITNEY POINT", "loc" : [ -75.952231, 42.338449 ], "pop" : 4105, "state" : "NY" } +{ "_id" : "13863", "city" : "WILLET", "loc" : [ -75.90143399999999, 42.452044 ], "pop" : 188, "state" : "NY" } +{ "_id" : "13864", "city" : "WILLSEYVILLE", "loc" : [ -76.38972099999999, 42.302915 ], "pop" : 697, "state" : "NY" } +{ "_id" : "13865", "city" : "WINDSOR", "loc" : [ -75.672828, 42.074482 ], "pop" : 6820, "state" : "NY" } +{ "_id" : "13901", "city" : "BINGHAMTON", "loc" : [ -75.886517, 42.146307 ], "pop" : 21666, "state" : "NY" } +{ "_id" : "13903", "city" : "BINGHAMTON", "loc" : [ -75.897676, 42.081102 ], "pop" : 20353, "state" : "NY" } +{ "_id" : "13904", "city" : "BINGHAMTON", "loc" : [ -75.865269, 42.11714 ], "pop" : 10257, "state" : "NY" } +{ "_id" : "13905", "city" : "BINGHAMTON", "loc" : [ -75.930865, 42.115051 ], "pop" : 30741, "state" : "NY" } +{ "_id" : "14001", "city" : "AKRON", "loc" : [ -78.508365, 43.024944 ], "pop" : 7924, "state" : "NY" } +{ "_id" : "14003", "city" : "ALABAMA", "loc" : [ -78.385231, 43.071888 ], "pop" : 68, "state" : "NY" } +{ "_id" : "14004", "city" : "ALDEN", "loc" : [ -78.525707, 42.89839 ], "pop" : 12711, "state" : "NY" } +{ "_id" : "14005", "city" : "ALEXANDER", "loc" : [ -78.25888999999999, 42.915851 ], "pop" : 1692, "state" : "NY" } +{ "_id" : "14006", "city" : "ANGOLA", "loc" : [ -79.049651, 42.636581 ], "pop" : 11509, "state" : "NY" } +{ "_id" : "14008", "city" : "APPLETON", "loc" : [ -78.63721700000001, 43.310535 ], "pop" : 940, "state" : "NY" } +{ "_id" : "14009", "city" : "ARCADE", "loc" : [ -78.41341799999999, 42.562995 ], "pop" : 4898, "state" : "NY" } +{ "_id" : "14011", "city" : "ATTICA", "loc" : [ -78.279826, 42.849918 ], "pop" : 9372, "state" : "NY" } +{ "_id" : "14012", "city" : "BARKER", "loc" : [ -78.54200400000001, 43.336779 ], "pop" : 2441, "state" : "NY" } +{ "_id" : "14013", "city" : "BASOM", "loc" : [ -78.395143, 43.080724 ], "pop" : 2062, "state" : "NY" } +{ "_id" : "14020", "city" : "BATAVIA", "loc" : [ -78.192869, 43.000316 ], "pop" : 22835, "state" : "NY" } +{ "_id" : "14024", "city" : "BLISS", "loc" : [ -78.258084, 42.579936 ], "pop" : 1498, "state" : "NY" } +{ "_id" : "14025", "city" : "BOSTON", "loc" : [ -78.73909, 42.631384 ], "pop" : 2617, "state" : "NY" } +{ "_id" : "14026", "city" : "BOWMANSVILLE", "loc" : [ -78.68296100000001, 42.947826 ], "pop" : 285, "state" : "NY" } +{ "_id" : "14028", "city" : "BURT", "loc" : [ -78.714097, 43.322089 ], "pop" : 2363, "state" : "NY" } +{ "_id" : "14030", "city" : "CHAFFEE", "loc" : [ -78.502543, 42.560492 ], "pop" : 1481, "state" : "NY" } +{ "_id" : "14031", "city" : "CLARENCE", "loc" : [ -78.61622800000001, 42.980965 ], "pop" : 7712, "state" : "NY" } +{ "_id" : "14032", "city" : "CLARENCE CENTER", "loc" : [ -78.63903000000001, 43.0362 ], "pop" : 3996, "state" : "NY" } +{ "_id" : "14033", "city" : "COLDEN", "loc" : [ -78.692078, 42.655052 ], "pop" : 2380, "state" : "NY" } +{ "_id" : "14034", "city" : "COLLINS", "loc" : [ -78.892974, 42.500082 ], "pop" : 2194, "state" : "NY" } +{ "_id" : "14036", "city" : "CORFU", "loc" : [ -78.392906, 42.977734 ], "pop" : 4841, "state" : "NY" } +{ "_id" : "14037", "city" : "COWLESVILLE", "loc" : [ -78.44813600000001, 42.811245 ], "pop" : 1017, "state" : "NY" } +{ "_id" : "14039", "city" : "DALE", "loc" : [ -78.174865, 42.826284 ], "pop" : 72, "state" : "NY" } +{ "_id" : "14040", "city" : "DARIEN CENTER", "loc" : [ -78.387782, 42.894806 ], "pop" : 1817, "state" : "NY" } +{ "_id" : "14041", "city" : "DAYTON", "loc" : [ -78.981842, 42.423075 ], "pop" : 246, "state" : "NY" } +{ "_id" : "14042", "city" : "DELEVAN", "loc" : [ -78.479326, 42.492598 ], "pop" : 4516, "state" : "NY" } +{ "_id" : "14043", "city" : "DEPEW", "loc" : [ -78.704052, 42.904973 ], "pop" : 26460, "state" : "NY" } +{ "_id" : "14047", "city" : "DERBY", "loc" : [ -78.98336500000001, 42.697445 ], "pop" : 6436, "state" : "NY" } +{ "_id" : "14048", "city" : "VAN BUREN BAY", "loc" : [ -79.32936599999999, 42.475907 ], "pop" : 20303, "state" : "NY" } +{ "_id" : "14051", "city" : "SWORMVILLE", "loc" : [ -78.705035, 43.029168 ], "pop" : 12714, "state" : "NY" } +{ "_id" : "14052", "city" : "EAST AURORA", "loc" : [ -78.601992, 42.770138 ], "pop" : 17244, "state" : "NY" } +{ "_id" : "14054", "city" : "EAST BETHANY", "loc" : [ -78.13420600000001, 42.916619 ], "pop" : 1569, "state" : "NY" } +{ "_id" : "14055", "city" : "EAST CONCORD", "loc" : [ -78.610972, 42.546585 ], "pop" : 1216, "state" : "NY" } +{ "_id" : "14057", "city" : "EDEN", "loc" : [ -78.878077, 42.650552 ], "pop" : 7427, "state" : "NY" } +{ "_id" : "14058", "city" : "ELBA", "loc" : [ -78.170383, 43.089739 ], "pop" : 2331, "state" : "NY" } +{ "_id" : "14059", "city" : "ELMA", "loc" : [ -78.63425700000001, 42.834002 ], "pop" : 8130, "state" : "NY" } +{ "_id" : "14060", "city" : "FARMERSVILLE STA", "loc" : [ -78.291533, 42.44827 ], "pop" : 395, "state" : "NY" } +{ "_id" : "14062", "city" : "FORESTVILLE", "loc" : [ -79.160743, 42.448229 ], "pop" : 2858, "state" : "NY" } +{ "_id" : "14063", "city" : "FREDONIA", "loc" : [ -79.33391399999999, 42.433345 ], "pop" : 10738, "state" : "NY" } +{ "_id" : "14065", "city" : "FREEDOM", "loc" : [ -78.35012999999999, 42.489693 ], "pop" : 2001, "state" : "NY" } +{ "_id" : "14066", "city" : "GAINESVILLE", "loc" : [ -78.17951600000001, 42.61897 ], "pop" : 1536, "state" : "NY" } +{ "_id" : "14067", "city" : "GASPORT", "loc" : [ -78.57453599999999, 43.210587 ], "pop" : 6010, "state" : "NY" } +{ "_id" : "14068", "city" : "GETZVILLE", "loc" : [ -78.753184, 43.023989 ], "pop" : 5685, "state" : "NY" } +{ "_id" : "14069", "city" : "GLENWOOD", "loc" : [ -78.638634, 42.600094 ], "pop" : 632, "state" : "NY" } +{ "_id" : "14070", "city" : "GOWANDA", "loc" : [ -78.933902, 42.471202 ], "pop" : 6665, "state" : "NY" } +{ "_id" : "14072", "city" : "GRAND ISLAND", "loc" : [ -78.959059, 43.018266 ], "pop" : 17561, "state" : "NY" } +{ "_id" : "14075", "city" : "HAMBURG", "loc" : [ -78.838853, 42.733404 ], "pop" : 38851, "state" : "NY" } +{ "_id" : "14080", "city" : "HOLLAND", "loc" : [ -78.54388899999999, 42.639582 ], "pop" : 4004, "state" : "NY" } +{ "_id" : "14081", "city" : "IRVING", "loc" : [ -79.059634, 42.573866 ], "pop" : 2993, "state" : "NY" } +{ "_id" : "14082", "city" : "JAVA CENTER", "loc" : [ -78.392527, 42.66342 ], "pop" : 613, "state" : "NY" } +{ "_id" : "14083", "city" : "JAVA VILLAGE", "loc" : [ -78.44101000000001, 42.676852 ], "pop" : 35, "state" : "NY" } +{ "_id" : "14085", "city" : "LAKE VIEW", "loc" : [ -78.932693, 42.721535 ], "pop" : 4936, "state" : "NY" } +{ "_id" : "14086", "city" : "LANCASTER", "loc" : [ -78.663085, 42.901681 ], "pop" : 24540, "state" : "NY" } +{ "_id" : "14091", "city" : "LAWTONS", "loc" : [ -78.921222, 42.540364 ], "pop" : 1510, "state" : "NY" } +{ "_id" : "14092", "city" : "LEWISTON", "loc" : [ -79.021547, 43.172165 ], "pop" : 10540, "state" : "NY" } +{ "_id" : "14094", "city" : "LOCKPORT", "loc" : [ -78.69234400000001, 43.159987 ], "pop" : 48398, "state" : "NY" } +{ "_id" : "14098", "city" : "LYNDONVILLE", "loc" : [ -78.381057, 43.323312 ], "pop" : 3109, "state" : "NY" } +{ "_id" : "14101", "city" : "MACHIAS", "loc" : [ -78.50586, 42.408271 ], "pop" : 1860, "state" : "NY" } +{ "_id" : "14102", "city" : "MARILLA", "loc" : [ -78.558656, 42.833216 ], "pop" : 1063, "state" : "NY" } +{ "_id" : "14103", "city" : "MEDINA", "loc" : [ -78.387422, 43.218428 ], "pop" : 12042, "state" : "NY" } +{ "_id" : "14105", "city" : "MIDDLEPORT", "loc" : [ -78.484055, 43.218257 ], "pop" : 3929, "state" : "NY" } +{ "_id" : "14108", "city" : "NEWFANE", "loc" : [ -78.70697199999999, 43.272443 ], "pop" : 5261, "state" : "NY" } +{ "_id" : "14111", "city" : "NORTH COLLINS", "loc" : [ -78.91073, 42.589648 ], "pop" : 2429, "state" : "NY" } +{ "_id" : "14113", "city" : "NORTH JAVA", "loc" : [ -78.337958, 42.677631 ], "pop" : 606, "state" : "NY" } +{ "_id" : "14120", "city" : "NORTH TONAWANDA", "loc" : [ -78.85099700000001, 43.049828 ], "pop" : 51399, "state" : "NY" } +{ "_id" : "14125", "city" : "OAKFIELD", "loc" : [ -78.270179, 43.071726 ], "pop" : 3760, "state" : "NY" } +{ "_id" : "14127", "city" : "ORCHARD PARK", "loc" : [ -78.751834, 42.763891 ], "pop" : 26554, "state" : "NY" } +{ "_id" : "14129", "city" : "PERRYSBURG", "loc" : [ -78.998108, 42.472289 ], "pop" : 2198, "state" : "NY" } +{ "_id" : "14131", "city" : "RANSOMVILLE", "loc" : [ -78.89815900000001, 43.228602 ], "pop" : 5836, "state" : "NY" } +{ "_id" : "14132", "city" : "SANBORN", "loc" : [ -78.878522, 43.141879 ], "pop" : 5167, "state" : "NY" } +{ "_id" : "14134", "city" : "SARDINIA", "loc" : [ -78.506415, 42.532976 ], "pop" : 133, "state" : "NY" } +{ "_id" : "14136", "city" : "SILVER CREEK", "loc" : [ -79.16280500000001, 42.535675 ], "pop" : 5768, "state" : "NY" } +{ "_id" : "14138", "city" : "SOUTH DAYTON", "loc" : [ -79.050132, 42.371803 ], "pop" : 1600, "state" : "NY" } +{ "_id" : "14139", "city" : "SOUTH WALES", "loc" : [ -78.545219, 42.706271 ], "pop" : 2269, "state" : "NY" } +{ "_id" : "14141", "city" : "SPRINGVILLE", "loc" : [ -78.68471700000001, 42.519982 ], "pop" : 7146, "state" : "NY" } +{ "_id" : "14143", "city" : "STAFFORD", "loc" : [ -78.089783, 42.982894 ], "pop" : 2076, "state" : "NY" } +{ "_id" : "14145", "city" : "STRYKERSVILLE", "loc" : [ -78.434714, 42.724892 ], "pop" : 1374, "state" : "NY" } +{ "_id" : "14150", "city" : "TONAWANDA", "loc" : [ -78.85472, 43.002837 ], "pop" : 53410, "state" : "NY" } +{ "_id" : "14167", "city" : "VARYSBURG", "loc" : [ -78.316749, 42.745935 ], "pop" : 1782, "state" : "NY" } +{ "_id" : "14170", "city" : "WEST FALLS", "loc" : [ -78.677937, 42.70532 ], "pop" : 2217, "state" : "NY" } +{ "_id" : "14171", "city" : "WEST VALLEY", "loc" : [ -78.627978, 42.43153 ], "pop" : 2600, "state" : "NY" } +{ "_id" : "14172", "city" : "WILSON", "loc" : [ -78.82439599999999, 43.29681 ], "pop" : 3441, "state" : "NY" } +{ "_id" : "14174", "city" : "YOUNGSTOWN", "loc" : [ -79.024545, 43.246075 ], "pop" : 5728, "state" : "NY" } +{ "_id" : "14201", "city" : "BUFFALO", "loc" : [ -78.884575, 42.896659 ], "pop" : 16682, "state" : "NY" } +{ "_id" : "14202", "city" : "BUFFALO", "loc" : [ -78.877948, 42.887038 ], "pop" : 2828, "state" : "NY" } +{ "_id" : "14203", "city" : "BUFFALO", "loc" : [ -78.868143, 42.893938 ], "pop" : 1211, "state" : "NY" } +{ "_id" : "14204", "city" : "BUFFALO", "loc" : [ -78.859736, 42.883978 ], "pop" : 10962, "state" : "NY" } +{ "_id" : "14206", "city" : "BUFFALO", "loc" : [ -78.81037499999999, 42.881132 ], "pop" : 25496, "state" : "NY" } +{ "_id" : "14207", "city" : "BUFFALO", "loc" : [ -78.89781499999999, 42.949062 ], "pop" : 23890, "state" : "NY" } +{ "_id" : "14208", "city" : "BUFFALO", "loc" : [ -78.850487, 42.915416 ], "pop" : 14705, "state" : "NY" } +{ "_id" : "14209", "city" : "BUFFALO", "loc" : [ -78.865629, 42.913 ], "pop" : 8865, "state" : "NY" } +{ "_id" : "14210", "city" : "BUFFALO", "loc" : [ -78.82055, 42.861432 ], "pop" : 18506, "state" : "NY" } +{ "_id" : "14211", "city" : "BUFFALO", "loc" : [ -78.82247700000001, 42.908153 ], "pop" : 38411, "state" : "NY" } +{ "_id" : "14212", "city" : "BUFFALO", "loc" : [ -78.82445800000001, 42.894553 ], "pop" : 19935, "state" : "NY" } +{ "_id" : "14213", "city" : "BUFFALO", "loc" : [ -78.889461, 42.916675 ], "pop" : 32876, "state" : "NY" } +{ "_id" : "14214", "city" : "BUFFALO", "loc" : [ -78.83740299999999, 42.941429 ], "pop" : 21770, "state" : "NY" } +{ "_id" : "14215", "city" : "BUFFALO", "loc" : [ -78.811504, 42.933536 ], "pop" : 46789, "state" : "NY" } +{ "_id" : "14216", "city" : "BUFFALO", "loc" : [ -78.859865, 42.949914 ], "pop" : 24852, "state" : "NY" } +{ "_id" : "14217", "city" : "KENMORE", "loc" : [ -78.87294799999999, 42.968618 ], "pop" : 25547, "state" : "NY" } +{ "_id" : "14218", "city" : "LACKAWANNA", "loc" : [ -78.817263, 42.818301 ], "pop" : 22309, "state" : "NY" } +{ "_id" : "14219", "city" : "BLASDELL", "loc" : [ -78.822228, 42.790039 ], "pop" : 13376, "state" : "NY" } +{ "_id" : "14220", "city" : "BUFFALO", "loc" : [ -78.81820500000001, 42.844138 ], "pop" : 28994, "state" : "NY" } +{ "_id" : "14221", "city" : "WILLIAMSVILLE", "loc" : [ -78.738044, 42.985621 ], "pop" : 54703, "state" : "NY" } +{ "_id" : "14222", "city" : "BUFFALO", "loc" : [ -78.876333, 42.916401 ], "pop" : 12712, "state" : "NY" } +{ "_id" : "14223", "city" : "BUFFALO", "loc" : [ -78.845, 42.973088 ], "pop" : 25995, "state" : "NY" } +{ "_id" : "14224", "city" : "WEST SENECA", "loc" : [ -78.75109, 42.836162 ], "pop" : 41539, "state" : "NY" } +{ "_id" : "14225", "city" : "CHEEKTOWAGA", "loc" : [ -78.76085500000001, 42.928642 ], "pop" : 37707, "state" : "NY" } +{ "_id" : "14226", "city" : "AMHERST", "loc" : [ -78.79984899999999, 42.967232 ], "pop" : 31912, "state" : "NY" } +{ "_id" : "14227", "city" : "CHEEKTOWAGA", "loc" : [ -78.741936, 42.877467 ], "pop" : 25240, "state" : "NY" } +{ "_id" : "14228", "city" : "AMHERST", "loc" : [ -78.774604, 43.018414 ], "pop" : 1813, "state" : "NY" } +{ "_id" : "14301", "city" : "NIAGARA FALLS", "loc" : [ -79.041443, 43.095467 ], "pop" : 15756, "state" : "NY" } +{ "_id" : "14303", "city" : "NIAGARA FALLS", "loc" : [ -79.036958, 43.087777 ], "pop" : 8616, "state" : "NY" } +{ "_id" : "14304", "city" : "NIAGARA FALLS", "loc" : [ -78.964375, 43.090844 ], "pop" : 30527, "state" : "NY" } +{ "_id" : "14305", "city" : "NIAGARA FALLS", "loc" : [ -79.03780399999999, 43.114648 ], "pop" : 22726, "state" : "NY" } +{ "_id" : "14410", "city" : "ADAMS BASIN", "loc" : [ -77.853905, 43.190644 ], "pop" : 989, "state" : "NY" } +{ "_id" : "14411", "city" : "ALBION", "loc" : [ -78.206846, 43.239827 ], "pop" : 12743, "state" : "NY" } +{ "_id" : "14414", "city" : "AVON", "loc" : [ -77.72739799999999, 42.903034 ], "pop" : 6187, "state" : "NY" } +{ "_id" : "14415", "city" : "BELLONA", "loc" : [ -77.021737, 42.755442 ], "pop" : 182, "state" : "NY" } +{ "_id" : "14416", "city" : "BERGEN", "loc" : [ -77.96033, 43.086937 ], "pop" : 3092, "state" : "NY" } +{ "_id" : "14418", "city" : "BRANCHPORT", "loc" : [ -77.20516499999999, 42.606537 ], "pop" : 1126, "state" : "NY" } +{ "_id" : "14420", "city" : "BROCKPORT", "loc" : [ -77.936797, 43.21284 ], "pop" : 17492, "state" : "NY" } +{ "_id" : "14422", "city" : "BYRON", "loc" : [ -78.062912, 43.073794 ], "pop" : 2499, "state" : "NY" } +{ "_id" : "14423", "city" : "CALEDONIA", "loc" : [ -77.849295, 42.956661 ], "pop" : 4942, "state" : "NY" } +{ "_id" : "14424", "city" : "CANANDAIGUA", "loc" : [ -77.284561, 42.868866 ], "pop" : 20748, "state" : "NY" } +{ "_id" : "14425", "city" : "CANANDAIGUA", "loc" : [ -77.341139, 42.959591 ], "pop" : 10082, "state" : "NY" } +{ "_id" : "14427", "city" : "CASTILE", "loc" : [ -78.054728, 42.635883 ], "pop" : 2169, "state" : "NY" } +{ "_id" : "14428", "city" : "CLIFTON", "loc" : [ -77.860339, 43.089617 ], "pop" : 6481, "state" : "NY" } +{ "_id" : "14432", "city" : "CLIFTON SPRINGS", "loc" : [ -77.143975, 42.963175 ], "pop" : 5060, "state" : "NY" } +{ "_id" : "14433", "city" : "CLYDE", "loc" : [ -76.87246399999999, 43.085549 ], "pop" : 4565, "state" : "NY" } +{ "_id" : "14435", "city" : "CONESUS", "loc" : [ -77.67469, 42.721643 ], "pop" : 2364, "state" : "NY" } +{ "_id" : "14437", "city" : "DANSVILLE", "loc" : [ -77.71090700000001, 42.569975 ], "pop" : 8804, "state" : "NY" } +{ "_id" : "14441", "city" : "DRESDEN", "loc" : [ -76.956389, 42.684565 ], "pop" : 381, "state" : "NY" } +{ "_id" : "14445", "city" : "EAST ROCHESTER", "loc" : [ -77.490596, 43.112808 ], "pop" : 8868, "state" : "NY" } +{ "_id" : "14450", "city" : "FAIRPORT", "loc" : [ -77.435956, 43.089198 ], "pop" : 37337, "state" : "NY" } +{ "_id" : "14454", "city" : "GENESEO", "loc" : [ -77.79955200000001, 42.793783 ], "pop" : 9551, "state" : "NY" } +{ "_id" : "14456", "city" : "GENEVA", "loc" : [ -76.991349, 42.86372 ], "pop" : 20112, "state" : "NY" } +{ "_id" : "14462", "city" : "GROVELAND", "loc" : [ -77.757334, 42.676046 ], "pop" : 483, "state" : "NY" } +{ "_id" : "14464", "city" : "HAMLIN", "loc" : [ -77.926996, 43.307577 ], "pop" : 7355, "state" : "NY" } +{ "_id" : "14466", "city" : "HEMLOCK", "loc" : [ -77.58199, 42.779957 ], "pop" : 1160, "state" : "NY" } +{ "_id" : "14467", "city" : "HENRIETTA", "loc" : [ -77.612224, 43.048264 ], "pop" : 8450, "state" : "NY" } +{ "_id" : "14468", "city" : "HILTON", "loc" : [ -77.790511, 43.292344 ], "pop" : 15837, "state" : "NY" } +{ "_id" : "14469", "city" : "BLOOMFIELD", "loc" : [ -77.45998299999999, 42.885101 ], "pop" : 6129, "state" : "NY" } +{ "_id" : "14470", "city" : "HULBERTON", "loc" : [ -78.040392, 43.225494 ], "pop" : 8375, "state" : "NY" } +{ "_id" : "14471", "city" : "HONEOYE", "loc" : [ -77.50543399999999, 42.768637 ], "pop" : 2704, "state" : "NY" } +{ "_id" : "14472", "city" : "HONEOYE FALLS", "loc" : [ -77.57812, 42.969499 ], "pop" : 6768, "state" : "NY" } +{ "_id" : "14475", "city" : "IONIA", "loc" : [ -77.50086, 42.938002 ], "pop" : 232, "state" : "NY" } +{ "_id" : "14476", "city" : "KENDALL", "loc" : [ -78.030359, 43.328415 ], "pop" : 2186, "state" : "NY" } +{ "_id" : "14477", "city" : "KENT", "loc" : [ -78.135533, 43.334064 ], "pop" : 2040, "state" : "NY" } +{ "_id" : "14478", "city" : "BLUFF POINT", "loc" : [ -77.105197, 42.601032 ], "pop" : 1555, "state" : "NY" } +{ "_id" : "14480", "city" : "LAKEVILLE", "loc" : [ -77.714865, 42.82957 ], "pop" : 724, "state" : "NY" } +{ "_id" : "14481", "city" : "LEICESTER", "loc" : [ -77.898976, 42.773903 ], "pop" : 1881, "state" : "NY" } +{ "_id" : "14482", "city" : "LE ROY", "loc" : [ -77.985097, 42.977377 ], "pop" : 9037, "state" : "NY" } +{ "_id" : "14485", "city" : "LIMA", "loc" : [ -77.608305, 42.901234 ], "pop" : 4666, "state" : "NY" } +{ "_id" : "14486", "city" : "LINWOOD", "loc" : [ -77.910422, 42.884721 ], "pop" : 860, "state" : "NY" } +{ "_id" : "14487", "city" : "LIVONIA", "loc" : [ -77.663472, 42.813514 ], "pop" : 6108, "state" : "NY" } +{ "_id" : "14489", "city" : "LYONS", "loc" : [ -76.989575, 43.07768 ], "pop" : 8168, "state" : "NY" } +{ "_id" : "14502", "city" : "MACEDON", "loc" : [ -77.337199, 43.078366 ], "pop" : 8486, "state" : "NY" } +{ "_id" : "14504", "city" : "MANCHESTER", "loc" : [ -77.229733, 42.969874 ], "pop" : 1522, "state" : "NY" } +{ "_id" : "14505", "city" : "MARION", "loc" : [ -77.186277, 43.154612 ], "pop" : 4663, "state" : "NY" } +{ "_id" : "14506", "city" : "MENDON", "loc" : [ -77.50013, 42.995307 ], "pop" : 864, "state" : "NY" } +{ "_id" : "14507", "city" : "MIDDLESEX", "loc" : [ -77.280509, 42.697624 ], "pop" : 1256, "state" : "NY" } +{ "_id" : "14510", "city" : "TUSCARORA", "loc" : [ -77.86108299999999, 42.705431 ], "pop" : 7145, "state" : "NY" } +{ "_id" : "14512", "city" : "NAPLES", "loc" : [ -77.390106, 42.640425 ], "pop" : 4616, "state" : "NY" } +{ "_id" : "14513", "city" : "NEWARK", "loc" : [ -77.09460199999999, 43.051909 ], "pop" : 14670, "state" : "NY" } +{ "_id" : "14514", "city" : "NORTH CHILI", "loc" : [ -77.800518, 43.118601 ], "pop" : 4014, "state" : "NY" } +{ "_id" : "14516", "city" : "NORTH ROSE", "loc" : [ -76.91515200000001, 43.196439 ], "pop" : 2428, "state" : "NY" } +{ "_id" : "14517", "city" : "NUNDA", "loc" : [ -77.91800600000001, 42.586708 ], "pop" : 2439, "state" : "NY" } +{ "_id" : "14519", "city" : "ONTARIO", "loc" : [ -77.308781, 43.229092 ], "pop" : 10016, "state" : "NY" } +{ "_id" : "14521", "city" : "HAYT CORNERS", "loc" : [ -76.821575, 42.676979 ], "pop" : 3225, "state" : "NY" } +{ "_id" : "14522", "city" : "PALMYRA", "loc" : [ -77.22179800000001, 43.062192 ], "pop" : 9486, "state" : "NY" } +{ "_id" : "14525", "city" : "LINWOOD", "loc" : [ -78.014698, 42.880088 ], "pop" : 2628, "state" : "NY" } +{ "_id" : "14526", "city" : "PENFIELD", "loc" : [ -77.45604299999999, 43.139638 ], "pop" : 16675, "state" : "NY" } +{ "_id" : "14527", "city" : "PENN YAN", "loc" : [ -77.05687, 42.664548 ], "pop" : 11609, "state" : "NY" } +{ "_id" : "14530", "city" : "PERRY", "loc" : [ -78.005882, 42.722852 ], "pop" : 6218, "state" : "NY" } +{ "_id" : "14532", "city" : "PHELPS", "loc" : [ -77.047264, 42.958178 ], "pop" : 4366, "state" : "NY" } +{ "_id" : "14533", "city" : "WADSWORTH", "loc" : [ -77.88254499999999, 42.84269 ], "pop" : 2094, "state" : "NY" } +{ "_id" : "14534", "city" : "PITTSFORD", "loc" : [ -77.514067, 43.069511 ], "pop" : 27413, "state" : "NY" } +{ "_id" : "14536", "city" : "PORTAGEVILLE", "loc" : [ -78.085635, 42.556957 ], "pop" : 980, "state" : "NY" } +{ "_id" : "14541", "city" : "MAC DOUGALL", "loc" : [ -76.853582, 42.761378 ], "pop" : 3150, "state" : "NY" } +{ "_id" : "14543", "city" : "WEST RUSH", "loc" : [ -77.665381, 42.998934 ], "pop" : 2481, "state" : "NY" } +{ "_id" : "14544", "city" : "RUSHVILLE", "loc" : [ -77.239538, 42.75973 ], "pop" : 1948, "state" : "NY" } +{ "_id" : "14545", "city" : "SCOTTSBURG", "loc" : [ -77.682633, 42.658907 ], "pop" : 612, "state" : "NY" } +{ "_id" : "14546", "city" : "SCOTTSVILLE", "loc" : [ -77.77425599999999, 43.02462 ], "pop" : 5604, "state" : "NY" } +{ "_id" : "14548", "city" : "SHORTSVILLE", "loc" : [ -77.227312, 42.969034 ], "pop" : 4524, "state" : "NY" } +{ "_id" : "14550", "city" : "ROCK GLEN", "loc" : [ -78.092994, 42.669446 ], "pop" : 1824, "state" : "NY" } +{ "_id" : "14551", "city" : "SODUS", "loc" : [ -77.05141, 43.221681 ], "pop" : 5831, "state" : "NY" } +{ "_id" : "14555", "city" : "SODUS POINT", "loc" : [ -76.98833, 43.265058 ], "pop" : 1058, "state" : "NY" } +{ "_id" : "14559", "city" : "SPENCERPORT", "loc" : [ -77.804333, 43.189502 ], "pop" : 14137, "state" : "NY" } +{ "_id" : "14560", "city" : "SPRINGWATER", "loc" : [ -77.57750299999999, 42.677598 ], "pop" : 2319, "state" : "NY" } +{ "_id" : "14561", "city" : "STANLEY", "loc" : [ -77.12070199999999, 42.830277 ], "pop" : 3102, "state" : "NY" } +{ "_id" : "14564", "city" : "VICTOR", "loc" : [ -77.41798199999999, 42.986597 ], "pop" : 7322, "state" : "NY" } +{ "_id" : "14568", "city" : "WALWORTH", "loc" : [ -77.28582, 43.140161 ], "pop" : 5461, "state" : "NY" } +{ "_id" : "14569", "city" : "WARSAW", "loc" : [ -78.142899, 42.741035 ], "pop" : 5811, "state" : "NY" } +{ "_id" : "14571", "city" : "WATERPORT", "loc" : [ -78.242958, 43.332563 ], "pop" : 1669, "state" : "NY" } +{ "_id" : "14572", "city" : "WAYLAND", "loc" : [ -77.590613, 42.559274 ], "pop" : 5626, "state" : "NY" } +{ "_id" : "14580", "city" : "WEBSTER", "loc" : [ -77.46158699999999, 43.219563 ], "pop" : 35072, "state" : "NY" } +{ "_id" : "14586", "city" : "WEST HENRIETTA", "loc" : [ -77.68713099999999, 43.039667 ], "pop" : 5397, "state" : "NY" } +{ "_id" : "14589", "city" : "WILLIAMSON", "loc" : [ -77.170011, 43.242071 ], "pop" : 7947, "state" : "NY" } +{ "_id" : "14590", "city" : "WOLCOTT", "loc" : [ -76.821748, 43.234129 ], "pop" : 5356, "state" : "NY" } +{ "_id" : "14591", "city" : "WYOMING", "loc" : [ -78.083292, 42.83175 ], "pop" : 2074, "state" : "NY" } +{ "_id" : "14604", "city" : "ROCHESTER", "loc" : [ -77.607978, 43.157729 ], "pop" : 1434, "state" : "NY" } +{ "_id" : "14605", "city" : "ROCHESTER", "loc" : [ -77.600711, 43.169758 ], "pop" : 15196, "state" : "NY" } +{ "_id" : "14606", "city" : "ROCHESTER", "loc" : [ -77.684488, 43.168455 ], "pop" : 29822, "state" : "NY" } +{ "_id" : "14607", "city" : "ROCHESTER", "loc" : [ -77.588976, 43.150086 ], "pop" : 16479, "state" : "NY" } +{ "_id" : "14608", "city" : "ROCHESTER", "loc" : [ -77.625803, 43.152144 ], "pop" : 14631, "state" : "NY" } +{ "_id" : "14609", "city" : "ROCHESTER", "loc" : [ -77.56370099999999, 43.174001 ], "pop" : 45805, "state" : "NY" } +{ "_id" : "14610", "city" : "ROCHESTER", "loc" : [ -77.54950100000001, 43.14524 ], "pop" : 15167, "state" : "NY" } +{ "_id" : "14611", "city" : "ROCHESTER", "loc" : [ -77.639353, 43.148375 ], "pop" : 15951, "state" : "NY" } +{ "_id" : "14612", "city" : "ROCHESTER", "loc" : [ -77.665228, 43.256576 ], "pop" : 35820, "state" : "NY" } +{ "_id" : "14613", "city" : "ROCHESTER", "loc" : [ -77.639276, 43.18308 ], "pop" : 15525, "state" : "NY" } +{ "_id" : "14614", "city" : "ROCHESTER", "loc" : [ -77.61418999999999, 43.155823 ], "pop" : 1430, "state" : "NY" } +{ "_id" : "14615", "city" : "ROCHESTER", "loc" : [ -77.652118, 43.20575 ], "pop" : 16000, "state" : "NY" } +{ "_id" : "14616", "city" : "GREECE", "loc" : [ -77.65123800000001, 43.232359 ], "pop" : 26500, "state" : "NY" } +{ "_id" : "14617", "city" : "ROCHESTER", "loc" : [ -77.599442, 43.220258 ], "pop" : 24296, "state" : "NY" } +{ "_id" : "14618", "city" : "TWELVE CORNERS", "loc" : [ -77.558801, 43.115416 ], "pop" : 21912, "state" : "NY" } +{ "_id" : "14619", "city" : "ROCHESTER", "loc" : [ -77.6481, 43.136685 ], "pop" : 19393, "state" : "NY" } +{ "_id" : "14620", "city" : "ROCHESTER", "loc" : [ -77.606239, 43.131711 ], "pop" : 29819, "state" : "NY" } +{ "_id" : "14621", "city" : "ROCHESTER", "loc" : [ -77.60428400000001, 43.183362 ], "pop" : 36055, "state" : "NY" } +{ "_id" : "14622", "city" : "ROCHESTER", "loc" : [ -77.55549000000001, 43.213959 ], "pop" : 12489, "state" : "NY" } +{ "_id" : "14623", "city" : "ROCHESTER", "loc" : [ -77.634412, 43.083371 ], "pop" : 25127, "state" : "NY" } +{ "_id" : "14624", "city" : "WESTGATE", "loc" : [ -77.733552, 43.12589 ], "pop" : 35748, "state" : "NY" } +{ "_id" : "14625", "city" : "PANORAMA", "loc" : [ -77.50318799999999, 43.14949 ], "pop" : 12009, "state" : "NY" } +{ "_id" : "14626", "city" : "ROCHESTER", "loc" : [ -77.703996, 43.21257 ], "pop" : 25574, "state" : "NY" } +{ "_id" : "14701", "city" : "JAMESTOWN", "loc" : [ -79.243989, 42.092845 ], "pop" : 45344, "state" : "NY" } +{ "_id" : "14706", "city" : "ALLEGANY", "loc" : [ -78.499883, 42.091827 ], "pop" : 7885, "state" : "NY" } +{ "_id" : "14708", "city" : "ALMA", "loc" : [ -78.040012, 42.016859 ], "pop" : 200, "state" : "NY" } +{ "_id" : "14709", "city" : "ANGELICA", "loc" : [ -77.994671, 42.326339 ], "pop" : 1046, "state" : "NY" } +{ "_id" : "14710", "city" : "ASHVILLE", "loc" : [ -79.405624, 42.108376 ], "pop" : 2450, "state" : "NY" } +{ "_id" : "14711", "city" : "BELFAST", "loc" : [ -78.094281, 42.320013 ], "pop" : 2210, "state" : "NY" } +{ "_id" : "14712", "city" : "BEMUS POINT", "loc" : [ -79.35808, 42.151346 ], "pop" : 3591, "state" : "NY" } +{ "_id" : "14714", "city" : "BLACK CREEK", "loc" : [ -78.23124900000001, 42.285528 ], "pop" : 757, "state" : "NY" } +{ "_id" : "14715", "city" : "BOLIVAR", "loc" : [ -78.144834, 42.070442 ], "pop" : 3173, "state" : "NY" } +{ "_id" : "14716", "city" : "BROCTON", "loc" : [ -79.43443000000001, 42.393973 ], "pop" : 1863, "state" : "NY" } +{ "_id" : "14717", "city" : "CANEADEA", "loc" : [ -78.197321, 42.370304 ], "pop" : 798, "state" : "NY" } +{ "_id" : "14718", "city" : "CASSADAGA", "loc" : [ -79.29928200000001, 42.350356 ], "pop" : 1977, "state" : "NY" } +{ "_id" : "14719", "city" : "CATTARAUGUS", "loc" : [ -78.88852799999999, 42.333291 ], "pop" : 3853, "state" : "NY" } +{ "_id" : "14721", "city" : "CERES", "loc" : [ -78.27268599999999, 41.99939 ], "pop" : 33, "state" : "NY" } +{ "_id" : "14723", "city" : "CHERRY CREEK", "loc" : [ -79.12027500000001, 42.312725 ], "pop" : 1408, "state" : "NY" } +{ "_id" : "14724", "city" : "CLYMER", "loc" : [ -79.668532, 42.055699 ], "pop" : 2810, "state" : "NY" } +{ "_id" : "14726", "city" : "CONEWANGO VALLEY", "loc" : [ -79.021956, 42.262467 ], "pop" : 1562, "state" : "NY" } +{ "_id" : "14727", "city" : "CUBA", "loc" : [ -78.275074, 42.18819 ], "pop" : 5306, "state" : "NY" } +{ "_id" : "14728", "city" : "DEWITTVILLE", "loc" : [ -79.419303, 42.239413 ], "pop" : 1159, "state" : "NY" } +{ "_id" : "14729", "city" : "EAST OTTO", "loc" : [ -78.743167, 42.3971 ], "pop" : 1050, "state" : "NY" } +{ "_id" : "14731", "city" : "ELLICOTTVILLE", "loc" : [ -78.66064, 42.295873 ], "pop" : 1767, "state" : "NY" } +{ "_id" : "14733", "city" : "FALCONER", "loc" : [ -79.189499, 42.123915 ], "pop" : 3812, "state" : "NY" } +{ "_id" : "14735", "city" : "FILLMORE", "loc" : [ -78.10623200000001, 42.463605 ], "pop" : 2463, "state" : "NY" } +{ "_id" : "14736", "city" : "FINDLEY LAKE", "loc" : [ -79.734908, 42.120401 ], "pop" : 77, "state" : "NY" } +{ "_id" : "14737", "city" : "FRANKLINVILLE", "loc" : [ -78.440043, 42.338823 ], "pop" : 3965, "state" : "NY" } +{ "_id" : "14738", "city" : "FREWSBURG", "loc" : [ -79.13179700000001, 42.052753 ], "pop" : 3919, "state" : "NY" } +{ "_id" : "14739", "city" : "FRIENDSHIP", "loc" : [ -78.13588, 42.190666 ], "pop" : 3214, "state" : "NY" } +{ "_id" : "14740", "city" : "GERRY", "loc" : [ -79.16486500000001, 42.214728 ], "pop" : 1836, "state" : "NY" } +{ "_id" : "14741", "city" : "GREAT VALLEY", "loc" : [ -78.620811, 42.208292 ], "pop" : 2217, "state" : "NY" } +{ "_id" : "14743", "city" : "ISCHUA", "loc" : [ -78.400611, 42.179747 ], "pop" : 2635, "state" : "NY" } +{ "_id" : "14744", "city" : "HOUGHTON", "loc" : [ -78.109506, 42.411567 ], "pop" : 173, "state" : "NY" } +{ "_id" : "14747", "city" : "KENNEDY", "loc" : [ -79.096416, 42.150776 ], "pop" : 2719, "state" : "NY" } +{ "_id" : "14748", "city" : "KILL BUCK", "loc" : [ -78.64260400000001, 42.141005 ], "pop" : 47, "state" : "NY" } +{ "_id" : "14750", "city" : "LAKEWOOD", "loc" : [ -79.32912399999999, 42.097256 ], "pop" : 5113, "state" : "NY" } +{ "_id" : "14753", "city" : "LIMESTONE", "loc" : [ -78.631979, 42.063945 ], "pop" : 1981, "state" : "NY" } +{ "_id" : "14754", "city" : "LITTLE GENESEE", "loc" : [ -78.235056, 42.023964 ], "pop" : 1240, "state" : "NY" } +{ "_id" : "14755", "city" : "LITTLE VALLEY", "loc" : [ -78.809286, 42.254121 ], "pop" : 2311, "state" : "NY" } +{ "_id" : "14757", "city" : "MAYVILLE", "loc" : [ -79.496325, 42.240906 ], "pop" : 3378, "state" : "NY" } +{ "_id" : "14760", "city" : "OLEAN", "loc" : [ -78.423265, 42.0787 ], "pop" : 22055, "state" : "NY" } +{ "_id" : "14767", "city" : "PANAMA", "loc" : [ -79.48153600000001, 42.056965 ], "pop" : 2437, "state" : "NY" } +{ "_id" : "14769", "city" : "PORTLAND", "loc" : [ -79.458894, 42.385792 ], "pop" : 2001, "state" : "NY" } +{ "_id" : "14770", "city" : "PORTVILLE", "loc" : [ -78.33135299999999, 42.027253 ], "pop" : 1743, "state" : "NY" } +{ "_id" : "14772", "city" : "RANDOLPH", "loc" : [ -78.96003399999999, 42.163143 ], "pop" : 4253, "state" : "NY" } +{ "_id" : "14775", "city" : "RIPLEY", "loc" : [ -79.712103, 42.248175 ], "pop" : 2876, "state" : "NY" } +{ "_id" : "14777", "city" : "RUSHFORD", "loc" : [ -78.18670400000001, 42.417216 ], "pop" : 2701, "state" : "NY" } +{ "_id" : "14779", "city" : "SALAMANCA", "loc" : [ -78.73042, 42.16035 ], "pop" : 8632, "state" : "NY" } +{ "_id" : "14781", "city" : "SHERMAN", "loc" : [ -79.585742, 42.163124 ], "pop" : 2184, "state" : "NY" } +{ "_id" : "14782", "city" : "SINCLAIRVILLE", "loc" : [ -79.267297, 42.24548 ], "pop" : 3065, "state" : "NY" } +{ "_id" : "14784", "city" : "STOCKTON", "loc" : [ -79.375792, 42.318195 ], "pop" : 1894, "state" : "NY" } +{ "_id" : "14787", "city" : "WESTFIELD", "loc" : [ -79.57264600000001, 42.321977 ], "pop" : 5872, "state" : "NY" } +{ "_id" : "14801", "city" : "ADDISON", "loc" : [ -77.26602699999999, 42.09825 ], "pop" : 4967, "state" : "NY" } +{ "_id" : "14802", "city" : "ALFRED", "loc" : [ -77.79295, 42.255165 ], "pop" : 4559, "state" : "NY" } +{ "_id" : "14803", "city" : "ALFRED STATION", "loc" : [ -77.77808400000001, 42.255799 ], "pop" : 1071, "state" : "NY" } +{ "_id" : "14804", "city" : "ALMOND", "loc" : [ -77.77796499999999, 42.316036 ], "pop" : 1642, "state" : "NY" } +{ "_id" : "14805", "city" : "ALPINE", "loc" : [ -76.734775, 42.351014 ], "pop" : 1098, "state" : "NY" } +{ "_id" : "14806", "city" : "ANDOVER", "loc" : [ -77.792008, 42.157454 ], "pop" : 2489, "state" : "NY" } +{ "_id" : "14807", "city" : "ARKPORT", "loc" : [ -77.691778, 42.422466 ], "pop" : 2937, "state" : "NY" } +{ "_id" : "14808", "city" : "ATLANTA", "loc" : [ -77.480091, 42.556269 ], "pop" : 472, "state" : "NY" } +{ "_id" : "14809", "city" : "WALLACE", "loc" : [ -77.434254, 42.41513 ], "pop" : 2448, "state" : "NY" } +{ "_id" : "14810", "city" : "VETERANS ADMINIS", "loc" : [ -77.323255, 42.345451 ], "pop" : 12982, "state" : "NY" } +{ "_id" : "14812", "city" : "BEAVER DAMS", "loc" : [ -76.971953, 42.279763 ], "pop" : 3765, "state" : "NY" } +{ "_id" : "14813", "city" : "BELMONT", "loc" : [ -78.01103000000001, 42.233409 ], "pop" : 1773, "state" : "NY" } +{ "_id" : "14814", "city" : "BIG FLATS", "loc" : [ -76.952721, 42.145509 ], "pop" : 1892, "state" : "NY" } +{ "_id" : "14815", "city" : "BRADFORD", "loc" : [ -77.09134, 42.382517 ], "pop" : 944, "state" : "NY" } +{ "_id" : "14816", "city" : "BREESPORT", "loc" : [ -76.73612, 42.19392 ], "pop" : 160, "state" : "NY" } +{ "_id" : "14817", "city" : "BROOKTONDALE", "loc" : [ -76.366844, 42.37653 ], "pop" : 2665, "state" : "NY" } +{ "_id" : "14818", "city" : "BURDETT", "loc" : [ -76.82921899999999, 42.439442 ], "pop" : 1714, "state" : "NY" } +{ "_id" : "14819", "city" : "CAMERON", "loc" : [ -77.440341, 42.21284 ], "pop" : 698, "state" : "NY" } +{ "_id" : "14820", "city" : "CAMERON MILLS", "loc" : [ -77.364976, 42.192547 ], "pop" : 723, "state" : "NY" } +{ "_id" : "14821", "city" : "CAMPBELL", "loc" : [ -77.206619, 42.238569 ], "pop" : 2966, "state" : "NY" } +{ "_id" : "14822", "city" : "CANASERAGA", "loc" : [ -77.795374, 42.458504 ], "pop" : 1458, "state" : "NY" } +{ "_id" : "14823", "city" : "CANISTEO", "loc" : [ -77.58970600000001, 42.263503 ], "pop" : 3945, "state" : "NY" } +{ "_id" : "14824", "city" : "CAYUTA", "loc" : [ -76.697367, 42.277445 ], "pop" : 599, "state" : "NY" } +{ "_id" : "14825", "city" : "CHEMUNG", "loc" : [ -76.62022399999999, 42.039243 ], "pop" : 615, "state" : "NY" } +{ "_id" : "14826", "city" : "COHOCTON", "loc" : [ -77.499763, 42.500315 ], "pop" : 2286, "state" : "NY" } +{ "_id" : "14830", "city" : "CORNING", "loc" : [ -77.047546, 42.138331 ], "pop" : 19957, "state" : "NY" } +{ "_id" : "14836", "city" : "DALTON", "loc" : [ -77.928889, 42.544895 ], "pop" : 875, "state" : "NY" } +{ "_id" : "14837", "city" : "DUNDEE", "loc" : [ -77.002773, 42.505261 ], "pop" : 5125, "state" : "NY" } +{ "_id" : "14838", "city" : "ERIN", "loc" : [ -76.68194200000001, 42.185898 ], "pop" : 2053, "state" : "NY" } +{ "_id" : "14839", "city" : "GREENWOOD", "loc" : [ -77.63604100000001, 42.139809 ], "pop" : 927, "state" : "NY" } +{ "_id" : "14840", "city" : "HAMMONDSPORT", "loc" : [ -77.19770200000001, 42.431217 ], "pop" : 3068, "state" : "NY" } +{ "_id" : "14841", "city" : "HECTOR", "loc" : [ -76.878597, 42.49658 ], "pop" : 147, "state" : "NY" } +{ "_id" : "14842", "city" : "HIMROD", "loc" : [ -76.950774, 42.594455 ], "pop" : 726, "state" : "NY" } +{ "_id" : "14843", "city" : "HORNELL", "loc" : [ -77.656907, 42.327393 ], "pop" : 14311, "state" : "NY" } +{ "_id" : "14845", "city" : "HORSEHEADS", "loc" : [ -76.83453900000001, 42.180493 ], "pop" : 20799, "state" : "NY" } +{ "_id" : "14846", "city" : "HUNT", "loc" : [ -77.98183899999999, 42.538821 ], "pop" : 1236, "state" : "NY" } +{ "_id" : "14847", "city" : "INTERLAKEN", "loc" : [ -76.726798, 42.616524 ], "pop" : 2148, "state" : "NY" } +{ "_id" : "14850", "city" : "ITHACA COLLEGE", "loc" : [ -76.49291100000001, 42.448497 ], "pop" : 40760, "state" : "NY" } +{ "_id" : "14853", "city" : "ITHACA", "loc" : [ -76.48870700000001, 42.443087 ], "pop" : 20379, "state" : "NY" } +{ "_id" : "14855", "city" : "JASPER", "loc" : [ -77.499909, 42.128962 ], "pop" : 870, "state" : "NY" } +{ "_id" : "14858", "city" : "LINDLEY", "loc" : [ -77.154132, 42.042483 ], "pop" : 1765, "state" : "NY" } +{ "_id" : "14859", "city" : "LOCKWOOD", "loc" : [ -76.536618, 42.114943 ], "pop" : 951, "state" : "NY" } +{ "_id" : "14860", "city" : "LODI", "loc" : [ -76.833904, 42.596555 ], "pop" : 1209, "state" : "NY" } +{ "_id" : "14861", "city" : "LOWMAN", "loc" : [ -76.693005, 42.06938 ], "pop" : 2338, "state" : "NY" } +{ "_id" : "14864", "city" : "MILLPORT", "loc" : [ -76.83923299999999, 42.258084 ], "pop" : 1432, "state" : "NY" } +{ "_id" : "14865", "city" : "MONTOUR FALLS", "loc" : [ -76.839581, 42.343678 ], "pop" : 2851, "state" : "NY" } +{ "_id" : "14867", "city" : "NEWFIELD", "loc" : [ -76.591978, 42.362137 ], "pop" : 5311, "state" : "NY" } +{ "_id" : "14869", "city" : "ODESSA", "loc" : [ -76.771698, 42.360947 ], "pop" : 1471, "state" : "NY" } +{ "_id" : "14870", "city" : "PAINTED POST", "loc" : [ -77.11937500000001, 42.170967 ], "pop" : 9269, "state" : "NY" } +{ "_id" : "14871", "city" : "PINE CITY", "loc" : [ -76.881519, 42.041938 ], "pop" : 4911, "state" : "NY" } +{ "_id" : "14872", "city" : "PINE VALLEY", "loc" : [ -76.865206, 42.234795 ], "pop" : 252, "state" : "NY" } +{ "_id" : "14873", "city" : "PRATTSBURG", "loc" : [ -77.282455, 42.526918 ], "pop" : 2534, "state" : "NY" } +{ "_id" : "14874", "city" : "PULTENEY", "loc" : [ -77.16910799999999, 42.523275 ], "pop" : 504, "state" : "NY" } +{ "_id" : "14877", "city" : "REXVILLE", "loc" : [ -77.676663, 42.072645 ], "pop" : 539, "state" : "NY" } +{ "_id" : "14878", "city" : "ROCK STREAM", "loc" : [ -76.936436, 42.448511 ], "pop" : 703, "state" : "NY" } +{ "_id" : "14879", "city" : "SAVONA", "loc" : [ -77.20834499999999, 42.30407 ], "pop" : 1982, "state" : "NY" } +{ "_id" : "14880", "city" : "SCIO", "loc" : [ -77.990026, 42.169703 ], "pop" : 2491, "state" : "NY" } +{ "_id" : "14881", "city" : "SLATERVILLE SPRI", "loc" : [ -76.31567699999999, 42.401119 ], "pop" : 107, "state" : "NY" } +{ "_id" : "14882", "city" : "LANSING", "loc" : [ -76.53745499999999, 42.564494 ], "pop" : 4043, "state" : "NY" } +{ "_id" : "14883", "city" : "SPENCER", "loc" : [ -76.489853, 42.246736 ], "pop" : 3829, "state" : "NY" } +{ "_id" : "14884", "city" : "SWAIN", "loc" : [ -77.88899000000001, 42.477314 ], "pop" : 267, "state" : "NY" } +{ "_id" : "14885", "city" : "TROUPSBURG", "loc" : [ -77.550208, 42.050083 ], "pop" : 831, "state" : "NY" } +{ "_id" : "14886", "city" : "TRUMANSBURG", "loc" : [ -76.668145, 42.520987 ], "pop" : 6379, "state" : "NY" } +{ "_id" : "14888", "city" : "VALOIS", "loc" : [ -76.860879, 42.524304 ], "pop" : 547, "state" : "NY" } +{ "_id" : "14889", "city" : "VAN ETTEN", "loc" : [ -76.571663, 42.208455 ], "pop" : 1477, "state" : "NY" } +{ "_id" : "14891", "city" : "WATKINS GLEN", "loc" : [ -76.90215000000001, 42.377121 ], "pop" : 4584, "state" : "NY" } +{ "_id" : "14892", "city" : "WAVERLY", "loc" : [ -76.53330800000001, 42.017228 ], "pop" : 8262, "state" : "NY" } +{ "_id" : "14894", "city" : "WELLSBURG", "loc" : [ -76.77231500000001, 42.027317 ], "pop" : 2829, "state" : "NY" } +{ "_id" : "14895", "city" : "WELLSVILLE", "loc" : [ -77.94190999999999, 42.110757 ], "pop" : 9645, "state" : "NY" } +{ "_id" : "14897", "city" : "WHITESVILLE", "loc" : [ -77.810615, 42.045586 ], "pop" : 1178, "state" : "NY" } +{ "_id" : "14898", "city" : "WOODHULL", "loc" : [ -77.420333, 42.073638 ], "pop" : 1318, "state" : "NY" } +{ "_id" : "14901", "city" : "ELMIRA", "loc" : [ -76.811977, 42.100769 ], "pop" : 19037, "state" : "NY" } +{ "_id" : "14903", "city" : "ELMIRA HEIGHTS", "loc" : [ -76.84357199999999, 42.130203 ], "pop" : 7918, "state" : "NY" } +{ "_id" : "14904", "city" : "ELMIRA", "loc" : [ -76.803735, 42.072866 ], "pop" : 18103, "state" : "NY" } +{ "_id" : "14905", "city" : "ELMIRA", "loc" : [ -76.839686, 42.086919 ], "pop" : 10018, "state" : "NY" } +{ "_id" : "15001", "city" : "MACARTHUR", "loc" : [ -80.281567, 40.604424 ], "pop" : 36849, "state" : "PA" } +{ "_id" : "15003", "city" : "FAIROAKS", "loc" : [ -80.21977800000001, 40.595368 ], "pop" : 13449, "state" : "PA" } +{ "_id" : "15005", "city" : "BADEN", "loc" : [ -80.198471, 40.641595 ], "pop" : 10068, "state" : "PA" } +{ "_id" : "15007", "city" : "BAKERSTOWN", "loc" : [ -79.93095599999999, 40.647826 ], "pop" : 782, "state" : "PA" } +{ "_id" : "15009", "city" : "BEAVER", "loc" : [ -80.336528, 40.697184 ], "pop" : 14968, "state" : "PA" } +{ "_id" : "15010", "city" : "RACINE", "loc" : [ -80.33987999999999, 40.766234 ], "pop" : 30623, "state" : "PA" } +{ "_id" : "15012", "city" : "ROSTRAVER", "loc" : [ -79.83454, 40.14368 ], "pop" : 18967, "state" : "PA" } +{ "_id" : "15014", "city" : "BRACKENRIDGE", "loc" : [ -79.74137500000001, 40.608223 ], "pop" : 3674, "state" : "PA" } +{ "_id" : "15015", "city" : "BRADFORDWOODS", "loc" : [ -80.08230500000001, 40.634175 ], "pop" : 2319, "state" : "PA" } +{ "_id" : "15017", "city" : "BRIDGEVILLE", "loc" : [ -80.11529299999999, 40.347195 ], "pop" : 12705, "state" : "PA" } +{ "_id" : "15018", "city" : "BUENA VISTA", "loc" : [ -79.79187400000001, 40.278635 ], "pop" : 1186, "state" : "PA" } +{ "_id" : "15019", "city" : "BULGER", "loc" : [ -80.36219199999999, 40.405119 ], "pop" : 1118, "state" : "PA" } +{ "_id" : "15021", "city" : "PARIS", "loc" : [ -80.444485, 40.390114 ], "pop" : 5527, "state" : "PA" } +{ "_id" : "15022", "city" : "CHARLEROI", "loc" : [ -79.92001999999999, 40.140402 ], "pop" : 11800, "state" : "PA" } +{ "_id" : "15024", "city" : "CHESWICK", "loc" : [ -79.841002, 40.568117 ], "pop" : 9823, "state" : "PA" } +{ "_id" : "15025", "city" : "LARGE", "loc" : [ -79.910096, 40.298917 ], "pop" : 17031, "state" : "PA" } +{ "_id" : "15026", "city" : "CLINTON", "loc" : [ -80.342282, 40.513148 ], "pop" : 2543, "state" : "PA" } +{ "_id" : "15027", "city" : "CONWAY", "loc" : [ -80.234899, 40.664917 ], "pop" : 2438, "state" : "PA" } +{ "_id" : "15030", "city" : "CREIGHTON", "loc" : [ -79.78176999999999, 40.582051 ], "pop" : 1761, "state" : "PA" } +{ "_id" : "15031", "city" : "CUDDY", "loc" : [ -80.16443200000001, 40.360069 ], "pop" : 1037, "state" : "PA" } +{ "_id" : "15033", "city" : "DONORA", "loc" : [ -79.861858, 40.176821 ], "pop" : 5928, "state" : "PA" } +{ "_id" : "15034", "city" : "DRAVOSBURG", "loc" : [ -79.889461, 40.352676 ], "pop" : 2377, "state" : "PA" } +{ "_id" : "15035", "city" : "EAST MC KEESPORT", "loc" : [ -79.80788099999999, 40.383944 ], "pop" : 2698, "state" : "PA" } +{ "_id" : "15037", "city" : "ELIZABETH", "loc" : [ -79.856842, 40.265575 ], "pop" : 12937, "state" : "PA" } +{ "_id" : "15042", "city" : "FREEDOM", "loc" : [ -80.214663, 40.683023 ], "pop" : 9416, "state" : "PA" } +{ "_id" : "15043", "city" : "GEORGETOWN", "loc" : [ -80.49002299999999, 40.574275 ], "pop" : 2810, "state" : "PA" } +{ "_id" : "15044", "city" : "GIBSONIA", "loc" : [ -79.94430699999999, 40.625233 ], "pop" : 18318, "state" : "PA" } +{ "_id" : "15045", "city" : "GLASSPORT", "loc" : [ -79.888324, 40.325952 ], "pop" : 5582, "state" : "PA" } +{ "_id" : "15049", "city" : "HARWICK", "loc" : [ -79.805115, 40.557433 ], "pop" : 1111, "state" : "PA" } +{ "_id" : "15050", "city" : "HOOKSTOWN", "loc" : [ -80.436268, 40.542929 ], "pop" : 2933, "state" : "PA" } +{ "_id" : "15051", "city" : "INDIANOLA", "loc" : [ -79.881765, 40.576605 ], "pop" : 1539, "state" : "PA" } +{ "_id" : "15052", "city" : "INDUSTRY", "loc" : [ -80.415085, 40.667101 ], "pop" : 2908, "state" : "PA" } +{ "_id" : "15053", "city" : "JOFFRE", "loc" : [ -80.391542, 40.381027 ], "pop" : 1634, "state" : "PA" } +{ "_id" : "15055", "city" : "LAWRENCE", "loc" : [ -80.144029, 40.311615 ], "pop" : 1933, "state" : "PA" } +{ "_id" : "15056", "city" : "LEETSDALE", "loc" : [ -80.209874, 40.566165 ], "pop" : 1387, "state" : "PA" } +{ "_id" : "15057", "city" : "MC DONALD", "loc" : [ -80.256204, 40.369664 ], "pop" : 9077, "state" : "PA" } +{ "_id" : "15059", "city" : "MIDLAND", "loc" : [ -80.468952, 40.658962 ], "pop" : 6476, "state" : "PA" } +{ "_id" : "15060", "city" : "MIDWAY", "loc" : [ -80.29209, 40.367974 ], "pop" : 1043, "state" : "PA" } +{ "_id" : "15061", "city" : "MONACA", "loc" : [ -80.291743, 40.671847 ], "pop" : 13344, "state" : "PA" } +{ "_id" : "15062", "city" : "MONESSEN", "loc" : [ -79.883526, 40.152379 ], "pop" : 9906, "state" : "PA" } +{ "_id" : "15063", "city" : "MONONGAHELA", "loc" : [ -79.924127, 40.193728 ], "pop" : 13183, "state" : "PA" } +{ "_id" : "15064", "city" : "MORGAN", "loc" : [ -80.15406400000001, 40.360433 ], "pop" : 1751, "state" : "PA" } +{ "_id" : "15065", "city" : "NATRONA", "loc" : [ -79.725621, 40.628862 ], "pop" : 13305, "state" : "PA" } +{ "_id" : "15066", "city" : "NEW BRIGHTON", "loc" : [ -80.29722, 40.739333 ], "pop" : 12222, "state" : "PA" } +{ "_id" : "15067", "city" : "NEW EAGLE", "loc" : [ -79.953408, 40.206573 ], "pop" : 2222, "state" : "PA" } +{ "_id" : "15068", "city" : "ARNOLD", "loc" : [ -79.741547, 40.571179 ], "pop" : 41922, "state" : "PA" } +{ "_id" : "15071", "city" : "NOBLESTOWN", "loc" : [ -80.20261499999999, 40.428734 ], "pop" : 11012, "state" : "PA" } +{ "_id" : "15074", "city" : "ROCHESTER", "loc" : [ -80.26031500000001, 40.715745 ], "pop" : 10784, "state" : "PA" } +{ "_id" : "15076", "city" : "RUSSELLTON", "loc" : [ -79.837102, 40.614344 ], "pop" : 1437, "state" : "PA" } +{ "_id" : "15077", "city" : "SHIPPINGPORT", "loc" : [ -80.419866, 40.626012 ], "pop" : 227, "state" : "PA" } +{ "_id" : "15078", "city" : "SLOVAN", "loc" : [ -80.39923899999999, 40.363086 ], "pop" : 1620, "state" : "PA" } +{ "_id" : "15083", "city" : "SUTERSVILLE", "loc" : [ -79.79222300000001, 40.238207 ], "pop" : 1467, "state" : "PA" } +{ "_id" : "15084", "city" : "TARENTUM", "loc" : [ -79.78520399999999, 40.618651 ], "pop" : 10752, "state" : "PA" } +{ "_id" : "15085", "city" : "LEVEL GREEN", "loc" : [ -79.755157, 40.385155 ], "pop" : 3345, "state" : "PA" } +{ "_id" : "15086", "city" : "WARRENDALE", "loc" : [ -80.08070499999999, 40.664149 ], "pop" : 379, "state" : "PA" } +{ "_id" : "15089", "city" : "WEST NEWTON", "loc" : [ -79.757976, 40.207549 ], "pop" : 7641, "state" : "PA" } +{ "_id" : "15090", "city" : "WEXFORD", "loc" : [ -80.064879, 40.612044 ], "pop" : 14960, "state" : "PA" } +{ "_id" : "15101", "city" : "ALLISON PARK", "loc" : [ -79.96651199999999, 40.569975 ], "pop" : 22474, "state" : "PA" } +{ "_id" : "15102", "city" : "BETHEL PARK", "loc" : [ -80.039793, 40.320984 ], "pop" : 31160, "state" : "PA" } +{ "_id" : "15104", "city" : "RANKIN", "loc" : [ -79.864352, 40.406304 ], "pop" : 13915, "state" : "PA" } +{ "_id" : "15106", "city" : "CARNEGIE", "loc" : [ -80.091532, 40.402941 ], "pop" : 19539, "state" : "PA" } +{ "_id" : "15108", "city" : "MOON TWP", "loc" : [ -80.18969, 40.513245 ], "pop" : 35285, "state" : "PA" } +{ "_id" : "15110", "city" : "DUQUESNE", "loc" : [ -79.852244, 40.370449 ], "pop" : 8525, "state" : "PA" } +{ "_id" : "15112", "city" : "EAST PITTSBURGH", "loc" : [ -79.83889000000001, 40.403577 ], "pop" : 4145, "state" : "PA" } +{ "_id" : "15116", "city" : "GLENSHAW", "loc" : [ -79.96435099999999, 40.537492 ], "pop" : 16588, "state" : "PA" } +{ "_id" : "15120", "city" : "MUNHALL", "loc" : [ -79.90419900000001, 40.394171 ], "pop" : 21866, "state" : "PA" } +{ "_id" : "15122", "city" : "W MIFFLIN FIN", "loc" : [ -79.89429, 40.366535 ], "pop" : 22805, "state" : "PA" } +{ "_id" : "15126", "city" : "IMPERIAL", "loc" : [ -80.264861, 40.458384 ], "pop" : 3626, "state" : "PA" } +{ "_id" : "15129", "city" : "LIBRARY", "loc" : [ -80.001144, 40.292199 ], "pop" : 11353, "state" : "PA" } +{ "_id" : "15131", "city" : "WHITE OAK", "loc" : [ -79.810519, 40.341147 ], "pop" : 9410, "state" : "PA" } +{ "_id" : "15132", "city" : "MC KEESPORT", "loc" : [ -79.84520000000001, 40.341713 ], "pop" : 27694, "state" : "PA" } +{ "_id" : "15133", "city" : "MC KEESPORT", "loc" : [ -79.866759, 40.332835 ], "pop" : 7385, "state" : "PA" } +{ "_id" : "15135", "city" : "BOSTON", "loc" : [ -79.812844, 40.304412 ], "pop" : 5385, "state" : "PA" } +{ "_id" : "15136", "city" : "MC KEES ROCKS", "loc" : [ -80.08756700000001, 40.471742 ], "pop" : 25092, "state" : "PA" } +{ "_id" : "15137", "city" : "NORTH VERSAILLES", "loc" : [ -79.812427, 40.376248 ], "pop" : 12237, "state" : "PA" } +{ "_id" : "15139", "city" : "OAKMONT", "loc" : [ -79.836865, 40.519647 ], "pop" : 6961, "state" : "PA" } +{ "_id" : "15140", "city" : "PITCAIRN", "loc" : [ -79.776951, 40.404787 ], "pop" : 4083, "state" : "PA" } +{ "_id" : "15142", "city" : "PRESTO", "loc" : [ -80.12092199999999, 40.384664 ], "pop" : 864, "state" : "PA" } +{ "_id" : "15143", "city" : "SEWICKLEY", "loc" : [ -80.157848, 40.557031 ], "pop" : 15849, "state" : "PA" } +{ "_id" : "15144", "city" : "SPRINGDALE", "loc" : [ -79.784447, 40.543999 ], "pop" : 4858, "state" : "PA" } +{ "_id" : "15145", "city" : "TURTLE CREEK", "loc" : [ -79.822046, 40.41135 ], "pop" : 8157, "state" : "PA" } +{ "_id" : "15146", "city" : "MONROEVILLE", "loc" : [ -79.76227900000001, 40.429026 ], "pop" : 29228, "state" : "PA" } +{ "_id" : "15147", "city" : "VERONA", "loc" : [ -79.834535, 40.492727 ], "pop" : 20843, "state" : "PA" } +{ "_id" : "15148", "city" : "WALL", "loc" : [ -79.803033, 40.393416 ], "pop" : 3074, "state" : "PA" } +{ "_id" : "15201", "city" : "ARSENAL", "loc" : [ -79.952524, 40.474536 ], "pop" : 15278, "state" : "PA" } +{ "_id" : "15202", "city" : "BELLEVUE", "loc" : [ -80.06696599999999, 40.501321 ], "pop" : 22168, "state" : "PA" } +{ "_id" : "15203", "city" : "CARSON", "loc" : [ -79.97755600000001, 40.425439 ], "pop" : 11012, "state" : "PA" } +{ "_id" : "15204", "city" : "CORLISS", "loc" : [ -80.06105599999999, 40.455569 ], "pop" : 10266, "state" : "PA" } +{ "_id" : "15205", "city" : "CRAFTON", "loc" : [ -80.073393, 40.438045 ], "pop" : 24562, "state" : "PA" } +{ "_id" : "15206", "city" : "EAST LIBERTY", "loc" : [ -79.919267, 40.468885 ], "pop" : 37220, "state" : "PA" } +{ "_id" : "15207", "city" : "HAZELWOOD", "loc" : [ -79.93393500000001, 40.401206 ], "pop" : 15095, "state" : "PA" } +{ "_id" : "15208", "city" : "HOMEWOOD", "loc" : [ -79.89847399999999, 40.454955 ], "pop" : 16136, "state" : "PA" } +{ "_id" : "15209", "city" : "MILLVALE", "loc" : [ -79.97401000000001, 40.49718 ], "pop" : 15034, "state" : "PA" } +{ "_id" : "15210", "city" : "MOUNT OLIVER", "loc" : [ -79.987405, 40.408541 ], "pop" : 35727, "state" : "PA" } +{ "_id" : "15211", "city" : "MOUNT WASHINGTON", "loc" : [ -80.012156, 40.42908 ], "pop" : 13333, "state" : "PA" } +{ "_id" : "15212", "city" : "ALLEGHENY", "loc" : [ -80.01312799999999, 40.468873 ], "pop" : 35280, "state" : "PA" } +{ "_id" : "15213", "city" : "OAKLAND", "loc" : [ -79.95442799999999, 40.44372 ], "pop" : 31142, "state" : "PA" } +{ "_id" : "15214", "city" : "OBSERVATORY", "loc" : [ -80.01393, 40.481309 ], "pop" : 19981, "state" : "PA" } +{ "_id" : "15215", "city" : "ASPINWALL", "loc" : [ -79.917513, 40.499225 ], "pop" : 12801, "state" : "PA" } +{ "_id" : "15216", "city" : "SOUTH HILLS", "loc" : [ -80.03572699999999, 40.399584 ], "pop" : 26700, "state" : "PA" } +{ "_id" : "15217", "city" : "SQUIRREL HILL", "loc" : [ -79.92497299999999, 40.431852 ], "pop" : 27450, "state" : "PA" } +{ "_id" : "15218", "city" : "SWISSVALE", "loc" : [ -79.887591, 40.424468 ], "pop" : 16501, "state" : "PA" } +{ "_id" : "15219", "city" : "UPTOWN", "loc" : [ -79.97722899999999, 40.44539 ], "pop" : 18924, "state" : "PA" } +{ "_id" : "15220", "city" : "PARKWAY CENTER", "loc" : [ -80.051202, 40.417405 ], "pop" : 19228, "state" : "PA" } +{ "_id" : "15221", "city" : "WILKINSBURG", "loc" : [ -79.870243, 40.438352 ], "pop" : 39410, "state" : "PA" } +{ "_id" : "15222", "city" : "DOWNTOWN", "loc" : [ -80.000556, 40.442111 ], "pop" : 1763, "state" : "PA" } +{ "_id" : "15223", "city" : "ETNA", "loc" : [ -79.95144999999999, 40.50428 ], "pop" : 7261, "state" : "PA" } +{ "_id" : "15224", "city" : "BLOOMFIELD", "loc" : [ -79.94544500000001, 40.464215 ], "pop" : 14742, "state" : "PA" } +{ "_id" : "15225", "city" : "NEVILLE ISLAND", "loc" : [ -80.137027, 40.513819 ], "pop" : 1273, "state" : "PA" } +{ "_id" : "15226", "city" : "BROOKLINE", "loc" : [ -80.015759, 40.394628 ], "pop" : 15607, "state" : "PA" } +{ "_id" : "15227", "city" : "BRENTWOOD", "loc" : [ -79.97581599999999, 40.37619 ], "pop" : 27563, "state" : "PA" } +{ "_id" : "15228", "city" : "MOUNT LEBANON", "loc" : [ -80.04318600000001, 40.371326 ], "pop" : 18660, "state" : "PA" } +{ "_id" : "15229", "city" : "WEST VIEW", "loc" : [ -80.035685, 40.519321 ], "pop" : 15127, "state" : "PA" } +{ "_id" : "15232", "city" : "SHADYSIDE", "loc" : [ -79.932557, 40.453598 ], "pop" : 10936, "state" : "PA" } +{ "_id" : "15233", "city" : "KILBUCK", "loc" : [ -80.029965, 40.460425 ], "pop" : 5918, "state" : "PA" } +{ "_id" : "15234", "city" : "CASTLE SHANNON", "loc" : [ -80.01790699999999, 40.369424 ], "pop" : 14952, "state" : "PA" } +{ "_id" : "15235", "city" : "PENN HILLS", "loc" : [ -79.826892, 40.4605 ], "pop" : 41997, "state" : "PA" } +{ "_id" : "15236", "city" : "CASTE VILLAGE", "loc" : [ -79.976894, 40.345244 ], "pop" : 36047, "state" : "PA" } +{ "_id" : "15237", "city" : "MC KNIGHT", "loc" : [ -80.03493899999999, 40.552238 ], "pop" : 39733, "state" : "PA" } +{ "_id" : "15238", "city" : "BLAWNOX", "loc" : [ -79.87742299999999, 40.515077 ], "pop" : 10776, "state" : "PA" } +{ "_id" : "15239", "city" : "PLUM", "loc" : [ -79.734505, 40.477693 ], "pop" : 20793, "state" : "PA" } +{ "_id" : "15241", "city" : "UPPER SAINT CLAI", "loc" : [ -80.07921, 40.332174 ], "pop" : 20276, "state" : "PA" } +{ "_id" : "15243", "city" : "CEDARHURST", "loc" : [ -80.072425, 40.373797 ], "pop" : 14242, "state" : "PA" } +{ "_id" : "15301", "city" : "WASHINGTON", "loc" : [ -80.255957, 40.171687 ], "pop" : 48612, "state" : "PA" } +{ "_id" : "15310", "city" : "ALEPPO", "loc" : [ -80.45791800000001, 39.824647 ], "pop" : 656, "state" : "PA" } +{ "_id" : "15311", "city" : "AMITY", "loc" : [ -80.19486499999999, 40.061786 ], "pop" : 1458, "state" : "PA" } +{ "_id" : "15312", "city" : "AVELLA", "loc" : [ -80.456503, 40.273386 ], "pop" : 3681, "state" : "PA" } +{ "_id" : "15313", "city" : "BEALLSVILLE", "loc" : [ -80.02505600000001, 40.064503 ], "pop" : 530, "state" : "PA" } +{ "_id" : "15314", "city" : "BENTLEYVILLE", "loc" : [ -80.006987, 40.118702 ], "pop" : 2673, "state" : "PA" } +{ "_id" : "15317", "city" : "MC MURRAY", "loc" : [ -80.153153, 40.270743 ], "pop" : 29555, "state" : "PA" } +{ "_id" : "15320", "city" : "CARMICHAELS", "loc" : [ -79.971007, 39.882548 ], "pop" : 6702, "state" : "PA" } +{ "_id" : "15321", "city" : "CECIL", "loc" : [ -80.20437, 40.322813 ], "pop" : 3257, "state" : "PA" } +{ "_id" : "15322", "city" : "CLARKSVILLE", "loc" : [ -80.01238600000001, 39.994064 ], "pop" : 3186, "state" : "PA" } +{ "_id" : "15323", "city" : "CLAYSVILLE", "loc" : [ -80.385904, 40.137557 ], "pop" : 6836, "state" : "PA" } +{ "_id" : "15324", "city" : "COKEBURG", "loc" : [ -80.065152, 40.100801 ], "pop" : 854, "state" : "PA" } +{ "_id" : "15327", "city" : "DILLINER", "loc" : [ -79.977135, 39.755536 ], "pop" : 2407, "state" : "PA" } +{ "_id" : "15329", "city" : "PROSPERITY", "loc" : [ -80.261257, 40.0224 ], "pop" : 1633, "state" : "PA" } +{ "_id" : "15330", "city" : "EIGHTY FOUR", "loc" : [ -80.06269500000001, 40.186821 ], "pop" : 5021, "state" : "PA" } +{ "_id" : "15331", "city" : "ELLSWORTH", "loc" : [ -80.020364, 40.107321 ], "pop" : 1040, "state" : "PA" } +{ "_id" : "15332", "city" : "FINLEYVILLE", "loc" : [ -79.97530999999999, 40.259301 ], "pop" : 8838, "state" : "PA" } +{ "_id" : "15333", "city" : "FREDERICKTOWN", "loc" : [ -80.03093699999999, 40.023749 ], "pop" : 770, "state" : "PA" } +{ "_id" : "15337", "city" : "GRAYSVILLE", "loc" : [ -80.395223, 39.909165 ], "pop" : 468, "state" : "PA" } +{ "_id" : "15338", "city" : "GREENSBORO", "loc" : [ -79.93992, 39.804482 ], "pop" : 2164, "state" : "PA" } +{ "_id" : "15340", "city" : "HICKORY", "loc" : [ -80.302508, 40.292511 ], "pop" : 2064, "state" : "PA" } +{ "_id" : "15341", "city" : "HOLBROOK", "loc" : [ -80.338455, 39.848878 ], "pop" : 1247, "state" : "PA" } +{ "_id" : "15342", "city" : "HOUSTON", "loc" : [ -80.22093700000001, 40.242492 ], "pop" : 6060, "state" : "PA" } +{ "_id" : "15344", "city" : "JEFFERSON", "loc" : [ -80.050286, 39.933391 ], "pop" : 2154, "state" : "PA" } +{ "_id" : "15345", "city" : "MARIANNA", "loc" : [ -80.11450600000001, 40.033067 ], "pop" : 2695, "state" : "PA" } +{ "_id" : "15346", "city" : "MATHER", "loc" : [ -80.085353, 39.945226 ], "pop" : 2856, "state" : "PA" } +{ "_id" : "15349", "city" : "DAVISTOWN", "loc" : [ -80.096763, 39.744289 ], "pop" : 1719, "state" : "PA" } +{ "_id" : "15352", "city" : "NEW FREEPORT", "loc" : [ -80.454228, 39.750728 ], "pop" : 833, "state" : "PA" } +{ "_id" : "15353", "city" : "NINEVEH", "loc" : [ -80.312809, 39.974328 ], "pop" : 884, "state" : "PA" } +{ "_id" : "15357", "city" : "RICES LANDING", "loc" : [ -79.98570100000001, 39.943993 ], "pop" : 2095, "state" : "PA" } +{ "_id" : "15359", "city" : "ROGERSVILLE", "loc" : [ -80.283665, 39.900515 ], "pop" : 313, "state" : "PA" } +{ "_id" : "15360", "city" : "SCENERY HILL", "loc" : [ -80.091414, 40.099378 ], "pop" : 2027, "state" : "PA" } +{ "_id" : "15362", "city" : "SPRAGGS", "loc" : [ -80.262186, 39.761038 ], "pop" : 1682, "state" : "PA" } +{ "_id" : "15363", "city" : "STRABANE", "loc" : [ -80.146156, 40.216914 ], "pop" : 2386, "state" : "PA" } +{ "_id" : "15364", "city" : "SYCAMORE", "loc" : [ -80.228199, 39.95273 ], "pop" : 395, "state" : "PA" } +{ "_id" : "15367", "city" : "VENETIA", "loc" : [ -80.059849, 40.275451 ], "pop" : 3568, "state" : "PA" } +{ "_id" : "15370", "city" : "WAYNESBURG", "loc" : [ -80.179524, 39.891691 ], "pop" : 11246, "state" : "PA" } +{ "_id" : "15376", "city" : "WEST ALEXANDER", "loc" : [ -80.49776900000001, 40.106514 ], "pop" : 1642, "state" : "PA" } +{ "_id" : "15377", "city" : "WEST FINLEY", "loc" : [ -80.44080599999999, 39.991397 ], "pop" : 1313, "state" : "PA" } +{ "_id" : "15380", "city" : "WIND RIDGE", "loc" : [ -80.464665, 39.897106 ], "pop" : 554, "state" : "PA" } +{ "_id" : "15401", "city" : "UNIONTOWN", "loc" : [ -79.728216, 39.889733 ], "pop" : 34582, "state" : "PA" } +{ "_id" : "15410", "city" : "ADAH", "loc" : [ -79.890827, 39.883101 ], "pop" : 596, "state" : "PA" } +{ "_id" : "15411", "city" : "ADDISON", "loc" : [ -79.319334, 39.761195 ], "pop" : 1158, "state" : "PA" } +{ "_id" : "15412", "city" : "ALLENPORT", "loc" : [ -79.85419400000001, 40.089845 ], "pop" : 665, "state" : "PA" } +{ "_id" : "15413", "city" : "ALLISON", "loc" : [ -79.875675, 39.982566 ], "pop" : 326, "state" : "PA" } +{ "_id" : "15417", "city" : "WEST BROWNSVILLE", "loc" : [ -79.920609, 40.02671 ], "pop" : 9133, "state" : "PA" } +{ "_id" : "15419", "city" : "CALIFORNIA", "loc" : [ -79.895319, 40.062529 ], "pop" : 5778, "state" : "PA" } +{ "_id" : "15423", "city" : "COAL CENTER", "loc" : [ -79.8839, 40.097272 ], "pop" : 482, "state" : "PA" } +{ "_id" : "15424", "city" : "LISTONBURG", "loc" : [ -79.351304, 39.821247 ], "pop" : 1998, "state" : "PA" } +{ "_id" : "15425", "city" : "SOUTH CONNELLSVI", "loc" : [ -79.587838, 40.025037 ], "pop" : 25516, "state" : "PA" } +{ "_id" : "15427", "city" : "DAISYTOWN", "loc" : [ -79.96703599999999, 40.074349 ], "pop" : 1858, "state" : "PA" } +{ "_id" : "15428", "city" : "DAWSON", "loc" : [ -79.660224, 40.063767 ], "pop" : 1673, "state" : "PA" } +{ "_id" : "15431", "city" : "DUNBAR", "loc" : [ -79.64305, 39.972171 ], "pop" : 2947, "state" : "PA" } +{ "_id" : "15432", "city" : "DUNLEVY", "loc" : [ -79.862703, 40.115077 ], "pop" : 417, "state" : "PA" } +{ "_id" : "15433", "city" : "EAST MILLSBORO", "loc" : [ -79.966442, 39.982214 ], "pop" : 104, "state" : "PA" } +{ "_id" : "15434", "city" : "ELCO", "loc" : [ -79.87583600000001, 40.079671 ], "pop" : 373, "state" : "PA" } +{ "_id" : "15436", "city" : "FAIRCHANCE", "loc" : [ -79.75505099999999, 39.822876 ], "pop" : 1918, "state" : "PA" } +{ "_id" : "15437", "city" : "FARMINGTON", "loc" : [ -79.583185, 39.806995 ], "pop" : 3296, "state" : "PA" } +{ "_id" : "15438", "city" : "FAYETTE CITY", "loc" : [ -79.836584, 40.098799 ], "pop" : 921, "state" : "PA" } +{ "_id" : "15440", "city" : "GIBBON GLADE", "loc" : [ -79.57360300000001, 39.736357 ], "pop" : 94, "state" : "PA" } +{ "_id" : "15442", "city" : "GRINDSTONE", "loc" : [ -79.840447, 40.008415 ], "pop" : 6843, "state" : "PA" } +{ "_id" : "15444", "city" : "HILLER", "loc" : [ -79.899936, 40.004496 ], "pop" : 2028, "state" : "PA" } +{ "_id" : "15445", "city" : "HOPWOOD", "loc" : [ -79.705945, 39.868868 ], "pop" : 3367, "state" : "PA" } +{ "_id" : "15446", "city" : "INDIAN HEAD", "loc" : [ -79.393387, 40.020195 ], "pop" : 181, "state" : "PA" } +{ "_id" : "15450", "city" : "LA BELLE", "loc" : [ -79.93702399999999, 39.973829 ], "pop" : 2169, "state" : "PA" } +{ "_id" : "15451", "city" : "LAKE LYNN", "loc" : [ -79.86184, 39.750065 ], "pop" : 2217, "state" : "PA" } +{ "_id" : "15456", "city" : "LEMONT FURNACE", "loc" : [ -79.647684, 39.931057 ], "pop" : 1638, "state" : "PA" } +{ "_id" : "15458", "city" : "LAMBERTON", "loc" : [ -79.859022, 39.890185 ], "pop" : 4703, "state" : "PA" } +{ "_id" : "15459", "city" : "MARKLEYSBURG", "loc" : [ -79.46003, 39.759723 ], "pop" : 2052, "state" : "PA" } +{ "_id" : "15461", "city" : "GRAYS LANDING", "loc" : [ -79.89381299999999, 39.83495 ], "pop" : 6033, "state" : "PA" } +{ "_id" : "15462", "city" : "MELCROFT", "loc" : [ -79.3587, 40.064789 ], "pop" : 77, "state" : "PA" } +{ "_id" : "15463", "city" : "MERRITTSTOWN", "loc" : [ -79.874447, 39.964854 ], "pop" : 1830, "state" : "PA" } +{ "_id" : "15464", "city" : "MILL RUN", "loc" : [ -79.462219, 39.967985 ], "pop" : 1972, "state" : "PA" } +{ "_id" : "15468", "city" : "NEW SALEM", "loc" : [ -79.80407, 39.940747 ], "pop" : 4509, "state" : "PA" } +{ "_id" : "15469", "city" : "NORMALVILLE", "loc" : [ -79.41506099999999, 40.041793 ], "pop" : 3814, "state" : "PA" } +{ "_id" : "15470", "city" : "OHIOPYLE", "loc" : [ -79.48846, 39.873202 ], "pop" : 815, "state" : "PA" } +{ "_id" : "15472", "city" : "OLIVER", "loc" : [ -79.71560100000001, 39.911659 ], "pop" : 2395, "state" : "PA" } +{ "_id" : "15473", "city" : "LAYTON", "loc" : [ -79.754384, 40.085724 ], "pop" : 1833, "state" : "PA" } +{ "_id" : "15474", "city" : "POINT MARION", "loc" : [ -79.89898599999999, 39.735124 ], "pop" : 1474, "state" : "PA" } +{ "_id" : "15475", "city" : "REPUBLIC", "loc" : [ -79.902914, 39.961427 ], "pop" : 641, "state" : "PA" } +{ "_id" : "15477", "city" : "ROSCOE", "loc" : [ -79.865617, 40.078686 ], "pop" : 802, "state" : "PA" } +{ "_id" : "15478", "city" : "SMITHFIELD", "loc" : [ -79.81268, 39.792306 ], "pop" : 2163, "state" : "PA" } +{ "_id" : "15479", "city" : "VAN METER", "loc" : [ -79.73127700000001, 40.144267 ], "pop" : 1009, "state" : "PA" } +{ "_id" : "15480", "city" : "SMOCK", "loc" : [ -79.76782799999999, 39.996096 ], "pop" : 986, "state" : "PA" } +{ "_id" : "15482", "city" : "STAR JUNCTION", "loc" : [ -79.755461, 40.083198 ], "pop" : 2803, "state" : "PA" } +{ "_id" : "15483", "city" : "STOCKDALE", "loc" : [ -79.850103, 40.082567 ], "pop" : 630, "state" : "PA" } +{ "_id" : "15486", "city" : "VANDERBILT", "loc" : [ -79.69551800000001, 40.024581 ], "pop" : 2706, "state" : "PA" } +{ "_id" : "15488", "city" : "WALTERSBURG", "loc" : [ -79.78033600000001, 39.990465 ], "pop" : 237, "state" : "PA" } +{ "_id" : "15490", "city" : "WHITE", "loc" : [ -79.425117, 40.072596 ], "pop" : 138, "state" : "PA" } +{ "_id" : "15501", "city" : "SOMERSET", "loc" : [ -79.080814, 40.024813 ], "pop" : 18303, "state" : "PA" } +{ "_id" : "15521", "city" : "ALUM BANK", "loc" : [ -78.620591, 40.185833 ], "pop" : 2175, "state" : "PA" } +{ "_id" : "15522", "city" : "BEDFORD", "loc" : [ -78.526071, 39.990838 ], "pop" : 10788, "state" : "PA" } +{ "_id" : "15530", "city" : "BERLIN", "loc" : [ -78.96369199999999, 39.918847 ], "pop" : 4459, "state" : "PA" } +{ "_id" : "15531", "city" : "BOSWELL", "loc" : [ -79.036179, 40.191807 ], "pop" : 1681, "state" : "PA" } +{ "_id" : "15533", "city" : "BREEZEWOOD", "loc" : [ -78.245271, 39.990521 ], "pop" : 999, "state" : "PA" } +{ "_id" : "15534", "city" : "BUFFALO MILLS", "loc" : [ -78.69962, 39.922025 ], "pop" : 445, "state" : "PA" } +{ "_id" : "15535", "city" : "CLEARVILLE", "loc" : [ -78.43917999999999, 39.853284 ], "pop" : 2304, "state" : "PA" } +{ "_id" : "15536", "city" : "CRYSTAL SPRING", "loc" : [ -78.225836, 39.919973 ], "pop" : 643, "state" : "PA" } +{ "_id" : "15537", "city" : "EVERETT", "loc" : [ -78.371315, 40.009808 ], "pop" : 7289, "state" : "PA" } +{ "_id" : "15538", "city" : "GLENCOE", "loc" : [ -78.827522, 39.909046 ], "pop" : 1350, "state" : "PA" } +{ "_id" : "15540", "city" : "FORT HILL", "loc" : [ -79.23535, 39.877282 ], "pop" : 305, "state" : "PA" } +{ "_id" : "15541", "city" : "FRIEDENS", "loc" : [ -78.90329800000001, 40.010997 ], "pop" : 2065, "state" : "PA" } +{ "_id" : "15542", "city" : "GARRETT", "loc" : [ -79.061561, 39.864581 ], "pop" : 520, "state" : "PA" } +{ "_id" : "15545", "city" : "HYNDMAN", "loc" : [ -78.733512, 39.804857 ], "pop" : 2732, "state" : "PA" } +{ "_id" : "15546", "city" : "JENNERS", "loc" : [ -79.054571, 40.147321 ], "pop" : 4586, "state" : "PA" } +{ "_id" : "15550", "city" : "MANNS CHOICE", "loc" : [ -78.642259, 39.980787 ], "pop" : 1579, "state" : "PA" } +{ "_id" : "15551", "city" : "MARKLETON", "loc" : [ -79.287851, 39.869096 ], "pop" : 288, "state" : "PA" } +{ "_id" : "15552", "city" : "MEYERSDALE", "loc" : [ -79.026141, 39.790489 ], "pop" : 9276, "state" : "PA" } +{ "_id" : "15554", "city" : "NEW PARIS", "loc" : [ -78.58856900000001, 40.118876 ], "pop" : 3982, "state" : "PA" } +{ "_id" : "15557", "city" : "ROCKWOOD", "loc" : [ -79.18654600000001, 39.937296 ], "pop" : 5125, "state" : "PA" } +{ "_id" : "15558", "city" : "SALISBURY", "loc" : [ -79.083516, 39.753052 ], "pop" : 716, "state" : "PA" } +{ "_id" : "15559", "city" : "SCHELLSBURG", "loc" : [ -78.648194, 40.04869 ], "pop" : 1523, "state" : "PA" } +{ "_id" : "15562", "city" : "SPRINGS", "loc" : [ -79.08895, 39.748895 ], "pop" : 82, "state" : "PA" } +{ "_id" : "15563", "city" : "STOYSTOWN", "loc" : [ -78.955978, 40.109886 ], "pop" : 2690, "state" : "PA" } +{ "_id" : "15601", "city" : "GREENSBURG", "loc" : [ -79.542439, 40.307359 ], "pop" : 52186, "state" : "PA" } +{ "_id" : "15610", "city" : "ACME", "loc" : [ -79.482747, 40.104891 ], "pop" : 3862, "state" : "PA" } +{ "_id" : "15611", "city" : "ADAMSBURG", "loc" : [ -79.656469, 40.312577 ], "pop" : 255, "state" : "PA" } +{ "_id" : "15612", "city" : "ALVERTON", "loc" : [ -79.55860800000001, 40.127866 ], "pop" : 2166, "state" : "PA" } +{ "_id" : "15613", "city" : "APOLLO", "loc" : [ -79.577158, 40.556481 ], "pop" : 18588, "state" : "PA" } +{ "_id" : "15615", "city" : "ARDARA", "loc" : [ -79.73353299999999, 40.362993 ], "pop" : 450, "state" : "PA" } +{ "_id" : "15616", "city" : "ARMBRUST", "loc" : [ -79.553884, 40.236097 ], "pop" : 500, "state" : "PA" } +{ "_id" : "15617", "city" : "ARONA", "loc" : [ -79.659104, 40.26799 ], "pop" : 397, "state" : "PA" } +{ "_id" : "15618", "city" : "AVONMORE", "loc" : [ -79.485264, 40.522125 ], "pop" : 3306, "state" : "PA" } +{ "_id" : "15620", "city" : "BRADENVILLE", "loc" : [ -79.309679, 40.296094 ], "pop" : 139, "state" : "PA" } +{ "_id" : "15622", "city" : "CHAMPION", "loc" : [ -79.324719, 40.043976 ], "pop" : 109, "state" : "PA" } +{ "_id" : "15625", "city" : "DARRAGH", "loc" : [ -79.67803600000001, 40.260377 ], "pop" : 159, "state" : "PA" } +{ "_id" : "15626", "city" : "DELMONT", "loc" : [ -79.57638, 40.413901 ], "pop" : 2852, "state" : "PA" } +{ "_id" : "15627", "city" : "DERRY", "loc" : [ -79.33258499999999, 40.334931 ], "pop" : 10610, "state" : "PA" } +{ "_id" : "15628", "city" : "DONEGAL", "loc" : [ -79.38104300000001, 40.099613 ], "pop" : 584, "state" : "PA" } +{ "_id" : "15631", "city" : "EVERSON", "loc" : [ -79.587277, 40.091144 ], "pop" : 868, "state" : "PA" } +{ "_id" : "15632", "city" : "EXPORT", "loc" : [ -79.61102099999999, 40.425185 ], "pop" : 8364, "state" : "PA" } +{ "_id" : "15634", "city" : "GRAPEVILLE", "loc" : [ -79.603189, 40.303804 ], "pop" : 683, "state" : "PA" } +{ "_id" : "15636", "city" : "HARRISON CITY", "loc" : [ -79.679754, 40.372455 ], "pop" : 12018, "state" : "PA" } +{ "_id" : "15637", "city" : "HERMINIE", "loc" : [ -79.717164, 40.245485 ], "pop" : 3820, "state" : "PA" } +{ "_id" : "15639", "city" : "HUNKER", "loc" : [ -79.582364, 40.214947 ], "pop" : 1592, "state" : "PA" } +{ "_id" : "15641", "city" : "HYDE PARK", "loc" : [ -79.589884, 40.631102 ], "pop" : 542, "state" : "PA" } +{ "_id" : "15642", "city" : "NORTH HUNTINGDON", "loc" : [ -79.723855, 40.319227 ], "pop" : 36415, "state" : "PA" } +{ "_id" : "15644", "city" : "JEANNETTE", "loc" : [ -79.614412, 40.32947 ], "pop" : 20989, "state" : "PA" } +{ "_id" : "15646", "city" : "JONES MILLS", "loc" : [ -79.339933, 40.07977 ], "pop" : 226, "state" : "PA" } +{ "_id" : "15647", "city" : "LARIMER", "loc" : [ -79.736627, 40.351842 ], "pop" : 1731, "state" : "PA" } +{ "_id" : "15650", "city" : "LATROBE", "loc" : [ -79.41027800000001, 40.292625 ], "pop" : 29529, "state" : "PA" } +{ "_id" : "15655", "city" : "LAUGHLINTOWN", "loc" : [ -79.18058000000001, 40.208025 ], "pop" : 436, "state" : "PA" } +{ "_id" : "15656", "city" : "LEECHBURG", "loc" : [ -79.62010100000001, 40.634398 ], "pop" : 11552, "state" : "PA" } +{ "_id" : "15658", "city" : "WILPEN", "loc" : [ -79.236666, 40.245133 ], "pop" : 9229, "state" : "PA" } +{ "_id" : "15661", "city" : "LOYALHANNA", "loc" : [ -79.344157, 40.30199 ], "pop" : 564, "state" : "PA" } +{ "_id" : "15663", "city" : "MADISON", "loc" : [ -79.675978, 40.246669 ], "pop" : 539, "state" : "PA" } +{ "_id" : "15665", "city" : "MANOR", "loc" : [ -79.671221, 40.33822 ], "pop" : 3848, "state" : "PA" } +{ "_id" : "15666", "city" : "MOUNT PLEASANT", "loc" : [ -79.513383, 40.174179 ], "pop" : 15336, "state" : "PA" } +{ "_id" : "15668", "city" : "MURRYSVILLE", "loc" : [ -79.68415400000001, 40.446674 ], "pop" : 10965, "state" : "PA" } +{ "_id" : "15670", "city" : "NEW ALEXANDRIA", "loc" : [ -79.39659399999999, 40.398112 ], "pop" : 2658, "state" : "PA" } +{ "_id" : "15671", "city" : "NEW DERRY", "loc" : [ -79.30086300000001, 40.333334 ], "pop" : 2950, "state" : "PA" } +{ "_id" : "15672", "city" : "NEW STANTON", "loc" : [ -79.61818700000001, 40.223345 ], "pop" : 3237, "state" : "PA" } +{ "_id" : "15675", "city" : "PENN", "loc" : [ -79.641336, 40.330081 ], "pop" : 619, "state" : "PA" } +{ "_id" : "15677", "city" : "RECTOR", "loc" : [ -79.247331, 40.186444 ], "pop" : 376, "state" : "PA" } +{ "_id" : "15678", "city" : "RILLTON", "loc" : [ -79.728211, 40.282454 ], "pop" : 1050, "state" : "PA" } +{ "_id" : "15679", "city" : "RUFFS DALE", "loc" : [ -79.627743, 40.158458 ], "pop" : 6385, "state" : "PA" } +{ "_id" : "15681", "city" : "SALTSBURG", "loc" : [ -79.44284399999999, 40.479239 ], "pop" : 3922, "state" : "PA" } +{ "_id" : "15683", "city" : "SCOTTDALE", "loc" : [ -79.593017, 40.102948 ], "pop" : 6132, "state" : "PA" } +{ "_id" : "15684", "city" : "SLICKVILLE", "loc" : [ -79.506654, 40.465347 ], "pop" : 318, "state" : "PA" } +{ "_id" : "15686", "city" : "SPRING CHURCH", "loc" : [ -79.454487, 40.615329 ], "pop" : 1291, "state" : "PA" } +{ "_id" : "15687", "city" : "STAHLSTOWN", "loc" : [ -79.34447299999999, 40.138593 ], "pop" : 2555, "state" : "PA" } +{ "_id" : "15688", "city" : "TARRS", "loc" : [ -79.566101, 40.161915 ], "pop" : 385, "state" : "PA" } +{ "_id" : "15690", "city" : "PARK", "loc" : [ -79.56553099999999, 40.605883 ], "pop" : 9409, "state" : "PA" } +{ "_id" : "15692", "city" : "WESTMORELAND CIT", "loc" : [ -79.547696, 40.276802 ], "pop" : 2293, "state" : "PA" } +{ "_id" : "15697", "city" : "YOUNGWOOD", "loc" : [ -79.582291, 40.239482 ], "pop" : 3319, "state" : "PA" } +{ "_id" : "15698", "city" : "YUKON", "loc" : [ -79.68494099999999, 40.215529 ], "pop" : 726, "state" : "PA" } +{ "_id" : "15701", "city" : "INDIANA", "loc" : [ -79.15959599999999, 40.619628 ], "pop" : 28962, "state" : "PA" } +{ "_id" : "15711", "city" : "ANITA", "loc" : [ -78.96663700000001, 41.001806 ], "pop" : 586, "state" : "PA" } +{ "_id" : "15713", "city" : "AULTMAN", "loc" : [ -79.219791, 40.540083 ], "pop" : 162, "state" : "PA" } +{ "_id" : "15714", "city" : "BARNESBORO", "loc" : [ -78.777058, 40.673307 ], "pop" : 3878, "state" : "PA" } +{ "_id" : "15716", "city" : "BLACK LICK", "loc" : [ -79.193231, 40.466905 ], "pop" : 1100, "state" : "PA" } +{ "_id" : "15717", "city" : "BLAIRSVILLE", "loc" : [ -79.25332899999999, 40.441262 ], "pop" : 9738, "state" : "PA" } +{ "_id" : "15720", "city" : "BRUSH VALLEY", "loc" : [ -79.05876499999999, 40.528565 ], "pop" : 1811, "state" : "PA" } +{ "_id" : "15721", "city" : "BURNSIDE", "loc" : [ -78.78648800000001, 40.813431 ], "pop" : 350, "state" : "PA" } +{ "_id" : "15722", "city" : "CARROLLTOWN", "loc" : [ -78.703676, 40.589054 ], "pop" : 2644, "state" : "PA" } +{ "_id" : "15724", "city" : "CHERRY TREE", "loc" : [ -78.847357, 40.755387 ], "pop" : 2220, "state" : "PA" } +{ "_id" : "15725", "city" : "CLARKSBURG", "loc" : [ -79.367676, 40.503933 ], "pop" : 1369, "state" : "PA" } +{ "_id" : "15728", "city" : "CLYMER", "loc" : [ -79.01186300000001, 40.668811 ], "pop" : 1499, "state" : "PA" } +{ "_id" : "15729", "city" : "COMMODORE", "loc" : [ -78.913371, 40.701588 ], "pop" : 3259, "state" : "PA" } +{ "_id" : "15730", "city" : "COOLSPRING", "loc" : [ -78.922015, 40.951816 ], "pop" : 44, "state" : "PA" } +{ "_id" : "15732", "city" : "CREEKSIDE", "loc" : [ -79.201396, 40.719892 ], "pop" : 2198, "state" : "PA" } +{ "_id" : "15739", "city" : "ERNEST", "loc" : [ -79.096937, 40.704255 ], "pop" : 3841, "state" : "PA" } +{ "_id" : "15742", "city" : "GLEN CAMPBELL", "loc" : [ -78.855538, 40.850766 ], "pop" : 1308, "state" : "PA" } +{ "_id" : "15744", "city" : "HAMILTON", "loc" : [ -79.093987, 40.921432 ], "pop" : 0, "state" : "PA" } +{ "_id" : "15747", "city" : "HOME", "loc" : [ -79.16408199999999, 40.783441 ], "pop" : 926, "state" : "PA" } +{ "_id" : "15748", "city" : "GRACETON", "loc" : [ -79.183942, 40.538375 ], "pop" : 3677, "state" : "PA" } +{ "_id" : "15753", "city" : "LA JOSE", "loc" : [ -78.62336999999999, 40.830118 ], "pop" : 1119, "state" : "PA" } +{ "_id" : "15754", "city" : "LUCERNEMINES", "loc" : [ -79.157349, 40.545313 ], "pop" : 3227, "state" : "PA" } +{ "_id" : "15757", "city" : "MC GEES MILLS", "loc" : [ -78.72038999999999, 40.889251 ], "pop" : 1792, "state" : "PA" } +{ "_id" : "15758", "city" : "MARCHAND", "loc" : [ -79.045151, 40.875411 ], "pop" : 1302, "state" : "PA" } +{ "_id" : "15759", "city" : "MARION CENTER", "loc" : [ -79.02524, 40.78135 ], "pop" : 2085, "state" : "PA" } +{ "_id" : "15760", "city" : "MARSTELLER", "loc" : [ -78.813356, 40.65004 ], "pop" : 959, "state" : "PA" } +{ "_id" : "15762", "city" : "NICKTOWN", "loc" : [ -78.81139400000001, 40.601623 ], "pop" : 1395, "state" : "PA" } +{ "_id" : "15763", "city" : "NORTHPOINT", "loc" : [ -79.125657, 40.903703 ], "pop" : 49, "state" : "PA" } +{ "_id" : "15764", "city" : "OLIVEBURG", "loc" : [ -79.038197, 40.996379 ], "pop" : 8, "state" : "PA" } +{ "_id" : "15765", "city" : "PENN RUN", "loc" : [ -78.971597, 40.626825 ], "pop" : 4258, "state" : "PA" } +{ "_id" : "15767", "city" : "PUNXSUTAWNEY", "loc" : [ -78.968056, 40.947937 ], "pop" : 12377, "state" : "PA" } +{ "_id" : "15770", "city" : "RINGGOLD", "loc" : [ -79.176581, 40.999731 ], "pop" : 692, "state" : "PA" } +{ "_id" : "15771", "city" : "ROCHESTER MILLS", "loc" : [ -78.997985, 40.819482 ], "pop" : 253, "state" : "PA" } +{ "_id" : "15772", "city" : "ROSSITER", "loc" : [ -78.94135300000001, 40.884553 ], "pop" : 1858, "state" : "PA" } +{ "_id" : "15773", "city" : "SAINT BENEDICT", "loc" : [ -78.738332, 40.611845 ], "pop" : 1544, "state" : "PA" } +{ "_id" : "15774", "city" : "SHELOCTA", "loc" : [ -79.31907, 40.638787 ], "pop" : 7854, "state" : "PA" } +{ "_id" : "15775", "city" : "SPANGLER", "loc" : [ -78.76906099999999, 40.648082 ], "pop" : 2851, "state" : "PA" } +{ "_id" : "15776", "city" : "SPRANKLE MILLS", "loc" : [ -79.077809, 41.01846 ], "pop" : 980, "state" : "PA" } +{ "_id" : "15777", "city" : "STARFORD", "loc" : [ -78.980317, 40.700971 ], "pop" : 850, "state" : "PA" } +{ "_id" : "15778", "city" : "TIMBLIN", "loc" : [ -79.20135000000001, 40.968387 ], "pop" : 178, "state" : "PA" } +{ "_id" : "15780", "city" : "VALIER", "loc" : [ -79.083263, 40.922851 ], "pop" : 44, "state" : "PA" } +{ "_id" : "15784", "city" : "WORTHVILLE", "loc" : [ -79.138685, 41.023767 ], "pop" : 65, "state" : "PA" } +{ "_id" : "15801", "city" : "DU BOIS", "loc" : [ -78.752698, 41.126039 ], "pop" : 17345, "state" : "PA" } +{ "_id" : "15821", "city" : "BENEZETT", "loc" : [ -78.35762099999999, 41.325318 ], "pop" : 243, "state" : "PA" } +{ "_id" : "15823", "city" : "BROCKPORT", "loc" : [ -78.712829, 41.28217 ], "pop" : 1646, "state" : "PA" } +{ "_id" : "15824", "city" : "BROCKWAY", "loc" : [ -78.81156799999999, 41.240564 ], "pop" : 6361, "state" : "PA" } +{ "_id" : "15825", "city" : "HAZEN", "loc" : [ -79.06410099999999, 41.159986 ], "pop" : 9303, "state" : "PA" } +{ "_id" : "15827", "city" : "BYRNEDALE", "loc" : [ -78.505126, 41.286459 ], "pop" : 1892, "state" : "PA" } +{ "_id" : "15828", "city" : "CLARINGTON", "loc" : [ -79.146557, 41.323272 ], "pop" : 311, "state" : "PA" } +{ "_id" : "15829", "city" : "CORSICA", "loc" : [ -79.175567, 41.182983 ], "pop" : 1070, "state" : "PA" } +{ "_id" : "15832", "city" : "DRIFTWOOD", "loc" : [ -78.163194, 41.376396 ], "pop" : 526, "state" : "PA" } +{ "_id" : "15834", "city" : "EMPORIUM", "loc" : [ -78.25360999999999, 41.517689 ], "pop" : 5219, "state" : "PA" } +{ "_id" : "15840", "city" : "FALLS CREEK", "loc" : [ -78.812791, 41.145505 ], "pop" : 1422, "state" : "PA" } +{ "_id" : "15845", "city" : "JOHNSONBURG", "loc" : [ -78.67825999999999, 41.492823 ], "pop" : 3350, "state" : "PA" } +{ "_id" : "15846", "city" : "KERSEY", "loc" : [ -78.60151999999999, 41.356271 ], "pop" : 3392, "state" : "PA" } +{ "_id" : "15848", "city" : "LUTHERSBURG", "loc" : [ -78.74275799999999, 41.05321 ], "pop" : 2249, "state" : "PA" } +{ "_id" : "15849", "city" : "PENFIELD", "loc" : [ -78.579111, 41.208519 ], "pop" : 1395, "state" : "PA" } +{ "_id" : "15851", "city" : "REYNOLDSVILLE", "loc" : [ -78.896147, 41.062935 ], "pop" : 8758, "state" : "PA" } +{ "_id" : "15853", "city" : "PORTLAND MILLS", "loc" : [ -78.729715, 41.431566 ], "pop" : 7419, "state" : "PA" } +{ "_id" : "15856", "city" : "ROCKTON", "loc" : [ -78.657662, 41.080571 ], "pop" : 833, "state" : "PA" } +{ "_id" : "15857", "city" : "SAINT MARYS", "loc" : [ -78.550533, 41.428949 ], "pop" : 14020, "state" : "PA" } +{ "_id" : "15860", "city" : "SIGEL", "loc" : [ -79.053957, 41.309921 ], "pop" : 1103, "state" : "PA" } +{ "_id" : "15861", "city" : "SINNAMAHONING", "loc" : [ -78.06607, 41.376197 ], "pop" : 168, "state" : "PA" } +{ "_id" : "15864", "city" : "SUMMERVILLE", "loc" : [ -79.172583, 41.105822 ], "pop" : 1749, "state" : "PA" } +{ "_id" : "15865", "city" : "SYKESVILLE", "loc" : [ -78.819508, 41.05137 ], "pop" : 1387, "state" : "PA" } +{ "_id" : "15868", "city" : "WEEDVILLE", "loc" : [ -78.495165, 41.268502 ], "pop" : 195, "state" : "PA" } +{ "_id" : "15870", "city" : "WILCOX", "loc" : [ -78.682295, 41.573471 ], "pop" : 1870, "state" : "PA" } +{ "_id" : "15901", "city" : "JOHNSTOWN", "loc" : [ -78.91408, 40.325957 ], "pop" : 6649, "state" : "PA" } +{ "_id" : "15902", "city" : "JOHNSTOWN", "loc" : [ -78.896905, 40.307787 ], "pop" : 16012, "state" : "PA" } +{ "_id" : "15904", "city" : "JOHNSTOWN", "loc" : [ -78.86538299999999, 40.285026 ], "pop" : 16858, "state" : "PA" } +{ "_id" : "15905", "city" : "JOHNSTOWN", "loc" : [ -78.943006, 40.307188 ], "pop" : 22509, "state" : "PA" } +{ "_id" : "15906", "city" : "JOHNSTOWN", "loc" : [ -78.938317, 40.352193 ], "pop" : 13249, "state" : "PA" } +{ "_id" : "15909", "city" : "JOHNSTOWN", "loc" : [ -78.862284, 40.387965 ], "pop" : 7944, "state" : "PA" } +{ "_id" : "15920", "city" : "ARMAGH", "loc" : [ -79.01305499999999, 40.442452 ], "pop" : 2839, "state" : "PA" } +{ "_id" : "15923", "city" : "BOLIVAR", "loc" : [ -79.160546, 40.367289 ], "pop" : 2043, "state" : "PA" } +{ "_id" : "15924", "city" : "CAIRNBROOK", "loc" : [ -78.81008199999999, 40.114472 ], "pop" : 2178, "state" : "PA" } +{ "_id" : "15926", "city" : "CENTRAL CITY", "loc" : [ -78.844753, 40.091257 ], "pop" : 2886, "state" : "PA" } +{ "_id" : "15927", "city" : "COLVER", "loc" : [ -78.778432, 40.541086 ], "pop" : 1531, "state" : "PA" } +{ "_id" : "15928", "city" : "DAVIDSVILLE", "loc" : [ -78.936333, 40.224451 ], "pop" : 244, "state" : "PA" } +{ "_id" : "15931", "city" : "EBENSBURG", "loc" : [ -78.726294, 40.480105 ], "pop" : 9386, "state" : "PA" } +{ "_id" : "15935", "city" : "HOLLSOPPLE", "loc" : [ -78.951471, 40.234301 ], "pop" : 7012, "state" : "PA" } +{ "_id" : "15936", "city" : "HOOVERSVILLE", "loc" : [ -78.91407100000001, 40.148776 ], "pop" : 731, "state" : "PA" } +{ "_id" : "15938", "city" : "LILLY", "loc" : [ -78.62306, 40.423844 ], "pop" : 2252, "state" : "PA" } +{ "_id" : "15940", "city" : "LORETTO", "loc" : [ -78.629357, 40.510484 ], "pop" : 2771, "state" : "PA" } +{ "_id" : "15942", "city" : "MINERAL POINT", "loc" : [ -78.835201, 40.379253 ], "pop" : 420, "state" : "PA" } +{ "_id" : "15943", "city" : "NANTY GLO", "loc" : [ -78.837504, 40.470435 ], "pop" : 4680, "state" : "PA" } +{ "_id" : "15944", "city" : "NEW FLORENCE", "loc" : [ -79.09680299999999, 40.382266 ], "pop" : 3949, "state" : "PA" } +{ "_id" : "15945", "city" : "PARKHILL", "loc" : [ -78.869432, 40.359385 ], "pop" : 120, "state" : "PA" } +{ "_id" : "15946", "city" : "PURITAN", "loc" : [ -78.671753, 40.384201 ], "pop" : 8160, "state" : "PA" } +{ "_id" : "15949", "city" : "ROBINSON", "loc" : [ -79.137928, 40.407655 ], "pop" : 829, "state" : "PA" } +{ "_id" : "15951", "city" : "SAINT MICHAEL", "loc" : [ -78.782999, 40.336248 ], "pop" : 1425, "state" : "PA" } +{ "_id" : "15952", "city" : "SALIX", "loc" : [ -78.74370399999999, 40.300627 ], "pop" : 6215, "state" : "PA" } +{ "_id" : "15953", "city" : "SEANOR", "loc" : [ -78.890897, 40.231191 ], "pop" : 18, "state" : "PA" } +{ "_id" : "15954", "city" : "SEWARD", "loc" : [ -79.023224, 40.409907 ], "pop" : 1348, "state" : "PA" } +{ "_id" : "15955", "city" : "SIDMAN", "loc" : [ -78.745966, 40.329873 ], "pop" : 1235, "state" : "PA" } +{ "_id" : "15956", "city" : "SOUTH FORK", "loc" : [ -78.78867099999999, 40.362877 ], "pop" : 2497, "state" : "PA" } +{ "_id" : "15957", "city" : "STRONGSTOWN", "loc" : [ -78.912961, 40.56279 ], "pop" : 678, "state" : "PA" } +{ "_id" : "15958", "city" : "SUMMERHILL", "loc" : [ -78.755979, 40.388959 ], "pop" : 2215, "state" : "PA" } +{ "_id" : "15960", "city" : "TWIN ROCKS", "loc" : [ -78.860488, 40.518254 ], "pop" : 1535, "state" : "PA" } +{ "_id" : "15961", "city" : "VINTONDALE", "loc" : [ -78.94267000000001, 40.493949 ], "pop" : 2141, "state" : "PA" } +{ "_id" : "15963", "city" : "WINDBER", "loc" : [ -78.83028899999999, 40.228695 ], "pop" : 11421, "state" : "PA" } +{ "_id" : "16001", "city" : "BON AIRE", "loc" : [ -79.902717, 40.862096 ], "pop" : 55158, "state" : "PA" } +{ "_id" : "16020", "city" : "BOYERS", "loc" : [ -79.904692, 41.109205 ], "pop" : 974, "state" : "PA" } +{ "_id" : "16022", "city" : "BRUIN", "loc" : [ -79.729051, 41.057078 ], "pop" : 637, "state" : "PA" } +{ "_id" : "16023", "city" : "MARWOOD", "loc" : [ -79.77085099999999, 40.779723 ], "pop" : 3483, "state" : "PA" } +{ "_id" : "16025", "city" : "CHICORA", "loc" : [ -79.74623699999999, 40.945768 ], "pop" : 4673, "state" : "PA" } +{ "_id" : "16028", "city" : "EAST BRADY", "loc" : [ -79.63018700000001, 40.974373 ], "pop" : 2069, "state" : "PA" } +{ "_id" : "16030", "city" : "EAU CLAIRE", "loc" : [ -79.79809299999999, 41.13478 ], "pop" : 371, "state" : "PA" } +{ "_id" : "16033", "city" : "EVANS CITY", "loc" : [ -80.059195, 40.780795 ], "pop" : 6859, "state" : "PA" } +{ "_id" : "16034", "city" : "FENELTON", "loc" : [ -79.73715199999999, 40.855464 ], "pop" : 1753, "state" : "PA" } +{ "_id" : "16036", "city" : "FOXBURG", "loc" : [ -79.653443, 41.160239 ], "pop" : 988, "state" : "PA" } +{ "_id" : "16037", "city" : "HARMONY", "loc" : [ -80.13811699999999, 40.849646 ], "pop" : 2049, "state" : "PA" } +{ "_id" : "16038", "city" : "HARRISVILLE", "loc" : [ -79.97963900000001, 41.163087 ], "pop" : 3617, "state" : "PA" } +{ "_id" : "16040", "city" : "HILLIARDS", "loc" : [ -79.821456, 41.100894 ], "pop" : 1092, "state" : "PA" } +{ "_id" : "16041", "city" : "KARNS CITY", "loc" : [ -79.71601699999999, 41.002193 ], "pop" : 3032, "state" : "PA" } +{ "_id" : "16045", "city" : "LYNDORA", "loc" : [ -79.921401, 40.855071 ], "pop" : 2232, "state" : "PA" } +{ "_id" : "16046", "city" : "MARS", "loc" : [ -80.035769, 40.700514 ], "pop" : 10192, "state" : "PA" } +{ "_id" : "16049", "city" : "PARKER", "loc" : [ -79.68888800000001, 41.100891 ], "pop" : 3131, "state" : "PA" } +{ "_id" : "16050", "city" : "PETROLIA", "loc" : [ -79.771069, 41.044208 ], "pop" : 491, "state" : "PA" } +{ "_id" : "16051", "city" : "PORTERSVILLE", "loc" : [ -80.172965, 40.948651 ], "pop" : 3642, "state" : "PA" } +{ "_id" : "16052", "city" : "PROSPECT", "loc" : [ -80.067903, 40.904941 ], "pop" : 2224, "state" : "PA" } +{ "_id" : "16053", "city" : "RENFREW", "loc" : [ -79.97700399999999, 40.810003 ], "pop" : 3180, "state" : "PA" } +{ "_id" : "16055", "city" : "SARVER", "loc" : [ -79.74243, 40.714285 ], "pop" : 8370, "state" : "PA" } +{ "_id" : "16056", "city" : "SAXONBURG", "loc" : [ -79.835222, 40.736099 ], "pop" : 4693, "state" : "PA" } +{ "_id" : "16057", "city" : "SLIPPERY ROCK", "loc" : [ -80.046847, 41.045412 ], "pop" : 12443, "state" : "PA" } +{ "_id" : "16059", "city" : "VALENCIA", "loc" : [ -79.92352700000001, 40.701831 ], "pop" : 6437, "state" : "PA" } +{ "_id" : "16061", "city" : "WEST SUNBURY", "loc" : [ -79.875134, 41.002601 ], "pop" : 1999, "state" : "PA" } +{ "_id" : "16063", "city" : "ZELIENOPLE", "loc" : [ -80.128564, 40.73136 ], "pop" : 18300, "state" : "PA" } +{ "_id" : "16101", "city" : "NEW CASTLE", "loc" : [ -80.32844900000001, 40.99222 ], "pop" : 36694, "state" : "PA" } +{ "_id" : "16102", "city" : "NEW CASTLE", "loc" : [ -80.390704, 40.967745 ], "pop" : 7186, "state" : "PA" } +{ "_id" : "16105", "city" : "NESHANNOCK", "loc" : [ -80.342191, 41.033502 ], "pop" : 14292, "state" : "PA" } +{ "_id" : "16110", "city" : "ADAMSVILLE", "loc" : [ -80.376544, 41.506677 ], "pop" : 287, "state" : "PA" } +{ "_id" : "16111", "city" : "ATLANTIC", "loc" : [ -80.28625099999999, 41.533313 ], "pop" : 2390, "state" : "PA" } +{ "_id" : "16112", "city" : "BESSEMER", "loc" : [ -80.493689, 40.975493 ], "pop" : 1611, "state" : "PA" } +{ "_id" : "16114", "city" : "CLARKS MILLS", "loc" : [ -80.175223, 41.385141 ], "pop" : 1351, "state" : "PA" } +{ "_id" : "16115", "city" : "DARLINGTON", "loc" : [ -80.455611, 40.796839 ], "pop" : 3397, "state" : "PA" } +{ "_id" : "16116", "city" : "EDINBURG", "loc" : [ -80.463178, 41.027614 ], "pop" : 3240, "state" : "PA" } +{ "_id" : "16117", "city" : "ELLPORT", "loc" : [ -80.27460600000001, 40.859024 ], "pop" : 19193, "state" : "PA" } +{ "_id" : "16120", "city" : "ENON VALLEY", "loc" : [ -80.46118199999999, 40.8721 ], "pop" : 2421, "state" : "PA" } +{ "_id" : "16121", "city" : "FARRELL", "loc" : [ -80.49444200000001, 41.210995 ], "pop" : 7619, "state" : "PA" } +{ "_id" : "16123", "city" : "FOMBELL", "loc" : [ -80.207312, 40.812527 ], "pop" : 2611, "state" : "PA" } +{ "_id" : "16124", "city" : "FREDONIA", "loc" : [ -80.26987099999999, 41.324141 ], "pop" : 1772, "state" : "PA" } +{ "_id" : "16125", "city" : "SHENANGO", "loc" : [ -80.38034399999999, 41.399403 ], "pop" : 19982, "state" : "PA" } +{ "_id" : "16127", "city" : "GROVE CITY", "loc" : [ -80.084138, 41.160704 ], "pop" : 14568, "state" : "PA" } +{ "_id" : "16130", "city" : "HADLEY", "loc" : [ -80.153544, 41.43302 ], "pop" : 3623, "state" : "PA" } +{ "_id" : "16131", "city" : "HARTSTOWN", "loc" : [ -80.381321, 41.550875 ], "pop" : 406, "state" : "PA" } +{ "_id" : "16133", "city" : "JACKSON CENTER", "loc" : [ -80.10372599999999, 41.280134 ], "pop" : 1959, "state" : "PA" } +{ "_id" : "16134", "city" : "WESTFORD", "loc" : [ -80.456459, 41.506031 ], "pop" : 3328, "state" : "PA" } +{ "_id" : "16137", "city" : "MERCER", "loc" : [ -80.23401800000001, 41.23254 ], "pop" : 11036, "state" : "PA" } +{ "_id" : "16141", "city" : "NEW GALILEE", "loc" : [ -80.39390400000001, 40.856891 ], "pop" : 1852, "state" : "PA" } +{ "_id" : "16142", "city" : "NEW WILMINGTON", "loc" : [ -80.324541, 41.138155 ], "pop" : 9268, "state" : "PA" } +{ "_id" : "16143", "city" : "PULASKI", "loc" : [ -80.468515, 41.094215 ], "pop" : 3898, "state" : "PA" } +{ "_id" : "16145", "city" : "SANDY LAKE", "loc" : [ -80.04974, 41.338337 ], "pop" : 843, "state" : "PA" } +{ "_id" : "16146", "city" : "SHARON", "loc" : [ -80.499342, 41.231552 ], "pop" : 17457, "state" : "PA" } +{ "_id" : "16148", "city" : "HERMITAGE", "loc" : [ -80.45303, 41.232601 ], "pop" : 14573, "state" : "PA" } +{ "_id" : "16150", "city" : "SHARPSVILLE", "loc" : [ -80.465642, 41.267648 ], "pop" : 8962, "state" : "PA" } +{ "_id" : "16153", "city" : "STONEBORO", "loc" : [ -80.097613, 41.34385 ], "pop" : 2249, "state" : "PA" } +{ "_id" : "16154", "city" : "TRANSFER", "loc" : [ -80.419742, 41.324401 ], "pop" : 2662, "state" : "PA" } +{ "_id" : "16156", "city" : "VOLANT", "loc" : [ -80.244129, 41.093767 ], "pop" : 2114, "state" : "PA" } +{ "_id" : "16157", "city" : "WAMPUM", "loc" : [ -80.339184, 40.881879 ], "pop" : 5466, "state" : "PA" } +{ "_id" : "16159", "city" : "WEST MIDDLESEX", "loc" : [ -80.452759, 41.174054 ], "pop" : 5604, "state" : "PA" } +{ "_id" : "16201", "city" : "KITTANNING", "loc" : [ -79.51067500000001, 40.815516 ], "pop" : 19140, "state" : "PA" } +{ "_id" : "16210", "city" : "ADRIAN", "loc" : [ -79.50744400000001, 40.904902 ], "pop" : 726, "state" : "PA" } +{ "_id" : "16212", "city" : "CADOGAN", "loc" : [ -79.57982699999999, 40.75392 ], "pop" : 427, "state" : "PA" } +{ "_id" : "16213", "city" : "CALLENSBURG", "loc" : [ -79.55695, 41.132379 ], "pop" : 688, "state" : "PA" } +{ "_id" : "16214", "city" : "CLARION", "loc" : [ -79.377268, 41.212272 ], "pop" : 8740, "state" : "PA" } +{ "_id" : "16217", "city" : "COOKSBURG", "loc" : [ -79.19708, 41.338366 ], "pop" : 36, "state" : "PA" } +{ "_id" : "16218", "city" : "COWANSVILLE", "loc" : [ -79.594607, 40.922985 ], "pop" : 1089, "state" : "PA" } +{ "_id" : "16222", "city" : "DAYTON", "loc" : [ -79.268551, 40.874101 ], "pop" : 1974, "state" : "PA" } +{ "_id" : "16224", "city" : "FAIRMOUNT CITY", "loc" : [ -79.27840500000001, 41.042861 ], "pop" : 2104, "state" : "PA" } +{ "_id" : "16225", "city" : "FISHER", "loc" : [ -79.247033, 41.266737 ], "pop" : 407, "state" : "PA" } +{ "_id" : "16226", "city" : "FORD CITY", "loc" : [ -79.51222, 40.738407 ], "pop" : 6576, "state" : "PA" } +{ "_id" : "16229", "city" : "FREEPORT", "loc" : [ -79.66299100000001, 40.703277 ], "pop" : 4517, "state" : "PA" } +{ "_id" : "16232", "city" : "KNOX", "loc" : [ -79.51940399999999, 41.224518 ], "pop" : 7489, "state" : "PA" } +{ "_id" : "16233", "city" : "LEEPER", "loc" : [ -79.302179, 41.367074 ], "pop" : 487, "state" : "PA" } +{ "_id" : "16234", "city" : "LIMESTONE", "loc" : [ -79.29929199999999, 41.133396 ], "pop" : 1686, "state" : "PA" } +{ "_id" : "16235", "city" : "LUCINDA", "loc" : [ -79.375372, 41.312377 ], "pop" : 1281, "state" : "PA" } +{ "_id" : "16236", "city" : "MC GRANN", "loc" : [ -79.53086, 40.76929 ], "pop" : 3844, "state" : "PA" } +{ "_id" : "16238", "city" : "MANORVILLE", "loc" : [ -79.521333, 40.786256 ], "pop" : 418, "state" : "PA" } +{ "_id" : "16239", "city" : "MARIENVILLE", "loc" : [ -79.13058100000001, 41.462237 ], "pop" : 1374, "state" : "PA" } +{ "_id" : "16240", "city" : "MAYPORT", "loc" : [ -79.261701, 40.99059 ], "pop" : 1058, "state" : "PA" } +{ "_id" : "16242", "city" : "NEW BETHLEHEM", "loc" : [ -79.352654, 40.9999 ], "pop" : 4698, "state" : "PA" } +{ "_id" : "16248", "city" : "HUEY", "loc" : [ -79.510677, 41.039434 ], "pop" : 3629, "state" : "PA" } +{ "_id" : "16249", "city" : "RURAL VALLEY", "loc" : [ -79.299102, 40.788488 ], "pop" : 3499, "state" : "PA" } +{ "_id" : "16254", "city" : "SHIPPENVILLE", "loc" : [ -79.433199, 41.247491 ], "pop" : 2448, "state" : "PA" } +{ "_id" : "16255", "city" : "SLIGO", "loc" : [ -79.480485, 41.11394 ], "pop" : 1213, "state" : "PA" } +{ "_id" : "16256", "city" : "SMICKSBURG", "loc" : [ -79.161432, 40.837193 ], "pop" : 2236, "state" : "PA" } +{ "_id" : "16258", "city" : "STRATTANVILLE", "loc" : [ -79.308188, 41.195498 ], "pop" : 2086, "state" : "PA" } +{ "_id" : "16259", "city" : "TEMPLETON", "loc" : [ -79.449884, 40.941884 ], "pop" : 1654, "state" : "PA" } +{ "_id" : "16260", "city" : "VOWINCKEL", "loc" : [ -79.274553, 41.378642 ], "pop" : 1615, "state" : "PA" } +{ "_id" : "16262", "city" : "CRAIGSVILLE", "loc" : [ -79.638525, 40.834442 ], "pop" : 3065, "state" : "PA" } +{ "_id" : "16301", "city" : "OIL CITY", "loc" : [ -79.691648, 41.431936 ], "pop" : 19792, "state" : "PA" } +{ "_id" : "16311", "city" : "CARLTON", "loc" : [ -80.020302, 41.481541 ], "pop" : 282, "state" : "PA" } +{ "_id" : "16313", "city" : "CLARENDON", "loc" : [ -79.171949, 41.730224 ], "pop" : 422, "state" : "PA" } +{ "_id" : "16314", "city" : "COCHRANTON", "loc" : [ -80.05726900000001, 41.520487 ], "pop" : 3010, "state" : "PA" } +{ "_id" : "16316", "city" : "CONNEAUT LAKE", "loc" : [ -80.308567, 41.6189 ], "pop" : 3849, "state" : "PA" } +{ "_id" : "16317", "city" : "COOPERSTOWN", "loc" : [ -79.875676, 41.497998 ], "pop" : 506, "state" : "PA" } +{ "_id" : "16319", "city" : "CRANBERRY", "loc" : [ -79.719121, 41.337184 ], "pop" : 353, "state" : "PA" } +{ "_id" : "16321", "city" : "EAST HICKORY", "loc" : [ -79.38548299999999, 41.5691 ], "pop" : 282, "state" : "PA" } +{ "_id" : "16323", "city" : "FRANKLIN", "loc" : [ -79.83089, 41.404775 ], "pop" : 18357, "state" : "PA" } +{ "_id" : "16326", "city" : "FRYBURG", "loc" : [ -79.41340099999999, 41.371736 ], "pop" : 1880, "state" : "PA" } +{ "_id" : "16327", "city" : "GUYS MILLS", "loc" : [ -79.97143699999999, 41.633265 ], "pop" : 2825, "state" : "PA" } +{ "_id" : "16329", "city" : "IRVINE", "loc" : [ -79.286303, 41.843283 ], "pop" : 479, "state" : "PA" } +{ "_id" : "16331", "city" : "KOSSUTH", "loc" : [ -79.588249, 41.290215 ], "pop" : 43, "state" : "PA" } +{ "_id" : "16332", "city" : "LICKINGVILLE", "loc" : [ -79.371516, 41.3789 ], "pop" : 22, "state" : "PA" } +{ "_id" : "16333", "city" : "LUDLOW", "loc" : [ -78.924345, 41.728409 ], "pop" : 612, "state" : "PA" } +{ "_id" : "16334", "city" : "MARBLE", "loc" : [ -79.44592900000001, 41.326077 ], "pop" : 27, "state" : "PA" } +{ "_id" : "16335", "city" : "MEADVILLE", "loc" : [ -80.148787, 41.633847 ], "pop" : 31290, "state" : "PA" } +{ "_id" : "16340", "city" : "PITTSFIELD", "loc" : [ -79.419619, 41.836629 ], "pop" : 3172, "state" : "PA" } +{ "_id" : "16341", "city" : "PLEASANTVILLE", "loc" : [ -79.5685, 41.586696 ], "pop" : 2211, "state" : "PA" } +{ "_id" : "16342", "city" : "POLK", "loc" : [ -79.93461000000001, 41.358315 ], "pop" : 3159, "state" : "PA" } +{ "_id" : "16345", "city" : "RUSSELL", "loc" : [ -79.12707899999999, 41.946106 ], "pop" : 3833, "state" : "PA" } +{ "_id" : "16346", "city" : "SENECA", "loc" : [ -79.67590199999999, 41.374436 ], "pop" : 3723, "state" : "PA" } +{ "_id" : "16347", "city" : "SHEFFIELD", "loc" : [ -79.034814, 41.70053 ], "pop" : 2382, "state" : "PA" } +{ "_id" : "16350", "city" : "SUGAR GROVE", "loc" : [ -79.318609, 41.947542 ], "pop" : 3592, "state" : "PA" } +{ "_id" : "16351", "city" : "TIDIOUTE", "loc" : [ -79.375224, 41.703008 ], "pop" : 2458, "state" : "PA" } +{ "_id" : "16353", "city" : "TIONESTA", "loc" : [ -79.366332, 41.511616 ], "pop" : 2293, "state" : "PA" } +{ "_id" : "16354", "city" : "TITUSVILLE", "loc" : [ -79.68549400000001, 41.638163 ], "pop" : 14509, "state" : "PA" } +{ "_id" : "16360", "city" : "TOWNVILLE", "loc" : [ -79.876679, 41.685581 ], "pop" : 1047, "state" : "PA" } +{ "_id" : "16362", "city" : "UTICA", "loc" : [ -79.940292, 41.479848 ], "pop" : 1863, "state" : "PA" } +{ "_id" : "16364", "city" : "VENUS", "loc" : [ -79.50476500000001, 41.376113 ], "pop" : 534, "state" : "PA" } +{ "_id" : "16365", "city" : "NORTH WARREN", "loc" : [ -79.14286, 41.845265 ], "pop" : 22507, "state" : "PA" } +{ "_id" : "16371", "city" : "YOUNGSVILLE", "loc" : [ -79.318708, 41.853654 ], "pop" : 1853, "state" : "PA" } +{ "_id" : "16372", "city" : "CLINTONVILLE", "loc" : [ -79.87338, 41.20022 ], "pop" : 525, "state" : "PA" } +{ "_id" : "16373", "city" : "EMLENTON", "loc" : [ -79.746996, 41.202769 ], "pop" : 3119, "state" : "PA" } +{ "_id" : "16374", "city" : "KENNERDELL", "loc" : [ -79.739313, 41.284762 ], "pop" : 1318, "state" : "PA" } +{ "_id" : "16401", "city" : "LUNDYS LANE", "loc" : [ -80.37527300000001, 41.885882 ], "pop" : 4286, "state" : "PA" } +{ "_id" : "16402", "city" : "BEAR LAKE", "loc" : [ -79.461365, 41.97006 ], "pop" : 1042, "state" : "PA" } +{ "_id" : "16403", "city" : "CAMBRIDGE SPRING", "loc" : [ -80.028003, 41.794611 ], "pop" : 5770, "state" : "PA" } +{ "_id" : "16404", "city" : "CENTERVILLE", "loc" : [ -79.79004, 41.724316 ], "pop" : 2119, "state" : "PA" } +{ "_id" : "16405", "city" : "COLUMBUS", "loc" : [ -79.57307299999999, 41.938152 ], "pop" : 1751, "state" : "PA" } +{ "_id" : "16406", "city" : "CONNEAUTVILLE", "loc" : [ -80.344516, 41.745455 ], "pop" : 2542, "state" : "PA" } +{ "_id" : "16407", "city" : "CORRY", "loc" : [ -79.65674199999999, 41.922593 ], "pop" : 10654, "state" : "PA" } +{ "_id" : "16410", "city" : "CRANESVILLE", "loc" : [ -80.308528, 41.916222 ], "pop" : 1783, "state" : "PA" } +{ "_id" : "16411", "city" : "EAST SPRINGFIELD", "loc" : [ -80.430336, 41.979363 ], "pop" : 1318, "state" : "PA" } +{ "_id" : "16412", "city" : "EDINBORO", "loc" : [ -80.135604, 41.875629 ], "pop" : 12914, "state" : "PA" } +{ "_id" : "16415", "city" : "FAIRVIEW", "loc" : [ -80.239508, 42.040741 ], "pop" : 7876, "state" : "PA" } +{ "_id" : "16417", "city" : "GIRARD", "loc" : [ -80.317756, 41.989573 ], "pop" : 8190, "state" : "PA" } +{ "_id" : "16420", "city" : "GRAND VALLEY", "loc" : [ -79.546944, 41.77315 ], "pop" : 59, "state" : "PA" } +{ "_id" : "16421", "city" : "HARBORCREEK", "loc" : [ -79.941648, 42.176719 ], "pop" : 3533, "state" : "PA" } +{ "_id" : "16423", "city" : "LAKE CITY", "loc" : [ -80.33883400000001, 42.020361 ], "pop" : 3674, "state" : "PA" } +{ "_id" : "16424", "city" : "ESPYVILLE", "loc" : [ -80.426911, 41.663535 ], "pop" : 5520, "state" : "PA" } +{ "_id" : "16426", "city" : "MC KEAN", "loc" : [ -80.147336, 41.999035 ], "pop" : 4099, "state" : "PA" } +{ "_id" : "16428", "city" : "NORTH EAST", "loc" : [ -79.833179, 42.200793 ], "pop" : 12531, "state" : "PA" } +{ "_id" : "16433", "city" : "SAEGERTOWN", "loc" : [ -80.147857, 41.726753 ], "pop" : 5094, "state" : "PA" } +{ "_id" : "16434", "city" : "SPARTANSBURG", "loc" : [ -79.684916, 41.793648 ], "pop" : 2785, "state" : "PA" } +{ "_id" : "16435", "city" : "SPRINGBORO", "loc" : [ -80.375276, 41.811348 ], "pop" : 2131, "state" : "PA" } +{ "_id" : "16436", "city" : "SPRING CREEK", "loc" : [ -79.56554, 41.846832 ], "pop" : 191, "state" : "PA" } +{ "_id" : "16438", "city" : "UNION CITY", "loc" : [ -79.84546400000001, 41.893851 ], "pop" : 8890, "state" : "PA" } +{ "_id" : "16440", "city" : "VENANGO", "loc" : [ -80.125353, 41.791968 ], "pop" : 918, "state" : "PA" } +{ "_id" : "16441", "city" : "WATERFORD", "loc" : [ -79.99963, 41.960266 ], "pop" : 9247, "state" : "PA" } +{ "_id" : "16442", "city" : "WATTSBURG", "loc" : [ -79.836282, 42.039114 ], "pop" : 2463, "state" : "PA" } +{ "_id" : "16443", "city" : "WEST SPRINGFIELD", "loc" : [ -80.46501000000001, 41.94646 ], "pop" : 1375, "state" : "PA" } +{ "_id" : "16501", "city" : "ERIE", "loc" : [ -80.08601, 42.125962 ], "pop" : 1956, "state" : "PA" } +{ "_id" : "16502", "city" : "ERIE", "loc" : [ -80.097607, 42.113332 ], "pop" : 18640, "state" : "PA" } +{ "_id" : "16503", "city" : "ERIE", "loc" : [ -80.063976, 42.126506 ], "pop" : 19019, "state" : "PA" } +{ "_id" : "16504", "city" : "ERIE", "loc" : [ -80.05208, 42.1108 ], "pop" : 17680, "state" : "PA" } +{ "_id" : "16505", "city" : "PRESQUE ISLE", "loc" : [ -80.161902, 42.097526 ], "pop" : 17753, "state" : "PA" } +{ "_id" : "16506", "city" : "ERIE", "loc" : [ -80.14843999999999, 42.073801 ], "pop" : 19269, "state" : "PA" } +{ "_id" : "16507", "city" : "ERIE", "loc" : [ -80.08642399999999, 42.131579 ], "pop" : 10936, "state" : "PA" } +{ "_id" : "16508", "city" : "ERIE", "loc" : [ -80.09354399999999, 42.097577 ], "pop" : 17645, "state" : "PA" } +{ "_id" : "16509", "city" : "ERIE", "loc" : [ -80.066827, 42.076326 ], "pop" : 24232, "state" : "PA" } +{ "_id" : "16510", "city" : "WESLEYVILLE", "loc" : [ -80.00375200000001, 42.123673 ], "pop" : 26455, "state" : "PA" } +{ "_id" : "16511", "city" : "ERIE", "loc" : [ -80.01766499999999, 42.15529 ], "pop" : 11355, "state" : "PA" } +{ "_id" : "16565", "city" : "ERIE", "loc" : [ -80.10011, 42.0687 ], "pop" : 97, "state" : "PA" } +{ "_id" : "16601", "city" : "ALTOONA", "loc" : [ -78.408901, 40.520945 ], "pop" : 31560, "state" : "PA" } +{ "_id" : "16602", "city" : "ALTOONA", "loc" : [ -78.390533, 40.50524 ], "pop" : 32649, "state" : "PA" } +{ "_id" : "16611", "city" : "BARREE", "loc" : [ -78.107066, 40.549901 ], "pop" : 2765, "state" : "PA" } +{ "_id" : "16613", "city" : "ASHVILLE", "loc" : [ -78.534639, 40.551266 ], "pop" : 1275, "state" : "PA" } +{ "_id" : "16616", "city" : "BECCARIA", "loc" : [ -78.508036, 40.757938 ], "pop" : 1571, "state" : "PA" } +{ "_id" : "16617", "city" : "BELLWOOD", "loc" : [ -78.337234, 40.60394 ], "pop" : 8152, "state" : "PA" } +{ "_id" : "16620", "city" : "BRISBIN", "loc" : [ -78.35263399999999, 40.838711 ], "pop" : 369, "state" : "PA" } +{ "_id" : "16621", "city" : "BROAD TOP", "loc" : [ -78.14060000000001, 40.201891 ], "pop" : 331, "state" : "PA" } +{ "_id" : "16622", "city" : "CALVIN", "loc" : [ -78.023697, 40.298667 ], "pop" : 1190, "state" : "PA" } +{ "_id" : "16623", "city" : "CASSVILLE", "loc" : [ -78.02717800000001, 40.293977 ], "pop" : 183, "state" : "PA" } +{ "_id" : "16625", "city" : "CLAYSBURG", "loc" : [ -78.479658, 40.329243 ], "pop" : 3890, "state" : "PA" } +{ "_id" : "16627", "city" : "COALPORT", "loc" : [ -78.53523800000001, 40.750323 ], "pop" : 940, "state" : "PA" } +{ "_id" : "16630", "city" : "CRESSON", "loc" : [ -78.586068, 40.460779 ], "pop" : 5829, "state" : "PA" } +{ "_id" : "16634", "city" : "DUDLEY", "loc" : [ -78.183823, 40.219453 ], "pop" : 616, "state" : "PA" } +{ "_id" : "16635", "city" : "DUNCANSVILLE", "loc" : [ -78.43832999999999, 40.426228 ], "pop" : 13889, "state" : "PA" } +{ "_id" : "16636", "city" : "DYSART", "loc" : [ -78.527072, 40.60885 ], "pop" : 769, "state" : "PA" } +{ "_id" : "16637", "city" : "EAST FREEDOM", "loc" : [ -78.447519, 40.328197 ], "pop" : 2871, "state" : "PA" } +{ "_id" : "16639", "city" : "FALLENTIMBER", "loc" : [ -78.465912, 40.671924 ], "pop" : 684, "state" : "PA" } +{ "_id" : "16640", "city" : "FLINTON", "loc" : [ -78.48148999999999, 40.701615 ], "pop" : 1589, "state" : "PA" } +{ "_id" : "16641", "city" : "GALLITZIN", "loc" : [ -78.555435, 40.48772 ], "pop" : 2852, "state" : "PA" } +{ "_id" : "16645", "city" : "GLEN HOPE", "loc" : [ -78.499869, 40.798405 ], "pop" : 187, "state" : "PA" } +{ "_id" : "16646", "city" : "HASTINGS", "loc" : [ -78.702924, 40.665874 ], "pop" : 2616, "state" : "PA" } +{ "_id" : "16647", "city" : "HESSTON", "loc" : [ -78.12810899999999, 40.412139 ], "pop" : 956, "state" : "PA" } +{ "_id" : "16648", "city" : "HOLLIDAYSBURG", "loc" : [ -78.368627, 40.438727 ], "pop" : 12867, "state" : "PA" } +{ "_id" : "16650", "city" : "HOPEWELL", "loc" : [ -78.31289700000001, 40.119225 ], "pop" : 2440, "state" : "PA" } +{ "_id" : "16651", "city" : "HOUTZDALE", "loc" : [ -78.3618, 40.830538 ], "pop" : 2825, "state" : "PA" } +{ "_id" : "16652", "city" : "HUNTINGDON", "loc" : [ -78.005028, 40.502274 ], "pop" : 16288, "state" : "PA" } +{ "_id" : "16655", "city" : "IMLER", "loc" : [ -78.51671899999999, 40.23186 ], "pop" : 3037, "state" : "PA" } +{ "_id" : "16656", "city" : "IRVONA", "loc" : [ -78.560243, 40.801744 ], "pop" : 1183, "state" : "PA" } +{ "_id" : "16657", "city" : "JAMES CREEK", "loc" : [ -78.188678, 40.356672 ], "pop" : 485, "state" : "PA" } +{ "_id" : "16659", "city" : "LOYSBURG", "loc" : [ -78.38643500000001, 40.174577 ], "pop" : 656, "state" : "PA" } +{ "_id" : "16661", "city" : "MADERA", "loc" : [ -78.427475, 40.827086 ], "pop" : 1389, "state" : "PA" } +{ "_id" : "16662", "city" : "MARTINSBURG", "loc" : [ -78.324367, 40.295082 ], "pop" : 5016, "state" : "PA" } +{ "_id" : "16664", "city" : "NEW ENTERPRISE", "loc" : [ -78.425916, 40.200013 ], "pop" : 1898, "state" : "PA" } +{ "_id" : "16666", "city" : "OSCEOLA MILLS", "loc" : [ -78.275705, 40.872208 ], "pop" : 4346, "state" : "PA" } +{ "_id" : "16667", "city" : "ST CLAIRSVILLE", "loc" : [ -78.509928, 40.158583 ], "pop" : 174, "state" : "PA" } +{ "_id" : "16668", "city" : "PATTON", "loc" : [ -78.63502800000001, 40.623045 ], "pop" : 4737, "state" : "PA" } +{ "_id" : "16669", "city" : "PETERSBURG", "loc" : [ -77.998402, 40.602968 ], "pop" : 2175, "state" : "PA" } +{ "_id" : "16671", "city" : "RAMEY", "loc" : [ -78.399821, 40.801511 ], "pop" : 538, "state" : "PA" } +{ "_id" : "16673", "city" : "ROARING SPRING", "loc" : [ -78.39284000000001, 40.327747 ], "pop" : 4942, "state" : "PA" } +{ "_id" : "16674", "city" : "ROBERTSDALE", "loc" : [ -78.11169599999999, 40.178674 ], "pop" : 727, "state" : "PA" } +{ "_id" : "16678", "city" : "SAXTON", "loc" : [ -78.247137, 40.223301 ], "pop" : 3031, "state" : "PA" } +{ "_id" : "16679", "city" : "SIX MILE RUN", "loc" : [ -78.210814, 40.157583 ], "pop" : 1670, "state" : "PA" } +{ "_id" : "16680", "city" : "SMITHMILL", "loc" : [ -78.39944199999999, 40.767808 ], "pop" : 1192, "state" : "PA" } +{ "_id" : "16683", "city" : "SPRUCE CREEK", "loc" : [ -78.136083, 40.621767 ], "pop" : 281, "state" : "PA" } +{ "_id" : "16685", "city" : "TODD", "loc" : [ -78.100354, 40.25775 ], "pop" : 889, "state" : "PA" } +{ "_id" : "16686", "city" : "TYRONE", "loc" : [ -78.241905, 40.661905 ], "pop" : 11290, "state" : "PA" } +{ "_id" : "16689", "city" : "WATERFALL", "loc" : [ -78.047708, 40.073871 ], "pop" : 1168, "state" : "PA" } +{ "_id" : "16691", "city" : "WELLS TANNERY", "loc" : [ -78.140269, 40.100996 ], "pop" : 563, "state" : "PA" } +{ "_id" : "16692", "city" : "WESTOVER", "loc" : [ -78.73548099999999, 40.76152 ], "pop" : 1550, "state" : "PA" } +{ "_id" : "16693", "city" : "GANISTER", "loc" : [ -78.22555, 40.437356 ], "pop" : 4799, "state" : "PA" } +{ "_id" : "16695", "city" : "WOODBURY", "loc" : [ -78.366573, 40.21847 ], "pop" : 741, "state" : "PA" } +{ "_id" : "16701", "city" : "BRADFORD", "loc" : [ -78.65396699999999, 41.954678 ], "pop" : 18738, "state" : "PA" } +{ "_id" : "16720", "city" : "AUSTIN", "loc" : [ -78.090812, 41.629649 ], "pop" : 1123, "state" : "PA" } +{ "_id" : "16724", "city" : "CROSBY", "loc" : [ -78.37463700000001, 41.713356 ], "pop" : 593, "state" : "PA" } +{ "_id" : "16726", "city" : "ORMSBY", "loc" : [ -78.566743, 41.826327 ], "pop" : 369, "state" : "PA" } +{ "_id" : "16727", "city" : "DERRICK CITY", "loc" : [ -78.56256399999999, 41.972577 ], "pop" : 623, "state" : "PA" } +{ "_id" : "16729", "city" : "DUKE CENTER", "loc" : [ -78.49226899999999, 41.954017 ], "pop" : 1122, "state" : "PA" } +{ "_id" : "16731", "city" : "ELDRED", "loc" : [ -78.38843900000001, 41.948925 ], "pop" : 2616, "state" : "PA" } +{ "_id" : "16732", "city" : "GIFFORD", "loc" : [ -78.584604, 41.860715 ], "pop" : 586, "state" : "PA" } +{ "_id" : "16734", "city" : "JAMES CITY", "loc" : [ -78.85052, 41.593116 ], "pop" : 551, "state" : "PA" } +{ "_id" : "16735", "city" : "KANE", "loc" : [ -78.79777799999999, 41.661861 ], "pop" : 6600, "state" : "PA" } +{ "_id" : "16738", "city" : "LEWIS RUN", "loc" : [ -78.680498, 41.821123 ], "pop" : 2617, "state" : "PA" } +{ "_id" : "16740", "city" : "MOUNT JEWETT", "loc" : [ -78.64461300000001, 41.724737 ], "pop" : 1039, "state" : "PA" } +{ "_id" : "16743", "city" : "PORT ALLEGANY", "loc" : [ -78.279909, 41.816919 ], "pop" : 4468, "state" : "PA" } +{ "_id" : "16744", "city" : "REW", "loc" : [ -78.53540599999999, 41.912222 ], "pop" : 614, "state" : "PA" } +{ "_id" : "16745", "city" : "RIXFORD", "loc" : [ -78.458647, 41.934606 ], "pop" : 514, "state" : "PA" } +{ "_id" : "16746", "city" : "ROULETTE", "loc" : [ -78.15384299999999, 41.773795 ], "pop" : 1354, "state" : "PA" } +{ "_id" : "16748", "city" : "SHINGLEHOUSE", "loc" : [ -78.19062, 41.957176 ], "pop" : 3390, "state" : "PA" } +{ "_id" : "16749", "city" : "SMETHPORT", "loc" : [ -78.470229, 41.802063 ], "pop" : 4375, "state" : "PA" } +{ "_id" : "16750", "city" : "TURTLEPOINT", "loc" : [ -78.330793, 41.884665 ], "pop" : 720, "state" : "PA" } +{ "_id" : "16801", "city" : "STATE COLLEGE", "loc" : [ -77.852279, 40.792522 ], "pop" : 42278, "state" : "PA" } +{ "_id" : "16803", "city" : "STATE COLLEGE", "loc" : [ -77.892578, 40.808162 ], "pop" : 20669, "state" : "PA" } +{ "_id" : "16820", "city" : "AARONSBURG", "loc" : [ -77.38797700000001, 40.876944 ], "pop" : 100, "state" : "PA" } +{ "_id" : "16821", "city" : "ALLPORT", "loc" : [ -78.21038, 40.975039 ], "pop" : 275, "state" : "PA" } +{ "_id" : "16822", "city" : "BEECH CREEK", "loc" : [ -77.58511799999999, 41.084507 ], "pop" : 1723, "state" : "PA" } +{ "_id" : "16823", "city" : "PLEASANT GAP", "loc" : [ -77.7642, 40.909377 ], "pop" : 23418, "state" : "PA" } +{ "_id" : "16827", "city" : "BOALSBURG", "loc" : [ -77.782236, 40.779344 ], "pop" : 3787, "state" : "PA" } +{ "_id" : "16828", "city" : "CENTRE HALL", "loc" : [ -77.67422500000001, 40.825429 ], "pop" : 4223, "state" : "PA" } +{ "_id" : "16829", "city" : "CLARENCE", "loc" : [ -77.931213, 41.058482 ], "pop" : 123, "state" : "PA" } +{ "_id" : "16830", "city" : "CLEARFIELD", "loc" : [ -78.443488, 41.02103 ], "pop" : 14648, "state" : "PA" } +{ "_id" : "16832", "city" : "COBURN", "loc" : [ -77.49217299999999, 40.867818 ], "pop" : 836, "state" : "PA" } +{ "_id" : "16833", "city" : "CURWENSVILLE", "loc" : [ -78.527247, 40.965972 ], "pop" : 4085, "state" : "PA" } +{ "_id" : "16836", "city" : "FRENCHVILLE", "loc" : [ -78.234465, 41.103794 ], "pop" : 1278, "state" : "PA" } +{ "_id" : "16837", "city" : "GLEN RICHEY", "loc" : [ -78.47521500000001, 40.938209 ], "pop" : 331, "state" : "PA" } +{ "_id" : "16838", "city" : "GRAMPIAN", "loc" : [ -78.59491300000001, 40.981768 ], "pop" : 3187, "state" : "PA" } +{ "_id" : "16839", "city" : "GRASSFLAT", "loc" : [ -78.128354, 40.995881 ], "pop" : 2208, "state" : "PA" } +{ "_id" : "16840", "city" : "HAWK RUN", "loc" : [ -78.213787, 40.941215 ], "pop" : 2224, "state" : "PA" } +{ "_id" : "16841", "city" : "HOWARD", "loc" : [ -77.67017800000001, 41.020315 ], "pop" : 3723, "state" : "PA" } +{ "_id" : "16844", "city" : "JULIAN", "loc" : [ -77.933243, 40.891709 ], "pop" : 2461, "state" : "PA" } +{ "_id" : "16845", "city" : "KARTHAUS", "loc" : [ -78.087509, 41.113635 ], "pop" : 932, "state" : "PA" } +{ "_id" : "16852", "city" : "MADISONBURG", "loc" : [ -77.49495899999999, 40.933407 ], "pop" : 678, "state" : "PA" } +{ "_id" : "16854", "city" : "MILLHEIM", "loc" : [ -77.450531, 40.896314 ], "pop" : 1978, "state" : "PA" } +{ "_id" : "16858", "city" : "MORRISDALE", "loc" : [ -78.23571699999999, 41.000128 ], "pop" : 1235, "state" : "PA" } +{ "_id" : "16859", "city" : "MOSHANNON", "loc" : [ -78.009469, 41.03419 ], "pop" : 516, "state" : "PA" } +{ "_id" : "16860", "city" : "MUNSON", "loc" : [ -78.18621, 40.966704 ], "pop" : 110, "state" : "PA" } +{ "_id" : "16861", "city" : "NEW MILLPORT", "loc" : [ -78.49454299999999, 40.885302 ], "pop" : 657, "state" : "PA" } +{ "_id" : "16863", "city" : "OLANTA", "loc" : [ -78.500079, 40.905621 ], "pop" : 47, "state" : "PA" } +{ "_id" : "16864", "city" : "ORVISTON", "loc" : [ -77.620306, 41.075386 ], "pop" : 1023, "state" : "PA" } +{ "_id" : "16865", "city" : "PENNSYLVANIA FUR", "loc" : [ -77.95406800000001, 40.728194 ], "pop" : 2558, "state" : "PA" } +{ "_id" : "16866", "city" : "PHILIPSBURG", "loc" : [ -78.219008, 40.886252 ], "pop" : 7810, "state" : "PA" } +{ "_id" : "16870", "city" : "PORT MATILDA", "loc" : [ -78.078795, 40.801819 ], "pop" : 1890, "state" : "PA" } +{ "_id" : "16871", "city" : "POTTERSDALE", "loc" : [ -78.03405600000001, 41.186798 ], "pop" : 34, "state" : "PA" } +{ "_id" : "16872", "city" : "REBERSBURG", "loc" : [ -77.405322, 40.954906 ], "pop" : 816, "state" : "PA" } +{ "_id" : "16874", "city" : "SNOW SHOE", "loc" : [ -77.95228, 41.037581 ], "pop" : 1917, "state" : "PA" } +{ "_id" : "16875", "city" : "SPRING MILLS", "loc" : [ -77.57403100000001, 40.857753 ], "pop" : 1805, "state" : "PA" } +{ "_id" : "16877", "city" : "WARRIORS MARK", "loc" : [ -78.077478, 40.741414 ], "pop" : 2760, "state" : "PA" } +{ "_id" : "16878", "city" : "WEST DECATUR", "loc" : [ -78.31293599999999, 40.949305 ], "pop" : 2226, "state" : "PA" } +{ "_id" : "16879", "city" : "WINBURNE", "loc" : [ -78.156235, 40.967779 ], "pop" : 387, "state" : "PA" } +{ "_id" : "16881", "city" : "WOODLAND", "loc" : [ -78.321445, 41.009833 ], "pop" : 2571, "state" : "PA" } +{ "_id" : "16882", "city" : "WOODWARD", "loc" : [ -77.348269, 40.911574 ], "pop" : 183, "state" : "PA" } +{ "_id" : "16901", "city" : "WELLSBORO", "loc" : [ -77.30802, 41.737343 ], "pop" : 9906, "state" : "PA" } +{ "_id" : "16912", "city" : "BLOSSBURG", "loc" : [ -77.079711, 41.669771 ], "pop" : 2123, "state" : "PA" } +{ "_id" : "16914", "city" : "COLUMBIA CROSS R", "loc" : [ -76.79324200000001, 41.846282 ], "pop" : 2398, "state" : "PA" } +{ "_id" : "16915", "city" : "OSWAYO", "loc" : [ -78.003861, 41.781529 ], "pop" : 5171, "state" : "PA" } +{ "_id" : "16917", "city" : "COVINGTON", "loc" : [ -77.108795, 41.739297 ], "pop" : 1417, "state" : "PA" } +{ "_id" : "16920", "city" : "ELKLAND", "loc" : [ -77.31339199999999, 41.988165 ], "pop" : 1910, "state" : "PA" } +{ "_id" : "16921", "city" : "GAINES", "loc" : [ -77.568001, 41.747134 ], "pop" : 544, "state" : "PA" } +{ "_id" : "16922", "city" : "GALETON", "loc" : [ -77.65475600000001, 41.723006 ], "pop" : 2050, "state" : "PA" } +{ "_id" : "16923", "city" : "NORTH BINGHAM", "loc" : [ -77.87358500000001, 41.935312 ], "pop" : 1585, "state" : "PA" } +{ "_id" : "16925", "city" : "GILLETT", "loc" : [ -76.77132899999999, 41.956826 ], "pop" : 4273, "state" : "PA" } +{ "_id" : "16926", "city" : "GRANVILLE SUMMIT", "loc" : [ -76.721829, 41.697299 ], "pop" : 1447, "state" : "PA" } +{ "_id" : "16927", "city" : "HARRISON VALLEY", "loc" : [ -77.687665, 41.949824 ], "pop" : 1476, "state" : "PA" } +{ "_id" : "16928", "city" : "KNOXVILLE", "loc" : [ -77.435678, 41.959557 ], "pop" : 893, "state" : "PA" } +{ "_id" : "16929", "city" : "LAWRENCEVILLE", "loc" : [ -77.11355, 41.978266 ], "pop" : 1915, "state" : "PA" } +{ "_id" : "16930", "city" : "LIBERTY", "loc" : [ -77.119505, 41.565571 ], "pop" : 893, "state" : "PA" } +{ "_id" : "16932", "city" : "MAINESBURG", "loc" : [ -76.96815599999999, 41.790029 ], "pop" : 1140, "state" : "PA" } +{ "_id" : "16933", "city" : "MANSFIELD", "loc" : [ -77.07163, 41.812288 ], "pop" : 7111, "state" : "PA" } +{ "_id" : "16935", "city" : "MIDDLEBURY CENTE", "loc" : [ -77.314764, 41.891706 ], "pop" : 2549, "state" : "PA" } +{ "_id" : "16936", "city" : "MILLERTON", "loc" : [ -76.974766, 41.962467 ], "pop" : 2072, "state" : "PA" } +{ "_id" : "16937", "city" : "MILLS", "loc" : [ -77.762051, 41.902482 ], "pop" : 653, "state" : "PA" } +{ "_id" : "16938", "city" : "MORRIS", "loc" : [ -77.29197499999999, 41.54752 ], "pop" : 959, "state" : "PA" } +{ "_id" : "16939", "city" : "MORRIS RUN", "loc" : [ -77.02776900000001, 41.672943 ], "pop" : 496, "state" : "PA" } +{ "_id" : "16940", "city" : "NELSON", "loc" : [ -77.24190900000001, 41.978719 ], "pop" : 599, "state" : "PA" } +{ "_id" : "16941", "city" : "GENESEE", "loc" : [ -77.773995, 41.981963 ], "pop" : 47, "state" : "PA" } +{ "_id" : "16942", "city" : "OSCEOLA", "loc" : [ -77.353983, 41.984765 ], "pop" : 609, "state" : "PA" } +{ "_id" : "16943", "city" : "SABINSVILLE", "loc" : [ -77.537825, 41.856414 ], "pop" : 576, "state" : "PA" } +{ "_id" : "16946", "city" : "TIOGA", "loc" : [ -77.13929400000001, 41.912454 ], "pop" : 1796, "state" : "PA" } +{ "_id" : "16947", "city" : "TROY", "loc" : [ -76.771143, 41.77815 ], "pop" : 3476, "state" : "PA" } +{ "_id" : "16948", "city" : "ULYSSES", "loc" : [ -77.712557, 41.845903 ], "pop" : 727, "state" : "PA" } +{ "_id" : "16950", "city" : "LITTLE MARSH", "loc" : [ -77.530975, 41.919063 ], "pop" : 2844, "state" : "PA" } +{ "_id" : "17002", "city" : "ALLENSVILLE", "loc" : [ -77.829396, 40.524921 ], "pop" : 1135, "state" : "PA" } +{ "_id" : "17003", "city" : "ANNVILLE", "loc" : [ -76.544676, 40.345608 ], "pop" : 12173, "state" : "PA" } +{ "_id" : "17004", "city" : "BELLEVILLE", "loc" : [ -77.735823, 40.601571 ], "pop" : 4203, "state" : "PA" } +{ "_id" : "17005", "city" : "BERRYSBURG", "loc" : [ -76.811207, 40.60199 ], "pop" : 376, "state" : "PA" } +{ "_id" : "17006", "city" : "BLAIN", "loc" : [ -77.511736, 40.329314 ], "pop" : 755, "state" : "PA" } +{ "_id" : "17007", "city" : "BOILING SPRINGS", "loc" : [ -77.119489, 40.144873 ], "pop" : 4331, "state" : "PA" } +{ "_id" : "17009", "city" : "BURNHAM", "loc" : [ -77.562459, 40.636119 ], "pop" : 2005, "state" : "PA" } +{ "_id" : "17011", "city" : "SHIREMANSTOWN", "loc" : [ -76.92911100000001, 40.238071 ], "pop" : 33023, "state" : "PA" } +{ "_id" : "17013", "city" : "CARLISLE BARRACK", "loc" : [ -77.19952600000001, 40.203877 ], "pop" : 50939, "state" : "PA" } +{ "_id" : "17014", "city" : "COCOLAMUS", "loc" : [ -77.10674899999999, 40.656706 ], "pop" : 887, "state" : "PA" } +{ "_id" : "17017", "city" : "DALMATIA", "loc" : [ -76.879713, 40.648315 ], "pop" : 1694, "state" : "PA" } +{ "_id" : "17018", "city" : "DAUPHIN", "loc" : [ -76.928304, 40.384581 ], "pop" : 4523, "state" : "PA" } +{ "_id" : "17019", "city" : "DILLSBURG", "loc" : [ -77.03386999999999, 40.096373 ], "pop" : 11814, "state" : "PA" } +{ "_id" : "17020", "city" : "DUNCANNON", "loc" : [ -77.047254, 40.408678 ], "pop" : 10021, "state" : "PA" } +{ "_id" : "17021", "city" : "EAST WATERFORD", "loc" : [ -77.652789, 40.354191 ], "pop" : 929, "state" : "PA" } +{ "_id" : "17022", "city" : "ELIZABETHTOWN", "loc" : [ -76.60254500000001, 40.155331 ], "pop" : 21808, "state" : "PA" } +{ "_id" : "17023", "city" : "ELIZABETHVILLE", "loc" : [ -76.83548399999999, 40.55497 ], "pop" : 4564, "state" : "PA" } +{ "_id" : "17024", "city" : "ELLIOTTSBURG", "loc" : [ -77.270348, 40.362428 ], "pop" : 1125, "state" : "PA" } +{ "_id" : "17025", "city" : "ENOLA", "loc" : [ -76.943208, 40.292178 ], "pop" : 13103, "state" : "PA" } +{ "_id" : "17026", "city" : "FREDERICKSBURG", "loc" : [ -76.42674, 40.452392 ], "pop" : 2382, "state" : "PA" } +{ "_id" : "17028", "city" : "GRANTVILLE", "loc" : [ -76.671331, 40.360629 ], "pop" : 4569, "state" : "PA" } +{ "_id" : "17029", "city" : "GRANVILLE", "loc" : [ -77.61335800000001, 40.547868 ], "pop" : 1293, "state" : "PA" } +{ "_id" : "17030", "city" : "GRATZ", "loc" : [ -76.718851, 40.610424 ], "pop" : 696, "state" : "PA" } +{ "_id" : "17031", "city" : "GREEN PARK", "loc" : [ -77.32009600000001, 40.375143 ], "pop" : 347, "state" : "PA" } +{ "_id" : "17032", "city" : "HALIFAX", "loc" : [ -76.89404, 40.47603 ], "pop" : 7648, "state" : "PA" } +{ "_id" : "17033", "city" : "HERSHEY", "loc" : [ -76.654518, 40.263767 ], "pop" : 20514, "state" : "PA" } +{ "_id" : "17034", "city" : "HIGHSPIRE", "loc" : [ -76.785303, 40.208348 ], "pop" : 2670, "state" : "PA" } +{ "_id" : "17035", "city" : "HONEY GROVE", "loc" : [ -77.57607, 40.430903 ], "pop" : 884, "state" : "PA" } +{ "_id" : "17036", "city" : "HUMMELSTOWN", "loc" : [ -76.70937499999999, 40.278199 ], "pop" : 8178, "state" : "PA" } +{ "_id" : "17037", "city" : "ICKESBURG", "loc" : [ -77.34291, 40.434154 ], "pop" : 1828, "state" : "PA" } +{ "_id" : "17038", "city" : "JONESTOWN", "loc" : [ -76.50384200000001, 40.43607 ], "pop" : 5098, "state" : "PA" } +{ "_id" : "17040", "city" : "LANDISBURG", "loc" : [ -77.319146, 40.332644 ], "pop" : 1140, "state" : "PA" } +{ "_id" : "17042", "city" : "CLEONA", "loc" : [ -76.425895, 40.335912 ], "pop" : 61993, "state" : "PA" } +{ "_id" : "17043", "city" : "WORMLEYSBURG", "loc" : [ -76.89757, 40.247158 ], "pop" : 5340, "state" : "PA" } +{ "_id" : "17044", "city" : "LEWISTOWN", "loc" : [ -77.57558, 40.599439 ], "pop" : 19311, "state" : "PA" } +{ "_id" : "17045", "city" : "LIVERPOOL", "loc" : [ -77.00832699999999, 40.575272 ], "pop" : 3951, "state" : "PA" } +{ "_id" : "17047", "city" : "LOYSVILLE", "loc" : [ -77.41382299999999, 40.36576 ], "pop" : 1850, "state" : "PA" } +{ "_id" : "17048", "city" : "LYKENS", "loc" : [ -76.70735999999999, 40.590919 ], "pop" : 2904, "state" : "PA" } +{ "_id" : "17049", "city" : "MC ALISTERVILLE", "loc" : [ -77.2602, 40.646916 ], "pop" : 3073, "state" : "PA" } +{ "_id" : "17051", "city" : "MC VEYTOWN", "loc" : [ -77.718625, 40.504593 ], "pop" : 3685, "state" : "PA" } +{ "_id" : "17052", "city" : "MAPLETON DEPOT", "loc" : [ -77.960444, 40.386414 ], "pop" : 1329, "state" : "PA" } +{ "_id" : "17053", "city" : "MARYSVILLE", "loc" : [ -76.972204, 40.335062 ], "pop" : 4561, "state" : "PA" } +{ "_id" : "17055", "city" : "HAMPDEN", "loc" : [ -76.99493, 40.212669 ], "pop" : 51902, "state" : "PA" } +{ "_id" : "17057", "city" : "MIDDLETOWN", "loc" : [ -76.733127, 40.204086 ], "pop" : 21545, "state" : "PA" } +{ "_id" : "17058", "city" : "MIFFLIN", "loc" : [ -77.41314, 40.570842 ], "pop" : 1189, "state" : "PA" } +{ "_id" : "17059", "city" : "MIFFLINTOWN", "loc" : [ -77.376119, 40.572666 ], "pop" : 5646, "state" : "PA" } +{ "_id" : "17060", "city" : "MILL CREEK", "loc" : [ -77.917689, 40.447102 ], "pop" : 1002, "state" : "PA" } +{ "_id" : "17061", "city" : "MILLERSBURG", "loc" : [ -76.930483, 40.558743 ], "pop" : 6135, "state" : "PA" } +{ "_id" : "17062", "city" : "MILLERSTOWN", "loc" : [ -77.12977600000001, 40.550548 ], "pop" : 1589, "state" : "PA" } +{ "_id" : "17063", "city" : "MILROY", "loc" : [ -77.55673899999999, 40.72033 ], "pop" : 3627, "state" : "PA" } +{ "_id" : "17065", "city" : "MOUNT HOLLY SPRI", "loc" : [ -77.19080700000001, 40.118356 ], "pop" : 2857, "state" : "PA" } +{ "_id" : "17066", "city" : "MOUNT UNION", "loc" : [ -77.863704, 40.390106 ], "pop" : 7218, "state" : "PA" } +{ "_id" : "17067", "city" : "MYERSTOWN", "loc" : [ -76.314328, 40.378949 ], "pop" : 12843, "state" : "PA" } +{ "_id" : "17068", "city" : "NEW BLOOMFIELD", "loc" : [ -77.193836, 40.419325 ], "pop" : 3066, "state" : "PA" } +{ "_id" : "17070", "city" : "NEW CUMBERLAND", "loc" : [ -76.868909, 40.215105 ], "pop" : 15037, "state" : "PA" } +{ "_id" : "17071", "city" : "NEW GERMANTOWN", "loc" : [ -77.579701, 40.305749 ], "pop" : 455, "state" : "PA" } +{ "_id" : "17073", "city" : "NEWMANSTOWN", "loc" : [ -76.2426, 40.317938 ], "pop" : 3560, "state" : "PA" } +{ "_id" : "17074", "city" : "NEWPORT", "loc" : [ -77.16586599999999, 40.482662 ], "pop" : 6378, "state" : "PA" } +{ "_id" : "17076", "city" : "OAKLAND MILLS", "loc" : [ -77.319244, 40.614748 ], "pop" : 457, "state" : "PA" } +{ "_id" : "17078", "city" : "PALMYRA", "loc" : [ -76.58861, 40.301055 ], "pop" : 14239, "state" : "PA" } +{ "_id" : "17082", "city" : "PORT ROYAL", "loc" : [ -77.430958, 40.51068 ], "pop" : 3319, "state" : "PA" } +{ "_id" : "17084", "city" : "REEDSVILLE", "loc" : [ -77.611589, 40.672189 ], "pop" : 3320, "state" : "PA" } +{ "_id" : "17086", "city" : "RICHFIELD", "loc" : [ -77.12229600000001, 40.688424 ], "pop" : 1673, "state" : "PA" } +{ "_id" : "17087", "city" : "RICHLAND", "loc" : [ -76.26544699999999, 40.380595 ], "pop" : 3367, "state" : "PA" } +{ "_id" : "17090", "city" : "SHERMANS DALE", "loc" : [ -77.18085600000001, 40.329898 ], "pop" : 5128, "state" : "PA" } +{ "_id" : "17094", "city" : "THOMPSONTOWN", "loc" : [ -77.207551, 40.590782 ], "pop" : 2515, "state" : "PA" } +{ "_id" : "17097", "city" : "WICONISCO", "loc" : [ -76.709084, 40.567511 ], "pop" : 1702, "state" : "PA" } +{ "_id" : "17098", "city" : "WILLIAMSTOWN", "loc" : [ -76.622259, 40.580761 ], "pop" : 2655, "state" : "PA" } +{ "_id" : "17099", "city" : "YEAGERTOWN", "loc" : [ -77.56882299999999, 40.643558 ], "pop" : 2197, "state" : "PA" } +{ "_id" : "17101", "city" : "HARRISBURG", "loc" : [ -76.883079, 40.261767 ], "pop" : 2151, "state" : "PA" } +{ "_id" : "17102", "city" : "HARRISBURG", "loc" : [ -76.89104399999999, 40.27278 ], "pop" : 8862, "state" : "PA" } +{ "_id" : "17103", "city" : "PENBROOK", "loc" : [ -76.863812, 40.273852 ], "pop" : 12335, "state" : "PA" } +{ "_id" : "17104", "city" : "HARRISBURG", "loc" : [ -76.859397, 40.259683 ], "pop" : 21882, "state" : "PA" } +{ "_id" : "17109", "city" : "COLONIAL PARK", "loc" : [ -76.82261200000001, 40.29122 ], "pop" : 22952, "state" : "PA" } +{ "_id" : "17110", "city" : "HARRISBURG", "loc" : [ -76.886246, 40.302957 ], "pop" : 19314, "state" : "PA" } +{ "_id" : "17111", "city" : "SWATARA", "loc" : [ -76.79391800000001, 40.266058 ], "pop" : 22558, "state" : "PA" } +{ "_id" : "17112", "city" : "HARRISBURG", "loc" : [ -76.791438, 40.335208 ], "pop" : 27559, "state" : "PA" } +{ "_id" : "17113", "city" : "STEELTON", "loc" : [ -76.827568, 40.234007 ], "pop" : 9841, "state" : "PA" } +{ "_id" : "17201", "city" : "CHAMBERSBURG", "loc" : [ -77.657928, 39.931318 ], "pop" : 41893, "state" : "PA" } +{ "_id" : "17211", "city" : "ARTEMAS", "loc" : [ -78.40313999999999, 39.757465 ], "pop" : 481, "state" : "PA" } +{ "_id" : "17212", "city" : "BIG COVE TANNERY", "loc" : [ -78.012366, 39.889704 ], "pop" : 2178, "state" : "PA" } +{ "_id" : "17213", "city" : "BLAIRS MILLS", "loc" : [ -77.769473, 40.254804 ], "pop" : 551, "state" : "PA" } +{ "_id" : "17214", "city" : "BLUE RIDGE SUMMI", "loc" : [ -77.469836, 39.726951 ], "pop" : 1090, "state" : "PA" } +{ "_id" : "17215", "city" : "BURNT CABINS", "loc" : [ -77.901718, 40.075278 ], "pop" : 155, "state" : "PA" } +{ "_id" : "17217", "city" : "CONCORD", "loc" : [ -77.70313299999999, 40.245842 ], "pop" : 109, "state" : "PA" } +{ "_id" : "17219", "city" : "DOYLESBURG", "loc" : [ -77.68620300000001, 40.217195 ], "pop" : 905, "state" : "PA" } +{ "_id" : "17220", "city" : "DRY RUN", "loc" : [ -77.76457000000001, 40.174744 ], "pop" : 499, "state" : "PA" } +{ "_id" : "17221", "city" : "FANNETTSBURG", "loc" : [ -77.82101, 40.071692 ], "pop" : 628, "state" : "PA" } +{ "_id" : "17222", "city" : "FAYETTEVILLE", "loc" : [ -77.53095999999999, 39.906543 ], "pop" : 9459, "state" : "PA" } +{ "_id" : "17223", "city" : "FORT LITTLETON", "loc" : [ -77.975678, 40.054372 ], "pop" : 750, "state" : "PA" } +{ "_id" : "17224", "city" : "FORT LOUDON", "loc" : [ -77.898365, 39.954692 ], "pop" : 1412, "state" : "PA" } +{ "_id" : "17225", "city" : "GREENCASTLE", "loc" : [ -77.746956, 39.781827 ], "pop" : 14553, "state" : "PA" } +{ "_id" : "17228", "city" : "HARRISONVILLE", "loc" : [ -78.08407699999999, 39.976137 ], "pop" : 1410, "state" : "PA" } +{ "_id" : "17229", "city" : "HUSTONTOWN", "loc" : [ -78.01483500000001, 40.044111 ], "pop" : 245, "state" : "PA" } +{ "_id" : "17232", "city" : "LURGAN", "loc" : [ -77.635063, 40.127422 ], "pop" : 845, "state" : "PA" } +{ "_id" : "17233", "city" : "MC CONNELLSBURG", "loc" : [ -77.990117, 39.944251 ], "pop" : 2529, "state" : "PA" } +{ "_id" : "17236", "city" : "MERCERSBURG", "loc" : [ -77.907259, 39.819519 ], "pop" : 7735, "state" : "PA" } +{ "_id" : "17237", "city" : "MONT ALTO", "loc" : [ -77.553676, 39.841689 ], "pop" : 1601, "state" : "PA" } +{ "_id" : "17238", "city" : "NEEDMORE", "loc" : [ -78.143935, 39.871279 ], "pop" : 1208, "state" : "PA" } +{ "_id" : "17239", "city" : "NEELYTON", "loc" : [ -77.85801499999999, 40.137051 ], "pop" : 816, "state" : "PA" } +{ "_id" : "17240", "city" : "NEWBURG", "loc" : [ -77.56691499999999, 40.13333 ], "pop" : 2350, "state" : "PA" } +{ "_id" : "17241", "city" : "NEWVILLE", "loc" : [ -77.411401, 40.185468 ], "pop" : 9740, "state" : "PA" } +{ "_id" : "17243", "city" : "ORBISONIA", "loc" : [ -77.906924, 40.238872 ], "pop" : 2368, "state" : "PA" } +{ "_id" : "17244", "city" : "ORRSTOWN", "loc" : [ -77.639762, 40.07305 ], "pop" : 2281, "state" : "PA" } +{ "_id" : "17246", "city" : "PLEASANT HALL", "loc" : [ -77.703148, 40.04135 ], "pop" : 366, "state" : "PA" } +{ "_id" : "17252", "city" : "SAINT THOMAS", "loc" : [ -77.7908, 39.924052 ], "pop" : 4109, "state" : "PA" } +{ "_id" : "17255", "city" : "SHADE GAP", "loc" : [ -77.868045, 40.172976 ], "pop" : 416, "state" : "PA" } +{ "_id" : "17257", "city" : "SHIPPENSBURG", "loc" : [ -77.51947699999999, 40.051359 ], "pop" : 19302, "state" : "PA" } +{ "_id" : "17260", "city" : "SHIRLEYSBURG", "loc" : [ -77.870062, 40.316768 ], "pop" : 1416, "state" : "PA" } +{ "_id" : "17262", "city" : "SPRING RUN", "loc" : [ -77.74052500000001, 40.14663 ], "pop" : 796, "state" : "PA" } +{ "_id" : "17264", "city" : "THREE SPRINGS", "loc" : [ -77.99412, 40.183437 ], "pop" : 2197, "state" : "PA" } +{ "_id" : "17265", "city" : "UPPERSTRASBURG", "loc" : [ -77.736791, 40.05799 ], "pop" : 499, "state" : "PA" } +{ "_id" : "17266", "city" : "WALNUT BOTTOM", "loc" : [ -77.408984, 40.086042 ], "pop" : 1157, "state" : "PA" } +{ "_id" : "17267", "city" : "WARFORDSBURG", "loc" : [ -78.198627, 39.769765 ], "pop" : 2988, "state" : "PA" } +{ "_id" : "17268", "city" : "WAYNESBORO", "loc" : [ -77.567363, 39.763504 ], "pop" : 25878, "state" : "PA" } +{ "_id" : "17271", "city" : "WILLOW HILL", "loc" : [ -77.796947, 40.113694 ], "pop" : 409, "state" : "PA" } +{ "_id" : "17301", "city" : "ABBOTTSTOWN", "loc" : [ -76.993077, 39.888099 ], "pop" : 1777, "state" : "PA" } +{ "_id" : "17302", "city" : "AIRVILLE", "loc" : [ -76.401179, 39.821012 ], "pop" : 1685, "state" : "PA" } +{ "_id" : "17304", "city" : "ASPERS", "loc" : [ -77.228657, 39.976533 ], "pop" : 2894, "state" : "PA" } +{ "_id" : "17307", "city" : "BIGLERVILLE", "loc" : [ -77.288549, 39.928119 ], "pop" : 5280, "state" : "PA" } +{ "_id" : "17309", "city" : "BROGUE", "loc" : [ -76.488236, 39.883044 ], "pop" : 5123, "state" : "PA" } +{ "_id" : "17313", "city" : "YOE", "loc" : [ -76.644794, 39.900127 ], "pop" : 8691, "state" : "PA" } +{ "_id" : "17314", "city" : "DELTA", "loc" : [ -76.34410099999999, 39.751754 ], "pop" : 4910, "state" : "PA" } +{ "_id" : "17315", "city" : "DOVER", "loc" : [ -76.855485, 40.006158 ], "pop" : 20094, "state" : "PA" } +{ "_id" : "17316", "city" : "EAST BERLIN", "loc" : [ -77.00725199999999, 39.964546 ], "pop" : 5538, "state" : "PA" } +{ "_id" : "17319", "city" : "ETTERS", "loc" : [ -76.801861, 40.154506 ], "pop" : 6135, "state" : "PA" } +{ "_id" : "17320", "city" : "GREENSTONE", "loc" : [ -77.376824, 39.762694 ], "pop" : 4709, "state" : "PA" } +{ "_id" : "17321", "city" : "FAWN GROVE", "loc" : [ -76.43923700000001, 39.751024 ], "pop" : 1938, "state" : "PA" } +{ "_id" : "17322", "city" : "FELTON", "loc" : [ -76.593721, 39.836006 ], "pop" : 3128, "state" : "PA" } +{ "_id" : "17324", "city" : "GARDNERS", "loc" : [ -77.187725, 40.042759 ], "pop" : 4246, "state" : "PA" } +{ "_id" : "17325", "city" : "GETTYSBURG", "loc" : [ -77.222313, 39.832044 ], "pop" : 23574, "state" : "PA" } +{ "_id" : "17327", "city" : "GLEN ROCK", "loc" : [ -76.747713, 39.781326 ], "pop" : 7217, "state" : "PA" } +{ "_id" : "17329", "city" : "BRODBECKS", "loc" : [ -76.86204600000001, 39.759907 ], "pop" : 2230, "state" : "PA" } +{ "_id" : "17331", "city" : "HANOVER", "loc" : [ -76.981196, 39.794286 ], "pop" : 37367, "state" : "PA" } +{ "_id" : "17339", "city" : "LEWISBERRY", "loc" : [ -76.87000399999999, 40.146295 ], "pop" : 5338, "state" : "PA" } +{ "_id" : "17340", "city" : "LITTLESTOWN", "loc" : [ -77.100326, 39.749549 ], "pop" : 7758, "state" : "PA" } +{ "_id" : "17344", "city" : "MC SHERRYSTOWN", "loc" : [ -77.01496, 39.804832 ], "pop" : 3838, "state" : "PA" } +{ "_id" : "17345", "city" : "MANCHESTER", "loc" : [ -76.733245, 40.069461 ], "pop" : 8095, "state" : "PA" } +{ "_id" : "17347", "city" : "MOUNT WOLF", "loc" : [ -76.69657599999999, 40.071126 ], "pop" : 3083, "state" : "PA" } +{ "_id" : "17349", "city" : "NEW FREEDOM", "loc" : [ -76.68406400000001, 39.742266 ], "pop" : 6346, "state" : "PA" } +{ "_id" : "17350", "city" : "NEW OXFORD", "loc" : [ -77.06433, 39.877459 ], "pop" : 9674, "state" : "PA" } +{ "_id" : "17352", "city" : "NEW PARK", "loc" : [ -76.504167, 39.760027 ], "pop" : 1190, "state" : "PA" } +{ "_id" : "17353", "city" : "ORRTANNA", "loc" : [ -77.38059199999999, 39.881032 ], "pop" : 2066, "state" : "PA" } +{ "_id" : "17356", "city" : "RED LION", "loc" : [ -76.608075, 39.902572 ], "pop" : 12737, "state" : "PA" } +{ "_id" : "17360", "city" : "SEVEN VALLEYS", "loc" : [ -76.738336, 39.855613 ], "pop" : 5219, "state" : "PA" } +{ "_id" : "17361", "city" : "SHREWSBURY", "loc" : [ -76.67482699999999, 39.760133 ], "pop" : 3749, "state" : "PA" } +{ "_id" : "17362", "city" : "SPRING GROVE", "loc" : [ -76.87735600000001, 39.857208 ], "pop" : 13901, "state" : "PA" } +{ "_id" : "17363", "city" : "STEWARTSTOWN", "loc" : [ -76.597037, 39.771962 ], "pop" : 5865, "state" : "PA" } +{ "_id" : "17364", "city" : "THOMASVILLE", "loc" : [ -76.882159, 39.934619 ], "pop" : 3435, "state" : "PA" } +{ "_id" : "17365", "city" : "WELLSVILLE", "loc" : [ -76.944315, 40.055721 ], "pop" : 2456, "state" : "PA" } +{ "_id" : "17366", "city" : "WINDSOR", "loc" : [ -76.55912600000001, 39.923271 ], "pop" : 5489, "state" : "PA" } +{ "_id" : "17368", "city" : "WRIGHTSVILLE", "loc" : [ -76.526971, 39.996559 ], "pop" : 7677, "state" : "PA" } +{ "_id" : "17370", "city" : "YORK HAVEN", "loc" : [ -76.773725, 40.122154 ], "pop" : 4948, "state" : "PA" } +{ "_id" : "17372", "city" : "YORK SPRINGS", "loc" : [ -77.10613600000001, 40.00839 ], "pop" : 3042, "state" : "PA" } +{ "_id" : "17401", "city" : "YORK", "loc" : [ -76.726887, 39.963539 ], "pop" : 2439, "state" : "PA" } +{ "_id" : "17402", "city" : "EAST YORK", "loc" : [ -76.674578, 39.971508 ], "pop" : 35648, "state" : "PA" } +{ "_id" : "17403", "city" : "YORK", "loc" : [ -76.712998, 39.94943 ], "pop" : 40210, "state" : "PA" } +{ "_id" : "17404", "city" : "WEST YORK", "loc" : [ -76.768987, 39.961988 ], "pop" : 49524, "state" : "PA" } +{ "_id" : "17406", "city" : "HELLAM", "loc" : [ -76.592646, 39.998249 ], "pop" : 6095, "state" : "PA" } +{ "_id" : "17407", "city" : "JACOBUS", "loc" : [ -76.714634, 39.880203 ], "pop" : 1872, "state" : "PA" } +{ "_id" : "17501", "city" : "AKRON", "loc" : [ -76.20529500000001, 40.157086 ], "pop" : 4286, "state" : "PA" } +{ "_id" : "17502", "city" : "BAINBRIDGE", "loc" : [ -76.672589, 40.1086 ], "pop" : 2688, "state" : "PA" } +{ "_id" : "17505", "city" : "BIRD IN HAND", "loc" : [ -76.183036, 40.056109 ], "pop" : 862, "state" : "PA" } +{ "_id" : "17509", "city" : "NINEPOINTS", "loc" : [ -76.025983, 39.935632 ], "pop" : 4517, "state" : "PA" } +{ "_id" : "17512", "city" : "COLUMBIA", "loc" : [ -76.48622, 40.039079 ], "pop" : 17454, "state" : "PA" } +{ "_id" : "17516", "city" : "CONESTOGA", "loc" : [ -76.35747499999999, 39.940303 ], "pop" : 4493, "state" : "PA" } +{ "_id" : "17517", "city" : "DENVER", "loc" : [ -76.11568800000001, 40.229671 ], "pop" : 10737, "state" : "PA" } +{ "_id" : "17518", "city" : "DRUMORE", "loc" : [ -76.245684, 39.838399 ], "pop" : 1191, "state" : "PA" } +{ "_id" : "17519", "city" : "EAST EARL", "loc" : [ -76.02763400000001, 40.139475 ], "pop" : 4249, "state" : "PA" } +{ "_id" : "17520", "city" : "EAST PETERSBURG", "loc" : [ -76.351169, 40.100781 ], "pop" : 4387, "state" : "PA" } +{ "_id" : "17522", "city" : "EPHRATA", "loc" : [ -76.18209299999999, 40.175641 ], "pop" : 25859, "state" : "PA" } +{ "_id" : "17527", "city" : "GAP", "loc" : [ -75.997801, 40.002018 ], "pop" : 4318, "state" : "PA" } +{ "_id" : "17529", "city" : "GORDONVILLE", "loc" : [ -76.11063, 40.035304 ], "pop" : 4429, "state" : "PA" } +{ "_id" : "17532", "city" : "HOLTWOOD", "loc" : [ -76.300822, 39.863146 ], "pop" : 2526, "state" : "PA" } +{ "_id" : "17535", "city" : "KINZERS", "loc" : [ -76.04932599999999, 40.005326 ], "pop" : 2524, "state" : "PA" } +{ "_id" : "17536", "city" : "KIRKWOOD", "loc" : [ -76.093315, 39.82571 ], "pop" : 2384, "state" : "PA" } +{ "_id" : "17538", "city" : "SALUNGA", "loc" : [ -76.414975, 40.08825 ], "pop" : 5489, "state" : "PA" } +{ "_id" : "17540", "city" : "LEOLA", "loc" : [ -76.192109, 40.096448 ], "pop" : 9624, "state" : "PA" } +{ "_id" : "17543", "city" : "BRUNNERVILLE", "loc" : [ -76.29926, 40.162573 ], "pop" : 29376, "state" : "PA" } +{ "_id" : "17545", "city" : "MANHEIM", "loc" : [ -76.416794, 40.170229 ], "pop" : 16992, "state" : "PA" } +{ "_id" : "17547", "city" : "MARIETTA", "loc" : [ -76.564527, 40.066442 ], "pop" : 5751, "state" : "PA" } +{ "_id" : "17551", "city" : "MILLERSVILLE", "loc" : [ -76.356568, 39.998213 ], "pop" : 8021, "state" : "PA" } +{ "_id" : "17552", "city" : "FLORIN", "loc" : [ -76.50755100000001, 40.106828 ], "pop" : 12282, "state" : "PA" } +{ "_id" : "17554", "city" : "MOUNTVILLE", "loc" : [ -76.427694, 40.042742 ], "pop" : 4192, "state" : "PA" } +{ "_id" : "17555", "city" : "NARVON", "loc" : [ -75.975584, 40.125165 ], "pop" : 7239, "state" : "PA" } +{ "_id" : "17557", "city" : "NEW HOLLAND", "loc" : [ -76.080136, 40.100511 ], "pop" : 11604, "state" : "PA" } +{ "_id" : "17560", "city" : "NEW PROVIDENCE", "loc" : [ -76.22431899999999, 39.909776 ], "pop" : 5330, "state" : "PA" } +{ "_id" : "17562", "city" : "PARADISE", "loc" : [ -76.108074, 39.985249 ], "pop" : 2757, "state" : "PA" } +{ "_id" : "17563", "city" : "PEACH BOTTOM", "loc" : [ -76.17908300000001, 39.770511 ], "pop" : 4352, "state" : "PA" } +{ "_id" : "17565", "city" : "PEQUEA", "loc" : [ -76.320866, 39.905765 ], "pop" : 1800, "state" : "PA" } +{ "_id" : "17566", "city" : "QUARRYVILLE", "loc" : [ -76.146462, 39.894932 ], "pop" : 9361, "state" : "PA" } +{ "_id" : "17569", "city" : "REINHOLDS", "loc" : [ -76.101332, 40.268758 ], "pop" : 4665, "state" : "PA" } +{ "_id" : "17572", "city" : "RONKS", "loc" : [ -76.166132, 40.020754 ], "pop" : 2964, "state" : "PA" } +{ "_id" : "17576", "city" : "SMOKETOWN", "loc" : [ -76.22007000000001, 40.040651 ], "pop" : 2141, "state" : "PA" } +{ "_id" : "17578", "city" : "STEVENS", "loc" : [ -76.162604, 40.219397 ], "pop" : 6511, "state" : "PA" } +{ "_id" : "17579", "city" : "STRASBURG", "loc" : [ -76.18482400000001, 39.970075 ], "pop" : 5694, "state" : "PA" } +{ "_id" : "17581", "city" : "TERRE HILL", "loc" : [ -76.05108300000001, 40.158539 ], "pop" : 1282, "state" : "PA" } +{ "_id" : "17582", "city" : "WASHINGTON BORO", "loc" : [ -76.4402, 39.988118 ], "pop" : 2214, "state" : "PA" } +{ "_id" : "17584", "city" : "WILLOW STREET", "loc" : [ -76.27524, 39.967003 ], "pop" : 7176, "state" : "PA" } +{ "_id" : "17601", "city" : "NEFFSVILLE", "loc" : [ -76.31988800000001, 40.075381 ], "pop" : 41062, "state" : "PA" } +{ "_id" : "17602", "city" : "LANCASTER", "loc" : [ -76.284364, 40.033514 ], "pop" : 40850, "state" : "PA" } +{ "_id" : "17603", "city" : "ROHRERSTOWN", "loc" : [ -76.33158299999999, 40.030475 ], "pop" : 55173, "state" : "PA" } +{ "_id" : "17701", "city" : "SOUTH WILLIAMSPO", "loc" : [ -77.020571, 41.247217 ], "pop" : 58844, "state" : "PA" } +{ "_id" : "17723", "city" : "CAMMAL", "loc" : [ -77.46202099999999, 41.380901 ], "pop" : 246, "state" : "PA" } +{ "_id" : "17724", "city" : "CANTON", "loc" : [ -76.858188, 41.653784 ], "pop" : 5189, "state" : "PA" } +{ "_id" : "17727", "city" : "CEDAR RUN", "loc" : [ -77.48891, 41.498972 ], "pop" : 102, "state" : "PA" } +{ "_id" : "17728", "city" : "COGAN STATION", "loc" : [ -77.068996, 41.31517 ], "pop" : 4582, "state" : "PA" } +{ "_id" : "17729", "city" : "CROSS FORK", "loc" : [ -77.80953, 41.473672 ], "pop" : 184, "state" : "PA" } +{ "_id" : "17737", "city" : "HUGHESVILLE", "loc" : [ -76.71411000000001, 41.255952 ], "pop" : 6489, "state" : "PA" } +{ "_id" : "17740", "city" : "SALLADASBURG", "loc" : [ -77.242704, 41.200733 ], "pop" : 11484, "state" : "PA" } +{ "_id" : "17742", "city" : "LAIRDSVILLE", "loc" : [ -76.58893, 41.233549 ], "pop" : 914, "state" : "PA" } +{ "_id" : "17744", "city" : "LINDEN", "loc" : [ -77.152652, 41.247216 ], "pop" : 2994, "state" : "PA" } +{ "_id" : "17745", "city" : "LOCK HAVEN", "loc" : [ -77.44358800000001, 41.142497 ], "pop" : 16448, "state" : "PA" } +{ "_id" : "17747", "city" : "LOGANTON", "loc" : [ -77.320397, 41.028317 ], "pop" : 2326, "state" : "PA" } +{ "_id" : "17751", "city" : "MILL HALL", "loc" : [ -77.483609, 41.086688 ], "pop" : 7510, "state" : "PA" } +{ "_id" : "17752", "city" : "MONTGOMERY", "loc" : [ -76.883933, 41.178778 ], "pop" : 5539, "state" : "PA" } +{ "_id" : "17754", "city" : "MONTOURSVILLE", "loc" : [ -76.903035, 41.266252 ], "pop" : 11266, "state" : "PA" } +{ "_id" : "17756", "city" : "MUNCY", "loc" : [ -76.76325799999999, 41.213715 ], "pop" : 8627, "state" : "PA" } +{ "_id" : "17758", "city" : "MUNCY VALLEY", "loc" : [ -76.541518, 41.381206 ], "pop" : 1548, "state" : "PA" } +{ "_id" : "17763", "city" : "RALSTON", "loc" : [ -76.95835, 41.503817 ], "pop" : 588, "state" : "PA" } +{ "_id" : "17764", "city" : "RENOVO", "loc" : [ -77.74478999999999, 41.333376 ], "pop" : 3639, "state" : "PA" } +{ "_id" : "17765", "city" : "ROARING BRANCH", "loc" : [ -76.942053, 41.569234 ], "pop" : 448, "state" : "PA" } +{ "_id" : "17768", "city" : "SHUNK", "loc" : [ -76.745521, 41.553574 ], "pop" : 300, "state" : "PA" } +{ "_id" : "17771", "city" : "TROUT RUN", "loc" : [ -77.009776, 41.412481 ], "pop" : 4449, "state" : "PA" } +{ "_id" : "17772", "city" : "TURBOTVILLE", "loc" : [ -76.742493, 41.111867 ], "pop" : 3902, "state" : "PA" } +{ "_id" : "17774", "city" : "UNITYVILLE", "loc" : [ -76.51831799999999, 41.243552 ], "pop" : 871, "state" : "PA" } +{ "_id" : "17776", "city" : "WATERVILLE", "loc" : [ -77.36036799999999, 41.31136 ], "pop" : 334, "state" : "PA" } +{ "_id" : "17777", "city" : "WATSONTOWN", "loc" : [ -76.85319200000001, 41.102006 ], "pop" : 6601, "state" : "PA" } +{ "_id" : "17778", "city" : "WESTPORT", "loc" : [ -77.931496, 41.27445 ], "pop" : 25, "state" : "PA" } +{ "_id" : "17779", "city" : "WOOLRICH", "loc" : [ -77.331307, 41.188734 ], "pop" : 4694, "state" : "PA" } +{ "_id" : "17801", "city" : "SUNBURY", "loc" : [ -76.77761099999999, 40.855122 ], "pop" : 17335, "state" : "PA" } +{ "_id" : "17810", "city" : "ALLENWOOD", "loc" : [ -76.972362, 41.126424 ], "pop" : 2666, "state" : "PA" } +{ "_id" : "17812", "city" : "BEAVER SPRINGS", "loc" : [ -77.231801, 40.752766 ], "pop" : 1575, "state" : "PA" } +{ "_id" : "17813", "city" : "BEAVERTOWN", "loc" : [ -77.169112, 40.777378 ], "pop" : 2226, "state" : "PA" } +{ "_id" : "17814", "city" : "BENTON", "loc" : [ -76.340632, 41.223142 ], "pop" : 5292, "state" : "PA" } +{ "_id" : "17815", "city" : "BLOOMSBURG", "loc" : [ -76.438379, 41.011528 ], "pop" : 25338, "state" : "PA" } +{ "_id" : "17820", "city" : "CATAWISSA", "loc" : [ -76.441586, 40.918031 ], "pop" : 6334, "state" : "PA" } +{ "_id" : "17821", "city" : "DANVILLE", "loc" : [ -76.62289699999999, 40.979895 ], "pop" : 17269, "state" : "PA" } +{ "_id" : "17823", "city" : "DORNSIFE", "loc" : [ -76.76260000000001, 40.757092 ], "pop" : 432, "state" : "PA" } +{ "_id" : "17824", "city" : "ELYSBURG", "loc" : [ -76.556924, 40.863871 ], "pop" : 2165, "state" : "PA" } +{ "_id" : "17827", "city" : "FREEBURG", "loc" : [ -76.94296300000001, 40.767498 ], "pop" : 1080, "state" : "PA" } +{ "_id" : "17828", "city" : "GOWEN CITY", "loc" : [ -76.528149, 40.751141 ], "pop" : 646, "state" : "PA" } +{ "_id" : "17830", "city" : "HERNDON", "loc" : [ -76.80076099999999, 40.691789 ], "pop" : 2089, "state" : "PA" } +{ "_id" : "17832", "city" : "MARION HEIGHTS", "loc" : [ -76.465137, 40.804576 ], "pop" : 837, "state" : "PA" } +{ "_id" : "17834", "city" : "KULPMONT", "loc" : [ -76.474384, 40.793278 ], "pop" : 3183, "state" : "PA" } +{ "_id" : "17835", "city" : "LAURELTON", "loc" : [ -77.20521100000001, 40.91268 ], "pop" : 448, "state" : "PA" } +{ "_id" : "17836", "city" : "LECK KILL", "loc" : [ -76.62710800000001, 40.710135 ], "pop" : 626, "state" : "PA" } +{ "_id" : "17837", "city" : "LEWISBURG", "loc" : [ -76.90987800000001, 40.970205 ], "pop" : 18821, "state" : "PA" } +{ "_id" : "17841", "city" : "MC CLURE", "loc" : [ -77.37579100000001, 40.699084 ], "pop" : 4901, "state" : "PA" } +{ "_id" : "17842", "city" : "MIDDLEBURG", "loc" : [ -77.046798, 40.797656 ], "pop" : 6546, "state" : "PA" } +{ "_id" : "17843", "city" : "BEAVER SPRINGS", "loc" : [ -76.970366, 40.810917 ], "pop" : 1791, "state" : "PA" } +{ "_id" : "17844", "city" : "MIFFLINBURG", "loc" : [ -77.050515, 40.921826 ], "pop" : 8379, "state" : "PA" } +{ "_id" : "17845", "city" : "MILLMONT", "loc" : [ -77.194142, 40.880324 ], "pop" : 2111, "state" : "PA" } +{ "_id" : "17846", "city" : "MILLVILLE", "loc" : [ -76.52076700000001, 41.126051 ], "pop" : 5496, "state" : "PA" } +{ "_id" : "17847", "city" : "MILTON", "loc" : [ -76.839817, 41.01681 ], "pop" : 9223, "state" : "PA" } +{ "_id" : "17850", "city" : "MONTANDON", "loc" : [ -76.851024, 40.975936 ], "pop" : 3167, "state" : "PA" } +{ "_id" : "17851", "city" : "MOUNT CARMEL", "loc" : [ -76.419466, 40.795535 ], "pop" : 9925, "state" : "PA" } +{ "_id" : "17853", "city" : "MOUNT PLEASANT M", "loc" : [ -77.005241, 40.700185 ], "pop" : 1876, "state" : "PA" } +{ "_id" : "17855", "city" : "NEW BERLIN", "loc" : [ -76.986124, 40.880212 ], "pop" : 904, "state" : "PA" } +{ "_id" : "17856", "city" : "NEW COLUMBIA", "loc" : [ -76.90185099999999, 41.054108 ], "pop" : 3072, "state" : "PA" } +{ "_id" : "17857", "city" : "NORTHUMBERLAND", "loc" : [ -76.79079400000001, 40.904355 ], "pop" : 7326, "state" : "PA" } +{ "_id" : "17859", "city" : "ORANGEVILLE", "loc" : [ -76.38097, 41.10156 ], "pop" : 2625, "state" : "PA" } +{ "_id" : "17860", "city" : "PAXINOS", "loc" : [ -76.635041, 40.844809 ], "pop" : 1684, "state" : "PA" } +{ "_id" : "17864", "city" : "PORT TREVORTON", "loc" : [ -76.908215, 40.699593 ], "pop" : 2911, "state" : "PA" } +{ "_id" : "17866", "city" : "RANSHAW", "loc" : [ -76.498242, 40.803039 ], "pop" : 124, "state" : "PA" } +{ "_id" : "17867", "city" : "REBUCK", "loc" : [ -76.740605, 40.712544 ], "pop" : 620, "state" : "PA" } +{ "_id" : "17868", "city" : "RIVERSIDE", "loc" : [ -76.637458, 40.951269 ], "pop" : 1991, "state" : "PA" } +{ "_id" : "17870", "city" : "SELINSGROVE", "loc" : [ -76.86825, 40.822372 ], "pop" : 14796, "state" : "PA" } +{ "_id" : "17872", "city" : "EXCELSIOR", "loc" : [ -76.56111799999999, 40.790336 ], "pop" : 20982, "state" : "PA" } +{ "_id" : "17877", "city" : "SNYDERTOWN", "loc" : [ -76.67494499999999, 40.874097 ], "pop" : 416, "state" : "PA" } +{ "_id" : "17878", "city" : "STILLWATER", "loc" : [ -76.369624, 41.151517 ], "pop" : 523, "state" : "PA" } +{ "_id" : "17881", "city" : "TREVORTON", "loc" : [ -76.67023399999999, 40.781867 ], "pop" : 2067, "state" : "PA" } +{ "_id" : "17888", "city" : "WILBURTON", "loc" : [ -76.392922, 40.812087 ], "pop" : 98, "state" : "PA" } +{ "_id" : "17889", "city" : "WINFIELD", "loc" : [ -76.871833, 40.890805 ], "pop" : 2071, "state" : "PA" } +{ "_id" : "17901", "city" : "POTTSVILLE", "loc" : [ -76.212318, 40.683978 ], "pop" : 27703, "state" : "PA" } +{ "_id" : "17921", "city" : "ASHLAND", "loc" : [ -76.342972, 40.773231 ], "pop" : 8328, "state" : "PA" } +{ "_id" : "17922", "city" : "AUBURN", "loc" : [ -76.13439, 40.596157 ], "pop" : 2444, "state" : "PA" } +{ "_id" : "17923", "city" : "BRANCHDALE", "loc" : [ -76.33278799999999, 40.664328 ], "pop" : 835, "state" : "PA" } +{ "_id" : "17925", "city" : "BROCKTON", "loc" : [ -76.049874, 40.763162 ], "pop" : 1230, "state" : "PA" } +{ "_id" : "17927", "city" : "CENTRALIA", "loc" : [ -76.357325, 40.81375 ], "pop" : 1006, "state" : "PA" } +{ "_id" : "17929", "city" : "CRESSONA", "loc" : [ -76.19502799999999, 40.628361 ], "pop" : 2240, "state" : "PA" } +{ "_id" : "17931", "city" : "FRACKVILLE", "loc" : [ -76.231137, 40.782537 ], "pop" : 7039, "state" : "PA" } +{ "_id" : "17935", "city" : "GIRARDVILLE", "loc" : [ -76.28581, 40.792162 ], "pop" : 1892, "state" : "PA" } +{ "_id" : "17938", "city" : "HEGINS", "loc" : [ -76.473168, 40.666898 ], "pop" : 2499, "state" : "PA" } +{ "_id" : "17941", "city" : "KLINGERSTOWN", "loc" : [ -76.65070900000001, 40.667571 ], "pop" : 508, "state" : "PA" } +{ "_id" : "17948", "city" : "MAHANOY CITY", "loc" : [ -76.139601, 40.812302 ], "pop" : 5209, "state" : "PA" } +{ "_id" : "17954", "city" : "MINERSVILLE", "loc" : [ -76.261533, 40.690637 ], "pop" : 4998, "state" : "PA" } +{ "_id" : "17957", "city" : "MUIR", "loc" : [ -76.468205, 40.613614 ], "pop" : 374, "state" : "PA" } +{ "_id" : "17959", "city" : "KASKA", "loc" : [ -76.11348, 40.722728 ], "pop" : 2826, "state" : "PA" } +{ "_id" : "17960", "city" : "NEW RINGGOLD", "loc" : [ -75.948409, 40.714851 ], "pop" : 4284, "state" : "PA" } +{ "_id" : "17961", "city" : "ORWIGSBURG", "loc" : [ -76.08399900000001, 40.643071 ], "pop" : 6928, "state" : "PA" } +{ "_id" : "17963", "city" : "PINE GROVE", "loc" : [ -76.326913, 40.567093 ], "pop" : 12239, "state" : "PA" } +{ "_id" : "17964", "city" : "PITMAN", "loc" : [ -76.523297, 40.704868 ], "pop" : 992, "state" : "PA" } +{ "_id" : "17965", "city" : "PORT CARBON", "loc" : [ -76.16604599999999, 40.697731 ], "pop" : 2260, "state" : "PA" } +{ "_id" : "17967", "city" : "RINGTOWN", "loc" : [ -76.23493000000001, 40.855854 ], "pop" : 2311, "state" : "PA" } +{ "_id" : "17968", "city" : "SACRAMENTO", "loc" : [ -76.61283299999999, 40.635238 ], "pop" : 347, "state" : "PA" } +{ "_id" : "17970", "city" : "SAINT CLAIR", "loc" : [ -76.192381, 40.719273 ], "pop" : 4091, "state" : "PA" } +{ "_id" : "17972", "city" : "SCHUYLKILL HAVEN", "loc" : [ -76.169973, 40.630571 ], "pop" : 6199, "state" : "PA" } +{ "_id" : "17976", "city" : "SHENANDOAH", "loc" : [ -76.203502, 40.816744 ], "pop" : 11159, "state" : "PA" } +{ "_id" : "17978", "city" : "SPRING GLEN", "loc" : [ -76.635018, 40.633447 ], "pop" : 288, "state" : "PA" } +{ "_id" : "17980", "city" : "TOWER CITY", "loc" : [ -76.550022, 40.584475 ], "pop" : 3905, "state" : "PA" } +{ "_id" : "17981", "city" : "DONALDSON", "loc" : [ -76.398796, 40.626842 ], "pop" : 2629, "state" : "PA" } +{ "_id" : "17983", "city" : "VALLEY VIEW", "loc" : [ -76.544843, 40.644467 ], "pop" : 2007, "state" : "PA" } +{ "_id" : "17985", "city" : "ZION GROVE", "loc" : [ -76.231032, 40.937152 ], "pop" : 2070, "state" : "PA" } +{ "_id" : "18011", "city" : "ALBURTIS", "loc" : [ -75.62112999999999, 40.486201 ], "pop" : 4844, "state" : "PA" } +{ "_id" : "18013", "city" : "ROSETO", "loc" : [ -75.195644, 40.854907 ], "pop" : 16916, "state" : "PA" } +{ "_id" : "18014", "city" : "BATH", "loc" : [ -75.40855999999999, 40.755144 ], "pop" : 11601, "state" : "PA" } +{ "_id" : "18015", "city" : "BETHLEHEM", "loc" : [ -75.38050699999999, 40.600167 ], "pop" : 29778, "state" : "PA" } +{ "_id" : "18017", "city" : "BUTZTOWN", "loc" : [ -75.35823000000001, 40.65168 ], "pop" : 46369, "state" : "PA" } +{ "_id" : "18018", "city" : "BETHLEHEM", "loc" : [ -75.392827, 40.627849 ], "pop" : 32072, "state" : "PA" } +{ "_id" : "18031", "city" : "BREINIGSVILLE", "loc" : [ -75.655269, 40.552621 ], "pop" : 3437, "state" : "PA" } +{ "_id" : "18032", "city" : "CATASAUQUA", "loc" : [ -75.46926999999999, 40.655696 ], "pop" : 9663, "state" : "PA" } +{ "_id" : "18034", "city" : "CENTER VALLEY", "loc" : [ -75.42420799999999, 40.539594 ], "pop" : 5250, "state" : "PA" } +{ "_id" : "18035", "city" : "CHERRYVILLE", "loc" : [ -75.552133, 40.738476 ], "pop" : 905, "state" : "PA" } +{ "_id" : "18036", "city" : "COOPERSBURG", "loc" : [ -75.388778, 40.507553 ], "pop" : 10656, "state" : "PA" } +{ "_id" : "18037", "city" : "COPLAY", "loc" : [ -75.51882500000001, 40.684865 ], "pop" : 6015, "state" : "PA" } +{ "_id" : "18038", "city" : "DANIELSVILLE", "loc" : [ -75.518604, 40.786636 ], "pop" : 2004, "state" : "PA" } +{ "_id" : "18041", "city" : "EAST GREENVILLE", "loc" : [ -75.505618, 40.411876 ], "pop" : 6266, "state" : "PA" } +{ "_id" : "18042", "city" : "FORKS TOWNSHIP", "loc" : [ -75.23582, 40.6867 ], "pop" : 65784, "state" : "PA" } +{ "_id" : "18049", "city" : "EMMAUS", "loc" : [ -75.500991, 40.529295 ], "pop" : 16204, "state" : "PA" } +{ "_id" : "18051", "city" : "FOGELSVILLE", "loc" : [ -75.656794, 40.59304 ], "pop" : 2175, "state" : "PA" } +{ "_id" : "18052", "city" : "HOKENDAUQUA", "loc" : [ -75.495383, 40.647479 ], "pop" : 23666, "state" : "PA" } +{ "_id" : "18053", "city" : "GERMANSVILLE", "loc" : [ -75.714687, 40.711826 ], "pop" : 975, "state" : "PA" } +{ "_id" : "18054", "city" : "GREEN LANE", "loc" : [ -75.435148, 40.353377 ], "pop" : 6020, "state" : "PA" } +{ "_id" : "18055", "city" : "HELLERTOWN", "loc" : [ -75.325513, 40.581715 ], "pop" : 11759, "state" : "PA" } +{ "_id" : "18056", "city" : "HEREFORD", "loc" : [ -75.579983, 40.448659 ], "pop" : 3026, "state" : "PA" } +{ "_id" : "18058", "city" : "KUNKLETOWN", "loc" : [ -75.47597399999999, 40.899891 ], "pop" : 4924, "state" : "PA" } +{ "_id" : "18062", "city" : "MACUNGIE", "loc" : [ -75.56661800000001, 40.528543 ], "pop" : 10376, "state" : "PA" } +{ "_id" : "18064", "city" : "NAZARETH", "loc" : [ -75.31993199999999, 40.744962 ], "pop" : 19236, "state" : "PA" } +{ "_id" : "18066", "city" : "NEW TRIPOLI", "loc" : [ -75.741739, 40.654544 ], "pop" : 4684, "state" : "PA" } +{ "_id" : "18067", "city" : "NORTHAMPTON", "loc" : [ -75.48742, 40.699765 ], "pop" : 13792, "state" : "PA" } +{ "_id" : "18069", "city" : "OREFIELD", "loc" : [ -75.59739500000001, 40.624826 ], "pop" : 6397, "state" : "PA" } +{ "_id" : "18070", "city" : "PALM", "loc" : [ -75.533124, 40.43167 ], "pop" : 512, "state" : "PA" } +{ "_id" : "18071", "city" : "PALMERTON", "loc" : [ -75.601119, 40.816976 ], "pop" : 11535, "state" : "PA" } +{ "_id" : "18072", "city" : "PEN ARGYL", "loc" : [ -75.270115, 40.85182 ], "pop" : 9736, "state" : "PA" } +{ "_id" : "18073", "city" : "PENNSBURG", "loc" : [ -75.486608, 40.391138 ], "pop" : 5126, "state" : "PA" } +{ "_id" : "18074", "city" : "PERKIOMENVILLE", "loc" : [ -75.50218, 40.31566 ], "pop" : 4053, "state" : "PA" } +{ "_id" : "18076", "city" : "RED HILL", "loc" : [ -75.484613, 40.375807 ], "pop" : 1807, "state" : "PA" } +{ "_id" : "18077", "city" : "RIEGELSVILLE", "loc" : [ -75.219064, 40.57824 ], "pop" : 1924, "state" : "PA" } +{ "_id" : "18078", "city" : "SCHNECKSVILLE", "loc" : [ -75.623924, 40.681949 ], "pop" : 6843, "state" : "PA" } +{ "_id" : "18080", "city" : "EMERALD", "loc" : [ -75.621612, 40.740695 ], "pop" : 11316, "state" : "PA" } +{ "_id" : "18087", "city" : "TREXLERTOWN", "loc" : [ -75.602293, 40.554418 ], "pop" : 690, "state" : "PA" } +{ "_id" : "18088", "city" : "WALNUTPORT", "loc" : [ -75.565749, 40.76147 ], "pop" : 7180, "state" : "PA" } +{ "_id" : "18091", "city" : "WIND GAP", "loc" : [ -75.32637800000001, 40.816922 ], "pop" : 1740, "state" : "PA" } +{ "_id" : "18092", "city" : "ZIONSVILLE", "loc" : [ -75.526146, 40.473425 ], "pop" : 2312, "state" : "PA" } +{ "_id" : "18101", "city" : "ALLENTOWN", "loc" : [ -75.470955, 40.602729 ], "pop" : 3638, "state" : "PA" } +{ "_id" : "18102", "city" : "ALLENTOWN", "loc" : [ -75.478139, 40.606818 ], "pop" : 41873, "state" : "PA" } +{ "_id" : "18103", "city" : "ALLENTOWN", "loc" : [ -75.464521, 40.589145 ], "pop" : 59074, "state" : "PA" } +{ "_id" : "18104", "city" : "ALLENTOWN", "loc" : [ -75.522499, 40.601849 ], "pop" : 33989, "state" : "PA" } +{ "_id" : "18106", "city" : "WESCOSVILLE", "loc" : [ -75.566424, 40.561451 ], "pop" : 6260, "state" : "PA" } +{ "_id" : "18201", "city" : "WEST HAZLETON", "loc" : [ -75.978193, 40.962107 ], "pop" : 38788, "state" : "PA" } +{ "_id" : "18210", "city" : "ALBRIGHTSVILLE", "loc" : [ -75.58420599999999, 40.974786 ], "pop" : 3862, "state" : "PA" } +{ "_id" : "18211", "city" : "ANDREAS", "loc" : [ -75.834247, 40.746457 ], "pop" : 1235, "state" : "PA" } +{ "_id" : "18214", "city" : "BARNESVILLE", "loc" : [ -76.06108999999999, 40.813811 ], "pop" : 1949, "state" : "PA" } +{ "_id" : "18216", "city" : "BEAVER MEADOWS", "loc" : [ -75.940648, 40.922672 ], "pop" : 2470, "state" : "PA" } +{ "_id" : "18218", "city" : "COALDALE", "loc" : [ -75.91038500000001, 40.821942 ], "pop" : 2531, "state" : "PA" } +{ "_id" : "18220", "city" : "DELANO", "loc" : [ -76.069462, 40.841048 ], "pop" : 605, "state" : "PA" } +{ "_id" : "18222", "city" : "DRUMS", "loc" : [ -75.97676, 41.025525 ], "pop" : 6008, "state" : "PA" } +{ "_id" : "18224", "city" : "FREELAND", "loc" : [ -75.888001, 41.019557 ], "pop" : 6311, "state" : "PA" } +{ "_id" : "18229", "city" : "JIM THORPE", "loc" : [ -75.739665, 40.870002 ], "pop" : 5048, "state" : "PA" } +{ "_id" : "18232", "city" : "LANSFORD", "loc" : [ -75.882834, 40.831444 ], "pop" : 4583, "state" : "PA" } +{ "_id" : "18235", "city" : "WEISSPORT", "loc" : [ -75.70608799999999, 40.830024 ], "pop" : 17675, "state" : "PA" } +{ "_id" : "18237", "city" : "MCADOO", "loc" : [ -75.997117, 40.89791 ], "pop" : 4184, "state" : "PA" } +{ "_id" : "18240", "city" : "NESQUEHONING", "loc" : [ -75.82389000000001, 40.862608 ], "pop" : 3364, "state" : "PA" } +{ "_id" : "18245", "city" : "QUAKAKE", "loc" : [ -75.982477, 40.849337 ], "pop" : 1292, "state" : "PA" } +{ "_id" : "18246", "city" : "ROCK GLEN", "loc" : [ -76.16376099999999, 40.964628 ], "pop" : 1938, "state" : "PA" } +{ "_id" : "18248", "city" : "SHEPPTON", "loc" : [ -76.137952, 40.888073 ], "pop" : 1374, "state" : "PA" } +{ "_id" : "18249", "city" : "SUGARLOAF", "loc" : [ -76.07165500000001, 40.997126 ], "pop" : 5007, "state" : "PA" } +{ "_id" : "18250", "city" : "SUMMIT HILL", "loc" : [ -75.869275, 40.825524 ], "pop" : 3332, "state" : "PA" } +{ "_id" : "18252", "city" : "TAMAQUA", "loc" : [ -75.97353, 40.798319 ], "pop" : 10446, "state" : "PA" } +{ "_id" : "18255", "city" : "WEATHERLY", "loc" : [ -75.830635, 40.941085 ], "pop" : 4295, "state" : "PA" } +{ "_id" : "18301", "city" : "EAST STROUDSBURG", "loc" : [ -75.173463, 41.036714 ], "pop" : 26726, "state" : "PA" } +{ "_id" : "18321", "city" : "BARTONSVILLE", "loc" : [ -75.29672600000001, 41.008007 ], "pop" : 553, "state" : "PA" } +{ "_id" : "18322", "city" : "BRODHEADSVILLE", "loc" : [ -75.410415, 40.930862 ], "pop" : 1834, "state" : "PA" } +{ "_id" : "18324", "city" : "BUSHKILL", "loc" : [ -75.01320699999999, 41.128476 ], "pop" : 2483, "state" : "PA" } +{ "_id" : "18325", "city" : "CANADENSIS", "loc" : [ -75.257288, 41.233791 ], "pop" : 2194, "state" : "PA" } +{ "_id" : "18326", "city" : "CRESCO", "loc" : [ -75.26822799999999, 41.160605 ], "pop" : 3074, "state" : "PA" } +{ "_id" : "18327", "city" : "DELAWARE WATER G", "loc" : [ -75.149987, 40.982863 ], "pop" : 1052, "state" : "PA" } +{ "_id" : "18328", "city" : "DINGMANS FERRY", "loc" : [ -74.938018, 41.239966 ], "pop" : 3705, "state" : "PA" } +{ "_id" : "18330", "city" : "EFFORT", "loc" : [ -75.452286, 40.966946 ], "pop" : 3817, "state" : "PA" } +{ "_id" : "18331", "city" : "GILBERT", "loc" : [ -75.43137299999999, 40.908866 ], "pop" : 405, "state" : "PA" } +{ "_id" : "18332", "city" : "HENRYVILLE", "loc" : [ -75.279753, 41.088912 ], "pop" : 1927, "state" : "PA" } +{ "_id" : "18333", "city" : "KRESGEVILLE", "loc" : [ -75.507437, 40.898156 ], "pop" : 1125, "state" : "PA" } +{ "_id" : "18334", "city" : "LONG POND", "loc" : [ -75.448245, 41.067732 ], "pop" : 667, "state" : "PA" } +{ "_id" : "18336", "city" : "MATAMORAS", "loc" : [ -74.71535799999999, 41.367437 ], "pop" : 3391, "state" : "PA" } +{ "_id" : "18337", "city" : "MILFORD", "loc" : [ -74.88236000000001, 41.322816 ], "pop" : 6668, "state" : "PA" } +{ "_id" : "18340", "city" : "MILLRIFT", "loc" : [ -74.773876, 41.358265 ], "pop" : 649, "state" : "PA" } +{ "_id" : "18343", "city" : "MOUNT BETHEL", "loc" : [ -75.11154500000001, 40.900839 ], "pop" : 3966, "state" : "PA" } +{ "_id" : "18344", "city" : "MOUNT POCONO", "loc" : [ -75.352868, 41.121558 ], "pop" : 2465, "state" : "PA" } +{ "_id" : "18346", "city" : "POCONO SUMMIT", "loc" : [ -75.413554, 41.103989 ], "pop" : 1509, "state" : "PA" } +{ "_id" : "18347", "city" : "POCONO LAKE", "loc" : [ -75.555863, 41.118661 ], "pop" : 1943, "state" : "PA" } +{ "_id" : "18350", "city" : "POCONO PINES", "loc" : [ -75.476038, 41.105387 ], "pop" : 866, "state" : "PA" } +{ "_id" : "18352", "city" : "REEDERS", "loc" : [ -75.278113, 40.989533 ], "pop" : 481, "state" : "PA" } +{ "_id" : "18353", "city" : "SAYLORSBURG", "loc" : [ -75.37476100000001, 40.917179 ], "pop" : 6970, "state" : "PA" } +{ "_id" : "18354", "city" : "SCIOTA", "loc" : [ -75.293779, 40.928282 ], "pop" : 4155, "state" : "PA" } +{ "_id" : "18355", "city" : "SCOTRUN", "loc" : [ -75.32646, 41.075147 ], "pop" : 966, "state" : "PA" } +{ "_id" : "18360", "city" : "STROUDSBURG", "loc" : [ -75.24852, 40.987697 ], "pop" : 17668, "state" : "PA" } +{ "_id" : "18370", "city" : "SWIFTWATER", "loc" : [ -75.34827799999999, 41.087936 ], "pop" : 838, "state" : "PA" } +{ "_id" : "18371", "city" : "TAMIMENT", "loc" : [ -74.952614, 41.168112 ], "pop" : 557, "state" : "PA" } +{ "_id" : "18372", "city" : "TANNERSVILLE", "loc" : [ -75.309984, 41.048202 ], "pop" : 2353, "state" : "PA" } +{ "_id" : "18401", "city" : "ALDENVILLE", "loc" : [ -75.36749, 41.642679 ], "pop" : 422, "state" : "PA" } +{ "_id" : "18403", "city" : "EYNON", "loc" : [ -75.555232, 41.495633 ], "pop" : 6489, "state" : "PA" } +{ "_id" : "18405", "city" : "BEACH LAKE", "loc" : [ -75.11649, 41.603403 ], "pop" : 918, "state" : "PA" } +{ "_id" : "18407", "city" : "SIMPSON", "loc" : [ -75.507363, 41.583481 ], "pop" : 16409, "state" : "PA" } +{ "_id" : "18411", "city" : "CLARKS SUMMIT", "loc" : [ -75.705713, 41.487795 ], "pop" : 23088, "state" : "PA" } +{ "_id" : "18414", "city" : "DALTON", "loc" : [ -75.703737, 41.539496 ], "pop" : 7621, "state" : "PA" } +{ "_id" : "18415", "city" : "DAMASCUS", "loc" : [ -75.131151, 41.736623 ], "pop" : 1206, "state" : "PA" } +{ "_id" : "18417", "city" : "EQUINUNK", "loc" : [ -75.189081, 41.811712 ], "pop" : 663, "state" : "PA" } +{ "_id" : "18419", "city" : "FACTORYVILLE", "loc" : [ -75.765182, 41.576168 ], "pop" : 4402, "state" : "PA" } +{ "_id" : "18421", "city" : "BROWNDALE", "loc" : [ -75.48725, 41.654587 ], "pop" : 3728, "state" : "PA" } +{ "_id" : "18424", "city" : "GOULDSBORO", "loc" : [ -75.503653, 41.2448 ], "pop" : 2805, "state" : "PA" } +{ "_id" : "18425", "city" : "GREELEY", "loc" : [ -75.012491, 41.437238 ], "pop" : 1121, "state" : "PA" } +{ "_id" : "18426", "city" : "GREENTOWN", "loc" : [ -75.28191099999999, 41.332145 ], "pop" : 1592, "state" : "PA" } +{ "_id" : "18427", "city" : "HAMLIN", "loc" : [ -75.354232, 41.401477 ], "pop" : 1575, "state" : "PA" } +{ "_id" : "18428", "city" : "HAWLEY", "loc" : [ -75.197822, 41.478685 ], "pop" : 2817, "state" : "PA" } +{ "_id" : "18430", "city" : "HERRICK CENTER", "loc" : [ -75.50438699999999, 41.76434 ], "pop" : 218, "state" : "PA" } +{ "_id" : "18431", "city" : "HONESDALE", "loc" : [ -75.25279, 41.579227 ], "pop" : 12655, "state" : "PA" } +{ "_id" : "18433", "city" : "MAYFIELD", "loc" : [ -75.542948, 41.532723 ], "pop" : 4274, "state" : "PA" } +{ "_id" : "18434", "city" : "JESSUP", "loc" : [ -75.56889099999999, 41.472443 ], "pop" : 4349, "state" : "PA" } +{ "_id" : "18435", "city" : "LACKAWAXEN", "loc" : [ -75.074859, 41.504272 ], "pop" : 1711, "state" : "PA" } +{ "_id" : "18436", "city" : "LAKE ARIEL", "loc" : [ -75.431257, 41.439476 ], "pop" : 7939, "state" : "PA" } +{ "_id" : "18437", "city" : "LAKE COMO", "loc" : [ -75.32308, 41.866553 ], "pop" : 415, "state" : "PA" } +{ "_id" : "18438", "city" : "LAKEVILLE", "loc" : [ -75.260717, 41.422278 ], "pop" : 1028, "state" : "PA" } +{ "_id" : "18439", "city" : "LAKEWOOD", "loc" : [ -75.383824, 41.817138 ], "pop" : 653, "state" : "PA" } +{ "_id" : "18441", "city" : "LENOXVILLE", "loc" : [ -75.631934, 41.667713 ], "pop" : 587, "state" : "PA" } +{ "_id" : "18443", "city" : "MILANVILLE", "loc" : [ -75.08817999999999, 41.649208 ], "pop" : 922, "state" : "PA" } +{ "_id" : "18444", "city" : "MOSCOW", "loc" : [ -75.530137, 41.343194 ], "pop" : 10881, "state" : "PA" } +{ "_id" : "18445", "city" : "NEWFOUNDLAND", "loc" : [ -75.33840499999999, 41.304125 ], "pop" : 659, "state" : "PA" } +{ "_id" : "18446", "city" : "NICHOLSON", "loc" : [ -75.764073, 41.641198 ], "pop" : 3513, "state" : "PA" } +{ "_id" : "18447", "city" : "OLYPHANT", "loc" : [ -75.601502, 41.467709 ], "pop" : 7421, "state" : "PA" } +{ "_id" : "18451", "city" : "PAUPACK", "loc" : [ -75.23032000000001, 41.381197 ], "pop" : 887, "state" : "PA" } +{ "_id" : "18452", "city" : "PECKVILLE", "loc" : [ -75.589884, 41.482124 ], "pop" : 6252, "state" : "PA" } +{ "_id" : "18453", "city" : "PLEASANT MOUNT", "loc" : [ -75.398944, 41.732204 ], "pop" : 1232, "state" : "PA" } +{ "_id" : "18455", "city" : "PRESTON PARK", "loc" : [ -75.38314699999999, 41.867264 ], "pop" : 224, "state" : "PA" } +{ "_id" : "18456", "city" : "PROMPTON", "loc" : [ -75.32074900000001, 41.582031 ], "pop" : 552, "state" : "PA" } +{ "_id" : "18458", "city" : "SHOHOLA", "loc" : [ -74.917962, 41.418193 ], "pop" : 1586, "state" : "PA" } +{ "_id" : "18460", "city" : "SOUTH STERLING", "loc" : [ -75.381443, 41.271222 ], "pop" : 922, "state" : "PA" } +{ "_id" : "18461", "city" : "STARLIGHT", "loc" : [ -75.32123799999999, 41.925087 ], "pop" : 431, "state" : "PA" } +{ "_id" : "18462", "city" : "STARRUCCA", "loc" : [ -75.449001, 41.890739 ], "pop" : 333, "state" : "PA" } +{ "_id" : "18463", "city" : "STERLING", "loc" : [ -75.39446700000001, 41.341912 ], "pop" : 689, "state" : "PA" } +{ "_id" : "18464", "city" : "TAFTON", "loc" : [ -75.101598, 41.369445 ], "pop" : 2752, "state" : "PA" } +{ "_id" : "18465", "city" : "THOMPSON", "loc" : [ -75.534215, 41.83395 ], "pop" : 1277, "state" : "PA" } +{ "_id" : "18466", "city" : "TOBYHANNA", "loc" : [ -75.39178099999999, 41.183638 ], "pop" : 6668, "state" : "PA" } +{ "_id" : "18469", "city" : "TYLER HILL", "loc" : [ -75.154246, 41.670873 ], "pop" : 592, "state" : "PA" } +{ "_id" : "18470", "city" : "UNION DALE", "loc" : [ -75.546476, 41.707941 ], "pop" : 1325, "state" : "PA" } +{ "_id" : "18472", "city" : "WAYMART", "loc" : [ -75.40647800000001, 41.570276 ], "pop" : 3922, "state" : "PA" } +{ "_id" : "18503", "city" : "SCRANTON", "loc" : [ -75.664205, 41.409517 ], "pop" : 720, "state" : "PA" } +{ "_id" : "18504", "city" : "SCRANTON", "loc" : [ -75.686081, 41.412777 ], "pop" : 22279, "state" : "PA" } +{ "_id" : "18505", "city" : "SCRANTON", "loc" : [ -75.665738, 41.39145 ], "pop" : 21733, "state" : "PA" } +{ "_id" : "18507", "city" : "MOOSIC", "loc" : [ -75.71709300000001, 41.361492 ], "pop" : 5339, "state" : "PA" } +{ "_id" : "18508", "city" : "SCRANTON", "loc" : [ -75.66252900000001, 41.438917 ], "pop" : 13555, "state" : "PA" } +{ "_id" : "18509", "city" : "SCRANTON", "loc" : [ -75.64645400000001, 41.427353 ], "pop" : 15432, "state" : "PA" } +{ "_id" : "18510", "city" : "SCRANTON", "loc" : [ -75.648397, 41.408039 ], "pop" : 14306, "state" : "PA" } +{ "_id" : "18512", "city" : "DUNMORE", "loc" : [ -75.62294, 41.426184 ], "pop" : 14428, "state" : "PA" } +{ "_id" : "18517", "city" : "TAYLOR", "loc" : [ -75.71584799999999, 41.390442 ], "pop" : 5738, "state" : "PA" } +{ "_id" : "18518", "city" : "OLD FORGE", "loc" : [ -75.739075, 41.370076 ], "pop" : 8834, "state" : "PA" } +{ "_id" : "18519", "city" : "DICKSON CITY", "loc" : [ -75.624343, 41.462306 ], "pop" : 5012, "state" : "PA" } +{ "_id" : "18603", "city" : "BERWICK", "loc" : [ -76.244269, 41.066477 ], "pop" : 19977, "state" : "PA" } +{ "_id" : "18610", "city" : "BLAKESLEE", "loc" : [ -75.53430899999999, 41.048502 ], "pop" : 426, "state" : "PA" } +{ "_id" : "18612", "city" : "COLLEGE MISERICO", "loc" : [ -75.958911, 41.363762 ], "pop" : 13726, "state" : "PA" } +{ "_id" : "18614", "city" : "DUSHORE", "loc" : [ -76.402145, 41.523213 ], "pop" : 1739, "state" : "PA" } +{ "_id" : "18615", "city" : "FALLS", "loc" : [ -75.856004, 41.466677 ], "pop" : 2349, "state" : "PA" } +{ "_id" : "18616", "city" : "FORKSVILLE", "loc" : [ -76.60079, 41.526925 ], "pop" : 1080, "state" : "PA" } +{ "_id" : "18617", "city" : "GLEN LYON", "loc" : [ -76.074578, 41.174635 ], "pop" : 2082, "state" : "PA" } +{ "_id" : "18618", "city" : "HARVEYS LAKE", "loc" : [ -76.04506000000001, 41.359181 ], "pop" : 3404, "state" : "PA" } +{ "_id" : "18619", "city" : "HILLSGROVE", "loc" : [ -76.697914, 41.448159 ], "pop" : 337, "state" : "PA" } +{ "_id" : "18621", "city" : "HUNLOCK CREEK", "loc" : [ -76.087915, 41.245923 ], "pop" : 4207, "state" : "PA" } +{ "_id" : "18622", "city" : "HUNTINGTON MILLS", "loc" : [ -76.19734200000001, 41.200905 ], "pop" : 345, "state" : "PA" } +{ "_id" : "18623", "city" : "LACEYVILLE", "loc" : [ -76.142566, 41.66621 ], "pop" : 3195, "state" : "PA" } +{ "_id" : "18624", "city" : "LAKE HARMONY", "loc" : [ -75.633129, 41.05424 ], "pop" : 1203, "state" : "PA" } +{ "_id" : "18628", "city" : "LOPEZ", "loc" : [ -76.300206, 41.418002 ], "pop" : 600, "state" : "PA" } +{ "_id" : "18629", "city" : "MEHOOPANY", "loc" : [ -76.10346199999999, 41.558695 ], "pop" : 1630, "state" : "PA" } +{ "_id" : "18630", "city" : "MESHOPPEN", "loc" : [ -76.01546399999999, 41.639163 ], "pop" : 3307, "state" : "PA" } +{ "_id" : "18631", "city" : "MIFFLINVILLE", "loc" : [ -76.292396, 41.023473 ], "pop" : 2297, "state" : "PA" } +{ "_id" : "18632", "city" : "MILDRED", "loc" : [ -76.38312999999999, 41.479236 ], "pop" : 500, "state" : "PA" } +{ "_id" : "18634", "city" : "NANTICOKE", "loc" : [ -76.004419, 41.19634 ], "pop" : 14778, "state" : "PA" } +{ "_id" : "18635", "city" : "NESCOPECK", "loc" : [ -76.19808999999999, 41.046887 ], "pop" : 2723, "state" : "PA" } +{ "_id" : "18636", "city" : "NOXEN", "loc" : [ -76.045952, 41.418131 ], "pop" : 1653, "state" : "PA" } +{ "_id" : "18640", "city" : "PITTSTON", "loc" : [ -75.78849200000001, 41.317501 ], "pop" : 18888, "state" : "PA" } +{ "_id" : "18641", "city" : "AVOCA", "loc" : [ -75.74465499999999, 41.330857 ], "pop" : 6485, "state" : "PA" } +{ "_id" : "18642", "city" : "DURYEA", "loc" : [ -75.761104, 41.348557 ], "pop" : 4262, "state" : "PA" } +{ "_id" : "18643", "city" : "WEST PITTSTON", "loc" : [ -75.81665099999999, 41.337964 ], "pop" : 13853, "state" : "PA" } +{ "_id" : "18644", "city" : "WYOMING", "loc" : [ -75.854071, 41.319713 ], "pop" : 8126, "state" : "PA" } +{ "_id" : "18651", "city" : "PLYMOUTH", "loc" : [ -75.948064, 41.245798 ], "pop" : 11895, "state" : "PA" } +{ "_id" : "18655", "city" : "MOCANAQUA", "loc" : [ -76.167096, 41.176674 ], "pop" : 6324, "state" : "PA" } +{ "_id" : "18656", "city" : "SWEET VALLEY", "loc" : [ -76.13390699999999, 41.30663 ], "pop" : 3237, "state" : "PA" } +{ "_id" : "18657", "city" : "CENTER MORELAND", "loc" : [ -75.94104299999999, 41.550687 ], "pop" : 9921, "state" : "PA" } +{ "_id" : "18660", "city" : "WAPWALLOPEN", "loc" : [ -76.085729, 41.06797 ], "pop" : 1198, "state" : "PA" } +{ "_id" : "18661", "city" : "WHITE HAVEN", "loc" : [ -75.77149199999999, 41.079049 ], "pop" : 4435, "state" : "PA" } +{ "_id" : "18701", "city" : "WILKES BARRE", "loc" : [ -75.884063, 41.244892 ], "pop" : 4320, "state" : "PA" } +{ "_id" : "18702", "city" : "HANOVER TOWNSHIP", "loc" : [ -75.88255700000001, 41.236512 ], "pop" : 54119, "state" : "PA" } +{ "_id" : "18704", "city" : "KINGSTON", "loc" : [ -75.890338, 41.274223 ], "pop" : 33661, "state" : "PA" } +{ "_id" : "18705", "city" : "WILKES BARRE", "loc" : [ -75.845309, 41.268921 ], "pop" : 17504, "state" : "PA" } +{ "_id" : "18706", "city" : "ASHLEY", "loc" : [ -75.91815699999999, 41.206709 ], "pop" : 7980, "state" : "PA" } +{ "_id" : "18707", "city" : "MOUNTAIN TOP", "loc" : [ -75.937642, 41.134975 ], "pop" : 13244, "state" : "PA" } +{ "_id" : "18708", "city" : "SHAVERTOWN", "loc" : [ -75.97108, 41.299802 ], "pop" : 12656, "state" : "PA" } +{ "_id" : "18709", "city" : "LUZERNE", "loc" : [ -75.893475, 41.284257 ], "pop" : 3157, "state" : "PA" } +{ "_id" : "18801", "city" : "MONTROSE", "loc" : [ -75.88205499999999, 41.839584 ], "pop" : 6624, "state" : "PA" } +{ "_id" : "18810", "city" : "ATHENS", "loc" : [ -76.488855, 41.949002 ], "pop" : 7602, "state" : "PA" } +{ "_id" : "18812", "city" : "BRACKNEY", "loc" : [ -75.937527, 41.966614 ], "pop" : 1645, "state" : "PA" } +{ "_id" : "18817", "city" : "EAST SMITHFIELD", "loc" : [ -76.61720699999999, 41.863115 ], "pop" : 1520, "state" : "PA" } +{ "_id" : "18818", "city" : "FRIENDSVILLE", "loc" : [ -76.02569, 41.916445 ], "pop" : 1844, "state" : "PA" } +{ "_id" : "18821", "city" : "GREAT BEND", "loc" : [ -75.732742, 41.977513 ], "pop" : 1654, "state" : "PA" } +{ "_id" : "18822", "city" : "HALLSTEAD", "loc" : [ -75.782595, 41.959798 ], "pop" : 2970, "state" : "PA" } +{ "_id" : "18823", "city" : "HARFORD", "loc" : [ -75.67863199999999, 41.779891 ], "pop" : 1155, "state" : "PA" } +{ "_id" : "18824", "city" : "HOP BOTTOM", "loc" : [ -75.78965599999999, 41.693196 ], "pop" : 1088, "state" : "PA" } +{ "_id" : "18825", "city" : "JACKSON", "loc" : [ -75.60913600000001, 41.864881 ], "pop" : 668, "state" : "PA" } +{ "_id" : "18826", "city" : "KINGSLEY", "loc" : [ -75.783101, 41.765856 ], "pop" : 1159, "state" : "PA" } +{ "_id" : "18828", "city" : "LAWTON", "loc" : [ -76.09121399999999, 41.757294 ], "pop" : 15, "state" : "PA" } +{ "_id" : "18829", "city" : "LE RAYSVILLE", "loc" : [ -76.179604, 41.843415 ], "pop" : 1020, "state" : "PA" } +{ "_id" : "18830", "city" : "LITTLE MEADOWS", "loc" : [ -76.118472, 41.976593 ], "pop" : 750, "state" : "PA" } +{ "_id" : "18831", "city" : "MILAN", "loc" : [ -76.532777, 41.896555 ], "pop" : 328, "state" : "PA" } +{ "_id" : "18832", "city" : "MONROETON", "loc" : [ -76.500995, 41.699387 ], "pop" : 2332, "state" : "PA" } +{ "_id" : "18833", "city" : "NEW ALBANY", "loc" : [ -76.43983, 41.59867 ], "pop" : 1390, "state" : "PA" } +{ "_id" : "18834", "city" : "NEW MILFORD", "loc" : [ -75.717113, 41.866409 ], "pop" : 2684, "state" : "PA" } +{ "_id" : "18837", "city" : "ROME", "loc" : [ -76.301498, 41.863403 ], "pop" : 2053, "state" : "PA" } +{ "_id" : "18839", "city" : "RUSHVILLE", "loc" : [ -76.050955, 41.776893 ], "pop" : 1228, "state" : "PA" } +{ "_id" : "18840", "city" : "SAYRE", "loc" : [ -76.52175699999999, 41.984222 ], "pop" : 10320, "state" : "PA" } +{ "_id" : "18842", "city" : "SOUTH GIBSON", "loc" : [ -75.606723, 41.754373 ], "pop" : 402, "state" : "PA" } +{ "_id" : "18844", "city" : "SPRINGVILLE", "loc" : [ -75.902472, 41.714684 ], "pop" : 2003, "state" : "PA" } +{ "_id" : "18845", "city" : "STEVENSVILLE", "loc" : [ -76.171696, 41.771782 ], "pop" : 401, "state" : "PA" } +{ "_id" : "18846", "city" : "SUGAR RUN", "loc" : [ -76.25978499999999, 41.604057 ], "pop" : 1057, "state" : "PA" } +{ "_id" : "18847", "city" : "SUSQUEHANNA", "loc" : [ -75.586249, 41.948669 ], "pop" : 5137, "state" : "PA" } +{ "_id" : "18848", "city" : "TOWANDA", "loc" : [ -76.464527, 41.763758 ], "pop" : 7449, "state" : "PA" } +{ "_id" : "18850", "city" : "ULSTER", "loc" : [ -76.487574, 41.840809 ], "pop" : 2049, "state" : "PA" } +{ "_id" : "18851", "city" : "WARREN CENTER", "loc" : [ -76.196445, 41.939389 ], "pop" : 927, "state" : "PA" } +{ "_id" : "18853", "city" : "WYALUSING", "loc" : [ -76.27543300000001, 41.701499 ], "pop" : 3439, "state" : "PA" } +{ "_id" : "18854", "city" : "WYSOX", "loc" : [ -76.383397, 41.782621 ], "pop" : 2121, "state" : "PA" } +{ "_id" : "18901", "city" : "NEW BRITAIN", "loc" : [ -75.129987, 40.320391 ], "pop" : 33133, "state" : "PA" } +{ "_id" : "18913", "city" : "CARVERSVILLE", "loc" : [ -75.06312699999999, 40.39079 ], "pop" : 579, "state" : "PA" } +{ "_id" : "18914", "city" : "CHALFONT", "loc" : [ -75.214938, 40.289175 ], "pop" : 12838, "state" : "PA" } +{ "_id" : "18915", "city" : "COLMAR", "loc" : [ -75.26686100000001, 40.271814 ], "pop" : 2168, "state" : "PA" } +{ "_id" : "18917", "city" : "DUBLIN", "loc" : [ -75.204453, 40.371996 ], "pop" : 1985, "state" : "PA" } +{ "_id" : "18920", "city" : "ERWINNA", "loc" : [ -75.080372, 40.508689 ], "pop" : 573, "state" : "PA" } +{ "_id" : "18923", "city" : "FOUNTAINVILLE", "loc" : [ -75.153627, 40.336815 ], "pop" : 261, "state" : "PA" } +{ "_id" : "18925", "city" : "FURLONG", "loc" : [ -75.06494600000001, 40.294518 ], "pop" : 3789, "state" : "PA" } +{ "_id" : "18927", "city" : "HILLTOWN", "loc" : [ -75.27118, 40.34762 ], "pop" : 881, "state" : "PA" } +{ "_id" : "18929", "city" : "JAMISON", "loc" : [ -75.096093, 40.256599 ], "pop" : 3797, "state" : "PA" } +{ "_id" : "18930", "city" : "KINTNERSVILLE", "loc" : [ -75.211708, 40.531009 ], "pop" : 2997, "state" : "PA" } +{ "_id" : "18932", "city" : "LINE LEXINGTON", "loc" : [ -75.25553499999999, 40.288781 ], "pop" : 301, "state" : "PA" } +{ "_id" : "18933", "city" : "LUMBERVILLE", "loc" : [ -75.055166, 40.407103 ], "pop" : 382, "state" : "PA" } +{ "_id" : "18934", "city" : "MECHANICSVILLE", "loc" : [ -75.062962, 40.343821 ], "pop" : 429, "state" : "PA" } +{ "_id" : "18936", "city" : "MONTGOMERYVILLE", "loc" : [ -75.23464300000001, 40.251353 ], "pop" : 5520, "state" : "PA" } +{ "_id" : "18938", "city" : "NEW HOPE", "loc" : [ -74.983889, 40.355613 ], "pop" : 7111, "state" : "PA" } +{ "_id" : "18940", "city" : "GEORGE SCHOOL", "loc" : [ -74.94313, 40.245817 ], "pop" : 21946, "state" : "PA" } +{ "_id" : "18942", "city" : "OTTSVILLE", "loc" : [ -75.157009, 40.459239 ], "pop" : 2976, "state" : "PA" } +{ "_id" : "18944", "city" : "PERKASIE", "loc" : [ -75.264803, 40.376526 ], "pop" : 18235, "state" : "PA" } +{ "_id" : "18947", "city" : "PIPERSVILLE", "loc" : [ -75.107398, 40.4262 ], "pop" : 3856, "state" : "PA" } +{ "_id" : "18951", "city" : "QUAKERTOWN", "loc" : [ -75.350667, 40.4411 ], "pop" : 28546, "state" : "PA" } +{ "_id" : "18954", "city" : "RICHBORO", "loc" : [ -75.00293600000001, 40.216672 ], "pop" : 8006, "state" : "PA" } +{ "_id" : "18955", "city" : "RICHLANDTOWN", "loc" : [ -75.32192999999999, 40.472166 ], "pop" : 1199, "state" : "PA" } +{ "_id" : "18960", "city" : "SELLERSVILLE", "loc" : [ -75.31895299999999, 40.362024 ], "pop" : 8387, "state" : "PA" } +{ "_id" : "18964", "city" : "BETHTON", "loc" : [ -75.32133899999999, 40.312796 ], "pop" : 9350, "state" : "PA" } +{ "_id" : "18966", "city" : "HOLLAND", "loc" : [ -75.005994, 40.190212 ], "pop" : 38866, "state" : "PA" } +{ "_id" : "18969", "city" : "TELFORD", "loc" : [ -75.352001, 40.320478 ], "pop" : 10929, "state" : "PA" } +{ "_id" : "18972", "city" : "UPPER BLACK EDDY", "loc" : [ -75.12585799999999, 40.541093 ], "pop" : 3443, "state" : "PA" } +{ "_id" : "18974", "city" : "WARMINSTER", "loc" : [ -75.090513, 40.206676 ], "pop" : 37759, "state" : "PA" } +{ "_id" : "18976", "city" : "WARRINGTON", "loc" : [ -75.135392, 40.246438 ], "pop" : 13862, "state" : "PA" } +{ "_id" : "18977", "city" : "WASHINGTON CROSS", "loc" : [ -74.882859, 40.291906 ], "pop" : 2824, "state" : "PA" } +{ "_id" : "19001", "city" : "OGONTZ CAMPUS", "loc" : [ -75.128918, 40.128141 ], "pop" : 17302, "state" : "PA" } +{ "_id" : "19002", "city" : "MAPLE GLEN", "loc" : [ -75.207234, 40.166318 ], "pop" : 24133, "state" : "PA" } +{ "_id" : "19003", "city" : "ARDMORE", "loc" : [ -75.29665, 40.001971 ], "pop" : 12443, "state" : "PA" } +{ "_id" : "19004", "city" : "BALA CYNWYD", "loc" : [ -75.23421, 40.01179 ], "pop" : 9239, "state" : "PA" } +{ "_id" : "19006", "city" : "HUNTINGDON VALLE", "loc" : [ -75.05897899999999, 40.129686 ], "pop" : 19866, "state" : "PA" } +{ "_id" : "19007", "city" : "TULLYTOWN", "loc" : [ -74.86071800000001, 40.109174 ], "pop" : 22334, "state" : "PA" } +{ "_id" : "19008", "city" : "BROOMALL", "loc" : [ -75.360214, 39.974666 ], "pop" : 20432, "state" : "PA" } +{ "_id" : "19010", "city" : "BRYN MAWR", "loc" : [ -75.329487, 40.023618 ], "pop" : 21826, "state" : "PA" } +{ "_id" : "19012", "city" : "CHELTENHAM", "loc" : [ -75.10477400000001, 40.060327 ], "pop" : 6912, "state" : "PA" } +{ "_id" : "19013", "city" : "CHESTER", "loc" : [ -75.37468699999999, 39.849817 ], "pop" : 49144, "state" : "PA" } +{ "_id" : "19014", "city" : "ASTON", "loc" : [ -75.43321, 39.864282 ], "pop" : 18171, "state" : "PA" } +{ "_id" : "19015", "city" : "BROOKHAVEN", "loc" : [ -75.38848299999999, 39.865355 ], "pop" : 17321, "state" : "PA" } +{ "_id" : "19018", "city" : "PRIMOS SECANE", "loc" : [ -75.299592, 39.923579 ], "pop" : 23885, "state" : "PA" } +{ "_id" : "19020", "city" : "BENSALEM", "loc" : [ -74.937753, 40.110881 ], "pop" : 51884, "state" : "PA" } +{ "_id" : "19021", "city" : "CROYDON", "loc" : [ -74.89907700000001, 40.093322 ], "pop" : 10198, "state" : "PA" } +{ "_id" : "19022", "city" : "CRUM LYNNE", "loc" : [ -75.337397, 39.868457 ], "pop" : 769, "state" : "PA" } +{ "_id" : "19023", "city" : "COLLINGDALE", "loc" : [ -75.266226, 39.916732 ], "pop" : 23274, "state" : "PA" } +{ "_id" : "19025", "city" : "DRESHER", "loc" : [ -75.162379, 40.143141 ], "pop" : 4089, "state" : "PA" } +{ "_id" : "19026", "city" : "PILGRIM GARDENS", "loc" : [ -75.303479, 39.949197 ], "pop" : 32559, "state" : "PA" } +{ "_id" : "19029", "city" : "LESTER", "loc" : [ -75.293521, 39.866864 ], "pop" : 4440, "state" : "PA" } +{ "_id" : "19030", "city" : "FAIRLESS HILLS", "loc" : [ -74.851923, 40.174822 ], "pop" : 13433, "state" : "PA" } +{ "_id" : "19031", "city" : "FLOURTOWN", "loc" : [ -75.21147999999999, 40.106774 ], "pop" : 4284, "state" : "PA" } +{ "_id" : "19032", "city" : "FOLCROFT", "loc" : [ -75.282117, 39.890508 ], "pop" : 7399, "state" : "PA" } +{ "_id" : "19033", "city" : "FOLSOM", "loc" : [ -75.329567, 39.890129 ], "pop" : 7677, "state" : "PA" } +{ "_id" : "19034", "city" : "FORT WASHINGTON", "loc" : [ -75.202175, 40.138592 ], "pop" : 6787, "state" : "PA" } +{ "_id" : "19035", "city" : "GLADWYNE", "loc" : [ -75.282082, 40.045118 ], "pop" : 3742, "state" : "PA" } +{ "_id" : "19036", "city" : "GLENOLDEN", "loc" : [ -75.29455900000001, 39.904848 ], "pop" : 14390, "state" : "PA" } +{ "_id" : "19038", "city" : "GLENSIDE", "loc" : [ -75.15496400000001, 40.10959 ], "pop" : 23067, "state" : "PA" } +{ "_id" : "19040", "city" : "HATBORO", "loc" : [ -75.10718199999999, 40.178547 ], "pop" : 21765, "state" : "PA" } +{ "_id" : "19041", "city" : "HAVERFORD", "loc" : [ -75.312116, 40.009739 ], "pop" : 6560, "state" : "PA" } +{ "_id" : "19043", "city" : "HOLMES", "loc" : [ -75.308674, 39.900284 ], "pop" : 2747, "state" : "PA" } +{ "_id" : "19044", "city" : "HORSHAM", "loc" : [ -75.147932, 40.182057 ], "pop" : 15131, "state" : "PA" } +{ "_id" : "19046", "city" : "MEADOWBROOK", "loc" : [ -75.117273, 40.100477 ], "pop" : 14402, "state" : "PA" } +{ "_id" : "19047", "city" : "PENNDEL", "loc" : [ -74.91510100000001, 40.175055 ], "pop" : 34108, "state" : "PA" } +{ "_id" : "19050", "city" : "YEADON", "loc" : [ -75.264872, 39.93779 ], "pop" : 30411, "state" : "PA" } +{ "_id" : "19053", "city" : "FEASTERVILLE TRE", "loc" : [ -74.98375799999999, 40.151188 ], "pop" : 24877, "state" : "PA" } +{ "_id" : "19054", "city" : "LEVITTOWN", "loc" : [ -74.823138, 40.168142 ], "pop" : 16390, "state" : "PA" } +{ "_id" : "19055", "city" : "LEVITTOWN", "loc" : [ -74.83714000000001, 40.148329 ], "pop" : 14924, "state" : "PA" } +{ "_id" : "19056", "city" : "LEVITTOWN", "loc" : [ -74.882632, 40.151861 ], "pop" : 15227, "state" : "PA" } +{ "_id" : "19057", "city" : "LEVITTOWN", "loc" : [ -74.861366, 40.143359 ], "pop" : 17014, "state" : "PA" } +{ "_id" : "19061", "city" : "BOOTHWYN", "loc" : [ -75.44830899999999, 39.833934 ], "pop" : 21328, "state" : "PA" } +{ "_id" : "19063", "city" : "GLEN RIDDLE LIMA", "loc" : [ -75.40722599999999, 39.915562 ], "pop" : 36385, "state" : "PA" } +{ "_id" : "19064", "city" : "SPRINGFIELD", "loc" : [ -75.333786, 39.929599 ], "pop" : 25179, "state" : "PA" } +{ "_id" : "19066", "city" : "MERION STATION", "loc" : [ -75.250302, 40.003043 ], "pop" : 5633, "state" : "PA" } +{ "_id" : "19067", "city" : "YARDLEY", "loc" : [ -74.822153, 40.212064 ], "pop" : 47492, "state" : "PA" } +{ "_id" : "19070", "city" : "MORTON", "loc" : [ -75.323785, 39.906292 ], "pop" : 6517, "state" : "PA" } +{ "_id" : "19072", "city" : "NARBERTH", "loc" : [ -75.2594, 40.01768 ], "pop" : 9846, "state" : "PA" } +{ "_id" : "19073", "city" : "NEWTOWN SQUARE", "loc" : [ -75.406997, 39.986292 ], "pop" : 15024, "state" : "PA" } +{ "_id" : "19074", "city" : "NORWOOD", "loc" : [ -75.297247, 39.887026 ], "pop" : 6189, "state" : "PA" } +{ "_id" : "19075", "city" : "ORELAND", "loc" : [ -75.18685000000001, 40.113197 ], "pop" : 7397, "state" : "PA" } +{ "_id" : "19076", "city" : "PROSPECT PARK", "loc" : [ -75.308165, 39.885737 ], "pop" : 6769, "state" : "PA" } +{ "_id" : "19078", "city" : "RIDLEY PARK", "loc" : [ -75.321517, 39.878411 ], "pop" : 12624, "state" : "PA" } +{ "_id" : "19079", "city" : "SHARON HILL", "loc" : [ -75.269524, 39.903511 ], "pop" : 9893, "state" : "PA" } +{ "_id" : "19081", "city" : "SWARTHMORE", "loc" : [ -75.34742799999999, 39.896724 ], "pop" : 9885, "state" : "PA" } +{ "_id" : "19082", "city" : "UPPER DARBY", "loc" : [ -75.268128, 39.95785 ], "pop" : 36400, "state" : "PA" } +{ "_id" : "19083", "city" : "HAVERTOWN", "loc" : [ -75.310613, 39.97736 ], "pop" : 36702, "state" : "PA" } +{ "_id" : "19085", "city" : "VILLANOVA", "loc" : [ -75.345866, 40.039875 ], "pop" : 7034, "state" : "PA" } +{ "_id" : "19086", "city" : "WALLINGFORD", "loc" : [ -75.372131, 39.887054 ], "pop" : 11005, "state" : "PA" } +{ "_id" : "19087", "city" : "RADNOR", "loc" : [ -75.40416, 40.059554 ], "pop" : 30671, "state" : "PA" } +{ "_id" : "19090", "city" : "WILLOW GROVE NAS", "loc" : [ -75.121297, 40.146725 ], "pop" : 19558, "state" : "PA" } +{ "_id" : "19094", "city" : "WOODLYN", "loc" : [ -75.34630900000001, 39.875993 ], "pop" : 5186, "state" : "PA" } +{ "_id" : "19095", "city" : "WYNCOTE", "loc" : [ -75.152417, 40.086673 ], "pop" : 6164, "state" : "PA" } +{ "_id" : "19096", "city" : "WYNNEWOOD", "loc" : [ -75.27598399999999, 40 ], "pop" : 8285, "state" : "PA" } +{ "_id" : "19102", "city" : "PHILADELPHIA", "loc" : [ -75.16610900000001, 39.948908 ], "pop" : 3623, "state" : "PA" } +{ "_id" : "19103", "city" : "PHILADELPHIA", "loc" : [ -75.174136, 39.951285 ], "pop" : 17665, "state" : "PA" } +{ "_id" : "19104", "city" : "PHILADELPHIA", "loc" : [ -75.202445, 39.959732 ], "pop" : 51295, "state" : "PA" } +{ "_id" : "19106", "city" : "PHILADELPHIA", "loc" : [ -75.147271, 39.94742 ], "pop" : 7043, "state" : "PA" } +{ "_id" : "19107", "city" : "PHILADELPHIA", "loc" : [ -75.159339, 39.94867 ], "pop" : 9634, "state" : "PA" } +{ "_id" : "19111", "city" : "PHILADELPHIA", "loc" : [ -75.08179199999999, 40.059635 ], "pop" : 61416, "state" : "PA" } +{ "_id" : "19112", "city" : "PHILADELPHIA", "loc" : [ -75.178207, 39.889252 ], "pop" : 4516, "state" : "PA" } +{ "_id" : "19113", "city" : "PHILADELPHIA", "loc" : [ -75.27519599999999, 39.864998 ], "pop" : 0, "state" : "PA" } +{ "_id" : "19114", "city" : "PHILADELPHIA", "loc" : [ -74.999032, 40.063356 ], "pop" : 31199, "state" : "PA" } +{ "_id" : "19115", "city" : "PHILADELPHIA", "loc" : [ -75.04103600000001, 40.090286 ], "pop" : 31339, "state" : "PA" } +{ "_id" : "19116", "city" : "PHILADELPHIA", "loc" : [ -75.019803, 40.116599 ], "pop" : 32898, "state" : "PA" } +{ "_id" : "19117", "city" : "ELKINS PARK", "loc" : [ -75.127669, 40.075798 ], "pop" : 12813, "state" : "PA" } +{ "_id" : "19118", "city" : "PHILADELPHIA", "loc" : [ -75.20059999999999, 40.081247 ], "pop" : 19549, "state" : "PA" } +{ "_id" : "19119", "city" : "PHILADELPHIA", "loc" : [ -75.186564, 40.054681 ], "pop" : 29935, "state" : "PA" } +{ "_id" : "19120", "city" : "PHILADELPHIA", "loc" : [ -75.121256, 40.034254 ], "pop" : 63223, "state" : "PA" } +{ "_id" : "19121", "city" : "PHILADELPHIA", "loc" : [ -75.17400499999999, 39.981085 ], "pop" : 46705, "state" : "PA" } +{ "_id" : "19122", "city" : "PHILADELPHIA", "loc" : [ -75.145882, 39.978014 ], "pop" : 21177, "state" : "PA" } +{ "_id" : "19123", "city" : "PHILADELPHIA", "loc" : [ -75.15096800000001, 39.965975 ], "pop" : 12270, "state" : "PA" } +{ "_id" : "19124", "city" : "PHILADELPHIA", "loc" : [ -75.08952600000001, 40.017798 ], "pop" : 60009, "state" : "PA" } +{ "_id" : "19125", "city" : "PHILADELPHIA", "loc" : [ -75.12615599999999, 39.978751 ], "pop" : 24521, "state" : "PA" } +{ "_id" : "19126", "city" : "PHILADELPHIA", "loc" : [ -75.137854, 40.056839 ], "pop" : 22000, "state" : "PA" } +{ "_id" : "19127", "city" : "PHILADELPHIA", "loc" : [ -75.22416699999999, 40.027512 ], "pop" : 6028, "state" : "PA" } +{ "_id" : "19128", "city" : "PHILADELPHIA", "loc" : [ -75.223084, 40.040247 ], "pop" : 36845, "state" : "PA" } +{ "_id" : "19129", "city" : "PHILADELPHIA", "loc" : [ -75.186149, 40.011816 ], "pop" : 13430, "state" : "PA" } +{ "_id" : "19130", "city" : "PHILADELPHIA", "loc" : [ -75.173467, 39.967677 ], "pop" : 21544, "state" : "PA" } +{ "_id" : "19131", "city" : "PHILADELPHIA", "loc" : [ -75.22822600000001, 39.98447 ], "pop" : 48270, "state" : "PA" } +{ "_id" : "19132", "city" : "PHILADELPHIA", "loc" : [ -75.16982, 39.995393 ], "pop" : 49011, "state" : "PA" } +{ "_id" : "19133", "city" : "PHILADELPHIA", "loc" : [ -75.141505, 39.992467 ], "pop" : 32608, "state" : "PA" } +{ "_id" : "19134", "city" : "PHILADELPHIA", "loc" : [ -75.11328399999999, 39.99252 ], "pop" : 58607, "state" : "PA" } +{ "_id" : "19135", "city" : "PHILADELPHIA", "loc" : [ -75.051827, 40.024694 ], "pop" : 32188, "state" : "PA" } +{ "_id" : "19136", "city" : "PHILADELPHIA", "loc" : [ -75.024388, 40.042159 ], "pop" : 40682, "state" : "PA" } +{ "_id" : "19137", "city" : "PHILADELPHIA", "loc" : [ -75.072654, 40.000849 ], "pop" : 8395, "state" : "PA" } +{ "_id" : "19138", "city" : "PHILADELPHIA", "loc" : [ -75.156898, 40.05683 ], "pop" : 37458, "state" : "PA" } +{ "_id" : "19139", "city" : "PHILADELPHIA", "loc" : [ -75.230301, 39.961166 ], "pop" : 48467, "state" : "PA" } +{ "_id" : "19140", "city" : "PHILADELPHIA", "loc" : [ -75.14562599999999, 40.011771 ], "pop" : 62864, "state" : "PA" } +{ "_id" : "19141", "city" : "PHILADELPHIA", "loc" : [ -75.14510900000001, 40.036473 ], "pop" : 38546, "state" : "PA" } +{ "_id" : "19142", "city" : "PHILADELPHIA", "loc" : [ -75.233796, 39.922332 ], "pop" : 29171, "state" : "PA" } +{ "_id" : "19143", "city" : "PHILADELPHIA", "loc" : [ -75.228819, 39.944815 ], "pop" : 80454, "state" : "PA" } +{ "_id" : "19144", "city" : "PHILADELPHIA", "loc" : [ -75.17309899999999, 40.033773 ], "pop" : 46612, "state" : "PA" } +{ "_id" : "19145", "city" : "PHILADELPHIA", "loc" : [ -75.181194, 39.922724 ], "pop" : 52538, "state" : "PA" } +{ "_id" : "19146", "city" : "PHILADELPHIA", "loc" : [ -75.17936400000001, 39.937949 ], "pop" : 38870, "state" : "PA" } +{ "_id" : "19147", "city" : "PHILADELPHIA", "loc" : [ -75.156324, 39.936175 ], "pop" : 34634, "state" : "PA" } +{ "_id" : "19148", "city" : "PHILADELPHIA", "loc" : [ -75.159538, 39.92068 ], "pop" : 49685, "state" : "PA" } +{ "_id" : "19149", "city" : "PHILADELPHIA", "loc" : [ -75.066374, 40.036915 ], "pop" : 47535, "state" : "PA" } +{ "_id" : "19150", "city" : "PHILADELPHIA", "loc" : [ -75.170621, 40.07262 ], "pop" : 27609, "state" : "PA" } +{ "_id" : "19151", "city" : "PHILADELPHIA", "loc" : [ -75.254492, 39.977199 ], "pop" : 36265, "state" : "PA" } +{ "_id" : "19152", "city" : "PHILADELPHIA", "loc" : [ -75.047079, 40.060571 ], "pop" : 31225, "state" : "PA" } +{ "_id" : "19153", "city" : "PHILADELPHIA", "loc" : [ -75.24443100000001, 39.905512 ], "pop" : 13375, "state" : "PA" } +{ "_id" : "19154", "city" : "PHILADELPHIA", "loc" : [ -74.97805200000001, 40.089738 ], "pop" : 38023, "state" : "PA" } +{ "_id" : "19301", "city" : "PAOLI", "loc" : [ -75.482702, 40.04259 ], "pop" : 6969, "state" : "PA" } +{ "_id" : "19310", "city" : "ATGLEN", "loc" : [ -75.970343, 39.945782 ], "pop" : 2318, "state" : "PA" } +{ "_id" : "19311", "city" : "AVONDALE", "loc" : [ -75.768694, 39.821904 ], "pop" : 4161, "state" : "PA" } +{ "_id" : "19312", "city" : "BERWYN", "loc" : [ -75.447457, 40.041184 ], "pop" : 9482, "state" : "PA" } +{ "_id" : "19317", "city" : "CHADDS FORD", "loc" : [ -75.588515, 39.864769 ], "pop" : 4522, "state" : "PA" } +{ "_id" : "19319", "city" : "CHEYNEY", "loc" : [ -75.548738, 39.917496 ], "pop" : 198, "state" : "PA" } +{ "_id" : "19320", "city" : "COATESVILLE", "loc" : [ -75.825299, 39.984313 ], "pop" : 39595, "state" : "PA" } +{ "_id" : "19330", "city" : "COCHRANVILLE", "loc" : [ -75.921381, 39.875686 ], "pop" : 3425, "state" : "PA" } +{ "_id" : "19333", "city" : "DEVON", "loc" : [ -75.422691, 40.045181 ], "pop" : 6290, "state" : "PA" } +{ "_id" : "19335", "city" : "DOWNINGTOWN", "loc" : [ -75.718261, 40.016078 ], "pop" : 35056, "state" : "PA" } +{ "_id" : "19341", "city" : "EXTON", "loc" : [ -75.643196, 40.046817 ], "pop" : 12495, "state" : "PA" } +{ "_id" : "19342", "city" : "GLEN MILLS", "loc" : [ -75.50487200000001, 39.901515 ], "pop" : 11632, "state" : "PA" } +{ "_id" : "19343", "city" : "GLENMOORE", "loc" : [ -75.771103, 40.084602 ], "pop" : 6959, "state" : "PA" } +{ "_id" : "19344", "city" : "HONEY BROOK", "loc" : [ -75.88432, 40.083227 ], "pop" : 8615, "state" : "PA" } +{ "_id" : "19346", "city" : "KELTON", "loc" : [ -75.875827, 39.795501 ], "pop" : 816, "state" : "PA" } +{ "_id" : "19348", "city" : "KENNETT SQUARE", "loc" : [ -75.70001999999999, 39.855033 ], "pop" : 16663, "state" : "PA" } +{ "_id" : "19350", "city" : "LANDENBERG", "loc" : [ -75.78070700000001, 39.769558 ], "pop" : 4787, "state" : "PA" } +{ "_id" : "19352", "city" : "LINCOLN UNIVERSI", "loc" : [ -75.881784, 39.780905 ], "pop" : 6834, "state" : "PA" } +{ "_id" : "19355", "city" : "FRAZER", "loc" : [ -75.53302100000001, 40.037123 ], "pop" : 21709, "state" : "PA" } +{ "_id" : "19362", "city" : "NOTTINGHAM", "loc" : [ -76.035551, 39.74411 ], "pop" : 2814, "state" : "PA" } +{ "_id" : "19363", "city" : "OXFORD", "loc" : [ -75.981522, 39.782704 ], "pop" : 11545, "state" : "PA" } +{ "_id" : "19365", "city" : "PARKESBURG", "loc" : [ -75.926041, 39.965388 ], "pop" : 5420, "state" : "PA" } +{ "_id" : "19372", "city" : "THORNDALE", "loc" : [ -75.76285900000001, 40.000127 ], "pop" : 1712, "state" : "PA" } +{ "_id" : "19373", "city" : "THORNTON", "loc" : [ -75.531344, 39.904127 ], "pop" : 2305, "state" : "PA" } +{ "_id" : "19374", "city" : "TOUGHKENAMON", "loc" : [ -75.782533, 39.825117 ], "pop" : 1045, "state" : "PA" } +{ "_id" : "19380", "city" : "WEST CHESTER", "loc" : [ -75.596231, 39.984458 ], "pop" : 40656, "state" : "PA" } +{ "_id" : "19382", "city" : "WEST CHESTER", "loc" : [ -75.58819699999999, 39.944081 ], "pop" : 44164, "state" : "PA" } +{ "_id" : "19390", "city" : "WEST GROVE", "loc" : [ -75.837374, 39.825314 ], "pop" : 7248, "state" : "PA" } +{ "_id" : "19401", "city" : "NORRISTOWN", "loc" : [ -75.33044599999999, 40.124464 ], "pop" : 46735, "state" : "PA" } +{ "_id" : "19403", "city" : "EAGLEVILLE", "loc" : [ -75.38467199999999, 40.14335 ], "pop" : 39184, "state" : "PA" } +{ "_id" : "19405", "city" : "BRIDGEPORT", "loc" : [ -75.340234, 40.103042 ], "pop" : 5163, "state" : "PA" } +{ "_id" : "19406", "city" : "KING OF PRUSSIA", "loc" : [ -75.373706, 40.095581 ], "pop" : 21049, "state" : "PA" } +{ "_id" : "19422", "city" : "PENLLYN", "loc" : [ -75.279656, 40.15939 ], "pop" : 16645, "state" : "PA" } +{ "_id" : "19425", "city" : "CHESTER SPRINGS", "loc" : [ -75.639769, 40.097781 ], "pop" : 4413, "state" : "PA" } +{ "_id" : "19426", "city" : "COLLEGEVILLE", "loc" : [ -75.448762, 40.189277 ], "pop" : 16453, "state" : "PA" } +{ "_id" : "19428", "city" : "WEST CONSHOHOCKE", "loc" : [ -75.301332, 40.079848 ], "pop" : 15924, "state" : "PA" } +{ "_id" : "19435", "city" : "FREDERICK", "loc" : [ -75.531975, 40.299924 ], "pop" : 728, "state" : "PA" } +{ "_id" : "19436", "city" : "GWYNEDD", "loc" : [ -75.25074600000001, 40.202089 ], "pop" : 540, "state" : "PA" } +{ "_id" : "19438", "city" : "HARLEYSVILLE", "loc" : [ -75.388335, 40.265922 ], "pop" : 16027, "state" : "PA" } +{ "_id" : "19440", "city" : "HATFIELD", "loc" : [ -75.297507, 40.277826 ], "pop" : 16686, "state" : "PA" } +{ "_id" : "19444", "city" : "LAFAYETTE HILL", "loc" : [ -75.260052, 40.089597 ], "pop" : 8312, "state" : "PA" } +{ "_id" : "19446", "city" : "LANSDALE", "loc" : [ -75.295512, 40.237776 ], "pop" : 41034, "state" : "PA" } +{ "_id" : "19453", "city" : "MONT CLARE", "loc" : [ -75.499931, 40.13642 ], "pop" : 1749, "state" : "PA" } +{ "_id" : "19454", "city" : "NORTH WALES", "loc" : [ -75.256483, 40.216593 ], "pop" : 14886, "state" : "PA" } +{ "_id" : "19460", "city" : "PHOENIXVILLE", "loc" : [ -75.527192, 40.126704 ], "pop" : 30460, "state" : "PA" } +{ "_id" : "19462", "city" : "PLYMOUTH MEETING", "loc" : [ -75.27955900000001, 40.107735 ], "pop" : 5206, "state" : "PA" } +{ "_id" : "19464", "city" : "SANATOGA", "loc" : [ -75.639256, 40.242989 ], "pop" : 53017, "state" : "PA" } +{ "_id" : "19468", "city" : "LIMERICK", "loc" : [ -75.530548, 40.19286 ], "pop" : 13825, "state" : "PA" } +{ "_id" : "19473", "city" : "SCHWENKSVILLE", "loc" : [ -75.460155, 40.247087 ], "pop" : 13139, "state" : "PA" } +{ "_id" : "19475", "city" : "SPRING CITY", "loc" : [ -75.56968999999999, 40.176477 ], "pop" : 7988, "state" : "PA" } +{ "_id" : "19477", "city" : "SPRING HOUSE", "loc" : [ -75.23750099999999, 40.186954 ], "pop" : 2129, "state" : "PA" } +{ "_id" : "19492", "city" : "ZIEGLERSVILLE", "loc" : [ -75.485462, 40.281673 ], "pop" : 290, "state" : "PA" } +{ "_id" : "19501", "city" : "ADAMSTOWN", "loc" : [ -76.05654199999999, 40.242992 ], "pop" : 1108, "state" : "PA" } +{ "_id" : "19503", "city" : "BALLY", "loc" : [ -75.58748300000001, 40.400557 ], "pop" : 973, "state" : "PA" } +{ "_id" : "19504", "city" : "BARTO", "loc" : [ -75.574889, 40.381501 ], "pop" : 2509, "state" : "PA" } +{ "_id" : "19505", "city" : "BECHTELSVILLE", "loc" : [ -75.62570100000001, 40.379454 ], "pop" : 3640, "state" : "PA" } +{ "_id" : "19506", "city" : "BERNVILLE", "loc" : [ -76.12473199999999, 40.455061 ], "pop" : 6245, "state" : "PA" } +{ "_id" : "19507", "city" : "BETHEL", "loc" : [ -76.274209, 40.480834 ], "pop" : 3523, "state" : "PA" } +{ "_id" : "19508", "city" : "BIRDSBORO", "loc" : [ -75.834373, 40.256304 ], "pop" : 15266, "state" : "PA" } +{ "_id" : "19510", "city" : "BLANDON", "loc" : [ -75.883681, 40.443492 ], "pop" : 2663, "state" : "PA" } +{ "_id" : "19512", "city" : "BOYERTOWN", "loc" : [ -75.66036800000001, 40.333905 ], "pop" : 17139, "state" : "PA" } +{ "_id" : "19518", "city" : "DOUGLASSVILLE", "loc" : [ -75.739673, 40.270876 ], "pop" : 7852, "state" : "PA" } +{ "_id" : "19520", "city" : "ELVERSON", "loc" : [ -75.786563, 40.156781 ], "pop" : 4592, "state" : "PA" } +{ "_id" : "19522", "city" : "EVANSVILLE", "loc" : [ -75.81440000000001, 40.446766 ], "pop" : 11505, "state" : "PA" } +{ "_id" : "19525", "city" : "GILBERTSVILLE", "loc" : [ -75.595296, 40.305941 ], "pop" : 7250, "state" : "PA" } +{ "_id" : "19526", "city" : "HAMBURG", "loc" : [ -75.98736100000001, 40.548799 ], "pop" : 9959, "state" : "PA" } +{ "_id" : "19529", "city" : "KEMPTON", "loc" : [ -75.85127, 40.632794 ], "pop" : 2387, "state" : "PA" } +{ "_id" : "19530", "city" : "KUTZTOWN", "loc" : [ -75.777395, 40.521354 ], "pop" : 13345, "state" : "PA" } +{ "_id" : "19533", "city" : "LEESPORT", "loc" : [ -75.994421, 40.415216 ], "pop" : 6199, "state" : "PA" } +{ "_id" : "19534", "city" : "LENHARTSVILLE", "loc" : [ -75.850002, 40.575284 ], "pop" : 1840, "state" : "PA" } +{ "_id" : "19539", "city" : "MERTZTOWN", "loc" : [ -75.687202, 40.499183 ], "pop" : 4058, "state" : "PA" } +{ "_id" : "19540", "city" : "MOHNTON", "loc" : [ -75.98332000000001, 40.258442 ], "pop" : 8402, "state" : "PA" } +{ "_id" : "19541", "city" : "MOHRSVILLE", "loc" : [ -76.012491, 40.478307 ], "pop" : 3473, "state" : "PA" } +{ "_id" : "19543", "city" : "MORGANTOWN", "loc" : [ -75.89980199999999, 40.155248 ], "pop" : 2121, "state" : "PA" } +{ "_id" : "19547", "city" : "OLEY", "loc" : [ -75.77057499999999, 40.383312 ], "pop" : 3949, "state" : "PA" } +{ "_id" : "19549", "city" : "PORT CLINTON", "loc" : [ -76.026652, 40.581787 ], "pop" : 328, "state" : "PA" } +{ "_id" : "19551", "city" : "ROBESONIA", "loc" : [ -76.13659, 40.355281 ], "pop" : 5310, "state" : "PA" } +{ "_id" : "19555", "city" : "SHOEMAKERSVILLE", "loc" : [ -75.960313, 40.495495 ], "pop" : 3947, "state" : "PA" } +{ "_id" : "19560", "city" : "TEMPLE", "loc" : [ -75.904582, 40.402504 ], "pop" : 7503, "state" : "PA" } +{ "_id" : "19562", "city" : "TOPTON", "loc" : [ -75.701528, 40.502941 ], "pop" : 1987, "state" : "PA" } +{ "_id" : "19565", "city" : "WERNERSVILLE", "loc" : [ -76.09014000000001, 40.329289 ], "pop" : 5056, "state" : "PA" } +{ "_id" : "19567", "city" : "WOMELSDORF", "loc" : [ -76.198511, 40.374333 ], "pop" : 4034, "state" : "PA" } +{ "_id" : "19601", "city" : "READING", "loc" : [ -75.935132, 40.346621 ], "pop" : 29968, "state" : "PA" } +{ "_id" : "19602", "city" : "READING", "loc" : [ -75.919229, 40.330604 ], "pop" : 16303, "state" : "PA" } +{ "_id" : "19604", "city" : "READING", "loc" : [ -75.91426199999999, 40.350721 ], "pop" : 22987, "state" : "PA" } +{ "_id" : "19605", "city" : "READING", "loc" : [ -75.93276899999999, 40.38859 ], "pop" : 13878, "state" : "PA" } +{ "_id" : "19606", "city" : "MOUNT PENN", "loc" : [ -75.868178, 40.325109 ], "pop" : 27732, "state" : "PA" } +{ "_id" : "19607", "city" : "SHILLINGTON", "loc" : [ -75.953103, 40.299696 ], "pop" : 19281, "state" : "PA" } +{ "_id" : "19608", "city" : "SINKING SPRING", "loc" : [ -76.024086, 40.31449 ], "pop" : 13037, "state" : "PA" } +{ "_id" : "19609", "city" : "WEST LAWN", "loc" : [ -75.995347, 40.325778 ], "pop" : 9845, "state" : "PA" } +{ "_id" : "19610", "city" : "WYOMISSING", "loc" : [ -75.976382, 40.333478 ], "pop" : 12394, "state" : "PA" } +{ "_id" : "19611", "city" : "READING", "loc" : [ -75.944188, 40.324989 ], "pop" : 10763, "state" : "PA" } +{ "_id" : "19701", "city" : "BEAR", "loc" : [ -75.674729, 39.610187 ], "pop" : 21384, "state" : "DE" } +{ "_id" : "19702", "city" : "NEWARK", "loc" : [ -75.69933899999999, 39.634869 ], "pop" : 30402, "state" : "DE" } +{ "_id" : "19703", "city" : "CLAYMONT", "loc" : [ -75.46494, 39.804432 ], "pop" : 16699, "state" : "DE" } +{ "_id" : "19707", "city" : "HOCKESSIN", "loc" : [ -75.688873, 39.77604 ], "pop" : 13149, "state" : "DE" } +{ "_id" : "19709", "city" : "MIDDLETOWN", "loc" : [ -75.683183, 39.481535 ], "pop" : 10243, "state" : "DE" } +{ "_id" : "19711", "city" : "NEWARK", "loc" : [ -75.737534, 39.701129 ], "pop" : 50573, "state" : "DE" } +{ "_id" : "19713", "city" : "NEWARK", "loc" : [ -75.715101, 39.669881 ], "pop" : 30699, "state" : "DE" } +{ "_id" : "19720", "city" : "MANOR", "loc" : [ -75.589938, 39.67703 ], "pop" : 46906, "state" : "DE" } +{ "_id" : "19734", "city" : "TOWNSEND", "loc" : [ -75.683368, 39.381882 ], "pop" : 4512, "state" : "DE" } +{ "_id" : "19801", "city" : "WILMINGTON", "loc" : [ -75.54965799999999, 39.737752 ], "pop" : 15151, "state" : "DE" } +{ "_id" : "19802", "city" : "WILMINGTON", "loc" : [ -75.534041, 39.75638 ], "pop" : 27411, "state" : "DE" } +{ "_id" : "19803", "city" : "TALLEYVILLE", "loc" : [ -75.531076, 39.793236 ], "pop" : 20901, "state" : "DE" } +{ "_id" : "19804", "city" : "NEWPORT", "loc" : [ -75.612815, 39.720854 ], "pop" : 18306, "state" : "DE" } +{ "_id" : "19805", "city" : "WILMINGTON", "loc" : [ -75.582724, 39.743375 ], "pop" : 40087, "state" : "DE" } +{ "_id" : "19806", "city" : "WILMINGTON", "loc" : [ -75.563503, 39.757076 ], "pop" : 9645, "state" : "DE" } +{ "_id" : "19807", "city" : "GREENVILLE", "loc" : [ -75.60720499999999, 39.782206 ], "pop" : 7176, "state" : "DE" } +{ "_id" : "19808", "city" : "MARSHALLTON", "loc" : [ -75.66389100000001, 39.734737 ], "pop" : 34260, "state" : "DE" } +{ "_id" : "19809", "city" : "EDGEMOOR", "loc" : [ -75.494592, 39.771913 ], "pop" : 14285, "state" : "DE" } +{ "_id" : "19810", "city" : "EDGEMOOR", "loc" : [ -75.505999, 39.819377 ], "pop" : 26334, "state" : "DE" } +{ "_id" : "19901", "city" : "DOVER", "loc" : [ -75.535983, 39.156639 ], "pop" : 46005, "state" : "DE" } +{ "_id" : "19902", "city" : "DOVER AFB", "loc" : [ -75.478966, 39.120246 ], "pop" : 5500, "state" : "DE" } +{ "_id" : "19930", "city" : "BETHANY BEACH", "loc" : [ -75.067396, 38.531009 ], "pop" : 769, "state" : "DE" } +{ "_id" : "19931", "city" : "BETHEL", "loc" : [ -75.624298, 38.568517 ], "pop" : 108, "state" : "DE" } +{ "_id" : "19933", "city" : "BRIDGEVILLE", "loc" : [ -75.608768, 38.736628 ], "pop" : 4353, "state" : "DE" } +{ "_id" : "19934", "city" : "CAMDEN WYOMING", "loc" : [ -75.596559, 39.099099 ], "pop" : 8877, "state" : "DE" } +{ "_id" : "19938", "city" : "CLAYTON", "loc" : [ -75.690361, 39.256395 ], "pop" : 4906, "state" : "DE" } +{ "_id" : "19939", "city" : "DAGSBORO", "loc" : [ -75.21133, 38.559559 ], "pop" : 2593, "state" : "DE" } +{ "_id" : "19940", "city" : "DELMAR", "loc" : [ -75.57588699999999, 38.476955 ], "pop" : 4257, "state" : "DE" } +{ "_id" : "19941", "city" : "ELLENDALE", "loc" : [ -75.40558799999999, 38.805737 ], "pop" : 2445, "state" : "DE" } +{ "_id" : "19943", "city" : "FELTON", "loc" : [ -75.58290599999999, 39.022538 ], "pop" : 7282, "state" : "DE" } +{ "_id" : "19945", "city" : "FRANKFORD", "loc" : [ -75.200633, 38.51767 ], "pop" : 5500, "state" : "DE" } +{ "_id" : "19946", "city" : "FREDERICA", "loc" : [ -75.454458, 39.034188 ], "pop" : 2725, "state" : "DE" } +{ "_id" : "19947", "city" : "GEORGETOWN", "loc" : [ -75.393198, 38.679006 ], "pop" : 11371, "state" : "DE" } +{ "_id" : "19950", "city" : "GREENWOOD", "loc" : [ -75.593547, 38.817519 ], "pop" : 4279, "state" : "DE" } +{ "_id" : "19951", "city" : "HARBESON", "loc" : [ -75.22362099999999, 38.672294 ], "pop" : 598, "state" : "DE" } +{ "_id" : "19952", "city" : "HARRINGTON", "loc" : [ -75.58426799999999, 38.924031 ], "pop" : 7972, "state" : "DE" } +{ "_id" : "19953", "city" : "HARTLY", "loc" : [ -75.693476, 39.15421 ], "pop" : 3558, "state" : "DE" } +{ "_id" : "19954", "city" : "HOUSTON", "loc" : [ -75.506354, 38.91143 ], "pop" : 1776, "state" : "DE" } +{ "_id" : "19956", "city" : "LAUREL", "loc" : [ -75.563052, 38.553695 ], "pop" : 9283, "state" : "DE" } +{ "_id" : "19958", "city" : "LEWES", "loc" : [ -75.174702, 38.738149 ], "pop" : 9503, "state" : "DE" } +{ "_id" : "19960", "city" : "LINCOLN", "loc" : [ -75.399961, 38.86128 ], "pop" : 4435, "state" : "DE" } +{ "_id" : "19962", "city" : "MAGNOLIA", "loc" : [ -75.508321, 39.07353 ], "pop" : 4567, "state" : "DE" } +{ "_id" : "19963", "city" : "MILFORD", "loc" : [ -75.429877, 38.921801 ], "pop" : 12187, "state" : "DE" } +{ "_id" : "19964", "city" : "MARYDEL", "loc" : [ -75.728661, 39.099794 ], "pop" : 975, "state" : "DE" } +{ "_id" : "19966", "city" : "LONG NECK", "loc" : [ -75.25554700000001, 38.593436 ], "pop" : 11962, "state" : "DE" } +{ "_id" : "19967", "city" : "MILLVILLE", "loc" : [ -75.10776199999999, 38.558946 ], "pop" : 623, "state" : "DE" } +{ "_id" : "19968", "city" : "MILTON", "loc" : [ -75.295298, 38.768687 ], "pop" : 4656, "state" : "DE" } +{ "_id" : "19970", "city" : "MILLVILLE", "loc" : [ -75.096518, 38.555528 ], "pop" : 1532, "state" : "DE" } +{ "_id" : "19971", "city" : "DEWEY BEACH", "loc" : [ -75.10734600000001, 38.714715 ], "pop" : 6249, "state" : "DE" } +{ "_id" : "19973", "city" : "SEAFORD", "loc" : [ -75.604122, 38.640358 ], "pop" : 18404, "state" : "DE" } +{ "_id" : "19975", "city" : "SELBYVILLE", "loc" : [ -75.157325, 38.465357 ], "pop" : 4478, "state" : "DE" } +{ "_id" : "19977", "city" : "SMYRNA", "loc" : [ -75.600832, 39.293379 ], "pop" : 14164, "state" : "DE" } +{ "_id" : "19979", "city" : "VIOLA", "loc" : [ -75.572605, 39.041872 ], "pop" : 153, "state" : "DE" } +{ "_id" : "20001", "city" : "WASHINGTON", "loc" : [ -77.017691, 38.912217 ], "pop" : 34745, "state" : "DC" } +{ "_id" : "20002", "city" : "WASHINGTON", "loc" : [ -76.990055, 38.902365 ], "pop" : 56756, "state" : "DC" } +{ "_id" : "20003", "city" : "WASHINGTON", "loc" : [ -76.98953899999999, 38.882941 ], "pop" : 24818, "state" : "DC" } +{ "_id" : "20004", "city" : "WASHINGTON", "loc" : [ -77.026303, 38.892955 ], "pop" : 11, "state" : "DC" } +{ "_id" : "20005", "city" : "WASHINGTON", "loc" : [ -77.03123600000001, 38.906731 ], "pop" : 9862, "state" : "DC" } +{ "_id" : "20006", "city" : "WASHINGTON", "loc" : [ -77.044701, 38.896444 ], "pop" : 2317, "state" : "DC" } +{ "_id" : "20007", "city" : "WASHINGTON", "loc" : [ -77.07404200000001, 38.914365 ], "pop" : 27076, "state" : "DC" } +{ "_id" : "20008", "city" : "WASHINGTON", "loc" : [ -77.05993599999999, 38.936282 ], "pop" : 26736, "state" : "DC" } +{ "_id" : "20009", "city" : "WASHINGTON", "loc" : [ -77.037504, 38.920202 ], "pop" : 47086, "state" : "DC" } +{ "_id" : "20010", "city" : "WASHINGTON", "loc" : [ -77.032183, 38.93272 ], "pop" : 28849, "state" : "DC" } +{ "_id" : "20011", "city" : "WASHINGTON", "loc" : [ -77.020251, 38.951786 ], "pop" : 62924, "state" : "DC" } +{ "_id" : "20012", "city" : "WASHINGTON", "loc" : [ -77.028248, 38.975712 ], "pop" : 15081, "state" : "DC" } +{ "_id" : "20015", "city" : "WASHINGTON", "loc" : [ -77.067961, 38.965768 ], "pop" : 14569, "state" : "DC" } +{ "_id" : "20016", "city" : "WASHINGTON", "loc" : [ -77.086037, 38.938117 ], "pop" : 31042, "state" : "DC" } +{ "_id" : "20017", "city" : "WASHINGTON", "loc" : [ -76.994038, 38.936723 ], "pop" : 19548, "state" : "DC" } +{ "_id" : "20018", "city" : "WASHINGTON", "loc" : [ -76.976159, 38.927724 ], "pop" : 18298, "state" : "DC" } +{ "_id" : "20019", "city" : "WASHINGTON", "loc" : [ -76.93758800000001, 38.890237 ], "pop" : 59492, "state" : "DC" } +{ "_id" : "20020", "city" : "WASHINGTON", "loc" : [ -76.974187, 38.860039 ], "pop" : 54339, "state" : "DC" } +{ "_id" : "20024", "city" : "WASHINGTON", "loc" : [ -77.01602800000001, 38.875939 ], "pop" : 11562, "state" : "DC" } +{ "_id" : "20032", "city" : "WASHINGTON", "loc" : [ -76.999549, 38.833843 ], "pop" : 40265, "state" : "DC" } +{ "_id" : "20036", "city" : "WASHINGTON", "loc" : [ -77.041434, 38.908704 ], "pop" : 4146, "state" : "DC" } +{ "_id" : "20037", "city" : "WASHINGTON", "loc" : [ -77.050448, 38.901446 ], "pop" : 11046, "state" : "DC" } +{ "_id" : "20301", "city" : "PENTAGON", "loc" : [ -77.038196, 38.891019 ], "pop" : 21, "state" : "DC" } +{ "_id" : "20331", "city" : "ANDREWS AFB", "loc" : [ -76.886695, 38.800324 ], "pop" : 10228, "state" : "MD" } +{ "_id" : "20336", "city" : "WASHINGTON", "loc" : [ -77.014827, 38.839473 ], "pop" : 6311, "state" : "DC" } +{ "_id" : "20601", "city" : "WALDORF", "loc" : [ -76.877787, 38.637065 ], "pop" : 18548, "state" : "MD" } +{ "_id" : "20602", "city" : "SAINT CHARLES", "loc" : [ -76.903414, 38.601545 ], "pop" : 20663, "state" : "MD" } +{ "_id" : "20603", "city" : "SAINT CHARLES", "loc" : [ -76.96115399999999, 38.624929 ], "pop" : 11184, "state" : "MD" } +{ "_id" : "20606", "city" : "ABELL", "loc" : [ -76.74410399999999, 38.249554 ], "pop" : 601, "state" : "MD" } +{ "_id" : "20607", "city" : "ACCOKEEK", "loc" : [ -77.016217, 38.671992 ], "pop" : 4043, "state" : "MD" } +{ "_id" : "20608", "city" : "AQUASCO", "loc" : [ -76.714947, 38.582496 ], "pop" : 939, "state" : "MD" } +{ "_id" : "20609", "city" : "AVENUE", "loc" : [ -76.74655300000001, 38.282624 ], "pop" : 699, "state" : "MD" } +{ "_id" : "20611", "city" : "BEL ALTON", "loc" : [ -76.97887299999999, 38.473141 ], "pop" : 582, "state" : "MD" } +{ "_id" : "20613", "city" : "BRANDYWINE", "loc" : [ -76.832033, 38.692203 ], "pop" : 7627, "state" : "MD" } +{ "_id" : "20615", "city" : "BROOMES ISLAND", "loc" : [ -76.547763, 38.417963 ], "pop" : 404, "state" : "MD" } +{ "_id" : "20616", "city" : "BRYANS ROAD", "loc" : [ -77.076589, 38.641468 ], "pop" : 3792, "state" : "MD" } +{ "_id" : "20617", "city" : "BRYANTOWN", "loc" : [ -76.84653900000001, 38.542638 ], "pop" : 722, "state" : "MD" } +{ "_id" : "20618", "city" : "BUSHWOOD", "loc" : [ -76.792863, 38.284439 ], "pop" : 934, "state" : "MD" } +{ "_id" : "20619", "city" : "CALIFORNIA", "loc" : [ -76.531228, 38.300648 ], "pop" : 5485, "state" : "MD" } +{ "_id" : "20620", "city" : "CALLAWAY", "loc" : [ -76.52096299999999, 38.227521 ], "pop" : 1394, "state" : "MD" } +{ "_id" : "20621", "city" : "MADDOX", "loc" : [ -76.782343, 38.333197 ], "pop" : 1240, "state" : "MD" } +{ "_id" : "20622", "city" : "CHARLOTTE HALL", "loc" : [ -76.803792, 38.474977 ], "pop" : 3454, "state" : "MD" } +{ "_id" : "20623", "city" : "CHELTENHAM", "loc" : [ -76.83685199999999, 38.753094 ], "pop" : 712, "state" : "MD" } +{ "_id" : "20624", "city" : "CLEMENTS", "loc" : [ -76.72641900000001, 38.340716 ], "pop" : 303, "state" : "MD" } +{ "_id" : "20626", "city" : "COLTONS POINT", "loc" : [ -76.76464900000001, 38.236963 ], "pop" : 694, "state" : "MD" } +{ "_id" : "20628", "city" : "DAMERON", "loc" : [ -76.357474, 38.153271 ], "pop" : 330, "state" : "MD" } +{ "_id" : "20630", "city" : "DRAYDEN", "loc" : [ -76.473095, 38.171875 ], "pop" : 413, "state" : "MD" } +{ "_id" : "20632", "city" : "FAULKNER", "loc" : [ -76.972937, 38.438221 ], "pop" : 459, "state" : "MD" } +{ "_id" : "20634", "city" : "GREAT MILLS", "loc" : [ -76.49536500000001, 38.267431 ], "pop" : 4203, "state" : "MD" } +{ "_id" : "20636", "city" : "HOLLYWOOD", "loc" : [ -76.56264400000001, 38.352356 ], "pop" : 6785, "state" : "MD" } +{ "_id" : "20637", "city" : "HUGHESVILLE", "loc" : [ -76.781677, 38.520712 ], "pop" : 4078, "state" : "MD" } +{ "_id" : "20639", "city" : "HUNTINGTOWN", "loc" : [ -76.600268, 38.609453 ], "pop" : 8290, "state" : "MD" } +{ "_id" : "20640", "city" : "PISGAH", "loc" : [ -77.148357, 38.588855 ], "pop" : 8227, "state" : "MD" } +{ "_id" : "20645", "city" : "ISSUE", "loc" : [ -76.867527, 38.304327 ], "pop" : 87, "state" : "MD" } +{ "_id" : "20646", "city" : "LA PLATA", "loc" : [ -76.986498, 38.525673 ], "pop" : 16900, "state" : "MD" } +{ "_id" : "20650", "city" : "LEONARDTOWN", "loc" : [ -76.638037, 38.277425 ], "pop" : 8922, "state" : "MD" } +{ "_id" : "20653", "city" : "LEXINGTON PARK", "loc" : [ -76.45292999999999, 38.249452 ], "pop" : 17082, "state" : "MD" } +{ "_id" : "20656", "city" : "LOVEVILLE", "loc" : [ -76.67708, 38.347438 ], "pop" : 248, "state" : "MD" } +{ "_id" : "20657", "city" : "LUSBY", "loc" : [ -76.43464, 38.366128 ], "pop" : 8990, "state" : "MD" } +{ "_id" : "20658", "city" : "RISON", "loc" : [ -77.156329, 38.557335 ], "pop" : 1826, "state" : "MD" } +{ "_id" : "20659", "city" : "MECHANICSVILLE", "loc" : [ -76.725399, 38.429319 ], "pop" : 17326, "state" : "MD" } +{ "_id" : "20662", "city" : "NANJEMOY", "loc" : [ -77.198296, 38.446161 ], "pop" : 2793, "state" : "MD" } +{ "_id" : "20664", "city" : "NEWBURG", "loc" : [ -76.91749900000001, 38.329782 ], "pop" : 3612, "state" : "MD" } +{ "_id" : "20667", "city" : "PARK HALL", "loc" : [ -76.44152200000001, 38.224364 ], "pop" : 224, "state" : "MD" } +{ "_id" : "20670", "city" : "PATUXENT RIVER", "loc" : [ -76.438061, 38.279089 ], "pop" : 3015, "state" : "MD" } +{ "_id" : "20674", "city" : "PINEY POINT", "loc" : [ -76.504716, 38.139667 ], "pop" : 1114, "state" : "MD" } +{ "_id" : "20675", "city" : "POMFRET", "loc" : [ -77.009314, 38.585541 ], "pop" : 1410, "state" : "MD" } +{ "_id" : "20676", "city" : "PORT REPUBLIC", "loc" : [ -76.534865, 38.495237 ], "pop" : 2647, "state" : "MD" } +{ "_id" : "20677", "city" : "PORT TOBACCO", "loc" : [ -77.041856, 38.499353 ], "pop" : 1149, "state" : "MD" } +{ "_id" : "20678", "city" : "PRINCE FREDERICK", "loc" : [ -76.595495, 38.533629 ], "pop" : 6802, "state" : "MD" } +{ "_id" : "20680", "city" : "RIDGE", "loc" : [ -76.371071, 38.116883 ], "pop" : 1245, "state" : "MD" } +{ "_id" : "20684", "city" : "SAINT INIGOES", "loc" : [ -76.408328, 38.14406 ], "pop" : 583, "state" : "MD" } +{ "_id" : "20685", "city" : "SAINT LEONARD", "loc" : [ -76.511017, 38.45013 ], "pop" : 3895, "state" : "MD" } +{ "_id" : "20687", "city" : "SCOTLAND", "loc" : [ -76.347684, 38.082772 ], "pop" : 356, "state" : "MD" } +{ "_id" : "20688", "city" : "SOLOMONS", "loc" : [ -76.45888600000001, 38.334067 ], "pop" : 661, "state" : "MD" } +{ "_id" : "20689", "city" : "SUNDERLAND", "loc" : [ -76.576697, 38.648968 ], "pop" : 1664, "state" : "MD" } +{ "_id" : "20690", "city" : "TALL TIMBERS", "loc" : [ -76.539897, 38.165318 ], "pop" : 255, "state" : "MD" } +{ "_id" : "20692", "city" : "VALLEY LEE", "loc" : [ -76.508689, 38.189937 ], "pop" : 667, "state" : "MD" } +{ "_id" : "20693", "city" : "WELCOME", "loc" : [ -77.095006, 38.467206 ], "pop" : 334, "state" : "MD" } +{ "_id" : "20695", "city" : "WHITE PLAINS", "loc" : [ -76.980233, 38.594848 ], "pop" : 3721, "state" : "MD" } +{ "_id" : "20701", "city" : "ANNAPOLIS JUNCTI", "loc" : [ -76.798068, 39.130983 ], "pop" : 32, "state" : "MD" } +{ "_id" : "20705", "city" : "BELTSVILLE", "loc" : [ -76.92416799999999, 39.045524 ], "pop" : 18146, "state" : "MD" } +{ "_id" : "20706", "city" : "LANHAM", "loc" : [ -76.85509999999999, 38.967537 ], "pop" : 33471, "state" : "MD" } +{ "_id" : "20707", "city" : "LAUREL", "loc" : [ -76.87204300000001, 39.107687 ], "pop" : 31065, "state" : "MD" } +{ "_id" : "20708", "city" : "MONTPELIER", "loc" : [ -76.847725, 39.068376 ], "pop" : 23523, "state" : "MD" } +{ "_id" : "20710", "city" : "BLADENSBURG", "loc" : [ -76.920327, 38.945215 ], "pop" : 7716, "state" : "MD" } +{ "_id" : "20711", "city" : "LOTHIAN", "loc" : [ -76.66280999999999, 38.802933 ], "pop" : 5081, "state" : "MD" } +{ "_id" : "20712", "city" : "MOUNT RAINIER", "loc" : [ -76.965152, 38.943072 ], "pop" : 8422, "state" : "MD" } +{ "_id" : "20714", "city" : "NORTH BEACH", "loc" : [ -76.53670099999999, 38.711884 ], "pop" : 2292, "state" : "MD" } +{ "_id" : "20715", "city" : "BOWIE", "loc" : [ -76.743497, 38.979696 ], "pop" : 25296, "state" : "MD" } +{ "_id" : "20716", "city" : "MITCHELLVILLE", "loc" : [ -76.731979, 38.927482 ], "pop" : 13580, "state" : "MD" } +{ "_id" : "20720", "city" : "BOWIE", "loc" : [ -76.789526, 38.973733 ], "pop" : 8239, "state" : "MD" } +{ "_id" : "20721", "city" : "MITCHELLVILLE", "loc" : [ -76.80526999999999, 38.919588 ], "pop" : 10551, "state" : "MD" } +{ "_id" : "20722", "city" : "BRENTWOOD", "loc" : [ -76.953062, 38.940701 ], "pop" : 5769, "state" : "MD" } +{ "_id" : "20723", "city" : "LAUREL", "loc" : [ -76.84345, 39.120806 ], "pop" : 10457, "state" : "MD" } +{ "_id" : "20724", "city" : "LAUREL", "loc" : [ -76.815485, 39.095801 ], "pop" : 7656, "state" : "MD" } +{ "_id" : "20732", "city" : "CHESAPEAKE BEACH", "loc" : [ -76.537629, 38.669798 ], "pop" : 4856, "state" : "MD" } +{ "_id" : "20733", "city" : "CHURCHTON", "loc" : [ -76.524773, 38.801791 ], "pop" : 2539, "state" : "MD" } +{ "_id" : "20735", "city" : "CLINTON", "loc" : [ -76.90257699999999, 38.754892 ], "pop" : 26417, "state" : "MD" } +{ "_id" : "20736", "city" : "OWINGS", "loc" : [ -76.606093, 38.695507 ], "pop" : 6876, "state" : "MD" } +{ "_id" : "20737", "city" : "RIVERDALE", "loc" : [ -76.914658, 38.960067 ], "pop" : 16328, "state" : "MD" } +{ "_id" : "20740", "city" : "COLLEGE PARK", "loc" : [ -76.929891, 38.996303 ], "pop" : 29336, "state" : "MD" } +{ "_id" : "20743", "city" : "CAPITAL HEIGHTS", "loc" : [ -76.906665, 38.88385 ], "pop" : 40459, "state" : "MD" } +{ "_id" : "20744", "city" : "FORT WASHINGTON", "loc" : [ -76.983531, 38.758656 ], "pop" : 44735, "state" : "MD" } +{ "_id" : "20745", "city" : "OXON HILL", "loc" : [ -76.98977600000001, 38.810764 ], "pop" : 29487, "state" : "MD" } +{ "_id" : "20746", "city" : "SUITLAND", "loc" : [ -76.922156, 38.842453 ], "pop" : 30601, "state" : "MD" } +{ "_id" : "20747", "city" : "DISTRICT HEIGHTS", "loc" : [ -76.889132, 38.853887 ], "pop" : 35872, "state" : "MD" } +{ "_id" : "20748", "city" : "TEMPLE HILLS", "loc" : [ -76.94778599999999, 38.822159 ], "pop" : 40471, "state" : "MD" } +{ "_id" : "20751", "city" : "DEALE", "loc" : [ -76.551498, 38.782909 ], "pop" : 1909, "state" : "MD" } +{ "_id" : "20754", "city" : "DUNKIRK", "loc" : [ -76.642658, 38.740763 ], "pop" : 5919, "state" : "MD" } +{ "_id" : "20755", "city" : "FORT GEORGE G ME", "loc" : [ -76.745013, 39.112923 ], "pop" : 11110, "state" : "MD" } +{ "_id" : "20758", "city" : "FRIENDSHIP", "loc" : [ -76.600093, 38.739077 ], "pop" : 853, "state" : "MD" } +{ "_id" : "20759", "city" : "FULTON", "loc" : [ -76.92999, 39.150179 ], "pop" : 1640, "state" : "MD" } +{ "_id" : "20763", "city" : "SAVAGE", "loc" : [ -76.82181799999999, 39.137962 ], "pop" : 2227, "state" : "MD" } +{ "_id" : "20764", "city" : "SHADY SIDE", "loc" : [ -76.510884, 38.836794 ], "pop" : 2957, "state" : "MD" } +{ "_id" : "20769", "city" : "GLENN DALE", "loc" : [ -76.805336, 38.976632 ], "pop" : 3242, "state" : "MD" } +{ "_id" : "20770", "city" : "GREENBELT", "loc" : [ -76.88396400000001, 38.999559 ], "pop" : 21125, "state" : "MD" } +{ "_id" : "20772", "city" : "UPPER MARLBORO", "loc" : [ -76.798028, 38.837717 ], "pop" : 49684, "state" : "MD" } +{ "_id" : "20776", "city" : "HARWOOD", "loc" : [ -76.614458, 38.858152 ], "pop" : 3765, "state" : "MD" } +{ "_id" : "20777", "city" : "HIGHLAND", "loc" : [ -76.968643, 39.184252 ], "pop" : 2596, "state" : "MD" } +{ "_id" : "20778", "city" : "WEST RIVER", "loc" : [ -76.539113, 38.825194 ], "pop" : 1026, "state" : "MD" } +{ "_id" : "20779", "city" : "TRACYS LANDING", "loc" : [ -76.57523999999999, 38.767101 ], "pop" : 413, "state" : "MD" } +{ "_id" : "20781", "city" : "HYATTSVILLE", "loc" : [ -76.934652, 38.95063 ], "pop" : 11716, "state" : "MD" } +{ "_id" : "20782", "city" : "WEST HYATTSVILLE", "loc" : [ -76.966632, 38.963575 ], "pop" : 28026, "state" : "MD" } +{ "_id" : "20783", "city" : "ADELPHI", "loc" : [ -76.97472, 38.993751 ], "pop" : 40007, "state" : "MD" } +{ "_id" : "20784", "city" : "LANDOVER HILLS", "loc" : [ -76.888829, 38.951541 ], "pop" : 27339, "state" : "MD" } +{ "_id" : "20785", "city" : "LANDOVER", "loc" : [ -76.882243, 38.91992 ], "pop" : 38732, "state" : "MD" } +{ "_id" : "20794", "city" : "JESSUP", "loc" : [ -76.792239, 39.148399 ], "pop" : 11789, "state" : "MD" } +{ "_id" : "20812", "city" : "GLEN ECHO", "loc" : [ -77.143457, 38.969333 ], "pop" : 234, "state" : "MD" } +{ "_id" : "20814", "city" : "BETHESDA", "loc" : [ -77.102165, 39.000343 ], "pop" : 21704, "state" : "MD" } +{ "_id" : "20815", "city" : "CHEVY CHASE", "loc" : [ -77.08198400000001, 38.977955 ], "pop" : 25264, "state" : "MD" } +{ "_id" : "20816", "city" : "BETHESDA", "loc" : [ -77.11528, 38.958485 ], "pop" : 14700, "state" : "MD" } +{ "_id" : "20817", "city" : "WEST BETHESDA", "loc" : [ -77.13723899999999, 38.999659 ], "pop" : 33484, "state" : "MD" } +{ "_id" : "20818", "city" : "CABIN JOHN", "loc" : [ -77.15911, 38.974302 ], "pop" : 1120, "state" : "MD" } +{ "_id" : "20832", "city" : "OLNEY", "loc" : [ -77.074949, 39.152591 ], "pop" : 20376, "state" : "MD" } +{ "_id" : "20833", "city" : "BROOKEVILLE", "loc" : [ -77.06026, 39.187082 ], "pop" : 3612, "state" : "MD" } +{ "_id" : "20837", "city" : "POOLESVILLE", "loc" : [ -77.406717, 39.138597 ], "pop" : 4692, "state" : "MD" } +{ "_id" : "20838", "city" : "BARNESVILLE", "loc" : [ -77.376426, 39.223321 ], "pop" : 130, "state" : "MD" } +{ "_id" : "20839", "city" : "BEALLSVILLE", "loc" : [ -77.41440299999999, 39.167095 ], "pop" : 72, "state" : "MD" } +{ "_id" : "20841", "city" : "BOYDS", "loc" : [ -77.316731, 39.210042 ], "pop" : 2402, "state" : "MD" } +{ "_id" : "20842", "city" : "DICKERSON", "loc" : [ -77.419853, 39.212615 ], "pop" : 1726, "state" : "MD" } +{ "_id" : "20850", "city" : "ROCKVILLE", "loc" : [ -77.167973, 39.087037 ], "pop" : 24215, "state" : "MD" } +{ "_id" : "20851", "city" : "ROCKVILLE", "loc" : [ -77.12344899999999, 39.076265 ], "pop" : 11494, "state" : "MD" } +{ "_id" : "20852", "city" : "ROCKVILLE", "loc" : [ -77.12041600000001, 39.049628 ], "pop" : 32913, "state" : "MD" } +{ "_id" : "20853", "city" : "ROCKVILLE", "loc" : [ -77.095037, 39.088738 ], "pop" : 27339, "state" : "MD" } +{ "_id" : "20854", "city" : "POTOMAC", "loc" : [ -77.192151, 39.03877 ], "pop" : 44211, "state" : "MD" } +{ "_id" : "20855", "city" : "DERWOOD", "loc" : [ -77.147707, 39.134539 ], "pop" : 17235, "state" : "MD" } +{ "_id" : "20860", "city" : "SANDY SPRING", "loc" : [ -77.029071, 39.150319 ], "pop" : 1890, "state" : "MD" } +{ "_id" : "20861", "city" : "ASHTON", "loc" : [ -76.99242, 39.151027 ], "pop" : 1318, "state" : "MD" } +{ "_id" : "20862", "city" : "BRINKLOW", "loc" : [ -77.016338, 39.183777 ], "pop" : 286, "state" : "MD" } +{ "_id" : "20866", "city" : "BURTONSVILLE", "loc" : [ -76.933851, 39.092151 ], "pop" : 14497, "state" : "MD" } +{ "_id" : "20868", "city" : "SPENCERVILLE", "loc" : [ -76.959802, 39.121343 ], "pop" : 278, "state" : "MD" } +{ "_id" : "20871", "city" : "CLARKSBURG", "loc" : [ -77.273579, 39.263719 ], "pop" : 2674, "state" : "MD" } +{ "_id" : "20872", "city" : "DAMASCUS", "loc" : [ -77.213088, 39.27606 ], "pop" : 10446, "state" : "MD" } +{ "_id" : "20874", "city" : "DARNESTOWN", "loc" : [ -77.269935, 39.17039 ], "pop" : 33549, "state" : "MD" } +{ "_id" : "20876", "city" : "GERMANTOWN", "loc" : [ -77.235829, 39.188001 ], "pop" : 11734, "state" : "MD" } +{ "_id" : "20877", "city" : "GAITHERSBURG", "loc" : [ -77.188993, 39.14187 ], "pop" : 25136, "state" : "MD" } +{ "_id" : "20878", "city" : "DARNESTOWN", "loc" : [ -77.236434, 39.115534 ], "pop" : 45367, "state" : "MD" } +{ "_id" : "20879", "city" : "LAYTONSVILLE", "loc" : [ -77.194599, 39.172597 ], "pop" : 46879, "state" : "MD" } +{ "_id" : "20882", "city" : "LAYTONSVILLE", "loc" : [ -77.174718, 39.238345 ], "pop" : 9795, "state" : "MD" } +{ "_id" : "20895", "city" : "KENSINGTON", "loc" : [ -77.07928099999999, 39.029803 ], "pop" : 21848, "state" : "MD" } +{ "_id" : "20901", "city" : "SILVER SPRING", "loc" : [ -77.00761300000001, 39.019106 ], "pop" : 33858, "state" : "MD" } +{ "_id" : "20902", "city" : "WHEATON", "loc" : [ -77.04634799999999, 39.04158 ], "pop" : 40299, "state" : "MD" } +{ "_id" : "20903", "city" : "SILVER SPRING", "loc" : [ -76.98464800000001, 39.009513 ], "pop" : 16724, "state" : "MD" } +{ "_id" : "20904", "city" : "COLESVILLE", "loc" : [ -76.976399, 39.06524 ], "pop" : 39991, "state" : "MD" } +{ "_id" : "20905", "city" : "COLESVILLE", "loc" : [ -76.98992800000001, 39.102438 ], "pop" : 16800, "state" : "MD" } +{ "_id" : "20906", "city" : "ASPEN HILL", "loc" : [ -77.063233, 39.081041 ], "pop" : 52694, "state" : "MD" } +{ "_id" : "20910", "city" : "SILVER SPRING", "loc" : [ -77.033776, 38.998198 ], "pop" : 31954, "state" : "MD" } +{ "_id" : "20912", "city" : "TAKOMA PARK", "loc" : [ -77.000715, 38.983214 ], "pop" : 24356, "state" : "MD" } +{ "_id" : "21001", "city" : "ABERDEEN", "loc" : [ -76.18053999999999, 39.510886 ], "pop" : 19229, "state" : "MD" } +{ "_id" : "21005", "city" : "ABERDEEN PROVING", "loc" : [ -76.130295, 39.472434 ], "pop" : 5294, "state" : "MD" } +{ "_id" : "21009", "city" : "ABINGDON", "loc" : [ -76.29972600000001, 39.47444 ], "pop" : 12664, "state" : "MD" } +{ "_id" : "21010", "city" : "GUNPOWDER", "loc" : [ -76.274261, 39.398249 ], "pop" : 1082, "state" : "MD" } +{ "_id" : "21012", "city" : "ARNOLD", "loc" : [ -76.49406, 39.047587 ], "pop" : 19404, "state" : "MD" } +{ "_id" : "21013", "city" : "BALDWIN", "loc" : [ -76.492711, 39.519395 ], "pop" : 4945, "state" : "MD" } +{ "_id" : "21014", "city" : "BEL AIR", "loc" : [ -76.356431, 39.539367 ], "pop" : 18477, "state" : "MD" } +{ "_id" : "21015", "city" : "BEL AIR", "loc" : [ -76.31532900000001, 39.530252 ], "pop" : 23254, "state" : "MD" } +{ "_id" : "21017", "city" : "BELCAMP", "loc" : [ -76.24201100000001, 39.475626 ], "pop" : 2957, "state" : "MD" } +{ "_id" : "21021", "city" : "BRADSHAW", "loc" : [ -76.38939999999999, 39.428113 ], "pop" : 699, "state" : "MD" } +{ "_id" : "21028", "city" : "CHURCHVILLE", "loc" : [ -76.24896200000001, 39.564845 ], "pop" : 3038, "state" : "MD" } +{ "_id" : "21029", "city" : "CLARKSVILLE", "loc" : [ -76.94227100000001, 39.194362 ], "pop" : 3147, "state" : "MD" } +{ "_id" : "21030", "city" : "COCKEYSVILLE HUN", "loc" : [ -76.62865499999999, 39.473554 ], "pop" : 20331, "state" : "MD" } +{ "_id" : "21031", "city" : "COCKEYSVILLE HUN", "loc" : [ -76.65984400000001, 39.502623 ], "pop" : 159, "state" : "MD" } +{ "_id" : "21032", "city" : "CROWNSVILLE", "loc" : [ -76.59347699999999, 39.048889 ], "pop" : 7269, "state" : "MD" } +{ "_id" : "21034", "city" : "DARLINGTON", "loc" : [ -76.227795, 39.654032 ], "pop" : 3298, "state" : "MD" } +{ "_id" : "21035", "city" : "DAVIDSONVILLE", "loc" : [ -76.637542, 38.937364 ], "pop" : 6070, "state" : "MD" } +{ "_id" : "21036", "city" : "DAYTON", "loc" : [ -76.99675499999999, 39.233882 ], "pop" : 1707, "state" : "MD" } +{ "_id" : "21037", "city" : "EDGEWATER BEACH", "loc" : [ -76.540374, 38.922511 ], "pop" : 14576, "state" : "MD" } +{ "_id" : "21040", "city" : "EDGEWOOD", "loc" : [ -76.30555, 39.427725 ], "pop" : 22058, "state" : "MD" } +{ "_id" : "21042", "city" : "ELLICOTT CITY", "loc" : [ -76.861362, 39.272632 ], "pop" : 29589, "state" : "MD" } +{ "_id" : "21043", "city" : "DANIELS", "loc" : [ -76.803929, 39.258216 ], "pop" : 19217, "state" : "MD" } +{ "_id" : "21044", "city" : "COLUMBIA", "loc" : [ -76.87880699999999, 39.214103 ], "pop" : 32695, "state" : "MD" } +{ "_id" : "21045", "city" : "COLUMBIA", "loc" : [ -76.83223, 39.205052 ], "pop" : 32658, "state" : "MD" } +{ "_id" : "21046", "city" : "COLUMBIA", "loc" : [ -76.853796, 39.170236 ], "pop" : 13591, "state" : "MD" } +{ "_id" : "21047", "city" : "FALLSTON", "loc" : [ -76.43277, 39.527048 ], "pop" : 10230, "state" : "MD" } +{ "_id" : "21048", "city" : "PATAPSCO", "loc" : [ -76.909862, 39.508645 ], "pop" : 7680, "state" : "MD" } +{ "_id" : "21050", "city" : "FOREST HILL", "loc" : [ -76.400767, 39.57549 ], "pop" : 9029, "state" : "MD" } +{ "_id" : "21051", "city" : "FORK", "loc" : [ -76.450361, 39.472937 ], "pop" : 136, "state" : "MD" } +{ "_id" : "21053", "city" : "FREELAND", "loc" : [ -76.72234899999999, 39.693957 ], "pop" : 2482, "state" : "MD" } +{ "_id" : "21054", "city" : "GAMBRILLS", "loc" : [ -76.681877, 39.04069 ], "pop" : 7441, "state" : "MD" } +{ "_id" : "21056", "city" : "GIBSON ISLAND", "loc" : [ -76.432418, 39.07511 ], "pop" : 335, "state" : "MD" } +{ "_id" : "21057", "city" : "GLEN ARM", "loc" : [ -76.515331, 39.457484 ], "pop" : 3679, "state" : "MD" } +{ "_id" : "21061", "city" : "GLEN BURNIE", "loc" : [ -76.61886199999999, 39.158968 ], "pop" : 75692, "state" : "MD" } +{ "_id" : "21071", "city" : "GLYNDON", "loc" : [ -76.78756799999999, 39.492782 ], "pop" : 1761, "state" : "MD" } +{ "_id" : "21074", "city" : "GREENMOUNT", "loc" : [ -76.849397, 39.61352 ], "pop" : 10443, "state" : "MD" } +{ "_id" : "21076", "city" : "HANOVER", "loc" : [ -76.721535, 39.155069 ], "pop" : 6265, "state" : "MD" } +{ "_id" : "21078", "city" : "HAVRE DE GRACE", "loc" : [ -76.117144, 39.552312 ], "pop" : 13536, "state" : "MD" } +{ "_id" : "21082", "city" : "HYDES", "loc" : [ -76.469538, 39.474049 ], "pop" : 883, "state" : "MD" } +{ "_id" : "21084", "city" : "JARRETTSVILLE", "loc" : [ -76.46842700000001, 39.616241 ], "pop" : 6667, "state" : "MD" } +{ "_id" : "21085", "city" : "JOPPA", "loc" : [ -76.354102, 39.424208 ], "pop" : 15006, "state" : "MD" } +{ "_id" : "21087", "city" : "KINGSVILLE", "loc" : [ -76.41473000000001, 39.455775 ], "pop" : 4283, "state" : "MD" } +{ "_id" : "21088", "city" : "LINEBORO", "loc" : [ -76.839476, 39.718498 ], "pop" : 94, "state" : "MD" } +{ "_id" : "21090", "city" : "LINTHICUM HEIGHT", "loc" : [ -76.657477, 39.208331 ], "pop" : 9777, "state" : "MD" } +{ "_id" : "21093", "city" : "LUTHERVILLE", "loc" : [ -76.633791, 39.438636 ], "pop" : 31560, "state" : "MD" } +{ "_id" : "21102", "city" : "MANCHESTER", "loc" : [ -76.89407300000001, 39.674746 ], "pop" : 5476, "state" : "MD" } +{ "_id" : "21104", "city" : "MARRIOTTSVILLE", "loc" : [ -76.913241, 39.334154 ], "pop" : 1482, "state" : "MD" } +{ "_id" : "21107", "city" : "MILLERS", "loc" : [ -76.82388400000001, 39.683224 ], "pop" : 3218, "state" : "MD" } +{ "_id" : "21108", "city" : "MILLERSVILLE", "loc" : [ -76.61902000000001, 39.104102 ], "pop" : 16436, "state" : "MD" } +{ "_id" : "21111", "city" : "HEREFORD", "loc" : [ -76.592957, 39.576611 ], "pop" : 4615, "state" : "MD" } +{ "_id" : "21113", "city" : "ODENTON", "loc" : [ -76.699583, 39.076197 ], "pop" : 8201, "state" : "MD" } +{ "_id" : "21114", "city" : "CROFTON", "loc" : [ -76.680166, 39.011163 ], "pop" : 15590, "state" : "MD" } +{ "_id" : "21117", "city" : "OWINGS MILLS", "loc" : [ -76.776934, 39.42688 ], "pop" : 24913, "state" : "MD" } +{ "_id" : "21120", "city" : "BENTLEY SPRINGS", "loc" : [ -76.67759100000001, 39.649937 ], "pop" : 5320, "state" : "MD" } +{ "_id" : "21122", "city" : "RIVIERA BEACH", "loc" : [ -76.516248, 39.129284 ], "pop" : 51386, "state" : "MD" } +{ "_id" : "21128", "city" : "PERRY HALL", "loc" : [ -76.450987, 39.401013 ], "pop" : 6075, "state" : "MD" } +{ "_id" : "21131", "city" : "JACKSONVILLE", "loc" : [ -76.564623, 39.506978 ], "pop" : 6703, "state" : "MD" } +{ "_id" : "21132", "city" : "PYLESVILLE", "loc" : [ -76.41125599999999, 39.695905 ], "pop" : 2782, "state" : "MD" } +{ "_id" : "21133", "city" : "RANDALLSTOWN", "loc" : [ -76.800245, 39.374571 ], "pop" : 23994, "state" : "MD" } +{ "_id" : "21136", "city" : "REISTERSTOWN", "loc" : [ -76.813452, 39.45996 ], "pop" : 24812, "state" : "MD" } +{ "_id" : "21140", "city" : "RIVA", "loc" : [ -76.585437, 38.950391 ], "pop" : 3165, "state" : "MD" } +{ "_id" : "21144", "city" : "SEVERN", "loc" : [ -76.697953, 39.127543 ], "pop" : 25272, "state" : "MD" } +{ "_id" : "21146", "city" : "SEVERNA PARK", "loc" : [ -76.55774599999999, 39.081078 ], "pop" : 23392, "state" : "MD" } +{ "_id" : "21152", "city" : "GLENCOE", "loc" : [ -76.66910900000001, 39.543086 ], "pop" : 4450, "state" : "MD" } +{ "_id" : "21154", "city" : "ROCKS", "loc" : [ -76.330174, 39.649928 ], "pop" : 5018, "state" : "MD" } +{ "_id" : "21155", "city" : "FOWBELSBURG", "loc" : [ -76.81623, 39.56394 ], "pop" : 2487, "state" : "MD" } +{ "_id" : "21156", "city" : "UPPER FALLS", "loc" : [ -76.400604, 39.43967 ], "pop" : 464, "state" : "MD" } +{ "_id" : "21157", "city" : "CARROLLTON", "loc" : [ -76.99404, 39.555654 ], "pop" : 37148, "state" : "MD" } +{ "_id" : "21158", "city" : "UNIONTOWN", "loc" : [ -77.036946, 39.655464 ], "pop" : 8491, "state" : "MD" } +{ "_id" : "21160", "city" : "WHITEFORD", "loc" : [ -76.31601499999999, 39.707709 ], "pop" : 1766, "state" : "MD" } +{ "_id" : "21161", "city" : "WHITE HALL", "loc" : [ -76.566639, 39.66176 ], "pop" : 4970, "state" : "MD" } +{ "_id" : "21162", "city" : "WHITE MARSH", "loc" : [ -76.413189, 39.392315 ], "pop" : 2521, "state" : "MD" } +{ "_id" : "21163", "city" : "GRANITE", "loc" : [ -76.85757, 39.339151 ], "pop" : 2115, "state" : "MD" } +{ "_id" : "21201", "city" : "BALTIMORE", "loc" : [ -76.625203, 39.29463 ], "pop" : 16256, "state" : "MD" } +{ "_id" : "21202", "city" : "BALTIMORE", "loc" : [ -76.607499, 39.299844 ], "pop" : 28656, "state" : "MD" } +{ "_id" : "21204", "city" : "EUDOWOOD", "loc" : [ -76.603224, 39.402517 ], "pop" : 37257, "state" : "MD" } +{ "_id" : "21205", "city" : "BALTIMORE", "loc" : [ -76.579915, 39.300871 ], "pop" : 23763, "state" : "MD" } +{ "_id" : "21206", "city" : "BALTIMORE", "loc" : [ -76.541135, 39.336494 ], "pop" : 52114, "state" : "MD" } +{ "_id" : "21207", "city" : "GWYNN OAK", "loc" : [ -76.734064, 39.329628 ], "pop" : 76002, "state" : "MD" } +{ "_id" : "21208", "city" : "PIKESVILLE", "loc" : [ -76.72901299999999, 39.376359 ], "pop" : 27723, "state" : "MD" } +{ "_id" : "21209", "city" : "BALTIMORE", "loc" : [ -76.674431, 39.371622 ], "pop" : 20673, "state" : "MD" } +{ "_id" : "21210", "city" : "BALTIMORE", "loc" : [ -76.632099, 39.350727 ], "pop" : 12581, "state" : "MD" } +{ "_id" : "21211", "city" : "BALTIMORE", "loc" : [ -76.63362499999999, 39.331642 ], "pop" : 19797, "state" : "MD" } +{ "_id" : "21212", "city" : "BALTIMORE", "loc" : [ -76.609989, 39.362571 ], "pop" : 35680, "state" : "MD" } +{ "_id" : "21213", "city" : "BALTIMORE", "loc" : [ -76.581012, 39.312667 ], "pop" : 47171, "state" : "MD" } +{ "_id" : "21214", "city" : "BALTIMORE", "loc" : [ -76.564375, 39.35206 ], "pop" : 20949, "state" : "MD" } +{ "_id" : "21215", "city" : "BALTIMORE", "loc" : [ -76.67939699999999, 39.344572 ], "pop" : 74402, "state" : "MD" } +{ "_id" : "21216", "city" : "BALTIMORE", "loc" : [ -76.66989100000001, 39.309349 ], "pop" : 42501, "state" : "MD" } +{ "_id" : "21217", "city" : "BALTIMORE", "loc" : [ -76.639267, 39.306416 ], "pop" : 52502, "state" : "MD" } +{ "_id" : "21218", "city" : "BALTIMORE", "loc" : [ -76.6048, 39.3265 ], "pop" : 56677, "state" : "MD" } +{ "_id" : "21219", "city" : "DUNDALK SPARROWS", "loc" : [ -76.44693700000001, 39.229068 ], "pop" : 9467, "state" : "MD" } +{ "_id" : "21220", "city" : "MIDDLE RIVER", "loc" : [ -76.415255, 39.340098 ], "pop" : 37336, "state" : "MD" } +{ "_id" : "21221", "city" : "ESSEX", "loc" : [ -76.453259, 39.308553 ], "pop" : 44117, "state" : "MD" } +{ "_id" : "21222", "city" : "DUNDALK SPARROWS", "loc" : [ -76.502484, 39.26486 ], "pop" : 58181, "state" : "MD" } +{ "_id" : "21223", "city" : "BALTIMORE", "loc" : [ -76.647586, 39.287 ], "pop" : 39003, "state" : "MD" } +{ "_id" : "21224", "city" : "BALTIMORE", "loc" : [ -76.556831, 39.287558 ], "pop" : 53629, "state" : "MD" } +{ "_id" : "21225", "city" : "BROOKLYN CURTIS", "loc" : [ -76.615026, 39.233343 ], "pop" : 35032, "state" : "MD" } +{ "_id" : "21226", "city" : "BROOKLYN CURTIS", "loc" : [ -76.569147, 39.209315 ], "pop" : 5478, "state" : "MD" } +{ "_id" : "21227", "city" : "HALETHORPE", "loc" : [ -76.696872, 39.230893 ], "pop" : 45430, "state" : "MD" } +{ "_id" : "21228", "city" : "CATONSVILLE", "loc" : [ -76.74012399999999, 39.27825 ], "pop" : 43630, "state" : "MD" } +{ "_id" : "21229", "city" : "BALTIMORE", "loc" : [ -76.689885, 39.285645 ], "pop" : 53962, "state" : "MD" } +{ "_id" : "21230", "city" : "BALTIMORE", "loc" : [ -76.626193, 39.269943 ], "pop" : 34901, "state" : "MD" } +{ "_id" : "21231", "city" : "BALTIMORE", "loc" : [ -76.589956, 39.289193 ], "pop" : 15928, "state" : "MD" } +{ "_id" : "21234", "city" : "PARKVILLE", "loc" : [ -76.54176699999999, 39.387581 ], "pop" : 66477, "state" : "MD" } +{ "_id" : "21236", "city" : "NOTTINGHAM", "loc" : [ -76.487106, 39.391412 ], "pop" : 33099, "state" : "MD" } +{ "_id" : "21237", "city" : "ROSEDALE", "loc" : [ -76.50138699999999, 39.336054 ], "pop" : 24835, "state" : "MD" } +{ "_id" : "21239", "city" : "BALTIMORE", "loc" : [ -76.589082, 39.360977 ], "pop" : 31935, "state" : "MD" } +{ "_id" : "21240", "city" : "BALTIMORE", "loc" : [ -76.648287, 39.17185 ], "pop" : 1, "state" : "MD" } +{ "_id" : "21401", "city" : "CAPE SAINT CLAIR", "loc" : [ -76.503139, 38.999645 ], "pop" : 44757, "state" : "MD" } +{ "_id" : "21402", "city" : "NAVAL ACADEMY", "loc" : [ -76.48079, 38.982436 ], "pop" : 5780, "state" : "MD" } +{ "_id" : "21403", "city" : "ANNAPOLIS", "loc" : [ -76.49102999999999, 38.952394 ], "pop" : 26587, "state" : "MD" } +{ "_id" : "21502", "city" : "CRESAPTOWN", "loc" : [ -78.77744199999999, 39.644796 ], "pop" : 44371, "state" : "MD" } +{ "_id" : "21520", "city" : "ACCIDENT", "loc" : [ -79.30846699999999, 39.635504 ], "pop" : 1968, "state" : "MD" } +{ "_id" : "21521", "city" : "BARTON", "loc" : [ -79.02813, 39.533135 ], "pop" : 1305, "state" : "MD" } +{ "_id" : "21522", "city" : "BITTINGER", "loc" : [ -79.214247, 39.597786 ], "pop" : 479, "state" : "MD" } +{ "_id" : "21523", "city" : "BLOOMINGTON", "loc" : [ -79.11370700000001, 39.487764 ], "pop" : 898, "state" : "MD" } +{ "_id" : "21530", "city" : "FLINTSTONE", "loc" : [ -78.573949, 39.699288 ], "pop" : 1102, "state" : "MD" } +{ "_id" : "21531", "city" : "FRIENDSVILLE", "loc" : [ -79.42191200000001, 39.666502 ], "pop" : 2021, "state" : "MD" } +{ "_id" : "21532", "city" : "FROSTBURG", "loc" : [ -78.930559, 39.649359 ], "pop" : 15702, "state" : "MD" } +{ "_id" : "21536", "city" : "JENNINGS", "loc" : [ -79.15166499999999, 39.684436 ], "pop" : 3138, "state" : "MD" } +{ "_id" : "21538", "city" : "SHALLMAR", "loc" : [ -79.202528, 39.396275 ], "pop" : 759, "state" : "MD" } +{ "_id" : "21539", "city" : "LONACONING", "loc" : [ -78.991477, 39.575703 ], "pop" : 3494, "state" : "MD" } +{ "_id" : "21540", "city" : "LUKE", "loc" : [ -79.059365, 39.477392 ], "pop" : 184, "state" : "MD" } +{ "_id" : "21541", "city" : "SANG RUN", "loc" : [ -79.36413400000001, 39.559709 ], "pop" : 1673, "state" : "MD" } +{ "_id" : "21545", "city" : "MOUNT SAVAGE", "loc" : [ -78.873892, 39.699128 ], "pop" : 2067, "state" : "MD" } +{ "_id" : "21550", "city" : "DEER PARK", "loc" : [ -79.38966000000001, 39.399993 ], "pop" : 13531, "state" : "MD" } +{ "_id" : "21555", "city" : "OLDTOWN", "loc" : [ -78.604373, 39.584598 ], "pop" : 2079, "state" : "MD" } +{ "_id" : "21557", "city" : "RAWLINGS", "loc" : [ -78.90623100000001, 39.521363 ], "pop" : 1919, "state" : "MD" } +{ "_id" : "21561", "city" : "SWANTON", "loc" : [ -79.240165, 39.476361 ], "pop" : 1719, "state" : "MD" } +{ "_id" : "21562", "city" : "MCCOOLE", "loc" : [ -79.030726, 39.482625 ], "pop" : 3976, "state" : "MD" } +{ "_id" : "21601", "city" : "EASTON", "loc" : [ -76.07577499999999, 38.77682 ], "pop" : 16439, "state" : "MD" } +{ "_id" : "21607", "city" : "BARCLAY", "loc" : [ -75.860079, 39.129871 ], "pop" : 592, "state" : "MD" } +{ "_id" : "21610", "city" : "BETTERTON", "loc" : [ -76.06393799999999, 39.365509 ], "pop" : 485, "state" : "MD" } +{ "_id" : "21612", "city" : "BOZMAN", "loc" : [ -76.27641, 38.751493 ], "pop" : 847, "state" : "MD" } +{ "_id" : "21613", "city" : "CAMBRIDGE", "loc" : [ -76.08735799999999, 38.564282 ], "pop" : 16908, "state" : "MD" } +{ "_id" : "21617", "city" : "CENTREVILLE", "loc" : [ -76.04497499999999, 39.056423 ], "pop" : 5834, "state" : "MD" } +{ "_id" : "21619", "city" : "CHESTER", "loc" : [ -76.284183, 38.958296 ], "pop" : 4199, "state" : "MD" } +{ "_id" : "21620", "city" : "CHESTERTOWN", "loc" : [ -76.080214, 39.212517 ], "pop" : 10618, "state" : "MD" } +{ "_id" : "21622", "city" : "CHURCH CREEK", "loc" : [ -76.169569, 38.427815 ], "pop" : 593, "state" : "MD" } +{ "_id" : "21623", "city" : "CHURCH HILL", "loc" : [ -75.988028, 39.145958 ], "pop" : 813, "state" : "MD" } +{ "_id" : "21625", "city" : "CORDOVA", "loc" : [ -76.00287899999999, 38.870426 ], "pop" : 2346, "state" : "MD" } +{ "_id" : "21626", "city" : "CRAPO", "loc" : [ -76.11420699999999, 38.329541 ], "pop" : 173, "state" : "MD" } +{ "_id" : "21628", "city" : "CRUMPTON", "loc" : [ -75.919522, 39.233019 ], "pop" : 689, "state" : "MD" } +{ "_id" : "21629", "city" : "DENTON", "loc" : [ -75.836071, 38.877928 ], "pop" : 7126, "state" : "MD" } +{ "_id" : "21631", "city" : "EAST NEW MARKET", "loc" : [ -75.956766, 38.592095 ], "pop" : 2156, "state" : "MD" } +{ "_id" : "21632", "city" : "FEDERALSBURG", "loc" : [ -75.77537599999999, 38.714681 ], "pop" : 5535, "state" : "MD" } +{ "_id" : "21634", "city" : "FISHING CREEK", "loc" : [ -76.21678300000001, 38.316292 ], "pop" : 580, "state" : "MD" } +{ "_id" : "21635", "city" : "GALENA", "loc" : [ -75.871673, 39.337417 ], "pop" : 1087, "state" : "MD" } +{ "_id" : "21636", "city" : "GOLDSBORO", "loc" : [ -75.792604, 39.022957 ], "pop" : 1179, "state" : "MD" } +{ "_id" : "21637", "city" : "GOLTS", "loc" : [ -75.805521, 39.355598 ], "pop" : 533, "state" : "MD" } +{ "_id" : "21638", "city" : "GRASONVILLE", "loc" : [ -76.199701, 38.945602 ], "pop" : 3225, "state" : "MD" } +{ "_id" : "21639", "city" : "GREENSBORO", "loc" : [ -75.80591099999999, 38.961632 ], "pop" : 3516, "state" : "MD" } +{ "_id" : "21640", "city" : "HENDERSON", "loc" : [ -75.794787, 39.067197 ], "pop" : 1391, "state" : "MD" } +{ "_id" : "21643", "city" : "WILLIAMSBURG", "loc" : [ -75.866254, 38.642826 ], "pop" : 4625, "state" : "MD" } +{ "_id" : "21644", "city" : "INGLESIDE", "loc" : [ -75.89174800000001, 39.124654 ], "pop" : 159, "state" : "MD" } +{ "_id" : "21645", "city" : "KENNEDYVILLE", "loc" : [ -75.981797, 39.297835 ], "pop" : 1807, "state" : "MD" } +{ "_id" : "21647", "city" : "MCDANIEL", "loc" : [ -76.280593, 38.819213 ], "pop" : 610, "state" : "MD" } +{ "_id" : "21649", "city" : "MARYDEL", "loc" : [ -75.762247, 39.108169 ], "pop" : 1195, "state" : "MD" } +{ "_id" : "21650", "city" : "MASSEY", "loc" : [ -75.821483, 39.312569 ], "pop" : 112, "state" : "MD" } +{ "_id" : "21651", "city" : "MILLINGTON", "loc" : [ -75.84996599999999, 39.257989 ], "pop" : 2003, "state" : "MD" } +{ "_id" : "21654", "city" : "OXFORD", "loc" : [ -76.153783, 38.686358 ], "pop" : 1350, "state" : "MD" } +{ "_id" : "21655", "city" : "PRESTON", "loc" : [ -75.916284, 38.746456 ], "pop" : 4425, "state" : "MD" } +{ "_id" : "21657", "city" : "QUEEN ANNE", "loc" : [ -75.977655, 38.945583 ], "pop" : 1092, "state" : "MD" } +{ "_id" : "21658", "city" : "QUEENSTOWN", "loc" : [ -76.152646, 38.956235 ], "pop" : 3330, "state" : "MD" } +{ "_id" : "21659", "city" : "RHODESDALE", "loc" : [ -75.774945, 38.602985 ], "pop" : 2276, "state" : "MD" } +{ "_id" : "21660", "city" : "RIDGELY", "loc" : [ -75.88482500000001, 38.956787 ], "pop" : 2754, "state" : "MD" } +{ "_id" : "21661", "city" : "ROCK HALL", "loc" : [ -76.230467, 39.134371 ], "pop" : 2770, "state" : "MD" } +{ "_id" : "21662", "city" : "ROYAL OAK", "loc" : [ -76.187788, 38.72883 ], "pop" : 889, "state" : "MD" } +{ "_id" : "21663", "city" : "SAINT MICHAELS", "loc" : [ -76.221547, 38.782965 ], "pop" : 3247, "state" : "MD" } +{ "_id" : "21665", "city" : "SHERWOOD", "loc" : [ -76.327822, 38.73741 ], "pop" : 262, "state" : "MD" } +{ "_id" : "21666", "city" : "STEVENSVILLE", "loc" : [ -76.337087, 38.939399 ], "pop" : 8630, "state" : "MD" } +{ "_id" : "21667", "city" : "STILL POND", "loc" : [ -76.052156, 39.327624 ], "pop" : 289, "state" : "MD" } +{ "_id" : "21668", "city" : "SUDLERSVILLE", "loc" : [ -75.849968, 39.182339 ], "pop" : 2014, "state" : "MD" } +{ "_id" : "21669", "city" : "TAYLORS ISLAND", "loc" : [ -76.296406, 38.463095 ], "pop" : 246, "state" : "MD" } +{ "_id" : "21671", "city" : "TILGHMAN", "loc" : [ -76.337653, 38.706309 ], "pop" : 745, "state" : "MD" } +{ "_id" : "21672", "city" : "TODDVILLE", "loc" : [ -76.059634, 38.272592 ], "pop" : 361, "state" : "MD" } +{ "_id" : "21673", "city" : "TRAPPE", "loc" : [ -76.05067, 38.66466 ], "pop" : 2958, "state" : "MD" } +{ "_id" : "21675", "city" : "WINGATE", "loc" : [ -76.086303, 38.289898 ], "pop" : 160, "state" : "MD" } +{ "_id" : "21676", "city" : "WITTMAN", "loc" : [ -76.29931000000001, 38.789187 ], "pop" : 338, "state" : "MD" } +{ "_id" : "21677", "city" : "WOOLFORD", "loc" : [ -76.20405700000001, 38.5066 ], "pop" : 459, "state" : "MD" } +{ "_id" : "21678", "city" : "WORTON", "loc" : [ -76.10078, 39.296346 ], "pop" : 1680, "state" : "MD" } +{ "_id" : "21679", "city" : "WYE MILLS", "loc" : [ -76.081366, 38.928114 ], "pop" : 270, "state" : "MD" } +{ "_id" : "21701", "city" : "LEWISTOWN", "loc" : [ -77.400875, 39.408235 ], "pop" : 35492, "state" : "MD" } +{ "_id" : "21702", "city" : "FORT DETRICK", "loc" : [ -77.44736899999999, 39.436532 ], "pop" : 33704, "state" : "MD" } +{ "_id" : "21710", "city" : "DOUBS", "loc" : [ -77.447693, 39.306452 ], "pop" : 2085, "state" : "MD" } +{ "_id" : "21711", "city" : "BIG POOL", "loc" : [ -78.01044899999999, 39.645685 ], "pop" : 1083, "state" : "MD" } +{ "_id" : "21713", "city" : "FAHRNEY KEEDY ME", "loc" : [ -77.683522, 39.532244 ], "pop" : 10501, "state" : "MD" } +{ "_id" : "21716", "city" : "BRUNSWICK", "loc" : [ -77.623002, 39.316356 ], "pop" : 5160, "state" : "MD" } +{ "_id" : "21718", "city" : "BURKITTSVILLE", "loc" : [ -77.626508, 39.397066 ], "pop" : 285, "state" : "MD" } +{ "_id" : "21719", "city" : "FORT RITCHIE", "loc" : [ -77.495609, 39.707341 ], "pop" : 2672, "state" : "MD" } +{ "_id" : "21722", "city" : "BIG SPRING", "loc" : [ -77.912592, 39.661693 ], "pop" : 3661, "state" : "MD" } +{ "_id" : "21723", "city" : "COOKSVILLE", "loc" : [ -77.005076, 39.321109 ], "pop" : 353, "state" : "MD" } +{ "_id" : "21725", "city" : "DETOUR", "loc" : [ -77.248272, 39.614661 ], "pop" : 970, "state" : "MD" } +{ "_id" : "21727", "city" : "EMMITSBURG", "loc" : [ -77.335658, 39.694044 ], "pop" : 5095, "state" : "MD" } +{ "_id" : "21733", "city" : "FAIR PLAY", "loc" : [ -77.76146799999999, 39.542279 ], "pop" : 153, "state" : "MD" } +{ "_id" : "21737", "city" : "GLENELG", "loc" : [ -77.005703, 39.262064 ], "pop" : 681, "state" : "MD" } +{ "_id" : "21738", "city" : "GLENWOOD", "loc" : [ -77.014821, 39.279519 ], "pop" : 1632, "state" : "MD" } +{ "_id" : "21740", "city" : "HAGERSTOWN", "loc" : [ -77.73721500000001, 39.632022 ], "pop" : 47679, "state" : "MD" } +{ "_id" : "21742", "city" : "HAGERSTOWN", "loc" : [ -77.69210200000001, 39.657291 ], "pop" : 28398, "state" : "MD" } +{ "_id" : "21750", "city" : "HANCOCK", "loc" : [ -78.17624600000001, 39.699083 ], "pop" : 4275, "state" : "MD" } +{ "_id" : "21754", "city" : "IJAMSVILLE", "loc" : [ -77.296363, 39.326737 ], "pop" : 4078, "state" : "MD" } +{ "_id" : "21755", "city" : "JEFFERSON", "loc" : [ -77.544061, 39.365291 ], "pop" : 4132, "state" : "MD" } +{ "_id" : "21756", "city" : "KEEDYSVILLE", "loc" : [ -77.694427, 39.456323 ], "pop" : 2546, "state" : "MD" } +{ "_id" : "21757", "city" : "KEYMAR", "loc" : [ -77.281661, 39.565619 ], "pop" : 1691, "state" : "MD" } +{ "_id" : "21758", "city" : "KNOXVILLE", "loc" : [ -77.651286, 39.347891 ], "pop" : 3534, "state" : "MD" } +{ "_id" : "21764", "city" : "LINWOOD", "loc" : [ -77.118443, 39.577654 ], "pop" : 591, "state" : "MD" } +{ "_id" : "21766", "city" : "LITTLE ORLEANS", "loc" : [ -78.378139, 39.687593 ], "pop" : 699, "state" : "MD" } +{ "_id" : "21767", "city" : "MAUGANSVILLE", "loc" : [ -77.749915, 39.6996 ], "pop" : 598, "state" : "MD" } +{ "_id" : "21769", "city" : "MIDDLETOWN", "loc" : [ -77.550241, 39.441586 ], "pop" : 8732, "state" : "MD" } +{ "_id" : "21770", "city" : "MONROVIA", "loc" : [ -77.249442, 39.351248 ], "pop" : 5033, "state" : "MD" } +{ "_id" : "21771", "city" : "MOUNT AIRY", "loc" : [ -77.172347, 39.388131 ], "pop" : 21912, "state" : "MD" } +{ "_id" : "21773", "city" : "MYERSVILLE", "loc" : [ -77.551322, 39.528194 ], "pop" : 3363, "state" : "MD" } +{ "_id" : "21776", "city" : "NEW WINDSOR", "loc" : [ -77.103397, 39.516233 ], "pop" : 4576, "state" : "MD" } +{ "_id" : "21777", "city" : "POINT OF ROCKS", "loc" : [ -77.53276200000001, 39.279089 ], "pop" : 812, "state" : "MD" } +{ "_id" : "21778", "city" : "ROCKY RIDGE", "loc" : [ -77.329635, 39.605696 ], "pop" : 988, "state" : "MD" } +{ "_id" : "21779", "city" : "ROHRERSVILLE", "loc" : [ -77.657977, 39.443052 ], "pop" : 200, "state" : "MD" } +{ "_id" : "21780", "city" : "SABILLASVILLE", "loc" : [ -77.469323, 39.682772 ], "pop" : 1605, "state" : "MD" } +{ "_id" : "21782", "city" : "SHARPSBURG", "loc" : [ -77.75107199999999, 39.442394 ], "pop" : 3624, "state" : "MD" } +{ "_id" : "21783", "city" : "SMITHSBURG", "loc" : [ -77.57056300000001, 39.647036 ], "pop" : 6857, "state" : "MD" } +{ "_id" : "21784", "city" : "CARROLLTOWNE", "loc" : [ -76.961439, 39.39887 ], "pop" : 28493, "state" : "MD" } +{ "_id" : "21787", "city" : "TANEYTOWN", "loc" : [ -77.16905800000001, 39.665798 ], "pop" : 7612, "state" : "MD" } +{ "_id" : "21788", "city" : "GRACEHAM", "loc" : [ -77.405114, 39.606576 ], "pop" : 8929, "state" : "MD" } +{ "_id" : "21790", "city" : "TUSCARORA", "loc" : [ -77.51011, 39.266689 ], "pop" : 134, "state" : "MD" } +{ "_id" : "21791", "city" : "UNIONVILLE", "loc" : [ -77.194346, 39.541484 ], "pop" : 3942, "state" : "MD" } +{ "_id" : "21793", "city" : "WALKERSVILLE", "loc" : [ -77.34838999999999, 39.47875 ], "pop" : 8957, "state" : "MD" } +{ "_id" : "21794", "city" : "WEST FRIENDSHIP", "loc" : [ -76.966031, 39.293447 ], "pop" : 937, "state" : "MD" } +{ "_id" : "21795", "city" : "WILLIAMSPORT", "loc" : [ -77.808705, 39.593023 ], "pop" : 8739, "state" : "MD" } +{ "_id" : "21797", "city" : "WOODBINE", "loc" : [ -77.06469800000001, 39.346438 ], "pop" : 6224, "state" : "MD" } +{ "_id" : "21798", "city" : "WOODSBORO", "loc" : [ -77.29718699999999, 39.531121 ], "pop" : 1771, "state" : "MD" } +{ "_id" : "21801", "city" : "SALISBURY", "loc" : [ -75.59223799999999, 38.362996 ], "pop" : 52905, "state" : "MD" } +{ "_id" : "21811", "city" : "BERLIN", "loc" : [ -75.18655699999999, 38.347514 ], "pop" : 11613, "state" : "MD" } +{ "_id" : "21813", "city" : "BISHOPVILLE", "loc" : [ -75.18554399999999, 38.429609 ], "pop" : 1902, "state" : "MD" } +{ "_id" : "21814", "city" : "BIVALVE", "loc" : [ -75.89140999999999, 38.295337 ], "pop" : 307, "state" : "MD" } +{ "_id" : "21816", "city" : "CHANCE", "loc" : [ -75.93919200000001, 38.178504 ], "pop" : 415, "state" : "MD" } +{ "_id" : "21817", "city" : "CRISFIELD", "loc" : [ -75.842882, 37.984496 ], "pop" : 5342, "state" : "MD" } +{ "_id" : "21820", "city" : "DAMES QUARTER", "loc" : [ -75.900082, 38.190568 ], "pop" : 192, "state" : "MD" } +{ "_id" : "21821", "city" : "DEAL ISLAND", "loc" : [ -75.94955899999999, 38.153326 ], "pop" : 259, "state" : "MD" } +{ "_id" : "21822", "city" : "EDEN", "loc" : [ -75.648167, 38.276155 ], "pop" : 1042, "state" : "MD" } +{ "_id" : "21824", "city" : "EWELL", "loc" : [ -76.03506, 37.99379 ], "pop" : 252, "state" : "MD" } +{ "_id" : "21826", "city" : "FRUITLAND", "loc" : [ -75.622782, 38.322523 ], "pop" : 3771, "state" : "MD" } +{ "_id" : "21829", "city" : "GIRDLETREE", "loc" : [ -75.390232, 38.095815 ], "pop" : 495, "state" : "MD" } +{ "_id" : "21830", "city" : "HEBRON", "loc" : [ -75.69626700000001, 38.402597 ], "pop" : 2415, "state" : "MD" } +{ "_id" : "21835", "city" : "LINKWOOD", "loc" : [ -75.963015, 38.540317 ], "pop" : 576, "state" : "MD" } +{ "_id" : "21837", "city" : "MARDELA SPRINGS", "loc" : [ -75.74144200000001, 38.486386 ], "pop" : 3039, "state" : "MD" } +{ "_id" : "21838", "city" : "MARION STATION", "loc" : [ -75.757903, 38.026637 ], "pop" : 2323, "state" : "MD" } +{ "_id" : "21840", "city" : "NANTICOKE", "loc" : [ -75.90212699999999, 38.267211 ], "pop" : 358, "state" : "MD" } +{ "_id" : "21841", "city" : "NEWARK", "loc" : [ -75.289316, 38.248875 ], "pop" : 765, "state" : "MD" } +{ "_id" : "21842", "city" : "OCEAN CITY", "loc" : [ -75.081011, 38.379248 ], "pop" : 6914, "state" : "MD" } +{ "_id" : "21849", "city" : "PARSONSBURG", "loc" : [ -75.473658, 38.391392 ], "pop" : 2407, "state" : "MD" } +{ "_id" : "21850", "city" : "PITTSVILLE", "loc" : [ -75.407589, 38.375465 ], "pop" : 1997, "state" : "MD" } +{ "_id" : "21851", "city" : "POCOMOKE CITY", "loc" : [ -75.555038, 38.071369 ], "pop" : 7527, "state" : "MD" } +{ "_id" : "21853", "city" : "PRINCESS ANNE", "loc" : [ -75.70723700000001, 38.191929 ], "pop" : 10343, "state" : "MD" } +{ "_id" : "21856", "city" : "QUANTICO", "loc" : [ -75.78510199999999, 38.333888 ], "pop" : 1029, "state" : "MD" } +{ "_id" : "21863", "city" : "SNOW HILL", "loc" : [ -75.40498700000001, 38.186794 ], "pop" : 5195, "state" : "MD" } +{ "_id" : "21864", "city" : "STOCKTON", "loc" : [ -75.41076200000001, 38.045155 ], "pop" : 691, "state" : "MD" } +{ "_id" : "21865", "city" : "TYASKIN", "loc" : [ -75.869032, 38.30706 ], "pop" : 504, "state" : "MD" } +{ "_id" : "21866", "city" : "TYLERTON", "loc" : [ -76.023036, 37.967436 ], "pop" : 112, "state" : "MD" } +{ "_id" : "21869", "city" : "VIENNA", "loc" : [ -75.87292600000001, 38.477376 ], "pop" : 1119, "state" : "MD" } +{ "_id" : "21870", "city" : "WENONA", "loc" : [ -75.94402100000001, 38.133222 ], "pop" : 358, "state" : "MD" } +{ "_id" : "21871", "city" : "WESTOVER", "loc" : [ -75.74056299999999, 38.10099 ], "pop" : 1881, "state" : "MD" } +{ "_id" : "21872", "city" : "WHALEYSVILLE", "loc" : [ -75.28886799999999, 38.404169 ], "pop" : 758, "state" : "MD" } +{ "_id" : "21874", "city" : "WILLARDS", "loc" : [ -75.355161, 38.393853 ], "pop" : 1895, "state" : "MD" } +{ "_id" : "21875", "city" : "DELMAR", "loc" : [ -75.55828, 38.44451 ], "pop" : 3712, "state" : "MD" } +{ "_id" : "21901", "city" : "NORTH EAST", "loc" : [ -75.953805, 39.604535 ], "pop" : 10560, "state" : "MD" } +{ "_id" : "21903", "city" : "PERRYVILLE", "loc" : [ -76.05922700000001, 39.564894 ], "pop" : 4678, "state" : "MD" } +{ "_id" : "21904", "city" : "BAINBRIDGE", "loc" : [ -76.08370600000001, 39.622264 ], "pop" : 5507, "state" : "MD" } +{ "_id" : "21911", "city" : "RISING SUN", "loc" : [ -76.049164, 39.688176 ], "pop" : 7798, "state" : "MD" } +{ "_id" : "21912", "city" : "WARWICK", "loc" : [ -75.799592, 39.428261 ], "pop" : 745, "state" : "MD" } +{ "_id" : "21913", "city" : "CECILTON", "loc" : [ -75.86539500000001, 39.40151 ], "pop" : 611, "state" : "MD" } +{ "_id" : "21914", "city" : "CHARLESTOWN", "loc" : [ -75.97953699999999, 39.57287 ], "pop" : 638, "state" : "MD" } +{ "_id" : "21915", "city" : "CHESAPEAKE CITY", "loc" : [ -75.840581, 39.513308 ], "pop" : 2823, "state" : "MD" } +{ "_id" : "21917", "city" : "COLORA", "loc" : [ -76.09336399999999, 39.669515 ], "pop" : 1868, "state" : "MD" } +{ "_id" : "21918", "city" : "CONOWINGO", "loc" : [ -76.15719799999999, 39.67775 ], "pop" : 3025, "state" : "MD" } +{ "_id" : "21919", "city" : "EARLEVILLE", "loc" : [ -75.94031, 39.427105 ], "pop" : 2196, "state" : "MD" } +{ "_id" : "21921", "city" : "ELKTON", "loc" : [ -75.84584, 39.626434 ], "pop" : 30901, "state" : "MD" } +{ "_id" : "22001", "city" : "ALDIE", "loc" : [ -77.602281, 38.957878 ], "pop" : 1574, "state" : "VA" } +{ "_id" : "22002", "city" : "AMISSVILLE", "loc" : [ -78.038053, 38.710055 ], "pop" : 1581, "state" : "VA" } +{ "_id" : "22003", "city" : "ANNANDALE", "loc" : [ -77.21424500000001, 38.830699 ], "pop" : 50054, "state" : "VA" } +{ "_id" : "22010", "city" : "ARCOLA", "loc" : [ -77.538721, 38.973626 ], "pop" : 61, "state" : "VA" } +{ "_id" : "22011", "city" : "ASHBURN", "loc" : [ -77.48061199999999, 39.039918 ], "pop" : 3979, "state" : "VA" } +{ "_id" : "22012", "city" : "BLUEMONT", "loc" : [ -77.831416, 39.097732 ], "pop" : 557, "state" : "VA" } +{ "_id" : "22013", "city" : "BRISTOW", "loc" : [ -77.57884300000001, 38.74644 ], "pop" : 1568, "state" : "VA" } +{ "_id" : "22014", "city" : "BROAD RUN", "loc" : [ -77.68611, 38.828653 ], "pop" : 344, "state" : "VA" } +{ "_id" : "22015", "city" : "BURKE", "loc" : [ -77.28175, 38.789408 ], "pop" : 41783, "state" : "VA" } +{ "_id" : "22018", "city" : "CATHARPIN", "loc" : [ -77.561155, 38.853007 ], "pop" : 647, "state" : "VA" } +{ "_id" : "22019", "city" : "CATLETT", "loc" : [ -77.653548, 38.635067 ], "pop" : 4180, "state" : "VA" } +{ "_id" : "22020", "city" : "CENTREVILLE", "loc" : [ -77.45117500000001, 38.841805 ], "pop" : 33039, "state" : "VA" } +{ "_id" : "22021", "city" : "CHANTILLY", "loc" : [ -77.435436, 38.884131 ], "pop" : 14835, "state" : "VA" } +{ "_id" : "22024", "city" : "CLIFTON", "loc" : [ -77.406955, 38.800662 ], "pop" : 9554, "state" : "VA" } +{ "_id" : "22025", "city" : "DELAPLANE", "loc" : [ -77.930176, 38.911293 ], "pop" : 916, "state" : "VA" } +{ "_id" : "22026", "city" : "DUMFRIES", "loc" : [ -77.33870400000001, 38.602344 ], "pop" : 17563, "state" : "VA" } +{ "_id" : "22027", "city" : "DUNN LORING", "loc" : [ -77.221351, 38.895368 ], "pop" : 1084, "state" : "VA" } +{ "_id" : "22030", "city" : "FAIRFAX", "loc" : [ -77.324151, 38.845826 ], "pop" : 32754, "state" : "VA" } +{ "_id" : "22031", "city" : "FAIRFAX", "loc" : [ -77.264937, 38.860353 ], "pop" : 22035, "state" : "VA" } +{ "_id" : "22032", "city" : "FAIRFAX", "loc" : [ -77.29252700000001, 38.817729 ], "pop" : 29971, "state" : "VA" } +{ "_id" : "22033", "city" : "FAIRFAX", "loc" : [ -77.388451, 38.877627 ], "pop" : 20873, "state" : "VA" } +{ "_id" : "22039", "city" : "FAIRFAX STATION", "loc" : [ -77.306388, 38.760205 ], "pop" : 14491, "state" : "VA" } +{ "_id" : "22041", "city" : "BAILEYS CROSSROA", "loc" : [ -77.136928, 38.848506 ], "pop" : 21801, "state" : "VA" } +{ "_id" : "22042", "city" : "MOSBY", "loc" : [ -77.19227100000001, 38.866272 ], "pop" : 28441, "state" : "VA" } +{ "_id" : "22043", "city" : "PIMMIT", "loc" : [ -77.20005, 38.901226 ], "pop" : 20928, "state" : "VA" } +{ "_id" : "22044", "city" : "SEVEN CORNERS", "loc" : [ -77.150819, 38.863544 ], "pop" : 10100, "state" : "VA" } +{ "_id" : "22046", "city" : "FALLS CHURCH", "loc" : [ -77.18023100000001, 38.88559 ], "pop" : 14864, "state" : "VA" } +{ "_id" : "22060", "city" : "FORT BELVOIR", "loc" : [ -77.143315, 38.694699 ], "pop" : 6013, "state" : "VA" } +{ "_id" : "22065", "city" : "GAINESVILLE", "loc" : [ -77.618673, 38.823192 ], "pop" : 3929, "state" : "VA" } +{ "_id" : "22066", "city" : "GREAT FALLS", "loc" : [ -77.30828700000001, 39.003893 ], "pop" : 13542, "state" : "VA" } +{ "_id" : "22068", "city" : "HAMILTON", "loc" : [ -77.663538, 39.135741 ], "pop" : 2821, "state" : "VA" } +{ "_id" : "22069", "city" : "HAYMARKET", "loc" : [ -77.647485, 38.876234 ], "pop" : 5103, "state" : "VA" } +{ "_id" : "22070", "city" : "HERNDON", "loc" : [ -77.386573, 38.977833 ], "pop" : 30669, "state" : "VA" } +{ "_id" : "22071", "city" : "HERNDON", "loc" : [ -77.395155, 38.919537 ], "pop" : 21490, "state" : "VA" } +{ "_id" : "22075", "city" : "LEESBURG", "loc" : [ -77.565918, 39.116517 ], "pop" : 21011, "state" : "VA" } +{ "_id" : "22079", "city" : "MASON NECK", "loc" : [ -77.21800399999999, 38.704716 ], "pop" : 17438, "state" : "VA" } +{ "_id" : "22080", "city" : "LOVETTSVILLE", "loc" : [ -77.639144, 39.265367 ], "pop" : 3631, "state" : "VA" } +{ "_id" : "22090", "city" : "LAKE ANNE", "loc" : [ -77.33760700000001, 38.964439 ], "pop" : 12710, "state" : "VA" } +{ "_id" : "22091", "city" : "RESTON", "loc" : [ -77.35144, 38.935007 ], "pop" : 28381, "state" : "VA" } +{ "_id" : "22094", "city" : "RESTON", "loc" : [ -77.350757, 38.975627 ], "pop" : 5491, "state" : "VA" } +{ "_id" : "22101", "city" : "MC LEAN", "loc" : [ -77.17062799999999, 38.932624 ], "pop" : 27236, "state" : "VA" } +{ "_id" : "22102", "city" : "WEST MCLEAN", "loc" : [ -77.221934, 38.936318 ], "pop" : 15809, "state" : "VA" } +{ "_id" : "22110", "city" : "MANASSAS", "loc" : [ -77.489474, 38.768922 ], "pop" : 50680, "state" : "VA" } +{ "_id" : "22111", "city" : "MANASSAS PARK", "loc" : [ -77.44568, 38.736143 ], "pop" : 32739, "state" : "VA" } +{ "_id" : "22115", "city" : "MARSHALL", "loc" : [ -77.887567, 38.831584 ], "pop" : 5195, "state" : "VA" } +{ "_id" : "22117", "city" : "MIDDLEBURG", "loc" : [ -77.735511, 38.996438 ], "pop" : 2908, "state" : "VA" } +{ "_id" : "22123", "city" : "NOKESVILLE", "loc" : [ -77.534249, 38.685015 ], "pop" : 6729, "state" : "VA" } +{ "_id" : "22124", "city" : "OAKTON", "loc" : [ -77.323345, 38.885187 ], "pop" : 13019, "state" : "VA" } +{ "_id" : "22129", "city" : "PAEONIAN SPRINGS", "loc" : [ -77.619845, 39.159792 ], "pop" : 488, "state" : "VA" } +{ "_id" : "22130", "city" : "PARIS", "loc" : [ -77.893855, 38.989926 ], "pop" : 317, "state" : "VA" } +{ "_id" : "22132", "city" : "HILLSBORO", "loc" : [ -77.721305, 39.150484 ], "pop" : 5373, "state" : "VA" } +{ "_id" : "22134", "city" : "QUANTICO", "loc" : [ -77.335819, 38.531039 ], "pop" : 9039, "state" : "VA" } +{ "_id" : "22141", "city" : "ROUND HILL", "loc" : [ -77.783305, 39.113378 ], "pop" : 1926, "state" : "VA" } +{ "_id" : "22150", "city" : "SPRINGFIELD", "loc" : [ -77.186582, 38.779718 ], "pop" : 16811, "state" : "VA" } +{ "_id" : "22151", "city" : "NORTH SPRINGFIEL", "loc" : [ -77.213908, 38.803323 ], "pop" : 15979, "state" : "VA" } +{ "_id" : "22152", "city" : "WEST SPRINGFIELD", "loc" : [ -77.233243, 38.776488 ], "pop" : 26803, "state" : "VA" } +{ "_id" : "22153", "city" : "SPRINGFIELD", "loc" : [ -77.237026, 38.744859 ], "pop" : 32161, "state" : "VA" } +{ "_id" : "22170", "city" : "STERLING", "loc" : [ -77.398624, 39.02147 ], "pop" : 38891, "state" : "VA" } +{ "_id" : "22171", "city" : "THE PLAINS", "loc" : [ -77.772092, 38.87393 ], "pop" : 2071, "state" : "VA" } +{ "_id" : "22172", "city" : "TRIANGLE", "loc" : [ -77.32287700000001, 38.550894 ], "pop" : 5181, "state" : "VA" } +{ "_id" : "22176", "city" : "UPPERVILLE", "loc" : [ -77.848438, 39.008747 ], "pop" : 755, "state" : "VA" } +{ "_id" : "22180", "city" : "VIENNA", "loc" : [ -77.253219, 38.893527 ], "pop" : 20795, "state" : "VA" } +{ "_id" : "22181", "city" : "VIENNA", "loc" : [ -77.288048, 38.897695 ], "pop" : 12462, "state" : "VA" } +{ "_id" : "22182", "city" : "VIENNA", "loc" : [ -77.264876, 38.928005 ], "pop" : 19121, "state" : "VA" } +{ "_id" : "22186", "city" : "AIRLIE", "loc" : [ -77.764809, 38.72593 ], "pop" : 24248, "state" : "VA" } +{ "_id" : "22190", "city" : "WATERFORD", "loc" : [ -77.642134, 39.208102 ], "pop" : 264, "state" : "VA" } +{ "_id" : "22191", "city" : "WOODBRIDGE", "loc" : [ -77.268264, 38.635573 ], "pop" : 30657, "state" : "VA" } +{ "_id" : "22192", "city" : "LAKERIDGE", "loc" : [ -77.305221, 38.68328 ], "pop" : 38960, "state" : "VA" } +{ "_id" : "22193", "city" : "DALE CITY", "loc" : [ -77.343238, 38.647188 ], "pop" : 47213, "state" : "VA" } +{ "_id" : "22201", "city" : "ARLINGTON", "loc" : [ -77.093197, 38.887103 ], "pop" : 22034, "state" : "VA" } +{ "_id" : "22202", "city" : "ARLINGTON", "loc" : [ -77.059228, 38.856547 ], "pop" : 17453, "state" : "VA" } +{ "_id" : "22203", "city" : "ARLINGTON", "loc" : [ -77.11419100000001, 38.873799 ], "pop" : 14553, "state" : "VA" } +{ "_id" : "22204", "city" : "ARLINGTON", "loc" : [ -77.099688, 38.858962 ], "pop" : 41844, "state" : "VA" } +{ "_id" : "22205", "city" : "ARLINGTON", "loc" : [ -77.139488, 38.883557 ], "pop" : 15285, "state" : "VA" } +{ "_id" : "22206", "city" : "ARLINGTON", "loc" : [ -77.09045999999999, 38.841508 ], "pop" : 17628, "state" : "VA" } +{ "_id" : "22207", "city" : "ARLINGTON", "loc" : [ -77.126287, 38.903321 ], "pop" : 27999, "state" : "VA" } +{ "_id" : "22209", "city" : "ARLINGTON", "loc" : [ -77.07531, 38.8926 ], "pop" : 10118, "state" : "VA" } +{ "_id" : "22211", "city" : "ARLINGTON", "loc" : [ -77.080258, 38.8795 ], "pop" : 2432, "state" : "VA" } +{ "_id" : "22213", "city" : "ARLINGTON", "loc" : [ -77.16329500000001, 38.895375 ], "pop" : 2095, "state" : "VA" } +{ "_id" : "22301", "city" : "ALEXANDRIA", "loc" : [ -77.05890100000001, 38.820042 ], "pop" : 12109, "state" : "VA" } +{ "_id" : "22302", "city" : "ALEXANDRIA", "loc" : [ -77.092412, 38.83354 ], "pop" : 17021, "state" : "VA" } +{ "_id" : "22303", "city" : "JEFFERSON MANOR", "loc" : [ -77.07660799999999, 38.791143 ], "pop" : 12662, "state" : "VA" } +{ "_id" : "22304", "city" : "ALEXANDRIA", "loc" : [ -77.12098899999999, 38.814871 ], "pop" : 33747, "state" : "VA" } +{ "_id" : "22305", "city" : "ALEXANDRIA", "loc" : [ -77.06403899999999, 38.837184 ], "pop" : 13514, "state" : "VA" } +{ "_id" : "22306", "city" : "COMMUNITY", "loc" : [ -77.08538900000001, 38.755769 ], "pop" : 24374, "state" : "VA" } +{ "_id" : "22307", "city" : "BELLE VIEW", "loc" : [ -77.062511, 38.77056 ], "pop" : 9821, "state" : "VA" } +{ "_id" : "22308", "city" : "WELLINGTON", "loc" : [ -77.06063899999999, 38.729122 ], "pop" : 12023, "state" : "VA" } +{ "_id" : "22309", "city" : "ENGLESIDE", "loc" : [ -77.10813899999999, 38.727855 ], "pop" : 27479, "state" : "VA" } +{ "_id" : "22310", "city" : "FRANCONIA", "loc" : [ -77.13170700000001, 38.769132 ], "pop" : 39438, "state" : "VA" } +{ "_id" : "22311", "city" : "ALEXANDRIA", "loc" : [ -77.119962, 38.832039 ], "pop" : 11388, "state" : "VA" } +{ "_id" : "22312", "city" : "ALEXANDRIA", "loc" : [ -77.148438, 38.819099 ], "pop" : 23848, "state" : "VA" } +{ "_id" : "22314", "city" : "ALEXANDRIA", "loc" : [ -77.05286700000001, 38.806018 ], "pop" : 20606, "state" : "VA" } +{ "_id" : "22401", "city" : "FREDERICKSBURG", "loc" : [ -77.477152, 38.299538 ], "pop" : 19027, "state" : "VA" } +{ "_id" : "22405", "city" : "FALMOUTH", "loc" : [ -77.404537, 38.314557 ], "pop" : 20039, "state" : "VA" } +{ "_id" : "22406", "city" : "FREDERICKSBURG", "loc" : [ -77.534892, 38.379627 ], "pop" : 7583, "state" : "VA" } +{ "_id" : "22407", "city" : "FREDERICKSBURG", "loc" : [ -77.547584, 38.268803 ], "pop" : 27852, "state" : "VA" } +{ "_id" : "22408", "city" : "FREDERICKSBURG", "loc" : [ -77.468068, 38.248141 ], "pop" : 9433, "state" : "VA" } +{ "_id" : "22427", "city" : "BOWLING GREEN", "loc" : [ -77.18024200000001, 38.013651 ], "pop" : 559, "state" : "VA" } +{ "_id" : "22432", "city" : "BURGESS", "loc" : [ -76.354164, 37.868682 ], "pop" : 478, "state" : "VA" } +{ "_id" : "22433", "city" : "BURR HILL", "loc" : [ -77.876166, 38.365841 ], "pop" : 121, "state" : "VA" } +{ "_id" : "22435", "city" : "CALLAO", "loc" : [ -76.573245, 37.977268 ], "pop" : 1808, "state" : "VA" } +{ "_id" : "22436", "city" : "CARET", "loc" : [ -76.915254, 37.971255 ], "pop" : 675, "state" : "VA" } +{ "_id" : "22437", "city" : "CENTER CROSS", "loc" : [ -76.75483699999999, 37.792875 ], "pop" : 408, "state" : "VA" } +{ "_id" : "22438", "city" : "CHAMPLAIN", "loc" : [ -76.971942, 38.021422 ], "pop" : 187, "state" : "VA" } +{ "_id" : "22439", "city" : "CHANCE", "loc" : [ -77.021051, 38.084061 ], "pop" : 45, "state" : "VA" } +{ "_id" : "22443", "city" : "OAK GROVE", "loc" : [ -76.98115799999999, 38.229076 ], "pop" : 6864, "state" : "VA" } +{ "_id" : "22448", "city" : "DAHLGREN", "loc" : [ -77.042905, 38.337485 ], "pop" : 1509, "state" : "VA" } +{ "_id" : "22454", "city" : "HOWERTONS", "loc" : [ -76.837022, 37.840429 ], "pop" : 1795, "state" : "VA" } +{ "_id" : "22460", "city" : "FARNHAM", "loc" : [ -76.605011, 37.873972 ], "pop" : 1356, "state" : "VA" } +{ "_id" : "22469", "city" : "HAGUE", "loc" : [ -76.661574, 38.057289 ], "pop" : 2243, "state" : "VA" } +{ "_id" : "22473", "city" : "HEATHSVILLE", "loc" : [ -76.41783, 37.907187 ], "pop" : 2670, "state" : "VA" } +{ "_id" : "22476", "city" : "HUSTLE", "loc" : [ -77.03642600000001, 38.022219 ], "pop" : 782, "state" : "VA" } +{ "_id" : "22480", "city" : "IRVINGTON", "loc" : [ -76.416016, 37.664516 ], "pop" : 717, "state" : "VA" } +{ "_id" : "22482", "city" : "KILMARNOCK", "loc" : [ -76.381986, 37.716222 ], "pop" : 1436, "state" : "VA" } +{ "_id" : "22485", "city" : "KING GEORGE", "loc" : [ -77.126023, 38.281142 ], "pop" : 9088, "state" : "VA" } +{ "_id" : "22488", "city" : "KINSALE", "loc" : [ -76.585525, 38.050472 ], "pop" : 1537, "state" : "VA" } +{ "_id" : "22503", "city" : "LANCASTER", "loc" : [ -76.5102, 37.750091 ], "pop" : 4140, "state" : "VA" } +{ "_id" : "22504", "city" : "LANEVIEW", "loc" : [ -76.711732, 37.768138 ], "pop" : 179, "state" : "VA" } +{ "_id" : "22508", "city" : "LOCUST GROVE", "loc" : [ -77.77087400000001, 38.335202 ], "pop" : 4357, "state" : "VA" } +{ "_id" : "22509", "city" : "LORETTO", "loc" : [ -76.966888, 38.062055 ], "pop" : 38, "state" : "VA" } +{ "_id" : "22511", "city" : "LOTTSBURG", "loc" : [ -76.501763, 37.979228 ], "pop" : 1250, "state" : "VA" } +{ "_id" : "22514", "city" : "MILFORD", "loc" : [ -77.31849800000001, 38.005834 ], "pop" : 3385, "state" : "VA" } +{ "_id" : "22520", "city" : "MONTROSS", "loc" : [ -76.78280599999999, 38.110483 ], "pop" : 4836, "state" : "VA" } +{ "_id" : "22534", "city" : "PARTLOW", "loc" : [ -77.658574, 38.064146 ], "pop" : 2057, "state" : "VA" } +{ "_id" : "22535", "city" : "PORT ROYAL", "loc" : [ -77.183657, 38.162088 ], "pop" : 421, "state" : "VA" } +{ "_id" : "22538", "city" : "RAPPAHANNOCK ACA", "loc" : [ -77.287437, 38.201817 ], "pop" : 637, "state" : "VA" } +{ "_id" : "22539", "city" : "REEDVILLE", "loc" : [ -76.282864, 37.856964 ], "pop" : 2037, "state" : "VA" } +{ "_id" : "22542", "city" : "RHOADESVILLE", "loc" : [ -77.923044, 38.286324 ], "pop" : 1072, "state" : "VA" } +{ "_id" : "22546", "city" : "RUTHER GLEN", "loc" : [ -77.47135, 37.945059 ], "pop" : 7242, "state" : "VA" } +{ "_id" : "22553", "city" : "SNELL", "loc" : [ -77.64868800000001, 38.19953 ], "pop" : 17034, "state" : "VA" } +{ "_id" : "22554", "city" : "STAFFORD", "loc" : [ -77.430618, 38.458629 ], "pop" : 36544, "state" : "VA" } +{ "_id" : "22559", "city" : "SUPPLY", "loc" : [ -77.109689, 38.082544 ], "pop" : 387, "state" : "VA" } +{ "_id" : "22560", "city" : "TAPPAHANNOCK", "loc" : [ -76.91245499999999, 37.914551 ], "pop" : 4270, "state" : "VA" } +{ "_id" : "22567", "city" : "UNIONVILLE", "loc" : [ -77.919299, 38.238302 ], "pop" : 1754, "state" : "VA" } +{ "_id" : "22568", "city" : "MINE RUN", "loc" : [ -77.81949299999999, 38.266106 ], "pop" : 314, "state" : "VA" } +{ "_id" : "22572", "city" : "NOMINI GROVE", "loc" : [ -76.73651700000001, 37.949992 ], "pop" : 5917, "state" : "VA" } +{ "_id" : "22576", "city" : "WEEMS", "loc" : [ -76.43132300000001, 37.684678 ], "pop" : 2125, "state" : "VA" } +{ "_id" : "22578", "city" : "WINDMILL POINT", "loc" : [ -76.36862600000001, 37.647458 ], "pop" : 2474, "state" : "VA" } +{ "_id" : "22579", "city" : "WICOMICO CHURCH", "loc" : [ -76.356522, 37.779027 ], "pop" : 2285, "state" : "VA" } +{ "_id" : "22580", "city" : "WOODFORD", "loc" : [ -77.439879, 38.084664 ], "pop" : 6047, "state" : "VA" } +{ "_id" : "22601", "city" : "WINCHESTER", "loc" : [ -78.182697, 39.185803 ], "pop" : 45537, "state" : "VA" } +{ "_id" : "22610", "city" : "BROWNTOWN", "loc" : [ -78.279111, 38.827272 ], "pop" : 1522, "state" : "VA" } +{ "_id" : "22611", "city" : "BERRYVILLE", "loc" : [ -77.96875900000001, 39.153178 ], "pop" : 8339, "state" : "VA" } +{ "_id" : "22620", "city" : "BOYCE", "loc" : [ -78.020302, 39.069797 ], "pop" : 2984, "state" : "VA" } +{ "_id" : "22624", "city" : "CLEAR BROOK", "loc" : [ -78.098788, 39.265461 ], "pop" : 2656, "state" : "VA" } +{ "_id" : "22625", "city" : "WHITACRE", "loc" : [ -78.299724, 39.3762 ], "pop" : 1229, "state" : "VA" } +{ "_id" : "22627", "city" : "FLINT HILL", "loc" : [ -78.075558, 38.733653 ], "pop" : 276, "state" : "VA" } +{ "_id" : "22630", "city" : "FRONT ROYAL", "loc" : [ -78.17961699999999, 38.926783 ], "pop" : 22951, "state" : "VA" } +{ "_id" : "22637", "city" : "GORE", "loc" : [ -78.34168699999999, 39.288685 ], "pop" : 2000, "state" : "VA" } +{ "_id" : "22639", "city" : "HUME", "loc" : [ -77.99489199999999, 38.827318 ], "pop" : 517, "state" : "VA" } +{ "_id" : "22640", "city" : "HUNTLY", "loc" : [ -78.130104, 38.813333 ], "pop" : 782, "state" : "VA" } +{ "_id" : "22641", "city" : "LEBANON CHURCH", "loc" : [ -78.359511, 39.056242 ], "pop" : 1075, "state" : "VA" } +{ "_id" : "22642", "city" : "LINDEN", "loc" : [ -78.047847, 38.881181 ], "pop" : 352, "state" : "VA" } +{ "_id" : "22643", "city" : "MARKHAM", "loc" : [ -77.994252, 38.930001 ], "pop" : 429, "state" : "VA" } +{ "_id" : "22644", "city" : "MAURERTOWN", "loc" : [ -78.46581500000001, 38.944052 ], "pop" : 1483, "state" : "VA" } +{ "_id" : "22645", "city" : "MIDDLETOWN", "loc" : [ -78.28145499999999, 39.036676 ], "pop" : 2239, "state" : "VA" } +{ "_id" : "22649", "city" : "RELIANCE", "loc" : [ -78.249152, 39.000946 ], "pop" : 145, "state" : "VA" } +{ "_id" : "22650", "city" : "RILEYVILLE", "loc" : [ -78.387326, 38.756374 ], "pop" : 997, "state" : "VA" } +{ "_id" : "22652", "city" : "SAINT DAVIDS CHU", "loc" : [ -78.439989, 38.827683 ], "pop" : 1004, "state" : "VA" } +{ "_id" : "22654", "city" : "STAR TANNERY", "loc" : [ -78.43430600000001, 39.090803 ], "pop" : 332, "state" : "VA" } +{ "_id" : "22655", "city" : "STEPHENS CITY", "loc" : [ -78.19067699999999, 39.083415 ], "pop" : 10954, "state" : "VA" } +{ "_id" : "22656", "city" : "STEPHENSON", "loc" : [ -78.094105, 39.197285 ], "pop" : 2721, "state" : "VA" } +{ "_id" : "22657", "city" : "STRASBURG", "loc" : [ -78.33862000000001, 38.988417 ], "pop" : 5756, "state" : "VA" } +{ "_id" : "22660", "city" : "TOMS BROOK", "loc" : [ -78.403757, 38.97016 ], "pop" : 2796, "state" : "VA" } +{ "_id" : "22663", "city" : "WHITE POST", "loc" : [ -78.11046, 39.057956 ], "pop" : 778, "state" : "VA" } +{ "_id" : "22664", "city" : "WOODSTOCK", "loc" : [ -78.521704, 38.887024 ], "pop" : 6899, "state" : "VA" } +{ "_id" : "22701", "city" : "RACCOON FORD", "loc" : [ -78.00406, 38.48115 ], "pop" : 21359, "state" : "VA" } +{ "_id" : "22709", "city" : "ARODA", "loc" : [ -78.236615, 38.325626 ], "pop" : 1509, "state" : "VA" } +{ "_id" : "22712", "city" : "MORRISVILLE", "loc" : [ -77.800436, 38.569667 ], "pop" : 3863, "state" : "VA" } +{ "_id" : "22713", "city" : "BOSTON", "loc" : [ -78.142285, 38.538241 ], "pop" : 557, "state" : "VA" } +{ "_id" : "22714", "city" : "BRANDY STATION", "loc" : [ -77.903745, 38.511003 ], "pop" : 721, "state" : "VA" } +{ "_id" : "22715", "city" : "BRIGHTWOOD", "loc" : [ -78.16980100000001, 38.411365 ], "pop" : 1048, "state" : "VA" } +{ "_id" : "22716", "city" : "CASTLETON", "loc" : [ -78.120801, 38.603235 ], "pop" : 536, "state" : "VA" } +{ "_id" : "22718", "city" : "ELKWOOD", "loc" : [ -77.817031, 38.465229 ], "pop" : 414, "state" : "VA" } +{ "_id" : "22719", "city" : "ETLAN", "loc" : [ -78.26379300000001, 38.509458 ], "pop" : 167, "state" : "VA" } +{ "_id" : "22720", "city" : "GOLDVEIN", "loc" : [ -77.639488, 38.488641 ], "pop" : 1154, "state" : "VA" } +{ "_id" : "22722", "city" : "HAYWOOD", "loc" : [ -78.179759, 38.46861 ], "pop" : 139, "state" : "VA" } +{ "_id" : "22724", "city" : "JEFFERSONTON", "loc" : [ -77.906943, 38.625578 ], "pop" : 1000, "state" : "VA" } +{ "_id" : "22725", "city" : "LEON", "loc" : [ -78.154579, 38.45724 ], "pop" : 109, "state" : "VA" } +{ "_id" : "22726", "city" : "LIGNUM", "loc" : [ -77.82995699999999, 38.395625 ], "pop" : 176, "state" : "VA" } +{ "_id" : "22727", "city" : "AYLOR", "loc" : [ -78.296458, 38.384495 ], "pop" : 4344, "state" : "VA" } +{ "_id" : "22728", "city" : "MIDLAND", "loc" : [ -77.712709, 38.567061 ], "pop" : 1847, "state" : "VA" } +{ "_id" : "22729", "city" : "MITCHELLS", "loc" : [ -78.01054600000001, 38.374429 ], "pop" : 39, "state" : "VA" } +{ "_id" : "22731", "city" : "PRATTS", "loc" : [ -78.272212, 38.349207 ], "pop" : 88, "state" : "VA" } +{ "_id" : "22732", "city" : "RADIANT", "loc" : [ -78.179799, 38.322706 ], "pop" : 756, "state" : "VA" } +{ "_id" : "22733", "city" : "RAPIDAN", "loc" : [ -78.047607, 38.339217 ], "pop" : 1216, "state" : "VA" } +{ "_id" : "22734", "city" : "REMINGTON", "loc" : [ -77.761365, 38.535091 ], "pop" : 2377, "state" : "VA" } +{ "_id" : "22735", "city" : "REVA", "loc" : [ -78.157195, 38.460446 ], "pop" : 2134, "state" : "VA" } +{ "_id" : "22736", "city" : "RICHARDSVILLE", "loc" : [ -77.71951900000001, 38.392388 ], "pop" : 238, "state" : "VA" } +{ "_id" : "22737", "city" : "RIXEYVILLE", "loc" : [ -78.028229, 38.585168 ], "pop" : 2540, "state" : "VA" } +{ "_id" : "22738", "city" : "UNO", "loc" : [ -78.26535800000001, 38.274342 ], "pop" : 477, "state" : "VA" } +{ "_id" : "22740", "city" : "SPERRYVILLE", "loc" : [ -78.246571, 38.620252 ], "pop" : 1553, "state" : "VA" } +{ "_id" : "22741", "city" : "STEVENSBURG", "loc" : [ -77.88423, 38.444135 ], "pop" : 220, "state" : "VA" } +{ "_id" : "22742", "city" : "SUMERDUCK", "loc" : [ -77.70435999999999, 38.467355 ], "pop" : 1146, "state" : "VA" } +{ "_id" : "22743", "city" : "SYRIA", "loc" : [ -78.32293900000001, 38.497229 ], "pop" : 526, "state" : "VA" } +{ "_id" : "22746", "city" : "VIEWTOWN", "loc" : [ -78.025769, 38.645704 ], "pop" : 172, "state" : "VA" } +{ "_id" : "22747", "city" : "WASHINGTON", "loc" : [ -78.1566, 38.707838 ], "pop" : 1448, "state" : "VA" } +{ "_id" : "22749", "city" : "WOODVILLE", "loc" : [ -78.173855, 38.648176 ], "pop" : 371, "state" : "VA" } +{ "_id" : "22801", "city" : "HARRISONBURG", "loc" : [ -78.871438, 38.448864 ], "pop" : 42027, "state" : "VA" } +{ "_id" : "22810", "city" : "BASYE", "loc" : [ -78.767363, 38.795806 ], "pop" : 43, "state" : "VA" } +{ "_id" : "22811", "city" : "BERGTON", "loc" : [ -78.966752, 38.792509 ], "pop" : 341, "state" : "VA" } +{ "_id" : "22812", "city" : "BRIDGEWATER", "loc" : [ -78.993684, 38.385866 ], "pop" : 7160, "state" : "VA" } +{ "_id" : "22815", "city" : "BROADWAY", "loc" : [ -78.787494, 38.608336 ], "pop" : 7106, "state" : "VA" } +{ "_id" : "22820", "city" : "CRIDERS", "loc" : [ -78.99735699999999, 38.749656 ], "pop" : 445, "state" : "VA" } +{ "_id" : "22821", "city" : "MONTEZUMA", "loc" : [ -78.993731, 38.433864 ], "pop" : 4777, "state" : "VA" } +{ "_id" : "22824", "city" : "EDINBURG", "loc" : [ -78.60033, 38.843206 ], "pop" : 5079, "state" : "VA" } +{ "_id" : "22827", "city" : "ELKTON", "loc" : [ -78.632143, 38.40252 ], "pop" : 10331, "state" : "VA" } +{ "_id" : "22830", "city" : "FULKS RUN", "loc" : [ -78.935799, 38.633871 ], "pop" : 1255, "state" : "VA" } +{ "_id" : "22831", "city" : "HINTON", "loc" : [ -79.01008400000001, 38.483378 ], "pop" : 798, "state" : "VA" } +{ "_id" : "22832", "city" : "KEEZLETOWN", "loc" : [ -78.77699800000001, 38.439588 ], "pop" : 1204, "state" : "VA" } +{ "_id" : "22834", "city" : "LINVILLE", "loc" : [ -78.896102, 38.555733 ], "pop" : 1866, "state" : "VA" } +{ "_id" : "22835", "city" : "LURAY", "loc" : [ -78.459559, 38.654839 ], "pop" : 10559, "state" : "VA" } +{ "_id" : "22840", "city" : "MC GAHEYSVILLE", "loc" : [ -78.741128, 38.371228 ], "pop" : 2100, "state" : "VA" } +{ "_id" : "22841", "city" : "MOUNT CRAWFORD", "loc" : [ -78.895679, 38.345656 ], "pop" : 2070, "state" : "VA" } +{ "_id" : "22842", "city" : "CONICVILLE", "loc" : [ -78.676655, 38.768819 ], "pop" : 4601, "state" : "VA" } +{ "_id" : "22843", "city" : "MOUNT SOLON", "loc" : [ -79.10283200000001, 38.332755 ], "pop" : 1995, "state" : "VA" } +{ "_id" : "22844", "city" : "NEW MARKET", "loc" : [ -78.67143299999999, 38.660555 ], "pop" : 3502, "state" : "VA" } +{ "_id" : "22845", "city" : "ORKNEY SPRINGS", "loc" : [ -78.811106, 38.793708 ], "pop" : 266, "state" : "VA" } +{ "_id" : "22846", "city" : "MONTEVIDEO", "loc" : [ -78.79790300000001, 38.369729 ], "pop" : 704, "state" : "VA" } +{ "_id" : "22847", "city" : "SHENANDOAH CAVER", "loc" : [ -78.698866, 38.714443 ], "pop" : 352, "state" : "VA" } +{ "_id" : "22849", "city" : "SHENANDOAH", "loc" : [ -78.608975, 38.501034 ], "pop" : 5174, "state" : "VA" } +{ "_id" : "22851", "city" : "STANLEY", "loc" : [ -78.509263, 38.566036 ], "pop" : 4604, "state" : "VA" } +{ "_id" : "22853", "city" : "TIMBERVILLE", "loc" : [ -78.771702, 38.647606 ], "pop" : 3494, "state" : "VA" } +{ "_id" : "22901", "city" : "CHARLOTTESVILLE", "loc" : [ -78.490869, 38.054752 ], "pop" : 62708, "state" : "VA" } +{ "_id" : "22903", "city" : "UNIVERSITY", "loc" : [ -78.505758, 38.032728 ], "pop" : 25301, "state" : "VA" } +{ "_id" : "22920", "city" : "AFTON", "loc" : [ -78.84104600000001, 37.962624 ], "pop" : 2783, "state" : "VA" } +{ "_id" : "22922", "city" : "TYE RIVER", "loc" : [ -78.91847300000001, 37.687713 ], "pop" : 1439, "state" : "VA" } +{ "_id" : "22923", "city" : "BURNLEYS", "loc" : [ -78.31271599999999, 38.199648 ], "pop" : 1389, "state" : "VA" } +{ "_id" : "22929", "city" : "COBHAM", "loc" : [ -78.37849, 38.037835 ], "pop" : 45, "state" : "VA" } +{ "_id" : "22931", "city" : "COVESVILLE", "loc" : [ -78.71274099999999, 37.907974 ], "pop" : 304, "state" : "VA" } +{ "_id" : "22932", "city" : "YANCEY MILLS", "loc" : [ -78.70440499999999, 38.081288 ], "pop" : 4292, "state" : "VA" } +{ "_id" : "22935", "city" : "BOONESVILLE", "loc" : [ -78.55461200000001, 38.253276 ], "pop" : 566, "state" : "VA" } +{ "_id" : "22936", "city" : "EARLYSVILLE", "loc" : [ -78.491945, 38.157761 ], "pop" : 4294, "state" : "VA" } +{ "_id" : "22937", "city" : "ESMONT", "loc" : [ -78.610646, 37.812543 ], "pop" : 1157, "state" : "VA" } +{ "_id" : "22938", "city" : "FABER", "loc" : [ -78.756495, 37.847545 ], "pop" : 958, "state" : "VA" } +{ "_id" : "22939", "city" : "WOODROW WILSON", "loc" : [ -78.969579, 38.097361 ], "pop" : 1374, "state" : "VA" } +{ "_id" : "22940", "city" : "MISSION HOME", "loc" : [ -78.595906, 38.206217 ], "pop" : 1023, "state" : "VA" } +{ "_id" : "22942", "city" : "CASHS CORNER", "loc" : [ -78.195195, 38.107261 ], "pop" : 5852, "state" : "VA" } +{ "_id" : "22943", "city" : "GREENWOOD", "loc" : [ -78.783282, 38.041545 ], "pop" : 516, "state" : "VA" } +{ "_id" : "22946", "city" : "KEENE", "loc" : [ -78.561386, 37.931273 ], "pop" : 26, "state" : "VA" } +{ "_id" : "22947", "city" : "BOYD TAVERN", "loc" : [ -78.340429, 38.001265 ], "pop" : 2081, "state" : "VA" } +{ "_id" : "22948", "city" : "LOCUST DALE", "loc" : [ -78.10157599999999, 38.334043 ], "pop" : 155, "state" : "VA" } +{ "_id" : "22949", "city" : "LOVINGSTON", "loc" : [ -78.868433, 37.792405 ], "pop" : 1459, "state" : "VA" } +{ "_id" : "22951", "city" : "LOWESVILLE", "loc" : [ -79.08334600000001, 37.749797 ], "pop" : 175, "state" : "VA" } +{ "_id" : "22952", "city" : "SHERANDO", "loc" : [ -78.95150599999999, 37.997903 ], "pop" : 2267, "state" : "VA" } +{ "_id" : "22958", "city" : "WINTERGREEN", "loc" : [ -78.89397200000001, 37.860398 ], "pop" : 53, "state" : "VA" } +{ "_id" : "22959", "city" : "ALBERENE", "loc" : [ -78.695414, 37.961992 ], "pop" : 3134, "state" : "VA" } +{ "_id" : "22960", "city" : "MONTFORD", "loc" : [ -78.091224, 38.233937 ], "pop" : 8781, "state" : "VA" } +{ "_id" : "22963", "city" : "BYBEE", "loc" : [ -78.297983, 37.881807 ], "pop" : 5689, "state" : "VA" } +{ "_id" : "22964", "city" : "PINEY RIVER", "loc" : [ -79.020571, 37.715785 ], "pop" : 257, "state" : "VA" } +{ "_id" : "22967", "city" : "ROSELAND", "loc" : [ -78.97117299999999, 37.807697 ], "pop" : 2333, "state" : "VA" } +{ "_id" : "22968", "city" : "ADVANCE MILLS", "loc" : [ -78.39103299999999, 38.233871 ], "pop" : 5764, "state" : "VA" } +{ "_id" : "22969", "city" : "SCHUYLER", "loc" : [ -78.692475, 37.797584 ], "pop" : 1128, "state" : "VA" } +{ "_id" : "22971", "city" : "ROCKFISH", "loc" : [ -78.824608, 37.747974 ], "pop" : 1100, "state" : "VA" } +{ "_id" : "22972", "city" : "SOMERSET", "loc" : [ -78.25042000000001, 38.204657 ], "pop" : 720, "state" : "VA" } +{ "_id" : "22973", "city" : "GEER", "loc" : [ -78.470755, 38.302556 ], "pop" : 4114, "state" : "VA" } +{ "_id" : "22974", "city" : "TROY", "loc" : [ -78.253494, 37.9636 ], "pop" : 1868, "state" : "VA" } +{ "_id" : "22980", "city" : "WAYNESBORO", "loc" : [ -78.90346099999999, 38.077412 ], "pop" : 26450, "state" : "VA" } +{ "_id" : "23002", "city" : "AMELIA COURT HOU", "loc" : [ -77.95517700000001, 37.35017 ], "pop" : 6923, "state" : "VA" } +{ "_id" : "23004", "city" : "ARVONIA", "loc" : [ -78.38888, 37.671355 ], "pop" : 1114, "state" : "VA" } +{ "_id" : "23005", "city" : "ASHLAND", "loc" : [ -77.478373, 37.73948 ], "pop" : 14800, "state" : "VA" } +{ "_id" : "23009", "city" : "AYLETT", "loc" : [ -77.188473, 37.822113 ], "pop" : 1374, "state" : "VA" } +{ "_id" : "23011", "city" : "BARHAMSVILLE", "loc" : [ -76.832097, 37.461662 ], "pop" : 698, "state" : "VA" } +{ "_id" : "23015", "city" : "BEAVERDAM", "loc" : [ -77.63082900000001, 37.903767 ], "pop" : 2328, "state" : "VA" } +{ "_id" : "23016", "city" : "BEAVERLETT", "loc" : [ -76.322425, 37.41587 ], "pop" : 262, "state" : "VA" } +{ "_id" : "23021", "city" : "BOHANNON", "loc" : [ -76.36136, 37.390457 ], "pop" : 143, "state" : "VA" } +{ "_id" : "23022", "city" : "BREMO BLUFF", "loc" : [ -78.26715799999999, 37.745256 ], "pop" : 1058, "state" : "VA" } +{ "_id" : "23023", "city" : "BRUINGTON", "loc" : [ -76.94019900000001, 37.780112 ], "pop" : 172, "state" : "VA" } +{ "_id" : "23024", "city" : "BUMPASS", "loc" : [ -77.79661400000001, 37.898381 ], "pop" : 4399, "state" : "VA" } +{ "_id" : "23025", "city" : "MILES", "loc" : [ -76.393959, 37.427339 ], "pop" : 39, "state" : "VA" } +{ "_id" : "23027", "city" : "TAMWORTH", "loc" : [ -78.128699, 37.641314 ], "pop" : 1143, "state" : "VA" } +{ "_id" : "23029", "city" : "CAUTHORNVILLE", "loc" : [ -77.039625, 37.858957 ], "pop" : 380, "state" : "VA" } +{ "_id" : "23030", "city" : "CHARLES CITY", "loc" : [ -77.108183, 37.366271 ], "pop" : 4216, "state" : "VA" } +{ "_id" : "23032", "city" : "CHURCH VIEW", "loc" : [ -76.66287, 37.674956 ], "pop" : 493, "state" : "VA" } +{ "_id" : "23037", "city" : "COLOGNE", "loc" : [ -76.683356, 37.555866 ], "pop" : 95, "state" : "VA" } +{ "_id" : "23038", "city" : "COLUMBIA", "loc" : [ -78.17940299999999, 37.714707 ], "pop" : 641, "state" : "VA" } +{ "_id" : "23039", "city" : "CROZIER", "loc" : [ -77.793958, 37.671764 ], "pop" : 937, "state" : "VA" } +{ "_id" : "23040", "city" : "CUMBERLAND", "loc" : [ -78.258149, 37.501861 ], "pop" : 3429, "state" : "VA" } +{ "_id" : "23043", "city" : "DELTAVILLE", "loc" : [ -76.34678099999999, 37.554852 ], "pop" : 1565, "state" : "VA" } +{ "_id" : "23045", "city" : "DIGGS", "loc" : [ -76.287172, 37.436273 ], "pop" : 491, "state" : "VA" } +{ "_id" : "23047", "city" : "DOSWELL", "loc" : [ -77.51252100000001, 37.841682 ], "pop" : 2111, "state" : "VA" } +{ "_id" : "23050", "city" : "DUTTON", "loc" : [ -76.435782, 37.486897 ], "pop" : 416, "state" : "VA" } +{ "_id" : "23055", "city" : "FORK UNION", "loc" : [ -78.23549800000001, 37.771526 ], "pop" : 620, "state" : "VA" } +{ "_id" : "23060", "city" : "GLEN ALLEN", "loc" : [ -77.53401599999999, 37.662848 ], "pop" : 19953, "state" : "VA" } +{ "_id" : "23061", "city" : "PINERO", "loc" : [ -76.55331200000001, 37.41922 ], "pop" : 14924, "state" : "VA" } +{ "_id" : "23062", "city" : "GLOUCESTER POINT", "loc" : [ -76.49585999999999, 37.258534 ], "pop" : 2558, "state" : "VA" } +{ "_id" : "23063", "city" : "GOOCHLAND", "loc" : [ -78.011216, 37.768789 ], "pop" : 4772, "state" : "VA" } +{ "_id" : "23065", "city" : "GUM SPRING", "loc" : [ -77.907049, 37.818374 ], "pop" : 480, "state" : "VA" } +{ "_id" : "23066", "city" : "GWYNN", "loc" : [ -76.29042, 37.500594 ], "pop" : 681, "state" : "VA" } +{ "_id" : "23069", "city" : "HANOVER", "loc" : [ -77.321572, 37.770116 ], "pop" : 3796, "state" : "VA" } +{ "_id" : "23070", "city" : "HARDYVILLE", "loc" : [ -76.418937, 37.547821 ], "pop" : 546, "state" : "VA" } +{ "_id" : "23071", "city" : "HARTFIELD", "loc" : [ -76.476949, 37.559437 ], "pop" : 797, "state" : "VA" } +{ "_id" : "23072", "city" : "HAYES", "loc" : [ -76.49045700000001, 37.291577 ], "pop" : 11051, "state" : "VA" } +{ "_id" : "23075", "city" : "HIGHLAND SPRINGS", "loc" : [ -77.32261, 37.543723 ], "pop" : 9373, "state" : "VA" } +{ "_id" : "23079", "city" : "JAMAICA", "loc" : [ -76.688962, 37.729997 ], "pop" : 383, "state" : "VA" } +{ "_id" : "23080", "city" : "JAMES STORE", "loc" : [ -76.464972, 37.480594 ], "pop" : 795, "state" : "VA" } +{ "_id" : "23083", "city" : "JETERSVILLE", "loc" : [ -78.104011, 37.31757 ], "pop" : 1396, "state" : "VA" } +{ "_id" : "23084", "city" : "KENTS STORE", "loc" : [ -78.12077600000001, 37.89425 ], "pop" : 882, "state" : "VA" } +{ "_id" : "23085", "city" : "KING AND QUEEN C", "loc" : [ -76.86305900000001, 37.717644 ], "pop" : 548, "state" : "VA" } +{ "_id" : "23086", "city" : "KING WILLIAM", "loc" : [ -77.09983699999999, 37.720194 ], "pop" : 3887, "state" : "VA" } +{ "_id" : "23089", "city" : "LANEXA", "loc" : [ -76.90268399999999, 37.419391 ], "pop" : 3609, "state" : "VA" } +{ "_id" : "23091", "city" : "LITTLE PLYMOUTH", "loc" : [ -76.825456, 37.664218 ], "pop" : 103, "state" : "VA" } +{ "_id" : "23092", "city" : "LOCUST HILL", "loc" : [ -76.501857, 37.598328 ], "pop" : 375, "state" : "VA" } +{ "_id" : "23093", "city" : "LOUISA", "loc" : [ -78.034666, 38.01317 ], "pop" : 7503, "state" : "VA" } +{ "_id" : "23102", "city" : "DABNEYS", "loc" : [ -77.871032, 37.703193 ], "pop" : 2927, "state" : "VA" } +{ "_id" : "23103", "city" : "MANAKIN SABOT", "loc" : [ -77.70769900000001, 37.638036 ], "pop" : 5177, "state" : "VA" } +{ "_id" : "23106", "city" : "MANQUIN", "loc" : [ -77.186016, 37.718441 ], "pop" : 628, "state" : "VA" } +{ "_id" : "23108", "city" : "MASCOT", "loc" : [ -76.73832400000001, 37.60683 ], "pop" : 104, "state" : "VA" } +{ "_id" : "23109", "city" : "MATHEWS", "loc" : [ -76.354416, 37.438349 ], "pop" : 760, "state" : "VA" } +{ "_id" : "23110", "city" : "SHANGHAI", "loc" : [ -76.78398, 37.641698 ], "pop" : 331, "state" : "VA" } +{ "_id" : "23111", "city" : "MECHANICSVILLE", "loc" : [ -77.33946400000001, 37.628146 ], "pop" : 35675, "state" : "VA" } +{ "_id" : "23112", "city" : "MIDLOTHIAN", "loc" : [ -77.65445800000001, 37.431027 ], "pop" : 24114, "state" : "VA" } +{ "_id" : "23113", "city" : "MIDLOTHIAN", "loc" : [ -77.642864, 37.510893 ], "pop" : 21858, "state" : "VA" } +{ "_id" : "23117", "city" : "MINERAL", "loc" : [ -77.878069, 37.998609 ], "pop" : 5080, "state" : "VA" } +{ "_id" : "23118", "city" : "MOBJACK", "loc" : [ -76.355244, 37.377579 ], "pop" : 204, "state" : "VA" } +{ "_id" : "23119", "city" : "MOON", "loc" : [ -76.306472, 37.449276 ], "pop" : 629, "state" : "VA" } +{ "_id" : "23120", "city" : "MOSELEY", "loc" : [ -77.758458, 37.426026 ], "pop" : 1852, "state" : "VA" } +{ "_id" : "23123", "city" : "NEW CANTON", "loc" : [ -78.31123100000001, 37.664499 ], "pop" : 1546, "state" : "VA" } +{ "_id" : "23124", "city" : "NEW KENT", "loc" : [ -77.074242, 37.553013 ], "pop" : 1376, "state" : "VA" } +{ "_id" : "23125", "city" : "NEW POINT", "loc" : [ -76.28346500000001, 37.349291 ], "pop" : 153, "state" : "VA" } +{ "_id" : "23126", "city" : "NEWTOWN", "loc" : [ -77.11382500000001, 37.878236 ], "pop" : 926, "state" : "VA" } +{ "_id" : "23128", "city" : "NORTH", "loc" : [ -76.370661, 37.477066 ], "pop" : 1621, "state" : "VA" } +{ "_id" : "23129", "city" : "OILVILLE", "loc" : [ -77.769955, 37.708879 ], "pop" : 198, "state" : "VA" } +{ "_id" : "23130", "city" : "ONEMO", "loc" : [ -76.294056, 37.398517 ], "pop" : 582, "state" : "VA" } +{ "_id" : "23138", "city" : "BAVON", "loc" : [ -76.304463, 37.374252 ], "pop" : 475, "state" : "VA" } +{ "_id" : "23139", "city" : "POWHATAN", "loc" : [ -77.879761, 37.556442 ], "pop" : 14488, "state" : "VA" } +{ "_id" : "23140", "city" : "PROVIDENCE FORGE", "loc" : [ -77.071117, 37.425907 ], "pop" : 3211, "state" : "VA" } +{ "_id" : "23141", "city" : "QUINTON", "loc" : [ -77.148607, 37.518466 ], "pop" : 4589, "state" : "VA" } +{ "_id" : "23146", "city" : "ROCKVILLE", "loc" : [ -77.699994, 37.733729 ], "pop" : 1872, "state" : "VA" } +{ "_id" : "23148", "city" : "INDIAN NECK", "loc" : [ -77.08420599999999, 37.905052 ], "pop" : 191, "state" : "VA" } +{ "_id" : "23149", "city" : "SALUDA", "loc" : [ -76.592082, 37.594944 ], "pop" : 3215, "state" : "VA" } +{ "_id" : "23150", "city" : "SANDSTON", "loc" : [ -77.27578, 37.515658 ], "pop" : 9402, "state" : "VA" } +{ "_id" : "23153", "city" : "SANDY HOOK", "loc" : [ -77.90455300000001, 37.751892 ], "pop" : 152, "state" : "VA" } +{ "_id" : "23156", "city" : "PLAIN VIEW", "loc" : [ -76.726901, 37.569811 ], "pop" : 696, "state" : "VA" } +{ "_id" : "23161", "city" : "STEVENSVILLE", "loc" : [ -76.935228, 37.714577 ], "pop" : 59, "state" : "VA" } +{ "_id" : "23163", "city" : "SHADOW", "loc" : [ -76.318617, 37.361945 ], "pop" : 309, "state" : "VA" } +{ "_id" : "23168", "city" : "TOANO", "loc" : [ -76.82526300000001, 37.39013 ], "pop" : 2784, "state" : "VA" } +{ "_id" : "23169", "city" : "SYRINGA", "loc" : [ -76.454876, 37.597824 ], "pop" : 706, "state" : "VA" } +{ "_id" : "23175", "city" : "REMLIK", "loc" : [ -76.612611, 37.655003 ], "pop" : 698, "state" : "VA" } +{ "_id" : "23176", "city" : "WAKE", "loc" : [ -76.432327, 37.568077 ], "pop" : 368, "state" : "VA" } +{ "_id" : "23177", "city" : "WALKERTON", "loc" : [ -77.018475, 37.755437 ], "pop" : 1152, "state" : "VA" } +{ "_id" : "23179", "city" : "WARNER", "loc" : [ -76.64616700000001, 37.651127 ], "pop" : 37, "state" : "VA" } +{ "_id" : "23180", "city" : "WATER VIEW", "loc" : [ -76.62268, 37.710486 ], "pop" : 273, "state" : "VA" } +{ "_id" : "23181", "city" : "WEST POINT", "loc" : [ -76.82373, 37.555604 ], "pop" : 4365, "state" : "VA" } +{ "_id" : "23185", "city" : "MERRIMAC", "loc" : [ -76.701686, 37.262698 ], "pop" : 34777, "state" : "VA" } +{ "_id" : "23188", "city" : "WILLIAMSBURG", "loc" : [ -76.763424, 37.317768 ], "pop" : 14957, "state" : "VA" } +{ "_id" : "23192", "city" : "MONTPELIER", "loc" : [ -77.692441, 37.817729 ], "pop" : 4472, "state" : "VA" } +{ "_id" : "23219", "city" : "RICHMOND", "loc" : [ -77.437798, 37.546265 ], "pop" : 2780, "state" : "VA" } +{ "_id" : "23220", "city" : "RICHMOND", "loc" : [ -77.458798, 37.549808 ], "pop" : 29776, "state" : "VA" } +{ "_id" : "23221", "city" : "RICHMOND", "loc" : [ -77.4845, 37.558301 ], "pop" : 14452, "state" : "VA" } +{ "_id" : "23222", "city" : "RICHMOND", "loc" : [ -77.426725, 37.574802 ], "pop" : 30214, "state" : "VA" } +{ "_id" : "23223", "city" : "RICHMOND", "loc" : [ -77.394772, 37.547721 ], "pop" : 42379, "state" : "VA" } +{ "_id" : "23224", "city" : "RICHMOND", "loc" : [ -77.471014, 37.495512 ], "pop" : 32681, "state" : "VA" } +{ "_id" : "23225", "city" : "RICHMOND", "loc" : [ -77.50470900000001, 37.515842 ], "pop" : 37289, "state" : "VA" } +{ "_id" : "23226", "city" : "RICHMOND", "loc" : [ -77.519657, 37.582473 ], "pop" : 18085, "state" : "VA" } +{ "_id" : "23227", "city" : "BELLEVUE", "loc" : [ -77.446309, 37.604181 ], "pop" : 21661, "state" : "VA" } +{ "_id" : "23228", "city" : "LAKESIDE", "loc" : [ -77.493308, 37.623503 ], "pop" : 30611, "state" : "VA" } +{ "_id" : "23229", "city" : "REGENCY", "loc" : [ -77.566202, 37.596351 ], "pop" : 32028, "state" : "VA" } +{ "_id" : "23230", "city" : "WEST END", "loc" : [ -77.49682799999999, 37.588376 ], "pop" : 6447, "state" : "VA" } +{ "_id" : "23231", "city" : "RICHMOND", "loc" : [ -77.368002, 37.491529 ], "pop" : 23773, "state" : "VA" } +{ "_id" : "23233", "city" : "RIDGE", "loc" : [ -77.61493299999999, 37.619354 ], "pop" : 32811, "state" : "VA" } +{ "_id" : "23234", "city" : "AMPTHILL", "loc" : [ -77.469798, 37.453158 ], "pop" : 36331, "state" : "VA" } +{ "_id" : "23235", "city" : "BON AIR", "loc" : [ -77.56510299999999, 37.512034 ], "pop" : 30860, "state" : "VA" } +{ "_id" : "23236", "city" : "RICHMOND", "loc" : [ -77.585413, 37.478165 ], "pop" : 24305, "state" : "VA" } +{ "_id" : "23237", "city" : "RICHMOND", "loc" : [ -77.461471, 37.401145 ], "pop" : 19154, "state" : "VA" } +{ "_id" : "23294", "city" : "RICHMOND", "loc" : [ -77.545125, 37.632923 ], "pop" : 14713, "state" : "VA" } +{ "_id" : "23301", "city" : "ACCOMAC", "loc" : [ -75.680272, 37.71588 ], "pop" : 2562, "state" : "VA" } +{ "_id" : "23302", "city" : "ASSAWOMAN", "loc" : [ -75.52966000000001, 37.86629 ], "pop" : 82, "state" : "VA" } +{ "_id" : "23306", "city" : "BELLE HAVEN", "loc" : [ -75.869443, 37.56448 ], "pop" : 344, "state" : "VA" } +{ "_id" : "23307", "city" : "BIRDSNEST", "loc" : [ -75.904347, 37.432077 ], "pop" : 1057, "state" : "VA" } +{ "_id" : "23308", "city" : "BLOXOM", "loc" : [ -75.615568, 37.827264 ], "pop" : 1581, "state" : "VA" } +{ "_id" : "23310", "city" : "CAPE CHARLES", "loc" : [ -75.972129, 37.279874 ], "pop" : 6259, "state" : "VA" } +{ "_id" : "23314", "city" : "CARROLLTON", "loc" : [ -76.542963, 36.954994 ], "pop" : 3990, "state" : "VA" } +{ "_id" : "23315", "city" : "CARRSVILLE", "loc" : [ -76.83647999999999, 36.74544 ], "pop" : 1273, "state" : "VA" } +{ "_id" : "23320", "city" : "CHESAPEAKE", "loc" : [ -76.23842999999999, 36.735246 ], "pop" : 55836, "state" : "VA" } +{ "_id" : "23321", "city" : "BOWERS HILL", "loc" : [ -76.411012, 36.827964 ], "pop" : 23561, "state" : "VA" } +{ "_id" : "23322", "city" : "FENTRESS", "loc" : [ -76.213064, 36.634008 ], "pop" : 10023, "state" : "VA" } +{ "_id" : "23323", "city" : "CHESAPEAKE", "loc" : [ -76.339743, 36.763424 ], "pop" : 24412, "state" : "VA" } +{ "_id" : "23324", "city" : "CHESAPEAKE", "loc" : [ -76.26655700000001, 36.805568 ], "pop" : 21531, "state" : "VA" } +{ "_id" : "23325", "city" : "CHESAPEAKE", "loc" : [ -76.240555, 36.813963 ], "pop" : 16543, "state" : "VA" } +{ "_id" : "23336", "city" : "CHINCOTEAGUE", "loc" : [ -75.371369, 37.927682 ], "pop" : 3581, "state" : "VA" } +{ "_id" : "23337", "city" : "WALLOPS ISLAND", "loc" : [ -75.506503, 37.827338 ], "pop" : 0, "state" : "VA" } +{ "_id" : "23350", "city" : "EXMORE", "loc" : [ -75.85262400000001, 37.511689 ], "pop" : 4678, "state" : "VA" } +{ "_id" : "23354", "city" : "FRANKTOWN", "loc" : [ -75.888971, 37.462009 ], "pop" : 474, "state" : "VA" } +{ "_id" : "23356", "city" : "GREENBACKVILLE", "loc" : [ -75.40289900000001, 38.006404 ], "pop" : 400, "state" : "VA" } +{ "_id" : "23357", "city" : "GREENBUSH", "loc" : [ -75.6664, 37.768121 ], "pop" : 821, "state" : "VA" } +{ "_id" : "23359", "city" : "HALLWOOD", "loc" : [ -75.561334, 37.853644 ], "pop" : 322, "state" : "VA" } +{ "_id" : "23395", "city" : "HORNTOWN", "loc" : [ -75.471608, 37.969916 ], "pop" : 132, "state" : "VA" } +{ "_id" : "23396", "city" : "HORSEY", "loc" : [ -75.56236, 37.933232 ], "pop" : 200, "state" : "VA" } +{ "_id" : "23399", "city" : "JENKINS BRIDGE", "loc" : [ -75.63194300000001, 37.919219 ], "pop" : 301, "state" : "VA" } +{ "_id" : "23404", "city" : "LOCUSTVILLE", "loc" : [ -75.673508, 37.6534 ], "pop" : 92, "state" : "VA" } +{ "_id" : "23405", "city" : "MACHIPONGO", "loc" : [ -75.908241, 37.401429 ], "pop" : 593, "state" : "VA" } +{ "_id" : "23407", "city" : "MAPPSVILLE", "loc" : [ -75.569886, 37.835419 ], "pop" : 835, "state" : "VA" } +{ "_id" : "23409", "city" : "MEARS", "loc" : [ -75.635443, 37.869189 ], "pop" : 110, "state" : "VA" } +{ "_id" : "23410", "city" : "MELFA", "loc" : [ -75.745355, 37.6407 ], "pop" : 2987, "state" : "VA" } +{ "_id" : "23415", "city" : "NEW CHURCH", "loc" : [ -75.511188, 37.952527 ], "pop" : 2915, "state" : "VA" } +{ "_id" : "23416", "city" : "OAK HALL", "loc" : [ -75.606483, 37.953686 ], "pop" : 130, "state" : "VA" } +{ "_id" : "23417", "city" : "ONANCOCK", "loc" : [ -75.752798, 37.710237 ], "pop" : 3914, "state" : "VA" } +{ "_id" : "23418", "city" : "ONLEY", "loc" : [ -75.6992, 37.670422 ], "pop" : 97, "state" : "VA" } +{ "_id" : "23420", "city" : "PAINTER", "loc" : [ -75.806612, 37.582821 ], "pop" : 3782, "state" : "VA" } +{ "_id" : "23421", "city" : "PARKSLEY", "loc" : [ -75.638634, 37.774404 ], "pop" : 3466, "state" : "VA" } +{ "_id" : "23426", "city" : "SANFORD", "loc" : [ -75.69570400000001, 37.92433 ], "pop" : 679, "state" : "VA" } +{ "_id" : "23430", "city" : "SMITHFIELD", "loc" : [ -76.63682, 36.981057 ], "pop" : 11389, "state" : "VA" } +{ "_id" : "23432", "city" : "SUFFOLK", "loc" : [ -76.559811, 36.866823 ], "pop" : 1396, "state" : "VA" } +{ "_id" : "23433", "city" : "SUFFOLK", "loc" : [ -76.49285999999999, 36.909027 ], "pop" : 1219, "state" : "VA" } +{ "_id" : "23434", "city" : "SUFFOLK", "loc" : [ -76.593147, 36.730433 ], "pop" : 33717, "state" : "VA" } +{ "_id" : "23435", "city" : "SUFFOLK", "loc" : [ -76.466397, 36.854427 ], "pop" : 8556, "state" : "VA" } +{ "_id" : "23436", "city" : "SUFFOLK", "loc" : [ -76.514157, 36.892625 ], "pop" : 766, "state" : "VA" } +{ "_id" : "23437", "city" : "SUFFOLK", "loc" : [ -76.79204300000001, 36.652611 ], "pop" : 4414, "state" : "VA" } +{ "_id" : "23438", "city" : "SUFFOLK", "loc" : [ -76.68709699999999, 36.591311 ], "pop" : 2073, "state" : "VA" } +{ "_id" : "23440", "city" : "TANGIER", "loc" : [ -75.993003, 37.824485 ], "pop" : 700, "state" : "VA" } +{ "_id" : "23442", "city" : "TEMPERANCEVILLE", "loc" : [ -75.55283, 37.895421 ], "pop" : 1670, "state" : "VA" } +{ "_id" : "23451", "city" : "VIRGINIA BEACH", "loc" : [ -76.00192800000001, 36.858451 ], "pop" : 37212, "state" : "VA" } +{ "_id" : "23452", "city" : "VIRGINIA BEACH", "loc" : [ -76.096142, 36.83481 ], "pop" : 61895, "state" : "VA" } +{ "_id" : "23454", "city" : "VIRGINIA BEACH", "loc" : [ -76.023723, 36.828187 ], "pop" : 59937, "state" : "VA" } +{ "_id" : "23455", "city" : "VIRGINIA BEACH", "loc" : [ -76.144552, 36.888121 ], "pop" : 43055, "state" : "VA" } +{ "_id" : "23456", "city" : "VIRGINIA BEACH", "loc" : [ -76.089162, 36.779851 ], "pop" : 55909, "state" : "VA" } +{ "_id" : "23457", "city" : "BLACKWATER BRIDG", "loc" : [ -76.03781600000001, 36.624793 ], "pop" : 3448, "state" : "VA" } +{ "_id" : "23459", "city" : "VIRGINIA BEACH", "loc" : [ -76.017122, 36.9216 ], "pop" : 1164, "state" : "VA" } +{ "_id" : "23462", "city" : "VIRGINIA BEACH", "loc" : [ -76.15218400000001, 36.839193 ], "pop" : 58632, "state" : "VA" } +{ "_id" : "23464", "city" : "VIRGINIA BEACH", "loc" : [ -76.175909, 36.797772 ], "pop" : 67276, "state" : "VA" } +{ "_id" : "23481", "city" : "WALTERS", "loc" : [ -76.87015599999999, 36.708974 ], "pop" : 698, "state" : "VA" } +{ "_id" : "23487", "city" : "WINDSOR", "loc" : [ -76.732372, 36.836881 ], "pop" : 4773, "state" : "VA" } +{ "_id" : "23502", "city" : "NORFOLK", "loc" : [ -76.214253, 36.854648 ], "pop" : 21227, "state" : "VA" } +{ "_id" : "23503", "city" : "NORFOLK", "loc" : [ -76.252008, 36.944196 ], "pop" : 32435, "state" : "VA" } +{ "_id" : "23504", "city" : "NORFOLK", "loc" : [ -76.26862800000001, 36.858554 ], "pop" : 25706, "state" : "VA" } +{ "_id" : "23505", "city" : "NORFOLK", "loc" : [ -76.28748, 36.91675 ], "pop" : 30687, "state" : "VA" } +{ "_id" : "23507", "city" : "NORFOLK", "loc" : [ -76.30038500000001, 36.864506 ], "pop" : 6514, "state" : "VA" } +{ "_id" : "23508", "city" : "NORFOLK", "loc" : [ -76.30035599999999, 36.885922 ], "pop" : 19729, "state" : "VA" } +{ "_id" : "23509", "city" : "NORFOLK", "loc" : [ -76.260361, 36.878743 ], "pop" : 12539, "state" : "VA" } +{ "_id" : "23510", "city" : "NORFOLK", "loc" : [ -76.287784, 36.852929 ], "pop" : 4731, "state" : "VA" } +{ "_id" : "23511", "city" : "FLEET", "loc" : [ -76.309206, 36.951164 ], "pop" : 28108, "state" : "VA" } +{ "_id" : "23513", "city" : "NORFOLK", "loc" : [ -76.23957799999999, 36.891395 ], "pop" : 31348, "state" : "VA" } +{ "_id" : "23517", "city" : "NORFOLK", "loc" : [ -76.29451899999999, 36.869547 ], "pop" : 4433, "state" : "VA" } +{ "_id" : "23518", "city" : "NORFOLK", "loc" : [ -76.216027, 36.920246 ], "pop" : 35119, "state" : "VA" } +{ "_id" : "23521", "city" : "NAVAL AMPHIBIOUS", "loc" : [ -76.163715, 36.916923 ], "pop" : 4541, "state" : "VA" } +{ "_id" : "23523", "city" : "NORFOLK", "loc" : [ -76.27012499999999, 36.82942 ], "pop" : 8682, "state" : "VA" } +{ "_id" : "23601", "city" : "NEWPORT NEWS", "loc" : [ -76.460722, 37.057951 ], "pop" : 24325, "state" : "VA" } +{ "_id" : "23602", "city" : "NEWPORT NEWS", "loc" : [ -76.53212499999999, 37.131684 ], "pop" : 68525, "state" : "VA" } +{ "_id" : "23603", "city" : "NEWPORT NEWS", "loc" : [ -76.582059, 37.198887 ], "pop" : 3368, "state" : "VA" } +{ "_id" : "23604", "city" : "NEWPORT NEWS", "loc" : [ -76.589727, 37.122112 ], "pop" : 9967, "state" : "VA" } +{ "_id" : "23605", "city" : "NEWPORT NEWS", "loc" : [ -76.43315800000001, 37.015583 ], "pop" : 12649, "state" : "VA" } +{ "_id" : "23606", "city" : "NEWPORT NEWS", "loc" : [ -76.496724, 37.076777 ], "pop" : 22429, "state" : "VA" } +{ "_id" : "23607", "city" : "NEWPORT NEWS", "loc" : [ -76.41646900000001, 36.986352 ], "pop" : 28785, "state" : "VA" } +{ "_id" : "23651", "city" : "HAMPTON", "loc" : [ -76.296896, 37.029671 ], "pop" : 3325, "state" : "VA" } +{ "_id" : "23661", "city" : "HAMPTON", "loc" : [ -76.38008499999999, 37.007432 ], "pop" : 15313, "state" : "VA" } +{ "_id" : "23662", "city" : "POQUOSON", "loc" : [ -76.380702, 37.131252 ], "pop" : 11005, "state" : "VA" } +{ "_id" : "23663", "city" : "HAMPTON", "loc" : [ -76.319875, 37.03181 ], "pop" : 16889, "state" : "VA" } +{ "_id" : "23664", "city" : "HAMPTON", "loc" : [ -76.296639, 37.056611 ], "pop" : 7832, "state" : "VA" } +{ "_id" : "23665", "city" : "HAMPTON", "loc" : [ -76.40993899999999, 37.100565 ], "pop" : 15146, "state" : "VA" } +{ "_id" : "23666", "city" : "HAMPTON", "loc" : [ -76.409617, 37.046241 ], "pop" : 44985, "state" : "VA" } +{ "_id" : "23669", "city" : "HAMPTON", "loc" : [ -76.342573, 37.043559 ], "pop" : 41855, "state" : "VA" } +{ "_id" : "23690", "city" : "YORKTOWN", "loc" : [ -76.54234599999999, 37.228657 ], "pop" : 3216, "state" : "VA" } +{ "_id" : "23692", "city" : "GRAFTON", "loc" : [ -76.459648, 37.170859 ], "pop" : 14188, "state" : "VA" } +{ "_id" : "23693", "city" : "TABB", "loc" : [ -76.450743, 37.122586 ], "pop" : 2807, "state" : "VA" } +{ "_id" : "23696", "city" : "SEAFORD", "loc" : [ -76.42899199999999, 37.188468 ], "pop" : 3009, "state" : "VA" } +{ "_id" : "23701", "city" : "PORTSMOUTH", "loc" : [ -76.36714000000001, 36.808902 ], "pop" : 29788, "state" : "VA" } +{ "_id" : "23702", "city" : "PORTSMOUTH", "loc" : [ -76.32697899999999, 36.803534 ], "pop" : 12599, "state" : "VA" } +{ "_id" : "23703", "city" : "PORTSMOUTH", "loc" : [ -76.386872, 36.869501 ], "pop" : 22512, "state" : "VA" } +{ "_id" : "23704", "city" : "PORTSMOUTH", "loc" : [ -76.314604, 36.829821 ], "pop" : 23634, "state" : "VA" } +{ "_id" : "23707", "city" : "PORTSMOUTH", "loc" : [ -76.34401099999999, 36.836234 ], "pop" : 15199, "state" : "VA" } +{ "_id" : "23709", "city" : "PORTSMOUTH", "loc" : [ -76.305188, 36.813883 ], "pop" : 216, "state" : "VA" } +{ "_id" : "23801", "city" : "FORT LEE", "loc" : [ -77.33405, 37.244738 ], "pop" : 8817, "state" : "VA" } +{ "_id" : "23803", "city" : "ETTRICK", "loc" : [ -77.43259399999999, 37.220001 ], "pop" : 41772, "state" : "VA" } +{ "_id" : "23805", "city" : "PETERSBURG", "loc" : [ -77.385385, 37.181937 ], "pop" : 16432, "state" : "VA" } +{ "_id" : "23821", "city" : "ALBERTA", "loc" : [ -77.905518, 36.880609 ], "pop" : 1553, "state" : "VA" } +{ "_id" : "23824", "city" : "BLACKSTONE", "loc" : [ -77.985063, 37.091578 ], "pop" : 6351, "state" : "VA" } +{ "_id" : "23827", "city" : "BOYKINS", "loc" : [ -77.197519, 36.595061 ], "pop" : 1595, "state" : "VA" } +{ "_id" : "23828", "city" : "BRANCHVILLE", "loc" : [ -77.27044100000001, 36.578701 ], "pop" : 619, "state" : "VA" } +{ "_id" : "23829", "city" : "CAPRON", "loc" : [ -77.239363, 36.724332 ], "pop" : 2364, "state" : "VA" } +{ "_id" : "23830", "city" : "CARSON", "loc" : [ -77.43509299999999, 37.039311 ], "pop" : 1343, "state" : "VA" } +{ "_id" : "23831", "city" : "CHESTER", "loc" : [ -77.41557, 37.342934 ], "pop" : 24788, "state" : "VA" } +{ "_id" : "23832", "city" : "CHESTERFIELD", "loc" : [ -77.566799, 37.392327 ], "pop" : 25716, "state" : "VA" } +{ "_id" : "23833", "city" : "CHURCH ROAD", "loc" : [ -77.66458799999999, 37.194964 ], "pop" : 1515, "state" : "VA" } +{ "_id" : "23834", "city" : "COLONIAL HEIGHTS", "loc" : [ -77.403829, 37.269968 ], "pop" : 21056, "state" : "VA" } +{ "_id" : "23837", "city" : "COURTLAND", "loc" : [ -77.078272, 36.722516 ], "pop" : 3570, "state" : "VA" } +{ "_id" : "23839", "city" : "DENDRON", "loc" : [ -76.896642, 37.098076 ], "pop" : 805, "state" : "VA" } +{ "_id" : "23840", "city" : "DEWITT", "loc" : [ -77.64255799999999, 37.053522 ], "pop" : 1385, "state" : "VA" } +{ "_id" : "23841", "city" : "DINWIDDIE", "loc" : [ -77.558539, 37.083283 ], "pop" : 2781, "state" : "VA" } +{ "_id" : "23842", "city" : "DISPUTANTA", "loc" : [ -77.273172, 37.148268 ], "pop" : 4938, "state" : "VA" } +{ "_id" : "23843", "city" : "DOLPHIN", "loc" : [ -77.788719, 36.831774 ], "pop" : 982, "state" : "VA" } +{ "_id" : "23844", "city" : "DREWRYVILLE", "loc" : [ -77.359098, 36.685433 ], "pop" : 743, "state" : "VA" } +{ "_id" : "23845", "city" : "EBONY", "loc" : [ -77.999431, 36.584993 ], "pop" : 568, "state" : "VA" } +{ "_id" : "23846", "city" : "ELBERON", "loc" : [ -76.83372300000001, 37.070133 ], "pop" : 715, "state" : "VA" } +{ "_id" : "23847", "city" : "EMPORIA", "loc" : [ -77.56295299999999, 36.685689 ], "pop" : 13950, "state" : "VA" } +{ "_id" : "23850", "city" : "AMMON", "loc" : [ -77.737189, 37.139672 ], "pop" : 1315, "state" : "VA" } +{ "_id" : "23851", "city" : "FRANKLIN", "loc" : [ -76.939108, 36.678625 ], "pop" : 12786, "state" : "VA" } +{ "_id" : "23856", "city" : "FREEMAN", "loc" : [ -77.720772, 36.789342 ], "pop" : 920, "state" : "VA" } +{ "_id" : "23857", "city" : "GASBURG", "loc" : [ -77.90292700000001, 36.576552 ], "pop" : 771, "state" : "VA" } +{ "_id" : "23859", "city" : "HANDSOM", "loc" : [ -77.023797, 36.609854 ], "pop" : 371, "state" : "VA" } +{ "_id" : "23860", "city" : "HOPEWELL", "loc" : [ -77.295013, 37.287576 ], "pop" : 25764, "state" : "VA" } +{ "_id" : "23866", "city" : "IVOR", "loc" : [ -76.886146, 36.907099 ], "pop" : 2205, "state" : "VA" } +{ "_id" : "23867", "city" : "JARRATT", "loc" : [ -77.48316199999999, 36.819129 ], "pop" : 2055, "state" : "VA" } +{ "_id" : "23868", "city" : "TRIPLET", "loc" : [ -77.838437, 36.744874 ], "pop" : 6357, "state" : "VA" } +{ "_id" : "23872", "city" : "MC KENNEY", "loc" : [ -77.73955599999999, 36.998609 ], "pop" : 1866, "state" : "VA" } +{ "_id" : "23874", "city" : "NEWSOMS", "loc" : [ -77.106949, 36.614814 ], "pop" : 1193, "state" : "VA" } +{ "_id" : "23875", "city" : "PRINCE GEORGE", "loc" : [ -77.27470599999999, 37.233339 ], "pop" : 7713, "state" : "VA" } +{ "_id" : "23876", "city" : "RAWLINGS", "loc" : [ -77.82371999999999, 36.953043 ], "pop" : 527, "state" : "VA" } +{ "_id" : "23878", "city" : "SEDLEY", "loc" : [ -77.012531, 36.790752 ], "pop" : 491, "state" : "VA" } +{ "_id" : "23879", "city" : "SKIPPERS", "loc" : [ -77.543663, 36.579685 ], "pop" : 196, "state" : "VA" } +{ "_id" : "23881", "city" : "SPRING GROVE", "loc" : [ -76.99233700000001, 37.190098 ], "pop" : 1746, "state" : "VA" } +{ "_id" : "23882", "city" : "STONY CREEK", "loc" : [ -77.444276, 36.936132 ], "pop" : 2889, "state" : "VA" } +{ "_id" : "23883", "city" : "SURRY", "loc" : [ -76.76514, 37.126024 ], "pop" : 2271, "state" : "VA" } +{ "_id" : "23885", "city" : "SUTHERLAND", "loc" : [ -77.56546299999999, 37.190149 ], "pop" : 2470, "state" : "VA" } +{ "_id" : "23887", "city" : "VALENTINES", "loc" : [ -77.83840499999999, 36.565024 ], "pop" : 188, "state" : "VA" } +{ "_id" : "23888", "city" : "WAKEFIELD", "loc" : [ -76.97898000000001, 36.975734 ], "pop" : 2790, "state" : "VA" } +{ "_id" : "23889", "city" : "WARFIELD", "loc" : [ -77.76731700000001, 36.901122 ], "pop" : 580, "state" : "VA" } +{ "_id" : "23890", "city" : "WAVERLY", "loc" : [ -77.105453, 37.025032 ], "pop" : 4581, "state" : "VA" } +{ "_id" : "23893", "city" : "WHITE PLAINS", "loc" : [ -77.959245, 36.633549 ], "pop" : 522, "state" : "VA" } +{ "_id" : "23894", "city" : "WILSONS", "loc" : [ -77.835193, 37.115678 ], "pop" : 592, "state" : "VA" } +{ "_id" : "23897", "city" : "YALE", "loc" : [ -77.286986, 36.837279 ], "pop" : 626, "state" : "VA" } +{ "_id" : "23898", "city" : "ZUNI", "loc" : [ -76.81096700000001, 36.843666 ], "pop" : 2162, "state" : "VA" } +{ "_id" : "23901", "city" : "FARMVILLE", "loc" : [ -78.40759199999999, 37.302692 ], "pop" : 14084, "state" : "VA" } +{ "_id" : "23915", "city" : "BASKERVILLE", "loc" : [ -78.27904700000001, 36.723595 ], "pop" : 1114, "state" : "VA" } +{ "_id" : "23917", "city" : "BOYDTON", "loc" : [ -78.375174, 36.654422 ], "pop" : 2613, "state" : "VA" } +{ "_id" : "23919", "city" : "BRACEY", "loc" : [ -78.105862, 36.576295 ], "pop" : 1127, "state" : "VA" } +{ "_id" : "23920", "city" : "BRODNAX", "loc" : [ -77.98984299999999, 36.731879 ], "pop" : 2571, "state" : "VA" } +{ "_id" : "23921", "city" : "BUCKINGHAM", "loc" : [ -78.59853699999999, 37.583335 ], "pop" : 2056, "state" : "VA" } +{ "_id" : "23922", "city" : "BURKEVILLE", "loc" : [ -78.196084, 37.195203 ], "pop" : 3751, "state" : "VA" } +{ "_id" : "23923", "city" : "CHARLOTTE COURT", "loc" : [ -78.660622, 37.086379 ], "pop" : 2061, "state" : "VA" } +{ "_id" : "23924", "city" : "CHASE CITY", "loc" : [ -78.455268, 36.805305 ], "pop" : 5715, "state" : "VA" } +{ "_id" : "23927", "city" : "CLARKSVILLE", "loc" : [ -78.53529399999999, 36.631437 ], "pop" : 2736, "state" : "VA" } +{ "_id" : "23930", "city" : "CREWE", "loc" : [ -78.10586600000001, 37.165676 ], "pop" : 5565, "state" : "VA" } +{ "_id" : "23934", "city" : "CULLEN", "loc" : [ -78.645912, 37.155211 ], "pop" : 596, "state" : "VA" } +{ "_id" : "23936", "city" : "SPROUSES CORNER", "loc" : [ -78.46092899999999, 37.545804 ], "pop" : 5330, "state" : "VA" } +{ "_id" : "23937", "city" : "DRAKES BRANCH", "loc" : [ -78.561542, 36.968767 ], "pop" : 1509, "state" : "VA" } +{ "_id" : "23938", "city" : "DUNDAS", "loc" : [ -78.01001599999999, 36.90532 ], "pop" : 407, "state" : "VA" } +{ "_id" : "23942", "city" : "GREEN BAY", "loc" : [ -78.30719499999999, 37.123417 ], "pop" : 838, "state" : "VA" } +{ "_id" : "23944", "city" : "KENBRIDGE", "loc" : [ -78.12423800000001, 36.932965 ], "pop" : 4269, "state" : "VA" } +{ "_id" : "23947", "city" : "KEYSVILLE", "loc" : [ -78.46991199999999, 37.041086 ], "pop" : 3670, "state" : "VA" } +{ "_id" : "23950", "city" : "BLACKRIDGE", "loc" : [ -78.095251, 36.68609 ], "pop" : 3036, "state" : "VA" } +{ "_id" : "23952", "city" : "LUNENBURG", "loc" : [ -78.290644, 36.922624 ], "pop" : 156, "state" : "VA" } +{ "_id" : "23954", "city" : "MEHERRIN", "loc" : [ -78.38735699999999, 37.101283 ], "pop" : 1429, "state" : "VA" } +{ "_id" : "23958", "city" : "PAMPLIN", "loc" : [ -78.65166000000001, 37.265333 ], "pop" : 2298, "state" : "VA" } +{ "_id" : "23959", "city" : "PHENIX", "loc" : [ -78.791195, 37.092506 ], "pop" : 900, "state" : "VA" } +{ "_id" : "23960", "city" : "PROSPECT", "loc" : [ -78.546162, 37.305838 ], "pop" : 1661, "state" : "VA" } +{ "_id" : "23962", "city" : "RANDOLPH", "loc" : [ -78.69924899999999, 36.963079 ], "pop" : 600, "state" : "VA" } +{ "_id" : "23963", "city" : "RED HOUSE", "loc" : [ -78.81446699999999, 37.191431 ], "pop" : 616, "state" : "VA" } +{ "_id" : "23964", "city" : "RED OAK", "loc" : [ -78.632057, 36.772403 ], "pop" : 667, "state" : "VA" } +{ "_id" : "23966", "city" : "RICE", "loc" : [ -78.279262, 37.272132 ], "pop" : 1973, "state" : "VA" } +{ "_id" : "23967", "city" : "SAXE", "loc" : [ -78.605699, 36.90569 ], "pop" : 1095, "state" : "VA" } +{ "_id" : "23968", "city" : "SKIPWITH", "loc" : [ -78.530552, 36.731704 ], "pop" : 1177, "state" : "VA" } +{ "_id" : "23970", "city" : "SOUTH HILL", "loc" : [ -78.15338800000001, 36.712388 ], "pop" : 7056, "state" : "VA" } +{ "_id" : "23974", "city" : "VICTORIA", "loc" : [ -78.23724300000001, 36.983543 ], "pop" : 4027, "state" : "VA" } +{ "_id" : "23976", "city" : "WYLLIESBURG", "loc" : [ -78.612655, 36.838968 ], "pop" : 945, "state" : "VA" } +{ "_id" : "24011", "city" : "ROANOKE", "loc" : [ -79.942019, 37.268997 ], "pop" : 150, "state" : "VA" } +{ "_id" : "24012", "city" : "ROANOKE", "loc" : [ -79.932179, 37.302912 ], "pop" : 22982, "state" : "VA" } +{ "_id" : "24013", "city" : "ROANOKE", "loc" : [ -79.924747, 37.267685 ], "pop" : 8347, "state" : "VA" } +{ "_id" : "24014", "city" : "ROANOKE", "loc" : [ -79.946332, 37.23268 ], "pop" : 21753, "state" : "VA" } +{ "_id" : "24015", "city" : "ROANOKE", "loc" : [ -79.980694, 37.258363 ], "pop" : 15358, "state" : "VA" } +{ "_id" : "24016", "city" : "ROANOKE", "loc" : [ -79.953495, 37.270407 ], "pop" : 9782, "state" : "VA" } +{ "_id" : "24017", "city" : "ROANOKE", "loc" : [ -79.99024799999999, 37.293655 ], "pop" : 24776, "state" : "VA" } +{ "_id" : "24018", "city" : "CAVE SPRING", "loc" : [ -80.021749, 37.231554 ], "pop" : 24993, "state" : "VA" } +{ "_id" : "24019", "city" : "HOLLINS", "loc" : [ -79.956328, 37.33585 ], "pop" : 23189, "state" : "VA" } +{ "_id" : "24053", "city" : "ARARAT", "loc" : [ -80.50933999999999, 36.613946 ], "pop" : 960, "state" : "VA" } +{ "_id" : "24054", "city" : "AXTON", "loc" : [ -79.73963999999999, 36.654839 ], "pop" : 4428, "state" : "VA" } +{ "_id" : "24055", "city" : "BASSETT", "loc" : [ -80.005506, 36.753425 ], "pop" : 14101, "state" : "VA" } +{ "_id" : "24059", "city" : "BENT MOUNTAIN", "loc" : [ -80.145501, 37.206793 ], "pop" : 2388, "state" : "VA" } +{ "_id" : "24060", "city" : "WHITETHORNE", "loc" : [ -80.427313, 37.228804 ], "pop" : 42796, "state" : "VA" } +{ "_id" : "24064", "city" : "BLUE RIDGE", "loc" : [ -79.817178, 37.388542 ], "pop" : 1669, "state" : "VA" } +{ "_id" : "24065", "city" : "BOONES MILL", "loc" : [ -79.95555400000001, 37.13313 ], "pop" : 6767, "state" : "VA" } +{ "_id" : "24066", "city" : "LITHIA", "loc" : [ -79.705287, 37.52844 ], "pop" : 4145, "state" : "VA" } +{ "_id" : "24067", "city" : "CALLAWAY", "loc" : [ -80.049592, 37.028495 ], "pop" : 2012, "state" : "VA" } +{ "_id" : "24069", "city" : "CASCADE", "loc" : [ -79.657438, 36.592697 ], "pop" : 1435, "state" : "VA" } +{ "_id" : "24070", "city" : "CATAWBA", "loc" : [ -80.128384, 37.369649 ], "pop" : 3747, "state" : "VA" } +{ "_id" : "24072", "city" : "SIMPSONS", "loc" : [ -80.23674699999999, 37.032642 ], "pop" : 1048, "state" : "VA" } +{ "_id" : "24073", "city" : "CHRISTIANSBURG", "loc" : [ -80.418774, 37.135286 ], "pop" : 20714, "state" : "VA" } +{ "_id" : "24076", "city" : "CLAUDVILLE", "loc" : [ -80.44417900000001, 36.583899 ], "pop" : 1576, "state" : "VA" } +{ "_id" : "24077", "city" : "CLOVERDALE", "loc" : [ -79.91276499999999, 37.366293 ], "pop" : 582, "state" : "VA" } +{ "_id" : "24078", "city" : "COLLINSVILLE", "loc" : [ -79.914192, 36.72379 ], "pop" : 7668, "state" : "VA" } +{ "_id" : "24079", "city" : "COPPER HILL", "loc" : [ -80.152469, 37.055568 ], "pop" : 1765, "state" : "VA" } +{ "_id" : "24082", "city" : "CRITZ", "loc" : [ -80.12976500000001, 36.621059 ], "pop" : 260, "state" : "VA" } +{ "_id" : "24083", "city" : "DALEVILLE", "loc" : [ -79.92109499999999, 37.41253 ], "pop" : 1408, "state" : "VA" } +{ "_id" : "24084", "city" : "DUBLIN", "loc" : [ -80.669696, 37.098879 ], "pop" : 9521, "state" : "VA" } +{ "_id" : "24085", "city" : "EAGLE ROCK", "loc" : [ -79.817215, 37.666727 ], "pop" : 2939, "state" : "VA" } +{ "_id" : "24086", "city" : "EGGLESTON", "loc" : [ -80.65275800000001, 37.290576 ], "pop" : 374, "state" : "VA" } +{ "_id" : "24087", "city" : "IRONTO", "loc" : [ -80.249658, 37.212651 ], "pop" : 4216, "state" : "VA" } +{ "_id" : "24088", "city" : "FERRUM", "loc" : [ -80.03492300000001, 36.916834 ], "pop" : 4389, "state" : "VA" } +{ "_id" : "24089", "city" : "FIELDALE", "loc" : [ -79.965245, 36.706414 ], "pop" : 2594, "state" : "VA" } +{ "_id" : "24090", "city" : "FINCASTLE", "loc" : [ -79.851116, 37.491099 ], "pop" : 2843, "state" : "VA" } +{ "_id" : "24091", "city" : "ALUM RIDGE", "loc" : [ -80.31905399999999, 36.919523 ], "pop" : 4833, "state" : "VA" } +{ "_id" : "24092", "city" : "GLADEHILL", "loc" : [ -79.77627099999999, 37.016866 ], "pop" : 2047, "state" : "VA" } +{ "_id" : "24093", "city" : "GLEN LYN", "loc" : [ -80.86335800000001, 37.366853 ], "pop" : 126, "state" : "VA" } +{ "_id" : "24094", "city" : "GOLDBOND", "loc" : [ -80.66315, 37.387221 ], "pop" : 53, "state" : "VA" } +{ "_id" : "24095", "city" : "GOODVIEW", "loc" : [ -79.72628400000001, 37.347167 ], "pop" : 1686, "state" : "VA" } +{ "_id" : "24101", "city" : "HARDY", "loc" : [ -79.81266100000001, 37.214473 ], "pop" : 5955, "state" : "VA" } +{ "_id" : "24102", "city" : "HENRY", "loc" : [ -79.99036, 36.839322 ], "pop" : 1393, "state" : "VA" } +{ "_id" : "24104", "city" : "HUDDLESTON", "loc" : [ -79.491017, 37.144155 ], "pop" : 2299, "state" : "VA" } +{ "_id" : "24105", "city" : "INDIAN VALLEY", "loc" : [ -80.57571, 36.898993 ], "pop" : 502, "state" : "VA" } +{ "_id" : "24112", "city" : "MARTINSVILLE", "loc" : [ -79.869136, 36.687067 ], "pop" : 35994, "state" : "VA" } +{ "_id" : "24120", "city" : "MEADOWS OF DAN", "loc" : [ -80.402227, 36.72504 ], "pop" : 1532, "state" : "VA" } +{ "_id" : "24121", "city" : "MONETA", "loc" : [ -79.652111, 37.178383 ], "pop" : 4586, "state" : "VA" } +{ "_id" : "24122", "city" : "MONTVALE", "loc" : [ -79.717462, 37.40696 ], "pop" : 1747, "state" : "VA" } +{ "_id" : "24124", "city" : "NARROWS", "loc" : [ -80.85485, 37.319846 ], "pop" : 5250, "state" : "VA" } +{ "_id" : "24127", "city" : "NEW CASTLE", "loc" : [ -80.17041999999999, 37.487132 ], "pop" : 3400, "state" : "VA" } +{ "_id" : "24128", "city" : "NEWPORT", "loc" : [ -80.50991999999999, 37.306852 ], "pop" : 1578, "state" : "VA" } +{ "_id" : "24131", "city" : "PAINT BANK", "loc" : [ -80.254436, 37.574482 ], "pop" : 153, "state" : "VA" } +{ "_id" : "24133", "city" : "PATRICK SPRINGS", "loc" : [ -80.138769, 36.674435 ], "pop" : 2789, "state" : "VA" } +{ "_id" : "24134", "city" : "PEARISBURG", "loc" : [ -80.726703, 37.304121 ], "pop" : 5279, "state" : "VA" } +{ "_id" : "24136", "city" : "MOUNTAIN LAKE", "loc" : [ -80.61550699999999, 37.33027 ], "pop" : 3087, "state" : "VA" } +{ "_id" : "24137", "city" : "PENHOOK", "loc" : [ -79.66449299999999, 36.920125 ], "pop" : 1768, "state" : "VA" } +{ "_id" : "24138", "city" : "PILOT", "loc" : [ -80.322901, 37.056476 ], "pop" : 882, "state" : "VA" } +{ "_id" : "24139", "city" : "PITTSVILLE", "loc" : [ -79.47941299999999, 36.971578 ], "pop" : 415, "state" : "VA" } +{ "_id" : "24141", "city" : "FAIRLAWN", "loc" : [ -80.571721, 37.135816 ], "pop" : 22335, "state" : "VA" } +{ "_id" : "24147", "city" : "RICH CREEK", "loc" : [ -80.82271799999999, 37.385048 ], "pop" : 947, "state" : "VA" } +{ "_id" : "24148", "city" : "RIDGEWAY", "loc" : [ -79.86859, 36.5874 ], "pop" : 7953, "state" : "VA" } +{ "_id" : "24149", "city" : "RINER", "loc" : [ -80.435309, 37.032209 ], "pop" : 2947, "state" : "VA" } +{ "_id" : "24150", "city" : "RIPPLEMEAD", "loc" : [ -80.671728, 37.366455 ], "pop" : 37, "state" : "VA" } +{ "_id" : "24151", "city" : "ROCKY MOUNT", "loc" : [ -79.883959, 36.989101 ], "pop" : 15579, "state" : "VA" } +{ "_id" : "24153", "city" : "SALEM", "loc" : [ -80.069185, 37.2853 ], "pop" : 30570, "state" : "VA" } +{ "_id" : "24161", "city" : "SANDY LEVEL", "loc" : [ -79.561404, 36.991042 ], "pop" : 512, "state" : "VA" } +{ "_id" : "24162", "city" : "SHAWSVILLE", "loc" : [ -80.27153, 37.146619 ], "pop" : 2571, "state" : "VA" } +{ "_id" : "24165", "city" : "SPENCER", "loc" : [ -80.037345, 36.59676 ], "pop" : 1537, "state" : "VA" } +{ "_id" : "24167", "city" : "STAFFORDSVILLE", "loc" : [ -80.740334, 37.245378 ], "pop" : 464, "state" : "VA" } +{ "_id" : "24168", "city" : "STANLEYTOWN", "loc" : [ -79.93548199999999, 36.734759 ], "pop" : 153, "state" : "VA" } +{ "_id" : "24171", "city" : "STUART", "loc" : [ -80.23923000000001, 36.651744 ], "pop" : 7990, "state" : "VA" } +{ "_id" : "24174", "city" : "THAXTON", "loc" : [ -79.652187, 37.360008 ], "pop" : 1136, "state" : "VA" } +{ "_id" : "24175", "city" : "TROUTVILLE", "loc" : [ -79.878636, 37.401855 ], "pop" : 9211, "state" : "VA" } +{ "_id" : "24176", "city" : "UNION HALL", "loc" : [ -79.686447, 37.013111 ], "pop" : 804, "state" : "VA" } +{ "_id" : "24179", "city" : "STEWARTSVILLE", "loc" : [ -79.835466, 37.271139 ], "pop" : 18205, "state" : "VA" } +{ "_id" : "24184", "city" : "WIRTZ", "loc" : [ -79.757254, 37.081794 ], "pop" : 1675, "state" : "VA" } +{ "_id" : "24185", "city" : "WOOLWINE", "loc" : [ -80.27742600000001, 36.792076 ], "pop" : 898, "state" : "VA" } +{ "_id" : "24201", "city" : "BRISTOL", "loc" : [ -82.18229700000001, 36.618093 ], "pop" : 23166, "state" : "VA" } +{ "_id" : "24210", "city" : "ABINGDON", "loc" : [ -82.019989, 36.691644 ], "pop" : 25429, "state" : "VA" } +{ "_id" : "24216", "city" : "EXETER", "loc" : [ -82.791394, 36.906001 ], "pop" : 2916, "state" : "VA" } +{ "_id" : "24217", "city" : "BEE", "loc" : [ -82.185632, 37.101358 ], "pop" : 495, "state" : "VA" } +{ "_id" : "24219", "city" : "BIG STONE GAP", "loc" : [ -82.762727, 36.858073 ], "pop" : 10858, "state" : "VA" } +{ "_id" : "24220", "city" : "BIRCHLEAF", "loc" : [ -82.248346, 37.169481 ], "pop" : 997, "state" : "VA" } +{ "_id" : "24221", "city" : "BLACKWATER", "loc" : [ -82.98658, 36.639011 ], "pop" : 1008, "state" : "VA" } +{ "_id" : "24224", "city" : "CASTLEWOOD", "loc" : [ -82.28757400000001, 36.876409 ], "pop" : 7166, "state" : "VA" } +{ "_id" : "24225", "city" : "CLEVELAND", "loc" : [ -82.131758, 36.950215 ], "pop" : 1966, "state" : "VA" } +{ "_id" : "24226", "city" : "CLINCHCO", "loc" : [ -82.342476, 37.140581 ], "pop" : 2059, "state" : "VA" } +{ "_id" : "24228", "city" : "CLINTWOOD", "loc" : [ -82.445339, 37.159206 ], "pop" : 7866, "state" : "VA" } +{ "_id" : "24230", "city" : "COEBURN", "loc" : [ -82.47349699999999, 36.960489 ], "pop" : 11745, "state" : "VA" } +{ "_id" : "24236", "city" : "DAMASCUS", "loc" : [ -81.77763299999999, 36.640264 ], "pop" : 3312, "state" : "VA" } +{ "_id" : "24237", "city" : "DANTE", "loc" : [ -82.281519, 37.005419 ], "pop" : 1168, "state" : "VA" } +{ "_id" : "24239", "city" : "DAVENPORT", "loc" : [ -82.122946, 37.068044 ], "pop" : 49, "state" : "VA" } +{ "_id" : "24243", "city" : "DRYDEN", "loc" : [ -82.93047799999999, 36.781825 ], "pop" : 2185, "state" : "VA" } +{ "_id" : "24244", "city" : "CLINCHPORT", "loc" : [ -82.80651, 36.704402 ], "pop" : 5688, "state" : "VA" } +{ "_id" : "24245", "city" : "DUNGANNON", "loc" : [ -82.496025, 36.82416 ], "pop" : 1231, "state" : "VA" } +{ "_id" : "24248", "city" : "EWING", "loc" : [ -83.50473700000001, 36.623694 ], "pop" : 2599, "state" : "VA" } +{ "_id" : "24250", "city" : "FORT BLACKMORE", "loc" : [ -82.610178, 36.743828 ], "pop" : 1085, "state" : "VA" } +{ "_id" : "24251", "city" : "GATE CITY", "loc" : [ -82.61117900000001, 36.646026 ], "pop" : 7641, "state" : "VA" } +{ "_id" : "24256", "city" : "HAYSI", "loc" : [ -82.28530600000001, 37.220552 ], "pop" : 3813, "state" : "VA" } +{ "_id" : "24258", "city" : "HILTONS", "loc" : [ -82.429929, 36.649778 ], "pop" : 1937, "state" : "VA" } +{ "_id" : "24260", "city" : "COUNCIL", "loc" : [ -81.996883, 37.027292 ], "pop" : 6162, "state" : "VA" } +{ "_id" : "24263", "city" : "JONESVILLE", "loc" : [ -83.13615, 36.689647 ], "pop" : 6275, "state" : "VA" } +{ "_id" : "24265", "city" : "KEOKEE", "loc" : [ -82.977161, 36.823931 ], "pop" : 1807, "state" : "VA" } +{ "_id" : "24266", "city" : "LEBANON", "loc" : [ -82.09563, 36.880895 ], "pop" : 7818, "state" : "VA" } +{ "_id" : "24269", "city" : "MC CLURE", "loc" : [ -82.38055300000001, 37.081412 ], "pop" : 124, "state" : "VA" } +{ "_id" : "24270", "city" : "MENDOTA", "loc" : [ -82.264888, 36.722302 ], "pop" : 675, "state" : "VA" } +{ "_id" : "24271", "city" : "NICKELSVILLE", "loc" : [ -82.42017199999999, 36.750221 ], "pop" : 2749, "state" : "VA" } +{ "_id" : "24272", "city" : "NORA", "loc" : [ -82.35002299999999, 37.018229 ], "pop" : 514, "state" : "VA" } +{ "_id" : "24273", "city" : "NORTON", "loc" : [ -82.624923, 36.937797 ], "pop" : 4145, "state" : "VA" } +{ "_id" : "24277", "city" : "PENNINGTON GAP", "loc" : [ -83.022299, 36.750752 ], "pop" : 5859, "state" : "VA" } +{ "_id" : "24279", "city" : "POUND", "loc" : [ -82.601555, 37.092734 ], "pop" : 5330, "state" : "VA" } +{ "_id" : "24280", "city" : "ROSEDALE", "loc" : [ -81.88879300000001, 36.973981 ], "pop" : 2492, "state" : "VA" } +{ "_id" : "24281", "city" : "ROSE HILL", "loc" : [ -83.34856499999999, 36.658257 ], "pop" : 2404, "state" : "VA" } +{ "_id" : "24282", "city" : "SAINT CHARLES", "loc" : [ -83.051838, 36.831515 ], "pop" : 485, "state" : "VA" } +{ "_id" : "24283", "city" : "SAINT PAUL", "loc" : [ -82.34184399999999, 36.932295 ], "pop" : 2680, "state" : "VA" } +{ "_id" : "24285", "city" : "STONEGA", "loc" : [ -82.819194, 36.950176 ], "pop" : 670, "state" : "VA" } +{ "_id" : "24289", "city" : "TRAMMEL", "loc" : [ -82.217563, 37.022959 ], "pop" : 51, "state" : "VA" } +{ "_id" : "24290", "city" : "WEBER CITY", "loc" : [ -82.545227, 36.620213 ], "pop" : 2981, "state" : "VA" } +{ "_id" : "24292", "city" : "WHITETOP", "loc" : [ -81.583938, 36.610559 ], "pop" : 642, "state" : "VA" } +{ "_id" : "24293", "city" : "WISE", "loc" : [ -82.594679, 36.975 ], "pop" : 8957, "state" : "VA" } +{ "_id" : "24301", "city" : "PULASKI", "loc" : [ -80.770961, 37.056708 ], "pop" : 16576, "state" : "VA" } +{ "_id" : "24311", "city" : "ATKINS", "loc" : [ -81.404791, 36.866532 ], "pop" : 1108, "state" : "VA" } +{ "_id" : "24312", "city" : "AUSTINVILLE", "loc" : [ -80.858322, 36.819461 ], "pop" : 2488, "state" : "VA" } +{ "_id" : "24313", "city" : "BARREN SPRINGS", "loc" : [ -80.809006, 36.907787 ], "pop" : 575, "state" : "VA" } +{ "_id" : "24314", "city" : "BASTIAN", "loc" : [ -81.19885499999999, 37.15742 ], "pop" : 1656, "state" : "VA" } +{ "_id" : "24315", "city" : "BLAND", "loc" : [ -81.020064, 37.137644 ], "pop" : 3261, "state" : "VA" } +{ "_id" : "24316", "city" : "BROADFORD", "loc" : [ -81.65938800000001, 36.93299 ], "pop" : 132, "state" : "VA" } +{ "_id" : "24317", "city" : "CANA", "loc" : [ -80.670452, 36.59574 ], "pop" : 3363, "state" : "VA" } +{ "_id" : "24318", "city" : "CERES", "loc" : [ -81.364272, 37.00456 ], "pop" : 833, "state" : "VA" } +{ "_id" : "24319", "city" : "CHILHOWIE", "loc" : [ -81.665103, 36.771912 ], "pop" : 6087, "state" : "VA" } +{ "_id" : "24322", "city" : "CRIPPLE CREEK", "loc" : [ -81.103928, 36.808612 ], "pop" : 157, "state" : "VA" } +{ "_id" : "24323", "city" : "CROCKETT", "loc" : [ -81.208883, 36.876755 ], "pop" : 347, "state" : "VA" } +{ "_id" : "24324", "city" : "DRAPER", "loc" : [ -80.818752, 36.969743 ], "pop" : 1161, "state" : "VA" } +{ "_id" : "24325", "city" : "DUGSPUR", "loc" : [ -80.612348, 36.814546 ], "pop" : 1241, "state" : "VA" } +{ "_id" : "24326", "city" : "ELK CREEK", "loc" : [ -81.19148800000001, 36.730579 ], "pop" : 1161, "state" : "VA" } +{ "_id" : "24328", "city" : "FANCY GAP", "loc" : [ -80.69074999999999, 36.663972 ], "pop" : 1929, "state" : "VA" } +{ "_id" : "24330", "city" : "FRIES", "loc" : [ -81.00415700000001, 36.724683 ], "pop" : 4077, "state" : "VA" } +{ "_id" : "24333", "city" : "GALAX", "loc" : [ -80.911744, 36.656503 ], "pop" : 17442, "state" : "VA" } +{ "_id" : "24340", "city" : "GLADE SPRING", "loc" : [ -81.767639, 36.7779 ], "pop" : 4384, "state" : "VA" } +{ "_id" : "24343", "city" : "HILLSVILLE", "loc" : [ -80.71973, 36.744225 ], "pop" : 10578, "state" : "VA" } +{ "_id" : "24347", "city" : "ALLISONIA", "loc" : [ -80.63817299999999, 36.997815 ], "pop" : 2062, "state" : "VA" } +{ "_id" : "24348", "city" : "INDEPENDENCE", "loc" : [ -81.158202, 36.629444 ], "pop" : 3760, "state" : "VA" } +{ "_id" : "24350", "city" : "IVANHOE", "loc" : [ -80.97791100000001, 36.827225 ], "pop" : 1006, "state" : "VA" } +{ "_id" : "24351", "city" : "LAMBSBURG", "loc" : [ -80.760133, 36.577483 ], "pop" : 528, "state" : "VA" } +{ "_id" : "24352", "city" : "LAUREL FORK", "loc" : [ -80.514776, 36.707347 ], "pop" : 714, "state" : "VA" } +{ "_id" : "24354", "city" : "MARION", "loc" : [ -81.534914, 36.827316 ], "pop" : 16672, "state" : "VA" } +{ "_id" : "24360", "city" : "FOSTER FALLS", "loc" : [ -80.921391, 36.91708 ], "pop" : 4621, "state" : "VA" } +{ "_id" : "24361", "city" : "MEADOWVIEW", "loc" : [ -81.85120499999999, 36.761175 ], "pop" : 6288, "state" : "VA" } +{ "_id" : "24363", "city" : "MOUTH OF WILSON", "loc" : [ -81.39545200000001, 36.610379 ], "pop" : 1735, "state" : "VA" } +{ "_id" : "24366", "city" : "ROCKY GAP", "loc" : [ -81.155236, 37.244242 ], "pop" : 510, "state" : "VA" } +{ "_id" : "24368", "city" : "RURAL RETREAT", "loc" : [ -81.28787199999999, 36.883616 ], "pop" : 4350, "state" : "VA" } +{ "_id" : "24370", "city" : "SALTVILLE", "loc" : [ -81.740201, 36.892699 ], "pop" : 6739, "state" : "VA" } +{ "_id" : "24373", "city" : "SEVEN MILE FORD", "loc" : [ -81.645672, 36.815329 ], "pop" : 155, "state" : "VA" } +{ "_id" : "24374", "city" : "SPEEDWELL", "loc" : [ -81.183404, 36.799843 ], "pop" : 633, "state" : "VA" } +{ "_id" : "24375", "city" : "SUGAR GROVE", "loc" : [ -81.40844300000001, 36.773633 ], "pop" : 1237, "state" : "VA" } +{ "_id" : "24377", "city" : "TANNERSVILLE", "loc" : [ -81.628017, 36.976331 ], "pop" : 271, "state" : "VA" } +{ "_id" : "24378", "city" : "TROUT DALE", "loc" : [ -81.43500400000001, 36.68546 ], "pop" : 1261, "state" : "VA" } +{ "_id" : "24380", "city" : "WILLIS", "loc" : [ -80.490861, 36.874927 ], "pop" : 2769, "state" : "VA" } +{ "_id" : "24381", "city" : "WOODLAWN", "loc" : [ -80.882437, 36.787948 ], "pop" : 218, "state" : "VA" } +{ "_id" : "24382", "city" : "WYTHEVILLE", "loc" : [ -81.094082, 36.940669 ], "pop" : 13788, "state" : "VA" } +{ "_id" : "24401", "city" : "WOODRUM", "loc" : [ -79.07519000000001, 38.145104 ], "pop" : 34323, "state" : "VA" } +{ "_id" : "24413", "city" : "BLUE GRASS", "loc" : [ -79.561272, 38.515231 ], "pop" : 201, "state" : "VA" } +{ "_id" : "24416", "city" : "BUENA VISTA", "loc" : [ -79.352311, 37.739585 ], "pop" : 8464, "state" : "VA" } +{ "_id" : "24421", "city" : "CHURCHVILLE", "loc" : [ -79.179126, 38.234605 ], "pop" : 3411, "state" : "VA" } +{ "_id" : "24422", "city" : "CLIFTON FORGE", "loc" : [ -79.805423, 37.820342 ], "pop" : 7486, "state" : "VA" } +{ "_id" : "24426", "city" : "ALLEGHANY", "loc" : [ -80.003176, 37.784203 ], "pop" : 16958, "state" : "VA" } +{ "_id" : "24430", "city" : "CRAIGSVILLE", "loc" : [ -79.36188300000001, 38.076826 ], "pop" : 3008, "state" : "VA" } +{ "_id" : "24431", "city" : "CRIMORA", "loc" : [ -78.841275, 38.168422 ], "pop" : 2153, "state" : "VA" } +{ "_id" : "24432", "city" : "DEERFIELD", "loc" : [ -79.41518600000001, 38.184231 ], "pop" : 389, "state" : "VA" } +{ "_id" : "24433", "city" : "DOE HILL", "loc" : [ -79.482176, 38.390248 ], "pop" : 265, "state" : "VA" } +{ "_id" : "24435", "city" : "FAIRFIELD", "loc" : [ -79.297922, 37.877825 ], "pop" : 1314, "state" : "VA" } +{ "_id" : "24437", "city" : "FORT DEFIANCE", "loc" : [ -78.93258299999999, 38.210928 ], "pop" : 824, "state" : "VA" } +{ "_id" : "24439", "city" : "GOSHEN", "loc" : [ -79.47732499999999, 37.987813 ], "pop" : 1173, "state" : "VA" } +{ "_id" : "24440", "city" : "GREENVILLE", "loc" : [ -79.135876, 38.001804 ], "pop" : 1975, "state" : "VA" } +{ "_id" : "24441", "city" : "GROTTOES", "loc" : [ -78.82552800000001, 38.248371 ], "pop" : 3879, "state" : "VA" } +{ "_id" : "24442", "city" : "HEAD WATERS", "loc" : [ -79.435272, 38.294611 ], "pop" : 87, "state" : "VA" } +{ "_id" : "24444", "city" : "HIGHTOWN", "loc" : [ -79.592927, 38.464597 ], "pop" : 192, "state" : "VA" } +{ "_id" : "24445", "city" : "HOT SPRINGS", "loc" : [ -79.871662, 37.963784 ], "pop" : 2506, "state" : "VA" } +{ "_id" : "24450", "city" : "LEXINGTON", "loc" : [ -79.458111, 37.788463 ], "pop" : 14306, "state" : "VA" } +{ "_id" : "24458", "city" : "MC DOWELL", "loc" : [ -79.49879799999999, 38.326588 ], "pop" : 353, "state" : "VA" } +{ "_id" : "24459", "city" : "MIDDLEBROOK", "loc" : [ -79.281165, 38.024158 ], "pop" : 527, "state" : "VA" } +{ "_id" : "24460", "city" : "MILLBORO SPRING", "loc" : [ -79.640649, 38.005795 ], "pop" : 1586, "state" : "VA" } +{ "_id" : "24464", "city" : "MONTEBELLO", "loc" : [ -79.06107900000001, 37.839931 ], "pop" : 579, "state" : "VA" } +{ "_id" : "24465", "city" : "MONTEREY", "loc" : [ -79.59407, 38.405821 ], "pop" : 1335, "state" : "VA" } +{ "_id" : "24467", "city" : "MOUNT SIDNEY", "loc" : [ -78.97296, 38.261185 ], "pop" : 1787, "state" : "VA" } +{ "_id" : "24468", "city" : "MUSTOE", "loc" : [ -79.659137, 38.286216 ], "pop" : 202, "state" : "VA" } +{ "_id" : "24471", "city" : "PORT REPUBLIC", "loc" : [ -78.810388, 38.317167 ], "pop" : 1196, "state" : "VA" } +{ "_id" : "24472", "city" : "RAPHINE", "loc" : [ -79.221903, 37.937353 ], "pop" : 2238, "state" : "VA" } +{ "_id" : "24473", "city" : "ROCKBRIDGE BATHS", "loc" : [ -79.387421, 37.896458 ], "pop" : 677, "state" : "VA" } +{ "_id" : "24475", "city" : "SPOTTSWOOD", "loc" : [ -79.221141, 37.968418 ], "pop" : 393, "state" : "VA" } +{ "_id" : "24477", "city" : "STUARTS DRAFT", "loc" : [ -79.029821, 38.014423 ], "pop" : 5317, "state" : "VA" } +{ "_id" : "24479", "city" : "SWOOPE", "loc" : [ -79.187281, 38.159117 ], "pop" : 1477, "state" : "VA" } +{ "_id" : "24482", "city" : "VERONA", "loc" : [ -79.005872, 38.203726 ], "pop" : 4491, "state" : "VA" } +{ "_id" : "24483", "city" : "VESUVIUS", "loc" : [ -79.21348500000001, 37.83777 ], "pop" : 548, "state" : "VA" } +{ "_id" : "24484", "city" : "BOLAR", "loc" : [ -79.80779200000001, 38.085119 ], "pop" : 940, "state" : "VA" } +{ "_id" : "24485", "city" : "WEST AUGUSTA", "loc" : [ -79.320139, 38.274397 ], "pop" : 350, "state" : "VA" } +{ "_id" : "24486", "city" : "WEYERS CAVE", "loc" : [ -78.92345400000001, 38.293145 ], "pop" : 2190, "state" : "VA" } +{ "_id" : "24487", "city" : "BURNSVILLE", "loc" : [ -79.65060699999999, 38.177907 ], "pop" : 170, "state" : "VA" } +{ "_id" : "24501", "city" : "LYNCHBURG", "loc" : [ -79.171464, 37.386228 ], "pop" : 27264, "state" : "VA" } +{ "_id" : "24502", "city" : "TIMBERLAKE", "loc" : [ -79.211783, 37.359635 ], "pop" : 28755, "state" : "VA" } +{ "_id" : "24503", "city" : "LYNCHBURG", "loc" : [ -79.204982, 37.437646 ], "pop" : 17816, "state" : "VA" } +{ "_id" : "24504", "city" : "LYNCHBURG", "loc" : [ -79.12142, 37.390422 ], "pop" : 10889, "state" : "VA" } +{ "_id" : "24517", "city" : "ALTAVISTA", "loc" : [ -79.291145, 37.122162 ], "pop" : 4043, "state" : "VA" } +{ "_id" : "24520", "city" : "ALTON", "loc" : [ -79.02023699999999, 36.589352 ], "pop" : 2557, "state" : "VA" } +{ "_id" : "24521", "city" : "AMHERST", "loc" : [ -79.050572, 37.602677 ], "pop" : 7343, "state" : "VA" } +{ "_id" : "24522", "city" : "APPOMATTOX", "loc" : [ -78.822445, 37.352951 ], "pop" : 8904, "state" : "VA" } +{ "_id" : "24523", "city" : "BEDFORD", "loc" : [ -79.53310999999999, 37.315345 ], "pop" : 16245, "state" : "VA" } +{ "_id" : "24526", "city" : "BIG ISLAND", "loc" : [ -79.382706, 37.530556 ], "pop" : 1313, "state" : "VA" } +{ "_id" : "24527", "city" : "BLAIRS", "loc" : [ -79.37886899999999, 36.667408 ], "pop" : 5007, "state" : "VA" } +{ "_id" : "24528", "city" : "BROOKNEAL", "loc" : [ -78.922679, 37.082663 ], "pop" : 4364, "state" : "VA" } +{ "_id" : "24529", "city" : "BUFFALO JUNCTION", "loc" : [ -78.60926600000001, 36.61676 ], "pop" : 3300, "state" : "VA" } +{ "_id" : "24530", "city" : "CALLANDS", "loc" : [ -79.62877899999999, 36.764748 ], "pop" : 2143, "state" : "VA" } +{ "_id" : "24531", "city" : "CHATHAM", "loc" : [ -79.429659, 36.83099 ], "pop" : 7825, "state" : "VA" } +{ "_id" : "24534", "city" : "CLOVER", "loc" : [ -78.78618, 36.863695 ], "pop" : 1516, "state" : "VA" } +{ "_id" : "24536", "city" : "COLEMAN FALLS", "loc" : [ -79.315757, 37.488659 ], "pop" : 286, "state" : "VA" } +{ "_id" : "24538", "city" : "CONCORD", "loc" : [ -78.98035299999999, 37.336953 ], "pop" : 3845, "state" : "VA" } +{ "_id" : "24539", "city" : "CRYSTAL HILL", "loc" : [ -78.970634, 36.873217 ], "pop" : 280, "state" : "VA" } +{ "_id" : "24540", "city" : "DANVILLE", "loc" : [ -79.412441, 36.621789 ], "pop" : 32061, "state" : "VA" } +{ "_id" : "24541", "city" : "DANVILLE", "loc" : [ -79.441112, 36.577937 ], "pop" : 33751, "state" : "VA" } +{ "_id" : "24549", "city" : "DRY FORK", "loc" : [ -79.457966, 36.743008 ], "pop" : 1989, "state" : "VA" } +{ "_id" : "24550", "city" : "EVINGTON", "loc" : [ -79.231723, 37.261049 ], "pop" : 4961, "state" : "VA" } +{ "_id" : "24551", "city" : "FOREST", "loc" : [ -79.279116, 37.337878 ], "pop" : 12905, "state" : "VA" } +{ "_id" : "24553", "city" : "GLADSTONE", "loc" : [ -78.850838, 37.547252 ], "pop" : 2025, "state" : "VA" } +{ "_id" : "24554", "city" : "GLADYS", "loc" : [ -79.104794, 37.138581 ], "pop" : 3511, "state" : "VA" } +{ "_id" : "24555", "city" : "GLASGOW", "loc" : [ -79.45898, 37.643 ], "pop" : 1604, "state" : "VA" } +{ "_id" : "24556", "city" : "GOODE", "loc" : [ -79.381277, 37.348098 ], "pop" : 2516, "state" : "VA" } +{ "_id" : "24557", "city" : "GRETNA", "loc" : [ -79.338874, 36.969515 ], "pop" : 8304, "state" : "VA" } +{ "_id" : "24558", "city" : "HALIFAX", "loc" : [ -78.94149400000001, 36.762571 ], "pop" : 7127, "state" : "VA" } +{ "_id" : "24562", "city" : "HOWARDSVILLE", "loc" : [ -78.58235500000001, 37.765891 ], "pop" : 21, "state" : "VA" } +{ "_id" : "24563", "city" : "HURT", "loc" : [ -79.299995, 37.079787 ], "pop" : 5283, "state" : "VA" } +{ "_id" : "24565", "city" : "JAVA", "loc" : [ -79.187034, 36.858582 ], "pop" : 1111, "state" : "VA" } +{ "_id" : "24566", "city" : "KEELING", "loc" : [ -79.278284, 36.715577 ], "pop" : 2651, "state" : "VA" } +{ "_id" : "24569", "city" : "LONG ISLAND", "loc" : [ -79.121933, 37.064374 ], "pop" : 1308, "state" : "VA" } +{ "_id" : "24570", "city" : "LOWRY", "loc" : [ -79.45559900000001, 37.33361 ], "pop" : 1342, "state" : "VA" } +{ "_id" : "24571", "city" : "LYNCH STATION", "loc" : [ -79.329716, 37.152826 ], "pop" : 2819, "state" : "VA" } +{ "_id" : "24572", "city" : "MADISON HEIGHTS", "loc" : [ -79.11408900000001, 37.453102 ], "pop" : 15389, "state" : "VA" } +{ "_id" : "24574", "city" : "MONROE", "loc" : [ -79.17034, 37.541366 ], "pop" : 5050, "state" : "VA" } +{ "_id" : "24577", "city" : "LENNIG", "loc" : [ -78.989766, 36.944179 ], "pop" : 5018, "state" : "VA" } +{ "_id" : "24578", "city" : "NATURAL BRIDGE", "loc" : [ -79.533045, 37.660625 ], "pop" : 1236, "state" : "VA" } +{ "_id" : "24579", "city" : "NATURAL BRIDGE S", "loc" : [ -79.503905, 37.595667 ], "pop" : 1419, "state" : "VA" } +{ "_id" : "24580", "city" : "NELSON", "loc" : [ -78.670959, 36.558558 ], "pop" : 131, "state" : "VA" } +{ "_id" : "24586", "city" : "RINGGOLD", "loc" : [ -79.298835, 36.603483 ], "pop" : 4728, "state" : "VA" } +{ "_id" : "24588", "city" : "RUSTBURG", "loc" : [ -79.12150699999999, 37.25454 ], "pop" : 4723, "state" : "VA" } +{ "_id" : "24589", "city" : "SCOTTSBURG", "loc" : [ -78.786601, 36.786194 ], "pop" : 2965, "state" : "VA" } +{ "_id" : "24590", "city" : "SCOTTSVILLE", "loc" : [ -78.47398099999999, 37.804937 ], "pop" : 5769, "state" : "VA" } +{ "_id" : "24592", "city" : "SOUTH BOSTON", "loc" : [ -78.918829, 36.696335 ], "pop" : 12624, "state" : "VA" } +{ "_id" : "24593", "city" : "SPOUT SPRING", "loc" : [ -78.90588700000001, 37.364345 ], "pop" : 872, "state" : "VA" } +{ "_id" : "24594", "city" : "SUTHERLIN", "loc" : [ -79.19495000000001, 36.625831 ], "pop" : 1018, "state" : "VA" } +{ "_id" : "24597", "city" : "INGRAM", "loc" : [ -79.110874, 36.786684 ], "pop" : 1648, "state" : "VA" } +{ "_id" : "24598", "city" : "VIRGILINA", "loc" : [ -78.760516, 36.606231 ], "pop" : 2435, "state" : "VA" } +{ "_id" : "24599", "city" : "WINGINA", "loc" : [ -78.755709, 37.641473 ], "pop" : 833, "state" : "VA" } +{ "_id" : "24602", "city" : "BANDY", "loc" : [ -81.6508, 37.166112 ], "pop" : 2348, "state" : "VA" } +{ "_id" : "24603", "city" : "CONAWAY", "loc" : [ -82.22459600000001, 37.318638 ], "pop" : 1151, "state" : "VA" } +{ "_id" : "24605", "city" : "BLUEFIELD", "loc" : [ -81.325114, 37.249512 ], "pop" : 10931, "state" : "VA" } +{ "_id" : "24609", "city" : "CEDAR BLUFF", "loc" : [ -81.76678800000001, 37.079076 ], "pop" : 3486, "state" : "VA" } +{ "_id" : "24613", "city" : "FALLS MILLS", "loc" : [ -81.318234, 37.271023 ], "pop" : 960, "state" : "VA" } +{ "_id" : "24614", "city" : "GRUNDY", "loc" : [ -82.106077, 37.296678 ], "pop" : 10245, "state" : "VA" } +{ "_id" : "24620", "city" : "HURLEY", "loc" : [ -82.02616399999999, 37.401741 ], "pop" : 5296, "state" : "VA" } +{ "_id" : "24622", "city" : "JEWELL VALLEY", "loc" : [ -81.810654, 37.222372 ], "pop" : 1213, "state" : "VA" } +{ "_id" : "24627", "city" : "MAVISDALE", "loc" : [ -82.221599, 37.200817 ], "pop" : 141, "state" : "VA" } +{ "_id" : "24630", "city" : "TIPTOP", "loc" : [ -81.525256, 37.152447 ], "pop" : 6771, "state" : "VA" } +{ "_id" : "24631", "city" : "PATTERSON", "loc" : [ -81.99157700000001, 37.184074 ], "pop" : 1356, "state" : "VA" } +{ "_id" : "24634", "city" : "PILGRIMS KNOB", "loc" : [ -81.911896, 37.298944 ], "pop" : 766, "state" : "VA" } +{ "_id" : "24637", "city" : "POUNDING MILL", "loc" : [ -81.730052, 37.059584 ], "pop" : 3942, "state" : "VA" } +{ "_id" : "24639", "city" : "RAVEN", "loc" : [ -81.889557, 37.148056 ], "pop" : 3441, "state" : "VA" } +{ "_id" : "24641", "city" : "RICHLANDS", "loc" : [ -81.812286, 37.094051 ], "pop" : 8026, "state" : "VA" } +{ "_id" : "24646", "city" : "ROWE", "loc" : [ -82.02738100000001, 37.127593 ], "pop" : 1531, "state" : "VA" } +{ "_id" : "24649", "city" : "SWORDS CREEK", "loc" : [ -81.908385, 37.073792 ], "pop" : 2756, "state" : "VA" } +{ "_id" : "24651", "city" : "TAZEWELL", "loc" : [ -81.50997599999999, 37.107773 ], "pop" : 7023, "state" : "VA" } +{ "_id" : "24656", "city" : "VANSANT", "loc" : [ -82.12771499999999, 37.173811 ], "pop" : 4724, "state" : "VA" } +{ "_id" : "24657", "city" : "WHITEWOOD", "loc" : [ -81.890361, 37.264409 ], "pop" : 731, "state" : "VA" } +{ "_id" : "24701", "city" : "BLUEWELL", "loc" : [ -81.229023, 37.279788 ], "pop" : 22561, "state" : "WV" } +{ "_id" : "24712", "city" : "ATHENS", "loc" : [ -80.997362, 37.432298 ], "pop" : 2863, "state" : "WV" } +{ "_id" : "24714", "city" : "BEESON", "loc" : [ -81.206215, 37.490894 ], "pop" : 140, "state" : "WV" } +{ "_id" : "24715", "city" : "BRAMWELL", "loc" : [ -81.32556, 37.332114 ], "pop" : 762, "state" : "WV" } +{ "_id" : "24726", "city" : "HERNDON", "loc" : [ -81.346777, 37.526431 ], "pop" : 2220, "state" : "WV" } +{ "_id" : "24731", "city" : "KEGLEY", "loc" : [ -81.140117, 37.408384 ], "pop" : 259, "state" : "WV" } +{ "_id" : "24733", "city" : "LASHMEET", "loc" : [ -81.21384500000001, 37.441997 ], "pop" : 730, "state" : "WV" } +{ "_id" : "24736", "city" : "DOTT", "loc" : [ -81.268017, 37.441778 ], "pop" : 1365, "state" : "WV" } +{ "_id" : "24740", "city" : "ELGOOD", "loc" : [ -81.086386, 37.366817 ], "pop" : 29167, "state" : "WV" } +{ "_id" : "24747", "city" : "DUHRING", "loc" : [ -81.218766, 37.38889 ], "pop" : 5336, "state" : "WV" } +{ "_id" : "24801", "city" : "WELCH", "loc" : [ -81.534412, 37.400032 ], "pop" : 11143, "state" : "WV" } +{ "_id" : "24810", "city" : "MC DOWELL", "loc" : [ -81.387601, 37.414348 ], "pop" : 1968, "state" : "WV" } +{ "_id" : "24818", "city" : "BRENTON", "loc" : [ -81.649502, 37.584362 ], "pop" : 1908, "state" : "WV" } +{ "_id" : "24819", "city" : "VALLSCREEK", "loc" : [ -81.69552, 37.295548 ], "pop" : 4476, "state" : "WV" } +{ "_id" : "24822", "city" : "CLEAR FORK", "loc" : [ -81.689268, 37.646301 ], "pop" : 1173, "state" : "WV" } +{ "_id" : "24823", "city" : "COAL MOUNTAIN", "loc" : [ -81.70786200000001, 37.688486 ], "pop" : 850, "state" : "WV" } +{ "_id" : "24827", "city" : "CYCLONE", "loc" : [ -81.650458, 37.74466 ], "pop" : 1328, "state" : "WV" } +{ "_id" : "24828", "city" : "ASCO", "loc" : [ -81.667889, 37.468339 ], "pop" : 2765, "state" : "WV" } +{ "_id" : "24834", "city" : "FANROCK", "loc" : [ -81.623631, 37.562721 ], "pop" : 120, "state" : "WV" } +{ "_id" : "24839", "city" : "HANOVER", "loc" : [ -81.81361699999999, 37.563029 ], "pop" : 1523, "state" : "WV" } +{ "_id" : "24844", "city" : "IAEGER", "loc" : [ -81.811992, 37.449878 ], "pop" : 5720, "state" : "WV" } +{ "_id" : "24849", "city" : "JESSE", "loc" : [ -81.562831, 37.660844 ], "pop" : 585, "state" : "WV" } +{ "_id" : "24850", "city" : "JOLO", "loc" : [ -81.831602, 37.332431 ], "pop" : 3086, "state" : "WV" } +{ "_id" : "24859", "city" : "MARIANNA", "loc" : [ -81.576052, 37.611425 ], "pop" : 1008, "state" : "WV" } +{ "_id" : "24860", "city" : "MATHENY", "loc" : [ -81.59571099999999, 37.661956 ], "pop" : 1139, "state" : "WV" } +{ "_id" : "24862", "city" : "MOHAWK", "loc" : [ -81.914174, 37.487926 ], "pop" : 1705, "state" : "WV" } +{ "_id" : "24868", "city" : "ALGOMA", "loc" : [ -81.41583900000001, 37.395262 ], "pop" : 2158, "state" : "WV" } +{ "_id" : "24869", "city" : "NORTH SPRING", "loc" : [ -81.797276, 37.517954 ], "pop" : 226, "state" : "WV" } +{ "_id" : "24870", "city" : "OCEANA", "loc" : [ -81.62156400000001, 37.703874 ], "pop" : 4243, "state" : "WV" } +{ "_id" : "24873", "city" : "PAYNESVILLE", "loc" : [ -81.68449, 37.365273 ], "pop" : 1895, "state" : "WV" } +{ "_id" : "24874", "city" : "PINEVILLE", "loc" : [ -81.533642, 37.584022 ], "pop" : 4142, "state" : "WV" } +{ "_id" : "24882", "city" : "SIMON", "loc" : [ -81.758566, 37.619708 ], "pop" : 782, "state" : "WV" } +{ "_id" : "24884", "city" : "SQUIRE", "loc" : [ -81.580478, 37.237019 ], "pop" : 995, "state" : "WV" } +{ "_id" : "24901", "city" : "LEWISBURG", "loc" : [ -80.440669, 37.808253 ], "pop" : 8645, "state" : "WV" } +{ "_id" : "24910", "city" : "DAWSON", "loc" : [ -80.671306, 37.730148 ], "pop" : 4475, "state" : "WV" } +{ "_id" : "24915", "city" : "ARBOVALE", "loc" : [ -79.793403, 38.454575 ], "pop" : 528, "state" : "WV" } +{ "_id" : "24916", "city" : "ASBURY", "loc" : [ -80.565319, 37.848766 ], "pop" : 598, "state" : "WV" } +{ "_id" : "24917", "city" : "AUTO", "loc" : [ -80.117105, 37.981697 ], "pop" : 379, "state" : "WV" } +{ "_id" : "24918", "city" : "BALLARD", "loc" : [ -80.76139000000001, 37.49803 ], "pop" : 1194, "state" : "WV" } +{ "_id" : "24919", "city" : "BALLENGEE", "loc" : [ -80.74033900000001, 37.616931 ], "pop" : 184, "state" : "WV" } +{ "_id" : "24920", "city" : "BARTOW", "loc" : [ -79.795242, 38.551266 ], "pop" : 748, "state" : "WV" } +{ "_id" : "24923", "city" : "BOZOO", "loc" : [ -80.814954, 37.457015 ], "pop" : 651, "state" : "WV" } +{ "_id" : "24924", "city" : "BUCKEYE", "loc" : [ -80.139342, 38.181506 ], "pop" : 550, "state" : "WV" } +{ "_id" : "24925", "city" : "CALDWELL", "loc" : [ -80.377298, 37.773488 ], "pop" : 312, "state" : "WV" } +{ "_id" : "24927", "city" : "STONY BOTTOM", "loc" : [ -79.885278, 38.433659 ], "pop" : 844, "state" : "WV" } +{ "_id" : "24928", "city" : "CLINTONVILLE", "loc" : [ -80.626192, 37.906141 ], "pop" : 373, "state" : "WV" } +{ "_id" : "24931", "city" : "CRAWLEY", "loc" : [ -80.6309, 37.939676 ], "pop" : 286, "state" : "WV" } +{ "_id" : "24934", "city" : "DUNMORE", "loc" : [ -79.855557, 38.363605 ], "pop" : 265, "state" : "WV" } +{ "_id" : "24935", "city" : "INDIAN MILLS", "loc" : [ -80.81492299999999, 37.56005 ], "pop" : 368, "state" : "WV" } +{ "_id" : "24936", "city" : "FORT SPRING", "loc" : [ -80.566723, 37.745661 ], "pop" : 397, "state" : "WV" } +{ "_id" : "24938", "city" : "ANTHONY", "loc" : [ -80.36469200000001, 37.90361 ], "pop" : 814, "state" : "WV" } +{ "_id" : "24941", "city" : "GAP MILLS", "loc" : [ -80.390497, 37.527978 ], "pop" : 289, "state" : "WV" } +{ "_id" : "24942", "city" : "GLACE", "loc" : [ -80.37471600000001, 37.609381 ], "pop" : 399, "state" : "WV" } +{ "_id" : "24943", "city" : "GRASSY MEADOWS", "loc" : [ -80.73023999999999, 37.842757 ], "pop" : 185, "state" : "WV" } +{ "_id" : "24944", "city" : "GREEN BANK", "loc" : [ -79.801535, 38.409664 ], "pop" : 365, "state" : "WV" } +{ "_id" : "24945", "city" : "GREENVILLE", "loc" : [ -80.67612800000001, 37.521184 ], "pop" : 1139, "state" : "WV" } +{ "_id" : "24946", "city" : "DROOP", "loc" : [ -80.244578, 38.125942 ], "pop" : 1393, "state" : "WV" } +{ "_id" : "24950", "city" : "KIEFFER", "loc" : [ -80.59022, 37.942998 ], "pop" : 2, "state" : "WV" } +{ "_id" : "24951", "city" : "LINDSIDE", "loc" : [ -80.62027999999999, 37.481651 ], "pop" : 810, "state" : "WV" } +{ "_id" : "24954", "city" : "MINNEHAHA SPRING", "loc" : [ -80.060884, 38.229303 ], "pop" : 3713, "state" : "WV" } +{ "_id" : "24957", "city" : "MAXWELTON", "loc" : [ -80.427492, 37.900465 ], "pop" : 139, "state" : "WV" } +{ "_id" : "24958", "city" : "MEADOW BLUFF", "loc" : [ -80.728162, 37.89587 ], "pop" : 233, "state" : "WV" } +{ "_id" : "24962", "city" : "PENCE SPRINGS", "loc" : [ -80.709234, 37.676694 ], "pop" : 310, "state" : "WV" } +{ "_id" : "24963", "city" : "PETERSTOWN", "loc" : [ -80.76860499999999, 37.414709 ], "pop" : 3117, "state" : "WV" } +{ "_id" : "24966", "city" : "RENICK", "loc" : [ -80.36529400000001, 37.992168 ], "pop" : 1530, "state" : "WV" } +{ "_id" : "24970", "city" : "RONCEVERTE", "loc" : [ -80.462583, 37.741758 ], "pop" : 4167, "state" : "WV" } +{ "_id" : "24974", "city" : "SECONDCREEK", "loc" : [ -80.41807900000001, 37.660246 ], "pop" : 452, "state" : "WV" } +{ "_id" : "24976", "city" : "PICKAWAY", "loc" : [ -80.51690499999999, 37.662078 ], "pop" : 971, "state" : "WV" } +{ "_id" : "24977", "city" : "SMOOT", "loc" : [ -80.668038, 37.877166 ], "pop" : 634, "state" : "WV" } +{ "_id" : "24980", "city" : "SWEET SPRINGS", "loc" : [ -80.298959, 37.611159 ], "pop" : 571, "state" : "WV" } +{ "_id" : "24981", "city" : "TALCOTT", "loc" : [ -80.746143, 37.649079 ], "pop" : 511, "state" : "WV" } +{ "_id" : "24983", "city" : "UNION", "loc" : [ -80.524767, 37.580175 ], "pop" : 1737, "state" : "WV" } +{ "_id" : "24984", "city" : "WAITEVILLE", "loc" : [ -80.463447, 37.464514 ], "pop" : 62, "state" : "WV" } +{ "_id" : "24985", "city" : "WAYSIDE", "loc" : [ -80.745806, 37.593657 ], "pop" : 421, "state" : "WV" } +{ "_id" : "24986", "city" : "NEOLA", "loc" : [ -80.27464000000001, 37.814618 ], "pop" : 5096, "state" : "WV" } +{ "_id" : "24991", "city" : "TROUT", "loc" : [ -80.517321, 37.94421 ], "pop" : 998, "state" : "WV" } +{ "_id" : "24993", "city" : "WOLFCREEK", "loc" : [ -80.611254, 37.618788 ], "pop" : 249, "state" : "WV" } +{ "_id" : "25003", "city" : "ALUM CREEK", "loc" : [ -81.786258, 38.285814 ], "pop" : 1450, "state" : "WV" } +{ "_id" : "25004", "city" : "AMEAGLE", "loc" : [ -81.406507, 37.964068 ], "pop" : 623, "state" : "WV" } +{ "_id" : "25005", "city" : "AMMA", "loc" : [ -81.253182, 38.545518 ], "pop" : 414, "state" : "WV" } +{ "_id" : "25007", "city" : "ARNETT", "loc" : [ -81.435484, 37.850214 ], "pop" : 2073, "state" : "WV" } +{ "_id" : "25008", "city" : "ARTIE", "loc" : [ -81.378772, 37.918139 ], "pop" : 407, "state" : "WV" } +{ "_id" : "25009", "city" : "ASHFORD", "loc" : [ -81.711324, 38.182291 ], "pop" : 1329, "state" : "WV" } +{ "_id" : "25010", "city" : "BALD KNOB", "loc" : [ -81.62294300000001, 37.844023 ], "pop" : 666, "state" : "WV" } +{ "_id" : "25013", "city" : "BARRETT", "loc" : [ -81.64831, 37.880201 ], "pop" : 50, "state" : "WV" } +{ "_id" : "25015", "city" : "DIAMOND", "loc" : [ -81.50581200000001, 38.225381 ], "pop" : 7120, "state" : "WV" } +{ "_id" : "25018", "city" : "BENTREE", "loc" : [ -81.21565, 38.297088 ], "pop" : 377, "state" : "WV" } +{ "_id" : "25019", "city" : "FOLA", "loc" : [ -81.106838, 38.365947 ], "pop" : 793, "state" : "WV" } +{ "_id" : "25021", "city" : "BIM", "loc" : [ -81.688047, 37.893437 ], "pop" : 1061, "state" : "WV" } +{ "_id" : "25024", "city" : "BLOOMINGROSE", "loc" : [ -81.636737, 38.141189 ], "pop" : 191, "state" : "WV" } +{ "_id" : "25025", "city" : "BLOUNT", "loc" : [ -81.40519399999999, 38.312116 ], "pop" : 583, "state" : "WV" } +{ "_id" : "25028", "city" : "BOB WHITE", "loc" : [ -81.720884, 37.958711 ], "pop" : 570, "state" : "WV" } +{ "_id" : "25030", "city" : "BOMONT", "loc" : [ -81.21999, 38.407295 ], "pop" : 129, "state" : "WV" } +{ "_id" : "25033", "city" : "BUFFALO", "loc" : [ -81.94997100000001, 38.60924 ], "pop" : 1898, "state" : "WV" } +{ "_id" : "25034", "city" : "BURNWELL", "loc" : [ -81.37647, 38.053014 ], "pop" : 23, "state" : "WV" } +{ "_id" : "25035", "city" : "CABIN CREEK", "loc" : [ -81.515258, 38.185795 ], "pop" : 1289, "state" : "WV" } +{ "_id" : "25039", "city" : "CEDAR GROVE", "loc" : [ -81.406711, 38.213286 ], "pop" : 3463, "state" : "WV" } +{ "_id" : "25043", "city" : "CLAY", "loc" : [ -81.069588, 38.476354 ], "pop" : 2881, "state" : "WV" } +{ "_id" : "25044", "city" : "CLEAR CREEK", "loc" : [ -81.320866, 37.89158 ], "pop" : 262, "state" : "WV" } +{ "_id" : "25045", "city" : "QUICK", "loc" : [ -81.356039, 38.477687 ], "pop" : 5864, "state" : "WV" } +{ "_id" : "25046", "city" : "CLIO", "loc" : [ -81.307188, 38.572686 ], "pop" : 458, "state" : "WV" } +{ "_id" : "25047", "city" : "CLOTHIER", "loc" : [ -81.988142, 37.79333 ], "pop" : 1379, "state" : "WV" } +{ "_id" : "25048", "city" : "COLCORD", "loc" : [ -81.443699, 37.949166 ], "pop" : 405, "state" : "WV" } +{ "_id" : "25049", "city" : "COMFORT", "loc" : [ -81.596177, 38.137191 ], "pop" : 889, "state" : "WV" } +{ "_id" : "25051", "city" : "COSTA", "loc" : [ -81.708015, 38.164693 ], "pop" : 134, "state" : "WV" } +{ "_id" : "25053", "city" : "DANVILLE", "loc" : [ -81.85422699999999, 38.03356 ], "pop" : 4129, "state" : "WV" } +{ "_id" : "25059", "city" : "DIXIE", "loc" : [ -81.186249, 38.26631 ], "pop" : 795, "state" : "WV" } +{ "_id" : "25060", "city" : "DOROTHY", "loc" : [ -81.496842, 37.96219 ], "pop" : 524, "state" : "WV" } +{ "_id" : "25062", "city" : "DRY CREEK", "loc" : [ -81.481398, 37.860686 ], "pop" : 209, "state" : "WV" } +{ "_id" : "25063", "city" : "DUCK", "loc" : [ -80.976416, 38.564652 ], "pop" : 679, "state" : "WV" } +{ "_id" : "25064", "city" : "DUNBAR", "loc" : [ -81.742467, 38.368271 ], "pop" : 11543, "state" : "WV" } +{ "_id" : "25071", "city" : "FRAME", "loc" : [ -81.481739, 38.432317 ], "pop" : 10333, "state" : "WV" } +{ "_id" : "25079", "city" : "FALLING ROCK", "loc" : [ -81.38087400000001, 38.475579 ], "pop" : 353, "state" : "WV" } +{ "_id" : "25081", "city" : "FOSTER", "loc" : [ -81.76587600000001, 38.090819 ], "pop" : 1584, "state" : "WV" } +{ "_id" : "25082", "city" : "FRAZIERS BOTTOM", "loc" : [ -82.01106799999999, 38.551678 ], "pop" : 911, "state" : "WV" } +{ "_id" : "25083", "city" : "WHITTAKER", "loc" : [ -81.386231, 38.189406 ], "pop" : 2542, "state" : "WV" } +{ "_id" : "25085", "city" : "GAULEY BRIDGE", "loc" : [ -81.19596, 38.168899 ], "pop" : 826, "state" : "WV" } +{ "_id" : "25088", "city" : "GLEN", "loc" : [ -81.223401, 38.368989 ], "pop" : 74, "state" : "WV" } +{ "_id" : "25093", "city" : "GORDON", "loc" : [ -81.67131999999999, 37.978191 ], "pop" : 251, "state" : "WV" } +{ "_id" : "25103", "city" : "HANSFORD", "loc" : [ -81.395026, 38.127158 ], "pop" : 165, "state" : "WV" } +{ "_id" : "25105", "city" : "HARRISON", "loc" : [ -80.916068, 38.498979 ], "pop" : 163, "state" : "WV" } +{ "_id" : "25106", "city" : "HENDERSON", "loc" : [ -82.136381, 38.826512 ], "pop" : 747, "state" : "WV" } +{ "_id" : "25107", "city" : "HERNSHAW", "loc" : [ -81.61298600000001, 38.194212 ], "pop" : 745, "state" : "WV" } +{ "_id" : "25108", "city" : "HEWETT", "loc" : [ -81.850919, 37.958097 ], "pop" : 625, "state" : "WV" } +{ "_id" : "25111", "city" : "INDORE", "loc" : [ -81.157495, 38.339672 ], "pop" : 1173, "state" : "WV" } +{ "_id" : "25113", "city" : "BIG OTTER", "loc" : [ -81.033506, 38.530476 ], "pop" : 145, "state" : "WV" } +{ "_id" : "25114", "city" : "RAMAGE", "loc" : [ -81.80030499999999, 37.957023 ], "pop" : 593, "state" : "WV" } +{ "_id" : "25115", "city" : "KANAWHA FALLS", "loc" : [ -81.162753, 38.107932 ], "pop" : 98, "state" : "WV" } +{ "_id" : "25118", "city" : "KIMBERLY", "loc" : [ -81.321721, 38.124928 ], "pop" : 108, "state" : "WV" } +{ "_id" : "25119", "city" : "KINCAID", "loc" : [ -81.26897, 38.032065 ], "pop" : 94, "state" : "WV" } +{ "_id" : "25121", "city" : "LAKE", "loc" : [ -81.95115199999999, 37.946191 ], "pop" : 3384, "state" : "WV" } +{ "_id" : "25122", "city" : "CARBON", "loc" : [ -81.451228, 38.098249 ], "pop" : 2581, "state" : "WV" } +{ "_id" : "25123", "city" : "ARBUCKLE", "loc" : [ -81.909244, 38.753046 ], "pop" : 2325, "state" : "WV" } +{ "_id" : "25124", "city" : "LIBERTY", "loc" : [ -81.767813, 38.619978 ], "pop" : 1050, "state" : "WV" } +{ "_id" : "25125", "city" : "LIZEMORES", "loc" : [ -81.16325500000001, 38.336609 ], "pop" : 84, "state" : "WV" } +{ "_id" : "25130", "city" : "MADISON", "loc" : [ -81.793757, 38.044426 ], "pop" : 4476, "state" : "WV" } +{ "_id" : "25132", "city" : "MAMMOTH", "loc" : [ -81.350893, 38.258319 ], "pop" : 486, "state" : "WV" } +{ "_id" : "25133", "city" : "MAYSEL", "loc" : [ -81.122653, 38.493924 ], "pop" : 223, "state" : "WV" } +{ "_id" : "25136", "city" : "MONTGOMERY", "loc" : [ -81.28135399999999, 38.141232 ], "pop" : 10392, "state" : "WV" } +{ "_id" : "25139", "city" : "MOUNT CARBON", "loc" : [ -81.33337299999999, 38.160097 ], "pop" : 0, "state" : "WV" } +{ "_id" : "25140", "city" : "NAOMA", "loc" : [ -81.521372, 37.915381 ], "pop" : 864, "state" : "WV" } +{ "_id" : "25141", "city" : "NEBO", "loc" : [ -81.025657, 38.627069 ], "pop" : 222, "state" : "WV" } +{ "_id" : "25142", "city" : "NELLIS", "loc" : [ -81.73990499999999, 38.152066 ], "pop" : 104, "state" : "WV" } +{ "_id" : "25143", "city" : "NITRO", "loc" : [ -81.829311, 38.419323 ], "pop" : 9525, "state" : "WV" } +{ "_id" : "25148", "city" : "ORGAS", "loc" : [ -81.57383, 38.073646 ], "pop" : 840, "state" : "WV" } +{ "_id" : "25150", "city" : "OVAPA", "loc" : [ -81.14846, 38.523398 ], "pop" : 525, "state" : "WV" } +{ "_id" : "25154", "city" : "PEYTONA", "loc" : [ -81.701836, 38.124952 ], "pop" : 754, "state" : "WV" } +{ "_id" : "25158", "city" : "PLINY", "loc" : [ -82.015494, 38.614206 ], "pop" : 352, "state" : "WV" } +{ "_id" : "25159", "city" : "LANHAM", "loc" : [ -81.80511, 38.488297 ], "pop" : 5813, "state" : "WV" } +{ "_id" : "25160", "city" : "POND GAP", "loc" : [ -81.28658, 38.290434 ], "pop" : 394, "state" : "WV" } +{ "_id" : "25161", "city" : "POWELLTON", "loc" : [ -81.31792299999999, 38.099172 ], "pop" : 1148, "state" : "WV" } +{ "_id" : "25163", "city" : "WILLIAMS MOUNTAI", "loc" : [ -81.623901, 38.008351 ], "pop" : 684, "state" : "WV" } +{ "_id" : "25164", "city" : "PIGEON", "loc" : [ -81.226286, 38.472167 ], "pop" : 1064, "state" : "WV" } +{ "_id" : "25165", "city" : "RACINE", "loc" : [ -81.655742, 38.149524 ], "pop" : 539, "state" : "WV" } +{ "_id" : "25168", "city" : "RED HOUSE", "loc" : [ -81.90447399999999, 38.546298 ], "pop" : 3472, "state" : "WV" } +{ "_id" : "25169", "city" : "RIDGEVIEW", "loc" : [ -81.772548, 38.148576 ], "pop" : 793, "state" : "WV" } +{ "_id" : "25172", "city" : "ROBERTSBURG", "loc" : [ -81.9109, 38.644143 ], "pop" : 590, "state" : "WV" } +{ "_id" : "25173", "city" : "ROBSON", "loc" : [ -81.248758, 38.097263 ], "pop" : 39, "state" : "WV" } +{ "_id" : "25174", "city" : "ROCK CREEK", "loc" : [ -81.48367399999999, 37.836673 ], "pop" : 533, "state" : "WV" } +{ "_id" : "25177", "city" : "SAINT ALBANS", "loc" : [ -81.83046299999999, 38.37743 ], "pop" : 24409, "state" : "WV" } +{ "_id" : "25180", "city" : "SAXON", "loc" : [ -81.43227899999999, 37.786108 ], "pop" : 154, "state" : "WV" } +{ "_id" : "25181", "city" : "SETH", "loc" : [ -81.639258, 38.097057 ], "pop" : 1095, "state" : "WV" } +{ "_id" : "25187", "city" : "SOUTHSIDE", "loc" : [ -81.996596, 38.711994 ], "pop" : 446, "state" : "WV" } +{ "_id" : "25189", "city" : "STICKNEY", "loc" : [ -81.497001, 37.876844 ], "pop" : 18, "state" : "WV" } +{ "_id" : "25193", "city" : "SYLVESTER", "loc" : [ -81.54915099999999, 38.009075 ], "pop" : 1020, "state" : "WV" } +{ "_id" : "25202", "city" : "TORNADO", "loc" : [ -81.847555, 38.335697 ], "pop" : 1500, "state" : "WV" } +{ "_id" : "25203", "city" : "TURTLE CREEK", "loc" : [ -81.853499, 38.042715 ], "pop" : 669, "state" : "WV" } +{ "_id" : "25204", "city" : "BANDYTOWN", "loc" : [ -81.635204, 37.921015 ], "pop" : 500, "state" : "WV" } +{ "_id" : "25206", "city" : "VAN", "loc" : [ -81.702175, 37.971152 ], "pop" : 9, "state" : "WV" } +{ "_id" : "25209", "city" : "GARRISON", "loc" : [ -81.534013, 37.978677 ], "pop" : 681, "state" : "WV" } +{ "_id" : "25213", "city" : "WINFIELD", "loc" : [ -81.889965, 38.507178 ], "pop" : 3958, "state" : "WV" } +{ "_id" : "25214", "city" : "WINIFREDE", "loc" : [ -81.558747, 38.185245 ], "pop" : 126, "state" : "WV" } +{ "_id" : "25231", "city" : "ADVENT", "loc" : [ -81.572063, 38.623595 ], "pop" : 189, "state" : "WV" } +{ "_id" : "25234", "city" : "ARNOLDSBURG", "loc" : [ -81.155135, 38.822704 ], "pop" : 1683, "state" : "WV" } +{ "_id" : "25235", "city" : "FLOE", "loc" : [ -81.090126, 38.671201 ], "pop" : 886, "state" : "WV" } +{ "_id" : "25239", "city" : "COTTAGEVILLE", "loc" : [ -81.818609, 38.863285 ], "pop" : 1183, "state" : "WV" } +{ "_id" : "25241", "city" : "EVANS", "loc" : [ -81.790858, 38.811281 ], "pop" : 1296, "state" : "WV" } +{ "_id" : "25243", "city" : "GANDEEVILLE", "loc" : [ -81.424329, 38.703382 ], "pop" : 715, "state" : "WV" } +{ "_id" : "25244", "city" : "GAY", "loc" : [ -81.570301, 38.797842 ], "pop" : 1037, "state" : "WV" } +{ "_id" : "25245", "city" : "GIVEN", "loc" : [ -81.682542, 38.713046 ], "pop" : 994, "state" : "WV" } +{ "_id" : "25246", "city" : "HARMONY", "loc" : [ -81.50763600000001, 38.692086 ], "pop" : 372, "state" : "WV" } +{ "_id" : "25248", "city" : "ROMANCE", "loc" : [ -81.651717, 38.623894 ], "pop" : 1880, "state" : "WV" } +{ "_id" : "25249", "city" : "KENTUCK", "loc" : [ -81.596018, 38.663886 ], "pop" : 718, "state" : "WV" } +{ "_id" : "25251", "city" : "LEFT HAND", "loc" : [ -81.246675, 38.606288 ], "pop" : 397, "state" : "WV" } +{ "_id" : "25252", "city" : "DUNCAN", "loc" : [ -81.57245, 38.957552 ], "pop" : 743, "state" : "WV" } +{ "_id" : "25253", "city" : "LETART", "loc" : [ -81.975129, 38.931079 ], "pop" : 4478, "state" : "WV" } +{ "_id" : "25255", "city" : "LETTER GAP", "loc" : [ -80.883768, 38.897074 ], "pop" : 217, "state" : "WV" } +{ "_id" : "25256", "city" : "LINDEN", "loc" : [ -81.229061, 38.698938 ], "pop" : 270, "state" : "WV" } +{ "_id" : "25258", "city" : "LOCKNEY", "loc" : [ -80.945075, 38.852919 ], "pop" : 89, "state" : "WV" } +{ "_id" : "25259", "city" : "LOONEYVILLE", "loc" : [ -81.28219, 38.664113 ], "pop" : 600, "state" : "WV" } +{ "_id" : "25260", "city" : "MASON", "loc" : [ -82.028215, 39.006442 ], "pop" : 2598, "state" : "WV" } +{ "_id" : "25261", "city" : "MILLSTONE", "loc" : [ -81.08635200000001, 38.86029 ], "pop" : 748, "state" : "WV" } +{ "_id" : "25262", "city" : "MILLWOOD", "loc" : [ -81.824832, 38.896206 ], "pop" : 1379, "state" : "WV" } +{ "_id" : "25264", "city" : "MOUNT ALTO", "loc" : [ -81.87837399999999, 38.863937 ], "pop" : 275, "state" : "WV" } +{ "_id" : "25266", "city" : "ULER", "loc" : [ -81.167579, 38.605219 ], "pop" : 724, "state" : "WV" } +{ "_id" : "25267", "city" : "NORMANTOWN", "loc" : [ -80.941936, 38.880173 ], "pop" : 183, "state" : "WV" } +{ "_id" : "25268", "city" : "MINNORA", "loc" : [ -81.09614000000001, 38.735979 ], "pop" : 641, "state" : "WV" } +{ "_id" : "25270", "city" : "REEDY", "loc" : [ -81.419785, 38.837119 ], "pop" : 3014, "state" : "WV" } +{ "_id" : "25271", "city" : "RIPLEY", "loc" : [ -81.701987, 38.809042 ], "pop" : 6580, "state" : "WV" } +{ "_id" : "25272", "city" : "ROCK CASTLE", "loc" : [ -81.767414, 38.708357 ], "pop" : 82, "state" : "WV" } +{ "_id" : "25274", "city" : "SAND RIDGE", "loc" : [ -81.032372, 38.850721 ], "pop" : 163, "state" : "WV" } +{ "_id" : "25275", "city" : "SANDYVILLE", "loc" : [ -81.654315, 38.909282 ], "pop" : 1611, "state" : "WV" } +{ "_id" : "25276", "city" : "SPENCER", "loc" : [ -81.33026, 38.789696 ], "pop" : 6007, "state" : "WV" } +{ "_id" : "25279", "city" : "STATTS MILLS", "loc" : [ -81.615579, 38.74076 ], "pop" : 368, "state" : "WV" } +{ "_id" : "25280", "city" : "STUMPTOWN", "loc" : [ -80.970026, 38.831619 ], "pop" : 275, "state" : "WV" } +{ "_id" : "25281", "city" : "TARIFF", "loc" : [ -81.212361, 38.652707 ], "pop" : 191, "state" : "WV" } +{ "_id" : "25283", "city" : "VALLEY FORK", "loc" : [ -81.15217699999999, 38.486906 ], "pop" : 530, "state" : "WV" } +{ "_id" : "25285", "city" : "WALLBACK", "loc" : [ -81.093535, 38.57254 ], "pop" : 181, "state" : "WV" } +{ "_id" : "25286", "city" : "WALTON", "loc" : [ -81.395757, 38.602264 ], "pop" : 1961, "state" : "WV" } +{ "_id" : "25287", "city" : "WEST COLUMBIA", "loc" : [ -82.090529, 38.926169 ], "pop" : 1009, "state" : "WV" } +{ "_id" : "25301", "city" : "CHARLESTON", "loc" : [ -81.630606, 38.349 ], "pop" : 4139, "state" : "WV" } +{ "_id" : "25302", "city" : "BIG CHIMNEY", "loc" : [ -81.623876, 38.383178 ], "pop" : 20267, "state" : "WV" } +{ "_id" : "25303", "city" : "SOUTH CHARLESTON", "loc" : [ -81.684079, 38.359226 ], "pop" : 8198, "state" : "WV" } +{ "_id" : "25304", "city" : "CHARLESTON", "loc" : [ -81.590272, 38.317289 ], "pop" : 9368, "state" : "WV" } +{ "_id" : "25306", "city" : "MALDEN", "loc" : [ -81.536813, 38.30028 ], "pop" : 7992, "state" : "WV" } +{ "_id" : "25309", "city" : "SOUTH CHARLESTON", "loc" : [ -81.73446199999999, 38.344903 ], "pop" : 10179, "state" : "WV" } +{ "_id" : "25311", "city" : "CHARLESTON", "loc" : [ -81.599282, 38.349032 ], "pop" : 10091, "state" : "WV" } +{ "_id" : "25312", "city" : "CHARLESTON", "loc" : [ -81.674688, 38.409563 ], "pop" : 13224, "state" : "WV" } +{ "_id" : "25313", "city" : "CROSS LANES", "loc" : [ -81.764877, 38.424982 ], "pop" : 13061, "state" : "WV" } +{ "_id" : "25314", "city" : "CHARLESTON", "loc" : [ -81.668988, 38.327442 ], "pop" : 17108, "state" : "WV" } +{ "_id" : "25315", "city" : "MARMET", "loc" : [ -81.554361, 38.233309 ], "pop" : 4317, "state" : "WV" } +{ "_id" : "25320", "city" : "SISSONVILLE", "loc" : [ -81.62958500000001, 38.509586 ], "pop" : 7220, "state" : "WV" } +{ "_id" : "25401", "city" : "MARTINSBURG", "loc" : [ -77.958915, 39.459959 ], "pop" : 36800, "state" : "WV" } +{ "_id" : "25411", "city" : "HANCOCK", "loc" : [ -78.219217, 39.58736 ], "pop" : 9219, "state" : "WV" } +{ "_id" : "25413", "city" : "BUNKER HILL", "loc" : [ -78.04871799999999, 39.327554 ], "pop" : 5419, "state" : "WV" } +{ "_id" : "25414", "city" : "CHARLES TOWN", "loc" : [ -77.85625400000001, 39.277085 ], "pop" : 14351, "state" : "WV" } +{ "_id" : "25419", "city" : "FALLING WATERS", "loc" : [ -77.88515200000001, 39.586473 ], "pop" : 4428, "state" : "WV" } +{ "_id" : "25420", "city" : "GERRARDSTOWN", "loc" : [ -78.114119, 39.378039 ], "pop" : 2481, "state" : "WV" } +{ "_id" : "25422", "city" : "GREAT CACAPON", "loc" : [ -78.33311999999999, 39.583557 ], "pop" : 1108, "state" : "WV" } +{ "_id" : "25425", "city" : "HARPERS FERRY", "loc" : [ -77.76944899999999, 39.315283 ], "pop" : 7126, "state" : "WV" } +{ "_id" : "25427", "city" : "CHERRY RUN", "loc" : [ -78.056016, 39.547034 ], "pop" : 7415, "state" : "WV" } +{ "_id" : "25428", "city" : "INWOOD", "loc" : [ -78.02418900000001, 39.370093 ], "pop" : 3646, "state" : "WV" } +{ "_id" : "25430", "city" : "KEARNEYSVILLE", "loc" : [ -77.95876199999999, 39.321994 ], "pop" : 3468, "state" : "WV" } +{ "_id" : "25431", "city" : "LEVELS", "loc" : [ -78.55078, 39.497637 ], "pop" : 28, "state" : "WV" } +{ "_id" : "25434", "city" : "PAW PAW", "loc" : [ -78.458573, 39.492297 ], "pop" : 1696, "state" : "WV" } +{ "_id" : "25437", "city" : "POINTS", "loc" : [ -78.564148, 39.457208 ], "pop" : 106, "state" : "WV" } +{ "_id" : "25438", "city" : "RANSON", "loc" : [ -77.860572, 39.299531 ], "pop" : 3010, "state" : "WV" } +{ "_id" : "25442", "city" : "SHENANDOAH JUNCT", "loc" : [ -77.88924, 39.371084 ], "pop" : 1907, "state" : "WV" } +{ "_id" : "25443", "city" : "SHEPHERDSTOWN", "loc" : [ -77.815819, 39.431124 ], "pop" : 5388, "state" : "WV" } +{ "_id" : "25444", "city" : "SLANESVILLE", "loc" : [ -78.505971, 39.402631 ], "pop" : 468, "state" : "WV" } +{ "_id" : "25446", "city" : "SUMMIT POINT", "loc" : [ -77.958552, 39.233753 ], "pop" : 676, "state" : "WV" } +{ "_id" : "25501", "city" : "ALKOL", "loc" : [ -81.98397199999999, 38.160884 ], "pop" : 1161, "state" : "WV" } +{ "_id" : "25502", "city" : "APPLE GROVE", "loc" : [ -82.172556, 38.713066 ], "pop" : 115, "state" : "WV" } +{ "_id" : "25503", "city" : "ASHTON", "loc" : [ -82.108907, 38.657102 ], "pop" : 1494, "state" : "WV" } +{ "_id" : "25504", "city" : "BARBOURSVILLE", "loc" : [ -82.295973, 38.389272 ], "pop" : 10205, "state" : "WV" } +{ "_id" : "25505", "city" : "BIG CREEK", "loc" : [ -82.01605600000001, 38.004555 ], "pop" : 712, "state" : "WV" } +{ "_id" : "25506", "city" : "BRANCHLAND", "loc" : [ -82.268367, 38.269444 ], "pop" : 642, "state" : "WV" } +{ "_id" : "25508", "city" : "CHAPMANVILLE", "loc" : [ -82.051241, 37.938535 ], "pop" : 8874, "state" : "WV" } +{ "_id" : "25510", "city" : "CULLODEN", "loc" : [ -82.068963, 38.419831 ], "pop" : 2569, "state" : "WV" } +{ "_id" : "25511", "city" : "DUNLOW", "loc" : [ -82.38266, 38.02829 ], "pop" : 835, "state" : "WV" } +{ "_id" : "25512", "city" : "EAST LYNN", "loc" : [ -82.32793100000001, 38.199474 ], "pop" : 1722, "state" : "WV" } +{ "_id" : "25514", "city" : "FORT GAY", "loc" : [ -82.554124, 38.133496 ], "pop" : 3499, "state" : "WV" } +{ "_id" : "25515", "city" : "GALLIPOLIS FERRY", "loc" : [ -82.153496, 38.765028 ], "pop" : 2121, "state" : "WV" } +{ "_id" : "25517", "city" : "RADNOR", "loc" : [ -82.46692, 38.088908 ], "pop" : 2111, "state" : "WV" } +{ "_id" : "25520", "city" : "GLENWOOD", "loc" : [ -82.14343100000001, 38.544936 ], "pop" : 3201, "state" : "WV" } +{ "_id" : "25521", "city" : "GRIFFITHSVILLE", "loc" : [ -81.982028, 38.246985 ], "pop" : 521, "state" : "WV" } +{ "_id" : "25523", "city" : "HAMLIN", "loc" : [ -82.10469500000001, 38.289556 ], "pop" : 2993, "state" : "WV" } +{ "_id" : "25524", "city" : "FERRELLSBURG", "loc" : [ -82.15535800000001, 38.008878 ], "pop" : 1611, "state" : "WV" } +{ "_id" : "25526", "city" : "HURRICANE", "loc" : [ -81.99432899999999, 38.425741 ], "pop" : 16250, "state" : "WV" } +{ "_id" : "25529", "city" : "JULIAN", "loc" : [ -81.86418500000001, 38.126437 ], "pop" : 670, "state" : "WV" } +{ "_id" : "25530", "city" : "KENOVA", "loc" : [ -82.573649, 38.386031 ], "pop" : 7491, "state" : "WV" } +{ "_id" : "25534", "city" : "COVE GAP", "loc" : [ -82.25620600000001, 38.077744 ], "pop" : 326, "state" : "WV" } +{ "_id" : "25535", "city" : "LAVALETTE", "loc" : [ -82.428707, 38.33046 ], "pop" : 5928, "state" : "WV" } +{ "_id" : "25537", "city" : "LESAGE", "loc" : [ -82.29566699999999, 38.477028 ], "pop" : 2972, "state" : "WV" } +{ "_id" : "25540", "city" : "MIDKIFF", "loc" : [ -82.15422700000001, 38.143908 ], "pop" : 470, "state" : "WV" } +{ "_id" : "25541", "city" : "MILTON", "loc" : [ -82.14578400000001, 38.413981 ], "pop" : 7168, "state" : "WV" } +{ "_id" : "25544", "city" : "MYRA", "loc" : [ -82.135097, 38.21978 ], "pop" : 146, "state" : "WV" } +{ "_id" : "25545", "city" : "ONA", "loc" : [ -82.218093, 38.452851 ], "pop" : 5959, "state" : "WV" } +{ "_id" : "25546", "city" : "PALERMO", "loc" : [ -82.046018, 38.12817 ], "pop" : 115, "state" : "WV" } +{ "_id" : "25547", "city" : "PECKS MILL", "loc" : [ -81.96538200000001, 37.929784 ], "pop" : 117, "state" : "WV" } +{ "_id" : "25550", "city" : "POINT PLEASANT", "loc" : [ -82.113247, 38.863249 ], "pop" : 7981, "state" : "WV" } +{ "_id" : "25555", "city" : "PRICHARD", "loc" : [ -82.57529700000001, 38.230009 ], "pop" : 1215, "state" : "WV" } +{ "_id" : "25557", "city" : "RANGER", "loc" : [ -82.19078, 38.155608 ], "pop" : 5703, "state" : "WV" } +{ "_id" : "25559", "city" : "SALT ROCK", "loc" : [ -82.247041, 38.326542 ], "pop" : 1482, "state" : "WV" } +{ "_id" : "25560", "city" : "SCOTT DEPOT", "loc" : [ -81.900481, 38.450063 ], "pop" : 5893, "state" : "WV" } +{ "_id" : "25563", "city" : "SIAS", "loc" : [ -82.085779, 38.189434 ], "pop" : 384, "state" : "WV" } +{ "_id" : "25564", "city" : "SOD", "loc" : [ -81.86814, 38.262967 ], "pop" : 3529, "state" : "WV" } +{ "_id" : "25565", "city" : "MORRISVALE", "loc" : [ -81.991778, 38.077015 ], "pop" : 1449, "state" : "WV" } +{ "_id" : "25567", "city" : "SUMERCO", "loc" : [ -81.894317, 38.205292 ], "pop" : 638, "state" : "WV" } +{ "_id" : "25568", "city" : "SWEETLAND", "loc" : [ -82.034464, 38.262874 ], "pop" : 378, "state" : "WV" } +{ "_id" : "25570", "city" : "WAYNE", "loc" : [ -82.433926, 38.225814 ], "pop" : 4992, "state" : "WV" } +{ "_id" : "25571", "city" : "WEST HAMLIN", "loc" : [ -82.184348, 38.288571 ], "pop" : 1612, "state" : "WV" } +{ "_id" : "25572", "city" : "WOODVILLE", "loc" : [ -81.911281, 38.157027 ], "pop" : 262, "state" : "WV" } +{ "_id" : "25573", "city" : "YAWKEY", "loc" : [ -81.956828, 38.219252 ], "pop" : 690, "state" : "WV" } +{ "_id" : "25601", "city" : "WEST LOGAN", "loc" : [ -82.002092, 37.847488 ], "pop" : 14143, "state" : "WV" } +{ "_id" : "25607", "city" : "ROBINETTE", "loc" : [ -81.758912, 37.795586 ], "pop" : 2986, "state" : "WV" } +{ "_id" : "25608", "city" : "BAISDEN", "loc" : [ -81.93275800000001, 37.571492 ], "pop" : 1183, "state" : "WV" } +{ "_id" : "25617", "city" : "DAVIN", "loc" : [ -81.805706, 37.726499 ], "pop" : 2388, "state" : "WV" } +{ "_id" : "25621", "city" : "GILBERT", "loc" : [ -81.866468, 37.594153 ], "pop" : 2027, "state" : "WV" } +{ "_id" : "25623", "city" : "HAMPDEN", "loc" : [ -81.947014, 37.639691 ], "pop" : 1352, "state" : "WV" } +{ "_id" : "25632", "city" : "EARLING", "loc" : [ -81.92929100000001, 37.774266 ], "pop" : 847, "state" : "WV" } +{ "_id" : "25635", "city" : "HUNT", "loc" : [ -81.865228, 37.729525 ], "pop" : 3932, "state" : "WV" } +{ "_id" : "25638", "city" : "BARNABUS", "loc" : [ -82.004931, 37.722368 ], "pop" : 2369, "state" : "WV" } +{ "_id" : "25650", "city" : "VERNER", "loc" : [ -81.864801, 37.64554 ], "pop" : 1487, "state" : "WV" } +{ "_id" : "25651", "city" : "WHARNCLIFFE", "loc" : [ -81.956604, 37.545161 ], "pop" : 428, "state" : "WV" } +{ "_id" : "25654", "city" : "DEHUE", "loc" : [ -81.872699, 37.866513 ], "pop" : 2524, "state" : "WV" } +{ "_id" : "25661", "city" : "WILLIAMSON", "loc" : [ -82.264163, 37.690248 ], "pop" : 8866, "state" : "WV" } +{ "_id" : "25666", "city" : "BREEDEN", "loc" : [ -82.25474800000001, 37.919751 ], "pop" : 773, "state" : "WV" } +{ "_id" : "25669", "city" : "CRUM", "loc" : [ -82.46235900000001, 37.938879 ], "pop" : 763, "state" : "WV" } +{ "_id" : "25670", "city" : "MYRTLE", "loc" : [ -82.131922, 37.703833 ], "pop" : 4639, "state" : "WV" } +{ "_id" : "25671", "city" : "DINGESS", "loc" : [ -82.195108, 37.870336 ], "pop" : 2012, "state" : "WV" } +{ "_id" : "25674", "city" : "KERMIT", "loc" : [ -82.374065, 37.864246 ], "pop" : 3549, "state" : "WV" } +{ "_id" : "25676", "city" : "LENORE", "loc" : [ -82.269336, 37.799436 ], "pop" : 2521, "state" : "WV" } +{ "_id" : "25678", "city" : "LOBATA", "loc" : [ -82.14569400000001, 37.649539 ], "pop" : 3232, "state" : "WV" } +{ "_id" : "25682", "city" : "MEADOR", "loc" : [ -82.065904, 37.592373 ], "pop" : 1640, "state" : "WV" } +{ "_id" : "25694", "city" : "THACKER", "loc" : [ -82.12733299999999, 37.608293 ], "pop" : 1064, "state" : "WV" } +{ "_id" : "25699", "city" : "WILSONDALE", "loc" : [ -82.38135800000001, 37.951598 ], "pop" : 897, "state" : "WV" } +{ "_id" : "25701", "city" : "HUNTINGTON", "loc" : [ -82.442348, 38.409726 ], "pop" : 20896, "state" : "WV" } +{ "_id" : "25702", "city" : "HUNTINGTON", "loc" : [ -82.39108299999999, 38.42862 ], "pop" : 7290, "state" : "WV" } +{ "_id" : "25703", "city" : "HUNTINGTON", "loc" : [ -82.42266600000001, 38.421116 ], "pop" : 6570, "state" : "WV" } +{ "_id" : "25704", "city" : "HUNTINGTON", "loc" : [ -82.503646, 38.384943 ], "pop" : 18311, "state" : "WV" } +{ "_id" : "25705", "city" : "HUNTINGTON", "loc" : [ -82.36901, 38.409588 ], "pop" : 22276, "state" : "WV" } +{ "_id" : "25801", "city" : "BECKLEY", "loc" : [ -81.206084, 37.793214 ], "pop" : 45196, "state" : "WV" } +{ "_id" : "25811", "city" : "AMIGO", "loc" : [ -81.34914499999999, 37.59211 ], "pop" : 684, "state" : "WV" } +{ "_id" : "25812", "city" : "ANSTED", "loc" : [ -81.09548700000001, 38.13686 ], "pop" : 1451, "state" : "WV" } +{ "_id" : "25813", "city" : "BEAVER", "loc" : [ -81.073104, 37.751581 ], "pop" : 4868, "state" : "WV" } +{ "_id" : "25817", "city" : "BOLT", "loc" : [ -81.415612, 37.767303 ], "pop" : 524, "state" : "WV" } +{ "_id" : "25820", "city" : "CAMP CREEK", "loc" : [ -81.111073, 37.484053 ], "pop" : 65, "state" : "WV" } +{ "_id" : "25825", "city" : "COOL RIDGE", "loc" : [ -81.10527999999999, 37.65735 ], "pop" : 1731, "state" : "WV" } +{ "_id" : "25827", "city" : "CRAB ORCHARD", "loc" : [ -81.249098, 37.720515 ], "pop" : 5209, "state" : "WV" } +{ "_id" : "25831", "city" : "CLIFFTOP", "loc" : [ -80.947114, 37.903615 ], "pop" : 1432, "state" : "WV" } +{ "_id" : "25832", "city" : "DANIELS", "loc" : [ -81.13910799999999, 37.732247 ], "pop" : 2533, "state" : "WV" } +{ "_id" : "25837", "city" : "EDMOND", "loc" : [ -81.032634, 38.054441 ], "pop" : 69, "state" : "WV" } +{ "_id" : "25839", "city" : "FAIRDALE", "loc" : [ -81.401758, 37.786578 ], "pop" : 175, "state" : "WV" } +{ "_id" : "25840", "city" : "CUNARD", "loc" : [ -81.080969, 38.062774 ], "pop" : 8013, "state" : "WV" } +{ "_id" : "25841", "city" : "FLAT TOP", "loc" : [ -81.127976, 37.550028 ], "pop" : 623, "state" : "WV" } +{ "_id" : "25843", "city" : "GHENT", "loc" : [ -81.101921, 37.62079 ], "pop" : 749, "state" : "WV" } +{ "_id" : "25844", "city" : "GLEN DANIEL", "loc" : [ -81.403294, 37.754698 ], "pop" : 123, "state" : "WV" } +{ "_id" : "25845", "city" : "GLEN FORK", "loc" : [ -81.540209, 37.644691 ], "pop" : 189, "state" : "WV" } +{ "_id" : "25847", "city" : "SULLIVAN", "loc" : [ -81.13048000000001, 37.790384 ], "pop" : 99, "state" : "WV" } +{ "_id" : "25848", "city" : "GLEN ROGERS", "loc" : [ -81.428989, 37.721685 ], "pop" : 367, "state" : "WV" } +{ "_id" : "25854", "city" : "HICO", "loc" : [ -80.963763, 38.109373 ], "pop" : 721, "state" : "WV" } +{ "_id" : "25857", "city" : "JOSEPHINE", "loc" : [ -81.217584, 37.622135 ], "pop" : 476, "state" : "WV" } +{ "_id" : "25862", "city" : "LANSING", "loc" : [ -81.02772, 38.110793 ], "pop" : 89, "state" : "WV" } +{ "_id" : "25864", "city" : "LAWTON", "loc" : [ -80.99244899999999, 37.865779 ], "pop" : 17, "state" : "WV" } +{ "_id" : "25865", "city" : "LESTER", "loc" : [ -81.30954199999999, 37.726522 ], "pop" : 1157, "state" : "WV" } +{ "_id" : "25868", "city" : "LOOKOUT", "loc" : [ -80.92006000000001, 38.052822 ], "pop" : 338, "state" : "WV" } +{ "_id" : "25870", "city" : "MABEN", "loc" : [ -81.39137100000001, 37.654294 ], "pop" : 415, "state" : "WV" } +{ "_id" : "25876", "city" : "SAULSVILLE", "loc" : [ -81.457706, 37.655573 ], "pop" : 624, "state" : "WV" } +{ "_id" : "25880", "city" : "MOUNT HOPE", "loc" : [ -81.170419, 37.911048 ], "pop" : 4348, "state" : "WV" } +{ "_id" : "25882", "city" : "MULLENS", "loc" : [ -81.389015, 37.584172 ], "pop" : 2590, "state" : "WV" } +{ "_id" : "25901", "city" : "HARVEY", "loc" : [ -81.13442499999999, 37.984874 ], "pop" : 14805, "state" : "WV" } +{ "_id" : "25902", "city" : "ODD", "loc" : [ -81.187183, 37.592997 ], "pop" : 577, "state" : "WV" } +{ "_id" : "25908", "city" : "WINDING GULF", "loc" : [ -81.231022, 37.643456 ], "pop" : 13, "state" : "WV" } +{ "_id" : "25912", "city" : "RAMSEY", "loc" : [ -81.015047, 38.178142 ], "pop" : 460, "state" : "WV" } +{ "_id" : "25913", "city" : "RAVENCLIFF", "loc" : [ -81.496736, 37.697961 ], "pop" : 1457, "state" : "WV" } +{ "_id" : "25915", "city" : "EAST GULF", "loc" : [ -81.294753, 37.628587 ], "pop" : 1183, "state" : "WV" } +{ "_id" : "25917", "city" : "SCARBRO", "loc" : [ -81.24573100000001, 37.947073 ], "pop" : 1074, "state" : "WV" } +{ "_id" : "25918", "city" : "ABRAHAM", "loc" : [ -81.1023, 37.697802 ], "pop" : 2548, "state" : "WV" } +{ "_id" : "25920", "city" : "SLAB FORK", "loc" : [ -81.22792800000001, 37.679605 ], "pop" : 2872, "state" : "WV" } +{ "_id" : "25922", "city" : "SPANISHBURG", "loc" : [ -81.10694100000001, 37.46314 ], "pop" : 883, "state" : "WV" } +{ "_id" : "25928", "city" : "STEPHENSON", "loc" : [ -81.33391399999999, 37.579847 ], "pop" : 441, "state" : "WV" } +{ "_id" : "25932", "city" : "SURVEYOR", "loc" : [ -81.33919, 37.748 ], "pop" : 416, "state" : "WV" } +{ "_id" : "25936", "city" : "THURMOND", "loc" : [ -81.071428, 37.955437 ], "pop" : 62, "state" : "WV" } +{ "_id" : "25938", "city" : "VICTOR", "loc" : [ -81.032223, 38.140194 ], "pop" : 516, "state" : "WV" } +{ "_id" : "25951", "city" : "HINTON", "loc" : [ -80.867779, 37.663983 ], "pop" : 6150, "state" : "WV" } +{ "_id" : "25958", "city" : "CHARMCO", "loc" : [ -80.707745, 37.98948 ], "pop" : 1643, "state" : "WV" } +{ "_id" : "25962", "city" : "RAINELLE", "loc" : [ -80.78206400000001, 37.966112 ], "pop" : 3320, "state" : "WV" } +{ "_id" : "25965", "city" : "ELTON", "loc" : [ -80.82520700000001, 37.846825 ], "pop" : 208, "state" : "WV" } +{ "_id" : "25966", "city" : "GREEN SULPHUR SP", "loc" : [ -80.839922, 37.808553 ], "pop" : 742, "state" : "WV" } +{ "_id" : "25969", "city" : "STREETER", "loc" : [ -80.995717, 37.639732 ], "pop" : 1270, "state" : "WV" } +{ "_id" : "25971", "city" : "LERONA", "loc" : [ -80.979574, 37.492498 ], "pop" : 507, "state" : "WV" } +{ "_id" : "25976", "city" : "MEADOW BRIDGE", "loc" : [ -80.852144, 37.878048 ], "pop" : 1446, "state" : "WV" } +{ "_id" : "25977", "city" : "MEADOW CREEK", "loc" : [ -80.91742000000001, 37.804824 ], "pop" : 157, "state" : "WV" } +{ "_id" : "25978", "city" : "NIMITZ", "loc" : [ -80.94462, 37.628584 ], "pop" : 577, "state" : "WV" } +{ "_id" : "25979", "city" : "PIPESTEM", "loc" : [ -80.94634499999999, 37.530345 ], "pop" : 677, "state" : "WV" } +{ "_id" : "25981", "city" : "MARFRANCE", "loc" : [ -80.717286, 38.051937 ], "pop" : 1936, "state" : "WV" } +{ "_id" : "25984", "city" : "KESSLER", "loc" : [ -80.689971, 37.963882 ], "pop" : 1464, "state" : "WV" } +{ "_id" : "25985", "city" : "SANDSTONE", "loc" : [ -80.87156400000001, 37.759879 ], "pop" : 435, "state" : "WV" } +{ "_id" : "25986", "city" : "SPRING DALE", "loc" : [ -80.81499599999999, 37.86947 ], "pop" : 79, "state" : "WV" } +{ "_id" : "25988", "city" : "TRUE", "loc" : [ -80.930837, 37.580031 ], "pop" : 340, "state" : "WV" } +{ "_id" : "25989", "city" : "WHITE OAK", "loc" : [ -81.058875, 37.68008 ], "pop" : 284, "state" : "WV" } +{ "_id" : "26003", "city" : "ELM GROVE", "loc" : [ -80.685126, 40.072736 ], "pop" : 49136, "state" : "WV" } +{ "_id" : "26031", "city" : "BENWOOD", "loc" : [ -80.71603, 40.013299 ], "pop" : 4032, "state" : "WV" } +{ "_id" : "26032", "city" : "BETHANY", "loc" : [ -80.55463, 40.202 ], "pop" : 487, "state" : "WV" } +{ "_id" : "26033", "city" : "CAMERON", "loc" : [ -80.56687599999999, 39.82272 ], "pop" : 2743, "state" : "WV" } +{ "_id" : "26034", "city" : "CHESTER", "loc" : [ -80.55843900000001, 40.598109 ], "pop" : 5966, "state" : "WV" } +{ "_id" : "26035", "city" : "COLLIERS", "loc" : [ -80.549341, 40.348391 ], "pop" : 2602, "state" : "WV" } +{ "_id" : "26036", "city" : "DALLAS", "loc" : [ -80.550804, 39.978343 ], "pop" : 822, "state" : "WV" } +{ "_id" : "26037", "city" : "FOLLANSBEE", "loc" : [ -80.584954, 40.329552 ], "pop" : 7676, "state" : "WV" } +{ "_id" : "26038", "city" : "GLEN DALE", "loc" : [ -80.732263, 39.959732 ], "pop" : 3418, "state" : "WV" } +{ "_id" : "26039", "city" : "GLEN EASTON", "loc" : [ -80.66606899999999, 39.853121 ], "pop" : 2477, "state" : "WV" } +{ "_id" : "26040", "city" : "MC MECHEN", "loc" : [ -80.73081999999999, 39.987793 ], "pop" : 2130, "state" : "WV" } +{ "_id" : "26041", "city" : "MOUNDSVILLE", "loc" : [ -80.730971, 39.914819 ], "pop" : 18627, "state" : "WV" } +{ "_id" : "26047", "city" : "NEW CUMBERLAND", "loc" : [ -80.590108, 40.522777 ], "pop" : 5779, "state" : "WV" } +{ "_id" : "26050", "city" : "NEWELL", "loc" : [ -80.60112599999999, 40.613971 ], "pop" : 2316, "state" : "WV" } +{ "_id" : "26055", "city" : "PROCTOR", "loc" : [ -80.761779, 39.720683 ], "pop" : 1785, "state" : "WV" } +{ "_id" : "26059", "city" : "TRIADELPHIA", "loc" : [ -80.59529000000001, 40.069945 ], "pop" : 2320, "state" : "WV" } +{ "_id" : "26060", "city" : "VALLEY GROVE", "loc" : [ -80.555059, 40.094649 ], "pop" : 1705, "state" : "WV" } +{ "_id" : "26062", "city" : "WEIRTON", "loc" : [ -80.568307, 40.413673 ], "pop" : 25107, "state" : "WV" } +{ "_id" : "26070", "city" : "WELLSBURG", "loc" : [ -80.59606100000001, 40.254792 ], "pop" : 12292, "state" : "WV" } +{ "_id" : "26101", "city" : "PARKERSBURG", "loc" : [ -81.53541199999999, 39.264433 ], "pop" : 35886, "state" : "WV" } +{ "_id" : "26104", "city" : "NORTH PARKERSBUR", "loc" : [ -81.52610900000001, 39.285316 ], "pop" : 9260, "state" : "WV" } +{ "_id" : "26105", "city" : "VIENNA", "loc" : [ -81.54114300000001, 39.325089 ], "pop" : 11696, "state" : "WV" } +{ "_id" : "26133", "city" : "BELLEVILLE", "loc" : [ -81.69231600000001, 39.131417 ], "pop" : 1240, "state" : "WV" } +{ "_id" : "26134", "city" : "WILLOW ISLAND", "loc" : [ -81.27880999999999, 39.367927 ], "pop" : 1562, "state" : "WV" } +{ "_id" : "26135", "city" : "BENS RUN", "loc" : [ -81.066534, 39.44641 ], "pop" : 282, "state" : "WV" } +{ "_id" : "26136", "city" : "BIG BEND", "loc" : [ -81.13603000000001, 38.971941 ], "pop" : 844, "state" : "WV" } +{ "_id" : "26137", "city" : "NOBE", "loc" : [ -81.069813, 38.996306 ], "pop" : 371, "state" : "WV" } +{ "_id" : "26138", "city" : "BROHARD", "loc" : [ -81.177528, 39.033756 ], "pop" : 23, "state" : "WV" } +{ "_id" : "26141", "city" : "CRESTON", "loc" : [ -81.23690499999999, 38.937805 ], "pop" : 340, "state" : "WV" } +{ "_id" : "26142", "city" : "DAVISVILLE", "loc" : [ -81.47986299999999, 39.212635 ], "pop" : 3667, "state" : "WV" } +{ "_id" : "26143", "city" : "ELIZABETH", "loc" : [ -81.398889, 39.056618 ], "pop" : 3052, "state" : "WV" } +{ "_id" : "26145", "city" : "FIVE FORKS", "loc" : [ -81.086623, 38.975331 ], "pop" : 78, "state" : "WV" } +{ "_id" : "26146", "city" : "FRIENDLY", "loc" : [ -81.034544, 39.502444 ], "pop" : 1073, "state" : "WV" } +{ "_id" : "26147", "city" : "GRANTSVILLE", "loc" : [ -81.076294, 38.932436 ], "pop" : 1873, "state" : "WV" } +{ "_id" : "26148", "city" : "MACFARLAN", "loc" : [ -81.177627, 39.08058 ], "pop" : 437, "state" : "WV" } +{ "_id" : "26149", "city" : "MIDDLEBOURNE", "loc" : [ -80.886067, 39.50537 ], "pop" : 2527, "state" : "WV" } +{ "_id" : "26150", "city" : "MINERALWELLS", "loc" : [ -81.519096, 39.179846 ], "pop" : 5463, "state" : "WV" } +{ "_id" : "26151", "city" : "MOUNT ZION", "loc" : [ -81.119473, 38.877455 ], "pop" : 227, "state" : "WV" } +{ "_id" : "26152", "city" : "MUNDAY", "loc" : [ -81.204048, 39.021423 ], "pop" : 117, "state" : "WV" } +{ "_id" : "26153", "city" : "MURRAYSVILLE", "loc" : [ -81.771368, 39.059143 ], "pop" : 452, "state" : "WV" } +{ "_id" : "26155", "city" : "NEW MARTINSVILLE", "loc" : [ -80.85654100000001, 39.658798 ], "pop" : 7617, "state" : "WV" } +{ "_id" : "26159", "city" : "PADEN CITY", "loc" : [ -80.92648199999999, 39.604408 ], "pop" : 3513, "state" : "WV" } +{ "_id" : "26160", "city" : "PALESTINE", "loc" : [ -81.42803000000001, 38.974141 ], "pop" : 935, "state" : "WV" } +{ "_id" : "26161", "city" : "PETROLEUM", "loc" : [ -81.240607, 39.174139 ], "pop" : 419, "state" : "WV" } +{ "_id" : "26164", "city" : "RAVENSWOOD", "loc" : [ -81.752377, 38.94675 ], "pop" : 6428, "state" : "WV" } +{ "_id" : "26167", "city" : "READER", "loc" : [ -80.751583, 39.583595 ], "pop" : 2289, "state" : "WV" } +{ "_id" : "26169", "city" : "ROCKPORT", "loc" : [ -81.571333, 39.079774 ], "pop" : 1068, "state" : "WV" } +{ "_id" : "26170", "city" : "SAINT MARYS", "loc" : [ -81.172499, 39.38597 ], "pop" : 5523, "state" : "WV" } +{ "_id" : "26173", "city" : "SHERMAN", "loc" : [ -81.70091600000001, 39.013094 ], "pop" : 749, "state" : "WV" } +{ "_id" : "26175", "city" : "SISTERSVILLE", "loc" : [ -80.98182799999999, 39.558365 ], "pop" : 3113, "state" : "WV" } +{ "_id" : "26178", "city" : "SMITHVILLE", "loc" : [ -81.061953, 39.067078 ], "pop" : 590, "state" : "WV" } +{ "_id" : "26179", "city" : "TANNER", "loc" : [ -80.95971900000001, 38.966435 ], "pop" : 389, "state" : "WV" } +{ "_id" : "26180", "city" : "WALKER", "loc" : [ -81.386577, 39.182082 ], "pop" : 3218, "state" : "WV" } +{ "_id" : "26181", "city" : "NEW ENGLAND", "loc" : [ -81.640719, 39.233911 ], "pop" : 8532, "state" : "WV" } +{ "_id" : "26184", "city" : "WAVERLY", "loc" : [ -81.38193800000001, 39.315681 ], "pop" : 2836, "state" : "WV" } +{ "_id" : "26185", "city" : "WICK", "loc" : [ -80.96804400000001, 39.421653 ], "pop" : 479, "state" : "WV" } +{ "_id" : "26186", "city" : "WILEYVILLE", "loc" : [ -80.647251, 39.662593 ], "pop" : 343, "state" : "WV" } +{ "_id" : "26187", "city" : "WILLIAMSTOWN", "loc" : [ -81.456608, 39.38243 ], "pop" : 5207, "state" : "WV" } +{ "_id" : "26201", "city" : "TENNERTON", "loc" : [ -80.21782399999999, 38.98407 ], "pop" : 16829, "state" : "WV" } +{ "_id" : "26202", "city" : "FENWICK", "loc" : [ -80.634972, 38.244657 ], "pop" : 393, "state" : "WV" } +{ "_id" : "26203", "city" : "ERBACON", "loc" : [ -80.57423199999999, 38.541864 ], "pop" : 318, "state" : "WV" } +{ "_id" : "26205", "city" : "CRAIGSVILLE", "loc" : [ -80.64438, 38.325389 ], "pop" : 3070, "state" : "WV" } +{ "_id" : "26206", "city" : "COWEN", "loc" : [ -80.53580700000001, 38.413273 ], "pop" : 2469, "state" : "WV" } +{ "_id" : "26208", "city" : "GAULEY MILLS", "loc" : [ -80.591408, 38.379246 ], "pop" : 1191, "state" : "WV" } +{ "_id" : "26210", "city" : "ADRIAN", "loc" : [ -80.288663, 38.913422 ], "pop" : 794, "state" : "WV" } +{ "_id" : "26214", "city" : "CENTURY", "loc" : [ -80.17568799999999, 39.093287 ], "pop" : 235, "state" : "WV" } +{ "_id" : "26215", "city" : "CLEVELAND", "loc" : [ -80.342849, 38.839225 ], "pop" : 456, "state" : "WV" } +{ "_id" : "26217", "city" : "DIANA", "loc" : [ -80.431962, 38.575471 ], "pop" : 1172, "state" : "WV" } +{ "_id" : "26218", "city" : "ALEXANDER", "loc" : [ -80.274339, 38.851145 ], "pop" : 2398, "state" : "WV" } +{ "_id" : "26222", "city" : "REPLETE", "loc" : [ -80.402345, 38.679583 ], "pop" : 730, "state" : "WV" } +{ "_id" : "26224", "city" : "HELVETIA", "loc" : [ -80.138167, 38.771258 ], "pop" : 27, "state" : "WV" } +{ "_id" : "26228", "city" : "KANAWHA HEAD", "loc" : [ -80.37273399999999, 38.76183 ], "pop" : 171, "state" : "WV" } +{ "_id" : "26230", "city" : "PICKENS", "loc" : [ -80.209784, 38.684242 ], "pop" : 382, "state" : "WV" } +{ "_id" : "26234", "city" : "ROCK CAVE", "loc" : [ -80.316276, 38.781128 ], "pop" : 649, "state" : "WV" } +{ "_id" : "26236", "city" : "SELBYVILLE", "loc" : [ -80.312955, 38.719393 ], "pop" : 40, "state" : "WV" } +{ "_id" : "26237", "city" : "TALLMANSVILLE", "loc" : [ -80.15799, 38.856405 ], "pop" : 507, "state" : "WV" } +{ "_id" : "26238", "city" : "VOLGA", "loc" : [ -80.143209, 39.068445 ], "pop" : 969, "state" : "WV" } +{ "_id" : "26241", "city" : "ELKINS", "loc" : [ -79.847115, 38.925304 ], "pop" : 14027, "state" : "WV" } +{ "_id" : "26250", "city" : "BELINGTON", "loc" : [ -79.94950799999999, 39.024439 ], "pop" : 5189, "state" : "WV" } +{ "_id" : "26253", "city" : "BEVERLY", "loc" : [ -79.865121, 38.828021 ], "pop" : 3206, "state" : "WV" } +{ "_id" : "26254", "city" : "WYMER", "loc" : [ -79.619347, 38.934863 ], "pop" : 128, "state" : "WV" } +{ "_id" : "26257", "city" : "COALTON", "loc" : [ -79.976724, 38.91438 ], "pop" : 1422, "state" : "WV" } +{ "_id" : "26260", "city" : "DAVIS", "loc" : [ -79.456278, 39.088227 ], "pop" : 1459, "state" : "WV" } +{ "_id" : "26261", "city" : "RICHWOOD", "loc" : [ -80.544481, 38.222988 ], "pop" : 4129, "state" : "WV" } +{ "_id" : "26263", "city" : "DRYFORK", "loc" : [ -79.45340299999999, 38.957616 ], "pop" : 116, "state" : "WV" } +{ "_id" : "26264", "city" : "DURBIN", "loc" : [ -79.793464, 38.616313 ], "pop" : 75, "state" : "WV" } +{ "_id" : "26266", "city" : "UPPERGLADE", "loc" : [ -80.496464, 38.418528 ], "pop" : 383, "state" : "WV" } +{ "_id" : "26267", "city" : "ELLAMORE", "loc" : [ -80.09261100000001, 38.933966 ], "pop" : 482, "state" : "WV" } +{ "_id" : "26268", "city" : "GLADY", "loc" : [ -79.734202, 38.866925 ], "pop" : 615, "state" : "WV" } +{ "_id" : "26269", "city" : "HAMBLETON", "loc" : [ -79.641565, 39.116836 ], "pop" : 930, "state" : "WV" } +{ "_id" : "26270", "city" : "HARMAN", "loc" : [ -79.52459899999999, 38.923369 ], "pop" : 700, "state" : "WV" } +{ "_id" : "26271", "city" : "HENDRICKS", "loc" : [ -79.630302, 39.074814 ], "pop" : 318, "state" : "WV" } +{ "_id" : "26273", "city" : "HUTTONSVILLE", "loc" : [ -79.97754399999999, 38.678433 ], "pop" : 1072, "state" : "WV" } +{ "_id" : "26276", "city" : "KERENS", "loc" : [ -79.77542699999999, 39.029854 ], "pop" : 569, "state" : "WV" } +{ "_id" : "26278", "city" : "MABIE", "loc" : [ -80.01306099999999, 38.822158 ], "pop" : 427, "state" : "WV" } +{ "_id" : "26280", "city" : "MILL CREEK", "loc" : [ -79.97856899999999, 38.732493 ], "pop" : 2219, "state" : "WV" } +{ "_id" : "26282", "city" : "MONTERVILLE", "loc" : [ -80.12239099999999, 38.551707 ], "pop" : 79, "state" : "WV" } +{ "_id" : "26283", "city" : "MONTROSE", "loc" : [ -79.78957699999999, 39.096357 ], "pop" : 1513, "state" : "WV" } +{ "_id" : "26287", "city" : "PARSONS", "loc" : [ -79.67344799999999, 39.105857 ], "pop" : 2432, "state" : "WV" } +{ "_id" : "26288", "city" : "BOLAIR", "loc" : [ -80.399798, 38.476362 ], "pop" : 3914, "state" : "WV" } +{ "_id" : "26289", "city" : "RED CREEK", "loc" : [ -79.53009, 39.019628 ], "pop" : 318, "state" : "WV" } +{ "_id" : "26291", "city" : "SLATYFORK", "loc" : [ -80.040353, 38.381207 ], "pop" : 448, "state" : "WV" } +{ "_id" : "26292", "city" : "THOMAS", "loc" : [ -79.503, 39.150517 ], "pop" : 966, "state" : "WV" } +{ "_id" : "26293", "city" : "VALLEY BEND", "loc" : [ -79.916037, 38.784903 ], "pop" : 804, "state" : "WV" } +{ "_id" : "26294", "city" : "MINGO", "loc" : [ -80.044911, 38.536637 ], "pop" : 1013, "state" : "WV" } +{ "_id" : "26296", "city" : "JOB", "loc" : [ -79.55775199999999, 38.808289 ], "pop" : 384, "state" : "WV" } +{ "_id" : "26299", "city" : "BOGGS", "loc" : [ -80.607389, 38.482119 ], "pop" : 544, "state" : "WV" } +{ "_id" : "26301", "city" : "NUTTER FORT STON", "loc" : [ -80.34868299999999, 39.278422 ], "pop" : 33089, "state" : "WV" } +{ "_id" : "26320", "city" : "WILBUR", "loc" : [ -80.81715699999999, 39.429757 ], "pop" : 1201, "state" : "WV" } +{ "_id" : "26321", "city" : "ALUM BRIDGE", "loc" : [ -80.688196, 39.042474 ], "pop" : 1015, "state" : "WV" } +{ "_id" : "26322", "city" : "ALVY", "loc" : [ -80.668921, 39.451106 ], "pop" : 143, "state" : "WV" } +{ "_id" : "26325", "city" : "AUBURN", "loc" : [ -80.883656, 39.086382 ], "pop" : 326, "state" : "WV" } +{ "_id" : "26327", "city" : "BEREA", "loc" : [ -80.92232199999999, 39.130452 ], "pop" : 106, "state" : "WV" } +{ "_id" : "26328", "city" : "BLANDVILLE", "loc" : [ -80.735856, 39.265169 ], "pop" : 35, "state" : "WV" } +{ "_id" : "26330", "city" : "BRIDGEPORT", "loc" : [ -80.24269200000001, 39.29537 ], "pop" : 11747, "state" : "WV" } +{ "_id" : "26332", "city" : "BRISTOL", "loc" : [ -80.510541, 39.290425 ], "pop" : 1424, "state" : "WV" } +{ "_id" : "26335", "city" : "GEM", "loc" : [ -80.65898900000001, 38.850391 ], "pop" : 1513, "state" : "WV" } +{ "_id" : "26337", "city" : "CAIRO", "loc" : [ -81.155427, 39.23249 ], "pop" : 1379, "state" : "WV" } +{ "_id" : "26338", "city" : "CAMDEN", "loc" : [ -80.591531, 39.089268 ], "pop" : 584, "state" : "WV" } +{ "_id" : "26339", "city" : "CENTER POINT", "loc" : [ -80.635227, 39.412472 ], "pop" : 121, "state" : "WV" } +{ "_id" : "26342", "city" : "COXS MILLS", "loc" : [ -80.87459200000001, 39.002102 ], "pop" : 796, "state" : "WV" } +{ "_id" : "26343", "city" : "CRAWFORD", "loc" : [ -80.400749, 38.840065 ], "pop" : 517, "state" : "WV" } +{ "_id" : "26346", "city" : "HIGHLAND", "loc" : [ -81.060382, 39.282364 ], "pop" : 880, "state" : "WV" } +{ "_id" : "26347", "city" : "WENDEL", "loc" : [ -80.128179, 39.271069 ], "pop" : 2620, "state" : "WV" } +{ "_id" : "26348", "city" : "FOLSOM", "loc" : [ -80.525806, 39.469345 ], "pop" : 359, "state" : "WV" } +{ "_id" : "26351", "city" : "BALDWIN", "loc" : [ -80.82783000000001, 38.933619 ], "pop" : 2768, "state" : "WV" } +{ "_id" : "26354", "city" : "GRAFTON", "loc" : [ -80.028509, 39.341386 ], "pop" : 10102, "state" : "WV" } +{ "_id" : "26360", "city" : "GREENWOOD", "loc" : [ -80.878899, 39.290761 ], "pop" : 454, "state" : "WV" } +{ "_id" : "26362", "city" : "MAHONE", "loc" : [ -81.045967, 39.199608 ], "pop" : 2962, "state" : "WV" } +{ "_id" : "26367", "city" : "HAZELGREEN", "loc" : [ -80.98057799999999, 39.063075 ], "pop" : 203, "state" : "WV" } +{ "_id" : "26372", "city" : "HORNER", "loc" : [ -80.365576, 38.972628 ], "pop" : 365, "state" : "WV" } +{ "_id" : "26374", "city" : "INDEPENDENCE", "loc" : [ -79.882161, 39.446372 ], "pop" : 1227, "state" : "WV" } +{ "_id" : "26376", "city" : "WILDCAT", "loc" : [ -80.477002, 38.767689 ], "pop" : 589, "state" : "WV" } +{ "_id" : "26377", "city" : "JACKSONBURG", "loc" : [ -80.643697, 39.541553 ], "pop" : 406, "state" : "WV" } +{ "_id" : "26378", "city" : "JANE LEW", "loc" : [ -80.431059, 39.109989 ], "pop" : 4529, "state" : "WV" } +{ "_id" : "26383", "city" : "LIMA", "loc" : [ -80.72470300000001, 39.438973 ], "pop" : 153, "state" : "WV" } +{ "_id" : "26384", "city" : "LINN", "loc" : [ -80.730046, 38.957294 ], "pop" : 759, "state" : "WV" } +{ "_id" : "26385", "city" : "LOST CREEK", "loc" : [ -80.377674, 39.172528 ], "pop" : 3740, "state" : "WV" } +{ "_id" : "26386", "city" : "LUMBERPORT", "loc" : [ -80.36763500000001, 39.378108 ], "pop" : 2300, "state" : "WV" } +{ "_id" : "26404", "city" : "MEADOWBROOK", "loc" : [ -80.32566799999999, 39.335367 ], "pop" : 1373, "state" : "WV" } +{ "_id" : "26405", "city" : "KASSON", "loc" : [ -79.92157400000001, 39.212271 ], "pop" : 1382, "state" : "WV" } +{ "_id" : "26408", "city" : "MOUNT CLARE", "loc" : [ -80.289948, 39.210708 ], "pop" : 1558, "state" : "WV" } +{ "_id" : "26409", "city" : "NEWBERNE", "loc" : [ -80.902838, 39.040743 ], "pop" : 86, "state" : "WV" } +{ "_id" : "26410", "city" : "NEWBURG", "loc" : [ -79.828036, 39.402722 ], "pop" : 1206, "state" : "WV" } +{ "_id" : "26411", "city" : "NEW MILTON", "loc" : [ -80.707617, 39.189917 ], "pop" : 783, "state" : "WV" } +{ "_id" : "26412", "city" : "ORLANDO", "loc" : [ -80.56012200000001, 38.885349 ], "pop" : 209, "state" : "WV" } +{ "_id" : "26415", "city" : "TOLL GATE", "loc" : [ -80.958482, 39.292064 ], "pop" : 2597, "state" : "WV" } +{ "_id" : "26416", "city" : "BROADDUS", "loc" : [ -80.03853100000001, 39.150789 ], "pop" : 7934, "state" : "WV" } +{ "_id" : "26419", "city" : "HASTINGS", "loc" : [ -80.67721299999999, 39.565069 ], "pop" : 881, "state" : "WV" } +{ "_id" : "26421", "city" : "PULLMAN", "loc" : [ -80.934685, 39.190013 ], "pop" : 247, "state" : "WV" } +{ "_id" : "26423", "city" : "ROANOKE", "loc" : [ -80.498537, 38.930494 ], "pop" : 576, "state" : "WV" } +{ "_id" : "26425", "city" : "MANHEIM", "loc" : [ -79.642977, 39.221575 ], "pop" : 404, "state" : "WV" } +{ "_id" : "26426", "city" : "SALEM", "loc" : [ -80.589792, 39.294761 ], "pop" : 5874, "state" : "WV" } +{ "_id" : "26431", "city" : "SHINNSTON", "loc" : [ -80.283399, 39.388809 ], "pop" : 6044, "state" : "WV" } +{ "_id" : "26437", "city" : "SMITHFIELD", "loc" : [ -80.558245, 39.5134 ], "pop" : 775, "state" : "WV" } +{ "_id" : "26439", "city" : "STOUTS MILLS", "loc" : [ -80.741131, 38.893335 ], "pop" : 717, "state" : "WV" } +{ "_id" : "26440", "city" : "THORNTON", "loc" : [ -79.909645, 39.332879 ], "pop" : 1144, "state" : "WV" } +{ "_id" : "26443", "city" : "TROY", "loc" : [ -80.754921, 39.083881 ], "pop" : 115, "state" : "WV" } +{ "_id" : "26444", "city" : "TUNNELTON", "loc" : [ -79.747818, 39.362502 ], "pop" : 4076, "state" : "WV" } +{ "_id" : "26447", "city" : "WALKERSVILLE", "loc" : [ -80.480221, 38.850738 ], "pop" : 737, "state" : "WV" } +{ "_id" : "26448", "city" : "WALLACE", "loc" : [ -80.486468, 39.411667 ], "pop" : 1372, "state" : "WV" } +{ "_id" : "26451", "city" : "WEST MILFORD", "loc" : [ -80.363049, 39.203906 ], "pop" : 1365, "state" : "WV" } +{ "_id" : "26452", "city" : "WESTON", "loc" : [ -80.47365600000001, 39.041104 ], "pop" : 9912, "state" : "WV" } +{ "_id" : "26456", "city" : "WEST UNION", "loc" : [ -80.791057, 39.276185 ], "pop" : 3133, "state" : "WV" } +{ "_id" : "26462", "city" : "WOLF SUMMIT", "loc" : [ -80.438704, 39.232985 ], "pop" : 1116, "state" : "WV" } +{ "_id" : "26505", "city" : "STAR CITY", "loc" : [ -79.95422499999999, 39.633858 ], "pop" : 70185, "state" : "WV" } +{ "_id" : "26519", "city" : "ALBRIGHT", "loc" : [ -79.635811, 39.570116 ], "pop" : 858, "state" : "WV" } +{ "_id" : "26521", "city" : "BLACKSVILLE", "loc" : [ -80.232646, 39.695821 ], "pop" : 13, "state" : "WV" } +{ "_id" : "26525", "city" : "BRUCETON MILLS", "loc" : [ -79.61594100000001, 39.645394 ], "pop" : 3857, "state" : "WV" } +{ "_id" : "26529", "city" : "CORE", "loc" : [ -80.23068000000001, 39.654037 ], "pop" : 453, "state" : "WV" } +{ "_id" : "26537", "city" : "KINGWOOD", "loc" : [ -79.70629, 39.481912 ], "pop" : 6716, "state" : "WV" } +{ "_id" : "26541", "city" : "MAIDSVILLE", "loc" : [ -80.08319299999999, 39.709308 ], "pop" : 2047, "state" : "WV" } +{ "_id" : "26542", "city" : "CASCADE", "loc" : [ -79.80099300000001, 39.576413 ], "pop" : 658, "state" : "WV" } +{ "_id" : "26546", "city" : "PURSGLOVE", "loc" : [ -80.061798, 39.699543 ], "pop" : 322, "state" : "WV" } +{ "_id" : "26547", "city" : "REEDSVILLE", "loc" : [ -79.810061, 39.51823 ], "pop" : 3551, "state" : "WV" } +{ "_id" : "26554", "city" : "MONONGAH", "loc" : [ -80.146041, 39.472677 ], "pop" : 41565, "state" : "WV" } +{ "_id" : "26560", "city" : "BAXTER", "loc" : [ -80.14169099999999, 39.536056 ], "pop" : 748, "state" : "WV" } +{ "_id" : "26561", "city" : "BIG RUN", "loc" : [ -80.58371699999999, 39.59414 ], "pop" : 647, "state" : "WV" } +{ "_id" : "26562", "city" : "COBURN", "loc" : [ -80.405931, 39.667984 ], "pop" : 697, "state" : "WV" } +{ "_id" : "26568", "city" : "ENTERPRISE", "loc" : [ -80.316704, 39.425998 ], "pop" : 1800, "state" : "WV" } +{ "_id" : "26570", "city" : "FAIRVIEW", "loc" : [ -80.25291799999999, 39.610335 ], "pop" : 2406, "state" : "WV" } +{ "_id" : "26571", "city" : "FARMINGTON", "loc" : [ -80.256643, 39.50287 ], "pop" : 3622, "state" : "WV" } +{ "_id" : "26575", "city" : "HUNDRED", "loc" : [ -80.474552, 39.691744 ], "pop" : 1214, "state" : "WV" } +{ "_id" : "26581", "city" : "LITTLETON", "loc" : [ -80.569478, 39.659205 ], "pop" : 458, "state" : "WV" } +{ "_id" : "26582", "city" : "MANNINGTON", "loc" : [ -80.355243, 39.522031 ], "pop" : 5323, "state" : "WV" } +{ "_id" : "26585", "city" : "METZ", "loc" : [ -80.416815, 39.607762 ], "pop" : 924, "state" : "WV" } +{ "_id" : "26587", "city" : "RACHEL", "loc" : [ -80.295694, 39.52254 ], "pop" : 274, "state" : "WV" } +{ "_id" : "26588", "city" : "RIVESVILLE", "loc" : [ -80.141744, 39.556839 ], "pop" : 2938, "state" : "WV" } +{ "_id" : "26589", "city" : "WADESTOWN", "loc" : [ -80.327462, 39.636926 ], "pop" : 329, "state" : "WV" } +{ "_id" : "26590", "city" : "WANA", "loc" : [ -80.30510599999999, 39.702072 ], "pop" : 272, "state" : "WV" } +{ "_id" : "26591", "city" : "WORTHINGTON", "loc" : [ -80.290468, 39.452213 ], "pop" : 1506, "state" : "WV" } +{ "_id" : "26601", "city" : "HEROLD", "loc" : [ -80.681072, 38.673855 ], "pop" : 3517, "state" : "WV" } +{ "_id" : "26610", "city" : "BIRCH RIVER", "loc" : [ -80.745873, 38.491424 ], "pop" : 1440, "state" : "WV" } +{ "_id" : "26611", "city" : "FLOWER", "loc" : [ -80.84034200000001, 38.839711 ], "pop" : 308, "state" : "WV" } +{ "_id" : "26615", "city" : "COPEN", "loc" : [ -80.728481, 38.830556 ], "pop" : 161, "state" : "WV" } +{ "_id" : "26617", "city" : "DILLE", "loc" : [ -80.853784, 38.474704 ], "pop" : 410, "state" : "WV" } +{ "_id" : "26618", "city" : "ELMIRA", "loc" : [ -80.984972, 38.658907 ], "pop" : 276, "state" : "WV" } +{ "_id" : "26619", "city" : "RIFFLE", "loc" : [ -80.768123, 38.806866 ], "pop" : 230, "state" : "WV" } +{ "_id" : "26620", "city" : "FALLS MILL", "loc" : [ -80.550618, 38.77566 ], "pop" : 25, "state" : "WV" } +{ "_id" : "26621", "city" : "CORLEY", "loc" : [ -80.63847800000001, 38.724475 ], "pop" : 658, "state" : "WV" } +{ "_id" : "26623", "city" : "CLEM", "loc" : [ -80.877416, 38.636828 ], "pop" : 1276, "state" : "WV" } +{ "_id" : "26624", "city" : "GASSAWAY", "loc" : [ -80.786339, 38.686193 ], "pop" : 2665, "state" : "WV" } +{ "_id" : "26626", "city" : "GLENDON", "loc" : [ -80.939459, 38.610857 ], "pop" : 223, "state" : "WV" } +{ "_id" : "26627", "city" : "HEATERS", "loc" : [ -80.642884, 38.755807 ], "pop" : 368, "state" : "WV" } +{ "_id" : "26629", "city" : "TESLA", "loc" : [ -80.706293, 38.581046 ], "pop" : 1325, "state" : "WV" } +{ "_id" : "26631", "city" : "NAPIER", "loc" : [ -80.584104, 38.77462 ], "pop" : 107, "state" : "WV" } +{ "_id" : "26633", "city" : "NICUT", "loc" : [ -81.011, 38.715133 ], "pop" : 151, "state" : "WV" } +{ "_id" : "26634", "city" : "PERKINS", "loc" : [ -80.919336, 38.809049 ], "pop" : 242, "state" : "WV" } +{ "_id" : "26636", "city" : "ROSEDALE", "loc" : [ -80.906127, 38.770103 ], "pop" : 88, "state" : "WV" } +{ "_id" : "26638", "city" : "SHOCK", "loc" : [ -80.96866300000001, 38.757527 ], "pop" : 250, "state" : "WV" } +{ "_id" : "26639", "city" : "STRANGE CREEK", "loc" : [ -80.903077, 38.573823 ], "pop" : 206, "state" : "WV" } +{ "_id" : "26641", "city" : "WILSIE", "loc" : [ -80.86805099999999, 38.672723 ], "pop" : 150, "state" : "WV" } +{ "_id" : "26651", "city" : "SUMMERSVILLE", "loc" : [ -80.835278, 38.30089 ], "pop" : 6520, "state" : "WV" } +{ "_id" : "26656", "city" : "BELVA", "loc" : [ -81.156572, 38.249105 ], "pop" : 415, "state" : "WV" } +{ "_id" : "26660", "city" : "CALVIN", "loc" : [ -80.70162999999999, 38.327679 ], "pop" : 603, "state" : "WV" } +{ "_id" : "26662", "city" : "CANVAS", "loc" : [ -80.744637, 38.262445 ], "pop" : 1163, "state" : "WV" } +{ "_id" : "26667", "city" : "DRENNEN", "loc" : [ -81.00886800000001, 38.258729 ], "pop" : 263, "state" : "WV" } +{ "_id" : "26671", "city" : "GILBOA", "loc" : [ -80.952232, 38.298304 ], "pop" : 422, "state" : "WV" } +{ "_id" : "26674", "city" : "JODIE", "loc" : [ -81.134657, 38.208319 ], "pop" : 510, "state" : "WV" } +{ "_id" : "26675", "city" : "KESLERS CROSS LA", "loc" : [ -80.93336499999999, 38.225762 ], "pop" : 188, "state" : "WV" } +{ "_id" : "26676", "city" : "LEIVASY", "loc" : [ -80.717213, 38.135019 ], "pop" : 1107, "state" : "WV" } +{ "_id" : "26678", "city" : "MOUNT LOOKOUT", "loc" : [ -80.91077, 38.182109 ], "pop" : 1029, "state" : "WV" } +{ "_id" : "26679", "city" : "RUNA", "loc" : [ -80.820204, 38.197064 ], "pop" : 1698, "state" : "WV" } +{ "_id" : "26680", "city" : "RUSSELVILLE", "loc" : [ -80.885777, 38.10829 ], "pop" : 99, "state" : "WV" } +{ "_id" : "26681", "city" : "NETTIE", "loc" : [ -80.69527100000001, 38.209042 ], "pop" : 1196, "state" : "WV" } +{ "_id" : "26683", "city" : "POE", "loc" : [ -80.952167, 38.256458 ], "pop" : 818, "state" : "WV" } +{ "_id" : "26684", "city" : "POOL", "loc" : [ -80.885907, 38.146004 ], "pop" : 112, "state" : "WV" } +{ "_id" : "26690", "city" : "SWISS", "loc" : [ -81.080703, 38.279058 ], "pop" : 684, "state" : "WV" } +{ "_id" : "26691", "city" : "TIOGA", "loc" : [ -80.661663, 38.375989 ], "pop" : 808, "state" : "WV" } +{ "_id" : "26704", "city" : "AUGUSTA", "loc" : [ -78.59308900000001, 39.299821 ], "pop" : 2769, "state" : "WV" } +{ "_id" : "26705", "city" : "AMBOY", "loc" : [ -79.571088, 39.304719 ], "pop" : 1143, "state" : "WV" } +{ "_id" : "26710", "city" : "BURLINGTON", "loc" : [ -78.912278, 39.388709 ], "pop" : 3883, "state" : "WV" } +{ "_id" : "26711", "city" : "CAPON BRIDGE", "loc" : [ -78.46441299999999, 39.280198 ], "pop" : 997, "state" : "WV" } +{ "_id" : "26713", "city" : "CORINTH", "loc" : [ -79.50396499999999, 39.43183 ], "pop" : 503, "state" : "WV" } +{ "_id" : "26714", "city" : "DELRAY", "loc" : [ -78.639427, 39.179564 ], "pop" : 467, "state" : "WV" } +{ "_id" : "26716", "city" : "EGLON", "loc" : [ -79.510919, 39.292514 ], "pop" : 249, "state" : "WV" } +{ "_id" : "26717", "city" : "ELK GARDEN", "loc" : [ -79.153871, 39.363088 ], "pop" : 1168, "state" : "WV" } +{ "_id" : "26719", "city" : "FORT ASHBY", "loc" : [ -78.77429600000001, 39.497045 ], "pop" : 2212, "state" : "WV" } +{ "_id" : "26720", "city" : "GORMANIA", "loc" : [ -79.340136, 39.271499 ], "pop" : 823, "state" : "WV" } +{ "_id" : "26722", "city" : "GREEN SPRING", "loc" : [ -78.627191, 39.502931 ], "pop" : 739, "state" : "WV" } +{ "_id" : "26726", "city" : "SCHERR", "loc" : [ -78.98866700000001, 39.430406 ], "pop" : 9579, "state" : "WV" } +{ "_id" : "26729", "city" : "KIRBY", "loc" : [ -78.73146800000001, 39.195588 ], "pop" : 303, "state" : "WV" } +{ "_id" : "26731", "city" : "LAHMANSVILLE", "loc" : [ -79.043319, 39.164225 ], "pop" : 32, "state" : "WV" } +{ "_id" : "26734", "city" : "MEDLEY", "loc" : [ -79.0984, 39.236079 ], "pop" : 430, "state" : "WV" } +{ "_id" : "26739", "city" : "MOUNT STORM", "loc" : [ -79.225454, 39.265224 ], "pop" : 861, "state" : "WV" } +{ "_id" : "26743", "city" : "NEW CREEK", "loc" : [ -79.04521200000001, 39.361155 ], "pop" : 1417, "state" : "WV" } +{ "_id" : "26750", "city" : "PIEDMONT", "loc" : [ -79.048862, 39.479901 ], "pop" : 1094, "state" : "WV" } +{ "_id" : "26753", "city" : "PATTERSON CREEK", "loc" : [ -78.792006, 39.581796 ], "pop" : 5929, "state" : "WV" } +{ "_id" : "26755", "city" : "RIO", "loc" : [ -78.69354800000001, 39.180663 ], "pop" : 47, "state" : "WV" } +{ "_id" : "26757", "city" : "ROMNEY", "loc" : [ -78.748075, 39.342369 ], "pop" : 4007, "state" : "WV" } +{ "_id" : "26761", "city" : "SHANKS", "loc" : [ -78.69953099999999, 39.284859 ], "pop" : 779, "state" : "WV" } +{ "_id" : "26763", "city" : "SPRINGFIELD", "loc" : [ -78.695019, 39.462996 ], "pop" : 1321, "state" : "WV" } +{ "_id" : "26764", "city" : "HOPEMONT", "loc" : [ -79.55723399999999, 39.441575 ], "pop" : 4487, "state" : "WV" } +{ "_id" : "26765", "city" : "THREE CHURCHES", "loc" : [ -78.661061, 39.351578 ], "pop" : 1253, "state" : "WV" } +{ "_id" : "26767", "city" : "WILEY FORD", "loc" : [ -78.774992, 39.613308 ], "pop" : 1139, "state" : "WV" } +{ "_id" : "26769", "city" : "HORSE SHOE RUN", "loc" : [ -79.51231199999999, 39.252842 ], "pop" : 367, "state" : "WV" } +{ "_id" : "26801", "city" : "BAKER", "loc" : [ -78.774826, 39.065588 ], "pop" : 1321, "state" : "WV" } +{ "_id" : "26802", "city" : "BRANDYWINE", "loc" : [ -79.20962900000001, 38.635701 ], "pop" : 941, "state" : "WV" } +{ "_id" : "26804", "city" : "CIRCLEVILLE", "loc" : [ -79.53672, 38.623039 ], "pop" : 658, "state" : "WV" } +{ "_id" : "26806", "city" : "FORT SEYBERT", "loc" : [ -79.140781, 38.739489 ], "pop" : 167, "state" : "WV" } +{ "_id" : "26807", "city" : "FRANKLIN", "loc" : [ -79.353776, 38.639985 ], "pop" : 2733, "state" : "WV" } +{ "_id" : "26808", "city" : "HIGH VIEW", "loc" : [ -78.442548, 39.222497 ], "pop" : 922, "state" : "WV" } +{ "_id" : "26810", "city" : "LOST CITY", "loc" : [ -78.822684, 38.895361 ], "pop" : 190, "state" : "WV" } +{ "_id" : "26811", "city" : "LOST RIVER", "loc" : [ -78.79317, 38.93448 ], "pop" : 167, "state" : "WV" } +{ "_id" : "26812", "city" : "MATHIAS", "loc" : [ -78.88141299999999, 38.874443 ], "pop" : 1228, "state" : "WV" } +{ "_id" : "26813", "city" : "MOYERS", "loc" : [ -79.383011, 38.500561 ], "pop" : 461, "state" : "WV" } +{ "_id" : "26814", "city" : "RIVERTON", "loc" : [ -79.465531, 38.697871 ], "pop" : 348, "state" : "WV" } +{ "_id" : "26815", "city" : "SUGAR GROVE", "loc" : [ -79.290329, 38.52011 ], "pop" : 512, "state" : "WV" } +{ "_id" : "26816", "city" : "ARTHUR", "loc" : [ -79.099576, 39.101237 ], "pop" : 581, "state" : "WV" } +{ "_id" : "26817", "city" : "BLOOMERY", "loc" : [ -78.381561, 39.328606 ], "pop" : 675, "state" : "WV" } +{ "_id" : "26818", "city" : "FISHER", "loc" : [ -78.988756, 39.04796 ], "pop" : 1, "state" : "WV" } +{ "_id" : "26824", "city" : "JUNCTION", "loc" : [ -78.832785, 39.330441 ], "pop" : 200, "state" : "WV" } +{ "_id" : "26833", "city" : "MAYSVILLE", "loc" : [ -79.19370000000001, 39.071174 ], "pop" : 2615, "state" : "WV" } +{ "_id" : "26836", "city" : "RIG", "loc" : [ -78.97793, 39.056812 ], "pop" : 6314, "state" : "WV" } +{ "_id" : "26838", "city" : "MILAM", "loc" : [ -79.072936, 38.812526 ], "pop" : 30, "state" : "WV" } +{ "_id" : "26845", "city" : "OLD FIELDS", "loc" : [ -78.95094400000001, 39.150245 ], "pop" : 120, "state" : "WV" } +{ "_id" : "26847", "city" : "DORCAS", "loc" : [ -79.130701, 38.976602 ], "pop" : 4991, "state" : "WV" } +{ "_id" : "26851", "city" : "WARDENSVILLE", "loc" : [ -78.617457, 39.056238 ], "pop" : 1606, "state" : "WV" } +{ "_id" : "26852", "city" : "PURGITSVILLE", "loc" : [ -78.905951, 39.268065 ], "pop" : 672, "state" : "WV" } +{ "_id" : "26855", "city" : "CABINS", "loc" : [ -79.27833200000001, 38.951199 ], "pop" : 95, "state" : "WV" } +{ "_id" : "26865", "city" : "LEHEW", "loc" : [ -78.494998, 39.183038 ], "pop" : 190, "state" : "WV" } +{ "_id" : "26866", "city" : "UPPER TRACT", "loc" : [ -79.258589, 38.794952 ], "pop" : 1161, "state" : "WV" } +{ "_id" : "26884", "city" : "SENECA ROCKS", "loc" : [ -79.386577, 38.829615 ], "pop" : 840, "state" : "WV" } +{ "_id" : "26886", "city" : "ONEGO", "loc" : [ -79.45070200000001, 38.801718 ], "pop" : 233, "state" : "WV" } +{ "_id" : "27006", "city" : "ADVANCE", "loc" : [ -80.44630100000001, 36.006496 ], "pop" : 3325, "state" : "NC" } +{ "_id" : "27007", "city" : "ARARAT", "loc" : [ -80.608887, 36.386932 ], "pop" : 3101, "state" : "NC" } +{ "_id" : "27009", "city" : "BELEWS CREEK", "loc" : [ -80.09298800000001, 36.226874 ], "pop" : 1556, "state" : "NC" } +{ "_id" : "27011", "city" : "BOONVILLE", "loc" : [ -80.63569, 36.234012 ], "pop" : 262, "state" : "NC" } +{ "_id" : "27012", "city" : "CLEMMONS", "loc" : [ -80.39623, 36.034112 ], "pop" : 12694, "state" : "NC" } +{ "_id" : "27013", "city" : "CLEVELAND", "loc" : [ -80.711254, 35.737397 ], "pop" : 4070, "state" : "NC" } +{ "_id" : "27016", "city" : "DANBURY", "loc" : [ -80.219354, 36.455857 ], "pop" : 1560, "state" : "NC" } +{ "_id" : "27017", "city" : "DOBSON", "loc" : [ -80.710065, 36.369826 ], "pop" : 6092, "state" : "NC" } +{ "_id" : "27018", "city" : "EAST BEND", "loc" : [ -80.52840500000001, 36.203152 ], "pop" : 6140, "state" : "NC" } +{ "_id" : "27019", "city" : "GERMANTON", "loc" : [ -80.225432, 36.272513 ], "pop" : 4428, "state" : "NC" } +{ "_id" : "27020", "city" : "HAMPTONVILLE", "loc" : [ -80.813687, 36.124248 ], "pop" : 4691, "state" : "NC" } +{ "_id" : "27021", "city" : "KING", "loc" : [ -80.355957, 36.295033 ], "pop" : 12631, "state" : "NC" } +{ "_id" : "27022", "city" : "LAWSONVILLE", "loc" : [ -80.210291, 36.513228 ], "pop" : 1550, "state" : "NC" } +{ "_id" : "27023", "city" : "LEWISVILLE", "loc" : [ -80.420638, 36.0967 ], "pop" : 7165, "state" : "NC" } +{ "_id" : "27024", "city" : "LOWGAP", "loc" : [ -80.78886199999999, 36.503041 ], "pop" : 5065, "state" : "NC" } +{ "_id" : "27025", "city" : "MADISON", "loc" : [ -79.96543800000001, 36.369507 ], "pop" : 10393, "state" : "NC" } +{ "_id" : "27027", "city" : "MAYODAN", "loc" : [ -79.95674200000001, 36.427677 ], "pop" : 6545, "state" : "NC" } +{ "_id" : "27028", "city" : "MOCKSVILLE", "loc" : [ -80.536965, 35.922007 ], "pop" : 24999, "state" : "NC" } +{ "_id" : "27030", "city" : "MOUNT AIRY", "loc" : [ -80.61187099999999, 36.500739 ], "pop" : 29155, "state" : "NC" } +{ "_id" : "27040", "city" : "PFAFFTOWN", "loc" : [ -80.37982599999999, 36.166914 ], "pop" : 8160, "state" : "NC" } +{ "_id" : "27041", "city" : "PILOT MOUNTAIN", "loc" : [ -80.492065, 36.41094 ], "pop" : 7058, "state" : "NC" } +{ "_id" : "27042", "city" : "PINE HALL", "loc" : [ -80.049533, 36.348178 ], "pop" : 377, "state" : "NC" } +{ "_id" : "27043", "city" : "PINNACLE", "loc" : [ -80.439111, 36.333905 ], "pop" : 4275, "state" : "NC" } +{ "_id" : "27045", "city" : "RURAL HALL", "loc" : [ -80.293643, 36.229251 ], "pop" : 6635, "state" : "NC" } +{ "_id" : "27046", "city" : "SANDY RIDGE", "loc" : [ -80.085857, 36.489973 ], "pop" : 1580, "state" : "NC" } +{ "_id" : "27047", "city" : "SILOAM", "loc" : [ -80.577162, 36.300208 ], "pop" : 524, "state" : "NC" } +{ "_id" : "27048", "city" : "STONEVILLE", "loc" : [ -79.901297, 36.470483 ], "pop" : 4166, "state" : "NC" } +{ "_id" : "27050", "city" : "TOBACCOVILLE", "loc" : [ -80.391549, 36.233627 ], "pop" : 2697, "state" : "NC" } +{ "_id" : "27051", "city" : "WALKERTOWN", "loc" : [ -80.162865, 36.179999 ], "pop" : 6199, "state" : "NC" } +{ "_id" : "27052", "city" : "WALNUT COVE", "loc" : [ -80.148414, 36.318872 ], "pop" : 9048, "state" : "NC" } +{ "_id" : "27053", "city" : "WESTFIELD", "loc" : [ -80.367739, 36.467405 ], "pop" : 3500, "state" : "NC" } +{ "_id" : "27054", "city" : "WOODLEAF", "loc" : [ -80.60394100000001, 35.787564 ], "pop" : 2735, "state" : "NC" } +{ "_id" : "27055", "city" : "YADKINVILLE", "loc" : [ -80.65302, 36.127694 ], "pop" : 11978, "state" : "NC" } +{ "_id" : "27101", "city" : "WINSTON SALEM", "loc" : [ -80.222798, 36.10237 ], "pop" : 19333, "state" : "NC" } +{ "_id" : "27103", "city" : "WINSTON SALEM", "loc" : [ -80.302509, 36.067127 ], "pop" : 24299, "state" : "NC" } +{ "_id" : "27104", "city" : "WINSTON SALEM", "loc" : [ -80.322423, 36.091985 ], "pop" : 23677, "state" : "NC" } +{ "_id" : "27105", "city" : "WINSTON SALEM", "loc" : [ -80.237646, 36.144039 ], "pop" : 40194, "state" : "NC" } +{ "_id" : "27106", "city" : "WINSTON SALEM", "loc" : [ -80.306866, 36.142762 ], "pop" : 35209, "state" : "NC" } +{ "_id" : "27107", "city" : "WINSTON SALEM", "loc" : [ -80.193265, 36.040324 ], "pop" : 33085, "state" : "NC" } +{ "_id" : "27127", "city" : "WINSTON SALEM", "loc" : [ -80.260946, 36.042534 ], "pop" : 20784, "state" : "NC" } +{ "_id" : "27203", "city" : "FARMER", "loc" : [ -79.819678, 35.693496 ], "pop" : 41541, "state" : "NC" } +{ "_id" : "27207", "city" : "BEAR CREEK", "loc" : [ -79.372606, 35.612882 ], "pop" : 3894, "state" : "NC" } +{ "_id" : "27208", "city" : "BENNETT", "loc" : [ -79.522524, 35.567269 ], "pop" : 1218, "state" : "NC" } +{ "_id" : "27209", "city" : "BISCOE", "loc" : [ -79.75955500000001, 35.325654 ], "pop" : 3528, "state" : "NC" } +{ "_id" : "27212", "city" : "BLANCH", "loc" : [ -79.304185, 36.533839 ], "pop" : 94, "state" : "NC" } +{ "_id" : "27214", "city" : "BROWNS SUMMIT", "loc" : [ -79.71008, 36.201868 ], "pop" : 5688, "state" : "NC" } +{ "_id" : "27215", "city" : "GLEN RAVEN", "loc" : [ -79.462152, 36.072011 ], "pop" : 29107, "state" : "NC" } +{ "_id" : "27217", "city" : "BURLINGTON", "loc" : [ -79.411447, 36.1288 ], "pop" : 30651, "state" : "NC" } +{ "_id" : "27229", "city" : "CANDOR", "loc" : [ -79.787623, 35.22335 ], "pop" : 967, "state" : "NC" } +{ "_id" : "27231", "city" : "CEDAR GROVE", "loc" : [ -79.166588, 36.201986 ], "pop" : 1594, "state" : "NC" } +{ "_id" : "27233", "city" : "CLIMAX", "loc" : [ -79.701858, 35.934512 ], "pop" : 1085, "state" : "NC" } +{ "_id" : "27235", "city" : "COLFAX", "loc" : [ -80.010276, 36.100272 ], "pop" : 1983, "state" : "NC" } +{ "_id" : "27239", "city" : "DENTON", "loc" : [ -80.09592600000001, 35.619567 ], "pop" : 7102, "state" : "NC" } +{ "_id" : "27242", "city" : "EAGLE SPRINGS", "loc" : [ -79.630983, 35.335957 ], "pop" : 1742, "state" : "NC" } +{ "_id" : "27243", "city" : "EFLAND", "loc" : [ -79.18841500000001, 36.091166 ], "pop" : 2661, "state" : "NC" } +{ "_id" : "27244", "city" : "ELON COLLEGE", "loc" : [ -79.502334, 36.146638 ], "pop" : 10269, "state" : "NC" } +{ "_id" : "27248", "city" : "FRANKLINVILLE", "loc" : [ -79.713178, 35.791739 ], "pop" : 4613, "state" : "NC" } +{ "_id" : "27249", "city" : "GIBSONVILLE", "loc" : [ -79.568454, 36.118304 ], "pop" : 8409, "state" : "NC" } +{ "_id" : "27252", "city" : "GOLDSTON", "loc" : [ -79.33852, 35.56428 ], "pop" : 1814, "state" : "NC" } +{ "_id" : "27253", "city" : "GRAHAM", "loc" : [ -79.381384, 36.030967 ], "pop" : 19723, "state" : "NC" } +{ "_id" : "27258", "city" : "HAW RIVER", "loc" : [ -79.334557, 36.055085 ], "pop" : 4964, "state" : "NC" } +{ "_id" : "27260", "city" : "HIGH POINT", "loc" : [ -80.011673, 35.959313 ], "pop" : 36887, "state" : "NC" } +{ "_id" : "27262", "city" : "HIGH POINT", "loc" : [ -80.010677, 35.973406 ], "pop" : 11401, "state" : "NC" } +{ "_id" : "27263", "city" : "ARCHDALE", "loc" : [ -79.961764, 35.910757 ], "pop" : 17140, "state" : "NC" } +{ "_id" : "27265", "city" : "HIGH POINT", "loc" : [ -80.00357099999999, 36.003584 ], "pop" : 22310, "state" : "NC" } +{ "_id" : "27278", "city" : "HILLSBOROUGH", "loc" : [ -79.091416, 36.07558 ], "pop" : 15811, "state" : "NC" } +{ "_id" : "27281", "city" : "JACKSON SPRINGS", "loc" : [ -79.66853500000001, 35.225941 ], "pop" : 2167, "state" : "NC" } +{ "_id" : "27282", "city" : "JAMESTOWN", "loc" : [ -79.929286, 35.998993 ], "pop" : 9812, "state" : "NC" } +{ "_id" : "27283", "city" : "JULIAN", "loc" : [ -79.63862899999999, 35.95429 ], "pop" : 2894, "state" : "NC" } +{ "_id" : "27284", "city" : "KERNERSVILLE", "loc" : [ -80.08311500000001, 36.116534 ], "pop" : 34795, "state" : "NC" } +{ "_id" : "27288", "city" : "EDEN", "loc" : [ -79.75899800000001, 36.500003 ], "pop" : 26675, "state" : "NC" } +{ "_id" : "27291", "city" : "LEASBURG", "loc" : [ -79.194188, 36.415113 ], "pop" : 2700, "state" : "NC" } +{ "_id" : "27292", "city" : "LEXINGTON", "loc" : [ -80.262049, 35.82306 ], "pop" : 69179, "state" : "NC" } +{ "_id" : "27298", "city" : "LIBERTY", "loc" : [ -79.582144, 35.872878 ], "pop" : 7303, "state" : "NC" } +{ "_id" : "27299", "city" : "LINWOOD", "loc" : [ -80.374895, 35.75623 ], "pop" : 2823, "state" : "NC" } +{ "_id" : "27301", "city" : "MC LEANSVILLE", "loc" : [ -79.66838799999999, 36.116291 ], "pop" : 5200, "state" : "NC" } +{ "_id" : "27302", "city" : "MEBANE", "loc" : [ -79.271895, 36.097862 ], "pop" : 14650, "state" : "NC" } +{ "_id" : "27305", "city" : "MILTON", "loc" : [ -79.208699, 36.515784 ], "pop" : 1383, "state" : "NC" } +{ "_id" : "27306", "city" : "MOUNT GILEAD", "loc" : [ -79.98708999999999, 35.227447 ], "pop" : 5829, "state" : "NC" } +{ "_id" : "27310", "city" : "OAK RIDGE", "loc" : [ -79.980366, 36.167315 ], "pop" : 2231, "state" : "NC" } +{ "_id" : "27311", "city" : "PELHAM", "loc" : [ -79.47360500000001, 36.489912 ], "pop" : 3964, "state" : "NC" } +{ "_id" : "27312", "city" : "PITTSBORO", "loc" : [ -79.17550900000001, 35.769436 ], "pop" : 10601, "state" : "NC" } +{ "_id" : "27313", "city" : "PLEASANT GARDEN", "loc" : [ -79.754943, 35.952243 ], "pop" : 4064, "state" : "NC" } +{ "_id" : "27314", "city" : "PROSPECT HILL", "loc" : [ -79.215644, 36.293195 ], "pop" : 1116, "state" : "NC" } +{ "_id" : "27315", "city" : "PROVIDENCE", "loc" : [ -79.36306, 36.48314 ], "pop" : 3462, "state" : "NC" } +{ "_id" : "27316", "city" : "COLERIDGE", "loc" : [ -79.63510100000001, 35.708349 ], "pop" : 5238, "state" : "NC" } +{ "_id" : "27317", "city" : "RANDLEMAN", "loc" : [ -79.801794, 35.848805 ], "pop" : 14220, "state" : "NC" } +{ "_id" : "27320", "city" : "REIDSVILLE", "loc" : [ -79.66421200000001, 36.343209 ], "pop" : 34283, "state" : "NC" } +{ "_id" : "27325", "city" : "ROBBINS", "loc" : [ -79.58203399999999, 35.452839 ], "pop" : 6383, "state" : "NC" } +{ "_id" : "27326", "city" : "RUFFIN", "loc" : [ -79.560551, 36.442763 ], "pop" : 4138, "state" : "NC" } +{ "_id" : "27330", "city" : "COLON", "loc" : [ -79.176446, 35.464148 ], "pop" : 39537, "state" : "NC" } +{ "_id" : "27341", "city" : "SEAGROVE", "loc" : [ -79.69786999999999, 35.528309 ], "pop" : 4656, "state" : "NC" } +{ "_id" : "27343", "city" : "SEMORA", "loc" : [ -79.094168, 36.511414 ], "pop" : 1214, "state" : "NC" } +{ "_id" : "27344", "city" : "SILER CITY", "loc" : [ -79.45662400000001, 35.735392 ], "pop" : 12298, "state" : "NC" } +{ "_id" : "27349", "city" : "SNOW CAMP", "loc" : [ -79.427893, 35.906583 ], "pop" : 3424, "state" : "NC" } +{ "_id" : "27350", "city" : "SOPHIA", "loc" : [ -79.898634, 35.829845 ], "pop" : 4165, "state" : "NC" } +{ "_id" : "27355", "city" : "STALEY", "loc" : [ -79.584391, 35.801485 ], "pop" : 1747, "state" : "NC" } +{ "_id" : "27356", "city" : "STAR", "loc" : [ -79.782607, 35.421113 ], "pop" : 3077, "state" : "NC" } +{ "_id" : "27357", "city" : "STOKESDALE", "loc" : [ -79.970528, 36.255217 ], "pop" : 3807, "state" : "NC" } +{ "_id" : "27358", "city" : "SUMMERFIELD", "loc" : [ -79.890136, 36.224454 ], "pop" : 5937, "state" : "NC" } +{ "_id" : "27360", "city" : "THOMASVILLE", "loc" : [ -80.09128, 35.87128 ], "pop" : 32777, "state" : "NC" } +{ "_id" : "27370", "city" : "TRINITY", "loc" : [ -79.990206, 35.842949 ], "pop" : 14290, "state" : "NC" } +{ "_id" : "27371", "city" : "TROY", "loc" : [ -79.909252, 35.377702 ], "pop" : 9536, "state" : "NC" } +{ "_id" : "27376", "city" : "WEST END", "loc" : [ -79.53598, 35.251239 ], "pop" : 5480, "state" : "NC" } +{ "_id" : "27377", "city" : "WHITSETT", "loc" : [ -79.597151, 36.032981 ], "pop" : 2345, "state" : "NC" } +{ "_id" : "27379", "city" : "YANCEYVILLE", "loc" : [ -79.346485, 36.390695 ], "pop" : 3011, "state" : "NC" } +{ "_id" : "27401", "city" : "GREENSBORO", "loc" : [ -79.768151, 36.069741 ], "pop" : 19389, "state" : "NC" } +{ "_id" : "27403", "city" : "GREENSBORO", "loc" : [ -79.82018100000001, 36.064147 ], "pop" : 21666, "state" : "NC" } +{ "_id" : "27405", "city" : "GREENSBORO", "loc" : [ -79.77330000000001, 36.121408 ], "pop" : 46387, "state" : "NC" } +{ "_id" : "27406", "city" : "GREENSBORO", "loc" : [ -79.78205800000001, 36.021969 ], "pop" : 45221, "state" : "NC" } +{ "_id" : "27407", "city" : "GREENSBORO", "loc" : [ -79.862647, 36.033442 ], "pop" : 29591, "state" : "NC" } +{ "_id" : "27408", "city" : "GREENSBORO", "loc" : [ -79.816531, 36.1064 ], "pop" : 19970, "state" : "NC" } +{ "_id" : "27409", "city" : "GREENSBORO", "loc" : [ -79.908602, 36.077683 ], "pop" : 8734, "state" : "NC" } +{ "_id" : "27410", "city" : "GREENSBORO", "loc" : [ -79.87936500000001, 36.103164 ], "pop" : 33819, "state" : "NC" } +{ "_id" : "27501", "city" : "ANGIER", "loc" : [ -78.724931, 35.489725 ], "pop" : 6349, "state" : "NC" } +{ "_id" : "27502", "city" : "APEX", "loc" : [ -78.840816, 35.722504 ], "pop" : 19391, "state" : "NC" } +{ "_id" : "27503", "city" : "BAHAMA", "loc" : [ -78.89028399999999, 36.156581 ], "pop" : 3276, "state" : "NC" } +{ "_id" : "27504", "city" : "BENSON", "loc" : [ -78.54213, 35.403661 ], "pop" : 9995, "state" : "NC" } +{ "_id" : "27505", "city" : "BROADWAY", "loc" : [ -79.043547, 35.418088 ], "pop" : 5551, "state" : "NC" } +{ "_id" : "27507", "city" : "BULLOCK", "loc" : [ -78.56458000000001, 36.507642 ], "pop" : 1423, "state" : "NC" } +{ "_id" : "27509", "city" : "BUTNER", "loc" : [ -78.7636, 36.135939 ], "pop" : 6310, "state" : "NC" } +{ "_id" : "27510", "city" : "CARRBORO", "loc" : [ -79.08183200000001, 35.912409 ], "pop" : 10049, "state" : "NC" } +{ "_id" : "27511", "city" : "CARY", "loc" : [ -78.77856800000001, 35.764119 ], "pop" : 31040, "state" : "NC" } +{ "_id" : "27513", "city" : "CARY", "loc" : [ -78.794061, 35.795642 ], "pop" : 15082, "state" : "NC" } +{ "_id" : "27514", "city" : "CHAPEL HILL", "loc" : [ -79.037189, 35.920322 ], "pop" : 39733, "state" : "NC" } +{ "_id" : "27516", "city" : "CHAPEL HILL", "loc" : [ -79.099867, 35.916175 ], "pop" : 21377, "state" : "NC" } +{ "_id" : "27520", "city" : "CLAYTON", "loc" : [ -78.451013, 35.63484 ], "pop" : 15067, "state" : "NC" } +{ "_id" : "27521", "city" : "COATS", "loc" : [ -78.66270400000001, 35.40822 ], "pop" : 4437, "state" : "NC" } +{ "_id" : "27522", "city" : "CREEDMOOR", "loc" : [ -78.647587, 36.112433 ], "pop" : 7620, "state" : "NC" } +{ "_id" : "27524", "city" : "FOUR OAKS", "loc" : [ -78.415282, 35.404017 ], "pop" : 9270, "state" : "NC" } +{ "_id" : "27525", "city" : "FRANKLINTON", "loc" : [ -78.448618, 36.095505 ], "pop" : 8242, "state" : "NC" } +{ "_id" : "27526", "city" : "FUQUAY VARINA", "loc" : [ -78.790807, 35.579952 ], "pop" : 16537, "state" : "NC" } +{ "_id" : "27529", "city" : "GARNER", "loc" : [ -78.597527, 35.681254 ], "pop" : 21063, "state" : "NC" } +{ "_id" : "27530", "city" : "GRANTHAM", "loc" : [ -78.01581299999999, 35.382585 ], "pop" : 37791, "state" : "NC" } +{ "_id" : "27531", "city" : "SEYMOUR JOHNSON", "loc" : [ -77.96431200000001, 35.352611 ], "pop" : 4747, "state" : "NC" } +{ "_id" : "27534", "city" : "GOLDSBORO", "loc" : [ -77.92206899999999, 35.36643 ], "pop" : 31892, "state" : "NC" } +{ "_id" : "27536", "city" : "HENDERSON", "loc" : [ -78.39808600000001, 36.330068 ], "pop" : 36983, "state" : "NC" } +{ "_id" : "27540", "city" : "HOLLY SPRINGS", "loc" : [ -78.845816, 35.626263 ], "pop" : 2282, "state" : "NC" } +{ "_id" : "27541", "city" : "HURDLE MILLS", "loc" : [ -79.08266, 36.251788 ], "pop" : 2773, "state" : "NC" } +{ "_id" : "27542", "city" : "KENLY", "loc" : [ -78.138227, 35.607742 ], "pop" : 6729, "state" : "NC" } +{ "_id" : "27544", "city" : "KITTRELL", "loc" : [ -78.42407300000001, 36.204175 ], "pop" : 2967, "state" : "NC" } +{ "_id" : "27545", "city" : "KNIGHTDALE", "loc" : [ -78.489814, 35.778926 ], "pop" : 11525, "state" : "NC" } +{ "_id" : "27546", "city" : "LILLINGTON", "loc" : [ -78.921223, 35.331954 ], "pop" : 23302, "state" : "NC" } +{ "_id" : "27549", "city" : "LOUISBURG", "loc" : [ -78.25862499999999, 36.05781 ], "pop" : 20285, "state" : "NC" } +{ "_id" : "27551", "city" : "MACON", "loc" : [ -77.99870900000001, 36.444697 ], "pop" : 4044, "state" : "NC" } +{ "_id" : "27553", "city" : "MANSON", "loc" : [ -78.29525, 36.460264 ], "pop" : 1976, "state" : "NC" } +{ "_id" : "27557", "city" : "MIDDLESEX", "loc" : [ -78.20616200000001, 35.766499 ], "pop" : 4318, "state" : "NC" } +{ "_id" : "27559", "city" : "MONCURE", "loc" : [ -79.083915, 35.630615 ], "pop" : 2695, "state" : "NC" } +{ "_id" : "27560", "city" : "MORRISVILLE", "loc" : [ -78.846594, 35.834371 ], "pop" : 3922, "state" : "NC" } +{ "_id" : "27562", "city" : "NEW HILL", "loc" : [ -78.93653399999999, 35.680877 ], "pop" : 991, "state" : "NC" } +{ "_id" : "27563", "city" : "NORLINA", "loc" : [ -78.189455, 36.475364 ], "pop" : 3605, "state" : "NC" } +{ "_id" : "27565", "city" : "OXFORD", "loc" : [ -78.613433, 36.331269 ], "pop" : 20568, "state" : "NC" } +{ "_id" : "27569", "city" : "PRINCETON", "loc" : [ -78.167368, 35.455833 ], "pop" : 5378, "state" : "NC" } +{ "_id" : "27571", "city" : "ROLESVILLE", "loc" : [ -78.46584300000001, 35.915575 ], "pop" : 3975, "state" : "NC" } +{ "_id" : "27572", "city" : "ROUGEMONT", "loc" : [ -78.901867, 36.239251 ], "pop" : 4253, "state" : "NC" } +{ "_id" : "27573", "city" : "ROXBORO", "loc" : [ -78.973698, 36.405902 ], "pop" : 22321, "state" : "NC" } +{ "_id" : "27576", "city" : "SELMA", "loc" : [ -78.264025, 35.556531 ], "pop" : 13335, "state" : "NC" } +{ "_id" : "27577", "city" : "SMITHFIELD", "loc" : [ -78.347866, 35.50684 ], "pop" : 15031, "state" : "NC" } +{ "_id" : "27581", "city" : "STEM", "loc" : [ -78.70012, 36.21004 ], "pop" : 2421, "state" : "NC" } +{ "_id" : "27583", "city" : "TIMBERLAKE", "loc" : [ -78.935287, 36.291763 ], "pop" : 3424, "state" : "NC" } +{ "_id" : "27587", "city" : "WAKE FOREST", "loc" : [ -78.539213, 35.981544 ], "pop" : 11878, "state" : "NC" } +{ "_id" : "27589", "city" : "WARRENTON", "loc" : [ -78.159389, 36.353944 ], "pop" : 8240, "state" : "NC" } +{ "_id" : "27591", "city" : "WENDELL", "loc" : [ -78.392601, 35.797964 ], "pop" : 12418, "state" : "NC" } +{ "_id" : "27592", "city" : "WILLOW SPRING", "loc" : [ -78.671738, 35.547031 ], "pop" : 4672, "state" : "NC" } +{ "_id" : "27596", "city" : "YOUNGSVILLE", "loc" : [ -78.441198, 36.007782 ], "pop" : 4549, "state" : "NC" } +{ "_id" : "27597", "city" : "ZEBULON", "loc" : [ -78.317368, 35.832078 ], "pop" : 10153, "state" : "NC" } +{ "_id" : "27601", "city" : "RALEIGH", "loc" : [ -78.63243900000001, 35.772701 ], "pop" : 9810, "state" : "NC" } +{ "_id" : "27603", "city" : "RALEIGH", "loc" : [ -78.656265, 35.707569 ], "pop" : 25366, "state" : "NC" } +{ "_id" : "27604", "city" : "RALEIGH", "loc" : [ -78.579949, 35.833407 ], "pop" : 35217, "state" : "NC" } +{ "_id" : "27605", "city" : "RALEIGH", "loc" : [ -78.653025, 35.790795 ], "pop" : 4169, "state" : "NC" } +{ "_id" : "27606", "city" : "RALEIGH", "loc" : [ -78.711189, 35.764499 ], "pop" : 29446, "state" : "NC" } +{ "_id" : "27607", "city" : "RALEIGH", "loc" : [ -78.687747, 35.801385 ], "pop" : 19515, "state" : "NC" } +{ "_id" : "27608", "city" : "RALEIGH", "loc" : [ -78.646277, 35.807746 ], "pop" : 10130, "state" : "NC" } +{ "_id" : "27609", "city" : "RALEIGH", "loc" : [ -78.631654, 35.847989 ], "pop" : 29872, "state" : "NC" } +{ "_id" : "27610", "city" : "RALEIGH", "loc" : [ -78.60075999999999, 35.766674 ], "pop" : 32494, "state" : "NC" } +{ "_id" : "27612", "city" : "RALEIGH", "loc" : [ -78.684119, 35.851997 ], "pop" : 20962, "state" : "NC" } +{ "_id" : "27613", "city" : "RALEIGH", "loc" : [ -78.70505900000001, 35.894932 ], "pop" : 19518, "state" : "NC" } +{ "_id" : "27614", "city" : "RALEIGH", "loc" : [ -78.643339, 35.945711 ], "pop" : 7200, "state" : "NC" } +{ "_id" : "27615", "city" : "RALEIGH", "loc" : [ -78.63927700000001, 35.888744 ], "pop" : 29771, "state" : "NC" } +{ "_id" : "27701", "city" : "DURHAM", "loc" : [ -78.896613, 35.996725 ], "pop" : 20284, "state" : "NC" } +{ "_id" : "27703", "city" : "DURHAM", "loc" : [ -78.843874, 35.978122 ], "pop" : 24362, "state" : "NC" } +{ "_id" : "27704", "city" : "DURHAM", "loc" : [ -78.876437, 36.038297 ], "pop" : 23460, "state" : "NC" } +{ "_id" : "27705", "city" : "DURHAM", "loc" : [ -78.947776, 36.021846 ], "pop" : 32916, "state" : "NC" } +{ "_id" : "27706", "city" : "DURHAM", "loc" : [ -78.937524, 36.002427 ], "pop" : 4790, "state" : "NC" } +{ "_id" : "27707", "city" : "DURHAM", "loc" : [ -78.931484, 35.963076 ], "pop" : 36264, "state" : "NC" } +{ "_id" : "27712", "city" : "DURHAM", "loc" : [ -78.929919, 36.091779 ], "pop" : 15138, "state" : "NC" } +{ "_id" : "27713", "city" : "RESEARCH TRIANGL", "loc" : [ -78.916641, 35.916105 ], "pop" : 19493, "state" : "NC" } +{ "_id" : "27801", "city" : "ROCKY MOUNT", "loc" : [ -77.76081600000001, 35.94265 ], "pop" : 25072, "state" : "NC" } +{ "_id" : "27803", "city" : "ROCKY MOUNT", "loc" : [ -77.835022, 35.923784 ], "pop" : 20416, "state" : "NC" } +{ "_id" : "27804", "city" : "WESLEYAN COLLEGE", "loc" : [ -77.82754300000001, 35.979634 ], "pop" : 24367, "state" : "NC" } +{ "_id" : "27805", "city" : "AULANDER", "loc" : [ -77.114086, 36.147452 ], "pop" : 4880, "state" : "NC" } +{ "_id" : "27806", "city" : "AURORA", "loc" : [ -76.799448, 35.302282 ], "pop" : 2957, "state" : "NC" } +{ "_id" : "27807", "city" : "BAILEY", "loc" : [ -78.089226, 35.807167 ], "pop" : 4399, "state" : "NC" } +{ "_id" : "27808", "city" : "BATH", "loc" : [ -76.771531, 35.470161 ], "pop" : 1915, "state" : "NC" } +{ "_id" : "27809", "city" : "BATTLEBORO", "loc" : [ -77.431107, 35.84387 ], "pop" : 808, "state" : "NC" } +{ "_id" : "27810", "city" : "BELHAVEN", "loc" : [ -76.623574, 35.520493 ], "pop" : 4130, "state" : "NC" } +{ "_id" : "27812", "city" : "BETHEL", "loc" : [ -77.374765, 35.790885 ], "pop" : 3116, "state" : "NC" } +{ "_id" : "27814", "city" : "BLOUNTS CREEK", "loc" : [ -76.925004, 35.382029 ], "pop" : 1272, "state" : "NC" } +{ "_id" : "27816", "city" : "CASTALIA", "loc" : [ -78.070452, 36.090124 ], "pop" : 2623, "state" : "NC" } +{ "_id" : "27817", "city" : "CHOCOWINITY", "loc" : [ -77.08680099999999, 35.481409 ], "pop" : 5553, "state" : "NC" } +{ "_id" : "27818", "city" : "COMO", "loc" : [ -77.051526, 36.497818 ], "pop" : 1484, "state" : "NC" } +{ "_id" : "27820", "city" : "CONWAY", "loc" : [ -77.250243, 36.416382 ], "pop" : 3474, "state" : "NC" } +{ "_id" : "27821", "city" : "EDWARD", "loc" : [ -76.87938800000001, 35.323588 ], "pop" : 122, "state" : "NC" } +{ "_id" : "27822", "city" : "ELM CITY", "loc" : [ -77.856032, 35.810954 ], "pop" : 8507, "state" : "NC" } +{ "_id" : "27823", "city" : "ENFIELD", "loc" : [ -77.712907, 36.197331 ], "pop" : 8876, "state" : "NC" } +{ "_id" : "27824", "city" : "MIDDLETOWN", "loc" : [ -76.037434, 35.49806 ], "pop" : 1822, "state" : "NC" } +{ "_id" : "27826", "city" : "FAIRFIELD", "loc" : [ -76.231768, 35.565873 ], "pop" : 585, "state" : "NC" } +{ "_id" : "27828", "city" : "FARMVILLE", "loc" : [ -77.579303, 35.580606 ], "pop" : 8260, "state" : "NC" } +{ "_id" : "27829", "city" : "FOUNTAIN", "loc" : [ -77.621448, 35.669436 ], "pop" : 1419, "state" : "NC" } +{ "_id" : "27830", "city" : "EUREKA", "loc" : [ -77.996302, 35.518558 ], "pop" : 6803, "state" : "NC" } +{ "_id" : "27831", "city" : "GARYSBURG", "loc" : [ -77.571905, 36.476147 ], "pop" : 2824, "state" : "NC" } +{ "_id" : "27832", "city" : "GASTON", "loc" : [ -77.682379, 36.51153 ], "pop" : 2560, "state" : "NC" } +{ "_id" : "27834", "city" : "GREENVILLE", "loc" : [ -77.397542, 35.619221 ], "pop" : 35377, "state" : "NC" } +{ "_id" : "27837", "city" : "GRIMESLAND", "loc" : [ -77.256612, 35.558005 ], "pop" : 6998, "state" : "NC" } +{ "_id" : "27839", "city" : "HALIFAX", "loc" : [ -77.56072500000001, 36.30492 ], "pop" : 4264, "state" : "NC" } +{ "_id" : "27840", "city" : "HAMILTON", "loc" : [ -77.21762, 35.944119 ], "pop" : 1060, "state" : "NC" } +{ "_id" : "27842", "city" : "HENRICO", "loc" : [ -77.854625, 36.527409 ], "pop" : 800, "state" : "NC" } +{ "_id" : "27843", "city" : "HOBGOOD", "loc" : [ -77.436959, 36.004281 ], "pop" : 2408, "state" : "NC" } +{ "_id" : "27844", "city" : "HOLLISTER", "loc" : [ -77.931916, 36.25898 ], "pop" : 2691, "state" : "NC" } +{ "_id" : "27845", "city" : "JACKSON", "loc" : [ -77.468144, 36.386984 ], "pop" : 2703, "state" : "NC" } +{ "_id" : "27846", "city" : "JAMESVILLE", "loc" : [ -76.898332, 35.78385 ], "pop" : 3141, "state" : "NC" } +{ "_id" : "27847", "city" : "KELFORD", "loc" : [ -77.259214, 36.199173 ], "pop" : 150, "state" : "NC" } +{ "_id" : "27848", "city" : "LASKER", "loc" : [ -77.348266, 36.376664 ], "pop" : 80, "state" : "NC" } +{ "_id" : "27849", "city" : "LEWISTON WOODVIL", "loc" : [ -77.206631, 36.134416 ], "pop" : 634, "state" : "NC" } +{ "_id" : "27850", "city" : "LITTLETON", "loc" : [ -77.85281500000001, 36.416877 ], "pop" : 4388, "state" : "NC" } +{ "_id" : "27851", "city" : "LUCAMA", "loc" : [ -78.019687, 35.641504 ], "pop" : 4537, "state" : "NC" } +{ "_id" : "27852", "city" : "CRISP", "loc" : [ -77.596442, 35.773741 ], "pop" : 4145, "state" : "NC" } +{ "_id" : "27853", "city" : "MARGARETTSVILLE", "loc" : [ -77.325997, 36.524494 ], "pop" : 289, "state" : "NC" } +{ "_id" : "27855", "city" : "MURFREESBORO", "loc" : [ -77.10269599999999, 36.43192 ], "pop" : 6186, "state" : "NC" } +{ "_id" : "27856", "city" : "NASHVILLE", "loc" : [ -77.959485, 35.98428 ], "pop" : 12069, "state" : "NC" } +{ "_id" : "27857", "city" : "OAK CITY", "loc" : [ -77.30036200000001, 35.959736 ], "pop" : 2268, "state" : "NC" } +{ "_id" : "27858", "city" : "GREENVILLE", "loc" : [ -77.348505, 35.586567 ], "pop" : 31246, "state" : "NC" } +{ "_id" : "27859", "city" : "PALMYRA", "loc" : [ -77.364288, 36.106268 ], "pop" : 344, "state" : "NC" } +{ "_id" : "27860", "city" : "PANTEGO", "loc" : [ -76.698848, 35.620058 ], "pop" : 1915, "state" : "NC" } +{ "_id" : "27862", "city" : "PENDLETON", "loc" : [ -77.191112, 36.493676 ], "pop" : 1127, "state" : "NC" } +{ "_id" : "27863", "city" : "PIKEVILLE", "loc" : [ -77.957787, 35.49289 ], "pop" : 1968, "state" : "NC" } +{ "_id" : "27864", "city" : "PINETOPS", "loc" : [ -77.691952, 35.819611 ], "pop" : 5935, "state" : "NC" } +{ "_id" : "27865", "city" : "PINETOWN", "loc" : [ -76.807565, 35.57576 ], "pop" : 1829, "state" : "NC" } +{ "_id" : "27866", "city" : "PLEASANT HILL", "loc" : [ -77.519217, 36.521246 ], "pop" : 639, "state" : "NC" } +{ "_id" : "27869", "city" : "RICH SQUARE", "loc" : [ -77.296947, 36.277256 ], "pop" : 2621, "state" : "NC" } +{ "_id" : "27870", "city" : "ROANOKE RAPIDS", "loc" : [ -77.67306000000001, 36.446146 ], "pop" : 25628, "state" : "NC" } +{ "_id" : "27871", "city" : "ROBERSONVILLE", "loc" : [ -77.26004, 35.821797 ], "pop" : 4941, "state" : "NC" } +{ "_id" : "27872", "city" : "ROXOBEL", "loc" : [ -77.22706100000001, 36.194464 ], "pop" : 623, "state" : "NC" } +{ "_id" : "27873", "city" : "SARATOGA", "loc" : [ -77.767613, 35.662778 ], "pop" : 1870, "state" : "NC" } +{ "_id" : "27874", "city" : "SCOTLAND NECK", "loc" : [ -77.427274, 36.130141 ], "pop" : 5219, "state" : "NC" } +{ "_id" : "27875", "city" : "SCRANTON", "loc" : [ -76.49170599999999, 35.525039 ], "pop" : 1184, "state" : "NC" } +{ "_id" : "27876", "city" : "SEABOARD", "loc" : [ -77.411306, 36.488552 ], "pop" : 1767, "state" : "NC" } +{ "_id" : "27880", "city" : "SIMS", "loc" : [ -78.085854, 35.74351 ], "pop" : 2214, "state" : "NC" } +{ "_id" : "27882", "city" : "SPRING HOPE", "loc" : [ -78.10850000000001, 35.930193 ], "pop" : 6180, "state" : "NC" } +{ "_id" : "27883", "city" : "STANTONSBURG", "loc" : [ -77.837773, 35.593998 ], "pop" : 2117, "state" : "NC" } +{ "_id" : "27884", "city" : "STOKES", "loc" : [ -77.272178, 35.710402 ], "pop" : 922, "state" : "NC" } +{ "_id" : "27885", "city" : "SWANQUARTER", "loc" : [ -76.287521, 35.422207 ], "pop" : 1203, "state" : "NC" } +{ "_id" : "27886", "city" : "TARBORO", "loc" : [ -77.542067, 35.898257 ], "pop" : 16144, "state" : "NC" } +{ "_id" : "27888", "city" : "WALSTONBURG", "loc" : [ -77.698336, 35.588204 ], "pop" : 2649, "state" : "NC" } +{ "_id" : "27889", "city" : "WASHINGTON", "loc" : [ -77.140356, 35.588392 ], "pop" : 865, "state" : "NC" } +{ "_id" : "27890", "city" : "WELDON", "loc" : [ -77.60346, 36.420643 ], "pop" : 2819, "state" : "NC" } +{ "_id" : "27891", "city" : "WHITAKERS", "loc" : [ -77.71674299999999, 36.075797 ], "pop" : 6281, "state" : "NC" } +{ "_id" : "27892", "city" : "WILLIAMSTON", "loc" : [ -77.048344, 35.660154 ], "pop" : 36648, "state" : "NC" } +{ "_id" : "27893", "city" : "WILSON", "loc" : [ -77.92273299999999, 35.727022 ], "pop" : 47823, "state" : "NC" } +{ "_id" : "27897", "city" : "GEORGE", "loc" : [ -77.197782, 36.320465 ], "pop" : 2164, "state" : "NC" } +{ "_id" : "27909", "city" : "ELIZABETH CITY", "loc" : [ -76.24454799999999, 36.295051 ], "pop" : 31298, "state" : "NC" } +{ "_id" : "27910", "city" : "AHOSKIE", "loc" : [ -76.99663200000001, 36.295737 ], "pop" : 11451, "state" : "NC" } +{ "_id" : "27916", "city" : "AYDLETT", "loc" : [ -75.902914, 36.304469 ], "pop" : 356, "state" : "NC" } +{ "_id" : "27917", "city" : "BARCO", "loc" : [ -75.97928400000001, 36.358778 ], "pop" : 1031, "state" : "NC" } +{ "_id" : "27919", "city" : "BELVIDERE", "loc" : [ -76.543586, 36.309644 ], "pop" : 1614, "state" : "NC" } +{ "_id" : "27921", "city" : "CAMDEN", "loc" : [ -76.150002, 36.324985 ], "pop" : 2439, "state" : "NC" } +{ "_id" : "27922", "city" : "COFIELD", "loc" : [ -76.874568, 36.333316 ], "pop" : 661, "state" : "NC" } +{ "_id" : "27923", "city" : "COINJOCK", "loc" : [ -75.934012, 36.375064 ], "pop" : 434, "state" : "NC" } +{ "_id" : "27924", "city" : "COLERAIN", "loc" : [ -76.854799, 36.190083 ], "pop" : 3709, "state" : "NC" } +{ "_id" : "27925", "city" : "COLUMBIA", "loc" : [ -76.234481, 35.905664 ], "pop" : 3650, "state" : "NC" } +{ "_id" : "27926", "city" : "CORAPEAKE", "loc" : [ -76.597852, 36.517946 ], "pop" : 1377, "state" : "NC" } +{ "_id" : "27927", "city" : "COROLLA", "loc" : [ -75.81321699999999, 36.320646 ], "pop" : 288, "state" : "NC" } +{ "_id" : "27928", "city" : "CRESWELL", "loc" : [ -76.419555, 35.865303 ], "pop" : 2287, "state" : "NC" } +{ "_id" : "27929", "city" : "CURRITUCK", "loc" : [ -75.988399, 36.429691 ], "pop" : 498, "state" : "NC" } +{ "_id" : "27932", "city" : "EDENTON", "loc" : [ -76.622384, 36.090777 ], "pop" : 11572, "state" : "NC" } +{ "_id" : "27935", "city" : "EURE", "loc" : [ -76.846341, 36.434117 ], "pop" : 1346, "state" : "NC" } +{ "_id" : "27937", "city" : "GATES", "loc" : [ -76.764563, 36.503618 ], "pop" : 2598, "state" : "NC" } +{ "_id" : "27938", "city" : "GATESVILLE", "loc" : [ -76.732462, 36.407171 ], "pop" : 1398, "state" : "NC" } +{ "_id" : "27939", "city" : "GRANDY", "loc" : [ -75.876808, 36.233889 ], "pop" : 908, "state" : "NC" } +{ "_id" : "27941", "city" : "HARBINGER", "loc" : [ -75.81214300000001, 36.086392 ], "pop" : 189, "state" : "NC" } +{ "_id" : "27942", "city" : "HARRELLSVILLE", "loc" : [ -76.77667700000001, 36.286586 ], "pop" : 1046, "state" : "NC" } +{ "_id" : "27944", "city" : "DURANTS NECK", "loc" : [ -76.424299, 36.177058 ], "pop" : 9357, "state" : "NC" } +{ "_id" : "27946", "city" : "HOBBSVILLE", "loc" : [ -76.617813, 36.354303 ], "pop" : 722, "state" : "NC" } +{ "_id" : "27947", "city" : "JARVISBURG", "loc" : [ -75.859469, 36.173963 ], "pop" : 653, "state" : "NC" } +{ "_id" : "27948", "city" : "KILL DEVIL HILLS", "loc" : [ -75.67565399999999, 36.008793 ], "pop" : 7870, "state" : "NC" } +{ "_id" : "27949", "city" : "SOUTHERN SHORES", "loc" : [ -75.725373, 36.100694 ], "pop" : 4046, "state" : "NC" } +{ "_id" : "27950", "city" : "KNOTTS ISLAND", "loc" : [ -75.970247, 36.523167 ], "pop" : 1493, "state" : "NC" } +{ "_id" : "27953", "city" : "EAST LAKE", "loc" : [ -75.94440400000001, 35.887191 ], "pop" : 139, "state" : "NC" } +{ "_id" : "27954", "city" : "MANTEO", "loc" : [ -75.671418, 35.894774 ], "pop" : 5726, "state" : "NC" } +{ "_id" : "27956", "city" : "MAPLE", "loc" : [ -76.003874, 36.398686 ], "pop" : 321, "state" : "NC" } +{ "_id" : "27957", "city" : "MERRY HILL", "loc" : [ -76.77755999999999, 36.087121 ], "pop" : 1187, "state" : "NC" } +{ "_id" : "27958", "city" : "MOYOCK", "loc" : [ -76.114575, 36.487094 ], "pop" : 5475, "state" : "NC" } +{ "_id" : "27959", "city" : "NAGS HEAD", "loc" : [ -75.567592, 35.347209 ], "pop" : 4085, "state" : "NC" } +{ "_id" : "27962", "city" : "PLYMOUTH", "loc" : [ -76.74314800000001, 35.850826 ], "pop" : 7951, "state" : "NC" } +{ "_id" : "27964", "city" : "POINT HARBOR", "loc" : [ -75.79828500000001, 36.078114 ], "pop" : 65, "state" : "NC" } +{ "_id" : "27965", "city" : "POPLAR BRANCH", "loc" : [ -75.88301800000001, 36.257028 ], "pop" : 733, "state" : "NC" } +{ "_id" : "27966", "city" : "POWELLS POINT", "loc" : [ -75.827314, 36.120674 ], "pop" : 959, "state" : "NC" } +{ "_id" : "27970", "city" : "ROPER", "loc" : [ -76.580918, 35.899413 ], "pop" : 3869, "state" : "NC" } +{ "_id" : "27973", "city" : "SHAWBORO", "loc" : [ -76.09445100000001, 36.377875 ], "pop" : 333, "state" : "NC" } +{ "_id" : "27974", "city" : "SHILOH", "loc" : [ -76.04316799999999, 36.258449 ], "pop" : 1378, "state" : "NC" } +{ "_id" : "27976", "city" : "SOUTH MILLS", "loc" : [ -76.303284, 36.453576 ], "pop" : 2087, "state" : "NC" } +{ "_id" : "27978", "city" : "STUMPY POINT", "loc" : [ -75.77909, 35.863007 ], "pop" : 880, "state" : "NC" } +{ "_id" : "27979", "city" : "SUNBURY", "loc" : [ -76.609568, 36.431605 ], "pop" : 1711, "state" : "NC" } +{ "_id" : "27980", "city" : "TYNER", "loc" : [ -76.642796, 36.250239 ], "pop" : 1563, "state" : "NC" } +{ "_id" : "27983", "city" : "WINDSOR", "loc" : [ -76.933612, 36.015881 ], "pop" : 9205, "state" : "NC" } +{ "_id" : "27986", "city" : "WINTON", "loc" : [ -76.936007, 36.382616 ], "pop" : 1443, "state" : "NC" } +{ "_id" : "28001", "city" : "ALBEMARLE", "loc" : [ -80.204363, 35.357276 ], "pop" : 26329, "state" : "NC" } +{ "_id" : "28006", "city" : "ALEXIS", "loc" : [ -81.102204, 35.383613 ], "pop" : 4724, "state" : "NC" } +{ "_id" : "28012", "city" : "BELMONT", "loc" : [ -81.044016, 35.244029 ], "pop" : 19504, "state" : "NC" } +{ "_id" : "28016", "city" : "BESSEMER CITY", "loc" : [ -81.28635, 35.284904 ], "pop" : 8858, "state" : "NC" } +{ "_id" : "28018", "city" : "BOSTIC", "loc" : [ -81.81183, 35.453259 ], "pop" : 3094, "state" : "NC" } +{ "_id" : "28020", "city" : "CASAR", "loc" : [ -81.63574199999999, 35.514496 ], "pop" : 1646, "state" : "NC" } +{ "_id" : "28021", "city" : "CHERRYVILLE", "loc" : [ -81.350893, 35.374742 ], "pop" : 16445, "state" : "NC" } +{ "_id" : "28023", "city" : "CHINA GROVE", "loc" : [ -80.59004, 35.5669 ], "pop" : 13040, "state" : "NC" } +{ "_id" : "28025", "city" : "CONCORD", "loc" : [ -80.530027, 35.371614 ], "pop" : 15094, "state" : "NC" } +{ "_id" : "28027", "city" : "CONCORD", "loc" : [ -80.61622699999999, 35.414115 ], "pop" : 39900, "state" : "NC" } +{ "_id" : "28032", "city" : "CRAMERTON", "loc" : [ -81.083061, 35.23965 ], "pop" : 2835, "state" : "NC" } +{ "_id" : "28033", "city" : "CROUSE", "loc" : [ -81.34185100000001, 35.483722 ], "pop" : 5431, "state" : "NC" } +{ "_id" : "28034", "city" : "DALLAS", "loc" : [ -81.1862, 35.334853 ], "pop" : 13328, "state" : "NC" } +{ "_id" : "28036", "city" : "CORNELIUS", "loc" : [ -80.857229, 35.495692 ], "pop" : 7301, "state" : "NC" } +{ "_id" : "28037", "city" : "DENVER", "loc" : [ -80.989785, 35.483677 ], "pop" : 6776, "state" : "NC" } +{ "_id" : "28040", "city" : "ELLENBORO", "loc" : [ -81.770652, 35.334426 ], "pop" : 8287, "state" : "NC" } +{ "_id" : "28043", "city" : "ALEXANDER MILLS", "loc" : [ -81.86424700000001, 35.301753 ], "pop" : 25940, "state" : "NC" } +{ "_id" : "28052", "city" : "GASTONIA", "loc" : [ -81.219449, 35.244917 ], "pop" : 37403, "state" : "NC" } +{ "_id" : "28054", "city" : "GASTONIA", "loc" : [ -81.145409, 35.200537 ], "pop" : 15997, "state" : "NC" } +{ "_id" : "28056", "city" : "GASTONIA", "loc" : [ -81.14962199999999, 35.258331 ], "pop" : 33472, "state" : "NC" } +{ "_id" : "28071", "city" : "GOLD HILL", "loc" : [ -80.334558, 35.549784 ], "pop" : 977, "state" : "NC" } +{ "_id" : "28073", "city" : "GROVER", "loc" : [ -81.45518199999999, 35.183639 ], "pop" : 2011, "state" : "NC" } +{ "_id" : "28075", "city" : "HARRISBURG", "loc" : [ -80.659401, 35.324731 ], "pop" : 8810, "state" : "NC" } +{ "_id" : "28078", "city" : "CORNELIUS", "loc" : [ -80.864664, 35.421992 ], "pop" : 15259, "state" : "NC" } +{ "_id" : "28079", "city" : "INDIAN TRAIL", "loc" : [ -80.65974300000001, 35.08307 ], "pop" : 13274, "state" : "NC" } +{ "_id" : "28080", "city" : "IRON STATION", "loc" : [ -81.10700900000001, 35.465654 ], "pop" : 9616, "state" : "NC" } +{ "_id" : "28081", "city" : "KANNAPOLIS", "loc" : [ -80.635875, 35.502016 ], "pop" : 25583, "state" : "NC" } +{ "_id" : "28083", "city" : "KANNAPOLIS", "loc" : [ -80.601536, 35.484807 ], "pop" : 14113, "state" : "NC" } +{ "_id" : "28086", "city" : "KINGS MOUNTAIN", "loc" : [ -81.380567, 35.251578 ], "pop" : 21012, "state" : "NC" } +{ "_id" : "28088", "city" : "LANDIS", "loc" : [ -80.612926, 35.5435 ], "pop" : 2651, "state" : "NC" } +{ "_id" : "28090", "city" : "LAWNDALE", "loc" : [ -81.533625, 35.444932 ], "pop" : 6842, "state" : "NC" } +{ "_id" : "28091", "city" : "LILESVILLE", "loc" : [ -79.97208000000001, 34.968914 ], "pop" : 2923, "state" : "NC" } +{ "_id" : "28092", "city" : "BOGER CITY", "loc" : [ -81.228039, 35.482138 ], "pop" : 24325, "state" : "NC" } +{ "_id" : "28097", "city" : "LOCUST", "loc" : [ -80.42106099999999, 35.270416 ], "pop" : 3077, "state" : "NC" } +{ "_id" : "28098", "city" : "LOWELL", "loc" : [ -81.096037, 35.265481 ], "pop" : 3424, "state" : "NC" } +{ "_id" : "28103", "city" : "MARSHVILLE", "loc" : [ -80.378113, 35.016684 ], "pop" : 7900, "state" : "NC" } +{ "_id" : "28105", "city" : "STALLINGS", "loc" : [ -80.713568, 35.121879 ], "pop" : 18586, "state" : "NC" } +{ "_id" : "28107", "city" : "MIDLAND", "loc" : [ -80.531853, 35.247724 ], "pop" : 4012, "state" : "NC" } +{ "_id" : "28110", "city" : "MONROE", "loc" : [ -80.53722999999999, 35.017775 ], "pop" : 34880, "state" : "NC" } +{ "_id" : "28112", "city" : "MONROE", "loc" : [ -80.553952, 34.894621 ], "pop" : 9986, "state" : "NC" } +{ "_id" : "28114", "city" : "MOORESBORO", "loc" : [ -81.67217100000001, 35.248389 ], "pop" : 7554, "state" : "NC" } +{ "_id" : "28115", "city" : "MOORESVILLE", "loc" : [ -80.82262900000001, 35.577358 ], "pop" : 28805, "state" : "NC" } +{ "_id" : "28119", "city" : "MORVEN", "loc" : [ -80.002529, 34.85106 ], "pop" : 1808, "state" : "NC" } +{ "_id" : "28120", "city" : "MOUNT HOLLY", "loc" : [ -81.030567, 35.311872 ], "pop" : 14505, "state" : "NC" } +{ "_id" : "28124", "city" : "MOUNT PLEASANT", "loc" : [ -80.417081, 35.414576 ], "pop" : 4640, "state" : "NC" } +{ "_id" : "28125", "city" : "MOUNT ULLA", "loc" : [ -80.72386, 35.638934 ], "pop" : 683, "state" : "NC" } +{ "_id" : "28127", "city" : "NEW LONDON", "loc" : [ -80.205737, 35.428518 ], "pop" : 5156, "state" : "NC" } +{ "_id" : "28128", "city" : "NORWOOD", "loc" : [ -80.14326, 35.227493 ], "pop" : 7069, "state" : "NC" } +{ "_id" : "28129", "city" : "OAKBORO", "loc" : [ -80.341272, 35.245997 ], "pop" : 6336, "state" : "NC" } +{ "_id" : "28133", "city" : "PEACHLAND", "loc" : [ -80.282943, 35.005434 ], "pop" : 3310, "state" : "NC" } +{ "_id" : "28134", "city" : "PINEVILLE", "loc" : [ -80.885852, 35.070942 ], "pop" : 4457, "state" : "NC" } +{ "_id" : "28135", "city" : "POLKTON", "loc" : [ -80.153812, 34.982288 ], "pop" : 6679, "state" : "NC" } +{ "_id" : "28137", "city" : "RICHFIELD", "loc" : [ -80.267135, 35.511035 ], "pop" : 2307, "state" : "NC" } +{ "_id" : "28138", "city" : "ROCKWELL", "loc" : [ -80.422568, 35.549437 ], "pop" : 8739, "state" : "NC" } +{ "_id" : "28139", "city" : "RUTHERFORDTON", "loc" : [ -81.97810699999999, 35.37058 ], "pop" : 10091, "state" : "NC" } +{ "_id" : "28144", "city" : "SALISBURY", "loc" : [ -80.488945, 35.651498 ], "pop" : 34563, "state" : "NC" } +{ "_id" : "28146", "city" : "SALISBURY", "loc" : [ -80.46569, 35.667564 ], "pop" : 23261, "state" : "NC" } +{ "_id" : "28150", "city" : "KINGSTOWN", "loc" : [ -81.58157300000001, 35.347075 ], "pop" : 13326, "state" : "NC" } +{ "_id" : "28152", "city" : "SHELBY", "loc" : [ -81.53367299999999, 35.268889 ], "pop" : 31162, "state" : "NC" } +{ "_id" : "28159", "city" : "SPENCER", "loc" : [ -80.431049, 35.695312 ], "pop" : 4083, "state" : "NC" } +{ "_id" : "28160", "city" : "SPINDALE", "loc" : [ -81.92514199999999, 35.360131 ], "pop" : 4017, "state" : "NC" } +{ "_id" : "28163", "city" : "STANFIELD", "loc" : [ -80.44067200000001, 35.21061 ], "pop" : 2436, "state" : "NC" } +{ "_id" : "28164", "city" : "STANLEY", "loc" : [ -81.095921, 35.351565 ], "pop" : 6510, "state" : "NC" } +{ "_id" : "28166", "city" : "TROUTMAN", "loc" : [ -80.882229, 35.686271 ], "pop" : 5013, "state" : "NC" } +{ "_id" : "28167", "city" : "UNION MILLS", "loc" : [ -81.96845999999999, 35.47324 ], "pop" : 3731, "state" : "NC" } +{ "_id" : "28168", "city" : "VALE", "loc" : [ -81.458887, 35.518796 ], "pop" : 3422, "state" : "NC" } +{ "_id" : "28170", "city" : "WADESBORO", "loc" : [ -80.069586, 34.980938 ], "pop" : 9765, "state" : "NC" } +{ "_id" : "28173", "city" : "WEDDINGTON", "loc" : [ -80.727901, 34.955334 ], "pop" : 14423, "state" : "NC" } +{ "_id" : "28174", "city" : "WINGATE", "loc" : [ -80.44759500000001, 34.984666 ], "pop" : 2747, "state" : "NC" } +{ "_id" : "28202", "city" : "CHARLOTTE", "loc" : [ -80.841864, 35.229002 ], "pop" : 5143, "state" : "NC" } +{ "_id" : "28203", "city" : "CHARLOTTE", "loc" : [ -80.858279, 35.208139 ], "pop" : 10274, "state" : "NC" } +{ "_id" : "28204", "city" : "CHARLOTTE", "loc" : [ -80.823149, 35.213178 ], "pop" : 6114, "state" : "NC" } +{ "_id" : "28205", "city" : "CHARLOTTE", "loc" : [ -80.788129, 35.219951 ], "pop" : 44092, "state" : "NC" } +{ "_id" : "28206", "city" : "CHARLOTTE", "loc" : [ -80.826505, 35.252173 ], "pop" : 13051, "state" : "NC" } +{ "_id" : "28207", "city" : "CHARLOTTE", "loc" : [ -80.827248, 35.193474 ], "pop" : 7921, "state" : "NC" } +{ "_id" : "28208", "city" : "CHARLOTTE", "loc" : [ -80.89635199999999, 35.235795 ], "pop" : 38236, "state" : "NC" } +{ "_id" : "28209", "city" : "CHARLOTTE", "loc" : [ -80.855926, 35.179629 ], "pop" : 18190, "state" : "NC" } +{ "_id" : "28210", "city" : "CHARLOTTE", "loc" : [ -80.857749, 35.131586 ], "pop" : 35211, "state" : "NC" } +{ "_id" : "28211", "city" : "CHARLOTTE", "loc" : [ -80.793244, 35.167653 ], "pop" : 25478, "state" : "NC" } +{ "_id" : "28212", "city" : "CHARLOTTE", "loc" : [ -80.744777, 35.190797 ], "pop" : 30347, "state" : "NC" } +{ "_id" : "28213", "city" : "CHARLOTTE", "loc" : [ -80.750079, 35.317868 ], "pop" : 20336, "state" : "NC" } +{ "_id" : "28214", "city" : "CHARLOTTE", "loc" : [ -80.95708999999999, 35.273095 ], "pop" : 16852, "state" : "NC" } +{ "_id" : "28215", "city" : "CHARLOTTE", "loc" : [ -80.738669, 35.243962 ], "pop" : 27936, "state" : "NC" } +{ "_id" : "28216", "city" : "CHARLOTTE", "loc" : [ -80.870216, 35.283377 ], "pop" : 22464, "state" : "NC" } +{ "_id" : "28217", "city" : "CHARLOTTE", "loc" : [ -81.007848, 35.0972 ], "pop" : 2795, "state" : "NC" } +{ "_id" : "28226", "city" : "CHARLOTTE", "loc" : [ -80.816675, 35.086856 ], "pop" : 41260, "state" : "NC" } +{ "_id" : "28227", "city" : "CHARLOTTE", "loc" : [ -80.684634, 35.193612 ], "pop" : 33273, "state" : "NC" } +{ "_id" : "28262", "city" : "CHARLOTTE", "loc" : [ -80.775958, 35.272506 ], "pop" : 15114, "state" : "NC" } +{ "_id" : "28269", "city" : "CHARLOTTE", "loc" : [ -80.820941, 35.288635 ], "pop" : 6659, "state" : "NC" } +{ "_id" : "28270", "city" : "CHARLOTTE", "loc" : [ -80.76687200000001, 35.135473 ], "pop" : 13791, "state" : "NC" } +{ "_id" : "28273", "city" : "CHARLOTTE", "loc" : [ -80.89667300000001, 35.159646 ], "pop" : 19148, "state" : "NC" } +{ "_id" : "28277", "city" : "CHARLOTTE", "loc" : [ -80.800174, 35.134486 ], "pop" : 6737, "state" : "NC" } +{ "_id" : "28278", "city" : "CHARLOTTE", "loc" : [ -80.960421, 35.146685 ], "pop" : 5411, "state" : "NC" } +{ "_id" : "28301", "city" : "EAST FAYETTEVILL", "loc" : [ -78.84225499999999, 35.05099 ], "pop" : 35253, "state" : "NC" } +{ "_id" : "28303", "city" : "BONNIE DOONE", "loc" : [ -78.96013499999999, 35.084046 ], "pop" : 35745, "state" : "NC" } +{ "_id" : "28304", "city" : "FAYETTEVILLE", "loc" : [ -78.970494, 35.025683 ], "pop" : 33868, "state" : "NC" } +{ "_id" : "28305", "city" : "FAYETTEVILLE", "loc" : [ -78.904658, 35.056022 ], "pop" : 6670, "state" : "NC" } +{ "_id" : "28306", "city" : "FAYETTEVILLE", "loc" : [ -78.936408, 35.001874 ], "pop" : 20122, "state" : "NC" } +{ "_id" : "28307", "city" : "FORT BRAGG", "loc" : [ -79.00245700000001, 35.141649 ], "pop" : 37688, "state" : "NC" } +{ "_id" : "28311", "city" : "FAYETTEVILLE", "loc" : [ -78.898217, 35.129416 ], "pop" : 29497, "state" : "NC" } +{ "_id" : "28314", "city" : "FAYETTEVILLE", "loc" : [ -79.00798500000001, 35.058322 ], "pop" : 34856, "state" : "NC" } +{ "_id" : "28315", "city" : "ABERDEEN", "loc" : [ -79.44503899999999, 35.121641 ], "pop" : 7767, "state" : "NC" } +{ "_id" : "28318", "city" : "AUTRYVILLE", "loc" : [ -78.60211099999999, 35.099673 ], "pop" : 4129, "state" : "NC" } +{ "_id" : "28320", "city" : "BLADENBORO", "loc" : [ -78.779295, 34.565832 ], "pop" : 7957, "state" : "NC" } +{ "_id" : "28323", "city" : "BUNNLEVEL", "loc" : [ -78.855189, 35.281057 ], "pop" : 4749, "state" : "NC" } +{ "_id" : "28326", "city" : "JOHNSONVILLE", "loc" : [ -79.268826, 35.313581 ], "pop" : 1851, "state" : "NC" } +{ "_id" : "28327", "city" : "CARTHAGE", "loc" : [ -79.396939, 35.306066 ], "pop" : 11774, "state" : "NC" } +{ "_id" : "28328", "city" : "CLINTON", "loc" : [ -78.326007, 35.015143 ], "pop" : 17737, "state" : "NC" } +{ "_id" : "28333", "city" : "DUDLEY", "loc" : [ -78.02727400000001, 35.292564 ], "pop" : 8450, "state" : "NC" } +{ "_id" : "28334", "city" : "DUNN", "loc" : [ -78.61507899999999, 35.316511 ], "pop" : 15795, "state" : "NC" } +{ "_id" : "28337", "city" : "ELIZABETHTOWN", "loc" : [ -78.574693, 34.64714 ], "pop" : 10444, "state" : "NC" } +{ "_id" : "28338", "city" : "ELLERBE", "loc" : [ -79.75236099999999, 35.091422 ], "pop" : 4245, "state" : "NC" } +{ "_id" : "28339", "city" : "ERWIN", "loc" : [ -78.685935, 35.328651 ], "pop" : 5574, "state" : "NC" } +{ "_id" : "28340", "city" : "MCDONALD", "loc" : [ -79.128596, 34.481402 ], "pop" : 10978, "state" : "NC" } +{ "_id" : "28341", "city" : "FAISON", "loc" : [ -78.117983, 35.119884 ], "pop" : 2658, "state" : "NC" } +{ "_id" : "28343", "city" : "GIBSON", "loc" : [ -79.583854, 34.754857 ], "pop" : 1638, "state" : "NC" } +{ "_id" : "28344", "city" : "GODWIN", "loc" : [ -78.66247199999999, 35.196919 ], "pop" : 1886, "state" : "NC" } +{ "_id" : "28345", "city" : "HAMLET", "loc" : [ -79.702217, 34.889375 ], "pop" : 13443, "state" : "NC" } +{ "_id" : "28347", "city" : "HOFFMAN", "loc" : [ -79.56002700000001, 35.032607 ], "pop" : 1073, "state" : "NC" } +{ "_id" : "28348", "city" : "HOPE MILLS", "loc" : [ -78.93536400000001, 34.953564 ], "pop" : 18396, "state" : "NC" } +{ "_id" : "28349", "city" : "KENANSVILLE", "loc" : [ -77.967743, 35.039621 ], "pop" : 4998, "state" : "NC" } +{ "_id" : "28351", "city" : "LAUREL HILL", "loc" : [ -79.54913500000001, 34.823831 ], "pop" : 5726, "state" : "NC" } +{ "_id" : "28352", "city" : "LAURINBURG", "loc" : [ -79.467316, 34.759869 ], "pop" : 23387, "state" : "NC" } +{ "_id" : "28356", "city" : "LINDEN", "loc" : [ -78.800361, 35.227645 ], "pop" : 2903, "state" : "NC" } +{ "_id" : "28357", "city" : "LUMBER BRIDGE", "loc" : [ -79.066417, 34.876192 ], "pop" : 1343, "state" : "NC" } +{ "_id" : "28358", "city" : "LUMBERTON", "loc" : [ -79.008309, 34.629301 ], "pop" : 42871, "state" : "NC" } +{ "_id" : "28363", "city" : "MARSTON", "loc" : [ -79.659554, 34.989628 ], "pop" : 963, "state" : "NC" } +{ "_id" : "28364", "city" : "MAXTON", "loc" : [ -79.309725, 34.733435 ], "pop" : 11494, "state" : "NC" } +{ "_id" : "28365", "city" : "MOUNT OLIVE", "loc" : [ -78.09833999999999, 35.210923 ], "pop" : 8636, "state" : "NC" } +{ "_id" : "28366", "city" : "NEWTON GROVE", "loc" : [ -78.42603699999999, 35.221258 ], "pop" : 6775, "state" : "NC" } +{ "_id" : "28369", "city" : "ORRUM", "loc" : [ -79.031037, 34.447347 ], "pop" : 1915, "state" : "NC" } +{ "_id" : "28371", "city" : "PARKTON", "loc" : [ -78.996943, 34.900569 ], "pop" : 2195, "state" : "NC" } +{ "_id" : "28372", "city" : "PEMBROKE", "loc" : [ -79.18337, 34.690198 ], "pop" : 10673, "state" : "NC" } +{ "_id" : "28374", "city" : "PINEHURST", "loc" : [ -79.47319400000001, 35.188408 ], "pop" : 5803, "state" : "NC" } +{ "_id" : "28376", "city" : "RAEFORD", "loc" : [ -79.22275999999999, 34.989009 ], "pop" : 20742, "state" : "NC" } +{ "_id" : "28377", "city" : "RED SPRINGS", "loc" : [ -79.163619, 34.808315 ], "pop" : 8683, "state" : "NC" } +{ "_id" : "28379", "city" : "ROCKINGHAM", "loc" : [ -79.766566, 34.933613 ], "pop" : 24282, "state" : "NC" } +{ "_id" : "28382", "city" : "ROSEBORO", "loc" : [ -78.504109, 34.994081 ], "pop" : 6495, "state" : "NC" } +{ "_id" : "28383", "city" : "ROWLAND", "loc" : [ -79.261843, 34.588664 ], "pop" : 7047, "state" : "NC" } +{ "_id" : "28384", "city" : "SAINT PAULS", "loc" : [ -78.973077, 34.800962 ], "pop" : 7976, "state" : "NC" } +{ "_id" : "28385", "city" : "SALEMBURG", "loc" : [ -78.471385, 35.051459 ], "pop" : 2821, "state" : "NC" } +{ "_id" : "28386", "city" : "SHANNON", "loc" : [ -79.180617, 34.898762 ], "pop" : 2120, "state" : "NC" } +{ "_id" : "28387", "city" : "SOUTHERN PINES", "loc" : [ -79.39568199999999, 35.169747 ], "pop" : 11523, "state" : "NC" } +{ "_id" : "28390", "city" : "SPRING LAKE", "loc" : [ -78.978555, 35.182981 ], "pop" : 11537, "state" : "NC" } +{ "_id" : "28391", "city" : "STEDMAN", "loc" : [ -78.69493199999999, 35.034749 ], "pop" : 4776, "state" : "NC" } +{ "_id" : "28392", "city" : "TAR HEEL", "loc" : [ -78.81341, 34.746541 ], "pop" : 1989, "state" : "NC" } +{ "_id" : "28393", "city" : "TURKEY", "loc" : [ -78.212086, 34.985673 ], "pop" : 3224, "state" : "NC" } +{ "_id" : "28394", "city" : "VASS", "loc" : [ -79.25618900000001, 35.217133 ], "pop" : 3932, "state" : "NC" } +{ "_id" : "28395", "city" : "WADE", "loc" : [ -78.724929, 35.160559 ], "pop" : 1369, "state" : "NC" } +{ "_id" : "28396", "city" : "WAGRAM", "loc" : [ -79.39594, 34.904432 ], "pop" : 3007, "state" : "NC" } +{ "_id" : "28398", "city" : "BOWDENS", "loc" : [ -78.08673899999999, 34.99818 ], "pop" : 5817, "state" : "NC" } +{ "_id" : "28399", "city" : "WHITE OAK", "loc" : [ -78.73014000000001, 34.766206 ], "pop" : 1292, "state" : "NC" } +{ "_id" : "28401", "city" : "CAPE FEAR", "loc" : [ -77.937856, 34.225304 ], "pop" : 21522, "state" : "NC" } +{ "_id" : "28403", "city" : "WILMINGTON", "loc" : [ -77.886213, 34.223653 ], "pop" : 25319, "state" : "NC" } +{ "_id" : "28405", "city" : "OGDEN", "loc" : [ -77.852937, 34.264065 ], "pop" : 26744, "state" : "NC" } +{ "_id" : "28409", "city" : "WILMINGTON", "loc" : [ -77.87227, 34.166256 ], "pop" : 17418, "state" : "NC" } +{ "_id" : "28412", "city" : "WILMINGTON", "loc" : [ -77.914137, 34.157173 ], "pop" : 13932, "state" : "NC" } +{ "_id" : "28420", "city" : "ASH", "loc" : [ -78.50563699999999, 34.065871 ], "pop" : 2212, "state" : "NC" } +{ "_id" : "28421", "city" : "ATKINSON", "loc" : [ -78.167108, 34.530445 ], "pop" : 1418, "state" : "NC" } +{ "_id" : "28422", "city" : "BOLIVIA", "loc" : [ -78.16813999999999, 34.025962 ], "pop" : 3392, "state" : "NC" } +{ "_id" : "28423", "city" : "BOLTON", "loc" : [ -78.337177, 34.309085 ], "pop" : 3071, "state" : "NC" } +{ "_id" : "28425", "city" : "BURGAW", "loc" : [ -77.94031699999999, 34.548679 ], "pop" : 6405, "state" : "NC" } +{ "_id" : "28428", "city" : "CAROLINA BEACH", "loc" : [ -77.896289, 34.036599 ], "pop" : 4524, "state" : "NC" } +{ "_id" : "28429", "city" : "CASTLE HAYNE", "loc" : [ -77.91085, 34.323596 ], "pop" : 7329, "state" : "NC" } +{ "_id" : "28430", "city" : "CERRO GORDO", "loc" : [ -78.921571, 34.302483 ], "pop" : 1742, "state" : "NC" } +{ "_id" : "28431", "city" : "CHADBOURN", "loc" : [ -78.826683, 34.322303 ], "pop" : 2015, "state" : "NC" } +{ "_id" : "28432", "city" : "CLARENDON", "loc" : [ -78.788844, 34.199517 ], "pop" : 3940, "state" : "NC" } +{ "_id" : "28433", "city" : "CLARKTON", "loc" : [ -78.631271, 34.503011 ], "pop" : 3493, "state" : "NC" } +{ "_id" : "28434", "city" : "COUNCIL", "loc" : [ -78.411511, 34.429042 ], "pop" : 2768, "state" : "NC" } +{ "_id" : "28435", "city" : "CURRIE", "loc" : [ -78.092516, 34.449668 ], "pop" : 2094, "state" : "NC" } +{ "_id" : "28436", "city" : "DELCO", "loc" : [ -78.19168999999999, 34.327419 ], "pop" : 229, "state" : "NC" } +{ "_id" : "28438", "city" : "EVERGREEN", "loc" : [ -78.884638, 34.375234 ], "pop" : 3906, "state" : "NC" } +{ "_id" : "28439", "city" : "FAIR BLUFF", "loc" : [ -79.01750199999999, 34.302275 ], "pop" : 1931, "state" : "NC" } +{ "_id" : "28441", "city" : "GARLAND", "loc" : [ -78.34142, 34.822906 ], "pop" : 4133, "state" : "NC" } +{ "_id" : "28442", "city" : "HALLSBORO", "loc" : [ -78.60427199999999, 34.318087 ], "pop" : 2551, "state" : "NC" } +{ "_id" : "28443", "city" : "HAMPSTEAD", "loc" : [ -77.662808, 34.3879 ], "pop" : 8159, "state" : "NC" } +{ "_id" : "28444", "city" : "HARRELLS", "loc" : [ -78.24297300000001, 34.676918 ], "pop" : 1635, "state" : "NC" } +{ "_id" : "28445", "city" : "SURF CITY", "loc" : [ -77.51005000000001, 34.4644 ], "pop" : 1279, "state" : "NC" } +{ "_id" : "28447", "city" : "IVANHOE", "loc" : [ -78.162333, 34.697169 ], "pop" : 352, "state" : "NC" } +{ "_id" : "28448", "city" : "KELLY", "loc" : [ -78.294161, 34.459064 ], "pop" : 723, "state" : "NC" } +{ "_id" : "28449", "city" : "KURE BEACH", "loc" : [ -77.909875, 33.992707 ], "pop" : 568, "state" : "NC" } +{ "_id" : "28450", "city" : "LAKE WACCAMAW", "loc" : [ -78.51020800000001, 34.339359 ], "pop" : 1941, "state" : "NC" } +{ "_id" : "28451", "city" : "LELAND", "loc" : [ -78.05781500000001, 34.267952 ], "pop" : 7803, "state" : "NC" } +{ "_id" : "28452", "city" : "LONGWOOD", "loc" : [ -78.531531, 33.950059 ], "pop" : 1913, "state" : "NC" } +{ "_id" : "28453", "city" : "MAGNOLIA", "loc" : [ -78.04321299999999, 34.895702 ], "pop" : 2056, "state" : "NC" } +{ "_id" : "28454", "city" : "MAPLE HILL", "loc" : [ -77.736588, 34.617753 ], "pop" : 2095, "state" : "NC" } +{ "_id" : "28455", "city" : "NAKINA", "loc" : [ -78.657005, 34.115293 ], "pop" : 1581, "state" : "NC" } +{ "_id" : "28456", "city" : "RIEGELWOOD", "loc" : [ -78.257473, 34.34706 ], "pop" : 2038, "state" : "NC" } +{ "_id" : "28457", "city" : "ROCKY POINT", "loc" : [ -77.92344799999999, 34.434418 ], "pop" : 4657, "state" : "NC" } +{ "_id" : "28458", "city" : "ROSE HILL", "loc" : [ -78.01662399999999, 34.823462 ], "pop" : 4421, "state" : "NC" } +{ "_id" : "28459", "city" : "SHALLOTTE", "loc" : [ -78.41068, 33.943011 ], "pop" : 6537, "state" : "NC" } +{ "_id" : "28460", "city" : "SNEADS FERRY", "loc" : [ -77.403801, 34.542589 ], "pop" : 4586, "state" : "NC" } +{ "_id" : "28461", "city" : "BOILING SPRING L", "loc" : [ -78.045551, 34.012137 ], "pop" : 8878, "state" : "NC" } +{ "_id" : "28462", "city" : "HOLDEN BEACH", "loc" : [ -78.29608899999999, 33.962504 ], "pop" : 7513, "state" : "NC" } +{ "_id" : "28463", "city" : "TABOR CITY", "loc" : [ -78.823178, 34.123314 ], "pop" : 6573, "state" : "NC" } +{ "_id" : "28464", "city" : "TEACHEY", "loc" : [ -78.022091, 34.770036 ], "pop" : 1461, "state" : "NC" } +{ "_id" : "28465", "city" : "OAK ISLAND", "loc" : [ -78.125455, 33.916122 ], "pop" : 4752, "state" : "NC" } +{ "_id" : "28466", "city" : "WALLACE", "loc" : [ -77.942922, 34.754166 ], "pop" : 7328, "state" : "NC" } +{ "_id" : "28467", "city" : "CALABASH", "loc" : [ -78.574406, 33.904668 ], "pop" : 3061, "state" : "NC" } +{ "_id" : "28468", "city" : "SUNSET BEACH", "loc" : [ -78.519955, 33.883569 ], "pop" : 1347, "state" : "NC" } +{ "_id" : "28469", "city" : "OCEAN ISLE BEACH", "loc" : [ -78.429849, 33.891271 ], "pop" : 493, "state" : "NC" } +{ "_id" : "28471", "city" : "WATHA", "loc" : [ -78.007351, 34.620725 ], "pop" : 1327, "state" : "NC" } +{ "_id" : "28472", "city" : "WHITEVILLE", "loc" : [ -78.716048, 34.324142 ], "pop" : 18066, "state" : "NC" } +{ "_id" : "28478", "city" : "WILLARD", "loc" : [ -78.023445, 34.684451 ], "pop" : 2456, "state" : "NC" } +{ "_id" : "28479", "city" : "WINNABOW", "loc" : [ -78.056211, 34.214511 ], "pop" : 3084, "state" : "NC" } +{ "_id" : "28480", "city" : "WRIGHTSVILLE BEA", "loc" : [ -77.79816599999999, 34.212228 ], "pop" : 2928, "state" : "NC" } +{ "_id" : "28501", "city" : "KINSTON", "loc" : [ -77.58596900000001, 35.278333 ], "pop" : 44135, "state" : "NC" } +{ "_id" : "28508", "city" : "ALBERTSON", "loc" : [ -77.851517, 35.117647 ], "pop" : 2644, "state" : "NC" } +{ "_id" : "28510", "city" : "ARAPAHOE", "loc" : [ -76.814909, 35.0055 ], "pop" : 1378, "state" : "NC" } +{ "_id" : "28511", "city" : "ATLANTIC", "loc" : [ -76.352097, 34.888827 ], "pop" : 808, "state" : "NC" } +{ "_id" : "28512", "city" : "PINE KNOLL SHORE", "loc" : [ -76.815163, 34.697295 ], "pop" : 1441, "state" : "NC" } +{ "_id" : "28513", "city" : "AYDEN", "loc" : [ -77.40512699999999, 35.456471 ], "pop" : 8831, "state" : "NC" } +{ "_id" : "28515", "city" : "BAYBORO", "loc" : [ -76.75179300000001, 35.152598 ], "pop" : 1853, "state" : "NC" } +{ "_id" : "28516", "city" : "BEAUFORT", "loc" : [ -76.622834, 34.758037 ], "pop" : 10606, "state" : "NC" } +{ "_id" : "28518", "city" : "BEULAVILLE", "loc" : [ -77.769655, 34.933962 ], "pop" : 7278, "state" : "NC" } +{ "_id" : "28520", "city" : "CEDAR ISLAND", "loc" : [ -76.08049, 35.074881 ], "pop" : 1029, "state" : "NC" } +{ "_id" : "28521", "city" : "CHINQUAPIN", "loc" : [ -77.76357299999999, 34.827609 ], "pop" : 1334, "state" : "NC" } +{ "_id" : "28523", "city" : "COVE CITY", "loc" : [ -77.296306, 35.202274 ], "pop" : 2007, "state" : "NC" } +{ "_id" : "28525", "city" : "DEEP RUN", "loc" : [ -77.69275, 35.162991 ], "pop" : 4252, "state" : "NC" } +{ "_id" : "28526", "city" : "DOVER", "loc" : [ -77.372688, 35.262652 ], "pop" : 2198, "state" : "NC" } +{ "_id" : "28527", "city" : "ERNUL", "loc" : [ -77.050164, 35.254693 ], "pop" : 303, "state" : "NC" } +{ "_id" : "28528", "city" : "GLOUCESTER", "loc" : [ -76.527627, 34.685645 ], "pop" : 0, "state" : "NC" } +{ "_id" : "28529", "city" : "GRANTSBORO", "loc" : [ -76.884387, 35.122186 ], "pop" : 3485, "state" : "NC" } +{ "_id" : "28530", "city" : "GRIFTON", "loc" : [ -77.41930000000001, 35.375681 ], "pop" : 3029, "state" : "NC" } +{ "_id" : "28531", "city" : "HARKERS ISLAND", "loc" : [ -76.558301, 34.69663 ], "pop" : 1761, "state" : "NC" } +{ "_id" : "28532", "city" : "HAVELOCK", "loc" : [ -76.89004199999999, 34.896753 ], "pop" : 25957, "state" : "NC" } +{ "_id" : "28537", "city" : "HOBUCKEN", "loc" : [ -76.569602, 35.251838 ], "pop" : 323, "state" : "NC" } +{ "_id" : "28538", "city" : "HOOKERTON", "loc" : [ -77.565555, 35.437976 ], "pop" : 2112, "state" : "NC" } +{ "_id" : "28539", "city" : "HUBERT", "loc" : [ -77.207928, 34.69929 ], "pop" : 8527, "state" : "NC" } +{ "_id" : "28540", "city" : "JACKSONVILLE", "loc" : [ -77.46281500000001, 34.737456 ], "pop" : 52792, "state" : "NC" } +{ "_id" : "28542", "city" : "CAMP LEJEUNE", "loc" : [ -77.3373, 34.665806 ], "pop" : 23717, "state" : "NC" } +{ "_id" : "28543", "city" : "TARAWA TERRACE", "loc" : [ -77.38311400000001, 34.73542 ], "pop" : 11054, "state" : "NC" } +{ "_id" : "28544", "city" : "MIDWAY PARK", "loc" : [ -77.320001, 34.726994 ], "pop" : 6799, "state" : "NC" } +{ "_id" : "28546", "city" : "JACKSONVILLE", "loc" : [ -77.378097, 34.77401 ], "pop" : 27976, "state" : "NC" } +{ "_id" : "28551", "city" : "LA GRANGE", "loc" : [ -77.76862, 35.305381 ], "pop" : 6686, "state" : "NC" } +{ "_id" : "28552", "city" : "LOWLAND", "loc" : [ -76.57769999999999, 35.305955 ], "pop" : 367, "state" : "NC" } +{ "_id" : "28553", "city" : "MARSHALLBERG", "loc" : [ -76.517323, 34.726472 ], "pop" : 565, "state" : "NC" } +{ "_id" : "28555", "city" : "MAYSVILLE", "loc" : [ -77.23145599999999, 34.869077 ], "pop" : 3899, "state" : "NC" } +{ "_id" : "28556", "city" : "MERRITT", "loc" : [ -76.69940099999999, 35.1228 ], "pop" : 1146, "state" : "NC" } +{ "_id" : "28557", "city" : "MOREHEAD CITY", "loc" : [ -76.753069, 34.72532 ], "pop" : 13985, "state" : "NC" } +{ "_id" : "28560", "city" : "NEW BERN", "loc" : [ -77.03194499999999, 35.101941 ], "pop" : 24585, "state" : "NC" } +{ "_id" : "28562", "city" : "NEW BERN", "loc" : [ -77.102874, 35.100434 ], "pop" : 20936, "state" : "NC" } +{ "_id" : "28570", "city" : "NEWPORT", "loc" : [ -76.90694499999999, 34.755076 ], "pop" : 18841, "state" : "NC" } +{ "_id" : "28571", "city" : "ORIENTAL", "loc" : [ -76.701521, 35.036406 ], "pop" : 1985, "state" : "NC" } +{ "_id" : "28572", "city" : "PINK HILL", "loc" : [ -77.712148, 35.066351 ], "pop" : 2201, "state" : "NC" } +{ "_id" : "28573", "city" : "POLLOCKSVILLE", "loc" : [ -77.22872700000001, 35.015105 ], "pop" : 2406, "state" : "NC" } +{ "_id" : "28574", "city" : "RICHLANDS", "loc" : [ -77.586305, 34.862426 ], "pop" : 8868, "state" : "NC" } +{ "_id" : "28577", "city" : "SEALEVEL", "loc" : [ -76.38977800000001, 34.876949 ], "pop" : 521, "state" : "NC" } +{ "_id" : "28578", "city" : "SEVEN SPRINGS", "loc" : [ -77.914621, 35.210466 ], "pop" : 2228, "state" : "NC" } +{ "_id" : "28579", "city" : "SMYRNA", "loc" : [ -76.51531300000001, 34.773384 ], "pop" : 651, "state" : "NC" } +{ "_id" : "28580", "city" : "SNOW HILL", "loc" : [ -77.695565, 35.443848 ], "pop" : 9637, "state" : "NC" } +{ "_id" : "28581", "city" : "STACY", "loc" : [ -76.428877, 34.84124 ], "pop" : 264, "state" : "NC" } +{ "_id" : "28582", "city" : "STELLA", "loc" : [ -77.130807, 34.777672 ], "pop" : 365, "state" : "NC" } +{ "_id" : "28584", "city" : "SWANSBORO", "loc" : [ -77.135013, 34.699066 ], "pop" : 2535, "state" : "NC" } +{ "_id" : "28585", "city" : "TRENTON", "loc" : [ -77.459473, 35.074481 ], "pop" : 5058, "state" : "NC" } +{ "_id" : "28586", "city" : "VANCEBORO", "loc" : [ -77.171618, 35.306255 ], "pop" : 5627, "state" : "NC" } +{ "_id" : "28587", "city" : "VANDEMERE", "loc" : [ -76.657088, 35.195298 ], "pop" : 835, "state" : "NC" } +{ "_id" : "28590", "city" : "WINTERVILLE", "loc" : [ -77.39097, 35.533582 ], "pop" : 8382, "state" : "NC" } +{ "_id" : "28594", "city" : "EMERALD ISLE", "loc" : [ -77.025961, 34.666195 ], "pop" : 2432, "state" : "NC" } +{ "_id" : "28601", "city" : "HICKORY", "loc" : [ -81.328858, 35.75757 ], "pop" : 44977, "state" : "NC" } +{ "_id" : "28602", "city" : "HICKORY", "loc" : [ -81.36122899999999, 35.68837 ], "pop" : 21020, "state" : "NC" } +{ "_id" : "28604", "city" : "BANNER ELK", "loc" : [ -81.841194, 36.170461 ], "pop" : 4570, "state" : "NC" } +{ "_id" : "28605", "city" : "BLOWING ROCK", "loc" : [ -81.750968, 36.094594 ], "pop" : 2372, "state" : "NC" } +{ "_id" : "28606", "city" : "BOOMER", "loc" : [ -81.313704, 36.055192 ], "pop" : 2146, "state" : "NC" } +{ "_id" : "28607", "city" : "BOONE", "loc" : [ -81.666025, 36.214237 ], "pop" : 24897, "state" : "NC" } +{ "_id" : "28609", "city" : "CATAWBA", "loc" : [ -81.050307, 35.675708 ], "pop" : 1767, "state" : "NC" } +{ "_id" : "28610", "city" : "CLAREMONT", "loc" : [ -81.129672, 35.721053 ], "pop" : 8902, "state" : "NC" } +{ "_id" : "28611", "city" : "COLLETTSVILLE", "loc" : [ -81.674188, 35.951946 ], "pop" : 2121, "state" : "NC" } +{ "_id" : "28612", "city" : "CONNELLYS SPRING", "loc" : [ -81.492958, 35.706972 ], "pop" : 15391, "state" : "NC" } +{ "_id" : "28613", "city" : "CONOVER", "loc" : [ -81.216455, 35.731343 ], "pop" : 15222, "state" : "NC" } +{ "_id" : "28615", "city" : "CRESTON", "loc" : [ -81.65062399999999, 36.449959 ], "pop" : 2527, "state" : "NC" } +{ "_id" : "28617", "city" : "CRUMPLER", "loc" : [ -81.403886, 36.464057 ], "pop" : 2532, "state" : "NC" } +{ "_id" : "28618", "city" : "DEEP GAP", "loc" : [ -81.516265, 36.213573 ], "pop" : 1176, "state" : "NC" } +{ "_id" : "28621", "city" : "ELKIN", "loc" : [ -80.85536500000001, 36.28723 ], "pop" : 10672, "state" : "NC" } +{ "_id" : "28622", "city" : "ELK PARK", "loc" : [ -81.963882, 36.164623 ], "pop" : 3223, "state" : "NC" } +{ "_id" : "28623", "city" : "ENNICE", "loc" : [ -80.977141, 36.525278 ], "pop" : 1509, "state" : "NC" } +{ "_id" : "28624", "city" : "FERGUSON", "loc" : [ -81.38640700000001, 36.128316 ], "pop" : 1551, "state" : "NC" } +{ "_id" : "28626", "city" : "FLEETWOOD", "loc" : [ -81.514008, 36.281382 ], "pop" : 1693, "state" : "NC" } +{ "_id" : "28627", "city" : "GLADE VALLEY", "loc" : [ -81.01678200000001, 36.442889 ], "pop" : 1115, "state" : "NC" } +{ "_id" : "28630", "city" : "GRANITE FALLS", "loc" : [ -81.457145, 35.819663 ], "pop" : 17749, "state" : "NC" } +{ "_id" : "28631", "city" : "GRASSY CREEK", "loc" : [ -81.44675100000001, 36.541524 ], "pop" : 837, "state" : "NC" } +{ "_id" : "28634", "city" : "HARMONY", "loc" : [ -80.75846199999999, 35.957975 ], "pop" : 3881, "state" : "NC" } +{ "_id" : "28635", "city" : "HAYS", "loc" : [ -81.11611600000001, 36.310015 ], "pop" : 1085, "state" : "NC" } +{ "_id" : "28636", "city" : "HIDDENITE", "loc" : [ -81.048663, 35.95045 ], "pop" : 1703, "state" : "NC" } +{ "_id" : "28638", "city" : "HUDSON", "loc" : [ -81.48974699999999, 35.840295 ], "pop" : 9771, "state" : "NC" } +{ "_id" : "28640", "city" : "JEFFERSON", "loc" : [ -81.439626, 36.408987 ], "pop" : 3080, "state" : "NC" } +{ "_id" : "28642", "city" : "JONESVILLE", "loc" : [ -80.787029, 36.228571 ], "pop" : 7105, "state" : "NC" } +{ "_id" : "28643", "city" : "LANSING", "loc" : [ -81.52692500000001, 36.517641 ], "pop" : 3211, "state" : "NC" } +{ "_id" : "28644", "city" : "LAUREL SPRINGS", "loc" : [ -81.26061, 36.444897 ], "pop" : 1837, "state" : "NC" } +{ "_id" : "28645", "city" : "LENOIR", "loc" : [ -81.539793, 35.914935 ], "pop" : 39525, "state" : "NC" } +{ "_id" : "28648", "city" : "LONGISLAND", "loc" : [ -80.990403, 35.665814 ], "pop" : 279, "state" : "NC" } +{ "_id" : "28649", "city" : "MC GRADY", "loc" : [ -81.19120700000001, 36.310345 ], "pop" : 1261, "state" : "NC" } +{ "_id" : "28650", "city" : "MAIDEN", "loc" : [ -81.174492, 35.575884 ], "pop" : 7388, "state" : "NC" } +{ "_id" : "28651", "city" : "MILLERS CREEK", "loc" : [ -81.24853299999999, 36.211949 ], "pop" : 7018, "state" : "NC" } +{ "_id" : "28654", "city" : "MORAVIAN FALLS", "loc" : [ -81.178073, 36.078762 ], "pop" : 3071, "state" : "NC" } +{ "_id" : "28655", "city" : "MORGANTON", "loc" : [ -81.704216, 35.73458 ], "pop" : 50932, "state" : "NC" } +{ "_id" : "28657", "city" : "FRANK", "loc" : [ -81.952276, 36.040203 ], "pop" : 8906, "state" : "NC" } +{ "_id" : "28658", "city" : "NEWTON", "loc" : [ -81.242546, 35.649766 ], "pop" : 20759, "state" : "NC" } +{ "_id" : "28659", "city" : "NORTH WILKESBORO", "loc" : [ -81.128603, 36.20174 ], "pop" : 20167, "state" : "NC" } +{ "_id" : "28660", "city" : "OLIN", "loc" : [ -80.851084, 35.959333 ], "pop" : 723, "state" : "NC" } +{ "_id" : "28665", "city" : "PURLEAR", "loc" : [ -81.352773, 36.196391 ], "pop" : 1102, "state" : "NC" } +{ "_id" : "28668", "city" : "ROARING GAP", "loc" : [ -81.018781, 36.383553 ], "pop" : 21, "state" : "NC" } +{ "_id" : "28669", "city" : "ROARING RIVER", "loc" : [ -81.000373, 36.191561 ], "pop" : 978, "state" : "NC" } +{ "_id" : "28670", "city" : "RONDA", "loc" : [ -80.926964, 36.20594 ], "pop" : 2739, "state" : "NC" } +{ "_id" : "28673", "city" : "SHERRILLS FORD", "loc" : [ -81.03385900000001, 35.596244 ], "pop" : 5567, "state" : "NC" } +{ "_id" : "28675", "city" : "SPARTA", "loc" : [ -81.138442, 36.508851 ], "pop" : 5746, "state" : "NC" } +{ "_id" : "28676", "city" : "STATE ROAD", "loc" : [ -80.86529400000001, 36.34218 ], "pop" : 3080, "state" : "NC" } +{ "_id" : "28677", "city" : "STATESVILLE", "loc" : [ -80.894009, 35.799022 ], "pop" : 52895, "state" : "NC" } +{ "_id" : "28678", "city" : "STONY POINT", "loc" : [ -81.06413499999999, 35.866109 ], "pop" : 5212, "state" : "NC" } +{ "_id" : "28679", "city" : "SUGAR GROVE", "loc" : [ -81.844094, 36.262672 ], "pop" : 1631, "state" : "NC" } +{ "_id" : "28681", "city" : "TAYLORSVILLE", "loc" : [ -81.212429, 35.901046 ], "pop" : 19679, "state" : "NC" } +{ "_id" : "28682", "city" : "TERRELL", "loc" : [ -80.963064, 35.583587 ], "pop" : 440, "state" : "NC" } +{ "_id" : "28683", "city" : "THURMOND", "loc" : [ -80.931674, 36.356188 ], "pop" : 556, "state" : "NC" } +{ "_id" : "28684", "city" : "TODD", "loc" : [ -81.58740299999999, 36.324527 ], "pop" : 1039, "state" : "NC" } +{ "_id" : "28685", "city" : "TRAPHILL", "loc" : [ -81.015126, 36.330097 ], "pop" : 1781, "state" : "NC" } +{ "_id" : "28686", "city" : "TRIPLETT", "loc" : [ -81.489649, 36.181685 ], "pop" : 64, "state" : "NC" } +{ "_id" : "28689", "city" : "UNION GROVE", "loc" : [ -80.89669499999999, 36.036947 ], "pop" : 2264, "state" : "NC" } +{ "_id" : "28690", "city" : "VALDESE", "loc" : [ -81.56695999999999, 35.744739 ], "pop" : 4227, "state" : "NC" } +{ "_id" : "28691", "city" : "VALLE CRUCIS", "loc" : [ -81.880563, 36.207041 ], "pop" : 238, "state" : "NC" } +{ "_id" : "28692", "city" : "VILAS", "loc" : [ -81.765203, 36.257375 ], "pop" : 3022, "state" : "NC" } +{ "_id" : "28693", "city" : "WARRENSVILLE", "loc" : [ -81.546522, 36.45723 ], "pop" : 994, "state" : "NC" } +{ "_id" : "28694", "city" : "WEST JEFFERSON", "loc" : [ -81.487218, 36.377648 ], "pop" : 6348, "state" : "NC" } +{ "_id" : "28697", "city" : "WILKESBORO", "loc" : [ -81.157292, 36.135857 ], "pop" : 11889, "state" : "NC" } +{ "_id" : "28698", "city" : "ZIONVILLE", "loc" : [ -81.747567, 36.319437 ], "pop" : 1633, "state" : "NC" } +{ "_id" : "28701", "city" : "ALEXANDER", "loc" : [ -82.631134, 35.706394 ], "pop" : 2960, "state" : "NC" } +{ "_id" : "28702", "city" : "ALMOND", "loc" : [ -83.578406, 35.3295 ], "pop" : 678, "state" : "NC" } +{ "_id" : "28703", "city" : "AQUONE", "loc" : [ -83.56621800000001, 35.240254 ], "pop" : 1423, "state" : "NC" } +{ "_id" : "28704", "city" : "ARDEN", "loc" : [ -82.535372, 35.463666 ], "pop" : 11386, "state" : "NC" } +{ "_id" : "28705", "city" : "BAKERSVILLE", "loc" : [ -82.171133, 36.028588 ], "pop" : 6862, "state" : "NC" } +{ "_id" : "28708", "city" : "BALSAM GROVE", "loc" : [ -82.87795, 35.229751 ], "pop" : 342, "state" : "NC" } +{ "_id" : "28709", "city" : "BARNARDSVILLE", "loc" : [ -82.456682, 35.77483 ], "pop" : 2757, "state" : "NC" } +{ "_id" : "28711", "city" : "BLACK MOUNTAIN S", "loc" : [ -82.325087, 35.612494 ], "pop" : 11914, "state" : "NC" } +{ "_id" : "28712", "city" : "BREVARD", "loc" : [ -82.740444, 35.22076 ], "pop" : 14212, "state" : "NC" } +{ "_id" : "28713", "city" : "BRYSON CITY", "loc" : [ -83.439246, 35.424128 ], "pop" : 7248, "state" : "NC" } +{ "_id" : "28714", "city" : "BURNSVILLE", "loc" : [ -82.287623, 35.902974 ], "pop" : 13735, "state" : "NC" } +{ "_id" : "28715", "city" : "CANDLER", "loc" : [ -82.700081, 35.537626 ], "pop" : 15823, "state" : "NC" } +{ "_id" : "28716", "city" : "CANTON", "loc" : [ -82.841291, 35.512651 ], "pop" : 14331, "state" : "NC" } +{ "_id" : "28717", "city" : "CASHIERS", "loc" : [ -83.087074, 35.097117 ], "pop" : 1099, "state" : "NC" } +{ "_id" : "28719", "city" : "CHEROKEE", "loc" : [ -83.31444, 35.50937 ], "pop" : 3339, "state" : "NC" } +{ "_id" : "28721", "city" : "CLYDE", "loc" : [ -82.921582, 35.559654 ], "pop" : 7400, "state" : "NC" } +{ "_id" : "28722", "city" : "COLUMBUS", "loc" : [ -82.120631, 35.241031 ], "pop" : 5976, "state" : "NC" } +{ "_id" : "28723", "city" : "CULLOWHEE", "loc" : [ -83.147522, 35.240876 ], "pop" : 2886, "state" : "NC" } +{ "_id" : "28726", "city" : "EAST FLAT ROCK", "loc" : [ -82.420423, 35.279868 ], "pop" : 3770, "state" : "NC" } +{ "_id" : "28729", "city" : "ETOWAH", "loc" : [ -82.597705, 35.317192 ], "pop" : 2461, "state" : "NC" } +{ "_id" : "28730", "city" : "FAIRVIEW", "loc" : [ -82.398534, 35.525759 ], "pop" : 5156, "state" : "NC" } +{ "_id" : "28731", "city" : "FLAT ROCK", "loc" : [ -82.39156800000001, 35.288993 ], "pop" : 4240, "state" : "NC" } +{ "_id" : "28732", "city" : "FLETCHER", "loc" : [ -82.496559, 35.44989 ], "pop" : 7201, "state" : "NC" } +{ "_id" : "28733", "city" : "FONTANA DAM", "loc" : [ -83.81763100000001, 35.428187 ], "pop" : 187, "state" : "NC" } +{ "_id" : "28734", "city" : "FRANKLIN", "loc" : [ -83.388479, 35.180984 ], "pop" : 16689, "state" : "NC" } +{ "_id" : "28735", "city" : "GERTON", "loc" : [ -82.30620399999999, 35.468723 ], "pop" : 280, "state" : "NC" } +{ "_id" : "28736", "city" : "GLENVILLE", "loc" : [ -83.09003300000001, 35.188164 ], "pop" : 125, "state" : "NC" } +{ "_id" : "28738", "city" : "HAZELWOOD", "loc" : [ -83.004284, 35.476877 ], "pop" : 1759, "state" : "NC" } +{ "_id" : "28739", "city" : "HENDERSONVILLE", "loc" : [ -82.499995, 35.319213 ], "pop" : 26125, "state" : "NC" } +{ "_id" : "28740", "city" : "GREENMOUNTAIN", "loc" : [ -82.28786700000001, 35.995619 ], "pop" : 1471, "state" : "NC" } +{ "_id" : "28741", "city" : "HIGHLANDS", "loc" : [ -83.216044, 35.070546 ], "pop" : 2685, "state" : "NC" } +{ "_id" : "28742", "city" : "HORSE SHOE", "loc" : [ -82.598128, 35.370267 ], "pop" : 4069, "state" : "NC" } +{ "_id" : "28743", "city" : "HOT SPRINGS", "loc" : [ -82.812011, 35.816175 ], "pop" : 3595, "state" : "NC" } +{ "_id" : "28745", "city" : "LAKE JUNALUSKA", "loc" : [ -82.970235, 35.525916 ], "pop" : 539, "state" : "NC" } +{ "_id" : "28746", "city" : "LAKE LURE", "loc" : [ -82.175203, 35.446447 ], "pop" : 1843, "state" : "NC" } +{ "_id" : "28747", "city" : "LAKE TOXAWAY", "loc" : [ -82.91908100000001, 35.145052 ], "pop" : 1849, "state" : "NC" } +{ "_id" : "28748", "city" : "LEICESTER", "loc" : [ -82.710622, 35.649781 ], "pop" : 7709, "state" : "NC" } +{ "_id" : "28751", "city" : "MAGGIE VALLEY", "loc" : [ -83.092928, 35.52006 ], "pop" : 1989, "state" : "NC" } +{ "_id" : "28752", "city" : "MARION", "loc" : [ -82.017993, 35.681916 ], "pop" : 24988, "state" : "NC" } +{ "_id" : "28753", "city" : "WALNUT", "loc" : [ -82.656577, 35.856074 ], "pop" : 7623, "state" : "NC" } +{ "_id" : "28754", "city" : "MARS HILL", "loc" : [ -82.525352, 35.852825 ], "pop" : 5949, "state" : "NC" } +{ "_id" : "28756", "city" : "MILL SPRING", "loc" : [ -82.155733, 35.333792 ], "pop" : 3075, "state" : "NC" } +{ "_id" : "28761", "city" : "NEBO", "loc" : [ -81.905581, 35.673158 ], "pop" : 5018, "state" : "NC" } +{ "_id" : "28762", "city" : "OLD FORT", "loc" : [ -82.168621, 35.616948 ], "pop" : 5594, "state" : "NC" } +{ "_id" : "28763", "city" : "OTTO", "loc" : [ -83.384755, 35.062668 ], "pop" : 2297, "state" : "NC" } +{ "_id" : "28766", "city" : "PENROSE", "loc" : [ -82.62223899999999, 35.252407 ], "pop" : 653, "state" : "NC" } +{ "_id" : "28768", "city" : "PISGAH FOREST", "loc" : [ -82.669516, 35.259931 ], "pop" : 5623, "state" : "NC" } +{ "_id" : "28771", "city" : "ROBBINSVILLE", "loc" : [ -83.788775, 35.325932 ], "pop" : 6879, "state" : "NC" } +{ "_id" : "28772", "city" : "ROSMAN", "loc" : [ -82.818916, 35.119695 ], "pop" : 2779, "state" : "NC" } +{ "_id" : "28773", "city" : "SALUDA", "loc" : [ -82.330595, 35.238341 ], "pop" : 1451, "state" : "NC" } +{ "_id" : "28774", "city" : "SAPPHIRE", "loc" : [ -83.001924, 35.066578 ], "pop" : 62, "state" : "NC" } +{ "_id" : "28775", "city" : "SCALY MOUNTAIN", "loc" : [ -83.31133800000001, 35.024036 ], "pop" : 405, "state" : "NC" } +{ "_id" : "28777", "city" : "SPRUCE PINE", "loc" : [ -82.070492, 35.905971 ], "pop" : 7570, "state" : "NC" } +{ "_id" : "28778", "city" : "WARREN WILSON CO", "loc" : [ -82.40649000000001, 35.604843 ], "pop" : 5911, "state" : "NC" } +{ "_id" : "28779", "city" : "SYLVA", "loc" : [ -83.20305399999999, 35.348055 ], "pop" : 16275, "state" : "NC" } +{ "_id" : "28780", "city" : "TAPOCO", "loc" : [ -83.905415, 35.442023 ], "pop" : 130, "state" : "NC" } +{ "_id" : "28781", "city" : "TOPTON", "loc" : [ -83.74511699999999, 35.230604 ], "pop" : 481, "state" : "NC" } +{ "_id" : "28782", "city" : "TRYON", "loc" : [ -82.23942, 35.215703 ], "pop" : 3914, "state" : "NC" } +{ "_id" : "28783", "city" : "TUCKASEGEE", "loc" : [ -83.07486400000001, 35.259934 ], "pop" : 1096, "state" : "NC" } +{ "_id" : "28786", "city" : "WAYNESVILLE", "loc" : [ -82.99134599999999, 35.501767 ], "pop" : 20924, "state" : "NC" } +{ "_id" : "28787", "city" : "WEAVERVILLE", "loc" : [ -82.549109, 35.712642 ], "pop" : 11884, "state" : "NC" } +{ "_id" : "28789", "city" : "WHITTIER", "loc" : [ -83.287239, 35.446934 ], "pop" : 5368, "state" : "NC" } +{ "_id" : "28790", "city" : "ZIRCONIA", "loc" : [ -82.457368, 35.215291 ], "pop" : 2350, "state" : "NC" } +{ "_id" : "28792", "city" : "HENDERSONVILLE", "loc" : [ -82.42644300000001, 35.361342 ], "pop" : 21037, "state" : "NC" } +{ "_id" : "28801", "city" : "ASHEVILLE", "loc" : [ -82.556533, 35.597075 ], "pop" : 13316, "state" : "NC" } +{ "_id" : "28803", "city" : "ASHEVILLE", "loc" : [ -82.518021, 35.539291 ], "pop" : 20904, "state" : "NC" } +{ "_id" : "28804", "city" : "ASHEVILLE", "loc" : [ -82.56462500000001, 35.63743 ], "pop" : 16709, "state" : "NC" } +{ "_id" : "28805", "city" : "ASHEVILLE", "loc" : [ -82.491781, 35.600363 ], "pop" : 15335, "state" : "NC" } +{ "_id" : "28806", "city" : "ASHEVILLE", "loc" : [ -82.607787, 35.580814 ], "pop" : 30809, "state" : "NC" } +{ "_id" : "28901", "city" : "ANDREWS", "loc" : [ -83.822836, 35.195948 ], "pop" : 4469, "state" : "NC" } +{ "_id" : "28902", "city" : "BRASSTOWN", "loc" : [ -83.966773, 35.031392 ], "pop" : 1390, "state" : "NC" } +{ "_id" : "28904", "city" : "HAYESVILLE", "loc" : [ -83.78668, 35.04172 ], "pop" : 5965, "state" : "NC" } +{ "_id" : "28905", "city" : "MARBLE", "loc" : [ -83.93806499999999, 35.14748 ], "pop" : 3230, "state" : "NC" } +{ "_id" : "28906", "city" : "UNAKA", "loc" : [ -84.101454, 35.079228 ], "pop" : 11333, "state" : "NC" } +{ "_id" : "28909", "city" : "WARNE", "loc" : [ -83.90454099999999, 35.002437 ], "pop" : 457, "state" : "NC" } +{ "_id" : "29001", "city" : "ALCOLU", "loc" : [ -80.178782, 33.768402 ], "pop" : 2319, "state" : "SC" } +{ "_id" : "29003", "city" : "BAMBERG", "loc" : [ -81.01774399999999, 33.277915 ], "pop" : 7096, "state" : "SC" } +{ "_id" : "29006", "city" : "BATESBURG", "loc" : [ -81.54898799999999, 33.938595 ], "pop" : 9300, "state" : "SC" } +{ "_id" : "29009", "city" : "BETHUNE", "loc" : [ -80.36620600000001, 34.42012 ], "pop" : 2172, "state" : "SC" } +{ "_id" : "29010", "city" : "BISHOPVILLE", "loc" : [ -80.27498799999999, 34.224101 ], "pop" : 11965, "state" : "SC" } +{ "_id" : "29014", "city" : "BLACKSTOCK", "loc" : [ -81.12485700000001, 34.577876 ], "pop" : 249, "state" : "SC" } +{ "_id" : "29015", "city" : "BLAIR", "loc" : [ -81.345945, 34.496668 ], "pop" : 895, "state" : "SC" } +{ "_id" : "29016", "city" : "BLYTHEWOOD", "loc" : [ -80.975756, 34.191112 ], "pop" : 7321, "state" : "SC" } +{ "_id" : "29018", "city" : "BOWMAN", "loc" : [ -80.670868, 33.347466 ], "pop" : 3993, "state" : "SC" } +{ "_id" : "29020", "city" : "CAMDEN", "loc" : [ -80.590997, 34.269636 ], "pop" : 20667, "state" : "SC" } +{ "_id" : "29030", "city" : "CAMERON", "loc" : [ -80.64660499999999, 33.557789 ], "pop" : 2356, "state" : "SC" } +{ "_id" : "29031", "city" : "CARLISLE", "loc" : [ -81.50910500000001, 34.614332 ], "pop" : 2021, "state" : "SC" } +{ "_id" : "29032", "city" : "CASSATT", "loc" : [ -80.499993, 34.342414 ], "pop" : 2164, "state" : "SC" } +{ "_id" : "29033", "city" : "CAYCE", "loc" : [ -81.06708399999999, 33.962567 ], "pop" : 12191, "state" : "SC" } +{ "_id" : "29036", "city" : "CHAPIN", "loc" : [ -81.33181999999999, 34.131158 ], "pop" : 8744, "state" : "SC" } +{ "_id" : "29037", "city" : "CHAPPELLS", "loc" : [ -81.83525299999999, 34.235834 ], "pop" : 940, "state" : "SC" } +{ "_id" : "29038", "city" : "COPE", "loc" : [ -80.963111, 33.372555 ], "pop" : 1962, "state" : "SC" } +{ "_id" : "29039", "city" : "CORDOVA", "loc" : [ -80.88571899999999, 33.42753 ], "pop" : 2808, "state" : "SC" } +{ "_id" : "29040", "city" : "DALZELL", "loc" : [ -80.466533, 34.014412 ], "pop" : 7540, "state" : "SC" } +{ "_id" : "29042", "city" : "DENMARK", "loc" : [ -81.14072, 33.320925 ], "pop" : 6602, "state" : "SC" } +{ "_id" : "29044", "city" : "EASTOVER", "loc" : [ -80.699647, 33.915274 ], "pop" : 4666, "state" : "SC" } +{ "_id" : "29045", "city" : "ELGIN", "loc" : [ -80.81129199999999, 34.161963 ], "pop" : 9447, "state" : "SC" } +{ "_id" : "29046", "city" : "ELLIOTT", "loc" : [ -80.17544100000001, 34.117149 ], "pop" : 1235, "state" : "SC" } +{ "_id" : "29047", "city" : "ELLOREE", "loc" : [ -80.56784, 33.490608 ], "pop" : 4202, "state" : "SC" } +{ "_id" : "29048", "city" : "EUTAWVILLE", "loc" : [ -80.31998299999999, 33.392189 ], "pop" : 4298, "state" : "SC" } +{ "_id" : "29051", "city" : "GABLE", "loc" : [ -80.081377, 33.840989 ], "pop" : 790, "state" : "SC" } +{ "_id" : "29052", "city" : "GADSDEN", "loc" : [ -80.753199, 33.845461 ], "pop" : 2235, "state" : "SC" } +{ "_id" : "29053", "city" : "GASTON", "loc" : [ -81.117395, 33.833712 ], "pop" : 7863, "state" : "SC" } +{ "_id" : "29054", "city" : "GILBERT", "loc" : [ -81.39136000000001, 33.95805 ], "pop" : 4018, "state" : "SC" } +{ "_id" : "29055", "city" : "GREAT FALLS", "loc" : [ -80.913263, 34.57053 ], "pop" : 3562, "state" : "SC" } +{ "_id" : "29056", "city" : "GREELEYVILLE", "loc" : [ -79.98022, 33.59664 ], "pop" : 2773, "state" : "SC" } +{ "_id" : "29058", "city" : "HEATH SPRINGS", "loc" : [ -80.71031000000001, 34.602422 ], "pop" : 5101, "state" : "SC" } +{ "_id" : "29059", "city" : "HOLLY HILL", "loc" : [ -80.402393, 33.327586 ], "pop" : 4959, "state" : "SC" } +{ "_id" : "29061", "city" : "HOPKINS", "loc" : [ -80.84490599999999, 33.934868 ], "pop" : 12297, "state" : "SC" } +{ "_id" : "29063", "city" : "IRMO", "loc" : [ -81.19655299999999, 34.110254 ], "pop" : 15479, "state" : "SC" } +{ "_id" : "29065", "city" : "JENKINSVILLE", "loc" : [ -81.271153, 34.271693 ], "pop" : 809, "state" : "SC" } +{ "_id" : "29067", "city" : "KERSHAW", "loc" : [ -80.554633, 34.557809 ], "pop" : 8189, "state" : "SC" } +{ "_id" : "29069", "city" : "LAMAR", "loc" : [ -80.030134, 34.189044 ], "pop" : 6964, "state" : "SC" } +{ "_id" : "29070", "city" : "LEESVILLE", "loc" : [ -81.45975300000001, 33.913169 ], "pop" : 8605, "state" : "SC" } +{ "_id" : "29072", "city" : "LEXINGTON", "loc" : [ -81.23586, 33.972383 ], "pop" : 33576, "state" : "SC" } +{ "_id" : "29073", "city" : "LEXINGTON", "loc" : [ -81.235102, 33.863206 ], "pop" : 4683, "state" : "SC" } +{ "_id" : "29075", "city" : "LITTLE MOUNTAIN", "loc" : [ -81.418375, 34.167569 ], "pop" : 3322, "state" : "SC" } +{ "_id" : "29077", "city" : "LONE STAR", "loc" : [ -80.645025, 33.673574 ], "pop" : 1030, "state" : "SC" } +{ "_id" : "29078", "city" : "LUGOFF", "loc" : [ -80.71471200000001, 34.22961 ], "pop" : 8991, "state" : "SC" } +{ "_id" : "29080", "city" : "LYNCHBURG", "loc" : [ -80.098821, 34.052603 ], "pop" : 2091, "state" : "SC" } +{ "_id" : "29081", "city" : "EHRHARDT", "loc" : [ -81.022137, 33.104436 ], "pop" : 1525, "state" : "SC" } +{ "_id" : "29082", "city" : "LODGE", "loc" : [ -80.934641, 32.982263 ], "pop" : 1877, "state" : "SC" } +{ "_id" : "29101", "city" : "MC BEE", "loc" : [ -80.254434, 34.46056 ], "pop" : 2331, "state" : "SC" } +{ "_id" : "29102", "city" : "PAXVILLE", "loc" : [ -80.222078, 33.667716 ], "pop" : 14407, "state" : "SC" } +{ "_id" : "29104", "city" : "SAINT CHARLES", "loc" : [ -80.234927, 34.046463 ], "pop" : 2403, "state" : "SC" } +{ "_id" : "29105", "city" : "MONETTA", "loc" : [ -81.536299, 33.774729 ], "pop" : 2068, "state" : "SC" } +{ "_id" : "29107", "city" : "NEESES", "loc" : [ -81.083433, 33.534282 ], "pop" : 3416, "state" : "SC" } +{ "_id" : "29108", "city" : "NEWBERRY", "loc" : [ -81.615741, 34.284661 ], "pop" : 15468, "state" : "SC" } +{ "_id" : "29111", "city" : "NEW ZION", "loc" : [ -80.014753, 33.795736 ], "pop" : 1072, "state" : "SC" } +{ "_id" : "29112", "city" : "NORTH", "loc" : [ -81.060096, 33.621121 ], "pop" : 3410, "state" : "SC" } +{ "_id" : "29113", "city" : "NORWAY", "loc" : [ -81.10974400000001, 33.453402 ], "pop" : 2487, "state" : "SC" } +{ "_id" : "29114", "city" : "OLANTA", "loc" : [ -79.91534900000001, 33.928545 ], "pop" : 2415, "state" : "SC" } +{ "_id" : "29115", "city" : "ORANGEBURG", "loc" : [ -80.85928199999999, 33.502545 ], "pop" : 43095, "state" : "SC" } +{ "_id" : "29123", "city" : "PELION", "loc" : [ -81.25016100000001, 33.776628 ], "pop" : 3139, "state" : "SC" } +{ "_id" : "29125", "city" : "PINEWOOD", "loc" : [ -80.497761, 33.764216 ], "pop" : 937, "state" : "SC" } +{ "_id" : "29126", "city" : "POMARIA", "loc" : [ -81.449973, 34.306281 ], "pop" : 3278, "state" : "SC" } +{ "_id" : "29127", "city" : "PROSPERITY", "loc" : [ -81.532353, 34.183243 ], "pop" : 4782, "state" : "SC" } +{ "_id" : "29128", "city" : "REMBERT", "loc" : [ -80.494544, 34.108467 ], "pop" : 5577, "state" : "SC" } +{ "_id" : "29129", "city" : "RIDGE SPRING", "loc" : [ -81.65594900000001, 33.871403 ], "pop" : 2172, "state" : "SC" } +{ "_id" : "29130", "city" : "RIDGEWAY", "loc" : [ -80.92881300000001, 34.316651 ], "pop" : 4405, "state" : "SC" } +{ "_id" : "29131", "city" : "RIMINI", "loc" : [ -80.47267100000001, 33.672155 ], "pop" : 778, "state" : "SC" } +{ "_id" : "29133", "city" : "ROWESVILLE", "loc" : [ -80.83311500000001, 33.370257 ], "pop" : 488, "state" : "SC" } +{ "_id" : "29135", "city" : "FORT MOTTE", "loc" : [ -80.856286, 33.694212 ], "pop" : 9367, "state" : "SC" } +{ "_id" : "29137", "city" : "SALLEY", "loc" : [ -81.31841799999999, 33.597233 ], "pop" : 2537, "state" : "SC" } +{ "_id" : "29138", "city" : "SALUDA", "loc" : [ -81.775398, 34.017451 ], "pop" : 9586, "state" : "SC" } +{ "_id" : "29142", "city" : "SANTEE", "loc" : [ -80.480498, 33.483533 ], "pop" : 1891, "state" : "SC" } +{ "_id" : "29145", "city" : "SILVERSTREET", "loc" : [ -81.703684, 34.235553 ], "pop" : 1851, "state" : "SC" } +{ "_id" : "29146", "city" : "SPRINGFIELD", "loc" : [ -81.249858, 33.534265 ], "pop" : 2184, "state" : "SC" } +{ "_id" : "29148", "city" : "SUMMERTON", "loc" : [ -80.36056600000001, 33.594578 ], "pop" : 5946, "state" : "SC" } +{ "_id" : "29150", "city" : "OSWEGO", "loc" : [ -80.32100800000001, 33.928199 ], "pop" : 46394, "state" : "SC" } +{ "_id" : "29152", "city" : "SHAW A F B", "loc" : [ -80.481093, 33.980262 ], "pop" : 13353, "state" : "SC" } +{ "_id" : "29154", "city" : "SUMTER", "loc" : [ -80.402761, 33.882067 ], "pop" : 24816, "state" : "SC" } +{ "_id" : "29160", "city" : "SWANSEA", "loc" : [ -81.093309, 33.733917 ], "pop" : 3822, "state" : "SC" } +{ "_id" : "29161", "city" : "TIMMONSVILLE", "loc" : [ -79.937845, 34.101241 ], "pop" : 6644, "state" : "SC" } +{ "_id" : "29162", "city" : "TURBEVILLE", "loc" : [ -79.985174, 33.87857 ], "pop" : 3138, "state" : "SC" } +{ "_id" : "29163", "city" : "VANCE", "loc" : [ -80.461716, 33.413882 ], "pop" : 3445, "state" : "SC" } +{ "_id" : "29164", "city" : "WAGENER", "loc" : [ -81.39952, 33.649417 ], "pop" : 3278, "state" : "SC" } +{ "_id" : "29166", "city" : "WARD", "loc" : [ -81.728341, 33.884856 ], "pop" : 823, "state" : "SC" } +{ "_id" : "29168", "city" : "WEDGEFIELD", "loc" : [ -80.49871899999999, 33.943002 ], "pop" : 5490, "state" : "SC" } +{ "_id" : "29169", "city" : "WEST COLUMBIA", "loc" : [ -81.088836, 33.995024 ], "pop" : 18309, "state" : "SC" } +{ "_id" : "29170", "city" : "WEST COLUMBIA", "loc" : [ -81.140474, 33.956751 ], "pop" : 17399, "state" : "SC" } +{ "_id" : "29172", "city" : "WEST COLUMBIA", "loc" : [ -81.091008, 33.900022 ], "pop" : 9939, "state" : "SC" } +{ "_id" : "29175", "city" : "WESTVILLE", "loc" : [ -80.579554, 34.449177 ], "pop" : 867, "state" : "SC" } +{ "_id" : "29178", "city" : "WHITMIRE", "loc" : [ -81.605981, 34.495485 ], "pop" : 3677, "state" : "SC" } +{ "_id" : "29180", "city" : "WINNSBORO", "loc" : [ -81.10899000000001, 34.381008 ], "pop" : 16188, "state" : "SC" } +{ "_id" : "29201", "city" : "COLUMBIA", "loc" : [ -81.033418, 34.0004 ], "pop" : 18758, "state" : "SC" } +{ "_id" : "29203", "city" : "COLUMBIA", "loc" : [ -81.026462, 34.063452 ], "pop" : 45907, "state" : "SC" } +{ "_id" : "29204", "city" : "COLUMBIA", "loc" : [ -81.00464700000001, 34.026037 ], "pop" : 23682, "state" : "SC" } +{ "_id" : "29205", "city" : "COLUMBIA", "loc" : [ -80.999731, 33.990309 ], "pop" : 27239, "state" : "SC" } +{ "_id" : "29206", "city" : "COLUMBIA", "loc" : [ -80.953152, 34.024655 ], "pop" : 25605, "state" : "SC" } +{ "_id" : "29209", "city" : "COLUMBIA", "loc" : [ -80.935525, 33.965863 ], "pop" : 26378, "state" : "SC" } +{ "_id" : "29210", "city" : "COLUMBIA", "loc" : [ -81.11006, 34.047863 ], "pop" : 37526, "state" : "SC" } +{ "_id" : "29212", "city" : "COLUMBIA", "loc" : [ -81.17961699999999, 34.072613 ], "pop" : 22080, "state" : "SC" } +{ "_id" : "29223", "city" : "COLUMBIA", "loc" : [ -80.91667, 34.085267 ], "pop" : 42346, "state" : "SC" } +{ "_id" : "29301", "city" : "SPARTANBURG", "loc" : [ -81.965377, 34.935211 ], "pop" : 45811, "state" : "SC" } +{ "_id" : "29302", "city" : "SPARTANBURG", "loc" : [ -81.873625, 34.956283 ], "pop" : 36446, "state" : "SC" } +{ "_id" : "29303", "city" : "VALLEY FALLS", "loc" : [ -81.957566, 34.993728 ], "pop" : 29166, "state" : "SC" } +{ "_id" : "29321", "city" : "BUFFALO", "loc" : [ -81.682576, 34.724703 ], "pop" : 1810, "state" : "SC" } +{ "_id" : "29322", "city" : "CAMPOBELLO", "loc" : [ -82.140343, 35.108003 ], "pop" : 7479, "state" : "SC" } +{ "_id" : "29323", "city" : "CHESNEE", "loc" : [ -81.86782700000001, 35.115398 ], "pop" : 14714, "state" : "SC" } +{ "_id" : "29325", "city" : "CLINTON", "loc" : [ -81.87717000000001, 34.470692 ], "pop" : 16265, "state" : "SC" } +{ "_id" : "29330", "city" : "COWPENS", "loc" : [ -81.822019, 35.038979 ], "pop" : 5279, "state" : "SC" } +{ "_id" : "29332", "city" : "CROSS HILL", "loc" : [ -81.984278, 34.269274 ], "pop" : 1089, "state" : "SC" } +{ "_id" : "29334", "city" : "DUNCAN", "loc" : [ -82.125821, 34.917645 ], "pop" : 5512, "state" : "SC" } +{ "_id" : "29335", "city" : "ENOREE", "loc" : [ -81.92373000000001, 34.670952 ], "pop" : 3310, "state" : "SC" } +{ "_id" : "29340", "city" : "GAFFNEY", "loc" : [ -81.649061, 35.061508 ], "pop" : 32761, "state" : "SC" } +{ "_id" : "29349", "city" : "INMAN", "loc" : [ -82.054013, 35.052795 ], "pop" : 23348, "state" : "SC" } +{ "_id" : "29351", "city" : "JOANNA", "loc" : [ -81.81907, 34.406795 ], "pop" : 2592, "state" : "SC" } +{ "_id" : "29353", "city" : "KELTON", "loc" : [ -81.684218, 34.837368 ], "pop" : 3504, "state" : "SC" } +{ "_id" : "29355", "city" : "KINARDS", "loc" : [ -81.71975, 34.355219 ], "pop" : 678, "state" : "SC" } +{ "_id" : "29356", "city" : "LANDRUM", "loc" : [ -82.211473, 35.156486 ], "pop" : 6521, "state" : "SC" } +{ "_id" : "29360", "city" : "ORA", "loc" : [ -82.026774, 34.500714 ], "pop" : 21437, "state" : "SC" } +{ "_id" : "29365", "city" : "LYMAN", "loc" : [ -82.143479, 34.968443 ], "pop" : 4515, "state" : "SC" } +{ "_id" : "29369", "city" : "MOORE", "loc" : [ -82.017893, 34.883453 ], "pop" : 6791, "state" : "SC" } +{ "_id" : "29370", "city" : "MOUNTVILLE", "loc" : [ -81.958429, 34.340791 ], "pop" : 1139, "state" : "SC" } +{ "_id" : "29372", "city" : "PACOLET", "loc" : [ -81.758703, 34.901708 ], "pop" : 4129, "state" : "SC" } +{ "_id" : "29374", "city" : "GLENN SPRINGS", "loc" : [ -81.85785300000001, 34.774808 ], "pop" : 4588, "state" : "SC" } +{ "_id" : "29376", "city" : "ROEBUCK", "loc" : [ -81.95255, 34.8688 ], "pop" : 5009, "state" : "SC" } +{ "_id" : "29379", "city" : "UNION", "loc" : [ -81.62023499999999, 34.726855 ], "pop" : 22553, "state" : "SC" } +{ "_id" : "29384", "city" : "WATERLOO", "loc" : [ -82.087968, 34.33673 ], "pop" : 2992, "state" : "SC" } +{ "_id" : "29385", "city" : "WELLFORD", "loc" : [ -82.09270600000001, 34.951394 ], "pop" : 6637, "state" : "SC" } +{ "_id" : "29388", "city" : "WOODRUFF", "loc" : [ -82.044658, 34.757864 ], "pop" : 10206, "state" : "SC" } +{ "_id" : "29401", "city" : "CHARLESTON", "loc" : [ -79.93706899999999, 32.779506 ], "pop" : 12475, "state" : "SC" } +{ "_id" : "29403", "city" : "CHARLESTON", "loc" : [ -79.94928299999999, 32.797575 ], "pop" : 24620, "state" : "SC" } +{ "_id" : "29404", "city" : "CHARLESTON", "loc" : [ -80.06768700000001, 32.895816 ], "pop" : 5420, "state" : "SC" } +{ "_id" : "29405", "city" : "CHARLESTON", "loc" : [ -79.97644200000001, 32.851206 ], "pop" : 30621, "state" : "SC" } +{ "_id" : "29406", "city" : "NORTH CHARLESTON", "loc" : [ -80.001053, 32.903035 ], "pop" : 27726, "state" : "SC" } +{ "_id" : "29407", "city" : "CHARLESTON", "loc" : [ -80.00595300000001, 32.799322 ], "pop" : 38597, "state" : "SC" } +{ "_id" : "29412", "city" : "CHARLESTON", "loc" : [ -79.95472700000001, 32.732319 ], "pop" : 29969, "state" : "SC" } +{ "_id" : "29414", "city" : "CHARLESTON", "loc" : [ -80.05675599999999, 32.821538 ], "pop" : 19404, "state" : "SC" } +{ "_id" : "29418", "city" : "CHARLESTON", "loc" : [ -80.055126, 32.907135 ], "pop" : 39784, "state" : "SC" } +{ "_id" : "29420", "city" : "CHARLESTON", "loc" : [ -80.08646299999999, 32.933096 ], "pop" : 11598, "state" : "SC" } +{ "_id" : "29426", "city" : "JERICHO", "loc" : [ -80.368197, 32.749318 ], "pop" : 1723, "state" : "SC" } +{ "_id" : "29429", "city" : "AWENDAW", "loc" : [ -79.686075, 32.951475 ], "pop" : 1831, "state" : "SC" } +{ "_id" : "29431", "city" : "BONNEAU", "loc" : [ -79.92164, 33.297332 ], "pop" : 7431, "state" : "SC" } +{ "_id" : "29432", "city" : "BRANCHVILLE", "loc" : [ -80.805931, 33.262802 ], "pop" : 2165, "state" : "SC" } +{ "_id" : "29434", "city" : "CORDESVILLE", "loc" : [ -79.920492, 33.162127 ], "pop" : 1382, "state" : "SC" } +{ "_id" : "29435", "city" : "COTTAGEVILLE", "loc" : [ -80.47941400000001, 32.961171 ], "pop" : 4105, "state" : "SC" } +{ "_id" : "29436", "city" : "CROSS", "loc" : [ -80.185901, 33.336373 ], "pop" : 3016, "state" : "SC" } +{ "_id" : "29437", "city" : "DORCHESTER", "loc" : [ -80.403398, 33.124688 ], "pop" : 928, "state" : "SC" } +{ "_id" : "29438", "city" : "EDISTO ISLAND", "loc" : [ -80.30701000000001, 32.548572 ], "pop" : 1669, "state" : "SC" } +{ "_id" : "29440", "city" : "GEORGETOWN", "loc" : [ -79.323459, 33.430776 ], "pop" : 29148, "state" : "SC" } +{ "_id" : "29445", "city" : "MOUNT HOLLY", "loc" : [ -80.019948, 32.988699 ], "pop" : 44954, "state" : "SC" } +{ "_id" : "29446", "city" : "GREEN POND", "loc" : [ -80.528035, 32.662827 ], "pop" : 2068, "state" : "SC" } +{ "_id" : "29448", "city" : "HARLEYVILLE", "loc" : [ -80.45009400000001, 33.220511 ], "pop" : 3289, "state" : "SC" } +{ "_id" : "29449", "city" : "MEGGETT", "loc" : [ -80.25956600000001, 32.722306 ], "pop" : 6397, "state" : "SC" } +{ "_id" : "29450", "city" : "HUGER", "loc" : [ -79.807254, 33.018436 ], "pop" : 1964, "state" : "SC" } +{ "_id" : "29451", "city" : "ISLE OF PALMS", "loc" : [ -79.772949, 32.794252 ], "pop" : 3680, "state" : "SC" } +{ "_id" : "29453", "city" : "SHULERVILLE", "loc" : [ -79.715551, 33.228797 ], "pop" : 1852, "state" : "SC" } +{ "_id" : "29455", "city" : "JOHNS ISLAND", "loc" : [ -80.094294, 32.709697 ], "pop" : 11756, "state" : "SC" } +{ "_id" : "29456", "city" : "LADSON", "loc" : [ -80.12570100000001, 32.993019 ], "pop" : 16216, "state" : "SC" } +{ "_id" : "29458", "city" : "MC CLELLANVILLE", "loc" : [ -79.47998200000001, 33.10472 ], "pop" : 3020, "state" : "SC" } +{ "_id" : "29461", "city" : "OAKLEY", "loc" : [ -80.036576, 33.163071 ], "pop" : 17822, "state" : "SC" } +{ "_id" : "29464", "city" : "MOUNT PLEASANT", "loc" : [ -79.852031, 32.816211 ], "pop" : 35432, "state" : "SC" } +{ "_id" : "29468", "city" : "PINEVILLE", "loc" : [ -80.093181, 33.419926 ], "pop" : 1411, "state" : "SC" } +{ "_id" : "29469", "city" : "PINOPOLIS", "loc" : [ -80.039761, 33.224125 ], "pop" : 958, "state" : "SC" } +{ "_id" : "29470", "city" : "RAVENEL", "loc" : [ -80.222346, 32.788088 ], "pop" : 3248, "state" : "SC" } +{ "_id" : "29471", "city" : "REEVESVILLE", "loc" : [ -80.66725, 33.187213 ], "pop" : 1342, "state" : "SC" } +{ "_id" : "29472", "city" : "RIDGEVILLE", "loc" : [ -80.308611, 33.108017 ], "pop" : 7494, "state" : "SC" } +{ "_id" : "29474", "city" : "ROUND O", "loc" : [ -80.573882, 32.940516 ], "pop" : 64, "state" : "SC" } +{ "_id" : "29475", "city" : "RUFFIN", "loc" : [ -80.813653, 33.010319 ], "pop" : 269, "state" : "SC" } +{ "_id" : "29477", "city" : "SAINT GEORGE", "loc" : [ -80.573246, 33.184532 ], "pop" : 6940, "state" : "SC" } +{ "_id" : "29479", "city" : "ALVIN", "loc" : [ -79.937635, 33.405953 ], "pop" : 5483, "state" : "SC" } +{ "_id" : "29481", "city" : "SMOAKS", "loc" : [ -80.81302100000001, 33.096319 ], "pop" : 2074, "state" : "SC" } +{ "_id" : "29482", "city" : "SULLIVANS ISLAND", "loc" : [ -79.839905, 32.763652 ], "pop" : 1623, "state" : "SC" } +{ "_id" : "29483", "city" : "SUMMERVILLE", "loc" : [ -80.173852, 33.028045 ], "pop" : 45292, "state" : "SC" } +{ "_id" : "29485", "city" : "SUMMERVILLE", "loc" : [ -80.183082, 32.975556 ], "pop" : 24856, "state" : "SC" } +{ "_id" : "29487", "city" : "WADMALAW ISLAND", "loc" : [ -80.182867, 32.652854 ], "pop" : 2570, "state" : "SC" } +{ "_id" : "29488", "city" : "RITTER", "loc" : [ -80.679225, 32.897367 ], "pop" : 24002, "state" : "SC" } +{ "_id" : "29492", "city" : "WANDO", "loc" : [ -79.86533, 32.962223 ], "pop" : 1433, "state" : "SC" } +{ "_id" : "29501", "city" : "FLORENCE", "loc" : [ -79.772786, 34.18375 ], "pop" : 66990, "state" : "SC" } +{ "_id" : "29505", "city" : "FLORENCE", "loc" : [ -79.775983, 34.256368 ], "pop" : 1440, "state" : "SC" } +{ "_id" : "29506", "city" : "QUINBY", "loc" : [ -79.79454699999999, 34.245178 ], "pop" : 0, "state" : "SC" } +{ "_id" : "29510", "city" : "ANDREWS", "loc" : [ -79.560438, 33.452525 ], "pop" : 9845, "state" : "SC" } +{ "_id" : "29511", "city" : "AYNOR", "loc" : [ -79.17773, 33.982271 ], "pop" : 6786, "state" : "SC" } +{ "_id" : "29512", "city" : "BENNETTSVILLE", "loc" : [ -79.689826, 34.625501 ], "pop" : 15751, "state" : "SC" } +{ "_id" : "29516", "city" : "BLENHEIM", "loc" : [ -79.65942200000001, 34.502033 ], "pop" : 2123, "state" : "SC" } +{ "_id" : "29518", "city" : "CADES", "loc" : [ -79.817567, 33.812017 ], "pop" : 2748, "state" : "SC" } +{ "_id" : "29520", "city" : "CHERAW", "loc" : [ -79.91741399999999, 34.686275 ], "pop" : 13063, "state" : "SC" } +{ "_id" : "29525", "city" : "CLIO", "loc" : [ -79.545255, 34.58052 ], "pop" : 2870, "state" : "SC" } +{ "_id" : "29526", "city" : "CONWAY", "loc" : [ -79.055712, 33.873066 ], "pop" : 17560, "state" : "SC" } +{ "_id" : "29527", "city" : "BUCKSPORT", "loc" : [ -79.050836, 33.77922 ], "pop" : 19781, "state" : "SC" } +{ "_id" : "29530", "city" : "COWARD", "loc" : [ -79.75152300000001, 33.990514 ], "pop" : 2098, "state" : "SC" } +{ "_id" : "29532", "city" : "DARLINGTON", "loc" : [ -79.873221, 34.300294 ], "pop" : 22271, "state" : "SC" } +{ "_id" : "29536", "city" : "DILLON", "loc" : [ -79.377015, 34.414553 ], "pop" : 9113, "state" : "SC" } +{ "_id" : "29541", "city" : "EFFINGHAM", "loc" : [ -79.791822, 34.094571 ], "pop" : 8031, "state" : "SC" } +{ "_id" : "29543", "city" : "FORK", "loc" : [ -79.250063, 34.28733 ], "pop" : 916, "state" : "SC" } +{ "_id" : "29544", "city" : "GALIVANTS FERRY", "loc" : [ -79.105915, 34.123801 ], "pop" : 1129, "state" : "SC" } +{ "_id" : "29545", "city" : "GREEN SEA", "loc" : [ -79.051613, 34.205105 ], "pop" : 1814, "state" : "SC" } +{ "_id" : "29546", "city" : "GRESHAM", "loc" : [ -79.356426, 33.906941 ], "pop" : 2262, "state" : "SC" } +{ "_id" : "29547", "city" : "SOUTH OF THE BOR", "loc" : [ -79.377871, 34.484556 ], "pop" : 4643, "state" : "SC" } +{ "_id" : "29550", "city" : "HARTSVILLE", "loc" : [ -80.084237, 34.375616 ], "pop" : 27888, "state" : "SC" } +{ "_id" : "29554", "city" : "HEMINGWAY", "loc" : [ -79.44889499999999, 33.741887 ], "pop" : 5578, "state" : "SC" } +{ "_id" : "29555", "city" : "JOHNSONVILLE", "loc" : [ -79.478256, 33.829873 ], "pop" : 6115, "state" : "SC" } +{ "_id" : "29556", "city" : "KINGSTREE", "loc" : [ -79.783221, 33.687841 ], "pop" : 16365, "state" : "SC" } +{ "_id" : "29560", "city" : "LAKE CITY", "loc" : [ -79.741794, 33.865473 ], "pop" : 11664, "state" : "SC" } +{ "_id" : "29563", "city" : "LAKE VIEW", "loc" : [ -79.192869, 34.34449 ], "pop" : 3513, "state" : "SC" } +{ "_id" : "29564", "city" : "LANE", "loc" : [ -79.871545, 33.50827 ], "pop" : 1730, "state" : "SC" } +{ "_id" : "29565", "city" : "LATTA", "loc" : [ -79.441704, 34.339829 ], "pop" : 6435, "state" : "SC" } +{ "_id" : "29566", "city" : "LITTLE RIVER", "loc" : [ -78.650829, 33.876806 ], "pop" : 6473, "state" : "SC" } +{ "_id" : "29567", "city" : "LITTLE ROCK", "loc" : [ -79.326948, 34.404803 ], "pop" : 4489, "state" : "SC" } +{ "_id" : "29568", "city" : "LONGS", "loc" : [ -78.793359, 33.906408 ], "pop" : 5936, "state" : "SC" } +{ "_id" : "29569", "city" : "LORIS", "loc" : [ -78.916096, 34.055756 ], "pop" : 11189, "state" : "SC" } +{ "_id" : "29570", "city" : "MC COLL", "loc" : [ -79.559741, 34.670406 ], "pop" : 5224, "state" : "SC" } +{ "_id" : "29571", "city" : "MARION", "loc" : [ -79.389822, 34.156195 ], "pop" : 16285, "state" : "SC" } +{ "_id" : "29572", "city" : "MYRTLE BEACH", "loc" : [ -78.80444799999999, 33.758701 ], "pop" : 7039, "state" : "SC" } +{ "_id" : "29574", "city" : "MULLINS", "loc" : [ -79.254155, 34.204441 ], "pop" : 12118, "state" : "SC" } +{ "_id" : "29575", "city" : "SURFSIDE BEACH", "loc" : [ -78.995228, 33.625245 ], "pop" : 24545, "state" : "SC" } +{ "_id" : "29576", "city" : "MURRELLS INLET", "loc" : [ -79.05275, 33.550717 ], "pop" : 4209, "state" : "SC" } +{ "_id" : "29577", "city" : "MYRTLE BEACH", "loc" : [ -78.913697, 33.699363 ], "pop" : 31917, "state" : "SC" } +{ "_id" : "29580", "city" : "NESMITH", "loc" : [ -79.551301, 33.591652 ], "pop" : 3297, "state" : "SC" } +{ "_id" : "29581", "city" : "NICHOLS", "loc" : [ -79.162493, 34.242629 ], "pop" : 1258, "state" : "SC" } +{ "_id" : "29582", "city" : "CHERRY GROVE BEA", "loc" : [ -78.67792, 33.822801 ], "pop" : 9910, "state" : "SC" } +{ "_id" : "29583", "city" : "PAMPLICO", "loc" : [ -79.592917, 33.992166 ], "pop" : 6291, "state" : "SC" } +{ "_id" : "29584", "city" : "PATRICK", "loc" : [ -80.064984, 34.559823 ], "pop" : 3800, "state" : "SC" } +{ "_id" : "29585", "city" : "PAWLEYS ISLAND", "loc" : [ -79.134128, 33.450825 ], "pop" : 5445, "state" : "SC" } +{ "_id" : "29590", "city" : "SALTERS", "loc" : [ -79.83002399999999, 33.561138 ], "pop" : 1932, "state" : "SC" } +{ "_id" : "29591", "city" : "SCRANTON", "loc" : [ -79.773101, 33.92813 ], "pop" : 4122, "state" : "SC" } +{ "_id" : "29592", "city" : "SELLERS", "loc" : [ -79.436948, 34.269522 ], "pop" : 1976, "state" : "SC" } +{ "_id" : "29593", "city" : "SOCIETY HILL", "loc" : [ -79.886494, 34.451161 ], "pop" : 3278, "state" : "SC" } +{ "_id" : "29596", "city" : "WALLACE", "loc" : [ -79.801142, 34.730704 ], "pop" : 3398, "state" : "SC" } +{ "_id" : "29601", "city" : "GREENVILLE", "loc" : [ -82.406049, 34.847165 ], "pop" : 11198, "state" : "SC" } +{ "_id" : "29605", "city" : "GREENVILLE", "loc" : [ -82.393218, 34.800117 ], "pop" : 32092, "state" : "SC" } +{ "_id" : "29607", "city" : "GREENVILLE", "loc" : [ -82.35155, 34.828507 ], "pop" : 26926, "state" : "SC" } +{ "_id" : "29609", "city" : "GREENVILLE", "loc" : [ -82.400195, 34.892101 ], "pop" : 35346, "state" : "SC" } +{ "_id" : "29611", "city" : "GREENVILLE", "loc" : [ -82.449296, 34.85331 ], "pop" : 43522, "state" : "SC" } +{ "_id" : "29615", "city" : "GREENVILLE", "loc" : [ -82.31981500000001, 34.866095 ], "pop" : 25818, "state" : "SC" } +{ "_id" : "29620", "city" : "ABBEVILLE", "loc" : [ -82.378452, 34.18186 ], "pop" : 11344, "state" : "SC" } +{ "_id" : "29621", "city" : "ANDERSON", "loc" : [ -82.630436, 34.526051 ], "pop" : 24256, "state" : "SC" } +{ "_id" : "29624", "city" : "ANDERSON", "loc" : [ -82.677052, 34.474807 ], "pop" : 26962, "state" : "SC" } +{ "_id" : "29625", "city" : "ANDERSON", "loc" : [ -82.70868, 34.527134 ], "pop" : 20105, "state" : "SC" } +{ "_id" : "29627", "city" : "BELTON", "loc" : [ -82.51010599999999, 34.508715 ], "pop" : 11371, "state" : "SC" } +{ "_id" : "29628", "city" : "CALHOUN FALLS", "loc" : [ -82.580544, 34.099912 ], "pop" : 3289, "state" : "SC" } +{ "_id" : "29630", "city" : "CENTRAL", "loc" : [ -82.79472699999999, 34.74007 ], "pop" : 8226, "state" : "SC" } +{ "_id" : "29631", "city" : "CLEMSON", "loc" : [ -82.825003, 34.683061 ], "pop" : 17987, "state" : "SC" } +{ "_id" : "29635", "city" : "CLEVELAND", "loc" : [ -82.609256, 35.06537 ], "pop" : 960, "state" : "SC" } +{ "_id" : "29638", "city" : "SHOALS JUNCTION", "loc" : [ -82.36661599999999, 34.399772 ], "pop" : 1347, "state" : "SC" } +{ "_id" : "29639", "city" : "DUE WEST", "loc" : [ -82.400164, 34.334425 ], "pop" : 3499, "state" : "SC" } +{ "_id" : "29640", "city" : "EASLEY", "loc" : [ -82.57955200000001, 34.829031 ], "pop" : 37862, "state" : "SC" } +{ "_id" : "29642", "city" : "EASLEY", "loc" : [ -82.561716, 34.960694 ], "pop" : 830, "state" : "SC" } +{ "_id" : "29643", "city" : "FAIR PLAY", "loc" : [ -82.99987400000001, 34.577548 ], "pop" : 6110, "state" : "SC" } +{ "_id" : "29644", "city" : "FOUNTAIN INN", "loc" : [ -82.264593, 34.653334 ], "pop" : 15233, "state" : "SC" } +{ "_id" : "29645", "city" : "ORA", "loc" : [ -82.15703499999999, 34.580984 ], "pop" : 9987, "state" : "SC" } +{ "_id" : "29646", "city" : "GREENWOOD", "loc" : [ -82.156211, 34.175802 ], "pop" : 23138, "state" : "SC" } +{ "_id" : "29649", "city" : "GREENWOOD", "loc" : [ -82.15818899999999, 34.222988 ], "pop" : 18588, "state" : "SC" } +{ "_id" : "29650", "city" : "GREER", "loc" : [ -82.267442, 34.8968 ], "pop" : 16460, "state" : "SC" } +{ "_id" : "29651", "city" : "GREER", "loc" : [ -82.220857, 34.94532 ], "pop" : 26573, "state" : "SC" } +{ "_id" : "29653", "city" : "HODGES", "loc" : [ -82.214225, 34.288167 ], "pop" : 5262, "state" : "SC" } +{ "_id" : "29654", "city" : "HONEA PATH", "loc" : [ -82.425471, 34.441723 ], "pop" : 7621, "state" : "SC" } +{ "_id" : "29655", "city" : "IVA", "loc" : [ -82.657437, 34.319847 ], "pop" : 5342, "state" : "SC" } +{ "_id" : "29657", "city" : "LIBERTY", "loc" : [ -82.697429, 34.787189 ], "pop" : 9519, "state" : "SC" } +{ "_id" : "29658", "city" : "LONG CREEK", "loc" : [ -83.18472800000001, 34.754954 ], "pop" : 1972, "state" : "SC" } +{ "_id" : "29659", "city" : "LOWNDESVILLE", "loc" : [ -82.571021, 34.26624 ], "pop" : 2565, "state" : "SC" } +{ "_id" : "29661", "city" : "MARIETTA", "loc" : [ -82.513622, 35.029644 ], "pop" : 6321, "state" : "SC" } +{ "_id" : "29662", "city" : "MAULDIN", "loc" : [ -82.303507, 34.780675 ], "pop" : 8871, "state" : "SC" } +{ "_id" : "29664", "city" : "MOUNTAIN REST", "loc" : [ -83.11340199999999, 34.854119 ], "pop" : 1717, "state" : "SC" } +{ "_id" : "29666", "city" : "NINETY SIX", "loc" : [ -82.029185, 34.165198 ], "pop" : 8668, "state" : "SC" } +{ "_id" : "29667", "city" : "CATEECHEE", "loc" : [ -82.755492, 34.765472 ], "pop" : 738, "state" : "SC" } +{ "_id" : "29669", "city" : "PELZER", "loc" : [ -82.46733399999999, 34.646063 ], "pop" : 3224, "state" : "SC" } +{ "_id" : "29670", "city" : "PENDLETON", "loc" : [ -82.740623, 34.63694 ], "pop" : 12288, "state" : "SC" } +{ "_id" : "29671", "city" : "PICKENS", "loc" : [ -82.70578399999999, 34.902403 ], "pop" : 16227, "state" : "SC" } +{ "_id" : "29673", "city" : "PIEDMONT", "loc" : [ -82.47021599999999, 34.724433 ], "pop" : 24083, "state" : "SC" } +{ "_id" : "29676", "city" : "SALEM", "loc" : [ -82.96068699999999, 34.872836 ], "pop" : 4091, "state" : "SC" } +{ "_id" : "29678", "city" : "SENECA", "loc" : [ -82.936162, 34.682797 ], "pop" : 20361, "state" : "SC" } +{ "_id" : "29681", "city" : "SIMPSONVILLE", "loc" : [ -82.255009, 34.751228 ], "pop" : 28438, "state" : "SC" } +{ "_id" : "29682", "city" : "SIX MILE", "loc" : [ -82.82779499999999, 34.828287 ], "pop" : 2757, "state" : "SC" } +{ "_id" : "29684", "city" : "STARR", "loc" : [ -82.68971000000001, 34.396196 ], "pop" : 2995, "state" : "SC" } +{ "_id" : "29685", "city" : "SUNSET", "loc" : [ -82.80763899999999, 34.970617 ], "pop" : 850, "state" : "SC" } +{ "_id" : "29686", "city" : "TAMASSEE", "loc" : [ -82.986138, 34.898229 ], "pop" : 156, "state" : "SC" } +{ "_id" : "29687", "city" : "TAYLORS", "loc" : [ -82.31968000000001, 34.924517 ], "pop" : 32831, "state" : "SC" } +{ "_id" : "29688", "city" : "TIGERVILLE", "loc" : [ -82.35823600000001, 35.094443 ], "pop" : 231, "state" : "SC" } +{ "_id" : "29689", "city" : "TOWNVILLE", "loc" : [ -82.89633000000001, 34.522638 ], "pop" : 1784, "state" : "SC" } +{ "_id" : "29690", "city" : "TRAVELERS REST", "loc" : [ -82.427179, 35.003929 ], "pop" : 14029, "state" : "SC" } +{ "_id" : "29691", "city" : "WALHALLA", "loc" : [ -83.03877799999999, 34.768902 ], "pop" : 14047, "state" : "SC" } +{ "_id" : "29692", "city" : "WARE SHOALS", "loc" : [ -82.26779000000001, 34.402491 ], "pop" : 4442, "state" : "SC" } +{ "_id" : "29693", "city" : "MADISON", "loc" : [ -83.110782, 34.658857 ], "pop" : 8933, "state" : "SC" } +{ "_id" : "29696", "city" : "WEST UNION", "loc" : [ -83.03988699999999, 34.751572 ], "pop" : 170, "state" : "SC" } +{ "_id" : "29697", "city" : "WILLIAMSTON", "loc" : [ -82.51100599999999, 34.620572 ], "pop" : 13511, "state" : "SC" } +{ "_id" : "29702", "city" : "CHEROKEE FALLS", "loc" : [ -81.508004, 35.115047 ], "pop" : 7481, "state" : "SC" } +{ "_id" : "29704", "city" : "CATAWBA", "loc" : [ -80.93415400000001, 34.850712 ], "pop" : 2451, "state" : "SC" } +{ "_id" : "29706", "city" : "CHESTER", "loc" : [ -81.21856, 34.714897 ], "pop" : 21920, "state" : "SC" } +{ "_id" : "29709", "city" : "CHESTERFIELD", "loc" : [ -80.09577, 34.727834 ], "pop" : 6286, "state" : "SC" } +{ "_id" : "29710", "city" : "LAKE WYLIE", "loc" : [ -81.186358, 35.110728 ], "pop" : 17905, "state" : "SC" } +{ "_id" : "29712", "city" : "EDGEMOOR", "loc" : [ -80.98909500000001, 34.797006 ], "pop" : 1725, "state" : "SC" } +{ "_id" : "29714", "city" : "FORT LAWN", "loc" : [ -80.909175, 34.70064 ], "pop" : 2106, "state" : "SC" } +{ "_id" : "29715", "city" : "TEGA CAY", "loc" : [ -80.95855899999999, 35.026001 ], "pop" : 17343, "state" : "SC" } +{ "_id" : "29717", "city" : "HICKORY GROVE", "loc" : [ -81.430599, 34.970833 ], "pop" : 932, "state" : "SC" } +{ "_id" : "29718", "city" : "JEFFERSON", "loc" : [ -80.363934, 34.654581 ], "pop" : 3257, "state" : "SC" } +{ "_id" : "29720", "city" : "LANCASTER", "loc" : [ -80.76157600000001, 34.749006 ], "pop" : 43745, "state" : "SC" } +{ "_id" : "29726", "city" : "MC CONNELLS", "loc" : [ -81.23680299999999, 34.867667 ], "pop" : 1431, "state" : "SC" } +{ "_id" : "29727", "city" : "MOUNT CROGHAN", "loc" : [ -80.242791, 34.743895 ], "pop" : 1584, "state" : "SC" } +{ "_id" : "29728", "city" : "PAGELAND", "loc" : [ -80.396615, 34.772193 ], "pop" : 7778, "state" : "SC" } +{ "_id" : "29729", "city" : "RICHBURG", "loc" : [ -80.98906100000001, 34.682185 ], "pop" : 2393, "state" : "SC" } +{ "_id" : "29730", "city" : "ROCK HILL", "loc" : [ -81.01290400000001, 34.915068 ], "pop" : 41461, "state" : "SC" } +{ "_id" : "29732", "city" : "ROCK HILL", "loc" : [ -81.04888099999999, 34.968066 ], "pop" : 30532, "state" : "SC" } +{ "_id" : "29741", "city" : "RUBY", "loc" : [ -80.190966, 34.737928 ], "pop" : 478, "state" : "SC" } +{ "_id" : "29742", "city" : "SHARON", "loc" : [ -81.372907, 34.908396 ], "pop" : 1175, "state" : "SC" } +{ "_id" : "29743", "city" : "SMYRNA", "loc" : [ -81.389606, 35.030784 ], "pop" : 877, "state" : "SC" } +{ "_id" : "29745", "city" : "YORK", "loc" : [ -81.224462, 34.994669 ], "pop" : 17279, "state" : "SC" } +{ "_id" : "29801", "city" : "AIKEN", "loc" : [ -81.71942900000001, 33.553024 ], "pop" : 51233, "state" : "SC" } +{ "_id" : "29803", "city" : "AIKEN", "loc" : [ -81.594702, 33.531868 ], "pop" : 743, "state" : "SC" } +{ "_id" : "29809", "city" : "NEW ELLENTON", "loc" : [ -81.687376, 33.417242 ], "pop" : 2586, "state" : "SC" } +{ "_id" : "29810", "city" : "ALLENDALE", "loc" : [ -81.32025400000001, 33.007676 ], "pop" : 5704, "state" : "SC" } +{ "_id" : "29812", "city" : "BARNWELL", "loc" : [ -81.35231, 33.233492 ], "pop" : 11016, "state" : "SC" } +{ "_id" : "29817", "city" : "BLACKVILLE", "loc" : [ -81.271844, 33.364476 ], "pop" : 4254, "state" : "SC" } +{ "_id" : "29819", "city" : "BRADLEY", "loc" : [ -82.20272300000001, 34.032587 ], "pop" : 1287, "state" : "SC" } +{ "_id" : "29821", "city" : "CLARKS HILL", "loc" : [ -82.14875000000001, 33.65052 ], "pop" : 439, "state" : "SC" } +{ "_id" : "29824", "city" : "EDGEFIELD", "loc" : [ -81.96602, 33.805553 ], "pop" : 6884, "state" : "SC" } +{ "_id" : "29827", "city" : "FAIRFAX", "loc" : [ -81.25864, 32.951455 ], "pop" : 4017, "state" : "SC" } +{ "_id" : "29829", "city" : "GRANITEVILLE", "loc" : [ -81.81468599999999, 33.563016 ], "pop" : 2858, "state" : "SC" } +{ "_id" : "29831", "city" : "JACKSON", "loc" : [ -81.797628, 33.338886 ], "pop" : 2810, "state" : "SC" } +{ "_id" : "29832", "city" : "JOHNSTON", "loc" : [ -81.797242, 33.823075 ], "pop" : 4616, "state" : "SC" } +{ "_id" : "29835", "city" : "MC CORMICK", "loc" : [ -82.271862, 33.914646 ], "pop" : 5426, "state" : "SC" } +{ "_id" : "29836", "city" : "MARTIN", "loc" : [ -81.500304, 33.109286 ], "pop" : 566, "state" : "SC" } +{ "_id" : "29838", "city" : "MODOC", "loc" : [ -82.203469, 33.724894 ], "pop" : 380, "state" : "SC" } +{ "_id" : "29840", "city" : "MOUNT CARMEL", "loc" : [ -82.43607, 33.970323 ], "pop" : 1354, "state" : "SC" } +{ "_id" : "29841", "city" : "BEECH ISLAND", "loc" : [ -81.934794, 33.517766 ], "pop" : 45886, "state" : "SC" } +{ "_id" : "29843", "city" : "OLAR", "loc" : [ -81.16404199999999, 33.18364 ], "pop" : 1503, "state" : "SC" } +{ "_id" : "29845", "city" : "PLUM BRANCH", "loc" : [ -82.248041, 33.832893 ], "pop" : 1144, "state" : "SC" } +{ "_id" : "29847", "city" : "TRENTON", "loc" : [ -81.853392, 33.693757 ], "pop" : 2825, "state" : "SC" } +{ "_id" : "29848", "city" : "TROY", "loc" : [ -82.294077, 33.955654 ], "pop" : 125, "state" : "SC" } +{ "_id" : "29849", "city" : "ULMER", "loc" : [ -81.22129200000001, 33.057597 ], "pop" : 1241, "state" : "SC" } +{ "_id" : "29851", "city" : "WARRENVILLE", "loc" : [ -81.829397, 33.519917 ], "pop" : 8739, "state" : "SC" } +{ "_id" : "29853", "city" : "WILLISTON", "loc" : [ -81.416146, 33.392608 ], "pop" : 5011, "state" : "SC" } +{ "_id" : "29856", "city" : "WINDSOR", "loc" : [ -81.513626, 33.467446 ], "pop" : 2264, "state" : "SC" } +{ "_id" : "29902", "city" : "BURTON", "loc" : [ -80.70902599999999, 32.418035 ], "pop" : 43849, "state" : "SC" } +{ "_id" : "29910", "city" : "BLUFFTON", "loc" : [ -80.872079, 32.251275 ], "pop" : 6912, "state" : "SC" } +{ "_id" : "29911", "city" : "BRUNSON", "loc" : [ -81.180719, 32.941297 ], "pop" : 1422, "state" : "SC" } +{ "_id" : "29916", "city" : "EARLY BRANCH", "loc" : [ -81.030011, 32.628893 ], "pop" : 1494, "state" : "SC" } +{ "_id" : "29918", "city" : "ESTILL", "loc" : [ -81.21776800000001, 32.737514 ], "pop" : 6210, "state" : "SC" } +{ "_id" : "29920", "city" : "ST HELENA ISLAND", "loc" : [ -80.533863, 32.380213 ], "pop" : 4669, "state" : "SC" } +{ "_id" : "29922", "city" : "GARNETT", "loc" : [ -81.23962899999999, 32.600666 ], "pop" : 61, "state" : "SC" } +{ "_id" : "29924", "city" : "HAMPTON", "loc" : [ -81.09733300000001, 32.87288 ], "pop" : 5987, "state" : "SC" } +{ "_id" : "29926", "city" : "HILTON HEAD ISLA", "loc" : [ -80.728088, 32.229426 ], "pop" : 9480, "state" : "SC" } +{ "_id" : "29927", "city" : "HARDEEVILLE", "loc" : [ -81.06686500000001, 32.263512 ], "pop" : 4948, "state" : "SC" } +{ "_id" : "29928", "city" : "HILTON HEAD ISLA", "loc" : [ -80.75657699999999, 32.158718 ], "pop" : 14504, "state" : "SC" } +{ "_id" : "29929", "city" : "ISLANDTON", "loc" : [ -80.891589, 32.950324 ], "pop" : 119, "state" : "SC" } +{ "_id" : "29932", "city" : "LURAY", "loc" : [ -81.223506, 32.86177 ], "pop" : 687, "state" : "SC" } +{ "_id" : "29934", "city" : "PINELAND", "loc" : [ -81.17611599999999, 32.602065 ], "pop" : 925, "state" : "SC" } +{ "_id" : "29935", "city" : "PORT ROYAL", "loc" : [ -80.69278, 32.384205 ], "pop" : 2526, "state" : "SC" } +{ "_id" : "29936", "city" : "COOSAWATCHIE", "loc" : [ -80.94943499999999, 32.491938 ], "pop" : 6342, "state" : "SC" } +{ "_id" : "29940", "city" : "SEABROOK", "loc" : [ -80.740793, 32.526884 ], "pop" : 915, "state" : "SC" } +{ "_id" : "29943", "city" : "TILLMAN", "loc" : [ -81.077567, 32.492719 ], "pop" : 1679, "state" : "SC" } +{ "_id" : "29944", "city" : "VARNVILLE", "loc" : [ -81.028839, 32.834893 ], "pop" : 1890, "state" : "SC" } +{ "_id" : "29945", "city" : "YEMASSEE", "loc" : [ -80.812932, 32.642983 ], "pop" : 5421, "state" : "SC" } +{ "_id" : "30001", "city" : "AUSTELL", "loc" : [ -84.605026, 33.807226 ], "pop" : 25021, "state" : "GA" } +{ "_id" : "30002", "city" : "AVONDALE ESTATES", "loc" : [ -84.26069099999999, 33.771727 ], "pop" : 4459, "state" : "GA" } +{ "_id" : "30021", "city" : "CLARKSTON", "loc" : [ -84.23882500000001, 33.810107 ], "pop" : 17325, "state" : "GA" } +{ "_id" : "30027", "city" : "CONLEY", "loc" : [ -84.32757100000001, 33.645104 ], "pop" : 6815, "state" : "GA" } +{ "_id" : "30030", "city" : "DECATUR", "loc" : [ -84.295044, 33.769883 ], "pop" : 23185, "state" : "GA" } +{ "_id" : "30032", "city" : "DECATUR", "loc" : [ -84.263165, 33.740825 ], "pop" : 56056, "state" : "GA" } +{ "_id" : "30033", "city" : "DECATUR", "loc" : [ -84.281918, 33.812305 ], "pop" : 22071, "state" : "GA" } +{ "_id" : "30034", "city" : "DECATUR", "loc" : [ -84.24893899999999, 33.695385 ], "pop" : 32312, "state" : "GA" } +{ "_id" : "30035", "city" : "DECATUR", "loc" : [ -84.21429999999999, 33.72784 ], "pop" : 15062, "state" : "GA" } +{ "_id" : "30038", "city" : "LITHONIA", "loc" : [ -84.16099699999999, 33.682311 ], "pop" : 15583, "state" : "GA" } +{ "_id" : "30049", "city" : "ELLENWOOD", "loc" : [ -84.26433299999999, 33.635376 ], "pop" : 16742, "state" : "GA" } +{ "_id" : "30050", "city" : "FOREST PARK", "loc" : [ -84.367075, 33.609737 ], "pop" : 26825, "state" : "GA" } +{ "_id" : "30057", "city" : "LITHIA SPRINGS", "loc" : [ -84.66081, 33.772999 ], "pop" : 14533, "state" : "GA" } +{ "_id" : "30058", "city" : "CENTERVILLE GWIN", "loc" : [ -84.09929099999999, 33.746412 ], "pop" : 37322, "state" : "GA" } +{ "_id" : "30059", "city" : "MABLETON", "loc" : [ -84.565062, 33.816572 ], "pop" : 22519, "state" : "GA" } +{ "_id" : "30060", "city" : "MARIETTA", "loc" : [ -84.564881, 33.909199 ], "pop" : 52530, "state" : "GA" } +{ "_id" : "30062", "city" : "MARIETTA", "loc" : [ -84.463291, 34.002521 ], "pop" : 52642, "state" : "GA" } +{ "_id" : "30064", "city" : "MARIETTA", "loc" : [ -84.607584, 33.934285 ], "pop" : 30260, "state" : "GA" } +{ "_id" : "30066", "city" : "MARIETTA", "loc" : [ -84.503817, 34.037807 ], "pop" : 41948, "state" : "GA" } +{ "_id" : "30067", "city" : "MARIETTA", "loc" : [ -84.473251, 33.928198 ], "pop" : 40460, "state" : "GA" } +{ "_id" : "30068", "city" : "MARIETTA", "loc" : [ -84.43854899999999, 33.967861 ], "pop" : 29488, "state" : "GA" } +{ "_id" : "30071", "city" : "NORCROSS", "loc" : [ -84.197158, 33.938145 ], "pop" : 16266, "state" : "GA" } +{ "_id" : "30073", "city" : "POWDER SPRINGS", "loc" : [ -84.68564499999999, 33.875377 ], "pop" : 27767, "state" : "GA" } +{ "_id" : "30075", "city" : "ROSWELL", "loc" : [ -84.385901, 34.040832 ], "pop" : 32144, "state" : "GA" } +{ "_id" : "30076", "city" : "ROSWELL", "loc" : [ -84.310408, 34.021324 ], "pop" : 34027, "state" : "GA" } +{ "_id" : "30079", "city" : "SCOTTDALE", "loc" : [ -84.258521, 33.793396 ], "pop" : 3288, "state" : "GA" } +{ "_id" : "30080", "city" : "SMYRNA", "loc" : [ -84.502284, 33.879602 ], "pop" : 36899, "state" : "GA" } +{ "_id" : "30082", "city" : "SMYRNA", "loc" : [ -84.538234, 33.863051 ], "pop" : 17917, "state" : "GA" } +{ "_id" : "30083", "city" : "STONE MOUNTAIN", "loc" : [ -84.20175399999999, 33.794233 ], "pop" : 48785, "state" : "GA" } +{ "_id" : "30084", "city" : "TUCKER", "loc" : [ -84.21602, 33.856986 ], "pop" : 29307, "state" : "GA" } +{ "_id" : "30087", "city" : "STONE MOUNTAIN", "loc" : [ -84.128829, 33.811511 ], "pop" : 27251, "state" : "GA" } +{ "_id" : "30088", "city" : "STONE MOUNTAIN", "loc" : [ -84.18022000000001, 33.75798 ], "pop" : 24029, "state" : "GA" } +{ "_id" : "30092", "city" : "NORCROSS", "loc" : [ -84.243787, 33.967688 ], "pop" : 19901, "state" : "GA" } +{ "_id" : "30093", "city" : "NORCROSS", "loc" : [ -84.183953, 33.905964 ], "pop" : 32345, "state" : "GA" } +{ "_id" : "30101", "city" : "ACWORTH", "loc" : [ -84.647741, 34.075627 ], "pop" : 37976, "state" : "GA" } +{ "_id" : "30103", "city" : "ADAIRSVILLE", "loc" : [ -84.91763400000001, 34.359527 ], "pop" : 7273, "state" : "GA" } +{ "_id" : "30104", "city" : "ARAGON", "loc" : [ -85.069559, 34.066556 ], "pop" : 4692, "state" : "GA" } +{ "_id" : "30105", "city" : "ARMUCHEE", "loc" : [ -85.184298, 34.441082 ], "pop" : 2131, "state" : "GA" } +{ "_id" : "30107", "city" : "BALL GROUND", "loc" : [ -84.375756, 34.339262 ], "pop" : 4064, "state" : "GA" } +{ "_id" : "30108", "city" : "BOWDON", "loc" : [ -85.25329000000001, 33.537259 ], "pop" : 7318, "state" : "GA" } +{ "_id" : "30110", "city" : "BREMEN", "loc" : [ -85.128638, 33.730872 ], "pop" : 8495, "state" : "GA" } +{ "_id" : "30113", "city" : "BUCHANAN", "loc" : [ -85.15055099999999, 33.82828 ], "pop" : 5931, "state" : "GA" } +{ "_id" : "30114", "city" : "CANTON", "loc" : [ -84.457756, 34.205874 ], "pop" : 35773, "state" : "GA" } +{ "_id" : "30117", "city" : "CARROLLTON", "loc" : [ -85.081211, 33.579751 ], "pop" : 40344, "state" : "GA" } +{ "_id" : "30120", "city" : "CARTERSVILLE", "loc" : [ -84.820401, 34.186975 ], "pop" : 33846, "state" : "GA" } +{ "_id" : "30124", "city" : "CAVE SPRING", "loc" : [ -85.337906, 34.116683 ], "pop" : 2650, "state" : "GA" } +{ "_id" : "30125", "city" : "CEDARTOWN", "loc" : [ -85.24590000000001, 34.011196 ], "pop" : 20720, "state" : "GA" } +{ "_id" : "30130", "city" : "CUMMING", "loc" : [ -84.146762, 34.220197 ], "pop" : 35496, "state" : "GA" } +{ "_id" : "30132", "city" : "DALLAS", "loc" : [ -84.827791, 33.916315 ], "pop" : 28118, "state" : "GA" } +{ "_id" : "30134", "city" : "DOUGLASVILLE", "loc" : [ -84.747719, 33.760645 ], "pop" : 17182, "state" : "GA" } +{ "_id" : "30135", "city" : "DOUGLASVILLE", "loc" : [ -84.745441, 33.698936 ], "pop" : 32887, "state" : "GA" } +{ "_id" : "30136", "city" : "DULUTH", "loc" : [ -84.15793600000001, 33.98619 ], "pop" : 30932, "state" : "GA" } +{ "_id" : "30137", "city" : "EMERSON", "loc" : [ -84.75704500000001, 34.119969 ], "pop" : 1353, "state" : "GA" } +{ "_id" : "30139", "city" : "FAIRMOUNT", "loc" : [ -84.76687800000001, 34.465241 ], "pop" : 3405, "state" : "GA" } +{ "_id" : "30140", "city" : "FELTON", "loc" : [ -85.220781, 33.887066 ], "pop" : 489, "state" : "GA" } +{ "_id" : "30141", "city" : "HIRAM", "loc" : [ -84.769875, 33.867286 ], "pop" : 6613, "state" : "GA" } +{ "_id" : "30143", "city" : "JASPER", "loc" : [ -84.475881, 34.461965 ], "pop" : 8256, "state" : "GA" } +{ "_id" : "30144", "city" : "KENNESAW", "loc" : [ -84.60466, 34.028656 ], "pop" : 37120, "state" : "GA" } +{ "_id" : "30145", "city" : "KINGSTON", "loc" : [ -84.997299, 34.250053 ], "pop" : 2534, "state" : "GA" } +{ "_id" : "30147", "city" : "LINDALE", "loc" : [ -85.182491, 34.170741 ], "pop" : 3502, "state" : "GA" } +{ "_id" : "30148", "city" : "MARBLE HILL", "loc" : [ -84.33715100000001, 34.415353 ], "pop" : 98, "state" : "GA" } +{ "_id" : "30153", "city" : "ROCKMART", "loc" : [ -85.05937, 33.997912 ], "pop" : 8946, "state" : "GA" } +{ "_id" : "30161", "city" : "ROME", "loc" : [ -85.146501, 34.250726 ], "pop" : 33058, "state" : "GA" } +{ "_id" : "30165", "city" : "ROME", "loc" : [ -85.223122, 34.283679 ], "pop" : 32739, "state" : "GA" } +{ "_id" : "30170", "city" : "ROOPVILLE", "loc" : [ -85.167148, 33.432226 ], "pop" : 2952, "state" : "GA" } +{ "_id" : "30171", "city" : "PINE LOG", "loc" : [ -84.780315, 34.392732 ], "pop" : 2257, "state" : "GA" } +{ "_id" : "30173", "city" : "SILVER CREEK", "loc" : [ -85.142933, 34.159272 ], "pop" : 5968, "state" : "GA" } +{ "_id" : "30174", "city" : "SUWANEE", "loc" : [ -84.082391, 34.057245 ], "pop" : 5965, "state" : "GA" } +{ "_id" : "30175", "city" : "TALKING ROCK", "loc" : [ -84.49115399999999, 34.539356 ], "pop" : 3037, "state" : "GA" } +{ "_id" : "30176", "city" : "TALLAPOOSA", "loc" : [ -85.30004700000001, 33.760174 ], "pop" : 6172, "state" : "GA" } +{ "_id" : "30177", "city" : "TATE", "loc" : [ -84.36529899999999, 34.42387 ], "pop" : 4286, "state" : "GA" } +{ "_id" : "30178", "city" : "TAYLORSVILLE", "loc" : [ -84.973859, 34.122941 ], "pop" : 2360, "state" : "GA" } +{ "_id" : "30179", "city" : "TEMPLE", "loc" : [ -85.01331500000001, 33.767687 ], "pop" : 7111, "state" : "GA" } +{ "_id" : "30180", "city" : "VILLA RICA", "loc" : [ -84.929697, 33.71729 ], "pop" : 12063, "state" : "GA" } +{ "_id" : "30182", "city" : "WACO", "loc" : [ -85.219674, 33.683986 ], "pop" : 2297, "state" : "GA" } +{ "_id" : "30183", "city" : "WALESKA", "loc" : [ -84.561981, 34.321662 ], "pop" : 3576, "state" : "GA" } +{ "_id" : "30184", "city" : "WHITE", "loc" : [ -84.738327, 34.271683 ], "pop" : 3231, "state" : "GA" } +{ "_id" : "30185", "city" : "WHITESBURG", "loc" : [ -84.925426, 33.511093 ], "pop" : 3115, "state" : "GA" } +{ "_id" : "30187", "city" : "WINSTON", "loc" : [ -84.86391500000001, 33.663419 ], "pop" : 6850, "state" : "GA" } +{ "_id" : "30188", "city" : "WOODSTOCK", "loc" : [ -84.511683, 34.106005 ], "pop" : 33172, "state" : "GA" } +{ "_id" : "30201", "city" : "ALPHARETTA", "loc" : [ -84.29516700000001, 34.107677 ], "pop" : 19393, "state" : "GA" } +{ "_id" : "30202", "city" : "ALPHARETTA", "loc" : [ -84.238972, 34.035487 ], "pop" : 24814, "state" : "GA" } +{ "_id" : "30203", "city" : "AUBURN", "loc" : [ -83.824128, 34.007758 ], "pop" : 6457, "state" : "GA" } +{ "_id" : "30204", "city" : "BARNESVILLE", "loc" : [ -84.15147, 33.045713 ], "pop" : 9595, "state" : "GA" } +{ "_id" : "30205", "city" : "BROOKS", "loc" : [ -84.476941, 33.298433 ], "pop" : 1662, "state" : "GA" } +{ "_id" : "30206", "city" : "CONCORD", "loc" : [ -84.447025, 33.099836 ], "pop" : 1591, "state" : "GA" } +{ "_id" : "30207", "city" : "CONYERS", "loc" : [ -84.019818, 33.682932 ], "pop" : 24526, "state" : "GA" } +{ "_id" : "30208", "city" : "CONYERS", "loc" : [ -84.01268899999999, 33.607711 ], "pop" : 24236, "state" : "GA" } +{ "_id" : "30209", "city" : "STARRSVILLE", "loc" : [ -83.89075200000001, 33.570328 ], "pop" : 35231, "state" : "GA" } +{ "_id" : "30211", "city" : "DACULA", "loc" : [ -83.883849, 33.988234 ], "pop" : 7320, "state" : "GA" } +{ "_id" : "30213", "city" : "FAIRBURN", "loc" : [ -84.58085699999999, 33.56482 ], "pop" : 14110, "state" : "GA" } +{ "_id" : "30214", "city" : "WOOLSEY", "loc" : [ -84.46358600000001, 33.448054 ], "pop" : 35007, "state" : "GA" } +{ "_id" : "30216", "city" : "FLOVILLA", "loc" : [ -83.907938, 33.250012 ], "pop" : 2238, "state" : "GA" } +{ "_id" : "30217", "city" : "GLENN", "loc" : [ -85.105459, 33.291073 ], "pop" : 7230, "state" : "GA" } +{ "_id" : "30218", "city" : "ALVATON", "loc" : [ -84.58057599999999, 33.149902 ], "pop" : 2327, "state" : "GA" } +{ "_id" : "30220", "city" : "GRANTVILLE", "loc" : [ -84.83497699999999, 33.247253 ], "pop" : 1825, "state" : "GA" } +{ "_id" : "30221", "city" : "GRAYSON", "loc" : [ -83.97984599999999, 33.898344 ], "pop" : 5528, "state" : "GA" } +{ "_id" : "30222", "city" : "STOVALL", "loc" : [ -84.74217299999999, 33.037169 ], "pop" : 4507, "state" : "GA" } +{ "_id" : "30223", "city" : "GRIFFIN", "loc" : [ -84.27275899999999, 33.2549 ], "pop" : 53247, "state" : "GA" } +{ "_id" : "30228", "city" : "HAMPTON", "loc" : [ -84.29474399999999, 33.412398 ], "pop" : 10969, "state" : "GA" } +{ "_id" : "30230", "city" : "HOGANSVILLE", "loc" : [ -84.93085600000001, 33.164382 ], "pop" : 6378, "state" : "GA" } +{ "_id" : "30233", "city" : "JACKSON", "loc" : [ -83.978391, 33.282006 ], "pop" : 13206, "state" : "GA" } +{ "_id" : "30234", "city" : "JENKINSBURG", "loc" : [ -84.026122, 33.318619 ], "pop" : 1242, "state" : "GA" } +{ "_id" : "30236", "city" : "JONESBORO", "loc" : [ -84.358968, 33.524236 ], "pop" : 55409, "state" : "GA" } +{ "_id" : "30240", "city" : "LA GRANGE", "loc" : [ -85.039511, 33.034025 ], "pop" : 43081, "state" : "GA" } +{ "_id" : "30243", "city" : "LAWRENCEVILLE", "loc" : [ -84.014944, 34.005049 ], "pop" : 24119, "state" : "GA" } +{ "_id" : "30244", "city" : "LAWRENCEVILLE", "loc" : [ -84.08165200000001, 33.923781 ], "pop" : 37778, "state" : "GA" } +{ "_id" : "30245", "city" : "LAWRENCEVILLE", "loc" : [ -83.996413, 33.944293 ], "pop" : 30171, "state" : "GA" } +{ "_id" : "30247", "city" : "LILBURN", "loc" : [ -84.119595, 33.873182 ], "pop" : 46637, "state" : "GA" } +{ "_id" : "30248", "city" : "LOCUST GROVE", "loc" : [ -84.09824999999999, 33.344936 ], "pop" : 5812, "state" : "GA" } +{ "_id" : "30249", "city" : "LOGANVILLE", "loc" : [ -83.903631, 33.83366 ], "pop" : 14843, "state" : "GA" } +{ "_id" : "30251", "city" : "LUTHERSVILLE", "loc" : [ -84.757707, 33.179817 ], "pop" : 3389, "state" : "GA" } +{ "_id" : "30253", "city" : "MC DONOUGH", "loc" : [ -84.135751, 33.46466 ], "pop" : 18550, "state" : "GA" } +{ "_id" : "30255", "city" : "MANSFIELD", "loc" : [ -83.727638, 33.540373 ], "pop" : 1438, "state" : "GA" } +{ "_id" : "30256", "city" : "MEANSVILLE", "loc" : [ -84.31693799999999, 33.013387 ], "pop" : 1668, "state" : "GA" } +{ "_id" : "30257", "city" : "MILNER", "loc" : [ -84.175909, 33.141023 ], "pop" : 3789, "state" : "GA" } +{ "_id" : "30258", "city" : "MOLENA", "loc" : [ -84.45578, 32.997845 ], "pop" : 2055, "state" : "GA" } +{ "_id" : "30259", "city" : "MORELAND", "loc" : [ -84.75655999999999, 33.273437 ], "pop" : 2056, "state" : "GA" } +{ "_id" : "30260", "city" : "MORROW", "loc" : [ -84.32469500000001, 33.584934 ], "pop" : 20584, "state" : "GA" } +{ "_id" : "30262", "city" : "NEWBORN", "loc" : [ -83.668396, 33.494923 ], "pop" : 1491, "state" : "GA" } +{ "_id" : "30263", "city" : "RAYMOND", "loc" : [ -84.816952, 33.389404 ], "pop" : 32379, "state" : "GA" } +{ "_id" : "30265", "city" : "NEWNAN", "loc" : [ -84.712062, 33.39576 ], "pop" : 5345, "state" : "GA" } +{ "_id" : "30267", "city" : "OXFORD", "loc" : [ -83.863517, 33.686474 ], "pop" : 10601, "state" : "GA" } +{ "_id" : "30268", "city" : "PALMETTO", "loc" : [ -84.678999, 33.524195 ], "pop" : 5838, "state" : "GA" } +{ "_id" : "30269", "city" : "PEACHTREE CITY", "loc" : [ -84.563478, 33.391467 ], "pop" : 18724, "state" : "GA" } +{ "_id" : "30273", "city" : "REX", "loc" : [ -84.278228, 33.580805 ], "pop" : 7218, "state" : "GA" } +{ "_id" : "30274", "city" : "RIVERDALE", "loc" : [ -84.40034799999999, 33.553126 ], "pop" : 23621, "state" : "GA" } +{ "_id" : "30276", "city" : "SENOIA", "loc" : [ -84.591779, 33.284459 ], "pop" : 4653, "state" : "GA" } +{ "_id" : "30277", "city" : "SHARPSBURG", "loc" : [ -84.654027, 33.401287 ], "pop" : 5956, "state" : "GA" } +{ "_id" : "30278", "city" : "SNELLVILLE", "loc" : [ -84.02801100000001, 33.848607 ], "pop" : 34314, "state" : "GA" } +{ "_id" : "30279", "city" : "SOCIAL CIRCLE", "loc" : [ -83.706149, 33.656386 ], "pop" : 4598, "state" : "GA" } +{ "_id" : "30281", "city" : "STOCKBRIDGE", "loc" : [ -84.21648999999999, 33.563343 ], "pop" : 25401, "state" : "GA" } +{ "_id" : "30285", "city" : "THE ROCK", "loc" : [ -84.24235899999999, 32.971734 ], "pop" : 333, "state" : "GA" } +{ "_id" : "30286", "city" : "THOMASTON", "loc" : [ -84.33240000000001, 32.901534 ], "pop" : 22925, "state" : "GA" } +{ "_id" : "30290", "city" : "TYRONE", "loc" : [ -84.591357, 33.471948 ], "pop" : 3555, "state" : "GA" } +{ "_id" : "30291", "city" : "UNION CITY", "loc" : [ -84.549853, 33.583155 ], "pop" : 7411, "state" : "GA" } +{ "_id" : "30292", "city" : "WILLIAMSON", "loc" : [ -84.379493, 33.159838 ], "pop" : 2940, "state" : "GA" } +{ "_id" : "30293", "city" : "WOODBURY", "loc" : [ -84.59863199999999, 32.981318 ], "pop" : 3648, "state" : "GA" } +{ "_id" : "30295", "city" : "ZEBULON", "loc" : [ -84.310827, 33.100235 ], "pop" : 2470, "state" : "GA" } +{ "_id" : "30296", "city" : "RIVERDALE", "loc" : [ -84.43644999999999, 33.566716 ], "pop" : 18577, "state" : "GA" } +{ "_id" : "30303", "city" : "ATLANTA", "loc" : [ -84.388846, 33.752504 ], "pop" : 1845, "state" : "GA" } +{ "_id" : "30305", "city" : "ATLANTA", "loc" : [ -84.38514499999999, 33.831963 ], "pop" : 19122, "state" : "GA" } +{ "_id" : "30306", "city" : "ATLANTA", "loc" : [ -84.351418, 33.786027 ], "pop" : 20081, "state" : "GA" } +{ "_id" : "30307", "city" : "ATLANTA", "loc" : [ -84.33595699999999, 33.769138 ], "pop" : 16330, "state" : "GA" } +{ "_id" : "30308", "city" : "ATLANTA", "loc" : [ -84.375744, 33.771839 ], "pop" : 8549, "state" : "GA" } +{ "_id" : "30309", "city" : "ATLANTA", "loc" : [ -84.388338, 33.798407 ], "pop" : 14766, "state" : "GA" } +{ "_id" : "30310", "city" : "ATLANTA", "loc" : [ -84.42317300000001, 33.727849 ], "pop" : 34017, "state" : "GA" } +{ "_id" : "30311", "city" : "ATLANTA", "loc" : [ -84.470219, 33.722957 ], "pop" : 34880, "state" : "GA" } +{ "_id" : "30312", "city" : "ATLANTA", "loc" : [ -84.378125, 33.746749 ], "pop" : 17683, "state" : "GA" } +{ "_id" : "30313", "city" : "ATLANTA", "loc" : [ -84.39352, 33.76825 ], "pop" : 8038, "state" : "GA" } +{ "_id" : "30314", "city" : "ATLANTA", "loc" : [ -84.425546, 33.756103 ], "pop" : 26649, "state" : "GA" } +{ "_id" : "30315", "city" : "ATLANTA", "loc" : [ -84.380771, 33.705062 ], "pop" : 41061, "state" : "GA" } +{ "_id" : "30316", "city" : "ATLANTA", "loc" : [ -84.333913, 33.721686 ], "pop" : 34668, "state" : "GA" } +{ "_id" : "30317", "city" : "ATLANTA", "loc" : [ -84.31685, 33.749788 ], "pop" : 16395, "state" : "GA" } +{ "_id" : "30318", "city" : "ATLANTA", "loc" : [ -84.445432, 33.786454 ], "pop" : 53894, "state" : "GA" } +{ "_id" : "30319", "city" : "ATLANTA", "loc" : [ -84.33509100000001, 33.868728 ], "pop" : 32138, "state" : "GA" } +{ "_id" : "30324", "city" : "ATLANTA", "loc" : [ -84.354867, 33.820609 ], "pop" : 15044, "state" : "GA" } +{ "_id" : "30326", "city" : "ATLANTA", "loc" : [ -84.358232, 33.848168 ], "pop" : 125, "state" : "GA" } +{ "_id" : "30327", "city" : "ATLANTA", "loc" : [ -84.419966, 33.862723 ], "pop" : 18467, "state" : "GA" } +{ "_id" : "30328", "city" : "SANDY SPRINGS", "loc" : [ -84.38114299999999, 33.936295 ], "pop" : 24238, "state" : "GA" } +{ "_id" : "30329", "city" : "ATLANTA", "loc" : [ -84.32140200000001, 33.823555 ], "pop" : 17013, "state" : "GA" } +{ "_id" : "30330", "city" : "ATLANTA", "loc" : [ -84.434735, 33.70645 ], "pop" : 643, "state" : "GA" } +{ "_id" : "30331", "city" : "ATLANTA", "loc" : [ -84.52046799999999, 33.72241 ], "pop" : 38185, "state" : "GA" } +{ "_id" : "30334", "city" : "ATLANTA", "loc" : [ -84.388188, 33.74715 ], "pop" : 0, "state" : "GA" } +{ "_id" : "30336", "city" : "ATLANTA", "loc" : [ -84.51002800000001, 33.78534 ], "pop" : 1228, "state" : "GA" } +{ "_id" : "30337", "city" : "COLLEGE PARK", "loc" : [ -84.460849, 33.644227 ], "pop" : 18106, "state" : "GA" } +{ "_id" : "30338", "city" : "DUNWOODY", "loc" : [ -84.316529, 33.944313 ], "pop" : 23565, "state" : "GA" } +{ "_id" : "30339", "city" : "ATLANTA", "loc" : [ -84.462879, 33.87125 ], "pop" : 11158, "state" : "GA" } +{ "_id" : "30340", "city" : "DORAVILLE", "loc" : [ -84.248265, 33.896377 ], "pop" : 22862, "state" : "GA" } +{ "_id" : "30341", "city" : "CHAMBLEE", "loc" : [ -84.286969, 33.886727 ], "pop" : 26846, "state" : "GA" } +{ "_id" : "30342", "city" : "ATLANTA", "loc" : [ -84.376091, 33.884245 ], "pop" : 19057, "state" : "GA" } +{ "_id" : "30344", "city" : "EAST POINT", "loc" : [ -84.457292, 33.676214 ], "pop" : 33489, "state" : "GA" } +{ "_id" : "30345", "city" : "ATLANTA", "loc" : [ -84.28696100000001, 33.851347 ], "pop" : 19825, "state" : "GA" } +{ "_id" : "30346", "city" : "ATLANTA", "loc" : [ -84.333354, 33.926717 ], "pop" : 18, "state" : "GA" } +{ "_id" : "30349", "city" : "ATLANTA", "loc" : [ -84.481258, 33.605331 ], "pop" : 48116, "state" : "GA" } +{ "_id" : "30350", "city" : "ATLANTA", "loc" : [ -84.34114599999999, 33.979471 ], "pop" : 24573, "state" : "GA" } +{ "_id" : "30354", "city" : "HAPEVILLE", "loc" : [ -84.38702499999999, 33.66546 ], "pop" : 16349, "state" : "GA" } +{ "_id" : "30360", "city" : "ATLANTA", "loc" : [ -84.27164500000001, 33.937772 ], "pop" : 16023, "state" : "GA" } +{ "_id" : "30401", "city" : "OAK PARK", "loc" : [ -82.338668, 32.581938 ], "pop" : 12918, "state" : "GA" } +{ "_id" : "30410", "city" : "AILEY", "loc" : [ -82.47619, 32.214262 ], "pop" : 1004, "state" : "GA" } +{ "_id" : "30411", "city" : "ALAMO", "loc" : [ -82.794445, 32.13298 ], "pop" : 2584, "state" : "GA" } +{ "_id" : "30413", "city" : "BARTOW", "loc" : [ -82.470788, 32.863186 ], "pop" : 945, "state" : "GA" } +{ "_id" : "30415", "city" : "BROOKLET", "loc" : [ -81.62800300000001, 32.294046 ], "pop" : 4850, "state" : "GA" } +{ "_id" : "30417", "city" : "CLAXTON", "loc" : [ -81.90803200000001, 32.165009 ], "pop" : 8724, "state" : "GA" } +{ "_id" : "30420", "city" : "COBBTOWN", "loc" : [ -82.133274, 32.264237 ], "pop" : 1482, "state" : "GA" } +{ "_id" : "30421", "city" : "COLLINS", "loc" : [ -82.10948, 32.185228 ], "pop" : 1298, "state" : "GA" } +{ "_id" : "30425", "city" : "GARFIELD", "loc" : [ -82.085599, 32.600776 ], "pop" : 593, "state" : "GA" } +{ "_id" : "30426", "city" : "GIRARD", "loc" : [ -81.710581, 33.043689 ], "pop" : 1074, "state" : "GA" } +{ "_id" : "30427", "city" : "GLENNVILLE", "loc" : [ -81.948313, 31.946708 ], "pop" : 7702, "state" : "GA" } +{ "_id" : "30428", "city" : "GLENWOOD", "loc" : [ -82.675881, 32.157243 ], "pop" : 2319, "state" : "GA" } +{ "_id" : "30434", "city" : "LOUISVILLE", "loc" : [ -82.383616, 33.016342 ], "pop" : 7089, "state" : "GA" } +{ "_id" : "30436", "city" : "LYONS", "loc" : [ -82.307783, 32.171148 ], "pop" : 8675, "state" : "GA" } +{ "_id" : "30438", "city" : "MANASSAS", "loc" : [ -82.052925, 32.096551 ], "pop" : 955, "state" : "GA" } +{ "_id" : "30439", "city" : "METTER", "loc" : [ -82.060722, 32.401034 ], "pop" : 7744, "state" : "GA" } +{ "_id" : "30441", "city" : "MIDVILLE", "loc" : [ -82.20418100000001, 32.863794 ], "pop" : 1533, "state" : "GA" } +{ "_id" : "30442", "city" : "MILLEN", "loc" : [ -81.96180699999999, 32.787739 ], "pop" : 7700, "state" : "GA" } +{ "_id" : "30445", "city" : "MOUNT VERNON", "loc" : [ -82.58672, 32.18398 ], "pop" : 3097, "state" : "GA" } +{ "_id" : "30446", "city" : "NEWINGTON", "loc" : [ -81.532686, 32.588385 ], "pop" : 2296, "state" : "GA" } +{ "_id" : "30450", "city" : "PORTAL", "loc" : [ -81.912257, 32.55504 ], "pop" : 3160, "state" : "GA" } +{ "_id" : "30452", "city" : "REGISTER", "loc" : [ -81.872828, 32.338235 ], "pop" : 1655, "state" : "GA" } +{ "_id" : "30453", "city" : "REIDSVILLE", "loc" : [ -82.147809, 32.054759 ], "pop" : 6286, "state" : "GA" } +{ "_id" : "30454", "city" : "ROCKLEDGE", "loc" : [ -82.747939, 32.391507 ], "pop" : 160, "state" : "GA" } +{ "_id" : "30455", "city" : "ROCKY FORD", "loc" : [ -81.741749, 32.656863 ], "pop" : 1554, "state" : "GA" } +{ "_id" : "30456", "city" : "SARDIS", "loc" : [ -81.773039, 32.980946 ], "pop" : 1901, "state" : "GA" } +{ "_id" : "30457", "city" : "SOPERTON", "loc" : [ -82.587098, 32.386861 ], "pop" : 5996, "state" : "GA" } +{ "_id" : "30458", "city" : "STATESBORO", "loc" : [ -81.773956, 32.440841 ], "pop" : 33469, "state" : "GA" } +{ "_id" : "30467", "city" : "HILTONIA", "loc" : [ -81.633394, 32.77627 ], "pop" : 9991, "state" : "GA" } +{ "_id" : "30470", "city" : "TARRYTOWN", "loc" : [ -82.51693299999999, 32.290623 ], "pop" : 1181, "state" : "GA" } +{ "_id" : "30471", "city" : "TWIN CITY", "loc" : [ -82.197856, 32.612926 ], "pop" : 5531, "state" : "GA" } +{ "_id" : "30473", "city" : "UVALDA", "loc" : [ -82.50887899999999, 32.048271 ], "pop" : 1881, "state" : "GA" } +{ "_id" : "30474", "city" : "VIDALIA", "loc" : [ -82.406724, 32.193408 ], "pop" : 15396, "state" : "GA" } +{ "_id" : "30477", "city" : "WADLEY", "loc" : [ -82.40245899999999, 32.874742 ], "pop" : 3376, "state" : "GA" } +{ "_id" : "30501", "city" : "GAINESVILLE", "loc" : [ -83.825596, 34.307269 ], "pop" : 22334, "state" : "GA" } +{ "_id" : "30504", "city" : "GAINESVILLE", "loc" : [ -83.879311, 34.272281 ], "pop" : 10061, "state" : "GA" } +{ "_id" : "30506", "city" : "GAINESVILLE", "loc" : [ -83.888211, 34.356227 ], "pop" : 22232, "state" : "GA" } +{ "_id" : "30507", "city" : "GAINESVILLE", "loc" : [ -83.771625, 34.25915 ], "pop" : 13327, "state" : "GA" } +{ "_id" : "30510", "city" : "ALTO", "loc" : [ -83.601996, 34.459079 ], "pop" : 4701, "state" : "GA" } +{ "_id" : "30511", "city" : "BALDWIN", "loc" : [ -83.529781, 34.456411 ], "pop" : 3969, "state" : "GA" } +{ "_id" : "30512", "city" : "BLAIRSVILLE", "loc" : [ -83.99202699999999, 34.876253 ], "pop" : 11360, "state" : "GA" } +{ "_id" : "30513", "city" : "BLUE RIDGE", "loc" : [ -84.328087, 34.855523 ], "pop" : 4844, "state" : "GA" } +{ "_id" : "30516", "city" : "BOWERSVILLE", "loc" : [ -83.04836400000001, 34.399592 ], "pop" : 2082, "state" : "GA" } +{ "_id" : "30517", "city" : "BRASELTON", "loc" : [ -83.78116199999999, 34.138941 ], "pop" : 3142, "state" : "GA" } +{ "_id" : "30518", "city" : "BUFORD", "loc" : [ -83.996459, 34.112373 ], "pop" : 24810, "state" : "GA" } +{ "_id" : "30520", "city" : "CANON", "loc" : [ -83.126693, 34.347766 ], "pop" : 1393, "state" : "GA" } +{ "_id" : "30521", "city" : "CARNESVILLE", "loc" : [ -83.27920899999999, 34.394723 ], "pop" : 4135, "state" : "GA" } +{ "_id" : "30522", "city" : "CHERRYLOG", "loc" : [ -84.443136, 34.773711 ], "pop" : 2150, "state" : "GA" } +{ "_id" : "30523", "city" : "CLARKESVILLE", "loc" : [ -83.524304, 34.644993 ], "pop" : 8931, "state" : "GA" } +{ "_id" : "30525", "city" : "CLAYTON", "loc" : [ -83.40655, 34.882569 ], "pop" : 6700, "state" : "GA" } +{ "_id" : "30527", "city" : "CLERMONT", "loc" : [ -83.78531099999999, 34.476091 ], "pop" : 2336, "state" : "GA" } +{ "_id" : "30528", "city" : "CLEVELAND", "loc" : [ -83.749985, 34.583949 ], "pop" : 11036, "state" : "GA" } +{ "_id" : "30529", "city" : "COMMERCE", "loc" : [ -83.44801099999999, 34.213413 ], "pop" : 8792, "state" : "GA" } +{ "_id" : "30531", "city" : "CORNELIA", "loc" : [ -83.54527, 34.520882 ], "pop" : 7597, "state" : "GA" } +{ "_id" : "30533", "city" : "DAHLONEGA", "loc" : [ -83.979838, 34.529949 ], "pop" : 15003, "state" : "GA" } +{ "_id" : "30534", "city" : "JUNO", "loc" : [ -84.10370500000001, 34.394331 ], "pop" : 10196, "state" : "GA" } +{ "_id" : "30535", "city" : "DEMOREST", "loc" : [ -83.569625, 34.575564 ], "pop" : 3521, "state" : "GA" } +{ "_id" : "30537", "city" : "SKY VALLEY", "loc" : [ -83.38011299999999, 34.979659 ], "pop" : 328, "state" : "GA" } +{ "_id" : "30538", "city" : "EASTANOLLEE", "loc" : [ -83.258685, 34.50366 ], "pop" : 1478, "state" : "GA" } +{ "_id" : "30539", "city" : "EAST ELLIJAY", "loc" : [ -84.473062, 34.682636 ], "pop" : 314, "state" : "GA" } +{ "_id" : "30540", "city" : "ELLIJAY", "loc" : [ -84.48122600000001, 34.677514 ], "pop" : 9672, "state" : "GA" } +{ "_id" : "30541", "city" : "EPWORTH", "loc" : [ -84.441593, 34.944249 ], "pop" : 1523, "state" : "GA" } +{ "_id" : "30542", "city" : "FLOWERY BRANCH", "loc" : [ -83.902407, 34.181893 ], "pop" : 9361, "state" : "GA" } +{ "_id" : "30543", "city" : "GILLSVILLE", "loc" : [ -83.675681, 34.300148 ], "pop" : 1585, "state" : "GA" } +{ "_id" : "30545", "city" : "HELEN", "loc" : [ -83.739936, 34.686601 ], "pop" : 469, "state" : "GA" } +{ "_id" : "30546", "city" : "HIAWASSEE", "loc" : [ -83.7478, 34.937667 ], "pop" : 5067, "state" : "GA" } +{ "_id" : "30547", "city" : "HOMER", "loc" : [ -83.497432, 34.356312 ], "pop" : 2949, "state" : "GA" } +{ "_id" : "30548", "city" : "HOSCHTON", "loc" : [ -83.780253, 34.086578 ], "pop" : 3444, "state" : "GA" } +{ "_id" : "30549", "city" : "JEFFERSON", "loc" : [ -83.570813, 34.106197 ], "pop" : 8795, "state" : "GA" } +{ "_id" : "30552", "city" : "LAKEMONT", "loc" : [ -83.403763, 34.761697 ], "pop" : 338, "state" : "GA" } +{ "_id" : "30553", "city" : "LAVONIA", "loc" : [ -83.11299200000001, 34.452758 ], "pop" : 5797, "state" : "GA" } +{ "_id" : "30554", "city" : "LULA", "loc" : [ -83.69445899999999, 34.398513 ], "pop" : 3365, "state" : "GA" } +{ "_id" : "30555", "city" : "MC CAYSVILLE", "loc" : [ -84.36829400000001, 34.952212 ], "pop" : 4720, "state" : "GA" } +{ "_id" : "30557", "city" : "MARTIN", "loc" : [ -83.168553, 34.515482 ], "pop" : 1601, "state" : "GA" } +{ "_id" : "30558", "city" : "MAYSVILLE", "loc" : [ -83.584019, 34.273627 ], "pop" : 4456, "state" : "GA" } +{ "_id" : "30559", "city" : "MINERAL BLUFF", "loc" : [ -84.25406599999999, 34.934112 ], "pop" : 2180, "state" : "GA" } +{ "_id" : "30560", "city" : "MORGANTON", "loc" : [ -84.211479, 34.871382 ], "pop" : 2558, "state" : "GA" } +{ "_id" : "30563", "city" : "MOUNT AIRY", "loc" : [ -83.471272, 34.567825 ], "pop" : 2813, "state" : "GA" } +{ "_id" : "30564", "city" : "MURRAYVILLE", "loc" : [ -83.894919, 34.434167 ], "pop" : 2126, "state" : "GA" } +{ "_id" : "30565", "city" : "NICHOLSON", "loc" : [ -83.421031, 34.097016 ], "pop" : 3352, "state" : "GA" } +{ "_id" : "30566", "city" : "OAKWOOD", "loc" : [ -83.894013, 34.237196 ], "pop" : 6584, "state" : "GA" } +{ "_id" : "30567", "city" : "PENDERGRASS", "loc" : [ -83.66335599999999, 34.179634 ], "pop" : 1956, "state" : "GA" } +{ "_id" : "30568", "city" : "RABUN GAP", "loc" : [ -83.39012200000001, 34.957552 ], "pop" : 1828, "state" : "GA" } +{ "_id" : "30571", "city" : "SAUTEE NACOOCHEE", "loc" : [ -83.693116, 34.716245 ], "pop" : 1504, "state" : "GA" } +{ "_id" : "30572", "city" : "SUCHES", "loc" : [ -84.049582, 34.72529 ], "pop" : 800, "state" : "GA" } +{ "_id" : "30575", "city" : "TALMO", "loc" : [ -83.71872, 34.19506 ], "pop" : 1153, "state" : "GA" } +{ "_id" : "30576", "city" : "TIGER", "loc" : [ -83.433317, 34.81741 ], "pop" : 2454, "state" : "GA" } +{ "_id" : "30577", "city" : "TOCCOA", "loc" : [ -83.31144, 34.566474 ], "pop" : 20324, "state" : "GA" } +{ "_id" : "30582", "city" : "YOUNG HARRIS", "loc" : [ -83.86882, 34.958791 ], "pop" : 1687, "state" : "GA" } +{ "_id" : "30601", "city" : "ATHENS", "loc" : [ -83.363174, 33.976097 ], "pop" : 15661, "state" : "GA" } +{ "_id" : "30605", "city" : "ATHENS", "loc" : [ -83.352508, 33.932097 ], "pop" : 33299, "state" : "GA" } +{ "_id" : "30606", "city" : "ATHENS", "loc" : [ -83.418019, 33.946085 ], "pop" : 29839, "state" : "GA" } +{ "_id" : "30607", "city" : "ATHENS", "loc" : [ -83.427761, 34.006978 ], "pop" : 7056, "state" : "GA" } +{ "_id" : "30619", "city" : "ARNOLDSVILLE", "loc" : [ -83.234137, 33.880338 ], "pop" : 648, "state" : "GA" } +{ "_id" : "30620", "city" : "BETHLEHEM", "loc" : [ -83.728227, 33.926116 ], "pop" : 2181, "state" : "GA" } +{ "_id" : "30621", "city" : "BISHOP", "loc" : [ -83.477655, 33.808091 ], "pop" : 3620, "state" : "GA" } +{ "_id" : "30622", "city" : "BOGART", "loc" : [ -83.50546, 33.934038 ], "pop" : 7245, "state" : "GA" } +{ "_id" : "30624", "city" : "BOWMAN", "loc" : [ -83.028437, 34.19193 ], "pop" : 2315, "state" : "GA" } +{ "_id" : "30625", "city" : "BUCKHEAD", "loc" : [ -83.343484, 33.536842 ], "pop" : 1222, "state" : "GA" } +{ "_id" : "30627", "city" : "CARLTON", "loc" : [ -83.003827, 33.985217 ], "pop" : 2046, "state" : "GA" } +{ "_id" : "30628", "city" : "COLBERT", "loc" : [ -83.21906, 34.038246 ], "pop" : 5943, "state" : "GA" } +{ "_id" : "30629", "city" : "COMER", "loc" : [ -83.121978, 34.088776 ], "pop" : 3134, "state" : "GA" } +{ "_id" : "30630", "city" : "CRAWFORD", "loc" : [ -83.189319, 33.909533 ], "pop" : 2883, "state" : "GA" } +{ "_id" : "30631", "city" : "CRAWFORDVILLE", "loc" : [ -82.88723400000001, 33.570801 ], "pop" : 1915, "state" : "GA" } +{ "_id" : "30633", "city" : "DANIELSVILLE", "loc" : [ -83.275841, 34.170799 ], "pop" : 7119, "state" : "GA" } +{ "_id" : "30634", "city" : "DEWY ROSE", "loc" : [ -82.940894, 34.172052 ], "pop" : 1138, "state" : "GA" } +{ "_id" : "30635", "city" : "ELBERTON", "loc" : [ -82.844765, 34.108202 ], "pop" : 15503, "state" : "GA" } +{ "_id" : "30641", "city" : "GOOD HOPE", "loc" : [ -83.59495200000001, 33.761346 ], "pop" : 1031, "state" : "GA" } +{ "_id" : "30642", "city" : "GREENSBORO", "loc" : [ -83.170192, 33.563682 ], "pop" : 6206, "state" : "GA" } +{ "_id" : "30643", "city" : "HARTWELL", "loc" : [ -82.929576, 34.357124 ], "pop" : 14886, "state" : "GA" } +{ "_id" : "30646", "city" : "HULL", "loc" : [ -83.311029, 34.04781 ], "pop" : 5142, "state" : "GA" } +{ "_id" : "30648", "city" : "LEXINGTON", "loc" : [ -83.085809, 33.879913 ], "pop" : 1712, "state" : "GA" } +{ "_id" : "30650", "city" : "MADISON", "loc" : [ -83.461781, 33.594681 ], "pop" : 8855, "state" : "GA" } +{ "_id" : "30655", "city" : "MONROE", "loc" : [ -83.707221, 33.808141 ], "pop" : 18405, "state" : "GA" } +{ "_id" : "30660", "city" : "PHILOMATH", "loc" : [ -82.909975, 33.783593 ], "pop" : 1137, "state" : "GA" } +{ "_id" : "30662", "city" : "ROYSTON", "loc" : [ -83.140614, 34.277793 ], "pop" : 8836, "state" : "GA" } +{ "_id" : "30663", "city" : "RUTLEDGE", "loc" : [ -83.60230199999999, 33.616316 ], "pop" : 2161, "state" : "GA" } +{ "_id" : "30666", "city" : "STATHAM", "loc" : [ -83.58929999999999, 33.960233 ], "pop" : 3758, "state" : "GA" } +{ "_id" : "30667", "city" : "STEPHENS", "loc" : [ -83.11590200000001, 33.771471 ], "pop" : 1069, "state" : "GA" } +{ "_id" : "30668", "city" : "DANBURG", "loc" : [ -82.69555800000001, 33.883294 ], "pop" : 2293, "state" : "GA" } +{ "_id" : "30669", "city" : "UNION POINT", "loc" : [ -83.087913, 33.634544 ], "pop" : 3561, "state" : "GA" } +{ "_id" : "30673", "city" : "WASHINGTON", "loc" : [ -82.742912, 33.726541 ], "pop" : 7699, "state" : "GA" } +{ "_id" : "30677", "city" : "WATKINSVILLE", "loc" : [ -83.40804300000001, 33.854247 ], "pop" : 7723, "state" : "GA" } +{ "_id" : "30678", "city" : "WHITE PLAINS", "loc" : [ -83.090845, 33.484338 ], "pop" : 1596, "state" : "GA" } +{ "_id" : "30680", "city" : "WINDER", "loc" : [ -83.711473, 33.998544 ], "pop" : 16981, "state" : "GA" } +{ "_id" : "30683", "city" : "WINTERVILLE", "loc" : [ -83.290645, 33.954253 ], "pop" : 3056, "state" : "GA" } +{ "_id" : "30701", "city" : "CALHOUN", "loc" : [ -84.934545, 34.496456 ], "pop" : 22017, "state" : "GA" } +{ "_id" : "30705", "city" : "CHATSWORTH", "loc" : [ -84.794293, 34.758929 ], "pop" : 22271, "state" : "GA" } +{ "_id" : "30707", "city" : "CHICKAMAUGA", "loc" : [ -85.322136, 34.857963 ], "pop" : 13545, "state" : "GA" } +{ "_id" : "30708", "city" : "CISCO", "loc" : [ -84.717382, 34.847405 ], "pop" : 978, "state" : "GA" } +{ "_id" : "30710", "city" : "COHUTTA", "loc" : [ -84.945801, 34.932635 ], "pop" : 5052, "state" : "GA" } +{ "_id" : "30711", "city" : "CRANDALL", "loc" : [ -84.764533, 34.941225 ], "pop" : 2901, "state" : "GA" } +{ "_id" : "30720", "city" : "DALTON", "loc" : [ -84.987477, 34.76352 ], "pop" : 20680, "state" : "GA" } +{ "_id" : "30721", "city" : "DALTON", "loc" : [ -84.933871, 34.77922 ], "pop" : 36051, "state" : "GA" } +{ "_id" : "30725", "city" : "FLINTSTONE", "loc" : [ -85.35244299999999, 34.925162 ], "pop" : 2775, "state" : "GA" } +{ "_id" : "30728", "city" : "LA FAYETTE", "loc" : [ -85.260212, 34.692008 ], "pop" : 16287, "state" : "GA" } +{ "_id" : "30730", "city" : "LYERLY", "loc" : [ -85.403826, 34.402958 ], "pop" : 2585, "state" : "GA" } +{ "_id" : "30731", "city" : "CLOUDLAND", "loc" : [ -85.459723, 34.570909 ], "pop" : 3222, "state" : "GA" } +{ "_id" : "30733", "city" : "PLAINVILLE", "loc" : [ -85.031204, 34.41447 ], "pop" : 1589, "state" : "GA" } +{ "_id" : "30734", "city" : "RANGER", "loc" : [ -84.727018, 34.540361 ], "pop" : 2015, "state" : "GA" } +{ "_id" : "30735", "city" : "HILL CITY", "loc" : [ -84.916251, 34.591996 ], "pop" : 2926, "state" : "GA" } +{ "_id" : "30736", "city" : "RINGGOLD", "loc" : [ -85.15490800000001, 34.92052 ], "pop" : 25360, "state" : "GA" } +{ "_id" : "30738", "city" : "RISING FAWN", "loc" : [ -85.47107800000001, 34.853491 ], "pop" : 4036, "state" : "GA" } +{ "_id" : "30739", "city" : "ROCK SPRING", "loc" : [ -85.24148099999999, 34.806534 ], "pop" : 4181, "state" : "GA" } +{ "_id" : "30740", "city" : "ROCKY FACE", "loc" : [ -85.05614300000001, 34.774456 ], "pop" : 6029, "state" : "GA" } +{ "_id" : "30741", "city" : "ROSSVILLE", "loc" : [ -85.296785, 34.953481 ], "pop" : 18436, "state" : "GA" } +{ "_id" : "30742", "city" : "FORT OGLETHORPE", "loc" : [ -85.242812, 34.964082 ], "pop" : 14807, "state" : "GA" } +{ "_id" : "30746", "city" : "SUGAR VALLEY", "loc" : [ -85.026048, 34.551929 ], "pop" : 1340, "state" : "GA" } +{ "_id" : "30747", "city" : "SUMMERVILLE", "loc" : [ -85.336224, 34.485899 ], "pop" : 10748, "state" : "GA" } +{ "_id" : "30750", "city" : "LOOKOUT MOUNTAIN", "loc" : [ -85.379384, 34.933512 ], "pop" : 2818, "state" : "GA" } +{ "_id" : "30752", "city" : "TRENTON", "loc" : [ -85.517118, 34.901681 ], "pop" : 7930, "state" : "GA" } +{ "_id" : "30753", "city" : "TRION", "loc" : [ -85.311156, 34.54679 ], "pop" : 5963, "state" : "GA" } +{ "_id" : "30755", "city" : "TUNNEL HILL", "loc" : [ -85.046815, 34.854129 ], "pop" : 6947, "state" : "GA" } +{ "_id" : "30757", "city" : "WILDWOOD", "loc" : [ -85.43045600000001, 34.977911 ], "pop" : 586, "state" : "GA" } +{ "_id" : "30802", "city" : "APPLING", "loc" : [ -82.285631, 33.627088 ], "pop" : 2255, "state" : "GA" } +{ "_id" : "30803", "city" : "AVERA", "loc" : [ -82.514965, 33.140997 ], "pop" : 836, "state" : "GA" } +{ "_id" : "30805", "city" : "BLYTHE", "loc" : [ -82.20304400000001, 33.294088 ], "pop" : 297, "state" : "GA" } +{ "_id" : "30808", "city" : "DEARING", "loc" : [ -82.395512, 33.40702 ], "pop" : 4632, "state" : "GA" } +{ "_id" : "30809", "city" : "EVANS", "loc" : [ -82.139775, 33.541194 ], "pop" : 12788, "state" : "GA" } +{ "_id" : "30810", "city" : "GIBSON", "loc" : [ -82.57659099999999, 33.247097 ], "pop" : 1649, "state" : "GA" } +{ "_id" : "30813", "city" : "GROVETOWN", "loc" : [ -82.240937, 33.476622 ], "pop" : 13283, "state" : "GA" } +{ "_id" : "30814", "city" : "HARLEM", "loc" : [ -82.309659, 33.417007 ], "pop" : 4318, "state" : "GA" } +{ "_id" : "30815", "city" : "HEPHZIBAH", "loc" : [ -82.088689, 33.343328 ], "pop" : 27838, "state" : "GA" } +{ "_id" : "30816", "city" : "KEYSVILLE", "loc" : [ -82.183368, 33.17191 ], "pop" : 135, "state" : "GA" } +{ "_id" : "30817", "city" : "LINCOLNTON", "loc" : [ -82.44348100000001, 33.777335 ], "pop" : 7028, "state" : "GA" } +{ "_id" : "30818", "city" : "MATTHEWS", "loc" : [ -82.28674700000001, 33.217582 ], "pop" : 607, "state" : "GA" } +{ "_id" : "30820", "city" : "MITCHELL", "loc" : [ -82.68165399999999, 33.20515 ], "pop" : 708, "state" : "GA" } +{ "_id" : "30821", "city" : "NORWOOD", "loc" : [ -82.735575, 33.478921 ], "pop" : 882, "state" : "GA" } +{ "_id" : "30822", "city" : "PERKINS", "loc" : [ -81.869573, 32.905747 ], "pop" : 549, "state" : "GA" } +{ "_id" : "30823", "city" : "STAPLETON", "loc" : [ -82.459704, 33.189423 ], "pop" : 884, "state" : "GA" } +{ "_id" : "30824", "city" : "THOMSON", "loc" : [ -82.494204, 33.477363 ], "pop" : 15487, "state" : "GA" } +{ "_id" : "30828", "city" : "WARRENTON", "loc" : [ -82.63567999999999, 33.40914 ], "pop" : 4091, "state" : "GA" } +{ "_id" : "30830", "city" : "WAYNESBORO", "loc" : [ -81.990797, 33.101254 ], "pop" : 12213, "state" : "GA" } +{ "_id" : "30833", "city" : "WRENS", "loc" : [ -82.380962, 33.210397 ], "pop" : 4782, "state" : "GA" } +{ "_id" : "30901", "city" : "AUGUSTA", "loc" : [ -81.972959, 33.460084 ], "pop" : 24496, "state" : "GA" } +{ "_id" : "30904", "city" : "AUGUSTA", "loc" : [ -82.01307799999999, 33.47374 ], "pop" : 30408, "state" : "GA" } +{ "_id" : "30905", "city" : "FORT GORDON", "loc" : [ -82.139179, 33.419032 ], "pop" : 9260, "state" : "GA" } +{ "_id" : "30906", "city" : "PEACH ORCHARD", "loc" : [ -82.038358, 33.402024 ], "pop" : 58646, "state" : "GA" } +{ "_id" : "30907", "city" : "MARTINEZ", "loc" : [ -82.09950499999999, 33.511692 ], "pop" : 42573, "state" : "GA" } +{ "_id" : "30909", "city" : "FOREST HILLS", "loc" : [ -82.060439, 33.480932 ], "pop" : 32202, "state" : "GA" } +{ "_id" : "31001", "city" : "ABBEVILLE", "loc" : [ -83.306845, 31.96484 ], "pop" : 1991, "state" : "GA" } +{ "_id" : "31002", "city" : "ADRIAN", "loc" : [ -82.569508, 32.563505 ], "pop" : 2880, "state" : "GA" } +{ "_id" : "31003", "city" : "ALLENTOWN", "loc" : [ -83.189796, 32.653829 ], "pop" : 1099, "state" : "GA" } +{ "_id" : "31005", "city" : "BONAIRE", "loc" : [ -83.604736, 32.546037 ], "pop" : 5095, "state" : "GA" } +{ "_id" : "31006", "city" : "BUTLER", "loc" : [ -84.234308, 32.572597 ], "pop" : 4731, "state" : "GA" } +{ "_id" : "31007", "city" : "BYROMVILLE", "loc" : [ -83.899128, 32.185192 ], "pop" : 1672, "state" : "GA" } +{ "_id" : "31008", "city" : "POWERSVILLE", "loc" : [ -83.762244, 32.647384 ], "pop" : 8205, "state" : "GA" } +{ "_id" : "31009", "city" : "CADWELL", "loc" : [ -83.02676700000001, 32.317395 ], "pop" : 1501, "state" : "GA" } +{ "_id" : "31011", "city" : "CHAUNCEY", "loc" : [ -83.050804, 32.083532 ], "pop" : 1954, "state" : "GA" } +{ "_id" : "31012", "city" : "CHESTER", "loc" : [ -83.174029, 32.398152 ], "pop" : 1517, "state" : "GA" } +{ "_id" : "31014", "city" : "COCHRAN", "loc" : [ -83.322886, 32.398066 ], "pop" : 11373, "state" : "GA" } +{ "_id" : "31015", "city" : "CORDELE", "loc" : [ -83.783507, 31.956625 ], "pop" : 18662, "state" : "GA" } +{ "_id" : "31016", "city" : "CULLODEN", "loc" : [ -84.04562799999999, 32.830078 ], "pop" : 2501, "state" : "GA" } +{ "_id" : "31017", "city" : "DANVILLE", "loc" : [ -83.303298, 32.593017 ], "pop" : 2221, "state" : "GA" } +{ "_id" : "31018", "city" : "DAVISBORO", "loc" : [ -82.622738, 32.944296 ], "pop" : 2032, "state" : "GA" } +{ "_id" : "31019", "city" : "DEXTER", "loc" : [ -83.05277100000001, 32.435639 ], "pop" : 1705, "state" : "GA" } +{ "_id" : "31020", "city" : "DRY BRANCH", "loc" : [ -83.495105, 32.70499 ], "pop" : 3702, "state" : "GA" } +{ "_id" : "31021", "city" : "EAST DUBLIN", "loc" : [ -82.90367999999999, 32.547794 ], "pop" : 32030, "state" : "GA" } +{ "_id" : "31022", "city" : "DUDLEY", "loc" : [ -83.089918, 32.525879 ], "pop" : 966, "state" : "GA" } +{ "_id" : "31023", "city" : "EASTMAN", "loc" : [ -83.185959, 32.208425 ], "pop" : 11744, "state" : "GA" } +{ "_id" : "31024", "city" : "EATONTON", "loc" : [ -83.36277, 33.312723 ], "pop" : 13086, "state" : "GA" } +{ "_id" : "31025", "city" : "ELKO", "loc" : [ -83.730388, 32.333648 ], "pop" : 934, "state" : "GA" } +{ "_id" : "31028", "city" : "CENTERVILLE", "loc" : [ -83.676773, 32.634375 ], "pop" : 2764, "state" : "GA" } +{ "_id" : "31029", "city" : "FORSYTH", "loc" : [ -83.93620900000001, 33.050764 ], "pop" : 8959, "state" : "GA" } +{ "_id" : "31030", "city" : "FORT VALLEY", "loc" : [ -83.888727, 32.54956 ], "pop" : 14027, "state" : "GA" } +{ "_id" : "31031", "city" : "STEVENS POTTERY", "loc" : [ -83.32041599999999, 32.909212 ], "pop" : 5415, "state" : "GA" } +{ "_id" : "31032", "city" : "GRAY", "loc" : [ -83.539951, 33.017177 ], "pop" : 8781, "state" : "GA" } +{ "_id" : "31033", "city" : "HADDOCK", "loc" : [ -83.431219, 33.051888 ], "pop" : 1193, "state" : "GA" } +{ "_id" : "31035", "city" : "HARRISON", "loc" : [ -82.71593, 32.842007 ], "pop" : 1737, "state" : "GA" } +{ "_id" : "31036", "city" : "HAWKINSVILLE", "loc" : [ -83.49476300000001, 32.277834 ], "pop" : 9154, "state" : "GA" } +{ "_id" : "31037", "city" : "HELENA", "loc" : [ -82.91782000000001, 32.078093 ], "pop" : 1526, "state" : "GA" } +{ "_id" : "31038", "city" : "ROUND OAK", "loc" : [ -83.68709200000001, 33.179994 ], "pop" : 811, "state" : "GA" } +{ "_id" : "31041", "city" : "IDEAL", "loc" : [ -84.148149, 32.393022 ], "pop" : 1924, "state" : "GA" } +{ "_id" : "31042", "city" : "IRWINTON", "loc" : [ -83.173963, 32.808849 ], "pop" : 447, "state" : "GA" } +{ "_id" : "31044", "city" : "JEFFERSONVILLE", "loc" : [ -83.385896, 32.741096 ], "pop" : 3953, "state" : "GA" } +{ "_id" : "31045", "city" : "JEWELL", "loc" : [ -82.732803, 33.328754 ], "pop" : 1105, "state" : "GA" } +{ "_id" : "31046", "city" : "JULIETTE", "loc" : [ -83.82352899999999, 33.119412 ], "pop" : 687, "state" : "GA" } +{ "_id" : "31047", "city" : "KATHLEEN", "loc" : [ -83.61284000000001, 32.467218 ], "pop" : 563, "state" : "GA" } +{ "_id" : "31049", "city" : "KITE", "loc" : [ -82.527361, 32.707833 ], "pop" : 1196, "state" : "GA" } +{ "_id" : "31050", "city" : "KNOXVILLE", "loc" : [ -83.943011, 32.64724 ], "pop" : 2134, "state" : "GA" } +{ "_id" : "31052", "city" : "LIZELLA", "loc" : [ -83.82500899999999, 32.777316 ], "pop" : 6992, "state" : "GA" } +{ "_id" : "31054", "city" : "MC INTYRE", "loc" : [ -83.203953, 32.84679 ], "pop" : 3295, "state" : "GA" } +{ "_id" : "31055", "city" : "MC RAE", "loc" : [ -82.887665, 32.043529 ], "pop" : 4906, "state" : "GA" } +{ "_id" : "31057", "city" : "MARSHALLVILLE", "loc" : [ -83.943478, 32.452003 ], "pop" : 2008, "state" : "GA" } +{ "_id" : "31058", "city" : "MAUK", "loc" : [ -84.399906, 32.509016 ], "pop" : 319, "state" : "GA" } +{ "_id" : "31060", "city" : "MILAN", "loc" : [ -83.05884500000001, 31.961797 ], "pop" : 1627, "state" : "GA" } +{ "_id" : "31061", "city" : "MILLEDGEVILLE", "loc" : [ -83.237943, 33.079958 ], "pop" : 39173, "state" : "GA" } +{ "_id" : "31063", "city" : "MONTEZUMA", "loc" : [ -84.004139, 32.302615 ], "pop" : 6160, "state" : "GA" } +{ "_id" : "31064", "city" : "MONTICELLO", "loc" : [ -83.714049, 33.311797 ], "pop" : 5328, "state" : "GA" } +{ "_id" : "31065", "city" : "MONTROSE", "loc" : [ -83.16011899999999, 32.561867 ], "pop" : 587, "state" : "GA" } +{ "_id" : "31066", "city" : "MUSELLA", "loc" : [ -84.045591, 32.820228 ], "pop" : 121, "state" : "GA" } +{ "_id" : "31068", "city" : "OGLETHORPE", "loc" : [ -84.08299100000001, 32.284186 ], "pop" : 2951, "state" : "GA" } +{ "_id" : "31069", "city" : "PERRY", "loc" : [ -83.728258, 32.46051 ], "pop" : 13945, "state" : "GA" } +{ "_id" : "31070", "city" : "PINEHURST", "loc" : [ -83.72085300000001, 32.196692 ], "pop" : 917, "state" : "GA" } +{ "_id" : "31071", "city" : "PINEVIEW", "loc" : [ -83.515835, 32.090728 ], "pop" : 1154, "state" : "GA" } +{ "_id" : "31072", "city" : "PITTS", "loc" : [ -83.55788, 31.942533 ], "pop" : 1278, "state" : "GA" } +{ "_id" : "31075", "city" : "RENTZ", "loc" : [ -82.91398700000001, 32.363834 ], "pop" : 3037, "state" : "GA" } +{ "_id" : "31076", "city" : "REYNOLDS", "loc" : [ -84.101134, 32.55411 ], "pop" : 2455, "state" : "GA" } +{ "_id" : "31077", "city" : "RHINE", "loc" : [ -83.19831000000001, 32.011303 ], "pop" : 1449, "state" : "GA" } +{ "_id" : "31078", "city" : "ROBERTA", "loc" : [ -84.045114, 32.722152 ], "pop" : 2803, "state" : "GA" } +{ "_id" : "31079", "city" : "ROCHELLE", "loc" : [ -83.44497800000001, 31.949119 ], "pop" : 2585, "state" : "GA" } +{ "_id" : "31081", "city" : "RUPERT", "loc" : [ -84.273753, 32.432524 ], "pop" : 208, "state" : "GA" } +{ "_id" : "31082", "city" : "DEEPSTEP", "loc" : [ -82.816934, 32.986972 ], "pop" : 10459, "state" : "GA" } +{ "_id" : "31085", "city" : "SHADY DALE", "loc" : [ -83.704031, 33.401353 ], "pop" : 1606, "state" : "GA" } +{ "_id" : "31087", "city" : "DEVEREUX", "loc" : [ -82.98594799999999, 33.265516 ], "pop" : 8908, "state" : "GA" } +{ "_id" : "31088", "city" : "WARNER ROBINS", "loc" : [ -83.641578, 32.593365 ], "pop" : 34526, "state" : "GA" } +{ "_id" : "31089", "city" : "TENNILLE", "loc" : [ -82.840024, 32.9063 ], "pop" : 3696, "state" : "GA" } +{ "_id" : "31090", "city" : "TOOMSBORO", "loc" : [ -83.08442700000001, 32.821895 ], "pop" : 1129, "state" : "GA" } +{ "_id" : "31091", "city" : "UNADILLA", "loc" : [ -83.74467, 32.255766 ], "pop" : 2623, "state" : "GA" } +{ "_id" : "31092", "city" : "VIENNA", "loc" : [ -83.792198, 32.091291 ], "pop" : 4689, "state" : "GA" } +{ "_id" : "31093", "city" : "WARNER ROBINS", "loc" : [ -83.639466, 32.636839 ], "pop" : 27107, "state" : "GA" } +{ "_id" : "31094", "city" : "WARTHEN", "loc" : [ -82.803899, 33.125455 ], "pop" : 1188, "state" : "GA" } +{ "_id" : "31096", "city" : "WRIGHTSVILLE", "loc" : [ -82.726206, 32.721866 ], "pop" : 5755, "state" : "GA" } +{ "_id" : "31097", "city" : "YATESVILLE", "loc" : [ -84.15925300000001, 32.915592 ], "pop" : 1188, "state" : "GA" } +{ "_id" : "31098", "city" : "ROBINS A F B", "loc" : [ -83.58775, 32.60958 ], "pop" : 3228, "state" : "GA" } +{ "_id" : "31201", "city" : "HUBER", "loc" : [ -83.598686, 32.84386 ], "pop" : 31882, "state" : "GA" } +{ "_id" : "31204", "city" : "MACON", "loc" : [ -83.67663400000001, 32.842393 ], "pop" : 38186, "state" : "GA" } +{ "_id" : "31206", "city" : "WILSON AIRPORT", "loc" : [ -83.682303, 32.780758 ], "pop" : 42528, "state" : "GA" } +{ "_id" : "31210", "city" : "MACON", "loc" : [ -83.745537, 32.892565 ], "pop" : 31255, "state" : "GA" } +{ "_id" : "31211", "city" : "MACON", "loc" : [ -83.602062, 32.886905 ], "pop" : 16668, "state" : "GA" } +{ "_id" : "31301", "city" : "ALLENHURST", "loc" : [ -81.618577, 31.774059 ], "pop" : 3075, "state" : "GA" } +{ "_id" : "31302", "city" : "BLOOMINGDALE", "loc" : [ -81.308465, 32.117654 ], "pop" : 3297, "state" : "GA" } +{ "_id" : "31303", "city" : "CLYO", "loc" : [ -81.30857, 32.512646 ], "pop" : 400, "state" : "GA" } +{ "_id" : "31304", "city" : "CRESCENT", "loc" : [ -81.389219, 31.49675 ], "pop" : 2362, "state" : "GA" } +{ "_id" : "31305", "city" : "DARIEN", "loc" : [ -81.431175, 31.382574 ], "pop" : 3067, "state" : "GA" } +{ "_id" : "31308", "city" : "ELLABELL", "loc" : [ -81.498302, 32.127304 ], "pop" : 1309, "state" : "GA" } +{ "_id" : "31309", "city" : "FLEMING", "loc" : [ -81.423165, 31.864477 ], "pop" : 548, "state" : "GA" } +{ "_id" : "31312", "city" : "GUYTON", "loc" : [ -81.389593, 32.31399 ], "pop" : 4025, "state" : "GA" } +{ "_id" : "31313", "city" : "HINESVILLE", "loc" : [ -81.607214, 31.851296 ], "pop" : 42962, "state" : "GA" } +{ "_id" : "31314", "city" : "FORT STEWART", "loc" : [ -81.440489, 31.979085 ], "pop" : 0, "state" : "GA" } +{ "_id" : "31316", "city" : "LUDOWICI", "loc" : [ -81.74531500000001, 31.770477 ], "pop" : 6139, "state" : "GA" } +{ "_id" : "31319", "city" : "MERIDIAN", "loc" : [ -81.42391499999999, 31.411068 ], "pop" : 672, "state" : "GA" } +{ "_id" : "31320", "city" : "MIDWAY", "loc" : [ -81.390897, 31.801803 ], "pop" : 4486, "state" : "GA" } +{ "_id" : "31321", "city" : "PEMBROKE", "loc" : [ -81.553341, 32.157088 ], "pop" : 6571, "state" : "GA" } +{ "_id" : "31322", "city" : "POOLER", "loc" : [ -81.251958, 32.114931 ], "pop" : 4036, "state" : "GA" } +{ "_id" : "31323", "city" : "RICEBORO", "loc" : [ -81.467134, 31.735696 ], "pop" : 1737, "state" : "GA" } +{ "_id" : "31324", "city" : "RICHMOND HILL", "loc" : [ -81.294026, 31.896152 ], "pop" : 7455, "state" : "GA" } +{ "_id" : "31326", "city" : "RINCON", "loc" : [ -81.28777700000001, 32.235632 ], "pop" : 14502, "state" : "GA" } +{ "_id" : "31327", "city" : "SAPELO ISLAND", "loc" : [ -81.267933, 31.421948 ], "pop" : 120, "state" : "GA" } +{ "_id" : "31328", "city" : "TYBEE ISLAND", "loc" : [ -80.850938, 32.006797 ], "pop" : 3106, "state" : "GA" } +{ "_id" : "31329", "city" : "STILLWELL", "loc" : [ -81.326435, 32.4121 ], "pop" : 6761, "state" : "GA" } +{ "_id" : "31331", "city" : "TOWNSEND", "loc" : [ -81.418204, 31.567339 ], "pop" : 2413, "state" : "GA" } +{ "_id" : "31401", "city" : "SAVANNAH", "loc" : [ -81.102394, 32.067631 ], "pop" : 37544, "state" : "GA" } +{ "_id" : "31404", "city" : "STATE COLLEGE", "loc" : [ -81.068704, 32.044178 ], "pop" : 33927, "state" : "GA" } +{ "_id" : "31405", "city" : "SAVANNAH", "loc" : [ -81.12419199999999, 32.039119 ], "pop" : 28739, "state" : "GA" } +{ "_id" : "31406", "city" : "SAVANNAH", "loc" : [ -81.097893, 31.988993 ], "pop" : 34024, "state" : "GA" } +{ "_id" : "31407", "city" : "PORT WENTWORTH", "loc" : [ -81.162891, 32.148075 ], "pop" : 2883, "state" : "GA" } +{ "_id" : "31408", "city" : "GARDEN CITY", "loc" : [ -81.168181, 32.109245 ], "pop" : 12548, "state" : "GA" } +{ "_id" : "31409", "city" : "SAVANNAH", "loc" : [ -81.158371, 32.002104 ], "pop" : 3509, "state" : "GA" } +{ "_id" : "31410", "city" : "SAVANNAH", "loc" : [ -80.983859, 32.016188 ], "pop" : 15808, "state" : "GA" } +{ "_id" : "31411", "city" : "SAVANNAH", "loc" : [ -81.03807399999999, 31.926801 ], "pop" : 4707, "state" : "GA" } +{ "_id" : "31419", "city" : "M M", "loc" : [ -81.177387, 31.985149 ], "pop" : 32901, "state" : "GA" } +{ "_id" : "31501", "city" : "OKEFENOKEE", "loc" : [ -82.364512, 31.219686 ], "pop" : 33068, "state" : "GA" } +{ "_id" : "31510", "city" : "ALMA", "loc" : [ -82.4633, 31.546525 ], "pop" : 9566, "state" : "GA" } +{ "_id" : "31512", "city" : "AMBROSE", "loc" : [ -82.997637, 31.536712 ], "pop" : 2853, "state" : "GA" } +{ "_id" : "31513", "city" : "BAXLEY", "loc" : [ -82.348643, 31.783663 ], "pop" : 14099, "state" : "GA" } +{ "_id" : "31516", "city" : "BLACKSHEAR", "loc" : [ -82.261708, 31.293063 ], "pop" : 9612, "state" : "GA" } +{ "_id" : "31518", "city" : "BRISTOL", "loc" : [ -82.249594, 31.40278 ], "pop" : 996, "state" : "GA" } +{ "_id" : "31519", "city" : "BROXTON", "loc" : [ -82.904954, 31.648426 ], "pop" : 2915, "state" : "GA" } +{ "_id" : "31520", "city" : "GLYNCO", "loc" : [ -81.493045, 31.169652 ], "pop" : 21343, "state" : "GA" } +{ "_id" : "31522", "city" : "SAINT SIMONS ISL", "loc" : [ -81.38242099999999, 31.16916 ], "pop" : 12924, "state" : "GA" } +{ "_id" : "31525", "city" : "BRUNSWICK", "loc" : [ -81.511365, 31.230411 ], "pop" : 27079, "state" : "GA" } +{ "_id" : "31527", "city" : "JEKYLL ISLAND", "loc" : [ -81.41280999999999, 31.074049 ], "pop" : 1150, "state" : "GA" } +{ "_id" : "31532", "city" : "DENTON", "loc" : [ -82.720146, 31.745842 ], "pop" : 1457, "state" : "GA" } +{ "_id" : "31533", "city" : "DOUGLAS", "loc" : [ -82.846468, 31.497287 ], "pop" : 19607, "state" : "GA" } +{ "_id" : "31537", "city" : "FOLKSTON", "loc" : [ -82.011617, 30.850838 ], "pop" : 6486, "state" : "GA" } +{ "_id" : "31539", "city" : "HAZLEHURST", "loc" : [ -82.590947, 31.860569 ], "pop" : 10577, "state" : "GA" } +{ "_id" : "31542", "city" : "HOBOKEN", "loc" : [ -82.183847, 31.183777 ], "pop" : 3481, "state" : "GA" } +{ "_id" : "31543", "city" : "HORTENSE", "loc" : [ -81.95956099999999, 31.319949 ], "pop" : 968, "state" : "GA" } +{ "_id" : "31544", "city" : "JACKSONVILLE", "loc" : [ -82.975003, 31.848079 ], "pop" : 905, "state" : "GA" } +{ "_id" : "31545", "city" : "JESUP", "loc" : [ -81.88706000000001, 31.604326 ], "pop" : 17180, "state" : "GA" } +{ "_id" : "31548", "city" : "KINGSLAND", "loc" : [ -81.707483, 30.797681 ], "pop" : 8781, "state" : "GA" } +{ "_id" : "31549", "city" : "LUMBER CITY", "loc" : [ -82.707312, 31.925124 ], "pop" : 2036, "state" : "GA" } +{ "_id" : "31550", "city" : "MANOR", "loc" : [ -82.574173, 31.108829 ], "pop" : 794, "state" : "GA" } +{ "_id" : "31551", "city" : "MERSHON", "loc" : [ -82.216995, 31.478279 ], "pop" : 365, "state" : "GA" } +{ "_id" : "31552", "city" : "MILLWOOD", "loc" : [ -82.644148, 31.250566 ], "pop" : 500, "state" : "GA" } +{ "_id" : "31553", "city" : "NAHUNTA", "loc" : [ -81.972212, 31.182652 ], "pop" : 3158, "state" : "GA" } +{ "_id" : "31554", "city" : "NICHOLLS", "loc" : [ -82.603207, 31.449812 ], "pop" : 3615, "state" : "GA" } +{ "_id" : "31555", "city" : "ODUM", "loc" : [ -81.99430099999999, 31.699916 ], "pop" : 2851, "state" : "GA" } +{ "_id" : "31557", "city" : "PATTERSON", "loc" : [ -82.127444, 31.390338 ], "pop" : 2355, "state" : "GA" } +{ "_id" : "31558", "city" : "SAINT MARYS", "loc" : [ -81.56521100000001, 30.773467 ], "pop" : 15655, "state" : "GA" } +{ "_id" : "31560", "city" : "SCREVEN", "loc" : [ -82.039742, 31.516846 ], "pop" : 2325, "state" : "GA" } +{ "_id" : "31563", "city" : "SURRENCY", "loc" : [ -82.198218, 31.648931 ], "pop" : 1643, "state" : "GA" } +{ "_id" : "31565", "city" : "WAVERLY", "loc" : [ -81.56967, 31.042672 ], "pop" : 331, "state" : "GA" } +{ "_id" : "31566", "city" : "WAYNESVILLE", "loc" : [ -81.803928, 31.244792 ], "pop" : 3248, "state" : "GA" } +{ "_id" : "31567", "city" : "WEST GREEN", "loc" : [ -82.756417, 31.592271 ], "pop" : 1940, "state" : "GA" } +{ "_id" : "31568", "city" : "WHITE OAK", "loc" : [ -81.80823700000001, 31.034037 ], "pop" : 892, "state" : "GA" } +{ "_id" : "31569", "city" : "WOODBINE", "loc" : [ -81.678313, 30.943692 ], "pop" : 4508, "state" : "GA" } +{ "_id" : "31601", "city" : "CLYATTVILLE", "loc" : [ -83.27716599999999, 30.810578 ], "pop" : 32232, "state" : "GA" } +{ "_id" : "31602", "city" : "BEMISS", "loc" : [ -83.27329899999999, 30.890268 ], "pop" : 32292, "state" : "GA" } +{ "_id" : "31620", "city" : "ADEL", "loc" : [ -83.421346, 31.125143 ], "pop" : 9661, "state" : "GA" } +{ "_id" : "31622", "city" : "ALAPAHA", "loc" : [ -83.21321, 31.394027 ], "pop" : 1675, "state" : "GA" } +{ "_id" : "31624", "city" : "AXSON", "loc" : [ -82.731945, 31.303455 ], "pop" : 912, "state" : "GA" } +{ "_id" : "31625", "city" : "BARNEY", "loc" : [ -83.521934, 31.007424 ], "pop" : 895, "state" : "GA" } +{ "_id" : "31626", "city" : "BOSTON", "loc" : [ -83.797085, 30.785547 ], "pop" : 2808, "state" : "GA" } +{ "_id" : "31629", "city" : "DIXIE", "loc" : [ -83.67918, 30.772213 ], "pop" : 1462, "state" : "GA" } +{ "_id" : "31630", "city" : "DU PONT", "loc" : [ -82.855518, 30.999996 ], "pop" : 502, "state" : "GA" } +{ "_id" : "31631", "city" : "FARGO", "loc" : [ -82.580056, 30.716587 ], "pop" : 560, "state" : "GA" } +{ "_id" : "31632", "city" : "HAHIRA", "loc" : [ -83.357366, 30.941593 ], "pop" : 6921, "state" : "GA" } +{ "_id" : "31634", "city" : "COGDELL", "loc" : [ -82.743103, 31.044991 ], "pop" : 5098, "state" : "GA" } +{ "_id" : "31635", "city" : "LAKELAND", "loc" : [ -83.088859, 31.038107 ], "pop" : 4289, "state" : "GA" } +{ "_id" : "31636", "city" : "LAKE PARK", "loc" : [ -83.175293, 30.690615 ], "pop" : 4491, "state" : "GA" } +{ "_id" : "31637", "city" : "LENOX", "loc" : [ -83.44813499999999, 31.266405 ], "pop" : 1993, "state" : "GA" } +{ "_id" : "31638", "city" : "MORVEN", "loc" : [ -83.44979600000001, 30.893733 ], "pop" : 3416, "state" : "GA" } +{ "_id" : "31639", "city" : "NASHVILLE", "loc" : [ -83.23194599999999, 31.207379 ], "pop" : 8396, "state" : "GA" } +{ "_id" : "31641", "city" : "NAYLOR", "loc" : [ -83.12236799999999, 30.89846 ], "pop" : 1110, "state" : "GA" } +{ "_id" : "31642", "city" : "PEARSON", "loc" : [ -82.85909599999999, 31.310583 ], "pop" : 3590, "state" : "GA" } +{ "_id" : "31643", "city" : "QUITMAN", "loc" : [ -83.556748, 30.779699 ], "pop" : 8028, "state" : "GA" } +{ "_id" : "31645", "city" : "RAY CITY", "loc" : [ -83.21428299999999, 31.08247 ], "pop" : 1859, "state" : "GA" } +{ "_id" : "31646", "city" : "SAINT GEORGE", "loc" : [ -82.083367, 30.559161 ], "pop" : 2010, "state" : "GA" } +{ "_id" : "31647", "city" : "SPARKS", "loc" : [ -83.447586, 31.178984 ], "pop" : 1772, "state" : "GA" } +{ "_id" : "31648", "city" : "STATENVILLE", "loc" : [ -82.97986299999999, 30.725503 ], "pop" : 1269, "state" : "GA" } +{ "_id" : "31649", "city" : "STOCKTON", "loc" : [ -83.013944, 31.022865 ], "pop" : 1242, "state" : "GA" } +{ "_id" : "31650", "city" : "WILLACOOCHEE", "loc" : [ -83.04493100000001, 31.345481 ], "pop" : 1704, "state" : "GA" } +{ "_id" : "31701", "city" : "ALBANY", "loc" : [ -84.161923, 31.567783 ], "pop" : 25698, "state" : "GA" } +{ "_id" : "31704", "city" : "MARINE CORPS LOG", "loc" : [ -84.05081199999999, 31.550099 ], "pop" : 1306, "state" : "GA" } +{ "_id" : "31705", "city" : "BRIDGEBORO", "loc" : [ -84.09008900000001, 31.550851 ], "pop" : 35997, "state" : "GA" } +{ "_id" : "31707", "city" : "ALBANY", "loc" : [ -84.211834, 31.578908 ], "pop" : 36439, "state" : "GA" } +{ "_id" : "31709", "city" : "GEORGIA SOUTHWES", "loc" : [ -84.224729, 32.07077 ], "pop" : 23590, "state" : "GA" } +{ "_id" : "31711", "city" : "ANDERSONVILLE", "loc" : [ -84.10101, 32.129907 ], "pop" : 984, "state" : "GA" } +{ "_id" : "31712", "city" : "ARABI", "loc" : [ -83.72856, 31.862923 ], "pop" : 1349, "state" : "GA" } +{ "_id" : "31713", "city" : "ARLINGTON", "loc" : [ -84.72572, 31.445597 ], "pop" : 1402, "state" : "GA" } +{ "_id" : "31714", "city" : "ASHBURN", "loc" : [ -83.660775, 31.705877 ], "pop" : 6047, "state" : "GA" } +{ "_id" : "31715", "city" : "ATTAPULGUS", "loc" : [ -84.486008, 30.750639 ], "pop" : 3131, "state" : "GA" } +{ "_id" : "31716", "city" : "BACONTON", "loc" : [ -84.11345, 31.387804 ], "pop" : 2566, "state" : "GA" } +{ "_id" : "31717", "city" : "BAINBRIDGE", "loc" : [ -84.573975, 30.897865 ], "pop" : 17739, "state" : "GA" } +{ "_id" : "31723", "city" : "BLAKELY", "loc" : [ -84.93528499999999, 31.371854 ], "pop" : 8405, "state" : "GA" } +{ "_id" : "31724", "city" : "BLUFFTON", "loc" : [ -84.87717499999999, 31.556189 ], "pop" : 799, "state" : "GA" } +{ "_id" : "31725", "city" : "BRINSON", "loc" : [ -84.667112, 30.960957 ], "pop" : 2877, "state" : "GA" } +{ "_id" : "31726", "city" : "BRONWOOD", "loc" : [ -84.35938899999999, 31.821591 ], "pop" : 1075, "state" : "GA" } +{ "_id" : "31728", "city" : "CAIRO", "loc" : [ -84.196246, 30.892462 ], "pop" : 15393, "state" : "GA" } +{ "_id" : "31729", "city" : "CALVARY", "loc" : [ -84.32267, 30.747036 ], "pop" : 1442, "state" : "GA" } +{ "_id" : "31730", "city" : "CAMILLA", "loc" : [ -84.22968299999999, 31.219915 ], "pop" : 9207, "state" : "GA" } +{ "_id" : "31733", "city" : "CHULA", "loc" : [ -83.550864, 31.543855 ], "pop" : 2425, "state" : "GA" } +{ "_id" : "31734", "city" : "CLIMAX", "loc" : [ -84.443217, 30.85731 ], "pop" : 1764, "state" : "GA" } +{ "_id" : "31735", "city" : "COBB", "loc" : [ -83.95808700000001, 31.961708 ], "pop" : 881, "state" : "GA" } +{ "_id" : "31736", "city" : "COLEMAN", "loc" : [ -84.874471, 31.656831 ], "pop" : 359, "state" : "GA" } +{ "_id" : "31737", "city" : "COLQUITT", "loc" : [ -84.730896, 31.161871 ], "pop" : 6277, "state" : "GA" } +{ "_id" : "31738", "city" : "COOLIDGE", "loc" : [ -83.87524500000001, 30.985908 ], "pop" : 1970, "state" : "GA" } +{ "_id" : "31740", "city" : "CUTHBERT", "loc" : [ -84.78887400000001, 31.769073 ], "pop" : 5708, "state" : "GA" } +{ "_id" : "31741", "city" : "DAMASCUS", "loc" : [ -84.72004699999999, 31.341528 ], "pop" : 1534, "state" : "GA" } +{ "_id" : "31742", "city" : "GRAVES", "loc" : [ -84.43078199999999, 31.759846 ], "pop" : 8731, "state" : "GA" } +{ "_id" : "31743", "city" : "DE SOTO", "loc" : [ -84.027101, 31.950186 ], "pop" : 112, "state" : "GA" } +{ "_id" : "31744", "city" : "DOERUN", "loc" : [ -83.925316, 31.313647 ], "pop" : 1738, "state" : "GA" } +{ "_id" : "31745", "city" : "DONALSONVILLE", "loc" : [ -84.887024, 30.981801 ], "pop" : 7468, "state" : "GA" } +{ "_id" : "31746", "city" : "EDISON", "loc" : [ -84.745626, 31.564979 ], "pop" : 1711, "state" : "GA" } +{ "_id" : "31749", "city" : "ENIGMA", "loc" : [ -83.35515700000001, 31.373599 ], "pop" : 2223, "state" : "GA" } +{ "_id" : "31750", "city" : "FITZGERALD", "loc" : [ -83.249534, 31.724769 ], "pop" : 16245, "state" : "GA" } +{ "_id" : "31751", "city" : "FORT GAINES", "loc" : [ -85.03937500000001, 31.646353 ], "pop" : 2565, "state" : "GA" } +{ "_id" : "31754", "city" : "GEORGETOWN", "loc" : [ -85.07113699999999, 31.884763 ], "pop" : 1415, "state" : "GA" } +{ "_id" : "31756", "city" : "HARTSFIELD", "loc" : [ -83.970364, 31.217316 ], "pop" : 285, "state" : "GA" } +{ "_id" : "31759", "city" : "IRON CITY", "loc" : [ -84.796632, 30.994728 ], "pop" : 1542, "state" : "GA" } +{ "_id" : "31760", "city" : "IRWINVILLE", "loc" : [ -83.401708, 31.654238 ], "pop" : 1887, "state" : "GA" } +{ "_id" : "31761", "city" : "JAKIN", "loc" : [ -84.994845, 31.175064 ], "pop" : 1918, "state" : "GA" } +{ "_id" : "31762", "city" : "LEARY", "loc" : [ -84.509486, 31.505924 ], "pop" : 1017, "state" : "GA" } +{ "_id" : "31763", "city" : "LEESBURG", "loc" : [ -84.159263, 31.681161 ], "pop" : 14641, "state" : "GA" } +{ "_id" : "31764", "city" : "LESLIE", "loc" : [ -84.07834, 31.953952 ], "pop" : 1273, "state" : "GA" } +{ "_id" : "31765", "city" : "MEIGS", "loc" : [ -84.082375, 31.062536 ], "pop" : 1705, "state" : "GA" } +{ "_id" : "31766", "city" : "MORGAN", "loc" : [ -84.61779799999999, 31.556557 ], "pop" : 883, "state" : "GA" } +{ "_id" : "31767", "city" : "SPRINGVALE", "loc" : [ -85.05725099999999, 31.823432 ], "pop" : 850, "state" : "GA" } +{ "_id" : "31768", "city" : "MOULTRIE", "loc" : [ -83.764089, 31.179244 ], "pop" : 34351, "state" : "GA" } +{ "_id" : "31770", "city" : "NEWTON", "loc" : [ -84.441107, 31.313426 ], "pop" : 3615, "state" : "GA" } +{ "_id" : "31771", "city" : "NORMAN PARK", "loc" : [ -83.94044, 31.069128 ], "pop" : 301, "state" : "GA" } +{ "_id" : "31772", "city" : "OAKFIELD", "loc" : [ -83.97059, 31.779768 ], "pop" : 149, "state" : "GA" } +{ "_id" : "31773", "city" : "OCHLOCKNEE", "loc" : [ -84.0326, 30.959407 ], "pop" : 2665, "state" : "GA" } +{ "_id" : "31774", "city" : "OCILLA", "loc" : [ -83.256542, 31.592944 ], "pop" : 5784, "state" : "GA" } +{ "_id" : "31775", "city" : "OMEGA", "loc" : [ -83.593936, 31.360432 ], "pop" : 2154, "state" : "GA" } +{ "_id" : "31777", "city" : "PARROTT", "loc" : [ -84.501152, 31.872016 ], "pop" : 886, "state" : "GA" } +{ "_id" : "31778", "city" : "PAVO", "loc" : [ -83.74085599999999, 30.940142 ], "pop" : 3573, "state" : "GA" } +{ "_id" : "31779", "city" : "PELHAM", "loc" : [ -84.156367, 31.127233 ], "pop" : 7123, "state" : "GA" } +{ "_id" : "31780", "city" : "PLAINS", "loc" : [ -84.358638, 32.033908 ], "pop" : 3377, "state" : "GA" } +{ "_id" : "31781", "city" : "POULAN", "loc" : [ -83.761554, 31.467206 ], "pop" : 3119, "state" : "GA" } +{ "_id" : "31783", "city" : "REBECCA", "loc" : [ -83.523478, 31.797921 ], "pop" : 630, "state" : "GA" } +{ "_id" : "31784", "city" : "SALE CITY", "loc" : [ -84.04219500000001, 31.260004 ], "pop" : 1379, "state" : "GA" } +{ "_id" : "31786", "city" : "SHELLMAN", "loc" : [ -84.61661599999999, 31.743407 ], "pop" : 1900, "state" : "GA" } +{ "_id" : "31787", "city" : "SMITHVILLE", "loc" : [ -84.22706599999999, 31.884692 ], "pop" : 1570, "state" : "GA" } +{ "_id" : "31789", "city" : "SUMNER", "loc" : [ -83.724463, 31.53925 ], "pop" : 1125, "state" : "GA" } +{ "_id" : "31790", "city" : "SYCAMORE", "loc" : [ -83.606363, 31.655329 ], "pop" : 2026, "state" : "GA" } +{ "_id" : "31791", "city" : "SYLVESTER", "loc" : [ -83.860731, 31.539268 ], "pop" : 9573, "state" : "GA" } +{ "_id" : "31792", "city" : "THOMASVILLE", "loc" : [ -83.969616, 30.838543 ], "pop" : 28319, "state" : "GA" } +{ "_id" : "31794", "city" : "ABAC", "loc" : [ -83.498867, 31.451722 ], "pop" : 27906, "state" : "GA" } +{ "_id" : "31795", "city" : "TY TY", "loc" : [ -83.621989, 31.45595 ], "pop" : 2513, "state" : "GA" } +{ "_id" : "31796", "city" : "WARWICK", "loc" : [ -83.920092, 31.734495 ], "pop" : 2650, "state" : "GA" } +{ "_id" : "31797", "city" : "WHIGHAM", "loc" : [ -84.315771, 30.90701 ], "pop" : 2987, "state" : "GA" } +{ "_id" : "31798", "city" : "WRAY", "loc" : [ -83.107484, 31.595229 ], "pop" : 978, "state" : "GA" } +{ "_id" : "31801", "city" : "JUNIPER", "loc" : [ -84.612951, 32.565562 ], "pop" : 1407, "state" : "GA" } +{ "_id" : "31803", "city" : "TAZEWELL", "loc" : [ -84.52734700000001, 32.354198 ], "pop" : 5590, "state" : "GA" } +{ "_id" : "31804", "city" : "CATAULA", "loc" : [ -84.92069100000001, 32.624246 ], "pop" : 1108, "state" : "GA" } +{ "_id" : "31805", "city" : "CUSSETA", "loc" : [ -84.764537, 32.299026 ], "pop" : 2290, "state" : "GA" } +{ "_id" : "31806", "city" : "ELLAVILLE", "loc" : [ -84.30386799999999, 32.23901 ], "pop" : 3599, "state" : "GA" } +{ "_id" : "31807", "city" : "ELLERSLIE", "loc" : [ -84.877197, 32.661718 ], "pop" : 2153, "state" : "GA" } +{ "_id" : "31808", "city" : "FORTSON", "loc" : [ -85.001654, 32.628841 ], "pop" : 1780, "state" : "GA" } +{ "_id" : "31811", "city" : "HAMILTON", "loc" : [ -84.884753, 32.741795 ], "pop" : 1587, "state" : "GA" } +{ "_id" : "31812", "city" : "JUNCTION CITY", "loc" : [ -84.45741, 32.608046 ], "pop" : 472, "state" : "GA" } +{ "_id" : "31815", "city" : "LUMPKIN", "loc" : [ -84.802227, 32.043465 ], "pop" : 2144, "state" : "GA" } +{ "_id" : "31816", "city" : "MANCHESTER", "loc" : [ -84.63116599999999, 32.8721 ], "pop" : 7721, "state" : "GA" } +{ "_id" : "31820", "city" : "MIDLAND", "loc" : [ -84.855851, 32.561587 ], "pop" : 4725, "state" : "GA" } +{ "_id" : "31821", "city" : "OMAHA", "loc" : [ -84.900792, 32.165234 ], "pop" : 884, "state" : "GA" } +{ "_id" : "31822", "city" : "PINE MOUNTAIN", "loc" : [ -84.89595300000001, 32.873488 ], "pop" : 3548, "state" : "GA" } +{ "_id" : "31823", "city" : "PINE MOUNTAIN VA", "loc" : [ -84.823874, 32.791849 ], "pop" : 887, "state" : "GA" } +{ "_id" : "31824", "city" : "PRESTON", "loc" : [ -84.548918, 32.074031 ], "pop" : 1690, "state" : "GA" } +{ "_id" : "31825", "city" : "RICHLAND", "loc" : [ -84.666724, 32.084578 ], "pop" : 2626, "state" : "GA" } +{ "_id" : "31826", "city" : "SHILOH", "loc" : [ -84.74117099999999, 32.806678 ], "pop" : 1478, "state" : "GA" } +{ "_id" : "31827", "city" : "TALBOTTON", "loc" : [ -84.546206, 32.679702 ], "pop" : 2324, "state" : "GA" } +{ "_id" : "31829", "city" : "UPATOI", "loc" : [ -84.74481900000001, 32.560057 ], "pop" : 725, "state" : "GA" } +{ "_id" : "31830", "city" : "WARM SPRINGS", "loc" : [ -84.82172799999999, 32.895558 ], "pop" : 819, "state" : "GA" } +{ "_id" : "31831", "city" : "WAVERLY HALL", "loc" : [ -84.742463, 32.679326 ], "pop" : 2323, "state" : "GA" } +{ "_id" : "31832", "city" : "WESTON", "loc" : [ -84.575579, 31.963665 ], "pop" : 573, "state" : "GA" } +{ "_id" : "31833", "city" : "WEST POINT", "loc" : [ -85.119714, 32.833683 ], "pop" : 8499, "state" : "GA" } +{ "_id" : "31836", "city" : "WOODLAND", "loc" : [ -84.595187, 32.806066 ], "pop" : 2377, "state" : "GA" } +{ "_id" : "31901", "city" : "COLUMBUS", "loc" : [ -84.979456, 32.473035 ], "pop" : 9694, "state" : "GA" } +{ "_id" : "31903", "city" : "COLUMBUS", "loc" : [ -84.948127, 32.424513 ], "pop" : 25362, "state" : "GA" } +{ "_id" : "31904", "city" : "COLUMBUS", "loc" : [ -84.978475, 32.516091 ], "pop" : 29254, "state" : "GA" } +{ "_id" : "31905", "city" : "CUSTER TERRACE", "loc" : [ -84.94526399999999, 32.369728 ], "pop" : 22869, "state" : "GA" } +{ "_id" : "31906", "city" : "COLUMBUS", "loc" : [ -84.94842199999999, 32.463819 ], "pop" : 26061, "state" : "GA" } +{ "_id" : "31907", "city" : "COLUMBUS", "loc" : [ -84.89798999999999, 32.477909 ], "pop" : 54915, "state" : "GA" } +{ "_id" : "31909", "city" : "COLUMBUS", "loc" : [ -84.927404, 32.536913 ], "pop" : 20880, "state" : "GA" } +{ "_id" : "32008", "city" : "BRANFORD", "loc" : [ -82.899288, 29.939472 ], "pop" : 2439, "state" : "FL" } +{ "_id" : "32009", "city" : "BRYCEVILLE", "loc" : [ -81.972397, 30.419274 ], "pop" : 1875, "state" : "FL" } +{ "_id" : "32011", "city" : "CALLAHAN", "loc" : [ -81.814465, 30.551958 ], "pop" : 9111, "state" : "FL" } +{ "_id" : "32013", "city" : "DAY", "loc" : [ -83.28505199999999, 30.149666 ], "pop" : 1567, "state" : "FL" } +{ "_id" : "32033", "city" : "ELKTON", "loc" : [ -81.46199, 29.788243 ], "pop" : 1557, "state" : "FL" } +{ "_id" : "32034", "city" : "AMELIA ISLAND", "loc" : [ -81.468829, 30.635388 ], "pop" : 19016, "state" : "FL" } +{ "_id" : "32038", "city" : "FORT WHITE", "loc" : [ -82.687938, 29.92073 ], "pop" : 3439, "state" : "FL" } +{ "_id" : "32040", "city" : "GLEN SAINT MARY", "loc" : [ -82.20405599999999, 30.286058 ], "pop" : 6467, "state" : "FL" } +{ "_id" : "32043", "city" : "GREEN COVE SPRIN", "loc" : [ -81.72618199999999, 30.00425 ], "pop" : 16033, "state" : "FL" } +{ "_id" : "32044", "city" : "HAMPTON", "loc" : [ -82.148347, 29.857511 ], "pop" : 1274, "state" : "FL" } +{ "_id" : "32046", "city" : "HILLIARD", "loc" : [ -81.93453, 30.688367 ], "pop" : 6486, "state" : "FL" } +{ "_id" : "32052", "city" : "JASPER", "loc" : [ -82.932186, 30.502914 ], "pop" : 6588, "state" : "FL" } +{ "_id" : "32053", "city" : "JENNINGS", "loc" : [ -83.13497099999999, 30.548243 ], "pop" : 2977, "state" : "FL" } +{ "_id" : "32054", "city" : "LAKE BUTLER", "loc" : [ -82.382796, 30.003485 ], "pop" : 8658, "state" : "FL" } +{ "_id" : "32055", "city" : "LAKE CITY", "loc" : [ -82.659888, 30.165239 ], "pop" : 38018, "state" : "FL" } +{ "_id" : "32058", "city" : "LAWTEY", "loc" : [ -82.10554399999999, 30.047164 ], "pop" : 4108, "state" : "FL" } +{ "_id" : "32059", "city" : "LEE", "loc" : [ -83.284392, 30.397863 ], "pop" : 1260, "state" : "FL" } +{ "_id" : "32060", "city" : "BOYS RANCH", "loc" : [ -83.02499400000001, 30.286622 ], "pop" : 19075, "state" : "FL" } +{ "_id" : "32061", "city" : "LULU", "loc" : [ -82.538481, 30.07544 ], "pop" : 295, "state" : "FL" } +{ "_id" : "32062", "city" : "MC ALPIN", "loc" : [ -82.966182, 30.150899 ], "pop" : 2062, "state" : "FL" } +{ "_id" : "32063", "city" : "MACCLENNY", "loc" : [ -82.132475, 30.273671 ], "pop" : 9749, "state" : "FL" } +{ "_id" : "32065", "city" : "ORANGE PARK", "loc" : [ -81.774199, 30.138233 ], "pop" : 19248, "state" : "FL" } +{ "_id" : "32066", "city" : "MAYO", "loc" : [ -83.146208, 30.039979 ], "pop" : 3475, "state" : "FL" } +{ "_id" : "32068", "city" : "MIDDLEBURG", "loc" : [ -81.864476, 30.083984 ], "pop" : 23245, "state" : "FL" } +{ "_id" : "32071", "city" : "O BRIEN", "loc" : [ -82.93004999999999, 30.038114 ], "pop" : 1305, "state" : "FL" } +{ "_id" : "32073", "city" : "ORANGE PARK", "loc" : [ -81.72906999999999, 30.16369 ], "pop" : 37281, "state" : "FL" } +{ "_id" : "32082", "city" : "PONTE VEDRA BEAC", "loc" : [ -81.386383, 30.215326 ], "pop" : 14727, "state" : "FL" } +{ "_id" : "32083", "city" : "RAIFORD", "loc" : [ -82.20012, 30.070379 ], "pop" : 1594, "state" : "FL" } +{ "_id" : "32084", "city" : "SAINT AUGUSTINE", "loc" : [ -81.298367, 29.880457 ], "pop" : 24906, "state" : "FL" } +{ "_id" : "32086", "city" : "SAINT AUGUSTINE", "loc" : [ -81.323734, 29.828514 ], "pop" : 16939, "state" : "FL" } +{ "_id" : "32087", "city" : "SANDERSON", "loc" : [ -82.33774099999999, 30.302536 ], "pop" : 2270, "state" : "FL" } +{ "_id" : "32091", "city" : "STARKE", "loc" : [ -82.11851799999999, 29.958299 ], "pop" : 15058, "state" : "FL" } +{ "_id" : "32092", "city" : "SAINT AUGUSTINE", "loc" : [ -81.52637900000001, 29.947511 ], "pop" : 4702, "state" : "FL" } +{ "_id" : "32094", "city" : "WELLBORN", "loc" : [ -82.850532, 30.179624 ], "pop" : 1621, "state" : "FL" } +{ "_id" : "32095", "city" : "SAINT AUGUSTINE", "loc" : [ -81.34762600000001, 29.905726 ], "pop" : 12132, "state" : "FL" } +{ "_id" : "32096", "city" : "WHITE SPRINGS", "loc" : [ -82.776453, 30.338749 ], "pop" : 1671, "state" : "FL" } +{ "_id" : "32097", "city" : "YULEE", "loc" : [ -81.590603, 30.622225 ], "pop" : 7453, "state" : "FL" } +{ "_id" : "32102", "city" : "ASTOR", "loc" : [ -81.539929, 29.165031 ], "pop" : 2092, "state" : "FL" } +{ "_id" : "32110", "city" : "BUNNELL", "loc" : [ -81.324431, 29.45616 ], "pop" : 4925, "state" : "FL" } +{ "_id" : "32112", "city" : "CRESCENT CITY", "loc" : [ -81.557909, 29.445438 ], "pop" : 7481, "state" : "FL" } +{ "_id" : "32113", "city" : "CITRA", "loc" : [ -82.106222, 29.39182 ], "pop" : 3340, "state" : "FL" } +{ "_id" : "32114", "city" : "DAYTONA BEACH", "loc" : [ -81.037071, 29.201168 ], "pop" : 34235, "state" : "FL" } +{ "_id" : "32117", "city" : "HOLLY HILL", "loc" : [ -81.054698, 29.236006 ], "pop" : 22599, "state" : "FL" } +{ "_id" : "32118", "city" : "DAYTONA BEACH", "loc" : [ -81.009469, 29.221874 ], "pop" : 17009, "state" : "FL" } +{ "_id" : "32119", "city" : "DUNLAWTON", "loc" : [ -81.022142, 29.152526 ], "pop" : 36500, "state" : "FL" } +{ "_id" : "32124", "city" : "PORT ORANGE", "loc" : [ -81.106746, 29.122456 ], "pop" : 7360, "state" : "FL" } +{ "_id" : "32127", "city" : "PORT ORANGE", "loc" : [ -80.98835099999999, 29.1124 ], "pop" : 25925, "state" : "FL" } +{ "_id" : "32130", "city" : "DE LEON SPRINGS", "loc" : [ -81.34876199999999, 29.116592 ], "pop" : 2267, "state" : "FL" } +{ "_id" : "32131", "city" : "EAST PALATKA", "loc" : [ -81.587879, 29.660861 ], "pop" : 5851, "state" : "FL" } +{ "_id" : "32132", "city" : "EDGEWATER", "loc" : [ -80.91034399999999, 28.981801 ], "pop" : 6690, "state" : "FL" } +{ "_id" : "32134", "city" : "SALT SPRINGS", "loc" : [ -81.88775699999999, 29.279554 ], "pop" : 14324, "state" : "FL" } +{ "_id" : "32136", "city" : "FLAGLER BEACH", "loc" : [ -81.13028799999999, 29.474978 ], "pop" : 4608, "state" : "FL" } +{ "_id" : "32137", "city" : "PALM COAST", "loc" : [ -81.21899000000001, 29.556515 ], "pop" : 18194, "state" : "FL" } +{ "_id" : "32139", "city" : "GEORGETOWN", "loc" : [ -81.629783, 29.403315 ], "pop" : 1839, "state" : "FL" } +{ "_id" : "32140", "city" : "FLORAHOME", "loc" : [ -81.862224, 29.758105 ], "pop" : 1475, "state" : "FL" } +{ "_id" : "32141", "city" : "EDGEWATER", "loc" : [ -80.896869, 28.945481 ], "pop" : 11379, "state" : "FL" } +{ "_id" : "32145", "city" : "HASTINGS", "loc" : [ -81.490908, 29.705147 ], "pop" : 2189, "state" : "FL" } +{ "_id" : "32148", "city" : "INTERLACHEN", "loc" : [ -81.889432, 29.627001 ], "pop" : 15416, "state" : "FL" } +{ "_id" : "32159", "city" : "LADY LAKE", "loc" : [ -81.92559799999999, 28.929939 ], "pop" : 11493, "state" : "FL" } +{ "_id" : "32168", "city" : "NEW SMYRNA BEACH", "loc" : [ -80.95843600000001, 29.024672 ], "pop" : 17624, "state" : "FL" } +{ "_id" : "32169", "city" : "NEW SMYRNA BEACH", "loc" : [ -80.888463, 29.017196 ], "pop" : 9169, "state" : "FL" } +{ "_id" : "32174", "city" : "ORMOND BEACH", "loc" : [ -81.088216, 29.283305 ], "pop" : 34477, "state" : "FL" } +{ "_id" : "32176", "city" : "ORMOND BEACH", "loc" : [ -81.058432, 29.322192 ], "pop" : 15383, "state" : "FL" } +{ "_id" : "32177", "city" : "PALATKA", "loc" : [ -81.659452, 29.657748 ], "pop" : 24263, "state" : "FL" } +{ "_id" : "32179", "city" : "OCKLAWAHA", "loc" : [ -81.88569, 29.064308 ], "pop" : 4385, "state" : "FL" } +{ "_id" : "32180", "city" : "PIERSON", "loc" : [ -81.43532999999999, 29.222596 ], "pop" : 7341, "state" : "FL" } +{ "_id" : "32181", "city" : "POMONA PARK", "loc" : [ -81.63073900000001, 29.502106 ], "pop" : 1006, "state" : "FL" } +{ "_id" : "32187", "city" : "SAN MATEO", "loc" : [ -81.5921, 29.588827 ], "pop" : 1864, "state" : "FL" } +{ "_id" : "32189", "city" : "SATSUMA", "loc" : [ -81.640596, 29.559354 ], "pop" : 3490, "state" : "FL" } +{ "_id" : "32190", "city" : "SEVILLE", "loc" : [ -81.527894, 29.320084 ], "pop" : 436, "state" : "FL" } +{ "_id" : "32195", "city" : "WEIRSDALE", "loc" : [ -81.893168, 28.978182 ], "pop" : 3034, "state" : "FL" } +{ "_id" : "32202", "city" : "JACKSONVILLE", "loc" : [ -81.651672, 30.329882 ], "pop" : 4724, "state" : "FL" } +{ "_id" : "32204", "city" : "JACKSONVILLE", "loc" : [ -81.685445, 30.318899 ], "pop" : 8839, "state" : "FL" } +{ "_id" : "32205", "city" : "JACKSONVILLE", "loc" : [ -81.72203399999999, 30.317236 ], "pop" : 46463, "state" : "FL" } +{ "_id" : "32206", "city" : "JACKSONVILLE", "loc" : [ -81.648769, 30.351073 ], "pop" : 23301, "state" : "FL" } +{ "_id" : "32207", "city" : "JACKSONVILLE", "loc" : [ -81.63205000000001, 30.290766 ], "pop" : 35661, "state" : "FL" } +{ "_id" : "32208", "city" : "JACKSONVILLE", "loc" : [ -81.688939, 30.393664 ], "pop" : 35615, "state" : "FL" } +{ "_id" : "32209", "city" : "JACKSONVILLE", "loc" : [ -81.691974, 30.35841 ], "pop" : 42856, "state" : "FL" } +{ "_id" : "32210", "city" : "JACKSONVILLE", "loc" : [ -81.74731199999999, 30.268743 ], "pop" : 54548, "state" : "FL" } +{ "_id" : "32211", "city" : "JACKSONVILLE", "loc" : [ -81.58824799999999, 30.348034 ], "pop" : 54199, "state" : "FL" } +{ "_id" : "32212", "city" : "JACKSONVILLE N A", "loc" : [ -81.68848, 30.220905 ], "pop" : 2517, "state" : "FL" } +{ "_id" : "32215", "city" : "CECIL FIELD NAS", "loc" : [ -81.66314199999999, 30.23295 ], "pop" : 0, "state" : "FL" } +{ "_id" : "32216", "city" : "JACKSONVILLE", "loc" : [ -81.547387, 30.293907 ], "pop" : 58867, "state" : "FL" } +{ "_id" : "32217", "city" : "JACKSONVILLE", "loc" : [ -81.616956, 30.240678 ], "pop" : 19356, "state" : "FL" } +{ "_id" : "32218", "city" : "JACKSONVILLE", "loc" : [ -81.662631, 30.45067 ], "pop" : 30493, "state" : "FL" } +{ "_id" : "32219", "city" : "JACKSONVILLE", "loc" : [ -81.763451, 30.403365 ], "pop" : 9570, "state" : "FL" } +{ "_id" : "32220", "city" : "JACKSONVILLE", "loc" : [ -81.817572, 30.329003 ], "pop" : 9389, "state" : "FL" } +{ "_id" : "32221", "city" : "JACKSONVILLE", "loc" : [ -81.82023100000001, 30.283707 ], "pop" : 18244, "state" : "FL" } +{ "_id" : "32222", "city" : "JACKSONVILLE", "loc" : [ -81.813081, 30.229176 ], "pop" : 4093, "state" : "FL" } +{ "_id" : "32223", "city" : "JACKSONVILLE", "loc" : [ -81.62996099999999, 30.154817 ], "pop" : 19120, "state" : "FL" } +{ "_id" : "32224", "city" : "JACKSONVILLE", "loc" : [ -81.440427, 30.303076 ], "pop" : 2535, "state" : "FL" } +{ "_id" : "32225", "city" : "JACKSONVILLE", "loc" : [ -81.506092, 30.350968 ], "pop" : 26551, "state" : "FL" } +{ "_id" : "32226", "city" : "JACKSONVILLE", "loc" : [ -81.544808, 30.473485 ], "pop" : 6880, "state" : "FL" } +{ "_id" : "32227", "city" : "JACKSONVILLE BEA", "loc" : [ -81.405424, 30.388275 ], "pop" : 9055, "state" : "FL" } +{ "_id" : "32233", "city" : "ATLANTIC BEACH", "loc" : [ -81.41586599999999, 30.348258 ], "pop" : 23412, "state" : "FL" } +{ "_id" : "32234", "city" : "BALDWIN", "loc" : [ -81.978345, 30.229562 ], "pop" : 5830, "state" : "FL" } +{ "_id" : "32244", "city" : "JACKSONVILLE", "loc" : [ -81.75557999999999, 30.223137 ], "pop" : 37603, "state" : "FL" } +{ "_id" : "32250", "city" : "JACKSONVILLE BEA", "loc" : [ -81.406243, 30.28319 ], "pop" : 22392, "state" : "FL" } +{ "_id" : "32256", "city" : "JACKSONVILLE", "loc" : [ -81.55713900000001, 30.221356 ], "pop" : 17293, "state" : "FL" } +{ "_id" : "32257", "city" : "JACKSONVILLE", "loc" : [ -81.605042, 30.192703 ], "pop" : 30022, "state" : "FL" } +{ "_id" : "32258", "city" : "JACKSONVILLE", "loc" : [ -81.573864, 30.145944 ], "pop" : 7261, "state" : "FL" } +{ "_id" : "32259", "city" : "JACKSONVILLE", "loc" : [ -81.621701, 30.095578 ], "pop" : 6677, "state" : "FL" } +{ "_id" : "32266", "city" : "NEPTUNE BEACH", "loc" : [ -81.405123, 30.31548 ], "pop" : 6816, "state" : "FL" } +{ "_id" : "32301", "city" : "TALLAHASSEE", "loc" : [ -84.259337, 30.428563 ], "pop" : 21329, "state" : "FL" } +{ "_id" : "32303", "city" : "TALLAHASSEE", "loc" : [ -84.318946, 30.487433 ], "pop" : 36053, "state" : "FL" } +{ "_id" : "32304", "city" : "TALLAHASSEE", "loc" : [ -84.32113200000001, 30.447752 ], "pop" : 33437, "state" : "FL" } +{ "_id" : "32306", "city" : "TALLAHASSEE", "loc" : [ -84.29559399999999, 30.442152 ], "pop" : 1690, "state" : "FL" } +{ "_id" : "32308", "city" : "TALLAHASSEE", "loc" : [ -84.206903, 30.507725 ], "pop" : 34857, "state" : "FL" } +{ "_id" : "32310", "city" : "TALLAHASSEE", "loc" : [ -84.32980000000001, 30.399125 ], "pop" : 30379, "state" : "FL" } +{ "_id" : "32311", "city" : "TALLAHASSEE", "loc" : [ -84.186995, 30.415625 ], "pop" : 17005, "state" : "FL" } +{ "_id" : "32312", "city" : "TALLAHASSEE", "loc" : [ -84.262708, 30.518474 ], "pop" : 17743, "state" : "FL" } +{ "_id" : "32320", "city" : "APALACHICOLA", "loc" : [ -85.006264, 29.725465 ], "pop" : 3859, "state" : "FL" } +{ "_id" : "32321", "city" : "BRISTOL", "loc" : [ -84.946558, 30.422279 ], "pop" : 4078, "state" : "FL" } +{ "_id" : "32322", "city" : "CARRABELLE", "loc" : [ -84.635845, 29.869205 ], "pop" : 2138, "state" : "FL" } +{ "_id" : "32324", "city" : "CHATTAHOOCHEE", "loc" : [ -84.82804400000001, 30.683394 ], "pop" : 6325, "state" : "FL" } +{ "_id" : "32327", "city" : "CRAWFORDVILLE", "loc" : [ -84.32047900000001, 30.210831 ], "pop" : 10004, "state" : "FL" } +{ "_id" : "32328", "city" : "SAINT GEORGE ISL", "loc" : [ -84.87009999999999, 29.733906 ], "pop" : 2541, "state" : "FL" } +{ "_id" : "32331", "city" : "GREENVILLE", "loc" : [ -83.647397, 30.451199 ], "pop" : 4107, "state" : "FL" } +{ "_id" : "32333", "city" : "HAVANA", "loc" : [ -84.41434, 30.609242 ], "pop" : 9767, "state" : "FL" } +{ "_id" : "32334", "city" : "HOSFORD", "loc" : [ -84.80543299999999, 30.363875 ], "pop" : 1491, "state" : "FL" } +{ "_id" : "32336", "city" : "LAMONT", "loc" : [ -83.900266, 30.365341 ], "pop" : 1409, "state" : "FL" } +{ "_id" : "32340", "city" : "MADISON", "loc" : [ -83.406678, 30.480209 ], "pop" : 11339, "state" : "FL" } +{ "_id" : "32344", "city" : "MONTICELLO", "loc" : [ -83.892454, 30.519681 ], "pop" : 9578, "state" : "FL" } +{ "_id" : "32346", "city" : "PANACEA", "loc" : [ -84.391212, 30.015322 ], "pop" : 1292, "state" : "FL" } +{ "_id" : "32347", "city" : "PERRY", "loc" : [ -83.585021, 30.097489 ], "pop" : 15401, "state" : "FL" } +{ "_id" : "32350", "city" : "PINETTA", "loc" : [ -83.340463, 30.599703 ], "pop" : 642, "state" : "FL" } +{ "_id" : "32351", "city" : "QUINCY", "loc" : [ -84.60945, 30.586675 ], "pop" : 25013, "state" : "FL" } +{ "_id" : "32356", "city" : "SALEM", "loc" : [ -83.385828, 29.823815 ], "pop" : 264, "state" : "FL" } +{ "_id" : "32358", "city" : "SOPCHOPPY", "loc" : [ -84.454877, 30.071353 ], "pop" : 3335, "state" : "FL" } +{ "_id" : "32359", "city" : "STEINHATCHEE", "loc" : [ -83.372332, 29.673871 ], "pop" : 1415, "state" : "FL" } +{ "_id" : "32401", "city" : "PANAMA CITY", "loc" : [ -85.64940300000001, 30.160624 ], "pop" : 24968, "state" : "FL" } +{ "_id" : "32403", "city" : "PANAMA CITY", "loc" : [ -85.57622499999999, 30.058252 ], "pop" : 5333, "state" : "FL" } +{ "_id" : "32404", "city" : "PANAMA CITY", "loc" : [ -85.57626399999999, 30.165291 ], "pop" : 30101, "state" : "FL" } +{ "_id" : "32405", "city" : "PANAMA CITY", "loc" : [ -85.672686, 30.194949 ], "pop" : 25701, "state" : "FL" } +{ "_id" : "32407", "city" : "PANAMA CITY BEAC", "loc" : [ -85.791984, 30.194623 ], "pop" : 3115, "state" : "FL" } +{ "_id" : "32408", "city" : "PANAMA CITY BEAC", "loc" : [ -85.763628, 30.160859 ], "pop" : 9702, "state" : "FL" } +{ "_id" : "32409", "city" : "SOUTHPORT", "loc" : [ -85.644536, 30.310679 ], "pop" : 5001, "state" : "FL" } +{ "_id" : "32413", "city" : "PANAMA CITY BEAC", "loc" : [ -85.904946, 30.245835 ], "pop" : 5646, "state" : "FL" } +{ "_id" : "32420", "city" : "ALFORD", "loc" : [ -85.34838000000001, 30.714106 ], "pop" : 576, "state" : "FL" } +{ "_id" : "32421", "city" : "ALTHA", "loc" : [ -85.17043, 30.531882 ], "pop" : 3280, "state" : "FL" } +{ "_id" : "32423", "city" : "BASCOM", "loc" : [ -85.09721999999999, 30.951365 ], "pop" : 1011, "state" : "FL" } +{ "_id" : "32424", "city" : "BLOUNTSTOWN", "loc" : [ -85.062022, 30.4394 ], "pop" : 6984, "state" : "FL" } +{ "_id" : "32425", "city" : "BONIFAY", "loc" : [ -85.68996199999999, 30.846369 ], "pop" : 9342, "state" : "FL" } +{ "_id" : "32426", "city" : "CAMPBELLTON", "loc" : [ -85.37659600000001, 30.95629 ], "pop" : 741, "state" : "FL" } +{ "_id" : "32427", "city" : "CARYVILLE", "loc" : [ -85.79978699999999, 30.796878 ], "pop" : 2517, "state" : "FL" } +{ "_id" : "32428", "city" : "CHIPLEY", "loc" : [ -85.54864600000001, 30.710658 ], "pop" : 11248, "state" : "FL" } +{ "_id" : "32430", "city" : "CLARKSVILLE", "loc" : [ -85.189806, 30.356834 ], "pop" : 129, "state" : "FL" } +{ "_id" : "32431", "city" : "COTTONDALE", "loc" : [ -85.38467199999999, 30.800359 ], "pop" : 3333, "state" : "FL" } +{ "_id" : "32433", "city" : "DE FUNIAK SPRING", "loc" : [ -86.138006, 30.751783 ], "pop" : 15496, "state" : "FL" } +{ "_id" : "32437", "city" : "EBRO", "loc" : [ -85.88806599999999, 30.435181 ], "pop" : 361, "state" : "FL" } +{ "_id" : "32438", "city" : "FOUNTAIN", "loc" : [ -85.429272, 30.475327 ], "pop" : 1869, "state" : "FL" } +{ "_id" : "32439", "city" : "FREEPORT", "loc" : [ -86.168441, 30.489596 ], "pop" : 744, "state" : "FL" } +{ "_id" : "32440", "city" : "GRACEVILLE", "loc" : [ -85.513622, 30.942601 ], "pop" : 5353, "state" : "FL" } +{ "_id" : "32442", "city" : "GRAND RIDGE", "loc" : [ -85.020954, 30.714831 ], "pop" : 1708, "state" : "FL" } +{ "_id" : "32443", "city" : "GREENWOOD", "loc" : [ -85.15549, 30.852506 ], "pop" : 4058, "state" : "FL" } +{ "_id" : "32444", "city" : "LYNN HAVEN", "loc" : [ -85.646658, 30.236165 ], "pop" : 12205, "state" : "FL" } +{ "_id" : "32445", "city" : "MALONE", "loc" : [ -85.16387400000001, 30.960245 ], "pop" : 1046, "state" : "FL" } +{ "_id" : "32446", "city" : "MARIANNA", "loc" : [ -85.229367, 30.758587 ], "pop" : 17908, "state" : "FL" } +{ "_id" : "32449", "city" : "KINARD", "loc" : [ -85.206467, 30.263241 ], "pop" : 297, "state" : "FL" } +{ "_id" : "32455", "city" : "PONCE DE LEON", "loc" : [ -85.954633, 30.704146 ], "pop" : 2200, "state" : "FL" } +{ "_id" : "32456", "city" : "PORT SAINT JOE", "loc" : [ -85.298787, 29.83539 ], "pop" : 7490, "state" : "FL" } +{ "_id" : "32459", "city" : "SANTA ROSA BEACH", "loc" : [ -86.24580899999999, 30.365883 ], "pop" : 5039, "state" : "FL" } +{ "_id" : "32460", "city" : "SNEADS", "loc" : [ -84.933655, 30.727619 ], "pop" : 6334, "state" : "FL" } +{ "_id" : "32462", "city" : "VERNON", "loc" : [ -85.755286, 30.62668 ], "pop" : 4111, "state" : "FL" } +{ "_id" : "32464", "city" : "WESTVILLE", "loc" : [ -85.91297299999999, 30.874689 ], "pop" : 3081, "state" : "FL" } +{ "_id" : "32465", "city" : "WEWAHITCHKA", "loc" : [ -85.20483, 30.093255 ], "pop" : 4014, "state" : "FL" } +{ "_id" : "32466", "city" : "YOUNGSTOWN", "loc" : [ -85.516881, 30.326913 ], "pop" : 3634, "state" : "FL" } +{ "_id" : "32501", "city" : "PENSACOLA", "loc" : [ -87.224763, 30.422282 ], "pop" : 16485, "state" : "FL" } +{ "_id" : "32503", "city" : "PENSACOLA", "loc" : [ -87.210432, 30.456406 ], "pop" : 34491, "state" : "FL" } +{ "_id" : "32504", "city" : "PENSACOLA", "loc" : [ -87.187242, 30.487299 ], "pop" : 23077, "state" : "FL" } +{ "_id" : "32505", "city" : "PENSACOLA", "loc" : [ -87.258937, 30.448069 ], "pop" : 29026, "state" : "FL" } +{ "_id" : "32506", "city" : "PENSACOLA", "loc" : [ -87.309185, 30.412912 ], "pop" : 29834, "state" : "FL" } +{ "_id" : "32507", "city" : "PENSACOLA", "loc" : [ -87.312558, 30.373707 ], "pop" : 23525, "state" : "FL" } +{ "_id" : "32508", "city" : "PENSACOLA", "loc" : [ -87.274945, 30.351063 ], "pop" : 3688, "state" : "FL" } +{ "_id" : "32514", "city" : "PENSACOLA", "loc" : [ -87.216723, 30.524148 ], "pop" : 30185, "state" : "FL" } +{ "_id" : "32526", "city" : "PENSACOLA", "loc" : [ -87.317925, 30.475593 ], "pop" : 28674, "state" : "FL" } +{ "_id" : "32531", "city" : "BAKER", "loc" : [ -86.677015, 30.831569 ], "pop" : 3389, "state" : "FL" } +{ "_id" : "32533", "city" : "CANTONMENT", "loc" : [ -87.325052, 30.614253 ], "pop" : 19829, "state" : "FL" } +{ "_id" : "32534", "city" : "PENSACOLA", "loc" : [ -87.279324, 30.530065 ], "pop" : 12046, "state" : "FL" } +{ "_id" : "32535", "city" : "CENTURY", "loc" : [ -87.32158200000001, 30.968742 ], "pop" : 5422, "state" : "FL" } +{ "_id" : "32536", "city" : "CRESTVIEW", "loc" : [ -86.553678, 30.77061 ], "pop" : 21799, "state" : "FL" } +{ "_id" : "32541", "city" : "SANDESTIN", "loc" : [ -86.484903, 30.397198 ], "pop" : 8080, "state" : "FL" } +{ "_id" : "32542", "city" : "EGLIN A F B", "loc" : [ -86.61595800000001, 30.479409 ], "pop" : 13431, "state" : "FL" } +{ "_id" : "32547", "city" : "FORT WALTON BEAC", "loc" : [ -86.627487, 30.447297 ], "pop" : 27344, "state" : "FL" } +{ "_id" : "32548", "city" : "FORT WALTON BEAC", "loc" : [ -86.62147899999999, 30.415262 ], "pop" : 21791, "state" : "FL" } +{ "_id" : "32561", "city" : "GULF BREEZE", "loc" : [ -87.043875, 30.3847 ], "pop" : 27875, "state" : "FL" } +{ "_id" : "32564", "city" : "HOLT", "loc" : [ -86.704638, 30.72522 ], "pop" : 1821, "state" : "FL" } +{ "_id" : "32565", "city" : "JAY", "loc" : [ -87.13323699999999, 30.898488 ], "pop" : 5952, "state" : "FL" } +{ "_id" : "32566", "city" : "NAVARRE", "loc" : [ -86.937102, 30.590261 ], "pop" : 5537, "state" : "FL" } +{ "_id" : "32567", "city" : "LAUREL HILL", "loc" : [ -86.400323, 30.95236 ], "pop" : 2967, "state" : "FL" } +{ "_id" : "32568", "city" : "WALNUT HILL", "loc" : [ -87.449628, 30.870043 ], "pop" : 3604, "state" : "FL" } +{ "_id" : "32569", "city" : "MARY ESTHER", "loc" : [ -86.71271900000001, 30.412186 ], "pop" : 9382, "state" : "FL" } +{ "_id" : "32570", "city" : "MILTON", "loc" : [ -87.04727800000001, 30.660413 ], "pop" : 20038, "state" : "FL" } +{ "_id" : "32571", "city" : "PACE", "loc" : [ -87.15033, 30.616173 ], "pop" : 15661, "state" : "FL" } +{ "_id" : "32578", "city" : "NICEVILLE", "loc" : [ -86.41446000000001, 30.495771 ], "pop" : 25146, "state" : "FL" } +{ "_id" : "32579", "city" : "SHALIMAR", "loc" : [ -86.571724, 30.445565 ], "pop" : 9327, "state" : "FL" } +{ "_id" : "32580", "city" : "VALPARAISO", "loc" : [ -86.50091399999999, 30.509197 ], "pop" : 4964, "state" : "FL" } +{ "_id" : "32583", "city" : "MILTON", "loc" : [ -87.066273, 30.576058 ], "pop" : 9457, "state" : "FL" } +{ "_id" : "32601", "city" : "GAINESVILLE", "loc" : [ -82.310046, 29.645029 ], "pop" : 31328, "state" : "FL" } +{ "_id" : "32603", "city" : "GAINESVILLE", "loc" : [ -82.34928600000001, 29.651484 ], "pop" : 5271, "state" : "FL" } +{ "_id" : "32605", "city" : "GAINESVILLE", "loc" : [ -82.36794, 29.678458 ], "pop" : 21349, "state" : "FL" } +{ "_id" : "32606", "city" : "GAINESVILLE", "loc" : [ -82.40232399999999, 29.695393 ], "pop" : 18408, "state" : "FL" } +{ "_id" : "32607", "city" : "GAINESVILLE", "loc" : [ -82.40325199999999, 29.645618 ], "pop" : 21103, "state" : "FL" } +{ "_id" : "32608", "city" : "GAINESVILLE", "loc" : [ -82.387282, 29.613204 ], "pop" : 22945, "state" : "FL" } +{ "_id" : "32609", "city" : "GAINESVILLE", "loc" : [ -82.308032, 29.70053 ], "pop" : 17668, "state" : "FL" } +{ "_id" : "32611", "city" : "GAINESVILLE", "loc" : [ -82.35092, 29.644148 ], "pop" : 8023, "state" : "FL" } +{ "_id" : "32615", "city" : "SANTA FE", "loc" : [ -82.480531, 29.796996 ], "pop" : 9414, "state" : "FL" } +{ "_id" : "32617", "city" : "ANTHONY", "loc" : [ -82.12615700000001, 29.304785 ], "pop" : 6296, "state" : "FL" } +{ "_id" : "32618", "city" : "ARCHER", "loc" : [ -82.51084, 29.559738 ], "pop" : 6188, "state" : "FL" } +{ "_id" : "32619", "city" : "BELL", "loc" : [ -82.871106, 29.78373 ], "pop" : 2446, "state" : "FL" } +{ "_id" : "32621", "city" : "BRONSON", "loc" : [ -82.635644, 29.460952 ], "pop" : 2111, "state" : "FL" } +{ "_id" : "32622", "city" : "BROOKER", "loc" : [ -82.29563400000001, 29.919028 ], "pop" : 1194, "state" : "FL" } +{ "_id" : "32625", "city" : "CEDAR KEY", "loc" : [ -83.01679300000001, 29.171006 ], "pop" : 1173, "state" : "FL" } +{ "_id" : "32626", "city" : "CHIEFLAND", "loc" : [ -82.88089600000001, 29.483243 ], "pop" : 7498, "state" : "FL" } +{ "_id" : "32631", "city" : "EARLETON", "loc" : [ -82.11376199999999, 29.722159 ], "pop" : 1014, "state" : "FL" } +{ "_id" : "32640", "city" : "HAWTHORNE", "loc" : [ -82.105625, 29.573998 ], "pop" : 4151, "state" : "FL" } +{ "_id" : "32643", "city" : "HIGH SPRINGS", "loc" : [ -82.615628, 29.841022 ], "pop" : 7557, "state" : "FL" } +{ "_id" : "32648", "city" : "HORSESHOE BEACH", "loc" : [ -83.26158700000001, 29.48689 ], "pop" : 652, "state" : "FL" } +{ "_id" : "32656", "city" : "KEYSTONE HEIGHTS", "loc" : [ -81.989885, 29.797579 ], "pop" : 8011, "state" : "FL" } +{ "_id" : "32666", "city" : "MELROSE", "loc" : [ -82.027863, 29.732456 ], "pop" : 5507, "state" : "FL" } +{ "_id" : "32667", "city" : "MICANOPY", "loc" : [ -82.279698, 29.526029 ], "pop" : 2409, "state" : "FL" } +{ "_id" : "32668", "city" : "MORRISTON", "loc" : [ -82.491668, 29.28126 ], "pop" : 2054, "state" : "FL" } +{ "_id" : "32669", "city" : "NEWBERRY", "loc" : [ -82.585188, 29.660906 ], "pop" : 5491, "state" : "FL" } +{ "_id" : "32680", "city" : "OLD TOWN", "loc" : [ -83.057393, 29.624558 ], "pop" : 9494, "state" : "FL" } +{ "_id" : "32686", "city" : "REDDICK", "loc" : [ -82.243995, 29.375352 ], "pop" : 10006, "state" : "FL" } +{ "_id" : "32693", "city" : "TRENTON", "loc" : [ -82.80934499999999, 29.626375 ], "pop" : 6925, "state" : "FL" } +{ "_id" : "32694", "city" : "WALDO", "loc" : [ -82.160791, 29.787096 ], "pop" : 1676, "state" : "FL" } +{ "_id" : "32696", "city" : "WILLISTON", "loc" : [ -82.485601, 29.397737 ], "pop" : 7664, "state" : "FL" } +{ "_id" : "32701", "city" : "ALTAMONTE SPRING", "loc" : [ -81.371908, 28.662728 ], "pop" : 21392, "state" : "FL" } +{ "_id" : "32702", "city" : "ALTOONA", "loc" : [ -81.632322, 29.021935 ], "pop" : 1743, "state" : "FL" } +{ "_id" : "32703", "city" : "HUNT CLUB", "loc" : [ -81.48514900000001, 28.661865 ], "pop" : 34100, "state" : "FL" } +{ "_id" : "32707", "city" : "CASSELBERRY", "loc" : [ -81.31221499999999, 28.661671 ], "pop" : 30933, "state" : "FL" } +{ "_id" : "32708", "city" : "WINTER SPRINGS", "loc" : [ -81.281367, 28.683097 ], "pop" : 27311, "state" : "FL" } +{ "_id" : "32709", "city" : "CHRISTMAS", "loc" : [ -81.01157000000001, 28.546244 ], "pop" : 2331, "state" : "FL" } +{ "_id" : "32712", "city" : "APOPKA", "loc" : [ -81.513615, 28.711976 ], "pop" : 20208, "state" : "FL" } +{ "_id" : "32713", "city" : "DEBARY", "loc" : [ -81.306506, 28.884573 ], "pop" : 9491, "state" : "FL" } +{ "_id" : "32714", "city" : "FOREST CITY", "loc" : [ -81.40853300000001, 28.664983 ], "pop" : 29133, "state" : "FL" } +{ "_id" : "32720", "city" : "DELAND", "loc" : [ -81.334853, 29.02659 ], "pop" : 23152, "state" : "FL" } +{ "_id" : "32724", "city" : "DELAND", "loc" : [ -81.28634099999999, 29.04225 ], "pop" : 21715, "state" : "FL" } +{ "_id" : "32725", "city" : "DELTONA", "loc" : [ -81.24730700000001, 28.898897 ], "pop" : 27678, "state" : "FL" } +{ "_id" : "32726", "city" : "EUSTIS", "loc" : [ -81.64512999999999, 28.857686 ], "pop" : 19585, "state" : "FL" } +{ "_id" : "32730", "city" : "FERN PARK", "loc" : [ -81.341837, 28.651161 ], "pop" : 4815, "state" : "FL" } +{ "_id" : "32732", "city" : "GENEVA", "loc" : [ -81.11136999999999, 28.750299 ], "pop" : 3827, "state" : "FL" } +{ "_id" : "32735", "city" : "GRAND ISLAND", "loc" : [ -81.739093, 28.886552 ], "pop" : 1416, "state" : "FL" } +{ "_id" : "32738", "city" : "DELTONA", "loc" : [ -81.192171, 28.909311 ], "pop" : 22426, "state" : "FL" } +{ "_id" : "32744", "city" : "LAKE HELEN", "loc" : [ -81.233367, 28.980567 ], "pop" : 3229, "state" : "FL" } +{ "_id" : "32746", "city" : "HEATHROW", "loc" : [ -81.338075, 28.752352 ], "pop" : 9959, "state" : "FL" } +{ "_id" : "32750", "city" : "LONGWOOD", "loc" : [ -81.355238, 28.711994 ], "pop" : 27633, "state" : "FL" } +{ "_id" : "32751", "city" : "EATONVILLE", "loc" : [ -81.354598, 28.631284 ], "pop" : 19834, "state" : "FL" } +{ "_id" : "32754", "city" : "MIMS", "loc" : [ -80.86627799999999, 28.697383 ], "pop" : 8943, "state" : "FL" } +{ "_id" : "32757", "city" : "MOUNT DORA", "loc" : [ -81.64559300000001, 28.792787 ], "pop" : 15757, "state" : "FL" } +{ "_id" : "32759", "city" : "OAK HILL", "loc" : [ -80.855063, 28.869985 ], "pop" : 2261, "state" : "FL" } +{ "_id" : "32763", "city" : "ORANGE CITY", "loc" : [ -81.29952400000001, 28.945291 ], "pop" : 12946, "state" : "FL" } +{ "_id" : "32764", "city" : "OSTEEN", "loc" : [ -81.15622399999999, 28.842617 ], "pop" : 2215, "state" : "FL" } +{ "_id" : "32765", "city" : "OVIEDO", "loc" : [ -81.206593, 28.651256 ], "pop" : 19519, "state" : "FL" } +{ "_id" : "32766", "city" : "CHULUOTA", "loc" : [ -81.11823699999999, 28.640634 ], "pop" : 3280, "state" : "FL" } +{ "_id" : "32767", "city" : "PAISLEY", "loc" : [ -81.50300900000001, 28.999323 ], "pop" : 1963, "state" : "FL" } +{ "_id" : "32771", "city" : "SANFORD", "loc" : [ -81.285044, 28.801307 ], "pop" : 27016, "state" : "FL" } +{ "_id" : "32773", "city" : "SANFORD", "loc" : [ -81.282042, 28.764385 ], "pop" : 19707, "state" : "FL" } +{ "_id" : "32776", "city" : "SORRENTO", "loc" : [ -81.53231700000001, 28.803519 ], "pop" : 5382, "state" : "FL" } +{ "_id" : "32778", "city" : "TAVARES", "loc" : [ -81.73405, 28.801027 ], "pop" : 12131, "state" : "FL" } +{ "_id" : "32779", "city" : "SPRINGS PLAZA", "loc" : [ -81.42276699999999, 28.703978 ], "pop" : 27075, "state" : "FL" } +{ "_id" : "32780", "city" : "TITUSVILLE", "loc" : [ -80.819141, 28.569712 ], "pop" : 28649, "state" : "FL" } +{ "_id" : "32784", "city" : "DONA VISTA", "loc" : [ -81.67165300000001, 28.931443 ], "pop" : 7866, "state" : "FL" } +{ "_id" : "32789", "city" : "WINTER PARK", "loc" : [ -81.353436, 28.597824 ], "pop" : 24236, "state" : "FL" } +{ "_id" : "32792", "city" : "ALOMA", "loc" : [ -81.30211199999999, 28.60779 ], "pop" : 44973, "state" : "FL" } +{ "_id" : "32796", "city" : "TITUSVILLE", "loc" : [ -80.842915, 28.627078 ], "pop" : 19916, "state" : "FL" } +{ "_id" : "32798", "city" : "ZELLWOOD", "loc" : [ -81.57617399999999, 28.71944 ], "pop" : 1930, "state" : "FL" } +{ "_id" : "32801", "city" : "ORLANDO", "loc" : [ -81.372668, 28.539882 ], "pop" : 9275, "state" : "FL" } +{ "_id" : "32803", "city" : "ORLANDO", "loc" : [ -81.35346199999999, 28.555897 ], "pop" : 19992, "state" : "FL" } +{ "_id" : "32804", "city" : "FAIRVILLA", "loc" : [ -81.391955, 28.576547 ], "pop" : 18087, "state" : "FL" } +{ "_id" : "32805", "city" : "ORLANDO", "loc" : [ -81.404516, 28.5302 ], "pop" : 29117, "state" : "FL" } +{ "_id" : "32806", "city" : "ORLANDO", "loc" : [ -81.35696799999999, 28.513958 ], "pop" : 25996, "state" : "FL" } +{ "_id" : "32807", "city" : "AZALEA PARK", "loc" : [ -81.305274, 28.544924 ], "pop" : 28087, "state" : "FL" } +{ "_id" : "32808", "city" : "PINE HILLS", "loc" : [ -81.44758, 28.580463 ], "pop" : 42278, "state" : "FL" } +{ "_id" : "32809", "city" : "PINE CASTLE", "loc" : [ -81.38175099999999, 28.461916 ], "pop" : 17602, "state" : "FL" } +{ "_id" : "32810", "city" : "LOCKHART", "loc" : [ -81.42585200000001, 28.622183 ], "pop" : 23781, "state" : "FL" } +{ "_id" : "32811", "city" : "ORLO VISTA", "loc" : [ -81.442014, 28.516082 ], "pop" : 21545, "state" : "FL" } +{ "_id" : "32812", "city" : "ORLANDO", "loc" : [ -81.328816, 28.49981 ], "pop" : 26888, "state" : "FL" } +{ "_id" : "32813", "city" : "NAVAL TRAINING C", "loc" : [ -81.32896599999999, 28.570467 ], "pop" : 9216, "state" : "FL" } +{ "_id" : "32815", "city" : "KENNEDY SPACE CE", "loc" : [ -80.58248, 28.498821 ], "pop" : 1, "state" : "FL" } +{ "_id" : "32817", "city" : "UNION PARK", "loc" : [ -81.25353699999999, 28.590251 ], "pop" : 20723, "state" : "FL" } +{ "_id" : "32818", "city" : "ORLANDO", "loc" : [ -81.484618, 28.580147 ], "pop" : 26887, "state" : "FL" } +{ "_id" : "32819", "city" : "SAND LAKE", "loc" : [ -81.452484, 28.467258 ], "pop" : 4434, "state" : "FL" } +{ "_id" : "32820", "city" : "UNION PARK", "loc" : [ -81.11062800000001, 28.578256 ], "pop" : 2587, "state" : "FL" } +{ "_id" : "32821", "city" : "ORLANDO", "loc" : [ -81.46660199999999, 28.395724 ], "pop" : 9982, "state" : "FL" } +{ "_id" : "32822", "city" : "VENTURA", "loc" : [ -81.293874, 28.504765 ], "pop" : 33986, "state" : "FL" } +{ "_id" : "32824", "city" : "ORLANDO", "loc" : [ -81.36218700000001, 28.393157 ], "pop" : 8225, "state" : "FL" } +{ "_id" : "32825", "city" : "ORLANDO", "loc" : [ -81.257081, 28.546865 ], "pop" : 26373, "state" : "FL" } +{ "_id" : "32826", "city" : "ORLANDO", "loc" : [ -81.19070499999999, 28.582601 ], "pop" : 12369, "state" : "FL" } +{ "_id" : "32827", "city" : "ORLANDO", "loc" : [ -81.342979, 28.43168 ], "pop" : 3831, "state" : "FL" } +{ "_id" : "32828", "city" : "ORLANDO", "loc" : [ -81.179489, 28.552297 ], "pop" : 3249, "state" : "FL" } +{ "_id" : "32829", "city" : "ORLANDO", "loc" : [ -81.260778, 28.484877 ], "pop" : 3848, "state" : "FL" } +{ "_id" : "32830", "city" : "LAKE BUENA VISTA", "loc" : [ -81.519034, 28.369378 ], "pop" : 6, "state" : "FL" } +{ "_id" : "32831", "city" : "ORLANDO", "loc" : [ -81.191768, 28.488229 ], "pop" : 1123, "state" : "FL" } +{ "_id" : "32832", "city" : "ORLANDO", "loc" : [ -81.188807, 28.377428 ], "pop" : 1863, "state" : "FL" } +{ "_id" : "32833", "city" : "UNION PARK", "loc" : [ -81.098129, 28.531797 ], "pop" : 3748, "state" : "FL" } +{ "_id" : "32835", "city" : "ORLANDO", "loc" : [ -81.478663, 28.528885 ], "pop" : 20343, "state" : "FL" } +{ "_id" : "32836", "city" : "ORLANDO", "loc" : [ -81.49563999999999, 28.460842 ], "pop" : 21329, "state" : "FL" } +{ "_id" : "32837", "city" : "ORLANDO", "loc" : [ -81.41788200000001, 28.394861 ], "pop" : 13075, "state" : "FL" } +{ "_id" : "32839", "city" : "ORLANDO", "loc" : [ -81.408162, 28.487102 ], "pop" : 33946, "state" : "FL" } +{ "_id" : "32901", "city" : "MELBOURNE", "loc" : [ -80.620015, 28.069132 ], "pop" : 21138, "state" : "FL" } +{ "_id" : "32903", "city" : "INDIALANTIC", "loc" : [ -80.57871799999999, 28.109059 ], "pop" : 11020, "state" : "FL" } +{ "_id" : "32904", "city" : "MELBOURNE VILLAG", "loc" : [ -80.668577, 28.073177 ], "pop" : 15441, "state" : "FL" } +{ "_id" : "32905", "city" : "PALM BAY", "loc" : [ -80.599087, 28.014605 ], "pop" : 26367, "state" : "FL" } +{ "_id" : "32907", "city" : "PALM BAY", "loc" : [ -80.673889, 28.016849 ], "pop" : 25674, "state" : "FL" } +{ "_id" : "32908", "city" : "PALM BAY", "loc" : [ -80.689426, 27.981636 ], "pop" : 3272, "state" : "FL" } +{ "_id" : "32909", "city" : "PALM BAY", "loc" : [ -80.647327, 27.96936 ], "pop" : 12028, "state" : "FL" } +{ "_id" : "32920", "city" : "CAPE CANAVERAL", "loc" : [ -80.60426699999999, 28.39034 ], "pop" : 7655, "state" : "FL" } +{ "_id" : "32922", "city" : "COCOA", "loc" : [ -80.746455, 28.367183 ], "pop" : 17316, "state" : "FL" } +{ "_id" : "32925", "city" : "PATRICK A F B", "loc" : [ -80.60712599999999, 28.259896 ], "pop" : 597, "state" : "FL" } +{ "_id" : "32926", "city" : "COCOA", "loc" : [ -80.786969, 28.390987 ], "pop" : 17930, "state" : "FL" } +{ "_id" : "32927", "city" : "PORT SAINT JOHN", "loc" : [ -80.79111399999999, 28.46844 ], "pop" : 17351, "state" : "FL" } +{ "_id" : "32931", "city" : "COCOA BEACH", "loc" : [ -80.612066, 28.332451 ], "pop" : 14989, "state" : "FL" } +{ "_id" : "32934", "city" : "EAU GALLIE", "loc" : [ -80.691683, 28.136822 ], "pop" : 9539, "state" : "FL" } +{ "_id" : "32935", "city" : "MELBOURNE", "loc" : [ -80.65235300000001, 28.138385 ], "pop" : 34153, "state" : "FL" } +{ "_id" : "32937", "city" : "INDIAN HARBOR BE", "loc" : [ -80.598671, 28.178571 ], "pop" : 28921, "state" : "FL" } +{ "_id" : "32940", "city" : "MELBOURNE", "loc" : [ -80.68495900000001, 28.206136 ], "pop" : 5360, "state" : "FL" } +{ "_id" : "32948", "city" : "FELLSMERE", "loc" : [ -80.601947, 27.764273 ], "pop" : 2936, "state" : "FL" } +{ "_id" : "32951", "city" : "MELBOURNE BEACH", "loc" : [ -80.53893600000001, 28.021923 ], "pop" : 8060, "state" : "FL" } +{ "_id" : "32952", "city" : "MERRITT ISLAND", "loc" : [ -80.67818, 28.328607 ], "pop" : 12919, "state" : "FL" } +{ "_id" : "32953", "city" : "MERRITT ISLAND", "loc" : [ -80.695865, 28.391234 ], "pop" : 23338, "state" : "FL" } +{ "_id" : "32955", "city" : "ROCKLEDGE", "loc" : [ -80.73193000000001, 28.313441 ], "pop" : 20576, "state" : "FL" } +{ "_id" : "32958", "city" : "SEBASTIAN", "loc" : [ -80.478432, 27.790082 ], "pop" : 14084, "state" : "FL" } +{ "_id" : "32960", "city" : "VERO BEACH", "loc" : [ -80.403075, 27.632985 ], "pop" : 19207, "state" : "FL" } +{ "_id" : "32962", "city" : "VERO BEACH", "loc" : [ -80.392251, 27.588486 ], "pop" : 17462, "state" : "FL" } +{ "_id" : "32963", "city" : "INDIAN RIVER SHO", "loc" : [ -80.360916, 27.653623 ], "pop" : 10980, "state" : "FL" } +{ "_id" : "32966", "city" : "VERO BEACH", "loc" : [ -80.47939, 27.637214 ], "pop" : 10687, "state" : "FL" } +{ "_id" : "32967", "city" : "VERO BEACH", "loc" : [ -80.44161699999999, 27.697223 ], "pop" : 9607, "state" : "FL" } +{ "_id" : "32968", "city" : "VERO BEACH", "loc" : [ -80.43822299999999, 27.59993 ], "pop" : 5238, "state" : "FL" } +{ "_id" : "32976", "city" : "BAREFOOT BAY", "loc" : [ -80.516051, 27.878146 ], "pop" : 7870, "state" : "FL" } +{ "_id" : "33004", "city" : "DANIA", "loc" : [ -80.144728, 26.047557 ], "pop" : 12552, "state" : "FL" } +{ "_id" : "33009", "city" : "HALLANDALE", "loc" : [ -80.140737, 25.985019 ], "pop" : 33743, "state" : "FL" } +{ "_id" : "33010", "city" : "HIALEAH", "loc" : [ -80.280801, 25.832536 ], "pop" : 40437, "state" : "FL" } +{ "_id" : "33012", "city" : "HIALEAH", "loc" : [ -80.30589999999999, 25.865395 ], "pop" : 73194, "state" : "FL" } +{ "_id" : "33013", "city" : "HIALEAH", "loc" : [ -80.272533, 25.859351 ], "pop" : 30108, "state" : "FL" } +{ "_id" : "33014", "city" : "HIALEAH", "loc" : [ -80.30625499999999, 25.896349 ], "pop" : 35873, "state" : "FL" } +{ "_id" : "33015", "city" : "HIALEAH", "loc" : [ -80.316545, 25.938841 ], "pop" : 31171, "state" : "FL" } +{ "_id" : "33016", "city" : "HIALEAH", "loc" : [ -80.33681, 25.880262 ], "pop" : 32053, "state" : "FL" } +{ "_id" : "33019", "city" : "HOLLYWOOD", "loc" : [ -80.121931, 26.007011 ], "pop" : 12115, "state" : "FL" } +{ "_id" : "33020", "city" : "HOLLYWOOD", "loc" : [ -80.15166000000001, 26.016091 ], "pop" : 35468, "state" : "FL" } +{ "_id" : "33021", "city" : "HOLLYWOOD", "loc" : [ -80.18908500000001, 26.021836 ], "pop" : 39987, "state" : "FL" } +{ "_id" : "33023", "city" : "MIRAMAR", "loc" : [ -80.21603500000001, 25.987516 ], "pop" : 54274, "state" : "FL" } +{ "_id" : "33024", "city" : "PEMBROKE PINES", "loc" : [ -80.240183, 26.024273 ], "pop" : 54411, "state" : "FL" } +{ "_id" : "33025", "city" : "HOLLYWOOD", "loc" : [ -80.271236, 25.992061 ], "pop" : 24778, "state" : "FL" } +{ "_id" : "33026", "city" : "HOLLYWOOD", "loc" : [ -80.29744100000001, 26.022927 ], "pop" : 21473, "state" : "FL" } +{ "_id" : "33027", "city" : "HOLLYWOOD", "loc" : [ -80.32483999999999, 25.997449 ], "pop" : 6955, "state" : "FL" } +{ "_id" : "33028", "city" : "HOLLYWOOD", "loc" : [ -80.330797, 26.024804 ], "pop" : 186, "state" : "FL" } +{ "_id" : "33029", "city" : "PEMBROKE PINES", "loc" : [ -80.42840700000001, 26.01375 ], "pop" : 2882, "state" : "FL" } +{ "_id" : "33030", "city" : "HOMESTEAD", "loc" : [ -80.483853, 25.476639 ], "pop" : 26721, "state" : "FL" } +{ "_id" : "33031", "city" : "HOMESTEAD", "loc" : [ -80.507463, 25.532314 ], "pop" : 5880, "state" : "FL" } +{ "_id" : "33032", "city" : "PRINCETON", "loc" : [ -80.40918000000001, 25.521191 ], "pop" : 18070, "state" : "FL" } +{ "_id" : "33033", "city" : "HOMESTEAD", "loc" : [ -80.438014, 25.490576 ], "pop" : 25439, "state" : "FL" } +{ "_id" : "33034", "city" : "FLORIDA CITY", "loc" : [ -80.548438, 25.396332 ], "pop" : 12115, "state" : "FL" } +{ "_id" : "33035", "city" : "HOMESTEAD", "loc" : [ -80.45715300000001, 25.457338 ], "pop" : 1727, "state" : "FL" } +{ "_id" : "33036", "city" : "ISLAMORADA", "loc" : [ -80.629953, 24.923331 ], "pop" : 3810, "state" : "FL" } +{ "_id" : "33037", "city" : "OCEAN REEF", "loc" : [ -80.40608400000001, 25.140214 ], "pop" : 12076, "state" : "FL" } +{ "_id" : "33039", "city" : "HOMESTEAD AIR FO", "loc" : [ -80.390513, 25.499088 ], "pop" : 6538, "state" : "FL" } +{ "_id" : "33040", "city" : "NAVAL AIR STATIO", "loc" : [ -81.762179, 24.565313 ], "pop" : 32986, "state" : "FL" } +{ "_id" : "33042", "city" : "SUMMERLAND KEY", "loc" : [ -81.49356400000001, 24.655322 ], "pop" : 3952, "state" : "FL" } +{ "_id" : "33043", "city" : "BIG PINE KEY", "loc" : [ -81.36202900000001, 24.679996 ], "pop" : 5956, "state" : "FL" } +{ "_id" : "33050", "city" : "MARATHON", "loc" : [ -81.03858099999999, 24.727919 ], "pop" : 12792, "state" : "FL" } +{ "_id" : "33054", "city" : "OPA LOCKA", "loc" : [ -80.247004, 25.909662 ], "pop" : 30405, "state" : "FL" } +{ "_id" : "33055", "city" : "CAROL CITY", "loc" : [ -80.27729100000001, 25.944076 ], "pop" : 40586, "state" : "FL" } +{ "_id" : "33056", "city" : "CAROL CITY", "loc" : [ -80.248059, 25.946906 ], "pop" : 31968, "state" : "FL" } +{ "_id" : "33060", "city" : "POMPANO BEACH", "loc" : [ -80.12345999999999, 26.231529 ], "pop" : 32292, "state" : "FL" } +{ "_id" : "33062", "city" : "POMPANO BEACH", "loc" : [ -80.094133, 26.234314 ], "pop" : 20836, "state" : "FL" } +{ "_id" : "33063", "city" : "MARGATE", "loc" : [ -80.211483, 26.249221 ], "pop" : 37607, "state" : "FL" } +{ "_id" : "33064", "city" : "LIGHTHOUSE POINT", "loc" : [ -80.11243899999999, 26.278698 ], "pop" : 50084, "state" : "FL" } +{ "_id" : "33065", "city" : "CORAL SPRINGS", "loc" : [ -80.255578, 26.271403 ], "pop" : 43659, "state" : "FL" } +{ "_id" : "33066", "city" : "MARGATE", "loc" : [ -80.17787800000001, 26.254237 ], "pop" : 16494, "state" : "FL" } +{ "_id" : "33067", "city" : "NORTH CORAL SPRI", "loc" : [ -80.22188, 26.305134 ], "pop" : 7227, "state" : "FL" } +{ "_id" : "33068", "city" : "POMPANO BEACH", "loc" : [ -80.22054, 26.216021 ], "pop" : 41835, "state" : "FL" } +{ "_id" : "33069", "city" : "POMPANO BEACH", "loc" : [ -80.16348600000001, 26.228817 ], "pop" : 20158, "state" : "FL" } +{ "_id" : "33070", "city" : "TAVERNIER", "loc" : [ -80.521816, 25.010788 ], "pop" : 6196, "state" : "FL" } +{ "_id" : "33071", "city" : "POMPANO BEACH", "loc" : [ -80.260085, 26.243515 ], "pop" : 28251, "state" : "FL" } +{ "_id" : "33073", "city" : "POMPANO BEACH", "loc" : [ -80.180966, 26.299693 ], "pop" : 7091, "state" : "FL" } +{ "_id" : "33076", "city" : "POMPANO BEACH", "loc" : [ -80.248086, 26.291902 ], "pop" : 4728, "state" : "FL" } +{ "_id" : "33122", "city" : "MIAMI", "loc" : [ -80.320733, 25.7911 ], "pop" : 8, "state" : "FL" } +{ "_id" : "33125", "city" : "MIAMI", "loc" : [ -80.234118, 25.782547 ], "pop" : 47761, "state" : "FL" } +{ "_id" : "33126", "city" : "MIAMI", "loc" : [ -80.291932, 25.776255 ], "pop" : 39861, "state" : "FL" } +{ "_id" : "33127", "city" : "MIAMI", "loc" : [ -80.20512100000001, 25.814344 ], "pop" : 29900, "state" : "FL" } +{ "_id" : "33128", "city" : "MIAMI", "loc" : [ -80.20885800000001, 25.775612 ], "pop" : 6965, "state" : "FL" } +{ "_id" : "33129", "city" : "MIAMI", "loc" : [ -80.201301, 25.755926 ], "pop" : 10225, "state" : "FL" } +{ "_id" : "33130", "city" : "MIAMI", "loc" : [ -80.205888, 25.767197 ], "pop" : 21777, "state" : "FL" } +{ "_id" : "33131", "city" : "MIAMI", "loc" : [ -80.18950599999999, 25.762852 ], "pop" : 2614, "state" : "FL" } +{ "_id" : "33132", "city" : "MIAMI", "loc" : [ -80.179996, 25.786712 ], "pop" : 5198, "state" : "FL" } +{ "_id" : "33133", "city" : "CORAL GABLES", "loc" : [ -80.243639, 25.732251 ], "pop" : 28672, "state" : "FL" } +{ "_id" : "33134", "city" : "CORAL GABLES", "loc" : [ -80.269576, 25.755582 ], "pop" : 33492, "state" : "FL" } +{ "_id" : "33135", "city" : "MIAMI", "loc" : [ -80.231746, 25.766391 ], "pop" : 35425, "state" : "FL" } +{ "_id" : "33136", "city" : "MIAMI", "loc" : [ -80.204232, 25.786385 ], "pop" : 14040, "state" : "FL" } +{ "_id" : "33137", "city" : "MIAMI", "loc" : [ -80.189663, 25.815648 ], "pop" : 19862, "state" : "FL" } +{ "_id" : "33138", "city" : "MIAMI SHORES", "loc" : [ -80.18526, 25.850208 ], "pop" : 30108, "state" : "FL" } +{ "_id" : "33139", "city" : "CARL FISHER", "loc" : [ -80.13637799999999, 25.785179 ], "pop" : 48971, "state" : "FL" } +{ "_id" : "33140", "city" : "MIAMI", "loc" : [ -80.127921, 25.819505 ], "pop" : 13057, "state" : "FL" } +{ "_id" : "33141", "city" : "NORTH BAY VILLAG", "loc" : [ -80.133578, 25.852384 ], "pop" : 29489, "state" : "FL" } +{ "_id" : "33142", "city" : "MIAMI", "loc" : [ -80.232023, 25.812966 ], "pop" : 52262, "state" : "FL" } +{ "_id" : "33143", "city" : "SOUTH MIAMI", "loc" : [ -80.301408, 25.700252 ], "pop" : 28410, "state" : "FL" } +{ "_id" : "33144", "city" : "MIAMI", "loc" : [ -80.309631, 25.762563 ], "pop" : 22968, "state" : "FL" } +{ "_id" : "33145", "city" : "CORAL GABLES", "loc" : [ -80.235134, 25.752648 ], "pop" : 28170, "state" : "FL" } +{ "_id" : "33146", "city" : "CORAL GABLES", "loc" : [ -80.274649, 25.720089 ], "pop" : 13791, "state" : "FL" } +{ "_id" : "33147", "city" : "MIAMI", "loc" : [ -80.236558, 25.850675 ], "pop" : 49395, "state" : "FL" } +{ "_id" : "33149", "city" : "KEY BISCAYNE", "loc" : [ -80.162475, 25.692104 ], "pop" : 8854, "state" : "FL" } +{ "_id" : "33150", "city" : "MIAMI", "loc" : [ -80.206968, 25.851214 ], "pop" : 28408, "state" : "FL" } +{ "_id" : "33154", "city" : "BAL HARBOUR", "loc" : [ -80.127055, 25.879094 ], "pop" : 17312, "state" : "FL" } +{ "_id" : "33155", "city" : "MIAMI", "loc" : [ -80.31032, 25.7392 ], "pop" : 42864, "state" : "FL" } +{ "_id" : "33156", "city" : "KENDALL", "loc" : [ -80.30853500000001, 25.66767 ], "pop" : 27901, "state" : "FL" } +{ "_id" : "33157", "city" : "PERRINE", "loc" : [ -80.352473, 25.604384 ], "pop" : 57749, "state" : "FL" } +{ "_id" : "33158", "city" : "MIAMI", "loc" : [ -80.318703, 25.636433 ], "pop" : 6037, "state" : "FL" } +{ "_id" : "33160", "city" : "NORTH MIAMI BEAC", "loc" : [ -80.135141, 25.936086 ], "pop" : 26987, "state" : "FL" } +{ "_id" : "33161", "city" : "NORTH MIAMI", "loc" : [ -80.182034, 25.893806 ], "pop" : 44800, "state" : "FL" } +{ "_id" : "33162", "city" : "NORTH MIAMI BEAC", "loc" : [ -80.177238, 25.92807 ], "pop" : 37052, "state" : "FL" } +{ "_id" : "33165", "city" : "OLYMPIA HEIGHTS", "loc" : [ -80.359084, 25.735353 ], "pop" : 56064, "state" : "FL" } +{ "_id" : "33166", "city" : "MIAMI SPRINGS", "loc" : [ -80.29902, 25.817473 ], "pop" : 21066, "state" : "FL" } +{ "_id" : "33167", "city" : "MIAMI", "loc" : [ -80.229168, 25.885605 ], "pop" : 18840, "state" : "FL" } +{ "_id" : "33168", "city" : "MIAMI", "loc" : [ -80.210106, 25.890232 ], "pop" : 21629, "state" : "FL" } +{ "_id" : "33169", "city" : "MIAMI", "loc" : [ -80.21436, 25.944083 ], "pop" : 30294, "state" : "FL" } +{ "_id" : "33170", "city" : "QUAIL HEIGHTS", "loc" : [ -80.3981, 25.558847 ], "pop" : 6842, "state" : "FL" } +{ "_id" : "33172", "city" : "MIAMI", "loc" : [ -80.357232, 25.773523 ], "pop" : 29823, "state" : "FL" } +{ "_id" : "33173", "city" : "MIAMI", "loc" : [ -80.361824, 25.699242 ], "pop" : 33787, "state" : "FL" } +{ "_id" : "33174", "city" : "MIAMI", "loc" : [ -80.36112799999999, 25.762779 ], "pop" : 27442, "state" : "FL" } +{ "_id" : "33175", "city" : "OLYMPIA HEIGHTS", "loc" : [ -80.408226, 25.733677 ], "pop" : 41712, "state" : "FL" } +{ "_id" : "33176", "city" : "MIAMI", "loc" : [ -80.362667, 25.657449 ], "pop" : 47435, "state" : "FL" } +{ "_id" : "33177", "city" : "QUAIL HEIGHTS", "loc" : [ -80.39377, 25.593255 ], "pop" : 25043, "state" : "FL" } +{ "_id" : "33178", "city" : "MIAMI", "loc" : [ -80.35492499999999, 25.814079 ], "pop" : 3146, "state" : "FL" } +{ "_id" : "33179", "city" : "MIAMI", "loc" : [ -80.181382, 25.957095 ], "pop" : 31877, "state" : "FL" } +{ "_id" : "33180", "city" : "OJUS", "loc" : [ -80.139447, 25.961902 ], "pop" : 14167, "state" : "FL" } +{ "_id" : "33181", "city" : "NORTH MIAMI BEAC", "loc" : [ -80.160329, 25.896548 ], "pop" : 14089, "state" : "FL" } +{ "_id" : "33182", "city" : "MIAMI", "loc" : [ -80.41664299999999, 25.787678 ], "pop" : 4983, "state" : "FL" } +{ "_id" : "33183", "city" : "MIAMI", "loc" : [ -80.412969, 25.699977 ], "pop" : 32077, "state" : "FL" } +{ "_id" : "33184", "city" : "MIAMI", "loc" : [ -80.402997, 25.757382 ], "pop" : 19617, "state" : "FL" } +{ "_id" : "33185", "city" : "OLYMPIA HEIGHTS", "loc" : [ -80.437366, 25.718082 ], "pop" : 3606, "state" : "FL" } +{ "_id" : "33186", "city" : "MIAMI", "loc" : [ -80.408501, 25.669437 ], "pop" : 43611, "state" : "FL" } +{ "_id" : "33187", "city" : "QUAIL HEIGHTS", "loc" : [ -80.47136999999999, 25.597112 ], "pop" : 6882, "state" : "FL" } +{ "_id" : "33189", "city" : "QUAIL HEIGHTS", "loc" : [ -80.35085100000001, 25.57431 ], "pop" : 15680, "state" : "FL" } +{ "_id" : "33190", "city" : "QUAIL HEIGHTS", "loc" : [ -80.35381, 25.560935 ], "pop" : 2807, "state" : "FL" } +{ "_id" : "33193", "city" : "MIAMI", "loc" : [ -80.44008700000001, 25.696365 ], "pop" : 17432, "state" : "FL" } +{ "_id" : "33196", "city" : "MIAMI", "loc" : [ -80.441031, 25.661502 ], "pop" : 14612, "state" : "FL" } +{ "_id" : "33301", "city" : "FORT LAUDERDALE", "loc" : [ -80.128778, 26.121561 ], "pop" : 12040, "state" : "FL" } +{ "_id" : "33304", "city" : "OAKLAND PARK", "loc" : [ -80.125283, 26.137908 ], "pop" : 18976, "state" : "FL" } +{ "_id" : "33305", "city" : "OAKLAND PARK", "loc" : [ -80.127768, 26.153115 ], "pop" : 11018, "state" : "FL" } +{ "_id" : "33306", "city" : "OAKLAND PARK", "loc" : [ -80.112572, 26.165091 ], "pop" : 3424, "state" : "FL" } +{ "_id" : "33308", "city" : "OAKLAND PARK", "loc" : [ -80.107674, 26.187883 ], "pop" : 28624, "state" : "FL" } +{ "_id" : "33309", "city" : "FORT LAUDERDALE", "loc" : [ -80.17462399999999, 26.181698 ], "pop" : 28226, "state" : "FL" } +{ "_id" : "33311", "city" : "FORT LAUDERDALE", "loc" : [ -80.172786, 26.142104 ], "pop" : 65378, "state" : "FL" } +{ "_id" : "33312", "city" : "FORT LAUDERDALE", "loc" : [ -80.181038, 26.096819 ], "pop" : 44230, "state" : "FL" } +{ "_id" : "33313", "city" : "CITY OF SUNRISE", "loc" : [ -80.223142, 26.151145 ], "pop" : 46804, "state" : "FL" } +{ "_id" : "33314", "city" : "DAVIE", "loc" : [ -80.22503399999999, 26.068199 ], "pop" : 19621, "state" : "FL" } +{ "_id" : "33315", "city" : "FORT LAUDERDALE", "loc" : [ -80.15407999999999, 26.098885 ], "pop" : 12849, "state" : "FL" } +{ "_id" : "33316", "city" : "FORT LAUDERDALE", "loc" : [ -80.125951, 26.104193 ], "pop" : 11206, "state" : "FL" } +{ "_id" : "33317", "city" : "PLANTATION", "loc" : [ -80.224272, 26.113536 ], "pop" : 31518, "state" : "FL" } +{ "_id" : "33319", "city" : "TAMARAC", "loc" : [ -80.225413, 26.181153 ], "pop" : 36178, "state" : "FL" } +{ "_id" : "33321", "city" : "TAMARAC", "loc" : [ -80.26435600000001, 26.212072 ], "pop" : 29504, "state" : "FL" } +{ "_id" : "33322", "city" : "SUNRISE", "loc" : [ -80.27195399999999, 26.151923 ], "pop" : 37348, "state" : "FL" } +{ "_id" : "33323", "city" : "SUNRISE", "loc" : [ -80.30758299999999, 26.164641 ], "pop" : 10658, "state" : "FL" } +{ "_id" : "33324", "city" : "PLANTATION", "loc" : [ -80.271019, 26.113639 ], "pop" : 29427, "state" : "FL" } +{ "_id" : "33325", "city" : "DAVIE", "loc" : [ -80.321952, 26.10862 ], "pop" : 19539, "state" : "FL" } +{ "_id" : "33326", "city" : "DAVIE", "loc" : [ -80.369941, 26.114338 ], "pop" : 8393, "state" : "FL" } +{ "_id" : "33327", "city" : "FORT LAUDERDALE", "loc" : [ -80.40645000000001, 26.097291 ], "pop" : 4605, "state" : "FL" } +{ "_id" : "33328", "city" : "DAVIE", "loc" : [ -80.27202200000001, 26.060708 ], "pop" : 17233, "state" : "FL" } +{ "_id" : "33330", "city" : "DAVIE", "loc" : [ -80.312907, 26.055479 ], "pop" : 9371, "state" : "FL" } +{ "_id" : "33331", "city" : "DAVIE", "loc" : [ -80.36453299999999, 26.044366 ], "pop" : 6928, "state" : "FL" } +{ "_id" : "33332", "city" : "DAVIE", "loc" : [ -80.41298999999999, 26.054436 ], "pop" : 1511, "state" : "FL" } +{ "_id" : "33334", "city" : "OAKLAND PARK", "loc" : [ -80.13551099999999, 26.181514 ], "pop" : 29072, "state" : "FL" } +{ "_id" : "33351", "city" : "TAMARAC", "loc" : [ -80.273376, 26.177148 ], "pop" : 26228, "state" : "FL" } +{ "_id" : "33388", "city" : "FORT LAUDERDALE", "loc" : [ -80.250587, 26.117586 ], "pop" : 435, "state" : "FL" } +{ "_id" : "33401", "city" : "WEST PALM BEACH", "loc" : [ -80.06587399999999, 26.713956 ], "pop" : 19833, "state" : "FL" } +{ "_id" : "33403", "city" : "LAKE PARK", "loc" : [ -80.073078, 26.803187 ], "pop" : 8743, "state" : "FL" } +{ "_id" : "33404", "city" : "RIVIERA BEACH", "loc" : [ -80.06852000000001, 26.781343 ], "pop" : 27997, "state" : "FL" } +{ "_id" : "33405", "city" : "WEST PALM BEACH", "loc" : [ -80.058234, 26.669968 ], "pop" : 18164, "state" : "FL" } +{ "_id" : "33406", "city" : "GLEN RIDGE", "loc" : [ -80.09302599999999, 26.655582 ], "pop" : 23595, "state" : "FL" } +{ "_id" : "33407", "city" : "WEST PALM BEACH", "loc" : [ -80.072492, 26.749154 ], "pop" : 25017, "state" : "FL" } +{ "_id" : "33408", "city" : "NORTH PALM BEACH", "loc" : [ -80.060334, 26.828854 ], "pop" : 17968, "state" : "FL" } +{ "_id" : "33409", "city" : "HAVERHILL", "loc" : [ -80.09634699999999, 26.713218 ], "pop" : 16142, "state" : "FL" } +{ "_id" : "33410", "city" : "PALM BEACH GARDE", "loc" : [ -80.087304, 26.844373 ], "pop" : 23249, "state" : "FL" } +{ "_id" : "33411", "city" : "ROYAL PALM BEACH", "loc" : [ -80.209898, 26.700539 ], "pop" : 21027, "state" : "FL" } +{ "_id" : "33412", "city" : "WEST PALM BEACH", "loc" : [ -80.248203, 26.805526 ], "pop" : 312, "state" : "FL" } +{ "_id" : "33413", "city" : "WEST PALM BEACH", "loc" : [ -80.140474, 26.67616 ], "pop" : 4864, "state" : "FL" } +{ "_id" : "33414", "city" : "WEST PALM BEACH", "loc" : [ -80.25299, 26.662707 ], "pop" : 22046, "state" : "FL" } +{ "_id" : "33415", "city" : "HAVERHILL", "loc" : [ -80.127966, 26.655722 ], "pop" : 35663, "state" : "FL" } +{ "_id" : "33417", "city" : "HAVERHILL", "loc" : [ -80.124764, 26.713006 ], "pop" : 25892, "state" : "FL" } +{ "_id" : "33418", "city" : "PALM BEACH GARDE", "loc" : [ -80.132533, 26.838977 ], "pop" : 15974, "state" : "FL" } +{ "_id" : "33426", "city" : "BOYNTON BEACH", "loc" : [ -80.083427, 26.51747 ], "pop" : 9390, "state" : "FL" } +{ "_id" : "33428", "city" : "BOCA RATON", "loc" : [ -80.210942, 26.344605 ], "pop" : 24103, "state" : "FL" } +{ "_id" : "33430", "city" : "BELLE GLADE", "loc" : [ -80.672392, 26.684289 ], "pop" : 22652, "state" : "FL" } +{ "_id" : "33431", "city" : "BOCA RATON", "loc" : [ -80.097488, 26.379929 ], "pop" : 13075, "state" : "FL" } +{ "_id" : "33432", "city" : "BOCA RATON", "loc" : [ -80.08442100000001, 26.34619 ], "pop" : 17141, "state" : "FL" } +{ "_id" : "33433", "city" : "BOCA RATON", "loc" : [ -80.15639899999999, 26.346409 ], "pop" : 35495, "state" : "FL" } +{ "_id" : "33434", "city" : "BOCA RATON", "loc" : [ -80.174858, 26.383909 ], "pop" : 19075, "state" : "FL" } +{ "_id" : "33435", "city" : "BRINY BREEZES", "loc" : [ -80.06424, 26.529161 ], "pop" : 28536, "state" : "FL" } +{ "_id" : "33436", "city" : "VILLAGE OF GOLF", "loc" : [ -80.10642300000001, 26.526862 ], "pop" : 19263, "state" : "FL" } +{ "_id" : "33437", "city" : "BOYNTON BEACH", "loc" : [ -80.141812, 26.531187 ], "pop" : 14809, "state" : "FL" } +{ "_id" : "33438", "city" : "CANAL POINT", "loc" : [ -80.629931, 26.859279 ], "pop" : 1494, "state" : "FL" } +{ "_id" : "33440", "city" : "CLEWISTON", "loc" : [ -80.94924899999999, 26.717171 ], "pop" : 14427, "state" : "FL" } +{ "_id" : "33441", "city" : "DEERFIELD BEACH", "loc" : [ -80.09917299999999, 26.309556 ], "pop" : 24529, "state" : "FL" } +{ "_id" : "33442", "city" : "DEERFIELD BEACH", "loc" : [ -80.14124200000001, 26.312365 ], "pop" : 21532, "state" : "FL" } +{ "_id" : "33444", "city" : "DELRAY BEACH", "loc" : [ -80.07932099999999, 26.456445 ], "pop" : 18450, "state" : "FL" } +{ "_id" : "33445", "city" : "DELRAY BEACH", "loc" : [ -80.105397, 26.456359 ], "pop" : 20740, "state" : "FL" } +{ "_id" : "33446", "city" : "DELRAY BEACH", "loc" : [ -80.158016, 26.451717 ], "pop" : 13016, "state" : "FL" } +{ "_id" : "33455", "city" : "HOBE SOUND", "loc" : [ -80.150851, 27.081306 ], "pop" : 15209, "state" : "FL" } +{ "_id" : "33458", "city" : "JUPITER", "loc" : [ -80.120091, 26.933938 ], "pop" : 23869, "state" : "FL" } +{ "_id" : "33460", "city" : "LAKE WORTH", "loc" : [ -80.05599599999999, 26.618207 ], "pop" : 28653, "state" : "FL" } +{ "_id" : "33461", "city" : "LAKE WORTH", "loc" : [ -80.094573, 26.62316 ], "pop" : 30905, "state" : "FL" } +{ "_id" : "33462", "city" : "LANTANA", "loc" : [ -80.077264, 26.576766 ], "pop" : 30704, "state" : "FL" } +{ "_id" : "33463", "city" : "GREENACRES", "loc" : [ -80.130503, 26.609609 ], "pop" : 28841, "state" : "FL" } +{ "_id" : "33467", "city" : "LAKE WORTH", "loc" : [ -80.168299, 26.610366 ], "pop" : 21547, "state" : "FL" } +{ "_id" : "33469", "city" : "TEQUESTA", "loc" : [ -80.100161, 26.966066 ], "pop" : 11781, "state" : "FL" } +{ "_id" : "33470", "city" : "LOXAHATCHEE", "loc" : [ -80.27600700000001, 26.738295 ], "pop" : 14094, "state" : "FL" } +{ "_id" : "33471", "city" : "MOORE HAVEN", "loc" : [ -81.21877600000001, 26.832749 ], "pop" : 4724, "state" : "FL" } +{ "_id" : "33476", "city" : "PAHOKEE", "loc" : [ -80.662897, 26.814199 ], "pop" : 8354, "state" : "FL" } +{ "_id" : "33477", "city" : "JUPITER", "loc" : [ -80.077034, 26.921701 ], "pop" : 7748, "state" : "FL" } +{ "_id" : "33478", "city" : "JUPITER", "loc" : [ -80.214388, 26.921242 ], "pop" : 10534, "state" : "FL" } +{ "_id" : "33480", "city" : "PALM BEACH", "loc" : [ -80.038825, 26.72065 ], "pop" : 6588, "state" : "FL" } +{ "_id" : "33483", "city" : "DELRAY BEACH", "loc" : [ -80.065637, 26.45457 ], "pop" : 10326, "state" : "FL" } +{ "_id" : "33484", "city" : "DELRAY BEACH", "loc" : [ -80.13459, 26.454272 ], "pop" : 19141, "state" : "FL" } +{ "_id" : "33486", "city" : "BOCA RATON", "loc" : [ -80.110418, 26.348099 ], "pop" : 19601, "state" : "FL" } +{ "_id" : "33487", "city" : "HIGHLAND BEACH", "loc" : [ -80.089072, 26.409142 ], "pop" : 14606, "state" : "FL" } +{ "_id" : "33493", "city" : "SOUTH BAY", "loc" : [ -80.73121399999999, 26.670126 ], "pop" : 3723, "state" : "FL" } +{ "_id" : "33496", "city" : "BOCA RATON", "loc" : [ -80.181287, 26.402975 ], "pop" : 7116, "state" : "FL" } +{ "_id" : "33498", "city" : "BOCA RATON", "loc" : [ -80.216087, 26.390693 ], "pop" : 5871, "state" : "FL" } +{ "_id" : "33510", "city" : "BRANDON", "loc" : [ -82.296554, 27.955112 ], "pop" : 20184, "state" : "FL" } +{ "_id" : "33511", "city" : "BRANDON", "loc" : [ -82.288116, 27.905649 ], "pop" : 29861, "state" : "FL" } +{ "_id" : "33513", "city" : "BUSHNELL", "loc" : [ -82.155297, 28.661062 ], "pop" : 8728, "state" : "FL" } +{ "_id" : "33514", "city" : "CENTER HILL", "loc" : [ -81.996289, 28.663484 ], "pop" : 1202, "state" : "FL" } +{ "_id" : "33525", "city" : "RIDGE MANOR", "loc" : [ -82.207936, 28.386912 ], "pop" : 29328, "state" : "FL" } +{ "_id" : "33527", "city" : "DOVER", "loc" : [ -82.21384500000001, 27.991975 ], "pop" : 13171, "state" : "FL" } +{ "_id" : "33534", "city" : "GIBSONTON", "loc" : [ -82.369831, 27.841059 ], "pop" : 7010, "state" : "FL" } +{ "_id" : "33538", "city" : "LAKE PANASOFFKEE", "loc" : [ -82.136279, 28.795261 ], "pop" : 3617, "state" : "FL" } +{ "_id" : "33540", "city" : "ZEPHYRHILLS", "loc" : [ -82.168347, 28.24096 ], "pop" : 15608, "state" : "FL" } +{ "_id" : "33541", "city" : "ZEPHYRHILLS", "loc" : [ -82.20565999999999, 28.231063 ], "pop" : 17575, "state" : "FL" } +{ "_id" : "33543", "city" : "WESLEY CHAPEL", "loc" : [ -82.288956, 28.210365 ], "pop" : 4073, "state" : "FL" } +{ "_id" : "33544", "city" : "ZEPHYRHILLS", "loc" : [ -82.34932999999999, 28.263664 ], "pop" : 5989, "state" : "FL" } +{ "_id" : "33547", "city" : "LITHIA", "loc" : [ -82.135679, 27.829349 ], "pop" : 6780, "state" : "FL" } +{ "_id" : "33549", "city" : "LUTZ", "loc" : [ -82.461045, 28.136688 ], "pop" : 30905, "state" : "FL" } +{ "_id" : "33556", "city" : "ODESSA", "loc" : [ -82.590506, 28.142072 ], "pop" : 7046, "state" : "FL" } +{ "_id" : "33565", "city" : "PLANT CITY", "loc" : [ -82.157554, 28.069855 ], "pop" : 13299, "state" : "FL" } +{ "_id" : "33566", "city" : "PLANT CITY", "loc" : [ -82.113816, 28.009448 ], "pop" : 19533, "state" : "FL" } +{ "_id" : "33567", "city" : "PLANT CITY", "loc" : [ -82.14626800000001, 27.976167 ], "pop" : 18937, "state" : "FL" } +{ "_id" : "33569", "city" : "RIVERVIEW", "loc" : [ -82.312473, 27.844952 ], "pop" : 21930, "state" : "FL" } +{ "_id" : "33570", "city" : "RUSKIN", "loc" : [ -82.435501, 27.701501 ], "pop" : 14654, "state" : "FL" } +{ "_id" : "33572", "city" : "APOLLO BEACH", "loc" : [ -82.41019900000001, 27.771553 ], "pop" : 6074, "state" : "FL" } +{ "_id" : "33573", "city" : "SUN CITY CENTER", "loc" : [ -82.353832, 27.714711 ], "pop" : 9070, "state" : "FL" } +{ "_id" : "33576", "city" : "SAN ANTONIO", "loc" : [ -82.288237, 28.337139 ], "pop" : 1396, "state" : "FL" } +{ "_id" : "33584", "city" : "SEFFNER", "loc" : [ -82.28629599999999, 27.992199 ], "pop" : 20956, "state" : "FL" } +{ "_id" : "33592", "city" : "THONOTOSASSA", "loc" : [ -82.308212, 28.061747 ], "pop" : 9009, "state" : "FL" } +{ "_id" : "33594", "city" : "VALRICO", "loc" : [ -82.246557, 27.912435 ], "pop" : 27594, "state" : "FL" } +{ "_id" : "33597", "city" : "RIDGE MANOR ESTA", "loc" : [ -82.092975, 28.577492 ], "pop" : 5880, "state" : "FL" } +{ "_id" : "33598", "city" : "WIMAUMA", "loc" : [ -82.315136, 27.701497 ], "pop" : 7538, "state" : "FL" } +{ "_id" : "33602", "city" : "TAMPA", "loc" : [ -82.45972, 27.961381 ], "pop" : 8473, "state" : "FL" } +{ "_id" : "33603", "city" : "TAMPA", "loc" : [ -82.462997, 27.984534 ], "pop" : 19614, "state" : "FL" } +{ "_id" : "33604", "city" : "TAMPA", "loc" : [ -82.457848, 28.017312 ], "pop" : 34243, "state" : "FL" } +{ "_id" : "33605", "city" : "TAMPA", "loc" : [ -82.433368, 27.967078 ], "pop" : 19813, "state" : "FL" } +{ "_id" : "33606", "city" : "TAMPA", "loc" : [ -82.467035, 27.933828 ], "pop" : 14191, "state" : "FL" } +{ "_id" : "33607", "city" : "TAMPA", "loc" : [ -82.489535, 27.962538 ], "pop" : 22386, "state" : "FL" } +{ "_id" : "33608", "city" : "TAMPA", "loc" : [ -82.507097, 27.865916 ], "pop" : 3578, "state" : "FL" } +{ "_id" : "33609", "city" : "TAMPA", "loc" : [ -82.50572, 27.942456 ], "pop" : 15797, "state" : "FL" } +{ "_id" : "33610", "city" : "TAMPA", "loc" : [ -82.404584, 27.995125 ], "pop" : 34244, "state" : "FL" } +{ "_id" : "33611", "city" : "TAMPA", "loc" : [ -82.506714, 27.891422 ], "pop" : 30070, "state" : "FL" } +{ "_id" : "33612", "city" : "TAMPA", "loc" : [ -82.450018, 28.050187 ], "pop" : 36784, "state" : "FL" } +{ "_id" : "33613", "city" : "TAMPA", "loc" : [ -82.445519, 28.077184 ], "pop" : 24849, "state" : "FL" } +{ "_id" : "33614", "city" : "TAMPA", "loc" : [ -82.503393, 28.00914 ], "pop" : 39021, "state" : "FL" } +{ "_id" : "33615", "city" : "TAMPA", "loc" : [ -82.580495, 28.008057 ], "pop" : 36532, "state" : "FL" } +{ "_id" : "33616", "city" : "TAMPA", "loc" : [ -82.52029, 27.87418 ], "pop" : 11318, "state" : "FL" } +{ "_id" : "33617", "city" : "TAMPA", "loc" : [ -82.394876, 28.038358 ], "pop" : 38114, "state" : "FL" } +{ "_id" : "33618", "city" : "CARROLLWOOD", "loc" : [ -82.493291, 28.075875 ], "pop" : 20229, "state" : "FL" } +{ "_id" : "33619", "city" : "TAMPA", "loc" : [ -82.375558, 27.93824 ], "pop" : 27185, "state" : "FL" } +{ "_id" : "33620", "city" : "TAMPA", "loc" : [ -82.409188, 28.069465 ], "pop" : 3757, "state" : "FL" } +{ "_id" : "33624", "city" : "CARROLLWOOD", "loc" : [ -82.524944, 28.077194 ], "pop" : 39616, "state" : "FL" } +{ "_id" : "33625", "city" : "TAMPA", "loc" : [ -82.558987, 28.072551 ], "pop" : 14778, "state" : "FL" } +{ "_id" : "33626", "city" : "TAMPA", "loc" : [ -82.616378, 28.050932 ], "pop" : 2213, "state" : "FL" } +{ "_id" : "33629", "city" : "TAMPA", "loc" : [ -82.507897, 27.92102 ], "pop" : 21545, "state" : "FL" } +{ "_id" : "33634", "city" : "TAMPA", "loc" : [ -82.556006, 28.006783 ], "pop" : 18712, "state" : "FL" } +{ "_id" : "33635", "city" : "TAMPA", "loc" : [ -82.604822, 28.03013 ], "pop" : 6241, "state" : "FL" } +{ "_id" : "33637", "city" : "TAMPA", "loc" : [ -82.365876, 28.03377 ], "pop" : 9673, "state" : "FL" } +{ "_id" : "33647", "city" : "TAMPA", "loc" : [ -82.367751, 28.114698 ], "pop" : 5866, "state" : "FL" } +{ "_id" : "33701", "city" : "SAINT PETERSBURG", "loc" : [ -82.638609, 27.772318 ], "pop" : 15737, "state" : "FL" } +{ "_id" : "33702", "city" : "SAINT PETERSBURG", "loc" : [ -82.644795, 27.842712 ], "pop" : 28888, "state" : "FL" } +{ "_id" : "33703", "city" : "SAINT PETERSBURG", "loc" : [ -82.62639299999999, 27.816957 ], "pop" : 23348, "state" : "FL" } +{ "_id" : "33704", "city" : "SAINT PETERSBURG", "loc" : [ -82.637289, 27.795435 ], "pop" : 17112, "state" : "FL" } +{ "_id" : "33705", "city" : "SAINT PETERSBURG", "loc" : [ -82.64349, 27.739113 ], "pop" : 28261, "state" : "FL" } +{ "_id" : "33706", "city" : "SAINT PETERSBURG", "loc" : [ -82.75164599999999, 27.745606 ], "pop" : 18974, "state" : "FL" } +{ "_id" : "33707", "city" : "SAINT PETERSBURG", "loc" : [ -82.72079100000001, 27.75487 ], "pop" : 23630, "state" : "FL" } +{ "_id" : "33708", "city" : "MADEIRA BEACH", "loc" : [ -82.80077900000001, 27.816529 ], "pop" : 18018, "state" : "FL" } +{ "_id" : "33709", "city" : "KENNETH CITY", "loc" : [ -82.729845, 27.817427 ], "pop" : 26024, "state" : "FL" } +{ "_id" : "33710", "city" : "SAINT PETERSBURG", "loc" : [ -82.72428499999999, 27.789798 ], "pop" : 32402, "state" : "FL" } +{ "_id" : "33711", "city" : "SAINT PETERSBURG", "loc" : [ -82.689708, 27.74649 ], "pop" : 18084, "state" : "FL" } +{ "_id" : "33712", "city" : "SAINT PETERSBURG", "loc" : [ -82.666298, 27.735336 ], "pop" : 27715, "state" : "FL" } +{ "_id" : "33713", "city" : "SAINT PETERSBURG", "loc" : [ -82.67793899999999, 27.789015 ], "pop" : 29160, "state" : "FL" } +{ "_id" : "33714", "city" : "SAINT PETERSBURG", "loc" : [ -82.677612, 27.817621 ], "pop" : 18227, "state" : "FL" } +{ "_id" : "33715", "city" : "TIERRA VERDE", "loc" : [ -82.71564600000001, 27.694792 ], "pop" : 3877, "state" : "FL" } +{ "_id" : "33716", "city" : "SAINT PETERSBURG", "loc" : [ -82.640039, 27.873764 ], "pop" : 9328, "state" : "FL" } +{ "_id" : "33801", "city" : "LAKELAND", "loc" : [ -81.939153, 28.038134 ], "pop" : 45005, "state" : "FL" } +{ "_id" : "33803", "city" : "LAKELAND", "loc" : [ -81.95228299999999, 28.014045 ], "pop" : 23761, "state" : "FL" } +{ "_id" : "33805", "city" : "LAKELAND", "loc" : [ -81.96091, 28.072006 ], "pop" : 19676, "state" : "FL" } +{ "_id" : "33809", "city" : "LAKELAND", "loc" : [ -81.984219, 28.123356 ], "pop" : 39958, "state" : "FL" } +{ "_id" : "33811", "city" : "SOUTHSIDE", "loc" : [ -82.00723600000001, 27.966284 ], "pop" : 11456, "state" : "FL" } +{ "_id" : "33813", "city" : "SOUTHSIDE", "loc" : [ -81.933187, 27.969534 ], "pop" : 28497, "state" : "FL" } +{ "_id" : "33821", "city" : "ARCADIA", "loc" : [ -81.86575499999999, 27.18996 ], "pop" : 23865, "state" : "FL" } +{ "_id" : "33823", "city" : "AUBURNDALE", "loc" : [ -81.812234, 28.072443 ], "pop" : 24489, "state" : "FL" } +{ "_id" : "33825", "city" : "AVON PARK", "loc" : [ -81.501486, 27.600085 ], "pop" : 16945, "state" : "FL" } +{ "_id" : "33827", "city" : "BABSON PARK", "loc" : [ -81.534221, 27.831698 ], "pop" : 1901, "state" : "FL" } +{ "_id" : "33830", "city" : "BARTOW", "loc" : [ -81.812684, 27.895664 ], "pop" : 25968, "state" : "FL" } +{ "_id" : "33834", "city" : "DUETTE", "loc" : [ -81.84505799999999, 27.627738 ], "pop" : 3700, "state" : "FL" } +{ "_id" : "33837", "city" : "DAVENPORT", "loc" : [ -81.607912, 28.196265 ], "pop" : 8268, "state" : "FL" } +{ "_id" : "33838", "city" : "DUNDEE", "loc" : [ -81.621207, 28.019412 ], "pop" : 2335, "state" : "FL" } +{ "_id" : "33839", "city" : "EAGLE LAKE", "loc" : [ -81.75635699999999, 27.978661 ], "pop" : 1456, "state" : "FL" } +{ "_id" : "33841", "city" : "FORT MEADE", "loc" : [ -81.782346, 27.746356 ], "pop" : 8169, "state" : "FL" } +{ "_id" : "33843", "city" : "FROSTPROOF", "loc" : [ -81.51477800000001, 27.721058 ], "pop" : 8747, "state" : "FL" } +{ "_id" : "33844", "city" : "GRENELEFE", "loc" : [ -81.614712, 28.095073 ], "pop" : 23835, "state" : "FL" } +{ "_id" : "33849", "city" : "KATHLEEN", "loc" : [ -82.043499, 28.205224 ], "pop" : 1096, "state" : "FL" } +{ "_id" : "33850", "city" : "LAKE ALFRED", "loc" : [ -81.727138, 28.089483 ], "pop" : 3916, "state" : "FL" } +{ "_id" : "33852", "city" : "LAKE PLACID", "loc" : [ -81.364918, 27.294474 ], "pop" : 13767, "state" : "FL" } +{ "_id" : "33853", "city" : "LAKE WALES", "loc" : [ -81.548805, 27.903734 ], "pop" : 32570, "state" : "FL" } +{ "_id" : "33857", "city" : "LORIDA", "loc" : [ -81.196533, 27.414952 ], "pop" : 1186, "state" : "FL" } +{ "_id" : "33860", "city" : "MULBERRY", "loc" : [ -82.00148900000001, 27.90202 ], "pop" : 13338, "state" : "FL" } +{ "_id" : "33865", "city" : "ONA", "loc" : [ -81.92805, 27.412657 ], "pop" : 885, "state" : "FL" } +{ "_id" : "33868", "city" : "POLK CITY", "loc" : [ -81.80828200000001, 28.19867 ], "pop" : 7604, "state" : "FL" } +{ "_id" : "33870", "city" : "SEBRING", "loc" : [ -81.435712, 27.492391 ], "pop" : 19922, "state" : "FL" } +{ "_id" : "33872", "city" : "SEBRING", "loc" : [ -81.48724199999999, 27.470289 ], "pop" : 15390, "state" : "FL" } +{ "_id" : "33873", "city" : "WAUCHULA", "loc" : [ -81.807388, 27.551742 ], "pop" : 11513, "state" : "FL" } +{ "_id" : "33880", "city" : "ELOISE", "loc" : [ -81.751507, 27.999296 ], "pop" : 30803, "state" : "FL" } +{ "_id" : "33881", "city" : "WINTER HAVEN", "loc" : [ -81.732485, 28.045219 ], "pop" : 25957, "state" : "FL" } +{ "_id" : "33884", "city" : "CYPRESS GARDENS", "loc" : [ -81.678905, 27.994901 ], "pop" : 14771, "state" : "FL" } +{ "_id" : "33890", "city" : "ZOLFO SPRINGS", "loc" : [ -81.742328, 27.480042 ], "pop" : 3515, "state" : "FL" } +{ "_id" : "33901", "city" : "FORT MYERS", "loc" : [ -81.8725, 26.620403 ], "pop" : 22150, "state" : "FL" } +{ "_id" : "33903", "city" : "FORT MYERS", "loc" : [ -81.909632, 26.678138 ], "pop" : 20015, "state" : "FL" } +{ "_id" : "33904", "city" : "CAPE CORAL CENTR", "loc" : [ -81.952243, 26.57746 ], "pop" : 29483, "state" : "FL" } +{ "_id" : "33905", "city" : "TICE", "loc" : [ -81.785341, 26.676472 ], "pop" : 25029, "state" : "FL" } +{ "_id" : "33907", "city" : "FORT MYERS", "loc" : [ -81.873558, 26.568057 ], "pop" : 19015, "state" : "FL" } +{ "_id" : "33908", "city" : "FORT MYERS", "loc" : [ -81.927589, 26.502518 ], "pop" : 17050, "state" : "FL" } +{ "_id" : "33909", "city" : "CAPE CORAL CENTR", "loc" : [ -81.95890900000001, 26.680276 ], "pop" : 8622, "state" : "FL" } +{ "_id" : "33912", "city" : "FORT MYERS", "loc" : [ -81.82455400000001, 26.49722 ], "pop" : 20141, "state" : "FL" } +{ "_id" : "33913", "city" : "FORT MYERS", "loc" : [ -81.706469, 26.522808 ], "pop" : 473, "state" : "FL" } +{ "_id" : "33914", "city" : "CAPE CORAL CENTR", "loc" : [ -81.990915, 26.56971 ], "pop" : 15782, "state" : "FL" } +{ "_id" : "33916", "city" : "FORT MYERS", "loc" : [ -81.842946, 26.646595 ], "pop" : 17673, "state" : "FL" } +{ "_id" : "33917", "city" : "FORT MYERS", "loc" : [ -81.859447, 26.707947 ], "pop" : 24751, "state" : "FL" } +{ "_id" : "33919", "city" : "COLLEGE PARKWAY", "loc" : [ -81.900587, 26.554159 ], "pop" : 22641, "state" : "FL" } +{ "_id" : "33920", "city" : "ALVA", "loc" : [ -81.63505499999999, 26.714657 ], "pop" : 3044, "state" : "FL" } +{ "_id" : "33922", "city" : "BOKEELIA", "loc" : [ -82.140064, 26.662726 ], "pop" : 2979, "state" : "FL" } +{ "_id" : "33923", "city" : "BONITA SPRINGS", "loc" : [ -81.789963, 26.348035 ], "pop" : 19697, "state" : "FL" } +{ "_id" : "33924", "city" : "CAPTIVA", "loc" : [ -82.261017, 26.750541 ], "pop" : 831, "state" : "FL" } +{ "_id" : "33927", "city" : "EL JOBEAN", "loc" : [ -82.19956999999999, 26.97608 ], "pop" : 91, "state" : "FL" } +{ "_id" : "33928", "city" : "ESTERO", "loc" : [ -81.810244, 26.435052 ], "pop" : 1846, "state" : "FL" } +{ "_id" : "33931", "city" : "FORT MYERS BEACH", "loc" : [ -81.924543, 26.451952 ], "pop" : 10612, "state" : "FL" } +{ "_id" : "33934", "city" : "IMMOKALEE", "loc" : [ -81.445365, 26.409794 ], "pop" : 18066, "state" : "FL" } +{ "_id" : "33935", "city" : "LABELLE", "loc" : [ -81.434027, 26.732093 ], "pop" : 11346, "state" : "FL" } +{ "_id" : "33936", "city" : "LEHIGH ACRES", "loc" : [ -81.61046, 26.615302 ], "pop" : 10851, "state" : "FL" } +{ "_id" : "33937", "city" : "MARCO ISLAND", "loc" : [ -81.720394, 25.939568 ], "pop" : 9495, "state" : "FL" } +{ "_id" : "33940", "city" : "NAPLES", "loc" : [ -81.802196, 26.171391 ], "pop" : 20934, "state" : "FL" } +{ "_id" : "33942", "city" : "NAPLES", "loc" : [ -81.766125, 26.201578 ], "pop" : 23719, "state" : "FL" } +{ "_id" : "33943", "city" : "OCHOPEE", "loc" : [ -81.311228, 25.87998 ], "pop" : 1257, "state" : "FL" } +{ "_id" : "33946", "city" : "PLACIDA", "loc" : [ -82.261638, 26.819301 ], "pop" : 126, "state" : "FL" } +{ "_id" : "33947", "city" : "PLACIDA", "loc" : [ -82.293778, 26.90039 ], "pop" : 7811, "state" : "FL" } +{ "_id" : "33948", "city" : "PORT CHARLOTTE", "loc" : [ -82.14117299999999, 26.98268 ], "pop" : 12212, "state" : "FL" } +{ "_id" : "33950", "city" : "PUNTA GORDA", "loc" : [ -82.053166, 26.915163 ], "pop" : 15495, "state" : "FL" } +{ "_id" : "33952", "city" : "PORT CHARLOTTE", "loc" : [ -82.096372, 26.990475 ], "pop" : 27923, "state" : "FL" } +{ "_id" : "33953", "city" : "PORT CHARLOTTE", "loc" : [ -82.211743, 27.004008 ], "pop" : 1982, "state" : "FL" } +{ "_id" : "33954", "city" : "PORT CHARLOTTE", "loc" : [ -82.110782, 27.022815 ], "pop" : 3993, "state" : "FL" } +{ "_id" : "33955", "city" : "PUNTA GORDA", "loc" : [ -81.954712, 26.823981 ], "pop" : 5206, "state" : "FL" } +{ "_id" : "33956", "city" : "SAINT JAMES CITY", "loc" : [ -82.09159099999999, 26.529012 ], "pop" : 3653, "state" : "FL" } +{ "_id" : "33957", "city" : "SANIBEL", "loc" : [ -82.086825, 26.4514 ], "pop" : 5999, "state" : "FL" } +{ "_id" : "33960", "city" : "VENUS", "loc" : [ -81.35941200000001, 27.13463 ], "pop" : 925, "state" : "FL" } +{ "_id" : "33961", "city" : "NAPLES", "loc" : [ -81.658635, 26.027721 ], "pop" : 7121, "state" : "FL" } +{ "_id" : "33962", "city" : "NAPLES", "loc" : [ -81.749661, 26.113096 ], "pop" : 28714, "state" : "FL" } +{ "_id" : "33963", "city" : "NAPLES", "loc" : [ -81.808092, 26.263499 ], "pop" : 14863, "state" : "FL" } +{ "_id" : "33964", "city" : "NAPLES", "loc" : [ -81.64043599999999, 26.211253 ], "pop" : 5869, "state" : "FL" } +{ "_id" : "33971", "city" : "LEHIGH ACRES", "loc" : [ -81.66582200000001, 26.602252 ], "pop" : 11401, "state" : "FL" } +{ "_id" : "33980", "city" : "PORT CHARLOTTE", "loc" : [ -82.058886, 26.983969 ], "pop" : 7753, "state" : "FL" } +{ "_id" : "33981", "city" : "PORT CHARLOTTE", "loc" : [ -82.23877400000001, 26.937925 ], "pop" : 5758, "state" : "FL" } +{ "_id" : "33982", "city" : "PUNTA GORDA", "loc" : [ -81.95448399999999, 26.966751 ], "pop" : 6235, "state" : "FL" } +{ "_id" : "33983", "city" : "PUNTA GORDA", "loc" : [ -82.016268, 27.007398 ], "pop" : 7319, "state" : "FL" } +{ "_id" : "33990", "city" : "CAPE CORAL CENTR", "loc" : [ -81.945967, 26.630893 ], "pop" : 16975, "state" : "FL" } +{ "_id" : "33991", "city" : "CAPE CORAL CENTR", "loc" : [ -82.006703, 26.628881 ], "pop" : 5352, "state" : "FL" } +{ "_id" : "33999", "city" : "NAPLES", "loc" : [ -81.70927, 26.191612 ], "pop" : 21226, "state" : "FL" } +{ "_id" : "34202", "city" : "BRADEN RIVER", "loc" : [ -82.431487, 27.46521 ], "pop" : 6618, "state" : "FL" } +{ "_id" : "34203", "city" : "BRADEN RIVER", "loc" : [ -82.54040000000001, 27.444871 ], "pop" : 22408, "state" : "FL" } +{ "_id" : "34205", "city" : "WESTGATE", "loc" : [ -82.584733, 27.480896 ], "pop" : 31114, "state" : "FL" } +{ "_id" : "34207", "city" : "COLLEGE PLAZA", "loc" : [ -82.58062700000001, 27.439663 ], "pop" : 27775, "state" : "FL" } +{ "_id" : "34208", "city" : "BRADEN RIVER", "loc" : [ -82.53696100000001, 27.485881 ], "pop" : 20668, "state" : "FL" } +{ "_id" : "34209", "city" : "PALMA SOLA", "loc" : [ -82.62763099999999, 27.487909 ], "pop" : 30012, "state" : "FL" } +{ "_id" : "34210", "city" : "BRADENTON", "loc" : [ -82.635752, 27.454393 ], "pop" : 11345, "state" : "FL" } +{ "_id" : "34215", "city" : "CORTEZ", "loc" : [ -82.700642, 27.472686 ], "pop" : 1657, "state" : "FL" } +{ "_id" : "34217", "city" : "BRADENTON BEACH", "loc" : [ -82.72102700000001, 27.515149 ], "pop" : 6554, "state" : "FL" } +{ "_id" : "34219", "city" : "PARRISH", "loc" : [ -82.39600900000001, 27.557162 ], "pop" : 3811, "state" : "FL" } +{ "_id" : "34221", "city" : "PALMETTO", "loc" : [ -82.562957, 27.542946 ], "pop" : 23994, "state" : "FL" } +{ "_id" : "34222", "city" : "ELLENTON", "loc" : [ -82.50060000000001, 27.53818 ], "pop" : 8252, "state" : "FL" } +{ "_id" : "34223", "city" : "ENGLEWOOD", "loc" : [ -82.359886, 26.966743 ], "pop" : 15705, "state" : "FL" } +{ "_id" : "34224", "city" : "GROVE CITY", "loc" : [ -82.31173099999999, 26.92504 ], "pop" : 5110, "state" : "FL" } +{ "_id" : "34228", "city" : "WHITNEY BEACH", "loc" : [ -82.638403, 27.38669 ], "pop" : 5937, "state" : "FL" } +{ "_id" : "34229", "city" : "OSPREY", "loc" : [ -82.485339, 27.18384 ], "pop" : 3612, "state" : "FL" } +{ "_id" : "34231", "city" : "SOUTH TRAIL", "loc" : [ -82.51379300000001, 27.26757 ], "pop" : 32813, "state" : "FL" } +{ "_id" : "34232", "city" : "FOREST LAKES", "loc" : [ -82.47570899999999, 27.320056 ], "pop" : 29847, "state" : "FL" } +{ "_id" : "34233", "city" : "SARASOTA", "loc" : [ -82.47698, 27.286614 ], "pop" : 11476, "state" : "FL" } +{ "_id" : "34234", "city" : "MEADOWS VILLAGE", "loc" : [ -82.53518200000001, 27.365355 ], "pop" : 20243, "state" : "FL" } +{ "_id" : "34235", "city" : "SARASOTA", "loc" : [ -82.484759, 27.367162 ], "pop" : 11275, "state" : "FL" } +{ "_id" : "34236", "city" : "SARASOTA", "loc" : [ -82.548624, 27.331588 ], "pop" : 10942, "state" : "FL" } +{ "_id" : "34237", "city" : "SARASOTA", "loc" : [ -82.512778, 27.336915 ], "pop" : 15902, "state" : "FL" } +{ "_id" : "34238", "city" : "SARASOTA SQUARE", "loc" : [ -82.48289800000001, 27.243834 ], "pop" : 5493, "state" : "FL" } +{ "_id" : "34239", "city" : "SARASOTA", "loc" : [ -82.51954499999999, 27.311137 ], "pop" : 15949, "state" : "FL" } +{ "_id" : "34240", "city" : "SARASOTA", "loc" : [ -82.385594, 27.32765 ], "pop" : 4943, "state" : "FL" } +{ "_id" : "34241", "city" : "SARASOTA", "loc" : [ -82.41811199999999, 27.282179 ], "pop" : 8902, "state" : "FL" } +{ "_id" : "34242", "city" : "CRESCENT BEACH", "loc" : [ -82.546932, 27.266025 ], "pop" : 10594, "state" : "FL" } +{ "_id" : "34243", "city" : "SARASOTA", "loc" : [ -82.530299, 27.407235 ], "pop" : 14096, "state" : "FL" } +{ "_id" : "34251", "city" : "MYAKKA CITY", "loc" : [ -82.18489700000001, 27.364764 ], "pop" : 1636, "state" : "FL" } +{ "_id" : "34275", "city" : "NOKOMIS", "loc" : [ -82.451779, 27.138398 ], "pop" : 13638, "state" : "FL" } +{ "_id" : "34285", "city" : "VENICE", "loc" : [ -82.44983000000001, 27.093312 ], "pop" : 9069, "state" : "FL" } +{ "_id" : "34287", "city" : "NORTH PORT", "loc" : [ -82.24161599999999, 27.047839 ], "pop" : 16491, "state" : "FL" } +{ "_id" : "34292", "city" : "MID VENICE", "loc" : [ -82.41511199999999, 27.103245 ], "pop" : 13901, "state" : "FL" } +{ "_id" : "34293", "city" : "SOUTH VENICE", "loc" : [ -82.404096, 27.053022 ], "pop" : 26720, "state" : "FL" } +{ "_id" : "34601", "city" : "BROOKSVILLE", "loc" : [ -82.37367399999999, 28.565805 ], "pop" : 20190, "state" : "FL" } +{ "_id" : "34602", "city" : "RIDGE MANOR WEST", "loc" : [ -82.29054499999999, 28.511167 ], "pop" : 4940, "state" : "FL" } +{ "_id" : "34606", "city" : "SPRING HILL", "loc" : [ -82.598084, 28.46551 ], "pop" : 18190, "state" : "FL" } +{ "_id" : "34607", "city" : "SPRING HILL", "loc" : [ -82.626671, 28.506546 ], "pop" : 5420, "state" : "FL" } +{ "_id" : "34608", "city" : "SPRING HILL", "loc" : [ -82.556206, 28.479696 ], "pop" : 16755, "state" : "FL" } +{ "_id" : "34609", "city" : "SPRING HILL", "loc" : [ -82.49989600000001, 28.477611 ], "pop" : 19824, "state" : "FL" } +{ "_id" : "34610", "city" : "SHADY HILLS", "loc" : [ -82.530148, 28.405084 ], "pop" : 9958, "state" : "FL" } +{ "_id" : "34613", "city" : "BROOKSVILLE", "loc" : [ -82.521286, 28.546558 ], "pop" : 9899, "state" : "FL" } +{ "_id" : "34614", "city" : "BROOKSVILLE", "loc" : [ -82.523613, 28.662244 ], "pop" : 3687, "state" : "FL" } +{ "_id" : "34615", "city" : "CLEARWATER", "loc" : [ -82.780807, 27.986241 ], "pop" : 30847, "state" : "FL" } +{ "_id" : "34616", "city" : "CLEARWATER", "loc" : [ -82.786711, 27.945624 ], "pop" : 28460, "state" : "FL" } +{ "_id" : "34619", "city" : "CLEARWATER", "loc" : [ -82.717248, 27.976503 ], "pop" : 15886, "state" : "FL" } +{ "_id" : "34620", "city" : "CLEARWATER", "loc" : [ -82.715885, 27.913981 ], "pop" : 15769, "state" : "FL" } +{ "_id" : "34621", "city" : "CLEARWATER", "loc" : [ -82.72371800000001, 28.02961 ], "pop" : 16102, "state" : "FL" } +{ "_id" : "34622", "city" : "AIRPORT", "loc" : [ -82.67687599999999, 27.896713 ], "pop" : 3190, "state" : "FL" } +{ "_id" : "34623", "city" : "CLEARWATER", "loc" : [ -82.747405, 28.002734 ], "pop" : 20280, "state" : "FL" } +{ "_id" : "34624", "city" : "CLEARWATER", "loc" : [ -82.74348500000001, 27.93595 ], "pop" : 27315, "state" : "FL" } +{ "_id" : "34625", "city" : "CLEARWATER", "loc" : [ -82.745504, 27.973063 ], "pop" : 10394, "state" : "FL" } +{ "_id" : "34630", "city" : "CLEARWATER", "loc" : [ -82.822281, 27.984526 ], "pop" : 6231, "state" : "FL" } +{ "_id" : "34635", "city" : "BELLEAIR BEACH", "loc" : [ -82.840486, 27.917605 ], "pop" : 7736, "state" : "FL" } +{ "_id" : "34639", "city" : "LAND O LAKES", "loc" : [ -82.45471999999999, 28.225849 ], "pop" : 11815, "state" : "FL" } +{ "_id" : "34640", "city" : "BELLEAIR BLUFFS", "loc" : [ -82.80197800000001, 27.915835 ], "pop" : 22793, "state" : "FL" } +{ "_id" : "34641", "city" : "LARGO", "loc" : [ -82.75937, 27.907547 ], "pop" : 24087, "state" : "FL" } +{ "_id" : "34642", "city" : "SEMINOLE", "loc" : [ -82.796896, 27.844571 ], "pop" : 24078, "state" : "FL" } +{ "_id" : "34643", "city" : "LARGO", "loc" : [ -82.762806, 27.880334 ], "pop" : 17707, "state" : "FL" } +{ "_id" : "34644", "city" : "LARGO", "loc" : [ -82.82628699999999, 27.883597 ], "pop" : 20162, "state" : "FL" } +{ "_id" : "34646", "city" : "LARGO", "loc" : [ -82.826978, 27.852906 ], "pop" : 11284, "state" : "FL" } +{ "_id" : "34647", "city" : "LARGO", "loc" : [ -82.758701, 27.851549 ], "pop" : 15130, "state" : "FL" } +{ "_id" : "34648", "city" : "LARGO", "loc" : [ -82.795946, 27.884391 ], "pop" : 13347, "state" : "FL" } +{ "_id" : "34652", "city" : "NEW PORT RICHEY", "loc" : [ -82.732721, 28.232574 ], "pop" : 22422, "state" : "FL" } +{ "_id" : "34653", "city" : "NEW PORT RICHEY", "loc" : [ -82.6986, 28.244398 ], "pop" : 26729, "state" : "FL" } +{ "_id" : "34654", "city" : "NEW PORT RICHEY", "loc" : [ -82.626423, 28.302201 ], "pop" : 13750, "state" : "FL" } +{ "_id" : "34655", "city" : "NEW PORT RICHEY", "loc" : [ -82.680729, 28.212898 ], "pop" : 13849, "state" : "FL" } +{ "_id" : "34665", "city" : "PINELLAS PARK", "loc" : [ -82.71335000000001, 27.840313 ], "pop" : 24459, "state" : "FL" } +{ "_id" : "34666", "city" : "PINELLAS PARK", "loc" : [ -82.70935299999999, 27.860742 ], "pop" : 19840, "state" : "FL" } +{ "_id" : "34667", "city" : "HUDSON", "loc" : [ -82.675669, 28.364763 ], "pop" : 26410, "state" : "FL" } +{ "_id" : "34668", "city" : "PORT RICHEY", "loc" : [ -82.692714, 28.301148 ], "pop" : 39471, "state" : "FL" } +{ "_id" : "34669", "city" : "HUDSON", "loc" : [ -82.628793, 28.350634 ], "pop" : 8577, "state" : "FL" } +{ "_id" : "34677", "city" : "OLDSMAR", "loc" : [ -82.68477799999999, 28.046035 ], "pop" : 12858, "state" : "FL" } +{ "_id" : "34683", "city" : "PALM HARBOR", "loc" : [ -82.758488, 28.066248 ], "pop" : 42350, "state" : "FL" } +{ "_id" : "34684", "city" : "LAKE TARPON", "loc" : [ -82.726573, 28.073963 ], "pop" : 21753, "state" : "FL" } +{ "_id" : "34685", "city" : "PALM HARBOR", "loc" : [ -82.69635700000001, 28.096725 ], "pop" : 2278, "state" : "FL" } +{ "_id" : "34689", "city" : "TARPON SPRINGS", "loc" : [ -82.74302299999999, 28.138465 ], "pop" : 26381, "state" : "FL" } +{ "_id" : "34690", "city" : "HOLIDAY", "loc" : [ -82.727935, 28.191273 ], "pop" : 11980, "state" : "FL" } +{ "_id" : "34691", "city" : "HOLIDAY", "loc" : [ -82.755965, 28.191336 ], "pop" : 16548, "state" : "FL" } +{ "_id" : "34695", "city" : "SAFETY HARBOR", "loc" : [ -82.696658, 28.009608 ], "pop" : 16853, "state" : "FL" } +{ "_id" : "34698", "city" : "DUNEDIN", "loc" : [ -82.77943399999999, 28.028382 ], "pop" : 15304, "state" : "FL" } +{ "_id" : "34705", "city" : "ASTATULA", "loc" : [ -81.71947299999999, 28.708754 ], "pop" : 1831, "state" : "FL" } +{ "_id" : "34711", "city" : "CLERMONT", "loc" : [ -81.757407, 28.552541 ], "pop" : 15109, "state" : "FL" } +{ "_id" : "34731", "city" : "FRUITLAND PARK", "loc" : [ -81.899755, 28.863949 ], "pop" : 8513, "state" : "FL" } +{ "_id" : "34736", "city" : "GROVELAND", "loc" : [ -81.874526, 28.564445 ], "pop" : 8692, "state" : "FL" } +{ "_id" : "34737", "city" : "HOWEY IN THE HIL", "loc" : [ -81.78998300000001, 28.709818 ], "pop" : 1370, "state" : "FL" } +{ "_id" : "34739", "city" : "KENANSVILLE", "loc" : [ -81.050049, 27.876698 ], "pop" : 736, "state" : "FL" } +{ "_id" : "34741", "city" : "KISSIMMEE", "loc" : [ -81.42420799999999, 28.305056 ], "pop" : 23576, "state" : "FL" } +{ "_id" : "34743", "city" : "BUENA VENTURA LA", "loc" : [ -81.356044, 28.329656 ], "pop" : 14287, "state" : "FL" } +{ "_id" : "34744", "city" : "KISSIMMEE", "loc" : [ -81.368122, 28.307807 ], "pop" : 21101, "state" : "FL" } +{ "_id" : "34746", "city" : "KISSIMMEE", "loc" : [ -81.467478, 28.26796 ], "pop" : 12922, "state" : "FL" } +{ "_id" : "34748", "city" : "LEESBURG", "loc" : [ -81.885772, 28.807965 ], "pop" : 21309, "state" : "FL" } +{ "_id" : "34756", "city" : "MONTVERDE", "loc" : [ -81.679368, 28.597153 ], "pop" : 2216, "state" : "FL" } +{ "_id" : "34758", "city" : "KISSIMMEE", "loc" : [ -81.487014, 28.198436 ], "pop" : 6306, "state" : "FL" } +{ "_id" : "34759", "city" : "POINCIANA", "loc" : [ -81.458984, 28.124786 ], "pop" : 2430, "state" : "FL" } +{ "_id" : "34761", "city" : "OCOEE", "loc" : [ -81.532618, 28.583685 ], "pop" : 14171, "state" : "FL" } +{ "_id" : "34762", "city" : "OKAHUMPKA", "loc" : [ -81.883949, 28.737257 ], "pop" : 1779, "state" : "FL" } +{ "_id" : "34769", "city" : "SAINT CLOUD", "loc" : [ -81.287626, 28.247992 ], "pop" : 15024, "state" : "FL" } +{ "_id" : "34771", "city" : "SAINT CLOUD", "loc" : [ -81.200311, 28.27301 ], "pop" : 5870, "state" : "FL" } +{ "_id" : "34772", "city" : "SAINT CLOUD", "loc" : [ -81.264493, 28.190518 ], "pop" : 6041, "state" : "FL" } +{ "_id" : "34773", "city" : "SAINT CLOUD", "loc" : [ -81.01755199999999, 28.129295 ], "pop" : 1000, "state" : "FL" } +{ "_id" : "34785", "city" : "WILDWOOD", "loc" : [ -82.03473, 28.845353 ], "pop" : 10604, "state" : "FL" } +{ "_id" : "34786", "city" : "WINDERMERE", "loc" : [ -81.535411, 28.50061 ], "pop" : 5725, "state" : "FL" } +{ "_id" : "34787", "city" : "WINTER GARDEN", "loc" : [ -81.591127, 28.542321 ], "pop" : 18939, "state" : "FL" } +{ "_id" : "34788", "city" : "HAINES CREEK", "loc" : [ -81.781159, 28.85744 ], "pop" : 12883, "state" : "FL" } +{ "_id" : "34797", "city" : "YALAHA", "loc" : [ -81.826324, 28.744443 ], "pop" : 1061, "state" : "FL" } +{ "_id" : "34945", "city" : "FORT PIERCE", "loc" : [ -80.443963, 27.438233 ], "pop" : 3711, "state" : "FL" } +{ "_id" : "34946", "city" : "FORT PIERCE", "loc" : [ -80.35996, 27.50077 ], "pop" : 10873, "state" : "FL" } +{ "_id" : "34947", "city" : "FORT PIERCE", "loc" : [ -80.359185, 27.449281 ], "pop" : 10882, "state" : "FL" } +{ "_id" : "34949", "city" : "FORT PIERCE", "loc" : [ -80.26146799999999, 27.389594 ], "pop" : 8853, "state" : "FL" } +{ "_id" : "34950", "city" : "FORT PIERCE", "loc" : [ -80.3385, 27.448567 ], "pop" : 19708, "state" : "FL" } +{ "_id" : "34951", "city" : "FORT PIERCE", "loc" : [ -80.40519500000001, 27.539097 ], "pop" : 6821, "state" : "FL" } +{ "_id" : "34952", "city" : "PORT SAINT LUCIE", "loc" : [ -80.297971, 27.288895 ], "pop" : 23437, "state" : "FL" } +{ "_id" : "34953", "city" : "PORT SAINT LUCIE", "loc" : [ -80.379323, 27.262506 ], "pop" : 11796, "state" : "FL" } +{ "_id" : "34956", "city" : "INDIANTOWN", "loc" : [ -80.480277, 27.061461 ], "pop" : 7823, "state" : "FL" } +{ "_id" : "34957", "city" : "JENSEN BEACH", "loc" : [ -80.227656, 27.235568 ], "pop" : 13656, "state" : "FL" } +{ "_id" : "34972", "city" : "BASINGER", "loc" : [ -80.847853, 27.311532 ], "pop" : 14955, "state" : "FL" } +{ "_id" : "34974", "city" : "OKEECHOBEE", "loc" : [ -80.84103, 27.200224 ], "pop" : 18122, "state" : "FL" } +{ "_id" : "34981", "city" : "FORT PIERCE", "loc" : [ -80.362257, 27.404882 ], "pop" : 3243, "state" : "FL" } +{ "_id" : "34982", "city" : "FORT PIERCE", "loc" : [ -80.32463300000001, 27.390764 ], "pop" : 20061, "state" : "FL" } +{ "_id" : "34983", "city" : "PORT SAINT LUCIE", "loc" : [ -80.345029, 27.309444 ], "pop" : 22031, "state" : "FL" } +{ "_id" : "34984", "city" : "PORT SAINT LUCIE", "loc" : [ -80.338936, 27.265476 ], "pop" : 7091, "state" : "FL" } +{ "_id" : "34986", "city" : "PORT SAINT LUCIE", "loc" : [ -80.40304500000001, 27.32148 ], "pop" : 610, "state" : "FL" } +{ "_id" : "34987", "city" : "PORT SAINT LUCIE", "loc" : [ -80.477052, 27.260595 ], "pop" : 67, "state" : "FL" } +{ "_id" : "34988", "city" : "PORT SAINT LUCIE", "loc" : [ -80.51725999999999, 27.323233 ], "pop" : 416, "state" : "FL" } +{ "_id" : "34990", "city" : "PALM CITY", "loc" : [ -80.291646, 27.165646 ], "pop" : 13225, "state" : "FL" } +{ "_id" : "34994", "city" : "STUART", "loc" : [ -80.25378600000001, 27.196834 ], "pop" : 14524, "state" : "FL" } +{ "_id" : "34996", "city" : "STUART", "loc" : [ -80.21637800000001, 27.192857 ], "pop" : 7410, "state" : "FL" } +{ "_id" : "34997", "city" : "STUART", "loc" : [ -80.212937, 27.139817 ], "pop" : 25374, "state" : "FL" } +{ "_id" : "35004", "city" : "ACMAR", "loc" : [ -86.51557, 33.584132 ], "pop" : 6055, "state" : "AL" } +{ "_id" : "35005", "city" : "ADAMSVILLE", "loc" : [ -86.959727, 33.588437 ], "pop" : 10616, "state" : "AL" } +{ "_id" : "35006", "city" : "ADGER", "loc" : [ -87.167455, 33.434277 ], "pop" : 3205, "state" : "AL" } +{ "_id" : "35007", "city" : "KEYSTONE", "loc" : [ -86.812861, 33.236868 ], "pop" : 14218, "state" : "AL" } +{ "_id" : "35010", "city" : "NEW SITE", "loc" : [ -85.951086, 32.941445 ], "pop" : 19942, "state" : "AL" } +{ "_id" : "35014", "city" : "ALPINE", "loc" : [ -86.208934, 33.331165 ], "pop" : 3062, "state" : "AL" } +{ "_id" : "35016", "city" : "ARAB", "loc" : [ -86.489638, 34.328339 ], "pop" : 13650, "state" : "AL" } +{ "_id" : "35019", "city" : "BAILEYTON", "loc" : [ -86.62129899999999, 34.268298 ], "pop" : 1781, "state" : "AL" } +{ "_id" : "35020", "city" : "BESSEMER", "loc" : [ -86.947547, 33.409002 ], "pop" : 40549, "state" : "AL" } +{ "_id" : "35023", "city" : "HUEYTOWN", "loc" : [ -86.999607, 33.414625 ], "pop" : 39677, "state" : "AL" } +{ "_id" : "35031", "city" : "BLOUNTSVILLE", "loc" : [ -86.568628, 34.092937 ], "pop" : 9058, "state" : "AL" } +{ "_id" : "35033", "city" : "BREMEN", "loc" : [ -87.00428100000001, 33.973664 ], "pop" : 3448, "state" : "AL" } +{ "_id" : "35034", "city" : "BRENT", "loc" : [ -87.211387, 32.93567 ], "pop" : 3791, "state" : "AL" } +{ "_id" : "35035", "city" : "BRIERFIELD", "loc" : [ -86.951672, 33.042747 ], "pop" : 1282, "state" : "AL" } +{ "_id" : "35040", "city" : "CALERA", "loc" : [ -86.755987, 33.1098 ], "pop" : 4675, "state" : "AL" } +{ "_id" : "35042", "city" : "CENTREVILLE", "loc" : [ -87.11924, 32.950324 ], "pop" : 4902, "state" : "AL" } +{ "_id" : "35043", "city" : "CHELSEA", "loc" : [ -86.614132, 33.371582 ], "pop" : 4781, "state" : "AL" } +{ "_id" : "35044", "city" : "COOSA PINES", "loc" : [ -86.337622, 33.266928 ], "pop" : 7985, "state" : "AL" } +{ "_id" : "35045", "city" : "CLANTON", "loc" : [ -86.642472, 32.835532 ], "pop" : 13990, "state" : "AL" } +{ "_id" : "35049", "city" : "CLEVELAND", "loc" : [ -86.559355, 33.992106 ], "pop" : 2369, "state" : "AL" } +{ "_id" : "35051", "city" : "COLUMBIANA", "loc" : [ -86.616145, 33.176964 ], "pop" : 4486, "state" : "AL" } +{ "_id" : "35053", "city" : "CRANE HILL", "loc" : [ -87.048395, 34.082117 ], "pop" : 2270, "state" : "AL" } +{ "_id" : "35054", "city" : "CROPWELL", "loc" : [ -86.28002600000001, 33.506448 ], "pop" : 4171, "state" : "AL" } +{ "_id" : "35055", "city" : "CULLMAN", "loc" : [ -86.82977700000001, 34.176146 ], "pop" : 31708, "state" : "AL" } +{ "_id" : "35061", "city" : "DOLOMITE", "loc" : [ -86.956435, 33.465424 ], "pop" : 1476, "state" : "AL" } +{ "_id" : "35062", "city" : "DORA", "loc" : [ -87.040148, 33.734947 ], "pop" : 11017, "state" : "AL" } +{ "_id" : "35063", "city" : "EMPIRE", "loc" : [ -87.016139, 33.825589 ], "pop" : 2429, "state" : "AL" } +{ "_id" : "35064", "city" : "FAIRFIELD", "loc" : [ -86.918262, 33.473494 ], "pop" : 12106, "state" : "AL" } +{ "_id" : "35068", "city" : "COALBURG", "loc" : [ -86.813614, 33.611283 ], "pop" : 5909, "state" : "AL" } +{ "_id" : "35071", "city" : "GARDENDALE", "loc" : [ -86.822481, 33.71891 ], "pop" : 17968, "state" : "AL" } +{ "_id" : "35072", "city" : "GOODWATER", "loc" : [ -86.078149, 33.074642 ], "pop" : 3813, "state" : "AL" } +{ "_id" : "35073", "city" : "ALDEN", "loc" : [ -86.948221, 33.63356 ], "pop" : 4429, "state" : "AL" } +{ "_id" : "35077", "city" : "HANCEVILLE", "loc" : [ -86.78484400000001, 34.051569 ], "pop" : 10186, "state" : "AL" } +{ "_id" : "35078", "city" : "HARPERSVILLE", "loc" : [ -86.429441, 33.36746 ], "pop" : 4905, "state" : "AL" } +{ "_id" : "35079", "city" : "HAYDEN", "loc" : [ -86.81767000000001, 33.885806 ], "pop" : 6533, "state" : "AL" } +{ "_id" : "35080", "city" : "HELENA", "loc" : [ -86.81378599999999, 33.316978 ], "pop" : 9938, "state" : "AL" } +{ "_id" : "35083", "city" : "HOLLY POND", "loc" : [ -86.617441, 34.190085 ], "pop" : 3838, "state" : "AL" } +{ "_id" : "35085", "city" : "JEMISON", "loc" : [ -86.718052, 32.980539 ], "pop" : 7202, "state" : "AL" } +{ "_id" : "35087", "city" : "JOPPA", "loc" : [ -86.551939, 34.283739 ], "pop" : 987, "state" : "AL" } +{ "_id" : "35089", "city" : "KELLYTON", "loc" : [ -86.04839699999999, 32.979068 ], "pop" : 1584, "state" : "AL" } +{ "_id" : "35091", "city" : "KIMBERLY", "loc" : [ -86.80841700000001, 33.768355 ], "pop" : 1045, "state" : "AL" } +{ "_id" : "35094", "city" : "LEEDS", "loc" : [ -86.57482400000001, 33.528333 ], "pop" : 10421, "state" : "AL" } +{ "_id" : "35096", "city" : "LINCOLN", "loc" : [ -86.111152, 33.605913 ], "pop" : 5033, "state" : "AL" } +{ "_id" : "35098", "city" : "LOGAN", "loc" : [ -87.038115, 34.184079 ], "pop" : 2379, "state" : "AL" } +{ "_id" : "35111", "city" : "MC CALLA", "loc" : [ -87.102379, 33.284546 ], "pop" : 8147, "state" : "AL" } +{ "_id" : "35114", "city" : "MAYLENE", "loc" : [ -86.87274499999999, 33.231694 ], "pop" : 3727, "state" : "AL" } +{ "_id" : "35115", "city" : "MONTEVALLO", "loc" : [ -86.862228, 33.124765 ], "pop" : 11638, "state" : "AL" } +{ "_id" : "35116", "city" : "MORRIS", "loc" : [ -86.77255100000001, 33.739172 ], "pop" : 3622, "state" : "AL" } +{ "_id" : "35117", "city" : "MOUNT OLIVE", "loc" : [ -86.87170999999999, 33.67678 ], "pop" : 3841, "state" : "AL" } +{ "_id" : "35118", "city" : "SYLVAN SPRINGS", "loc" : [ -87.043998, 33.540696 ], "pop" : 3948, "state" : "AL" } +{ "_id" : "35120", "city" : "ODENVILLE", "loc" : [ -86.408952, 33.675611 ], "pop" : 1123, "state" : "AL" } +{ "_id" : "35121", "city" : "ONEONTA", "loc" : [ -86.474118, 33.925858 ], "pop" : 8956, "state" : "AL" } +{ "_id" : "35124", "city" : "INDIAN SPRINGS", "loc" : [ -86.80617599999999, 33.31046 ], "pop" : 7412, "state" : "AL" } +{ "_id" : "35125", "city" : "PELL CITY", "loc" : [ -86.34315100000001, 33.597889 ], "pop" : 17981, "state" : "AL" } +{ "_id" : "35126", "city" : "DIXIANA", "loc" : [ -86.656542, 33.708131 ], "pop" : 17068, "state" : "AL" } +{ "_id" : "35127", "city" : "PLEASANT GROVE", "loc" : [ -86.976586, 33.488336 ], "pop" : 8458, "state" : "AL" } +{ "_id" : "35130", "city" : "QUINTON", "loc" : [ -87.10066, 33.656065 ], "pop" : 2198, "state" : "AL" } +{ "_id" : "35131", "city" : "RAGLAND", "loc" : [ -86.1619, 33.736677 ], "pop" : 2797, "state" : "AL" } +{ "_id" : "35133", "city" : "REMLAP", "loc" : [ -86.641662, 33.846204 ], "pop" : 6013, "state" : "AL" } +{ "_id" : "35135", "city" : "RIVERSIDE", "loc" : [ -86.198341, 33.608832 ], "pop" : 1004, "state" : "AL" } +{ "_id" : "35136", "city" : "ROCKFORD", "loc" : [ -86.24000599999999, 32.877957 ], "pop" : 1819, "state" : "AL" } +{ "_id" : "35143", "city" : "SHELBY", "loc" : [ -86.553606, 33.078483 ], "pop" : 1846, "state" : "AL" } +{ "_id" : "35146", "city" : "SPRINGVILLE", "loc" : [ -86.439407, 33.738647 ], "pop" : 8723, "state" : "AL" } +{ "_id" : "35147", "city" : "STERRETT", "loc" : [ -86.491732, 33.446103 ], "pop" : 617, "state" : "AL" } +{ "_id" : "35148", "city" : "SUMITON", "loc" : [ -87.044545, 33.768005 ], "pop" : 3066, "state" : "AL" } +{ "_id" : "35150", "city" : "SYLACAUGA", "loc" : [ -86.27125700000001, 33.171675 ], "pop" : 24424, "state" : "AL" } +{ "_id" : "35160", "city" : "TALLADEGA", "loc" : [ -86.11335200000001, 33.435445 ], "pop" : 29778, "state" : "AL" } +{ "_id" : "35171", "city" : "THORSBY", "loc" : [ -86.746724, 32.923755 ], "pop" : 4131, "state" : "AL" } +{ "_id" : "35172", "city" : "TRAFFORD", "loc" : [ -86.743414, 33.819038 ], "pop" : 909, "state" : "AL" } +{ "_id" : "35173", "city" : "TRUSSVILLE", "loc" : [ -86.598068, 33.633932 ], "pop" : 13367, "state" : "AL" } +{ "_id" : "35175", "city" : "UNION GROVE", "loc" : [ -86.462793, 34.409345 ], "pop" : 4921, "state" : "AL" } +{ "_id" : "35176", "city" : "VANDIVER", "loc" : [ -86.501278, 33.480704 ], "pop" : 1066, "state" : "AL" } +{ "_id" : "35178", "city" : "VINCENT", "loc" : [ -86.39942499999999, 33.401049 ], "pop" : 295, "state" : "AL" } +{ "_id" : "35179", "city" : "VINEMONT", "loc" : [ -86.91251200000001, 34.262121 ], "pop" : 8852, "state" : "AL" } +{ "_id" : "35180", "city" : "WARRIOR", "loc" : [ -86.819849, 33.852862 ], "pop" : 530, "state" : "AL" } +{ "_id" : "35183", "city" : "WEOGUFKA", "loc" : [ -86.304203, 33.02381 ], "pop" : 1249, "state" : "AL" } +{ "_id" : "35184", "city" : "WEST BLOCTON", "loc" : [ -87.13694, 33.142431 ], "pop" : 5276, "state" : "AL" } +{ "_id" : "35186", "city" : "WILSONVILLE", "loc" : [ -86.529894, 33.229255 ], "pop" : 5224, "state" : "AL" } +{ "_id" : "35188", "city" : "WOODSTOCK", "loc" : [ -87.16346900000001, 33.169808 ], "pop" : 691, "state" : "AL" } +{ "_id" : "35203", "city" : "BIRMINGHAM", "loc" : [ -86.80662599999999, 33.520994 ], "pop" : 4064, "state" : "AL" } +{ "_id" : "35204", "city" : "BIRMINGHAM", "loc" : [ -86.837198, 33.51795 ], "pop" : 18193, "state" : "AL" } +{ "_id" : "35205", "city" : "BIRMINGHAM", "loc" : [ -86.805937, 33.495144 ], "pop" : 23024, "state" : "AL" } +{ "_id" : "35206", "city" : "BIRMINGHAM", "loc" : [ -86.719854, 33.567797 ], "pop" : 22050, "state" : "AL" } +{ "_id" : "35207", "city" : "BIRMINGHAM", "loc" : [ -86.815344, 33.559383 ], "pop" : 13901, "state" : "AL" } +{ "_id" : "35208", "city" : "BIRMINGHAM", "loc" : [ -86.879884, 33.497658 ], "pop" : 19328, "state" : "AL" } +{ "_id" : "35209", "city" : "HOMEWOOD", "loc" : [ -86.806738, 33.469624 ], "pop" : 24973, "state" : "AL" } +{ "_id" : "35210", "city" : "IRONDALE", "loc" : [ -86.685697, 33.532797 ], "pop" : 15047, "state" : "AL" } +{ "_id" : "35211", "city" : "BIRMINGHAM", "loc" : [ -86.85903999999999, 33.481565 ], "pop" : 35836, "state" : "AL" } +{ "_id" : "35212", "city" : "BIRMINGHAM", "loc" : [ -86.74952399999999, 33.540883 ], "pop" : 17865, "state" : "AL" } +{ "_id" : "35213", "city" : "CRESTLINE HEIGHT", "loc" : [ -86.742108, 33.508195 ], "pop" : 13191, "state" : "AL" } +{ "_id" : "35214", "city" : "BIRMINGHAM", "loc" : [ -86.886989, 33.555445 ], "pop" : 23293, "state" : "AL" } +{ "_id" : "35215", "city" : "CENTER POINT", "loc" : [ -86.693197, 33.635447 ], "pop" : 43862, "state" : "AL" } +{ "_id" : "35216", "city" : "VESTAVIA HILLS", "loc" : [ -86.790425, 33.41531 ], "pop" : 29224, "state" : "AL" } +{ "_id" : "35217", "city" : "BIRMINGHAM", "loc" : [ -86.764995, 33.5887 ], "pop" : 17366, "state" : "AL" } +{ "_id" : "35218", "city" : "BIRMINGHAM", "loc" : [ -86.892993, 33.505972 ], "pop" : 12137, "state" : "AL" } +{ "_id" : "35221", "city" : "BIRMINGHAM", "loc" : [ -86.89349300000001, 33.452316 ], "pop" : 5850, "state" : "AL" } +{ "_id" : "35222", "city" : "BIRMINGHAM", "loc" : [ -86.76657899999999, 33.521859 ], "pop" : 10035, "state" : "AL" } +{ "_id" : "35223", "city" : "MOUNTAIN BROOK", "loc" : [ -86.73658399999999, 33.488726 ], "pop" : 11117, "state" : "AL" } +{ "_id" : "35224", "city" : "BIRMINGHAM", "loc" : [ -86.93419299999999, 33.519126 ], "pop" : 7894, "state" : "AL" } +{ "_id" : "35226", "city" : "BLUFF PARK", "loc" : [ -86.83125699999999, 33.403675 ], "pop" : 23992, "state" : "AL" } +{ "_id" : "35228", "city" : "MIDFIELD", "loc" : [ -86.914703, 33.462446 ], "pop" : 9294, "state" : "AL" } +{ "_id" : "35233", "city" : "BIRMINGHAM", "loc" : [ -86.800257, 33.506161 ], "pop" : 842, "state" : "AL" } +{ "_id" : "35234", "city" : "BIRMINGHAM", "loc" : [ -86.80685, 33.53775 ], "pop" : 10928, "state" : "AL" } +{ "_id" : "35235", "city" : "CENTER POINT", "loc" : [ -86.661051, 33.618045 ], "pop" : 15873, "state" : "AL" } +{ "_id" : "35242", "city" : "SHOAL CREEK", "loc" : [ -86.705511, 33.401559 ], "pop" : 16228, "state" : "AL" } +{ "_id" : "35243", "city" : "CAHABA HEIGHTS", "loc" : [ -86.74367599999999, 33.446053 ], "pop" : 13091, "state" : "AL" } +{ "_id" : "35244", "city" : "HOOVER", "loc" : [ -86.776381, 33.371776 ], "pop" : 9758, "state" : "AL" } +{ "_id" : "35401", "city" : "TUSCALOOSA", "loc" : [ -87.56266599999999, 33.196891 ], "pop" : 42124, "state" : "AL" } +{ "_id" : "35404", "city" : "HOLT", "loc" : [ -87.488079, 33.210914 ], "pop" : 21997, "state" : "AL" } +{ "_id" : "35405", "city" : "TUSCALOOSA", "loc" : [ -87.51443500000001, 33.161704 ], "pop" : 23663, "state" : "AL" } +{ "_id" : "35406", "city" : "TUSCALOOSA", "loc" : [ -87.536035, 33.272174 ], "pop" : 12578, "state" : "AL" } +{ "_id" : "35441", "city" : "STEWART", "loc" : [ -87.708558, 32.872354 ], "pop" : 1745, "state" : "AL" } +{ "_id" : "35442", "city" : "ALICEVILLE", "loc" : [ -88.16668900000001, 33.122813 ], "pop" : 5196, "state" : "AL" } +{ "_id" : "35443", "city" : "BOLIGEE", "loc" : [ -88.026652, 32.774646 ], "pop" : 1073, "state" : "AL" } +{ "_id" : "35444", "city" : "BROOKWOOD", "loc" : [ -87.30902500000001, 33.277523 ], "pop" : 2319, "state" : "AL" } +{ "_id" : "35446", "city" : "BUHL", "loc" : [ -87.718886, 33.249448 ], "pop" : 1662, "state" : "AL" } +{ "_id" : "35447", "city" : "CARROLLTON", "loc" : [ -88.132122, 33.248506 ], "pop" : 5007, "state" : "AL" } +{ "_id" : "35452", "city" : "COKER", "loc" : [ -87.636528, 33.252612 ], "pop" : 5747, "state" : "AL" } +{ "_id" : "35453", "city" : "COTTONDALE", "loc" : [ -87.387051, 33.176667 ], "pop" : 4727, "state" : "AL" } +{ "_id" : "35456", "city" : "DUNCANVILLE", "loc" : [ -87.49497700000001, 33.082815 ], "pop" : 5514, "state" : "AL" } +{ "_id" : "35457", "city" : "ECHOLA", "loc" : [ -87.807202, 33.316559 ], "pop" : 223, "state" : "AL" } +{ "_id" : "35458", "city" : "ELROD", "loc" : [ -87.801429, 33.343678 ], "pop" : 809, "state" : "AL" } +{ "_id" : "35459", "city" : "EMELLE", "loc" : [ -88.305747, 32.754963 ], "pop" : 491, "state" : "AL" } +{ "_id" : "35460", "city" : "EPES", "loc" : [ -88.16144300000001, 32.763371 ], "pop" : 1391, "state" : "AL" } +{ "_id" : "35461", "city" : "ETHELSVILLE", "loc" : [ -88.221987, 33.386816 ], "pop" : 719, "state" : "AL" } +{ "_id" : "35462", "city" : "EUTAW", "loc" : [ -87.930297, 32.888871 ], "pop" : 6586, "state" : "AL" } +{ "_id" : "35463", "city" : "FOSTERS", "loc" : [ -87.735688, 33.135859 ], "pop" : 2100, "state" : "AL" } +{ "_id" : "35464", "city" : "GAINESVILLE", "loc" : [ -88.271558, 32.908364 ], "pop" : 1051, "state" : "AL" } +{ "_id" : "35466", "city" : "GORDO", "loc" : [ -87.900504, 33.346917 ], "pop" : 4333, "state" : "AL" } +{ "_id" : "35469", "city" : "KNOXVILLE", "loc" : [ -87.791855, 32.982423 ], "pop" : 373, "state" : "AL" } +{ "_id" : "35470", "city" : "COATOPA", "loc" : [ -88.173592, 32.588509 ], "pop" : 6055, "state" : "AL" } +{ "_id" : "35474", "city" : "CYPRESS", "loc" : [ -87.615134, 32.978853 ], "pop" : 2659, "state" : "AL" } +{ "_id" : "35476", "city" : "NORTHPORT", "loc" : [ -87.591441, 33.283425 ], "pop" : 20114, "state" : "AL" } +{ "_id" : "35480", "city" : "RALPH", "loc" : [ -87.744984, 33.062868 ], "pop" : 927, "state" : "AL" } +{ "_id" : "35481", "city" : "REFORM", "loc" : [ -88.02027699999999, 33.395945 ], "pop" : 4062, "state" : "AL" } +{ "_id" : "35490", "city" : "VANCE", "loc" : [ -87.257362, 33.17498 ], "pop" : 1234, "state" : "AL" } +{ "_id" : "35501", "city" : "JASPER", "loc" : [ -87.249144, 33.871672 ], "pop" : 30600, "state" : "AL" } +{ "_id" : "35540", "city" : "ADDISON", "loc" : [ -87.194766, 34.205571 ], "pop" : 3263, "state" : "AL" } +{ "_id" : "35541", "city" : "ARLEY", "loc" : [ -87.182761, 34.063234 ], "pop" : 2645, "state" : "AL" } +{ "_id" : "35542", "city" : "BANKSTON", "loc" : [ -87.68965, 33.70083 ], "pop" : 651, "state" : "AL" } +{ "_id" : "35543", "city" : "BEAR CREEK", "loc" : [ -87.686083, 34.213469 ], "pop" : 3748, "state" : "AL" } +{ "_id" : "35544", "city" : "BEAVERTON", "loc" : [ -88.01567, 33.942877 ], "pop" : 1014, "state" : "AL" } +{ "_id" : "35546", "city" : "BERRY", "loc" : [ -87.622563, 33.694485 ], "pop" : 4887, "state" : "AL" } +{ "_id" : "35548", "city" : "BRILLIANT", "loc" : [ -87.756315, 34.037702 ], "pop" : 2515, "state" : "AL" } +{ "_id" : "35549", "city" : "CARBON HILL", "loc" : [ -87.540328, 33.909252 ], "pop" : 3597, "state" : "AL" } +{ "_id" : "35550", "city" : "CORDOVA", "loc" : [ -87.18406, 33.768033 ], "pop" : 5273, "state" : "AL" } +{ "_id" : "35552", "city" : "DETROIT", "loc" : [ -88.16063, 34.010874 ], "pop" : 938, "state" : "AL" } +{ "_id" : "35553", "city" : "DOUBLE SPRINGS", "loc" : [ -87.397431, 34.138682 ], "pop" : 4797, "state" : "AL" } +{ "_id" : "35554", "city" : "ELDRIDGE", "loc" : [ -87.61939700000001, 33.931546 ], "pop" : 421, "state" : "AL" } +{ "_id" : "35555", "city" : "FAYETTE", "loc" : [ -87.834647, 33.697397 ], "pop" : 10776, "state" : "AL" } +{ "_id" : "35563", "city" : "GUIN", "loc" : [ -87.90237999999999, 33.967624 ], "pop" : 3948, "state" : "AL" } +{ "_id" : "35564", "city" : "HACKLEBURG", "loc" : [ -87.86076199999999, 34.267803 ], "pop" : 2828, "state" : "AL" } +{ "_id" : "35565", "city" : "HALEYVILLE", "loc" : [ -87.593811, 34.231423 ], "pop" : 9141, "state" : "AL" } +{ "_id" : "35570", "city" : "HAMILTON", "loc" : [ -88.008521, 34.153413 ], "pop" : 11184, "state" : "AL" } +{ "_id" : "35571", "city" : "HODGES", "loc" : [ -87.959023, 34.341664 ], "pop" : 798, "state" : "AL" } +{ "_id" : "35572", "city" : "HOUSTON", "loc" : [ -87.26183, 34.118042 ], "pop" : 429, "state" : "AL" } +{ "_id" : "35574", "city" : "KENNEDY", "loc" : [ -88.05172, 33.574964 ], "pop" : 3618, "state" : "AL" } +{ "_id" : "35575", "city" : "LYNN", "loc" : [ -87.53981400000001, 34.052984 ], "pop" : 1778, "state" : "AL" } +{ "_id" : "35576", "city" : "MILLPORT", "loc" : [ -88.200003, 33.54013 ], "pop" : 2286, "state" : "AL" } +{ "_id" : "35578", "city" : "NAUVOO", "loc" : [ -87.43244900000001, 33.929859 ], "pop" : 5004, "state" : "AL" } +{ "_id" : "35579", "city" : "OAKMAN", "loc" : [ -87.368574, 33.700174 ], "pop" : 3700, "state" : "AL" } +{ "_id" : "35580", "city" : "PARRISH", "loc" : [ -87.265773, 33.721307 ], "pop" : 4775, "state" : "AL" } +{ "_id" : "35581", "city" : "PHIL CAMPBELL", "loc" : [ -87.715431, 34.347018 ], "pop" : 5345, "state" : "AL" } +{ "_id" : "35582", "city" : "RED BAY", "loc" : [ -88.112914, 34.451259 ], "pop" : 5159, "state" : "AL" } +{ "_id" : "35585", "city" : "SPRUCE PINE", "loc" : [ -87.712149, 34.384796 ], "pop" : 465, "state" : "AL" } +{ "_id" : "35586", "city" : "SULLIGENT", "loc" : [ -88.150774, 33.8549 ], "pop" : 4489, "state" : "AL" } +{ "_id" : "35587", "city" : "TOWNLEY", "loc" : [ -87.437248, 33.84702 ], "pop" : 1819, "state" : "AL" } +{ "_id" : "35592", "city" : "VERNON", "loc" : [ -88.097919, 33.761285 ], "pop" : 4752, "state" : "AL" } +{ "_id" : "35593", "city" : "VINA", "loc" : [ -88.077422, 34.37116 ], "pop" : 888, "state" : "AL" } +{ "_id" : "35594", "city" : "WINFIELD", "loc" : [ -87.79716000000001, 33.930256 ], "pop" : 6750, "state" : "AL" } +{ "_id" : "35601", "city" : "DECATUR", "loc" : [ -86.98868, 34.589599 ], "pop" : 36696, "state" : "AL" } +{ "_id" : "35603", "city" : "DECATUR", "loc" : [ -87.000389, 34.548417 ], "pop" : 17861, "state" : "AL" } +{ "_id" : "35610", "city" : "ANDERSON", "loc" : [ -87.272327, 34.951777 ], "pop" : 2039, "state" : "AL" } +{ "_id" : "35611", "city" : "ATHENS", "loc" : [ -86.970733, 34.803604 ], "pop" : 35441, "state" : "AL" } +{ "_id" : "35616", "city" : "CHEROKEE", "loc" : [ -87.97244499999999, 34.744188 ], "pop" : 4811, "state" : "AL" } +{ "_id" : "35618", "city" : "COURTLAND", "loc" : [ -87.314255, 34.671866 ], "pop" : 2733, "state" : "AL" } +{ "_id" : "35619", "city" : "DANVILLE", "loc" : [ -87.05318699999999, 34.452189 ], "pop" : 4614, "state" : "AL" } +{ "_id" : "35620", "city" : "ELKMONT", "loc" : [ -86.91045200000001, 34.915241 ], "pop" : 8013, "state" : "AL" } +{ "_id" : "35621", "city" : "EVA", "loc" : [ -86.704427, 34.347778 ], "pop" : 3977, "state" : "AL" } +{ "_id" : "35622", "city" : "FALKVILLE", "loc" : [ -86.91308600000001, 34.347653 ], "pop" : 5392, "state" : "AL" } +{ "_id" : "35630", "city" : "FLORENCE", "loc" : [ -87.655985, 34.830547 ], "pop" : 38725, "state" : "AL" } +{ "_id" : "35633", "city" : "FLORENCE", "loc" : [ -87.739778, 34.882471 ], "pop" : 16478, "state" : "AL" } +{ "_id" : "35640", "city" : "HARTSELLE", "loc" : [ -86.924235, 34.448206 ], "pop" : 17963, "state" : "AL" } +{ "_id" : "35643", "city" : "HILLSBORO", "loc" : [ -87.180379, 34.64763 ], "pop" : 1967, "state" : "AL" } +{ "_id" : "35645", "city" : "KILLEN", "loc" : [ -87.508185, 34.901632 ], "pop" : 11758, "state" : "AL" } +{ "_id" : "35646", "city" : "LEIGHTON", "loc" : [ -87.522133, 34.710982 ], "pop" : 3046, "state" : "AL" } +{ "_id" : "35647", "city" : "LESTER", "loc" : [ -87.143396, 34.918364 ], "pop" : 3108, "state" : "AL" } +{ "_id" : "35648", "city" : "LEXINGTON", "loc" : [ -87.393519, 34.955924 ], "pop" : 2241, "state" : "AL" } +{ "_id" : "35650", "city" : "MOULTON", "loc" : [ -87.222385, 34.505836 ], "pop" : 17288, "state" : "AL" } +{ "_id" : "35651", "city" : "MOUNT HOPE", "loc" : [ -87.451453, 34.462969 ], "pop" : 1821, "state" : "AL" } +{ "_id" : "35652", "city" : "ROGERSVILLE", "loc" : [ -87.323671, 34.849544 ], "pop" : 6521, "state" : "AL" } +{ "_id" : "35653", "city" : "RUSSELLVILLE", "loc" : [ -87.72572599999999, 34.506568 ], "pop" : 17767, "state" : "AL" } +{ "_id" : "35660", "city" : "SHEFFIELD", "loc" : [ -87.697057, 34.757829 ], "pop" : 10685, "state" : "AL" } +{ "_id" : "35661", "city" : "MUSCLE SHOALS", "loc" : [ -87.630443, 34.756136 ], "pop" : 11777, "state" : "AL" } +{ "_id" : "35670", "city" : "SOMERVILLE", "loc" : [ -86.80093100000001, 34.499548 ], "pop" : 5184, "state" : "AL" } +{ "_id" : "35671", "city" : "TANNER", "loc" : [ -86.989152, 34.713037 ], "pop" : 2578, "state" : "AL" } +{ "_id" : "35672", "city" : "TOWN CREEK", "loc" : [ -87.42619500000001, 34.649138 ], "pop" : 9049, "state" : "AL" } +{ "_id" : "35673", "city" : "TRINITY", "loc" : [ -87.09126999999999, 34.591771 ], "pop" : 1758, "state" : "AL" } +{ "_id" : "35674", "city" : "TUSCUMBIA", "loc" : [ -87.68325900000001, 34.687432 ], "pop" : 17880, "state" : "AL" } +{ "_id" : "35677", "city" : "WATERLOO", "loc" : [ -87.962412, 34.93568 ], "pop" : 1899, "state" : "AL" } +{ "_id" : "35739", "city" : "ARDMORE", "loc" : [ -86.83461200000001, 34.980447 ], "pop" : 1898, "state" : "AL" } +{ "_id" : "35740", "city" : "BRIDGEPORT", "loc" : [ -85.727681, 34.944638 ], "pop" : 3988, "state" : "AL" } +{ "_id" : "35741", "city" : "BROWNSBORO", "loc" : [ -86.468703, 34.716733 ], "pop" : 1793, "state" : "AL" } +{ "_id" : "35744", "city" : "DUTTON", "loc" : [ -85.906729, 34.604558 ], "pop" : 2948, "state" : "AL" } +{ "_id" : "35745", "city" : "ESTILLFORK", "loc" : [ -86.171571, 34.913017 ], "pop" : 718, "state" : "AL" } +{ "_id" : "35746", "city" : "FACKLER", "loc" : [ -85.98464800000001, 34.82589 ], "pop" : 396, "state" : "AL" } +{ "_id" : "35747", "city" : "GRANT", "loc" : [ -86.259041, 34.495902 ], "pop" : 8345, "state" : "AL" } +{ "_id" : "35748", "city" : "GURLEY", "loc" : [ -86.39402800000001, 34.713964 ], "pop" : 4642, "state" : "AL" } +{ "_id" : "35749", "city" : "HARVEST", "loc" : [ -86.74992899999999, 34.82732 ], "pop" : 5701, "state" : "AL" } +{ "_id" : "35750", "city" : "HAZEL GREEN", "loc" : [ -86.593484, 34.949627 ], "pop" : 7751, "state" : "AL" } +{ "_id" : "35751", "city" : "HOLLYTREE", "loc" : [ -86.233627, 34.798979 ], "pop" : 260, "state" : "AL" } +{ "_id" : "35752", "city" : "HOLLYWOOD", "loc" : [ -85.95317300000001, 34.730428 ], "pop" : 2038, "state" : "AL" } +{ "_id" : "35754", "city" : "LACEYS SPRING", "loc" : [ -86.612869, 34.499647 ], "pop" : 7040, "state" : "AL" } +{ "_id" : "35755", "city" : "LANGSTON", "loc" : [ -86.10563, 34.497831 ], "pop" : 1041, "state" : "AL" } +{ "_id" : "35758", "city" : "TRIANA", "loc" : [ -86.750951, 34.713409 ], "pop" : 24398, "state" : "AL" } +{ "_id" : "35759", "city" : "MERIDIANVILLE", "loc" : [ -86.578879, 34.861779 ], "pop" : 2597, "state" : "AL" } +{ "_id" : "35760", "city" : "NEW HOPE", "loc" : [ -86.3961, 34.549445 ], "pop" : 4075, "state" : "AL" } +{ "_id" : "35761", "city" : "NEW MARKET", "loc" : [ -86.448742, 34.899991 ], "pop" : 5825, "state" : "AL" } +{ "_id" : "35763", "city" : "BIG COVE", "loc" : [ -86.466577, 34.612859 ], "pop" : 3156, "state" : "AL" } +{ "_id" : "35764", "city" : "PAINT ROCK", "loc" : [ -86.332562, 34.667122 ], "pop" : 553, "state" : "AL" } +{ "_id" : "35765", "city" : "PISGAH", "loc" : [ -85.803044, 34.688601 ], "pop" : 3717, "state" : "AL" } +{ "_id" : "35766", "city" : "PRINCETON", "loc" : [ -86.250068, 34.840217 ], "pop" : 273, "state" : "AL" } +{ "_id" : "35768", "city" : "HYTOP", "loc" : [ -86.05133600000001, 34.67227 ], "pop" : 16934, "state" : "AL" } +{ "_id" : "35771", "city" : "SECTION", "loc" : [ -85.99400199999999, 34.543275 ], "pop" : 2590, "state" : "AL" } +{ "_id" : "35772", "city" : "STEVENSON", "loc" : [ -85.850803, 34.876885 ], "pop" : 5210, "state" : "AL" } +{ "_id" : "35773", "city" : "TONEY", "loc" : [ -86.699951, 34.911644 ], "pop" : 5953, "state" : "AL" } +{ "_id" : "35774", "city" : "TRENTON", "loc" : [ -86.291264, 34.740065 ], "pop" : 381, "state" : "AL" } +{ "_id" : "35775", "city" : "VALHERMOSO SPRIN", "loc" : [ -86.678, 34.538145 ], "pop" : 667, "state" : "AL" } +{ "_id" : "35776", "city" : "WOODVILLE", "loc" : [ -86.22960999999999, 34.668927 ], "pop" : 2222, "state" : "AL" } +{ "_id" : "35801", "city" : "HUNTSVILLE", "loc" : [ -86.567318, 34.726866 ], "pop" : 25513, "state" : "AL" } +{ "_id" : "35802", "city" : "HUNTSVILLE", "loc" : [ -86.56034699999999, 34.667922 ], "pop" : 21069, "state" : "AL" } +{ "_id" : "35803", "city" : "HUNTSVILLE", "loc" : [ -86.55096, 34.620506 ], "pop" : 23380, "state" : "AL" } +{ "_id" : "35805", "city" : "HUNTSVILLE", "loc" : [ -86.61649300000001, 34.705943 ], "pop" : 24637, "state" : "AL" } +{ "_id" : "35806", "city" : "HUNTSVILLE", "loc" : [ -86.670411, 34.744765 ], "pop" : 10121, "state" : "AL" } +{ "_id" : "35808", "city" : "HUNTSVILLE", "loc" : [ -86.65382099999999, 34.684525 ], "pop" : 4988, "state" : "AL" } +{ "_id" : "35810", "city" : "HUNTSVILLE", "loc" : [ -86.60906300000001, 34.778378 ], "pop" : 32896, "state" : "AL" } +{ "_id" : "35811", "city" : "HUNTSVILLE", "loc" : [ -86.543786, 34.778949 ], "pop" : 19008, "state" : "AL" } +{ "_id" : "35816", "city" : "HUNTSVILLE", "loc" : [ -86.624948, 34.738864 ], "pop" : 13736, "state" : "AL" } +{ "_id" : "35824", "city" : "HUNTSVILLE", "loc" : [ -86.72948599999999, 34.658321 ], "pop" : 770, "state" : "AL" } +{ "_id" : "35901", "city" : "SOUTHSIDE", "loc" : [ -86.010279, 33.997248 ], "pop" : 44165, "state" : "AL" } +{ "_id" : "35903", "city" : "HOKES BLUFF", "loc" : [ -85.928724, 33.997057 ], "pop" : 20057, "state" : "AL" } +{ "_id" : "35904", "city" : "GADSDEN", "loc" : [ -86.04947900000001, 34.021694 ], "pop" : 7002, "state" : "AL" } +{ "_id" : "35905", "city" : "GLENCOE", "loc" : [ -85.92758600000001, 33.956787 ], "pop" : 4256, "state" : "AL" } +{ "_id" : "35950", "city" : "ALBERTVILLE", "loc" : [ -86.206447, 34.273859 ], "pop" : 21033, "state" : "AL" } +{ "_id" : "35952", "city" : "SNEAD", "loc" : [ -86.35087900000001, 34.042916 ], "pop" : 9472, "state" : "AL" } +{ "_id" : "35953", "city" : "ASHVILLE", "loc" : [ -86.255167, 33.837366 ], "pop" : 5988, "state" : "AL" } +{ "_id" : "35954", "city" : "ATTALLA", "loc" : [ -86.096717, 34.029597 ], "pop" : 11904, "state" : "AL" } +{ "_id" : "35957", "city" : "BOAZ", "loc" : [ -86.148003, 34.173686 ], "pop" : 16955, "state" : "AL" } +{ "_id" : "35958", "city" : "BRYANT", "loc" : [ -85.632445, 34.945026 ], "pop" : 1700, "state" : "AL" } +{ "_id" : "35959", "city" : "CEDAR BLUFF", "loc" : [ -85.60256699999999, 34.241662 ], "pop" : 3574, "state" : "AL" } +{ "_id" : "35960", "city" : "CENTRE", "loc" : [ -85.609229, 34.111592 ], "pop" : 10294, "state" : "AL" } +{ "_id" : "35961", "city" : "COLLINSVILLE", "loc" : [ -85.861969, 34.267957 ], "pop" : 3245, "state" : "AL" } +{ "_id" : "35962", "city" : "CROSSVILLE", "loc" : [ -86.030575, 34.258784 ], "pop" : 4874, "state" : "AL" } +{ "_id" : "35963", "city" : "DAWSON", "loc" : [ -85.92916099999999, 34.356838 ], "pop" : 1531, "state" : "AL" } +{ "_id" : "35966", "city" : "FLAT ROCK", "loc" : [ -85.708372, 34.807598 ], "pop" : 2141, "state" : "AL" } +{ "_id" : "35967", "city" : "FORT PAYNE", "loc" : [ -85.712394, 34.436792 ], "pop" : 15893, "state" : "AL" } +{ "_id" : "35971", "city" : "FYFFE", "loc" : [ -85.928849, 34.437284 ], "pop" : 3453, "state" : "AL" } +{ "_id" : "35972", "city" : "GALLANT", "loc" : [ -86.234606, 33.997586 ], "pop" : 337, "state" : "AL" } +{ "_id" : "35973", "city" : "GAYLESVILLE", "loc" : [ -85.558893, 34.357324 ], "pop" : 2291, "state" : "AL" } +{ "_id" : "35974", "city" : "GERALDINE", "loc" : [ -86.04039299999999, 34.343864 ], "pop" : 3291, "state" : "AL" } +{ "_id" : "35975", "city" : "GROVEOAK", "loc" : [ -86.04002300000001, 34.435874 ], "pop" : 1098, "state" : "AL" } +{ "_id" : "35976", "city" : "GUNTERSVILLE", "loc" : [ -86.305463, 34.32193 ], "pop" : 11234, "state" : "AL" } +{ "_id" : "35978", "city" : "HENAGAR", "loc" : [ -85.72738099999999, 34.618604 ], "pop" : 2973, "state" : "AL" } +{ "_id" : "35979", "city" : "HIGDON", "loc" : [ -85.622507, 34.873247 ], "pop" : 1324, "state" : "AL" } +{ "_id" : "35980", "city" : "HORTON", "loc" : [ -86.317318, 34.190033 ], "pop" : 4195, "state" : "AL" } +{ "_id" : "35981", "city" : "IDER", "loc" : [ -85.641577, 34.735059 ], "pop" : 5161, "state" : "AL" } +{ "_id" : "35983", "city" : "LEESBURG", "loc" : [ -85.77051, 34.191083 ], "pop" : 3189, "state" : "AL" } +{ "_id" : "35984", "city" : "MENTONE", "loc" : [ -85.57772799999999, 34.587236 ], "pop" : 2099, "state" : "AL" } +{ "_id" : "35986", "city" : "RAINSVILLE", "loc" : [ -85.844605, 34.498884 ], "pop" : 7498, "state" : "AL" } +{ "_id" : "35987", "city" : "STEELE", "loc" : [ -86.22892899999999, 33.941679 ], "pop" : 1830, "state" : "AL" } +{ "_id" : "35988", "city" : "SYLVANIA", "loc" : [ -85.79212800000001, 34.558962 ], "pop" : 2318, "state" : "AL" } +{ "_id" : "35989", "city" : "VALLEY HEAD", "loc" : [ -85.627208, 34.5697 ], "pop" : 1211, "state" : "AL" } +{ "_id" : "36003", "city" : "AUTAUGAVILLE", "loc" : [ -86.714938, 32.462462 ], "pop" : 2641, "state" : "AL" } +{ "_id" : "36004", "city" : "EUFAULA", "loc" : [ -85.23965699999999, 31.786701 ], "pop" : 2669, "state" : "AL" } +{ "_id" : "36005", "city" : "BANKS", "loc" : [ -85.79984399999999, 31.836792 ], "pop" : 1857, "state" : "AL" } +{ "_id" : "36006", "city" : "BILLINGSLEY", "loc" : [ -86.716301, 32.610578 ], "pop" : 1869, "state" : "AL" } +{ "_id" : "36009", "city" : "BRANTLEY", "loc" : [ -86.274343, 31.570963 ], "pop" : 2623, "state" : "AL" } +{ "_id" : "36010", "city" : "BRUNDIDGE", "loc" : [ -85.817668, 31.701324 ], "pop" : 4320, "state" : "AL" } +{ "_id" : "36013", "city" : "CECIL", "loc" : [ -86.011241, 32.300891 ], "pop" : 407, "state" : "AL" } +{ "_id" : "36016", "city" : "CLAYTON", "loc" : [ -85.45093199999999, 31.887413 ], "pop" : 3106, "state" : "AL" } +{ "_id" : "36017", "city" : "CLIO", "loc" : [ -85.590419, 31.68521 ], "pop" : 3178, "state" : "AL" } +{ "_id" : "36022", "city" : "DEATSVILLE", "loc" : [ -86.338211, 32.613405 ], "pop" : 5913, "state" : "AL" } +{ "_id" : "36024", "city" : "ECLECTIC", "loc" : [ -86.031614, 32.65419 ], "pop" : 6105, "state" : "AL" } +{ "_id" : "36025", "city" : "ELMORE", "loc" : [ -86.31613400000001, 32.545378 ], "pop" : 3114, "state" : "AL" } +{ "_id" : "36026", "city" : "EQUALITY", "loc" : [ -86.105064, 32.813908 ], "pop" : 1121, "state" : "AL" } +{ "_id" : "36027", "city" : "EUFAULA", "loc" : [ -85.165605, 31.905063 ], "pop" : 14189, "state" : "AL" } +{ "_id" : "36028", "city" : "DOZIER", "loc" : [ -86.366315, 31.506614 ], "pop" : 741, "state" : "AL" } +{ "_id" : "36029", "city" : "FITZPATRICK", "loc" : [ -85.888329, 32.151607 ], "pop" : 736, "state" : "AL" } +{ "_id" : "36030", "city" : "FOREST HOME", "loc" : [ -86.786377, 31.85318 ], "pop" : 1528, "state" : "AL" } +{ "_id" : "36031", "city" : "FORT DAVIS", "loc" : [ -85.700688, 32.28945 ], "pop" : 891, "state" : "AL" } +{ "_id" : "36032", "city" : "FORT DEPOSIT", "loc" : [ -86.576142, 31.995979 ], "pop" : 2435, "state" : "AL" } +{ "_id" : "36033", "city" : "GEORGIANA", "loc" : [ -86.733965, 31.628662 ], "pop" : 3672, "state" : "AL" } +{ "_id" : "36034", "city" : "GLENWOOD", "loc" : [ -86.17097200000001, 31.664143 ], "pop" : 109, "state" : "AL" } +{ "_id" : "36035", "city" : "GOSHEN", "loc" : [ -86.104851, 31.82497 ], "pop" : 2056, "state" : "AL" } +{ "_id" : "36036", "city" : "GRADY", "loc" : [ -86.12924599999999, 32.019397 ], "pop" : 1811, "state" : "AL" } +{ "_id" : "36037", "city" : "GREENVILLE", "loc" : [ -86.622919, 31.810036 ], "pop" : 15476, "state" : "AL" } +{ "_id" : "36038", "city" : "GANTT", "loc" : [ -86.419836, 31.416909 ], "pop" : 3298, "state" : "AL" } +{ "_id" : "36039", "city" : "HARDAWAY", "loc" : [ -85.883837, 32.312939 ], "pop" : 354, "state" : "AL" } +{ "_id" : "36040", "city" : "HAYNEVILLE", "loc" : [ -86.654994, 32.195707 ], "pop" : 5010, "state" : "AL" } +{ "_id" : "36041", "city" : "HIGHLAND HOME", "loc" : [ -86.297111, 31.928292 ], "pop" : 3068, "state" : "AL" } +{ "_id" : "36042", "city" : "HONORAVILLE", "loc" : [ -86.39806400000001, 31.878397 ], "pop" : 838, "state" : "AL" } +{ "_id" : "36043", "city" : "HOPE HULL", "loc" : [ -86.39318900000001, 32.224256 ], "pop" : 2961, "state" : "AL" } +{ "_id" : "36046", "city" : "LAPINE", "loc" : [ -86.27853399999999, 31.985423 ], "pop" : 338, "state" : "AL" } +{ "_id" : "36047", "city" : "LETOHATCHEE", "loc" : [ -86.488013, 32.086199 ], "pop" : 2348, "state" : "AL" } +{ "_id" : "36048", "city" : "LOUISVILLE", "loc" : [ -85.55806200000001, 31.794262 ], "pop" : 2279, "state" : "AL" } +{ "_id" : "36049", "city" : "LUVERNE", "loc" : [ -86.256601, 31.70739 ], "pop" : 4274, "state" : "AL" } +{ "_id" : "36051", "city" : "MARBURY", "loc" : [ -86.510138, 32.639373 ], "pop" : 3573, "state" : "AL" } +{ "_id" : "36052", "city" : "MATHEWS", "loc" : [ -86.041262, 32.128288 ], "pop" : 836, "state" : "AL" } +{ "_id" : "36053", "city" : "MIDWAY", "loc" : [ -85.53152300000001, 32.09552 ], "pop" : 1873, "state" : "AL" } +{ "_id" : "36054", "city" : "MILLBROOK", "loc" : [ -86.364125, 32.499485 ], "pop" : 9049, "state" : "AL" } +{ "_id" : "36061", "city" : "PEROTE", "loc" : [ -85.74773, 32.003459 ], "pop" : 1792, "state" : "AL" } +{ "_id" : "36064", "city" : "PIKE ROAD", "loc" : [ -86.09589, 32.335705 ], "pop" : 3398, "state" : "AL" } +{ "_id" : "36066", "city" : "PRATTVILLE", "loc" : [ -86.42997, 32.478695 ], "pop" : 11059, "state" : "AL" } +{ "_id" : "36067", "city" : "PRATTVILLE", "loc" : [ -86.48307200000001, 32.471501 ], "pop" : 16536, "state" : "AL" } +{ "_id" : "36069", "city" : "RAMER", "loc" : [ -86.246329, 32.067745 ], "pop" : 1712, "state" : "AL" } +{ "_id" : "36071", "city" : "RUTLEDGE", "loc" : [ -86.34846400000001, 31.755867 ], "pop" : 1976, "state" : "AL" } +{ "_id" : "36075", "city" : "SHORTER", "loc" : [ -85.91616, 32.383585 ], "pop" : 1876, "state" : "AL" } +{ "_id" : "36078", "city" : "TALLASSEE", "loc" : [ -85.89781000000001, 32.550997 ], "pop" : 12046, "state" : "AL" } +{ "_id" : "36080", "city" : "TITUS", "loc" : [ -86.239334, 32.690019 ], "pop" : 2683, "state" : "AL" } +{ "_id" : "36081", "city" : "TROY", "loc" : [ -85.965493, 31.794471 ], "pop" : 19358, "state" : "AL" } +{ "_id" : "36083", "city" : "TUSKEGEE", "loc" : [ -85.68606, 32.431623 ], "pop" : 10687, "state" : "AL" } +{ "_id" : "36088", "city" : "TUSKEGEE INSTITU", "loc" : [ -85.714848, 32.417699 ], "pop" : 6915, "state" : "AL" } +{ "_id" : "36089", "city" : "UNION SPRINGS", "loc" : [ -85.678746, 32.166252 ], "pop" : 7555, "state" : "AL" } +{ "_id" : "36091", "city" : "VERBENA", "loc" : [ -86.543753, 32.759565 ], "pop" : 3702, "state" : "AL" } +{ "_id" : "36092", "city" : "WETUMPKA", "loc" : [ -86.188039, 32.54509 ], "pop" : 13725, "state" : "AL" } +{ "_id" : "36104", "city" : "MONTGOMERY", "loc" : [ -86.30812899999999, 32.373037 ], "pop" : 17086, "state" : "AL" } +{ "_id" : "36105", "city" : "MONTGOMERY", "loc" : [ -86.31044900000001, 32.32573 ], "pop" : 16486, "state" : "AL" } +{ "_id" : "36106", "city" : "MONTGOMERY", "loc" : [ -86.267278, 32.354268 ], "pop" : 15744, "state" : "AL" } +{ "_id" : "36107", "city" : "MONTGOMERY", "loc" : [ -86.27988499999999, 32.380405 ], "pop" : 10345, "state" : "AL" } +{ "_id" : "36108", "city" : "MONTGOMERY", "loc" : [ -86.352904, 32.341682 ], "pop" : 30780, "state" : "AL" } +{ "_id" : "36109", "city" : "MONTGOMERY", "loc" : [ -86.243394, 32.383443 ], "pop" : 25282, "state" : "AL" } +{ "_id" : "36110", "city" : "MONTGOMERY", "loc" : [ -86.274997, 32.421686 ], "pop" : 12551, "state" : "AL" } +{ "_id" : "36111", "city" : "MONTGOMERY", "loc" : [ -86.27154299999999, 32.337363 ], "pop" : 11600, "state" : "AL" } +{ "_id" : "36113", "city" : "MAXWELL A F B", "loc" : [ -86.35584799999999, 32.388133 ], "pop" : 2788, "state" : "AL" } +{ "_id" : "36115", "city" : "GUNTER AFS", "loc" : [ -86.247327, 32.406814 ], "pop" : 1348, "state" : "AL" } +{ "_id" : "36116", "city" : "MONTGOMERY", "loc" : [ -86.24205600000001, 32.312943 ], "pop" : 32314, "state" : "AL" } +{ "_id" : "36117", "city" : "MONTGOMERY", "loc" : [ -86.18329900000001, 32.373568 ], "pop" : 21623, "state" : "AL" } +{ "_id" : "36201", "city" : "ANNISTON", "loc" : [ -85.83815199999999, 33.653896 ], "pop" : 38370, "state" : "AL" } +{ "_id" : "36203", "city" : "OXFORD", "loc" : [ -85.83347000000001, 33.596829 ], "pop" : 12407, "state" : "AL" } +{ "_id" : "36205", "city" : "FORT MC CLELLAN", "loc" : [ -85.801467, 33.710168 ], "pop" : 4128, "state" : "AL" } +{ "_id" : "36206", "city" : "ANNISTON", "loc" : [ -85.838904, 33.719124 ], "pop" : 10915, "state" : "AL" } +{ "_id" : "36250", "city" : "ALEXANDRIA", "loc" : [ -85.892447, 33.780785 ], "pop" : 5776, "state" : "AL" } +{ "_id" : "36251", "city" : "ASHLAND", "loc" : [ -85.828976, 33.247363 ], "pop" : 4518, "state" : "AL" } +{ "_id" : "36255", "city" : "CRAGFORD", "loc" : [ -85.710797, 33.217148 ], "pop" : 796, "state" : "AL" } +{ "_id" : "36256", "city" : "DAVISTON", "loc" : [ -85.75383100000001, 33.033471 ], "pop" : 2334, "state" : "AL" } +{ "_id" : "36258", "city" : "DELTA", "loc" : [ -85.67927899999999, 33.457303 ], "pop" : 1405, "state" : "AL" } +{ "_id" : "36260", "city" : "EASTABOGA", "loc" : [ -85.96075, 33.603132 ], "pop" : 3999, "state" : "AL" } +{ "_id" : "36262", "city" : "FRUITHURST", "loc" : [ -85.43814, 33.771732 ], "pop" : 1473, "state" : "AL" } +{ "_id" : "36263", "city" : "GRAHAM", "loc" : [ -85.334034, 33.462976 ], "pop" : 374, "state" : "AL" } +{ "_id" : "36264", "city" : "HEFLIN", "loc" : [ -85.588471, 33.611515 ], "pop" : 6577, "state" : "AL" } +{ "_id" : "36265", "city" : "JACKSONVILLE", "loc" : [ -85.77518000000001, 33.830966 ], "pop" : 16438, "state" : "AL" } +{ "_id" : "36266", "city" : "LINEVILLE", "loc" : [ -85.73460900000001, 33.328613 ], "pop" : 4345, "state" : "AL" } +{ "_id" : "36267", "city" : "MILLERVILLE", "loc" : [ -85.96900100000001, 33.158959 ], "pop" : 863, "state" : "AL" } +{ "_id" : "36268", "city" : "MUNFORD", "loc" : [ -85.936322, 33.540987 ], "pop" : 4998, "state" : "AL" } +{ "_id" : "36269", "city" : "MUSCADINE", "loc" : [ -85.378907, 33.752913 ], "pop" : 265, "state" : "AL" } +{ "_id" : "36270", "city" : "NEWELL", "loc" : [ -85.505925, 33.440172 ], "pop" : 2407, "state" : "AL" } +{ "_id" : "36271", "city" : "OHATCHEE", "loc" : [ -86.025357, 33.778779 ], "pop" : 3369, "state" : "AL" } +{ "_id" : "36272", "city" : "PIEDMONT", "loc" : [ -85.64599699999999, 33.838946 ], "pop" : 12921, "state" : "AL" } +{ "_id" : "36273", "city" : "RANBURNE", "loc" : [ -85.378604, 33.561627 ], "pop" : 3696, "state" : "AL" } +{ "_id" : "36274", "city" : "ROCK MILLS", "loc" : [ -85.357854, 33.156443 ], "pop" : 9430, "state" : "AL" } +{ "_id" : "36276", "city" : "WADLEY", "loc" : [ -85.551344, 33.149192 ], "pop" : 1949, "state" : "AL" } +{ "_id" : "36277", "city" : "WEAVER", "loc" : [ -85.810666, 33.756286 ], "pop" : 7453, "state" : "AL" } +{ "_id" : "36278", "city" : "WEDOWEE", "loc" : [ -85.473737, 33.301854 ], "pop" : 3101, "state" : "AL" } +{ "_id" : "36279", "city" : "WELLINGTON", "loc" : [ -85.915325, 33.863843 ], "pop" : 2137, "state" : "AL" } +{ "_id" : "36280", "city" : "WOODLAND", "loc" : [ -85.353768, 33.355453 ], "pop" : 2291, "state" : "AL" } +{ "_id" : "36301", "city" : "TAYLOR", "loc" : [ -85.418036, 31.202888 ], "pop" : 32689, "state" : "AL" } +{ "_id" : "36303", "city" : "NAPIER FIELD", "loc" : [ -85.412462, 31.255239 ], "pop" : 32407, "state" : "AL" } +{ "_id" : "36310", "city" : "ABBEVILLE", "loc" : [ -85.279044, 31.575479 ], "pop" : 5416, "state" : "AL" } +{ "_id" : "36311", "city" : "ARITON", "loc" : [ -85.707716, 31.582996 ], "pop" : 1434, "state" : "AL" } +{ "_id" : "36312", "city" : "ASHFORD", "loc" : [ -85.253488, 31.1888 ], "pop" : 5115, "state" : "AL" } +{ "_id" : "36314", "city" : "BLACK", "loc" : [ -85.745634, 31.01318 ], "pop" : 183, "state" : "AL" } +{ "_id" : "36316", "city" : "CHANCELLOR", "loc" : [ -85.91089700000001, 31.173379 ], "pop" : 620, "state" : "AL" } +{ "_id" : "36317", "city" : "CLOPTON", "loc" : [ -85.482308, 31.602843 ], "pop" : 157, "state" : "AL" } +{ "_id" : "36318", "city" : "COFFEE SPRINGS", "loc" : [ -85.918224, 31.138758 ], "pop" : 750, "state" : "AL" } +{ "_id" : "36319", "city" : "COLUMBIA", "loc" : [ -85.145488, 31.335235 ], "pop" : 2934, "state" : "AL" } +{ "_id" : "36320", "city" : "COTTONWOOD", "loc" : [ -85.375665, 31.098934 ], "pop" : 8517, "state" : "AL" } +{ "_id" : "36322", "city" : "DALEVILLE", "loc" : [ -85.730473, 31.281091 ], "pop" : 8885, "state" : "AL" } +{ "_id" : "36323", "city" : "ELBA", "loc" : [ -86.07772799999999, 31.41373 ], "pop" : 6662, "state" : "AL" } +{ "_id" : "36330", "city" : "ENTERPRISE", "loc" : [ -85.842111, 31.340789 ], "pop" : 29102, "state" : "AL" } +{ "_id" : "36340", "city" : "GENEVA", "loc" : [ -85.884748, 31.041445 ], "pop" : 5471, "state" : "AL" } +{ "_id" : "36343", "city" : "GORDON", "loc" : [ -85.123412, 31.10019 ], "pop" : 2017, "state" : "AL" } +{ "_id" : "36344", "city" : "HARTFORD", "loc" : [ -85.719204, 31.08598 ], "pop" : 4819, "state" : "AL" } +{ "_id" : "36345", "city" : "HEADLAND", "loc" : [ -85.332277, 31.353406 ], "pop" : 4595, "state" : "AL" } +{ "_id" : "36346", "city" : "JACK", "loc" : [ -86.043083, 31.552392 ], "pop" : 1517, "state" : "AL" } +{ "_id" : "36349", "city" : "MALVERN", "loc" : [ -85.522327, 31.157528 ], "pop" : 1686, "state" : "AL" } +{ "_id" : "36350", "city" : "MIDLAND CITY", "loc" : [ -85.51303299999999, 31.36716 ], "pop" : 4854, "state" : "AL" } +{ "_id" : "36351", "city" : "NEW BROCKTON", "loc" : [ -85.940386, 31.36898 ], "pop" : 1809, "state" : "AL" } +{ "_id" : "36352", "city" : "NEWTON", "loc" : [ -85.59922899999999, 31.331064 ], "pop" : 1660, "state" : "AL" } +{ "_id" : "36353", "city" : "NEWVILLE", "loc" : [ -85.32874099999999, 31.440295 ], "pop" : 1525, "state" : "AL" } +{ "_id" : "36360", "city" : "OZARK", "loc" : [ -85.643629, 31.439069 ], "pop" : 19017, "state" : "AL" } +{ "_id" : "36362", "city" : "FORT RUCKER", "loc" : [ -85.721374, 31.348011 ], "pop" : 7607, "state" : "AL" } +{ "_id" : "36370", "city" : "PANSEY", "loc" : [ -85.23854900000001, 31.131778 ], "pop" : 595, "state" : "AL" } +{ "_id" : "36373", "city" : "SHORTERVILLE", "loc" : [ -85.14584000000001, 31.625627 ], "pop" : 2503, "state" : "AL" } +{ "_id" : "36374", "city" : "SKIPPERVILLE", "loc" : [ -85.549578, 31.551588 ], "pop" : 1048, "state" : "AL" } +{ "_id" : "36375", "city" : "SLOCOMB", "loc" : [ -85.582954, 31.095558 ], "pop" : 4504, "state" : "AL" } +{ "_id" : "36376", "city" : "WEBB", "loc" : [ -85.254385, 31.265618 ], "pop" : 1810, "state" : "AL" } +{ "_id" : "36401", "city" : "EVERGREEN", "loc" : [ -86.925771, 31.458009 ], "pop" : 8556, "state" : "AL" } +{ "_id" : "36419", "city" : "ALLEN", "loc" : [ -87.66746000000001, 31.624266 ], "pop" : 0, "state" : "AL" } +{ "_id" : "36420", "city" : "ANDALUSIA", "loc" : [ -86.49046800000001, 31.297142 ], "pop" : 16920, "state" : "AL" } +{ "_id" : "36425", "city" : "BEATRICE", "loc" : [ -87.17191200000001, 31.727324 ], "pop" : 1620, "state" : "AL" } +{ "_id" : "36426", "city" : "EAST BREWTON", "loc" : [ -87.067325, 31.118926 ], "pop" : 15479, "state" : "AL" } +{ "_id" : "36432", "city" : "CASTLEBERRY", "loc" : [ -87.026754, 31.326113 ], "pop" : 2881, "state" : "AL" } +{ "_id" : "36435", "city" : "COY", "loc" : [ -87.39255799999999, 31.888851 ], "pop" : 1109, "state" : "AL" } +{ "_id" : "36436", "city" : "DICKINSON", "loc" : [ -87.65692900000001, 31.717167 ], "pop" : 272, "state" : "AL" } +{ "_id" : "36441", "city" : "FLOMATON", "loc" : [ -87.26636499999999, 31.040233 ], "pop" : 3585, "state" : "AL" } +{ "_id" : "36442", "city" : "FLORALA", "loc" : [ -86.338528, 31.017194 ], "pop" : 3421, "state" : "AL" } +{ "_id" : "36444", "city" : "FRANKLIN", "loc" : [ -87.441237, 31.723815 ], "pop" : 154, "state" : "AL" } +{ "_id" : "36445", "city" : "FRISCO CITY", "loc" : [ -87.381744, 31.423478 ], "pop" : 6179, "state" : "AL" } +{ "_id" : "36446", "city" : "FULTON", "loc" : [ -87.708065, 31.790947 ], "pop" : 2163, "state" : "AL" } +{ "_id" : "36451", "city" : "GROVE HILL", "loc" : [ -87.763571, 31.675502 ], "pop" : 4089, "state" : "AL" } +{ "_id" : "36453", "city" : "KINSTON", "loc" : [ -86.069532, 31.262118 ], "pop" : 3523, "state" : "AL" } +{ "_id" : "36454", "city" : "LENOX", "loc" : [ -87.19671, 31.327261 ], "pop" : 515, "state" : "AL" } +{ "_id" : "36456", "city" : "MC KENZIE", "loc" : [ -86.735615, 31.54495 ], "pop" : 1222, "state" : "AL" } +{ "_id" : "36460", "city" : "MONROEVILLE", "loc" : [ -87.340993, 31.51533 ], "pop" : 10492, "state" : "AL" } +{ "_id" : "36467", "city" : "OPP", "loc" : [ -86.257105, 31.279861 ], "pop" : 9901, "state" : "AL" } +{ "_id" : "36471", "city" : "PETERMAN", "loc" : [ -87.259984, 31.589953 ], "pop" : 1826, "state" : "AL" } +{ "_id" : "36473", "city" : "RANGE", "loc" : [ -87.319739, 31.30169 ], "pop" : 208, "state" : "AL" } +{ "_id" : "36474", "city" : "RED LEVEL", "loc" : [ -86.61208999999999, 31.439931 ], "pop" : 2005, "state" : "AL" } +{ "_id" : "36475", "city" : "REPTON", "loc" : [ -87.172039, 31.425569 ], "pop" : 1750, "state" : "AL" } +{ "_id" : "36477", "city" : "SAMSON", "loc" : [ -86.06741599999999, 31.104918 ], "pop" : 4790, "state" : "AL" } +{ "_id" : "36480", "city" : "URIAH", "loc" : [ -87.57051800000001, 31.313467 ], "pop" : 1648, "state" : "AL" } +{ "_id" : "36481", "city" : "VREDENBURGH", "loc" : [ -87.416184, 31.73443 ], "pop" : 2040, "state" : "AL" } +{ "_id" : "36482", "city" : "WHATLEY", "loc" : [ -87.656502, 31.639453 ], "pop" : 790, "state" : "AL" } +{ "_id" : "36483", "city" : "WING", "loc" : [ -86.56119, 31.148127 ], "pop" : 1583, "state" : "AL" } +{ "_id" : "36502", "city" : "ATMORE", "loc" : [ -87.487347, 31.057245 ], "pop" : 15948, "state" : "AL" } +{ "_id" : "36505", "city" : "AXIS", "loc" : [ -88.04273999999999, 31.006817 ], "pop" : 140, "state" : "AL" } +{ "_id" : "36507", "city" : "BAY MINETTE", "loc" : [ -87.76443999999999, 30.86354 ], "pop" : 17816, "state" : "AL" } +{ "_id" : "36509", "city" : "BAYOU LA BATRE", "loc" : [ -88.250697, 30.407983 ], "pop" : 4901, "state" : "AL" } +{ "_id" : "36510", "city" : "BIGBEE", "loc" : [ -88.165294, 31.589072 ], "pop" : 264, "state" : "AL" } +{ "_id" : "36511", "city" : "BON SECOUR", "loc" : [ -87.721355, 30.328883 ], "pop" : 2001, "state" : "AL" } +{ "_id" : "36515", "city" : "CARLTON", "loc" : [ -87.837793, 31.322449 ], "pop" : 30, "state" : "AL" } +{ "_id" : "36518", "city" : "CHATOM", "loc" : [ -88.269887, 31.487638 ], "pop" : 3094, "state" : "AL" } +{ "_id" : "36521", "city" : "CHUNCHULA", "loc" : [ -88.13112599999999, 30.991178 ], "pop" : 1322, "state" : "AL" } +{ "_id" : "36522", "city" : "CITRONELLE", "loc" : [ -88.254949, 31.042533 ], "pop" : 7233, "state" : "AL" } +{ "_id" : "36523", "city" : "CODEN", "loc" : [ -88.16827600000001, 30.418834 ], "pop" : 3897, "state" : "AL" } +{ "_id" : "36524", "city" : "COFFEEVILLE", "loc" : [ -88.07154199999999, 31.78428 ], "pop" : 1374, "state" : "AL" } +{ "_id" : "36525", "city" : "CREOLA", "loc" : [ -88.017414, 30.901267 ], "pop" : 2569, "state" : "AL" } +{ "_id" : "36526", "city" : "DAPHNE", "loc" : [ -87.889522, 30.61972 ], "pop" : 14607, "state" : "AL" } +{ "_id" : "36527", "city" : "SPANISH FORT", "loc" : [ -87.88668, 30.695852 ], "pop" : 5486, "state" : "AL" } +{ "_id" : "36528", "city" : "DAUPHIN ISLAND", "loc" : [ -88.109644, 30.252057 ], "pop" : 824, "state" : "AL" } +{ "_id" : "36529", "city" : "DEER PARK", "loc" : [ -88.32731, 31.184892 ], "pop" : 723, "state" : "AL" } +{ "_id" : "36530", "city" : "ELBERTA", "loc" : [ -87.58896, 30.394239 ], "pop" : 2551, "state" : "AL" } +{ "_id" : "36532", "city" : "FAIRHOPE", "loc" : [ -87.883546, 30.50116 ], "pop" : 16331, "state" : "AL" } +{ "_id" : "36535", "city" : "FOLEY", "loc" : [ -87.685737, 30.400664 ], "pop" : 8520, "state" : "AL" } +{ "_id" : "36538", "city" : "FRANKVILLE", "loc" : [ -88.133185, 31.64684 ], "pop" : 472, "state" : "AL" } +{ "_id" : "36539", "city" : "FRUITDALE", "loc" : [ -88.376597, 31.348843 ], "pop" : 848, "state" : "AL" } +{ "_id" : "36540", "city" : "GAINESTOWN", "loc" : [ -87.682176, 31.425822 ], "pop" : 301, "state" : "AL" } +{ "_id" : "36541", "city" : "GRAND BAY", "loc" : [ -88.32825, 30.498288 ], "pop" : 10344, "state" : "AL" } +{ "_id" : "36542", "city" : "FORT MORGAN", "loc" : [ -87.712795, 30.268954 ], "pop" : 4930, "state" : "AL" } +{ "_id" : "36544", "city" : "IRVINGTON", "loc" : [ -88.239563, 30.480241 ], "pop" : 6181, "state" : "AL" } +{ "_id" : "36545", "city" : "JACKSON", "loc" : [ -87.867192, 31.513098 ], "pop" : 9679, "state" : "AL" } +{ "_id" : "36548", "city" : "LEROY", "loc" : [ -87.968672, 31.491021 ], "pop" : 1086, "state" : "AL" } +{ "_id" : "36549", "city" : "LILLIAN", "loc" : [ -87.474452, 30.39724 ], "pop" : 3833, "state" : "AL" } +{ "_id" : "36550", "city" : "LITTLE RIVER", "loc" : [ -87.754796, 31.22459 ], "pop" : 649, "state" : "AL" } +{ "_id" : "36551", "city" : "LOXLEY", "loc" : [ -87.75624000000001, 30.617964 ], "pop" : 2712, "state" : "AL" } +{ "_id" : "36553", "city" : "MC INTOSH", "loc" : [ -88.051102, 31.236108 ], "pop" : 4211, "state" : "AL" } +{ "_id" : "36555", "city" : "MAGNOLIA SPRINGS", "loc" : [ -87.785781, 30.394497 ], "pop" : 1088, "state" : "AL" } +{ "_id" : "36558", "city" : "MILLRY", "loc" : [ -88.35587200000001, 31.626871 ], "pop" : 2825, "state" : "AL" } +{ "_id" : "36560", "city" : "MOUNT VERNON", "loc" : [ -88.035044, 31.097375 ], "pop" : 5053, "state" : "AL" } +{ "_id" : "36561", "city" : "ORANGE BEACH", "loc" : [ -87.555888, 30.290596 ], "pop" : 2549, "state" : "AL" } +{ "_id" : "36562", "city" : "PERDIDO", "loc" : [ -87.62837399999999, 30.98058 ], "pop" : 986, "state" : "AL" } +{ "_id" : "36567", "city" : "ROBERTSDALE", "loc" : [ -87.63726800000001, 30.561608 ], "pop" : 3519, "state" : "AL" } +{ "_id" : "36569", "city" : "SAINT STEPHENS", "loc" : [ -88.052094, 31.533028 ], "pop" : 688, "state" : "AL" } +{ "_id" : "36570", "city" : "SALITPA", "loc" : [ -87.95961800000001, 31.654667 ], "pop" : 896, "state" : "AL" } +{ "_id" : "36571", "city" : "SARALAND", "loc" : [ -88.09338700000001, 30.833197 ], "pop" : 13151, "state" : "AL" } +{ "_id" : "36572", "city" : "SATSUMA", "loc" : [ -88.05331200000001, 30.851628 ], "pop" : 6197, "state" : "AL" } +{ "_id" : "36574", "city" : "SEMINOLE", "loc" : [ -87.46593799999999, 30.504806 ], "pop" : 606, "state" : "AL" } +{ "_id" : "36575", "city" : "SEMMES", "loc" : [ -88.266705, 30.754408 ], "pop" : 9329, "state" : "AL" } +{ "_id" : "36576", "city" : "SILVERHILL", "loc" : [ -87.745676, 30.522237 ], "pop" : 8001, "state" : "AL" } +{ "_id" : "36579", "city" : "STOCKTON", "loc" : [ -87.86332299999999, 31.01293 ], "pop" : 1214, "state" : "AL" } +{ "_id" : "36580", "city" : "SUMMERDALE", "loc" : [ -87.699183, 30.475225 ], "pop" : 881, "state" : "AL" } +{ "_id" : "36582", "city" : "THEODORE", "loc" : [ -88.18074799999999, 30.544374 ], "pop" : 20185, "state" : "AL" } +{ "_id" : "36583", "city" : "TIBBIE", "loc" : [ -88.266828, 31.373742 ], "pop" : 327, "state" : "AL" } +{ "_id" : "36584", "city" : "VINEGAR BEND", "loc" : [ -88.386466, 31.25841 ], "pop" : 475, "state" : "AL" } +{ "_id" : "36585", "city" : "WAGARVILLE", "loc" : [ -88.070519, 31.410205 ], "pop" : 1681, "state" : "AL" } +{ "_id" : "36586", "city" : "WALKER SPRINGS", "loc" : [ -87.83535500000001, 31.626166 ], "pop" : 1001, "state" : "AL" } +{ "_id" : "36587", "city" : "WILMER", "loc" : [ -88.333196, 30.813745 ], "pop" : 5905, "state" : "AL" } +{ "_id" : "36602", "city" : "MOBILE", "loc" : [ -88.04530800000001, 30.688828 ], "pop" : 1263, "state" : "AL" } +{ "_id" : "36603", "city" : "MOBILE", "loc" : [ -88.05622, 30.692141 ], "pop" : 12162, "state" : "AL" } +{ "_id" : "36604", "city" : "MOBILE", "loc" : [ -88.067804, 30.681963 ], "pop" : 11498, "state" : "AL" } +{ "_id" : "36605", "city" : "MOBILE", "loc" : [ -88.08464600000001, 30.634117 ], "pop" : 31621, "state" : "AL" } +{ "_id" : "36606", "city" : "MOBILE", "loc" : [ -88.100909, 30.672899 ], "pop" : 18247, "state" : "AL" } +{ "_id" : "36607", "city" : "MOBILE", "loc" : [ -88.10290000000001, 30.697486 ], "pop" : 8610, "state" : "AL" } +{ "_id" : "36608", "city" : "MOBILE", "loc" : [ -88.18778399999999, 30.69636 ], "pop" : 37600, "state" : "AL" } +{ "_id" : "36609", "city" : "MOBILE", "loc" : [ -88.161806, 30.660527 ], "pop" : 23687, "state" : "AL" } +{ "_id" : "36610", "city" : "PRICHARD", "loc" : [ -88.083761, 30.737846 ], "pop" : 24919, "state" : "AL" } +{ "_id" : "36611", "city" : "CHICKASAW", "loc" : [ -88.08497300000001, 30.766821 ], "pop" : 6660, "state" : "AL" } +{ "_id" : "36612", "city" : "MOBILE", "loc" : [ -88.11311000000001, 30.751844 ], "pop" : 6096, "state" : "AL" } +{ "_id" : "36613", "city" : "EIGHT MILE", "loc" : [ -88.182311, 30.795074 ], "pop" : 13517, "state" : "AL" } +{ "_id" : "36615", "city" : "BROOKLEY FIELD", "loc" : [ -88.068871, 30.631199 ], "pop" : 864, "state" : "AL" } +{ "_id" : "36617", "city" : "MOBILE", "loc" : [ -88.091796, 30.714522 ], "pop" : 17882, "state" : "AL" } +{ "_id" : "36618", "city" : "MOBILE", "loc" : [ -88.175753, 30.732178 ], "pop" : 14887, "state" : "AL" } +{ "_id" : "36619", "city" : "MOBILE", "loc" : [ -88.19464499999999, 30.592803 ], "pop" : 12728, "state" : "AL" } +{ "_id" : "36693", "city" : "MOBILE", "loc" : [ -88.158843, 30.631076 ], "pop" : 17704, "state" : "AL" } +{ "_id" : "36695", "city" : "MOBILE", "loc" : [ -88.22924500000001, 30.647431 ], "pop" : 21467, "state" : "AL" } +{ "_id" : "36701", "city" : "SELMA", "loc" : [ -87.02452700000001, 32.419719 ], "pop" : 26569, "state" : "AL" } +{ "_id" : "36703", "city" : "SELMA", "loc" : [ -87.01354600000001, 32.415553 ], "pop" : 12931, "state" : "AL" } +{ "_id" : "36720", "city" : "ALBERTA", "loc" : [ -87.34250299999999, 32.144889 ], "pop" : 1340, "state" : "AL" } +{ "_id" : "36722", "city" : "ARLINGTON", "loc" : [ -87.559691, 32.066784 ], "pop" : 1098, "state" : "AL" } +{ "_id" : "36726", "city" : "CAMDEN", "loc" : [ -87.29504900000001, 32.004732 ], "pop" : 4948, "state" : "AL" } +{ "_id" : "36727", "city" : "CAMPBELL", "loc" : [ -88.006072, 31.963512 ], "pop" : 392, "state" : "AL" } +{ "_id" : "36728", "city" : "CATHERINE", "loc" : [ -87.48362299999999, 32.182 ], "pop" : 366, "state" : "AL" } +{ "_id" : "36732", "city" : "DEMOPOLIS", "loc" : [ -87.839669, 32.490792 ], "pop" : 9992, "state" : "AL" } +{ "_id" : "36736", "city" : "DIXONS MILLS", "loc" : [ -87.745356, 32.067209 ], "pop" : 2635, "state" : "AL" } +{ "_id" : "36738", "city" : "FAUNSDALE", "loc" : [ -87.61807899999999, 32.423259 ], "pop" : 831, "state" : "AL" } +{ "_id" : "36740", "city" : "FORKLAND", "loc" : [ -87.881676, 32.644661 ], "pop" : 2121, "state" : "AL" } +{ "_id" : "36742", "city" : "GALLION", "loc" : [ -87.698542, 32.529771 ], "pop" : 599, "state" : "AL" } +{ "_id" : "36744", "city" : "GREENSBORO", "loc" : [ -87.59049400000001, 32.716721 ], "pop" : 7680, "state" : "AL" } +{ "_id" : "36748", "city" : "LINDEN", "loc" : [ -87.79535799999999, 32.305343 ], "pop" : 5438, "state" : "AL" } +{ "_id" : "36749", "city" : "JONES", "loc" : [ -86.88926600000001, 32.608515 ], "pop" : 428, "state" : "AL" } +{ "_id" : "36750", "city" : "MAPLESVILLE", "loc" : [ -86.87170399999999, 32.804507 ], "pop" : 1995, "state" : "AL" } +{ "_id" : "36751", "city" : "LOWER PEACH TREE", "loc" : [ -87.568224, 31.850365 ], "pop" : 323, "state" : "AL" } +{ "_id" : "36752", "city" : "BURKVILLE", "loc" : [ -86.60986800000001, 32.300292 ], "pop" : 1478, "state" : "AL" } +{ "_id" : "36754", "city" : "MAGNOLIA", "loc" : [ -87.699815, 32.141931 ], "pop" : 222, "state" : "AL" } +{ "_id" : "36756", "city" : "MARION", "loc" : [ -87.33143699999999, 32.646301 ], "pop" : 7284, "state" : "AL" } +{ "_id" : "36758", "city" : "PLANTERSVILLE", "loc" : [ -86.947531, 32.617608 ], "pop" : 946, "state" : "AL" } +{ "_id" : "36759", "city" : "MARION JUNCTION", "loc" : [ -87.27018099999999, 32.426589 ], "pop" : 796, "state" : "AL" } +{ "_id" : "36761", "city" : "BOYS RANCH", "loc" : [ -86.92497, 32.095387 ], "pop" : 1714, "state" : "AL" } +{ "_id" : "36762", "city" : "MORVIN", "loc" : [ -87.972897, 31.967305 ], "pop" : 24, "state" : "AL" } +{ "_id" : "36765", "city" : "NEWBERN", "loc" : [ -87.56147199999999, 32.551465 ], "pop" : 1131, "state" : "AL" } +{ "_id" : "36767", "city" : "ORRVILLE", "loc" : [ -87.221368, 32.294859 ], "pop" : 2680, "state" : "AL" } +{ "_id" : "36768", "city" : "PINE APPLE", "loc" : [ -87.004667, 31.926522 ], "pop" : 1658, "state" : "AL" } +{ "_id" : "36769", "city" : "PINE HILL", "loc" : [ -87.57708599999999, 31.973546 ], "pop" : 2623, "state" : "AL" } +{ "_id" : "36771", "city" : "PRAIRIE", "loc" : [ -87.448723, 32.084762 ], "pop" : 112, "state" : "AL" } +{ "_id" : "36773", "city" : "SAFFORD", "loc" : [ -87.369345, 32.300242 ], "pop" : 715, "state" : "AL" } +{ "_id" : "36775", "city" : "SARDIS", "loc" : [ -86.99195899999999, 32.284358 ], "pop" : 1683, "state" : "AL" } +{ "_id" : "36776", "city" : "SAWYERVILLE", "loc" : [ -87.740201, 32.757796 ], "pop" : 1684, "state" : "AL" } +{ "_id" : "36779", "city" : "SPROTT", "loc" : [ -87.141599, 32.654376 ], "pop" : 1191, "state" : "AL" } +{ "_id" : "36782", "city" : "SWEET WATER", "loc" : [ -87.922755, 32.077272 ], "pop" : 2444, "state" : "AL" } +{ "_id" : "36783", "city" : "THOMASTON", "loc" : [ -87.597438, 32.253776 ], "pop" : 1527, "state" : "AL" } +{ "_id" : "36784", "city" : "THOMASVILLE", "loc" : [ -87.75984200000001, 31.906728 ], "pop" : 6229, "state" : "AL" } +{ "_id" : "36785", "city" : "BENTON", "loc" : [ -86.85986699999999, 32.281924 ], "pop" : 1396, "state" : "AL" } +{ "_id" : "36786", "city" : "UNIONTOWN", "loc" : [ -87.493398, 32.446966 ], "pop" : 4173, "state" : "AL" } +{ "_id" : "36790", "city" : "STANTON", "loc" : [ -86.886848, 32.709631 ], "pop" : 916, "state" : "AL" } +{ "_id" : "36792", "city" : "RANDOLPH", "loc" : [ -86.90701, 32.888834 ], "pop" : 434, "state" : "AL" } +{ "_id" : "36793", "city" : "LAWLEY", "loc" : [ -86.95670800000001, 32.864558 ], "pop" : 337, "state" : "AL" } +{ "_id" : "36801", "city" : "OPELIKA", "loc" : [ -85.35862899999999, 32.627771 ], "pop" : 32808, "state" : "AL" } +{ "_id" : "36830", "city" : "AUBURN", "loc" : [ -85.489001, 32.602043 ], "pop" : 38908, "state" : "AL" } +{ "_id" : "36850", "city" : "CAMP HILL", "loc" : [ -85.64738, 32.782749 ], "pop" : 2422, "state" : "AL" } +{ "_id" : "36852", "city" : "CUSSETA", "loc" : [ -85.215791, 32.803194 ], "pop" : 4597, "state" : "AL" } +{ "_id" : "36853", "city" : "DADEVILLE", "loc" : [ -85.77039499999999, 32.82239 ], "pop" : 7620, "state" : "AL" } +{ "_id" : "36854", "city" : "VALLEY", "loc" : [ -85.17491099999999, 32.811349 ], "pop" : 9504, "state" : "AL" } +{ "_id" : "36855", "city" : "FIVE POINTS", "loc" : [ -85.324264, 33.042408 ], "pop" : 2400, "state" : "AL" } +{ "_id" : "36858", "city" : "HATCHECHUBBEE", "loc" : [ -85.302882, 32.284531 ], "pop" : 772, "state" : "AL" } +{ "_id" : "36860", "city" : "HURTSBORO", "loc" : [ -85.395903, 32.245429 ], "pop" : 1727, "state" : "AL" } +{ "_id" : "36861", "city" : "JACKSONS GAP", "loc" : [ -85.848662, 32.879698 ], "pop" : 2236, "state" : "AL" } +{ "_id" : "36862", "city" : "LAFAYETTE", "loc" : [ -85.44256300000001, 32.925237 ], "pop" : 7045, "state" : "AL" } +{ "_id" : "36863", "city" : "LANETT", "loc" : [ -85.21608000000001, 32.861609 ], "pop" : 12083, "state" : "AL" } +{ "_id" : "36866", "city" : "NOTASULGA", "loc" : [ -85.68707000000001, 32.543727 ], "pop" : 3361, "state" : "AL" } +{ "_id" : "36867", "city" : "PHENIX CITY", "loc" : [ -85.095082, 32.407816 ], "pop" : 13632, "state" : "AL" } +{ "_id" : "36869", "city" : "PHENIX CITY", "loc" : [ -85.018118, 32.470647 ], "pop" : 28320, "state" : "AL" } +{ "_id" : "36871", "city" : "PITTSVIEW", "loc" : [ -85.131248, 32.173346 ], "pop" : 1525, "state" : "AL" } +{ "_id" : "36874", "city" : "SALEM", "loc" : [ -85.183966, 32.621157 ], "pop" : 2773, "state" : "AL" } +{ "_id" : "36875", "city" : "SEALE", "loc" : [ -85.167733, 32.305339 ], "pop" : 1949, "state" : "AL" } +{ "_id" : "36877", "city" : "SMITHS", "loc" : [ -85.100027, 32.520072 ], "pop" : 10605, "state" : "AL" } +{ "_id" : "36879", "city" : "WAVERLY", "loc" : [ -85.51437199999999, 32.763167 ], "pop" : 1689, "state" : "AL" } +{ "_id" : "36904", "city" : "BUTLER", "loc" : [ -88.206391, 32.082906 ], "pop" : 4957, "state" : "AL" } +{ "_id" : "36907", "city" : "CUBA", "loc" : [ -88.36108299999999, 32.410973 ], "pop" : 1184, "state" : "AL" } +{ "_id" : "36908", "city" : "GILBERTOWN", "loc" : [ -88.326514, 31.866602 ], "pop" : 1606, "state" : "AL" } +{ "_id" : "36910", "city" : "JACHIN", "loc" : [ -88.233356, 32.244174 ], "pop" : 480, "state" : "AL" } +{ "_id" : "36912", "city" : "LISMAN", "loc" : [ -88.323419, 32.217722 ], "pop" : 2313, "state" : "AL" } +{ "_id" : "36915", "city" : "NEEDHAM", "loc" : [ -88.345798, 32.012165 ], "pop" : 618, "state" : "AL" } +{ "_id" : "36916", "city" : "PENNINGTON", "loc" : [ -88.09310000000001, 32.226245 ], "pop" : 1459, "state" : "AL" } +{ "_id" : "36919", "city" : "SILAS", "loc" : [ -88.30914900000001, 31.766754 ], "pop" : 2600, "state" : "AL" } +{ "_id" : "36921", "city" : "TOXEY", "loc" : [ -88.31793999999999, 31.93153 ], "pop" : 1980, "state" : "AL" } +{ "_id" : "36922", "city" : "WARD", "loc" : [ -88.29711399999999, 32.334063 ], "pop" : 274, "state" : "AL" } +{ "_id" : "36925", "city" : "YORK", "loc" : [ -88.268304, 32.472765 ], "pop" : 5728, "state" : "AL" } +{ "_id" : "37010", "city" : "ADAMS", "loc" : [ -87.122626, 36.558174 ], "pop" : 2660, "state" : "TN" } +{ "_id" : "37012", "city" : "ALEXANDRIA", "loc" : [ -86.037171, 36.071147 ], "pop" : 993, "state" : "TN" } +{ "_id" : "37013", "city" : "ANTIOCH", "loc" : [ -86.65915099999999, 36.059517 ], "pop" : 36988, "state" : "TN" } +{ "_id" : "37014", "city" : "ARRINGTON", "loc" : [ -86.564515, 35.904876 ], "pop" : 12171, "state" : "TN" } +{ "_id" : "37015", "city" : "ASHLAND CITY", "loc" : [ -87.044719, 36.273132 ], "pop" : 10940, "state" : "TN" } +{ "_id" : "37016", "city" : "AUBURNTOWN", "loc" : [ -86.10753200000001, 35.974392 ], "pop" : 933, "state" : "TN" } +{ "_id" : "37018", "city" : "BEECHGROVE", "loc" : [ -86.204644, 35.644733 ], "pop" : 650, "state" : "TN" } +{ "_id" : "37019", "city" : "BELFAST", "loc" : [ -86.70948199999999, 35.406905 ], "pop" : 425, "state" : "TN" } +{ "_id" : "37020", "city" : "BELL BUCKLE", "loc" : [ -86.394908, 35.638105 ], "pop" : 2899, "state" : "TN" } +{ "_id" : "37022", "city" : "BETHPAGE", "loc" : [ -86.314572, 36.518575 ], "pop" : 4132, "state" : "TN" } +{ "_id" : "37023", "city" : "BIG ROCK", "loc" : [ -87.737838, 36.571606 ], "pop" : 258, "state" : "TN" } +{ "_id" : "37025", "city" : "BON AQUA", "loc" : [ -87.299564, 35.947073 ], "pop" : 3984, "state" : "TN" } +{ "_id" : "37026", "city" : "BRADYVILLE", "loc" : [ -86.09119, 35.705278 ], "pop" : 1570, "state" : "TN" } +{ "_id" : "37027", "city" : "BRENTWOOD", "loc" : [ -86.790947, 36.006272 ], "pop" : 24280, "state" : "TN" } +{ "_id" : "37028", "city" : "BUMPUS MILLS", "loc" : [ -87.861434, 36.622618 ], "pop" : 411, "state" : "TN" } +{ "_id" : "37029", "city" : "BURNS", "loc" : [ -87.306061, 36.047066 ], "pop" : 4449, "state" : "TN" } +{ "_id" : "37030", "city" : "DEFEATED", "loc" : [ -85.96969, 36.255617 ], "pop" : 5318, "state" : "TN" } +{ "_id" : "37031", "city" : "CASTALIAN SPRING", "loc" : [ -86.315545, 36.382108 ], "pop" : 1544, "state" : "TN" } +{ "_id" : "37032", "city" : "CEDAR HILL", "loc" : [ -87.027523, 36.506163 ], "pop" : 2527, "state" : "TN" } +{ "_id" : "37033", "city" : "CENTERVILLE", "loc" : [ -87.477473, 35.779685 ], "pop" : 5955, "state" : "TN" } +{ "_id" : "37034", "city" : "CHAPEL HILL", "loc" : [ -86.683584, 35.63542 ], "pop" : 2912, "state" : "TN" } +{ "_id" : "37035", "city" : "CHAPMANSBORO", "loc" : [ -87.111288, 36.378078 ], "pop" : 3248, "state" : "TN" } +{ "_id" : "37036", "city" : "CHARLOTTE", "loc" : [ -87.281554, 36.232612 ], "pop" : 4205, "state" : "TN" } +{ "_id" : "37037", "city" : "CHRISTIANA", "loc" : [ -86.407932, 35.740877 ], "pop" : 3173, "state" : "TN" } +{ "_id" : "37040", "city" : "CLARKSVILLE", "loc" : [ -87.348997, 36.522014 ], "pop" : 24920, "state" : "TN" } +{ "_id" : "37042", "city" : "CLARKSVILLE", "loc" : [ -87.418621, 36.585315 ], "pop" : 43296, "state" : "TN" } +{ "_id" : "37043", "city" : "CLARKSVILLE", "loc" : [ -87.27565300000001, 36.5107 ], "pop" : 23166, "state" : "TN" } +{ "_id" : "37046", "city" : "COLLEGE GROVE", "loc" : [ -86.749516, 35.783166 ], "pop" : 4321, "state" : "TN" } +{ "_id" : "37047", "city" : "CORNERSVILLE", "loc" : [ -86.82862, 35.34088 ], "pop" : 1631, "state" : "TN" } +{ "_id" : "37048", "city" : "COTTONTOWN", "loc" : [ -86.60333799999999, 36.491231 ], "pop" : 4724, "state" : "TN" } +{ "_id" : "37049", "city" : "CROSS PLAINS", "loc" : [ -86.67608799999999, 36.553068 ], "pop" : 2269, "state" : "TN" } +{ "_id" : "37050", "city" : "CUMBERLAND CITY", "loc" : [ -87.63494, 36.366924 ], "pop" : 1208, "state" : "TN" } +{ "_id" : "37051", "city" : "CUMBERLAND FURNA", "loc" : [ -87.40658500000001, 36.316146 ], "pop" : 2288, "state" : "TN" } +{ "_id" : "37052", "city" : "CUNNINGHAM", "loc" : [ -87.42454600000001, 36.378926 ], "pop" : 2163, "state" : "TN" } +{ "_id" : "37055", "city" : "DICKSON", "loc" : [ -87.39953199999999, 36.076014 ], "pop" : 17724, "state" : "TN" } +{ "_id" : "37057", "city" : "DIXON SPRINGS", "loc" : [ -86.05334999999999, 36.445538 ], "pop" : 1269, "state" : "TN" } +{ "_id" : "37058", "city" : "DOVER", "loc" : [ -87.83833300000001, 36.507521 ], "pop" : 5972, "state" : "TN" } +{ "_id" : "37059", "city" : "DOWELLTOWN", "loc" : [ -85.90553300000001, 35.972485 ], "pop" : 1416, "state" : "TN" } +{ "_id" : "37060", "city" : "EAGLEVILLE", "loc" : [ -86.63265199999999, 35.749243 ], "pop" : 1562, "state" : "TN" } +{ "_id" : "37061", "city" : "ERIN", "loc" : [ -87.67896399999999, 36.306684 ], "pop" : 4804, "state" : "TN" } +{ "_id" : "37062", "city" : "FAIRVIEW", "loc" : [ -87.132065, 35.975528 ], "pop" : 7203, "state" : "TN" } +{ "_id" : "37064", "city" : "FRANKLIN", "loc" : [ -86.878833, 35.932782 ], "pop" : 40509, "state" : "TN" } +{ "_id" : "37066", "city" : "GALLATIN", "loc" : [ -86.45116, 36.383438 ], "pop" : 27321, "state" : "TN" } +{ "_id" : "37072", "city" : "GOODLETTSVILLE", "loc" : [ -86.721215, 36.341677 ], "pop" : 20825, "state" : "TN" } +{ "_id" : "37073", "city" : "GREENBRIER", "loc" : [ -86.79135599999999, 36.422914 ], "pop" : 8597, "state" : "TN" } +{ "_id" : "37074", "city" : "HARTSVILLE", "loc" : [ -86.17040799999999, 36.394728 ], "pop" : 5511, "state" : "TN" } +{ "_id" : "37075", "city" : "HENDERSONVILLE", "loc" : [ -86.607157, 36.305425 ], "pop" : 38730, "state" : "TN" } +{ "_id" : "37076", "city" : "HERMITAGE", "loc" : [ -86.600162, 36.184814 ], "pop" : 23765, "state" : "TN" } +{ "_id" : "37078", "city" : "HURRICANE MILLS", "loc" : [ -87.767129, 35.974859 ], "pop" : 2200, "state" : "TN" } +{ "_id" : "37079", "city" : "INDIAN MOUND", "loc" : [ -87.680368, 36.494593 ], "pop" : 1615, "state" : "TN" } +{ "_id" : "37080", "city" : "JOELTON", "loc" : [ -86.91630600000001, 36.328974 ], "pop" : 6749, "state" : "TN" } +{ "_id" : "37082", "city" : "KINGSTON SPRINGS", "loc" : [ -87.115646, 36.095324 ], "pop" : 4037, "state" : "TN" } +{ "_id" : "37083", "city" : "LAFAYETTE", "loc" : [ -86.02421699999999, 36.538955 ], "pop" : 8686, "state" : "TN" } +{ "_id" : "37085", "city" : "LASCASSAS", "loc" : [ -86.31119200000001, 35.949535 ], "pop" : 2463, "state" : "TN" } +{ "_id" : "37086", "city" : "LA VERGNE", "loc" : [ -86.559969, 36.012714 ], "pop" : 6115, "state" : "TN" } +{ "_id" : "37087", "city" : "LEBANON", "loc" : [ -86.302367, 36.209792 ], "pop" : 33656, "state" : "TN" } +{ "_id" : "37091", "city" : "LEWISBURG", "loc" : [ -86.781204, 35.459615 ], "pop" : 16217, "state" : "TN" } +{ "_id" : "37095", "city" : "GASSAWAY", "loc" : [ -85.98544800000001, 35.974593 ], "pop" : 2236, "state" : "TN" } +{ "_id" : "37096", "city" : "FLATWOODS", "loc" : [ -87.865582, 35.599784 ], "pop" : 4172, "state" : "TN" } +{ "_id" : "37097", "city" : "LOBELVILLE", "loc" : [ -87.82510600000001, 35.746659 ], "pop" : 2357, "state" : "TN" } +{ "_id" : "37098", "city" : "WRIGLEY", "loc" : [ -87.317199, 35.892216 ], "pop" : 3257, "state" : "TN" } +{ "_id" : "37101", "city" : "MC EWEN", "loc" : [ -87.64221000000001, 36.118477 ], "pop" : 3963, "state" : "TN" } +{ "_id" : "37110", "city" : "PLAZA", "loc" : [ -85.79160899999999, 35.697358 ], "pop" : 25113, "state" : "TN" } +{ "_id" : "37115", "city" : "MADISON", "loc" : [ -86.70455699999999, 36.260386 ], "pop" : 31511, "state" : "TN" } +{ "_id" : "37118", "city" : "MILTON", "loc" : [ -86.182377, 35.922085 ], "pop" : 894, "state" : "TN" } +{ "_id" : "37122", "city" : "MOUNT JULIET", "loc" : [ -86.50234399999999, 36.189684 ], "pop" : 24498, "state" : "TN" } +{ "_id" : "37129", "city" : "MURFREESBORO", "loc" : [ -86.41809000000001, 35.871019 ], "pop" : 26477, "state" : "TN" } +{ "_id" : "37130", "city" : "MURFREESBORO", "loc" : [ -86.36467500000001, 35.847792 ], "pop" : 35559, "state" : "TN" } +{ "_id" : "37134", "city" : "NEW JOHNSONVILLE", "loc" : [ -87.95469300000001, 36.008775 ], "pop" : 2812, "state" : "TN" } +{ "_id" : "37135", "city" : "NOLENSVILLE", "loc" : [ -86.682868, 35.930723 ], "pop" : 3813, "state" : "TN" } +{ "_id" : "37137", "city" : "NUNNELLY", "loc" : [ -87.50666099999999, 35.87627 ], "pop" : 2176, "state" : "TN" } +{ "_id" : "37138", "city" : "OLD HICKORY", "loc" : [ -86.611704, 36.241564 ], "pop" : 17329, "state" : "TN" } +{ "_id" : "37140", "city" : "ONLY", "loc" : [ -87.665451, 35.867888 ], "pop" : 199, "state" : "TN" } +{ "_id" : "37141", "city" : "ORLINDA", "loc" : [ -86.69900199999999, 36.611045 ], "pop" : 614, "state" : "TN" } +{ "_id" : "37142", "city" : "PALMYRA", "loc" : [ -87.491359, 36.417568 ], "pop" : 1118, "state" : "TN" } +{ "_id" : "37143", "city" : "PEGRAM", "loc" : [ -87.03161299999999, 36.11291 ], "pop" : 2742, "state" : "TN" } +{ "_id" : "37144", "city" : "PETERSBURG", "loc" : [ -86.644728, 35.292416 ], "pop" : 3214, "state" : "TN" } +{ "_id" : "37145", "city" : "PLEASANT SHADE", "loc" : [ -85.908057, 36.348924 ], "pop" : 1901, "state" : "TN" } +{ "_id" : "37146", "city" : "PLEASANT VIEW", "loc" : [ -87.03948, 36.378281 ], "pop" : 2424, "state" : "TN" } +{ "_id" : "37147", "city" : "PLEASANTVILLE", "loc" : [ -87.65366400000001, 35.668373 ], "pop" : 534, "state" : "TN" } +{ "_id" : "37148", "city" : "PORTLAND", "loc" : [ -86.505923, 36.567306 ], "pop" : 12790, "state" : "TN" } +{ "_id" : "37149", "city" : "READYVILLE", "loc" : [ -86.241483, 35.798878 ], "pop" : 4572, "state" : "TN" } +{ "_id" : "37150", "city" : "RED BOILING SPRI", "loc" : [ -85.846333, 36.531283 ], "pop" : 4862, "state" : "TN" } +{ "_id" : "37151", "city" : "RIDDLETON", "loc" : [ -86.03348200000001, 36.350581 ], "pop" : 572, "state" : "TN" } +{ "_id" : "37153", "city" : "ROCKVALE", "loc" : [ -86.535196, 35.74503 ], "pop" : 1776, "state" : "TN" } +{ "_id" : "37160", "city" : "ROYAL", "loc" : [ -86.463425, 35.488313 ], "pop" : 22781, "state" : "TN" } +{ "_id" : "37166", "city" : "SMITHVILLE", "loc" : [ -85.804562, 35.929907 ], "pop" : 10587, "state" : "TN" } +{ "_id" : "37167", "city" : "SMYRNA", "loc" : [ -86.504818, 35.965611 ], "pop" : 23049, "state" : "TN" } +{ "_id" : "37171", "city" : "SOUTHSIDE", "loc" : [ -87.30608700000001, 36.362588 ], "pop" : 951, "state" : "TN" } +{ "_id" : "37172", "city" : "SPRINGFIELD", "loc" : [ -86.876901, 36.50182 ], "pop" : 21214, "state" : "TN" } +{ "_id" : "37174", "city" : "SPRING HILL", "loc" : [ -86.90480700000001, 35.717294 ], "pop" : 2891, "state" : "TN" } +{ "_id" : "37175", "city" : "STEWART", "loc" : [ -87.872495, 36.324055 ], "pop" : 897, "state" : "TN" } +{ "_id" : "37178", "city" : "TENNESSEE RIDGE", "loc" : [ -87.780761, 36.329712 ], "pop" : 1558, "state" : "TN" } +{ "_id" : "37179", "city" : "THOMPSONS STATIO", "loc" : [ -87.004875, 35.831006 ], "pop" : 3945, "state" : "TN" } +{ "_id" : "37180", "city" : "UNIONVILLE", "loc" : [ -86.563852, 35.622416 ], "pop" : 1772, "state" : "TN" } +{ "_id" : "37181", "city" : "VANLEER", "loc" : [ -87.45653, 36.223738 ], "pop" : 1531, "state" : "TN" } +{ "_id" : "37183", "city" : "WARTRACE", "loc" : [ -86.327736, 35.512299 ], "pop" : 2119, "state" : "TN" } +{ "_id" : "37184", "city" : "WATERTOWN", "loc" : [ -86.143411, 36.095268 ], "pop" : 3640, "state" : "TN" } +{ "_id" : "37185", "city" : "WAVERLY", "loc" : [ -87.799108, 36.099664 ], "pop" : 6820, "state" : "TN" } +{ "_id" : "37186", "city" : "WESTMORELAND", "loc" : [ -86.23529600000001, 36.575554 ], "pop" : 6695, "state" : "TN" } +{ "_id" : "37187", "city" : "WHITE BLUFF", "loc" : [ -87.21901, 36.12531 ], "pop" : 5230, "state" : "TN" } +{ "_id" : "37188", "city" : "WHITE HOUSE", "loc" : [ -86.670524, 36.460048 ], "pop" : 6240, "state" : "TN" } +{ "_id" : "37189", "city" : "WHITES CREEK", "loc" : [ -86.82922000000001, 36.274377 ], "pop" : 4189, "state" : "TN" } +{ "_id" : "37190", "city" : "WOODBURY", "loc" : [ -86.050044, 35.814254 ], "pop" : 6141, "state" : "TN" } +{ "_id" : "37191", "city" : "WOODLAWN", "loc" : [ -87.539331, 36.514695 ], "pop" : 2568, "state" : "TN" } +{ "_id" : "37201", "city" : "NASHVILLE", "loc" : [ -86.778441, 36.167028 ], "pop" : 1579, "state" : "TN" } +{ "_id" : "37203", "city" : "NASHVILLE", "loc" : [ -86.79392199999999, 36.146802 ], "pop" : 13524, "state" : "TN" } +{ "_id" : "37204", "city" : "MELROSE", "loc" : [ -86.781808, 36.114628 ], "pop" : 12448, "state" : "TN" } +{ "_id" : "37205", "city" : "NASHVILLE", "loc" : [ -86.868954, 36.111432 ], "pop" : 23323, "state" : "TN" } +{ "_id" : "37206", "city" : "NASHVILLE", "loc" : [ -86.741106, 36.179813 ], "pop" : 28446, "state" : "TN" } +{ "_id" : "37207", "city" : "NASHVILLE", "loc" : [ -86.77400799999999, 36.2195 ], "pop" : 35260, "state" : "TN" } +{ "_id" : "37208", "city" : "NASHVILLE", "loc" : [ -86.807563, 36.176196 ], "pop" : 15535, "state" : "TN" } +{ "_id" : "37209", "city" : "NASHVILLE", "loc" : [ -86.860212, 36.154592 ], "pop" : 33560, "state" : "TN" } +{ "_id" : "37210", "city" : "NASHVILLE", "loc" : [ -86.74104199999999, 36.137904 ], "pop" : 17173, "state" : "TN" } +{ "_id" : "37211", "city" : "NASHVILLE", "loc" : [ -86.72403799999999, 36.072486 ], "pop" : 51478, "state" : "TN" } +{ "_id" : "37212", "city" : "NASHVILLE", "loc" : [ -86.800555, 36.133681 ], "pop" : 16492, "state" : "TN" } +{ "_id" : "37213", "city" : "NASHVILLE", "loc" : [ -86.76055599999999, 36.165512 ], "pop" : 356, "state" : "TN" } +{ "_id" : "37214", "city" : "NASHVILLE", "loc" : [ -86.660854, 36.163339 ], "pop" : 24935, "state" : "TN" } +{ "_id" : "37215", "city" : "NASHVILLE", "loc" : [ -86.821917, 36.098584 ], "pop" : 20452, "state" : "TN" } +{ "_id" : "37216", "city" : "NASHVILLE", "loc" : [ -86.72568699999999, 36.212491 ], "pop" : 20045, "state" : "TN" } +{ "_id" : "37217", "city" : "NASHVILLE", "loc" : [ -86.666585, 36.10585 ], "pop" : 26242, "state" : "TN" } +{ "_id" : "37218", "city" : "NASHVILLE", "loc" : [ -86.845583, 36.207062 ], "pop" : 14312, "state" : "TN" } +{ "_id" : "37219", "city" : "NASHVILLE", "loc" : [ -86.783676, 36.167768 ], "pop" : 268, "state" : "TN" } +{ "_id" : "37220", "city" : "NASHVILLE", "loc" : [ -86.769654, 36.064139 ], "pop" : 6230, "state" : "TN" } +{ "_id" : "37221", "city" : "BELLEVUE", "loc" : [ -86.943674, 36.071512 ], "pop" : 21880, "state" : "TN" } +{ "_id" : "37228", "city" : "NASHVILLE", "loc" : [ -86.80526399999999, 36.190145 ], "pop" : 612, "state" : "TN" } +{ "_id" : "37301", "city" : "ALTAMONT", "loc" : [ -85.763508, 35.425776 ], "pop" : 988, "state" : "TN" } +{ "_id" : "37302", "city" : "APISON", "loc" : [ -85.01640399999999, 35.014926 ], "pop" : 1614, "state" : "TN" } +{ "_id" : "37303", "city" : "ATHENS", "loc" : [ -84.60426099999999, 35.457389 ], "pop" : 21571, "state" : "TN" } +{ "_id" : "37305", "city" : "BEERSHEBA SPRING", "loc" : [ -85.68212800000001, 35.470371 ], "pop" : 1067, "state" : "TN" } +{ "_id" : "37306", "city" : "BELVIDERE", "loc" : [ -86.172827, 35.141499 ], "pop" : 4670, "state" : "TN" } +{ "_id" : "37307", "city" : "BENTON", "loc" : [ -84.654433, 35.172953 ], "pop" : 3164, "state" : "TN" } +{ "_id" : "37308", "city" : "BIRCHWOOD", "loc" : [ -84.96183499999999, 35.351968 ], "pop" : 2732, "state" : "TN" } +{ "_id" : "37309", "city" : "CALHOUN", "loc" : [ -84.738105, 35.374614 ], "pop" : 3597, "state" : "TN" } +{ "_id" : "37310", "city" : "CHARLESTON", "loc" : [ -84.766639, 35.255644 ], "pop" : 1921, "state" : "TN" } +{ "_id" : "37311", "city" : "CLEVELAND", "loc" : [ -84.875006, 35.131257 ], "pop" : 40633, "state" : "TN" } +{ "_id" : "37312", "city" : "CLEVELAND", "loc" : [ -84.84755699999999, 35.202309 ], "pop" : 28081, "state" : "TN" } +{ "_id" : "37313", "city" : "COALMONT", "loc" : [ -85.655097, 35.386197 ], "pop" : 786, "state" : "TN" } +{ "_id" : "37317", "city" : "POSTELLE", "loc" : [ -84.38396400000001, 35.024987 ], "pop" : 3155, "state" : "TN" } +{ "_id" : "37318", "city" : "COWAN", "loc" : [ -86.019007, 35.170121 ], "pop" : 2713, "state" : "TN" } +{ "_id" : "37321", "city" : "DAYTON", "loc" : [ -85.01345499999999, 35.500186 ], "pop" : 15965, "state" : "TN" } +{ "_id" : "37322", "city" : "DECATUR", "loc" : [ -84.80805100000001, 35.507166 ], "pop" : 3718, "state" : "TN" } +{ "_id" : "37324", "city" : "DECHERD", "loc" : [ -86.058859, 35.232598 ], "pop" : 6576, "state" : "TN" } +{ "_id" : "37325", "city" : "DELANO", "loc" : [ -84.602366, 35.261234 ], "pop" : 1830, "state" : "TN" } +{ "_id" : "37327", "city" : "DUNLAP", "loc" : [ -85.39251299999999, 35.384175 ], "pop" : 6883, "state" : "TN" } +{ "_id" : "37328", "city" : "ELORA", "loc" : [ -86.34811000000001, 35.029496 ], "pop" : 1257, "state" : "TN" } +{ "_id" : "37329", "city" : "ENGLEWOOD", "loc" : [ -84.483265, 35.427245 ], "pop" : 3419, "state" : "TN" } +{ "_id" : "37330", "city" : "ESTILL SPRINGS", "loc" : [ -86.139561, 35.270508 ], "pop" : 5778, "state" : "TN" } +{ "_id" : "37331", "city" : "ETOWAH", "loc" : [ -84.528305, 35.331443 ], "pop" : 8246, "state" : "TN" } +{ "_id" : "37332", "city" : "EVENSVILLE", "loc" : [ -85.022773, 35.615346 ], "pop" : 99, "state" : "TN" } +{ "_id" : "37333", "city" : "FARNER", "loc" : [ -84.320904, 35.144894 ], "pop" : 672, "state" : "TN" } +{ "_id" : "37334", "city" : "FAYETTEVILLE", "loc" : [ -86.56644799999999, 35.152678 ], "pop" : 11009, "state" : "TN" } +{ "_id" : "37335", "city" : "FLINTVILLE", "loc" : [ -86.497974, 35.042782 ], "pop" : 6020, "state" : "TN" } +{ "_id" : "37336", "city" : "GEORGETOWN", "loc" : [ -84.912684, 35.293241 ], "pop" : 3768, "state" : "TN" } +{ "_id" : "37337", "city" : "GRANDVIEW", "loc" : [ -84.861464, 35.760843 ], "pop" : 626, "state" : "TN" } +{ "_id" : "37338", "city" : "GRAYSVILLE", "loc" : [ -85.17904, 35.44842 ], "pop" : 1067, "state" : "TN" } +{ "_id" : "37339", "city" : "GRUETLI LAAGER", "loc" : [ -85.66977300000001, 35.363464 ], "pop" : 1929, "state" : "TN" } +{ "_id" : "37340", "city" : "GUILD", "loc" : [ -85.511568, 35.017834 ], "pop" : 1183, "state" : "TN" } +{ "_id" : "37341", "city" : "HARRISON", "loc" : [ -85.094532, 35.167898 ], "pop" : 10247, "state" : "TN" } +{ "_id" : "37342", "city" : "HILLSBORO", "loc" : [ -85.97242199999999, 35.369933 ], "pop" : 2075, "state" : "TN" } +{ "_id" : "37343", "city" : "HIXSON", "loc" : [ -85.218215, 35.159112 ], "pop" : 35100, "state" : "TN" } +{ "_id" : "37345", "city" : "HUNTLAND", "loc" : [ -86.269435, 35.051198 ], "pop" : 2016, "state" : "TN" } +{ "_id" : "37347", "city" : "KIMBALL", "loc" : [ -85.61473700000001, 35.066603 ], "pop" : 7076, "state" : "TN" } +{ "_id" : "37348", "city" : "KELSO", "loc" : [ -86.468343, 35.102356 ], "pop" : 759, "state" : "TN" } +{ "_id" : "37350", "city" : "LOOKOUT MOUNTAIN", "loc" : [ -85.35056400000001, 34.994825 ], "pop" : 1899, "state" : "TN" } +{ "_id" : "37352", "city" : "LYNCHBURG", "loc" : [ -86.37201899999999, 35.270642 ], "pop" : 2888, "state" : "TN" } +{ "_id" : "37353", "city" : "MC DONALD", "loc" : [ -84.989198, 35.086902 ], "pop" : 819, "state" : "TN" } +{ "_id" : "37354", "city" : "HIWASSEE COLLEGE", "loc" : [ -84.351899, 35.500917 ], "pop" : 10509, "state" : "TN" } +{ "_id" : "37355", "city" : "MANCHESTER", "loc" : [ -86.081568, 35.495846 ], "pop" : 19173, "state" : "TN" } +{ "_id" : "37356", "city" : "MONTEAGLE", "loc" : [ -85.822795, 35.240172 ], "pop" : 2206, "state" : "TN" } +{ "_id" : "37357", "city" : "MORRISON", "loc" : [ -85.889895, 35.60002 ], "pop" : 5654, "state" : "TN" } +{ "_id" : "37359", "city" : "MULBERRY", "loc" : [ -86.421685, 35.19413 ], "pop" : 495, "state" : "TN" } +{ "_id" : "37360", "city" : "NORMANDY", "loc" : [ -86.255712, 35.429628 ], "pop" : 1308, "state" : "TN" } +{ "_id" : "37361", "city" : "OCOEE", "loc" : [ -84.713565, 35.102473 ], "pop" : 1206, "state" : "TN" } +{ "_id" : "37362", "city" : "OLDFORT", "loc" : [ -84.72187700000001, 35.03654 ], "pop" : 1522, "state" : "TN" } +{ "_id" : "37363", "city" : "OOLTEWAH", "loc" : [ -85.063495, 35.078104 ], "pop" : 17419, "state" : "TN" } +{ "_id" : "37365", "city" : "PALMER", "loc" : [ -85.564272, 35.374062 ], "pop" : 1685, "state" : "TN" } +{ "_id" : "37366", "city" : "PELHAM", "loc" : [ -85.84408000000001, 35.314045 ], "pop" : 671, "state" : "TN" } +{ "_id" : "37367", "city" : "PIKEVILLE", "loc" : [ -85.20765299999999, 35.640769 ], "pop" : 7869, "state" : "TN" } +{ "_id" : "37369", "city" : "RELIANCE", "loc" : [ -84.54103000000001, 35.180664 ], "pop" : 1777, "state" : "TN" } +{ "_id" : "37370", "city" : "RICEVILLE", "loc" : [ -84.646247, 35.344615 ], "pop" : 2785, "state" : "TN" } +{ "_id" : "37373", "city" : "SALE CREEK", "loc" : [ -85.102323, 35.385806 ], "pop" : 2464, "state" : "TN" } +{ "_id" : "37374", "city" : "SEQUATCHIE", "loc" : [ -85.637084, 35.163396 ], "pop" : 1463, "state" : "TN" } +{ "_id" : "37375", "city" : "SEWANEE", "loc" : [ -85.91258999999999, 35.201101 ], "pop" : 2785, "state" : "TN" } +{ "_id" : "37376", "city" : "SHERWOOD", "loc" : [ -85.923841, 35.099164 ], "pop" : 885, "state" : "TN" } +{ "_id" : "37377", "city" : "SIGNAL MOUNTAIN", "loc" : [ -85.336243, 35.149424 ], "pop" : 14032, "state" : "TN" } +{ "_id" : "37379", "city" : "SODDY DAISY", "loc" : [ -85.163009, 35.252686 ], "pop" : 19646, "state" : "TN" } +{ "_id" : "37380", "city" : "SOUTH PITTSBURG", "loc" : [ -85.722498, 35.028046 ], "pop" : 6151, "state" : "TN" } +{ "_id" : "37381", "city" : "SPRING CITY", "loc" : [ -84.84196799999999, 35.682072 ], "pop" : 7787, "state" : "TN" } +{ "_id" : "37385", "city" : "TELLICO PLAINS", "loc" : [ -84.306785, 35.356237 ], "pop" : 6459, "state" : "TN" } +{ "_id" : "37387", "city" : "TRACY CITY", "loc" : [ -85.736187, 35.272081 ], "pop" : 3980, "state" : "TN" } +{ "_id" : "37388", "city" : "DICKEL", "loc" : [ -86.22069, 35.35841 ], "pop" : 22193, "state" : "TN" } +{ "_id" : "37391", "city" : "TURTLETOWN", "loc" : [ -84.354381, 35.108089 ], "pop" : 910, "state" : "TN" } +{ "_id" : "37396", "city" : "WHITESIDE", "loc" : [ -85.398499, 35.066289 ], "pop" : 192, "state" : "TN" } +{ "_id" : "37397", "city" : "WHITWELL", "loc" : [ -85.50111200000001, 35.197228 ], "pop" : 9051, "state" : "TN" } +{ "_id" : "37398", "city" : "WINCHESTER", "loc" : [ -86.113038, 35.186398 ], "pop" : 5753, "state" : "TN" } +{ "_id" : "37402", "city" : "CHATTANOOGA", "loc" : [ -85.316126, 35.046288 ], "pop" : 3455, "state" : "TN" } +{ "_id" : "37403", "city" : "CHATTANOOGA", "loc" : [ -85.296516, 35.045045 ], "pop" : 3700, "state" : "TN" } +{ "_id" : "37404", "city" : "CHATTANOOGA", "loc" : [ -85.272229, 35.030634 ], "pop" : 15345, "state" : "TN" } +{ "_id" : "37405", "city" : "CHATTANOOGA", "loc" : [ -85.308224, 35.076801 ], "pop" : 12005, "state" : "TN" } +{ "_id" : "37406", "city" : "CHATTANOOGA", "loc" : [ -85.247839, 35.061446 ], "pop" : 15684, "state" : "TN" } +{ "_id" : "37407", "city" : "CHATTANOOGA", "loc" : [ -85.284913, 35.002361 ], "pop" : 8138, "state" : "TN" } +{ "_id" : "37408", "city" : "CHATTANOOGA", "loc" : [ -85.306809, 35.029236 ], "pop" : 2131, "state" : "TN" } +{ "_id" : "37409", "city" : "CHATTANOOGA", "loc" : [ -85.33101600000001, 34.99809 ], "pop" : 2848, "state" : "TN" } +{ "_id" : "37410", "city" : "CHATTANOOGA", "loc" : [ -85.313762, 35.001787 ], "pop" : 6068, "state" : "TN" } +{ "_id" : "37411", "city" : "CHATTANOOGA", "loc" : [ -85.23558300000001, 35.02706 ], "pop" : 18421, "state" : "TN" } +{ "_id" : "37412", "city" : "EAST RIDGE", "loc" : [ -85.23795699999999, 34.996726 ], "pop" : 20711, "state" : "TN" } +{ "_id" : "37415", "city" : "RED BANK", "loc" : [ -85.28633000000001, 35.117668 ], "pop" : 21549, "state" : "TN" } +{ "_id" : "37416", "city" : "CHATTANOOGA", "loc" : [ -85.175656, 35.094246 ], "pop" : 14197, "state" : "TN" } +{ "_id" : "37419", "city" : "CHATTANOOGA", "loc" : [ -85.36869799999999, 35.033092 ], "pop" : 5253, "state" : "TN" } +{ "_id" : "37421", "city" : "CHATTANOOGA", "loc" : [ -85.14594, 35.024986 ], "pop" : 32802, "state" : "TN" } +{ "_id" : "37601", "city" : "JOHNSON CITY", "loc" : [ -82.34077499999999, 36.333872 ], "pop" : 27978, "state" : "TN" } +{ "_id" : "37604", "city" : "JOHNSON CITY", "loc" : [ -82.38104199999999, 36.310744 ], "pop" : 31353, "state" : "TN" } +{ "_id" : "37615", "city" : "GRAY", "loc" : [ -82.44712800000001, 36.41006 ], "pop" : 12119, "state" : "TN" } +{ "_id" : "37616", "city" : "AFTON", "loc" : [ -82.746667, 36.204166 ], "pop" : 3469, "state" : "TN" } +{ "_id" : "37617", "city" : "BLOUNTVILLE", "loc" : [ -82.36555799999999, 36.53562 ], "pop" : 14517, "state" : "TN" } +{ "_id" : "37618", "city" : "BLUFF CITY", "loc" : [ -82.236181, 36.477391 ], "pop" : 11146, "state" : "TN" } +{ "_id" : "37620", "city" : "BRISTOL", "loc" : [ -82.181864, 36.568643 ], "pop" : 36852, "state" : "TN" } +{ "_id" : "37640", "city" : "BUTLER", "loc" : [ -81.985614, 36.328158 ], "pop" : 3479, "state" : "TN" } +{ "_id" : "37641", "city" : "CHUCKEY", "loc" : [ -82.66744799999999, 36.221142 ], "pop" : 6362, "state" : "TN" } +{ "_id" : "37642", "city" : "CHURCH HILL", "loc" : [ -82.725184, 36.539926 ], "pop" : 9106, "state" : "TN" } +{ "_id" : "37643", "city" : "ELIZABETHTON", "loc" : [ -82.201481, 36.344548 ], "pop" : 32046, "state" : "TN" } +{ "_id" : "37645", "city" : "MOUNT CARMEL", "loc" : [ -82.653217, 36.562913 ], "pop" : 6249, "state" : "TN" } +{ "_id" : "37650", "city" : "ERWIN", "loc" : [ -82.41631, 36.134193 ], "pop" : 11635, "state" : "TN" } +{ "_id" : "37656", "city" : "FALL BRANCH", "loc" : [ -82.62560499999999, 36.415839 ], "pop" : 1964, "state" : "TN" } +{ "_id" : "37657", "city" : "FLAG POND", "loc" : [ -82.56230100000001, 36.008507 ], "pop" : 1066, "state" : "TN" } +{ "_id" : "37658", "city" : "HAMPTON", "loc" : [ -82.189144, 36.257743 ], "pop" : 4828, "state" : "TN" } +{ "_id" : "37659", "city" : "JONESBOROUGH", "loc" : [ -82.490225, 36.295426 ], "pop" : 18736, "state" : "TN" } +{ "_id" : "37660", "city" : "BLOOMINGDALE", "loc" : [ -82.554034, 36.552766 ], "pop" : 37726, "state" : "TN" } +{ "_id" : "37663", "city" : "COLONIAL HEIGHTS", "loc" : [ -82.4948, 36.4693 ], "pop" : 12097, "state" : "TN" } +{ "_id" : "37664", "city" : "KINGSPORT", "loc" : [ -82.516835, 36.520834 ], "pop" : 22289, "state" : "TN" } +{ "_id" : "37665", "city" : "LYNN GARDEN", "loc" : [ -82.569906, 36.578305 ], "pop" : 6024, "state" : "TN" } +{ "_id" : "37680", "city" : "LAUREL BLOOMERY", "loc" : [ -81.725537, 36.574946 ], "pop" : 670, "state" : "TN" } +{ "_id" : "37681", "city" : "WASHINGTON COLLE", "loc" : [ -82.61709, 36.236968 ], "pop" : 4354, "state" : "TN" } +{ "_id" : "37683", "city" : "MOUNTAIN CITY", "loc" : [ -81.813999, 36.465724 ], "pop" : 9205, "state" : "TN" } +{ "_id" : "37686", "city" : "PINEY FLATS", "loc" : [ -82.333957, 36.446122 ], "pop" : 5130, "state" : "TN" } +{ "_id" : "37687", "city" : "ROAN MOUNTAIN", "loc" : [ -82.081041, 36.177333 ], "pop" : 4234, "state" : "TN" } +{ "_id" : "37688", "city" : "SHADY VALLEY", "loc" : [ -81.906797, 36.527218 ], "pop" : 1053, "state" : "TN" } +{ "_id" : "37690", "city" : "TELFORD", "loc" : [ -82.536935, 36.245053 ], "pop" : 2662, "state" : "TN" } +{ "_id" : "37691", "city" : "TRADE", "loc" : [ -81.757234, 36.368328 ], "pop" : 763, "state" : "TN" } +{ "_id" : "37692", "city" : "UNICOI", "loc" : [ -82.321957, 36.206585 ], "pop" : 3838, "state" : "TN" } +{ "_id" : "37694", "city" : "WATAUGA", "loc" : [ -82.26826199999999, 36.370157 ], "pop" : 2033, "state" : "TN" } +{ "_id" : "37701", "city" : "ALCOA", "loc" : [ -83.980895, 35.78522 ], "pop" : 5891, "state" : "TN" } +{ "_id" : "37705", "city" : "ANDERSONVILLE", "loc" : [ -84.054399, 36.191514 ], "pop" : 5761, "state" : "TN" } +{ "_id" : "37708", "city" : "BEAN STATION", "loc" : [ -83.31424800000001, 36.32493 ], "pop" : 5255, "state" : "TN" } +{ "_id" : "37709", "city" : "BLAINE", "loc" : [ -83.67827200000001, 36.15832 ], "pop" : 2556, "state" : "TN" } +{ "_id" : "37710", "city" : "DEVONIA", "loc" : [ -84.215968, 36.185426 ], "pop" : 2225, "state" : "TN" } +{ "_id" : "37711", "city" : "BULLS GAP", "loc" : [ -83.03149000000001, 36.325707 ], "pop" : 5876, "state" : "TN" } +{ "_id" : "37713", "city" : "BYBEE", "loc" : [ -83.163071, 36.073957 ], "pop" : 2911, "state" : "TN" } +{ "_id" : "37714", "city" : "CARYVILLE", "loc" : [ -84.18979400000001, 36.285422 ], "pop" : 3811, "state" : "TN" } +{ "_id" : "37715", "city" : "CLAIRFIELD", "loc" : [ -83.93969300000001, 36.565026 ], "pop" : 1239, "state" : "TN" } +{ "_id" : "37716", "city" : "CLINTON", "loc" : [ -84.189735, 36.08688 ], "pop" : 21075, "state" : "TN" } +{ "_id" : "37721", "city" : "CORRYTON", "loc" : [ -83.813, 36.120011 ], "pop" : 7557, "state" : "TN" } +{ "_id" : "37722", "city" : "COSBY", "loc" : [ -83.218743, 35.834693 ], "pop" : 3800, "state" : "TN" } +{ "_id" : "37723", "city" : "CRAB ORCHARD", "loc" : [ -84.858577, 35.889763 ], "pop" : 2307, "state" : "TN" } +{ "_id" : "37724", "city" : "CUMBERLAND GAP", "loc" : [ -83.681049, 36.550381 ], "pop" : 3142, "state" : "TN" } +{ "_id" : "37725", "city" : "DANDRIDGE", "loc" : [ -83.40443500000001, 36.001798 ], "pop" : 8707, "state" : "TN" } +{ "_id" : "37726", "city" : "DEER LODGE", "loc" : [ -84.819074, 36.217584 ], "pop" : 538, "state" : "TN" } +{ "_id" : "37727", "city" : "DEL RIO", "loc" : [ -83.01500799999999, 35.882967 ], "pop" : 1616, "state" : "TN" } +{ "_id" : "37729", "city" : "DUFF", "loc" : [ -84.01246999999999, 36.411035 ], "pop" : 4265, "state" : "TN" } +{ "_id" : "37731", "city" : "EIDSON", "loc" : [ -83.08271999999999, 36.499522 ], "pop" : 901, "state" : "TN" } +{ "_id" : "37737", "city" : "FRIENDSVILLE", "loc" : [ -84.10606900000001, 35.752302 ], "pop" : 4186, "state" : "TN" } +{ "_id" : "37738", "city" : "GATLINBURG", "loc" : [ -83.48740599999999, 35.728976 ], "pop" : 4352, "state" : "TN" } +{ "_id" : "37742", "city" : "GREENBACK", "loc" : [ -84.170959, 35.656738 ], "pop" : 3272, "state" : "TN" } +{ "_id" : "37743", "city" : "BAILEYTON", "loc" : [ -82.833136, 36.160807 ], "pop" : 39225, "state" : "TN" } +{ "_id" : "37748", "city" : "HARRIMAN", "loc" : [ -84.51552599999999, 35.934785 ], "pop" : 18558, "state" : "TN" } +{ "_id" : "37752", "city" : "HARROGATE", "loc" : [ -83.60726200000001, 36.576718 ], "pop" : 4683, "state" : "TN" } +{ "_id" : "37753", "city" : "HARTFORD", "loc" : [ -83.099642, 35.825597 ], "pop" : 733, "state" : "TN" } +{ "_id" : "37754", "city" : "HEISKELL", "loc" : [ -84.043826, 36.115027 ], "pop" : 2945, "state" : "TN" } +{ "_id" : "37755", "city" : "HELENWOOD", "loc" : [ -84.538088, 36.43294 ], "pop" : 2583, "state" : "TN" } +{ "_id" : "37756", "city" : "HUNTSVILLE", "loc" : [ -84.428832, 36.398329 ], "pop" : 4760, "state" : "TN" } +{ "_id" : "37757", "city" : "JACKSBORO", "loc" : [ -84.192835, 36.326615 ], "pop" : 4967, "state" : "TN" } +{ "_id" : "37760", "city" : "JEFFERSON CITY", "loc" : [ -83.480982, 36.11633 ], "pop" : 9438, "state" : "TN" } +{ "_id" : "37762", "city" : "JELLICO", "loc" : [ -84.118067, 36.554407 ], "pop" : 6317, "state" : "TN" } +{ "_id" : "37763", "city" : "KINGSTON", "loc" : [ -84.49705400000001, 35.852807 ], "pop" : 11002, "state" : "TN" } +{ "_id" : "37764", "city" : "KODAK", "loc" : [ -83.61711099999999, 35.972215 ], "pop" : 4104, "state" : "TN" } +{ "_id" : "37765", "city" : "KYLES FORD", "loc" : [ -83.050712, 36.572072 ], "pop" : 931, "state" : "TN" } +{ "_id" : "37766", "city" : "MORLEY", "loc" : [ -84.11156800000001, 36.368967 ], "pop" : 14939, "state" : "TN" } +{ "_id" : "37769", "city" : "LAKE CITY", "loc" : [ -84.13856699999999, 36.203223 ], "pop" : 6099, "state" : "TN" } +{ "_id" : "37770", "city" : "LANCING", "loc" : [ -84.71351900000001, 36.145644 ], "pop" : 2345, "state" : "TN" } +{ "_id" : "37771", "city" : "LENOIR CITY", "loc" : [ -84.26650100000001, 35.810391 ], "pop" : 18523, "state" : "TN" } +{ "_id" : "37774", "city" : "LOUDON", "loc" : [ -84.34362, 35.729211 ], "pop" : 11116, "state" : "TN" } +{ "_id" : "37777", "city" : "LOUISVILLE", "loc" : [ -84.008895, 35.837465 ], "pop" : 9618, "state" : "TN" } +{ "_id" : "37778", "city" : "LOWLAND", "loc" : [ -83.244592, 36.164016 ], "pop" : 166, "state" : "TN" } +{ "_id" : "37779", "city" : "LUTTRELL", "loc" : [ -83.75997599999999, 36.200136 ], "pop" : 3554, "state" : "TN" } +{ "_id" : "37801", "city" : "MARYVILLE", "loc" : [ -83.914541, 35.782449 ], "pop" : 24011, "state" : "TN" } +{ "_id" : "37804", "city" : "MARYVILLE", "loc" : [ -84.004491, 35.715659 ], "pop" : 31758, "state" : "TN" } +{ "_id" : "37806", "city" : "MASCOT", "loc" : [ -83.741101, 36.084421 ], "pop" : 2781, "state" : "TN" } +{ "_id" : "37807", "city" : "MAYNARDVILLE", "loc" : [ -83.840261, 36.234274 ], "pop" : 8998, "state" : "TN" } +{ "_id" : "37809", "city" : "MIDWAY", "loc" : [ -83.02814100000001, 36.150995 ], "pop" : 824, "state" : "TN" } +{ "_id" : "37810", "city" : "MOHAWK", "loc" : [ -83.09018500000001, 36.186919 ], "pop" : 1765, "state" : "TN" } +{ "_id" : "37811", "city" : "MOORESBURG", "loc" : [ -83.20949899999999, 36.362082 ], "pop" : 2628, "state" : "TN" } +{ "_id" : "37813", "city" : "MORRISTOWN", "loc" : [ -83.275519, 36.195672 ], "pop" : 15333, "state" : "TN" } +{ "_id" : "37814", "city" : "MORRISTOWN", "loc" : [ -83.31185000000001, 36.224782 ], "pop" : 26285, "state" : "TN" } +{ "_id" : "37818", "city" : "MOSHEIM", "loc" : [ -82.967399, 36.183883 ], "pop" : 4337, "state" : "TN" } +{ "_id" : "37819", "city" : "NEWCOMB", "loc" : [ -84.17984800000001, 36.542768 ], "pop" : 52, "state" : "TN" } +{ "_id" : "37820", "city" : "NEW MARKET", "loc" : [ -83.56725299999999, 36.081037 ], "pop" : 5751, "state" : "TN" } +{ "_id" : "37821", "city" : "NEWPORT", "loc" : [ -83.202749, 35.954431 ], "pop" : 16780, "state" : "TN" } +{ "_id" : "37825", "city" : "NEW TAZEWELL", "loc" : [ -83.64694900000001, 36.424475 ], "pop" : 5602, "state" : "TN" } +{ "_id" : "37826", "city" : "NIOTA", "loc" : [ -84.57214999999999, 35.581924 ], "pop" : 2182, "state" : "TN" } +{ "_id" : "37829", "city" : "OAKDALE", "loc" : [ -84.575295, 36.009962 ], "pop" : 3901, "state" : "TN" } +{ "_id" : "37830", "city" : "OAK RIDGE", "loc" : [ -84.262297, 36.01588 ], "pop" : 27605, "state" : "TN" } +{ "_id" : "37840", "city" : "OLIVER SPRINGS", "loc" : [ -84.34863199999999, 36.036616 ], "pop" : 1324, "state" : "TN" } +{ "_id" : "37841", "city" : "ONEIDA", "loc" : [ -84.529319, 36.505259 ], "pop" : 7010, "state" : "TN" } +{ "_id" : "37843", "city" : "PARROTTSVILLE", "loc" : [ -83.073627, 35.998297 ], "pop" : 3301, "state" : "TN" } +{ "_id" : "37845", "city" : "PETROS", "loc" : [ -84.439914, 36.055903 ], "pop" : 4330, "state" : "TN" } +{ "_id" : "37846", "city" : "PHILADELPHIA", "loc" : [ -84.450221, 35.664214 ], "pop" : 1523, "state" : "TN" } +{ "_id" : "37847", "city" : "PIONEER", "loc" : [ -84.290672, 36.469465 ], "pop" : 476, "state" : "TN" } +{ "_id" : "37848", "city" : "POWDER SPRINGS", "loc" : [ -83.672921, 36.254899 ], "pop" : 381, "state" : "TN" } +{ "_id" : "37849", "city" : "POWELL", "loc" : [ -84.039987, 36.043454 ], "pop" : 14646, "state" : "TN" } +{ "_id" : "37852", "city" : "ROBBINS", "loc" : [ -84.590417, 36.352693 ], "pop" : 2639, "state" : "TN" } +{ "_id" : "37853", "city" : "ROCKFORD", "loc" : [ -83.941202, 35.830519 ], "pop" : 3347, "state" : "TN" } +{ "_id" : "37854", "city" : "ROCKWOOD", "loc" : [ -84.68418800000001, 35.858677 ], "pop" : 10384, "state" : "TN" } +{ "_id" : "37857", "city" : "ROGERSVILLE", "loc" : [ -83.010786, 36.416196 ], "pop" : 10374, "state" : "TN" } +{ "_id" : "37860", "city" : "RUSSELLVILLE", "loc" : [ -83.19138, 36.256684 ], "pop" : 2329, "state" : "TN" } +{ "_id" : "37861", "city" : "RUTLEDGE", "loc" : [ -83.512468, 36.250078 ], "pop" : 6019, "state" : "TN" } +{ "_id" : "37862", "city" : "SEVIERVILLE", "loc" : [ -83.53862100000001, 35.845192 ], "pop" : 30351, "state" : "TN" } +{ "_id" : "37863", "city" : "PIGEON FORGE", "loc" : [ -83.563821, 35.792222 ], "pop" : 3063, "state" : "TN" } +{ "_id" : "37865", "city" : "SEYMOUR", "loc" : [ -83.749511, 35.869984 ], "pop" : 8527, "state" : "TN" } +{ "_id" : "37866", "city" : "SHARPS CHAPEL", "loc" : [ -83.81268, 36.368498 ], "pop" : 1405, "state" : "TN" } +{ "_id" : "37869", "city" : "SNEEDVILLE", "loc" : [ -83.252892, 36.527515 ], "pop" : 5203, "state" : "TN" } +{ "_id" : "37870", "city" : "SPEEDWELL", "loc" : [ -83.813495, 36.479723 ], "pop" : 2895, "state" : "TN" } +{ "_id" : "37871", "city" : "STRAWBERRY PLAIN", "loc" : [ -83.677724, 36.041462 ], "pop" : 5600, "state" : "TN" } +{ "_id" : "37872", "city" : "SUNBRIGHT", "loc" : [ -84.69842, 36.262234 ], "pop" : 2210, "state" : "TN" } +{ "_id" : "37873", "city" : "SURGOINSVILLE", "loc" : [ -82.830597, 36.474066 ], "pop" : 7229, "state" : "TN" } +{ "_id" : "37874", "city" : "SWEETWATER", "loc" : [ -84.430424, 35.595703 ], "pop" : 11415, "state" : "TN" } +{ "_id" : "37877", "city" : "TALBOTT", "loc" : [ -83.412864, 36.159958 ], "pop" : 6279, "state" : "TN" } +{ "_id" : "37878", "city" : "TALLASSEE", "loc" : [ -84.003338, 35.583663 ], "pop" : 376, "state" : "TN" } +{ "_id" : "37879", "city" : "TAZEWELL", "loc" : [ -83.55521899999999, 36.471012 ], "pop" : 8567, "state" : "TN" } +{ "_id" : "37880", "city" : "TEN MILE", "loc" : [ -84.654848, 35.686175 ], "pop" : 4355, "state" : "TN" } +{ "_id" : "37881", "city" : "THORN HILL", "loc" : [ -83.365973, 36.391687 ], "pop" : 1676, "state" : "TN" } +{ "_id" : "37882", "city" : "TOWNSEND", "loc" : [ -83.75715700000001, 35.678385 ], "pop" : 1951, "state" : "TN" } +{ "_id" : "37883", "city" : "TREADWAY", "loc" : [ -83.219138, 36.428202 ], "pop" : 78, "state" : "TN" } +{ "_id" : "37885", "city" : "VONORE", "loc" : [ -84.177829, 35.535364 ], "pop" : 1541, "state" : "TN" } +{ "_id" : "37886", "city" : "WALLAND", "loc" : [ -83.824307, 35.753311 ], "pop" : 3972, "state" : "TN" } +{ "_id" : "37887", "city" : "WARTBURG", "loc" : [ -84.56518800000001, 36.101609 ], "pop" : 3976, "state" : "TN" } +{ "_id" : "37888", "city" : "WASHBURN", "loc" : [ -83.59368499999999, 36.310649 ], "pop" : 1737, "state" : "TN" } +{ "_id" : "37890", "city" : "BANEBERRY", "loc" : [ -83.287921, 36.090299 ], "pop" : 4639, "state" : "TN" } +{ "_id" : "37891", "city" : "WHITESBURG", "loc" : [ -83.145844, 36.262125 ], "pop" : 2265, "state" : "TN" } +{ "_id" : "37892", "city" : "WINFIELD", "loc" : [ -84.434026, 36.559825 ], "pop" : 1375, "state" : "TN" } +{ "_id" : "37902", "city" : "KNOXVILLE", "loc" : [ -83.92091499999999, 35.962516 ], "pop" : 1457, "state" : "TN" } +{ "_id" : "37909", "city" : "KNOXVILLE", "loc" : [ -84.023501, 35.945978 ], "pop" : 13265, "state" : "TN" } +{ "_id" : "37912", "city" : "KNOXVILLE", "loc" : [ -83.977317, 36.005492 ], "pop" : 16919, "state" : "TN" } +{ "_id" : "37914", "city" : "KNOXVILLE", "loc" : [ -83.84962400000001, 35.991755 ], "pop" : 19867, "state" : "TN" } +{ "_id" : "37915", "city" : "KNOXVILLE", "loc" : [ -83.901005, 35.972074 ], "pop" : 6546, "state" : "TN" } +{ "_id" : "37916", "city" : "KNOXVILLE", "loc" : [ -83.933576, 35.955584 ], "pop" : 11449, "state" : "TN" } +{ "_id" : "37917", "city" : "KNOXVILLE", "loc" : [ -83.915216, 35.99803 ], "pop" : 25362, "state" : "TN" } +{ "_id" : "37918", "city" : "KNOXVILLE", "loc" : [ -83.922558, 36.050054 ], "pop" : 32073, "state" : "TN" } +{ "_id" : "37919", "city" : "KNOXVILLE", "loc" : [ -84.001468, 35.924385 ], "pop" : 25653, "state" : "TN" } +{ "_id" : "37920", "city" : "KIMBERLIN HEIGHT", "loc" : [ -83.87979300000001, 35.922976 ], "pop" : 35762, "state" : "TN" } +{ "_id" : "37921", "city" : "KARNS", "loc" : [ -83.982894, 35.976297 ], "pop" : 26904, "state" : "TN" } +{ "_id" : "37922", "city" : "CONCORD", "loc" : [ -84.127332, 35.877697 ], "pop" : 31414, "state" : "TN" } +{ "_id" : "37923", "city" : "KNOXVILLE", "loc" : [ -84.076116, 35.933127 ], "pop" : 22830, "state" : "TN" } +{ "_id" : "37924", "city" : "KNOXVILLE", "loc" : [ -83.80207, 36.032044 ], "pop" : 8103, "state" : "TN" } +{ "_id" : "37931", "city" : "KNOXVILLE", "loc" : [ -84.12007199999999, 35.992363 ], "pop" : 17247, "state" : "TN" } +{ "_id" : "37932", "city" : "CONCORD FARRAGUT", "loc" : [ -84.169591, 35.923619 ], "pop" : 7975, "state" : "TN" } +{ "_id" : "37938", "city" : "KNOXVILLE", "loc" : [ -83.94596799999999, 36.105473 ], "pop" : 10705, "state" : "TN" } +{ "_id" : "38001", "city" : "ALAMO", "loc" : [ -89.17646499999999, 35.801697 ], "pop" : 6528, "state" : "TN" } +{ "_id" : "38002", "city" : "ARLINGTON", "loc" : [ -89.729502, 35.275171 ], "pop" : 6781, "state" : "TN" } +{ "_id" : "38004", "city" : "ATOKA", "loc" : [ -89.8216, 35.421337 ], "pop" : 4848, "state" : "TN" } +{ "_id" : "38006", "city" : "BELLS", "loc" : [ -89.072857, 35.71976 ], "pop" : 3092, "state" : "TN" } +{ "_id" : "38008", "city" : "BOLIVAR", "loc" : [ -89.00072299999999, 35.246082 ], "pop" : 10327, "state" : "TN" } +{ "_id" : "38011", "city" : "BRIGHTON", "loc" : [ -89.752477, 35.470328 ], "pop" : 9668, "state" : "TN" } +{ "_id" : "38012", "city" : "BROWNSVILLE", "loc" : [ -89.26235200000001, 35.609957 ], "pop" : 16497, "state" : "TN" } +{ "_id" : "38015", "city" : "BURLISON", "loc" : [ -89.817729, 35.53995 ], "pop" : 2314, "state" : "TN" } +{ "_id" : "38017", "city" : "COLLIERVILLE", "loc" : [ -89.67672399999999, 35.055077 ], "pop" : 16164, "state" : "TN" } +{ "_id" : "38018", "city" : "CORDOVA", "loc" : [ -89.77893400000001, 35.156349 ], "pop" : 21777, "state" : "TN" } +{ "_id" : "38019", "city" : "COVINGTON", "loc" : [ -89.650144, 35.559838 ], "pop" : 13631, "state" : "TN" } +{ "_id" : "38023", "city" : "DRUMMONDS", "loc" : [ -89.923649, 35.445203 ], "pop" : 4891, "state" : "TN" } +{ "_id" : "38024", "city" : "DYERSBURG", "loc" : [ -89.383644, 36.044447 ], "pop" : 27839, "state" : "TN" } +{ "_id" : "38028", "city" : "EADS", "loc" : [ -89.67600400000001, 35.15512 ], "pop" : 1715, "state" : "TN" } +{ "_id" : "38030", "city" : "FINLEY", "loc" : [ -89.513403, 36.016938 ], "pop" : 830, "state" : "TN" } +{ "_id" : "38034", "city" : "FRIENDSHIP", "loc" : [ -89.20413600000001, 35.897642 ], "pop" : 1626, "state" : "TN" } +{ "_id" : "38037", "city" : "GATES", "loc" : [ -89.459182, 35.843942 ], "pop" : 2508, "state" : "TN" } +{ "_id" : "38039", "city" : "GRAND JUNCTION", "loc" : [ -89.153415, 35.065885 ], "pop" : 1827, "state" : "TN" } +{ "_id" : "38040", "city" : "HALLS", "loc" : [ -89.414671, 35.886232 ], "pop" : 3755, "state" : "TN" } +{ "_id" : "38041", "city" : "FORT PILLOW", "loc" : [ -89.637542, 35.682868 ], "pop" : 4298, "state" : "TN" } +{ "_id" : "38042", "city" : "HICKORY VALLEY", "loc" : [ -89.130905, 35.157959 ], "pop" : 269, "state" : "TN" } +{ "_id" : "38044", "city" : "HORNSBY", "loc" : [ -88.82631499999999, 35.219706 ], "pop" : 946, "state" : "TN" } +{ "_id" : "38049", "city" : "MASON", "loc" : [ -89.551805, 35.438012 ], "pop" : 2275, "state" : "TN" } +{ "_id" : "38052", "city" : "MIDDLETON", "loc" : [ -88.904625, 35.0818 ], "pop" : 3147, "state" : "TN" } +{ "_id" : "38053", "city" : "MILLINGTON", "loc" : [ -89.905422, 35.318463 ], "pop" : 38216, "state" : "TN" } +{ "_id" : "38057", "city" : "MOSCOW", "loc" : [ -89.35950800000001, 35.058796 ], "pop" : 3436, "state" : "TN" } +{ "_id" : "38059", "city" : "NEWBERN", "loc" : [ -89.251364, 36.100875 ], "pop" : 5426, "state" : "TN" } +{ "_id" : "38060", "city" : "OAKLAND", "loc" : [ -89.55176400000001, 35.222929 ], "pop" : 5935, "state" : "TN" } +{ "_id" : "38061", "city" : "POCAHONTAS", "loc" : [ -88.811559, 35.031476 ], "pop" : 570, "state" : "TN" } +{ "_id" : "38063", "city" : "RIPLEY", "loc" : [ -89.534975, 35.752651 ], "pop" : 12930, "state" : "TN" } +{ "_id" : "38066", "city" : "ROSSVILLE", "loc" : [ -89.567848, 35.076758 ], "pop" : 3730, "state" : "TN" } +{ "_id" : "38067", "city" : "SAULSBURY", "loc" : [ -89.076868, 35.049786 ], "pop" : 914, "state" : "TN" } +{ "_id" : "38068", "city" : "SOMERVILLE", "loc" : [ -89.391813, 35.277218 ], "pop" : 11757, "state" : "TN" } +{ "_id" : "38069", "city" : "STANTON", "loc" : [ -89.33262999999999, 35.448171 ], "pop" : 2940, "state" : "TN" } +{ "_id" : "38075", "city" : "WHITEVILLE", "loc" : [ -89.133692, 35.319104 ], "pop" : 3044, "state" : "TN" } +{ "_id" : "38076", "city" : "WILLISTON", "loc" : [ -89.390584, 35.166595 ], "pop" : 701, "state" : "TN" } +{ "_id" : "38079", "city" : "TIPTONVILLE", "loc" : [ -89.464922, 36.384583 ], "pop" : 4762, "state" : "TN" } +{ "_id" : "38080", "city" : "RIDGELY", "loc" : [ -89.485765, 36.263849 ], "pop" : 1819, "state" : "TN" } +{ "_id" : "38103", "city" : "MEMPHIS", "loc" : [ -90.047995, 35.144001 ], "pop" : 4144, "state" : "TN" } +{ "_id" : "38104", "city" : "MEMPHIS", "loc" : [ -90.004625, 35.133393 ], "pop" : 29496, "state" : "TN" } +{ "_id" : "38105", "city" : "MEMPHIS", "loc" : [ -90.03304199999999, 35.149748 ], "pop" : 11143, "state" : "TN" } +{ "_id" : "38106", "city" : "MEMPHIS", "loc" : [ -90.03299699999999, 35.102124 ], "pop" : 40444, "state" : "TN" } +{ "_id" : "38107", "city" : "MEMPHIS", "loc" : [ -90.020077, 35.183136 ], "pop" : 43502, "state" : "TN" } +{ "_id" : "38108", "city" : "MEMPHIS", "loc" : [ -89.968238, 35.178655 ], "pop" : 31902, "state" : "TN" } +{ "_id" : "38109", "city" : "MEMPHIS", "loc" : [ -90.073238, 35.042538 ], "pop" : 60508, "state" : "TN" } +{ "_id" : "38111", "city" : "MEMPHIS", "loc" : [ -89.945745, 35.107573 ], "pop" : 43484, "state" : "TN" } +{ "_id" : "38112", "city" : "MEMPHIS", "loc" : [ -89.97289499999999, 35.148277 ], "pop" : 21266, "state" : "TN" } +{ "_id" : "38113", "city" : "MEMPHIS", "loc" : [ -90.079426, 35.111201 ], "pop" : 68, "state" : "TN" } +{ "_id" : "38114", "city" : "MEMPHIS", "loc" : [ -89.98254, 35.098094 ], "pop" : 38708, "state" : "TN" } +{ "_id" : "38115", "city" : "HICKORY HILL", "loc" : [ -89.86082, 35.054405 ], "pop" : 34144, "state" : "TN" } +{ "_id" : "38116", "city" : "MEMPHIS", "loc" : [ -90.012314, 35.030298 ], "pop" : 46906, "state" : "TN" } +{ "_id" : "38117", "city" : "MEMPHIS", "loc" : [ -89.903367, 35.112357 ], "pop" : 27149, "state" : "TN" } +{ "_id" : "38118", "city" : "MEMPHIS", "loc" : [ -89.92653799999999, 35.051421 ], "pop" : 45507, "state" : "TN" } +{ "_id" : "38119", "city" : "MEMPHIS", "loc" : [ -89.85014200000001, 35.082101 ], "pop" : 20234, "state" : "TN" } +{ "_id" : "38120", "city" : "MEMPHIS", "loc" : [ -89.86511900000001, 35.120654 ], "pop" : 12552, "state" : "TN" } +{ "_id" : "38122", "city" : "MEMPHIS", "loc" : [ -89.926844, 35.157166 ], "pop" : 23692, "state" : "TN" } +{ "_id" : "38125", "city" : "MEMPHIS", "loc" : [ -89.81235700000001, 35.031249 ], "pop" : 10280, "state" : "TN" } +{ "_id" : "38126", "city" : "MEMPHIS", "loc" : [ -90.042444, 35.125518 ], "pop" : 16391, "state" : "TN" } +{ "_id" : "38127", "city" : "MEMPHIS", "loc" : [ -90.029623, 35.250982 ], "pop" : 8047, "state" : "TN" } +{ "_id" : "38128", "city" : "MEMPHIS", "loc" : [ -89.94131400000001, 35.221273 ], "pop" : 54198, "state" : "TN" } +{ "_id" : "38131", "city" : "MEMPHIS", "loc" : [ -90.003699, 35.0655 ], "pop" : 312, "state" : "TN" } +{ "_id" : "38132", "city" : "MEMPHIS", "loc" : [ -89.98862699999999, 35.071967 ], "pop" : 2, "state" : "TN" } +{ "_id" : "38133", "city" : "MEMPHIS", "loc" : [ -89.80356399999999, 35.205362 ], "pop" : 13227, "state" : "TN" } +{ "_id" : "38134", "city" : "BARTLETT", "loc" : [ -89.86409, 35.188639 ], "pop" : 40805, "state" : "TN" } +{ "_id" : "38135", "city" : "MEMPHIS", "loc" : [ -89.85087799999999, 35.232301 ], "pop" : 13428, "state" : "TN" } +{ "_id" : "38138", "city" : "GERMANTOWN", "loc" : [ -89.80526, 35.088344 ], "pop" : 22061, "state" : "TN" } +{ "_id" : "38139", "city" : "GERMANTOWN", "loc" : [ -89.770281, 35.087414 ], "pop" : 11771, "state" : "TN" } +{ "_id" : "38141", "city" : "MEMPHIS", "loc" : [ -89.84916, 35.023091 ], "pop" : 16247, "state" : "TN" } +{ "_id" : "38201", "city" : "MC KENZIE", "loc" : [ -88.51341600000001, 36.127195 ], "pop" : 6780, "state" : "TN" } +{ "_id" : "38220", "city" : "ATWOOD", "loc" : [ -88.624656, 35.966345 ], "pop" : 2599, "state" : "TN" } +{ "_id" : "38221", "city" : "BIG SANDY", "loc" : [ -88.062732, 36.228515 ], "pop" : 2647, "state" : "TN" } +{ "_id" : "38222", "city" : "BUCHANAN", "loc" : [ -88.151464, 36.414624 ], "pop" : 3352, "state" : "TN" } +{ "_id" : "38224", "city" : "COTTAGE GROVE", "loc" : [ -88.461421, 36.34789 ], "pop" : 1645, "state" : "TN" } +{ "_id" : "38225", "city" : "DRESDEN", "loc" : [ -88.696291, 36.295042 ], "pop" : 5475, "state" : "TN" } +{ "_id" : "38226", "city" : "DUKEDOM", "loc" : [ -88.692553, 36.479645 ], "pop" : 933, "state" : "TN" } +{ "_id" : "38229", "city" : "GLEASON", "loc" : [ -88.618441, 36.211737 ], "pop" : 3307, "state" : "TN" } +{ "_id" : "38230", "city" : "GREENFIELD", "loc" : [ -88.74532000000001, 36.148502 ], "pop" : 4682, "state" : "TN" } +{ "_id" : "38231", "city" : "HENRY", "loc" : [ -88.453609, 36.201343 ], "pop" : 1520, "state" : "TN" } +{ "_id" : "38232", "city" : "HORNBEAK", "loc" : [ -89.305617, 36.359594 ], "pop" : 3042, "state" : "TN" } +{ "_id" : "38233", "city" : "KENTON", "loc" : [ -89.022879, 36.190583 ], "pop" : 1446, "state" : "TN" } +{ "_id" : "38236", "city" : "MANSFIELD", "loc" : [ -88.285934, 36.184744 ], "pop" : 1091, "state" : "TN" } +{ "_id" : "38237", "city" : "MARTIN", "loc" : [ -88.855395, 36.342467 ], "pop" : 13540, "state" : "TN" } +{ "_id" : "38240", "city" : "OBION", "loc" : [ -89.28052, 36.265679 ], "pop" : 3419, "state" : "TN" } +{ "_id" : "38241", "city" : "PALMERSVILLE", "loc" : [ -88.614178, 36.394772 ], "pop" : 1471, "state" : "TN" } +{ "_id" : "38242", "city" : "PARIS", "loc" : [ -88.30932799999999, 36.300519 ], "pop" : 16597, "state" : "TN" } +{ "_id" : "38251", "city" : "PURYEAR", "loc" : [ -88.347193, 36.445632 ], "pop" : 2292, "state" : "TN" } +{ "_id" : "38253", "city" : "RIVES", "loc" : [ -89.037632, 36.263665 ], "pop" : 2424, "state" : "TN" } +{ "_id" : "38255", "city" : "SHARON", "loc" : [ -88.847661, 36.239454 ], "pop" : 2564, "state" : "TN" } +{ "_id" : "38256", "city" : "SPRINGVILLE", "loc" : [ -88.14594099999999, 36.265033 ], "pop" : 1391, "state" : "TN" } +{ "_id" : "38257", "city" : "SOUTH FULTON", "loc" : [ -88.880781, 36.481386 ], "pop" : 4676, "state" : "TN" } +{ "_id" : "38258", "city" : "TREZEVANT", "loc" : [ -88.61003599999999, 36.017213 ], "pop" : 2052, "state" : "TN" } +{ "_id" : "38259", "city" : "TRIMBLE", "loc" : [ -89.18626500000001, 36.201113 ], "pop" : 792, "state" : "TN" } +{ "_id" : "38260", "city" : "TROY", "loc" : [ -89.161058, 36.341644 ], "pop" : 1588, "state" : "TN" } +{ "_id" : "38261", "city" : "UNION CITY", "loc" : [ -89.06666199999999, 36.426311 ], "pop" : 17007, "state" : "TN" } +{ "_id" : "38301", "city" : "JACKSON", "loc" : [ -88.81401099999999, 35.610222 ], "pop" : 39275, "state" : "TN" } +{ "_id" : "38305", "city" : "JACKSON", "loc" : [ -88.82812699999999, 35.682875 ], "pop" : 28992, "state" : "TN" } +{ "_id" : "38310", "city" : "ADAMSVILLE", "loc" : [ -88.41336699999999, 35.25561 ], "pop" : 3042, "state" : "TN" } +{ "_id" : "38311", "city" : "BATH SPRINGS", "loc" : [ -88.12863, 35.452111 ], "pop" : 920, "state" : "TN" } +{ "_id" : "38313", "city" : "BEECH BLUFF", "loc" : [ -88.639634, 35.592156 ], "pop" : 2682, "state" : "TN" } +{ "_id" : "38315", "city" : "BETHEL SPRINGS", "loc" : [ -88.64397200000001, 35.228893 ], "pop" : 2457, "state" : "TN" } +{ "_id" : "38316", "city" : "BRADFORD", "loc" : [ -88.804593, 36.064474 ], "pop" : 2884, "state" : "TN" } +{ "_id" : "38317", "city" : "BRUCETON", "loc" : [ -88.25180400000001, 36.026792 ], "pop" : 2035, "state" : "TN" } +{ "_id" : "38318", "city" : "BUENA VISTA", "loc" : [ -88.292576, 35.943119 ], "pop" : 165, "state" : "TN" } +{ "_id" : "38320", "city" : "CAMDEN", "loc" : [ -88.111853, 36.055578 ], "pop" : 8922, "state" : "TN" } +{ "_id" : "38321", "city" : "CEDAR GROVE", "loc" : [ -88.55170200000001, 35.861261 ], "pop" : 1150, "state" : "TN" } +{ "_id" : "38326", "city" : "COUNCE", "loc" : [ -88.293567, 35.039415 ], "pop" : 2015, "state" : "TN" } +{ "_id" : "38327", "city" : "CRUMP", "loc" : [ -88.335641, 35.221641 ], "pop" : 1507, "state" : "TN" } +{ "_id" : "38328", "city" : "DARDEN", "loc" : [ -88.217688, 35.662962 ], "pop" : 533, "state" : "TN" } +{ "_id" : "38329", "city" : "DECATURVILLE", "loc" : [ -88.133413, 35.558455 ], "pop" : 2806, "state" : "TN" } +{ "_id" : "38330", "city" : "DYER", "loc" : [ -89.019226, 36.071578 ], "pop" : 4695, "state" : "TN" } +{ "_id" : "38332", "city" : "ENVILLE", "loc" : [ -88.420613, 35.439321 ], "pop" : 1041, "state" : "TN" } +{ "_id" : "38333", "city" : "EVA", "loc" : [ -88.028036, 36.078814 ], "pop" : 1536, "state" : "TN" } +{ "_id" : "38334", "city" : "FINGER", "loc" : [ -88.606709, 35.325208 ], "pop" : 1840, "state" : "TN" } +{ "_id" : "38337", "city" : "GADSDEN", "loc" : [ -88.992947, 35.779867 ], "pop" : 2132, "state" : "TN" } +{ "_id" : "38339", "city" : "GUYS", "loc" : [ -88.52076099999999, 35.014211 ], "pop" : 689, "state" : "TN" } +{ "_id" : "38340", "city" : "HENDERSON", "loc" : [ -88.639774, 35.426929 ], "pop" : 10311, "state" : "TN" } +{ "_id" : "38341", "city" : "HOLLADAY", "loc" : [ -88.091183, 35.895143 ], "pop" : 1419, "state" : "TN" } +{ "_id" : "38342", "city" : "HOLLOW ROCK", "loc" : [ -88.29013500000001, 36.056524 ], "pop" : 2547, "state" : "TN" } +{ "_id" : "38343", "city" : "HUMBOLDT", "loc" : [ -88.905652, 35.836993 ], "pop" : 13410, "state" : "TN" } +{ "_id" : "38344", "city" : "HUNTINGDON", "loc" : [ -88.42021099999999, 36.006228 ], "pop" : 7034, "state" : "TN" } +{ "_id" : "38345", "city" : "HURON", "loc" : [ -88.519549, 35.614377 ], "pop" : 1665, "state" : "TN" } +{ "_id" : "38347", "city" : "JACKS CREEK", "loc" : [ -88.501865, 35.478206 ], "pop" : 288, "state" : "TN" } +{ "_id" : "38348", "city" : "LAVINIA", "loc" : [ -88.632442, 35.85834 ], "pop" : 1183, "state" : "TN" } +{ "_id" : "38351", "city" : "LEXINGTON", "loc" : [ -88.392743, 35.651195 ], "pop" : 13554, "state" : "TN" } +{ "_id" : "38352", "city" : "LURAY", "loc" : [ -88.578422, 35.598846 ], "pop" : 94, "state" : "TN" } +{ "_id" : "38355", "city" : "MEDINA", "loc" : [ -88.762655, 35.808088 ], "pop" : 1303, "state" : "TN" } +{ "_id" : "38356", "city" : "MEDON", "loc" : [ -88.871656, 35.471804 ], "pop" : 1486, "state" : "TN" } +{ "_id" : "38357", "city" : "MICHIE", "loc" : [ -88.44046299999999, 35.060306 ], "pop" : 2297, "state" : "TN" } +{ "_id" : "38358", "city" : "MILAN", "loc" : [ -88.768844, 35.925089 ], "pop" : 11377, "state" : "TN" } +{ "_id" : "38359", "city" : "MILLEDGEVILLE", "loc" : [ -88.399125, 35.345175 ], "pop" : 449, "state" : "TN" } +{ "_id" : "38361", "city" : "MORRIS CHAPEL", "loc" : [ -88.317599, 35.302562 ], "pop" : 1272, "state" : "TN" } +{ "_id" : "38362", "city" : "OAKFIELD", "loc" : [ -88.802145, 35.754756 ], "pop" : 2239, "state" : "TN" } +{ "_id" : "38363", "city" : "PARSONS", "loc" : [ -88.11953200000001, 35.66635 ], "pop" : 5906, "state" : "TN" } +{ "_id" : "38366", "city" : "PINSON", "loc" : [ -88.730396, 35.478059 ], "pop" : 2598, "state" : "TN" } +{ "_id" : "38367", "city" : "RAMER", "loc" : [ -88.601733, 35.064181 ], "pop" : 2804, "state" : "TN" } +{ "_id" : "38368", "city" : "REAGAN", "loc" : [ -88.35077800000001, 35.50957 ], "pop" : 804, "state" : "TN" } +{ "_id" : "38369", "city" : "RUTHERFORD", "loc" : [ -88.984863, 36.130027 ], "pop" : 2265, "state" : "TN" } +{ "_id" : "38370", "city" : "SALTILLO", "loc" : [ -88.247225, 35.381467 ], "pop" : 1007, "state" : "TN" } +{ "_id" : "38371", "city" : "SARDIS", "loc" : [ -88.3058, 35.438598 ], "pop" : 1068, "state" : "TN" } +{ "_id" : "38372", "city" : "SAVANNAH", "loc" : [ -88.200541, 35.202272 ], "pop" : 15773, "state" : "TN" } +{ "_id" : "38374", "city" : "SCOTTS HILL", "loc" : [ -88.240476, 35.504992 ], "pop" : 1657, "state" : "TN" } +{ "_id" : "38375", "city" : "SELMER", "loc" : [ -88.595832, 35.169124 ], "pop" : 7264, "state" : "TN" } +{ "_id" : "38376", "city" : "SHILOH", "loc" : [ -88.350717, 35.119545 ], "pop" : 438, "state" : "TN" } +{ "_id" : "38379", "city" : "STANTONVILLE", "loc" : [ -88.436432, 35.180946 ], "pop" : 1580, "state" : "TN" } +{ "_id" : "38380", "city" : "SUGAR TREE", "loc" : [ -88.03224899999999, 35.791993 ], "pop" : 179, "state" : "TN" } +{ "_id" : "38381", "city" : "TOONE", "loc" : [ -88.935286, 35.357421 ], "pop" : 2333, "state" : "TN" } +{ "_id" : "38382", "city" : "TRENTON", "loc" : [ -88.950655, 35.971246 ], "pop" : 9011, "state" : "TN" } +{ "_id" : "38387", "city" : "WESTPORT", "loc" : [ -88.336364, 35.916918 ], "pop" : 906, "state" : "TN" } +{ "_id" : "38388", "city" : "WILDERSVILLE", "loc" : [ -88.438794, 35.769772 ], "pop" : 2828, "state" : "TN" } +{ "_id" : "38390", "city" : "YUMA", "loc" : [ -88.381878, 35.867964 ], "pop" : 1063, "state" : "TN" } +{ "_id" : "38391", "city" : "DENMARK", "loc" : [ -88.975892, 35.557059 ], "pop" : 1760, "state" : "TN" } +{ "_id" : "38392", "city" : "MERCER", "loc" : [ -89.03728, 35.481828 ], "pop" : 609, "state" : "TN" } +{ "_id" : "38401", "city" : "COLUMBIA", "loc" : [ -87.038032, 35.615577 ], "pop" : 38459, "state" : "TN" } +{ "_id" : "38425", "city" : "CLIFTON", "loc" : [ -87.94996999999999, 35.381948 ], "pop" : 1775, "state" : "TN" } +{ "_id" : "38449", "city" : "ARDMORE", "loc" : [ -86.879555, 35.057445 ], "pop" : 3560, "state" : "TN" } +{ "_id" : "38450", "city" : "COLLINWOOD", "loc" : [ -87.71848799999999, 35.163525 ], "pop" : 2558, "state" : "TN" } +{ "_id" : "38451", "city" : "CULLEOKA", "loc" : [ -87.00050299999999, 35.474914 ], "pop" : 2476, "state" : "TN" } +{ "_id" : "38452", "city" : "CYPRESS INN", "loc" : [ -87.78833, 35.057945 ], "pop" : 764, "state" : "TN" } +{ "_id" : "38453", "city" : "ARDMORE", "loc" : [ -86.91002400000001, 35.003654 ], "pop" : 204, "state" : "TN" } +{ "_id" : "38454", "city" : "DUCK RIVER", "loc" : [ -87.342336, 35.738599 ], "pop" : 1027, "state" : "TN" } +{ "_id" : "38456", "city" : "ETHRIDGE", "loc" : [ -87.303912, 35.332648 ], "pop" : 3854, "state" : "TN" } +{ "_id" : "38457", "city" : "FIVE POINTS", "loc" : [ -87.296128, 35.031046 ], "pop" : 798, "state" : "TN" } +{ "_id" : "38459", "city" : "FRANKEWING", "loc" : [ -86.781818, 35.177854 ], "pop" : 1670, "state" : "TN" } +{ "_id" : "38460", "city" : "GOODSPRING", "loc" : [ -87.127788, 35.116709 ], "pop" : 889, "state" : "TN" } +{ "_id" : "38461", "city" : "HAMPSHIRE", "loc" : [ -87.325135, 35.591482 ], "pop" : 1059, "state" : "TN" } +{ "_id" : "38462", "city" : "KIMMINS", "loc" : [ -87.55461, 35.540837 ], "pop" : 8004, "state" : "TN" } +{ "_id" : "38463", "city" : "IRON CITY", "loc" : [ -87.64732100000001, 35.056283 ], "pop" : 2249, "state" : "TN" } +{ "_id" : "38464", "city" : "LAWRENCEBURG", "loc" : [ -87.352582, 35.250668 ], "pop" : 18681, "state" : "TN" } +{ "_id" : "38468", "city" : "LEOMA", "loc" : [ -87.316773, 35.138177 ], "pop" : 3568, "state" : "TN" } +{ "_id" : "38469", "city" : "LORETTO", "loc" : [ -87.42697800000001, 35.072797 ], "pop" : 3369, "state" : "TN" } +{ "_id" : "38471", "city" : "LUTTS", "loc" : [ -87.892291, 35.113842 ], "pop" : 1070, "state" : "TN" } +{ "_id" : "38472", "city" : "LYNNVILLE", "loc" : [ -87.062877, 35.379235 ], "pop" : 2712, "state" : "TN" } +{ "_id" : "38473", "city" : "MINOR HILL", "loc" : [ -87.15219399999999, 35.050034 ], "pop" : 1482, "state" : "TN" } +{ "_id" : "38474", "city" : "MOUNT PLEASANT", "loc" : [ -87.203678, 35.530084 ], "pop" : 7952, "state" : "TN" } +{ "_id" : "38475", "city" : "OLIVEHILL", "loc" : [ -88.03903800000001, 35.266711 ], "pop" : 443, "state" : "TN" } +{ "_id" : "38476", "city" : "PRIMM SPRINGS", "loc" : [ -87.25304300000001, 35.810364 ], "pop" : 346, "state" : "TN" } +{ "_id" : "38477", "city" : "PROSPECT", "loc" : [ -87.01738400000001, 35.066626 ], "pop" : 1843, "state" : "TN" } +{ "_id" : "38478", "city" : "PULASKI", "loc" : [ -87.03926300000001, 35.209274 ], "pop" : 15310, "state" : "TN" } +{ "_id" : "38481", "city" : "SAINT JOSEPH", "loc" : [ -87.501807, 35.037556 ], "pop" : 881, "state" : "TN" } +{ "_id" : "38482", "city" : "SANTA FE", "loc" : [ -87.151543, 35.75877 ], "pop" : 2001, "state" : "TN" } +{ "_id" : "38483", "city" : "SUMMERTOWN", "loc" : [ -87.31983, 35.430673 ], "pop" : 3302, "state" : "TN" } +{ "_id" : "38485", "city" : "WAYNESBORO", "loc" : [ -87.739498, 35.322019 ], "pop" : 6381, "state" : "TN" } +{ "_id" : "38486", "city" : "WESTPOINT", "loc" : [ -87.538025, 35.139302 ], "pop" : 717, "state" : "TN" } +{ "_id" : "38487", "city" : "WILLIAMSPORT", "loc" : [ -87.225692, 35.64937 ], "pop" : 1199, "state" : "TN" } +{ "_id" : "38488", "city" : "TAFT", "loc" : [ -86.644672, 35.051731 ], "pop" : 4681, "state" : "TN" } +{ "_id" : "38501", "city" : "ALGOOD", "loc" : [ -85.49531, 36.174261 ], "pop" : 41805, "state" : "TN" } +{ "_id" : "38504", "city" : "ALLARDT", "loc" : [ -84.850784, 36.374889 ], "pop" : 3284, "state" : "TN" } +{ "_id" : "38541", "city" : "ALLONS", "loc" : [ -85.319744, 36.497002 ], "pop" : 1641, "state" : "TN" } +{ "_id" : "38542", "city" : "ALLRED", "loc" : [ -85.176084, 36.366838 ], "pop" : 2, "state" : "TN" } +{ "_id" : "38543", "city" : "ALPINE", "loc" : [ -85.152153, 36.380324 ], "pop" : 441, "state" : "TN" } +{ "_id" : "38544", "city" : "BAXTER", "loc" : [ -85.637766, 36.124917 ], "pop" : 5871, "state" : "TN" } +{ "_id" : "38545", "city" : "BLOOMINGTON SPRI", "loc" : [ -85.64785999999999, 36.219454 ], "pop" : 1089, "state" : "TN" } +{ "_id" : "38547", "city" : "BRUSH CREEK", "loc" : [ -86.02034399999999, 36.110673 ], "pop" : 656, "state" : "TN" } +{ "_id" : "38548", "city" : "BUFFALO VALLEY", "loc" : [ -85.75887899999999, 36.183311 ], "pop" : 704, "state" : "TN" } +{ "_id" : "38549", "city" : "BYRDSTOWN", "loc" : [ -85.145647, 36.570869 ], "pop" : 2898, "state" : "TN" } +{ "_id" : "38551", "city" : "CELINA", "loc" : [ -85.496551, 36.547491 ], "pop" : 4102, "state" : "TN" } +{ "_id" : "38552", "city" : "CHESTNUT MOUND", "loc" : [ -85.837402, 36.192877 ], "pop" : 784, "state" : "TN" } +{ "_id" : "38553", "city" : "CLARKRANGE", "loc" : [ -84.977737, 36.211188 ], "pop" : 1843, "state" : "TN" } +{ "_id" : "38554", "city" : "CRAWFORD", "loc" : [ -85.16876499999999, 36.23611 ], "pop" : 1213, "state" : "TN" } +{ "_id" : "38555", "city" : "FAIRFIELD GLADE", "loc" : [ -85.017171, 35.944041 ], "pop" : 26993, "state" : "TN" } +{ "_id" : "38556", "city" : "JAMESTOWN", "loc" : [ -84.935721, 36.424471 ], "pop" : 7728, "state" : "TN" } +{ "_id" : "38559", "city" : "DOYLE", "loc" : [ -85.498997, 35.872206 ], "pop" : 1802, "state" : "TN" } +{ "_id" : "38560", "city" : "ELMWOOD", "loc" : [ -85.880843, 36.235468 ], "pop" : 937, "state" : "TN" } +{ "_id" : "38562", "city" : "GAINESBORO", "loc" : [ -85.635509, 36.343767 ], "pop" : 6883, "state" : "TN" } +{ "_id" : "38563", "city" : "GORDONSVILLE", "loc" : [ -86.000818, 36.184317 ], "pop" : 2630, "state" : "TN" } +{ "_id" : "38564", "city" : "GRANVILLE", "loc" : [ -85.747533, 36.276847 ], "pop" : 381, "state" : "TN" } +{ "_id" : "38565", "city" : "GRIMSLEY", "loc" : [ -85.01549, 36.243353 ], "pop" : 1092, "state" : "TN" } +{ "_id" : "38567", "city" : "HICKMAN", "loc" : [ -85.902297, 36.119653 ], "pop" : 836, "state" : "TN" } +{ "_id" : "38568", "city" : "HILHAM", "loc" : [ -85.43691800000001, 36.391492 ], "pop" : 1976, "state" : "TN" } +{ "_id" : "38569", "city" : "LANCASTER", "loc" : [ -85.85509500000001, 36.09542 ], "pop" : 261, "state" : "TN" } +{ "_id" : "38570", "city" : "LIVINGSTON", "loc" : [ -85.32052299999999, 36.389012 ], "pop" : 7274, "state" : "TN" } +{ "_id" : "38573", "city" : "MONROE", "loc" : [ -85.216385, 36.464201 ], "pop" : 1951, "state" : "TN" } +{ "_id" : "38574", "city" : "MONTEREY", "loc" : [ -85.254198, 36.150862 ], "pop" : 5030, "state" : "TN" } +{ "_id" : "38575", "city" : "MOSS", "loc" : [ -85.677235, 36.596623 ], "pop" : 980, "state" : "TN" } +{ "_id" : "38577", "city" : "PALL MALL", "loc" : [ -85.03838500000001, 36.578066 ], "pop" : 1537, "state" : "TN" } +{ "_id" : "38578", "city" : "PLEASANT HILL", "loc" : [ -85.16694, 36.01121 ], "pop" : 4954, "state" : "TN" } +{ "_id" : "38579", "city" : "QUEBECK", "loc" : [ -85.538189, 35.825379 ], "pop" : 1250, "state" : "TN" } +{ "_id" : "38580", "city" : "RICKMAN", "loc" : [ -85.380572, 36.301933 ], "pop" : 2109, "state" : "TN" } +{ "_id" : "38581", "city" : "BONE CAVE", "loc" : [ -85.63515599999999, 35.743813 ], "pop" : 3954, "state" : "TN" } +{ "_id" : "38582", "city" : "SILVER POINT", "loc" : [ -85.733801, 36.100562 ], "pop" : 954, "state" : "TN" } +{ "_id" : "38583", "city" : "RAVENSCROFT", "loc" : [ -85.478582, 35.954664 ], "pop" : 16814, "state" : "TN" } +{ "_id" : "38585", "city" : "SPENCER", "loc" : [ -85.42866100000001, 35.727871 ], "pop" : 3954, "state" : "TN" } +{ "_id" : "38587", "city" : "WALLING", "loc" : [ -85.618509, 35.869543 ], "pop" : 641, "state" : "TN" } +{ "_id" : "38588", "city" : "WHITLEYVILLE", "loc" : [ -85.68987300000001, 36.515839 ], "pop" : 1272, "state" : "TN" } +{ "_id" : "38589", "city" : "WILDER", "loc" : [ -85.07471700000001, 36.230526 ], "pop" : 178, "state" : "TN" } +{ "_id" : "38601", "city" : "ABBEVILLE", "loc" : [ -89.56883500000001, 34.455553 ], "pop" : 4649, "state" : "MS" } +{ "_id" : "38603", "city" : "CANNON", "loc" : [ -89.205428, 34.79456 ], "pop" : 3226, "state" : "MS" } +{ "_id" : "38606", "city" : "BATESVILLE", "loc" : [ -89.91418, 34.331651 ], "pop" : 9879, "state" : "MS" } +{ "_id" : "38610", "city" : "BLUE MOUNTAIN", "loc" : [ -89.008775, 34.670986 ], "pop" : 3857, "state" : "MS" } +{ "_id" : "38611", "city" : "BYHALIA", "loc" : [ -89.676332, 34.885351 ], "pop" : 11054, "state" : "MS" } +{ "_id" : "38614", "city" : "STOVALL", "loc" : [ -90.577755, 34.204984 ], "pop" : 26774, "state" : "MS" } +{ "_id" : "38617", "city" : "COAHOMA", "loc" : [ -90.472748, 34.36247 ], "pop" : 3055, "state" : "MS" } +{ "_id" : "38618", "city" : "COLDWATER", "loc" : [ -89.98688199999999, 34.692362 ], "pop" : 7247, "state" : "MS" } +{ "_id" : "38619", "city" : "COMO", "loc" : [ -89.915508, 34.513728 ], "pop" : 3568, "state" : "MS" } +{ "_id" : "38620", "city" : "COURTLAND", "loc" : [ -89.93959099999999, 34.25958 ], "pop" : 6765, "state" : "MS" } +{ "_id" : "38621", "city" : "ASKEW", "loc" : [ -90.185524, 34.453966 ], "pop" : 4693, "state" : "MS" } +{ "_id" : "38625", "city" : "DUMAS", "loc" : [ -88.80722900000001, 34.64915 ], "pop" : 2219, "state" : "MS" } +{ "_id" : "38626", "city" : "DUNDEE", "loc" : [ -90.38907, 34.528181 ], "pop" : 1443, "state" : "MS" } +{ "_id" : "38627", "city" : "ETTA", "loc" : [ -89.176706, 34.435231 ], "pop" : 1560, "state" : "MS" } +{ "_id" : "38629", "city" : "FALKNER", "loc" : [ -88.952493, 34.841682 ], "pop" : 1408, "state" : "MS" } +{ "_id" : "38632", "city" : "HERNANDO", "loc" : [ -90.00948699999999, 34.809588 ], "pop" : 10894, "state" : "MS" } +{ "_id" : "38633", "city" : "HICKORY FLAT", "loc" : [ -89.186229, 34.624362 ], "pop" : 1692, "state" : "MS" } +{ "_id" : "38635", "city" : "HOLLY SPRINGS", "loc" : [ -89.48971400000001, 34.747061 ], "pop" : 12519, "state" : "MS" } +{ "_id" : "38637", "city" : "HORN LAKE", "loc" : [ -90.050719, 34.9519 ], "pop" : 14436, "state" : "MS" } +{ "_id" : "38641", "city" : "LAKE CORMORANT", "loc" : [ -90.16079499999999, 34.893733 ], "pop" : 1587, "state" : "MS" } +{ "_id" : "38642", "city" : "LAMAR", "loc" : [ -89.31632999999999, 34.927072 ], "pop" : 2761, "state" : "MS" } +{ "_id" : "38643", "city" : "LAMBERT", "loc" : [ -90.262991, 34.183719 ], "pop" : 3378, "state" : "MS" } +{ "_id" : "38645", "city" : "LYON", "loc" : [ -90.498147, 34.247369 ], "pop" : 1132, "state" : "MS" } +{ "_id" : "38646", "city" : "MARKS", "loc" : [ -90.28160200000001, 34.260735 ], "pop" : 4715, "state" : "MS" } +{ "_id" : "38647", "city" : "MICHIGAN CITY", "loc" : [ -89.136173, 34.931849 ], "pop" : 1574, "state" : "MS" } +{ "_id" : "38650", "city" : "MYRTLE", "loc" : [ -89.115701, 34.540209 ], "pop" : 2613, "state" : "MS" } +{ "_id" : "38651", "city" : "NESBIT", "loc" : [ -90.012199, 34.899189 ], "pop" : 4098, "state" : "MS" } +{ "_id" : "38652", "city" : "NEW ALBANY", "loc" : [ -89.003058, 34.485051 ], "pop" : 14109, "state" : "MS" } +{ "_id" : "38654", "city" : "OLIVE BRANCH", "loc" : [ -89.854427, 34.94414 ], "pop" : 14069, "state" : "MS" } +{ "_id" : "38655", "city" : "LAFAYETTE", "loc" : [ -89.49692, 34.354354 ], "pop" : 22599, "state" : "MS" } +{ "_id" : "38657", "city" : "PLEASANT GROVE", "loc" : [ -90.10249399999999, 34.469951 ], "pop" : 80, "state" : "MS" } +{ "_id" : "38658", "city" : "POPE", "loc" : [ -90.002735, 34.190559 ], "pop" : 1860, "state" : "MS" } +{ "_id" : "38659", "city" : "POTTS CAMP", "loc" : [ -89.315073, 34.604742 ], "pop" : 1580, "state" : "MS" } +{ "_id" : "38661", "city" : "RED BANKS", "loc" : [ -89.519839, 34.875039 ], "pop" : 4860, "state" : "MS" } +{ "_id" : "38663", "city" : "RIPLEY", "loc" : [ -88.923973, 34.750912 ], "pop" : 8895, "state" : "MS" } +{ "_id" : "38664", "city" : "ROBINSONVILLE", "loc" : [ -90.30517399999999, 34.809329 ], "pop" : 547, "state" : "MS" } +{ "_id" : "38665", "city" : "SAVAGE", "loc" : [ -90.138193, 34.611981 ], "pop" : 1936, "state" : "MS" } +{ "_id" : "38666", "city" : "SARDIS", "loc" : [ -89.922083, 34.427573 ], "pop" : 5023, "state" : "MS" } +{ "_id" : "38668", "city" : "SENATOBIA", "loc" : [ -89.885501, 34.632306 ], "pop" : 12249, "state" : "MS" } +{ "_id" : "38670", "city" : "SLEDGE", "loc" : [ -90.20904, 34.382347 ], "pop" : 201, "state" : "MS" } +{ "_id" : "38671", "city" : "SOUTHAVEN", "loc" : [ -89.999173, 34.977074 ], "pop" : 19174, "state" : "MS" } +{ "_id" : "38673", "city" : "TAYLOR", "loc" : [ -89.627278, 34.284878 ], "pop" : 2374, "state" : "MS" } +{ "_id" : "38674", "city" : "TIPLERSVILLE", "loc" : [ -88.915684, 34.90294 ], "pop" : 909, "state" : "MS" } +{ "_id" : "38676", "city" : "TUNICA", "loc" : [ -90.368515, 34.688355 ], "pop" : 6174, "state" : "MS" } +{ "_id" : "38677", "city" : "UNIVERSITY", "loc" : [ -89.582742, 34.364513 ], "pop" : 1902, "state" : "MS" } +{ "_id" : "38680", "city" : "WALLS", "loc" : [ -90.120789, 34.964051 ], "pop" : 2181, "state" : "MS" } +{ "_id" : "38683", "city" : "WALNUT", "loc" : [ -88.905337, 34.952732 ], "pop" : 2553, "state" : "MS" } +{ "_id" : "38685", "city" : "WATERFORD", "loc" : [ -89.468298, 34.640248 ], "pop" : 892, "state" : "MS" } +{ "_id" : "38701", "city" : "GREENVILLE", "loc" : [ -91.04679299999999, 33.378737 ], "pop" : 35884, "state" : "MS" } +{ "_id" : "38703", "city" : "GREENVILLE", "loc" : [ -91.022795, 33.408494 ], "pop" : 18560, "state" : "MS" } +{ "_id" : "38720", "city" : "ALLIGATOR", "loc" : [ -90.738214, 34.129425 ], "pop" : 969, "state" : "MS" } +{ "_id" : "38721", "city" : "ANGUILLA", "loc" : [ -90.809535, 33.01213 ], "pop" : 2557, "state" : "MS" } +{ "_id" : "38725", "city" : "BENOIT", "loc" : [ -91.033765, 33.644795 ], "pop" : 1554, "state" : "MS" } +{ "_id" : "38726", "city" : "BEULAH", "loc" : [ -90.979545, 33.787954 ], "pop" : 467, "state" : "MS" } +{ "_id" : "38730", "city" : "BOYLE", "loc" : [ -90.733503, 33.685369 ], "pop" : 1934, "state" : "MS" } +{ "_id" : "38732", "city" : "CLEVELAND", "loc" : [ -90.73087099999999, 33.743002 ], "pop" : 20953, "state" : "MS" } +{ "_id" : "38736", "city" : "DODDSVILLE", "loc" : [ -90.52637, 33.630045 ], "pop" : 309, "state" : "MS" } +{ "_id" : "38737", "city" : "DREW", "loc" : [ -90.540606, 33.867031 ], "pop" : 7680, "state" : "MS" } +{ "_id" : "38740", "city" : "DUNCAN", "loc" : [ -90.765191, 34.046966 ], "pop" : 885, "state" : "MS" } +{ "_id" : "38744", "city" : "GLEN ALLAN", "loc" : [ -91.009193, 33.025361 ], "pop" : 734, "state" : "MS" } +{ "_id" : "38746", "city" : "GUNNISON", "loc" : [ -90.931899, 33.943886 ], "pop" : 1248, "state" : "MS" } +{ "_id" : "38748", "city" : "PERCY", "loc" : [ -90.84857, 33.177917 ], "pop" : 4499, "state" : "MS" } +{ "_id" : "38751", "city" : "BAIRD", "loc" : [ -90.654144, 33.449075 ], "pop" : 13001, "state" : "MS" } +{ "_id" : "38753", "city" : "INVERNESS", "loc" : [ -90.605065, 33.348964 ], "pop" : 2140, "state" : "MS" } +{ "_id" : "38754", "city" : "ISOLA", "loc" : [ -90.604027, 33.247112 ], "pop" : 1674, "state" : "MS" } +{ "_id" : "38756", "city" : "ELIZABETH", "loc" : [ -90.89280100000001, 33.410025 ], "pop" : 8047, "state" : "MS" } +{ "_id" : "38759", "city" : "MERIGOLD", "loc" : [ -90.725571, 33.837252 ], "pop" : 738, "state" : "MS" } +{ "_id" : "38761", "city" : "MOORHEAD", "loc" : [ -90.51425, 33.478325 ], "pop" : 4623, "state" : "MS" } +{ "_id" : "38762", "city" : "MOUND BAYOU", "loc" : [ -90.73024700000001, 33.886023 ], "pop" : 3485, "state" : "MS" } +{ "_id" : "38769", "city" : "ROSEDALE", "loc" : [ -90.992289, 33.843166 ], "pop" : 3726, "state" : "MS" } +{ "_id" : "38771", "city" : "RULEVILLE", "loc" : [ -90.552657, 33.724052 ], "pop" : 4153, "state" : "MS" } +{ "_id" : "38773", "city" : "SHAW", "loc" : [ -90.81427499999999, 33.587388 ], "pop" : 3596, "state" : "MS" } +{ "_id" : "38774", "city" : "SHELBY", "loc" : [ -90.762461, 33.949058 ], "pop" : 3037, "state" : "MS" } +{ "_id" : "38778", "city" : "SUNFLOWER", "loc" : [ -90.638732, 33.584696 ], "pop" : 961, "state" : "MS" } +{ "_id" : "38780", "city" : "WAYSIDE", "loc" : [ -91.024801, 33.261023 ], "pop" : 198, "state" : "MS" } +{ "_id" : "38801", "city" : "TUPELO", "loc" : [ -88.72085300000001, 34.253834 ], "pop" : 40381, "state" : "MS" } +{ "_id" : "38821", "city" : "AMORY", "loc" : [ -88.470917, 33.9844 ], "pop" : 11765, "state" : "MS" } +{ "_id" : "38824", "city" : "BALDWYN", "loc" : [ -88.63748, 34.527959 ], "pop" : 6965, "state" : "MS" } +{ "_id" : "38826", "city" : "BELDEN", "loc" : [ -88.816011, 34.278663 ], "pop" : 4441, "state" : "MS" } +{ "_id" : "38827", "city" : "BELMONT", "loc" : [ -88.230912, 34.51025 ], "pop" : 2511, "state" : "MS" } +{ "_id" : "38828", "city" : "BLUE SPRINGS", "loc" : [ -88.859004, 34.427286 ], "pop" : 2808, "state" : "MS" } +{ "_id" : "38829", "city" : "BOONEVILLE", "loc" : [ -88.544299, 34.669431 ], "pop" : 16363, "state" : "MS" } +{ "_id" : "38833", "city" : "BURNSVILLE", "loc" : [ -88.306962, 34.857885 ], "pop" : 3574, "state" : "MS" } +{ "_id" : "38834", "city" : "KOSSUTH", "loc" : [ -88.54388400000001, 34.93236 ], "pop" : 22984, "state" : "MS" } +{ "_id" : "38838", "city" : "DENNIS", "loc" : [ -88.21167, 34.549735 ], "pop" : 1315, "state" : "MS" } +{ "_id" : "38841", "city" : "ECRU", "loc" : [ -88.955956, 34.337106 ], "pop" : 3862, "state" : "MS" } +{ "_id" : "38843", "city" : "FULTON", "loc" : [ -88.379262, 34.274543 ], "pop" : 14877, "state" : "MS" } +{ "_id" : "38844", "city" : "GATTMAN", "loc" : [ -88.258779, 33.87417 ], "pop" : 408, "state" : "MS" } +{ "_id" : "38846", "city" : "GLEN", "loc" : [ -88.43585899999999, 34.877981 ], "pop" : 5578, "state" : "MS" } +{ "_id" : "38847", "city" : "GOLDEN", "loc" : [ -88.18415899999999, 34.481214 ], "pop" : 639, "state" : "MS" } +{ "_id" : "38848", "city" : "GREENWOOD SPRING", "loc" : [ -88.312333, 33.99344 ], "pop" : 1934, "state" : "MS" } +{ "_id" : "38849", "city" : "GUNTOWN", "loc" : [ -88.701059, 34.429882 ], "pop" : 4504, "state" : "MS" } +{ "_id" : "38850", "city" : "HOULKA", "loc" : [ -89.05311399999999, 34.056145 ], "pop" : 2571, "state" : "MS" } +{ "_id" : "38851", "city" : "HOUSTON", "loc" : [ -88.967005, 33.902554 ], "pop" : 8781, "state" : "MS" } +{ "_id" : "38852", "city" : "IUKA", "loc" : [ -88.198289, 34.808891 ], "pop" : 7497, "state" : "MS" } +{ "_id" : "38855", "city" : "MANTACHIE", "loc" : [ -88.49603399999999, 34.358677 ], "pop" : 4273, "state" : "MS" } +{ "_id" : "38856", "city" : "MARIETTA", "loc" : [ -88.449764, 34.501089 ], "pop" : 1054, "state" : "MS" } +{ "_id" : "38857", "city" : "MOOREVILLE", "loc" : [ -88.59504, 34.280792 ], "pop" : 3880, "state" : "MS" } +{ "_id" : "38858", "city" : "NETTLETON", "loc" : [ -88.60520099999999, 34.082065 ], "pop" : 6781, "state" : "MS" } +{ "_id" : "38859", "city" : "NEW SITE", "loc" : [ -88.43502100000001, 34.561693 ], "pop" : 1187, "state" : "MS" } +{ "_id" : "38860", "city" : "EGYPT", "loc" : [ -88.759843, 33.989015 ], "pop" : 5258, "state" : "MS" } +{ "_id" : "38862", "city" : "PLANTERSVILLE", "loc" : [ -88.633456, 34.201073 ], "pop" : 2913, "state" : "MS" } +{ "_id" : "38863", "city" : "PONTOTOC", "loc" : [ -88.986829, 34.217004 ], "pop" : 10723, "state" : "MS" } +{ "_id" : "38864", "city" : "SAREPTA", "loc" : [ -89.163625, 34.178943 ], "pop" : 2365, "state" : "MS" } +{ "_id" : "38865", "city" : "RIENZI", "loc" : [ -88.579454, 34.796789 ], "pop" : 3162, "state" : "MS" } +{ "_id" : "38866", "city" : "SALTILLO", "loc" : [ -88.66736, 34.383128 ], "pop" : 2324, "state" : "MS" } +{ "_id" : "38868", "city" : "SHANNON", "loc" : [ -88.734206, 34.121035 ], "pop" : 4454, "state" : "MS" } +{ "_id" : "38870", "city" : "SMITHVILLE", "loc" : [ -88.390027, 34.064813 ], "pop" : 1375, "state" : "MS" } +{ "_id" : "38871", "city" : "THAXTON", "loc" : [ -89.15146799999999, 34.313563 ], "pop" : 3171, "state" : "MS" } +{ "_id" : "38873", "city" : "TISHOMINGO", "loc" : [ -88.21939500000001, 34.647753 ], "pop" : 2143, "state" : "MS" } +{ "_id" : "38876", "city" : "TREMONT", "loc" : [ -88.23921199999999, 34.233516 ], "pop" : 871, "state" : "MS" } +{ "_id" : "38878", "city" : "VARDAMAN", "loc" : [ -89.192117, 33.919042 ], "pop" : 2866, "state" : "MS" } +{ "_id" : "38901", "city" : "GRENADA", "loc" : [ -89.80873800000001, 33.775094 ], "pop" : 12322, "state" : "MS" } +{ "_id" : "38912", "city" : "AVALON", "loc" : [ -90.022077, 33.633683 ], "pop" : 782, "state" : "MS" } +{ "_id" : "38913", "city" : "BANNER", "loc" : [ -89.41538300000001, 34.094911 ], "pop" : 819, "state" : "MS" } +{ "_id" : "38914", "city" : "BIG CREEK", "loc" : [ -89.437833, 33.851359 ], "pop" : 461, "state" : "MS" } +{ "_id" : "38915", "city" : "BRUCE", "loc" : [ -89.348387, 34.006628 ], "pop" : 4085, "state" : "MS" } +{ "_id" : "38916", "city" : "CALHOUN CITY", "loc" : [ -89.317809, 33.840776 ], "pop" : 5416, "state" : "MS" } +{ "_id" : "38917", "city" : "CARROLLTON", "loc" : [ -89.950633, 33.520765 ], "pop" : 2683, "state" : "MS" } +{ "_id" : "38920", "city" : "CASCILLA", "loc" : [ -90.036163, 33.907905 ], "pop" : 2101, "state" : "MS" } +{ "_id" : "38921", "city" : "CHARLESTON", "loc" : [ -90.111559, 33.972621 ], "pop" : 7077, "state" : "MS" } +{ "_id" : "38922", "city" : "COFFEEVILLE", "loc" : [ -89.67817700000001, 33.921468 ], "pop" : 6937, "state" : "MS" } +{ "_id" : "38923", "city" : "COILA", "loc" : [ -89.991516, 33.373111 ], "pop" : 1529, "state" : "MS" } +{ "_id" : "38924", "city" : "CRUGER", "loc" : [ -90.231577, 33.310977 ], "pop" : 897, "state" : "MS" } +{ "_id" : "38925", "city" : "DUCK HILL", "loc" : [ -89.733425, 33.686475 ], "pop" : 4223, "state" : "MS" } +{ "_id" : "38927", "city" : "ENID", "loc" : [ -90.004392, 34.126345 ], "pop" : 916, "state" : "MS" } +{ "_id" : "38929", "city" : "GORE SPRINGS", "loc" : [ -89.57544900000001, 33.724529 ], "pop" : 261, "state" : "MS" } +{ "_id" : "38930", "city" : "GREENWOOD", "loc" : [ -90.172589, 33.515884 ], "pop" : 27931, "state" : "MS" } +{ "_id" : "38940", "city" : "HOLCOMB", "loc" : [ -89.90195799999999, 33.760385 ], "pop" : 3690, "state" : "MS" } +{ "_id" : "38941", "city" : "ITTA BENA", "loc" : [ -90.339421, 33.479838 ], "pop" : 6178, "state" : "MS" } +{ "_id" : "38943", "city" : "MC CARLEY", "loc" : [ -89.851281, 33.586383 ], "pop" : 941, "state" : "MS" } +{ "_id" : "38944", "city" : "MINTER CITY", "loc" : [ -90.31327, 33.751525 ], "pop" : 1064, "state" : "MS" } +{ "_id" : "38948", "city" : "OAKLAND", "loc" : [ -89.887748, 34.075552 ], "pop" : 1276, "state" : "MS" } +{ "_id" : "38949", "city" : "WATER VALLEY", "loc" : [ -89.421408, 34.176817 ], "pop" : 302, "state" : "MS" } +{ "_id" : "38950", "city" : "PHILIPP", "loc" : [ -90.209086, 33.757391 ], "pop" : 520, "state" : "MS" } +{ "_id" : "38951", "city" : "PITTSBORO", "loc" : [ -89.337622, 33.944326 ], "pop" : 1053, "state" : "MS" } +{ "_id" : "38952", "city" : "SCHLATER", "loc" : [ -90.361976, 33.624439 ], "pop" : 915, "state" : "MS" } +{ "_id" : "38953", "city" : "SCOBEY", "loc" : [ -89.891019, 33.92526 ], "pop" : 228, "state" : "MS" } +{ "_id" : "38954", "city" : "SIDON", "loc" : [ -90.177937, 33.40946 ], "pop" : 2212, "state" : "MS" } +{ "_id" : "38961", "city" : "TILLATOBA", "loc" : [ -89.89446100000001, 33.985229 ], "pop" : 621, "state" : "MS" } +{ "_id" : "38963", "city" : "TUTWILER", "loc" : [ -90.37534100000001, 33.98195 ], "pop" : 4627, "state" : "MS" } +{ "_id" : "38964", "city" : "VANCE", "loc" : [ -90.375246, 34.093639 ], "pop" : 299, "state" : "MS" } +{ "_id" : "38965", "city" : "WATER VALLEY", "loc" : [ -89.637986, 34.152466 ], "pop" : 5850, "state" : "MS" } +{ "_id" : "38967", "city" : "WINONA", "loc" : [ -89.727655, 33.485753 ], "pop" : 7877, "state" : "MS" } +{ "_id" : "39038", "city" : "BELZONI", "loc" : [ -90.492435, 33.18421 ], "pop" : 7600, "state" : "MS" } +{ "_id" : "39039", "city" : "BENTON", "loc" : [ -90.281516, 32.815772 ], "pop" : 1114, "state" : "MS" } +{ "_id" : "39040", "city" : "BENTONIA", "loc" : [ -90.372156, 32.700015 ], "pop" : 4325, "state" : "MS" } +{ "_id" : "39041", "city" : "BOLTON", "loc" : [ -90.447436, 32.377751 ], "pop" : 3484, "state" : "MS" } +{ "_id" : "39042", "city" : "BRANDON", "loc" : [ -89.964029, 32.303803 ], "pop" : 41141, "state" : "MS" } +{ "_id" : "39044", "city" : "BRAXTON", "loc" : [ -89.967225, 32.001581 ], "pop" : 1704, "state" : "MS" } +{ "_id" : "39045", "city" : "CAMDEN", "loc" : [ -89.892838, 32.794832 ], "pop" : 1835, "state" : "MS" } +{ "_id" : "39046", "city" : "CANTON", "loc" : [ -90.006079, 32.620543 ], "pop" : 21725, "state" : "MS" } +{ "_id" : "39049", "city" : "CARLISLE", "loc" : [ -90.779904, 32.101322 ], "pop" : 334, "state" : "MS" } +{ "_id" : "39051", "city" : "EDINBURG", "loc" : [ -89.535274, 32.788635 ], "pop" : 11122, "state" : "MS" } +{ "_id" : "39055", "city" : "CHURCH HILL", "loc" : [ -91.21490300000001, 31.67864 ], "pop" : 1079, "state" : "MS" } +{ "_id" : "39056", "city" : "CLINTON", "loc" : [ -90.32289299999999, 32.341079 ], "pop" : 25262, "state" : "MS" } +{ "_id" : "39057", "city" : "CONEHATTA", "loc" : [ -89.268956, 32.466974 ], "pop" : 2117, "state" : "MS" } +{ "_id" : "39059", "city" : "CRYSTAL SPRINGS", "loc" : [ -90.374439, 31.993329 ], "pop" : 10787, "state" : "MS" } +{ "_id" : "39063", "city" : "DURANT", "loc" : [ -89.86116, 33.082756 ], "pop" : 3459, "state" : "MS" } +{ "_id" : "39066", "city" : "EDWARDS", "loc" : [ -90.598392, 32.316008 ], "pop" : 4144, "state" : "MS" } +{ "_id" : "39067", "city" : "ETHEL", "loc" : [ -89.49470700000001, 33.152587 ], "pop" : 2047, "state" : "MS" } +{ "_id" : "39069", "city" : "FAYETTE", "loc" : [ -91.058226, 31.712058 ], "pop" : 6319, "state" : "MS" } +{ "_id" : "39071", "city" : "FLORA", "loc" : [ -90.32350599999999, 32.557832 ], "pop" : 3973, "state" : "MS" } +{ "_id" : "39073", "city" : "FLORENCE", "loc" : [ -90.121672, 32.153002 ], "pop" : 14251, "state" : "MS" } +{ "_id" : "39074", "city" : "FOREST", "loc" : [ -89.467201, 32.346999 ], "pop" : 6588, "state" : "MS" } +{ "_id" : "39078", "city" : "GEORGETOWN", "loc" : [ -90.21273600000001, 31.855198 ], "pop" : 2065, "state" : "MS" } +{ "_id" : "39079", "city" : "GOODMAN", "loc" : [ -89.982145, 32.972133 ], "pop" : 3487, "state" : "MS" } +{ "_id" : "39082", "city" : "HARRISVILLE", "loc" : [ -90.10535900000001, 31.967552 ], "pop" : 2885, "state" : "MS" } +{ "_id" : "39083", "city" : "HAZLEHURST", "loc" : [ -90.405078, 31.856188 ], "pop" : 12269, "state" : "MS" } +{ "_id" : "39086", "city" : "HERMANVILLE", "loc" : [ -90.844588, 31.956374 ], "pop" : 1683, "state" : "MS" } +{ "_id" : "39088", "city" : "HOLLY BLUFF", "loc" : [ -90.704486, 32.824216 ], "pop" : 218, "state" : "MS" } +{ "_id" : "39090", "city" : "KOSCIUSKO", "loc" : [ -89.572351, 33.0446 ], "pop" : 11597, "state" : "MS" } +{ "_id" : "39092", "city" : "LAKE", "loc" : [ -89.341354, 32.345909 ], "pop" : 704, "state" : "MS" } +{ "_id" : "39094", "city" : "LENA", "loc" : [ -89.549435, 32.644588 ], "pop" : 3622, "state" : "MS" } +{ "_id" : "39095", "city" : "LEXINGTON", "loc" : [ -90.055674, 33.125043 ], "pop" : 7252, "state" : "MS" } +{ "_id" : "39096", "city" : "LORMAN", "loc" : [ -91.095691, 31.838257 ], "pop" : 668, "state" : "MS" } +{ "_id" : "39097", "city" : "LOUISE", "loc" : [ -90.589321, 32.991945 ], "pop" : 1670, "state" : "MS" } +{ "_id" : "39108", "city" : "MC COOL", "loc" : [ -89.326806, 33.163206 ], "pop" : 1438, "state" : "MS" } +{ "_id" : "39109", "city" : "MADDEN", "loc" : [ -89.38170100000001, 32.708665 ], "pop" : 1586, "state" : "MS" } +{ "_id" : "39110", "city" : "MADISON", "loc" : [ -90.108744, 32.467065 ], "pop" : 12100, "state" : "MS" } +{ "_id" : "39111", "city" : "MAGEE", "loc" : [ -89.750325, 31.849513 ], "pop" : 7590, "state" : "MS" } +{ "_id" : "39113", "city" : "MAYERSVILLE", "loc" : [ -91.028628, 32.901276 ], "pop" : 1657, "state" : "MS" } +{ "_id" : "39114", "city" : "MENDENHALL", "loc" : [ -89.809494, 31.949425 ], "pop" : 10110, "state" : "MS" } +{ "_id" : "39116", "city" : "MIZE", "loc" : [ -89.574135, 31.847285 ], "pop" : 2858, "state" : "MS" } +{ "_id" : "39117", "city" : "MORTON", "loc" : [ -89.551222, 32.436105 ], "pop" : 15400, "state" : "MS" } +{ "_id" : "39119", "city" : "MOUNT OLIVE", "loc" : [ -89.672387, 31.734582 ], "pop" : 3060, "state" : "MS" } +{ "_id" : "39120", "city" : "NATCHEZ", "loc" : [ -91.364214, 31.54924 ], "pop" : 34738, "state" : "MS" } +{ "_id" : "39140", "city" : "NEWHEBRON", "loc" : [ -90.01526, 31.73004 ], "pop" : 1184, "state" : "MS" } +{ "_id" : "39144", "city" : "PATTISON", "loc" : [ -90.828306, 31.851025 ], "pop" : 855, "state" : "MS" } +{ "_id" : "39145", "city" : "PELAHATCHIE", "loc" : [ -89.79134999999999, 32.317994 ], "pop" : 1661, "state" : "MS" } +{ "_id" : "39146", "city" : "PICKENS", "loc" : [ -89.973707, 32.890519 ], "pop" : 1574, "state" : "MS" } +{ "_id" : "39149", "city" : "PINOLA", "loc" : [ -90.008775, 31.827732 ], "pop" : 1664, "state" : "MS" } +{ "_id" : "39150", "city" : "PORT GIBSON", "loc" : [ -91.02303000000001, 31.926604 ], "pop" : 8498, "state" : "MS" } +{ "_id" : "39152", "city" : "PULASKI", "loc" : [ -89.650521, 32.270845 ], "pop" : 1447, "state" : "MS" } +{ "_id" : "39153", "city" : "RALEIGH", "loc" : [ -89.50881800000001, 32.05084 ], "pop" : 8944, "state" : "MS" } +{ "_id" : "39154", "city" : "LEARNED", "loc" : [ -90.424088, 32.23922 ], "pop" : 7530, "state" : "MS" } +{ "_id" : "39156", "city" : "REDWOOD", "loc" : [ -90.785899, 32.486699 ], "pop" : 912, "state" : "MS" } +{ "_id" : "39157", "city" : "RIDGELAND", "loc" : [ -90.12069700000001, 32.412165 ], "pop" : 13226, "state" : "MS" } +{ "_id" : "39159", "city" : "ROLLING FORK", "loc" : [ -90.883274, 32.873317 ], "pop" : 4509, "state" : "MS" } +{ "_id" : "39160", "city" : "SALLIS", "loc" : [ -89.755182, 33.000981 ], "pop" : 3093, "state" : "MS" } +{ "_id" : "39162", "city" : "SATARTIA", "loc" : [ -90.596458, 32.612515 ], "pop" : 496, "state" : "MS" } +{ "_id" : "39166", "city" : "SILVER CITY", "loc" : [ -90.49279799999999, 33.05071 ], "pop" : 1190, "state" : "MS" } +{ "_id" : "39168", "city" : "TAYLORSVILLE", "loc" : [ -89.404875, 31.839388 ], "pop" : 2996, "state" : "MS" } +{ "_id" : "39169", "city" : "TCHULA", "loc" : [ -90.250012, 33.162388 ], "pop" : 3976, "state" : "MS" } +{ "_id" : "39170", "city" : "TERRY", "loc" : [ -90.32414300000001, 32.114683 ], "pop" : 5538, "state" : "MS" } +{ "_id" : "39175", "city" : "UTICA", "loc" : [ -90.604724, 32.122897 ], "pop" : 4630, "state" : "MS" } +{ "_id" : "39176", "city" : "VAIDEN", "loc" : [ -89.757023, 33.33433 ], "pop" : 1987, "state" : "MS" } +{ "_id" : "39177", "city" : "VALLEY PARK", "loc" : [ -90.854209, 32.632258 ], "pop" : 252, "state" : "MS" } +{ "_id" : "39179", "city" : "PICKENS", "loc" : [ -90.085477, 32.817424 ], "pop" : 1417, "state" : "MS" } +{ "_id" : "39180", "city" : "VICKSBURG", "loc" : [ -90.85065, 32.325824 ], "pop" : 46968, "state" : "MS" } +{ "_id" : "39189", "city" : "WALNUT GROVE", "loc" : [ -89.410538, 32.613418 ], "pop" : 2098, "state" : "MS" } +{ "_id" : "39191", "city" : "WESSON", "loc" : [ -90.413106, 31.690055 ], "pop" : 4187, "state" : "MS" } +{ "_id" : "39192", "city" : "WEST", "loc" : [ -89.769526, 33.1883 ], "pop" : 2069, "state" : "MS" } +{ "_id" : "39194", "city" : "YAZOO CITY", "loc" : [ -90.40314499999999, 32.85937 ], "pop" : 17936, "state" : "MS" } +{ "_id" : "39201", "city" : "JACKSON", "loc" : [ -90.186655, 32.293502 ], "pop" : 771, "state" : "MS" } +{ "_id" : "39202", "city" : "JACKSON", "loc" : [ -90.178194, 32.314883 ], "pop" : 10979, "state" : "MS" } +{ "_id" : "39203", "city" : "JACKSON", "loc" : [ -90.20206399999999, 32.308145 ], "pop" : 15641, "state" : "MS" } +{ "_id" : "39204", "city" : "JACKSON", "loc" : [ -90.23057900000001, 32.283162 ], "pop" : 19655, "state" : "MS" } +{ "_id" : "39206", "city" : "JACKSON", "loc" : [ -90.173787, 32.369956 ], "pop" : 25312, "state" : "MS" } +{ "_id" : "39208", "city" : "PEARL", "loc" : [ -90.10271400000001, 32.276837 ], "pop" : 25545, "state" : "MS" } +{ "_id" : "39209", "city" : "JACKSON", "loc" : [ -90.244626, 32.318422 ], "pop" : 34407, "state" : "MS" } +{ "_id" : "39211", "city" : "JACKSON", "loc" : [ -90.12929699999999, 32.373924 ], "pop" : 25567, "state" : "MS" } +{ "_id" : "39212", "city" : "JACKSON", "loc" : [ -90.261201, 32.24347 ], "pop" : 35321, "state" : "MS" } +{ "_id" : "39213", "city" : "JACKSON", "loc" : [ -90.217099, 32.355288 ], "pop" : 33311, "state" : "MS" } +{ "_id" : "39216", "city" : "JACKSON", "loc" : [ -90.17081399999999, 32.338574 ], "pop" : 3824, "state" : "MS" } +{ "_id" : "39218", "city" : "RICHLAND", "loc" : [ -90.15623100000001, 32.215224 ], "pop" : 4563, "state" : "MS" } +{ "_id" : "39269", "city" : "JACKSON", "loc" : [ -90.188503, 32.30085 ], "pop" : 0, "state" : "MS" } +{ "_id" : "39301", "city" : "MERIDIAN", "loc" : [ -88.655973, 32.357441 ], "pop" : 28014, "state" : "MS" } +{ "_id" : "39305", "city" : "MERIDIAN", "loc" : [ -88.67832199999999, 32.440129 ], "pop" : 16175, "state" : "MS" } +{ "_id" : "39307", "city" : "MERIDIAN", "loc" : [ -88.74359800000001, 32.373591 ], "pop" : 20402, "state" : "MS" } +{ "_id" : "39320", "city" : "BAILEY", "loc" : [ -88.69908599999999, 32.475417 ], "pop" : 2495, "state" : "MS" } +{ "_id" : "39322", "city" : "BUCKATUNNA", "loc" : [ -88.52573, 31.507976 ], "pop" : 2477, "state" : "MS" } +{ "_id" : "39323", "city" : "CHUNKY", "loc" : [ -88.946968, 32.247156 ], "pop" : 79, "state" : "MS" } +{ "_id" : "39325", "city" : "COLLINSVILLE", "loc" : [ -88.815532, 32.518278 ], "pop" : 4385, "state" : "MS" } +{ "_id" : "39326", "city" : "DALEVILLE", "loc" : [ -88.66094200000001, 32.551124 ], "pop" : 549, "state" : "MS" } +{ "_id" : "39327", "city" : "DECATUR", "loc" : [ -89.116832, 32.435798 ], "pop" : 3595, "state" : "MS" } +{ "_id" : "39328", "city" : "DE KALB", "loc" : [ -88.733158, 32.716235 ], "pop" : 5219, "state" : "MS" } +{ "_id" : "39330", "city" : "ENTERPRISE", "loc" : [ -88.84735000000001, 32.156266 ], "pop" : 1444, "state" : "MS" } +{ "_id" : "39332", "city" : "HICKORY", "loc" : [ -89.009254, 32.320012 ], "pop" : 2504, "state" : "MS" } +{ "_id" : "39335", "city" : "LAUDERDALE", "loc" : [ -88.495569, 32.502186 ], "pop" : 2190, "state" : "MS" } +{ "_id" : "39336", "city" : "LAWRENCE", "loc" : [ -89.27243199999999, 32.287614 ], "pop" : 86, "state" : "MS" } +{ "_id" : "39337", "city" : "LITTLE ROCK", "loc" : [ -89.181382, 32.540288 ], "pop" : 896, "state" : "MS" } +{ "_id" : "39338", "city" : "LOUIN", "loc" : [ -89.21993500000001, 32.099713 ], "pop" : 1991, "state" : "MS" } +{ "_id" : "39339", "city" : "LOUISVILLE", "loc" : [ -89.02865300000001, 33.105824 ], "pop" : 16290, "state" : "MS" } +{ "_id" : "39341", "city" : "MACON", "loc" : [ -88.578093, 33.102674 ], "pop" : 6634, "state" : "MS" } +{ "_id" : "39345", "city" : "NEWTON", "loc" : [ -89.18395099999999, 32.324448 ], "pop" : 6779, "state" : "MS" } +{ "_id" : "39346", "city" : "NOXAPATER", "loc" : [ -89.12207600000001, 32.97895 ], "pop" : 2870, "state" : "MS" } +{ "_id" : "39347", "city" : "PACHUTA", "loc" : [ -88.86529299999999, 32.008105 ], "pop" : 916, "state" : "MS" } +{ "_id" : "39348", "city" : "PAULDING", "loc" : [ -89.058441, 32.016744 ], "pop" : 485, "state" : "MS" } +{ "_id" : "39350", "city" : "PHILADELPHIA", "loc" : [ -89.115371, 32.757224 ], "pop" : 24316, "state" : "MS" } +{ "_id" : "39352", "city" : "PORTERVILLE", "loc" : [ -88.498425, 32.636833 ], "pop" : 1202, "state" : "MS" } +{ "_id" : "39354", "city" : "PRESTON", "loc" : [ -88.813013, 32.853659 ], "pop" : 1937, "state" : "MS" } +{ "_id" : "39355", "city" : "QUITMAN", "loc" : [ -88.678803, 32.066845 ], "pop" : 8822, "state" : "MS" } +{ "_id" : "39356", "city" : "ROSE HILL", "loc" : [ -89.001053, 32.148931 ], "pop" : 1725, "state" : "MS" } +{ "_id" : "39358", "city" : "SCOOBA", "loc" : [ -88.48827199999999, 32.840197 ], "pop" : 2087, "state" : "MS" } +{ "_id" : "39360", "city" : "MATHERVILLE", "loc" : [ -88.725866, 31.903082 ], "pop" : 3442, "state" : "MS" } +{ "_id" : "39361", "city" : "SHUQUALAK", "loc" : [ -88.559393, 32.976933 ], "pop" : 1323, "state" : "MS" } +{ "_id" : "39362", "city" : "STATE LINE", "loc" : [ -88.51711, 31.391619 ], "pop" : 1382, "state" : "MS" } +{ "_id" : "39363", "city" : "STONEWALL", "loc" : [ -88.774827, 32.156396 ], "pop" : 2690, "state" : "MS" } +{ "_id" : "39364", "city" : "TOOMSUBA", "loc" : [ -88.489225, 32.429583 ], "pop" : 1346, "state" : "MS" } +{ "_id" : "39365", "city" : "UNION", "loc" : [ -89.049522, 32.537329 ], "pop" : 4684, "state" : "MS" } +{ "_id" : "39366", "city" : "VOSSBURG", "loc" : [ -88.969598, 31.972301 ], "pop" : 1357, "state" : "MS" } +{ "_id" : "39367", "city" : "WAYNESBORO", "loc" : [ -88.67822099999999, 31.675447 ], "pop" : 17046, "state" : "MS" } +{ "_id" : "39401", "city" : "HATTIESBURG", "loc" : [ -89.306471, 31.314553 ], "pop" : 41866, "state" : "MS" } +{ "_id" : "39402", "city" : "HATTIESBURG", "loc" : [ -89.37751, 31.309753 ], "pop" : 25479, "state" : "MS" } +{ "_id" : "39421", "city" : "BASSFIELD", "loc" : [ -89.702735, 31.503695 ], "pop" : 3605, "state" : "MS" } +{ "_id" : "39422", "city" : "BAY SPRINGS", "loc" : [ -89.233768, 31.944939 ], "pop" : 6778, "state" : "MS" } +{ "_id" : "39423", "city" : "BEAUMONT", "loc" : [ -88.905492, 31.136763 ], "pop" : 1883, "state" : "MS" } +{ "_id" : "39425", "city" : "BROOKLYN", "loc" : [ -89.23372000000001, 30.998852 ], "pop" : 2080, "state" : "MS" } +{ "_id" : "39426", "city" : "CARRIERE", "loc" : [ -89.57792999999999, 30.617772 ], "pop" : 12978, "state" : "MS" } +{ "_id" : "39427", "city" : "CARSON", "loc" : [ -89.77582099999999, 31.558501 ], "pop" : 1381, "state" : "MS" } +{ "_id" : "39428", "city" : "COLLINS", "loc" : [ -89.543809, 31.670712 ], "pop" : 9457, "state" : "MS" } +{ "_id" : "39429", "city" : "COLUMBIA", "loc" : [ -89.799785, 31.255877 ], "pop" : 19891, "state" : "MS" } +{ "_id" : "39437", "city" : "ELLISVILLE", "loc" : [ -89.223073, 31.579663 ], "pop" : 10632, "state" : "MS" } +{ "_id" : "39439", "city" : "HEIDELBERG", "loc" : [ -88.998052, 31.882031 ], "pop" : 3416, "state" : "MS" } +{ "_id" : "39440", "city" : "LAUREL", "loc" : [ -89.13115500000001, 31.705444 ], "pop" : 45040, "state" : "MS" } +{ "_id" : "39451", "city" : "LEAKESVILLE", "loc" : [ -88.559546, 31.123825 ], "pop" : 4858, "state" : "MS" } +{ "_id" : "39452", "city" : "AGRICOLA", "loc" : [ -88.593391, 30.866722 ], "pop" : 17844, "state" : "MS" } +{ "_id" : "39455", "city" : "LUMBERTON", "loc" : [ -89.45425400000001, 31.053356 ], "pop" : 6096, "state" : "MS" } +{ "_id" : "39456", "city" : "LEAF", "loc" : [ -88.81947, 31.078449 ], "pop" : 1061, "state" : "MS" } +{ "_id" : "39459", "city" : "MOSELLE", "loc" : [ -89.320633, 31.483626 ], "pop" : 2350, "state" : "MS" } +{ "_id" : "39461", "city" : "NEELY", "loc" : [ -88.71983, 31.179325 ], "pop" : 1059, "state" : "MS" } +{ "_id" : "39462", "city" : "NEW AUGUSTA", "loc" : [ -89.028611, 31.130907 ], "pop" : 2152, "state" : "MS" } +{ "_id" : "39464", "city" : "OVETT", "loc" : [ -89.039613, 31.47377 ], "pop" : 1113, "state" : "MS" } +{ "_id" : "39465", "city" : "PETAL", "loc" : [ -89.222239, 31.347181 ], "pop" : 15799, "state" : "MS" } +{ "_id" : "39466", "city" : "PICAYUNE", "loc" : [ -89.69102100000001, 30.541796 ], "pop" : 20116, "state" : "MS" } +{ "_id" : "39470", "city" : "POPLARVILLE", "loc" : [ -89.564751, 30.852362 ], "pop" : 7682, "state" : "MS" } +{ "_id" : "39474", "city" : "PRENTISS", "loc" : [ -89.873497, 31.605655 ], "pop" : 9065, "state" : "MS" } +{ "_id" : "39475", "city" : "PURVIS", "loc" : [ -89.462301, 31.149562 ], "pop" : 4493, "state" : "MS" } +{ "_id" : "39476", "city" : "RICHTON", "loc" : [ -88.910079, 31.343364 ], "pop" : 7378, "state" : "MS" } +{ "_id" : "39478", "city" : "SANDY HOOK", "loc" : [ -89.818343, 31.047904 ], "pop" : 448, "state" : "MS" } +{ "_id" : "39479", "city" : "SEMINARY", "loc" : [ -89.481585, 31.528485 ], "pop" : 4010, "state" : "MS" } +{ "_id" : "39480", "city" : "SOSO", "loc" : [ -89.308223, 31.75941 ], "pop" : 2890, "state" : "MS" } +{ "_id" : "39481", "city" : "STRINGER", "loc" : [ -89.26214400000001, 31.844721 ], "pop" : 1367, "state" : "MS" } +{ "_id" : "39482", "city" : "SUMRALL", "loc" : [ -89.57772300000001, 31.359972 ], "pop" : 4741, "state" : "MS" } +{ "_id" : "39483", "city" : "FOXWORTH", "loc" : [ -89.93107500000001, 31.247325 ], "pop" : 4317, "state" : "MS" } +{ "_id" : "39501", "city" : "GULFPORT", "loc" : [ -89.097618, 30.382556 ], "pop" : 25894, "state" : "MS" } +{ "_id" : "39503", "city" : "GULFPORT", "loc" : [ -89.08855200000001, 30.460105 ], "pop" : 26830, "state" : "MS" } +{ "_id" : "39507", "city" : "GULFPORT", "loc" : [ -89.035347, 30.396248 ], "pop" : 18144, "state" : "MS" } +{ "_id" : "39520", "city" : "DIAMONDHEAD", "loc" : [ -89.397356, 30.324275 ], "pop" : 20156, "state" : "MS" } +{ "_id" : "39530", "city" : "BILOXI", "loc" : [ -88.897143, 30.403478 ], "pop" : 22245, "state" : "MS" } +{ "_id" : "39531", "city" : "BILOXI", "loc" : [ -88.960499, 30.40334 ], "pop" : 18541, "state" : "MS" } +{ "_id" : "39532", "city" : "NORTH BAY", "loc" : [ -88.918846, 30.452031 ], "pop" : 25296, "state" : "MS" } +{ "_id" : "39553", "city" : "GAUTIER", "loc" : [ -88.64117299999999, 30.398032 ], "pop" : 13240, "state" : "MS" } +{ "_id" : "39560", "city" : "LONG BEACH", "loc" : [ -89.16457699999999, 30.359756 ], "pop" : 17826, "state" : "MS" } +{ "_id" : "39561", "city" : "MC HENRY", "loc" : [ -89.153631, 30.697463 ], "pop" : 375, "state" : "MS" } +{ "_id" : "39563", "city" : "KREOLE", "loc" : [ -88.526015, 30.402773 ], "pop" : 15657, "state" : "MS" } +{ "_id" : "39564", "city" : "OCEAN SPRINGS", "loc" : [ -88.78009900000001, 30.440433 ], "pop" : 34238, "state" : "MS" } +{ "_id" : "39567", "city" : "PASCAGOULA", "loc" : [ -88.51647199999999, 30.530301 ], "pop" : 16025, "state" : "MS" } +{ "_id" : "39571", "city" : "PASS CHRISTIAN", "loc" : [ -89.28426899999999, 30.398918 ], "pop" : 14427, "state" : "MS" } +{ "_id" : "39573", "city" : "PERKINSTON", "loc" : [ -89.139985, 30.76686 ], "pop" : 3743, "state" : "MS" } +{ "_id" : "39574", "city" : "SAUCIER", "loc" : [ -89.147729, 30.596082 ], "pop" : 6520, "state" : "MS" } +{ "_id" : "39576", "city" : "WAVELAND", "loc" : [ -89.383679, 30.29138 ], "pop" : 5967, "state" : "MS" } +{ "_id" : "39577", "city" : "WIGGINS", "loc" : [ -89.132369, 30.86095 ], "pop" : 6632, "state" : "MS" } +{ "_id" : "39581", "city" : "PASCAGOULA", "loc" : [ -88.52885999999999, 30.366377 ], "pop" : 27619, "state" : "MS" } +{ "_id" : "39601", "city" : "BROOKHAVEN", "loc" : [ -90.451995, 31.58581 ], "pop" : 20910, "state" : "MS" } +{ "_id" : "39629", "city" : "BOGUE CHITTO", "loc" : [ -90.47318300000001, 31.456344 ], "pop" : 7068, "state" : "MS" } +{ "_id" : "39631", "city" : "CENTREVILLE", "loc" : [ -91.095985, 31.089329 ], "pop" : 4055, "state" : "MS" } +{ "_id" : "39633", "city" : "CROSBY", "loc" : [ -91.023712, 31.299406 ], "pop" : 574, "state" : "MS" } +{ "_id" : "39638", "city" : "GLOSTER", "loc" : [ -90.92404500000001, 31.19033 ], "pop" : 6389, "state" : "MS" } +{ "_id" : "39641", "city" : "JAYESS", "loc" : [ -90.186386, 31.403577 ], "pop" : 1621, "state" : "MS" } +{ "_id" : "39643", "city" : "KOKOMO", "loc" : [ -89.98241899999999, 31.177688 ], "pop" : 888, "state" : "MS" } +{ "_id" : "39645", "city" : "LIBERTY", "loc" : [ -90.71334899999999, 31.138427 ], "pop" : 2950, "state" : "MS" } +{ "_id" : "39647", "city" : "MC CALL CREEK", "loc" : [ -90.783581, 31.490772 ], "pop" : 3017, "state" : "MS" } +{ "_id" : "39648", "city" : "MC COMB", "loc" : [ -90.43244900000001, 31.221594 ], "pop" : 23551, "state" : "MS" } +{ "_id" : "39652", "city" : "MAGNOLIA", "loc" : [ -90.48311, 31.121745 ], "pop" : 7831, "state" : "MS" } +{ "_id" : "39653", "city" : "MEADVILLE", "loc" : [ -90.85783499999999, 31.428489 ], "pop" : 1673, "state" : "MS" } +{ "_id" : "39654", "city" : "MONTICELLO", "loc" : [ -90.12796, 31.523776 ], "pop" : 4517, "state" : "MS" } +{ "_id" : "39656", "city" : "OAK VALE", "loc" : [ -89.98273, 31.441953 ], "pop" : 321, "state" : "MS" } +{ "_id" : "39657", "city" : "OSYKA", "loc" : [ -90.478977, 31.021747 ], "pop" : 1143, "state" : "MS" } +{ "_id" : "39661", "city" : "ROXIE", "loc" : [ -91.06247500000001, 31.504043 ], "pop" : 3526, "state" : "MS" } +{ "_id" : "39662", "city" : "RUTH", "loc" : [ -90.28667299999999, 31.379495 ], "pop" : 415, "state" : "MS" } +{ "_id" : "39663", "city" : "SILVER CREEK", "loc" : [ -90.017332, 31.575535 ], "pop" : 2862, "state" : "MS" } +{ "_id" : "39664", "city" : "SMITHDALE", "loc" : [ -90.675236, 31.367203 ], "pop" : 1247, "state" : "MS" } +{ "_id" : "39665", "city" : "SONTAG", "loc" : [ -90.180125, 31.645313 ], "pop" : 1953, "state" : "MS" } +{ "_id" : "39666", "city" : "SUMMIT", "loc" : [ -90.46542700000001, 31.29752 ], "pop" : 6696, "state" : "MS" } +{ "_id" : "39667", "city" : "TYLERTOWN", "loc" : [ -90.116918, 31.146552 ], "pop" : 14352, "state" : "MS" } +{ "_id" : "39668", "city" : "UNION CHURCH", "loc" : [ -90.82592200000001, 31.710474 ], "pop" : 587, "state" : "MS" } +{ "_id" : "39669", "city" : "WOODVILLE", "loc" : [ -91.307596, 31.145913 ], "pop" : 6400, "state" : "MS" } +{ "_id" : "39701", "city" : "COLUMBUS", "loc" : [ -88.426194, 33.537699 ], "pop" : 32609, "state" : "MS" } +{ "_id" : "39702", "city" : "COLUMBUS", "loc" : [ -88.35538699999999, 33.481175 ], "pop" : 21004, "state" : "MS" } +{ "_id" : "39730", "city" : "ABERDEEN", "loc" : [ -88.538033, 33.828439 ], "pop" : 15769, "state" : "MS" } +{ "_id" : "39735", "city" : "ACKERMAN", "loc" : [ -89.20139, 33.351684 ], "pop" : 5027, "state" : "MS" } +{ "_id" : "39739", "city" : "BROOKSVILLE", "loc" : [ -88.501351, 33.213961 ], "pop" : 4598, "state" : "MS" } +{ "_id" : "39740", "city" : "CALEDONIA", "loc" : [ -88.314537, 33.686461 ], "pop" : 2008, "state" : "MS" } +{ "_id" : "39741", "city" : "CEDARBLUFF", "loc" : [ -88.826712, 33.61616 ], "pop" : 1063, "state" : "MS" } +{ "_id" : "39743", "city" : "CRAWFORD", "loc" : [ -88.56711900000001, 33.321922 ], "pop" : 2310, "state" : "MS" } +{ "_id" : "39744", "city" : "TOMNOLEN", "loc" : [ -89.304542, 33.568908 ], "pop" : 5686, "state" : "MS" } +{ "_id" : "39745", "city" : "FRENCH CAMP", "loc" : [ -89.39458500000001, 33.338319 ], "pop" : 1426, "state" : "MS" } +{ "_id" : "39746", "city" : "HAMILTON", "loc" : [ -88.44784, 33.801141 ], "pop" : 726, "state" : "MS" } +{ "_id" : "39747", "city" : "KILMICHAEL", "loc" : [ -89.569577, 33.416476 ], "pop" : 2351, "state" : "MS" } +{ "_id" : "39750", "city" : "MABEN", "loc" : [ -89.065887, 33.526179 ], "pop" : 1286, "state" : "MS" } +{ "_id" : "39751", "city" : "MANTEE", "loc" : [ -89.122906, 33.665493 ], "pop" : 1813, "state" : "MS" } +{ "_id" : "39752", "city" : "MATHISTON", "loc" : [ -89.12747899999999, 33.541493 ], "pop" : 3213, "state" : "MS" } +{ "_id" : "39755", "city" : "PHEBA", "loc" : [ -88.951842, 33.596056 ], "pop" : 740, "state" : "MS" } +{ "_id" : "39756", "city" : "PRAIRIE", "loc" : [ -88.63346300000001, 33.795113 ], "pop" : 135, "state" : "MS" } +{ "_id" : "39759", "city" : "SESSUMS", "loc" : [ -88.817637, 33.450125 ], "pop" : 36268, "state" : "MS" } +{ "_id" : "39766", "city" : "STEENS", "loc" : [ -88.327755, 33.56708 ], "pop" : 1377, "state" : "MS" } +{ "_id" : "39767", "city" : "STEWART", "loc" : [ -89.479, 33.510097 ], "pop" : 892, "state" : "MS" } +{ "_id" : "39769", "city" : "STURGIS", "loc" : [ -89.04727, 33.35702 ], "pop" : 814, "state" : "MS" } +{ "_id" : "39772", "city" : "WEIR", "loc" : [ -89.28041899999999, 33.264464 ], "pop" : 1402, "state" : "MS" } +{ "_id" : "39773", "city" : "WEST POINT", "loc" : [ -88.68226, 33.626496 ], "pop" : 19317, "state" : "MS" } +{ "_id" : "39776", "city" : "WOODLAND", "loc" : [ -89.02555700000001, 33.80661 ], "pop" : 2276, "state" : "MS" } +{ "_id" : "40003", "city" : "BAGDAD", "loc" : [ -85.06514199999999, 38.260811 ], "pop" : 1272, "state" : "KY" } +{ "_id" : "40004", "city" : "BARDSTOWN", "loc" : [ -85.461343, 37.80835 ], "pop" : 16176, "state" : "KY" } +{ "_id" : "40006", "city" : "BEDFORD", "loc" : [ -85.31333100000001, 38.586363 ], "pop" : 3359, "state" : "KY" } +{ "_id" : "40007", "city" : "BETHLEHEM", "loc" : [ -85.064874, 38.402433 ], "pop" : 353, "state" : "KY" } +{ "_id" : "40008", "city" : "BLOOMFIELD", "loc" : [ -85.286209, 37.907979 ], "pop" : 2461, "state" : "KY" } +{ "_id" : "40009", "city" : "BRADFORDSVILLE", "loc" : [ -85.14359899999999, 37.46622 ], "pop" : 1136, "state" : "KY" } +{ "_id" : "40010", "city" : "BUCKNER", "loc" : [ -85.47405999999999, 38.363008 ], "pop" : 34, "state" : "KY" } +{ "_id" : "40011", "city" : "CAMPBELLSBURG", "loc" : [ -85.16109400000001, 38.523083 ], "pop" : 1960, "state" : "KY" } +{ "_id" : "40012", "city" : "CHAPLIN", "loc" : [ -85.201472, 37.902541 ], "pop" : 443, "state" : "KY" } +{ "_id" : "40013", "city" : "DEATSVILLE", "loc" : [ -85.48415900000001, 37.896386 ], "pop" : 4763, "state" : "KY" } +{ "_id" : "40014", "city" : "CRESTWOOD", "loc" : [ -85.461038, 38.332637 ], "pop" : 10779, "state" : "KY" } +{ "_id" : "40019", "city" : "EMINENCE", "loc" : [ -85.17816000000001, 38.369606 ], "pop" : 2493, "state" : "KY" } +{ "_id" : "40022", "city" : "FINCHVILLE", "loc" : [ -85.347573, 38.156064 ], "pop" : 1040, "state" : "KY" } +{ "_id" : "40023", "city" : "FISHERVILLE", "loc" : [ -85.42822200000001, 38.165154 ], "pop" : 937, "state" : "KY" } +{ "_id" : "40026", "city" : "GOSHEN", "loc" : [ -85.57081599999999, 38.411294 ], "pop" : 3626, "state" : "KY" } +{ "_id" : "40028", "city" : "HOWARDSTOWN", "loc" : [ -85.55476899999999, 37.566393 ], "pop" : 218, "state" : "KY" } +{ "_id" : "40031", "city" : "LA GRANGE", "loc" : [ -85.392819, 38.402897 ], "pop" : 13280, "state" : "KY" } +{ "_id" : "40033", "city" : "LEBANON", "loc" : [ -85.266811, 37.565834 ], "pop" : 10672, "state" : "KY" } +{ "_id" : "40036", "city" : "LOCKPORT", "loc" : [ -84.958635, 38.421874 ], "pop" : 742, "state" : "KY" } +{ "_id" : "40037", "city" : "LORETTO", "loc" : [ -85.411297, 37.642112 ], "pop" : 2586, "state" : "KY" } +{ "_id" : "40040", "city" : "MACKVILLE", "loc" : [ -85.085201, 37.724703 ], "pop" : 1753, "state" : "KY" } +{ "_id" : "40045", "city" : "MILTON", "loc" : [ -85.36593000000001, 38.692489 ], "pop" : 2535, "state" : "KY" } +{ "_id" : "40046", "city" : "MOUNT EDEN", "loc" : [ -85.164114, 38.035238 ], "pop" : 597, "state" : "KY" } +{ "_id" : "40047", "city" : "MOUNT WASHINGTON", "loc" : [ -85.55863100000001, 38.045206 ], "pop" : 8785, "state" : "KY" } +{ "_id" : "40050", "city" : "NEW CASTLE", "loc" : [ -85.175567, 38.437368 ], "pop" : 2017, "state" : "KY" } +{ "_id" : "40051", "city" : "TRAPPIST", "loc" : [ -85.557694, 37.666327 ], "pop" : 3698, "state" : "KY" } +{ "_id" : "40055", "city" : "PENDLETON", "loc" : [ -85.317019, 38.480918 ], "pop" : 975, "state" : "KY" } +{ "_id" : "40056", "city" : "PEWEE VALLEY", "loc" : [ -85.483377, 38.303945 ], "pop" : 2622, "state" : "KY" } +{ "_id" : "40057", "city" : "CROPPER", "loc" : [ -85.087198, 38.358718 ], "pop" : 2669, "state" : "KY" } +{ "_id" : "40059", "city" : "PROSPECT", "loc" : [ -85.608287, 38.355987 ], "pop" : 7454, "state" : "KY" } +{ "_id" : "40060", "city" : "RAYWICK", "loc" : [ -85.43003, 37.537959 ], "pop" : 981, "state" : "KY" } +{ "_id" : "40061", "city" : "SAINT CATHARINE", "loc" : [ -85.27106000000001, 37.699126 ], "pop" : 39, "state" : "KY" } +{ "_id" : "40062", "city" : "SAINT FRANCIS", "loc" : [ -85.464208, 37.628644 ], "pop" : 39, "state" : "KY" } +{ "_id" : "40065", "city" : "SHELBYVILLE", "loc" : [ -85.224271, 38.216222 ], "pop" : 14843, "state" : "KY" } +{ "_id" : "40067", "city" : "SIMPSONVILLE", "loc" : [ -85.354797, 38.231186 ], "pop" : 2443, "state" : "KY" } +{ "_id" : "40068", "city" : "SMITHFIELD", "loc" : [ -85.265579, 38.393308 ], "pop" : 1250, "state" : "KY" } +{ "_id" : "40069", "city" : "MAUD", "loc" : [ -85.24047299999999, 37.701352 ], "pop" : 6314, "state" : "KY" } +{ "_id" : "40070", "city" : "SULPHUR", "loc" : [ -85.252021, 38.492062 ], "pop" : 466, "state" : "KY" } +{ "_id" : "40071", "city" : "TAYLORSVILLE", "loc" : [ -85.38286100000001, 38.047054 ], "pop" : 7048, "state" : "KY" } +{ "_id" : "40075", "city" : "TURNERS STATION", "loc" : [ -85.13251200000001, 38.550361 ], "pop" : 611, "state" : "KY" } +{ "_id" : "40076", "city" : "WADDY", "loc" : [ -85.12882999999999, 38.105445 ], "pop" : 1510, "state" : "KY" } +{ "_id" : "40077", "city" : "WESTPORT", "loc" : [ -85.45242, 38.492068 ], "pop" : 500, "state" : "KY" } +{ "_id" : "40078", "city" : "WILLISBURG", "loc" : [ -85.13618700000001, 37.837333 ], "pop" : 2245, "state" : "KY" } +{ "_id" : "40104", "city" : "BATTLETOWN", "loc" : [ -86.299104, 38.039295 ], "pop" : 2532, "state" : "KY" } +{ "_id" : "40106", "city" : "BIG SPRING", "loc" : [ -86.19179099999999, 37.798795 ], "pop" : 315, "state" : "KY" } +{ "_id" : "40107", "city" : "BOSTON", "loc" : [ -85.619927, 37.763991 ], "pop" : 2589, "state" : "KY" } +{ "_id" : "40108", "city" : "BRANDENBURG", "loc" : [ -86.10835899999999, 37.96624 ], "pop" : 6480, "state" : "KY" } +{ "_id" : "40109", "city" : "BROOKS", "loc" : [ -85.771344, 38.054576 ], "pop" : 4447, "state" : "KY" } +{ "_id" : "40111", "city" : "CLOVERPORT", "loc" : [ -86.595401, 37.822125 ], "pop" : 2852, "state" : "KY" } +{ "_id" : "40114", "city" : "CONSTANTINE", "loc" : [ -86.24009, 37.679412 ], "pop" : 67, "state" : "KY" } +{ "_id" : "40115", "city" : "CUSTER", "loc" : [ -86.271006, 37.742593 ], "pop" : 47, "state" : "KY" } +{ "_id" : "40117", "city" : "EKRON", "loc" : [ -86.154212, 37.91129 ], "pop" : 2565, "state" : "KY" } +{ "_id" : "40118", "city" : "FAIRDALE", "loc" : [ -85.754924, 38.108668 ], "pop" : 8297, "state" : "KY" } +{ "_id" : "40119", "city" : "GLEN DEAN", "loc" : [ -86.51074699999999, 37.569353 ], "pop" : 770, "state" : "KY" } +{ "_id" : "40121", "city" : "FORT KNOX", "loc" : [ -85.948909, 37.892798 ], "pop" : 15407, "state" : "KY" } +{ "_id" : "40140", "city" : "GARFIELD", "loc" : [ -86.316868, 37.814508 ], "pop" : 613, "state" : "KY" } +{ "_id" : "40142", "city" : "GUSTON", "loc" : [ -86.215515, 37.89511 ], "pop" : 1525, "state" : "KY" } +{ "_id" : "40143", "city" : "MOOLEYVILLE", "loc" : [ -86.416856, 37.772548 ], "pop" : 3995, "state" : "KY" } +{ "_id" : "40144", "city" : "LOCUST HILL", "loc" : [ -86.37779, 37.742925 ], "pop" : 1648, "state" : "KY" } +{ "_id" : "40145", "city" : "HUDSON", "loc" : [ -86.301238, 37.650613 ], "pop" : 55, "state" : "KY" } +{ "_id" : "40146", "city" : "IRVINGTON", "loc" : [ -86.29653399999999, 37.876239 ], "pop" : 2335, "state" : "KY" } +{ "_id" : "40150", "city" : "LEBANON JUNCTION", "loc" : [ -85.72464100000001, 37.851054 ], "pop" : 5051, "state" : "KY" } +{ "_id" : "40152", "city" : "MC DANIELS", "loc" : [ -86.397278, 37.595251 ], "pop" : 44, "state" : "KY" } +{ "_id" : "40157", "city" : "PAYNEVILLE", "loc" : [ -86.408164, 38.030128 ], "pop" : 504, "state" : "KY" } +{ "_id" : "40160", "city" : "RADCLIFF", "loc" : [ -85.94040800000001, 37.826652 ], "pop" : 21490, "state" : "KY" } +{ "_id" : "40161", "city" : "RHODELIA", "loc" : [ -86.304079, 37.968538 ], "pop" : 1322, "state" : "KY" } +{ "_id" : "40162", "city" : "RINEYVILLE", "loc" : [ -85.995395, 37.75249 ], "pop" : 4542, "state" : "KY" } +{ "_id" : "40164", "city" : "SE REE", "loc" : [ -86.399176, 37.676018 ], "pop" : 299, "state" : "KY" } +{ "_id" : "40165", "city" : "SHEPHERDSVILLE", "loc" : [ -85.688767, 38.004515 ], "pop" : 18649, "state" : "KY" } +{ "_id" : "40170", "city" : "STEPHENSPORT", "loc" : [ -86.523961, 37.904781 ], "pop" : 134, "state" : "KY" } +{ "_id" : "40171", "city" : "UNION STAR", "loc" : [ -86.461519, 37.961589 ], "pop" : 606, "state" : "KY" } +{ "_id" : "40175", "city" : "VINE GROVE", "loc" : [ -86.006888, 37.858937 ], "pop" : 13294, "state" : "KY" } +{ "_id" : "40176", "city" : "WEBSTER", "loc" : [ -86.403204, 37.923936 ], "pop" : 258, "state" : "KY" } +{ "_id" : "40177", "city" : "WEST POINT", "loc" : [ -85.95450200000001, 37.995408 ], "pop" : 1235, "state" : "KY" } +{ "_id" : "40178", "city" : "WESTVIEW", "loc" : [ -86.427286, 37.679196 ], "pop" : 223, "state" : "KY" } +{ "_id" : "40202", "city" : "LOUISVILLE", "loc" : [ -85.747646, 38.250734 ], "pop" : 5221, "state" : "KY" } +{ "_id" : "40203", "city" : "LOUISVILLE", "loc" : [ -85.762595, 38.245332 ], "pop" : 19432, "state" : "KY" } +{ "_id" : "40204", "city" : "LOUISVILLE", "loc" : [ -85.72493799999999, 38.236936 ], "pop" : 16467, "state" : "KY" } +{ "_id" : "40205", "city" : "LOUISVILLE", "loc" : [ -85.688542, 38.22217 ], "pop" : 24979, "state" : "KY" } +{ "_id" : "40206", "city" : "SAINT MATTHEWS", "loc" : [ -85.697581, 38.256495 ], "pop" : 20604, "state" : "KY" } +{ "_id" : "40207", "city" : "SAINT MATTHEWS", "loc" : [ -85.649689, 38.257908 ], "pop" : 30193, "state" : "KY" } +{ "_id" : "40208", "city" : "LOUISVILLE", "loc" : [ -85.76482300000001, 38.219988 ], "pop" : 13523, "state" : "KY" } +{ "_id" : "40209", "city" : "LOUISVILLE", "loc" : [ -85.751904, 38.190125 ], "pop" : 2752, "state" : "KY" } +{ "_id" : "40210", "city" : "LOUISVILLE", "loc" : [ -85.790548, 38.230585 ], "pop" : 18623, "state" : "KY" } +{ "_id" : "40211", "city" : "LOUISVILLE", "loc" : [ -85.81265, 38.241958 ], "pop" : 26422, "state" : "KY" } +{ "_id" : "40212", "city" : "LOUISVILLE", "loc" : [ -85.804479, 38.265116 ], "pop" : 21605, "state" : "KY" } +{ "_id" : "40213", "city" : "LOUISVILLE", "loc" : [ -85.71064200000001, 38.183929 ], "pop" : 21288, "state" : "KY" } +{ "_id" : "40214", "city" : "LOUISVILLE", "loc" : [ -85.77802699999999, 38.159318 ], "pop" : 42198, "state" : "KY" } +{ "_id" : "40215", "city" : "LOUISVILLE", "loc" : [ -85.784707, 38.191319 ], "pop" : 24661, "state" : "KY" } +{ "_id" : "40216", "city" : "SHIVELY", "loc" : [ -85.831771, 38.186138 ], "pop" : 41719, "state" : "KY" } +{ "_id" : "40217", "city" : "LOUISVILLE", "loc" : [ -85.740371, 38.21736 ], "pop" : 13213, "state" : "KY" } +{ "_id" : "40218", "city" : "BUECHEL", "loc" : [ -85.65483399999999, 38.191084 ], "pop" : 31434, "state" : "KY" } +{ "_id" : "40219", "city" : "OKOLONA", "loc" : [ -85.680548, 38.141291 ], "pop" : 38009, "state" : "KY" } +{ "_id" : "40220", "city" : "LOUISVILLE", "loc" : [ -85.624489, 38.21494 ], "pop" : 29012, "state" : "KY" } +{ "_id" : "40222", "city" : "LYNDON", "loc" : [ -85.611183, 38.263825 ], "pop" : 19924, "state" : "KY" } +{ "_id" : "40223", "city" : "ANCHORAGE", "loc" : [ -85.561151, 38.253688 ], "pop" : 19766, "state" : "KY" } +{ "_id" : "40228", "city" : "BUECHEL", "loc" : [ -85.630967, 38.1392 ], "pop" : 9192, "state" : "KY" } +{ "_id" : "40229", "city" : "OKOLONA", "loc" : [ -85.67188899999999, 38.090655 ], "pop" : 26878, "state" : "KY" } +{ "_id" : "40241", "city" : "LYNDON", "loc" : [ -85.582421, 38.301509 ], "pop" : 14137, "state" : "KY" } +{ "_id" : "40242", "city" : "LYNDON", "loc" : [ -85.59022400000001, 38.276858 ], "pop" : 9742, "state" : "KY" } +{ "_id" : "40243", "city" : "MIDDLETOWN", "loc" : [ -85.537381, 38.240115 ], "pop" : 9317, "state" : "KY" } +{ "_id" : "40245", "city" : "LOUISVILLE", "loc" : [ -85.484461, 38.268273 ], "pop" : 8662, "state" : "KY" } +{ "_id" : "40258", "city" : "PLEASURE RIDGE P", "loc" : [ -85.862505, 38.142369 ], "pop" : 24515, "state" : "KY" } +{ "_id" : "40272", "city" : "VALLEY STATION", "loc" : [ -85.858701, 38.097063 ], "pop" : 32843, "state" : "KY" } +{ "_id" : "40291", "city" : "FERN CREEK", "loc" : [ -85.59451300000001, 38.15205 ], "pop" : 22429, "state" : "KY" } +{ "_id" : "40299", "city" : "JEFFERSONTOWN", "loc" : [ -85.56894699999999, 38.188491 ], "pop" : 23882, "state" : "KY" } +{ "_id" : "40311", "city" : "CARLISLE", "loc" : [ -84.027902, 38.321233 ], "pop" : 6825, "state" : "KY" } +{ "_id" : "40312", "city" : "WESTBEND", "loc" : [ -83.934693, 37.860571 ], "pop" : 5408, "state" : "KY" } +{ "_id" : "40313", "city" : "CLEARFIELD", "loc" : [ -83.32728899999999, 38.143992 ], "pop" : 1942, "state" : "KY" } +{ "_id" : "40316", "city" : "DENNISTON", "loc" : [ -83.513136, 37.919068 ], "pop" : 238, "state" : "KY" } +{ "_id" : "40322", "city" : "SCRANTON", "loc" : [ -83.642405, 37.946031 ], "pop" : 3175, "state" : "KY" } +{ "_id" : "40324", "city" : "GEORGETOWN", "loc" : [ -84.556179, 38.211712 ], "pop" : 18666, "state" : "KY" } +{ "_id" : "40327", "city" : "GRATZ", "loc" : [ -84.942882, 38.478104 ], "pop" : 216, "state" : "KY" } +{ "_id" : "40328", "city" : "GRAVEL SWITCH", "loc" : [ -85.082403, 37.575802 ], "pop" : 962, "state" : "KY" } +{ "_id" : "40330", "city" : "CORNISHVILLE", "loc" : [ -84.84675, 37.769989 ], "pop" : 17727, "state" : "KY" } +{ "_id" : "40336", "city" : "JINKS", "loc" : [ -83.996172, 37.705051 ], "pop" : 13349, "state" : "KY" } +{ "_id" : "40337", "city" : "JEFFERSONVILLE", "loc" : [ -83.855778, 37.964004 ], "pop" : 4303, "state" : "KY" } +{ "_id" : "40339", "city" : "KEENE", "loc" : [ -84.65192399999999, 37.941057 ], "pop" : 253, "state" : "KY" } +{ "_id" : "40341", "city" : "LAMERO", "loc" : [ -84.162353, 37.319166 ], "pop" : 25, "state" : "KY" } +{ "_id" : "40342", "city" : "LAWRENCEBURG", "loc" : [ -84.92993800000001, 38.018853 ], "pop" : 13485, "state" : "KY" } +{ "_id" : "40345", "city" : "MARIBA", "loc" : [ -83.553692, 37.913527 ], "pop" : 374, "state" : "KY" } +{ "_id" : "40346", "city" : "MEANS", "loc" : [ -83.725343, 37.928382 ], "pop" : 324, "state" : "KY" } +{ "_id" : "40347", "city" : "MIDWAY", "loc" : [ -84.69284500000001, 38.148741 ], "pop" : 2079, "state" : "KY" } +{ "_id" : "40350", "city" : "MOOREFIELD", "loc" : [ -83.892889, 38.292627 ], "pop" : 383, "state" : "KY" } +{ "_id" : "40351", "city" : "MOREHEAD", "loc" : [ -83.443645, 38.199047 ], "pop" : 18413, "state" : "KY" } +{ "_id" : "40353", "city" : "MOUNT STERLING", "loc" : [ -83.938774, 38.054822 ], "pop" : 15242, "state" : "KY" } +{ "_id" : "40355", "city" : "NEW LIBERTY", "loc" : [ -84.90106400000001, 38.624556 ], "pop" : 2262, "state" : "KY" } +{ "_id" : "40356", "city" : "NICHOLASVILLE", "loc" : [ -84.56459, 37.880794 ], "pop" : 22920, "state" : "KY" } +{ "_id" : "40358", "city" : "OLYMPIA", "loc" : [ -83.758456, 38.061089 ], "pop" : 640, "state" : "KY" } +{ "_id" : "40359", "city" : "OWENTON", "loc" : [ -84.808632, 38.4986 ], "pop" : 6326, "state" : "KY" } +{ "_id" : "40360", "city" : "OWINGSVILLE", "loc" : [ -83.756439, 38.153196 ], "pop" : 4583, "state" : "KY" } +{ "_id" : "40361", "city" : "PARIS", "loc" : [ -84.24498699999999, 38.208293 ], "pop" : 18722, "state" : "KY" } +{ "_id" : "40365", "city" : "POMEROYTON", "loc" : [ -83.526315, 37.874352 ], "pop" : 480, "state" : "KY" } +{ "_id" : "40370", "city" : "SADIEVILLE", "loc" : [ -84.53842400000001, 38.390816 ], "pop" : 2694, "state" : "KY" } +{ "_id" : "40371", "city" : "SALT LICK", "loc" : [ -83.631619, 38.104031 ], "pop" : 2687, "state" : "KY" } +{ "_id" : "40372", "city" : "BONDVILLE", "loc" : [ -84.884546, 37.915078 ], "pop" : 1684, "state" : "KY" } +{ "_id" : "40374", "city" : "SHARPSBURG", "loc" : [ -83.893199, 38.214742 ], "pop" : 1685, "state" : "KY" } +{ "_id" : "40376", "city" : "SLADE", "loc" : [ -83.68485200000001, 37.788958 ], "pop" : 318, "state" : "KY" } +{ "_id" : "40379", "city" : "STAMPING GROUND", "loc" : [ -84.68182400000001, 38.288802 ], "pop" : 3757, "state" : "KY" } +{ "_id" : "40380", "city" : "PATSEY", "loc" : [ -83.829947, 37.842703 ], "pop" : 5966, "state" : "KY" } +{ "_id" : "40383", "city" : "VERSAILLES", "loc" : [ -84.728683, 38.041301 ], "pop" : 18204, "state" : "KY" } +{ "_id" : "40385", "city" : "BYBEE", "loc" : [ -84.11706100000001, 37.766833 ], "pop" : 1433, "state" : "KY" } +{ "_id" : "40387", "city" : "KOREA", "loc" : [ -83.47305, 37.965353 ], "pop" : 501, "state" : "KY" } +{ "_id" : "40390", "city" : "HIGH BRIDGE", "loc" : [ -84.66207900000001, 37.862141 ], "pop" : 5600, "state" : "KY" } +{ "_id" : "40391", "city" : "WINCHESTER", "loc" : [ -84.178894, 37.987161 ], "pop" : 29149, "state" : "KY" } +{ "_id" : "40402", "city" : "MOORES CREEK", "loc" : [ -83.959737, 37.306965 ], "pop" : 1941, "state" : "KY" } +{ "_id" : "40403", "city" : "BEREA", "loc" : [ -84.274919, 37.579942 ], "pop" : 16561, "state" : "KY" } +{ "_id" : "40409", "city" : "BRODHEAD", "loc" : [ -84.43358000000001, 37.381524 ], "pop" : 2596, "state" : "KY" } +{ "_id" : "40415", "city" : "COBHILL", "loc" : [ -83.840053, 37.743428 ], "pop" : 284, "state" : "KY" } +{ "_id" : "40417", "city" : "CONWAY", "loc" : [ -84.308072, 37.479933 ], "pop" : 2806, "state" : "KY" } +{ "_id" : "40419", "city" : "CRAB ORCHARD", "loc" : [ -84.49391199999999, 37.446523 ], "pop" : 5197, "state" : "KY" } +{ "_id" : "40422", "city" : "DANVILLE", "loc" : [ -84.77469600000001, 37.646524 ], "pop" : 19483, "state" : "KY" } +{ "_id" : "40426", "city" : "DREYFUS", "loc" : [ -84.154495, 37.650696 ], "pop" : 562, "state" : "KY" } +{ "_id" : "40437", "city" : "HUSTONVILLE", "loc" : [ -84.85277499999999, 37.459503 ], "pop" : 2965, "state" : "KY" } +{ "_id" : "40440", "city" : "JUNCTION CITY", "loc" : [ -84.80278199999999, 37.582157 ], "pop" : 3582, "state" : "KY" } +{ "_id" : "40442", "city" : "KINGS MOUNTAIN", "loc" : [ -84.714764, 37.381795 ], "pop" : 2385, "state" : "KY" } +{ "_id" : "40444", "city" : "LANCASTER", "loc" : [ -84.596912, 37.658391 ], "pop" : 8664, "state" : "KY" } +{ "_id" : "40445", "city" : "LIVINGSTON", "loc" : [ -84.231776, 37.307391 ], "pop" : 1320, "state" : "KY" } +{ "_id" : "40447", "city" : "CLOVER BOTTOM", "loc" : [ -84.00896, 37.431678 ], "pop" : 8071, "state" : "KY" } +{ "_id" : "40456", "city" : "CLIMAX", "loc" : [ -84.354882, 37.336609 ], "pop" : 5636, "state" : "KY" } +{ "_id" : "40460", "city" : "ORLANDO", "loc" : [ -84.25280100000001, 37.373405 ], "pop" : 1429, "state" : "KY" } +{ "_id" : "40461", "city" : "PAINT LICK", "loc" : [ -84.426869, 37.609231 ], "pop" : 3361, "state" : "KY" } +{ "_id" : "40464", "city" : "PARKSVILLE", "loc" : [ -84.92813200000001, 37.577768 ], "pop" : 893, "state" : "KY" } +{ "_id" : "40468", "city" : "PERRYVILLE", "loc" : [ -84.966508, 37.637494 ], "pop" : 2019, "state" : "KY" } +{ "_id" : "40471", "city" : "PRYSE", "loc" : [ -83.842586, 37.684068 ], "pop" : 250, "state" : "KY" } +{ "_id" : "40472", "city" : "RAVENNA", "loc" : [ -83.93865700000001, 37.686711 ], "pop" : 798, "state" : "KY" } +{ "_id" : "40475", "city" : "RICHMOND", "loc" : [ -84.295526, 37.754605 ], "pop" : 37946, "state" : "KY" } +{ "_id" : "40481", "city" : "SANDGAP", "loc" : [ -84.056676, 37.487097 ], "pop" : 837, "state" : "KY" } +{ "_id" : "40484", "city" : "STANFORD", "loc" : [ -84.691177, 37.524529 ], "pop" : 9072, "state" : "KY" } +{ "_id" : "40486", "city" : "ELIAS", "loc" : [ -83.87067399999999, 37.343023 ], "pop" : 837, "state" : "KY" } +{ "_id" : "40489", "city" : "WAYNESBURG", "loc" : [ -84.665486, 37.349932 ], "pop" : 4024, "state" : "KY" } +{ "_id" : "40502", "city" : "LEXINGTON", "loc" : [ -84.485423, 38.017394 ], "pop" : 30886, "state" : "KY" } +{ "_id" : "40503", "city" : "LEXINGTON", "loc" : [ -84.52821, 38.001002 ], "pop" : 33537, "state" : "KY" } +{ "_id" : "40504", "city" : "LEXINGTON", "loc" : [ -84.543325, 38.040628 ], "pop" : 22397, "state" : "KY" } +{ "_id" : "40505", "city" : "LEXINGTON", "loc" : [ -84.458338, 38.061201 ], "pop" : 28344, "state" : "KY" } +{ "_id" : "40507", "city" : "LEXINGTON", "loc" : [ -84.495289, 38.046385 ], "pop" : 2291, "state" : "KY" } +{ "_id" : "40508", "city" : "LEXINGTON", "loc" : [ -84.49643500000001, 38.04754 ], "pop" : 25161, "state" : "KY" } +{ "_id" : "40509", "city" : "LEXINGTON", "loc" : [ -84.427419, 38.010166 ], "pop" : 9029, "state" : "KY" } +{ "_id" : "40510", "city" : "LEXINGTON", "loc" : [ -84.59104600000001, 38.070211 ], "pop" : 1467, "state" : "KY" } +{ "_id" : "40511", "city" : "LEXINGTON", "loc" : [ -84.500671, 38.093233 ], "pop" : 16309, "state" : "KY" } +{ "_id" : "40513", "city" : "LEXINGTON", "loc" : [ -84.58152200000001, 38.01388 ], "pop" : 3383, "state" : "KY" } +{ "_id" : "40514", "city" : "LEXINGTON", "loc" : [ -84.576667, 37.983291 ], "pop" : 6252, "state" : "KY" } +{ "_id" : "40515", "city" : "LEXINGTON", "loc" : [ -84.47075100000001, 37.965102 ], "pop" : 20125, "state" : "KY" } +{ "_id" : "40516", "city" : "LEXINGTON", "loc" : [ -84.35480200000001, 38.054355 ], "pop" : 1294, "state" : "KY" } +{ "_id" : "40517", "city" : "LEXINGTON", "loc" : [ -84.481588, 37.984864 ], "pop" : 26787, "state" : "KY" } +{ "_id" : "40601", "city" : "HATTON", "loc" : [ -84.88061, 38.192831 ], "pop" : 46563, "state" : "KY" } +{ "_id" : "40701", "city" : "CORBIN", "loc" : [ -84.10208, 36.934429 ], "pop" : 17476, "state" : "KY" } +{ "_id" : "40724", "city" : "BUSH", "loc" : [ -83.976117, 37.070874 ], "pop" : 5759, "state" : "KY" } +{ "_id" : "40729", "city" : "SYMBOL", "loc" : [ -84.14567599999999, 37.190779 ], "pop" : 8589, "state" : "KY" } +{ "_id" : "40734", "city" : "GRAY", "loc" : [ -83.982799, 36.946743 ], "pop" : 2418, "state" : "KY" } +{ "_id" : "40737", "city" : "KEAVY", "loc" : [ -84.14360600000001, 37.015604 ], "pop" : 1323, "state" : "KY" } +{ "_id" : "40740", "city" : "LILY", "loc" : [ -84.08071, 37.002295 ], "pop" : 7471, "state" : "KY" } +{ "_id" : "40741", "city" : "SASSER", "loc" : [ -84.097498, 37.101605 ], "pop" : 20329, "state" : "KY" } +{ "_id" : "40754", "city" : "NEVISDALE", "loc" : [ -84.111113, 36.663711 ], "pop" : 157, "state" : "KY" } +{ "_id" : "40759", "city" : "ROCKHOLDS", "loc" : [ -84.10404800000001, 36.824216 ], "pop" : 1433, "state" : "KY" } +{ "_id" : "40763", "city" : "SILER", "loc" : [ -83.964192, 36.720352 ], "pop" : 151, "state" : "KY" } +{ "_id" : "40769", "city" : "PLEASANT VIEW", "loc" : [ -84.143592, 36.735535 ], "pop" : 20235, "state" : "KY" } +{ "_id" : "40771", "city" : "WOODBINE", "loc" : [ -84.08274299999999, 36.918793 ], "pop" : 10, "state" : "KY" } +{ "_id" : "40801", "city" : "AGES BROOKSIDE", "loc" : [ -83.235294, 36.840734 ], "pop" : 164, "state" : "KY" } +{ "_id" : "40806", "city" : "BAXTER", "loc" : [ -83.314082, 36.874913 ], "pop" : 2151, "state" : "KY" } +{ "_id" : "40807", "city" : "BENHAM", "loc" : [ -82.90939899999999, 36.957377 ], "pop" : 98, "state" : "KY" } +{ "_id" : "40808", "city" : "BIG LAUREL", "loc" : [ -83.156468, 37.002795 ], "pop" : 0, "state" : "KY" } +{ "_id" : "40810", "city" : "LEWIS CREEK", "loc" : [ -83.35390099999999, 36.912348 ], "pop" : 567, "state" : "KY" } +{ "_id" : "40813", "city" : "CALVIN", "loc" : [ -83.737144, 36.707818 ], "pop" : 2047, "state" : "KY" } +{ "_id" : "40815", "city" : "CRUMMIES", "loc" : [ -83.265719, 36.74619 ], "pop" : 154, "state" : "KY" } +{ "_id" : "40818", "city" : "COALGOOD", "loc" : [ -83.238782, 36.793394 ], "pop" : 1218, "state" : "KY" } +{ "_id" : "40819", "city" : "COLDIRON", "loc" : [ -83.40959100000001, 36.877718 ], "pop" : 392, "state" : "KY" } +{ "_id" : "40820", "city" : "CRANKS", "loc" : [ -83.203948, 36.760228 ], "pop" : 529, "state" : "KY" } +{ "_id" : "40823", "city" : "CUMBERLAND", "loc" : [ -82.977052, 36.971085 ], "pop" : 6601, "state" : "KY" } +{ "_id" : "40824", "city" : "DAYHOIT", "loc" : [ -83.394329, 36.864603 ], "pop" : 44, "state" : "KY" } +{ "_id" : "40825", "city" : "DIZNEY", "loc" : [ -83.117659, 36.817697 ], "pop" : 42, "state" : "KY" } +{ "_id" : "40826", "city" : "EOLIA", "loc" : [ -82.77061999999999, 37.061767 ], "pop" : 676, "state" : "KY" } +{ "_id" : "40828", "city" : "LOUELLEN", "loc" : [ -83.181648, 36.855294 ], "pop" : 4578, "state" : "KY" } +{ "_id" : "40829", "city" : "GRAYS KNOB", "loc" : [ -83.323998, 36.811105 ], "pop" : 3057, "state" : "KY" } +{ "_id" : "40830", "city" : "GULSTON", "loc" : [ -83.326227, 36.765622 ], "pop" : 456, "state" : "KY" } +{ "_id" : "40831", "city" : "CHEVROLET", "loc" : [ -83.31957300000001, 36.84999 ], "pop" : 6636, "state" : "KY" } +{ "_id" : "40843", "city" : "HOLMES MILL", "loc" : [ -82.994304, 36.875652 ], "pop" : 624, "state" : "KY" } +{ "_id" : "40845", "city" : "HULEN", "loc" : [ -83.555132, 36.771449 ], "pop" : 2719, "state" : "KY" } +{ "_id" : "40846", "city" : "KEITH", "loc" : [ -83.361367, 36.871241 ], "pop" : 185, "state" : "KY" } +{ "_id" : "40847", "city" : "KENVIR", "loc" : [ -83.16055, 36.777596 ], "pop" : 346, "state" : "KY" } +{ "_id" : "40849", "city" : "LEJUNIOR", "loc" : [ -83.19048600000001, 36.921199 ], "pop" : 1536, "state" : "KY" } +{ "_id" : "40855", "city" : "LYNCH", "loc" : [ -82.915629, 36.997856 ], "pop" : 125, "state" : "KY" } +{ "_id" : "40858", "city" : "MOZELLE", "loc" : [ -83.413499, 37.003666 ], "pop" : 2762, "state" : "KY" } +{ "_id" : "40861", "city" : "OVEN FORK", "loc" : [ -82.818484, 37.053929 ], "pop" : 356, "state" : "KY" } +{ "_id" : "40862", "city" : "PARTRIDGE", "loc" : [ -82.877168, 37.012932 ], "pop" : 861, "state" : "KY" } +{ "_id" : "40863", "city" : "PATHFORK", "loc" : [ -83.462925, 36.752071 ], "pop" : 545, "state" : "KY" } +{ "_id" : "40865", "city" : "PUTNEY", "loc" : [ -83.26079300000001, 36.925907 ], "pop" : 348, "state" : "KY" } +{ "_id" : "40867", "city" : "SMITH", "loc" : [ -83.32090599999999, 36.71869 ], "pop" : 312, "state" : "KY" } +{ "_id" : "40868", "city" : "STINNETT", "loc" : [ -83.390742, 37.08835 ], "pop" : 324, "state" : "KY" } +{ "_id" : "40870", "city" : "TOTZ", "loc" : [ -83.201891, 36.970968 ], "pop" : 301, "state" : "KY" } +{ "_id" : "40873", "city" : "WALLINS CREEK", "loc" : [ -83.41896800000001, 36.816532 ], "pop" : 3386, "state" : "KY" } +{ "_id" : "40902", "city" : "ARJAY", "loc" : [ -83.641537, 36.828342 ], "pop" : 1676, "state" : "KY" } +{ "_id" : "40903", "city" : "ARTEMUS", "loc" : [ -83.832886, 36.838837 ], "pop" : 520, "state" : "KY" } +{ "_id" : "40906", "city" : "BAILEY SWITCH", "loc" : [ -83.899316, 36.864807 ], "pop" : 8506, "state" : "KY" } +{ "_id" : "40913", "city" : "BEVERLY", "loc" : [ -83.556031, 36.944179 ], "pop" : 63, "state" : "KY" } +{ "_id" : "40914", "city" : "BIG CREEK", "loc" : [ -83.633095, 37.14168 ], "pop" : 3877, "state" : "KY" } +{ "_id" : "40915", "city" : "BIMBLE", "loc" : [ -83.82817900000001, 36.886751 ], "pop" : 836, "state" : "KY" } +{ "_id" : "40921", "city" : "BRYANTS STORE", "loc" : [ -83.930729, 36.783087 ], "pop" : 907, "state" : "KY" } +{ "_id" : "40923", "city" : "CANNON", "loc" : [ -83.84249800000001, 36.94888 ], "pop" : 2396, "state" : "KY" } +{ "_id" : "40927", "city" : "CLOSPLINT", "loc" : [ -83.099766, 36.89227 ], "pop" : 1472, "state" : "KY" } +{ "_id" : "40930", "city" : "DEWITT", "loc" : [ -83.73156, 36.8738 ], "pop" : 379, "state" : "KY" } +{ "_id" : "40935", "city" : "SALT GUM", "loc" : [ -83.77139699999999, 36.834531 ], "pop" : 1706, "state" : "KY" } +{ "_id" : "40940", "city" : "FONDE", "loc" : [ -83.895022, 36.64455 ], "pop" : 1326, "state" : "KY" } +{ "_id" : "40943", "city" : "GIRDLER", "loc" : [ -83.85388, 36.969096 ], "pop" : 229, "state" : "KY" } +{ "_id" : "40946", "city" : "GREEN ROAD", "loc" : [ -83.895768, 36.998937 ], "pop" : 360, "state" : "KY" } +{ "_id" : "40949", "city" : "HEIDRICK", "loc" : [ -83.86650899999999, 36.892696 ], "pop" : 1362, "state" : "KY" } +{ "_id" : "40953", "city" : "HINKLE", "loc" : [ -83.780441, 36.875323 ], "pop" : 269, "state" : "KY" } +{ "_id" : "40958", "city" : "KETTLE ISLAND", "loc" : [ -83.58918300000001, 36.809344 ], "pop" : 710, "state" : "KY" } +{ "_id" : "40962", "city" : "BRIGHT SHADE", "loc" : [ -83.768291, 37.142321 ], "pop" : 13727, "state" : "KY" } +{ "_id" : "40964", "city" : "MARY ALICE", "loc" : [ -83.424408, 36.706797 ], "pop" : 115, "state" : "KY" } +{ "_id" : "40965", "city" : "MIDDLESBORO", "loc" : [ -83.723079, 36.617188 ], "pop" : 14900, "state" : "KY" } +{ "_id" : "40970", "city" : "MILLS", "loc" : [ -83.605305, 36.940659 ], "pop" : 471, "state" : "KY" } +{ "_id" : "40972", "city" : "ONEIDA", "loc" : [ -83.655467, 37.2677 ], "pop" : 2371, "state" : "KY" } +{ "_id" : "40977", "city" : "CALLAWAY", "loc" : [ -83.698502, 36.751302 ], "pop" : 7658, "state" : "KY" } +{ "_id" : "40979", "city" : "ROARK", "loc" : [ -83.506201, 37.024432 ], "pop" : 463, "state" : "KY" } +{ "_id" : "40982", "city" : "SCALF", "loc" : [ -83.72655399999999, 36.91748 ], "pop" : 600, "state" : "KY" } +{ "_id" : "40983", "city" : "SEXTONS CREEK", "loc" : [ -83.798378, 37.27334 ], "pop" : 1776, "state" : "KY" } +{ "_id" : "40988", "city" : "STONEY FORK", "loc" : [ -83.538504, 36.889184 ], "pop" : 387, "state" : "KY" } +{ "_id" : "40995", "city" : "TROSPER", "loc" : [ -83.831442, 36.782564 ], "pop" : 1245, "state" : "KY" } +{ "_id" : "40997", "city" : "WALKER", "loc" : [ -83.66160000000001, 36.891138 ], "pop" : 120, "state" : "KY" } +{ "_id" : "40999", "city" : "WOOLLUM", "loc" : [ -83.847202, 37.009657 ], "pop" : 219, "state" : "KY" } +{ "_id" : "41001", "city" : "ALEXANDRIA", "loc" : [ -84.394329, 38.940605 ], "pop" : 11858, "state" : "KY" } +{ "_id" : "41002", "city" : "AUGUSTA", "loc" : [ -83.995352, 38.762991 ], "pop" : 1902, "state" : "KY" } +{ "_id" : "41003", "city" : "BERRY", "loc" : [ -84.361118, 38.515974 ], "pop" : 2083, "state" : "KY" } +{ "_id" : "41004", "city" : "BROOKSVILLE", "loc" : [ -84.078649, 38.664387 ], "pop" : 4309, "state" : "KY" } +{ "_id" : "41005", "city" : "RABBIT HASH", "loc" : [ -84.74142000000001, 39.032411 ], "pop" : 8322, "state" : "KY" } +{ "_id" : "41006", "city" : "BUTLER", "loc" : [ -84.34457999999999, 38.801328 ], "pop" : 4743, "state" : "KY" } +{ "_id" : "41007", "city" : "CALIFORNIA", "loc" : [ -84.309794, 38.900614 ], "pop" : 3427, "state" : "KY" } +{ "_id" : "41008", "city" : "CARROLLTON", "loc" : [ -85.173036, 38.669565 ], "pop" : 7072, "state" : "KY" } +{ "_id" : "41010", "city" : "CORINTH", "loc" : [ -84.584596, 38.53021 ], "pop" : 1701, "state" : "KY" } +{ "_id" : "41011", "city" : "COVINGTON", "loc" : [ -84.52121, 39.070839 ], "pop" : 29098, "state" : "KY" } +{ "_id" : "41014", "city" : "ROUSE", "loc" : [ -84.505061, 39.066593 ], "pop" : 8607, "state" : "KY" } +{ "_id" : "41015", "city" : "LATONIA", "loc" : [ -84.498858, 39.021686 ], "pop" : 19857, "state" : "KY" } +{ "_id" : "41016", "city" : "LUDLOW", "loc" : [ -84.548304, 39.088946 ], "pop" : 7210, "state" : "KY" } +{ "_id" : "41017", "city" : "DIXIE", "loc" : [ -84.56961099999999, 39.032378 ], "pop" : 34285, "state" : "KY" } +{ "_id" : "41018", "city" : "ERLANGER", "loc" : [ -84.597745, 39.008238 ], "pop" : 23909, "state" : "KY" } +{ "_id" : "41030", "city" : "CRITTENDEN", "loc" : [ -84.598202, 38.774107 ], "pop" : 2630, "state" : "KY" } +{ "_id" : "41031", "city" : "CYNTHIANA", "loc" : [ -84.294921, 38.396403 ], "pop" : 13375, "state" : "KY" } +{ "_id" : "41033", "city" : "DEMOSSVILLE", "loc" : [ -84.47080200000001, 38.75165 ], "pop" : 1292, "state" : "KY" } +{ "_id" : "41034", "city" : "DOVER", "loc" : [ -83.871793, 38.691016 ], "pop" : 1991, "state" : "KY" } +{ "_id" : "41035", "city" : "DRY RIDGE", "loc" : [ -84.62373599999999, 38.704854 ], "pop" : 6092, "state" : "KY" } +{ "_id" : "41039", "city" : "EWING", "loc" : [ -83.873317, 38.415651 ], "pop" : 2396, "state" : "KY" } +{ "_id" : "41040", "city" : "FALMOUTH", "loc" : [ -84.345124, 38.664304 ], "pop" : 6779, "state" : "KY" } +{ "_id" : "41041", "city" : "FLEMINGSBURG", "loc" : [ -83.70796799999999, 38.427983 ], "pop" : 6549, "state" : "KY" } +{ "_id" : "41042", "city" : "FLORENCE", "loc" : [ -84.64196099999999, 38.994065 ], "pop" : 34010, "state" : "KY" } +{ "_id" : "41043", "city" : "FOSTER", "loc" : [ -84.156593, 38.75064 ], "pop" : 1479, "state" : "KY" } +{ "_id" : "41044", "city" : "GERMANTOWN", "loc" : [ -83.960616, 38.707534 ], "pop" : 88, "state" : "KY" } +{ "_id" : "41045", "city" : "GHENT", "loc" : [ -85.055662, 38.718823 ], "pop" : 980, "state" : "KY" } +{ "_id" : "41046", "city" : "GLENCOE", "loc" : [ -84.81155200000001, 38.722946 ], "pop" : 589, "state" : "KY" } +{ "_id" : "41048", "city" : "HEBRON", "loc" : [ -84.700745, 39.07553 ], "pop" : 3497, "state" : "KY" } +{ "_id" : "41049", "city" : "HILLSBORO", "loc" : [ -83.66967, 38.29294 ], "pop" : 1981, "state" : "KY" } +{ "_id" : "41051", "city" : "INDEPENDENCE", "loc" : [ -84.547912, 38.935407 ], "pop" : 12778, "state" : "KY" } +{ "_id" : "41052", "city" : "JONESVILLE", "loc" : [ -84.76367, 38.648251 ], "pop" : 295, "state" : "KY" } +{ "_id" : "41055", "city" : "MAYS LICK", "loc" : [ -83.87487400000001, 38.52692 ], "pop" : 1786, "state" : "KY" } +{ "_id" : "41056", "city" : "LIMESTONE SQ", "loc" : [ -83.758858, 38.619716 ], "pop" : 12889, "state" : "KY" } +{ "_id" : "41059", "city" : "MELBOURNE", "loc" : [ -84.353751, 39.006699 ], "pop" : 2688, "state" : "KY" } +{ "_id" : "41063", "city" : "MORNING VIEW", "loc" : [ -84.506918, 38.83942 ], "pop" : 3938, "state" : "KY" } +{ "_id" : "41064", "city" : "MOUNT OLIVET", "loc" : [ -84.047977, 38.521751 ], "pop" : 2124, "state" : "KY" } +{ "_id" : "41071", "city" : "SOUTHGATE", "loc" : [ -84.48651099999999, 39.082847 ], "pop" : 22918, "state" : "KY" } +{ "_id" : "41073", "city" : "BELLEVUE", "loc" : [ -84.478746, 39.102431 ], "pop" : 6997, "state" : "KY" } +{ "_id" : "41074", "city" : "DAYTON", "loc" : [ -84.471155, 39.111428 ], "pop" : 6576, "state" : "KY" } +{ "_id" : "41075", "city" : "FORT THOMAS", "loc" : [ -84.45234000000001, 39.078634 ], "pop" : 16165, "state" : "KY" } +{ "_id" : "41076", "city" : "NEWPORT", "loc" : [ -84.440792, 39.026184 ], "pop" : 11237, "state" : "KY" } +{ "_id" : "41080", "city" : "PETERSBURG", "loc" : [ -84.837104, 39.041561 ], "pop" : 1219, "state" : "KY" } +{ "_id" : "41083", "city" : "SANDERS", "loc" : [ -84.973151, 38.661004 ], "pop" : 516, "state" : "KY" } +{ "_id" : "41085", "city" : "SILVER GROVE", "loc" : [ -84.390849, 39.034262 ], "pop" : 1210, "state" : "KY" } +{ "_id" : "41086", "city" : "SPARTA", "loc" : [ -84.881334, 38.725582 ], "pop" : 1186, "state" : "KY" } +{ "_id" : "41091", "city" : "UNION", "loc" : [ -84.72735900000001, 38.943511 ], "pop" : 4468, "state" : "KY" } +{ "_id" : "41092", "city" : "VERONA", "loc" : [ -84.69072199999999, 38.839012 ], "pop" : 2169, "state" : "KY" } +{ "_id" : "41093", "city" : "WALLINGFORD", "loc" : [ -83.562532, 38.337449 ], "pop" : 1366, "state" : "KY" } +{ "_id" : "41094", "city" : "WALTON", "loc" : [ -84.63276999999999, 38.887491 ], "pop" : 6253, "state" : "KY" } +{ "_id" : "41095", "city" : "WARSAW", "loc" : [ -84.84958399999999, 38.780704 ], "pop" : 3618, "state" : "KY" } +{ "_id" : "41097", "city" : "WILLIAMSTOWN", "loc" : [ -84.57441, 38.629191 ], "pop" : 5019, "state" : "KY" } +{ "_id" : "41098", "city" : "WORTHVILLE", "loc" : [ -85.066321, 38.617948 ], "pop" : 724, "state" : "KY" } +{ "_id" : "41101", "city" : "WESTWOOD", "loc" : [ -82.702709, 38.443038 ], "pop" : 17464, "state" : "KY" } +{ "_id" : "41102", "city" : "ASHLAND", "loc" : [ -82.644721, 38.461255 ], "pop" : 24865, "state" : "KY" } +{ "_id" : "41121", "city" : "ARGILLITE", "loc" : [ -82.809442, 38.432228 ], "pop" : 467, "state" : "KY" } +{ "_id" : "41124", "city" : "BLAINE", "loc" : [ -82.851347, 38.026974 ], "pop" : 982, "state" : "KY" } +{ "_id" : "41127", "city" : "CAMP DIX", "loc" : [ -83.28779299999999, 38.508044 ], "pop" : 269, "state" : "KY" } +{ "_id" : "41129", "city" : "CATLETTSBURG", "loc" : [ -82.632065, 38.379946 ], "pop" : 8851, "state" : "KY" } +{ "_id" : "41132", "city" : "DENTON", "loc" : [ -82.82692400000001, 38.295212 ], "pop" : 452, "state" : "KY" } +{ "_id" : "41135", "city" : "HEAD OF GRASSY", "loc" : [ -83.261786, 38.367225 ], "pop" : 435, "state" : "KY" } +{ "_id" : "41137", "city" : "FIREBRICK", "loc" : [ -83.04320300000001, 38.687785 ], "pop" : 279, "state" : "KY" } +{ "_id" : "41139", "city" : "FLATWOODS", "loc" : [ -82.72122, 38.518776 ], "pop" : 8397, "state" : "KY" } +{ "_id" : "41141", "city" : "GARRISON", "loc" : [ -83.200036, 38.586915 ], "pop" : 3066, "state" : "KY" } +{ "_id" : "41143", "city" : "FULTZ", "loc" : [ -82.965087, 38.328037 ], "pop" : 11771, "state" : "KY" } +{ "_id" : "41144", "city" : "LYNN", "loc" : [ -82.868396, 38.547969 ], "pop" : 11666, "state" : "KY" } +{ "_id" : "41146", "city" : "HITCHINS", "loc" : [ -82.92026799999999, 38.254585 ], "pop" : 3187, "state" : "KY" } +{ "_id" : "41149", "city" : "ISONVILLE", "loc" : [ -83.050607, 38.046229 ], "pop" : 890, "state" : "KY" } +{ "_id" : "41159", "city" : "MARTHA", "loc" : [ -82.95576, 38.015228 ], "pop" : 706, "state" : "KY" } +{ "_id" : "41163", "city" : "OLDTOWN", "loc" : [ -82.95695000000001, 38.441153 ], "pop" : 690, "state" : "KY" } +{ "_id" : "41164", "city" : "LAWTON", "loc" : [ -83.16898500000001, 38.336275 ], "pop" : 5763, "state" : "KY" } +{ "_id" : "41166", "city" : "QUINCY", "loc" : [ -83.105647, 38.627059 ], "pop" : 512, "state" : "KY" } +{ "_id" : "41168", "city" : "RUSH", "loc" : [ -82.747602, 38.30893 ], "pop" : 1502, "state" : "KY" } +{ "_id" : "41169", "city" : "RACELAND", "loc" : [ -82.715632, 38.522575 ], "pop" : 6469, "state" : "KY" } +{ "_id" : "41170", "city" : "SAINT PAUL", "loc" : [ -83.067931, 38.665445 ], "pop" : 222, "state" : "KY" } +{ "_id" : "41171", "city" : "BURKE", "loc" : [ -83.12725, 38.129368 ], "pop" : 5319, "state" : "KY" } +{ "_id" : "41174", "city" : "SOUTH PORTSMOUTH", "loc" : [ -83.01621799999999, 38.708706 ], "pop" : 813, "state" : "KY" } +{ "_id" : "41175", "city" : "MALONETON", "loc" : [ -82.94637299999999, 38.709269 ], "pop" : 4923, "state" : "KY" } +{ "_id" : "41177", "city" : "STEPHENS", "loc" : [ -82.983689, 38.114625 ], "pop" : 261, "state" : "KY" } +{ "_id" : "41179", "city" : "TRINITY", "loc" : [ -83.355448, 38.551511 ], "pop" : 5141, "state" : "KY" } +{ "_id" : "41180", "city" : "WEBBVILLE", "loc" : [ -82.789743, 38.163377 ], "pop" : 1654, "state" : "KY" } +{ "_id" : "41183", "city" : "WORTHINGTON", "loc" : [ -82.739553, 38.551102 ], "pop" : 1829, "state" : "KY" } +{ "_id" : "41189", "city" : "TOLLESBORO", "loc" : [ -83.560458, 38.572332 ], "pop" : 3061, "state" : "KY" } +{ "_id" : "41201", "city" : "ADAMS", "loc" : [ -82.702437, 37.991375 ], "pop" : 2540, "state" : "KY" } +{ "_id" : "41204", "city" : "BOONS CAMP", "loc" : [ -82.67043, 37.821609 ], "pop" : 260, "state" : "KY" } +{ "_id" : "41214", "city" : "DAVELLA", "loc" : [ -82.58672900000001, 37.790019 ], "pop" : 766, "state" : "KY" } +{ "_id" : "41215", "city" : "DENVER", "loc" : [ -82.86304800000001, 37.796582 ], "pop" : 573, "state" : "KY" } +{ "_id" : "41216", "city" : "EAST POINT", "loc" : [ -82.828801, 37.708578 ], "pop" : 1014, "state" : "KY" } +{ "_id" : "41219", "city" : "ELNA", "loc" : [ -82.882825, 37.938594 ], "pop" : 766, "state" : "KY" } +{ "_id" : "41220", "city" : "FUGET", "loc" : [ -82.911422, 37.902164 ], "pop" : 285, "state" : "KY" } +{ "_id" : "41222", "city" : "HAGERHILL", "loc" : [ -82.81491, 37.803511 ], "pop" : 739, "state" : "KY" } +{ "_id" : "41224", "city" : "JOB", "loc" : [ -82.520421, 37.867149 ], "pop" : 4231, "state" : "KY" } +{ "_id" : "41226", "city" : "KEATON", "loc" : [ -82.95610499999999, 37.968049 ], "pop" : 354, "state" : "KY" } +{ "_id" : "41228", "city" : "LEANDER", "loc" : [ -82.831045, 37.761904 ], "pop" : 1037, "state" : "KY" } +{ "_id" : "41230", "city" : "CLIFFORD", "loc" : [ -82.617598, 38.094332 ], "pop" : 8123, "state" : "KY" } +{ "_id" : "41231", "city" : "LOVELY", "loc" : [ -82.363794, 37.792109 ], "pop" : 958, "state" : "KY" } +{ "_id" : "41234", "city" : "MEALLY", "loc" : [ -82.74417699999999, 37.796498 ], "pop" : 925, "state" : "KY" } +{ "_id" : "41237", "city" : "OFFUTT", "loc" : [ -82.70812599999999, 37.852766 ], "pop" : 462, "state" : "KY" } +{ "_id" : "41238", "city" : "MANILA", "loc" : [ -82.928079, 37.826409 ], "pop" : 1430, "state" : "KY" } +{ "_id" : "41240", "city" : "NIPPA", "loc" : [ -82.805162, 37.819293 ], "pop" : 4095, "state" : "KY" } +{ "_id" : "41250", "city" : "LAURA", "loc" : [ -82.44875399999999, 37.763752 ], "pop" : 1700, "state" : "KY" } +{ "_id" : "41254", "city" : "RIVER", "loc" : [ -82.67094400000001, 37.875063 ], "pop" : 169, "state" : "KY" } +{ "_id" : "41255", "city" : "SITKA", "loc" : [ -82.844554, 37.892187 ], "pop" : 598, "state" : "KY" } +{ "_id" : "41256", "city" : "BARNETTS CREEK", "loc" : [ -82.85742999999999, 37.838463 ], "pop" : 1267, "state" : "KY" } +{ "_id" : "41257", "city" : "STAMBAUGH", "loc" : [ -82.76779000000001, 37.84112 ], "pop" : 165, "state" : "KY" } +{ "_id" : "41258", "city" : "RICEVILLE", "loc" : [ -82.911269, 37.743408 ], "pop" : 816, "state" : "KY" } +{ "_id" : "41260", "city" : "THELMA", "loc" : [ -82.775532, 37.798745 ], "pop" : 3956, "state" : "KY" } +{ "_id" : "41262", "city" : "DAVISPORT", "loc" : [ -82.59926900000001, 37.879292 ], "pop" : 1923, "state" : "KY" } +{ "_id" : "41263", "city" : "TUTOR KEY", "loc" : [ -82.735106, 37.860527 ], "pop" : 33, "state" : "KY" } +{ "_id" : "41265", "city" : "VAN LEAR", "loc" : [ -82.703236, 37.692916 ], "pop" : 3387, "state" : "KY" } +{ "_id" : "41266", "city" : "FUGET", "loc" : [ -82.911224, 37.902927 ], "pop" : 764, "state" : "KY" } +{ "_id" : "41267", "city" : "HODE", "loc" : [ -82.432192, 37.858088 ], "pop" : 2656, "state" : "KY" } +{ "_id" : "41269", "city" : "WHITEHOUSE", "loc" : [ -82.775328, 37.895347 ], "pop" : 2105, "state" : "KY" } +{ "_id" : "41271", "city" : "WILLIAMSPORT", "loc" : [ -82.710455, 37.81416 ], "pop" : 295, "state" : "KY" } +{ "_id" : "41274", "city" : "WITTENSVILLE", "loc" : [ -82.80998700000001, 37.870297 ], "pop" : 689, "state" : "KY" } +{ "_id" : "41301", "city" : "FLAT", "loc" : [ -83.516395, 37.750243 ], "pop" : 5038, "state" : "KY" } +{ "_id" : "41306", "city" : "ALTRO", "loc" : [ -83.395749, 37.356346 ], "pop" : 436, "state" : "KY" } +{ "_id" : "41311", "city" : "VADA", "loc" : [ -83.702337, 37.581891 ], "pop" : 6877, "state" : "KY" } +{ "_id" : "41314", "city" : "MORRIS FORK", "loc" : [ -83.660624, 37.478717 ], "pop" : 2675, "state" : "KY" } +{ "_id" : "41315", "city" : "BURKHART", "loc" : [ -83.27339600000001, 37.687451 ], "pop" : 233, "state" : "KY" } +{ "_id" : "41317", "city" : "CLAYHOLE", "loc" : [ -83.281254, 37.466076 ], "pop" : 2294, "state" : "KY" } +{ "_id" : "41321", "city" : "DECOY", "loc" : [ -83.02895599999999, 37.49046 ], "pop" : 184, "state" : "KY" } +{ "_id" : "41327", "city" : "GILLMORE", "loc" : [ -83.348026, 37.697155 ], "pop" : 44, "state" : "KY" } +{ "_id" : "41328", "city" : "GREEN HALL", "loc" : [ -83.780693, 37.368938 ], "pop" : 185, "state" : "KY" } +{ "_id" : "41331", "city" : "HADDIX", "loc" : [ -83.376176, 37.492249 ], "pop" : 513, "state" : "KY" } +{ "_id" : "41332", "city" : "GRASSY CREEK", "loc" : [ -83.39891799999999, 37.775989 ], "pop" : 978, "state" : "KY" } +{ "_id" : "41338", "city" : "ISLAND CITY", "loc" : [ -83.717991, 37.389926 ], "pop" : 526, "state" : "KY" } +{ "_id" : "41339", "city" : "CANOE", "loc" : [ -83.39690400000001, 37.557378 ], "pop" : 6384, "state" : "KY" } +{ "_id" : "41340", "city" : "LAMBRIC", "loc" : [ -83.100888, 37.579455 ], "pop" : 14, "state" : "KY" } +{ "_id" : "41342", "city" : "LEE CITY", "loc" : [ -83.325474, 37.731163 ], "pop" : 233, "state" : "KY" } +{ "_id" : "41343", "city" : "LEECO", "loc" : [ -83.692806, 37.698933 ], "pop" : 66, "state" : "KY" } +{ "_id" : "41346", "city" : "LITTLE", "loc" : [ -83.382373, 37.432158 ], "pop" : 247, "state" : "KY" } +{ "_id" : "41348", "city" : "HARDSHELL", "loc" : [ -83.328889, 37.484106 ], "pop" : 375, "state" : "KY" } +{ "_id" : "41351", "city" : "MISTLETOE", "loc" : [ -83.588078, 37.331428 ], "pop" : 72, "state" : "KY" } +{ "_id" : "41357", "city" : "NOCTOR", "loc" : [ -83.270831, 37.569915 ], "pop" : 771, "state" : "KY" } +{ "_id" : "41358", "city" : "OLD LANDING", "loc" : [ -83.805784, 37.639678 ], "pop" : 253, "state" : "KY" } +{ "_id" : "41360", "city" : "PINE RIDGE", "loc" : [ -83.632059, 37.774872 ], "pop" : 334, "state" : "KY" } +{ "_id" : "41363", "city" : "QUICKSAND", "loc" : [ -83.365098, 37.532947 ], "pop" : 727, "state" : "KY" } +{ "_id" : "41364", "city" : "RICETOWN", "loc" : [ -83.61506199999999, 37.409305 ], "pop" : 672, "state" : "KY" } +{ "_id" : "41365", "city" : "ROGERS", "loc" : [ -83.65667000000001, 37.739538 ], "pop" : 288, "state" : "KY" } +{ "_id" : "41366", "city" : "ROUSSEAU", "loc" : [ -83.21472, 37.63491 ], "pop" : 104, "state" : "KY" } +{ "_id" : "41367", "city" : "ROWDY", "loc" : [ -83.20403, 37.413063 ], "pop" : 245, "state" : "KY" } +{ "_id" : "41369", "city" : "SALDEE", "loc" : [ -83.373268, 37.455799 ], "pop" : 118, "state" : "KY" } +{ "_id" : "41377", "city" : "TALBERT", "loc" : [ -83.448185, 37.399505 ], "pop" : 352, "state" : "KY" } +{ "_id" : "41385", "city" : "VANCLEVE", "loc" : [ -83.38055300000001, 37.64768 ], "pop" : 1335, "state" : "KY" } +{ "_id" : "41386", "city" : "VINCENT", "loc" : [ -83.784628, 37.443733 ], "pop" : 586, "state" : "KY" } +{ "_id" : "41390", "city" : "WHICK", "loc" : [ -83.374707, 37.41022 ], "pop" : 235, "state" : "KY" } +{ "_id" : "41396", "city" : "ZACHARIAH", "loc" : [ -83.677244, 37.674917 ], "pop" : 36, "state" : "KY" } +{ "_id" : "41397", "city" : "ZOE", "loc" : [ -83.668778, 37.666371 ], "pop" : 190, "state" : "KY" } +{ "_id" : "41407", "city" : "CANEY", "loc" : [ -83.291662, 37.809847 ], "pop" : 1754, "state" : "KY" } +{ "_id" : "41409", "city" : "CARVER", "loc" : [ -83.06900899999999, 37.650274 ], "pop" : 368, "state" : "KY" } +{ "_id" : "41412", "city" : "COTTLE", "loc" : [ -83.220078, 37.892975 ], "pop" : 73, "state" : "KY" } +{ "_id" : "41419", "city" : "EDNA", "loc" : [ -83.179973, 37.799813 ], "pop" : 312, "state" : "KY" } +{ "_id" : "41421", "city" : "ELKFORK", "loc" : [ -83.077112, 37.940358 ], "pop" : 2081, "state" : "KY" } +{ "_id" : "41422", "city" : "ELSIE", "loc" : [ -83.142321, 37.768875 ], "pop" : 84, "state" : "KY" } +{ "_id" : "41425", "city" : "EZEL", "loc" : [ -83.388835, 37.903985 ], "pop" : 1488, "state" : "KY" } +{ "_id" : "41441", "city" : "HENDRICKS", "loc" : [ -83.098108, 37.70505 ], "pop" : 377, "state" : "KY" } +{ "_id" : "41447", "city" : "LENOX", "loc" : [ -83.18159300000001, 37.967224 ], "pop" : 550, "state" : "KY" } +{ "_id" : "41464", "city" : "ROYALTON", "loc" : [ -82.98666900000001, 37.652116 ], "pop" : 1550, "state" : "KY" } +{ "_id" : "41465", "city" : "BETHANNA", "loc" : [ -83.055443, 37.763499 ], "pop" : 8442, "state" : "KY" } +{ "_id" : "41466", "city" : "SEITZ", "loc" : [ -83.174941, 37.668402 ], "pop" : 395, "state" : "KY" } +{ "_id" : "41472", "city" : "BLAIRS MILL", "loc" : [ -83.279926, 37.949746 ], "pop" : 4700, "state" : "KY" } +{ "_id" : "41474", "city" : "WHITE OAK", "loc" : [ -83.204869, 37.849769 ], "pop" : 361, "state" : "KY" } +{ "_id" : "41501", "city" : "BROAD BOTTOM", "loc" : [ -82.52017499999999, 37.506833 ], "pop" : 17362, "state" : "KY" } +{ "_id" : "41503", "city" : "SOUTH WILLIAMSON", "loc" : [ -82.288608, 37.666991 ], "pop" : 899, "state" : "KY" } +{ "_id" : "41512", "city" : "ASHCAMP", "loc" : [ -82.461269, 37.258909 ], "pop" : 2274, "state" : "KY" } +{ "_id" : "41513", "city" : "BELCHER", "loc" : [ -82.396536, 37.3137 ], "pop" : 111, "state" : "KY" } +{ "_id" : "41514", "city" : "BELFRY", "loc" : [ -82.257301, 37.64011 ], "pop" : 1744, "state" : "KY" } +{ "_id" : "41519", "city" : "CANADA", "loc" : [ -82.35330999999999, 37.637816 ], "pop" : 817, "state" : "KY" } +{ "_id" : "41522", "city" : "SENTERVILLE", "loc" : [ -82.353337, 37.302649 ], "pop" : 1988, "state" : "KY" } +{ "_id" : "41524", "city" : "BIGGS", "loc" : [ -82.25746599999999, 37.361002 ], "pop" : 724, "state" : "KY" } +{ "_id" : "41527", "city" : "FOREST HILLS", "loc" : [ -82.299145, 37.643238 ], "pop" : 363, "state" : "KY" } +{ "_id" : "41528", "city" : "FREEBURN", "loc" : [ -82.143378, 37.551188 ], "pop" : 1749, "state" : "KY" } +{ "_id" : "41529", "city" : "AFLEX", "loc" : [ -82.30796100000001, 37.689943 ], "pop" : 802, "state" : "KY" } +{ "_id" : "41531", "city" : "HARDY", "loc" : [ -82.255236, 37.602652 ], "pop" : 1693, "state" : "KY" } +{ "_id" : "41535", "city" : "HUDDY", "loc" : [ -82.25004, 37.566819 ], "pop" : 513, "state" : "KY" } +{ "_id" : "41536", "city" : "JAMBOREE", "loc" : [ -82.089129, 37.485976 ], "pop" : 848, "state" : "KY" } +{ "_id" : "41537", "city" : "PAYNE GAP", "loc" : [ -82.630045, 37.186328 ], "pop" : 3615, "state" : "KY" } +{ "_id" : "41539", "city" : "KIMPER", "loc" : [ -82.31804099999999, 37.469588 ], "pop" : 2317, "state" : "KY" } +{ "_id" : "41540", "city" : "LICK CREEK", "loc" : [ -82.325456, 37.347969 ], "pop" : 221, "state" : "KY" } +{ "_id" : "41543", "city" : "MC ANDREWS", "loc" : [ -82.25579999999999, 37.544986 ], "pop" : 830, "state" : "KY" } +{ "_id" : "41544", "city" : "MC CARR", "loc" : [ -82.167365, 37.596944 ], "pop" : 1054, "state" : "KY" } +{ "_id" : "41545", "city" : "MC COMBS", "loc" : [ -82.54822799999999, 37.593432 ], "pop" : 173, "state" : "KY" } +{ "_id" : "41546", "city" : "MC VEIGH", "loc" : [ -82.22280000000001, 37.534249 ], "pop" : 603, "state" : "KY" } +{ "_id" : "41548", "city" : "MOUTHCARD", "loc" : [ -82.305424, 37.333908 ], "pop" : 156, "state" : "KY" } +{ "_id" : "41551", "city" : "PAW PAW", "loc" : [ -82.134942, 37.435562 ], "pop" : 228, "state" : "KY" } +{ "_id" : "41553", "city" : "PHELPS", "loc" : [ -82.158378, 37.498736 ], "pop" : 2947, "state" : "KY" } +{ "_id" : "41554", "city" : "PHYLLIS", "loc" : [ -82.266786, 37.422152 ], "pop" : 891, "state" : "KY" } +{ "_id" : "41555", "city" : "PINSONFORK", "loc" : [ -82.19536600000001, 37.565137 ], "pop" : 568, "state" : "KY" } +{ "_id" : "41557", "city" : "FISHTRAP", "loc" : [ -82.426256, 37.524072 ], "pop" : 3807, "state" : "KY" } +{ "_id" : "41559", "city" : "REGINA", "loc" : [ -82.37369700000001, 37.359686 ], "pop" : 1559, "state" : "KY" } +{ "_id" : "41560", "city" : "ROBINSON CREEK", "loc" : [ -82.567679, 37.334708 ], "pop" : 6715, "state" : "KY" } +{ "_id" : "41562", "city" : "SHELBIANA", "loc" : [ -82.455321, 37.375478 ], "pop" : 9187, "state" : "KY" } +{ "_id" : "41563", "city" : "SHELBY GAP", "loc" : [ -82.575149, 37.232743 ], "pop" : 952, "state" : "KY" } +{ "_id" : "41564", "city" : "SIDNEY", "loc" : [ -82.338666, 37.580225 ], "pop" : 1727, "state" : "KY" } +{ "_id" : "41565", "city" : "SPEIGHT", "loc" : [ -82.71650200000001, 37.262473 ], "pop" : 17, "state" : "KY" } +{ "_id" : "41566", "city" : "STEELE", "loc" : [ -82.20707899999999, 37.40292 ], "pop" : 1321, "state" : "KY" } +{ "_id" : "41567", "city" : "STONE", "loc" : [ -82.28898700000001, 37.560639 ], "pop" : 1239, "state" : "KY" } +{ "_id" : "41568", "city" : "ARGO", "loc" : [ -82.073522, 37.530336 ], "pop" : 471, "state" : "KY" } +{ "_id" : "41570", "city" : "TURKEY CREEK", "loc" : [ -82.32022499999999, 37.659347 ], "pop" : 264, "state" : "KY" } +{ "_id" : "41571", "city" : "VARNEY", "loc" : [ -82.350976, 37.698541 ], "pop" : 827, "state" : "KY" } +{ "_id" : "41572", "city" : "ETTY", "loc" : [ -82.649445, 37.313669 ], "pop" : 2622, "state" : "KY" } +{ "_id" : "41601", "city" : "ALLEN", "loc" : [ -82.63627200000001, 37.566182 ], "pop" : 1768, "state" : "KY" } +{ "_id" : "41602", "city" : "AUXIER", "loc" : [ -82.767736, 37.721847 ], "pop" : 2461, "state" : "KY" } +{ "_id" : "41603", "city" : "BANNER", "loc" : [ -82.69736899999999, 37.577051 ], "pop" : 1043, "state" : "KY" } +{ "_id" : "41604", "city" : "LIGON", "loc" : [ -82.680295, 37.372179 ], "pop" : 956, "state" : "KY" } +{ "_id" : "41605", "city" : "BETSY LAYNE", "loc" : [ -82.700249, 37.531593 ], "pop" : 353, "state" : "KY" } +{ "_id" : "41606", "city" : "BEVINSVILLE", "loc" : [ -82.712468, 37.338488 ], "pop" : 3200, "state" : "KY" } +{ "_id" : "41607", "city" : "BLUE RIVER", "loc" : [ -82.827361, 37.648097 ], "pop" : 247, "state" : "KY" } +{ "_id" : "41614", "city" : "CRAYNOR", "loc" : [ -82.69176, 37.408673 ], "pop" : 260, "state" : "KY" } +{ "_id" : "41615", "city" : "DANA", "loc" : [ -82.670501, 37.546653 ], "pop" : 227, "state" : "KY" } +{ "_id" : "41616", "city" : "DAVID", "loc" : [ -82.892748, 37.604387 ], "pop" : 60, "state" : "KY" } +{ "_id" : "41622", "city" : "EASTERN", "loc" : [ -82.82649600000001, 37.532386 ], "pop" : 509, "state" : "KY" } +{ "_id" : "41626", "city" : "ENDICOTT", "loc" : [ -82.627608, 37.681936 ], "pop" : 42, "state" : "KY" } +{ "_id" : "41627", "city" : "ESTILL", "loc" : [ -82.81962900000001, 37.46201 ], "pop" : 263, "state" : "KY" } +{ "_id" : "41629", "city" : "GALVESTON", "loc" : [ -82.661868, 37.478249 ], "pop" : 1030, "state" : "KY" } +{ "_id" : "41630", "city" : "GARRETT", "loc" : [ -82.846192, 37.486126 ], "pop" : 1408, "state" : "KY" } +{ "_id" : "41631", "city" : "GRETHEL", "loc" : [ -82.739575, 37.459599 ], "pop" : 2126, "state" : "KY" } +{ "_id" : "41632", "city" : "WALDO", "loc" : [ -82.93574, 37.546661 ], "pop" : 699, "state" : "KY" } +{ "_id" : "41633", "city" : "HALO", "loc" : [ -82.73060599999999, 37.307629 ], "pop" : 119, "state" : "KY" } +{ "_id" : "41635", "city" : "HAROLD", "loc" : [ -82.621595, 37.504184 ], "pop" : 1286, "state" : "KY" } +{ "_id" : "41636", "city" : "BUCKINGHAM", "loc" : [ -82.73245, 37.393499 ], "pop" : 879, "state" : "KY" } +{ "_id" : "41637", "city" : "PYRMID", "loc" : [ -82.864919, 37.513484 ], "pop" : 568, "state" : "KY" } +{ "_id" : "41639", "city" : "HONAKER", "loc" : [ -82.667534, 37.514977 ], "pop" : 772, "state" : "KY" } +{ "_id" : "41640", "city" : "ELMROCK", "loc" : [ -82.836764, 37.506204 ], "pop" : 115, "state" : "KY" } +{ "_id" : "41642", "city" : "IVEL", "loc" : [ -82.64268, 37.555443 ], "pop" : 1038, "state" : "KY" } +{ "_id" : "41643", "city" : "LACKEY", "loc" : [ -82.798012, 37.464283 ], "pop" : 591, "state" : "KY" } +{ "_id" : "41645", "city" : "LANGLEY", "loc" : [ -82.797648, 37.538079 ], "pop" : 648, "state" : "KY" } +{ "_id" : "41647", "city" : "EAST MC DOWELL", "loc" : [ -82.745018, 37.425232 ], "pop" : 376, "state" : "KY" } +{ "_id" : "41649", "city" : "HITE", "loc" : [ -82.74785199999999, 37.563267 ], "pop" : 4649, "state" : "KY" } +{ "_id" : "41653", "city" : "EMMA", "loc" : [ -82.788135, 37.649462 ], "pop" : 9573, "state" : "KY" } +{ "_id" : "41655", "city" : "PRINTER", "loc" : [ -82.70602700000001, 37.505485 ], "pop" : 243, "state" : "KY" } +{ "_id" : "41659", "city" : "STANVILLE", "loc" : [ -82.669174, 37.578386 ], "pop" : 309, "state" : "KY" } +{ "_id" : "41660", "city" : "TEABERRY", "loc" : [ -82.640456, 37.421955 ], "pop" : 2248, "state" : "KY" } +{ "_id" : "41666", "city" : "WAYLAND", "loc" : [ -82.80103699999999, 37.436709 ], "pop" : 928, "state" : "KY" } +{ "_id" : "41701", "city" : "DARFORK", "loc" : [ -83.199845, 37.252641 ], "pop" : 11851, "state" : "KY" } +{ "_id" : "41712", "city" : "ARY", "loc" : [ -83.139253, 37.354364 ], "pop" : 331, "state" : "KY" } +{ "_id" : "41714", "city" : "BEAR BRANCH", "loc" : [ -83.494449, 37.210894 ], "pop" : 400, "state" : "KY" } +{ "_id" : "41719", "city" : "BLUE DIAMOND", "loc" : [ -83.228579, 37.310812 ], "pop" : 861, "state" : "KY" } +{ "_id" : "41721", "city" : "BUCKHORN", "loc" : [ -83.49364799999999, 37.301036 ], "pop" : 640, "state" : "KY" } +{ "_id" : "41722", "city" : "TRIBBEY", "loc" : [ -83.15848699999999, 37.328174 ], "pop" : 2312, "state" : "KY" } +{ "_id" : "41723", "city" : "BUSY", "loc" : [ -83.30070499999999, 37.26316 ], "pop" : 967, "state" : "KY" } +{ "_id" : "41725", "city" : "CARRIE", "loc" : [ -83.041549, 37.297995 ], "pop" : 457, "state" : "KY" } +{ "_id" : "41727", "city" : "CHAVIES", "loc" : [ -83.33146600000001, 37.355545 ], "pop" : 564, "state" : "KY" } +{ "_id" : "41728", "city" : "CINDA", "loc" : [ -83.302886, 37.09667 ], "pop" : 584, "state" : "KY" } +{ "_id" : "41729", "city" : "COMBS", "loc" : [ -83.20229399999999, 37.291321 ], "pop" : 1001, "state" : "KY" } +{ "_id" : "41730", "city" : "CONFLUENCE", "loc" : [ -83.37110199999999, 37.271904 ], "pop" : 184, "state" : "KY" } +{ "_id" : "41731", "city" : "ULVAH", "loc" : [ -83.035127, 37.120385 ], "pop" : 1289, "state" : "KY" } +{ "_id" : "41732", "city" : "CUTSHIN", "loc" : [ -83.247304, 37.108109 ], "pop" : 1591, "state" : "KY" } +{ "_id" : "41733", "city" : "DAISY", "loc" : [ -83.095095, 37.115936 ], "pop" : 77, "state" : "KY" } +{ "_id" : "41735", "city" : "DELPHIA", "loc" : [ -83.095574, 37.023317 ], "pop" : 349, "state" : "KY" } +{ "_id" : "41736", "city" : "DICE", "loc" : [ -83.20533500000001, 37.382539 ], "pop" : 1251, "state" : "KY" } +{ "_id" : "41740", "city" : "BEARVILLE", "loc" : [ -83.068449, 37.322096 ], "pop" : 1961, "state" : "KY" } +{ "_id" : "41743", "city" : "FISTY", "loc" : [ -83.108251, 37.356348 ], "pop" : 172, "state" : "KY" } +{ "_id" : "41745", "city" : "GAYS CREEK", "loc" : [ -83.455607, 37.350421 ], "pop" : 369, "state" : "KY" } +{ "_id" : "41746", "city" : "HAPPY", "loc" : [ -83.081408, 37.195047 ], "pop" : 784, "state" : "KY" } +{ "_id" : "41749", "city" : "DRYHILL", "loc" : [ -83.415668, 37.154604 ], "pop" : 5507, "state" : "KY" } +{ "_id" : "41754", "city" : "NAPFOR", "loc" : [ -83.305913, 37.318325 ], "pop" : 2357, "state" : "KY" } +{ "_id" : "41756", "city" : "LEATHERWOOD", "loc" : [ -83.15125399999999, 37.040503 ], "pop" : 241, "state" : "KY" } +{ "_id" : "41759", "city" : "ANCO", "loc" : [ -83.03212499999999, 37.233926 ], "pop" : 1442, "state" : "KY" } +{ "_id" : "41760", "city" : "SCUDDY", "loc" : [ -83.093242, 37.212182 ], "pop" : 296, "state" : "KY" } +{ "_id" : "41763", "city" : "SLEMP", "loc" : [ -83.11694, 37.08037 ], "pop" : 1012, "state" : "KY" } +{ "_id" : "41764", "city" : "SMILAX", "loc" : [ -83.284533, 37.166314 ], "pop" : 634, "state" : "KY" } +{ "_id" : "41765", "city" : "TALCUM", "loc" : [ -83.047864, 37.383621 ], "pop" : 375, "state" : "KY" } +{ "_id" : "41772", "city" : "VEST", "loc" : [ -83.06265, 37.408732 ], "pop" : 312, "state" : "KY" } +{ "_id" : "41773", "city" : "VICCO", "loc" : [ -83.09979199999999, 37.189826 ], "pop" : 3072, "state" : "KY" } +{ "_id" : "41774", "city" : "FARLER", "loc" : [ -83.158299, 37.150655 ], "pop" : 1364, "state" : "KY" } +{ "_id" : "41775", "city" : "WENDOVER", "loc" : [ -83.350185, 37.129115 ], "pop" : 314, "state" : "KY" } +{ "_id" : "41776", "city" : "FREW", "loc" : [ -83.292655, 37.192435 ], "pop" : 474, "state" : "KY" } +{ "_id" : "41777", "city" : "BIG ROCK", "loc" : [ -83.227006, 37.043019 ], "pop" : 405, "state" : "KY" } +{ "_id" : "41801", "city" : "AMBURGEY", "loc" : [ -83.000483, 37.26716 ], "pop" : 329, "state" : "KY" } +{ "_id" : "41804", "city" : "CARCASSONNE", "loc" : [ -82.940189, 37.134266 ], "pop" : 552, "state" : "KY" } +{ "_id" : "41805", "city" : "BRINKLEY", "loc" : [ -82.91397600000001, 37.262613 ], "pop" : 1204, "state" : "KY" } +{ "_id" : "41811", "city" : "CROWN", "loc" : [ -82.847442, 37.159125 ], "pop" : 295, "state" : "KY" } +{ "_id" : "41812", "city" : "DEANE", "loc" : [ -82.799722, 37.23332 ], "pop" : 1400, "state" : "KY" } +{ "_id" : "41815", "city" : "ERMINE", "loc" : [ -82.822118, 37.174612 ], "pop" : 3231, "state" : "KY" } +{ "_id" : "41817", "city" : "LARKSLANE", "loc" : [ -82.89384699999999, 37.377663 ], "pop" : 1287, "state" : "KY" } +{ "_id" : "41819", "city" : "GILLY", "loc" : [ -83.069317, 36.990109 ], "pop" : 555, "state" : "KY" } +{ "_id" : "41821", "city" : "SKYLINE", "loc" : [ -83.020354, 37.069879 ], "pop" : 426, "state" : "KY" } +{ "_id" : "41822", "city" : "HINDMAN", "loc" : [ -82.952653, 37.327607 ], "pop" : 2965, "state" : "KY" } +{ "_id" : "41823", "city" : "HOLLYBUSH", "loc" : [ -82.831509, 37.337608 ], "pop" : 380, "state" : "KY" } +{ "_id" : "41824", "city" : "ISOM", "loc" : [ -82.913348, 37.196027 ], "pop" : 714, "state" : "KY" } +{ "_id" : "41825", "city" : "JACKHORN", "loc" : [ -82.691856, 37.171685 ], "pop" : 1380, "state" : "KY" } +{ "_id" : "41826", "city" : "JEREMIAH", "loc" : [ -82.92683599999999, 37.165127 ], "pop" : 623, "state" : "KY" } +{ "_id" : "41828", "city" : "PUNCHEON", "loc" : [ -82.78472499999999, 37.270944 ], "pop" : 293, "state" : "KY" } +{ "_id" : "41829", "city" : "KONA", "loc" : [ -82.752469, 37.166814 ], "pop" : 607, "state" : "KY" } +{ "_id" : "41831", "city" : "SOFT SHELL", "loc" : [ -82.956428, 37.383737 ], "pop" : 765, "state" : "KY" } +{ "_id" : "41832", "city" : "LETCHER", "loc" : [ -82.980908, 37.155 ], "pop" : 571, "state" : "KY" } +{ "_id" : "41833", "city" : "LINEFORK", "loc" : [ -82.919765, 37.051399 ], "pop" : 860, "state" : "KY" } +{ "_id" : "41834", "city" : "LITTCARR", "loc" : [ -82.965098, 37.271457 ], "pop" : 468, "state" : "KY" } +{ "_id" : "41836", "city" : "MALLIE", "loc" : [ -82.871364, 37.334623 ], "pop" : 792, "state" : "KY" } +{ "_id" : "41838", "city" : "MILLSTONE", "loc" : [ -82.7533, 37.151615 ], "pop" : 247, "state" : "KY" } +{ "_id" : "41839", "city" : "MOUSIE", "loc" : [ -82.901768, 37.433125 ], "pop" : 795, "state" : "KY" } +{ "_id" : "41840", "city" : "FLEMING NEON", "loc" : [ -82.69755499999999, 37.212056 ], "pop" : 2563, "state" : "KY" } +{ "_id" : "41843", "city" : "OMAHA", "loc" : [ -82.830417, 37.311528 ], "pop" : 336, "state" : "KY" } +{ "_id" : "41844", "city" : "RAVEN", "loc" : [ -82.82916400000001, 37.363252 ], "pop" : 197, "state" : "KY" } +{ "_id" : "41845", "city" : "PREMIUM", "loc" : [ -82.95811500000001, 37.068587 ], "pop" : 311, "state" : "KY" } +{ "_id" : "41847", "city" : "REDFOX", "loc" : [ -82.871865, 37.25311 ], "pop" : 974, "state" : "KY" } +{ "_id" : "41848", "city" : "ROXANA", "loc" : [ -83.034488, 37.090502 ], "pop" : 117, "state" : "KY" } +{ "_id" : "41849", "city" : "SECO", "loc" : [ -82.735832, 37.176523 ], "pop" : 791, "state" : "KY" } +{ "_id" : "41855", "city" : "THORNTON", "loc" : [ -82.73820000000001, 37.129622 ], "pop" : 635, "state" : "KY" } +{ "_id" : "41858", "city" : "DAY RURAL", "loc" : [ -82.838768, 37.115463 ], "pop" : 4678, "state" : "KY" } +{ "_id" : "41859", "city" : "DEMA", "loc" : [ -82.852313, 37.421491 ], "pop" : 468, "state" : "KY" } +{ "_id" : "41861", "city" : "RAVEN", "loc" : [ -82.826064, 37.404328 ], "pop" : 128, "state" : "KY" } +{ "_id" : "41862", "city" : "DRY CREEK", "loc" : [ -82.781036, 37.346979 ], "pop" : 1605, "state" : "KY" } +{ "_id" : "42001", "city" : "PADUCAH", "loc" : [ -88.66320399999999, 37.063377 ], "pop" : 27002, "state" : "KY" } +{ "_id" : "42003", "city" : "PADUCAH", "loc" : [ -88.593388, 37.036833 ], "pop" : 29932, "state" : "KY" } +{ "_id" : "42020", "city" : "ALMO", "loc" : [ -88.308666, 36.712805 ], "pop" : 1509, "state" : "KY" } +{ "_id" : "42021", "city" : "ARLINGTON", "loc" : [ -88.94383500000001, 36.800117 ], "pop" : 1780, "state" : "KY" } +{ "_id" : "42023", "city" : "BARDWELL", "loc" : [ -89.020855, 36.863387 ], "pop" : 1957, "state" : "KY" } +{ "_id" : "42024", "city" : "BARLOW", "loc" : [ -89.04081499999999, 37.049279 ], "pop" : 1335, "state" : "KY" } +{ "_id" : "42025", "city" : "BENTON", "loc" : [ -88.35477299999999, 36.880649 ], "pop" : 15886, "state" : "KY" } +{ "_id" : "42027", "city" : "BOAZ", "loc" : [ -88.622288, 36.929974 ], "pop" : 1609, "state" : "KY" } +{ "_id" : "42028", "city" : "BURNA", "loc" : [ -88.39418499999999, 37.231514 ], "pop" : 453, "state" : "KY" } +{ "_id" : "42029", "city" : "CALVERT CITY", "loc" : [ -88.38111499999999, 37.014741 ], "pop" : 4479, "state" : "KY" } +{ "_id" : "42031", "city" : "CLINTON", "loc" : [ -88.967574, 36.667531 ], "pop" : 4143, "state" : "KY" } +{ "_id" : "42032", "city" : "COLUMBUS", "loc" : [ -89.098288, 36.755505 ], "pop" : 454, "state" : "KY" } +{ "_id" : "42035", "city" : "CUNNINGHAM", "loc" : [ -88.872815, 36.896256 ], "pop" : 1501, "state" : "KY" } +{ "_id" : "42036", "city" : "DEXTER", "loc" : [ -88.180695, 36.70313 ], "pop" : 1800, "state" : "KY" } +{ "_id" : "42038", "city" : "EDDYVILLE", "loc" : [ -88.04939, 37.066385 ], "pop" : 4402, "state" : "KY" } +{ "_id" : "42039", "city" : "FANCY FARM", "loc" : [ -88.791785, 36.77674 ], "pop" : 1423, "state" : "KY" } +{ "_id" : "42040", "city" : "FARMINGTON", "loc" : [ -88.547832, 36.686903 ], "pop" : 2821, "state" : "KY" } +{ "_id" : "42041", "city" : "CRUTCHFIELD", "loc" : [ -88.889224, 36.528678 ], "pop" : 5955, "state" : "KY" } +{ "_id" : "42044", "city" : "GILBERTSVILLE", "loc" : [ -88.274856, 36.962465 ], "pop" : 3285, "state" : "KY" } +{ "_id" : "42045", "city" : "IUKA", "loc" : [ -88.261382, 37.05781 ], "pop" : 2210, "state" : "KY" } +{ "_id" : "42047", "city" : "HAMPTON", "loc" : [ -88.364897, 37.334764 ], "pop" : 922, "state" : "KY" } +{ "_id" : "42048", "city" : "HARDIN", "loc" : [ -88.262153, 36.776233 ], "pop" : 3246, "state" : "KY" } +{ "_id" : "42049", "city" : "HAZEL", "loc" : [ -88.331862, 36.542215 ], "pop" : 3235, "state" : "KY" } +{ "_id" : "42050", "city" : "HICKMAN", "loc" : [ -89.194667, 36.559269 ], "pop" : 3676, "state" : "KY" } +{ "_id" : "42051", "city" : "HICKORY", "loc" : [ -88.678782, 36.847783 ], "pop" : 3140, "state" : "KY" } +{ "_id" : "42053", "city" : "KEVIL", "loc" : [ -88.876366, 37.087231 ], "pop" : 5019, "state" : "KY" } +{ "_id" : "42054", "city" : "KIRKSEY", "loc" : [ -88.423815, 36.673092 ], "pop" : 3190, "state" : "KY" } +{ "_id" : "42055", "city" : "KUTTAWA", "loc" : [ -88.14981299999999, 37.061871 ], "pop" : 2222, "state" : "KY" } +{ "_id" : "42056", "city" : "LA CENTER", "loc" : [ -88.972954, 37.083019 ], "pop" : 1563, "state" : "KY" } +{ "_id" : "42058", "city" : "LEDBETTER", "loc" : [ -88.486503, 37.049167 ], "pop" : 2278, "state" : "KY" } +{ "_id" : "42064", "city" : "MARION", "loc" : [ -88.100471, 37.325426 ], "pop" : 8733, "state" : "KY" } +{ "_id" : "42066", "city" : "MAYFIELD", "loc" : [ -88.650637, 36.732686 ], "pop" : 16321, "state" : "KY" } +{ "_id" : "42069", "city" : "MELBER", "loc" : [ -88.752037, 36.919658 ], "pop" : 1187, "state" : "KY" } +{ "_id" : "42071", "city" : "MURRAY", "loc" : [ -88.30324899999999, 36.609915 ], "pop" : 20388, "state" : "KY" } +{ "_id" : "42076", "city" : "NEW CONCORD", "loc" : [ -88.09547999999999, 36.550003 ], "pop" : 922, "state" : "KY" } +{ "_id" : "42078", "city" : "SALEM", "loc" : [ -88.27113900000001, 37.255346 ], "pop" : 1801, "state" : "KY" } +{ "_id" : "42079", "city" : "SEDALIA", "loc" : [ -88.594813, 36.588208 ], "pop" : 1983, "state" : "KY" } +{ "_id" : "42081", "city" : "CARRSVILLE", "loc" : [ -88.383593, 37.12269 ], "pop" : 1200, "state" : "KY" } +{ "_id" : "42082", "city" : "SYMSONIA", "loc" : [ -88.528576, 36.871544 ], "pop" : 2725, "state" : "KY" } +{ "_id" : "42083", "city" : "TILINE", "loc" : [ -88.254679, 37.162773 ], "pop" : 198, "state" : "KY" } +{ "_id" : "42085", "city" : "WATER VALLEY", "loc" : [ -88.80837099999999, 36.569358 ], "pop" : 409, "state" : "KY" } +{ "_id" : "42086", "city" : "WEST PADUCAH", "loc" : [ -88.76107500000001, 37.092239 ], "pop" : 2223, "state" : "KY" } +{ "_id" : "42087", "city" : "WICKLIFFE", "loc" : [ -89.01769299999999, 36.967969 ], "pop" : 2605, "state" : "KY" } +{ "_id" : "42088", "city" : "WINGO", "loc" : [ -88.73944899999999, 36.625282 ], "pop" : 2643, "state" : "KY" } +{ "_id" : "42101", "city" : "PLUM SPRINGS", "loc" : [ -86.45589099999999, 37.007874 ], "pop" : 40671, "state" : "KY" } +{ "_id" : "42103", "city" : "BOWLING GREEN", "loc" : [ -86.393321, 36.96629 ], "pop" : 11391, "state" : "KY" } +{ "_id" : "42104", "city" : "BOWLING GREEN", "loc" : [ -86.448077, 36.937537 ], "pop" : 14948, "state" : "KY" } +{ "_id" : "42120", "city" : "ADOLPHUS", "loc" : [ -86.26359600000001, 36.677486 ], "pop" : 1976, "state" : "KY" } +{ "_id" : "42122", "city" : "ALVATON", "loc" : [ -86.363213, 36.86296 ], "pop" : 2934, "state" : "KY" } +{ "_id" : "42123", "city" : "AUSTIN", "loc" : [ -85.98502999999999, 36.812376 ], "pop" : 425, "state" : "KY" } +{ "_id" : "42124", "city" : "BEAUMONT", "loc" : [ -85.64882900000001, 36.88758 ], "pop" : 206, "state" : "KY" } +{ "_id" : "42127", "city" : "CAVE CITY", "loc" : [ -85.944283, 37.11696 ], "pop" : 6283, "state" : "KY" } +{ "_id" : "42129", "city" : "SUBTLE", "loc" : [ -85.592741, 36.985197 ], "pop" : 4020, "state" : "KY" } +{ "_id" : "42130", "city" : "EIGHTY EIGHT", "loc" : [ -85.828076, 36.939238 ], "pop" : 2716, "state" : "KY" } +{ "_id" : "42131", "city" : "ETOILE", "loc" : [ -85.91727899999999, 36.813428 ], "pop" : 138, "state" : "KY" } +{ "_id" : "42133", "city" : "FOUNTAIN RUN", "loc" : [ -85.952023, 36.72002 ], "pop" : 1568, "state" : "KY" } +{ "_id" : "42134", "city" : "FRANKLIN", "loc" : [ -86.570043, 36.725353 ], "pop" : 14684, "state" : "KY" } +{ "_id" : "42140", "city" : "GAMALIEL", "loc" : [ -85.81335300000001, 36.654037 ], "pop" : 1377, "state" : "KY" } +{ "_id" : "42141", "city" : "GLASGOW", "loc" : [ -85.92205300000001, 36.988189 ], "pop" : 21079, "state" : "KY" } +{ "_id" : "42151", "city" : "HESTAND", "loc" : [ -85.569799, 36.653473 ], "pop" : 386, "state" : "KY" } +{ "_id" : "42153", "city" : "HOLLAND", "loc" : [ -86.049756, 36.667316 ], "pop" : 330, "state" : "KY" } +{ "_id" : "42154", "city" : "KNOB LICK", "loc" : [ -85.71369799999999, 36.996922 ], "pop" : 656, "state" : "KY" } +{ "_id" : "42155", "city" : "LAMB", "loc" : [ -85.885413, 36.799768 ], "pop" : 189, "state" : "KY" } +{ "_id" : "42156", "city" : "LUCAS", "loc" : [ -86.035678, 36.837594 ], "pop" : 415, "state" : "KY" } +{ "_id" : "42157", "city" : "MOUNT HERMAN", "loc" : [ -85.81916200000001, 36.808982 ], "pop" : 816, "state" : "KY" } +{ "_id" : "42159", "city" : "OAKLAND", "loc" : [ -86.285934, 37.007595 ], "pop" : 2879, "state" : "KY" } +{ "_id" : "42160", "city" : "PARK CITY", "loc" : [ -86.077619, 37.057926 ], "pop" : 1351, "state" : "KY" } +{ "_id" : "42163", "city" : "ROCKY HILL", "loc" : [ -86.11009, 37.067481 ], "pop" : 139, "state" : "KY" } +{ "_id" : "42164", "city" : "SCOTTSVILLE", "loc" : [ -86.192863, 36.761437 ], "pop" : 11611, "state" : "KY" } +{ "_id" : "42166", "city" : "SUMMER SHADE", "loc" : [ -85.708322, 36.888345 ], "pop" : 2281, "state" : "KY" } +{ "_id" : "42167", "city" : "T VILLE", "loc" : [ -85.696842, 36.713085 ], "pop" : 8016, "state" : "KY" } +{ "_id" : "42169", "city" : "WILLOW SHADE", "loc" : [ -85.62203, 36.858183 ], "pop" : 126, "state" : "KY" } +{ "_id" : "42170", "city" : "WOODBURN", "loc" : [ -86.562291, 36.855688 ], "pop" : 1573, "state" : "KY" } +{ "_id" : "42171", "city" : "SMITHS GROVE", "loc" : [ -86.19375700000001, 37.058104 ], "pop" : 4650, "state" : "KY" } +{ "_id" : "42202", "city" : "ADAIRVILLE", "loc" : [ -86.85852300000001, 36.691385 ], "pop" : 2481, "state" : "KY" } +{ "_id" : "42204", "city" : "ALLENSVILLE", "loc" : [ -87.02444199999999, 36.694744 ], "pop" : 842, "state" : "KY" } +{ "_id" : "42206", "city" : "AUBURN", "loc" : [ -86.719813, 36.881755 ], "pop" : 4192, "state" : "KY" } +{ "_id" : "42207", "city" : "BEE SPRING", "loc" : [ -86.279377, 37.29754 ], "pop" : 1480, "state" : "KY" } +{ "_id" : "42210", "city" : "REEDYVILLE", "loc" : [ -86.27400299999999, 37.18817 ], "pop" : 2296, "state" : "KY" } +{ "_id" : "42211", "city" : "GOLDEN POND", "loc" : [ -87.84124300000001, 36.846421 ], "pop" : 9683, "state" : "KY" } +{ "_id" : "42214", "city" : "CENTER", "loc" : [ -85.670455, 37.100897 ], "pop" : 2051, "state" : "KY" } +{ "_id" : "42215", "city" : "CERULEAN", "loc" : [ -87.66484800000001, 36.949619 ], "pop" : 1654, "state" : "KY" } +{ "_id" : "42217", "city" : "CROFTON", "loc" : [ -87.48907199999999, 37.034387 ], "pop" : 3531, "state" : "KY" } +{ "_id" : "42220", "city" : "ELKTON", "loc" : [ -87.167833, 36.909403 ], "pop" : 7207, "state" : "KY" } +{ "_id" : "42223", "city" : "FORT CAMPBELL", "loc" : [ -87.459706, 36.653584 ], "pop" : 18861, "state" : "KY" } +{ "_id" : "42232", "city" : "GRACEY", "loc" : [ -87.6545, 36.856393 ], "pop" : 92, "state" : "KY" } +{ "_id" : "42234", "city" : "TINY TOWN", "loc" : [ -87.170931, 36.664268 ], "pop" : 2307, "state" : "KY" } +{ "_id" : "42236", "city" : "HERNDON", "loc" : [ -87.608215, 36.708469 ], "pop" : 810, "state" : "KY" } +{ "_id" : "42240", "city" : "HOPKINSVILLE", "loc" : [ -87.485148, 36.862053 ], "pop" : 39331, "state" : "KY" } +{ "_id" : "42250", "city" : "HUFF", "loc" : [ -86.38211200000001, 37.234241 ], "pop" : 92, "state" : "KY" } +{ "_id" : "42252", "city" : "JETSON", "loc" : [ -86.520872, 37.240367 ], "pop" : 1375, "state" : "KY" } +{ "_id" : "42254", "city" : "LA FAYETTE", "loc" : [ -87.65634, 36.658165 ], "pop" : 123, "state" : "KY" } +{ "_id" : "42256", "city" : "LEWISBURG", "loc" : [ -86.988748, 37.003747 ], "pop" : 3241, "state" : "KY" } +{ "_id" : "42257", "city" : "LINDSEYVILLE", "loc" : [ -86.296384, 37.22813 ], "pop" : 601, "state" : "KY" } +{ "_id" : "42259", "city" : "MAMMOTH CAVE NAT", "loc" : [ -86.178112, 37.274385 ], "pop" : 1354, "state" : "KY" } +{ "_id" : "42261", "city" : "LOGANSPORT", "loc" : [ -86.703726, 37.19102 ], "pop" : 5488, "state" : "KY" } +{ "_id" : "42262", "city" : "OAK GROVE", "loc" : [ -87.42551400000001, 36.665225 ], "pop" : 3556, "state" : "KY" } +{ "_id" : "42265", "city" : "OLMSTEAD", "loc" : [ -86.981846, 36.78463 ], "pop" : 1529, "state" : "KY" } +{ "_id" : "42266", "city" : "PEMBROKE", "loc" : [ -87.331892, 36.798221 ], "pop" : 1221, "state" : "KY" } +{ "_id" : "42268", "city" : "QUALITY", "loc" : [ -86.86905299999999, 37.035402 ], "pop" : 1436, "state" : "KY" } +{ "_id" : "42273", "city" : "ROCHESTER", "loc" : [ -86.85921, 37.204778 ], "pop" : 669, "state" : "KY" } +{ "_id" : "42274", "city" : "BROWNING", "loc" : [ -86.58538900000001, 36.939859 ], "pop" : 1592, "state" : "KY" } +{ "_id" : "42275", "city" : "ROUNDHILL", "loc" : [ -86.40697400000001, 37.25601 ], "pop" : 405, "state" : "KY" } +{ "_id" : "42276", "city" : "DAYSVILLE", "loc" : [ -86.88870799999999, 36.853074 ], "pop" : 12585, "state" : "KY" } +{ "_id" : "42280", "city" : "SHARON GROVE", "loc" : [ -87.10029, 36.927754 ], "pop" : 651, "state" : "KY" } +{ "_id" : "42284", "city" : "SUNFISH", "loc" : [ -86.390826, 37.3022 ], "pop" : 483, "state" : "KY" } +{ "_id" : "42285", "city" : "KYROCK", "loc" : [ -86.29568999999999, 37.252343 ], "pop" : 416, "state" : "KY" } +{ "_id" : "42286", "city" : "TRENTON", "loc" : [ -87.261098, 36.731384 ], "pop" : 1209, "state" : "KY" } +{ "_id" : "42287", "city" : "WELCHS CREEK", "loc" : [ -86.637139, 37.30856 ], "pop" : 2972, "state" : "KY" } +{ "_id" : "42301", "city" : "OWENSBORO", "loc" : [ -87.155394, 37.751255 ], "pop" : 40043, "state" : "KY" } +{ "_id" : "42303", "city" : "OWENSBORO", "loc" : [ -87.080252, 37.755884 ], "pop" : 32552, "state" : "KY" } +{ "_id" : "42320", "city" : "BEAVER DAM", "loc" : [ -86.87293200000001, 37.386958 ], "pop" : 6508, "state" : "KY" } +{ "_id" : "42321", "city" : "BEECH CREEK", "loc" : [ -87.12385399999999, 37.183704 ], "pop" : 303, "state" : "KY" } +{ "_id" : "42323", "city" : "BEECHMONT", "loc" : [ -87.03934, 37.177552 ], "pop" : 2431, "state" : "KY" } +{ "_id" : "42324", "city" : "BELTON", "loc" : [ -86.977369, 37.151056 ], "pop" : 1137, "state" : "KY" } +{ "_id" : "42325", "city" : "BREMEN", "loc" : [ -87.232989, 37.342955 ], "pop" : 3631, "state" : "KY" } +{ "_id" : "42326", "city" : "BROWDER", "loc" : [ -86.97819699999999, 37.259333 ], "pop" : 0, "state" : "KY" } +{ "_id" : "42327", "city" : "CALHOUN", "loc" : [ -87.27730699999999, 37.574997 ], "pop" : 3734, "state" : "KY" } +{ "_id" : "42328", "city" : "CENTERTOWN", "loc" : [ -87.00902000000001, 37.407918 ], "pop" : 1434, "state" : "KY" } +{ "_id" : "42330", "city" : "CENTRAL CITY", "loc" : [ -87.12023600000001, 37.300699 ], "pop" : 8187, "state" : "KY" } +{ "_id" : "42333", "city" : "CROMWELL", "loc" : [ -86.769964, 37.341765 ], "pop" : 356, "state" : "KY" } +{ "_id" : "42337", "city" : "DRAKESBORO", "loc" : [ -87.047966, 37.213588 ], "pop" : 1552, "state" : "KY" } +{ "_id" : "42338", "city" : "DUNDEE", "loc" : [ -86.760446, 37.551052 ], "pop" : 255, "state" : "KY" } +{ "_id" : "42339", "city" : "DUNMOR", "loc" : [ -87.00789, 37.083967 ], "pop" : 534, "state" : "KY" } +{ "_id" : "42343", "city" : "FORDSVILLE", "loc" : [ -86.726251, 37.629738 ], "pop" : 2108, "state" : "KY" } +{ "_id" : "42344", "city" : "GRAHAM", "loc" : [ -87.25784899999999, 37.225836 ], "pop" : 2837, "state" : "KY" } +{ "_id" : "42345", "city" : "GREENVILLE", "loc" : [ -87.18061299999999, 37.207642 ], "pop" : 8616, "state" : "KY" } +{ "_id" : "42347", "city" : "HARTFORD", "loc" : [ -86.91798199999999, 37.478533 ], "pop" : 4628, "state" : "KY" } +{ "_id" : "42348", "city" : "HAWESVILLE", "loc" : [ -86.76380399999999, 37.850318 ], "pop" : 4194, "state" : "KY" } +{ "_id" : "42349", "city" : "HORSE BRANCH", "loc" : [ -86.698734, 37.423417 ], "pop" : 1880, "state" : "KY" } +{ "_id" : "42350", "city" : "ISLAND", "loc" : [ -87.16921000000001, 37.447109 ], "pop" : 1453, "state" : "KY" } +{ "_id" : "42351", "city" : "LEWISPORT", "loc" : [ -86.895712, 37.909016 ], "pop" : 4102, "state" : "KY" } +{ "_id" : "42352", "city" : "LIVERMORE", "loc" : [ -87.12386100000001, 37.504453 ], "pop" : 2336, "state" : "KY" } +{ "_id" : "42355", "city" : "MACEO", "loc" : [ -86.999915, 37.843601 ], "pop" : 2223, "state" : "KY" } +{ "_id" : "42358", "city" : "NARROWS", "loc" : [ -86.68671999999999, 37.569072 ], "pop" : 124, "state" : "KY" } +{ "_id" : "42361", "city" : "OLATON", "loc" : [ -86.728223, 37.498666 ], "pop" : 1838, "state" : "KY" } +{ "_id" : "42365", "city" : "PENROD", "loc" : [ -86.998181, 37.116725 ], "pop" : 354, "state" : "KY" } +{ "_id" : "42366", "city" : "PHILPOT", "loc" : [ -86.937172, 37.718317 ], "pop" : 6890, "state" : "KY" } +{ "_id" : "42368", "city" : "REYNOLDS STATION", "loc" : [ -86.77942, 37.696533 ], "pop" : 1389, "state" : "KY" } +{ "_id" : "42369", "city" : "ROCKPORT", "loc" : [ -86.97462400000001, 37.326871 ], "pop" : 647, "state" : "KY" } +{ "_id" : "42371", "city" : "RUMSEY", "loc" : [ -87.280644, 37.50762 ], "pop" : 836, "state" : "KY" } +{ "_id" : "42372", "city" : "SACRAMENTO", "loc" : [ -87.273584, 37.417687 ], "pop" : 1265, "state" : "KY" } +{ "_id" : "42376", "city" : "UTICA", "loc" : [ -87.059082, 37.620559 ], "pop" : 4800, "state" : "KY" } +{ "_id" : "42378", "city" : "WHITESVILLE", "loc" : [ -86.869912, 37.683402 ], "pop" : 640, "state" : "KY" } +{ "_id" : "42404", "city" : "CLAY", "loc" : [ -87.836793, 37.475599 ], "pop" : 2708, "state" : "KY" } +{ "_id" : "42406", "city" : "CORYDON", "loc" : [ -87.700033, 37.744284 ], "pop" : 3688, "state" : "KY" } +{ "_id" : "42408", "city" : "DAWSON SPRINGS", "loc" : [ -87.68205, 37.196386 ], "pop" : 6728, "state" : "KY" } +{ "_id" : "42409", "city" : "DIXON", "loc" : [ -87.701904, 37.510587 ], "pop" : 1093, "state" : "KY" } +{ "_id" : "42410", "city" : "EARLINGTON", "loc" : [ -87.522679, 37.267899 ], "pop" : 2445, "state" : "KY" } +{ "_id" : "42411", "city" : "FREDONIA", "loc" : [ -88.011229, 37.212956 ], "pop" : 1557, "state" : "KY" } +{ "_id" : "42413", "city" : "HANSON", "loc" : [ -87.47513499999999, 37.438246 ], "pop" : 2329, "state" : "KY" } +{ "_id" : "42420", "city" : "HENDERSON", "loc" : [ -87.563228, 37.827393 ], "pop" : 34941, "state" : "KY" } +{ "_id" : "42431", "city" : "MADISONVILLE", "loc" : [ -87.49532600000001, 37.325551 ], "pop" : 26866, "state" : "KY" } +{ "_id" : "42436", "city" : "MANITOU", "loc" : [ -87.56117999999999, 37.407972 ], "pop" : 1425, "state" : "KY" } +{ "_id" : "42437", "city" : "HENSHAW", "loc" : [ -87.87685999999999, 37.663935 ], "pop" : 10346, "state" : "KY" } +{ "_id" : "42441", "city" : "NEBO", "loc" : [ -87.686521, 37.368255 ], "pop" : 1639, "state" : "KY" } +{ "_id" : "42442", "city" : "NORTONVILLE", "loc" : [ -87.460505, 37.183367 ], "pop" : 2811, "state" : "KY" } +{ "_id" : "42445", "city" : "PRINCETON", "loc" : [ -87.863226, 37.115097 ], "pop" : 11736, "state" : "KY" } +{ "_id" : "42450", "city" : "PROVIDENCE", "loc" : [ -87.750512, 37.404958 ], "pop" : 4778, "state" : "KY" } +{ "_id" : "42451", "city" : "REED", "loc" : [ -87.37038200000001, 37.858764 ], "pop" : 1072, "state" : "KY" } +{ "_id" : "42452", "city" : "ROBARDS", "loc" : [ -87.526596, 37.675836 ], "pop" : 1416, "state" : "KY" } +{ "_id" : "42453", "city" : "SAINT CHARLES", "loc" : [ -87.55386, 37.176635 ], "pop" : 848, "state" : "KY" } +{ "_id" : "42455", "city" : "SEBREE", "loc" : [ -87.52548899999999, 37.588921 ], "pop" : 2911, "state" : "KY" } +{ "_id" : "42456", "city" : "SLAUGHTERS", "loc" : [ -87.50534399999999, 37.5054 ], "pop" : 914, "state" : "KY" } +{ "_id" : "42458", "city" : "SPOTTSVILLE", "loc" : [ -87.424682, 37.839948 ], "pop" : 1534, "state" : "KY" } +{ "_id" : "42459", "city" : "STURGIS", "loc" : [ -87.99645700000001, 37.548669 ], "pop" : 5483, "state" : "KY" } +{ "_id" : "42461", "city" : "UNIONTOWN", "loc" : [ -87.92633499999999, 37.767741 ], "pop" : 1555, "state" : "KY" } +{ "_id" : "42462", "city" : "WAVERLY", "loc" : [ -87.80668799999999, 37.742985 ], "pop" : 1521, "state" : "KY" } +{ "_id" : "42464", "city" : "WHITE PLAINS", "loc" : [ -87.36441499999999, 37.178765 ], "pop" : 1877, "state" : "KY" } +{ "_id" : "42501", "city" : "ALCALDE", "loc" : [ -84.60436199999999, 37.073853 ], "pop" : 28546, "state" : "KY" } +{ "_id" : "42516", "city" : "BETHELRIDGE", "loc" : [ -84.778971, 37.22459 ], "pop" : 550, "state" : "KY" } +{ "_id" : "42518", "city" : "BRONSTON", "loc" : [ -84.63141299999999, 36.952488 ], "pop" : 2417, "state" : "KY" } +{ "_id" : "42519", "city" : "SLOANS VALLEY", "loc" : [ -84.565237, 36.96145 ], "pop" : 2843, "state" : "KY" } +{ "_id" : "42528", "city" : "DUNNVILLE", "loc" : [ -84.929507, 37.176894 ], "pop" : 2308, "state" : "KY" } +{ "_id" : "42532", "city" : "JABEZ", "loc" : [ -84.863157, 37.066884 ], "pop" : 364, "state" : "KY" } +{ "_id" : "42539", "city" : "LIBERTY", "loc" : [ -84.971864, 37.314553 ], "pop" : 7831, "state" : "KY" } +{ "_id" : "42541", "city" : "MIDDLEBURG", "loc" : [ -84.832103, 37.359082 ], "pop" : 697, "state" : "KY" } +{ "_id" : "42544", "city" : "POINTER", "loc" : [ -84.766245, 37.064216 ], "pop" : 3861, "state" : "KY" } +{ "_id" : "42553", "city" : "SCIENCE HILL", "loc" : [ -84.64865, 37.168333 ], "pop" : 2899, "state" : "KY" } +{ "_id" : "42554", "city" : "SHOPVILLE", "loc" : [ -84.44593999999999, 37.174243 ], "pop" : 3258, "state" : "KY" } +{ "_id" : "42555", "city" : "SLOANS VALLEY", "loc" : [ -84.37620099999999, 36.968617 ], "pop" : 0, "state" : "KY" } +{ "_id" : "42558", "city" : "TATEVILLE", "loc" : [ -84.43836400000001, 36.973892 ], "pop" : 0, "state" : "KY" } +{ "_id" : "42566", "city" : "YOSEMITE", "loc" : [ -84.81241199999999, 37.307355 ], "pop" : 380, "state" : "KY" } +{ "_id" : "42567", "city" : "PULASKI", "loc" : [ -84.605593, 37.247038 ], "pop" : 5867, "state" : "KY" } +{ "_id" : "42601", "city" : "AARON", "loc" : [ -85.19911399999999, 36.812827 ], "pop" : 270, "state" : "KY" } +{ "_id" : "42602", "city" : "ALBANY", "loc" : [ -85.140677, 36.68569 ], "pop" : 6419, "state" : "KY" } +{ "_id" : "42603", "city" : "ALPHA", "loc" : [ -85.092405, 36.779735 ], "pop" : 2163, "state" : "KY" } +{ "_id" : "42611", "city" : "COOPERSVILLE", "loc" : [ -84.718717, 36.722168 ], "pop" : 350, "state" : "KY" } +{ "_id" : "42613", "city" : "DELTA", "loc" : [ -84.68402399999999, 36.801658 ], "pop" : 639, "state" : "KY" } +{ "_id" : "42629", "city" : "JAMESTOWN", "loc" : [ -85.096844, 36.967955 ], "pop" : 5140, "state" : "KY" } +{ "_id" : "42633", "city" : "PUEBLO", "loc" : [ -84.839251, 36.842723 ], "pop" : 13523, "state" : "KY" } +{ "_id" : "42634", "city" : "PARKERS LAKE", "loc" : [ -84.443642, 36.834689 ], "pop" : 1952, "state" : "KY" } +{ "_id" : "42635", "city" : "HOLLYHILL", "loc" : [ -84.412745, 36.663677 ], "pop" : 4865, "state" : "KY" } +{ "_id" : "42638", "city" : "REVELO", "loc" : [ -84.472189, 36.673363 ], "pop" : 221, "state" : "KY" } +{ "_id" : "42640", "city" : "ROCKYBRANCH", "loc" : [ -84.81017900000001, 36.668512 ], "pop" : 79, "state" : "KY" } +{ "_id" : "42642", "city" : "WEBBS CROSS ROAD", "loc" : [ -85.042873, 37.056683 ], "pop" : 9569, "state" : "KY" } +{ "_id" : "42643", "city" : "SAWYER", "loc" : [ -84.361745, 36.925337 ], "pop" : 288, "state" : "KY" } +{ "_id" : "42647", "city" : "STEARNS", "loc" : [ -84.51648400000001, 36.708184 ], "pop" : 4201, "state" : "KY" } +{ "_id" : "42649", "city" : "STRUNK", "loc" : [ -84.430801, 36.619068 ], "pop" : 481, "state" : "KY" } +{ "_id" : "42653", "city" : "WIBORG", "loc" : [ -84.46836399999999, 36.738597 ], "pop" : 3595, "state" : "KY" } +{ "_id" : "42655", "city" : "WINDY", "loc" : [ -84.961122, 36.778411 ], "pop" : 2481, "state" : "KY" } +{ "_id" : "42701", "city" : "E TOWN", "loc" : [ -85.858977, 37.706973 ], "pop" : 31300, "state" : "KY" } +{ "_id" : "42711", "city" : "BAKERTON", "loc" : [ -85.331723, 36.871151 ], "pop" : 222, "state" : "KY" } +{ "_id" : "42712", "city" : "BIG CLIFTY", "loc" : [ -86.139498, 37.527801 ], "pop" : 1459, "state" : "KY" } +{ "_id" : "42713", "city" : "BONNIEVILLE", "loc" : [ -85.895996, 37.374141 ], "pop" : 1627, "state" : "KY" } +{ "_id" : "42714", "city" : "BOW", "loc" : [ -85.301935, 36.708119 ], "pop" : 697, "state" : "KY" } +{ "_id" : "42715", "city" : "BREEDING", "loc" : [ -85.407822, 36.981043 ], "pop" : 692, "state" : "KY" } +{ "_id" : "42716", "city" : "BUFFALO", "loc" : [ -85.643411, 37.47864 ], "pop" : 1614, "state" : "KY" } +{ "_id" : "42717", "city" : "BURKESVILLE", "loc" : [ -85.39702800000001, 36.806791 ], "pop" : 4891, "state" : "KY" } +{ "_id" : "42718", "city" : "CAMPBELLSVILLE", "loc" : [ -85.35075500000001, 37.346618 ], "pop" : 19358, "state" : "KY" } +{ "_id" : "42721", "city" : "CANEYVILLE", "loc" : [ -86.470207, 37.422168 ], "pop" : 3148, "state" : "KY" } +{ "_id" : "42722", "city" : "CANMER", "loc" : [ -85.720292, 37.269562 ], "pop" : 465, "state" : "KY" } +{ "_id" : "42723", "city" : "CASEY CREEK", "loc" : [ -85.20764800000001, 37.273479 ], "pop" : 1102, "state" : "KY" } +{ "_id" : "42724", "city" : "STEPHENSBURG", "loc" : [ -86.006046, 37.660339 ], "pop" : 3153, "state" : "KY" } +{ "_id" : "42726", "city" : "WAX", "loc" : [ -86.160219, 37.427896 ], "pop" : 3001, "state" : "KY" } +{ "_id" : "42728", "city" : "MONTPELIER", "loc" : [ -85.269265, 37.116408 ], "pop" : 10012, "state" : "KY" } +{ "_id" : "42729", "city" : "CUB RUN", "loc" : [ -86.08132000000001, 37.314855 ], "pop" : 609, "state" : "KY" } +{ "_id" : "42730", "city" : "CUNDIFF", "loc" : [ -85.274434, 36.957125 ], "pop" : 429, "state" : "KY" } +{ "_id" : "42731", "city" : "DUBRE", "loc" : [ -85.568281, 36.891998 ], "pop" : 210, "state" : "KY" } +{ "_id" : "42732", "city" : "E VIEW", "loc" : [ -86.119153, 37.61478 ], "pop" : 2728, "state" : "KY" } +{ "_id" : "42733", "city" : "ELK HORN", "loc" : [ -85.19176400000001, 37.339287 ], "pop" : 637, "state" : "KY" } +{ "_id" : "42735", "city" : "FAIRPLAY", "loc" : [ -85.32621399999999, 37.035626 ], "pop" : 557, "state" : "KY" } +{ "_id" : "42736", "city" : "FINLEY", "loc" : [ -85.35244899999999, 37.454549 ], "pop" : 1153, "state" : "KY" } +{ "_id" : "42740", "city" : "GLENDALE", "loc" : [ -85.892101, 37.603398 ], "pop" : 991, "state" : "KY" } +{ "_id" : "42741", "city" : "GLENS FORK", "loc" : [ -85.240117, 37.018195 ], "pop" : 788, "state" : "KY" } +{ "_id" : "42742", "city" : "GRADYVILLE", "loc" : [ -85.42753, 37.054438 ], "pop" : 775, "state" : "KY" } +{ "_id" : "42743", "city" : "GREENSBURG", "loc" : [ -85.523639, 37.243009 ], "pop" : 8471, "state" : "KY" } +{ "_id" : "42746", "city" : "HARDYVILLE", "loc" : [ -85.75417400000001, 37.224905 ], "pop" : 1234, "state" : "KY" } +{ "_id" : "42748", "city" : "HODGENVILLE", "loc" : [ -85.723206, 37.574566 ], "pop" : 6666, "state" : "KY" } +{ "_id" : "42749", "city" : "HORSE CAVE", "loc" : [ -85.87854900000001, 37.184939 ], "pop" : 5282, "state" : "KY" } +{ "_id" : "42752", "city" : "KETTLE", "loc" : [ -85.40917, 36.694573 ], "pop" : 991, "state" : "KY" } +{ "_id" : "42753", "city" : "KNIFLEY", "loc" : [ -85.112844, 37.231886 ], "pop" : 648, "state" : "KY" } +{ "_id" : "42754", "city" : "SADLER", "loc" : [ -86.30371, 37.493098 ], "pop" : 13023, "state" : "KY" } +{ "_id" : "42757", "city" : "MAGNOLIA", "loc" : [ -85.730823, 37.416464 ], "pop" : 2960, "state" : "KY" } +{ "_id" : "42761", "city" : "MILLTOWN", "loc" : [ -85.444181, 37.103415 ], "pop" : 625, "state" : "KY" } +{ "_id" : "42762", "city" : "MILLWOOD", "loc" : [ -86.37982100000001, 37.460879 ], "pop" : 561, "state" : "KY" } +{ "_id" : "42764", "city" : "MOUNT SHERMAN", "loc" : [ -85.631381, 37.453408 ], "pop" : 589, "state" : "KY" } +{ "_id" : "42765", "city" : "MUNFORDVILLE", "loc" : [ -85.920141, 37.289812 ], "pop" : 4085, "state" : "KY" } +{ "_id" : "42768", "city" : "PEYTONSBURG", "loc" : [ -85.371663, 36.646299 ], "pop" : 272, "state" : "KY" } +{ "_id" : "42776", "city" : "SONORA", "loc" : [ -85.92296899999999, 37.52207 ], "pop" : 2396, "state" : "KY" } +{ "_id" : "42782", "city" : "SUMMERSVILLE", "loc" : [ -85.619376, 37.34186 ], "pop" : 778, "state" : "KY" } +{ "_id" : "42784", "city" : "UPTON", "loc" : [ -85.908619, 37.456802 ], "pop" : 2272, "state" : "KY" } +{ "_id" : "42788", "city" : "WHITE MILLS", "loc" : [ -86.039519, 37.543765 ], "pop" : 540, "state" : "KY" } +{ "_id" : "43001", "city" : "ALEXANDRIA", "loc" : [ -82.60768299999999, 40.105965 ], "pop" : 2485, "state" : "OH" } +{ "_id" : "43002", "city" : "AMLIN", "loc" : [ -83.179157, 40.07203 ], "pop" : 1699, "state" : "OH" } +{ "_id" : "43003", "city" : "ASHLEY", "loc" : [ -82.954201, 40.416264 ], "pop" : 3009, "state" : "OH" } +{ "_id" : "43004", "city" : "BLACKLICK", "loc" : [ -82.807857, 40.020952 ], "pop" : 2288, "state" : "OH" } +{ "_id" : "43006", "city" : "BRINKHAVEN", "loc" : [ -82.155289, 40.458346 ], "pop" : 378, "state" : "OH" } +{ "_id" : "43009", "city" : "CABLE", "loc" : [ -83.64696000000001, 40.178411 ], "pop" : 1660, "state" : "OH" } +{ "_id" : "43011", "city" : "CENTERBURG", "loc" : [ -82.68003899999999, 40.286513 ], "pop" : 4437, "state" : "OH" } +{ "_id" : "43013", "city" : "CROTON", "loc" : [ -82.698948, 40.237603 ], "pop" : 1197, "state" : "OH" } +{ "_id" : "43014", "city" : "DANVILLE", "loc" : [ -82.26385500000001, 40.455693 ], "pop" : 2033, "state" : "OH" } +{ "_id" : "43015", "city" : "DELAWARE", "loc" : [ -83.072312, 40.293186 ], "pop" : 29384, "state" : "OH" } +{ "_id" : "43017", "city" : "DUBLIN", "loc" : [ -83.114633, 40.109297 ], "pop" : 34840, "state" : "OH" } +{ "_id" : "43019", "city" : "FREDERICKTOWN", "loc" : [ -82.585711, 40.497613 ], "pop" : 10647, "state" : "OH" } +{ "_id" : "43021", "city" : "GALENA", "loc" : [ -82.895937, 40.191546 ], "pop" : 4893, "state" : "OH" } +{ "_id" : "43022", "city" : "GAMBIER", "loc" : [ -82.382752, 40.378241 ], "pop" : 3903, "state" : "OH" } +{ "_id" : "43023", "city" : "GRANVILLE", "loc" : [ -82.51939900000001, 40.078791 ], "pop" : 9523, "state" : "OH" } +{ "_id" : "43025", "city" : "HEBRON", "loc" : [ -82.491868, 39.953464 ], "pop" : 7920, "state" : "OH" } +{ "_id" : "43026", "city" : "HILLIARD", "loc" : [ -83.138333, 40.032187 ], "pop" : 25442, "state" : "OH" } +{ "_id" : "43028", "city" : "HOWARD", "loc" : [ -82.33335099999999, 40.415818 ], "pop" : 1972, "state" : "OH" } +{ "_id" : "43029", "city" : "IRWIN", "loc" : [ -83.458699, 40.128352 ], "pop" : 498, "state" : "OH" } +{ "_id" : "43031", "city" : "JOHNSTOWN", "loc" : [ -82.697284, 40.14452 ], "pop" : 7550, "state" : "OH" } +{ "_id" : "43036", "city" : "MAGNETIC SPRINGS", "loc" : [ -83.26714200000001, 40.358023 ], "pop" : 708, "state" : "OH" } +{ "_id" : "43037", "city" : "MARTINSBURG", "loc" : [ -82.356691, 40.267954 ], "pop" : 370, "state" : "OH" } +{ "_id" : "43040", "city" : "MARYSVILLE", "loc" : [ -83.362213, 40.247723 ], "pop" : 19644, "state" : "OH" } +{ "_id" : "43044", "city" : "MECHANICSBURG", "loc" : [ -83.572352, 40.064659 ], "pop" : 5390, "state" : "OH" } +{ "_id" : "43045", "city" : "MILFORD CENTER", "loc" : [ -83.437333, 40.181666 ], "pop" : 1260, "state" : "OH" } +{ "_id" : "43046", "city" : "MILLERSPORT", "loc" : [ -82.52834799999999, 39.899307 ], "pop" : 3171, "state" : "OH" } +{ "_id" : "43050", "city" : "MOUNT VERNON", "loc" : [ -82.487286, 40.384937 ], "pop" : 24421, "state" : "OH" } +{ "_id" : "43054", "city" : "NEW ALBANY", "loc" : [ -82.798793, 40.084686 ], "pop" : 3520, "state" : "OH" } +{ "_id" : "43055", "city" : "NEWARK", "loc" : [ -82.40456500000001, 40.072429 ], "pop" : 56412, "state" : "OH" } +{ "_id" : "43056", "city" : "HEATH", "loc" : [ -82.38752700000001, 40.019659 ], "pop" : 13336, "state" : "OH" } +{ "_id" : "43060", "city" : "NORTH LEWISBURG", "loc" : [ -83.561476, 40.222871 ], "pop" : 1407, "state" : "OH" } +{ "_id" : "43061", "city" : "OSTRANDER", "loc" : [ -83.197813, 40.273971 ], "pop" : 2622, "state" : "OH" } +{ "_id" : "43062", "city" : "PATASKALA", "loc" : [ -82.668656, 40.000925 ], "pop" : 15470, "state" : "OH" } +{ "_id" : "43064", "city" : "PLAIN CITY", "loc" : [ -83.269049, 40.097356 ], "pop" : 8323, "state" : "OH" } +{ "_id" : "43065", "city" : "SHAWNEE HILLS", "loc" : [ -83.074921, 40.152652 ], "pop" : 14955, "state" : "OH" } +{ "_id" : "43066", "city" : "RADNOR", "loc" : [ -83.178074, 40.391779 ], "pop" : 1150, "state" : "OH" } +{ "_id" : "43067", "city" : "RAYMOND", "loc" : [ -83.36492699999999, 40.247321 ], "pop" : 576, "state" : "OH" } +{ "_id" : "43068", "city" : "REYNOLDSBURG", "loc" : [ -82.803454, 39.955145 ], "pop" : 35820, "state" : "OH" } +{ "_id" : "43071", "city" : "SAINT LOUISVILLE", "loc" : [ -82.356015, 40.181776 ], "pop" : 2389, "state" : "OH" } +{ "_id" : "43072", "city" : "SAINT PARIS", "loc" : [ -83.96306199999999, 40.105755 ], "pop" : 5963, "state" : "OH" } +{ "_id" : "43074", "city" : "SUNBURY", "loc" : [ -82.851051, 40.265499 ], "pop" : 7508, "state" : "OH" } +{ "_id" : "43076", "city" : "THORNVILLE", "loc" : [ -82.407059, 39.897364 ], "pop" : 8187, "state" : "OH" } +{ "_id" : "43078", "city" : "URBANA", "loc" : [ -83.76714200000001, 40.106639 ], "pop" : 20175, "state" : "OH" } +{ "_id" : "43080", "city" : "UTICA", "loc" : [ -82.413459, 40.244137 ], "pop" : 5502, "state" : "OH" } +{ "_id" : "43081", "city" : "WESTERVILLE", "loc" : [ -82.910504, 40.114569 ], "pop" : 49023, "state" : "OH" } +{ "_id" : "43084", "city" : "WOODSTOCK", "loc" : [ -83.546149, 40.181644 ], "pop" : 793, "state" : "OH" } +{ "_id" : "43085", "city" : "WORTHINGTON", "loc" : [ -83.010069, 40.105155 ], "pop" : 27229, "state" : "OH" } +{ "_id" : "43102", "city" : "AMANDA", "loc" : [ -82.755236, 39.625104 ], "pop" : 3730, "state" : "OH" } +{ "_id" : "43103", "city" : "ASHVILLE", "loc" : [ -82.94456700000001, 39.731576 ], "pop" : 9050, "state" : "OH" } +{ "_id" : "43105", "city" : "BALTIMORE", "loc" : [ -82.62402299999999, 39.864452 ], "pop" : 5765, "state" : "OH" } +{ "_id" : "43106", "city" : "BLOOMINGBURG", "loc" : [ -83.409521, 39.628617 ], "pop" : 1643, "state" : "OH" } +{ "_id" : "43107", "city" : "HIDE A WAY HILLS", "loc" : [ -82.42547999999999, 39.698807 ], "pop" : 3087, "state" : "OH" } +{ "_id" : "43110", "city" : "CANAL WINCHESTER", "loc" : [ -82.80436899999999, 39.83486 ], "pop" : 8444, "state" : "OH" } +{ "_id" : "43112", "city" : "CARROLL", "loc" : [ -82.708358, 39.795743 ], "pop" : 3914, "state" : "OH" } +{ "_id" : "43113", "city" : "CIRCLEVILLE", "loc" : [ -82.92996599999999, 39.598836 ], "pop" : 22337, "state" : "OH" } +{ "_id" : "43115", "city" : "CLARKSBURG", "loc" : [ -83.156282, 39.490432 ], "pop" : 1523, "state" : "OH" } +{ "_id" : "43119", "city" : "GALLOWAY", "loc" : [ -83.183848, 39.936604 ], "pop" : 9984, "state" : "OH" } +{ "_id" : "43123", "city" : "GROVE CITY", "loc" : [ -83.083944, 39.881382 ], "pop" : 33730, "state" : "OH" } +{ "_id" : "43125", "city" : "GROVEPORT", "loc" : [ -82.887219, 39.858137 ], "pop" : 7728, "state" : "OH" } +{ "_id" : "43128", "city" : "JEFFERSONVILLE", "loc" : [ -83.56873, 39.65896 ], "pop" : 2359, "state" : "OH" } +{ "_id" : "43130", "city" : "LANCASTER", "loc" : [ -82.60307400000001, 39.718697 ], "pop" : 54451, "state" : "OH" } +{ "_id" : "43135", "city" : "LAURELVILLE", "loc" : [ -82.721219, 39.4757 ], "pop" : 4552, "state" : "OH" } +{ "_id" : "43137", "city" : "LOCKBOURNE", "loc" : [ -82.97636900000001, 39.814236 ], "pop" : 1423, "state" : "OH" } +{ "_id" : "43138", "city" : "LOGAN", "loc" : [ -82.412594, 39.537175 ], "pop" : 16011, "state" : "OH" } +{ "_id" : "43140", "city" : "LONDON", "loc" : [ -83.443899, 39.900074 ], "pop" : 20432, "state" : "OH" } +{ "_id" : "43143", "city" : "MOUNT STERLING", "loc" : [ -83.280618, 39.717506 ], "pop" : 4912, "state" : "OH" } +{ "_id" : "43145", "city" : "NEW HOLLAND", "loc" : [ -83.250429, 39.558897 ], "pop" : 1768, "state" : "OH" } +{ "_id" : "43146", "city" : "ORIENT", "loc" : [ -83.15431700000001, 39.795386 ], "pop" : 13491, "state" : "OH" } +{ "_id" : "43147", "city" : "PICKERINGTON", "loc" : [ -82.75626699999999, 39.906062 ], "pop" : 18424, "state" : "OH" } +{ "_id" : "43148", "city" : "PLEASANTVILLE", "loc" : [ -82.504268, 39.822684 ], "pop" : 1272, "state" : "OH" } +{ "_id" : "43149", "city" : "ROCKBRIDGE", "loc" : [ -82.562572, 39.550907 ], "pop" : 2063, "state" : "OH" } +{ "_id" : "43150", "city" : "RUSHVILLE", "loc" : [ -82.427981, 39.767375 ], "pop" : 1558, "state" : "OH" } +{ "_id" : "43152", "city" : "SOUTH BLOOMINGVI", "loc" : [ -82.639404, 39.374145 ], "pop" : 1429, "state" : "OH" } +{ "_id" : "43153", "city" : "SOUTH SOLON", "loc" : [ -83.59698400000001, 39.742295 ], "pop" : 766, "state" : "OH" } +{ "_id" : "43154", "city" : "STOUTSVILLE", "loc" : [ -82.81927899999999, 39.60672 ], "pop" : 1666, "state" : "OH" } +{ "_id" : "43155", "city" : "SUGAR GROVE", "loc" : [ -82.532113, 39.627699 ], "pop" : 1572, "state" : "OH" } +{ "_id" : "43160", "city" : "WASHINGTON COURT", "loc" : [ -83.438817, 39.534346 ], "pop" : 21357, "state" : "OH" } +{ "_id" : "43162", "city" : "WEST JEFFERSON", "loc" : [ -83.28530600000001, 39.942409 ], "pop" : 7411, "state" : "OH" } +{ "_id" : "43164", "city" : "WILLIAMSPORT", "loc" : [ -83.12505299999999, 39.611739 ], "pop" : 2192, "state" : "OH" } +{ "_id" : "43201", "city" : "COLUMBUS", "loc" : [ -83.004732, 39.995157 ], "pop" : 37110, "state" : "OH" } +{ "_id" : "43202", "city" : "COLUMBUS", "loc" : [ -83.011842, 40.020084 ], "pop" : 21526, "state" : "OH" } +{ "_id" : "43203", "city" : "COLUMBUS", "loc" : [ -82.969131, 39.971925 ], "pop" : 11047, "state" : "OH" } +{ "_id" : "43204", "city" : "COLUMBUS", "loc" : [ -83.07799900000001, 39.952333 ], "pop" : 38794, "state" : "OH" } +{ "_id" : "43205", "city" : "COLUMBUS", "loc" : [ -82.96435200000001, 39.956905 ], "pop" : 17567, "state" : "OH" } +{ "_id" : "43206", "city" : "COLUMBUS", "loc" : [ -82.974845, 39.942639 ], "pop" : 26587, "state" : "OH" } +{ "_id" : "43207", "city" : "COLUMBUS", "loc" : [ -82.97033399999999, 39.904565 ], "pop" : 44404, "state" : "OH" } +{ "_id" : "43209", "city" : "BEXLEY", "loc" : [ -82.92659500000001, 39.958999 ], "pop" : 29574, "state" : "OH" } +{ "_id" : "43210", "city" : "COLUMBUS", "loc" : [ -83.01640399999999, 40.002804 ], "pop" : 10690, "state" : "OH" } +{ "_id" : "43211", "city" : "COLUMBUS", "loc" : [ -82.973196, 40.011792 ], "pop" : 28031, "state" : "OH" } +{ "_id" : "43212", "city" : "COLUMBUS", "loc" : [ -83.045579, 39.987381 ], "pop" : 18478, "state" : "OH" } +{ "_id" : "43213", "city" : "WHITEHALL", "loc" : [ -82.878275, 39.967146 ], "pop" : 29375, "state" : "OH" } +{ "_id" : "43214", "city" : "COLUMBUS", "loc" : [ -83.01875, 40.053482 ], "pop" : 26080, "state" : "OH" } +{ "_id" : "43215", "city" : "COLUMBUS", "loc" : [ -83.004383, 39.967106 ], "pop" : 10145, "state" : "OH" } +{ "_id" : "43217", "city" : "COLUMBUS", "loc" : [ -82.94748300000001, 39.806209 ], "pop" : 2150, "state" : "OH" } +{ "_id" : "43219", "city" : "SHEPARD", "loc" : [ -82.936459, 40.004394 ], "pop" : 24841, "state" : "OH" } +{ "_id" : "43220", "city" : "COLUMBUS", "loc" : [ -83.066911, 40.049484 ], "pop" : 24378, "state" : "OH" } +{ "_id" : "43221", "city" : "UPPER ARLINGTON", "loc" : [ -83.064592, 40.015431 ], "pop" : 21283, "state" : "OH" } +{ "_id" : "43222", "city" : "COLUMBUS", "loc" : [ -83.031109, 39.957628 ], "pop" : 7019, "state" : "OH" } +{ "_id" : "43223", "city" : "COLUMBUS", "loc" : [ -83.046344, 39.938753 ], "pop" : 30538, "state" : "OH" } +{ "_id" : "43224", "city" : "COLUMBUS", "loc" : [ -82.968947, 40.042493 ], "pop" : 41442, "state" : "OH" } +{ "_id" : "43227", "city" : "COLUMBUS", "loc" : [ -82.890298, 39.944394 ], "pop" : 24945, "state" : "OH" } +{ "_id" : "43228", "city" : "LINCOLN VILLAGE", "loc" : [ -83.123858, 39.947876 ], "pop" : 37615, "state" : "OH" } +{ "_id" : "43229", "city" : "COLUMBUS", "loc" : [ -82.972568, 40.083886 ], "pop" : 45798, "state" : "OH" } +{ "_id" : "43230", "city" : "GAHANNA", "loc" : [ -82.882429, 40.038458 ], "pop" : 34342, "state" : "OH" } +{ "_id" : "43231", "city" : "COLUMBUS", "loc" : [ -82.938275, 40.080984 ], "pop" : 14519, "state" : "OH" } +{ "_id" : "43232", "city" : "COLUMBUS", "loc" : [ -82.866432, 39.923024 ], "pop" : 38848, "state" : "OH" } +{ "_id" : "43235", "city" : "WEST WORTHINGTON", "loc" : [ -83.059287, 40.101271 ], "pop" : 34051, "state" : "OH" } +{ "_id" : "43302", "city" : "MARION", "loc" : [ -83.127056, 40.587648 ], "pop" : 50967, "state" : "OH" } +{ "_id" : "43310", "city" : "BELLE CENTER", "loc" : [ -83.768773, 40.502371 ], "pop" : 2057, "state" : "OH" } +{ "_id" : "43311", "city" : "BELLEFONTAINE", "loc" : [ -83.757076, 40.360472 ], "pop" : 16796, "state" : "OH" } +{ "_id" : "43314", "city" : "CALEDONIA", "loc" : [ -82.992465, 40.627239 ], "pop" : 3120, "state" : "OH" } +{ "_id" : "43315", "city" : "CARDINGTON", "loc" : [ -82.933728, 40.506583 ], "pop" : 4739, "state" : "OH" } +{ "_id" : "43316", "city" : "CAREY", "loc" : [ -83.383578, 40.948599 ], "pop" : 6177, "state" : "OH" } +{ "_id" : "43318", "city" : "DE GRAFF", "loc" : [ -83.9153, 40.305773 ], "pop" : 3452, "state" : "OH" } +{ "_id" : "43319", "city" : "EAST LIBERTY", "loc" : [ -83.58622099999999, 40.307682 ], "pop" : 1351, "state" : "OH" } +{ "_id" : "43320", "city" : "EDISON", "loc" : [ -82.90230099999999, 40.590475 ], "pop" : 1319, "state" : "OH" } +{ "_id" : "43321", "city" : "FULTON", "loc" : [ -82.83624399999999, 40.465013 ], "pop" : 1181, "state" : "OH" } +{ "_id" : "43323", "city" : "HARPSTER", "loc" : [ -83.23428, 40.747541 ], "pop" : 719, "state" : "OH" } +{ "_id" : "43324", "city" : "HUNTSVILLE", "loc" : [ -83.792748, 40.441295 ], "pop" : 1953, "state" : "OH" } +{ "_id" : "43326", "city" : "KENTON", "loc" : [ -83.611087, 40.640433 ], "pop" : 15332, "state" : "OH" } +{ "_id" : "43331", "city" : "LAKEVIEW", "loc" : [ -83.90813900000001, 40.503033 ], "pop" : 5722, "state" : "OH" } +{ "_id" : "43332", "city" : "LA RUE", "loc" : [ -83.373397, 40.578879 ], "pop" : 2120, "state" : "OH" } +{ "_id" : "43333", "city" : "LEWISTOWN", "loc" : [ -83.92089300000001, 40.42768 ], "pop" : 958, "state" : "OH" } +{ "_id" : "43334", "city" : "MARENGO", "loc" : [ -82.812136, 40.389512 ], "pop" : 3338, "state" : "OH" } +{ "_id" : "43335", "city" : "MARTEL", "loc" : [ -82.90586, 40.670775 ], "pop" : 659, "state" : "OH" } +{ "_id" : "43337", "city" : "MORRAL", "loc" : [ -83.204606, 40.695366 ], "pop" : 1035, "state" : "OH" } +{ "_id" : "43338", "city" : "MOUNT GILEAD", "loc" : [ -82.806235, 40.538371 ], "pop" : 8271, "state" : "OH" } +{ "_id" : "43340", "city" : "MOUNT VICTORY", "loc" : [ -83.494165, 40.52321 ], "pop" : 1015, "state" : "OH" } +{ "_id" : "43341", "city" : "NEW BLOOMINGTON", "loc" : [ -83.322351, 40.607301 ], "pop" : 1428, "state" : "OH" } +{ "_id" : "43342", "city" : "PROSPECT", "loc" : [ -83.176295, 40.472659 ], "pop" : 3365, "state" : "OH" } +{ "_id" : "43343", "city" : "QUINCY", "loc" : [ -83.974411, 40.287606 ], "pop" : 1147, "state" : "OH" } +{ "_id" : "43344", "city" : "RICHWOOD", "loc" : [ -83.31363899999999, 40.43698 ], "pop" : 4055, "state" : "OH" } +{ "_id" : "43345", "city" : "RIDGEWAY", "loc" : [ -83.570161, 40.520923 ], "pop" : 857, "state" : "OH" } +{ "_id" : "43346", "city" : "ROUNDHEAD", "loc" : [ -83.848502, 40.580337 ], "pop" : 641, "state" : "OH" } +{ "_id" : "43347", "city" : "RUSHSYLVANIA", "loc" : [ -83.659789, 40.465808 ], "pop" : 1544, "state" : "OH" } +{ "_id" : "43348", "city" : "RUSSELLS POINT", "loc" : [ -83.879825, 40.474956 ], "pop" : 2416, "state" : "OH" } +{ "_id" : "43350", "city" : "SPARTA", "loc" : [ -82.697034, 40.373492 ], "pop" : 966, "state" : "OH" } +{ "_id" : "43351", "city" : "UPPER SANDUSKY", "loc" : [ -83.29771100000001, 40.824876 ], "pop" : 9778, "state" : "OH" } +{ "_id" : "43356", "city" : "WALDO", "loc" : [ -83.070609, 40.460544 ], "pop" : 1170, "state" : "OH" } +{ "_id" : "43357", "city" : "WEST LIBERTY", "loc" : [ -83.752763, 40.262541 ], "pop" : 4148, "state" : "OH" } +{ "_id" : "43358", "city" : "WEST MANSFIELD", "loc" : [ -83.52427400000001, 40.404284 ], "pop" : 2580, "state" : "OH" } +{ "_id" : "43359", "city" : "WHARTON", "loc" : [ -83.463016, 40.861216 ], "pop" : 378, "state" : "OH" } +{ "_id" : "43360", "city" : "ZANESFIELD", "loc" : [ -83.664832, 40.302396 ], "pop" : 1171, "state" : "OH" } +{ "_id" : "43402", "city" : "BOWLING GREEN", "loc" : [ -83.650749, 41.381513 ], "pop" : 34468, "state" : "OH" } +{ "_id" : "43406", "city" : "BRADNER", "loc" : [ -83.4456, 41.329789 ], "pop" : 1934, "state" : "OH" } +{ "_id" : "43407", "city" : "BURGOON", "loc" : [ -83.247455, 41.267986 ], "pop" : 572, "state" : "OH" } +{ "_id" : "43410", "city" : "CLYDE", "loc" : [ -82.991849, 41.302397 ], "pop" : 9650, "state" : "OH" } +{ "_id" : "43412", "city" : "CURTICE", "loc" : [ -83.285825, 41.647736 ], "pop" : 2426, "state" : "OH" } +{ "_id" : "43413", "city" : "CYGNET", "loc" : [ -83.61415100000001, 41.247024 ], "pop" : 1516, "state" : "OH" } +{ "_id" : "43416", "city" : "ELMORE", "loc" : [ -83.27673, 41.468144 ], "pop" : 3230, "state" : "OH" } +{ "_id" : "43420", "city" : "FREMONT", "loc" : [ -83.118095, 41.349792 ], "pop" : 31615, "state" : "OH" } +{ "_id" : "43430", "city" : "GENOA", "loc" : [ -83.35898400000001, 41.530005 ], "pop" : 5405, "state" : "OH" } +{ "_id" : "43431", "city" : "GIBSONBURG", "loc" : [ -83.335762, 41.380474 ], "pop" : 3874, "state" : "OH" } +{ "_id" : "43432", "city" : "ELLISTON", "loc" : [ -83.261135, 41.527136 ], "pop" : 115, "state" : "OH" } +{ "_id" : "43435", "city" : "MILLERSVILLE", "loc" : [ -83.323184, 41.318005 ], "pop" : 1427, "state" : "OH" } +{ "_id" : "43436", "city" : "ISLE SAINT GEORG", "loc" : [ -82.819275, 41.713668 ], "pop" : 38, "state" : "OH" } +{ "_id" : "43438", "city" : "KELLEYS ISLAND", "loc" : [ -82.706811, 41.600755 ], "pop" : 172, "state" : "OH" } +{ "_id" : "43439", "city" : "LACARNE", "loc" : [ -83.02400400000001, 41.527846 ], "pop" : 1457, "state" : "OH" } +{ "_id" : "43440", "city" : "LAKESIDE", "loc" : [ -82.77139200000001, 41.52913 ], "pop" : 4410, "state" : "OH" } +{ "_id" : "43442", "city" : "LINDSEY", "loc" : [ -83.21347400000001, 41.414747 ], "pop" : 1646, "state" : "OH" } +{ "_id" : "43443", "city" : "LUCKEY", "loc" : [ -83.46739599999999, 41.451669 ], "pop" : 1771, "state" : "OH" } +{ "_id" : "43445", "city" : "BONO", "loc" : [ -83.345536, 41.596249 ], "pop" : 3895, "state" : "OH" } +{ "_id" : "43447", "city" : "MILLBURY", "loc" : [ -83.43808300000001, 41.56106 ], "pop" : 3100, "state" : "OH" } +{ "_id" : "43449", "city" : "OAK HARBOR", "loc" : [ -83.127764, 41.523556 ], "pop" : 9620, "state" : "OH" } +{ "_id" : "43450", "city" : "PEMBERVILLE", "loc" : [ -83.473642, 41.402258 ], "pop" : 2569, "state" : "OH" } +{ "_id" : "43451", "city" : "PORTAGE", "loc" : [ -83.614299, 41.312702 ], "pop" : 1304, "state" : "OH" } +{ "_id" : "43452", "city" : "PORT CLINTON", "loc" : [ -82.909368, 41.521535 ], "pop" : 11851, "state" : "OH" } +{ "_id" : "43456", "city" : "PUT IN BAY", "loc" : [ -82.822593, 41.651356 ], "pop" : 518, "state" : "OH" } +{ "_id" : "43457", "city" : "RISINGSUN", "loc" : [ -83.43259, 41.270639 ], "pop" : 1756, "state" : "OH" } +{ "_id" : "43460", "city" : "ROSSFORD", "loc" : [ -83.563793, 41.604908 ], "pop" : 5861, "state" : "OH" } +{ "_id" : "43462", "city" : "RUDOLPH", "loc" : [ -83.683212, 41.296734 ], "pop" : 1737, "state" : "OH" } +{ "_id" : "43464", "city" : "VICKERY", "loc" : [ -82.89895300000001, 41.39099 ], "pop" : 1976, "state" : "OH" } +{ "_id" : "43465", "city" : "WALBRIDGE", "loc" : [ -83.493008, 41.586067 ], "pop" : 4597, "state" : "OH" } +{ "_id" : "43466", "city" : "WAYNE", "loc" : [ -83.47006500000001, 41.299312 ], "pop" : 1572, "state" : "OH" } +{ "_id" : "43469", "city" : "WOODVILLE", "loc" : [ -83.364643, 41.451206 ], "pop" : 2968, "state" : "OH" } +{ "_id" : "43501", "city" : "ALVORDTON", "loc" : [ -84.43553300000001, 41.662489 ], "pop" : 954, "state" : "OH" } +{ "_id" : "43502", "city" : "ARCHBOLD", "loc" : [ -84.304833, 41.533255 ], "pop" : 6565, "state" : "OH" } +{ "_id" : "43504", "city" : "BERKEY", "loc" : [ -83.830972, 41.698892 ], "pop" : 843, "state" : "OH" } +{ "_id" : "43506", "city" : "BRYAN", "loc" : [ -84.56287, 41.474839 ], "pop" : 14693, "state" : "OH" } +{ "_id" : "43511", "city" : "CUSTAR", "loc" : [ -83.834919, 41.295318 ], "pop" : 1049, "state" : "OH" } +{ "_id" : "43512", "city" : "DEFIANCE", "loc" : [ -84.362583, 41.279858 ], "pop" : 29859, "state" : "OH" } +{ "_id" : "43515", "city" : "DELTA", "loc" : [ -83.9866, 41.557695 ], "pop" : 11110, "state" : "OH" } +{ "_id" : "43516", "city" : "DESHLER", "loc" : [ -83.896434, 41.223945 ], "pop" : 4043, "state" : "OH" } +{ "_id" : "43517", "city" : "EDGERTON", "loc" : [ -84.734937, 41.442496 ], "pop" : 3663, "state" : "OH" } +{ "_id" : "43518", "city" : "EDON", "loc" : [ -84.757002, 41.584219 ], "pop" : 2688, "state" : "OH" } +{ "_id" : "43521", "city" : "FAYETTE", "loc" : [ -84.32500400000001, 41.671716 ], "pop" : 2248, "state" : "OH" } +{ "_id" : "43522", "city" : "GRAND RAPIDS", "loc" : [ -83.85524599999999, 41.437855 ], "pop" : 3362, "state" : "OH" } +{ "_id" : "43524", "city" : "HAMLER", "loc" : [ -84.071989, 41.212874 ], "pop" : 1949, "state" : "OH" } +{ "_id" : "43525", "city" : "HASKINS", "loc" : [ -83.70585800000001, 41.465159 ], "pop" : 549, "state" : "OH" } +{ "_id" : "43526", "city" : "HICKSVILLE", "loc" : [ -84.758852, 41.303378 ], "pop" : 5541, "state" : "OH" } +{ "_id" : "43527", "city" : "HOLGATE", "loc" : [ -84.144735, 41.254859 ], "pop" : 2032, "state" : "OH" } +{ "_id" : "43528", "city" : "HOLLAND", "loc" : [ -83.725712, 41.622629 ], "pop" : 10773, "state" : "OH" } +{ "_id" : "43532", "city" : "LIBERTY CENTER", "loc" : [ -83.985889, 41.451371 ], "pop" : 3933, "state" : "OH" } +{ "_id" : "43533", "city" : "LYONS", "loc" : [ -84.06235100000001, 41.690546 ], "pop" : 1395, "state" : "OH" } +{ "_id" : "43534", "city" : "MC CLURE", "loc" : [ -83.942482, 41.377309 ], "pop" : 1876, "state" : "OH" } +{ "_id" : "43535", "city" : "MALINTA", "loc" : [ -84.045731, 41.308425 ], "pop" : 1121, "state" : "OH" } +{ "_id" : "43536", "city" : "MARK CENTER", "loc" : [ -84.62778, 41.291669 ], "pop" : 963, "state" : "OH" } +{ "_id" : "43537", "city" : "MAUMEE", "loc" : [ -83.66283, 41.581682 ], "pop" : 22993, "state" : "OH" } +{ "_id" : "43540", "city" : "METAMORA", "loc" : [ -83.925972, 41.695233 ], "pop" : 1531, "state" : "OH" } +{ "_id" : "43542", "city" : "MONCLOVA", "loc" : [ -83.775718, 41.568416 ], "pop" : 2286, "state" : "OH" } +{ "_id" : "43543", "city" : "MONTPELIER", "loc" : [ -84.61470300000001, 41.59821 ], "pop" : 7569, "state" : "OH" } +{ "_id" : "43545", "city" : "NAPOLEON", "loc" : [ -84.143271, 41.390969 ], "pop" : 14196, "state" : "OH" } +{ "_id" : "43548", "city" : "NEW BAVARIA", "loc" : [ -84.19133600000001, 41.208649 ], "pop" : 523, "state" : "OH" } +{ "_id" : "43549", "city" : "NEY", "loc" : [ -84.526921, 41.378083 ], "pop" : 1801, "state" : "OH" } +{ "_id" : "43551", "city" : "PERRYSBURG", "loc" : [ -83.592727, 41.542926 ], "pop" : 29621, "state" : "OH" } +{ "_id" : "43554", "city" : "PIONEER", "loc" : [ -84.53632399999999, 41.665619 ], "pop" : 2350, "state" : "OH" } +{ "_id" : "43556", "city" : "SHERWOOD", "loc" : [ -84.541674, 41.294593 ], "pop" : 1686, "state" : "OH" } +{ "_id" : "43557", "city" : "STRYKER", "loc" : [ -84.408914, 41.486123 ], "pop" : 2607, "state" : "OH" } +{ "_id" : "43558", "city" : "SWANTON", "loc" : [ -83.871821, 41.594497 ], "pop" : 10729, "state" : "OH" } +{ "_id" : "43560", "city" : "SYLVANIA", "loc" : [ -83.70682499999999, 41.707985 ], "pop" : 24564, "state" : "OH" } +{ "_id" : "43566", "city" : "WATERVILLE", "loc" : [ -83.733142, 41.502248 ], "pop" : 5918, "state" : "OH" } +{ "_id" : "43567", "city" : "WAUSEON", "loc" : [ -84.153745, 41.566796 ], "pop" : 10493, "state" : "OH" } +{ "_id" : "43569", "city" : "WESTON", "loc" : [ -83.797336, 41.351593 ], "pop" : 2560, "state" : "OH" } +{ "_id" : "43570", "city" : "WEST UNITY", "loc" : [ -84.442066, 41.575645 ], "pop" : 3305, "state" : "OH" } +{ "_id" : "43571", "city" : "WHITEHOUSE", "loc" : [ -83.81151, 41.519432 ], "pop" : 5199, "state" : "OH" } +{ "_id" : "43602", "city" : "TOLEDO", "loc" : [ -83.55474700000001, 41.647984 ], "pop" : 4084, "state" : "OH" } +{ "_id" : "43604", "city" : "TOLEDO", "loc" : [ -83.52494900000001, 41.661415 ], "pop" : 5506, "state" : "OH" } +{ "_id" : "43605", "city" : "OREGON", "loc" : [ -83.51234100000001, 41.640701 ], "pop" : 33168, "state" : "OH" } +{ "_id" : "43606", "city" : "TOLEDO", "loc" : [ -83.605992, 41.671213 ], "pop" : 29111, "state" : "OH" } +{ "_id" : "43607", "city" : "TOLEDO", "loc" : [ -83.597419, 41.650417 ], "pop" : 30240, "state" : "OH" } +{ "_id" : "43608", "city" : "TOLEDO", "loc" : [ -83.53435899999999, 41.677908 ], "pop" : 21427, "state" : "OH" } +{ "_id" : "43609", "city" : "TOLEDO", "loc" : [ -83.577282, 41.629761 ], "pop" : 29228, "state" : "OH" } +{ "_id" : "43610", "city" : "TOLEDO", "loc" : [ -83.557303, 41.676693 ], "pop" : 8374, "state" : "OH" } +{ "_id" : "43611", "city" : "TOLEDO", "loc" : [ -83.489203, 41.704507 ], "pop" : 23349, "state" : "OH" } +{ "_id" : "43612", "city" : "TOLEDO", "loc" : [ -83.565622, 41.704567 ], "pop" : 33408, "state" : "OH" } +{ "_id" : "43613", "city" : "TOLEDO", "loc" : [ -83.603397, 41.703913 ], "pop" : 35327, "state" : "OH" } +{ "_id" : "43614", "city" : "TOLEDO", "loc" : [ -83.62917, 41.60279 ], "pop" : 31020, "state" : "OH" } +{ "_id" : "43615", "city" : "TOLEDO", "loc" : [ -83.67058299999999, 41.649197 ], "pop" : 38173, "state" : "OH" } +{ "_id" : "43616", "city" : "OREGON", "loc" : [ -83.471366, 41.641842 ], "pop" : 15713, "state" : "OH" } +{ "_id" : "43617", "city" : "TOLEDO", "loc" : [ -83.716967, 41.666765 ], "pop" : 7449, "state" : "OH" } +{ "_id" : "43618", "city" : "OREGON", "loc" : [ -83.392302, 41.665636 ], "pop" : 3379, "state" : "OH" } +{ "_id" : "43619", "city" : "NORTHWOOD", "loc" : [ -83.48056, 41.607986 ], "pop" : 7526, "state" : "OH" } +{ "_id" : "43620", "city" : "TOLEDO", "loc" : [ -83.553602, 41.66536 ], "pop" : 8471, "state" : "OH" } +{ "_id" : "43623", "city" : "TOLEDO", "loc" : [ -83.64340799999999, 41.707968 ], "pop" : 21315, "state" : "OH" } +{ "_id" : "43624", "city" : "TOLEDO", "loc" : [ -83.545005, 41.65627 ], "pop" : 1596, "state" : "OH" } +{ "_id" : "43701", "city" : "SONORA", "loc" : [ -82.008898, 39.944265 ], "pop" : 56655, "state" : "OH" } +{ "_id" : "43713", "city" : "SOMERTON", "loc" : [ -81.171295, 39.9812 ], "pop" : 7140, "state" : "OH" } +{ "_id" : "43716", "city" : "BEALLSVILLE", "loc" : [ -81.014358, 39.872601 ], "pop" : 716, "state" : "OH" } +{ "_id" : "43718", "city" : "BELMONT", "loc" : [ -81.006564, 40.03202 ], "pop" : 3229, "state" : "OH" } +{ "_id" : "43719", "city" : "BETHESDA", "loc" : [ -81.076742, 40.019221 ], "pop" : 2464, "state" : "OH" } +{ "_id" : "43720", "city" : "BLUE ROCK", "loc" : [ -81.891023, 39.799996 ], "pop" : 1001, "state" : "OH" } +{ "_id" : "43723", "city" : "BYESVILLE", "loc" : [ -81.548485, 39.962336 ], "pop" : 5164, "state" : "OH" } +{ "_id" : "43724", "city" : "CALDWELL", "loc" : [ -81.51528, 39.746651 ], "pop" : 7043, "state" : "OH" } +{ "_id" : "43725", "city" : "CLAYSVILLE", "loc" : [ -81.59127700000001, 40.030501 ], "pop" : 21261, "state" : "OH" } +{ "_id" : "43727", "city" : "CHANDLERSVILLE", "loc" : [ -81.830084, 39.889659 ], "pop" : 1368, "state" : "OH" } +{ "_id" : "43728", "city" : "CHESTERHILL", "loc" : [ -81.877286, 39.495277 ], "pop" : 1323, "state" : "OH" } +{ "_id" : "43730", "city" : "HEMLOCK", "loc" : [ -82.097737, 39.634902 ], "pop" : 3374, "state" : "OH" } +{ "_id" : "43731", "city" : "CROOKSVILLE", "loc" : [ -82.084018, 39.762321 ], "pop" : 4609, "state" : "OH" } +{ "_id" : "43732", "city" : "CUMBERLAND", "loc" : [ -81.625925, 39.874092 ], "pop" : 1831, "state" : "OH" } +{ "_id" : "43734", "city" : "DUNCAN FALLS", "loc" : [ -81.911665, 39.877777 ], "pop" : 957, "state" : "OH" } +{ "_id" : "43739", "city" : "GLENFORD", "loc" : [ -82.302592, 39.869935 ], "pop" : 1632, "state" : "OH" } +{ "_id" : "43746", "city" : "HOPEWELL", "loc" : [ -82.175619, 39.96008 ], "pop" : 1160, "state" : "OH" } +{ "_id" : "43747", "city" : "JERUSALEM", "loc" : [ -81.092088, 39.848831 ], "pop" : 2037, "state" : "OH" } +{ "_id" : "43748", "city" : "JUNCTION CITY", "loc" : [ -82.31552499999999, 39.696531 ], "pop" : 2577, "state" : "OH" } +{ "_id" : "43749", "city" : "GUERNSEY", "loc" : [ -81.53036, 40.166544 ], "pop" : 2109, "state" : "OH" } +{ "_id" : "43754", "city" : "LEWISVILLE", "loc" : [ -81.231583, 39.768379 ], "pop" : 1366, "state" : "OH" } +{ "_id" : "43755", "city" : "LORE CITY", "loc" : [ -81.44785299999999, 40.045854 ], "pop" : 1487, "state" : "OH" } +{ "_id" : "43756", "city" : "MC CONNELSVILLE", "loc" : [ -81.837625, 39.670014 ], "pop" : 4784, "state" : "OH" } +{ "_id" : "43758", "city" : "MALTA", "loc" : [ -81.912746, 39.648212 ], "pop" : 3127, "state" : "OH" } +{ "_id" : "43760", "city" : "MOUNT PERRY", "loc" : [ -82.188039, 39.878798 ], "pop" : 1550, "state" : "OH" } +{ "_id" : "43762", "city" : "NEW CONCORD", "loc" : [ -81.738727, 40.008798 ], "pop" : 4770, "state" : "OH" } +{ "_id" : "43764", "city" : "NEW LEXINGTON", "loc" : [ -82.20188400000001, 39.717438 ], "pop" : 8536, "state" : "OH" } +{ "_id" : "43766", "city" : "NEW STRAITSVILLE", "loc" : [ -82.24880400000001, 39.586872 ], "pop" : 1669, "state" : "OH" } +{ "_id" : "43767", "city" : "NORWICH", "loc" : [ -81.802425, 39.993438 ], "pop" : 1142, "state" : "OH" } +{ "_id" : "43771", "city" : "PHILO", "loc" : [ -81.917479, 39.845773 ], "pop" : 1374, "state" : "OH" } +{ "_id" : "43772", "city" : "PLEASANT CITY", "loc" : [ -81.55797, 39.909514 ], "pop" : 1231, "state" : "OH" } +{ "_id" : "43773", "city" : "QUAKER CITY", "loc" : [ -81.289883, 39.986576 ], "pop" : 2139, "state" : "OH" } +{ "_id" : "43777", "city" : "ROSEVILLE", "loc" : [ -82.079212, 39.818656 ], "pop" : 4293, "state" : "OH" } +{ "_id" : "43778", "city" : "SALESVILLE", "loc" : [ -81.372793, 40.008146 ], "pop" : 1009, "state" : "OH" } +{ "_id" : "43779", "city" : "SARAHSVILLE", "loc" : [ -81.467825, 39.793846 ], "pop" : 947, "state" : "OH" } +{ "_id" : "43780", "city" : "SENECAVILLE", "loc" : [ -81.458043, 39.933719 ], "pop" : 3014, "state" : "OH" } +{ "_id" : "43782", "city" : "SHAWNEE", "loc" : [ -82.208459, 39.610984 ], "pop" : 1019, "state" : "OH" } +{ "_id" : "43783", "city" : "SOMERSET", "loc" : [ -82.29911, 39.793615 ], "pop" : 2541, "state" : "OH" } +{ "_id" : "43787", "city" : "PENNSVILLE", "loc" : [ -81.82525099999999, 39.561434 ], "pop" : 1865, "state" : "OH" } +{ "_id" : "43788", "city" : "SUMMERFIELD", "loc" : [ -81.331993, 39.803597 ], "pop" : 1151, "state" : "OH" } +{ "_id" : "43793", "city" : "ANTIOCH", "loc" : [ -81.10336, 39.753063 ], "pop" : 5231, "state" : "OH" } +{ "_id" : "43802", "city" : "ADAMSVILLE", "loc" : [ -81.871847, 40.07929 ], "pop" : 943, "state" : "OH" } +{ "_id" : "43804", "city" : "BALTIC", "loc" : [ -81.679171, 40.447568 ], "pop" : 2225, "state" : "OH" } +{ "_id" : "43811", "city" : "CONESVILLE", "loc" : [ -81.89507399999999, 40.180441 ], "pop" : 696, "state" : "OH" } +{ "_id" : "43812", "city" : "COSHOCTON", "loc" : [ -81.866033, 40.275412 ], "pop" : 21561, "state" : "OH" } +{ "_id" : "43821", "city" : "ADAMS MILLS", "loc" : [ -82.018807, 40.112941 ], "pop" : 4204, "state" : "OH" } +{ "_id" : "43822", "city" : "FRAZEYSBURG", "loc" : [ -82.129279, 40.131616 ], "pop" : 2746, "state" : "OH" } +{ "_id" : "43824", "city" : "FRESNO", "loc" : [ -81.762297, 40.371126 ], "pop" : 2777, "state" : "OH" } +{ "_id" : "43830", "city" : "NASHPORT", "loc" : [ -82.09976, 40.038588 ], "pop" : 3579, "state" : "OH" } +{ "_id" : "43832", "city" : "NEWCOMERSTOWN", "loc" : [ -81.593969, 40.273895 ], "pop" : 7574, "state" : "OH" } +{ "_id" : "43837", "city" : "PORT WASHINGTON", "loc" : [ -81.521518, 40.340359 ], "pop" : 1190, "state" : "OH" } +{ "_id" : "43840", "city" : "STONE CREEK", "loc" : [ -81.589018, 40.405188 ], "pop" : 1208, "state" : "OH" } +{ "_id" : "43843", "city" : "WALHONDING", "loc" : [ -82.20935900000001, 40.362037 ], "pop" : 937, "state" : "OH" } +{ "_id" : "43844", "city" : "WARSAW", "loc" : [ -82.055989, 40.317243 ], "pop" : 3177, "state" : "OH" } +{ "_id" : "43845", "city" : "WEST LAFAYETTE", "loc" : [ -81.736102, 40.271829 ], "pop" : 4667, "state" : "OH" } +{ "_id" : "43901", "city" : "ADENA", "loc" : [ -80.88153800000001, 40.212581 ], "pop" : 1690, "state" : "OH" } +{ "_id" : "43902", "city" : "ALLEDONIA", "loc" : [ -80.957753, 39.905271 ], "pop" : 499, "state" : "OH" } +{ "_id" : "43903", "city" : "AMSTERDAM", "loc" : [ -80.959554, 40.473131 ], "pop" : 819, "state" : "OH" } +{ "_id" : "43906", "city" : "BELLAIRE", "loc" : [ -80.763813, 40.020399 ], "pop" : 10480, "state" : "OH" } +{ "_id" : "43907", "city" : "MOOREFIELD", "loc" : [ -80.996244, 40.264537 ], "pop" : 5925, "state" : "OH" } +{ "_id" : "43908", "city" : "BERGHOLZ", "loc" : [ -80.88615299999999, 40.47771 ], "pop" : 3392, "state" : "OH" } +{ "_id" : "43910", "city" : "BLOOMINGDALE", "loc" : [ -80.807214, 40.3742 ], "pop" : 3925, "state" : "OH" } +{ "_id" : "43912", "city" : "BRIDGEPORT", "loc" : [ -80.774682, 40.075184 ], "pop" : 7706, "state" : "OH" } +{ "_id" : "43913", "city" : "BRILLIANT", "loc" : [ -80.63194900000001, 40.268283 ], "pop" : 2057, "state" : "OH" } +{ "_id" : "43915", "city" : "CLARINGTON", "loc" : [ -80.911311, 39.781908 ], "pop" : 1890, "state" : "OH" } +{ "_id" : "43917", "city" : "DILLONVALE", "loc" : [ -80.802843, 40.212132 ], "pop" : 5972, "state" : "OH" } +{ "_id" : "43920", "city" : "CALCUTTA", "loc" : [ -80.578669, 40.645918 ], "pop" : 25993, "state" : "OH" } +{ "_id" : "43930", "city" : "HAMMONDSVILLE", "loc" : [ -80.729918, 40.579909 ], "pop" : 1060, "state" : "OH" } +{ "_id" : "43932", "city" : "IRONDALE", "loc" : [ -80.791546, 40.511052 ], "pop" : 496, "state" : "OH" } +{ "_id" : "43933", "city" : "ARMSTRONG MILLS", "loc" : [ -80.882181, 39.956304 ], "pop" : 1795, "state" : "OH" } +{ "_id" : "43935", "city" : "MARTINS FERRY", "loc" : [ -80.736125, 40.103597 ], "pop" : 10605, "state" : "OH" } +{ "_id" : "43938", "city" : "MINGO JUNCTION", "loc" : [ -80.625021, 40.320256 ], "pop" : 6388, "state" : "OH" } +{ "_id" : "43942", "city" : "POWHATAN POINT", "loc" : [ -80.8168, 39.867935 ], "pop" : 2694, "state" : "OH" } +{ "_id" : "43943", "city" : "RAYLAND", "loc" : [ -80.71253400000001, 40.208274 ], "pop" : 4623, "state" : "OH" } +{ "_id" : "43944", "city" : "RICHMOND", "loc" : [ -80.76128, 40.426061 ], "pop" : 2326, "state" : "OH" } +{ "_id" : "43945", "city" : "SALINEVILLE", "loc" : [ -80.83497699999999, 40.619525 ], "pop" : 3617, "state" : "OH" } +{ "_id" : "43946", "city" : "SARDIS", "loc" : [ -80.924308, 39.652639 ], "pop" : 2785, "state" : "OH" } +{ "_id" : "43947", "city" : "SHADYSIDE", "loc" : [ -80.764309, 39.967497 ], "pop" : 5918, "state" : "OH" } +{ "_id" : "43950", "city" : "SAINT CLAIRSVILL", "loc" : [ -80.90228500000001, 40.083439 ], "pop" : 14292, "state" : "OH" } +{ "_id" : "43952", "city" : "WINTERSVILLE", "loc" : [ -80.66115000000001, 40.370638 ], "pop" : 35873, "state" : "OH" } +{ "_id" : "43963", "city" : "TILTONSVILLE", "loc" : [ -80.699647, 40.168075 ], "pop" : 872, "state" : "OH" } +{ "_id" : "43964", "city" : "TORONTO", "loc" : [ -80.632504, 40.473298 ], "pop" : 11981, "state" : "OH" } +{ "_id" : "43968", "city" : "WELLSVILLE", "loc" : [ -80.66209499999999, 40.617099 ], "pop" : 8315, "state" : "OH" } +{ "_id" : "43971", "city" : "YORKVILLE", "loc" : [ -80.70773699999999, 40.158051 ], "pop" : 1213, "state" : "OH" } +{ "_id" : "43973", "city" : "FREEPORT", "loc" : [ -81.276955, 40.192502 ], "pop" : 1905, "state" : "OH" } +{ "_id" : "43976", "city" : "HOPEDALE", "loc" : [ -80.902136, 40.349647 ], "pop" : 1501, "state" : "OH" } +{ "_id" : "43977", "city" : "FLUSHING", "loc" : [ -81.07572999999999, 40.145144 ], "pop" : 2719, "state" : "OH" } +{ "_id" : "43983", "city" : "PIEDMONT", "loc" : [ -81.214494, 40.150716 ], "pop" : 420, "state" : "OH" } +{ "_id" : "43986", "city" : "JEWETT", "loc" : [ -81.000379, 40.37446 ], "pop" : 1998, "state" : "OH" } +{ "_id" : "43988", "city" : "SCIO", "loc" : [ -81.10157700000001, 40.40116 ], "pop" : 2640, "state" : "OH" } +{ "_id" : "44001", "city" : "SOUTH AMHERST", "loc" : [ -82.228165, 41.390506 ], "pop" : 18839, "state" : "OH" } +{ "_id" : "44003", "city" : "ANDOVER", "loc" : [ -80.575374, 41.622488 ], "pop" : 3491, "state" : "OH" } +{ "_id" : "44004", "city" : "ASHTABULA", "loc" : [ -80.794681, 41.867877 ], "pop" : 37480, "state" : "OH" } +{ "_id" : "44010", "city" : "AUSTINBURG", "loc" : [ -80.858422, 41.75536 ], "pop" : 1902, "state" : "OH" } +{ "_id" : "44011", "city" : "AVON", "loc" : [ -82.020359, 41.446713 ], "pop" : 7332, "state" : "OH" } +{ "_id" : "44012", "city" : "AVON LAKE", "loc" : [ -82.011094, 41.501904 ], "pop" : 15061, "state" : "OH" } +{ "_id" : "44017", "city" : "BEREA", "loc" : [ -81.861756, 41.367557 ], "pop" : 18561, "state" : "OH" } +{ "_id" : "44021", "city" : "BURTON", "loc" : [ -81.15262, 41.452702 ], "pop" : 6677, "state" : "OH" } +{ "_id" : "44022", "city" : "CHAGRIN FALLS", "loc" : [ -81.361437, 41.418577 ], "pop" : 29184, "state" : "OH" } +{ "_id" : "44024", "city" : "CHARDON", "loc" : [ -81.205629, 41.571862 ], "pop" : 20339, "state" : "OH" } +{ "_id" : "44026", "city" : "CHESTERLAND", "loc" : [ -81.342102, 41.534378 ], "pop" : 12510, "state" : "OH" } +{ "_id" : "44028", "city" : "COLUMBIA STATION", "loc" : [ -81.934398, 41.318708 ], "pop" : 8436, "state" : "OH" } +{ "_id" : "44030", "city" : "CONNEAUT", "loc" : [ -80.580257, 41.934479 ], "pop" : 16612, "state" : "OH" } +{ "_id" : "44032", "city" : "DORSET", "loc" : [ -80.668334, 41.658972 ], "pop" : 1536, "state" : "OH" } +{ "_id" : "44035", "city" : "ELYRIA", "loc" : [ -82.10508799999999, 41.372353 ], "pop" : 66674, "state" : "OH" } +{ "_id" : "44039", "city" : "NORTH RIDGEVILLE", "loc" : [ -82.00332299999999, 41.396432 ], "pop" : 21574, "state" : "OH" } +{ "_id" : "44040", "city" : "GATES MILLS", "loc" : [ -81.415021, 41.532368 ], "pop" : 2879, "state" : "OH" } +{ "_id" : "44041", "city" : "GENEVA", "loc" : [ -80.947363, 41.802864 ], "pop" : 14694, "state" : "OH" } +{ "_id" : "44044", "city" : "GRAFTON", "loc" : [ -82.043098, 41.28537 ], "pop" : 12127, "state" : "OH" } +{ "_id" : "44046", "city" : "HUNTSBURG", "loc" : [ -81.05718299999999, 41.530559 ], "pop" : 1804, "state" : "OH" } +{ "_id" : "44047", "city" : "JEFFERSON", "loc" : [ -80.75616599999999, 41.733513 ], "pop" : 8242, "state" : "OH" } +{ "_id" : "44048", "city" : "KINGSVILLE", "loc" : [ -80.66009200000001, 41.872311 ], "pop" : 2192, "state" : "OH" } +{ "_id" : "44050", "city" : "LAGRANGE", "loc" : [ -82.12791799999999, 41.242278 ], "pop" : 5092, "state" : "OH" } +{ "_id" : "44052", "city" : "LORAIN", "loc" : [ -82.17103899999999, 41.457796 ], "pop" : 35989, "state" : "OH" } +{ "_id" : "44053", "city" : "LORAIN", "loc" : [ -82.203833, 41.432002 ], "pop" : 16141, "state" : "OH" } +{ "_id" : "44054", "city" : "SHEFFIELD LAKE", "loc" : [ -82.096497, 41.482276 ], "pop" : 11685, "state" : "OH" } +{ "_id" : "44055", "city" : "LORAIN", "loc" : [ -82.134992, 41.436131 ], "pop" : 22919, "state" : "OH" } +{ "_id" : "44056", "city" : "MACEDONIA", "loc" : [ -81.499578, 41.322236 ], "pop" : 7470, "state" : "OH" } +{ "_id" : "44057", "city" : "MADISON", "loc" : [ -81.058819, 41.805367 ], "pop" : 18357, "state" : "OH" } +{ "_id" : "44060", "city" : "MENTOR", "loc" : [ -81.342133, 41.689468 ], "pop" : 60109, "state" : "OH" } +{ "_id" : "44062", "city" : "MIDDLEFIELD", "loc" : [ -81.03733800000001, 41.445547 ], "pop" : 11700, "state" : "OH" } +{ "_id" : "44064", "city" : "MONTVILLE", "loc" : [ -81.057036, 41.603446 ], "pop" : 1867, "state" : "OH" } +{ "_id" : "44065", "city" : "NEWBURY", "loc" : [ -81.23452, 41.475022 ], "pop" : 2907, "state" : "OH" } +{ "_id" : "44067", "city" : "NORTHFIELD", "loc" : [ -81.54294299999999, 41.320821 ], "pop" : 14014, "state" : "OH" } +{ "_id" : "44070", "city" : "NORTH OLMSTED", "loc" : [ -81.913056, 41.420129 ], "pop" : 34123, "state" : "OH" } +{ "_id" : "44072", "city" : "NOVELTY", "loc" : [ -81.334228, 41.476288 ], "pop" : 4736, "state" : "OH" } +{ "_id" : "44074", "city" : "OBERLIN", "loc" : [ -82.222863, 41.28987 ], "pop" : 11631, "state" : "OH" } +{ "_id" : "44076", "city" : "EAST ORWELL", "loc" : [ -80.839671, 41.533456 ], "pop" : 3814, "state" : "OH" } +{ "_id" : "44077", "city" : "FAIRPORT HARBOR", "loc" : [ -81.24366499999999, 41.714014 ], "pop" : 43783, "state" : "OH" } +{ "_id" : "44081", "city" : "PERRY", "loc" : [ -81.14331199999999, 41.767916 ], "pop" : 5571, "state" : "OH" } +{ "_id" : "44082", "city" : "PIERPONT", "loc" : [ -80.57411399999999, 41.767661 ], "pop" : 1460, "state" : "OH" } +{ "_id" : "44084", "city" : "ROAMING SHORES", "loc" : [ -80.88513399999999, 41.6651 ], "pop" : 2979, "state" : "OH" } +{ "_id" : "44085", "city" : "ROAMING SHORES", "loc" : [ -80.832075, 41.602629 ], "pop" : 1810, "state" : "OH" } +{ "_id" : "44086", "city" : "THOMPSON", "loc" : [ -81.057318, 41.676189 ], "pop" : 2668, "state" : "OH" } +{ "_id" : "44087", "city" : "TWINSBURG", "loc" : [ -81.455912, 41.328851 ], "pop" : 11274, "state" : "OH" } +{ "_id" : "44089", "city" : "VERMILION", "loc" : [ -82.355417, 41.409989 ], "pop" : 15058, "state" : "OH" } +{ "_id" : "44090", "city" : "WELLINGTON", "loc" : [ -82.22691500000001, 41.171178 ], "pop" : 9870, "state" : "OH" } +{ "_id" : "44092", "city" : "WICKLIFFE", "loc" : [ -81.46917500000001, 41.604565 ], "pop" : 18334, "state" : "OH" } +{ "_id" : "44093", "city" : "WILLIAMSFIELD", "loc" : [ -80.596378, 41.538296 ], "pop" : 1817, "state" : "OH" } +{ "_id" : "44094", "city" : "WILLOUGHBY", "loc" : [ -81.407619, 41.630229 ], "pop" : 30153, "state" : "OH" } +{ "_id" : "44095", "city" : "WILLOWICK", "loc" : [ -81.44788699999999, 41.649822 ], "pop" : 37473, "state" : "OH" } +{ "_id" : "44099", "city" : "WINDSOR", "loc" : [ -80.966745, 41.56233 ], "pop" : 2085, "state" : "OH" } +{ "_id" : "44102", "city" : "CLEVELAND", "loc" : [ -81.739791, 41.473508 ], "pop" : 53416, "state" : "OH" } +{ "_id" : "44103", "city" : "CLEVELAND", "loc" : [ -81.640475, 41.515726 ], "pop" : 28288, "state" : "OH" } +{ "_id" : "44104", "city" : "CLEVELAND", "loc" : [ -81.62450200000001, 41.480924 ], "pop" : 34766, "state" : "OH" } +{ "_id" : "44105", "city" : "CLEVELAND", "loc" : [ -81.61900199999999, 41.450912 ], "pop" : 56341, "state" : "OH" } +{ "_id" : "44106", "city" : "CLEVELAND", "loc" : [ -81.60757, 41.508359 ], "pop" : 35787, "state" : "OH" } +{ "_id" : "44107", "city" : "EDGEWATER", "loc" : [ -81.79714300000001, 41.482654 ], "pop" : 59702, "state" : "OH" } +{ "_id" : "44108", "city" : "CLEVELAND", "loc" : [ -81.608974, 41.53492 ], "pop" : 40401, "state" : "OH" } +{ "_id" : "44109", "city" : "CLEVELAND", "loc" : [ -81.703315, 41.445768 ], "pop" : 47515, "state" : "OH" } +{ "_id" : "44110", "city" : "CLEVELAND", "loc" : [ -81.57327600000001, 41.563557 ], "pop" : 26613, "state" : "OH" } +{ "_id" : "44111", "city" : "CLEVELAND", "loc" : [ -81.78435, 41.457066 ], "pop" : 43366, "state" : "OH" } +{ "_id" : "44112", "city" : "EAST CLEVELAND", "loc" : [ -81.576262, 41.535517 ], "pop" : 41340, "state" : "OH" } +{ "_id" : "44113", "city" : "CLEVELAND", "loc" : [ -81.701848, 41.481648 ], "pop" : 20211, "state" : "OH" } +{ "_id" : "44114", "city" : "CLEVELAND", "loc" : [ -81.67425, 41.506351 ], "pop" : 4673, "state" : "OH" } +{ "_id" : "44115", "city" : "CLEVELAND", "loc" : [ -81.66700899999999, 41.494574 ], "pop" : 7035, "state" : "OH" } +{ "_id" : "44116", "city" : "ROCKY RIVER", "loc" : [ -81.851246, 41.469401 ], "pop" : 20410, "state" : "OH" } +{ "_id" : "44117", "city" : "EUCLID", "loc" : [ -81.52568599999999, 41.569615 ], "pop" : 12371, "state" : "OH" } +{ "_id" : "44118", "city" : "CLEVELAND HEIGHT", "loc" : [ -81.553945, 41.501213 ], "pop" : 45619, "state" : "OH" } +{ "_id" : "44119", "city" : "CLEVELAND", "loc" : [ -81.54675899999999, 41.588238 ], "pop" : 13654, "state" : "OH" } +{ "_id" : "44120", "city" : "CLEVELAND", "loc" : [ -81.583911, 41.471433 ], "pop" : 49357, "state" : "OH" } +{ "_id" : "44121", "city" : "SOUTH EUCLID", "loc" : [ -81.53375800000001, 41.526019 ], "pop" : 37107, "state" : "OH" } +{ "_id" : "44122", "city" : "BEACHWOOD", "loc" : [ -81.523172, 41.470109 ], "pop" : 35115, "state" : "OH" } +{ "_id" : "44123", "city" : "SHORE", "loc" : [ -81.524325, 41.604416 ], "pop" : 18724, "state" : "OH" } +{ "_id" : "44124", "city" : "LYNDHURST MAYFIE", "loc" : [ -81.46801000000001, 41.514349 ], "pop" : 41699, "state" : "OH" } +{ "_id" : "44125", "city" : "GARFIELD HEIGHTS", "loc" : [ -81.605385, 41.415792 ], "pop" : 31020, "state" : "OH" } +{ "_id" : "44126", "city" : "FAIRVIEW PARK", "loc" : [ -81.856381, 41.4433 ], "pop" : 18145, "state" : "OH" } +{ "_id" : "44127", "city" : "CLEVELAND", "loc" : [ -81.648999, 41.470125 ], "pop" : 9046, "state" : "OH" } +{ "_id" : "44128", "city" : "CLEVELAND", "loc" : [ -81.548574, 41.441565 ], "pop" : 35258, "state" : "OH" } +{ "_id" : "44129", "city" : "PARMA", "loc" : [ -81.734604, 41.396474 ], "pop" : 30370, "state" : "OH" } +{ "_id" : "44130", "city" : "MIDPARK", "loc" : [ -81.77485799999999, 41.377178 ], "pop" : 52198, "state" : "OH" } +{ "_id" : "44131", "city" : "INDEPENDENCE", "loc" : [ -81.66421, 41.380905 ], "pop" : 20594, "state" : "OH" } +{ "_id" : "44132", "city" : "NOBLE", "loc" : [ -81.499056, 41.608516 ], "pop" : 16398, "state" : "OH" } +{ "_id" : "44133", "city" : "NORTH ROYALTON", "loc" : [ -81.74565699999999, 41.323164 ], "pop" : 23197, "state" : "OH" } +{ "_id" : "44134", "city" : "PARMA", "loc" : [ -81.705726, 41.390764 ], "pop" : 41397, "state" : "OH" } +{ "_id" : "44135", "city" : "CLEVELAND", "loc" : [ -81.804433, 41.434177 ], "pop" : 31032, "state" : "OH" } +{ "_id" : "44136", "city" : "STRONGSVILLE", "loc" : [ -81.828457, 41.313218 ], "pop" : 35308, "state" : "OH" } +{ "_id" : "44137", "city" : "MAPLE HEIGHTS", "loc" : [ -81.560339, 41.410513 ], "pop" : 26945, "state" : "OH" } +{ "_id" : "44138", "city" : "OLMSTED FALLS", "loc" : [ -81.915769, 41.373351 ], "pop" : 15722, "state" : "OH" } +{ "_id" : "44139", "city" : "SOLON", "loc" : [ -81.442082, 41.386597 ], "pop" : 18830, "state" : "OH" } +{ "_id" : "44140", "city" : "BAY VILLAGE", "loc" : [ -81.92886799999999, 41.484137 ], "pop" : 17000, "state" : "OH" } +{ "_id" : "44141", "city" : "BRECKSVILLE", "loc" : [ -81.62608299999999, 41.316554 ], "pop" : 12172, "state" : "OH" } +{ "_id" : "44142", "city" : "BROOKPARK", "loc" : [ -81.81181100000001, 41.397944 ], "pop" : 22865, "state" : "OH" } +{ "_id" : "44143", "city" : "RICHMOND HEIGHTS", "loc" : [ -81.48471499999999, 41.552195 ], "pop" : 21114, "state" : "OH" } +{ "_id" : "44144", "city" : "BROOKLYN", "loc" : [ -81.73522199999999, 41.434419 ], "pop" : 22288, "state" : "OH" } +{ "_id" : "44145", "city" : "WESTLAKE", "loc" : [ -81.92177100000001, 41.453459 ], "pop" : 27099, "state" : "OH" } +{ "_id" : "44146", "city" : "BEDFORD", "loc" : [ -81.52315, 41.392067 ], "pop" : 33014, "state" : "OH" } +{ "_id" : "44147", "city" : "BROADVIEW HEIGHT", "loc" : [ -81.680879, 41.32907 ], "pop" : 11951, "state" : "OH" } +{ "_id" : "44201", "city" : "ATWATER", "loc" : [ -81.19845599999999, 41.033487 ], "pop" : 7081, "state" : "OH" } +{ "_id" : "44202", "city" : "REMINDERVILLE", "loc" : [ -81.36042399999999, 41.320935 ], "pop" : 11547, "state" : "OH" } +{ "_id" : "44203", "city" : "NORTON", "loc" : [ -81.615314, 41.018589 ], "pop" : 42160, "state" : "OH" } +{ "_id" : "44212", "city" : "BRUNSWICK", "loc" : [ -81.827968, 41.247053 ], "pop" : 32435, "state" : "OH" } +{ "_id" : "44214", "city" : "BURBANK", "loc" : [ -81.99575299999999, 40.963725 ], "pop" : 1298, "state" : "OH" } +{ "_id" : "44215", "city" : "CHIPPEWA LAKE", "loc" : [ -81.909173, 41.06719 ], "pop" : 2714, "state" : "OH" } +{ "_id" : "44216", "city" : "CLINTON", "loc" : [ -81.587079, 40.939062 ], "pop" : 8830, "state" : "OH" } +{ "_id" : "44217", "city" : "CRESTON", "loc" : [ -81.921083, 40.978846 ], "pop" : 6602, "state" : "OH" } +{ "_id" : "44221", "city" : "CUYAHOGA FALLS", "loc" : [ -81.478961, 41.140082 ], "pop" : 32009, "state" : "OH" } +{ "_id" : "44223", "city" : "CUYAHOGA FALLS", "loc" : [ -81.51071899999999, 41.146448 ], "pop" : 14757, "state" : "OH" } +{ "_id" : "44224", "city" : "STOW", "loc" : [ -81.438017, 41.174808 ], "pop" : 31912, "state" : "OH" } +{ "_id" : "44230", "city" : "DOYLESTOWN", "loc" : [ -81.684845, 40.965042 ], "pop" : 7451, "state" : "OH" } +{ "_id" : "44231", "city" : "GARRETTSVILLE", "loc" : [ -81.070365, 41.298803 ], "pop" : 7352, "state" : "OH" } +{ "_id" : "44233", "city" : "HINCKLEY", "loc" : [ -81.74527, 41.241872 ], "pop" : 5845, "state" : "OH" } +{ "_id" : "44234", "city" : "HIRAM", "loc" : [ -81.14644, 41.332253 ], "pop" : 3775, "state" : "OH" } +{ "_id" : "44235", "city" : "HOMERVILLE", "loc" : [ -82.12495699999999, 41.02669 ], "pop" : 1196, "state" : "OH" } +{ "_id" : "44236", "city" : "HUDSON", "loc" : [ -81.43665900000001, 41.245836 ], "pop" : 18695, "state" : "OH" } +{ "_id" : "44240", "city" : "KENT", "loc" : [ -81.34976, 41.14492 ], "pop" : 43071, "state" : "OH" } +{ "_id" : "44241", "city" : "STREETSBORO", "loc" : [ -81.33829799999999, 41.249099 ], "pop" : 10735, "state" : "OH" } +{ "_id" : "44253", "city" : "LITCHFIELD", "loc" : [ -82.015674, 41.166847 ], "pop" : 2506, "state" : "OH" } +{ "_id" : "44254", "city" : "LODI", "loc" : [ -82.014661, 41.032713 ], "pop" : 4776, "state" : "OH" } +{ "_id" : "44255", "city" : "MANTUA", "loc" : [ -81.22825899999999, 41.294141 ], "pop" : 7324, "state" : "OH" } +{ "_id" : "44256", "city" : "MEDINA", "loc" : [ -81.858351, 41.140415 ], "pop" : 35686, "state" : "OH" } +{ "_id" : "44260", "city" : "MOGADORE", "loc" : [ -81.358963, 41.038196 ], "pop" : 12947, "state" : "OH" } +{ "_id" : "44262", "city" : "MUNROE FALLS", "loc" : [ -81.43756500000001, 41.14202 ], "pop" : 5375, "state" : "OH" } +{ "_id" : "44264", "city" : "PENINSULA", "loc" : [ -81.540013, 41.225579 ], "pop" : 1886, "state" : "OH" } +{ "_id" : "44266", "city" : "RAVENNA", "loc" : [ -81.233656, 41.164886 ], "pop" : 31700, "state" : "OH" } +{ "_id" : "44270", "city" : "RITTMAN", "loc" : [ -81.782599, 40.968381 ], "pop" : 8270, "state" : "OH" } +{ "_id" : "44272", "city" : "ROOTSTOWN", "loc" : [ -81.202642, 41.099534 ], "pop" : 3556, "state" : "OH" } +{ "_id" : "44273", "city" : "SEVILLE", "loc" : [ -81.856199, 41.022731 ], "pop" : 3611, "state" : "OH" } +{ "_id" : "44275", "city" : "SPENCER", "loc" : [ -82.099907, 41.098287 ], "pop" : 2595, "state" : "OH" } +{ "_id" : "44276", "city" : "STERLING", "loc" : [ -81.85191399999999, 40.953263 ], "pop" : 1838, "state" : "OH" } +{ "_id" : "44278", "city" : "TALLMADGE", "loc" : [ -81.425966, 41.097492 ], "pop" : 15402, "state" : "OH" } +{ "_id" : "44280", "city" : "VALLEY CITY", "loc" : [ -81.92446700000001, 41.236806 ], "pop" : 3711, "state" : "OH" } +{ "_id" : "44281", "city" : "WADSWORTH", "loc" : [ -81.73737300000001, 41.038375 ], "pop" : 24707, "state" : "OH" } +{ "_id" : "44286", "city" : "RICHFIELD", "loc" : [ -81.64666800000001, 41.23712 ], "pop" : 4724, "state" : "OH" } +{ "_id" : "44287", "city" : "WEST SALEM", "loc" : [ -82.106638, 40.948514 ], "pop" : 5351, "state" : "OH" } +{ "_id" : "44288", "city" : "WINDHAM", "loc" : [ -81.053451, 41.239244 ], "pop" : 4561, "state" : "OH" } +{ "_id" : "44301", "city" : "AKRON", "loc" : [ -81.520048, 41.044852 ], "pop" : 18356, "state" : "OH" } +{ "_id" : "44302", "city" : "AKRON", "loc" : [ -81.54201500000001, 41.091988 ], "pop" : 6835, "state" : "OH" } +{ "_id" : "44303", "city" : "AKRON", "loc" : [ -81.53860899999999, 41.102508 ], "pop" : 8658, "state" : "OH" } +{ "_id" : "44304", "city" : "AKRON", "loc" : [ -81.508526, 41.080808 ], "pop" : 9521, "state" : "OH" } +{ "_id" : "44305", "city" : "AKRON", "loc" : [ -81.464409, 41.076029 ], "pop" : 25788, "state" : "OH" } +{ "_id" : "44306", "city" : "AKRON", "loc" : [ -81.49155399999999, 41.04791 ], "pop" : 25758, "state" : "OH" } +{ "_id" : "44307", "city" : "AKRON", "loc" : [ -81.54878600000001, 41.069465 ], "pop" : 9945, "state" : "OH" } +{ "_id" : "44308", "city" : "AKRON", "loc" : [ -81.519363, 41.079576 ], "pop" : 1113, "state" : "OH" } +{ "_id" : "44310", "city" : "AKRON", "loc" : [ -81.500586, 41.107547 ], "pop" : 25482, "state" : "OH" } +{ "_id" : "44311", "city" : "AKRON", "loc" : [ -81.520005, 41.063784 ], "pop" : 9040, "state" : "OH" } +{ "_id" : "44312", "city" : "AKRON", "loc" : [ -81.43852800000001, 41.033442 ], "pop" : 32097, "state" : "OH" } +{ "_id" : "44313", "city" : "AKRON", "loc" : [ -81.568487, 41.121995 ], "pop" : 23501, "state" : "OH" } +{ "_id" : "44314", "city" : "AKRON", "loc" : [ -81.559825, 41.040774 ], "pop" : 21289, "state" : "OH" } +{ "_id" : "44319", "city" : "AKRON", "loc" : [ -81.53467999999999, 40.97912 ], "pop" : 21902, "state" : "OH" } +{ "_id" : "44320", "city" : "AKRON", "loc" : [ -81.56744, 41.083496 ], "pop" : 25910, "state" : "OH" } +{ "_id" : "44321", "city" : "COPLEY", "loc" : [ -81.648045, 41.103139 ], "pop" : 8756, "state" : "OH" } +{ "_id" : "44333", "city" : "FAIRLAWN", "loc" : [ -81.62385, 41.146734 ], "pop" : 15383, "state" : "OH" } +{ "_id" : "44401", "city" : "BERLIN CENTER", "loc" : [ -80.934104, 41.024319 ], "pop" : 2771, "state" : "OH" } +{ "_id" : "44402", "city" : "BRISTOLVILLE", "loc" : [ -80.85683899999999, 41.379749 ], "pop" : 3220, "state" : "OH" } +{ "_id" : "44403", "city" : "BROOKFIELD", "loc" : [ -80.578767, 41.247957 ], "pop" : 5819, "state" : "OH" } +{ "_id" : "44404", "city" : "BURGHILL", "loc" : [ -80.54406, 41.334688 ], "pop" : 802, "state" : "OH" } +{ "_id" : "44405", "city" : "CAMPBELL", "loc" : [ -80.589721, 41.077829 ], "pop" : 10027, "state" : "OH" } +{ "_id" : "44406", "city" : "CANFIELD", "loc" : [ -80.75643599999999, 41.029328 ], "pop" : 16683, "state" : "OH" } +{ "_id" : "44408", "city" : "COLUMBIANA", "loc" : [ -80.697473, 40.885279 ], "pop" : 9868, "state" : "OH" } +{ "_id" : "44410", "city" : "CORTLAND", "loc" : [ -80.73274499999999, 41.325125 ], "pop" : 15687, "state" : "OH" } +{ "_id" : "44411", "city" : "DEERFIELD", "loc" : [ -81.05282699999999, 41.03586 ], "pop" : 2323, "state" : "OH" } +{ "_id" : "44412", "city" : "DIAMOND", "loc" : [ -81.0425, 41.093473 ], "pop" : 1854, "state" : "OH" } +{ "_id" : "44413", "city" : "EAST PALESTINE", "loc" : [ -80.546513, 40.840554 ], "pop" : 7493, "state" : "OH" } +{ "_id" : "44417", "city" : "FARMDALE", "loc" : [ -80.662818, 41.392301 ], "pop" : 1781, "state" : "OH" } +{ "_id" : "44418", "city" : "FOWLER", "loc" : [ -80.60589400000001, 41.334851 ], "pop" : 1692, "state" : "OH" } +{ "_id" : "44420", "city" : "GIRARD", "loc" : [ -80.693305, 41.161136 ], "pop" : 16480, "state" : "OH" } +{ "_id" : "44423", "city" : "HANOVERTON", "loc" : [ -80.914445, 40.773116 ], "pop" : 2461, "state" : "OH" } +{ "_id" : "44425", "city" : "HUBBARD", "loc" : [ -80.57619200000001, 41.162401 ], "pop" : 15616, "state" : "OH" } +{ "_id" : "44427", "city" : "KENSINGTON", "loc" : [ -80.938079, 40.71418 ], "pop" : 1463, "state" : "OH" } +{ "_id" : "44428", "city" : "KINSMAN", "loc" : [ -80.57650599999999, 41.435442 ], "pop" : 3397, "state" : "OH" } +{ "_id" : "44429", "city" : "LAKE MILTON", "loc" : [ -80.97235000000001, 41.101354 ], "pop" : 3984, "state" : "OH" } +{ "_id" : "44430", "city" : "LEAVITTSBURG", "loc" : [ -80.886922, 41.244498 ], "pop" : 4368, "state" : "OH" } +{ "_id" : "44431", "city" : "LEETONIA", "loc" : [ -80.758453, 40.863077 ], "pop" : 4281, "state" : "OH" } +{ "_id" : "44432", "city" : "LISBON", "loc" : [ -80.758674, 40.759154 ], "pop" : 11236, "state" : "OH" } +{ "_id" : "44436", "city" : "LOWELLVILLE", "loc" : [ -80.541551, 41.050256 ], "pop" : 3882, "state" : "OH" } +{ "_id" : "44437", "city" : "MC DONALD", "loc" : [ -80.73116899999999, 41.158026 ], "pop" : 4868, "state" : "OH" } +{ "_id" : "44438", "city" : "MASURY", "loc" : [ -80.53256500000001, 41.22552 ], "pop" : 5864, "state" : "OH" } +{ "_id" : "44440", "city" : "MINERAL RIDGE", "loc" : [ -80.75529299999999, 41.131843 ], "pop" : 921, "state" : "OH" } +{ "_id" : "44441", "city" : "NEGLEY", "loc" : [ -80.564497, 40.774601 ], "pop" : 2222, "state" : "OH" } +{ "_id" : "44442", "city" : "NEW MIDDLETOWN", "loc" : [ -80.553415, 40.964607 ], "pop" : 3396, "state" : "OH" } +{ "_id" : "44443", "city" : "NEW SPRINGFIELD", "loc" : [ -80.58558499999999, 40.926517 ], "pop" : 2547, "state" : "OH" } +{ "_id" : "44444", "city" : "NEWTON FALLS", "loc" : [ -80.970135, 41.191047 ], "pop" : 11623, "state" : "OH" } +{ "_id" : "44445", "city" : "NEW WATERFORD", "loc" : [ -80.62085500000001, 40.848941 ], "pop" : 3141, "state" : "OH" } +{ "_id" : "44446", "city" : "NILES", "loc" : [ -80.755775, 41.182414 ], "pop" : 27450, "state" : "OH" } +{ "_id" : "44449", "city" : "NORTH BENTON", "loc" : [ -81.01616799999999, 40.987579 ], "pop" : 892, "state" : "OH" } +{ "_id" : "44450", "city" : "NORTH BLOOMFIELD", "loc" : [ -80.80683500000001, 41.456887 ], "pop" : 3393, "state" : "OH" } +{ "_id" : "44451", "city" : "NORTH JACKSON", "loc" : [ -80.86225, 41.088044 ], "pop" : 2448, "state" : "OH" } +{ "_id" : "44452", "city" : "NORTH LIMA", "loc" : [ -80.654911, 40.964866 ], "pop" : 2657, "state" : "OH" } +{ "_id" : "44454", "city" : "PETERSBURG", "loc" : [ -80.540031, 40.904861 ], "pop" : 650, "state" : "OH" } +{ "_id" : "44455", "city" : "ROGERS", "loc" : [ -80.620237, 40.778943 ], "pop" : 1418, "state" : "OH" } +{ "_id" : "44460", "city" : "SALEM", "loc" : [ -80.86188300000001, 40.900024 ], "pop" : 26756, "state" : "OH" } +{ "_id" : "44470", "city" : "SOUTHINGTON", "loc" : [ -80.948474, 41.298312 ], "pop" : 3019, "state" : "OH" } +{ "_id" : "44471", "city" : "STRUTHERS", "loc" : [ -80.59848700000001, 41.050847 ], "pop" : 12318, "state" : "OH" } +{ "_id" : "44473", "city" : "VIENNA", "loc" : [ -80.65499800000001, 41.217478 ], "pop" : 5638, "state" : "OH" } +{ "_id" : "44481", "city" : "WARREN", "loc" : [ -80.87180600000001, 41.172426 ], "pop" : 5407, "state" : "OH" } +{ "_id" : "44483", "city" : "WARREN", "loc" : [ -80.81644799999999, 41.263878 ], "pop" : 30257, "state" : "OH" } +{ "_id" : "44484", "city" : "WARREN", "loc" : [ -80.76424299999999, 41.231819 ], "pop" : 25898, "state" : "OH" } +{ "_id" : "44485", "city" : "WARREN", "loc" : [ -80.84413600000001, 41.240511 ], "pop" : 24847, "state" : "OH" } +{ "_id" : "44490", "city" : "WASHINGTONVILLE", "loc" : [ -80.763137, 40.897331 ], "pop" : 482, "state" : "OH" } +{ "_id" : "44491", "city" : "WEST FARMINGTON", "loc" : [ -80.96724500000001, 41.350849 ], "pop" : 768, "state" : "OH" } +{ "_id" : "44502", "city" : "YOUNGSTOWN", "loc" : [ -80.640905, 41.077366 ], "pop" : 13671, "state" : "OH" } +{ "_id" : "44503", "city" : "YOUNGSTOWN", "loc" : [ -80.650007, 41.102016 ], "pop" : 1315, "state" : "OH" } +{ "_id" : "44504", "city" : "YOUNGSTOWN", "loc" : [ -80.653887, 41.123686 ], "pop" : 5845, "state" : "OH" } +{ "_id" : "44505", "city" : "YOUNGSTOWN", "loc" : [ -80.627748, 41.125748 ], "pop" : 25106, "state" : "OH" } +{ "_id" : "44506", "city" : "YOUNGSTOWN", "loc" : [ -80.625916, 41.096045 ], "pop" : 5619, "state" : "OH" } +{ "_id" : "44507", "city" : "YOUNGSTOWN", "loc" : [ -80.65533600000001, 41.073236 ], "pop" : 10501, "state" : "OH" } +{ "_id" : "44509", "city" : "YOUNGSTOWN", "loc" : [ -80.694463, 41.10498 ], "pop" : 14399, "state" : "OH" } +{ "_id" : "44510", "city" : "YOUNGSTOWN", "loc" : [ -80.667204, 41.119714 ], "pop" : 4513, "state" : "OH" } +{ "_id" : "44511", "city" : "YOUNGSTOWN", "loc" : [ -80.69309800000001, 41.070402 ], "pop" : 27278, "state" : "OH" } +{ "_id" : "44512", "city" : "BOARDMAN", "loc" : [ -80.666629, 41.031985 ], "pop" : 35628, "state" : "OH" } +{ "_id" : "44514", "city" : "POLAND", "loc" : [ -80.610254, 41.023258 ], "pop" : 21694, "state" : "OH" } +{ "_id" : "44515", "city" : "AUSTINTOWN", "loc" : [ -80.743966, 41.093903 ], "pop" : 27130, "state" : "OH" } +{ "_id" : "44601", "city" : "ALLIANCE", "loc" : [ -81.11819300000001, 40.915842 ], "pop" : 35230, "state" : "OH" } +{ "_id" : "44606", "city" : "APPLE CREEK", "loc" : [ -81.809256, 40.755118 ], "pop" : 7286, "state" : "OH" } +{ "_id" : "44608", "city" : "BEACH CITY", "loc" : [ -81.58512899999999, 40.656199 ], "pop" : 2321, "state" : "OH" } +{ "_id" : "44609", "city" : "BELOIT", "loc" : [ -80.98966900000001, 40.895678 ], "pop" : 3205, "state" : "OH" } +{ "_id" : "44611", "city" : "BIG PRAIRIE", "loc" : [ -82.072048, 40.618777 ], "pop" : 1956, "state" : "OH" } +{ "_id" : "44612", "city" : "BOLIVAR", "loc" : [ -81.44635599999999, 40.634692 ], "pop" : 4225, "state" : "OH" } +{ "_id" : "44613", "city" : "BREWSTER", "loc" : [ -81.598752, 40.714387 ], "pop" : 2129, "state" : "OH" } +{ "_id" : "44614", "city" : "CANAL FULTON", "loc" : [ -81.577269, 40.88871 ], "pop" : 10310, "state" : "OH" } +{ "_id" : "44615", "city" : "CARROLLTON", "loc" : [ -81.081789, 40.578663 ], "pop" : 10052, "state" : "OH" } +{ "_id" : "44618", "city" : "DALTON", "loc" : [ -81.70077999999999, 40.779326 ], "pop" : 6069, "state" : "OH" } +{ "_id" : "44620", "city" : "DELLROY", "loc" : [ -81.19856, 40.586143 ], "pop" : 1844, "state" : "OH" } +{ "_id" : "44621", "city" : "DENNISON", "loc" : [ -81.320301, 40.408885 ], "pop" : 4573, "state" : "OH" } +{ "_id" : "44622", "city" : "DOVER", "loc" : [ -81.476321, 40.534338 ], "pop" : 17042, "state" : "OH" } +{ "_id" : "44624", "city" : "DUNDEE", "loc" : [ -81.676519, 40.639441 ], "pop" : 3871, "state" : "OH" } +{ "_id" : "44625", "city" : "EAST ROCHESTER", "loc" : [ -81.01749, 40.756288 ], "pop" : 1531, "state" : "OH" } +{ "_id" : "44626", "city" : "EAST SPARTA", "loc" : [ -81.368728, 40.697065 ], "pop" : 2908, "state" : "OH" } +{ "_id" : "44627", "city" : "FREDERICKSBURG", "loc" : [ -81.851812, 40.685953 ], "pop" : 3336, "state" : "OH" } +{ "_id" : "44628", "city" : "GLENMONT", "loc" : [ -82.150538, 40.521682 ], "pop" : 1908, "state" : "OH" } +{ "_id" : "44629", "city" : "GNADENHUTTEN", "loc" : [ -81.40585799999999, 40.372123 ], "pop" : 5892, "state" : "OH" } +{ "_id" : "44632", "city" : "HARTVILLE", "loc" : [ -81.32387300000001, 40.961798 ], "pop" : 8318, "state" : "OH" } +{ "_id" : "44633", "city" : "HOLMESVILLE", "loc" : [ -81.927476, 40.633042 ], "pop" : 2145, "state" : "OH" } +{ "_id" : "44634", "city" : "HOMEWORTH", "loc" : [ -81.065473, 40.859192 ], "pop" : 3400, "state" : "OH" } +{ "_id" : "44637", "city" : "KILLBUCK", "loc" : [ -81.983721, 40.4933 ], "pop" : 1868, "state" : "OH" } +{ "_id" : "44638", "city" : "LAKEVILLE", "loc" : [ -82.145477, 40.651965 ], "pop" : 1516, "state" : "OH" } +{ "_id" : "44641", "city" : "LOUISVILLE", "loc" : [ -81.25946399999999, 40.847729 ], "pop" : 18994, "state" : "OH" } +{ "_id" : "44643", "city" : "MAGNOLIA", "loc" : [ -81.307607, 40.651414 ], "pop" : 2166, "state" : "OH" } +{ "_id" : "44644", "city" : "MALVERN", "loc" : [ -81.18378, 40.684532 ], "pop" : 4761, "state" : "OH" } +{ "_id" : "44645", "city" : "MARSHALLVILLE", "loc" : [ -81.722527, 40.906677 ], "pop" : 1838, "state" : "OH" } +{ "_id" : "44646", "city" : "MASSILLON", "loc" : [ -81.497263, 40.811605 ], "pop" : 45092, "state" : "OH" } +{ "_id" : "44647", "city" : "MASSILLON", "loc" : [ -81.553252, 40.795918 ], "pop" : 17715, "state" : "OH" } +{ "_id" : "44651", "city" : "MECHANICSTOWN", "loc" : [ -80.956025, 40.626279 ], "pop" : 709, "state" : "OH" } +{ "_id" : "44654", "city" : "MILLERSBURG", "loc" : [ -81.83238299999999, 40.556683 ], "pop" : 20350, "state" : "OH" } +{ "_id" : "44656", "city" : "ZOARVILLE", "loc" : [ -81.354561, 40.625686 ], "pop" : 2969, "state" : "OH" } +{ "_id" : "44657", "city" : "MINERVA", "loc" : [ -81.103076, 40.742049 ], "pop" : 10547, "state" : "OH" } +{ "_id" : "44662", "city" : "NAVARRE", "loc" : [ -81.533824, 40.720405 ], "pop" : 10006, "state" : "OH" } +{ "_id" : "44663", "city" : "NEW PHILADELPHIA", "loc" : [ -81.435827, 40.484539 ], "pop" : 24640, "state" : "OH" } +{ "_id" : "44666", "city" : "NORTH LAWRENCE", "loc" : [ -81.629946, 40.838652 ], "pop" : 2528, "state" : "OH" } +{ "_id" : "44667", "city" : "ORRVILLE", "loc" : [ -81.774109, 40.845836 ], "pop" : 11983, "state" : "OH" } +{ "_id" : "44669", "city" : "PARIS", "loc" : [ -81.15398999999999, 40.801413 ], "pop" : 1338, "state" : "OH" } +{ "_id" : "44672", "city" : "SEBRING", "loc" : [ -81.023191, 40.922694 ], "pop" : 6276, "state" : "OH" } +{ "_id" : "44675", "city" : "SHERRODSVILLE", "loc" : [ -81.23394500000001, 40.518418 ], "pop" : 1330, "state" : "OH" } +{ "_id" : "44676", "city" : "SHREVE", "loc" : [ -82.03245099999999, 40.692584 ], "pop" : 4312, "state" : "OH" } +{ "_id" : "44677", "city" : "SMITHVILLE", "loc" : [ -81.863328, 40.859228 ], "pop" : 2695, "state" : "OH" } +{ "_id" : "44680", "city" : "STRASBURG", "loc" : [ -81.536646, 40.60028 ], "pop" : 3201, "state" : "OH" } +{ "_id" : "44681", "city" : "SUGARCREEK", "loc" : [ -81.66035599999999, 40.514785 ], "pop" : 4772, "state" : "OH" } +{ "_id" : "44683", "city" : "UHRICHSVILLE", "loc" : [ -81.33736500000001, 40.390502 ], "pop" : 6925, "state" : "OH" } +{ "_id" : "44685", "city" : "UNIONTOWN", "loc" : [ -81.421108, 40.963694 ], "pop" : 21009, "state" : "OH" } +{ "_id" : "44688", "city" : "WAYNESBURG", "loc" : [ -81.265891, 40.682881 ], "pop" : 3149, "state" : "OH" } +{ "_id" : "44689", "city" : "WILMOT", "loc" : [ -81.63524700000001, 40.656723 ], "pop" : 286, "state" : "OH" } +{ "_id" : "44691", "city" : "WOOSTER", "loc" : [ -81.948272, 40.809354 ], "pop" : 35504, "state" : "OH" } +{ "_id" : "44695", "city" : "BOWERSTON", "loc" : [ -81.18624, 40.437056 ], "pop" : 1484, "state" : "OH" } +{ "_id" : "44699", "city" : "TIPPECANOE", "loc" : [ -81.291937, 40.279748 ], "pop" : 1184, "state" : "OH" } +{ "_id" : "44702", "city" : "CANTON", "loc" : [ -81.373946, 40.80267 ], "pop" : 1208, "state" : "OH" } +{ "_id" : "44703", "city" : "CANTON", "loc" : [ -81.381439, 40.809791 ], "pop" : 11520, "state" : "OH" } +{ "_id" : "44704", "city" : "CANTON", "loc" : [ -81.353701, 40.799076 ], "pop" : 5408, "state" : "OH" } +{ "_id" : "44705", "city" : "CANTON", "loc" : [ -81.33990300000001, 40.825866 ], "pop" : 21271, "state" : "OH" } +{ "_id" : "44706", "city" : "CANTON", "loc" : [ -81.411903, 40.767959 ], "pop" : 19443, "state" : "OH" } +{ "_id" : "44707", "city" : "NORTH INDUSTRY", "loc" : [ -81.360407, 40.776885 ], "pop" : 11010, "state" : "OH" } +{ "_id" : "44708", "city" : "CANTON", "loc" : [ -81.424116, 40.81196 ], "pop" : 25891, "state" : "OH" } +{ "_id" : "44709", "city" : "NORTH CANTON", "loc" : [ -81.385947, 40.837227 ], "pop" : 19371, "state" : "OH" } +{ "_id" : "44710", "city" : "CANTON", "loc" : [ -81.416946, 40.791107 ], "pop" : 9928, "state" : "OH" } +{ "_id" : "44714", "city" : "CANTON", "loc" : [ -81.360963, 40.827174 ], "pop" : 8988, "state" : "OH" } +{ "_id" : "44718", "city" : "JACKSON BELDEN", "loc" : [ -81.448514, 40.85479 ], "pop" : 10407, "state" : "OH" } +{ "_id" : "44720", "city" : "NORTH CANTON", "loc" : [ -81.413464, 40.889919 ], "pop" : 33193, "state" : "OH" } +{ "_id" : "44721", "city" : "CANTON", "loc" : [ -81.33279, 40.883446 ], "pop" : 10254, "state" : "OH" } +{ "_id" : "44730", "city" : "EAST CANTON", "loc" : [ -81.278295, 40.784983 ], "pop" : 6154, "state" : "OH" } +{ "_id" : "44802", "city" : "ALVADA", "loc" : [ -83.376982, 41.046284 ], "pop" : 1955, "state" : "OH" } +{ "_id" : "44804", "city" : "ARCADIA", "loc" : [ -83.50194999999999, 41.111562 ], "pop" : 1142, "state" : "OH" } +{ "_id" : "44805", "city" : "ASHLAND", "loc" : [ -82.31893100000001, 40.855892 ], "pop" : 27072, "state" : "OH" } +{ "_id" : "44807", "city" : "CARROTHERS", "loc" : [ -82.88972099999999, 41.077755 ], "pop" : 2792, "state" : "OH" } +{ "_id" : "44811", "city" : "BELLEVUE", "loc" : [ -82.85765000000001, 41.268432 ], "pop" : 14361, "state" : "OH" } +{ "_id" : "44813", "city" : "BELLVILLE", "loc" : [ -82.517516, 40.613604 ], "pop" : 6432, "state" : "OH" } +{ "_id" : "44814", "city" : "BERLIN HEIGHTS", "loc" : [ -82.47771299999999, 41.320519 ], "pop" : 2485, "state" : "OH" } +{ "_id" : "44817", "city" : "BLOOMDALE", "loc" : [ -83.572356, 41.181489 ], "pop" : 1331, "state" : "OH" } +{ "_id" : "44818", "city" : "BLOOMVILLE", "loc" : [ -82.989874, 41.018206 ], "pop" : 2572, "state" : "OH" } +{ "_id" : "44820", "city" : "BUCYRUS", "loc" : [ -82.969829, 40.810306 ], "pop" : 19018, "state" : "OH" } +{ "_id" : "44822", "city" : "BUTLER", "loc" : [ -82.398984, 40.543754 ], "pop" : 3870, "state" : "OH" } +{ "_id" : "44824", "city" : "CASTALIA", "loc" : [ -82.799426, 41.387229 ], "pop" : 4027, "state" : "OH" } +{ "_id" : "44825", "city" : "CHATFIELD", "loc" : [ -83.021432, 40.956637 ], "pop" : 514, "state" : "OH" } +{ "_id" : "44826", "city" : "COLLINS", "loc" : [ -82.490402, 41.245023 ], "pop" : 1934, "state" : "OH" } +{ "_id" : "44827", "city" : "CRESTLINE", "loc" : [ -82.736723, 40.792714 ], "pop" : 6723, "state" : "OH" } +{ "_id" : "44830", "city" : "FOSTORIA", "loc" : [ -83.413938, 41.162346 ], "pop" : 20686, "state" : "OH" } +{ "_id" : "44833", "city" : "GALION", "loc" : [ -82.793943, 40.730316 ], "pop" : 19069, "state" : "OH" } +{ "_id" : "44836", "city" : "GREEN SPRINGS", "loc" : [ -83.088549, 41.228111 ], "pop" : 3752, "state" : "OH" } +{ "_id" : "44837", "city" : "GREENWICH", "loc" : [ -82.51334, 41.04068 ], "pop" : 3054, "state" : "OH" } +{ "_id" : "44839", "city" : "SHINROCK", "loc" : [ -82.555491, 41.390662 ], "pop" : 10386, "state" : "OH" } +{ "_id" : "44840", "city" : "JEROMESVILLE", "loc" : [ -82.186134, 40.813366 ], "pop" : 4052, "state" : "OH" } +{ "_id" : "44841", "city" : "KANSAS", "loc" : [ -83.329829, 41.212543 ], "pop" : 893, "state" : "OH" } +{ "_id" : "44842", "city" : "LOUDONVILLE", "loc" : [ -82.23559, 40.636059 ], "pop" : 4767, "state" : "OH" } +{ "_id" : "44843", "city" : "LUCAS", "loc" : [ -82.408671, 40.70389 ], "pop" : 2127, "state" : "OH" } +{ "_id" : "44844", "city" : "MC CUTCHENVILLE", "loc" : [ -83.26366899999999, 40.975225 ], "pop" : 515, "state" : "OH" } +{ "_id" : "44845", "city" : "MELMORE", "loc" : [ -83.143238, 41.038954 ], "pop" : 1611, "state" : "OH" } +{ "_id" : "44846", "city" : "MILAN", "loc" : [ -82.612565, 41.311065 ], "pop" : 3568, "state" : "OH" } +{ "_id" : "44847", "city" : "MONROEVILLE", "loc" : [ -82.70233, 41.218074 ], "pop" : 2721, "state" : "OH" } +{ "_id" : "44849", "city" : "NEVADA", "loc" : [ -83.12656699999999, 40.825946 ], "pop" : 2464, "state" : "OH" } +{ "_id" : "44851", "city" : "NEW LONDON", "loc" : [ -82.39658799999999, 41.090575 ], "pop" : 4243, "state" : "OH" } +{ "_id" : "44853", "city" : "NEW RIEGEL", "loc" : [ -83.24180699999999, 41.036058 ], "pop" : 1483, "state" : "OH" } +{ "_id" : "44854", "city" : "NEW WASHINGTON", "loc" : [ -82.850359, 40.957076 ], "pop" : 1679, "state" : "OH" } +{ "_id" : "44855", "city" : "NORTH FAIRFIELD", "loc" : [ -82.599801, 41.102987 ], "pop" : 1229, "state" : "OH" } +{ "_id" : "44857", "city" : "NORWALK", "loc" : [ -82.60785, 41.240314 ], "pop" : 21687, "state" : "OH" } +{ "_id" : "44859", "city" : "NOVA", "loc" : [ -82.33843899999999, 41.028215 ], "pop" : 1565, "state" : "OH" } +{ "_id" : "44864", "city" : "PERRYSVILLE", "loc" : [ -82.321307, 40.660626 ], "pop" : 2818, "state" : "OH" } +{ "_id" : "44865", "city" : "PLYMOUTH", "loc" : [ -82.66349200000001, 41.00031 ], "pop" : 4122, "state" : "OH" } +{ "_id" : "44866", "city" : "POLK", "loc" : [ -82.212587, 40.934293 ], "pop" : 2293, "state" : "OH" } +{ "_id" : "44867", "city" : "REPUBLIC", "loc" : [ -83.019407, 41.125876 ], "pop" : 1735, "state" : "OH" } +{ "_id" : "44870", "city" : "SANDUSKY", "loc" : [ -82.70632999999999, 41.434878 ], "pop" : 44129, "state" : "OH" } +{ "_id" : "44874", "city" : "SAVANNAH", "loc" : [ -82.344272, 40.945382 ], "pop" : 2983, "state" : "OH" } +{ "_id" : "44875", "city" : "SHELBY", "loc" : [ -82.654949, 40.878432 ], "pop" : 14736, "state" : "OH" } +{ "_id" : "44878", "city" : "SHILOH", "loc" : [ -82.522155, 40.934015 ], "pop" : 4297, "state" : "OH" } +{ "_id" : "44880", "city" : "SULLIVAN", "loc" : [ -82.21721700000001, 41.036818 ], "pop" : 1772, "state" : "OH" } +{ "_id" : "44882", "city" : "SYCAMORE", "loc" : [ -83.149176, 40.941299 ], "pop" : 2610, "state" : "OH" } +{ "_id" : "44883", "city" : "TIFFIN", "loc" : [ -83.18435599999999, 41.123822 ], "pop" : 28310, "state" : "OH" } +{ "_id" : "44887", "city" : "TIRO", "loc" : [ -82.797032, 40.880992 ], "pop" : 1471, "state" : "OH" } +{ "_id" : "44889", "city" : "WAKEMAN", "loc" : [ -82.378168, 41.263748 ], "pop" : 6464, "state" : "OH" } +{ "_id" : "44890", "city" : "WILLARD", "loc" : [ -82.72880499999999, 41.062787 ], "pop" : 11156, "state" : "OH" } +{ "_id" : "44902", "city" : "MANSFIELD", "loc" : [ -82.512269, 40.755937 ], "pop" : 8504, "state" : "OH" } +{ "_id" : "44903", "city" : "MANSFIELD", "loc" : [ -82.52538, 40.762258 ], "pop" : 26575, "state" : "OH" } +{ "_id" : "44904", "city" : "LEXINGTON", "loc" : [ -82.590605, 40.682568 ], "pop" : 12466, "state" : "OH" } +{ "_id" : "44905", "city" : "LINCOLN", "loc" : [ -82.474609, 40.777173 ], "pop" : 16221, "state" : "OH" } +{ "_id" : "44906", "city" : "MANSFIELD", "loc" : [ -82.55929500000001, 40.762679 ], "pop" : 16809, "state" : "OH" } +{ "_id" : "44907", "city" : "MANSFIELD", "loc" : [ -82.51983300000001, 40.734483 ], "pop" : 14891, "state" : "OH" } +{ "_id" : "45001", "city" : "ADDYSTON", "loc" : [ -84.709602, 39.137364 ], "pop" : 1198, "state" : "OH" } +{ "_id" : "45002", "city" : "CLEVES", "loc" : [ -84.733969, 39.193707 ], "pop" : 10249, "state" : "OH" } +{ "_id" : "45003", "city" : "COLLEGE CORNER", "loc" : [ -84.804951, 39.575453 ], "pop" : 708, "state" : "OH" } +{ "_id" : "45005", "city" : "CARLISLE", "loc" : [ -84.305881, 39.547839 ], "pop" : 29720, "state" : "OH" } +{ "_id" : "45011", "city" : "HAMILTON", "loc" : [ -84.52211699999999, 39.405906 ], "pop" : 41229, "state" : "OH" } +{ "_id" : "45013", "city" : "ROSSVILLE", "loc" : [ -84.606655, 39.40619 ], "pop" : 48553, "state" : "OH" } +{ "_id" : "45014", "city" : "FAIRFIELD", "loc" : [ -84.547881, 39.326602 ], "pop" : 41880, "state" : "OH" } +{ "_id" : "45015", "city" : "LINDENWALD", "loc" : [ -84.551187, 39.367152 ], "pop" : 13310, "state" : "OH" } +{ "_id" : "45030", "city" : "HARRISON", "loc" : [ -84.78368, 39.259208 ], "pop" : 15218, "state" : "OH" } +{ "_id" : "45036", "city" : "OTTERBIEN HOME", "loc" : [ -84.218754, 39.442047 ], "pop" : 24354, "state" : "OH" } +{ "_id" : "45039", "city" : "MAINEVILLE", "loc" : [ -84.252567, 39.313878 ], "pop" : 12215, "state" : "OH" } +{ "_id" : "45040", "city" : "MASON", "loc" : [ -84.31493500000001, 39.335741 ], "pop" : 18803, "state" : "OH" } +{ "_id" : "45042", "city" : "MIDDLETOWN", "loc" : [ -84.389601, 39.532121 ], "pop" : 27251, "state" : "OH" } +{ "_id" : "45044", "city" : "EXCELLO", "loc" : [ -84.383461, 39.485259 ], "pop" : 38868, "state" : "OH" } +{ "_id" : "45050", "city" : "MONROE", "loc" : [ -84.365196, 39.441285 ], "pop" : 4352, "state" : "OH" } +{ "_id" : "45052", "city" : "NORTH BEND", "loc" : [ -84.727261, 39.153605 ], "pop" : 4013, "state" : "OH" } +{ "_id" : "45053", "city" : "OKEANA", "loc" : [ -84.776149, 39.353732 ], "pop" : 2894, "state" : "OH" } +{ "_id" : "45054", "city" : "OREGONIA", "loc" : [ -84.051136, 39.414479 ], "pop" : 1405, "state" : "OH" } +{ "_id" : "45056", "city" : "MIAMI UNIVERSITY", "loc" : [ -84.738518, 39.503838 ], "pop" : 26075, "state" : "OH" } +{ "_id" : "45064", "city" : "SOMERVILLE", "loc" : [ -84.621911, 39.555366 ], "pop" : 902, "state" : "OH" } +{ "_id" : "45065", "city" : "SOUTH LEBANON", "loc" : [ -84.21078300000001, 39.371451 ], "pop" : 2774, "state" : "OH" } +{ "_id" : "45066", "city" : "SPRINGBORO", "loc" : [ -84.228774, 39.562975 ], "pop" : 9106, "state" : "OH" } +{ "_id" : "45067", "city" : "TRENTON", "loc" : [ -84.45976899999999, 39.479937 ], "pop" : 7072, "state" : "OH" } +{ "_id" : "45068", "city" : "WAYNESVILLE", "loc" : [ -84.081518, 39.528489 ], "pop" : 6880, "state" : "OH" } +{ "_id" : "45069", "city" : "WEST CHESTER", "loc" : [ -84.39978600000001, 39.340243 ], "pop" : 32613, "state" : "OH" } +{ "_id" : "45101", "city" : "ABERDEEN", "loc" : [ -83.763723, 38.670864 ], "pop" : 2176, "state" : "OH" } +{ "_id" : "45102", "city" : "AMELIA", "loc" : [ -84.211174, 39.021138 ], "pop" : 15931, "state" : "OH" } +{ "_id" : "45103", "city" : "BATAVIA", "loc" : [ -84.14512499999999, 39.095661 ], "pop" : 14416, "state" : "OH" } +{ "_id" : "45106", "city" : "BETHEL", "loc" : [ -84.09195, 38.94236 ], "pop" : 10408, "state" : "OH" } +{ "_id" : "45107", "city" : "BLANCHESTER", "loc" : [ -83.973977, 39.303442 ], "pop" : 6158, "state" : "OH" } +{ "_id" : "45111", "city" : "CAMP DENNISON", "loc" : [ -84.289659, 39.196212 ], "pop" : 482, "state" : "OH" } +{ "_id" : "45113", "city" : "CLARKSVILLE", "loc" : [ -83.959407, 39.404233 ], "pop" : 1434, "state" : "OH" } +{ "_id" : "45118", "city" : "FAYETTEVILLE", "loc" : [ -83.950087, 39.186214 ], "pop" : 3177, "state" : "OH" } +{ "_id" : "45120", "city" : "FELICITY", "loc" : [ -84.098581, 38.826248 ], "pop" : 2662, "state" : "OH" } +{ "_id" : "45121", "city" : "GEORGETOWN", "loc" : [ -83.909153, 38.871708 ], "pop" : 7474, "state" : "OH" } +{ "_id" : "45122", "city" : "GOSHEN", "loc" : [ -84.118764, 39.220931 ], "pop" : 11742, "state" : "OH" } +{ "_id" : "45123", "city" : "GREENFIELD", "loc" : [ -83.389805, 39.347763 ], "pop" : 8106, "state" : "OH" } +{ "_id" : "45130", "city" : "HAMERSVILLE", "loc" : [ -83.99306199999999, 38.919962 ], "pop" : 3415, "state" : "OH" } +{ "_id" : "45133", "city" : "HILLSBORO", "loc" : [ -83.60640600000001, 39.167877 ], "pop" : 19825, "state" : "OH" } +{ "_id" : "45135", "city" : "LEESBURG", "loc" : [ -83.548146, 39.345767 ], "pop" : 3684, "state" : "OH" } +{ "_id" : "45140", "city" : "LOVELAND", "loc" : [ -84.258802, 39.244484 ], "pop" : 29488, "state" : "OH" } +{ "_id" : "45142", "city" : "LYNCHBURG", "loc" : [ -83.80212400000001, 39.211931 ], "pop" : 4539, "state" : "OH" } +{ "_id" : "45144", "city" : "MANCHESTER", "loc" : [ -83.618064, 38.698167 ], "pop" : 4303, "state" : "OH" } +{ "_id" : "45146", "city" : "MARTINSVILLE", "loc" : [ -83.800545, 39.312705 ], "pop" : 1413, "state" : "OH" } +{ "_id" : "45148", "city" : "MIDLAND", "loc" : [ -83.893131, 39.29169 ], "pop" : 1488, "state" : "OH" } +{ "_id" : "45150", "city" : "DAY HEIGHTS", "loc" : [ -84.243814, 39.179987 ], "pop" : 24709, "state" : "OH" } +{ "_id" : "45152", "city" : "MORROW", "loc" : [ -84.11808499999999, 39.347619 ], "pop" : 5498, "state" : "OH" } +{ "_id" : "45153", "city" : "MOSCOW", "loc" : [ -84.195824, 38.858255 ], "pop" : 1957, "state" : "OH" } +{ "_id" : "45154", "city" : "MOUNT ORAB", "loc" : [ -83.948027, 39.045368 ], "pop" : 8247, "state" : "OH" } +{ "_id" : "45157", "city" : "NEW RICHMOND", "loc" : [ -84.237903, 38.953663 ], "pop" : 8660, "state" : "OH" } +{ "_id" : "45159", "city" : "NEW VIENNA", "loc" : [ -83.688171, 39.332058 ], "pop" : 2213, "state" : "OH" } +{ "_id" : "45162", "city" : "PLEASANT PLAIN", "loc" : [ -84.09673600000001, 39.288382 ], "pop" : 2911, "state" : "OH" } +{ "_id" : "45167", "city" : "RIPLEY", "loc" : [ -83.822677, 38.755095 ], "pop" : 3742, "state" : "OH" } +{ "_id" : "45168", "city" : "RUSSELLVILLE", "loc" : [ -83.76245900000001, 38.851128 ], "pop" : 1600, "state" : "OH" } +{ "_id" : "45169", "city" : "SABINA", "loc" : [ -83.65025199999999, 39.490022 ], "pop" : 4866, "state" : "OH" } +{ "_id" : "45171", "city" : "SARDINIA", "loc" : [ -83.796649, 38.983232 ], "pop" : 3377, "state" : "OH" } +{ "_id" : "45174", "city" : "TERRACE PARK", "loc" : [ -84.30976200000001, 39.160155 ], "pop" : 2133, "state" : "OH" } +{ "_id" : "45176", "city" : "WILLIAMSBURG", "loc" : [ -84.043167, 39.075345 ], "pop" : 5038, "state" : "OH" } +{ "_id" : "45177", "city" : "WILMINGTON", "loc" : [ -83.84165299999999, 39.448788 ], "pop" : 18361, "state" : "OH" } +{ "_id" : "45202", "city" : "CINCINNATI", "loc" : [ -84.50195600000001, 39.107225 ], "pop" : 6428, "state" : "OH" } +{ "_id" : "45203", "city" : "CINCINNATI", "loc" : [ -84.525684, 39.10754 ], "pop" : 5327, "state" : "OH" } +{ "_id" : "45204", "city" : "CINCINNATI", "loc" : [ -84.566794, 39.102498 ], "pop" : 11444, "state" : "OH" } +{ "_id" : "45205", "city" : "CINCINNATI", "loc" : [ -84.575672, 39.110439 ], "pop" : 23052, "state" : "OH" } +{ "_id" : "45206", "city" : "CINCINNATI", "loc" : [ -84.485258, 39.126916 ], "pop" : 14017, "state" : "OH" } +{ "_id" : "45207", "city" : "CINCINNATI", "loc" : [ -84.47062099999999, 39.139747 ], "pop" : 8156, "state" : "OH" } +{ "_id" : "45208", "city" : "CINCINNATI", "loc" : [ -84.435474, 39.136082 ], "pop" : 19557, "state" : "OH" } +{ "_id" : "45209", "city" : "CINCINNATI", "loc" : [ -84.42783300000001, 39.151578 ], "pop" : 12082, "state" : "OH" } +{ "_id" : "45210", "city" : "CINCINNATI", "loc" : [ -84.513535, 39.112579 ], "pop" : 11349, "state" : "OH" } +{ "_id" : "45211", "city" : "CINCINNATI", "loc" : [ -84.59671400000001, 39.152401 ], "pop" : 44072, "state" : "OH" } +{ "_id" : "45212", "city" : "NORWOOD", "loc" : [ -84.452765, 39.162505 ], "pop" : 26737, "state" : "OH" } +{ "_id" : "45213", "city" : "TAFT", "loc" : [ -84.418701, 39.182905 ], "pop" : 14333, "state" : "OH" } +{ "_id" : "45214", "city" : "CINCINNATI", "loc" : [ -84.541442, 39.120642 ], "pop" : 12013, "state" : "OH" } +{ "_id" : "45215", "city" : "LOCKLAND", "loc" : [ -84.457168, 39.230063 ], "pop" : 34166, "state" : "OH" } +{ "_id" : "45216", "city" : "ELMWOOD PLACE", "loc" : [ -84.479232, 39.199183 ], "pop" : 10261, "state" : "OH" } +{ "_id" : "45217", "city" : "SAINT BERNARD", "loc" : [ -84.497424, 39.161715 ], "pop" : 8838, "state" : "OH" } +{ "_id" : "45218", "city" : "GREENHILLS", "loc" : [ -84.51960800000001, 39.266573 ], "pop" : 4680, "state" : "OH" } +{ "_id" : "45219", "city" : "CINCINNATI", "loc" : [ -84.513127, 39.127027 ], "pop" : 21619, "state" : "OH" } +{ "_id" : "45220", "city" : "CINCINNATI", "loc" : [ -84.521738, 39.143183 ], "pop" : 15449, "state" : "OH" } +{ "_id" : "45223", "city" : "CINCINNATI", "loc" : [ -84.54780700000001, 39.169619 ], "pop" : 15639, "state" : "OH" } +{ "_id" : "45224", "city" : "COLLEGE HILL", "loc" : [ -84.53883, 39.203079 ], "pop" : 23394, "state" : "OH" } +{ "_id" : "45225", "city" : "CINCINNATI", "loc" : [ -84.55326700000001, 39.144654 ], "pop" : 13324, "state" : "OH" } +{ "_id" : "45226", "city" : "CINCINNATI", "loc" : [ -84.431194, 39.117356 ], "pop" : 5711, "state" : "OH" } +{ "_id" : "45227", "city" : "MADISONVILLE", "loc" : [ -84.38721099999999, 39.15431 ], "pop" : 21393, "state" : "OH" } +{ "_id" : "45228", "city" : "CINCINNATI", "loc" : [ -84.42353900000001, 39.066448 ], "pop" : 538, "state" : "OH" } +{ "_id" : "45229", "city" : "CINCINNATI", "loc" : [ -84.48918399999999, 39.149016 ], "pop" : 19811, "state" : "OH" } +{ "_id" : "45230", "city" : "ANDERSON", "loc" : [ -84.378727, 39.080861 ], "pop" : 26856, "state" : "OH" } +{ "_id" : "45231", "city" : "CINCINNATI", "loc" : [ -84.543702, 39.241827 ], "pop" : 44838, "state" : "OH" } +{ "_id" : "45232", "city" : "CINCINNATI", "loc" : [ -84.514101, 39.185926 ], "pop" : 9364, "state" : "OH" } +{ "_id" : "45233", "city" : "SAYLOR PARK", "loc" : [ -84.669411, 39.11928 ], "pop" : 15452, "state" : "OH" } +{ "_id" : "45236", "city" : "TAFT", "loc" : [ -84.394746, 39.207302 ], "pop" : 26113, "state" : "OH" } +{ "_id" : "45237", "city" : "CINCINNATI", "loc" : [ -84.45799700000001, 39.18797 ], "pop" : 25445, "state" : "OH" } +{ "_id" : "45238", "city" : "WESTERN HILLS", "loc" : [ -84.608805, 39.111667 ], "pop" : 48302, "state" : "OH" } +{ "_id" : "45239", "city" : "GROESBECK", "loc" : [ -84.57922499999999, 39.207995 ], "pop" : 27024, "state" : "OH" } +{ "_id" : "45240", "city" : "PARKDALE", "loc" : [ -84.52629899999999, 39.286424 ], "pop" : 27517, "state" : "OH" } +{ "_id" : "45241", "city" : "SHARONVILLE", "loc" : [ -84.391161, 39.276745 ], "pop" : 21992, "state" : "OH" } +{ "_id" : "45242", "city" : "SYCAMORE", "loc" : [ -84.359919, 39.239881 ], "pop" : 21183, "state" : "OH" } +{ "_id" : "45243", "city" : "MADEIRA", "loc" : [ -84.35934899999999, 39.187847 ], "pop" : 14999, "state" : "OH" } +{ "_id" : "45244", "city" : "NEWTOWN", "loc" : [ -84.347765, 39.107091 ], "pop" : 12310, "state" : "OH" } +{ "_id" : "45245", "city" : "NEWTOWN", "loc" : [ -84.277383, 39.091293 ], "pop" : 36134, "state" : "OH" } +{ "_id" : "45246", "city" : "GLENDALE", "loc" : [ -84.472353, 39.28751 ], "pop" : 13861, "state" : "OH" } +{ "_id" : "45247", "city" : "GROESBECK", "loc" : [ -84.631608, 39.207604 ], "pop" : 16834, "state" : "OH" } +{ "_id" : "45248", "city" : "WESTWOOD", "loc" : [ -84.651535, 39.159056 ], "pop" : 20735, "state" : "OH" } +{ "_id" : "45249", "city" : "SYCAMORE", "loc" : [ -84.326673, 39.275946 ], "pop" : 10312, "state" : "OH" } +{ "_id" : "45251", "city" : "GROESBECK", "loc" : [ -84.587987, 39.253005 ], "pop" : 22487, "state" : "OH" } +{ "_id" : "45252", "city" : "CINCINNATI", "loc" : [ -84.62832, 39.266803 ], "pop" : 3302, "state" : "OH" } +{ "_id" : "45255", "city" : "ANDERSON", "loc" : [ -84.33077400000001, 39.070642 ], "pop" : 15600, "state" : "OH" } +{ "_id" : "45302", "city" : "ANNA", "loc" : [ -84.21034400000001, 40.405105 ], "pop" : 3483, "state" : "OH" } +{ "_id" : "45303", "city" : "ANSONIA", "loc" : [ -84.640642, 40.215064 ], "pop" : 2230, "state" : "OH" } +{ "_id" : "45304", "city" : "CASTINE", "loc" : [ -84.53702, 39.988367 ], "pop" : 8201, "state" : "OH" } +{ "_id" : "45305", "city" : "BELLBROOK", "loc" : [ -84.08244999999999, 39.640187 ], "pop" : 8162, "state" : "OH" } +{ "_id" : "45306", "city" : "BOTKINS", "loc" : [ -84.177994, 40.465897 ], "pop" : 2168, "state" : "OH" } +{ "_id" : "45308", "city" : "BRADFORD", "loc" : [ -84.429288, 40.128558 ], "pop" : 6966, "state" : "OH" } +{ "_id" : "45309", "city" : "BROOKVILLE", "loc" : [ -84.416464, 39.841393 ], "pop" : 11613, "state" : "OH" } +{ "_id" : "45311", "city" : "CAMDEN", "loc" : [ -84.61000799999999, 39.613391 ], "pop" : 8394, "state" : "OH" } +{ "_id" : "45312", "city" : "CASSTOWN", "loc" : [ -84.108799, 40.071578 ], "pop" : 1283, "state" : "OH" } +{ "_id" : "45314", "city" : "CEDARVILLE", "loc" : [ -83.801253, 39.748424 ], "pop" : 4685, "state" : "OH" } +{ "_id" : "45315", "city" : "CLAYTON", "loc" : [ -84.33989, 39.855124 ], "pop" : 2269, "state" : "OH" } +{ "_id" : "45317", "city" : "CONOVER", "loc" : [ -84.02829699999999, 40.145694 ], "pop" : 1053, "state" : "OH" } +{ "_id" : "45318", "city" : "COVINGTON", "loc" : [ -84.34964600000001, 40.11756 ], "pop" : 3154, "state" : "OH" } +{ "_id" : "45320", "city" : "EATON", "loc" : [ -84.65084899999999, 39.742572 ], "pop" : 13779, "state" : "OH" } +{ "_id" : "45321", "city" : "ELDORADO", "loc" : [ -84.67859199999999, 39.888209 ], "pop" : 1168, "state" : "OH" } +{ "_id" : "45322", "city" : "UNION", "loc" : [ -84.309515, 39.873976 ], "pop" : 20297, "state" : "OH" } +{ "_id" : "45323", "city" : "ENON", "loc" : [ -83.938464, 39.866282 ], "pop" : 5820, "state" : "OH" } +{ "_id" : "45324", "city" : "FAIRBORN", "loc" : [ -84.019789, 39.805311 ], "pop" : 35733, "state" : "OH" } +{ "_id" : "45325", "city" : "FARMERSVILLE", "loc" : [ -84.420507, 39.686684 ], "pop" : 2292, "state" : "OH" } +{ "_id" : "45326", "city" : "FLETCHER", "loc" : [ -84.13303999999999, 40.152622 ], "pop" : 1752, "state" : "OH" } +{ "_id" : "45327", "city" : "GERMANTOWN", "loc" : [ -84.376384, 39.6244 ], "pop" : 8187, "state" : "OH" } +{ "_id" : "45331", "city" : "GREENVILLE", "loc" : [ -84.63418900000001, 40.098726 ], "pop" : 23035, "state" : "OH" } +{ "_id" : "45332", "city" : "HOLLANSBURG", "loc" : [ -84.79008, 39.989862 ], "pop" : 789, "state" : "OH" } +{ "_id" : "45333", "city" : "HOUSTON", "loc" : [ -84.352109, 40.253478 ], "pop" : 1613, "state" : "OH" } +{ "_id" : "45334", "city" : "JACKSON CENTER", "loc" : [ -84.045677, 40.435802 ], "pop" : 2318, "state" : "OH" } +{ "_id" : "45335", "city" : "JAMESTOWN", "loc" : [ -83.750417, 39.642848 ], "pop" : 6956, "state" : "OH" } +{ "_id" : "45337", "city" : "LAURA", "loc" : [ -84.3994, 39.978492 ], "pop" : 2602, "state" : "OH" } +{ "_id" : "45338", "city" : "LEWISBURG", "loc" : [ -84.53685, 39.853404 ], "pop" : 5582, "state" : "OH" } +{ "_id" : "45339", "city" : "LUDLOW FALLS", "loc" : [ -84.33339100000001, 39.987091 ], "pop" : 1888, "state" : "OH" } +{ "_id" : "45340", "city" : "MAPLEWOOD", "loc" : [ -84.076657, 40.343743 ], "pop" : 2071, "state" : "OH" } +{ "_id" : "45341", "city" : "MEDWAY", "loc" : [ -84.026808, 39.879774 ], "pop" : 4385, "state" : "OH" } +{ "_id" : "45342", "city" : "MIAMISBURG", "loc" : [ -84.267477, 39.632095 ], "pop" : 27356, "state" : "OH" } +{ "_id" : "45344", "city" : "NEW CARLISLE", "loc" : [ -84.021704, 39.930025 ], "pop" : 17912, "state" : "OH" } +{ "_id" : "45345", "city" : "NEW LEBANON", "loc" : [ -84.395591, 39.739798 ], "pop" : 7359, "state" : "OH" } +{ "_id" : "45346", "city" : "NEW MADISON", "loc" : [ -84.722211, 39.968711 ], "pop" : 2519, "state" : "OH" } +{ "_id" : "45347", "city" : "NEW PARIS", "loc" : [ -84.779337, 39.861718 ], "pop" : 3783, "state" : "OH" } +{ "_id" : "45348", "city" : "NEW WESTON", "loc" : [ -84.630792, 40.334923 ], "pop" : 1266, "state" : "OH" } +{ "_id" : "45356", "city" : "PIQUA", "loc" : [ -84.25305299999999, 40.148621 ], "pop" : 24508, "state" : "OH" } +{ "_id" : "45359", "city" : "PLEASANT HILL", "loc" : [ -84.34363399999999, 40.053136 ], "pop" : 2553, "state" : "OH" } +{ "_id" : "45362", "city" : "ROSSBURG", "loc" : [ -84.626419, 40.29465 ], "pop" : 1450, "state" : "OH" } +{ "_id" : "45363", "city" : "RUSSIA", "loc" : [ -84.412255, 40.234065 ], "pop" : 911, "state" : "OH" } +{ "_id" : "45365", "city" : "SIDNEY", "loc" : [ -84.162223, 40.287357 ], "pop" : 27517, "state" : "OH" } +{ "_id" : "45368", "city" : "SELMA", "loc" : [ -83.660787, 39.846939 ], "pop" : 4143, "state" : "OH" } +{ "_id" : "45369", "city" : "SOUTH VIENNA", "loc" : [ -83.61570399999999, 39.94732 ], "pop" : 3814, "state" : "OH" } +{ "_id" : "45370", "city" : "SPRING VALLEY", "loc" : [ -84.10158300000001, 39.602761 ], "pop" : 5950, "state" : "OH" } +{ "_id" : "45371", "city" : "PHONETON", "loc" : [ -84.17150100000001, 39.943577 ], "pop" : 14967, "state" : "OH" } +{ "_id" : "45373", "city" : "TROY", "loc" : [ -84.20315100000001, 40.037394 ], "pop" : 29422, "state" : "OH" } +{ "_id" : "45377", "city" : "VANDALIA", "loc" : [ -84.20226599999999, 39.888273 ], "pop" : 14355, "state" : "OH" } +{ "_id" : "45380", "city" : "VERSAILLES", "loc" : [ -84.49569700000001, 40.227284 ], "pop" : 4921, "state" : "OH" } +{ "_id" : "45381", "city" : "WEST ALEXANDRIA", "loc" : [ -84.535214, 39.725898 ], "pop" : 5707, "state" : "OH" } +{ "_id" : "45382", "city" : "WEST MANCHESTER", "loc" : [ -84.619383, 39.902564 ], "pop" : 1599, "state" : "OH" } +{ "_id" : "45383", "city" : "WEST MILTON", "loc" : [ -84.324237, 39.953077 ], "pop" : 6095, "state" : "OH" } +{ "_id" : "45385", "city" : "XENIA", "loc" : [ -83.93687799999999, 39.684204 ], "pop" : 36683, "state" : "OH" } +{ "_id" : "45387", "city" : "YELLOW SPRINGS", "loc" : [ -83.889066, 39.799569 ], "pop" : 5743, "state" : "OH" } +{ "_id" : "45388", "city" : "YORKSHIRE", "loc" : [ -84.483587, 40.328328 ], "pop" : 1054, "state" : "OH" } +{ "_id" : "45390", "city" : "UNION CITY", "loc" : [ -84.783209, 40.201773 ], "pop" : 4123, "state" : "OH" } +{ "_id" : "45402", "city" : "DAYTON", "loc" : [ -84.189508, 39.756305 ], "pop" : 2811, "state" : "OH" } +{ "_id" : "45403", "city" : "DAYTON", "loc" : [ -84.14980199999999, 39.761728 ], "pop" : 19567, "state" : "OH" } +{ "_id" : "45404", "city" : "DAYTON", "loc" : [ -84.16215699999999, 39.78619 ], "pop" : 14396, "state" : "OH" } +{ "_id" : "45405", "city" : "DAYTON", "loc" : [ -84.21354599999999, 39.78993 ], "pop" : 25151, "state" : "OH" } +{ "_id" : "45406", "city" : "DAYTON", "loc" : [ -84.237297, 39.782148 ], "pop" : 31024, "state" : "OH" } +{ "_id" : "45407", "city" : "DAYTON", "loc" : [ -84.224232, 39.762699 ], "pop" : 13708, "state" : "OH" } +{ "_id" : "45408", "city" : "DAYTON", "loc" : [ -84.22896299999999, 39.739526 ], "pop" : 13177, "state" : "OH" } +{ "_id" : "45409", "city" : "DAYTON", "loc" : [ -84.182495, 39.728496 ], "pop" : 12633, "state" : "OH" } +{ "_id" : "45410", "city" : "DAYTON", "loc" : [ -84.16001, 39.74743 ], "pop" : 19743, "state" : "OH" } +{ "_id" : "45414", "city" : "DAYTON", "loc" : [ -84.202444, 39.828528 ], "pop" : 23033, "state" : "OH" } +{ "_id" : "45415", "city" : "DAYTON", "loc" : [ -84.26132800000001, 39.835488 ], "pop" : 12885, "state" : "OH" } +{ "_id" : "45416", "city" : "TROTWOOD", "loc" : [ -84.25982399999999, 39.805541 ], "pop" : 6905, "state" : "OH" } +{ "_id" : "45417", "city" : "DAYTON", "loc" : [ -84.246961, 39.752812 ], "pop" : 14617, "state" : "OH" } +{ "_id" : "45418", "city" : "DAYTON", "loc" : [ -84.267696, 39.716251 ], "pop" : 6913, "state" : "OH" } +{ "_id" : "45419", "city" : "DAYTON", "loc" : [ -84.163656, 39.715486 ], "pop" : 17079, "state" : "OH" } +{ "_id" : "45420", "city" : "KETTERING", "loc" : [ -84.133892, 39.721286 ], "pop" : 26955, "state" : "OH" } +{ "_id" : "45424", "city" : "HUBER HEIGHTS", "loc" : [ -84.123287, 39.845339 ], "pop" : 48120, "state" : "OH" } +{ "_id" : "45426", "city" : "TROTWOOD", "loc" : [ -84.298283, 39.810548 ], "pop" : 17853, "state" : "OH" } +{ "_id" : "45427", "city" : "DAYTON", "loc" : [ -84.28188400000001, 39.754527 ], "pop" : 13469, "state" : "OH" } +{ "_id" : "45429", "city" : "KETTERING", "loc" : [ -84.156077, 39.686392 ], "pop" : 27574, "state" : "OH" } +{ "_id" : "45430", "city" : "BEAVERCREEK", "loc" : [ -84.083596, 39.709381 ], "pop" : 6511, "state" : "OH" } +{ "_id" : "45431", "city" : "BEAVERCREEK", "loc" : [ -84.099802, 39.765396 ], "pop" : 25772, "state" : "OH" } +{ "_id" : "45432", "city" : "BEAVERCREEK", "loc" : [ -84.094157, 39.740774 ], "pop" : 14917, "state" : "OH" } +{ "_id" : "45433", "city" : "DAYTON", "loc" : [ -84.059048, 39.813758 ], "pop" : 2298, "state" : "OH" } +{ "_id" : "45434", "city" : "BEAVERCREEK", "loc" : [ -84.040385, 39.716552 ], "pop" : 8855, "state" : "OH" } +{ "_id" : "45439", "city" : "WEST CARROLLTON", "loc" : [ -84.21626000000001, 39.689617 ], "pop" : 9866, "state" : "OH" } +{ "_id" : "45440", "city" : "DAYTON", "loc" : [ -84.113573, 39.674854 ], "pop" : 17129, "state" : "OH" } +{ "_id" : "45449", "city" : "WEST CARROLLTON", "loc" : [ -84.237887, 39.662098 ], "pop" : 20391, "state" : "OH" } +{ "_id" : "45458", "city" : "CENTERVILLE", "loc" : [ -84.16269699999999, 39.615755 ], "pop" : 16364, "state" : "OH" } +{ "_id" : "45459", "city" : "CENTERVILLE", "loc" : [ -84.166422, 39.645957 ], "pop" : 25767, "state" : "OH" } +{ "_id" : "45502", "city" : "SPRINGFIELD", "loc" : [ -83.84133799999999, 39.930486 ], "pop" : 16510, "state" : "OH" } +{ "_id" : "45503", "city" : "SPRINGFIELD", "loc" : [ -83.78043, 39.9528 ], "pop" : 30547, "state" : "OH" } +{ "_id" : "45504", "city" : "SPRINGFIELD", "loc" : [ -83.83430199999999, 39.940793 ], "pop" : 19854, "state" : "OH" } +{ "_id" : "45505", "city" : "SPRINGFIELD", "loc" : [ -83.78559300000001, 39.910588 ], "pop" : 23956, "state" : "OH" } +{ "_id" : "45506", "city" : "SPRINGFIELD", "loc" : [ -83.827512, 39.910418 ], "pop" : 19027, "state" : "OH" } +{ "_id" : "45601", "city" : "CHILLICOTHE", "loc" : [ -82.98949, 39.337997 ], "pop" : 54615, "state" : "OH" } +{ "_id" : "45612", "city" : "BAINBRIDGE", "loc" : [ -83.276268, 39.213116 ], "pop" : 4356, "state" : "OH" } +{ "_id" : "45613", "city" : "BEAVER", "loc" : [ -82.847469, 39.023847 ], "pop" : 2953, "state" : "OH" } +{ "_id" : "45614", "city" : "BIDWELL", "loc" : [ -82.27009200000001, 38.927647 ], "pop" : 3572, "state" : "OH" } +{ "_id" : "45616", "city" : "BLUE CREEK", "loc" : [ -83.35268000000001, 38.756451 ], "pop" : 1436, "state" : "OH" } +{ "_id" : "45619", "city" : "CHESAPEAKE", "loc" : [ -82.45044799999999, 38.455089 ], "pop" : 8076, "state" : "OH" } +{ "_id" : "45620", "city" : "CHESHIRE", "loc" : [ -82.123537, 38.958678 ], "pop" : 1007, "state" : "OH" } +{ "_id" : "45622", "city" : "CREOLA", "loc" : [ -82.493835, 39.3497 ], "pop" : 535, "state" : "OH" } +{ "_id" : "45623", "city" : "CROWN CITY", "loc" : [ -82.265717, 38.613548 ], "pop" : 2677, "state" : "OH" } +{ "_id" : "45628", "city" : "FRANKFORT", "loc" : [ -83.203356, 39.391015 ], "pop" : 3985, "state" : "OH" } +{ "_id" : "45629", "city" : "FRANKLIN FURNACE", "loc" : [ -82.814477, 38.628216 ], "pop" : 3956, "state" : "OH" } +{ "_id" : "45631", "city" : "GALLIPOLIS", "loc" : [ -82.22902000000001, 38.814781 ], "pop" : 18163, "state" : "OH" } +{ "_id" : "45634", "city" : "HAMDEN", "loc" : [ -82.50997599999999, 39.168497 ], "pop" : 1554, "state" : "OH" } +{ "_id" : "45638", "city" : "IRONTON", "loc" : [ -82.665351, 38.529429 ], "pop" : 21093, "state" : "OH" } +{ "_id" : "45640", "city" : "JACKSON", "loc" : [ -82.647209, 39.042821 ], "pop" : 13373, "state" : "OH" } +{ "_id" : "45644", "city" : "KINGSTON", "loc" : [ -82.84880800000001, 39.441432 ], "pop" : 1347, "state" : "OH" } +{ "_id" : "45645", "city" : "KITTS HILL", "loc" : [ -82.548897, 38.564945 ], "pop" : 2837, "state" : "OH" } +{ "_id" : "45646", "city" : "LATHAM", "loc" : [ -83.328294, 39.080436 ], "pop" : 351, "state" : "OH" } +{ "_id" : "45647", "city" : "LONDONDERRY", "loc" : [ -82.783288, 39.272283 ], "pop" : 1481, "state" : "OH" } +{ "_id" : "45648", "city" : "LUCASVILLE", "loc" : [ -82.99400900000001, 38.893832 ], "pop" : 12974, "state" : "OH" } +{ "_id" : "45651", "city" : "ALLENSVILLE", "loc" : [ -82.49069900000001, 39.255326 ], "pop" : 5028, "state" : "OH" } +{ "_id" : "45652", "city" : "MC DERMOTT", "loc" : [ -83.06889200000001, 38.836203 ], "pop" : 2932, "state" : "OH" } +{ "_id" : "45653", "city" : "MINFORD", "loc" : [ -82.855538, 38.875087 ], "pop" : 3969, "state" : "OH" } +{ "_id" : "45654", "city" : "NEW PLYMOUTH", "loc" : [ -82.389172, 39.388421 ], "pop" : 804, "state" : "OH" } +{ "_id" : "45656", "city" : "OAK HILL", "loc" : [ -82.58834299999999, 38.891559 ], "pop" : 6036, "state" : "OH" } +{ "_id" : "45657", "city" : "OTWAY", "loc" : [ -83.222172, 38.85203 ], "pop" : 2287, "state" : "OH" } +{ "_id" : "45658", "city" : "PATRIOT", "loc" : [ -82.427491, 38.77702 ], "pop" : 2202, "state" : "OH" } +{ "_id" : "45659", "city" : "PEDRO", "loc" : [ -82.647722, 38.650323 ], "pop" : 3870, "state" : "OH" } +{ "_id" : "45660", "city" : "PEEBLES", "loc" : [ -83.36869799999999, 38.986885 ], "pop" : 7298, "state" : "OH" } +{ "_id" : "45661", "city" : "IDAHO", "loc" : [ -83.076742, 39.040196 ], "pop" : 4342, "state" : "OH" } +{ "_id" : "45662", "city" : "NEW BOSTON", "loc" : [ -82.94864, 38.757252 ], "pop" : 33275, "state" : "OH" } +{ "_id" : "45663", "city" : "PORTSMOUTH", "loc" : [ -83.047657, 38.749222 ], "pop" : 8485, "state" : "OH" } +{ "_id" : "45669", "city" : "PROCTORVILLE", "loc" : [ -82.352294, 38.463461 ], "pop" : 8976, "state" : "OH" } +{ "_id" : "45670", "city" : "RADCLIFF", "loc" : [ -82.354243, 39.105205 ], "pop" : 1413, "state" : "OH" } +{ "_id" : "45671", "city" : "RARDEN", "loc" : [ -83.237337, 38.943388 ], "pop" : 524, "state" : "OH" } +{ "_id" : "45672", "city" : "RAY", "loc" : [ -82.69080099999999, 39.207678 ], "pop" : 1472, "state" : "OH" } +{ "_id" : "45673", "city" : "RICHMOND DALE", "loc" : [ -82.814913, 39.203922 ], "pop" : 454, "state" : "OH" } +{ "_id" : "45675", "city" : "ROCK CAMP", "loc" : [ -82.563832, 38.522145 ], "pop" : 435, "state" : "OH" } +{ "_id" : "45678", "city" : "SCOTTOWN", "loc" : [ -82.39668500000001, 38.594034 ], "pop" : 1433, "state" : "OH" } +{ "_id" : "45679", "city" : "SEAMAN", "loc" : [ -83.593625, 38.962072 ], "pop" : 3482, "state" : "OH" } +{ "_id" : "45680", "city" : "SOUTH POINT", "loc" : [ -82.55288299999999, 38.433856 ], "pop" : 13272, "state" : "OH" } +{ "_id" : "45681", "city" : "SOUTH SALEM", "loc" : [ -83.271953, 39.302137 ], "pop" : 1001, "state" : "OH" } +{ "_id" : "45682", "city" : "SOUTH WEBSTER", "loc" : [ -82.720151, 38.819967 ], "pop" : 2094, "state" : "OH" } +{ "_id" : "45684", "city" : "STOUT", "loc" : [ -83.208984, 38.654588 ], "pop" : 1342, "state" : "OH" } +{ "_id" : "45685", "city" : "THURMAN", "loc" : [ -82.404996, 38.898786 ], "pop" : 2291, "state" : "OH" } +{ "_id" : "45686", "city" : "VINTON", "loc" : [ -82.35701400000001, 38.978338 ], "pop" : 1898, "state" : "OH" } +{ "_id" : "45688", "city" : "WATERLOO", "loc" : [ -82.517399, 38.718152 ], "pop" : 385, "state" : "OH" } +{ "_id" : "45690", "city" : "WAVERLY", "loc" : [ -83.004874, 39.126445 ], "pop" : 14422, "state" : "OH" } +{ "_id" : "45692", "city" : "WELLSTON", "loc" : [ -82.548474, 39.118897 ], "pop" : 9486, "state" : "OH" } +{ "_id" : "45693", "city" : "WEST UNION", "loc" : [ -83.533349, 38.801702 ], "pop" : 8656, "state" : "OH" } +{ "_id" : "45694", "city" : "WHEELERSBURG", "loc" : [ -82.82043400000001, 38.741793 ], "pop" : 10537, "state" : "OH" } +{ "_id" : "45696", "city" : "WILLOW WOOD", "loc" : [ -82.453, 38.593976 ], "pop" : 665, "state" : "OH" } +{ "_id" : "45697", "city" : "WINCHESTER", "loc" : [ -83.66613700000001, 38.935283 ], "pop" : 3146, "state" : "OH" } +{ "_id" : "45701", "city" : "ATHENS", "loc" : [ -82.102011, 39.317824 ], "pop" : 28523, "state" : "OH" } +{ "_id" : "45710", "city" : "ALBANY", "loc" : [ -82.217727, 39.209664 ], "pop" : 4090, "state" : "OH" } +{ "_id" : "45711", "city" : "AMESVILLE", "loc" : [ -81.96497599999999, 39.408641 ], "pop" : 1661, "state" : "OH" } +{ "_id" : "45714", "city" : "BELPRE", "loc" : [ -81.596795, 39.286772 ], "pop" : 9237, "state" : "OH" } +{ "_id" : "45715", "city" : "BEVERLY", "loc" : [ -81.63458799999999, 39.571435 ], "pop" : 2715, "state" : "OH" } +{ "_id" : "45723", "city" : "COOLVILLE", "loc" : [ -81.83286699999999, 39.214131 ], "pop" : 5023, "state" : "OH" } +{ "_id" : "45724", "city" : "CUTLER", "loc" : [ -81.76573, 39.404172 ], "pop" : 2624, "state" : "OH" } +{ "_id" : "45727", "city" : "DEXTER CITY", "loc" : [ -81.467151, 39.652585 ], "pop" : 277, "state" : "OH" } +{ "_id" : "45729", "city" : "FLEMING", "loc" : [ -81.65644399999999, 39.392806 ], "pop" : 1864, "state" : "OH" } +{ "_id" : "45732", "city" : "GLOUSTER", "loc" : [ -82.08712800000001, 39.497837 ], "pop" : 6226, "state" : "OH" } +{ "_id" : "45734", "city" : "RINARD MILLS", "loc" : [ -81.18915200000001, 39.659384 ], "pop" : 535, "state" : "OH" } +{ "_id" : "45735", "city" : "GUYSVILLE", "loc" : [ -81.926841, 39.294368 ], "pop" : 359, "state" : "OH" } +{ "_id" : "45741", "city" : "DEXTER", "loc" : [ -82.23118599999999, 39.056325 ], "pop" : 1613, "state" : "OH" } +{ "_id" : "45742", "city" : "LITTLE HOCKING", "loc" : [ -81.70710699999999, 39.280046 ], "pop" : 3346, "state" : "OH" } +{ "_id" : "45743", "city" : "LONG BOTTOM", "loc" : [ -81.88874800000001, 39.08015 ], "pop" : 1692, "state" : "OH" } +{ "_id" : "45744", "city" : "LOWELL", "loc" : [ -81.519679, 39.53847 ], "pop" : 1741, "state" : "OH" } +{ "_id" : "45745", "city" : "WARNER", "loc" : [ -81.35451999999999, 39.593895 ], "pop" : 1900, "state" : "OH" } +{ "_id" : "45746", "city" : "MACKSBURG", "loc" : [ -81.44708799999999, 39.620356 ], "pop" : 445, "state" : "OH" } +{ "_id" : "45750", "city" : "MARIETTA", "loc" : [ -81.464438, 39.428141 ], "pop" : 25904, "state" : "OH" } +{ "_id" : "45760", "city" : "MIDDLEPORT", "loc" : [ -82.060012, 38.999312 ], "pop" : 3433, "state" : "OH" } +{ "_id" : "45761", "city" : "MILLFIELD", "loc" : [ -82.111328, 39.407711 ], "pop" : 2656, "state" : "OH" } +{ "_id" : "45764", "city" : "NELSONVILLE", "loc" : [ -82.23088300000001, 39.455635 ], "pop" : 8924, "state" : "OH" } +{ "_id" : "45766", "city" : "NEW MARSHFIELD", "loc" : [ -82.22251300000001, 39.338295 ], "pop" : 2321, "state" : "OH" } +{ "_id" : "45767", "city" : "NEW MATAMORAS", "loc" : [ -81.093998, 39.528819 ], "pop" : 3032, "state" : "OH" } +{ "_id" : "45768", "city" : "NEWPORT", "loc" : [ -81.24017499999999, 39.39711 ], "pop" : 1645, "state" : "OH" } +{ "_id" : "45769", "city" : "POMEROY", "loc" : [ -82.033145, 39.060729 ], "pop" : 5509, "state" : "OH" } +{ "_id" : "45770", "city" : "PORTLAND", "loc" : [ -81.813548, 38.999919 ], "pop" : 905, "state" : "OH" } +{ "_id" : "45771", "city" : "RACINE", "loc" : [ -81.925759, 38.978551 ], "pop" : 3774, "state" : "OH" } +{ "_id" : "45772", "city" : "REEDSVILLE", "loc" : [ -81.792433, 39.149002 ], "pop" : 1305, "state" : "OH" } +{ "_id" : "45773", "city" : "RENO", "loc" : [ -81.38043, 39.378408 ], "pop" : 2673, "state" : "OH" } +{ "_id" : "45775", "city" : "RUTLAND", "loc" : [ -82.121914, 39.045653 ], "pop" : 1598, "state" : "OH" } +{ "_id" : "45776", "city" : "SHADE", "loc" : [ -82.021755, 39.212862 ], "pop" : 1890, "state" : "OH" } +{ "_id" : "45778", "city" : "STEWART", "loc" : [ -81.892884, 39.32133 ], "pop" : 975, "state" : "OH" } +{ "_id" : "45780", "city" : "THE PLAINS", "loc" : [ -82.134148, 39.366177 ], "pop" : 3567, "state" : "OH" } +{ "_id" : "45784", "city" : "VINCENT", "loc" : [ -81.67426500000001, 39.337446 ], "pop" : 1524, "state" : "OH" } +{ "_id" : "45786", "city" : "WATERFORD", "loc" : [ -81.655917, 39.515904 ], "pop" : 3932, "state" : "OH" } +{ "_id" : "45788", "city" : "WHIPPLE", "loc" : [ -81.36363900000001, 39.480975 ], "pop" : 1835, "state" : "OH" } +{ "_id" : "45789", "city" : "WINGETT RUN", "loc" : [ -81.28399899999999, 39.542813 ], "pop" : 365, "state" : "OH" } +{ "_id" : "45801", "city" : "LIMA", "loc" : [ -84.097296, 40.764066 ], "pop" : 27344, "state" : "OH" } +{ "_id" : "45804", "city" : "LIMA", "loc" : [ -84.089023, 40.727476 ], "pop" : 19289, "state" : "OH" } +{ "_id" : "45805", "city" : "LIMA", "loc" : [ -84.14591, 40.739911 ], "pop" : 23080, "state" : "OH" } +{ "_id" : "45806", "city" : "CRIDERSVILLE", "loc" : [ -84.144049, 40.675926 ], "pop" : 12250, "state" : "OH" } +{ "_id" : "45807", "city" : "ELIDA", "loc" : [ -84.163966, 40.791599 ], "pop" : 9531, "state" : "OH" } +{ "_id" : "45810", "city" : "ADA", "loc" : [ -83.81540200000001, 40.770931 ], "pop" : 7299, "state" : "OH" } +{ "_id" : "45812", "city" : "ALGER", "loc" : [ -83.825011, 40.705967 ], "pop" : 2394, "state" : "OH" } +{ "_id" : "45813", "city" : "ANTWERP", "loc" : [ -84.74479599999999, 41.188736 ], "pop" : 3039, "state" : "OH" } +{ "_id" : "45814", "city" : "ARLINGTON", "loc" : [ -83.668536, 40.876109 ], "pop" : 2603, "state" : "OH" } +{ "_id" : "45817", "city" : "BLUFFTON", "loc" : [ -83.891397, 40.878978 ], "pop" : 6055, "state" : "OH" } +{ "_id" : "45821", "city" : "CECIL", "loc" : [ -84.62964599999999, 41.217355 ], "pop" : 1527, "state" : "OH" } +{ "_id" : "45822", "city" : "CARTHAGENA", "loc" : [ -84.57006699999999, 40.546074 ], "pop" : 18799, "state" : "OH" } +{ "_id" : "45827", "city" : "CLOVERDALE", "loc" : [ -84.29382, 41.037934 ], "pop" : 1225, "state" : "OH" } +{ "_id" : "45828", "city" : "COLDWATER", "loc" : [ -84.651653, 40.484557 ], "pop" : 6677, "state" : "OH" } +{ "_id" : "45830", "city" : "COLUMBUS GROVE", "loc" : [ -84.07046699999999, 40.91372 ], "pop" : 6030, "state" : "OH" } +{ "_id" : "45831", "city" : "CONTINENTAL", "loc" : [ -84.235778, 41.114769 ], "pop" : 3518, "state" : "OH" } +{ "_id" : "45832", "city" : "CONVOY", "loc" : [ -84.723772, 40.926998 ], "pop" : 2134, "state" : "OH" } +{ "_id" : "45833", "city" : "DELPHOS", "loc" : [ -84.32467800000001, 40.833619 ], "pop" : 10062, "state" : "OH" } +{ "_id" : "45835", "city" : "DOLA", "loc" : [ -83.68937099999999, 40.787645 ], "pop" : 256, "state" : "OH" } +{ "_id" : "45836", "city" : "DUNKIRK", "loc" : [ -83.633912, 40.782375 ], "pop" : 1522, "state" : "OH" } +{ "_id" : "45840", "city" : "FINDLAY", "loc" : [ -83.645656, 41.044903 ], "pop" : 48109, "state" : "OH" } +{ "_id" : "45841", "city" : "JENERA", "loc" : [ -83.725628, 40.900388 ], "pop" : 335, "state" : "OH" } +{ "_id" : "45843", "city" : "PATTERSON", "loc" : [ -83.509771, 40.79955 ], "pop" : 3333, "state" : "OH" } +{ "_id" : "45844", "city" : "FORT JENNINGS", "loc" : [ -84.237381, 40.948393 ], "pop" : 5287, "state" : "OH" } +{ "_id" : "45845", "city" : "FORT LORAMIE", "loc" : [ -84.37413100000001, 40.330632 ], "pop" : 2639, "state" : "OH" } +{ "_id" : "45846", "city" : "FORT RECOVERY", "loc" : [ -84.76125, 40.401829 ], "pop" : 3555, "state" : "OH" } +{ "_id" : "45849", "city" : "GROVER HILL", "loc" : [ -84.49560099999999, 41.024497 ], "pop" : 1113, "state" : "OH" } +{ "_id" : "45850", "city" : "HARROD", "loc" : [ -83.94364899999999, 40.717657 ], "pop" : 4897, "state" : "OH" } +{ "_id" : "45851", "city" : "HAVILAND", "loc" : [ -84.6139, 41.032911 ], "pop" : 659, "state" : "OH" } +{ "_id" : "45856", "city" : "LEIPSIC", "loc" : [ -83.995723, 41.109197 ], "pop" : 4657, "state" : "OH" } +{ "_id" : "45858", "city" : "MC COMB", "loc" : [ -83.801423, 41.112498 ], "pop" : 2298, "state" : "OH" } +{ "_id" : "45860", "city" : "MARIA STEIN", "loc" : [ -84.50757900000001, 40.406225 ], "pop" : 2284, "state" : "OH" } +{ "_id" : "45862", "city" : "MENDON", "loc" : [ -84.51515000000001, 40.677737 ], "pop" : 1527, "state" : "OH" } +{ "_id" : "45863", "city" : "MIDDLE POINT", "loc" : [ -84.417495, 40.873147 ], "pop" : 2691, "state" : "OH" } +{ "_id" : "45865", "city" : "MINSTER", "loc" : [ -84.372895, 40.390983 ], "pop" : 4436, "state" : "OH" } +{ "_id" : "45867", "city" : "MOUNT BLANCHARD", "loc" : [ -83.555286, 40.892929 ], "pop" : 957, "state" : "OH" } +{ "_id" : "45868", "city" : "MOUNT CORY", "loc" : [ -83.809285, 40.943717 ], "pop" : 1553, "state" : "OH" } +{ "_id" : "45869", "city" : "NEW BREMEN", "loc" : [ -84.38209999999999, 40.438917 ], "pop" : 3400, "state" : "OH" } +{ "_id" : "45871", "city" : "NEW KNOXVILLE", "loc" : [ -84.311797, 40.50386 ], "pop" : 2003, "state" : "OH" } +{ "_id" : "45872", "city" : "NORTH BALTIMORE", "loc" : [ -83.680581, 41.186703 ], "pop" : 3820, "state" : "OH" } +{ "_id" : "45873", "city" : "OAKWOOD", "loc" : [ -84.396923, 41.090788 ], "pop" : 3129, "state" : "OH" } +{ "_id" : "45874", "city" : "OHIO CITY", "loc" : [ -84.673063, 40.785428 ], "pop" : 3117, "state" : "OH" } +{ "_id" : "45875", "city" : "GILBOA", "loc" : [ -84.047293, 41.029747 ], "pop" : 10177, "state" : "OH" } +{ "_id" : "45876", "city" : "OTTOVILLE", "loc" : [ -84.347392, 40.937218 ], "pop" : 1972, "state" : "OH" } +{ "_id" : "45877", "city" : "PANDORA", "loc" : [ -83.952073, 40.95087 ], "pop" : 2026, "state" : "OH" } +{ "_id" : "45879", "city" : "PAULDING", "loc" : [ -84.572227, 41.141016 ], "pop" : 6565, "state" : "OH" } +{ "_id" : "45880", "city" : "PAYNE", "loc" : [ -84.734127, 41.08069 ], "pop" : 2766, "state" : "OH" } +{ "_id" : "45881", "city" : "RAWSON", "loc" : [ -83.806951, 41.000135 ], "pop" : 955, "state" : "OH" } +{ "_id" : "45882", "city" : "ROCKFORD", "loc" : [ -84.664174, 40.677077 ], "pop" : 3038, "state" : "OH" } +{ "_id" : "45883", "city" : "SAINT HENRY", "loc" : [ -84.63333799999999, 40.409138 ], "pop" : 3615, "state" : "OH" } +{ "_id" : "45885", "city" : "SAINT MARYS", "loc" : [ -84.39439900000001, 40.543988 ], "pop" : 13066, "state" : "OH" } +{ "_id" : "45886", "city" : "SCOTT", "loc" : [ -84.58445500000001, 40.989238 ], "pop" : 397, "state" : "OH" } +{ "_id" : "45887", "city" : "SPENCERVILLE", "loc" : [ -84.34125, 40.703767 ], "pop" : 5745, "state" : "OH" } +{ "_id" : "45889", "city" : "VAN BUREN", "loc" : [ -83.647302, 41.132691 ], "pop" : 1232, "state" : "OH" } +{ "_id" : "45890", "city" : "VANLUE", "loc" : [ -83.497062, 40.958314 ], "pop" : 901, "state" : "OH" } +{ "_id" : "45891", "city" : "VAN WERT", "loc" : [ -84.59036399999999, 40.868927 ], "pop" : 16625, "state" : "OH" } +{ "_id" : "45894", "city" : "VENEDOCIA", "loc" : [ -84.46204, 40.768454 ], "pop" : 966, "state" : "OH" } +{ "_id" : "45895", "city" : "WAPAKONETA", "loc" : [ -84.177378, 40.568978 ], "pop" : 16364, "state" : "OH" } +{ "_id" : "45896", "city" : "WAYNESFIELD", "loc" : [ -83.95847500000001, 40.607185 ], "pop" : 1648, "state" : "OH" } +{ "_id" : "45898", "city" : "WILLSHIRE", "loc" : [ -84.77773000000001, 40.734618 ], "pop" : 1265, "state" : "OH" } +{ "_id" : "46001", "city" : "ALEXANDRIA", "loc" : [ -85.668148, 40.256081 ], "pop" : 11011, "state" : "IN" } +{ "_id" : "46011", "city" : "ANDERSON", "loc" : [ -85.72530500000001, 40.114577 ], "pop" : 17280, "state" : "IN" } +{ "_id" : "46012", "city" : "ANDERSON", "loc" : [ -85.65359100000001, 40.130947 ], "pop" : 20949, "state" : "IN" } +{ "_id" : "46013", "city" : "ANDERSON", "loc" : [ -85.68007299999999, 40.061865 ], "pop" : 17037, "state" : "IN" } +{ "_id" : "46016", "city" : "ANDERSON", "loc" : [ -85.684566, 40.098799 ], "pop" : 22838, "state" : "IN" } +{ "_id" : "46017", "city" : "CHESTERFIELD", "loc" : [ -85.601493, 40.096431 ], "pop" : 6038, "state" : "IN" } +{ "_id" : "46030", "city" : "ARCADIA", "loc" : [ -86.040882, 40.17758 ], "pop" : 4137, "state" : "IN" } +{ "_id" : "46031", "city" : "ATLANTA", "loc" : [ -85.93394499999999, 40.146964 ], "pop" : 2450, "state" : "IN" } +{ "_id" : "46032", "city" : "CARMEL", "loc" : [ -86.124545, 39.971232 ], "pop" : 40090, "state" : "IN" } +{ "_id" : "46034", "city" : "CICERO", "loc" : [ -86.024844, 40.126781 ], "pop" : 4309, "state" : "IN" } +{ "_id" : "46035", "city" : "COLFAX", "loc" : [ -86.659271, 40.195619 ], "pop" : 1343, "state" : "IN" } +{ "_id" : "46036", "city" : "ELWOOD", "loc" : [ -85.839055, 40.280278 ], "pop" : 13598, "state" : "IN" } +{ "_id" : "46038", "city" : "FISHERS", "loc" : [ -86.023048, 39.957486 ], "pop" : 11918, "state" : "IN" } +{ "_id" : "46039", "city" : "FOREST", "loc" : [ -86.320098, 40.375728 ], "pop" : 879, "state" : "IN" } +{ "_id" : "46040", "city" : "FORTVILLE", "loc" : [ -85.81855400000001, 39.922835 ], "pop" : 5887, "state" : "IN" } +{ "_id" : "46041", "city" : "HILLISBURG", "loc" : [ -86.511387, 40.288404 ], "pop" : 20713, "state" : "IN" } +{ "_id" : "46044", "city" : "FRANKTON", "loc" : [ -85.77911, 40.228548 ], "pop" : 3723, "state" : "IN" } +{ "_id" : "46048", "city" : "INGALLS", "loc" : [ -85.825596, 40.000237 ], "pop" : 763, "state" : "IN" } +{ "_id" : "46049", "city" : "KEMPTON", "loc" : [ -86.1887, 40.275946 ], "pop" : 1501, "state" : "IN" } +{ "_id" : "46050", "city" : "KIRKLIN", "loc" : [ -86.33237200000001, 40.203066 ], "pop" : 2038, "state" : "IN" } +{ "_id" : "46051", "city" : "LAPEL", "loc" : [ -85.84395000000001, 40.085429 ], "pop" : 3221, "state" : "IN" } +{ "_id" : "46052", "city" : "LEBANON", "loc" : [ -86.464074, 40.044894 ], "pop" : 17322, "state" : "IN" } +{ "_id" : "46055", "city" : "MC CORDSVILLE", "loc" : [ -85.909502, 39.901823 ], "pop" : 1450, "state" : "IN" } +{ "_id" : "46056", "city" : "MARKLEVILLE", "loc" : [ -85.622736, 39.994385 ], "pop" : 2957, "state" : "IN" } +{ "_id" : "46057", "city" : "MICHIGANTOWN", "loc" : [ -86.37530599999999, 40.310823 ], "pop" : 2207, "state" : "IN" } +{ "_id" : "46058", "city" : "MULBERRY", "loc" : [ -86.661261, 40.343299 ], "pop" : 1938, "state" : "IN" } +{ "_id" : "46060", "city" : "NOBLESVILLE", "loc" : [ -86.016294, 40.056292 ], "pop" : 26318, "state" : "IN" } +{ "_id" : "46064", "city" : "PENDLETON", "loc" : [ -85.794614, 39.979237 ], "pop" : 13824, "state" : "IN" } +{ "_id" : "46065", "city" : "ROSSVILLE", "loc" : [ -86.607966, 40.410928 ], "pop" : 2217, "state" : "IN" } +{ "_id" : "46068", "city" : "SHARPSVILLE", "loc" : [ -86.10864100000001, 40.373232 ], "pop" : 3570, "state" : "IN" } +{ "_id" : "46069", "city" : "SHERIDAN", "loc" : [ -86.23674099999999, 40.110407 ], "pop" : 7155, "state" : "IN" } +{ "_id" : "46070", "city" : "SUMMITVILLE", "loc" : [ -85.640261, 40.339833 ], "pop" : 1902, "state" : "IN" } +{ "_id" : "46071", "city" : "THORNTOWN", "loc" : [ -86.589822, 40.113335 ], "pop" : 4159, "state" : "IN" } +{ "_id" : "46072", "city" : "TIPTON", "loc" : [ -86.043291, 40.281725 ], "pop" : 8060, "state" : "IN" } +{ "_id" : "46074", "city" : "WESTFIELD", "loc" : [ -86.149907, 40.048868 ], "pop" : 6841, "state" : "IN" } +{ "_id" : "46075", "city" : "WHITESTOWN", "loc" : [ -86.35071600000001, 40.00002 ], "pop" : 1378, "state" : "IN" } +{ "_id" : "46076", "city" : "WINDFALL", "loc" : [ -85.947624, 40.366891 ], "pop" : 1535, "state" : "IN" } +{ "_id" : "46077", "city" : "ZIONSVILLE", "loc" : [ -86.276737, 39.956111 ], "pop" : 9759, "state" : "IN" } +{ "_id" : "46104", "city" : "ARLINGTON", "loc" : [ -85.582775, 39.648791 ], "pop" : 1194, "state" : "IN" } +{ "_id" : "46105", "city" : "BAINBRIDGE", "loc" : [ -86.771119, 39.740664 ], "pop" : 3147, "state" : "IN" } +{ "_id" : "46106", "city" : "BARGERSVILLE", "loc" : [ -86.179687, 39.499989 ], "pop" : 3310, "state" : "IN" } +{ "_id" : "46107", "city" : "BEECH GROVE", "loc" : [ -86.093299, 39.715434 ], "pop" : 13051, "state" : "IN" } +{ "_id" : "46110", "city" : "BOGGSTOWN", "loc" : [ -85.915965, 39.568331 ], "pop" : 958, "state" : "IN" } +{ "_id" : "46112", "city" : "BROWNSBURG", "loc" : [ -86.386933, 39.846605 ], "pop" : 18768, "state" : "IN" } +{ "_id" : "46113", "city" : "CAMBY", "loc" : [ -86.31181100000001, 39.640501 ], "pop" : 2681, "state" : "IN" } +{ "_id" : "46115", "city" : "CARTHAGE", "loc" : [ -85.575382, 39.746627 ], "pop" : 1910, "state" : "IN" } +{ "_id" : "46117", "city" : "CHARLOTTESVILLE", "loc" : [ -85.653599, 39.811981 ], "pop" : 1762, "state" : "IN" } +{ "_id" : "46118", "city" : "CLAYTON", "loc" : [ -86.495921, 39.668154 ], "pop" : 4566, "state" : "IN" } +{ "_id" : "46120", "city" : "CLOVERDALE", "loc" : [ -86.814021, 39.543442 ], "pop" : 7062, "state" : "IN" } +{ "_id" : "46121", "city" : "COATESVILLE", "loc" : [ -86.63144699999999, 39.693041 ], "pop" : 1992, "state" : "IN" } +{ "_id" : "46122", "city" : "DANVILLE", "loc" : [ -86.534254, 39.762815 ], "pop" : 8632, "state" : "IN" } +{ "_id" : "46124", "city" : "EDINBURGH", "loc" : [ -85.97071200000001, 39.362601 ], "pop" : 5115, "state" : "IN" } +{ "_id" : "46126", "city" : "FAIRLAND", "loc" : [ -85.891284, 39.629467 ], "pop" : 6682, "state" : "IN" } +{ "_id" : "46127", "city" : "FALMOUTH", "loc" : [ -85.352423, 39.743617 ], "pop" : 531, "state" : "IN" } +{ "_id" : "46128", "city" : "FILLMORE", "loc" : [ -86.746861, 39.647518 ], "pop" : 1711, "state" : "IN" } +{ "_id" : "46130", "city" : "FOUNTAINTOWN", "loc" : [ -85.78482700000001, 39.675131 ], "pop" : 1555, "state" : "IN" } +{ "_id" : "46131", "city" : "FRANKLIN", "loc" : [ -86.06075199999999, 39.485389 ], "pop" : 14959, "state" : "IN" } +{ "_id" : "46133", "city" : "GLENWOOD", "loc" : [ -85.273532, 39.612436 ], "pop" : 149, "state" : "IN" } +{ "_id" : "46135", "city" : "GREENCASTLE", "loc" : [ -86.86861399999999, 39.649487 ], "pop" : 13300, "state" : "IN" } +{ "_id" : "46140", "city" : "GREENFIELD", "loc" : [ -85.81410200000001, 39.790204 ], "pop" : 28919, "state" : "IN" } +{ "_id" : "46142", "city" : "GREENWOOD", "loc" : [ -86.148993, 39.622398 ], "pop" : 24735, "state" : "IN" } +{ "_id" : "46143", "city" : "GREENWOOD", "loc" : [ -86.13091900000001, 39.596037 ], "pop" : 24633, "state" : "IN" } +{ "_id" : "46147", "city" : "JAMESTOWN", "loc" : [ -86.623561, 39.95789 ], "pop" : 2355, "state" : "IN" } +{ "_id" : "46148", "city" : "KNIGHTSTOWN", "loc" : [ -85.52614800000001, 39.806029 ], "pop" : 3842, "state" : "IN" } +{ "_id" : "46149", "city" : "LIZTON", "loc" : [ -86.542857, 39.884326 ], "pop" : 1586, "state" : "IN" } +{ "_id" : "46150", "city" : "MANILLA", "loc" : [ -85.635369, 39.575711 ], "pop" : 1696, "state" : "IN" } +{ "_id" : "46151", "city" : "CENTERTON", "loc" : [ -86.42901000000001, 39.447646 ], "pop" : 31539, "state" : "IN" } +{ "_id" : "46156", "city" : "MILROY", "loc" : [ -85.50437100000001, 39.495474 ], "pop" : 2154, "state" : "IN" } +{ "_id" : "46157", "city" : "MONROVIA", "loc" : [ -86.48936999999999, 39.571397 ], "pop" : 2205, "state" : "IN" } +{ "_id" : "46158", "city" : "MOORESVILLE", "loc" : [ -86.36417299999999, 39.591469 ], "pop" : 18800, "state" : "IN" } +{ "_id" : "46160", "city" : "MORGANTOWN", "loc" : [ -86.280297, 39.362841 ], "pop" : 2193, "state" : "IN" } +{ "_id" : "46161", "city" : "MORRISTOWN", "loc" : [ -85.69341900000001, 39.667477 ], "pop" : 2215, "state" : "IN" } +{ "_id" : "46162", "city" : "NEEDHAM", "loc" : [ -86.00409399999999, 39.477935 ], "pop" : 2353, "state" : "IN" } +{ "_id" : "46163", "city" : "NEW PALESTINE", "loc" : [ -85.90515000000001, 39.723264 ], "pop" : 3794, "state" : "IN" } +{ "_id" : "46164", "city" : "NINEVEH", "loc" : [ -86.097641, 39.365597 ], "pop" : 3528, "state" : "IN" } +{ "_id" : "46165", "city" : "NORTH SALEM", "loc" : [ -86.63883300000001, 39.867051 ], "pop" : 1541, "state" : "IN" } +{ "_id" : "46166", "city" : "PARAGON", "loc" : [ -86.577867, 39.404203 ], "pop" : 1244, "state" : "IN" } +{ "_id" : "46167", "city" : "PITTSBORO", "loc" : [ -86.46454799999999, 39.861529 ], "pop" : 3466, "state" : "IN" } +{ "_id" : "46168", "city" : "AVON", "loc" : [ -86.395061, 39.716036 ], "pop" : 29182, "state" : "IN" } +{ "_id" : "46171", "city" : "REELSVILLE", "loc" : [ -86.94998, 39.546416 ], "pop" : 2027, "state" : "IN" } +{ "_id" : "46172", "city" : "ROACHDALE", "loc" : [ -86.79022500000001, 39.832545 ], "pop" : 2293, "state" : "IN" } +{ "_id" : "46173", "city" : "RUSHVILLE", "loc" : [ -85.43212, 39.619232 ], "pop" : 11721, "state" : "IN" } +{ "_id" : "46175", "city" : "RUSSELLVILLE", "loc" : [ -86.96697500000001, 39.836598 ], "pop" : 775, "state" : "IN" } +{ "_id" : "46176", "city" : "SHELBYVILLE", "loc" : [ -85.787515, 39.50434 ], "pop" : 24691, "state" : "IN" } +{ "_id" : "46180", "city" : "STILESVILLE", "loc" : [ -86.61819, 39.639113 ], "pop" : 1135, "state" : "IN" } +{ "_id" : "46181", "city" : "TRAFALGAR", "loc" : [ -86.18379299999999, 39.369585 ], "pop" : 3538, "state" : "IN" } +{ "_id" : "46182", "city" : "WALDRON", "loc" : [ -85.664407, 39.468849 ], "pop" : 1878, "state" : "IN" } +{ "_id" : "46184", "city" : "NEW WHITELAND", "loc" : [ -86.093476, 39.555313 ], "pop" : 7226, "state" : "IN" } +{ "_id" : "46186", "city" : "WILKINSON", "loc" : [ -85.61436, 39.895668 ], "pop" : 2567, "state" : "IN" } +{ "_id" : "46201", "city" : "INDIANAPOLIS", "loc" : [ -86.109348, 39.775006 ], "pop" : 42096, "state" : "IN" } +{ "_id" : "46202", "city" : "INDIANAPOLIS", "loc" : [ -86.159502, 39.785063 ], "pop" : 15672, "state" : "IN" } +{ "_id" : "46203", "city" : "INDIANAPOLIS", "loc" : [ -86.117859, 39.743025 ], "pop" : 42566, "state" : "IN" } +{ "_id" : "46204", "city" : "INDIANAPOLIS", "loc" : [ -86.153491, 39.771986 ], "pop" : 4327, "state" : "IN" } +{ "_id" : "46205", "city" : "INDIANAPOLIS", "loc" : [ -86.138582, 39.826761 ], "pop" : 35328, "state" : "IN" } +{ "_id" : "46208", "city" : "INDIANAPOLIS", "loc" : [ -86.179444, 39.829905 ], "pop" : 39610, "state" : "IN" } +{ "_id" : "46214", "city" : "EAGLE CREEK", "loc" : [ -86.289952, 39.792678 ], "pop" : 16644, "state" : "IN" } +{ "_id" : "46216", "city" : "FORT BENJAMIN HA", "loc" : [ -86.016688, 39.857731 ], "pop" : 1566, "state" : "IN" } +{ "_id" : "46217", "city" : "SOUTHPORT", "loc" : [ -86.175394, 39.664141 ], "pop" : 16644, "state" : "IN" } +{ "_id" : "46218", "city" : "INDIANAPOLIS", "loc" : [ -86.10142500000001, 39.80817 ], "pop" : 39965, "state" : "IN" } +{ "_id" : "46219", "city" : "INDIANAPOLIS", "loc" : [ -86.049533, 39.782092 ], "pop" : 38198, "state" : "IN" } +{ "_id" : "46220", "city" : "INDIANAPOLIS", "loc" : [ -86.11815, 39.864685 ], "pop" : 35482, "state" : "IN" } +{ "_id" : "46221", "city" : "INDIANAPOLIS", "loc" : [ -86.19243, 39.750885 ], "pop" : 7920, "state" : "IN" } +{ "_id" : "46222", "city" : "INDIANAPOLIS", "loc" : [ -86.21357399999999, 39.788971 ], "pop" : 39240, "state" : "IN" } +{ "_id" : "46224", "city" : "SPEEDWAY", "loc" : [ -86.25730799999999, 39.798674 ], "pop" : 32130, "state" : "IN" } +{ "_id" : "46225", "city" : "INDIANAPOLIS", "loc" : [ -86.156944, 39.740599 ], "pop" : 8464, "state" : "IN" } +{ "_id" : "46226", "city" : "LAWRENCE", "loc" : [ -86.048945, 39.836969 ], "pop" : 47144, "state" : "IN" } +{ "_id" : "46227", "city" : "SOUTHPORT", "loc" : [ -86.129817, 39.675 ], "pop" : 52257, "state" : "IN" } +{ "_id" : "46229", "city" : "CUMBERLAND", "loc" : [ -85.98382599999999, 39.792219 ], "pop" : 19914, "state" : "IN" } +{ "_id" : "46231", "city" : "BRIDGEPORT", "loc" : [ -86.31828899999999, 39.740637 ], "pop" : 5531, "state" : "IN" } +{ "_id" : "46234", "city" : "CLERMONT", "loc" : [ -86.324117, 39.788438 ], "pop" : 13865, "state" : "IN" } +{ "_id" : "46236", "city" : "OAKLANDON", "loc" : [ -85.98505900000001, 39.849588 ], "pop" : 31475, "state" : "IN" } +{ "_id" : "46237", "city" : "SOUTHPORT", "loc" : [ -86.07890999999999, 39.686777 ], "pop" : 18919, "state" : "IN" } +{ "_id" : "46239", "city" : "WANAMAKER", "loc" : [ -86.00820899999999, 39.721826 ], "pop" : 8611, "state" : "IN" } +{ "_id" : "46240", "city" : "NORA", "loc" : [ -86.129548, 39.9057 ], "pop" : 17553, "state" : "IN" } +{ "_id" : "46241", "city" : "PARK FLETCHER", "loc" : [ -86.250856, 39.723814 ], "pop" : 44731, "state" : "IN" } +{ "_id" : "46250", "city" : "CASTLETON", "loc" : [ -86.069112, 39.9069 ], "pop" : 17196, "state" : "IN" } +{ "_id" : "46254", "city" : "EAGLE CREEK", "loc" : [ -86.2638, 39.841379 ], "pop" : 23015, "state" : "IN" } +{ "_id" : "46256", "city" : "CASTLETON", "loc" : [ -86.023877, 39.90114 ], "pop" : 20589, "state" : "IN" } +{ "_id" : "46259", "city" : "ACTON", "loc" : [ -85.992603, 39.660901 ], "pop" : 3642, "state" : "IN" } +{ "_id" : "46260", "city" : "NORA", "loc" : [ -86.184809, 39.897488 ], "pop" : 29718, "state" : "IN" } +{ "_id" : "46268", "city" : "NEW AUGUSTA", "loc" : [ -86.222104, 39.900296 ], "pop" : 14109, "state" : "IN" } +{ "_id" : "46278", "city" : "NEW AUGUSTA", "loc" : [ -86.291455, 39.883858 ], "pop" : 4727, "state" : "IN" } +{ "_id" : "46280", "city" : "NORA", "loc" : [ -86.13894000000001, 39.938417 ], "pop" : 5281, "state" : "IN" } +{ "_id" : "46290", "city" : "NORA", "loc" : [ -86.167118, 39.93077 ], "pop" : 75, "state" : "IN" } +{ "_id" : "46303", "city" : "EAST CEDAR LAKE", "loc" : [ -87.444509, 41.377338 ], "pop" : 11557, "state" : "IN" } +{ "_id" : "46304", "city" : "PORTER", "loc" : [ -87.050196, 41.603949 ], "pop" : 19024, "state" : "IN" } +{ "_id" : "46307", "city" : "CROWN POINT", "loc" : [ -87.355586, 41.423571 ], "pop" : 37816, "state" : "IN" } +{ "_id" : "46310", "city" : "DEMOTTE", "loc" : [ -87.249129, 41.171319 ], "pop" : 10188, "state" : "IN" } +{ "_id" : "46311", "city" : "DYER", "loc" : [ -87.510803, 41.491976 ], "pop" : 13426, "state" : "IN" } +{ "_id" : "46312", "city" : "EAST CHICAGO", "loc" : [ -87.462734, 41.634893 ], "pop" : 33775, "state" : "IN" } +{ "_id" : "46319", "city" : "GRIFFITH", "loc" : [ -87.422837, 41.53352 ], "pop" : 19758, "state" : "IN" } +{ "_id" : "46320", "city" : "HAMMOND", "loc" : [ -87.50791099999999, 41.609929 ], "pop" : 16636, "state" : "IN" } +{ "_id" : "46321", "city" : "MUNSTER", "loc" : [ -87.50110100000001, 41.554438 ], "pop" : 19906, "state" : "IN" } +{ "_id" : "46322", "city" : "HIGHLAND", "loc" : [ -87.45691100000001, 41.55005 ], "pop" : 24029, "state" : "IN" } +{ "_id" : "46323", "city" : "HAMMOND", "loc" : [ -87.45319600000001, 41.587755 ], "pop" : 23456, "state" : "IN" } +{ "_id" : "46324", "city" : "HAMMOND", "loc" : [ -87.503393, 41.583954 ], "pop" : 23585, "state" : "IN" } +{ "_id" : "46327", "city" : "HAMMOND", "loc" : [ -87.51134999999999, 41.632695 ], "pop" : 12384, "state" : "IN" } +{ "_id" : "46340", "city" : "HANNA", "loc" : [ -86.77592199999999, 41.408767 ], "pop" : 941, "state" : "IN" } +{ "_id" : "46341", "city" : "HEBRON", "loc" : [ -87.20879100000001, 41.315537 ], "pop" : 6230, "state" : "IN" } +{ "_id" : "46342", "city" : "HOBART", "loc" : [ -87.252499, 41.526281 ], "pop" : 32127, "state" : "IN" } +{ "_id" : "46347", "city" : "KOUTS", "loc" : [ -87.02404300000001, 41.309085 ], "pop" : 3244, "state" : "IN" } +{ "_id" : "46348", "city" : "LA CROSSE", "loc" : [ -86.868216, 41.315709 ], "pop" : 1352, "state" : "IN" } +{ "_id" : "46349", "city" : "LAKE VILLAGE", "loc" : [ -87.44542199999999, 41.138741 ], "pop" : 2208, "state" : "IN" } +{ "_id" : "46350", "city" : "LA PORTE", "loc" : [ -86.70765400000001, 41.599438 ], "pop" : 36301, "state" : "IN" } +{ "_id" : "46356", "city" : "LOWELL", "loc" : [ -87.419072, 41.284531 ], "pop" : 12579, "state" : "IN" } +{ "_id" : "46360", "city" : "MICHIGAN CITY", "loc" : [ -86.869899, 41.698031 ], "pop" : 55392, "state" : "IN" } +{ "_id" : "46365", "city" : "MILL CREEK", "loc" : [ -86.547247, 41.556102 ], "pop" : 2091, "state" : "IN" } +{ "_id" : "46366", "city" : "NORTH JUDSON", "loc" : [ -86.696601, 41.224372 ], "pop" : 8426, "state" : "IN" } +{ "_id" : "46368", "city" : "PORTAGE", "loc" : [ -87.17568900000001, 41.567201 ], "pop" : 40860, "state" : "IN" } +{ "_id" : "46371", "city" : "ROLLING PRAIRIE", "loc" : [ -86.584092, 41.72286 ], "pop" : 3694, "state" : "IN" } +{ "_id" : "46373", "city" : "SAINT JOHN", "loc" : [ -87.476376, 41.44949 ], "pop" : 4786, "state" : "IN" } +{ "_id" : "46374", "city" : "SAN PIERRE", "loc" : [ -86.87253200000001, 41.21108 ], "pop" : 1499, "state" : "IN" } +{ "_id" : "46375", "city" : "SCHERERVILLE", "loc" : [ -87.460532, 41.492233 ], "pop" : 14152, "state" : "IN" } +{ "_id" : "46382", "city" : "UNION MILLS", "loc" : [ -86.83551199999999, 41.460236 ], "pop" : 3155, "state" : "IN" } +{ "_id" : "46383", "city" : "VALPARAISO", "loc" : [ -87.075866, 41.475661 ], "pop" : 53439, "state" : "IN" } +{ "_id" : "46390", "city" : "WANATAH", "loc" : [ -86.876439, 41.384477 ], "pop" : 711, "state" : "IN" } +{ "_id" : "46391", "city" : "WESTVILLE", "loc" : [ -86.90131700000001, 41.536516 ], "pop" : 6212, "state" : "IN" } +{ "_id" : "46392", "city" : "WHEATFIELD", "loc" : [ -87.06987599999999, 41.177948 ], "pop" : 5415, "state" : "IN" } +{ "_id" : "46394", "city" : "WHITING", "loc" : [ -87.50053699999999, 41.678656 ], "pop" : 13157, "state" : "IN" } +{ "_id" : "46402", "city" : "GARY", "loc" : [ -87.338548, 41.599711 ], "pop" : 10873, "state" : "IN" } +{ "_id" : "46403", "city" : "GARY", "loc" : [ -87.258984, 41.603612 ], "pop" : 16489, "state" : "IN" } +{ "_id" : "46404", "city" : "GARY", "loc" : [ -87.373153, 41.589937 ], "pop" : 23031, "state" : "IN" } +{ "_id" : "46405", "city" : "LAKE STATION", "loc" : [ -87.262209, 41.568629 ], "pop" : 12437, "state" : "IN" } +{ "_id" : "46406", "city" : "GARY", "loc" : [ -87.40621, 41.587806 ], "pop" : 15132, "state" : "IN" } +{ "_id" : "46407", "city" : "GARY", "loc" : [ -87.334958, 41.580429 ], "pop" : 21360, "state" : "IN" } +{ "_id" : "46408", "city" : "GARY", "loc" : [ -87.35883, 41.542178 ], "pop" : 21586, "state" : "IN" } +{ "_id" : "46409", "city" : "GARY", "loc" : [ -87.32712600000001, 41.541247 ], "pop" : 14119, "state" : "IN" } +{ "_id" : "46410", "city" : "MERRILLVILLE", "loc" : [ -87.350932, 41.4957 ], "pop" : 30765, "state" : "IN" } +{ "_id" : "46501", "city" : "ARGOS", "loc" : [ -86.250573, 41.230827 ], "pop" : 3630, "state" : "IN" } +{ "_id" : "46504", "city" : "BOURBON", "loc" : [ -86.11743800000001, 41.309785 ], "pop" : 2976, "state" : "IN" } +{ "_id" : "46506", "city" : "BREMEN", "loc" : [ -86.19323, 41.446701 ], "pop" : 13832, "state" : "IN" } +{ "_id" : "46507", "city" : "BRISTOL", "loc" : [ -85.82619200000001, 41.716885 ], "pop" : 7086, "state" : "IN" } +{ "_id" : "46510", "city" : "CLAYPOOL", "loc" : [ -85.868571, 41.116497 ], "pop" : 4891, "state" : "IN" } +{ "_id" : "46511", "city" : "CULVER MILITARY", "loc" : [ -86.412888, 41.22307 ], "pop" : 3289, "state" : "IN" } +{ "_id" : "46514", "city" : "ELKHART", "loc" : [ -85.972949, 41.710083 ], "pop" : 33830, "state" : "IN" } +{ "_id" : "46516", "city" : "ELKHART", "loc" : [ -85.962137, 41.676333 ], "pop" : 29971, "state" : "IN" } +{ "_id" : "46517", "city" : "ELKHART", "loc" : [ -85.972849, 41.646922 ], "pop" : 17983, "state" : "IN" } +{ "_id" : "46524", "city" : "ETNA GREEN", "loc" : [ -86.034995, 41.291789 ], "pop" : 1290, "state" : "IN" } +{ "_id" : "46526", "city" : "FORAKER", "loc" : [ -85.837988, 41.584484 ], "pop" : 41317, "state" : "IN" } +{ "_id" : "46530", "city" : "GRANGER", "loc" : [ -86.141104, 41.742704 ], "pop" : 17591, "state" : "IN" } +{ "_id" : "46531", "city" : "GROVERTOWN", "loc" : [ -86.52890499999999, 41.321969 ], "pop" : 1077, "state" : "IN" } +{ "_id" : "46532", "city" : "HAMLET", "loc" : [ -86.53213, 41.393338 ], "pop" : 4314, "state" : "IN" } +{ "_id" : "46534", "city" : "OBER", "loc" : [ -86.610715, 41.29006 ], "pop" : 7437, "state" : "IN" } +{ "_id" : "46536", "city" : "LAKEVILLE", "loc" : [ -86.27144, 41.525328 ], "pop" : 3355, "state" : "IN" } +{ "_id" : "46538", "city" : "LEESBURG", "loc" : [ -85.816028, 41.326592 ], "pop" : 1823, "state" : "IN" } +{ "_id" : "46539", "city" : "MENTONE", "loc" : [ -86.029918, 41.161494 ], "pop" : 2163, "state" : "IN" } +{ "_id" : "46540", "city" : "MIDDLEBURY", "loc" : [ -85.711443, 41.675415 ], "pop" : 7737, "state" : "IN" } +{ "_id" : "46542", "city" : "MILFORD", "loc" : [ -85.85543800000001, 41.401141 ], "pop" : 4861, "state" : "IN" } +{ "_id" : "46543", "city" : "MILLERSBURG", "loc" : [ -85.707249, 41.533513 ], "pop" : 2078, "state" : "IN" } +{ "_id" : "46544", "city" : "MISHAWAKA", "loc" : [ -86.162301, 41.650659 ], "pop" : 29911, "state" : "IN" } +{ "_id" : "46545", "city" : "MISHAWAKA", "loc" : [ -86.168232, 41.683498 ], "pop" : 23031, "state" : "IN" } +{ "_id" : "46550", "city" : "NAPPANEE", "loc" : [ -85.994534, 41.449297 ], "pop" : 10640, "state" : "IN" } +{ "_id" : "46552", "city" : "NEW CARLISLE", "loc" : [ -86.48382700000001, 41.705115 ], "pop" : 3574, "state" : "IN" } +{ "_id" : "46553", "city" : "NEW PARIS", "loc" : [ -85.83383000000001, 41.491652 ], "pop" : 2723, "state" : "IN" } +{ "_id" : "46554", "city" : "NORTH LIBERTY", "loc" : [ -86.41332800000001, 41.542507 ], "pop" : 4056, "state" : "IN" } +{ "_id" : "46555", "city" : "NORTH WEBSTER", "loc" : [ -85.70787199999999, 41.308423 ], "pop" : 6197, "state" : "IN" } +{ "_id" : "46556", "city" : "SAINT MARYS", "loc" : [ -86.242893, 41.70057 ], "pop" : 6903, "state" : "IN" } +{ "_id" : "46561", "city" : "OSCEOLA", "loc" : [ -86.078883, 41.674074 ], "pop" : 8029, "state" : "IN" } +{ "_id" : "46562", "city" : "PIERCETON", "loc" : [ -85.706119, 41.212406 ], "pop" : 3128, "state" : "IN" } +{ "_id" : "46563", "city" : "INWOOD", "loc" : [ -86.32408700000001, 41.333897 ], "pop" : 16087, "state" : "IN" } +{ "_id" : "46565", "city" : "SHIPSHEWANA", "loc" : [ -85.593198, 41.663257 ], "pop" : 3850, "state" : "IN" } +{ "_id" : "46567", "city" : "SYRACUSE", "loc" : [ -85.718352, 41.40649 ], "pop" : 7695, "state" : "IN" } +{ "_id" : "46570", "city" : "TIPPECANOE", "loc" : [ -86.10950800000001, 41.216609 ], "pop" : 1188, "state" : "IN" } +{ "_id" : "46571", "city" : "TOPEKA", "loc" : [ -85.531668, 41.563441 ], "pop" : 5749, "state" : "IN" } +{ "_id" : "46573", "city" : "WAKARUSA", "loc" : [ -86.02052399999999, 41.540073 ], "pop" : 2776, "state" : "IN" } +{ "_id" : "46574", "city" : "WALKERTON", "loc" : [ -86.451018, 41.445748 ], "pop" : 5279, "state" : "IN" } +{ "_id" : "46580", "city" : "WARSAW", "loc" : [ -85.85078, 41.24377 ], "pop" : 22851, "state" : "IN" } +{ "_id" : "46590", "city" : "WINONA LAKE", "loc" : [ -85.83053099999999, 41.211007 ], "pop" : 7559, "state" : "IN" } +{ "_id" : "46601", "city" : "SOUTH BEND", "loc" : [ -86.253489, 41.672699 ], "pop" : 5479, "state" : "IN" } +{ "_id" : "46613", "city" : "SOUTH BEND", "loc" : [ -86.247865, 41.654636 ], "pop" : 11827, "state" : "IN" } +{ "_id" : "46614", "city" : "SOUTH BEND", "loc" : [ -86.243278, 41.625461 ], "pop" : 27521, "state" : "IN" } +{ "_id" : "46615", "city" : "SOUTH BEND", "loc" : [ -86.210375, 41.67413 ], "pop" : 15580, "state" : "IN" } +{ "_id" : "46616", "city" : "SOUTH BEND", "loc" : [ -86.26473900000001, 41.691894 ], "pop" : 8132, "state" : "IN" } +{ "_id" : "46617", "city" : "SOUTH BEND", "loc" : [ -86.2351, 41.684966 ], "pop" : 11057, "state" : "IN" } +{ "_id" : "46619", "city" : "SOUTH BEND", "loc" : [ -86.31526599999999, 41.667397 ], "pop" : 19880, "state" : "IN" } +{ "_id" : "46628", "city" : "SOUTH BEND", "loc" : [ -86.294929, 41.701525 ], "pop" : 24914, "state" : "IN" } +{ "_id" : "46635", "city" : "SOUTH BEND", "loc" : [ -86.20780600000001, 41.716768 ], "pop" : 6989, "state" : "IN" } +{ "_id" : "46637", "city" : "SOUTH BEND", "loc" : [ -86.240694, 41.729936 ], "pop" : 16351, "state" : "IN" } +{ "_id" : "46701", "city" : "ALBION", "loc" : [ -85.41418299999999, 41.348217 ], "pop" : 6907, "state" : "IN" } +{ "_id" : "46702", "city" : "ANDREWS", "loc" : [ -85.60672599999999, 40.861792 ], "pop" : 2138, "state" : "IN" } +{ "_id" : "46703", "city" : "ANGOLA", "loc" : [ -85.019803, 41.656321 ], "pop" : 15134, "state" : "IN" } +{ "_id" : "46705", "city" : "ASHLEY", "loc" : [ -85.05038500000001, 41.534651 ], "pop" : 1272, "state" : "IN" } +{ "_id" : "46706", "city" : "AUBURN", "loc" : [ -85.046848, 41.359001 ], "pop" : 12503, "state" : "IN" } +{ "_id" : "46710", "city" : "AVILLA", "loc" : [ -85.241418, 41.36894 ], "pop" : 2154, "state" : "IN" } +{ "_id" : "46711", "city" : "LINN GROVE", "loc" : [ -84.934271, 40.661517 ], "pop" : 6577, "state" : "IN" } +{ "_id" : "46714", "city" : "BLUFFTON", "loc" : [ -85.162199, 40.736837 ], "pop" : 14669, "state" : "IN" } +{ "_id" : "46721", "city" : "BUTLER", "loc" : [ -84.878716, 41.42873 ], "pop" : 5982, "state" : "IN" } +{ "_id" : "46723", "city" : "CHURUBUSCO", "loc" : [ -85.324364, 41.228988 ], "pop" : 6796, "state" : "IN" } +{ "_id" : "46725", "city" : "COLUMBIA CITY", "loc" : [ -85.473736, 41.161855 ], "pop" : 17282, "state" : "IN" } +{ "_id" : "46730", "city" : "CORUNNA", "loc" : [ -85.137028, 41.450377 ], "pop" : 2373, "state" : "IN" } +{ "_id" : "46731", "city" : "CRAIGVILLE", "loc" : [ -85.090379, 40.793034 ], "pop" : 323, "state" : "IN" } +{ "_id" : "46732", "city" : "CROMWELL", "loc" : [ -85.603133, 41.37514 ], "pop" : 2872, "state" : "IN" } +{ "_id" : "46733", "city" : "DECATUR", "loc" : [ -84.931432, 40.827333 ], "pop" : 19069, "state" : "IN" } +{ "_id" : "46737", "city" : "FREMONT", "loc" : [ -84.94524699999999, 41.733125 ], "pop" : 4248, "state" : "IN" } +{ "_id" : "46738", "city" : "GARRETT", "loc" : [ -85.13467, 41.348216 ], "pop" : 6459, "state" : "IN" } +{ "_id" : "46740", "city" : "GENEVA", "loc" : [ -84.962074, 40.607129 ], "pop" : 3676, "state" : "IN" } +{ "_id" : "46741", "city" : "GRABILL", "loc" : [ -84.94059300000001, 41.210753 ], "pop" : 4267, "state" : "IN" } +{ "_id" : "46742", "city" : "HAMILTON", "loc" : [ -84.89509200000001, 41.5566 ], "pop" : 2344, "state" : "IN" } +{ "_id" : "46743", "city" : "HARLAN", "loc" : [ -84.838635, 41.228468 ], "pop" : 653, "state" : "IN" } +{ "_id" : "46745", "city" : "HOAGLAND", "loc" : [ -85.00751, 40.952375 ], "pop" : 1483, "state" : "IN" } +{ "_id" : "46746", "city" : "HOWE", "loc" : [ -85.472746, 41.728594 ], "pop" : 6040, "state" : "IN" } +{ "_id" : "46747", "city" : "HELMER", "loc" : [ -85.141953, 41.559887 ], "pop" : 2012, "state" : "IN" } +{ "_id" : "46748", "city" : "HUNTERTOWN", "loc" : [ -85.16772400000001, 41.239113 ], "pop" : 2265, "state" : "IN" } +{ "_id" : "46750", "city" : "HUNTINGTON", "loc" : [ -85.505438, 40.881128 ], "pop" : 23716, "state" : "IN" } +{ "_id" : "46755", "city" : "KENDALLVILLE", "loc" : [ -85.260874, 41.448206 ], "pop" : 11784, "state" : "IN" } +{ "_id" : "46759", "city" : "KEYSTONE", "loc" : [ -85.276748, 40.589667 ], "pop" : 518, "state" : "IN" } +{ "_id" : "46760", "city" : "KIMMELL", "loc" : [ -85.51873399999999, 41.363103 ], "pop" : 2095, "state" : "IN" } +{ "_id" : "46761", "city" : "LAGRANGE", "loc" : [ -85.40401, 41.652008 ], "pop" : 8410, "state" : "IN" } +{ "_id" : "46763", "city" : "LAOTTO", "loc" : [ -85.19008599999999, 41.299119 ], "pop" : 3483, "state" : "IN" } +{ "_id" : "46764", "city" : "LARWILL", "loc" : [ -85.61386899999999, 41.164623 ], "pop" : 1496, "state" : "IN" } +{ "_id" : "46765", "city" : "LEO", "loc" : [ -85.03009299999999, 41.224864 ], "pop" : 3047, "state" : "IN" } +{ "_id" : "46766", "city" : "LIBERTY CENTER", "loc" : [ -85.277411, 40.700159 ], "pop" : 1027, "state" : "IN" } +{ "_id" : "46767", "city" : "LIGONIER", "loc" : [ -85.59272, 41.466175 ], "pop" : 5212, "state" : "IN" } +{ "_id" : "46770", "city" : "MARKLE", "loc" : [ -85.373994, 40.837972 ], "pop" : 3084, "state" : "IN" } +{ "_id" : "46772", "city" : "MONROE", "loc" : [ -84.844128, 40.700523 ], "pop" : 873, "state" : "IN" } +{ "_id" : "46773", "city" : "MONROEVILLE", "loc" : [ -84.89373000000001, 40.987044 ], "pop" : 4093, "state" : "IN" } +{ "_id" : "46774", "city" : "NEW HAVEN", "loc" : [ -85.01173, 41.069856 ], "pop" : 12742, "state" : "IN" } +{ "_id" : "46776", "city" : "ORLAND", "loc" : [ -85.146512, 41.730884 ], "pop" : 1326, "state" : "IN" } +{ "_id" : "46777", "city" : "OSSIAN", "loc" : [ -85.15704100000001, 40.880611 ], "pop" : 5394, "state" : "IN" } +{ "_id" : "46779", "city" : "PLEASANT LAKE", "loc" : [ -85.021276, 41.584255 ], "pop" : 1625, "state" : "IN" } +{ "_id" : "46781", "city" : "PONETO", "loc" : [ -85.25618799999999, 40.641871 ], "pop" : 709, "state" : "IN" } +{ "_id" : "46783", "city" : "ROANOKE", "loc" : [ -85.35263, 40.960003 ], "pop" : 4973, "state" : "IN" } +{ "_id" : "46784", "city" : "ROME CITY", "loc" : [ -85.374303, 41.484907 ], "pop" : 3040, "state" : "IN" } +{ "_id" : "46785", "city" : "SAINT JOE", "loc" : [ -84.90425, 41.324049 ], "pop" : 1161, "state" : "IN" } +{ "_id" : "46787", "city" : "SOUTH WHITLEY", "loc" : [ -85.61425199999999, 41.072635 ], "pop" : 3791, "state" : "IN" } +{ "_id" : "46788", "city" : "SPENCERVILLE", "loc" : [ -84.93975, 41.269555 ], "pop" : 1905, "state" : "IN" } +{ "_id" : "46791", "city" : "UNIONDALE", "loc" : [ -85.273206, 40.871658 ], "pop" : 2419, "state" : "IN" } +{ "_id" : "46792", "city" : "WARREN", "loc" : [ -85.41833699999999, 40.688646 ], "pop" : 2404, "state" : "IN" } +{ "_id" : "46793", "city" : "WATERLOO", "loc" : [ -85.022103, 41.440216 ], "pop" : 3802, "state" : "IN" } +{ "_id" : "46794", "city" : "WAWAKA", "loc" : [ -85.48042700000001, 41.483251 ], "pop" : 1545, "state" : "IN" } +{ "_id" : "46795", "city" : "WOLCOTTVILLE", "loc" : [ -85.314986, 41.556972 ], "pop" : 5921, "state" : "IN" } +{ "_id" : "46797", "city" : "WOODBURN", "loc" : [ -84.892871, 41.136102 ], "pop" : 5044, "state" : "IN" } +{ "_id" : "46798", "city" : "YODER", "loc" : [ -85.19582800000001, 40.937059 ], "pop" : 691, "state" : "IN" } +{ "_id" : "46802", "city" : "FORT WAYNE", "loc" : [ -85.15431, 41.070717 ], "pop" : 10837, "state" : "IN" } +{ "_id" : "46803", "city" : "FORT WAYNE", "loc" : [ -85.10736199999999, 41.069452 ], "pop" : 13295, "state" : "IN" } +{ "_id" : "46804", "city" : "FORT WAYNE", "loc" : [ -85.256013, 41.050843 ], "pop" : 23713, "state" : "IN" } +{ "_id" : "46805", "city" : "FORT WAYNE", "loc" : [ -85.118865, 41.097663 ], "pop" : 22657, "state" : "IN" } +{ "_id" : "46806", "city" : "FORT WAYNE", "loc" : [ -85.113496, 41.047988 ], "pop" : 28184, "state" : "IN" } +{ "_id" : "46807", "city" : "FORT WAYNE", "loc" : [ -85.14616700000001, 41.049054 ], "pop" : 18346, "state" : "IN" } +{ "_id" : "46808", "city" : "FORT WAYNE", "loc" : [ -85.162121, 41.093877 ], "pop" : 19401, "state" : "IN" } +{ "_id" : "46809", "city" : "FORT WAYNE", "loc" : [ -85.18340000000001, 41.02543 ], "pop" : 9804, "state" : "IN" } +{ "_id" : "46815", "city" : "FORT WAYNE", "loc" : [ -85.062397, 41.105318 ], "pop" : 25377, "state" : "IN" } +{ "_id" : "46816", "city" : "FORT WAYNE", "loc" : [ -85.097573, 41.016519 ], "pop" : 15507, "state" : "IN" } +{ "_id" : "46818", "city" : "FORT WAYNE", "loc" : [ -85.206686, 41.146847 ], "pop" : 10155, "state" : "IN" } +{ "_id" : "46819", "city" : "FORT WAYNE", "loc" : [ -85.152743, 41.005167 ], "pop" : 9139, "state" : "IN" } +{ "_id" : "46825", "city" : "FORT WAYNE", "loc" : [ -85.12315599999999, 41.146482 ], "pop" : 19522, "state" : "IN" } +{ "_id" : "46835", "city" : "FORT WAYNE", "loc" : [ -85.06853099999999, 41.137051 ], "pop" : 26758, "state" : "IN" } +{ "_id" : "46845", "city" : "FORT WAYNE", "loc" : [ -85.119088, 41.195783 ], "pop" : 9168, "state" : "IN" } +{ "_id" : "46901", "city" : "KOKOMO", "loc" : [ -86.145273, 40.49884 ], "pop" : 37261, "state" : "IN" } +{ "_id" : "46902", "city" : "KOKOMO", "loc" : [ -86.135227, 40.450856 ], "pop" : 36889, "state" : "IN" } +{ "_id" : "46910", "city" : "AKRON", "loc" : [ -86.03947100000001, 41.038921 ], "pop" : 2617, "state" : "IN" } +{ "_id" : "46911", "city" : "AMBOY", "loc" : [ -85.949726, 40.610505 ], "pop" : 1555, "state" : "IN" } +{ "_id" : "46913", "city" : "BRINGHURST", "loc" : [ -86.520369, 40.516294 ], "pop" : 212, "state" : "IN" } +{ "_id" : "46914", "city" : "BUNKER HILL", "loc" : [ -86.09614999999999, 40.642267 ], "pop" : 3073, "state" : "IN" } +{ "_id" : "46917", "city" : "CAMDEN", "loc" : [ -86.51521700000001, 40.599588 ], "pop" : 1527, "state" : "IN" } +{ "_id" : "46919", "city" : "CONVERSE", "loc" : [ -85.876299, 40.577031 ], "pop" : 1353, "state" : "IN" } +{ "_id" : "46920", "city" : "CUTLER", "loc" : [ -86.446172, 40.4785 ], "pop" : 2495, "state" : "IN" } +{ "_id" : "46923", "city" : "DELPHI", "loc" : [ -86.678849, 40.57339 ], "pop" : 7576, "state" : "IN" } +{ "_id" : "46926", "city" : "CHILI", "loc" : [ -86.076953, 40.869363 ], "pop" : 5339, "state" : "IN" } +{ "_id" : "46928", "city" : "FAIRMOUNT", "loc" : [ -85.67132700000001, 40.418755 ], "pop" : 6230, "state" : "IN" } +{ "_id" : "46929", "city" : "FLORA", "loc" : [ -86.501572, 40.544467 ], "pop" : 3249, "state" : "IN" } +{ "_id" : "46932", "city" : "GALVESTON", "loc" : [ -86.1972, 40.586249 ], "pop" : 3059, "state" : "IN" } +{ "_id" : "46933", "city" : "GAS CITY", "loc" : [ -85.60553299999999, 40.487895 ], "pop" : 6975, "state" : "IN" } +{ "_id" : "46936", "city" : "GREENTOWN", "loc" : [ -85.958195, 40.479096 ], "pop" : 5785, "state" : "IN" } +{ "_id" : "46938", "city" : "JONESBORO", "loc" : [ -85.63649599999999, 40.481456 ], "pop" : 3989, "state" : "IN" } +{ "_id" : "46939", "city" : "KEWANNA", "loc" : [ -86.40605499999999, 41.008706 ], "pop" : 1966, "state" : "IN" } +{ "_id" : "46940", "city" : "LA FONTAINE", "loc" : [ -85.697138, 40.690896 ], "pop" : 2947, "state" : "IN" } +{ "_id" : "46941", "city" : "LAGRO", "loc" : [ -85.72044699999999, 40.819897 ], "pop" : 2255, "state" : "IN" } +{ "_id" : "46947", "city" : "LOGANSPORT", "loc" : [ -86.359888, 40.760377 ], "pop" : 27829, "state" : "IN" } +{ "_id" : "46950", "city" : "LUCERNE", "loc" : [ -86.407726, 40.861434 ], "pop" : 809, "state" : "IN" } +{ "_id" : "46951", "city" : "MACY", "loc" : [ -86.126428, 40.961838 ], "pop" : 633, "state" : "IN" } +{ "_id" : "46952", "city" : "MARION", "loc" : [ -85.674127, 40.574333 ], "pop" : 24986, "state" : "IN" } +{ "_id" : "46953", "city" : "MARION", "loc" : [ -85.661624, 40.53592 ], "pop" : 22079, "state" : "IN" } +{ "_id" : "46960", "city" : "MONTEREY", "loc" : [ -86.51786199999999, 41.138334 ], "pop" : 997, "state" : "IN" } +{ "_id" : "46962", "city" : "NORTH MANCHESTER", "loc" : [ -85.784184, 40.998603 ], "pop" : 10772, "state" : "IN" } +{ "_id" : "46970", "city" : "PERU", "loc" : [ -86.068044, 40.749203 ], "pop" : 19549, "state" : "IN" } +{ "_id" : "46971", "city" : "GRISSOM AIR FORC", "loc" : [ -86.14729199999999, 40.663546 ], "pop" : 4364, "state" : "IN" } +{ "_id" : "46974", "city" : "ROANN", "loc" : [ -85.88988500000001, 40.906649 ], "pop" : 1612, "state" : "IN" } +{ "_id" : "46975", "city" : "ROCHESTER", "loc" : [ -86.23100700000001, 41.065493 ], "pop" : 14259, "state" : "IN" } +{ "_id" : "46978", "city" : "ROYAL CENTER", "loc" : [ -86.507751, 40.864499 ], "pop" : 1558, "state" : "IN" } +{ "_id" : "46979", "city" : "RUSSIAVILLE", "loc" : [ -86.267467, 40.415086 ], "pop" : 1724, "state" : "IN" } +{ "_id" : "46982", "city" : "SILVER LAKE", "loc" : [ -85.87920699999999, 41.074318 ], "pop" : 1566, "state" : "IN" } +{ "_id" : "46985", "city" : "STAR CITY", "loc" : [ -86.54040500000001, 40.960176 ], "pop" : 951, "state" : "IN" } +{ "_id" : "46986", "city" : "SWAYZEE", "loc" : [ -85.826542, 40.511199 ], "pop" : 1891, "state" : "IN" } +{ "_id" : "46988", "city" : "TWELVE MILE", "loc" : [ -86.21259499999999, 40.854661 ], "pop" : 873, "state" : "IN" } +{ "_id" : "46989", "city" : "UPLAND", "loc" : [ -85.499049, 40.454841 ], "pop" : 6027, "state" : "IN" } +{ "_id" : "46990", "city" : "URBANA", "loc" : [ -85.748481, 40.898655 ], "pop" : 505, "state" : "IN" } +{ "_id" : "46991", "city" : "LANDESS", "loc" : [ -85.481891, 40.63199 ], "pop" : 3670, "state" : "IN" } +{ "_id" : "46992", "city" : "WABASH", "loc" : [ -85.83212399999999, 40.790947 ], "pop" : 17371, "state" : "IN" } +{ "_id" : "46994", "city" : "WALTON", "loc" : [ -86.280501, 40.677225 ], "pop" : 4935, "state" : "IN" } +{ "_id" : "46996", "city" : "WINAMAC", "loc" : [ -86.630697, 41.056242 ], "pop" : 6857, "state" : "IN" } +{ "_id" : "47001", "city" : "AURORA", "loc" : [ -84.945188, 39.071897 ], "pop" : 9435, "state" : "IN" } +{ "_id" : "47006", "city" : "BATESVILLE", "loc" : [ -85.222053, 39.300057 ], "pop" : 6963, "state" : "IN" } +{ "_id" : "47010", "city" : "BATH", "loc" : [ -84.836007, 39.499237 ], "pop" : 197, "state" : "IN" } +{ "_id" : "47011", "city" : "BENNINGTON", "loc" : [ -85.07189700000001, 38.875993 ], "pop" : 1376, "state" : "IN" } +{ "_id" : "47012", "city" : "BROOKVILLE", "loc" : [ -84.99942299999999, 39.421305 ], "pop" : 9204, "state" : "IN" } +{ "_id" : "47016", "city" : "CEDAR GROVE", "loc" : [ -84.892402, 39.345891 ], "pop" : 1522, "state" : "IN" } +{ "_id" : "47017", "city" : "CROSS PLAINS", "loc" : [ -85.21221, 38.949046 ], "pop" : 802, "state" : "IN" } +{ "_id" : "47018", "city" : "DILLSBORO", "loc" : [ -85.05499399999999, 38.996195 ], "pop" : 3699, "state" : "IN" } +{ "_id" : "47020", "city" : "FLORENCE", "loc" : [ -84.93987199999999, 38.822436 ], "pop" : 1019, "state" : "IN" } +{ "_id" : "47021", "city" : "FRIENDSHIP", "loc" : [ -85.215296, 39.114591 ], "pop" : 218, "state" : "IN" } +{ "_id" : "47022", "city" : "GUILFORD", "loc" : [ -84.961586, 39.205855 ], "pop" : 2595, "state" : "IN" } +{ "_id" : "47023", "city" : "HOLTON", "loc" : [ -85.37394500000001, 39.049817 ], "pop" : 2384, "state" : "IN" } +{ "_id" : "47024", "city" : "LAUREL", "loc" : [ -85.208044, 39.491573 ], "pop" : 3041, "state" : "IN" } +{ "_id" : "47025", "city" : "LAWRENCEBURG", "loc" : [ -84.865819, 39.140123 ], "pop" : 15358, "state" : "IN" } +{ "_id" : "47030", "city" : "METAMORA", "loc" : [ -85.15044, 39.428775 ], "pop" : 1085, "state" : "IN" } +{ "_id" : "47031", "city" : "MILAN", "loc" : [ -85.13242, 39.150333 ], "pop" : 3877, "state" : "IN" } +{ "_id" : "47032", "city" : "MOORES HILL", "loc" : [ -85.063806, 39.094459 ], "pop" : 2729, "state" : "IN" } +{ "_id" : "47036", "city" : "OLDENBURG", "loc" : [ -85.22223, 39.359797 ], "pop" : 1398, "state" : "IN" } +{ "_id" : "47037", "city" : "OSGOOD", "loc" : [ -85.293812, 39.157342 ], "pop" : 4785, "state" : "IN" } +{ "_id" : "47038", "city" : "PATRIOT", "loc" : [ -84.85154300000001, 38.853691 ], "pop" : 1265, "state" : "IN" } +{ "_id" : "47040", "city" : "RISING SUN", "loc" : [ -84.88067599999999, 38.956667 ], "pop" : 4500, "state" : "IN" } +{ "_id" : "47041", "city" : "SUNMAN", "loc" : [ -85.11592899999999, 39.262307 ], "pop" : 4719, "state" : "IN" } +{ "_id" : "47042", "city" : "VERSAILLES", "loc" : [ -85.223489, 39.051074 ], "pop" : 4753, "state" : "IN" } +{ "_id" : "47043", "city" : "VEVAY", "loc" : [ -85.085217, 38.772423 ], "pop" : 3974, "state" : "IN" } +{ "_id" : "47060", "city" : "W HARRISON", "loc" : [ -84.878027, 39.266727 ], "pop" : 5338, "state" : "IN" } +{ "_id" : "47102", "city" : "AUSTIN", "loc" : [ -85.796188, 38.747801 ], "pop" : 6713, "state" : "IN" } +{ "_id" : "47106", "city" : "BORDEN", "loc" : [ -85.92147300000001, 38.436171 ], "pop" : 4080, "state" : "IN" } +{ "_id" : "47108", "city" : "CAMPBELLSBURG", "loc" : [ -86.235846, 38.669037 ], "pop" : 2900, "state" : "IN" } +{ "_id" : "47110", "city" : "CENTRAL", "loc" : [ -86.19738099999999, 38.094543 ], "pop" : 779, "state" : "IN" } +{ "_id" : "47111", "city" : "CHARLESTOWN", "loc" : [ -85.660614, 38.456778 ], "pop" : 9896, "state" : "IN" } +{ "_id" : "47112", "city" : "CORYDON", "loc" : [ -86.114465, 38.218865 ], "pop" : 10928, "state" : "IN" } +{ "_id" : "47114", "city" : "CRANDALL", "loc" : [ -86.069804, 38.28927 ], "pop" : 239, "state" : "IN" } +{ "_id" : "47115", "city" : "DEPAUW", "loc" : [ -86.210857, 38.336078 ], "pop" : 3269, "state" : "IN" } +{ "_id" : "47116", "city" : "ECKERTY", "loc" : [ -86.60593900000001, 38.318548 ], "pop" : 971, "state" : "IN" } +{ "_id" : "47117", "city" : "ELIZABETH", "loc" : [ -85.95887399999999, 38.124389 ], "pop" : 3273, "state" : "IN" } +{ "_id" : "47118", "city" : "ENGLISH", "loc" : [ -86.442875, 38.325807 ], "pop" : 3424, "state" : "IN" } +{ "_id" : "47119", "city" : "FLOYDS KNOBS", "loc" : [ -85.89955500000001, 38.351006 ], "pop" : 9954, "state" : "IN" } +{ "_id" : "47120", "city" : "FREDERICKSBURG", "loc" : [ -86.17825499999999, 38.482118 ], "pop" : 1846, "state" : "IN" } +{ "_id" : "47122", "city" : "GEORGETOWN", "loc" : [ -85.961704, 38.302943 ], "pop" : 4446, "state" : "IN" } +{ "_id" : "47123", "city" : "GRANTSBURG", "loc" : [ -86.466043, 38.289183 ], "pop" : 154, "state" : "IN" } +{ "_id" : "47124", "city" : "GREENVILLE", "loc" : [ -86.00829899999999, 38.353533 ], "pop" : 1162, "state" : "IN" } +{ "_id" : "47125", "city" : "HARDINSBURG", "loc" : [ -86.317983, 38.462599 ], "pop" : 2496, "state" : "IN" } +{ "_id" : "47126", "city" : "HENRYVILLE", "loc" : [ -85.773403, 38.539829 ], "pop" : 2648, "state" : "IN" } +{ "_id" : "47129", "city" : "CLARKSVILLE", "loc" : [ -85.524438, 38.537273 ], "pop" : 379, "state" : "IN" } +{ "_id" : "47130", "city" : "JEFFERSONVILLE", "loc" : [ -85.735885, 38.307767 ], "pop" : 56543, "state" : "IN" } +{ "_id" : "47135", "city" : "LACONIA", "loc" : [ -86.08441500000001, 38.052703 ], "pop" : 1058, "state" : "IN" } +{ "_id" : "47136", "city" : "LANESVILLE", "loc" : [ -85.95931400000001, 38.244817 ], "pop" : 3524, "state" : "IN" } +{ "_id" : "47137", "city" : "LEAVENWORTH", "loc" : [ -86.35986200000001, 38.194244 ], "pop" : 1152, "state" : "IN" } +{ "_id" : "47138", "city" : "LEXINGTON", "loc" : [ -85.65891499999999, 38.650643 ], "pop" : 2803, "state" : "IN" } +{ "_id" : "47140", "city" : "MARENGO", "loc" : [ -86.357784, 38.373603 ], "pop" : 1539, "state" : "IN" } +{ "_id" : "47141", "city" : "MARYSVILLE", "loc" : [ -85.630809, 38.554488 ], "pop" : 828, "state" : "IN" } +{ "_id" : "47142", "city" : "MAUCKPORT", "loc" : [ -86.184622, 38.04366 ], "pop" : 520, "state" : "IN" } +{ "_id" : "47143", "city" : "MEMPHIS", "loc" : [ -85.777501, 38.464181 ], "pop" : 2381, "state" : "IN" } +{ "_id" : "47145", "city" : "MILLTOWN", "loc" : [ -86.300344, 38.344453 ], "pop" : 1724, "state" : "IN" } +{ "_id" : "47147", "city" : "NABB", "loc" : [ -85.521704, 38.612768 ], "pop" : 2246, "state" : "IN" } +{ "_id" : "47150", "city" : "NEW ALBANY", "loc" : [ -85.822085, 38.308919 ], "pop" : 44969, "state" : "IN" } +{ "_id" : "47160", "city" : "NEW MIDDLETOWN", "loc" : [ -86.055261, 38.144199 ], "pop" : 1593, "state" : "IN" } +{ "_id" : "47161", "city" : "NEW SALISBURY", "loc" : [ -86.088731, 38.339885 ], "pop" : 4814, "state" : "IN" } +{ "_id" : "47162", "city" : "NEW WASHINGTON", "loc" : [ -85.45987, 38.557521 ], "pop" : 380, "state" : "IN" } +{ "_id" : "47163", "city" : "OTISCO", "loc" : [ -85.66470200000001, 38.542342 ], "pop" : 1738, "state" : "IN" } +{ "_id" : "47164", "city" : "PALMYRA", "loc" : [ -86.088778, 38.410484 ], "pop" : 814, "state" : "IN" } +{ "_id" : "47165", "city" : "PEKIN", "loc" : [ -86.017045, 38.49308 ], "pop" : 5351, "state" : "IN" } +{ "_id" : "47166", "city" : "RAMSEY", "loc" : [ -86.130768, 38.335442 ], "pop" : 1146, "state" : "IN" } +{ "_id" : "47167", "city" : "SALEM", "loc" : [ -86.07874200000001, 38.607138 ], "pop" : 10949, "state" : "IN" } +{ "_id" : "47170", "city" : "SCOTTSBURG", "loc" : [ -85.798654, 38.688499 ], "pop" : 13114, "state" : "IN" } +{ "_id" : "47172", "city" : "SPEED", "loc" : [ -85.763518, 38.390331 ], "pop" : 8658, "state" : "IN" } +{ "_id" : "47174", "city" : "SULPHUR", "loc" : [ -86.487296, 38.227194 ], "pop" : 303, "state" : "IN" } +{ "_id" : "47175", "city" : "TASWELL", "loc" : [ -86.538675, 38.346302 ], "pop" : 950, "state" : "IN" } +{ "_id" : "47177", "city" : "UNDERWOOD", "loc" : [ -85.767211, 38.590251 ], "pop" : 818, "state" : "IN" } +{ "_id" : "47201", "city" : "COLUMBUS", "loc" : [ -85.93174500000001, 39.205507 ], "pop" : 40769, "state" : "IN" } +{ "_id" : "47203", "city" : "COLUMBUS", "loc" : [ -85.885497, 39.230097 ], "pop" : 15656, "state" : "IN" } +{ "_id" : "47220", "city" : "BROWNSTOWN", "loc" : [ -86.048619, 38.883593 ], "pop" : 4963, "state" : "IN" } +{ "_id" : "47223", "city" : "BUTLERVILLE", "loc" : [ -85.494415, 39.120598 ], "pop" : 813, "state" : "IN" } +{ "_id" : "47224", "city" : "CANAAN", "loc" : [ -85.268896, 38.869644 ], "pop" : 936, "state" : "IN" } +{ "_id" : "47227", "city" : "COMMISKEY", "loc" : [ -85.643384, 38.852629 ], "pop" : 896, "state" : "IN" } +{ "_id" : "47228", "city" : "CORTLAND", "loc" : [ -86.000918, 38.991546 ], "pop" : 1680, "state" : "IN" } +{ "_id" : "47229", "city" : "CROTHERSVILLE", "loc" : [ -85.846965, 38.806672 ], "pop" : 3865, "state" : "IN" } +{ "_id" : "47230", "city" : "DEPUTY", "loc" : [ -85.63040700000001, 38.775891 ], "pop" : 1448, "state" : "IN" } +{ "_id" : "47231", "city" : "DUPONT", "loc" : [ -85.50920499999999, 38.890504 ], "pop" : 716, "state" : "IN" } +{ "_id" : "47232", "city" : "ELIZABETHTOWN", "loc" : [ -85.81531099999999, 39.124291 ], "pop" : 1222, "state" : "IN" } +{ "_id" : "47234", "city" : "FLAT ROCK", "loc" : [ -85.67588600000001, 39.407503 ], "pop" : 1496, "state" : "IN" } +{ "_id" : "47235", "city" : "FREETOWN", "loc" : [ -86.12405099999999, 38.995728 ], "pop" : 1380, "state" : "IN" } +{ "_id" : "47236", "city" : "GRAMMER", "loc" : [ -85.718338, 39.159192 ], "pop" : 412, "state" : "IN" } +{ "_id" : "47240", "city" : "ADAMS", "loc" : [ -85.47353200000001, 39.331223 ], "pop" : 19250, "state" : "IN" } +{ "_id" : "47243", "city" : "HANOVER", "loc" : [ -85.476316, 38.71378 ], "pop" : 4900, "state" : "IN" } +{ "_id" : "47244", "city" : "HARTSVILLE", "loc" : [ -85.70046000000001, 39.273318 ], "pop" : 543, "state" : "IN" } +{ "_id" : "47246", "city" : "HOPE", "loc" : [ -85.766538, 39.25733 ], "pop" : 5676, "state" : "IN" } +{ "_id" : "47250", "city" : "MADISON", "loc" : [ -85.40701900000001, 38.764866 ], "pop" : 20596, "state" : "IN" } +{ "_id" : "47260", "city" : "MEDORA", "loc" : [ -86.189733, 38.825505 ], "pop" : 1576, "state" : "IN" } +{ "_id" : "47264", "city" : "NORMAN", "loc" : [ -86.20793399999999, 38.929996 ], "pop" : 1834, "state" : "IN" } +{ "_id" : "47265", "city" : "NORTH VERNON", "loc" : [ -85.627216, 39.001763 ], "pop" : 13466, "state" : "IN" } +{ "_id" : "47270", "city" : "PARIS CROSSING", "loc" : [ -85.74872499999999, 38.855843 ], "pop" : 972, "state" : "IN" } +{ "_id" : "47272", "city" : "SAINT PAUL", "loc" : [ -85.599374, 39.427747 ], "pop" : 1389, "state" : "IN" } +{ "_id" : "47273", "city" : "SCIPIO", "loc" : [ -85.71285899999999, 39.066544 ], "pop" : 5043, "state" : "IN" } +{ "_id" : "47274", "city" : "SEYMOUR", "loc" : [ -85.88247699999999, 38.957133 ], "pop" : 21094, "state" : "IN" } +{ "_id" : "47281", "city" : "VALLONIA", "loc" : [ -86.068997, 38.817413 ], "pop" : 1338, "state" : "IN" } +{ "_id" : "47282", "city" : "VERNON", "loc" : [ -85.598377, 38.96887 ], "pop" : 2277, "state" : "IN" } +{ "_id" : "47283", "city" : "WESTPORT", "loc" : [ -85.585596, 39.174856 ], "pop" : 3065, "state" : "IN" } +{ "_id" : "47302", "city" : "MUNCIE", "loc" : [ -85.380689, 40.168414 ], "pop" : 29709, "state" : "IN" } +{ "_id" : "47303", "city" : "MUNCIE", "loc" : [ -85.37896600000001, 40.217992 ], "pop" : 26033, "state" : "IN" } +{ "_id" : "47304", "city" : "MUNCIE", "loc" : [ -85.429115, 40.211134 ], "pop" : 28452, "state" : "IN" } +{ "_id" : "47305", "city" : "MUNCIE", "loc" : [ -85.386163, 40.193299 ], "pop" : 5251, "state" : "IN" } +{ "_id" : "47306", "city" : "BALL STATE UNIVE", "loc" : [ -85.41015299999999, 40.192739 ], "pop" : 3259, "state" : "IN" } +{ "_id" : "47320", "city" : "ALBANY", "loc" : [ -85.257987, 40.292049 ], "pop" : 4625, "state" : "IN" } +{ "_id" : "47325", "city" : "BROWNSVILLE", "loc" : [ -84.98806999999999, 39.684485 ], "pop" : 850, "state" : "IN" } +{ "_id" : "47326", "city" : "BRYANT", "loc" : [ -84.911748, 40.54462 ], "pop" : 1350, "state" : "IN" } +{ "_id" : "47327", "city" : "CAMBRIDGE CITY", "loc" : [ -85.16845499999999, 39.818171 ], "pop" : 4998, "state" : "IN" } +{ "_id" : "47330", "city" : "CENTERVILLE", "loc" : [ -85.00317, 39.808103 ], "pop" : 5475, "state" : "IN" } +{ "_id" : "47331", "city" : "CONNERSVILLE", "loc" : [ -85.14643100000001, 39.643508 ], "pop" : 25503, "state" : "IN" } +{ "_id" : "47334", "city" : "DALEVILLE", "loc" : [ -85.511016, 40.125738 ], "pop" : 5063, "state" : "IN" } +{ "_id" : "47336", "city" : "DUNKIRK", "loc" : [ -85.22554100000001, 40.388291 ], "pop" : 4413, "state" : "IN" } +{ "_id" : "47338", "city" : "EATON", "loc" : [ -85.354387, 40.337673 ], "pop" : 3637, "state" : "IN" } +{ "_id" : "47339", "city" : "ECONOMY", "loc" : [ -85.08780299999999, 39.971215 ], "pop" : 677, "state" : "IN" } +{ "_id" : "47340", "city" : "FARMLAND", "loc" : [ -85.125381, 40.194454 ], "pop" : 1784, "state" : "IN" } +{ "_id" : "47341", "city" : "FOUNTAIN CITY", "loc" : [ -84.908996, 39.963429 ], "pop" : 2020, "state" : "IN" } +{ "_id" : "47342", "city" : "GASTON", "loc" : [ -85.489842, 40.29479 ], "pop" : 4594, "state" : "IN" } +{ "_id" : "47345", "city" : "GREENS FORK", "loc" : [ -85.049413, 39.89163 ], "pop" : 1054, "state" : "IN" } +{ "_id" : "47346", "city" : "HAGERSTOWN", "loc" : [ -85.16009099999999, 39.92277 ], "pop" : 3906, "state" : "IN" } +{ "_id" : "47348", "city" : "HARTFORD CITY", "loc" : [ -85.375771, 40.454106 ], "pop" : 9762, "state" : "IN" } +{ "_id" : "47352", "city" : "LEWISVILLE", "loc" : [ -85.36211, 39.828288 ], "pop" : 1219, "state" : "IN" } +{ "_id" : "47353", "city" : "LIBERTY", "loc" : [ -84.908947, 39.612645 ], "pop" : 6126, "state" : "IN" } +{ "_id" : "47354", "city" : "LOSANTVILLE", "loc" : [ -85.21084999999999, 40.047492 ], "pop" : 1768, "state" : "IN" } +{ "_id" : "47355", "city" : "LYNN", "loc" : [ -84.93003, 40.051863 ], "pop" : 3544, "state" : "IN" } +{ "_id" : "47356", "city" : "MIDDLETOWN", "loc" : [ -85.536778, 40.047488 ], "pop" : 4613, "state" : "IN" } +{ "_id" : "47357", "city" : "MILTON", "loc" : [ -85.142267, 39.776279 ], "pop" : 1488, "state" : "IN" } +{ "_id" : "47358", "city" : "MODOC", "loc" : [ -85.091904, 40.05816 ], "pop" : 1253, "state" : "IN" } +{ "_id" : "47359", "city" : "MONTPELIER", "loc" : [ -85.251339, 40.557656 ], "pop" : 3753, "state" : "IN" } +{ "_id" : "47360", "city" : "MOORELAND", "loc" : [ -85.258065, 39.994066 ], "pop" : 1265, "state" : "IN" } +{ "_id" : "47362", "city" : "NEW CASTLE", "loc" : [ -85.366322, 39.920765 ], "pop" : 25888, "state" : "IN" } +{ "_id" : "47368", "city" : "PARKER CITY", "loc" : [ -85.196265, 40.193841 ], "pop" : 1818, "state" : "IN" } +{ "_id" : "47369", "city" : "PENNVILLE", "loc" : [ -85.14916599999999, 40.508195 ], "pop" : 1236, "state" : "IN" } +{ "_id" : "47371", "city" : "PORTLAND", "loc" : [ -84.992825, 40.430564 ], "pop" : 13186, "state" : "IN" } +{ "_id" : "47373", "city" : "REDKEY", "loc" : [ -85.16196600000001, 40.326491 ], "pop" : 2971, "state" : "IN" } +{ "_id" : "47374", "city" : "RICHMOND", "loc" : [ -84.89360600000001, 39.83244 ], "pop" : 50516, "state" : "IN" } +{ "_id" : "47380", "city" : "RIDGEVILLE", "loc" : [ -85.03710100000001, 40.280359 ], "pop" : 1343, "state" : "IN" } +{ "_id" : "47381", "city" : "SALAMONIA", "loc" : [ -84.855098, 40.358234 ], "pop" : 741, "state" : "IN" } +{ "_id" : "47382", "city" : "SARATOGA", "loc" : [ -84.950846, 40.257365 ], "pop" : 1244, "state" : "IN" } +{ "_id" : "47383", "city" : "SELMA", "loc" : [ -85.273765, 40.169295 ], "pop" : 4009, "state" : "IN" } +{ "_id" : "47384", "city" : "SHIRLEY", "loc" : [ -85.518151, 39.91582 ], "pop" : 2292, "state" : "IN" } +{ "_id" : "47385", "city" : "SPICELAND", "loc" : [ -85.445043, 39.827078 ], "pop" : 2270, "state" : "IN" } +{ "_id" : "47386", "city" : "SPRINGPORT", "loc" : [ -85.36886699999999, 40.008848 ], "pop" : 3393, "state" : "IN" } +{ "_id" : "47387", "city" : "STRAUGHN", "loc" : [ -85.272406, 39.831946 ], "pop" : 1300, "state" : "IN" } +{ "_id" : "47388", "city" : "SULPHUR SPRINGS", "loc" : [ -85.440747, 40.011121 ], "pop" : 1242, "state" : "IN" } +{ "_id" : "47390", "city" : "UNION CITY", "loc" : [ -84.826787, 40.202372 ], "pop" : 5393, "state" : "IN" } +{ "_id" : "47392", "city" : "WEBSTER", "loc" : [ -84.942908, 39.905701 ], "pop" : 540, "state" : "IN" } +{ "_id" : "47393", "city" : "WILLIAMSBURG", "loc" : [ -84.998442, 39.958005 ], "pop" : 1272, "state" : "IN" } +{ "_id" : "47394", "city" : "WINCHESTER", "loc" : [ -85.004366, 40.16959 ], "pop" : 8830, "state" : "IN" } +{ "_id" : "47396", "city" : "YORKTOWN", "loc" : [ -85.49599499999999, 40.183581 ], "pop" : 5027, "state" : "IN" } +{ "_id" : "47401", "city" : "BLOOMINGTON", "loc" : [ -86.508262, 39.140057 ], "pop" : 31456, "state" : "IN" } +{ "_id" : "47403", "city" : "BLOOMINGTON", "loc" : [ -86.57686699999999, 39.12632 ], "pop" : 23435, "state" : "IN" } +{ "_id" : "47404", "city" : "BLOOMINGTON", "loc" : [ -86.57572, 39.195026 ], "pop" : 15079, "state" : "IN" } +{ "_id" : "47408", "city" : "WOODBRIDGE", "loc" : [ -86.505836, 39.183175 ], "pop" : 30907, "state" : "IN" } +{ "_id" : "47421", "city" : "BEDFORD", "loc" : [ -86.487072, 38.872881 ], "pop" : 27071, "state" : "IN" } +{ "_id" : "47424", "city" : "BLOOMFIELD", "loc" : [ -86.867549, 39.029542 ], "pop" : 9014, "state" : "IN" } +{ "_id" : "47427", "city" : "COAL CITY", "loc" : [ -86.988297, 39.257304 ], "pop" : 1647, "state" : "IN" } +{ "_id" : "47429", "city" : "ELLETTSVILLE", "loc" : [ -86.619635, 39.254477 ], "pop" : 4960, "state" : "IN" } +{ "_id" : "47431", "city" : "FREEDOM", "loc" : [ -86.850027, 39.215147 ], "pop" : 1003, "state" : "IN" } +{ "_id" : "47432", "city" : "FRENCH LICK", "loc" : [ -86.61955500000001, 38.532351 ], "pop" : 3920, "state" : "IN" } +{ "_id" : "47433", "city" : "GOSPORT", "loc" : [ -86.6583, 39.344969 ], "pop" : 2269, "state" : "IN" } +{ "_id" : "47436", "city" : "HELTONVILLE", "loc" : [ -86.370328, 38.948014 ], "pop" : 1402, "state" : "IN" } +{ "_id" : "47438", "city" : "JASONVILLE", "loc" : [ -87.202292, 39.172333 ], "pop" : 4340, "state" : "IN" } +{ "_id" : "47441", "city" : "LINTON", "loc" : [ -87.172286, 39.046139 ], "pop" : 9233, "state" : "IN" } +{ "_id" : "47443", "city" : "LYONS", "loc" : [ -87.101595, 38.971731 ], "pop" : 1706, "state" : "IN" } +{ "_id" : "47446", "city" : "MITCHELL", "loc" : [ -86.476096, 38.742625 ], "pop" : 9516, "state" : "IN" } +{ "_id" : "47448", "city" : "NASHVILLE", "loc" : [ -86.22199000000001, 39.236712 ], "pop" : 11751, "state" : "IN" } +{ "_id" : "47449", "city" : "NEWBERRY", "loc" : [ -87.008055, 38.922905 ], "pop" : 386, "state" : "IN" } +{ "_id" : "47451", "city" : "OOLITIC", "loc" : [ -86.52461700000001, 38.89378 ], "pop" : 1493, "state" : "IN" } +{ "_id" : "47452", "city" : "ORLEANS", "loc" : [ -86.453157, 38.653464 ], "pop" : 4309, "state" : "IN" } +{ "_id" : "47453", "city" : "OWENSBURG", "loc" : [ -86.744122, 38.952216 ], "pop" : 1497, "state" : "IN" } +{ "_id" : "47454", "city" : "PAOLI", "loc" : [ -86.44902, 38.550697 ], "pop" : 6790, "state" : "IN" } +{ "_id" : "47456", "city" : "QUINCY", "loc" : [ -86.80250599999999, 39.439521 ], "pop" : 2959, "state" : "IN" } +{ "_id" : "47459", "city" : "SOLSBERRY", "loc" : [ -86.737843, 39.119047 ], "pop" : 1832, "state" : "IN" } +{ "_id" : "47460", "city" : "SPENCER", "loc" : [ -86.77894000000001, 39.289067 ], "pop" : 10170, "state" : "IN" } +{ "_id" : "47462", "city" : "SPRINGVILLE", "loc" : [ -86.613879, 38.950655 ], "pop" : 1726, "state" : "IN" } +{ "_id" : "47465", "city" : "SWITZ CITY", "loc" : [ -87.05023799999999, 39.036937 ], "pop" : 1347, "state" : "IN" } +{ "_id" : "47468", "city" : "UNIONVILLE", "loc" : [ -86.418947, 39.251396 ], "pop" : 1111, "state" : "IN" } +{ "_id" : "47469", "city" : "WEST BADEN SPRIN", "loc" : [ -86.613826, 38.585501 ], "pop" : 1757, "state" : "IN" } +{ "_id" : "47470", "city" : "WILLIAMS", "loc" : [ -86.628488, 38.773478 ], "pop" : 1960, "state" : "IN" } +{ "_id" : "47471", "city" : "WORTHINGTON", "loc" : [ -86.99905800000001, 39.12298 ], "pop" : 2365, "state" : "IN" } +{ "_id" : "47501", "city" : "WASHINGTON", "loc" : [ -87.17065599999999, 38.653568 ], "pop" : 15495, "state" : "IN" } +{ "_id" : "47512", "city" : "BICKNELL", "loc" : [ -87.31371799999999, 38.77272 ], "pop" : 4470, "state" : "IN" } +{ "_id" : "47513", "city" : "BIRDSEYE", "loc" : [ -86.710193, 38.30058 ], "pop" : 1591, "state" : "IN" } +{ "_id" : "47514", "city" : "BRANCHVILLE", "loc" : [ -86.585866, 38.157189 ], "pop" : 1314, "state" : "IN" } +{ "_id" : "47515", "city" : "SIBERIA", "loc" : [ -86.72181500000001, 38.163101 ], "pop" : 912, "state" : "IN" } +{ "_id" : "47516", "city" : "BRUCEVILLE", "loc" : [ -87.431299, 38.756279 ], "pop" : 1167, "state" : "IN" } +{ "_id" : "47519", "city" : "CANNELBURG", "loc" : [ -86.96686800000001, 38.694696 ], "pop" : 1265, "state" : "IN" } +{ "_id" : "47520", "city" : "MOUNT PLEASANT", "loc" : [ -86.732617, 37.910851 ], "pop" : 2290, "state" : "IN" } +{ "_id" : "47521", "city" : "CELESTINE", "loc" : [ -86.756809, 38.387789 ], "pop" : 858, "state" : "IN" } +{ "_id" : "47522", "city" : "CRANE NAVAL DEPO", "loc" : [ -86.86547299999999, 38.849618 ], "pop" : 371, "state" : "IN" } +{ "_id" : "47523", "city" : "DALE", "loc" : [ -87.00698199999999, 38.170638 ], "pop" : 3459, "state" : "IN" } +{ "_id" : "47524", "city" : "DECKER", "loc" : [ -87.553713, 38.507629 ], "pop" : 621, "state" : "IN" } +{ "_id" : "47525", "city" : "DERBY", "loc" : [ -86.57695099999999, 38.023933 ], "pop" : 485, "state" : "IN" } +{ "_id" : "47527", "city" : "DUBOIS", "loc" : [ -86.78319, 38.472824 ], "pop" : 2200, "state" : "IN" } +{ "_id" : "47528", "city" : "EDWARDSPORT", "loc" : [ -87.251856, 38.810584 ], "pop" : 497, "state" : "IN" } +{ "_id" : "47529", "city" : "ELNORA", "loc" : [ -87.065243, 38.822284 ], "pop" : 2373, "state" : "IN" } +{ "_id" : "47531", "city" : "EVANSTON", "loc" : [ -86.836422, 38.022436 ], "pop" : 163, "state" : "IN" } +{ "_id" : "47532", "city" : "FERDINAND", "loc" : [ -86.860669, 38.233582 ], "pop" : 3725, "state" : "IN" } +{ "_id" : "47537", "city" : "GENTRYVILLE", "loc" : [ -87.04413700000001, 38.085458 ], "pop" : 824, "state" : "IN" } +{ "_id" : "47541", "city" : "HOLLAND", "loc" : [ -87.008768, 38.23851 ], "pop" : 2072, "state" : "IN" } +{ "_id" : "47542", "city" : "HUNTINGBURG", "loc" : [ -86.953299, 38.297902 ], "pop" : 7415, "state" : "IN" } +{ "_id" : "47546", "city" : "HAYSVILLE", "loc" : [ -86.940787, 38.404392 ], "pop" : 16927, "state" : "IN" } +{ "_id" : "47550", "city" : "BUFFALOVILLE", "loc" : [ -86.962908, 38.047904 ], "pop" : 202, "state" : "IN" } +{ "_id" : "47551", "city" : "LEOPOLD", "loc" : [ -86.60442999999999, 38.101138 ], "pop" : 623, "state" : "IN" } +{ "_id" : "47552", "city" : "LINCOLN CITY", "loc" : [ -86.98720400000001, 38.127565 ], "pop" : 233, "state" : "IN" } +{ "_id" : "47553", "city" : "LOOGOOTEE", "loc" : [ -86.913658, 38.662901 ], "pop" : 6068, "state" : "IN" } +{ "_id" : "47555", "city" : "MAGNET", "loc" : [ -86.48353, 38.088165 ], "pop" : 240, "state" : "IN" } +{ "_id" : "47556", "city" : "MARIAH HILL", "loc" : [ -86.831593, 38.149493 ], "pop" : 1317, "state" : "IN" } +{ "_id" : "47557", "city" : "MONROE CITY", "loc" : [ -87.364136, 38.60015 ], "pop" : 1915, "state" : "IN" } +{ "_id" : "47558", "city" : "MONTGOMERY", "loc" : [ -87.047603, 38.652146 ], "pop" : 2675, "state" : "IN" } +{ "_id" : "47561", "city" : "OAKTOWN", "loc" : [ -87.387877, 38.857939 ], "pop" : 2569, "state" : "IN" } +{ "_id" : "47562", "city" : "ODON", "loc" : [ -86.97521399999999, 38.818666 ], "pop" : 4198, "state" : "IN" } +{ "_id" : "47564", "city" : "OTWELL", "loc" : [ -87.09854799999999, 38.466221 ], "pop" : 912, "state" : "IN" } +{ "_id" : "47567", "city" : "PETERSBURG", "loc" : [ -87.28829399999999, 38.478929 ], "pop" : 6614, "state" : "IN" } +{ "_id" : "47568", "city" : "PLAINVILLE", "loc" : [ -87.157822, 38.791507 ], "pop" : 895, "state" : "IN" } +{ "_id" : "47574", "city" : "ROME", "loc" : [ -86.595787, 37.937561 ], "pop" : 297, "state" : "IN" } +{ "_id" : "47575", "city" : "KYANA", "loc" : [ -86.82485800000001, 38.332222 ], "pop" : 2012, "state" : "IN" } +{ "_id" : "47576", "city" : "SAINT CROIX", "loc" : [ -86.603511, 38.239773 ], "pop" : 325, "state" : "IN" } +{ "_id" : "47577", "city" : "SAINT MEINRAD", "loc" : [ -86.842916, 38.181946 ], "pop" : 652, "state" : "IN" } +{ "_id" : "47578", "city" : "SANDBORN", "loc" : [ -87.20253200000001, 38.881743 ], "pop" : 919, "state" : "IN" } +{ "_id" : "47579", "city" : "SANTA CLAUS", "loc" : [ -86.90352799999999, 38.094496 ], "pop" : 2323, "state" : "IN" } +{ "_id" : "47580", "city" : "SCHNELLVILLE", "loc" : [ -86.756506, 38.341436 ], "pop" : 199, "state" : "IN" } +{ "_id" : "47581", "city" : "SHOALS", "loc" : [ -86.776094, 38.679103 ], "pop" : 4562, "state" : "IN" } +{ "_id" : "47585", "city" : "STENDAL", "loc" : [ -87.12045000000001, 38.283472 ], "pop" : 596, "state" : "IN" } +{ "_id" : "47586", "city" : "TELL CITY", "loc" : [ -86.745704, 37.965505 ], "pop" : 11583, "state" : "IN" } +{ "_id" : "47587", "city" : "TOBINSPORT", "loc" : [ -86.634128, 37.874726 ], "pop" : 151, "state" : "IN" } +{ "_id" : "47588", "city" : "TROY", "loc" : [ -86.797766, 37.997994 ], "pop" : 727, "state" : "IN" } +{ "_id" : "47590", "city" : "VELPEN", "loc" : [ -87.098996, 38.367981 ], "pop" : 393, "state" : "IN" } +{ "_id" : "47591", "city" : "VINCENNES", "loc" : [ -87.509806, 38.67344 ], "pop" : 26841, "state" : "IN" } +{ "_id" : "47597", "city" : "WHEATLAND", "loc" : [ -87.30620399999999, 38.667055 ], "pop" : 885, "state" : "IN" } +{ "_id" : "47598", "city" : "WINSLOW", "loc" : [ -87.222328, 38.363951 ], "pop" : 3994, "state" : "IN" } +{ "_id" : "47601", "city" : "BOONVILLE", "loc" : [ -87.261994, 38.047435 ], "pop" : 11964, "state" : "IN" } +{ "_id" : "47610", "city" : "CHANDLER", "loc" : [ -87.375552, 38.042304 ], "pop" : 5641, "state" : "IN" } +{ "_id" : "47611", "city" : "CHRISNEY", "loc" : [ -87.070421, 38.005995 ], "pop" : 1455, "state" : "IN" } +{ "_id" : "47612", "city" : "CYNTHIANA", "loc" : [ -87.711518, 38.174299 ], "pop" : 1277, "state" : "IN" } +{ "_id" : "47613", "city" : "ELBERFELD", "loc" : [ -87.41794299999999, 38.205267 ], "pop" : 3361, "state" : "IN" } +{ "_id" : "47615", "city" : "GRANDVIEW", "loc" : [ -86.956774, 37.970297 ], "pop" : 1990, "state" : "IN" } +{ "_id" : "47616", "city" : "GRIFFIN", "loc" : [ -87.916631, 38.206858 ], "pop" : 329, "state" : "IN" } +{ "_id" : "47619", "city" : "LYNNVILLE", "loc" : [ -87.293486, 38.196085 ], "pop" : 1329, "state" : "IN" } +{ "_id" : "47620", "city" : "MOUNT VERNON", "loc" : [ -87.856887, 37.950569 ], "pop" : 16037, "state" : "IN" } +{ "_id" : "47630", "city" : "NEWBURGH", "loc" : [ -87.393798, 37.963746 ], "pop" : 21793, "state" : "IN" } +{ "_id" : "47631", "city" : "NEW HARMONY", "loc" : [ -87.917186, 38.124502 ], "pop" : 1432, "state" : "IN" } +{ "_id" : "47633", "city" : "POSEYVILLE", "loc" : [ -87.802747, 38.171986 ], "pop" : 2009, "state" : "IN" } +{ "_id" : "47634", "city" : "RICHLAND", "loc" : [ -87.200957, 37.913599 ], "pop" : 2862, "state" : "IN" } +{ "_id" : "47635", "city" : "ROCKPORT", "loc" : [ -87.07701, 37.885803 ], "pop" : 4850, "state" : "IN" } +{ "_id" : "47637", "city" : "TENNYSON", "loc" : [ -87.13875, 38.123207 ], "pop" : 1378, "state" : "IN" } +{ "_id" : "47638", "city" : "WADESVILLE", "loc" : [ -87.754295, 38.082791 ], "pop" : 3614, "state" : "IN" } +{ "_id" : "47639", "city" : "HAUBSTADT", "loc" : [ -87.57982699999999, 38.189536 ], "pop" : 3568, "state" : "IN" } +{ "_id" : "47640", "city" : "HAZLETON", "loc" : [ -87.49834799999999, 38.462283 ], "pop" : 1214, "state" : "IN" } +{ "_id" : "47647", "city" : "BUCKSKIN", "loc" : [ -87.43077, 38.220867 ], "pop" : 236, "state" : "IN" } +{ "_id" : "47648", "city" : "FORT BRANCH", "loc" : [ -87.56823300000001, 38.247136 ], "pop" : 4031, "state" : "IN" } +{ "_id" : "47649", "city" : "FRANCISCO", "loc" : [ -87.453621, 38.332953 ], "pop" : 1503, "state" : "IN" } +{ "_id" : "47660", "city" : "OAKLAND CITY", "loc" : [ -87.351907, 38.336053 ], "pop" : 4244, "state" : "IN" } +{ "_id" : "47665", "city" : "OWENSVILLE", "loc" : [ -87.709052, 38.274414 ], "pop" : 3159, "state" : "IN" } +{ "_id" : "47666", "city" : "PATOKA", "loc" : [ -87.595789, 38.414296 ], "pop" : 1434, "state" : "IN" } +{ "_id" : "47670", "city" : "PRINCETON", "loc" : [ -87.569069, 38.352502 ], "pop" : 11579, "state" : "IN" } +{ "_id" : "47708", "city" : "EVANSVILLE", "loc" : [ -87.571973, 37.971818 ], "pop" : 857, "state" : "IN" } +{ "_id" : "47710", "city" : "EVANSVILLE", "loc" : [ -87.574569, 38.008617 ], "pop" : 22336, "state" : "IN" } +{ "_id" : "47711", "city" : "EVANSVILLE", "loc" : [ -87.535236, 38.076377 ], "pop" : 9387, "state" : "IN" } +{ "_id" : "47712", "city" : "EVANSVILLE", "loc" : [ -87.634682, 37.998484 ], "pop" : 35603, "state" : "IN" } +{ "_id" : "47713", "city" : "EVANSVILLE", "loc" : [ -87.55768, 37.962326 ], "pop" : 14121, "state" : "IN" } +{ "_id" : "47714", "city" : "EVANSVILLE", "loc" : [ -87.529302, 37.959076 ], "pop" : 27381, "state" : "IN" } +{ "_id" : "47715", "city" : "EVANSVILLE", "loc" : [ -87.48552599999999, 37.967815 ], "pop" : 30611, "state" : "IN" } +{ "_id" : "47720", "city" : "EVANSVILLE", "loc" : [ -87.538793, 37.998832 ], "pop" : 25504, "state" : "IN" } +{ "_id" : "47802", "city" : "TERRE HAUTE", "loc" : [ -87.402019, 39.40697 ], "pop" : 29656, "state" : "IN" } +{ "_id" : "47803", "city" : "TERRE HAUTE", "loc" : [ -87.353967, 39.465696 ], "pop" : 17709, "state" : "IN" } +{ "_id" : "47804", "city" : "TERRE HAUTE", "loc" : [ -87.39449399999999, 39.493665 ], "pop" : 11573, "state" : "IN" } +{ "_id" : "47805", "city" : "NORTH TERRE HAUT", "loc" : [ -87.341109, 39.535981 ], "pop" : 13652, "state" : "IN" } +{ "_id" : "47807", "city" : "TERRE HAUTE", "loc" : [ -87.400859, 39.470974 ], "pop" : 19106, "state" : "IN" } +{ "_id" : "47832", "city" : "BLOOMINGDALE", "loc" : [ -87.255967, 39.834808 ], "pop" : 770, "state" : "IN" } +{ "_id" : "47833", "city" : "BOWLING GREEN", "loc" : [ -87.00524900000001, 39.381209 ], "pop" : 734, "state" : "IN" } +{ "_id" : "47834", "city" : "BRAZIL", "loc" : [ -87.12776700000001, 39.521041 ], "pop" : 18960, "state" : "IN" } +{ "_id" : "47836", "city" : "BRIDGETON", "loc" : [ -87.18139600000001, 39.648366 ], "pop" : 818, "state" : "IN" } +{ "_id" : "47837", "city" : "CARBON", "loc" : [ -87.064455, 39.57463 ], "pop" : 790, "state" : "IN" } +{ "_id" : "47838", "city" : "CARLISLE", "loc" : [ -87.366738, 38.976297 ], "pop" : 2324, "state" : "IN" } +{ "_id" : "47840", "city" : "CENTERPOINT", "loc" : [ -87.09347, 39.390989 ], "pop" : 955, "state" : "IN" } +{ "_id" : "47841", "city" : "CLAY CITY", "loc" : [ -87.108244, 39.2727 ], "pop" : 2275, "state" : "IN" } +{ "_id" : "47842", "city" : "CLINTON", "loc" : [ -87.4208, 39.659142 ], "pop" : 9250, "state" : "IN" } +{ "_id" : "47846", "city" : "CORY", "loc" : [ -87.195644, 39.343545 ], "pop" : 259, "state" : "IN" } +{ "_id" : "47847", "city" : "DANA", "loc" : [ -87.501018, 39.752829 ], "pop" : 1833, "state" : "IN" } +{ "_id" : "47848", "city" : "DUGGER", "loc" : [ -87.259867, 39.069057 ], "pop" : 1144, "state" : "IN" } +{ "_id" : "47849", "city" : "FAIRBANKS", "loc" : [ -87.518483, 39.212865 ], "pop" : 655, "state" : "IN" } +{ "_id" : "47850", "city" : "FARMERSBURG", "loc" : [ -87.502365, 39.268456 ], "pop" : 335, "state" : "IN" } +{ "_id" : "47854", "city" : "HILLSDALE", "loc" : [ -87.40410199999999, 39.771235 ], "pop" : 858, "state" : "IN" } +{ "_id" : "47858", "city" : "LEWIS", "loc" : [ -87.26368100000001, 39.273261 ], "pop" : 308, "state" : "IN" } +{ "_id" : "47859", "city" : "MARSHALL", "loc" : [ -87.178032, 39.906216 ], "pop" : 617, "state" : "IN" } +{ "_id" : "47861", "city" : "MEROM", "loc" : [ -87.539675, 39.032307 ], "pop" : 649, "state" : "IN" } +{ "_id" : "47862", "city" : "MONTEZUMA", "loc" : [ -87.360679, 39.796061 ], "pop" : 1444, "state" : "IN" } +{ "_id" : "47866", "city" : "PIMENTO", "loc" : [ -87.379186, 39.289792 ], "pop" : 1123, "state" : "IN" } +{ "_id" : "47868", "city" : "POLAND", "loc" : [ -86.963103, 39.446195 ], "pop" : 292, "state" : "IN" } +{ "_id" : "47872", "city" : "ROCKVILLE", "loc" : [ -87.197794, 39.768152 ], "pop" : 7895, "state" : "IN" } +{ "_id" : "47874", "city" : "ROSEDALE", "loc" : [ -87.308592, 39.62391 ], "pop" : 3463, "state" : "IN" } +{ "_id" : "47879", "city" : "SHELBURN", "loc" : [ -87.361194, 39.209924 ], "pop" : 5300, "state" : "IN" } +{ "_id" : "47882", "city" : "SULLIVAN", "loc" : [ -87.410235, 39.101018 ], "pop" : 8921, "state" : "IN" } +{ "_id" : "47885", "city" : "SANDFORD", "loc" : [ -87.46708599999999, 39.49384 ], "pop" : 11459, "state" : "IN" } +{ "_id" : "47901", "city" : "LAFAYETTE", "loc" : [ -86.888358, 40.417743 ], "pop" : 2971, "state" : "IN" } +{ "_id" : "47904", "city" : "LAFAYETTE", "loc" : [ -86.873464, 40.427649 ], "pop" : 15231, "state" : "IN" } +{ "_id" : "47905", "city" : "LAFAYETTE", "loc" : [ -86.860236, 40.400054 ], "pop" : 53104, "state" : "IN" } +{ "_id" : "47906", "city" : "WEST LAFAYETTE", "loc" : [ -86.923661, 40.444025 ], "pop" : 54702, "state" : "IN" } +{ "_id" : "47917", "city" : "AMBIA", "loc" : [ -87.47955399999999, 40.479328 ], "pop" : 794, "state" : "IN" } +{ "_id" : "47918", "city" : "ATTICA", "loc" : [ -87.224108, 40.281127 ], "pop" : 5523, "state" : "IN" } +{ "_id" : "47920", "city" : "BATTLE GROUND", "loc" : [ -86.823784, 40.5248 ], "pop" : 1646, "state" : "IN" } +{ "_id" : "47921", "city" : "BOSWELL", "loc" : [ -87.378947, 40.518021 ], "pop" : 1118, "state" : "IN" } +{ "_id" : "47922", "city" : "BROOK", "loc" : [ -87.35268499999999, 40.865534 ], "pop" : 1341, "state" : "IN" } +{ "_id" : "47923", "city" : "BROOKSTON", "loc" : [ -86.875311, 40.601088 ], "pop" : 3200, "state" : "IN" } +{ "_id" : "47926", "city" : "BURNETTSVILLE", "loc" : [ -86.574744, 40.707753 ], "pop" : 2102, "state" : "IN" } +{ "_id" : "47928", "city" : "CAYUGA", "loc" : [ -87.459019, 39.930028 ], "pop" : 3160, "state" : "IN" } +{ "_id" : "47929", "city" : "CHALMERS", "loc" : [ -86.862621, 40.669265 ], "pop" : 809, "state" : "IN" } +{ "_id" : "47930", "city" : "CLARKS HILL", "loc" : [ -86.760766, 40.262805 ], "pop" : 2119, "state" : "IN" } +{ "_id" : "47932", "city" : "COVINGTON", "loc" : [ -87.38187600000001, 40.132618 ], "pop" : 4711, "state" : "IN" } +{ "_id" : "47933", "city" : "CRAWFORDSVILLE", "loc" : [ -86.90742400000001, 40.032524 ], "pop" : 22838, "state" : "IN" } +{ "_id" : "47940", "city" : "DARLINGTON", "loc" : [ -86.764505, 40.111778 ], "pop" : 1941, "state" : "IN" } +{ "_id" : "47942", "city" : "EARL PARK", "loc" : [ -87.423199, 40.694465 ], "pop" : 903, "state" : "IN" } +{ "_id" : "47943", "city" : "FAIR OAKS", "loc" : [ -87.197031, 41.072862 ], "pop" : 1254, "state" : "IN" } +{ "_id" : "47944", "city" : "FOWLER", "loc" : [ -87.30901900000001, 40.625511 ], "pop" : 3762, "state" : "IN" } +{ "_id" : "47946", "city" : "FRANCESVILLE", "loc" : [ -86.85534, 40.97094 ], "pop" : 1808, "state" : "IN" } +{ "_id" : "47948", "city" : "GOODLAND", "loc" : [ -87.299858, 40.766872 ], "pop" : 1341, "state" : "IN" } +{ "_id" : "47949", "city" : "HILLSBORO", "loc" : [ -87.154509, 40.083452 ], "pop" : 2318, "state" : "IN" } +{ "_id" : "47950", "city" : "IDAVILLE", "loc" : [ -86.655647, 40.767372 ], "pop" : 673, "state" : "IN" } +{ "_id" : "47951", "city" : "KENTLAND", "loc" : [ -87.44707099999999, 40.787678 ], "pop" : 2609, "state" : "IN" } +{ "_id" : "47952", "city" : "CATES", "loc" : [ -87.30354800000001, 39.989383 ], "pop" : 2183, "state" : "IN" } +{ "_id" : "47954", "city" : "LADOGA", "loc" : [ -86.80309800000001, 39.91325 ], "pop" : 2405, "state" : "IN" } +{ "_id" : "47955", "city" : "LINDEN", "loc" : [ -86.89054899999999, 40.183316 ], "pop" : 1274, "state" : "IN" } +{ "_id" : "47957", "city" : "MEDARYVILLE", "loc" : [ -86.880844, 41.089734 ], "pop" : 2030, "state" : "IN" } +{ "_id" : "47959", "city" : "MONON", "loc" : [ -86.86353699999999, 40.861176 ], "pop" : 3119, "state" : "IN" } +{ "_id" : "47960", "city" : "MONTICELLO", "loc" : [ -86.754999, 40.762556 ], "pop" : 13599, "state" : "IN" } +{ "_id" : "47963", "city" : "MOROCCO", "loc" : [ -87.41871, 40.964547 ], "pop" : 2461, "state" : "IN" } +{ "_id" : "47967", "city" : "NEW RICHMOND", "loc" : [ -86.978925, 40.18118 ], "pop" : 909, "state" : "IN" } +{ "_id" : "47968", "city" : "NEW ROSS", "loc" : [ -86.752768, 39.988266 ], "pop" : 1440, "state" : "IN" } +{ "_id" : "47970", "city" : "OTTERBEIN", "loc" : [ -87.12249, 40.517013 ], "pop" : 1527, "state" : "IN" } +{ "_id" : "47971", "city" : "OXFORD", "loc" : [ -87.252576, 40.521708 ], "pop" : 1641, "state" : "IN" } +{ "_id" : "47974", "city" : "PERRYSVILLE", "loc" : [ -87.464787, 40.073697 ], "pop" : 1672, "state" : "IN" } +{ "_id" : "47975", "city" : "PINE VILLAGE", "loc" : [ -87.231724, 40.432759 ], "pop" : 1310, "state" : "IN" } +{ "_id" : "47977", "city" : "REMINGTON", "loc" : [ -87.15994000000001, 40.766653 ], "pop" : 1937, "state" : "IN" } +{ "_id" : "47978", "city" : "COLLEGEVILLE", "loc" : [ -87.13373300000001, 40.947731 ], "pop" : 9776, "state" : "IN" } +{ "_id" : "47980", "city" : "REYNOLDS", "loc" : [ -86.86914, 40.760608 ], "pop" : 1148, "state" : "IN" } +{ "_id" : "47981", "city" : "ROMNEY", "loc" : [ -86.90441199999999, 40.2605 ], "pop" : 694, "state" : "IN" } +{ "_id" : "47985", "city" : "TANGIER", "loc" : [ -87.341551, 39.920601 ], "pop" : 711, "state" : "IN" } +{ "_id" : "47987", "city" : "VEEDERSBURG", "loc" : [ -87.260167, 40.118616 ], "pop" : 3081, "state" : "IN" } +{ "_id" : "47989", "city" : "WAVELAND", "loc" : [ -87.01776, 39.901996 ], "pop" : 1548, "state" : "IN" } +{ "_id" : "47990", "city" : "WAYNETOWN", "loc" : [ -87.051165, 40.085788 ], "pop" : 1529, "state" : "IN" } +{ "_id" : "47991", "city" : "WEST LEBANON", "loc" : [ -87.43667600000001, 40.241491 ], "pop" : 2957, "state" : "IN" } +{ "_id" : "47992", "city" : "WESTPOINT", "loc" : [ -87.05747700000001, 40.358052 ], "pop" : 145, "state" : "IN" } +{ "_id" : "47993", "city" : "MARSHFIELD", "loc" : [ -87.278689, 40.309435 ], "pop" : 3591, "state" : "IN" } +{ "_id" : "47994", "city" : "WINGATE", "loc" : [ -87.066441, 40.166594 ], "pop" : 552, "state" : "IN" } +{ "_id" : "47995", "city" : "WOLCOTT", "loc" : [ -87.028997, 40.751613 ], "pop" : 1909, "state" : "IN" } +{ "_id" : "48001", "city" : "PEARL BEACH", "loc" : [ -82.560159, 42.630704 ], "pop" : 11783, "state" : "MI" } +{ "_id" : "48002", "city" : "BERLIN", "loc" : [ -82.886809, 42.919864 ], "pop" : 1333, "state" : "MI" } +{ "_id" : "48003", "city" : "ALMONT", "loc" : [ -83.036221, 42.926007 ], "pop" : 5315, "state" : "MI" } +{ "_id" : "48004", "city" : "ANCHORVILLE", "loc" : [ -82.70939199999999, 42.711817 ], "pop" : 5360, "state" : "MI" } +{ "_id" : "48005", "city" : "ARMADA", "loc" : [ -82.889905, 42.840903 ], "pop" : 4819, "state" : "MI" } +{ "_id" : "48006", "city" : "GREENWOOD", "loc" : [ -82.678141, 43.056424 ], "pop" : 2325, "state" : "MI" } +{ "_id" : "48009", "city" : "BIRMINGHAM", "loc" : [ -83.213255, 42.544396 ], "pop" : 19611, "state" : "MI" } +{ "_id" : "48014", "city" : "MUSSEY", "loc" : [ -82.92518800000001, 43.019976 ], "pop" : 4304, "state" : "MI" } +{ "_id" : "48015", "city" : "CENTER LINE", "loc" : [ -83.02477, 42.47879 ], "pop" : 8923, "state" : "MI" } +{ "_id" : "48017", "city" : "CLAWSON", "loc" : [ -83.150317, 42.536468 ], "pop" : 14008, "state" : "MI" } +{ "_id" : "48021", "city" : "EASTPOINTE", "loc" : [ -82.945896, 42.465756 ], "pop" : 35073, "state" : "MI" } +{ "_id" : "48022", "city" : "EMMETT", "loc" : [ -82.785402, 42.987239 ], "pop" : 2335, "state" : "MI" } +{ "_id" : "48023", "city" : "IRA", "loc" : [ -82.63767300000001, 42.680651 ], "pop" : 3781, "state" : "MI" } +{ "_id" : "48025", "city" : "FRANKLIN", "loc" : [ -83.251852, 42.521891 ], "pop" : 13880, "state" : "MI" } +{ "_id" : "48026", "city" : "FRASER", "loc" : [ -82.94696399999999, 42.542252 ], "pop" : 20605, "state" : "MI" } +{ "_id" : "48027", "city" : "WALES", "loc" : [ -82.621728, 43.000058 ], "pop" : 3285, "state" : "MI" } +{ "_id" : "48028", "city" : "HARSENS ISLAND", "loc" : [ -82.586049, 42.585043 ], "pop" : 1091, "state" : "MI" } +{ "_id" : "48030", "city" : "HAZEL PARK", "loc" : [ -83.09818199999999, 42.460768 ], "pop" : 20218, "state" : "MI" } +{ "_id" : "48032", "city" : "GRANT TOWNSHIP", "loc" : [ -82.554734, 43.134584 ], "pop" : 1498, "state" : "MI" } +{ "_id" : "48034", "city" : "SOUTHFIELD", "loc" : [ -83.28829500000001, 42.477676 ], "pop" : 28647, "state" : "MI" } +{ "_id" : "48039", "city" : "COTTRELLVILLE", "loc" : [ -82.514034, 42.721291 ], "pop" : 10057, "state" : "MI" } +{ "_id" : "48040", "city" : "MARYSVILLE", "loc" : [ -82.48134400000001, 42.913534 ], "pop" : 8515, "state" : "MI" } +{ "_id" : "48041", "city" : "RILEY", "loc" : [ -82.769623, 42.905955 ], "pop" : 3328, "state" : "MI" } +{ "_id" : "48043", "city" : "MOUNT CLEMENS", "loc" : [ -82.894052, 42.577562 ], "pop" : 67489, "state" : "MI" } +{ "_id" : "48044", "city" : "MACOMB", "loc" : [ -82.946845, 42.616456 ], "pop" : 51044, "state" : "MI" } +{ "_id" : "48045", "city" : "SELFRIDGE A N G", "loc" : [ -82.836395, 42.602743 ], "pop" : 34104, "state" : "MI" } +{ "_id" : "48047", "city" : "CHESTERFIELD", "loc" : [ -82.780102, 42.675344 ], "pop" : 22480, "state" : "MI" } +{ "_id" : "48048", "city" : "LENOX", "loc" : [ -82.82024800000001, 42.732958 ], "pop" : 4800, "state" : "MI" } +{ "_id" : "48049", "city" : "RUBY", "loc" : [ -82.538252, 43.026861 ], "pop" : 2316, "state" : "MI" } +{ "_id" : "48060", "city" : "PORT HURON", "loc" : [ -82.45993799999999, 42.995843 ], "pop" : 58197, "state" : "MI" } +{ "_id" : "48062", "city" : "RICHMOND", "loc" : [ -82.730052, 42.812743 ], "pop" : 12587, "state" : "MI" } +{ "_id" : "48065", "city" : "BRUCE", "loc" : [ -83.019204, 42.803513 ], "pop" : 13552, "state" : "MI" } +{ "_id" : "48066", "city" : "ROSEVILLE", "loc" : [ -82.93868000000001, 42.503423 ], "pop" : 51539, "state" : "MI" } +{ "_id" : "48067", "city" : "ROYAL OAK", "loc" : [ -83.136584, 42.490579 ], "pop" : 27820, "state" : "MI" } +{ "_id" : "48069", "city" : "PLEASANT RIDGE", "loc" : [ -83.143771, 42.47104 ], "pop" : 2895, "state" : "MI" } +{ "_id" : "48070", "city" : "HUNTINGTON WOODS", "loc" : [ -83.17490599999999, 42.482538 ], "pop" : 9107, "state" : "MI" } +{ "_id" : "48071", "city" : "MADISON HEIGHTS", "loc" : [ -83.102699, 42.501605 ], "pop" : 32196, "state" : "MI" } +{ "_id" : "48072", "city" : "BERKLEY", "loc" : [ -83.188683, 42.502755 ], "pop" : 22323, "state" : "MI" } +{ "_id" : "48073", "city" : "ROYAL OAK", "loc" : [ -83.157027, 42.519047 ], "pop" : 32093, "state" : "MI" } +{ "_id" : "48074", "city" : "KIMBALL", "loc" : [ -82.574516, 42.922072 ], "pop" : 4496, "state" : "MI" } +{ "_id" : "48075", "city" : "SOUTHFIELD", "loc" : [ -83.225539, 42.463831 ], "pop" : 22758, "state" : "MI" } +{ "_id" : "48076", "city" : "LATHRUP VILLAGE", "loc" : [ -83.22971, 42.499915 ], "pop" : 29081, "state" : "MI" } +{ "_id" : "48079", "city" : "SAINT CLAIR", "loc" : [ -82.513256, 42.825453 ], "pop" : 11681, "state" : "MI" } +{ "_id" : "48080", "city" : "SAINT CLAIR SHOR", "loc" : [ -82.900674, 42.463474 ], "pop" : 25179, "state" : "MI" } +{ "_id" : "48081", "city" : "SAINT CLAIR SHOR", "loc" : [ -82.89995399999999, 42.49538 ], "pop" : 23479, "state" : "MI" } +{ "_id" : "48082", "city" : "SAINT CLAIR SHOR", "loc" : [ -82.886538, 42.526627 ], "pop" : 19975, "state" : "MI" } +{ "_id" : "48083", "city" : "TROY", "loc" : [ -83.113771, 42.559668 ], "pop" : 20459, "state" : "MI" } +{ "_id" : "48084", "city" : "TROY", "loc" : [ -83.179947, 42.562696 ], "pop" : 13010, "state" : "MI" } +{ "_id" : "48089", "city" : "WARREN", "loc" : [ -82.99738499999999, 42.468494 ], "pop" : 35861, "state" : "MI" } +{ "_id" : "48091", "city" : "WARREN", "loc" : [ -83.059263, 42.466463 ], "pop" : 33165, "state" : "MI" } +{ "_id" : "48092", "city" : "WARREN", "loc" : [ -83.064278, 42.512459 ], "pop" : 25781, "state" : "MI" } +{ "_id" : "48093", "city" : "WARREN", "loc" : [ -82.996764, 42.514943 ], "pop" : 50327, "state" : "MI" } +{ "_id" : "48094", "city" : "WASHINGTON", "loc" : [ -83.026805, 42.726202 ], "pop" : 10975, "state" : "MI" } +{ "_id" : "48097", "city" : "BROCKWAY", "loc" : [ -82.797899, 43.122429 ], "pop" : 5665, "state" : "MI" } +{ "_id" : "48098", "city" : "TROY", "loc" : [ -83.14500099999999, 42.598118 ], "pop" : 39379, "state" : "MI" } +{ "_id" : "48101", "city" : "ALLEN PARK", "loc" : [ -83.212001, 42.25223 ], "pop" : 31167, "state" : "MI" } +{ "_id" : "48103", "city" : "ANN ARBOR", "loc" : [ -83.783998, 42.279379 ], "pop" : 41263, "state" : "MI" } +{ "_id" : "48104", "city" : "ANN ARBOR", "loc" : [ -83.728156, 42.26939 ], "pop" : 47564, "state" : "MI" } +{ "_id" : "48105", "city" : "ANN ARBOR", "loc" : [ -83.706756, 42.304247 ], "pop" : 28543, "state" : "MI" } +{ "_id" : "48108", "city" : "ANN ARBOR", "loc" : [ -83.701481, 42.232782 ], "pop" : 17948, "state" : "MI" } +{ "_id" : "48109", "city" : "ANN ARBOR", "loc" : [ -83.715363, 42.293 ], "pop" : 0, "state" : "MI" } +{ "_id" : "48111", "city" : "BELLEVILLE", "loc" : [ -83.48542500000001, 42.194858 ], "pop" : 35436, "state" : "MI" } +{ "_id" : "48116", "city" : "BRIGHTON", "loc" : [ -83.775628, 42.537069 ], "pop" : 37205, "state" : "MI" } +{ "_id" : "48117", "city" : "CARLETON", "loc" : [ -83.375502, 42.052941 ], "pop" : 8144, "state" : "MI" } +{ "_id" : "48118", "city" : "CHELSEA", "loc" : [ -84.03339200000001, 42.320692 ], "pop" : 9504, "state" : "MI" } +{ "_id" : "48120", "city" : "DEARBORN", "loc" : [ -83.160488, 42.305295 ], "pop" : 6325, "state" : "MI" } +{ "_id" : "48122", "city" : "MELVINDALE", "loc" : [ -83.182573, 42.281229 ], "pop" : 11226, "state" : "MI" } +{ "_id" : "48124", "city" : "DEARBORN", "loc" : [ -83.25356499999999, 42.294141 ], "pop" : 34078, "state" : "MI" } +{ "_id" : "48125", "city" : "DEARBORN HEIGHTS", "loc" : [ -83.260603, 42.276824 ], "pop" : 24715, "state" : "MI" } +{ "_id" : "48126", "city" : "DEARBORN", "loc" : [ -83.180065, 42.334882 ], "pop" : 37807, "state" : "MI" } +{ "_id" : "48127", "city" : "DEARBORN HEIGHTS", "loc" : [ -83.286383, 42.335317 ], "pop" : 36123, "state" : "MI" } +{ "_id" : "48128", "city" : "DEARBORN", "loc" : [ -83.27013100000001, 42.319981 ], "pop" : 11076, "state" : "MI" } +{ "_id" : "48130", "city" : "DEXTER", "loc" : [ -83.90002800000001, 42.35832 ], "pop" : 8216, "state" : "MI" } +{ "_id" : "48131", "city" : "DUNDEE", "loc" : [ -83.652165, 41.951435 ], "pop" : 6521, "state" : "MI" } +{ "_id" : "48133", "city" : "ERIE", "loc" : [ -83.495797, 41.782935 ], "pop" : 5101, "state" : "MI" } +{ "_id" : "48134", "city" : "FLAT ROCK", "loc" : [ -83.27952500000001, 42.105521 ], "pop" : 11180, "state" : "MI" } +{ "_id" : "48135", "city" : "GARDEN CITY", "loc" : [ -83.340236, 42.32415 ], "pop" : 31846, "state" : "MI" } +{ "_id" : "48137", "city" : "GREGORY", "loc" : [ -84.046588, 42.450671 ], "pop" : 3323, "state" : "MI" } +{ "_id" : "48138", "city" : "GROSSE ILE", "loc" : [ -83.153828, 42.13465 ], "pop" : 9783, "state" : "MI" } +{ "_id" : "48140", "city" : "IDA", "loc" : [ -83.591561, 41.854928 ], "pop" : 2690, "state" : "MI" } +{ "_id" : "48141", "city" : "INKSTER", "loc" : [ -83.31462999999999, 42.294041 ], "pop" : 30772, "state" : "MI" } +{ "_id" : "48144", "city" : "LAMBERTVILLE", "loc" : [ -83.625865, 41.753055 ], "pop" : 7959, "state" : "MI" } +{ "_id" : "48145", "city" : "LA SALLE", "loc" : [ -83.47148799999999, 41.858489 ], "pop" : 3800, "state" : "MI" } +{ "_id" : "48146", "city" : "LINCOLN PARK", "loc" : [ -83.180688, 42.242211 ], "pop" : 41763, "state" : "MI" } +{ "_id" : "48150", "city" : "LIVONIA", "loc" : [ -83.36494, 42.361503 ], "pop" : 27644, "state" : "MI" } +{ "_id" : "48152", "city" : "LIVONIA", "loc" : [ -83.363603, 42.425793 ], "pop" : 30199, "state" : "MI" } +{ "_id" : "48154", "city" : "LIVONIA", "loc" : [ -83.377157, 42.395796 ], "pop" : 43007, "state" : "MI" } +{ "_id" : "48157", "city" : "LUNA PIER", "loc" : [ -83.436165, 41.815368 ], "pop" : 1758, "state" : "MI" } +{ "_id" : "48158", "city" : "MANCHESTER", "loc" : [ -84.033247, 42.155545 ], "pop" : 6163, "state" : "MI" } +{ "_id" : "48159", "city" : "MAYBEE", "loc" : [ -83.51790200000001, 42.028822 ], "pop" : 3822, "state" : "MI" } +{ "_id" : "48160", "city" : "MILAN", "loc" : [ -83.67763600000001, 42.091373 ], "pop" : 12411, "state" : "MI" } +{ "_id" : "48161", "city" : "DETROIT BEACH", "loc" : [ -83.404848, 41.92751 ], "pop" : 55630, "state" : "MI" } +{ "_id" : "48164", "city" : "NEW BOSTON", "loc" : [ -83.35885500000001, 42.144899 ], "pop" : 9809, "state" : "MI" } +{ "_id" : "48165", "city" : "NEW HUDSON", "loc" : [ -83.63423299999999, 42.507647 ], "pop" : 4233, "state" : "MI" } +{ "_id" : "48166", "city" : "NEWPORT", "loc" : [ -83.280438, 41.976582 ], "pop" : 5651, "state" : "MI" } +{ "_id" : "48167", "city" : "NORTHVILLE", "loc" : [ -83.479355, 42.426245 ], "pop" : 30177, "state" : "MI" } +{ "_id" : "48169", "city" : "PINCKNEY", "loc" : [ -83.909918, 42.459579 ], "pop" : 13071, "state" : "MI" } +{ "_id" : "48170", "city" : "PLYMOUTH", "loc" : [ -83.479946, 42.36882 ], "pop" : 35389, "state" : "MI" } +{ "_id" : "48173", "city" : "GIBRALTAR", "loc" : [ -83.216196, 42.07918 ], "pop" : 9594, "state" : "MI" } +{ "_id" : "48174", "city" : "ROMULUS", "loc" : [ -83.358288, 42.220304 ], "pop" : 23471, "state" : "MI" } +{ "_id" : "48176", "city" : "SALINE", "loc" : [ -83.784936, 42.169844 ], "pop" : 13356, "state" : "MI" } +{ "_id" : "48178", "city" : "SOUTH LYON", "loc" : [ -83.658951, 42.456678 ], "pop" : 15616, "state" : "MI" } +{ "_id" : "48179", "city" : "SOUTH ROCKWOOD", "loc" : [ -83.266302, 42.062405 ], "pop" : 3204, "state" : "MI" } +{ "_id" : "48180", "city" : "TAYLOR", "loc" : [ -83.267269, 42.231738 ], "pop" : 70811, "state" : "MI" } +{ "_id" : "48182", "city" : "TEMPERANCE", "loc" : [ -83.579739, 41.768229 ], "pop" : 15581, "state" : "MI" } +{ "_id" : "48183", "city" : "WOODHAVEN", "loc" : [ -83.218142, 42.134304 ], "pop" : 38874, "state" : "MI" } +{ "_id" : "48184", "city" : "WAYNE", "loc" : [ -83.375812, 42.276805 ], "pop" : 19911, "state" : "MI" } +{ "_id" : "48185", "city" : "WESTLAND", "loc" : [ -83.374908, 42.318882 ], "pop" : 84712, "state" : "MI" } +{ "_id" : "48187", "city" : "CANTON", "loc" : [ -83.46952400000001, 42.332013 ], "pop" : 39308, "state" : "MI" } +{ "_id" : "48188", "city" : "CANTON", "loc" : [ -83.465007, 42.290997 ], "pop" : 17741, "state" : "MI" } +{ "_id" : "48189", "city" : "WHITMORE LAKE", "loc" : [ -83.78282, 42.428904 ], "pop" : 11639, "state" : "MI" } +{ "_id" : "48191", "city" : "WILLIS", "loc" : [ -83.568741, 42.129249 ], "pop" : 2574, "state" : "MI" } +{ "_id" : "48192", "city" : "RIVERVIEW", "loc" : [ -83.182112, 42.196065 ], "pop" : 50509, "state" : "MI" } +{ "_id" : "48195", "city" : "SOUTHGATE", "loc" : [ -83.19991899999999, 42.204434 ], "pop" : 30771, "state" : "MI" } +{ "_id" : "48197", "city" : "YPSILANTI", "loc" : [ -83.63362100000001, 42.232544 ], "pop" : 46790, "state" : "MI" } +{ "_id" : "48198", "city" : "YPSILANTI", "loc" : [ -83.582972, 42.24388 ], "pop" : 39534, "state" : "MI" } +{ "_id" : "48201", "city" : "DETROIT", "loc" : [ -83.06039800000001, 42.347429 ], "pop" : 15920, "state" : "MI" } +{ "_id" : "48202", "city" : "DETROIT", "loc" : [ -83.07961299999999, 42.377033 ], "pop" : 24565, "state" : "MI" } +{ "_id" : "48203", "city" : "HIGHLAND PARK", "loc" : [ -83.100909, 42.421155 ], "pop" : 53352, "state" : "MI" } +{ "_id" : "48204", "city" : "DETROIT", "loc" : [ -83.142151, 42.366098 ], "pop" : 48856, "state" : "MI" } +{ "_id" : "48205", "city" : "DETROIT", "loc" : [ -82.981279, 42.431259 ], "pop" : 65127, "state" : "MI" } +{ "_id" : "48206", "city" : "DETROIT", "loc" : [ -83.108695, 42.374893 ], "pop" : 38035, "state" : "MI" } +{ "_id" : "48207", "city" : "DETROIT", "loc" : [ -83.027101, 42.352373 ], "pop" : 25703, "state" : "MI" } +{ "_id" : "48208", "city" : "DETROIT", "loc" : [ -83.09271099999999, 42.34947 ], "pop" : 14925, "state" : "MI" } +{ "_id" : "48209", "city" : "DETROIT", "loc" : [ -83.115464, 42.309746 ], "pop" : 38839, "state" : "MI" } +{ "_id" : "48210", "city" : "DETROIT", "loc" : [ -83.130281, 42.337603 ], "pop" : 39833, "state" : "MI" } +{ "_id" : "48211", "city" : "DETROIT", "loc" : [ -83.04094499999999, 42.380922 ], "pop" : 13911, "state" : "MI" } +{ "_id" : "48212", "city" : "HAMTRAMCK", "loc" : [ -83.05826500000001, 42.408117 ], "pop" : 42830, "state" : "MI" } +{ "_id" : "48213", "city" : "DETROIT", "loc" : [ -82.99253, 42.39816 ], "pop" : 52700, "state" : "MI" } +{ "_id" : "48214", "city" : "DETROIT", "loc" : [ -82.993798, 42.366944 ], "pop" : 39584, "state" : "MI" } +{ "_id" : "48215", "city" : "DETROIT", "loc" : [ -82.951319, 42.377272 ], "pop" : 24493, "state" : "MI" } +{ "_id" : "48216", "city" : "DETROIT", "loc" : [ -83.082656, 42.327467 ], "pop" : 8592, "state" : "MI" } +{ "_id" : "48217", "city" : "DETROIT", "loc" : [ -83.154545, 42.271914 ], "pop" : 11634, "state" : "MI" } +{ "_id" : "48218", "city" : "RIVER ROUGE", "loc" : [ -83.136432, 42.269229 ], "pop" : 11314, "state" : "MI" } +{ "_id" : "48219", "city" : "DETROIT", "loc" : [ -83.249495, 42.426033 ], "pop" : 63058, "state" : "MI" } +{ "_id" : "48220", "city" : "FERNDALE", "loc" : [ -83.13625999999999, 42.458564 ], "pop" : 28698, "state" : "MI" } +{ "_id" : "48221", "city" : "DETROIT", "loc" : [ -83.149976, 42.425998 ], "pop" : 48068, "state" : "MI" } +{ "_id" : "48223", "city" : "DETROIT", "loc" : [ -83.245403, 42.394453 ], "pop" : 39612, "state" : "MI" } +{ "_id" : "48224", "city" : "DETROIT", "loc" : [ -82.944061, 42.409808 ], "pop" : 52938, "state" : "MI" } +{ "_id" : "48225", "city" : "HARPER WOODS", "loc" : [ -82.92888499999999, 42.437658 ], "pop" : 14937, "state" : "MI" } +{ "_id" : "48226", "city" : "DETROIT", "loc" : [ -83.04843200000001, 42.333346 ], "pop" : 5502, "state" : "MI" } +{ "_id" : "48227", "city" : "DETROIT", "loc" : [ -83.193732, 42.388303 ], "pop" : 68390, "state" : "MI" } +{ "_id" : "48228", "city" : "DETROIT", "loc" : [ -83.216753, 42.35473 ], "pop" : 67215, "state" : "MI" } +{ "_id" : "48229", "city" : "ECORSE", "loc" : [ -83.148943, 42.251881 ], "pop" : 12164, "state" : "MI" } +{ "_id" : "48230", "city" : "GROSSE POINTE", "loc" : [ -82.92439400000001, 42.384694 ], "pop" : 19302, "state" : "MI" } +{ "_id" : "48234", "city" : "DETROIT", "loc" : [ -83.04338300000001, 42.4337 ], "pop" : 47768, "state" : "MI" } +{ "_id" : "48235", "city" : "DETROIT", "loc" : [ -83.19512400000001, 42.426098 ], "pop" : 57165, "state" : "MI" } +{ "_id" : "48236", "city" : "GROSSE POINTE", "loc" : [ -82.900248, 42.427404 ], "pop" : 32076, "state" : "MI" } +{ "_id" : "48237", "city" : "OAK PARK", "loc" : [ -83.183993, 42.466151 ], "pop" : 28884, "state" : "MI" } +{ "_id" : "48238", "city" : "DETROIT", "loc" : [ -83.14114499999999, 42.395932 ], "pop" : 50599, "state" : "MI" } +{ "_id" : "48239", "city" : "REDFORD", "loc" : [ -83.28895, 42.375554 ], "pop" : 39218, "state" : "MI" } +{ "_id" : "48240", "city" : "REDFORD", "loc" : [ -83.30166, 42.426354 ], "pop" : 20297, "state" : "MI" } +{ "_id" : "48242", "city" : "DETROIT", "loc" : [ -83.377081, 42.220718 ], "pop" : 211, "state" : "MI" } +{ "_id" : "48301", "city" : "BLOOMFIELD TOWNS", "loc" : [ -83.2771, 42.545044 ], "pop" : 15338, "state" : "MI" } +{ "_id" : "48302", "city" : "BLOOMFIELD TOWNS", "loc" : [ -83.296271, 42.583237 ], "pop" : 17017, "state" : "MI" } +{ "_id" : "48304", "city" : "BLOOMFIELD TOWNS", "loc" : [ -83.234011, 42.593764 ], "pop" : 16057, "state" : "MI" } +{ "_id" : "48306", "city" : "ROCHESTER HILLS", "loc" : [ -83.164215, 42.710684 ], "pop" : 15755, "state" : "MI" } +{ "_id" : "48307", "city" : "ROCHESTER HILLS", "loc" : [ -83.129124, 42.660185 ], "pop" : 31734, "state" : "MI" } +{ "_id" : "48309", "city" : "ROCHESTER HILLS", "loc" : [ -83.181842, 42.666848 ], "pop" : 27450, "state" : "MI" } +{ "_id" : "48310", "city" : "STERLING HEIGHTS", "loc" : [ -83.07013499999999, 42.564782 ], "pop" : 42255, "state" : "MI" } +{ "_id" : "48312", "city" : "STERLING HEIGHTS", "loc" : [ -83.00289600000001, 42.559203 ], "pop" : 33163, "state" : "MI" } +{ "_id" : "48313", "city" : "STERLING HEIGHTS", "loc" : [ -82.99976599999999, 42.600498 ], "pop" : 33890, "state" : "MI" } +{ "_id" : "48314", "city" : "STERLING HEIGHTS", "loc" : [ -83.03445499999999, 42.612352 ], "pop" : 8502, "state" : "MI" } +{ "_id" : "48315", "city" : "SHELBY TOWNSHIP", "loc" : [ -82.99654700000001, 42.663694 ], "pop" : 11783, "state" : "MI" } +{ "_id" : "48316", "city" : "SHELBY TOWNSHIP", "loc" : [ -83.060928, 42.682668 ], "pop" : 15039, "state" : "MI" } +{ "_id" : "48317", "city" : "SHELBY TOWNSHIP", "loc" : [ -83.048109, 42.640462 ], "pop" : 24775, "state" : "MI" } +{ "_id" : "48320", "city" : "SYLVAN LAKE", "loc" : [ -83.339551, 42.610449 ], "pop" : 4688, "state" : "MI" } +{ "_id" : "48322", "city" : "WEST BLOOMFIELD", "loc" : [ -83.379313, 42.542366 ], "pop" : 26119, "state" : "MI" } +{ "_id" : "48323", "city" : "ORCHARD LAKE", "loc" : [ -83.369342, 42.570171 ], "pop" : 15797, "state" : "MI" } +{ "_id" : "48324", "city" : "ORCHARD LAKE", "loc" : [ -83.39553600000001, 42.598109 ], "pop" : 13719, "state" : "MI" } +{ "_id" : "48326", "city" : "AUBURN HILLS", "loc" : [ -83.237489, 42.658345 ], "pop" : 16184, "state" : "MI" } +{ "_id" : "48327", "city" : "WATERFORD", "loc" : [ -83.407602, 42.643751 ], "pop" : 17213, "state" : "MI" } +{ "_id" : "48328", "city" : "WATERFORD", "loc" : [ -83.354624, 42.642944 ], "pop" : 24330, "state" : "MI" } +{ "_id" : "48329", "city" : "WATERFORD", "loc" : [ -83.38786899999999, 42.687663 ], "pop" : 25125, "state" : "MI" } +{ "_id" : "48331", "city" : "FARMINGTON HILLS", "loc" : [ -83.405433, 42.510042 ], "pop" : 19626, "state" : "MI" } +{ "_id" : "48334", "city" : "FARMINGTON HILLS", "loc" : [ -83.35198, 42.506798 ], "pop" : 17513, "state" : "MI" } +{ "_id" : "48335", "city" : "FARMINGTON HILLS", "loc" : [ -83.40013399999999, 42.463055 ], "pop" : 19715, "state" : "MI" } +{ "_id" : "48336", "city" : "FARMINGTON HILLS", "loc" : [ -83.345465, 42.460938 ], "pop" : 25680, "state" : "MI" } +{ "_id" : "48340", "city" : "PONTIAC", "loc" : [ -83.28933499999999, 42.667955 ], "pop" : 23663, "state" : "MI" } +{ "_id" : "48341", "city" : "PONTIAC", "loc" : [ -83.304149, 42.629449 ], "pop" : 22685, "state" : "MI" } +{ "_id" : "48342", "city" : "PONTIAC", "loc" : [ -83.279236, 42.643856 ], "pop" : 24663, "state" : "MI" } +{ "_id" : "48346", "city" : "INDEPENDENCE", "loc" : [ -83.405658, 42.721637 ], "pop" : 17459, "state" : "MI" } +{ "_id" : "48348", "city" : "INDEPENDENCE", "loc" : [ -83.390568, 42.772414 ], "pop" : 14635, "state" : "MI" } +{ "_id" : "48350", "city" : "SPRINGFIELD", "loc" : [ -83.520022, 42.75413 ], "pop" : 5949, "state" : "MI" } +{ "_id" : "48353", "city" : "HARTLAND", "loc" : [ -83.714674, 42.63561 ], "pop" : 4584, "state" : "MI" } +{ "_id" : "48356", "city" : "HIGHLAND", "loc" : [ -83.58951, 42.669187 ], "pop" : 8161, "state" : "MI" } +{ "_id" : "48357", "city" : "HIGHLAND", "loc" : [ -83.637013, 42.659453 ], "pop" : 7376, "state" : "MI" } +{ "_id" : "48359", "city" : "ORION", "loc" : [ -83.291701, 42.720779 ], "pop" : 5264, "state" : "MI" } +{ "_id" : "48360", "city" : "ORION", "loc" : [ -83.282792, 42.742212 ], "pop" : 6725, "state" : "MI" } +{ "_id" : "48362", "city" : "ORION", "loc" : [ -83.253208, 42.780598 ], "pop" : 11862, "state" : "MI" } +{ "_id" : "48363", "city" : "OAKLAND", "loc" : [ -83.171116, 42.773179 ], "pop" : 3716, "state" : "MI" } +{ "_id" : "48367", "city" : "ADDISON TOWNSHIP", "loc" : [ -83.13808899999999, 42.836423 ], "pop" : 3963, "state" : "MI" } +{ "_id" : "48370", "city" : "OXFORD", "loc" : [ -83.20045500000001, 42.826451 ], "pop" : 1267, "state" : "MI" } +{ "_id" : "48371", "city" : "OXFORD", "loc" : [ -83.282892, 42.822272 ], "pop" : 13306, "state" : "MI" } +{ "_id" : "48374", "city" : "NOVI", "loc" : [ -83.522423, 42.473495 ], "pop" : 5302, "state" : "MI" } +{ "_id" : "48375", "city" : "NOVI", "loc" : [ -83.457741, 42.460354 ], "pop" : 19067, "state" : "MI" } +{ "_id" : "48377", "city" : "NOVI", "loc" : [ -83.472838, 42.513616 ], "pop" : 6011, "state" : "MI" } +{ "_id" : "48380", "city" : "MILFORD", "loc" : [ -83.650796, 42.601951 ], "pop" : 4050, "state" : "MI" } +{ "_id" : "48381", "city" : "MILFORD", "loc" : [ -83.592404, 42.575841 ], "pop" : 10297, "state" : "MI" } +{ "_id" : "48382", "city" : "COMMERCE TOWNSHI", "loc" : [ -83.49467, 42.589424 ], "pop" : 16939, "state" : "MI" } +{ "_id" : "48383", "city" : "WHITE LAKE", "loc" : [ -83.539838, 42.658004 ], "pop" : 7528, "state" : "MI" } +{ "_id" : "48386", "city" : "WHITE LAKE", "loc" : [ -83.473809, 42.641003 ], "pop" : 14778, "state" : "MI" } +{ "_id" : "48390", "city" : "WOLVERINE LAKE", "loc" : [ -83.479623, 42.550384 ], "pop" : 15904, "state" : "MI" } +{ "_id" : "48393", "city" : "WIXOM", "loc" : [ -83.528486, 42.534037 ], "pop" : 9337, "state" : "MI" } +{ "_id" : "48401", "city" : "APPLEGATE", "loc" : [ -82.647865, 43.361899 ], "pop" : 1338, "state" : "MI" } +{ "_id" : "48412", "city" : "ATTICA", "loc" : [ -83.166842, 43.054673 ], "pop" : 5780, "state" : "MI" } +{ "_id" : "48413", "city" : "BAD AXE", "loc" : [ -83.00537799999999, 43.806745 ], "pop" : 7321, "state" : "MI" } +{ "_id" : "48414", "city" : "BANCROFT", "loc" : [ -84.12072499999999, 42.881957 ], "pop" : 7199, "state" : "MI" } +{ "_id" : "48415", "city" : "BIRCH RUN", "loc" : [ -83.79028700000001, 43.264868 ], "pop" : 7961, "state" : "MI" } +{ "_id" : "48416", "city" : "BROWN CITY", "loc" : [ -82.99783600000001, 43.217073 ], "pop" : 4646, "state" : "MI" } +{ "_id" : "48417", "city" : "BURT", "loc" : [ -83.95107299999999, 43.24043 ], "pop" : 5487, "state" : "MI" } +{ "_id" : "48418", "city" : "BYRON", "loc" : [ -83.97297, 42.805928 ], "pop" : 3085, "state" : "MI" } +{ "_id" : "48419", "city" : "CARSONVILLE", "loc" : [ -82.602169, 43.425805 ], "pop" : 2621, "state" : "MI" } +{ "_id" : "48420", "city" : "CLIO", "loc" : [ -83.724949, 43.177885 ], "pop" : 21345, "state" : "MI" } +{ "_id" : "48421", "city" : "COLUMBIAVILLE", "loc" : [ -83.381055, 43.150334 ], "pop" : 6499, "state" : "MI" } +{ "_id" : "48422", "city" : "CROSWELL", "loc" : [ -82.63372099999999, 43.262245 ], "pop" : 5931, "state" : "MI" } +{ "_id" : "48423", "city" : "DAVISON", "loc" : [ -83.526771, 43.034777 ], "pop" : 26713, "state" : "MI" } +{ "_id" : "48426", "city" : "DECKER", "loc" : [ -83.06379099999999, 43.477532 ], "pop" : 480, "state" : "MI" } +{ "_id" : "48427", "city" : "DECKERVILLE", "loc" : [ -82.71911799999999, 43.515087 ], "pop" : 4623, "state" : "MI" } +{ "_id" : "48428", "city" : "DRYDEN", "loc" : [ -83.150066, 42.937772 ], "pop" : 3095, "state" : "MI" } +{ "_id" : "48429", "city" : "DURAND", "loc" : [ -83.987651, 42.91171 ], "pop" : 7797, "state" : "MI" } +{ "_id" : "48430", "city" : "FENTON", "loc" : [ -83.72935099999999, 42.785098 ], "pop" : 25337, "state" : "MI" } +{ "_id" : "48432", "city" : "FILION", "loc" : [ -82.982483, 43.901362 ], "pop" : 988, "state" : "MI" } +{ "_id" : "48433", "city" : "FLUSHING", "loc" : [ -83.84239100000001, 43.071954 ], "pop" : 23082, "state" : "MI" } +{ "_id" : "48435", "city" : "FOSTORIA", "loc" : [ -83.379593, 43.264504 ], "pop" : 2242, "state" : "MI" } +{ "_id" : "48436", "city" : "GAINES", "loc" : [ -83.885488, 42.881333 ], "pop" : 2931, "state" : "MI" } +{ "_id" : "48438", "city" : "GOODRICH", "loc" : [ -83.484459, 42.914734 ], "pop" : 5184, "state" : "MI" } +{ "_id" : "48439", "city" : "GRAND BLANC", "loc" : [ -83.626414, 42.928163 ], "pop" : 30329, "state" : "MI" } +{ "_id" : "48441", "city" : "HARBOR BEACH", "loc" : [ -82.688608, 43.831249 ], "pop" : 4046, "state" : "MI" } +{ "_id" : "48442", "city" : "HOLLY", "loc" : [ -83.612737, 42.790494 ], "pop" : 15119, "state" : "MI" } +{ "_id" : "48444", "city" : "IMLAY CITY", "loc" : [ -83.07079899999999, 43.042512 ], "pop" : 6493, "state" : "MI" } +{ "_id" : "48445", "city" : "KINDE", "loc" : [ -82.97552899999999, 43.948003 ], "pop" : 1082, "state" : "MI" } +{ "_id" : "48446", "city" : "LAPEER", "loc" : [ -83.333153, 43.057879 ], "pop" : 27632, "state" : "MI" } +{ "_id" : "48449", "city" : "LENNON", "loc" : [ -83.927908, 42.969323 ], "pop" : 3778, "state" : "MI" } +{ "_id" : "48450", "city" : "LEXINGTON", "loc" : [ -82.530103, 43.24348 ], "pop" : 3815, "state" : "MI" } +{ "_id" : "48451", "city" : "LINDEN", "loc" : [ -83.79928099999999, 42.810379 ], "pop" : 10127, "state" : "MI" } +{ "_id" : "48453", "city" : "MARLETTE", "loc" : [ -83.057253, 43.339882 ], "pop" : 4869, "state" : "MI" } +{ "_id" : "48454", "city" : "MELVIN", "loc" : [ -82.839277, 43.19304 ], "pop" : 816, "state" : "MI" } +{ "_id" : "48455", "city" : "METAMORA", "loc" : [ -83.318371, 42.942365 ], "pop" : 6719, "state" : "MI" } +{ "_id" : "48456", "city" : "MINDEN CITY", "loc" : [ -82.72986299999999, 43.681393 ], "pop" : 1637, "state" : "MI" } +{ "_id" : "48457", "city" : "MONTROSE", "loc" : [ -83.882411, 43.175381 ], "pop" : 7181, "state" : "MI" } +{ "_id" : "48458", "city" : "MOUNT MORRIS", "loc" : [ -83.68952299999999, 43.11601 ], "pop" : 27347, "state" : "MI" } +{ "_id" : "48460", "city" : "NEW LOTHROP", "loc" : [ -83.98514400000001, 43.138781 ], "pop" : 3206, "state" : "MI" } +{ "_id" : "48461", "city" : "NORTH BRANCH", "loc" : [ -83.226664, 43.206887 ], "pop" : 6106, "state" : "MI" } +{ "_id" : "48462", "city" : "ORTONVILLE", "loc" : [ -83.428811, 42.840943 ], "pop" : 10315, "state" : "MI" } +{ "_id" : "48463", "city" : "OTISVILLE", "loc" : [ -83.51718700000001, 43.170584 ], "pop" : 4130, "state" : "MI" } +{ "_id" : "48464", "city" : "OTTER LAKE", "loc" : [ -83.42421899999999, 43.218334 ], "pop" : 2442, "state" : "MI" } +{ "_id" : "48465", "city" : "PALMS", "loc" : [ -82.70173699999999, 43.625671 ], "pop" : 611, "state" : "MI" } +{ "_id" : "48466", "city" : "PECK", "loc" : [ -82.81929, 43.26938 ], "pop" : 1658, "state" : "MI" } +{ "_id" : "48467", "city" : "PORT AUSTIN", "loc" : [ -82.99842700000001, 44.022292 ], "pop" : 2508, "state" : "MI" } +{ "_id" : "48468", "city" : "PORT HOPE", "loc" : [ -82.752893, 43.927989 ], "pop" : 1490, "state" : "MI" } +{ "_id" : "48469", "city" : "PORT SANILAC", "loc" : [ -82.54679400000001, 43.43292 ], "pop" : 254, "state" : "MI" } +{ "_id" : "48470", "city" : "RUTH", "loc" : [ -82.74139599999999, 43.740436 ], "pop" : 1162, "state" : "MI" } +{ "_id" : "48471", "city" : "SANDUSKY", "loc" : [ -82.84093900000001, 43.405541 ], "pop" : 4198, "state" : "MI" } +{ "_id" : "48472", "city" : "SNOVER", "loc" : [ -82.930063, 43.488649 ], "pop" : 2301, "state" : "MI" } +{ "_id" : "48473", "city" : "SWARTZ CREEK", "loc" : [ -83.81700499999999, 42.946776 ], "pop" : 18263, "state" : "MI" } +{ "_id" : "48475", "city" : "UBLY", "loc" : [ -82.96401299999999, 43.689631 ], "pop" : 2802, "state" : "MI" } +{ "_id" : "48502", "city" : "FLINT", "loc" : [ -83.68776800000001, 43.012321 ], "pop" : 1359, "state" : "MI" } +{ "_id" : "48503", "city" : "FLINT", "loc" : [ -83.691429, 43.012836 ], "pop" : 33451, "state" : "MI" } +{ "_id" : "48504", "city" : "NORTHWEST", "loc" : [ -83.72990799999999, 43.04247 ], "pop" : 40445, "state" : "MI" } +{ "_id" : "48505", "city" : "FLINT", "loc" : [ -83.700093, 43.063369 ], "pop" : 42423, "state" : "MI" } +{ "_id" : "48506", "city" : "NORTHEAST", "loc" : [ -83.640192, 43.052596 ], "pop" : 35154, "state" : "MI" } +{ "_id" : "48507", "city" : "FLINT", "loc" : [ -83.688999, 42.97303 ], "pop" : 37656, "state" : "MI" } +{ "_id" : "48509", "city" : "NORTHEAST", "loc" : [ -83.606295, 43.024493 ], "pop" : 9432, "state" : "MI" } +{ "_id" : "48519", "city" : "SOUTHEAST", "loc" : [ -83.61042399999999, 42.993847 ], "pop" : 6081, "state" : "MI" } +{ "_id" : "48529", "city" : "SOUTHEAST", "loc" : [ -83.671064, 42.97268 ], "pop" : 11092, "state" : "MI" } +{ "_id" : "48532", "city" : "NORTHWEST", "loc" : [ -83.768576, 43.01021 ], "pop" : 20367, "state" : "MI" } +{ "_id" : "48601", "city" : "SAGINAW", "loc" : [ -83.915626, 43.404692 ], "pop" : 55547, "state" : "MI" } +{ "_id" : "48602", "city" : "SAGINAW", "loc" : [ -83.97445500000001, 43.424838 ], "pop" : 34096, "state" : "MI" } +{ "_id" : "48603", "city" : "SAGINAW", "loc" : [ -84.03028, 43.43251 ], "pop" : 49303, "state" : "MI" } +{ "_id" : "48604", "city" : "SAGINAW", "loc" : [ -83.951421, 43.473223 ], "pop" : 11937, "state" : "MI" } +{ "_id" : "48607", "city" : "SAGINAW", "loc" : [ -83.931872, 43.430141 ], "pop" : 3436, "state" : "MI" } +{ "_id" : "48610", "city" : "ALGER", "loc" : [ -84.18719, 44.139488 ], "pop" : 2015, "state" : "MI" } +{ "_id" : "48611", "city" : "AUBURN", "loc" : [ -84.10267, 43.607988 ], "pop" : 6154, "state" : "MI" } +{ "_id" : "48612", "city" : "BEAVERTON", "loc" : [ -84.424059, 43.886576 ], "pop" : 9682, "state" : "MI" } +{ "_id" : "48613", "city" : "BENTLEY", "loc" : [ -84.144738, 43.886028 ], "pop" : 1022, "state" : "MI" } +{ "_id" : "48614", "city" : "BRANT", "loc" : [ -84.297849, 43.25484 ], "pop" : 1572, "state" : "MI" } +{ "_id" : "48615", "city" : "BRECKENRIDGE", "loc" : [ -84.502319, 43.393463 ], "pop" : 2266, "state" : "MI" } +{ "_id" : "48616", "city" : "CHESANING", "loc" : [ -84.112156, 43.182387 ], "pop" : 4567, "state" : "MI" } +{ "_id" : "48617", "city" : "CLARE", "loc" : [ -84.763463, 43.822318 ], "pop" : 6635, "state" : "MI" } +{ "_id" : "48618", "city" : "COLEMAN", "loc" : [ -84.591058, 43.749397 ], "pop" : 5866, "state" : "MI" } +{ "_id" : "48619", "city" : "COMINS", "loc" : [ -84.026061, 44.826354 ], "pop" : 515, "state" : "MI" } +{ "_id" : "48620", "city" : "EDENVILLE", "loc" : [ -84.396227, 43.802757 ], "pop" : 237, "state" : "MI" } +{ "_id" : "48621", "city" : "FAIRVIEW", "loc" : [ -84.052532, 44.72046 ], "pop" : 1785, "state" : "MI" } +{ "_id" : "48622", "city" : "FARWELL", "loc" : [ -84.87540199999999, 43.834163 ], "pop" : 4456, "state" : "MI" } +{ "_id" : "48623", "city" : "FREELAND", "loc" : [ -84.18217300000001, 43.516134 ], "pop" : 10892, "state" : "MI" } +{ "_id" : "48624", "city" : "GLADWIN", "loc" : [ -84.496801, 44.029618 ], "pop" : 11790, "state" : "MI" } +{ "_id" : "48625", "city" : "HARRISON", "loc" : [ -84.77289, 44.028478 ], "pop" : 9223, "state" : "MI" } +{ "_id" : "48626", "city" : "HEMLOCK", "loc" : [ -84.226563, 43.409911 ], "pop" : 5711, "state" : "MI" } +{ "_id" : "48628", "city" : "HOPE", "loc" : [ -84.329605, 43.788167 ], "pop" : 1339, "state" : "MI" } +{ "_id" : "48629", "city" : "HOUGHTON LAKE", "loc" : [ -84.742175, 44.341327 ], "pop" : 5625, "state" : "MI" } +{ "_id" : "48631", "city" : "KAWKAWLIN", "loc" : [ -83.99265699999999, 43.679399 ], "pop" : 3935, "state" : "MI" } +{ "_id" : "48632", "city" : "LAKE", "loc" : [ -84.97859699999999, 43.850164 ], "pop" : 7779, "state" : "MI" } +{ "_id" : "48634", "city" : "LINWOOD", "loc" : [ -84.013341, 43.737448 ], "pop" : 4719, "state" : "MI" } +{ "_id" : "48635", "city" : "LUPTON", "loc" : [ -83.99047299999999, 44.397578 ], "pop" : 1784, "state" : "MI" } +{ "_id" : "48636", "city" : "LUZERNE", "loc" : [ -84.246742, 44.629594 ], "pop" : 744, "state" : "MI" } +{ "_id" : "48637", "city" : "MERRILL", "loc" : [ -84.33075700000001, 43.393892 ], "pop" : 2702, "state" : "MI" } +{ "_id" : "48640", "city" : "MIDLAND", "loc" : [ -84.26796, 43.637562 ], "pop" : 26370, "state" : "MI" } +{ "_id" : "48642", "city" : "MIDLAND", "loc" : [ -84.197941, 43.637488 ], "pop" : 24643, "state" : "MI" } +{ "_id" : "48647", "city" : "MIO", "loc" : [ -84.13526400000001, 44.666481 ], "pop" : 3508, "state" : "MI" } +{ "_id" : "48649", "city" : "OAKLEY", "loc" : [ -84.209379, 43.150533 ], "pop" : 3506, "state" : "MI" } +{ "_id" : "48650", "city" : "PINCONNING", "loc" : [ -84.008162, 43.849079 ], "pop" : 8659, "state" : "MI" } +{ "_id" : "48651", "city" : "PRUDENVILLE", "loc" : [ -84.662747, 44.297394 ], "pop" : 4484, "state" : "MI" } +{ "_id" : "48652", "city" : "RHODES", "loc" : [ -84.213402, 43.851745 ], "pop" : 2034, "state" : "MI" } +{ "_id" : "48653", "city" : "ROSCOMMON", "loc" : [ -84.66009200000001, 44.483908 ], "pop" : 8311, "state" : "MI" } +{ "_id" : "48654", "city" : "ROSE CITY", "loc" : [ -84.125562, 44.41672 ], "pop" : 2962, "state" : "MI" } +{ "_id" : "48655", "city" : "SAINT CHARLES", "loc" : [ -84.159785, 43.286271 ], "pop" : 6272, "state" : "MI" } +{ "_id" : "48656", "city" : "SAINT HELEN", "loc" : [ -84.42470400000001, 44.366489 ], "pop" : 3686, "state" : "MI" } +{ "_id" : "48657", "city" : "SANFORD", "loc" : [ -84.39544600000001, 43.720352 ], "pop" : 5154, "state" : "MI" } +{ "_id" : "48658", "city" : "STANDISH", "loc" : [ -83.943297, 43.973287 ], "pop" : 5314, "state" : "MI" } +{ "_id" : "48659", "city" : "STERLING", "loc" : [ -84.012567, 44.067837 ], "pop" : 2855, "state" : "MI" } +{ "_id" : "48661", "city" : "WEST BRANCH", "loc" : [ -84.228623, 44.279032 ], "pop" : 7739, "state" : "MI" } +{ "_id" : "48662", "city" : "WHEELER", "loc" : [ -84.424335, 43.396224 ], "pop" : 2144, "state" : "MI" } +{ "_id" : "48701", "city" : "AKRON", "loc" : [ -83.53926199999999, 43.584373 ], "pop" : 1694, "state" : "MI" } +{ "_id" : "48703", "city" : "AU GRES", "loc" : [ -83.70202399999999, 44.033802 ], "pop" : 1568, "state" : "MI" } +{ "_id" : "48705", "city" : "BARTON CITY", "loc" : [ -83.599372, 44.701956 ], "pop" : 755, "state" : "MI" } +{ "_id" : "48706", "city" : "UNIVERSITY CENTE", "loc" : [ -83.91988499999999, 43.612165 ], "pop" : 41677, "state" : "MI" } +{ "_id" : "48708", "city" : "BAY CITY", "loc" : [ -83.878073, 43.58205 ], "pop" : 29918, "state" : "MI" } +{ "_id" : "48720", "city" : "BAY PORT", "loc" : [ -83.35246100000001, 43.837744 ], "pop" : 1693, "state" : "MI" } +{ "_id" : "48721", "city" : "BLACK RIVER", "loc" : [ -83.34071, 44.813842 ], "pop" : 373, "state" : "MI" } +{ "_id" : "48722", "city" : "BRIDGEPORT", "loc" : [ -83.854906, 43.355309 ], "pop" : 3792, "state" : "MI" } +{ "_id" : "48723", "city" : "CARO", "loc" : [ -83.38346900000001, 43.483272 ], "pop" : 11389, "state" : "MI" } +{ "_id" : "48725", "city" : "CASEVILLE", "loc" : [ -83.265924, 43.94292 ], "pop" : 2939, "state" : "MI" } +{ "_id" : "48726", "city" : "CASS CITY", "loc" : [ -83.173264, 43.579677 ], "pop" : 7414, "state" : "MI" } +{ "_id" : "48727", "city" : "CLIFFORD", "loc" : [ -83.174105, 43.309953 ], "pop" : 1444, "state" : "MI" } +{ "_id" : "48728", "city" : "CURRAN", "loc" : [ -83.83198899999999, 44.733606 ], "pop" : 188, "state" : "MI" } +{ "_id" : "48729", "city" : "DEFORD", "loc" : [ -83.170244, 43.473482 ], "pop" : 556, "state" : "MI" } +{ "_id" : "48730", "city" : "EAST TAWAS", "loc" : [ -83.47762899999999, 44.300823 ], "pop" : 5006, "state" : "MI" } +{ "_id" : "48731", "city" : "ELKTON", "loc" : [ -83.178642, 43.834437 ], "pop" : 2292, "state" : "MI" } +{ "_id" : "48732", "city" : "ESSEXVILLE", "loc" : [ -83.821659, 43.606908 ], "pop" : 12019, "state" : "MI" } +{ "_id" : "48733", "city" : "FAIRGROVE", "loc" : [ -83.583534, 43.512574 ], "pop" : 3175, "state" : "MI" } +{ "_id" : "48734", "city" : "FRANKENMUTH", "loc" : [ -83.74748200000001, 43.340965 ], "pop" : 6931, "state" : "MI" } +{ "_id" : "48735", "city" : "GAGETOWN", "loc" : [ -83.262788, 43.654251 ], "pop" : 759, "state" : "MI" } +{ "_id" : "48737", "city" : "GLENNIE", "loc" : [ -83.689948, 44.558234 ], "pop" : 1153, "state" : "MI" } +{ "_id" : "48738", "city" : "GREENBUSH", "loc" : [ -83.326883, 44.548044 ], "pop" : 1121, "state" : "MI" } +{ "_id" : "48739", "city" : "HALE", "loc" : [ -83.83594100000001, 44.38189 ], "pop" : 3317, "state" : "MI" } +{ "_id" : "48740", "city" : "HARRISVILLE", "loc" : [ -83.34242999999999, 44.654595 ], "pop" : 2250, "state" : "MI" } +{ "_id" : "48741", "city" : "KINGSTON", "loc" : [ -83.184727, 43.398153 ], "pop" : 2475, "state" : "MI" } +{ "_id" : "48742", "city" : "LINCOLN", "loc" : [ -83.39466899999999, 44.711124 ], "pop" : 1167, "state" : "MI" } +{ "_id" : "48743", "city" : "LONG LAKE", "loc" : [ -83.817058, 44.448465 ], "pop" : 349, "state" : "MI" } +{ "_id" : "48744", "city" : "MAYVILLE", "loc" : [ -83.372529, 43.356156 ], "pop" : 4271, "state" : "MI" } +{ "_id" : "48745", "city" : "MIKADO", "loc" : [ -83.435518, 44.583275 ], "pop" : 1392, "state" : "MI" } +{ "_id" : "48746", "city" : "MILLINGTON", "loc" : [ -83.561944, 43.271772 ], "pop" : 8752, "state" : "MI" } +{ "_id" : "48747", "city" : "MUNGER", "loc" : [ -83.76722100000001, 43.528585 ], "pop" : 1898, "state" : "MI" } +{ "_id" : "48748", "city" : "NATIONAL CITY", "loc" : [ -83.683948, 44.313746 ], "pop" : 1823, "state" : "MI" } +{ "_id" : "48749", "city" : "OMER", "loc" : [ -83.842956, 44.049939 ], "pop" : 965, "state" : "MI" } +{ "_id" : "48750", "city" : "OSCODA", "loc" : [ -83.361908, 44.446485 ], "pop" : 14188, "state" : "MI" } +{ "_id" : "48754", "city" : "OWENDALE", "loc" : [ -83.23070300000001, 43.720648 ], "pop" : 1833, "state" : "MI" } +{ "_id" : "48755", "city" : "PIGEON", "loc" : [ -83.275508, 43.817909 ], "pop" : 1891, "state" : "MI" } +{ "_id" : "48756", "city" : "PRESCOTT", "loc" : [ -84.021197, 44.20999 ], "pop" : 4816, "state" : "MI" } +{ "_id" : "48757", "city" : "REESE", "loc" : [ -83.70152899999999, 43.453094 ], "pop" : 2830, "state" : "MI" } +{ "_id" : "48759", "city" : "SEBEWAING", "loc" : [ -83.436622, 43.728888 ], "pop" : 3203, "state" : "MI" } +{ "_id" : "48760", "city" : "SILVERWOOD", "loc" : [ -83.271974, 43.31413 ], "pop" : 964, "state" : "MI" } +{ "_id" : "48761", "city" : "SOUTH BRANCH", "loc" : [ -83.868574, 44.501403 ], "pop" : 968, "state" : "MI" } +{ "_id" : "48762", "city" : "SPRUCE", "loc" : [ -83.504391, 44.822443 ], "pop" : 1531, "state" : "MI" } +{ "_id" : "48763", "city" : "TAWAS CITY", "loc" : [ -83.544905, 44.267485 ], "pop" : 3868, "state" : "MI" } +{ "_id" : "48765", "city" : "TURNER", "loc" : [ -83.650679, 44.10543 ], "pop" : 2664, "state" : "MI" } +{ "_id" : "48766", "city" : "TWINING", "loc" : [ -83.849118, 44.12929 ], "pop" : 934, "state" : "MI" } +{ "_id" : "48767", "city" : "UNIONVILLE", "loc" : [ -83.469898, 43.647341 ], "pop" : 2111, "state" : "MI" } +{ "_id" : "48768", "city" : "VASSAR", "loc" : [ -83.58444900000001, 43.369052 ], "pop" : 9979, "state" : "MI" } +{ "_id" : "48770", "city" : "WHITTEMORE", "loc" : [ -83.806842, 44.232514 ], "pop" : 1754, "state" : "MI" } +{ "_id" : "48801", "city" : "ALMA", "loc" : [ -84.663484, 43.380877 ], "pop" : 11018, "state" : "MI" } +{ "_id" : "48806", "city" : "ASHLEY", "loc" : [ -84.48796, 43.189103 ], "pop" : 2278, "state" : "MI" } +{ "_id" : "48807", "city" : "BANNISTER", "loc" : [ -84.359679, 43.161537 ], "pop" : 1499, "state" : "MI" } +{ "_id" : "48808", "city" : "BATH", "loc" : [ -84.45454700000001, 42.820563 ], "pop" : 3695, "state" : "MI" } +{ "_id" : "48809", "city" : "BELDING", "loc" : [ -85.231272, 43.088546 ], "pop" : 8995, "state" : "MI" } +{ "_id" : "48811", "city" : "CARSON CITY", "loc" : [ -84.865334, 43.169496 ], "pop" : 4190, "state" : "MI" } +{ "_id" : "48813", "city" : "CHARLOTTE", "loc" : [ -84.83518100000001, 42.570169 ], "pop" : 17424, "state" : "MI" } +{ "_id" : "48815", "city" : "CLARKSVILLE", "loc" : [ -85.24938400000001, 42.830177 ], "pop" : 2027, "state" : "MI" } +{ "_id" : "48817", "city" : "CORUNNA", "loc" : [ -84.027618, 43.041402 ], "pop" : 3906, "state" : "MI" } +{ "_id" : "48818", "city" : "CRYSTAL", "loc" : [ -84.899328, 43.262382 ], "pop" : 2279, "state" : "MI" } +{ "_id" : "48819", "city" : "DANSVILLE", "loc" : [ -84.293932, 42.550485 ], "pop" : 2338, "state" : "MI" } +{ "_id" : "48820", "city" : "DEWITT", "loc" : [ -84.579654, 42.842784 ], "pop" : 10811, "state" : "MI" } +{ "_id" : "48821", "city" : "DIMONDALE", "loc" : [ -84.64859300000001, 42.650094 ], "pop" : 5131, "state" : "MI" } +{ "_id" : "48822", "city" : "EAGLE", "loc" : [ -84.758971, 42.826306 ], "pop" : 1937, "state" : "MI" } +{ "_id" : "48823", "city" : "EAST LANSING", "loc" : [ -84.476409, 42.738805 ], "pop" : 61997, "state" : "MI" } +{ "_id" : "48827", "city" : "EATON RAPIDS", "loc" : [ -84.65654499999999, 42.516624 ], "pop" : 12987, "state" : "MI" } +{ "_id" : "48829", "city" : "EDMORE", "loc" : [ -85.028003, 43.411578 ], "pop" : 2515, "state" : "MI" } +{ "_id" : "48831", "city" : "CARLAND", "loc" : [ -84.39096499999999, 43.086918 ], "pop" : 2487, "state" : "MI" } +{ "_id" : "48832", "city" : "ELWELL", "loc" : [ -84.763103, 43.410565 ], "pop" : 1006, "state" : "MI" } +{ "_id" : "48834", "city" : "FENWICK", "loc" : [ -85.06656599999999, 43.149682 ], "pop" : 1440, "state" : "MI" } +{ "_id" : "48835", "city" : "FOWLER", "loc" : [ -84.759969, 42.994144 ], "pop" : 2253, "state" : "MI" } +{ "_id" : "48836", "city" : "FOWLERVILLE", "loc" : [ -84.072085, 42.661438 ], "pop" : 8519, "state" : "MI" } +{ "_id" : "48837", "city" : "GRAND LEDGE", "loc" : [ -84.737314, 42.752924 ], "pop" : 16000, "state" : "MI" } +{ "_id" : "48838", "city" : "GREENVILLE", "loc" : [ -85.24970500000001, 43.17926 ], "pop" : 12208, "state" : "MI" } +{ "_id" : "48840", "city" : "HASLETT", "loc" : [ -84.398887, 42.753088 ], "pop" : 10679, "state" : "MI" } +{ "_id" : "48841", "city" : "HENDERSON", "loc" : [ -84.185777, 43.081708 ], "pop" : 534, "state" : "MI" } +{ "_id" : "48842", "city" : "HOLT", "loc" : [ -84.524232, 42.639401 ], "pop" : 15960, "state" : "MI" } +{ "_id" : "48843", "city" : "HOWELL", "loc" : [ -83.92480999999999, 42.615933 ], "pop" : 28075, "state" : "MI" } +{ "_id" : "48845", "city" : "HUBBARDSTON", "loc" : [ -84.81728200000001, 43.082776 ], "pop" : 1407, "state" : "MI" } +{ "_id" : "48846", "city" : "IONIA", "loc" : [ -85.07098499999999, 42.98592 ], "pop" : 18602, "state" : "MI" } +{ "_id" : "48847", "city" : "ITHACA", "loc" : [ -84.60883, 43.282808 ], "pop" : 6418, "state" : "MI" } +{ "_id" : "48848", "city" : "LAINGSBURG", "loc" : [ -84.352991, 42.86271 ], "pop" : 8214, "state" : "MI" } +{ "_id" : "48849", "city" : "LAKE ODESSA", "loc" : [ -85.135667, 42.786335 ], "pop" : 5386, "state" : "MI" } +{ "_id" : "48850", "city" : "LAKEVIEW", "loc" : [ -85.292421, 43.42694 ], "pop" : 6000, "state" : "MI" } +{ "_id" : "48851", "city" : "LYONS", "loc" : [ -84.92094299999999, 42.963429 ], "pop" : 2488, "state" : "MI" } +{ "_id" : "48854", "city" : "MASON", "loc" : [ -84.45609, 42.579588 ], "pop" : 17286, "state" : "MI" } +{ "_id" : "48856", "city" : "MIDDLETON", "loc" : [ -84.75522100000001, 43.168911 ], "pop" : 1181, "state" : "MI" } +{ "_id" : "48857", "city" : "MORRICE", "loc" : [ -84.176771, 42.83851 ], "pop" : 718, "state" : "MI" } +{ "_id" : "48858", "city" : "MOUNT PLEASANT", "loc" : [ -84.773571, 43.601295 ], "pop" : 33732, "state" : "MI" } +{ "_id" : "48860", "city" : "MUIR", "loc" : [ -84.93908999999999, 43.043864 ], "pop" : 1885, "state" : "MI" } +{ "_id" : "48861", "city" : "MULLIKEN", "loc" : [ -84.89791099999999, 42.737657 ], "pop" : 1903, "state" : "MI" } +{ "_id" : "48864", "city" : "OKEMOS", "loc" : [ -84.418696, 42.705341 ], "pop" : 17587, "state" : "MI" } +{ "_id" : "48865", "city" : "ORLEANS", "loc" : [ -85.116547, 43.089459 ], "pop" : 1678, "state" : "MI" } +{ "_id" : "48866", "city" : "OVID", "loc" : [ -84.36493900000001, 42.996927 ], "pop" : 5004, "state" : "MI" } +{ "_id" : "48867", "city" : "OWOSSO", "loc" : [ -84.159486, 42.993407 ], "pop" : 29958, "state" : "MI" } +{ "_id" : "48871", "city" : "PERRINTON", "loc" : [ -84.66598399999999, 43.16492 ], "pop" : 1791, "state" : "MI" } +{ "_id" : "48872", "city" : "PERRY", "loc" : [ -84.231346, 42.820012 ], "pop" : 5746, "state" : "MI" } +{ "_id" : "48873", "city" : "PEWAMO", "loc" : [ -84.849217, 43.000747 ], "pop" : 654, "state" : "MI" } +{ "_id" : "48875", "city" : "PORTLAND", "loc" : [ -84.913933, 42.862414 ], "pop" : 8824, "state" : "MI" } +{ "_id" : "48876", "city" : "POTTERVILLE", "loc" : [ -84.734589, 42.639779 ], "pop" : 2795, "state" : "MI" } +{ "_id" : "48877", "city" : "RIVERDALE", "loc" : [ -84.826607, 43.409817 ], "pop" : 1211, "state" : "MI" } +{ "_id" : "48878", "city" : "ROSEBUSH", "loc" : [ -84.783299, 43.68427 ], "pop" : 2025, "state" : "MI" } +{ "_id" : "48879", "city" : "SAINT JOHNS", "loc" : [ -84.571934, 43.005924 ], "pop" : 16472, "state" : "MI" } +{ "_id" : "48880", "city" : "SAINT LOUIS", "loc" : [ -84.59523900000001, 43.42777 ], "pop" : 7552, "state" : "MI" } +{ "_id" : "48881", "city" : "SARANAC", "loc" : [ -85.229938, 42.928534 ], "pop" : 5911, "state" : "MI" } +{ "_id" : "48883", "city" : "SHEPHERD", "loc" : [ -84.587317, 43.565668 ], "pop" : 17397, "state" : "MI" } +{ "_id" : "48884", "city" : "SHERIDAN", "loc" : [ -85.04683799999999, 43.212632 ], "pop" : 3030, "state" : "MI" } +{ "_id" : "48885", "city" : "SIDNEY", "loc" : [ -85.120671, 43.23579 ], "pop" : 642, "state" : "MI" } +{ "_id" : "48886", "city" : "SIX LAKES", "loc" : [ -85.141569, 43.433714 ], "pop" : 2132, "state" : "MI" } +{ "_id" : "48888", "city" : "STANTON", "loc" : [ -85.099548, 43.305841 ], "pop" : 6997, "state" : "MI" } +{ "_id" : "48889", "city" : "SUMNER", "loc" : [ -84.790662, 43.309144 ], "pop" : 2771, "state" : "MI" } +{ "_id" : "48890", "city" : "SUNFIELD", "loc" : [ -84.98130500000001, 42.769314 ], "pop" : 2282, "state" : "MI" } +{ "_id" : "48891", "city" : "VESTABURG", "loc" : [ -84.908168, 43.387025 ], "pop" : 3540, "state" : "MI" } +{ "_id" : "48892", "city" : "WEBBERVILLE", "loc" : [ -84.17013, 42.662981 ], "pop" : 4561, "state" : "MI" } +{ "_id" : "48893", "city" : "WEIDMAN", "loc" : [ -85.00456699999999, 43.645284 ], "pop" : 708, "state" : "MI" } +{ "_id" : "48894", "city" : "WESTPHALIA", "loc" : [ -84.785567, 42.912308 ], "pop" : 2099, "state" : "MI" } +{ "_id" : "48895", "city" : "WILLIAMSTON", "loc" : [ -84.292596, 42.696652 ], "pop" : 9270, "state" : "MI" } +{ "_id" : "48897", "city" : "WOODLAND", "loc" : [ -85.13261, 42.705654 ], "pop" : 1405, "state" : "MI" } +{ "_id" : "48906", "city" : "LANSING", "loc" : [ -84.558043, 42.763464 ], "pop" : 28434, "state" : "MI" } +{ "_id" : "48910", "city" : "LANSING", "loc" : [ -84.54900499999999, 42.700784 ], "pop" : 37654, "state" : "MI" } +{ "_id" : "48911", "city" : "LANSING", "loc" : [ -84.577168, 42.679727 ], "pop" : 39930, "state" : "MI" } +{ "_id" : "48912", "city" : "LANSING", "loc" : [ -84.52441399999999, 42.737115 ], "pop" : 19898, "state" : "MI" } +{ "_id" : "48915", "city" : "LANSING", "loc" : [ -84.570398, 42.739074 ], "pop" : 11703, "state" : "MI" } +{ "_id" : "48917", "city" : "LANSING", "loc" : [ -84.62439000000001, 42.737621 ], "pop" : 28475, "state" : "MI" } +{ "_id" : "48933", "city" : "LANSING", "loc" : [ -84.557142, 42.733429 ], "pop" : 2780, "state" : "MI" } +{ "_id" : "49001", "city" : "KALAMAZOO", "loc" : [ -85.545653, 42.273565 ], "pop" : 45278, "state" : "MI" } +{ "_id" : "49002", "city" : "KALAMAZOO", "loc" : [ -85.595691, 42.207482 ], "pop" : 40439, "state" : "MI" } +{ "_id" : "49004", "city" : "PARCHMENT", "loc" : [ -85.54195900000001, 42.326538 ], "pop" : 15968, "state" : "MI" } +{ "_id" : "49007", "city" : "KALAMAZOO", "loc" : [ -85.613722, 42.295688 ], "pop" : 44854, "state" : "MI" } +{ "_id" : "49008", "city" : "KALAMAZOO", "loc" : [ -85.609645, 42.262432 ], "pop" : 19435, "state" : "MI" } +{ "_id" : "49009", "city" : "KALAMAZOO", "loc" : [ -85.686333, 42.280947 ], "pop" : 22218, "state" : "MI" } +{ "_id" : "49010", "city" : "ALLEGAN", "loc" : [ -85.86608, 42.525609 ], "pop" : 15532, "state" : "MI" } +{ "_id" : "49011", "city" : "ATHENS", "loc" : [ -85.231742, 42.102962 ], "pop" : 2436, "state" : "MI" } +{ "_id" : "49012", "city" : "AUGUSTA", "loc" : [ -85.354012, 42.356313 ], "pop" : 2896, "state" : "MI" } +{ "_id" : "49013", "city" : "BANGOR", "loc" : [ -86.131096, 42.33122 ], "pop" : 8743, "state" : "MI" } +{ "_id" : "49015", "city" : "BATTLE CREEK", "loc" : [ -85.212825, 42.302806 ], "pop" : 29828, "state" : "MI" } +{ "_id" : "49017", "city" : "BATTLE CREEK", "loc" : [ -85.181106, 42.332218 ], "pop" : 62035, "state" : "MI" } +{ "_id" : "49021", "city" : "BELLEVUE", "loc" : [ -85.048867, 42.452474 ], "pop" : 6911, "state" : "MI" } +{ "_id" : "49022", "city" : "BENTON HARBOR", "loc" : [ -86.423417, 42.108594 ], "pop" : 37550, "state" : "MI" } +{ "_id" : "49026", "city" : "BLOOMINGDALE", "loc" : [ -85.956757, 42.384232 ], "pop" : 1958, "state" : "MI" } +{ "_id" : "49028", "city" : "BRONSON", "loc" : [ -85.183767, 41.864316 ], "pop" : 7024, "state" : "MI" } +{ "_id" : "49029", "city" : "BURLINGTON", "loc" : [ -85.105, 42.123859 ], "pop" : 1898, "state" : "MI" } +{ "_id" : "49030", "city" : "BURR OAK", "loc" : [ -85.334536, 41.845898 ], "pop" : 3192, "state" : "MI" } +{ "_id" : "49031", "city" : "CASSOPOLIS", "loc" : [ -85.992273, 41.896805 ], "pop" : 6622, "state" : "MI" } +{ "_id" : "49032", "city" : "CENTREVILLE", "loc" : [ -85.49629899999999, 41.921685 ], "pop" : 3606, "state" : "MI" } +{ "_id" : "49033", "city" : "CERESCO", "loc" : [ -85.11284999999999, 42.212741 ], "pop" : 1128, "state" : "MI" } +{ "_id" : "49034", "city" : "CLIMAX", "loc" : [ -85.323832, 42.233979 ], "pop" : 983, "state" : "MI" } +{ "_id" : "49036", "city" : "COLDWATER", "loc" : [ -85.00568199999999, 41.925464 ], "pop" : 20278, "state" : "MI" } +{ "_id" : "49038", "city" : "COLOMA", "loc" : [ -86.32247, 42.202952 ], "pop" : 9987, "state" : "MI" } +{ "_id" : "49040", "city" : "COLON", "loc" : [ -85.33058800000001, 41.957605 ], "pop" : 2800, "state" : "MI" } +{ "_id" : "49042", "city" : "CONSTANTINE", "loc" : [ -85.657094, 41.846029 ], "pop" : 5737, "state" : "MI" } +{ "_id" : "49043", "city" : "COVERT", "loc" : [ -86.274294, 42.291074 ], "pop" : 2544, "state" : "MI" } +{ "_id" : "49045", "city" : "DECATUR", "loc" : [ -86.03380799999999, 42.101219 ], "pop" : 8320, "state" : "MI" } +{ "_id" : "49046", "city" : "DELTON", "loc" : [ -85.406706, 42.514102 ], "pop" : 7306, "state" : "MI" } +{ "_id" : "49047", "city" : "DOWAGIAC", "loc" : [ -86.116766, 41.990965 ], "pop" : 14921, "state" : "MI" } +{ "_id" : "49050", "city" : "DOWLING", "loc" : [ -85.24945200000001, 42.501478 ], "pop" : 909, "state" : "MI" } +{ "_id" : "49051", "city" : "EAST LEROY", "loc" : [ -85.231083, 42.196125 ], "pop" : 1915, "state" : "MI" } +{ "_id" : "49052", "city" : "FULTON", "loc" : [ -85.322659, 42.139086 ], "pop" : 720, "state" : "MI" } +{ "_id" : "49053", "city" : "GALESBURG", "loc" : [ -85.423665, 42.294843 ], "pop" : 4820, "state" : "MI" } +{ "_id" : "49055", "city" : "GOBLES", "loc" : [ -85.853649, 42.370182 ], "pop" : 4476, "state" : "MI" } +{ "_id" : "49056", "city" : "GRAND JUNCTION", "loc" : [ -86.054052, 42.376081 ], "pop" : 2100, "state" : "MI" } +{ "_id" : "49057", "city" : "HARTFORD", "loc" : [ -86.16870299999999, 42.208807 ], "pop" : 5826, "state" : "MI" } +{ "_id" : "49058", "city" : "HASTINGS", "loc" : [ -85.29368700000001, 42.643007 ], "pop" : 15043, "state" : "MI" } +{ "_id" : "49060", "city" : "HICKORY CORNERS", "loc" : [ -85.399784, 42.423682 ], "pop" : 1823, "state" : "MI" } +{ "_id" : "49061", "city" : "JONES", "loc" : [ -85.83411099999999, 41.912903 ], "pop" : 2121, "state" : "MI" } +{ "_id" : "49064", "city" : "LAWRENCE", "loc" : [ -86.052543, 42.207635 ], "pop" : 3030, "state" : "MI" } +{ "_id" : "49065", "city" : "LAWTON", "loc" : [ -85.82896599999999, 42.154462 ], "pop" : 5933, "state" : "MI" } +{ "_id" : "49066", "city" : "LEONIDAS", "loc" : [ -85.349683, 42.029394 ], "pop" : 765, "state" : "MI" } +{ "_id" : "49067", "city" : "MARCELLUS", "loc" : [ -85.798776, 42.027461 ], "pop" : 3481, "state" : "MI" } +{ "_id" : "49068", "city" : "MARSHALL", "loc" : [ -84.95828, 42.272047 ], "pop" : 14844, "state" : "MI" } +{ "_id" : "49070", "city" : "MARTIN", "loc" : [ -85.610646, 42.548321 ], "pop" : 2366, "state" : "MI" } +{ "_id" : "49071", "city" : "MATTAWAN", "loc" : [ -85.794281, 42.245069 ], "pop" : 6461, "state" : "MI" } +{ "_id" : "49072", "city" : "MENDON", "loc" : [ -85.472697, 42.014262 ], "pop" : 3598, "state" : "MI" } +{ "_id" : "49073", "city" : "NASHVILLE", "loc" : [ -85.122029, 42.593721 ], "pop" : 5517, "state" : "MI" } +{ "_id" : "49076", "city" : "OLIVET", "loc" : [ -84.897312, 42.445947 ], "pop" : 4084, "state" : "MI" } +{ "_id" : "49078", "city" : "OTSEGO", "loc" : [ -85.703497, 42.472334 ], "pop" : 10614, "state" : "MI" } +{ "_id" : "49079", "city" : "PAW PAW", "loc" : [ -85.900488, 42.234931 ], "pop" : 11455, "state" : "MI" } +{ "_id" : "49080", "city" : "PLAINWELL", "loc" : [ -85.59936, 42.454379 ], "pop" : 15308, "state" : "MI" } +{ "_id" : "49082", "city" : "QUINCY", "loc" : [ -84.849295, 41.970694 ], "pop" : 8671, "state" : "MI" } +{ "_id" : "49083", "city" : "RICHLAND", "loc" : [ -85.44465099999999, 42.375689 ], "pop" : 5676, "state" : "MI" } +{ "_id" : "49085", "city" : "SAINT JOSEPH", "loc" : [ -86.478341, 42.063959 ], "pop" : 22984, "state" : "MI" } +{ "_id" : "49087", "city" : "SCHOOLCRAFT", "loc" : [ -85.663741, 42.132857 ], "pop" : 5324, "state" : "MI" } +{ "_id" : "49088", "city" : "SCOTTS", "loc" : [ -85.468492, 42.181892 ], "pop" : 3249, "state" : "MI" } +{ "_id" : "49089", "city" : "SHERWOOD", "loc" : [ -85.240797, 42.010736 ], "pop" : 2310, "state" : "MI" } +{ "_id" : "49090", "city" : "SOUTH HAVEN", "loc" : [ -86.25420699999999, 42.404096 ], "pop" : 12604, "state" : "MI" } +{ "_id" : "49091", "city" : "STURGIS", "loc" : [ -85.426357, 41.808934 ], "pop" : 16597, "state" : "MI" } +{ "_id" : "49092", "city" : "TEKONSHA", "loc" : [ -84.99260200000001, 42.086326 ], "pop" : 2747, "state" : "MI" } +{ "_id" : "49093", "city" : "THREE RIVERS", "loc" : [ -85.637125, 41.959598 ], "pop" : 17021, "state" : "MI" } +{ "_id" : "49094", "city" : "UNION CITY", "loc" : [ -85.135637, 42.055134 ], "pop" : 3600, "state" : "MI" } +{ "_id" : "49095", "city" : "VANDALIA", "loc" : [ -85.875546, 41.895506 ], "pop" : 1839, "state" : "MI" } +{ "_id" : "49096", "city" : "VERMONTVILLE", "loc" : [ -85.01098399999999, 42.63921 ], "pop" : 2978, "state" : "MI" } +{ "_id" : "49097", "city" : "VICKSBURG", "loc" : [ -85.502376, 42.120896 ], "pop" : 8152, "state" : "MI" } +{ "_id" : "49098", "city" : "WATERVLIET", "loc" : [ -86.26036999999999, 42.193804 ], "pop" : 4793, "state" : "MI" } +{ "_id" : "49099", "city" : "WHITE PIGEON", "loc" : [ -85.67501, 41.792891 ], "pop" : 6161, "state" : "MI" } +{ "_id" : "49101", "city" : "BARODA", "loc" : [ -86.491274, 41.948818 ], "pop" : 3030, "state" : "MI" } +{ "_id" : "49102", "city" : "BERRIEN CENTER", "loc" : [ -86.285039, 41.948439 ], "pop" : 2324, "state" : "MI" } +{ "_id" : "49103", "city" : "BERRIEN SPRINGS", "loc" : [ -86.35401299999999, 41.948002 ], "pop" : 11600, "state" : "MI" } +{ "_id" : "49106", "city" : "BRIDGMAN", "loc" : [ -86.554334, 41.936199 ], "pop" : 4073, "state" : "MI" } +{ "_id" : "49107", "city" : "BUCHANAN", "loc" : [ -86.37084400000001, 41.83269 ], "pop" : 10342, "state" : "MI" } +{ "_id" : "49111", "city" : "EAU CLAIRE", "loc" : [ -86.29715400000001, 42.015134 ], "pop" : 4007, "state" : "MI" } +{ "_id" : "49112", "city" : "EDWARDSBURG", "loc" : [ -86.026252, 41.791258 ], "pop" : 8926, "state" : "MI" } +{ "_id" : "49113", "city" : "GALIEN", "loc" : [ -86.50354400000001, 41.819758 ], "pop" : 2775, "state" : "MI" } +{ "_id" : "49116", "city" : "LAKESIDE", "loc" : [ -86.669354, 41.848459 ], "pop" : 269, "state" : "MI" } +{ "_id" : "49117", "city" : "GRAND BEACH", "loc" : [ -86.74663, 41.785591 ], "pop" : 4389, "state" : "MI" } +{ "_id" : "49120", "city" : "NILES", "loc" : [ -86.236789, 41.820168 ], "pop" : 33750, "state" : "MI" } +{ "_id" : "49125", "city" : "SAWYER", "loc" : [ -86.588508, 41.882866 ], "pop" : 2704, "state" : "MI" } +{ "_id" : "49126", "city" : "SODUS", "loc" : [ -86.3921, 42.052082 ], "pop" : 1404, "state" : "MI" } +{ "_id" : "49127", "city" : "STEVENSVILLE", "loc" : [ -86.51186199999999, 42.021968 ], "pop" : 9354, "state" : "MI" } +{ "_id" : "49128", "city" : "THREE OAKS", "loc" : [ -86.61541099999999, 41.814976 ], "pop" : 3994, "state" : "MI" } +{ "_id" : "49129", "city" : "UNION PIER", "loc" : [ -86.691146, 41.82555 ], "pop" : 979, "state" : "MI" } +{ "_id" : "49130", "city" : "UNION", "loc" : [ -85.85290500000001, 41.782678 ], "pop" : 1617, "state" : "MI" } +{ "_id" : "49201", "city" : "JACKSON", "loc" : [ -84.38747600000001, 42.254522 ], "pop" : 42076, "state" : "MI" } +{ "_id" : "49202", "city" : "JACKSON", "loc" : [ -84.408348, 42.263431 ], "pop" : 20387, "state" : "MI" } +{ "_id" : "49203", "city" : "JACKSON", "loc" : [ -84.41321000000001, 42.228963 ], "pop" : 38466, "state" : "MI" } +{ "_id" : "49220", "city" : "ADDISON", "loc" : [ -84.312229, 42.003604 ], "pop" : 2506, "state" : "MI" } +{ "_id" : "49221", "city" : "ADRIAN", "loc" : [ -84.044556, 41.900516 ], "pop" : 33769, "state" : "MI" } +{ "_id" : "49224", "city" : "ALBION", "loc" : [ -84.756052, 42.258073 ], "pop" : 13514, "state" : "MI" } +{ "_id" : "49227", "city" : "ALLEN", "loc" : [ -84.76078200000001, 41.926419 ], "pop" : 1953, "state" : "MI" } +{ "_id" : "49228", "city" : "BLISSFIELD", "loc" : [ -83.877257, 41.827636 ], "pop" : 5635, "state" : "MI" } +{ "_id" : "49229", "city" : "BRITTON", "loc" : [ -83.837722, 41.988713 ], "pop" : 2553, "state" : "MI" } +{ "_id" : "49230", "city" : "BROOKLYN", "loc" : [ -84.241353, 42.10436 ], "pop" : 7155, "state" : "MI" } +{ "_id" : "49232", "city" : "CAMDEN", "loc" : [ -84.724497, 41.736149 ], "pop" : 1500, "state" : "MI" } +{ "_id" : "49233", "city" : "CEMENT CITY", "loc" : [ -84.325423, 42.060395 ], "pop" : 1313, "state" : "MI" } +{ "_id" : "49234", "city" : "CLARKLAKE", "loc" : [ -84.352056, 42.123503 ], "pop" : 2418, "state" : "MI" } +{ "_id" : "49235", "city" : "CLAYTON", "loc" : [ -84.177519, 41.868648 ], "pop" : 2000, "state" : "MI" } +{ "_id" : "49236", "city" : "CLINTON", "loc" : [ -83.944152, 42.063886 ], "pop" : 5222, "state" : "MI" } +{ "_id" : "49237", "city" : "CONCORD", "loc" : [ -84.652928, 42.187501 ], "pop" : 3375, "state" : "MI" } +{ "_id" : "49238", "city" : "DEERFIELD", "loc" : [ -83.784739, 41.890912 ], "pop" : 1427, "state" : "MI" } +{ "_id" : "49240", "city" : "GRASS LAKE", "loc" : [ -84.194041, 42.271071 ], "pop" : 6321, "state" : "MI" } +{ "_id" : "49241", "city" : "HANOVER", "loc" : [ -84.58480900000001, 42.102521 ], "pop" : 2809, "state" : "MI" } +{ "_id" : "49242", "city" : "HILLSDALE", "loc" : [ -84.620812, 41.923954 ], "pop" : 10382, "state" : "MI" } +{ "_id" : "49245", "city" : "HOMER", "loc" : [ -84.81572, 42.141561 ], "pop" : 4934, "state" : "MI" } +{ "_id" : "49246", "city" : "HORTON", "loc" : [ -84.49759299999999, 42.119092 ], "pop" : 3099, "state" : "MI" } +{ "_id" : "49247", "city" : "HUDSON", "loc" : [ -84.338031, 41.858101 ], "pop" : 5953, "state" : "MI" } +{ "_id" : "49248", "city" : "JASPER", "loc" : [ -83.951549, 41.758956 ], "pop" : 1240, "state" : "MI" } +{ "_id" : "49249", "city" : "JEROME", "loc" : [ -84.445483, 42.048375 ], "pop" : 2686, "state" : "MI" } +{ "_id" : "49250", "city" : "JONESVILLE", "loc" : [ -84.645083, 41.979833 ], "pop" : 5671, "state" : "MI" } +{ "_id" : "49251", "city" : "LESLIE", "loc" : [ -84.420653, 42.460279 ], "pop" : 5493, "state" : "MI" } +{ "_id" : "49252", "city" : "LITCHFIELD", "loc" : [ -84.636095, 42.054039 ], "pop" : 840, "state" : "MI" } +{ "_id" : "49253", "city" : "MANITOU BEACH", "loc" : [ -84.276706, 41.967055 ], "pop" : 2714, "state" : "MI" } +{ "_id" : "49254", "city" : "MICHIGAN CENTER", "loc" : [ -84.321315, 42.226294 ], "pop" : 4013, "state" : "MI" } +{ "_id" : "49255", "city" : "MONTGOMERY", "loc" : [ -84.84964100000001, 41.792764 ], "pop" : 2260, "state" : "MI" } +{ "_id" : "49256", "city" : "MORENCI", "loc" : [ -84.219204, 41.738612 ], "pop" : 4699, "state" : "MI" } +{ "_id" : "49259", "city" : "MUNITH", "loc" : [ -84.248486, 42.370317 ], "pop" : 3078, "state" : "MI" } +{ "_id" : "49262", "city" : "NORTH ADAMS", "loc" : [ -84.520824, 41.971484 ], "pop" : 750, "state" : "MI" } +{ "_id" : "49264", "city" : "ONONDAGA", "loc" : [ -84.553501, 42.448726 ], "pop" : 1358, "state" : "MI" } +{ "_id" : "49265", "city" : "ONSTED", "loc" : [ -84.183892, 42.029533 ], "pop" : 4601, "state" : "MI" } +{ "_id" : "49266", "city" : "OSSEO", "loc" : [ -84.597388, 41.838413 ], "pop" : 7025, "state" : "MI" } +{ "_id" : "49267", "city" : "OTTAWA LAKE", "loc" : [ -83.685559, 41.768276 ], "pop" : 4531, "state" : "MI" } +{ "_id" : "49268", "city" : "PALMYRA", "loc" : [ -83.96567899999999, 41.872976 ], "pop" : 2289, "state" : "MI" } +{ "_id" : "49269", "city" : "PARMA", "loc" : [ -84.599886, 42.273879 ], "pop" : 6185, "state" : "MI" } +{ "_id" : "49270", "city" : "PETERSBURG", "loc" : [ -83.687673, 41.875655 ], "pop" : 4832, "state" : "MI" } +{ "_id" : "49271", "city" : "PITTSFORD", "loc" : [ -84.444016, 41.896262 ], "pop" : 2552, "state" : "MI" } +{ "_id" : "49272", "city" : "PLEASANT LAKE", "loc" : [ -84.34279100000001, 42.390343 ], "pop" : 1685, "state" : "MI" } +{ "_id" : "49274", "city" : "READING", "loc" : [ -84.76475000000001, 41.844194 ], "pop" : 2253, "state" : "MI" } +{ "_id" : "49275", "city" : "RIDGEWAY", "loc" : [ -83.778429, 42.010554 ], "pop" : 23, "state" : "MI" } +{ "_id" : "49276", "city" : "RIGA", "loc" : [ -83.80114399999999, 41.795309 ], "pop" : 961, "state" : "MI" } +{ "_id" : "49277", "city" : "RIVES JUNCTION", "loc" : [ -84.458868, 42.38871 ], "pop" : 3676, "state" : "MI" } +{ "_id" : "49279", "city" : "SAND CREEK", "loc" : [ -84.075502, 41.77928 ], "pop" : 1197, "state" : "MI" } +{ "_id" : "49281", "city" : "SOMERSET", "loc" : [ -84.39472000000001, 42.044732 ], "pop" : 1556, "state" : "MI" } +{ "_id" : "49283", "city" : "SPRING ARBOR", "loc" : [ -84.550127, 42.206861 ], "pop" : 2852, "state" : "MI" } +{ "_id" : "49284", "city" : "SPRINGPORT", "loc" : [ -84.70388800000001, 42.38055 ], "pop" : 3153, "state" : "MI" } +{ "_id" : "49285", "city" : "STOCKBRIDGE", "loc" : [ -84.175178, 42.460404 ], "pop" : 6047, "state" : "MI" } +{ "_id" : "49286", "city" : "TECUMSEH", "loc" : [ -83.955485, 41.995297 ], "pop" : 12645, "state" : "MI" } +{ "_id" : "49287", "city" : "TIPTON", "loc" : [ -84.07684, 42.036911 ], "pop" : 2473, "state" : "MI" } +{ "_id" : "49288", "city" : "WALDRON", "loc" : [ -84.449636, 41.738608 ], "pop" : 2151, "state" : "MI" } +{ "_id" : "49301", "city" : "ADA", "loc" : [ -85.480959, 42.95661 ], "pop" : 9568, "state" : "MI" } +{ "_id" : "49302", "city" : "ALTO", "loc" : [ -85.42555400000001, 42.824312 ], "pop" : 5391, "state" : "MI" } +{ "_id" : "49303", "city" : "BAILEY", "loc" : [ -85.831318, 43.276768 ], "pop" : 670, "state" : "MI" } +{ "_id" : "49304", "city" : "BALDWIN", "loc" : [ -85.881874, 43.889409 ], "pop" : 3387, "state" : "MI" } +{ "_id" : "49305", "city" : "BARRYTON", "loc" : [ -85.15465399999999, 43.750651 ], "pop" : 1824, "state" : "MI" } +{ "_id" : "49306", "city" : "BELMONT", "loc" : [ -85.586769, 43.077934 ], "pop" : 6782, "state" : "MI" } +{ "_id" : "49307", "city" : "BIG RAPIDS", "loc" : [ -85.479705, 43.689679 ], "pop" : 18049, "state" : "MI" } +{ "_id" : "49309", "city" : "BITELY", "loc" : [ -85.877799, 43.732132 ], "pop" : 1828, "state" : "MI" } +{ "_id" : "49310", "city" : "BLANCHARD", "loc" : [ -85.05885600000001, 43.522778 ], "pop" : 2473, "state" : "MI" } +{ "_id" : "49315", "city" : "BYRON CENTER", "loc" : [ -85.71360199999999, 42.801614 ], "pop" : 6861, "state" : "MI" } +{ "_id" : "49316", "city" : "DUTTON", "loc" : [ -85.562167, 42.796395 ], "pop" : 8634, "state" : "MI" } +{ "_id" : "49318", "city" : "CASNOVIA", "loc" : [ -85.825394, 43.23815 ], "pop" : 1283, "state" : "MI" } +{ "_id" : "49319", "city" : "CEDAR SPRINGS", "loc" : [ -85.545238, 43.22148 ], "pop" : 9743, "state" : "MI" } +{ "_id" : "49321", "city" : "COMSTOCK PARK", "loc" : [ -85.684468, 43.057813 ], "pop" : 11913, "state" : "MI" } +{ "_id" : "49322", "city" : "CORAL", "loc" : [ -85.379245, 43.364458 ], "pop" : 895, "state" : "MI" } +{ "_id" : "49323", "city" : "DORR", "loc" : [ -85.762798, 42.723113 ], "pop" : 7782, "state" : "MI" } +{ "_id" : "49325", "city" : "FREEPORT", "loc" : [ -85.279134, 42.729703 ], "pop" : 1546, "state" : "MI" } +{ "_id" : "49326", "city" : "GOWEN", "loc" : [ -85.315941, 43.223884 ], "pop" : 6144, "state" : "MI" } +{ "_id" : "49327", "city" : "GRANT", "loc" : [ -85.836827, 43.339197 ], "pop" : 6898, "state" : "MI" } +{ "_id" : "49328", "city" : "HOPKINS", "loc" : [ -85.732195, 42.64209 ], "pop" : 2350, "state" : "MI" } +{ "_id" : "49329", "city" : "HOWARD CITY", "loc" : [ -85.485609, 43.408326 ], "pop" : 3028, "state" : "MI" } +{ "_id" : "49330", "city" : "KENT CITY", "loc" : [ -85.739949, 43.236235 ], "pop" : 3742, "state" : "MI" } +{ "_id" : "49331", "city" : "LOWELL", "loc" : [ -85.36530500000001, 42.95497 ], "pop" : 12732, "state" : "MI" } +{ "_id" : "49332", "city" : "MECOSTA", "loc" : [ -85.22803399999999, 43.681317 ], "pop" : 1939, "state" : "MI" } +{ "_id" : "49333", "city" : "MIDDLEVILLE", "loc" : [ -85.47590099999999, 42.693247 ], "pop" : 8596, "state" : "MI" } +{ "_id" : "49336", "city" : "MORLEY", "loc" : [ -85.447318, 43.505951 ], "pop" : 2875, "state" : "MI" } +{ "_id" : "49337", "city" : "NEWAYGO", "loc" : [ -85.759381, 43.419799 ], "pop" : 8091, "state" : "MI" } +{ "_id" : "49338", "city" : "PARIS", "loc" : [ -85.521348, 43.767704 ], "pop" : 3359, "state" : "MI" } +{ "_id" : "49339", "city" : "PIERSON", "loc" : [ -85.51335899999999, 43.335514 ], "pop" : 2177, "state" : "MI" } +{ "_id" : "49340", "city" : "REMUS", "loc" : [ -85.157365, 43.603249 ], "pop" : 4990, "state" : "MI" } +{ "_id" : "49341", "city" : "ROCKFORD", "loc" : [ -85.513606, 43.115217 ], "pop" : 19778, "state" : "MI" } +{ "_id" : "49342", "city" : "RODNEY", "loc" : [ -85.321884, 43.73791 ], "pop" : 1202, "state" : "MI" } +{ "_id" : "49343", "city" : "SAND LAKE", "loc" : [ -85.536655, 43.298109 ], "pop" : 4951, "state" : "MI" } +{ "_id" : "49344", "city" : "SHELBYVILLE", "loc" : [ -85.62823899999999, 42.593581 ], "pop" : 259, "state" : "MI" } +{ "_id" : "49345", "city" : "SPARTA", "loc" : [ -85.687668, 43.161867 ], "pop" : 11522, "state" : "MI" } +{ "_id" : "49346", "city" : "STANWOOD", "loc" : [ -85.444607, 43.601728 ], "pop" : 3068, "state" : "MI" } +{ "_id" : "49347", "city" : "TRUFANT", "loc" : [ -85.368489, 43.315611 ], "pop" : 1002, "state" : "MI" } +{ "_id" : "49348", "city" : "WAYLAND", "loc" : [ -85.619112, 42.664268 ], "pop" : 6756, "state" : "MI" } +{ "_id" : "49349", "city" : "WHITE CLOUD", "loc" : [ -85.75864, 43.539803 ], "pop" : 8668, "state" : "MI" } +{ "_id" : "49401", "city" : "ALLENDALE", "loc" : [ -85.924913, 42.971066 ], "pop" : 7311, "state" : "MI" } +{ "_id" : "49402", "city" : "BRANCH", "loc" : [ -86.13136900000001, 43.923296 ], "pop" : 1741, "state" : "MI" } +{ "_id" : "49403", "city" : "CONKLIN", "loc" : [ -85.853753, 43.149399 ], "pop" : 2720, "state" : "MI" } +{ "_id" : "49404", "city" : "COOPERSVILLE", "loc" : [ -85.951722, 43.06013 ], "pop" : 5962, "state" : "MI" } +{ "_id" : "49405", "city" : "CUSTER", "loc" : [ -86.220437, 43.94424 ], "pop" : 1002, "state" : "MI" } +{ "_id" : "49408", "city" : "FENNVILLE", "loc" : [ -86.124876, 42.577669 ], "pop" : 6486, "state" : "MI" } +{ "_id" : "49410", "city" : "FOUNTAIN", "loc" : [ -86.21686099999999, 44.036342 ], "pop" : 1030, "state" : "MI" } +{ "_id" : "49411", "city" : "FREE SOIL", "loc" : [ -86.265158, 44.112036 ], "pop" : 903, "state" : "MI" } +{ "_id" : "49412", "city" : "FREMONT", "loc" : [ -85.962554, 43.465196 ], "pop" : 7946, "state" : "MI" } +{ "_id" : "49415", "city" : "FRUITPORT", "loc" : [ -86.13883199999999, 43.144282 ], "pop" : 4183, "state" : "MI" } +{ "_id" : "49417", "city" : "GRAND HAVEN", "loc" : [ -86.191227, 43.037838 ], "pop" : 24103, "state" : "MI" } +{ "_id" : "49418", "city" : "GRANDVILLE", "loc" : [ -85.76187400000001, 42.89387 ], "pop" : 19467, "state" : "MI" } +{ "_id" : "49419", "city" : "HAMILTON", "loc" : [ -85.97473100000001, 42.688097 ], "pop" : 4586, "state" : "MI" } +{ "_id" : "49420", "city" : "HART", "loc" : [ -86.31415200000001, 43.70676 ], "pop" : 5548, "state" : "MI" } +{ "_id" : "49421", "city" : "HESPERIA", "loc" : [ -86.060739, 43.596513 ], "pop" : 5102, "state" : "MI" } +{ "_id" : "49423", "city" : "HOLLAND", "loc" : [ -86.116362, 42.769211 ], "pop" : 40325, "state" : "MI" } +{ "_id" : "49424", "city" : "HOLLAND", "loc" : [ -86.14263099999999, 42.813514 ], "pop" : 25798, "state" : "MI" } +{ "_id" : "49425", "city" : "HOLTON", "loc" : [ -86.150853, 43.441454 ], "pop" : 4251, "state" : "MI" } +{ "_id" : "49426", "city" : "HUDSONVILLE", "loc" : [ -85.8751, 42.874805 ], "pop" : 20122, "state" : "MI" } +{ "_id" : "49428", "city" : "JENISON", "loc" : [ -85.827603, 42.910423 ], "pop" : 23358, "state" : "MI" } +{ "_id" : "49431", "city" : "LUDINGTON", "loc" : [ -86.440253, 43.968823 ], "pop" : 13169, "state" : "MI" } +{ "_id" : "49435", "city" : "MARNE", "loc" : [ -85.84195800000001, 43.053185 ], "pop" : 2715, "state" : "MI" } +{ "_id" : "49436", "city" : "MEARS", "loc" : [ -86.453307, 43.682494 ], "pop" : 1302, "state" : "MI" } +{ "_id" : "49437", "city" : "MONTAGUE", "loc" : [ -86.373992, 43.424163 ], "pop" : 4953, "state" : "MI" } +{ "_id" : "49440", "city" : "MUSKEGON", "loc" : [ -86.249191, 43.232589 ], "pop" : 1033, "state" : "MI" } +{ "_id" : "49441", "city" : "MUSKEGON", "loc" : [ -86.273819, 43.196184 ], "pop" : 36169, "state" : "MI" } +{ "_id" : "49442", "city" : "MUSKEGON", "loc" : [ -86.188467, 43.232876 ], "pop" : 39272, "state" : "MI" } +{ "_id" : "49444", "city" : "MUSKEGON HEIGHTS", "loc" : [ -86.21620799999999, 43.195046 ], "pop" : 29295, "state" : "MI" } +{ "_id" : "49445", "city" : "NORTH MUSKEGON", "loc" : [ -86.273297, 43.282873 ], "pop" : 18797, "state" : "MI" } +{ "_id" : "49446", "city" : "NEW ERA", "loc" : [ -86.344803, 43.555578 ], "pop" : 2539, "state" : "MI" } +{ "_id" : "49447", "city" : "NEW RICHMOND", "loc" : [ -86.03798500000001, 42.662383 ], "pop" : 438, "state" : "MI" } +{ "_id" : "49448", "city" : "NUNICA", "loc" : [ -86.102768, 43.088306 ], "pop" : 3795, "state" : "MI" } +{ "_id" : "49449", "city" : "PENTWATER", "loc" : [ -86.38681800000001, 43.823713 ], "pop" : 3915, "state" : "MI" } +{ "_id" : "49450", "city" : "PULLMAN", "loc" : [ -86.079909, 42.465131 ], "pop" : 2672, "state" : "MI" } +{ "_id" : "49451", "city" : "RAVENNA", "loc" : [ -85.964816, 43.209128 ], "pop" : 5106, "state" : "MI" } +{ "_id" : "49452", "city" : "ROTHBURY", "loc" : [ -86.34464, 43.511633 ], "pop" : 1618, "state" : "MI" } +{ "_id" : "49453", "city" : "SAUGATUCK", "loc" : [ -86.194093, 42.642562 ], "pop" : 3870, "state" : "MI" } +{ "_id" : "49454", "city" : "SCOTTVILLE", "loc" : [ -86.31561499999999, 43.976692 ], "pop" : 4229, "state" : "MI" } +{ "_id" : "49455", "city" : "SHELBY", "loc" : [ -86.361503, 43.607942 ], "pop" : 4420, "state" : "MI" } +{ "_id" : "49456", "city" : "SPRING LAKE", "loc" : [ -86.19150999999999, 43.088741 ], "pop" : 14602, "state" : "MI" } +{ "_id" : "49457", "city" : "TWIN LAKE", "loc" : [ -86.16331599999999, 43.341378 ], "pop" : 7212, "state" : "MI" } +{ "_id" : "49459", "city" : "WALKERVILLE", "loc" : [ -86.08299100000001, 43.762559 ], "pop" : 309, "state" : "MI" } +{ "_id" : "49460", "city" : "WEST OLIVE", "loc" : [ -86.131726, 42.909912 ], "pop" : 6722, "state" : "MI" } +{ "_id" : "49461", "city" : "WHITEHALL", "loc" : [ -86.331453, 43.390358 ], "pop" : 6925, "state" : "MI" } +{ "_id" : "49464", "city" : "ZEELAND", "loc" : [ -86.010408, 42.825586 ], "pop" : 15649, "state" : "MI" } +{ "_id" : "49503", "city" : "GRAND RAPIDS", "loc" : [ -85.65273000000001, 42.965879 ], "pop" : 32876, "state" : "MI" } +{ "_id" : "49504", "city" : "WALKER", "loc" : [ -85.725543, 42.98392 ], "pop" : 63454, "state" : "MI" } +{ "_id" : "49505", "city" : "GRAND RAPIDS", "loc" : [ -85.630931, 43.012025 ], "pop" : 52883, "state" : "MI" } +{ "_id" : "49506", "city" : "GRAND RAPIDS", "loc" : [ -85.621317, 42.943978 ], "pop" : 36668, "state" : "MI" } +{ "_id" : "49507", "city" : "GRAND RAPIDS", "loc" : [ -85.65416999999999, 42.931788 ], "pop" : 37681, "state" : "MI" } +{ "_id" : "49508", "city" : "KENTWOOD", "loc" : [ -85.624179, 42.875653 ], "pop" : 32830, "state" : "MI" } +{ "_id" : "49509", "city" : "WYOMING", "loc" : [ -85.705775, 42.900867 ], "pop" : 57419, "state" : "MI" } +{ "_id" : "49512", "city" : "KENTWOOD", "loc" : [ -85.57815600000001, 42.89269 ], "pop" : 7823, "state" : "MI" } +{ "_id" : "49546", "city" : "GRAND RAPIDS", "loc" : [ -85.548346, 42.928029 ], "pop" : 25471, "state" : "MI" } +{ "_id" : "49548", "city" : "KENTWOOD", "loc" : [ -85.66076700000001, 42.867048 ], "pop" : 32054, "state" : "MI" } +{ "_id" : "49601", "city" : "CADILLAC", "loc" : [ -85.430046, 44.250447 ], "pop" : 18182, "state" : "MI" } +{ "_id" : "49612", "city" : "ALDEN", "loc" : [ -85.22410000000001, 44.877887 ], "pop" : 1536, "state" : "MI" } +{ "_id" : "49613", "city" : "ARCADIA", "loc" : [ -86.206057, 44.523157 ], "pop" : 937, "state" : "MI" } +{ "_id" : "49614", "city" : "BEAR LAKE", "loc" : [ -86.14249700000001, 44.431125 ], "pop" : 1965, "state" : "MI" } +{ "_id" : "49615", "city" : "BELLAIRE", "loc" : [ -85.226495, 44.976469 ], "pop" : 2031, "state" : "MI" } +{ "_id" : "49616", "city" : "BENZONIA", "loc" : [ -86.096091, 44.595502 ], "pop" : 1833, "state" : "MI" } +{ "_id" : "49617", "city" : "BEULAH", "loc" : [ -86.038346, 44.646002 ], "pop" : 2617, "state" : "MI" } +{ "_id" : "49618", "city" : "BOON", "loc" : [ -85.614383, 44.291555 ], "pop" : 388, "state" : "MI" } +{ "_id" : "49619", "city" : "BRETHREN", "loc" : [ -85.996396, 44.296596 ], "pop" : 966, "state" : "MI" } +{ "_id" : "49620", "city" : "BUCKLEY", "loc" : [ -85.693541, 44.519856 ], "pop" : 1788, "state" : "MI" } +{ "_id" : "49621", "city" : "CEDAR", "loc" : [ -85.745344, 44.836953 ], "pop" : 2853, "state" : "MI" } +{ "_id" : "49622", "city" : "CENTRAL LAKE", "loc" : [ -85.267285, 45.074796 ], "pop" : 1970, "state" : "MI" } +{ "_id" : "49623", "city" : "CHASE", "loc" : [ -85.61963900000001, 43.868172 ], "pop" : 1016, "state" : "MI" } +{ "_id" : "49625", "city" : "COPEMISH", "loc" : [ -85.88785900000001, 44.450276 ], "pop" : 927, "state" : "MI" } +{ "_id" : "49629", "city" : "ELK RAPIDS", "loc" : [ -85.408226, 44.895473 ], "pop" : 1493, "state" : "MI" } +{ "_id" : "49630", "city" : "EMPIRE", "loc" : [ -85.99253299999999, 44.84106 ], "pop" : 609, "state" : "MI" } +{ "_id" : "49631", "city" : "EVART", "loc" : [ -85.26493499999999, 43.888772 ], "pop" : 4253, "state" : "MI" } +{ "_id" : "49632", "city" : "FALMOUTH", "loc" : [ -85.01700200000001, 44.252861 ], "pop" : 1891, "state" : "MI" } +{ "_id" : "49633", "city" : "FIFE LAKE", "loc" : [ -85.253122, 44.572064 ], "pop" : 2566, "state" : "MI" } +{ "_id" : "49635", "city" : "FRANKFORT", "loc" : [ -86.22120099999999, 44.631122 ], "pop" : 3168, "state" : "MI" } +{ "_id" : "49636", "city" : "GLEN ARBOR", "loc" : [ -86.03533899999999, 44.842927 ], "pop" : 641, "state" : "MI" } +{ "_id" : "49637", "city" : "GRAWN", "loc" : [ -85.71129000000001, 44.642779 ], "pop" : 1869, "state" : "MI" } +{ "_id" : "49638", "city" : "HARRIETTA", "loc" : [ -85.73957299999999, 44.297163 ], "pop" : 651, "state" : "MI" } +{ "_id" : "49639", "city" : "HERSEY", "loc" : [ -85.40592599999999, 43.84806 ], "pop" : 1915, "state" : "MI" } +{ "_id" : "49640", "city" : "HONOR", "loc" : [ -86.037582, 44.69539 ], "pop" : 945, "state" : "MI" } +{ "_id" : "49642", "city" : "IDLEWILD", "loc" : [ -85.716036, 43.912621 ], "pop" : 1132, "state" : "MI" } +{ "_id" : "49643", "city" : "INTERLOCHEN", "loc" : [ -85.802156, 44.651769 ], "pop" : 3429, "state" : "MI" } +{ "_id" : "49644", "city" : "IRONS", "loc" : [ -85.939008, 44.096638 ], "pop" : 1245, "state" : "MI" } +{ "_id" : "49645", "city" : "KALEVA", "loc" : [ -86.04673699999999, 44.369168 ], "pop" : 1533, "state" : "MI" } +{ "_id" : "49646", "city" : "KALKASKA", "loc" : [ -85.120655, 44.73546 ], "pop" : 7387, "state" : "MI" } +{ "_id" : "49647", "city" : "KARLIN", "loc" : [ -85.79406, 44.569128 ], "pop" : 80, "state" : "MI" } +{ "_id" : "49648", "city" : "KEWADIN", "loc" : [ -85.35394100000001, 45.012574 ], "pop" : 1303, "state" : "MI" } +{ "_id" : "49649", "city" : "KINGSLEY", "loc" : [ -85.526235, 44.575644 ], "pop" : 3823, "state" : "MI" } +{ "_id" : "49650", "city" : "LAKE ANN", "loc" : [ -85.85284, 44.731736 ], "pop" : 1448, "state" : "MI" } +{ "_id" : "49651", "city" : "MOORESTOWN", "loc" : [ -85.207352, 44.361932 ], "pop" : 6225, "state" : "MI" } +{ "_id" : "49653", "city" : "LAKE LEELANAU", "loc" : [ -85.732866, 44.985602 ], "pop" : 2053, "state" : "MI" } +{ "_id" : "49654", "city" : "LELAND", "loc" : [ -86.092924, 45.010215 ], "pop" : 0, "state" : "MI" } +{ "_id" : "49655", "city" : "LEROY", "loc" : [ -85.430001, 44.045656 ], "pop" : 3386, "state" : "MI" } +{ "_id" : "49656", "city" : "LUTHER", "loc" : [ -85.682631, 44.054494 ], "pop" : 1540, "state" : "MI" } +{ "_id" : "49657", "city" : "MC BAIN", "loc" : [ -85.228252, 44.21718 ], "pop" : 3431, "state" : "MI" } +{ "_id" : "49659", "city" : "MANCELONA", "loc" : [ -85.063399, 44.911596 ], "pop" : 5447, "state" : "MI" } +{ "_id" : "49660", "city" : "STRONACH", "loc" : [ -86.28503000000001, 44.228323 ], "pop" : 14319, "state" : "MI" } +{ "_id" : "49663", "city" : "MANTON", "loc" : [ -85.42017, 44.415222 ], "pop" : 3516, "state" : "MI" } +{ "_id" : "49664", "city" : "MAPLE CITY", "loc" : [ -85.88139200000001, 44.859035 ], "pop" : 1917, "state" : "MI" } +{ "_id" : "49665", "city" : "MARION", "loc" : [ -85.15503099999999, 44.046314 ], "pop" : 5710, "state" : "MI" } +{ "_id" : "49667", "city" : "MERRITT", "loc" : [ -85.015508, 44.36843 ], "pop" : 600, "state" : "MI" } +{ "_id" : "49668", "city" : "MESICK", "loc" : [ -85.70612199999999, 44.407451 ], "pop" : 2864, "state" : "MI" } +{ "_id" : "49670", "city" : "NORTHPORT", "loc" : [ -85.617287, 45.115699 ], "pop" : 1663, "state" : "MI" } +{ "_id" : "49675", "city" : "ONEKAMA", "loc" : [ -86.209959, 44.364576 ], "pop" : 1089, "state" : "MI" } +{ "_id" : "49676", "city" : "RAPID CITY", "loc" : [ -85.294318, 44.844863 ], "pop" : 2741, "state" : "MI" } +{ "_id" : "49677", "city" : "REED CITY", "loc" : [ -85.51302800000001, 43.886808 ], "pop" : 5056, "state" : "MI" } +{ "_id" : "49679", "city" : "SEARS", "loc" : [ -85.18824600000001, 43.901747 ], "pop" : 150, "state" : "MI" } +{ "_id" : "49680", "city" : "SOUTH BOARDMAN", "loc" : [ -85.24720000000001, 44.640143 ], "pop" : 1427, "state" : "MI" } +{ "_id" : "49682", "city" : "SUTTONS BAY", "loc" : [ -85.642264, 44.965613 ], "pop" : 3422, "state" : "MI" } +{ "_id" : "49683", "city" : "THOMPSONVILLE", "loc" : [ -85.945973, 44.519833 ], "pop" : 1231, "state" : "MI" } +{ "_id" : "49684", "city" : "TRAVERSE CITY", "loc" : [ -85.618869, 44.74365 ], "pop" : 53415, "state" : "MI" } +{ "_id" : "49688", "city" : "TUSTIN", "loc" : [ -85.490143, 44.107181 ], "pop" : 1213, "state" : "MI" } +{ "_id" : "49689", "city" : "WELLSTON", "loc" : [ -85.95547500000001, 44.213266 ], "pop" : 1043, "state" : "MI" } +{ "_id" : "49690", "city" : "WILLIAMSBURG", "loc" : [ -85.434732, 44.801952 ], "pop" : 4987, "state" : "MI" } +{ "_id" : "49705", "city" : "AFTON", "loc" : [ -84.469453, 45.363684 ], "pop" : 605, "state" : "MI" } +{ "_id" : "49706", "city" : "ALANSON", "loc" : [ -84.792421, 45.440545 ], "pop" : 3681, "state" : "MI" } +{ "_id" : "49707", "city" : "ALPENA", "loc" : [ -83.4602, 45.079018 ], "pop" : 23530, "state" : "MI" } +{ "_id" : "49709", "city" : "ATLANTA", "loc" : [ -84.147982, 44.992371 ], "pop" : 2299, "state" : "MI" } +{ "_id" : "49710", "city" : "BARBEAU", "loc" : [ -84.217332, 46.284753 ], "pop" : 368, "state" : "MI" } +{ "_id" : "49712", "city" : "BOYNE CITY", "loc" : [ -85.018294, 45.205203 ], "pop" : 7244, "state" : "MI" } +{ "_id" : "49713", "city" : "BOYNE FALLS", "loc" : [ -84.89158399999999, 45.211563 ], "pop" : 2009, "state" : "MI" } +{ "_id" : "49715", "city" : "RACO", "loc" : [ -84.563841, 46.411117 ], "pop" : 871, "state" : "MI" } +{ "_id" : "49716", "city" : "BRUTUS", "loc" : [ -84.74669299999999, 45.506785 ], "pop" : 586, "state" : "MI" } +{ "_id" : "49718", "city" : "CARP LAKE", "loc" : [ -84.773453, 45.742364 ], "pop" : 1049, "state" : "MI" } +{ "_id" : "49719", "city" : "CEDARVILLE", "loc" : [ -84.348823, 46.002449 ], "pop" : 1615, "state" : "MI" } +{ "_id" : "49720", "city" : "CHARLEVOIX", "loc" : [ -85.24529800000001, 45.29934 ], "pop" : 7690, "state" : "MI" } +{ "_id" : "49721", "city" : "CHEBOYGAN", "loc" : [ -84.48672000000001, 45.608038 ], "pop" : 13854, "state" : "MI" } +{ "_id" : "49724", "city" : "DAFTER", "loc" : [ -84.39967900000001, 46.349196 ], "pop" : 2040, "state" : "MI" } +{ "_id" : "49725", "city" : "DE TOUR VILLAGE", "loc" : [ -83.939628, 45.993852 ], "pop" : 719, "state" : "MI" } +{ "_id" : "49726", "city" : "DRUMMOND ISLAND", "loc" : [ -83.736706, 46.005521 ], "pop" : 835, "state" : "MI" } +{ "_id" : "49727", "city" : "EAST JORDAN", "loc" : [ -85.138655, 45.153858 ], "pop" : 5532, "state" : "MI" } +{ "_id" : "49728", "city" : "ECKERMAN", "loc" : [ -85.162606, 46.346638 ], "pop" : 208, "state" : "MI" } +{ "_id" : "49729", "city" : "ELLSWORTH", "loc" : [ -85.26329200000001, 45.159929 ], "pop" : 1223, "state" : "MI" } +{ "_id" : "49730", "city" : "ELMIRA", "loc" : [ -84.830321, 45.034582 ], "pop" : 2807, "state" : "MI" } +{ "_id" : "49733", "city" : "FREDERIC", "loc" : [ -84.68241, 44.838217 ], "pop" : 3967, "state" : "MI" } +{ "_id" : "49735", "city" : "GAYLORD", "loc" : [ -84.67228, 45.012523 ], "pop" : 11598, "state" : "MI" } +{ "_id" : "49736", "city" : "GOETZVILLE", "loc" : [ -84.059271, 46.100976 ], "pop" : 123, "state" : "MI" } +{ "_id" : "49738", "city" : "GRAYLING", "loc" : [ -84.691321, 44.670959 ], "pop" : 7591, "state" : "MI" } +{ "_id" : "49740", "city" : "HARBOR POINT", "loc" : [ -84.98030300000001, 45.464535 ], "pop" : 5473, "state" : "MI" } +{ "_id" : "49743", "city" : "HAWKS", "loc" : [ -83.854219, 45.297467 ], "pop" : 876, "state" : "MI" } +{ "_id" : "49744", "city" : "HERRON", "loc" : [ -83.65348, 45.012367 ], "pop" : 978, "state" : "MI" } +{ "_id" : "49746", "city" : "HILLMAN", "loc" : [ -83.946781, 45.069104 ], "pop" : 3902, "state" : "MI" } +{ "_id" : "49747", "city" : "HUBBARD LAKE", "loc" : [ -83.60590500000001, 44.89467 ], "pop" : 1359, "state" : "MI" } +{ "_id" : "49749", "city" : "INDIAN RIVER", "loc" : [ -84.595578, 45.426984 ], "pop" : 2965, "state" : "MI" } +{ "_id" : "49751", "city" : "JOHANNESBURG", "loc" : [ -84.38570799999999, 45.015207 ], "pop" : 2062, "state" : "MI" } +{ "_id" : "49752", "city" : "KINROSS", "loc" : [ -84.751122, 46.416612 ], "pop" : 1070, "state" : "MI" } +{ "_id" : "49753", "city" : "LACHINE", "loc" : [ -83.749071, 45.042946 ], "pop" : 1764, "state" : "MI" } +{ "_id" : "49755", "city" : "LEVERING", "loc" : [ -84.798597, 45.637711 ], "pop" : 1251, "state" : "MI" } +{ "_id" : "49756", "city" : "LEWISTON", "loc" : [ -84.297281, 44.853758 ], "pop" : 3327, "state" : "MI" } +{ "_id" : "49757", "city" : "MACKINAC ISLAND", "loc" : [ -84.624527, 45.857837 ], "pop" : 469, "state" : "MI" } +{ "_id" : "49759", "city" : "MILLERSBURG", "loc" : [ -84.122246, 45.402164 ], "pop" : 2048, "state" : "MI" } +{ "_id" : "49760", "city" : "MORAN", "loc" : [ -85.007835, 46.044106 ], "pop" : 113, "state" : "MI" } +{ "_id" : "49762", "city" : "NAUBINWAY", "loc" : [ -85.44619, 46.126021 ], "pop" : 1297, "state" : "MI" } +{ "_id" : "49765", "city" : "ONAWAY", "loc" : [ -84.212272, 45.33654 ], "pop" : 1926, "state" : "MI" } +{ "_id" : "49766", "city" : "OSSINEKE", "loc" : [ -83.459186, 44.91038 ], "pop" : 2294, "state" : "MI" } +{ "_id" : "49768", "city" : "PARADISE", "loc" : [ -85.056247, 46.598321 ], "pop" : 515, "state" : "MI" } +{ "_id" : "49769", "city" : "PELLSTON", "loc" : [ -84.842502, 45.570285 ], "pop" : 1360, "state" : "MI" } +{ "_id" : "49770", "city" : "BAY VIEW", "loc" : [ -84.940263, 45.361268 ], "pop" : 12806, "state" : "MI" } +{ "_id" : "49774", "city" : "PICKFORD", "loc" : [ -84.36631199999999, 46.155858 ], "pop" : 624, "state" : "MI" } +{ "_id" : "49775", "city" : "POINTE AUX PINS", "loc" : [ -84.447035, 45.754888 ], "pop" : 59, "state" : "MI" } +{ "_id" : "49776", "city" : "POSEN", "loc" : [ -83.63927099999999, 45.223335 ], "pop" : 3830, "state" : "MI" } +{ "_id" : "49779", "city" : "ROGERS CITY", "loc" : [ -83.835483, 45.412306 ], "pop" : 5463, "state" : "MI" } +{ "_id" : "49780", "city" : "FIBRE", "loc" : [ -84.54934299999999, 46.200568 ], "pop" : 3242, "state" : "MI" } +{ "_id" : "49781", "city" : "SAINT IGNACE", "loc" : [ -84.70940899999999, 45.921527 ], "pop" : 5411, "state" : "MI" } +{ "_id" : "49782", "city" : "SAINT JAMES", "loc" : [ -85.531581, 45.722061 ], "pop" : 404, "state" : "MI" } +{ "_id" : "49783", "city" : "SAULT SAINTE MAR", "loc" : [ -84.346746, 46.473932 ], "pop" : 17974, "state" : "MI" } +{ "_id" : "49788", "city" : "KINCHELOE", "loc" : [ -84.46258400000001, 46.26271 ], "pop" : 6046, "state" : "MI" } +{ "_id" : "49789", "city" : "STALWART", "loc" : [ -84.155861, 46.138876 ], "pop" : 214, "state" : "MI" } +{ "_id" : "49792", "city" : "TOWER", "loc" : [ -84.303496, 45.341619 ], "pop" : 929, "state" : "MI" } +{ "_id" : "49795", "city" : "VANDERBILT", "loc" : [ -84.651134, 45.153247 ], "pop" : 1541, "state" : "MI" } +{ "_id" : "49799", "city" : "WOLVERINE", "loc" : [ -84.606477, 45.286148 ], "pop" : 1857, "state" : "MI" } +{ "_id" : "49801", "city" : "IRON MOUNTAIN", "loc" : [ -88.068257, 45.821894 ], "pop" : 18423, "state" : "MI" } +{ "_id" : "49806", "city" : "AU TRAIN", "loc" : [ -86.77932699999999, 46.428231 ], "pop" : 796, "state" : "MI" } +{ "_id" : "49807", "city" : "HARDWOOD", "loc" : [ -87.240522, 45.705411 ], "pop" : 4037, "state" : "MI" } +{ "_id" : "49812", "city" : "CARNEY", "loc" : [ -87.543896, 45.591738 ], "pop" : 1014, "state" : "MI" } +{ "_id" : "49813", "city" : "CEDAR RIVER", "loc" : [ -87.365994, 45.448475 ], "pop" : 185, "state" : "MI" } +{ "_id" : "49814", "city" : "CHAMPION", "loc" : [ -87.83058699999999, 46.468497 ], "pop" : 2774, "state" : "MI" } +{ "_id" : "49815", "city" : "CHANNING", "loc" : [ -88.07722099999999, 46.154562 ], "pop" : 522, "state" : "MI" } +{ "_id" : "49816", "city" : "LIMESTONE", "loc" : [ -86.758934, 46.294821 ], "pop" : 251, "state" : "MI" } +{ "_id" : "49817", "city" : "COOKS", "loc" : [ -86.53071799999999, 45.899665 ], "pop" : 2, "state" : "MI" } +{ "_id" : "49818", "city" : "CORNELL", "loc" : [ -87.223702, 45.910373 ], "pop" : 671, "state" : "MI" } +{ "_id" : "49820", "city" : "CURTIS", "loc" : [ -85.786466, 46.204763 ], "pop" : 523, "state" : "MI" } +{ "_id" : "49821", "city" : "DAGGETT", "loc" : [ -87.60785799999999, 45.488738 ], "pop" : 1184, "state" : "MI" } +{ "_id" : "49822", "city" : "DEERTON", "loc" : [ -87.04064, 46.483979 ], "pop" : 290, "state" : "MI" } +{ "_id" : "49825", "city" : "EBEN JUNCTION", "loc" : [ -87.032799, 46.351726 ], "pop" : 456, "state" : "MI" } +{ "_id" : "49826", "city" : "RUMELY", "loc" : [ -86.935068, 46.341867 ], "pop" : 823, "state" : "MI" } +{ "_id" : "49827", "city" : "ENGADINE", "loc" : [ -85.60046800000001, 46.204009 ], "pop" : 327, "state" : "MI" } +{ "_id" : "49829", "city" : "ESCANABA", "loc" : [ -87.08898499999999, 45.76587 ], "pop" : 21065, "state" : "MI" } +{ "_id" : "49833", "city" : "LITTLE LAKE", "loc" : [ -87.41144799999999, 46.053711 ], "pop" : 437, "state" : "MI" } +{ "_id" : "49834", "city" : "FOSTER CITY", "loc" : [ -87.804768, 46.004769 ], "pop" : 1249, "state" : "MI" } +{ "_id" : "49835", "city" : "GARDEN", "loc" : [ -86.57757599999999, 45.754867 ], "pop" : 934, "state" : "MI" } +{ "_id" : "49836", "city" : "GERMFASK", "loc" : [ -85.91589, 46.236261 ], "pop" : 542, "state" : "MI" } +{ "_id" : "49837", "city" : "BRAMPTON", "loc" : [ -87.02728399999999, 45.856402 ], "pop" : 5707, "state" : "MI" } +{ "_id" : "49838", "city" : "GOULD CITY", "loc" : [ -85.725889, 46.134544 ], "pop" : 615, "state" : "MI" } +{ "_id" : "49839", "city" : "GRAND MARAIS", "loc" : [ -85.983633, 46.652916 ], "pop" : 508, "state" : "MI" } +{ "_id" : "49840", "city" : "GULLIVER", "loc" : [ -86.021433, 46.011491 ], "pop" : 822, "state" : "MI" } +{ "_id" : "49841", "city" : "PRINCETON", "loc" : [ -87.43016, 46.291938 ], "pop" : 5377, "state" : "MI" } +{ "_id" : "49843", "city" : "K I SAWYER A F B", "loc" : [ -87.37593, 46.330811 ], "pop" : 5613, "state" : "MI" } +{ "_id" : "49847", "city" : "HERMANSVILLE", "loc" : [ -87.622659, 45.714902 ], "pop" : 1090, "state" : "MI" } +{ "_id" : "49848", "city" : "INGALLS", "loc" : [ -87.62060700000001, 45.374774 ], "pop" : 340, "state" : "MI" } +{ "_id" : "49849", "city" : "NORTH LAKE", "loc" : [ -87.682638, 46.490165 ], "pop" : 11725, "state" : "MI" } +{ "_id" : "49853", "city" : "MC MILLAN", "loc" : [ -85.730715, 46.297027 ], "pop" : 897, "state" : "MI" } +{ "_id" : "49854", "city" : "THOMPSON", "loc" : [ -86.275513, 45.982978 ], "pop" : 6753, "state" : "MI" } +{ "_id" : "49855", "city" : "BEAVER GROVE", "loc" : [ -87.389443, 46.53124 ], "pop" : 32361, "state" : "MI" } +{ "_id" : "49858", "city" : "MENOMINEE", "loc" : [ -87.621475, 45.13427 ], "pop" : 13149, "state" : "MI" } +{ "_id" : "49861", "city" : "MICHIGAMME", "loc" : [ -87.892386, 46.668143 ], "pop" : 1230, "state" : "MI" } +{ "_id" : "49862", "city" : "CHRISTMAS", "loc" : [ -86.626846, 46.413863 ], "pop" : 3762, "state" : "MI" } +{ "_id" : "49866", "city" : "NEGAUNEE", "loc" : [ -87.582915, 46.500662 ], "pop" : 8204, "state" : "MI" } +{ "_id" : "49868", "city" : "NEWBERRY", "loc" : [ -85.514951, 46.343763 ], "pop" : 4866, "state" : "MI" } +{ "_id" : "49870", "city" : "NORWAY", "loc" : [ -87.90469299999999, 45.786186 ], "pop" : 3300, "state" : "MI" } +{ "_id" : "49873", "city" : "PERRONVILLE", "loc" : [ -87.398903, 45.826409 ], "pop" : 360, "state" : "MI" } +{ "_id" : "49874", "city" : "POWERS", "loc" : [ -87.531853, 45.679238 ], "pop" : 559, "state" : "MI" } +{ "_id" : "49876", "city" : "QUINNESEC", "loc" : [ -87.99215100000001, 45.799866 ], "pop" : 1313, "state" : "MI" } +{ "_id" : "49878", "city" : "RAPID RIVER", "loc" : [ -86.88449, 45.910662 ], "pop" : 3345, "state" : "MI" } +{ "_id" : "49879", "city" : "REPUBLIC", "loc" : [ -87.99382300000001, 46.368046 ], "pop" : 1192, "state" : "MI" } +{ "_id" : "49880", "city" : "ROCK", "loc" : [ -87.13306799999999, 46.050262 ], "pop" : 1601, "state" : "MI" } +{ "_id" : "49881", "city" : "SAGOLA", "loc" : [ -88.067644, 46.081274 ], "pop" : 392, "state" : "MI" } +{ "_id" : "49883", "city" : "SENEY", "loc" : [ -85.97084700000001, 46.387989 ], "pop" : 185, "state" : "MI" } +{ "_id" : "49884", "city" : "SHINGLETON", "loc" : [ -86.48226099999999, 46.351202 ], "pop" : 589, "state" : "MI" } +{ "_id" : "49885", "city" : "SKANDIA", "loc" : [ -87.24809399999999, 46.349049 ], "pop" : 1975, "state" : "MI" } +{ "_id" : "49886", "city" : "SPALDING", "loc" : [ -87.49639999999999, 45.695747 ], "pop" : 922, "state" : "MI" } +{ "_id" : "49887", "city" : "STEPHENSON", "loc" : [ -87.62578999999999, 45.416594 ], "pop" : 2202, "state" : "MI" } +{ "_id" : "49890", "city" : "TRAUNIK", "loc" : [ -86.988891, 46.258534 ], "pop" : 334, "state" : "MI" } +{ "_id" : "49891", "city" : "TRENARY", "loc" : [ -86.950183, 46.194738 ], "pop" : 563, "state" : "MI" } +{ "_id" : "49892", "city" : "VULCAN", "loc" : [ -87.816811, 45.762257 ], "pop" : 1841, "state" : "MI" } +{ "_id" : "49893", "city" : "WALLACE", "loc" : [ -87.580457, 45.301657 ], "pop" : 2103, "state" : "MI" } +{ "_id" : "49894", "city" : "WELLS", "loc" : [ -87.073443, 45.784866 ], "pop" : 1093, "state" : "MI" } +{ "_id" : "49895", "city" : "WETMORE", "loc" : [ -86.63453699999999, 46.353518 ], "pop" : 646, "state" : "MI" } +{ "_id" : "49896", "city" : "WILSON", "loc" : [ -87.399734, 45.664855 ], "pop" : 1112, "state" : "MI" } +{ "_id" : "49905", "city" : "ATLANTIC MINE", "loc" : [ -88.66131799999999, 47.093663 ], "pop" : 3379, "state" : "MI" } +{ "_id" : "49908", "city" : "KEWEENAW BAY", "loc" : [ -88.49548900000001, 46.790213 ], "pop" : 1759, "state" : "MI" } +{ "_id" : "49910", "city" : "BERGLAND", "loc" : [ -89.597296, 46.588124 ], "pop" : 618, "state" : "MI" } +{ "_id" : "49911", "city" : "BESSEMER", "loc" : [ -90.05154400000001, 46.480188 ], "pop" : 3603, "state" : "MI" } +{ "_id" : "49912", "city" : "BRUCE CROSSING", "loc" : [ -89.16802800000001, 46.527956 ], "pop" : 1089, "state" : "MI" } +{ "_id" : "49913", "city" : "LAURIUM", "loc" : [ -88.44271999999999, 47.242721 ], "pop" : 7656, "state" : "MI" } +{ "_id" : "49916", "city" : "CHASSELL", "loc" : [ -88.554554, 47.002038 ], "pop" : 3096, "state" : "MI" } +{ "_id" : "49919", "city" : "COVINGTON", "loc" : [ -88.524452, 46.557194 ], "pop" : 260, "state" : "MI" } +{ "_id" : "49920", "city" : "CRYSTAL FALLS", "loc" : [ -88.350517, 46.109255 ], "pop" : 4804, "state" : "MI" } +{ "_id" : "49921", "city" : "DODGEVILLE", "loc" : [ -88.58087399999999, 47.091443 ], "pop" : 390, "state" : "MI" } +{ "_id" : "49925", "city" : "EWEN", "loc" : [ -89.314494, 46.540412 ], "pop" : 772, "state" : "MI" } +{ "_id" : "49927", "city" : "GAASTRA", "loc" : [ -88.591728, 46.052638 ], "pop" : 489, "state" : "MI" } +{ "_id" : "49930", "city" : "HANCOCK", "loc" : [ -88.56538500000001, 47.136731 ], "pop" : 7683, "state" : "MI" } +{ "_id" : "49931", "city" : "HOUGHTON", "loc" : [ -88.558024, 47.115801 ], "pop" : 8639, "state" : "MI" } +{ "_id" : "49935", "city" : "IRON RIVER", "loc" : [ -88.645974, 46.093017 ], "pop" : 7882, "state" : "MI" } +{ "_id" : "49938", "city" : "IRONWOOD", "loc" : [ -90.158844, 46.463793 ], "pop" : 9402, "state" : "MI" } +{ "_id" : "49943", "city" : "KENTON", "loc" : [ -88.812933, 46.491565 ], "pop" : 304, "state" : "MI" } +{ "_id" : "49945", "city" : "GAY", "loc" : [ -88.411829, 47.171387 ], "pop" : 3365, "state" : "MI" } +{ "_id" : "49946", "city" : "LANSE", "loc" : [ -88.420959, 46.770407 ], "pop" : 3929, "state" : "MI" } +{ "_id" : "49947", "city" : "MARENISCO", "loc" : [ -89.67742200000001, 46.355107 ], "pop" : 956, "state" : "MI" } +{ "_id" : "49948", "city" : "MASS CITY", "loc" : [ -89.064864, 46.747447 ], "pop" : 805, "state" : "MI" } +{ "_id" : "49950", "city" : "EAGLE HARBOR", "loc" : [ -88.332572, 47.320067 ], "pop" : 1701, "state" : "MI" } +{ "_id" : "49952", "city" : "NISULA", "loc" : [ -88.83396999999999, 46.76952 ], "pop" : 73, "state" : "MI" } +{ "_id" : "49953", "city" : "ONTONAGON", "loc" : [ -89.348474, 46.827484 ], "pop" : 5090, "state" : "MI" } +{ "_id" : "49958", "city" : "PELKIE", "loc" : [ -88.625083, 46.794932 ], "pop" : 1583, "state" : "MI" } +{ "_id" : "49962", "city" : "SKANEE", "loc" : [ -88.17318899999999, 46.874732 ], "pop" : 310, "state" : "MI" } +{ "_id" : "49965", "city" : "TOIVOLA", "loc" : [ -88.860657, 46.985447 ], "pop" : 352, "state" : "MI" } +{ "_id" : "49967", "city" : "TROUT CREEK", "loc" : [ -89.026962, 46.486426 ], "pop" : 480, "state" : "MI" } +{ "_id" : "49968", "city" : "WAKEFIELD", "loc" : [ -89.942446, 46.475184 ], "pop" : 3043, "state" : "MI" } +{ "_id" : "49969", "city" : "WATERSMEET", "loc" : [ -89.210836, 46.25416 ], "pop" : 1048, "state" : "MI" } +{ "_id" : "49970", "city" : "WATTON", "loc" : [ -88.599298, 46.513698 ], "pop" : 391, "state" : "MI" } +{ "_id" : "50001", "city" : "ACKWORTH", "loc" : [ -93.37671899999999, 41.37372 ], "pop" : 491, "state" : "IA" } +{ "_id" : "50002", "city" : "ADAIR", "loc" : [ -94.644363, 41.513687 ], "pop" : 1748, "state" : "IA" } +{ "_id" : "50003", "city" : "ADEL", "loc" : [ -94.037965, 41.62214 ], "pop" : 4884, "state" : "IA" } +{ "_id" : "50005", "city" : "ALBION", "loc" : [ -92.98821, 42.11427 ], "pop" : 773, "state" : "IA" } +{ "_id" : "50006", "city" : "ALDEN", "loc" : [ -93.384123, 42.51789 ], "pop" : 1374, "state" : "IA" } +{ "_id" : "50007", "city" : "ALLEMAN", "loc" : [ -93.60630500000001, 41.815886 ], "pop" : 449, "state" : "IA" } +{ "_id" : "50008", "city" : "ALLERTON", "loc" : [ -93.37239, 40.702301 ], "pop" : 805, "state" : "IA" } +{ "_id" : "50009", "city" : "ALTOONA", "loc" : [ -93.472415, 41.647549 ], "pop" : 7546, "state" : "IA" } +{ "_id" : "50010", "city" : "AMES", "loc" : [ -93.639398, 42.029859 ], "pop" : 52105, "state" : "IA" } +{ "_id" : "50020", "city" : "ANITA", "loc" : [ -94.77940099999999, 41.449973 ], "pop" : 1529, "state" : "IA" } +{ "_id" : "50021", "city" : "ANKENY", "loc" : [ -93.602175, 41.72755 ], "pop" : 20465, "state" : "IA" } +{ "_id" : "50022", "city" : "ATLANTIC", "loc" : [ -95.01012299999999, 41.400279 ], "pop" : 8468, "state" : "IA" } +{ "_id" : "50025", "city" : "AUDUBON", "loc" : [ -94.91641199999999, 41.730032 ], "pop" : 4034, "state" : "IA" } +{ "_id" : "50026", "city" : "BAGLEY", "loc" : [ -94.441535, 41.834053 ], "pop" : 568, "state" : "IA" } +{ "_id" : "50027", "city" : "BARNES CITY", "loc" : [ -92.470338, 41.488269 ], "pop" : 355, "state" : "IA" } +{ "_id" : "50028", "city" : "BAXTER", "loc" : [ -93.158332, 41.820369 ], "pop" : 1381, "state" : "IA" } +{ "_id" : "50029", "city" : "BAYARD", "loc" : [ -94.591533, 41.838599 ], "pop" : 971, "state" : "IA" } +{ "_id" : "50030", "city" : "BEACONSFIELD", "loc" : [ -94.075126, 40.778431 ], "pop" : 195, "state" : "IA" } +{ "_id" : "50031", "city" : "BEAVER", "loc" : [ -94.103309, 42.039936 ], "pop" : 501, "state" : "IA" } +{ "_id" : "50033", "city" : "BEVINGTON", "loc" : [ -93.812865, 41.371763 ], "pop" : 273, "state" : "IA" } +{ "_id" : "50034", "city" : "BLAIRSBURG", "loc" : [ -93.65944399999999, 42.493725 ], "pop" : 458, "state" : "IA" } +{ "_id" : "50035", "city" : "BONDURANT", "loc" : [ -93.45268900000001, 41.70166 ], "pop" : 2666, "state" : "IA" } +{ "_id" : "50036", "city" : "BOONE", "loc" : [ -93.878083, 42.069354 ], "pop" : 14773, "state" : "IA" } +{ "_id" : "50038", "city" : "BOONEVILLE", "loc" : [ -93.88135699999999, 41.533987 ], "pop" : 100, "state" : "IA" } +{ "_id" : "50039", "city" : "BOUTON", "loc" : [ -93.996286, 41.828432 ], "pop" : 552, "state" : "IA" } +{ "_id" : "50040", "city" : "BOXHOLM", "loc" : [ -94.10524599999999, 42.170567 ], "pop" : 437, "state" : "IA" } +{ "_id" : "50041", "city" : "BRADFORD", "loc" : [ -93.218068, 42.610434 ], "pop" : 406, "state" : "IA" } +{ "_id" : "50042", "city" : "BRAYTON", "loc" : [ -94.974017, 41.55236 ], "pop" : 416, "state" : "IA" } +{ "_id" : "50044", "city" : "BUSSEY", "loc" : [ -92.896252, 41.209422 ], "pop" : 707, "state" : "IA" } +{ "_id" : "50046", "city" : "CAMBRIDGE", "loc" : [ -93.53053800000001, 41.90251 ], "pop" : 1103, "state" : "IA" } +{ "_id" : "50047", "city" : "CARLISLE", "loc" : [ -93.49214000000001, 41.481384 ], "pop" : 5109, "state" : "IA" } +{ "_id" : "50048", "city" : "CASEY", "loc" : [ -94.414475, 41.496116 ], "pop" : 1822, "state" : "IA" } +{ "_id" : "50049", "city" : "CHARITON", "loc" : [ -93.30419000000001, 41.022638 ], "pop" : 6836, "state" : "IA" } +{ "_id" : "50050", "city" : "CHURDAN", "loc" : [ -94.493346, 42.161402 ], "pop" : 797, "state" : "IA" } +{ "_id" : "50051", "city" : "CLEMONS", "loc" : [ -93.16878, 42.090041 ], "pop" : 557, "state" : "IA" } +{ "_id" : "50052", "city" : "CLIO", "loc" : [ -93.48644299999999, 40.680261 ], "pop" : 125, "state" : "IA" } +{ "_id" : "50054", "city" : "COLFAX", "loc" : [ -93.258816, 41.678785 ], "pop" : 3475, "state" : "IA" } +{ "_id" : "50055", "city" : "COLLINS", "loc" : [ -93.300808, 41.903226 ], "pop" : 764, "state" : "IA" } +{ "_id" : "50056", "city" : "COLO", "loc" : [ -93.307114, 42.013102 ], "pop" : 1293, "state" : "IA" } +{ "_id" : "50057", "city" : "COLUMBIA", "loc" : [ -93.15821699999999, 41.183814 ], "pop" : 304, "state" : "IA" } +{ "_id" : "50058", "city" : "COON RAPIDS", "loc" : [ -94.679979, 41.893957 ], "pop" : 1802, "state" : "IA" } +{ "_id" : "50059", "city" : "COOPER", "loc" : [ -94.339073, 41.903433 ], "pop" : 170, "state" : "IA" } +{ "_id" : "50060", "city" : "SEWAL", "loc" : [ -93.322549, 40.76131 ], "pop" : 2617, "state" : "IA" } +{ "_id" : "50061", "city" : "CUMMING", "loc" : [ -93.75386, 41.484876 ], "pop" : 635, "state" : "IA" } +{ "_id" : "50062", "city" : "DALLAS", "loc" : [ -93.253525, 41.221332 ], "pop" : 996, "state" : "IA" } +{ "_id" : "50063", "city" : "DALLAS CENTER", "loc" : [ -93.970657, 41.686248 ], "pop" : 1838, "state" : "IA" } +{ "_id" : "50064", "city" : "DANA", "loc" : [ -94.232212, 42.10634 ], "pop" : 131, "state" : "IA" } +{ "_id" : "50065", "city" : "PLEASANTON", "loc" : [ -93.807022, 40.632075 ], "pop" : 762, "state" : "IA" } +{ "_id" : "50066", "city" : "DAWSON", "loc" : [ -94.217127, 41.832396 ], "pop" : 434, "state" : "IA" } +{ "_id" : "50067", "city" : "DECATUR", "loc" : [ -93.832598, 40.755258 ], "pop" : 394, "state" : "IA" } +{ "_id" : "50068", "city" : "DERBY", "loc" : [ -93.47959, 40.935476 ], "pop" : 339, "state" : "IA" } +{ "_id" : "50069", "city" : "DE SOTO", "loc" : [ -94.027582, 41.533285 ], "pop" : 1535, "state" : "IA" } +{ "_id" : "50070", "city" : "DEXTER", "loc" : [ -94.2145, 41.519806 ], "pop" : 824, "state" : "IA" } +{ "_id" : "50071", "city" : "DOWS", "loc" : [ -93.50580100000001, 42.661026 ], "pop" : 1373, "state" : "IA" } +{ "_id" : "50072", "city" : "EARLHAM", "loc" : [ -94.12944299999999, 41.470916 ], "pop" : 2010, "state" : "IA" } +{ "_id" : "50073", "city" : "ELKHART", "loc" : [ -93.48545799999999, 41.811384 ], "pop" : 1374, "state" : "IA" } +{ "_id" : "50074", "city" : "ELLSTON", "loc" : [ -94.08411599999999, 40.850485 ], "pop" : 286, "state" : "IA" } +{ "_id" : "50075", "city" : "ELLSWORTH", "loc" : [ -93.548979, 42.30086 ], "pop" : 1129, "state" : "IA" } +{ "_id" : "50076", "city" : "EXIRA", "loc" : [ -94.857145, 41.576771 ], "pop" : 1590, "state" : "IA" } +{ "_id" : "50101", "city" : "GALT", "loc" : [ -93.60351199999999, 42.691187 ], "pop" : 57, "state" : "IA" } +{ "_id" : "50102", "city" : "GARDEN CITY", "loc" : [ -93.403068, 42.25266 ], "pop" : 422, "state" : "IA" } +{ "_id" : "50103", "city" : "GARDEN GROVE", "loc" : [ -93.61166900000001, 40.771078 ], "pop" : 603, "state" : "IA" } +{ "_id" : "50104", "city" : "GIBSON", "loc" : [ -92.353121, 41.464206 ], "pop" : 458, "state" : "IA" } +{ "_id" : "50106", "city" : "GILMAN", "loc" : [ -92.810067, 41.901236 ], "pop" : 1221, "state" : "IA" } +{ "_id" : "50107", "city" : "GRAND JUNCTION", "loc" : [ -94.23362899999999, 42.029578 ], "pop" : 1055, "state" : "IA" } +{ "_id" : "50108", "city" : "GRAND RIVER", "loc" : [ -93.95437200000001, 40.813704 ], "pop" : 454, "state" : "IA" } +{ "_id" : "50109", "city" : "GRANGER", "loc" : [ -93.841002, 41.752355 ], "pop" : 1324, "state" : "IA" } +{ "_id" : "50110", "city" : "GRAY", "loc" : [ -95.02272000000001, 41.82663 ], "pop" : 344, "state" : "IA" } +{ "_id" : "50111", "city" : "GRIMES", "loc" : [ -93.78210900000001, 41.701838 ], "pop" : 4205, "state" : "IA" } +{ "_id" : "50112", "city" : "GRINNELL", "loc" : [ -92.734432, 41.742081 ], "pop" : 11530, "state" : "IA" } +{ "_id" : "50115", "city" : "GUTHRIE CENTER", "loc" : [ -94.48644400000001, 41.683671 ], "pop" : 3398, "state" : "IA" } +{ "_id" : "50116", "city" : "HAMILTON", "loc" : [ -92.92434900000001, 41.175543 ], "pop" : 314, "state" : "IA" } +{ "_id" : "50117", "city" : "HAMLIN", "loc" : [ -94.915745, 41.650571 ], "pop" : 336, "state" : "IA" } +{ "_id" : "50118", "city" : "HARTFORD", "loc" : [ -93.402213, 41.459629 ], "pop" : 1201, "state" : "IA" } +{ "_id" : "50119", "city" : "HARVEY", "loc" : [ -92.931843, 41.302972 ], "pop" : 683, "state" : "IA" } +{ "_id" : "50120", "city" : "HAVERHILL", "loc" : [ -92.945857, 41.93196 ], "pop" : 419, "state" : "IA" } +{ "_id" : "50122", "city" : "HUBBARD", "loc" : [ -93.29392799999999, 42.302208 ], "pop" : 1356, "state" : "IA" } +{ "_id" : "50123", "city" : "HUMESTON", "loc" : [ -93.51011699999999, 40.846922 ], "pop" : 981, "state" : "IA" } +{ "_id" : "50124", "city" : "HUXLEY", "loc" : [ -93.60238099999999, 41.899434 ], "pop" : 2417, "state" : "IA" } +{ "_id" : "50125", "city" : "SPRING HILL", "loc" : [ -93.571502, 41.35617 ], "pop" : 13920, "state" : "IA" } +{ "_id" : "50126", "city" : "IOWA FALLS", "loc" : [ -93.270943, 42.513756 ], "pop" : 7714, "state" : "IA" } +{ "_id" : "50127", "city" : "IRA", "loc" : [ -93.16443599999999, 41.731759 ], "pop" : 378, "state" : "IA" } +{ "_id" : "50128", "city" : "JAMAICA", "loc" : [ -94.320367, 41.841931 ], "pop" : 423, "state" : "IA" } +{ "_id" : "50129", "city" : "JEFFERSON", "loc" : [ -94.388768, 42.009325 ], "pop" : 5663, "state" : "IA" } +{ "_id" : "50130", "city" : "JEWELL", "loc" : [ -93.642821, 42.313912 ], "pop" : 1348, "state" : "IA" } +{ "_id" : "50131", "city" : "JOHNSTON", "loc" : [ -93.702792, 41.673017 ], "pop" : 4945, "state" : "IA" } +{ "_id" : "50132", "city" : "KAMRAR", "loc" : [ -93.727941, 42.394517 ], "pop" : 246, "state" : "IA" } +{ "_id" : "50133", "city" : "KELLERTON", "loc" : [ -94.060693, 40.686127 ], "pop" : 601, "state" : "IA" } +{ "_id" : "50134", "city" : "KELLEY", "loc" : [ -93.664354, 41.948773 ], "pop" : 314, "state" : "IA" } +{ "_id" : "50135", "city" : "KELLOGG", "loc" : [ -92.911404, 41.718371 ], "pop" : 913, "state" : "IA" } +{ "_id" : "50136", "city" : "KESWICK", "loc" : [ -92.239547, 41.461251 ], "pop" : 497, "state" : "IA" } +{ "_id" : "50138", "city" : "KNOXVILLE", "loc" : [ -93.095427, 41.316446 ], "pop" : 11205, "state" : "IA" } +{ "_id" : "50139", "city" : "LACONA", "loc" : [ -93.38380100000001, 41.198832 ], "pop" : 700, "state" : "IA" } +{ "_id" : "50140", "city" : "LAMONI", "loc" : [ -93.934899, 40.622852 ], "pop" : 2638, "state" : "IA" } +{ "_id" : "50141", "city" : "LAUREL", "loc" : [ -92.926294, 41.882904 ], "pop" : 457, "state" : "IA" } +{ "_id" : "50143", "city" : "LEIGHTON", "loc" : [ -92.808125, 41.364677 ], "pop" : 594, "state" : "IA" } +{ "_id" : "50144", "city" : "LEON", "loc" : [ -93.742903, 40.737334 ], "pop" : 2556, "state" : "IA" } +{ "_id" : "50145", "city" : "LIBERTY CENTER", "loc" : [ -93.49739099999999, 41.207668 ], "pop" : 468, "state" : "IA" } +{ "_id" : "50146", "city" : "LINDEN", "loc" : [ -94.24057999999999, 41.64225 ], "pop" : 585, "state" : "IA" } +{ "_id" : "50147", "city" : "LINEVILLE", "loc" : [ -93.48620699999999, 40.600373 ], "pop" : 586, "state" : "IA" } +{ "_id" : "50148", "city" : "LISCOMB", "loc" : [ -92.983279, 42.184 ], "pop" : 512, "state" : "IA" } +{ "_id" : "50149", "city" : "LORIMOR", "loc" : [ -94.063885, 41.1233 ], "pop" : 619, "state" : "IA" } +{ "_id" : "50150", "city" : "LOVILIA", "loc" : [ -92.929272, 41.12719 ], "pop" : 1053, "state" : "IA" } +{ "_id" : "50151", "city" : "LUCAS", "loc" : [ -93.483614, 41.058451 ], "pop" : 617, "state" : "IA" } +{ "_id" : "50152", "city" : "LUTHER", "loc" : [ -93.855394, 41.991934 ], "pop" : 529, "state" : "IA" } +{ "_id" : "50153", "city" : "LYNNVILLE", "loc" : [ -92.78771500000001, 41.569766 ], "pop" : 630, "state" : "IA" } +{ "_id" : "50154", "city" : "MC CALLSBURG", "loc" : [ -93.397757, 42.166475 ], "pop" : 533, "state" : "IA" } +{ "_id" : "50155", "city" : "MACKSBURG", "loc" : [ -94.18567299999999, 41.202792 ], "pop" : 310, "state" : "IA" } +{ "_id" : "50156", "city" : "MADRID", "loc" : [ -93.844815, 41.884083 ], "pop" : 4367, "state" : "IA" } +{ "_id" : "50157", "city" : "MALCOM", "loc" : [ -92.535426, 41.769502 ], "pop" : 1595, "state" : "IA" } +{ "_id" : "50158", "city" : "MARSHALLTOWN", "loc" : [ -92.91269, 42.040482 ], "pop" : 30857, "state" : "IA" } +{ "_id" : "50161", "city" : "MAXWELL", "loc" : [ -93.400125, 41.89673 ], "pop" : 1268, "state" : "IA" } +{ "_id" : "50162", "city" : "MELBOURNE", "loc" : [ -93.085627, 41.932348 ], "pop" : 970, "state" : "IA" } +{ "_id" : "50163", "city" : "MELCHER-DALLAS", "loc" : [ -93.219404, 41.222912 ], "pop" : 924, "state" : "IA" } +{ "_id" : "50164", "city" : "MENLO", "loc" : [ -94.409002, 41.534797 ], "pop" : 650, "state" : "IA" } +{ "_id" : "50165", "city" : "MILLERTON", "loc" : [ -93.27958599999999, 40.854889 ], "pop" : 258, "state" : "IA" } +{ "_id" : "50166", "city" : "MILO", "loc" : [ -93.445356, 41.29042 ], "pop" : 1705, "state" : "IA" } +{ "_id" : "50167", "city" : "MINBURN", "loc" : [ -94.01501, 41.756206 ], "pop" : 517, "state" : "IA" } +{ "_id" : "50168", "city" : "MINGO", "loc" : [ -93.288015, 41.789843 ], "pop" : 725, "state" : "IA" } +{ "_id" : "50169", "city" : "MITCHELLVILLE", "loc" : [ -93.36995, 41.66089 ], "pop" : 2363, "state" : "IA" } +{ "_id" : "50170", "city" : "MONROE", "loc" : [ -93.072551, 41.535619 ], "pop" : 2868, "state" : "IA" } +{ "_id" : "50171", "city" : "MONTEZUMA", "loc" : [ -92.527582, 41.592845 ], "pop" : 3570, "state" : "IA" } +{ "_id" : "50172", "city" : "GUERNSEY", "loc" : [ -92.333549, 41.662496 ], "pop" : 128, "state" : "IA" } +{ "_id" : "50173", "city" : "MONTOUR", "loc" : [ -92.700575, 41.970876 ], "pop" : 1137, "state" : "IA" } +{ "_id" : "50174", "city" : "MURRAY", "loc" : [ -93.952975, 41.037644 ], "pop" : 1357, "state" : "IA" } +{ "_id" : "50201", "city" : "NEVADA", "loc" : [ -93.446219, 42.018983 ], "pop" : 7381, "state" : "IA" } +{ "_id" : "50206", "city" : "NEW PROVIDENCE", "loc" : [ -93.175262, 42.269261 ], "pop" : 445, "state" : "IA" } +{ "_id" : "50207", "city" : "NEW SHARON", "loc" : [ -92.684815, 41.463976 ], "pop" : 2426, "state" : "IA" } +{ "_id" : "50208", "city" : "NEWTON", "loc" : [ -93.045456, 41.699173 ], "pop" : 19721, "state" : "IA" } +{ "_id" : "50210", "city" : "NEW VIRGINIA", "loc" : [ -93.71131200000001, 41.160063 ], "pop" : 1593, "state" : "IA" } +{ "_id" : "50211", "city" : "NORWALK", "loc" : [ -93.657332, 41.486055 ], "pop" : 9512, "state" : "IA" } +{ "_id" : "50212", "city" : "OGDEN", "loc" : [ -94.006333, 42.035106 ], "pop" : 3115, "state" : "IA" } +{ "_id" : "50213", "city" : "OSCEOLA", "loc" : [ -93.771236, 41.029503 ], "pop" : 5528, "state" : "IA" } +{ "_id" : "50214", "city" : "OTLEY", "loc" : [ -93.034778, 41.451806 ], "pop" : 676, "state" : "IA" } +{ "_id" : "50216", "city" : "PANORA", "loc" : [ -94.360613, 41.696684 ], "pop" : 1847, "state" : "IA" } +{ "_id" : "50217", "city" : "PATON", "loc" : [ -94.273038, 42.165841 ], "pop" : 621, "state" : "IA" } +{ "_id" : "50218", "city" : "PATTERSON", "loc" : [ -93.878174, 41.353912 ], "pop" : 258, "state" : "IA" } +{ "_id" : "50219", "city" : "PELLA", "loc" : [ -92.917207, 41.408175 ], "pop" : 10771, "state" : "IA" } +{ "_id" : "50220", "city" : "PERRY", "loc" : [ -94.10216699999999, 41.839695 ], "pop" : 7918, "state" : "IA" } +{ "_id" : "50222", "city" : "PERU", "loc" : [ -93.943729, 41.21454 ], "pop" : 442, "state" : "IA" } +{ "_id" : "50223", "city" : "PILOT MOUND", "loc" : [ -94.010184, 42.160395 ], "pop" : 380, "state" : "IA" } +{ "_id" : "50225", "city" : "PLEASANTVILLE", "loc" : [ -93.27120600000001, 41.373836 ], "pop" : 2474, "state" : "IA" } +{ "_id" : "50226", "city" : "POLK CITY", "loc" : [ -93.689346, 41.754905 ], "pop" : 4203, "state" : "IA" } +{ "_id" : "50227", "city" : "POPEJOY", "loc" : [ -93.43086700000001, 42.595628 ], "pop" : 298, "state" : "IA" } +{ "_id" : "50228", "city" : "PRAIRIE CITY", "loc" : [ -93.24098600000001, 41.585425 ], "pop" : 1941, "state" : "IA" } +{ "_id" : "50229", "city" : "PROLE", "loc" : [ -93.734357, 41.382973 ], "pop" : 1488, "state" : "IA" } +{ "_id" : "50230", "city" : "RADCLIFFE", "loc" : [ -93.42336400000001, 42.324064 ], "pop" : 804, "state" : "IA" } +{ "_id" : "50231", "city" : "RANDALL", "loc" : [ -93.62109, 42.247463 ], "pop" : 508, "state" : "IA" } +{ "_id" : "50232", "city" : "REASNOR", "loc" : [ -93.01982700000001, 41.579802 ], "pop" : 245, "state" : "IA" } +{ "_id" : "50233", "city" : "REDFIELD", "loc" : [ -94.189733, 41.587349 ], "pop" : 1236, "state" : "IA" } +{ "_id" : "50234", "city" : "RHODES", "loc" : [ -93.179586, 41.917717 ], "pop" : 564, "state" : "IA" } +{ "_id" : "50235", "city" : "RIPPEY", "loc" : [ -94.213202, 41.92574 ], "pop" : 563, "state" : "IA" } +{ "_id" : "50236", "city" : "ROLAND", "loc" : [ -93.50631300000001, 42.164585 ], "pop" : 1452, "state" : "IA" } +{ "_id" : "50237", "city" : "RUNNELLS", "loc" : [ -93.42025, 41.551549 ], "pop" : 2309, "state" : "IA" } +{ "_id" : "50238", "city" : "RUSSELL", "loc" : [ -93.178371, 40.945557 ], "pop" : 1018, "state" : "IA" } +{ "_id" : "50239", "city" : "SAINT ANTHONY", "loc" : [ -93.18243099999999, 42.151974 ], "pop" : 328, "state" : "IA" } +{ "_id" : "50240", "city" : "SAINT CHARLES", "loc" : [ -93.824195, 41.292443 ], "pop" : 1169, "state" : "IA" } +{ "_id" : "50241", "city" : "SAINT MARYS", "loc" : [ -93.736107, 41.297826 ], "pop" : 632, "state" : "IA" } +{ "_id" : "50242", "city" : "SEARSBORO", "loc" : [ -92.69873699999999, 41.56561 ], "pop" : 464, "state" : "IA" } +{ "_id" : "50244", "city" : "SLATER", "loc" : [ -93.681155, 41.876511 ], "pop" : 2083, "state" : "IA" } +{ "_id" : "50246", "city" : "STANHOPE", "loc" : [ -93.775081, 42.290407 ], "pop" : 1001, "state" : "IA" } +{ "_id" : "50247", "city" : "STATE CENTER", "loc" : [ -93.167283, 42.010911 ], "pop" : 1618, "state" : "IA" } +{ "_id" : "50248", "city" : "STORY CITY", "loc" : [ -93.598811, 42.183487 ], "pop" : 3501, "state" : "IA" } +{ "_id" : "50249", "city" : "STRATFORD", "loc" : [ -93.90294, 42.284673 ], "pop" : 1215, "state" : "IA" } +{ "_id" : "50250", "city" : "STUART", "loc" : [ -94.304563, 41.518643 ], "pop" : 1463, "state" : "IA" } +{ "_id" : "50251", "city" : "SULLY", "loc" : [ -92.845085, 41.573969 ], "pop" : 1096, "state" : "IA" } +{ "_id" : "50252", "city" : "SWAN", "loc" : [ -93.234165, 41.4717 ], "pop" : 691, "state" : "IA" } +{ "_id" : "50254", "city" : "THAYER", "loc" : [ -94.068639, 41.00293 ], "pop" : 453, "state" : "IA" } +{ "_id" : "50256", "city" : "TRACY", "loc" : [ -92.875337, 41.275564 ], "pop" : 256, "state" : "IA" } +{ "_id" : "50257", "city" : "TRURO", "loc" : [ -93.84097800000001, 41.207622 ], "pop" : 767, "state" : "IA" } +{ "_id" : "50258", "city" : "UNION", "loc" : [ -93.056192, 42.252074 ], "pop" : 937, "state" : "IA" } +{ "_id" : "50261", "city" : "VAN METER", "loc" : [ -93.95303, 41.539415 ], "pop" : 1780, "state" : "IA" } +{ "_id" : "50262", "city" : "VAN WERT", "loc" : [ -93.80732999999999, 40.864451 ], "pop" : 431, "state" : "IA" } +{ "_id" : "50263", "city" : "WAUKEE", "loc" : [ -93.85916, 41.592959 ], "pop" : 4933, "state" : "IA" } +{ "_id" : "50264", "city" : "WELDON", "loc" : [ -93.738743, 40.873906 ], "pop" : 388, "state" : "IA" } +{ "_id" : "50265", "city" : "WEST DES MOINES", "loc" : [ -93.744711, 41.580512 ], "pop" : 31896, "state" : "IA" } +{ "_id" : "50268", "city" : "WHAT CHEER", "loc" : [ -92.354789, 41.395276 ], "pop" : 1108, "state" : "IA" } +{ "_id" : "50271", "city" : "WILLIAMS", "loc" : [ -93.56774, 42.461376 ], "pop" : 1036, "state" : "IA" } +{ "_id" : "50272", "city" : "WILLIAMSON", "loc" : [ -93.26593, 41.102026 ], "pop" : 505, "state" : "IA" } +{ "_id" : "50273", "city" : "WINTERSET", "loc" : [ -94.008763, 41.339077 ], "pop" : 7254, "state" : "IA" } +{ "_id" : "50274", "city" : "WIOTA", "loc" : [ -94.840515, 41.384552 ], "pop" : 596, "state" : "IA" } +{ "_id" : "50275", "city" : "WOODBURN", "loc" : [ -93.608282, 41.00001 ], "pop" : 677, "state" : "IA" } +{ "_id" : "50276", "city" : "WOODWARD", "loc" : [ -93.90561700000001, 41.845219 ], "pop" : 1749, "state" : "IA" } +{ "_id" : "50277", "city" : "YALE", "loc" : [ -94.35026000000001, 41.775309 ], "pop" : 414, "state" : "IA" } +{ "_id" : "50278", "city" : "ZEARING", "loc" : [ -93.292766, 42.15349 ], "pop" : 1032, "state" : "IA" } +{ "_id" : "50309", "city" : "DES MOINES", "loc" : [ -93.62117499999999, 41.588743 ], "pop" : 4879, "state" : "IA" } +{ "_id" : "50310", "city" : "DES MOINES", "loc" : [ -93.67361099999999, 41.625475 ], "pop" : 30498, "state" : "IA" } +{ "_id" : "50311", "city" : "WINDSOR HEIGHTS", "loc" : [ -93.67437099999999, 41.601562 ], "pop" : 19816, "state" : "IA" } +{ "_id" : "50312", "city" : "DES MOINES", "loc" : [ -93.671908, 41.585453 ], "pop" : 16424, "state" : "IA" } +{ "_id" : "50313", "city" : "DES MOINES", "loc" : [ -93.620305, 41.638085 ], "pop" : 16175, "state" : "IA" } +{ "_id" : "50314", "city" : "DES MOINES", "loc" : [ -93.632993, 41.603003 ], "pop" : 11709, "state" : "IA" } +{ "_id" : "50315", "city" : "DES MOINES", "loc" : [ -93.619226, 41.544394 ], "pop" : 36434, "state" : "IA" } +{ "_id" : "50316", "city" : "DES MOINES", "loc" : [ -93.59996599999999, 41.609228 ], "pop" : 16359, "state" : "IA" } +{ "_id" : "50317", "city" : "PLEASANT HILL", "loc" : [ -93.549446, 41.612499 ], "pop" : 39883, "state" : "IA" } +{ "_id" : "50320", "city" : "DES MOINES", "loc" : [ -93.582674, 41.548693 ], "pop" : 8444, "state" : "IA" } +{ "_id" : "50321", "city" : "DES MOINES", "loc" : [ -93.661846, 41.547628 ], "pop" : 7233, "state" : "IA" } +{ "_id" : "50322", "city" : "URBANDALE", "loc" : [ -93.72304200000001, 41.629479 ], "pop" : 28512, "state" : "IA" } +{ "_id" : "50325", "city" : "CLIVE", "loc" : [ -93.745749, 41.606729 ], "pop" : 7293, "state" : "IA" } +{ "_id" : "50401", "city" : "MASON CITY", "loc" : [ -93.195379, 43.149869 ], "pop" : 31168, "state" : "IA" } +{ "_id" : "50420", "city" : "ALEXANDER", "loc" : [ -93.44499999999999, 42.811395 ], "pop" : 664, "state" : "IA" } +{ "_id" : "50421", "city" : "BELMOND", "loc" : [ -93.620012, 42.851137 ], "pop" : 3306, "state" : "IA" } +{ "_id" : "50423", "city" : "BRITT", "loc" : [ -93.775175, 43.100582 ], "pop" : 3988, "state" : "IA" } +{ "_id" : "50424", "city" : "BUFFALO CENTER", "loc" : [ -93.937557, 43.373204 ], "pop" : 1566, "state" : "IA" } +{ "_id" : "50428", "city" : "CLEAR LAKE", "loc" : [ -93.384978, 43.140607 ], "pop" : 10056, "state" : "IA" } +{ "_id" : "50430", "city" : "CORWITH", "loc" : [ -93.932303, 42.992736 ], "pop" : 737, "state" : "IA" } +{ "_id" : "50432", "city" : "CRYSTAL LAKE", "loc" : [ -93.794166, 43.218692 ], "pop" : 543, "state" : "IA" } +{ "_id" : "50433", "city" : "DOUGHERTY", "loc" : [ -93.068586, 42.941633 ], "pop" : 308, "state" : "IA" } +{ "_id" : "50434", "city" : "FERTILE", "loc" : [ -93.434485, 43.279514 ], "pop" : 766, "state" : "IA" } +{ "_id" : "50435", "city" : "FLOYD", "loc" : [ -92.72398800000001, 43.143049 ], "pop" : 1273, "state" : "IA" } +{ "_id" : "50436", "city" : "FOREST CITY", "loc" : [ -93.635595, 43.269184 ], "pop" : 6010, "state" : "IA" } +{ "_id" : "50438", "city" : "GARNER", "loc" : [ -93.59439399999999, 43.114395 ], "pop" : 3756, "state" : "IA" } +{ "_id" : "50439", "city" : "GOODELL", "loc" : [ -93.582426, 42.938298 ], "pop" : 452, "state" : "IA" } +{ "_id" : "50440", "city" : "GRAFTON", "loc" : [ -93.079718, 43.311016 ], "pop" : 630, "state" : "IA" } +{ "_id" : "50441", "city" : "HAMPTON", "loc" : [ -93.210954, 42.740531 ], "pop" : 5313, "state" : "IA" } +{ "_id" : "50444", "city" : "HANLONTOWN", "loc" : [ -93.335065, 43.307234 ], "pop" : 605, "state" : "IA" } +{ "_id" : "50446", "city" : "JOICE", "loc" : [ -93.44535399999999, 43.376105 ], "pop" : 522, "state" : "IA" } +{ "_id" : "50447", "city" : "KANAWHA", "loc" : [ -93.772801, 42.94338 ], "pop" : 1181, "state" : "IA" } +{ "_id" : "50448", "city" : "KENSETT", "loc" : [ -93.172805, 43.37391 ], "pop" : 729, "state" : "IA" } +{ "_id" : "50449", "city" : "KLEMME", "loc" : [ -93.58794399999999, 43.013643 ], "pop" : 849, "state" : "IA" } +{ "_id" : "50450", "city" : "LAKE MILLS", "loc" : [ -93.53362799999999, 43.416696 ], "pop" : 2801, "state" : "IA" } +{ "_id" : "50451", "city" : "LAKOTA", "loc" : [ -94.07055, 43.395283 ], "pop" : 789, "state" : "IA" } +{ "_id" : "50452", "city" : "LATIMER", "loc" : [ -93.351798, 42.759783 ], "pop" : 966, "state" : "IA" } +{ "_id" : "50453", "city" : "LELAND", "loc" : [ -93.751496, 43.307043 ], "pop" : 333, "state" : "IA" } +{ "_id" : "50454", "city" : "LITTLE CEDAR", "loc" : [ -92.734376, 43.391861 ], "pop" : 248, "state" : "IA" } +{ "_id" : "50455", "city" : "MC INTIRE", "loc" : [ -92.60485, 43.44999 ], "pop" : 382, "state" : "IA" } +{ "_id" : "50456", "city" : "MANLY", "loc" : [ -93.201802, 43.289116 ], "pop" : 1757, "state" : "IA" } +{ "_id" : "50457", "city" : "MESERVEY", "loc" : [ -93.477298, 42.913696 ], "pop" : 298, "state" : "IA" } +{ "_id" : "50458", "city" : "NORA SPRINGS", "loc" : [ -93.000221, 43.147858 ], "pop" : 1849, "state" : "IA" } +{ "_id" : "50459", "city" : "NORTHWOOD", "loc" : [ -93.24194300000001, 43.450604 ], "pop" : 2982, "state" : "IA" } +{ "_id" : "50460", "city" : "ORCHARD", "loc" : [ -92.719979, 43.235459 ], "pop" : 442, "state" : "IA" } +{ "_id" : "50461", "city" : "OSAGE", "loc" : [ -92.814356, 43.28722 ], "pop" : 5790, "state" : "IA" } +{ "_id" : "50464", "city" : "PLYMOUTH", "loc" : [ -93.12262800000001, 43.246046 ], "pop" : 453, "state" : "IA" } +{ "_id" : "50465", "city" : "RAKE", "loc" : [ -93.91712800000001, 43.476655 ], "pop" : 435, "state" : "IA" } +{ "_id" : "50466", "city" : "RICEVILLE", "loc" : [ -92.55537200000001, 43.371899 ], "pop" : 1546, "state" : "IA" } +{ "_id" : "50467", "city" : "ROCK FALLS", "loc" : [ -93.076402, 43.198014 ], "pop" : 306, "state" : "IA" } +{ "_id" : "50468", "city" : "ROCKFORD", "loc" : [ -92.952034, 43.057331 ], "pop" : 1258, "state" : "IA" } +{ "_id" : "50469", "city" : "ROCKWELL", "loc" : [ -93.21673699999999, 43.003167 ], "pop" : 2009, "state" : "IA" } +{ "_id" : "50470", "city" : "ROWAN", "loc" : [ -93.556966, 42.759644 ], "pop" : 405, "state" : "IA" } +{ "_id" : "50471", "city" : "RUDD", "loc" : [ -92.88854600000001, 43.141958 ], "pop" : 688, "state" : "IA" } +{ "_id" : "50472", "city" : "SAINT ANSGAR", "loc" : [ -92.923523, 43.406107 ], "pop" : 2401, "state" : "IA" } +{ "_id" : "50473", "city" : "SCARVILLE", "loc" : [ -93.64233, 43.467286 ], "pop" : 420, "state" : "IA" } +{ "_id" : "50475", "city" : "SHEFFIELD", "loc" : [ -93.215583, 42.877881 ], "pop" : 1988, "state" : "IA" } +{ "_id" : "50476", "city" : "STACYVILLE", "loc" : [ -92.761031, 43.445687 ], "pop" : 798, "state" : "IA" } +{ "_id" : "50477", "city" : "SWALEDALE", "loc" : [ -93.31152899999999, 42.962167 ], "pop" : 414, "state" : "IA" } +{ "_id" : "50478", "city" : "THOMPSON", "loc" : [ -93.751671, 43.387497 ], "pop" : 1178, "state" : "IA" } +{ "_id" : "50479", "city" : "THORNTON", "loc" : [ -93.408787, 42.968405 ], "pop" : 905, "state" : "IA" } +{ "_id" : "50480", "city" : "TITONKA", "loc" : [ -94.03665599999999, 43.245606 ], "pop" : 1159, "state" : "IA" } +{ "_id" : "50482", "city" : "VENTURA", "loc" : [ -93.4706, 43.126178 ], "pop" : 816, "state" : "IA" } +{ "_id" : "50483", "city" : "WESLEY", "loc" : [ -94.003776, 43.09765 ], "pop" : 647, "state" : "IA" } +{ "_id" : "50484", "city" : "WODEN", "loc" : [ -93.91092500000001, 43.222564 ], "pop" : 511, "state" : "IA" } +{ "_id" : "50501", "city" : "FORT DODGE", "loc" : [ -94.18073699999999, 42.508817 ], "pop" : 27632, "state" : "IA" } +{ "_id" : "50510", "city" : "ALBERT CITY", "loc" : [ -94.98238000000001, 42.778403 ], "pop" : 1293, "state" : "IA" } +{ "_id" : "50511", "city" : "ALGONA", "loc" : [ -94.230638, 43.065976 ], "pop" : 7829, "state" : "IA" } +{ "_id" : "50514", "city" : "ARMSTRONG", "loc" : [ -94.485305, 43.402423 ], "pop" : 1464, "state" : "IA" } +{ "_id" : "50515", "city" : "AYRSHIRE", "loc" : [ -94.847804, 43.037001 ], "pop" : 413, "state" : "IA" } +{ "_id" : "50516", "city" : "BADGER", "loc" : [ -94.162988, 42.599595 ], "pop" : 1270, "state" : "IA" } +{ "_id" : "50517", "city" : "BANCROFT", "loc" : [ -94.210778, 43.293485 ], "pop" : 1346, "state" : "IA" } +{ "_id" : "50518", "city" : "BARNUM", "loc" : [ -94.370327, 42.515867 ], "pop" : 481, "state" : "IA" } +{ "_id" : "50519", "city" : "BODE", "loc" : [ -94.27805499999999, 42.866078 ], "pop" : 555, "state" : "IA" } +{ "_id" : "50520", "city" : "BRADGATE", "loc" : [ -94.400239, 42.779425 ], "pop" : 359, "state" : "IA" } +{ "_id" : "50521", "city" : "BURNSIDE", "loc" : [ -94.11425300000001, 42.341318 ], "pop" : 355, "state" : "IA" } +{ "_id" : "50522", "city" : "BURT", "loc" : [ -94.21223000000001, 43.206167 ], "pop" : 1069, "state" : "IA" } +{ "_id" : "50523", "city" : "CALLENDER", "loc" : [ -94.281963, 42.349372 ], "pop" : 1009, "state" : "IA" } +{ "_id" : "50524", "city" : "CLARE", "loc" : [ -94.30802799999999, 42.595397 ], "pop" : 821, "state" : "IA" } +{ "_id" : "50525", "city" : "CLARION", "loc" : [ -93.727715, 42.727149 ], "pop" : 3849, "state" : "IA" } +{ "_id" : "50527", "city" : "CURLEW", "loc" : [ -94.797528, 42.963321 ], "pop" : 278, "state" : "IA" } +{ "_id" : "50528", "city" : "CYLINDER", "loc" : [ -94.510672, 43.150716 ], "pop" : 536, "state" : "IA" } +{ "_id" : "50530", "city" : "DAYTON", "loc" : [ -94.06104999999999, 42.259438 ], "pop" : 1366, "state" : "IA" } +{ "_id" : "50531", "city" : "DOLLIVER", "loc" : [ -94.624236, 43.466382 ], "pop" : 260, "state" : "IA" } +{ "_id" : "50532", "city" : "DUNCOMBE", "loc" : [ -94.059212, 42.449303 ], "pop" : 1561, "state" : "IA" } +{ "_id" : "50533", "city" : "EAGLE GROVE", "loc" : [ -93.904872, 42.660867 ], "pop" : 4109, "state" : "IA" } +{ "_id" : "50535", "city" : "EARLY", "loc" : [ -95.172569, 42.448258 ], "pop" : 1195, "state" : "IA" } +{ "_id" : "50536", "city" : "EMMETSBURG", "loc" : [ -94.682545, 43.108249 ], "pop" : 4794, "state" : "IA" } +{ "_id" : "50538", "city" : "FARNHAMVILLE", "loc" : [ -94.422623, 42.269234 ], "pop" : 631, "state" : "IA" } +{ "_id" : "50539", "city" : "FENTON", "loc" : [ -94.404366, 43.242047 ], "pop" : 779, "state" : "IA" } +{ "_id" : "50540", "city" : "FONDA", "loc" : [ -94.82974, 42.605148 ], "pop" : 1438, "state" : "IA" } +{ "_id" : "50541", "city" : "GILMORE CITY", "loc" : [ -94.41082400000001, 42.706691 ], "pop" : 604, "state" : "IA" } +{ "_id" : "50542", "city" : "GOLDFIELD", "loc" : [ -93.91943499999999, 42.758055 ], "pop" : 1148, "state" : "IA" } +{ "_id" : "50543", "city" : "GOWRIE", "loc" : [ -94.298669, 42.276712 ], "pop" : 1225, "state" : "IA" } +{ "_id" : "50544", "city" : "HARCOURT", "loc" : [ -94.196095, 42.253052 ], "pop" : 631, "state" : "IA" } +{ "_id" : "50545", "city" : "HARDY", "loc" : [ -94.030852, 42.782247 ], "pop" : 262, "state" : "IA" } +{ "_id" : "50546", "city" : "HAVELOCK", "loc" : [ -94.725233, 42.84109 ], "pop" : 586, "state" : "IA" } +{ "_id" : "50548", "city" : "HUMBOLDT", "loc" : [ -94.213184, 42.719574 ], "pop" : 6493, "state" : "IA" } +{ "_id" : "50551", "city" : "JOLLEY", "loc" : [ -94.742338, 42.507785 ], "pop" : 296, "state" : "IA" } +{ "_id" : "50552", "city" : "KNIERIM", "loc" : [ -94.453153, 42.431944 ], "pop" : 295, "state" : "IA" } +{ "_id" : "50553", "city" : "KNOKE", "loc" : [ -94.85437, 42.520515 ], "pop" : 192, "state" : "IA" } +{ "_id" : "50554", "city" : "LAURENS", "loc" : [ -94.85081599999999, 42.840938 ], "pop" : 2055, "state" : "IA" } +{ "_id" : "50556", "city" : "LEDYARD", "loc" : [ -94.15028100000001, 43.434569 ], "pop" : 384, "state" : "IA" } +{ "_id" : "50557", "city" : "LEHIGH", "loc" : [ -94.03415800000001, 42.352645 ], "pop" : 821, "state" : "IA" } +{ "_id" : "50558", "city" : "LIVERMORE", "loc" : [ -94.174716, 42.866601 ], "pop" : 645, "state" : "IA" } +{ "_id" : "50559", "city" : "LONE ROCK", "loc" : [ -94.35857799999999, 43.166645 ], "pop" : 560, "state" : "IA" } +{ "_id" : "50560", "city" : "LU VERNE", "loc" : [ -94.095912, 42.98684 ], "pop" : 1337, "state" : "IA" } +{ "_id" : "50561", "city" : "LYTTON", "loc" : [ -94.813991, 42.430375 ], "pop" : 235, "state" : "IA" } +{ "_id" : "50562", "city" : "MALLARD", "loc" : [ -94.67460800000001, 42.94167 ], "pop" : 721, "state" : "IA" } +{ "_id" : "50563", "city" : "MANSON", "loc" : [ -94.53038599999999, 42.528503 ], "pop" : 2131, "state" : "IA" } +{ "_id" : "50565", "city" : "MARATHON", "loc" : [ -94.98355100000001, 42.861233 ], "pop" : 564, "state" : "IA" } +{ "_id" : "50566", "city" : "MOORLAND", "loc" : [ -94.319886, 42.434005 ], "pop" : 541, "state" : "IA" } +{ "_id" : "50567", "city" : "NEMAHA", "loc" : [ -95.093914, 42.518027 ], "pop" : 356, "state" : "IA" } +{ "_id" : "50568", "city" : "NEWELL", "loc" : [ -94.994591, 42.615699 ], "pop" : 1668, "state" : "IA" } +{ "_id" : "50569", "city" : "OTHO", "loc" : [ -94.170776, 42.432825 ], "pop" : 1910, "state" : "IA" } +{ "_id" : "50570", "city" : "OTTOSEN", "loc" : [ -94.378648, 42.876443 ], "pop" : 301, "state" : "IA" } +{ "_id" : "50571", "city" : "PALMER", "loc" : [ -94.543155, 42.641871 ], "pop" : 1119, "state" : "IA" } +{ "_id" : "50573", "city" : "PLOVER", "loc" : [ -94.622507, 42.869107 ], "pop" : 275, "state" : "IA" } +{ "_id" : "50574", "city" : "POCAHONTAS", "loc" : [ -94.673675, 42.729602 ], "pop" : 2802, "state" : "IA" } +{ "_id" : "50575", "city" : "POMEROY", "loc" : [ -94.663758, 42.532565 ], "pop" : 1197, "state" : "IA" } +{ "_id" : "50576", "city" : "REMBRANDT", "loc" : [ -95.165178, 42.826034 ], "pop" : 236, "state" : "IA" } +{ "_id" : "50577", "city" : "RENWICK", "loc" : [ -94.007437, 42.849132 ], "pop" : 545, "state" : "IA" } +{ "_id" : "50578", "city" : "RINGSTED", "loc" : [ -94.52913700000001, 43.297654 ], "pop" : 860, "state" : "IA" } +{ "_id" : "50579", "city" : "ROCKWELL CITY", "loc" : [ -94.62921900000001, 42.396126 ], "pop" : 2952, "state" : "IA" } +{ "_id" : "50580", "city" : "RODMAN", "loc" : [ -94.49924300000001, 43.035233 ], "pop" : 286, "state" : "IA" } +{ "_id" : "50581", "city" : "ROLFE", "loc" : [ -94.516593, 42.808233 ], "pop" : 1250, "state" : "IA" } +{ "_id" : "50582", "city" : "RUTLAND", "loc" : [ -94.27188200000001, 42.763486 ], "pop" : 529, "state" : "IA" } +{ "_id" : "50583", "city" : "SAC CITY", "loc" : [ -94.979552, 42.426212 ], "pop" : 3531, "state" : "IA" } +{ "_id" : "50585", "city" : "SIOUX RAPIDS", "loc" : [ -95.138836, 42.906472 ], "pop" : 1542, "state" : "IA" } +{ "_id" : "50586", "city" : "SOMERS", "loc" : [ -94.44638999999999, 42.356065 ], "pop" : 425, "state" : "IA" } +{ "_id" : "50588", "city" : "STORM LAKE", "loc" : [ -95.196079, 42.64738 ], "pop" : 11663, "state" : "IA" } +{ "_id" : "50590", "city" : "SWEA CITY", "loc" : [ -94.319322, 43.402225 ], "pop" : 1440, "state" : "IA" } +{ "_id" : "50591", "city" : "THOR", "loc" : [ -94.03895799999999, 42.688923 ], "pop" : 463, "state" : "IA" } +{ "_id" : "50594", "city" : "VINCENT", "loc" : [ -94.033534, 42.562292 ], "pop" : 719, "state" : "IA" } +{ "_id" : "50595", "city" : "WEBSTER CITY", "loc" : [ -93.826216, 42.465682 ], "pop" : 9130, "state" : "IA" } +{ "_id" : "50597", "city" : "WEST BEND", "loc" : [ -94.456402, 42.957415 ], "pop" : 1099, "state" : "IA" } +{ "_id" : "50598", "city" : "WHITTEMORE", "loc" : [ -94.406395, 43.02608 ], "pop" : 1252, "state" : "IA" } +{ "_id" : "50599", "city" : "WOOLSTOCK", "loc" : [ -93.82161000000001, 42.584439 ], "pop" : 394, "state" : "IA" } +{ "_id" : "50601", "city" : "ACKLEY", "loc" : [ -93.060835, 42.552722 ], "pop" : 2316, "state" : "IA" } +{ "_id" : "50602", "city" : "ALLISON", "loc" : [ -92.78295199999999, 42.761465 ], "pop" : 1458, "state" : "IA" } +{ "_id" : "50603", "city" : "ALTA VISTA", "loc" : [ -92.423682, 43.148159 ], "pop" : 1356, "state" : "IA" } +{ "_id" : "50604", "city" : "APLINGTON", "loc" : [ -92.875141, 42.587039 ], "pop" : 1436, "state" : "IA" } +{ "_id" : "50605", "city" : "AREDALE", "loc" : [ -92.97687999999999, 42.854852 ], "pop" : 317, "state" : "IA" } +{ "_id" : "50606", "city" : "ARLINGTON", "loc" : [ -91.666814, 42.733827 ], "pop" : 1124, "state" : "IA" } +{ "_id" : "50607", "city" : "AURORA", "loc" : [ -91.733469, 42.620317 ], "pop" : 344, "state" : "IA" } +{ "_id" : "50608", "city" : "AUSTINVILLE", "loc" : [ -92.959422, 42.596245 ], "pop" : 363, "state" : "IA" } +{ "_id" : "50609", "city" : "BEAMAN", "loc" : [ -92.816215, 42.236707 ], "pop" : 395, "state" : "IA" } +{ "_id" : "50611", "city" : "BRISTOW", "loc" : [ -92.88642400000001, 42.774106 ], "pop" : 465, "state" : "IA" } +{ "_id" : "50612", "city" : "BUCKINGHAM", "loc" : [ -92.40978800000001, 42.255211 ], "pop" : 694, "state" : "IA" } +{ "_id" : "50613", "city" : "CEDAR FALLS", "loc" : [ -92.449725, 42.524071 ], "pop" : 36084, "state" : "IA" } +{ "_id" : "50616", "city" : "CHARLES CITY", "loc" : [ -92.676062, 43.068327 ], "pop" : 10110, "state" : "IA" } +{ "_id" : "50619", "city" : "CLARKSVILLE", "loc" : [ -92.658833, 42.804079 ], "pop" : 2757, "state" : "IA" } +{ "_id" : "50621", "city" : "CONRAD", "loc" : [ -92.88652500000001, 42.234188 ], "pop" : 1346, "state" : "IA" } +{ "_id" : "50622", "city" : "DENVER", "loc" : [ -92.341701, 42.673137 ], "pop" : 2543, "state" : "IA" } +{ "_id" : "50624", "city" : "DIKE", "loc" : [ -92.612154, 42.47301 ], "pop" : 1860, "state" : "IA" } +{ "_id" : "50625", "city" : "DUMONT", "loc" : [ -92.967347, 42.736773 ], "pop" : 1302, "state" : "IA" } +{ "_id" : "50626", "city" : "DUNKERTON", "loc" : [ -92.158826, 42.578028 ], "pop" : 1676, "state" : "IA" } +{ "_id" : "50627", "city" : "ELDORA", "loc" : [ -93.10369900000001, 42.357158 ], "pop" : 3689, "state" : "IA" } +{ "_id" : "50628", "city" : "ELMA", "loc" : [ -92.398066, 43.27855 ], "pop" : 2102, "state" : "IA" } +{ "_id" : "50629", "city" : "FAIRBANK", "loc" : [ -92.032589, 42.616235 ], "pop" : 1770, "state" : "IA" } +{ "_id" : "50630", "city" : "FREDERICKSBURG", "loc" : [ -92.198334, 42.959299 ], "pop" : 1830, "state" : "IA" } +{ "_id" : "50632", "city" : "GARWIN", "loc" : [ -92.68935, 42.087228 ], "pop" : 869, "state" : "IA" } +{ "_id" : "50633", "city" : "GENEVA", "loc" : [ -93.103793, 42.68044 ], "pop" : 382, "state" : "IA" } +{ "_id" : "50635", "city" : "GLADBROOK", "loc" : [ -92.714112, 42.177432 ], "pop" : 1268, "state" : "IA" } +{ "_id" : "50636", "city" : "GREENE", "loc" : [ -92.758324, 42.91604 ], "pop" : 2480, "state" : "IA" } +{ "_id" : "50638", "city" : "GRUNDY CENTER", "loc" : [ -92.777344, 42.3672 ], "pop" : 4130, "state" : "IA" } +{ "_id" : "50640", "city" : "HANSELL", "loc" : [ -93.090036, 42.771195 ], "pop" : 362, "state" : "IA" } +{ "_id" : "50641", "city" : "HAZLETON", "loc" : [ -91.910462, 42.607561 ], "pop" : 1480, "state" : "IA" } +{ "_id" : "50642", "city" : "HOLLAND", "loc" : [ -92.79988400000001, 42.40114 ], "pop" : 222, "state" : "IA" } +{ "_id" : "50643", "city" : "HUDSON", "loc" : [ -92.45487199999999, 42.390497 ], "pop" : 2641, "state" : "IA" } +{ "_id" : "50644", "city" : "INDEPENDENCE", "loc" : [ -91.880343, 42.46744 ], "pop" : 8466, "state" : "IA" } +{ "_id" : "50645", "city" : "IONIA", "loc" : [ -92.486521, 43.040253 ], "pop" : 869, "state" : "IA" } +{ "_id" : "50647", "city" : "JANESVILLE", "loc" : [ -92.479096, 42.646515 ], "pop" : 2008, "state" : "IA" } +{ "_id" : "50648", "city" : "JESUP", "loc" : [ -92.045625, 42.482329 ], "pop" : 3505, "state" : "IA" } +{ "_id" : "50649", "city" : "KESLEY", "loc" : [ -92.853455, 42.685717 ], "pop" : 301, "state" : "IA" } +{ "_id" : "50650", "city" : "LAMONT", "loc" : [ -91.670078, 42.594552 ], "pop" : 830, "state" : "IA" } +{ "_id" : "50651", "city" : "LA PORTE CITY", "loc" : [ -92.186155, 42.341618 ], "pop" : 3990, "state" : "IA" } +{ "_id" : "50652", "city" : "LINCOLN", "loc" : [ -92.70469300000001, 42.256056 ], "pop" : 433, "state" : "IA" } +{ "_id" : "50653", "city" : "MARBLE ROCK", "loc" : [ -92.89168100000001, 42.964547 ], "pop" : 940, "state" : "IA" } +{ "_id" : "50654", "city" : "MASONVILLE", "loc" : [ -91.55057600000001, 42.50461 ], "pop" : 557, "state" : "IA" } +{ "_id" : "50655", "city" : "MAYNARD", "loc" : [ -91.890773, 42.775156 ], "pop" : 899, "state" : "IA" } +{ "_id" : "50658", "city" : "NASHUA", "loc" : [ -92.529839, 42.952848 ], "pop" : 2007, "state" : "IA" } +{ "_id" : "50659", "city" : "NEW HAMPTON", "loc" : [ -92.313136, 43.056015 ], "pop" : 5783, "state" : "IA" } +{ "_id" : "50660", "city" : "NEW HARTFORD", "loc" : [ -92.616359, 42.583128 ], "pop" : 1362, "state" : "IA" } +{ "_id" : "50662", "city" : "OELWEIN", "loc" : [ -91.913084, 42.681095 ], "pop" : 8426, "state" : "IA" } +{ "_id" : "50665", "city" : "PARKERSBURG", "loc" : [ -92.76876300000001, 42.571377 ], "pop" : 3544, "state" : "IA" } +{ "_id" : "50666", "city" : "PLAINFIELD", "loc" : [ -92.51155799999999, 42.850267 ], "pop" : 1030, "state" : "IA" } +{ "_id" : "50667", "city" : "RAYMOND", "loc" : [ -92.216247, 42.467169 ], "pop" : 367, "state" : "IA" } +{ "_id" : "50668", "city" : "READLYN", "loc" : [ -92.21543200000001, 42.692869 ], "pop" : 1858, "state" : "IA" } +{ "_id" : "50669", "city" : "REINBECK", "loc" : [ -92.59483899999999, 42.313078 ], "pop" : 2099, "state" : "IA" } +{ "_id" : "50670", "city" : "SHELL ROCK", "loc" : [ -92.58878, 42.70611 ], "pop" : 1834, "state" : "IA" } +{ "_id" : "50671", "city" : "STANLEY", "loc" : [ -91.812673, 42.635623 ], "pop" : 175, "state" : "IA" } +{ "_id" : "50672", "city" : "STEAMBOAT ROCK", "loc" : [ -93.06291, 42.417841 ], "pop" : 650, "state" : "IA" } +{ "_id" : "50674", "city" : "SUMNER", "loc" : [ -92.118562, 42.841935 ], "pop" : 3187, "state" : "IA" } +{ "_id" : "50675", "city" : "TRAER", "loc" : [ -92.482681, 42.184685 ], "pop" : 2064, "state" : "IA" } +{ "_id" : "50676", "city" : "TRIPOLI", "loc" : [ -92.265934, 42.810538 ], "pop" : 1993, "state" : "IA" } +{ "_id" : "50677", "city" : "BREMER", "loc" : [ -92.466199, 42.737307 ], "pop" : 10879, "state" : "IA" } +{ "_id" : "50680", "city" : "WELLSBURG", "loc" : [ -92.939763, 42.449418 ], "pop" : 1353, "state" : "IA" } +{ "_id" : "50681", "city" : "WESTGATE", "loc" : [ -92.018299, 42.805453 ], "pop" : 1044, "state" : "IA" } +{ "_id" : "50682", "city" : "WINTHROP", "loc" : [ -91.73146699999999, 42.491163 ], "pop" : 1330, "state" : "IA" } +{ "_id" : "50701", "city" : "WATERLOO", "loc" : [ -92.36609900000001, 42.477784 ], "pop" : 29194, "state" : "IA" } +{ "_id" : "50702", "city" : "WATERLOO", "loc" : [ -92.33648599999999, 42.473112 ], "pop" : 18939, "state" : "IA" } +{ "_id" : "50703", "city" : "WATERLOO", "loc" : [ -92.326919, 42.514875 ], "pop" : 21256, "state" : "IA" } +{ "_id" : "50706", "city" : "WASHBURN", "loc" : [ -92.2676, 42.407605 ], "pop" : 1010, "state" : "IA" } +{ "_id" : "50707", "city" : "EVANSDALE", "loc" : [ -92.281158, 42.475453 ], "pop" : 7954, "state" : "IA" } +{ "_id" : "50801", "city" : "NEVINVILLE", "loc" : [ -94.369151, 41.062384 ], "pop" : 9548, "state" : "IA" } +{ "_id" : "50830", "city" : "AFTON", "loc" : [ -94.19404400000001, 41.040146 ], "pop" : 1450, "state" : "IA" } +{ "_id" : "50833", "city" : "BEDFORD", "loc" : [ -94.73244800000001, 40.66829 ], "pop" : 2608, "state" : "IA" } +{ "_id" : "50835", "city" : "BENTON", "loc" : [ -94.39310399999999, 40.725836 ], "pop" : 203, "state" : "IA" } +{ "_id" : "50836", "city" : "BLOCKTON", "loc" : [ -94.504901, 40.624242 ], "pop" : 476, "state" : "IA" } +{ "_id" : "50837", "city" : "BRIDGEWATER", "loc" : [ -94.64101100000001, 41.157084 ], "pop" : 1383, "state" : "IA" } +{ "_id" : "50840", "city" : "CLEARFIELD", "loc" : [ -94.494439, 40.793534 ], "pop" : 593, "state" : "IA" } +{ "_id" : "50841", "city" : "CORNING", "loc" : [ -94.735789, 40.987121 ], "pop" : 2660, "state" : "IA" } +{ "_id" : "50843", "city" : "CUMBERLAND", "loc" : [ -94.87100599999999, 41.263165 ], "pop" : 695, "state" : "IA" } +{ "_id" : "50844", "city" : "DELPHOS", "loc" : [ -94.316188, 40.661959 ], "pop" : 100, "state" : "IA" } +{ "_id" : "50845", "city" : "DIAGONAL", "loc" : [ -94.35515599999999, 40.822644 ], "pop" : 793, "state" : "IA" } +{ "_id" : "50846", "city" : "FONTANELLE", "loc" : [ -94.541904, 41.289568 ], "pop" : 1534, "state" : "IA" } +{ "_id" : "50847", "city" : "GRANT", "loc" : [ -94.984554, 41.125799 ], "pop" : 315, "state" : "IA" } +{ "_id" : "50848", "city" : "GRAVITY", "loc" : [ -94.750595, 40.790914 ], "pop" : 617, "state" : "IA" } +{ "_id" : "50849", "city" : "GREENFIELD", "loc" : [ -94.440757, 41.313311 ], "pop" : 2772, "state" : "IA" } +{ "_id" : "50850", "city" : "KENT", "loc" : [ -94.421718, 40.944856 ], "pop" : 309, "state" : "IA" } +{ "_id" : "50851", "city" : "LENOX", "loc" : [ -94.56117, 40.884096 ], "pop" : 1973, "state" : "IA" } +{ "_id" : "50852", "city" : "MALOY", "loc" : [ -94.40764, 40.673648 ], "pop" : 81, "state" : "IA" } +{ "_id" : "50853", "city" : "MASSENA", "loc" : [ -94.764872, 41.249867 ], "pop" : 794, "state" : "IA" } +{ "_id" : "50854", "city" : "MOUNT AYR", "loc" : [ -94.232146, 40.7142 ], "pop" : 2487, "state" : "IA" } +{ "_id" : "50857", "city" : "NODAWAY", "loc" : [ -94.87309, 40.954034 ], "pop" : 706, "state" : "IA" } +{ "_id" : "50858", "city" : "ORIENT", "loc" : [ -94.370496, 41.219191 ], "pop" : 1042, "state" : "IA" } +{ "_id" : "50859", "city" : "PRESCOTT", "loc" : [ -94.524901, 41.024848 ], "pop" : 205, "state" : "IA" } +{ "_id" : "50860", "city" : "REDDING", "loc" : [ -94.35945100000001, 40.605312 ], "pop" : 327, "state" : "IA" } +{ "_id" : "50861", "city" : "SHANNON CITY", "loc" : [ -94.250106, 40.936636 ], "pop" : 586, "state" : "IA" } +{ "_id" : "50862", "city" : "SHARPSBURG", "loc" : [ -94.641633, 40.795042 ], "pop" : 199, "state" : "IA" } +{ "_id" : "50863", "city" : "TINGLEY", "loc" : [ -94.19082299999999, 40.851597 ], "pop" : 347, "state" : "IA" } +{ "_id" : "50864", "city" : "VILLISCA", "loc" : [ -94.97958800000001, 40.943718 ], "pop" : 1794, "state" : "IA" } +{ "_id" : "51001", "city" : "AKRON", "loc" : [ -96.52245000000001, 42.835392 ], "pop" : 2068, "state" : "IA" } +{ "_id" : "51002", "city" : "ALTA", "loc" : [ -95.3129, 42.677118 ], "pop" : 2757, "state" : "IA" } +{ "_id" : "51003", "city" : "ALTON", "loc" : [ -96.017268, 42.978175 ], "pop" : 1371, "state" : "IA" } +{ "_id" : "51004", "city" : "ANTHON", "loc" : [ -95.89476500000001, 42.386967 ], "pop" : 1550, "state" : "IA" } +{ "_id" : "51005", "city" : "AURELIA", "loc" : [ -95.438086, 42.69122 ], "pop" : 1543, "state" : "IA" } +{ "_id" : "51006", "city" : "BATTLE CREEK", "loc" : [ -95.604517, 42.332662 ], "pop" : 1552, "state" : "IA" } +{ "_id" : "51007", "city" : "BRONSON", "loc" : [ -96.19859099999999, 42.429181 ], "pop" : 796, "state" : "IA" } +{ "_id" : "51009", "city" : "CALUMET", "loc" : [ -95.55487100000001, 42.953272 ], "pop" : 431, "state" : "IA" } +{ "_id" : "51010", "city" : "CASTANA", "loc" : [ -95.943121, 42.105404 ], "pop" : 533, "state" : "IA" } +{ "_id" : "51012", "city" : "CHEROKEE", "loc" : [ -95.556842, 42.748187 ], "pop" : 8339, "state" : "IA" } +{ "_id" : "51014", "city" : "CLEGHORN", "loc" : [ -95.712436, 42.808593 ], "pop" : 541, "state" : "IA" } +{ "_id" : "51016", "city" : "CORRECTIONVILLE", "loc" : [ -95.780382, 42.474322 ], "pop" : 1432, "state" : "IA" } +{ "_id" : "51018", "city" : "CUSHING", "loc" : [ -95.67748, 42.464182 ], "pop" : 261, "state" : "IA" } +{ "_id" : "51019", "city" : "DANBURY", "loc" : [ -95.726259, 42.269337 ], "pop" : 906, "state" : "IA" } +{ "_id" : "51020", "city" : "GALVA", "loc" : [ -95.429838, 42.510508 ], "pop" : 626, "state" : "IA" } +{ "_id" : "51022", "city" : "GRANVILLE", "loc" : [ -95.897167, 42.969252 ], "pop" : 592, "state" : "IA" } +{ "_id" : "51023", "city" : "HAWARDEN", "loc" : [ -96.472992, 43.001333 ], "pop" : 3097, "state" : "IA" } +{ "_id" : "51024", "city" : "HINTON", "loc" : [ -96.30503299999999, 42.604046 ], "pop" : 2449, "state" : "IA" } +{ "_id" : "51025", "city" : "HOLSTEIN", "loc" : [ -95.564971, 42.494779 ], "pop" : 1977, "state" : "IA" } +{ "_id" : "51026", "city" : "HORNICK", "loc" : [ -96.079553, 42.289741 ], "pop" : 894, "state" : "IA" } +{ "_id" : "51027", "city" : "IRETON", "loc" : [ -96.32322600000001, 42.966566 ], "pop" : 1154, "state" : "IA" } +{ "_id" : "51028", "city" : "KINGSLEY", "loc" : [ -95.976151, 42.619057 ], "pop" : 2138, "state" : "IA" } +{ "_id" : "51029", "city" : "LARRABEE", "loc" : [ -95.581228, 42.862758 ], "pop" : 607, "state" : "IA" } +{ "_id" : "51030", "city" : "LAWTON", "loc" : [ -96.21893, 42.504748 ], "pop" : 1481, "state" : "IA" } +{ "_id" : "51031", "city" : "LE MARS", "loc" : [ -96.17038599999999, 42.79623 ], "pop" : 11576, "state" : "IA" } +{ "_id" : "51033", "city" : "LINN GROVE", "loc" : [ -95.251249, 42.874229 ], "pop" : 722, "state" : "IA" } +{ "_id" : "51034", "city" : "MAPLETON", "loc" : [ -95.79093399999999, 42.158524 ], "pop" : 2038, "state" : "IA" } +{ "_id" : "51035", "city" : "MARCUS", "loc" : [ -95.803431, 42.819959 ], "pop" : 1654, "state" : "IA" } +{ "_id" : "51036", "city" : "MAURICE", "loc" : [ -96.165531, 42.962647 ], "pop" : 625, "state" : "IA" } +{ "_id" : "51037", "city" : "MERIDEN", "loc" : [ -95.64079700000001, 42.787416 ], "pop" : 333, "state" : "IA" } +{ "_id" : "51038", "city" : "MERRILL", "loc" : [ -96.228324, 42.704737 ], "pop" : 1468, "state" : "IA" } +{ "_id" : "51039", "city" : "MOVILLE", "loc" : [ -96.065583, 42.481924 ], "pop" : 2064, "state" : "IA" } +{ "_id" : "51040", "city" : "ONAWA", "loc" : [ -96.107213, 42.036967 ], "pop" : 3867, "state" : "IA" } +{ "_id" : "51041", "city" : "ORANGE CITY", "loc" : [ -96.05646400000001, 43.01849 ], "pop" : 6126, "state" : "IA" } +{ "_id" : "51044", "city" : "OTO", "loc" : [ -95.861575, 42.264592 ], "pop" : 340, "state" : "IA" } +{ "_id" : "51046", "city" : "PAULLINA", "loc" : [ -95.708322, 42.970277 ], "pop" : 1760, "state" : "IA" } +{ "_id" : "51047", "city" : "PETERSON", "loc" : [ -95.337658, 42.932794 ], "pop" : 640, "state" : "IA" } +{ "_id" : "51048", "city" : "PIERSON", "loc" : [ -95.89219300000001, 42.533493 ], "pop" : 642, "state" : "IA" } +{ "_id" : "51049", "city" : "QUIMBY", "loc" : [ -95.681175, 42.628711 ], "pop" : 562, "state" : "IA" } +{ "_id" : "51050", "city" : "REMSEN", "loc" : [ -95.95437800000001, 42.8149 ], "pop" : 2254, "state" : "IA" } +{ "_id" : "51051", "city" : "RODNEY", "loc" : [ -95.953456, 42.201541 ], "pop" : 120, "state" : "IA" } +{ "_id" : "51052", "city" : "SALIX", "loc" : [ -96.28791200000001, 42.330554 ], "pop" : 1210, "state" : "IA" } +{ "_id" : "51053", "city" : "SCHALLER", "loc" : [ -95.284587, 42.505501 ], "pop" : 1311, "state" : "IA" } +{ "_id" : "51054", "city" : "SERGEANT BLUFF", "loc" : [ -96.353392, 42.401895 ], "pop" : 2853, "state" : "IA" } +{ "_id" : "51055", "city" : "SLOAN", "loc" : [ -96.23063399999999, 42.242726 ], "pop" : 1303, "state" : "IA" } +{ "_id" : "51056", "city" : "SMITHLAND", "loc" : [ -95.94864699999999, 42.24079 ], "pop" : 495, "state" : "IA" } +{ "_id" : "51058", "city" : "SUTHERLAND", "loc" : [ -95.480665, 42.982623 ], "pop" : 1096, "state" : "IA" } +{ "_id" : "51059", "city" : "TURIN", "loc" : [ -95.95182800000001, 41.973189 ], "pop" : 387, "state" : "IA" } +{ "_id" : "51060", "city" : "UTE", "loc" : [ -95.712542, 42.058085 ], "pop" : 567, "state" : "IA" } +{ "_id" : "51061", "city" : "WASHTA", "loc" : [ -95.72953699999999, 42.578108 ], "pop" : 519, "state" : "IA" } +{ "_id" : "51062", "city" : "WESTFIELD", "loc" : [ -96.49198699999999, 42.695329 ], "pop" : 1435, "state" : "IA" } +{ "_id" : "51063", "city" : "WHITING", "loc" : [ -96.182247, 42.15216 ], "pop" : 895, "state" : "IA" } +{ "_id" : "51101", "city" : "SIOUX CITY", "loc" : [ -96.40291999999999, 42.497223 ], "pop" : 765, "state" : "IA" } +{ "_id" : "51103", "city" : "SIOUX CITY", "loc" : [ -96.42950999999999, 42.506793 ], "pop" : 16831, "state" : "IA" } +{ "_id" : "51104", "city" : "SIOUX CITY", "loc" : [ -96.400453, 42.52536 ], "pop" : 20441, "state" : "IA" } +{ "_id" : "51105", "city" : "SIOUX CITY", "loc" : [ -96.38285500000001, 42.503224 ], "pop" : 10372, "state" : "IA" } +{ "_id" : "51106", "city" : "SIOUX CITY", "loc" : [ -96.352755, 42.467057 ], "pop" : 25974, "state" : "IA" } +{ "_id" : "51107", "city" : "SIOUX CITY", "loc" : [ -96.376064, 42.490266 ], "pop" : 258, "state" : "IA" } +{ "_id" : "51108", "city" : "SIOUX CITY", "loc" : [ -96.361695, 42.546891 ], "pop" : 4615, "state" : "IA" } +{ "_id" : "51109", "city" : "SIOUX CITY", "loc" : [ -96.480304, 42.517287 ], "pop" : 2592, "state" : "IA" } +{ "_id" : "51110", "city" : "SIOUX CITY", "loc" : [ -96.372559, 42.400921 ], "pop" : 189, "state" : "IA" } +{ "_id" : "51111", "city" : "SIOUX CITY", "loc" : [ -96.37129400000001, 42.408912 ], "pop" : 12, "state" : "IA" } +{ "_id" : "51201", "city" : "SHELDON", "loc" : [ -95.840141, 43.180797 ], "pop" : 5585, "state" : "IA" } +{ "_id" : "51230", "city" : "ALVORD", "loc" : [ -96.290994, 43.320109 ], "pop" : 494, "state" : "IA" } +{ "_id" : "51231", "city" : "ARCHER", "loc" : [ -95.74165600000001, 43.117917 ], "pop" : 194, "state" : "IA" } +{ "_id" : "51232", "city" : "ASHTON", "loc" : [ -95.76550899999999, 43.305259 ], "pop" : 1090, "state" : "IA" } +{ "_id" : "51234", "city" : "BOYDEN", "loc" : [ -95.982309, 43.20343 ], "pop" : 1652, "state" : "IA" } +{ "_id" : "51235", "city" : "DOON", "loc" : [ -96.201987, 43.287183 ], "pop" : 957, "state" : "IA" } +{ "_id" : "51237", "city" : "GEORGE", "loc" : [ -95.989383, 43.343903 ], "pop" : 2326, "state" : "IA" } +{ "_id" : "51238", "city" : "HOSPERS", "loc" : [ -95.91417199999999, 43.079337 ], "pop" : 1491, "state" : "IA" } +{ "_id" : "51239", "city" : "HULL", "loc" : [ -96.13924799999999, 43.195201 ], "pop" : 2283, "state" : "IA" } +{ "_id" : "51240", "city" : "INWOOD", "loc" : [ -96.43629300000001, 43.304747 ], "pop" : 1434, "state" : "IA" } +{ "_id" : "51241", "city" : "LARCHWOOD", "loc" : [ -96.42522, 43.438673 ], "pop" : 2097, "state" : "IA" } +{ "_id" : "51243", "city" : "LITTLE ROCK", "loc" : [ -95.892622, 43.449571 ], "pop" : 688, "state" : "IA" } +{ "_id" : "51245", "city" : "PRIMGHAR", "loc" : [ -95.65330400000001, 43.075892 ], "pop" : 2167, "state" : "IA" } +{ "_id" : "51246", "city" : "ROCK RAPIDS", "loc" : [ -96.178055, 43.427192 ], "pop" : 3956, "state" : "IA" } +{ "_id" : "51247", "city" : "ROCK VALLEY", "loc" : [ -96.31034200000001, 43.201356 ], "pop" : 4100, "state" : "IA" } +{ "_id" : "51248", "city" : "SANBORN", "loc" : [ -95.662227, 43.189002 ], "pop" : 1632, "state" : "IA" } +{ "_id" : "51249", "city" : "SIBLEY", "loc" : [ -95.7424, 43.406929 ], "pop" : 3853, "state" : "IA" } +{ "_id" : "51250", "city" : "SIOUX CENTER", "loc" : [ -96.179952, 43.081416 ], "pop" : 7417, "state" : "IA" } +{ "_id" : "51301", "city" : "SPENCER", "loc" : [ -95.14569, 43.145107 ], "pop" : 12101, "state" : "IA" } +{ "_id" : "51331", "city" : "ARNOLDS PARK", "loc" : [ -95.13126099999999, 43.36358 ], "pop" : 1109, "state" : "IA" } +{ "_id" : "51333", "city" : "DICKENS", "loc" : [ -94.985383, 43.154836 ], "pop" : 732, "state" : "IA" } +{ "_id" : "51334", "city" : "ESTHERVILLE", "loc" : [ -94.818001, 43.401709 ], "pop" : 8614, "state" : "IA" } +{ "_id" : "51338", "city" : "EVERLY", "loc" : [ -95.322777, 43.160917 ], "pop" : 1153, "state" : "IA" } +{ "_id" : "51340", "city" : "FOSTORIA", "loc" : [ -95.185042, 43.225857 ], "pop" : 471, "state" : "IA" } +{ "_id" : "51342", "city" : "GRAETTINGER", "loc" : [ -94.733401, 43.227731 ], "pop" : 1259, "state" : "IA" } +{ "_id" : "51343", "city" : "GREENVILLE", "loc" : [ -95.058184, 43.033348 ], "pop" : 630, "state" : "IA" } +{ "_id" : "51345", "city" : "HARRIS", "loc" : [ -95.44260300000001, 43.456793 ], "pop" : 333, "state" : "IA" } +{ "_id" : "51346", "city" : "HARTLEY", "loc" : [ -95.481696, 43.179984 ], "pop" : 2574, "state" : "IA" } +{ "_id" : "51347", "city" : "LAKE PARK", "loc" : [ -95.321601, 43.445239 ], "pop" : 1320, "state" : "IA" } +{ "_id" : "51350", "city" : "MELVIN", "loc" : [ -95.592951, 43.284496 ], "pop" : 395, "state" : "IA" } +{ "_id" : "51351", "city" : "MILFORD", "loc" : [ -95.161534, 43.31964 ], "pop" : 2964, "state" : "IA" } +{ "_id" : "51354", "city" : "OCHEYEDAN", "loc" : [ -95.520366, 43.39105 ], "pop" : 1596, "state" : "IA" } +{ "_id" : "51355", "city" : "OKOBOJI", "loc" : [ -95.153026, 43.37938 ], "pop" : 1637, "state" : "IA" } +{ "_id" : "51357", "city" : "ROYAL", "loc" : [ -95.26785599999999, 43.048751 ], "pop" : 1035, "state" : "IA" } +{ "_id" : "51358", "city" : "RUTHVEN", "loc" : [ -94.884214, 43.144845 ], "pop" : 1283, "state" : "IA" } +{ "_id" : "51360", "city" : "SPIRIT LAKE", "loc" : [ -95.112336, 43.426211 ], "pop" : 6683, "state" : "IA" } +{ "_id" : "51363", "city" : "SUPERIOR", "loc" : [ -94.964935, 43.450317 ], "pop" : 333, "state" : "IA" } +{ "_id" : "51364", "city" : "TERRIL", "loc" : [ -94.973725, 43.324073 ], "pop" : 863, "state" : "IA" } +{ "_id" : "51365", "city" : "WALLINGFORD", "loc" : [ -94.82057, 43.312158 ], "pop" : 371, "state" : "IA" } +{ "_id" : "51366", "city" : "WEBB", "loc" : [ -94.995124, 42.950189 ], "pop" : 343, "state" : "IA" } +{ "_id" : "51401", "city" : "CARROLL", "loc" : [ -94.866664, 42.071972 ], "pop" : 11456, "state" : "IA" } +{ "_id" : "51430", "city" : "ARCADIA", "loc" : [ -95.03713999999999, 42.057279 ], "pop" : 1183, "state" : "IA" } +{ "_id" : "51431", "city" : "ARTHUR", "loc" : [ -95.367519, 42.336283 ], "pop" : 577, "state" : "IA" } +{ "_id" : "51432", "city" : "ASPINWALL", "loc" : [ -95.149936, 41.908252 ], "pop" : 367, "state" : "IA" } +{ "_id" : "51433", "city" : "YETTER", "loc" : [ -94.903447, 42.280895 ], "pop" : 882, "state" : "IA" } +{ "_id" : "51436", "city" : "BREDA", "loc" : [ -95.00067900000001, 42.175835 ], "pop" : 773, "state" : "IA" } +{ "_id" : "51439", "city" : "CHARTER OAK", "loc" : [ -95.59924100000001, 42.070735 ], "pop" : 797, "state" : "IA" } +{ "_id" : "51440", "city" : "DEDHAM", "loc" : [ -94.814896, 41.905539 ], "pop" : 562, "state" : "IA" } +{ "_id" : "51441", "city" : "DELOIT", "loc" : [ -95.286338, 42.085899 ], "pop" : 618, "state" : "IA" } +{ "_id" : "51442", "city" : "DENISON", "loc" : [ -95.363572, 42.019626 ], "pop" : 8507, "state" : "IA" } +{ "_id" : "51443", "city" : "GLIDDEN", "loc" : [ -94.714777, 42.061816 ], "pop" : 1518, "state" : "IA" } +{ "_id" : "51444", "city" : "HALBUR", "loc" : [ -94.93586000000001, 41.997357 ], "pop" : 720, "state" : "IA" } +{ "_id" : "51445", "city" : "IDA GROVE", "loc" : [ -95.464488, 42.340026 ], "pop" : 3633, "state" : "IA" } +{ "_id" : "51446", "city" : "IRWIN", "loc" : [ -95.195842, 41.794094 ], "pop" : 1120, "state" : "IA" } +{ "_id" : "51447", "city" : "KIRKMAN", "loc" : [ -95.267083, 41.73076 ], "pop" : 395, "state" : "IA" } +{ "_id" : "51448", "city" : "KIRON", "loc" : [ -95.31146, 42.179359 ], "pop" : 753, "state" : "IA" } +{ "_id" : "51449", "city" : "LAKE CITY", "loc" : [ -94.74578700000001, 42.270494 ], "pop" : 2539, "state" : "IA" } +{ "_id" : "51450", "city" : "LAKE VIEW", "loc" : [ -95.048562, 42.315367 ], "pop" : 1792, "state" : "IA" } +{ "_id" : "51451", "city" : "LANESBORO", "loc" : [ -94.690274, 42.174687 ], "pop" : 396, "state" : "IA" } +{ "_id" : "51452", "city" : "LIDDERDALE", "loc" : [ -94.79535300000001, 42.152815 ], "pop" : 525, "state" : "IA" } +{ "_id" : "51453", "city" : "LOHRVILLE", "loc" : [ -94.556605, 42.261923 ], "pop" : 615, "state" : "IA" } +{ "_id" : "51454", "city" : "MANILLA", "loc" : [ -95.239126, 41.892233 ], "pop" : 1185, "state" : "IA" } +{ "_id" : "51455", "city" : "MANNING", "loc" : [ -95.055622, 41.907248 ], "pop" : 1807, "state" : "IA" } +{ "_id" : "51458", "city" : "ODEBOLT", "loc" : [ -95.25005, 42.309514 ], "pop" : 1776, "state" : "IA" } +{ "_id" : "51459", "city" : "RALSTON", "loc" : [ -94.569779, 42.075655 ], "pop" : 231, "state" : "IA" } +{ "_id" : "51460", "city" : "RICKETTS", "loc" : [ -95.599547, 42.15406 ], "pop" : 346, "state" : "IA" } +{ "_id" : "51461", "city" : "SCHLESWIG", "loc" : [ -95.444309, 42.164586 ], "pop" : 1191, "state" : "IA" } +{ "_id" : "51462", "city" : "SCRANTON", "loc" : [ -94.55176400000001, 42.012381 ], "pop" : 814, "state" : "IA" } +{ "_id" : "51463", "city" : "TEMPLETON", "loc" : [ -94.93200899999999, 41.912077 ], "pop" : 681, "state" : "IA" } +{ "_id" : "51465", "city" : "VAIL", "loc" : [ -95.17776600000001, 42.033772 ], "pop" : 790, "state" : "IA" } +{ "_id" : "51466", "city" : "WALL LAKE", "loc" : [ -95.085156, 42.265252 ], "pop" : 1481, "state" : "IA" } +{ "_id" : "51467", "city" : "WESTSIDE", "loc" : [ -95.12730000000001, 42.10844 ], "pop" : 714, "state" : "IA" } +{ "_id" : "51501", "city" : "MANAWA", "loc" : [ -95.88099200000001, 41.252954 ], "pop" : 31614, "state" : "IA" } +{ "_id" : "51503", "city" : "COUNCIL BLUFFS", "loc" : [ -95.82508300000001, 41.261584 ], "pop" : 30513, "state" : "IA" } +{ "_id" : "51510", "city" : "CARTER LAKE", "loc" : [ -95.91406000000001, 41.292524 ], "pop" : 3200, "state" : "IA" } +{ "_id" : "51520", "city" : "ARION", "loc" : [ -95.46232999999999, 41.950406 ], "pop" : 194, "state" : "IA" } +{ "_id" : "51521", "city" : "AVOCA", "loc" : [ -95.350872, 41.476834 ], "pop" : 2032, "state" : "IA" } +{ "_id" : "51523", "city" : "BLENCOE", "loc" : [ -96.082663, 41.923662 ], "pop" : 373, "state" : "IA" } +{ "_id" : "51525", "city" : "CARSON", "loc" : [ -95.36808600000001, 41.225276 ], "pop" : 1398, "state" : "IA" } +{ "_id" : "51526", "city" : "CRESCENT", "loc" : [ -95.827648, 41.364378 ], "pop" : 1967, "state" : "IA" } +{ "_id" : "51527", "city" : "EARLING", "loc" : [ -95.340293, 41.827063 ], "pop" : 375, "state" : "IA" } +{ "_id" : "51528", "city" : "DOW CITY", "loc" : [ -95.4862, 41.913429 ], "pop" : 1313, "state" : "IA" } +{ "_id" : "51529", "city" : "EARLING", "loc" : [ -95.615709, 41.842301 ], "pop" : 1836, "state" : "IA" } +{ "_id" : "51530", "city" : "EARLING", "loc" : [ -95.42104500000001, 41.792483 ], "pop" : 1068, "state" : "IA" } +{ "_id" : "51531", "city" : "ELK HORN", "loc" : [ -95.070015, 41.582871 ], "pop" : 990, "state" : "IA" } +{ "_id" : "51532", "city" : "ELLIOTT", "loc" : [ -95.160237, 41.130617 ], "pop" : 879, "state" : "IA" } +{ "_id" : "51533", "city" : "EMERSON", "loc" : [ -95.410624, 41.028439 ], "pop" : 1529, "state" : "IA" } +{ "_id" : "51534", "city" : "GLENWOOD", "loc" : [ -95.73891999999999, 41.047009 ], "pop" : 6392, "state" : "IA" } +{ "_id" : "51535", "city" : "GRISWOLD", "loc" : [ -95.098989, 41.223842 ], "pop" : 1678, "state" : "IA" } +{ "_id" : "51536", "city" : "HANCOCK", "loc" : [ -95.344528, 41.383238 ], "pop" : 427, "state" : "IA" } +{ "_id" : "51537", "city" : "HARLAN", "loc" : [ -95.31110099999999, 41.64375 ], "pop" : 6934, "state" : "IA" } +{ "_id" : "51540", "city" : "HASTINGS", "loc" : [ -95.55309699999999, 40.960514 ], "pop" : 267, "state" : "IA" } +{ "_id" : "51541", "city" : "HENDERSON", "loc" : [ -95.458629, 41.125426 ], "pop" : 564, "state" : "IA" } +{ "_id" : "51542", "city" : "HONEY CREEK", "loc" : [ -95.8802, 41.463045 ], "pop" : 656, "state" : "IA" } +{ "_id" : "51543", "city" : "KIMBALLTON", "loc" : [ -95.055324, 41.635214 ], "pop" : 614, "state" : "IA" } +{ "_id" : "51544", "city" : "LEWIS", "loc" : [ -95.06202399999999, 41.296289 ], "pop" : 980, "state" : "IA" } +{ "_id" : "51545", "city" : "LITTLE SIOUX", "loc" : [ -96.031357, 41.808267 ], "pop" : 402, "state" : "IA" } +{ "_id" : "51546", "city" : "LOGAN", "loc" : [ -95.752478, 41.624345 ], "pop" : 2764, "state" : "IA" } +{ "_id" : "51548", "city" : "MC CLELLAND", "loc" : [ -95.68127800000001, 41.293168 ], "pop" : 714, "state" : "IA" } +{ "_id" : "51549", "city" : "MACEDONIA", "loc" : [ -95.431386, 41.191627 ], "pop" : 475, "state" : "IA" } +{ "_id" : "51550", "city" : "MAGNOLIA", "loc" : [ -95.854955, 41.708177 ], "pop" : 631, "state" : "IA" } +{ "_id" : "51551", "city" : "MALVERN", "loc" : [ -95.58398800000001, 41.007378 ], "pop" : 1409, "state" : "IA" } +{ "_id" : "51552", "city" : "MARNE", "loc" : [ -95.097308, 41.454681 ], "pop" : 388, "state" : "IA" } +{ "_id" : "51553", "city" : "MINDEN", "loc" : [ -95.55188699999999, 41.465355 ], "pop" : 917, "state" : "IA" } +{ "_id" : "51554", "city" : "MINEOLA", "loc" : [ -95.75569900000001, 41.110171 ], "pop" : 1276, "state" : "IA" } +{ "_id" : "51555", "city" : "MISSOURI VALLEY", "loc" : [ -95.891346, 41.564399 ], "pop" : 4330, "state" : "IA" } +{ "_id" : "51556", "city" : "MODALE", "loc" : [ -95.985225, 41.637143 ], "pop" : 505, "state" : "IA" } +{ "_id" : "51557", "city" : "MONDAMIN", "loc" : [ -96.007204, 41.708876 ], "pop" : 793, "state" : "IA" } +{ "_id" : "51558", "city" : "MOORHEAD", "loc" : [ -95.829031, 41.918601 ], "pop" : 589, "state" : "IA" } +{ "_id" : "51559", "city" : "NEOLA", "loc" : [ -95.67935799999999, 41.456383 ], "pop" : 1766, "state" : "IA" } +{ "_id" : "51560", "city" : "OAKLAND", "loc" : [ -95.379034, 41.311964 ], "pop" : 2385, "state" : "IA" } +{ "_id" : "51561", "city" : "PACIFIC JUNCTION", "loc" : [ -95.80464499999999, 41.027123 ], "pop" : 1228, "state" : "IA" } +{ "_id" : "51562", "city" : "PANAMA", "loc" : [ -95.48704600000001, 41.728813 ], "pop" : 511, "state" : "IA" } +{ "_id" : "51563", "city" : "PERSIA", "loc" : [ -95.56577, 41.56473 ], "pop" : 691, "state" : "IA" } +{ "_id" : "51564", "city" : "PISGAH", "loc" : [ -95.919172, 41.821376 ], "pop" : 673, "state" : "IA" } +{ "_id" : "51565", "city" : "PORTSMOUTH", "loc" : [ -95.510751, 41.648385 ], "pop" : 476, "state" : "IA" } +{ "_id" : "51566", "city" : "RED OAK", "loc" : [ -95.226924, 41.007949 ], "pop" : 7395, "state" : "IA" } +{ "_id" : "51570", "city" : "SHELBY", "loc" : [ -95.446888, 41.533898 ], "pop" : 941, "state" : "IA" } +{ "_id" : "51571", "city" : "SILVER CITY", "loc" : [ -95.626912, 41.113024 ], "pop" : 483, "state" : "IA" } +{ "_id" : "51572", "city" : "SOLDIER", "loc" : [ -95.78253100000001, 41.994188 ], "pop" : 665, "state" : "IA" } +{ "_id" : "51573", "city" : "STANTON", "loc" : [ -95.09876, 40.985924 ], "pop" : 1315, "state" : "IA" } +{ "_id" : "51575", "city" : "TREYNOR", "loc" : [ -95.617041, 41.220679 ], "pop" : 1619, "state" : "IA" } +{ "_id" : "51576", "city" : "UNDERWOOD", "loc" : [ -95.626997, 41.360294 ], "pop" : 1652, "state" : "IA" } +{ "_id" : "51577", "city" : "WALNUT", "loc" : [ -95.217973, 41.462329 ], "pop" : 1293, "state" : "IA" } +{ "_id" : "51578", "city" : "WESTPHALIA", "loc" : [ -95.386978, 41.718014 ], "pop" : 420, "state" : "IA" } +{ "_id" : "51579", "city" : "WOODBINE", "loc" : [ -95.700785, 41.737267 ], "pop" : 2105, "state" : "IA" } +{ "_id" : "51601", "city" : "SHENANDOAH", "loc" : [ -95.36479799999999, 40.758087 ], "pop" : 6226, "state" : "IA" } +{ "_id" : "51630", "city" : "BLANCHARD", "loc" : [ -95.205377, 40.612156 ], "pop" : 284, "state" : "IA" } +{ "_id" : "51631", "city" : "BRADDYVILLE", "loc" : [ -94.99557799999999, 40.599081 ], "pop" : 351, "state" : "IA" } +{ "_id" : "51632", "city" : "CLARINDA", "loc" : [ -95.037976, 40.749084 ], "pop" : 6652, "state" : "IA" } +{ "_id" : "51636", "city" : "COIN", "loc" : [ -95.221653, 40.668591 ], "pop" : 387, "state" : "IA" } +{ "_id" : "51637", "city" : "COLLEGE SPRINGS", "loc" : [ -95.099717, 40.617109 ], "pop" : 537, "state" : "IA" } +{ "_id" : "51638", "city" : "ESSEX", "loc" : [ -95.288777, 40.840359 ], "pop" : 1433, "state" : "IA" } +{ "_id" : "51639", "city" : "FARRAGUT", "loc" : [ -95.45549800000001, 40.729971 ], "pop" : 1055, "state" : "IA" } +{ "_id" : "51640", "city" : "HAMBURG", "loc" : [ -95.625789, 40.614902 ], "pop" : 1997, "state" : "IA" } +{ "_id" : "51645", "city" : "IMOGENE", "loc" : [ -95.435804, 40.863144 ], "pop" : 318, "state" : "IA" } +{ "_id" : "51646", "city" : "NEW MARKET", "loc" : [ -94.891662, 40.742174 ], "pop" : 702, "state" : "IA" } +{ "_id" : "51647", "city" : "NORTHBORO", "loc" : [ -95.30959199999999, 40.612737 ], "pop" : 287, "state" : "IA" } +{ "_id" : "51648", "city" : "PERCIVAL", "loc" : [ -95.809307, 40.740148 ], "pop" : 327, "state" : "IA" } +{ "_id" : "51649", "city" : "RANDOLPH", "loc" : [ -95.562386, 40.870353 ], "pop" : 419, "state" : "IA" } +{ "_id" : "51650", "city" : "RIVERTON", "loc" : [ -95.55780300000001, 40.686968 ], "pop" : 447, "state" : "IA" } +{ "_id" : "51651", "city" : "SHAMBAUGH", "loc" : [ -95.063591, 40.675735 ], "pop" : 456, "state" : "IA" } +{ "_id" : "51652", "city" : "SIDNEY", "loc" : [ -95.64027, 40.750671 ], "pop" : 1948, "state" : "IA" } +{ "_id" : "51653", "city" : "TABOR", "loc" : [ -95.672892, 40.900448 ], "pop" : 1626, "state" : "IA" } +{ "_id" : "51654", "city" : "THURMAN", "loc" : [ -95.760535, 40.84241 ], "pop" : 521, "state" : "IA" } +{ "_id" : "51656", "city" : "YORKTOWN", "loc" : [ -95.216335, 40.769244 ], "pop" : 257, "state" : "IA" } +{ "_id" : "52001", "city" : "DUBUQUE", "loc" : [ -90.68191400000001, 42.514977 ], "pop" : 41934, "state" : "IA" } +{ "_id" : "52002", "city" : "DUBUQUE", "loc" : [ -90.738372, 42.512191 ], "pop" : 12734, "state" : "IA" } +{ "_id" : "52003", "city" : "DUBUQUE", "loc" : [ -90.682884, 42.464916 ], "pop" : 13104, "state" : "IA" } +{ "_id" : "52030", "city" : "ANDREW", "loc" : [ -90.60035000000001, 42.158496 ], "pop" : 741, "state" : "IA" } +{ "_id" : "52031", "city" : "BELLEVUE", "loc" : [ -90.435603, 42.25825 ], "pop" : 2884, "state" : "IA" } +{ "_id" : "52032", "city" : "BERNARD", "loc" : [ -90.863032, 42.33207 ], "pop" : 861, "state" : "IA" } +{ "_id" : "52033", "city" : "CASCADE", "loc" : [ -91.01439499999999, 42.286959 ], "pop" : 3155, "state" : "IA" } +{ "_id" : "52035", "city" : "COLESBURG", "loc" : [ -91.19628, 42.638346 ], "pop" : 1401, "state" : "IA" } +{ "_id" : "52036", "city" : "DELAWARE", "loc" : [ -91.347176, 42.477713 ], "pop" : 262, "state" : "IA" } +{ "_id" : "52037", "city" : "DELMAR", "loc" : [ -90.608712, 41.996065 ], "pop" : 927, "state" : "IA" } +{ "_id" : "52038", "city" : "DUNDEE", "loc" : [ -91.547697, 42.593979 ], "pop" : 618, "state" : "IA" } +{ "_id" : "52039", "city" : "DURANGO", "loc" : [ -90.860794, 42.552564 ], "pop" : 874, "state" : "IA" } +{ "_id" : "52040", "city" : "DYERSVILLE", "loc" : [ -91.11826499999999, 42.483332 ], "pop" : 4709, "state" : "IA" } +{ "_id" : "52041", "city" : "EARLVILLE", "loc" : [ -91.259658, 42.500101 ], "pop" : 1566, "state" : "IA" } +{ "_id" : "52042", "city" : "EDGEWOOD", "loc" : [ -91.39495100000001, 42.654098 ], "pop" : 2095, "state" : "IA" } +{ "_id" : "52043", "city" : "ELKADER", "loc" : [ -91.41430800000001, 42.849627 ], "pop" : 2887, "state" : "IA" } +{ "_id" : "52044", "city" : "ELKPORT", "loc" : [ -91.283934, 42.739892 ], "pop" : 129, "state" : "IA" } +{ "_id" : "52045", "city" : "EPWORTH", "loc" : [ -90.931331, 42.443928 ], "pop" : 1931, "state" : "IA" } +{ "_id" : "52046", "city" : "FARLEY", "loc" : [ -91.00826600000001, 42.445059 ], "pop" : 2120, "state" : "IA" } +{ "_id" : "52047", "city" : "FARMERSBURG", "loc" : [ -91.338984, 42.952205 ], "pop" : 638, "state" : "IA" } +{ "_id" : "52048", "city" : "GARBER", "loc" : [ -91.259275, 42.74528 ], "pop" : 191, "state" : "IA" } +{ "_id" : "52049", "city" : "GARNAVILLO", "loc" : [ -91.215609, 42.876188 ], "pop" : 1408, "state" : "IA" } +{ "_id" : "52050", "city" : "GREELEY", "loc" : [ -91.32331600000001, 42.59389 ], "pop" : 679, "state" : "IA" } +{ "_id" : "52052", "city" : "GUTTENBERG", "loc" : [ -91.119015, 42.759443 ], "pop" : 4113, "state" : "IA" } +{ "_id" : "52053", "city" : "HOLY CROSS", "loc" : [ -90.97298600000001, 42.580778 ], "pop" : 1139, "state" : "IA" } +{ "_id" : "52054", "city" : "LA MOTTE", "loc" : [ -90.617673, 42.304448 ], "pop" : 1132, "state" : "IA" } +{ "_id" : "52057", "city" : "MANCHESTER", "loc" : [ -91.449001, 42.483418 ], "pop" : 7823, "state" : "IA" } +{ "_id" : "52060", "city" : "MAQUOKETA", "loc" : [ -90.677075, 42.07782 ], "pop" : 8374, "state" : "IA" } +{ "_id" : "52064", "city" : "MILES", "loc" : [ -90.336716, 42.100587 ], "pop" : 1083, "state" : "IA" } +{ "_id" : "52065", "city" : "NEW VIENNA", "loc" : [ -91.09763700000001, 42.567829 ], "pop" : 835, "state" : "IA" } +{ "_id" : "52066", "city" : "NORTH BUENA VIST", "loc" : [ -90.958772, 42.671103 ], "pop" : 404, "state" : "IA" } +{ "_id" : "52068", "city" : "PEOSTA", "loc" : [ -90.809372, 42.443535 ], "pop" : 1565, "state" : "IA" } +{ "_id" : "52069", "city" : "PRESTON", "loc" : [ -90.395382, 42.053854 ], "pop" : 1376, "state" : "IA" } +{ "_id" : "52070", "city" : "SABULA", "loc" : [ -90.19553000000001, 42.073668 ], "pop" : 1174, "state" : "IA" } +{ "_id" : "52071", "city" : "SAINT DONATUS", "loc" : [ -90.484514, 42.33119 ], "pop" : 757, "state" : "IA" } +{ "_id" : "52072", "city" : "SAINT OLAF", "loc" : [ -91.41754899999999, 42.948179 ], "pop" : 466, "state" : "IA" } +{ "_id" : "52073", "city" : "SHERRILL", "loc" : [ -90.811486, 42.617078 ], "pop" : 1381, "state" : "IA" } +{ "_id" : "52074", "city" : "SPRAGUEVILLE", "loc" : [ -90.473044, 42.072742 ], "pop" : 492, "state" : "IA" } +{ "_id" : "52075", "city" : "SPRINGBROOK", "loc" : [ -90.48463700000001, 42.167401 ], "pop" : 497, "state" : "IA" } +{ "_id" : "52076", "city" : "STRAWBERRY POINT", "loc" : [ -91.540926, 42.683225 ], "pop" : 1825, "state" : "IA" } +{ "_id" : "52077", "city" : "VOLGA", "loc" : [ -91.542891, 42.790389 ], "pop" : 562, "state" : "IA" } +{ "_id" : "52078", "city" : "WORTHINGTON", "loc" : [ -91.106919, 42.393001 ], "pop" : 797, "state" : "IA" } +{ "_id" : "52079", "city" : "ZWINGLE", "loc" : [ -90.750666, 42.277486 ], "pop" : 1320, "state" : "IA" } +{ "_id" : "52101", "city" : "DECORAH", "loc" : [ -91.793947, 43.322711 ], "pop" : 13593, "state" : "IA" } +{ "_id" : "52131", "city" : "BURR OAK", "loc" : [ -91.89207399999999, 43.463912 ], "pop" : 484, "state" : "IA" } +{ "_id" : "52132", "city" : "CALMAR", "loc" : [ -91.91257899999999, 43.197402 ], "pop" : 2218, "state" : "IA" } +{ "_id" : "52133", "city" : "CASTALIA", "loc" : [ -91.662904, 43.161179 ], "pop" : 1103, "state" : "IA" } +{ "_id" : "52134", "city" : "CHESTER", "loc" : [ -92.41552799999999, 43.473021 ], "pop" : 571, "state" : "IA" } +{ "_id" : "52135", "city" : "CLERMONT", "loc" : [ -91.65518400000001, 43.01298 ], "pop" : 817, "state" : "IA" } +{ "_id" : "52136", "city" : "CRESCO", "loc" : [ -92.12595399999999, 43.363007 ], "pop" : 5785, "state" : "IA" } +{ "_id" : "52140", "city" : "DORCHESTER", "loc" : [ -91.50765, 43.442136 ], "pop" : 757, "state" : "IA" } +{ "_id" : "52141", "city" : "ELGIN", "loc" : [ -91.645375, 42.954845 ], "pop" : 963, "state" : "IA" } +{ "_id" : "52142", "city" : "FAYETTE", "loc" : [ -91.81388699999999, 42.84941 ], "pop" : 1939, "state" : "IA" } +{ "_id" : "52144", "city" : "FORT ATKINSON", "loc" : [ -91.91336, 43.133932 ], "pop" : 1095, "state" : "IA" } +{ "_id" : "52146", "city" : "HARPERS FERRY", "loc" : [ -91.218822, 43.16977 ], "pop" : 915, "state" : "IA" } +{ "_id" : "52147", "city" : "HAWKEYE", "loc" : [ -91.957764, 42.948702 ], "pop" : 1205, "state" : "IA" } +{ "_id" : "52150", "city" : "JACKSON JUNCTION", "loc" : [ -92.01844699999999, 43.121369 ], "pop" : 369, "state" : "IA" } +{ "_id" : "52151", "city" : "LANSING", "loc" : [ -91.265979, 43.366126 ], "pop" : 1717, "state" : "IA" } +{ "_id" : "52154", "city" : "LAWLER", "loc" : [ -92.143974, 43.093247 ], "pop" : 1450, "state" : "IA" } +{ "_id" : "52155", "city" : "LIME SPRINGS", "loc" : [ -92.273324, 43.45563 ], "pop" : 672, "state" : "IA" } +{ "_id" : "52156", "city" : "LUANA", "loc" : [ -91.458275, 43.049281 ], "pop" : 388, "state" : "IA" } +{ "_id" : "52157", "city" : "MC GREGOR", "loc" : [ -91.18872399999999, 43.023719 ], "pop" : 1344, "state" : "IA" } +{ "_id" : "52158", "city" : "MARQUETTE", "loc" : [ -91.19214100000001, 43.050457 ], "pop" : 276, "state" : "IA" } +{ "_id" : "52159", "city" : "MONONA", "loc" : [ -91.45867699999999, 43.073485 ], "pop" : 4670, "state" : "IA" } +{ "_id" : "52160", "city" : "NEW ALBIN", "loc" : [ -91.294166, 43.489877 ], "pop" : 749, "state" : "IA" } +{ "_id" : "52161", "city" : "OSSIAN", "loc" : [ -91.773431, 43.137858 ], "pop" : 1349, "state" : "IA" } +{ "_id" : "52162", "city" : "POSTVILLE", "loc" : [ -91.547809, 43.003619 ], "pop" : 885, "state" : "IA" } +{ "_id" : "52164", "city" : "RANDALIA", "loc" : [ -91.88462800000001, 42.862551 ], "pop" : 159, "state" : "IA" } +{ "_id" : "52165", "city" : "RIDGEWAY", "loc" : [ -92.00341299999999, 43.297853 ], "pop" : 636, "state" : "IA" } +{ "_id" : "52166", "city" : "SAINT LUCAS", "loc" : [ -91.91156100000001, 43.047703 ], "pop" : 638, "state" : "IA" } +{ "_id" : "52169", "city" : "WADENA", "loc" : [ -91.663865, 42.854956 ], "pop" : 551, "state" : "IA" } +{ "_id" : "52170", "city" : "WATERVILLE", "loc" : [ -91.26304500000001, 43.263608 ], "pop" : 1204, "state" : "IA" } +{ "_id" : "52171", "city" : "WAUCOMA", "loc" : [ -92.03022, 43.043329 ], "pop" : 727, "state" : "IA" } +{ "_id" : "52172", "city" : "WAUKON", "loc" : [ -91.479994, 43.263951 ], "pop" : 6134, "state" : "IA" } +{ "_id" : "52175", "city" : "ELDORADO", "loc" : [ -91.803602, 42.973232 ], "pop" : 3353, "state" : "IA" } +{ "_id" : "52201", "city" : "AINSWORTH", "loc" : [ -91.547173, 41.320226 ], "pop" : 1265, "state" : "IA" } +{ "_id" : "52202", "city" : "ALBURNETT", "loc" : [ -91.639245, 42.158322 ], "pop" : 1038, "state" : "IA" } +{ "_id" : "52203", "city" : "AMANA", "loc" : [ -91.88545000000001, 41.831284 ], "pop" : 450, "state" : "IA" } +{ "_id" : "52205", "city" : "ANAMOSA", "loc" : [ -91.285115, 42.107763 ], "pop" : 7264, "state" : "IA" } +{ "_id" : "52206", "city" : "ATKINS", "loc" : [ -91.87596600000001, 41.988103 ], "pop" : 1347, "state" : "IA" } +{ "_id" : "52207", "city" : "BALDWIN", "loc" : [ -90.819968, 42.073188 ], "pop" : 362, "state" : "IA" } +{ "_id" : "52208", "city" : "BELLE PLAINE", "loc" : [ -92.257381, 41.899159 ], "pop" : 3562, "state" : "IA" } +{ "_id" : "52209", "city" : "BLAIRSTOWN", "loc" : [ -92.08286099999999, 41.906338 ], "pop" : 672, "state" : "IA" } +{ "_id" : "52210", "city" : "BRANDON", "loc" : [ -92.005892, 42.330912 ], "pop" : 717, "state" : "IA" } +{ "_id" : "52211", "city" : "BROOKLYN", "loc" : [ -92.428462, 41.732147 ], "pop" : 2196, "state" : "IA" } +{ "_id" : "52212", "city" : "CENTER JUNCTION", "loc" : [ -91.067013, 42.092585 ], "pop" : 647, "state" : "IA" } +{ "_id" : "52213", "city" : "CENTER POINT", "loc" : [ -91.775764, 42.189844 ], "pop" : 2462, "state" : "IA" } +{ "_id" : "52214", "city" : "CENTRAL CITY", "loc" : [ -91.491399, 42.198234 ], "pop" : 3478, "state" : "IA" } +{ "_id" : "52215", "city" : "CHELSEA", "loc" : [ -92.407815, 41.913132 ], "pop" : 906, "state" : "IA" } +{ "_id" : "52216", "city" : "CLARENCE", "loc" : [ -91.060457, 41.88958 ], "pop" : 1219, "state" : "IA" } +{ "_id" : "52217", "city" : "CLUTIER", "loc" : [ -92.376347, 42.078892 ], "pop" : 497, "state" : "IA" } +{ "_id" : "52218", "city" : "COGGON", "loc" : [ -91.541285, 42.279158 ], "pop" : 1053, "state" : "IA" } +{ "_id" : "52220", "city" : "CONROY", "loc" : [ -91.96947900000001, 41.74255 ], "pop" : 21, "state" : "IA" } +{ "_id" : "52222", "city" : "DEEP RIVER", "loc" : [ -92.364513, 41.571713 ], "pop" : 596, "state" : "IA" } +{ "_id" : "52223", "city" : "DELHI", "loc" : [ -91.27022599999999, 42.427082 ], "pop" : 1530, "state" : "IA" } +{ "_id" : "52224", "city" : "DYSART", "loc" : [ -92.318731, 42.169017 ], "pop" : 1513, "state" : "IA" } +{ "_id" : "52225", "city" : "ELBERON", "loc" : [ -92.331447, 42.008769 ], "pop" : 337, "state" : "IA" } +{ "_id" : "52226", "city" : "ELWOOD", "loc" : [ -90.724609, 41.99083 ], "pop" : 413, "state" : "IA" } +{ "_id" : "52227", "city" : "ELY", "loc" : [ -91.573767, 41.894275 ], "pop" : 1091, "state" : "IA" } +{ "_id" : "52228", "city" : "FAIRFAX", "loc" : [ -91.780102, 41.915304 ], "pop" : 1392, "state" : "IA" } +{ "_id" : "52229", "city" : "GARRISON", "loc" : [ -92.16440900000001, 42.158827 ], "pop" : 872, "state" : "IA" } +{ "_id" : "52231", "city" : "HARPER", "loc" : [ -92.038758, 41.37283 ], "pop" : 324, "state" : "IA" } +{ "_id" : "52232", "city" : "HARTWICK", "loc" : [ -92.35384500000001, 41.808019 ], "pop" : 376, "state" : "IA" } +{ "_id" : "52233", "city" : "HIAWATHA", "loc" : [ -91.67695999999999, 42.042455 ], "pop" : 4966, "state" : "IA" } +{ "_id" : "52236", "city" : "HOMESTEAD", "loc" : [ -91.879471, 41.733858 ], "pop" : 557, "state" : "IA" } +{ "_id" : "52237", "city" : "HOPKINTON", "loc" : [ -91.24605099999999, 42.342164 ], "pop" : 1547, "state" : "IA" } +{ "_id" : "52240", "city" : "IOWA CITY", "loc" : [ -91.51119199999999, 41.654899 ], "pop" : 25049, "state" : "IA" } +{ "_id" : "52241", "city" : "CORALVILLE", "loc" : [ -91.590608, 41.693666 ], "pop" : 12646, "state" : "IA" } +{ "_id" : "52245", "city" : "IOWA CITY", "loc" : [ -91.51506999999999, 41.664916 ], "pop" : 21140, "state" : "IA" } +{ "_id" : "52246", "city" : "IOWA CITY", "loc" : [ -91.56688200000001, 41.643813 ], "pop" : 22869, "state" : "IA" } +{ "_id" : "52247", "city" : "KALONA", "loc" : [ -91.70567800000001, 41.482299 ], "pop" : 3058, "state" : "IA" } +{ "_id" : "52248", "city" : "KEOTA", "loc" : [ -91.96406399999999, 41.350429 ], "pop" : 1439, "state" : "IA" } +{ "_id" : "52249", "city" : "KEYSTONE", "loc" : [ -92.217944, 42.015636 ], "pop" : 1110, "state" : "IA" } +{ "_id" : "52250", "city" : "KINROSS", "loc" : [ -92.001007, 41.460998 ], "pop" : 374, "state" : "IA" } +{ "_id" : "52251", "city" : "LADORA", "loc" : [ -92.187281, 41.756353 ], "pop" : 304, "state" : "IA" } +{ "_id" : "52253", "city" : "LISBON", "loc" : [ -91.38613700000001, 41.921169 ], "pop" : 1581, "state" : "IA" } +{ "_id" : "52254", "city" : "LOST NATION", "loc" : [ -90.82653999999999, 41.974503 ], "pop" : 768, "state" : "IA" } +{ "_id" : "52255", "city" : "LOWDEN", "loc" : [ -90.93822, 41.859393 ], "pop" : 1488, "state" : "IA" } +{ "_id" : "52257", "city" : "LUZERNE", "loc" : [ -92.179334, 41.90614 ], "pop" : 110, "state" : "IA" } +{ "_id" : "52301", "city" : "MARENGO", "loc" : [ -92.07204900000001, 41.786286 ], "pop" : 4856, "state" : "IA" } +{ "_id" : "52302", "city" : "MARION", "loc" : [ -91.59413499999999, 42.041095 ], "pop" : 23227, "state" : "IA" } +{ "_id" : "52305", "city" : "MARTELLE", "loc" : [ -91.321703, 42.003512 ], "pop" : 716, "state" : "IA" } +{ "_id" : "52306", "city" : "MECHANICSVILLE", "loc" : [ -91.27637, 41.903906 ], "pop" : 1516, "state" : "IA" } +{ "_id" : "52307", "city" : "MIDDLE AMANA", "loc" : [ -91.882696, 41.799737 ], "pop" : 902, "state" : "IA" } +{ "_id" : "52308", "city" : "MILLERSBURG", "loc" : [ -92.160843, 41.575099 ], "pop" : 223, "state" : "IA" } +{ "_id" : "52309", "city" : "MONMOUTH", "loc" : [ -90.878551, 42.07716 ], "pop" : 304, "state" : "IA" } +{ "_id" : "52310", "city" : "MONTICELLO", "loc" : [ -91.19890100000001, 42.232591 ], "pop" : 5549, "state" : "IA" } +{ "_id" : "52313", "city" : "MOUNT AUBURN", "loc" : [ -92.159485, 42.255395 ], "pop" : 784, "state" : "IA" } +{ "_id" : "52314", "city" : "MOUNT VERNON", "loc" : [ -91.42737099999999, 41.928741 ], "pop" : 4874, "state" : "IA" } +{ "_id" : "52315", "city" : "NEWHALL", "loc" : [ -91.97788799999999, 41.992685 ], "pop" : 1216, "state" : "IA" } +{ "_id" : "52316", "city" : "NORTH ENGLISH", "loc" : [ -92.089291, 41.524128 ], "pop" : 1287, "state" : "IA" } +{ "_id" : "52317", "city" : "NORTH LIBERTY", "loc" : [ -91.60612, 41.744318 ], "pop" : 3241, "state" : "IA" } +{ "_id" : "52318", "city" : "NORWAY", "loc" : [ -91.89197, 41.899176 ], "pop" : 1317, "state" : "IA" } +{ "_id" : "52320", "city" : "OLIN", "loc" : [ -91.14092599999999, 41.995423 ], "pop" : 1427, "state" : "IA" } +{ "_id" : "52321", "city" : "ONSLOW", "loc" : [ -90.97305, 42.123509 ], "pop" : 322, "state" : "IA" } +{ "_id" : "52322", "city" : "OXFORD", "loc" : [ -91.772418, 41.650687 ], "pop" : 3141, "state" : "IA" } +{ "_id" : "52323", "city" : "OXFORD JUNCTION", "loc" : [ -90.954341, 41.985382 ], "pop" : 909, "state" : "IA" } +{ "_id" : "52324", "city" : "PALO", "loc" : [ -91.78770299999999, 42.036496 ], "pop" : 1528, "state" : "IA" } +{ "_id" : "52325", "city" : "PARNELL", "loc" : [ -92.00515900000001, 41.570161 ], "pop" : 499, "state" : "IA" } +{ "_id" : "52326", "city" : "QUASQUETON", "loc" : [ -91.76795, 42.395551 ], "pop" : 834, "state" : "IA" } +{ "_id" : "52327", "city" : "RIVERSIDE", "loc" : [ -91.57414, 41.475792 ], "pop" : 1514, "state" : "IA" } +{ "_id" : "52328", "city" : "ROBINS", "loc" : [ -91.664841, 42.073092 ], "pop" : 877, "state" : "IA" } +{ "_id" : "52329", "city" : "ROWLEY", "loc" : [ -91.787543, 42.343449 ], "pop" : 1393, "state" : "IA" } +{ "_id" : "52330", "city" : "RYAN", "loc" : [ -91.484838, 42.343643 ], "pop" : 1201, "state" : "IA" } +{ "_id" : "52331", "city" : "SCOTCH GROVE", "loc" : [ -91.083682, 42.164441 ], "pop" : 447, "state" : "IA" } +{ "_id" : "52332", "city" : "SHELLSBURG", "loc" : [ -91.874568, 42.084829 ], "pop" : 1463, "state" : "IA" } +{ "_id" : "52333", "city" : "SOLON", "loc" : [ -91.50860900000001, 41.809913 ], "pop" : 2894, "state" : "IA" } +{ "_id" : "52334", "city" : "SOUTH AMANA", "loc" : [ -91.92626, 41.757609 ], "pop" : 45, "state" : "IA" } +{ "_id" : "52335", "city" : "SOUTH ENGLISH", "loc" : [ -92.102557, 41.46214 ], "pop" : 502, "state" : "IA" } +{ "_id" : "52336", "city" : "SPRINGVILLE", "loc" : [ -91.43935, 42.060741 ], "pop" : 2011, "state" : "IA" } +{ "_id" : "52337", "city" : "STANWOOD", "loc" : [ -91.166202, 41.896318 ], "pop" : 970, "state" : "IA" } +{ "_id" : "52338", "city" : "SWISHER", "loc" : [ -91.67391600000001, 41.826843 ], "pop" : 3101, "state" : "IA" } +{ "_id" : "52339", "city" : "TAMA", "loc" : [ -92.580049, 41.961642 ], "pop" : 3242, "state" : "IA" } +{ "_id" : "52341", "city" : "TODDVILLE", "loc" : [ -91.728981, 42.103932 ], "pop" : 1337, "state" : "IA" } +{ "_id" : "52342", "city" : "TOLEDO", "loc" : [ -92.56620599999999, 42.007696 ], "pop" : 3891, "state" : "IA" } +{ "_id" : "52343", "city" : "TORONTO", "loc" : [ -90.79388899999999, 41.89709 ], "pop" : 660, "state" : "IA" } +{ "_id" : "52346", "city" : "VAN HORNE", "loc" : [ -92.104617, 42.019394 ], "pop" : 1215, "state" : "IA" } +{ "_id" : "52347", "city" : "VICTOR", "loc" : [ -92.284172, 41.729004 ], "pop" : 1092, "state" : "IA" } +{ "_id" : "52348", "city" : "VINING", "loc" : [ -92.369687, 41.979881 ], "pop" : 244, "state" : "IA" } +{ "_id" : "52349", "city" : "VINTON", "loc" : [ -91.989154, 42.174284 ], "pop" : 8276, "state" : "IA" } +{ "_id" : "52352", "city" : "WALKER", "loc" : [ -91.73017900000001, 42.272024 ], "pop" : 1706, "state" : "IA" } +{ "_id" : "52353", "city" : "WASHINGTON", "loc" : [ -91.698671, 41.301453 ], "pop" : 9381, "state" : "IA" } +{ "_id" : "52354", "city" : "WATKINS", "loc" : [ -91.99646799999999, 41.903993 ], "pop" : 485, "state" : "IA" } +{ "_id" : "52355", "city" : "WEBSTER", "loc" : [ -92.176525, 41.436408 ], "pop" : 154, "state" : "IA" } +{ "_id" : "52356", "city" : "WELLMAN", "loc" : [ -91.83995299999999, 41.470032 ], "pop" : 1904, "state" : "IA" } +{ "_id" : "52357", "city" : "WEST AMANA", "loc" : [ -91.933566, 41.802996 ], "pop" : 90, "state" : "IA" } +{ "_id" : "52358", "city" : "WEST BRANCH", "loc" : [ -91.3141, 41.672622 ], "pop" : 3533, "state" : "IA" } +{ "_id" : "52359", "city" : "WEST CHESTER", "loc" : [ -91.861858, 41.361019 ], "pop" : 500, "state" : "IA" } +{ "_id" : "52361", "city" : "WILLIAMSBURG", "loc" : [ -92.024011, 41.639308 ], "pop" : 4304, "state" : "IA" } +{ "_id" : "52362", "city" : "WYOMING", "loc" : [ -90.994024, 42.060352 ], "pop" : 884, "state" : "IA" } +{ "_id" : "52401", "city" : "CEDAR RAPIDS", "loc" : [ -91.655382, 41.9743 ], "pop" : 1924, "state" : "IA" } +{ "_id" : "52402", "city" : "CEDAR RAPIDS", "loc" : [ -91.661222, 42.018778 ], "pop" : 37211, "state" : "IA" } +{ "_id" : "52403", "city" : "CEDAR RAPIDS", "loc" : [ -91.625919, 41.984312 ], "pop" : 25064, "state" : "IA" } +{ "_id" : "52404", "city" : "CEDAR RAPIDS", "loc" : [ -91.685286, 41.952108 ], "pop" : 28262, "state" : "IA" } +{ "_id" : "52405", "city" : "CEDAR RAPIDS", "loc" : [ -91.709816, 41.980422 ], "pop" : 23685, "state" : "IA" } +{ "_id" : "52501", "city" : "HIGHLAND CENTER", "loc" : [ -92.413428, 41.015099 ], "pop" : 29462, "state" : "IA" } +{ "_id" : "52530", "city" : "AGENCY", "loc" : [ -92.316231, 40.995693 ], "pop" : 1233, "state" : "IA" } +{ "_id" : "52531", "city" : "ALBIA", "loc" : [ -92.794619, 41.028718 ], "pop" : 6397, "state" : "IA" } +{ "_id" : "52533", "city" : "BATAVIA", "loc" : [ -92.14305899999999, 40.99048 ], "pop" : 1164, "state" : "IA" } +{ "_id" : "52534", "city" : "BEACON", "loc" : [ -92.72843, 41.287133 ], "pop" : 1559, "state" : "IA" } +{ "_id" : "52535", "city" : "BIRMINGHAM", "loc" : [ -91.95343099999999, 40.862605 ], "pop" : 1023, "state" : "IA" } +{ "_id" : "52536", "city" : "BLAKESBURG", "loc" : [ -92.594037, 40.984763 ], "pop" : 1337, "state" : "IA" } +{ "_id" : "52537", "city" : "BLOOMFIELD", "loc" : [ -92.398712, 40.732368 ], "pop" : 4788, "state" : "IA" } +{ "_id" : "52538", "city" : "WEST GROVE", "loc" : [ -92.54984899999999, 40.719646 ], "pop" : 419, "state" : "IA" } +{ "_id" : "52540", "city" : "BRIGHTON", "loc" : [ -91.828351, 41.154331 ], "pop" : 1686, "state" : "IA" } +{ "_id" : "52542", "city" : "CANTRIL", "loc" : [ -92.046521, 40.654598 ], "pop" : 490, "state" : "IA" } +{ "_id" : "52543", "city" : "CEDAR", "loc" : [ -92.509021, 41.212054 ], "pop" : 242, "state" : "IA" } +{ "_id" : "52544", "city" : "CENTERVILLE", "loc" : [ -92.872826, 40.73259 ], "pop" : 7725, "state" : "IA" } +{ "_id" : "52548", "city" : "CHILLICOTHE", "loc" : [ -92.53276200000001, 41.077041 ], "pop" : 249, "state" : "IA" } +{ "_id" : "52549", "city" : "CINCINNATI", "loc" : [ -92.921898, 40.634384 ], "pop" : 793, "state" : "IA" } +{ "_id" : "52550", "city" : "DELTA", "loc" : [ -92.33591199999999, 41.316682 ], "pop" : 614, "state" : "IA" } +{ "_id" : "52551", "city" : "DOUDS", "loc" : [ -92.045222, 40.803931 ], "pop" : 15, "state" : "IA" } +{ "_id" : "52552", "city" : "DRAKESVILLE", "loc" : [ -92.505109, 40.825332 ], "pop" : 1576, "state" : "IA" } +{ "_id" : "52553", "city" : "EDDYVILLE", "loc" : [ -92.622052, 41.153266 ], "pop" : 1474, "state" : "IA" } +{ "_id" : "52554", "city" : "ELDON", "loc" : [ -92.226754, 40.92613 ], "pop" : 1603, "state" : "IA" } +{ "_id" : "52555", "city" : "EXLINE", "loc" : [ -92.826999, 40.641399 ], "pop" : 432, "state" : "IA" } +{ "_id" : "52556", "city" : "FAIRFIELD", "loc" : [ -91.957611, 41.003943 ], "pop" : 12147, "state" : "IA" } +{ "_id" : "52560", "city" : "FLORIS", "loc" : [ -92.324715, 40.859071 ], "pop" : 1087, "state" : "IA" } +{ "_id" : "52561", "city" : "FREMONT", "loc" : [ -92.43618600000001, 41.211739 ], "pop" : 835, "state" : "IA" } +{ "_id" : "52563", "city" : "HEDRICK", "loc" : [ -92.309725, 41.182578 ], "pop" : 1304, "state" : "IA" } +{ "_id" : "52565", "city" : "KEOSAUQUA", "loc" : [ -91.970434, 40.74235 ], "pop" : 2022, "state" : "IA" } +{ "_id" : "52566", "city" : "KIRKVILLE", "loc" : [ -92.46989499999999, 41.117927 ], "pop" : 670, "state" : "IA" } +{ "_id" : "52567", "city" : "LIBERTYVILLE", "loc" : [ -92.024951, 40.949863 ], "pop" : 658, "state" : "IA" } +{ "_id" : "52569", "city" : "MELROSE", "loc" : [ -93.01451400000001, 40.966466 ], "pop" : 664, "state" : "IA" } +{ "_id" : "52570", "city" : "MILTON", "loc" : [ -92.143793, 40.672143 ], "pop" : 851, "state" : "IA" } +{ "_id" : "52571", "city" : "MORAVIA", "loc" : [ -92.853358, 40.882522 ], "pop" : 1143, "state" : "IA" } +{ "_id" : "52572", "city" : "MOULTON", "loc" : [ -92.683252, 40.686617 ], "pop" : 1073, "state" : "IA" } +{ "_id" : "52573", "city" : "MOUNT STERLING", "loc" : [ -91.902663, 40.645765 ], "pop" : 249, "state" : "IA" } +{ "_id" : "52574", "city" : "MYSTIC", "loc" : [ -92.928437, 40.788268 ], "pop" : 1002, "state" : "IA" } +{ "_id" : "52575", "city" : "NUMA", "loc" : [ -93.013233, 40.674147 ], "pop" : 563, "state" : "IA" } +{ "_id" : "52576", "city" : "OLLIE", "loc" : [ -92.135366, 41.200134 ], "pop" : 631, "state" : "IA" } +{ "_id" : "52577", "city" : "OSKALOOSA", "loc" : [ -92.64393, 41.294205 ], "pop" : 14376, "state" : "IA" } +{ "_id" : "52580", "city" : "PACKWOOD", "loc" : [ -92.066389, 41.122781 ], "pop" : 862, "state" : "IA" } +{ "_id" : "52581", "city" : "PLANO", "loc" : [ -93.038554, 40.775109 ], "pop" : 414, "state" : "IA" } +{ "_id" : "52583", "city" : "PROMISE CITY", "loc" : [ -93.152654, 40.758477 ], "pop" : 370, "state" : "IA" } +{ "_id" : "52584", "city" : "PULASKI", "loc" : [ -92.25797300000001, 40.694081 ], "pop" : 442, "state" : "IA" } +{ "_id" : "52585", "city" : "RICHLAND", "loc" : [ -91.973921, 41.193905 ], "pop" : 1082, "state" : "IA" } +{ "_id" : "52586", "city" : "ROSE HILL", "loc" : [ -92.471958, 41.330918 ], "pop" : 795, "state" : "IA" } +{ "_id" : "52588", "city" : "SELMA", "loc" : [ -92.11067199999999, 40.851936 ], "pop" : 659, "state" : "IA" } +{ "_id" : "52590", "city" : "SEYMOUR", "loc" : [ -93.136826, 40.672416 ], "pop" : 1192, "state" : "IA" } +{ "_id" : "52591", "city" : "SIGOURNEY", "loc" : [ -92.201888, 41.330071 ], "pop" : 3402, "state" : "IA" } +{ "_id" : "52593", "city" : "UDELL", "loc" : [ -92.718512, 40.783573 ], "pop" : 195, "state" : "IA" } +{ "_id" : "52594", "city" : "UNIONVILLE", "loc" : [ -92.69345199999999, 40.841637 ], "pop" : 403, "state" : "IA" } +{ "_id" : "52601", "city" : "BURLINGTON", "loc" : [ -91.116972, 40.808665 ], "pop" : 30564, "state" : "IA" } +{ "_id" : "52619", "city" : "ARGYLE", "loc" : [ -91.563896, 40.565658 ], "pop" : 1899, "state" : "IA" } +{ "_id" : "52620", "city" : "BONAPARTE", "loc" : [ -91.789734, 40.714825 ], "pop" : 903, "state" : "IA" } +{ "_id" : "52621", "city" : "CRAWFORDSVILLE", "loc" : [ -91.541444, 41.209257 ], "pop" : 603, "state" : "IA" } +{ "_id" : "52623", "city" : "DANVILLE", "loc" : [ -91.314027, 40.854046 ], "pop" : 1694, "state" : "IA" } +{ "_id" : "52624", "city" : "DENMARK", "loc" : [ -91.326593, 40.748693 ], "pop" : 869, "state" : "IA" } +{ "_id" : "52625", "city" : "DONNELLSON", "loc" : [ -91.574547, 40.661171 ], "pop" : 1823, "state" : "IA" } +{ "_id" : "52626", "city" : "FARMINGTON", "loc" : [ -91.744719, 40.639715 ], "pop" : 961, "state" : "IA" } +{ "_id" : "52627", "city" : "FORT MADISON", "loc" : [ -91.33982899999999, 40.633008 ], "pop" : 14472, "state" : "IA" } +{ "_id" : "52630", "city" : "HILLSBORO", "loc" : [ -91.711938, 40.837211 ], "pop" : 213, "state" : "IA" } +{ "_id" : "52631", "city" : "HOUGHTON", "loc" : [ -91.63930000000001, 40.775001 ], "pop" : 448, "state" : "IA" } +{ "_id" : "52632", "city" : "KEOKUK", "loc" : [ -91.398234, 40.409434 ], "pop" : 13995, "state" : "IA" } +{ "_id" : "52635", "city" : "LOCKRIDGE", "loc" : [ -91.76454, 41.011867 ], "pop" : 693, "state" : "IA" } +{ "_id" : "52637", "city" : "MEDIAPOLIS", "loc" : [ -91.132142, 41.005932 ], "pop" : 3044, "state" : "IA" } +{ "_id" : "52638", "city" : "MIDDLETOWN", "loc" : [ -91.26310599999999, 40.82963 ], "pop" : 440, "state" : "IA" } +{ "_id" : "52639", "city" : "MONTROSE", "loc" : [ -91.423985, 40.513915 ], "pop" : 1857, "state" : "IA" } +{ "_id" : "52640", "city" : "MORNING SUN", "loc" : [ -91.258146, 41.098424 ], "pop" : 1165, "state" : "IA" } +{ "_id" : "52641", "city" : "MOUNT PLEASANT", "loc" : [ -91.56142699999999, 40.964573 ], "pop" : 11113, "state" : "IA" } +{ "_id" : "52644", "city" : "MOUNT UNION", "loc" : [ -91.413831, 41.03735 ], "pop" : 446, "state" : "IA" } +{ "_id" : "52645", "city" : "NEW LONDON", "loc" : [ -91.39858700000001, 40.916055 ], "pop" : 3627, "state" : "IA" } +{ "_id" : "52646", "city" : "OAKVILLE", "loc" : [ -91.04392199999999, 41.100326 ], "pop" : 709, "state" : "IA" } +{ "_id" : "52647", "city" : "OLDS", "loc" : [ -91.548413, 41.12065 ], "pop" : 711, "state" : "IA" } +{ "_id" : "52649", "city" : "SALEM", "loc" : [ -91.63362100000001, 40.856804 ], "pop" : 786, "state" : "IA" } +{ "_id" : "52650", "city" : "SPERRY", "loc" : [ -91.185047, 40.941939 ], "pop" : 700, "state" : "IA" } +{ "_id" : "52651", "city" : "STOCKPORT", "loc" : [ -91.80349699999999, 40.858933 ], "pop" : 503, "state" : "IA" } +{ "_id" : "52653", "city" : "WAPELLO", "loc" : [ -91.171921, 41.206982 ], "pop" : 4379, "state" : "IA" } +{ "_id" : "52654", "city" : "WAYLAND", "loc" : [ -91.658946, 41.144919 ], "pop" : 1626, "state" : "IA" } +{ "_id" : "52655", "city" : "WEST BURLINGTON", "loc" : [ -91.179894, 40.832081 ], "pop" : 5420, "state" : "IA" } +{ "_id" : "52656", "city" : "WEST POINT", "loc" : [ -91.439733, 40.714986 ], "pop" : 2144, "state" : "IA" } +{ "_id" : "52657", "city" : "SAINT PAUL", "loc" : [ -91.53754000000001, 40.769306 ], "pop" : 623, "state" : "IA" } +{ "_id" : "52658", "city" : "WEVER", "loc" : [ -91.226767, 40.706652 ], "pop" : 546, "state" : "IA" } +{ "_id" : "52659", "city" : "WINFIELD", "loc" : [ -91.43789200000001, 41.125693 ], "pop" : 1349, "state" : "IA" } +{ "_id" : "52660", "city" : "YARMOUTH", "loc" : [ -91.317548, 41.029687 ], "pop" : 339, "state" : "IA" } +{ "_id" : "52701", "city" : "ANDOVER", "loc" : [ -90.238584, 41.992552 ], "pop" : 856, "state" : "IA" } +{ "_id" : "52720", "city" : "ATALISSA", "loc" : [ -91.174764, 41.561443 ], "pop" : 721, "state" : "IA" } +{ "_id" : "52721", "city" : "BENNETT", "loc" : [ -90.965613, 41.735267 ], "pop" : 824, "state" : "IA" } +{ "_id" : "52722", "city" : "BETTENDORF", "loc" : [ -90.494201, 41.550865 ], "pop" : 29785, "state" : "IA" } +{ "_id" : "52726", "city" : "BLUE GRASS", "loc" : [ -90.738015, 41.511168 ], "pop" : 7536, "state" : "IA" } +{ "_id" : "52727", "city" : "BRYANT", "loc" : [ -90.338767, 41.962932 ], "pop" : 252, "state" : "IA" } +{ "_id" : "52729", "city" : "CALAMUS", "loc" : [ -90.741553, 41.811122 ], "pop" : 790, "state" : "IA" } +{ "_id" : "52730", "city" : "CAMANCHE", "loc" : [ -90.270855, 41.788636 ], "pop" : 5013, "state" : "IA" } +{ "_id" : "52731", "city" : "CHARLOTTE", "loc" : [ -90.47822600000001, 41.977859 ], "pop" : 756, "state" : "IA" } +{ "_id" : "52732", "city" : "CLINTON", "loc" : [ -90.207784, 41.851684 ], "pop" : 30723, "state" : "IA" } +{ "_id" : "52738", "city" : "COLUMBUS JUNCTIO", "loc" : [ -91.37419800000001, 41.279911 ], "pop" : 3945, "state" : "IA" } +{ "_id" : "52739", "city" : "CONESVILLE", "loc" : [ -91.346498, 41.380454 ], "pop" : 497, "state" : "IA" } +{ "_id" : "52742", "city" : "DE WITT", "loc" : [ -90.523735, 41.826726 ], "pop" : 6560, "state" : "IA" } +{ "_id" : "52745", "city" : "BIG ROCK", "loc" : [ -90.77833200000001, 41.735013 ], "pop" : 596, "state" : "IA" } +{ "_id" : "52746", "city" : "DONAHUE", "loc" : [ -90.682908, 41.709316 ], "pop" : 685, "state" : "IA" } +{ "_id" : "52747", "city" : "DURANT", "loc" : [ -90.909988, 41.614513 ], "pop" : 2416, "state" : "IA" } +{ "_id" : "52748", "city" : "ELDRIDGE", "loc" : [ -90.563379, 41.663532 ], "pop" : 6947, "state" : "IA" } +{ "_id" : "52750", "city" : "GOOSE LAKE", "loc" : [ -90.381855, 41.979898 ], "pop" : 542, "state" : "IA" } +{ "_id" : "52751", "city" : "GRAND MOUND", "loc" : [ -90.63287800000001, 41.823559 ], "pop" : 1149, "state" : "IA" } +{ "_id" : "52753", "city" : "LE CLAIRE", "loc" : [ -90.36278799999999, 41.608234 ], "pop" : 4176, "state" : "IA" } +{ "_id" : "52754", "city" : "LETTS", "loc" : [ -91.20399, 41.293027 ], "pop" : 1394, "state" : "IA" } +{ "_id" : "52755", "city" : "LONE TREE", "loc" : [ -91.436262, 41.498804 ], "pop" : 2038, "state" : "IA" } +{ "_id" : "52756", "city" : "LONG GROVE", "loc" : [ -90.55343999999999, 41.721327 ], "pop" : 2326, "state" : "IA" } +{ "_id" : "52760", "city" : "MOSCOW", "loc" : [ -91.085888, 41.564558 ], "pop" : 752, "state" : "IA" } +{ "_id" : "52761", "city" : "MUSCATINE", "loc" : [ -91.050928, 41.430378 ], "pop" : 29779, "state" : "IA" } +{ "_id" : "52765", "city" : "NEW LIBERTY", "loc" : [ -90.859922, 41.713229 ], "pop" : 615, "state" : "IA" } +{ "_id" : "52766", "city" : "NICHOLS", "loc" : [ -91.293116, 41.476634 ], "pop" : 797, "state" : "IA" } +{ "_id" : "52768", "city" : "PRINCETON", "loc" : [ -90.370574, 41.685753 ], "pop" : 1529, "state" : "IA" } +{ "_id" : "52769", "city" : "STOCKTON", "loc" : [ -90.84733199999999, 41.558327 ], "pop" : 777, "state" : "IA" } +{ "_id" : "52772", "city" : "TIPTON", "loc" : [ -91.136163, 41.756276 ], "pop" : 5751, "state" : "IA" } +{ "_id" : "52773", "city" : "WALCOTT", "loc" : [ -90.72560300000001, 41.645309 ], "pop" : 705, "state" : "IA" } +{ "_id" : "52774", "city" : "WELTON", "loc" : [ -90.606785, 41.907472 ], "pop" : 539, "state" : "IA" } +{ "_id" : "52776", "city" : "WEST LIBERTY", "loc" : [ -91.266847, 41.570055 ], "pop" : 3552, "state" : "IA" } +{ "_id" : "52777", "city" : "WHEATLAND", "loc" : [ -90.84015100000001, 41.82585 ], "pop" : 1092, "state" : "IA" } +{ "_id" : "52778", "city" : "WILTON", "loc" : [ -91.009958, 41.585801 ], "pop" : 3032, "state" : "IA" } +{ "_id" : "52802", "city" : "DAVENPORT", "loc" : [ -90.61409, 41.516358 ], "pop" : 12547, "state" : "IA" } +{ "_id" : "52803", "city" : "DAVENPORT", "loc" : [ -90.561348, 41.538509 ], "pop" : 25514, "state" : "IA" } +{ "_id" : "52804", "city" : "DAVENPORT", "loc" : [ -90.61147, 41.538603 ], "pop" : 23671, "state" : "IA" } +{ "_id" : "52806", "city" : "DAVENPORT", "loc" : [ -90.60384500000001, 41.573271 ], "pop" : 25480, "state" : "IA" } +{ "_id" : "52807", "city" : "DAVENPORT", "loc" : [ -90.540262, 41.561822 ], "pop" : 8531, "state" : "IA" } +{ "_id" : "53001", "city" : "ADELL", "loc" : [ -88.02539400000001, 43.615071 ], "pop" : 1221, "state" : "WI" } +{ "_id" : "53002", "city" : "ALLENTON", "loc" : [ -88.35390099999999, 43.468065 ], "pop" : 1449, "state" : "WI" } +{ "_id" : "53004", "city" : "BELGIUM", "loc" : [ -87.850908, 43.499465 ], "pop" : 2333, "state" : "WI" } +{ "_id" : "53005", "city" : "BROOKFIELD", "loc" : [ -88.098, 43.062173 ], "pop" : 19793, "state" : "WI" } +{ "_id" : "53006", "city" : "SOUTH BYRON", "loc" : [ -88.50972899999999, 43.610934 ], "pop" : 1842, "state" : "WI" } +{ "_id" : "53007", "city" : "BUTLER", "loc" : [ -88.071043, 43.105405 ], "pop" : 2079, "state" : "WI" } +{ "_id" : "53010", "city" : "CAMPBELLSPORT", "loc" : [ -88.27285500000001, 43.604183 ], "pop" : 6057, "state" : "WI" } +{ "_id" : "53011", "city" : "CASCADE", "loc" : [ -88.094658, 43.659106 ], "pop" : 632, "state" : "WI" } +{ "_id" : "53012", "city" : "CEDARBURG", "loc" : [ -88.00286699999999, 43.303413 ], "pop" : 17552, "state" : "WI" } +{ "_id" : "53013", "city" : "CEDAR GROVE", "loc" : [ -87.840108, 43.575076 ], "pop" : 2656, "state" : "WI" } +{ "_id" : "53014", "city" : "CHILTON", "loc" : [ -88.182689, 44.024242 ], "pop" : 7495, "state" : "WI" } +{ "_id" : "53015", "city" : "CLEVELAND", "loc" : [ -87.767314, 43.921732 ], "pop" : 2490, "state" : "WI" } +{ "_id" : "53017", "city" : "COLGATE", "loc" : [ -88.24061399999999, 43.199767 ], "pop" : 4155, "state" : "WI" } +{ "_id" : "53018", "city" : "DELAFIELD", "loc" : [ -88.397248, 43.050019 ], "pop" : 4837, "state" : "WI" } +{ "_id" : "53019", "city" : "EDEN", "loc" : [ -88.326607, 43.695878 ], "pop" : 1874, "state" : "WI" } +{ "_id" : "53020", "city" : "ELKHART LAKE", "loc" : [ -87.97667, 43.843553 ], "pop" : 4665, "state" : "WI" } +{ "_id" : "53021", "city" : "WAUBEKA", "loc" : [ -87.982243, 43.484319 ], "pop" : 3942, "state" : "WI" } +{ "_id" : "53022", "city" : "GERMANTOWN", "loc" : [ -88.116508, 43.218871 ], "pop" : 13053, "state" : "WI" } +{ "_id" : "53023", "city" : "GLENBEULAH", "loc" : [ -88.10488599999999, 43.766611 ], "pop" : 1965, "state" : "WI" } +{ "_id" : "53024", "city" : "GRAFTON", "loc" : [ -87.95208700000001, 43.323146 ], "pop" : 12526, "state" : "WI" } +{ "_id" : "53027", "city" : "HARTFORD", "loc" : [ -88.370727, 43.315749 ], "pop" : 15889, "state" : "WI" } +{ "_id" : "53029", "city" : "HARTLAND", "loc" : [ -88.344572, 43.117153 ], "pop" : 14530, "state" : "WI" } +{ "_id" : "53032", "city" : "HORICON", "loc" : [ -88.631049, 43.446859 ], "pop" : 4724, "state" : "WI" } +{ "_id" : "53033", "city" : "HUBERTUS", "loc" : [ -88.23114700000001, 43.234269 ], "pop" : 4823, "state" : "WI" } +{ "_id" : "53035", "city" : "IRON RIDGE", "loc" : [ -88.544072, 43.393415 ], "pop" : 2504, "state" : "WI" } +{ "_id" : "53036", "city" : "IXONIA", "loc" : [ -88.580567, 43.170667 ], "pop" : 2454, "state" : "WI" } +{ "_id" : "53037", "city" : "JACKSON", "loc" : [ -88.162592, 43.325243 ], "pop" : 3999, "state" : "WI" } +{ "_id" : "53038", "city" : "JOHNSON CREEK", "loc" : [ -88.783602, 43.075051 ], "pop" : 2469, "state" : "WI" } +{ "_id" : "53039", "city" : "JUNEAU", "loc" : [ -88.684517, 43.379199 ], "pop" : 5857, "state" : "WI" } +{ "_id" : "53040", "city" : "KEWASKUM", "loc" : [ -88.19253, 43.521446 ], "pop" : 6394, "state" : "WI" } +{ "_id" : "53042", "city" : "KIEL", "loc" : [ -87.995644, 43.934105 ], "pop" : 5345, "state" : "WI" } +{ "_id" : "53044", "city" : "KOHLER", "loc" : [ -87.78673000000001, 43.738096 ], "pop" : 1900, "state" : "WI" } +{ "_id" : "53045", "city" : "BROOKFIELD", "loc" : [ -88.146946, 43.066791 ], "pop" : 15412, "state" : "WI" } +{ "_id" : "53046", "city" : "LANNON", "loc" : [ -88.16386300000001, 43.149651 ], "pop" : 924, "state" : "WI" } +{ "_id" : "53048", "city" : "KNOWLES", "loc" : [ -88.441309, 43.588489 ], "pop" : 2101, "state" : "WI" } +{ "_id" : "53049", "city" : "MALONE", "loc" : [ -88.307289, 43.869002 ], "pop" : 3453, "state" : "WI" } +{ "_id" : "53050", "city" : "MAYVILLE", "loc" : [ -88.545084, 43.504496 ], "pop" : 6394, "state" : "WI" } +{ "_id" : "53051", "city" : "MENOMONEE FALLS", "loc" : [ -88.112774, 43.160174 ], "pop" : 26840, "state" : "WI" } +{ "_id" : "53057", "city" : "MOUNT CALVARY", "loc" : [ -88.23992200000001, 43.814211 ], "pop" : 1403, "state" : "WI" } +{ "_id" : "53058", "city" : "NASHOTAH", "loc" : [ -88.408913, 43.111791 ], "pop" : 2996, "state" : "WI" } +{ "_id" : "53059", "city" : "NEOSHO", "loc" : [ -88.520482, 43.297841 ], "pop" : 2051, "state" : "WI" } +{ "_id" : "53061", "city" : "NEW HOLSTEIN", "loc" : [ -88.091083, 43.944639 ], "pop" : 5536, "state" : "WI" } +{ "_id" : "53063", "city" : "NEWTON", "loc" : [ -87.784764, 43.983621 ], "pop" : 1394, "state" : "WI" } +{ "_id" : "53065", "city" : "OAKFIELD", "loc" : [ -88.55691899999999, 43.686371 ], "pop" : 2377, "state" : "WI" } +{ "_id" : "53066", "city" : "OCONOMOWOC", "loc" : [ -88.48622899999999, 43.109497 ], "pop" : 24795, "state" : "WI" } +{ "_id" : "53069", "city" : "OKAUCHEE", "loc" : [ -88.432287, 43.113011 ], "pop" : 848, "state" : "WI" } +{ "_id" : "53070", "city" : "OOSTBURG", "loc" : [ -87.796955, 43.622939 ], "pop" : 3916, "state" : "WI" } +{ "_id" : "53072", "city" : "PEWAUKEE", "loc" : [ -88.27292199999999, 43.078777 ], "pop" : 13337, "state" : "WI" } +{ "_id" : "53073", "city" : "PLYMOUTH", "loc" : [ -87.977906, 43.75258 ], "pop" : 11811, "state" : "WI" } +{ "_id" : "53074", "city" : "PORT WASHINGTON", "loc" : [ -87.879659, 43.395463 ], "pop" : 10829, "state" : "WI" } +{ "_id" : "53075", "city" : "RANDOM LAKE", "loc" : [ -87.98155300000001, 43.567206 ], "pop" : 3299, "state" : "WI" } +{ "_id" : "53076", "city" : "RICHFIELD", "loc" : [ -88.215467, 43.273925 ], "pop" : 2810, "state" : "WI" } +{ "_id" : "53078", "city" : "RUBICON", "loc" : [ -88.452793, 43.312144 ], "pop" : 1023, "state" : "WI" } +{ "_id" : "53079", "city" : "SAINT CLOUD", "loc" : [ -88.184482, 43.807431 ], "pop" : 1524, "state" : "WI" } +{ "_id" : "53080", "city" : "SAUKVILLE", "loc" : [ -87.956765, 43.391265 ], "pop" : 5460, "state" : "WI" } +{ "_id" : "53081", "city" : "SHEBOYGAN", "loc" : [ -87.724667, 43.740981 ], "pop" : 42246, "state" : "WI" } +{ "_id" : "53083", "city" : "HOWARDS GROVE", "loc" : [ -87.748552, 43.788609 ], "pop" : 17004, "state" : "WI" } +{ "_id" : "53085", "city" : "SHEBOYGAN FALLS", "loc" : [ -87.82422800000001, 43.726598 ], "pop" : 9457, "state" : "WI" } +{ "_id" : "53086", "city" : "SLINGER", "loc" : [ -88.282377, 43.332211 ], "pop" : 4671, "state" : "WI" } +{ "_id" : "53089", "city" : "SUSSEX", "loc" : [ -88.227064, 43.144059 ], "pop" : 11913, "state" : "WI" } +{ "_id" : "53091", "city" : "THERESA", "loc" : [ -88.447766, 43.504477 ], "pop" : 1555, "state" : "WI" } +{ "_id" : "53092", "city" : "MEQUON", "loc" : [ -87.959357, 43.225145 ], "pop" : 22294, "state" : "WI" } +{ "_id" : "53093", "city" : "WALDO", "loc" : [ -87.97217000000001, 43.657087 ], "pop" : 2471, "state" : "WI" } +{ "_id" : "53094", "city" : "WATERTOWN", "loc" : [ -88.71850999999999, 43.192971 ], "pop" : 25240, "state" : "WI" } +{ "_id" : "53095", "city" : "WEST BEND", "loc" : [ -88.184549, 43.422444 ], "pop" : 38743, "state" : "WI" } +{ "_id" : "53103", "city" : "BIG BEND", "loc" : [ -88.212182, 42.888463 ], "pop" : 4274, "state" : "WI" } +{ "_id" : "53104", "city" : "BRISTOL", "loc" : [ -88.04777900000001, 42.532525 ], "pop" : 4514, "state" : "WI" } +{ "_id" : "53105", "city" : "BURLINGTON", "loc" : [ -88.274886, 42.666034 ], "pop" : 23978, "state" : "WI" } +{ "_id" : "53108", "city" : "CALEDONIA", "loc" : [ -87.92278, 42.829473 ], "pop" : 2453, "state" : "WI" } +{ "_id" : "53110", "city" : "CUDAHY", "loc" : [ -87.861983, 42.948976 ], "pop" : 18659, "state" : "WI" } +{ "_id" : "53114", "city" : "DARIEN", "loc" : [ -88.714217, 42.6435 ], "pop" : 3954, "state" : "WI" } +{ "_id" : "53115", "city" : "DELAVAN", "loc" : [ -88.627717, 42.622715 ], "pop" : 9967, "state" : "WI" } +{ "_id" : "53118", "city" : "DOUSMAN", "loc" : [ -88.456754, 42.98506 ], "pop" : 5699, "state" : "WI" } +{ "_id" : "53119", "city" : "EAGLE", "loc" : [ -88.46742, 42.880942 ], "pop" : 3129, "state" : "WI" } +{ "_id" : "53120", "city" : "EAST TROY", "loc" : [ -88.409215, 42.803531 ], "pop" : 8712, "state" : "WI" } +{ "_id" : "53121", "city" : "ELKHORN", "loc" : [ -88.546209, 42.700928 ], "pop" : 11680, "state" : "WI" } +{ "_id" : "53122", "city" : "ELM GROVE", "loc" : [ -88.085374, 43.047943 ], "pop" : 6394, "state" : "WI" } +{ "_id" : "53125", "city" : "FONTANA", "loc" : [ -88.56842399999999, 42.542928 ], "pop" : 1697, "state" : "WI" } +{ "_id" : "53126", "city" : "FRANKSVILLE", "loc" : [ -87.987273, 42.785892 ], "pop" : 6685, "state" : "WI" } +{ "_id" : "53128", "city" : "GENOA CITY", "loc" : [ -88.348456, 42.532276 ], "pop" : 5027, "state" : "WI" } +{ "_id" : "53129", "city" : "GREENDALE", "loc" : [ -87.994277, 42.937293 ], "pop" : 15109, "state" : "WI" } +{ "_id" : "53130", "city" : "HALES CORNERS", "loc" : [ -88.05029999999999, 42.941034 ], "pop" : 7643, "state" : "WI" } +{ "_id" : "53132", "city" : "FRANKLIN", "loc" : [ -88.008582, 42.901728 ], "pop" : 21840, "state" : "WI" } +{ "_id" : "53137", "city" : "HELENVILLE", "loc" : [ -88.726887, 43.01007 ], "pop" : 1440, "state" : "WI" } +{ "_id" : "53139", "city" : "KANSASVILLE", "loc" : [ -88.118037, 42.701246 ], "pop" : 2911, "state" : "WI" } +{ "_id" : "53140", "city" : "KENOSHA", "loc" : [ -87.829945, 42.605228 ], "pop" : 28062, "state" : "WI" } +{ "_id" : "53142", "city" : "KENOSHA", "loc" : [ -87.870526, 42.556038 ], "pop" : 28495, "state" : "WI" } +{ "_id" : "53143", "city" : "KENOSHA", "loc" : [ -87.83005300000001, 42.561726 ], "pop" : 26551, "state" : "WI" } +{ "_id" : "53144", "city" : "KENOSHA", "loc" : [ -87.876171, 42.605788 ], "pop" : 18824, "state" : "WI" } +{ "_id" : "53146", "city" : "NEW BERLIN", "loc" : [ -88.15527400000001, 42.97397 ], "pop" : 8149, "state" : "WI" } +{ "_id" : "53147", "city" : "LAKE GENEVA", "loc" : [ -88.45537899999999, 42.588111 ], "pop" : 11183, "state" : "WI" } +{ "_id" : "53149", "city" : "MUKWONAGO", "loc" : [ -88.345116, 42.882054 ], "pop" : 12846, "state" : "WI" } +{ "_id" : "53150", "city" : "MUSKEGO", "loc" : [ -88.12141099999999, 42.904651 ], "pop" : 17098, "state" : "WI" } +{ "_id" : "53151", "city" : "NEW BERLIN", "loc" : [ -88.09464199999999, 42.982151 ], "pop" : 25731, "state" : "WI" } +{ "_id" : "53153", "city" : "NORTH PRAIRIE", "loc" : [ -88.394988, 42.938501 ], "pop" : 1732, "state" : "WI" } +{ "_id" : "53154", "city" : "OAK CREEK", "loc" : [ -87.90266099999999, 42.88916 ], "pop" : 19513, "state" : "WI" } +{ "_id" : "53156", "city" : "PALMYRA", "loc" : [ -88.590255, 42.879263 ], "pop" : 2748, "state" : "WI" } +{ "_id" : "53168", "city" : "SALEM", "loc" : [ -88.128731, 42.570922 ], "pop" : 8746, "state" : "WI" } +{ "_id" : "53172", "city" : "SOUTH MILWAUKEE", "loc" : [ -87.864626, 42.910468 ], "pop" : 20958, "state" : "WI" } +{ "_id" : "53177", "city" : "STURTEVANT", "loc" : [ -87.903082, 42.69673 ], "pop" : 4774, "state" : "WI" } +{ "_id" : "53178", "city" : "SULLIVAN", "loc" : [ -88.602569, 42.99825 ], "pop" : 3381, "state" : "WI" } +{ "_id" : "53179", "city" : "TREVOR", "loc" : [ -88.13869, 42.520112 ], "pop" : 3527, "state" : "WI" } +{ "_id" : "53181", "city" : "TWIN LAKES", "loc" : [ -88.257318, 42.523173 ], "pop" : 6103, "state" : "WI" } +{ "_id" : "53182", "city" : "UNION GROVE", "loc" : [ -88.03900400000001, 42.689643 ], "pop" : 6233, "state" : "WI" } +{ "_id" : "53183", "city" : "WALES", "loc" : [ -88.378742, 43.008787 ], "pop" : 3171, "state" : "WI" } +{ "_id" : "53184", "city" : "WALWORTH", "loc" : [ -88.602738, 42.535005 ], "pop" : 2831, "state" : "WI" } +{ "_id" : "53185", "city" : "WIND LAKE", "loc" : [ -88.19335, 42.796882 ], "pop" : 11362, "state" : "WI" } +{ "_id" : "53186", "city" : "WAUKESHA", "loc" : [ -88.219559, 42.999304 ], "pop" : 46445, "state" : "WI" } +{ "_id" : "53188", "city" : "WAUKESHA", "loc" : [ -88.27048000000001, 43.012848 ], "pop" : 33794, "state" : "WI" } +{ "_id" : "53190", "city" : "WHITEWATER", "loc" : [ -88.742864, 42.827174 ], "pop" : 16723, "state" : "WI" } +{ "_id" : "53191", "city" : "WILLIAMS BAY", "loc" : [ -88.54308899999999, 42.576678 ], "pop" : 2208, "state" : "WI" } +{ "_id" : "53202", "city" : "MILWAUKEE", "loc" : [ -87.896792, 43.050601 ], "pop" : 20178, "state" : "WI" } +{ "_id" : "53203", "city" : "MILWAUKEE", "loc" : [ -87.915375, 43.040299 ], "pop" : 456, "state" : "WI" } +{ "_id" : "53204", "city" : "MILWAUKEE", "loc" : [ -87.931685, 43.015778 ], "pop" : 41978, "state" : "WI" } +{ "_id" : "53205", "city" : "MILWAUKEE", "loc" : [ -87.935332, 43.052841 ], "pop" : 14708, "state" : "WI" } +{ "_id" : "53206", "city" : "MILWAUKEE", "loc" : [ -87.934714, 43.075324 ], "pop" : 42009, "state" : "WI" } +{ "_id" : "53207", "city" : "BAY VIEW", "loc" : [ -87.894598, 42.981405 ], "pop" : 49199, "state" : "WI" } +{ "_id" : "53208", "city" : "MILWAUKEE", "loc" : [ -87.96245399999999, 43.048775 ], "pop" : 42238, "state" : "WI" } +{ "_id" : "53209", "city" : "MILWAUKEE", "loc" : [ -87.947834, 43.118765 ], "pop" : 51008, "state" : "WI" } +{ "_id" : "53210", "city" : "MILWAUKEE", "loc" : [ -87.97146600000001, 43.068545 ], "pop" : 32111, "state" : "WI" } +{ "_id" : "53211", "city" : "SHOREWOOD", "loc" : [ -87.88507799999999, 43.080517 ], "pop" : 37036, "state" : "WI" } +{ "_id" : "53212", "city" : "MILWAUKEE", "loc" : [ -87.90841500000001, 43.071195 ], "pop" : 37237, "state" : "WI" } +{ "_id" : "53213", "city" : "WAUWATOSA", "loc" : [ -88.00075699999999, 43.051316 ], "pop" : 27606, "state" : "WI" } +{ "_id" : "53214", "city" : "WEST ALLIS", "loc" : [ -88.010757, 43.019113 ], "pop" : 38491, "state" : "WI" } +{ "_id" : "53215", "city" : "WEST MILWAUKEE", "loc" : [ -87.94174, 43.000411 ], "pop" : 48228, "state" : "WI" } +{ "_id" : "53216", "city" : "MILWAUKEE", "loc" : [ -87.97421799999999, 43.085868 ], "pop" : 34881, "state" : "WI" } +{ "_id" : "53217", "city" : "MILWAUKEE", "loc" : [ -87.90726100000001, 43.14086 ], "pop" : 30065, "state" : "WI" } +{ "_id" : "53218", "city" : "MILWAUKEE", "loc" : [ -87.993161, 43.11218 ], "pop" : 40443, "state" : "WI" } +{ "_id" : "53219", "city" : "MILWAUKEE", "loc" : [ -87.99436799999999, 42.995909 ], "pop" : 35271, "state" : "WI" } +{ "_id" : "53220", "city" : "GREENFIELD", "loc" : [ -87.992209, 42.968186 ], "pop" : 25819, "state" : "WI" } +{ "_id" : "53221", "city" : "MILWAUKEE", "loc" : [ -87.944734, 42.954864 ], "pop" : 35767, "state" : "WI" } +{ "_id" : "53222", "city" : "MILWAUKEE", "loc" : [ -88.02687, 43.08283 ], "pop" : 25406, "state" : "WI" } +{ "_id" : "53223", "city" : "MILWAUKEE", "loc" : [ -87.989818, 43.162374 ], "pop" : 30272, "state" : "WI" } +{ "_id" : "53224", "city" : "MILWAUKEE", "loc" : [ -88.03274399999999, 43.159415 ], "pop" : 18182, "state" : "WI" } +{ "_id" : "53225", "city" : "MILWAUKEE", "loc" : [ -88.03464, 43.115416 ], "pop" : 25395, "state" : "WI" } +{ "_id" : "53226", "city" : "WAUWATOSA", "loc" : [ -88.041386, 43.050006 ], "pop" : 19216, "state" : "WI" } +{ "_id" : "53227", "city" : "MILWAUKEE", "loc" : [ -88.036384, 42.994919 ], "pop" : 23150, "state" : "WI" } +{ "_id" : "53228", "city" : "GREENFIELD", "loc" : [ -88.034638, 42.970251 ], "pop" : 12634, "state" : "WI" } +{ "_id" : "53233", "city" : "MILWAUKEE", "loc" : [ -87.93566, 43.040738 ], "pop" : 16569, "state" : "WI" } +{ "_id" : "53402", "city" : "RACINE", "loc" : [ -87.795985, 42.772596 ], "pop" : 31959, "state" : "WI" } +{ "_id" : "53403", "city" : "RACINE", "loc" : [ -87.80137499999999, 42.706015 ], "pop" : 26329, "state" : "WI" } +{ "_id" : "53404", "city" : "RACINE", "loc" : [ -87.8053, 42.743348 ], "pop" : 17129, "state" : "WI" } +{ "_id" : "53405", "city" : "RACINE", "loc" : [ -87.823329, 42.716112 ], "pop" : 26652, "state" : "WI" } +{ "_id" : "53406", "city" : "RACINE", "loc" : [ -87.855104, 42.724162 ], "pop" : 20925, "state" : "WI" } +{ "_id" : "53502", "city" : "ALBANY", "loc" : [ -89.435695, 42.715535 ], "pop" : 1886, "state" : "WI" } +{ "_id" : "53503", "city" : "ARENA", "loc" : [ -89.938614, 43.152111 ], "pop" : 1554, "state" : "WI" } +{ "_id" : "53504", "city" : "ARGYLE", "loc" : [ -89.85983400000001, 42.695532 ], "pop" : 2048, "state" : "WI" } +{ "_id" : "53505", "city" : "AVALON", "loc" : [ -88.837142, 42.65979 ], "pop" : 373, "state" : "WI" } +{ "_id" : "53506", "city" : "AVOCA", "loc" : [ -90.288859, 43.157137 ], "pop" : 1072, "state" : "WI" } +{ "_id" : "53507", "city" : "BARNEVELD", "loc" : [ -89.904229, 43.015797 ], "pop" : 1301, "state" : "WI" } +{ "_id" : "53508", "city" : "BELLEVILLE", "loc" : [ -89.53773, 42.866906 ], "pop" : 3500, "state" : "WI" } +{ "_id" : "53510", "city" : "BELMONT", "loc" : [ -90.335881, 42.730784 ], "pop" : 1477, "state" : "WI" } +{ "_id" : "53511", "city" : "SHOPIERE", "loc" : [ -89.039897, 42.522871 ], "pop" : 46738, "state" : "WI" } +{ "_id" : "53515", "city" : "BLACK EARTH", "loc" : [ -89.738974, 43.132213 ], "pop" : 1824, "state" : "WI" } +{ "_id" : "53516", "city" : "BLANCHARDVILLE", "loc" : [ -89.85551100000001, 42.806186 ], "pop" : 1810, "state" : "WI" } +{ "_id" : "53517", "city" : "BLUE MOUNDS", "loc" : [ -89.83445500000001, 43.004964 ], "pop" : 639, "state" : "WI" } +{ "_id" : "53518", "city" : "BLUE RIVER", "loc" : [ -90.587312, 43.236567 ], "pop" : 1520, "state" : "WI" } +{ "_id" : "53520", "city" : "BRODHEAD", "loc" : [ -89.371409, 42.611074 ], "pop" : 5825, "state" : "WI" } +{ "_id" : "53521", "city" : "BROOKLYN", "loc" : [ -89.38181400000001, 42.842327 ], "pop" : 2329, "state" : "WI" } +{ "_id" : "53522", "city" : "BROWNTOWN", "loc" : [ -89.78158000000001, 42.557872 ], "pop" : 1146, "state" : "WI" } +{ "_id" : "53523", "city" : "CAMBRIDGE", "loc" : [ -89.02090099999999, 42.99176 ], "pop" : 4102, "state" : "WI" } +{ "_id" : "53525", "city" : "CLINTON", "loc" : [ -88.87047699999999, 42.553481 ], "pop" : 3627, "state" : "WI" } +{ "_id" : "53526", "city" : "COBB", "loc" : [ -90.332408, 42.966009 ], "pop" : 542, "state" : "WI" } +{ "_id" : "53527", "city" : "COTTAGE GROVE", "loc" : [ -89.20169199999999, 43.078405 ], "pop" : 4349, "state" : "WI" } +{ "_id" : "53528", "city" : "CROSS PLAINS", "loc" : [ -89.63966499999999, 43.113214 ], "pop" : 3622, "state" : "WI" } +{ "_id" : "53529", "city" : "DANE", "loc" : [ -89.51174, 43.242414 ], "pop" : 1572, "state" : "WI" } +{ "_id" : "53530", "city" : "DARLINGTON", "loc" : [ -90.110648, 42.687816 ], "pop" : 4224, "state" : "WI" } +{ "_id" : "53531", "city" : "DEERFIELD", "loc" : [ -89.08619899999999, 43.057106 ], "pop" : 2668, "state" : "WI" } +{ "_id" : "53532", "city" : "DE FOREST", "loc" : [ -89.329652, 43.235748 ], "pop" : 9321, "state" : "WI" } +{ "_id" : "53533", "city" : "DODGEVILLE", "loc" : [ -90.140433, 42.969779 ], "pop" : 5663, "state" : "WI" } +{ "_id" : "53534", "city" : "EDGERTON", "loc" : [ -89.06415699999999, 42.838605 ], "pop" : 9749, "state" : "WI" } +{ "_id" : "53536", "city" : "EVANSVILLE", "loc" : [ -89.287712, 42.773216 ], "pop" : 5986, "state" : "WI" } +{ "_id" : "53538", "city" : "FORT ATKINSON", "loc" : [ -88.846689, 42.922902 ], "pop" : 15624, "state" : "WI" } +{ "_id" : "53541", "city" : "GRATIOT", "loc" : [ -90.024344, 42.575852 ], "pop" : 1129, "state" : "WI" } +{ "_id" : "53543", "city" : "HIGHLAND", "loc" : [ -90.36501, 43.052368 ], "pop" : 1586, "state" : "WI" } +{ "_id" : "53544", "city" : "HOLLANDALE", "loc" : [ -89.91297299999999, 42.877321 ], "pop" : 591, "state" : "WI" } +{ "_id" : "53545", "city" : "JANESVILLE", "loc" : [ -89.033124, 42.691542 ], "pop" : 40339, "state" : "WI" } +{ "_id" : "53546", "city" : "JANESVILLE", "loc" : [ -89.002534, 42.668254 ], "pop" : 22324, "state" : "WI" } +{ "_id" : "53549", "city" : "JEFFERSON", "loc" : [ -88.807765, 43.000557 ], "pop" : 8540, "state" : "WI" } +{ "_id" : "53550", "city" : "JUDA", "loc" : [ -89.502608, 42.567874 ], "pop" : 1177, "state" : "WI" } +{ "_id" : "53551", "city" : "LAKE MILLS", "loc" : [ -88.913335, 43.081576 ], "pop" : 6196, "state" : "WI" } +{ "_id" : "53553", "city" : "LINDEN", "loc" : [ -90.279726, 42.918419 ], "pop" : 522, "state" : "WI" } +{ "_id" : "53554", "city" : "LIVINGSTON", "loc" : [ -90.441986, 42.904432 ], "pop" : 964, "state" : "WI" } +{ "_id" : "53555", "city" : "LODI", "loc" : [ -89.555421, 43.326964 ], "pop" : 5765, "state" : "WI" } +{ "_id" : "53556", "city" : "LONE ROCK", "loc" : [ -90.235229, 43.220773 ], "pop" : 2367, "state" : "WI" } +{ "_id" : "53557", "city" : "LOWELL", "loc" : [ -88.787263, 43.342018 ], "pop" : 231, "state" : "WI" } +{ "_id" : "53558", "city" : "MC FARLAND", "loc" : [ -89.29477300000001, 43.010651 ], "pop" : 8040, "state" : "WI" } +{ "_id" : "53559", "city" : "MARSHALL", "loc" : [ -89.07533100000001, 43.163639 ], "pop" : 4175, "state" : "WI" } +{ "_id" : "53560", "city" : "MAZOMANIE", "loc" : [ -89.763616, 43.184746 ], "pop" : 3176, "state" : "WI" } +{ "_id" : "53561", "city" : "MERRIMAC", "loc" : [ -89.632254, 43.385527 ], "pop" : 1366, "state" : "WI" } +{ "_id" : "53562", "city" : "MIDDLETON", "loc" : [ -89.50725799999999, 43.105196 ], "pop" : 16575, "state" : "WI" } +{ "_id" : "53563", "city" : "MILTON", "loc" : [ -88.953087, 42.779087 ], "pop" : 7309, "state" : "WI" } +{ "_id" : "53565", "city" : "MINERAL POINT", "loc" : [ -90.164556, 42.854696 ], "pop" : 4566, "state" : "WI" } +{ "_id" : "53566", "city" : "MONROE", "loc" : [ -89.6403, 42.599076 ], "pop" : 13720, "state" : "WI" } +{ "_id" : "53569", "city" : "MONTFORT", "loc" : [ -90.44473000000001, 42.975745 ], "pop" : 1129, "state" : "WI" } +{ "_id" : "53570", "city" : "MONTICELLO", "loc" : [ -89.608069, 42.741482 ], "pop" : 2315, "state" : "WI" } +{ "_id" : "53572", "city" : "MOUNT HOREB", "loc" : [ -89.74144800000001, 43.002022 ], "pop" : 7193, "state" : "WI" } +{ "_id" : "53573", "city" : "MUSCODA", "loc" : [ -90.456998, 43.207375 ], "pop" : 3774, "state" : "WI" } +{ "_id" : "53574", "city" : "NEW GLARUS", "loc" : [ -89.643666, 42.814344 ], "pop" : 2540, "state" : "WI" } +{ "_id" : "53575", "city" : "OREGON", "loc" : [ -89.387002, 42.929485 ], "pop" : 9719, "state" : "WI" } +{ "_id" : "53576", "city" : "ORFORDVILLE", "loc" : [ -89.253292, 42.627766 ], "pop" : 1923, "state" : "WI" } +{ "_id" : "53577", "city" : "PLAIN", "loc" : [ -90.055825, 43.292693 ], "pop" : 1292, "state" : "WI" } +{ "_id" : "53578", "city" : "PRAIRIE DU SAC", "loc" : [ -89.745233, 43.295631 ], "pop" : 4060, "state" : "WI" } +{ "_id" : "53579", "city" : "REESEVILLE", "loc" : [ -88.857117, 43.301278 ], "pop" : 2027, "state" : "WI" } +{ "_id" : "53580", "city" : "REWEY", "loc" : [ -90.38036099999999, 42.859393 ], "pop" : 601, "state" : "WI" } +{ "_id" : "53581", "city" : "GILLINGHAM", "loc" : [ -90.391378, 43.362714 ], "pop" : 10306, "state" : "WI" } +{ "_id" : "53582", "city" : "RIDGEWAY", "loc" : [ -89.988946, 43.007654 ], "pop" : 924, "state" : "WI" } +{ "_id" : "53583", "city" : "SAUK CITY", "loc" : [ -89.741777, 43.268558 ], "pop" : 5186, "state" : "WI" } +{ "_id" : "53585", "city" : "SHARON", "loc" : [ -88.726522, 42.519367 ], "pop" : 2297, "state" : "WI" } +{ "_id" : "53586", "city" : "SHULLSBURG", "loc" : [ -90.226619, 42.57856 ], "pop" : 2124, "state" : "WI" } +{ "_id" : "53587", "city" : "SOUTH WAYNE", "loc" : [ -89.88884400000001, 42.582199 ], "pop" : 1444, "state" : "WI" } +{ "_id" : "53588", "city" : "SPRING GREEN", "loc" : [ -90.06760800000001, 43.18835 ], "pop" : 3439, "state" : "WI" } +{ "_id" : "53589", "city" : "STOUGHTON", "loc" : [ -89.223989, 42.929007 ], "pop" : 15469, "state" : "WI" } +{ "_id" : "53590", "city" : "SUN PRAIRIE", "loc" : [ -89.222662, 43.186901 ], "pop" : 18776, "state" : "WI" } +{ "_id" : "53593", "city" : "VERONA", "loc" : [ -89.55224699999999, 42.999913 ], "pop" : 9932, "state" : "WI" } +{ "_id" : "53594", "city" : "WATERLOO", "loc" : [ -88.983835, 43.183171 ], "pop" : 4106, "state" : "WI" } +{ "_id" : "53597", "city" : "WAUNAKEE", "loc" : [ -89.45317, 43.181828 ], "pop" : 9691, "state" : "WI" } +{ "_id" : "53598", "city" : "WINDSOR", "loc" : [ -89.341469, 43.214121 ], "pop" : 1825, "state" : "WI" } +{ "_id" : "53703", "city" : "MADISON", "loc" : [ -89.38306799999999, 43.077535 ], "pop" : 25721, "state" : "WI" } +{ "_id" : "53704", "city" : "MADISON", "loc" : [ -89.352295, 43.120526 ], "pop" : 40639, "state" : "WI" } +{ "_id" : "53705", "city" : "MADISON", "loc" : [ -89.452823, 43.072999 ], "pop" : 29114, "state" : "WI" } +{ "_id" : "53706", "city" : "MADISON", "loc" : [ -89.409362, 43.076929 ], "pop" : 3587, "state" : "WI" } +{ "_id" : "53711", "city" : "MADISON", "loc" : [ -89.452558, 43.035644 ], "pop" : 42198, "state" : "WI" } +{ "_id" : "53713", "city" : "FITCHBURG", "loc" : [ -89.39000799999999, 43.037381 ], "pop" : 18082, "state" : "WI" } +{ "_id" : "53714", "city" : "MADISON", "loc" : [ -89.311758, 43.097735 ], "pop" : 17978, "state" : "WI" } +{ "_id" : "53715", "city" : "MADISON", "loc" : [ -89.40004500000001, 43.065287 ], "pop" : 13545, "state" : "WI" } +{ "_id" : "53716", "city" : "MONONA", "loc" : [ -89.315921, 43.067413 ], "pop" : 20296, "state" : "WI" } +{ "_id" : "53717", "city" : "MADISON", "loc" : [ -89.50798399999999, 43.073587 ], "pop" : 7675, "state" : "WI" } +{ "_id" : "53718", "city" : "MADISON", "loc" : [ -89.40733899999999, 43.152143 ], "pop" : 63, "state" : "WI" } +{ "_id" : "53719", "city" : "MADISON", "loc" : [ -89.499324, 43.03207 ], "pop" : 9669, "state" : "WI" } +{ "_id" : "53801", "city" : "BAGLEY", "loc" : [ -91.068502, 42.920734 ], "pop" : 879, "state" : "WI" } +{ "_id" : "53803", "city" : "BENTON", "loc" : [ -90.33804499999999, 42.534901 ], "pop" : 153, "state" : "WI" } +{ "_id" : "53804", "city" : "BLOOMINGTON", "loc" : [ -90.90990499999999, 42.872598 ], "pop" : 1485, "state" : "WI" } +{ "_id" : "53805", "city" : "BOSCOBEL", "loc" : [ -90.706101, 43.139327 ], "pop" : 4755, "state" : "WI" } +{ "_id" : "53806", "city" : "CASSVILLE", "loc" : [ -90.960751, 42.728791 ], "pop" : 2134, "state" : "WI" } +{ "_id" : "53807", "city" : "CUBA CITY", "loc" : [ -90.474907, 42.599073 ], "pop" : 6856, "state" : "WI" } +{ "_id" : "53809", "city" : "FENNIMORE", "loc" : [ -90.65500900000001, 42.988558 ], "pop" : 3668, "state" : "WI" } +{ "_id" : "53810", "city" : "GLEN HAVEN", "loc" : [ -91.000451, 42.820372 ], "pop" : 614, "state" : "WI" } +{ "_id" : "53811", "city" : "HAZEL GREEN", "loc" : [ -90.511782, 42.535913 ], "pop" : 3228, "state" : "WI" } +{ "_id" : "53813", "city" : "LANCASTER", "loc" : [ -90.71090599999999, 42.844469 ], "pop" : 6537, "state" : "WI" } +{ "_id" : "53816", "city" : "MOUNT HOPE", "loc" : [ -90.86648, 42.968862 ], "pop" : 737, "state" : "WI" } +{ "_id" : "53818", "city" : "PLATTEVILLE", "loc" : [ -90.485406, 42.73932 ], "pop" : 13067, "state" : "WI" } +{ "_id" : "53820", "city" : "POTOSI", "loc" : [ -90.700153, 42.6884 ], "pop" : 2845, "state" : "WI" } +{ "_id" : "53821", "city" : "PRAIRIE DU CHIEN", "loc" : [ -91.119305, 43.042649 ], "pop" : 7950, "state" : "WI" } +{ "_id" : "53825", "city" : "STITZER", "loc" : [ -90.607924, 42.92142 ], "pop" : 469, "state" : "WI" } +{ "_id" : "53826", "city" : "WAUZEKA", "loc" : [ -90.923885, 43.114264 ], "pop" : 1455, "state" : "WI" } +{ "_id" : "53827", "city" : "WOODMAN", "loc" : [ -90.824539, 43.057697 ], "pop" : 412, "state" : "WI" } +{ "_id" : "53901", "city" : "PORTAGE", "loc" : [ -89.47139, 43.550145 ], "pop" : 11280, "state" : "WI" } +{ "_id" : "53910", "city" : "ADAMS", "loc" : [ -89.82186900000001, 43.896688 ], "pop" : 2342, "state" : "WI" } +{ "_id" : "53911", "city" : "ARLINGTON", "loc" : [ -89.36308200000001, 43.326868 ], "pop" : 1329, "state" : "WI" } +{ "_id" : "53913", "city" : "BARABOO", "loc" : [ -89.746168, 43.482531 ], "pop" : 14955, "state" : "WI" } +{ "_id" : "53916", "city" : "BEAVER DAM", "loc" : [ -88.840681, 43.461574 ], "pop" : 19539, "state" : "WI" } +{ "_id" : "53919", "city" : "BRANDON", "loc" : [ -88.784099, 43.72579 ], "pop" : 2953, "state" : "WI" } +{ "_id" : "53920", "city" : "BRIGGSVILLE", "loc" : [ -89.580259, 43.675865 ], "pop" : 951, "state" : "WI" } +{ "_id" : "53922", "city" : "BURNETT", "loc" : [ -88.717606, 43.511609 ], "pop" : 909, "state" : "WI" } +{ "_id" : "53923", "city" : "CAMBRIA", "loc" : [ -89.11561399999999, 43.57239 ], "pop" : 2566, "state" : "WI" } +{ "_id" : "53924", "city" : "CAZENOVIA", "loc" : [ -90.279572, 43.498715 ], "pop" : 717, "state" : "WI" } +{ "_id" : "53925", "city" : "COLUMBUS", "loc" : [ -89.027089, 43.331494 ], "pop" : 6847, "state" : "WI" } +{ "_id" : "53926", "city" : "DALTON", "loc" : [ -89.191768, 43.67178 ], "pop" : 685, "state" : "WI" } +{ "_id" : "53929", "city" : "ELROY", "loc" : [ -90.28885699999999, 43.751616 ], "pop" : 3270, "state" : "WI" } +{ "_id" : "53930", "city" : "ENDEAVOR", "loc" : [ -89.461699, 43.696305 ], "pop" : 773, "state" : "WI" } +{ "_id" : "53932", "city" : "FALL RIVER", "loc" : [ -89.062513, 43.400838 ], "pop" : 1996, "state" : "WI" } +{ "_id" : "53933", "city" : "FOX LAKE", "loc" : [ -88.90408100000001, 43.581507 ], "pop" : 3233, "state" : "WI" } +{ "_id" : "53934", "city" : "FRIENDSHIP", "loc" : [ -89.814875, 43.989629 ], "pop" : 4859, "state" : "WI" } +{ "_id" : "53936", "city" : "GRAND MARSH", "loc" : [ -89.655663, 43.856789 ], "pop" : 1907, "state" : "WI" } +{ "_id" : "53937", "city" : "HILLPOINT", "loc" : [ -90.15879200000001, 43.395129 ], "pop" : 980, "state" : "WI" } +{ "_id" : "53939", "city" : "KINGSTON", "loc" : [ -89.131997, 43.69236 ], "pop" : 346, "state" : "WI" } +{ "_id" : "53941", "city" : "LA VALLE", "loc" : [ -90.127966, 43.569874 ], "pop" : 2383, "state" : "WI" } +{ "_id" : "53943", "city" : "LOGANVILLE", "loc" : [ -90.033688, 43.405046 ], "pop" : 877, "state" : "WI" } +{ "_id" : "53944", "city" : "LYNDON STATION", "loc" : [ -89.891543, 43.689875 ], "pop" : 2010, "state" : "WI" } +{ "_id" : "53946", "city" : "MARKESAN", "loc" : [ -89.00697099999999, 43.714015 ], "pop" : 4015, "state" : "WI" } +{ "_id" : "53947", "city" : "MARQUETTE", "loc" : [ -89.13965399999999, 43.745886 ], "pop" : 183, "state" : "WI" } +{ "_id" : "53948", "city" : "MAUSTON", "loc" : [ -90.06408500000001, 43.793383 ], "pop" : 7325, "state" : "WI" } +{ "_id" : "53949", "city" : "MONTELLO", "loc" : [ -89.35864100000001, 43.768984 ], "pop" : 4392, "state" : "WI" } +{ "_id" : "53950", "city" : "NEW LISBON", "loc" : [ -90.152407, 43.88775 ], "pop" : 3320, "state" : "WI" } +{ "_id" : "53951", "city" : "NORTH FREEDOM", "loc" : [ -89.849019, 43.410562 ], "pop" : 1858, "state" : "WI" } +{ "_id" : "53952", "city" : "OXFORD", "loc" : [ -89.563175, 43.779914 ], "pop" : 1217, "state" : "WI" } +{ "_id" : "53954", "city" : "PARDEEVILLE", "loc" : [ -89.326514, 43.533975 ], "pop" : 6321, "state" : "WI" } +{ "_id" : "53955", "city" : "POYNETTE", "loc" : [ -89.418857, 43.401342 ], "pop" : 4264, "state" : "WI" } +{ "_id" : "53956", "city" : "RANDOLPH", "loc" : [ -89.00299200000001, 43.539696 ], "pop" : 3206, "state" : "WI" } +{ "_id" : "53959", "city" : "REEDSBURG", "loc" : [ -89.995948, 43.531581 ], "pop" : 9118, "state" : "WI" } +{ "_id" : "53960", "city" : "RIO", "loc" : [ -89.23536199999999, 43.423053 ], "pop" : 2766, "state" : "WI" } +{ "_id" : "53961", "city" : "ROCK SPRINGS", "loc" : [ -89.921834, 43.468098 ], "pop" : 735, "state" : "WI" } +{ "_id" : "53963", "city" : "WAUPUN", "loc" : [ -88.737253, 43.632441 ], "pop" : 11222, "state" : "WI" } +{ "_id" : "53964", "city" : "WESTFIELD", "loc" : [ -89.502015, 43.896788 ], "pop" : 3309, "state" : "WI" } +{ "_id" : "53965", "city" : "WISCONSIN DELLS", "loc" : [ -89.76652, 43.650789 ], "pop" : 7650, "state" : "WI" } +{ "_id" : "53968", "city" : "WONEWOC", "loc" : [ -90.239357, 43.62848 ], "pop" : 3180, "state" : "WI" } +{ "_id" : "54001", "city" : "DERONDA", "loc" : [ -92.361527, 45.325238 ], "pop" : 4929, "state" : "WI" } +{ "_id" : "54002", "city" : "BALDWIN", "loc" : [ -92.365498, 44.9657 ], "pop" : 4214, "state" : "WI" } +{ "_id" : "54003", "city" : "BELDENVILLE", "loc" : [ -92.437202, 44.7721 ], "pop" : 1442, "state" : "WI" } +{ "_id" : "54004", "city" : "CLAYTON", "loc" : [ -92.13946199999999, 45.306297 ], "pop" : 2414, "state" : "WI" } +{ "_id" : "54005", "city" : "CLEAR LAKE", "loc" : [ -92.27488, 45.236481 ], "pop" : 3254, "state" : "WI" } +{ "_id" : "54006", "city" : "CUSHING", "loc" : [ -92.62413599999999, 45.560359 ], "pop" : 2750, "state" : "WI" } +{ "_id" : "54007", "city" : "DEER PARK", "loc" : [ -92.358464, 45.169046 ], "pop" : 876, "state" : "WI" } +{ "_id" : "54009", "city" : "DRESSER", "loc" : [ -92.56229999999999, 45.354585 ], "pop" : 4019, "state" : "WI" } +{ "_id" : "54011", "city" : "ELLSWORTH", "loc" : [ -92.48903799999999, 44.730191 ], "pop" : 4293, "state" : "WI" } +{ "_id" : "54012", "city" : "EMERALD", "loc" : [ -92.312786, 45.078578 ], "pop" : 630, "state" : "WI" } +{ "_id" : "54013", "city" : "GLENWOOD CITY", "loc" : [ -92.181588, 45.062339 ], "pop" : 1835, "state" : "WI" } +{ "_id" : "54014", "city" : "HAGER CITY", "loc" : [ -92.550146, 44.626969 ], "pop" : 2075, "state" : "WI" } +{ "_id" : "54015", "city" : "HAMMOND", "loc" : [ -92.447215, 44.967004 ], "pop" : 1921, "state" : "WI" } +{ "_id" : "54016", "city" : "HUDSON", "loc" : [ -92.727062, 44.984187 ], "pop" : 16136, "state" : "WI" } +{ "_id" : "54017", "city" : "NEW RICHMOND", "loc" : [ -92.551333, 45.159819 ], "pop" : 14190, "state" : "WI" } +{ "_id" : "54020", "city" : "OSCEOLA", "loc" : [ -92.697108, 45.321757 ], "pop" : 2062, "state" : "WI" } +{ "_id" : "54021", "city" : "PRESCOTT", "loc" : [ -92.753528, 44.747648 ], "pop" : 4807, "state" : "WI" } +{ "_id" : "54022", "city" : "RIVER FALLS", "loc" : [ -92.631275, 44.85501 ], "pop" : 16037, "state" : "WI" } +{ "_id" : "54023", "city" : "ROBERTS", "loc" : [ -92.55977300000001, 44.987356 ], "pop" : 2063, "state" : "WI" } +{ "_id" : "54024", "city" : "SAINT CROIX FALL", "loc" : [ -92.63837100000001, 45.413215 ], "pop" : 1640, "state" : "WI" } +{ "_id" : "54025", "city" : "SOMERSET", "loc" : [ -92.686466, 45.133064 ], "pop" : 2937, "state" : "WI" } +{ "_id" : "54026", "city" : "STAR PRAIRIE", "loc" : [ -92.55135300000001, 45.2013 ], "pop" : 40, "state" : "WI" } +{ "_id" : "54027", "city" : "WILSON", "loc" : [ -92.196538, 44.94658 ], "pop" : 1415, "state" : "WI" } +{ "_id" : "54028", "city" : "WOODVILLE", "loc" : [ -92.284803, 44.940806 ], "pop" : 1326, "state" : "WI" } +{ "_id" : "54082", "city" : "SAINT JOSEPH", "loc" : [ -92.760803, 45.070123 ], "pop" : 987, "state" : "WI" } +{ "_id" : "54101", "city" : "ABRAMS", "loc" : [ -88.057101, 44.78693 ], "pop" : 1712, "state" : "WI" } +{ "_id" : "54102", "city" : "AMBERG", "loc" : [ -87.96425600000001, 45.498878 ], "pop" : 917, "state" : "WI" } +{ "_id" : "54103", "city" : "ARMSTRONG CREEK", "loc" : [ -88.490847, 45.67261 ], "pop" : 460, "state" : "WI" } +{ "_id" : "54104", "city" : "ATHELSTANE", "loc" : [ -88.175282, 45.422819 ], "pop" : 696, "state" : "WI" } +{ "_id" : "54106", "city" : "CENTER VALLEY", "loc" : [ -88.444776, 44.485595 ], "pop" : 4859, "state" : "WI" } +{ "_id" : "54107", "city" : "NAVARINO", "loc" : [ -88.439026, 44.73794 ], "pop" : 2148, "state" : "WI" } +{ "_id" : "54110", "city" : "BRILLION", "loc" : [ -88.083337, 44.17792 ], "pop" : 4618, "state" : "WI" } +{ "_id" : "54111", "city" : "CECIL", "loc" : [ -88.41825300000001, 44.811027 ], "pop" : 2966, "state" : "WI" } +{ "_id" : "54112", "city" : "COLEMAN", "loc" : [ -88.058667, 45.072157 ], "pop" : 2828, "state" : "WI" } +{ "_id" : "54113", "city" : "COMBINED LOCKS", "loc" : [ -88.313271, 44.266581 ], "pop" : 2190, "state" : "WI" } +{ "_id" : "54114", "city" : "BEAVER", "loc" : [ -88.06126500000001, 45.254053 ], "pop" : 3395, "state" : "WI" } +{ "_id" : "54115", "city" : "DE PERE", "loc" : [ -88.080613, 44.438779 ], "pop" : 22430, "state" : "WI" } +{ "_id" : "54119", "city" : "DUNBAR", "loc" : [ -88.106669, 45.600944 ], "pop" : 838, "state" : "WI" } +{ "_id" : "54120", "city" : "FENCE", "loc" : [ -88.364873, 45.759652 ], "pop" : 362, "state" : "WI" } +{ "_id" : "54121", "city" : "FLORENCE", "loc" : [ -88.228921, 45.902724 ], "pop" : 2616, "state" : "WI" } +{ "_id" : "54123", "city" : "FOREST JUNCTION", "loc" : [ -88.15171599999999, 44.20613 ], "pop" : 395, "state" : "WI" } +{ "_id" : "54124", "city" : "GILLETT", "loc" : [ -88.32422099999999, 44.901753 ], "pop" : 3317, "state" : "WI" } +{ "_id" : "54125", "city" : "GOODMAN", "loc" : [ -88.36290099999999, 45.646895 ], "pop" : 758, "state" : "WI" } +{ "_id" : "54126", "city" : "GREENLEAF", "loc" : [ -88.027519, 44.29373 ], "pop" : 3443, "state" : "WI" } +{ "_id" : "54128", "city" : "GRESHAM", "loc" : [ -88.78873, 44.852963 ], "pop" : 1689, "state" : "WI" } +{ "_id" : "54129", "city" : "HILBERT", "loc" : [ -88.20696100000001, 44.127129 ], "pop" : 3938, "state" : "WI" } +{ "_id" : "54130", "city" : "KAUKAUNA", "loc" : [ -88.271692, 44.29561 ], "pop" : 19823, "state" : "WI" } +{ "_id" : "54135", "city" : "KESHENA", "loc" : [ -88.63568600000001, 44.914635 ], "pop" : 3588, "state" : "WI" } +{ "_id" : "54136", "city" : "KIMBERLY", "loc" : [ -88.338374, 44.27008 ], "pop" : 5406, "state" : "WI" } +{ "_id" : "54137", "city" : "KRAKOW", "loc" : [ -88.25933000000001, 44.763457 ], "pop" : 883, "state" : "WI" } +{ "_id" : "54138", "city" : "LAKEWOOD", "loc" : [ -88.50318900000001, 45.316285 ], "pop" : 626, "state" : "WI" } +{ "_id" : "54139", "city" : "STILES", "loc" : [ -88.05430800000001, 44.940494 ], "pop" : 2684, "state" : "WI" } +{ "_id" : "54140", "city" : "LITTLE CHUTE", "loc" : [ -88.311989, 44.284248 ], "pop" : 7769, "state" : "WI" } +{ "_id" : "54141", "city" : "LITTLE SUAMICO", "loc" : [ -88.02724499999999, 44.67751 ], "pop" : 3506, "state" : "WI" } +{ "_id" : "54143", "city" : "MARINETTE", "loc" : [ -87.669684, 45.087403 ], "pop" : 16297, "state" : "WI" } +{ "_id" : "54149", "city" : "MOUNTAIN", "loc" : [ -88.45828, 45.199127 ], "pop" : 1261, "state" : "WI" } +{ "_id" : "54150", "city" : "NEOPIT", "loc" : [ -88.861116, 44.987323 ], "pop" : 14, "state" : "WI" } +{ "_id" : "54151", "city" : "NIAGARA", "loc" : [ -88.03092700000001, 45.765343 ], "pop" : 4123, "state" : "WI" } +{ "_id" : "54153", "city" : "OCONTO", "loc" : [ -87.891728, 44.891359 ], "pop" : 6710, "state" : "WI" } +{ "_id" : "54154", "city" : "OCONTO FALLS", "loc" : [ -88.155528, 44.875499 ], "pop" : 4481, "state" : "WI" } +{ "_id" : "54155", "city" : "ONEIDA", "loc" : [ -88.185851, 44.516641 ], "pop" : 3674, "state" : "WI" } +{ "_id" : "54156", "city" : "PEMBINE", "loc" : [ -87.97036300000001, 45.607398 ], "pop" : 1443, "state" : "WI" } +{ "_id" : "54157", "city" : "PESHTIGO", "loc" : [ -87.729795, 45.045778 ], "pop" : 4956, "state" : "WI" } +{ "_id" : "54159", "city" : "PORTERFIELD", "loc" : [ -87.80624299999999, 45.193399 ], "pop" : 1974, "state" : "WI" } +{ "_id" : "54161", "city" : "POUND", "loc" : [ -88.13962100000001, 45.127317 ], "pop" : 2084, "state" : "WI" } +{ "_id" : "54162", "city" : "PULASKI", "loc" : [ -88.263447, 44.66112 ], "pop" : 6933, "state" : "WI" } +{ "_id" : "54165", "city" : "SEYMOUR", "loc" : [ -88.317243, 44.509096 ], "pop" : 5744, "state" : "WI" } +{ "_id" : "54166", "city" : "SHAWANO", "loc" : [ -88.603599, 44.785133 ], "pop" : 13367, "state" : "WI" } +{ "_id" : "54170", "city" : "SHIOCTON", "loc" : [ -88.556236, 44.497202 ], "pop" : 3708, "state" : "WI" } +{ "_id" : "54171", "city" : "SOBIESKI", "loc" : [ -88.10760500000001, 44.710495 ], "pop" : 1644, "state" : "WI" } +{ "_id" : "54174", "city" : "SURING", "loc" : [ -88.36276700000001, 45.018551 ], "pop" : 2591, "state" : "WI" } +{ "_id" : "54175", "city" : "TOWNSEND", "loc" : [ -88.610743, 45.314819 ], "pop" : 729, "state" : "WI" } +{ "_id" : "54176", "city" : "UNDERHILL", "loc" : [ -88.168898, 44.731836 ], "pop" : 69, "state" : "WI" } +{ "_id" : "54177", "city" : "WAUSAUKEE", "loc" : [ -87.90987699999999, 45.349507 ], "pop" : 2875, "state" : "WI" } +{ "_id" : "54180", "city" : "WRIGHTSTOWN", "loc" : [ -88.121769, 44.338377 ], "pop" : 2359, "state" : "WI" } +{ "_id" : "54201", "city" : "ALGOMA", "loc" : [ -87.457792, 44.610051 ], "pop" : 5387, "state" : "WI" } +{ "_id" : "54202", "city" : "BAILEYS HARBOR", "loc" : [ -87.167626, 45.056549 ], "pop" : 1167, "state" : "WI" } +{ "_id" : "54204", "city" : "BRUSSELS", "loc" : [ -87.62251999999999, 44.747558 ], "pop" : 1785, "state" : "WI" } +{ "_id" : "54205", "city" : "CASCO", "loc" : [ -87.623122, 44.58328 ], "pop" : 2066, "state" : "WI" } +{ "_id" : "54206", "city" : "CATO", "loc" : [ -87.864688, 44.148521 ], "pop" : 1097, "state" : "WI" } +{ "_id" : "54208", "city" : "DENMARK", "loc" : [ -87.82703600000001, 44.359392 ], "pop" : 3968, "state" : "WI" } +{ "_id" : "54209", "city" : "EGG HARBOR", "loc" : [ -87.28052099999999, 45.010039 ], "pop" : 738, "state" : "WI" } +{ "_id" : "54210", "city" : "ELLISON BAY", "loc" : [ -87.051209, 45.257206 ], "pop" : 804, "state" : "WI" } +{ "_id" : "54212", "city" : "FISH CREEK", "loc" : [ -87.20643200000001, 45.11554 ], "pop" : 1200, "state" : "WI" } +{ "_id" : "54213", "city" : "FORESTVILLE", "loc" : [ -87.49283200000001, 44.696863 ], "pop" : 1680, "state" : "WI" } +{ "_id" : "54214", "city" : "FRANCIS CREEK", "loc" : [ -87.720007, 44.199964 ], "pop" : 562, "state" : "WI" } +{ "_id" : "54215", "city" : "KELLNERSVILLE", "loc" : [ -87.803596, 44.22493 ], "pop" : 350, "state" : "WI" } +{ "_id" : "54216", "city" : "KEWAUNEE", "loc" : [ -87.559442, 44.440143 ], "pop" : 6262, "state" : "WI" } +{ "_id" : "54217", "city" : "LUXEMBURG", "loc" : [ -87.71560599999999, 44.550612 ], "pop" : 5188, "state" : "WI" } +{ "_id" : "54220", "city" : "MANITOWOC", "loc" : [ -87.682303, 44.097122 ], "pop" : 39178, "state" : "WI" } +{ "_id" : "54227", "city" : "MARIBEL", "loc" : [ -87.805482, 44.285151 ], "pop" : 2251, "state" : "WI" } +{ "_id" : "54228", "city" : "MISHICOT", "loc" : [ -87.64470300000001, 44.260942 ], "pop" : 3245, "state" : "WI" } +{ "_id" : "54229", "city" : "NEW FRANKEN", "loc" : [ -87.823482, 44.559193 ], "pop" : 2640, "state" : "WI" } +{ "_id" : "54230", "city" : "REEDSVILLE", "loc" : [ -87.96602799999999, 44.157566 ], "pop" : 3073, "state" : "WI" } +{ "_id" : "54232", "city" : "SAINT NAZIANZ", "loc" : [ -87.922906, 44.006425 ], "pop" : 680, "state" : "WI" } +{ "_id" : "54234", "city" : "SISTER BAY", "loc" : [ -87.113865, 45.187544 ], "pop" : 1376, "state" : "WI" } +{ "_id" : "54235", "city" : "STURGEON BAY", "loc" : [ -87.375311, 44.84384 ], "pop" : 16149, "state" : "WI" } +{ "_id" : "54241", "city" : "TWO RIVERS", "loc" : [ -87.585504, 44.166008 ], "pop" : 16768, "state" : "WI" } +{ "_id" : "54245", "city" : "VALDERS", "loc" : [ -87.88118299999999, 44.041977 ], "pop" : 2056, "state" : "WI" } +{ "_id" : "54246", "city" : "WASHINGTON ISLAN", "loc" : [ -86.913664, 45.374042 ], "pop" : 623, "state" : "WI" } +{ "_id" : "54247", "city" : "WHITELAW", "loc" : [ -87.82669799999999, 44.157269 ], "pop" : 1402, "state" : "WI" } +{ "_id" : "54301", "city" : "ALLOUEZ", "loc" : [ -88.016868, 44.485313 ], "pop" : 25108, "state" : "WI" } +{ "_id" : "54302", "city" : "GREEN BAY", "loc" : [ -87.977136, 44.502508 ], "pop" : 27273, "state" : "WI" } +{ "_id" : "54303", "city" : "HOWARD", "loc" : [ -88.04526199999999, 44.530146 ], "pop" : 27046, "state" : "WI" } +{ "_id" : "54304", "city" : "ASHWAUBENON", "loc" : [ -88.066799, 44.505525 ], "pop" : 31339, "state" : "WI" } +{ "_id" : "54311", "city" : "GREEN BAY", "loc" : [ -87.92668500000001, 44.491405 ], "pop" : 19373, "state" : "WI" } +{ "_id" : "54313", "city" : "GREEN BAY", "loc" : [ -88.102054, 44.546289 ], "pop" : 23360, "state" : "WI" } +{ "_id" : "54401", "city" : "WAUSAU", "loc" : [ -89.633955, 44.963433 ], "pop" : 51083, "state" : "WI" } +{ "_id" : "54405", "city" : "ABBOTSFORD", "loc" : [ -90.29943799999999, 44.964057 ], "pop" : 2480, "state" : "WI" } +{ "_id" : "54406", "city" : "AMHERST", "loc" : [ -89.303482, 44.423052 ], "pop" : 2885, "state" : "WI" } +{ "_id" : "54407", "city" : "AMHERST JUNCTION", "loc" : [ -89.303754, 44.506458 ], "pop" : 1448, "state" : "WI" } +{ "_id" : "54408", "city" : "ANIWA", "loc" : [ -89.268254, 45.01039 ], "pop" : 1510, "state" : "WI" } +{ "_id" : "54409", "city" : "ANTIGO", "loc" : [ -89.14187099999999, 45.131362 ], "pop" : 13087, "state" : "WI" } +{ "_id" : "54410", "city" : "ARPIN", "loc" : [ -90.037049, 44.54194 ], "pop" : 2301, "state" : "WI" } +{ "_id" : "54411", "city" : "HAMBURG", "loc" : [ -90.062612, 45.032037 ], "pop" : 4263, "state" : "WI" } +{ "_id" : "54412", "city" : "AUBURNDALE", "loc" : [ -90.013577, 44.637836 ], "pop" : 1667, "state" : "WI" } +{ "_id" : "54413", "city" : "BABCOCK", "loc" : [ -90.098574, 44.303064 ], "pop" : 409, "state" : "WI" } +{ "_id" : "54414", "city" : "BIRNAMWOOD", "loc" : [ -89.212433, 44.926896 ], "pop" : 2464, "state" : "WI" } +{ "_id" : "54416", "city" : "BOWLER", "loc" : [ -88.976071, 44.933667 ], "pop" : 2777, "state" : "WI" } +{ "_id" : "54418", "city" : "BRYANT", "loc" : [ -88.99832499999999, 45.202962 ], "pop" : 1029, "state" : "WI" } +{ "_id" : "54419", "city" : "CHELSEA", "loc" : [ -90.303685, 45.288166 ], "pop" : 122, "state" : "WI" } +{ "_id" : "54420", "city" : "CHILI", "loc" : [ -90.35995200000001, 44.630135 ], "pop" : 728, "state" : "WI" } +{ "_id" : "54421", "city" : "COLBY", "loc" : [ -90.314432, 44.911651 ], "pop" : 3621, "state" : "WI" } +{ "_id" : "54422", "city" : "CURTISS", "loc" : [ -90.45922299999999, 44.960186 ], "pop" : 1111, "state" : "WI" } +{ "_id" : "54423", "city" : "CUSTER", "loc" : [ -89.41527499999999, 44.56622 ], "pop" : 2010, "state" : "WI" } +{ "_id" : "54424", "city" : "DEERBROOK", "loc" : [ -89.187257, 45.236791 ], "pop" : 902, "state" : "WI" } +{ "_id" : "54425", "city" : "DORCHESTER", "loc" : [ -90.35964800000001, 45.004192 ], "pop" : 1860, "state" : "WI" } +{ "_id" : "54426", "city" : "FENWOOD", "loc" : [ -89.998029, 44.903831 ], "pop" : 3810, "state" : "WI" } +{ "_id" : "54427", "city" : "ELAND", "loc" : [ -89.246117, 44.830888 ], "pop" : 1278, "state" : "WI" } +{ "_id" : "54428", "city" : "ELCHO", "loc" : [ -89.15157000000001, 45.440906 ], "pop" : 988, "state" : "WI" } +{ "_id" : "54430", "city" : "ELTON", "loc" : [ -88.883743, 45.156216 ], "pop" : 135, "state" : "WI" } +{ "_id" : "54433", "city" : "GILMAN", "loc" : [ -90.825672, 45.18906 ], "pop" : 1780, "state" : "WI" } +{ "_id" : "54435", "city" : "GLEASON", "loc" : [ -89.475264, 45.338428 ], "pop" : 2347, "state" : "WI" } +{ "_id" : "54436", "city" : "GRANTON", "loc" : [ -90.44838300000001, 44.560558 ], "pop" : 2072, "state" : "WI" } +{ "_id" : "54437", "city" : "GREENWOOD", "loc" : [ -90.622913, 44.740373 ], "pop" : 3029, "state" : "WI" } +{ "_id" : "54440", "city" : "HATLEY", "loc" : [ -89.377728, 44.825638 ], "pop" : 2129, "state" : "WI" } +{ "_id" : "54441", "city" : "HEWITT", "loc" : [ -90.103054, 44.643651 ], "pop" : 595, "state" : "WI" } +{ "_id" : "54442", "city" : "IRMA", "loc" : [ -89.66113799999999, 45.348483 ], "pop" : 1006, "state" : "WI" } +{ "_id" : "54443", "city" : "JUNCTION CITY", "loc" : [ -89.743758, 44.59634 ], "pop" : 2396, "state" : "WI" } +{ "_id" : "54445", "city" : "LILY", "loc" : [ -88.83845100000001, 45.318723 ], "pop" : 196, "state" : "WI" } +{ "_id" : "54446", "city" : "LOYAL", "loc" : [ -90.492238, 44.727243 ], "pop" : 3809, "state" : "WI" } +{ "_id" : "54447", "city" : "LUBLIN", "loc" : [ -90.733678, 45.073933 ], "pop" : 564, "state" : "WI" } +{ "_id" : "54448", "city" : "MARATHON", "loc" : [ -89.829948, 44.965664 ], "pop" : 5202, "state" : "WI" } +{ "_id" : "54449", "city" : "MARSHFIELD", "loc" : [ -90.17845, 44.661453 ], "pop" : 25791, "state" : "WI" } +{ "_id" : "54451", "city" : "MEDFORD", "loc" : [ -90.350306, 45.151185 ], "pop" : 10388, "state" : "WI" } +{ "_id" : "54452", "city" : "MERRILL", "loc" : [ -89.690696, 45.180924 ], "pop" : 17891, "state" : "WI" } +{ "_id" : "54454", "city" : "MILLADORE", "loc" : [ -89.88753199999999, 44.604416 ], "pop" : 1347, "state" : "WI" } +{ "_id" : "54455", "city" : "MOSINEE", "loc" : [ -89.68449099999999, 44.799736 ], "pop" : 13664, "state" : "WI" } +{ "_id" : "54456", "city" : "NEILLSVILLE", "loc" : [ -90.611197, 44.549429 ], "pop" : 4904, "state" : "WI" } +{ "_id" : "54457", "city" : "NEKOOSA", "loc" : [ -89.881394, 44.281979 ], "pop" : 7312, "state" : "WI" } +{ "_id" : "54459", "city" : "OGEMA", "loc" : [ -90.256513, 45.439187 ], "pop" : 1459, "state" : "WI" } +{ "_id" : "54460", "city" : "OWEN", "loc" : [ -90.54689999999999, 44.957817 ], "pop" : 1759, "state" : "WI" } +{ "_id" : "54462", "city" : "PEARSON", "loc" : [ -89.075824, 45.388119 ], "pop" : 679, "state" : "WI" } +{ "_id" : "54463", "city" : "PELICAN LAKE", "loc" : [ -89.181707, 45.504886 ], "pop" : 635, "state" : "WI" } +{ "_id" : "54465", "city" : "PICKEREL", "loc" : [ -88.91365, 45.356658 ], "pop" : 269, "state" : "WI" } +{ "_id" : "54466", "city" : "PITTSVILLE", "loc" : [ -90.18917399999999, 44.43747 ], "pop" : 2754, "state" : "WI" } +{ "_id" : "54467", "city" : "PLOVER", "loc" : [ -89.542805, 44.450673 ], "pop" : 6142, "state" : "WI" } +{ "_id" : "54469", "city" : "PORT EDWARDS", "loc" : [ -89.865246, 44.349705 ], "pop" : 1828, "state" : "WI" } +{ "_id" : "54470", "city" : "RIB LAKE", "loc" : [ -90.176322, 45.298376 ], "pop" : 2002, "state" : "WI" } +{ "_id" : "54471", "city" : "RINGLE", "loc" : [ -89.432845, 44.92383 ], "pop" : 1370, "state" : "WI" } +{ "_id" : "54473", "city" : "ROSHOLT", "loc" : [ -89.33563700000001, 44.662224 ], "pop" : 3147, "state" : "WI" } +{ "_id" : "54474", "city" : "ROTHSCHILD", "loc" : [ -89.61926200000001, 44.88429 ], "pop" : 3867, "state" : "WI" } +{ "_id" : "54475", "city" : "RUDOLPH", "loc" : [ -89.800252, 44.474061 ], "pop" : 1648, "state" : "WI" } +{ "_id" : "54476", "city" : "SCHOFIELD", "loc" : [ -89.581789, 44.906407 ], "pop" : 12583, "state" : "WI" } +{ "_id" : "54479", "city" : "SPENCER", "loc" : [ -90.31140600000001, 44.739148 ], "pop" : 2997, "state" : "WI" } +{ "_id" : "54480", "city" : "STETSONVILLE", "loc" : [ -90.282931, 45.07923 ], "pop" : 1241, "state" : "WI" } +{ "_id" : "54481", "city" : "STEVENS POINT", "loc" : [ -89.558764, 44.521221 ], "pop" : 38950, "state" : "WI" } +{ "_id" : "54484", "city" : "STRATFORD", "loc" : [ -90.058317, 44.789878 ], "pop" : 4201, "state" : "WI" } +{ "_id" : "54485", "city" : "SUMMIT LAKE", "loc" : [ -89.18074300000001, 45.320414 ], "pop" : 616, "state" : "WI" } +{ "_id" : "54486", "city" : "TIGERTON", "loc" : [ -89.056893, 44.729938 ], "pop" : 3310, "state" : "WI" } +{ "_id" : "54487", "city" : "TOMAHAWK", "loc" : [ -89.72726900000001, 45.496308 ], "pop" : 8130, "state" : "WI" } +{ "_id" : "54488", "city" : "UNITY", "loc" : [ -90.322074, 44.822676 ], "pop" : 1797, "state" : "WI" } +{ "_id" : "54489", "city" : "VESPER", "loc" : [ -89.982553, 44.467656 ], "pop" : 1616, "state" : "WI" } +{ "_id" : "54490", "city" : "WESTBORO", "loc" : [ -90.307194, 45.344539 ], "pop" : 766, "state" : "WI" } +{ "_id" : "54491", "city" : "WHITE LAKE", "loc" : [ -88.755489, 45.171465 ], "pop" : 1324, "state" : "WI" } +{ "_id" : "54493", "city" : "WILLARD", "loc" : [ -90.749897, 44.727378 ], "pop" : 682, "state" : "WI" } +{ "_id" : "54494", "city" : "WISCONSIN RAPIDS", "loc" : [ -89.806229, 44.375803 ], "pop" : 33296, "state" : "WI" } +{ "_id" : "54498", "city" : "WITHEE", "loc" : [ -90.604862, 44.975726 ], "pop" : 2286, "state" : "WI" } +{ "_id" : "54499", "city" : "WITTENBERG", "loc" : [ -89.166479, 44.823247 ], "pop" : 1850, "state" : "WI" } +{ "_id" : "54501", "city" : "MONICO", "loc" : [ -89.409285, 45.646718 ], "pop" : 19039, "state" : "WI" } +{ "_id" : "54511", "city" : "CAVOUR", "loc" : [ -88.888566, 45.658309 ], "pop" : 1533, "state" : "WI" } +{ "_id" : "54512", "city" : "BOULDER JUNCTION", "loc" : [ -89.632454, 46.111183 ], "pop" : 563, "state" : "WI" } +{ "_id" : "54513", "city" : "BRANTWOOD", "loc" : [ -90.11595199999999, 45.551413 ], "pop" : 540, "state" : "WI" } +{ "_id" : "54514", "city" : "BUTTERNUT", "loc" : [ -90.482114, 46.018358 ], "pop" : 2054, "state" : "WI" } +{ "_id" : "54515", "city" : "CATAWBA", "loc" : [ -90.51456399999999, 45.508123 ], "pop" : 616, "state" : "WI" } +{ "_id" : "54517", "city" : "CLAM LAKE", "loc" : [ -90.884107, 46.245675 ], "pop" : 2, "state" : "WI" } +{ "_id" : "54519", "city" : "CONOVER", "loc" : [ -89.238919, 46.043968 ], "pop" : 1039, "state" : "WI" } +{ "_id" : "54520", "city" : "CRANDON", "loc" : [ -88.911619, 45.541553 ], "pop" : 3419, "state" : "WI" } +{ "_id" : "54521", "city" : "EAGLE RIVER", "loc" : [ -89.253058, 45.916084 ], "pop" : 6726, "state" : "WI" } +{ "_id" : "54524", "city" : "FIFIELD", "loc" : [ -90.4246, 45.862148 ], "pop" : 496, "state" : "WI" } +{ "_id" : "54526", "city" : "INGRAM", "loc" : [ -90.855183, 45.488807 ], "pop" : 949, "state" : "WI" } +{ "_id" : "54527", "city" : "GLIDDEN", "loc" : [ -90.58885600000001, 46.133668 ], "pop" : 1061, "state" : "WI" } +{ "_id" : "54529", "city" : "HARSHAW", "loc" : [ -89.650346, 45.676244 ], "pop" : 854, "state" : "WI" } +{ "_id" : "54530", "city" : "HAWKINS", "loc" : [ -90.71137299999999, 45.524129 ], "pop" : 747, "state" : "WI" } +{ "_id" : "54531", "city" : "HAZELHURST", "loc" : [ -89.74783600000001, 45.77446 ], "pop" : 1057, "state" : "WI" } +{ "_id" : "54534", "city" : "HURLEY", "loc" : [ -90.19750000000001, 46.44482 ], "pop" : 2658, "state" : "WI" } +{ "_id" : "54536", "city" : "IRON BELT", "loc" : [ -90.324528, 46.395545 ], "pop" : 265, "state" : "WI" } +{ "_id" : "54537", "city" : "KENNAN", "loc" : [ -90.590987, 45.53497 ], "pop" : 628, "state" : "WI" } +{ "_id" : "54538", "city" : "LAC DU FLAMBEAU", "loc" : [ -89.890078, 45.97175 ], "pop" : 2085, "state" : "WI" } +{ "_id" : "54539", "city" : "LAKE TOMAHAWK", "loc" : [ -89.58560900000001, 45.803455 ], "pop" : 1223, "state" : "WI" } +{ "_id" : "54540", "city" : "LAND O LAKES", "loc" : [ -89.321787, 46.156305 ], "pop" : 742, "state" : "WI" } +{ "_id" : "54541", "city" : "LAONA", "loc" : [ -88.671525, 45.553416 ], "pop" : 1823, "state" : "WI" } +{ "_id" : "54542", "city" : "ALVIN", "loc" : [ -88.695308, 45.921841 ], "pop" : 550, "state" : "WI" } +{ "_id" : "54545", "city" : "MANITOWISH WATER", "loc" : [ -89.83076699999999, 46.123909 ], "pop" : 901, "state" : "WI" } +{ "_id" : "54546", "city" : "MELLEN", "loc" : [ -90.655233, 46.300659 ], "pop" : 1752, "state" : "WI" } +{ "_id" : "54547", "city" : "MERCER", "loc" : [ -90.067914, 46.169594 ], "pop" : 1321, "state" : "WI" } +{ "_id" : "54548", "city" : "MINOCQUA", "loc" : [ -89.757954, 45.871909 ], "pop" : 3793, "state" : "WI" } +{ "_id" : "54550", "city" : "PENCE", "loc" : [ -90.244195, 46.425736 ], "pop" : 1019, "state" : "WI" } +{ "_id" : "54552", "city" : "PARK FALLS", "loc" : [ -90.424648, 45.936345 ], "pop" : 5316, "state" : "WI" } +{ "_id" : "54554", "city" : "PHELPS", "loc" : [ -89.081547, 46.064481 ], "pop" : 1183, "state" : "WI" } +{ "_id" : "54555", "city" : "PHILLIPS", "loc" : [ -90.40413100000001, 45.697463 ], "pop" : 5155, "state" : "WI" } +{ "_id" : "54556", "city" : "PRENTICE", "loc" : [ -90.294217, 45.548201 ], "pop" : 1177, "state" : "WI" } +{ "_id" : "54557", "city" : "WINCHESTER", "loc" : [ -89.772795, 46.221735 ], "pop" : 735, "state" : "WI" } +{ "_id" : "54558", "city" : "SAINT GERMAIN", "loc" : [ -89.48655599999999, 45.918315 ], "pop" : 1201, "state" : "WI" } +{ "_id" : "54559", "city" : "SAXON", "loc" : [ -90.438273, 46.495855 ], "pop" : 478, "state" : "WI" } +{ "_id" : "54560", "city" : "SAYNER", "loc" : [ -89.519437, 45.986664 ], "pop" : 559, "state" : "WI" } +{ "_id" : "54562", "city" : "THREE LAKES", "loc" : [ -89.13279199999999, 45.804633 ], "pop" : 1755, "state" : "WI" } +{ "_id" : "54563", "city" : "TONY", "loc" : [ -90.98693799999999, 45.474082 ], "pop" : 814, "state" : "WI" } +{ "_id" : "54564", "city" : "TRIPOLI", "loc" : [ -89.985218, 45.581387 ], "pop" : 374, "state" : "WI" } +{ "_id" : "54565", "city" : "UPSON", "loc" : [ -90.405135, 46.376124 ], "pop" : 69, "state" : "WI" } +{ "_id" : "54566", "city" : "WABENO", "loc" : [ -88.66245600000001, 45.433172 ], "pop" : 1308, "state" : "WI" } +{ "_id" : "54568", "city" : "WOODRUFF", "loc" : [ -89.69544999999999, 45.918583 ], "pop" : 4088, "state" : "WI" } +{ "_id" : "54601", "city" : "LA CROSSE", "loc" : [ -91.217494, 43.798938 ], "pop" : 48348, "state" : "WI" } +{ "_id" : "54603", "city" : "LA CROSSE", "loc" : [ -91.248439, 43.848675 ], "pop" : 15292, "state" : "WI" } +{ "_id" : "54610", "city" : "ALMA", "loc" : [ -91.807931, 44.429437 ], "pop" : 3824, "state" : "WI" } +{ "_id" : "54611", "city" : "ALMA CENTER", "loc" : [ -90.935602, 44.445218 ], "pop" : 989, "state" : "WI" } +{ "_id" : "54612", "city" : "ARCADIA", "loc" : [ -91.480453, 44.253937 ], "pop" : 4707, "state" : "WI" } +{ "_id" : "54613", "city" : "ARKDALE", "loc" : [ -89.896215, 44.052886 ], "pop" : 1582, "state" : "WI" } +{ "_id" : "54614", "city" : "BANGOR", "loc" : [ -90.98088799999999, 43.868697 ], "pop" : 1952, "state" : "WI" } +{ "_id" : "54615", "city" : "BLACK RIVER FALL", "loc" : [ -90.84795200000001, 44.292101 ], "pop" : 8248, "state" : "WI" } +{ "_id" : "54616", "city" : "BLAIR", "loc" : [ -91.223501, 44.296843 ], "pop" : 2347, "state" : "WI" } +{ "_id" : "54617", "city" : "BLOOM CITY", "loc" : [ -90.66645800000001, 43.509034 ], "pop" : 437, "state" : "WI" } +{ "_id" : "54618", "city" : "CUTLER", "loc" : [ -90.268861, 43.936705 ], "pop" : 1613, "state" : "WI" } +{ "_id" : "54619", "city" : "CASHTON", "loc" : [ -90.761197, 43.745649 ], "pop" : 1547, "state" : "WI" } +{ "_id" : "54621", "city" : "CHASEBURG", "loc" : [ -91.07993399999999, 43.679372 ], "pop" : 550, "state" : "WI" } +{ "_id" : "54622", "city" : "WAUMANDEE", "loc" : [ -91.858677, 44.251591 ], "pop" : 2271, "state" : "WI" } +{ "_id" : "54623", "city" : "COON VALLEY", "loc" : [ -91.014338, 43.721783 ], "pop" : 1402, "state" : "WI" } +{ "_id" : "54624", "city" : "VICTORY", "loc" : [ -91.193015, 43.494707 ], "pop" : 1422, "state" : "WI" } +{ "_id" : "54625", "city" : "DODGE", "loc" : [ -91.52434100000001, 44.12886 ], "pop" : 397, "state" : "WI" } +{ "_id" : "54626", "city" : "EASTMAN", "loc" : [ -91.01927000000001, 43.19592 ], "pop" : 1064, "state" : "WI" } +{ "_id" : "54627", "city" : "ETTRICK", "loc" : [ -91.26354600000001, 44.172428 ], "pop" : 1644, "state" : "WI" } +{ "_id" : "54628", "city" : "FERRYVILLE", "loc" : [ -91.044578, 43.395857 ], "pop" : 1411, "state" : "WI" } +{ "_id" : "54629", "city" : "FOUNTAIN CITY", "loc" : [ -91.67786099999999, 44.136436 ], "pop" : 2481, "state" : "WI" } +{ "_id" : "54630", "city" : "GALESVILLE", "loc" : [ -91.358789, 44.088848 ], "pop" : 3111, "state" : "WI" } +{ "_id" : "54631", "city" : "GAYS MILLS", "loc" : [ -90.867636, 43.293639 ], "pop" : 2577, "state" : "WI" } +{ "_id" : "54632", "city" : "GENOA", "loc" : [ -91.13499899999999, 43.605134 ], "pop" : 1432, "state" : "WI" } +{ "_id" : "54634", "city" : "YUBA", "loc" : [ -90.37059499999999, 43.635009 ], "pop" : 2309, "state" : "WI" } +{ "_id" : "54635", "city" : "NORTHFIELD", "loc" : [ -91.039086, 44.397778 ], "pop" : 1513, "state" : "WI" } +{ "_id" : "54636", "city" : "HOLMEN", "loc" : [ -91.2497, 43.976125 ], "pop" : 7098, "state" : "WI" } +{ "_id" : "54638", "city" : "KENDALL", "loc" : [ -90.410691, 43.81614 ], "pop" : 1848, "state" : "WI" } +{ "_id" : "54639", "city" : "WEST LIMA", "loc" : [ -90.648257, 43.616955 ], "pop" : 3280, "state" : "WI" } +{ "_id" : "54641", "city" : "MATHER", "loc" : [ -90.295264, 44.147706 ], "pop" : 57, "state" : "WI" } +{ "_id" : "54642", "city" : "MELROSE", "loc" : [ -91.04446299999999, 44.138156 ], "pop" : 1806, "state" : "WI" } +{ "_id" : "54644", "city" : "MINDORO", "loc" : [ -91.064181, 44.02873 ], "pop" : 1157, "state" : "WI" } +{ "_id" : "54646", "city" : "NECEDAH", "loc" : [ -90.05997600000001, 44.034481 ], "pop" : 2741, "state" : "WI" } +{ "_id" : "54648", "city" : "NORWALK", "loc" : [ -90.680134, 43.812823 ], "pop" : 2360, "state" : "WI" } +{ "_id" : "54650", "city" : "ONALASKA", "loc" : [ -91.231419, 43.897392 ], "pop" : 16435, "state" : "WI" } +{ "_id" : "54651", "city" : "ONTARIO", "loc" : [ -90.62053400000001, 43.717197 ], "pop" : 1032, "state" : "WI" } +{ "_id" : "54652", "city" : "READSTOWN", "loc" : [ -90.75787200000001, 43.450791 ], "pop" : 736, "state" : "WI" } +{ "_id" : "54653", "city" : "ROCKLAND", "loc" : [ -90.948846, 43.938159 ], "pop" : 1486, "state" : "WI" } +{ "_id" : "54655", "city" : "SOLDIERS GROVE", "loc" : [ -90.766293, 43.391857 ], "pop" : 1621, "state" : "WI" } +{ "_id" : "54656", "city" : "SPARTA", "loc" : [ -90.814566, 43.954045 ], "pop" : 14151, "state" : "WI" } +{ "_id" : "54657", "city" : "STEUBEN", "loc" : [ -90.860878, 43.195464 ], "pop" : 63, "state" : "WI" } +{ "_id" : "54658", "city" : "STODDARD", "loc" : [ -91.19188, 43.691227 ], "pop" : 2116, "state" : "WI" } +{ "_id" : "54659", "city" : "TAYLOR", "loc" : [ -91.112752, 44.289855 ], "pop" : 1205, "state" : "WI" } +{ "_id" : "54660", "city" : "WYEVILLE", "loc" : [ -90.491704, 43.994833 ], "pop" : 14294, "state" : "WI" } +{ "_id" : "54661", "city" : "TREMPEALEAU", "loc" : [ -91.4282, 44.021843 ], "pop" : 2370, "state" : "WI" } +{ "_id" : "54664", "city" : "VIOLA", "loc" : [ -90.655416, 43.504758 ], "pop" : 718, "state" : "WI" } +{ "_id" : "54665", "city" : "VIROQUA", "loc" : [ -90.89386500000001, 43.54419 ], "pop" : 7071, "state" : "WI" } +{ "_id" : "54666", "city" : "WARRENS", "loc" : [ -90.496692, 44.15697 ], "pop" : 1089, "state" : "WI" } +{ "_id" : "54667", "city" : "WESTBY", "loc" : [ -90.87403, 43.663123 ], "pop" : 4290, "state" : "WI" } +{ "_id" : "54669", "city" : "WEST SALEM", "loc" : [ -91.089311, 43.906253 ], "pop" : 5244, "state" : "WI" } +{ "_id" : "54670", "city" : "WILTON", "loc" : [ -90.51618499999999, 43.832209 ], "pop" : 1188, "state" : "WI" } +{ "_id" : "54701", "city" : "EAU CLAIRE", "loc" : [ -91.487686, 44.783972 ], "pop" : 31593, "state" : "WI" } +{ "_id" : "54703", "city" : "EAU CLAIRE", "loc" : [ -91.499701, 44.827122 ], "pop" : 38400, "state" : "WI" } +{ "_id" : "54720", "city" : "ALTOONA", "loc" : [ -91.43825, 44.802142 ], "pop" : 6065, "state" : "WI" } +{ "_id" : "54721", "city" : "ARKANSAW", "loc" : [ -92.056646, 44.626659 ], "pop" : 1099, "state" : "WI" } +{ "_id" : "54722", "city" : "AUGUSTA", "loc" : [ -91.123154, 44.694737 ], "pop" : 3402, "state" : "WI" } +{ "_id" : "54723", "city" : "BAY CITY", "loc" : [ -92.446889, 44.6166 ], "pop" : 1540, "state" : "WI" } +{ "_id" : "54724", "city" : "BLOOMER", "loc" : [ -91.489974, 45.102477 ], "pop" : 6410, "state" : "WI" } +{ "_id" : "54725", "city" : "BOYCEVILLE", "loc" : [ -92.02480300000001, 45.064238 ], "pop" : 2520, "state" : "WI" } +{ "_id" : "54726", "city" : "BOYD", "loc" : [ -91.029355, 44.943737 ], "pop" : 2549, "state" : "WI" } +{ "_id" : "54727", "city" : "CADOTT", "loc" : [ -91.169884, 44.963014 ], "pop" : 4397, "state" : "WI" } +{ "_id" : "54728", "city" : "CHETEK", "loc" : [ -91.65415400000001, 45.317046 ], "pop" : 5453, "state" : "WI" } +{ "_id" : "54729", "city" : "CHIPPEWA FALLS", "loc" : [ -91.384376, 44.932202 ], "pop" : 25627, "state" : "WI" } +{ "_id" : "54730", "city" : "COLFAX", "loc" : [ -91.735737, 44.999326 ], "pop" : 4073, "state" : "WI" } +{ "_id" : "54731", "city" : "CONRATH", "loc" : [ -91.06213200000001, 45.353281 ], "pop" : 758, "state" : "WI" } +{ "_id" : "54732", "city" : "CORNELL", "loc" : [ -91.17325200000001, 45.16191 ], "pop" : 2799, "state" : "WI" } +{ "_id" : "54733", "city" : "DALLAS", "loc" : [ -91.836844, 45.254883 ], "pop" : 973, "state" : "WI" } +{ "_id" : "54734", "city" : "DOWNING", "loc" : [ -92.113384, 45.103032 ], "pop" : 1029, "state" : "WI" } +{ "_id" : "54736", "city" : "DURAND", "loc" : [ -91.92947599999999, 44.630042 ], "pop" : 3746, "state" : "WI" } +{ "_id" : "54737", "city" : "EAU GALLE", "loc" : [ -92.04081600000001, 44.721433 ], "pop" : 921, "state" : "WI" } +{ "_id" : "54738", "city" : "ELEVA", "loc" : [ -91.48036999999999, 44.598493 ], "pop" : 2291, "state" : "WI" } +{ "_id" : "54739", "city" : "ELK MOUND", "loc" : [ -91.675229, 44.866973 ], "pop" : 3539, "state" : "WI" } +{ "_id" : "54740", "city" : "ELMWOOD", "loc" : [ -92.202195, 44.756088 ], "pop" : 1759, "state" : "WI" } +{ "_id" : "54741", "city" : "FAIRCHILD", "loc" : [ -90.990568, 44.596253 ], "pop" : 1319, "state" : "WI" } +{ "_id" : "54742", "city" : "FALL CREEK", "loc" : [ -91.285631, 44.768385 ], "pop" : 3814, "state" : "WI" } +{ "_id" : "54744", "city" : "HILLSDALE", "loc" : [ -91.85985700000001, 45.32136 ], "pop" : 560, "state" : "WI" } +{ "_id" : "54745", "city" : "HOLCOMBE", "loc" : [ -91.132955, 45.251263 ], "pop" : 1752, "state" : "WI" } +{ "_id" : "54746", "city" : "HUMBIRD", "loc" : [ -90.888257, 44.536676 ], "pop" : 633, "state" : "WI" } +{ "_id" : "54747", "city" : "INDEPENDENCE", "loc" : [ -91.45351100000001, 44.395926 ], "pop" : 2826, "state" : "WI" } +{ "_id" : "54748", "city" : "JIM FALLS", "loc" : [ -91.264909, 45.064439 ], "pop" : 974, "state" : "WI" } +{ "_id" : "54749", "city" : "KNAPP", "loc" : [ -92.07520100000001, 44.954495 ], "pop" : 935, "state" : "WI" } +{ "_id" : "54750", "city" : "MAIDEN ROCK", "loc" : [ -92.278212, 44.608599 ], "pop" : 1503, "state" : "WI" } +{ "_id" : "54751", "city" : "MENOMONIE", "loc" : [ -91.92650999999999, 44.87182 ], "pop" : 21211, "state" : "WI" } +{ "_id" : "54754", "city" : "MERRILLAN", "loc" : [ -90.810496, 44.436938 ], "pop" : 1317, "state" : "WI" } +{ "_id" : "54755", "city" : "MODENA", "loc" : [ -91.66957600000001, 44.609853 ], "pop" : 4907, "state" : "WI" } +{ "_id" : "54756", "city" : "NELSON", "loc" : [ -92.000742, 44.42947 ], "pop" : 652, "state" : "WI" } +{ "_id" : "54757", "city" : "NEW AUBURN", "loc" : [ -91.519747, 45.23562 ], "pop" : 2101, "state" : "WI" } +{ "_id" : "54758", "city" : "OSSEO", "loc" : [ -91.219148, 44.559923 ], "pop" : 4347, "state" : "WI" } +{ "_id" : "54759", "city" : "PEPIN", "loc" : [ -92.139353, 44.458687 ], "pop" : 1504, "state" : "WI" } +{ "_id" : "54761", "city" : "PLUM CITY", "loc" : [ -92.183725, 44.635979 ], "pop" : 1050, "state" : "WI" } +{ "_id" : "54762", "city" : "PRAIRIE FARM", "loc" : [ -91.974205, 45.246183 ], "pop" : 1061, "state" : "WI" } +{ "_id" : "54763", "city" : "RIDGELAND", "loc" : [ -91.879024, 45.186773 ], "pop" : 863, "state" : "WI" } +{ "_id" : "54765", "city" : "SAND CREEK", "loc" : [ -91.701446, 45.170513 ], "pop" : 501, "state" : "WI" } +{ "_id" : "54766", "city" : "SHELDON", "loc" : [ -90.914148, 45.318171 ], "pop" : 1711, "state" : "WI" } +{ "_id" : "54767", "city" : "SPRING VALLEY", "loc" : [ -92.290599, 44.835569 ], "pop" : 2746, "state" : "WI" } +{ "_id" : "54768", "city" : "STANLEY", "loc" : [ -90.938935, 44.968872 ], "pop" : 3157, "state" : "WI" } +{ "_id" : "54769", "city" : "STOCKHOLM", "loc" : [ -92.22842900000001, 44.500441 ], "pop" : 434, "state" : "WI" } +{ "_id" : "54770", "city" : "STRUM", "loc" : [ -91.38327099999999, 44.567356 ], "pop" : 1560, "state" : "WI" } +{ "_id" : "54771", "city" : "THORP", "loc" : [ -90.80286099999999, 44.957319 ], "pop" : 4803, "state" : "WI" } +{ "_id" : "54772", "city" : "WHEELER", "loc" : [ -91.887055, 45.071856 ], "pop" : 1094, "state" : "WI" } +{ "_id" : "54773", "city" : "WHITEHALL", "loc" : [ -91.302953, 44.382683 ], "pop" : 3330, "state" : "WI" } +{ "_id" : "54801", "city" : "SPOONER", "loc" : [ -91.91555, 45.850468 ], "pop" : 5384, "state" : "WI" } +{ "_id" : "54805", "city" : "ALMENA", "loc" : [ -92.002691, 45.419507 ], "pop" : 3180, "state" : "WI" } +{ "_id" : "54806", "city" : "MOQUAH", "loc" : [ -90.876712, 46.577948 ], "pop" : 12254, "state" : "WI" } +{ "_id" : "54810", "city" : "BALSAM LAKE", "loc" : [ -92.41495399999999, 45.458845 ], "pop" : 1765, "state" : "WI" } +{ "_id" : "54812", "city" : "BARRON", "loc" : [ -91.84996, 45.400535 ], "pop" : 4049, "state" : "WI" } +{ "_id" : "54813", "city" : "BARRONETT", "loc" : [ -92.019595, 45.618995 ], "pop" : 804, "state" : "WI" } +{ "_id" : "54814", "city" : "BAYFIELD", "loc" : [ -90.821681, 46.835359 ], "pop" : 2375, "state" : "WI" } +{ "_id" : "54817", "city" : "BIRCHWOOD", "loc" : [ -91.577564, 45.640296 ], "pop" : 1962, "state" : "WI" } +{ "_id" : "54819", "city" : "BRUCE", "loc" : [ -91.290622, 45.447923 ], "pop" : 2654, "state" : "WI" } +{ "_id" : "54820", "city" : "BRULE", "loc" : [ -91.553862, 46.576318 ], "pop" : 902, "state" : "WI" } +{ "_id" : "54821", "city" : "CABLE", "loc" : [ -91.22443800000001, 46.217155 ], "pop" : 1311, "state" : "WI" } +{ "_id" : "54822", "city" : "CAMERON", "loc" : [ -91.730992, 45.403836 ], "pop" : 3314, "state" : "WI" } +{ "_id" : "54824", "city" : "CENTURIA", "loc" : [ -92.547741, 45.448369 ], "pop" : 1791, "state" : "WI" } +{ "_id" : "54826", "city" : "COMSTOCK", "loc" : [ -92.085961, 45.491114 ], "pop" : 473, "state" : "WI" } +{ "_id" : "54827", "city" : "CORNUCOPIA", "loc" : [ -91.097421, 46.837171 ], "pop" : 242, "state" : "WI" } +{ "_id" : "54828", "city" : "NEW POST", "loc" : [ -91.327825, 45.809664 ], "pop" : 377, "state" : "WI" } +{ "_id" : "54829", "city" : "CUMBERLAND", "loc" : [ -92.029709, 45.5403 ], "pop" : 4229, "state" : "WI" } +{ "_id" : "54830", "city" : "DAIRYLAND", "loc" : [ -92.265995, 46.029681 ], "pop" : 1855, "state" : "WI" } +{ "_id" : "54832", "city" : "DRUMMOND", "loc" : [ -91.285569, 46.311896 ], "pop" : 329, "state" : "WI" } +{ "_id" : "54835", "city" : "EXELAND", "loc" : [ -91.22381900000001, 45.675298 ], "pop" : 939, "state" : "WI" } +{ "_id" : "54836", "city" : "FOXBORO", "loc" : [ -92.149254, 46.487511 ], "pop" : 1528, "state" : "WI" } +{ "_id" : "54837", "city" : "CLAM FALLS", "loc" : [ -92.42648199999999, 45.665314 ], "pop" : 4011, "state" : "WI" } +{ "_id" : "54838", "city" : "GORDON", "loc" : [ -91.803301, 46.233603 ], "pop" : 1088, "state" : "WI" } +{ "_id" : "54839", "city" : "GRAND VIEW", "loc" : [ -91.107465, 46.357682 ], "pop" : 280, "state" : "WI" } +{ "_id" : "54840", "city" : "EVERGREEN", "loc" : [ -92.662685, 45.761312 ], "pop" : 4008, "state" : "WI" } +{ "_id" : "54843", "city" : "NORTH WOODS BEAC", "loc" : [ -91.397659, 46.001404 ], "pop" : 9339, "state" : "WI" } +{ "_id" : "54844", "city" : "HERBSTER", "loc" : [ -91.233193, 46.82128 ], "pop" : 230, "state" : "WI" } +{ "_id" : "54845", "city" : "HERTEL", "loc" : [ -92.14041899999999, 45.807561 ], "pop" : 110, "state" : "WI" } +{ "_id" : "54846", "city" : "HIGH BRIDGE", "loc" : [ -90.73826, 46.379613 ], "pop" : 536, "state" : "WI" } +{ "_id" : "54847", "city" : "IRON RIVER", "loc" : [ -91.42105599999999, 46.578984 ], "pop" : 1777, "state" : "WI" } +{ "_id" : "54848", "city" : "LADYSMITH", "loc" : [ -91.10880400000001, 45.471941 ], "pop" : 6737, "state" : "WI" } +{ "_id" : "54849", "city" : "LAKE NEBAGAMON", "loc" : [ -91.74024300000001, 46.502347 ], "pop" : 1824, "state" : "WI" } +{ "_id" : "54850", "city" : "LA POINTE", "loc" : [ -90.603622, 46.846675 ], "pop" : 17, "state" : "WI" } +{ "_id" : "54853", "city" : "LUCK", "loc" : [ -92.416391, 45.556799 ], "pop" : 2131, "state" : "WI" } +{ "_id" : "54854", "city" : "MAPLE", "loc" : [ -91.702015, 46.620591 ], "pop" : 891, "state" : "WI" } +{ "_id" : "54855", "city" : "MARENGO", "loc" : [ -90.839991, 46.407112 ], "pop" : 592, "state" : "WI" } +{ "_id" : "54856", "city" : "DELTA", "loc" : [ -91.05751100000001, 46.457285 ], "pop" : 1519, "state" : "WI" } +{ "_id" : "54858", "city" : "MILLTOWN", "loc" : [ -92.501739, 45.527082 ], "pop" : 1570, "state" : "WI" } +{ "_id" : "54859", "city" : "MINONG", "loc" : [ -91.850628, 46.10445 ], "pop" : 1451, "state" : "WI" } +{ "_id" : "54862", "city" : "OJIBWA", "loc" : [ -91.110922, 45.785351 ], "pop" : 401, "state" : "WI" } +{ "_id" : "54864", "city" : "POPLAR", "loc" : [ -91.825345, 46.57708 ], "pop" : 1064, "state" : "WI" } +{ "_id" : "54865", "city" : "PORT WING", "loc" : [ -91.392016, 46.76204 ], "pop" : 544, "state" : "WI" } +{ "_id" : "54867", "city" : "RADISSON", "loc" : [ -91.22615, 45.773359 ], "pop" : 509, "state" : "WI" } +{ "_id" : "54868", "city" : "CANTON", "loc" : [ -91.73354399999999, 45.510466 ], "pop" : 13996, "state" : "WI" } +{ "_id" : "54870", "city" : "SARONA", "loc" : [ -91.762103, 45.708532 ], "pop" : 1201, "state" : "WI" } +{ "_id" : "54871", "city" : "SHELL LAKE", "loc" : [ -91.960606, 45.753598 ], "pop" : 3450, "state" : "WI" } +{ "_id" : "54872", "city" : "SIREN", "loc" : [ -92.389151, 45.78214 ], "pop" : 2495, "state" : "WI" } +{ "_id" : "54873", "city" : "BARNES", "loc" : [ -91.77015400000001, 46.388821 ], "pop" : 2443, "state" : "WI" } +{ "_id" : "54874", "city" : "WENTWORTH", "loc" : [ -91.94580499999999, 46.588659 ], "pop" : 3029, "state" : "WI" } +{ "_id" : "54875", "city" : "EARL", "loc" : [ -91.677734, 45.960384 ], "pop" : 970, "state" : "WI" } +{ "_id" : "54876", "city" : "STONE LAKE", "loc" : [ -91.509291, 45.833733 ], "pop" : 1662, "state" : "WI" } +{ "_id" : "54880", "city" : "SUPERIOR", "loc" : [ -92.091174, 46.701552 ], "pop" : 29513, "state" : "WI" } +{ "_id" : "54888", "city" : "TREGO", "loc" : [ -91.858051, 45.951556 ], "pop" : 1037, "state" : "WI" } +{ "_id" : "54889", "city" : "TURTLE LAKE", "loc" : [ -92.17814199999999, 45.421349 ], "pop" : 2048, "state" : "WI" } +{ "_id" : "54891", "city" : "WASHBURN", "loc" : [ -90.909516, 46.680595 ], "pop" : 3177, "state" : "WI" } +{ "_id" : "54893", "city" : "WEBSTER", "loc" : [ -92.322722, 45.874001 ], "pop" : 3012, "state" : "WI" } +{ "_id" : "54895", "city" : "WEYERHAEUSER", "loc" : [ -91.428944, 45.426347 ], "pop" : 858, "state" : "WI" } +{ "_id" : "54896", "city" : "LORETTA", "loc" : [ -90.949591, 45.841419 ], "pop" : 1385, "state" : "WI" } +{ "_id" : "54901", "city" : "OSHKOSH", "loc" : [ -88.54363499999999, 44.021962 ], "pop" : 57187, "state" : "WI" } +{ "_id" : "54904", "city" : "OSHKOSH", "loc" : [ -88.607015, 44.030356 ], "pop" : 12608, "state" : "WI" } +{ "_id" : "54909", "city" : "ALMOND", "loc" : [ -89.35836399999999, 44.289832 ], "pop" : 2002, "state" : "WI" } +{ "_id" : "54911", "city" : "APPLETON", "loc" : [ -88.397649, 44.277325 ], "pop" : 25970, "state" : "WI" } +{ "_id" : "54914", "city" : "APPLETON", "loc" : [ -88.432608, 44.270992 ], "pop" : 23028, "state" : "WI" } +{ "_id" : "54915", "city" : "APPLETON", "loc" : [ -88.399902, 44.26351 ], "pop" : 42119, "state" : "WI" } +{ "_id" : "54921", "city" : "BANCROFT", "loc" : [ -89.530438, 44.30648 ], "pop" : 1368, "state" : "WI" } +{ "_id" : "54922", "city" : "BEAR CREEK", "loc" : [ -88.740375, 44.5348 ], "pop" : 1488, "state" : "WI" } +{ "_id" : "54923", "city" : "BERLIN", "loc" : [ -88.949009, 43.976936 ], "pop" : 8132, "state" : "WI" } +{ "_id" : "54928", "city" : "CAROLINE", "loc" : [ -88.888749, 44.727574 ], "pop" : 293, "state" : "WI" } +{ "_id" : "54929", "city" : "CLINTONVILLE", "loc" : [ -88.742999, 44.636442 ], "pop" : 8902, "state" : "WI" } +{ "_id" : "54930", "city" : "COLOMA", "loc" : [ -89.494332, 44.027462 ], "pop" : 1364, "state" : "WI" } +{ "_id" : "54932", "city" : "ELDORADO", "loc" : [ -88.63882700000001, 43.841471 ], "pop" : 765, "state" : "WI" } +{ "_id" : "54935", "city" : "TAYCHEEDAH", "loc" : [ -88.429149, 43.770446 ], "pop" : 37093, "state" : "WI" } +{ "_id" : "54937", "city" : "NORTH FOND DU LA", "loc" : [ -88.481264, 43.792633 ], "pop" : 14665, "state" : "WI" } +{ "_id" : "54940", "city" : "FREMONT", "loc" : [ -88.844852, 44.237884 ], "pop" : 3211, "state" : "WI" } +{ "_id" : "54941", "city" : "GREEN LAKE", "loc" : [ -88.96847, 43.844383 ], "pop" : 2504, "state" : "WI" } +{ "_id" : "54942", "city" : "GREENVILLE", "loc" : [ -88.569579, 44.299747 ], "pop" : 1722, "state" : "WI" } +{ "_id" : "54943", "city" : "HANCOCK", "loc" : [ -89.534448, 44.129743 ], "pop" : 1214, "state" : "WI" } +{ "_id" : "54944", "city" : "HORTONVILLE", "loc" : [ -88.62813, 44.327306 ], "pop" : 5602, "state" : "WI" } +{ "_id" : "54945", "city" : "IOLA", "loc" : [ -89.137311, 44.532183 ], "pop" : 2589, "state" : "WI" } +{ "_id" : "54946", "city" : "KING", "loc" : [ -89.113739, 44.267332 ], "pop" : 661, "state" : "WI" } +{ "_id" : "54947", "city" : "LARSEN", "loc" : [ -88.696305, 44.198421 ], "pop" : 1863, "state" : "WI" } +{ "_id" : "54948", "city" : "LEOPOLIS", "loc" : [ -88.87222300000001, 44.781188 ], "pop" : 403, "state" : "WI" } +{ "_id" : "54949", "city" : "MANAWA", "loc" : [ -88.916444, 44.470148 ], "pop" : 2749, "state" : "WI" } +{ "_id" : "54950", "city" : "MARION", "loc" : [ -88.876706, 44.679414 ], "pop" : 3071, "state" : "WI" } +{ "_id" : "54952", "city" : "MENASHA", "loc" : [ -88.417536, 44.211164 ], "pop" : 22505, "state" : "WI" } +{ "_id" : "54956", "city" : "NEENAH", "loc" : [ -88.479201, 44.181094 ], "pop" : 34261, "state" : "WI" } +{ "_id" : "54960", "city" : "NESHKORO", "loc" : [ -89.233572, 43.898943 ], "pop" : 2210, "state" : "WI" } +{ "_id" : "54961", "city" : "NEW LONDON", "loc" : [ -88.75542799999999, 44.392847 ], "pop" : 13037, "state" : "WI" } +{ "_id" : "54962", "city" : "OGDENSBURG", "loc" : [ -89.01185099999999, 44.467803 ], "pop" : 1509, "state" : "WI" } +{ "_id" : "54963", "city" : "OMRO", "loc" : [ -88.75193299999999, 44.035678 ], "pop" : 5678, "state" : "WI" } +{ "_id" : "54964", "city" : "PICKETT", "loc" : [ -88.71345700000001, 43.900917 ], "pop" : 518, "state" : "WI" } +{ "_id" : "54965", "city" : "PINE RIVER", "loc" : [ -89.040415, 44.160393 ], "pop" : 2148, "state" : "WI" } +{ "_id" : "54966", "city" : "PLAINFIELD", "loc" : [ -89.455896, 44.209079 ], "pop" : 2336, "state" : "WI" } +{ "_id" : "54967", "city" : "POY SIPPI", "loc" : [ -88.926835, 44.110069 ], "pop" : 232, "state" : "WI" } +{ "_id" : "54968", "city" : "PRINCETON", "loc" : [ -89.12491300000001, 43.843827 ], "pop" : 3101, "state" : "WI" } +{ "_id" : "54970", "city" : "REDGRANITE", "loc" : [ -89.098125, 44.04381 ], "pop" : 2093, "state" : "WI" } +{ "_id" : "54971", "city" : "RIPON", "loc" : [ -88.842433, 43.845402 ], "pop" : 10694, "state" : "WI" } +{ "_id" : "54974", "city" : "ROSENDALE", "loc" : [ -88.641704, 43.788903 ], "pop" : 2012, "state" : "WI" } +{ "_id" : "54977", "city" : "SCANDINAVIA", "loc" : [ -89.165042, 44.460436 ], "pop" : 1097, "state" : "WI" } +{ "_id" : "54978", "city" : "TILLEDA", "loc" : [ -88.907498, 44.811812 ], "pop" : 58, "state" : "WI" } +{ "_id" : "54979", "city" : "VAN DYNE", "loc" : [ -88.510008, 43.873399 ], "pop" : 1403, "state" : "WI" } +{ "_id" : "54981", "city" : "WAUPACA", "loc" : [ -89.11014299999999, 44.348101 ], "pop" : 11716, "state" : "WI" } +{ "_id" : "54982", "city" : "WAUTOMA", "loc" : [ -89.26655100000001, 44.065576 ], "pop" : 6318, "state" : "WI" } +{ "_id" : "54983", "city" : "WEYAUWEGA", "loc" : [ -88.941047, 44.320973 ], "pop" : 3886, "state" : "WI" } +{ "_id" : "54984", "city" : "WILD ROSE", "loc" : [ -89.195252, 44.183433 ], "pop" : 2127, "state" : "WI" } +{ "_id" : "54986", "city" : "WINNECONNE", "loc" : [ -88.721384, 44.118704 ], "pop" : 3887, "state" : "WI" } +{ "_id" : "55001", "city" : "AFTON", "loc" : [ -92.823358, 44.86965 ], "pop" : 4357, "state" : "MN" } +{ "_id" : "55003", "city" : "BAYPORT", "loc" : [ -92.784375, 45.021405 ], "pop" : 3200, "state" : "MN" } +{ "_id" : "55005", "city" : "EAST BETHEL", "loc" : [ -93.233088, 45.394114 ], "pop" : 2821, "state" : "MN" } +{ "_id" : "55006", "city" : "BRAHAM", "loc" : [ -93.203695, 45.717547 ], "pop" : 1944, "state" : "MN" } +{ "_id" : "55007", "city" : "QUAMBA", "loc" : [ -92.98347, 45.938694 ], "pop" : 1222, "state" : "MN" } +{ "_id" : "55008", "city" : "CAMBRIDGE", "loc" : [ -93.288935, 45.557591 ], "pop" : 14444, "state" : "MN" } +{ "_id" : "55009", "city" : "CANNON FALLS", "loc" : [ -92.863995, 44.495985 ], "pop" : 7590, "state" : "MN" } +{ "_id" : "55010", "city" : "CASTLE ROCK", "loc" : [ -93.109241, 44.594216 ], "pop" : 1480, "state" : "MN" } +{ "_id" : "55011", "city" : "CEDAR EAST BETHE", "loc" : [ -93.265834, 45.336494 ], "pop" : 6874, "state" : "MN" } +{ "_id" : "55013", "city" : "CHISAGO CITY", "loc" : [ -92.892134, 45.361144 ], "pop" : 2905, "state" : "MN" } +{ "_id" : "55014", "city" : "CIRCLE PINES", "loc" : [ -93.143984, 45.152841 ], "pop" : 19791, "state" : "MN" } +{ "_id" : "55016", "city" : "COTTAGE GROVE", "loc" : [ -92.939283, 44.830824 ], "pop" : 22265, "state" : "MN" } +{ "_id" : "55017", "city" : "DALBO", "loc" : [ -93.441918, 45.678735 ], "pop" : 616, "state" : "MN" } +{ "_id" : "55018", "city" : "STANTON", "loc" : [ -92.974779, 44.423884 ], "pop" : 2009, "state" : "MN" } +{ "_id" : "55019", "city" : "DUNDAS", "loc" : [ -93.20368999999999, 44.395537 ], "pop" : 803, "state" : "MN" } +{ "_id" : "55020", "city" : "ELKO", "loc" : [ -93.383555, 44.58945 ], "pop" : 4146, "state" : "MN" } +{ "_id" : "55021", "city" : "FARIBAULT", "loc" : [ -93.28179, 44.294457 ], "pop" : 21450, "state" : "MN" } +{ "_id" : "55024", "city" : "FARMINGTON", "loc" : [ -93.153891, 44.662799 ], "pop" : 10145, "state" : "MN" } +{ "_id" : "55025", "city" : "FOREST LAKE", "loc" : [ -92.97489400000001, 45.268499 ], "pop" : 14749, "state" : "MN" } +{ "_id" : "55026", "city" : "FRONTENAC", "loc" : [ -92.328103, 44.487176 ], "pop" : 1698, "state" : "MN" } +{ "_id" : "55027", "city" : "GOODHUE", "loc" : [ -92.571743, 44.402178 ], "pop" : 1928, "state" : "MN" } +{ "_id" : "55030", "city" : "GRASSTON", "loc" : [ -93.196226, 45.772926 ], "pop" : 1007, "state" : "MN" } +{ "_id" : "55031", "city" : "HAMPTON", "loc" : [ -92.946673, 44.602848 ], "pop" : 1780, "state" : "MN" } +{ "_id" : "55032", "city" : "HARRIS", "loc" : [ -93.039545, 45.596205 ], "pop" : 2026, "state" : "MN" } +{ "_id" : "55033", "city" : "WELCH", "loc" : [ -92.862566, 44.718932 ], "pop" : 20769, "state" : "MN" } +{ "_id" : "55037", "city" : "HINCKLEY", "loc" : [ -92.899333, 46.018876 ], "pop" : 2611, "state" : "MN" } +{ "_id" : "55038", "city" : "CENTERVILLE", "loc" : [ -93.00349300000001, 45.1628 ], "pop" : 6520, "state" : "MN" } +{ "_id" : "55040", "city" : "ISANTI", "loc" : [ -93.22656499999999, 45.468212 ], "pop" : 8004, "state" : "MN" } +{ "_id" : "55041", "city" : "LAKE CITY", "loc" : [ -92.283778, 44.430493 ], "pop" : 5154, "state" : "MN" } +{ "_id" : "55042", "city" : "LAKE ELMO", "loc" : [ -92.90564999999999, 44.994609 ], "pop" : 5903, "state" : "MN" } +{ "_id" : "55043", "city" : "LAKELAND", "loc" : [ -92.771592, 44.939384 ], "pop" : 3792, "state" : "MN" } +{ "_id" : "55044", "city" : "LAKEVILLE", "loc" : [ -93.257802, 44.674865 ], "pop" : 17741, "state" : "MN" } +{ "_id" : "55045", "city" : "LINDSTROM", "loc" : [ -92.84207600000001, 45.387265 ], "pop" : 5991, "state" : "MN" } +{ "_id" : "55046", "city" : "VESELI", "loc" : [ -93.42359399999999, 44.462888 ], "pop" : 4020, "state" : "MN" } +{ "_id" : "55047", "city" : "MARINE ON SAINT", "loc" : [ -92.822952, 45.183119 ], "pop" : 4310, "state" : "MN" } +{ "_id" : "55049", "city" : "MEDFORD", "loc" : [ -93.24372099999999, 44.17415 ], "pop" : 1305, "state" : "MN" } +{ "_id" : "55051", "city" : "MORA", "loc" : [ -93.294234, 45.895786 ], "pop" : 10652, "state" : "MN" } +{ "_id" : "55052", "city" : "MORRISTOWN", "loc" : [ -93.452512, 44.234183 ], "pop" : 1425, "state" : "MN" } +{ "_id" : "55053", "city" : "NERSTRAND", "loc" : [ -93.0855, 44.353769 ], "pop" : 687, "state" : "MN" } +{ "_id" : "55055", "city" : "NEWPORT", "loc" : [ -92.998603, 44.872522 ], "pop" : 3720, "state" : "MN" } +{ "_id" : "55056", "city" : "NORTH BRANCH", "loc" : [ -92.93709699999999, 45.516479 ], "pop" : 6024, "state" : "MN" } +{ "_id" : "55057", "city" : "NORTHFIELD", "loc" : [ -93.166826, 44.458724 ], "pop" : 17995, "state" : "MN" } +{ "_id" : "55060", "city" : "OWATONNA", "loc" : [ -93.21914, 44.080478 ], "pop" : 23860, "state" : "MN" } +{ "_id" : "55063", "city" : "BEROUN", "loc" : [ -92.98260399999999, 45.832273 ], "pop" : 6858, "state" : "MN" } +{ "_id" : "55065", "city" : "RANDOLPH", "loc" : [ -93.01961900000001, 44.527386 ], "pop" : 370, "state" : "MN" } +{ "_id" : "55066", "city" : "RED WING", "loc" : [ -92.548559, 44.552779 ], "pop" : 17033, "state" : "MN" } +{ "_id" : "55067", "city" : "ROCK CREEK", "loc" : [ -92.930826, 45.762404 ], "pop" : 1040, "state" : "MN" } +{ "_id" : "55068", "city" : "ROSEMOUNT", "loc" : [ -93.158844, 44.728919 ], "pop" : 14747, "state" : "MN" } +{ "_id" : "55069", "city" : "RUSH CITY", "loc" : [ -92.99787600000001, 45.684496 ], "pop" : 3566, "state" : "MN" } +{ "_id" : "55070", "city" : "SAINT FRANCIS", "loc" : [ -93.359832, 45.390284 ], "pop" : 2789, "state" : "MN" } +{ "_id" : "55071", "city" : "SAINT PAUL PARK", "loc" : [ -92.987331, 44.834404 ], "pop" : 5517, "state" : "MN" } +{ "_id" : "55072", "city" : "MARKVILLE", "loc" : [ -92.87100100000001, 46.121355 ], "pop" : 3299, "state" : "MN" } +{ "_id" : "55073", "city" : "SCANDIA", "loc" : [ -92.82915800000001, 45.269666 ], "pop" : 2024, "state" : "MN" } +{ "_id" : "55074", "city" : "SHAFER", "loc" : [ -92.76088900000001, 45.357561 ], "pop" : 1519, "state" : "MN" } +{ "_id" : "55075", "city" : "SOUTH SAINT PAUL", "loc" : [ -93.046013, 44.888128 ], "pop" : 20027, "state" : "MN" } +{ "_id" : "55076", "city" : "INVER GROVE HEIG", "loc" : [ -93.034746, 44.841966 ], "pop" : 14444, "state" : "MN" } +{ "_id" : "55077", "city" : "INVER GROVE HEIG", "loc" : [ -93.073938, 44.850123 ], "pop" : 8309, "state" : "MN" } +{ "_id" : "55079", "city" : "STACY", "loc" : [ -93.017743, 45.397509 ], "pop" : 5936, "state" : "MN" } +{ "_id" : "55080", "city" : "STANCHFIELD", "loc" : [ -93.243302, 45.667513 ], "pop" : 913, "state" : "MN" } +{ "_id" : "55082", "city" : "OAK PARK HEIGHTS", "loc" : [ -92.830032, 45.050007 ], "pop" : 25247, "state" : "MN" } +{ "_id" : "55084", "city" : "TAYLORS FALLS", "loc" : [ -92.69059300000001, 45.41825 ], "pop" : 1421, "state" : "MN" } +{ "_id" : "55087", "city" : "WARSAW", "loc" : [ -93.364181, 44.250439 ], "pop" : 1236, "state" : "MN" } +{ "_id" : "55088", "city" : "WEBSTER", "loc" : [ -93.334418, 44.502633 ], "pop" : 1452, "state" : "MN" } +{ "_id" : "55089", "city" : "WELCH", "loc" : [ -92.726259, 44.603006 ], "pop" : 678, "state" : "MN" } +{ "_id" : "55092", "city" : "EAST BETHEL", "loc" : [ -93.06856500000001, 45.324337 ], "pop" : 7514, "state" : "MN" } +{ "_id" : "55101", "city" : "SAINT PAUL", "loc" : [ -93.083167, 44.969963 ], "pop" : 18352, "state" : "MN" } +{ "_id" : "55102", "city" : "SAINT PAUL", "loc" : [ -93.120852, 44.937228 ], "pop" : 18585, "state" : "MN" } +{ "_id" : "55103", "city" : "SAINT PAUL", "loc" : [ -93.121594, 44.960798 ], "pop" : 12169, "state" : "MN" } +{ "_id" : "55104", "city" : "SAINT PAUL", "loc" : [ -93.15797000000001, 44.953179 ], "pop" : 46396, "state" : "MN" } +{ "_id" : "55105", "city" : "SAINT PAUL", "loc" : [ -93.165148, 44.934723 ], "pop" : 26216, "state" : "MN" } +{ "_id" : "55106", "city" : "SAINT PAUL", "loc" : [ -93.048817, 44.968384 ], "pop" : 47905, "state" : "MN" } +{ "_id" : "55107", "city" : "WEST SAINT PAUL", "loc" : [ -93.086157, 44.927235 ], "pop" : 15825, "state" : "MN" } +{ "_id" : "55108", "city" : "LAUDERDALE", "loc" : [ -93.17458000000001, 44.982217 ], "pop" : 17285, "state" : "MN" } +{ "_id" : "55109", "city" : "NORTH SAINT PAUL", "loc" : [ -93.017072, 45.011859 ], "pop" : 28263, "state" : "MN" } +{ "_id" : "55110", "city" : "WHITE BEAR LAKE", "loc" : [ -93.01129899999999, 45.074527 ], "pop" : 38649, "state" : "MN" } +{ "_id" : "55111", "city" : "FORT SNELLING", "loc" : [ -93.202579, 44.901548 ], "pop" : 97, "state" : "MN" } +{ "_id" : "55112", "city" : "NEW BRIGHTON", "loc" : [ -93.199691, 45.074129 ], "pop" : 44128, "state" : "MN" } +{ "_id" : "55113", "city" : "ROSEVILLE", "loc" : [ -93.14924499999999, 45.012876 ], "pop" : 37302, "state" : "MN" } +{ "_id" : "55114", "city" : "SAINT PAUL", "loc" : [ -93.19806699999999, 44.967968 ], "pop" : 1402, "state" : "MN" } +{ "_id" : "55115", "city" : "WHITE BEAR LAKE", "loc" : [ -92.954847, 45.061132 ], "pop" : 6201, "state" : "MN" } +{ "_id" : "55116", "city" : "SAINT PAUL", "loc" : [ -93.172747, 44.914007 ], "pop" : 23868, "state" : "MN" } +{ "_id" : "55117", "city" : "LITTLE CANADA", "loc" : [ -93.10365899999999, 44.992165 ], "pop" : 38771, "state" : "MN" } +{ "_id" : "55118", "city" : "WEST SAINT PAUL", "loc" : [ -93.096435, 44.902691 ], "pop" : 25866, "state" : "MN" } +{ "_id" : "55119", "city" : "MAPLEWOOD", "loc" : [ -93.008019, 44.955384 ], "pop" : 33887, "state" : "MN" } +{ "_id" : "55120", "city" : "EAGAN", "loc" : [ -93.12902, 44.873825 ], "pop" : 3113, "state" : "MN" } +{ "_id" : "55121", "city" : "EAGAN", "loc" : [ -93.16753, 44.843039 ], "pop" : 6047, "state" : "MN" } +{ "_id" : "55122", "city" : "EAGAN", "loc" : [ -93.19693700000001, 44.803593 ], "pop" : 23875, "state" : "MN" } +{ "_id" : "55123", "city" : "EAGAN", "loc" : [ -93.14135, 44.809764 ], "pop" : 17487, "state" : "MN" } +{ "_id" : "55124", "city" : "APPLE VALLEY", "loc" : [ -93.20775999999999, 44.746147 ], "pop" : 34598, "state" : "MN" } +{ "_id" : "55125", "city" : "WOODBURY", "loc" : [ -92.951413, 44.916195 ], "pop" : 20075, "state" : "MN" } +{ "_id" : "55126", "city" : "SHOREVIEW", "loc" : [ -93.134367, 45.083334 ], "pop" : 24597, "state" : "MN" } +{ "_id" : "55127", "city" : "VADNAIS HEIGHTS", "loc" : [ -93.07875, 45.070839 ], "pop" : 14628, "state" : "MN" } +{ "_id" : "55128", "city" : "OAKDALE", "loc" : [ -92.96812799999999, 44.984648 ], "pop" : 19099, "state" : "MN" } +{ "_id" : "55150", "city" : "MENDOTA", "loc" : [ -93.161221, 44.885796 ], "pop" : 164, "state" : "MN" } +{ "_id" : "55301", "city" : "ALBERTVILLE", "loc" : [ -93.646899, 45.253425 ], "pop" : 3132, "state" : "MN" } +{ "_id" : "55302", "city" : "ANNANDALE", "loc" : [ -94.106072, 45.248272 ], "pop" : 6174, "state" : "MN" } +{ "_id" : "55303", "city" : "RAMSEY", "loc" : [ -93.407822, 45.238537 ], "pop" : 33161, "state" : "MN" } +{ "_id" : "55304", "city" : "HAM LAKE", "loc" : [ -93.284531, 45.25068 ], "pop" : 25122, "state" : "MN" } +{ "_id" : "55307", "city" : "ARLINGTON", "loc" : [ -94.076195, 44.615279 ], "pop" : 2997, "state" : "MN" } +{ "_id" : "55308", "city" : "BECKER", "loc" : [ -93.84096599999999, 45.436539 ], "pop" : 3589, "state" : "MN" } +{ "_id" : "55309", "city" : "BIG LAKE", "loc" : [ -93.73991700000001, 45.350648 ], "pop" : 6703, "state" : "MN" } +{ "_id" : "55310", "city" : "BIRD ISLAND", "loc" : [ -94.871634, 44.750729 ], "pop" : 1885, "state" : "MN" } +{ "_id" : "55312", "city" : "BROWNTON", "loc" : [ -94.330611, 44.728145 ], "pop" : 1686, "state" : "MN" } +{ "_id" : "55313", "city" : "BUFFALO", "loc" : [ -93.863479, 45.181371 ], "pop" : 8942, "state" : "MN" } +{ "_id" : "55314", "city" : "BUFFALO LAKE", "loc" : [ -94.591207, 44.770885 ], "pop" : 1431, "state" : "MN" } +{ "_id" : "55315", "city" : "CARVER", "loc" : [ -93.687949, 44.716898 ], "pop" : 1181, "state" : "MN" } +{ "_id" : "55316", "city" : "CHAMPLIN", "loc" : [ -93.381927, 45.170042 ], "pop" : 16849, "state" : "MN" } +{ "_id" : "55317", "city" : "CHANHASSEN", "loc" : [ -93.535906, 44.867924 ], "pop" : 8499, "state" : "MN" } +{ "_id" : "55318", "city" : "CHASKA", "loc" : [ -93.60831399999999, 44.806071 ], "pop" : 13907, "state" : "MN" } +{ "_id" : "55319", "city" : "CLEAR LAKE", "loc" : [ -93.968391, 45.479477 ], "pop" : 3280, "state" : "MN" } +{ "_id" : "55320", "city" : "CLEARWATER", "loc" : [ -94.04524600000001, 45.387694 ], "pop" : 1752, "state" : "MN" } +{ "_id" : "55321", "city" : "COKATO", "loc" : [ -94.19105399999999, 45.074761 ], "pop" : 4053, "state" : "MN" } +{ "_id" : "55322", "city" : "COLOGNE", "loc" : [ -93.798249, 44.764591 ], "pop" : 2298, "state" : "MN" } +{ "_id" : "55324", "city" : "DARWIN", "loc" : [ -94.424926, 45.102949 ], "pop" : 933, "state" : "MN" } +{ "_id" : "55325", "city" : "DASSEL", "loc" : [ -94.33047500000001, 45.103208 ], "pop" : 4818, "state" : "MN" } +{ "_id" : "55327", "city" : "DAYTON", "loc" : [ -93.466795, 45.198164 ], "pop" : 4251, "state" : "MN" } +{ "_id" : "55328", "city" : "DELANO", "loc" : [ -93.801644, 45.034222 ], "pop" : 5574, "state" : "MN" } +{ "_id" : "55329", "city" : "EDEN VALLEY", "loc" : [ -94.603911, 45.302006 ], "pop" : 1955, "state" : "MN" } +{ "_id" : "55330", "city" : "ELK RIVER", "loc" : [ -93.5814, 45.313601 ], "pop" : 17703, "state" : "MN" } +{ "_id" : "55331", "city" : "EXCELSIOR", "loc" : [ -93.579132, 44.900704 ], "pop" : 15860, "state" : "MN" } +{ "_id" : "55332", "city" : "FAIRFAX", "loc" : [ -94.72562600000001, 44.532942 ], "pop" : 2250, "state" : "MN" } +{ "_id" : "55333", "city" : "FRANKLIN", "loc" : [ -94.893094, 44.542132 ], "pop" : 702, "state" : "MN" } +{ "_id" : "55334", "city" : "GAYLORD", "loc" : [ -94.195543, 44.546298 ], "pop" : 3099, "state" : "MN" } +{ "_id" : "55335", "city" : "GIBBON", "loc" : [ -94.54667999999999, 44.560587 ], "pop" : 1718, "state" : "MN" } +{ "_id" : "55336", "city" : "GLENCOE", "loc" : [ -94.161554, 44.778001 ], "pop" : 6275, "state" : "MN" } +{ "_id" : "55337", "city" : "BURNSVILLE", "loc" : [ -93.275283, 44.76086 ], "pop" : 51421, "state" : "MN" } +{ "_id" : "55338", "city" : "GREEN ISLE", "loc" : [ -93.932635, 44.668665 ], "pop" : 1353, "state" : "MN" } +{ "_id" : "55339", "city" : "HAMBURG", "loc" : [ -93.96431699999999, 44.731452 ], "pop" : 696, "state" : "MN" } +{ "_id" : "55340", "city" : "HAMEL", "loc" : [ -93.575957, 45.079951 ], "pop" : 4930, "state" : "MN" } +{ "_id" : "55342", "city" : "HECTOR", "loc" : [ -94.70582400000001, 44.748489 ], "pop" : 1896, "state" : "MN" } +{ "_id" : "55343", "city" : "EDEN PRAIRIE", "loc" : [ -93.41645200000001, 44.933318 ], "pop" : 40067, "state" : "MN" } +{ "_id" : "55344", "city" : "EDEN PRAIRIE", "loc" : [ -93.437573, 44.857426 ], "pop" : 7901, "state" : "MN" } +{ "_id" : "55345", "city" : "MINNETONKA", "loc" : [ -93.48499700000001, 44.913808 ], "pop" : 22535, "state" : "MN" } +{ "_id" : "55346", "city" : "EDEN PRAIRIE", "loc" : [ -93.483028, 44.877106 ], "pop" : 16269, "state" : "MN" } +{ "_id" : "55347", "city" : "EDEN PRAIRIE", "loc" : [ -93.438934, 44.834217 ], "pop" : 15141, "state" : "MN" } +{ "_id" : "55349", "city" : "HOWARD LAKE", "loc" : [ -94.069515, 45.061594 ], "pop" : 3443, "state" : "MN" } +{ "_id" : "55350", "city" : "HUTCHINSON", "loc" : [ -94.384691, 44.894554 ], "pop" : 15549, "state" : "MN" } +{ "_id" : "55352", "city" : "JORDAN", "loc" : [ -93.61946, 44.671321 ], "pop" : 4679, "state" : "MN" } +{ "_id" : "55353", "city" : "KIMBALL", "loc" : [ -94.302837, 45.343584 ], "pop" : 2226, "state" : "MN" } +{ "_id" : "55354", "city" : "LESTER PRAIRIE", "loc" : [ -94.055094, 44.873898 ], "pop" : 2160, "state" : "MN" } +{ "_id" : "55355", "city" : "LITCHFIELD", "loc" : [ -94.526805, 45.126272 ], "pop" : 8528, "state" : "MN" } +{ "_id" : "55356", "city" : "LONG LAKE", "loc" : [ -93.58179800000001, 44.991228 ], "pop" : 5700, "state" : "MN" } +{ "_id" : "55357", "city" : "LORETTO", "loc" : [ -93.66916500000001, 45.106099 ], "pop" : 1492, "state" : "MN" } +{ "_id" : "55358", "city" : "MAPLE LAKE", "loc" : [ -93.963793, 45.220236 ], "pop" : 4084, "state" : "MN" } +{ "_id" : "55359", "city" : "MAPLE PLAIN", "loc" : [ -93.700214, 44.978686 ], "pop" : 6885, "state" : "MN" } +{ "_id" : "55360", "city" : "MAYER", "loc" : [ -93.885925, 44.902231 ], "pop" : 1233, "state" : "MN" } +{ "_id" : "55362", "city" : "MONTICELLO", "loc" : [ -93.802252, 45.295557 ], "pop" : 8919, "state" : "MN" } +{ "_id" : "55363", "city" : "MONTROSE", "loc" : [ -93.93176200000001, 45.089737 ], "pop" : 2847, "state" : "MN" } +{ "_id" : "55364", "city" : "MOUND", "loc" : [ -93.656087, 44.938158 ], "pop" : 13251, "state" : "MN" } +{ "_id" : "55366", "city" : "NEW AUBURN", "loc" : [ -94.20567, 44.675919 ], "pop" : 784, "state" : "MN" } +{ "_id" : "55367", "city" : "NEW GERMANY", "loc" : [ -93.97013099999999, 44.899431 ], "pop" : 1136, "state" : "MN" } +{ "_id" : "55368", "city" : "NORWOOD", "loc" : [ -93.93006699999999, 44.766786 ], "pop" : 1761, "state" : "MN" } +{ "_id" : "55369", "city" : "MAPLE GROVE", "loc" : [ -93.43987, 45.108636 ], "pop" : 41581, "state" : "MN" } +{ "_id" : "55370", "city" : "PLATO", "loc" : [ -94.050583, 44.765728 ], "pop" : 990, "state" : "MN" } +{ "_id" : "55371", "city" : "PRINCETON", "loc" : [ -93.596143, 45.585115 ], "pop" : 8975, "state" : "MN" } +{ "_id" : "55372", "city" : "PRIOR LAKE", "loc" : [ -93.41005699999999, 44.710694 ], "pop" : 18539, "state" : "MN" } +{ "_id" : "55373", "city" : "ROCKFORD", "loc" : [ -93.765832, 45.103074 ], "pop" : 6268, "state" : "MN" } +{ "_id" : "55374", "city" : "ROGERS", "loc" : [ -93.581445, 45.171484 ], "pop" : 4957, "state" : "MN" } +{ "_id" : "55376", "city" : "SAINT MICHAEL", "loc" : [ -93.65925300000001, 45.206409 ], "pop" : 5441, "state" : "MN" } +{ "_id" : "55378", "city" : "SAVAGE", "loc" : [ -93.343445, 44.761547 ], "pop" : 7764, "state" : "MN" } +{ "_id" : "55379", "city" : "SHAKOPEE", "loc" : [ -93.51974800000001, 44.7793 ], "pop" : 14755, "state" : "MN" } +{ "_id" : "55380", "city" : "SILVER CREEK", "loc" : [ -93.94962200000001, 45.326474 ], "pop" : 1835, "state" : "MN" } +{ "_id" : "55381", "city" : "SILVER LAKE", "loc" : [ -94.197383, 44.913945 ], "pop" : 2012, "state" : "MN" } +{ "_id" : "55382", "city" : "SOUTH HAVEN", "loc" : [ -94.162768, 45.346008 ], "pop" : 4377, "state" : "MN" } +{ "_id" : "55384", "city" : "SPRING PARK", "loc" : [ -93.63410399999999, 44.935566 ], "pop" : 1571, "state" : "MN" } +{ "_id" : "55385", "city" : "STEWART", "loc" : [ -94.451572, 44.725928 ], "pop" : 1410, "state" : "MN" } +{ "_id" : "55386", "city" : "VICTORIA", "loc" : [ -93.656094, 44.858223 ], "pop" : 1367, "state" : "MN" } +{ "_id" : "55387", "city" : "WACONIA", "loc" : [ -93.7784, 44.851029 ], "pop" : 5844, "state" : "MN" } +{ "_id" : "55388", "city" : "WATERTOWN", "loc" : [ -93.848159, 44.959533 ], "pop" : 3520, "state" : "MN" } +{ "_id" : "55389", "city" : "WATKINS", "loc" : [ -94.429677, 45.308652 ], "pop" : 1998, "state" : "MN" } +{ "_id" : "55390", "city" : "WAVERLY", "loc" : [ -93.954538, 45.041265 ], "pop" : 1691, "state" : "MN" } +{ "_id" : "55391", "city" : "WAYZATA", "loc" : [ -93.52058100000001, 44.958189 ], "pop" : 15196, "state" : "MN" } +{ "_id" : "55395", "city" : "WINSTED", "loc" : [ -94.05516799999999, 44.958459 ], "pop" : 2548, "state" : "MN" } +{ "_id" : "55396", "city" : "WINTHROP", "loc" : [ -94.36984699999999, 44.543566 ], "pop" : 2630, "state" : "MN" } +{ "_id" : "55397", "city" : "YOUNG AMERICA", "loc" : [ -93.918049, 44.792905 ], "pop" : 2527, "state" : "MN" } +{ "_id" : "55398", "city" : "ZIMMERMAN", "loc" : [ -93.58785899999999, 45.455321 ], "pop" : 5786, "state" : "MN" } +{ "_id" : "55401", "city" : "MINNEAPOLIS", "loc" : [ -93.26825100000001, 44.983473 ], "pop" : 2716, "state" : "MN" } +{ "_id" : "55402", "city" : "MINNEAPOLIS", "loc" : [ -93.275871, 44.976184 ], "pop" : 261, "state" : "MN" } +{ "_id" : "55403", "city" : "MINNEAPOLIS", "loc" : [ -93.282841, 44.967345 ], "pop" : 14098, "state" : "MN" } +{ "_id" : "55404", "city" : "MINNEAPOLIS", "loc" : [ -93.26416, 44.960891 ], "pop" : 19903, "state" : "MN" } +{ "_id" : "55405", "city" : "MINNEAPOLIS", "loc" : [ -93.29909600000001, 44.968734 ], "pop" : 16148, "state" : "MN" } +{ "_id" : "55406", "city" : "MINNEAPOLIS", "loc" : [ -93.221357, 44.938359 ], "pop" : 31760, "state" : "MN" } +{ "_id" : "55407", "city" : "MINNEAPOLIS", "loc" : [ -93.25449999999999, 44.937787 ], "pop" : 34059, "state" : "MN" } +{ "_id" : "55408", "city" : "MINNEAPOLIS", "loc" : [ -93.28617300000001, 44.946575 ], "pop" : 29685, "state" : "MN" } +{ "_id" : "55409", "city" : "MINNEAPOLIS", "loc" : [ -93.28182, 44.926378 ], "pop" : 20415, "state" : "MN" } +{ "_id" : "55410", "city" : "EDINA", "loc" : [ -93.31818699999999, 44.915366 ], "pop" : 16834, "state" : "MN" } +{ "_id" : "55411", "city" : "MINNEAPOLIS", "loc" : [ -93.30054800000001, 44.999601 ], "pop" : 30088, "state" : "MN" } +{ "_id" : "55412", "city" : "MINNEAPOLIS", "loc" : [ -93.30203299999999, 45.024236 ], "pop" : 21329, "state" : "MN" } +{ "_id" : "55413", "city" : "MINNEAPOLIS", "loc" : [ -93.255194, 44.997994 ], "pop" : 12201, "state" : "MN" } +{ "_id" : "55414", "city" : "MINNEAPOLIS", "loc" : [ -93.219904, 44.977908 ], "pop" : 10535, "state" : "MN" } +{ "_id" : "55415", "city" : "MINNEAPOLIS", "loc" : [ -93.264403, 44.971455 ], "pop" : 4401, "state" : "MN" } +{ "_id" : "55416", "city" : "SAINT LOUIS PARK", "loc" : [ -93.340344, 44.946899 ], "pop" : 26211, "state" : "MN" } +{ "_id" : "55417", "city" : "MINNEAPOLIS", "loc" : [ -93.23605999999999, 44.905371 ], "pop" : 25445, "state" : "MN" } +{ "_id" : "55418", "city" : "MINNEAPOLIS", "loc" : [ -93.24010800000001, 45.01923 ], "pop" : 30904, "state" : "MN" } +{ "_id" : "55419", "city" : "MINNEAPOLIS", "loc" : [ -93.288618, 44.902567 ], "pop" : 19740, "state" : "MN" } +{ "_id" : "55420", "city" : "BLOOMINGTON", "loc" : [ -93.276034, 44.837284 ], "pop" : 22028, "state" : "MN" } +{ "_id" : "55421", "city" : "COLUMBIA HEIGHTS", "loc" : [ -93.246095, 45.049582 ], "pop" : 25668, "state" : "MN" } +{ "_id" : "55422", "city" : "ROBBINSDALE", "loc" : [ -93.339769, 45.016722 ], "pop" : 28922, "state" : "MN" } +{ "_id" : "55423", "city" : "RICHFIELD", "loc" : [ -93.281351, 44.875731 ], "pop" : 35710, "state" : "MN" } +{ "_id" : "55424", "city" : "EDINA", "loc" : [ -93.335005, 44.904385 ], "pop" : 12342, "state" : "MN" } +{ "_id" : "55425", "city" : "BLOOMINGTON", "loc" : [ -93.249413, 44.843198 ], "pop" : 8501, "state" : "MN" } +{ "_id" : "55426", "city" : "SAINT LOUIS PARK", "loc" : [ -93.379627, 44.954448 ], "pop" : 25951, "state" : "MN" } +{ "_id" : "55427", "city" : "GOLDEN VALLEY", "loc" : [ -93.381585, 45.010374 ], "pop" : 24406, "state" : "MN" } +{ "_id" : "55428", "city" : "CRYSTAL", "loc" : [ -93.376908, 45.060299 ], "pop" : 33233, "state" : "MN" } +{ "_id" : "55429", "city" : "BROOKLYN CENTER", "loc" : [ -93.340203, 45.067667 ], "pop" : 22597, "state" : "MN" } +{ "_id" : "55430", "city" : "BROOKLYN CENTER", "loc" : [ -93.29906800000001, 45.061106 ], "pop" : 21561, "state" : "MN" } +{ "_id" : "55431", "city" : "BLOOMINGTON", "loc" : [ -93.31232199999999, 44.827776 ], "pop" : 19428, "state" : "MN" } +{ "_id" : "55432", "city" : "FRIDLEY", "loc" : [ -93.253905, 45.095695 ], "pop" : 31132, "state" : "MN" } +{ "_id" : "55433", "city" : "COON RAPIDS", "loc" : [ -93.32625299999999, 45.168192 ], "pop" : 27580, "state" : "MN" } +{ "_id" : "55434", "city" : "BLAINE", "loc" : [ -93.24255700000001, 45.168083 ], "pop" : 33410, "state" : "MN" } +{ "_id" : "55435", "city" : "EDINA", "loc" : [ -93.37145200000001, 44.877143 ], "pop" : 8926, "state" : "MN" } +{ "_id" : "55436", "city" : "EDINA", "loc" : [ -93.370997, 44.902305 ], "pop" : 11750, "state" : "MN" } +{ "_id" : "55437", "city" : "BLOOMINGTON", "loc" : [ -93.34349899999999, 44.823279 ], "pop" : 19472, "state" : "MN" } +{ "_id" : "55438", "city" : "BLOOMINGTON", "loc" : [ -93.38014099999999, 44.823924 ], "pop" : 16896, "state" : "MN" } +{ "_id" : "55439", "city" : "EDINA", "loc" : [ -93.33216899999999, 44.873716 ], "pop" : 10571, "state" : "MN" } +{ "_id" : "55441", "city" : "PLYMOUTH", "loc" : [ -93.422782, 45.009836 ], "pop" : 16840, "state" : "MN" } +{ "_id" : "55442", "city" : "PLYMOUTH", "loc" : [ -93.426316, 45.045151 ], "pop" : 9893, "state" : "MN" } +{ "_id" : "55443", "city" : "BROOKLYN CENTER", "loc" : [ -93.34018399999999, 45.105586 ], "pop" : 20896, "state" : "MN" } +{ "_id" : "55444", "city" : "BROOKLYN CENTER", "loc" : [ -93.30245499999999, 45.100172 ], "pop" : 12538, "state" : "MN" } +{ "_id" : "55445", "city" : "BROOKLYN PARK", "loc" : [ -93.37349500000001, 45.103956 ], "pop" : 6398, "state" : "MN" } +{ "_id" : "55446", "city" : "PLYMOUTH", "loc" : [ -93.472323, 45.032446 ], "pop" : 7704, "state" : "MN" } +{ "_id" : "55447", "city" : "PLYMOUTH", "loc" : [ -93.49469499999999, 44.998593 ], "pop" : 16668, "state" : "MN" } +{ "_id" : "55448", "city" : "COON RAPIDS", "loc" : [ -93.289699, 45.180626 ], "pop" : 25234, "state" : "MN" } +{ "_id" : "55450", "city" : "MINNEAPOLIS", "loc" : [ -93.24741400000001, 44.865883 ], "pop" : 0, "state" : "MN" } +{ "_id" : "55454", "city" : "MINNEAPOLIS", "loc" : [ -93.242898, 44.968161 ], "pop" : 8815, "state" : "MN" } +{ "_id" : "55455", "city" : "MINNEAPOLIS", "loc" : [ -93.23927999999999, 44.981562 ], "pop" : 12216, "state" : "MN" } +{ "_id" : "55599", "city" : "LORETTO", "loc" : [ -93.664534, 45.05604 ], "pop" : 541, "state" : "MN" } +{ "_id" : "55602", "city" : "BRIMSON", "loc" : [ -91.862521, 47.314162 ], "pop" : 176, "state" : "MN" } +{ "_id" : "55603", "city" : "FINLAND", "loc" : [ -91.209597, 47.419716 ], "pop" : 565, "state" : "MN" } +{ "_id" : "55604", "city" : "GRAND MARAIS", "loc" : [ -90.339114, 47.77577 ], "pop" : 2404, "state" : "MN" } +{ "_id" : "55605", "city" : "GRAND PORTAGE", "loc" : [ -89.69886200000001, 47.959065 ], "pop" : 350, "state" : "MN" } +{ "_id" : "55606", "city" : "HOVLAND", "loc" : [ -90.04756999999999, 47.83415 ], "pop" : 218, "state" : "MN" } +{ "_id" : "55607", "city" : "ISABELLA", "loc" : [ -91.51732699999999, 47.626719 ], "pop" : 402, "state" : "MN" } +{ "_id" : "55612", "city" : "LUTSEN", "loc" : [ -90.638059, 47.683066 ], "pop" : 381, "state" : "MN" } +{ "_id" : "55613", "city" : "SCHROEDER", "loc" : [ -90.933807, 47.542185 ], "pop" : 174, "state" : "MN" } +{ "_id" : "55614", "city" : "LITTLE MARAIS", "loc" : [ -91.277753, 47.299905 ], "pop" : 2552, "state" : "MN" } +{ "_id" : "55615", "city" : "TOFTE", "loc" : [ -90.783135, 47.760792 ], "pop" : 341, "state" : "MN" } +{ "_id" : "55616", "city" : "TWO HARBORS", "loc" : [ -91.678264, 47.039364 ], "pop" : 6511, "state" : "MN" } +{ "_id" : "55702", "city" : "ALBORN", "loc" : [ -92.557937, 46.978229 ], "pop" : 601, "state" : "MN" } +{ "_id" : "55703", "city" : "ANGORA", "loc" : [ -92.64133200000001, 47.757738 ], "pop" : 291, "state" : "MN" } +{ "_id" : "55704", "city" : "ASKOV", "loc" : [ -92.75281200000001, 46.196408 ], "pop" : 919, "state" : "MN" } +{ "_id" : "55705", "city" : "AURORA", "loc" : [ -92.24148599999999, 47.495096 ], "pop" : 3674, "state" : "MN" } +{ "_id" : "55706", "city" : "BABBITT", "loc" : [ -91.956951, 47.709121 ], "pop" : 2014, "state" : "MN" } +{ "_id" : "55707", "city" : "BARNUM", "loc" : [ -92.629167, 46.519616 ], "pop" : 2028, "state" : "MN" } +{ "_id" : "55709", "city" : "BOVEY", "loc" : [ -93.372322, 47.286788 ], "pop" : 5077, "state" : "MN" } +{ "_id" : "55710", "city" : "BRITT", "loc" : [ -92.632062, 47.65496 ], "pop" : 1229, "state" : "MN" } +{ "_id" : "55711", "city" : "BROOKSTON", "loc" : [ -92.643005, 46.838425 ], "pop" : 621, "state" : "MN" } +{ "_id" : "55712", "city" : "BRUNO", "loc" : [ -92.618994, 46.284496 ], "pop" : 259, "state" : "MN" } +{ "_id" : "55717", "city" : "CANYON", "loc" : [ -92.459361, 47.078525 ], "pop" : 230, "state" : "MN" } +{ "_id" : "55718", "city" : "CARLTON", "loc" : [ -92.470984, 46.6484 ], "pop" : 3401, "state" : "MN" } +{ "_id" : "55719", "city" : "CHISHOLM", "loc" : [ -92.861693, 47.500744 ], "pop" : 7412, "state" : "MN" } +{ "_id" : "55720", "city" : "CLOQUET", "loc" : [ -92.45282, 46.726041 ], "pop" : 13503, "state" : "MN" } +{ "_id" : "55721", "city" : "COHASSET", "loc" : [ -93.639154, 47.269112 ], "pop" : 3694, "state" : "MN" } +{ "_id" : "55723", "city" : "COOK", "loc" : [ -92.72103799999999, 47.844193 ], "pop" : 2705, "state" : "MN" } +{ "_id" : "55724", "city" : "KELSEY", "loc" : [ -92.44492099999999, 47.163803 ], "pop" : 430, "state" : "MN" } +{ "_id" : "55725", "city" : "CRANE LAKE", "loc" : [ -92.48959600000001, 48.259387 ], "pop" : 74, "state" : "MN" } +{ "_id" : "55726", "city" : "CROMWELL", "loc" : [ -92.873942, 46.671784 ], "pop" : 1048, "state" : "MN" } +{ "_id" : "55727", "city" : "CULVER", "loc" : [ -92.552403, 46.911886 ], "pop" : 309, "state" : "MN" } +{ "_id" : "55731", "city" : "ELY", "loc" : [ -91.85704200000001, 47.903435 ], "pop" : 5685, "state" : "MN" } +{ "_id" : "55732", "city" : "EMBARRASS", "loc" : [ -92.21011, 47.665847 ], "pop" : 1143, "state" : "MN" } +{ "_id" : "55733", "city" : "ESKO", "loc" : [ -92.35691799999999, 46.712551 ], "pop" : 4102, "state" : "MN" } +{ "_id" : "55734", "city" : "EVELETH", "loc" : [ -92.528037, 47.451047 ], "pop" : 6135, "state" : "MN" } +{ "_id" : "55735", "city" : "FINLAYSON", "loc" : [ -92.938924, 46.212111 ], "pop" : 1264, "state" : "MN" } +{ "_id" : "55736", "city" : "FLOODWOOD", "loc" : [ -92.91668199999999, 46.907589 ], "pop" : 1475, "state" : "MN" } +{ "_id" : "55740", "city" : "GHEEN", "loc" : [ -92.906892, 47.946475 ], "pop" : 255, "state" : "MN" } +{ "_id" : "55741", "city" : "GILBERT", "loc" : [ -92.40246399999999, 47.488487 ], "pop" : 4721, "state" : "MN" } +{ "_id" : "55742", "city" : "GOODLAND", "loc" : [ -93.146914, 47.192426 ], "pop" : 437, "state" : "MN" } +{ "_id" : "55744", "city" : "LA PRAIRIE", "loc" : [ -93.527672, 47.223472 ], "pop" : 18067, "state" : "MN" } +{ "_id" : "55746", "city" : "HIBBING", "loc" : [ -92.935582, 47.4156 ], "pop" : 20816, "state" : "MN" } +{ "_id" : "55748", "city" : "HILL CITY", "loc" : [ -93.599397, 46.996817 ], "pop" : 762, "state" : "MN" } +{ "_id" : "55749", "city" : "HOLYOKE", "loc" : [ -92.374955, 46.466445 ], "pop" : 160, "state" : "MN" } +{ "_id" : "55750", "city" : "HOYT LAKES", "loc" : [ -92.140046, 47.514957 ], "pop" : 2348, "state" : "MN" } +{ "_id" : "55751", "city" : "IRON", "loc" : [ -92.619502, 47.411455 ], "pop" : 1210, "state" : "MN" } +{ "_id" : "55752", "city" : "JACOBSON", "loc" : [ -93.306359, 46.977187 ], "pop" : 387, "state" : "MN" } +{ "_id" : "55756", "city" : "KERRICK", "loc" : [ -92.578, 46.379151 ], "pop" : 487, "state" : "MN" } +{ "_id" : "55757", "city" : "KETTLE RIVER", "loc" : [ -92.904746, 46.502899 ], "pop" : 1136, "state" : "MN" } +{ "_id" : "55760", "city" : "MC GREGOR", "loc" : [ -93.29562, 46.686424 ], "pop" : 1897, "state" : "MN" } +{ "_id" : "55762", "city" : "MAHTOWA", "loc" : [ -92.606505, 46.582588 ], "pop" : 833, "state" : "MN" } +{ "_id" : "55763", "city" : "MAKINEN", "loc" : [ -92.344584, 47.341603 ], "pop" : 1028, "state" : "MN" } +{ "_id" : "55765", "city" : "MEADOWLANDS", "loc" : [ -92.788357, 47.102064 ], "pop" : 1172, "state" : "MN" } +{ "_id" : "55766", "city" : "MELRUDE", "loc" : [ -92.42644, 47.242318 ], "pop" : 121, "state" : "MN" } +{ "_id" : "55767", "city" : "MOOSE LAKE", "loc" : [ -92.74664799999999, 46.44724 ], "pop" : 2699, "state" : "MN" } +{ "_id" : "55768", "city" : "MOUNTAIN IRON", "loc" : [ -92.624274, 47.513336 ], "pop" : 1790, "state" : "MN" } +{ "_id" : "55769", "city" : "NASHWAUK", "loc" : [ -93.216818, 47.42003 ], "pop" : 4058, "state" : "MN" } +{ "_id" : "55771", "city" : "BUYCK", "loc" : [ -92.845555, 47.933881 ], "pop" : 1252, "state" : "MN" } +{ "_id" : "55773", "city" : "PARKVILLE", "loc" : [ -92.584051, 47.510296 ], "pop" : 1787, "state" : "MN" } +{ "_id" : "55775", "city" : "PENGILLY", "loc" : [ -93.193667, 47.315089 ], "pop" : 1173, "state" : "MN" } +{ "_id" : "55779", "city" : "SAGINAW", "loc" : [ -92.391723, 46.879462 ], "pop" : 3185, "state" : "MN" } +{ "_id" : "55780", "city" : "SAWYER", "loc" : [ -92.609612, 46.711799 ], "pop" : 833, "state" : "MN" } +{ "_id" : "55783", "city" : "STURGEON LAKE", "loc" : [ -92.818246, 46.383685 ], "pop" : 1883, "state" : "MN" } +{ "_id" : "55784", "city" : "SWAN RIVER", "loc" : [ -93.19643600000001, 47.07394 ], "pop" : 231, "state" : "MN" } +{ "_id" : "55785", "city" : "SWATARA", "loc" : [ -93.66848299999999, 46.929871 ], "pop" : 331, "state" : "MN" } +{ "_id" : "55787", "city" : "TAMARACK", "loc" : [ -93.13420000000001, 46.617873 ], "pop" : 559, "state" : "MN" } +{ "_id" : "55788", "city" : "TOGO", "loc" : [ -93.201545, 47.76843 ], "pop" : 632, "state" : "MN" } +{ "_id" : "55790", "city" : "TOWER", "loc" : [ -92.287781, 47.808926 ], "pop" : 2280, "state" : "MN" } +{ "_id" : "55792", "city" : "VIRGINIA", "loc" : [ -92.528525, 47.537078 ], "pop" : 11153, "state" : "MN" } +{ "_id" : "55793", "city" : "WARBA", "loc" : [ -93.276417, 47.13611 ], "pop" : 431, "state" : "MN" } +{ "_id" : "55795", "city" : "WILLOW RIVER", "loc" : [ -92.83093100000001, 46.294883 ], "pop" : 968, "state" : "MN" } +{ "_id" : "55797", "city" : "WRENSHALL", "loc" : [ -92.37177200000001, 46.592114 ], "pop" : 839, "state" : "MN" } +{ "_id" : "55798", "city" : "WRIGHT", "loc" : [ -93.002863, 46.675324 ], "pop" : 417, "state" : "MN" } +{ "_id" : "55799", "city" : "ZIM", "loc" : [ -92.629606, 47.317591 ], "pop" : 507, "state" : "MN" } +{ "_id" : "55801", "city" : "DULUTH", "loc" : [ -91.84673100000001, 47.094431 ], "pop" : 230, "state" : "MN" } +{ "_id" : "55802", "city" : "DULUTH", "loc" : [ -92.08649699999999, 46.768475 ], "pop" : 2639, "state" : "MN" } +{ "_id" : "55803", "city" : "DULUTH", "loc" : [ -92.09405700000001, 46.874913 ], "pop" : 14740, "state" : "MN" } +{ "_id" : "55804", "city" : "DULUTH", "loc" : [ -92.00743300000001, 46.855131 ], "pop" : 14207, "state" : "MN" } +{ "_id" : "55805", "city" : "DULUTH", "loc" : [ -92.094553, 46.798733 ], "pop" : 10849, "state" : "MN" } +{ "_id" : "55806", "city" : "DULUTH", "loc" : [ -92.127871, 46.771457 ], "pop" : 9723, "state" : "MN" } +{ "_id" : "55807", "city" : "DULUTH", "loc" : [ -92.169821, 46.740783 ], "pop" : 10257, "state" : "MN" } +{ "_id" : "55808", "city" : "DULUTH", "loc" : [ -92.22261, 46.681002 ], "pop" : 5903, "state" : "MN" } +{ "_id" : "55810", "city" : "PROCTOR", "loc" : [ -92.232332, 46.74459 ], "pop" : 6881, "state" : "MN" } +{ "_id" : "55811", "city" : "HERMANTOWN", "loc" : [ -92.16822500000001, 46.81341 ], "pop" : 23478, "state" : "MN" } +{ "_id" : "55812", "city" : "DULUTH", "loc" : [ -92.07669300000001, 46.810598 ], "pop" : 10296, "state" : "MN" } +{ "_id" : "55901", "city" : "ROCHESTER", "loc" : [ -92.48962, 44.049572 ], "pop" : 33744, "state" : "MN" } +{ "_id" : "55902", "city" : "ROCHESTER", "loc" : [ -92.483519, 44.003217 ], "pop" : 13594, "state" : "MN" } +{ "_id" : "55904", "city" : "ROCHESTER", "loc" : [ -92.39727600000001, 44.010545 ], "pop" : 7854, "state" : "MN" } +{ "_id" : "55906", "city" : "ROCHESTER", "loc" : [ -92.44687399999999, 44.021001 ], "pop" : 29174, "state" : "MN" } +{ "_id" : "55909", "city" : "ADAMS", "loc" : [ -92.73049399999999, 43.559119 ], "pop" : 1214, "state" : "MN" } +{ "_id" : "55910", "city" : "ALTURA", "loc" : [ -91.974474, 44.136114 ], "pop" : 2913, "state" : "MN" } +{ "_id" : "55912", "city" : "AUSTIN", "loc" : [ -92.978374, 43.669538 ], "pop" : 25655, "state" : "MN" } +{ "_id" : "55917", "city" : "BLOOMING PRAIRIE", "loc" : [ -93.06081, 43.897732 ], "pop" : 3922, "state" : "MN" } +{ "_id" : "55918", "city" : "BROWNSDALE", "loc" : [ -92.873752, 43.724761 ], "pop" : 1443, "state" : "MN" } +{ "_id" : "55919", "city" : "BROWNSVILLE", "loc" : [ -91.301226, 43.670732 ], "pop" : 995, "state" : "MN" } +{ "_id" : "55920", "city" : "BYRON", "loc" : [ -92.630753, 44.037333 ], "pop" : 7129, "state" : "MN" } +{ "_id" : "55921", "city" : "CALEDONIA", "loc" : [ -91.48365699999999, 43.622079 ], "pop" : 5049, "state" : "MN" } +{ "_id" : "55922", "city" : "CANTON", "loc" : [ -91.91295700000001, 43.566687 ], "pop" : 1390, "state" : "MN" } +{ "_id" : "55923", "city" : "CHATFIELD", "loc" : [ -92.15735100000001, 43.836201 ], "pop" : 3949, "state" : "MN" } +{ "_id" : "55924", "city" : "CLAREMONT", "loc" : [ -92.988839, 44.05223 ], "pop" : 979, "state" : "MN" } +{ "_id" : "55925", "city" : "DAKOTA", "loc" : [ -91.39404, 43.914806 ], "pop" : 725, "state" : "MN" } +{ "_id" : "55926", "city" : "DEXTER", "loc" : [ -92.726764, 43.715962 ], "pop" : 588, "state" : "MN" } +{ "_id" : "55927", "city" : "DODGE CENTER", "loc" : [ -92.85537600000001, 44.032514 ], "pop" : 3319, "state" : "MN" } +{ "_id" : "55929", "city" : "DOVER", "loc" : [ -92.14151099999999, 44.001457 ], "pop" : 1265, "state" : "MN" } +{ "_id" : "55932", "city" : "ELGIN", "loc" : [ -92.25349300000001, 44.135837 ], "pop" : 1494, "state" : "MN" } +{ "_id" : "55933", "city" : "ELKTON", "loc" : [ -92.710407, 43.634806 ], "pop" : 721, "state" : "MN" } +{ "_id" : "55934", "city" : "VIOLA", "loc" : [ -92.244068, 44.004294 ], "pop" : 2579, "state" : "MN" } +{ "_id" : "55935", "city" : "FOUNTAIN", "loc" : [ -92.14228799999999, 43.728404 ], "pop" : 662, "state" : "MN" } +{ "_id" : "55936", "city" : "GRAND MEADOW", "loc" : [ -92.569203, 43.710065 ], "pop" : 1653, "state" : "MN" } +{ "_id" : "55937", "city" : "GRANGER", "loc" : [ -92.156115, 43.544873 ], "pop" : 385, "state" : "MN" } +{ "_id" : "55939", "city" : "HARMONY", "loc" : [ -92.014511, 43.566268 ], "pop" : 1853, "state" : "MN" } +{ "_id" : "55940", "city" : "HAYFIELD", "loc" : [ -92.81748899999999, 43.892259 ], "pop" : 2254, "state" : "MN" } +{ "_id" : "55941", "city" : "HOKAH", "loc" : [ -91.345472, 43.750856 ], "pop" : 1289, "state" : "MN" } +{ "_id" : "55943", "city" : "HOUSTON", "loc" : [ -91.56256500000001, 43.792904 ], "pop" : 3337, "state" : "MN" } +{ "_id" : "55944", "city" : "KASSON", "loc" : [ -92.74642, 44.024029 ], "pop" : 4420, "state" : "MN" } +{ "_id" : "55945", "city" : "THEILMAN", "loc" : [ -92.00839000000001, 44.305396 ], "pop" : 738, "state" : "MN" } +{ "_id" : "55946", "city" : "KENYON", "loc" : [ -93.019661, 44.255237 ], "pop" : 3437, "state" : "MN" } +{ "_id" : "55947", "city" : "LA CRESCENT", "loc" : [ -91.326325, 43.830686 ], "pop" : 6700, "state" : "MN" } +{ "_id" : "55949", "city" : "LANESBORO", "loc" : [ -91.987719, 43.717447 ], "pop" : 1191, "state" : "MN" } +{ "_id" : "55951", "city" : "LE ROY", "loc" : [ -92.50646399999999, 43.531533 ], "pop" : 1478, "state" : "MN" } +{ "_id" : "55952", "city" : "LEWISTON", "loc" : [ -91.866162, 43.970193 ], "pop" : 2038, "state" : "MN" } +{ "_id" : "55953", "city" : "LYLE", "loc" : [ -92.932818, 43.530868 ], "pop" : 1314, "state" : "MN" } +{ "_id" : "55954", "city" : "MABEL", "loc" : [ -91.780636, 43.544611 ], "pop" : 1470, "state" : "MN" } +{ "_id" : "55955", "city" : "MANTORVILLE", "loc" : [ -92.75796200000001, 44.070195 ], "pop" : 1324, "state" : "MN" } +{ "_id" : "55956", "city" : "MAZEPPA", "loc" : [ -92.52068300000001, 44.264568 ], "pop" : 1560, "state" : "MN" } +{ "_id" : "55957", "city" : "MILLVILLE", "loc" : [ -92.267188, 44.235862 ], "pop" : 579, "state" : "MN" } +{ "_id" : "55959", "city" : "MINNESOTA CITY", "loc" : [ -91.74180800000001, 44.083222 ], "pop" : 1185, "state" : "MN" } +{ "_id" : "55960", "city" : "ORONOCO", "loc" : [ -92.48496, 44.148861 ], "pop" : 3319, "state" : "MN" } +{ "_id" : "55961", "city" : "OSTRANDER", "loc" : [ -92.415744, 43.597188 ], "pop" : 654, "state" : "MN" } +{ "_id" : "55962", "city" : "PETERSON", "loc" : [ -91.84433799999999, 43.77691 ], "pop" : 901, "state" : "MN" } +{ "_id" : "55963", "city" : "PINE ISLAND", "loc" : [ -92.66134700000001, 44.211009 ], "pop" : 3832, "state" : "MN" } +{ "_id" : "55964", "city" : "PLAINVIEW", "loc" : [ -92.162125, 44.16373 ], "pop" : 3303, "state" : "MN" } +{ "_id" : "55965", "city" : "PRESTON", "loc" : [ -92.096039, 43.664132 ], "pop" : 1866, "state" : "MN" } +{ "_id" : "55967", "city" : "RACINE", "loc" : [ -92.531013, 43.78997 ], "pop" : 1107, "state" : "MN" } +{ "_id" : "55969", "city" : "ROLLINGSTONE", "loc" : [ -91.81579499999999, 44.102501 ], "pop" : 1085, "state" : "MN" } +{ "_id" : "55970", "city" : "ROSE CREEK", "loc" : [ -92.862082, 43.627423 ], "pop" : 952, "state" : "MN" } +{ "_id" : "55971", "city" : "RUSHFORD", "loc" : [ -91.75364999999999, 43.821626 ], "pop" : 2809, "state" : "MN" } +{ "_id" : "55972", "city" : "SAINT CHARLES", "loc" : [ -92.051738, 43.958481 ], "pop" : 3704, "state" : "MN" } +{ "_id" : "55973", "city" : "SARGEANT", "loc" : [ -92.759517, 43.808976 ], "pop" : 349, "state" : "MN" } +{ "_id" : "55974", "city" : "SPRING GROVE", "loc" : [ -91.636788, 43.562339 ], "pop" : 2333, "state" : "MN" } +{ "_id" : "55975", "city" : "SPRING VALLEY", "loc" : [ -92.367985, 43.682288 ], "pop" : 4506, "state" : "MN" } +{ "_id" : "55976", "city" : "STEWARTVILLE", "loc" : [ -92.454654, 43.867345 ], "pop" : 6847, "state" : "MN" } +{ "_id" : "55977", "city" : "TAOPI", "loc" : [ -92.633455, 43.545783 ], "pop" : 350, "state" : "MN" } +{ "_id" : "55978", "city" : "THEILMAN", "loc" : [ -92.211579, 44.30278 ], "pop" : 402, "state" : "MN" } +{ "_id" : "55979", "city" : "UTICA", "loc" : [ -91.941737, 43.958727 ], "pop" : 599, "state" : "MN" } +{ "_id" : "55981", "city" : "WABASHA", "loc" : [ -92.036058, 44.370273 ], "pop" : 3743, "state" : "MN" } +{ "_id" : "55982", "city" : "WALTHAM", "loc" : [ -92.873446, 43.806958 ], "pop" : 561, "state" : "MN" } +{ "_id" : "55983", "city" : "WANAMINGO", "loc" : [ -92.810258, 44.31214 ], "pop" : 1319, "state" : "MN" } +{ "_id" : "55985", "city" : "WEST CONCORD", "loc" : [ -92.88249500000001, 44.151954 ], "pop" : 2040, "state" : "MN" } +{ "_id" : "55986", "city" : "WHALAN", "loc" : [ -91.918863, 43.716528 ], "pop" : 269, "state" : "MN" } +{ "_id" : "55987", "city" : "GOODVIEW", "loc" : [ -91.65334799999999, 44.039132 ], "pop" : 34518, "state" : "MN" } +{ "_id" : "55990", "city" : "WYKOFF", "loc" : [ -92.267921, 43.71464 ], "pop" : 954, "state" : "MN" } +{ "_id" : "55991", "city" : "HAMMOND", "loc" : [ -92.40396699999999, 44.248812 ], "pop" : 1720, "state" : "MN" } +{ "_id" : "55992", "city" : "ZUMBROTA", "loc" : [ -92.671863, 44.303179 ], "pop" : 3535, "state" : "MN" } +{ "_id" : "56001", "city" : "MANKATO", "loc" : [ -93.996044, 44.153809 ], "pop" : 38417, "state" : "MN" } +{ "_id" : "56003", "city" : "NORTH MANKATO", "loc" : [ -94.031476, 44.177541 ], "pop" : 11629, "state" : "MN" } +{ "_id" : "56007", "city" : "ALBERT LEA", "loc" : [ -93.370672, 43.653678 ], "pop" : 21186, "state" : "MN" } +{ "_id" : "56009", "city" : "ALDEN", "loc" : [ -93.582307, 43.646586 ], "pop" : 1660, "state" : "MN" } +{ "_id" : "56010", "city" : "AMBOY", "loc" : [ -94.177353, 43.890326 ], "pop" : 1449, "state" : "MN" } +{ "_id" : "56011", "city" : "BELLE PLAINE", "loc" : [ -93.76039400000001, 44.613852 ], "pop" : 4623, "state" : "MN" } +{ "_id" : "56013", "city" : "BLUE EARTH", "loc" : [ -94.09237899999999, 43.639426 ], "pop" : 5090, "state" : "MN" } +{ "_id" : "56014", "city" : "BRICELYN", "loc" : [ -93.82108100000001, 43.574628 ], "pop" : 912, "state" : "MN" } +{ "_id" : "56016", "city" : "CLARKS GROVE", "loc" : [ -93.323222, 43.762971 ], "pop" : 956, "state" : "MN" } +{ "_id" : "56017", "city" : "CLEVELAND", "loc" : [ -93.828622, 44.32014 ], "pop" : 1258, "state" : "MN" } +{ "_id" : "56019", "city" : "COMFREY", "loc" : [ -94.91345, 44.111069 ], "pop" : 981, "state" : "MN" } +{ "_id" : "56020", "city" : "CONGER", "loc" : [ -93.522358, 43.611417 ], "pop" : 277, "state" : "MN" } +{ "_id" : "56021", "city" : "COURTLAND", "loc" : [ -94.348229, 44.279083 ], "pop" : 1122, "state" : "MN" } +{ "_id" : "56022", "city" : "DARFUR", "loc" : [ -94.813416, 44.061034 ], "pop" : 331, "state" : "MN" } +{ "_id" : "56023", "city" : "DELAVAN", "loc" : [ -94.022488, 43.771859 ], "pop" : 310, "state" : "MN" } +{ "_id" : "56024", "city" : "EAGLE LAKE", "loc" : [ -93.87191199999999, 44.154587 ], "pop" : 2218, "state" : "MN" } +{ "_id" : "56025", "city" : "EASTON", "loc" : [ -93.933994, 43.758126 ], "pop" : 793, "state" : "MN" } +{ "_id" : "56026", "city" : "ELLENDALE", "loc" : [ -93.319492, 43.882591 ], "pop" : 1051, "state" : "MN" } +{ "_id" : "56027", "city" : "ELMORE", "loc" : [ -94.09836799999999, 43.520065 ], "pop" : 1125, "state" : "MN" } +{ "_id" : "56028", "city" : "ELYSIAN", "loc" : [ -93.69649800000001, 44.22313 ], "pop" : 1303, "state" : "MN" } +{ "_id" : "56029", "city" : "EMMONS", "loc" : [ -93.48244099999999, 43.508851 ], "pop" : 599, "state" : "MN" } +{ "_id" : "56030", "city" : "ESSIG", "loc" : [ -94.56823, 44.323754 ], "pop" : 522, "state" : "MN" } +{ "_id" : "56031", "city" : "FAIRMONT", "loc" : [ -94.45095000000001, 43.637592 ], "pop" : 12732, "state" : "MN" } +{ "_id" : "56032", "city" : "FREEBORN", "loc" : [ -93.57454300000001, 43.784763 ], "pop" : 632, "state" : "MN" } +{ "_id" : "56033", "city" : "FROST", "loc" : [ -93.936099, 43.563796 ], "pop" : 388, "state" : "MN" } +{ "_id" : "56034", "city" : "GARDEN CITY", "loc" : [ -94.179084, 44.046748 ], "pop" : 460, "state" : "MN" } +{ "_id" : "56035", "city" : "GENEVA", "loc" : [ -93.267096, 43.82354 ], "pop" : 524, "state" : "MN" } +{ "_id" : "56036", "city" : "GLENVILLE", "loc" : [ -93.26176100000001, 43.557749 ], "pop" : 1254, "state" : "MN" } +{ "_id" : "56037", "city" : "GOOD THUNDER", "loc" : [ -94.067662, 43.995187 ], "pop" : 941, "state" : "MN" } +{ "_id" : "56039", "city" : "GRANADA", "loc" : [ -94.330731, 43.706082 ], "pop" : 681, "state" : "MN" } +{ "_id" : "56041", "city" : "HANSKA", "loc" : [ -94.493267, 44.152678 ], "pop" : 1184, "state" : "MN" } +{ "_id" : "56042", "city" : "HARTLAND", "loc" : [ -93.47695299999999, 43.803989 ], "pop" : 612, "state" : "MN" } +{ "_id" : "56043", "city" : "HAYWARD", "loc" : [ -93.23772700000001, 43.63864 ], "pop" : 705, "state" : "MN" } +{ "_id" : "56044", "city" : "HENDERSON", "loc" : [ -93.934487, 44.534398 ], "pop" : 1785, "state" : "MN" } +{ "_id" : "56045", "city" : "HOLLANDALE", "loc" : [ -93.16798900000001, 43.752842 ], "pop" : 2346, "state" : "MN" } +{ "_id" : "56046", "city" : "HOPE", "loc" : [ -93.345823, 43.979723 ], "pop" : 520, "state" : "MN" } +{ "_id" : "56047", "city" : "HUNTLEY", "loc" : [ -94.201567, 43.723746 ], "pop" : 469, "state" : "MN" } +{ "_id" : "56048", "city" : "JANESVILLE", "loc" : [ -93.709462, 44.116778 ], "pop" : 2996, "state" : "MN" } +{ "_id" : "56050", "city" : "KASOTA", "loc" : [ -93.945319, 44.284188 ], "pop" : 1958, "state" : "MN" } +{ "_id" : "56051", "city" : "KIESTER", "loc" : [ -93.71019099999999, 43.541445 ], "pop" : 923, "state" : "MN" } +{ "_id" : "56052", "city" : "KILKENNY", "loc" : [ -93.516397, 44.318532 ], "pop" : 1249, "state" : "MN" } +{ "_id" : "56054", "city" : "LAFAYETTE", "loc" : [ -94.436463, 44.407315 ], "pop" : 2268, "state" : "MN" } +{ "_id" : "56055", "city" : "LAKE CRYSTAL", "loc" : [ -94.218385, 44.120189 ], "pop" : 3350, "state" : "MN" } +{ "_id" : "56057", "city" : "LE CENTER", "loc" : [ -93.721428, 44.385348 ], "pop" : 3284, "state" : "MN" } +{ "_id" : "56058", "city" : "LE SUEUR", "loc" : [ -93.885588, 44.458154 ], "pop" : 5491, "state" : "MN" } +{ "_id" : "56060", "city" : "LEWISVILLE", "loc" : [ -94.428854, 43.920922 ], "pop" : 568, "state" : "MN" } +{ "_id" : "56061", "city" : "LONDON", "loc" : [ -93.116527, 43.543455 ], "pop" : 437, "state" : "MN" } +{ "_id" : "56062", "city" : "MADELIA", "loc" : [ -94.410994, 44.049949 ], "pop" : 3012, "state" : "MN" } +{ "_id" : "56063", "city" : "MADISON LAKE", "loc" : [ -93.82889299999999, 44.222074 ], "pop" : 2135, "state" : "MN" } +{ "_id" : "56064", "city" : "MANCHESTER", "loc" : [ -93.46065400000001, 43.716762 ], "pop" : 552, "state" : "MN" } +{ "_id" : "56065", "city" : "MAPLETON", "loc" : [ -93.954247, 43.933065 ], "pop" : 2299, "state" : "MN" } +{ "_id" : "56067", "city" : "MERIDEN", "loc" : [ -93.351167, 44.069875 ], "pop" : 693, "state" : "MN" } +{ "_id" : "56068", "city" : "MINNESOTA LAKE", "loc" : [ -93.82820100000001, 43.829465 ], "pop" : 944, "state" : "MN" } +{ "_id" : "56069", "city" : "MONTGOMERY", "loc" : [ -93.581024, 44.435591 ], "pop" : 3026, "state" : "MN" } +{ "_id" : "56071", "city" : "NEW PRAGUE", "loc" : [ -93.580473, 44.540239 ], "pop" : 6601, "state" : "MN" } +{ "_id" : "56072", "city" : "NEW RICHLAND", "loc" : [ -93.49954099999999, 43.893724 ], "pop" : 1964, "state" : "MN" } +{ "_id" : "56073", "city" : "NEW ULM", "loc" : [ -94.464421, 44.304378 ], "pop" : 15142, "state" : "MN" } +{ "_id" : "56074", "city" : "NICOLLET", "loc" : [ -94.186701, 44.272373 ], "pop" : 1654, "state" : "MN" } +{ "_id" : "56075", "city" : "NORTHROP", "loc" : [ -94.43495, 43.721164 ], "pop" : 724, "state" : "MN" } +{ "_id" : "56076", "city" : "OAKLAND", "loc" : [ -93.11132499999999, 43.632981 ], "pop" : 394, "state" : "MN" } +{ "_id" : "56077", "city" : "OTISCO", "loc" : [ -93.474097, 43.981513 ], "pop" : 623, "state" : "MN" } +{ "_id" : "56078", "city" : "PEMBERTON", "loc" : [ -93.818449, 43.959955 ], "pop" : 880, "state" : "MN" } +{ "_id" : "56080", "city" : "SAINT CLAIR", "loc" : [ -93.844932, 44.077775 ], "pop" : 1083, "state" : "MN" } +{ "_id" : "56081", "city" : "SAINT JAMES", "loc" : [ -94.622935, 43.987519 ], "pop" : 6472, "state" : "MN" } +{ "_id" : "56082", "city" : "SAINT PETER", "loc" : [ -93.981061, 44.335107 ], "pop" : 11277, "state" : "MN" } +{ "_id" : "56083", "city" : "SANBORN", "loc" : [ -95.13279300000001, 44.218291 ], "pop" : 1030, "state" : "MN" } +{ "_id" : "56085", "city" : "SLEEPY EYE", "loc" : [ -94.727251, 44.282089 ], "pop" : 6092, "state" : "MN" } +{ "_id" : "56087", "city" : "SPRINGFIELD", "loc" : [ -94.979204, 44.232905 ], "pop" : 2915, "state" : "MN" } +{ "_id" : "56088", "city" : "TRUMAN", "loc" : [ -94.431862, 43.820008 ], "pop" : 2319, "state" : "MN" } +{ "_id" : "56089", "city" : "TWIN LAKES", "loc" : [ -93.388667, 43.553951 ], "pop" : 926, "state" : "MN" } +{ "_id" : "56090", "city" : "VERNON CENTER", "loc" : [ -94.214212, 43.970557 ], "pop" : 942, "state" : "MN" } +{ "_id" : "56091", "city" : "WALDORF", "loc" : [ -93.70426399999999, 43.939868 ], "pop" : 962, "state" : "MN" } +{ "_id" : "56092", "city" : "WALTERS", "loc" : [ -93.70102, 43.623868 ], "pop" : 400, "state" : "MN" } +{ "_id" : "56093", "city" : "WASECA", "loc" : [ -93.510828, 44.0834 ], "pop" : 11534, "state" : "MN" } +{ "_id" : "56096", "city" : "WATERVILLE", "loc" : [ -93.575063, 44.223796 ], "pop" : 2390, "state" : "MN" } +{ "_id" : "56097", "city" : "WELLS", "loc" : [ -93.732069, 43.743396 ], "pop" : 3585, "state" : "MN" } +{ "_id" : "56098", "city" : "WINNEBAGO", "loc" : [ -94.16324, 43.77549 ], "pop" : 1998, "state" : "MN" } +{ "_id" : "56101", "city" : "WILDER", "loc" : [ -95.15153100000001, 43.879022 ], "pop" : 6224, "state" : "MN" } +{ "_id" : "56110", "city" : "ADRIAN", "loc" : [ -95.927261, 43.619683 ], "pop" : 1899, "state" : "MN" } +{ "_id" : "56111", "city" : "ALPHA", "loc" : [ -94.90508800000001, 43.594594 ], "pop" : 674, "state" : "MN" } +{ "_id" : "56112", "city" : "AMIRET", "loc" : [ -95.71904600000001, 44.325134 ], "pop" : 556, "state" : "MN" } +{ "_id" : "56113", "city" : "ARCO", "loc" : [ -96.199913, 44.409147 ], "pop" : 515, "state" : "MN" } +{ "_id" : "56114", "city" : "AVOCA", "loc" : [ -95.60015199999999, 43.970553 ], "pop" : 572, "state" : "MN" } +{ "_id" : "56115", "city" : "BALATON", "loc" : [ -95.88377, 44.225253 ], "pop" : 1305, "state" : "MN" } +{ "_id" : "56116", "city" : "BEAVER CREEK", "loc" : [ -96.369771, 43.622343 ], "pop" : 694, "state" : "MN" } +{ "_id" : "56117", "city" : "BIGELOW", "loc" : [ -95.651527, 43.533612 ], "pop" : 633, "state" : "MN" } +{ "_id" : "56118", "city" : "BINGHAM LAKE", "loc" : [ -95.04571, 43.894155 ], "pop" : 432, "state" : "MN" } +{ "_id" : "56119", "city" : "BREWSTER", "loc" : [ -95.480676, 43.703223 ], "pop" : 800, "state" : "MN" } +{ "_id" : "56120", "city" : "BUTTERFIELD", "loc" : [ -94.795627, 43.965417 ], "pop" : 894, "state" : "MN" } +{ "_id" : "56121", "city" : "CEYLON", "loc" : [ -94.614908, 43.538243 ], "pop" : 1051, "state" : "MN" } +{ "_id" : "56122", "city" : "CHANDLER", "loc" : [ -95.929616, 43.916308 ], "pop" : 808, "state" : "MN" } +{ "_id" : "56123", "city" : "CURRIE", "loc" : [ -95.695323, 44.094616 ], "pop" : 1254, "state" : "MN" } +{ "_id" : "56124", "city" : "DELFT", "loc" : [ -95.047234, 43.978502 ], "pop" : 363, "state" : "MN" } +{ "_id" : "56125", "city" : "DOVRAY", "loc" : [ -95.52708199999999, 44.05967 ], "pop" : 277, "state" : "MN" } +{ "_id" : "56126", "city" : "DUNDEE", "loc" : [ -95.499286, 43.819052 ], "pop" : 414, "state" : "MN" } +{ "_id" : "56127", "city" : "DUNNELL", "loc" : [ -94.787558, 43.553052 ], "pop" : 452, "state" : "MN" } +{ "_id" : "56128", "city" : "EDGERTON", "loc" : [ -96.146333, 43.882419 ], "pop" : 2045, "state" : "MN" } +{ "_id" : "56129", "city" : "ELLSWORTH", "loc" : [ -96.01124799999999, 43.526539 ], "pop" : 852, "state" : "MN" } +{ "_id" : "56131", "city" : "FULDA", "loc" : [ -95.597937, 43.875298 ], "pop" : 1792, "state" : "MN" } +{ "_id" : "56132", "city" : "GARVIN", "loc" : [ -95.76721499999999, 44.229318 ], "pop" : 471, "state" : "MN" } +{ "_id" : "56133", "city" : "HADLEY", "loc" : [ -95.86902499999999, 44.03105 ], "pop" : 429, "state" : "MN" } +{ "_id" : "56134", "city" : "HARDWICK", "loc" : [ -96.21607, 43.791072 ], "pop" : 461, "state" : "MN" } +{ "_id" : "56136", "city" : "HENDRICKS", "loc" : [ -96.407753, 44.499514 ], "pop" : 1305, "state" : "MN" } +{ "_id" : "56137", "city" : "HERON LAKE", "loc" : [ -95.326736, 43.79788 ], "pop" : 1190, "state" : "MN" } +{ "_id" : "56138", "city" : "HILLS", "loc" : [ -96.364527, 43.533548 ], "pop" : 1072, "state" : "MN" } +{ "_id" : "56139", "city" : "HOLLAND", "loc" : [ -96.19027699999999, 44.075904 ], "pop" : 682, "state" : "MN" } +{ "_id" : "56141", "city" : "IONA", "loc" : [ -95.77176900000001, 43.902631 ], "pop" : 434, "state" : "MN" } +{ "_id" : "56142", "city" : "IVANHOE", "loc" : [ -96.22605900000001, 44.507119 ], "pop" : 1683, "state" : "MN" } +{ "_id" : "56143", "city" : "JACKSON", "loc" : [ -94.993827, 43.645732 ], "pop" : 5119, "state" : "MN" } +{ "_id" : "56144", "city" : "JASPER", "loc" : [ -96.385035, 43.856827 ], "pop" : 1220, "state" : "MN" } +{ "_id" : "56145", "city" : "JEFFERS", "loc" : [ -95.154664, 44.073678 ], "pop" : 1000, "state" : "MN" } +{ "_id" : "56146", "city" : "KANARANZI", "loc" : [ -96.111306, 43.54979 ], "pop" : 320, "state" : "MN" } +{ "_id" : "56147", "city" : "KENNETH", "loc" : [ -96.10886000000001, 43.763738 ], "pop" : 523, "state" : "MN" } +{ "_id" : "56149", "city" : "LAKE BENTON", "loc" : [ -96.29103499999999, 44.278211 ], "pop" : 1323, "state" : "MN" } +{ "_id" : "56150", "city" : "LAKEFIELD", "loc" : [ -95.184834, 43.654456 ], "pop" : 3233, "state" : "MN" } +{ "_id" : "56151", "city" : "LAKE WILSON", "loc" : [ -95.97973, 44.009529 ], "pop" : 749, "state" : "MN" } +{ "_id" : "56152", "city" : "LAMBERTON", "loc" : [ -95.273946, 44.237776 ], "pop" : 1736, "state" : "MN" } +{ "_id" : "56153", "city" : "LEOTA", "loc" : [ -96.005392, 43.822628 ], "pop" : 504, "state" : "MN" } +{ "_id" : "56155", "city" : "LISMORE", "loc" : [ -95.96817799999999, 43.733857 ], "pop" : 494, "state" : "MN" } +{ "_id" : "56156", "city" : "LUVERNE", "loc" : [ -96.22156200000001, 43.661366 ], "pop" : 5436, "state" : "MN" } +{ "_id" : "56157", "city" : "LYND", "loc" : [ -95.923284, 44.40322 ], "pop" : 1005, "state" : "MN" } +{ "_id" : "56158", "city" : "MAGNOLIA", "loc" : [ -96.100825, 43.638211 ], "pop" : 458, "state" : "MN" } +{ "_id" : "56159", "city" : "MOUNTAIN LAKE", "loc" : [ -94.927313, 43.938998 ], "pop" : 2506, "state" : "MN" } +{ "_id" : "56160", "city" : "ODIN", "loc" : [ -94.77401999999999, 43.882402 ], "pop" : 382, "state" : "MN" } +{ "_id" : "56161", "city" : "OKABENA", "loc" : [ -95.338112, 43.72302 ], "pop" : 606, "state" : "MN" } +{ "_id" : "56162", "city" : "ORMSBY", "loc" : [ -94.68725499999999, 43.861639 ], "pop" : 221, "state" : "MN" } +{ "_id" : "56164", "city" : "HATFIELD", "loc" : [ -96.322762, 44.009516 ], "pop" : 5923, "state" : "MN" } +{ "_id" : "56165", "city" : "READING", "loc" : [ -95.738945, 43.713604 ], "pop" : 400, "state" : "MN" } +{ "_id" : "56166", "city" : "REVERE", "loc" : [ -95.39958799999999, 44.271326 ], "pop" : 459, "state" : "MN" } +{ "_id" : "56167", "city" : "ROUND LAKE", "loc" : [ -95.45015100000001, 43.562045 ], "pop" : 1236, "state" : "MN" } +{ "_id" : "56168", "city" : "RUSHMORE", "loc" : [ -95.77672800000001, 43.624011 ], "pop" : 726, "state" : "MN" } +{ "_id" : "56169", "city" : "RUSSELL", "loc" : [ -95.942564, 44.320129 ], "pop" : 781, "state" : "MN" } +{ "_id" : "56170", "city" : "FLORENCE", "loc" : [ -96.07902799999999, 44.163836 ], "pop" : 737, "state" : "MN" } +{ "_id" : "56171", "city" : "SHERBURN", "loc" : [ -94.726877, 43.661089 ], "pop" : 2275, "state" : "MN" } +{ "_id" : "56172", "city" : "SLAYTON", "loc" : [ -95.755448, 43.985596 ], "pop" : 2535, "state" : "MN" } +{ "_id" : "56173", "city" : "STEEN", "loc" : [ -96.24386800000001, 43.531728 ], "pop" : 526, "state" : "MN" } +{ "_id" : "56174", "city" : "STORDEN", "loc" : [ -95.30192599999999, 44.052383 ], "pop" : 537, "state" : "MN" } +{ "_id" : "56175", "city" : "TRACY", "loc" : [ -95.621301, 44.234201 ], "pop" : 2390, "state" : "MN" } +{ "_id" : "56176", "city" : "TRIMONT", "loc" : [ -94.71863, 43.782702 ], "pop" : 1349, "state" : "MN" } +{ "_id" : "56178", "city" : "TYLER", "loc" : [ -96.130235, 44.277342 ], "pop" : 1940, "state" : "MN" } +{ "_id" : "56179", "city" : "VERDI", "loc" : [ -96.372429, 44.234078 ], "pop" : 234, "state" : "MN" } +{ "_id" : "56180", "city" : "WALNUT GROVE", "loc" : [ -95.49645099999999, 44.229375 ], "pop" : 1277, "state" : "MN" } +{ "_id" : "56181", "city" : "WELCOME", "loc" : [ -94.588593, 43.67052 ], "pop" : 1435, "state" : "MN" } +{ "_id" : "56183", "city" : "WESTBROOK", "loc" : [ -95.423208, 44.065381 ], "pop" : 1362, "state" : "MN" } +{ "_id" : "56185", "city" : "WILMONT", "loc" : [ -95.832421, 43.7692 ], "pop" : 1101, "state" : "MN" } +{ "_id" : "56186", "city" : "WOODSTOCK", "loc" : [ -96.119198, 43.987338 ], "pop" : 451, "state" : "MN" } +{ "_id" : "56187", "city" : "WORTHINGTON", "loc" : [ -95.605907, 43.628626 ], "pop" : 11556, "state" : "MN" } +{ "_id" : "56201", "city" : "WILLMAR", "loc" : [ -95.05231499999999, 45.139264 ], "pop" : 22069, "state" : "MN" } +{ "_id" : "56207", "city" : "ALBERTA", "loc" : [ -96.049772, 45.557086 ], "pop" : 296, "state" : "MN" } +{ "_id" : "56208", "city" : "APPLETON", "loc" : [ -95.994872, 45.20543 ], "pop" : 2294, "state" : "MN" } +{ "_id" : "56209", "city" : "ATWATER", "loc" : [ -94.793779, 45.111645 ], "pop" : 1841, "state" : "MN" } +{ "_id" : "56210", "city" : "BARRY", "loc" : [ -96.56052699999999, 45.547446 ], "pop" : 135, "state" : "MN" } +{ "_id" : "56211", "city" : "BEARDSLEY", "loc" : [ -96.706013, 45.553855 ], "pop" : 494, "state" : "MN" } +{ "_id" : "56212", "city" : "BELLINGHAM", "loc" : [ -96.32235, 45.155626 ], "pop" : 715, "state" : "MN" } +{ "_id" : "56214", "city" : "BELVIEW", "loc" : [ -95.317757, 44.605486 ], "pop" : 750, "state" : "MN" } +{ "_id" : "56215", "city" : "BENSON", "loc" : [ -95.576644, 45.312904 ], "pop" : 5107, "state" : "MN" } +{ "_id" : "56216", "city" : "SVEA", "loc" : [ -95.06395500000001, 44.939512 ], "pop" : 668, "state" : "MN" } +{ "_id" : "56218", "city" : "BOYD", "loc" : [ -95.94210200000001, 44.850725 ], "pop" : 668, "state" : "MN" } +{ "_id" : "56219", "city" : "BROWNS VALLEY", "loc" : [ -96.80625000000001, 45.606934 ], "pop" : 1128, "state" : "MN" } +{ "_id" : "56220", "city" : "CANBY", "loc" : [ -96.27839400000001, 44.720187 ], "pop" : 3043, "state" : "MN" } +{ "_id" : "56221", "city" : "CHOKIO", "loc" : [ -96.17331, 45.552369 ], "pop" : 785, "state" : "MN" } +{ "_id" : "56222", "city" : "CLARA CITY", "loc" : [ -95.349902, 44.963912 ], "pop" : 1879, "state" : "MN" } +{ "_id" : "56223", "city" : "CLARKFIELD", "loc" : [ -95.830405, 44.774261 ], "pop" : 1623, "state" : "MN" } +{ "_id" : "56224", "city" : "CLEMENTS", "loc" : [ -95.04744700000001, 44.39432 ], "pop" : 398, "state" : "MN" } +{ "_id" : "56225", "city" : "CLINTON", "loc" : [ -96.418161, 45.457659 ], "pop" : 843, "state" : "MN" } +{ "_id" : "56226", "city" : "CLONTARF", "loc" : [ -95.678629, 45.373418 ], "pop" : 279, "state" : "MN" } +{ "_id" : "56227", "city" : "CORRELL", "loc" : [ -96.17526599999999, 45.290742 ], "pop" : 397, "state" : "MN" } +{ "_id" : "56228", "city" : "COSMOS", "loc" : [ -94.697827, 44.958969 ], "pop" : 1217, "state" : "MN" } +{ "_id" : "56229", "city" : "COTTONWOOD", "loc" : [ -95.692508, 44.600251 ], "pop" : 1552, "state" : "MN" } +{ "_id" : "56230", "city" : "DANUBE", "loc" : [ -95.078366, 44.795567 ], "pop" : 1179, "state" : "MN" } +{ "_id" : "56231", "city" : "DANVERS", "loc" : [ -95.886194, 45.341853 ], "pop" : 710, "state" : "MN" } +{ "_id" : "56232", "city" : "DAWSON", "loc" : [ -96.01501399999999, 44.931737 ], "pop" : 2496, "state" : "MN" } +{ "_id" : "56233", "city" : "DE GRAFF", "loc" : [ -95.44658800000001, 45.270845 ], "pop" : 336, "state" : "MN" } +{ "_id" : "56235", "city" : "DONNELLY", "loc" : [ -96.064937, 45.70137 ], "pop" : 526, "state" : "MN" } +{ "_id" : "56236", "city" : "DUMONT", "loc" : [ -96.40612299999999, 45.671742 ], "pop" : 727, "state" : "MN" } +{ "_id" : "56237", "city" : "ECHO", "loc" : [ -95.418223, 44.631046 ], "pop" : 797, "state" : "MN" } +{ "_id" : "56238", "city" : "EVAN", "loc" : [ -94.816956, 44.351114 ], "pop" : 222, "state" : "MN" } +{ "_id" : "56239", "city" : "GHENT", "loc" : [ -95.893642, 44.507843 ], "pop" : 661, "state" : "MN" } +{ "_id" : "56240", "city" : "GRACEVILLE", "loc" : [ -96.420925, 45.560248 ], "pop" : 1019, "state" : "MN" } +{ "_id" : "56241", "city" : "GRANITE FALLS", "loc" : [ -95.551557, 44.808749 ], "pop" : 4051, "state" : "MN" } +{ "_id" : "56243", "city" : "GROVE CITY", "loc" : [ -94.687843, 45.153172 ], "pop" : 1428, "state" : "MN" } +{ "_id" : "56244", "city" : "HANCOCK", "loc" : [ -95.800775, 45.498464 ], "pop" : 1255, "state" : "MN" } +{ "_id" : "56245", "city" : "HANLEY FALLS", "loc" : [ -95.682492, 44.678862 ], "pop" : 652, "state" : "MN" } +{ "_id" : "56246", "city" : "HAWICK", "loc" : [ -94.820762, 45.361775 ], "pop" : 536, "state" : "MN" } +{ "_id" : "56247", "city" : "HAZEL RUN", "loc" : [ -95.712187, 44.749688 ], "pop" : 328, "state" : "MN" } +{ "_id" : "56248", "city" : "HERMAN", "loc" : [ -96.099188, 45.807104 ], "pop" : 928, "state" : "MN" } +{ "_id" : "56249", "city" : "HOLLOWAY", "loc" : [ -95.916374, 45.270805 ], "pop" : 283, "state" : "MN" } +{ "_id" : "56250", "city" : "JOHNSON", "loc" : [ -96.266277, 45.573007 ], "pop" : 12, "state" : "MN" } +{ "_id" : "56251", "city" : "KANDIYOHI", "loc" : [ -94.94727399999999, 45.123162 ], "pop" : 1169, "state" : "MN" } +{ "_id" : "56252", "city" : "KERKHOVEN", "loc" : [ -95.311465, 45.209626 ], "pop" : 1267, "state" : "MN" } +{ "_id" : "56253", "city" : "LAKE LILLIAN", "loc" : [ -94.901443, 44.96603 ], "pop" : 1106, "state" : "MN" } +{ "_id" : "56254", "city" : "LOUISBURG", "loc" : [ -96.171539, 45.130556 ], "pop" : 307, "state" : "MN" } +{ "_id" : "56255", "city" : "LUCAN", "loc" : [ -95.411934, 44.413237 ], "pop" : 487, "state" : "MN" } +{ "_id" : "56256", "city" : "MADISON", "loc" : [ -96.164507, 44.994618 ], "pop" : 3857, "state" : "MN" } +{ "_id" : "56257", "city" : "MARIETTA", "loc" : [ -96.409448, 44.963582 ], "pop" : 588, "state" : "MN" } +{ "_id" : "56258", "city" : "MARSHALL", "loc" : [ -95.779454, 44.448127 ], "pop" : 13489, "state" : "MN" } +{ "_id" : "56260", "city" : "MAYNARD", "loc" : [ -95.48450800000001, 44.922615 ], "pop" : 1004, "state" : "MN" } +{ "_id" : "56262", "city" : "MILAN", "loc" : [ -95.869045, 45.114317 ], "pop" : 864, "state" : "MN" } +{ "_id" : "56263", "city" : "MILROY", "loc" : [ -95.55447100000001, 44.436494 ], "pop" : 907, "state" : "MN" } +{ "_id" : "56264", "city" : "MINNEOTA", "loc" : [ -95.976714, 44.558732 ], "pop" : 2056, "state" : "MN" } +{ "_id" : "56265", "city" : "MONTEVIDEO", "loc" : [ -95.676473, 44.968829 ], "pop" : 8405, "state" : "MN" } +{ "_id" : "56266", "city" : "MORGAN", "loc" : [ -94.921783, 44.392554 ], "pop" : 2257, "state" : "MN" } +{ "_id" : "56267", "city" : "MORRIS", "loc" : [ -95.91723399999999, 45.592095 ], "pop" : 7772, "state" : "MN" } +{ "_id" : "56270", "city" : "MORTON", "loc" : [ -95.02681699999999, 44.566189 ], "pop" : 962, "state" : "MN" } +{ "_id" : "56271", "city" : "MURDOCK", "loc" : [ -95.40489700000001, 45.216147 ], "pop" : 448, "state" : "MN" } +{ "_id" : "56272", "city" : "NASSAU", "loc" : [ -96.413307, 45.107554 ], "pop" : 293, "state" : "MN" } +{ "_id" : "56273", "city" : "NEW LONDON", "loc" : [ -94.948008, 45.294936 ], "pop" : 4077, "state" : "MN" } +{ "_id" : "56274", "city" : "NORCROSS", "loc" : [ -96.134168, 45.885839 ], "pop" : 303, "state" : "MN" } +{ "_id" : "56276", "city" : "ODESSA", "loc" : [ -96.310154, 45.299766 ], "pop" : 457, "state" : "MN" } +{ "_id" : "56277", "city" : "OLIVIA", "loc" : [ -94.972747, 44.770627 ], "pop" : 3829, "state" : "MN" } +{ "_id" : "56278", "city" : "ORTONVILLE", "loc" : [ -96.45965, 45.329621 ], "pop" : 2928, "state" : "MN" } +{ "_id" : "56279", "city" : "PENNOCK", "loc" : [ -95.17533299999999, 45.131031 ], "pop" : 915, "state" : "MN" } +{ "_id" : "56280", "city" : "PORTER", "loc" : [ -96.15812, 44.656532 ], "pop" : 425, "state" : "MN" } +{ "_id" : "56281", "city" : "PRINSBURG", "loc" : [ -95.18653999999999, 44.937088 ], "pop" : 931, "state" : "MN" } +{ "_id" : "56282", "city" : "RAYMOND", "loc" : [ -95.220788, 45.018097 ], "pop" : 1095, "state" : "MN" } +{ "_id" : "56283", "city" : "DELHI", "loc" : [ -95.10713, 44.531753 ], "pop" : 6705, "state" : "MN" } +{ "_id" : "56284", "city" : "RENVILLE", "loc" : [ -95.19887900000001, 44.777609 ], "pop" : 2027, "state" : "MN" } +{ "_id" : "56285", "city" : "SACRED HEART", "loc" : [ -95.353801, 44.797536 ], "pop" : 1725, "state" : "MN" } +{ "_id" : "56286", "city" : "SAINT LEO", "loc" : [ -96.042546, 44.711091 ], "pop" : 483, "state" : "MN" } +{ "_id" : "56287", "city" : "SEAFORTH", "loc" : [ -95.297768, 44.490536 ], "pop" : 327, "state" : "MN" } +{ "_id" : "56288", "city" : "SPICER", "loc" : [ -94.91157200000001, 45.224112 ], "pop" : 3440, "state" : "MN" } +{ "_id" : "56289", "city" : "SUNBURG", "loc" : [ -95.204915, 45.358316 ], "pop" : 408, "state" : "MN" } +{ "_id" : "56291", "city" : "TAUNTON", "loc" : [ -96.052594, 44.595076 ], "pop" : 349, "state" : "MN" } +{ "_id" : "56292", "city" : "VESTA", "loc" : [ -95.411801, 44.505052 ], "pop" : 525, "state" : "MN" } +{ "_id" : "56293", "city" : "WABASSO", "loc" : [ -95.2632, 44.405865 ], "pop" : 991, "state" : "MN" } +{ "_id" : "56294", "city" : "WANDA", "loc" : [ -95.178, 44.32295 ], "pop" : 401, "state" : "MN" } +{ "_id" : "56295", "city" : "WATSON", "loc" : [ -95.794203, 45.019443 ], "pop" : 436, "state" : "MN" } +{ "_id" : "56296", "city" : "WHEATON", "loc" : [ -96.486598, 45.811104 ], "pop" : 2338, "state" : "MN" } +{ "_id" : "56297", "city" : "WOOD LAKE", "loc" : [ -95.540908, 44.637915 ], "pop" : 922, "state" : "MN" } +{ "_id" : "56301", "city" : "SAINT CLOUD", "loc" : [ -94.18185699999999, 45.540972 ], "pop" : 36182, "state" : "MN" } +{ "_id" : "56303", "city" : "SAINT CLOUD", "loc" : [ -94.20363399999999, 45.571298 ], "pop" : 14039, "state" : "MN" } +{ "_id" : "56304", "city" : "SAINT CLOUD", "loc" : [ -94.12844699999999, 45.552113 ], "pop" : 13570, "state" : "MN" } +{ "_id" : "56307", "city" : "ALBANY", "loc" : [ -94.574022, 45.615114 ], "pop" : 3064, "state" : "MN" } +{ "_id" : "56308", "city" : "ALEXANDRIA", "loc" : [ -95.38199400000001, 45.881747 ], "pop" : 17548, "state" : "MN" } +{ "_id" : "56309", "city" : "ASHBY", "loc" : [ -95.821417, 46.078066 ], "pop" : 869, "state" : "MN" } +{ "_id" : "56310", "city" : "AVON", "loc" : [ -94.436029, 45.612168 ], "pop" : 4355, "state" : "MN" } +{ "_id" : "56311", "city" : "BARRETT", "loc" : [ -95.87539099999999, 45.899555 ], "pop" : 799, "state" : "MN" } +{ "_id" : "56312", "city" : "BELGRADE", "loc" : [ -94.969877, 45.486522 ], "pop" : 1661, "state" : "MN" } +{ "_id" : "56313", "city" : "BOCK", "loc" : [ -93.553658, 45.784427 ], "pop" : 115, "state" : "MN" } +{ "_id" : "56314", "city" : "BOWLUS", "loc" : [ -94.41753300000001, 45.81212 ], "pop" : 1183, "state" : "MN" } +{ "_id" : "56315", "city" : "BRANDON", "loc" : [ -95.57876899999999, 46.0039 ], "pop" : 1453, "state" : "MN" } +{ "_id" : "56316", "city" : "BROOTEN", "loc" : [ -95.09004899999999, 45.493171 ], "pop" : 1287, "state" : "MN" } +{ "_id" : "56318", "city" : "BURTRUM", "loc" : [ -94.696214, 45.88803 ], "pop" : 854, "state" : "MN" } +{ "_id" : "56319", "city" : "CARLOS", "loc" : [ -95.310468, 45.972572 ], "pop" : 2136, "state" : "MN" } +{ "_id" : "56320", "city" : "COLD SPRING", "loc" : [ -94.43782299999999, 45.449976 ], "pop" : 5162, "state" : "MN" } +{ "_id" : "56323", "city" : "CYRUS", "loc" : [ -95.706965, 45.569483 ], "pop" : 988, "state" : "MN" } +{ "_id" : "56324", "city" : "DALTON", "loc" : [ -95.85001699999999, 46.154414 ], "pop" : 1305, "state" : "MN" } +{ "_id" : "56326", "city" : "EVANSVILLE", "loc" : [ -95.69506699999999, 46.01525 ], "pop" : 1149, "state" : "MN" } +{ "_id" : "56327", "city" : "FARWELL", "loc" : [ -95.665583, 45.724424 ], "pop" : 394, "state" : "MN" } +{ "_id" : "56328", "city" : "FLENSBURG", "loc" : [ -94.530767, 45.950899 ], "pop" : 213, "state" : "MN" } +{ "_id" : "56329", "city" : "FOLEY", "loc" : [ -93.868459, 45.708687 ], "pop" : 4078, "state" : "MN" } +{ "_id" : "56330", "city" : "FORESTON", "loc" : [ -93.69575500000001, 45.702842 ], "pop" : 1353, "state" : "MN" } +{ "_id" : "56331", "city" : "FREEPORT", "loc" : [ -94.678529, 45.673146 ], "pop" : 3865, "state" : "MN" } +{ "_id" : "56332", "city" : "GARFIELD", "loc" : [ -95.45004400000001, 45.995309 ], "pop" : 1430, "state" : "MN" } +{ "_id" : "56333", "city" : "GILMAN", "loc" : [ -93.946876, 45.774178 ], "pop" : 945, "state" : "MN" } +{ "_id" : "56334", "city" : "GLENWOOD", "loc" : [ -95.38681, 45.642911 ], "pop" : 5272, "state" : "MN" } +{ "_id" : "56336", "city" : "GREY EAGLE", "loc" : [ -94.832075, 45.81069 ], "pop" : 2188, "state" : "MN" } +{ "_id" : "56338", "city" : "HILLMAN", "loc" : [ -93.881224, 46.06776 ], "pop" : 724, "state" : "MN" } +{ "_id" : "56339", "city" : "HOFFMAN", "loc" : [ -95.79548200000001, 45.823292 ], "pop" : 852, "state" : "MN" } +{ "_id" : "56340", "city" : "HOLDINGFORD", "loc" : [ -94.458091, 45.724924 ], "pop" : 1721, "state" : "MN" } +{ "_id" : "56341", "city" : "HOLMES CITY", "loc" : [ -95.56464, 45.810706 ], "pop" : 614, "state" : "MN" } +{ "_id" : "56342", "city" : "ISLE", "loc" : [ -93.474062, 46.169605 ], "pop" : 1109, "state" : "MN" } +{ "_id" : "56343", "city" : "KENSINGTON", "loc" : [ -95.694452, 45.81761 ], "pop" : 770, "state" : "MN" } +{ "_id" : "56345", "city" : "LITTLE FALLS", "loc" : [ -94.360428, 45.98108 ], "pop" : 13558, "state" : "MN" } +{ "_id" : "56347", "city" : "LITTLE SAUK", "loc" : [ -94.89838899999999, 45.962417 ], "pop" : 6436, "state" : "MN" } +{ "_id" : "56349", "city" : "LOWRY", "loc" : [ -95.53221000000001, 45.710469 ], "pop" : 429, "state" : "MN" } +{ "_id" : "56350", "city" : "MC GRATH", "loc" : [ -93.241619, 46.244116 ], "pop" : 933, "state" : "MN" } +{ "_id" : "56352", "city" : "MELROSE", "loc" : [ -94.819768, 45.658183 ], "pop" : 4739, "state" : "MN" } +{ "_id" : "56353", "city" : "MILACA", "loc" : [ -93.64526600000001, 45.779481 ], "pop" : 4927, "state" : "MN" } +{ "_id" : "56354", "city" : "MILTONA", "loc" : [ -95.325767, 46.054519 ], "pop" : 866, "state" : "MN" } +{ "_id" : "56355", "city" : "NELSON", "loc" : [ -95.226032, 45.8516 ], "pop" : 858, "state" : "MN" } +{ "_id" : "56357", "city" : "OAK PARK", "loc" : [ -93.92141700000001, 45.671403 ], "pop" : 2636, "state" : "MN" } +{ "_id" : "56358", "city" : "OGILVIE", "loc" : [ -93.43592099999999, 45.847632 ], "pop" : 1143, "state" : "MN" } +{ "_id" : "56359", "city" : "ONAMIA", "loc" : [ -93.68668, 46.09022 ], "pop" : 3111, "state" : "MN" } +{ "_id" : "56360", "city" : "OSAKIS", "loc" : [ -95.13317000000001, 45.876836 ], "pop" : 2099, "state" : "MN" } +{ "_id" : "56361", "city" : "PARKERS PRAIRIE", "loc" : [ -95.360764, 46.176925 ], "pop" : 3067, "state" : "MN" } +{ "_id" : "56362", "city" : "PAYNESVILLE", "loc" : [ -94.715709, 45.398798 ], "pop" : 4967, "state" : "MN" } +{ "_id" : "56363", "city" : "PEASE", "loc" : [ -93.649247, 45.697872 ], "pop" : 178, "state" : "MN" } +{ "_id" : "56364", "city" : "PIERZ", "loc" : [ -94.085306, 46.008059 ], "pop" : 4300, "state" : "MN" } +{ "_id" : "56367", "city" : "RICE", "loc" : [ -94.165752, 45.736383 ], "pop" : 4560, "state" : "MN" } +{ "_id" : "56368", "city" : "RICHMOND", "loc" : [ -94.546072, 45.423817 ], "pop" : 3718, "state" : "MN" } +{ "_id" : "56373", "city" : "ROYALTON", "loc" : [ -94.221063, 45.858928 ], "pop" : 2571, "state" : "MN" } +{ "_id" : "56374", "city" : "SAINT JOSEPH", "loc" : [ -94.336688, 45.565124 ], "pop" : 9480, "state" : "MN" } +{ "_id" : "56375", "city" : "SAINT STEPHEN", "loc" : [ -94.281662, 45.711815 ], "pop" : 2868, "state" : "MN" } +{ "_id" : "56377", "city" : "SARTELL", "loc" : [ -94.21356900000001, 45.631827 ], "pop" : 4966, "state" : "MN" } +{ "_id" : "56378", "city" : "SAUK CENTRE", "loc" : [ -94.968166, 45.728079 ], "pop" : 6025, "state" : "MN" } +{ "_id" : "56379", "city" : "SAUK RAPIDS", "loc" : [ -94.159088, 45.604032 ], "pop" : 12505, "state" : "MN" } +{ "_id" : "56380", "city" : "SEDAN", "loc" : [ -95.263989, 45.51069 ], "pop" : 968, "state" : "MN" } +{ "_id" : "56381", "city" : "STARBUCK", "loc" : [ -95.542125, 45.592587 ], "pop" : 1964, "state" : "MN" } +{ "_id" : "56382", "city" : "SWANVILLE", "loc" : [ -94.62892100000001, 45.943148 ], "pop" : 1917, "state" : "MN" } +{ "_id" : "56384", "city" : "UPSALA", "loc" : [ -94.575531, 45.809723 ], "pop" : 1001, "state" : "MN" } +{ "_id" : "56385", "city" : "VILLARD", "loc" : [ -95.241439, 45.711823 ], "pop" : 730, "state" : "MN" } +{ "_id" : "56386", "city" : "WAHKON", "loc" : [ -93.497174, 46.11214 ], "pop" : 656, "state" : "MN" } +{ "_id" : "56387", "city" : "WAITE PARK", "loc" : [ -94.224481, 45.54972 ], "pop" : 5227, "state" : "MN" } +{ "_id" : "56389", "city" : "WEST UNION", "loc" : [ -95.08328, 45.798451 ], "pop" : 54, "state" : "MN" } +{ "_id" : "56401", "city" : "EAST GULL LAKE", "loc" : [ -94.20187300000001, 46.357219 ], "pop" : 23504, "state" : "MN" } +{ "_id" : "56431", "city" : "AITKIN", "loc" : [ -93.645413, 46.479929 ], "pop" : 6388, "state" : "MN" } +{ "_id" : "56433", "city" : "AKELEY", "loc" : [ -94.72342999999999, 47.000987 ], "pop" : 1097, "state" : "MN" } +{ "_id" : "56434", "city" : "ALDRICH", "loc" : [ -94.992017, 46.402538 ], "pop" : 1105, "state" : "MN" } +{ "_id" : "56435", "city" : "BACKUS", "loc" : [ -94.39591799999999, 46.869905 ], "pop" : 2594, "state" : "MN" } +{ "_id" : "56437", "city" : "BERTHA", "loc" : [ -95.03573299999999, 46.251457 ], "pop" : 1365, "state" : "MN" } +{ "_id" : "56438", "city" : "BROWERVILLE", "loc" : [ -94.834581, 46.090525 ], "pop" : 2179, "state" : "MN" } +{ "_id" : "56440", "city" : "CLARISSA", "loc" : [ -94.95719, 46.137305 ], "pop" : 1222, "state" : "MN" } +{ "_id" : "56441", "city" : "CROSBY", "loc" : [ -93.987448, 46.509084 ], "pop" : 5601, "state" : "MN" } +{ "_id" : "56442", "city" : "CROSSLAKE", "loc" : [ -94.114256, 46.678644 ], "pop" : 1132, "state" : "MN" } +{ "_id" : "56443", "city" : "CUSHING", "loc" : [ -94.618452, 46.202194 ], "pop" : 2122, "state" : "MN" } +{ "_id" : "56444", "city" : "DEERWOOD", "loc" : [ -93.884863, 46.444571 ], "pop" : 2225, "state" : "MN" } +{ "_id" : "56446", "city" : "EAGLE BEND", "loc" : [ -95.09606100000001, 46.117017 ], "pop" : 1714, "state" : "MN" } +{ "_id" : "56447", "city" : "EMILY", "loc" : [ -93.948385, 46.747791 ], "pop" : 699, "state" : "MN" } +{ "_id" : "56448", "city" : "FIFTY LAKES", "loc" : [ -94.065555, 46.746997 ], "pop" : 289, "state" : "MN" } +{ "_id" : "56449", "city" : "FORT RIPLEY", "loc" : [ -94.252696, 46.20988 ], "pop" : 1377, "state" : "MN" } +{ "_id" : "56450", "city" : "GARRISON", "loc" : [ -93.93634299999999, 46.263725 ], "pop" : 1771, "state" : "MN" } +{ "_id" : "56452", "city" : "HACKENSACK", "loc" : [ -94.50332400000001, 46.988442 ], "pop" : 1382, "state" : "MN" } +{ "_id" : "56453", "city" : "HEWITT", "loc" : [ -95.050361, 46.32497 ], "pop" : 1213, "state" : "MN" } +{ "_id" : "56455", "city" : "IRONTON", "loc" : [ -94.043655, 46.464135 ], "pop" : 145, "state" : "MN" } +{ "_id" : "56456", "city" : "JENKINS", "loc" : [ -94.33248500000001, 46.650983 ], "pop" : 262, "state" : "MN" } +{ "_id" : "56458", "city" : "LAKE GEORGE", "loc" : [ -95.00214800000001, 47.214992 ], "pop" : 485, "state" : "MN" } +{ "_id" : "56460", "city" : "LAKE ITASCA", "loc" : [ -95.252149, 47.275725 ], "pop" : 208, "state" : "MN" } +{ "_id" : "56461", "city" : "LAPORTE", "loc" : [ -94.77716100000001, 47.236752 ], "pop" : 1624, "state" : "MN" } +{ "_id" : "56463", "city" : "MANHATTAN BEACH", "loc" : [ -94.140068, 46.733563 ], "pop" : 71, "state" : "MN" } +{ "_id" : "56464", "city" : "MENAHGA", "loc" : [ -95.07142899999999, 46.757233 ], "pop" : 1940, "state" : "MN" } +{ "_id" : "56465", "city" : "MERRIFIELD", "loc" : [ -94.204268, 46.494309 ], "pop" : 1552, "state" : "MN" } +{ "_id" : "56466", "city" : "LEADER", "loc" : [ -94.628086, 46.321568 ], "pop" : 943, "state" : "MN" } +{ "_id" : "56467", "city" : "NEVIS", "loc" : [ -94.84600500000001, 46.931892 ], "pop" : 1252, "state" : "MN" } +{ "_id" : "56468", "city" : "LAKE SHORE", "loc" : [ -94.29656199999999, 46.484828 ], "pop" : 2184, "state" : "MN" } +{ "_id" : "56469", "city" : "PALISADE", "loc" : [ -93.562741, 46.689492 ], "pop" : 1168, "state" : "MN" } +{ "_id" : "56470", "city" : "PARK RAPIDS", "loc" : [ -95.03829899999999, 46.937682 ], "pop" : 8074, "state" : "MN" } +{ "_id" : "56472", "city" : "PEQUOT LAKES", "loc" : [ -94.26842600000001, 46.62569 ], "pop" : 3437, "state" : "MN" } +{ "_id" : "56473", "city" : "PILLAGER", "loc" : [ -94.392287, 46.398395 ], "pop" : 3481, "state" : "MN" } +{ "_id" : "56474", "city" : "PINE RIVER", "loc" : [ -94.44769100000001, 46.693796 ], "pop" : 4095, "state" : "MN" } +{ "_id" : "56475", "city" : "RANDALL", "loc" : [ -94.50054299999999, 46.073361 ], "pop" : 1621, "state" : "MN" } +{ "_id" : "56477", "city" : "SEBEKA", "loc" : [ -95.068055, 46.630615 ], "pop" : 3089, "state" : "MN" } +{ "_id" : "56479", "city" : "STAPLES", "loc" : [ -94.763299, 46.353552 ], "pop" : 5352, "state" : "MN" } +{ "_id" : "56481", "city" : "VERNDALE", "loc" : [ -94.853268, 46.426995 ], "pop" : 1899, "state" : "MN" } +{ "_id" : "56482", "city" : "WADENA", "loc" : [ -95.128283, 46.440121 ], "pop" : 5818, "state" : "MN" } +{ "_id" : "56484", "city" : "WALKER", "loc" : [ -94.584675, 47.08775 ], "pop" : 2431, "state" : "MN" } +{ "_id" : "56485", "city" : "WHIPHOLT", "loc" : [ -94.35097399999999, 47.040953 ], "pop" : 138, "state" : "MN" } +{ "_id" : "56501", "city" : "DETROIT LAKES", "loc" : [ -95.800606, 46.834877 ], "pop" : 15501, "state" : "MN" } +{ "_id" : "56510", "city" : "LOCKHART", "loc" : [ -96.503569, 47.315597 ], "pop" : 2500, "state" : "MN" } +{ "_id" : "56511", "city" : "AUDUBON", "loc" : [ -95.988136, 46.871887 ], "pop" : 1083, "state" : "MN" } +{ "_id" : "56513", "city" : "BAKER", "loc" : [ -96.604955, 46.685764 ], "pop" : 267, "state" : "MN" } +{ "_id" : "56514", "city" : "DOWNER", "loc" : [ -96.37269000000001, 46.677296 ], "pop" : 3357, "state" : "MN" } +{ "_id" : "56515", "city" : "BATTLE LAKE", "loc" : [ -95.714395, 46.314175 ], "pop" : 2143, "state" : "MN" } +{ "_id" : "56516", "city" : "BEJOU", "loc" : [ -95.94542300000001, 47.44909 ], "pop" : 358, "state" : "MN" } +{ "_id" : "56517", "city" : "BELTRAMI", "loc" : [ -96.454864, 47.572118 ], "pop" : 517, "state" : "MN" } +{ "_id" : "56518", "city" : "BLUFFTON", "loc" : [ -95.223592, 46.491795 ], "pop" : 623, "state" : "MN" } +{ "_id" : "56519", "city" : "BORUP", "loc" : [ -96.552969, 47.189641 ], "pop" : 329, "state" : "MN" } +{ "_id" : "56520", "city" : "BRECKENRIDGE", "loc" : [ -96.56222, 46.27966 ], "pop" : 4776, "state" : "MN" } +{ "_id" : "56521", "city" : "CALLAWAY", "loc" : [ -95.94396399999999, 47.007642 ], "pop" : 761, "state" : "MN" } +{ "_id" : "56522", "city" : "DORAN", "loc" : [ -96.437169, 46.129645 ], "pop" : 718, "state" : "MN" } +{ "_id" : "56523", "city" : "ELDRED", "loc" : [ -96.80264699999999, 47.653011 ], "pop" : 731, "state" : "MN" } +{ "_id" : "56524", "city" : "CLITHERALL", "loc" : [ -95.58582199999999, 46.31693 ], "pop" : 555, "state" : "MN" } +{ "_id" : "56525", "city" : "COMSTOCK", "loc" : [ -96.739752, 46.666703 ], "pop" : 260, "state" : "MN" } +{ "_id" : "56527", "city" : "DEER CREEK", "loc" : [ -95.26726499999999, 46.411193 ], "pop" : 1431, "state" : "MN" } +{ "_id" : "56528", "city" : "DENT", "loc" : [ -95.764357, 46.555417 ], "pop" : 2064, "state" : "MN" } +{ "_id" : "56529", "city" : "DILWORTH", "loc" : [ -96.70222, 46.878168 ], "pop" : 2546, "state" : "MN" } +{ "_id" : "56531", "city" : "ELBOW LAKE", "loc" : [ -95.96714900000001, 45.995267 ], "pop" : 2087, "state" : "MN" } +{ "_id" : "56533", "city" : "ELIZABETH", "loc" : [ -96.085093, 46.406218 ], "pop" : 738, "state" : "MN" } +{ "_id" : "56534", "city" : "ERHARD", "loc" : [ -96.059264, 46.494817 ], "pop" : 846, "state" : "MN" } +{ "_id" : "56535", "city" : "ERSKINE", "loc" : [ -96.012173, 47.661817 ], "pop" : 993, "state" : "MN" } +{ "_id" : "56536", "city" : "FELTON", "loc" : [ -96.505225, 47.070528 ], "pop" : 431, "state" : "MN" } +{ "_id" : "56537", "city" : "CARLISLE", "loc" : [ -96.06433800000001, 46.289723 ], "pop" : 18010, "state" : "MN" } +{ "_id" : "56540", "city" : "FERTILE", "loc" : [ -96.237127, 47.521367 ], "pop" : 1933, "state" : "MN" } +{ "_id" : "56542", "city" : "FOSSTON", "loc" : [ -95.743082, 47.581584 ], "pop" : 2469, "state" : "MN" } +{ "_id" : "56543", "city" : "FOXHOME", "loc" : [ -96.31757899999999, 46.258366 ], "pop" : 309, "state" : "MN" } +{ "_id" : "56544", "city" : "FRAZEE", "loc" : [ -95.521159, 46.756469 ], "pop" : 3166, "state" : "MN" } +{ "_id" : "56545", "city" : "GARY", "loc" : [ -96.215233, 47.367491 ], "pop" : 518, "state" : "MN" } +{ "_id" : "56546", "city" : "GEORGETOWN", "loc" : [ -96.726996, 47.099865 ], "pop" : 425, "state" : "MN" } +{ "_id" : "56547", "city" : "GLYNDON", "loc" : [ -96.55833800000001, 46.882023 ], "pop" : 2198, "state" : "MN" } +{ "_id" : "56548", "city" : "HALSTAD", "loc" : [ -96.79803800000001, 47.355114 ], "pop" : 898, "state" : "MN" } +{ "_id" : "56549", "city" : "ROLLAG", "loc" : [ -96.31115, 46.884185 ], "pop" : 3105, "state" : "MN" } +{ "_id" : "56550", "city" : "HENDRUM", "loc" : [ -96.79875, 47.26889 ], "pop" : 467, "state" : "MN" } +{ "_id" : "56551", "city" : "HENNING", "loc" : [ -95.38516199999999, 46.325606 ], "pop" : 1770, "state" : "MN" } +{ "_id" : "56552", "city" : "HITTERDAL", "loc" : [ -96.28883999999999, 47.001354 ], "pop" : 613, "state" : "MN" } +{ "_id" : "56553", "city" : "KENT", "loc" : [ -96.685181, 46.437811 ], "pop" : 168, "state" : "MN" } +{ "_id" : "56554", "city" : "LAKE PARK", "loc" : [ -96.067047, 46.817623 ], "pop" : 3001, "state" : "MN" } +{ "_id" : "56556", "city" : "MCINTOSH", "loc" : [ -95.886252, 47.652165 ], "pop" : 1088, "state" : "MN" } +{ "_id" : "56557", "city" : "MAHNOMEN", "loc" : [ -95.885609, 47.336155 ], "pop" : 2940, "state" : "MN" } +{ "_id" : "56560", "city" : "MOORHEAD", "loc" : [ -96.75719700000001, 46.867748 ], "pop" : 35056, "state" : "MN" } +{ "_id" : "56565", "city" : "NASHUA", "loc" : [ -96.31600899999999, 46.053731 ], "pop" : 153, "state" : "MN" } +{ "_id" : "56566", "city" : "NAYTAHWAUSH", "loc" : [ -95.62832400000001, 47.26007 ], "pop" : 785, "state" : "MN" } +{ "_id" : "56567", "city" : "NEW YORK MILLS", "loc" : [ -95.40471700000001, 46.555867 ], "pop" : 3681, "state" : "MN" } +{ "_id" : "56568", "city" : "NIELSVILLE", "loc" : [ -96.75743300000001, 47.537336 ], "pop" : 299, "state" : "MN" } +{ "_id" : "56569", "city" : "OGEMA", "loc" : [ -95.91512400000001, 47.102865 ], "pop" : 1129, "state" : "MN" } +{ "_id" : "56570", "city" : "OSAGE", "loc" : [ -95.23528399999999, 46.932896 ], "pop" : 626, "state" : "MN" } +{ "_id" : "56571", "city" : "OTTERTAIL", "loc" : [ -95.543571, 46.417722 ], "pop" : 1080, "state" : "MN" } +{ "_id" : "56572", "city" : "PELICAN RAPIDS", "loc" : [ -96.066227, 46.599444 ], "pop" : 4481, "state" : "MN" } +{ "_id" : "56573", "city" : "PERHAM", "loc" : [ -95.581763, 46.603106 ], "pop" : 3238, "state" : "MN" } +{ "_id" : "56574", "city" : "PERLEY", "loc" : [ -96.777722, 47.18308 ], "pop" : 303, "state" : "MN" } +{ "_id" : "56575", "city" : "PONSFORD", "loc" : [ -95.319717, 47.013348 ], "pop" : 1072, "state" : "MN" } +{ "_id" : "56576", "city" : "RICHVILLE", "loc" : [ -95.59289099999999, 46.500807 ], "pop" : 898, "state" : "MN" } +{ "_id" : "56577", "city" : "RICHWOOD", "loc" : [ -95.850094, 46.93609 ], "pop" : 594, "state" : "MN" } +{ "_id" : "56578", "city" : "ROCHERT", "loc" : [ -95.600443, 46.855904 ], "pop" : 688, "state" : "MN" } +{ "_id" : "56579", "city" : "ROTHSAY", "loc" : [ -96.288726, 46.509412 ], "pop" : 916, "state" : "MN" } +{ "_id" : "56580", "city" : "SABIN", "loc" : [ -96.59851999999999, 46.770257 ], "pop" : 1225, "state" : "MN" } +{ "_id" : "56581", "city" : "SHELLY", "loc" : [ -96.78380199999999, 47.455375 ], "pop" : 445, "state" : "MN" } +{ "_id" : "56583", "city" : "TENNEY", "loc" : [ -96.387049, 45.990196 ], "pop" : 270, "state" : "MN" } +{ "_id" : "56584", "city" : "TWIN VALLEY", "loc" : [ -96.246382, 47.250905 ], "pop" : 2108, "state" : "MN" } +{ "_id" : "56585", "city" : "ULEN", "loc" : [ -96.28239000000001, 47.090263 ], "pop" : 939, "state" : "MN" } +{ "_id" : "56586", "city" : "UNDERWOOD", "loc" : [ -95.84155, 46.32652 ], "pop" : 1932, "state" : "MN" } +{ "_id" : "56587", "city" : "VERGAS", "loc" : [ -95.79481199999999, 46.670645 ], "pop" : 1338, "state" : "MN" } +{ "_id" : "56588", "city" : "VINING", "loc" : [ -95.588263, 46.256135 ], "pop" : 463, "state" : "MN" } +{ "_id" : "56589", "city" : "WAUBUN", "loc" : [ -95.887125, 47.192009 ], "pop" : 961, "state" : "MN" } +{ "_id" : "56590", "city" : "WENDELL", "loc" : [ -96.114407, 46.056174 ], "pop" : 408, "state" : "MN" } +{ "_id" : "56592", "city" : "WINGER", "loc" : [ -95.994085, 47.537516 ], "pop" : 406, "state" : "MN" } +{ "_id" : "56593", "city" : "WOLF LAKE", "loc" : [ -95.36070599999999, 46.833417 ], "pop" : 260, "state" : "MN" } +{ "_id" : "56594", "city" : "WOLVERTON", "loc" : [ -96.61487, 46.555017 ], "pop" : 834, "state" : "MN" } +{ "_id" : "56601", "city" : "BEMIDJI", "loc" : [ -94.848809, 47.488071 ], "pop" : 25278, "state" : "MN" } +{ "_id" : "56621", "city" : "BAGLEY", "loc" : [ -95.41334000000001, 47.487024 ], "pop" : 4063, "state" : "MN" } +{ "_id" : "56623", "city" : "BAUDETTE", "loc" : [ -94.599479, 48.692724 ], "pop" : 2065, "state" : "MN" } +{ "_id" : "56626", "city" : "BENA", "loc" : [ -94.251921, 47.347732 ], "pop" : 461, "state" : "MN" } +{ "_id" : "56627", "city" : "BIG FALLS", "loc" : [ -93.729629, 48.156028 ], "pop" : 652, "state" : "MN" } +{ "_id" : "56628", "city" : "BIGFORK", "loc" : [ -93.670699, 47.750227 ], "pop" : 819, "state" : "MN" } +{ "_id" : "56629", "city" : "BIRCHDALE", "loc" : [ -94.167652, 48.624696 ], "pop" : 374, "state" : "MN" } +{ "_id" : "56630", "city" : "BLACKDUCK", "loc" : [ -94.496072, 47.738136 ], "pop" : 1428, "state" : "MN" } +{ "_id" : "56632", "city" : "BOY RIVER", "loc" : [ -94.102587, 47.181841 ], "pop" : 132, "state" : "MN" } +{ "_id" : "56633", "city" : "CASS LAKE", "loc" : [ -94.611896, 47.35155 ], "pop" : 2866, "state" : "MN" } +{ "_id" : "56634", "city" : "CLEARBROOK", "loc" : [ -95.375185, 47.714581 ], "pop" : 1208, "state" : "MN" } +{ "_id" : "56636", "city" : "DEER RIVER", "loc" : [ -93.84979, 47.382867 ], "pop" : 3254, "state" : "MN" } +{ "_id" : "56637", "city" : "TALMOON", "loc" : [ -93.774913, 47.588764 ], "pop" : 155, "state" : "MN" } +{ "_id" : "56639", "city" : "EFFIE", "loc" : [ -93.579905, 47.847187 ], "pop" : 346, "state" : "MN" } +{ "_id" : "56641", "city" : "FEDERAL DAM", "loc" : [ -94.257519, 47.206914 ], "pop" : 347, "state" : "MN" } +{ "_id" : "56644", "city" : "GONVICK", "loc" : [ -95.499014, 47.749009 ], "pop" : 931, "state" : "MN" } +{ "_id" : "56646", "city" : "GULLY", "loc" : [ -95.641034, 47.769745 ], "pop" : 511, "state" : "MN" } +{ "_id" : "56647", "city" : "HINES", "loc" : [ -94.647666, 47.732429 ], "pop" : 1083, "state" : "MN" } +{ "_id" : "56649", "city" : "INTERNATIONAL FA", "loc" : [ -93.40609000000001, 48.583398 ], "pop" : 11124, "state" : "MN" } +{ "_id" : "56650", "city" : "KELLIHER", "loc" : [ -94.538166, 47.927173 ], "pop" : 1092, "state" : "MN" } +{ "_id" : "56651", "city" : "LENGBY", "loc" : [ -95.627475, 47.536998 ], "pop" : 514, "state" : "MN" } +{ "_id" : "56652", "city" : "LEONARD", "loc" : [ -95.37077499999999, 47.628905 ], "pop" : 1022, "state" : "MN" } +{ "_id" : "56653", "city" : "LITTLEFORK", "loc" : [ -93.53993199999999, 48.385233 ], "pop" : 1769, "state" : "MN" } +{ "_id" : "56654", "city" : "LOMAN", "loc" : [ -93.840673, 48.516406 ], "pop" : 198, "state" : "MN" } +{ "_id" : "56655", "city" : "LONGVILLE", "loc" : [ -94.198182, 47.024842 ], "pop" : 757, "state" : "MN" } +{ "_id" : "56657", "city" : "MARCELL", "loc" : [ -93.678425, 47.634527 ], "pop" : 449, "state" : "MN" } +{ "_id" : "56659", "city" : "MAX", "loc" : [ -93.972031, 47.628919 ], "pop" : 140, "state" : "MN" } +{ "_id" : "56660", "city" : "MIZPAH", "loc" : [ -94.146748, 47.949525 ], "pop" : 321, "state" : "MN" } +{ "_id" : "56661", "city" : "NORTHOME", "loc" : [ -94.204274, 47.844039 ], "pop" : 908, "state" : "MN" } +{ "_id" : "56662", "city" : "OUTING", "loc" : [ -93.94425200000001, 46.837528 ], "pop" : 348, "state" : "MN" } +{ "_id" : "56663", "city" : "PENNINGTON", "loc" : [ -94.483361, 47.465121 ], "pop" : 176, "state" : "MN" } +{ "_id" : "56665", "city" : "PITT", "loc" : [ -94.728252, 48.782986 ], "pop" : 678, "state" : "MN" } +{ "_id" : "56666", "city" : "PONEMAH", "loc" : [ -94.91704799999999, 48.037168 ], "pop" : 790, "state" : "MN" } +{ "_id" : "56667", "city" : "PUPOSKY", "loc" : [ -94.980294, 47.7436 ], "pop" : 967, "state" : "MN" } +{ "_id" : "56668", "city" : "RANIER", "loc" : [ -93.31245699999999, 48.611847 ], "pop" : 1145, "state" : "MN" } +{ "_id" : "56669", "city" : "RAY", "loc" : [ -93.08954900000001, 48.421834 ], "pop" : 365, "state" : "MN" } +{ "_id" : "56670", "city" : "REDBY", "loc" : [ -94.940409, 47.868888 ], "pop" : 1394, "state" : "MN" } +{ "_id" : "56671", "city" : "REDLAKE", "loc" : [ -95.06432, 47.865378 ], "pop" : 1358, "state" : "MN" } +{ "_id" : "56672", "city" : "REMER", "loc" : [ -93.919647, 47.087422 ], "pop" : 1466, "state" : "MN" } +{ "_id" : "56673", "city" : "ROOSEVELT", "loc" : [ -95.179389, 48.814807 ], "pop" : 907, "state" : "MN" } +{ "_id" : "56674", "city" : "SAUM", "loc" : [ -94.651203, 47.974492 ], "pop" : 150, "state" : "MN" } +{ "_id" : "56676", "city" : "SHEVLIN", "loc" : [ -95.24502099999999, 47.500364 ], "pop" : 879, "state" : "MN" } +{ "_id" : "56678", "city" : "SOLWAY", "loc" : [ -95.120475, 47.547972 ], "pop" : 971, "state" : "MN" } +{ "_id" : "56680", "city" : "SPRING LAKE", "loc" : [ -93.83821500000001, 47.588811 ], "pop" : 383, "state" : "MN" } +{ "_id" : "56681", "city" : "SQUAW LAKE", "loc" : [ -94.14749999999999, 47.636162 ], "pop" : 337, "state" : "MN" } +{ "_id" : "56682", "city" : "SWIFT", "loc" : [ -95.297499, 48.847573 ], "pop" : 789, "state" : "MN" } +{ "_id" : "56683", "city" : "TENSTRIKE", "loc" : [ -94.68243200000001, 47.661146 ], "pop" : 184, "state" : "MN" } +{ "_id" : "56684", "city" : "TRAIL", "loc" : [ -95.760668, 47.747769 ], "pop" : 353, "state" : "MN" } +{ "_id" : "56685", "city" : "WASKISH", "loc" : [ -94.50370700000001, 48.176971 ], "pop" : 115, "state" : "MN" } +{ "_id" : "56686", "city" : "WILLIAMS", "loc" : [ -94.955586, 48.802218 ], "pop" : 1257, "state" : "MN" } +{ "_id" : "56687", "city" : "WILTON", "loc" : [ -94.986238, 47.535254 ], "pop" : 976, "state" : "MN" } +{ "_id" : "56688", "city" : "WIRT", "loc" : [ -93.98107899999999, 47.716428 ], "pop" : 84, "state" : "MN" } +{ "_id" : "56701", "city" : "THIEF RIVER FALL", "loc" : [ -96.167019, 48.110391 ], "pop" : 11401, "state" : "MN" } +{ "_id" : "56710", "city" : "ALVARADO", "loc" : [ -96.991457, 48.201968 ], "pop" : 483, "state" : "MN" } +{ "_id" : "56711", "city" : "ANGLE INLET", "loc" : [ -95.090248, 49.324924 ], "pop" : 50, "state" : "MN" } +{ "_id" : "56712", "city" : "ANGUS", "loc" : [ -96.656978, 48.092675 ], "pop" : 336, "state" : "MN" } +{ "_id" : "56713", "city" : "ARGYLE", "loc" : [ -96.867096, 48.331418 ], "pop" : 989, "state" : "MN" } +{ "_id" : "56714", "city" : "BADGER", "loc" : [ -96.096523, 48.791294 ], "pop" : 1068, "state" : "MN" } +{ "_id" : "56715", "city" : "BROOKS", "loc" : [ -96.011663, 47.812942 ], "pop" : 350, "state" : "MN" } +{ "_id" : "56716", "city" : "CROOKSTON", "loc" : [ -96.59307800000001, 47.779694 ], "pop" : 9976, "state" : "MN" } +{ "_id" : "56720", "city" : "DONALDSON", "loc" : [ -96.857894, 48.579792 ], "pop" : 117, "state" : "MN" } +{ "_id" : "56721", "city" : "EAST GRAND FORKS", "loc" : [ -97.02126199999999, 47.931802 ], "pop" : 8830, "state" : "MN" } +{ "_id" : "56722", "city" : "EUCLID", "loc" : [ -96.921496, 48.033804 ], "pop" : 1483, "state" : "MN" } +{ "_id" : "56723", "city" : "FISHER", "loc" : [ -96.880312, 47.838145 ], "pop" : 1473, "state" : "MN" } +{ "_id" : "56724", "city" : "GATZKE", "loc" : [ -95.790305, 48.410416 ], "pop" : 131, "state" : "MN" } +{ "_id" : "56725", "city" : "GOODRIDGE", "loc" : [ -95.72834400000001, 48.068586 ], "pop" : 923, "state" : "MN" } +{ "_id" : "56726", "city" : "GREENBUSH", "loc" : [ -96.187091, 48.695667 ], "pop" : 1022, "state" : "MN" } +{ "_id" : "56727", "city" : "GRYGLA", "loc" : [ -95.639805, 48.307068 ], "pop" : 1315, "state" : "MN" } +{ "_id" : "56728", "city" : "HALLOCK", "loc" : [ -96.944486, 48.774855 ], "pop" : 1729, "state" : "MN" } +{ "_id" : "56729", "city" : "HALMA", "loc" : [ -96.59689899999999, 48.666895 ], "pop" : 146, "state" : "MN" } +{ "_id" : "56732", "city" : "KARLSTAD", "loc" : [ -96.55111599999999, 48.591592 ], "pop" : 1461, "state" : "MN" } +{ "_id" : "56733", "city" : "KENNEDY", "loc" : [ -96.96140699999999, 48.633686 ], "pop" : 673, "state" : "MN" } +{ "_id" : "56734", "city" : "LAKE BRONSON", "loc" : [ -96.643145, 48.77868 ], "pop" : 548, "state" : "MN" } +{ "_id" : "56735", "city" : "ORLEANS", "loc" : [ -96.813729, 48.881968 ], "pop" : 785, "state" : "MN" } +{ "_id" : "56736", "city" : "MENTOR", "loc" : [ -96.177823, 47.657597 ], "pop" : 993, "state" : "MN" } +{ "_id" : "56737", "city" : "MIDDLE RIVER", "loc" : [ -96.12325, 48.442593 ], "pop" : 948, "state" : "MN" } +{ "_id" : "56738", "city" : "NEWFOLDEN", "loc" : [ -96.25501800000001, 48.28945 ], "pop" : 1700, "state" : "MN" } +{ "_id" : "56740", "city" : "NOYES", "loc" : [ -97.14903200000001, 48.969223 ], "pop" : 67, "state" : "MN" } +{ "_id" : "56741", "city" : "OAK ISLAND", "loc" : [ -94.849209, 49.313466 ], "pop" : 21, "state" : "MN" } +{ "_id" : "56742", "city" : "OKLEE", "loc" : [ -95.861693, 47.82861 ], "pop" : 628, "state" : "MN" } +{ "_id" : "56744", "city" : "OSLO", "loc" : [ -97.116252, 48.20657 ], "pop" : 552, "state" : "MN" } +{ "_id" : "56748", "city" : "PLUMMER", "loc" : [ -95.964558, 47.911324 ], "pop" : 847, "state" : "MN" } +{ "_id" : "56750", "city" : "RED LAKE FALLS", "loc" : [ -96.268097, 47.882285 ], "pop" : 2700, "state" : "MN" } +{ "_id" : "56751", "city" : "PENCER", "loc" : [ -95.756709, 48.826809 ], "pop" : 5473, "state" : "MN" } +{ "_id" : "56754", "city" : "SAINT HILAIRE", "loc" : [ -96.224914, 48.010871 ], "pop" : 873, "state" : "MN" } +{ "_id" : "56755", "city" : "SAINT VINCENT", "loc" : [ -97.17030699999999, 48.945825 ], "pop" : 241, "state" : "MN" } +{ "_id" : "56756", "city" : "SALOL", "loc" : [ -95.535594, 48.852213 ], "pop" : 478, "state" : "MN" } +{ "_id" : "56757", "city" : "STEPHEN", "loc" : [ -96.867392, 48.452488 ], "pop" : 1340, "state" : "MN" } +{ "_id" : "56758", "city" : "STRANDQUIST", "loc" : [ -96.472266, 48.45256 ], "pop" : 969, "state" : "MN" } +{ "_id" : "56759", "city" : "STRATHCONA", "loc" : [ -96.109604, 48.626556 ], "pop" : 860, "state" : "MN" } +{ "_id" : "56760", "city" : "VIKING", "loc" : [ -96.474926, 48.234881 ], "pop" : 627, "state" : "MN" } +{ "_id" : "56761", "city" : "WANNASKA", "loc" : [ -95.7072, 48.64515 ], "pop" : 684, "state" : "MN" } +{ "_id" : "56762", "city" : "RADIUM", "loc" : [ -96.759702, 48.20784 ], "pop" : 2404, "state" : "MN" } +{ "_id" : "56763", "city" : "WARROAD", "loc" : [ -95.353843, 48.911144 ], "pop" : 3766, "state" : "MN" } +{ "_id" : "57001", "city" : "ALCESTER", "loc" : [ -96.63324299999999, 43.004726 ], "pop" : 2064, "state" : "SD" } +{ "_id" : "57002", "city" : "AURORA", "loc" : [ -96.704268, 44.283786 ], "pop" : 1252, "state" : "SD" } +{ "_id" : "57003", "city" : "BALTIC", "loc" : [ -96.756272, 43.730908 ], "pop" : 1839, "state" : "SD" } +{ "_id" : "57004", "city" : "BERESFORD", "loc" : [ -96.781256, 43.087409 ], "pop" : 2639, "state" : "SD" } +{ "_id" : "57005", "city" : "CORSON", "loc" : [ -96.57820100000001, 43.596413 ], "pop" : 4155, "state" : "SD" } +{ "_id" : "57006", "city" : "BROOKINGS", "loc" : [ -96.791408, 44.305619 ], "pop" : 18164, "state" : "SD" } +{ "_id" : "57010", "city" : "BURBANK", "loc" : [ -96.846569, 42.763798 ], "pop" : 293, "state" : "SD" } +{ "_id" : "57012", "city" : "CANISTOTA", "loc" : [ -97.288901, 43.585639 ], "pop" : 1255, "state" : "SD" } +{ "_id" : "57013", "city" : "CANTON", "loc" : [ -96.593796, 43.303819 ], "pop" : 3210, "state" : "SD" } +{ "_id" : "57014", "city" : "CENTERVILLE", "loc" : [ -96.96363700000001, 43.117635 ], "pop" : 1048, "state" : "SD" } +{ "_id" : "57015", "city" : "CHANCELLOR", "loc" : [ -96.98269500000001, 43.407962 ], "pop" : 887, "state" : "SD" } +{ "_id" : "57016", "city" : "CHESTER", "loc" : [ -96.975883, 43.898077 ], "pop" : 799, "state" : "SD" } +{ "_id" : "57017", "city" : "COLMAN", "loc" : [ -96.818882, 43.955761 ], "pop" : 1013, "state" : "SD" } +{ "_id" : "57018", "city" : "COLTON", "loc" : [ -96.957202, 43.795102 ], "pop" : 1242, "state" : "SD" } +{ "_id" : "57020", "city" : "CROOKS", "loc" : [ -96.818259, 43.64509 ], "pop" : 1262, "state" : "SD" } +{ "_id" : "57021", "city" : "DAVIS", "loc" : [ -96.979206, 43.286365 ], "pop" : 357, "state" : "SD" } +{ "_id" : "57022", "city" : "DELL RAPIDS", "loc" : [ -96.72231499999999, 43.822759 ], "pop" : 3128, "state" : "SD" } +{ "_id" : "57024", "city" : "EGAN", "loc" : [ -96.649252, 43.986592 ], "pop" : 658, "state" : "SD" } +{ "_id" : "57025", "city" : "ELK POINT", "loc" : [ -96.686954, 42.738219 ], "pop" : 2698, "state" : "SD" } +{ "_id" : "57026", "city" : "ELKTON", "loc" : [ -96.50109500000001, 44.234984 ], "pop" : 853, "state" : "SD" } +{ "_id" : "57027", "city" : "FAIRVIEW", "loc" : [ -96.57426100000001, 43.208965 ], "pop" : 472, "state" : "SD" } +{ "_id" : "57028", "city" : "FLANDREAU", "loc" : [ -96.622184, 44.06578 ], "pop" : 3851, "state" : "SD" } +{ "_id" : "57029", "city" : "FREEMAN", "loc" : [ -97.46007299999999, 43.360501 ], "pop" : 2190, "state" : "SD" } +{ "_id" : "57030", "city" : "GARRETSON", "loc" : [ -96.519626, 43.71617 ], "pop" : 1546, "state" : "SD" } +{ "_id" : "57031", "city" : "GAYVILLE", "loc" : [ -97.18295000000001, 42.883516 ], "pop" : 572, "state" : "SD" } +{ "_id" : "57032", "city" : "HARRISBURG", "loc" : [ -96.68638900000001, 43.446021 ], "pop" : 3387, "state" : "SD" } +{ "_id" : "57033", "city" : "HARTFORD", "loc" : [ -96.950052, 43.615472 ], "pop" : 3110, "state" : "SD" } +{ "_id" : "57034", "city" : "HUDSON", "loc" : [ -96.53063, 43.128357 ], "pop" : 774, "state" : "SD" } +{ "_id" : "57035", "city" : "HUMBOLDT", "loc" : [ -97.06971, 43.612026 ], "pop" : 1090, "state" : "SD" } +{ "_id" : "57036", "city" : "HURLEY", "loc" : [ -97.190364, 43.289256 ], "pop" : 1124, "state" : "SD" } +{ "_id" : "57037", "city" : "IRENE", "loc" : [ -97.255797, 43.102683 ], "pop" : 1320, "state" : "SD" } +{ "_id" : "57038", "city" : "JEFFERSON", "loc" : [ -96.57839199999999, 42.601341 ], "pop" : 1262, "state" : "SD" } +{ "_id" : "57039", "city" : "LENNOX", "loc" : [ -96.88206099999999, 43.345066 ], "pop" : 2852, "state" : "SD" } +{ "_id" : "57040", "city" : "LESTERVILLE", "loc" : [ -97.548282, 43.054976 ], "pop" : 680, "state" : "SD" } +{ "_id" : "57042", "city" : "MADISON", "loc" : [ -97.11485999999999, 44.005434 ], "pop" : 7745, "state" : "SD" } +{ "_id" : "57043", "city" : "MARION", "loc" : [ -97.277066, 43.41878 ], "pop" : 1377, "state" : "SD" } +{ "_id" : "57044", "city" : "MECKLING", "loc" : [ -97.092249, 42.848994 ], "pop" : 228, "state" : "SD" } +{ "_id" : "57045", "city" : "MENNO", "loc" : [ -97.564986, 43.233968 ], "pop" : 1337, "state" : "SD" } +{ "_id" : "57046", "city" : "MISSION HILL", "loc" : [ -97.33487700000001, 42.983611 ], "pop" : 546, "state" : "SD" } +{ "_id" : "57047", "city" : "MONROE", "loc" : [ -97.21816699999999, 43.477883 ], "pop" : 239, "state" : "SD" } +{ "_id" : "57048", "city" : "MONTROSE", "loc" : [ -97.18849299999999, 43.706262 ], "pop" : 958, "state" : "SD" } +{ "_id" : "57049", "city" : "DAKOTA DUNES", "loc" : [ -96.50761, 42.532706 ], "pop" : 2491, "state" : "SD" } +{ "_id" : "57050", "city" : "NUNDA", "loc" : [ -96.994209, 44.152459 ], "pop" : 334, "state" : "SD" } +{ "_id" : "57051", "city" : "OLDHAM", "loc" : [ -97.269575, 44.245722 ], "pop" : 655, "state" : "SD" } +{ "_id" : "57052", "city" : "OLIVET", "loc" : [ -97.718355, 43.292811 ], "pop" : 555, "state" : "SD" } +{ "_id" : "57053", "city" : "PARKER", "loc" : [ -97.133298, 43.40204 ], "pop" : 1494, "state" : "SD" } +{ "_id" : "57054", "city" : "RAMONA", "loc" : [ -97.234889, 44.122887 ], "pop" : 641, "state" : "SD" } +{ "_id" : "57055", "city" : "RENNER", "loc" : [ -96.71192499999999, 43.636625 ], "pop" : 1444, "state" : "SD" } +{ "_id" : "57057", "city" : "RUTLAND", "loc" : [ -96.95185600000001, 44.068282 ], "pop" : 213, "state" : "SD" } +{ "_id" : "57058", "city" : "SALEM", "loc" : [ -97.379695, 43.735583 ], "pop" : 1963, "state" : "SD" } +{ "_id" : "57059", "city" : "SCOTLAND", "loc" : [ -97.729596, 43.121208 ], "pop" : 1611, "state" : "SD" } +{ "_id" : "57060", "city" : "SHERMAN", "loc" : [ -96.54439600000001, 43.798677 ], "pop" : 507, "state" : "SD" } +{ "_id" : "57061", "city" : "SINAI", "loc" : [ -97.054332, 44.239745 ], "pop" : 296, "state" : "SD" } +{ "_id" : "57062", "city" : "SPRINGFIELD", "loc" : [ -97.928825, 42.868694 ], "pop" : 2044, "state" : "SD" } +{ "_id" : "57063", "city" : "TABOR", "loc" : [ -97.69228200000001, 42.938262 ], "pop" : 853, "state" : "SD" } +{ "_id" : "57064", "city" : "TEA", "loc" : [ -96.817734, 43.471114 ], "pop" : 2885, "state" : "SD" } +{ "_id" : "57065", "city" : "TRENT", "loc" : [ -96.63257400000001, 43.894159 ], "pop" : 865, "state" : "SD" } +{ "_id" : "57066", "city" : "TYNDALL", "loc" : [ -97.863285, 42.990043 ], "pop" : 1451, "state" : "SD" } +{ "_id" : "57067", "city" : "UTICA", "loc" : [ -97.455095, 42.936629 ], "pop" : 1183, "state" : "SD" } +{ "_id" : "57068", "city" : "VALLEY SPRINGS", "loc" : [ -96.495637, 43.577306 ], "pop" : 1709, "state" : "SD" } +{ "_id" : "57069", "city" : "VERMILLION", "loc" : [ -96.92578399999999, 42.795109 ], "pop" : 11446, "state" : "SD" } +{ "_id" : "57070", "city" : "VIBORG", "loc" : [ -97.114048, 43.181497 ], "pop" : 1664, "state" : "SD" } +{ "_id" : "57071", "city" : "VOLGA", "loc" : [ -96.92514799999999, 44.322354 ], "pop" : 1562, "state" : "SD" } +{ "_id" : "57072", "city" : "VOLIN", "loc" : [ -97.22823099999999, 42.969617 ], "pop" : 782, "state" : "SD" } +{ "_id" : "57073", "city" : "WAKONDA", "loc" : [ -97.069374, 42.996001 ], "pop" : 938, "state" : "SD" } +{ "_id" : "57074", "city" : "WARD", "loc" : [ -96.481325, 44.155883 ], "pop" : 120, "state" : "SD" } +{ "_id" : "57075", "city" : "WENTWORTH", "loc" : [ -96.961456, 43.985242 ], "pop" : 394, "state" : "SD" } +{ "_id" : "57076", "city" : "WINFRED", "loc" : [ -97.30926599999999, 43.959511 ], "pop" : 424, "state" : "SD" } +{ "_id" : "57077", "city" : "WORTHING", "loc" : [ -96.75293499999999, 43.292531 ], "pop" : 882, "state" : "SD" } +{ "_id" : "57078", "city" : "YANKTON", "loc" : [ -97.398624, 42.882086 ], "pop" : 14765, "state" : "SD" } +{ "_id" : "57102", "city" : "SIOUX FALLS", "loc" : [ -96.726927, 43.546131 ], "pop" : 530, "state" : "SD" } +{ "_id" : "57103", "city" : "SIOUX FALLS", "loc" : [ -96.686415, 43.537386 ], "pop" : 32508, "state" : "SD" } +{ "_id" : "57104", "city" : "SIOUX FALLS", "loc" : [ -96.73753499999999, 43.551355 ], "pop" : 22081, "state" : "SD" } +{ "_id" : "57105", "city" : "SIOUX FALLS", "loc" : [ -96.73414099999999, 43.523972 ], "pop" : 26347, "state" : "SD" } +{ "_id" : "57106", "city" : "SIOUX FALLS", "loc" : [ -96.792376, 43.517912 ], "pop" : 16823, "state" : "SD" } +{ "_id" : "57107", "city" : "SIOUX FALLS", "loc" : [ -96.80281100000001, 43.556628 ], "pop" : 3331, "state" : "SD" } +{ "_id" : "57115", "city" : "BUFFALO RIDGE", "loc" : [ -96.834165, 43.516936 ], "pop" : 731, "state" : "SD" } +{ "_id" : "57116", "city" : "SIOUX FALLS", "loc" : [ -96.766199, 43.508535 ], "pop" : 426, "state" : "SD" } +{ "_id" : "57201", "city" : "WATERTOWN", "loc" : [ -97.123977, 44.904295 ], "pop" : 20148, "state" : "SD" } +{ "_id" : "57202", "city" : "WAVERLY", "loc" : [ -96.946744, 45.003209 ], "pop" : 163, "state" : "SD" } +{ "_id" : "57212", "city" : "ARLINGTON", "loc" : [ -97.06873400000001, 44.366769 ], "pop" : 358, "state" : "SD" } +{ "_id" : "57213", "city" : "ASTORIA", "loc" : [ -96.541634, 44.573515 ], "pop" : 370, "state" : "SD" } +{ "_id" : "57214", "city" : "BADGER", "loc" : [ -97.218368, 44.491802 ], "pop" : 354, "state" : "SD" } +{ "_id" : "57216", "city" : "BIG STONE CITY", "loc" : [ -96.56143400000001, 45.28504 ], "pop" : 1568, "state" : "SD" } +{ "_id" : "57217", "city" : "BRADLEY", "loc" : [ -97.638712, 45.075099 ], "pop" : 399, "state" : "SD" } +{ "_id" : "57218", "city" : "BRANDT", "loc" : [ -96.643545, 44.67383 ], "pop" : 655, "state" : "SD" } +{ "_id" : "57219", "city" : "BUTLER", "loc" : [ -97.746573, 45.308982 ], "pop" : 769, "state" : "SD" } +{ "_id" : "57220", "city" : "BRUCE", "loc" : [ -96.910984, 44.467453 ], "pop" : 929, "state" : "SD" } +{ "_id" : "57221", "city" : "BRYANT", "loc" : [ -97.453659, 44.598671 ], "pop" : 627, "state" : "SD" } +{ "_id" : "57223", "city" : "CASTLEWOOD", "loc" : [ -97.020432, 44.731339 ], "pop" : 1083, "state" : "SD" } +{ "_id" : "57224", "city" : "CLAIRE CITY", "loc" : [ -97.107274, 45.875522 ], "pop" : 394, "state" : "SD" } +{ "_id" : "57225", "city" : "CLARK", "loc" : [ -97.726536, 44.878 ], "pop" : 2062, "state" : "SD" } +{ "_id" : "57226", "city" : "ALTAMONT", "loc" : [ -96.700541, 44.763703 ], "pop" : 1786, "state" : "SD" } +{ "_id" : "57227", "city" : "CORONA", "loc" : [ -96.664897, 45.359483 ], "pop" : 613, "state" : "SD" } +{ "_id" : "57231", "city" : "DE SMET", "loc" : [ -97.56343200000001, 44.385169 ], "pop" : 1956, "state" : "SD" } +{ "_id" : "57232", "city" : "EDEN", "loc" : [ -97.37409100000001, 45.621074 ], "pop" : 318, "state" : "SD" } +{ "_id" : "57233", "city" : "ERWIN", "loc" : [ -97.410291, 44.491484 ], "pop" : 225, "state" : "SD" } +{ "_id" : "57234", "city" : "DEMPSTER", "loc" : [ -96.923678, 44.576998 ], "pop" : 903, "state" : "SD" } +{ "_id" : "57235", "city" : "FLORENCE", "loc" : [ -97.286643, 45.055388 ], "pop" : 664, "state" : "SD" } +{ "_id" : "57236", "city" : "GARDEN CITY", "loc" : [ -97.56802500000001, 44.947413 ], "pop" : 175, "state" : "SD" } +{ "_id" : "57237", "city" : "GARY", "loc" : [ -96.504362, 44.827022 ], "pop" : 733, "state" : "SD" } +{ "_id" : "57238", "city" : "BEMIS", "loc" : [ -96.811368, 44.886232 ], "pop" : 509, "state" : "SD" } +{ "_id" : "57239", "city" : "GRENVILLE", "loc" : [ -97.415457, 45.489673 ], "pop" : 334, "state" : "SD" } +{ "_id" : "57241", "city" : "HAYTI", "loc" : [ -97.230509, 44.664737 ], "pop" : 720, "state" : "SD" } +{ "_id" : "57242", "city" : "HAZEL", "loc" : [ -97.30829, 44.75717 ], "pop" : 496, "state" : "SD" } +{ "_id" : "57243", "city" : "HENRY", "loc" : [ -97.444216, 44.88576 ], "pop" : 435, "state" : "SD" } +{ "_id" : "57244", "city" : "HETLAND", "loc" : [ -97.141024, 44.367519 ], "pop" : 1069, "state" : "SD" } +{ "_id" : "57245", "city" : "KRANZBURG", "loc" : [ -96.947013, 44.879264 ], "pop" : 525, "state" : "SD" } +{ "_id" : "57246", "city" : "LABOLT", "loc" : [ -96.68920900000001, 45.041458 ], "pop" : 188, "state" : "SD" } +{ "_id" : "57247", "city" : "LAKE CITY", "loc" : [ -97.348131, 45.68991 ], "pop" : 401, "state" : "SD" } +{ "_id" : "57248", "city" : "LAKE NORDEN", "loc" : [ -97.200867, 44.584351 ], "pop" : 900, "state" : "SD" } +{ "_id" : "57249", "city" : "LAKE PRESTON", "loc" : [ -97.356283, 44.367298 ], "pop" : 1074, "state" : "SD" } +{ "_id" : "57251", "city" : "MARVIN", "loc" : [ -96.90996, 45.272651 ], "pop" : 146, "state" : "SD" } +{ "_id" : "57252", "city" : "MILBANK", "loc" : [ -96.62548, 45.206127 ], "pop" : 5235, "state" : "SD" } +{ "_id" : "57255", "city" : "NEW EFFINGTON", "loc" : [ -96.91498900000001, 45.865868 ], "pop" : 391, "state" : "SD" } +{ "_id" : "57256", "city" : "ORTLEY", "loc" : [ -97.176985, 45.340633 ], "pop" : 151, "state" : "SD" } +{ "_id" : "57257", "city" : "PEEVER", "loc" : [ -97.001205, 45.520647 ], "pop" : 992, "state" : "SD" } +{ "_id" : "57258", "city" : "RAYMOND", "loc" : [ -97.916781, 44.863651 ], "pop" : 415, "state" : "SD" } +{ "_id" : "57259", "city" : "ALBEE", "loc" : [ -96.562366, 45.022142 ], "pop" : 357, "state" : "SD" } +{ "_id" : "57260", "city" : "ROSHOLT", "loc" : [ -96.71741, 45.875315 ], "pop" : 841, "state" : "SD" } +{ "_id" : "57261", "city" : "ROSLYN", "loc" : [ -97.540105, 45.500564 ], "pop" : 533, "state" : "SD" } +{ "_id" : "57262", "city" : "AGENCY VILLAGE", "loc" : [ -97.02321999999999, 45.664413 ], "pop" : 4968, "state" : "SD" } +{ "_id" : "57263", "city" : "SOUTH SHORE", "loc" : [ -96.985885, 45.104919 ], "pop" : 487, "state" : "SD" } +{ "_id" : "57264", "city" : "STOCKHOLM", "loc" : [ -96.81059, 45.10309 ], "pop" : 213, "state" : "SD" } +{ "_id" : "57265", "city" : "STRANDBURG", "loc" : [ -96.79012899999999, 45.038872 ], "pop" : 133, "state" : "SD" } +{ "_id" : "57266", "city" : "SUMMIT", "loc" : [ -97.042654, 45.352128 ], "pop" : 469, "state" : "SD" } +{ "_id" : "57268", "city" : "TORONTO", "loc" : [ -96.70774, 44.578622 ], "pop" : 469, "state" : "SD" } +{ "_id" : "57269", "city" : "TWIN BROOKS", "loc" : [ -96.99560099999999, 45.211519 ], "pop" : 532, "state" : "SD" } +{ "_id" : "57270", "city" : "VEBLEN", "loc" : [ -97.31219299999999, 45.853508 ], "pop" : 765, "state" : "SD" } +{ "_id" : "57271", "city" : "VIENNA", "loc" : [ -97.545559, 44.690019 ], "pop" : 454, "state" : "SD" } +{ "_id" : "57272", "city" : "WALLACE", "loc" : [ -97.445751, 45.081542 ], "pop" : 276, "state" : "SD" } +{ "_id" : "57273", "city" : "WAUBAY", "loc" : [ -97.29498700000001, 45.37837 ], "pop" : 1437, "state" : "SD" } +{ "_id" : "57274", "city" : "LILY", "loc" : [ -97.515316, 45.322573 ], "pop" : 3194, "state" : "SD" } +{ "_id" : "57276", "city" : "WHITE", "loc" : [ -96.614963, 44.413237 ], "pop" : 1793, "state" : "SD" } +{ "_id" : "57278", "city" : "WILLOW LAKE", "loc" : [ -97.674747, 44.627225 ], "pop" : 661, "state" : "SD" } +{ "_id" : "57279", "city" : "WILMOT", "loc" : [ -96.85600599999999, 45.412487 ], "pop" : 1095, "state" : "SD" } +{ "_id" : "57301", "city" : "LOOMIS", "loc" : [ -98.02702600000001, 43.710921 ], "pop" : 16187, "state" : "SD" } +{ "_id" : "57311", "city" : "FARMER", "loc" : [ -97.782087, 43.623847 ], "pop" : 934, "state" : "SD" } +{ "_id" : "57312", "city" : "ALPENA", "loc" : [ -98.396191, 44.170907 ], "pop" : 414, "state" : "SD" } +{ "_id" : "57313", "city" : "ARMOUR", "loc" : [ -98.34137200000001, 43.316045 ], "pop" : 1118, "state" : "SD" } +{ "_id" : "57314", "city" : "FORESTBURG", "loc" : [ -97.953958, 44.035362 ], "pop" : 640, "state" : "SD" } +{ "_id" : "57315", "city" : "AVON", "loc" : [ -98.028261, 43.039725 ], "pop" : 1130, "state" : "SD" } +{ "_id" : "57316", "city" : "BANCROFT", "loc" : [ -97.77673299999999, 44.494419 ], "pop" : 200, "state" : "SD" } +{ "_id" : "57317", "city" : "BONESTEEL", "loc" : [ -98.987959, 43.069536 ], "pop" : 688, "state" : "SD" } +{ "_id" : "57319", "city" : "DOLTON", "loc" : [ -97.49590999999999, 43.554306 ], "pop" : 1055, "state" : "SD" } +{ "_id" : "57321", "city" : "CANOVA", "loc" : [ -97.53416300000001, 43.885517 ], "pop" : 506, "state" : "SD" } +{ "_id" : "57322", "city" : "CARPENTER", "loc" : [ -97.916825, 44.664768 ], "pop" : 101, "state" : "SD" } +{ "_id" : "57323", "city" : "CARTHAGE", "loc" : [ -97.71163199999999, 44.1496 ], "pop" : 380, "state" : "SD" } +{ "_id" : "57324", "city" : "CAVOUR", "loc" : [ -98.020797, 44.364951 ], "pop" : 444, "state" : "SD" } +{ "_id" : "57325", "city" : "CHAMBERLAIN", "loc" : [ -99.311819, 43.795295 ], "pop" : 3218, "state" : "SD" } +{ "_id" : "57328", "city" : "CORSICA", "loc" : [ -98.356358, 43.421319 ], "pop" : 1569, "state" : "SD" } +{ "_id" : "57329", "city" : "DANTE", "loc" : [ -98.174637, 42.996661 ], "pop" : 519, "state" : "SD" } +{ "_id" : "57330", "city" : "DELMONT", "loc" : [ -98.159612, 43.257261 ], "pop" : 468, "state" : "SD" } +{ "_id" : "57331", "city" : "DIMOCK", "loc" : [ -97.9988, 43.470476 ], "pop" : 426, "state" : "SD" } +{ "_id" : "57332", "city" : "EMERY", "loc" : [ -97.64748899999999, 43.565647 ], "pop" : 888, "state" : "SD" } +{ "_id" : "57334", "city" : "ETHAN", "loc" : [ -98.059074, 43.542653 ], "pop" : 975, "state" : "SD" } +{ "_id" : "57335", "city" : "FAIRFAX", "loc" : [ -98.83075700000001, 43.035103 ], "pop" : 423, "state" : "SD" } +{ "_id" : "57337", "city" : "FEDORA", "loc" : [ -97.78900299999999, 43.984125 ], "pop" : 288, "state" : "SD" } +{ "_id" : "57339", "city" : "FORT THOMPSON", "loc" : [ -99.397305, 44.051695 ], "pop" : 1495, "state" : "SD" } +{ "_id" : "57340", "city" : "FULTON", "loc" : [ -97.871218, 43.758767 ], "pop" : 572, "state" : "SD" } +{ "_id" : "57341", "city" : "GANN VALLEY", "loc" : [ -99.054334, 44.069303 ], "pop" : 264, "state" : "SD" } +{ "_id" : "57342", "city" : "GEDDES", "loc" : [ -98.69256, 43.259677 ], "pop" : 725, "state" : "SD" } +{ "_id" : "57344", "city" : "HARRISON", "loc" : [ -98.523338, 43.454923 ], "pop" : 233, "state" : "SD" } +{ "_id" : "57345", "city" : "HIGHMORE", "loc" : [ -99.45434899999999, 44.532604 ], "pop" : 1652, "state" : "SD" } +{ "_id" : "57348", "city" : "HITCHCOCK", "loc" : [ -98.450914, 44.583444 ], "pop" : 501, "state" : "SD" } +{ "_id" : "57349", "city" : "ROSWELL", "loc" : [ -97.516012, 44.029296 ], "pop" : 2098, "state" : "SD" } +{ "_id" : "57350", "city" : "HURON", "loc" : [ -98.21629299999999, 44.359022 ], "pop" : 15277, "state" : "SD" } +{ "_id" : "57353", "city" : "IROQUOIS", "loc" : [ -97.85417200000001, 44.345517 ], "pop" : 576, "state" : "SD" } +{ "_id" : "57354", "city" : "KAYLOR", "loc" : [ -97.820094, 43.202393 ], "pop" : 223, "state" : "SD" } +{ "_id" : "57355", "city" : "KIMBALL", "loc" : [ -98.93430499999999, 43.712881 ], "pop" : 1546, "state" : "SD" } +{ "_id" : "57356", "city" : "LAKE ANDES", "loc" : [ -98.49635499999999, 43.130288 ], "pop" : 2556, "state" : "SD" } +{ "_id" : "57357", "city" : "RAVINIA", "loc" : [ -98.426413, 43.136123 ], "pop" : 79, "state" : "SD" } +{ "_id" : "57358", "city" : "LANE", "loc" : [ -98.406496, 44.067383 ], "pop" : 152, "state" : "SD" } +{ "_id" : "57359", "city" : "LETCHER", "loc" : [ -98.174279, 43.892324 ], "pop" : 912, "state" : "SD" } +{ "_id" : "57361", "city" : "MARTY", "loc" : [ -98.42242899999999, 42.97639 ], "pop" : 306, "state" : "SD" } +{ "_id" : "57362", "city" : "MILLER", "loc" : [ -98.989395, 44.496644 ], "pop" : 2938, "state" : "SD" } +{ "_id" : "57363", "city" : "MOUNT VERNON", "loc" : [ -98.263288, 43.7204 ], "pop" : 731, "state" : "SD" } +{ "_id" : "57364", "city" : "NEW HOLLAND", "loc" : [ -98.628697, 43.431042 ], "pop" : 358, "state" : "SD" } +{ "_id" : "57366", "city" : "PARKSTON", "loc" : [ -97.96782399999999, 43.397796 ], "pop" : 2231, "state" : "SD" } +{ "_id" : "57368", "city" : "PLANKINTON", "loc" : [ -98.46939500000001, 43.737287 ], "pop" : 1129, "state" : "SD" } +{ "_id" : "57369", "city" : "ACADEMY", "loc" : [ -98.889656, 43.40242 ], "pop" : 2425, "state" : "SD" } +{ "_id" : "57370", "city" : "PUKWANA", "loc" : [ -99.17788400000001, 43.778326 ], "pop" : 577, "state" : "SD" } +{ "_id" : "57371", "city" : "REE HEIGHTS", "loc" : [ -99.22864, 44.560275 ], "pop" : 288, "state" : "SD" } +{ "_id" : "57373", "city" : "SAINT LAWRENCE", "loc" : [ -98.875427, 44.521523 ], "pop" : 425, "state" : "SD" } +{ "_id" : "57374", "city" : "SPENCER", "loc" : [ -97.59361, 43.755684 ], "pop" : 658, "state" : "SD" } +{ "_id" : "57375", "city" : "STICKNEY", "loc" : [ -98.508843, 43.58422 ], "pop" : 1099, "state" : "SD" } +{ "_id" : "57376", "city" : "TRIPP", "loc" : [ -97.97128499999999, 43.240377 ], "pop" : 1128, "state" : "SD" } +{ "_id" : "57379", "city" : "VIRGIL", "loc" : [ -98.392146, 44.325582 ], "pop" : 167, "state" : "SD" } +{ "_id" : "57380", "city" : "WAGNER", "loc" : [ -98.281876, 43.081931 ], "pop" : 2665, "state" : "SD" } +{ "_id" : "57381", "city" : "WESSINGTON", "loc" : [ -98.691982, 44.41285 ], "pop" : 618, "state" : "SD" } +{ "_id" : "57382", "city" : "WESSINGTON SPRIN", "loc" : [ -98.611625, 44.069935 ], "pop" : 1864, "state" : "SD" } +{ "_id" : "57383", "city" : "WHITE LAKE", "loc" : [ -98.70761299999999, 43.756441 ], "pop" : 717, "state" : "SD" } +{ "_id" : "57384", "city" : "WOLSEY", "loc" : [ -98.474251, 44.399072 ], "pop" : 751, "state" : "SD" } +{ "_id" : "57385", "city" : "WOONSOCKET", "loc" : [ -98.24301699999999, 44.057186 ], "pop" : 1471, "state" : "SD" } +{ "_id" : "57386", "city" : "YALE", "loc" : [ -97.99324900000001, 44.495591 ], "pop" : 462, "state" : "SD" } +{ "_id" : "57401", "city" : "ABERDEEN", "loc" : [ -98.485642, 45.466109 ], "pop" : 28786, "state" : "SD" } +{ "_id" : "57420", "city" : "AKASKA", "loc" : [ -100.118614, 45.332447 ], "pop" : 52, "state" : "SD" } +{ "_id" : "57421", "city" : "AMHERST", "loc" : [ -97.93007799999999, 45.707426 ], "pop" : 227, "state" : "SD" } +{ "_id" : "57422", "city" : "ANDOVER", "loc" : [ -97.917497, 45.422171 ], "pop" : 348, "state" : "SD" } +{ "_id" : "57424", "city" : "ATHOL", "loc" : [ -98.442549, 45.012833 ], "pop" : 306, "state" : "SD" } +{ "_id" : "57426", "city" : "BARNARD", "loc" : [ -98.55337900000001, 45.720469 ], "pop" : 172, "state" : "SD" } +{ "_id" : "57427", "city" : "BATH", "loc" : [ -98.355209, 45.456352 ], "pop" : 593, "state" : "SD" } +{ "_id" : "57428", "city" : "BOWDLE", "loc" : [ -99.63597799999999, 45.432881 ], "pop" : 882, "state" : "SD" } +{ "_id" : "57429", "city" : "BRENTFORD", "loc" : [ -98.319281, 45.153063 ], "pop" : 257, "state" : "SD" } +{ "_id" : "57430", "city" : "BRITTON", "loc" : [ -97.74183499999999, 45.802304 ], "pop" : 2507, "state" : "SD" } +{ "_id" : "57432", "city" : "CLAREMONT", "loc" : [ -98.040367, 45.666149 ], "pop" : 400, "state" : "SD" } +{ "_id" : "57433", "city" : "COLUMBIA", "loc" : [ -98.295152, 45.671721 ], "pop" : 585, "state" : "SD" } +{ "_id" : "57434", "city" : "VERDON", "loc" : [ -98.034323, 45.155125 ], "pop" : 611, "state" : "SD" } +{ "_id" : "57435", "city" : "CRESBARD", "loc" : [ -98.941124, 45.169125 ], "pop" : 312, "state" : "SD" } +{ "_id" : "57436", "city" : "DOLAND", "loc" : [ -98.09470899999999, 44.81587 ], "pop" : 997, "state" : "SD" } +{ "_id" : "57437", "city" : "ARTAS", "loc" : [ -99.615926, 45.769768 ], "pop" : 1753, "state" : "SD" } +{ "_id" : "57438", "city" : "MIRANDA", "loc" : [ -99.13405400000001, 45.06845 ], "pop" : 1593, "state" : "SD" } +{ "_id" : "57440", "city" : "FRANKFORT", "loc" : [ -98.293496, 44.808416 ], "pop" : 533, "state" : "SD" } +{ "_id" : "57441", "city" : "FREDERICK", "loc" : [ -98.51756399999999, 45.849332 ], "pop" : 524, "state" : "SD" } +{ "_id" : "57442", "city" : "GETTYSBURG", "loc" : [ -99.976626, 45.02588 ], "pop" : 2065, "state" : "SD" } +{ "_id" : "57445", "city" : "GROTON", "loc" : [ -98.105814, 45.450345 ], "pop" : 1814, "state" : "SD" } +{ "_id" : "57446", "city" : "HECLA", "loc" : [ -98.191774, 45.872515 ], "pop" : 754, "state" : "SD" } +{ "_id" : "57448", "city" : "HOSMER", "loc" : [ -99.48574499999999, 45.568988 ], "pop" : 454, "state" : "SD" } +{ "_id" : "57449", "city" : "HOUGHTON", "loc" : [ -98.095186, 45.796746 ], "pop" : 147, "state" : "SD" } +{ "_id" : "57450", "city" : "HOVEN", "loc" : [ -99.776286, 45.227799 ], "pop" : 677, "state" : "SD" } +{ "_id" : "57451", "city" : "IPSWICH", "loc" : [ -99.014807, 45.448905 ], "pop" : 1771, "state" : "SD" } +{ "_id" : "57452", "city" : "JAVA", "loc" : [ -99.83515300000001, 45.413541 ], "pop" : 518, "state" : "SD" } +{ "_id" : "57454", "city" : "LANGFORD", "loc" : [ -97.792547, 45.617381 ], "pop" : 626, "state" : "SD" } +{ "_id" : "57455", "city" : "LEBANON", "loc" : [ -99.73657900000001, 45.012318 ], "pop" : 259, "state" : "SD" } +{ "_id" : "57456", "city" : "LEOLA", "loc" : [ -98.901544, 45.732265 ], "pop" : 1192, "state" : "SD" } +{ "_id" : "57457", "city" : "LONGLAKE", "loc" : [ -99.250677, 45.796812 ], "pop" : 378, "state" : "SD" } +{ "_id" : "57460", "city" : "MANSFIELD", "loc" : [ -98.606568, 45.226727 ], "pop" : 92, "state" : "SD" } +{ "_id" : "57461", "city" : "MELLETTE", "loc" : [ -98.48237, 45.16312 ], "pop" : 362, "state" : "SD" } +{ "_id" : "57462", "city" : "MINA", "loc" : [ -98.756581, 45.439116 ], "pop" : 515, "state" : "SD" } +{ "_id" : "57465", "city" : "NORTHVILLE", "loc" : [ -98.65885299999999, 45.161112 ], "pop" : 328, "state" : "SD" } +{ "_id" : "57466", "city" : "ONAKA", "loc" : [ -99.45505199999999, 45.196527 ], "pop" : 143, "state" : "SD" } +{ "_id" : "57467", "city" : "ORIENT", "loc" : [ -99.10578700000001, 44.834347 ], "pop" : 441, "state" : "SD" } +{ "_id" : "57468", "city" : "PIERPONT", "loc" : [ -97.812844, 45.495983 ], "pop" : 328, "state" : "SD" } +{ "_id" : "57469", "city" : "REDFIELD", "loc" : [ -98.511234, 44.871853 ], "pop" : 4033, "state" : "SD" } +{ "_id" : "57470", "city" : "ROCKHAM", "loc" : [ -98.768683, 44.971579 ], "pop" : 237, "state" : "SD" } +{ "_id" : "57471", "city" : "ROSCOE", "loc" : [ -99.33263100000001, 45.427119 ], "pop" : 673, "state" : "SD" } +{ "_id" : "57472", "city" : "SELBY", "loc" : [ -100.054067, 45.478587 ], "pop" : 1284, "state" : "SD" } +{ "_id" : "57473", "city" : "SENECA", "loc" : [ -99.46098600000001, 45.026191 ], "pop" : 246, "state" : "SD" } +{ "_id" : "57474", "city" : "STRATFORD", "loc" : [ -98.27915299999999, 45.286595 ], "pop" : 418, "state" : "SD" } +{ "_id" : "57475", "city" : "TOLSTOY", "loc" : [ -99.617553, 45.170199 ], "pop" : 189, "state" : "SD" } +{ "_id" : "57476", "city" : "TULARE", "loc" : [ -98.553926, 44.730489 ], "pop" : 526, "state" : "SD" } +{ "_id" : "57477", "city" : "TURTON", "loc" : [ -98.09964100000001, 45.037938 ], "pop" : 154, "state" : "SD" } +{ "_id" : "57479", "city" : "WARNER", "loc" : [ -98.475697, 45.348627 ], "pop" : 1060, "state" : "SD" } +{ "_id" : "57481", "city" : "WETONKA", "loc" : [ -98.585623, 45.625025 ], "pop" : 337, "state" : "SD" } +{ "_id" : "57483", "city" : "ZELL", "loc" : [ -98.831746, 44.854624 ], "pop" : 131, "state" : "SD" } +{ "_id" : "57501", "city" : "PIERRE", "loc" : [ -100.321057, 44.369514 ], "pop" : 14138, "state" : "SD" } +{ "_id" : "57520", "city" : "AGAR", "loc" : [ -100.071238, 44.839345 ], "pop" : 89, "state" : "SD" } +{ "_id" : "57521", "city" : "BELVIDERE", "loc" : [ -101.238691, 43.886031 ], "pop" : 177, "state" : "SD" } +{ "_id" : "57522", "city" : "BLUNT", "loc" : [ -99.94627800000001, 44.502572 ], "pop" : 484, "state" : "SD" } +{ "_id" : "57523", "city" : "LUCAS", "loc" : [ -99.268963, 43.210602 ], "pop" : 1258, "state" : "SD" } +{ "_id" : "57526", "city" : "CARTER", "loc" : [ -100.172958, 43.368487 ], "pop" : 118, "state" : "SD" } +{ "_id" : "57527", "city" : "CEDARBUTTE", "loc" : [ -101.131585, 43.64731 ], "pop" : 208, "state" : "SD" } +{ "_id" : "57528", "city" : "COLOME", "loc" : [ -99.693273, 43.227334 ], "pop" : 771, "state" : "SD" } +{ "_id" : "57529", "city" : "DALLAS", "loc" : [ -99.513994, 43.235075 ], "pop" : 167, "state" : "SD" } +{ "_id" : "57531", "city" : "DRAPER", "loc" : [ -100.508514, 43.926035 ], "pop" : 304, "state" : "SD" } +{ "_id" : "57532", "city" : "FORT PIERRE", "loc" : [ -100.404323, 44.342587 ], "pop" : 2179, "state" : "SD" } +{ "_id" : "57533", "city" : "DIXON", "loc" : [ -99.43021400000001, 43.226908 ], "pop" : 2401, "state" : "SD" } +{ "_id" : "57534", "city" : "HAMILL", "loc" : [ -99.69175199999999, 43.643942 ], "pop" : 78, "state" : "SD" } +{ "_id" : "57536", "city" : "HARROLD", "loc" : [ -99.73816600000001, 44.521476 ], "pop" : 195, "state" : "SD" } +{ "_id" : "57537", "city" : "HAYES", "loc" : [ -100.735938, 44.421898 ], "pop" : 191, "state" : "SD" } +{ "_id" : "57538", "city" : "HERRICK", "loc" : [ -99.21726700000001, 43.101186 ], "pop" : 337, "state" : "SD" } +{ "_id" : "57540", "city" : "HOLABIRD", "loc" : [ -99.59429900000001, 44.517327 ], "pop" : 44, "state" : "SD" } +{ "_id" : "57541", "city" : "IDEAL", "loc" : [ -99.927949, 43.559612 ], "pop" : 473, "state" : "SD" } +{ "_id" : "57542", "city" : "IONA", "loc" : [ -99.488073, 43.575756 ], "pop" : 146, "state" : "SD" } +{ "_id" : "57543", "city" : "KADOKA", "loc" : [ -101.552272, 43.84457 ], "pop" : 1024, "state" : "SD" } +{ "_id" : "57544", "city" : "KENNEBEC", "loc" : [ -99.850191, 43.892139 ], "pop" : 495, "state" : "SD" } +{ "_id" : "57545", "city" : "KEYAPAHA", "loc" : [ -100.163958, 43.073497 ], "pop" : 48, "state" : "SD" } +{ "_id" : "57547", "city" : "LONG VALLEY", "loc" : [ -101.382145, 43.569784 ], "pop" : 214, "state" : "SD" } +{ "_id" : "57548", "city" : "LOWER BRULE", "loc" : [ -99.613896, 44.093692 ], "pop" : 1118, "state" : "SD" } +{ "_id" : "57551", "city" : "VETAL", "loc" : [ -101.740814, 43.178543 ], "pop" : 2159, "state" : "SD" } +{ "_id" : "57552", "city" : "OTTUMWA", "loc" : [ -101.292442, 44.237443 ], "pop" : 789, "state" : "SD" } +{ "_id" : "57553", "city" : "MILESVILLE", "loc" : [ -101.752276, 44.428259 ], "pop" : 191, "state" : "SD" } +{ "_id" : "57555", "city" : "MISSION", "loc" : [ -100.595364, 43.285017 ], "pop" : 3169, "state" : "SD" } +{ "_id" : "57557", "city" : "MISSION RIDGE", "loc" : [ -100.894553, 44.623851 ], "pop" : 83, "state" : "SD" } +{ "_id" : "57559", "city" : "MURDO", "loc" : [ -100.712107, 43.896115 ], "pop" : 855, "state" : "SD" } +{ "_id" : "57560", "city" : "NORRIS", "loc" : [ -101.151664, 43.466176 ], "pop" : 322, "state" : "SD" } +{ "_id" : "57562", "city" : "OKATON", "loc" : [ -100.935054, 43.934157 ], "pop" : 165, "state" : "SD" } +{ "_id" : "57564", "city" : "ONIDA", "loc" : [ -100.095667, 44.712543 ], "pop" : 1500, "state" : "SD" } +{ "_id" : "57566", "city" : "PARMELEE", "loc" : [ -101.008089, 43.311716 ], "pop" : 1272, "state" : "SD" } +{ "_id" : "57567", "city" : "PHILIP", "loc" : [ -101.687611, 44.055006 ], "pop" : 1644, "state" : "SD" } +{ "_id" : "57568", "city" : "PRESHO", "loc" : [ -100.074645, 43.899538 ], "pop" : 897, "state" : "SD" } +{ "_id" : "57569", "city" : "RELIANCE", "loc" : [ -99.485668, 43.830241 ], "pop" : 790, "state" : "SD" } +{ "_id" : "57571", "city" : "SAINT CHARLES", "loc" : [ -99.090969, 43.108893 ], "pop" : 85, "state" : "SD" } +{ "_id" : "57572", "city" : "SAINT FRANCIS", "loc" : [ -100.88502, 43.191017 ], "pop" : 3917, "state" : "SD" } +{ "_id" : "57574", "city" : "TUTHILL", "loc" : [ -101.470116, 43.119623 ], "pop" : 286, "state" : "SD" } +{ "_id" : "57576", "city" : "VIVIAN", "loc" : [ -100.285989, 43.95352 ], "pop" : 192, "state" : "SD" } +{ "_id" : "57577", "city" : "WANBLEE", "loc" : [ -101.721856, 43.55893 ], "pop" : 1269, "state" : "SD" } +{ "_id" : "57578", "city" : "WEWELA", "loc" : [ -99.747317, 43.079352 ], "pop" : 207, "state" : "SD" } +{ "_id" : "57579", "city" : "WHITE RIVER", "loc" : [ -100.74487, 43.56662 ], "pop" : 1259, "state" : "SD" } +{ "_id" : "57580", "city" : "CLEARFIELD", "loc" : [ -99.861907, 43.355504 ], "pop" : 5111, "state" : "SD" } +{ "_id" : "57584", "city" : "WITTEN", "loc" : [ -100.078291, 43.44982 ], "pop" : 118, "state" : "SD" } +{ "_id" : "57585", "city" : "WOOD", "loc" : [ -100.437929, 43.536599 ], "pop" : 342, "state" : "SD" } +{ "_id" : "57601", "city" : "MOBRIDGE", "loc" : [ -100.431488, 45.540723 ], "pop" : 4099, "state" : "SD" } +{ "_id" : "57620", "city" : "BISON", "loc" : [ -102.482707, 45.516126 ], "pop" : 710, "state" : "SD" } +{ "_id" : "57622", "city" : "CHERRY CREEK", "loc" : [ -101.65178, 44.621018 ], "pop" : 715, "state" : "SD" } +{ "_id" : "57623", "city" : "DUPREE", "loc" : [ -101.63368, 45.007851 ], "pop" : 1441, "state" : "SD" } +{ "_id" : "57626", "city" : "FAITH", "loc" : [ -102.054142, 44.992609 ], "pop" : 660, "state" : "SD" } +{ "_id" : "57628", "city" : "FIRESTEEL", "loc" : [ -101.223461, 45.430736 ], "pop" : 50, "state" : "SD" } +{ "_id" : "57629", "city" : "GLAD VALLEY", "loc" : [ -101.795168, 45.43696 ], "pop" : 64, "state" : "SD" } +{ "_id" : "57630", "city" : "GLENCROSS", "loc" : [ -100.894417, 45.450549 ], "pop" : 56, "state" : "SD" } +{ "_id" : "57631", "city" : "GLENHAM", "loc" : [ -100.27156, 45.53351 ], "pop" : 134, "state" : "SD" } +{ "_id" : "57632", "city" : "HERREID", "loc" : [ -100.048983, 45.845164 ], "pop" : 829, "state" : "SD" } +{ "_id" : "57633", "city" : "ISABEL", "loc" : [ -101.273637, 45.064016 ], "pop" : 3606, "state" : "SD" } +{ "_id" : "57634", "city" : "KELDRON", "loc" : [ -101.939465, 45.902221 ], "pop" : 72, "state" : "SD" } +{ "_id" : "57638", "city" : "LEMMON", "loc" : [ -102.192772, 45.915892 ], "pop" : 2127, "state" : "SD" } +{ "_id" : "57640", "city" : "LODGEPOLE", "loc" : [ -102.759917, 45.823193 ], "pop" : 216, "state" : "SD" } +{ "_id" : "57641", "city" : "MC INTOSH", "loc" : [ -101.500393, 45.81244 ], "pop" : 719, "state" : "SD" } +{ "_id" : "57642", "city" : "MC LAUGHLIN", "loc" : [ -100.877596, 45.748884 ], "pop" : 2545, "state" : "SD" } +{ "_id" : "57643", "city" : "MAHTO", "loc" : [ -100.658897, 45.767644 ], "pop" : 31, "state" : "SD" } +{ "_id" : "57644", "city" : "MEADOW", "loc" : [ -102.284425, 45.353769 ], "pop" : 530, "state" : "SD" } +{ "_id" : "57645", "city" : "MORRISTOWN", "loc" : [ -101.699838, 45.900642 ], "pop" : 190, "state" : "SD" } +{ "_id" : "57646", "city" : "MOUND CITY", "loc" : [ -100.047856, 45.678645 ], "pop" : 548, "state" : "SD" } +{ "_id" : "57647", "city" : "PARADE", "loc" : [ -100.743399, 45.108068 ], "pop" : 819, "state" : "SD" } +{ "_id" : "57648", "city" : "POLLOCK", "loc" : [ -100.287518, 45.889043 ], "pop" : 493, "state" : "SD" } +{ "_id" : "57649", "city" : "PRAIRIE CITY", "loc" : [ -102.80847, 45.581342 ], "pop" : 172, "state" : "SD" } +{ "_id" : "57650", "city" : "RALPH", "loc" : [ -103.035552, 45.855365 ], "pop" : 101, "state" : "SD" } +{ "_id" : "57651", "city" : "REVA", "loc" : [ -103.069163, 45.527653 ], "pop" : 332, "state" : "SD" } +{ "_id" : "57653", "city" : "SHADEHILL", "loc" : [ -102.189131, 45.669855 ], "pop" : 49, "state" : "SD" } +{ "_id" : "57656", "city" : "TIMBER LAKE", "loc" : [ -101.035077, 45.392737 ], "pop" : 939, "state" : "SD" } +{ "_id" : "57657", "city" : "TRAIL CITY", "loc" : [ -100.682902, 45.440082 ], "pop" : 53, "state" : "SD" } +{ "_id" : "57658", "city" : "WAKPALA", "loc" : [ -100.533176, 45.700617 ], "pop" : 582, "state" : "SD" } +{ "_id" : "57660", "city" : "WATAUGA", "loc" : [ -101.512936, 45.927593 ], "pop" : 56, "state" : "SD" } +{ "_id" : "57701", "city" : "ROCKERVILLE", "loc" : [ -103.200259, 44.077041 ], "pop" : 45328, "state" : "SD" } +{ "_id" : "57702", "city" : "SILVER CITY", "loc" : [ -103.283406, 44.069796 ], "pop" : 20904, "state" : "SD" } +{ "_id" : "57706", "city" : "ELLSWORTH AFB", "loc" : [ -103.07591, 44.144655 ], "pop" : 6355, "state" : "SD" } +{ "_id" : "57708", "city" : "BETHLEHEM", "loc" : [ -103.461246, 44.288967 ], "pop" : 374, "state" : "SD" } +{ "_id" : "57714", "city" : "ALLEN", "loc" : [ -101.932858, 43.290818 ], "pop" : 761, "state" : "SD" } +{ "_id" : "57716", "city" : "DENBY", "loc" : [ -102.173776, 43.078962 ], "pop" : 435, "state" : "SD" } +{ "_id" : "57717", "city" : "BELLE FOURCHE", "loc" : [ -103.839601, 44.672281 ], "pop" : 5841, "state" : "SD" } +{ "_id" : "57718", "city" : "BLACK HAWK", "loc" : [ -103.348634, 44.151173 ], "pop" : 7418, "state" : "SD" } +{ "_id" : "57719", "city" : "BOX ELDER", "loc" : [ -103.068237, 44.119858 ], "pop" : 3690, "state" : "SD" } +{ "_id" : "57720", "city" : "BUFFALO", "loc" : [ -103.582605, 45.574001 ], "pop" : 913, "state" : "SD" } +{ "_id" : "57722", "city" : "BUFFALO GAP", "loc" : [ -103.315749, 43.495762 ], "pop" : 302, "state" : "SD" } +{ "_id" : "57724", "city" : "SKY RANCH", "loc" : [ -103.963232, 45.595289 ], "pop" : 258, "state" : "SD" } +{ "_id" : "57725", "city" : "CAPUTA", "loc" : [ -103.023406, 43.980116 ], "pop" : 578, "state" : "SD" } +{ "_id" : "57729", "city" : "CREIGHTON", "loc" : [ -102.177043, 44.283087 ], "pop" : 127, "state" : "SD" } +{ "_id" : "57730", "city" : "CRAZY HORSE", "loc" : [ -103.618465, 43.740886 ], "pop" : 4781, "state" : "SD" } +{ "_id" : "57732", "city" : "DEADWOOD", "loc" : [ -103.699939, 44.356628 ], "pop" : 2726, "state" : "SD" } +{ "_id" : "57735", "city" : "EDGEMONT", "loc" : [ -103.811018, 43.287361 ], "pop" : 1264, "state" : "SD" } +{ "_id" : "57736", "city" : "ELM SPRINGS", "loc" : [ -102.631208, 44.239743 ], "pop" : 222, "state" : "SD" } +{ "_id" : "57737", "city" : "ENNING", "loc" : [ -102.6208, 44.538884 ], "pop" : 275, "state" : "SD" } +{ "_id" : "57738", "city" : "FAIRBURN", "loc" : [ -103.213335, 43.66228 ], "pop" : 203, "state" : "SD" } +{ "_id" : "57741", "city" : "FORT MEADE", "loc" : [ -103.47233, 44.409097 ], "pop" : 124, "state" : "SD" } +{ "_id" : "57742", "city" : "FRUITDALE", "loc" : [ -103.689568, 44.660039 ], "pop" : 234, "state" : "SD" } +{ "_id" : "57744", "city" : "HERMOSA", "loc" : [ -103.20596, 43.818845 ], "pop" : 919, "state" : "SD" } +{ "_id" : "57745", "city" : "HILL CITY", "loc" : [ -103.578158, 43.93768 ], "pop" : 1671, "state" : "SD" } +{ "_id" : "57747", "city" : "HOT SPRINGS", "loc" : [ -103.476555, 43.422308 ], "pop" : 5467, "state" : "SD" } +{ "_id" : "57748", "city" : "PLAINVIEW", "loc" : [ -102.215763, 44.534952 ], "pop" : 153, "state" : "SD" } +{ "_id" : "57750", "city" : "INTERIOR", "loc" : [ -101.964238, 43.731892 ], "pop" : 127, "state" : "SD" } +{ "_id" : "57751", "city" : "KEYSTONE", "loc" : [ -103.335235, 43.969604 ], "pop" : 2573, "state" : "SD" } +{ "_id" : "57752", "city" : "KYLE", "loc" : [ -102.212419, 43.439437 ], "pop" : 1424, "state" : "SD" } +{ "_id" : "57754", "city" : "SPEARFISH CANYON", "loc" : [ -103.769841, 44.349012 ], "pop" : 4626, "state" : "SD" } +{ "_id" : "57755", "city" : "LUDLOW", "loc" : [ -103.31115, 45.874655 ], "pop" : 142, "state" : "SD" } +{ "_id" : "57756", "city" : "MANDERSON", "loc" : [ -102.374493, 43.309844 ], "pop" : 1027, "state" : "SD" } +{ "_id" : "57757", "city" : "MARCUS", "loc" : [ -102.330697, 44.674678 ], "pop" : 28, "state" : "SD" } +{ "_id" : "57758", "city" : "MUD BUTTE", "loc" : [ -102.803129, 45.031046 ], "pop" : 104, "state" : "SD" } +{ "_id" : "57759", "city" : "NEMO", "loc" : [ -103.544863, 44.209718 ], "pop" : 393, "state" : "SD" } +{ "_id" : "57760", "city" : "NEWELL", "loc" : [ -103.391359, 44.740979 ], "pop" : 1223, "state" : "SD" } +{ "_id" : "57761", "city" : "NEW UNDERWOOD", "loc" : [ -102.813635, 44.087354 ], "pop" : 763, "state" : "SD" } +{ "_id" : "57762", "city" : "NISLAND", "loc" : [ -103.540176, 44.666539 ], "pop" : 313, "state" : "SD" } +{ "_id" : "57763", "city" : "OELRICHS", "loc" : [ -103.216181, 43.155063 ], "pop" : 284, "state" : "SD" } +{ "_id" : "57765", "city" : "OPAL", "loc" : [ -102.477752, 44.867111 ], "pop" : 235, "state" : "SD" } +{ "_id" : "57766", "city" : "ORAL", "loc" : [ -103.183215, 43.387587 ], "pop" : 265, "state" : "SD" } +{ "_id" : "57767", "city" : "OWANKA", "loc" : [ -102.562776, 44.063078 ], "pop" : 69, "state" : "SD" } +{ "_id" : "57769", "city" : "PIEDMONT", "loc" : [ -103.368818, 44.228744 ], "pop" : 1337, "state" : "SD" } +{ "_id" : "57770", "city" : "PINE RIDGE", "loc" : [ -102.598352, 43.112401 ], "pop" : 5720, "state" : "SD" } +{ "_id" : "57772", "city" : "PORCUPINE", "loc" : [ -102.223448, 43.293979 ], "pop" : 470, "state" : "SD" } +{ "_id" : "57774", "city" : "PROVO", "loc" : [ -103.866588, 43.173599 ], "pop" : 32, "state" : "SD" } +{ "_id" : "57775", "city" : "COTTONWOOD", "loc" : [ -102.069706, 44.07721 ], "pop" : 89, "state" : "SD" } +{ "_id" : "57777", "city" : "REDOWL", "loc" : [ -102.65923, 44.720224 ], "pop" : 16, "state" : "SD" } +{ "_id" : "57778", "city" : "ROCHFORD", "loc" : [ -103.657621, 44.072318 ], "pop" : 251, "state" : "SD" } +{ "_id" : "57779", "city" : "SAINT ONGE", "loc" : [ -103.734426, 44.552225 ], "pop" : 317, "state" : "SD" } +{ "_id" : "57780", "city" : "SCENIC", "loc" : [ -102.535309, 43.799368 ], "pop" : 128, "state" : "SD" } +{ "_id" : "57782", "city" : "SMITHWICK", "loc" : [ -103.198826, 43.26837 ], "pop" : 15, "state" : "SD" } +{ "_id" : "57783", "city" : "SPEARFISH", "loc" : [ -103.864962, 44.494625 ], "pop" : 11088, "state" : "SD" } +{ "_id" : "57785", "city" : "HEREFORD", "loc" : [ -103.477158, 44.413077 ], "pop" : 8209, "state" : "SD" } +{ "_id" : "57787", "city" : "STONEVILLE", "loc" : [ -102.79796, 44.638004 ], "pop" : 204, "state" : "SD" } +{ "_id" : "57788", "city" : "VALE", "loc" : [ -103.379499, 44.622235 ], "pop" : 303, "state" : "SD" } +{ "_id" : "57790", "city" : "WALL", "loc" : [ -102.224546, 43.981232 ], "pop" : 1070, "state" : "SD" } +{ "_id" : "57791", "city" : "WASTA", "loc" : [ -102.347077, 44.093707 ], "pop" : 217, "state" : "SD" } +{ "_id" : "57792", "city" : "WHITE OWL", "loc" : [ -102.445195, 44.618247 ], "pop" : 92, "state" : "SD" } +{ "_id" : "57793", "city" : "WHITEWOOD", "loc" : [ -103.637039, 44.458855 ], "pop" : 1505, "state" : "SD" } +{ "_id" : "57794", "city" : "WOUNDED KNEE", "loc" : [ -102.402157, 43.185194 ], "pop" : 826, "state" : "SD" } +{ "_id" : "57795", "city" : "ZEONA", "loc" : [ -102.7793, 45.251481 ], "pop" : 8, "state" : "SD" } +{ "_id" : "58002", "city" : "ABSARAKA", "loc" : [ -97.388769, 47.014359 ], "pop" : 124, "state" : "ND" } +{ "_id" : "58003", "city" : "ALICE", "loc" : [ -97.531819, 46.768892 ], "pop" : 255, "state" : "ND" } +{ "_id" : "58004", "city" : "AMENIA", "loc" : [ -97.204808, 47.019395 ], "pop" : 321, "state" : "ND" } +{ "_id" : "58005", "city" : "ARGUSVILLE", "loc" : [ -96.905764, 47.10664 ], "pop" : 353, "state" : "ND" } +{ "_id" : "58006", "city" : "ARTHUR", "loc" : [ -97.209737, 47.104774 ], "pop" : 543, "state" : "ND" } +{ "_id" : "58007", "city" : "AYR", "loc" : [ -97.572841, 47.019576 ], "pop" : 187, "state" : "ND" } +{ "_id" : "58008", "city" : "BARNEY", "loc" : [ -96.970772, 46.249621 ], "pop" : 222, "state" : "ND" } +{ "_id" : "58009", "city" : "BLANCHARD", "loc" : [ -97.262079, 47.353664 ], "pop" : 144, "state" : "ND" } +{ "_id" : "58011", "city" : "BUFFALO", "loc" : [ -97.53515899999999, 46.926351 ], "pop" : 281, "state" : "ND" } +{ "_id" : "58012", "city" : "CASSELTON", "loc" : [ -97.213821, 46.899195 ], "pop" : 1838, "state" : "ND" } +{ "_id" : "58013", "city" : "CAYUGA", "loc" : [ -97.405941, 46.132589 ], "pop" : 442, "state" : "ND" } +{ "_id" : "58014", "city" : "CHAFFEE", "loc" : [ -97.357753, 46.766477 ], "pop" : 189, "state" : "ND" } +{ "_id" : "58015", "city" : "CHRISTINE", "loc" : [ -96.790882, 46.552157 ], "pop" : 377, "state" : "ND" } +{ "_id" : "58016", "city" : "CLIFFORD", "loc" : [ -97.409961, 47.356946 ], "pop" : 128, "state" : "ND" } +{ "_id" : "58017", "city" : "BRAMPTON", "loc" : [ -97.80954300000001, 46.089106 ], "pop" : 631, "state" : "ND" } +{ "_id" : "58018", "city" : "COLFAX", "loc" : [ -96.979001, 46.497153 ], "pop" : 414, "state" : "ND" } +{ "_id" : "58021", "city" : "DAVENPORT", "loc" : [ -97.087073, 46.696811 ], "pop" : 349, "state" : "ND" } +{ "_id" : "58027", "city" : "ENDERLIN", "loc" : [ -97.61055399999999, 46.607898 ], "pop" : 1732, "state" : "ND" } +{ "_id" : "58029", "city" : "ERIE", "loc" : [ -97.384851, 47.112803 ], "pop" : 135, "state" : "ND" } +{ "_id" : "58030", "city" : "FAIRMOUNT", "loc" : [ -96.63081099999999, 46.042658 ], "pop" : 780, "state" : "ND" } +{ "_id" : "58031", "city" : "FINGAL", "loc" : [ -97.781198, 46.772754 ], "pop" : 349, "state" : "ND" } +{ "_id" : "58032", "city" : "FORMAN", "loc" : [ -97.698643, 46.072075 ], "pop" : 72, "state" : "ND" } +{ "_id" : "58033", "city" : "ENGLEVALE", "loc" : [ -97.90548200000001, 46.478188 ], "pop" : 764, "state" : "ND" } +{ "_id" : "58035", "city" : "GALESBURG", "loc" : [ -97.374599, 47.27779 ], "pop" : 344, "state" : "ND" } +{ "_id" : "58036", "city" : "GARDNER", "loc" : [ -96.990116, 47.1252 ], "pop" : 200, "state" : "ND" } +{ "_id" : "58038", "city" : "GRANDIN", "loc" : [ -97.02067599999999, 47.215769 ], "pop" : 365, "state" : "ND" } +{ "_id" : "58039", "city" : "GREAT BEND", "loc" : [ -96.817143, 46.154369 ], "pop" : 235, "state" : "ND" } +{ "_id" : "58040", "city" : "CRETE", "loc" : [ -97.86685300000001, 46.230455 ], "pop" : 243, "state" : "ND" } +{ "_id" : "58041", "city" : "HANKINSON", "loc" : [ -96.899069, 46.055797 ], "pop" : 1546, "state" : "ND" } +{ "_id" : "58042", "city" : "PROSPER", "loc" : [ -96.90097299999999, 46.996497 ], "pop" : 1045, "state" : "ND" } +{ "_id" : "58043", "city" : "HAVANA", "loc" : [ -97.60945, 45.964413 ], "pop" : 272, "state" : "ND" } +{ "_id" : "58045", "city" : "KELSO", "loc" : [ -97.05602399999999, 47.394168 ], "pop" : 2398, "state" : "ND" } +{ "_id" : "58046", "city" : "COLGATE", "loc" : [ -97.784865, 47.19995 ], "pop" : 90, "state" : "ND" } +{ "_id" : "58047", "city" : "HICKSON", "loc" : [ -96.860941, 46.739267 ], "pop" : 2056, "state" : "ND" } +{ "_id" : "58048", "city" : "HUNTER", "loc" : [ -97.251648, 47.19132 ], "pop" : 512, "state" : "ND" } +{ "_id" : "58049", "city" : "HASTINGS", "loc" : [ -97.999791, 46.705548 ], "pop" : 355, "state" : "ND" } +{ "_id" : "58051", "city" : "KINDRED", "loc" : [ -97.004919, 46.654296 ], "pop" : 907, "state" : "ND" } +{ "_id" : "58052", "city" : "LEONARD", "loc" : [ -97.272488, 46.659324 ], "pop" : 554, "state" : "ND" } +{ "_id" : "58053", "city" : "GENESEO", "loc" : [ -97.144429, 46.073885 ], "pop" : 1494, "state" : "ND" } +{ "_id" : "58054", "city" : "ELLIOTT", "loc" : [ -97.658895, 46.420133 ], "pop" : 3078, "state" : "ND" } +{ "_id" : "58056", "city" : "LUVERNE", "loc" : [ -97.72962200000001, 47.315052 ], "pop" : 893, "state" : "ND" } +{ "_id" : "58057", "city" : "MCLEOD", "loc" : [ -97.313892, 46.41027 ], "pop" : 70, "state" : "ND" } +{ "_id" : "58058", "city" : "MANTADOR", "loc" : [ -96.957004, 46.159935 ], "pop" : 239, "state" : "ND" } +{ "_id" : "58059", "city" : "DURBIN", "loc" : [ -97.051366, 46.867546 ], "pop" : 1665, "state" : "ND" } +{ "_id" : "58060", "city" : "DELAMERE", "loc" : [ -97.433724, 46.255074 ], "pop" : 927, "state" : "ND" } +{ "_id" : "58061", "city" : "MOORETON", "loc" : [ -96.85072599999999, 46.261537 ], "pop" : 313, "state" : "ND" } +{ "_id" : "58062", "city" : "NOME", "loc" : [ -97.791099, 46.674834 ], "pop" : 284, "state" : "ND" } +{ "_id" : "58063", "city" : "ORISKA", "loc" : [ -97.785331, 46.943251 ], "pop" : 332, "state" : "ND" } +{ "_id" : "58064", "city" : "PAGE", "loc" : [ -97.596665, 47.151512 ], "pop" : 586, "state" : "ND" } +{ "_id" : "58067", "city" : "RUTLAND", "loc" : [ -97.548284, 46.073813 ], "pop" : 1166, "state" : "ND" } +{ "_id" : "58068", "city" : "SHELDON", "loc" : [ -97.454261, 46.554784 ], "pop" : 546, "state" : "ND" } +{ "_id" : "58069", "city" : "STIRUM", "loc" : [ -97.654233, 46.229891 ], "pop" : 776, "state" : "ND" } +{ "_id" : "58071", "city" : "TOWER CITY", "loc" : [ -97.659392, 46.911873 ], "pop" : 417, "state" : "ND" } +{ "_id" : "58072", "city" : "VALLEY CITY", "loc" : [ -98.003316, 46.92681 ], "pop" : 8633, "state" : "ND" } +{ "_id" : "58075", "city" : "DWIGHT", "loc" : [ -96.633934, 46.279842 ], "pop" : 10683, "state" : "ND" } +{ "_id" : "58077", "city" : "WALCOTT", "loc" : [ -97.001442, 46.583529 ], "pop" : 740, "state" : "ND" } +{ "_id" : "58078", "city" : "RIVERSIDE", "loc" : [ -96.89500200000001, 46.869523 ], "pop" : 12422, "state" : "ND" } +{ "_id" : "58079", "city" : "EMBDEN", "loc" : [ -97.391694, 46.875015 ], "pop" : 367, "state" : "ND" } +{ "_id" : "58081", "city" : "WYNDMERE", "loc" : [ -97.128912, 46.289137 ], "pop" : 1127, "state" : "ND" } +{ "_id" : "58102", "city" : "NORTH RIVER", "loc" : [ -96.793577, 46.900878 ], "pop" : 33408, "state" : "ND" } +{ "_id" : "58103", "city" : "FARGO", "loc" : [ -96.812252, 46.856406 ], "pop" : 38483, "state" : "ND" } +{ "_id" : "58104", "city" : "BRIARWOOD", "loc" : [ -96.823846, 46.81492 ], "pop" : 5170, "state" : "ND" } +{ "_id" : "58201", "city" : "GRAND FORKS", "loc" : [ -97.04463, 47.901041 ], "pop" : 31138, "state" : "ND" } +{ "_id" : "58203", "city" : "GRAND FORKS", "loc" : [ -97.067156, 47.927217 ], "pop" : 19056, "state" : "ND" } +{ "_id" : "58205", "city" : "GRAND FORKS", "loc" : [ -97.370802, 47.959499 ], "pop" : 9333, "state" : "ND" } +{ "_id" : "58210", "city" : "ADAMS", "loc" : [ -98.086741, 48.422299 ], "pop" : 312, "state" : "ND" } +{ "_id" : "58212", "city" : "ANETA", "loc" : [ -97.98140600000001, 47.699262 ], "pop" : 426, "state" : "ND" } +{ "_id" : "58213", "city" : "ARDOCH", "loc" : [ -97.253534, 48.226911 ], "pop" : 355, "state" : "ND" } +{ "_id" : "58214", "city" : "ARVILLA", "loc" : [ -97.48712399999999, 47.909292 ], "pop" : 529, "state" : "ND" } +{ "_id" : "58216", "city" : "BATHGATE", "loc" : [ -97.483215, 48.868632 ], "pop" : 169, "state" : "ND" } +{ "_id" : "58218", "city" : "BUXTON", "loc" : [ -97.089259, 47.616314 ], "pop" : 952, "state" : "ND" } +{ "_id" : "58219", "city" : "CALEDONIA", "loc" : [ -96.90847599999999, 47.457645 ], "pop" : 154, "state" : "ND" } +{ "_id" : "58220", "city" : "CONCRETE", "loc" : [ -97.657191, 48.794341 ], "pop" : 2758, "state" : "ND" } +{ "_id" : "58222", "city" : "CRYSTAL", "loc" : [ -97.673846, 48.592387 ], "pop" : 384, "state" : "ND" } +{ "_id" : "58223", "city" : "CUMMINGS", "loc" : [ -96.991287, 47.537023 ], "pop" : 286, "state" : "ND" } +{ "_id" : "58224", "city" : "DAHLEN", "loc" : [ -97.957269, 48.159896 ], "pop" : 103, "state" : "ND" } +{ "_id" : "58225", "city" : "BOWESMONT", "loc" : [ -97.19922200000001, 48.578569 ], "pop" : 1233, "state" : "ND" } +{ "_id" : "58227", "city" : "GARDAR", "loc" : [ -97.89018799999999, 48.490164 ], "pop" : 859, "state" : "ND" } +{ "_id" : "58228", "city" : "EMERADO", "loc" : [ -97.263012, 47.921376 ], "pop" : 1690, "state" : "ND" } +{ "_id" : "58229", "city" : "FAIRDALE", "loc" : [ -98.206587, 48.481924 ], "pop" : 274, "state" : "ND" } +{ "_id" : "58230", "city" : "FINLEY", "loc" : [ -97.744242, 47.530611 ], "pop" : 1403, "state" : "ND" } +{ "_id" : "58231", "city" : "FORDVILLE", "loc" : [ -97.802238, 48.22119 ], "pop" : 377, "state" : "ND" } +{ "_id" : "58233", "city" : "FOREST RIVER", "loc" : [ -97.460476, 48.225094 ], "pop" : 284, "state" : "ND" } +{ "_id" : "58235", "city" : "HONEYFORD", "loc" : [ -97.46329900000001, 48.077082 ], "pop" : 395, "state" : "ND" } +{ "_id" : "58237", "city" : "NASH", "loc" : [ -97.41589500000001, 48.410783 ], "pop" : 6591, "state" : "ND" } +{ "_id" : "58238", "city" : "HAMILTON", "loc" : [ -97.469302, 48.794249 ], "pop" : 135, "state" : "ND" } +{ "_id" : "58239", "city" : "HANNAH", "loc" : [ -98.723693, 48.959446 ], "pop" : 141, "state" : "ND" } +{ "_id" : "58240", "city" : "HATTON", "loc" : [ -97.432548, 47.638012 ], "pop" : 1081, "state" : "ND" } +{ "_id" : "58241", "city" : "HENSEL", "loc" : [ -97.59622299999999, 48.673836 ], "pop" : 121, "state" : "ND" } +{ "_id" : "58243", "city" : "HOOPLE", "loc" : [ -97.61833300000001, 48.51981 ], "pop" : 555, "state" : "ND" } +{ "_id" : "58244", "city" : "ORR", "loc" : [ -97.681302, 48.118654 ], "pop" : 730, "state" : "ND" } +{ "_id" : "58249", "city" : "LANGDON", "loc" : [ -98.35662000000001, 48.786562 ], "pop" : 3701, "state" : "ND" } +{ "_id" : "58250", "city" : "LANKIN", "loc" : [ -98.006997, 48.295233 ], "pop" : 796, "state" : "ND" } +{ "_id" : "58251", "city" : "MCCANNA", "loc" : [ -97.651792, 47.904048 ], "pop" : 2023, "state" : "ND" } +{ "_id" : "58254", "city" : "KLOTEN", "loc" : [ -98.162999, 47.778981 ], "pop" : 925, "state" : "ND" } +{ "_id" : "58255", "city" : "MAIDA", "loc" : [ -98.39482599999999, 48.949043 ], "pop" : 104, "state" : "ND" } +{ "_id" : "58256", "city" : "MANVEL", "loc" : [ -97.194332, 48.085314 ], "pop" : 1033, "state" : "ND" } +{ "_id" : "58257", "city" : "MAYVILLE", "loc" : [ -97.317645, 47.50138 ], "pop" : 2378, "state" : "ND" } +{ "_id" : "58258", "city" : "MEKINOCK", "loc" : [ -97.489593, 47.980909 ], "pop" : 398, "state" : "ND" } +{ "_id" : "58259", "city" : "WHITMAN", "loc" : [ -98.12424300000001, 48.04144 ], "pop" : 624, "state" : "ND" } +{ "_id" : "58260", "city" : "MILTON", "loc" : [ -98.01828500000001, 48.616963 ], "pop" : 248, "state" : "ND" } +{ "_id" : "58261", "city" : "VOSS", "loc" : [ -97.333727, 48.298874 ], "pop" : 851, "state" : "ND" } +{ "_id" : "58262", "city" : "MOUNTAIN", "loc" : [ -97.807569, 48.677341 ], "pop" : 435, "state" : "ND" } +{ "_id" : "58265", "city" : "NECHE", "loc" : [ -97.542687, 48.979567 ], "pop" : 500, "state" : "ND" } +{ "_id" : "58266", "city" : "NIAGARA", "loc" : [ -97.833431, 47.984817 ], "pop" : 164, "state" : "ND" } +{ "_id" : "58267", "city" : "KEMPTON", "loc" : [ -97.56305399999999, 47.741756 ], "pop" : 1910, "state" : "ND" } +{ "_id" : "58269", "city" : "OSNABROCK", "loc" : [ -98.23271, 48.641908 ], "pop" : 620, "state" : "ND" } +{ "_id" : "58270", "city" : "PARK RIVER", "loc" : [ -97.743897, 48.403881 ], "pop" : 2139, "state" : "ND" } +{ "_id" : "58271", "city" : "JOLIETTE", "loc" : [ -97.275611, 48.936124 ], "pop" : 907, "state" : "ND" } +{ "_id" : "58272", "city" : "PETERSBURG", "loc" : [ -97.984033, 47.997973 ], "pop" : 404, "state" : "ND" } +{ "_id" : "58273", "city" : "PISEK", "loc" : [ -97.702894, 48.297096 ], "pop" : 350, "state" : "ND" } +{ "_id" : "58274", "city" : "PORTLAND", "loc" : [ -97.384303, 47.501542 ], "pop" : 887, "state" : "ND" } +{ "_id" : "58275", "city" : "REYNOLDS", "loc" : [ -97.209153, 47.706776 ], "pop" : 470, "state" : "ND" } +{ "_id" : "58276", "city" : "SAINT THOMAS", "loc" : [ -97.454508, 48.625223 ], "pop" : 607, "state" : "ND" } +{ "_id" : "58277", "city" : "SHARON", "loc" : [ -97.905091, 47.606188 ], "pop" : 163, "state" : "ND" } +{ "_id" : "58278", "city" : "THOMPSON", "loc" : [ -97.09620099999999, 47.77658 ], "pop" : 1705, "state" : "ND" } +{ "_id" : "58281", "city" : "WALES", "loc" : [ -98.55964899999999, 48.921647 ], "pop" : 122, "state" : "ND" } +{ "_id" : "58282", "city" : "BACKOO", "loc" : [ -97.881927, 48.91103 ], "pop" : 1759, "state" : "ND" } +{ "_id" : "58301", "city" : "DEVILS LAKE", "loc" : [ -98.861588, 48.113162 ], "pop" : 10324, "state" : "ND" } +{ "_id" : "58311", "city" : "LOMA", "loc" : [ -98.622545, 48.636847 ], "pop" : 272, "state" : "ND" } +{ "_id" : "58315", "city" : "BARTON", "loc" : [ -100.204429, 48.461084 ], "pop" : 140, "state" : "ND" } +{ "_id" : "58316", "city" : "BELCOURT", "loc" : [ -99.768754, 48.837862 ], "pop" : 5415, "state" : "ND" } +{ "_id" : "58317", "city" : "BISBEE", "loc" : [ -99.363592, 48.555196 ], "pop" : 507, "state" : "ND" } +{ "_id" : "58318", "city" : "BOTTINEAU", "loc" : [ -100.432894, 48.845137 ], "pop" : 4356, "state" : "ND" } +{ "_id" : "58319", "city" : "BREMEN", "loc" : [ -99.37156400000001, 47.727212 ], "pop" : 108, "state" : "ND" } +{ "_id" : "58320", "city" : "BRINSMADE", "loc" : [ -99.31238399999999, 48.156805 ], "pop" : 168, "state" : "ND" } +{ "_id" : "58321", "city" : "BROCKET", "loc" : [ -98.35585399999999, 48.225527 ], "pop" : 131, "state" : "ND" } +{ "_id" : "58323", "city" : "CALVIN", "loc" : [ -98.92423599999999, 48.80843 ], "pop" : 117, "state" : "ND" } +{ "_id" : "58324", "city" : "MAZA", "loc" : [ -99.194553, 48.485479 ], "pop" : 1800, "state" : "ND" } +{ "_id" : "58325", "city" : "CHURCHS FERRY", "loc" : [ -99.141187, 48.286206 ], "pop" : 206, "state" : "ND" } +{ "_id" : "58327", "city" : "SOUTHAM", "loc" : [ -98.621236, 48.053028 ], "pop" : 272, "state" : "ND" } +{ "_id" : "58328", "city" : "DOYON", "loc" : [ -98.50675699999999, 48.081067 ], "pop" : 121, "state" : "ND" } +{ "_id" : "58329", "city" : "SAN HAVEN", "loc" : [ -100.031105, 48.84801 ], "pop" : 3092, "state" : "ND" } +{ "_id" : "58330", "city" : "EDMORE", "loc" : [ -98.445756, 48.43084 ], "pop" : 572, "state" : "ND" } +{ "_id" : "58331", "city" : "EGELAND", "loc" : [ -99.111475, 48.635537 ], "pop" : 297, "state" : "ND" } +{ "_id" : "58332", "city" : "FILLMORE", "loc" : [ -99.703388, 48.072022 ], "pop" : 563, "state" : "ND" } +{ "_id" : "58337", "city" : "HAMBERG", "loc" : [ -99.46829700000001, 47.779372 ], "pop" : 213, "state" : "ND" } +{ "_id" : "58338", "city" : "HAMPDEN", "loc" : [ -98.65431599999999, 48.522892 ], "pop" : 148, "state" : "ND" } +{ "_id" : "58339", "city" : "HANSBORO", "loc" : [ -99.383259, 48.86648 ], "pop" : 390, "state" : "ND" } +{ "_id" : "58341", "city" : "MANFRED", "loc" : [ -99.932941, 47.768121 ], "pop" : 2769, "state" : "ND" } +{ "_id" : "58342", "city" : "HEIMDAL", "loc" : [ -99.68914700000001, 47.799918 ], "pop" : 180, "state" : "ND" } +{ "_id" : "58343", "city" : "KNOX", "loc" : [ -99.671274, 48.338812 ], "pop" : 100, "state" : "ND" } +{ "_id" : "58344", "city" : "MAPES", "loc" : [ -98.341548, 48.035714 ], "pop" : 1327, "state" : "ND" } +{ "_id" : "58345", "city" : "LAWTON", "loc" : [ -98.414199, 48.30326 ], "pop" : 178, "state" : "ND" } +{ "_id" : "58346", "city" : "HARLOW", "loc" : [ -99.440123, 48.26681 ], "pop" : 980, "state" : "ND" } +{ "_id" : "58348", "city" : "FLORA", "loc" : [ -99.54306099999999, 47.95074 ], "pop" : 1045, "state" : "ND" } +{ "_id" : "58351", "city" : "MINNEWAUKAN", "loc" : [ -99.274323, 48.069777 ], "pop" : 554, "state" : "ND" } +{ "_id" : "58352", "city" : "CALIO", "loc" : [ -98.842646, 48.654605 ], "pop" : 572, "state" : "ND" } +{ "_id" : "58353", "city" : "MYLO", "loc" : [ -99.63287800000001, 48.635981 ], "pop" : 292, "state" : "ND" } +{ "_id" : "58356", "city" : "BRANTFORD", "loc" : [ -99.078007, 47.679385 ], "pop" : 2309, "state" : "ND" } +{ "_id" : "58357", "city" : "OBERON", "loc" : [ -99.140129, 47.948744 ], "pop" : 556, "state" : "ND" } +{ "_id" : "58360", "city" : "OVERLY", "loc" : [ -100.175958, 48.679029 ], "pop" : 61, "state" : "ND" } +{ "_id" : "58361", "city" : "PEKIN", "loc" : [ -98.326035, 47.769558 ], "pop" : 229, "state" : "ND" } +{ "_id" : "58362", "city" : "PENN", "loc" : [ -99.06550900000001, 48.227106 ], "pop" : 165, "state" : "ND" } +{ "_id" : "58363", "city" : "PERTH", "loc" : [ -99.383076, 48.681601 ], "pop" : 125, "state" : "ND" } +{ "_id" : "58365", "city" : "ROCKLAKE", "loc" : [ -99.17962799999999, 48.821569 ], "pop" : 508, "state" : "ND" } +{ "_id" : "58366", "city" : "NANSON", "loc" : [ -99.874375, 48.655224 ], "pop" : 1125, "state" : "ND" } +{ "_id" : "58367", "city" : "ROLLA", "loc" : [ -99.61338600000001, 48.859423 ], "pop" : 1645, "state" : "ND" } +{ "_id" : "58368", "city" : "PLEASANT LAKE", "loc" : [ -99.998954, 48.317264 ], "pop" : 4592, "state" : "ND" } +{ "_id" : "58369", "city" : "SAINT JOHN", "loc" : [ -99.76476, 48.936588 ], "pop" : 1203, "state" : "ND" } +{ "_id" : "58370", "city" : "SAINT MICHAEL", "loc" : [ -98.918058, 47.977363 ], "pop" : 2860, "state" : "ND" } +{ "_id" : "58372", "city" : "SARLES", "loc" : [ -98.960562, 48.945921 ], "pop" : 172, "state" : "ND" } +{ "_id" : "58374", "city" : "SHEYENNE", "loc" : [ -99.05832599999999, 47.818386 ], "pop" : 551, "state" : "ND" } +{ "_id" : "58377", "city" : "STARKWEATHER", "loc" : [ -98.853903, 48.448802 ], "pop" : 456, "state" : "ND" } +{ "_id" : "58380", "city" : "HAMAR", "loc" : [ -98.475218, 47.802014 ], "pop" : 463, "state" : "ND" } +{ "_id" : "58381", "city" : "WARWICK", "loc" : [ -98.68095599999999, 47.891285 ], "pop" : 195, "state" : "ND" } +{ "_id" : "58382", "city" : "WEBSTER", "loc" : [ -98.87394399999999, 48.322852 ], "pop" : 108, "state" : "ND" } +{ "_id" : "58384", "city" : "WILLOW CITY", "loc" : [ -100.296802, 48.606205 ], "pop" : 453, "state" : "ND" } +{ "_id" : "58385", "city" : "WOLFORD", "loc" : [ -99.662756, 48.480937 ], "pop" : 326, "state" : "ND" } +{ "_id" : "58386", "city" : "BAKER", "loc" : [ -99.550489, 48.321709 ], "pop" : 74, "state" : "ND" } +{ "_id" : "58401", "city" : "ELDRIDGE", "loc" : [ -98.706127, 46.905899 ], "pop" : 18347, "state" : "ND" } +{ "_id" : "58411", "city" : "ALFRED", "loc" : [ -98.914671, 46.58588 ], "pop" : 121, "state" : "ND" } +{ "_id" : "58412", "city" : "ARENA", "loc" : [ -100.17651, 47.134934 ], "pop" : 140, "state" : "ND" } +{ "_id" : "58413", "city" : "ASHLEY", "loc" : [ -99.3164, 46.053677 ], "pop" : 1544, "state" : "ND" } +{ "_id" : "58415", "city" : "BERLIN", "loc" : [ -98.523342, 46.400834 ], "pop" : 185, "state" : "ND" } +{ "_id" : "58416", "city" : "BINFORD", "loc" : [ -98.354625, 47.573899 ], "pop" : 506, "state" : "ND" } +{ "_id" : "58418", "city" : "BOWDON", "loc" : [ -99.701532, 47.434318 ], "pop" : 387, "state" : "ND" } +{ "_id" : "58420", "city" : "BUCHANAN", "loc" : [ -98.81115800000001, 47.040917 ], "pop" : 162, "state" : "ND" } +{ "_id" : "58421", "city" : "BORDULAC", "loc" : [ -99.108226, 47.453918 ], "pop" : 3104, "state" : "ND" } +{ "_id" : "58422", "city" : "EMRICK", "loc" : [ -99.429677, 47.549857 ], "pop" : 115, "state" : "ND" } +{ "_id" : "58423", "city" : "CHASELEY", "loc" : [ -99.824082, 47.449018 ], "pop" : 68, "state" : "ND" } +{ "_id" : "58424", "city" : "WINDSOR", "loc" : [ -99.086596, 46.883242 ], "pop" : 378, "state" : "ND" } +{ "_id" : "58425", "city" : "COOPERSTOWN", "loc" : [ -98.15333200000001, 47.452732 ], "pop" : 2313, "state" : "ND" } +{ "_id" : "58426", "city" : "COURTENAY", "loc" : [ -98.54885, 47.227195 ], "pop" : 166, "state" : "ND" } +{ "_id" : "58428", "city" : "DAWSON", "loc" : [ -99.763544, 46.829612 ], "pop" : 298, "state" : "ND" } +{ "_id" : "58429", "city" : "SIBLEY", "loc" : [ -98.143863, 47.195503 ], "pop" : 376, "state" : "ND" } +{ "_id" : "58430", "city" : "DENHOFF", "loc" : [ -100.263037, 47.570905 ], "pop" : 177, "state" : "ND" } +{ "_id" : "58431", "city" : "DICKEY", "loc" : [ -98.46821199999999, 46.542565 ], "pop" : 211, "state" : "ND" } +{ "_id" : "58432", "city" : "ECKELSON", "loc" : [ -98.366939, 46.916737 ], "pop" : 138, "state" : "ND" } +{ "_id" : "58433", "city" : "MERRICOURT", "loc" : [ -98.70834600000001, 46.324969 ], "pop" : 1364, "state" : "ND" } +{ "_id" : "58436", "city" : "ELLENDALE", "loc" : [ -98.51383, 46.007317 ], "pop" : 2446, "state" : "ND" } +{ "_id" : "58438", "city" : "FESSENDEN", "loc" : [ -99.643361, 47.628644 ], "pop" : 1297, "state" : "ND" } +{ "_id" : "58439", "city" : "FORBES", "loc" : [ -98.812414, 46.010926 ], "pop" : 287, "state" : "ND" } +{ "_id" : "58440", "city" : "FREDONIA", "loc" : [ -99.262818, 46.353456 ], "pop" : 453, "state" : "ND" } +{ "_id" : "58441", "city" : "FULLERTON", "loc" : [ -98.38821900000001, 46.195138 ], "pop" : 375, "state" : "ND" } +{ "_id" : "58442", "city" : "GACKLE", "loc" : [ -99.21905599999999, 46.591263 ], "pop" : 866, "state" : "ND" } +{ "_id" : "58443", "city" : "JUANITA", "loc" : [ -98.663951, 47.443185 ], "pop" : 539, "state" : "ND" } +{ "_id" : "58444", "city" : "GOODRICH", "loc" : [ -100.118979, 47.471048 ], "pop" : 339, "state" : "ND" } +{ "_id" : "58445", "city" : "GRACE CITY", "loc" : [ -98.809465, 47.55358 ], "pop" : 168, "state" : "ND" } +{ "_id" : "58448", "city" : "WALUM", "loc" : [ -98.15718, 47.299693 ], "pop" : 374, "state" : "ND" } +{ "_id" : "58450", "city" : "HEATON", "loc" : [ -99.57848199999999, 47.462249 ], "pop" : 76, "state" : "ND" } +{ "_id" : "58451", "city" : "HURDSFIELD", "loc" : [ -99.94165, 47.438733 ], "pop" : 194, "state" : "ND" } +{ "_id" : "58454", "city" : "NORTONVILLE", "loc" : [ -98.807661, 46.500996 ], "pop" : 575, "state" : "ND" } +{ "_id" : "58455", "city" : "KENSAL", "loc" : [ -98.720579, 47.272609 ], "pop" : 384, "state" : "ND" } +{ "_id" : "58456", "city" : "KULM", "loc" : [ -98.942724, 46.307274 ], "pop" : 634, "state" : "ND" } +{ "_id" : "58458", "city" : "GRAND RAPIDS", "loc" : [ -98.30022, 46.361961 ], "pop" : 1493, "state" : "ND" } +{ "_id" : "58460", "city" : "LEHR", "loc" : [ -99.349136, 46.258638 ], "pop" : 227, "state" : "ND" } +{ "_id" : "58461", "city" : "LITCHVILLE", "loc" : [ -98.20327, 46.688788 ], "pop" : 421, "state" : "ND" } +{ "_id" : "58463", "city" : "MCCLUSKY", "loc" : [ -100.451966, 47.489639 ], "pop" : 1002, "state" : "ND" } +{ "_id" : "58464", "city" : "MCHENRY", "loc" : [ -98.572594, 47.560416 ], "pop" : 172, "state" : "ND" } +{ "_id" : "58465", "city" : "MANFRED", "loc" : [ -99.764369, 47.711663 ], "pop" : 73, "state" : "ND" } +{ "_id" : "58466", "city" : "MARION", "loc" : [ -98.253327, 46.571587 ], "pop" : 723, "state" : "ND" } +{ "_id" : "58467", "city" : "MEDINA", "loc" : [ -99.31055600000001, 46.891951 ], "pop" : 622, "state" : "ND" } +{ "_id" : "58471", "city" : "MONANGO", "loc" : [ -98.57962000000001, 46.193641 ], "pop" : 172, "state" : "ND" } +{ "_id" : "58472", "city" : "ADRIAN", "loc" : [ -98.59764699999999, 46.654218 ], "pop" : 419, "state" : "ND" } +{ "_id" : "58474", "city" : "GUELPH", "loc" : [ -98.099339, 46.128796 ], "pop" : 2569, "state" : "ND" } +{ "_id" : "58475", "city" : "PETTIBONE", "loc" : [ -99.52789199999999, 47.119973 ], "pop" : 163, "state" : "ND" } +{ "_id" : "58476", "city" : "EDMUNDS", "loc" : [ -99.00204100000001, 47.165715 ], "pop" : 624, "state" : "ND" } +{ "_id" : "58477", "city" : "REGAN", "loc" : [ -100.522448, 47.152703 ], "pop" : 274, "state" : "ND" } +{ "_id" : "58478", "city" : "LAKE WILLIAMS", "loc" : [ -99.70030199999999, 47.150765 ], "pop" : 505, "state" : "ND" } +{ "_id" : "58479", "city" : "LEAL", "loc" : [ -98.220885, 47.071086 ], "pop" : 395, "state" : "ND" } +{ "_id" : "58480", "city" : "SANBORN", "loc" : [ -98.233622, 46.927065 ], "pop" : 304, "state" : "ND" } +{ "_id" : "58481", "city" : "SPIRITWOOD", "loc" : [ -98.64846799999999, 47.101601 ], "pop" : 263, "state" : "ND" } +{ "_id" : "58482", "city" : "STEELE", "loc" : [ -99.933559, 46.852357 ], "pop" : 1277, "state" : "ND" } +{ "_id" : "58483", "city" : "STREETER", "loc" : [ -99.29710799999999, 46.694999 ], "pop" : 482, "state" : "ND" } +{ "_id" : "58484", "city" : "SUTTON", "loc" : [ -98.432044, 47.385355 ], "pop" : 110, "state" : "ND" } +{ "_id" : "58486", "city" : "SYKESTON", "loc" : [ -99.39751, 47.436938 ], "pop" : 384, "state" : "ND" } +{ "_id" : "58487", "city" : "TAPPEN", "loc" : [ -99.60189200000001, 46.83362 ], "pop" : 631, "state" : "ND" } +{ "_id" : "58488", "city" : "TUTTLE", "loc" : [ -99.98728699999999, 47.162583 ], "pop" : 458, "state" : "ND" } +{ "_id" : "58489", "city" : "VENTURIA", "loc" : [ -99.494253, 46.037075 ], "pop" : 164, "state" : "ND" } +{ "_id" : "58490", "city" : "VERONA", "loc" : [ -98.089536, 46.371229 ], "pop" : 278, "state" : "ND" } +{ "_id" : "58492", "city" : "WIMBLEDON", "loc" : [ -98.43291600000001, 47.143837 ], "pop" : 530, "state" : "ND" } +{ "_id" : "58494", "city" : "WING", "loc" : [ -100.307159, 47.151939 ], "pop" : 376, "state" : "ND" } +{ "_id" : "58495", "city" : "BURNSTAD", "loc" : [ -99.586005, 46.251617 ], "pop" : 1677, "state" : "ND" } +{ "_id" : "58496", "city" : "WOODWORTH", "loc" : [ -99.34059999999999, 47.163639 ], "pop" : 340, "state" : "ND" } +{ "_id" : "58497", "city" : "YPSILANTI", "loc" : [ -98.48763599999999, 46.771949 ], "pop" : 281, "state" : "ND" } +{ "_id" : "58501", "city" : "BISMARCK", "loc" : [ -100.774755, 46.823448 ], "pop" : 36602, "state" : "ND" } +{ "_id" : "58504", "city" : "LINCOLN", "loc" : [ -100.774411, 46.782463 ], "pop" : 19990, "state" : "ND" } +{ "_id" : "58520", "city" : "ALMONT", "loc" : [ -101.522126, 46.704605 ], "pop" : 309, "state" : "ND" } +{ "_id" : "58521", "city" : "BALDWIN", "loc" : [ -100.761464, 46.954338 ], "pop" : 1218, "state" : "ND" } +{ "_id" : "58523", "city" : "BEULAH", "loc" : [ -101.807468, 47.270664 ], "pop" : 4363, "state" : "ND" } +{ "_id" : "58524", "city" : "BRADDOCK", "loc" : [ -100.241577, 46.549885 ], "pop" : 401, "state" : "ND" } +{ "_id" : "58528", "city" : "CANNON BALL", "loc" : [ -100.59749, 46.387446 ], "pop" : 608, "state" : "ND" } +{ "_id" : "58529", "city" : "CARSON", "loc" : [ -101.538725, 46.462389 ], "pop" : 713, "state" : "ND" } +{ "_id" : "58530", "city" : "FORT CLARK", "loc" : [ -101.328643, 47.121912 ], "pop" : 2381, "state" : "ND" } +{ "_id" : "58531", "city" : "COLEHARBOR", "loc" : [ -101.233198, 47.519559 ], "pop" : 184, "state" : "ND" } +{ "_id" : "58532", "city" : "DRISCOLL", "loc" : [ -100.144063, 46.851139 ], "pop" : 235, "state" : "ND" } +{ "_id" : "58533", "city" : "HEIL", "loc" : [ -101.835145, 46.411346 ], "pop" : 1052, "state" : "ND" } +{ "_id" : "58535", "city" : "LARK", "loc" : [ -101.151681, 46.465133 ], "pop" : 972, "state" : "ND" } +{ "_id" : "58537", "city" : "HUFF", "loc" : [ -100.693909, 46.563172 ], "pop" : 266, "state" : "ND" } +{ "_id" : "58538", "city" : "FORT YATES", "loc" : [ -100.651611, 46.09054 ], "pop" : 2096, "state" : "ND" } +{ "_id" : "58540", "city" : "EMMET", "loc" : [ -101.398325, 47.655219 ], "pop" : 2215, "state" : "ND" } +{ "_id" : "58541", "city" : "GOLDEN VALLEY", "loc" : [ -102.061229, 47.293754 ], "pop" : 315, "state" : "ND" } +{ "_id" : "58542", "city" : "HAGUE", "loc" : [ -99.974507, 46.058896 ], "pop" : 252, "state" : "ND" } +{ "_id" : "58544", "city" : "HAZELTON", "loc" : [ -100.273325, 46.487477 ], "pop" : 323, "state" : "ND" } +{ "_id" : "58545", "city" : "HAZEN", "loc" : [ -101.610695, 47.327138 ], "pop" : 4072, "state" : "ND" } +{ "_id" : "58549", "city" : "KINTYRE", "loc" : [ -99.970462, 46.573573 ], "pop" : 83, "state" : "ND" } +{ "_id" : "58551", "city" : "LEITH", "loc" : [ -101.455531, 46.234873 ], "pop" : 456, "state" : "ND" } +{ "_id" : "58552", "city" : "TEMVIK", "loc" : [ -100.215832, 46.286924 ], "pop" : 2362, "state" : "ND" } +{ "_id" : "58553", "city" : "MCKENZIE", "loc" : [ -100.3995, 46.831062 ], "pop" : 163, "state" : "ND" } +{ "_id" : "58554", "city" : "MANDAN", "loc" : [ -100.909175, 46.830649 ], "pop" : 18098, "state" : "ND" } +{ "_id" : "58558", "city" : "MENOKEN", "loc" : [ -100.527488, 46.861032 ], "pop" : 176, "state" : "ND" } +{ "_id" : "58559", "city" : "MERCER", "loc" : [ -100.717079, 47.485792 ], "pop" : 142, "state" : "ND" } +{ "_id" : "58560", "city" : "MOFFIT", "loc" : [ -100.297538, 46.675725 ], "pop" : 176, "state" : "ND" } +{ "_id" : "58561", "city" : "NAPOLEON", "loc" : [ -99.77253, 46.486724 ], "pop" : 1440, "state" : "ND" } +{ "_id" : "58562", "city" : "BENTLEY", "loc" : [ -101.89369, 46.374448 ], "pop" : 1095, "state" : "ND" } +{ "_id" : "58563", "city" : "HANNOVER", "loc" : [ -101.424453, 46.851248 ], "pop" : 1545, "state" : "ND" } +{ "_id" : "58564", "city" : "RALEIGH", "loc" : [ -101.282651, 46.335236 ], "pop" : 138, "state" : "ND" } +{ "_id" : "58565", "city" : "RIVERDALE", "loc" : [ -101.115061, 47.640333 ], "pop" : 86, "state" : "ND" } +{ "_id" : "58566", "city" : "SAINT ANTHONY", "loc" : [ -100.897237, 46.588831 ], "pop" : 238, "state" : "ND" } +{ "_id" : "58568", "city" : "SELFRIDGE", "loc" : [ -101.150204, 46.035147 ], "pop" : 647, "state" : "ND" } +{ "_id" : "58569", "city" : "SHIELDS", "loc" : [ -101.258894, 46.183772 ], "pop" : 76, "state" : "ND" } +{ "_id" : "58570", "city" : "BREIEN", "loc" : [ -100.81363, 46.294106 ], "pop" : 410, "state" : "ND" } +{ "_id" : "58571", "city" : "STANTON", "loc" : [ -101.38987, 47.312786 ], "pop" : 720, "state" : "ND" } +{ "_id" : "58572", "city" : "STERLING", "loc" : [ -100.274392, 46.843583 ], "pop" : 263, "state" : "ND" } +{ "_id" : "58573", "city" : "STRASBURG", "loc" : [ -100.211869, 46.097938 ], "pop" : 1409, "state" : "ND" } +{ "_id" : "58575", "city" : "TURTLE LAKE", "loc" : [ -100.881364, 47.541416 ], "pop" : 1059, "state" : "ND" } +{ "_id" : "58576", "city" : "UNDERWOOD", "loc" : [ -101.189807, 47.460163 ], "pop" : 1629, "state" : "ND" } +{ "_id" : "58577", "city" : "WASHBURN", "loc" : [ -101.011568, 47.311388 ], "pop" : 2006, "state" : "ND" } +{ "_id" : "58579", "city" : "WILTON", "loc" : [ -100.794385, 47.170853 ], "pop" : 1335, "state" : "ND" } +{ "_id" : "58580", "city" : "ZAP", "loc" : [ -101.925649, 47.289711 ], "pop" : 338, "state" : "ND" } +{ "_id" : "58581", "city" : "ZEELAND", "loc" : [ -99.772543, 46.005476 ], "pop" : 497, "state" : "ND" } +{ "_id" : "58601", "city" : "NEW HRADEC", "loc" : [ -102.787595, 46.887289 ], "pop" : 18751, "state" : "ND" } +{ "_id" : "58620", "city" : "AMIDON", "loc" : [ -103.264741, 46.455951 ], "pop" : 673, "state" : "ND" } +{ "_id" : "58621", "city" : "BEACH", "loc" : [ -103.98429, 46.932381 ], "pop" : 1577, "state" : "ND" } +{ "_id" : "58622", "city" : "FRYBURG", "loc" : [ -103.179515, 46.887728 ], "pop" : 1290, "state" : "ND" } +{ "_id" : "58623", "city" : "BOWMAN", "loc" : [ -103.401965, 46.173316 ], "pop" : 2432, "state" : "ND" } +{ "_id" : "58625", "city" : "DODGE", "loc" : [ -102.198505, 47.304893 ], "pop" : 159, "state" : "ND" } +{ "_id" : "58626", "city" : "DUNN CENTER", "loc" : [ -102.589198, 47.345265 ], "pop" : 276, "state" : "ND" } +{ "_id" : "58627", "city" : "GORHAM", "loc" : [ -103.222328, 47.118004 ], "pop" : 729, "state" : "ND" } +{ "_id" : "58630", "city" : "GLADSTONE", "loc" : [ -102.527379, 46.815162 ], "pop" : 397, "state" : "ND" } +{ "_id" : "58631", "city" : "GLEN ULLIN", "loc" : [ -101.822293, 46.823301 ], "pop" : 1207, "state" : "ND" } +{ "_id" : "58632", "city" : "GOLVA", "loc" : [ -103.957545, 46.7075 ], "pop" : 290, "state" : "ND" } +{ "_id" : "58634", "city" : "GRASSY BUTTE", "loc" : [ -103.294433, 47.443072 ], "pop" : 282, "state" : "ND" } +{ "_id" : "58636", "city" : "WERNER", "loc" : [ -102.319286, 47.367752 ], "pop" : 973, "state" : "ND" } +{ "_id" : "58638", "city" : "HEBRON", "loc" : [ -102.036678, 46.893613 ], "pop" : 1133, "state" : "ND" } +{ "_id" : "58639", "city" : "BUCYRUS", "loc" : [ -102.584516, 46.027869 ], "pop" : 2793, "state" : "ND" } +{ "_id" : "58640", "city" : "KILLDEER", "loc" : [ -102.776242, 47.410898 ], "pop" : 1564, "state" : "ND" } +{ "_id" : "58641", "city" : "LEFOR", "loc" : [ -102.764292, 46.725264 ], "pop" : 601, "state" : "ND" } +{ "_id" : "58642", "city" : "MANNING", "loc" : [ -102.680638, 47.125837 ], "pop" : 733, "state" : "ND" } +{ "_id" : "58643", "city" : "MARMARTH", "loc" : [ -103.88, 46.325396 ], "pop" : 234, "state" : "ND" } +{ "_id" : "58645", "city" : "MEDORA", "loc" : [ -103.421011, 46.845771 ], "pop" : 379, "state" : "ND" } +{ "_id" : "58646", "city" : "BURT", "loc" : [ -102.312935, 46.401095 ], "pop" : 1834, "state" : "ND" } +{ "_id" : "58647", "city" : "NEW ENGLAND", "loc" : [ -102.835816, 46.512841 ], "pop" : 1183, "state" : "ND" } +{ "_id" : "58649", "city" : "REEDER", "loc" : [ -102.940519, 46.111577 ], "pop" : 381, "state" : "ND" } +{ "_id" : "58650", "city" : "REGENT", "loc" : [ -102.568443, 46.423452 ], "pop" : 379, "state" : "ND" } +{ "_id" : "58651", "city" : "RHAME", "loc" : [ -103.70791, 46.166449 ], "pop" : 467, "state" : "ND" } +{ "_id" : "58652", "city" : "RICHARDTON", "loc" : [ -102.292004, 46.842614 ], "pop" : 1091, "state" : "ND" } +{ "_id" : "58653", "city" : "GASCOYNE", "loc" : [ -103.144688, 46.139924 ], "pop" : 697, "state" : "ND" } +{ "_id" : "58654", "city" : "SENTINEL BUTTE", "loc" : [ -103.800113, 46.830475 ], "pop" : 229, "state" : "ND" } +{ "_id" : "58655", "city" : "SOUTH HEART", "loc" : [ -103.016241, 46.812701 ], "pop" : 613, "state" : "ND" } +{ "_id" : "58656", "city" : "TAYLOR", "loc" : [ -102.375626, 46.928372 ], "pop" : 389, "state" : "ND" } +{ "_id" : "58657", "city" : "TROTTERS", "loc" : [ -103.854704, 47.233008 ], "pop" : 12, "state" : "ND" } +{ "_id" : "58701", "city" : "MINOT", "loc" : [ -101.298476, 48.22914 ], "pop" : 42195, "state" : "ND" } +{ "_id" : "58704", "city" : "MINOT AFB", "loc" : [ -101.31678, 48.423217 ], "pop" : 9095, "state" : "ND" } +{ "_id" : "58710", "city" : "ANAMOOSE", "loc" : [ -100.252941, 47.870307 ], "pop" : 595, "state" : "ND" } +{ "_id" : "58711", "city" : "ANTLER", "loc" : [ -101.333758, 48.958525 ], "pop" : 222, "state" : "ND" } +{ "_id" : "58712", "city" : "BALFOUR", "loc" : [ -100.520929, 47.968451 ], "pop" : 82, "state" : "ND" } +{ "_id" : "58713", "city" : "BANTRY", "loc" : [ -100.789445, 48.511875 ], "pop" : 504, "state" : "ND" } +{ "_id" : "58716", "city" : "BENEDICT", "loc" : [ -101.057884, 47.786493 ], "pop" : 149, "state" : "ND" } +{ "_id" : "58718", "city" : "BLAISDELL", "loc" : [ -101.800562, 48.323399 ], "pop" : 677, "state" : "ND" } +{ "_id" : "58721", "city" : "COTEAU", "loc" : [ -102.247271, 48.796803 ], "pop" : 705, "state" : "ND" } +{ "_id" : "58722", "city" : "BURLINGTON", "loc" : [ -101.428205, 48.273534 ], "pop" : 1291, "state" : "ND" } +{ "_id" : "58723", "city" : "BUTTE", "loc" : [ -100.660446, 47.811884 ], "pop" : 241, "state" : "ND" } +{ "_id" : "58725", "city" : "CARPIO", "loc" : [ -101.711943, 48.432299 ], "pop" : 298, "state" : "ND" } +{ "_id" : "58727", "city" : "LARSON", "loc" : [ -102.794848, 48.878875 ], "pop" : 484, "state" : "ND" } +{ "_id" : "58730", "city" : "CROSBY", "loc" : [ -103.274023, 48.883551 ], "pop" : 1881, "state" : "ND" } +{ "_id" : "58731", "city" : "DEERING", "loc" : [ -101.033685, 48.405693 ], "pop" : 200, "state" : "ND" } +{ "_id" : "58733", "city" : "DES LACS", "loc" : [ -101.567167, 48.25569 ], "pop" : 306, "state" : "ND" } +{ "_id" : "58734", "city" : "DONNYBROOK", "loc" : [ -101.896039, 48.490015 ], "pop" : 208, "state" : "ND" } +{ "_id" : "58735", "city" : "DOUGLAS", "loc" : [ -101.511218, 47.865914 ], "pop" : 135, "state" : "ND" } +{ "_id" : "58736", "city" : "DRAKE", "loc" : [ -100.378955, 47.902431 ], "pop" : 577, "state" : "ND" } +{ "_id" : "58737", "city" : "NORTHGATE", "loc" : [ -102.341502, 48.917672 ], "pop" : 240, "state" : "ND" } +{ "_id" : "58738", "city" : "FOXHOLM", "loc" : [ -101.59072, 48.339193 ], "pop" : 88, "state" : "ND" } +{ "_id" : "58739", "city" : "GARDENA", "loc" : [ -100.48429, 48.683566 ], "pop" : 82, "state" : "ND" } +{ "_id" : "58740", "city" : "WOLSETH", "loc" : [ -101.31955, 48.507978 ], "pop" : 783, "state" : "ND" } +{ "_id" : "58741", "city" : "GRANVILLE", "loc" : [ -100.808193, 48.256575 ], "pop" : 679, "state" : "ND" } +{ "_id" : "58744", "city" : "KARLSRUHE", "loc" : [ -100.574158, 48.10085 ], "pop" : 682, "state" : "ND" } +{ "_id" : "58746", "city" : "COULEE", "loc" : [ -102.071745, 48.673149 ], "pop" : 1756, "state" : "ND" } +{ "_id" : "58747", "city" : "KIEF", "loc" : [ -100.52146, 47.818615 ], "pop" : 204, "state" : "ND" } +{ "_id" : "58748", "city" : "KRAMER", "loc" : [ -100.671638, 48.686666 ], "pop" : 145, "state" : "ND" } +{ "_id" : "58750", "city" : "LANSFORD", "loc" : [ -101.385825, 48.625419 ], "pop" : 562, "state" : "ND" } +{ "_id" : "58752", "city" : "LIGNITE", "loc" : [ -102.554177, 48.848113 ], "pop" : 399, "state" : "ND" } +{ "_id" : "58755", "city" : "MCGREGOR", "loc" : [ -102.928795, 48.594983 ], "pop" : 94, "state" : "ND" } +{ "_id" : "58756", "city" : "MAKOTI", "loc" : [ -101.814942, 47.985283 ], "pop" : 247, "state" : "ND" } +{ "_id" : "58757", "city" : "MANDAREE", "loc" : [ -102.653473, 47.856744 ], "pop" : 886, "state" : "ND" } +{ "_id" : "58758", "city" : "MARTIN", "loc" : [ -100.122517, 47.778144 ], "pop" : 279, "state" : "ND" } +{ "_id" : "58759", "city" : "MAX", "loc" : [ -101.293166, 47.815577 ], "pop" : 472, "state" : "ND" } +{ "_id" : "58760", "city" : "MAXBASS", "loc" : [ -101.256328, 48.772163 ], "pop" : 404, "state" : "ND" } +{ "_id" : "58761", "city" : "LORAINE", "loc" : [ -101.554512, 48.765814 ], "pop" : 1455, "state" : "ND" } +{ "_id" : "58762", "city" : "NEWBURG", "loc" : [ -100.968056, 48.698192 ], "pop" : 516, "state" : "ND" } +{ "_id" : "58763", "city" : "CHARLSON", "loc" : [ -102.485793, 47.977154 ], "pop" : 2033, "state" : "ND" } +{ "_id" : "58765", "city" : "NOONAN", "loc" : [ -103.009793, 48.885635 ], "pop" : 326, "state" : "ND" } +{ "_id" : "58768", "city" : "NORWICH", "loc" : [ -100.971165, 48.249115 ], "pop" : 167, "state" : "ND" } +{ "_id" : "58769", "city" : "PALERMO", "loc" : [ -102.239954, 48.3396 ], "pop" : 133, "state" : "ND" } +{ "_id" : "58770", "city" : "PARSHALL", "loc" : [ -102.142732, 47.95597 ], "pop" : 1425, "state" : "ND" } +{ "_id" : "58771", "city" : "PLAZA", "loc" : [ -101.964276, 48.02421 ], "pop" : 309, "state" : "ND" } +{ "_id" : "58772", "city" : "PORTAL", "loc" : [ -102.548023, 48.975818 ], "pop" : 286, "state" : "ND" } +{ "_id" : "58773", "city" : "BATTLEVIEW", "loc" : [ -102.644646, 48.589815 ], "pop" : 888, "state" : "ND" } +{ "_id" : "58775", "city" : "ROSEGLEN", "loc" : [ -101.822041, 47.695967 ], "pop" : 1178, "state" : "ND" } +{ "_id" : "58776", "city" : "ROSS", "loc" : [ -102.530721, 48.316159 ], "pop" : 104, "state" : "ND" } +{ "_id" : "58778", "city" : "RUSO", "loc" : [ -100.875432, 47.762224 ], "pop" : 187, "state" : "ND" } +{ "_id" : "58779", "city" : "RAUB", "loc" : [ -101.765095, 47.868017 ], "pop" : 320, "state" : "ND" } +{ "_id" : "58781", "city" : "SAWYER", "loc" : [ -101.067396, 48.085837 ], "pop" : 493, "state" : "ND" } +{ "_id" : "58782", "city" : "SHERWOOD", "loc" : [ -101.697024, 48.957551 ], "pop" : 487, "state" : "ND" } +{ "_id" : "58783", "city" : "CARBURY", "loc" : [ -100.741324, 48.937378 ], "pop" : 443, "state" : "ND" } +{ "_id" : "58784", "city" : "BELDEN", "loc" : [ -102.392802, 48.319189 ], "pop" : 2711, "state" : "ND" } +{ "_id" : "58785", "city" : "SURREY", "loc" : [ -101.121617, 48.236472 ], "pop" : 1109, "state" : "ND" } +{ "_id" : "58787", "city" : "TOLLEY", "loc" : [ -101.855891, 48.796903 ], "pop" : 270, "state" : "ND" } +{ "_id" : "58788", "city" : "BERWICK", "loc" : [ -100.412322, 48.377657 ], "pop" : 1251, "state" : "ND" } +{ "_id" : "58789", "city" : "UPHAM", "loc" : [ -100.732314, 48.581632 ], "pop" : 285, "state" : "ND" } +{ "_id" : "58790", "city" : "VELVA", "loc" : [ -100.934623, 48.06748 ], "pop" : 1241, "state" : "ND" } +{ "_id" : "58792", "city" : "BERGEN", "loc" : [ -100.803824, 47.951793 ], "pop" : 418, "state" : "ND" } +{ "_id" : "58793", "city" : "WESTHOPE", "loc" : [ -101.033809, 48.905074 ], "pop" : 855, "state" : "ND" } +{ "_id" : "58794", "city" : "WHITE EARTH", "loc" : [ -102.806672, 48.430748 ], "pop" : 172, "state" : "ND" } +{ "_id" : "58795", "city" : "HAMLET", "loc" : [ -103.184878, 48.621929 ], "pop" : 238, "state" : "ND" } +{ "_id" : "58801", "city" : "BONETRAILL", "loc" : [ -103.631699, 48.167924 ], "pop" : 16473, "state" : "ND" } +{ "_id" : "58830", "city" : "APPAM", "loc" : [ -103.422154, 48.585803 ], "pop" : 116, "state" : "ND" } +{ "_id" : "58831", "city" : "RAWSON", "loc" : [ -103.63961, 47.843517 ], "pop" : 535, "state" : "ND" } +{ "_id" : "58833", "city" : "AMBROSE", "loc" : [ -103.700676, 48.817195 ], "pop" : 569, "state" : "ND" } +{ "_id" : "58835", "city" : "ARNEGARD", "loc" : [ -103.453837, 47.808832 ], "pop" : 190, "state" : "ND" } +{ "_id" : "58838", "city" : "CARTWRIGHT", "loc" : [ -103.948718, 47.79922 ], "pop" : 944, "state" : "ND" } +{ "_id" : "58843", "city" : "SPRINGBROOK", "loc" : [ -103.372462, 48.260088 ], "pop" : 195, "state" : "ND" } +{ "_id" : "58844", "city" : "COLGAN", "loc" : [ -103.828955, 48.924646 ], "pop" : 123, "state" : "ND" } +{ "_id" : "58845", "city" : "ALKABO", "loc" : [ -103.929128, 48.613946 ], "pop" : 313, "state" : "ND" } +{ "_id" : "58847", "city" : "KEENE", "loc" : [ -102.890567, 47.940516 ], "pop" : 358, "state" : "ND" } +{ "_id" : "58849", "city" : "WHEELOCK", "loc" : [ -103.18365, 48.3323 ], "pop" : 816, "state" : "ND" } +{ "_id" : "58852", "city" : "TEMPLE", "loc" : [ -102.961281, 48.392009 ], "pop" : 1984, "state" : "ND" } +{ "_id" : "58853", "city" : "TRENTON", "loc" : [ -103.861276, 48.056303 ], "pop" : 806, "state" : "ND" } +{ "_id" : "58854", "city" : "WATFORD CITY", "loc" : [ -103.258205, 47.804258 ], "pop" : 3188, "state" : "ND" } +{ "_id" : "58856", "city" : "ZAHL", "loc" : [ -103.659926, 48.578747 ], "pop" : 94, "state" : "ND" } +{ "_id" : "59001", "city" : "ABSAROKEE", "loc" : [ -109.469171, 45.515356 ], "pop" : 1330, "state" : "MT" } +{ "_id" : "59002", "city" : "ACTON", "loc" : [ -108.680975, 45.936997 ], "pop" : 55, "state" : "MT" } +{ "_id" : "59003", "city" : "ASHLAND", "loc" : [ -106.279722, 45.58275 ], "pop" : 353, "state" : "MT" } +{ "_id" : "59006", "city" : "BALLANTINE", "loc" : [ -108.123133, 45.954699 ], "pop" : 730, "state" : "MT" } +{ "_id" : "59007", "city" : "BEARCREEK", "loc" : [ -109.044704, 45.15226 ], "pop" : 312, "state" : "MT" } +{ "_id" : "59008", "city" : "BELFRY", "loc" : [ -109.078777, 45.049827 ], "pop" : 64, "state" : "MT" } +{ "_id" : "59010", "city" : "BIGHORN", "loc" : [ -107.205942, 46.238286 ], "pop" : 573, "state" : "MT" } +{ "_id" : "59011", "city" : "BIG TIMBER", "loc" : [ -109.963094, 45.82827 ], "pop" : 2296, "state" : "MT" } +{ "_id" : "59012", "city" : "BIRNEY", "loc" : [ -106.509496, 45.286204 ], "pop" : 138, "state" : "MT" } +{ "_id" : "59014", "city" : "BRIDGER", "loc" : [ -108.908217, 45.285682 ], "pop" : 1524, "state" : "MT" } +{ "_id" : "59015", "city" : "BROADVIEW", "loc" : [ -108.809062, 46.082101 ], "pop" : 303, "state" : "MT" } +{ "_id" : "59016", "city" : "BUSBY", "loc" : [ -106.872311, 45.554139 ], "pop" : 1077, "state" : "MT" } +{ "_id" : "59017", "city" : "CAT CREEK", "loc" : [ -108.259094, 47.154789 ], "pop" : 155, "state" : "MT" } +{ "_id" : "59019", "city" : "COLUMBUS", "loc" : [ -109.257126, 45.626171 ], "pop" : 2438, "state" : "MT" } +{ "_id" : "59022", "city" : "CROW AGENCY", "loc" : [ -107.497251, 45.629594 ], "pop" : 2267, "state" : "MT" } +{ "_id" : "59024", "city" : "CUSTER", "loc" : [ -107.59585, 46.13019 ], "pop" : 304, "state" : "MT" } +{ "_id" : "59025", "city" : "DECKER", "loc" : [ -106.87206, 45.179698 ], "pop" : 164, "state" : "MT" } +{ "_id" : "59027", "city" : "EMIGRANT", "loc" : [ -110.798928, 45.127557 ], "pop" : 2058, "state" : "MT" } +{ "_id" : "59028", "city" : "FISHTAIL", "loc" : [ -109.582078, 45.400217 ], "pop" : 348, "state" : "MT" } +{ "_id" : "59029", "city" : "FROMBERG", "loc" : [ -108.905658, 45.40269 ], "pop" : 627, "state" : "MT" } +{ "_id" : "59030", "city" : "GARDINER", "loc" : [ -110.196258, 45.0493 ], "pop" : 168, "state" : "MT" } +{ "_id" : "59031", "city" : "GARRYOWEN", "loc" : [ -107.364925, 45.508557 ], "pop" : 428, "state" : "MT" } +{ "_id" : "59032", "city" : "GRASS RANGE", "loc" : [ -108.827059, 47.025894 ], "pop" : 494, "state" : "MT" } +{ "_id" : "59033", "city" : "GREYCLIFF", "loc" : [ -109.674601, 45.792631 ], "pop" : 216, "state" : "MT" } +{ "_id" : "59034", "city" : "HARDIN", "loc" : [ -107.607457, 45.749843 ], "pop" : 3889, "state" : "MT" } +{ "_id" : "59037", "city" : "HUNTLEY", "loc" : [ -108.284981, 45.89049 ], "pop" : 1006, "state" : "MT" } +{ "_id" : "59038", "city" : "HYSHAM", "loc" : [ -107.307196, 46.276483 ], "pop" : 301, "state" : "MT" } +{ "_id" : "59039", "city" : "INGOMAR", "loc" : [ -107.551749, 46.654196 ], "pop" : 118, "state" : "MT" } +{ "_id" : "59041", "city" : "SILESIA", "loc" : [ -108.94804, 45.498763 ], "pop" : 1739, "state" : "MT" } +{ "_id" : "59043", "city" : "LAME DEER", "loc" : [ -106.565424, 45.603167 ], "pop" : 2846, "state" : "MT" } +{ "_id" : "59044", "city" : "LAUREL", "loc" : [ -108.769008, 45.67451 ], "pop" : 8328, "state" : "MT" } +{ "_id" : "59046", "city" : "LAVINA", "loc" : [ -108.995853, 46.329058 ], "pop" : 410, "state" : "MT" } +{ "_id" : "59047", "city" : "LIVINGSTON", "loc" : [ -110.560907, 45.654587 ], "pop" : 9980, "state" : "MT" } +{ "_id" : "59050", "city" : "LODGE GRASS", "loc" : [ -107.734105, 45.33218 ], "pop" : 2938, "state" : "MT" } +{ "_id" : "59051", "city" : "LUTHER", "loc" : [ -109.475326, 45.279485 ], "pop" : 11, "state" : "MT" } +{ "_id" : "59052", "city" : "MC LEOD", "loc" : [ -109.935698, 45.596334 ], "pop" : 226, "state" : "MT" } +{ "_id" : "59053", "city" : "MARTINSDALE", "loc" : [ -110.432397, 46.458149 ], "pop" : 246, "state" : "MT" } +{ "_id" : "59055", "city" : "MELVILLE", "loc" : [ -109.880885, 46.036446 ], "pop" : 416, "state" : "MT" } +{ "_id" : "59057", "city" : "MOLT", "loc" : [ -108.973073, 45.861503 ], "pop" : 524, "state" : "MT" } +{ "_id" : "59058", "city" : "MOSBY", "loc" : [ -107.789149, 46.900453 ], "pop" : 7, "state" : "MT" } +{ "_id" : "59059", "city" : "MUSSELSHELL", "loc" : [ -108.003122, 46.517125 ], "pop" : 584, "state" : "MT" } +{ "_id" : "59061", "city" : "NYE", "loc" : [ -109.827137, 45.441022 ], "pop" : 236, "state" : "MT" } +{ "_id" : "59062", "city" : "OTTER", "loc" : [ -106.008667, 45.445803 ], "pop" : 404, "state" : "MT" } +{ "_id" : "59063", "city" : "PARK CITY", "loc" : [ -108.929279, 45.632864 ], "pop" : 1398, "state" : "MT" } +{ "_id" : "59064", "city" : "POMPEYS PILLAR", "loc" : [ -107.915406, 45.983847 ], "pop" : 207, "state" : "MT" } +{ "_id" : "59065", "city" : "PRAY", "loc" : [ -110.686399, 45.419315 ], "pop" : 1094, "state" : "MT" } +{ "_id" : "59067", "city" : "RAPELJE", "loc" : [ -109.276093, 45.97948 ], "pop" : 219, "state" : "MT" } +{ "_id" : "59068", "city" : "RED LODGE", "loc" : [ -109.268812, 45.196522 ], "pop" : 2875, "state" : "MT" } +{ "_id" : "59069", "city" : "REEDPOINT", "loc" : [ -109.468889, 45.648462 ], "pop" : 301, "state" : "MT" } +{ "_id" : "59070", "city" : "ROBERTS", "loc" : [ -109.176888, 45.367235 ], "pop" : 652, "state" : "MT" } +{ "_id" : "59071", "city" : "ROSCOE", "loc" : [ -109.44644, 45.377232 ], "pop" : 159, "state" : "MT" } +{ "_id" : "59072", "city" : "ROUNDUP", "loc" : [ -108.543846, 46.422487 ], "pop" : 3522, "state" : "MT" } +{ "_id" : "59074", "city" : "RYEGATE", "loc" : [ -109.276121, 46.272367 ], "pop" : 502, "state" : "MT" } +{ "_id" : "59075", "city" : "SAINT XAVIER", "loc" : [ -107.709242, 45.488996 ], "pop" : 199, "state" : "MT" } +{ "_id" : "59077", "city" : "SAND SPRINGS", "loc" : [ -107.288623, 47.032287 ], "pop" : 95, "state" : "MT" } +{ "_id" : "59078", "city" : "SHAWMUT", "loc" : [ -109.597361, 46.386921 ], "pop" : 249, "state" : "MT" } +{ "_id" : "59079", "city" : "SHEPHERD", "loc" : [ -108.342634, 45.94608 ], "pop" : 2078, "state" : "MT" } +{ "_id" : "59085", "city" : "TWODOT", "loc" : [ -109.899483, 46.446513 ], "pop" : 1694, "state" : "MT" } +{ "_id" : "59086", "city" : "WILSALL", "loc" : [ -110.606147, 45.948351 ], "pop" : 1293, "state" : "MT" } +{ "_id" : "59087", "city" : "WINNETT", "loc" : [ -108.318373, 46.943788 ], "pop" : 364, "state" : "MT" } +{ "_id" : "59088", "city" : "WORDEN", "loc" : [ -108.153284, 45.977937 ], "pop" : 1025, "state" : "MT" } +{ "_id" : "59089", "city" : "WYOLA", "loc" : [ -107.430258, 45.108904 ], "pop" : 375, "state" : "MT" } +{ "_id" : "59101", "city" : "BILLINGS", "loc" : [ -108.500452, 45.774489 ], "pop" : 33061, "state" : "MT" } +{ "_id" : "59102", "city" : "BILLINGS", "loc" : [ -108.572662, 45.781265 ], "pop" : 40121, "state" : "MT" } +{ "_id" : "59105", "city" : "BILLINGS HEIGHTS", "loc" : [ -108.474726, 45.828443 ], "pop" : 20320, "state" : "MT" } +{ "_id" : "59106", "city" : "BILLINGS", "loc" : [ -108.65191, 45.775306 ], "pop" : 5623, "state" : "MT" } +{ "_id" : "59201", "city" : "WOLF POINT", "loc" : [ -105.629318, 48.111879 ], "pop" : 4845, "state" : "MT" } +{ "_id" : "59211", "city" : "ANTELOPE", "loc" : [ -104.452883, 48.696813 ], "pop" : 152, "state" : "MT" } +{ "_id" : "59212", "city" : "BAINVILLE", "loc" : [ -104.199532, 48.157989 ], "pop" : 354, "state" : "MT" } +{ "_id" : "59213", "city" : "BROCKTON", "loc" : [ -104.85479, 48.210063 ], "pop" : 959, "state" : "MT" } +{ "_id" : "59214", "city" : "BROCKWAY", "loc" : [ -105.777649, 47.248497 ], "pop" : 233, "state" : "MT" } +{ "_id" : "59215", "city" : "CIRCLE", "loc" : [ -105.614771, 47.426389 ], "pop" : 1271, "state" : "MT" } +{ "_id" : "59218", "city" : "CULBERTSON", "loc" : [ -104.513212, 48.149536 ], "pop" : 949, "state" : "MT" } +{ "_id" : "59219", "city" : "DAGMAR", "loc" : [ -104.240123, 48.609337 ], "pop" : 317, "state" : "MT" } +{ "_id" : "59221", "city" : "FAIRVIEW", "loc" : [ -104.230194, 47.891598 ], "pop" : 1668, "state" : "MT" } +{ "_id" : "59222", "city" : "FLAXVILLE", "loc" : [ -105.163746, 48.747222 ], "pop" : 312, "state" : "MT" } +{ "_id" : "59223", "city" : "FORT PECK", "loc" : [ -106.516646, 48.053844 ], "pop" : 714, "state" : "MT" } +{ "_id" : "59225", "city" : "LUSTRE", "loc" : [ -105.991929, 48.161166 ], "pop" : 819, "state" : "MT" } +{ "_id" : "59226", "city" : "FROID", "loc" : [ -104.451765, 48.320113 ], "pop" : 479, "state" : "MT" } +{ "_id" : "59230", "city" : "GLASGOW", "loc" : [ -106.609419, 48.203385 ], "pop" : 5192, "state" : "MT" } +{ "_id" : "59241", "city" : "HINSDALE", "loc" : [ -107.009836, 48.400705 ], "pop" : 704, "state" : "MT" } +{ "_id" : "59242", "city" : "HOMESTEAD", "loc" : [ -104.591805, 48.429616 ], "pop" : 7, "state" : "MT" } +{ "_id" : "59243", "city" : "LAMBERT", "loc" : [ -104.598746, 47.745908 ], "pop" : 655, "state" : "MT" } +{ "_id" : "59244", "city" : "LARSLAN", "loc" : [ -106.283503, 48.58218 ], "pop" : 120, "state" : "MT" } +{ "_id" : "59247", "city" : "MEDICINE LAKE", "loc" : [ -104.437545, 48.485179 ], "pop" : 629, "state" : "MT" } +{ "_id" : "59248", "city" : "NASHUA", "loc" : [ -106.24407, 48.18653 ], "pop" : 206, "state" : "MT" } +{ "_id" : "59250", "city" : "OPHEIM", "loc" : [ -106.365832, 48.87016 ], "pop" : 322, "state" : "MT" } +{ "_id" : "59252", "city" : "OUTLOOK", "loc" : [ -104.741526, 48.881673 ], "pop" : 241, "state" : "MT" } +{ "_id" : "59253", "city" : "PEERLESS", "loc" : [ -105.800567, 48.780767 ], "pop" : 395, "state" : "MT" } +{ "_id" : "59254", "city" : "PLENTYWOOD", "loc" : [ -104.560032, 48.778825 ], "pop" : 2557, "state" : "MT" } +{ "_id" : "59255", "city" : "POPLAR", "loc" : [ -105.187021, 48.130713 ], "pop" : 3407, "state" : "MT" } +{ "_id" : "59256", "city" : "RAYMOND", "loc" : [ -104.629763, 48.968612 ], "pop" : 29, "state" : "MT" } +{ "_id" : "59257", "city" : "REDSTONE", "loc" : [ -104.935259, 48.835511 ], "pop" : 158, "state" : "MT" } +{ "_id" : "59258", "city" : "RESERVE", "loc" : [ -104.627875, 48.590519 ], "pop" : 127, "state" : "MT" } +{ "_id" : "59259", "city" : "RICHEY", "loc" : [ -105.017017, 47.622874 ], "pop" : 462, "state" : "MT" } +{ "_id" : "59260", "city" : "RICHLAND", "loc" : [ -106.223696, 48.727326 ], "pop" : 162, "state" : "MT" } +{ "_id" : "59261", "city" : "SACO", "loc" : [ -107.429324, 48.638938 ], "pop" : 178, "state" : "MT" } +{ "_id" : "59262", "city" : "SAVAGE", "loc" : [ -104.284487, 47.519375 ], "pop" : 1170, "state" : "MT" } +{ "_id" : "59263", "city" : "SCOBEY", "loc" : [ -105.417016, 48.785356 ], "pop" : 1415, "state" : "MT" } +{ "_id" : "59270", "city" : "SIDNEY", "loc" : [ -104.163445, 47.713017 ], "pop" : 7229, "state" : "MT" } +{ "_id" : "59274", "city" : "VIDA", "loc" : [ -105.599595, 47.894727 ], "pop" : 772, "state" : "MT" } +{ "_id" : "59275", "city" : "WESTBY", "loc" : [ -104.124708, 48.858695 ], "pop" : 515, "state" : "MT" } +{ "_id" : "59276", "city" : "WHITETAIL", "loc" : [ -105.297667, 48.924968 ], "pop" : 144, "state" : "MT" } +{ "_id" : "59301", "city" : "MILES CITY", "loc" : [ -105.833193, 46.407459 ], "pop" : 10604, "state" : "MT" } +{ "_id" : "59311", "city" : "ALZADA", "loc" : [ -104.261747, 45.156244 ], "pop" : 101, "state" : "MT" } +{ "_id" : "59312", "city" : "ANGELA", "loc" : [ -106.315732, 46.771929 ], "pop" : 35, "state" : "MT" } +{ "_id" : "59313", "city" : "BAKER", "loc" : [ -104.266707, 46.355219 ], "pop" : 2631, "state" : "MT" } +{ "_id" : "59314", "city" : "BIDDLE", "loc" : [ -105.290138, 45.256977 ], "pop" : 606, "state" : "MT" } +{ "_id" : "59315", "city" : "BLOOMFIELD", "loc" : [ -104.878235, 47.340813 ], "pop" : 569, "state" : "MT" } +{ "_id" : "59316", "city" : "BOYES", "loc" : [ -104.884118, 45.490003 ], "pop" : 90, "state" : "MT" } +{ "_id" : "59317", "city" : "BELLE CREEK", "loc" : [ -105.424968, 45.46057 ], "pop" : 946, "state" : "MT" } +{ "_id" : "59318", "city" : "BRUSETT", "loc" : [ -107.599864, 47.342341 ], "pop" : 229, "state" : "MT" } +{ "_id" : "59319", "city" : "CAPITOL", "loc" : [ -104.146212, 45.473162 ], "pop" : 73, "state" : "MT" } +{ "_id" : "59322", "city" : "COHAGEN", "loc" : [ -106.498065, 47.126296 ], "pop" : 372, "state" : "MT" } +{ "_id" : "59324", "city" : "EKALAKA", "loc" : [ -104.503958, 45.88054 ], "pop" : 881, "state" : "MT" } +{ "_id" : "59326", "city" : "FALLON", "loc" : [ -105.116055, 46.786632 ], "pop" : 388, "state" : "MT" } +{ "_id" : "59327", "city" : "FORSYTH", "loc" : [ -106.699086, 46.2819 ], "pop" : 3148, "state" : "MT" } +{ "_id" : "59330", "city" : "GLENDIVE", "loc" : [ -104.728716, 47.100813 ], "pop" : 8364, "state" : "MT" } +{ "_id" : "59332", "city" : "HAMMOND", "loc" : [ -104.615444, 45.291872 ], "pop" : 358, "state" : "MT" } +{ "_id" : "59336", "city" : "ISMAY", "loc" : [ -105.209064, 46.413223 ], "pop" : 317, "state" : "MT" } +{ "_id" : "59337", "city" : "JORDAN", "loc" : [ -106.922076, 47.369419 ], "pop" : 886, "state" : "MT" } +{ "_id" : "59338", "city" : "KINSEY", "loc" : [ -105.74458, 46.577008 ], "pop" : 346, "state" : "MT" } +{ "_id" : "59339", "city" : "LINDSAY", "loc" : [ -105.208878, 47.202383 ], "pop" : 110, "state" : "MT" } +{ "_id" : "59341", "city" : "MILDRED", "loc" : [ -104.7891, 46.751671 ], "pop" : 83, "state" : "MT" } +{ "_id" : "59343", "city" : "OLIVE", "loc" : [ -105.668741, 45.546641 ], "pop" : 59, "state" : "MT" } +{ "_id" : "59344", "city" : "PLEVNA", "loc" : [ -104.571289, 46.411225 ], "pop" : 433, "state" : "MT" } +{ "_id" : "59345", "city" : "POWDERVILLE", "loc" : [ -105.276098, 45.739183 ], "pop" : 24, "state" : "MT" } +{ "_id" : "59347", "city" : "ROSEBUD", "loc" : [ -106.598123, 45.935826 ], "pop" : 3867, "state" : "MT" } +{ "_id" : "59349", "city" : "TERRY", "loc" : [ -105.37059, 46.828972 ], "pop" : 912, "state" : "MT" } +{ "_id" : "59351", "city" : "VOLBORG", "loc" : [ -105.721444, 46.073609 ], "pop" : 481, "state" : "MT" } +{ "_id" : "59353", "city" : "WIBAUX", "loc" : [ -104.189715, 46.964596 ], "pop" : 1191, "state" : "MT" } +{ "_id" : "59354", "city" : "WILLARD", "loc" : [ -104.446662, 46.114064 ], "pop" : 39, "state" : "MT" } +{ "_id" : "59401", "city" : "GREAT FALLS", "loc" : [ -111.273397, 47.509812 ], "pop" : 13361, "state" : "MT" } +{ "_id" : "59404", "city" : "GREAT FALLS", "loc" : [ -111.340496, 47.509755 ], "pop" : 23133, "state" : "MT" } +{ "_id" : "59405", "city" : "GREAT FALLS", "loc" : [ -111.250227, 47.495016 ], "pop" : 32774, "state" : "MT" } +{ "_id" : "59410", "city" : "AUGUSTA", "loc" : [ -112.388304, 47.453739 ], "pop" : 839, "state" : "MT" } +{ "_id" : "59411", "city" : "BABB", "loc" : [ -113.368132, 48.878781 ], "pop" : 224, "state" : "MT" } +{ "_id" : "59412", "city" : "BELT", "loc" : [ -110.908099, 47.38211 ], "pop" : 1383, "state" : "MT" } +{ "_id" : "59414", "city" : "BLACK EAGLE", "loc" : [ -111.276366, 47.526197 ], "pop" : 927, "state" : "MT" } +{ "_id" : "59416", "city" : "BRADY", "loc" : [ -111.755013, 48.031244 ], "pop" : 334, "state" : "MT" } +{ "_id" : "59417", "city" : "SAINT MARY", "loc" : [ -113.019697, 48.54926 ], "pop" : 6712, "state" : "MT" } +{ "_id" : "59418", "city" : "BUFFALO", "loc" : [ -109.723122, 46.805593 ], "pop" : 105, "state" : "MT" } +{ "_id" : "59419", "city" : "BYNUM", "loc" : [ -112.276177, 47.990017 ], "pop" : 130, "state" : "MT" } +{ "_id" : "59420", "city" : "CARTER", "loc" : [ -110.978593, 47.780964 ], "pop" : 99, "state" : "MT" } +{ "_id" : "59421", "city" : "CASCADE", "loc" : [ -111.722321, 47.29117 ], "pop" : 2050, "state" : "MT" } +{ "_id" : "59422", "city" : "CHOTEAU", "loc" : [ -112.202136, 47.837951 ], "pop" : 2846, "state" : "MT" } +{ "_id" : "59424", "city" : "COFFEE CREEK", "loc" : [ -110.052784, 47.339642 ], "pop" : 175, "state" : "MT" } +{ "_id" : "59425", "city" : "CONRAD", "loc" : [ -111.939665, 48.178346 ], "pop" : 3843, "state" : "MT" } +{ "_id" : "59427", "city" : "CUT BANK", "loc" : [ -112.365354, 48.660284 ], "pop" : 5249, "state" : "MT" } +{ "_id" : "59430", "city" : "DENTON", "loc" : [ -109.878877, 47.319081 ], "pop" : 604, "state" : "MT" } +{ "_id" : "59433", "city" : "DUTTON", "loc" : [ -111.689967, 47.860082 ], "pop" : 710, "state" : "MT" } +{ "_id" : "59434", "city" : "EAST GLACIER PAR", "loc" : [ -113.317304, 48.45998 ], "pop" : 35, "state" : "MT" } +{ "_id" : "59436", "city" : "FAIRFIELD", "loc" : [ -112.001502, 47.614255 ], "pop" : 1598, "state" : "MT" } +{ "_id" : "59440", "city" : "FLOWEREE", "loc" : [ -111.121384, 47.658441 ], "pop" : 188, "state" : "MT" } +{ "_id" : "59441", "city" : "FORESTGROVE", "loc" : [ -109.023294, 46.913727 ], "pop" : 143, "state" : "MT" } +{ "_id" : "59442", "city" : "FORT BENTON", "loc" : [ -110.671487, 47.809406 ], "pop" : 2795, "state" : "MT" } +{ "_id" : "59443", "city" : "FORT SHAW", "loc" : [ -111.805655, 47.563862 ], "pop" : 531, "state" : "MT" } +{ "_id" : "59444", "city" : "GALATA", "loc" : [ -111.419772, 48.458657 ], "pop" : 156, "state" : "MT" } +{ "_id" : "59446", "city" : "GERALDINE", "loc" : [ -110.276537, 47.602365 ], "pop" : 369, "state" : "MT" } +{ "_id" : "59447", "city" : "GEYSER", "loc" : [ -110.483877, 47.259816 ], "pop" : 289, "state" : "MT" } +{ "_id" : "59448", "city" : "HEART BUTTE", "loc" : [ -112.845591, 48.277743 ], "pop" : 642, "state" : "MT" } +{ "_id" : "59450", "city" : "HIGHWOOD", "loc" : [ -110.788656, 47.581587 ], "pop" : 387, "state" : "MT" } +{ "_id" : "59451", "city" : "HILGER", "loc" : [ -109.456246, 47.269546 ], "pop" : 719, "state" : "MT" } +{ "_id" : "59452", "city" : "UTICA", "loc" : [ -109.951824, 46.947633 ], "pop" : 632, "state" : "MT" } +{ "_id" : "59453", "city" : "JUDITH GAP", "loc" : [ -109.675475, 46.662301 ], "pop" : 303, "state" : "MT" } +{ "_id" : "59454", "city" : "KEVIN", "loc" : [ -111.970829, 48.750786 ], "pop" : 254, "state" : "MT" } +{ "_id" : "59456", "city" : "LEDGER", "loc" : [ -111.756384, 48.277569 ], "pop" : 42, "state" : "MT" } +{ "_id" : "59457", "city" : "LEWISTOWN", "loc" : [ -109.420297, 47.056324 ], "pop" : 8545, "state" : "MT" } +{ "_id" : "59460", "city" : "LOMA", "loc" : [ -110.499487, 47.954576 ], "pop" : 201, "state" : "MT" } +{ "_id" : "59462", "city" : "MOCCASIN", "loc" : [ -109.890066, 47.09164 ], "pop" : 187, "state" : "MT" } +{ "_id" : "59463", "city" : "MONARCH", "loc" : [ -110.871027, 47.07223 ], "pop" : 150, "state" : "MT" } +{ "_id" : "59464", "city" : "MOORE", "loc" : [ -109.653838, 46.989811 ], "pop" : 569, "state" : "MT" } +{ "_id" : "59465", "city" : "NEIHART", "loc" : [ -110.732827, 46.939086 ], "pop" : 58, "state" : "MT" } +{ "_id" : "59467", "city" : "PENDROY", "loc" : [ -112.326082, 48.087892 ], "pop" : 214, "state" : "MT" } +{ "_id" : "59468", "city" : "POWER", "loc" : [ -111.716898, 47.679846 ], "pop" : 862, "state" : "MT" } +{ "_id" : "59469", "city" : "RAYNESFORD", "loc" : [ -110.704747, 47.260425 ], "pop" : 208, "state" : "MT" } +{ "_id" : "59471", "city" : "ROY", "loc" : [ -108.863422, 47.367821 ], "pop" : 353, "state" : "MT" } +{ "_id" : "59472", "city" : "SAND COULEE", "loc" : [ -111.16606, 47.402117 ], "pop" : 583, "state" : "MT" } +{ "_id" : "59474", "city" : "SHELBY", "loc" : [ -111.839122, 48.503666 ], "pop" : 3375, "state" : "MT" } +{ "_id" : "59479", "city" : "STANFORD", "loc" : [ -110.196111, 47.14886 ], "pop" : 966, "state" : "MT" } +{ "_id" : "59480", "city" : "STOCKETT", "loc" : [ -111.12868, 47.321712 ], "pop" : 554, "state" : "MT" } +{ "_id" : "59482", "city" : "SUNBURST", "loc" : [ -111.744195, 48.851585 ], "pop" : 912, "state" : "MT" } +{ "_id" : "59483", "city" : "SUN RIVER", "loc" : [ -111.724214, 47.480975 ], "pop" : 1083, "state" : "MT" } +{ "_id" : "59484", "city" : "SWEETGRASS", "loc" : [ -112.020436, 48.971305 ], "pop" : 349, "state" : "MT" } +{ "_id" : "59486", "city" : "VALIER", "loc" : [ -112.303275, 48.279504 ], "pop" : 1473, "state" : "MT" } +{ "_id" : "59487", "city" : "VAUGHN", "loc" : [ -111.576955, 47.562445 ], "pop" : 869, "state" : "MT" } +{ "_id" : "59489", "city" : "WINIFRED", "loc" : [ -109.340931, 47.589903 ], "pop" : 376, "state" : "MT" } +{ "_id" : "59501", "city" : "HAVRE", "loc" : [ -109.687974, 48.556121 ], "pop" : 13961, "state" : "MT" } +{ "_id" : "59520", "city" : "BIG SANDY", "loc" : [ -110.07762, 48.149677 ], "pop" : 1554, "state" : "MT" } +{ "_id" : "59521", "city" : "BOX ELDER", "loc" : [ -109.820548, 48.284066 ], "pop" : 2012, "state" : "MT" } +{ "_id" : "59522", "city" : "CHESTER", "loc" : [ -110.97982, 48.454125 ], "pop" : 1530, "state" : "MT" } +{ "_id" : "59523", "city" : "CHINOOK", "loc" : [ -109.22246, 48.57985 ], "pop" : 2607, "state" : "MT" } +{ "_id" : "59524", "city" : "DODSON", "loc" : [ -108.629967, 48.207526 ], "pop" : 1870, "state" : "MT" } +{ "_id" : "59525", "city" : "GILDFORD", "loc" : [ -110.283633, 48.592716 ], "pop" : 330, "state" : "MT" } +{ "_id" : "59526", "city" : "HARLEM", "loc" : [ -108.769253, 48.539802 ], "pop" : 1177, "state" : "MT" } +{ "_id" : "59527", "city" : "HAYS", "loc" : [ -108.768422, 48.380374 ], "pop" : 638, "state" : "MT" } +{ "_id" : "59528", "city" : "HINGHAM", "loc" : [ -110.427548, 48.587029 ], "pop" : 333, "state" : "MT" } +{ "_id" : "59529", "city" : "HOGELAND", "loc" : [ -108.667704, 48.857071 ], "pop" : 143, "state" : "MT" } +{ "_id" : "59530", "city" : "INVERNESS", "loc" : [ -110.68796, 48.593009 ], "pop" : 231, "state" : "MT" } +{ "_id" : "59531", "city" : "JOPLIN", "loc" : [ -110.79145, 48.649795 ], "pop" : 496, "state" : "MT" } +{ "_id" : "59532", "city" : "KREMLIN", "loc" : [ -110.051315, 48.559955 ], "pop" : 311, "state" : "MT" } +{ "_id" : "59535", "city" : "LLOYD", "loc" : [ -109.294264, 48.148632 ], "pop" : 212, "state" : "MT" } +{ "_id" : "59537", "city" : "LORING", "loc" : [ -107.868603, 48.798333 ], "pop" : 243, "state" : "MT" } +{ "_id" : "59538", "city" : "MALTA", "loc" : [ -107.840784, 48.369167 ], "pop" : 4049, "state" : "MT" } +{ "_id" : "59540", "city" : "RUDYARD", "loc" : [ -110.555235, 48.586001 ], "pop" : 476, "state" : "MT" } +{ "_id" : "59542", "city" : "TURNER", "loc" : [ -108.396079, 48.832766 ], "pop" : 270, "state" : "MT" } +{ "_id" : "59544", "city" : "WHITEWATER", "loc" : [ -107.40543, 48.834909 ], "pop" : 110, "state" : "MT" } +{ "_id" : "59545", "city" : "WHITLASH", "loc" : [ -111.107512, 48.911037 ], "pop" : 269, "state" : "MT" } +{ "_id" : "59546", "city" : "ZORTMAN", "loc" : [ -108.349523, 47.874326 ], "pop" : 394, "state" : "MT" } +{ "_id" : "59601", "city" : "HELENA", "loc" : [ -112.021283, 46.613066 ], "pop" : 40102, "state" : "MT" } +{ "_id" : "59632", "city" : "BOULDER", "loc" : [ -112.113757, 46.230647 ], "pop" : 1737, "state" : "MT" } +{ "_id" : "59633", "city" : "CANYON CREEK", "loc" : [ -112.279496, 46.762662 ], "pop" : 648, "state" : "MT" } +{ "_id" : "59634", "city" : "MONTANA CITY", "loc" : [ -111.992565, 46.474492 ], "pop" : 3496, "state" : "MT" } +{ "_id" : "59635", "city" : "EAST HELENA", "loc" : [ -111.905089, 46.597324 ], "pop" : 3901, "state" : "MT" } +{ "_id" : "59639", "city" : "LINCOLN", "loc" : [ -112.66514, 46.957458 ], "pop" : 1015, "state" : "MT" } +{ "_id" : "59641", "city" : "RADERSBURG", "loc" : [ -111.572186, 46.079317 ], "pop" : 391, "state" : "MT" } +{ "_id" : "59642", "city" : "RINGLING", "loc" : [ -110.824214, 46.285468 ], "pop" : 97, "state" : "MT" } +{ "_id" : "59643", "city" : "TOSTON", "loc" : [ -111.425974, 46.20437 ], "pop" : 168, "state" : "MT" } +{ "_id" : "59644", "city" : "TOWNSEND", "loc" : [ -111.491906, 46.334571 ], "pop" : 2343, "state" : "MT" } +{ "_id" : "59645", "city" : "WHITE SULPHUR SP", "loc" : [ -110.934413, 46.566323 ], "pop" : 1476, "state" : "MT" } +{ "_id" : "59647", "city" : "WINSTON", "loc" : [ -111.644671, 46.431485 ], "pop" : 416, "state" : "MT" } +{ "_id" : "59648", "city" : "WOLF CREEK", "loc" : [ -111.883316, 46.839567 ], "pop" : 995, "state" : "MT" } +{ "_id" : "59701", "city" : "WALKERVILLE", "loc" : [ -112.517807, 45.991579 ], "pop" : 33096, "state" : "MT" } +{ "_id" : "59711", "city" : "ANACONDA", "loc" : [ -112.97388, 46.129863 ], "pop" : 8611, "state" : "MT" } +{ "_id" : "59714", "city" : "BELGRADE", "loc" : [ -111.143927, 45.780126 ], "pop" : 9060, "state" : "MT" } +{ "_id" : "59715", "city" : "BOZEMAN", "loc" : [ -111.043057, 45.669269 ], "pop" : 31218, "state" : "MT" } +{ "_id" : "59720", "city" : "CAMERON", "loc" : [ -111.650778, 45.139021 ], "pop" : 269, "state" : "MT" } +{ "_id" : "59721", "city" : "CARDWELL", "loc" : [ -111.780946, 45.894071 ], "pop" : 109, "state" : "MT" } +{ "_id" : "59722", "city" : "DEER LODGE", "loc" : [ -112.747589, 46.38807 ], "pop" : 5220, "state" : "MT" } +{ "_id" : "59724", "city" : "DELL", "loc" : [ -112.950401, 44.95877 ], "pop" : 387, "state" : "MT" } +{ "_id" : "59725", "city" : "DILLON", "loc" : [ -112.640452, 45.23394 ], "pop" : 6972, "state" : "MT" } +{ "_id" : "59727", "city" : "DIVIDE", "loc" : [ -112.719551, 45.716055 ], "pop" : 316, "state" : "MT" } +{ "_id" : "59729", "city" : "ENNIS", "loc" : [ -111.687033, 45.354456 ], "pop" : 1749, "state" : "MT" } +{ "_id" : "59730", "city" : "GALLATIN GATEWAY", "loc" : [ -111.173407, 45.609963 ], "pop" : 2807, "state" : "MT" } +{ "_id" : "59731", "city" : "GARRISON", "loc" : [ -112.617322, 46.572363 ], "pop" : 817, "state" : "MT" } +{ "_id" : "59733", "city" : "GOLD CREEK", "loc" : [ -112.97057, 46.590025 ], "pop" : 66, "state" : "MT" } +{ "_id" : "59735", "city" : "HARRISON", "loc" : [ -111.846135, 45.742333 ], "pop" : 434, "state" : "MT" } +{ "_id" : "59736", "city" : "JACKSON", "loc" : [ -113.465862, 45.430725 ], "pop" : 208, "state" : "MT" } +{ "_id" : "59739", "city" : "LIMA", "loc" : [ -112.562492, 44.644057 ], "pop" : 434, "state" : "MT" } +{ "_id" : "59741", "city" : "MANHATTAN", "loc" : [ -111.314577, 45.79799 ], "pop" : 3461, "state" : "MT" } +{ "_id" : "59745", "city" : "NORRIS", "loc" : [ -111.694284, 45.532271 ], "pop" : 148, "state" : "MT" } +{ "_id" : "59747", "city" : "PONY", "loc" : [ -111.961859, 45.574502 ], "pop" : 252, "state" : "MT" } +{ "_id" : "59748", "city" : "RAMSAY", "loc" : [ -112.619628, 46.119573 ], "pop" : 89, "state" : "MT" } +{ "_id" : "59749", "city" : "SHERIDAN", "loc" : [ -112.173543, 45.422968 ], "pop" : 1524, "state" : "MT" } +{ "_id" : "59750", "city" : "BUTTE", "loc" : [ -112.71586, 46.003281 ], "pop" : 440, "state" : "MT" } +{ "_id" : "59751", "city" : "SILVER STAR", "loc" : [ -112.177604, 45.757105 ], "pop" : 310, "state" : "MT" } +{ "_id" : "59752", "city" : "THREE FORKS", "loc" : [ -111.543643, 45.881068 ], "pop" : 1951, "state" : "MT" } +{ "_id" : "59754", "city" : "TWIN BRIDGES", "loc" : [ -112.349461, 45.531055 ], "pop" : 1041, "state" : "MT" } +{ "_id" : "59755", "city" : "VIRGINIA CITY", "loc" : [ -112.002619, 45.247216 ], "pop" : 268, "state" : "MT" } +{ "_id" : "59756", "city" : "WARMSPRINGS", "loc" : [ -112.820041, 46.162593 ], "pop" : 1667, "state" : "MT" } +{ "_id" : "59758", "city" : "WEST YELLOWSTONE", "loc" : [ -111.18595, 44.912502 ], "pop" : 1987, "state" : "MT" } +{ "_id" : "59759", "city" : "WHITEHALL", "loc" : [ -112.124535, 45.877146 ], "pop" : 2591, "state" : "MT" } +{ "_id" : "59761", "city" : "WISDOM", "loc" : [ -113.472926, 45.651915 ], "pop" : 224, "state" : "MT" } +{ "_id" : "59762", "city" : "WISE RIVER", "loc" : [ -112.996285, 45.742397 ], "pop" : 199, "state" : "MT" } +{ "_id" : "59801", "city" : "MISSOULA", "loc" : [ -114.025207, 46.856274 ], "pop" : 33811, "state" : "MT" } +{ "_id" : "59802", "city" : "MISSOULA", "loc" : [ -114.002732, 46.900615 ], "pop" : 22650, "state" : "MT" } +{ "_id" : "59803", "city" : "MISSOULA", "loc" : [ -114.026528, 46.822362 ], "pop" : 10444, "state" : "MT" } +{ "_id" : "59820", "city" : "ALBERTON", "loc" : [ -114.492139, 46.98061 ], "pop" : 885, "state" : "MT" } +{ "_id" : "59821", "city" : "ARLEE", "loc" : [ -114.075978, 47.186035 ], "pop" : 1432, "state" : "MT" } +{ "_id" : "59823", "city" : "BONNER", "loc" : [ -113.746254, 46.860138 ], "pop" : 1625, "state" : "MT" } +{ "_id" : "59824", "city" : "MOIESE", "loc" : [ -114.15931, 47.433449 ], "pop" : 1638, "state" : "MT" } +{ "_id" : "59825", "city" : "CLINTON", "loc" : [ -113.703764, 46.767281 ], "pop" : 829, "state" : "MT" } +{ "_id" : "59826", "city" : "CONDON", "loc" : [ -113.707477, 47.509696 ], "pop" : 534, "state" : "MT" } +{ "_id" : "59827", "city" : "CONNER", "loc" : [ -114.179966, 45.912762 ], "pop" : 579, "state" : "MT" } +{ "_id" : "59828", "city" : "CORVALLIS", "loc" : [ -114.095995, 46.314193 ], "pop" : 2987, "state" : "MT" } +{ "_id" : "59829", "city" : "DARBY", "loc" : [ -114.193784, 46.028033 ], "pop" : 1657, "state" : "MT" } +{ "_id" : "59831", "city" : "DIXON", "loc" : [ -114.30557, 47.31313 ], "pop" : 454, "state" : "MT" } +{ "_id" : "59832", "city" : "DRUMMOND", "loc" : [ -113.242649, 46.664676 ], "pop" : 800, "state" : "MT" } +{ "_id" : "59833", "city" : "FLORENCE", "loc" : [ -114.094487, 46.63102 ], "pop" : 3184, "state" : "MT" } +{ "_id" : "59834", "city" : "FRENCHTOWN", "loc" : [ -114.268308, 47.047112 ], "pop" : 1679, "state" : "MT" } +{ "_id" : "59836", "city" : "GREENOUGH", "loc" : [ -113.427017, 46.943361 ], "pop" : 372, "state" : "MT" } +{ "_id" : "59837", "city" : "HALL", "loc" : [ -113.208725, 46.582539 ], "pop" : 276, "state" : "MT" } +{ "_id" : "59840", "city" : "HAMILTON", "loc" : [ -114.167869, 46.23953 ], "pop" : 9548, "state" : "MT" } +{ "_id" : "59843", "city" : "HELMVILLE", "loc" : [ -112.941296, 46.829968 ], "pop" : 155, "state" : "MT" } +{ "_id" : "59844", "city" : "HERON", "loc" : [ -115.940668, 48.053668 ], "pop" : 559, "state" : "MT" } +{ "_id" : "59845", "city" : "HOT SPRINGS", "loc" : [ -114.659712, 47.591408 ], "pop" : 858, "state" : "MT" } +{ "_id" : "59846", "city" : "HUSON", "loc" : [ -114.421939, 47.065953 ], "pop" : 562, "state" : "MT" } +{ "_id" : "59847", "city" : "LOLO", "loc" : [ -114.109732, 46.7585 ], "pop" : 3783, "state" : "MT" } +{ "_id" : "59848", "city" : "LONEPINE", "loc" : [ -114.63718, 47.711209 ], "pop" : 236, "state" : "MT" } +{ "_id" : "59852", "city" : "NIARADA", "loc" : [ -114.656218, 47.8031 ], "pop" : 58, "state" : "MT" } +{ "_id" : "59853", "city" : "NOXON", "loc" : [ -115.780658, 48.030166 ], "pop" : 530, "state" : "MT" } +{ "_id" : "59854", "city" : "OVANDO", "loc" : [ -113.090528, 47.006719 ], "pop" : 362, "state" : "MT" } +{ "_id" : "59858", "city" : "PHILIPSBURG", "loc" : [ -113.3126, 46.318899 ], "pop" : 1445, "state" : "MT" } +{ "_id" : "59859", "city" : "PLAINS", "loc" : [ -114.893014, 47.473448 ], "pop" : 2590, "state" : "MT" } +{ "_id" : "59860", "city" : "POLSON", "loc" : [ -114.140444, 47.687574 ], "pop" : 6294, "state" : "MT" } +{ "_id" : "59864", "city" : "RONAN", "loc" : [ -114.105385, 47.552457 ], "pop" : 5682, "state" : "MT" } +{ "_id" : "59865", "city" : "SAINT IGNATIUS", "loc" : [ -114.075822, 47.330014 ], "pop" : 2283, "state" : "MT" } +{ "_id" : "59866", "city" : "SAINT REGIS", "loc" : [ -115.170323, 47.336899 ], "pop" : 962, "state" : "MT" } +{ "_id" : "59868", "city" : "SEELEY LAKE", "loc" : [ -113.481019, 47.178928 ], "pop" : 1240, "state" : "MT" } +{ "_id" : "59870", "city" : "STEVENSVILLE", "loc" : [ -114.047846, 46.526723 ], "pop" : 5250, "state" : "MT" } +{ "_id" : "59871", "city" : "SULA", "loc" : [ -114.042968, 45.827701 ], "pop" : 422, "state" : "MT" } +{ "_id" : "59872", "city" : "SUPERIOR", "loc" : [ -114.888483, 47.172103 ], "pop" : 1825, "state" : "MT" } +{ "_id" : "59873", "city" : "THOMPSON FALLS", "loc" : [ -115.360236, 47.601572 ], "pop" : 2311, "state" : "MT" } +{ "_id" : "59874", "city" : "TROUT CREEK", "loc" : [ -115.559185, 47.811138 ], "pop" : 1095, "state" : "MT" } +{ "_id" : "59875", "city" : "VICTOR", "loc" : [ -114.166534, 46.400489 ], "pop" : 2211, "state" : "MT" } +{ "_id" : "59901", "city" : "EVERGREEN", "loc" : [ -114.289163, 48.220939 ], "pop" : 33469, "state" : "MT" } +{ "_id" : "59910", "city" : "BIG ARM", "loc" : [ -114.207049, 47.758514 ], "pop" : 1089, "state" : "MT" } +{ "_id" : "59911", "city" : "SWAN LAKE", "loc" : [ -114.01993, 48.039725 ], "pop" : 5119, "state" : "MT" } +{ "_id" : "59912", "city" : "COLUMBIA FALLS", "loc" : [ -114.178394, 48.353394 ], "pop" : 9275, "state" : "MT" } +{ "_id" : "59914", "city" : "DAYTON", "loc" : [ -114.280918, 47.860749 ], "pop" : 226, "state" : "MT" } +{ "_id" : "59915", "city" : "ELMO", "loc" : [ -114.343938, 47.818541 ], "pop" : 243, "state" : "MT" } +{ "_id" : "59916", "city" : "ESSEX", "loc" : [ -113.946678, 48.494028 ], "pop" : 98, "state" : "MT" } +{ "_id" : "59917", "city" : "EUREKA", "loc" : [ -115.004938, 48.842766 ], "pop" : 3747, "state" : "MT" } +{ "_id" : "59920", "city" : "KILA", "loc" : [ -114.510402, 48.074437 ], "pop" : 578, "state" : "MT" } +{ "_id" : "59922", "city" : "LAKESIDE", "loc" : [ -114.226562, 48.021469 ], "pop" : 1027, "state" : "MT" } +{ "_id" : "59923", "city" : "LIBBY", "loc" : [ -115.539101, 48.377311 ], "pop" : 10148, "state" : "MT" } +{ "_id" : "59925", "city" : "MARION", "loc" : [ -114.744625, 48.083596 ], "pop" : 475, "state" : "MT" } +{ "_id" : "59928", "city" : "POLEBRIDGE", "loc" : [ -114.383558, 48.820585 ], "pop" : 97, "state" : "MT" } +{ "_id" : "59929", "city" : "PROCTOR", "loc" : [ -114.383193, 47.940371 ], "pop" : 66, "state" : "MT" } +{ "_id" : "59930", "city" : "REXFORD", "loc" : [ -115.212859, 48.917947 ], "pop" : 440, "state" : "MT" } +{ "_id" : "59931", "city" : "ROLLINS", "loc" : [ -114.224986, 47.918207 ], "pop" : 205, "state" : "MT" } +{ "_id" : "59932", "city" : "SOMERS", "loc" : [ -114.23548, 48.079329 ], "pop" : 1104, "state" : "MT" } +{ "_id" : "59935", "city" : "TROY", "loc" : [ -115.881684, 48.479119 ], "pop" : 3146, "state" : "MT" } +{ "_id" : "59937", "city" : "WHITEFISH", "loc" : [ -114.350859, 48.403999 ], "pop" : 9837, "state" : "MT" } +{ "_id" : "60002", "city" : "ANTIOCH", "loc" : [ -88.117802, 42.464811 ], "pop" : 18058, "state" : "IL" } +{ "_id" : "60004", "city" : "ARLINGTON HEIGHT", "loc" : [ -87.97909900000001, 42.111619 ], "pop" : 52947, "state" : "IL" } +{ "_id" : "60005", "city" : "ARLINGTON HEIGHT", "loc" : [ -87.985461, 42.066599 ], "pop" : 26742, "state" : "IL" } +{ "_id" : "60007", "city" : "ELK GROVE VILLAG", "loc" : [ -88.012775, 42.005613 ], "pop" : 34577, "state" : "IL" } +{ "_id" : "60008", "city" : "ROLLING MEADOWS", "loc" : [ -88.019075, 42.072979 ], "pop" : 18672, "state" : "IL" } +{ "_id" : "60010", "city" : "BARRINGTON", "loc" : [ -88.138345, 42.161387 ], "pop" : 37323, "state" : "IL" } +{ "_id" : "60012", "city" : "CRYSTAL LAKE", "loc" : [ -88.32129399999999, 42.266198 ], "pop" : 6855, "state" : "IL" } +{ "_id" : "60013", "city" : "CARY", "loc" : [ -88.242594, 42.219599 ], "pop" : 17521, "state" : "IL" } +{ "_id" : "60014", "city" : "CRYSTAL LAKE", "loc" : [ -88.332364, 42.230755 ], "pop" : 29595, "state" : "IL" } +{ "_id" : "60015", "city" : "DEERFIELD", "loc" : [ -87.859033, 42.170494 ], "pop" : 22048, "state" : "IL" } +{ "_id" : "60016", "city" : "DES PLAINES", "loc" : [ -87.88589899999999, 42.046734 ], "pop" : 54734, "state" : "IL" } +{ "_id" : "60018", "city" : "ROSEMONT", "loc" : [ -87.897882, 42.015116 ], "pop" : 28884, "state" : "IL" } +{ "_id" : "60020", "city" : "FOX LAKE", "loc" : [ -88.16475199999999, 42.393701 ], "pop" : 10336, "state" : "IL" } +{ "_id" : "60021", "city" : "FOX RIVER GROVE", "loc" : [ -88.220483, 42.193594 ], "pop" : 4898, "state" : "IL" } +{ "_id" : "60022", "city" : "GLENCOE", "loc" : [ -87.761486, 42.133339 ], "pop" : 8168, "state" : "IL" } +{ "_id" : "60025", "city" : "GLENVIEW", "loc" : [ -87.822299, 42.075785 ], "pop" : 45038, "state" : "IL" } +{ "_id" : "60026", "city" : "GLENVIEW NAS", "loc" : [ -87.824782, 42.09134 ], "pop" : 437, "state" : "IL" } +{ "_id" : "60030", "city" : "GAGES LAKE", "loc" : [ -88.037789, 42.34848 ], "pop" : 8038, "state" : "IL" } +{ "_id" : "60031", "city" : "GURNEE", "loc" : [ -87.945232, 42.366906 ], "pop" : 32114, "state" : "IL" } +{ "_id" : "60033", "city" : "HARVARD", "loc" : [ -88.604812, 42.422727 ], "pop" : 10790, "state" : "IL" } +{ "_id" : "60034", "city" : "HEBRON", "loc" : [ -88.41758299999999, 42.464173 ], "pop" : 1606, "state" : "IL" } +{ "_id" : "60035", "city" : "HIGHLAND PARK", "loc" : [ -87.805894, 42.179446 ], "pop" : 29346, "state" : "IL" } +{ "_id" : "60037", "city" : "FORT SHERIDAN", "loc" : [ -87.805572, 42.209683 ], "pop" : 2598, "state" : "IL" } +{ "_id" : "60040", "city" : "HIGHWOOD", "loc" : [ -87.81406800000001, 42.203549 ], "pop" : 3956, "state" : "IL" } +{ "_id" : "60041", "city" : "INGLESIDE", "loc" : [ -88.158749, 42.363093 ], "pop" : 4267, "state" : "IL" } +{ "_id" : "60042", "city" : "ISLAND LAKE", "loc" : [ -88.19262999999999, 42.274186 ], "pop" : 3919, "state" : "IL" } +{ "_id" : "60043", "city" : "KENILWORTH", "loc" : [ -87.716463, 42.088444 ], "pop" : 2509, "state" : "IL" } +{ "_id" : "60044", "city" : "LAKE BLUFF", "loc" : [ -87.85595000000001, 42.28196 ], "pop" : 8031, "state" : "IL" } +{ "_id" : "60045", "city" : "LAKE FOREST", "loc" : [ -87.84815399999999, 42.237398 ], "pop" : 17948, "state" : "IL" } +{ "_id" : "60046", "city" : "LINDENHURST", "loc" : [ -88.063318, 42.414796 ], "pop" : 20764, "state" : "IL" } +{ "_id" : "60047", "city" : "LONG GROVE", "loc" : [ -88.07029900000001, 42.196721 ], "pop" : 26893, "state" : "IL" } +{ "_id" : "60048", "city" : "LIBERTYVILLE", "loc" : [ -87.949955, 42.281001 ], "pop" : 28573, "state" : "IL" } +{ "_id" : "60050", "city" : "MC HENRY", "loc" : [ -88.254429, 42.345527 ], "pop" : 39545, "state" : "IL" } +{ "_id" : "60053", "city" : "MORTON GROVE", "loc" : [ -87.789879, 42.043133 ], "pop" : 22502, "state" : "IL" } +{ "_id" : "60056", "city" : "MOUNT PROSPECT", "loc" : [ -87.937667, 42.062392 ], "pop" : 54459, "state" : "IL" } +{ "_id" : "60060", "city" : "MUNDELEIN", "loc" : [ -88.004762, 42.263616 ], "pop" : 22817, "state" : "IL" } +{ "_id" : "60061", "city" : "VERNON HILLS", "loc" : [ -87.971852, 42.228753 ], "pop" : 19713, "state" : "IL" } +{ "_id" : "60062", "city" : "NORTHBROOK", "loc" : [ -87.846535, 42.125443 ], "pop" : 40216, "state" : "IL" } +{ "_id" : "60064", "city" : "ABBOTT PARK", "loc" : [ -87.847819, 42.318901 ], "pop" : 26542, "state" : "IL" } +{ "_id" : "60067", "city" : "PALATINE", "loc" : [ -88.04293699999999, 42.113888 ], "pop" : 57281, "state" : "IL" } +{ "_id" : "60068", "city" : "PARK RIDGE", "loc" : [ -87.841675, 42.012171 ], "pop" : 37450, "state" : "IL" } +{ "_id" : "60069", "city" : "PRAIRIE VIEW", "loc" : [ -87.90482299999999, 42.192872 ], "pop" : 4047, "state" : "IL" } +{ "_id" : "60070", "city" : "PROSPECT HEIGHTS", "loc" : [ -87.914934, 42.103324 ], "pop" : 14692, "state" : "IL" } +{ "_id" : "60071", "city" : "RICHMOND", "loc" : [ -88.290024, 42.466863 ], "pop" : 2658, "state" : "IL" } +{ "_id" : "60072", "city" : "RINGWOOD", "loc" : [ -88.297073, 42.380427 ], "pop" : 1926, "state" : "IL" } +{ "_id" : "60073", "city" : "ROUND LAKE", "loc" : [ -88.088819, 42.366809 ], "pop" : 28919, "state" : "IL" } +{ "_id" : "60074", "city" : "PALATINE", "loc" : [ -88.022998, 42.145775 ], "pop" : 11712, "state" : "IL" } +{ "_id" : "60076", "city" : "SKOKIE", "loc" : [ -87.732828, 42.036168 ], "pop" : 31589, "state" : "IL" } +{ "_id" : "60077", "city" : "SKOKIE", "loc" : [ -87.75412300000001, 42.034525 ], "pop" : 22680, "state" : "IL" } +{ "_id" : "60081", "city" : "SPRING GROVE", "loc" : [ -88.22373399999999, 42.441267 ], "pop" : 2783, "state" : "IL" } +{ "_id" : "60082", "city" : "TECHNY", "loc" : [ -87.80488200000001, 42.121425 ], "pop" : 196, "state" : "IL" } +{ "_id" : "60083", "city" : "WADSWORTH", "loc" : [ -87.904048, 42.446032 ], "pop" : 5510, "state" : "IL" } +{ "_id" : "60084", "city" : "WAUCONDA", "loc" : [ -88.133284, 42.263553 ], "pop" : 11142, "state" : "IL" } +{ "_id" : "60085", "city" : "MC GAW PARK", "loc" : [ -87.852585, 42.361882 ], "pop" : 55778, "state" : "IL" } +{ "_id" : "60087", "city" : "WAUKEGAN", "loc" : [ -87.85538699999999, 42.398906 ], "pop" : 17816, "state" : "IL" } +{ "_id" : "60088", "city" : "GREAT LAKES", "loc" : [ -87.864192, 42.303173 ], "pop" : 8831, "state" : "IL" } +{ "_id" : "60089", "city" : "BUFFALO GROVE", "loc" : [ -87.964364, 42.159843 ], "pop" : 41478, "state" : "IL" } +{ "_id" : "60090", "city" : "WHEELING", "loc" : [ -87.93409699999999, 42.13404 ], "pop" : 31261, "state" : "IL" } +{ "_id" : "60091", "city" : "WILMETTE", "loc" : [ -87.72457199999999, 42.076462 ], "pop" : 26657, "state" : "IL" } +{ "_id" : "60093", "city" : "NORTHFIELD", "loc" : [ -87.752256, 42.103605 ], "pop" : 19317, "state" : "IL" } +{ "_id" : "60096", "city" : "WINTHROP HARBOR", "loc" : [ -87.831788, 42.479269 ], "pop" : 7433, "state" : "IL" } +{ "_id" : "60097", "city" : "WONDER LAKE", "loc" : [ -88.353364, 42.384908 ], "pop" : 8401, "state" : "IL" } +{ "_id" : "60098", "city" : "WOODSTOCK", "loc" : [ -88.447671, 42.319775 ], "pop" : 21770, "state" : "IL" } +{ "_id" : "60099", "city" : "ZION", "loc" : [ -87.838925, 42.444249 ], "pop" : 24944, "state" : "IL" } +{ "_id" : "60101", "city" : "ADDISON", "loc" : [ -88.00539999999999, 41.933509 ], "pop" : 35140, "state" : "IL" } +{ "_id" : "60102", "city" : "LAKE IN THE HILL", "loc" : [ -88.301429, 42.170923 ], "pop" : 22082, "state" : "IL" } +{ "_id" : "60103", "city" : "HANOVER PARK", "loc" : [ -88.16035599999999, 41.983559 ], "pop" : 51877, "state" : "IL" } +{ "_id" : "60104", "city" : "BELLWOOD", "loc" : [ -87.878557, 41.882484 ], "pop" : 19336, "state" : "IL" } +{ "_id" : "60106", "city" : "BENSENVILLE", "loc" : [ -87.944973, 41.950145 ], "pop" : 20080, "state" : "IL" } +{ "_id" : "60107", "city" : "STREAMWOOD", "loc" : [ -88.168965, 42.022539 ], "pop" : 30513, "state" : "IL" } +{ "_id" : "60108", "city" : "BLOOMINGDALE", "loc" : [ -88.07823999999999, 41.94827 ], "pop" : 16560, "state" : "IL" } +{ "_id" : "60110", "city" : "CARPENTERSVILLE", "loc" : [ -88.2606, 42.123004 ], "pop" : 23550, "state" : "IL" } +{ "_id" : "60111", "city" : "CLARE", "loc" : [ -88.83783200000001, 42.027045 ], "pop" : 373, "state" : "IL" } +{ "_id" : "60115", "city" : "DE KALB", "loc" : [ -88.760673, 41.934245 ], "pop" : 38360, "state" : "IL" } +{ "_id" : "60118", "city" : "DUNDEE", "loc" : [ -88.29020199999999, 42.096197 ], "pop" : 11919, "state" : "IL" } +{ "_id" : "60119", "city" : "ELBURN", "loc" : [ -88.461106, 41.882405 ], "pop" : 6271, "state" : "IL" } +{ "_id" : "60120", "city" : "ELGIN", "loc" : [ -88.260631, 42.038356 ], "pop" : 42848, "state" : "IL" } +{ "_id" : "60123", "city" : "ELGIN", "loc" : [ -88.31861499999999, 42.037574 ], "pop" : 43835, "state" : "IL" } +{ "_id" : "60126", "city" : "ELMHURST", "loc" : [ -87.941025, 41.892661 ], "pop" : 43637, "state" : "IL" } +{ "_id" : "60129", "city" : "ESMOND", "loc" : [ -88.94386, 42.022458 ], "pop" : 388, "state" : "IL" } +{ "_id" : "60130", "city" : "FOREST PARK", "loc" : [ -87.810624, 41.874373 ], "pop" : 14882, "state" : "IL" } +{ "_id" : "60131", "city" : "FRANKLIN PARK", "loc" : [ -87.873423, 41.933878 ], "pop" : 18572, "state" : "IL" } +{ "_id" : "60134", "city" : "GENEVA", "loc" : [ -88.310954, 41.886013 ], "pop" : 13603, "state" : "IL" } +{ "_id" : "60135", "city" : "GENOA", "loc" : [ -88.690803, 42.09811 ], "pop" : 4356, "state" : "IL" } +{ "_id" : "60136", "city" : "GILBERTS", "loc" : [ -88.369089, 42.098377 ], "pop" : 1212, "state" : "IL" } +{ "_id" : "60137", "city" : "GLEN ELLYN", "loc" : [ -88.064774, 41.866112 ], "pop" : 35643, "state" : "IL" } +{ "_id" : "60139", "city" : "GLENDALE HEIGHTS", "loc" : [ -88.07928200000001, 41.920523 ], "pop" : 27324, "state" : "IL" } +{ "_id" : "60140", "city" : "HAMPSHIRE", "loc" : [ -88.517033, 42.080748 ], "pop" : 6255, "state" : "IL" } +{ "_id" : "60141", "city" : "HINES", "loc" : [ -87.835542, 41.862262 ], "pop" : 200, "state" : "IL" } +{ "_id" : "60142", "city" : "HUNTLEY", "loc" : [ -88.42684800000001, 42.175555 ], "pop" : 4351, "state" : "IL" } +{ "_id" : "60143", "city" : "ITASCA", "loc" : [ -88.020247, 41.971967 ], "pop" : 8650, "state" : "IL" } +{ "_id" : "60145", "city" : "KINGSTON", "loc" : [ -88.769496, 42.105654 ], "pop" : 1555, "state" : "IL" } +{ "_id" : "60146", "city" : "KIRKLAND", "loc" : [ -88.868522, 42.101406 ], "pop" : 1930, "state" : "IL" } +{ "_id" : "60148", "city" : "LOMBARD", "loc" : [ -88.01598799999999, 41.872139 ], "pop" : 52289, "state" : "IL" } +{ "_id" : "60150", "city" : "MALTA", "loc" : [ -88.868818, 41.918332 ], "pop" : 1619, "state" : "IL" } +{ "_id" : "60151", "city" : "MAPLE PARK", "loc" : [ -88.59985, 41.923217 ], "pop" : 4893, "state" : "IL" } +{ "_id" : "60152", "city" : "MARENGO", "loc" : [ -88.60736900000001, 42.244189 ], "pop" : 8536, "state" : "IL" } +{ "_id" : "60153", "city" : "BROADVIEW", "loc" : [ -87.847675, 41.874857 ], "pop" : 37099, "state" : "IL" } +{ "_id" : "60154", "city" : "WESTCHESTER", "loc" : [ -87.884488, 41.852368 ], "pop" : 16957, "state" : "IL" } +{ "_id" : "60157", "city" : "MEDINAH", "loc" : [ -88.057507, 41.970545 ], "pop" : 3110, "state" : "IL" } +{ "_id" : "60160", "city" : "MELROSE PARK", "loc" : [ -87.85806599999999, 41.900347 ], "pop" : 21235, "state" : "IL" } +{ "_id" : "60162", "city" : "HILLSIDE", "loc" : [ -87.901591, 41.872452 ], "pop" : 7757, "state" : "IL" } +{ "_id" : "60163", "city" : "HILLSIDE", "loc" : [ -87.910678, 41.886538 ], "pop" : 5079, "state" : "IL" } +{ "_id" : "60164", "city" : "NORTHLAKE", "loc" : [ -87.89592, 41.917961 ], "pop" : 21306, "state" : "IL" } +{ "_id" : "60165", "city" : "STONE PARK", "loc" : [ -87.88105299999999, 41.903005 ], "pop" : 4387, "state" : "IL" } +{ "_id" : "60171", "city" : "RIVER GROVE", "loc" : [ -87.838707, 41.927886 ], "pop" : 9949, "state" : "IL" } +{ "_id" : "60172", "city" : "ROSELLE", "loc" : [ -88.08569900000001, 41.979834 ], "pop" : 22626, "state" : "IL" } +{ "_id" : "60173", "city" : "SCHAUMBURG", "loc" : [ -88.04818899999999, 42.05807 ], "pop" : 9314, "state" : "IL" } +{ "_id" : "60174", "city" : "SAINT CHARLES", "loc" : [ -88.307022, 41.919417 ], "pop" : 27454, "state" : "IL" } +{ "_id" : "60175", "city" : "SAINT CHARLES", "loc" : [ -88.39179900000001, 41.947842 ], "pop" : 11851, "state" : "IL" } +{ "_id" : "60176", "city" : "SCHILLER PARK", "loc" : [ -87.869179, 41.956304 ], "pop" : 11189, "state" : "IL" } +{ "_id" : "60177", "city" : "SOUTH ELGIN", "loc" : [ -88.298558, 41.996868 ], "pop" : 9117, "state" : "IL" } +{ "_id" : "60178", "city" : "SYCAMORE", "loc" : [ -88.692809, 41.991117 ], "pop" : 13512, "state" : "IL" } +{ "_id" : "60180", "city" : "UNION", "loc" : [ -88.528295, 42.210274 ], "pop" : 1450, "state" : "IL" } +{ "_id" : "60181", "city" : "VILLA PARK", "loc" : [ -87.978246, 41.879899 ], "pop" : 27217, "state" : "IL" } +{ "_id" : "60185", "city" : "WEST CHICAGO", "loc" : [ -88.202168, 41.888558 ], "pop" : 23894, "state" : "IL" } +{ "_id" : "60187", "city" : "WHEATON", "loc" : [ -88.10763300000001, 41.856592 ], "pop" : 57758, "state" : "IL" } +{ "_id" : "60188", "city" : "CAROL STREAM", "loc" : [ -88.136962, 41.91784 ], "pop" : 34902, "state" : "IL" } +{ "_id" : "60190", "city" : "WINFIELD", "loc" : [ -88.15162100000001, 41.874358 ], "pop" : 9255, "state" : "IL" } +{ "_id" : "60191", "city" : "WOOD DALE", "loc" : [ -87.980971, 41.960171 ], "pop" : 13750, "state" : "IL" } +{ "_id" : "60193", "city" : "SCHAUMBURG", "loc" : [ -88.093481, 42.014432 ], "pop" : 39438, "state" : "IL" } +{ "_id" : "60194", "city" : "HOFFMAN ESTATES", "loc" : [ -88.109442, 42.039025 ], "pop" : 37295, "state" : "IL" } +{ "_id" : "60195", "city" : "HOFFMAN ESTATES", "loc" : [ -88.108709, 42.073865 ], "pop" : 29236, "state" : "IL" } +{ "_id" : "60201", "city" : "EVANSTON", "loc" : [ -87.69433100000001, 42.054551 ], "pop" : 41692, "state" : "IL" } +{ "_id" : "60202", "city" : "EVANSTON", "loc" : [ -87.686544, 42.03022 ], "pop" : 31509, "state" : "IL" } +{ "_id" : "60203", "city" : "EVANSTON", "loc" : [ -87.71759, 42.048487 ], "pop" : 4764, "state" : "IL" } +{ "_id" : "60301", "city" : "OAK PARK", "loc" : [ -87.798598, 41.888601 ], "pop" : 1673, "state" : "IL" } +{ "_id" : "60302", "city" : "OAK PARK", "loc" : [ -87.78954299999999, 41.892471 ], "pop" : 33298, "state" : "IL" } +{ "_id" : "60304", "city" : "OAK PARK", "loc" : [ -87.787712, 41.872458 ], "pop" : 18677, "state" : "IL" } +{ "_id" : "60305", "city" : "RIVER FOREST", "loc" : [ -87.8159, 41.895064 ], "pop" : 11669, "state" : "IL" } +{ "_id" : "60401", "city" : "BEECHER", "loc" : [ -87.611538, 41.34437 ], "pop" : 3724, "state" : "IL" } +{ "_id" : "60402", "city" : "STICKNEY", "loc" : [ -87.79075, 41.841819 ], "pop" : 51541, "state" : "IL" } +{ "_id" : "60406", "city" : "BLUE ISLAND", "loc" : [ -87.67946499999999, 41.658187 ], "pop" : 23305, "state" : "IL" } +{ "_id" : "60407", "city" : "BRACEVILLE", "loc" : [ -88.269042, 41.228788 ], "pop" : 1535, "state" : "IL" } +{ "_id" : "60408", "city" : "BRAIDWOOD", "loc" : [ -88.223124, 41.26574 ], "pop" : 3814, "state" : "IL" } +{ "_id" : "60409", "city" : "CALUMET CITY", "loc" : [ -87.548328, 41.615257 ], "pop" : 36065, "state" : "IL" } +{ "_id" : "60410", "city" : "CHANNAHON", "loc" : [ -88.213786, 41.434664 ], "pop" : 3870, "state" : "IL" } +{ "_id" : "60411", "city" : "SAUK VILLAGE", "loc" : [ -87.613209, 41.506202 ], "pop" : 60738, "state" : "IL" } +{ "_id" : "60415", "city" : "CHICAGO RIDGE", "loc" : [ -87.77738100000001, 41.70171 ], "pop" : 13472, "state" : "IL" } +{ "_id" : "60416", "city" : "COAL CITY", "loc" : [ -88.282346, 41.290769 ], "pop" : 6248, "state" : "IL" } +{ "_id" : "60417", "city" : "CRETE", "loc" : [ -87.602738, 41.438952 ], "pop" : 14372, "state" : "IL" } +{ "_id" : "60419", "city" : "DOLTON", "loc" : [ -87.59795200000001, 41.625723 ], "pop" : 22705, "state" : "IL" } +{ "_id" : "60420", "city" : "DWIGHT", "loc" : [ -88.41588400000001, 41.088701 ], "pop" : 4956, "state" : "IL" } +{ "_id" : "60421", "city" : "ELWOOD", "loc" : [ -88.08642, 41.426018 ], "pop" : 2700, "state" : "IL" } +{ "_id" : "60422", "city" : "FLOSSMOOR", "loc" : [ -87.68373699999999, 41.540574 ], "pop" : 8627, "state" : "IL" } +{ "_id" : "60423", "city" : "FRANKFORT", "loc" : [ -87.82477400000001, 41.509361 ], "pop" : 15682, "state" : "IL" } +{ "_id" : "60424", "city" : "GARDNER", "loc" : [ -88.296543, 41.179321 ], "pop" : 2349, "state" : "IL" } +{ "_id" : "60425", "city" : "GLENWOOD", "loc" : [ -87.612584, 41.546718 ], "pop" : 10180, "state" : "IL" } +{ "_id" : "60426", "city" : "MARKHAM", "loc" : [ -87.661115, 41.608536 ], "pop" : 48332, "state" : "IL" } +{ "_id" : "60429", "city" : "HAZEL CREST", "loc" : [ -87.68488499999999, 41.573803 ], "pop" : 14987, "state" : "IL" } +{ "_id" : "60430", "city" : "HOMEWOOD", "loc" : [ -87.66157800000001, 41.555579 ], "pop" : 19469, "state" : "IL" } +{ "_id" : "60431", "city" : "JOLIET", "loc" : [ -88.08241, 41.527154 ], "pop" : 512, "state" : "IL" } +{ "_id" : "60432", "city" : "JOLIET", "loc" : [ -88.05717799999999, 41.537758 ], "pop" : 20199, "state" : "IL" } +{ "_id" : "60433", "city" : "JOLIET", "loc" : [ -88.05687, 41.511873 ], "pop" : 18342, "state" : "IL" } +{ "_id" : "60435", "city" : "SHOREWOOD", "loc" : [ -88.128107, 41.541468 ], "pop" : 56510, "state" : "IL" } +{ "_id" : "60436", "city" : "ROCKDALE", "loc" : [ -88.135779, 41.508818 ], "pop" : 23888, "state" : "IL" } +{ "_id" : "60437", "city" : "KINSMAN", "loc" : [ -88.48047699999999, 41.161825 ], "pop" : 687, "state" : "IL" } +{ "_id" : "60438", "city" : "LANSING", "loc" : [ -87.544634, 41.566045 ], "pop" : 28810, "state" : "IL" } +{ "_id" : "60439", "city" : "ARGONNE", "loc" : [ -88.02355799999999, 41.695076 ], "pop" : 31018, "state" : "IL" } +{ "_id" : "60440", "city" : "BOLINGBROOK", "loc" : [ -88.087315, 41.697605 ], "pop" : 23726, "state" : "IL" } +{ "_id" : "60441", "city" : "ROMEOVILLE", "loc" : [ -88.025581, 41.613481 ], "pop" : 55268, "state" : "IL" } +{ "_id" : "60442", "city" : "MANHATTAN", "loc" : [ -87.97713299999999, 41.428883 ], "pop" : 3657, "state" : "IL" } +{ "_id" : "60443", "city" : "MATTESON", "loc" : [ -87.74064799999999, 41.510183 ], "pop" : 13624, "state" : "IL" } +{ "_id" : "60444", "city" : "MAZON", "loc" : [ -88.409561, 41.297189 ], "pop" : 3909, "state" : "IL" } +{ "_id" : "60445", "city" : "CRESTWOOD", "loc" : [ -87.732418, 41.634106 ], "pop" : 26378, "state" : "IL" } +{ "_id" : "60447", "city" : "MINOOKA", "loc" : [ -88.27859599999999, 41.461516 ], "pop" : 6005, "state" : "IL" } +{ "_id" : "60448", "city" : "MOKENA", "loc" : [ -87.891121, 41.53421 ], "pop" : 12324, "state" : "IL" } +{ "_id" : "60449", "city" : "MONEE", "loc" : [ -87.77484, 41.419133 ], "pop" : 3537, "state" : "IL" } +{ "_id" : "60450", "city" : "MORRIS", "loc" : [ -88.41776900000001, 41.367233 ], "pop" : 13423, "state" : "IL" } +{ "_id" : "60451", "city" : "NEW LENOX", "loc" : [ -87.963083, 41.506701 ], "pop" : 17470, "state" : "IL" } +{ "_id" : "60452", "city" : "OAK FOREST", "loc" : [ -87.75421900000001, 41.607684 ], "pop" : 26772, "state" : "IL" } +{ "_id" : "60453", "city" : "OAK LAWN", "loc" : [ -87.751564, 41.714305 ], "pop" : 56039, "state" : "IL" } +{ "_id" : "60455", "city" : "BRIDGEVIEW", "loc" : [ -87.806572, 41.743128 ], "pop" : 14065, "state" : "IL" } +{ "_id" : "60456", "city" : "HOMETOWN", "loc" : [ -87.73153600000001, 41.73113 ], "pop" : 4769, "state" : "IL" } +{ "_id" : "60457", "city" : "HICKORY HILLS", "loc" : [ -87.82889299999999, 41.726228 ], "pop" : 12894, "state" : "IL" } +{ "_id" : "60458", "city" : "JUSTICE", "loc" : [ -87.834587, 41.744709 ], "pop" : 12773, "state" : "IL" } +{ "_id" : "60459", "city" : "BURBANK", "loc" : [ -87.769907, 41.744704 ], "pop" : 27870, "state" : "IL" } +{ "_id" : "60460", "city" : "ODELL", "loc" : [ -88.515641, 41.023773 ], "pop" : 2795, "state" : "IL" } +{ "_id" : "60461", "city" : "OLYMPIA FIELDS", "loc" : [ -87.68995200000001, 41.51564 ], "pop" : 4253, "state" : "IL" } +{ "_id" : "60462", "city" : "ORLAND PARK", "loc" : [ -87.84225000000001, 41.619378 ], "pop" : 42564, "state" : "IL" } +{ "_id" : "60463", "city" : "PALOS HEIGHTS", "loc" : [ -87.792697, 41.662146 ], "pop" : 13509, "state" : "IL" } +{ "_id" : "60464", "city" : "PALOS PARK", "loc" : [ -87.852146, 41.662352 ], "pop" : 8967, "state" : "IL" } +{ "_id" : "60465", "city" : "PALOS HILLS", "loc" : [ -87.82627599999999, 41.700389 ], "pop" : 18112, "state" : "IL" } +{ "_id" : "60466", "city" : "UNIVERSITY PARK", "loc" : [ -87.682867, 41.474064 ], "pop" : 31607, "state" : "IL" } +{ "_id" : "60468", "city" : "PEOTONE", "loc" : [ -87.78968, 41.33609 ], "pop" : 4936, "state" : "IL" } +{ "_id" : "60469", "city" : "POSEN", "loc" : [ -87.687213, 41.62766 ], "pop" : 4158, "state" : "IL" } +{ "_id" : "60470", "city" : "RANSOM", "loc" : [ -88.65021400000001, 41.153048 ], "pop" : 690, "state" : "IL" } +{ "_id" : "60471", "city" : "RICHTON PARK", "loc" : [ -87.723834, 41.481854 ], "pop" : 10776, "state" : "IL" } +{ "_id" : "60472", "city" : "ROBBINS", "loc" : [ -87.70890900000001, 41.642289 ], "pop" : 7132, "state" : "IL" } +{ "_id" : "60473", "city" : "SOUTH HOLLAND", "loc" : [ -87.59381399999999, 41.597916 ], "pop" : 24457, "state" : "IL" } +{ "_id" : "60475", "city" : "STEGER", "loc" : [ -87.63858500000001, 41.468608 ], "pop" : 8531, "state" : "IL" } +{ "_id" : "60476", "city" : "THORNTON", "loc" : [ -87.607823, 41.572726 ], "pop" : 2678, "state" : "IL" } +{ "_id" : "60477", "city" : "TINLEY PARK", "loc" : [ -87.804963, 41.582535 ], "pop" : 45371, "state" : "IL" } +{ "_id" : "60478", "city" : "COUNTRY CLUB HIL", "loc" : [ -87.718452, 41.559773 ], "pop" : 16225, "state" : "IL" } +{ "_id" : "60479", "city" : "VERONA", "loc" : [ -88.51701, 41.250094 ], "pop" : 769, "state" : "IL" } +{ "_id" : "60480", "city" : "WILLOW SPRINGS", "loc" : [ -87.87858799999999, 41.736416 ], "pop" : 4469, "state" : "IL" } +{ "_id" : "60481", "city" : "CUSTER PARK", "loc" : [ -88.130083, 41.298063 ], "pop" : 11034, "state" : "IL" } +{ "_id" : "60482", "city" : "WORTH", "loc" : [ -87.786272, 41.689498 ], "pop" : 13081, "state" : "IL" } +{ "_id" : "60501", "city" : "ARGO", "loc" : [ -87.807468, 41.784245 ], "pop" : 10525, "state" : "IL" } +{ "_id" : "60504", "city" : "AURORA", "loc" : [ -88.24528100000001, 41.752269 ], "pop" : 15334, "state" : "IL" } +{ "_id" : "60505", "city" : "AURORA", "loc" : [ -88.297139, 41.758209 ], "pop" : 51422, "state" : "IL" } +{ "_id" : "60506", "city" : "AURORA", "loc" : [ -88.344582, 41.766414 ], "pop" : 42636, "state" : "IL" } +{ "_id" : "60510", "city" : "BATAVIA", "loc" : [ -88.30975599999999, 41.848165 ], "pop" : 19299, "state" : "IL" } +{ "_id" : "60511", "city" : "BIG ROCK", "loc" : [ -88.537617, 41.759308 ], "pop" : 1976, "state" : "IL" } +{ "_id" : "60512", "city" : "BRISTOL", "loc" : [ -88.401354, 41.707446 ], "pop" : 595, "state" : "IL" } +{ "_id" : "60513", "city" : "BROOKFIELD", "loc" : [ -87.84924599999999, 41.82167 ], "pop" : 18859, "state" : "IL" } +{ "_id" : "60514", "city" : "CLARENDON HILLS", "loc" : [ -87.955322, 41.779729 ], "pop" : 17321, "state" : "IL" } +{ "_id" : "60515", "city" : "DOWNERS GROVE", "loc" : [ -88.01375299999999, 41.803428 ], "pop" : 26971, "state" : "IL" } +{ "_id" : "60516", "city" : "DOWNERS GROVE", "loc" : [ -88.015873, 41.760157 ], "pop" : 35756, "state" : "IL" } +{ "_id" : "60517", "city" : "WOODRIDGE", "loc" : [ -88.04885, 41.751755 ], "pop" : 23761, "state" : "IL" } +{ "_id" : "60518", "city" : "EARLVILLE", "loc" : [ -88.910346, 41.585901 ], "pop" : 2305, "state" : "IL" } +{ "_id" : "60520", "city" : "HINCKLEY", "loc" : [ -88.644831, 41.769108 ], "pop" : 2387, "state" : "IL" } +{ "_id" : "60521", "city" : "OAK BROOK", "loc" : [ -87.940089, 41.7891 ], "pop" : 44245, "state" : "IL" } +{ "_id" : "60525", "city" : "HODGKINS", "loc" : [ -87.875252, 41.801345 ], "pop" : 45424, "state" : "IL" } +{ "_id" : "60530", "city" : "LEE", "loc" : [ -88.971386, 41.786418 ], "pop" : 825, "state" : "IL" } +{ "_id" : "60531", "city" : "LELAND", "loc" : [ -88.771574, 41.606591 ], "pop" : 1601, "state" : "IL" } +{ "_id" : "60532", "city" : "LISLE", "loc" : [ -88.0879, 41.786174 ], "pop" : 24914, "state" : "IL" } +{ "_id" : "60534", "city" : "LYONS", "loc" : [ -87.823559, 41.813016 ], "pop" : 9828, "state" : "IL" } +{ "_id" : "60538", "city" : "MONTGOMERY", "loc" : [ -88.331965, 41.717742 ], "pop" : 14146, "state" : "IL" } +{ "_id" : "60539", "city" : "MOOSEHEART", "loc" : [ -88.331532, 41.824148 ], "pop" : 371, "state" : "IL" } +{ "_id" : "60540", "city" : "NAPERVILLE", "loc" : [ -88.14103799999999, 41.766198 ], "pop" : 35414, "state" : "IL" } +{ "_id" : "60541", "city" : "NEWARK", "loc" : [ -88.527006, 41.526679 ], "pop" : 3016, "state" : "IL" } +{ "_id" : "60542", "city" : "NORTH AURORA", "loc" : [ -88.32742399999999, 41.808932 ], "pop" : 6618, "state" : "IL" } +{ "_id" : "60543", "city" : "OSWEGO", "loc" : [ -88.345305, 41.684893 ], "pop" : 9649, "state" : "IL" } +{ "_id" : "60544", "city" : "PLAINFIELD", "loc" : [ -88.19939100000001, 41.600884 ], "pop" : 10416, "state" : "IL" } +{ "_id" : "60545", "city" : "PLANO", "loc" : [ -88.53838, 41.666987 ], "pop" : 7506, "state" : "IL" } +{ "_id" : "60546", "city" : "NORTH RIVERSIDE", "loc" : [ -87.82135599999999, 41.837367 ], "pop" : 14899, "state" : "IL" } +{ "_id" : "60548", "city" : "SANDWICH", "loc" : [ -88.639303, 41.635286 ], "pop" : 10125, "state" : "IL" } +{ "_id" : "60549", "city" : "SERENA", "loc" : [ -88.75089, 41.499481 ], "pop" : 830, "state" : "IL" } +{ "_id" : "60550", "city" : "SHABBONA", "loc" : [ -88.875249, 41.763846 ], "pop" : 1180, "state" : "IL" } +{ "_id" : "60551", "city" : "SHERIDAN", "loc" : [ -88.67063400000001, 41.516428 ], "pop" : 3345, "state" : "IL" } +{ "_id" : "60552", "city" : "SOMONAUK", "loc" : [ -88.681645, 41.638289 ], "pop" : 1475, "state" : "IL" } +{ "_id" : "60553", "city" : "STEWARD", "loc" : [ -89.015086, 41.847545 ], "pop" : 661, "state" : "IL" } +{ "_id" : "60554", "city" : "SUGAR GROVE", "loc" : [ -88.43972100000001, 41.774113 ], "pop" : 4255, "state" : "IL" } +{ "_id" : "60555", "city" : "WARRENVILLE", "loc" : [ -88.19213000000001, 41.828046 ], "pop" : 12421, "state" : "IL" } +{ "_id" : "60556", "city" : "WATERMAN", "loc" : [ -88.775381, 41.750365 ], "pop" : 1914, "state" : "IL" } +{ "_id" : "60558", "city" : "WESTERN SPRINGS", "loc" : [ -87.899485, 41.804864 ], "pop" : 11862, "state" : "IL" } +{ "_id" : "60559", "city" : "WESTMONT", "loc" : [ -87.975736, 41.772848 ], "pop" : 41903, "state" : "IL" } +{ "_id" : "60560", "city" : "YORKVILLE", "loc" : [ -88.443794, 41.638725 ], "pop" : 8161, "state" : "IL" } +{ "_id" : "60563", "city" : "NAPERVILLE", "loc" : [ -88.16901, 41.78955 ], "pop" : 26348, "state" : "IL" } +{ "_id" : "60564", "city" : "NAPERVILLE", "loc" : [ -88.19524800000001, 41.704022 ], "pop" : 8549, "state" : "IL" } +{ "_id" : "60565", "city" : "NAPERVILLE", "loc" : [ -88.12824500000001, 41.732833 ], "pop" : 32693, "state" : "IL" } +{ "_id" : "60601", "city" : "CHICAGO", "loc" : [ -87.618123, 41.885847 ], "pop" : 4585, "state" : "IL" } +{ "_id" : "60602", "city" : "CHICAGO", "loc" : [ -87.632125, 41.882883 ], "pop" : 59, "state" : "IL" } +{ "_id" : "60603", "city" : "CHICAGO", "loc" : [ -87.62849900000001, 41.87985 ], "pop" : 0, "state" : "IL" } +{ "_id" : "60604", "city" : "CHICAGO", "loc" : [ -87.632999, 41.87845 ], "pop" : 3, "state" : "IL" } +{ "_id" : "60605", "city" : "CHICAGO", "loc" : [ -87.62771499999999, 41.87125 ], "pop" : 7709, "state" : "IL" } +{ "_id" : "60606", "city" : "CHICAGO", "loc" : [ -87.638648, 41.886822 ], "pop" : 58, "state" : "IL" } +{ "_id" : "60607", "city" : "CHICAGO", "loc" : [ -87.65784499999999, 41.872075 ], "pop" : 13745, "state" : "IL" } +{ "_id" : "60608", "city" : "CHICAGO", "loc" : [ -87.669444, 41.851482 ], "pop" : 84518, "state" : "IL" } +{ "_id" : "60609", "city" : "CHICAGO", "loc" : [ -87.653279, 41.809721 ], "pop" : 89762, "state" : "IL" } +{ "_id" : "60610", "city" : "CHICAGO", "loc" : [ -87.633565, 41.903294 ], "pop" : 40840, "state" : "IL" } +{ "_id" : "60611", "city" : "CHICAGO", "loc" : [ -87.62228500000001, 41.897105 ], "pop" : 22264, "state" : "IL" } +{ "_id" : "60612", "city" : "CHICAGO", "loc" : [ -87.687333, 41.880483 ], "pop" : 44363, "state" : "IL" } +{ "_id" : "60613", "city" : "CHICAGO", "loc" : [ -87.65749099999999, 41.954341 ], "pop" : 48963, "state" : "IL" } +{ "_id" : "60614", "city" : "CHICAGO", "loc" : [ -87.648295, 41.92286 ], "pop" : 61350, "state" : "IL" } +{ "_id" : "60615", "city" : "CHICAGO", "loc" : [ -87.600623, 41.802211 ], "pop" : 44137, "state" : "IL" } +{ "_id" : "60616", "city" : "CHICAGO", "loc" : [ -87.63055199999999, 41.84258 ], "pop" : 45750, "state" : "IL" } +{ "_id" : "60617", "city" : "CHICAGO", "loc" : [ -87.556012, 41.725743 ], "pop" : 98612, "state" : "IL" } +{ "_id" : "60618", "city" : "CHICAGO", "loc" : [ -87.70421399999999, 41.946401 ], "pop" : 88377, "state" : "IL" } +{ "_id" : "60619", "city" : "CHICAGO", "loc" : [ -87.60539, 41.745765 ], "pop" : 74469, "state" : "IL" } +{ "_id" : "60620", "city" : "CHICAGO", "loc" : [ -87.654251, 41.741119 ], "pop" : 92005, "state" : "IL" } +{ "_id" : "60621", "city" : "CHICAGO", "loc" : [ -87.64213599999999, 41.774993 ], "pop" : 56458, "state" : "IL" } +{ "_id" : "60622", "city" : "CHICAGO", "loc" : [ -87.67785000000001, 41.901923 ], "pop" : 74468, "state" : "IL" } +{ "_id" : "60623", "city" : "CHICAGO", "loc" : [ -87.7157, 41.849015 ], "pop" : 112047, "state" : "IL" } +{ "_id" : "60624", "city" : "CHICAGO", "loc" : [ -87.72234899999999, 41.880394 ], "pop" : 50030, "state" : "IL" } +{ "_id" : "60625", "city" : "CHICAGO", "loc" : [ -87.704157, 41.970325 ], "pop" : 83401, "state" : "IL" } +{ "_id" : "60626", "city" : "CHICAGO", "loc" : [ -87.668887, 42.009475 ], "pop" : 57320, "state" : "IL" } +{ "_id" : "60627", "city" : "RIVERDALE", "loc" : [ -87.618213, 41.645918 ], "pop" : 24996, "state" : "IL" } +{ "_id" : "60628", "city" : "CHICAGO", "loc" : [ -87.62427700000001, 41.693443 ], "pop" : 94317, "state" : "IL" } +{ "_id" : "60629", "city" : "CHICAGO", "loc" : [ -87.706936, 41.778149 ], "pop" : 91814, "state" : "IL" } +{ "_id" : "60630", "city" : "CHICAGO", "loc" : [ -87.760273, 41.969862 ], "pop" : 48371, "state" : "IL" } +{ "_id" : "60631", "city" : "CHICAGO", "loc" : [ -87.808215, 41.995145 ], "pop" : 25175, "state" : "IL" } +{ "_id" : "60632", "city" : "CHICAGO", "loc" : [ -87.70518, 41.809274 ], "pop" : 62368, "state" : "IL" } +{ "_id" : "60633", "city" : "BURNHAM", "loc" : [ -87.54948899999999, 41.649791 ], "pop" : 12367, "state" : "IL" } +{ "_id" : "60634", "city" : "NORRIDGE", "loc" : [ -87.796054, 41.945213 ], "pop" : 69160, "state" : "IL" } +{ "_id" : "60635", "city" : "ELMWOOD PARK", "loc" : [ -87.808593, 41.922907 ], "pop" : 38056, "state" : "IL" } +{ "_id" : "60636", "city" : "CHICAGO", "loc" : [ -87.667368, 41.775989 ], "pop" : 58048, "state" : "IL" } +{ "_id" : "60637", "city" : "CHICAGO", "loc" : [ -87.605097, 41.781312 ], "pop" : 59637, "state" : "IL" } +{ "_id" : "60638", "city" : "BEDFORD PARK", "loc" : [ -87.77192700000001, 41.789703 ], "pop" : 53145, "state" : "IL" } +{ "_id" : "60639", "city" : "CHICAGO", "loc" : [ -87.753502, 41.920162 ], "pop" : 74209, "state" : "IL" } +{ "_id" : "60640", "city" : "CHICAGO", "loc" : [ -87.66240500000001, 41.971928 ], "pop" : 76829, "state" : "IL" } +{ "_id" : "60641", "city" : "CHICAGO", "loc" : [ -87.747376, 41.945333 ], "pop" : 59870, "state" : "IL" } +{ "_id" : "60642", "city" : "EVERGREEN PARK", "loc" : [ -87.70172100000001, 41.718765 ], "pop" : 24016, "state" : "IL" } +{ "_id" : "60643", "city" : "CALUMET PARK", "loc" : [ -87.65944500000001, 41.693243 ], "pop" : 63953, "state" : "IL" } +{ "_id" : "60644", "city" : "CHICAGO", "loc" : [ -87.758163, 41.882913 ], "pop" : 57376, "state" : "IL" } +{ "_id" : "60645", "city" : "LINCOLNWOOD", "loc" : [ -87.6962, 42.007718 ], "pop" : 43829, "state" : "IL" } +{ "_id" : "60646", "city" : "LINCOLNWOOD", "loc" : [ -87.75917200000001, 41.996414 ], "pop" : 32075, "state" : "IL" } +{ "_id" : "60647", "city" : "CHICAGO", "loc" : [ -87.704322, 41.920903 ], "pop" : 95971, "state" : "IL" } +{ "_id" : "60648", "city" : "CHICAGO", "loc" : [ -87.81636, 42.031101 ], "pop" : 30924, "state" : "IL" } +{ "_id" : "60649", "city" : "CHICAGO", "loc" : [ -87.570252, 41.761968 ], "pop" : 54795, "state" : "IL" } +{ "_id" : "60650", "city" : "CICERO", "loc" : [ -87.76008, 41.84776 ], "pop" : 67670, "state" : "IL" } +{ "_id" : "60651", "city" : "CHICAGO", "loc" : [ -87.739307, 41.902509 ], "pop" : 78082, "state" : "IL" } +{ "_id" : "60652", "city" : "CHICAGO", "loc" : [ -87.713516, 41.745393 ], "pop" : 36337, "state" : "IL" } +{ "_id" : "60653", "city" : "CHICAGO", "loc" : [ -87.612605, 41.819645 ], "pop" : 40091, "state" : "IL" } +{ "_id" : "60654", "city" : "CHICAGO", "loc" : [ -87.63529200000001, 41.888533 ], "pop" : 0, "state" : "IL" } +{ "_id" : "60655", "city" : "MERRIONETTE PARK", "loc" : [ -87.70218800000001, 41.693033 ], "pop" : 29847, "state" : "IL" } +{ "_id" : "60656", "city" : "HARWOOD HEIGHTS", "loc" : [ -87.819981, 41.971844 ], "pop" : 43597, "state" : "IL" } +{ "_id" : "60657", "city" : "CHICAGO", "loc" : [ -87.652805, 41.93992 ], "pop" : 65533, "state" : "IL" } +{ "_id" : "60658", "city" : "ALSIP", "loc" : [ -87.729967, 41.671505 ], "pop" : 16461, "state" : "IL" } +{ "_id" : "60659", "city" : "LINCOLNWOOD", "loc" : [ -87.700823, 41.991687 ], "pop" : 35461, "state" : "IL" } +{ "_id" : "60660", "city" : "CHICAGO", "loc" : [ -87.662856, 41.990879 ], "pop" : 45106, "state" : "IL" } +{ "_id" : "60661", "city" : "CHICAGO", "loc" : [ -87.64296899999999, 41.881351 ], "pop" : 2031, "state" : "IL" } +{ "_id" : "60666", "city" : "AMF OHARE", "loc" : [ -87.906803, 41.9821 ], "pop" : 262, "state" : "IL" } +{ "_id" : "60901", "city" : "KANKAKEE", "loc" : [ -87.869607, 41.116582 ], "pop" : 35952, "state" : "IL" } +{ "_id" : "60910", "city" : "AROMA PARK", "loc" : [ -87.77188700000001, 41.094653 ], "pop" : 3151, "state" : "IL" } +{ "_id" : "60911", "city" : "ASHKUM", "loc" : [ -87.941148, 40.884431 ], "pop" : 1484, "state" : "IL" } +{ "_id" : "60912", "city" : "BEAVERVILLE", "loc" : [ -87.62171499999999, 40.967164 ], "pop" : 672, "state" : "IL" } +{ "_id" : "60913", "city" : "BONFIELD", "loc" : [ -88.061854, 41.15731 ], "pop" : 1189, "state" : "IL" } +{ "_id" : "60914", "city" : "BOURBONNAIS", "loc" : [ -87.879023, 41.166119 ], "pop" : 18311, "state" : "IL" } +{ "_id" : "60915", "city" : "BRADLEY", "loc" : [ -87.86011499999999, 41.145376 ], "pop" : 10071, "state" : "IL" } +{ "_id" : "60917", "city" : "BUCKINGHAM", "loc" : [ -88.177156, 41.043316 ], "pop" : 557, "state" : "IL" } +{ "_id" : "60918", "city" : "BUCKLEY", "loc" : [ -88.036092, 40.601827 ], "pop" : 875, "state" : "IL" } +{ "_id" : "60919", "city" : "CABERY", "loc" : [ -88.19208500000001, 40.981895 ], "pop" : 510, "state" : "IL" } +{ "_id" : "60921", "city" : "CHATSWORTH", "loc" : [ -88.293662, 40.748441 ], "pop" : 1703, "state" : "IL" } +{ "_id" : "60922", "city" : "CHEBANSE", "loc" : [ -87.895917, 41.02541 ], "pop" : 3580, "state" : "IL" } +{ "_id" : "60924", "city" : "CISSNA PARK", "loc" : [ -87.87588, 40.585814 ], "pop" : 2282, "state" : "IL" } +{ "_id" : "60927", "city" : "CLIFTON", "loc" : [ -87.920237, 40.939444 ], "pop" : 2033, "state" : "IL" } +{ "_id" : "60928", "city" : "CRESCENT CITY", "loc" : [ -87.83703, 40.7682 ], "pop" : 1271, "state" : "IL" } +{ "_id" : "60929", "city" : "CULLOM", "loc" : [ -88.276476, 40.878066 ], "pop" : 782, "state" : "IL" } +{ "_id" : "60930", "city" : "DANFORTH", "loc" : [ -87.986824, 40.82443 ], "pop" : 959, "state" : "IL" } +{ "_id" : "60931", "city" : "DONOVAN", "loc" : [ -87.604635, 40.889074 ], "pop" : 613, "state" : "IL" } +{ "_id" : "60934", "city" : "EMINGTON", "loc" : [ -88.321135, 40.978317 ], "pop" : 330, "state" : "IL" } +{ "_id" : "60935", "city" : "ESSEX", "loc" : [ -88.184528, 41.167644 ], "pop" : 994, "state" : "IL" } +{ "_id" : "60936", "city" : "GIBSON CITY", "loc" : [ -88.360873, 40.465932 ], "pop" : 4608, "state" : "IL" } +{ "_id" : "60938", "city" : "GILMAN", "loc" : [ -87.993336, 40.767987 ], "pop" : 2125, "state" : "IL" } +{ "_id" : "60940", "city" : "GRANT PARK", "loc" : [ -87.647992, 41.247677 ], "pop" : 3009, "state" : "IL" } +{ "_id" : "60941", "city" : "HERSCHER", "loc" : [ -88.085801, 41.046441 ], "pop" : 2138, "state" : "IL" } +{ "_id" : "60942", "city" : "HOOPESTON", "loc" : [ -87.666229, 40.463873 ], "pop" : 6600, "state" : "IL" } +{ "_id" : "60946", "city" : "KEMPTON", "loc" : [ -88.209013, 40.912604 ], "pop" : 462, "state" : "IL" } +{ "_id" : "60948", "city" : "LODA", "loc" : [ -88.092675, 40.524097 ], "pop" : 1474, "state" : "IL" } +{ "_id" : "60949", "city" : "LUDLOW", "loc" : [ -88.13796499999999, 40.374736 ], "pop" : 832, "state" : "IL" } +{ "_id" : "60950", "city" : "MANTENO", "loc" : [ -87.846761, 41.251439 ], "pop" : 5673, "state" : "IL" } +{ "_id" : "60951", "city" : "MARTINTON", "loc" : [ -87.744257, 40.905233 ], "pop" : 1004, "state" : "IL" } +{ "_id" : "60952", "city" : "MELVIN", "loc" : [ -88.255078, 40.571379 ], "pop" : 654, "state" : "IL" } +{ "_id" : "60953", "city" : "MILFORD", "loc" : [ -87.685332, 40.629253 ], "pop" : 2367, "state" : "IL" } +{ "_id" : "60954", "city" : "MOMENCE", "loc" : [ -87.657515, 41.159308 ], "pop" : 6804, "state" : "IL" } +{ "_id" : "60955", "city" : "ONARGA", "loc" : [ -87.995841, 40.712005 ], "pop" : 1678, "state" : "IL" } +{ "_id" : "60957", "city" : "PAXTON", "loc" : [ -88.098989, 40.456546 ], "pop" : 5226, "state" : "IL" } +{ "_id" : "60959", "city" : "PIPER CITY", "loc" : [ -88.187347, 40.755615 ], "pop" : 1187, "state" : "IL" } +{ "_id" : "60960", "city" : "RANKIN", "loc" : [ -87.888355, 40.455911 ], "pop" : 1697, "state" : "IL" } +{ "_id" : "60961", "city" : "REDDICK", "loc" : [ -88.208928, 41.10053 ], "pop" : 480, "state" : "IL" } +{ "_id" : "60962", "city" : "ROBERTS", "loc" : [ -88.180414, 40.619333 ], "pop" : 617, "state" : "IL" } +{ "_id" : "60963", "city" : "ROSSVILLE", "loc" : [ -87.66918099999999, 40.362548 ], "pop" : 2082, "state" : "IL" } +{ "_id" : "60964", "city" : "SAINT ANNE", "loc" : [ -87.656363, 41.048725 ], "pop" : 6081, "state" : "IL" } +{ "_id" : "60966", "city" : "SHELDON", "loc" : [ -87.57364, 40.780288 ], "pop" : 1966, "state" : "IL" } +{ "_id" : "60968", "city" : "THAWVILLE", "loc" : [ -88.09993, 40.684011 ], "pop" : 374, "state" : "IL" } +{ "_id" : "60970", "city" : "WATSEKA", "loc" : [ -87.730932, 40.773351 ], "pop" : 7072, "state" : "IL" } +{ "_id" : "60973", "city" : "WELLINGTON", "loc" : [ -87.65607, 40.53394 ], "pop" : 782, "state" : "IL" } +{ "_id" : "61001", "city" : "APPLE RIVER", "loc" : [ -90.12014499999999, 42.471432 ], "pop" : 1010, "state" : "IL" } +{ "_id" : "61006", "city" : "ASHTON", "loc" : [ -89.2086, 41.864327 ], "pop" : 1911, "state" : "IL" } +{ "_id" : "61007", "city" : "BAILEYVILLE", "loc" : [ -89.593937, 42.190465 ], "pop" : 430, "state" : "IL" } +{ "_id" : "61008", "city" : "BELVIDERE", "loc" : [ -88.850943, 42.259465 ], "pop" : 22199, "state" : "IL" } +{ "_id" : "61010", "city" : "BYRON", "loc" : [ -89.26588700000001, 42.129236 ], "pop" : 4894, "state" : "IL" } +{ "_id" : "61011", "city" : "CALEDONIA", "loc" : [ -88.91845600000001, 42.38346 ], "pop" : 2086, "state" : "IL" } +{ "_id" : "61012", "city" : "CAPRON", "loc" : [ -88.74651799999999, 42.408659 ], "pop" : 1893, "state" : "IL" } +{ "_id" : "61014", "city" : "CHADWICK", "loc" : [ -89.896278, 41.996205 ], "pop" : 1252, "state" : "IL" } +{ "_id" : "61015", "city" : "CHANA", "loc" : [ -89.211693, 41.993343 ], "pop" : 1167, "state" : "IL" } +{ "_id" : "61016", "city" : "CHERRY VALLEY", "loc" : [ -88.961923, 42.220562 ], "pop" : 3768, "state" : "IL" } +{ "_id" : "61018", "city" : "DAKOTA", "loc" : [ -89.54678199999999, 42.403078 ], "pop" : 1134, "state" : "IL" } +{ "_id" : "61019", "city" : "DAVIS", "loc" : [ -89.406721, 42.442157 ], "pop" : 2337, "state" : "IL" } +{ "_id" : "61020", "city" : "DAVIS JUNCTION", "loc" : [ -89.083838, 42.09792 ], "pop" : 1263, "state" : "IL" } +{ "_id" : "61021", "city" : "DIXON", "loc" : [ -89.48930300000001, 41.847797 ], "pop" : 22293, "state" : "IL" } +{ "_id" : "61024", "city" : "DURAND", "loc" : [ -89.309378, 42.433653 ], "pop" : 2633, "state" : "IL" } +{ "_id" : "61025", "city" : "EAST DUBUQUE", "loc" : [ -90.604597, 42.487488 ], "pop" : 4999, "state" : "IL" } +{ "_id" : "61028", "city" : "ELIZABETH", "loc" : [ -90.19862000000001, 42.308942 ], "pop" : 1951, "state" : "IL" } +{ "_id" : "61030", "city" : "FORRESTON", "loc" : [ -89.583124, 42.122924 ], "pop" : 2261, "state" : "IL" } +{ "_id" : "61031", "city" : "FRANKLIN GROVE", "loc" : [ -89.31711199999999, 41.857968 ], "pop" : 2070, "state" : "IL" } +{ "_id" : "61032", "city" : "FREEPORT", "loc" : [ -89.63452100000001, 42.299148 ], "pop" : 33259, "state" : "IL" } +{ "_id" : "61036", "city" : "GALENA", "loc" : [ -90.41950900000001, 42.418233 ], "pop" : 5479, "state" : "IL" } +{ "_id" : "61038", "city" : "GARDEN PRAIRIE", "loc" : [ -88.74366999999999, 42.250983 ], "pop" : 1584, "state" : "IL" } +{ "_id" : "61039", "city" : "GERMAN VALLEY", "loc" : [ -89.47115100000001, 42.21761 ], "pop" : 1003, "state" : "IL" } +{ "_id" : "61041", "city" : "HANOVER", "loc" : [ -90.28970700000001, 42.259405 ], "pop" : 1559, "state" : "IL" } +{ "_id" : "61042", "city" : "HARMON", "loc" : [ -89.569513, 41.697296 ], "pop" : 793, "state" : "IL" } +{ "_id" : "61044", "city" : "KENT", "loc" : [ -89.919489, 42.315528 ], "pop" : 425, "state" : "IL" } +{ "_id" : "61045", "city" : "KINGS", "loc" : [ -89.09968499999999, 42.013987 ], "pop" : 377, "state" : "IL" } +{ "_id" : "61046", "city" : "LANARK", "loc" : [ -89.824732, 42.093534 ], "pop" : 1843, "state" : "IL" } +{ "_id" : "61047", "city" : "EGAN", "loc" : [ -89.40102400000001, 42.140975 ], "pop" : 1804, "state" : "IL" } +{ "_id" : "61048", "city" : "LENA", "loc" : [ -89.82525099999999, 42.379054 ], "pop" : 4251, "state" : "IL" } +{ "_id" : "61049", "city" : "LINDENWOOD", "loc" : [ -89.033979, 42.050741 ], "pop" : 351, "state" : "IL" } +{ "_id" : "61050", "city" : "MC CONNELL", "loc" : [ -89.741545, 42.439511 ], "pop" : 357, "state" : "IL" } +{ "_id" : "61051", "city" : "MILLEDGEVILLE", "loc" : [ -89.78012099999999, 41.96737 ], "pop" : 1526, "state" : "IL" } +{ "_id" : "61052", "city" : "MONROE CENTER", "loc" : [ -89.016946, 42.10501 ], "pop" : 1327, "state" : "IL" } +{ "_id" : "61053", "city" : "MOUNT CARROLL", "loc" : [ -89.984454, 42.105308 ], "pop" : 3529, "state" : "IL" } +{ "_id" : "61054", "city" : "MOUNT MORRIS", "loc" : [ -89.434614, 42.047903 ], "pop" : 4169, "state" : "IL" } +{ "_id" : "61060", "city" : "ORANGEVILLE", "loc" : [ -89.644757, 42.472779 ], "pop" : 1318, "state" : "IL" } +{ "_id" : "61061", "city" : "OREGON", "loc" : [ -89.344364, 42.009512 ], "pop" : 6482, "state" : "IL" } +{ "_id" : "61062", "city" : "PEARL CITY", "loc" : [ -89.83932900000001, 42.260972 ], "pop" : 1987, "state" : "IL" } +{ "_id" : "61063", "city" : "PECATONICA", "loc" : [ -89.34722499999999, 42.305111 ], "pop" : 3554, "state" : "IL" } +{ "_id" : "61064", "city" : "POLO", "loc" : [ -89.598358, 41.98895 ], "pop" : 4524, "state" : "IL" } +{ "_id" : "61065", "city" : "POPLAR GROVE", "loc" : [ -88.84277400000001, 42.359365 ], "pop" : 2593, "state" : "IL" } +{ "_id" : "61067", "city" : "RIDOTT", "loc" : [ -89.462664, 42.299607 ], "pop" : 750, "state" : "IL" } +{ "_id" : "61068", "city" : "ROCHELLE", "loc" : [ -89.07103499999999, 41.928156 ], "pop" : 12890, "state" : "IL" } +{ "_id" : "61070", "city" : "ROCK CITY", "loc" : [ -89.47590099999999, 42.410345 ], "pop" : 1420, "state" : "IL" } +{ "_id" : "61071", "city" : "ROCK FALLS", "loc" : [ -89.69247300000001, 41.766525 ], "pop" : 14548, "state" : "IL" } +{ "_id" : "61072", "city" : "ROCKTON", "loc" : [ -89.08874400000001, 42.454371 ], "pop" : 6514, "state" : "IL" } +{ "_id" : "61073", "city" : "ROSCOE", "loc" : [ -88.99433000000001, 42.421659 ], "pop" : 10391, "state" : "IL" } +{ "_id" : "61074", "city" : "SAVANNA", "loc" : [ -90.140061, 42.095581 ], "pop" : 4943, "state" : "IL" } +{ "_id" : "61075", "city" : "SCALES MOUND", "loc" : [ -90.258033, 42.471548 ], "pop" : 909, "state" : "IL" } +{ "_id" : "61078", "city" : "SHANNON", "loc" : [ -89.748075, 42.161049 ], "pop" : 1753, "state" : "IL" } +{ "_id" : "61080", "city" : "SOUTH BELOIT", "loc" : [ -89.029791, 42.483672 ], "pop" : 6833, "state" : "IL" } +{ "_id" : "61081", "city" : "STERLING", "loc" : [ -89.70538999999999, 41.805511 ], "pop" : 22261, "state" : "IL" } +{ "_id" : "61084", "city" : "STILLMAN VALLEY", "loc" : [ -89.189762, 42.11835 ], "pop" : 2772, "state" : "IL" } +{ "_id" : "61085", "city" : "STOCKTON", "loc" : [ -90.020185, 42.349224 ], "pop" : 3489, "state" : "IL" } +{ "_id" : "61087", "city" : "WARREN", "loc" : [ -89.985992, 42.489001 ], "pop" : 1967, "state" : "IL" } +{ "_id" : "61088", "city" : "WINNEBAGO", "loc" : [ -89.23731600000001, 42.272723 ], "pop" : 4059, "state" : "IL" } +{ "_id" : "61089", "city" : "WINSLOW", "loc" : [ -89.806028, 42.48383 ], "pop" : 887, "state" : "IL" } +{ "_id" : "61101", "city" : "ROCKFORD", "loc" : [ -89.116118, 42.292233 ], "pop" : 23908, "state" : "IL" } +{ "_id" : "61102", "city" : "ROCKFORD", "loc" : [ -89.124695, 42.254669 ], "pop" : 19427, "state" : "IL" } +{ "_id" : "61103", "city" : "ROCKFORD", "loc" : [ -89.083326, 42.300986 ], "pop" : 24143, "state" : "IL" } +{ "_id" : "61104", "city" : "ROCKFORD", "loc" : [ -89.076779, 42.255355 ], "pop" : 19912, "state" : "IL" } +{ "_id" : "61107", "city" : "ROCKFORD", "loc" : [ -89.036107, 42.278629 ], "pop" : 28879, "state" : "IL" } +{ "_id" : "61108", "city" : "ROCKFORD", "loc" : [ -89.02351899999999, 42.251406 ], "pop" : 25501, "state" : "IL" } +{ "_id" : "61109", "city" : "ROCKFORD", "loc" : [ -89.05118, 42.216581 ], "pop" : 25246, "state" : "IL" } +{ "_id" : "61111", "city" : "LOVES PARK", "loc" : [ -89.03352099999999, 42.32952 ], "pop" : 47733, "state" : "IL" } +{ "_id" : "61112", "city" : "ROCKFORD", "loc" : [ -88.970429, 42.245639 ], "pop" : 15, "state" : "IL" } +{ "_id" : "61201", "city" : "ROCK ISLAND", "loc" : [ -90.564796, 41.491317 ], "pop" : 37799, "state" : "IL" } +{ "_id" : "61230", "city" : "ALBANY", "loc" : [ -90.208051, 41.765874 ], "pop" : 1287, "state" : "IL" } +{ "_id" : "61231", "city" : "ALEDO", "loc" : [ -90.741629, 41.20078 ], "pop" : 5189, "state" : "IL" } +{ "_id" : "61232", "city" : "ANDALUSIA", "loc" : [ -90.728385, 41.435324 ], "pop" : 1899, "state" : "IL" } +{ "_id" : "61234", "city" : "ANNAWAN", "loc" : [ -89.912949, 41.398022 ], "pop" : 1432, "state" : "IL" } +{ "_id" : "61235", "city" : "ATKINSON", "loc" : [ -90.022482, 41.41619 ], "pop" : 1619, "state" : "IL" } +{ "_id" : "61238", "city" : "CAMBRIDGE", "loc" : [ -90.18048, 41.311379 ], "pop" : 3265, "state" : "IL" } +{ "_id" : "61240", "city" : "COAL VALLEY", "loc" : [ -90.46517900000001, 41.435143 ], "pop" : 5435, "state" : "IL" } +{ "_id" : "61241", "city" : "GREEN ROCK", "loc" : [ -90.349231, 41.475224 ], "pop" : 7809, "state" : "IL" } +{ "_id" : "61242", "city" : "CORDOVA", "loc" : [ -90.307121, 41.69278 ], "pop" : 954, "state" : "IL" } +{ "_id" : "61243", "city" : "DEER GROVE", "loc" : [ -89.6972, 41.631599 ], "pop" : 393, "state" : "IL" } +{ "_id" : "61244", "city" : "EAST MOLINE", "loc" : [ -90.432118, 41.511804 ], "pop" : 24023, "state" : "IL" } +{ "_id" : "61250", "city" : "ERIE", "loc" : [ -90.084264, 41.655958 ], "pop" : 2428, "state" : "IL" } +{ "_id" : "61251", "city" : "FENTON", "loc" : [ -90.04568500000001, 41.728495 ], "pop" : 289, "state" : "IL" } +{ "_id" : "61252", "city" : "FULTON", "loc" : [ -90.15065300000001, 41.8522 ], "pop" : 5743, "state" : "IL" } +{ "_id" : "61254", "city" : "GENESEO", "loc" : [ -90.171127, 41.46881 ], "pop" : 10023, "state" : "IL" } +{ "_id" : "61256", "city" : "HAMPTON", "loc" : [ -90.323037, 41.541805 ], "pop" : 538, "state" : "IL" } +{ "_id" : "61257", "city" : "HILLSDALE", "loc" : [ -90.22625499999999, 41.592896 ], "pop" : 1807, "state" : "IL" } +{ "_id" : "61259", "city" : "ILLINOIS CITY", "loc" : [ -90.89250699999999, 41.389236 ], "pop" : 1553, "state" : "IL" } +{ "_id" : "61260", "city" : "JOY", "loc" : [ -90.85175700000001, 41.226198 ], "pop" : 1185, "state" : "IL" } +{ "_id" : "61261", "city" : "LYNDON", "loc" : [ -89.916865, 41.719933 ], "pop" : 936, "state" : "IL" } +{ "_id" : "61262", "city" : "LYNN CENTER", "loc" : [ -90.330444, 41.288761 ], "pop" : 1694, "state" : "IL" } +{ "_id" : "61263", "city" : "MATHERVILLE", "loc" : [ -90.602343, 41.269075 ], "pop" : 1409, "state" : "IL" } +{ "_id" : "61264", "city" : "MILAN", "loc" : [ -90.57393500000001, 41.426197 ], "pop" : 14565, "state" : "IL" } +{ "_id" : "61265", "city" : "MOLINE", "loc" : [ -90.497968, 41.490609 ], "pop" : 45240, "state" : "IL" } +{ "_id" : "61270", "city" : "MORRISON", "loc" : [ -89.96899500000001, 41.816664 ], "pop" : 7580, "state" : "IL" } +{ "_id" : "61272", "city" : "NEW BOSTON", "loc" : [ -90.98786, 41.215259 ], "pop" : 1663, "state" : "IL" } +{ "_id" : "61273", "city" : "ORION", "loc" : [ -90.384929, 41.363367 ], "pop" : 3121, "state" : "IL" } +{ "_id" : "61274", "city" : "OSCO", "loc" : [ -90.26809299999999, 41.363674 ], "pop" : 538, "state" : "IL" } +{ "_id" : "61275", "city" : "PORT BYRON", "loc" : [ -90.326291, 41.601346 ], "pop" : 3441, "state" : "IL" } +{ "_id" : "61277", "city" : "PROPHETSTOWN", "loc" : [ -89.946665, 41.631223 ], "pop" : 3736, "state" : "IL" } +{ "_id" : "61279", "city" : "REYNOLDS", "loc" : [ -90.638367, 41.327675 ], "pop" : 944, "state" : "IL" } +{ "_id" : "61281", "city" : "SHERRARD", "loc" : [ -90.493863, 41.302669 ], "pop" : 2192, "state" : "IL" } +{ "_id" : "61282", "city" : "SILVIS", "loc" : [ -90.412609, 41.500677 ], "pop" : 9832, "state" : "IL" } +{ "_id" : "61283", "city" : "TAMPICO", "loc" : [ -89.794793, 41.652158 ], "pop" : 1753, "state" : "IL" } +{ "_id" : "61284", "city" : "TAYLOR RIDGE", "loc" : [ -90.734047, 41.382755 ], "pop" : 1090, "state" : "IL" } +{ "_id" : "61285", "city" : "THOMSON", "loc" : [ -90.08444299999999, 41.981626 ], "pop" : 1868, "state" : "IL" } +{ "_id" : "61301", "city" : "LA SALLE", "loc" : [ -89.095468, 41.344221 ], "pop" : 10188, "state" : "IL" } +{ "_id" : "61310", "city" : "AMBOY", "loc" : [ -89.34716, 41.704181 ], "pop" : 3994, "state" : "IL" } +{ "_id" : "61311", "city" : "ANCONA", "loc" : [ -88.76603900000001, 41.055118 ], "pop" : 38, "state" : "IL" } +{ "_id" : "61312", "city" : "ARLINGTON", "loc" : [ -89.221949, 41.443669 ], "pop" : 1044, "state" : "IL" } +{ "_id" : "61313", "city" : "BLACKSTONE", "loc" : [ -88.649782, 41.071945 ], "pop" : 258, "state" : "IL" } +{ "_id" : "61314", "city" : "BUDA", "loc" : [ -89.67947599999999, 41.313973 ], "pop" : 931, "state" : "IL" } +{ "_id" : "61318", "city" : "COMPTON", "loc" : [ -89.08770800000001, 41.684976 ], "pop" : 551, "state" : "IL" } +{ "_id" : "61319", "city" : "MANVILLE", "loc" : [ -88.742694, 40.985827 ], "pop" : 968, "state" : "IL" } +{ "_id" : "61320", "city" : "DALZELL", "loc" : [ -89.20326900000001, 41.373077 ], "pop" : 2255, "state" : "IL" } +{ "_id" : "61321", "city" : "DANA", "loc" : [ -88.962793, 40.954675 ], "pop" : 257, "state" : "IL" } +{ "_id" : "61325", "city" : "GRAND RIDGE", "loc" : [ -88.816836, 41.238621 ], "pop" : 1179, "state" : "IL" } +{ "_id" : "61326", "city" : "GRANVILLE", "loc" : [ -89.22502900000001, 41.264212 ], "pop" : 2784, "state" : "IL" } +{ "_id" : "61327", "city" : "HENNEPIN", "loc" : [ -89.321791, 41.235154 ], "pop" : 1111, "state" : "IL" } +{ "_id" : "61330", "city" : "LA MOILLE", "loc" : [ -89.29702399999999, 41.537557 ], "pop" : 1315, "state" : "IL" } +{ "_id" : "61332", "city" : "LEONORE", "loc" : [ -88.99693600000001, 41.166368 ], "pop" : 437, "state" : "IL" } +{ "_id" : "61333", "city" : "LONG POINT", "loc" : [ -88.881106, 40.989553 ], "pop" : 541, "state" : "IL" } +{ "_id" : "61334", "city" : "LOSTANT", "loc" : [ -89.075031, 41.145007 ], "pop" : 747, "state" : "IL" } +{ "_id" : "61335", "city" : "MC NABB", "loc" : [ -89.218664, 41.173026 ], "pop" : 747, "state" : "IL" } +{ "_id" : "61336", "city" : "MAGNOLIA", "loc" : [ -89.22701000000001, 41.116374 ], "pop" : 519, "state" : "IL" } +{ "_id" : "61337", "city" : "MALDEN", "loc" : [ -89.36761, 41.437743 ], "pop" : 1109, "state" : "IL" } +{ "_id" : "61341", "city" : "MARSEILLES", "loc" : [ -88.694678, 41.330201 ], "pop" : 7360, "state" : "IL" } +{ "_id" : "61342", "city" : "MENDOTA", "loc" : [ -89.10827999999999, 41.544308 ], "pop" : 9660, "state" : "IL" } +{ "_id" : "61344", "city" : "MINERAL", "loc" : [ -89.820087, 41.403556 ], "pop" : 648, "state" : "IL" } +{ "_id" : "61345", "city" : "NEPONSET", "loc" : [ -89.794382, 41.290457 ], "pop" : 819, "state" : "IL" } +{ "_id" : "61346", "city" : "NEW BEDFORD", "loc" : [ -89.778558, 41.540883 ], "pop" : 641, "state" : "IL" } +{ "_id" : "61348", "city" : "OGLESBY", "loc" : [ -89.055341, 41.292768 ], "pop" : 5323, "state" : "IL" } +{ "_id" : "61349", "city" : "OHIO", "loc" : [ -89.45741099999999, 41.537149 ], "pop" : 1031, "state" : "IL" } +{ "_id" : "61350", "city" : "OTTAWA", "loc" : [ -88.841589, 41.352619 ], "pop" : 23727, "state" : "IL" } +{ "_id" : "61353", "city" : "PAW PAW", "loc" : [ -88.967377, 41.685228 ], "pop" : 1539, "state" : "IL" } +{ "_id" : "61354", "city" : "PERU", "loc" : [ -89.12647800000001, 41.333021 ], "pop" : 10050, "state" : "IL" } +{ "_id" : "61356", "city" : "PRINCETON", "loc" : [ -89.42701700000001, 41.362934 ], "pop" : 12333, "state" : "IL" } +{ "_id" : "61358", "city" : "RUTLAND", "loc" : [ -89.03882900000001, 40.984407 ], "pop" : 629, "state" : "IL" } +{ "_id" : "61360", "city" : "SENECA", "loc" : [ -88.610013, 41.315248 ], "pop" : 2246, "state" : "IL" } +{ "_id" : "61361", "city" : "SHEFFIELD", "loc" : [ -89.711502, 41.394876 ], "pop" : 1964, "state" : "IL" } +{ "_id" : "61362", "city" : "SPRING VALLEY", "loc" : [ -89.20417, 41.327923 ], "pop" : 5541, "state" : "IL" } +{ "_id" : "61364", "city" : "STREATOR", "loc" : [ -88.83067200000001, 41.12249 ], "pop" : 22239, "state" : "IL" } +{ "_id" : "61367", "city" : "SUBLETTE", "loc" : [ -89.235409, 41.633144 ], "pop" : 899, "state" : "IL" } +{ "_id" : "61368", "city" : "TISKILWA", "loc" : [ -89.50796800000001, 41.289055 ], "pop" : 1587, "state" : "IL" } +{ "_id" : "61369", "city" : "TOLUCA", "loc" : [ -89.13481, 41.004553 ], "pop" : 1755, "state" : "IL" } +{ "_id" : "61370", "city" : "TONICA", "loc" : [ -89.088993, 41.232741 ], "pop" : 1409, "state" : "IL" } +{ "_id" : "61373", "city" : "UTICA", "loc" : [ -89.000795, 41.363033 ], "pop" : 1926, "state" : "IL" } +{ "_id" : "61375", "city" : "VARNA", "loc" : [ -89.24833099999999, 41.032723 ], "pop" : 1527, "state" : "IL" } +{ "_id" : "61376", "city" : "NORMANDY", "loc" : [ -89.592237, 41.553035 ], "pop" : 2050, "state" : "IL" } +{ "_id" : "61377", "city" : "WENONA", "loc" : [ -89.04163699999999, 41.054846 ], "pop" : 1410, "state" : "IL" } +{ "_id" : "61378", "city" : "WEST BROOKLYN", "loc" : [ -89.190917, 41.729156 ], "pop" : 946, "state" : "IL" } +{ "_id" : "61379", "city" : "WYANET", "loc" : [ -89.574423, 41.378452 ], "pop" : 1799, "state" : "IL" } +{ "_id" : "61401", "city" : "GALESBURG", "loc" : [ -90.36980699999999, 40.952138 ], "pop" : 36161, "state" : "IL" } +{ "_id" : "61410", "city" : "ABINGDON", "loc" : [ -90.400898, 40.802312 ], "pop" : 4241, "state" : "IL" } +{ "_id" : "61411", "city" : "ADAIR", "loc" : [ -90.503742, 40.385197 ], "pop" : 731, "state" : "IL" } +{ "_id" : "61412", "city" : "ALEXIS", "loc" : [ -90.543576, 41.052146 ], "pop" : 1866, "state" : "IL" } +{ "_id" : "61413", "city" : "ALPHA", "loc" : [ -90.382081, 41.193029 ], "pop" : 1152, "state" : "IL" } +{ "_id" : "61414", "city" : "ALTONA", "loc" : [ -90.159826, 41.112828 ], "pop" : 813, "state" : "IL" } +{ "_id" : "61415", "city" : "AVON", "loc" : [ -90.44605300000001, 40.654947 ], "pop" : 2125, "state" : "IL" } +{ "_id" : "61416", "city" : "BARDOLPH", "loc" : [ -90.502495, 40.498078 ], "pop" : 365, "state" : "IL" } +{ "_id" : "61417", "city" : "BERWICK", "loc" : [ -90.50591300000001, 40.779911 ], "pop" : 461, "state" : "IL" } +{ "_id" : "61418", "city" : "BIGGSVILLE", "loc" : [ -90.85605700000001, 40.853122 ], "pop" : 627, "state" : "IL" } +{ "_id" : "61420", "city" : "BLANDINSVILLE", "loc" : [ -90.859521, 40.551585 ], "pop" : 1272, "state" : "IL" } +{ "_id" : "61421", "city" : "BRADFORD", "loc" : [ -89.65207700000001, 41.15323 ], "pop" : 2071, "state" : "IL" } +{ "_id" : "61422", "city" : "BUSHNELL", "loc" : [ -90.506027, 40.553916 ], "pop" : 3511, "state" : "IL" } +{ "_id" : "61423", "city" : "CAMERON", "loc" : [ -90.50013, 40.888963 ], "pop" : 969, "state" : "IL" } +{ "_id" : "61425", "city" : "CARMAN", "loc" : [ -91.05639600000001, 40.755054 ], "pop" : 398, "state" : "IL" } +{ "_id" : "61427", "city" : "CUBA", "loc" : [ -90.181055, 40.4995 ], "pop" : 2169, "state" : "IL" } +{ "_id" : "61428", "city" : "DAHINDA", "loc" : [ -90.139808, 40.95508 ], "pop" : 710, "state" : "IL" } +{ "_id" : "61431", "city" : "ELLISVILLE", "loc" : [ -90.287469, 40.604652 ], "pop" : 565, "state" : "IL" } +{ "_id" : "61432", "city" : "FAIRVIEW", "loc" : [ -90.16526500000001, 40.64418 ], "pop" : 702, "state" : "IL" } +{ "_id" : "61433", "city" : "FIATT", "loc" : [ -90.16218600000001, 40.571779 ], "pop" : 495, "state" : "IL" } +{ "_id" : "61434", "city" : "GALVA", "loc" : [ -90.04809299999999, 41.165627 ], "pop" : 3725, "state" : "IL" } +{ "_id" : "61435", "city" : "GERLAW", "loc" : [ -90.622765, 40.999519 ], "pop" : 520, "state" : "IL" } +{ "_id" : "61436", "city" : "GILSON", "loc" : [ -90.174663, 40.876525 ], "pop" : 696, "state" : "IL" } +{ "_id" : "61437", "city" : "GLADSTONE", "loc" : [ -90.994078, 40.837682 ], "pop" : 1166, "state" : "IL" } +{ "_id" : "61438", "city" : "GOOD HOPE", "loc" : [ -90.63243199999999, 40.574891 ], "pop" : 499, "state" : "IL" } +{ "_id" : "61440", "city" : "INDUSTRY", "loc" : [ -90.610524, 40.3256 ], "pop" : 885, "state" : "IL" } +{ "_id" : "61441", "city" : "IPAVA", "loc" : [ -90.296744, 40.359375 ], "pop" : 1152, "state" : "IL" } +{ "_id" : "61442", "city" : "KEITHSBURG", "loc" : [ -90.926337, 41.104333 ], "pop" : 1024, "state" : "IL" } +{ "_id" : "61443", "city" : "KEWANEE", "loc" : [ -89.92739, 41.241116 ], "pop" : 14861, "state" : "IL" } +{ "_id" : "61447", "city" : "KIRKWOOD", "loc" : [ -90.745659, 40.863849 ], "pop" : 1171, "state" : "IL" } +{ "_id" : "61448", "city" : "KNOXVILLE", "loc" : [ -90.287116, 40.910672 ], "pop" : 5958, "state" : "IL" } +{ "_id" : "61449", "city" : "LA FAYETTE", "loc" : [ -89.957466, 41.109535 ], "pop" : 454, "state" : "IL" } +{ "_id" : "61450", "city" : "LA HARPE", "loc" : [ -90.968746, 40.584586 ], "pop" : 1686, "state" : "IL" } +{ "_id" : "61451", "city" : "LAURA", "loc" : [ -89.93490799999999, 40.933468 ], "pop" : 500, "state" : "IL" } +{ "_id" : "61452", "city" : "LITTLETON", "loc" : [ -90.61900799999999, 40.233929 ], "pop" : 386, "state" : "IL" } +{ "_id" : "61453", "city" : "LITTLE YORK", "loc" : [ -90.736434, 41.01529 ], "pop" : 679, "state" : "IL" } +{ "_id" : "61454", "city" : "LOMAX", "loc" : [ -91.039096, 40.676143 ], "pop" : 1036, "state" : "IL" } +{ "_id" : "61455", "city" : "MACOMB", "loc" : [ -90.678674, 40.461674 ], "pop" : 23503, "state" : "IL" } +{ "_id" : "61458", "city" : "MAQUON", "loc" : [ -90.200841, 40.784863 ], "pop" : 1226, "state" : "IL" } +{ "_id" : "61459", "city" : "MARIETTA", "loc" : [ -90.38845999999999, 40.497775 ], "pop" : 421, "state" : "IL" } +{ "_id" : "61460", "city" : "MEDIA", "loc" : [ -90.85696, 40.761775 ], "pop" : 484, "state" : "IL" } +{ "_id" : "61462", "city" : "MONMOUTH", "loc" : [ -90.644828, 40.910702 ], "pop" : 11245, "state" : "IL" } +{ "_id" : "61465", "city" : "NEW WINDSOR", "loc" : [ -90.45984199999999, 41.198734 ], "pop" : 1171, "state" : "IL" } +{ "_id" : "61466", "city" : "NORTH HENDERSON", "loc" : [ -90.47357100000001, 41.100607 ], "pop" : 390, "state" : "IL" } +{ "_id" : "61467", "city" : "ONEIDA", "loc" : [ -90.239093, 41.083236 ], "pop" : 1122, "state" : "IL" } +{ "_id" : "61469", "city" : "OQUAWKA", "loc" : [ -90.930199, 40.944174 ], "pop" : 2410, "state" : "IL" } +{ "_id" : "61470", "city" : "PRAIRIE CITY", "loc" : [ -90.472748, 40.617952 ], "pop" : 651, "state" : "IL" } +{ "_id" : "61471", "city" : "RARITAN", "loc" : [ -90.831891, 40.687808 ], "pop" : 345, "state" : "IL" } +{ "_id" : "61472", "city" : "RIO", "loc" : [ -90.389978, 41.110319 ], "pop" : 570, "state" : "IL" } +{ "_id" : "61473", "city" : "ROSEVILLE", "loc" : [ -90.65145, 40.723821 ], "pop" : 1734, "state" : "IL" } +{ "_id" : "61474", "city" : "SAINT AUGUSTINE", "loc" : [ -90.37978099999999, 40.7289 ], "pop" : 376, "state" : "IL" } +{ "_id" : "61475", "city" : "SCIOTA", "loc" : [ -90.707999, 40.567361 ], "pop" : 622, "state" : "IL" } +{ "_id" : "61476", "city" : "SEATON", "loc" : [ -90.825654, 41.073222 ], "pop" : 704, "state" : "IL" } +{ "_id" : "61477", "city" : "SMITHFIELD", "loc" : [ -90.285601, 40.48551 ], "pop" : 647, "state" : "IL" } +{ "_id" : "61478", "city" : "SMITHSHIRE", "loc" : [ -90.739874, 40.740021 ], "pop" : 568, "state" : "IL" } +{ "_id" : "61479", "city" : "SPEER", "loc" : [ -89.693254, 41.009682 ], "pop" : 398, "state" : "IL" } +{ "_id" : "61480", "city" : "STRONGHURST", "loc" : [ -90.925702, 40.752265 ], "pop" : 1055, "state" : "IL" } +{ "_id" : "61482", "city" : "TABLE GROVE", "loc" : [ -90.423901, 40.378441 ], "pop" : 429, "state" : "IL" } +{ "_id" : "61483", "city" : "TOULON", "loc" : [ -89.860584, 41.100949 ], "pop" : 2378, "state" : "IL" } +{ "_id" : "61484", "city" : "VERMONT", "loc" : [ -90.422028, 40.30623 ], "pop" : 1112, "state" : "IL" } +{ "_id" : "61485", "city" : "VICTORIA", "loc" : [ -90.09332499999999, 41.025635 ], "pop" : 669, "state" : "IL" } +{ "_id" : "61486", "city" : "VIOLA", "loc" : [ -90.593583, 41.202422 ], "pop" : 1651, "state" : "IL" } +{ "_id" : "61488", "city" : "WATAGA", "loc" : [ -90.27231, 41.022351 ], "pop" : 1197, "state" : "IL" } +{ "_id" : "61489", "city" : "WILLIAMSFIELD", "loc" : [ -90.026725, 40.927724 ], "pop" : 912, "state" : "IL" } +{ "_id" : "61490", "city" : "WOODHULL", "loc" : [ -90.283282, 41.184887 ], "pop" : 1390, "state" : "IL" } +{ "_id" : "61491", "city" : "WYOMING", "loc" : [ -89.778238, 41.059879 ], "pop" : 1818, "state" : "IL" } +{ "_id" : "61501", "city" : "ASTORIA", "loc" : [ -90.34425400000001, 40.231144 ], "pop" : 2093, "state" : "IL" } +{ "_id" : "61516", "city" : "BENSON", "loc" : [ -89.116501, 40.83058 ], "pop" : 838, "state" : "IL" } +{ "_id" : "61517", "city" : "BRIMFIELD", "loc" : [ -89.89703799999999, 40.840654 ], "pop" : 1177, "state" : "IL" } +{ "_id" : "61518", "city" : "OAK HILL", "loc" : [ -89.83725, 40.786938 ], "pop" : 1007, "state" : "IL" } +{ "_id" : "61519", "city" : "BRYANT", "loc" : [ -90.06613400000001, 40.483072 ], "pop" : 1017, "state" : "IL" } +{ "_id" : "61520", "city" : "CANTON", "loc" : [ -90.024151, 40.560137 ], "pop" : 16309, "state" : "IL" } +{ "_id" : "61523", "city" : "CHILLICOTHE", "loc" : [ -89.506793, 40.901349 ], "pop" : 9929, "state" : "IL" } +{ "_id" : "61524", "city" : "DUNFERMLINE", "loc" : [ -90.03134900000001, 40.490342 ], "pop" : 319, "state" : "IL" } +{ "_id" : "61525", "city" : "DUNLAP", "loc" : [ -89.639655, 40.844417 ], "pop" : 4669, "state" : "IL" } +{ "_id" : "61526", "city" : "EDELSTEIN", "loc" : [ -89.585812, 40.945367 ], "pop" : 1866, "state" : "IL" } +{ "_id" : "61528", "city" : "EDWARDS", "loc" : [ -89.705344, 40.764362 ], "pop" : 2896, "state" : "IL" } +{ "_id" : "61529", "city" : "ELMWOOD", "loc" : [ -89.928882, 40.772594 ], "pop" : 2698, "state" : "IL" } +{ "_id" : "61530", "city" : "EUREKA", "loc" : [ -89.270561, 40.715249 ], "pop" : 5688, "state" : "IL" } +{ "_id" : "61531", "city" : "MIDDLEGROVE", "loc" : [ -90.013434, 40.690265 ], "pop" : 3569, "state" : "IL" } +{ "_id" : "61532", "city" : "FOREST CITY", "loc" : [ -89.833426, 40.35942 ], "pop" : 670, "state" : "IL" } +{ "_id" : "61533", "city" : "GLASFORD", "loc" : [ -89.81132599999999, 40.575976 ], "pop" : 2531, "state" : "IL" } +{ "_id" : "61534", "city" : "GREEN VALLEY", "loc" : [ -89.65492500000001, 40.41978 ], "pop" : 1800, "state" : "IL" } +{ "_id" : "61536", "city" : "HANNA CITY", "loc" : [ -89.795242, 40.679776 ], "pop" : 3255, "state" : "IL" } +{ "_id" : "61537", "city" : "HENRY", "loc" : [ -89.37432800000001, 41.111543 ], "pop" : 3255, "state" : "IL" } +{ "_id" : "61539", "city" : "KINGSTON MINES", "loc" : [ -89.806791, 40.49028 ], "pop" : 1745, "state" : "IL" } +{ "_id" : "61540", "city" : "LACON", "loc" : [ -89.400842, 41.021587 ], "pop" : 2809, "state" : "IL" } +{ "_id" : "61542", "city" : "LEWISTOWN", "loc" : [ -90.15628700000001, 40.383046 ], "pop" : 3849, "state" : "IL" } +{ "_id" : "61543", "city" : "LIVERPOOL", "loc" : [ -90.038972, 40.411574 ], "pop" : 730, "state" : "IL" } +{ "_id" : "61544", "city" : "LONDON MILLS", "loc" : [ -90.261594, 40.694954 ], "pop" : 746, "state" : "IL" } +{ "_id" : "61545", "city" : "CAZENOVIA", "loc" : [ -89.37039900000001, 40.871082 ], "pop" : 1247, "state" : "IL" } +{ "_id" : "61546", "city" : "MANITO", "loc" : [ -89.78979099999999, 40.415991 ], "pop" : 2593, "state" : "IL" } +{ "_id" : "61547", "city" : "MAPLETON", "loc" : [ -89.718429, 40.611699 ], "pop" : 2593, "state" : "IL" } +{ "_id" : "61548", "city" : "METAMORA", "loc" : [ -89.430876, 40.784428 ], "pop" : 9052, "state" : "IL" } +{ "_id" : "61550", "city" : "MORTON", "loc" : [ -89.46044500000001, 40.614771 ], "pop" : 15207, "state" : "IL" } +{ "_id" : "61554", "city" : "PEKIN", "loc" : [ -89.624332, 40.567435 ], "pop" : 44902, "state" : "IL" } +{ "_id" : "61559", "city" : "PRINCEVILLE", "loc" : [ -89.772285, 40.909277 ], "pop" : 3210, "state" : "IL" } +{ "_id" : "61560", "city" : "PUTNAM", "loc" : [ -89.440901, 41.19486 ], "pop" : 724, "state" : "IL" } +{ "_id" : "61561", "city" : "ROANOKE", "loc" : [ -89.209334, 40.795601 ], "pop" : 2653, "state" : "IL" } +{ "_id" : "61563", "city" : "SAINT DAVID", "loc" : [ -90.043739, 40.522571 ], "pop" : 241, "state" : "IL" } +{ "_id" : "61565", "city" : "SPARLAND", "loc" : [ -89.45711, 41.013366 ], "pop" : 1190, "state" : "IL" } +{ "_id" : "61567", "city" : "TOPEKA", "loc" : [ -89.93263, 40.38108 ], "pop" : 969, "state" : "IL" } +{ "_id" : "61568", "city" : "TREMONT", "loc" : [ -89.483316, 40.505337 ], "pop" : 4492, "state" : "IL" } +{ "_id" : "61569", "city" : "TRIVOLI", "loc" : [ -89.913546, 40.679506 ], "pop" : 1166, "state" : "IL" } +{ "_id" : "61570", "city" : "WASHBURN", "loc" : [ -89.28304900000001, 40.91413 ], "pop" : 1771, "state" : "IL" } +{ "_id" : "61571", "city" : "SUNNYLAND", "loc" : [ -89.447926, 40.699364 ], "pop" : 18931, "state" : "IL" } +{ "_id" : "61572", "city" : "YATES CITY", "loc" : [ -90.026481, 40.787826 ], "pop" : 1402, "state" : "IL" } +{ "_id" : "61602", "city" : "PEORIA", "loc" : [ -89.601178, 40.687987 ], "pop" : 740, "state" : "IL" } +{ "_id" : "61603", "city" : "PEORIA HEIGHTS", "loc" : [ -89.58081300000001, 40.713915 ], "pop" : 20163, "state" : "IL" } +{ "_id" : "61604", "city" : "PEORIA", "loc" : [ -89.63237700000001, 40.711142 ], "pop" : 33171, "state" : "IL" } +{ "_id" : "61605", "city" : "PEORIA", "loc" : [ -89.62632499999999, 40.677512 ], "pop" : 20320, "state" : "IL" } +{ "_id" : "61606", "city" : "PEORIA", "loc" : [ -89.612189, 40.698926 ], "pop" : 10299, "state" : "IL" } +{ "_id" : "61607", "city" : "BARTONVILLE", "loc" : [ -89.67389799999999, 40.652434 ], "pop" : 10389, "state" : "IL" } +{ "_id" : "61611", "city" : "EAST PEORIA", "loc" : [ -89.55141, 40.673121 ], "pop" : 29630, "state" : "IL" } +{ "_id" : "61614", "city" : "PEORIA HEIGHTS", "loc" : [ -89.603295, 40.75481 ], "pop" : 35177, "state" : "IL" } +{ "_id" : "61615", "city" : "PEORIA", "loc" : [ -89.63208299999999, 40.770165 ], "pop" : 15452, "state" : "IL" } +{ "_id" : "61701", "city" : "BLOOMINGTON", "loc" : [ -88.989318, 40.478295 ], "pop" : 35218, "state" : "IL" } +{ "_id" : "61704", "city" : "BLOOMINGTON", "loc" : [ -88.96246600000001, 40.471618 ], "pop" : 24135, "state" : "IL" } +{ "_id" : "61720", "city" : "ANCHOR", "loc" : [ -88.52658099999999, 40.544091 ], "pop" : 393, "state" : "IL" } +{ "_id" : "61721", "city" : "ARMINGTON", "loc" : [ -89.321775, 40.317046 ], "pop" : 1163, "state" : "IL" } +{ "_id" : "61722", "city" : "ARROWSMITH", "loc" : [ -88.629648, 40.411966 ], "pop" : 813, "state" : "IL" } +{ "_id" : "61723", "city" : "ATLANTA", "loc" : [ -89.23002099999999, 40.258624 ], "pop" : 1978, "state" : "IL" } +{ "_id" : "61724", "city" : "BELLFLOWER", "loc" : [ -88.522702, 40.340091 ], "pop" : 702, "state" : "IL" } +{ "_id" : "61725", "city" : "CARLOCK", "loc" : [ -89.109779, 40.602898 ], "pop" : 1066, "state" : "IL" } +{ "_id" : "61726", "city" : "CHENOA", "loc" : [ -88.721853, 40.744633 ], "pop" : 2898, "state" : "IL" } +{ "_id" : "61727", "city" : "CLINTON", "loc" : [ -88.96266, 40.148708 ], "pop" : 10043, "state" : "IL" } +{ "_id" : "61728", "city" : "COLFAX", "loc" : [ -88.62001600000001, 40.570377 ], "pop" : 1391, "state" : "IL" } +{ "_id" : "61729", "city" : "CONGERVILLE", "loc" : [ -89.199397, 40.620762 ], "pop" : 802, "state" : "IL" } +{ "_id" : "61730", "city" : "COOKSVILLE", "loc" : [ -88.73504699999999, 40.536014 ], "pop" : 478, "state" : "IL" } +{ "_id" : "61731", "city" : "CROPSEY", "loc" : [ -88.494343, 40.602983 ], "pop" : 240, "state" : "IL" } +{ "_id" : "61732", "city" : "DANVERS", "loc" : [ -89.18848699999999, 40.536353 ], "pop" : 1825, "state" : "IL" } +{ "_id" : "61733", "city" : "DEER CREEK", "loc" : [ -89.30029999999999, 40.627992 ], "pop" : 2277, "state" : "IL" } +{ "_id" : "61734", "city" : "DELAVAN", "loc" : [ -89.532133, 40.369029 ], "pop" : 2285, "state" : "IL" } +{ "_id" : "61735", "city" : "DEWITT", "loc" : [ -88.763672, 40.184759 ], "pop" : 417, "state" : "IL" } +{ "_id" : "61736", "city" : "HOLDER", "loc" : [ -88.870814, 40.380858 ], "pop" : 992, "state" : "IL" } +{ "_id" : "61737", "city" : "ELLSWORTH", "loc" : [ -88.737121, 40.443154 ], "pop" : 660, "state" : "IL" } +{ "_id" : "61738", "city" : "EL PASO", "loc" : [ -89.01195199999999, 40.738948 ], "pop" : 3338, "state" : "IL" } +{ "_id" : "61739", "city" : "FAIRBURY", "loc" : [ -88.516486, 40.745033 ], "pop" : 4706, "state" : "IL" } +{ "_id" : "61740", "city" : "FLANAGAN", "loc" : [ -88.86196, 40.879003 ], "pop" : 1424, "state" : "IL" } +{ "_id" : "61741", "city" : "FORREST", "loc" : [ -88.411143, 40.751324 ], "pop" : 1809, "state" : "IL" } +{ "_id" : "61743", "city" : "GRAYMONT", "loc" : [ -88.760299, 40.90663 ], "pop" : 180, "state" : "IL" } +{ "_id" : "61744", "city" : "GRIDLEY", "loc" : [ -88.884044, 40.74387 ], "pop" : 2142, "state" : "IL" } +{ "_id" : "61745", "city" : "HEYWORTH", "loc" : [ -88.977608, 40.3307 ], "pop" : 2934, "state" : "IL" } +{ "_id" : "61747", "city" : "HOPEDALE", "loc" : [ -89.421398, 40.427318 ], "pop" : 1355, "state" : "IL" } +{ "_id" : "61748", "city" : "HUDSON", "loc" : [ -88.975931, 40.620485 ], "pop" : 1850, "state" : "IL" } +{ "_id" : "61749", "city" : "KENNEY", "loc" : [ -89.078925, 40.10247 ], "pop" : 789, "state" : "IL" } +{ "_id" : "61752", "city" : "LE ROY", "loc" : [ -88.75981299999999, 40.346781 ], "pop" : 3379, "state" : "IL" } +{ "_id" : "61753", "city" : "LEXINGTON", "loc" : [ -88.806203, 40.635685 ], "pop" : 3098, "state" : "IL" } +{ "_id" : "61754", "city" : "MC LEAN", "loc" : [ -89.164483, 40.328159 ], "pop" : 1432, "state" : "IL" } +{ "_id" : "61755", "city" : "MACKINAW", "loc" : [ -89.345795, 40.539643 ], "pop" : 2772, "state" : "IL" } +{ "_id" : "61756", "city" : "MAROA", "loc" : [ -88.957769, 40.034159 ], "pop" : 1883, "state" : "IL" } +{ "_id" : "61759", "city" : "MINIER", "loc" : [ -89.316484, 40.435889 ], "pop" : 1483, "state" : "IL" } +{ "_id" : "61760", "city" : "MINONK", "loc" : [ -89.034863, 40.898501 ], "pop" : 2559, "state" : "IL" } +{ "_id" : "61761", "city" : "NORMAL", "loc" : [ -88.988287, 40.512446 ], "pop" : 40851, "state" : "IL" } +{ "_id" : "61764", "city" : "PONTIAC", "loc" : [ -88.632775, 40.876404 ], "pop" : 14036, "state" : "IL" } +{ "_id" : "61769", "city" : "SAUNEMIN", "loc" : [ -88.40936000000001, 40.888516 ], "pop" : 683, "state" : "IL" } +{ "_id" : "61770", "city" : "SAYBROOK", "loc" : [ -88.52465599999999, 40.432005 ], "pop" : 1051, "state" : "IL" } +{ "_id" : "61771", "city" : "SECOR", "loc" : [ -89.127065, 40.722402 ], "pop" : 952, "state" : "IL" } +{ "_id" : "61772", "city" : "SHIRLEY", "loc" : [ -89.08218100000001, 40.417437 ], "pop" : 332, "state" : "IL" } +{ "_id" : "61773", "city" : "SIBLEY", "loc" : [ -88.38146, 40.582315 ], "pop" : 608, "state" : "IL" } +{ "_id" : "61774", "city" : "STANFORD", "loc" : [ -89.21643400000001, 40.437575 ], "pop" : 996, "state" : "IL" } +{ "_id" : "61775", "city" : "STRAWN", "loc" : [ -88.404036, 40.647615 ], "pop" : 322, "state" : "IL" } +{ "_id" : "61776", "city" : "TOWANDA", "loc" : [ -88.88865, 40.553326 ], "pop" : 1191, "state" : "IL" } +{ "_id" : "61777", "city" : "WAPELLA", "loc" : [ -88.967264, 40.232305 ], "pop" : 1031, "state" : "IL" } +{ "_id" : "61778", "city" : "WAYNESVILLE", "loc" : [ -89.114299, 40.243673 ], "pop" : 768, "state" : "IL" } +{ "_id" : "61801", "city" : "URBANA", "loc" : [ -88.203631, 40.109522 ], "pop" : 46110, "state" : "IL" } +{ "_id" : "61810", "city" : "ALLERTON", "loc" : [ -87.931235, 39.918818 ], "pop" : 405, "state" : "IL" } +{ "_id" : "61811", "city" : "ALVIN", "loc" : [ -87.608003, 40.3007 ], "pop" : 817, "state" : "IL" } +{ "_id" : "61812", "city" : "ARMSTRONG", "loc" : [ -87.894256, 40.217548 ], "pop" : 247, "state" : "IL" } +{ "_id" : "61813", "city" : "BEMENT", "loc" : [ -88.56877, 39.922207 ], "pop" : 1928, "state" : "IL" } +{ "_id" : "61814", "city" : "BISMARCK", "loc" : [ -87.613769, 40.255187 ], "pop" : 1476, "state" : "IL" } +{ "_id" : "61816", "city" : "BROADLANDS", "loc" : [ -87.994831, 39.914247 ], "pop" : 481, "state" : "IL" } +{ "_id" : "61817", "city" : "CATLIN", "loc" : [ -87.71125499999999, 40.069922 ], "pop" : 3359, "state" : "IL" } +{ "_id" : "61818", "city" : "CERRO GORDO", "loc" : [ -88.725634, 39.868062 ], "pop" : 2060, "state" : "IL" } +{ "_id" : "61820", "city" : "CHAMPAIGN", "loc" : [ -88.240747, 40.111017 ], "pop" : 33409, "state" : "IL" } +{ "_id" : "61821", "city" : "CHAMPAIGN", "loc" : [ -88.278847, 40.107262 ], "pop" : 37547, "state" : "IL" } +{ "_id" : "61830", "city" : "CISCO", "loc" : [ -88.696153, 39.997164 ], "pop" : 732, "state" : "IL" } +{ "_id" : "61831", "city" : "COLLISON", "loc" : [ -87.798709, 40.220737 ], "pop" : 421, "state" : "IL" } +{ "_id" : "61832", "city" : "DANVILLE", "loc" : [ -87.621737, 40.136976 ], "pop" : 49857, "state" : "IL" } +{ "_id" : "61833", "city" : "TILTON", "loc" : [ -87.644048, 40.096406 ], "pop" : 2945, "state" : "IL" } +{ "_id" : "61839", "city" : "DE LAND", "loc" : [ -88.63919300000001, 40.110656 ], "pop" : 848, "state" : "IL" } +{ "_id" : "61840", "city" : "DEWEY", "loc" : [ -88.276966, 40.313055 ], "pop" : 548, "state" : "IL" } +{ "_id" : "61841", "city" : "FAIRMOUNT", "loc" : [ -87.836456, 40.037329 ], "pop" : 1317, "state" : "IL" } +{ "_id" : "61842", "city" : "FARMER CITY", "loc" : [ -88.66338500000001, 40.244689 ], "pop" : 2889, "state" : "IL" } +{ "_id" : "61843", "city" : "FISHER", "loc" : [ -88.355991, 40.299126 ], "pop" : 2823, "state" : "IL" } +{ "_id" : "61844", "city" : "FITHIAN", "loc" : [ -87.879713, 40.11924 ], "pop" : 673, "state" : "IL" } +{ "_id" : "61845", "city" : "FOOSLAND", "loc" : [ -88.420177, 40.35537 ], "pop" : 319, "state" : "IL" } +{ "_id" : "61846", "city" : "GEORGETOWN", "loc" : [ -87.63648000000001, 39.97922 ], "pop" : 4534, "state" : "IL" } +{ "_id" : "61847", "city" : "GIFFORD", "loc" : [ -88.031705, 40.302755 ], "pop" : 1459, "state" : "IL" } +{ "_id" : "61849", "city" : "HOMER", "loc" : [ -87.96274200000001, 40.034619 ], "pop" : 1624, "state" : "IL" } +{ "_id" : "61850", "city" : "INDIANOLA", "loc" : [ -87.73882, 39.926819 ], "pop" : 715, "state" : "IL" } +{ "_id" : "61851", "city" : "IVESDALE", "loc" : [ -88.44509499999999, 39.950233 ], "pop" : 596, "state" : "IL" } +{ "_id" : "61852", "city" : "LONGVIEW", "loc" : [ -88.075282, 39.901241 ], "pop" : 555, "state" : "IL" } +{ "_id" : "61853", "city" : "MAHOMET", "loc" : [ -88.39283, 40.196437 ], "pop" : 8734, "state" : "IL" } +{ "_id" : "61854", "city" : "MANSFIELD", "loc" : [ -88.517895, 40.214697 ], "pop" : 1407, "state" : "IL" } +{ "_id" : "61855", "city" : "MILMINE", "loc" : [ -88.648696, 39.900702 ], "pop" : 148, "state" : "IL" } +{ "_id" : "61856", "city" : "MONTICELLO", "loc" : [ -88.568555, 40.02632 ], "pop" : 5339, "state" : "IL" } +{ "_id" : "61858", "city" : "OAKWOOD", "loc" : [ -87.7825, 40.116656 ], "pop" : 2852, "state" : "IL" } +{ "_id" : "61859", "city" : "OGDEN", "loc" : [ -87.966499, 40.140117 ], "pop" : 1397, "state" : "IL" } +{ "_id" : "61862", "city" : "PENFIELD", "loc" : [ -87.95702, 40.310137 ], "pop" : 601, "state" : "IL" } +{ "_id" : "61863", "city" : "PESOTUM", "loc" : [ -88.274331, 39.9151 ], "pop" : 774, "state" : "IL" } +{ "_id" : "61864", "city" : "PHILO", "loc" : [ -88.15950599999999, 40.005156 ], "pop" : 1377, "state" : "IL" } +{ "_id" : "61865", "city" : "POTOMAC", "loc" : [ -87.82319200000001, 40.309 ], "pop" : 1544, "state" : "IL" } +{ "_id" : "61866", "city" : "RANTOUL", "loc" : [ -88.146179, 40.310742 ], "pop" : 11146, "state" : "IL" } +{ "_id" : "61868", "city" : "RANTOUL", "loc" : [ -88.149884, 40.295886 ], "pop" : 7185, "state" : "IL" } +{ "_id" : "61870", "city" : "RIDGE FARM", "loc" : [ -87.634578, 39.915455 ], "pop" : 2094, "state" : "IL" } +{ "_id" : "61872", "city" : "SADORUS", "loc" : [ -88.344717, 39.961312 ], "pop" : 1022, "state" : "IL" } +{ "_id" : "61873", "city" : "SAINT JOSEPH", "loc" : [ -88.04723199999999, 40.120736 ], "pop" : 4168, "state" : "IL" } +{ "_id" : "61874", "city" : "SAVOY", "loc" : [ -88.252837, 40.065373 ], "pop" : 2972, "state" : "IL" } +{ "_id" : "61875", "city" : "SEYMOUR", "loc" : [ -88.394431, 40.103471 ], "pop" : 1135, "state" : "IL" } +{ "_id" : "61876", "city" : "SIDELL", "loc" : [ -87.82480200000001, 39.911018 ], "pop" : 703, "state" : "IL" } +{ "_id" : "61877", "city" : "SIDNEY", "loc" : [ -88.069029, 40.023206 ], "pop" : 1521, "state" : "IL" } +{ "_id" : "61878", "city" : "THOMASBORO", "loc" : [ -88.18303299999999, 40.240206 ], "pop" : 1638, "state" : "IL" } +{ "_id" : "61880", "city" : "TOLONO", "loc" : [ -88.259641, 39.985006 ], "pop" : 2837, "state" : "IL" } +{ "_id" : "61882", "city" : "WELDON", "loc" : [ -88.753055, 40.117741 ], "pop" : 579, "state" : "IL" } +{ "_id" : "61883", "city" : "WESTVILLE", "loc" : [ -87.635952, 40.045113 ], "pop" : 4398, "state" : "IL" } +{ "_id" : "61884", "city" : "WHITE HEATH", "loc" : [ -88.51929699999999, 40.100911 ], "pop" : 1481, "state" : "IL" } +{ "_id" : "61910", "city" : "ARCOLA", "loc" : [ -88.303679, 39.687001 ], "pop" : 3132, "state" : "IL" } +{ "_id" : "61911", "city" : "ARTHUR", "loc" : [ -88.45550900000001, 39.707679 ], "pop" : 4951, "state" : "IL" } +{ "_id" : "61912", "city" : "ASHMORE", "loc" : [ -88.034097, 39.525428 ], "pop" : 1467, "state" : "IL" } +{ "_id" : "61913", "city" : "ATWOOD", "loc" : [ -88.44944599999999, 39.804368 ], "pop" : 2455, "state" : "IL" } +{ "_id" : "61914", "city" : "BETHANY", "loc" : [ -88.754301, 39.634754 ], "pop" : 1983, "state" : "IL" } +{ "_id" : "61917", "city" : "BROCTON", "loc" : [ -87.926258, 39.692311 ], "pop" : 748, "state" : "IL" } +{ "_id" : "61919", "city" : "CAMARGO", "loc" : [ -88.146815, 39.799955 ], "pop" : 1015, "state" : "IL" } +{ "_id" : "61920", "city" : "CHARLESTON", "loc" : [ -88.176115, 39.486933 ], "pop" : 22767, "state" : "IL" } +{ "_id" : "61924", "city" : "CHRISMAN", "loc" : [ -87.655552, 39.799572 ], "pop" : 2269, "state" : "IL" } +{ "_id" : "61925", "city" : "DALTON CITY", "loc" : [ -88.797459, 39.711943 ], "pop" : 715, "state" : "IL" } +{ "_id" : "61928", "city" : "GAYS", "loc" : [ -88.524153, 39.479553 ], "pop" : 678, "state" : "IL" } +{ "_id" : "61929", "city" : "HAMMOND", "loc" : [ -88.57930500000001, 39.79465 ], "pop" : 797, "state" : "IL" } +{ "_id" : "61930", "city" : "HINDSBORO", "loc" : [ -88.148611, 39.701799 ], "pop" : 811, "state" : "IL" } +{ "_id" : "61931", "city" : "HUMBOLDT", "loc" : [ -88.314089, 39.60118 ], "pop" : 856, "state" : "IL" } +{ "_id" : "61932", "city" : "HUME", "loc" : [ -87.87465899999999, 39.800882 ], "pop" : 593, "state" : "IL" } +{ "_id" : "61933", "city" : "KANSAS", "loc" : [ -87.935238, 39.552533 ], "pop" : 1114, "state" : "IL" } +{ "_id" : "61937", "city" : "LOVINGTON", "loc" : [ -88.64167500000001, 39.719192 ], "pop" : 1995, "state" : "IL" } +{ "_id" : "61938", "city" : "MATTOON", "loc" : [ -88.376152, 39.480184 ], "pop" : 23012, "state" : "IL" } +{ "_id" : "61940", "city" : "METCALF", "loc" : [ -87.795524, 39.800847 ], "pop" : 554, "state" : "IL" } +{ "_id" : "61942", "city" : "NEWMAN", "loc" : [ -88.000055, 39.784788 ], "pop" : 1591, "state" : "IL" } +{ "_id" : "61943", "city" : "OAKLAND", "loc" : [ -88.025325, 39.651618 ], "pop" : 1447, "state" : "IL" } +{ "_id" : "61944", "city" : "PARIS", "loc" : [ -87.697631, 39.613219 ], "pop" : 12509, "state" : "IL" } +{ "_id" : "61951", "city" : "SULLIVAN", "loc" : [ -88.603767, 39.593431 ], "pop" : 6946, "state" : "IL" } +{ "_id" : "61953", "city" : "TUSCOLA", "loc" : [ -88.28158500000001, 39.799509 ], "pop" : 5056, "state" : "IL" } +{ "_id" : "61956", "city" : "VILLA GROVE", "loc" : [ -88.161635, 39.868716 ], "pop" : 3259, "state" : "IL" } +{ "_id" : "61957", "city" : "WINDSOR", "loc" : [ -88.585747, 39.430198 ], "pop" : 2019, "state" : "IL" } +{ "_id" : "62001", "city" : "ALHAMBRA", "loc" : [ -89.744123, 38.882211 ], "pop" : 1543, "state" : "IL" } +{ "_id" : "62002", "city" : "ALTON", "loc" : [ -90.156806, 38.908651 ], "pop" : 37541, "state" : "IL" } +{ "_id" : "62006", "city" : "BATCHTOWN", "loc" : [ -90.659114, 39.072468 ], "pop" : 579, "state" : "IL" } +{ "_id" : "62009", "city" : "BENLD", "loc" : [ -89.803057, 39.093903 ], "pop" : 1604, "state" : "IL" } +{ "_id" : "62010", "city" : "BETHALTO", "loc" : [ -90.034447, 38.907353 ], "pop" : 10587, "state" : "IL" } +{ "_id" : "62011", "city" : "BINGHAM", "loc" : [ -89.195789, 39.14667 ], "pop" : 565, "state" : "IL" } +{ "_id" : "62012", "city" : "BRIGHTON", "loc" : [ -90.144312, 39.036098 ], "pop" : 6467, "state" : "IL" } +{ "_id" : "62013", "city" : "MEPPEN", "loc" : [ -90.59069599999999, 38.937115 ], "pop" : 814, "state" : "IL" } +{ "_id" : "62014", "city" : "BUNKER HILL", "loc" : [ -89.962379, 39.040827 ], "pop" : 3052, "state" : "IL" } +{ "_id" : "62015", "city" : "BUTLER", "loc" : [ -89.530535, 39.211419 ], "pop" : 570, "state" : "IL" } +{ "_id" : "62016", "city" : "CARROLLTON", "loc" : [ -90.409211, 39.300937 ], "pop" : 3079, "state" : "IL" } +{ "_id" : "62017", "city" : "COFFEEN", "loc" : [ -89.39454000000001, 39.090757 ], "pop" : 1207, "state" : "IL" } +{ "_id" : "62018", "city" : "COTTAGE HILLS", "loc" : [ -90.082632, 38.912377 ], "pop" : 4437, "state" : "IL" } +{ "_id" : "62019", "city" : "DONNELLSON", "loc" : [ -89.490858, 39.034422 ], "pop" : 1010, "state" : "IL" } +{ "_id" : "62021", "city" : "DORSEY", "loc" : [ -89.978635, 38.983237 ], "pop" : 652, "state" : "IL" } +{ "_id" : "62022", "city" : "DOW", "loc" : [ -90.301059, 39.031198 ], "pop" : 1758, "state" : "IL" } +{ "_id" : "62024", "city" : "EAST ALTON", "loc" : [ -90.083045, 38.88031 ], "pop" : 13839, "state" : "IL" } +{ "_id" : "62025", "city" : "EDWARDSVILLE", "loc" : [ -89.963697, 38.804967 ], "pop" : 19241, "state" : "IL" } +{ "_id" : "62027", "city" : "ELDRED", "loc" : [ -90.53287400000001, 39.283592 ], "pop" : 907, "state" : "IL" } +{ "_id" : "62028", "city" : "ELSAH", "loc" : [ -90.331913, 38.961297 ], "pop" : 2553, "state" : "IL" } +{ "_id" : "62030", "city" : "FIDELITY", "loc" : [ -90.198803, 39.132286 ], "pop" : 655, "state" : "IL" } +{ "_id" : "62031", "city" : "FIELDON", "loc" : [ -90.529742, 39.108608 ], "pop" : 1382, "state" : "IL" } +{ "_id" : "62032", "city" : "FILLMORE", "loc" : [ -89.294551, 39.103872 ], "pop" : 977, "state" : "IL" } +{ "_id" : "62033", "city" : "DORCHESTER", "loc" : [ -89.818577, 39.136106 ], "pop" : 6518, "state" : "IL" } +{ "_id" : "62034", "city" : "GLEN CARBON", "loc" : [ -89.970583, 38.760871 ], "pop" : 9729, "state" : "IL" } +{ "_id" : "62035", "city" : "GODFREY", "loc" : [ -90.206024, 38.946035 ], "pop" : 13959, "state" : "IL" } +{ "_id" : "62036", "city" : "GOLDEN EAGLE", "loc" : [ -90.560199, 38.896138 ], "pop" : 266, "state" : "IL" } +{ "_id" : "62037", "city" : "GRAFTON", "loc" : [ -90.43233499999999, 39.002134 ], "pop" : 2036, "state" : "IL" } +{ "_id" : "62040", "city" : "MITCHELL", "loc" : [ -90.11582199999999, 38.721572 ], "pop" : 48697, "state" : "IL" } +{ "_id" : "62044", "city" : "GREENFIELD", "loc" : [ -90.208851, 39.349058 ], "pop" : 1718, "state" : "IL" } +{ "_id" : "62045", "city" : "HAMBURG", "loc" : [ -90.699546, 39.223488 ], "pop" : 383, "state" : "IL" } +{ "_id" : "62046", "city" : "HAMEL", "loc" : [ -89.87267799999999, 38.878433 ], "pop" : 1685, "state" : "IL" } +{ "_id" : "62047", "city" : "HARDIN", "loc" : [ -90.624002, 39.154652 ], "pop" : 1232, "state" : "IL" } +{ "_id" : "62048", "city" : "HARTFORD", "loc" : [ -90.074533, 38.829852 ], "pop" : 3763, "state" : "IL" } +{ "_id" : "62049", "city" : "HILLSBORO", "loc" : [ -89.488146, 39.149412 ], "pop" : 7916, "state" : "IL" } +{ "_id" : "62050", "city" : "HILLVIEW", "loc" : [ -90.512837, 39.467373 ], "pop" : 795, "state" : "IL" } +{ "_id" : "62051", "city" : "IRVING", "loc" : [ -89.41043000000001, 39.208903 ], "pop" : 909, "state" : "IL" } +{ "_id" : "62052", "city" : "JERSEYVILLE", "loc" : [ -90.33375700000001, 39.121324 ], "pop" : 9439, "state" : "IL" } +{ "_id" : "62053", "city" : "KAMPSVILLE", "loc" : [ -90.62693400000001, 39.306388 ], "pop" : 623, "state" : "IL" } +{ "_id" : "62054", "city" : "KANE", "loc" : [ -90.37188, 39.203688 ], "pop" : 1044, "state" : "IL" } +{ "_id" : "62056", "city" : "LITCHFIELD", "loc" : [ -89.64991499999999, 39.179345 ], "pop" : 9172, "state" : "IL" } +{ "_id" : "62060", "city" : "MADISON", "loc" : [ -90.15658500000001, 38.68109 ], "pop" : 7556, "state" : "IL" } +{ "_id" : "62061", "city" : "MARINE", "loc" : [ -89.821376, 38.785458 ], "pop" : 2020, "state" : "IL" } +{ "_id" : "62063", "city" : "MEDORA", "loc" : [ -90.154225, 39.198593 ], "pop" : 531, "state" : "IL" } +{ "_id" : "62065", "city" : "MICHAEL", "loc" : [ -90.633498, 39.21821 ], "pop" : 343, "state" : "IL" } +{ "_id" : "62067", "city" : "MORO", "loc" : [ -89.961771, 38.931769 ], "pop" : 2775, "state" : "IL" } +{ "_id" : "62069", "city" : "MOUNT OLIVE", "loc" : [ -89.74484200000001, 39.070504 ], "pop" : 3443, "state" : "IL" } +{ "_id" : "62070", "city" : "MOZIER", "loc" : [ -90.714978, 39.287719 ], "pop" : 241, "state" : "IL" } +{ "_id" : "62074", "city" : "NEW DOUGLAS", "loc" : [ -89.73923499999999, 38.967633 ], "pop" : 2464, "state" : "IL" } +{ "_id" : "62075", "city" : "NOKOMIS", "loc" : [ -89.285297, 39.303642 ], "pop" : 4576, "state" : "IL" } +{ "_id" : "62079", "city" : "PIASA", "loc" : [ -90.131147, 39.151697 ], "pop" : 863, "state" : "IL" } +{ "_id" : "62080", "city" : "RAMSEY", "loc" : [ -89.105147, 39.078123 ], "pop" : 4166, "state" : "IL" } +{ "_id" : "62081", "city" : "ROCKBRIDGE", "loc" : [ -90.255818, 39.283146 ], "pop" : 718, "state" : "IL" } +{ "_id" : "62082", "city" : "ROODHOUSE", "loc" : [ -90.34981399999999, 39.484646 ], "pop" : 3020, "state" : "IL" } +{ "_id" : "62083", "city" : "ROSAMOND", "loc" : [ -89.1846, 39.389229 ], "pop" : 443, "state" : "IL" } +{ "_id" : "62084", "city" : "ROXANA", "loc" : [ -90.07978, 38.848154 ], "pop" : 1513, "state" : "IL" } +{ "_id" : "62086", "city" : "SORENTO", "loc" : [ -89.565347, 38.969342 ], "pop" : 2127, "state" : "IL" } +{ "_id" : "62088", "city" : "STAUNTON", "loc" : [ -89.785697, 39.01348 ], "pop" : 5482, "state" : "IL" } +{ "_id" : "62090", "city" : "VENICE", "loc" : [ -90.16892799999999, 38.67063 ], "pop" : 1559, "state" : "IL" } +{ "_id" : "62091", "city" : "WALSHVILLE", "loc" : [ -89.634968, 39.047257 ], "pop" : 359, "state" : "IL" } +{ "_id" : "62092", "city" : "WHITE HALL", "loc" : [ -90.401899, 39.428804 ], "pop" : 3882, "state" : "IL" } +{ "_id" : "62094", "city" : "WITT", "loc" : [ -89.341426, 39.246919 ], "pop" : 1251, "state" : "IL" } +{ "_id" : "62095", "city" : "WOOD RIVER", "loc" : [ -90.087507, 38.864279 ], "pop" : 10817, "state" : "IL" } +{ "_id" : "62097", "city" : "WORDEN", "loc" : [ -89.85321399999999, 38.944895 ], "pop" : 1818, "state" : "IL" } +{ "_id" : "62201", "city" : "SAUGET", "loc" : [ -90.13806599999999, 38.631538 ], "pop" : 11213, "state" : "IL" } +{ "_id" : "62203", "city" : "EAST SAINT LOUIS", "loc" : [ -90.074449, 38.599191 ], "pop" : 12435, "state" : "IL" } +{ "_id" : "62204", "city" : "WASHINGTON PARK", "loc" : [ -90.102008, 38.631335 ], "pop" : 14425, "state" : "IL" } +{ "_id" : "62205", "city" : "EAST SAINT LOUIS", "loc" : [ -90.12750200000001, 38.614947 ], "pop" : 14488, "state" : "IL" } +{ "_id" : "62206", "city" : "CAHOKIA", "loc" : [ -90.16587, 38.561899 ], "pop" : 20356, "state" : "IL" } +{ "_id" : "62207", "city" : "ALORTON", "loc" : [ -90.12829000000001, 38.58734 ], "pop" : 11681, "state" : "IL" } +{ "_id" : "62208", "city" : "FAIRVIEW HEIGHTS", "loc" : [ -90.007093, 38.596044 ], "pop" : 10882, "state" : "IL" } +{ "_id" : "62214", "city" : "VENEDY", "loc" : [ -89.52273, 38.360422 ], "pop" : 539, "state" : "IL" } +{ "_id" : "62215", "city" : "ALBERS", "loc" : [ -89.62015100000001, 38.531955 ], "pop" : 1641, "state" : "IL" } +{ "_id" : "62217", "city" : "BALDWIN", "loc" : [ -89.841391, 38.175351 ], "pop" : 1093, "state" : "IL" } +{ "_id" : "62218", "city" : "BARTELSO", "loc" : [ -89.457841, 38.53851 ], "pop" : 1270, "state" : "IL" } +{ "_id" : "62220", "city" : "BELLEVILLE", "loc" : [ -89.98469299999999, 38.512677 ], "pop" : 23454, "state" : "IL" } +{ "_id" : "62221", "city" : "BELLEVILLE", "loc" : [ -89.958302, 38.539639 ], "pop" : 29321, "state" : "IL" } +{ "_id" : "62223", "city" : "BELLEVILLE", "loc" : [ -90.037775, 38.545581 ], "pop" : 34650, "state" : "IL" } +{ "_id" : "62225", "city" : "SCOTT A F B", "loc" : [ -89.85877499999999, 38.54692 ], "pop" : 7391, "state" : "IL" } +{ "_id" : "62230", "city" : "BREESE", "loc" : [ -89.52838, 38.618802 ], "pop" : 4882, "state" : "IL" } +{ "_id" : "62231", "city" : "CARLYLE", "loc" : [ -89.380544, 38.606609 ], "pop" : 6529, "state" : "IL" } +{ "_id" : "62232", "city" : "CASEYVILLE", "loc" : [ -90.013486, 38.634458 ], "pop" : 7601, "state" : "IL" } +{ "_id" : "62233", "city" : "CHESTER", "loc" : [ -89.82180700000001, 37.918822 ], "pop" : 9436, "state" : "IL" } +{ "_id" : "62234", "city" : "COLLINSVILLE", "loc" : [ -89.98529000000001, 38.683545 ], "pop" : 33686, "state" : "IL" } +{ "_id" : "62236", "city" : "COLUMBIA", "loc" : [ -90.20271700000001, 38.432469 ], "pop" : 8489, "state" : "IL" } +{ "_id" : "62237", "city" : "SWANWICK", "loc" : [ -89.582064, 38.176401 ], "pop" : 2359, "state" : "IL" } +{ "_id" : "62238", "city" : "CUTLER", "loc" : [ -89.56612699999999, 38.042663 ], "pop" : 787, "state" : "IL" } +{ "_id" : "62239", "city" : "DUPO", "loc" : [ -90.194188, 38.514771 ], "pop" : 5663, "state" : "IL" } +{ "_id" : "62240", "city" : "EAST CARONDELET", "loc" : [ -90.220782, 38.534912 ], "pop" : 1579, "state" : "IL" } +{ "_id" : "62241", "city" : "ELLIS GROVE", "loc" : [ -89.900847, 38.005358 ], "pop" : 999, "state" : "IL" } +{ "_id" : "62242", "city" : "EVANSVILLE", "loc" : [ -89.917028, 38.09258 ], "pop" : 1540, "state" : "IL" } +{ "_id" : "62243", "city" : "FREEBURG", "loc" : [ -89.91806, 38.408016 ], "pop" : 5837, "state" : "IL" } +{ "_id" : "62244", "city" : "FULTS", "loc" : [ -90.19735300000001, 38.179736 ], "pop" : 635, "state" : "IL" } +{ "_id" : "62245", "city" : "GERMANTOWN", "loc" : [ -89.54134000000001, 38.548677 ], "pop" : 1773, "state" : "IL" } +{ "_id" : "62246", "city" : "GREENVILLE", "loc" : [ -89.405185, 38.893338 ], "pop" : 7623, "state" : "IL" } +{ "_id" : "62248", "city" : "HECKER", "loc" : [ -89.983115, 38.281039 ], "pop" : 1454, "state" : "IL" } +{ "_id" : "62249", "city" : "HIGHLAND", "loc" : [ -89.678894, 38.763086 ], "pop" : 6772, "state" : "IL" } +{ "_id" : "62253", "city" : "KEYESPORT", "loc" : [ -89.30632300000001, 38.738773 ], "pop" : 1464, "state" : "IL" } +{ "_id" : "62254", "city" : "LEBANON", "loc" : [ -89.79921299999999, 38.60528 ], "pop" : 4950, "state" : "IL" } +{ "_id" : "62255", "city" : "LENZBURG", "loc" : [ -89.792202, 38.295003 ], "pop" : 1316, "state" : "IL" } +{ "_id" : "62256", "city" : "MAEYSTOWN", "loc" : [ -90.20178, 38.24112 ], "pop" : 592, "state" : "IL" } +{ "_id" : "62257", "city" : "MARISSA", "loc" : [ -89.750119, 38.245455 ], "pop" : 2634, "state" : "IL" } +{ "_id" : "62258", "city" : "MASCOUTAH", "loc" : [ -89.787745, 38.474496 ], "pop" : 8151, "state" : "IL" } +{ "_id" : "62260", "city" : "MILLSTADT", "loc" : [ -90.088818, 38.444264 ], "pop" : 4979, "state" : "IL" } +{ "_id" : "62261", "city" : "MODOC", "loc" : [ -90.016261, 38.050683 ], "pop" : 381, "state" : "IL" } +{ "_id" : "62262", "city" : "MULBERRY GROVE", "loc" : [ -89.246297, 38.931082 ], "pop" : 1721, "state" : "IL" } +{ "_id" : "62263", "city" : "NASHVILLE", "loc" : [ -89.384058, 38.335208 ], "pop" : 4546, "state" : "IL" } +{ "_id" : "62264", "city" : "NEW ATHENS", "loc" : [ -89.872777, 38.315998 ], "pop" : 2488, "state" : "IL" } +{ "_id" : "62265", "city" : "NEW BADEN", "loc" : [ -89.692232, 38.531485 ], "pop" : 3455, "state" : "IL" } +{ "_id" : "62268", "city" : "OAKDALE", "loc" : [ -89.596046, 38.257285 ], "pop" : 1348, "state" : "IL" } +{ "_id" : "62269", "city" : "SHILOH", "loc" : [ -89.9093, 38.59052 ], "pop" : 21198, "state" : "IL" } +{ "_id" : "62271", "city" : "OKAWVILLE", "loc" : [ -89.523045, 38.431862 ], "pop" : 2187, "state" : "IL" } +{ "_id" : "62272", "city" : "PERCY", "loc" : [ -89.616961, 38.01261 ], "pop" : 1241, "state" : "IL" } +{ "_id" : "62274", "city" : "PINCKNEYVILLE", "loc" : [ -89.38578, 38.090327 ], "pop" : 7013, "state" : "IL" } +{ "_id" : "62275", "city" : "POCAHONTAS", "loc" : [ -89.52468399999999, 38.78456 ], "pop" : 3279, "state" : "IL" } +{ "_id" : "62277", "city" : "PRAIRIE DU ROCHE", "loc" : [ -90.090147, 38.085468 ], "pop" : 1017, "state" : "IL" } +{ "_id" : "62278", "city" : "RED BUD", "loc" : [ -89.988356, 38.190738 ], "pop" : 4923, "state" : "IL" } +{ "_id" : "62279", "city" : "RENAULT", "loc" : [ -90.095043, 38.170396 ], "pop" : 929, "state" : "IL" } +{ "_id" : "62280", "city" : "ROCKWOOD", "loc" : [ -89.62144499999999, 37.832201 ], "pop" : 770, "state" : "IL" } +{ "_id" : "62281", "city" : "SAINT JACOB", "loc" : [ -89.669616, 38.72448 ], "pop" : 5477, "state" : "IL" } +{ "_id" : "62283", "city" : "SHATTUC", "loc" : [ -89.20543600000001, 38.643533 ], "pop" : 1079, "state" : "IL" } +{ "_id" : "62284", "city" : "SMITHBORO", "loc" : [ -89.326556, 38.873893 ], "pop" : 771, "state" : "IL" } +{ "_id" : "62285", "city" : "SMITHTON", "loc" : [ -89.989604, 38.423137 ], "pop" : 2749, "state" : "IL" } +{ "_id" : "62286", "city" : "SPARTA", "loc" : [ -89.703458, 38.131815 ], "pop" : 8035, "state" : "IL" } +{ "_id" : "62288", "city" : "STEELEVILLE", "loc" : [ -89.66645800000001, 38.005713 ], "pop" : 2951, "state" : "IL" } +{ "_id" : "62293", "city" : "TRENTON", "loc" : [ -89.644696, 38.619102 ], "pop" : 5574, "state" : "IL" } +{ "_id" : "62294", "city" : "TROY", "loc" : [ -89.870848, 38.724275 ], "pop" : 10526, "state" : "IL" } +{ "_id" : "62295", "city" : "VALMEYER", "loc" : [ -90.309234, 38.295163 ], "pop" : 1841, "state" : "IL" } +{ "_id" : "62297", "city" : "WALSH", "loc" : [ -89.82965799999999, 38.020286 ], "pop" : 801, "state" : "IL" } +{ "_id" : "62298", "city" : "WATERLOO", "loc" : [ -90.147773, 38.322273 ], "pop" : 8482, "state" : "IL" } +{ "_id" : "62301", "city" : "QUINCY", "loc" : [ -91.376284, 39.930701 ], "pop" : 52014, "state" : "IL" } +{ "_id" : "62311", "city" : "AUGUSTA", "loc" : [ -90.955416, 40.234109 ], "pop" : 867, "state" : "IL" } +{ "_id" : "62312", "city" : "BARRY", "loc" : [ -91.026482, 39.704662 ], "pop" : 2697, "state" : "IL" } +{ "_id" : "62313", "city" : "BASCO", "loc" : [ -91.196983, 40.328303 ], "pop" : 399, "state" : "IL" } +{ "_id" : "62314", "city" : "BAYLIS", "loc" : [ -90.883216, 39.761201 ], "pop" : 628, "state" : "IL" } +{ "_id" : "62316", "city" : "BOWEN", "loc" : [ -91.070491, 40.234076 ], "pop" : 693, "state" : "IL" } +{ "_id" : "62318", "city" : "BURNSIDE", "loc" : [ -91.142392, 40.497445 ], "pop" : 770, "state" : "IL" } +{ "_id" : "62319", "city" : "CAMDEN", "loc" : [ -90.75443300000001, 40.151076 ], "pop" : 317, "state" : "IL" } +{ "_id" : "62320", "city" : "CAMP POINT", "loc" : [ -91.076926, 40.029285 ], "pop" : 2113, "state" : "IL" } +{ "_id" : "62321", "city" : "CARTHAGE", "loc" : [ -91.100522, 40.412937 ], "pop" : 4171, "state" : "IL" } +{ "_id" : "62323", "city" : "CHAMBERSBURG", "loc" : [ -90.663017, 39.807058 ], "pop" : 203, "state" : "IL" } +{ "_id" : "62324", "city" : "CLAYTON", "loc" : [ -90.955394, 40.013342 ], "pop" : 1354, "state" : "IL" } +{ "_id" : "62325", "city" : "COATSBURG", "loc" : [ -91.174733, 40.055385 ], "pop" : 446, "state" : "IL" } +{ "_id" : "62326", "city" : "COLCHESTER", "loc" : [ -90.78456, 40.415643 ], "pop" : 2470, "state" : "IL" } +{ "_id" : "62330", "city" : "PONTOOSUC", "loc" : [ -91.163454, 40.620062 ], "pop" : 2146, "state" : "IL" } +{ "_id" : "62332", "city" : "DETROIT", "loc" : [ -90.65449, 39.618307 ], "pop" : 353, "state" : "IL" } +{ "_id" : "62334", "city" : "ELVASTON", "loc" : [ -91.21642, 40.40662 ], "pop" : 449, "state" : "IL" } +{ "_id" : "62338", "city" : "FOWLER", "loc" : [ -91.245226, 39.992504 ], "pop" : 508, "state" : "IL" } +{ "_id" : "62339", "city" : "GOLDEN", "loc" : [ -91.029588, 40.120257 ], "pop" : 938, "state" : "IL" } +{ "_id" : "62340", "city" : "GRIGGSVILLE", "loc" : [ -90.724891, 39.708378 ], "pop" : 1611, "state" : "IL" } +{ "_id" : "62341", "city" : "HAMILTON", "loc" : [ -91.344042, 40.439213 ], "pop" : 5574, "state" : "IL" } +{ "_id" : "62343", "city" : "HULL", "loc" : [ -91.233844, 39.718562 ], "pop" : 892, "state" : "IL" } +{ "_id" : "62344", "city" : "HUNTSVILLE", "loc" : [ -90.85313600000001, 40.154396 ], "pop" : 189, "state" : "IL" } +{ "_id" : "62345", "city" : "KINDERHOOK", "loc" : [ -91.16372800000001, 39.695313 ], "pop" : 427, "state" : "IL" } +{ "_id" : "62346", "city" : "LA PRAIRIE", "loc" : [ -90.984387, 40.157191 ], "pop" : 218, "state" : "IL" } +{ "_id" : "62347", "city" : "LIBERTY", "loc" : [ -91.08687999999999, 39.889176 ], "pop" : 1331, "state" : "IL" } +{ "_id" : "62348", "city" : "LIMA", "loc" : [ -91.38675600000001, 40.170098 ], "pop" : 559, "state" : "IL" } +{ "_id" : "62349", "city" : "LORAINE", "loc" : [ -91.21301, 40.153197 ], "pop" : 634, "state" : "IL" } +{ "_id" : "62351", "city" : "MENDON", "loc" : [ -91.289923, 40.085658 ], "pop" : 1462, "state" : "IL" } +{ "_id" : "62352", "city" : "MILTON", "loc" : [ -90.644346, 39.550811 ], "pop" : 548, "state" : "IL" } +{ "_id" : "62353", "city" : "MOUNT STERLING", "loc" : [ -90.74142399999999, 39.980279 ], "pop" : 4058, "state" : "IL" } +{ "_id" : "62355", "city" : "NEBO", "loc" : [ -90.7692, 39.420181 ], "pop" : 1011, "state" : "IL" } +{ "_id" : "62356", "city" : "NEW CANTON", "loc" : [ -91.088556, 39.634242 ], "pop" : 658, "state" : "IL" } +{ "_id" : "62357", "city" : "NEW SALEM", "loc" : [ -90.843986, 39.699573 ], "pop" : 292, "state" : "IL" } +{ "_id" : "62358", "city" : "NIOTA", "loc" : [ -91.299136, 40.597753 ], "pop" : 672, "state" : "IL" } +{ "_id" : "62359", "city" : "PALOMA", "loc" : [ -91.205287, 40.036616 ], "pop" : 254, "state" : "IL" } +{ "_id" : "62360", "city" : "PAYSON", "loc" : [ -91.262676, 39.815253 ], "pop" : 1939, "state" : "IL" } +{ "_id" : "62361", "city" : "PEARL", "loc" : [ -90.63795399999999, 39.444072 ], "pop" : 415, "state" : "IL" } +{ "_id" : "62362", "city" : "PERRY", "loc" : [ -90.746105, 39.787042 ], "pop" : 703, "state" : "IL" } +{ "_id" : "62363", "city" : "PITTSFIELD", "loc" : [ -90.80726900000001, 39.601306 ], "pop" : 5678, "state" : "IL" } +{ "_id" : "62365", "city" : "PLAINVILLE", "loc" : [ -91.143598, 39.800448 ], "pop" : 986, "state" : "IL" } +{ "_id" : "62366", "city" : "PLEASANT HILL", "loc" : [ -90.877011, 39.446697 ], "pop" : 1521, "state" : "IL" } +{ "_id" : "62367", "city" : "COLMAR", "loc" : [ -90.87381499999999, 40.288493 ], "pop" : 1425, "state" : "IL" } +{ "_id" : "62370", "city" : "ROCKPORT", "loc" : [ -90.972178, 39.532846 ], "pop" : 641, "state" : "IL" } +{ "_id" : "62373", "city" : "SUTTER", "loc" : [ -91.37609399999999, 40.309683 ], "pop" : 747, "state" : "IL" } +{ "_id" : "62374", "city" : "TENNESSEE", "loc" : [ -90.855605, 40.41399 ], "pop" : 414, "state" : "IL" } +{ "_id" : "62375", "city" : "TIMEWELL", "loc" : [ -90.866067, 40.011658 ], "pop" : 539, "state" : "IL" } +{ "_id" : "62376", "city" : "URSA", "loc" : [ -91.373341, 40.080918 ], "pop" : 1074, "state" : "IL" } +{ "_id" : "62378", "city" : "VERSAILLES", "loc" : [ -90.674147, 39.888286 ], "pop" : 1136, "state" : "IL" } +{ "_id" : "62379", "city" : "WARSAW", "loc" : [ -91.434803, 40.354449 ], "pop" : 1882, "state" : "IL" } +{ "_id" : "62380", "city" : "WEST POINT", "loc" : [ -91.249568, 40.245184 ], "pop" : 874, "state" : "IL" } +{ "_id" : "62401", "city" : "EFFINGHAM", "loc" : [ -88.561105, 39.121727 ], "pop" : 15524, "state" : "IL" } +{ "_id" : "62410", "city" : "ALLENDALE", "loc" : [ -87.721901, 38.523236 ], "pop" : 1051, "state" : "IL" } +{ "_id" : "62411", "city" : "ALTAMONT", "loc" : [ -88.748092, 39.063449 ], "pop" : 3867, "state" : "IL" } +{ "_id" : "62413", "city" : "ANNAPOLIS", "loc" : [ -87.802875, 39.117857 ], "pop" : 692, "state" : "IL" } +{ "_id" : "62414", "city" : "BEECHER CITY", "loc" : [ -88.80385, 39.183515 ], "pop" : 1968, "state" : "IL" } +{ "_id" : "62415", "city" : "BIRDS", "loc" : [ -87.681545, 38.812059 ], "pop" : 842, "state" : "IL" } +{ "_id" : "62417", "city" : "BRIDGEPORT", "loc" : [ -87.85492600000001, 38.694506 ], "pop" : 2076, "state" : "IL" } +{ "_id" : "62418", "city" : "BROWNSTOWN", "loc" : [ -88.949438, 38.989118 ], "pop" : 2434, "state" : "IL" } +{ "_id" : "62419", "city" : "CALHOUN", "loc" : [ -88.003745, 38.635116 ], "pop" : 715, "state" : "IL" } +{ "_id" : "62420", "city" : "CASEY", "loc" : [ -87.99130599999999, 39.301716 ], "pop" : 5300, "state" : "IL" } +{ "_id" : "62421", "city" : "CLAREMONT", "loc" : [ -87.972685, 38.742904 ], "pop" : 1320, "state" : "IL" } +{ "_id" : "62422", "city" : "COWDEN", "loc" : [ -88.886799, 39.232643 ], "pop" : 1521, "state" : "IL" } +{ "_id" : "62423", "city" : "DENNISON", "loc" : [ -87.58671, 39.449033 ], "pop" : 753, "state" : "IL" } +{ "_id" : "62424", "city" : "DIETERICH", "loc" : [ -88.407448, 39.031875 ], "pop" : 1639, "state" : "IL" } +{ "_id" : "62425", "city" : "DUNDAS", "loc" : [ -88.097309, 38.830572 ], "pop" : 437, "state" : "IL" } +{ "_id" : "62426", "city" : "LACLEDE", "loc" : [ -88.66386799999999, 38.91318 ], "pop" : 772, "state" : "IL" } +{ "_id" : "62427", "city" : "FLAT ROCK", "loc" : [ -87.683747, 38.909606 ], "pop" : 2173, "state" : "IL" } +{ "_id" : "62428", "city" : "HAZEL DELL", "loc" : [ -88.144502, 39.239454 ], "pop" : 2914, "state" : "IL" } +{ "_id" : "62431", "city" : "HERRICK", "loc" : [ -88.981211, 39.224481 ], "pop" : 628, "state" : "IL" } +{ "_id" : "62432", "city" : "HIDALGO", "loc" : [ -88.139706, 39.122808 ], "pop" : 820, "state" : "IL" } +{ "_id" : "62433", "city" : "HUTSONVILLE", "loc" : [ -87.669455, 39.106357 ], "pop" : 1039, "state" : "IL" } +{ "_id" : "62434", "city" : "INGRAHAM", "loc" : [ -88.320374, 38.828446 ], "pop" : 1077, "state" : "IL" } +{ "_id" : "62436", "city" : "JEWETT", "loc" : [ -88.24744, 39.207596 ], "pop" : 402, "state" : "IL" } +{ "_id" : "62438", "city" : "LAKEWOOD", "loc" : [ -88.87147400000001, 39.313358 ], "pop" : 415, "state" : "IL" } +{ "_id" : "62439", "city" : "LAWRENCEVILLE", "loc" : [ -87.678397, 38.730862 ], "pop" : 7833, "state" : "IL" } +{ "_id" : "62440", "city" : "LERNA", "loc" : [ -88.25302600000001, 39.39579 ], "pop" : 1289, "state" : "IL" } +{ "_id" : "62441", "city" : "MARSHALL", "loc" : [ -87.692261, 39.421999 ], "pop" : 8305, "state" : "IL" } +{ "_id" : "62442", "city" : "MARTINSVILLE", "loc" : [ -87.87073700000001, 39.317443 ], "pop" : 1881, "state" : "IL" } +{ "_id" : "62443", "city" : "MASON", "loc" : [ -88.623396, 38.964453 ], "pop" : 1774, "state" : "IL" } +{ "_id" : "62445", "city" : "MONTROSE", "loc" : [ -88.33497, 39.157274 ], "pop" : 1611, "state" : "IL" } +{ "_id" : "62446", "city" : "MOUNT ERIE", "loc" : [ -88.218521, 38.522151 ], "pop" : 470, "state" : "IL" } +{ "_id" : "62447", "city" : "NEOGA", "loc" : [ -88.450288, 39.322024 ], "pop" : 3494, "state" : "IL" } +{ "_id" : "62448", "city" : "NEWTON", "loc" : [ -88.17038599999999, 38.984678 ], "pop" : 5296, "state" : "IL" } +{ "_id" : "62449", "city" : "OBLONG", "loc" : [ -87.895016, 39.001043 ], "pop" : 3508, "state" : "IL" } +{ "_id" : "62450", "city" : "OLNEY", "loc" : [ -88.08093599999999, 38.733389 ], "pop" : 11163, "state" : "IL" } +{ "_id" : "62451", "city" : "PALESTINE", "loc" : [ -87.615695, 39.002823 ], "pop" : 2413, "state" : "IL" } +{ "_id" : "62452", "city" : "PARKERSBURG", "loc" : [ -88.064722, 38.589998 ], "pop" : 485, "state" : "IL" } +{ "_id" : "62454", "city" : "ROBINSON", "loc" : [ -87.748352, 39.007034 ], "pop" : 9243, "state" : "IL" } +{ "_id" : "62458", "city" : "SAINT ELMO", "loc" : [ -88.855181, 39.031544 ], "pop" : 2091, "state" : "IL" } +{ "_id" : "62460", "city" : "SAINT FRANCISVIL", "loc" : [ -87.67362799999999, 38.612494 ], "pop" : 1806, "state" : "IL" } +{ "_id" : "62461", "city" : "SHUMWAY", "loc" : [ -88.64182599999999, 39.188138 ], "pop" : 539, "state" : "IL" } +{ "_id" : "62462", "city" : "SIGEL", "loc" : [ -88.480301, 39.21762 ], "pop" : 2239, "state" : "IL" } +{ "_id" : "62463", "city" : "STEWARDSON", "loc" : [ -88.63185300000001, 39.27199 ], "pop" : 1219, "state" : "IL" } +{ "_id" : "62465", "city" : "STRASBURG", "loc" : [ -88.62786199999999, 39.364111 ], "pop" : 758, "state" : "IL" } +{ "_id" : "62466", "city" : "SUMNER", "loc" : [ -87.780728, 38.734077 ], "pop" : 3517, "state" : "IL" } +{ "_id" : "62467", "city" : "TEUTOPOLIS", "loc" : [ -88.476741, 39.131978 ], "pop" : 3095, "state" : "IL" } +{ "_id" : "62468", "city" : "TOLEDO", "loc" : [ -88.246821, 39.277223 ], "pop" : 2046, "state" : "IL" } +{ "_id" : "62469", "city" : "TRILLA", "loc" : [ -88.345698, 39.385286 ], "pop" : 499, "state" : "IL" } +{ "_id" : "62471", "city" : "VANDALIA", "loc" : [ -89.104116, 38.94391 ], "pop" : 7894, "state" : "IL" } +{ "_id" : "62473", "city" : "WATSON", "loc" : [ -88.559876, 39.039488 ], "pop" : 2740, "state" : "IL" } +{ "_id" : "62474", "city" : "WESTFIELD", "loc" : [ -88.044799, 39.442369 ], "pop" : 1602, "state" : "IL" } +{ "_id" : "62475", "city" : "WEST LIBERTY", "loc" : [ -88.09792899999999, 38.894989 ], "pop" : 593, "state" : "IL" } +{ "_id" : "62476", "city" : "WEST SALEM", "loc" : [ -88.032297, 38.518267 ], "pop" : 1994, "state" : "IL" } +{ "_id" : "62477", "city" : "WEST UNION", "loc" : [ -87.65121499999999, 39.240185 ], "pop" : 993, "state" : "IL" } +{ "_id" : "62478", "city" : "WEST YORK", "loc" : [ -87.71307299999999, 39.193793 ], "pop" : 665, "state" : "IL" } +{ "_id" : "62479", "city" : "WHEELER", "loc" : [ -88.317536, 39.018185 ], "pop" : 809, "state" : "IL" } +{ "_id" : "62480", "city" : "WILLOW HILL", "loc" : [ -88.017156, 38.975654 ], "pop" : 1708, "state" : "IL" } +{ "_id" : "62481", "city" : "YALE", "loc" : [ -88.01047, 39.129975 ], "pop" : 410, "state" : "IL" } +{ "_id" : "62501", "city" : "NEWBURG", "loc" : [ -88.821371, 39.991581 ], "pop" : 1444, "state" : "IL" } +{ "_id" : "62510", "city" : "ASSUMPTION", "loc" : [ -89.039807, 39.509489 ], "pop" : 1949, "state" : "IL" } +{ "_id" : "62511", "city" : "ATWATER", "loc" : [ -89.763374, 39.310733 ], "pop" : 489, "state" : "IL" } +{ "_id" : "62512", "city" : "BEASON", "loc" : [ -89.194801, 40.143652 ], "pop" : 467, "state" : "IL" } +{ "_id" : "62513", "city" : "BLUE MOUND", "loc" : [ -89.113558, 39.697813 ], "pop" : 1488, "state" : "IL" } +{ "_id" : "62514", "city" : "BOODY", "loc" : [ -89.07206100000001, 39.762824 ], "pop" : 541, "state" : "IL" } +{ "_id" : "62515", "city" : "BUFFALO HART", "loc" : [ -89.388846, 39.847201 ], "pop" : 797, "state" : "IL" } +{ "_id" : "62518", "city" : "CHESTNUT", "loc" : [ -89.19001400000001, 40.058202 ], "pop" : 436, "state" : "IL" } +{ "_id" : "62520", "city" : "DAWSON", "loc" : [ -89.460329, 39.85629 ], "pop" : 558, "state" : "IL" } +{ "_id" : "62521", "city" : "DECATUR", "loc" : [ -88.925984, 39.827137 ], "pop" : 39666, "state" : "IL" } +{ "_id" : "62522", "city" : "DECATUR", "loc" : [ -88.98613899999999, 39.843237 ], "pop" : 19224, "state" : "IL" } +{ "_id" : "62523", "city" : "DECATUR", "loc" : [ -88.953435, 39.841694 ], "pop" : 864, "state" : "IL" } +{ "_id" : "62526", "city" : "BEARSDALE", "loc" : [ -88.953515, 39.877413 ], "pop" : 39674, "state" : "IL" } +{ "_id" : "62530", "city" : "CIMIC", "loc" : [ -89.65465399999999, 39.567684 ], "pop" : 1484, "state" : "IL" } +{ "_id" : "62531", "city" : "EDINBURG", "loc" : [ -89.37788399999999, 39.661223 ], "pop" : 1925, "state" : "IL" } +{ "_id" : "62533", "city" : "THOMASVILLE", "loc" : [ -89.642718, 39.453048 ], "pop" : 1047, "state" : "IL" } +{ "_id" : "62534", "city" : "BRUNSWICK", "loc" : [ -88.756208, 39.503253 ], "pop" : 1410, "state" : "IL" } +{ "_id" : "62536", "city" : "GLENARM", "loc" : [ -89.65814399999999, 39.632713 ], "pop" : 739, "state" : "IL" } +{ "_id" : "62538", "city" : "HARVEL", "loc" : [ -89.53804, 39.371865 ], "pop" : 374, "state" : "IL" } +{ "_id" : "62539", "city" : "ILLIOPOLIS", "loc" : [ -89.251319, 39.849929 ], "pop" : 1366, "state" : "IL" } +{ "_id" : "62543", "city" : "LATHAM", "loc" : [ -89.17249200000001, 39.97111 ], "pop" : 857, "state" : "IL" } +{ "_id" : "62544", "city" : "MACON", "loc" : [ -88.988026, 39.704093 ], "pop" : 1737, "state" : "IL" } +{ "_id" : "62545", "city" : "BOLIVIA", "loc" : [ -89.417692, 39.77771 ], "pop" : 2228, "state" : "IL" } +{ "_id" : "62546", "city" : "MORRISONVILLE", "loc" : [ -89.45407, 39.415336 ], "pop" : 1418, "state" : "IL" } +{ "_id" : "62547", "city" : "MOUNT AUBURN", "loc" : [ -89.23567199999999, 39.762845 ], "pop" : 1011, "state" : "IL" } +{ "_id" : "62548", "city" : "MOUNT PULASKI", "loc" : [ -89.293482, 40.004482 ], "pop" : 2500, "state" : "IL" } +{ "_id" : "62549", "city" : "HERVEY CITY", "loc" : [ -88.87020699999999, 39.778883 ], "pop" : 5691, "state" : "IL" } +{ "_id" : "62550", "city" : "RADFORD", "loc" : [ -89.012776, 39.616135 ], "pop" : 3112, "state" : "IL" } +{ "_id" : "62551", "city" : "NIANTIC", "loc" : [ -89.17007099999999, 39.858175 ], "pop" : 850, "state" : "IL" } +{ "_id" : "62552", "city" : "CASNER", "loc" : [ -88.80559100000001, 39.896897 ], "pop" : 810, "state" : "IL" } +{ "_id" : "62553", "city" : "OCONEE", "loc" : [ -89.083636, 39.288408 ], "pop" : 796, "state" : "IL" } +{ "_id" : "62554", "city" : "OREANA", "loc" : [ -88.854675, 39.935135 ], "pop" : 1554, "state" : "IL" } +{ "_id" : "62555", "city" : "OWANECO", "loc" : [ -89.195071, 39.477508 ], "pop" : 540, "state" : "IL" } +{ "_id" : "62556", "city" : "CLARKSDALE", "loc" : [ -89.425555, 39.470817 ], "pop" : 689, "state" : "IL" } +{ "_id" : "62557", "city" : "DUNKEL", "loc" : [ -89.078165, 39.388124 ], "pop" : 7081, "state" : "IL" } +{ "_id" : "62558", "city" : "SICILY", "loc" : [ -89.57895499999999, 39.590966 ], "pop" : 2822, "state" : "IL" } +{ "_id" : "62560", "city" : "RAYMOND", "loc" : [ -89.58513499999999, 39.310551 ], "pop" : 1660, "state" : "IL" } +{ "_id" : "62561", "city" : "SPAULDING", "loc" : [ -89.54190800000001, 39.855239 ], "pop" : 3921, "state" : "IL" } +{ "_id" : "62563", "city" : "BERRY", "loc" : [ -89.547208, 39.759047 ], "pop" : 8726, "state" : "IL" } +{ "_id" : "62565", "city" : "CLARKSBURG", "loc" : [ -88.804615, 39.404873 ], "pop" : 7481, "state" : "IL" } +{ "_id" : "62567", "city" : "STONINGTON", "loc" : [ -89.191328, 39.640482 ], "pop" : 1280, "state" : "IL" } +{ "_id" : "62568", "city" : "HEWITTSVILLE", "loc" : [ -89.313357, 39.554516 ], "pop" : 17182, "state" : "IL" } +{ "_id" : "62571", "city" : "DOLLVILLE", "loc" : [ -88.97451700000001, 39.36576 ], "pop" : 1505, "state" : "IL" } +{ "_id" : "62572", "city" : "WAGGONER", "loc" : [ -89.647429, 39.38383 ], "pop" : 547, "state" : "IL" } +{ "_id" : "62573", "city" : "HEMAN", "loc" : [ -89.068316, 39.939737 ], "pop" : 1780, "state" : "IL" } +{ "_id" : "62601", "city" : "ORLEANS", "loc" : [ -90.035304, 39.725935 ], "pop" : 501, "state" : "IL" } +{ "_id" : "62611", "city" : "ARENZVILLE", "loc" : [ -90.363595, 39.897927 ], "pop" : 1008, "state" : "IL" } +{ "_id" : "62612", "city" : "NEWMANSVILLE", "loc" : [ -90.028721, 39.89168 ], "pop" : 1904, "state" : "IL" } +{ "_id" : "62613", "city" : "FANCY PRAIRIE", "loc" : [ -89.72108, 39.964813 ], "pop" : 2696, "state" : "IL" } +{ "_id" : "62615", "city" : "AUBURN", "loc" : [ -89.744033, 39.591787 ], "pop" : 3934, "state" : "IL" } +{ "_id" : "62617", "city" : "LYNCHBURG", "loc" : [ -90.148568, 40.161774 ], "pop" : 1118, "state" : "IL" } +{ "_id" : "62618", "city" : "BEARDSTOWN", "loc" : [ -90.42285099999999, 40.004356 ], "pop" : 7369, "state" : "IL" } +{ "_id" : "62621", "city" : "EXETER", "loc" : [ -90.53052700000001, 39.744078 ], "pop" : 1101, "state" : "IL" } +{ "_id" : "62624", "city" : "BADER", "loc" : [ -90.351671, 40.155025 ], "pop" : 766, "state" : "IL" } +{ "_id" : "62625", "city" : "CANTRALL", "loc" : [ -89.66426, 39.911267 ], "pop" : 1811, "state" : "IL" } +{ "_id" : "62626", "city" : "COMER", "loc" : [ -89.888935, 39.279821 ], "pop" : 7343, "state" : "IL" } +{ "_id" : "62627", "city" : "PANTHER CREEK", "loc" : [ -90.147657, 40.038437 ], "pop" : 1283, "state" : "IL" } +{ "_id" : "62628", "city" : "CHAPIN", "loc" : [ -90.411299, 39.771581 ], "pop" : 879, "state" : "IL" } +{ "_id" : "62629", "city" : "CHATHAM", "loc" : [ -89.711212, 39.673679 ], "pop" : 4922, "state" : "IL" } +{ "_id" : "62630", "city" : "HAGAMAN", "loc" : [ -90.076632, 39.270756 ], "pop" : 683, "state" : "IL" } +{ "_id" : "62631", "city" : "CONCORD", "loc" : [ -90.372175, 39.822958 ], "pop" : 460, "state" : "IL" } +{ "_id" : "62633", "city" : "BIGGS", "loc" : [ -89.846447, 40.235482 ], "pop" : 1056, "state" : "IL" } +{ "_id" : "62634", "city" : "BROADWELL", "loc" : [ -89.47493799999999, 40.002394 ], "pop" : 922, "state" : "IL" } +{ "_id" : "62635", "city" : "EMDEN", "loc" : [ -89.51744100000001, 40.294538 ], "pop" : 1144, "state" : "IL" } +{ "_id" : "62638", "city" : "CLEMENTS", "loc" : [ -90.048535, 39.608461 ], "pop" : 1280, "state" : "IL" } +{ "_id" : "62639", "city" : "FREDERICK", "loc" : [ -90.504391, 40.070246 ], "pop" : 690, "state" : "IL" } +{ "_id" : "62640", "city" : "MCVEY", "loc" : [ -89.780535, 39.447182 ], "pop" : 2454, "state" : "IL" } +{ "_id" : "62642", "city" : "HUBLY", "loc" : [ -89.711606, 40.079859 ], "pop" : 1499, "state" : "IL" } +{ "_id" : "62643", "city" : "HARTSBURG", "loc" : [ -89.451944, 40.245073 ], "pop" : 602, "state" : "IL" } +{ "_id" : "62644", "city" : "ECKARD", "loc" : [ -90.04952, 40.295995 ], "pop" : 5593, "state" : "IL" } +{ "_id" : "62649", "city" : "HETTICK", "loc" : [ -90.067161, 39.375217 ], "pop" : 518, "state" : "IL" } +{ "_id" : "62650", "city" : "ARCADIA", "loc" : [ -90.236238, 39.729269 ], "pop" : 28240, "state" : "IL" } +{ "_id" : "62655", "city" : "KILBOURNE", "loc" : [ -90.004279, 40.158696 ], "pop" : 633, "state" : "IL" } +{ "_id" : "62656", "city" : "LINCOLN", "loc" : [ -89.368376, 40.14508 ], "pop" : 20130, "state" : "IL" } +{ "_id" : "62661", "city" : "LOAMI", "loc" : [ -89.858823, 39.670394 ], "pop" : 1286, "state" : "IL" } +{ "_id" : "62664", "city" : "LUTHER", "loc" : [ -89.69925600000001, 40.199938 ], "pop" : 2968, "state" : "IL" } +{ "_id" : "62665", "city" : "NAPLES", "loc" : [ -90.549542, 39.797631 ], "pop" : 2215, "state" : "IL" } +{ "_id" : "62666", "city" : "MIDDLETOWN", "loc" : [ -89.58181999999999, 40.096668 ], "pop" : 586, "state" : "IL" } +{ "_id" : "62667", "city" : "MODESTO", "loc" : [ -89.97938600000001, 39.475965 ], "pop" : 564, "state" : "IL" } +{ "_id" : "62668", "city" : "NORTONVILLE", "loc" : [ -90.231189, 39.572952 ], "pop" : 1387, "state" : "IL" } +{ "_id" : "62670", "city" : "BATES", "loc" : [ -89.905721, 39.736048 ], "pop" : 1470, "state" : "IL" } +{ "_id" : "62671", "city" : "NEW HOLLAND", "loc" : [ -89.56044, 40.168226 ], "pop" : 663, "state" : "IL" } +{ "_id" : "62672", "city" : "NILWOOD", "loc" : [ -89.77841100000001, 39.387199 ], "pop" : 633, "state" : "IL" } +{ "_id" : "62673", "city" : "OAKFORD", "loc" : [ -89.96013499999999, 40.099445 ], "pop" : 493, "state" : "IL" } +{ "_id" : "62674", "city" : "BARR", "loc" : [ -89.95673600000001, 39.41654 ], "pop" : 1490, "state" : "IL" } +{ "_id" : "62675", "city" : "ATTERBURY", "loc" : [ -89.847874, 40.011529 ], "pop" : 5049, "state" : "IL" } +{ "_id" : "62676", "city" : "PLAINVIEW", "loc" : [ -89.97568699999999, 39.128311 ], "pop" : 792, "state" : "IL" } +{ "_id" : "62677", "city" : "FARMINGDALE", "loc" : [ -89.83836100000001, 39.849767 ], "pop" : 3081, "state" : "IL" } +{ "_id" : "62681", "city" : "LAYTON", "loc" : [ -90.560883, 40.124189 ], "pop" : 4747, "state" : "IL" } +{ "_id" : "62682", "city" : "ALLEN", "loc" : [ -89.625029, 40.294466 ], "pop" : 669, "state" : "IL" } +{ "_id" : "62683", "city" : "SCOTTVILLE", "loc" : [ -90.09692099999999, 39.478167 ], "pop" : 387, "state" : "IL" } +{ "_id" : "62684", "city" : "BARCLAY", "loc" : [ -89.60251, 39.889456 ], "pop" : 2185, "state" : "IL" } +{ "_id" : "62685", "city" : "ROYAL LAKES", "loc" : [ -90.048737, 39.124165 ], "pop" : 844, "state" : "IL" } +{ "_id" : "62688", "city" : "TALLULA", "loc" : [ -89.882274, 39.940188 ], "pop" : 1427, "state" : "IL" } +{ "_id" : "62690", "city" : "VIRDEN", "loc" : [ -89.77833200000001, 39.506447 ], "pop" : 5939, "state" : "IL" } +{ "_id" : "62691", "city" : "LITTLE INDIAN", "loc" : [ -90.212681, 39.945475 ], "pop" : 2144, "state" : "IL" } +{ "_id" : "62692", "city" : "WAVERLY", "loc" : [ -89.944903, 39.586983 ], "pop" : 1968, "state" : "IL" } +{ "_id" : "62693", "city" : "WILLIAMSVILLE", "loc" : [ -89.534172, 39.930438 ], "pop" : 2320, "state" : "IL" } +{ "_id" : "62694", "city" : "GLASGOW", "loc" : [ -90.433696, 39.614113 ], "pop" : 3909, "state" : "IL" } +{ "_id" : "62701", "city" : "SPRINGFIELD", "loc" : [ -89.649531, 39.80004 ], "pop" : 1155, "state" : "IL" } +{ "_id" : "62702", "city" : "GRANDVIEW", "loc" : [ -89.644147, 39.816768 ], "pop" : 42047, "state" : "IL" } +{ "_id" : "62703", "city" : "SOUTHERN VIEW", "loc" : [ -89.63333, 39.772401 ], "pop" : 32501, "state" : "IL" } +{ "_id" : "62704", "city" : "JEROME", "loc" : [ -89.681066, 39.780319 ], "pop" : 41611, "state" : "IL" } +{ "_id" : "62707", "city" : "ANDREW", "loc" : [ -89.663991, 39.772842 ], "pop" : 16264, "state" : "IL" } +{ "_id" : "62801", "city" : "CENTRALIA", "loc" : [ -89.136478, 38.524117 ], "pop" : 23956, "state" : "IL" } +{ "_id" : "62803", "city" : "HOYLETON", "loc" : [ -89.306854, 38.445468 ], "pop" : 1295, "state" : "IL" } +{ "_id" : "62806", "city" : "ALBION", "loc" : [ -88.063557, 38.374003 ], "pop" : 3162, "state" : "IL" } +{ "_id" : "62807", "city" : "ALMA", "loc" : [ -88.915695, 38.723089 ], "pop" : 1251, "state" : "IL" } +{ "_id" : "62808", "city" : "ASHLEY", "loc" : [ -89.231115, 38.306002 ], "pop" : 1260, "state" : "IL" } +{ "_id" : "62809", "city" : "BARNHILL", "loc" : [ -88.350831, 38.278144 ], "pop" : 165, "state" : "IL" } +{ "_id" : "62810", "city" : "BELLE RIVE", "loc" : [ -88.75580100000001, 38.215268 ], "pop" : 1149, "state" : "IL" } +{ "_id" : "62812", "city" : "BENTON", "loc" : [ -88.922659, 37.99998 ], "pop" : 11419, "state" : "IL" } +{ "_id" : "62814", "city" : "BLUFORD", "loc" : [ -88.75872, 38.353138 ], "pop" : 2622, "state" : "IL" } +{ "_id" : "62815", "city" : "BONE GAP", "loc" : [ -88.00249100000001, 38.448967 ], "pop" : 496, "state" : "IL" } +{ "_id" : "62816", "city" : "BONNIE", "loc" : [ -88.922884, 38.198017 ], "pop" : 994, "state" : "IL" } +{ "_id" : "62817", "city" : "BROUGHTON", "loc" : [ -88.467775, 37.954554 ], "pop" : 732, "state" : "IL" } +{ "_id" : "62818", "city" : "BROWNS", "loc" : [ -87.992824, 38.376433 ], "pop" : 440, "state" : "IL" } +{ "_id" : "62819", "city" : "BUCKNER", "loc" : [ -88.977993, 37.966881 ], "pop" : 278, "state" : "IL" } +{ "_id" : "62820", "city" : "BURNT PRAIRIE", "loc" : [ -88.214719, 38.208151 ], "pop" : 503, "state" : "IL" } +{ "_id" : "62821", "city" : "CARMI", "loc" : [ -88.16698700000001, 38.080819 ], "pop" : 8234, "state" : "IL" } +{ "_id" : "62822", "city" : "CHRISTOPHER", "loc" : [ -89.057367, 37.984905 ], "pop" : 5042, "state" : "IL" } +{ "_id" : "62823", "city" : "CISNE", "loc" : [ -88.40452399999999, 38.513774 ], "pop" : 1403, "state" : "IL" } +{ "_id" : "62824", "city" : "CLAY CITY", "loc" : [ -88.351641, 38.669501 ], "pop" : 1753, "state" : "IL" } +{ "_id" : "62827", "city" : "CROSSVILLE", "loc" : [ -88.05947399999999, 38.166029 ], "pop" : 1388, "state" : "IL" } +{ "_id" : "62828", "city" : "DAHLGREN", "loc" : [ -88.63631100000001, 38.197479 ], "pop" : 1627, "state" : "IL" } +{ "_id" : "62829", "city" : "DALE", "loc" : [ -88.53423100000001, 37.996585 ], "pop" : 594, "state" : "IL" } +{ "_id" : "62830", "city" : "DIX", "loc" : [ -88.96569700000001, 38.43329 ], "pop" : 1552, "state" : "IL" } +{ "_id" : "62831", "city" : "DU BOIS", "loc" : [ -89.204187, 38.252638 ], "pop" : 732, "state" : "IL" } +{ "_id" : "62832", "city" : "DU QUOIN", "loc" : [ -89.233268, 38.013687 ], "pop" : 10061, "state" : "IL" } +{ "_id" : "62833", "city" : "ELLERY", "loc" : [ -88.133455, 38.365021 ], "pop" : 141, "state" : "IL" } +{ "_id" : "62835", "city" : "ENFIELD", "loc" : [ -88.33254599999999, 38.092746 ], "pop" : 1145, "state" : "IL" } +{ "_id" : "62836", "city" : "EWING", "loc" : [ -88.850441, 38.07021 ], "pop" : 1286, "state" : "IL" } +{ "_id" : "62837", "city" : "FAIRFIELD", "loc" : [ -88.359323, 38.378214 ], "pop" : 8723, "state" : "IL" } +{ "_id" : "62838", "city" : "FARINA", "loc" : [ -88.76141200000001, 38.846902 ], "pop" : 925, "state" : "IL" } +{ "_id" : "62839", "city" : "FLORA", "loc" : [ -88.49186, 38.670337 ], "pop" : 6989, "state" : "IL" } +{ "_id" : "62840", "city" : "FRANKFORT HEIGHT", "loc" : [ -88.845651, 37.901301 ], "pop" : 778, "state" : "IL" } +{ "_id" : "62842", "city" : "GEFF", "loc" : [ -88.414428, 38.441326 ], "pop" : 632, "state" : "IL" } +{ "_id" : "62843", "city" : "GOLDEN GATE", "loc" : [ -88.207466, 38.364514 ], "pop" : 733, "state" : "IL" } +{ "_id" : "62844", "city" : "GRAYVILLE", "loc" : [ -88.003539, 38.262707 ], "pop" : 2569, "state" : "IL" } +{ "_id" : "62845", "city" : "HERALD", "loc" : [ -88.21315199999999, 37.967542 ], "pop" : 641, "state" : "IL" } +{ "_id" : "62846", "city" : "INA", "loc" : [ -88.88936200000001, 38.152743 ], "pop" : 800, "state" : "IL" } +{ "_id" : "62849", "city" : "IUKA", "loc" : [ -88.768925, 38.613563 ], "pop" : 965, "state" : "IL" } +{ "_id" : "62850", "city" : "JOHNSONVILLE", "loc" : [ -88.588701, 38.525628 ], "pop" : 1264, "state" : "IL" } +{ "_id" : "62851", "city" : "KEENES", "loc" : [ -88.64805800000001, 38.369146 ], "pop" : 968, "state" : "IL" } +{ "_id" : "62853", "city" : "KELL", "loc" : [ -88.84110699999999, 38.513256 ], "pop" : 1261, "state" : "IL" } +{ "_id" : "62854", "city" : "KINMUNDY", "loc" : [ -88.812999, 38.755857 ], "pop" : 2134, "state" : "IL" } +{ "_id" : "62855", "city" : "LANCASTER", "loc" : [ -87.871216, 38.537438 ], "pop" : 567, "state" : "IL" } +{ "_id" : "62858", "city" : "BIBLE GROVE", "loc" : [ -88.510046, 38.811856 ], "pop" : 3688, "state" : "IL" } +{ "_id" : "62859", "city" : "MC LEANSBORO", "loc" : [ -88.52855599999999, 38.093861 ], "pop" : 4357, "state" : "IL" } +{ "_id" : "62860", "city" : "MACEDONIA", "loc" : [ -88.696077, 38.013023 ], "pop" : 1505, "state" : "IL" } +{ "_id" : "62862", "city" : "MILL SHOALS", "loc" : [ -88.333817, 38.244675 ], "pop" : 412, "state" : "IL" } +{ "_id" : "62863", "city" : "MOUNT CARMEL", "loc" : [ -87.791107, 38.414727 ], "pop" : 11493, "state" : "IL" } +{ "_id" : "62864", "city" : "MOUNT VERNON", "loc" : [ -88.91052500000001, 38.317014 ], "pop" : 23844, "state" : "IL" } +{ "_id" : "62865", "city" : "MULKEYTOWN", "loc" : [ -89.1159, 37.968712 ], "pop" : 474, "state" : "IL" } +{ "_id" : "62866", "city" : "NASON", "loc" : [ -88.968839, 38.173872 ], "pop" : 269, "state" : "IL" } +{ "_id" : "62867", "city" : "NEW HAVEN", "loc" : [ -88.12845799999999, 37.899907 ], "pop" : 558, "state" : "IL" } +{ "_id" : "62868", "city" : "NOBLE", "loc" : [ -88.219038, 38.711851 ], "pop" : 2425, "state" : "IL" } +{ "_id" : "62869", "city" : "NORRIS CITY", "loc" : [ -88.32434000000001, 37.9773 ], "pop" : 2377, "state" : "IL" } +{ "_id" : "62870", "city" : "ODIN", "loc" : [ -89.055228, 38.608786 ], "pop" : 1758, "state" : "IL" } +{ "_id" : "62871", "city" : "OMAHA", "loc" : [ -88.286484, 37.890423 ], "pop" : 638, "state" : "IL" } +{ "_id" : "62872", "city" : "OPDYKE", "loc" : [ -88.77495500000001, 38.274955 ], "pop" : 284, "state" : "IL" } +{ "_id" : "62875", "city" : "PATOKA", "loc" : [ -89.094188, 38.754852 ], "pop" : 857, "state" : "IL" } +{ "_id" : "62877", "city" : "RICHVIEW", "loc" : [ -89.175572, 38.408227 ], "pop" : 1087, "state" : "IL" } +{ "_id" : "62878", "city" : "RINARD", "loc" : [ -88.464094, 38.580596 ], "pop" : 377, "state" : "IL" } +{ "_id" : "62880", "city" : "SAINT PETER", "loc" : [ -88.855998, 38.869684 ], "pop" : 725, "state" : "IL" } +{ "_id" : "62881", "city" : "SALEM", "loc" : [ -88.948077, 38.626421 ], "pop" : 11599, "state" : "IL" } +{ "_id" : "62882", "city" : "SANDOVAL", "loc" : [ -89.11400999999999, 38.613113 ], "pop" : 3145, "state" : "IL" } +{ "_id" : "62883", "city" : "SCHELLER", "loc" : [ -89.092691, 38.173095 ], "pop" : 528, "state" : "IL" } +{ "_id" : "62884", "city" : "SESSER", "loc" : [ -89.05740400000001, 38.089422 ], "pop" : 2844, "state" : "IL" } +{ "_id" : "62885", "city" : "SHOBONIER", "loc" : [ -89.078959, 38.844584 ], "pop" : 219, "state" : "IL" } +{ "_id" : "62886", "city" : "SIMS", "loc" : [ -88.530642, 38.392318 ], "pop" : 868, "state" : "IL" } +{ "_id" : "62887", "city" : "SPRINGERTON", "loc" : [ -88.37261100000001, 38.169868 ], "pop" : 737, "state" : "IL" } +{ "_id" : "62888", "city" : "TAMAROA", "loc" : [ -89.223091, 38.137969 ], "pop" : 1788, "state" : "IL" } +{ "_id" : "62889", "city" : "TEXICO", "loc" : [ -88.87015100000001, 38.425035 ], "pop" : 1159, "state" : "IL" } +{ "_id" : "62890", "city" : "THOMPSONVILLE", "loc" : [ -88.768394, 37.880438 ], "pop" : 2413, "state" : "IL" } +{ "_id" : "62892", "city" : "VERNON", "loc" : [ -89.083001, 38.803328 ], "pop" : 371, "state" : "IL" } +{ "_id" : "62893", "city" : "WALNUT HILL", "loc" : [ -88.984514, 38.520006 ], "pop" : 1386, "state" : "IL" } +{ "_id" : "62894", "city" : "WALTONVILLE", "loc" : [ -89.006702, 38.246479 ], "pop" : 1923, "state" : "IL" } +{ "_id" : "62895", "city" : "WAYNE CITY", "loc" : [ -88.58331699999999, 38.332808 ], "pop" : 1523, "state" : "IL" } +{ "_id" : "62896", "city" : "WEST FRANKFORT", "loc" : [ -88.930724, 37.897914 ], "pop" : 11800, "state" : "IL" } +{ "_id" : "62897", "city" : "WHITTINGTON", "loc" : [ -88.863456, 38.098937 ], "pop" : 370, "state" : "IL" } +{ "_id" : "62898", "city" : "WOODLAWN", "loc" : [ -89.074457, 38.38444 ], "pop" : 1896, "state" : "IL" } +{ "_id" : "62899", "city" : "XENIA", "loc" : [ -88.63789, 38.669747 ], "pop" : 1252, "state" : "IL" } +{ "_id" : "62901", "city" : "CARBONDALE", "loc" : [ -89.215762, 37.719994 ], "pop" : 31742, "state" : "IL" } +{ "_id" : "62905", "city" : "ALTO PASS", "loc" : [ -89.317179, 37.568142 ], "pop" : 912, "state" : "IL" } +{ "_id" : "62906", "city" : "ANNA", "loc" : [ -89.22068400000001, 37.466777 ], "pop" : 8151, "state" : "IL" } +{ "_id" : "62907", "city" : "AVA", "loc" : [ -89.465366, 37.879286 ], "pop" : 1806, "state" : "IL" } +{ "_id" : "62908", "city" : "BELKNAP", "loc" : [ -88.95065200000001, 37.326584 ], "pop" : 188, "state" : "IL" } +{ "_id" : "62910", "city" : "NEW LIBERTY", "loc" : [ -88.61194399999999, 37.138731 ], "pop" : 2565, "state" : "IL" } +{ "_id" : "62912", "city" : "BUNCOMBE", "loc" : [ -88.980586, 37.463661 ], "pop" : 696, "state" : "IL" } +{ "_id" : "62913", "city" : "CACHE", "loc" : [ -89.298018, 37.114131 ], "pop" : 80, "state" : "IL" } +{ "_id" : "62914", "city" : "CAIRO", "loc" : [ -89.181104, 37.012293 ], "pop" : 5439, "state" : "IL" } +{ "_id" : "62916", "city" : "CAMPBELL HILL", "loc" : [ -89.57990100000001, 37.922778 ], "pop" : 976, "state" : "IL" } +{ "_id" : "62917", "city" : "CARRIER MILLS", "loc" : [ -88.612706, 37.678199 ], "pop" : 3355, "state" : "IL" } +{ "_id" : "62918", "city" : "CARTERVILLE", "loc" : [ -89.097793, 37.774785 ], "pop" : 10457, "state" : "IL" } +{ "_id" : "62919", "city" : "CAVE IN ROCK", "loc" : [ -88.22196099999999, 37.517947 ], "pop" : 2266, "state" : "IL" } +{ "_id" : "62920", "city" : "COBDEN", "loc" : [ -89.245741, 37.542358 ], "pop" : 2348, "state" : "IL" } +{ "_id" : "62922", "city" : "CREAL SPRINGS", "loc" : [ -88.880697, 37.628393 ], "pop" : 2743, "state" : "IL" } +{ "_id" : "62923", "city" : "CYPRESS", "loc" : [ -89.014414, 37.366223 ], "pop" : 618, "state" : "IL" } +{ "_id" : "62924", "city" : "DE SOTO", "loc" : [ -89.221834, 37.81473 ], "pop" : 2073, "state" : "IL" } +{ "_id" : "62926", "city" : "DONGOLA", "loc" : [ -89.134933, 37.371234 ], "pop" : 2361, "state" : "IL" } +{ "_id" : "62928", "city" : "EDDYVILLE", "loc" : [ -88.594893, 37.52439 ], "pop" : 677, "state" : "IL" } +{ "_id" : "62930", "city" : "ELDORADO", "loc" : [ -88.443382, 37.813885 ], "pop" : 7036, "state" : "IL" } +{ "_id" : "62931", "city" : "ELIZABETHTOWN", "loc" : [ -88.28673499999999, 37.466492 ], "pop" : 815, "state" : "IL" } +{ "_id" : "62932", "city" : "ELKVILLE", "loc" : [ -89.233574, 37.915506 ], "pop" : 2091, "state" : "IL" } +{ "_id" : "62934", "city" : "EQUALITY", "loc" : [ -88.3445, 37.727786 ], "pop" : 1173, "state" : "IL" } +{ "_id" : "62935", "city" : "GALATIA", "loc" : [ -88.62348799999999, 37.827444 ], "pop" : 2802, "state" : "IL" } +{ "_id" : "62938", "city" : "BROWNFIELD", "loc" : [ -88.555148, 37.349984 ], "pop" : 2997, "state" : "IL" } +{ "_id" : "62939", "city" : "GOREVILLE", "loc" : [ -88.965524, 37.574985 ], "pop" : 2867, "state" : "IL" } +{ "_id" : "62940", "city" : "GORHAM", "loc" : [ -89.444031, 37.740611 ], "pop" : 982, "state" : "IL" } +{ "_id" : "62941", "city" : "GRAND CHAIN", "loc" : [ -89.008335, 37.251043 ], "pop" : 603, "state" : "IL" } +{ "_id" : "62942", "city" : "GRAND TOWER", "loc" : [ -89.49986, 37.63222 ], "pop" : 903, "state" : "IL" } +{ "_id" : "62943", "city" : "GRANTSBURG", "loc" : [ -88.770489, 37.39672 ], "pop" : 2549, "state" : "IL" } +{ "_id" : "62946", "city" : "HARRISBURG", "loc" : [ -88.54404, 37.725661 ], "pop" : 12122, "state" : "IL" } +{ "_id" : "62947", "city" : "HEROD", "loc" : [ -88.458062, 37.469731 ], "pop" : 699, "state" : "IL" } +{ "_id" : "62948", "city" : "HERRIN", "loc" : [ -89.02316, 37.801884 ], "pop" : 13900, "state" : "IL" } +{ "_id" : "62950", "city" : "JACOB", "loc" : [ -89.544359, 37.743738 ], "pop" : 257, "state" : "IL" } +{ "_id" : "62951", "city" : "JOHNSTON CITY", "loc" : [ -88.920858, 37.824477 ], "pop" : 5424, "state" : "IL" } +{ "_id" : "62952", "city" : "JONESBORO", "loc" : [ -89.291494, 37.446082 ], "pop" : 3383, "state" : "IL" } +{ "_id" : "62953", "city" : "JOPPA", "loc" : [ -88.84819, 37.247192 ], "pop" : 1687, "state" : "IL" } +{ "_id" : "62954", "city" : "JUNCTION", "loc" : [ -88.249071, 37.695206 ], "pop" : 581, "state" : "IL" } +{ "_id" : "62955", "city" : "KARBERS RIDGE", "loc" : [ -88.367893, 37.463071 ], "pop" : 686, "state" : "IL" } +{ "_id" : "62956", "city" : "KARNAK", "loc" : [ -88.97394300000001, 37.291066 ], "pop" : 710, "state" : "IL" } +{ "_id" : "62957", "city" : "MC CLURE", "loc" : [ -89.453119, 37.301983 ], "pop" : 1231, "state" : "IL" } +{ "_id" : "62958", "city" : "MAKANDA", "loc" : [ -89.214232, 37.656396 ], "pop" : 3893, "state" : "IL" } +{ "_id" : "62959", "city" : "MARION", "loc" : [ -88.929447, 37.725662 ], "pop" : 20722, "state" : "IL" } +{ "_id" : "62960", "city" : "METROPOLIS", "loc" : [ -88.725179, 37.175348 ], "pop" : 10500, "state" : "IL" } +{ "_id" : "62961", "city" : "MILLCREEK", "loc" : [ -89.26988900000001, 37.353127 ], "pop" : 356, "state" : "IL" } +{ "_id" : "62962", "city" : "MILLER CITY", "loc" : [ -89.34944299999999, 37.103359 ], "pop" : 122, "state" : "IL" } +{ "_id" : "62963", "city" : "MOUND CITY", "loc" : [ -89.163687, 37.086474 ], "pop" : 845, "state" : "IL" } +{ "_id" : "62964", "city" : "MOUNDS", "loc" : [ -89.200064, 37.11883 ], "pop" : 2064, "state" : "IL" } +{ "_id" : "62966", "city" : "MURPHYSBORO", "loc" : [ -89.331749, 37.765464 ], "pop" : 15335, "state" : "IL" } +{ "_id" : "62967", "city" : "NEW BURNSIDE", "loc" : [ -88.771253, 37.580608 ], "pop" : 512, "state" : "IL" } +{ "_id" : "62970", "city" : "OLMSTED", "loc" : [ -89.093266, 37.193507 ], "pop" : 692, "state" : "IL" } +{ "_id" : "62972", "city" : "OZARK", "loc" : [ -88.768778, 37.536704 ], "pop" : 463, "state" : "IL" } +{ "_id" : "62974", "city" : "PITTSBURG", "loc" : [ -88.87039300000001, 37.78387 ], "pop" : 1330, "state" : "IL" } +{ "_id" : "62975", "city" : "POMONA", "loc" : [ -89.336308, 37.641081 ], "pop" : 769, "state" : "IL" } +{ "_id" : "62976", "city" : "PULASKI", "loc" : [ -89.19680099999999, 37.214575 ], "pop" : 663, "state" : "IL" } +{ "_id" : "62977", "city" : "RALEIGH", "loc" : [ -88.53236800000001, 37.825597 ], "pop" : 817, "state" : "IL" } +{ "_id" : "62979", "city" : "RIDGWAY", "loc" : [ -88.261202, 37.804242 ], "pop" : 1686, "state" : "IL" } +{ "_id" : "62982", "city" : "ROSICLARE", "loc" : [ -88.346189, 37.423987 ], "pop" : 1422, "state" : "IL" } +{ "_id" : "62983", "city" : "ROYALTON", "loc" : [ -89.114149, 37.879033 ], "pop" : 1344, "state" : "IL" } +{ "_id" : "62984", "city" : "SHAWNEETOWN", "loc" : [ -88.17850300000001, 37.713188 ], "pop" : 2400, "state" : "IL" } +{ "_id" : "62985", "city" : "ROBBS", "loc" : [ -88.76245900000001, 37.463032 ], "pop" : 507, "state" : "IL" } +{ "_id" : "62987", "city" : "STONEFORT", "loc" : [ -88.742807, 37.62992 ], "pop" : 1255, "state" : "IL" } +{ "_id" : "62988", "city" : "TAMMS", "loc" : [ -89.276346, 37.234493 ], "pop" : 2020, "state" : "IL" } +{ "_id" : "62990", "city" : "GALE", "loc" : [ -89.396896, 37.191554 ], "pop" : 1732, "state" : "IL" } +{ "_id" : "62991", "city" : "TUNNEL HILL", "loc" : [ -88.883459, 37.573676 ], "pop" : 867, "state" : "IL" } +{ "_id" : "62992", "city" : "ULLIN", "loc" : [ -89.191137, 37.270385 ], "pop" : 787, "state" : "IL" } +{ "_id" : "62994", "city" : "VERGENNES", "loc" : [ -89.326863, 37.905128 ], "pop" : 681, "state" : "IL" } +{ "_id" : "62995", "city" : "VIENNA", "loc" : [ -88.88786899999999, 37.420541 ], "pop" : 2767, "state" : "IL" } +{ "_id" : "62996", "city" : "VILLA RIDGE", "loc" : [ -89.18252200000001, 37.157765 ], "pop" : 736, "state" : "IL" } +{ "_id" : "62997", "city" : "WILLISVILLE", "loc" : [ -89.578487, 37.982142 ], "pop" : 912, "state" : "IL" } +{ "_id" : "62998", "city" : "WOLF LAKE", "loc" : [ -89.44076099999999, 37.511985 ], "pop" : 533, "state" : "IL" } +{ "_id" : "62999", "city" : "ZEIGLER", "loc" : [ -89.06026, 37.906923 ], "pop" : 2502, "state" : "IL" } +{ "_id" : "63005", "city" : "CHESTERFIELD", "loc" : [ -90.61418500000001, 38.631832 ], "pop" : 7770, "state" : "MO" } +{ "_id" : "63010", "city" : "ARNOLD", "loc" : [ -90.387046, 38.430484 ], "pop" : 29195, "state" : "MO" } +{ "_id" : "63011", "city" : "MANCHESTER", "loc" : [ -90.55213000000001, 38.604132 ], "pop" : 36722, "state" : "MO" } +{ "_id" : "63012", "city" : "BARNHART", "loc" : [ -90.41417, 38.338425 ], "pop" : 7689, "state" : "MO" } +{ "_id" : "63013", "city" : "BEAUFORT", "loc" : [ -91.170929, 38.429352 ], "pop" : 460, "state" : "MO" } +{ "_id" : "63014", "city" : "BERGER", "loc" : [ -91.337412, 38.644449 ], "pop" : 1092, "state" : "MO" } +{ "_id" : "63015", "city" : "CATAWISSA", "loc" : [ -90.761703, 38.436161 ], "pop" : 831, "state" : "MO" } +{ "_id" : "63016", "city" : "CEDAR HILL", "loc" : [ -90.649777, 38.357319 ], "pop" : 7211, "state" : "MO" } +{ "_id" : "63017", "city" : "TOWN AND COUNTRY", "loc" : [ -90.53968999999999, 38.647241 ], "pop" : 40848, "state" : "MO" } +{ "_id" : "63019", "city" : "CRYSTAL CITY", "loc" : [ -90.382525, 38.23002 ], "pop" : 4112, "state" : "MO" } +{ "_id" : "63020", "city" : "DE SOTO", "loc" : [ -90.554621, 38.120421 ], "pop" : 13331, "state" : "MO" } +{ "_id" : "63021", "city" : "BALLWIN", "loc" : [ -90.525527, 38.577032 ], "pop" : 46397, "state" : "MO" } +{ "_id" : "63023", "city" : "DITTMER", "loc" : [ -90.691101, 38.315465 ], "pop" : 2410, "state" : "MO" } +{ "_id" : "63025", "city" : "CRESCENT", "loc" : [ -90.626277, 38.484832 ], "pop" : 6053, "state" : "MO" } +{ "_id" : "63026", "city" : "FENTON", "loc" : [ -90.468299, 38.501489 ], "pop" : 38020, "state" : "MO" } +{ "_id" : "63028", "city" : "FESTUS", "loc" : [ -90.42859, 38.187889 ], "pop" : 22497, "state" : "MO" } +{ "_id" : "63030", "city" : "FLETCHER", "loc" : [ -90.73445599999999, 38.180141 ], "pop" : 241, "state" : "MO" } +{ "_id" : "63031", "city" : "FLORISSANT", "loc" : [ -90.340097, 38.806865 ], "pop" : 52659, "state" : "MO" } +{ "_id" : "63033", "city" : "FLORISSANT", "loc" : [ -90.283062, 38.794711 ], "pop" : 44480, "state" : "MO" } +{ "_id" : "63034", "city" : "FLORISSANT", "loc" : [ -90.293617, 38.833841 ], "pop" : 13972, "state" : "MO" } +{ "_id" : "63036", "city" : "FRENCH VILLAGE", "loc" : [ -90.400507, 37.996101 ], "pop" : 697, "state" : "MO" } +{ "_id" : "63037", "city" : "GERALD", "loc" : [ -91.29306200000001, 38.350719 ], "pop" : 4664, "state" : "MO" } +{ "_id" : "63038", "city" : "GLENCOE", "loc" : [ -90.64397099999999, 38.5745 ], "pop" : 6093, "state" : "MO" } +{ "_id" : "63039", "city" : "GRAY SUMMIT", "loc" : [ -90.829184, 38.503044 ], "pop" : 752, "state" : "MO" } +{ "_id" : "63040", "city" : "GROVER", "loc" : [ -90.646112, 38.573316 ], "pop" : 497, "state" : "MO" } +{ "_id" : "63042", "city" : "HAZELWOOD", "loc" : [ -90.36692499999999, 38.780875 ], "pop" : 20004, "state" : "MO" } +{ "_id" : "63043", "city" : "MARYLAND HEIGHTS", "loc" : [ -90.44740299999999, 38.722896 ], "pop" : 21268, "state" : "MO" } +{ "_id" : "63044", "city" : "BRIDGETON", "loc" : [ -90.416101, 38.750627 ], "pop" : 17695, "state" : "MO" } +{ "_id" : "63045", "city" : "BRIDGETON", "loc" : [ -90.458062, 38.7561 ], "pop" : 0, "state" : "MO" } +{ "_id" : "63048", "city" : "HERCULANEUM", "loc" : [ -90.387095, 38.260087 ], "pop" : 2490, "state" : "MO" } +{ "_id" : "63049", "city" : "HIGH RIDGE", "loc" : [ -90.528127, 38.472783 ], "pop" : 12915, "state" : "MO" } +{ "_id" : "63050", "city" : "HILLSBORO", "loc" : [ -90.57819600000001, 38.258582 ], "pop" : 14095, "state" : "MO" } +{ "_id" : "63051", "city" : "HOUSE SPRINGS", "loc" : [ -90.55753900000001, 38.413068 ], "pop" : 10035, "state" : "MO" } +{ "_id" : "63052", "city" : "ANTONIA", "loc" : [ -90.431134, 38.392733 ], "pop" : 17913, "state" : "MO" } +{ "_id" : "63055", "city" : "LABADIE", "loc" : [ -90.876966, 38.520031 ], "pop" : 498, "state" : "MO" } +{ "_id" : "63056", "city" : "LESLIE", "loc" : [ -91.19516400000001, 38.458228 ], "pop" : 1238, "state" : "MO" } +{ "_id" : "63060", "city" : "LONEDELL", "loc" : [ -90.822216, 38.274982 ], "pop" : 1153, "state" : "MO" } +{ "_id" : "63061", "city" : "LUEBBERING", "loc" : [ -90.802713, 38.261499 ], "pop" : 224, "state" : "MO" } +{ "_id" : "63068", "city" : "NEW HAVEN", "loc" : [ -91.22905, 38.573995 ], "pop" : 4353, "state" : "MO" } +{ "_id" : "63069", "city" : "PACIFIC", "loc" : [ -90.747968, 38.492168 ], "pop" : 12874, "state" : "MO" } +{ "_id" : "63070", "city" : "PEVELY", "loc" : [ -90.411075, 38.279911 ], "pop" : 5221, "state" : "MO" } +{ "_id" : "63071", "city" : "RICHWOODS", "loc" : [ -90.83099, 38.149639 ], "pop" : 1079, "state" : "MO" } +{ "_id" : "63072", "city" : "ROBERTSVILLE", "loc" : [ -90.801619, 38.381602 ], "pop" : 4250, "state" : "MO" } +{ "_id" : "63074", "city" : "SAINT ANN", "loc" : [ -90.38641800000001, 38.725928 ], "pop" : 16528, "state" : "MO" } +{ "_id" : "63077", "city" : "SAINT CLAIR", "loc" : [ -90.971346, 38.329927 ], "pop" : 10668, "state" : "MO" } +{ "_id" : "63080", "city" : "SULLIVAN", "loc" : [ -91.156662, 38.230706 ], "pop" : 7541, "state" : "MO" } +{ "_id" : "63084", "city" : "UNION", "loc" : [ -91.020596, 38.445629 ], "pop" : 14183, "state" : "MO" } +{ "_id" : "63088", "city" : "VALLEY PARK", "loc" : [ -90.492422, 38.557619 ], "pop" : 5014, "state" : "MO" } +{ "_id" : "63089", "city" : "VILLA RIDGE", "loc" : [ -90.882198, 38.460108 ], "pop" : 4954, "state" : "MO" } +{ "_id" : "63090", "city" : "WASHINGTON", "loc" : [ -91.019346, 38.545851 ], "pop" : 15437, "state" : "MO" } +{ "_id" : "63091", "city" : "ROSEBUD", "loc" : [ -91.397407, 38.385301 ], "pop" : 607, "state" : "MO" } +{ "_id" : "63101", "city" : "SAINT LOUIS", "loc" : [ -90.19131299999999, 38.634616 ], "pop" : 931, "state" : "MO" } +{ "_id" : "63102", "city" : "SAINT LOUIS", "loc" : [ -90.18736, 38.630803 ], "pop" : 731, "state" : "MO" } +{ "_id" : "63103", "city" : "SAINT LOUIS", "loc" : [ -90.216444, 38.633176 ], "pop" : 6710, "state" : "MO" } +{ "_id" : "63104", "city" : "SAINT LOUIS", "loc" : [ -90.218512, 38.612819 ], "pop" : 20885, "state" : "MO" } +{ "_id" : "63105", "city" : "CLAYTON", "loc" : [ -90.324189, 38.642574 ], "pop" : 15732, "state" : "MO" } +{ "_id" : "63106", "city" : "SAINT LOUIS", "loc" : [ -90.208198, 38.644246 ], "pop" : 15156, "state" : "MO" } +{ "_id" : "63107", "city" : "SAINT LOUIS", "loc" : [ -90.21249, 38.664522 ], "pop" : 23263, "state" : "MO" } +{ "_id" : "63108", "city" : "SAINT LOUIS", "loc" : [ -90.254397, 38.644526 ], "pop" : 20993, "state" : "MO" } +{ "_id" : "63109", "city" : "SAINT LOUIS", "loc" : [ -90.292918, 38.585452 ], "pop" : 30029, "state" : "MO" } +{ "_id" : "63110", "city" : "SAINT LOUIS", "loc" : [ -90.256381, 38.618534 ], "pop" : 23697, "state" : "MO" } +{ "_id" : "63111", "city" : "SAINT LOUIS", "loc" : [ -90.24945200000001, 38.563349 ], "pop" : 22733, "state" : "MO" } +{ "_id" : "63112", "city" : "SAINT LOUIS", "loc" : [ -90.28187, 38.661619 ], "pop" : 28841, "state" : "MO" } +{ "_id" : "63113", "city" : "SAINT LOUIS", "loc" : [ -90.249633, 38.65896 ], "pop" : 23360, "state" : "MO" } +{ "_id" : "63114", "city" : "OVERLAND", "loc" : [ -90.363304, 38.704425 ], "pop" : 40522, "state" : "MO" } +{ "_id" : "63115", "city" : "SAINT LOUIS", "loc" : [ -90.238478, 38.675618 ], "pop" : 30748, "state" : "MO" } +{ "_id" : "63116", "city" : "SAINT LOUIS", "loc" : [ -90.26254299999999, 38.581356 ], "pop" : 49014, "state" : "MO" } +{ "_id" : "63117", "city" : "RICHMOND HEIGHTS", "loc" : [ -90.324817, 38.629202 ], "pop" : 10263, "state" : "MO" } +{ "_id" : "63118", "city" : "SAINT LOUIS", "loc" : [ -90.23091100000001, 38.594265 ], "pop" : 33259, "state" : "MO" } +{ "_id" : "63119", "city" : "WEBSTER GROVES", "loc" : [ -90.350807, 38.588853 ], "pop" : 33698, "state" : "MO" } +{ "_id" : "63120", "city" : "SAINT LOUIS", "loc" : [ -90.25945, 38.690914 ], "pop" : 17815, "state" : "MO" } +{ "_id" : "63121", "city" : "NORMANDY", "loc" : [ -90.296719, 38.705086 ], "pop" : 31649, "state" : "MO" } +{ "_id" : "63122", "city" : "KIRKWOOD", "loc" : [ -90.410042, 38.58486 ], "pop" : 39452, "state" : "MO" } +{ "_id" : "63123", "city" : "AFFTON", "loc" : [ -90.325304, 38.550594 ], "pop" : 47127, "state" : "MO" } +{ "_id" : "63124", "city" : "LADUE", "loc" : [ -90.375468, 38.642383 ], "pop" : 9517, "state" : "MO" } +{ "_id" : "63125", "city" : "LEMAY", "loc" : [ -90.29590899999999, 38.521899 ], "pop" : 33874, "state" : "MO" } +{ "_id" : "63126", "city" : "SAPPINGTON", "loc" : [ -90.37867900000001, 38.550349 ], "pop" : 16311, "state" : "MO" } +{ "_id" : "63127", "city" : "SAPPINGTON", "loc" : [ -90.405967, 38.540369 ], "pop" : 4770, "state" : "MO" } +{ "_id" : "63128", "city" : "SAPPINGTON", "loc" : [ -90.372275, 38.498285 ], "pop" : 28366, "state" : "MO" } +{ "_id" : "63129", "city" : "SOUTH COUNTY", "loc" : [ -90.32138999999999, 38.468864 ], "pop" : 45920, "state" : "MO" } +{ "_id" : "63130", "city" : "UNIVERSITY CITY", "loc" : [ -90.321896, 38.663941 ], "pop" : 33986, "state" : "MO" } +{ "_id" : "63131", "city" : "DES PERES", "loc" : [ -90.44264, 38.612479 ], "pop" : 16955, "state" : "MO" } +{ "_id" : "63132", "city" : "OLIVETTE", "loc" : [ -90.369642, 38.672823 ], "pop" : 15193, "state" : "MO" } +{ "_id" : "63133", "city" : "SAINT LOUIS", "loc" : [ -90.30327200000001, 38.6779 ], "pop" : 11141, "state" : "MO" } +{ "_id" : "63134", "city" : "BERKELEY", "loc" : [ -90.337834, 38.739614 ], "pop" : 18068, "state" : "MO" } +{ "_id" : "63135", "city" : "FERGUSON", "loc" : [ -90.302241, 38.748429 ], "pop" : 23173, "state" : "MO" } +{ "_id" : "63136", "city" : "JENNINGS", "loc" : [ -90.260189, 38.738878 ], "pop" : 54994, "state" : "MO" } +{ "_id" : "63137", "city" : "NORTH COUNTY", "loc" : [ -90.217778, 38.74885 ], "pop" : 21055, "state" : "MO" } +{ "_id" : "63138", "city" : "NORTH COUNTY", "loc" : [ -90.21158200000001, 38.787041 ], "pop" : 20801, "state" : "MO" } +{ "_id" : "63139", "city" : "SAINT LOUIS", "loc" : [ -90.292045, 38.610776 ], "pop" : 25310, "state" : "MO" } +{ "_id" : "63140", "city" : "BERKELEY", "loc" : [ -90.322846, 38.738482 ], "pop" : 2478, "state" : "MO" } +{ "_id" : "63141", "city" : "CREVE COEUR", "loc" : [ -90.457072, 38.661741 ], "pop" : 20120, "state" : "MO" } +{ "_id" : "63143", "city" : "MAPLEWOOD", "loc" : [ -90.31961099999999, 38.613116 ], "pop" : 12025, "state" : "MO" } +{ "_id" : "63144", "city" : "BRENTWOOD", "loc" : [ -90.350944, 38.620839 ], "pop" : 9770, "state" : "MO" } +{ "_id" : "63146", "city" : "WEST COUNTY", "loc" : [ -90.448251, 38.688418 ], "pop" : 29946, "state" : "MO" } +{ "_id" : "63147", "city" : "SAINT LOUIS", "loc" : [ -90.237512, 38.713889 ], "pop" : 13186, "state" : "MO" } +{ "_id" : "63301", "city" : "SAINT CHARLES", "loc" : [ -90.506503, 38.801424 ], "pop" : 47255, "state" : "MO" } +{ "_id" : "63303", "city" : "SAINT CHARLES", "loc" : [ -90.547059, 38.762237 ], "pop" : 40675, "state" : "MO" } +{ "_id" : "63304", "city" : "SAINT CHARLES", "loc" : [ -90.62344299999999, 38.737769 ], "pop" : 27477, "state" : "MO" } +{ "_id" : "63330", "city" : "ANNADA", "loc" : [ -90.822355, 39.255758 ], "pop" : 199, "state" : "MO" } +{ "_id" : "63332", "city" : "AUGUSTA", "loc" : [ -90.881471, 38.572767 ], "pop" : 302, "state" : "MO" } +{ "_id" : "63333", "city" : "BELLFLOWER", "loc" : [ -91.34891500000001, 39.0012 ], "pop" : 689, "state" : "MO" } +{ "_id" : "63334", "city" : "BOWLING GREEN", "loc" : [ -91.19623199999999, 39.334639 ], "pop" : 5258, "state" : "MO" } +{ "_id" : "63336", "city" : "CLARKSVILLE", "loc" : [ -90.936205, 39.346477 ], "pop" : 1195, "state" : "MO" } +{ "_id" : "63339", "city" : "CURRYVILLE", "loc" : [ -91.349301, 39.325702 ], "pop" : 1604, "state" : "MO" } +{ "_id" : "63341", "city" : "DEFIANCE", "loc" : [ -90.830231, 38.661557 ], "pop" : 2861, "state" : "MO" } +{ "_id" : "63343", "city" : "ELSBERRY", "loc" : [ -90.815956, 39.158953 ], "pop" : 3739, "state" : "MO" } +{ "_id" : "63344", "city" : "EOLIA", "loc" : [ -91.009322, 39.243097 ], "pop" : 533, "state" : "MO" } +{ "_id" : "63345", "city" : "FARBER", "loc" : [ -91.579843, 39.27424 ], "pop" : 546, "state" : "MO" } +{ "_id" : "63347", "city" : "FOLEY", "loc" : [ -90.777468, 39.053019 ], "pop" : 2518, "state" : "MO" } +{ "_id" : "63348", "city" : "FORISTELL", "loc" : [ -90.93432799999999, 38.762557 ], "pop" : 2993, "state" : "MO" } +{ "_id" : "63349", "city" : "HAWK POINT", "loc" : [ -91.121067, 38.976576 ], "pop" : 1550, "state" : "MO" } +{ "_id" : "63350", "city" : "HIGH HILL", "loc" : [ -91.37147299999999, 38.890238 ], "pop" : 614, "state" : "MO" } +{ "_id" : "63351", "city" : "JONESBURG", "loc" : [ -91.30193, 38.871658 ], "pop" : 1055, "state" : "MO" } +{ "_id" : "63352", "city" : "LADDONIA", "loc" : [ -91.689348, 39.259328 ], "pop" : 1023, "state" : "MO" } +{ "_id" : "63353", "city" : "LOUISIANA", "loc" : [ -91.066385, 39.43359 ], "pop" : 5428, "state" : "MO" } +{ "_id" : "63357", "city" : "LAKE SHERWOOD", "loc" : [ -91.055459, 38.648619 ], "pop" : 3690, "state" : "MO" } +{ "_id" : "63359", "city" : "MIDDLETOWN", "loc" : [ -91.38731199999999, 39.105494 ], "pop" : 853, "state" : "MO" } +{ "_id" : "63361", "city" : "MONTGOMERY CITY", "loc" : [ -91.508486, 38.983949 ], "pop" : 3160, "state" : "MO" } +{ "_id" : "63362", "city" : "MOSCOW MILLS", "loc" : [ -90.96300100000001, 38.922927 ], "pop" : 3538, "state" : "MO" } +{ "_id" : "63363", "city" : "NEW FLORENCE", "loc" : [ -91.490861, 38.902309 ], "pop" : 1745, "state" : "MO" } +{ "_id" : "63364", "city" : "NEW HARTFORD", "loc" : [ -91.292984, 39.188103 ], "pop" : 503, "state" : "MO" } +{ "_id" : "63366", "city" : "SAINT PAUL", "loc" : [ -90.720159, 38.800101 ], "pop" : 28243, "state" : "MO" } +{ "_id" : "63367", "city" : "LAKE SAINT LOUIS", "loc" : [ -90.78540700000001, 38.79355 ], "pop" : 7785, "state" : "MO" } +{ "_id" : "63369", "city" : "OLD MONROE", "loc" : [ -90.77819599999999, 38.934581 ], "pop" : 1591, "state" : "MO" } +{ "_id" : "63370", "city" : "OLNEY", "loc" : [ -91.211314, 39.087509 ], "pop" : 351, "state" : "MO" } +{ "_id" : "63371", "city" : "PAYNESVILLE", "loc" : [ -90.907268, 39.258679 ], "pop" : 182, "state" : "MO" } +{ "_id" : "63373", "city" : "PORTAGE DES SIOU", "loc" : [ -90.353115, 38.927629 ], "pop" : 777, "state" : "MO" } +{ "_id" : "63376", "city" : "SAINT PETERS", "loc" : [ -90.622765, 38.78024 ], "pop" : 43133, "state" : "MO" } +{ "_id" : "63377", "city" : "SILEX", "loc" : [ -91.03698799999999, 39.116617 ], "pop" : 2913, "state" : "MO" } +{ "_id" : "63379", "city" : "TROY", "loc" : [ -90.96244900000001, 39.001212 ], "pop" : 7636, "state" : "MO" } +{ "_id" : "63381", "city" : "TRUXTON", "loc" : [ -91.21261800000001, 38.967002 ], "pop" : 794, "state" : "MO" } +{ "_id" : "63382", "city" : "VANDALIA", "loc" : [ -91.488299, 39.294937 ], "pop" : 3441, "state" : "MO" } +{ "_id" : "63383", "city" : "WARRENTON", "loc" : [ -91.174047, 38.805042 ], "pop" : 9464, "state" : "MO" } +{ "_id" : "63384", "city" : "WELLSVILLE", "loc" : [ -91.564519, 39.076482 ], "pop" : 1899, "state" : "MO" } +{ "_id" : "63385", "city" : "WENTZVILLE", "loc" : [ -90.85344000000001, 38.801963 ], "pop" : 10238, "state" : "MO" } +{ "_id" : "63386", "city" : "WEST ALTON", "loc" : [ -90.23836300000001, 38.875796 ], "pop" : 1172, "state" : "MO" } +{ "_id" : "63388", "city" : "WILLIAMSBURG", "loc" : [ -91.679188, 38.898143 ], "pop" : 228, "state" : "MO" } +{ "_id" : "63389", "city" : "WINFIELD", "loc" : [ -90.821319, 38.989727 ], "pop" : 4791, "state" : "MO" } +{ "_id" : "63390", "city" : "WRIGHT CITY", "loc" : [ -91.03292999999999, 38.809677 ], "pop" : 5852, "state" : "MO" } +{ "_id" : "63401", "city" : "HANNIBAL", "loc" : [ -91.38387, 39.70636 ], "pop" : 20086, "state" : "MO" } +{ "_id" : "63430", "city" : "ALEXANDRIA", "loc" : [ -91.51543700000001, 40.344514 ], "pop" : 753, "state" : "MO" } +{ "_id" : "63431", "city" : "ANABEL", "loc" : [ -92.351142, 39.736793 ], "pop" : 289, "state" : "MO" } +{ "_id" : "63432", "city" : "ARBELA", "loc" : [ -92.004741, 40.486299 ], "pop" : 564, "state" : "MO" } +{ "_id" : "63433", "city" : "ASHBURN", "loc" : [ -91.187651, 39.52904 ], "pop" : 235, "state" : "MO" } +{ "_id" : "63434", "city" : "BETHEL", "loc" : [ -92.03161900000001, 39.892199 ], "pop" : 377, "state" : "MO" } +{ "_id" : "63435", "city" : "CANTON", "loc" : [ -91.54798700000001, 40.143695 ], "pop" : 3822, "state" : "MO" } +{ "_id" : "63436", "city" : "CENTER", "loc" : [ -91.53984199999999, 39.515397 ], "pop" : 971, "state" : "MO" } +{ "_id" : "63437", "city" : "CLARENCE", "loc" : [ -92.25297, 39.736648 ], "pop" : 1600, "state" : "MO" } +{ "_id" : "63438", "city" : "DURHAM", "loc" : [ -91.67041500000001, 39.962486 ], "pop" : 548, "state" : "MO" } +{ "_id" : "63439", "city" : "EMDEN", "loc" : [ -91.880926, 39.85013 ], "pop" : 364, "state" : "MO" } +{ "_id" : "63440", "city" : "EWING", "loc" : [ -91.721627, 39.996237 ], "pop" : 1142, "state" : "MO" } +{ "_id" : "63441", "city" : "FRANKFORD", "loc" : [ -91.30308599999999, 39.489246 ], "pop" : 831, "state" : "MO" } +{ "_id" : "63443", "city" : "HUNNEWELL", "loc" : [ -91.88323099999999, 39.701831 ], "pop" : 528, "state" : "MO" } +{ "_id" : "63445", "city" : "KAHOKA", "loc" : [ -91.725033, 40.426576 ], "pop" : 3922, "state" : "MO" } +{ "_id" : "63446", "city" : "KNOX CITY", "loc" : [ -92.00770300000001, 40.138357 ], "pop" : 547, "state" : "MO" } +{ "_id" : "63447", "city" : "LA BELLE", "loc" : [ -91.917125, 40.116383 ], "pop" : 893, "state" : "MO" } +{ "_id" : "63448", "city" : "LA GRANGE", "loc" : [ -91.518247, 40.039126 ], "pop" : 1715, "state" : "MO" } +{ "_id" : "63450", "city" : "LENTNER", "loc" : [ -92.148916, 39.712269 ], "pop" : 198, "state" : "MO" } +{ "_id" : "63451", "city" : "LEONARD", "loc" : [ -92.19467899999999, 39.907577 ], "pop" : 312, "state" : "MO" } +{ "_id" : "63452", "city" : "LEWISTOWN", "loc" : [ -91.815663, 40.086666 ], "pop" : 824, "state" : "MO" } +{ "_id" : "63453", "city" : "LURAY", "loc" : [ -91.891227, 40.493096 ], "pop" : 523, "state" : "MO" } +{ "_id" : "63454", "city" : "MAYWOOD", "loc" : [ -91.614769, 39.933289 ], "pop" : 939, "state" : "MO" } +{ "_id" : "63456", "city" : "MONROE CITY", "loc" : [ -91.722999, 39.654586 ], "pop" : 4039, "state" : "MO" } +{ "_id" : "63457", "city" : "MONTICELLO", "loc" : [ -91.712267, 40.10402 ], "pop" : 515, "state" : "MO" } +{ "_id" : "63458", "city" : "NEWARK", "loc" : [ -91.99236000000001, 39.997428 ], "pop" : 195, "state" : "MO" } +{ "_id" : "63459", "city" : "NEW LONDON", "loc" : [ -91.39599, 39.591672 ], "pop" : 4801, "state" : "MO" } +{ "_id" : "63460", "city" : "NOVELTY", "loc" : [ -92.24378299999999, 40.035997 ], "pop" : 542, "state" : "MO" } +{ "_id" : "63461", "city" : "PALMYRA", "loc" : [ -91.536817, 39.791309 ], "pop" : 5344, "state" : "MO" } +{ "_id" : "63462", "city" : "PERRY", "loc" : [ -91.664125, 39.420721 ], "pop" : 1268, "state" : "MO" } +{ "_id" : "63463", "city" : "PHILADELPHIA", "loc" : [ -91.753803, 39.835931 ], "pop" : 674, "state" : "MO" } +{ "_id" : "63464", "city" : "PLEVNA", "loc" : [ -92.111716, 39.992561 ], "pop" : 149, "state" : "MO" } +{ "_id" : "63466", "city" : "SAINT PATRICK", "loc" : [ -91.65467700000001, 40.319851 ], "pop" : 455, "state" : "MO" } +{ "_id" : "63468", "city" : "SHELBINA", "loc" : [ -92.03706, 39.694718 ], "pop" : 2714, "state" : "MO" } +{ "_id" : "63469", "city" : "SHELBYVILLE", "loc" : [ -92.04978199999999, 39.810792 ], "pop" : 929, "state" : "MO" } +{ "_id" : "63470", "city" : "STEFFENVILLE", "loc" : [ -91.85945, 39.993976 ], "pop" : 310, "state" : "MO" } +{ "_id" : "63471", "city" : "TAYLOR", "loc" : [ -91.527834, 39.914486 ], "pop" : 667, "state" : "MO" } +{ "_id" : "63472", "city" : "WAYLAND", "loc" : [ -91.60786400000001, 40.442574 ], "pop" : 1252, "state" : "MO" } +{ "_id" : "63473", "city" : "WILLIAMSTOWN", "loc" : [ -91.854809, 40.21559 ], "pop" : 343, "state" : "MO" } +{ "_id" : "63474", "city" : "WYACONDA", "loc" : [ -91.907077, 40.372083 ], "pop" : 642, "state" : "MO" } +{ "_id" : "63501", "city" : "KIRKSVILLE", "loc" : [ -92.585634, 40.190765 ], "pop" : 20717, "state" : "MO" } +{ "_id" : "63530", "city" : "ATLANTA", "loc" : [ -92.475019, 39.914639 ], "pop" : 977, "state" : "MO" } +{ "_id" : "63531", "city" : "BARING", "loc" : [ -92.23107400000001, 40.250864 ], "pop" : 440, "state" : "MO" } +{ "_id" : "63532", "city" : "BEVIER", "loc" : [ -92.561925, 39.749707 ], "pop" : 1273, "state" : "MO" } +{ "_id" : "63533", "city" : "BRASHEAR", "loc" : [ -92.43325299999999, 40.195891 ], "pop" : 1444, "state" : "MO" } +{ "_id" : "63534", "city" : "CALLAO", "loc" : [ -92.635144, 39.744849 ], "pop" : 878, "state" : "MO" } +{ "_id" : "63535", "city" : "COATSVILLE", "loc" : [ -92.638801, 40.566473 ], "pop" : 148, "state" : "MO" } +{ "_id" : "63536", "city" : "DOWNING", "loc" : [ -92.391762, 40.479828 ], "pop" : 953, "state" : "MO" } +{ "_id" : "63537", "city" : "EDINA", "loc" : [ -92.145549, 40.179452 ], "pop" : 2101, "state" : "MO" } +{ "_id" : "63538", "city" : "ELMER", "loc" : [ -92.642413, 39.941456 ], "pop" : 308, "state" : "MO" } +{ "_id" : "63539", "city" : "ETHEL", "loc" : [ -92.766396, 39.914605 ], "pop" : 374, "state" : "MO" } +{ "_id" : "63540", "city" : "GIBBS", "loc" : [ -92.443495, 40.083962 ], "pop" : 389, "state" : "MO" } +{ "_id" : "63541", "city" : "GLENWOOD", "loc" : [ -92.58864199999999, 40.514935 ], "pop" : 333, "state" : "MO" } +{ "_id" : "63543", "city" : "GORIN", "loc" : [ -92.01397, 40.362217 ], "pop" : 428, "state" : "MO" } +{ "_id" : "63544", "city" : "GREEN CASTLE", "loc" : [ -92.877966, 40.270325 ], "pop" : 335, "state" : "MO" } +{ "_id" : "63545", "city" : "GREEN CITY", "loc" : [ -92.953244, 40.260125 ], "pop" : 1189, "state" : "MO" } +{ "_id" : "63546", "city" : "GREENTOP", "loc" : [ -92.55667, 40.344593 ], "pop" : 859, "state" : "MO" } +{ "_id" : "63547", "city" : "HURDLAND", "loc" : [ -92.279066, 40.160909 ], "pop" : 508, "state" : "MO" } +{ "_id" : "63548", "city" : "LANCASTER", "loc" : [ -92.526403, 40.525265 ], "pop" : 1060, "state" : "MO" } +{ "_id" : "63549", "city" : "LA PLATA", "loc" : [ -92.50766900000001, 40.020831 ], "pop" : 2022, "state" : "MO" } +{ "_id" : "63551", "city" : "LIVONIA", "loc" : [ -92.724084, 40.511237 ], "pop" : 398, "state" : "MO" } +{ "_id" : "63552", "city" : "MACON", "loc" : [ -92.462163, 39.748089 ], "pop" : 7557, "state" : "MO" } +{ "_id" : "63555", "city" : "MEMPHIS", "loc" : [ -92.18508300000001, 40.46191 ], "pop" : 3546, "state" : "MO" } +{ "_id" : "63556", "city" : "MILAN", "loc" : [ -93.136149, 40.184435 ], "pop" : 3171, "state" : "MO" } +{ "_id" : "63557", "city" : "NEW BOSTON", "loc" : [ -92.91596699999999, 39.933234 ], "pop" : 184, "state" : "MO" } +{ "_id" : "63558", "city" : "NEW CAMBRIA", "loc" : [ -92.769469, 39.75509 ], "pop" : 953, "state" : "MO" } +{ "_id" : "63559", "city" : "NOVINGER", "loc" : [ -92.717236, 40.268513 ], "pop" : 1770, "state" : "MO" } +{ "_id" : "63560", "city" : "POLLOCK", "loc" : [ -93.11150600000001, 40.33852 ], "pop" : 638, "state" : "MO" } +{ "_id" : "63561", "city" : "QUEEN CITY", "loc" : [ -92.56626300000001, 40.415175 ], "pop" : 1269, "state" : "MO" } +{ "_id" : "63563", "city" : "RUTLEDGE", "loc" : [ -92.097559, 40.328984 ], "pop" : 284, "state" : "MO" } +{ "_id" : "63565", "city" : "UNIONVILLE", "loc" : [ -92.99509399999999, 40.481464 ], "pop" : 3515, "state" : "MO" } +{ "_id" : "63566", "city" : "WINIGAN", "loc" : [ -92.93007, 40.03706 ], "pop" : 335, "state" : "MO" } +{ "_id" : "63567", "city" : "WORTHINGTON", "loc" : [ -92.740139, 40.424001 ], "pop" : 438, "state" : "MO" } +{ "_id" : "63601", "city" : "DESLOGE", "loc" : [ -90.52735, 37.85555 ], "pop" : 14716, "state" : "MO" } +{ "_id" : "63620", "city" : "ANNAPOLIS", "loc" : [ -90.67023500000001, 37.39809 ], "pop" : 1282, "state" : "MO" } +{ "_id" : "63621", "city" : "ARCADIA", "loc" : [ -90.59276800000001, 37.570054 ], "pop" : 896, "state" : "MO" } +{ "_id" : "63622", "city" : "BELGRADE", "loc" : [ -90.86130799999999, 37.78886 ], "pop" : 1000, "state" : "MO" } +{ "_id" : "63623", "city" : "BELLEVIEW", "loc" : [ -90.799075, 37.681981 ], "pop" : 1206, "state" : "MO" } +{ "_id" : "63624", "city" : "DESLOGE", "loc" : [ -90.620732, 37.769865 ], "pop" : 2282, "state" : "MO" } +{ "_id" : "63625", "city" : "BLACK", "loc" : [ -90.99173500000001, 37.547275 ], "pop" : 671, "state" : "MO" } +{ "_id" : "63626", "city" : "BLACKWELL", "loc" : [ -90.70953799999999, 38.071694 ], "pop" : 1012, "state" : "MO" } +{ "_id" : "63627", "city" : "BLOOMSDALE", "loc" : [ -90.280548, 38.045112 ], "pop" : 3035, "state" : "MO" } +{ "_id" : "63628", "city" : "BONNE TERRE", "loc" : [ -90.525052, 37.931423 ], "pop" : 10579, "state" : "MO" } +{ "_id" : "63629", "city" : "BUNKER", "loc" : [ -91.192735, 37.477227 ], "pop" : 882, "state" : "MO" } +{ "_id" : "63630", "city" : "CADET", "loc" : [ -90.743932, 38.012534 ], "pop" : 3277, "state" : "MO" } +{ "_id" : "63631", "city" : "CALEDONIA", "loc" : [ -90.740936, 37.763881 ], "pop" : 808, "state" : "MO" } +{ "_id" : "63633", "city" : "CENTERVILLE", "loc" : [ -90.975657, 37.428537 ], "pop" : 505, "state" : "MO" } +{ "_id" : "63636", "city" : "DES ARC", "loc" : [ -90.62787, 37.29546 ], "pop" : 640, "state" : "MO" } +{ "_id" : "63637", "city" : "DOE RUN", "loc" : [ -90.496842, 37.734818 ], "pop" : 1866, "state" : "MO" } +{ "_id" : "63638", "city" : "ELLINGTON", "loc" : [ -90.958851, 37.239797 ], "pop" : 3329, "state" : "MO" } +{ "_id" : "63640", "city" : "FARMINGTON", "loc" : [ -90.40937700000001, 37.777299 ], "pop" : 19031, "state" : "MO" } +{ "_id" : "63645", "city" : "MILLCREEK", "loc" : [ -90.31052699999999, 37.543716 ], "pop" : 10043, "state" : "MO" } +{ "_id" : "63648", "city" : "IRONDALE", "loc" : [ -90.69838900000001, 37.82962 ], "pop" : 1793, "state" : "MO" } +{ "_id" : "63650", "city" : "IRON MOUNTAIN", "loc" : [ -90.63563499999999, 37.614702 ], "pop" : 5610, "state" : "MO" } +{ "_id" : "63653", "city" : "LEADWOOD", "loc" : [ -90.591007, 37.864081 ], "pop" : 1331, "state" : "MO" } +{ "_id" : "63654", "city" : "LESTERVILLE", "loc" : [ -90.842544, 37.482004 ], "pop" : 733, "state" : "MO" } +{ "_id" : "63655", "city" : "MARQUAND", "loc" : [ -90.174092, 37.427403 ], "pop" : 1296, "state" : "MO" } +{ "_id" : "63656", "city" : "MIDDLE BROOK", "loc" : [ -90.67350399999999, 37.670161 ], "pop" : 509, "state" : "MO" } +{ "_id" : "63660", "city" : "MINERAL POINT", "loc" : [ -90.719324, 37.915555 ], "pop" : 4032, "state" : "MO" } +{ "_id" : "63662", "city" : "PATTON", "loc" : [ -90.050045, 37.473347 ], "pop" : 1622, "state" : "MO" } +{ "_id" : "63664", "city" : "POTOSI", "loc" : [ -90.84146699999999, 37.954942 ], "pop" : 7274, "state" : "MO" } +{ "_id" : "63665", "city" : "REDFORD", "loc" : [ -90.921994, 37.323518 ], "pop" : 407, "state" : "MO" } +{ "_id" : "63670", "city" : "LAKE FOREST ESTA", "loc" : [ -90.09604, 37.950356 ], "pop" : 9405, "state" : "MO" } +{ "_id" : "63673", "city" : "SAINT MARY", "loc" : [ -89.92926799999999, 37.914034 ], "pop" : 130, "state" : "IL" } +{ "_id" : "63675", "city" : "VULCAN", "loc" : [ -90.71060799999999, 37.305963 ], "pop" : 153, "state" : "MO" } +{ "_id" : "63701", "city" : "CAPE GIRARDEAU", "loc" : [ -89.545861, 37.31685 ], "pop" : 37993, "state" : "MO" } +{ "_id" : "63730", "city" : "ADVANCE", "loc" : [ -89.910614, 37.092219 ], "pop" : 2448, "state" : "MO" } +{ "_id" : "63732", "city" : "NEW WELLS", "loc" : [ -89.581453, 37.630633 ], "pop" : 576, "state" : "MO" } +{ "_id" : "63733", "city" : "ARAB", "loc" : [ -90.080448, 37.064804 ], "pop" : 139, "state" : "MO" } +{ "_id" : "63735", "city" : "BELL CITY", "loc" : [ -89.798417, 37.011608 ], "pop" : 1219, "state" : "MO" } +{ "_id" : "63736", "city" : "BENTON", "loc" : [ -89.56640400000001, 37.069674 ], "pop" : 3349, "state" : "MO" } +{ "_id" : "63739", "city" : "BURFORDVILLE", "loc" : [ -89.820632, 37.363231 ], "pop" : 819, "state" : "MO" } +{ "_id" : "63740", "city" : "CHAFFEE", "loc" : [ -89.64565, 37.172612 ], "pop" : 4830, "state" : "MO" } +{ "_id" : "63743", "city" : "DAISY", "loc" : [ -89.821327, 37.515064 ], "pop" : 100, "state" : "MO" } +{ "_id" : "63744", "city" : "DELTA", "loc" : [ -89.76085999999999, 37.184417 ], "pop" : 1418, "state" : "MO" } +{ "_id" : "63747", "city" : "FRIEDHEIM", "loc" : [ -89.837552, 37.566904 ], "pop" : 133, "state" : "MO" } +{ "_id" : "63748", "city" : "FROHNA", "loc" : [ -89.661903, 37.66855 ], "pop" : 1012, "state" : "MO" } +{ "_id" : "63750", "city" : "GIPSY", "loc" : [ -90.19407699999999, 37.131092 ], "pop" : 92, "state" : "MO" } +{ "_id" : "63751", "city" : "GLENALLEN", "loc" : [ -90.051495, 37.323119 ], "pop" : 572, "state" : "MO" } +{ "_id" : "63753", "city" : "GRASSY", "loc" : [ -90.160838, 37.259347 ], "pop" : 375, "state" : "MO" } +{ "_id" : "63755", "city" : "JACKSON", "loc" : [ -89.651939, 37.387885 ], "pop" : 14335, "state" : "MO" } +{ "_id" : "63760", "city" : "LEOPOLD", "loc" : [ -89.922735, 37.260903 ], "pop" : 303, "state" : "MO" } +{ "_id" : "63763", "city" : "MC GEE", "loc" : [ -90.19084700000001, 37.044139 ], "pop" : 308, "state" : "MO" } +{ "_id" : "63764", "city" : "SCOPUS", "loc" : [ -89.962732, 37.313464 ], "pop" : 5211, "state" : "MO" } +{ "_id" : "63766", "city" : "MILLERSVILLE", "loc" : [ -89.795035, 37.440138 ], "pop" : 1060, "state" : "MO" } +{ "_id" : "63769", "city" : "OAK RIDGE", "loc" : [ -89.750818, 37.525787 ], "pop" : 1184, "state" : "MO" } +{ "_id" : "63770", "city" : "OLD APPLETON", "loc" : [ -89.70709100000001, 37.583014 ], "pop" : 200, "state" : "MO" } +{ "_id" : "63771", "city" : "ORAN", "loc" : [ -89.67336400000001, 37.086977 ], "pop" : 1827, "state" : "MO" } +{ "_id" : "63775", "city" : "PERRYVILLE", "loc" : [ -89.87366400000001, 37.717437 ], "pop" : 13296, "state" : "MO" } +{ "_id" : "63780", "city" : "SCOTT CITY", "loc" : [ -89.518081, 37.20771 ], "pop" : 6340, "state" : "MO" } +{ "_id" : "63781", "city" : "SEDGEWICKVILLE", "loc" : [ -89.927246, 37.536962 ], "pop" : 772, "state" : "MO" } +{ "_id" : "63782", "city" : "STURDIVANT", "loc" : [ -90.009215, 37.071011 ], "pop" : 220, "state" : "MO" } +{ "_id" : "63783", "city" : "UNIONTOWN", "loc" : [ -89.723744, 37.610708 ], "pop" : 440, "state" : "MO" } +{ "_id" : "63785", "city" : "WHITEWATER", "loc" : [ -89.736338, 37.286495 ], "pop" : 1906, "state" : "MO" } +{ "_id" : "63786", "city" : "WITTENBERG", "loc" : [ -89.564261, 37.679256 ], "pop" : 140, "state" : "MO" } +{ "_id" : "63787", "city" : "ZALMA", "loc" : [ -90.075711, 37.13648 ], "pop" : 898, "state" : "MO" } +{ "_id" : "63801", "city" : "SIKESTON", "loc" : [ -89.58197, 36.891111 ], "pop" : 22618, "state" : "MO" } +{ "_id" : "63821", "city" : "ARBYRD", "loc" : [ -90.22835499999999, 36.050104 ], "pop" : 891, "state" : "MO" } +{ "_id" : "63822", "city" : "BERNIE", "loc" : [ -89.987758, 36.672703 ], "pop" : 3200, "state" : "MO" } +{ "_id" : "63823", "city" : "BERTRAND", "loc" : [ -89.44825899999999, 36.892746 ], "pop" : 1455, "state" : "MO" } +{ "_id" : "63825", "city" : "BLOOMFIELD", "loc" : [ -89.945564, 36.898892 ], "pop" : 5938, "state" : "MO" } +{ "_id" : "63827", "city" : "BRAGG CITY", "loc" : [ -89.87362400000001, 36.273236 ], "pop" : 711, "state" : "MO" } +{ "_id" : "63829", "city" : "CARDWELL", "loc" : [ -90.290696, 36.04345 ], "pop" : 1552, "state" : "MO" } +{ "_id" : "63830", "city" : "CARUTHERSVILLE", "loc" : [ -89.668306, 36.180237 ], "pop" : 8376, "state" : "MO" } +{ "_id" : "63833", "city" : "CATRON", "loc" : [ -89.770647, 36.687578 ], "pop" : 174, "state" : "MO" } +{ "_id" : "63834", "city" : "CHARLESTON", "loc" : [ -89.33420700000001, 36.921341 ], "pop" : 7209, "state" : "MO" } +{ "_id" : "63837", "city" : "CLARKTON", "loc" : [ -89.972852, 36.447812 ], "pop" : 1672, "state" : "MO" } +{ "_id" : "63841", "city" : "DEXTER", "loc" : [ -89.963933, 36.788458 ], "pop" : 11641, "state" : "MO" } +{ "_id" : "63845", "city" : "EAST PRAIRIE", "loc" : [ -89.372629, 36.777609 ], "pop" : 6184, "state" : "MO" } +{ "_id" : "63846", "city" : "ESSEX", "loc" : [ -89.83664899999999, 36.810859 ], "pop" : 1212, "state" : "MO" } +{ "_id" : "63848", "city" : "GIDEON", "loc" : [ -89.913546, 36.45378 ], "pop" : 1599, "state" : "MO" } +{ "_id" : "63849", "city" : "GOBLER", "loc" : [ -89.934907, 36.158987 ], "pop" : 144, "state" : "MO" } +{ "_id" : "63851", "city" : "HAYTI HEIGHTS", "loc" : [ -89.75160700000001, 36.239475 ], "pop" : 5073, "state" : "MO" } +{ "_id" : "63852", "city" : "HOLCOMB", "loc" : [ -90.02079500000001, 36.38846 ], "pop" : 1335, "state" : "MO" } +{ "_id" : "63855", "city" : "HORNERSVILLE", "loc" : [ -90.081643, 36.062694 ], "pop" : 1685, "state" : "MO" } +{ "_id" : "63857", "city" : "KENNETT", "loc" : [ -90.049057, 36.240656 ], "pop" : 12742, "state" : "MO" } +{ "_id" : "63862", "city" : "LILBOURN", "loc" : [ -89.61124100000001, 36.585313 ], "pop" : 2258, "state" : "MO" } +{ "_id" : "63863", "city" : "MALDEN", "loc" : [ -89.973679, 36.567209 ], "pop" : 6735, "state" : "MO" } +{ "_id" : "63866", "city" : "MARSTON", "loc" : [ -89.62881899999999, 36.508448 ], "pop" : 1160, "state" : "MO" } +{ "_id" : "63867", "city" : "MATTHEWS", "loc" : [ -89.57683299999999, 36.807528 ], "pop" : 2675, "state" : "MO" } +{ "_id" : "63868", "city" : "MOREHOUSE", "loc" : [ -89.685191, 36.819041 ], "pop" : 1856, "state" : "MO" } +{ "_id" : "63869", "city" : "NEW MADRID", "loc" : [ -89.53664499999999, 36.607284 ], "pop" : 4289, "state" : "MO" } +{ "_id" : "63870", "city" : "PARMA", "loc" : [ -89.818971, 36.585629 ], "pop" : 2308, "state" : "MO" } +{ "_id" : "63873", "city" : "PORTAGEVILLE", "loc" : [ -89.70023399999999, 36.427945 ], "pop" : 5400, "state" : "MO" } +{ "_id" : "63876", "city" : "SENATH", "loc" : [ -90.163224, 36.132428 ], "pop" : 2234, "state" : "MO" } +{ "_id" : "63877", "city" : "STEELE", "loc" : [ -89.834585, 36.091528 ], "pop" : 5905, "state" : "MO" } +{ "_id" : "63879", "city" : "HOMESTOWN", "loc" : [ -89.816362, 36.347215 ], "pop" : 1003, "state" : "MO" } +{ "_id" : "63901", "city" : "POPLAR BLUFF", "loc" : [ -90.416647, 36.766235 ], "pop" : 31363, "state" : "MO" } +{ "_id" : "63931", "city" : "BRIAR", "loc" : [ -90.92777, 36.639115 ], "pop" : 617, "state" : "MO" } +{ "_id" : "63932", "city" : "BROSELEY", "loc" : [ -90.240472, 36.707553 ], "pop" : 2173, "state" : "MO" } +{ "_id" : "63933", "city" : "CAMPBELL", "loc" : [ -90.082859, 36.519714 ], "pop" : 4358, "state" : "MO" } +{ "_id" : "63934", "city" : "CLUBB", "loc" : [ -90.359638, 37.2302 ], "pop" : 88, "state" : "MO" } +{ "_id" : "63935", "city" : "POYNOR", "loc" : [ -90.81953, 36.621094 ], "pop" : 7690, "state" : "MO" } +{ "_id" : "63936", "city" : "DUDLEY", "loc" : [ -90.120974, 36.810981 ], "pop" : 1061, "state" : "MO" } +{ "_id" : "63937", "city" : "ELLSINORE", "loc" : [ -90.74853, 36.945263 ], "pop" : 1573, "state" : "MO" } +{ "_id" : "63939", "city" : "FAIRDEALING", "loc" : [ -90.633515, 36.670404 ], "pop" : 617, "state" : "MO" } +{ "_id" : "63940", "city" : "FISK", "loc" : [ -90.216758, 36.783625 ], "pop" : 590, "state" : "MO" } +{ "_id" : "63941", "city" : "FREMONT", "loc" : [ -91.143984, 36.917164 ], "pop" : 570, "state" : "MO" } +{ "_id" : "63942", "city" : "GATEWOOD", "loc" : [ -91.07033300000001, 36.562608 ], "pop" : 342, "state" : "MO" } +{ "_id" : "63943", "city" : "GRANDIN", "loc" : [ -90.794175, 36.827961 ], "pop" : 2228, "state" : "MO" } +{ "_id" : "63944", "city" : "GREENVILLE", "loc" : [ -90.451362, 37.110838 ], "pop" : 1012, "state" : "MO" } +{ "_id" : "63945", "city" : "HARVIELL", "loc" : [ -90.55830400000001, 36.672318 ], "pop" : 726, "state" : "MO" } +{ "_id" : "63947", "city" : "HIRAM", "loc" : [ -90.289556, 37.228158 ], "pop" : 467, "state" : "MO" } +{ "_id" : "63950", "city" : "LODI", "loc" : [ -90.46322499999999, 37.242046 ], "pop" : 52, "state" : "MO" } +{ "_id" : "63951", "city" : "LOWNDES", "loc" : [ -90.254437, 37.134318 ], "pop" : 101, "state" : "MO" } +{ "_id" : "63952", "city" : "MILL SPRING", "loc" : [ -90.67462500000001, 37.067477 ], "pop" : 732, "state" : "MO" } +{ "_id" : "63953", "city" : "NAYLOR", "loc" : [ -90.612354, 36.584337 ], "pop" : 1390, "state" : "MO" } +{ "_id" : "63954", "city" : "NEELYVILLE", "loc" : [ -90.49949100000001, 36.571005 ], "pop" : 1556, "state" : "MO" } +{ "_id" : "63955", "city" : "OXLY", "loc" : [ -90.691973, 36.587385 ], "pop" : 596, "state" : "MO" } +{ "_id" : "63956", "city" : "PATTERSON", "loc" : [ -90.57717100000001, 37.195992 ], "pop" : 1378, "state" : "MO" } +{ "_id" : "63957", "city" : "PIEDMONT", "loc" : [ -90.69902, 37.15727 ], "pop" : 3719, "state" : "MO" } +{ "_id" : "63960", "city" : "PUXICO", "loc" : [ -90.16225799999999, 36.942163 ], "pop" : 2085, "state" : "MO" } +{ "_id" : "63961", "city" : "QULIN", "loc" : [ -90.261674, 36.581769 ], "pop" : 1646, "state" : "MO" } +{ "_id" : "63963", "city" : "SHOOK", "loc" : [ -90.30059, 37.076976 ], "pop" : 222, "state" : "MO" } +{ "_id" : "63964", "city" : "SILVA", "loc" : [ -90.437472, 37.211892 ], "pop" : 933, "state" : "MO" } +{ "_id" : "63965", "city" : "VAN BUREN", "loc" : [ -91.000681, 37.00153 ], "pop" : 2417, "state" : "MO" } +{ "_id" : "63966", "city" : "WAPPAPELLO", "loc" : [ -90.28480500000001, 36.976566 ], "pop" : 1353, "state" : "MO" } +{ "_id" : "63967", "city" : "WILLIAMSVILLE", "loc" : [ -90.48785100000001, 36.963789 ], "pop" : 1657, "state" : "MO" } +{ "_id" : "64001", "city" : "ALMA", "loc" : [ -93.54285299999999, 39.10484 ], "pop" : 718, "state" : "MO" } +{ "_id" : "64011", "city" : "BATES CITY", "loc" : [ -94.07984, 39.021887 ], "pop" : 1393, "state" : "MO" } +{ "_id" : "64012", "city" : "BELTON", "loc" : [ -94.532785, 38.816118 ], "pop" : 20208, "state" : "MO" } +{ "_id" : "64014", "city" : "BLUE SPRINGS", "loc" : [ -94.260429, 39.015186 ], "pop" : 19140, "state" : "MO" } +{ "_id" : "64015", "city" : "LAKE TAPAWINGO", "loc" : [ -94.29284800000001, 39.018378 ], "pop" : 23758, "state" : "MO" } +{ "_id" : "64016", "city" : "BUCKNER", "loc" : [ -94.206219, 39.130328 ], "pop" : 4156, "state" : "MO" } +{ "_id" : "64017", "city" : "CAMDEN", "loc" : [ -94.025913, 39.204806 ], "pop" : 641, "state" : "MO" } +{ "_id" : "64018", "city" : "CAMDEN POINT", "loc" : [ -94.744438, 39.451549 ], "pop" : 678, "state" : "MO" } +{ "_id" : "64019", "city" : "CENTERVIEW", "loc" : [ -93.870234, 38.78971 ], "pop" : 1890, "state" : "MO" } +{ "_id" : "64020", "city" : "CONCORDIA", "loc" : [ -93.581205, 38.977553 ], "pop" : 3240, "state" : "MO" } +{ "_id" : "64021", "city" : "CORDER", "loc" : [ -93.639127, 39.102401 ], "pop" : 649, "state" : "MO" } +{ "_id" : "64022", "city" : "DOVER", "loc" : [ -93.66837700000001, 39.192619 ], "pop" : 512, "state" : "MO" } +{ "_id" : "64024", "city" : "EXCELSIOR SPRING", "loc" : [ -94.223614, 39.33491 ], "pop" : 18308, "state" : "MO" } +{ "_id" : "64029", "city" : "GRAIN VALLEY", "loc" : [ -94.20874000000001, 39.027361 ], "pop" : 2865, "state" : "MO" } +{ "_id" : "64030", "city" : "GRANDVIEW", "loc" : [ -94.52054200000001, 38.881936 ], "pop" : 24926, "state" : "MO" } +{ "_id" : "64034", "city" : "LAKE WINNEBAGO", "loc" : [ -94.334767, 38.842813 ], "pop" : 5578, "state" : "MO" } +{ "_id" : "64035", "city" : "HARDIN", "loc" : [ -93.840869, 39.350433 ], "pop" : 2019, "state" : "MO" } +{ "_id" : "64036", "city" : "HENRIETTA", "loc" : [ -93.93687300000001, 39.236732 ], "pop" : 438, "state" : "MO" } +{ "_id" : "64037", "city" : "HIGGINSVILLE", "loc" : [ -93.71326500000001, 39.070504 ], "pop" : 5994, "state" : "MO" } +{ "_id" : "64040", "city" : "HOLDEN", "loc" : [ -93.98557099999999, 38.718595 ], "pop" : 3088, "state" : "MO" } +{ "_id" : "64048", "city" : "HOLT", "loc" : [ -94.368876, 39.428867 ], "pop" : 1712, "state" : "MO" } +{ "_id" : "64050", "city" : "INDEPENDENCE", "loc" : [ -94.411072, 39.098288 ], "pop" : 24188, "state" : "MO" } +{ "_id" : "64052", "city" : "INDEPENDENCE", "loc" : [ -94.449945, 39.074984 ], "pop" : 22793, "state" : "MO" } +{ "_id" : "64053", "city" : "INDEPENDENCE", "loc" : [ -94.462461, 39.105041 ], "pop" : 6152, "state" : "MO" } +{ "_id" : "64054", "city" : "SUGAR CREEK", "loc" : [ -94.441496, 39.107234 ], "pop" : 4574, "state" : "MO" } +{ "_id" : "64055", "city" : "INDEPENDENCE", "loc" : [ -94.403902, 39.054504 ], "pop" : 30654, "state" : "MO" } +{ "_id" : "64056", "city" : "INDEPENDENCE", "loc" : [ -94.35963700000001, 39.11773 ], "pop" : 14962, "state" : "MO" } +{ "_id" : "64057", "city" : "INDEPENDENCE", "loc" : [ -94.353284, 39.073099 ], "pop" : 9209, "state" : "MO" } +{ "_id" : "64058", "city" : "INDEPENDENCE", "loc" : [ -94.35152600000001, 39.141233 ], "pop" : 5752, "state" : "MO" } +{ "_id" : "64060", "city" : "KEARNEY", "loc" : [ -94.362104, 39.365175 ], "pop" : 4419, "state" : "MO" } +{ "_id" : "64061", "city" : "KINGSVILLE", "loc" : [ -94.046188, 38.817755 ], "pop" : 3447, "state" : "MO" } +{ "_id" : "64062", "city" : "LAWSON", "loc" : [ -94.19658800000001, 39.440129 ], "pop" : 4898, "state" : "MO" } +{ "_id" : "64063", "city" : "LAKE LOTAWANA", "loc" : [ -94.348744, 38.921094 ], "pop" : 30114, "state" : "MO" } +{ "_id" : "64064", "city" : "LEES SUMMIT", "loc" : [ -94.36519199999999, 38.995336 ], "pop" : 10649, "state" : "MO" } +{ "_id" : "64067", "city" : "LEXINGTON", "loc" : [ -93.871438, 39.174249 ], "pop" : 6294, "state" : "MO" } +{ "_id" : "64068", "city" : "PLEASANT VALLEY", "loc" : [ -94.43366399999999, 39.241916 ], "pop" : 25473, "state" : "MO" } +{ "_id" : "64070", "city" : "LONE JACK", "loc" : [ -94.16145299999999, 38.891837 ], "pop" : 1918, "state" : "MO" } +{ "_id" : "64071", "city" : "MAYVIEW", "loc" : [ -93.835306, 39.045898 ], "pop" : 746, "state" : "MO" } +{ "_id" : "64074", "city" : "NAPOLEON", "loc" : [ -94.070911, 39.114034 ], "pop" : 545, "state" : "MO" } +{ "_id" : "64075", "city" : "OAK GROVE", "loc" : [ -94.13994599999999, 38.998456 ], "pop" : 7851, "state" : "MO" } +{ "_id" : "64076", "city" : "ODESSA", "loc" : [ -93.975731, 38.982938 ], "pop" : 8790, "state" : "MO" } +{ "_id" : "64077", "city" : "ORRICK", "loc" : [ -94.123863, 39.211577 ], "pop" : 1186, "state" : "MO" } +{ "_id" : "64078", "city" : "PECULIAR", "loc" : [ -94.44053, 38.716453 ], "pop" : 5207, "state" : "MO" } +{ "_id" : "64079", "city" : "PLATTE CITY", "loc" : [ -94.788972, 39.360171 ], "pop" : 4280, "state" : "MO" } +{ "_id" : "64080", "city" : "PLEASANT HILL", "loc" : [ -94.243961, 38.785856 ], "pop" : 6057, "state" : "MO" } +{ "_id" : "64081", "city" : "LEES SUMMIT", "loc" : [ -94.407302, 38.914169 ], "pop" : 9637, "state" : "MO" } +{ "_id" : "64082", "city" : "LEES SUMMIT", "loc" : [ -94.394368, 38.851803 ], "pop" : 2580, "state" : "MO" } +{ "_id" : "64083", "city" : "RAYMORE", "loc" : [ -94.452893, 38.801896 ], "pop" : 8112, "state" : "MO" } +{ "_id" : "64084", "city" : "RAYVILLE", "loc" : [ -94.02840999999999, 39.385291 ], "pop" : 1727, "state" : "MO" } +{ "_id" : "64085", "city" : "RICHMOND", "loc" : [ -93.979163, 39.279298 ], "pop" : 7080, "state" : "MO" } +{ "_id" : "64088", "city" : "SIBLEY", "loc" : [ -94.19901900000001, 39.162658 ], "pop" : 1527, "state" : "MO" } +{ "_id" : "64089", "city" : "SMITHVILLE", "loc" : [ -94.55923900000001, 39.391739 ], "pop" : 3469, "state" : "MO" } +{ "_id" : "64093", "city" : "WARRENSBURG", "loc" : [ -93.727341, 38.766695 ], "pop" : 21993, "state" : "MO" } +{ "_id" : "64096", "city" : "WAVERLY", "loc" : [ -93.52565199999999, 39.205523 ], "pop" : 1036, "state" : "MO" } +{ "_id" : "64097", "city" : "WELLINGTON", "loc" : [ -93.985513, 39.125845 ], "pop" : 1167, "state" : "MO" } +{ "_id" : "64098", "city" : "WESTON", "loc" : [ -94.91445299999999, 39.445294 ], "pop" : 3269, "state" : "MO" } +{ "_id" : "64101", "city" : "KANSAS CITY", "loc" : [ -94.601849, 39.10005 ], "pop" : 0, "state" : "MO" } +{ "_id" : "64102", "city" : "KANSAS CITY", "loc" : [ -94.606596, 39.086067 ], "pop" : 0, "state" : "MO" } +{ "_id" : "64105", "city" : "KANSAS CITY", "loc" : [ -94.590092, 39.102459 ], "pop" : 1733, "state" : "MO" } +{ "_id" : "64106", "city" : "KANSAS CITY", "loc" : [ -94.569858, 39.105186 ], "pop" : 7323, "state" : "MO" } +{ "_id" : "64108", "city" : "KANSAS CITY", "loc" : [ -94.586826, 39.0837 ], "pop" : 7167, "state" : "MO" } +{ "_id" : "64109", "city" : "KANSAS CITY", "loc" : [ -94.56737200000001, 39.066286 ], "pop" : 13553, "state" : "MO" } +{ "_id" : "64110", "city" : "KANSAS CITY", "loc" : [ -94.57220599999999, 39.036088 ], "pop" : 19532, "state" : "MO" } +{ "_id" : "64111", "city" : "KANSAS CITY", "loc" : [ -94.59294199999999, 39.056483 ], "pop" : 19929, "state" : "MO" } +{ "_id" : "64112", "city" : "KANSAS CITY", "loc" : [ -94.592873, 39.038191 ], "pop" : 8891, "state" : "MO" } +{ "_id" : "64113", "city" : "KANSAS CITY", "loc" : [ -94.593828, 39.01234 ], "pop" : 11744, "state" : "MO" } +{ "_id" : "64114", "city" : "KANSAS CITY", "loc" : [ -94.595941, 38.962147 ], "pop" : 24416, "state" : "MO" } +{ "_id" : "64116", "city" : "NORTH KANSAS CIT", "loc" : [ -94.56988200000001, 39.163189 ], "pop" : 14697, "state" : "MO" } +{ "_id" : "64117", "city" : "RANDOLPH", "loc" : [ -94.527367, 39.168111 ], "pop" : 14295, "state" : "MO" } +{ "_id" : "64118", "city" : "GLADSTONE", "loc" : [ -94.570448, 39.213842 ], "pop" : 35772, "state" : "MO" } +{ "_id" : "64119", "city" : "KANSAS CITY", "loc" : [ -94.519873, 39.19785 ], "pop" : 24046, "state" : "MO" } +{ "_id" : "64120", "city" : "KANSAS CITY", "loc" : [ -94.54873000000001, 39.122206 ], "pop" : 731, "state" : "MO" } +{ "_id" : "64123", "city" : "KANSAS CITY", "loc" : [ -94.523545, 39.113593 ], "pop" : 9910, "state" : "MO" } +{ "_id" : "64124", "city" : "KANSAS CITY", "loc" : [ -94.539402, 39.106832 ], "pop" : 11683, "state" : "MO" } +{ "_id" : "64125", "city" : "KANSAS CITY", "loc" : [ -94.492328, 39.104157 ], "pop" : 2011, "state" : "MO" } +{ "_id" : "64126", "city" : "KANSAS CITY", "loc" : [ -94.50466, 39.092255 ], "pop" : 6929, "state" : "MO" } +{ "_id" : "64127", "city" : "KANSAS CITY", "loc" : [ -94.536636, 39.088303 ], "pop" : 22469, "state" : "MO" } +{ "_id" : "64128", "city" : "KANSAS CITY", "loc" : [ -94.538634, 39.065932 ], "pop" : 18185, "state" : "MO" } +{ "_id" : "64129", "city" : "KANSAS CITY", "loc" : [ -94.49513, 39.040093 ], "pop" : 12006, "state" : "MO" } +{ "_id" : "64130", "city" : "KANSAS CITY", "loc" : [ -94.546674, 39.035106 ], "pop" : 30403, "state" : "MO" } +{ "_id" : "64131", "city" : "KANSAS CITY", "loc" : [ -94.57741, 38.971303 ], "pop" : 24033, "state" : "MO" } +{ "_id" : "64132", "city" : "KANSAS CITY", "loc" : [ -94.552156, 38.991073 ], "pop" : 17552, "state" : "MO" } +{ "_id" : "64133", "city" : "RAYTOWN", "loc" : [ -94.45922899999999, 39.014909 ], "pop" : 33484, "state" : "MO" } +{ "_id" : "64134", "city" : "KANSAS CITY", "loc" : [ -94.500908, 38.929633 ], "pop" : 23346, "state" : "MO" } +{ "_id" : "64136", "city" : "KANSAS CITY", "loc" : [ -94.400774, 39.018684 ], "pop" : 1033, "state" : "MO" } +{ "_id" : "64137", "city" : "KANSAS CITY", "loc" : [ -94.540487, 38.92988 ], "pop" : 11216, "state" : "MO" } +{ "_id" : "64138", "city" : "RAYTOWN", "loc" : [ -94.479361, 38.96871 ], "pop" : 25590, "state" : "MO" } +{ "_id" : "64139", "city" : "KANSAS CITY", "loc" : [ -94.406086, 38.965891 ], "pop" : 465, "state" : "MO" } +{ "_id" : "64145", "city" : "KANSAS CITY", "loc" : [ -94.597607, 38.89767 ], "pop" : 4830, "state" : "MO" } +{ "_id" : "64146", "city" : "KANSAS CITY", "loc" : [ -94.57638, 38.897264 ], "pop" : 1417, "state" : "MO" } +{ "_id" : "64147", "city" : "MARTIN CITY", "loc" : [ -94.52971700000001, 38.861352 ], "pop" : 600, "state" : "MO" } +{ "_id" : "64149", "city" : "KANSAS CITY", "loc" : [ -94.463554, 38.860646 ], "pop" : 314, "state" : "MO" } +{ "_id" : "64150", "city" : "KANSAS CITY", "loc" : [ -94.616669, 39.177927 ], "pop" : 2140, "state" : "MO" } +{ "_id" : "64151", "city" : "LAKE WAUKOMIS", "loc" : [ -94.63318, 39.213876 ], "pop" : 18196, "state" : "MO" } +{ "_id" : "64152", "city" : "PARKVILLE", "loc" : [ -94.69131299999999, 39.220954 ], "pop" : 18719, "state" : "MO" } +{ "_id" : "64153", "city" : "KANSAS CITY", "loc" : [ -94.697008, 39.262746 ], "pop" : 1582, "state" : "MO" } +{ "_id" : "64154", "city" : "KANSAS CITY", "loc" : [ -94.63544400000001, 39.254728 ], "pop" : 3379, "state" : "MO" } +{ "_id" : "64155", "city" : "KANSAS CITY", "loc" : [ -94.570401, 39.275831 ], "pop" : 11562, "state" : "MO" } +{ "_id" : "64156", "city" : "KANSAS CITY", "loc" : [ -94.533614, 39.290052 ], "pop" : 921, "state" : "MO" } +{ "_id" : "64157", "city" : "KANSAS CITY", "loc" : [ -94.459456, 39.276673 ], "pop" : 1084, "state" : "MO" } +{ "_id" : "64158", "city" : "KANSAS CITY", "loc" : [ -94.472036, 39.228428 ], "pop" : 158, "state" : "MO" } +{ "_id" : "64161", "city" : "RANDOLPH", "loc" : [ -94.459829, 39.161506 ], "pop" : 470, "state" : "MO" } +{ "_id" : "64163", "city" : "FERRELVIEW", "loc" : [ -94.71931499999999, 39.359756 ], "pop" : 1479, "state" : "MO" } +{ "_id" : "64164", "city" : "KANSAS CITY", "loc" : [ -94.644643, 39.3426 ], "pop" : 1459, "state" : "MO" } +{ "_id" : "64165", "city" : "KANSAS CITY", "loc" : [ -94.57296599999999, 39.340054 ], "pop" : 320, "state" : "MO" } +{ "_id" : "64166", "city" : "KANSAS CITY", "loc" : [ -94.519858, 39.329399 ], "pop" : 466, "state" : "MO" } +{ "_id" : "64167", "city" : "KANSAS CITY", "loc" : [ -94.46529099999999, 39.309643 ], "pop" : 244, "state" : "MO" } +{ "_id" : "64401", "city" : "AGENCY", "loc" : [ -94.717017, 39.666229 ], "pop" : 1773, "state" : "MO" } +{ "_id" : "64402", "city" : "ALBANY", "loc" : [ -94.326977, 40.251282 ], "pop" : 2600, "state" : "MO" } +{ "_id" : "64421", "city" : "AMAZONIA", "loc" : [ -94.911344, 39.909197 ], "pop" : 864, "state" : "MO" } +{ "_id" : "64422", "city" : "AMITY", "loc" : [ -94.513558, 39.883697 ], "pop" : 651, "state" : "MO" } +{ "_id" : "64423", "city" : "BARNARD", "loc" : [ -94.805558, 40.186176 ], "pop" : 561, "state" : "MO" } +{ "_id" : "64424", "city" : "BETHANY", "loc" : [ -94.018863, 40.260055 ], "pop" : 4148, "state" : "MO" } +{ "_id" : "64426", "city" : "BLYTHEDALE", "loc" : [ -93.895447, 40.502352 ], "pop" : 335, "state" : "MO" } +{ "_id" : "64427", "city" : "BOLCKOW", "loc" : [ -94.88474100000001, 40.100673 ], "pop" : 684, "state" : "MO" } +{ "_id" : "64428", "city" : "BURLINGTON JUNCT", "loc" : [ -95.051663, 40.442125 ], "pop" : 922, "state" : "MO" } +{ "_id" : "64429", "city" : "CAMERON", "loc" : [ -94.243723, 39.730892 ], "pop" : 4660, "state" : "MO" } +{ "_id" : "64430", "city" : "CLARKSDALE", "loc" : [ -94.54212, 39.813675 ], "pop" : 546, "state" : "MO" } +{ "_id" : "64431", "city" : "CLEARMONT", "loc" : [ -95.005478, 40.517489 ], "pop" : 524, "state" : "MO" } +{ "_id" : "64432", "city" : "CLYDE", "loc" : [ -94.654563, 40.264475 ], "pop" : 221, "state" : "MO" } +{ "_id" : "64433", "city" : "CONCEPTION", "loc" : [ -94.684302, 40.230929 ], "pop" : 281, "state" : "MO" } +{ "_id" : "64434", "city" : "CONCEPTION JUNCT", "loc" : [ -94.696797, 40.266017 ], "pop" : 334, "state" : "MO" } +{ "_id" : "64435", "city" : "CORNING", "loc" : [ -95.436128, 40.24463 ], "pop" : 178, "state" : "MO" } +{ "_id" : "64436", "city" : "COSBY", "loc" : [ -94.697678, 39.855534 ], "pop" : 727, "state" : "MO" } +{ "_id" : "64437", "city" : "BIGELOW", "loc" : [ -95.377047, 40.193873 ], "pop" : 580, "state" : "MO" } +{ "_id" : "64438", "city" : "DARLINGTON", "loc" : [ -94.404899, 40.195517 ], "pop" : 184, "state" : "MO" } +{ "_id" : "64439", "city" : "DEARBORN", "loc" : [ -94.766368, 39.517248 ], "pop" : 1556, "state" : "MO" } +{ "_id" : "64440", "city" : "DE KALB", "loc" : [ -94.927027, 39.583361 ], "pop" : 584, "state" : "MO" } +{ "_id" : "64441", "city" : "DENVER", "loc" : [ -94.306624, 40.418074 ], "pop" : 181, "state" : "MO" } +{ "_id" : "64442", "city" : "EAGLEVILLE", "loc" : [ -93.995058, 40.491197 ], "pop" : 669, "state" : "MO" } +{ "_id" : "64443", "city" : "EASTON", "loc" : [ -94.65819399999999, 39.751709 ], "pop" : 1189, "state" : "MO" } +{ "_id" : "64444", "city" : "EDGERTON", "loc" : [ -94.635217, 39.474213 ], "pop" : 1427, "state" : "MO" } +{ "_id" : "64445", "city" : "ELMO", "loc" : [ -95.123564, 40.518492 ], "pop" : 481, "state" : "MO" } +{ "_id" : "64446", "city" : "FAIRFAX", "loc" : [ -95.375075, 40.330193 ], "pop" : 1413, "state" : "MO" } +{ "_id" : "64448", "city" : "FAUCETT", "loc" : [ -94.791276, 39.589124 ], "pop" : 1077, "state" : "MO" } +{ "_id" : "64449", "city" : "FILLMORE", "loc" : [ -94.955496, 40.014212 ], "pop" : 514, "state" : "MO" } +{ "_id" : "64451", "city" : "FOREST CITY", "loc" : [ -95.19159399999999, 39.989708 ], "pop" : 450, "state" : "MO" } +{ "_id" : "64452", "city" : "FORTESCUE", "loc" : [ -95.33158400000001, 40.054712 ], "pop" : 208, "state" : "MO" } +{ "_id" : "64453", "city" : "GENTRY", "loc" : [ -94.414198, 40.341112 ], "pop" : 256, "state" : "MO" } +{ "_id" : "64454", "city" : "GOWER", "loc" : [ -94.596526, 39.602009 ], "pop" : 2115, "state" : "MO" } +{ "_id" : "64455", "city" : "GRAHAM", "loc" : [ -95.012118, 40.201204 ], "pop" : 543, "state" : "MO" } +{ "_id" : "64456", "city" : "GRANT CITY", "loc" : [ -94.397908, 40.492358 ], "pop" : 1401, "state" : "MO" } +{ "_id" : "64457", "city" : "GUILFORD", "loc" : [ -94.695076, 40.174614 ], "pop" : 388, "state" : "MO" } +{ "_id" : "64458", "city" : "HATFIELD", "loc" : [ -94.169059, 40.521853 ], "pop" : 141, "state" : "MO" } +{ "_id" : "64459", "city" : "HELENA", "loc" : [ -94.69212, 39.925122 ], "pop" : 1218, "state" : "MO" } +{ "_id" : "64461", "city" : "HOPKINS", "loc" : [ -94.81894800000001, 40.548328 ], "pop" : 869, "state" : "MO" } +{ "_id" : "64463", "city" : "KING CITY", "loc" : [ -94.52341199999999, 40.065184 ], "pop" : 1382, "state" : "MO" } +{ "_id" : "64465", "city" : "LATHROP", "loc" : [ -94.309271, 39.517727 ], "pop" : 4461, "state" : "MO" } +{ "_id" : "64466", "city" : "MAITLAND", "loc" : [ -95.09270600000001, 40.199111 ], "pop" : 582, "state" : "MO" } +{ "_id" : "64467", "city" : "MARTINSVILLE", "loc" : [ -94.164463, 40.366206 ], "pop" : 271, "state" : "MO" } +{ "_id" : "64468", "city" : "MARYVILLE", "loc" : [ -94.873479, 40.343399 ], "pop" : 13687, "state" : "MO" } +{ "_id" : "64469", "city" : "MAYSVILLE", "loc" : [ -94.354821, 39.911189 ], "pop" : 1948, "state" : "MO" } +{ "_id" : "64470", "city" : "MOUND CITY", "loc" : [ -95.213837, 40.136238 ], "pop" : 2166, "state" : "MO" } +{ "_id" : "64471", "city" : "NEW HAMPTON", "loc" : [ -94.17856500000001, 40.244439 ], "pop" : 666, "state" : "MO" } +{ "_id" : "64473", "city" : "OREGON", "loc" : [ -95.123358, 39.980906 ], "pop" : 1601, "state" : "MO" } +{ "_id" : "64474", "city" : "OSBORN", "loc" : [ -94.247677, 39.768436 ], "pop" : 4084, "state" : "MO" } +{ "_id" : "64475", "city" : "PARNELL", "loc" : [ -94.659519, 40.472288 ], "pop" : 456, "state" : "MO" } +{ "_id" : "64476", "city" : "PICKERING", "loc" : [ -94.84111900000001, 40.459073 ], "pop" : 525, "state" : "MO" } +{ "_id" : "64477", "city" : "PLATTSBURG", "loc" : [ -94.433814, 39.57047 ], "pop" : 3786, "state" : "MO" } +{ "_id" : "64478", "city" : "QUITMAN", "loc" : [ -95.072909, 40.3701 ], "pop" : 302, "state" : "MO" } +{ "_id" : "64479", "city" : "RAVENWOOD", "loc" : [ -94.68051, 40.357902 ], "pop" : 942, "state" : "MO" } +{ "_id" : "64480", "city" : "REA", "loc" : [ -94.70018399999999, 40.059263 ], "pop" : 690, "state" : "MO" } +{ "_id" : "64481", "city" : "RIDGEWAY", "loc" : [ -93.957527, 40.399896 ], "pop" : 870, "state" : "MO" } +{ "_id" : "64482", "city" : "ROCK PORT", "loc" : [ -95.52740300000001, 40.430581 ], "pop" : 2704, "state" : "MO" } +{ "_id" : "64483", "city" : "ROSENDALE", "loc" : [ -94.832808, 40.039853 ], "pop" : 630, "state" : "MO" } +{ "_id" : "64484", "city" : "RUSHVILLE", "loc" : [ -95.041259, 39.565272 ], "pop" : 1068, "state" : "MO" } +{ "_id" : "64485", "city" : "SAVANNAH", "loc" : [ -94.826733, 39.916774 ], "pop" : 7599, "state" : "MO" } +{ "_id" : "64486", "city" : "SHERIDAN", "loc" : [ -94.570149, 40.492822 ], "pop" : 664, "state" : "MO" } +{ "_id" : "64487", "city" : "SKIDMORE", "loc" : [ -95.079241, 40.28961 ], "pop" : 638, "state" : "MO" } +{ "_id" : "64489", "city" : "STANBERRY", "loc" : [ -94.538691, 40.229285 ], "pop" : 1879, "state" : "MO" } +{ "_id" : "64490", "city" : "HEMPLE", "loc" : [ -94.51779000000001, 39.745465 ], "pop" : 2110, "state" : "MO" } +{ "_id" : "64491", "city" : "TARKIO", "loc" : [ -95.378586, 40.441841 ], "pop" : 2553, "state" : "MO" } +{ "_id" : "64492", "city" : "TRIMBLE", "loc" : [ -94.55123399999999, 39.487067 ], "pop" : 944, "state" : "MO" } +{ "_id" : "64493", "city" : "TURNEY", "loc" : [ -94.297241, 39.631772 ], "pop" : 319, "state" : "MO" } +{ "_id" : "64494", "city" : "UNION STAR", "loc" : [ -94.578732, 39.984645 ], "pop" : 745, "state" : "MO" } +{ "_id" : "64496", "city" : "WATSON", "loc" : [ -95.61931, 40.477985 ], "pop" : 215, "state" : "MO" } +{ "_id" : "64497", "city" : "WEATHERBY", "loc" : [ -94.254959, 39.888699 ], "pop" : 584, "state" : "MO" } +{ "_id" : "64498", "city" : "WESTBORO", "loc" : [ -95.313419, 40.535748 ], "pop" : 572, "state" : "MO" } +{ "_id" : "64499", "city" : "WORTH", "loc" : [ -94.437084, 40.4173 ], "pop" : 229, "state" : "MO" } +{ "_id" : "64501", "city" : "SAINT JOSEPH", "loc" : [ -94.838488, 39.768755 ], "pop" : 12978, "state" : "MO" } +{ "_id" : "64503", "city" : "SAINT JOSEPH", "loc" : [ -94.817125, 39.733987 ], "pop" : 14190, "state" : "MO" } +{ "_id" : "64504", "city" : "SAINT JOSEPH", "loc" : [ -94.867749, 39.707566 ], "pop" : 11412, "state" : "MO" } +{ "_id" : "64505", "city" : "SAINT JOSEPH", "loc" : [ -94.844341, 39.796532 ], "pop" : 10627, "state" : "MO" } +{ "_id" : "64506", "city" : "SAINT JOSEPH", "loc" : [ -94.80431400000001, 39.789292 ], "pop" : 18009, "state" : "MO" } +{ "_id" : "64507", "city" : "SAINT JOSEPH", "loc" : [ -94.817303, 39.755052 ], "pop" : 11194, "state" : "MO" } +{ "_id" : "64601", "city" : "CHILLICOTHE", "loc" : [ -93.550887, 39.796569 ], "pop" : 11189, "state" : "MO" } +{ "_id" : "64620", "city" : "ALTAMONT", "loc" : [ -94.12815500000001, 39.905017 ], "pop" : 533, "state" : "MO" } +{ "_id" : "64621", "city" : "AVALON", "loc" : [ -93.47288, 39.668183 ], "pop" : 388, "state" : "MO" } +{ "_id" : "64622", "city" : "BOGARD", "loc" : [ -93.537387, 39.499354 ], "pop" : 831, "state" : "MO" } +{ "_id" : "64623", "city" : "BOSWORTH", "loc" : [ -93.333521, 39.476692 ], "pop" : 583, "state" : "MO" } +{ "_id" : "64624", "city" : "BRAYMER", "loc" : [ -93.78868, 39.591454 ], "pop" : 1671, "state" : "MO" } +{ "_id" : "64625", "city" : "BRECKENRIDGE", "loc" : [ -93.806794, 39.758205 ], "pop" : 608, "state" : "MO" } +{ "_id" : "64628", "city" : "BROOKFIELD", "loc" : [ -93.07194800000001, 39.784612 ], "pop" : 5564, "state" : "MO" } +{ "_id" : "64630", "city" : "BROWNING", "loc" : [ -93.160661, 40.028983 ], "pop" : 360, "state" : "MO" } +{ "_id" : "64631", "city" : "BUCKLIN", "loc" : [ -92.89281, 39.800563 ], "pop" : 969, "state" : "MO" } +{ "_id" : "64632", "city" : "CAINSVILLE", "loc" : [ -93.759047, 40.457768 ], "pop" : 870, "state" : "MO" } +{ "_id" : "64633", "city" : "CARROLLTON", "loc" : [ -93.492626, 39.367334 ], "pop" : 5694, "state" : "MO" } +{ "_id" : "64635", "city" : "CHULA", "loc" : [ -93.484095, 39.922606 ], "pop" : 685, "state" : "MO" } +{ "_id" : "64636", "city" : "COFFEY", "loc" : [ -94.02515099999999, 40.099928 ], "pop" : 359, "state" : "MO" } +{ "_id" : "64637", "city" : "COWGILL", "loc" : [ -93.929469, 39.564314 ], "pop" : 532, "state" : "MO" } +{ "_id" : "64638", "city" : "DAWN", "loc" : [ -93.596405, 39.666506 ], "pop" : 468, "state" : "MO" } +{ "_id" : "64639", "city" : "DE WITT", "loc" : [ -93.30158299999999, 39.358978 ], "pop" : 592, "state" : "MO" } +{ "_id" : "64640", "city" : "GALLATIN", "loc" : [ -93.978748, 39.902486 ], "pop" : 3260, "state" : "MO" } +{ "_id" : "64641", "city" : "GALT", "loc" : [ -93.395261, 40.14398 ], "pop" : 607, "state" : "MO" } +{ "_id" : "64642", "city" : "GILMAN CITY", "loc" : [ -93.831979, 40.145005 ], "pop" : 680, "state" : "MO" } +{ "_id" : "64643", "city" : "HALE", "loc" : [ -93.34448, 39.595302 ], "pop" : 771, "state" : "MO" } +{ "_id" : "64644", "city" : "HAMILTON", "loc" : [ -93.990898, 39.736412 ], "pop" : 2706, "state" : "MO" } +{ "_id" : "64645", "city" : "HARRIS", "loc" : [ -93.350106, 40.307519 ], "pop" : 127, "state" : "MO" } +{ "_id" : "64646", "city" : "HUMPHREYS", "loc" : [ -93.301455, 40.114448 ], "pop" : 368, "state" : "MO" } +{ "_id" : "64647", "city" : "JAMESON", "loc" : [ -93.95974699999999, 40.004615 ], "pop" : 401, "state" : "MO" } +{ "_id" : "64648", "city" : "JAMESPORT", "loc" : [ -93.78004799999999, 39.983724 ], "pop" : 1933, "state" : "MO" } +{ "_id" : "64649", "city" : "KIDDER", "loc" : [ -94.130005, 39.757039 ], "pop" : 708, "state" : "MO" } +{ "_id" : "64650", "city" : "KINGSTON", "loc" : [ -94.082694, 39.6508 ], "pop" : 868, "state" : "MO" } +{ "_id" : "64651", "city" : "LACLEDE", "loc" : [ -93.16797099999999, 39.7837 ], "pop" : 744, "state" : "MO" } +{ "_id" : "64652", "city" : "LAREDO", "loc" : [ -93.440676, 40.014397 ], "pop" : 485, "state" : "MO" } +{ "_id" : "64653", "city" : "LINNEUS", "loc" : [ -93.188529, 39.909945 ], "pop" : 1421, "state" : "MO" } +{ "_id" : "64654", "city" : "LOCK SPRINGS", "loc" : [ -93.797697, 39.907396 ], "pop" : 576, "state" : "MO" } +{ "_id" : "64655", "city" : "LUCERNE", "loc" : [ -93.286654, 40.438182 ], "pop" : 206, "state" : "MO" } +{ "_id" : "64656", "city" : "LUDLOW", "loc" : [ -93.704578, 39.655064 ], "pop" : 355, "state" : "MO" } +{ "_id" : "64657", "city" : "MC FALL", "loc" : [ -94.300259, 40.105071 ], "pop" : 547, "state" : "MO" } +{ "_id" : "64658", "city" : "MARCELINE", "loc" : [ -92.945502, 39.712485 ], "pop" : 3517, "state" : "MO" } +{ "_id" : "64659", "city" : "MEADVILLE", "loc" : [ -93.301389, 39.779468 ], "pop" : 774, "state" : "MO" } +{ "_id" : "64660", "city" : "MENDON", "loc" : [ -93.089168, 39.582849 ], "pop" : 568, "state" : "MO" } +{ "_id" : "64661", "city" : "MERCER", "loc" : [ -93.524197, 40.516917 ], "pop" : 975, "state" : "MO" } +{ "_id" : "64664", "city" : "MOORESVILLE", "loc" : [ -93.71693, 39.74249 ], "pop" : 320, "state" : "MO" } +{ "_id" : "64665", "city" : "MOUNT MORIAH", "loc" : [ -93.814252, 40.329164 ], "pop" : 247, "state" : "MO" } +{ "_id" : "64667", "city" : "NEWTOWN", "loc" : [ -93.30727899999999, 40.361227 ], "pop" : 313, "state" : "MO" } +{ "_id" : "64668", "city" : "NORBORNE", "loc" : [ -93.67609, 39.329903 ], "pop" : 1669, "state" : "MO" } +{ "_id" : "64670", "city" : "PATTONSBURG", "loc" : [ -94.13429499999999, 40.042756 ], "pop" : 855, "state" : "MO" } +{ "_id" : "64671", "city" : "POLO", "loc" : [ -94.074303, 39.564697 ], "pop" : 1496, "state" : "MO" } +{ "_id" : "64672", "city" : "POWERSVILLE", "loc" : [ -93.284436, 40.527155 ], "pop" : 284, "state" : "MO" } +{ "_id" : "64673", "city" : "PRINCETON", "loc" : [ -93.577394, 40.385533 ], "pop" : 2467, "state" : "MO" } +{ "_id" : "64674", "city" : "PURDIN", "loc" : [ -93.17001999999999, 39.952948 ], "pop" : 297, "state" : "MO" } +{ "_id" : "64676", "city" : "ROTHVILLE", "loc" : [ -93.046683, 39.662666 ], "pop" : 440, "state" : "MO" } +{ "_id" : "64677", "city" : "SAINT CATHARINE", "loc" : [ -92.99294999999999, 39.800017 ], "pop" : 288, "state" : "MO" } +{ "_id" : "64679", "city" : "SPICKARD", "loc" : [ -93.550291, 40.239985 ], "pop" : 659, "state" : "MO" } +{ "_id" : "64681", "city" : "SUMNER", "loc" : [ -93.22412799999999, 39.654992 ], "pop" : 307, "state" : "MO" } +{ "_id" : "64682", "city" : "TINA", "loc" : [ -93.46475, 39.551751 ], "pop" : 399, "state" : "MO" } +{ "_id" : "64683", "city" : "TRENTON", "loc" : [ -93.608634, 40.082335 ], "pop" : 8465, "state" : "MO" } +{ "_id" : "64686", "city" : "UTICA", "loc" : [ -93.62889699999999, 39.741742 ], "pop" : 361, "state" : "MO" } +{ "_id" : "64688", "city" : "WHEELING", "loc" : [ -93.386835, 39.801137 ], "pop" : 481, "state" : "MO" } +{ "_id" : "64689", "city" : "WINSTON", "loc" : [ -94.148747, 39.84995 ], "pop" : 567, "state" : "MO" } +{ "_id" : "64701", "city" : "HARRISONVILLE", "loc" : [ -94.32852, 38.64193 ], "pop" : 12242, "state" : "MO" } +{ "_id" : "64720", "city" : "ADRIAN", "loc" : [ -94.368336, 38.412473 ], "pop" : 2254, "state" : "MO" } +{ "_id" : "64722", "city" : "AMORET", "loc" : [ -94.57342300000001, 38.260508 ], "pop" : 409, "state" : "MO" } +{ "_id" : "64723", "city" : "AMSTERDAM", "loc" : [ -94.57628200000001, 38.395385 ], "pop" : 884, "state" : "MO" } +{ "_id" : "64724", "city" : "APPLETON CITY", "loc" : [ -94.02290000000001, 38.184779 ], "pop" : 1584, "state" : "MO" } +{ "_id" : "64725", "city" : "ARCHIE", "loc" : [ -94.36299200000001, 38.498612 ], "pop" : 1912, "state" : "MO" } +{ "_id" : "64726", "city" : "BLAIRSTOWN", "loc" : [ -93.964102, 38.522701 ], "pop" : 803, "state" : "MO" } +{ "_id" : "64728", "city" : "BRONAUGH", "loc" : [ -94.48603, 37.69 ], "pop" : 493, "state" : "MO" } +{ "_id" : "64730", "city" : "BUTLER", "loc" : [ -94.31375, 38.271245 ], "pop" : 8449, "state" : "MO" } +{ "_id" : "64733", "city" : "CHILHOWEE", "loc" : [ -93.865325, 38.612604 ], "pop" : 951, "state" : "MO" } +{ "_id" : "64734", "city" : "CLEVELAND", "loc" : [ -94.56950000000001, 38.68977 ], "pop" : 2586, "state" : "MO" } +{ "_id" : "64735", "city" : "TIGHTWAD", "loc" : [ -93.758906, 38.368811 ], "pop" : 12259, "state" : "MO" } +{ "_id" : "64738", "city" : "COLLINS", "loc" : [ -93.660849, 37.880998 ], "pop" : 844, "state" : "MO" } +{ "_id" : "64739", "city" : "CREIGHTON", "loc" : [ -94.09260399999999, 38.507754 ], "pop" : 711, "state" : "MO" } +{ "_id" : "64740", "city" : "DEEPWATER", "loc" : [ -93.73028100000001, 38.243164 ], "pop" : 1233, "state" : "MO" } +{ "_id" : "64741", "city" : "DEERFIELD", "loc" : [ -94.48484500000001, 37.82109 ], "pop" : 966, "state" : "MO" } +{ "_id" : "64742", "city" : "DREXEL", "loc" : [ -94.592765, 38.495625 ], "pop" : 1181, "state" : "MO" } +{ "_id" : "64744", "city" : "EL DORADO SPRING", "loc" : [ -94.030091, 37.858517 ], "pop" : 6787, "state" : "MO" } +{ "_id" : "64745", "city" : "FOSTER", "loc" : [ -94.53706699999999, 38.17338 ], "pop" : 464, "state" : "MO" } +{ "_id" : "64746", "city" : "FREEMAN", "loc" : [ -94.495561, 38.624549 ], "pop" : 1509, "state" : "MO" } +{ "_id" : "64747", "city" : "GARDEN CITY", "loc" : [ -94.18253199999999, 38.568082 ], "pop" : 1837, "state" : "MO" } +{ "_id" : "64748", "city" : "GOLDEN CITY", "loc" : [ -94.102683, 37.399535 ], "pop" : 1127, "state" : "MO" } +{ "_id" : "64750", "city" : "HARWOOD", "loc" : [ -94.14019399999999, 37.953028 ], "pop" : 189, "state" : "MO" } +{ "_id" : "64751", "city" : "HORTON", "loc" : [ -94.396438, 37.995078 ], "pop" : 551, "state" : "MO" } +{ "_id" : "64752", "city" : "STOTESBURY", "loc" : [ -94.56100000000001, 38.059635 ], "pop" : 728, "state" : "MO" } +{ "_id" : "64755", "city" : "JASPER", "loc" : [ -94.273126, 37.318224 ], "pop" : 2085, "state" : "MO" } +{ "_id" : "64756", "city" : "JERICO SPRINGS", "loc" : [ -94.012912, 37.661343 ], "pop" : 966, "state" : "MO" } +{ "_id" : "64759", "city" : "IANTHA", "loc" : [ -94.270253, 37.500221 ], "pop" : 7847, "state" : "MO" } +{ "_id" : "64760", "city" : "LATOUR", "loc" : [ -94.045721, 38.634847 ], "pop" : 745, "state" : "MO" } +{ "_id" : "64761", "city" : "LEETON", "loc" : [ -93.712321, 38.614113 ], "pop" : 1723, "state" : "MO" } +{ "_id" : "64762", "city" : "LIBERAL", "loc" : [ -94.520377, 37.572453 ], "pop" : 1448, "state" : "MO" } +{ "_id" : "64763", "city" : "LOWRY CITY", "loc" : [ -93.71135200000001, 38.140443 ], "pop" : 1345, "state" : "MO" } +{ "_id" : "64767", "city" : "MILO", "loc" : [ -94.304632, 37.744559 ], "pop" : 439, "state" : "MO" } +{ "_id" : "64769", "city" : "MINDENMINES", "loc" : [ -94.57557300000001, 37.451987 ], "pop" : 544, "state" : "MO" } +{ "_id" : "64770", "city" : "MONTROSE", "loc" : [ -93.995239, 38.259702 ], "pop" : 643, "state" : "MO" } +{ "_id" : "64771", "city" : "MOUNDVILLE", "loc" : [ -94.449645, 37.747637 ], "pop" : 478, "state" : "MO" } +{ "_id" : "64772", "city" : "NEVADA", "loc" : [ -94.35712700000001, 37.840853 ], "pop" : 11918, "state" : "MO" } +{ "_id" : "64776", "city" : "OSCEOLA", "loc" : [ -93.753621, 38.028553 ], "pop" : 4684, "state" : "MO" } +{ "_id" : "64778", "city" : "RICHARDS", "loc" : [ -94.55922700000001, 37.906111 ], "pop" : 207, "state" : "MO" } +{ "_id" : "64779", "city" : "RICH HILL", "loc" : [ -94.363454, 38.09438 ], "pop" : 1630, "state" : "MO" } +{ "_id" : "64780", "city" : "ROCKVILLE", "loc" : [ -94.129904, 38.076583 ], "pop" : 456, "state" : "MO" } +{ "_id" : "64783", "city" : "SCHELL CITY", "loc" : [ -94.15791, 38.009403 ], "pop" : 809, "state" : "MO" } +{ "_id" : "64784", "city" : "SHELDON", "loc" : [ -94.254835, 37.683969 ], "pop" : 1281, "state" : "MO" } +{ "_id" : "64788", "city" : "URICH", "loc" : [ -93.97847, 38.44489 ], "pop" : 949, "state" : "MO" } +{ "_id" : "64790", "city" : "WALKER", "loc" : [ -94.22930100000001, 37.893023 ], "pop" : 544, "state" : "MO" } +{ "_id" : "64801", "city" : "JOPLIN", "loc" : [ -94.505144, 37.096858 ], "pop" : 29617, "state" : "MO" } +{ "_id" : "64804", "city" : "JOPLIN", "loc" : [ -94.51025199999999, 37.046454 ], "pop" : 30661, "state" : "MO" } +{ "_id" : "64831", "city" : "ANDERSON", "loc" : [ -94.476648, 36.669224 ], "pop" : 4477, "state" : "MO" } +{ "_id" : "64832", "city" : "ASBURY", "loc" : [ -94.565484, 37.294168 ], "pop" : 603, "state" : "MO" } +{ "_id" : "64833", "city" : "AVILLA", "loc" : [ -94.117043, 37.194709 ], "pop" : 678, "state" : "MO" } +{ "_id" : "64834", "city" : "CARL JUNCTION", "loc" : [ -94.55502, 37.179479 ], "pop" : 4158, "state" : "MO" } +{ "_id" : "64835", "city" : "CARTERVILLE", "loc" : [ -94.43593799999999, 37.150734 ], "pop" : 2397, "state" : "MO" } +{ "_id" : "64836", "city" : "CARTHAGE", "loc" : [ -94.311232, 37.159686 ], "pop" : 19516, "state" : "MO" } +{ "_id" : "64840", "city" : "DIAMOND", "loc" : [ -94.32041, 37.005993 ], "pop" : 2736, "state" : "MO" } +{ "_id" : "64842", "city" : "FAIRVIEW", "loc" : [ -94.09120299999999, 36.825419 ], "pop" : 568, "state" : "MO" } +{ "_id" : "64843", "city" : "GOODMAN", "loc" : [ -94.39855, 36.732335 ], "pop" : 2025, "state" : "MO" } +{ "_id" : "64844", "city" : "GRANBY", "loc" : [ -94.264349, 36.906562 ], "pop" : 3571, "state" : "MO" } +{ "_id" : "64847", "city" : "LANAGAN", "loc" : [ -94.4551, 36.605956 ], "pop" : 755, "state" : "MO" } +{ "_id" : "64848", "city" : "LA RUSSELL", "loc" : [ -94.03287400000001, 37.17387 ], "pop" : 817, "state" : "MO" } +{ "_id" : "64850", "city" : "NEOSHO", "loc" : [ -94.386218, 36.870634 ], "pop" : 15863, "state" : "MO" } +{ "_id" : "64854", "city" : "NOEL", "loc" : [ -94.490627, 36.541668 ], "pop" : 2239, "state" : "MO" } +{ "_id" : "64855", "city" : "ORONOGO", "loc" : [ -94.446246, 37.243288 ], "pop" : 3942, "state" : "MO" } +{ "_id" : "64856", "city" : "JANE", "loc" : [ -94.351461, 36.580243 ], "pop" : 2783, "state" : "MO" } +{ "_id" : "64859", "city" : "REEDS", "loc" : [ -94.161272, 37.122477 ], "pop" : 222, "state" : "MO" } +{ "_id" : "64861", "city" : "ROCKY COMFORT", "loc" : [ -94.109066, 36.717546 ], "pop" : 543, "state" : "MO" } +{ "_id" : "64862", "city" : "SARCOXIE", "loc" : [ -94.11514, 37.072382 ], "pop" : 2133, "state" : "MO" } +{ "_id" : "64863", "city" : "SOUTH WEST CITY", "loc" : [ -94.596141, 36.531924 ], "pop" : 1201, "state" : "MO" } +{ "_id" : "64865", "city" : "SENECA", "loc" : [ -94.55936699999999, 36.844169 ], "pop" : 5419, "state" : "MO" } +{ "_id" : "64866", "city" : "STARK CITY", "loc" : [ -94.154811, 36.878538 ], "pop" : 967, "state" : "MO" } +{ "_id" : "64867", "city" : "STELLA", "loc" : [ -94.20858, 36.751553 ], "pop" : 2154, "state" : "MO" } +{ "_id" : "64868", "city" : "TIFF CITY", "loc" : [ -94.59343699999999, 36.664447 ], "pop" : 364, "state" : "MO" } +{ "_id" : "64870", "city" : "WEBB CITY", "loc" : [ -94.472683, 37.144 ], "pop" : 7474, "state" : "MO" } +{ "_id" : "64873", "city" : "WENTWORTH", "loc" : [ -94.132169, 36.980702 ], "pop" : 1211, "state" : "MO" } +{ "_id" : "64874", "city" : "WHEATON", "loc" : [ -94.04916, 36.765145 ], "pop" : 970, "state" : "MO" } +{ "_id" : "65001", "city" : "ARGYLE", "loc" : [ -92.015456, 38.298619 ], "pop" : 384, "state" : "MO" } +{ "_id" : "65010", "city" : "ASHLAND", "loc" : [ -92.25366200000001, 38.787771 ], "pop" : 2989, "state" : "MO" } +{ "_id" : "65011", "city" : "BARNETT", "loc" : [ -92.668594, 38.396696 ], "pop" : 660, "state" : "MO" } +{ "_id" : "65013", "city" : "BELLE", "loc" : [ -91.730299, 38.271108 ], "pop" : 2874, "state" : "MO" } +{ "_id" : "65014", "city" : "BLAND", "loc" : [ -91.626334, 38.307383 ], "pop" : 2284, "state" : "MO" } +{ "_id" : "65016", "city" : "BONNOTS MILL", "loc" : [ -91.92934099999999, 38.553282 ], "pop" : 1373, "state" : "MO" } +{ "_id" : "65017", "city" : "BRUMLEY", "loc" : [ -92.474732, 38.070914 ], "pop" : 1127, "state" : "MO" } +{ "_id" : "65018", "city" : "CALIFORNIA", "loc" : [ -92.545558, 38.622369 ], "pop" : 6224, "state" : "MO" } +{ "_id" : "65020", "city" : "CAMDENTON", "loc" : [ -92.76774399999999, 38.018534 ], "pop" : 8006, "state" : "MO" } +{ "_id" : "65023", "city" : "CENTERTOWN", "loc" : [ -92.39952099999999, 38.629705 ], "pop" : 1184, "state" : "MO" } +{ "_id" : "65024", "city" : "CHAMOIS", "loc" : [ -91.76967999999999, 38.652683 ], "pop" : 986, "state" : "MO" } +{ "_id" : "65025", "city" : "CLARKSBURG", "loc" : [ -92.67292500000001, 38.643156 ], "pop" : 784, "state" : "MO" } +{ "_id" : "65026", "city" : "ELDON", "loc" : [ -92.57361899999999, 38.340127 ], "pop" : 8673, "state" : "MO" } +{ "_id" : "65032", "city" : "EUGENE", "loc" : [ -92.368853, 38.359849 ], "pop" : 1181, "state" : "MO" } +{ "_id" : "65034", "city" : "FORTUNA", "loc" : [ -92.784948, 38.574391 ], "pop" : 310, "state" : "MO" } +{ "_id" : "65035", "city" : "FREEBURG", "loc" : [ -91.927605, 38.355085 ], "pop" : 1373, "state" : "MO" } +{ "_id" : "65037", "city" : "GRAVOIS MILLS", "loc" : [ -92.82302900000001, 38.258445 ], "pop" : 5653, "state" : "MO" } +{ "_id" : "65039", "city" : "HARTSBURG", "loc" : [ -92.286377, 38.715902 ], "pop" : 1945, "state" : "MO" } +{ "_id" : "65040", "city" : "HENLEY", "loc" : [ -92.312303, 38.388133 ], "pop" : 952, "state" : "MO" } +{ "_id" : "65041", "city" : "BAY", "loc" : [ -91.46771699999999, 38.668381 ], "pop" : 4842, "state" : "MO" } +{ "_id" : "65042", "city" : "HIGH POINT", "loc" : [ -92.600514, 38.478237 ], "pop" : 509, "state" : "MO" } +{ "_id" : "65043", "city" : "HOLTS SUMMIT", "loc" : [ -92.116345, 38.632784 ], "pop" : 6642, "state" : "MO" } +{ "_id" : "65046", "city" : "JAMESTOWN", "loc" : [ -92.48065099999999, 38.779292 ], "pop" : 1018, "state" : "MO" } +{ "_id" : "65047", "city" : "KAISER", "loc" : [ -92.579869, 38.163673 ], "pop" : 1213, "state" : "MO" } +{ "_id" : "65048", "city" : "KOELTZTOWN", "loc" : [ -92.048365, 38.323526 ], "pop" : 185, "state" : "MO" } +{ "_id" : "65049", "city" : "FOUR SEASONS", "loc" : [ -92.677555, 38.209127 ], "pop" : 4404, "state" : "MO" } +{ "_id" : "65050", "city" : "LATHAM", "loc" : [ -92.65364700000001, 38.550035 ], "pop" : 937, "state" : "MO" } +{ "_id" : "65051", "city" : "LINN", "loc" : [ -91.81945, 38.473855 ], "pop" : 3836, "state" : "MO" } +{ "_id" : "65052", "city" : "LINN CREEK", "loc" : [ -92.683077, 38.060524 ], "pop" : 2308, "state" : "MO" } +{ "_id" : "65053", "city" : "LOHMAN", "loc" : [ -92.384216, 38.548434 ], "pop" : 356, "state" : "MO" } +{ "_id" : "65054", "city" : "LOOSE CREEK", "loc" : [ -91.959126, 38.471715 ], "pop" : 1089, "state" : "MO" } +{ "_id" : "65058", "city" : "META", "loc" : [ -92.135797, 38.250039 ], "pop" : 1003, "state" : "MO" } +{ "_id" : "65059", "city" : "MOKANE", "loc" : [ -91.886815, 38.699839 ], "pop" : 881, "state" : "MO" } +{ "_id" : "65061", "city" : "MORRISON", "loc" : [ -91.657972, 38.605967 ], "pop" : 267, "state" : "MO" } +{ "_id" : "65062", "city" : "MOUNT STERLING", "loc" : [ -91.610315, 38.538786 ], "pop" : 285, "state" : "MO" } +{ "_id" : "65063", "city" : "NEW BLOOMFIELD", "loc" : [ -92.082983, 38.709996 ], "pop" : 2588, "state" : "MO" } +{ "_id" : "65064", "city" : "OLEAN", "loc" : [ -92.53031, 38.400059 ], "pop" : 882, "state" : "MO" } +{ "_id" : "65065", "city" : "OSAGE BEACH", "loc" : [ -92.666427, 38.13805 ], "pop" : 3601, "state" : "MO" } +{ "_id" : "65066", "city" : "OWENSVILLE", "loc" : [ -91.486679, 38.351119 ], "pop" : 5980, "state" : "MO" } +{ "_id" : "65067", "city" : "PORTLAND", "loc" : [ -91.70056700000001, 38.784701 ], "pop" : 439, "state" : "MO" } +{ "_id" : "65068", "city" : "PRAIRIE HOME", "loc" : [ -92.597376, 38.825331 ], "pop" : 533, "state" : "MO" } +{ "_id" : "65069", "city" : "RHINELAND", "loc" : [ -91.51510500000001, 38.763811 ], "pop" : 1340, "state" : "MO" } +{ "_id" : "65072", "city" : "ROCKY MOUNT", "loc" : [ -92.705921, 38.291057 ], "pop" : 157, "state" : "MO" } +{ "_id" : "65074", "city" : "RUSSELLVILLE", "loc" : [ -92.42912200000001, 38.500534 ], "pop" : 2043, "state" : "MO" } +{ "_id" : "65075", "city" : "SAINT ELIZABETH", "loc" : [ -92.263503, 38.271244 ], "pop" : 701, "state" : "MO" } +{ "_id" : "65076", "city" : "SAINT THOMAS", "loc" : [ -92.18938199999999, 38.391246 ], "pop" : 1232, "state" : "MO" } +{ "_id" : "65077", "city" : "STEEDMAN", "loc" : [ -91.788837, 38.756604 ], "pop" : 458, "state" : "MO" } +{ "_id" : "65078", "city" : "STOVER", "loc" : [ -92.99466700000001, 38.441352 ], "pop" : 1946, "state" : "MO" } +{ "_id" : "65079", "city" : "SUNRISE BEACH", "loc" : [ -92.78539499999999, 38.155845 ], "pop" : 3635, "state" : "MO" } +{ "_id" : "65080", "city" : "TEBBETTS", "loc" : [ -91.967316, 38.640193 ], "pop" : 413, "state" : "MO" } +{ "_id" : "65081", "city" : "TIPTON", "loc" : [ -92.781448, 38.654839 ], "pop" : 2516, "state" : "MO" } +{ "_id" : "65082", "city" : "TUSCUMBIA", "loc" : [ -92.491739, 38.238881 ], "pop" : 1181, "state" : "MO" } +{ "_id" : "65083", "city" : "ULMAN", "loc" : [ -92.46397899999999, 38.134141 ], "pop" : 517, "state" : "MO" } +{ "_id" : "65084", "city" : "VERSAILLES", "loc" : [ -92.825835, 38.436491 ], "pop" : 5581, "state" : "MO" } +{ "_id" : "65085", "city" : "WESTPHALIA", "loc" : [ -92.039221, 38.426968 ], "pop" : 992, "state" : "MO" } +{ "_id" : "65101", "city" : "JEFFERSON CITY", "loc" : [ -92.152462, 38.546212 ], "pop" : 25992, "state" : "MO" } +{ "_id" : "65109", "city" : "JEFFERSON CITY", "loc" : [ -92.244298, 38.577272 ], "pop" : 31418, "state" : "MO" } +{ "_id" : "65201", "city" : "COLUMBIA", "loc" : [ -92.30486500000001, 38.938176 ], "pop" : 33668, "state" : "MO" } +{ "_id" : "65202", "city" : "COLUMBIA", "loc" : [ -92.311204, 38.995019 ], "pop" : 27394, "state" : "MO" } +{ "_id" : "65203", "city" : "COLUMBIA", "loc" : [ -92.363865, 38.93482 ], "pop" : 34914, "state" : "MO" } +{ "_id" : "65230", "city" : "ARMSTRONG", "loc" : [ -92.70897600000001, 39.256585 ], "pop" : 736, "state" : "MO" } +{ "_id" : "65231", "city" : "AUXVASSE", "loc" : [ -91.885801, 39.012184 ], "pop" : 2698, "state" : "MO" } +{ "_id" : "65232", "city" : "BENTON CITY", "loc" : [ -91.766124, 39.120886 ], "pop" : 300, "state" : "MO" } +{ "_id" : "65233", "city" : "BOONVILLE", "loc" : [ -92.744973, 38.95364 ], "pop" : 9330, "state" : "MO" } +{ "_id" : "65236", "city" : "BRUNSWICK", "loc" : [ -93.118694, 39.437424 ], "pop" : 1610, "state" : "MO" } +{ "_id" : "65237", "city" : "BUNCETON", "loc" : [ -92.79269499999999, 38.746754 ], "pop" : 1343, "state" : "MO" } +{ "_id" : "65239", "city" : "CAIRO", "loc" : [ -92.440027, 39.51141 ], "pop" : 1143, "state" : "MO" } +{ "_id" : "65240", "city" : "CENTRALIA", "loc" : [ -92.147244, 39.196089 ], "pop" : 5171, "state" : "MO" } +{ "_id" : "65243", "city" : "CLARK", "loc" : [ -92.382706, 39.315293 ], "pop" : 4672, "state" : "MO" } +{ "_id" : "65244", "city" : "CLIFTON HILL", "loc" : [ -92.667676, 39.425985 ], "pop" : 341, "state" : "MO" } +{ "_id" : "65246", "city" : "DALTON", "loc" : [ -92.994366, 39.40346 ], "pop" : 209, "state" : "MO" } +{ "_id" : "65247", "city" : "EXCELLO", "loc" : [ -92.475705, 39.645543 ], "pop" : 873, "state" : "MO" } +{ "_id" : "65248", "city" : "FAYETTE", "loc" : [ -92.658287, 39.143041 ], "pop" : 4805, "state" : "MO" } +{ "_id" : "65250", "city" : "FRANKLIN", "loc" : [ -92.831596, 39.066818 ], "pop" : 680, "state" : "MO" } +{ "_id" : "65251", "city" : "FULTON", "loc" : [ -91.96055, 38.851821 ], "pop" : 17506, "state" : "MO" } +{ "_id" : "65254", "city" : "GLASGOW", "loc" : [ -92.831812, 39.225736 ], "pop" : 1757, "state" : "MO" } +{ "_id" : "65255", "city" : "HALLSVILLE", "loc" : [ -92.223855, 39.105429 ], "pop" : 2476, "state" : "MO" } +{ "_id" : "65256", "city" : "HARRISBURG", "loc" : [ -92.440955, 39.120312 ], "pop" : 928, "state" : "MO" } +{ "_id" : "65257", "city" : "HIGBEE", "loc" : [ -92.51630900000001, 39.305521 ], "pop" : 932, "state" : "MO" } +{ "_id" : "65258", "city" : "HOLLIDAY", "loc" : [ -92.131759, 39.490436 ], "pop" : 286, "state" : "MO" } +{ "_id" : "65259", "city" : "HUNTSVILLE", "loc" : [ -92.552992, 39.435371 ], "pop" : 3210, "state" : "MO" } +{ "_id" : "65260", "city" : "JACKSONVILLE", "loc" : [ -92.43153599999999, 39.579076 ], "pop" : 473, "state" : "MO" } +{ "_id" : "65261", "city" : "KEYTESVILLE", "loc" : [ -92.930187, 39.479388 ], "pop" : 1354, "state" : "MO" } +{ "_id" : "65262", "city" : "KINGDOM CITY", "loc" : [ -91.95200800000001, 38.95508 ], "pop" : 322, "state" : "MO" } +{ "_id" : "65263", "city" : "MADISON", "loc" : [ -92.22871499999999, 39.461543 ], "pop" : 2000, "state" : "MO" } +{ "_id" : "65264", "city" : "MARTINSBURG", "loc" : [ -91.66463, 39.09675 ], "pop" : 644, "state" : "MO" } +{ "_id" : "65265", "city" : "MEXICO", "loc" : [ -91.889473, 39.171233 ], "pop" : 14785, "state" : "MO" } +{ "_id" : "65270", "city" : "MOBERLY", "loc" : [ -92.435793, 39.420239 ], "pop" : 14884, "state" : "MO" } +{ "_id" : "65274", "city" : "NEW FRANKLIN", "loc" : [ -92.738601, 39.020042 ], "pop" : 1595, "state" : "MO" } +{ "_id" : "65275", "city" : "PARIS", "loc" : [ -92.011323, 39.493219 ], "pop" : 3157, "state" : "MO" } +{ "_id" : "65276", "city" : "PILOT GROVE", "loc" : [ -92.93046099999999, 38.871168 ], "pop" : 1492, "state" : "MO" } +{ "_id" : "65279", "city" : "ROCHEPORT", "loc" : [ -92.50785399999999, 38.975578 ], "pop" : 1437, "state" : "MO" } +{ "_id" : "65280", "city" : "RUSH HILL", "loc" : [ -91.68882499999999, 39.193163 ], "pop" : 646, "state" : "MO" } +{ "_id" : "65281", "city" : "SALISBURY", "loc" : [ -92.80144, 39.431853 ], "pop" : 4022, "state" : "MO" } +{ "_id" : "65282", "city" : "SANTA FE", "loc" : [ -91.82937699999999, 39.398929 ], "pop" : 712, "state" : "MO" } +{ "_id" : "65283", "city" : "STOUTSVILLE", "loc" : [ -91.829661, 39.559425 ], "pop" : 361, "state" : "MO" } +{ "_id" : "65284", "city" : "STURGEON", "loc" : [ -92.295264, 39.205705 ], "pop" : 1812, "state" : "MO" } +{ "_id" : "65285", "city" : "THOMPSON", "loc" : [ -92.02594499999999, 39.20258 ], "pop" : 1230, "state" : "MO" } +{ "_id" : "65286", "city" : "TRIPLETT", "loc" : [ -93.19277099999999, 39.501098 ], "pop" : 192, "state" : "MO" } +{ "_id" : "65287", "city" : "WOOLDRIDGE", "loc" : [ -92.582584, 38.919475 ], "pop" : 571, "state" : "MO" } +{ "_id" : "65301", "city" : "SEDALIA", "loc" : [ -93.232268, 38.696076 ], "pop" : 28813, "state" : "MO" } +{ "_id" : "65305", "city" : "WHITEMAN AFB", "loc" : [ -93.572514, 38.731683 ], "pop" : 4222, "state" : "MO" } +{ "_id" : "65321", "city" : "BLACKBURN", "loc" : [ -93.428124, 39.098776 ], "pop" : 777, "state" : "MO" } +{ "_id" : "65322", "city" : "BLACKWATER", "loc" : [ -92.96829099999999, 38.972659 ], "pop" : 713, "state" : "MO" } +{ "_id" : "65323", "city" : "CALHOUN", "loc" : [ -93.645929, 38.485842 ], "pop" : 795, "state" : "MO" } +{ "_id" : "65324", "city" : "CLIMAX SPRINGS", "loc" : [ -92.95371, 38.139586 ], "pop" : 1840, "state" : "MO" } +{ "_id" : "65325", "city" : "COLE CAMP", "loc" : [ -93.191529, 38.453124 ], "pop" : 2570, "state" : "MO" } +{ "_id" : "65326", "city" : "EDWARDS", "loc" : [ -93.147104, 38.190564 ], "pop" : 1320, "state" : "MO" } +{ "_id" : "65329", "city" : "FLORENCE", "loc" : [ -92.998606, 38.610056 ], "pop" : 847, "state" : "MO" } +{ "_id" : "65330", "city" : "GILLIAM", "loc" : [ -92.993222, 39.244708 ], "pop" : 476, "state" : "MO" } +{ "_id" : "65332", "city" : "GREEN RIDGE", "loc" : [ -93.437395, 38.618983 ], "pop" : 1198, "state" : "MO" } +{ "_id" : "65333", "city" : "HOUSTONIA", "loc" : [ -93.332531, 38.910581 ], "pop" : 699, "state" : "MO" } +{ "_id" : "65334", "city" : "HUGHESVILLE", "loc" : [ -93.215895, 38.84944 ], "pop" : 1279, "state" : "MO" } +{ "_id" : "65335", "city" : "IONIA", "loc" : [ -93.32235799999999, 38.501887 ], "pop" : 175, "state" : "MO" } +{ "_id" : "65336", "city" : "KNOB NOSTER", "loc" : [ -93.556422, 38.746932 ], "pop" : 4455, "state" : "MO" } +{ "_id" : "65337", "city" : "LA MONTE", "loc" : [ -93.43126599999999, 38.775256 ], "pop" : 1570, "state" : "MO" } +{ "_id" : "65338", "city" : "LINCOLN", "loc" : [ -93.3668, 38.407271 ], "pop" : 1810, "state" : "MO" } +{ "_id" : "65339", "city" : "GRAND PASS", "loc" : [ -93.381325, 39.195108 ], "pop" : 622, "state" : "MO" } +{ "_id" : "65340", "city" : "NAPTON", "loc" : [ -93.196017, 39.10983 ], "pop" : 15086, "state" : "MO" } +{ "_id" : "65344", "city" : "MIAMI", "loc" : [ -93.19678, 39.282095 ], "pop" : 569, "state" : "MO" } +{ "_id" : "65345", "city" : "MORA", "loc" : [ -93.227232, 38.520726 ], "pop" : 132, "state" : "MO" } +{ "_id" : "65347", "city" : "NELSON", "loc" : [ -93.031102, 39.010447 ], "pop" : 836, "state" : "MO" } +{ "_id" : "65348", "city" : "OTTERVILLE", "loc" : [ -93.010819, 38.71607 ], "pop" : 853, "state" : "MO" } +{ "_id" : "65349", "city" : "SLATER", "loc" : [ -93.05467400000001, 39.216273 ], "pop" : 2872, "state" : "MO" } +{ "_id" : "65350", "city" : "SMITHTON", "loc" : [ -93.10807200000001, 38.649973 ], "pop" : 1669, "state" : "MO" } +{ "_id" : "65351", "city" : "SWEET SPRINGS", "loc" : [ -93.424683, 38.965953 ], "pop" : 2385, "state" : "MO" } +{ "_id" : "65354", "city" : "SYRACUSE", "loc" : [ -92.882265, 38.637423 ], "pop" : 730, "state" : "MO" } +{ "_id" : "65355", "city" : "WARSAW", "loc" : [ -93.337279, 38.250186 ], "pop" : 8108, "state" : "MO" } +{ "_id" : "65360", "city" : "WINDSOR", "loc" : [ -93.526864, 38.52719 ], "pop" : 3453, "state" : "MO" } +{ "_id" : "65401", "city" : "ROLLA", "loc" : [ -91.76034799999999, 37.948527 ], "pop" : 24377, "state" : "MO" } +{ "_id" : "65433", "city" : "BENDAVIS", "loc" : [ -92.228174, 37.246803 ], "pop" : 44, "state" : "MO" } +{ "_id" : "65436", "city" : "BEULAH", "loc" : [ -91.878714, 37.644469 ], "pop" : 546, "state" : "MO" } +{ "_id" : "65438", "city" : "BIRCH TREE", "loc" : [ -91.50082, 36.947589 ], "pop" : 2586, "state" : "MO" } +{ "_id" : "65439", "city" : "BIXBY", "loc" : [ -91.083461, 37.672244 ], "pop" : 464, "state" : "MO" } +{ "_id" : "65440", "city" : "BOSS", "loc" : [ -91.210905, 37.637282 ], "pop" : 457, "state" : "MO" } +{ "_id" : "65441", "city" : "BOURBON", "loc" : [ -91.22254, 38.172039 ], "pop" : 4456, "state" : "MO" } +{ "_id" : "65443", "city" : "BRINKTOWN", "loc" : [ -92.12310600000001, 38.067282 ], "pop" : 946, "state" : "MO" } +{ "_id" : "65444", "city" : "BUCYRUS", "loc" : [ -92.046536, 37.397197 ], "pop" : 1416, "state" : "MO" } +{ "_id" : "65446", "city" : "CHERRYVILLE", "loc" : [ -91.234807, 37.806601 ], "pop" : 861, "state" : "MO" } +{ "_id" : "65449", "city" : "COOK STATION", "loc" : [ -91.461631, 37.855234 ], "pop" : 347, "state" : "MO" } +{ "_id" : "65452", "city" : "CROCKER", "loc" : [ -92.269998, 37.944611 ], "pop" : 2954, "state" : "MO" } +{ "_id" : "65453", "city" : "CUBA", "loc" : [ -91.40814, 38.092553 ], "pop" : 7466, "state" : "MO" } +{ "_id" : "65456", "city" : "DAVISVILLE", "loc" : [ -91.13287200000001, 37.792596 ], "pop" : 286, "state" : "MO" } +{ "_id" : "65457", "city" : "DEVILS ELBOW", "loc" : [ -92.08569300000001, 37.85026 ], "pop" : 1717, "state" : "MO" } +{ "_id" : "65459", "city" : "DIXON", "loc" : [ -92.089662, 37.984766 ], "pop" : 4779, "state" : "MO" } +{ "_id" : "65461", "city" : "DUKE", "loc" : [ -91.99306300000001, 37.655001 ], "pop" : 166, "state" : "MO" } +{ "_id" : "65462", "city" : "EDGAR SPRINGS", "loc" : [ -91.890579, 37.736505 ], "pop" : 1026, "state" : "MO" } +{ "_id" : "65463", "city" : "ELDRIDGE", "loc" : [ -92.738202, 37.83456 ], "pop" : 892, "state" : "MO" } +{ "_id" : "65464", "city" : "ELK CREEK", "loc" : [ -91.998812, 37.217087 ], "pop" : 540, "state" : "MO" } +{ "_id" : "65466", "city" : "EMINENCE", "loc" : [ -91.451933, 37.162556 ], "pop" : 2450, "state" : "MO" } +{ "_id" : "65468", "city" : "EUNICE", "loc" : [ -91.723191, 37.212277 ], "pop" : 215, "state" : "MO" } +{ "_id" : "65470", "city" : "FALCON", "loc" : [ -92.34656200000001, 37.606099 ], "pop" : 561, "state" : "MO" } +{ "_id" : "65473", "city" : "FORT LEONARD WOO", "loc" : [ -92.126345, 37.759856 ], "pop" : 16140, "state" : "MO" } +{ "_id" : "65479", "city" : "HARTSHORN", "loc" : [ -91.683418, 37.284306 ], "pop" : 306, "state" : "MO" } +{ "_id" : "65483", "city" : "HOUSTON", "loc" : [ -91.95298200000001, 37.321829 ], "pop" : 4497, "state" : "MO" } +{ "_id" : "65484", "city" : "HUGGINS", "loc" : [ -92.148605, 37.266224 ], "pop" : 593, "state" : "MO" } +{ "_id" : "65486", "city" : "IBERIA", "loc" : [ -92.298897, 38.121926 ], "pop" : 3704, "state" : "MO" } +{ "_id" : "65501", "city" : "JADWIN", "loc" : [ -91.51588700000001, 37.473619 ], "pop" : 374, "state" : "MO" } +{ "_id" : "65529", "city" : "JEROME", "loc" : [ -91.99057000000001, 37.92543 ], "pop" : 391, "state" : "MO" } +{ "_id" : "65534", "city" : "LAQUEY", "loc" : [ -92.337901, 37.749378 ], "pop" : 798, "state" : "MO" } +{ "_id" : "65535", "city" : "LEASBURG", "loc" : [ -91.2488, 38.081054 ], "pop" : 1061, "state" : "MO" } +{ "_id" : "65536", "city" : "LEBANON", "loc" : [ -92.655029, 37.685049 ], "pop" : 20859, "state" : "MO" } +{ "_id" : "65540", "city" : "ANUTT", "loc" : [ -91.715862, 37.743731 ], "pop" : 635, "state" : "MO" } +{ "_id" : "65541", "city" : "LENOX", "loc" : [ -91.727735, 37.640757 ], "pop" : 640, "state" : "MO" } +{ "_id" : "65542", "city" : "LICKING", "loc" : [ -91.855585, 37.509082 ], "pop" : 3545, "state" : "MO" } +{ "_id" : "65543", "city" : "LYNCHBURG", "loc" : [ -92.320196, 37.505357 ], "pop" : 297, "state" : "MO" } +{ "_id" : "65548", "city" : "MOUNTAIN VIEW", "loc" : [ -91.709937, 36.989197 ], "pop" : 3721, "state" : "MO" } +{ "_id" : "65550", "city" : "NEWBURG", "loc" : [ -91.880683, 37.900778 ], "pop" : 2972, "state" : "MO" } +{ "_id" : "65552", "city" : "PLATO", "loc" : [ -92.170913, 37.512231 ], "pop" : 1479, "state" : "MO" } +{ "_id" : "65555", "city" : "RAYMONDVILLE", "loc" : [ -91.81308900000001, 37.356913 ], "pop" : 1145, "state" : "MO" } +{ "_id" : "65556", "city" : "RICHLAND", "loc" : [ -92.39624499999999, 37.852752 ], "pop" : 3643, "state" : "MO" } +{ "_id" : "65557", "city" : "ROBY", "loc" : [ -92.12218799999999, 37.496993 ], "pop" : 184, "state" : "MO" } +{ "_id" : "65559", "city" : "SAINT JAMES", "loc" : [ -91.60756499999999, 38.005622 ], "pop" : 6315, "state" : "MO" } +{ "_id" : "65560", "city" : "SALEM", "loc" : [ -91.525809, 37.616952 ], "pop" : 12088, "state" : "MO" } +{ "_id" : "65564", "city" : "SOLO", "loc" : [ -91.95990500000001, 37.167052 ], "pop" : 309, "state" : "MO" } +{ "_id" : "65565", "city" : "BERRYMAN", "loc" : [ -91.329337, 37.962998 ], "pop" : 4323, "state" : "MO" } +{ "_id" : "65566", "city" : "VIBURNUM", "loc" : [ -91.128922, 37.715066 ], "pop" : 844, "state" : "MO" } +{ "_id" : "65567", "city" : "STOUTLAND", "loc" : [ -92.51137300000001, 37.869338 ], "pop" : 1637, "state" : "MO" } +{ "_id" : "65570", "city" : "SUCCESS", "loc" : [ -92.003621, 37.480533 ], "pop" : 210, "state" : "MO" } +{ "_id" : "65571", "city" : "SUMMERSVILLE", "loc" : [ -91.68277, 37.148352 ], "pop" : 1199, "state" : "MO" } +{ "_id" : "65573", "city" : "TERESITA", "loc" : [ -91.596553, 36.999728 ], "pop" : 573, "state" : "MO" } +{ "_id" : "65580", "city" : "VICHY", "loc" : [ -91.77875, 38.097958 ], "pop" : 977, "state" : "MO" } +{ "_id" : "65582", "city" : "VIENNA", "loc" : [ -91.94220799999999, 38.191926 ], "pop" : 1956, "state" : "MO" } +{ "_id" : "65583", "city" : "SAINT ROBERT", "loc" : [ -92.198944, 37.817515 ], "pop" : 12431, "state" : "MO" } +{ "_id" : "65586", "city" : "WESCO", "loc" : [ -91.349028, 37.873185 ], "pop" : 460, "state" : "MO" } +{ "_id" : "65588", "city" : "WINONA", "loc" : [ -91.312059, 37.016869 ], "pop" : 2065, "state" : "MO" } +{ "_id" : "65589", "city" : "YUKON", "loc" : [ -91.824377, 37.231108 ], "pop" : 476, "state" : "MO" } +{ "_id" : "65590", "city" : "LONG LANE", "loc" : [ -92.930853, 37.580769 ], "pop" : 1589, "state" : "MO" } +{ "_id" : "65591", "city" : "MONTREAL", "loc" : [ -92.547031, 37.985108 ], "pop" : 759, "state" : "MO" } +{ "_id" : "65601", "city" : "ALDRICH", "loc" : [ -93.557642, 37.505667 ], "pop" : 1006, "state" : "MO" } +{ "_id" : "65603", "city" : "ARCOLA", "loc" : [ -93.858718, 37.531254 ], "pop" : 420, "state" : "MO" } +{ "_id" : "65604", "city" : "ASH GROVE", "loc" : [ -93.57813, 37.315972 ], "pop" : 1909, "state" : "MO" } +{ "_id" : "65605", "city" : "JENKINS", "loc" : [ -93.71238, 36.947661 ], "pop" : 10006, "state" : "MO" } +{ "_id" : "65606", "city" : "RIVERTON", "loc" : [ -91.392743, 36.702543 ], "pop" : 3224, "state" : "MO" } +{ "_id" : "65608", "city" : "AVA", "loc" : [ -92.67654400000001, 36.940717 ], "pop" : 8246, "state" : "MO" } +{ "_id" : "65609", "city" : "BAKERSFIELD", "loc" : [ -92.150679, 36.53323 ], "pop" : 560, "state" : "MO" } +{ "_id" : "65610", "city" : "BILLINGS", "loc" : [ -93.547629, 37.062841 ], "pop" : 2408, "state" : "MO" } +{ "_id" : "65611", "city" : "BLUE EYE", "loc" : [ -93.42994400000001, 36.54321 ], "pop" : 2148, "state" : "MO" } +{ "_id" : "65612", "city" : "BOIS D ARC", "loc" : [ -93.54472199999999, 37.221417 ], "pop" : 2410, "state" : "MO" } +{ "_id" : "65613", "city" : "BOLIVAR", "loc" : [ -93.412631, 37.608502 ], "pop" : 10671, "state" : "MO" } +{ "_id" : "65614", "city" : "BRADLEYVILLE", "loc" : [ -92.915116, 36.765908 ], "pop" : 428, "state" : "MO" } +{ "_id" : "65616", "city" : "MARVEL CAVE PARK", "loc" : [ -93.24378900000001, 36.655755 ], "pop" : 7658, "state" : "MO" } +{ "_id" : "65617", "city" : "BRIGHTON", "loc" : [ -93.36027900000001, 37.472807 ], "pop" : 920, "state" : "MO" } +{ "_id" : "65618", "city" : "BRIXEY", "loc" : [ -92.40264500000001, 36.758966 ], "pop" : 198, "state" : "MO" } +{ "_id" : "65619", "city" : "BROOKLINE STATIO", "loc" : [ -93.383467, 37.127184 ], "pop" : 4541, "state" : "MO" } +{ "_id" : "65620", "city" : "BRUNER", "loc" : [ -92.969241, 36.999002 ], "pop" : 737, "state" : "MO" } +{ "_id" : "65622", "city" : "BUFFALO", "loc" : [ -93.10422800000001, 37.549842 ], "pop" : 4176, "state" : "MO" } +{ "_id" : "65623", "city" : "BUTTERFIELD", "loc" : [ -93.912609, 36.745066 ], "pop" : 684, "state" : "MO" } +{ "_id" : "65624", "city" : "CAPE FAIR", "loc" : [ -93.524255, 36.693776 ], "pop" : 1783, "state" : "MO" } +{ "_id" : "65625", "city" : "CASSVILLE", "loc" : [ -93.84667, 36.678386 ], "pop" : 5416, "state" : "MO" } +{ "_id" : "65626", "city" : "CAULFIELD", "loc" : [ -92.067773, 36.60353 ], "pop" : 1941, "state" : "MO" } +{ "_id" : "65627", "city" : "CEDARCREEK", "loc" : [ -93.017239, 36.571013 ], "pop" : 407, "state" : "MO" } +{ "_id" : "65629", "city" : "CHADWICK", "loc" : [ -93.04508199999999, 36.922041 ], "pop" : 326, "state" : "MO" } +{ "_id" : "65630", "city" : "CHESTNUTRIDGE", "loc" : [ -93.10121700000001, 36.835283 ], "pop" : 188, "state" : "MO" } +{ "_id" : "65631", "city" : "CLEVER", "loc" : [ -93.44747, 37.034796 ], "pop" : 1728, "state" : "MO" } +{ "_id" : "65632", "city" : "CONWAY", "loc" : [ -92.7891, 37.508472 ], "pop" : 1451, "state" : "MO" } +{ "_id" : "65633", "city" : "CRANE", "loc" : [ -93.530339, 36.925771 ], "pop" : 2918, "state" : "MO" } +{ "_id" : "65634", "city" : "CROSS TIMBERS", "loc" : [ -93.19781, 38.023873 ], "pop" : 612, "state" : "MO" } +{ "_id" : "65635", "city" : "DADEVILLE", "loc" : [ -93.695562, 37.510458 ], "pop" : 774, "state" : "MO" } +{ "_id" : "65637", "city" : "DORA", "loc" : [ -92.237796, 36.756009 ], "pop" : 1163, "state" : "MO" } +{ "_id" : "65638", "city" : "DRURY", "loc" : [ -92.36639599999999, 36.93193 ], "pop" : 735, "state" : "MO" } +{ "_id" : "65640", "city" : "DUNNEGAN", "loc" : [ -93.52160499999999, 37.703137 ], "pop" : 755, "state" : "MO" } +{ "_id" : "65641", "city" : "EAGLE ROCK", "loc" : [ -93.733609, 36.548035 ], "pop" : 1062, "state" : "MO" } +{ "_id" : "65644", "city" : "ELKLAND", "loc" : [ -93.020983, 37.433591 ], "pop" : 1136, "state" : "MO" } +{ "_id" : "65646", "city" : "EVERTON", "loc" : [ -93.68943400000001, 37.235428 ], "pop" : 675, "state" : "MO" } +{ "_id" : "65647", "city" : "EXETER", "loc" : [ -93.970209, 36.681498 ], "pop" : 2264, "state" : "MO" } +{ "_id" : "65648", "city" : "FAIR GROVE", "loc" : [ -93.142824, 37.372143 ], "pop" : 2079, "state" : "MO" } +{ "_id" : "65649", "city" : "FAIR PLAY", "loc" : [ -93.60635499999999, 37.633496 ], "pop" : 1533, "state" : "MO" } +{ "_id" : "65650", "city" : "FLEMINGTON", "loc" : [ -93.447131, 37.780268 ], "pop" : 642, "state" : "MO" } +{ "_id" : "65652", "city" : "FORDLAND", "loc" : [ -92.911148, 37.14474 ], "pop" : 2080, "state" : "MO" } +{ "_id" : "65653", "city" : "FORSYTH", "loc" : [ -93.114968, 36.69548 ], "pop" : 3870, "state" : "MO" } +{ "_id" : "65654", "city" : "FREISTATT", "loc" : [ -93.89614400000001, 37.017563 ], "pop" : 515, "state" : "MO" } +{ "_id" : "65655", "city" : "GAINESVILLE", "loc" : [ -92.416151, 36.590101 ], "pop" : 1987, "state" : "MO" } +{ "_id" : "65656", "city" : "GALENA", "loc" : [ -93.48112999999999, 36.819835 ], "pop" : 2307, "state" : "MO" } +{ "_id" : "65657", "city" : "GARRISON", "loc" : [ -92.99850000000001, 36.860997 ], "pop" : 362, "state" : "MO" } +{ "_id" : "65658", "city" : "GOLDEN", "loc" : [ -93.62298800000001, 36.562486 ], "pop" : 1663, "state" : "MO" } +{ "_id" : "65659", "city" : "GOODSON", "loc" : [ -93.237528, 37.707534 ], "pop" : 379, "state" : "MO" } +{ "_id" : "65660", "city" : "GRAFF", "loc" : [ -92.264726, 37.326214 ], "pop" : 271, "state" : "MO" } +{ "_id" : "65661", "city" : "GREENFIELD", "loc" : [ -93.840689, 37.419662 ], "pop" : 2041, "state" : "MO" } +{ "_id" : "65662", "city" : "GROVESPRING", "loc" : [ -92.60014099999999, 37.494667 ], "pop" : 2121, "state" : "MO" } +{ "_id" : "65663", "city" : "HALF WAY", "loc" : [ -93.241989, 37.601795 ], "pop" : 1270, "state" : "MO" } +{ "_id" : "65666", "city" : "HARDENVILLE", "loc" : [ -92.367766, 36.592625 ], "pop" : 267, "state" : "MO" } +{ "_id" : "65667", "city" : "HARTVILLE", "loc" : [ -92.518058, 37.273453 ], "pop" : 3040, "state" : "MO" } +{ "_id" : "65668", "city" : "HERMITAGE", "loc" : [ -93.29790199999999, 37.896853 ], "pop" : 2575, "state" : "MO" } +{ "_id" : "65669", "city" : "HIGHLANDVILLE", "loc" : [ -93.26802000000001, 36.94077 ], "pop" : 2106, "state" : "MO" } +{ "_id" : "65672", "city" : "HOLLISTER", "loc" : [ -93.228585, 36.610727 ], "pop" : 5515, "state" : "MO" } +{ "_id" : "65674", "city" : "HUMANSVILLE", "loc" : [ -93.579531, 37.792282 ], "pop" : 1541, "state" : "MO" } +{ "_id" : "65675", "city" : "HURLEY", "loc" : [ -93.476803, 36.925425 ], "pop" : 766, "state" : "MO" } +{ "_id" : "65676", "city" : "ISABELLA", "loc" : [ -92.605277, 36.574924 ], "pop" : 563, "state" : "MO" } +{ "_id" : "65679", "city" : "KIRBYVILLE", "loc" : [ -93.168256, 36.642615 ], "pop" : 1794, "state" : "MO" } +{ "_id" : "65680", "city" : "KISSEE MILLS", "loc" : [ -93.037733, 36.670446 ], "pop" : 826, "state" : "MO" } +{ "_id" : "65681", "city" : "LAMPE", "loc" : [ -93.45160199999999, 36.576725 ], "pop" : 1087, "state" : "MO" } +{ "_id" : "65682", "city" : "LOCKWOOD", "loc" : [ -93.86715, 37.386605 ], "pop" : 4042, "state" : "MO" } +{ "_id" : "65685", "city" : "LOUISBURG", "loc" : [ -93.10069900000001, 37.682843 ], "pop" : 4530, "state" : "MO" } +{ "_id" : "65686", "city" : "KIMBERLING CITY", "loc" : [ -93.43720999999999, 36.63928 ], "pop" : 3208, "state" : "MO" } +{ "_id" : "65688", "city" : "BRANDSVILLE", "loc" : [ -91.735536, 36.584925 ], "pop" : 794, "state" : "MO" } +{ "_id" : "65689", "city" : "CABOOL", "loc" : [ -92.11440899999999, 37.131366 ], "pop" : 4127, "state" : "MO" } +{ "_id" : "65690", "city" : "COUCH", "loc" : [ -91.330991, 36.565268 ], "pop" : 995, "state" : "MO" } +{ "_id" : "65692", "city" : "KOSHKONONG", "loc" : [ -91.630411, 36.605553 ], "pop" : 727, "state" : "MO" } +{ "_id" : "65701", "city" : "MC CLURG", "loc" : [ -92.818018, 36.751465 ], "pop" : 76, "state" : "MO" } +{ "_id" : "65702", "city" : "MACOMB", "loc" : [ -92.48206999999999, 37.104947 ], "pop" : 533, "state" : "MO" } +{ "_id" : "65704", "city" : "MANSFIELD", "loc" : [ -92.593553, 37.1273 ], "pop" : 3368, "state" : "MO" } +{ "_id" : "65705", "city" : "MARIONVILLE", "loc" : [ -93.641345, 37.000906 ], "pop" : 3305, "state" : "MO" } +{ "_id" : "65706", "city" : "MARSHFIELD", "loc" : [ -92.925033, 37.331178 ], "pop" : 10026, "state" : "MO" } +{ "_id" : "65707", "city" : "MILLER", "loc" : [ -93.84218799999999, 37.222454 ], "pop" : 1986, "state" : "MO" } +{ "_id" : "65708", "city" : "MONETT", "loc" : [ -93.925766, 36.921242 ], "pop" : 9297, "state" : "MO" } +{ "_id" : "65710", "city" : "MORRISVILLE", "loc" : [ -93.427486, 37.468588 ], "pop" : 689, "state" : "MO" } +{ "_id" : "65711", "city" : "MOUNTAIN GROVE", "loc" : [ -92.28389300000001, 37.162638 ], "pop" : 7623, "state" : "MO" } +{ "_id" : "65712", "city" : "MOUNT VERNON", "loc" : [ -93.79763199999999, 37.104466 ], "pop" : 6685, "state" : "MO" } +{ "_id" : "65713", "city" : "NIANGUA", "loc" : [ -92.776337, 37.398537 ], "pop" : 2628, "state" : "MO" } +{ "_id" : "65714", "city" : "NIXA", "loc" : [ -93.29717599999999, 37.051154 ], "pop" : 11346, "state" : "MO" } +{ "_id" : "65715", "city" : "NOBLE", "loc" : [ -92.57686, 36.744052 ], "pop" : 103, "state" : "MO" } +{ "_id" : "65717", "city" : "NORWOOD", "loc" : [ -92.408209, 37.068696 ], "pop" : 1535, "state" : "MO" } +{ "_id" : "65720", "city" : "OLDFIELD", "loc" : [ -93.032526, 36.970416 ], "pop" : 409, "state" : "MO" } +{ "_id" : "65721", "city" : "OZARK", "loc" : [ -93.20221100000001, 37.016926 ], "pop" : 8437, "state" : "MO" } +{ "_id" : "65722", "city" : "PHILLIPSBURG", "loc" : [ -92.741631, 37.583177 ], "pop" : 1369, "state" : "MO" } +{ "_id" : "65723", "city" : "PIERCE CITY", "loc" : [ -94.00241, 36.972992 ], "pop" : 2795, "state" : "MO" } +{ "_id" : "65724", "city" : "PITTSBURG", "loc" : [ -93.335615, 37.8442 ], "pop" : 610, "state" : "MO" } +{ "_id" : "65725", "city" : "PLEASANT HOPE", "loc" : [ -93.26173300000001, 37.4615 ], "pop" : 2079, "state" : "MO" } +{ "_id" : "65727", "city" : "POLK", "loc" : [ -93.294065, 37.752928 ], "pop" : 725, "state" : "MO" } +{ "_id" : "65728", "city" : "PONCE DE LEON", "loc" : [ -93.36705499999999, 36.89054 ], "pop" : 435, "state" : "MO" } +{ "_id" : "65729", "city" : "PONTIAC", "loc" : [ -92.561221, 36.524804 ], "pop" : 293, "state" : "MO" } +{ "_id" : "65730", "city" : "POWELL", "loc" : [ -94.167541, 36.556252 ], "pop" : 1681, "state" : "MO" } +{ "_id" : "65731", "city" : "POWERSITE", "loc" : [ -93.09001499999999, 36.630656 ], "pop" : 742, "state" : "MO" } +{ "_id" : "65732", "city" : "PRESTON", "loc" : [ -93.171295, 37.939025 ], "pop" : 753, "state" : "MO" } +{ "_id" : "65733", "city" : "PROTEM", "loc" : [ -92.829689, 36.546336 ], "pop" : 375, "state" : "MO" } +{ "_id" : "65734", "city" : "PURDY", "loc" : [ -93.916376, 36.806917 ], "pop" : 2906, "state" : "MO" } +{ "_id" : "65735", "city" : "QUINCY", "loc" : [ -93.471281, 38.002925 ], "pop" : 241, "state" : "MO" } +{ "_id" : "65737", "city" : "BRANSON WEST", "loc" : [ -93.372182, 36.694658 ], "pop" : 4426, "state" : "MO" } +{ "_id" : "65738", "city" : "REPUBLIC", "loc" : [ -93.480041, 37.123017 ], "pop" : 8312, "state" : "MO" } +{ "_id" : "65739", "city" : "RIDGEDALE", "loc" : [ -93.27780799999999, 36.524662 ], "pop" : 809, "state" : "MO" } +{ "_id" : "65740", "city" : "ROCKAWAY BEACH", "loc" : [ -93.17153500000001, 36.713686 ], "pop" : 1354, "state" : "MO" } +{ "_id" : "65742", "city" : "ROGERSVILLE", "loc" : [ -93.09644900000001, 37.131047 ], "pop" : 9409, "state" : "MO" } +{ "_id" : "65744", "city" : "RUETER", "loc" : [ -92.918792, 36.631415 ], "pop" : 180, "state" : "MO" } +{ "_id" : "65745", "city" : "SELIGMAN", "loc" : [ -93.935851, 36.527593 ], "pop" : 1392, "state" : "MO" } +{ "_id" : "65746", "city" : "SEYMOUR", "loc" : [ -92.785659, 37.166726 ], "pop" : 5311, "state" : "MO" } +{ "_id" : "65747", "city" : "SHELL KNOB", "loc" : [ -93.624855, 36.616672 ], "pop" : 821, "state" : "MO" } +{ "_id" : "65752", "city" : "SOUTH GREENFIELD", "loc" : [ -93.844482, 37.374256 ], "pop" : 248, "state" : "MO" } +{ "_id" : "65753", "city" : "SPARTA", "loc" : [ -93.106483, 36.977524 ], "pop" : 1879, "state" : "MO" } +{ "_id" : "65754", "city" : "SPOKANE", "loc" : [ -93.275447, 36.863639 ], "pop" : 968, "state" : "MO" } +{ "_id" : "65755", "city" : "SQUIRES", "loc" : [ -92.58444299999999, 36.850406 ], "pop" : 536, "state" : "MO" } +{ "_id" : "65756", "city" : "STOTTS CITY", "loc" : [ -93.954329, 37.103148 ], "pop" : 497, "state" : "MO" } +{ "_id" : "65757", "city" : "STRAFFORD", "loc" : [ -93.10663, 37.279718 ], "pop" : 3226, "state" : "MO" } +{ "_id" : "65758", "city" : "SYCAMORE", "loc" : [ -92.354355, 36.67179 ], "pop" : 97, "state" : "MO" } +{ "_id" : "65759", "city" : "TANEYVILLE", "loc" : [ -93.027951, 36.740497 ], "pop" : 731, "state" : "MO" } +{ "_id" : "65760", "city" : "TECUMSEH", "loc" : [ -92.259782, 36.58751 ], "pop" : 444, "state" : "MO" } +{ "_id" : "65761", "city" : "DUGGINSVILLE", "loc" : [ -92.70186099999999, 36.569019 ], "pop" : 962, "state" : "MO" } +{ "_id" : "65762", "city" : "NOTTINGHILL", "loc" : [ -92.65778899999999, 36.707546 ], "pop" : 617, "state" : "MO" } +{ "_id" : "65764", "city" : "TUNAS", "loc" : [ -92.980788, 37.839196 ], "pop" : 827, "state" : "MO" } +{ "_id" : "65766", "city" : "UDALL", "loc" : [ -92.23345, 36.525291 ], "pop" : 184, "state" : "MO" } +{ "_id" : "65767", "city" : "URBANA", "loc" : [ -93.150972, 37.85233 ], "pop" : 755, "state" : "MO" } +{ "_id" : "65768", "city" : "VANZANT", "loc" : [ -92.21006800000001, 36.977829 ], "pop" : 1048, "state" : "MO" } +{ "_id" : "65769", "city" : "VERONA", "loc" : [ -93.800505, 36.936964 ], "pop" : 2021, "state" : "MO" } +{ "_id" : "65770", "city" : "WALNUT GROVE", "loc" : [ -93.504356, 37.394253 ], "pop" : 2374, "state" : "MO" } +{ "_id" : "65771", "city" : "WALNUT SHADE", "loc" : [ -93.21482399999999, 36.770395 ], "pop" : 722, "state" : "MO" } +{ "_id" : "65772", "city" : "WASHBURN", "loc" : [ -93.991974, 36.580703 ], "pop" : 1526, "state" : "MO" } +{ "_id" : "65773", "city" : "SOUDER", "loc" : [ -92.58991, 36.782631 ], "pop" : 215, "state" : "MO" } +{ "_id" : "65774", "city" : "WEAUBLEAU", "loc" : [ -93.53435500000001, 37.880393 ], "pop" : 814, "state" : "MO" } +{ "_id" : "65775", "city" : "WEST PLAINS", "loc" : [ -91.871681, 36.728418 ], "pop" : 16362, "state" : "MO" } +{ "_id" : "65776", "city" : "SOUTH FORK", "loc" : [ -91.91248400000001, 36.629312 ], "pop" : 194, "state" : "MO" } +{ "_id" : "65777", "city" : "MOODY", "loc" : [ -91.989756, 36.533018 ], "pop" : 328, "state" : "MO" } +{ "_id" : "65778", "city" : "MYRTLE", "loc" : [ -91.270584, 36.521697 ], "pop" : 404, "state" : "MO" } +{ "_id" : "65779", "city" : "WHEATLAND", "loc" : [ -93.398129, 37.910283 ], "pop" : 1730, "state" : "MO" } +{ "_id" : "65781", "city" : "WILLARD", "loc" : [ -93.425861, 37.296153 ], "pop" : 3690, "state" : "MO" } +{ "_id" : "65783", "city" : "WINDYVILLE", "loc" : [ -92.93789099999999, 37.718209 ], "pop" : 769, "state" : "MO" } +{ "_id" : "65784", "city" : "ZANONI", "loc" : [ -92.304677, 36.692518 ], "pop" : 274, "state" : "MO" } +{ "_id" : "65785", "city" : "STOCKTON", "loc" : [ -93.796013, 37.72408 ], "pop" : 4635, "state" : "MO" } +{ "_id" : "65786", "city" : "MACKS CREEK", "loc" : [ -92.96034899999999, 37.961563 ], "pop" : 1741, "state" : "MO" } +{ "_id" : "65787", "city" : "ROACH", "loc" : [ -92.807456, 38.008825 ], "pop" : 1542, "state" : "MO" } +{ "_id" : "65788", "city" : "PEACE VALLEY", "loc" : [ -91.769598, 36.837974 ], "pop" : 1074, "state" : "MO" } +{ "_id" : "65789", "city" : "POMONA", "loc" : [ -91.913668, 36.84409 ], "pop" : 1309, "state" : "MO" } +{ "_id" : "65790", "city" : "POTTERSVILLE", "loc" : [ -92.044044, 36.706822 ], "pop" : 1227, "state" : "MO" } +{ "_id" : "65791", "city" : "THAYER", "loc" : [ -91.541803, 36.532714 ], "pop" : 3473, "state" : "MO" } +{ "_id" : "65793", "city" : "WILLOW SPRINGS", "loc" : [ -91.940545, 36.995812 ], "pop" : 5968, "state" : "MO" } +{ "_id" : "65802", "city" : "SPRINGFIELD", "loc" : [ -93.29903, 37.211663 ], "pop" : 33216, "state" : "MO" } +{ "_id" : "65803", "city" : "SPRINGFIELD", "loc" : [ -93.29123199999999, 37.259327 ], "pop" : 41361, "state" : "MO" } +{ "_id" : "65804", "city" : "SPRINGFIELD", "loc" : [ -93.252154, 37.165361 ], "pop" : 33507, "state" : "MO" } +{ "_id" : "65806", "city" : "SPRINGFIELD", "loc" : [ -93.29710799999999, 37.203057 ], "pop" : 11386, "state" : "MO" } +{ "_id" : "65807", "city" : "SPRINGFIELD", "loc" : [ -93.308457, 37.166799 ], "pop" : 46691, "state" : "MO" } +{ "_id" : "65809", "city" : "SPRINGFIELD", "loc" : [ -93.205742, 37.185223 ], "pop" : 5606, "state" : "MO" } +{ "_id" : "65810", "city" : "SPRINGFIELD", "loc" : [ -93.28959399999999, 37.113647 ], "pop" : 3982, "state" : "MO" } +{ "_id" : "66002", "city" : "ATCHISON", "loc" : [ -95.130408, 39.559411 ], "pop" : 13463, "state" : "KS" } +{ "_id" : "66006", "city" : "BALDWIN CITY", "loc" : [ -95.227621, 38.795308 ], "pop" : 6990, "state" : "KS" } +{ "_id" : "66007", "city" : "BASEHOR", "loc" : [ -94.95703399999999, 39.128137 ], "pop" : 5182, "state" : "KS" } +{ "_id" : "66008", "city" : "BENDENA", "loc" : [ -95.176458, 39.717379 ], "pop" : 334, "state" : "KS" } +{ "_id" : "66010", "city" : "BLUE MOUND", "loc" : [ -95.005269, 38.090772 ], "pop" : 484, "state" : "KS" } +{ "_id" : "66012", "city" : "LAKE OF THE FORE", "loc" : [ -94.886098, 39.068455 ], "pop" : 6315, "state" : "KS" } +{ "_id" : "66013", "city" : "BUCYRUS", "loc" : [ -94.742947, 38.687017 ], "pop" : 989, "state" : "KS" } +{ "_id" : "66014", "city" : "CENTERVILLE", "loc" : [ -94.993431, 38.213032 ], "pop" : 381, "state" : "KS" } +{ "_id" : "66015", "city" : "COLONY", "loc" : [ -95.328705, 38.076147 ], "pop" : 806, "state" : "KS" } +{ "_id" : "66016", "city" : "CUMMINGS", "loc" : [ -95.286281, 39.482976 ], "pop" : 647, "state" : "KS" } +{ "_id" : "66017", "city" : "DENTON", "loc" : [ -95.274377, 39.715358 ], "pop" : 378, "state" : "KS" } +{ "_id" : "66018", "city" : "DE SOTO", "loc" : [ -94.964713, 38.956563 ], "pop" : 4167, "state" : "KS" } +{ "_id" : "66020", "city" : "EASTON", "loc" : [ -95.05435199999999, 39.362054 ], "pop" : 2801, "state" : "KS" } +{ "_id" : "66021", "city" : "EDGERTON", "loc" : [ -95.009377, 38.781084 ], "pop" : 2101, "state" : "KS" } +{ "_id" : "66023", "city" : "EFFINGHAM", "loc" : [ -95.41982, 39.502259 ], "pop" : 1303, "state" : "KS" } +{ "_id" : "66025", "city" : "EUDORA", "loc" : [ -95.102206, 38.933043 ], "pop" : 4011, "state" : "KS" } +{ "_id" : "66026", "city" : "FONTANA", "loc" : [ -94.871788, 38.410153 ], "pop" : 774, "state" : "KS" } +{ "_id" : "66027", "city" : "FORT LEAVENWORTH", "loc" : [ -94.926547, 39.348508 ], "pop" : 12630, "state" : "KS" } +{ "_id" : "66030", "city" : "GARDNER", "loc" : [ -94.91567499999999, 38.80754 ], "pop" : 5356, "state" : "KS" } +{ "_id" : "66031", "city" : "INDUSTRIAL AIRPO", "loc" : [ -94.93226300000001, 38.850264 ], "pop" : 723, "state" : "KS" } +{ "_id" : "66032", "city" : "GARNETT", "loc" : [ -95.25936799999999, 38.285907 ], "pop" : 5081, "state" : "KS" } +{ "_id" : "66033", "city" : "GREELEY", "loc" : [ -95.11875999999999, 38.352428 ], "pop" : 671, "state" : "KS" } +{ "_id" : "66035", "city" : "HIGHLAND", "loc" : [ -95.258335, 39.860752 ], "pop" : 1369, "state" : "KS" } +{ "_id" : "66036", "city" : "HILLSDALE", "loc" : [ -94.85836999999999, 38.684463 ], "pop" : 1969, "state" : "KS" } +{ "_id" : "66039", "city" : "MILDRED", "loc" : [ -95.145167, 38.091497 ], "pop" : 441, "state" : "KS" } +{ "_id" : "66040", "city" : "LA CYGNE", "loc" : [ -94.759264, 38.343402 ], "pop" : 1958, "state" : "KS" } +{ "_id" : "66041", "city" : "HURON", "loc" : [ -95.308902, 39.591202 ], "pop" : 890, "state" : "KS" } +{ "_id" : "66042", "city" : "LANE", "loc" : [ -95.097886, 38.437499 ], "pop" : 582, "state" : "KS" } +{ "_id" : "66043", "city" : "LANSING", "loc" : [ -94.899379, 39.250191 ], "pop" : 8145, "state" : "KS" } +{ "_id" : "66044", "city" : "LAWRENCE", "loc" : [ -95.241789, 38.964402 ], "pop" : 29968, "state" : "KS" } +{ "_id" : "66046", "city" : "LAWRENCE", "loc" : [ -95.24203, 38.936925 ], "pop" : 16411, "state" : "KS" } +{ "_id" : "66047", "city" : "LAWRENCE", "loc" : [ -95.27786500000001, 38.940714 ], "pop" : 9234, "state" : "KS" } +{ "_id" : "66048", "city" : "LEAVENWORTH", "loc" : [ -94.933865, 39.301546 ], "pop" : 28028, "state" : "KS" } +{ "_id" : "66049", "city" : "LAWRENCE", "loc" : [ -95.27686199999999, 38.970433 ], "pop" : 12600, "state" : "KS" } +{ "_id" : "66050", "city" : "LECOMPTON", "loc" : [ -95.402519, 39.000125 ], "pop" : 2701, "state" : "KS" } +{ "_id" : "66052", "city" : "LINWOOD", "loc" : [ -94.991388, 39.020627 ], "pop" : 2036, "state" : "KS" } +{ "_id" : "66053", "city" : "LOUISBURG", "loc" : [ -94.68290500000001, 38.607341 ], "pop" : 4720, "state" : "KS" } +{ "_id" : "66054", "city" : "MC LOUTH", "loc" : [ -95.218295, 39.166763 ], "pop" : 2139, "state" : "KS" } +{ "_id" : "66056", "city" : "MOUND CITY", "loc" : [ -94.81863199999999, 38.155954 ], "pop" : 1644, "state" : "KS" } +{ "_id" : "66058", "city" : "MUSCOTAH", "loc" : [ -95.49845000000001, 39.588046 ], "pop" : 631, "state" : "KS" } +{ "_id" : "66060", "city" : "NORTONVILLE", "loc" : [ -95.32357, 39.409532 ], "pop" : 932, "state" : "KS" } +{ "_id" : "66061", "city" : "OLATHE", "loc" : [ -94.820359, 38.886548 ], "pop" : 31694, "state" : "KS" } +{ "_id" : "66062", "city" : "OLATHE", "loc" : [ -94.77516799999999, 38.873287 ], "pop" : 32845, "state" : "KS" } +{ "_id" : "66064", "city" : "OSAWATOMIE", "loc" : [ -94.96199, 38.488803 ], "pop" : 5887, "state" : "KS" } +{ "_id" : "66066", "city" : "OSKALOOSA", "loc" : [ -95.313546, 39.215183 ], "pop" : 1832, "state" : "KS" } +{ "_id" : "66067", "city" : "OTTAWA", "loc" : [ -95.274519, 38.614247 ], "pop" : 13830, "state" : "KS" } +{ "_id" : "66070", "city" : "OZAWKIE", "loc" : [ -95.44038999999999, 39.213648 ], "pop" : 2123, "state" : "KS" } +{ "_id" : "66071", "city" : "PAOLA", "loc" : [ -94.893694, 38.571999 ], "pop" : 9325, "state" : "KS" } +{ "_id" : "66072", "city" : "PARKER", "loc" : [ -94.98707400000001, 38.330311 ], "pop" : 830, "state" : "KS" } +{ "_id" : "66073", "city" : "PERRY", "loc" : [ -95.373122, 39.087524 ], "pop" : 2031, "state" : "KS" } +{ "_id" : "66075", "city" : "PLEASANTON", "loc" : [ -94.70567, 38.182285 ], "pop" : 2050, "state" : "KS" } +{ "_id" : "66076", "city" : "POMONA", "loc" : [ -95.448915, 38.615255 ], "pop" : 1680, "state" : "KS" } +{ "_id" : "66078", "city" : "PRINCETON", "loc" : [ -95.276444, 38.484684 ], "pop" : 650, "state" : "KS" } +{ "_id" : "66079", "city" : "RANTOUL", "loc" : [ -95.12342099999999, 38.566594 ], "pop" : 1195, "state" : "KS" } +{ "_id" : "66080", "city" : "RICHMOND", "loc" : [ -95.24887099999999, 38.407434 ], "pop" : 833, "state" : "KS" } +{ "_id" : "66083", "city" : "SPRING HILL", "loc" : [ -94.82459299999999, 38.763088 ], "pop" : 4024, "state" : "KS" } +{ "_id" : "66085", "city" : "STILWELL", "loc" : [ -94.664282, 38.790157 ], "pop" : 4836, "state" : "KS" } +{ "_id" : "66086", "city" : "TONGANOXIE", "loc" : [ -95.10505499999999, 39.102614 ], "pop" : 5556, "state" : "KS" } +{ "_id" : "66087", "city" : "SEVERANCE", "loc" : [ -95.066345, 39.778746 ], "pop" : 2422, "state" : "KS" } +{ "_id" : "66088", "city" : "VALLEY FALLS", "loc" : [ -95.46699599999999, 39.34843 ], "pop" : 2000, "state" : "KS" } +{ "_id" : "66090", "city" : "WATHENA", "loc" : [ -94.92546, 39.762505 ], "pop" : 2825, "state" : "KS" } +{ "_id" : "66091", "city" : "WELDA", "loc" : [ -95.309606, 38.168615 ], "pop" : 286, "state" : "KS" } +{ "_id" : "66092", "city" : "WELLSVILLE", "loc" : [ -95.091573, 38.713676 ], "pop" : 2178, "state" : "KS" } +{ "_id" : "66093", "city" : "WESTPHALIA", "loc" : [ -95.46651199999999, 38.171792 ], "pop" : 518, "state" : "KS" } +{ "_id" : "66094", "city" : "WHITE CLOUD", "loc" : [ -95.298203, 39.962717 ], "pop" : 379, "state" : "KS" } +{ "_id" : "66095", "city" : "WILLIAMSBURG", "loc" : [ -95.42261499999999, 38.490166 ], "pop" : 929, "state" : "KS" } +{ "_id" : "66097", "city" : "WINCHESTER", "loc" : [ -95.26958399999999, 39.324531 ], "pop" : 1191, "state" : "KS" } +{ "_id" : "66101", "city" : "KANSAS CITY", "loc" : [ -94.627139, 39.115733 ], "pop" : 16147, "state" : "KS" } +{ "_id" : "66102", "city" : "KANSAS CITY", "loc" : [ -94.669337, 39.113247 ], "pop" : 27909, "state" : "KS" } +{ "_id" : "66103", "city" : "ROSEDALE", "loc" : [ -94.625105, 39.056193 ], "pop" : 14477, "state" : "KS" } +{ "_id" : "66104", "city" : "KANSAS CITY", "loc" : [ -94.679158, 39.137512 ], "pop" : 32071, "state" : "KS" } +{ "_id" : "66105", "city" : "KANSAS CITY", "loc" : [ -94.63564599999999, 39.085025 ], "pop" : 3478, "state" : "KS" } +{ "_id" : "66106", "city" : "LAKE QUIVIRA", "loc" : [ -94.68739600000001, 39.061187 ], "pop" : 25298, "state" : "KS" } +{ "_id" : "66109", "city" : "KANSAS CITY", "loc" : [ -94.78559799999999, 39.143376 ], "pop" : 14656, "state" : "KS" } +{ "_id" : "66111", "city" : "KANSAS CITY", "loc" : [ -94.780593, 39.080332 ], "pop" : 11189, "state" : "KS" } +{ "_id" : "66112", "city" : "KANSAS CITY", "loc" : [ -94.76402400000001, 39.115999 ], "pop" : 11461, "state" : "KS" } +{ "_id" : "66115", "city" : "KANSAS CITY", "loc" : [ -94.61464700000001, 39.114534 ], "pop" : 0, "state" : "KS" } +{ "_id" : "66118", "city" : "KANSAS CITY", "loc" : [ -94.608361, 39.096867 ], "pop" : 0, "state" : "KS" } +{ "_id" : "66202", "city" : "COUNTRYSIDE", "loc" : [ -94.66699800000001, 39.025376 ], "pop" : 17916, "state" : "KS" } +{ "_id" : "66203", "city" : "SHAWNEE", "loc" : [ -94.708303, 39.019802 ], "pop" : 20922, "state" : "KS" } +{ "_id" : "66204", "city" : "OVERLAND PARK", "loc" : [ -94.674769, 38.992488 ], "pop" : 18226, "state" : "KS" } +{ "_id" : "66205", "city" : "MISSION", "loc" : [ -94.631806, 39.031944 ], "pop" : 14871, "state" : "KS" } +{ "_id" : "66206", "city" : "LEAWOOD", "loc" : [ -94.61964399999999, 38.960567 ], "pop" : 9797, "state" : "KS" } +{ "_id" : "66207", "city" : "SHAWNEE MISSION", "loc" : [ -94.64519300000001, 38.957472 ], "pop" : 13863, "state" : "KS" } +{ "_id" : "66208", "city" : "PRAIRIE VILLAGE", "loc" : [ -94.631513, 38.996812 ], "pop" : 22047, "state" : "KS" } +{ "_id" : "66209", "city" : "LEAWOOD", "loc" : [ -94.634047, 38.901798 ], "pop" : 12176, "state" : "KS" } +{ "_id" : "66210", "city" : "LENEXA", "loc" : [ -94.70478799999999, 38.922007 ], "pop" : 17576, "state" : "KS" } +{ "_id" : "66211", "city" : "LEAWOOD", "loc" : [ -94.637991, 38.925956 ], "pop" : 2155, "state" : "KS" } +{ "_id" : "66212", "city" : "OVERLAND PARK", "loc" : [ -94.68414, 38.958954 ], "pop" : 36187, "state" : "KS" } +{ "_id" : "66213", "city" : "OVERLAND PARK", "loc" : [ -94.700344, 38.904899 ], "pop" : 7368, "state" : "KS" } +{ "_id" : "66214", "city" : "LENEXA", "loc" : [ -94.71326500000001, 38.959929 ], "pop" : 12365, "state" : "KS" } +{ "_id" : "66215", "city" : "LENEXA", "loc" : [ -94.739947, 38.963028 ], "pop" : 24051, "state" : "KS" } +{ "_id" : "66216", "city" : "SHAWNEE", "loc" : [ -94.73823400000001, 39.009289 ], "pop" : 19644, "state" : "KS" } +{ "_id" : "66217", "city" : "SHAWNEE", "loc" : [ -94.779663, 39.004835 ], "pop" : 2261, "state" : "KS" } +{ "_id" : "66218", "city" : "SHAWNEE", "loc" : [ -94.823913, 39.017431 ], "pop" : 1828, "state" : "KS" } +{ "_id" : "66219", "city" : "LENEXA", "loc" : [ -94.773145, 38.961896 ], "pop" : 6090, "state" : "KS" } +{ "_id" : "66220", "city" : "LENEXA", "loc" : [ -94.82999700000001, 38.96884 ], "pop" : 626, "state" : "KS" } +{ "_id" : "66221", "city" : "STANLEY", "loc" : [ -94.706745, 38.85272 ], "pop" : 1186, "state" : "KS" } +{ "_id" : "66223", "city" : "STANLEY", "loc" : [ -94.664467, 38.848477 ], "pop" : 3539, "state" : "KS" } +{ "_id" : "66224", "city" : "STANLEY", "loc" : [ -94.62890299999999, 38.867526 ], "pop" : 713, "state" : "KS" } +{ "_id" : "66226", "city" : "SHAWNEE", "loc" : [ -94.873017, 38.997764 ], "pop" : 2613, "state" : "KS" } +{ "_id" : "66227", "city" : "LENEXA", "loc" : [ -94.840082, 38.99416 ], "pop" : 273, "state" : "KS" } +{ "_id" : "66401", "city" : "ALMA", "loc" : [ -96.292323, 39.009206 ], "pop" : 2186, "state" : "KS" } +{ "_id" : "66402", "city" : "AUBURN", "loc" : [ -95.81993799999999, 38.916673 ], "pop" : 2157, "state" : "KS" } +{ "_id" : "66403", "city" : "AXTELL", "loc" : [ -96.26755900000001, 39.870676 ], "pop" : 669, "state" : "KS" } +{ "_id" : "66404", "city" : "BAILEYVILLE", "loc" : [ -96.180136, 39.881621 ], "pop" : 613, "state" : "KS" } +{ "_id" : "66406", "city" : "BEATTIE", "loc" : [ -96.428618, 39.89884 ], "pop" : 739, "state" : "KS" } +{ "_id" : "66407", "city" : "BELVUE", "loc" : [ -96.186635, 39.2273 ], "pop" : 321, "state" : "KS" } +{ "_id" : "66408", "city" : "BERN", "loc" : [ -95.961028, 39.957051 ], "pop" : 457, "state" : "KS" } +{ "_id" : "66409", "city" : "BERRYTON", "loc" : [ -95.582487, 38.944182 ], "pop" : 1939, "state" : "KS" } +{ "_id" : "66411", "city" : "BLUE RAPIDS", "loc" : [ -96.63594999999999, 39.674974 ], "pop" : 1552, "state" : "KS" } +{ "_id" : "66412", "city" : "BREMEN", "loc" : [ -96.745846, 39.877473 ], "pop" : 347, "state" : "KS" } +{ "_id" : "66413", "city" : "BURLINGAME", "loc" : [ -95.840017, 38.763395 ], "pop" : 1994, "state" : "KS" } +{ "_id" : "66414", "city" : "CARBONDALE", "loc" : [ -95.687083, 38.820622 ], "pop" : 2502, "state" : "KS" } +{ "_id" : "66415", "city" : "CENTRALIA", "loc" : [ -96.14860400000001, 39.738051 ], "pop" : 782, "state" : "KS" } +{ "_id" : "66416", "city" : "CIRCLEVILLE", "loc" : [ -95.851708, 39.515472 ], "pop" : 466, "state" : "KS" } +{ "_id" : "66417", "city" : "CORNING", "loc" : [ -96.077589, 39.657015 ], "pop" : 656, "state" : "KS" } +{ "_id" : "66418", "city" : "DELIA", "loc" : [ -95.96080499999999, 39.265453 ], "pop" : 557, "state" : "KS" } +{ "_id" : "66419", "city" : "DENISON", "loc" : [ -95.632851, 39.415307 ], "pop" : 604, "state" : "KS" } +{ "_id" : "66420", "city" : "DOVER", "loc" : [ -95.89854699999999, 39.019223 ], "pop" : 1220, "state" : "KS" } +{ "_id" : "66422", "city" : "EMMETT", "loc" : [ -96.059325, 39.304819 ], "pop" : 342, "state" : "KS" } +{ "_id" : "66423", "city" : "ESKRIDGE", "loc" : [ -96.10158300000001, 38.851361 ], "pop" : 771, "state" : "KS" } +{ "_id" : "66424", "city" : "EVEREST", "loc" : [ -95.413802, 39.687972 ], "pop" : 525, "state" : "KS" } +{ "_id" : "66425", "city" : "FAIRVIEW", "loc" : [ -95.711012, 39.844504 ], "pop" : 712, "state" : "KS" } +{ "_id" : "66427", "city" : "WINIFRED", "loc" : [ -96.42832300000001, 39.718996 ], "pop" : 1418, "state" : "KS" } +{ "_id" : "66428", "city" : "GOFF", "loc" : [ -95.95739399999999, 39.665388 ], "pop" : 537, "state" : "KS" } +{ "_id" : "66429", "city" : "GRANTVILLE", "loc" : [ -95.539733, 39.097208 ], "pop" : 753, "state" : "KS" } +{ "_id" : "66431", "city" : "HARVEYVILLE", "loc" : [ -95.996239, 38.857413 ], "pop" : 1065, "state" : "KS" } +{ "_id" : "66432", "city" : "HAVENSVILLE", "loc" : [ -96.07688400000001, 39.494197 ], "pop" : 417, "state" : "KS" } +{ "_id" : "66433", "city" : "HERKIMER", "loc" : [ -96.746861, 39.956337 ], "pop" : 270, "state" : "KS" } +{ "_id" : "66434", "city" : "RESERVE", "loc" : [ -95.52890499999999, 39.871563 ], "pop" : 5297, "state" : "KS" } +{ "_id" : "66436", "city" : "HOLTON", "loc" : [ -95.752498, 39.443624 ], "pop" : 5625, "state" : "KS" } +{ "_id" : "66438", "city" : "HOME", "loc" : [ -96.529201, 39.854542 ], "pop" : 362, "state" : "KS" } +{ "_id" : "66439", "city" : "HORTON", "loc" : [ -95.529858, 39.678883 ], "pop" : 2556, "state" : "KS" } +{ "_id" : "66440", "city" : "HOYT", "loc" : [ -95.686742, 39.255249 ], "pop" : 1812, "state" : "KS" } +{ "_id" : "66441", "city" : "JUNCTION CITY", "loc" : [ -96.839553, 39.029913 ], "pop" : 24386, "state" : "KS" } +{ "_id" : "66442", "city" : "FORT RILEY", "loc" : [ -96.78733800000001, 39.061947 ], "pop" : 5363, "state" : "KS" } +{ "_id" : "66449", "city" : "LEONARDVILLE", "loc" : [ -96.83122299999999, 39.365151 ], "pop" : 1274, "state" : "KS" } +{ "_id" : "66450", "city" : "LOUISVILLE", "loc" : [ -96.316954, 39.267048 ], "pop" : 318, "state" : "KS" } +{ "_id" : "66451", "city" : "LYNDON", "loc" : [ -95.680226, 38.635649 ], "pop" : 1879, "state" : "KS" } +{ "_id" : "66502", "city" : "MANHATTAN", "loc" : [ -96.585776, 39.193757 ], "pop" : 50178, "state" : "KS" } +{ "_id" : "66507", "city" : "MAPLE HILL", "loc" : [ -96.018727, 39.069456 ], "pop" : 796, "state" : "KS" } +{ "_id" : "66508", "city" : "MARYSVILLE", "loc" : [ -96.642183, 39.842827 ], "pop" : 4104, "state" : "KS" } +{ "_id" : "66509", "city" : "MAYETTA", "loc" : [ -95.692753, 39.348915 ], "pop" : 1132, "state" : "KS" } +{ "_id" : "66510", "city" : "MELVERN", "loc" : [ -95.628986, 38.50266 ], "pop" : 856, "state" : "KS" } +{ "_id" : "66512", "city" : "MERIDEN", "loc" : [ -95.54763699999999, 39.203832 ], "pop" : 2299, "state" : "KS" } +{ "_id" : "66514", "city" : "MILFORD", "loc" : [ -96.91005, 39.169173 ], "pop" : 704, "state" : "KS" } +{ "_id" : "66515", "city" : "MORRILL", "loc" : [ -95.712048, 39.935592 ], "pop" : 591, "state" : "KS" } +{ "_id" : "66516", "city" : "NETAWAKA", "loc" : [ -95.72700399999999, 39.606298 ], "pop" : 371, "state" : "KS" } +{ "_id" : "66517", "city" : "OGDEN", "loc" : [ -96.70007699999999, 39.119219 ], "pop" : 2049, "state" : "KS" } +{ "_id" : "66518", "city" : "OKETO", "loc" : [ -96.623525, 39.95984 ], "pop" : 318, "state" : "KS" } +{ "_id" : "66520", "city" : "OLSBURG", "loc" : [ -96.60024900000001, 39.412506 ], "pop" : 581, "state" : "KS" } +{ "_id" : "66521", "city" : "DULUTH", "loc" : [ -96.17610500000001, 39.472974 ], "pop" : 1358, "state" : "KS" } +{ "_id" : "66522", "city" : "ONEIDA", "loc" : [ -95.958097, 39.866087 ], "pop" : 247, "state" : "KS" } +{ "_id" : "66523", "city" : "OSAGE CITY", "loc" : [ -95.830303, 38.626896 ], "pop" : 3627, "state" : "KS" } +{ "_id" : "66524", "city" : "OVERBROOK", "loc" : [ -95.561632, 38.792173 ], "pop" : 1630, "state" : "KS" } +{ "_id" : "66526", "city" : "PAXICO", "loc" : [ -96.181777, 39.080285 ], "pop" : 1153, "state" : "KS" } +{ "_id" : "66527", "city" : "POWHATTAN", "loc" : [ -95.675111, 39.71769 ], "pop" : 913, "state" : "KS" } +{ "_id" : "66528", "city" : "QUENEMO", "loc" : [ -95.53619, 38.578504 ], "pop" : 500, "state" : "KS" } +{ "_id" : "66531", "city" : "RILEY", "loc" : [ -96.811824, 39.122421 ], "pop" : 14793, "state" : "KS" } +{ "_id" : "66532", "city" : "LEONA", "loc" : [ -95.386236, 39.812721 ], "pop" : 671, "state" : "KS" } +{ "_id" : "66533", "city" : "ROSSVILLE", "loc" : [ -95.95529999999999, 39.145114 ], "pop" : 1583, "state" : "KS" } +{ "_id" : "66534", "city" : "SABETHA", "loc" : [ -95.811271, 39.89929 ], "pop" : 3242, "state" : "KS" } +{ "_id" : "66535", "city" : "SAINT GEORGE", "loc" : [ -96.434488, 39.210806 ], "pop" : 1904, "state" : "KS" } +{ "_id" : "66536", "city" : "SAINT MARYS", "loc" : [ -96.06827699999999, 39.198674 ], "pop" : 2316, "state" : "KS" } +{ "_id" : "66537", "city" : "SCRANTON", "loc" : [ -95.74799, 38.787998 ], "pop" : 1158, "state" : "KS" } +{ "_id" : "66538", "city" : "KELLY", "loc" : [ -96.059489, 39.839804 ], "pop" : 3336, "state" : "KS" } +{ "_id" : "66539", "city" : "SILVER LAKE", "loc" : [ -95.855182, 39.1102 ], "pop" : 2152, "state" : "KS" } +{ "_id" : "66540", "city" : "SOLDIER", "loc" : [ -95.96517799999999, 39.501254 ], "pop" : 578, "state" : "KS" } +{ "_id" : "66541", "city" : "SUMMERFIELD", "loc" : [ -96.32790900000001, 39.979847 ], "pop" : 271, "state" : "KS" } +{ "_id" : "66542", "city" : "TECUMSEH", "loc" : [ -95.537926, 39.021664 ], "pop" : 1059, "state" : "KS" } +{ "_id" : "66543", "city" : "VASSAR", "loc" : [ -95.581278, 38.669127 ], "pop" : 849, "state" : "KS" } +{ "_id" : "66544", "city" : "VLIETS", "loc" : [ -96.28164200000001, 39.705044 ], "pop" : 469, "state" : "KS" } +{ "_id" : "66546", "city" : "WAKARUSA", "loc" : [ -95.701464, 38.904543 ], "pop" : 855, "state" : "KS" } +{ "_id" : "66547", "city" : "WAMEGO", "loc" : [ -96.315344, 39.210001 ], "pop" : 5200, "state" : "KS" } +{ "_id" : "66548", "city" : "WATERVILLE", "loc" : [ -96.749781, 39.697088 ], "pop" : 1116, "state" : "KS" } +{ "_id" : "66549", "city" : "BLAINE", "loc" : [ -96.411402, 39.416545 ], "pop" : 1373, "state" : "KS" } +{ "_id" : "66550", "city" : "WETMORE", "loc" : [ -95.82311799999999, 39.642761 ], "pop" : 546, "state" : "KS" } +{ "_id" : "66551", "city" : "ONAGA", "loc" : [ -96.314753, 39.510969 ], "pop" : 238, "state" : "KS" } +{ "_id" : "66552", "city" : "WHITING", "loc" : [ -95.61584000000001, 39.597396 ], "pop" : 380, "state" : "KS" } +{ "_id" : "66554", "city" : "RANDOLPH", "loc" : [ -96.782842, 39.487939 ], "pop" : 608, "state" : "KS" } +{ "_id" : "66603", "city" : "TOPEKA", "loc" : [ -95.680212, 39.055344 ], "pop" : 2250, "state" : "KS" } +{ "_id" : "66604", "city" : "TOPEKA", "loc" : [ -95.717831, 39.040549 ], "pop" : 23913, "state" : "KS" } +{ "_id" : "66605", "city" : "TOPEKA", "loc" : [ -95.643894, 39.015076 ], "pop" : 20138, "state" : "KS" } +{ "_id" : "66606", "city" : "TOPEKA", "loc" : [ -95.709458, 39.058345 ], "pop" : 13053, "state" : "KS" } +{ "_id" : "66607", "city" : "TOPEKA", "loc" : [ -95.644858, 39.042111 ], "pop" : 9850, "state" : "KS" } +{ "_id" : "66608", "city" : "TOPEKA", "loc" : [ -95.686651, 39.085812 ], "pop" : 7739, "state" : "KS" } +{ "_id" : "66609", "city" : "TOPEKA", "loc" : [ -95.668069, 38.991899 ], "pop" : 6252, "state" : "KS" } +{ "_id" : "66610", "city" : "TOPEKA", "loc" : [ -95.746061, 38.982213 ], "pop" : 4656, "state" : "KS" } +{ "_id" : "66611", "city" : "TOPEKA", "loc" : [ -95.69815, 39.014152 ], "pop" : 10194, "state" : "KS" } +{ "_id" : "66612", "city" : "TOPEKA", "loc" : [ -95.68180599999999, 39.042714 ], "pop" : 2949, "state" : "KS" } +{ "_id" : "66614", "city" : "TOPEKA", "loc" : [ -95.746883, 39.015403 ], "pop" : 26238, "state" : "KS" } +{ "_id" : "66615", "city" : "TOPEKA", "loc" : [ -95.790561, 39.04458 ], "pop" : 677, "state" : "KS" } +{ "_id" : "66616", "city" : "TOPEKA", "loc" : [ -95.641302, 39.064479 ], "pop" : 6538, "state" : "KS" } +{ "_id" : "66617", "city" : "TOPEKA", "loc" : [ -95.63838800000001, 39.127098 ], "pop" : 7779, "state" : "KS" } +{ "_id" : "66618", "city" : "TOPEKA", "loc" : [ -95.70231, 39.132853 ], "pop" : 5436, "state" : "KS" } +{ "_id" : "66619", "city" : "PAULINE", "loc" : [ -95.700728, 38.942859 ], "pop" : 2952, "state" : "KS" } +{ "_id" : "66701", "city" : "HIATTVILLE", "loc" : [ -94.704221, 37.834159 ], "pop" : 11192, "state" : "KS" } +{ "_id" : "66710", "city" : "ALTOONA", "loc" : [ -95.64833, 37.519669 ], "pop" : 905, "state" : "KS" } +{ "_id" : "66711", "city" : "ARCADIA", "loc" : [ -94.654782, 37.634113 ], "pop" : 664, "state" : "KS" } +{ "_id" : "66713", "city" : "BAXTER SPRINGS", "loc" : [ -94.739276, 37.028057 ], "pop" : 5434, "state" : "KS" } +{ "_id" : "66714", "city" : "BENEDICT", "loc" : [ -95.624213, 37.651401 ], "pop" : 815, "state" : "KS" } +{ "_id" : "66716", "city" : "BRONSON", "loc" : [ -95.030345, 37.921356 ], "pop" : 702, "state" : "KS" } +{ "_id" : "66717", "city" : "BUFFALO", "loc" : [ -95.70141700000001, 37.701057 ], "pop" : 455, "state" : "KS" } +{ "_id" : "66720", "city" : "CHANUTE", "loc" : [ -95.456962, 37.674928 ], "pop" : 10852, "state" : "KS" } +{ "_id" : "66724", "city" : "CHEROKEE", "loc" : [ -94.842412, 37.369413 ], "pop" : 1397, "state" : "KS" } +{ "_id" : "66725", "city" : "HALLOWELL", "loc" : [ -94.850227, 37.168992 ], "pop" : 4750, "state" : "KS" } +{ "_id" : "66727", "city" : "COYVILLE", "loc" : [ -95.917164, 37.659167 ], "pop" : 331, "state" : "KS" } +{ "_id" : "66728", "city" : "CRESTLINE", "loc" : [ -94.678275, 37.161226 ], "pop" : 478, "state" : "KS" } +{ "_id" : "66732", "city" : "ELSMORE", "loc" : [ -95.154645, 37.80353 ], "pop" : 293, "state" : "KS" } +{ "_id" : "66733", "city" : "ERIE", "loc" : [ -95.25138, 37.604395 ], "pop" : 2572, "state" : "KS" } +{ "_id" : "66734", "city" : "FARLINGTON", "loc" : [ -94.847928, 37.6163 ], "pop" : 519, "state" : "KS" } +{ "_id" : "66736", "city" : "LAFONTAINE", "loc" : [ -95.822898, 37.525622 ], "pop" : 3747, "state" : "KS" } +{ "_id" : "66738", "city" : "FULTON", "loc" : [ -94.739591, 37.988279 ], "pop" : 404, "state" : "KS" } +{ "_id" : "66739", "city" : "GALENA", "loc" : [ -94.655743, 37.063237 ], "pop" : 5961, "state" : "KS" } +{ "_id" : "66740", "city" : "GALESBURG", "loc" : [ -95.310772, 37.469346 ], "pop" : 932, "state" : "KS" } +{ "_id" : "66741", "city" : "GARLAND", "loc" : [ -94.672055, 37.717363 ], "pop" : 377, "state" : "KS" } +{ "_id" : "66743", "city" : "GIRARD", "loc" : [ -94.85691300000001, 37.509129 ], "pop" : 3707, "state" : "KS" } +{ "_id" : "66746", "city" : "HEPLER", "loc" : [ -94.989225, 37.657558 ], "pop" : 229, "state" : "KS" } +{ "_id" : "66748", "city" : "HUMBOLDT", "loc" : [ -95.422006, 37.80446 ], "pop" : 3247, "state" : "KS" } +{ "_id" : "66749", "city" : "CARLYLE", "loc" : [ -95.402146, 37.928244 ], "pop" : 7721, "state" : "KS" } +{ "_id" : "66751", "city" : "LA HARPE", "loc" : [ -95.32319200000001, 37.92239 ], "pop" : 1966, "state" : "KS" } +{ "_id" : "66753", "city" : "MC CUNE", "loc" : [ -95.03759100000001, 37.346754 ], "pop" : 1252, "state" : "KS" } +{ "_id" : "66754", "city" : "MAPLETON", "loc" : [ -94.873519, 38.022821 ], "pop" : 351, "state" : "KS" } +{ "_id" : "66755", "city" : "MORAN", "loc" : [ -95.164733, 37.934159 ], "pop" : 1214, "state" : "KS" } +{ "_id" : "66756", "city" : "MULBERRY", "loc" : [ -94.683902, 37.544197 ], "pop" : 3096, "state" : "KS" } +{ "_id" : "66757", "city" : "NEODESHA", "loc" : [ -95.676478, 37.425709 ], "pop" : 3664, "state" : "KS" } +{ "_id" : "66758", "city" : "NEOSHO FALLS", "loc" : [ -95.54973200000001, 37.966883 ], "pop" : 392, "state" : "KS" } +{ "_id" : "66759", "city" : "NEW ALBANY", "loc" : [ -95.912594, 37.544436 ], "pop" : 372, "state" : "KS" } +{ "_id" : "66761", "city" : "PIQUA", "loc" : [ -95.59002599999999, 37.872847 ], "pop" : 206, "state" : "KS" } +{ "_id" : "66762", "city" : "RADLEY", "loc" : [ -94.70225000000001, 37.413156 ], "pop" : 24845, "state" : "KS" } +{ "_id" : "66767", "city" : "PRESCOTT", "loc" : [ -94.700841, 38.071802 ], "pop" : 600, "state" : "KS" } +{ "_id" : "66769", "city" : "REDFIELD", "loc" : [ -94.828988, 37.856046 ], "pop" : 1224, "state" : "KS" } +{ "_id" : "66770", "city" : "RIVERTON", "loc" : [ -94.67880100000001, 37.099262 ], "pop" : 564, "state" : "KS" } +{ "_id" : "66771", "city" : "SAINT PAUL", "loc" : [ -95.168784, 37.518046 ], "pop" : 936, "state" : "KS" } +{ "_id" : "66772", "city" : "SAVONBURG", "loc" : [ -95.154532, 37.751725 ], "pop" : 197, "state" : "KS" } +{ "_id" : "66773", "city" : "CARONA", "loc" : [ -94.851961, 37.271102 ], "pop" : 1552, "state" : "KS" } +{ "_id" : "66775", "city" : "STARK", "loc" : [ -95.138794, 37.681111 ], "pop" : 246, "state" : "KS" } +{ "_id" : "66776", "city" : "THAYER", "loc" : [ -95.467083, 37.452657 ], "pop" : 1349, "state" : "KS" } +{ "_id" : "66777", "city" : "TORONTO", "loc" : [ -95.936818, 37.795343 ], "pop" : 659, "state" : "KS" } +{ "_id" : "66778", "city" : "TREECE", "loc" : [ -94.86904699999999, 37.039883 ], "pop" : 528, "state" : "KS" } +{ "_id" : "66779", "city" : "UNIONTOWN", "loc" : [ -94.98136599999999, 37.811681 ], "pop" : 825, "state" : "KS" } +{ "_id" : "66780", "city" : "WALNUT", "loc" : [ -95.045531, 37.59674 ], "pop" : 383, "state" : "KS" } +{ "_id" : "66781", "city" : "LAWTON", "loc" : [ -94.743909, 37.298173 ], "pop" : 1515, "state" : "KS" } +{ "_id" : "66783", "city" : "YATES CENTER", "loc" : [ -95.72893999999999, 37.880125 ], "pop" : 2859, "state" : "KS" } +{ "_id" : "66801", "city" : "EMPORIA", "loc" : [ -96.187145, 38.418405 ], "pop" : 29401, "state" : "KS" } +{ "_id" : "66830", "city" : "ADMIRE", "loc" : [ -96.101657, 38.639297 ], "pop" : 172, "state" : "KS" } +{ "_id" : "66833", "city" : "BUSHONG", "loc" : [ -96.249968, 38.637522 ], "pop" : 88, "state" : "KS" } +{ "_id" : "66834", "city" : "ALTA VISTA", "loc" : [ -96.479983, 38.86357 ], "pop" : 629, "state" : "KS" } +{ "_id" : "66835", "city" : "AMERICUS", "loc" : [ -96.26075299999999, 38.509803 ], "pop" : 1491, "state" : "KS" } +{ "_id" : "66838", "city" : "BURDICK", "loc" : [ -96.83963, 38.567369 ], "pop" : 230, "state" : "KS" } +{ "_id" : "66839", "city" : "STRAWN", "loc" : [ -95.741162, 38.201596 ], "pop" : 4404, "state" : "KS" } +{ "_id" : "66840", "city" : "BURNS", "loc" : [ -96.863435, 38.12216 ], "pop" : 593, "state" : "KS" } +{ "_id" : "66842", "city" : "CASSODAY", "loc" : [ -96.674565, 38.029801 ], "pop" : 351, "state" : "KS" } +{ "_id" : "66843", "city" : "CLEMENTS", "loc" : [ -96.77544399999999, 38.279757 ], "pop" : 200, "state" : "KS" } +{ "_id" : "66845", "city" : "COTTONWOOD FALLS", "loc" : [ -96.541849, 38.356538 ], "pop" : 1183, "state" : "KS" } +{ "_id" : "66846", "city" : "DUNLAP", "loc" : [ -96.497294, 38.667657 ], "pop" : 3831, "state" : "KS" } +{ "_id" : "66849", "city" : "DWIGHT", "loc" : [ -96.580215, 38.838902 ], "pop" : 569, "state" : "KS" } +{ "_id" : "66850", "city" : "ELMDALE", "loc" : [ -96.667464, 38.377924 ], "pop" : 168, "state" : "KS" } +{ "_id" : "66851", "city" : "FLORENCE", "loc" : [ -96.934561, 38.241536 ], "pop" : 828, "state" : "KS" } +{ "_id" : "66852", "city" : "GRIDLEY", "loc" : [ -95.887351, 38.101234 ], "pop" : 638, "state" : "KS" } +{ "_id" : "66853", "city" : "HAMILTON", "loc" : [ -96.169133, 37.979122 ], "pop" : 600, "state" : "KS" } +{ "_id" : "66854", "city" : "HARTFORD", "loc" : [ -95.999718, 38.28326 ], "pop" : 1006, "state" : "KS" } +{ "_id" : "66856", "city" : "LEBO", "loc" : [ -95.822174, 38.416085 ], "pop" : 1708, "state" : "KS" } +{ "_id" : "66857", "city" : "LE ROY", "loc" : [ -95.62265499999999, 38.087429 ], "pop" : 795, "state" : "KS" } +{ "_id" : "66858", "city" : "ANTELOPE", "loc" : [ -96.96123, 38.481037 ], "pop" : 562, "state" : "KS" } +{ "_id" : "66859", "city" : "LOST SPRINGS", "loc" : [ -96.979872, 38.565723 ], "pop" : 241, "state" : "KS" } +{ "_id" : "66860", "city" : "MADISON", "loc" : [ -96.12128300000001, 38.127755 ], "pop" : 1430, "state" : "KS" } +{ "_id" : "66861", "city" : "MARION", "loc" : [ -97.02045, 38.355444 ], "pop" : 3196, "state" : "KS" } +{ "_id" : "66862", "city" : "MATFIELD GREEN", "loc" : [ -96.55410500000001, 38.144768 ], "pop" : 143, "state" : "KS" } +{ "_id" : "66864", "city" : "NEOSHO RAPIDS", "loc" : [ -96.016824, 38.394762 ], "pop" : 865, "state" : "KS" } +{ "_id" : "66865", "city" : "OLPE", "loc" : [ -96.18905599999999, 38.257774 ], "pop" : 1156, "state" : "KS" } +{ "_id" : "66866", "city" : "PEABODY", "loc" : [ -97.118386, 38.173746 ], "pop" : 1927, "state" : "KS" } +{ "_id" : "66868", "city" : "READING", "loc" : [ -95.98949, 38.529012 ], "pop" : 553, "state" : "KS" } +{ "_id" : "66869", "city" : "STRONG CITY", "loc" : [ -96.51719199999999, 38.41292 ], "pop" : 1149, "state" : "KS" } +{ "_id" : "66870", "city" : "VIRGIL", "loc" : [ -96.03293499999999, 37.897594 ], "pop" : 381, "state" : "KS" } +{ "_id" : "66871", "city" : "WAVERLY", "loc" : [ -95.598201, 38.378214 ], "pop" : 1112, "state" : "KS" } +{ "_id" : "66872", "city" : "WHITE CITY", "loc" : [ -96.763677, 38.78902 ], "pop" : 983, "state" : "KS" } +{ "_id" : "66873", "city" : "WILSEY", "loc" : [ -96.670407, 38.633449 ], "pop" : 325, "state" : "KS" } +{ "_id" : "66901", "city" : "RICE", "loc" : [ -97.662735, 39.559427 ], "pop" : 7733, "state" : "KS" } +{ "_id" : "66930", "city" : "AGENDA", "loc" : [ -97.42698300000001, 39.702868 ], "pop" : 198, "state" : "KS" } +{ "_id" : "66931", "city" : "AMES", "loc" : [ -97.538245, 39.533923 ], "pop" : 161, "state" : "KS" } +{ "_id" : "66932", "city" : "ATHOL", "loc" : [ -98.90773299999999, 39.771872 ], "pop" : 164, "state" : "KS" } +{ "_id" : "66933", "city" : "BARNES", "loc" : [ -96.867574, 39.684114 ], "pop" : 374, "state" : "KS" } +{ "_id" : "66935", "city" : "BELLEVILLE", "loc" : [ -97.62901599999999, 39.824054 ], "pop" : 3863, "state" : "KS" } +{ "_id" : "66936", "city" : "BURR OAK", "loc" : [ -98.34991100000001, 39.893177 ], "pop" : 583, "state" : "KS" } +{ "_id" : "66937", "city" : "CLIFTON", "loc" : [ -97.261104, 39.620121 ], "pop" : 853, "state" : "KS" } +{ "_id" : "66938", "city" : "CLYDE", "loc" : [ -97.407999, 39.575842 ], "pop" : 1164, "state" : "KS" } +{ "_id" : "66939", "city" : "COURTLAND", "loc" : [ -97.889956, 39.78509 ], "pop" : 487, "state" : "KS" } +{ "_id" : "66940", "city" : "CUBA", "loc" : [ -97.449623, 39.797482 ], "pop" : 342, "state" : "KS" } +{ "_id" : "66941", "city" : "ESBON", "loc" : [ -98.44622200000001, 39.756186 ], "pop" : 342, "state" : "KS" } +{ "_id" : "66942", "city" : "FORMOSO", "loc" : [ -97.98890900000001, 39.779467 ], "pop" : 223, "state" : "KS" } +{ "_id" : "66943", "city" : "GREENLEAF", "loc" : [ -96.977465, 39.706145 ], "pop" : 564, "state" : "KS" } +{ "_id" : "66944", "city" : "HADDAM", "loc" : [ -97.308142, 39.851969 ], "pop" : 333, "state" : "KS" } +{ "_id" : "66945", "city" : "HANOVER", "loc" : [ -96.86894700000001, 39.89266 ], "pop" : 1278, "state" : "KS" } +{ "_id" : "66946", "city" : "HOLLENBERG", "loc" : [ -96.97350900000001, 39.959987 ], "pop" : 146, "state" : "KS" } +{ "_id" : "66948", "city" : "JAMESTOWN", "loc" : [ -97.86308200000001, 39.602144 ], "pop" : 430, "state" : "KS" } +{ "_id" : "66949", "city" : "IONIA", "loc" : [ -98.125603, 39.669686 ], "pop" : 752, "state" : "KS" } +{ "_id" : "66951", "city" : "KENSINGTON", "loc" : [ -99.03084800000001, 39.769179 ], "pop" : 665, "state" : "KS" } +{ "_id" : "66952", "city" : "BELLAIRE", "loc" : [ -98.558148, 39.812839 ], "pop" : 526, "state" : "KS" } +{ "_id" : "66953", "city" : "LINN", "loc" : [ -97.08541200000001, 39.684687 ], "pop" : 666, "state" : "KS" } +{ "_id" : "66955", "city" : "MAHASKA", "loc" : [ -97.34527199999999, 39.984502 ], "pop" : 142, "state" : "KS" } +{ "_id" : "66956", "city" : "MANKATO", "loc" : [ -98.215227, 39.783259 ], "pop" : 1929, "state" : "KS" } +{ "_id" : "66958", "city" : "MORROWVILLE", "loc" : [ -97.18252099999999, 39.861551 ], "pop" : 462, "state" : "KS" } +{ "_id" : "66959", "city" : "MUNDEN", "loc" : [ -97.540302, 39.927219 ], "pop" : 266, "state" : "KS" } +{ "_id" : "66960", "city" : "NARKA", "loc" : [ -97.42433200000001, 39.958162 ], "pop" : 205, "state" : "KS" } +{ "_id" : "66961", "city" : "NORWAY", "loc" : [ -97.811926, 39.695305 ], "pop" : 287, "state" : "KS" } +{ "_id" : "66962", "city" : "PALMER", "loc" : [ -97.11221399999999, 39.619165 ], "pop" : 276, "state" : "KS" } +{ "_id" : "66963", "city" : "RANDALL", "loc" : [ -98.06605399999999, 39.62859 ], "pop" : 190, "state" : "KS" } +{ "_id" : "66964", "city" : "REPUBLIC", "loc" : [ -97.843456, 39.937572 ], "pop" : 297, "state" : "KS" } +{ "_id" : "66966", "city" : "SCANDIA", "loc" : [ -97.778645, 39.793861 ], "pop" : 537, "state" : "KS" } +{ "_id" : "66967", "city" : "SMITH CENTER", "loc" : [ -98.784243, 39.804217 ], "pop" : 2848, "state" : "KS" } +{ "_id" : "66968", "city" : "WASHINGTON", "loc" : [ -97.048368, 39.82234 ], "pop" : 1979, "state" : "KS" } +{ "_id" : "66970", "city" : "WEBBER", "loc" : [ -97.997793, 39.924496 ], "pop" : 232, "state" : "KS" } +{ "_id" : "67001", "city" : "ANDALE", "loc" : [ -97.64071199999999, 37.782686 ], "pop" : 1251, "state" : "KS" } +{ "_id" : "67002", "city" : "ANDOVER", "loc" : [ -97.117901, 37.698531 ], "pop" : 5384, "state" : "KS" } +{ "_id" : "67003", "city" : "ANTHONY", "loc" : [ -98.028499, 37.151206 ], "pop" : 2930, "state" : "KS" } +{ "_id" : "67004", "city" : "ARGONIA", "loc" : [ -97.755678, 37.283966 ], "pop" : 949, "state" : "KS" } +{ "_id" : "67005", "city" : "ARKANSAS CITY", "loc" : [ -97.035658, 37.067593 ], "pop" : 17740, "state" : "KS" } +{ "_id" : "67008", "city" : "ATLANTA", "loc" : [ -96.76613500000001, 37.434309 ], "pop" : 320, "state" : "KS" } +{ "_id" : "67009", "city" : "ATTICA", "loc" : [ -98.22642500000001, 37.25277 ], "pop" : 1125, "state" : "KS" } +{ "_id" : "67010", "city" : "AUGUSTA", "loc" : [ -96.964772, 37.683606 ], "pop" : 11306, "state" : "KS" } +{ "_id" : "67012", "city" : "BEAUMONT", "loc" : [ -96.63864, 37.607871 ], "pop" : 85, "state" : "KS" } +{ "_id" : "67013", "city" : "BELLE PLAINE", "loc" : [ -97.28522100000001, 37.405155 ], "pop" : 2784, "state" : "KS" } +{ "_id" : "67016", "city" : "BENTLEY", "loc" : [ -97.516381, 37.879582 ], "pop" : 895, "state" : "KS" } +{ "_id" : "67017", "city" : "BENTON", "loc" : [ -97.097117, 37.794615 ], "pop" : 2122, "state" : "KS" } +{ "_id" : "67018", "city" : "BLUFF CITY", "loc" : [ -97.875412, 37.083846 ], "pop" : 216, "state" : "KS" } +{ "_id" : "67019", "city" : "BURDEN", "loc" : [ -96.75704399999999, 37.320856 ], "pop" : 698, "state" : "KS" } +{ "_id" : "67020", "city" : "BURRTON", "loc" : [ -97.66664900000001, 38.026128 ], "pop" : 1149, "state" : "KS" } +{ "_id" : "67021", "city" : "BYERS", "loc" : [ -98.901662, 37.784693 ], "pop" : 208, "state" : "KS" } +{ "_id" : "67022", "city" : "CALDWELL", "loc" : [ -97.62465899999999, 37.045241 ], "pop" : 1777, "state" : "KS" } +{ "_id" : "67023", "city" : "CAMBRIDGE", "loc" : [ -96.66388000000001, 37.358348 ], "pop" : 316, "state" : "KS" } +{ "_id" : "67024", "city" : "CEDAR VALE", "loc" : [ -96.470133, 37.126487 ], "pop" : 1267, "state" : "KS" } +{ "_id" : "67025", "city" : "CHENEY", "loc" : [ -97.768638, 37.635299 ], "pop" : 2497, "state" : "KS" } +{ "_id" : "67026", "city" : "CLEARWATER", "loc" : [ -97.508179, 37.507592 ], "pop" : 2453, "state" : "KS" } +{ "_id" : "67028", "city" : "COATS", "loc" : [ -98.850398, 37.512502 ], "pop" : 190, "state" : "KS" } +{ "_id" : "67029", "city" : "COLDWATER", "loc" : [ -99.31148399999999, 37.247915 ], "pop" : 1317, "state" : "KS" } +{ "_id" : "67030", "city" : "COLWICH", "loc" : [ -97.54051800000001, 37.77824 ], "pop" : 1745, "state" : "KS" } +{ "_id" : "67031", "city" : "CONWAY SPRINGS", "loc" : [ -97.62835800000001, 37.390272 ], "pop" : 2241, "state" : "KS" } +{ "_id" : "67032", "city" : "CORBIN", "loc" : [ -97.526326, 37.073142 ], "pop" : 193, "state" : "KS" } +{ "_id" : "67035", "city" : "PENALOSA", "loc" : [ -98.39297000000001, 37.666149 ], "pop" : 497, "state" : "KS" } +{ "_id" : "67036", "city" : "DANVILLE", "loc" : [ -97.868933, 37.267424 ], "pop" : 168, "state" : "KS" } +{ "_id" : "67037", "city" : "DERBY", "loc" : [ -97.25488799999999, 37.552976 ], "pop" : 17109, "state" : "KS" } +{ "_id" : "67038", "city" : "DEXTER", "loc" : [ -96.69170200000001, 37.164087 ], "pop" : 698, "state" : "KS" } +{ "_id" : "67039", "city" : "DOUGLASS", "loc" : [ -96.994848, 37.51951 ], "pop" : 2388, "state" : "KS" } +{ "_id" : "67041", "city" : "ELBING", "loc" : [ -97.11276599999999, 38.046208 ], "pop" : 422, "state" : "KS" } +{ "_id" : "67042", "city" : "EL DORADO", "loc" : [ -96.854297, 37.822649 ], "pop" : 14387, "state" : "KS" } +{ "_id" : "67045", "city" : "EUREKA", "loc" : [ -96.295877, 37.826471 ], "pop" : 3986, "state" : "KS" } +{ "_id" : "67047", "city" : "FALL RIVER", "loc" : [ -96.04345600000001, 37.621049 ], "pop" : 527, "state" : "KS" } +{ "_id" : "67049", "city" : "FREEPORT", "loc" : [ -97.86342, 37.190257 ], "pop" : 52, "state" : "KS" } +{ "_id" : "67050", "city" : "GARDEN PLAIN", "loc" : [ -97.66002, 37.676712 ], "pop" : 1406, "state" : "KS" } +{ "_id" : "67051", "city" : "GEUDA SPRINGS", "loc" : [ -97.17950399999999, 37.08093 ], "pop" : 503, "state" : "KS" } +{ "_id" : "67052", "city" : "GODDARD", "loc" : [ -97.53640799999999, 37.657483 ], "pop" : 6586, "state" : "KS" } +{ "_id" : "67053", "city" : "GOESSEL", "loc" : [ -97.33628, 38.234259 ], "pop" : 973, "state" : "KS" } +{ "_id" : "67054", "city" : "GREENSBURG", "loc" : [ -99.301057, 37.608367 ], "pop" : 2073, "state" : "KS" } +{ "_id" : "67056", "city" : "HALSTEAD", "loc" : [ -97.511792, 38.006391 ], "pop" : 2405, "state" : "KS" } +{ "_id" : "67057", "city" : "HARDTNER", "loc" : [ -98.654732, 37.030009 ], "pop" : 284, "state" : "KS" } +{ "_id" : "67058", "city" : "HARPER", "loc" : [ -98.017978, 37.290943 ], "pop" : 2444, "state" : "KS" } +{ "_id" : "67059", "city" : "HAVILAND", "loc" : [ -99.13396400000001, 37.609615 ], "pop" : 1277, "state" : "KS" } +{ "_id" : "67060", "city" : "HAYSVILLE", "loc" : [ -97.355323, 37.56467 ], "pop" : 7666, "state" : "KS" } +{ "_id" : "67061", "city" : "HAZELTON", "loc" : [ -98.400319, 37.098421 ], "pop" : 201, "state" : "KS" } +{ "_id" : "67062", "city" : "HESSTON", "loc" : [ -97.44945800000001, 38.135951 ], "pop" : 4156, "state" : "KS" } +{ "_id" : "67063", "city" : "HILLSBORO", "loc" : [ -97.212154, 38.344907 ], "pop" : 3543, "state" : "KS" } +{ "_id" : "67065", "city" : "ISABEL", "loc" : [ -98.53514, 37.448544 ], "pop" : 198, "state" : "KS" } +{ "_id" : "67066", "city" : "IUKA", "loc" : [ -98.736103, 37.739725 ], "pop" : 387, "state" : "KS" } +{ "_id" : "67068", "city" : "BELMONT", "loc" : [ -98.109295, 37.636246 ], "pop" : 6072, "state" : "KS" } +{ "_id" : "67070", "city" : "KIOWA", "loc" : [ -98.48590799999999, 37.017166 ], "pop" : 1255, "state" : "KS" } +{ "_id" : "67071", "city" : "LAKE CITY", "loc" : [ -98.809833, 37.356885 ], "pop" : 97, "state" : "KS" } +{ "_id" : "67072", "city" : "LATHAM", "loc" : [ -96.679148, 37.530983 ], "pop" : 293, "state" : "KS" } +{ "_id" : "67073", "city" : "LEHIGH", "loc" : [ -97.304315, 38.377106 ], "pop" : 311, "state" : "KS" } +{ "_id" : "67074", "city" : "LEON", "loc" : [ -96.752634, 37.681268 ], "pop" : 1342, "state" : "KS" } +{ "_id" : "67101", "city" : "MAIZE", "loc" : [ -97.468874, 37.774727 ], "pop" : 1808, "state" : "KS" } +{ "_id" : "67102", "city" : "MAPLE CITY", "loc" : [ -96.781387, 37.071295 ], "pop" : 78, "state" : "KS" } +{ "_id" : "67103", "city" : "MAYFIELD", "loc" : [ -97.54160299999999, 37.251806 ], "pop" : 353, "state" : "KS" } +{ "_id" : "67104", "city" : "MEDICINE LODGE", "loc" : [ -98.584785, 37.284452 ], "pop" : 3208, "state" : "KS" } +{ "_id" : "67105", "city" : "MILAN", "loc" : [ -97.65206499999999, 37.257764 ], "pop" : 238, "state" : "KS" } +{ "_id" : "67106", "city" : "MILTON", "loc" : [ -97.759156, 37.440064 ], "pop" : 353, "state" : "KS" } +{ "_id" : "67107", "city" : "MOUNDRIDGE", "loc" : [ -97.50876700000001, 38.206029 ], "pop" : 2307, "state" : "KS" } +{ "_id" : "67108", "city" : "MOUNT HOPE", "loc" : [ -97.659092, 37.868412 ], "pop" : 1060, "state" : "KS" } +{ "_id" : "67109", "city" : "MULLINVILLE", "loc" : [ -99.46388, 37.571608 ], "pop" : 427, "state" : "KS" } +{ "_id" : "67110", "city" : "MULVANE", "loc" : [ -97.231954, 37.476433 ], "pop" : 6238, "state" : "KS" } +{ "_id" : "67111", "city" : "MURDOCK", "loc" : [ -97.95027, 37.609945 ], "pop" : 197, "state" : "KS" } +{ "_id" : "67112", "city" : "NASHVILLE", "loc" : [ -98.417052, 37.434419 ], "pop" : 220, "state" : "KS" } +{ "_id" : "67114", "city" : "NEWTON", "loc" : [ -97.343457, 38.045067 ], "pop" : 20273, "state" : "KS" } +{ "_id" : "67117", "city" : "NORTH NEWTON", "loc" : [ -97.328796, 38.128246 ], "pop" : 408, "state" : "KS" } +{ "_id" : "67118", "city" : "NORWICH", "loc" : [ -97.866247, 37.4501 ], "pop" : 705, "state" : "KS" } +{ "_id" : "67119", "city" : "OXFORD", "loc" : [ -97.176131, 37.265303 ], "pop" : 1515, "state" : "KS" } +{ "_id" : "67120", "city" : "PECK", "loc" : [ -97.311565, 37.472445 ], "pop" : 1023, "state" : "KS" } +{ "_id" : "67122", "city" : "PIEDMONT", "loc" : [ -96.36950299999999, 37.637169 ], "pop" : 249, "state" : "KS" } +{ "_id" : "67123", "city" : "POTWIN", "loc" : [ -97.000608, 37.971872 ], "pop" : 900, "state" : "KS" } +{ "_id" : "67124", "city" : "PRATT", "loc" : [ -98.73003, 37.650219 ], "pop" : 8348, "state" : "KS" } +{ "_id" : "67127", "city" : "PROTECTION", "loc" : [ -99.481628, 37.196782 ], "pop" : 864, "state" : "KS" } +{ "_id" : "67128", "city" : "RAGO", "loc" : [ -98.077208, 37.439824 ], "pop" : 127, "state" : "KS" } +{ "_id" : "67131", "city" : "ROCK", "loc" : [ -96.936468, 37.429435 ], "pop" : 393, "state" : "KS" } +{ "_id" : "67132", "city" : "ROSALIA", "loc" : [ -96.648161, 37.796041 ], "pop" : 545, "state" : "KS" } +{ "_id" : "67133", "city" : "ROSE HILL", "loc" : [ -97.117346, 37.578371 ], "pop" : 5598, "state" : "KS" } +{ "_id" : "67134", "city" : "SAWYER", "loc" : [ -98.66422, 37.51007 ], "pop" : 569, "state" : "KS" } +{ "_id" : "67135", "city" : "SEDGWICK", "loc" : [ -97.402412, 37.869328 ], "pop" : 7706, "state" : "KS" } +{ "_id" : "67137", "city" : "CLIMAX", "loc" : [ -96.229777, 37.64985 ], "pop" : 871, "state" : "KS" } +{ "_id" : "67138", "city" : "SHARON", "loc" : [ -98.414168, 37.249239 ], "pop" : 440, "state" : "KS" } +{ "_id" : "67140", "city" : "SOUTH HAVEN", "loc" : [ -97.404228, 37.049997 ], "pop" : 710, "state" : "KS" } +{ "_id" : "67142", "city" : "SPIVEY", "loc" : [ -98.175122, 37.440986 ], "pop" : 169, "state" : "KS" } +{ "_id" : "67143", "city" : "SUN CITY", "loc" : [ -98.90385999999999, 37.394647 ], "pop" : 191, "state" : "KS" } +{ "_id" : "67144", "city" : "TOWANDA", "loc" : [ -96.99176900000001, 37.800506 ], "pop" : 2598, "state" : "KS" } +{ "_id" : "67146", "city" : "UDALL", "loc" : [ -97.110784, 37.393861 ], "pop" : 1714, "state" : "KS" } +{ "_id" : "67147", "city" : "VALLEY CENTER", "loc" : [ -97.262146, 37.861643 ], "pop" : 1146, "state" : "KS" } +{ "_id" : "67149", "city" : "VIOLA", "loc" : [ -97.630636, 37.569624 ], "pop" : 1330, "state" : "KS" } +{ "_id" : "67150", "city" : "WALDRON", "loc" : [ -98.228877, 37.072994 ], "pop" : 189, "state" : "KS" } +{ "_id" : "67151", "city" : "WALTON", "loc" : [ -97.23607699999999, 38.123909 ], "pop" : 418, "state" : "KS" } +{ "_id" : "67152", "city" : "WELLINGTON", "loc" : [ -97.39097599999999, 37.27783 ], "pop" : 11149, "state" : "KS" } +{ "_id" : "67154", "city" : "WHITEWATER", "loc" : [ -97.130816, 37.961231 ], "pop" : 1100, "state" : "KS" } +{ "_id" : "67155", "city" : "WILMORE", "loc" : [ -99.184577, 37.331794 ], "pop" : 132, "state" : "KS" } +{ "_id" : "67156", "city" : "WINFIELD", "loc" : [ -96.97998699999999, 37.241621 ], "pop" : 14958, "state" : "KS" } +{ "_id" : "67159", "city" : "ZENDA", "loc" : [ -98.28736000000001, 37.437253 ], "pop" : 200, "state" : "KS" } +{ "_id" : "67202", "city" : "WICHITA", "loc" : [ -97.33551, 37.689945 ], "pop" : 1250, "state" : "KS" } +{ "_id" : "67203", "city" : "WICHITA", "loc" : [ -97.363766, 37.704798 ], "pop" : 30712, "state" : "KS" } +{ "_id" : "67204", "city" : "WICHITA", "loc" : [ -97.35656299999999, 37.748838 ], "pop" : 20298, "state" : "KS" } +{ "_id" : "67205", "city" : "WICHITA", "loc" : [ -97.426924, 37.763929 ], "pop" : 1807, "state" : "KS" } +{ "_id" : "67206", "city" : "EASTBOROUGH", "loc" : [ -97.23925300000001, 37.699622 ], "pop" : 13008, "state" : "KS" } +{ "_id" : "67207", "city" : "EASTBOROUGH", "loc" : [ -97.238962, 37.667152 ], "pop" : 20116, "state" : "KS" } +{ "_id" : "67208", "city" : "WICHITA", "loc" : [ -97.28106200000001, 37.702428 ], "pop" : 18195, "state" : "KS" } +{ "_id" : "67209", "city" : "WICHITA", "loc" : [ -97.42354, 37.677855 ], "pop" : 4135, "state" : "KS" } +{ "_id" : "67210", "city" : "WICHITA", "loc" : [ -97.26125399999999, 37.637915 ], "pop" : 11414, "state" : "KS" } +{ "_id" : "67211", "city" : "WICHITA", "loc" : [ -97.316451, 37.666181 ], "pop" : 20182, "state" : "KS" } +{ "_id" : "67212", "city" : "WICHITA", "loc" : [ -97.438344, 37.700683 ], "pop" : 41349, "state" : "KS" } +{ "_id" : "67213", "city" : "WICHITA", "loc" : [ -97.35907400000001, 37.667959 ], "pop" : 23607, "state" : "KS" } +{ "_id" : "67214", "city" : "WICHITA", "loc" : [ -97.313284, 37.705051 ], "pop" : 18651, "state" : "KS" } +{ "_id" : "67215", "city" : "WICHITA", "loc" : [ -97.42498500000001, 37.633333 ], "pop" : 2930, "state" : "KS" } +{ "_id" : "67216", "city" : "WICHITA", "loc" : [ -97.313625, 37.622332 ], "pop" : 23031, "state" : "KS" } +{ "_id" : "67217", "city" : "WICHITA", "loc" : [ -97.35813899999999, 37.626574 ], "pop" : 30680, "state" : "KS" } +{ "_id" : "67218", "city" : "WICHITA", "loc" : [ -97.280219, 37.669007 ], "pop" : 23491, "state" : "KS" } +{ "_id" : "67219", "city" : "PARK CITY", "loc" : [ -97.313517, 37.76482 ], "pop" : 10619, "state" : "KS" } +{ "_id" : "67220", "city" : "BEL AIRE", "loc" : [ -97.275915, 37.74548 ], "pop" : 9802, "state" : "KS" } +{ "_id" : "67221", "city" : "MC CONNELL A F B", "loc" : [ -97.25402099999999, 37.623687 ], "pop" : 137, "state" : "KS" } +{ "_id" : "67223", "city" : "WICHITA", "loc" : [ -97.467421, 37.748434 ], "pop" : 318, "state" : "KS" } +{ "_id" : "67226", "city" : "WICHITA", "loc" : [ -97.24785300000001, 37.737891 ], "pop" : 8884, "state" : "KS" } +{ "_id" : "67227", "city" : "WICHITA", "loc" : [ -97.460561, 37.588466 ], "pop" : 107, "state" : "KS" } +{ "_id" : "67228", "city" : "WICHITA", "loc" : [ -97.201404, 37.776061 ], "pop" : 768, "state" : "KS" } +{ "_id" : "67230", "city" : "WICHITA", "loc" : [ -97.155764, 37.680814 ], "pop" : 4957, "state" : "KS" } +{ "_id" : "67231", "city" : "WICHITA", "loc" : [ -97.423384, 37.526866 ], "pop" : 855, "state" : "KS" } +{ "_id" : "67232", "city" : "WICHITA", "loc" : [ -97.164278, 37.642797 ], "pop" : 128, "state" : "KS" } +{ "_id" : "67233", "city" : "WICHITA", "loc" : [ -97.32237000000001, 37.54434 ], "pop" : 3861, "state" : "KS" } +{ "_id" : "67235", "city" : "WICHITA", "loc" : [ -97.461145, 37.668631 ], "pop" : 3243, "state" : "KS" } +{ "_id" : "67236", "city" : "WICHITA", "loc" : [ -97.26821, 37.497943 ], "pop" : 262, "state" : "KS" } +{ "_id" : "67301", "city" : "INDEPENDENCE", "loc" : [ -95.716528, 37.229247 ], "pop" : 13892, "state" : "KS" } +{ "_id" : "67330", "city" : "ALTAMONT", "loc" : [ -95.29830200000001, 37.187298 ], "pop" : 1336, "state" : "KS" } +{ "_id" : "67332", "city" : "BARTLETT", "loc" : [ -95.211512, 37.060096 ], "pop" : 385, "state" : "KS" } +{ "_id" : "67333", "city" : "CANEY", "loc" : [ -95.909128, 37.022412 ], "pop" : 3302, "state" : "KS" } +{ "_id" : "67335", "city" : "CHERRYVALE", "loc" : [ -95.55901900000001, 37.266828 ], "pop" : 3490, "state" : "KS" } +{ "_id" : "67336", "city" : "CHETOPA", "loc" : [ -95.079572, 37.041817 ], "pop" : 2031, "state" : "KS" } +{ "_id" : "67337", "city" : "COFFEYVILLE", "loc" : [ -95.632756, 37.044056 ], "pop" : 17417, "state" : "KS" } +{ "_id" : "67341", "city" : "DENNIS", "loc" : [ -95.411602, 37.324324 ], "pop" : 430, "state" : "KS" } +{ "_id" : "67342", "city" : "EDNA", "loc" : [ -95.344159, 37.056146 ], "pop" : 817, "state" : "KS" } +{ "_id" : "67344", "city" : "ELK CITY", "loc" : [ -95.913517, 37.314571 ], "pop" : 801, "state" : "KS" } +{ "_id" : "67345", "city" : "ELK FALLS", "loc" : [ -96.195902, 37.374514 ], "pop" : 206, "state" : "KS" } +{ "_id" : "67346", "city" : "GRENOLA", "loc" : [ -96.439564, 37.366824 ], "pop" : 389, "state" : "KS" } +{ "_id" : "67347", "city" : "HAVANA", "loc" : [ -95.941372, 37.091655 ], "pop" : 149, "state" : "KS" } +{ "_id" : "67349", "city" : "HOWARD", "loc" : [ -96.256298, 37.48089 ], "pop" : 1161, "state" : "KS" } +{ "_id" : "67351", "city" : "LIBERTY", "loc" : [ -95.601698, 37.157629 ], "pop" : 504, "state" : "KS" } +{ "_id" : "67352", "city" : "LONGTON", "loc" : [ -96.081379, 37.390455 ], "pop" : 561, "state" : "KS" } +{ "_id" : "67353", "city" : "MOLINE", "loc" : [ -96.30687500000001, 37.364868 ], "pop" : 681, "state" : "KS" } +{ "_id" : "67354", "city" : "MOUND VALLEY", "loc" : [ -95.424712, 37.209078 ], "pop" : 807, "state" : "KS" } +{ "_id" : "67355", "city" : "NIOTAZE", "loc" : [ -96.01922, 37.05133 ], "pop" : 265, "state" : "KS" } +{ "_id" : "67356", "city" : "OSWEGO", "loc" : [ -95.133458, 37.182254 ], "pop" : 3121, "state" : "KS" } +{ "_id" : "67357", "city" : "PARSONS", "loc" : [ -95.269288, 37.338888 ], "pop" : 14375, "state" : "KS" } +{ "_id" : "67360", "city" : "PERU", "loc" : [ -96.140376, 37.056823 ], "pop" : 689, "state" : "KS" } +{ "_id" : "67361", "city" : "SEDAN", "loc" : [ -96.173248, 37.12968 ], "pop" : 2186, "state" : "KS" } +{ "_id" : "67401", "city" : "BAVARIA", "loc" : [ -97.60878700000001, 38.823802 ], "pop" : 45208, "state" : "KS" } +{ "_id" : "67410", "city" : "ABILENE", "loc" : [ -97.20632000000001, 38.937144 ], "pop" : 8249, "state" : "KS" } +{ "_id" : "67414", "city" : "ADA", "loc" : [ -97.887387, 39.157777 ], "pop" : 179, "state" : "KS" } +{ "_id" : "67416", "city" : "ASSARIA", "loc" : [ -97.62032000000001, 38.667596 ], "pop" : 761, "state" : "KS" } +{ "_id" : "67417", "city" : "AURORA", "loc" : [ -97.530411, 39.447188 ], "pop" : 195, "state" : "KS" } +{ "_id" : "67418", "city" : "BARNARD", "loc" : [ -98.071144, 39.181572 ], "pop" : 302, "state" : "KS" } +{ "_id" : "67420", "city" : "SCOTTSVILLE", "loc" : [ -98.11171400000001, 39.45446 ], "pop" : 5221, "state" : "KS" } +{ "_id" : "67422", "city" : "BENNINGTON", "loc" : [ -97.603121, 39.02239 ], "pop" : 844, "state" : "KS" } +{ "_id" : "67423", "city" : "BEVERLY", "loc" : [ -97.981785, 38.984416 ], "pop" : 389, "state" : "KS" } +{ "_id" : "67425", "city" : "BROOKVILLE", "loc" : [ -97.86300199999999, 38.785771 ], "pop" : 323, "state" : "KS" } +{ "_id" : "67427", "city" : "BUSHTON", "loc" : [ -98.401629, 38.501836 ], "pop" : 480, "state" : "KS" } +{ "_id" : "67428", "city" : "CANTON", "loc" : [ -97.42907200000001, 38.385838 ], "pop" : 1050, "state" : "KS" } +{ "_id" : "67429", "city" : "CARLTON", "loc" : [ -97.307506, 38.6729 ], "pop" : 121, "state" : "KS" } +{ "_id" : "67430", "city" : "CAWKER CITY", "loc" : [ -98.433458, 39.511529 ], "pop" : 637, "state" : "KS" } +{ "_id" : "67431", "city" : "CHAPMAN", "loc" : [ -97.01696099999999, 38.972225 ], "pop" : 1968, "state" : "KS" } +{ "_id" : "67432", "city" : "CLAY CENTER", "loc" : [ -97.127793, 39.384354 ], "pop" : 6038, "state" : "KS" } +{ "_id" : "67436", "city" : "DELPHOS", "loc" : [ -97.771692, 39.273122 ], "pop" : 639, "state" : "KS" } +{ "_id" : "67437", "city" : "DOWNS", "loc" : [ -98.544117, 39.502753 ], "pop" : 1285, "state" : "KS" } +{ "_id" : "67438", "city" : "DURHAM", "loc" : [ -97.255532, 38.503836 ], "pop" : 444, "state" : "KS" } +{ "_id" : "67439", "city" : "ELLSWORTH", "loc" : [ -98.20567800000001, 38.731219 ], "pop" : 3728, "state" : "KS" } +{ "_id" : "67441", "city" : "ENTERPRISE", "loc" : [ -97.112222, 38.906321 ], "pop" : 1286, "state" : "KS" } +{ "_id" : "67442", "city" : "FALUN", "loc" : [ -97.755411, 38.664794 ], "pop" : 226, "state" : "KS" } +{ "_id" : "67443", "city" : "GALVA", "loc" : [ -97.53592, 38.382377 ], "pop" : 1151, "state" : "KS" } +{ "_id" : "67444", "city" : "GENESEO", "loc" : [ -98.185818, 38.503655 ], "pop" : 569, "state" : "KS" } +{ "_id" : "67445", "city" : "GLASCO", "loc" : [ -97.841829, 39.362092 ], "pop" : 663, "state" : "KS" } +{ "_id" : "67446", "city" : "GLEN ELDER", "loc" : [ -98.31550799999999, 39.495775 ], "pop" : 632, "state" : "KS" } +{ "_id" : "67447", "city" : "GREEN", "loc" : [ -96.999424, 39.420056 ], "pop" : 340, "state" : "KS" } +{ "_id" : "67448", "city" : "GYPSUM", "loc" : [ -97.43384, 38.704744 ], "pop" : 742, "state" : "KS" } +{ "_id" : "67449", "city" : "DELAVAN", "loc" : [ -97.015491, 38.702306 ], "pop" : 4145, "state" : "KS" } +{ "_id" : "67450", "city" : "HOLYROOD", "loc" : [ -98.415916, 38.589955 ], "pop" : 678, "state" : "KS" } +{ "_id" : "67451", "city" : "HOPE", "loc" : [ -97.106126, 38.6776 ], "pop" : 725, "state" : "KS" } +{ "_id" : "67452", "city" : "HUNTER", "loc" : [ -98.40174500000001, 39.242964 ], "pop" : 181, "state" : "KS" } +{ "_id" : "67454", "city" : "KANOPOLIS", "loc" : [ -98.15746799999999, 38.709111 ], "pop" : 641, "state" : "KS" } +{ "_id" : "67455", "city" : "WESTFALL", "loc" : [ -98.14042600000001, 39.028644 ], "pop" : 1986, "state" : "KS" } +{ "_id" : "67456", "city" : "LINDSBORG", "loc" : [ -97.67389, 38.576058 ], "pop" : 3320, "state" : "KS" } +{ "_id" : "67457", "city" : "LITTLE RIVER", "loc" : [ -98.01131700000001, 38.407868 ], "pop" : 841, "state" : "KS" } +{ "_id" : "67458", "city" : "LONGFORD", "loc" : [ -97.208662, 39.174324 ], "pop" : 507, "state" : "KS" } +{ "_id" : "67459", "city" : "LORRAINE", "loc" : [ -98.28995399999999, 38.565175 ], "pop" : 302, "state" : "KS" } +{ "_id" : "67460", "city" : "CONWAY", "loc" : [ -97.654989, 38.373732 ], "pop" : 16480, "state" : "KS" } +{ "_id" : "67463", "city" : "MANCHESTER", "loc" : [ -97.30954699999999, 39.087051 ], "pop" : 203, "state" : "KS" } +{ "_id" : "67464", "city" : "MARQUETTE", "loc" : [ -97.83807899999999, 38.556028 ], "pop" : 760, "state" : "KS" } +{ "_id" : "67465", "city" : "MENTOR", "loc" : [ -97.566034, 38.732103 ], "pop" : 791, "state" : "KS" } +{ "_id" : "67466", "city" : "MILTONVALE", "loc" : [ -97.457911, 39.348078 ], "pop" : 677, "state" : "KS" } +{ "_id" : "67467", "city" : "MINNEAPOLIS", "loc" : [ -97.668778, 39.129487 ], "pop" : 2985, "state" : "KS" } +{ "_id" : "67468", "city" : "MORGANVILLE", "loc" : [ -97.249219, 39.509219 ], "pop" : 847, "state" : "KS" } +{ "_id" : "67469", "city" : "NAVARRE", "loc" : [ -97.105554, 38.81772 ], "pop" : 205, "state" : "KS" } +{ "_id" : "67470", "city" : "NEW CAMBRIA", "loc" : [ -97.52301199999999, 38.896008 ], "pop" : 390, "state" : "KS" } +{ "_id" : "67472", "city" : "OAKHILL", "loc" : [ -97.330501, 39.247668 ], "pop" : 96, "state" : "KS" } +{ "_id" : "67473", "city" : "OSBORNE", "loc" : [ -98.69608100000001, 39.419402 ], "pop" : 2340, "state" : "KS" } +{ "_id" : "67474", "city" : "PORTIS", "loc" : [ -98.69044599999999, 39.545545 ], "pop" : 255, "state" : "KS" } +{ "_id" : "67475", "city" : "RAMONA", "loc" : [ -97.075874, 38.577726 ], "pop" : 237, "state" : "KS" } +{ "_id" : "67476", "city" : "ROXBURY", "loc" : [ -97.42719, 38.474325 ], "pop" : 106, "state" : "KS" } +{ "_id" : "67478", "city" : "SIMPSON", "loc" : [ -97.948887, 39.373074 ], "pop" : 159, "state" : "KS" } +{ "_id" : "67479", "city" : "SMOLAN", "loc" : [ -97.71327700000001, 38.76442 ], "pop" : 706, "state" : "KS" } +{ "_id" : "67480", "city" : "SOLOMON", "loc" : [ -97.351803, 38.919359 ], "pop" : 1626, "state" : "KS" } +{ "_id" : "67481", "city" : "SYLVAN GROVE", "loc" : [ -98.373031, 39.032443 ], "pop" : 976, "state" : "KS" } +{ "_id" : "67482", "city" : "TALMAGE", "loc" : [ -97.29736699999999, 39.008594 ], "pop" : 200, "state" : "KS" } +{ "_id" : "67483", "city" : "TAMPA", "loc" : [ -97.17738799999999, 38.553437 ], "pop" : 211, "state" : "KS" } +{ "_id" : "67484", "city" : "CULVER", "loc" : [ -97.82837499999999, 38.998318 ], "pop" : 745, "state" : "KS" } +{ "_id" : "67485", "city" : "TIPTON", "loc" : [ -98.46439100000001, 39.343639 ], "pop" : 373, "state" : "KS" } +{ "_id" : "67487", "city" : "WAKEFIELD", "loc" : [ -97.022851, 39.224916 ], "pop" : 1330, "state" : "KS" } +{ "_id" : "67488", "city" : "WELLS", "loc" : [ -97.554636, 39.059224 ], "pop" : 242, "state" : "KS" } +{ "_id" : "67490", "city" : "WILSON", "loc" : [ -98.44321600000001, 38.813373 ], "pop" : 1237, "state" : "KS" } +{ "_id" : "67491", "city" : "WINDOM", "loc" : [ -97.89647600000001, 38.384518 ], "pop" : 231, "state" : "KS" } +{ "_id" : "67492", "city" : "WOODBINE", "loc" : [ -96.961935, 38.813064 ], "pop" : 384, "state" : "KS" } +{ "_id" : "67501", "city" : "HUTCHINSON", "loc" : [ -97.93105199999999, 38.054995 ], "pop" : 27097, "state" : "KS" } +{ "_id" : "67502", "city" : "MEDORA", "loc" : [ -97.920517, 38.091483 ], "pop" : 21197, "state" : "KS" } +{ "_id" : "67505", "city" : "SOUTH HUTCHINSON", "loc" : [ -97.90814, 38.007306 ], "pop" : 4243, "state" : "KS" } +{ "_id" : "67510", "city" : "ABBYVILLE", "loc" : [ -98.207103, 37.962597 ], "pop" : 267, "state" : "KS" } +{ "_id" : "67511", "city" : "ALBERT", "loc" : [ -98.98071400000001, 38.475758 ], "pop" : 544, "state" : "KS" } +{ "_id" : "67512", "city" : "ALDEN", "loc" : [ -98.31120199999999, 38.234303 ], "pop" : 278, "state" : "KS" } +{ "_id" : "67513", "city" : "ALEXANDER", "loc" : [ -99.537828, 38.456996 ], "pop" : 150, "state" : "KS" } +{ "_id" : "67514", "city" : "ARLINGTON", "loc" : [ -98.15904500000001, 37.859795 ], "pop" : 930, "state" : "KS" } +{ "_id" : "67515", "city" : "ARNOLD", "loc" : [ -100.012003, 38.609122 ], "pop" : 0, "state" : "KS" } +{ "_id" : "67516", "city" : "BAZINE", "loc" : [ -99.701607, 38.456457 ], "pop" : 546, "state" : "KS" } +{ "_id" : "67517", "city" : "BEAVER", "loc" : [ -98.64832699999999, 38.650055 ], "pop" : 122, "state" : "KS" } +{ "_id" : "67518", "city" : "BEELER", "loc" : [ -100.170957, 38.48113 ], "pop" : 91, "state" : "KS" } +{ "_id" : "67519", "city" : "BELPRE", "loc" : [ -99.09357, 37.934655 ], "pop" : 268, "state" : "KS" } +{ "_id" : "67520", "city" : "BISON", "loc" : [ -99.198634, 38.519332 ], "pop" : 347, "state" : "KS" } +{ "_id" : "67521", "city" : "BROWNELL", "loc" : [ -99.732806, 38.623854 ], "pop" : 156, "state" : "KS" } +{ "_id" : "67522", "city" : "BUHLER", "loc" : [ -97.769093, 38.130903 ], "pop" : 1854, "state" : "KS" } +{ "_id" : "67523", "city" : "BURDETT", "loc" : [ -99.52751499999999, 38.210384 ], "pop" : 340, "state" : "KS" } +{ "_id" : "67524", "city" : "CHASE", "loc" : [ -98.35563399999999, 38.363515 ], "pop" : 772, "state" : "KS" } +{ "_id" : "67525", "city" : "CLAFLIN", "loc" : [ -98.53722, 38.540885 ], "pop" : 969, "state" : "KS" } +{ "_id" : "67526", "city" : "ELLINWOOD", "loc" : [ -98.584872, 38.356498 ], "pop" : 3297, "state" : "KS" } +{ "_id" : "67529", "city" : "GARFIELD", "loc" : [ -99.237433, 38.064929 ], "pop" : 368, "state" : "KS" } +{ "_id" : "67530", "city" : "HEIZER", "loc" : [ -98.783103, 38.370937 ], "pop" : 19861, "state" : "KS" } +{ "_id" : "67543", "city" : "HAVEN", "loc" : [ -97.777244, 37.868593 ], "pop" : 2181, "state" : "KS" } +{ "_id" : "67544", "city" : "SUSANK", "loc" : [ -98.79104100000001, 38.529246 ], "pop" : 3642, "state" : "KS" } +{ "_id" : "67545", "city" : "HUDSON", "loc" : [ -98.640815, 38.148493 ], "pop" : 381, "state" : "KS" } +{ "_id" : "67546", "city" : "INMAN", "loc" : [ -97.795107, 38.223212 ], "pop" : 1863, "state" : "KS" } +{ "_id" : "67547", "city" : "KINSLEY", "loc" : [ -99.411556, 37.924715 ], "pop" : 2321, "state" : "KS" } +{ "_id" : "67548", "city" : "LA CROSSE", "loc" : [ -99.30973299999999, 38.531144 ], "pop" : 1545, "state" : "KS" } +{ "_id" : "67550", "city" : "RADIUM", "loc" : [ -99.112382, 38.179643 ], "pop" : 6572, "state" : "KS" } +{ "_id" : "67552", "city" : "LEWIS", "loc" : [ -99.24797700000001, 37.906223 ], "pop" : 758, "state" : "KS" } +{ "_id" : "67553", "city" : "LIEBENTHAL", "loc" : [ -99.282051, 38.646585 ], "pop" : 231, "state" : "KS" } +{ "_id" : "67554", "city" : "LYONS", "loc" : [ -98.183094, 38.334881 ], "pop" : 4931, "state" : "KS" } +{ "_id" : "67556", "city" : "MC CRACKEN", "loc" : [ -99.553982, 38.595734 ], "pop" : 317, "state" : "KS" } +{ "_id" : "67557", "city" : "MACKSVILLE", "loc" : [ -98.948052, 37.943276 ], "pop" : 754, "state" : "KS" } +{ "_id" : "67559", "city" : "NEKOMA", "loc" : [ -99.42337999999999, 38.437226 ], "pop" : 81, "state" : "KS" } +{ "_id" : "67560", "city" : "NESS CITY", "loc" : [ -99.90286, 38.438754 ], "pop" : 2256, "state" : "KS" } +{ "_id" : "67561", "city" : "NICKERSON", "loc" : [ -98.067408, 38.141171 ], "pop" : 1596, "state" : "KS" } +{ "_id" : "67562", "city" : "ODIN", "loc" : [ -98.626762, 38.55628 ], "pop" : 281, "state" : "KS" } +{ "_id" : "67563", "city" : "OFFERLE", "loc" : [ -99.549757, 37.882805 ], "pop" : 323, "state" : "KS" } +{ "_id" : "67564", "city" : "GALATIA", "loc" : [ -98.92899, 38.567045 ], "pop" : 14, "state" : "KS" } +{ "_id" : "67565", "city" : "GALATIA", "loc" : [ -99.065635, 38.509239 ], "pop" : 711, "state" : "KS" } +{ "_id" : "67566", "city" : "PARTRIDGE", "loc" : [ -98.07981100000001, 37.967129 ], "pop" : 581, "state" : "KS" } +{ "_id" : "67567", "city" : "PAWNEE ROCK", "loc" : [ -98.981436, 38.278193 ], "pop" : 515, "state" : "KS" } +{ "_id" : "67568", "city" : "PLEVNA", "loc" : [ -98.298807, 37.965762 ], "pop" : 270, "state" : "KS" } +{ "_id" : "67570", "city" : "PRETTY PRAIRIE", "loc" : [ -97.988603, 37.77828 ], "pop" : 959, "state" : "KS" } +{ "_id" : "67572", "city" : "RANSOM", "loc" : [ -99.92665100000001, 38.640003 ], "pop" : 581, "state" : "KS" } +{ "_id" : "67573", "city" : "RAYMOND", "loc" : [ -98.411867, 38.287677 ], "pop" : 254, "state" : "KS" } +{ "_id" : "67574", "city" : "ROZEL", "loc" : [ -99.40484600000001, 38.214823 ], "pop" : 275, "state" : "KS" } +{ "_id" : "67575", "city" : "RUSH CENTER", "loc" : [ -99.30788099999999, 38.453341 ], "pop" : 275, "state" : "KS" } +{ "_id" : "67576", "city" : "SAINT JOHN", "loc" : [ -98.764653, 38.030939 ], "pop" : 2292, "state" : "KS" } +{ "_id" : "67577", "city" : "SEWARD", "loc" : [ -98.76391, 38.206558 ], "pop" : 249, "state" : "KS" } +{ "_id" : "67578", "city" : "STAFFORD", "loc" : [ -98.592854, 37.955372 ], "pop" : 1689, "state" : "KS" } +{ "_id" : "67579", "city" : "STERLING", "loc" : [ -98.205474, 38.212621 ], "pop" : 2485, "state" : "KS" } +{ "_id" : "67581", "city" : "SYLVIA", "loc" : [ -98.40676499999999, 37.955687 ], "pop" : 396, "state" : "KS" } +{ "_id" : "67582", "city" : "TIMKEN", "loc" : [ -99.19015400000001, 38.445489 ], "pop" : 185, "state" : "KS" } +{ "_id" : "67583", "city" : "LANGDON", "loc" : [ -98.421798, 37.809593 ], "pop" : 558, "state" : "KS" } +{ "_id" : "67584", "city" : "UTICA", "loc" : [ -100.137976, 38.641057 ], "pop" : 403, "state" : "KS" } +{ "_id" : "67601", "city" : "ANTONINO", "loc" : [ -99.320134, 38.878046 ], "pop" : 20703, "state" : "KS" } +{ "_id" : "67621", "city" : "AGRA", "loc" : [ -99.12554299999999, 39.803701 ], "pop" : 604, "state" : "KS" } +{ "_id" : "67622", "city" : "ALMENA", "loc" : [ -99.704177, 39.889071 ], "pop" : 574, "state" : "KS" } +{ "_id" : "67623", "city" : "ALTON", "loc" : [ -98.953875, 39.451422 ], "pop" : 364, "state" : "KS" } +{ "_id" : "67625", "city" : "BOGUE", "loc" : [ -99.67882, 39.378221 ], "pop" : 416, "state" : "KS" } +{ "_id" : "67626", "city" : "BUNKER HILL", "loc" : [ -98.678285, 38.835704 ], "pop" : 359, "state" : "KS" } +{ "_id" : "67627", "city" : "CATHARINE", "loc" : [ -99.215992, 38.96034 ], "pop" : 289, "state" : "KS" } +{ "_id" : "67628", "city" : "CEDAR", "loc" : [ -98.93692299999999, 39.660242 ], "pop" : 62, "state" : "KS" } +{ "_id" : "67629", "city" : "CLAYTON", "loc" : [ -100.059623, 39.69985 ], "pop" : 485, "state" : "KS" } +{ "_id" : "67630", "city" : "CODELL", "loc" : [ -99.15918600000001, 39.206652 ], "pop" : 160, "state" : "KS" } +{ "_id" : "67631", "city" : "COLLYER", "loc" : [ -100.06921, 38.965231 ], "pop" : 523, "state" : "KS" } +{ "_id" : "67632", "city" : "DAMAR", "loc" : [ -99.581056, 39.324181 ], "pop" : 214, "state" : "KS" } +{ "_id" : "67634", "city" : "DORRANCE", "loc" : [ -98.56947099999999, 38.834784 ], "pop" : 316, "state" : "KS" } +{ "_id" : "67635", "city" : "DRESDEN", "loc" : [ -100.411219, 39.609357 ], "pop" : 158, "state" : "KS" } +{ "_id" : "67636", "city" : "EDMOND", "loc" : [ -99.78418499999999, 39.661348 ], "pop" : 180, "state" : "KS" } +{ "_id" : "67637", "city" : "ELLIS", "loc" : [ -99.52851, 38.947128 ], "pop" : 2478, "state" : "KS" } +{ "_id" : "67638", "city" : "GAYLORD", "loc" : [ -98.801751, 39.659923 ], "pop" : 722, "state" : "KS" } +{ "_id" : "67639", "city" : "GLADE", "loc" : [ -99.29962999999999, 39.670373 ], "pop" : 320, "state" : "KS" } +{ "_id" : "67640", "city" : "GORHAM", "loc" : [ -99.01116, 38.872226 ], "pop" : 528, "state" : "KS" } +{ "_id" : "67641", "city" : "HARLAN", "loc" : [ -98.789796, 39.611345 ], "pop" : 91, "state" : "KS" } +{ "_id" : "67642", "city" : "HILL CITY", "loc" : [ -99.842921, 39.35657 ], "pop" : 2501, "state" : "KS" } +{ "_id" : "67643", "city" : "JENNINGS", "loc" : [ -100.283441, 39.676242 ], "pop" : 347, "state" : "KS" } +{ "_id" : "67644", "city" : "KIRWIN", "loc" : [ -99.120378, 39.671716 ], "pop" : 388, "state" : "KS" } +{ "_id" : "67645", "city" : "DENSMORE", "loc" : [ -100.001566, 39.609364 ], "pop" : 344, "state" : "KS" } +{ "_id" : "67646", "city" : "LOGAN", "loc" : [ -99.56869399999999, 39.661096 ], "pop" : 751, "state" : "KS" } +{ "_id" : "67647", "city" : "LONG ISLAND", "loc" : [ -99.539125, 39.951683 ], "pop" : 260, "state" : "KS" } +{ "_id" : "67648", "city" : "LUCAS", "loc" : [ -98.535186, 39.058126 ], "pop" : 576, "state" : "KS" } +{ "_id" : "67649", "city" : "LURAY", "loc" : [ -98.685084, 39.103856 ], "pop" : 339, "state" : "KS" } +{ "_id" : "67650", "city" : "MORLAND", "loc" : [ -100.07328, 39.322905 ], "pop" : 604, "state" : "KS" } +{ "_id" : "67651", "city" : "NATOMA", "loc" : [ -98.98286299999999, 39.201341 ], "pop" : 623, "state" : "KS" } +{ "_id" : "67652", "city" : "NEW ALMELO", "loc" : [ -100.139829, 39.624755 ], "pop" : 2, "state" : "KS" } +{ "_id" : "67653", "city" : "NORCATUR", "loc" : [ -100.200714, 39.844661 ], "pop" : 304, "state" : "KS" } +{ "_id" : "67654", "city" : "NORTON", "loc" : [ -99.887832, 39.840706 ], "pop" : 4360, "state" : "KS" } +{ "_id" : "67656", "city" : "OGALLAH", "loc" : [ -99.681117, 38.932307 ], "pop" : 460, "state" : "KS" } +{ "_id" : "67657", "city" : "PALCO", "loc" : [ -99.559265, 39.253107 ], "pop" : 384, "state" : "KS" } +{ "_id" : "67658", "city" : "PARADISE", "loc" : [ -98.920723, 39.075617 ], "pop" : 219, "state" : "KS" } +{ "_id" : "67659", "city" : "PENOKEE", "loc" : [ -99.919603, 39.391667 ], "pop" : 22, "state" : "KS" } +{ "_id" : "67660", "city" : "PFEIFER", "loc" : [ -99.14116199999999, 38.729915 ], "pop" : 123, "state" : "KS" } +{ "_id" : "67661", "city" : "PHILLIPSBURG", "loc" : [ -99.33284, 39.762333 ], "pop" : 3942, "state" : "KS" } +{ "_id" : "67663", "city" : "PLAINVILLE", "loc" : [ -99.300827, 39.230823 ], "pop" : 2499, "state" : "KS" } +{ "_id" : "67664", "city" : "PRAIRIE VIEW", "loc" : [ -99.568314, 39.836967 ], "pop" : 325, "state" : "KS" } +{ "_id" : "67665", "city" : "RUSSELL", "loc" : [ -98.85945100000001, 38.880563 ], "pop" : 5370, "state" : "KS" } +{ "_id" : "67667", "city" : "SCHOENCHEN", "loc" : [ -99.386872, 38.748087 ], "pop" : 534, "state" : "KS" } +{ "_id" : "67669", "city" : "STOCKTON", "loc" : [ -99.28710599999999, 39.43761 ], "pop" : 2147, "state" : "KS" } +{ "_id" : "67671", "city" : "VICTORIA", "loc" : [ -99.13905699999999, 38.858932 ], "pop" : 1877, "state" : "KS" } +{ "_id" : "67672", "city" : "WA KEENEY", "loc" : [ -99.88182399999999, 39.011415 ], "pop" : 2711, "state" : "KS" } +{ "_id" : "67673", "city" : "WALDO", "loc" : [ -98.778516, 39.087715 ], "pop" : 128, "state" : "KS" } +{ "_id" : "67675", "city" : "WOODSTON", "loc" : [ -99.103745, 39.443118 ], "pop" : 317, "state" : "KS" } +{ "_id" : "67676", "city" : "ZURICH", "loc" : [ -99.44908, 39.218155 ], "pop" : 318, "state" : "KS" } +{ "_id" : "67701", "city" : "COLBY", "loc" : [ -101.044169, 39.383038 ], "pop" : 7225, "state" : "KS" } +{ "_id" : "67730", "city" : "ATWOOD", "loc" : [ -101.031766, 39.792607 ], "pop" : 2174, "state" : "KS" } +{ "_id" : "67731", "city" : "BIRD CITY", "loc" : [ -101.531875, 39.757941 ], "pop" : 794, "state" : "KS" } +{ "_id" : "67732", "city" : "BREWSTER", "loc" : [ -101.372973, 39.36552 ], "pop" : 374, "state" : "KS" } +{ "_id" : "67733", "city" : "EDSON", "loc" : [ -101.520999, 39.357873 ], "pop" : 294, "state" : "KS" } +{ "_id" : "67734", "city" : "GEM", "loc" : [ -100.894781, 39.429587 ], "pop" : 157, "state" : "KS" } +{ "_id" : "67735", "city" : "GOODLAND", "loc" : [ -101.716396, 39.349099 ], "pop" : 6039, "state" : "KS" } +{ "_id" : "67736", "city" : "GOVE", "loc" : [ -100.486707, 38.886969 ], "pop" : 379, "state" : "KS" } +{ "_id" : "67737", "city" : "GRAINFIELD", "loc" : [ -100.468038, 39.103016 ], "pop" : 467, "state" : "KS" } +{ "_id" : "67738", "city" : "GRINNELL", "loc" : [ -100.662052, 39.085107 ], "pop" : 632, "state" : "KS" } +{ "_id" : "67739", "city" : "HERNDON", "loc" : [ -100.813935, 39.90356 ], "pop" : 477, "state" : "KS" } +{ "_id" : "67740", "city" : "HOXIE", "loc" : [ -100.47583, 39.332189 ], "pop" : 2023, "state" : "KS" } +{ "_id" : "67741", "city" : "KANORADO", "loc" : [ -102.001491, 39.343753 ], "pop" : 593, "state" : "KS" } +{ "_id" : "67743", "city" : "LEVANT", "loc" : [ -101.209587, 39.384083 ], "pop" : 143, "state" : "KS" } +{ "_id" : "67744", "city" : "LUDELL", "loc" : [ -100.960352, 39.863037 ], "pop" : 155, "state" : "KS" } +{ "_id" : "67745", "city" : "MC DONALD", "loc" : [ -101.322697, 39.792304 ], "pop" : 598, "state" : "KS" } +{ "_id" : "67747", "city" : "MONUMENT", "loc" : [ -101.034952, 39.07896 ], "pop" : 164, "state" : "KS" } +{ "_id" : "67748", "city" : "OAKLEY", "loc" : [ -100.858048, 39.112102 ], "pop" : 2346, "state" : "KS" } +{ "_id" : "67749", "city" : "OBERLIN", "loc" : [ -100.531389, 39.827507 ], "pop" : 3046, "state" : "KS" } +{ "_id" : "67751", "city" : "PARK", "loc" : [ -100.34694, 39.078832 ], "pop" : 316, "state" : "KS" } +{ "_id" : "67752", "city" : "QUINTER", "loc" : [ -100.233739, 39.036252 ], "pop" : 1437, "state" : "KS" } +{ "_id" : "67753", "city" : "MENLO", "loc" : [ -100.748982, 39.462185 ], "pop" : 246, "state" : "KS" } +{ "_id" : "67755", "city" : "RUSSELL SPRINGS", "loc" : [ -101.2759, 38.868374 ], "pop" : 243, "state" : "KS" } +{ "_id" : "67756", "city" : "WHEELER", "loc" : [ -101.81226, 39.773634 ], "pop" : 2449, "state" : "KS" } +{ "_id" : "67757", "city" : "SELDEN", "loc" : [ -100.525695, 39.521636 ], "pop" : 872, "state" : "KS" } +{ "_id" : "67758", "city" : "SHARON SPRINGS", "loc" : [ -101.743118, 38.885661 ], "pop" : 1148, "state" : "KS" } +{ "_id" : "67759", "city" : "STUDLEY", "loc" : [ -100.281436, 39.261618 ], "pop" : 314, "state" : "KS" } +{ "_id" : "67761", "city" : "WALLACE", "loc" : [ -101.573474, 38.874675 ], "pop" : 293, "state" : "KS" } +{ "_id" : "67762", "city" : "WESKAN", "loc" : [ -101.951162, 38.864867 ], "pop" : 380, "state" : "KS" } +{ "_id" : "67764", "city" : "WINONA", "loc" : [ -101.221569, 39.061038 ], "pop" : 328, "state" : "KS" } +{ "_id" : "67801", "city" : "DODGE CITY", "loc" : [ -100.024074, 37.756882 ], "pop" : 23098, "state" : "KS" } +{ "_id" : "67831", "city" : "ASHLAND", "loc" : [ -99.75904, 37.182345 ], "pop" : 1271, "state" : "KS" } +{ "_id" : "67834", "city" : "BUCKLIN", "loc" : [ -99.632543, 37.552974 ], "pop" : 848, "state" : "KS" } +{ "_id" : "67835", "city" : "CIMARRON", "loc" : [ -100.343825, 37.812727 ], "pop" : 2249, "state" : "KS" } +{ "_id" : "67837", "city" : "COPELAND", "loc" : [ -100.614815, 37.567994 ], "pop" : 536, "state" : "KS" } +{ "_id" : "67838", "city" : "DEERFIELD", "loc" : [ -101.143141, 38.00677 ], "pop" : 1077, "state" : "KS" } +{ "_id" : "67839", "city" : "ALAMOTA", "loc" : [ -100.458023, 38.474588 ], "pop" : 1666, "state" : "KS" } +{ "_id" : "67840", "city" : "ENGLEWOOD", "loc" : [ -99.987793, 37.065751 ], "pop" : 148, "state" : "KS" } +{ "_id" : "67841", "city" : "ENSIGN", "loc" : [ -100.249555, 37.641381 ], "pop" : 373, "state" : "KS" } +{ "_id" : "67842", "city" : "FORD", "loc" : [ -99.76421999999999, 37.632312 ], "pop" : 403, "state" : "KS" } +{ "_id" : "67843", "city" : "FORT DODGE", "loc" : [ -99.94563100000001, 37.70652 ], "pop" : 736, "state" : "KS" } +{ "_id" : "67844", "city" : "FOWLER", "loc" : [ -100.19815, 37.354201 ], "pop" : 881, "state" : "KS" } +{ "_id" : "67846", "city" : "GARDEN CITY", "loc" : [ -100.862088, 37.97693 ], "pop" : 30189, "state" : "KS" } +{ "_id" : "67849", "city" : "HANSTON", "loc" : [ -99.69278, 38.108964 ], "pop" : 695, "state" : "KS" } +{ "_id" : "67850", "city" : "HEALY", "loc" : [ -100.615941, 38.566355 ], "pop" : 476, "state" : "KS" } +{ "_id" : "67851", "city" : "HOLCOMB", "loc" : [ -100.989323, 37.993105 ], "pop" : 2060, "state" : "KS" } +{ "_id" : "67853", "city" : "INGALLS", "loc" : [ -100.514253, 37.829339 ], "pop" : 807, "state" : "KS" } +{ "_id" : "67854", "city" : "JETMORE", "loc" : [ -99.93266800000001, 38.073829 ], "pop" : 1482, "state" : "KS" } +{ "_id" : "67855", "city" : "JOHNSON", "loc" : [ -101.719354, 37.569424 ], "pop" : 1979, "state" : "KS" } +{ "_id" : "67856", "city" : "KALVESTA", "loc" : [ -100.443095, 38.102796 ], "pop" : 326, "state" : "KS" } +{ "_id" : "67857", "city" : "KENDALL", "loc" : [ -101.596883, 37.963657 ], "pop" : 86, "state" : "KS" } +{ "_id" : "67858", "city" : "KINGSDOWN", "loc" : [ -99.751553, 37.52138 ], "pop" : 124, "state" : "KS" } +{ "_id" : "67859", "city" : "KISMET", "loc" : [ -100.750645, 37.133601 ], "pop" : 1195, "state" : "KS" } +{ "_id" : "67860", "city" : "LAKIN", "loc" : [ -101.271297, 37.938197 ], "pop" : 2950, "state" : "KS" } +{ "_id" : "67861", "city" : "LEOTI", "loc" : [ -101.358851, 38.498726 ], "pop" : 2604, "state" : "KS" } +{ "_id" : "67862", "city" : "MANTER", "loc" : [ -101.910869, 37.545094 ], "pop" : 354, "state" : "KS" } +{ "_id" : "67863", "city" : "MODOC", "loc" : [ -101.199231, 38.482523 ], "pop" : 154, "state" : "KS" } +{ "_id" : "67864", "city" : "MEADE", "loc" : [ -100.336378, 37.282137 ], "pop" : 1949, "state" : "KS" } +{ "_id" : "67865", "city" : "BLOOM", "loc" : [ -99.960358, 37.42454 ], "pop" : 999, "state" : "KS" } +{ "_id" : "67867", "city" : "MONTEZUMA", "loc" : [ -100.446127, 37.601638 ], "pop" : 1431, "state" : "KS" } +{ "_id" : "67868", "city" : "PIERCEVILLE", "loc" : [ -100.71177, 37.907739 ], "pop" : 495, "state" : "KS" } +{ "_id" : "67869", "city" : "PLAINS", "loc" : [ -100.573174, 37.270106 ], "pop" : 1417, "state" : "KS" } +{ "_id" : "67870", "city" : "SATANTA", "loc" : [ -100.96908, 37.440916 ], "pop" : 1881, "state" : "KS" } +{ "_id" : "67871", "city" : "FRIEND", "loc" : [ -100.899331, 38.47994 ], "pop" : 4476, "state" : "KS" } +{ "_id" : "67874", "city" : "SHIELDS", "loc" : [ -100.417699, 38.620794 ], "pop" : 158, "state" : "KS" } +{ "_id" : "67876", "city" : "SPEARVILLE", "loc" : [ -99.737041, 37.823473 ], "pop" : 1361, "state" : "KS" } +{ "_id" : "67877", "city" : "SUBLETTE", "loc" : [ -100.820775, 37.522148 ], "pop" : 2364, "state" : "KS" } +{ "_id" : "67878", "city" : "SYRACUSE", "loc" : [ -101.768654, 37.982581 ], "pop" : 2302, "state" : "KS" } +{ "_id" : "67879", "city" : "TRIBUNE", "loc" : [ -101.765584, 38.496219 ], "pop" : 1774, "state" : "KS" } +{ "_id" : "67880", "city" : "ULYSSES", "loc" : [ -101.348846, 37.579174 ], "pop" : 7159, "state" : "KS" } +{ "_id" : "67882", "city" : "WRIGHT", "loc" : [ -99.923766, 37.767638 ], "pop" : 759, "state" : "KS" } +{ "_id" : "67901", "city" : "LIBERAL", "loc" : [ -100.92857, 37.043789 ], "pop" : 17189, "state" : "KS" } +{ "_id" : "67950", "city" : "ELKHART", "loc" : [ -101.901244, 37.015448 ], "pop" : 2562, "state" : "KS" } +{ "_id" : "67951", "city" : "HUGOTON", "loc" : [ -101.334614, 37.168226 ], "pop" : 4244, "state" : "KS" } +{ "_id" : "67952", "city" : "MOSCOW", "loc" : [ -101.242699, 37.317175 ], "pop" : 804, "state" : "KS" } +{ "_id" : "67953", "city" : "RICHFIELD", "loc" : [ -101.700382, 37.283364 ], "pop" : 269, "state" : "KS" } +{ "_id" : "67954", "city" : "ROLLA", "loc" : [ -101.644683, 37.108881 ], "pop" : 649, "state" : "KS" } +{ "_id" : "68001", "city" : "ABIE", "loc" : [ -96.956282, 41.347901 ], "pop" : 282, "state" : "NE" } +{ "_id" : "68002", "city" : "ARLINGTON", "loc" : [ -96.306974, 41.441654 ], "pop" : 2075, "state" : "NE" } +{ "_id" : "68003", "city" : "ASHLAND", "loc" : [ -96.39041, 41.05411 ], "pop" : 3296, "state" : "NE" } +{ "_id" : "68004", "city" : "BANCROFT", "loc" : [ -96.61714600000001, 42.026716 ], "pop" : 913, "state" : "NE" } +{ "_id" : "68005", "city" : "BELLEVUE", "loc" : [ -95.909932, 41.149663 ], "pop" : 24133, "state" : "NE" } +{ "_id" : "68007", "city" : "BENNINGTON", "loc" : [ -96.15752500000001, 41.362262 ], "pop" : 1372, "state" : "NE" } +{ "_id" : "68008", "city" : "BLAIR", "loc" : [ -96.161666, 41.545376 ], "pop" : 9059, "state" : "NE" } +{ "_id" : "68014", "city" : "BRUNO", "loc" : [ -96.964612, 41.271771 ], "pop" : 366, "state" : "NE" } +{ "_id" : "68015", "city" : "CEDAR BLUFFS", "loc" : [ -96.569115, 41.383492 ], "pop" : 1911, "state" : "NE" } +{ "_id" : "68017", "city" : "CERESCO", "loc" : [ -96.639769, 41.06807 ], "pop" : 1237, "state" : "NE" } +{ "_id" : "68018", "city" : "COLON", "loc" : [ -96.614132, 41.288261 ], "pop" : 290, "state" : "NE" } +{ "_id" : "68019", "city" : "CRAIG", "loc" : [ -96.392398, 41.771497 ], "pop" : 574, "state" : "NE" } +{ "_id" : "68020", "city" : "DECATUR", "loc" : [ -96.259456, 41.996553 ], "pop" : 975, "state" : "NE" } +{ "_id" : "68022", "city" : "ELKHORN", "loc" : [ -96.24308000000001, 41.275647 ], "pop" : 8508, "state" : "NE" } +{ "_id" : "68023", "city" : "FORT CALHOUN", "loc" : [ -96.032375, 41.437281 ], "pop" : 2833, "state" : "NE" } +{ "_id" : "68025", "city" : "FREMONT", "loc" : [ -96.494468, 41.441637 ], "pop" : 26498, "state" : "NE" } +{ "_id" : "68028", "city" : "GRETNA", "loc" : [ -96.24583699999999, 41.134458 ], "pop" : 3236, "state" : "NE" } +{ "_id" : "68029", "city" : "HERMAN", "loc" : [ -96.286942, 41.652381 ], "pop" : 988, "state" : "NE" } +{ "_id" : "68031", "city" : "HOOPER", "loc" : [ -96.523231, 41.641371 ], "pop" : 1821, "state" : "NE" } +{ "_id" : "68033", "city" : "ITHACA", "loc" : [ -96.529785, 41.174849 ], "pop" : 359, "state" : "NE" } +{ "_id" : "68034", "city" : "KENNARD", "loc" : [ -96.16192700000001, 41.471139 ], "pop" : 1652, "state" : "NE" } +{ "_id" : "68035", "city" : "LESHARA", "loc" : [ -96.449805, 41.346597 ], "pop" : 492, "state" : "NE" } +{ "_id" : "68036", "city" : "LINWOOD", "loc" : [ -96.93987300000001, 41.412926 ], "pop" : 175, "state" : "NE" } +{ "_id" : "68037", "city" : "LOUISVILLE", "loc" : [ -96.194817, 40.996667 ], "pop" : 1998, "state" : "NE" } +{ "_id" : "68038", "city" : "LYONS", "loc" : [ -96.46613600000001, 41.94416 ], "pop" : 1613, "state" : "NE" } +{ "_id" : "68039", "city" : "MACY", "loc" : [ -96.35886499999999, 42.117739 ], "pop" : 1464, "state" : "NE" } +{ "_id" : "68040", "city" : "MALMO", "loc" : [ -96.73271800000001, 41.298424 ], "pop" : 584, "state" : "NE" } +{ "_id" : "68041", "city" : "MEAD", "loc" : [ -96.49614099999999, 41.23929 ], "pop" : 786, "state" : "NE" } +{ "_id" : "68044", "city" : "NICKERSON", "loc" : [ -96.49042300000001, 41.523293 ], "pop" : 691, "state" : "NE" } +{ "_id" : "68045", "city" : "OAKLAND", "loc" : [ -96.46706399999999, 41.838426 ], "pop" : 1855, "state" : "NE" } +{ "_id" : "68046", "city" : "PAPILLION", "loc" : [ -96.037052, 41.152257 ], "pop" : 7177, "state" : "NE" } +{ "_id" : "68047", "city" : "PENDER", "loc" : [ -96.718907, 42.117719 ], "pop" : 1818, "state" : "NE" } +{ "_id" : "68048", "city" : "PLATTSMOUTH", "loc" : [ -95.913933, 40.999194 ], "pop" : 10387, "state" : "NE" } +{ "_id" : "68050", "city" : "PRAGUE", "loc" : [ -96.830084, 41.303598 ], "pop" : 819, "state" : "NE" } +{ "_id" : "68054", "city" : "RICHFIELD", "loc" : [ -96.045627, 41.090522 ], "pop" : 822, "state" : "NE" } +{ "_id" : "68055", "city" : "ROSALIE", "loc" : [ -96.49286600000001, 42.057435 ], "pop" : 424, "state" : "NE" } +{ "_id" : "68057", "city" : "SCRIBNER", "loc" : [ -96.64409499999999, 41.663035 ], "pop" : 1485, "state" : "NE" } +{ "_id" : "68059", "city" : "SPRINGFIELD", "loc" : [ -96.143811, 41.07649 ], "pop" : 2961, "state" : "NE" } +{ "_id" : "68061", "city" : "TEKAMAH", "loc" : [ -96.228144, 41.781898 ], "pop" : 2881, "state" : "NE" } +{ "_id" : "68062", "city" : "THURSTON", "loc" : [ -96.69035599999999, 42.188161 ], "pop" : 362, "state" : "NE" } +{ "_id" : "68064", "city" : "VALLEY", "loc" : [ -96.346288, 41.318581 ], "pop" : 3067, "state" : "NE" } +{ "_id" : "68065", "city" : "VALPARAISO", "loc" : [ -96.80914900000001, 41.084304 ], "pop" : 1095, "state" : "NE" } +{ "_id" : "68066", "city" : "WAHOO", "loc" : [ -96.62194599999999, 41.211723 ], "pop" : 4258, "state" : "NE" } +{ "_id" : "68067", "city" : "WALTHILL", "loc" : [ -96.480294, 42.148543 ], "pop" : 1212, "state" : "NE" } +{ "_id" : "68069", "city" : "WATERLOO", "loc" : [ -96.306318, 41.27024 ], "pop" : 1468, "state" : "NE" } +{ "_id" : "68070", "city" : "WESTON", "loc" : [ -96.769075, 41.181083 ], "pop" : 834, "state" : "NE" } +{ "_id" : "68071", "city" : "WINNEBAGO", "loc" : [ -96.468507, 42.233851 ], "pop" : 1449, "state" : "NE" } +{ "_id" : "68073", "city" : "YUTAN", "loc" : [ -96.393247, 41.23403 ], "pop" : 1838, "state" : "NE" } +{ "_id" : "68102", "city" : "OMAHA", "loc" : [ -95.940909, 41.258961 ], "pop" : 4963, "state" : "NE" } +{ "_id" : "68104", "city" : "OMAHA", "loc" : [ -95.999888, 41.29186 ], "pop" : 35325, "state" : "NE" } +{ "_id" : "68105", "city" : "OMAHA", "loc" : [ -95.96293799999999, 41.243502 ], "pop" : 23007, "state" : "NE" } +{ "_id" : "68106", "city" : "OMAHA", "loc" : [ -95.997972, 41.240322 ], "pop" : 20622, "state" : "NE" } +{ "_id" : "68107", "city" : "OMAHA", "loc" : [ -95.955877, 41.206783 ], "pop" : 23890, "state" : "NE" } +{ "_id" : "68108", "city" : "OMAHA", "loc" : [ -95.93355699999999, 41.238198 ], "pop" : 12721, "state" : "NE" } +{ "_id" : "68110", "city" : "OMAHA", "loc" : [ -95.936072, 41.293342 ], "pop" : 8718, "state" : "NE" } +{ "_id" : "68111", "city" : "OMAHA", "loc" : [ -95.965045, 41.296212 ], "pop" : 28453, "state" : "NE" } +{ "_id" : "68112", "city" : "OMAHA", "loc" : [ -95.959684, 41.329614 ], "pop" : 12075, "state" : "NE" } +{ "_id" : "68113", "city" : "OFFUTT A F B", "loc" : [ -95.907601, 41.114755 ], "pop" : 2894, "state" : "NE" } +{ "_id" : "68114", "city" : "OMAHA", "loc" : [ -96.049306, 41.265624 ], "pop" : 16573, "state" : "NE" } +{ "_id" : "68116", "city" : "OMAHA", "loc" : [ -96.149462, 41.287854 ], "pop" : 875, "state" : "NE" } +{ "_id" : "68117", "city" : "OMAHA", "loc" : [ -95.995301, 41.206403 ], "pop" : 8347, "state" : "NE" } +{ "_id" : "68118", "city" : "OMAHA", "loc" : [ -96.166118, 41.260636 ], "pop" : 3593, "state" : "NE" } +{ "_id" : "68122", "city" : "OMAHA", "loc" : [ -96.045772, 41.333312 ], "pop" : 2556, "state" : "NE" } +{ "_id" : "68123", "city" : "OMAHA", "loc" : [ -95.95599, 41.122265 ], "pop" : 20362, "state" : "NE" } +{ "_id" : "68124", "city" : "OMAHA", "loc" : [ -96.049515, 41.233814 ], "pop" : 16340, "state" : "NE" } +{ "_id" : "68127", "city" : "RALSTON", "loc" : [ -96.055019, 41.201782 ], "pop" : 22434, "state" : "NE" } +{ "_id" : "68128", "city" : "PAPILLION", "loc" : [ -96.040256, 41.171983 ], "pop" : 15882, "state" : "NE" } +{ "_id" : "68130", "city" : "OMAHA", "loc" : [ -96.168815, 41.235452 ], "pop" : 7291, "state" : "NE" } +{ "_id" : "68131", "city" : "OMAHA", "loc" : [ -95.963891, 41.264658 ], "pop" : 14069, "state" : "NE" } +{ "_id" : "68132", "city" : "OMAHA", "loc" : [ -95.995954, 41.265746 ], "pop" : 13730, "state" : "NE" } +{ "_id" : "68133", "city" : "PAPILLION", "loc" : [ -96.013076, 41.141564 ], "pop" : 842, "state" : "NE" } +{ "_id" : "68134", "city" : "OMAHA", "loc" : [ -96.054569, 41.294917 ], "pop" : 27571, "state" : "NE" } +{ "_id" : "68135", "city" : "OMAHA", "loc" : [ -96.169827, 41.210419 ], "pop" : 2503, "state" : "NE" } +{ "_id" : "68136", "city" : "OMAHA", "loc" : [ -96.209633, 41.168343 ], "pop" : 226, "state" : "NE" } +{ "_id" : "68137", "city" : "MILLARD", "loc" : [ -96.12446199999999, 41.201067 ], "pop" : 23894, "state" : "NE" } +{ "_id" : "68138", "city" : "PAPILLION", "loc" : [ -96.129718, 41.177724 ], "pop" : 8845, "state" : "NE" } +{ "_id" : "68142", "city" : "OMAHA", "loc" : [ -96.090109, 41.335904 ], "pop" : 1249, "state" : "NE" } +{ "_id" : "68144", "city" : "MILLARD", "loc" : [ -96.116772, 41.235599 ], "pop" : 26450, "state" : "NE" } +{ "_id" : "68147", "city" : "OMAHA", "loc" : [ -95.95915599999999, 41.181508 ], "pop" : 9205, "state" : "NE" } +{ "_id" : "68152", "city" : "OMAHA", "loc" : [ -96.00029499999999, 41.334557 ], "pop" : 6518, "state" : "NE" } +{ "_id" : "68154", "city" : "OMAHA", "loc" : [ -96.120611, 41.264167 ], "pop" : 21847, "state" : "NE" } +{ "_id" : "68157", "city" : "PAPILLION", "loc" : [ -95.995378, 41.183423 ], "pop" : 6112, "state" : "NE" } +{ "_id" : "68164", "city" : "OMAHA", "loc" : [ -96.100793, 41.29552 ], "pop" : 16301, "state" : "NE" } +{ "_id" : "68301", "city" : "ADAMS", "loc" : [ -96.53955999999999, 40.457571 ], "pop" : 1127, "state" : "NE" } +{ "_id" : "68303", "city" : "ALEXANDRIA", "loc" : [ -97.40385499999999, 40.261446 ], "pop" : 429, "state" : "NE" } +{ "_id" : "68304", "city" : "ALVO", "loc" : [ -96.40355700000001, 40.899185 ], "pop" : 447, "state" : "NE" } +{ "_id" : "68305", "city" : "AUBURN", "loc" : [ -95.85264599999999, 40.378889 ], "pop" : 4296, "state" : "NE" } +{ "_id" : "68307", "city" : "AVOCA", "loc" : [ -96.095736, 40.815941 ], "pop" : 444, "state" : "NE" } +{ "_id" : "68310", "city" : "BEATRICE", "loc" : [ -96.743494, 40.270509 ], "pop" : 15528, "state" : "NE" } +{ "_id" : "68313", "city" : "BEAVER CROSSING", "loc" : [ -97.29135599999999, 40.788658 ], "pop" : 827, "state" : "NE" } +{ "_id" : "68314", "city" : "BEE", "loc" : [ -97.07446899999999, 41.000675 ], "pop" : 447, "state" : "NE" } +{ "_id" : "68315", "city" : "BELVIDERE", "loc" : [ -97.55541599999999, 40.25101 ], "pop" : 233, "state" : "NE" } +{ "_id" : "68316", "city" : "BENEDICT", "loc" : [ -97.60292099999999, 41.003268 ], "pop" : 646, "state" : "NE" } +{ "_id" : "68317", "city" : "BENNET", "loc" : [ -96.5134, 40.63822 ], "pop" : 1611, "state" : "NE" } +{ "_id" : "68318", "city" : "BLUE SPRINGS", "loc" : [ -96.659037, 40.140684 ], "pop" : 504, "state" : "NE" } +{ "_id" : "68319", "city" : "BRADSHAW", "loc" : [ -97.760699, 40.920718 ], "pop" : 716, "state" : "NE" } +{ "_id" : "68320", "city" : "BROCK", "loc" : [ -95.98014499999999, 40.477227 ], "pop" : 400, "state" : "NE" } +{ "_id" : "68321", "city" : "BROWNVILLE", "loc" : [ -95.69347999999999, 40.399447 ], "pop" : 475, "state" : "NE" } +{ "_id" : "68322", "city" : "BRUNING", "loc" : [ -97.557276, 40.330157 ], "pop" : 496, "state" : "NE" } +{ "_id" : "68323", "city" : "BURCHARD", "loc" : [ -96.348806, 40.105743 ], "pop" : 507, "state" : "NE" } +{ "_id" : "68324", "city" : "BURR", "loc" : [ -96.238401, 40.560057 ], "pop" : 500, "state" : "NE" } +{ "_id" : "68325", "city" : "BYRON", "loc" : [ -97.761236, 40.02688 ], "pop" : 357, "state" : "NE" } +{ "_id" : "68326", "city" : "CARLETON", "loc" : [ -97.671909, 40.300534 ], "pop" : 323, "state" : "NE" } +{ "_id" : "68327", "city" : "CHESTER", "loc" : [ -97.61969000000001, 40.028954 ], "pop" : 527, "state" : "NE" } +{ "_id" : "68328", "city" : "CLATONIA", "loc" : [ -96.855513, 40.47236 ], "pop" : 502, "state" : "NE" } +{ "_id" : "68329", "city" : "COOK", "loc" : [ -96.15262, 40.498628 ], "pop" : 592, "state" : "NE" } +{ "_id" : "68330", "city" : "CORDOVA", "loc" : [ -97.340721, 40.718477 ], "pop" : 241, "state" : "NE" } +{ "_id" : "68331", "city" : "CORTLAND", "loc" : [ -96.716627, 40.497599 ], "pop" : 691, "state" : "NE" } +{ "_id" : "68332", "city" : "CRAB ORCHARD", "loc" : [ -96.411569, 40.316648 ], "pop" : 169, "state" : "NE" } +{ "_id" : "68333", "city" : "CRETE", "loc" : [ -96.956676, 40.619302 ], "pop" : 6390, "state" : "NE" } +{ "_id" : "68335", "city" : "DAVENPORT", "loc" : [ -97.80495999999999, 40.310782 ], "pop" : 488, "state" : "NE" } +{ "_id" : "68336", "city" : "DAVEY", "loc" : [ -96.641379, 41.002543 ], "pop" : 413, "state" : "NE" } +{ "_id" : "68337", "city" : "DAWSON", "loc" : [ -95.834097, 40.137697 ], "pop" : 359, "state" : "NE" } +{ "_id" : "68338", "city" : "DAYKIN", "loc" : [ -97.304306, 40.31916 ], "pop" : 324, "state" : "NE" } +{ "_id" : "68339", "city" : "DENTON", "loc" : [ -96.853157, 40.700905 ], "pop" : 1035, "state" : "NE" } +{ "_id" : "68340", "city" : "DESHLER", "loc" : [ -97.730007, 40.138668 ], "pop" : 1108, "state" : "NE" } +{ "_id" : "68341", "city" : "DE WITT", "loc" : [ -96.93376600000001, 40.39438 ], "pop" : 821, "state" : "NE" } +{ "_id" : "68342", "city" : "DILLER", "loc" : [ -96.949487, 40.119201 ], "pop" : 507, "state" : "NE" } +{ "_id" : "68343", "city" : "DORCHESTER", "loc" : [ -97.10556200000001, 40.649858 ], "pop" : 832, "state" : "NE" } +{ "_id" : "68344", "city" : "DOUGLAS", "loc" : [ -96.396958, 40.583824 ], "pop" : 369, "state" : "NE" } +{ "_id" : "68345", "city" : "DU BOIS", "loc" : [ -96.05747700000001, 40.037486 ], "pop" : 315, "state" : "NE" } +{ "_id" : "68346", "city" : "DUNBAR", "loc" : [ -96.013575, 40.659156 ], "pop" : 619, "state" : "NE" } +{ "_id" : "68347", "city" : "EAGLE", "loc" : [ -96.42896500000001, 40.816909 ], "pop" : 1561, "state" : "NE" } +{ "_id" : "68348", "city" : "ELK CREEK", "loc" : [ -96.142128, 40.2977 ], "pop" : 356, "state" : "NE" } +{ "_id" : "68349", "city" : "ELMWOOD", "loc" : [ -96.29439499999999, 40.837811 ], "pop" : 879, "state" : "NE" } +{ "_id" : "68350", "city" : "ENDICOTT", "loc" : [ -97.09378700000001, 40.073407 ], "pop" : 282, "state" : "NE" } +{ "_id" : "68351", "city" : "EXETER", "loc" : [ -97.44238799999999, 40.634062 ], "pop" : 934, "state" : "NE" } +{ "_id" : "68352", "city" : "FAIRBURY", "loc" : [ -97.18391800000001, 40.148817 ], "pop" : 5763, "state" : "NE" } +{ "_id" : "68354", "city" : "FAIRMONT", "loc" : [ -97.58729, 40.6404 ], "pop" : 968, "state" : "NE" } +{ "_id" : "68355", "city" : "FALLS CITY", "loc" : [ -95.593148, 40.074193 ], "pop" : 6069, "state" : "NE" } +{ "_id" : "68357", "city" : "FILLEY", "loc" : [ -96.53013199999999, 40.294606 ], "pop" : 352, "state" : "NE" } +{ "_id" : "68358", "city" : "FIRTH", "loc" : [ -96.614023, 40.558595 ], "pop" : 1095, "state" : "NE" } +{ "_id" : "68359", "city" : "FRIEND", "loc" : [ -97.273928, 40.636792 ], "pop" : 1707, "state" : "NE" } +{ "_id" : "68360", "city" : "GARLAND", "loc" : [ -96.97019, 40.941189 ], "pop" : 795, "state" : "NE" } +{ "_id" : "68361", "city" : "GENEVA", "loc" : [ -97.60962499999999, 40.527731 ], "pop" : 3224, "state" : "NE" } +{ "_id" : "68362", "city" : "GILEAD", "loc" : [ -97.42713999999999, 40.146986 ], "pop" : 169, "state" : "NE" } +{ "_id" : "68364", "city" : "GOEHNER", "loc" : [ -97.205456, 40.830208 ], "pop" : 457, "state" : "NE" } +{ "_id" : "68365", "city" : "GRAFTON", "loc" : [ -97.740263, 40.640193 ], "pop" : 302, "state" : "NE" } +{ "_id" : "68366", "city" : "GREENWOOD", "loc" : [ -96.42583999999999, 40.97064 ], "pop" : 813, "state" : "NE" } +{ "_id" : "68367", "city" : "GRESHAM", "loc" : [ -97.407937, 41.020952 ], "pop" : 426, "state" : "NE" } +{ "_id" : "68368", "city" : "HALLAM", "loc" : [ -96.754518, 40.554734 ], "pop" : 663, "state" : "NE" } +{ "_id" : "68370", "city" : "HEBRON", "loc" : [ -97.605228, 40.172807 ], "pop" : 2305, "state" : "NE" } +{ "_id" : "68371", "city" : "HENDERSON", "loc" : [ -97.797865, 40.781374 ], "pop" : 1615, "state" : "NE" } +{ "_id" : "68372", "city" : "HOLLAND", "loc" : [ -96.62492399999999, 40.624558 ], "pop" : 1495, "state" : "NE" } +{ "_id" : "68374", "city" : "HOLMESVILLE", "loc" : [ -96.63263499999999, 40.220245 ], "pop" : 353, "state" : "NE" } +{ "_id" : "68375", "city" : "HUBBELL", "loc" : [ -97.473467, 40.045581 ], "pop" : 200, "state" : "NE" } +{ "_id" : "68376", "city" : "HUMBOLDT", "loc" : [ -95.931079, 40.156595 ], "pop" : 1806, "state" : "NE" } +{ "_id" : "68377", "city" : "JANSEN", "loc" : [ -97.02442600000001, 40.207425 ], "pop" : 579, "state" : "NE" } +{ "_id" : "68378", "city" : "JOHNSON", "loc" : [ -95.988276, 40.401623 ], "pop" : 747, "state" : "NE" } +{ "_id" : "68379", "city" : "JULIAN", "loc" : [ -95.85046, 40.486056 ], "pop" : 313, "state" : "NE" } +{ "_id" : "68380", "city" : "LEWISTON", "loc" : [ -96.40494099999999, 40.230879 ], "pop" : 189, "state" : "NE" } +{ "_id" : "68381", "city" : "LIBERTY", "loc" : [ -96.523668, 40.075286 ], "pop" : 422, "state" : "NE" } +{ "_id" : "68401", "city" : "MC COOL JUNCTION", "loc" : [ -97.593666, 40.744181 ], "pop" : 820, "state" : "NE" } +{ "_id" : "68402", "city" : "MALCOLM", "loc" : [ -96.859966, 40.90913 ], "pop" : 954, "state" : "NE" } +{ "_id" : "68404", "city" : "MARTELL", "loc" : [ -96.744227, 40.651434 ], "pop" : 864, "state" : "NE" } +{ "_id" : "68405", "city" : "MILFORD", "loc" : [ -97.05763, 40.763153 ], "pop" : 3258, "state" : "NE" } +{ "_id" : "68406", "city" : "MILLIGAN", "loc" : [ -97.39968399999999, 40.495163 ], "pop" : 477, "state" : "NE" } +{ "_id" : "68407", "city" : "MURDOCK", "loc" : [ -96.28482700000001, 40.919034 ], "pop" : 622, "state" : "NE" } +{ "_id" : "68409", "city" : "MURRAY", "loc" : [ -95.922668, 40.91999 ], "pop" : 1145, "state" : "NE" } +{ "_id" : "68410", "city" : "NEBRASKA CITY", "loc" : [ -95.86190000000001, 40.674746 ], "pop" : 7668, "state" : "NE" } +{ "_id" : "68413", "city" : "NEHAWKA", "loc" : [ -95.993045, 40.832978 ], "pop" : 423, "state" : "NE" } +{ "_id" : "68414", "city" : "NEMAHA", "loc" : [ -95.69132999999999, 40.319818 ], "pop" : 428, "state" : "NE" } +{ "_id" : "68415", "city" : "ODELL", "loc" : [ -96.801924, 40.045128 ], "pop" : 642, "state" : "NE" } +{ "_id" : "68416", "city" : "OHIOWA", "loc" : [ -97.442712, 40.406507 ], "pop" : 274, "state" : "NE" } +{ "_id" : "68417", "city" : "OTOE", "loc" : [ -96.132867, 40.735485 ], "pop" : 696, "state" : "NE" } +{ "_id" : "68418", "city" : "PALMYRA", "loc" : [ -96.39990299999999, 40.704964 ], "pop" : 1012, "state" : "NE" } +{ "_id" : "68420", "city" : "PAWNEE CITY", "loc" : [ -96.150926, 40.109291 ], "pop" : 1434, "state" : "NE" } +{ "_id" : "68421", "city" : "PERU", "loc" : [ -95.731166, 40.476643 ], "pop" : 1321, "state" : "NE" } +{ "_id" : "68422", "city" : "PICKRELL", "loc" : [ -96.734444, 40.382117 ], "pop" : 512, "state" : "NE" } +{ "_id" : "68423", "city" : "PLEASANT DALE", "loc" : [ -96.95128, 40.813329 ], "pop" : 678, "state" : "NE" } +{ "_id" : "68424", "city" : "PLYMOUTH", "loc" : [ -97.001169, 40.303896 ], "pop" : 872, "state" : "NE" } +{ "_id" : "68428", "city" : "AGNEW", "loc" : [ -96.78294200000001, 40.985331 ], "pop" : 1218, "state" : "NE" } +{ "_id" : "68429", "city" : "REYNOLDS", "loc" : [ -97.318243, 40.059372 ], "pop" : 184, "state" : "NE" } +{ "_id" : "68430", "city" : "ROCA", "loc" : [ -96.63908499999999, 40.670195 ], "pop" : 517, "state" : "NE" } +{ "_id" : "68431", "city" : "RULO", "loc" : [ -95.42921800000001, 40.053619 ], "pop" : 312, "state" : "NE" } +{ "_id" : "68432", "city" : "SAINT MARY", "loc" : [ -96.28997200000001, 40.444756 ], "pop" : 259, "state" : "NE" } +{ "_id" : "68433", "city" : "SALEM", "loc" : [ -95.727261, 40.061953 ], "pop" : 280, "state" : "NE" } +{ "_id" : "68434", "city" : "SEWARD", "loc" : [ -97.09661800000001, 40.906609 ], "pop" : 7082, "state" : "NE" } +{ "_id" : "68436", "city" : "SHICKLEY", "loc" : [ -97.714298, 40.407677 ], "pop" : 722, "state" : "NE" } +{ "_id" : "68437", "city" : "SHUBERT", "loc" : [ -95.689454, 40.232479 ], "pop" : 320, "state" : "NE" } +{ "_id" : "68439", "city" : "STAPLEHURST", "loc" : [ -97.18585899999999, 40.984455 ], "pop" : 597, "state" : "NE" } +{ "_id" : "68440", "city" : "STEELE CITY", "loc" : [ -96.990712, 40.042492 ], "pop" : 248, "state" : "NE" } +{ "_id" : "68441", "city" : "STEINAUER", "loc" : [ -96.230215, 40.216885 ], "pop" : 378, "state" : "NE" } +{ "_id" : "68442", "city" : "STELLA", "loc" : [ -95.767989, 40.230345 ], "pop" : 342, "state" : "NE" } +{ "_id" : "68443", "city" : "STERLING", "loc" : [ -96.386655, 40.463743 ], "pop" : 840, "state" : "NE" } +{ "_id" : "68444", "city" : "STRANG", "loc" : [ -97.552132, 40.398105 ], "pop" : 202, "state" : "NE" } +{ "_id" : "68445", "city" : "SWANTON", "loc" : [ -97.08055, 40.384389 ], "pop" : 266, "state" : "NE" } +{ "_id" : "68446", "city" : "SYRACUSE", "loc" : [ -96.182407, 40.661386 ], "pop" : 1937, "state" : "NE" } +{ "_id" : "68447", "city" : "TABLE ROCK", "loc" : [ -96.081822, 40.187437 ], "pop" : 494, "state" : "NE" } +{ "_id" : "68448", "city" : "TALMAGE", "loc" : [ -96.013814, 40.558646 ], "pop" : 731, "state" : "NE" } +{ "_id" : "68450", "city" : "TECUMSEH", "loc" : [ -96.20495099999999, 40.369702 ], "pop" : 2457, "state" : "NE" } +{ "_id" : "68452", "city" : "ONG", "loc" : [ -97.861018, 40.396806 ], "pop" : 150, "state" : "NE" } +{ "_id" : "68453", "city" : "TOBIAS", "loc" : [ -97.318444, 40.426171 ], "pop" : 464, "state" : "NE" } +{ "_id" : "68454", "city" : "UNADILLA", "loc" : [ -96.282454, 40.691675 ], "pop" : 720, "state" : "NE" } +{ "_id" : "68455", "city" : "UNION", "loc" : [ -95.903739, 40.824452 ], "pop" : 689, "state" : "NE" } +{ "_id" : "68456", "city" : "UTICA", "loc" : [ -97.334431, 40.91685 ], "pop" : 1068, "state" : "NE" } +{ "_id" : "68457", "city" : "VERDON", "loc" : [ -95.716157, 40.142507 ], "pop" : 449, "state" : "NE" } +{ "_id" : "68458", "city" : "VIRGINIA", "loc" : [ -96.512145, 40.230877 ], "pop" : 226, "state" : "NE" } +{ "_id" : "68460", "city" : "WACO", "loc" : [ -97.453352, 40.919826 ], "pop" : 613, "state" : "NE" } +{ "_id" : "68461", "city" : "WALTON", "loc" : [ -96.535943, 40.797467 ], "pop" : 268, "state" : "NE" } +{ "_id" : "68462", "city" : "WAVERLY", "loc" : [ -96.525988, 40.92224 ], "pop" : 2545, "state" : "NE" } +{ "_id" : "68463", "city" : "WEEPING WATER", "loc" : [ -96.15282500000001, 40.873096 ], "pop" : 1910, "state" : "NE" } +{ "_id" : "68464", "city" : "WESTERN", "loc" : [ -97.197649, 40.415157 ], "pop" : 552, "state" : "NE" } +{ "_id" : "68465", "city" : "WILBER", "loc" : [ -96.975713, 40.482141 ], "pop" : 2016, "state" : "NE" } +{ "_id" : "68466", "city" : "WYMORE", "loc" : [ -96.661326, 40.112955 ], "pop" : 1935, "state" : "NE" } +{ "_id" : "68467", "city" : "YORK", "loc" : [ -97.582482, 40.866678 ], "pop" : 9592, "state" : "NE" } +{ "_id" : "68502", "city" : "LINCOLN", "loc" : [ -96.693763, 40.789282 ], "pop" : 27576, "state" : "NE" } +{ "_id" : "68503", "city" : "LINCOLN", "loc" : [ -96.67662300000001, 40.823339 ], "pop" : 14093, "state" : "NE" } +{ "_id" : "68504", "city" : "LINCOLN", "loc" : [ -96.653248, 40.839226 ], "pop" : 12756, "state" : "NE" } +{ "_id" : "68505", "city" : "LINCOLN", "loc" : [ -96.625193, 40.824674 ], "pop" : 13461, "state" : "NE" } +{ "_id" : "68506", "city" : "LINCOLN", "loc" : [ -96.643052, 40.784796 ], "pop" : 25903, "state" : "NE" } +{ "_id" : "68507", "city" : "LINCOLN", "loc" : [ -96.628874, 40.847265 ], "pop" : 12296, "state" : "NE" } +{ "_id" : "68508", "city" : "LINCOLN", "loc" : [ -96.700907, 40.814503 ], "pop" : 13716, "state" : "NE" } +{ "_id" : "68510", "city" : "LINCOLN", "loc" : [ -96.65445800000001, 40.806345 ], "pop" : 20948, "state" : "NE" } +{ "_id" : "68512", "city" : "LINCOLN", "loc" : [ -96.69460599999999, 40.756487 ], "pop" : 6139, "state" : "NE" } +{ "_id" : "68514", "city" : "LINCOLN", "loc" : [ -96.66108199999999, 40.925792 ], "pop" : 200, "state" : "NE" } +{ "_id" : "68516", "city" : "LINCOLN", "loc" : [ -96.652304, 40.756807 ], "pop" : 21213, "state" : "NE" } +{ "_id" : "68517", "city" : "LINCOLN", "loc" : [ -96.60450899999999, 40.931743 ], "pop" : 485, "state" : "NE" } +{ "_id" : "68520", "city" : "LINCOLN", "loc" : [ -96.56934099999999, 40.774441 ], "pop" : 1460, "state" : "NE" } +{ "_id" : "68521", "city" : "LINCOLN", "loc" : [ -96.711006, 40.851044 ], "pop" : 16067, "state" : "NE" } +{ "_id" : "68522", "city" : "LINCOLN", "loc" : [ -96.747871, 40.793407 ], "pop" : 4991, "state" : "NE" } +{ "_id" : "68523", "city" : "LINCOLN", "loc" : [ -96.75833900000001, 40.740766 ], "pop" : 685, "state" : "NE" } +{ "_id" : "68524", "city" : "LINCOLN", "loc" : [ -96.79434500000001, 40.852913 ], "pop" : 4321, "state" : "NE" } +{ "_id" : "68526", "city" : "LINCOLN", "loc" : [ -96.587817, 40.731386 ], "pop" : 526, "state" : "NE" } +{ "_id" : "68527", "city" : "LINCOLN", "loc" : [ -96.540053, 40.834708 ], "pop" : 617, "state" : "NE" } +{ "_id" : "68528", "city" : "LINCOLN", "loc" : [ -96.754496, 40.819541 ], "pop" : 2476, "state" : "NE" } +{ "_id" : "68531", "city" : "LINCOLN", "loc" : [ -96.71557199999999, 40.899397 ], "pop" : 310, "state" : "NE" } +{ "_id" : "68532", "city" : "LINCOLN", "loc" : [ -96.85509, 40.792159 ], "pop" : 391, "state" : "NE" } +{ "_id" : "68601", "city" : "RICHLAND", "loc" : [ -97.356469, 41.437225 ], "pop" : 23684, "state" : "NE" } +{ "_id" : "68620", "city" : "ALBION", "loc" : [ -97.999116, 41.704947 ], "pop" : 3788, "state" : "NE" } +{ "_id" : "68621", "city" : "AMES", "loc" : [ -96.646344, 41.461253 ], "pop" : 141, "state" : "NE" } +{ "_id" : "68622", "city" : "BARTLETT", "loc" : [ -98.556668, 41.8697 ], "pop" : 262, "state" : "NE" } +{ "_id" : "68623", "city" : "BELGRADE", "loc" : [ -98.08663799999999, 41.461077 ], "pop" : 268, "state" : "NE" } +{ "_id" : "68624", "city" : "BELLWOOD", "loc" : [ -97.274657, 41.347389 ], "pop" : 1199, "state" : "NE" } +{ "_id" : "68626", "city" : "BRAINARD", "loc" : [ -96.988226, 41.183151 ], "pop" : 570, "state" : "NE" } +{ "_id" : "68627", "city" : "CEDAR RAPIDS", "loc" : [ -98.15537999999999, 41.556407 ], "pop" : 728, "state" : "NE" } +{ "_id" : "68628", "city" : "CLARKS", "loc" : [ -97.846143, 41.232797 ], "pop" : 749, "state" : "NE" } +{ "_id" : "68629", "city" : "CLARKSON", "loc" : [ -97.105059, 41.696064 ], "pop" : 1235, "state" : "NE" } +{ "_id" : "68631", "city" : "CRESTON", "loc" : [ -97.368692, 41.660695 ], "pop" : 910, "state" : "NE" } +{ "_id" : "68632", "city" : "GARRISON", "loc" : [ -97.126229, 41.237315 ], "pop" : 3798, "state" : "NE" } +{ "_id" : "68633", "city" : "DODGE", "loc" : [ -96.818077, 41.681609 ], "pop" : 2151, "state" : "NE" } +{ "_id" : "68635", "city" : "DWIGHT", "loc" : [ -96.993143, 41.089388 ], "pop" : 462, "state" : "NE" } +{ "_id" : "68636", "city" : "ELGIN", "loc" : [ -98.07508199999999, 41.973239 ], "pop" : 1367, "state" : "NE" } +{ "_id" : "68637", "city" : "ERICSON", "loc" : [ -98.645323, 41.782804 ], "pop" : 311, "state" : "NE" } +{ "_id" : "68638", "city" : "FULLERTON", "loc" : [ -98.00536200000001, 41.366042 ], "pop" : 2087, "state" : "NE" } +{ "_id" : "68640", "city" : "GENOA", "loc" : [ -97.764011, 41.446776 ], "pop" : 2116, "state" : "NE" } +{ "_id" : "68641", "city" : "HOWELLS", "loc" : [ -96.985811, 41.696441 ], "pop" : 1122, "state" : "NE" } +{ "_id" : "68642", "city" : "HUMPHREY", "loc" : [ -97.498649, 41.670184 ], "pop" : 1818, "state" : "NE" } +{ "_id" : "68643", "city" : "LEIGH", "loc" : [ -97.232001, 41.673877 ], "pop" : 1225, "state" : "NE" } +{ "_id" : "68644", "city" : "LINDSAY", "loc" : [ -97.671134, 41.692634 ], "pop" : 973, "state" : "NE" } +{ "_id" : "68647", "city" : "MONROE", "loc" : [ -97.606075, 41.478255 ], "pop" : 799, "state" : "NE" } +{ "_id" : "68648", "city" : "MORSE BLUFF", "loc" : [ -96.786171, 41.417831 ], "pop" : 486, "state" : "NE" } +{ "_id" : "68649", "city" : "NORTH BEND", "loc" : [ -96.781328, 41.468924 ], "pop" : 1651, "state" : "NE" } +{ "_id" : "68650", "city" : "OCTAVIA", "loc" : [ -97.07021, 41.355323 ], "pop" : 361, "state" : "NE" } +{ "_id" : "68651", "city" : "OSCEOLA", "loc" : [ -97.557079, 41.196565 ], "pop" : 1398, "state" : "NE" } +{ "_id" : "68652", "city" : "PETERSBURG", "loc" : [ -98.084791, 41.858954 ], "pop" : 784, "state" : "NE" } +{ "_id" : "68653", "city" : "PLATTE CENTER", "loc" : [ -97.457616, 41.524114 ], "pop" : 1399, "state" : "NE" } +{ "_id" : "68654", "city" : "POLK", "loc" : [ -97.75237199999999, 41.117671 ], "pop" : 988, "state" : "NE" } +{ "_id" : "68655", "city" : "PRIMROSE", "loc" : [ -98.235455, 41.64054 ], "pop" : 255, "state" : "NE" } +{ "_id" : "68658", "city" : "RISING CITY", "loc" : [ -97.303174, 41.208219 ], "pop" : 697, "state" : "NE" } +{ "_id" : "68659", "city" : "ROGERS", "loc" : [ -96.949735, 41.469536 ], "pop" : 208, "state" : "NE" } +{ "_id" : "68660", "city" : "SAINT EDWARD", "loc" : [ -97.880116, 41.57076 ], "pop" : 1112, "state" : "NE" } +{ "_id" : "68661", "city" : "SCHUYLER", "loc" : [ -97.062832, 41.459128 ], "pop" : 5243, "state" : "NE" } +{ "_id" : "68662", "city" : "SHELBY", "loc" : [ -97.429536, 41.243544 ], "pop" : 1495, "state" : "NE" } +{ "_id" : "68663", "city" : "SILVER CREEK", "loc" : [ -97.667106, 41.318999 ], "pop" : 627, "state" : "NE" } +{ "_id" : "68665", "city" : "SPALDING", "loc" : [ -98.37146799999999, 41.687409 ], "pop" : 1053, "state" : "NE" } +{ "_id" : "68666", "city" : "STROMSBURG", "loc" : [ -97.574183, 41.111834 ], "pop" : 1765, "state" : "NE" } +{ "_id" : "68667", "city" : "ULYSSES", "loc" : [ -97.30901299999999, 41.089922 ], "pop" : 250, "state" : "NE" } +{ "_id" : "68669", "city" : "ULYSSES", "loc" : [ -97.19838799999999, 41.079059 ], "pop" : 440, "state" : "NE" } +{ "_id" : "68701", "city" : "NORFOLK", "loc" : [ -97.422898, 42.032914 ], "pop" : 25728, "state" : "NE" } +{ "_id" : "68710", "city" : "ALLEN", "loc" : [ -96.8574, 42.443667 ], "pop" : 1007, "state" : "NE" } +{ "_id" : "68711", "city" : "AMELIA", "loc" : [ -99.008036, 42.18088 ], "pop" : 196, "state" : "NE" } +{ "_id" : "68713", "city" : "ATKINSON", "loc" : [ -98.97608700000001, 42.548279 ], "pop" : 2321, "state" : "NE" } +{ "_id" : "68714", "city" : "BASSETT", "loc" : [ -99.538732, 42.576293 ], "pop" : 1344, "state" : "NE" } +{ "_id" : "68715", "city" : "BATTLE CREEK", "loc" : [ -97.598153, 41.994283 ], "pop" : 1448, "state" : "NE" } +{ "_id" : "68716", "city" : "BEEMER", "loc" : [ -96.81500800000001, 41.937422 ], "pop" : 948, "state" : "NE" } +{ "_id" : "68717", "city" : "BELDEN", "loc" : [ -97.195628, 42.402185 ], "pop" : 346, "state" : "NE" } +{ "_id" : "68718", "city" : "BLOOMFIELD", "loc" : [ -97.654494, 42.597824 ], "pop" : 1873, "state" : "NE" } +{ "_id" : "68719", "city" : "BRISTOW", "loc" : [ -98.60267, 42.880575 ], "pop" : 355, "state" : "NE" } +{ "_id" : "68720", "city" : "BRUNSWICK", "loc" : [ -97.944008, 42.351023 ], "pop" : 907, "state" : "NE" } +{ "_id" : "68722", "city" : "BUTTE", "loc" : [ -98.84590300000001, 42.912377 ], "pop" : 667, "state" : "NE" } +{ "_id" : "68723", "city" : "CARROLL", "loc" : [ -97.192612, 42.277009 ], "pop" : 576, "state" : "NE" } +{ "_id" : "68724", "city" : "CENTER", "loc" : [ -97.883567, 42.602451 ], "pop" : 264, "state" : "NE" } +{ "_id" : "68725", "city" : "CHAMBERS", "loc" : [ -98.737846, 42.191606 ], "pop" : 815, "state" : "NE" } +{ "_id" : "68726", "city" : "CLEARWATER", "loc" : [ -98.186761, 42.126562 ], "pop" : 919, "state" : "NE" } +{ "_id" : "68727", "city" : "COLERIDGE", "loc" : [ -97.17856399999999, 42.522992 ], "pop" : 1185, "state" : "NE" } +{ "_id" : "68728", "city" : "CONCORD", "loc" : [ -96.98103500000001, 42.381982 ], "pop" : 262, "state" : "NE" } +{ "_id" : "68729", "city" : "CREIGHTON", "loc" : [ -97.89323, 42.468053 ], "pop" : 1604, "state" : "NE" } +{ "_id" : "68730", "city" : "CROFTON", "loc" : [ -97.540589, 42.737028 ], "pop" : 1717, "state" : "NE" } +{ "_id" : "68731", "city" : "DAKOTA CITY", "loc" : [ -96.453608, 42.38074 ], "pop" : 3022, "state" : "NE" } +{ "_id" : "68732", "city" : "DIXON", "loc" : [ -96.97738099999999, 42.41853 ], "pop" : 226, "state" : "NE" } +{ "_id" : "68733", "city" : "EMERSON", "loc" : [ -96.71587, 42.285247 ], "pop" : 1471, "state" : "NE" } +{ "_id" : "68734", "city" : "EMMET", "loc" : [ -98.82377700000001, 42.474708 ], "pop" : 190, "state" : "NE" } +{ "_id" : "68735", "city" : "EWING", "loc" : [ -98.39813700000001, 42.185107 ], "pop" : 1300, "state" : "NE" } +{ "_id" : "68736", "city" : "FORDYCE", "loc" : [ -97.35666500000001, 42.730889 ], "pop" : 1059, "state" : "NE" } +{ "_id" : "68737", "city" : "FOSTER", "loc" : [ -97.658038, 42.269932 ], "pop" : 216, "state" : "NE" } +{ "_id" : "68739", "city" : "HARTINGTON", "loc" : [ -97.28367799999999, 42.623494 ], "pop" : 2806, "state" : "NE" } +{ "_id" : "68740", "city" : "HOSKINS", "loc" : [ -97.308435, 42.140839 ], "pop" : 784, "state" : "NE" } +{ "_id" : "68741", "city" : "HUBBARD", "loc" : [ -96.62242500000001, 42.413139 ], "pop" : 705, "state" : "NE" } +{ "_id" : "68742", "city" : "INMAN", "loc" : [ -98.538366, 42.376149 ], "pop" : 439, "state" : "NE" } +{ "_id" : "68743", "city" : "JACKSON", "loc" : [ -96.574335, 42.452877 ], "pop" : 406, "state" : "NE" } +{ "_id" : "68745", "city" : "LAUREL", "loc" : [ -97.08738099999999, 42.427036 ], "pop" : 1519, "state" : "NE" } +{ "_id" : "68746", "city" : "LYNCH", "loc" : [ -98.450433, 42.837275 ], "pop" : 496, "state" : "NE" } +{ "_id" : "68747", "city" : "MCLEAN", "loc" : [ -97.47511299999999, 42.392082 ], "pop" : 232, "state" : "NE" } +{ "_id" : "68748", "city" : "MADISON", "loc" : [ -97.47195000000001, 41.830786 ], "pop" : 3203, "state" : "NE" } +{ "_id" : "68749", "city" : "MAGNET", "loc" : [ -97.44072199999999, 42.475294 ], "pop" : 218, "state" : "NE" } +{ "_id" : "68751", "city" : "MASKELL", "loc" : [ -96.966978, 42.670245 ], "pop" : 218, "state" : "NE" } +{ "_id" : "68752", "city" : "MEADOW GROVE", "loc" : [ -97.73342599999999, 42.010184 ], "pop" : 939, "state" : "NE" } +{ "_id" : "68753", "city" : "MILLS", "loc" : [ -99.446647, 42.922527 ], "pop" : 329, "state" : "NE" } +{ "_id" : "68755", "city" : "NAPER", "loc" : [ -99.071027, 42.952091 ], "pop" : 521, "state" : "NE" } +{ "_id" : "68756", "city" : "NELIGH", "loc" : [ -98.01506999999999, 42.138926 ], "pop" : 2375, "state" : "NE" } +{ "_id" : "68757", "city" : "NEWCASTLE", "loc" : [ -96.87085, 42.620672 ], "pop" : 763, "state" : "NE" } +{ "_id" : "68758", "city" : "NEWMAN GROVE", "loc" : [ -97.773966, 41.74977 ], "pop" : 1482, "state" : "NE" } +{ "_id" : "68759", "city" : "NEWPORT", "loc" : [ -99.335887, 42.600089 ], "pop" : 344, "state" : "NE" } +{ "_id" : "68760", "city" : "VERDEL", "loc" : [ -97.912734, 42.776942 ], "pop" : 1051, "state" : "NE" } +{ "_id" : "68761", "city" : "OAKDALE", "loc" : [ -97.918644, 42.053585 ], "pop" : 1016, "state" : "NE" } +{ "_id" : "68762", "city" : "OBERT", "loc" : [ -97.07070899999999, 42.65767 ], "pop" : 204, "state" : "NE" } +{ "_id" : "68763", "city" : "ONEILL", "loc" : [ -98.645565, 42.485733 ], "pop" : 5782, "state" : "NE" } +{ "_id" : "68764", "city" : "ORCHARD", "loc" : [ -98.240853, 42.33987 ], "pop" : 1044, "state" : "NE" } +{ "_id" : "68765", "city" : "OSMOND", "loc" : [ -97.581998, 42.353936 ], "pop" : 1418, "state" : "NE" } +{ "_id" : "68766", "city" : "PAGE", "loc" : [ -98.39639, 42.411882 ], "pop" : 544, "state" : "NE" } +{ "_id" : "68767", "city" : "PIERCE", "loc" : [ -97.525604, 42.194323 ], "pop" : 2942, "state" : "NE" } +{ "_id" : "68768", "city" : "PILGER", "loc" : [ -97.268472, 42.040413 ], "pop" : 3122, "state" : "NE" } +{ "_id" : "68769", "city" : "PLAINVIEW", "loc" : [ -97.778615, 42.346701 ], "pop" : 1978, "state" : "NE" } +{ "_id" : "68770", "city" : "PONCA", "loc" : [ -96.712793, 42.56931 ], "pop" : 1316, "state" : "NE" } +{ "_id" : "68771", "city" : "RANDOLPH", "loc" : [ -97.34644299999999, 42.379778 ], "pop" : 1826, "state" : "NE" } +{ "_id" : "68772", "city" : "ROSE", "loc" : [ -99.444755, 42.256782 ], "pop" : 331, "state" : "NE" } +{ "_id" : "68773", "city" : "ROYAL", "loc" : [ -98.12462600000001, 42.294614 ], "pop" : 479, "state" : "NE" } +{ "_id" : "68774", "city" : "SAINT HELENA", "loc" : [ -97.358616, 42.818145 ], "pop" : 888, "state" : "NE" } +{ "_id" : "68776", "city" : "SOUTH SIOUX CITY", "loc" : [ -96.418161, 42.465615 ], "pop" : 12037, "state" : "NE" } +{ "_id" : "68777", "city" : "SPENCER", "loc" : [ -98.705853, 42.884936 ], "pop" : 796, "state" : "NE" } +{ "_id" : "68778", "city" : "SPRINGVIEW", "loc" : [ -99.80614799999999, 42.848785 ], "pop" : 700, "state" : "NE" } +{ "_id" : "68779", "city" : "STANTON", "loc" : [ -97.213955, 41.907559 ], "pop" : 3122, "state" : "NE" } +{ "_id" : "68780", "city" : "STUART", "loc" : [ -99.139563, 42.571307 ], "pop" : 1331, "state" : "NE" } +{ "_id" : "68781", "city" : "TILDEN", "loc" : [ -97.82229700000001, 42.049629 ], "pop" : 883, "state" : "NE" } +{ "_id" : "68783", "city" : "VERDIGRE", "loc" : [ -98.079278, 42.610111 ], "pop" : 1184, "state" : "NE" } +{ "_id" : "68784", "city" : "WAKEFIELD", "loc" : [ -96.877645, 42.273271 ], "pop" : 1858, "state" : "NE" } +{ "_id" : "68785", "city" : "WATERBURY", "loc" : [ -96.74478000000001, 42.460431 ], "pop" : 241, "state" : "NE" } +{ "_id" : "68786", "city" : "WAUSA", "loc" : [ -97.557616, 42.497265 ], "pop" : 1058, "state" : "NE" } +{ "_id" : "68787", "city" : "WAYNE", "loc" : [ -97.018579, 42.230439 ], "pop" : 6454, "state" : "NE" } +{ "_id" : "68788", "city" : "WEST POINT", "loc" : [ -96.731763, 41.84503 ], "pop" : 6463, "state" : "NE" } +{ "_id" : "68789", "city" : "WINNETOON", "loc" : [ -98.025408, 42.494565 ], "pop" : 395, "state" : "NE" } +{ "_id" : "68790", "city" : "WINSIDE", "loc" : [ -97.18250500000001, 42.167817 ], "pop" : 808, "state" : "NE" } +{ "_id" : "68791", "city" : "WISNER", "loc" : [ -96.91697499999999, 41.997994 ], "pop" : 1793, "state" : "NE" } +{ "_id" : "68792", "city" : "WYNOT", "loc" : [ -97.16780900000001, 42.739304 ], "pop" : 609, "state" : "NE" } +{ "_id" : "68801", "city" : "GRAND ISLAND", "loc" : [ -98.34106199999999, 40.921858 ], "pop" : 24173, "state" : "NE" } +{ "_id" : "68803", "city" : "GRAND ISLAND", "loc" : [ -98.387271, 40.928608 ], "pop" : 19337, "state" : "NE" } +{ "_id" : "68810", "city" : "ALDA", "loc" : [ -98.455135, 40.856923 ], "pop" : 872, "state" : "NE" } +{ "_id" : "68812", "city" : "AMHERST", "loc" : [ -99.260949, 40.849494 ], "pop" : 560, "state" : "NE" } +{ "_id" : "68813", "city" : "MILBURN", "loc" : [ -99.799149, 41.636214 ], "pop" : 566, "state" : "NE" } +{ "_id" : "68814", "city" : "ANSLEY", "loc" : [ -99.36452, 41.30193 ], "pop" : 853, "state" : "NE" } +{ "_id" : "68815", "city" : "ARCADIA", "loc" : [ -99.120468, 41.429305 ], "pop" : 609, "state" : "NE" } +{ "_id" : "68816", "city" : "ARCHER", "loc" : [ -98.118151, 41.178156 ], "pop" : 237, "state" : "NE" } +{ "_id" : "68817", "city" : "ASHTON", "loc" : [ -98.803352, 41.267184 ], "pop" : 505, "state" : "NE" } +{ "_id" : "68818", "city" : "AURORA", "loc" : [ -98.020107, 40.852838 ], "pop" : 5954, "state" : "NE" } +{ "_id" : "68819", "city" : "BERWYN", "loc" : [ -99.50157299999999, 41.347015 ], "pop" : 318, "state" : "NE" } +{ "_id" : "68820", "city" : "BOELUS", "loc" : [ -98.697551, 41.100278 ], "pop" : 533, "state" : "NE" } +{ "_id" : "68821", "city" : "BREWSTER", "loc" : [ -99.829196, 41.946705 ], "pop" : 246, "state" : "NE" } +{ "_id" : "68822", "city" : "BROKEN BOW", "loc" : [ -99.635452, 41.412586 ], "pop" : 4864, "state" : "NE" } +{ "_id" : "68823", "city" : "BURWELL", "loc" : [ -99.09952699999999, 41.807982 ], "pop" : 2141, "state" : "NE" } +{ "_id" : "68824", "city" : "CAIRO", "loc" : [ -98.61653800000001, 41.000183 ], "pop" : 976, "state" : "NE" } +{ "_id" : "68825", "city" : "CALLAWAY", "loc" : [ -99.993185, 41.248499 ], "pop" : 1100, "state" : "NE" } +{ "_id" : "68826", "city" : "CENTRAL CITY", "loc" : [ -98.001693, 41.121259 ], "pop" : 3783, "state" : "NE" } +{ "_id" : "68827", "city" : "CHAPMAN", "loc" : [ -98.221723, 40.985592 ], "pop" : 1503, "state" : "NE" } +{ "_id" : "68828", "city" : "COMSTOCK", "loc" : [ -99.27528100000001, 41.555254 ], "pop" : 331, "state" : "NE" } +{ "_id" : "68829", "city" : "COTESFIELD", "loc" : [ -98.655344, 41.34301 ], "pop" : 216, "state" : "NE" } +{ "_id" : "68831", "city" : "DANNEBROG", "loc" : [ -98.554564, 41.119156 ], "pop" : 890, "state" : "NE" } +{ "_id" : "68832", "city" : "DONIPHAN", "loc" : [ -98.37900999999999, 40.770031 ], "pop" : 1496, "state" : "NE" } +{ "_id" : "68833", "city" : "DUNNING", "loc" : [ -100.087271, 41.813107 ], "pop" : 225, "state" : "NE" } +{ "_id" : "68834", "city" : "EDDYVILLE", "loc" : [ -99.681009, 41.0079 ], "pop" : 229, "state" : "NE" } +{ "_id" : "68835", "city" : "ELBA", "loc" : [ -98.575622, 41.28644 ], "pop" : 310, "state" : "NE" } +{ "_id" : "68836", "city" : "ELM CREEK", "loc" : [ -99.372786, 40.730079 ], "pop" : 1256, "state" : "NE" } +{ "_id" : "68837", "city" : "ELYRIA", "loc" : [ -99.046656, 41.695655 ], "pop" : 305, "state" : "NE" } +{ "_id" : "68838", "city" : "FARWELL", "loc" : [ -98.648144, 41.220378 ], "pop" : 313, "state" : "NE" } +{ "_id" : "68840", "city" : "GIBBON", "loc" : [ -98.85435, 40.744445 ], "pop" : 1901, "state" : "NE" } +{ "_id" : "68841", "city" : "GILTNER", "loc" : [ -98.14344, 40.765402 ], "pop" : 522, "state" : "NE" } +{ "_id" : "68842", "city" : "GREELEY", "loc" : [ -98.529951, 41.552578 ], "pop" : 832, "state" : "NE" } +{ "_id" : "68843", "city" : "HAMPTON", "loc" : [ -97.884146, 40.923609 ], "pop" : 897, "state" : "NE" } +{ "_id" : "68844", "city" : "HAZARD", "loc" : [ -99.071859, 41.093368 ], "pop" : 285, "state" : "NE" } +{ "_id" : "68846", "city" : "HORDVILLE", "loc" : [ -97.88814499999999, 41.081253 ], "pop" : 405, "state" : "NE" } +{ "_id" : "68847", "city" : "KEARNEY", "loc" : [ -99.077883, 40.713608 ], "pop" : 28674, "state" : "NE" } +{ "_id" : "68850", "city" : "LEXINGTON", "loc" : [ -99.751515, 40.785002 ], "pop" : 8970, "state" : "NE" } +{ "_id" : "68852", "city" : "LITCHFIELD", "loc" : [ -99.141452, 41.168639 ], "pop" : 629, "state" : "NE" } +{ "_id" : "68853", "city" : "LOUP CITY", "loc" : [ -98.975149, 41.284531 ], "pop" : 1810, "state" : "NE" } +{ "_id" : "68854", "city" : "MARQUETTE", "loc" : [ -97.999955, 41.010017 ], "pop" : 563, "state" : "NE" } +{ "_id" : "68855", "city" : "MASON CITY", "loc" : [ -99.304937, 41.185319 ], "pop" : 473, "state" : "NE" } +{ "_id" : "68856", "city" : "MERNA", "loc" : [ -99.803595, 41.443482 ], "pop" : 913, "state" : "NE" } +{ "_id" : "68858", "city" : "MILLER", "loc" : [ -99.373987, 40.942236 ], "pop" : 337, "state" : "NE" } +{ "_id" : "68859", "city" : "NORTH LOUP", "loc" : [ -98.785836, 41.49717 ], "pop" : 626, "state" : "NE" } +{ "_id" : "68860", "city" : "OCONTO", "loc" : [ -99.69511199999999, 41.138075 ], "pop" : 539, "state" : "NE" } +{ "_id" : "68861", "city" : "ODESSA", "loc" : [ -99.254082, 40.709726 ], "pop" : 379, "state" : "NE" } +{ "_id" : "68862", "city" : "ORD", "loc" : [ -98.941783, 41.596187 ], "pop" : 3629, "state" : "NE" } +{ "_id" : "68863", "city" : "OVERTON", "loc" : [ -99.527824, 40.751875 ], "pop" : 1090, "state" : "NE" } +{ "_id" : "68864", "city" : "PALMER", "loc" : [ -98.241146, 41.178757 ], "pop" : 1142, "state" : "NE" } +{ "_id" : "68865", "city" : "PHILLIPS", "loc" : [ -98.21286000000001, 40.898197 ], "pop" : 517, "state" : "NE" } +{ "_id" : "68866", "city" : "PLEASANTON", "loc" : [ -99.12827799999999, 40.981848 ], "pop" : 654, "state" : "NE" } +{ "_id" : "68868", "city" : "PROSSER", "loc" : [ -98.559471, 40.659175 ], "pop" : 297, "state" : "NE" } +{ "_id" : "68869", "city" : "RAVENNA", "loc" : [ -98.904129, 41.023271 ], "pop" : 1646, "state" : "NE" } +{ "_id" : "68870", "city" : "RIVERDALE", "loc" : [ -99.138147, 40.762684 ], "pop" : 784, "state" : "NE" } +{ "_id" : "68871", "city" : "ROCKVILLE", "loc" : [ -98.85775700000001, 41.110832 ], "pop" : 489, "state" : "NE" } +{ "_id" : "68872", "city" : "SAINT LIBORY", "loc" : [ -98.35888, 41.08669 ], "pop" : 705, "state" : "NE" } +{ "_id" : "68873", "city" : "SAINT PAUL", "loc" : [ -98.44398700000001, 41.224212 ], "pop" : 3088, "state" : "NE" } +{ "_id" : "68874", "city" : "SARGENT", "loc" : [ -99.381624, 41.650845 ], "pop" : 1042, "state" : "NE" } +{ "_id" : "68875", "city" : "SCOTIA", "loc" : [ -98.689256, 41.483724 ], "pop" : 711, "state" : "NE" } +{ "_id" : "68876", "city" : "SHELTON", "loc" : [ -98.743453, 40.771703 ], "pop" : 1256, "state" : "NE" } +{ "_id" : "68878", "city" : "SUMNER", "loc" : [ -99.51995100000001, 40.950384 ], "pop" : 448, "state" : "NE" } +{ "_id" : "68879", "city" : "ALMERIA", "loc" : [ -99.415404, 41.822859 ], "pop" : 683, "state" : "NE" } +{ "_id" : "68881", "city" : "WESTERVILLE", "loc" : [ -99.38436900000001, 41.419282 ], "pop" : 172, "state" : "NE" } +{ "_id" : "68882", "city" : "WOLBACH", "loc" : [ -98.399456, 41.424373 ], "pop" : 466, "state" : "NE" } +{ "_id" : "68883", "city" : "WOOD RIVER", "loc" : [ -98.606509, 40.810635 ], "pop" : 2071, "state" : "NE" } +{ "_id" : "68901", "city" : "HASTINGS", "loc" : [ -98.39114600000001, 40.587654 ], "pop" : 25562, "state" : "NE" } +{ "_id" : "68920", "city" : "ALMA", "loc" : [ -99.360073, 40.118853 ], "pop" : 1587, "state" : "NE" } +{ "_id" : "68922", "city" : "ARAPAHOE", "loc" : [ -99.899697, 40.302662 ], "pop" : 1246, "state" : "NE" } +{ "_id" : "68923", "city" : "ATLANTA", "loc" : [ -99.484354, 40.384901 ], "pop" : 261, "state" : "NE" } +{ "_id" : "68924", "city" : "AXTELL", "loc" : [ -99.11690299999999, 40.526907 ], "pop" : 1547, "state" : "NE" } +{ "_id" : "68925", "city" : "AYR", "loc" : [ -98.438982, 40.441054 ], "pop" : 616, "state" : "NE" } +{ "_id" : "68926", "city" : "BEAVER CITY", "loc" : [ -99.806532, 40.129036 ], "pop" : 959, "state" : "NE" } +{ "_id" : "68927", "city" : "BERTRAND", "loc" : [ -99.575891, 40.560843 ], "pop" : 1566, "state" : "NE" } +{ "_id" : "68928", "city" : "BLADEN", "loc" : [ -98.604625, 40.298996 ], "pop" : 579, "state" : "NE" } +{ "_id" : "68929", "city" : "BLOOMINGTON", "loc" : [ -99.009438, 40.138257 ], "pop" : 431, "state" : "NE" } +{ "_id" : "68930", "city" : "BLUE HILL", "loc" : [ -98.42695500000001, 40.31102 ], "pop" : 1291, "state" : "NE" } +{ "_id" : "68932", "city" : "CAMPBELL", "loc" : [ -98.73701199999999, 40.296684 ], "pop" : 525, "state" : "NE" } +{ "_id" : "68933", "city" : "CLAY CENTER", "loc" : [ -98.03864900000001, 40.511301 ], "pop" : 1115, "state" : "NE" } +{ "_id" : "68934", "city" : "DEWEESE", "loc" : [ -98.177199, 40.379234 ], "pop" : 342, "state" : "NE" } +{ "_id" : "68935", "city" : "EDGAR", "loc" : [ -97.972679, 40.365166 ], "pop" : 795, "state" : "NE" } +{ "_id" : "68936", "city" : "EDISON", "loc" : [ -99.785988, 40.280176 ], "pop" : 246, "state" : "NE" } +{ "_id" : "68937", "city" : "ELWOOD", "loc" : [ -99.825812, 40.574738 ], "pop" : 956, "state" : "NE" } +{ "_id" : "68938", "city" : "FAIRFIELD", "loc" : [ -98.106272, 40.428511 ], "pop" : 569, "state" : "NE" } +{ "_id" : "68939", "city" : "FRANKLIN", "loc" : [ -98.946862, 40.105172 ], "pop" : 1305, "state" : "NE" } +{ "_id" : "68940", "city" : "FUNK", "loc" : [ -99.244992, 40.502031 ], "pop" : 558, "state" : "NE" } +{ "_id" : "68941", "city" : "GLENVIL", "loc" : [ -98.246475, 40.493145 ], "pop" : 447, "state" : "NE" } +{ "_id" : "68942", "city" : "GUIDE ROCK", "loc" : [ -98.33906399999999, 40.081186 ], "pop" : 530, "state" : "NE" } +{ "_id" : "68943", "city" : "HARDY", "loc" : [ -97.927057, 40.028452 ], "pop" : 462, "state" : "NE" } +{ "_id" : "68944", "city" : "HARVARD", "loc" : [ -98.084574, 40.626463 ], "pop" : 1400, "state" : "NE" } +{ "_id" : "68945", "city" : "HEARTWELL", "loc" : [ -98.78514, 40.571601 ], "pop" : 197, "state" : "NE" } +{ "_id" : "68946", "city" : "HENDLEY", "loc" : [ -99.971537, 40.106312 ], "pop" : 217, "state" : "NE" } +{ "_id" : "68947", "city" : "HILDRETH", "loc" : [ -99.05712800000001, 40.321743 ], "pop" : 663, "state" : "NE" } +{ "_id" : "68948", "city" : "HOLBROOK", "loc" : [ -100.013593, 40.301893 ], "pop" : 369, "state" : "NE" } +{ "_id" : "68949", "city" : "HOLDREGE", "loc" : [ -99.367233, 40.447527 ], "pop" : 6744, "state" : "NE" } +{ "_id" : "68950", "city" : "HOLSTEIN", "loc" : [ -98.65377700000001, 40.454169 ], "pop" : 413, "state" : "NE" } +{ "_id" : "68951", "city" : "HUNTLEY", "loc" : [ -99.284786, 40.210254 ], "pop" : 89, "state" : "NE" } +{ "_id" : "68952", "city" : "INAVALE", "loc" : [ -98.661191, 40.095886 ], "pop" : 249, "state" : "NE" } +{ "_id" : "68954", "city" : "INLAND", "loc" : [ -98.22337899999999, 40.589934 ], "pop" : 113, "state" : "NE" } +{ "_id" : "68955", "city" : "JUNIATA", "loc" : [ -98.515017, 40.586652 ], "pop" : 1058, "state" : "NE" } +{ "_id" : "68956", "city" : "KENESAW", "loc" : [ -98.657241, 40.61645 ], "pop" : 1076, "state" : "NE" } +{ "_id" : "68957", "city" : "LAWRENCE", "loc" : [ -98.24024300000001, 40.27672 ], "pop" : 594, "state" : "NE" } +{ "_id" : "68958", "city" : "LOOMIS", "loc" : [ -99.497851, 40.479155 ], "pop" : 586, "state" : "NE" } +{ "_id" : "68959", "city" : "MINDEN", "loc" : [ -98.93829700000001, 40.509142 ], "pop" : 4365, "state" : "NE" } +{ "_id" : "68960", "city" : "NAPONEE", "loc" : [ -99.127725, 40.125807 ], "pop" : 361, "state" : "NE" } +{ "_id" : "68961", "city" : "NORA", "loc" : [ -98.05841700000001, 40.209739 ], "pop" : 1084, "state" : "NE" } +{ "_id" : "68964", "city" : "OAK", "loc" : [ -97.884114, 40.260489 ], "pop" : 312, "state" : "NE" } +{ "_id" : "68966", "city" : "ORLEANS", "loc" : [ -99.45718599999999, 40.148435 ], "pop" : 760, "state" : "NE" } +{ "_id" : "68967", "city" : "OXFORD", "loc" : [ -99.630197, 40.256049 ], "pop" : 1306, "state" : "NE" } +{ "_id" : "68969", "city" : "RAGAN", "loc" : [ -99.24891, 40.309594 ], "pop" : 148, "state" : "NE" } +{ "_id" : "68970", "city" : "RED CLOUD", "loc" : [ -98.518655, 40.09516 ], "pop" : 1630, "state" : "NE" } +{ "_id" : "68971", "city" : "REPUBLICAN CITY", "loc" : [ -99.23218900000001, 40.103401 ], "pop" : 429, "state" : "NE" } +{ "_id" : "68972", "city" : "RIVERTON", "loc" : [ -98.785819, 40.101626 ], "pop" : 394, "state" : "NE" } +{ "_id" : "68973", "city" : "ROSELAND", "loc" : [ -98.555059, 40.459058 ], "pop" : 603, "state" : "NE" } +{ "_id" : "68974", "city" : "RUSKIN", "loc" : [ -97.87203, 40.138318 ], "pop" : 324, "state" : "NE" } +{ "_id" : "68975", "city" : "SARONVILLE", "loc" : [ -97.87385, 40.600625 ], "pop" : 1704, "state" : "NE" } +{ "_id" : "68976", "city" : "SMITHFIELD", "loc" : [ -99.82386200000001, 40.583567 ], "pop" : 972, "state" : "NE" } +{ "_id" : "68977", "city" : "STAMFORD", "loc" : [ -99.581405, 40.11625 ], "pop" : 396, "state" : "NE" } +{ "_id" : "68978", "city" : "SUPERIOR", "loc" : [ -98.077872, 40.031537 ], "pop" : 2902, "state" : "NE" } +{ "_id" : "68979", "city" : "SUTTON", "loc" : [ -97.873476, 40.653955 ], "pop" : 215, "state" : "NE" } +{ "_id" : "68980", "city" : "TRUMBULL", "loc" : [ -98.257414, 40.66918 ], "pop" : 381, "state" : "NE" } +{ "_id" : "68981", "city" : "UPLAND", "loc" : [ -98.89657699999999, 40.317073 ], "pop" : 259, "state" : "NE" } +{ "_id" : "68982", "city" : "WILCOX", "loc" : [ -99.153927, 40.373523 ], "pop" : 520, "state" : "NE" } +{ "_id" : "69001", "city" : "MC COOK", "loc" : [ -100.627948, 40.204905 ], "pop" : 9513, "state" : "NE" } +{ "_id" : "69020", "city" : "BARTLEY", "loc" : [ -100.29075, 40.258113 ], "pop" : 519, "state" : "NE" } +{ "_id" : "69021", "city" : "BENKELMAN", "loc" : [ -101.534354, 40.098049 ], "pop" : 1813, "state" : "NE" } +{ "_id" : "69022", "city" : "CAMBRIDGE", "loc" : [ -100.167579, 40.280767 ], "pop" : 1347, "state" : "NE" } +{ "_id" : "69023", "city" : "CHAMPION", "loc" : [ -101.74849, 40.460039 ], "pop" : 288, "state" : "NE" } +{ "_id" : "69024", "city" : "CULBERTSON", "loc" : [ -100.850043, 40.223707 ], "pop" : 1560, "state" : "NE" } +{ "_id" : "69025", "city" : "CURTIS", "loc" : [ -100.510406, 40.613067 ], "pop" : 1095, "state" : "NE" } +{ "_id" : "69026", "city" : "DANBURY", "loc" : [ -100.424228, 40.037689 ], "pop" : 283, "state" : "NE" } +{ "_id" : "69027", "city" : "ENDERS", "loc" : [ -101.522156, 40.465492 ], "pop" : 217, "state" : "NE" } +{ "_id" : "69028", "city" : "EUSTIS", "loc" : [ -100.054694, 40.626745 ], "pop" : 829, "state" : "NE" } +{ "_id" : "69029", "city" : "FARNAM", "loc" : [ -100.206878, 40.712881 ], "pop" : 243, "state" : "NE" } +{ "_id" : "69030", "city" : "HAIGLER", "loc" : [ -101.937106, 40.064179 ], "pop" : 398, "state" : "NE" } +{ "_id" : "69031", "city" : "HAMLET", "loc" : [ -101.234106, 40.399363 ], "pop" : 222, "state" : "NE" } +{ "_id" : "69032", "city" : "HAYES CENTER", "loc" : [ -101.025208, 40.517316 ], "pop" : 1000, "state" : "NE" } +{ "_id" : "69033", "city" : "IMPERIAL", "loc" : [ -101.646775, 40.525124 ], "pop" : 2372, "state" : "NE" } +{ "_id" : "69034", "city" : "INDIANOLA", "loc" : [ -100.429758, 40.235718 ], "pop" : 1213, "state" : "NE" } +{ "_id" : "69035", "city" : "LAMAR", "loc" : [ -101.903297, 40.538653 ], "pop" : 613, "state" : "NE" } +{ "_id" : "69036", "city" : "LEBANON", "loc" : [ -100.26122, 40.07522 ], "pop" : 182, "state" : "NE" } +{ "_id" : "69037", "city" : "MAX", "loc" : [ -101.391607, 40.106884 ], "pop" : 164, "state" : "NE" } +{ "_id" : "69038", "city" : "MAYWOOD", "loc" : [ -100.642135, 40.589262 ], "pop" : 689, "state" : "NE" } +{ "_id" : "69039", "city" : "MOOREFIELD", "loc" : [ -100.310773, 40.57856 ], "pop" : 355, "state" : "NE" } +{ "_id" : "69040", "city" : "PALISADE", "loc" : [ -101.129464, 40.338668 ], "pop" : 544, "state" : "NE" } +{ "_id" : "69041", "city" : "PARKS", "loc" : [ -101.739879, 40.139837 ], "pop" : 207, "state" : "NE" } +{ "_id" : "69042", "city" : "STOCKVILLE", "loc" : [ -100.384886, 40.494834 ], "pop" : 128, "state" : "NE" } +{ "_id" : "69043", "city" : "STRATTON", "loc" : [ -101.218275, 40.144462 ], "pop" : 776, "state" : "NE" } +{ "_id" : "69044", "city" : "TRENTON", "loc" : [ -101.020073, 40.168096 ], "pop" : 870, "state" : "NE" } +{ "_id" : "69045", "city" : "WAUNETA", "loc" : [ -101.381195, 40.440906 ], "pop" : 891, "state" : "NE" } +{ "_id" : "69046", "city" : "WILSONVILLE", "loc" : [ -100.1211, 40.108895 ], "pop" : 264, "state" : "NE" } +{ "_id" : "69101", "city" : "NORTH PLATTE", "loc" : [ -100.774631, 41.132595 ], "pop" : 26416, "state" : "NE" } +{ "_id" : "69120", "city" : "ARNOLD", "loc" : [ -100.156731, 41.445583 ], "pop" : 1099, "state" : "NE" } +{ "_id" : "69121", "city" : "ARTHUR", "loc" : [ -101.693123, 41.573952 ], "pop" : 462, "state" : "NE" } +{ "_id" : "69122", "city" : "BIG SPRINGS", "loc" : [ -102.093273, 41.069621 ], "pop" : 792, "state" : "NE" } +{ "_id" : "69123", "city" : "BRADY", "loc" : [ -100.373649, 41.051525 ], "pop" : 1243, "state" : "NE" } +{ "_id" : "69125", "city" : "BROADWATER", "loc" : [ -102.822521, 41.582547 ], "pop" : 411, "state" : "NE" } +{ "_id" : "69127", "city" : "BRULE", "loc" : [ -101.909933, 41.100186 ], "pop" : 792, "state" : "NE" } +{ "_id" : "69128", "city" : "BUSHNELL", "loc" : [ -103.907494, 41.213876 ], "pop" : 355, "state" : "NE" } +{ "_id" : "69129", "city" : "CHAPPELL", "loc" : [ -102.452344, 41.096586 ], "pop" : 1445, "state" : "NE" } +{ "_id" : "69130", "city" : "COZAD", "loc" : [ -99.992091, 40.861934 ], "pop" : 5221, "state" : "NE" } +{ "_id" : "69131", "city" : "DALTON", "loc" : [ -102.972609, 41.406778 ], "pop" : 511, "state" : "NE" } +{ "_id" : "69132", "city" : "DICKENS", "loc" : [ -101.01495, 40.804089 ], "pop" : 132, "state" : "NE" } +{ "_id" : "69133", "city" : "DIX", "loc" : [ -103.479603, 41.226993 ], "pop" : 426, "state" : "NE" } +{ "_id" : "69134", "city" : "ELSIE", "loc" : [ -101.369994, 40.859647 ], "pop" : 448, "state" : "NE" } +{ "_id" : "69135", "city" : "ELSMERE", "loc" : [ -100.282412, 42.264974 ], "pop" : 132, "state" : "NE" } +{ "_id" : "69138", "city" : "GOTHENBURG", "loc" : [ -100.154707, 40.940035 ], "pop" : 3739, "state" : "NE" } +{ "_id" : "69140", "city" : "GRANT", "loc" : [ -101.719589, 40.851069 ], "pop" : 1896, "state" : "NE" } +{ "_id" : "69141", "city" : "GURLEY", "loc" : [ -102.982325, 41.28771 ], "pop" : 624, "state" : "NE" } +{ "_id" : "69142", "city" : "HALSEY", "loc" : [ -100.295515, 41.929095 ], "pop" : 166, "state" : "NE" } +{ "_id" : "69143", "city" : "HERSHEY", "loc" : [ -101.001157, 41.155303 ], "pop" : 1685, "state" : "NE" } +{ "_id" : "69144", "city" : "KEYSTONE", "loc" : [ -101.628218, 41.262129 ], "pop" : 247, "state" : "NE" } +{ "_id" : "69145", "city" : "KIMBALL", "loc" : [ -103.660236, 41.23208 ], "pop" : 3327, "state" : "NE" } +{ "_id" : "69146", "city" : "LEMOYNE", "loc" : [ -101.894677, 41.304017 ], "pop" : 303, "state" : "NE" } +{ "_id" : "69147", "city" : "LEWELLEN", "loc" : [ -102.139622, 41.343461 ], "pop" : 612, "state" : "NE" } +{ "_id" : "69148", "city" : "LISCO", "loc" : [ -102.54983, 41.511398 ], "pop" : 214, "state" : "NE" } +{ "_id" : "69149", "city" : "LODGEPOLE", "loc" : [ -102.657034, 41.169745 ], "pop" : 642, "state" : "NE" } +{ "_id" : "69150", "city" : "MADRID", "loc" : [ -101.537067, 40.85443 ], "pop" : 546, "state" : "NE" } +{ "_id" : "69151", "city" : "MAXWELL", "loc" : [ -100.526993, 41.058831 ], "pop" : 722, "state" : "NE" } +{ "_id" : "69152", "city" : "MULLEN", "loc" : [ -101.054185, 42.016292 ], "pop" : 793, "state" : "NE" } +{ "_id" : "69153", "city" : "OGALLALA", "loc" : [ -101.710742, 41.127505 ], "pop" : 6329, "state" : "NE" } +{ "_id" : "69154", "city" : "OSHKOSH", "loc" : [ -102.345699, 41.445057 ], "pop" : 1634, "state" : "NE" } +{ "_id" : "69155", "city" : "PAXTON", "loc" : [ -101.358544, 41.126763 ], "pop" : 913, "state" : "NE" } +{ "_id" : "69156", "city" : "POTTER", "loc" : [ -103.306112, 41.234688 ], "pop" : 658, "state" : "NE" } +{ "_id" : "69157", "city" : "PURDUM", "loc" : [ -100.15685, 41.966475 ], "pop" : 217, "state" : "NE" } +{ "_id" : "69161", "city" : "SENECA", "loc" : [ -100.807315, 41.99012 ], "pop" : 169, "state" : "NE" } +{ "_id" : "69162", "city" : "SIDNEY", "loc" : [ -102.985573, 41.138001 ], "pop" : 7059, "state" : "NE" } +{ "_id" : "69163", "city" : "STAPLETON", "loc" : [ -100.483105, 41.48877 ], "pop" : 878, "state" : "NE" } +{ "_id" : "69165", "city" : "SUTHERLAND", "loc" : [ -101.136029, 41.15575 ], "pop" : 1472, "state" : "NE" } +{ "_id" : "69166", "city" : "BROWNLEE", "loc" : [ -100.573834, 41.973575 ], "pop" : 503, "state" : "NE" } +{ "_id" : "69167", "city" : "TRYON", "loc" : [ -101.017508, 41.573175 ], "pop" : 546, "state" : "NE" } +{ "_id" : "69168", "city" : "VENANGO", "loc" : [ -101.983894, 40.807324 ], "pop" : 433, "state" : "NE" } +{ "_id" : "69169", "city" : "WALLACE", "loc" : [ -101.173767, 40.830423 ], "pop" : 571, "state" : "NE" } +{ "_id" : "69170", "city" : "WELLFLEET", "loc" : [ -100.711915, 40.798776 ], "pop" : 311, "state" : "NE" } +{ "_id" : "69201", "city" : "VALENTINE", "loc" : [ -100.621542, 42.806166 ], "pop" : 4504, "state" : "NE" } +{ "_id" : "69210", "city" : "AINSWORTH", "loc" : [ -99.861491, 42.54027 ], "pop" : 2580, "state" : "NE" } +{ "_id" : "69211", "city" : "CODY", "loc" : [ -101.379846, 42.614556 ], "pop" : 156, "state" : "NE" } +{ "_id" : "69212", "city" : "CROOKSTON", "loc" : [ -100.773473, 42.925506 ], "pop" : 229, "state" : "NE" } +{ "_id" : "69214", "city" : "JOHNSTOWN", "loc" : [ -100.045322, 42.530857 ], "pop" : 371, "state" : "NE" } +{ "_id" : "69216", "city" : "KILGORE", "loc" : [ -100.988447, 42.914587 ], "pop" : 213, "state" : "NE" } +{ "_id" : "69217", "city" : "LONG PINE", "loc" : [ -99.72304200000001, 42.533379 ], "pop" : 706, "state" : "NE" } +{ "_id" : "69218", "city" : "MERRIMAN", "loc" : [ -101.758304, 42.641883 ], "pop" : 873, "state" : "NE" } +{ "_id" : "69221", "city" : "WOOD LAKE", "loc" : [ -100.287175, 42.626394 ], "pop" : 200, "state" : "NE" } +{ "_id" : "69301", "city" : "ALLIANCE", "loc" : [ -102.888045, 42.114943 ], "pop" : 11903, "state" : "NE" } +{ "_id" : "69331", "city" : "ANGORA", "loc" : [ -103.085019, 41.893434 ], "pop" : 84, "state" : "NE" } +{ "_id" : "69333", "city" : "ASHBY", "loc" : [ -101.963581, 41.977578 ], "pop" : 151, "state" : "NE" } +{ "_id" : "69334", "city" : "BAYARD", "loc" : [ -103.301887, 41.757923 ], "pop" : 2378, "state" : "NE" } +{ "_id" : "69335", "city" : "BINGHAM", "loc" : [ -102.133075, 42.260651 ], "pop" : 218, "state" : "NE" } +{ "_id" : "69336", "city" : "BRIDGEPORT", "loc" : [ -103.070134, 41.676556 ], "pop" : 2550, "state" : "NE" } +{ "_id" : "69337", "city" : "CHADRON", "loc" : [ -102.995331, 42.819268 ], "pop" : 6661, "state" : "NE" } +{ "_id" : "69339", "city" : "CRAWFORD", "loc" : [ -103.405336, 42.67584 ], "pop" : 1492, "state" : "NE" } +{ "_id" : "69340", "city" : "ELLSWORTH", "loc" : [ -102.47245, 42.169717 ], "pop" : 310, "state" : "NE" } +{ "_id" : "69341", "city" : "GERING", "loc" : [ -103.662896, 41.821993 ], "pop" : 11631, "state" : "NE" } +{ "_id" : "69343", "city" : "GORDON", "loc" : [ -102.204929, 42.806843 ], "pop" : 2666, "state" : "NE" } +{ "_id" : "69345", "city" : "HARRISBURG", "loc" : [ -103.711141, 41.55306 ], "pop" : 852, "state" : "NE" } +{ "_id" : "69346", "city" : "HARRISON", "loc" : [ -103.831803, 42.394594 ], "pop" : 1525, "state" : "NE" } +{ "_id" : "69347", "city" : "HAY SPRINGS", "loc" : [ -102.675641, 42.640122 ], "pop" : 1570, "state" : "NE" } +{ "_id" : "69348", "city" : "HEMINGFORD", "loc" : [ -103.064412, 42.33117 ], "pop" : 1280, "state" : "NE" } +{ "_id" : "69349", "city" : "HENRY", "loc" : [ -104.034933, 41.993392 ], "pop" : 208, "state" : "NE" } +{ "_id" : "69350", "city" : "HYANNIS", "loc" : [ -101.748296, 42.006967 ], "pop" : 430, "state" : "NE" } +{ "_id" : "69351", "city" : "LAKESIDE", "loc" : [ -102.443655, 42.049595 ], "pop" : 5, "state" : "NE" } +{ "_id" : "69352", "city" : "LYMAN", "loc" : [ -104.006569, 41.891765 ], "pop" : 988, "state" : "NE" } +{ "_id" : "69354", "city" : "MARSLAND", "loc" : [ -103.051857, 42.598842 ], "pop" : 605, "state" : "NE" } +{ "_id" : "69356", "city" : "MINATARE", "loc" : [ -103.489011, 41.849333 ], "pop" : 2355, "state" : "NE" } +{ "_id" : "69357", "city" : "MITCHELL", "loc" : [ -103.795996, 41.945851 ], "pop" : 2998, "state" : "NE" } +{ "_id" : "69358", "city" : "MORRILL", "loc" : [ -103.918216, 41.96807 ], "pop" : 1469, "state" : "NE" } +{ "_id" : "69360", "city" : "RUSHVILLE", "loc" : [ -102.465738, 42.737934 ], "pop" : 1955, "state" : "NE" } +{ "_id" : "69361", "city" : "SCOTTSBLUFF", "loc" : [ -103.661914, 41.871975 ], "pop" : 16373, "state" : "NE" } +{ "_id" : "69366", "city" : "WHITMAN", "loc" : [ -101.521623, 41.958355 ], "pop" : 188, "state" : "NE" } +{ "_id" : "69367", "city" : "WHITNEY", "loc" : [ -103.239552, 42.755881 ], "pop" : 263, "state" : "NE" } +{ "_id" : "70001", "city" : "METAIRIE", "loc" : [ -90.16951299999999, 29.987138 ], "pop" : 39554, "state" : "LA" } +{ "_id" : "70002", "city" : "METAIRIE", "loc" : [ -90.16303000000001, 30.009843 ], "pop" : 19511, "state" : "LA" } +{ "_id" : "70003", "city" : "METAIRIE", "loc" : [ -90.21456999999999, 29.99746 ], "pop" : 46193, "state" : "LA" } +{ "_id" : "70005", "city" : "METAIRIE", "loc" : [ -90.13314, 30.000476 ], "pop" : 26512, "state" : "LA" } +{ "_id" : "70006", "city" : "METAIRIE", "loc" : [ -90.19148300000001, 30.012885 ], "pop" : 16919, "state" : "LA" } +{ "_id" : "70030", "city" : "DES ALLEMANDS", "loc" : [ -90.44704900000001, 29.821993 ], "pop" : 3322, "state" : "LA" } +{ "_id" : "70031", "city" : "AMA", "loc" : [ -90.292509, 29.943494 ], "pop" : 1300, "state" : "LA" } +{ "_id" : "70032", "city" : "ARABI", "loc" : [ -89.99649700000001, 29.961154 ], "pop" : 8954, "state" : "LA" } +{ "_id" : "70036", "city" : "BARATARIA", "loc" : [ -90.126232, 29.717859 ], "pop" : 334, "state" : "LA" } +{ "_id" : "70037", "city" : "BELLE CHASSE", "loc" : [ -90.004177, 29.834514 ], "pop" : 9920, "state" : "LA" } +{ "_id" : "70039", "city" : "BOUTTE", "loc" : [ -90.393396, 29.897319 ], "pop" : 2432, "state" : "LA" } +{ "_id" : "70040", "city" : "BRAITHWAITE", "loc" : [ -89.885347, 29.673563 ], "pop" : 2303, "state" : "LA" } +{ "_id" : "70041", "city" : "BURAS", "loc" : [ -89.47568, 29.341056 ], "pop" : 6496, "state" : "LA" } +{ "_id" : "70043", "city" : "CHALMETTE", "loc" : [ -89.96113699999999, 29.946611 ], "pop" : 31850, "state" : "LA" } +{ "_id" : "70047", "city" : "NEW SARPY", "loc" : [ -90.373982, 29.96579 ], "pop" : 10472, "state" : "LA" } +{ "_id" : "70049", "city" : "EDGARD", "loc" : [ -90.581678, 30.031863 ], "pop" : 3702, "state" : "LA" } +{ "_id" : "70051", "city" : "GARYVILLE", "loc" : [ -90.620113, 30.05352 ], "pop" : 3191, "state" : "LA" } +{ "_id" : "70052", "city" : "GRAMERCY", "loc" : [ -90.69018199999999, 30.052711 ], "pop" : 2765, "state" : "LA" } +{ "_id" : "70053", "city" : "GRETNA", "loc" : [ -90.05311500000001, 29.910806 ], "pop" : 16979, "state" : "LA" } +{ "_id" : "70056", "city" : "TERRYTOWN", "loc" : [ -90.029123, 29.892652 ], "pop" : 37901, "state" : "LA" } +{ "_id" : "70057", "city" : "HAHNVILLE", "loc" : [ -90.488581, 30.000094 ], "pop" : 745, "state" : "LA" } +{ "_id" : "70058", "city" : "HARVEY", "loc" : [ -90.06725900000001, 29.872535 ], "pop" : 36824, "state" : "LA" } +{ "_id" : "70062", "city" : "KENNER", "loc" : [ -90.247901, 29.991203 ], "pop" : 20016, "state" : "LA" } +{ "_id" : "70065", "city" : "KENNER", "loc" : [ -90.25217499999999, 30.025164 ], "pop" : 54023, "state" : "LA" } +{ "_id" : "70067", "city" : "LAFITTE", "loc" : [ -90.05663300000001, 29.562194 ], "pop" : 0, "state" : "LA" } +{ "_id" : "70068", "city" : "LA PLACE", "loc" : [ -90.489544, 30.077718 ], "pop" : 26023, "state" : "LA" } +{ "_id" : "70070", "city" : "LULING", "loc" : [ -90.36926099999999, 29.925116 ], "pop" : 11956, "state" : "LA" } +{ "_id" : "70071", "city" : "LUTCHER", "loc" : [ -90.70084, 30.044679 ], "pop" : 3993, "state" : "LA" } +{ "_id" : "70072", "city" : "MARRERO", "loc" : [ -90.110462, 29.859756 ], "pop" : 58905, "state" : "LA" } +{ "_id" : "70075", "city" : "MERAUX", "loc" : [ -89.92143299999999, 29.933494 ], "pop" : 7196, "state" : "LA" } +{ "_id" : "70079", "city" : "NORCO", "loc" : [ -90.41979600000001, 30.005706 ], "pop" : 4931, "state" : "LA" } +{ "_id" : "70080", "city" : "PARADIS", "loc" : [ -90.43524600000001, 29.877033 ], "pop" : 939, "state" : "LA" } +{ "_id" : "70083", "city" : "PORT SULPHUR", "loc" : [ -89.68474999999999, 29.470011 ], "pop" : 6398, "state" : "LA" } +{ "_id" : "70084", "city" : "RESERVE", "loc" : [ -90.551773, 30.060255 ], "pop" : 7080, "state" : "LA" } +{ "_id" : "70085", "city" : "SAINT BERNARD", "loc" : [ -89.836414, 29.861093 ], "pop" : 8082, "state" : "LA" } +{ "_id" : "70086", "city" : "SAINT JAMES", "loc" : [ -90.86054900000001, 30.027598 ], "pop" : 2515, "state" : "LA" } +{ "_id" : "70087", "city" : "SAINT ROSE", "loc" : [ -90.312432, 29.958074 ], "pop" : 6340, "state" : "LA" } +{ "_id" : "70090", "city" : "VACHERIE", "loc" : [ -90.709699, 29.969372 ], "pop" : 6652, "state" : "LA" } +{ "_id" : "70091", "city" : "VENICE", "loc" : [ -89.347776, 29.261812 ], "pop" : 458, "state" : "LA" } +{ "_id" : "70092", "city" : "VIOLET", "loc" : [ -89.89599200000001, 29.904347 ], "pop" : 10549, "state" : "LA" } +{ "_id" : "70094", "city" : "BRIDGE CITY", "loc" : [ -90.18130499999999, 29.914386 ], "pop" : 35200, "state" : "LA" } +{ "_id" : "70112", "city" : "NEW ORLEANS", "loc" : [ -90.075301, 29.960484 ], "pop" : 6047, "state" : "LA" } +{ "_id" : "70113", "city" : "NEW ORLEANS", "loc" : [ -90.084777, 29.940511 ], "pop" : 12177, "state" : "LA" } +{ "_id" : "70114", "city" : "NEW ORLEANS", "loc" : [ -90.033126, 29.937934 ], "pop" : 29767, "state" : "LA" } +{ "_id" : "70115", "city" : "NEW ORLEANS", "loc" : [ -90.1005, 29.928863 ], "pop" : 45070, "state" : "LA" } +{ "_id" : "70116", "city" : "NEW ORLEANS", "loc" : [ -90.06461400000001, 29.968608 ], "pop" : 16592, "state" : "LA" } +{ "_id" : "70117", "city" : "NEW ORLEANS", "loc" : [ -90.03124, 29.970298 ], "pop" : 56494, "state" : "LA" } +{ "_id" : "70118", "city" : "NEW ORLEANS", "loc" : [ -90.123598, 29.950352 ], "pop" : 40049, "state" : "LA" } +{ "_id" : "70119", "city" : "NEW ORLEANS", "loc" : [ -90.085156, 29.974552 ], "pop" : 47894, "state" : "LA" } +{ "_id" : "70121", "city" : "JEFFERSON", "loc" : [ -90.16095300000001, 29.963071 ], "pop" : 12924, "state" : "LA" } +{ "_id" : "70122", "city" : "NEW ORLEANS", "loc" : [ -90.064409, 30.005637 ], "pop" : 47077, "state" : "LA" } +{ "_id" : "70123", "city" : "HARAHAN", "loc" : [ -90.210748, 29.953473 ], "pop" : 25057, "state" : "LA" } +{ "_id" : "70124", "city" : "NEW ORLEANS", "loc" : [ -90.10938400000001, 30.007081 ], "pop" : 22851, "state" : "LA" } +{ "_id" : "70125", "city" : "NEW ORLEANS", "loc" : [ -90.102785, 29.951225 ], "pop" : 22734, "state" : "LA" } +{ "_id" : "70126", "city" : "NEW ORLEANS", "loc" : [ -90.018913, 30.015341 ], "pop" : 45119, "state" : "LA" } +{ "_id" : "70127", "city" : "NEW ORLEANS", "loc" : [ -89.980688, 30.033811 ], "pop" : 29643, "state" : "LA" } +{ "_id" : "70128", "city" : "NEW ORLEANS", "loc" : [ -89.95642100000001, 30.052691 ], "pop" : 18844, "state" : "LA" } +{ "_id" : "70129", "city" : "NEW ORLEANS", "loc" : [ -89.906206, 30.047984 ], "pop" : 14064, "state" : "LA" } +{ "_id" : "70130", "city" : "NEW ORLEANS", "loc" : [ -90.073949, 29.932438 ], "pop" : 15576, "state" : "LA" } +{ "_id" : "70131", "city" : "NEW ORLEANS", "loc" : [ -89.996033, 29.916811 ], "pop" : 26939, "state" : "LA" } +{ "_id" : "70301", "city" : "THIBODAUX", "loc" : [ -90.809605, 29.799213 ], "pop" : 37831, "state" : "LA" } +{ "_id" : "70339", "city" : "PIERRE PART", "loc" : [ -91.20016699999999, 29.95501 ], "pop" : 5207, "state" : "LA" } +{ "_id" : "70340", "city" : "AMELIA", "loc" : [ -91.11110499999999, 29.66046 ], "pop" : 656, "state" : "LA" } +{ "_id" : "70341", "city" : "BELLE ROSE", "loc" : [ -91.04435100000001, 30.025955 ], "pop" : 4842, "state" : "LA" } +{ "_id" : "70342", "city" : "BERWICK", "loc" : [ -91.205662, 29.698786 ], "pop" : 17631, "state" : "LA" } +{ "_id" : "70343", "city" : "BOURG", "loc" : [ -90.60866, 29.548489 ], "pop" : 5310, "state" : "LA" } +{ "_id" : "70344", "city" : "CHAUVIN", "loc" : [ -90.59795200000001, 29.463401 ], "pop" : 6430, "state" : "LA" } +{ "_id" : "70345", "city" : "CUT OFF", "loc" : [ -90.339298, 29.523188 ], "pop" : 13268, "state" : "LA" } +{ "_id" : "70346", "city" : "DONALDSONVILLE", "loc" : [ -90.99702499999999, 30.101799 ], "pop" : 11265, "state" : "LA" } +{ "_id" : "70353", "city" : "DULAC", "loc" : [ -90.655655, 29.359814 ], "pop" : 1683, "state" : "LA" } +{ "_id" : "70354", "city" : "GALLIANO", "loc" : [ -90.29805399999999, 29.431125 ], "pop" : 3669, "state" : "LA" } +{ "_id" : "70355", "city" : "GHEENS", "loc" : [ -90.484855, 29.707591 ], "pop" : 452, "state" : "LA" } +{ "_id" : "70356", "city" : "GIBSON", "loc" : [ -90.977637, 29.662522 ], "pop" : 1642, "state" : "LA" } +{ "_id" : "70357", "city" : "GOLDEN MEADOW", "loc" : [ -90.263932, 29.382054 ], "pop" : 4075, "state" : "LA" } +{ "_id" : "70358", "city" : "GRAND ISLE", "loc" : [ -90.00880100000001, 29.22973 ], "pop" : 1455, "state" : "LA" } +{ "_id" : "70359", "city" : "GRAY", "loc" : [ -90.78071, 29.69034 ], "pop" : 4755, "state" : "LA" } +{ "_id" : "70360", "city" : "HOUMA", "loc" : [ -90.754808, 29.59433 ], "pop" : 18335, "state" : "LA" } +{ "_id" : "70363", "city" : "HOUMA", "loc" : [ -90.69166800000001, 29.560137 ], "pop" : 23618, "state" : "LA" } +{ "_id" : "70364", "city" : "HOUMA", "loc" : [ -90.72680099999999, 29.629887 ], "pop" : 25330, "state" : "LA" } +{ "_id" : "70372", "city" : "LABADIEVILLE", "loc" : [ -90.961319, 29.834458 ], "pop" : 2856, "state" : "LA" } +{ "_id" : "70374", "city" : "LOCKPORT", "loc" : [ -90.49061399999999, 29.603493 ], "pop" : 10863, "state" : "LA" } +{ "_id" : "70375", "city" : "MATHEWS", "loc" : [ -90.49491399999999, 29.681982 ], "pop" : 479, "state" : "LA" } +{ "_id" : "70377", "city" : "MONTEGUT", "loc" : [ -90.543952, 29.474366 ], "pop" : 3892, "state" : "LA" } +{ "_id" : "70380", "city" : "MORGAN CITY", "loc" : [ -91.116497, 29.723937 ], "pop" : 5341, "state" : "LA" } +{ "_id" : "70390", "city" : "NAPOLEONVILLE", "loc" : [ -91.026608, 29.92884 ], "pop" : 7710, "state" : "LA" } +{ "_id" : "70392", "city" : "PATTERSON", "loc" : [ -91.28123100000001, 29.69671 ], "pop" : 13463, "state" : "LA" } +{ "_id" : "70394", "city" : "RACELAND", "loc" : [ -90.599908, 29.717835 ], "pop" : 12920, "state" : "LA" } +{ "_id" : "70395", "city" : "SCHRIEVER", "loc" : [ -90.85134100000001, 29.712276 ], "pop" : 4774, "state" : "LA" } +{ "_id" : "70397", "city" : "THERIOT", "loc" : [ -90.765146, 29.451587 ], "pop" : 3982, "state" : "LA" } +{ "_id" : "70401", "city" : "HAMMOND", "loc" : [ -90.48785599999999, 30.51908 ], "pop" : 16101, "state" : "LA" } +{ "_id" : "70403", "city" : "HAMMOND", "loc" : [ -90.46972, 30.491054 ], "pop" : 15299, "state" : "LA" } +{ "_id" : "70420", "city" : "ABITA SPRINGS", "loc" : [ -90.00407199999999, 30.483696 ], "pop" : 2659, "state" : "LA" } +{ "_id" : "70422", "city" : "AMITE", "loc" : [ -90.570493, 30.718208 ], "pop" : 12006, "state" : "LA" } +{ "_id" : "70426", "city" : "ANGIE", "loc" : [ -89.856714, 30.922406 ], "pop" : 6303, "state" : "LA" } +{ "_id" : "70427", "city" : "BOGALUSA", "loc" : [ -89.865329, 30.773303 ], "pop" : 18938, "state" : "LA" } +{ "_id" : "70431", "city" : "BUSH", "loc" : [ -89.955664, 30.613393 ], "pop" : 3906, "state" : "LA" } +{ "_id" : "70433", "city" : "COVINGTON", "loc" : [ -90.095933, 30.487606 ], "pop" : 26117, "state" : "LA" } +{ "_id" : "70436", "city" : "FLUKER", "loc" : [ -90.52067, 30.812776 ], "pop" : 186, "state" : "LA" } +{ "_id" : "70437", "city" : "FOLSOM", "loc" : [ -90.187927, 30.61447 ], "pop" : 4832, "state" : "LA" } +{ "_id" : "70438", "city" : "FRANKLINTON", "loc" : [ -90.11547899999999, 30.857735 ], "pop" : 16352, "state" : "LA" } +{ "_id" : "70441", "city" : "GREENSBURG", "loc" : [ -90.725561, 30.864693 ], "pop" : 3833, "state" : "LA" } +{ "_id" : "70443", "city" : "INDEPENDENCE", "loc" : [ -90.52768500000001, 30.635148 ], "pop" : 4330, "state" : "LA" } +{ "_id" : "70444", "city" : "KENTWOOD", "loc" : [ -90.472829, 30.889215 ], "pop" : 11244, "state" : "LA" } +{ "_id" : "70445", "city" : "LACOMBE", "loc" : [ -89.929744, 30.322027 ], "pop" : 7956, "state" : "LA" } +{ "_id" : "70446", "city" : "LORANGER", "loc" : [ -90.356723, 30.588407 ], "pop" : 8701, "state" : "LA" } +{ "_id" : "70447", "city" : "MADISONVILLE", "loc" : [ -90.17728200000001, 30.428743 ], "pop" : 3110, "state" : "LA" } +{ "_id" : "70448", "city" : "MANDEVILLE", "loc" : [ -90.076846, 30.386096 ], "pop" : 22492, "state" : "LA" } +{ "_id" : "70449", "city" : "MAUREPAS", "loc" : [ -90.704255, 30.271587 ], "pop" : 2489, "state" : "LA" } +{ "_id" : "70450", "city" : "MOUNT HERMON", "loc" : [ -90.276886, 30.953619 ], "pop" : 1577, "state" : "LA" } +{ "_id" : "70452", "city" : "PEARL RIVER", "loc" : [ -89.77315, 30.394448 ], "pop" : 9228, "state" : "LA" } +{ "_id" : "70453", "city" : "PINE GROVE", "loc" : [ -90.767235, 30.703202 ], "pop" : 444, "state" : "LA" } +{ "_id" : "70454", "city" : "PONCHATOULA", "loc" : [ -90.44224699999999, 30.440644 ], "pop" : 15713, "state" : "LA" } +{ "_id" : "70455", "city" : "ROBERT", "loc" : [ -90.335171, 30.506327 ], "pop" : 564, "state" : "LA" } +{ "_id" : "70456", "city" : "ROSELAND", "loc" : [ -90.524277, 30.771711 ], "pop" : 2062, "state" : "LA" } +{ "_id" : "70458", "city" : "SLIDELL", "loc" : [ -89.771192, 30.278411 ], "pop" : 28918, "state" : "LA" } +{ "_id" : "70460", "city" : "SLIDELL", "loc" : [ -89.812895, 30.291611 ], "pop" : 18020, "state" : "LA" } +{ "_id" : "70461", "city" : "SLIDELL", "loc" : [ -89.729027, 30.272615 ], "pop" : 17270, "state" : "LA" } +{ "_id" : "70462", "city" : "SPRINGFIELD", "loc" : [ -90.577479, 30.415738 ], "pop" : 5597, "state" : "LA" } +{ "_id" : "70466", "city" : "TICKFAW", "loc" : [ -90.48199700000001, 30.566849 ], "pop" : 5565, "state" : "LA" } +{ "_id" : "70467", "city" : "VARNADO", "loc" : [ -89.7606, 30.982085 ], "pop" : 15, "state" : "LA" } +{ "_id" : "70501", "city" : "LAFAYETTE", "loc" : [ -92.008261, 30.236141 ], "pop" : 31717, "state" : "LA" } +{ "_id" : "70503", "city" : "LAFAYETTE", "loc" : [ -92.049745, 30.184256 ], "pop" : 25109, "state" : "LA" } +{ "_id" : "70506", "city" : "LAFAYETTE", "loc" : [ -92.065623, 30.207707 ], "pop" : 33970, "state" : "LA" } +{ "_id" : "70507", "city" : "LAFAYETTE", "loc" : [ -92.015962, 30.281313 ], "pop" : 12074, "state" : "LA" } +{ "_id" : "70508", "city" : "LAFAYETTE", "loc" : [ -92.023579, 30.158222 ], "pop" : 20568, "state" : "LA" } +{ "_id" : "70510", "city" : "FORKED ISLAND", "loc" : [ -92.142655, 29.958828 ], "pop" : 21018, "state" : "LA" } +{ "_id" : "70512", "city" : "ARNAUDVILLE", "loc" : [ -91.92628499999999, 30.398054 ], "pop" : 5676, "state" : "LA" } +{ "_id" : "70514", "city" : "BALDWIN", "loc" : [ -91.545783, 29.848784 ], "pop" : 4601, "state" : "LA" } +{ "_id" : "70515", "city" : "BASILE", "loc" : [ -92.57357, 30.497787 ], "pop" : 2733, "state" : "LA" } +{ "_id" : "70516", "city" : "BRANCH", "loc" : [ -92.33461800000001, 30.328684 ], "pop" : 2695, "state" : "LA" } +{ "_id" : "70517", "city" : "HENDERSON", "loc" : [ -91.90589900000001, 30.274955 ], "pop" : 9596, "state" : "LA" } +{ "_id" : "70518", "city" : "BROUSSARD", "loc" : [ -91.950171, 30.12189 ], "pop" : 8159, "state" : "LA" } +{ "_id" : "70520", "city" : "CARENCRO", "loc" : [ -92.042265, 30.324433 ], "pop" : 12256, "state" : "LA" } +{ "_id" : "70525", "city" : "CHURCH POINT", "loc" : [ -92.22395400000001, 30.401287 ], "pop" : 11108, "state" : "LA" } +{ "_id" : "70526", "city" : "CROWLEY", "loc" : [ -92.377709, 30.214753 ], "pop" : 17975, "state" : "LA" } +{ "_id" : "70528", "city" : "DELCAMBRE", "loc" : [ -91.988938, 29.947414 ], "pop" : 2769, "state" : "LA" } +{ "_id" : "70529", "city" : "DUSON", "loc" : [ -92.152455, 30.191216 ], "pop" : 7160, "state" : "LA" } +{ "_id" : "70531", "city" : "EGAN", "loc" : [ -92.500226, 30.250966 ], "pop" : 359, "state" : "LA" } +{ "_id" : "70532", "city" : "ELTON", "loc" : [ -92.699614, 30.471496 ], "pop" : 1973, "state" : "LA" } +{ "_id" : "70533", "city" : "ERATH", "loc" : [ -92.034266, 29.952237 ], "pop" : 7280, "state" : "LA" } +{ "_id" : "70535", "city" : "EUNICE", "loc" : [ -92.39847399999999, 30.51158 ], "pop" : 21409, "state" : "LA" } +{ "_id" : "70537", "city" : "EVANGELINE", "loc" : [ -92.55324400000001, 30.26829 ], "pop" : 475, "state" : "LA" } +{ "_id" : "70538", "city" : "FRANKLIN", "loc" : [ -91.50264300000001, 29.785656 ], "pop" : 15334, "state" : "LA" } +{ "_id" : "70542", "city" : "GUEYDAN", "loc" : [ -92.533779, 30.025541 ], "pop" : 3839, "state" : "LA" } +{ "_id" : "70543", "city" : "IOTA", "loc" : [ -92.532201, 30.300081 ], "pop" : 5338, "state" : "LA" } +{ "_id" : "70544", "city" : "JEANERETTE", "loc" : [ -91.654397, 29.90324 ], "pop" : 14068, "state" : "LA" } +{ "_id" : "70546", "city" : "JENNINGS", "loc" : [ -92.657405, 30.22011 ], "pop" : 11966, "state" : "LA" } +{ "_id" : "70548", "city" : "KAPLAN", "loc" : [ -92.302463, 29.977096 ], "pop" : 9442, "state" : "LA" } +{ "_id" : "70549", "city" : "LAKE ARTHUR", "loc" : [ -92.682526, 30.09097 ], "pop" : 5011, "state" : "LA" } +{ "_id" : "70552", "city" : "LOREAUVILLE", "loc" : [ -91.659571, 30.068276 ], "pop" : 109, "state" : "LA" } +{ "_id" : "70554", "city" : "MAMOU", "loc" : [ -92.419646, 30.649648 ], "pop" : 6639, "state" : "LA" } +{ "_id" : "70555", "city" : "MAURICE", "loc" : [ -92.107035, 30.07215 ], "pop" : 3628, "state" : "LA" } +{ "_id" : "70559", "city" : "MIDLAND", "loc" : [ -92.46315300000001, 30.143437 ], "pop" : 4566, "state" : "LA" } +{ "_id" : "70560", "city" : "NEW IBERIA", "loc" : [ -91.819959, 30.001027 ], "pop" : 56105, "state" : "LA" } +{ "_id" : "70570", "city" : "OPELOUSAS", "loc" : [ -92.089668, 30.51442 ], "pop" : 46673, "state" : "LA" } +{ "_id" : "70577", "city" : "PORT BARRE", "loc" : [ -91.92857600000001, 30.547788 ], "pop" : 4940, "state" : "LA" } +{ "_id" : "70578", "city" : "RAYNE", "loc" : [ -92.248592, 30.204508 ], "pop" : 15652, "state" : "LA" } +{ "_id" : "70581", "city" : "ROANOKE", "loc" : [ -92.68697299999999, 30.318167 ], "pop" : 2766, "state" : "LA" } +{ "_id" : "70582", "city" : "SAINT MARTINVILL", "loc" : [ -91.82596100000001, 30.208282 ], "pop" : 29590, "state" : "LA" } +{ "_id" : "70583", "city" : "SCOTT", "loc" : [ -92.098079, 30.250401 ], "pop" : 9093, "state" : "LA" } +{ "_id" : "70584", "city" : "CANKTON", "loc" : [ -92.075681, 30.393741 ], "pop" : 634, "state" : "LA" } +{ "_id" : "70586", "city" : "VILLE PLATTE", "loc" : [ -92.27370999999999, 30.692376 ], "pop" : 14291, "state" : "LA" } +{ "_id" : "70589", "city" : "WASHINGTON", "loc" : [ -92.039888, 30.709881 ], "pop" : 3771, "state" : "LA" } +{ "_id" : "70591", "city" : "WELSH", "loc" : [ -92.818972, 30.236259 ], "pop" : 5587, "state" : "LA" } +{ "_id" : "70592", "city" : "YOUNGSVILLE", "loc" : [ -92.009629, 30.097498 ], "pop" : 6671, "state" : "LA" } +{ "_id" : "70601", "city" : "LAKE CHARLES", "loc" : [ -93.187966, 30.228453 ], "pop" : 49710, "state" : "LA" } +{ "_id" : "70605", "city" : "LAKE CHARLES", "loc" : [ -93.22179800000001, 30.169349 ], "pop" : 42627, "state" : "LA" } +{ "_id" : "70611", "city" : "LAKE CHARLES", "loc" : [ -93.211082, 30.322031 ], "pop" : 12470, "state" : "LA" } +{ "_id" : "70630", "city" : "BELL CITY", "loc" : [ -92.94407, 30.114454 ], "pop" : 1365, "state" : "LA" } +{ "_id" : "70631", "city" : "CAMERON", "loc" : [ -93.27766200000001, 29.86492 ], "pop" : 5677, "state" : "LA" } +{ "_id" : "70632", "city" : "CREOLE", "loc" : [ -93.034874, 29.797813 ], "pop" : 1023, "state" : "LA" } +{ "_id" : "70633", "city" : "DEQUINCY", "loc" : [ -93.415053, 30.421113 ], "pop" : 8271, "state" : "LA" } +{ "_id" : "70634", "city" : "DERIDDER", "loc" : [ -93.268461, 30.828738 ], "pop" : 19304, "state" : "LA" } +{ "_id" : "70637", "city" : "DRY CREEK", "loc" : [ -92.988849, 30.735356 ], "pop" : 1597, "state" : "LA" } +{ "_id" : "70639", "city" : "EVANS", "loc" : [ -93.42217100000001, 31.008817 ], "pop" : 2757, "state" : "LA" } +{ "_id" : "70643", "city" : "GRAND CHENIER", "loc" : [ -92.897997, 29.787535 ], "pop" : 696, "state" : "LA" } +{ "_id" : "70645", "city" : "HACKBERRY", "loc" : [ -93.374973, 29.982187 ], "pop" : 1668, "state" : "LA" } +{ "_id" : "70647", "city" : "IOWA", "loc" : [ -93.02585999999999, 30.221937 ], "pop" : 4915, "state" : "LA" } +{ "_id" : "70648", "city" : "KINDER", "loc" : [ -92.869332, 30.460653 ], "pop" : 6853, "state" : "LA" } +{ "_id" : "70650", "city" : "LACASSINE", "loc" : [ -92.829262, 30.145587 ], "pop" : 460, "state" : "LA" } +{ "_id" : "70652", "city" : "LONGVILLE", "loc" : [ -93.254806, 30.579992 ], "pop" : 1324, "state" : "LA" } +{ "_id" : "70653", "city" : "FIELDS", "loc" : [ -93.530734, 30.770145 ], "pop" : 3273, "state" : "LA" } +{ "_id" : "70654", "city" : "MITTIE", "loc" : [ -92.932056, 30.678812 ], "pop" : 477, "state" : "LA" } +{ "_id" : "70655", "city" : "OBERLIN", "loc" : [ -92.752672, 30.6162 ], "pop" : 3121, "state" : "LA" } +{ "_id" : "70656", "city" : "PITKIN", "loc" : [ -92.954762, 30.932988 ], "pop" : 3603, "state" : "LA" } +{ "_id" : "70657", "city" : "RAGLEY", "loc" : [ -93.23365200000001, 30.470262 ], "pop" : 2530, "state" : "LA" } +{ "_id" : "70658", "city" : "REEVES", "loc" : [ -93.03684699999999, 30.496734 ], "pop" : 1718, "state" : "LA" } +{ "_id" : "70660", "city" : "SINGER", "loc" : [ -93.464986, 30.532906 ], "pop" : 2374, "state" : "LA" } +{ "_id" : "70661", "city" : "STARKS", "loc" : [ -93.661485, 30.308477 ], "pop" : 2457, "state" : "LA" } +{ "_id" : "70662", "city" : "SUGARTOWN", "loc" : [ -93.017017, 30.827653 ], "pop" : 319, "state" : "LA" } +{ "_id" : "70663", "city" : "SULPHUR", "loc" : [ -93.363911, 30.219001 ], "pop" : 29774, "state" : "LA" } +{ "_id" : "70668", "city" : "VINTON", "loc" : [ -93.57280799999999, 30.201523 ], "pop" : 6584, "state" : "LA" } +{ "_id" : "70669", "city" : "WESTLAKE", "loc" : [ -93.268837, 30.261274 ], "pop" : 11106, "state" : "LA" } +{ "_id" : "70710", "city" : "ADDIS", "loc" : [ -91.261348, 30.355699 ], "pop" : 2354, "state" : "LA" } +{ "_id" : "70711", "city" : "ALBANY", "loc" : [ -90.59641499999999, 30.514872 ], "pop" : 4533, "state" : "LA" } +{ "_id" : "70712", "city" : "ANGOLA", "loc" : [ -91.597948, 30.96562 ], "pop" : 5382, "state" : "LA" } +{ "_id" : "70714", "city" : "BAKER", "loc" : [ -91.142893, 30.581395 ], "pop" : 19623, "state" : "LA" } +{ "_id" : "70715", "city" : "BATCHELOR", "loc" : [ -91.66867499999999, 30.802631 ], "pop" : 1864, "state" : "LA" } +{ "_id" : "70717", "city" : "BLANKS", "loc" : [ -91.61584499999999, 30.579813 ], "pop" : 1657, "state" : "LA" } +{ "_id" : "70719", "city" : "BRUSLY", "loc" : [ -91.25264900000001, 30.387692 ], "pop" : 3429, "state" : "LA" } +{ "_id" : "70720", "city" : "BUECHE", "loc" : [ -91.338303, 30.574894 ], "pop" : 504, "state" : "LA" } +{ "_id" : "70721", "city" : "POINT CLAIR", "loc" : [ -91.102484, 30.220759 ], "pop" : 1104, "state" : "LA" } +{ "_id" : "70722", "city" : "CLINTON", "loc" : [ -90.93314100000001, 30.824867 ], "pop" : 3028, "state" : "LA" } +{ "_id" : "70723", "city" : "CONVENT", "loc" : [ -90.864988, 30.055251 ], "pop" : 2052, "state" : "LA" } +{ "_id" : "70725", "city" : "DARROW", "loc" : [ -90.965102, 30.12999 ], "pop" : 1090, "state" : "LA" } +{ "_id" : "70726", "city" : "PORT VINCENT", "loc" : [ -90.932588, 30.484623 ], "pop" : 34574, "state" : "LA" } +{ "_id" : "70729", "city" : "ERWINVILLE", "loc" : [ -91.399444, 30.551252 ], "pop" : 342, "state" : "LA" } +{ "_id" : "70730", "city" : "ETHEL", "loc" : [ -91.10997500000001, 30.813124 ], "pop" : 3979, "state" : "LA" } +{ "_id" : "70732", "city" : "FORDOCHE", "loc" : [ -91.69725800000001, 30.550835 ], "pop" : 0, "state" : "LA" } +{ "_id" : "70733", "city" : "FRENCH SETTLEMEN", "loc" : [ -90.773225, 30.336394 ], "pop" : 3132, "state" : "LA" } +{ "_id" : "70734", "city" : "GEISMAR", "loc" : [ -90.975824, 30.236265 ], "pop" : 3622, "state" : "LA" } +{ "_id" : "70736", "city" : "GLYNN", "loc" : [ -91.342311, 30.637617 ], "pop" : 557, "state" : "LA" } +{ "_id" : "70737", "city" : "GONZALES", "loc" : [ -90.918012, 30.247306 ], "pop" : 21482, "state" : "LA" } +{ "_id" : "70739", "city" : "GREENWELL SPRING", "loc" : [ -91.00748400000001, 30.52114 ], "pop" : 8000, "state" : "LA" } +{ "_id" : "70740", "city" : "GROSSE TETE", "loc" : [ -91.43828999999999, 30.387935 ], "pop" : 956, "state" : "LA" } +{ "_id" : "70744", "city" : "HOLDEN", "loc" : [ -90.665176, 30.555646 ], "pop" : 2424, "state" : "LA" } +{ "_id" : "70748", "city" : "THE BLUFFS", "loc" : [ -91.234537, 30.827034 ], "pop" : 7635, "state" : "LA" } +{ "_id" : "70749", "city" : "JARREAU", "loc" : [ -91.433205, 30.632585 ], "pop" : 1365, "state" : "LA" } +{ "_id" : "70750", "city" : "KROTZ SPRINGS", "loc" : [ -91.75632899999999, 30.537928 ], "pop" : 935, "state" : "LA" } +{ "_id" : "70752", "city" : "LAKELAND", "loc" : [ -91.421677, 30.579941 ], "pop" : 839, "state" : "LA" } +{ "_id" : "70753", "city" : "LETTSWORTH", "loc" : [ -91.740252, 30.932394 ], "pop" : 1589, "state" : "LA" } +{ "_id" : "70754", "city" : "LIVINGSTON", "loc" : [ -90.76733900000001, 30.474107 ], "pop" : 4653, "state" : "LA" } +{ "_id" : "70755", "city" : "LIVONIA", "loc" : [ -91.533219, 30.552353 ], "pop" : 2711, "state" : "LA" } +{ "_id" : "70756", "city" : "LOTTIE", "loc" : [ -91.71053000000001, 30.503947 ], "pop" : 9, "state" : "LA" } +{ "_id" : "70757", "city" : "RAMAH", "loc" : [ -91.51681600000001, 30.482292 ], "pop" : 2070, "state" : "LA" } +{ "_id" : "70759", "city" : "MORGANZA", "loc" : [ -91.595935, 30.724491 ], "pop" : 1082, "state" : "LA" } +{ "_id" : "70760", "city" : "NEW ROADS", "loc" : [ -91.44212400000001, 30.701356 ], "pop" : 7642, "state" : "LA" } +{ "_id" : "70761", "city" : "NORWOOD", "loc" : [ -91.062871, 30.951772 ], "pop" : 1833, "state" : "LA" } +{ "_id" : "70762", "city" : "OSCAR", "loc" : [ -91.48457999999999, 30.598759 ], "pop" : 744, "state" : "LA" } +{ "_id" : "70763", "city" : "PAULINA", "loc" : [ -90.73743899999999, 30.035159 ], "pop" : 2639, "state" : "LA" } +{ "_id" : "70764", "city" : "PLAQUEMINE", "loc" : [ -91.25236099999999, 30.268414 ], "pop" : 16692, "state" : "LA" } +{ "_id" : "70767", "city" : "PORT ALLEN", "loc" : [ -91.254088, 30.471983 ], "pop" : 12837, "state" : "LA" } +{ "_id" : "70769", "city" : "GALVEZ", "loc" : [ -90.92990399999999, 30.315588 ], "pop" : 13275, "state" : "LA" } +{ "_id" : "70770", "city" : "PRIDE", "loc" : [ -90.99429000000001, 30.613321 ], "pop" : 5260, "state" : "LA" } +{ "_id" : "70772", "city" : "ROSEDALE", "loc" : [ -91.45616, 30.440776 ], "pop" : 807, "state" : "LA" } +{ "_id" : "70773", "city" : "ROUGON", "loc" : [ -91.381316, 30.603452 ], "pop" : 542, "state" : "LA" } +{ "_id" : "70774", "city" : "SAINT AMANT", "loc" : [ -90.84352699999999, 30.23849 ], "pop" : 6177, "state" : "LA" } +{ "_id" : "70775", "city" : "BAINS", "loc" : [ -91.39226600000001, 30.858658 ], "pop" : 5634, "state" : "LA" } +{ "_id" : "70776", "city" : "IBERVILLE", "loc" : [ -91.09162000000001, 30.279873 ], "pop" : 3225, "state" : "LA" } +{ "_id" : "70777", "city" : "SLAUGHTER", "loc" : [ -91.052251, 30.799139 ], "pop" : 4558, "state" : "LA" } +{ "_id" : "70778", "city" : "SORRENTO", "loc" : [ -90.86314, 30.185388 ], "pop" : 1303, "state" : "LA" } +{ "_id" : "70780", "city" : "SUNSHINE", "loc" : [ -91.179922, 30.29824 ], "pop" : 395, "state" : "LA" } +{ "_id" : "70781", "city" : "TORBERT", "loc" : [ -91.421616, 30.538575 ], "pop" : 27, "state" : "LA" } +{ "_id" : "70783", "city" : "VENTRESS", "loc" : [ -91.403257, 30.681404 ], "pop" : 1926, "state" : "LA" } +{ "_id" : "70785", "city" : "WALKER", "loc" : [ -90.85570800000001, 30.524748 ], "pop" : 12659, "state" : "LA" } +{ "_id" : "70788", "city" : "WHITE CASTLE", "loc" : [ -91.17734299999999, 30.15447 ], "pop" : 5739, "state" : "LA" } +{ "_id" : "70789", "city" : "WILSON", "loc" : [ -91.065511, 30.947325 ], "pop" : 77, "state" : "LA" } +{ "_id" : "70791", "city" : "ZACHARY", "loc" : [ -91.135841, 30.656129 ], "pop" : 18647, "state" : "LA" } +{ "_id" : "70792", "city" : "UNCLE SAM", "loc" : [ -90.771879, 30.021679 ], "pop" : 263, "state" : "LA" } +{ "_id" : "70801", "city" : "BATON ROUGE", "loc" : [ -91.186954, 30.450731 ], "pop" : 62, "state" : "LA" } +{ "_id" : "70802", "city" : "BATON ROUGE", "loc" : [ -91.169037, 30.444236 ], "pop" : 35116, "state" : "LA" } +{ "_id" : "70805", "city" : "BATON ROUGE", "loc" : [ -91.148095, 30.48604 ], "pop" : 30584, "state" : "LA" } +{ "_id" : "70806", "city" : "BATON ROUGE", "loc" : [ -91.13004599999999, 30.448486 ], "pop" : 25893, "state" : "LA" } +{ "_id" : "70807", "city" : "SCOTLANDVILLE", "loc" : [ -91.17861499999999, 30.533199 ], "pop" : 23234, "state" : "LA" } +{ "_id" : "70808", "city" : "BATON ROUGE", "loc" : [ -91.146765, 30.406596 ], "pop" : 31189, "state" : "LA" } +{ "_id" : "70809", "city" : "BATON ROUGE", "loc" : [ -91.08421300000001, 30.408891 ], "pop" : 15623, "state" : "LA" } +{ "_id" : "70810", "city" : "BATON ROUGE", "loc" : [ -91.091898, 30.363309 ], "pop" : 22331, "state" : "LA" } +{ "_id" : "70811", "city" : "GREENWOOD", "loc" : [ -91.12653899999999, 30.53046 ], "pop" : 13653, "state" : "LA" } +{ "_id" : "70812", "city" : "BATON ROUGE", "loc" : [ -91.118111, 30.505159 ], "pop" : 11842, "state" : "LA" } +{ "_id" : "70814", "city" : "BATON ROUGE", "loc" : [ -91.06893599999999, 30.484808 ], "pop" : 13227, "state" : "LA" } +{ "_id" : "70815", "city" : "BATON ROUGE", "loc" : [ -91.059558, 30.455809 ], "pop" : 27565, "state" : "LA" } +{ "_id" : "70816", "city" : "BATON ROUGE", "loc" : [ -91.035645, 30.427289 ], "pop" : 32885, "state" : "LA" } +{ "_id" : "70817", "city" : "BATON ROUGE", "loc" : [ -91.00212999999999, 30.390404 ], "pop" : 20916, "state" : "LA" } +{ "_id" : "70818", "city" : "BATON ROUGE", "loc" : [ -91.049964, 30.540832 ], "pop" : 8368, "state" : "LA" } +{ "_id" : "70819", "city" : "BATON ROUGE", "loc" : [ -91.01564999999999, 30.46679 ], "pop" : 5377, "state" : "LA" } +{ "_id" : "70820", "city" : "BATON ROUGE", "loc" : [ -91.167064, 30.379523 ], "pop" : 10710, "state" : "LA" } +{ "_id" : "71001", "city" : "ARCADIA", "loc" : [ -92.92452900000001, 32.555643 ], "pop" : 4367, "state" : "LA" } +{ "_id" : "71003", "city" : "ATHENS", "loc" : [ -93.023875, 32.645073 ], "pop" : 1336, "state" : "LA" } +{ "_id" : "71004", "city" : "BELCHER", "loc" : [ -93.85079899999999, 32.754393 ], "pop" : 849, "state" : "LA" } +{ "_id" : "71006", "city" : "BENTON", "loc" : [ -93.69095, 32.697617 ], "pop" : 7234, "state" : "LA" } +{ "_id" : "71007", "city" : "BETHANY", "loc" : [ -94.003394, 32.366179 ], "pop" : 404, "state" : "LA" } +{ "_id" : "71008", "city" : "BIENVILLE", "loc" : [ -92.908402, 32.252323 ], "pop" : 445, "state" : "LA" } +{ "_id" : "71016", "city" : "CASTOR", "loc" : [ -93.093576, 32.245181 ], "pop" : 2784, "state" : "LA" } +{ "_id" : "71018", "city" : "COTTON VALLEY", "loc" : [ -93.42588499999999, 32.819011 ], "pop" : 2061, "state" : "LA" } +{ "_id" : "71019", "city" : "HANNA", "loc" : [ -93.31564400000001, 32.050099 ], "pop" : 9339, "state" : "LA" } +{ "_id" : "71023", "city" : "DOYLINE", "loc" : [ -93.399585, 32.490023 ], "pop" : 3065, "state" : "LA" } +{ "_id" : "71024", "city" : "DUBBERLY", "loc" : [ -93.21419, 32.519164 ], "pop" : 1117, "state" : "LA" } +{ "_id" : "71027", "city" : "FRIERSON", "loc" : [ -93.69148800000001, 32.244968 ], "pop" : 1600, "state" : "LA" } +{ "_id" : "71028", "city" : "GIBSLAND", "loc" : [ -93.07055800000001, 32.529874 ], "pop" : 2219, "state" : "LA" } +{ "_id" : "71029", "city" : "GILLIAM", "loc" : [ -93.829268, 32.825055 ], "pop" : 367, "state" : "LA" } +{ "_id" : "71030", "city" : "GLOSTER", "loc" : [ -93.82930899999999, 32.191705 ], "pop" : 1242, "state" : "LA" } +{ "_id" : "71031", "city" : "GOLDONNA", "loc" : [ -92.961056, 31.999988 ], "pop" : 1378, "state" : "LA" } +{ "_id" : "71032", "city" : "GRAND CANE", "loc" : [ -93.79406400000001, 32.105 ], "pop" : 1048, "state" : "LA" } +{ "_id" : "71033", "city" : "GREENWOOD", "loc" : [ -93.969252, 32.424025 ], "pop" : 3140, "state" : "LA" } +{ "_id" : "71034", "city" : "HALL SUMMIT", "loc" : [ -93.30475, 32.175249 ], "pop" : 227, "state" : "LA" } +{ "_id" : "71037", "city" : "HAUGHTON", "loc" : [ -93.565742, 32.550732 ], "pop" : 13876, "state" : "LA" } +{ "_id" : "71038", "city" : "HAYNESVILLE", "loc" : [ -93.069137, 32.927807 ], "pop" : 7888, "state" : "LA" } +{ "_id" : "71039", "city" : "HEFLIN", "loc" : [ -93.285192, 32.447008 ], "pop" : 1415, "state" : "LA" } +{ "_id" : "71040", "city" : "HOMER", "loc" : [ -93.028834, 32.774883 ], "pop" : 6963, "state" : "LA" } +{ "_id" : "71043", "city" : "HOSSTON", "loc" : [ -93.883425, 32.896653 ], "pop" : 766, "state" : "LA" } +{ "_id" : "71044", "city" : "IDA", "loc" : [ -93.902186, 32.993393 ], "pop" : 742, "state" : "LA" } +{ "_id" : "71045", "city" : "JAMESTOWN", "loc" : [ -93.184758, 32.36127 ], "pop" : 380, "state" : "LA" } +{ "_id" : "71046", "city" : "KEATCHIE", "loc" : [ -93.95104600000001, 32.162173 ], "pop" : 1068, "state" : "LA" } +{ "_id" : "71047", "city" : "KEITHVILLE", "loc" : [ -93.888138, 32.316059 ], "pop" : 8291, "state" : "LA" } +{ "_id" : "71048", "city" : "LISBON", "loc" : [ -92.88781, 32.845196 ], "pop" : 427, "state" : "LA" } +{ "_id" : "71049", "city" : "LOGANSPORT", "loc" : [ -93.962733, 31.994327 ], "pop" : 4130, "state" : "LA" } +{ "_id" : "71051", "city" : "ELM GROVE", "loc" : [ -93.50261500000001, 32.388628 ], "pop" : 2216, "state" : "LA" } +{ "_id" : "71052", "city" : "MANSFIELD", "loc" : [ -93.69804499999999, 32.023863 ], "pop" : 12317, "state" : "LA" } +{ "_id" : "71055", "city" : "MINDEN", "loc" : [ -93.28858700000001, 32.632281 ], "pop" : 21954, "state" : "LA" } +{ "_id" : "71059", "city" : "MIRA", "loc" : [ -93.918797, 32.922491 ], "pop" : 207, "state" : "LA" } +{ "_id" : "71060", "city" : "MOORINGSPORT", "loc" : [ -93.973018, 32.66258 ], "pop" : 2838, "state" : "LA" } +{ "_id" : "71061", "city" : "OIL CITY", "loc" : [ -93.983844, 32.745107 ], "pop" : 1874, "state" : "LA" } +{ "_id" : "71063", "city" : "PELICAN", "loc" : [ -93.563361, 31.896563 ], "pop" : 998, "state" : "LA" } +{ "_id" : "71064", "city" : "PLAIN DEALING", "loc" : [ -93.690534, 32.907419 ], "pop" : 4904, "state" : "LA" } +{ "_id" : "71065", "city" : "PLEASANT HILL", "loc" : [ -93.513594, 31.808577 ], "pop" : 1338, "state" : "LA" } +{ "_id" : "71067", "city" : "PRINCETON", "loc" : [ -93.522577, 32.579089 ], "pop" : 1914, "state" : "LA" } +{ "_id" : "71068", "city" : "RINGGOLD", "loc" : [ -93.298241, 32.326302 ], "pop" : 4442, "state" : "LA" } +{ "_id" : "71069", "city" : "RODESSA", "loc" : [ -93.988474, 32.970079 ], "pop" : 1014, "state" : "LA" } +{ "_id" : "71070", "city" : "CHESTNUT", "loc" : [ -92.948606, 32.156604 ], "pop" : 1207, "state" : "LA" } +{ "_id" : "71071", "city" : "SAREPTA", "loc" : [ -93.44040699999999, 32.943361 ], "pop" : 4570, "state" : "LA" } +{ "_id" : "71072", "city" : "SHONGALOO", "loc" : [ -93.29626399999999, 32.971289 ], "pop" : 752, "state" : "LA" } +{ "_id" : "71073", "city" : "SIBLEY", "loc" : [ -93.30090199999999, 32.509539 ], "pop" : 1363, "state" : "LA" } +{ "_id" : "71075", "city" : "SPRINGHILL", "loc" : [ -93.459563, 33.00054 ], "pop" : 6271, "state" : "LA" } +{ "_id" : "71078", "city" : "STONEWALL", "loc" : [ -93.80027699999999, 32.284758 ], "pop" : 3009, "state" : "LA" } +{ "_id" : "71079", "city" : "SUMMERFIELD", "loc" : [ -92.821516, 32.923802 ], "pop" : 25, "state" : "LA" } +{ "_id" : "71082", "city" : "TREES", "loc" : [ -93.987312, 32.866844 ], "pop" : 5880, "state" : "LA" } +{ "_id" : "71101", "city" : "SHREVEPORT", "loc" : [ -93.748696, 32.503743 ], "pop" : 11355, "state" : "LA" } +{ "_id" : "71103", "city" : "SHREVEPORT", "loc" : [ -93.772701, 32.494459 ], "pop" : 12908, "state" : "LA" } +{ "_id" : "71104", "city" : "SHREVEPORT", "loc" : [ -93.73486200000001, 32.482978 ], "pop" : 14181, "state" : "LA" } +{ "_id" : "71105", "city" : "SHREVEPORT", "loc" : [ -93.714341, 32.458882 ], "pop" : 19053, "state" : "LA" } +{ "_id" : "71106", "city" : "FORBING", "loc" : [ -93.747922, 32.426251 ], "pop" : 32844, "state" : "LA" } +{ "_id" : "71107", "city" : "DIXIE", "loc" : [ -93.82878100000001, 32.564652 ], "pop" : 29013, "state" : "LA" } +{ "_id" : "71108", "city" : "SHREVEPORT", "loc" : [ -93.781378, 32.448596 ], "pop" : 19800, "state" : "LA" } +{ "_id" : "71109", "city" : "SHREVEPORT", "loc" : [ -93.80129700000001, 32.473994 ], "pop" : 27393, "state" : "LA" } +{ "_id" : "71110", "city" : "BARKSDALE A F B", "loc" : [ -93.638172, 32.514313 ], "pop" : 3518, "state" : "LA" } +{ "_id" : "71111", "city" : "BOSSIER CITY", "loc" : [ -93.70382600000001, 32.544924 ], "pop" : 26472, "state" : "LA" } +{ "_id" : "71112", "city" : "BOSSIER CITY", "loc" : [ -93.676723, 32.486025 ], "pop" : 25299, "state" : "LA" } +{ "_id" : "71115", "city" : "CASPIANA", "loc" : [ -93.697402, 32.410156 ], "pop" : 8897, "state" : "LA" } +{ "_id" : "71118", "city" : "SHREVEPORT", "loc" : [ -93.802543, 32.397664 ], "pop" : 23539, "state" : "LA" } +{ "_id" : "71119", "city" : "SHREVEPORT", "loc" : [ -93.87260999999999, 32.477121 ], "pop" : 10578, "state" : "LA" } +{ "_id" : "71129", "city" : "SHREVEPORT", "loc" : [ -93.87419199999999, 32.41412 ], "pop" : 12661, "state" : "LA" } +{ "_id" : "71201", "city" : "MONROE", "loc" : [ -92.106104, 32.528551 ], "pop" : 22419, "state" : "LA" } +{ "_id" : "71202", "city" : "RICHWOOD", "loc" : [ -92.090231, 32.463327 ], "pop" : 32038, "state" : "LA" } +{ "_id" : "71203", "city" : "MONROE", "loc" : [ -92.042241, 32.553038 ], "pop" : 35643, "state" : "LA" } +{ "_id" : "71219", "city" : "BASKIN", "loc" : [ -91.713154, 32.289728 ], "pop" : 1518, "state" : "LA" } +{ "_id" : "71220", "city" : "BASTROP", "loc" : [ -91.90776, 32.789382 ], "pop" : 26388, "state" : "LA" } +{ "_id" : "71222", "city" : "BERNICE", "loc" : [ -92.62626899999999, 32.821024 ], "pop" : 3510, "state" : "LA" } +{ "_id" : "71223", "city" : "BONITA", "loc" : [ -91.682158, 32.912263 ], "pop" : 963, "state" : "LA" } +{ "_id" : "71225", "city" : "CALHOUN", "loc" : [ -92.32992900000001, 32.524791 ], "pop" : 4082, "state" : "LA" } +{ "_id" : "71226", "city" : "CHATHAM", "loc" : [ -92.437433, 32.292246 ], "pop" : 1254, "state" : "LA" } +{ "_id" : "71227", "city" : "CHOUDRANT", "loc" : [ -92.522419, 32.555627 ], "pop" : 5436, "state" : "LA" } +{ "_id" : "71229", "city" : "COLLINSTON", "loc" : [ -91.86341899999999, 32.697143 ], "pop" : 1128, "state" : "LA" } +{ "_id" : "71232", "city" : "WARDEN", "loc" : [ -91.51248699999999, 32.450433 ], "pop" : 6657, "state" : "LA" } +{ "_id" : "71234", "city" : "DOWNSVILLE", "loc" : [ -92.374471, 32.652508 ], "pop" : 4019, "state" : "LA" } +{ "_id" : "71235", "city" : "DUBACH", "loc" : [ -92.678543, 32.694893 ], "pop" : 2838, "state" : "LA" } +{ "_id" : "71237", "city" : "EPPS", "loc" : [ -91.49135, 32.616099 ], "pop" : 1586, "state" : "LA" } +{ "_id" : "71238", "city" : "EROS", "loc" : [ -92.34795, 32.398822 ], "pop" : 2296, "state" : "LA" } +{ "_id" : "71239", "city" : "EXTENSION", "loc" : [ -91.801091, 31.947065 ], "pop" : 263, "state" : "LA" } +{ "_id" : "71241", "city" : "FARMERVILLE", "loc" : [ -92.317955, 32.753378 ], "pop" : 7172, "state" : "LA" } +{ "_id" : "71243", "city" : "FORT NECESSITY", "loc" : [ -91.825694, 32.043412 ], "pop" : 74, "state" : "LA" } +{ "_id" : "71245", "city" : "GRAMBLING", "loc" : [ -92.715785, 32.524398 ], "pop" : 5740, "state" : "LA" } +{ "_id" : "71250", "city" : "JONES", "loc" : [ -91.596509, 32.966286 ], "pop" : 386, "state" : "LA" } +{ "_id" : "71251", "city" : "JONESBORO", "loc" : [ -92.694425, 32.248292 ], "pop" : 11078, "state" : "LA" } +{ "_id" : "71254", "city" : "LAKE PROVIDENCE", "loc" : [ -91.19056999999999, 32.807067 ], "pop" : 7774, "state" : "LA" } +{ "_id" : "71256", "city" : "LILLIE", "loc" : [ -92.68576899999999, 32.952931 ], "pop" : 439, "state" : "LA" } +{ "_id" : "71259", "city" : "MANGHAM", "loc" : [ -91.797607, 32.333114 ], "pop" : 3493, "state" : "LA" } +{ "_id" : "71260", "city" : "LINVILLE", "loc" : [ -92.25706, 32.888155 ], "pop" : 3761, "state" : "LA" } +{ "_id" : "71261", "city" : "MER ROUGE", "loc" : [ -91.771643, 32.77176 ], "pop" : 2177, "state" : "LA" } +{ "_id" : "71263", "city" : "TERRY", "loc" : [ -91.41290499999999, 32.872258 ], "pop" : 9056, "state" : "LA" } +{ "_id" : "71264", "city" : "OAK RIDGE", "loc" : [ -91.761785, 32.624317 ], "pop" : 913, "state" : "LA" } +{ "_id" : "71266", "city" : "PIONEER", "loc" : [ -91.464822, 32.715436 ], "pop" : 1451, "state" : "LA" } +{ "_id" : "71268", "city" : "QUITMAN", "loc" : [ -92.70853200000001, 32.356423 ], "pop" : 2603, "state" : "LA" } +{ "_id" : "71269", "city" : "ALTO", "loc" : [ -91.76430000000001, 32.468938 ], "pop" : 11441, "state" : "LA" } +{ "_id" : "71270", "city" : "RUSTON", "loc" : [ -92.64392700000001, 32.530823 ], "pop" : 26114, "state" : "LA" } +{ "_id" : "71275", "city" : "SIMSBORO", "loc" : [ -92.79948400000001, 32.538388 ], "pop" : 2476, "state" : "LA" } +{ "_id" : "71276", "city" : "SONDHEIMER", "loc" : [ -91.248197, 32.577216 ], "pop" : 887, "state" : "LA" } +{ "_id" : "71277", "city" : "SPEARSVILLE", "loc" : [ -92.58698, 32.955022 ], "pop" : 2830, "state" : "LA" } +{ "_id" : "71280", "city" : "SPENCER", "loc" : [ -92.12134, 32.593268 ], "pop" : 14, "state" : "LA" } +{ "_id" : "71282", "city" : "MOUND", "loc" : [ -91.190066, 32.402127 ], "pop" : 12354, "state" : "LA" } +{ "_id" : "71286", "city" : "TRANSYLVANIA", "loc" : [ -91.228813, 32.670529 ], "pop" : 1067, "state" : "LA" } +{ "_id" : "71291", "city" : "WEST MONROE", "loc" : [ -92.175971, 32.531726 ], "pop" : 27809, "state" : "LA" } +{ "_id" : "71292", "city" : "WEST MONROE", "loc" : [ -92.185445, 32.456599 ], "pop" : 17851, "state" : "LA" } +{ "_id" : "71295", "city" : "WINNSBORO", "loc" : [ -91.71084500000001, 32.159229 ], "pop" : 14751, "state" : "LA" } +{ "_id" : "71301", "city" : "ALEXANDRIA", "loc" : [ -92.46334899999999, 31.288519 ], "pop" : 25040, "state" : "LA" } +{ "_id" : "71302", "city" : "ALEXANDRIA", "loc" : [ -92.42416900000001, 31.268272 ], "pop" : 16918, "state" : "LA" } +{ "_id" : "71303", "city" : "ALEXANDRIA", "loc" : [ -92.508892, 31.304838 ], "pop" : 21759, "state" : "LA" } +{ "_id" : "71316", "city" : "ACME", "loc" : [ -91.821563, 31.301618 ], "pop" : 173, "state" : "LA" } +{ "_id" : "71318", "city" : "BIG BEND", "loc" : [ -91.84506500000001, 31.079347 ], "pop" : 786, "state" : "LA" } +{ "_id" : "71322", "city" : "EOLA", "loc" : [ -92.182582, 30.949284 ], "pop" : 6271, "state" : "LA" } +{ "_id" : "71323", "city" : "CENTER POINT", "loc" : [ -92.18786799999999, 31.263068 ], "pop" : 1720, "state" : "LA" } +{ "_id" : "71325", "city" : "CHENEYVILLE", "loc" : [ -92.29514399999999, 31.020097 ], "pop" : 1545, "state" : "LA" } +{ "_id" : "71326", "city" : "CLAYTON", "loc" : [ -91.542547, 31.78857 ], "pop" : 1070, "state" : "LA" } +{ "_id" : "71327", "city" : "COTTONPORT", "loc" : [ -92.05812400000001, 30.986168 ], "pop" : 3190, "state" : "LA" } +{ "_id" : "71328", "city" : "BUCKEYE", "loc" : [ -92.202287, 31.354506 ], "pop" : 6080, "state" : "LA" } +{ "_id" : "71331", "city" : "VICK", "loc" : [ -92.194182, 31.189613 ], "pop" : 447, "state" : "LA" } +{ "_id" : "71333", "city" : "GOUDEAU", "loc" : [ -92.090039, 30.951089 ], "pop" : 919, "state" : "LA" } +{ "_id" : "71334", "city" : "FROGMORE", "loc" : [ -91.571958, 31.647944 ], "pop" : 9280, "state" : "LA" } +{ "_id" : "71336", "city" : "GILBERT", "loc" : [ -91.592026, 32.034943 ], "pop" : 793, "state" : "LA" } +{ "_id" : "71339", "city" : "HAMBURG", "loc" : [ -91.916177, 31.073269 ], "pop" : 481, "state" : "LA" } +{ "_id" : "71340", "city" : "HARRISONBURG", "loc" : [ -91.883971, 31.766926 ], "pop" : 2348, "state" : "LA" } +{ "_id" : "71341", "city" : "HESSMER", "loc" : [ -92.139933, 31.0534 ], "pop" : 3057, "state" : "LA" } +{ "_id" : "71342", "city" : "JENA", "loc" : [ -92.113677, 31.674817 ], "pop" : 5796, "state" : "LA" } +{ "_id" : "71343", "city" : "LARTO", "loc" : [ -91.845812, 31.636486 ], "pop" : 5507, "state" : "LA" } +{ "_id" : "71346", "city" : "LECOMPTE", "loc" : [ -92.389031, 31.106032 ], "pop" : 3056, "state" : "LA" } +{ "_id" : "71350", "city" : "MANSURA", "loc" : [ -92.054333, 31.061466 ], "pop" : 3239, "state" : "LA" } +{ "_id" : "71351", "city" : "MARKSVILLE", "loc" : [ -92.083145, 31.139614 ], "pop" : 11217, "state" : "LA" } +{ "_id" : "71353", "city" : "MELVILLE", "loc" : [ -91.75649, 30.662643 ], "pop" : 2713, "state" : "LA" } +{ "_id" : "71354", "city" : "MONTEREY", "loc" : [ -91.734455, 31.440287 ], "pop" : 2074, "state" : "LA" } +{ "_id" : "71355", "city" : "MOREAUVILLE", "loc" : [ -91.981814, 31.036766 ], "pop" : 1914, "state" : "LA" } +{ "_id" : "71356", "city" : "LE MOYEN", "loc" : [ -92.040781, 30.824887 ], "pop" : 404, "state" : "LA" } +{ "_id" : "71357", "city" : "NEWELLTON", "loc" : [ -91.25777100000001, 32.065621 ], "pop" : 3235, "state" : "LA" } +{ "_id" : "71358", "city" : "PALMETTO", "loc" : [ -91.911384, 30.706543 ], "pop" : 621, "state" : "LA" } +{ "_id" : "71360", "city" : "KOLIN", "loc" : [ -92.399276, 31.34991 ], "pop" : 37069, "state" : "LA" } +{ "_id" : "71362", "city" : "PLAUCHEVILLE", "loc" : [ -91.984673, 30.936484 ], "pop" : 2517, "state" : "LA" } +{ "_id" : "71366", "city" : "SAINT JOSEPH", "loc" : [ -91.278432, 31.924805 ], "pop" : 2073, "state" : "LA" } +{ "_id" : "71367", "city" : "SAINT LANDRY", "loc" : [ -92.393846, 30.83812 ], "pop" : 5679, "state" : "LA" } +{ "_id" : "71368", "city" : "SICILY ISLAND", "loc" : [ -91.680711, 31.850734 ], "pop" : 1568, "state" : "LA" } +{ "_id" : "71369", "city" : "SIMMESPORT", "loc" : [ -91.825868, 30.977119 ], "pop" : 3137, "state" : "LA" } +{ "_id" : "71371", "city" : "TROUT", "loc" : [ -92.19931, 31.653142 ], "pop" : 3624, "state" : "LA" } +{ "_id" : "71373", "city" : "VIDALIA", "loc" : [ -91.469471, 31.578222 ], "pop" : 9257, "state" : "LA" } +{ "_id" : "71375", "city" : "WATERPROOF", "loc" : [ -91.387154, 31.807613 ], "pop" : 1245, "state" : "LA" } +{ "_id" : "71378", "city" : "WISNER", "loc" : [ -91.67679800000001, 31.991252 ], "pop" : 4116, "state" : "LA" } +{ "_id" : "71401", "city" : "AIMWELL", "loc" : [ -91.992491, 31.761898 ], "pop" : 51, "state" : "LA" } +{ "_id" : "71403", "city" : "ANACOCO", "loc" : [ -93.358949, 31.221762 ], "pop" : 4978, "state" : "LA" } +{ "_id" : "71404", "city" : "ATLANTA", "loc" : [ -92.76412500000001, 31.873583 ], "pop" : 2466, "state" : "LA" } +{ "_id" : "71406", "city" : "BELMONT", "loc" : [ -93.495863, 31.709956 ], "pop" : 616, "state" : "LA" } +{ "_id" : "71407", "city" : "BENTLEY", "loc" : [ -92.49272999999999, 31.466035 ], "pop" : 2805, "state" : "LA" } +{ "_id" : "71409", "city" : "BOYCE", "loc" : [ -92.68668099999999, 31.321601 ], "pop" : 4672, "state" : "LA" } +{ "_id" : "71411", "city" : "CAMPTI", "loc" : [ -93.09357199999999, 31.895851 ], "pop" : 3990, "state" : "LA" } +{ "_id" : "71412", "city" : "CHOPIN", "loc" : [ -92.94971700000001, 31.541916 ], "pop" : 434, "state" : "LA" } +{ "_id" : "71416", "city" : "DERRY", "loc" : [ -92.857326, 31.535918 ], "pop" : 802, "state" : "LA" } +{ "_id" : "71417", "city" : "COLFAX", "loc" : [ -92.656758, 31.507948 ], "pop" : 5520, "state" : "LA" } +{ "_id" : "71418", "city" : "HEBERT", "loc" : [ -92.10365299999999, 32.114794 ], "pop" : 4785, "state" : "LA" } +{ "_id" : "71419", "city" : "MITCHELL", "loc" : [ -93.71569, 31.785153 ], "pop" : 1592, "state" : "LA" } +{ "_id" : "71422", "city" : "DODSON", "loc" : [ -92.678292, 32.070131 ], "pop" : 2198, "state" : "LA" } +{ "_id" : "71423", "city" : "DRY PRONG", "loc" : [ -92.566479, 31.597921 ], "pop" : 1993, "state" : "LA" } +{ "_id" : "71424", "city" : "ELMER", "loc" : [ -92.717062, 31.146476 ], "pop" : 1364, "state" : "LA" } +{ "_id" : "71425", "city" : "ENTERPRISE", "loc" : [ -91.87514899999999, 31.906412 ], "pop" : 124, "state" : "LA" } +{ "_id" : "71426", "city" : "FISHER", "loc" : [ -93.46019699999999, 31.493655 ], "pop" : 370, "state" : "LA" } +{ "_id" : "71427", "city" : "FLATWOODS", "loc" : [ -92.881246, 31.384882 ], "pop" : 312, "state" : "LA" } +{ "_id" : "71429", "city" : "FLORIEN", "loc" : [ -93.517916, 31.427455 ], "pop" : 6006, "state" : "LA" } +{ "_id" : "71430", "city" : "FOREST HILL", "loc" : [ -92.51079799999999, 31.024304 ], "pop" : 1804, "state" : "LA" } +{ "_id" : "71432", "city" : "GEORGETOWN", "loc" : [ -92.39518200000001, 31.745006 ], "pop" : 1016, "state" : "LA" } +{ "_id" : "71433", "city" : "CALCASIEU", "loc" : [ -92.645758, 30.978384 ], "pop" : 4204, "state" : "LA" } +{ "_id" : "71435", "city" : "GRAYSON", "loc" : [ -91.974615, 32.012108 ], "pop" : 324, "state" : "LA" } +{ "_id" : "71438", "city" : "LEANDER", "loc" : [ -92.77488, 31.082535 ], "pop" : 854, "state" : "LA" } +{ "_id" : "71439", "city" : "HORNBECK", "loc" : [ -93.368306, 31.322639 ], "pop" : 1352, "state" : "LA" } +{ "_id" : "71441", "city" : "KELLY", "loc" : [ -92.12607199999999, 32.028619 ], "pop" : 4042, "state" : "LA" } +{ "_id" : "71444", "city" : "LACAMP", "loc" : [ -92.89618299999999, 31.160702 ], "pop" : 276, "state" : "LA" } +{ "_id" : "71446", "city" : "HICKS", "loc" : [ -93.223957, 31.144292 ], "pop" : 21956, "state" : "LA" } +{ "_id" : "71447", "city" : "CHOPIN", "loc" : [ -92.77185, 31.418481 ], "pop" : 757, "state" : "LA" } +{ "_id" : "71449", "city" : "MANY", "loc" : [ -93.464113, 31.58508 ], "pop" : 6560, "state" : "LA" } +{ "_id" : "71450", "city" : "MARTHAVILLE", "loc" : [ -93.395428, 31.772583 ], "pop" : 932, "state" : "LA" } +{ "_id" : "71451", "city" : "MELDER", "loc" : [ -92.66218600000001, 31.11932 ], "pop" : 377, "state" : "LA" } +{ "_id" : "71454", "city" : "MONTGOMERY", "loc" : [ -92.841178, 31.667388 ], "pop" : 2263, "state" : "LA" } +{ "_id" : "71455", "city" : "CLIFTON", "loc" : [ -92.888915, 31.333927 ], "pop" : 443, "state" : "LA" } +{ "_id" : "71456", "city" : "NATCHEZ", "loc" : [ -93.024117, 31.661502 ], "pop" : 2070, "state" : "LA" } +{ "_id" : "71457", "city" : "NATCHITOCHES", "loc" : [ -93.091572, 31.761688 ], "pop" : 23878, "state" : "LA" } +{ "_id" : "71459", "city" : "FORT POLK", "loc" : [ -93.22213000000001, 31.032068 ], "pop" : 27181, "state" : "LA" } +{ "_id" : "71461", "city" : "NEWLLANO", "loc" : [ -93.287899, 31.069396 ], "pop" : 250, "state" : "LA" } +{ "_id" : "71462", "city" : "NOBLE", "loc" : [ -93.716679, 31.693849 ], "pop" : 841, "state" : "LA" } +{ "_id" : "71463", "city" : "OAKDALE", "loc" : [ -92.66396400000001, 30.817173 ], "pop" : 9577, "state" : "LA" } +{ "_id" : "71465", "city" : "OLLA", "loc" : [ -92.22139, 31.87339 ], "pop" : 3448, "state" : "LA" } +{ "_id" : "71466", "city" : "OTIS", "loc" : [ -92.744478, 31.226442 ], "pop" : 231, "state" : "LA" } +{ "_id" : "71467", "city" : "POLLOCK", "loc" : [ -92.400536, 31.499966 ], "pop" : 4328, "state" : "LA" } +{ "_id" : "71468", "city" : "PROVENCAL", "loc" : [ -93.140089, 31.580117 ], "pop" : 2700, "state" : "LA" } +{ "_id" : "71469", "city" : "ROBELINE", "loc" : [ -93.320972, 31.771453 ], "pop" : 939, "state" : "LA" } +{ "_id" : "71472", "city" : "SIEPER", "loc" : [ -92.76981000000001, 31.197034 ], "pop" : 474, "state" : "LA" } +{ "_id" : "71473", "city" : "SIKES", "loc" : [ -92.442894, 32.068616 ], "pop" : 579, "state" : "LA" } +{ "_id" : "71477", "city" : "TIOGA", "loc" : [ -92.44711599999999, 31.415732 ], "pop" : 2158, "state" : "LA" } +{ "_id" : "71479", "city" : "TULLOS", "loc" : [ -92.301254, 31.853088 ], "pop" : 1280, "state" : "LA" } +{ "_id" : "71483", "city" : "WINNFIELD", "loc" : [ -92.636646, 31.921389 ], "pop" : 9295, "state" : "LA" } +{ "_id" : "71485", "city" : "WOODWORTH", "loc" : [ -92.49899600000001, 31.132588 ], "pop" : 1932, "state" : "LA" } +{ "_id" : "71486", "city" : "ZWOLLE", "loc" : [ -93.663569, 31.61379 ], "pop" : 5325, "state" : "LA" } +{ "_id" : "71601", "city" : "NORTH CEDAR", "loc" : [ -91.995812, 34.215405 ], "pop" : 23095, "state" : "AR" } +{ "_id" : "71602", "city" : "DOLLARWAY", "loc" : [ -92.089718, 34.257001 ], "pop" : 15547, "state" : "AR" } +{ "_id" : "71603", "city" : "PINE BLUFF", "loc" : [ -92.044786, 34.189745 ], "pop" : 36473, "state" : "AR" } +{ "_id" : "71630", "city" : "ARKANSAS CITY", "loc" : [ -91.232529, 33.614328 ], "pop" : 7, "state" : "AR" } +{ "_id" : "71631", "city" : "BANKS", "loc" : [ -92.260386, 33.549665 ], "pop" : 514, "state" : "AR" } +{ "_id" : "71635", "city" : "NORTH", "loc" : [ -91.959152, 33.152369 ], "pop" : 14645, "state" : "AR" } +{ "_id" : "71638", "city" : "DERMOTT", "loc" : [ -91.439391, 33.524054 ], "pop" : 5880, "state" : "AR" } +{ "_id" : "71639", "city" : "DUMAS", "loc" : [ -91.486056, 33.892102 ], "pop" : 7033, "state" : "AR" } +{ "_id" : "71640", "city" : "EUDORA", "loc" : [ -91.271552, 33.12135 ], "pop" : 4860, "state" : "AR" } +{ "_id" : "71642", "city" : "FOUNTAIN HILL", "loc" : [ -91.835627, 33.342951 ], "pop" : 704, "state" : "AR" } +{ "_id" : "71643", "city" : "GOULD", "loc" : [ -91.576798, 34.034503 ], "pop" : 3765, "state" : "AR" } +{ "_id" : "71644", "city" : "TAMO", "loc" : [ -91.67082000000001, 34.030484 ], "pop" : 3768, "state" : "AR" } +{ "_id" : "71646", "city" : "HAMBURG", "loc" : [ -91.80226500000001, 33.2058 ], "pop" : 5422, "state" : "AR" } +{ "_id" : "71647", "city" : "INGALLS", "loc" : [ -92.127714, 33.422207 ], "pop" : 2150, "state" : "AR" } +{ "_id" : "71651", "city" : "JERSEY", "loc" : [ -92.29661299999999, 33.388914 ], "pop" : 301, "state" : "AR" } +{ "_id" : "71652", "city" : "KINGSLAND", "loc" : [ -92.30141500000001, 33.86002 ], "pop" : 993, "state" : "AR" } +{ "_id" : "71653", "city" : "LAKE VILLAGE", "loc" : [ -91.282487, 33.327408 ], "pop" : 5501, "state" : "AR" } +{ "_id" : "71654", "city" : "MC GEHEE", "loc" : [ -91.392781, 33.62971 ], "pop" : 6646, "state" : "AR" } +{ "_id" : "71655", "city" : "MONTICELLO", "loc" : [ -91.794845, 33.624951 ], "pop" : 14127, "state" : "AR" } +{ "_id" : "71658", "city" : "MONTROSE", "loc" : [ -91.52277599999999, 33.307516 ], "pop" : 948, "state" : "AR" } +{ "_id" : "71660", "city" : "NEW EDINBURG", "loc" : [ -92.193909, 33.758846 ], "pop" : 1105, "state" : "AR" } +{ "_id" : "71661", "city" : "PARKDALE", "loc" : [ -91.542793, 33.121267 ], "pop" : 560, "state" : "AR" } +{ "_id" : "71662", "city" : "PICKENS", "loc" : [ -91.39157, 33.807923 ], "pop" : 1228, "state" : "AR" } +{ "_id" : "71663", "city" : "PORTLAND", "loc" : [ -91.513935, 33.231773 ], "pop" : 773, "state" : "AR" } +{ "_id" : "71665", "city" : "RISON", "loc" : [ -92.118762, 33.945325 ], "pop" : 5669, "state" : "AR" } +{ "_id" : "71666", "city" : "ROHWER", "loc" : [ -91.205124, 33.616003 ], "pop" : 656, "state" : "AR" } +{ "_id" : "71667", "city" : "STAR CITY", "loc" : [ -91.865343, 33.940528 ], "pop" : 5913, "state" : "AR" } +{ "_id" : "71670", "city" : "REED", "loc" : [ -91.520287, 33.67479 ], "pop" : 739, "state" : "AR" } +{ "_id" : "71671", "city" : "WARREN", "loc" : [ -92.07782400000001, 33.613983 ], "pop" : 8828, "state" : "AR" } +{ "_id" : "71674", "city" : "WATSON", "loc" : [ -91.28145499999999, 33.890737 ], "pop" : 1003, "state" : "AR" } +{ "_id" : "71675", "city" : "WILMAR", "loc" : [ -91.925697, 33.621296 ], "pop" : 1293, "state" : "AR" } +{ "_id" : "71676", "city" : "WILMOT", "loc" : [ -91.572283, 33.057557 ], "pop" : 1267, "state" : "AR" } +{ "_id" : "71677", "city" : "WINCHESTER", "loc" : [ -91.543059, 33.752039 ], "pop" : 687, "state" : "AR" } +{ "_id" : "71678", "city" : "YORKTOWN", "loc" : [ -91.79647199999999, 34.017166 ], "pop" : 868, "state" : "AR" } +{ "_id" : "71701", "city" : "EAST CAMDEN", "loc" : [ -92.833386, 33.575866 ], "pop" : 22640, "state" : "AR" } +{ "_id" : "71720", "city" : "BEARDEN", "loc" : [ -92.61802, 33.729797 ], "pop" : 1945, "state" : "AR" } +{ "_id" : "71722", "city" : "BLUFF CITY", "loc" : [ -93.18681100000001, 33.698191 ], "pop" : 546, "state" : "AR" } +{ "_id" : "71725", "city" : "CARTHAGE", "loc" : [ -92.62623000000001, 34.063625 ], "pop" : 1255, "state" : "AR" } +{ "_id" : "71726", "city" : "READER", "loc" : [ -93.018716, 33.700148 ], "pop" : 1416, "state" : "AR" } +{ "_id" : "71730", "city" : "EL DORADO", "loc" : [ -92.662856, 33.20735 ], "pop" : 35308, "state" : "AR" } +{ "_id" : "71740", "city" : "EMERSON", "loc" : [ -93.198699, 33.089054 ], "pop" : 1888, "state" : "AR" } +{ "_id" : "71742", "city" : "FORDYCE", "loc" : [ -92.42247500000001, 33.817648 ], "pop" : 6001, "state" : "AR" } +{ "_id" : "71743", "city" : "GURDON", "loc" : [ -93.14169099999999, 33.912493 ], "pop" : 4180, "state" : "AR" } +{ "_id" : "71744", "city" : "HAMPTON", "loc" : [ -92.52951, 33.537613 ], "pop" : 3505, "state" : "AR" } +{ "_id" : "71745", "city" : "HARRELL", "loc" : [ -92.391243, 33.510865 ], "pop" : 846, "state" : "AR" } +{ "_id" : "71747", "city" : "HUTTIG", "loc" : [ -92.194153, 33.045888 ], "pop" : 1287, "state" : "AR" } +{ "_id" : "71748", "city" : "IVAN", "loc" : [ -92.43940600000001, 33.902984 ], "pop" : 353, "state" : "AR" } +{ "_id" : "71749", "city" : "JUNCTION CITY", "loc" : [ -92.684254, 33.043965 ], "pop" : 1553, "state" : "AR" } +{ "_id" : "71751", "city" : "LOUANN", "loc" : [ -92.782759, 33.411744 ], "pop" : 1667, "state" : "AR" } +{ "_id" : "71752", "city" : "MC NEIL", "loc" : [ -93.193006, 33.36222 ], "pop" : 2020, "state" : "AR" } +{ "_id" : "71753", "city" : "MAGNOLIA", "loc" : [ -93.239153, 33.264678 ], "pop" : 16379, "state" : "AR" } +{ "_id" : "71758", "city" : "MOUNT HOLLY", "loc" : [ -92.944265, 33.308534 ], "pop" : 514, "state" : "AR" } +{ "_id" : "71759", "city" : "NORPHLET", "loc" : [ -92.657619, 33.309619 ], "pop" : 1765, "state" : "AR" } +{ "_id" : "71762", "city" : "SMACKOVER", "loc" : [ -92.74424999999999, 33.339831 ], "pop" : 3554, "state" : "AR" } +{ "_id" : "71763", "city" : "MANNING", "loc" : [ -92.810984, 33.902989 ], "pop" : 2005, "state" : "AR" } +{ "_id" : "71764", "city" : "STEPHENS", "loc" : [ -93.02139099999999, 33.455044 ], "pop" : 2906, "state" : "AR" } +{ "_id" : "71765", "city" : "STRONG", "loc" : [ -92.362104, 33.119526 ], "pop" : 2738, "state" : "AR" } +{ "_id" : "71766", "city" : "THORNTON", "loc" : [ -92.468299, 33.767694 ], "pop" : 1272, "state" : "AR" } +{ "_id" : "71767", "city" : "TINSMAN", "loc" : [ -92.382192, 33.643436 ], "pop" : 203, "state" : "AR" } +{ "_id" : "71769", "city" : "VILLAGE", "loc" : [ -93.046404, 33.281849 ], "pop" : 882, "state" : "AR" } +{ "_id" : "71770", "city" : "WALDO", "loc" : [ -93.294915, 33.360017 ], "pop" : 2862, "state" : "AR" } +{ "_id" : "71801", "city" : "PERRYTOWN", "loc" : [ -93.590305, 33.656645 ], "pop" : 15955, "state" : "AR" } +{ "_id" : "71822", "city" : "ASHDOWN", "loc" : [ -94.135102, 33.678711 ], "pop" : 8514, "state" : "AR" } +{ "_id" : "71825", "city" : "BLEVINS", "loc" : [ -93.536035, 33.875468 ], "pop" : 831, "state" : "AR" } +{ "_id" : "71826", "city" : "BRADLEY", "loc" : [ -93.62749599999999, 33.106963 ], "pop" : 2623, "state" : "AR" } +{ "_id" : "71827", "city" : "BUCKNER", "loc" : [ -93.44699799999999, 33.375323 ], "pop" : 1364, "state" : "AR" } +{ "_id" : "71828", "city" : "CALE", "loc" : [ -93.26497000000001, 33.616403 ], "pop" : 230, "state" : "AR" } +{ "_id" : "71831", "city" : "COLUMBUS", "loc" : [ -93.85588, 33.745108 ], "pop" : 739, "state" : "AR" } +{ "_id" : "71832", "city" : "DE QUEEN", "loc" : [ -94.338559, 34.044206 ], "pop" : 7593, "state" : "AR" } +{ "_id" : "71833", "city" : "DIERKS", "loc" : [ -94.015243, 34.13232 ], "pop" : 2284, "state" : "AR" } +{ "_id" : "71834", "city" : "DODDRIDGE", "loc" : [ -93.954307, 33.105448 ], "pop" : 1435, "state" : "AR" } +{ "_id" : "71835", "city" : "EMMET", "loc" : [ -93.423242, 33.692896 ], "pop" : 1141, "state" : "AR" } +{ "_id" : "71836", "city" : "FOREMAN", "loc" : [ -94.388108, 33.71759 ], "pop" : 2740, "state" : "AR" } +{ "_id" : "71837", "city" : "FOUKE", "loc" : [ -93.900953, 33.302476 ], "pop" : 5895, "state" : "AR" } +{ "_id" : "71838", "city" : "FULTON", "loc" : [ -93.80856199999999, 33.629876 ], "pop" : 925, "state" : "AR" } +{ "_id" : "71839", "city" : "GARLAND CITY", "loc" : [ -93.731624, 33.335161 ], "pop" : 666, "state" : "AR" } +{ "_id" : "71841", "city" : "GILLHAM", "loc" : [ -94.316497, 34.157003 ], "pop" : 853, "state" : "AR" } +{ "_id" : "71842", "city" : "HORATIO", "loc" : [ -94.295942, 33.939221 ], "pop" : 2952, "state" : "AR" } +{ "_id" : "71845", "city" : "LEWISVILLE", "loc" : [ -93.595258, 33.373603 ], "pop" : 2550, "state" : "AR" } +{ "_id" : "71846", "city" : "LOCKESBURG", "loc" : [ -94.127588, 33.930553 ], "pop" : 2239, "state" : "AR" } +{ "_id" : "71847", "city" : "MC CASKILL", "loc" : [ -93.626605, 33.923042 ], "pop" : 658, "state" : "AR" } +{ "_id" : "71851", "city" : "MINERAL SPRINGS", "loc" : [ -93.918828, 33.863852 ], "pop" : 2732, "state" : "AR" } +{ "_id" : "71852", "city" : "NASHVILLE", "loc" : [ -93.87070900000001, 33.957646 ], "pop" : 7625, "state" : "AR" } +{ "_id" : "71853", "city" : "OGDEN", "loc" : [ -94.027826, 33.585706 ], "pop" : 779, "state" : "AR" } +{ "_id" : "71855", "city" : "OZAN", "loc" : [ -93.771443, 33.902775 ], "pop" : 1695, "state" : "AR" } +{ "_id" : "71857", "city" : "PRESCOTT", "loc" : [ -93.372544, 33.804029 ], "pop" : 5732, "state" : "AR" } +{ "_id" : "71858", "city" : "ROSSTON", "loc" : [ -93.30389099999999, 33.561693 ], "pop" : 1561, "state" : "AR" } +{ "_id" : "71859", "city" : "SARATOGA", "loc" : [ -93.876723, 33.759883 ], "pop" : 281, "state" : "AR" } +{ "_id" : "71860", "city" : "STAMPS", "loc" : [ -93.501307, 33.356877 ], "pop" : 3106, "state" : "AR" } +{ "_id" : "71861", "city" : "TAYLOR", "loc" : [ -93.44601900000001, 33.107957 ], "pop" : 1660, "state" : "AR" } +{ "_id" : "71862", "city" : "WASHINGTON", "loc" : [ -93.673529, 33.754596 ], "pop" : 821, "state" : "AR" } +{ "_id" : "71864", "city" : "WILLISVILLE", "loc" : [ -93.31211999999999, 33.484731 ], "pop" : 888, "state" : "AR" } +{ "_id" : "71865", "city" : "WILTON", "loc" : [ -94.135746, 33.734794 ], "pop" : 983, "state" : "AR" } +{ "_id" : "71866", "city" : "WINTHROP", "loc" : [ -94.395174, 33.858321 ], "pop" : 950, "state" : "AR" } +{ "_id" : "71901", "city" : "LAKE CATHERINE", "loc" : [ -93.02602400000001, 34.501475 ], "pop" : 27402, "state" : "AR" } +{ "_id" : "71909", "city" : "HOT SPRINGS VILL", "loc" : [ -93.00638600000001, 34.65862 ], "pop" : 8268, "state" : "AR" } +{ "_id" : "71913", "city" : "LAKE HAMILTON", "loc" : [ -93.109177, 34.473304 ], "pop" : 31048, "state" : "AR" } +{ "_id" : "71921", "city" : "AMITY", "loc" : [ -93.420551, 34.259362 ], "pop" : 1569, "state" : "AR" } +{ "_id" : "71922", "city" : "ANTOINE", "loc" : [ -93.437169, 34.028296 ], "pop" : 474, "state" : "AR" } +{ "_id" : "71923", "city" : "ARKADELPHIA", "loc" : [ -93.068989, 34.11525 ], "pop" : 14961, "state" : "AR" } +{ "_id" : "71929", "city" : "BISMARCK", "loc" : [ -93.187236, 34.311033 ], "pop" : 1291, "state" : "AR" } +{ "_id" : "71931", "city" : "BLAKELY", "loc" : [ -93.063509, 34.703957 ], "pop" : 271, "state" : "AR" } +{ "_id" : "71933", "city" : "BONNERDALE", "loc" : [ -93.31941500000001, 34.349751 ], "pop" : 1037, "state" : "AR" } +{ "_id" : "71935", "city" : "CADDO GAP", "loc" : [ -93.586376, 34.397579 ], "pop" : 2257, "state" : "AR" } +{ "_id" : "71937", "city" : "COVE", "loc" : [ -94.39234, 34.419159 ], "pop" : 1681, "state" : "AR" } +{ "_id" : "71940", "city" : "DELIGHT", "loc" : [ -93.524666, 34.023772 ], "pop" : 1529, "state" : "AR" } +{ "_id" : "71941", "city" : "DONALDSON", "loc" : [ -92.909384, 34.221221 ], "pop" : 748, "state" : "AR" } +{ "_id" : "71942", "city" : "FRIENDSHIP", "loc" : [ -92.98039300000001, 34.241225 ], "pop" : 626, "state" : "AR" } +{ "_id" : "71943", "city" : "GLENWOOD", "loc" : [ -93.555881, 34.319207 ], "pop" : 2720, "state" : "AR" } +{ "_id" : "71944", "city" : "GRANNIS", "loc" : [ -94.32550000000001, 34.237021 ], "pop" : 751, "state" : "AR" } +{ "_id" : "71945", "city" : "HATFIELD", "loc" : [ -94.371397, 34.487703 ], "pop" : 1048, "state" : "AR" } +{ "_id" : "71949", "city" : "JESSIEVILLE", "loc" : [ -93.19631800000001, 34.693729 ], "pop" : 931, "state" : "AR" } +{ "_id" : "71950", "city" : "KIRBY", "loc" : [ -93.616716, 34.255153 ], "pop" : 973, "state" : "AR" } +{ "_id" : "71952", "city" : "LANGLEY", "loc" : [ -93.850942, 34.314035 ], "pop" : 215, "state" : "AR" } +{ "_id" : "71953", "city" : "MENA", "loc" : [ -94.220984, 34.581435 ], "pop" : 12505, "state" : "AR" } +{ "_id" : "71956", "city" : "BUCKVILLE", "loc" : [ -93.16004100000001, 34.577182 ], "pop" : 1857, "state" : "AR" } +{ "_id" : "71957", "city" : "MOUNT IDA", "loc" : [ -93.574904, 34.561194 ], "pop" : 3052, "state" : "AR" } +{ "_id" : "71958", "city" : "MURFREESBORO", "loc" : [ -93.710903, 34.101734 ], "pop" : 3775, "state" : "AR" } +{ "_id" : "71959", "city" : "NEWHOPE", "loc" : [ -93.89048699999999, 34.227347 ], "pop" : 400, "state" : "AR" } +{ "_id" : "71960", "city" : "NORMAN", "loc" : [ -93.67430400000001, 34.459633 ], "pop" : 688, "state" : "AR" } +{ "_id" : "71961", "city" : "ODEN", "loc" : [ -93.82110299999999, 34.611292 ], "pop" : 710, "state" : "AR" } +{ "_id" : "71962", "city" : "OKOLONA", "loc" : [ -93.28967900000001, 34.055138 ], "pop" : 985, "state" : "AR" } +{ "_id" : "71964", "city" : "PEARCY", "loc" : [ -93.24201499999999, 34.435092 ], "pop" : 3215, "state" : "AR" } +{ "_id" : "71965", "city" : "PENCIL BLUFF", "loc" : [ -93.742947, 34.639946 ], "pop" : 323, "state" : "AR" } +{ "_id" : "71968", "city" : "ROYAL", "loc" : [ -93.289734, 34.515049 ], "pop" : 1099, "state" : "AR" } +{ "_id" : "71969", "city" : "SIMS", "loc" : [ -93.674071, 34.646181 ], "pop" : 461, "state" : "AR" } +{ "_id" : "71970", "city" : "STORY", "loc" : [ -93.537587, 34.668695 ], "pop" : 350, "state" : "AR" } +{ "_id" : "71971", "city" : "UMPIRE", "loc" : [ -94.03137700000001, 34.292129 ], "pop" : 647, "state" : "AR" } +{ "_id" : "71972", "city" : "VANDERVOORT", "loc" : [ -94.369788, 34.379535 ], "pop" : 323, "state" : "AR" } +{ "_id" : "71973", "city" : "WICKES", "loc" : [ -94.34025699999999, 34.308806 ], "pop" : 1273, "state" : "AR" } +{ "_id" : "72001", "city" : "ADONA", "loc" : [ -92.903325, 35.046956 ], "pop" : 494, "state" : "AR" } +{ "_id" : "72002", "city" : "ALEXANDER", "loc" : [ -92.472673, 34.631266 ], "pop" : 7984, "state" : "AR" } +{ "_id" : "72003", "city" : "ALMYRA", "loc" : [ -91.430992, 34.41459 ], "pop" : 626, "state" : "AR" } +{ "_id" : "72004", "city" : "ALTHEIMER", "loc" : [ -91.82891600000001, 34.306168 ], "pop" : 1929, "state" : "AR" } +{ "_id" : "72005", "city" : "AMAGON", "loc" : [ -91.07963599999999, 35.561559 ], "pop" : 457, "state" : "AR" } +{ "_id" : "72006", "city" : "AUGUSTA", "loc" : [ -91.352653, 35.278806 ], "pop" : 3702, "state" : "AR" } +{ "_id" : "72007", "city" : "AUSTIN", "loc" : [ -91.95939799999999, 35.028369 ], "pop" : 1741, "state" : "AR" } +{ "_id" : "72010", "city" : "BALD KNOB", "loc" : [ -91.550197, 35.311331 ], "pop" : 5132, "state" : "AR" } +{ "_id" : "72011", "city" : "BAUXITE", "loc" : [ -92.36053099999999, 34.545537 ], "pop" : 6956, "state" : "AR" } +{ "_id" : "72012", "city" : "BEEBE", "loc" : [ -91.907449, 35.093743 ], "pop" : 7862, "state" : "AR" } +{ "_id" : "72013", "city" : "BEE BRANCH", "loc" : [ -92.408523, 35.423367 ], "pop" : 1344, "state" : "AR" } +{ "_id" : "72014", "city" : "BEEDEVILLE", "loc" : [ -91.106371, 35.420267 ], "pop" : 518, "state" : "AR" } +{ "_id" : "72015", "city" : "BENTON", "loc" : [ -92.595241, 34.580087 ], "pop" : 36525, "state" : "AR" } +{ "_id" : "72016", "city" : "BIGELOW", "loc" : [ -92.630842, 34.984659 ], "pop" : 2001, "state" : "AR" } +{ "_id" : "72017", "city" : "BISCOE", "loc" : [ -91.490028, 34.833706 ], "pop" : 1348, "state" : "AR" } +{ "_id" : "72020", "city" : "BRADFORD", "loc" : [ -91.518973, 35.427655 ], "pop" : 3546, "state" : "AR" } +{ "_id" : "72021", "city" : "BRINKLEY", "loc" : [ -91.188596, 34.878124 ], "pop" : 6313, "state" : "AR" } +{ "_id" : "72022", "city" : "BRYANT", "loc" : [ -92.49201499999999, 34.606786 ], "pop" : 6065, "state" : "AR" } +{ "_id" : "72023", "city" : "CABOT", "loc" : [ -92.03177100000001, 34.945724 ], "pop" : 21197, "state" : "AR" } +{ "_id" : "72024", "city" : "CARLISLE", "loc" : [ -91.745929, 34.793291 ], "pop" : 2904, "state" : "AR" } +{ "_id" : "72025", "city" : "CASA", "loc" : [ -93.047005, 35.032168 ], "pop" : 649, "state" : "AR" } +{ "_id" : "72026", "city" : "CASSCOE", "loc" : [ -91.324798, 34.473625 ], "pop" : 1033, "state" : "AR" } +{ "_id" : "72027", "city" : "CENTER RIDGE", "loc" : [ -92.558167, 35.398063 ], "pop" : 981, "state" : "AR" } +{ "_id" : "72028", "city" : "CHOCTAW", "loc" : [ -92.426412, 35.523528 ], "pop" : 1091, "state" : "AR" } +{ "_id" : "72029", "city" : "CLARENDON", "loc" : [ -91.256426, 34.660138 ], "pop" : 3211, "state" : "AR" } +{ "_id" : "72030", "city" : "CLEVELAND", "loc" : [ -92.71282100000001, 35.358328 ], "pop" : 1244, "state" : "AR" } +{ "_id" : "72031", "city" : "CLINTON", "loc" : [ -92.475825, 35.604537 ], "pop" : 4098, "state" : "AR" } +{ "_id" : "72032", "city" : "CONWAY", "loc" : [ -92.423574, 35.084199 ], "pop" : 43236, "state" : "AR" } +{ "_id" : "72036", "city" : "COTTON PLANT", "loc" : [ -91.229043, 35.017827 ], "pop" : 1789, "state" : "AR" } +{ "_id" : "72038", "city" : "CROCKETTS BLUFF", "loc" : [ -91.232079, 34.425272 ], "pop" : 132, "state" : "AR" } +{ "_id" : "72039", "city" : "TWIN GROVES", "loc" : [ -92.432952, 35.291042 ], "pop" : 1605, "state" : "AR" } +{ "_id" : "72040", "city" : "DES ARC", "loc" : [ -91.511342, 34.97507 ], "pop" : 3446, "state" : "AR" } +{ "_id" : "72041", "city" : "DE VALLS BLUFF", "loc" : [ -91.49821799999999, 34.744704 ], "pop" : 1854, "state" : "AR" } +{ "_id" : "72042", "city" : "DE WITT", "loc" : [ -91.33362700000001, 34.285312 ], "pop" : 5320, "state" : "AR" } +{ "_id" : "72044", "city" : "EDGEMONT", "loc" : [ -92.199471, 35.623006 ], "pop" : 487, "state" : "AR" } +{ "_id" : "72045", "city" : "EL PASO", "loc" : [ -92.090076, 35.114176 ], "pop" : 580, "state" : "AR" } +{ "_id" : "72046", "city" : "ENGLAND", "loc" : [ -91.94842199999999, 34.557458 ], "pop" : 5254, "state" : "AR" } +{ "_id" : "72047", "city" : "ENOLA", "loc" : [ -92.212328, 35.208705 ], "pop" : 500, "state" : "AR" } +{ "_id" : "72048", "city" : "ETHEL", "loc" : [ -91.13983899999999, 34.243525 ], "pop" : 27, "state" : "AR" } +{ "_id" : "72051", "city" : "FOX", "loc" : [ -92.304266, 35.768208 ], "pop" : 960, "state" : "AR" } +{ "_id" : "72052", "city" : "GARNER", "loc" : [ -91.742884, 35.130305 ], "pop" : 618, "state" : "AR" } +{ "_id" : "72055", "city" : "GILLETT", "loc" : [ -91.380048, 34.121838 ], "pop" : 925, "state" : "AR" } +{ "_id" : "72057", "city" : "GRAPEVINE", "loc" : [ -92.31094400000001, 34.130893 ], "pop" : 591, "state" : "AR" } +{ "_id" : "72058", "city" : "GREENBRIER", "loc" : [ -92.357792, 35.229547 ], "pop" : 5532, "state" : "AR" } +{ "_id" : "72060", "city" : "GRIFFITHVILLE", "loc" : [ -91.624234, 35.114383 ], "pop" : 582, "state" : "AR" } +{ "_id" : "72061", "city" : "GUY", "loc" : [ -92.33153900000001, 35.318487 ], "pop" : 1026, "state" : "AR" } +{ "_id" : "72063", "city" : "HATTIEVILLE", "loc" : [ -92.778317, 35.290713 ], "pop" : 360, "state" : "AR" } +{ "_id" : "72064", "city" : "HAZEN", "loc" : [ -91.576699, 34.783833 ], "pop" : 1841, "state" : "AR" } +{ "_id" : "72065", "city" : "HENSLEY", "loc" : [ -92.21401899999999, 34.591133 ], "pop" : 3696, "state" : "AR" } +{ "_id" : "72066", "city" : "HICKORY PLAINS", "loc" : [ -91.750844, 34.978642 ], "pop" : 522, "state" : "AR" } +{ "_id" : "72067", "city" : "GREERS FERRY", "loc" : [ -92.182284, 35.549812 ], "pop" : 1802, "state" : "AR" } +{ "_id" : "72068", "city" : "HIGGINSON", "loc" : [ -91.71827999999999, 35.188254 ], "pop" : 786, "state" : "AR" } +{ "_id" : "72069", "city" : "HOLLY GROVE", "loc" : [ -91.184376, 34.599294 ], "pop" : 1417, "state" : "AR" } +{ "_id" : "72070", "city" : "HOUSTON", "loc" : [ -92.69131899999999, 35.036209 ], "pop" : 642, "state" : "AR" } +{ "_id" : "72072", "city" : "HUMNOKE", "loc" : [ -91.75661599999999, 34.541896 ], "pop" : 992, "state" : "AR" } +{ "_id" : "72073", "city" : "HUMPHREY", "loc" : [ -91.67896, 34.403387 ], "pop" : 851, "state" : "AR" } +{ "_id" : "72076", "city" : "GRAVEL RIDGE", "loc" : [ -92.13043500000001, 34.881985 ], "pop" : 37428, "state" : "AR" } +{ "_id" : "72079", "city" : "JEFFERSON", "loc" : [ -92.148574, 34.355285 ], "pop" : 1682, "state" : "AR" } +{ "_id" : "72080", "city" : "JERUSALEM", "loc" : [ -92.813886, 35.37975 ], "pop" : 765, "state" : "AR" } +{ "_id" : "72081", "city" : "JUDSONIA", "loc" : [ -91.64908699999999, 35.324954 ], "pop" : 7033, "state" : "AR" } +{ "_id" : "72082", "city" : "KENSETT", "loc" : [ -91.66967200000001, 35.229939 ], "pop" : 2123, "state" : "AR" } +{ "_id" : "72083", "city" : "KEO", "loc" : [ -92.00784400000001, 34.604072 ], "pop" : 278, "state" : "AR" } +{ "_id" : "72084", "city" : "LEOLA", "loc" : [ -92.597865, 34.185605 ], "pop" : 769, "state" : "AR" } +{ "_id" : "72086", "city" : "LONOKE", "loc" : [ -91.921367, 34.783162 ], "pop" : 6733, "state" : "AR" } +{ "_id" : "72087", "city" : "LONSDALE", "loc" : [ -92.834034, 34.556203 ], "pop" : 456, "state" : "AR" } +{ "_id" : "72101", "city" : "MC CRORY", "loc" : [ -91.179327, 35.247292 ], "pop" : 4029, "state" : "AR" } +{ "_id" : "72102", "city" : "MC RAE", "loc" : [ -91.821551, 35.11322 ], "pop" : 1095, "state" : "AR" } +{ "_id" : "72103", "city" : "SHANNON HILLS", "loc" : [ -92.384618, 34.621756 ], "pop" : 8853, "state" : "AR" } +{ "_id" : "72104", "city" : "MALVERN", "loc" : [ -92.829162, 34.355715 ], "pop" : 20257, "state" : "AR" } +{ "_id" : "72105", "city" : "JONES MILLS", "loc" : [ -92.861975, 34.453624 ], "pop" : 1896, "state" : "AR" } +{ "_id" : "72106", "city" : "MAYFLOWER", "loc" : [ -92.400102, 34.966853 ], "pop" : 3593, "state" : "AR" } +{ "_id" : "72110", "city" : "MORRILTON", "loc" : [ -92.73543600000001, 35.169227 ], "pop" : 12976, "state" : "AR" } +{ "_id" : "72111", "city" : "MOUNT VERNON", "loc" : [ -92.137334, 35.260613 ], "pop" : 534, "state" : "AR" } +{ "_id" : "72112", "city" : "NEWPORT", "loc" : [ -91.257064, 35.598823 ], "pop" : 13502, "state" : "AR" } +{ "_id" : "72113", "city" : "MAUMELLE", "loc" : [ -92.40589199999999, 34.849085 ], "pop" : 4806, "state" : "AR" } +{ "_id" : "72114", "city" : "NORTH LITTLE ROC", "loc" : [ -92.265376, 34.766974 ], "pop" : 15485, "state" : "AR" } +{ "_id" : "72116", "city" : "SHERWOOD", "loc" : [ -92.237359, 34.807629 ], "pop" : 29871, "state" : "AR" } +{ "_id" : "72117", "city" : "NORTH LITTLE ROC", "loc" : [ -92.194604, 34.776305 ], "pop" : 12736, "state" : "AR" } +{ "_id" : "72118", "city" : "CAMP JOSEPH T RO", "loc" : [ -92.307875, 34.821598 ], "pop" : 26442, "state" : "AR" } +{ "_id" : "72120", "city" : "NORTH LITTLE ROC", "loc" : [ -92.214169, 34.859292 ], "pop" : 15389, "state" : "AR" } +{ "_id" : "72121", "city" : "PANGBURN", "loc" : [ -91.79597099999999, 35.421583 ], "pop" : 1996, "state" : "AR" } +{ "_id" : "72122", "city" : "PARON", "loc" : [ -92.748176, 34.785289 ], "pop" : 484, "state" : "AR" } +{ "_id" : "72125", "city" : "PERRY", "loc" : [ -92.787976, 35.042732 ], "pop" : 648, "state" : "AR" } +{ "_id" : "72126", "city" : "PERRYVILLE", "loc" : [ -92.847171, 34.970096 ], "pop" : 3851, "state" : "AR" } +{ "_id" : "72127", "city" : "PLUMERVILLE", "loc" : [ -92.620435, 35.157466 ], "pop" : 1940, "state" : "AR" } +{ "_id" : "72128", "city" : "POYEN", "loc" : [ -92.599037, 34.350828 ], "pop" : 1753, "state" : "AR" } +{ "_id" : "72129", "city" : "PRATTSVILLE", "loc" : [ -92.513105, 34.307865 ], "pop" : 860, "state" : "AR" } +{ "_id" : "72130", "city" : "PRIM", "loc" : [ -92.134596, 35.685733 ], "pop" : 74, "state" : "AR" } +{ "_id" : "72131", "city" : "QUITMAN", "loc" : [ -92.133334, 35.404988 ], "pop" : 3043, "state" : "AR" } +{ "_id" : "72132", "city" : "REDFIELD", "loc" : [ -92.17579000000001, 34.452647 ], "pop" : 1888, "state" : "AR" } +{ "_id" : "72133", "city" : "REYDELL", "loc" : [ -91.55039499999999, 34.143281 ], "pop" : 150, "state" : "AR" } +{ "_id" : "72134", "city" : "ROE", "loc" : [ -91.37705800000001, 34.628592 ], "pop" : 392, "state" : "AR" } +{ "_id" : "72135", "city" : "ROLAND", "loc" : [ -92.51915200000001, 34.88287 ], "pop" : 1824, "state" : "AR" } +{ "_id" : "72136", "city" : "ROMANCE", "loc" : [ -92.06985, 35.215462 ], "pop" : 576, "state" : "AR" } +{ "_id" : "72137", "city" : "ROSE BUD", "loc" : [ -92.061988, 35.321447 ], "pop" : 891, "state" : "AR" } +{ "_id" : "72140", "city" : "SAINT CHARLES", "loc" : [ -91.16808, 34.335296 ], "pop" : 607, "state" : "AR" } +{ "_id" : "72141", "city" : "SCOTLAND", "loc" : [ -92.586652, 35.507956 ], "pop" : 1276, "state" : "AR" } +{ "_id" : "72142", "city" : "SCOTT", "loc" : [ -92.11566000000001, 34.694215 ], "pop" : 1027, "state" : "AR" } +{ "_id" : "72143", "city" : "GEORGETOWN", "loc" : [ -91.76293099999999, 35.253512 ], "pop" : 22586, "state" : "AR" } +{ "_id" : "72150", "city" : "SHERIDAN", "loc" : [ -92.365713, 34.316527 ], "pop" : 9714, "state" : "AR" } +{ "_id" : "72152", "city" : "SHERRILL", "loc" : [ -91.993285, 34.358148 ], "pop" : 615, "state" : "AR" } +{ "_id" : "72153", "city" : "SHIRLEY", "loc" : [ -92.29751, 35.573259 ], "pop" : 4841, "state" : "AR" } +{ "_id" : "72156", "city" : "SOLGOHACHIA", "loc" : [ -92.675387, 35.270056 ], "pop" : 133, "state" : "AR" } +{ "_id" : "72157", "city" : "SPRINGFIELD", "loc" : [ -92.54567, 35.274879 ], "pop" : 752, "state" : "AR" } +{ "_id" : "72160", "city" : "STUTTGART", "loc" : [ -91.548742, 34.485358 ], "pop" : 11801, "state" : "AR" } +{ "_id" : "72165", "city" : "THIDA", "loc" : [ -91.461823, 35.553556 ], "pop" : 616, "state" : "AR" } +{ "_id" : "72166", "city" : "TICHNOR", "loc" : [ -91.243684, 34.089311 ], "pop" : 331, "state" : "AR" } +{ "_id" : "72167", "city" : "TRASKWOOD", "loc" : [ -92.654734, 34.450791 ], "pop" : 606, "state" : "AR" } +{ "_id" : "72168", "city" : "TUCKER", "loc" : [ -91.916265, 34.441442 ], "pop" : 2170, "state" : "AR" } +{ "_id" : "72170", "city" : "ULM", "loc" : [ -91.51343, 34.579938 ], "pop" : 507, "state" : "AR" } +{ "_id" : "72173", "city" : "VILONIA", "loc" : [ -92.183235, 35.071895 ], "pop" : 2492, "state" : "AR" } +{ "_id" : "72175", "city" : "WABBASEKA", "loc" : [ -91.754948, 34.393552 ], "pop" : 1021, "state" : "AR" } +{ "_id" : "72176", "city" : "WARD", "loc" : [ -91.90038300000001, 34.95316 ], "pop" : 3503, "state" : "AR" } +{ "_id" : "72179", "city" : "WILBURN", "loc" : [ -91.907248, 35.454547 ], "pop" : 1924, "state" : "AR" } +{ "_id" : "72181", "city" : "WOOSTER", "loc" : [ -92.450998, 35.197308 ], "pop" : 1264, "state" : "AR" } +{ "_id" : "72182", "city" : "WRIGHT", "loc" : [ -92.06308, 34.437656 ], "pop" : 302, "state" : "AR" } +{ "_id" : "72201", "city" : "LITTLE ROCK", "loc" : [ -92.28193899999999, 34.748342 ], "pop" : 539, "state" : "AR" } +{ "_id" : "72202", "city" : "LITTLE ROCK", "loc" : [ -92.274067, 34.736322 ], "pop" : 11686, "state" : "AR" } +{ "_id" : "72204", "city" : "LITTLE ROCK", "loc" : [ -92.344041, 34.726904 ], "pop" : 33104, "state" : "AR" } +{ "_id" : "72205", "city" : "LITTLE ROCK", "loc" : [ -92.345512, 34.750971 ], "pop" : 25156, "state" : "AR" } +{ "_id" : "72206", "city" : "LITTLE ROCK", "loc" : [ -92.27760600000001, 34.683599 ], "pop" : 27367, "state" : "AR" } +{ "_id" : "72207", "city" : "LITTLE ROCK", "loc" : [ -92.356481, 34.772121 ], "pop" : 25217, "state" : "AR" } +{ "_id" : "72208", "city" : "FERNDALE", "loc" : [ -92.585581, 34.781575 ], "pop" : 458, "state" : "AR" } +{ "_id" : "72209", "city" : "LITTLE ROCK", "loc" : [ -92.352919, 34.672509 ], "pop" : 35211, "state" : "AR" } +{ "_id" : "72210", "city" : "LITTLE ROCK", "loc" : [ -92.465981, 34.707625 ], "pop" : 4426, "state" : "AR" } +{ "_id" : "72211", "city" : "LITTLE ROCK", "loc" : [ -92.431485, 34.758819 ], "pop" : 14006, "state" : "AR" } +{ "_id" : "72212", "city" : "LITTLE ROCK", "loc" : [ -92.42223199999999, 34.787076 ], "pop" : 16183, "state" : "AR" } +{ "_id" : "72301", "city" : "WEST MEMPHIS", "loc" : [ -90.17792, 35.148442 ], "pop" : 28720, "state" : "AR" } +{ "_id" : "72310", "city" : "ARMOREL", "loc" : [ -89.758118, 35.942843 ], "pop" : 444, "state" : "AR" } +{ "_id" : "72311", "city" : "AUBREY", "loc" : [ -90.911331, 34.702727 ], "pop" : 901, "state" : "AR" } +{ "_id" : "72313", "city" : "BASSETT", "loc" : [ -90.192155, 35.513808 ], "pop" : 1147, "state" : "AR" } +{ "_id" : "72314", "city" : "BIRDEYE", "loc" : [ -90.67074, 35.409571 ], "pop" : 505, "state" : "AR" } +{ "_id" : "72315", "city" : "BLYTHEVILLE A F", "loc" : [ -89.92249700000001, 35.934482 ], "pop" : 30944, "state" : "AR" } +{ "_id" : "72320", "city" : "BRICKEYS", "loc" : [ -90.537738, 34.854814 ], "pop" : 458, "state" : "AR" } +{ "_id" : "72321", "city" : "BURDETTE", "loc" : [ -89.942312, 35.814769 ], "pop" : 329, "state" : "AR" } +{ "_id" : "72324", "city" : "CHERRY VALLEY", "loc" : [ -90.761329, 35.399122 ], "pop" : 1273, "state" : "AR" } +{ "_id" : "72326", "city" : "COLT", "loc" : [ -90.787204, 35.096062 ], "pop" : 3755, "state" : "AR" } +{ "_id" : "72327", "city" : "CRAWFORDSVILLE", "loc" : [ -90.33510699999999, 35.211873 ], "pop" : 1834, "state" : "AR" } +{ "_id" : "72328", "city" : "CRUMROD", "loc" : [ -90.949535, 34.216167 ], "pop" : 514, "state" : "AR" } +{ "_id" : "72329", "city" : "DRIVER", "loc" : [ -89.960526, 35.559714 ], "pop" : 25, "state" : "AR" } +{ "_id" : "72330", "city" : "DYESS", "loc" : [ -90.215716, 35.595394 ], "pop" : 912, "state" : "AR" } +{ "_id" : "72331", "city" : "EARLE", "loc" : [ -90.450261, 35.27989 ], "pop" : 5009, "state" : "AR" } +{ "_id" : "72332", "city" : "EDMONDSON", "loc" : [ -90.328672, 35.022309 ], "pop" : 2435, "state" : "AR" } +{ "_id" : "72333", "city" : "ELAINE", "loc" : [ -90.873485, 34.308668 ], "pop" : 1366, "state" : "AR" } +{ "_id" : "72335", "city" : "FORREST CITY", "loc" : [ -90.788572, 35.009129 ], "pop" : 17751, "state" : "AR" } +{ "_id" : "72338", "city" : "FRENCHMANS BAYOU", "loc" : [ -90.055933, 35.478419 ], "pop" : 34, "state" : "AR" } +{ "_id" : "72339", "city" : "GILMORE", "loc" : [ -90.264664, 35.386408 ], "pop" : 1852, "state" : "AR" } +{ "_id" : "72340", "city" : "GOODWIN", "loc" : [ -90.983518, 34.959149 ], "pop" : 597, "state" : "AR" } +{ "_id" : "72341", "city" : "HAYNES", "loc" : [ -90.766621, 34.883752 ], "pop" : 552, "state" : "AR" } +{ "_id" : "72342", "city" : "HELENA", "loc" : [ -90.629784, 34.532491 ], "pop" : 9515, "state" : "AR" } +{ "_id" : "72346", "city" : "HETH", "loc" : [ -90.45855400000001, 35.097335 ], "pop" : 859, "state" : "AR" } +{ "_id" : "72347", "city" : "HICKORY RIDGE", "loc" : [ -90.982283, 35.399457 ], "pop" : 754, "state" : "AR" } +{ "_id" : "72348", "city" : "HUGHES", "loc" : [ -90.474142, 34.945416 ], "pop" : 2477, "state" : "AR" } +{ "_id" : "72350", "city" : "JOINER", "loc" : [ -90.14779, 35.505239 ], "pop" : 986, "state" : "AR" } +{ "_id" : "72351", "city" : "KEISER", "loc" : [ -90.096171, 35.678626 ], "pop" : 980, "state" : "AR" } +{ "_id" : "72354", "city" : "LEPANTO", "loc" : [ -90.335883, 35.606909 ], "pop" : 2023, "state" : "AR" } +{ "_id" : "72355", "city" : "LEXA", "loc" : [ -90.78532, 34.672694 ], "pop" : 903, "state" : "AR" } +{ "_id" : "72358", "city" : "LUXORA", "loc" : [ -89.92204, 35.760786 ], "pop" : 1593, "state" : "AR" } +{ "_id" : "72360", "city" : "MARIANNA", "loc" : [ -90.77852, 34.775929 ], "pop" : 8668, "state" : "AR" } +{ "_id" : "72364", "city" : "MARION", "loc" : [ -90.198908, 35.2077 ], "pop" : 7891, "state" : "AR" } +{ "_id" : "72365", "city" : "MARKED TREE", "loc" : [ -90.419387, 35.534933 ], "pop" : 5144, "state" : "AR" } +{ "_id" : "72366", "city" : "MARVELL", "loc" : [ -90.941322, 34.548541 ], "pop" : 2733, "state" : "AR" } +{ "_id" : "72367", "city" : "MELLWOOD", "loc" : [ -91.008589, 34.220032 ], "pop" : 61, "state" : "AR" } +{ "_id" : "72368", "city" : "MORO", "loc" : [ -91.00602600000001, 34.802953 ], "pop" : 1571, "state" : "AR" } +{ "_id" : "72369", "city" : "ONEIDA", "loc" : [ -90.82604499999999, 34.405267 ], "pop" : 918, "state" : "AR" } +{ "_id" : "72370", "city" : "OSCEOLA", "loc" : [ -89.979764, 35.701864 ], "pop" : 10119, "state" : "AR" } +{ "_id" : "72372", "city" : "PALESTINE", "loc" : [ -90.904929, 34.966346 ], "pop" : 1371, "state" : "AR" } +{ "_id" : "72373", "city" : "PARKIN", "loc" : [ -90.556417, 35.258557 ], "pop" : 2437, "state" : "AR" } +{ "_id" : "72374", "city" : "POPLAR GROVE", "loc" : [ -90.881274, 34.539397 ], "pop" : 1466, "state" : "AR" } +{ "_id" : "72376", "city" : "PROCTOR", "loc" : [ -90.255026, 35.083396 ], "pop" : 953, "state" : "AR" } +{ "_id" : "72379", "city" : "SNOW LAKE", "loc" : [ -91.00708299999999, 34.066466 ], "pop" : 225, "state" : "AR" } +{ "_id" : "72381", "city" : "TOMATO", "loc" : [ -89.787092, 35.806666 ], "pop" : 0, "state" : "AR" } +{ "_id" : "72384", "city" : "TURRELL", "loc" : [ -90.262979, 35.296936 ], "pop" : 1308, "state" : "AR" } +{ "_id" : "72386", "city" : "TYRONZA", "loc" : [ -90.351944, 35.486477 ], "pop" : 1230, "state" : "AR" } +{ "_id" : "72390", "city" : "WEST HELENA", "loc" : [ -90.65453100000001, 34.549635 ], "pop" : 12265, "state" : "AR" } +{ "_id" : "72392", "city" : "WHEATLEY", "loc" : [ -91.108645, 34.920703 ], "pop" : 542, "state" : "AR" } +{ "_id" : "72394", "city" : "WIDENER", "loc" : [ -90.629313, 35.059167 ], "pop" : 1145, "state" : "AR" } +{ "_id" : "72395", "city" : "WILSON", "loc" : [ -90.042749, 35.566004 ], "pop" : 1185, "state" : "AR" } +{ "_id" : "72396", "city" : "WYNNE", "loc" : [ -90.79303, 35.233036 ], "pop" : 13908, "state" : "AR" } +{ "_id" : "72397", "city" : "FAIR OAKS", "loc" : [ -91.014304, 35.236817 ], "pop" : 285, "state" : "AR" } +{ "_id" : "72401", "city" : "JONESBORO", "loc" : [ -90.69652600000001, 35.833016 ], "pop" : 53532, "state" : "AR" } +{ "_id" : "72410", "city" : "ALICIA", "loc" : [ -91.081003, 35.942327 ], "pop" : 725, "state" : "AR" } +{ "_id" : "72411", "city" : "BAY", "loc" : [ -90.550658, 35.74559 ], "pop" : 2527, "state" : "AR" } +{ "_id" : "72412", "city" : "BEECH GROVE", "loc" : [ -90.618084, 36.183172 ], "pop" : 292, "state" : "AR" } +{ "_id" : "72413", "city" : "BIGGERS", "loc" : [ -90.78446700000001, 36.342978 ], "pop" : 1060, "state" : "AR" } +{ "_id" : "72414", "city" : "BLACK OAK", "loc" : [ -90.35422699999999, 35.835851 ], "pop" : 518, "state" : "AR" } +{ "_id" : "72415", "city" : "BLACK ROCK", "loc" : [ -91.11762899999999, 36.114874 ], "pop" : 1190, "state" : "AR" } +{ "_id" : "72416", "city" : "BONO", "loc" : [ -90.78475299999999, 35.908592 ], "pop" : 3030, "state" : "AR" } +{ "_id" : "72417", "city" : "BROOKLAND", "loc" : [ -90.576228, 35.91647 ], "pop" : 1896, "state" : "AR" } +{ "_id" : "72419", "city" : "CARAWAY", "loc" : [ -90.335797, 35.758951 ], "pop" : 2214, "state" : "AR" } +{ "_id" : "72421", "city" : "CASH", "loc" : [ -90.941007, 35.830145 ], "pop" : 628, "state" : "AR" } +{ "_id" : "72422", "city" : "CORNING", "loc" : [ -90.58702, 36.415532 ], "pop" : 5469, "state" : "AR" } +{ "_id" : "72424", "city" : "DATTO", "loc" : [ -90.723117, 36.389685 ], "pop" : 308, "state" : "AR" } +{ "_id" : "72425", "city" : "DELAPLAINE", "loc" : [ -90.734482, 36.199485 ], "pop" : 719, "state" : "AR" } +{ "_id" : "72426", "city" : "DELL", "loc" : [ -90.035449, 35.850118 ], "pop" : 832, "state" : "AR" } +{ "_id" : "72428", "city" : "ETOWAH", "loc" : [ -90.218172, 35.714707 ], "pop" : 1330, "state" : "AR" } +{ "_id" : "72429", "city" : "FISHER", "loc" : [ -90.955001, 35.513956 ], "pop" : 907, "state" : "AR" } +{ "_id" : "72430", "city" : "GREENWAY", "loc" : [ -90.225257, 36.334766 ], "pop" : 529, "state" : "AR" } +{ "_id" : "72432", "city" : "HARRISBURG", "loc" : [ -90.70375199999999, 35.572222 ], "pop" : 5961, "state" : "AR" } +{ "_id" : "72433", "city" : "HOXIE", "loc" : [ -90.971504, 36.032573 ], "pop" : 3436, "state" : "AR" } +{ "_id" : "72434", "city" : "IMBODEN", "loc" : [ -91.18544199999999, 36.19763 ], "pop" : 889, "state" : "AR" } +{ "_id" : "72435", "city" : "KNOBEL", "loc" : [ -90.599048, 36.317647 ], "pop" : 518, "state" : "AR" } +{ "_id" : "72436", "city" : "LAFE", "loc" : [ -90.506973, 36.21547 ], "pop" : 1007, "state" : "AR" } +{ "_id" : "72437", "city" : "LAKE CITY", "loc" : [ -90.44232700000001, 35.81715 ], "pop" : 2056, "state" : "AR" } +{ "_id" : "72438", "city" : "LEACHVILLE", "loc" : [ -90.195488, 35.933216 ], "pop" : 2810, "state" : "AR" } +{ "_id" : "72440", "city" : "LYNN", "loc" : [ -91.254588, 36.016639 ], "pop" : 1032, "state" : "AR" } +{ "_id" : "72441", "city" : "MC DOUGAL", "loc" : [ -90.394093, 36.379909 ], "pop" : 1552, "state" : "AR" } +{ "_id" : "72442", "city" : "ROSELAND", "loc" : [ -90.180252, 35.874885 ], "pop" : 3855, "state" : "AR" } +{ "_id" : "72443", "city" : "MARMADUKE", "loc" : [ -90.38368, 36.195117 ], "pop" : 2082, "state" : "AR" } +{ "_id" : "72444", "city" : "MAYNARD", "loc" : [ -90.874921, 36.438563 ], "pop" : 1616, "state" : "AR" } +{ "_id" : "72445", "city" : "MINTURN", "loc" : [ -91.033704, 35.976096 ], "pop" : 364, "state" : "AR" } +{ "_id" : "72447", "city" : "MONETTE", "loc" : [ -90.343658, 35.900168 ], "pop" : 2008, "state" : "AR" } +{ "_id" : "72449", "city" : "O KEAN", "loc" : [ -90.82406899999999, 36.179672 ], "pop" : 420, "state" : "AR" } +{ "_id" : "72450", "city" : "PARAGOULD", "loc" : [ -90.525093, 36.060033 ], "pop" : 27704, "state" : "AR" } +{ "_id" : "72453", "city" : "PEACH ORCHARD", "loc" : [ -90.67021699999999, 36.283045 ], "pop" : 332, "state" : "AR" } +{ "_id" : "72454", "city" : "PIGGOTT", "loc" : [ -90.19261, 36.386993 ], "pop" : 4818, "state" : "AR" } +{ "_id" : "72455", "city" : "POCAHONTAS", "loc" : [ -90.996782, 36.282876 ], "pop" : 12280, "state" : "AR" } +{ "_id" : "72456", "city" : "POLLARD", "loc" : [ -90.27512299999999, 36.431725 ], "pop" : 553, "state" : "AR" } +{ "_id" : "72457", "city" : "PORTIA", "loc" : [ -91.068004, 36.080699 ], "pop" : 646, "state" : "AR" } +{ "_id" : "72458", "city" : "POWHATAN", "loc" : [ -91.148214, 36.080044 ], "pop" : 476, "state" : "AR" } +{ "_id" : "72459", "city" : "RAVENDEN", "loc" : [ -91.25933999999999, 36.202863 ], "pop" : 1137, "state" : "AR" } +{ "_id" : "72460", "city" : "RAVENDEN SPRINGS", "loc" : [ -91.209433, 36.310384 ], "pop" : 944, "state" : "AR" } +{ "_id" : "72461", "city" : "RECTOR", "loc" : [ -90.270201, 36.267177 ], "pop" : 3515, "state" : "AR" } +{ "_id" : "72464", "city" : "SAINT FRANCIS", "loc" : [ -90.144991, 36.454771 ], "pop" : 227, "state" : "AR" } +{ "_id" : "72465", "city" : "SEDGWICK", "loc" : [ -90.880099, 35.985965 ], "pop" : 503, "state" : "AR" } +{ "_id" : "72466", "city" : "SMITHVILLE", "loc" : [ -91.274456, 36.090815 ], "pop" : 427, "state" : "AR" } +{ "_id" : "72467", "city" : "STATE UNIVERSITY", "loc" : [ -90.454245, 35.914894 ], "pop" : 544, "state" : "AR" } +{ "_id" : "72469", "city" : "CALAMINE", "loc" : [ -91.375398, 35.972622 ], "pop" : 1078, "state" : "AR" } +{ "_id" : "72470", "city" : "SUCCESS", "loc" : [ -90.728128, 36.453615 ], "pop" : 286, "state" : "AR" } +{ "_id" : "72471", "city" : "SWIFTON", "loc" : [ -91.126358, 35.827366 ], "pop" : 1172, "state" : "AR" } +{ "_id" : "72472", "city" : "PAYNEWAY", "loc" : [ -90.518738, 35.668914 ], "pop" : 8179, "state" : "AR" } +{ "_id" : "72473", "city" : "TUCKERMAN", "loc" : [ -91.20034699999999, 35.730678 ], "pop" : 2564, "state" : "AR" } +{ "_id" : "72476", "city" : "COLLEGE CITY", "loc" : [ -90.952809, 36.077814 ], "pop" : 5794, "state" : "AR" } +{ "_id" : "72478", "city" : "WARM SPRINGS", "loc" : [ -91.038707, 36.467531 ], "pop" : 238, "state" : "AR" } +{ "_id" : "72479", "city" : "WEINER", "loc" : [ -90.928928, 35.629052 ], "pop" : 1223, "state" : "AR" } +{ "_id" : "72482", "city" : "WILLIFORD", "loc" : [ -91.379226, 36.245335 ], "pop" : 349, "state" : "AR" } +{ "_id" : "72501", "city" : "BATESVILLE", "loc" : [ -91.63518999999999, 35.782614 ], "pop" : 19976, "state" : "AR" } +{ "_id" : "72512", "city" : "HORSESHOE BEND", "loc" : [ -91.755334, 36.202502 ], "pop" : 3088, "state" : "AR" } +{ "_id" : "72513", "city" : "AGNOS", "loc" : [ -91.61074600000001, 36.219732 ], "pop" : 1433, "state" : "AR" } +{ "_id" : "72515", "city" : "BEXAR", "loc" : [ -91.985998, 36.306103 ], "pop" : 325, "state" : "AR" } +{ "_id" : "72516", "city" : "BOSWELL", "loc" : [ -92.044307, 36.01084 ], "pop" : 321, "state" : "AR" } +{ "_id" : "72517", "city" : "BROCKWELL", "loc" : [ -91.951308, 36.135755 ], "pop" : 548, "state" : "AR" } +{ "_id" : "72519", "city" : "JORDAN", "loc" : [ -92.145494, 36.144771 ], "pop" : 2019, "state" : "AR" } +{ "_id" : "72520", "city" : "CAMP", "loc" : [ -91.72616600000001, 36.402531 ], "pop" : 401, "state" : "AR" } +{ "_id" : "72521", "city" : "CAVE CITY", "loc" : [ -91.544432, 35.951684 ], "pop" : 2111, "state" : "AR" } +{ "_id" : "72522", "city" : "CHARLOTTE", "loc" : [ -91.39621699999999, 35.833393 ], "pop" : 797, "state" : "AR" } +{ "_id" : "72523", "city" : "CONCORD", "loc" : [ -91.833339, 35.641355 ], "pop" : 1168, "state" : "AR" } +{ "_id" : "72524", "city" : "CORD", "loc" : [ -91.33745500000001, 35.81844 ], "pop" : 205, "state" : "AR" } +{ "_id" : "72526", "city" : "CUSHMAN", "loc" : [ -91.776455, 35.869663 ], "pop" : 336, "state" : "AR" } +{ "_id" : "72527", "city" : "DESHA", "loc" : [ -91.678287, 35.731524 ], "pop" : 876, "state" : "AR" } +{ "_id" : "72528", "city" : "DOLPH", "loc" : [ -92.11766, 36.222878 ], "pop" : 348, "state" : "AR" } +{ "_id" : "72529", "city" : "CHEROKEE VILLAGE", "loc" : [ -91.528075, 36.30114 ], "pop" : 4523, "state" : "AR" } +{ "_id" : "72530", "city" : "DRASCO", "loc" : [ -91.939818, 35.661606 ], "pop" : 886, "state" : "AR" } +{ "_id" : "72531", "city" : "ELIZABETH", "loc" : [ -92.093366, 36.323776 ], "pop" : 390, "state" : "AR" } +{ "_id" : "72532", "city" : "EVENING SHADE", "loc" : [ -91.59801400000001, 36.085532 ], "pop" : 1356, "state" : "AR" } +{ "_id" : "72533", "city" : "FIFTY SIX", "loc" : [ -92.218169, 35.991958 ], "pop" : 346, "state" : "AR" } +{ "_id" : "72534", "city" : "FLORAL", "loc" : [ -91.734101, 35.602337 ], "pop" : 940, "state" : "AR" } +{ "_id" : "72536", "city" : "FRANKLIN", "loc" : [ -91.80959199999999, 36.129093 ], "pop" : 364, "state" : "AR" } +{ "_id" : "72537", "city" : "GAMALIEL", "loc" : [ -92.228447, 36.461794 ], "pop" : 301, "state" : "AR" } +{ "_id" : "72538", "city" : "GEPP", "loc" : [ -92.099507, 36.436443 ], "pop" : 351, "state" : "AR" } +{ "_id" : "72539", "city" : "GLENCOE", "loc" : [ -91.76948299999999, 36.288962 ], "pop" : 514, "state" : "AR" } +{ "_id" : "72540", "city" : "GUION", "loc" : [ -91.934287, 35.960135 ], "pop" : 226, "state" : "AR" } +{ "_id" : "72542", "city" : "HARDY", "loc" : [ -91.411027, 36.322746 ], "pop" : 2473, "state" : "AR" } +{ "_id" : "72543", "city" : "HEBER SPRINGS", "loc" : [ -92.03921099999999, 35.510278 ], "pop" : 8709, "state" : "AR" } +{ "_id" : "72544", "city" : "HENDERSON", "loc" : [ -92.26925300000001, 36.356829 ], "pop" : 3441, "state" : "AR" } +{ "_id" : "72546", "city" : "IDA", "loc" : [ -91.930081, 35.594326 ], "pop" : 539, "state" : "AR" } +{ "_id" : "72550", "city" : "LOCUST GROVE", "loc" : [ -91.741443, 35.717705 ], "pop" : 750, "state" : "AR" } +{ "_id" : "72553", "city" : "MAGNESS", "loc" : [ -91.485041, 35.710062 ], "pop" : 413, "state" : "AR" } +{ "_id" : "72554", "city" : "MAMMOTH SPRING", "loc" : [ -91.575712, 36.407648 ], "pop" : 4075, "state" : "AR" } +{ "_id" : "72555", "city" : "MARCELLA", "loc" : [ -91.941891, 35.749654 ], "pop" : 535, "state" : "AR" } +{ "_id" : "72556", "city" : "ZION", "loc" : [ -91.905196, 36.059958 ], "pop" : 1880, "state" : "AR" } +{ "_id" : "72557", "city" : "MOKO", "loc" : [ -91.85866300000001, 36.468902 ], "pop" : 321, "state" : "AR" } +{ "_id" : "72560", "city" : "HANOVER", "loc" : [ -92.114762, 35.865769 ], "pop" : 5553, "state" : "AR" } +{ "_id" : "72561", "city" : "MOUNT PLEASANT", "loc" : [ -91.78501300000001, 35.975909 ], "pop" : 1264, "state" : "AR" } +{ "_id" : "72562", "city" : "NEWARK", "loc" : [ -91.439395, 35.71183 ], "pop" : 1816, "state" : "AR" } +{ "_id" : "72564", "city" : "OIL TROUGH", "loc" : [ -91.470305, 35.613147 ], "pop" : 674, "state" : "AR" } +{ "_id" : "72565", "city" : "OXFORD", "loc" : [ -91.925849, 36.211408 ], "pop" : 738, "state" : "AR" } +{ "_id" : "72566", "city" : "PINEVILLE", "loc" : [ -92.107299, 36.167704 ], "pop" : 356, "state" : "AR" } +{ "_id" : "72567", "city" : "PLEASANT GROVE", "loc" : [ -91.931905, 35.842349 ], "pop" : 772, "state" : "AR" } +{ "_id" : "72568", "city" : "PLEASANT PLAINS", "loc" : [ -91.632043, 35.589301 ], "pop" : 1790, "state" : "AR" } +{ "_id" : "72569", "city" : "POUGHKEEPSIE", "loc" : [ -91.45157500000001, 36.071526 ], "pop" : 601, "state" : "AR" } +{ "_id" : "72571", "city" : "ROSIE", "loc" : [ -91.534003, 35.663816 ], "pop" : 438, "state" : "AR" } +{ "_id" : "72572", "city" : "SAFFELL", "loc" : [ -91.297753, 35.917957 ], "pop" : 379, "state" : "AR" } +{ "_id" : "72573", "city" : "SAGE", "loc" : [ -91.824569, 36.042476 ], "pop" : 256, "state" : "AR" } +{ "_id" : "72575", "city" : "SALADO", "loc" : [ -91.59792400000001, 35.703493 ], "pop" : 818, "state" : "AR" } +{ "_id" : "72576", "city" : "BYRON", "loc" : [ -91.836321, 36.365401 ], "pop" : 2561, "state" : "AR" } +{ "_id" : "72577", "city" : "SIDNEY", "loc" : [ -91.634593, 35.991554 ], "pop" : 743, "state" : "AR" } +{ "_id" : "72578", "city" : "STURKIE", "loc" : [ -91.98991700000001, 36.463869 ], "pop" : 168, "state" : "AR" } +{ "_id" : "72579", "city" : "SULPHUR ROCK", "loc" : [ -91.507333, 35.754466 ], "pop" : 756, "state" : "AR" } +{ "_id" : "72581", "city" : "TUMBLING SHOALS", "loc" : [ -91.970359, 35.546985 ], "pop" : 768, "state" : "AR" } +{ "_id" : "72583", "city" : "VIOLA", "loc" : [ -91.99319800000001, 36.392429 ], "pop" : 823, "state" : "AR" } +{ "_id" : "72584", "city" : "VIOLET HILL", "loc" : [ -91.847064, 36.162966 ], "pop" : 220, "state" : "AR" } +{ "_id" : "72585", "city" : "WIDEMAN", "loc" : [ -92.001796, 36.198739 ], "pop" : 89, "state" : "AR" } +{ "_id" : "72587", "city" : "WISEMAN", "loc" : [ -91.84949899999999, 36.228022 ], "pop" : 26, "state" : "AR" } +{ "_id" : "72601", "city" : "HARRISON", "loc" : [ -93.106162, 36.241707 ], "pop" : 23009, "state" : "AR" } +{ "_id" : "72610", "city" : "ALCO", "loc" : [ -92.380753, 35.894511 ], "pop" : 172, "state" : "AR" } +{ "_id" : "72611", "city" : "ALPENA", "loc" : [ -93.2792, 36.299768 ], "pop" : 780, "state" : "AR" } +{ "_id" : "72612", "city" : "BASS", "loc" : [ -92.999832, 35.892225 ], "pop" : 261, "state" : "AR" } +{ "_id" : "72616", "city" : "BERRYVILLE", "loc" : [ -93.558725, 36.351908 ], "pop" : 6821, "state" : "AR" } +{ "_id" : "72617", "city" : "BIG FLAT", "loc" : [ -92.39168100000001, 36.006824 ], "pop" : 244, "state" : "AR" } +{ "_id" : "72618", "city" : "BRUNO", "loc" : [ -92.763651, 36.124617 ], "pop" : 236, "state" : "AR" } +{ "_id" : "72619", "city" : "BULL SHOALS", "loc" : [ -92.593765, 36.370958 ], "pop" : 1967, "state" : "AR" } +{ "_id" : "72623", "city" : "CLARKRIDGE", "loc" : [ -92.35159, 36.443311 ], "pop" : 1031, "state" : "AR" } +{ "_id" : "72624", "city" : "COMPTON", "loc" : [ -93.30990300000001, 36.097941 ], "pop" : 233, "state" : "AR" } +{ "_id" : "72626", "city" : "COTTER", "loc" : [ -92.532787, 36.280378 ], "pop" : 1044, "state" : "AR" } +{ "_id" : "72628", "city" : "DEER", "loc" : [ -93.31738799999999, 35.852982 ], "pop" : 1378, "state" : "AR" } +{ "_id" : "72629", "city" : "DENNARD", "loc" : [ -92.557456, 35.725236 ], "pop" : 1370, "state" : "AR" } +{ "_id" : "72632", "city" : "EUREKA SPRINGS", "loc" : [ -93.737915, 36.417465 ], "pop" : 5444, "state" : "AR" } +{ "_id" : "72633", "city" : "EVERTON", "loc" : [ -92.91498900000001, 36.153366 ], "pop" : 436, "state" : "AR" } +{ "_id" : "72634", "city" : "FLIPPIN", "loc" : [ -92.577995, 36.268219 ], "pop" : 2784, "state" : "AR" } +{ "_id" : "72635", "city" : "GASSVILLE", "loc" : [ -92.473637, 36.317525 ], "pop" : 3568, "state" : "AR" } +{ "_id" : "72638", "city" : "GREEN FOREST", "loc" : [ -93.40587499999999, 36.322408 ], "pop" : 5430, "state" : "AR" } +{ "_id" : "72639", "city" : "HARRIET", "loc" : [ -92.50055, 35.974187 ], "pop" : 950, "state" : "AR" } +{ "_id" : "72640", "city" : "HASTY", "loc" : [ -93.04596600000001, 36.015229 ], "pop" : 219, "state" : "AR" } +{ "_id" : "72641", "city" : "JASPER", "loc" : [ -93.20477099999999, 36.003798 ], "pop" : 1632, "state" : "AR" } +{ "_id" : "72642", "city" : "LAKEVIEW", "loc" : [ -92.50441600000001, 36.397308 ], "pop" : 2815, "state" : "AR" } +{ "_id" : "72644", "city" : "LEAD HILL", "loc" : [ -92.930194, 36.430886 ], "pop" : 1818, "state" : "AR" } +{ "_id" : "72645", "city" : "LESLIE", "loc" : [ -92.566293, 35.82716 ], "pop" : 1768, "state" : "AR" } +{ "_id" : "72648", "city" : "DOGPATCH", "loc" : [ -93.144822, 36.095121 ], "pop" : 608, "state" : "AR" } +{ "_id" : "72650", "city" : "MARSHALL", "loc" : [ -92.640203, 35.926697 ], "pop" : 2882, "state" : "AR" } +{ "_id" : "72651", "city" : "MIDWAY", "loc" : [ -92.431398, 36.290454 ], "pop" : 408, "state" : "AR" } +{ "_id" : "72653", "city" : "MOUNTAIN HOME", "loc" : [ -92.375337, 36.331153 ], "pop" : 16131, "state" : "AR" } +{ "_id" : "72655", "city" : "MOUNT JUDEA", "loc" : [ -93.082391, 35.834674 ], "pop" : 665, "state" : "AR" } +{ "_id" : "72657", "city" : "TIMBO", "loc" : [ -92.25253600000001, 35.896338 ], "pop" : 596, "state" : "AR" } +{ "_id" : "72658", "city" : "NORFORK", "loc" : [ -92.273011, 36.206571 ], "pop" : 1824, "state" : "AR" } +{ "_id" : "72660", "city" : "OAK GROVE", "loc" : [ -93.432129, 36.461347 ], "pop" : 956, "state" : "AR" } +{ "_id" : "72661", "city" : "OAKLAND", "loc" : [ -92.583187, 36.444227 ], "pop" : 544, "state" : "AR" } +{ "_id" : "72662", "city" : "OMAHA", "loc" : [ -93.18875300000001, 36.46123 ], "pop" : 1251, "state" : "AR" } +{ "_id" : "72663", "city" : "ONIA", "loc" : [ -92.345859, 35.940339 ], "pop" : 444, "state" : "AR" } +{ "_id" : "72666", "city" : "PARTHENON", "loc" : [ -93.267776, 35.940836 ], "pop" : 518, "state" : "AR" } +{ "_id" : "72668", "city" : "PEEL", "loc" : [ -92.776143, 36.444374 ], "pop" : 731, "state" : "AR" } +{ "_id" : "72669", "city" : "PINDALL", "loc" : [ -92.886409, 36.067479 ], "pop" : 499, "state" : "AR" } +{ "_id" : "72670", "city" : "PONCA", "loc" : [ -93.401985, 36.066225 ], "pop" : 435, "state" : "AR" } +{ "_id" : "72675", "city" : "SAINT JOE", "loc" : [ -92.792828, 35.987707 ], "pop" : 1196, "state" : "AR" } +{ "_id" : "72679", "city" : "TILLY", "loc" : [ -92.84420900000001, 35.6976 ], "pop" : 118, "state" : "AR" } +{ "_id" : "72680", "city" : "NEWNATA", "loc" : [ -92.337929, 35.855318 ], "pop" : 397, "state" : "AR" } +{ "_id" : "72682", "city" : "VALLEY SPRINGS", "loc" : [ -92.97993700000001, 36.146823 ], "pop" : 1050, "state" : "AR" } +{ "_id" : "72683", "city" : "VENDOR", "loc" : [ -93.100815, 35.948062 ], "pop" : 784, "state" : "AR" } +{ "_id" : "72685", "city" : "WESTERN GROVE", "loc" : [ -92.971649, 36.082994 ], "pop" : 933, "state" : "AR" } +{ "_id" : "72686", "city" : "WITTS SPRINGS", "loc" : [ -92.815518, 35.785514 ], "pop" : 546, "state" : "AR" } +{ "_id" : "72687", "city" : "YELLVILLE", "loc" : [ -92.72447200000001, 36.225322 ], "pop" : 5695, "state" : "AR" } +{ "_id" : "72701", "city" : "FAYETTEVILLE", "loc" : [ -94.153395, 36.052045 ], "pop" : 28372, "state" : "AR" } +{ "_id" : "72703", "city" : "FAYETTEVILLE", "loc" : [ -94.17162999999999, 36.099183 ], "pop" : 24649, "state" : "AR" } +{ "_id" : "72712", "city" : "BENTONVILLE", "loc" : [ -94.22242, 36.357703 ], "pop" : 14439, "state" : "AR" } +{ "_id" : "72714", "city" : "BELLA VISTA", "loc" : [ -94.251969, 36.465086 ], "pop" : 8645, "state" : "AR" } +{ "_id" : "72716", "city" : "WAL-MART INC", "loc" : [ -94.181483, 36.326554 ], "pop" : 459, "state" : "AR" } +{ "_id" : "72717", "city" : "CANEHILL", "loc" : [ -94.3862, 35.910992 ], "pop" : 781, "state" : "AR" } +{ "_id" : "72718", "city" : "CAVE SPRINGS", "loc" : [ -94.207836, 36.266771 ], "pop" : 1629, "state" : "AR" } +{ "_id" : "72719", "city" : "CENTERTON", "loc" : [ -94.30891, 36.366993 ], "pop" : 1797, "state" : "AR" } +{ "_id" : "72721", "city" : "COMBS", "loc" : [ -93.82521800000001, 35.848297 ], "pop" : 491, "state" : "AR" } +{ "_id" : "72722", "city" : "DECATUR", "loc" : [ -94.453411, 36.334749 ], "pop" : 1633, "state" : "AR" } +{ "_id" : "72727", "city" : "ELKINS", "loc" : [ -94.007323, 36.017719 ], "pop" : 1767, "state" : "AR" } +{ "_id" : "72729", "city" : "EVANSVILLE", "loc" : [ -94.478936, 35.819345 ], "pop" : 380, "state" : "AR" } +{ "_id" : "72730", "city" : "FARMINGTON", "loc" : [ -94.253871, 36.043635 ], "pop" : 3495, "state" : "AR" } +{ "_id" : "72732", "city" : "GARFIELD", "loc" : [ -93.95119699999999, 36.428817 ], "pop" : 1389, "state" : "AR" } +{ "_id" : "72733", "city" : "GATEWAY", "loc" : [ -93.935016, 36.485751 ], "pop" : 581, "state" : "AR" } +{ "_id" : "72734", "city" : "GENTRY", "loc" : [ -94.475131, 36.26516 ], "pop" : 5145, "state" : "AR" } +{ "_id" : "72735", "city" : "GOSHEN", "loc" : [ -93.987262, 36.107523 ], "pop" : 1639, "state" : "AR" } +{ "_id" : "72736", "city" : "GRAVETTE", "loc" : [ -94.477862, 36.415513 ], "pop" : 3508, "state" : "AR" } +{ "_id" : "72738", "city" : "HINDSVILLE", "loc" : [ -93.863339, 36.142206 ], "pop" : 1024, "state" : "AR" } +{ "_id" : "72739", "city" : "HIWASSE", "loc" : [ -94.338993, 36.441589 ], "pop" : 1188, "state" : "AR" } +{ "_id" : "72740", "city" : "HUNTSVILLE", "loc" : [ -93.72789299999999, 36.104348 ], "pop" : 7021, "state" : "AR" } +{ "_id" : "72742", "city" : "KINGSTON", "loc" : [ -93.504357, 36.04845 ], "pop" : 566, "state" : "AR" } +{ "_id" : "72744", "city" : "LINCOLN", "loc" : [ -94.42724, 35.956931 ], "pop" : 3129, "state" : "AR" } +{ "_id" : "72745", "city" : "LOWELL", "loc" : [ -94.082725, 36.243318 ], "pop" : 5077, "state" : "AR" } +{ "_id" : "72747", "city" : "MAYSVILLE", "loc" : [ -94.581278, 36.401062 ], "pop" : 214, "state" : "AR" } +{ "_id" : "72749", "city" : "MORROW", "loc" : [ -94.425793, 35.85373 ], "pop" : 615, "state" : "AR" } +{ "_id" : "72751", "city" : "PEA RIDGE", "loc" : [ -94.118026, 36.453884 ], "pop" : 3584, "state" : "AR" } +{ "_id" : "72752", "city" : "PETTIGREW", "loc" : [ -93.61807899999999, 35.834562 ], "pop" : 422, "state" : "AR" } +{ "_id" : "72753", "city" : "PRAIRIE GROVE", "loc" : [ -94.316861, 35.991809 ], "pop" : 4105, "state" : "AR" } +{ "_id" : "72756", "city" : "ROGERS", "loc" : [ -94.114784, 36.336316 ], "pop" : 34081, "state" : "AR" } +{ "_id" : "72760", "city" : "SAINT PAUL", "loc" : [ -93.73474299999999, 35.849576 ], "pop" : 608, "state" : "AR" } +{ "_id" : "72761", "city" : "SILOAM SPRINGS", "loc" : [ -94.528036, 36.179969 ], "pop" : 11677, "state" : "AR" } +{ "_id" : "72762", "city" : "SPRINGDALE", "loc" : [ -94.176216, 36.183521 ], "pop" : 20104, "state" : "AR" } +{ "_id" : "72764", "city" : "BETHEL HEIGHTS", "loc" : [ -94.104682, 36.177918 ], "pop" : 17792, "state" : "AR" } +{ "_id" : "72768", "city" : "SULPHUR SPRINGS", "loc" : [ -94.45206899999999, 36.479434 ], "pop" : 982, "state" : "AR" } +{ "_id" : "72769", "city" : "SUMMERS", "loc" : [ -94.500027, 36.013827 ], "pop" : 1013, "state" : "AR" } +{ "_id" : "72773", "city" : "WESLEY", "loc" : [ -93.911478, 35.957264 ], "pop" : 1307, "state" : "AR" } +{ "_id" : "72774", "city" : "WEST FORK", "loc" : [ -94.230375, 35.908153 ], "pop" : 4473, "state" : "AR" } +{ "_id" : "72776", "city" : "WITTER", "loc" : [ -93.621, 35.935583 ], "pop" : 179, "state" : "AR" } +{ "_id" : "72801", "city" : "RUSSELLVILLE", "loc" : [ -93.13147600000001, 35.284208 ], "pop" : 25169, "state" : "AR" } +{ "_id" : "72820", "city" : "ALIX", "loc" : [ -93.726416, 35.430767 ], "pop" : 488, "state" : "AR" } +{ "_id" : "72821", "city" : "ALTUS", "loc" : [ -93.811494, 35.404873 ], "pop" : 2292, "state" : "AR" } +{ "_id" : "72823", "city" : "ATKINS", "loc" : [ -92.95069599999999, 35.244948 ], "pop" : 4835, "state" : "AR" } +{ "_id" : "72824", "city" : "BELLEVILLE", "loc" : [ -93.45181700000001, 35.103762 ], "pop" : 988, "state" : "AR" } +{ "_id" : "72826", "city" : "BLUE MOUNTAIN", "loc" : [ -93.716797, 35.130386 ], "pop" : 200, "state" : "AR" } +{ "_id" : "72827", "city" : "BLUFFTON", "loc" : [ -93.59194599999999, 34.901635 ], "pop" : 208, "state" : "AR" } +{ "_id" : "72828", "city" : "BRIGGSVILLE", "loc" : [ -93.515748, 34.916065 ], "pop" : 164, "state" : "AR" } +{ "_id" : "72830", "city" : "CLARKSVILLE", "loc" : [ -93.491056, 35.490763 ], "pop" : 11304, "state" : "AR" } +{ "_id" : "72832", "city" : "COAL HILL", "loc" : [ -93.67203000000001, 35.437117 ], "pop" : 1179, "state" : "AR" } +{ "_id" : "72833", "city" : "DANVILLE", "loc" : [ -93.392933, 35.049541 ], "pop" : 3292, "state" : "AR" } +{ "_id" : "72834", "city" : "DARDANELLE", "loc" : [ -93.187316, 35.195507 ], "pop" : 8281, "state" : "AR" } +{ "_id" : "72835", "city" : "DELAWARE", "loc" : [ -93.346152, 35.278005 ], "pop" : 645, "state" : "AR" } +{ "_id" : "72837", "city" : "DOVER", "loc" : [ -93.135526, 35.407356 ], "pop" : 5687, "state" : "AR" } +{ "_id" : "72838", "city" : "GRAVELLY", "loc" : [ -93.680249, 34.888123 ], "pop" : 150, "state" : "AR" } +{ "_id" : "72839", "city" : "HAGARVILLE", "loc" : [ -93.344256, 35.523291 ], "pop" : 584, "state" : "AR" } +{ "_id" : "72840", "city" : "HARTMAN", "loc" : [ -93.61419600000001, 35.443583 ], "pop" : 846, "state" : "AR" } +{ "_id" : "72841", "city" : "HARVEY", "loc" : [ -93.752538, 34.867912 ], "pop" : 243, "state" : "AR" } +{ "_id" : "72842", "city" : "WAVELAND", "loc" : [ -93.576719, 35.111845 ], "pop" : 1294, "state" : "AR" } +{ "_id" : "72843", "city" : "HECTOR", "loc" : [ -92.965559, 35.40574 ], "pop" : 5067, "state" : "AR" } +{ "_id" : "72845", "city" : "KNOXVILLE", "loc" : [ -93.361797, 35.374897 ], "pop" : 848, "state" : "AR" } +{ "_id" : "72846", "city" : "LAMAR", "loc" : [ -93.35515700000001, 35.434868 ], "pop" : 2905, "state" : "AR" } +{ "_id" : "72847", "city" : "LONDON", "loc" : [ -93.238907, 35.337017 ], "pop" : 2396, "state" : "AR" } +{ "_id" : "72851", "city" : "NEW BLAINE", "loc" : [ -93.44457, 35.318912 ], "pop" : 891, "state" : "AR" } +{ "_id" : "72852", "city" : "OARK", "loc" : [ -93.558531, 35.709454 ], "pop" : 221, "state" : "AR" } +{ "_id" : "72853", "city" : "OLA", "loc" : [ -93.21356, 35.03091 ], "pop" : 1823, "state" : "AR" } +{ "_id" : "72854", "city" : "OZONE", "loc" : [ -93.43111, 35.657478 ], "pop" : 334, "state" : "AR" } +{ "_id" : "72855", "city" : "PARIS", "loc" : [ -93.72646899999999, 35.294149 ], "pop" : 5718, "state" : "AR" } +{ "_id" : "72856", "city" : "PELSOR", "loc" : [ -93.016088, 35.691158 ], "pop" : 117, "state" : "AR" } +{ "_id" : "72857", "city" : "PLAINVIEW", "loc" : [ -93.30989700000001, 34.966793 ], "pop" : 1260, "state" : "AR" } +{ "_id" : "72858", "city" : "POTTSVILLE", "loc" : [ -93.056386, 35.239785 ], "pop" : 2494, "state" : "AR" } +{ "_id" : "72860", "city" : "ROVER", "loc" : [ -93.40172800000001, 34.947522 ], "pop" : 299, "state" : "AR" } +{ "_id" : "72863", "city" : "SCRANTON", "loc" : [ -93.539362, 35.330816 ], "pop" : 1683, "state" : "AR" } +{ "_id" : "72865", "city" : "SUBIACO", "loc" : [ -93.63869, 35.31346 ], "pop" : 1190, "state" : "AR" } +{ "_id" : "72901", "city" : "FORT SMITH", "loc" : [ -94.411035, 35.365272 ], "pop" : 21722, "state" : "AR" } +{ "_id" : "72903", "city" : "FORT SMITH", "loc" : [ -94.378361, 35.342673 ], "pop" : 32809, "state" : "AR" } +{ "_id" : "72904", "city" : "FORT SMITH", "loc" : [ -94.38723, 35.405122 ], "pop" : 18559, "state" : "AR" } +{ "_id" : "72905", "city" : "FORT CHAFFEE", "loc" : [ -94.340521, 35.297366 ], "pop" : 224, "state" : "AR" } +{ "_id" : "72916", "city" : "FORT SMITH", "loc" : [ -94.37030799999999, 35.250175 ], "pop" : 3494, "state" : "AR" } +{ "_id" : "72921", "city" : "ALMA", "loc" : [ -94.207337, 35.500043 ], "pop" : 7443, "state" : "AR" } +{ "_id" : "72923", "city" : "BARLING", "loc" : [ -94.308226, 35.332963 ], "pop" : 3857, "state" : "AR" } +{ "_id" : "72924", "city" : "BATES", "loc" : [ -94.39315499999999, 34.909295 ], "pop" : 213, "state" : "AR" } +{ "_id" : "72926", "city" : "BOLES", "loc" : [ -94.062864, 34.765363 ], "pop" : 687, "state" : "AR" } +{ "_id" : "72927", "city" : "BOONEVILLE", "loc" : [ -93.92743299999999, 35.136385 ], "pop" : 7502, "state" : "AR" } +{ "_id" : "72928", "city" : "BRANCH", "loc" : [ -93.94537, 35.297055 ], "pop" : 597, "state" : "AR" } +{ "_id" : "72930", "city" : "CECIL", "loc" : [ -93.942932, 35.434176 ], "pop" : 271, "state" : "AR" } +{ "_id" : "72932", "city" : "CEDARVILLE", "loc" : [ -94.344618, 35.590231 ], "pop" : 1605, "state" : "AR" } +{ "_id" : "72933", "city" : "CHARLESTON", "loc" : [ -94.03368, 35.311502 ], "pop" : 3173, "state" : "AR" } +{ "_id" : "72934", "city" : "CHESTER", "loc" : [ -94.202026, 35.689776 ], "pop" : 1004, "state" : "AR" } +{ "_id" : "72936", "city" : "GREENWOOD", "loc" : [ -94.253027, 35.195476 ], "pop" : 8385, "state" : "AR" } +{ "_id" : "72937", "city" : "HACKETT", "loc" : [ -94.39832800000001, 35.194476 ], "pop" : 1587, "state" : "AR" } +{ "_id" : "72938", "city" : "HARTFORD", "loc" : [ -94.38187600000001, 35.022233 ], "pop" : 1073, "state" : "AR" } +{ "_id" : "72940", "city" : "HUNTINGTON", "loc" : [ -94.331283, 35.096267 ], "pop" : 2608, "state" : "AR" } +{ "_id" : "72941", "city" : "CENTRAL CITY", "loc" : [ -94.165637, 35.337513 ], "pop" : 4138, "state" : "AR" } +{ "_id" : "72943", "city" : "MAGAZINE", "loc" : [ -93.800336, 35.15873 ], "pop" : 1336, "state" : "AR" } +{ "_id" : "72944", "city" : "MANSFIELD", "loc" : [ -94.22036, 35.0432 ], "pop" : 2607, "state" : "AR" } +{ "_id" : "72946", "city" : "MOUNTAINBURG", "loc" : [ -94.109094, 35.570027 ], "pop" : 4762, "state" : "AR" } +{ "_id" : "72947", "city" : "MULBERRY", "loc" : [ -93.988505, 35.517246 ], "pop" : 738, "state" : "AR" } +{ "_id" : "72948", "city" : "NATURAL DAM", "loc" : [ -94.41237700000001, 35.674259 ], "pop" : 497, "state" : "AR" } +{ "_id" : "72949", "city" : "OZARK", "loc" : [ -93.837423, 35.524645 ], "pop" : 7338, "state" : "AR" } +{ "_id" : "72950", "city" : "PARKS", "loc" : [ -93.950913, 34.800333 ], "pop" : 471, "state" : "AR" } +{ "_id" : "72951", "city" : "RATCLIFF", "loc" : [ -93.84214900000001, 35.276032 ], "pop" : 1392, "state" : "AR" } +{ "_id" : "72952", "city" : "RUDY", "loc" : [ -94.237376, 35.539805 ], "pop" : 1753, "state" : "AR" } +{ "_id" : "72955", "city" : "UNIONTOWN", "loc" : [ -94.43487, 35.574822 ], "pop" : 710, "state" : "AR" } +{ "_id" : "72956", "city" : "VAN BUREN", "loc" : [ -94.32776200000001, 35.453989 ], "pop" : 24719, "state" : "AR" } +{ "_id" : "72958", "city" : "WALDRON", "loc" : [ -94.077243, 34.902642 ], "pop" : 6884, "state" : "AR" } +{ "_id" : "72959", "city" : "WINSLOW", "loc" : [ -94.118657, 35.831206 ], "pop" : 2566, "state" : "AR" } +{ "_id" : "73002", "city" : "ALEX", "loc" : [ -97.75709000000001, 34.961202 ], "pop" : 1976, "state" : "OK" } +{ "_id" : "73004", "city" : "AMBER", "loc" : [ -97.764566, 35.137691 ], "pop" : 2575, "state" : "OK" } +{ "_id" : "73005", "city" : "ANADARKO", "loc" : [ -98.24290999999999, 35.072808 ], "pop" : 10332, "state" : "OK" } +{ "_id" : "73006", "city" : "APACHE", "loc" : [ -98.369483, 34.903376 ], "pop" : 2969, "state" : "OK" } +{ "_id" : "73007", "city" : "ARCADIA", "loc" : [ -97.32428899999999, 35.6543 ], "pop" : 697, "state" : "OK" } +{ "_id" : "73008", "city" : "BETHANY", "loc" : [ -97.63985599999999, 35.504315 ], "pop" : 21064, "state" : "OK" } +{ "_id" : "73009", "city" : "BINGER", "loc" : [ -98.314797, 35.310593 ], "pop" : 1799, "state" : "OK" } +{ "_id" : "73010", "city" : "BLANCHARD", "loc" : [ -97.640131, 35.119215 ], "pop" : 4511, "state" : "OK" } +{ "_id" : "73011", "city" : "BRADLEY", "loc" : [ -97.71184100000001, 34.874124 ], "pop" : 416, "state" : "OK" } +{ "_id" : "73013", "city" : "EDMOND", "loc" : [ -97.473268, 35.621534 ], "pop" : 22802, "state" : "OK" } +{ "_id" : "73014", "city" : "CALUMET", "loc" : [ -98.18999100000001, 35.594819 ], "pop" : 1507, "state" : "OK" } +{ "_id" : "73015", "city" : "CARNEGIE", "loc" : [ -98.57545399999999, 35.123484 ], "pop" : 3907, "state" : "OK" } +{ "_id" : "73016", "city" : "CASHION", "loc" : [ -97.679523, 35.799996 ], "pop" : 408, "state" : "OK" } +{ "_id" : "73017", "city" : "CEMENT", "loc" : [ -98.14655999999999, 34.932092 ], "pop" : 1641, "state" : "OK" } +{ "_id" : "73018", "city" : "CHICKASHA", "loc" : [ -97.951847, 35.026751 ], "pop" : 19634, "state" : "OK" } +{ "_id" : "73020", "city" : "CHOCTAW", "loc" : [ -97.272564, 35.471758 ], "pop" : 13832, "state" : "OK" } +{ "_id" : "73021", "city" : "COLONY", "loc" : [ -98.67067400000001, 35.344844 ], "pop" : 312, "state" : "OK" } +{ "_id" : "73024", "city" : "CORN", "loc" : [ -98.806226, 35.399842 ], "pop" : 1156, "state" : "OK" } +{ "_id" : "73027", "city" : "COYLE", "loc" : [ -97.260683, 35.898496 ], "pop" : 3054, "state" : "OK" } +{ "_id" : "73028", "city" : "CRESCENT", "loc" : [ -97.59692200000001, 35.942 ], "pop" : 2832, "state" : "OK" } +{ "_id" : "73029", "city" : "CYRIL", "loc" : [ -98.208269, 34.895854 ], "pop" : 1433, "state" : "OK" } +{ "_id" : "73030", "city" : "DAVIS", "loc" : [ -97.10843, 34.495301 ], "pop" : 4823, "state" : "OK" } +{ "_id" : "73034", "city" : "EDMOND", "loc" : [ -97.47983499999999, 35.666483 ], "pop" : 43814, "state" : "OK" } +{ "_id" : "73035", "city" : "ELMORE CITY", "loc" : [ -97.39003, 34.608516 ], "pop" : 2520, "state" : "OK" } +{ "_id" : "73036", "city" : "EL RENO", "loc" : [ -97.959091, 35.533468 ], "pop" : 18480, "state" : "OK" } +{ "_id" : "73038", "city" : "FORT COBB", "loc" : [ -98.430296, 35.116097 ], "pop" : 1847, "state" : "OK" } +{ "_id" : "73039", "city" : "FOSTER", "loc" : [ -97.533395, 34.627789 ], "pop" : 578, "state" : "OK" } +{ "_id" : "73040", "city" : "GEARY", "loc" : [ -98.390529, 35.621709 ], "pop" : 2124, "state" : "OK" } +{ "_id" : "73041", "city" : "GOTEBO", "loc" : [ -98.87597700000001, 35.075891 ], "pop" : 534, "state" : "OK" } +{ "_id" : "73042", "city" : "GRACEMONT", "loc" : [ -98.283513, 35.187498 ], "pop" : 968, "state" : "OK" } +{ "_id" : "73043", "city" : "GREENFIELD", "loc" : [ -98.384073, 35.733269 ], "pop" : 270, "state" : "OK" } +{ "_id" : "73044", "city" : "GUTHRIE", "loc" : [ -97.43599500000001, 35.832955 ], "pop" : 19769, "state" : "OK" } +{ "_id" : "73045", "city" : "HARRAH", "loc" : [ -97.17343, 35.483258 ], "pop" : 6766, "state" : "OK" } +{ "_id" : "73046", "city" : "HENNEPIN", "loc" : [ -97.42146700000001, 34.485893 ], "pop" : 656, "state" : "OK" } +{ "_id" : "73047", "city" : "HINTON", "loc" : [ -98.33134800000001, 35.4675 ], "pop" : 2433, "state" : "OK" } +{ "_id" : "73048", "city" : "HYDRO", "loc" : [ -98.56044799999999, 35.45201 ], "pop" : 2009, "state" : "OK" } +{ "_id" : "73049", "city" : "JONES", "loc" : [ -97.28914, 35.575316 ], "pop" : 3059, "state" : "OK" } +{ "_id" : "73051", "city" : "LEXINGTON", "loc" : [ -97.26094500000001, 35.037661 ], "pop" : 7904, "state" : "OK" } +{ "_id" : "73052", "city" : "LINDSAY", "loc" : [ -97.599788, 34.821116 ], "pop" : 5597, "state" : "OK" } +{ "_id" : "73053", "city" : "LOOKEBA", "loc" : [ -98.389833, 35.367946 ], "pop" : 802, "state" : "OK" } +{ "_id" : "73054", "city" : "LUTHER", "loc" : [ -97.182292, 35.631491 ], "pop" : 2111, "state" : "OK" } +{ "_id" : "73055", "city" : "MARLOW", "loc" : [ -97.940955, 34.638681 ], "pop" : 7881, "state" : "OK" } +{ "_id" : "73056", "city" : "MARSHALL", "loc" : [ -97.617052, 36.148455 ], "pop" : 479, "state" : "OK" } +{ "_id" : "73057", "city" : "MAYSVILLE", "loc" : [ -97.41314300000001, 34.811316 ], "pop" : 2456, "state" : "OK" } +{ "_id" : "73058", "city" : "MERIDIAN", "loc" : [ -97.24623, 35.8451 ], "pop" : 61, "state" : "OK" } +{ "_id" : "73059", "city" : "MINCO", "loc" : [ -97.96638, 35.306723 ], "pop" : 2119, "state" : "OK" } +{ "_id" : "73061", "city" : "MORRISON", "loc" : [ -97.022777, 36.290214 ], "pop" : 1425, "state" : "OK" } +{ "_id" : "73062", "city" : "MOUNTAIN VIEW", "loc" : [ -98.730694, 35.06535 ], "pop" : 1808, "state" : "OK" } +{ "_id" : "73063", "city" : "MULHALL", "loc" : [ -97.409809, 36.053678 ], "pop" : 463, "state" : "OK" } +{ "_id" : "73064", "city" : "MUSTANG", "loc" : [ -97.73088799999999, 35.388498 ], "pop" : 12156, "state" : "OK" } +{ "_id" : "73065", "city" : "NEWCASTLE", "loc" : [ -97.621573, 35.245269 ], "pop" : 4653, "state" : "OK" } +{ "_id" : "73067", "city" : "NINNEKAH", "loc" : [ -97.933277, 34.91435 ], "pop" : 1075, "state" : "OK" } +{ "_id" : "73068", "city" : "NOBLE", "loc" : [ -97.340929, 35.141742 ], "pop" : 8098, "state" : "OK" } +{ "_id" : "73069", "city" : "NORMAN", "loc" : [ -97.45774299999999, 35.220389 ], "pop" : 21299, "state" : "OK" } +{ "_id" : "73071", "city" : "NORMAN", "loc" : [ -97.379159, 35.224254 ], "pop" : 32228, "state" : "OK" } +{ "_id" : "73072", "city" : "NORMAN", "loc" : [ -97.472984, 35.210733 ], "pop" : 27969, "state" : "OK" } +{ "_id" : "73073", "city" : "ORLANDO", "loc" : [ -97.39599200000001, 36.141973 ], "pop" : 332, "state" : "OK" } +{ "_id" : "73074", "city" : "PAOLI", "loc" : [ -97.260807, 34.828492 ], "pop" : 989, "state" : "OK" } +{ "_id" : "73075", "city" : "PAULS VALLEY", "loc" : [ -97.21950099999999, 34.738506 ], "pop" : 8663, "state" : "OK" } +{ "_id" : "73077", "city" : "PERRY", "loc" : [ -97.284175, 36.287468 ], "pop" : 7231, "state" : "OK" } +{ "_id" : "73078", "city" : "PIEDMONT", "loc" : [ -97.743109, 35.66946 ], "pop" : 2267, "state" : "OK" } +{ "_id" : "73079", "city" : "POCASSET", "loc" : [ -97.97904, 35.154437 ], "pop" : 895, "state" : "OK" } +{ "_id" : "73080", "city" : "PURCELL", "loc" : [ -97.425493, 35.010293 ], "pop" : 8700, "state" : "OK" } +{ "_id" : "73081", "city" : "RATLIFF CITY", "loc" : [ -97.51442400000001, 34.420719 ], "pop" : 894, "state" : "OK" } +{ "_id" : "73082", "city" : "RUSH SPRINGS", "loc" : [ -97.943101, 34.770804 ], "pop" : 3537, "state" : "OK" } +{ "_id" : "73084", "city" : "SPENCER", "loc" : [ -97.348775, 35.518276 ], "pop" : 7675, "state" : "OK" } +{ "_id" : "73086", "city" : "SULPHUR", "loc" : [ -96.97969500000001, 34.511585 ], "pop" : 7018, "state" : "OK" } +{ "_id" : "73088", "city" : "TUSSY", "loc" : [ -97.536379, 34.492159 ], "pop" : 90, "state" : "OK" } +{ "_id" : "73089", "city" : "TUTTLE", "loc" : [ -97.744621, 35.267406 ], "pop" : 8753, "state" : "OK" } +{ "_id" : "73090", "city" : "UNION CITY", "loc" : [ -97.93979, 35.391333 ], "pop" : 551, "state" : "OK" } +{ "_id" : "73092", "city" : "VERDEN", "loc" : [ -98.079206, 35.08356 ], "pop" : 734, "state" : "OK" } +{ "_id" : "73093", "city" : "WASHINGTON", "loc" : [ -97.486969, 35.13235 ], "pop" : 1670, "state" : "OK" } +{ "_id" : "73095", "city" : "WAYNE", "loc" : [ -97.329014, 34.915353 ], "pop" : 1430, "state" : "OK" } +{ "_id" : "73096", "city" : "WEATHERFORD", "loc" : [ -98.699603, 35.535046 ], "pop" : 11963, "state" : "OK" } +{ "_id" : "73098", "city" : "WYNNEWOOD", "loc" : [ -97.176952, 34.63847 ], "pop" : 3762, "state" : "OK" } +{ "_id" : "73099", "city" : "YUKON", "loc" : [ -97.73230700000001, 35.49772 ], "pop" : 38891, "state" : "OK" } +{ "_id" : "73102", "city" : "OKLAHOMA CITY", "loc" : [ -97.519926, 35.472601 ], "pop" : 2227, "state" : "OK" } +{ "_id" : "73103", "city" : "OKLAHOMA CITY", "loc" : [ -97.51959100000001, 35.490957 ], "pop" : 4253, "state" : "OK" } +{ "_id" : "73104", "city" : "OKLAHOMA CITY", "loc" : [ -97.50171400000001, 35.479388 ], "pop" : 2534, "state" : "OK" } +{ "_id" : "73105", "city" : "OKLAHOMA CITY", "loc" : [ -97.500291, 35.510811 ], "pop" : 5379, "state" : "OK" } +{ "_id" : "73106", "city" : "OKLAHOMA CITY", "loc" : [ -97.537228, 35.485328 ], "pop" : 12706, "state" : "OK" } +{ "_id" : "73107", "city" : "OKLAHOMA CITY", "loc" : [ -97.57397400000001, 35.48736 ], "pop" : 23130, "state" : "OK" } +{ "_id" : "73108", "city" : "OKLAHOMA CITY", "loc" : [ -97.56192799999999, 35.444485 ], "pop" : 13259, "state" : "OK" } +{ "_id" : "73109", "city" : "OKLAHOMA CITY", "loc" : [ -97.52613100000001, 35.425944 ], "pop" : 16821, "state" : "OK" } +{ "_id" : "73110", "city" : "MIDWEST CITY", "loc" : [ -97.397661, 35.461978 ], "pop" : 35101, "state" : "OK" } +{ "_id" : "73111", "city" : "OKLAHOMA CITY", "loc" : [ -97.48060700000001, 35.504238 ], "pop" : 15332, "state" : "OK" } +{ "_id" : "73112", "city" : "OKLAHOMA CITY", "loc" : [ -97.574639, 35.518435 ], "pop" : 29057, "state" : "OK" } +{ "_id" : "73114", "city" : "OKLAHOMA CITY", "loc" : [ -97.52573599999999, 35.570357 ], "pop" : 15126, "state" : "OK" } +{ "_id" : "73115", "city" : "DEL CITY", "loc" : [ -97.44164499999999, 35.440093 ], "pop" : 23589, "state" : "OK" } +{ "_id" : "73116", "city" : "NICHOLS HILLS", "loc" : [ -97.56394, 35.542484 ], "pop" : 9559, "state" : "OK" } +{ "_id" : "73117", "city" : "OKLAHOMA CITY", "loc" : [ -97.472195, 35.479667 ], "pop" : 6489, "state" : "OK" } +{ "_id" : "73118", "city" : "OKLAHOMA CITY", "loc" : [ -97.531908, 35.513645 ], "pop" : 13826, "state" : "OK" } +{ "_id" : "73119", "city" : "OKLAHOMA CITY", "loc" : [ -97.561584, 35.421033 ], "pop" : 25150, "state" : "OK" } +{ "_id" : "73120", "city" : "OKLAHOMA CITY", "loc" : [ -97.563756, 35.583478 ], "pop" : 35879, "state" : "OK" } +{ "_id" : "73121", "city" : "OKLAHOMA CITY", "loc" : [ -97.445183, 35.506235 ], "pop" : 3134, "state" : "OK" } +{ "_id" : "73122", "city" : "WARR ACRES", "loc" : [ -97.613305, 35.520239 ], "pop" : 13337, "state" : "OK" } +{ "_id" : "73127", "city" : "OKLAHOMA CITY", "loc" : [ -97.629927, 35.483371 ], "pop" : 20789, "state" : "OK" } +{ "_id" : "73128", "city" : "OKLAHOMA CITY", "loc" : [ -97.616362, 35.444358 ], "pop" : 1349, "state" : "OK" } +{ "_id" : "73129", "city" : "OKLAHOMA CITY", "loc" : [ -97.491309, 35.43119 ], "pop" : 18830, "state" : "OK" } +{ "_id" : "73130", "city" : "MIDWEST CITY", "loc" : [ -97.351489, 35.460863 ], "pop" : 16223, "state" : "OK" } +{ "_id" : "73131", "city" : "OKLAHOMA CITY", "loc" : [ -97.469127, 35.579693 ], "pop" : 1460, "state" : "OK" } +{ "_id" : "73132", "city" : "WARR ACRES", "loc" : [ -97.63633299999999, 35.552783 ], "pop" : 22038, "state" : "OK" } +{ "_id" : "73134", "city" : "OKLAHOMA CITY", "loc" : [ -97.558342, 35.617397 ], "pop" : 1317, "state" : "OK" } +{ "_id" : "73135", "city" : "OKLAHOMA CITY", "loc" : [ -97.438762, 35.411037 ], "pop" : 13933, "state" : "OK" } +{ "_id" : "73139", "city" : "OKLAHOMA CITY", "loc" : [ -97.536205, 35.379193 ], "pop" : 22429, "state" : "OK" } +{ "_id" : "73141", "city" : "OKLAHOMA CITY", "loc" : [ -97.366606, 35.491848 ], "pop" : 2667, "state" : "OK" } +{ "_id" : "73142", "city" : "OKLAHOMA CITY", "loc" : [ -97.625067, 35.598994 ], "pop" : 4366, "state" : "OK" } +{ "_id" : "73145", "city" : "TINKER AFB", "loc" : [ -97.403707, 35.415706 ], "pop" : 3714, "state" : "OK" } +{ "_id" : "73149", "city" : "OKLAHOMA CITY", "loc" : [ -97.497175, 35.394998 ], "pop" : 5335, "state" : "OK" } +{ "_id" : "73150", "city" : "OKLAHOMA CITY", "loc" : [ -97.33308, 35.41231 ], "pop" : 4512, "state" : "OK" } +{ "_id" : "73151", "city" : "OKLAHOMA CITY", "loc" : [ -97.39057, 35.568508 ], "pop" : 1315, "state" : "OK" } +{ "_id" : "73159", "city" : "OKLAHOMA CITY", "loc" : [ -97.55674, 35.39224 ], "pop" : 21343, "state" : "OK" } +{ "_id" : "73160", "city" : "MOORE", "loc" : [ -97.487352, 35.342465 ], "pop" : 39935, "state" : "OK" } +{ "_id" : "73162", "city" : "OKLAHOMA CITY", "loc" : [ -97.64193400000001, 35.580647 ], "pop" : 21084, "state" : "OK" } +{ "_id" : "73165", "city" : "MOORE", "loc" : [ -97.34979199999999, 35.337086 ], "pop" : 4202, "state" : "OK" } +{ "_id" : "73169", "city" : "OKLAHOMA CITY", "loc" : [ -97.658683, 35.388233 ], "pop" : 1266, "state" : "OK" } +{ "_id" : "73170", "city" : "MOORE", "loc" : [ -97.536, 35.341554 ], "pop" : 13250, "state" : "OK" } +{ "_id" : "73173", "city" : "OKLAHOMA CITY", "loc" : [ -97.63171, 35.342455 ], "pop" : 667, "state" : "OK" } +{ "_id" : "73179", "city" : "OKLAHOMA CITY", "loc" : [ -97.654729, 35.424157 ], "pop" : 1177, "state" : "OK" } +{ "_id" : "73401", "city" : "MILO", "loc" : [ -97.134157, 34.176681 ], "pop" : 30328, "state" : "OK" } +{ "_id" : "73430", "city" : "BURNEYVILLE", "loc" : [ -97.324929, 33.951516 ], "pop" : 740, "state" : "OK" } +{ "_id" : "73432", "city" : "COLEMAN", "loc" : [ -96.45881799999999, 34.262498 ], "pop" : 1073, "state" : "OK" } +{ "_id" : "73437", "city" : "GRAHAM", "loc" : [ -97.495435, 34.337379 ], "pop" : 674, "state" : "OK" } +{ "_id" : "73438", "city" : "HEALDTON", "loc" : [ -97.48890400000001, 34.229017 ], "pop" : 3114, "state" : "OK" } +{ "_id" : "73439", "city" : "KINGSTON", "loc" : [ -96.711977, 33.951664 ], "pop" : 3808, "state" : "OK" } +{ "_id" : "73440", "city" : "LEBANON", "loc" : [ -96.86449500000001, 33.961036 ], "pop" : 144, "state" : "OK" } +{ "_id" : "73441", "city" : "LEON", "loc" : [ -97.447058, 33.924278 ], "pop" : 919, "state" : "OK" } +{ "_id" : "73442", "city" : "LOCO", "loc" : [ -97.665803, 34.321416 ], "pop" : 338, "state" : "OK" } +{ "_id" : "73443", "city" : "LONE GROVE", "loc" : [ -97.268523, 34.177373 ], "pop" : 3002, "state" : "OK" } +{ "_id" : "73446", "city" : "MC MILLAN", "loc" : [ -96.78725799999999, 34.07126 ], "pop" : 6877, "state" : "OK" } +{ "_id" : "73447", "city" : "MANNSVILLE", "loc" : [ -96.87780100000001, 34.189902 ], "pop" : 888, "state" : "OK" } +{ "_id" : "73448", "city" : "MARIETTA", "loc" : [ -97.114801, 33.943099 ], "pop" : 5242, "state" : "OK" } +{ "_id" : "73449", "city" : "MEAD", "loc" : [ -96.529886, 33.994442 ], "pop" : 1520, "state" : "OK" } +{ "_id" : "73450", "city" : "MILBURN", "loc" : [ -96.54286, 34.195172 ], "pop" : 884, "state" : "OK" } +{ "_id" : "73453", "city" : "OVERBROOK", "loc" : [ -97.13235299999999, 34.053906 ], "pop" : 283, "state" : "OK" } +{ "_id" : "73456", "city" : "RINGLING", "loc" : [ -97.602867, 34.167865 ], "pop" : 2215, "state" : "OK" } +{ "_id" : "73458", "city" : "SPRINGER", "loc" : [ -97.122266, 34.303832 ], "pop" : 1248, "state" : "OK" } +{ "_id" : "73459", "city" : "THACKERVILLE", "loc" : [ -97.136349, 33.788167 ], "pop" : 973, "state" : "OK" } +{ "_id" : "73460", "city" : "TISHOMINGO", "loc" : [ -96.667502, 34.264286 ], "pop" : 4958, "state" : "OK" } +{ "_id" : "73461", "city" : "WAPANUCKA", "loc" : [ -96.45322299999999, 34.386634 ], "pop" : 719, "state" : "OK" } +{ "_id" : "73463", "city" : "RUBOTTOM", "loc" : [ -97.42487, 34.164206 ], "pop" : 3095, "state" : "OK" } +{ "_id" : "73501", "city" : "LAWTON", "loc" : [ -98.369783, 34.591467 ], "pop" : 18175, "state" : "OK" } +{ "_id" : "73503", "city" : "FORT SILL", "loc" : [ -98.40040999999999, 34.659525 ], "pop" : 12228, "state" : "OK" } +{ "_id" : "73505", "city" : "LAWTON", "loc" : [ -98.455234, 34.617939 ], "pop" : 45542, "state" : "OK" } +{ "_id" : "73507", "city" : "LAWTON", "loc" : [ -98.389453, 34.624595 ], "pop" : 19244, "state" : "OK" } +{ "_id" : "73521", "city" : "ALTUS", "loc" : [ -99.320483, 34.648406 ], "pop" : 22957, "state" : "OK" } +{ "_id" : "73526", "city" : "BLAIR", "loc" : [ -99.333404, 34.778813 ], "pop" : 1147, "state" : "OK" } +{ "_id" : "73527", "city" : "CACHE", "loc" : [ -98.615351, 34.613072 ], "pop" : 3857, "state" : "OK" } +{ "_id" : "73528", "city" : "CHATTANOOGA", "loc" : [ -98.651365, 34.426193 ], "pop" : 483, "state" : "OK" } +{ "_id" : "73529", "city" : "COMANCHE", "loc" : [ -97.979286, 34.376523 ], "pop" : 4998, "state" : "OK" } +{ "_id" : "73530", "city" : "DAVIDSON", "loc" : [ -99.064031, 34.251423 ], "pop" : 800, "state" : "OK" } +{ "_id" : "73531", "city" : "DEVOL", "loc" : [ -98.57699100000001, 34.195589 ], "pop" : 311, "state" : "OK" } +{ "_id" : "73532", "city" : "DUKE", "loc" : [ -99.54817199999999, 34.666769 ], "pop" : 625, "state" : "OK" } +{ "_id" : "73533", "city" : "DUNCAN", "loc" : [ -97.94032199999999, 34.507277 ], "pop" : 28871, "state" : "OK" } +{ "_id" : "73537", "city" : "ELDORADO", "loc" : [ -99.645956, 34.472744 ], "pop" : 742, "state" : "OK" } +{ "_id" : "73538", "city" : "ELGIN", "loc" : [ -98.40732199999999, 34.772018 ], "pop" : 5476, "state" : "OK" } +{ "_id" : "73539", "city" : "ELMER", "loc" : [ -99.316744, 34.513668 ], "pop" : 569, "state" : "OK" } +{ "_id" : "73540", "city" : "FAXON", "loc" : [ -98.55771, 34.464521 ], "pop" : 352, "state" : "OK" } +{ "_id" : "73541", "city" : "FLETCHER", "loc" : [ -98.20024600000001, 34.784657 ], "pop" : 3382, "state" : "OK" } +{ "_id" : "73542", "city" : "FREDERICK", "loc" : [ -99.011877, 34.401199 ], "pop" : 6196, "state" : "OK" } +{ "_id" : "73543", "city" : "GERONIMO", "loc" : [ -98.387525, 34.480499 ], "pop" : 1305, "state" : "OK" } +{ "_id" : "73544", "city" : "GOULD", "loc" : [ -99.78433699999999, 34.664964 ], "pop" : 553, "state" : "OK" } +{ "_id" : "73546", "city" : "GRANDFIELD", "loc" : [ -98.686654, 34.228247 ], "pop" : 1436, "state" : "OK" } +{ "_id" : "73547", "city" : "GRANITE", "loc" : [ -99.388139, 34.971184 ], "pop" : 2216, "state" : "OK" } +{ "_id" : "73548", "city" : "HASTINGS", "loc" : [ -98.107539, 34.225064 ], "pop" : 210, "state" : "OK" } +{ "_id" : "73549", "city" : "HEADRICK", "loc" : [ -99.23904, 34.72189 ], "pop" : 1903, "state" : "OK" } +{ "_id" : "73550", "city" : "HOLLIS", "loc" : [ -99.917711, 34.695281 ], "pop" : 3136, "state" : "OK" } +{ "_id" : "73551", "city" : "HOLLISTER", "loc" : [ -98.881404, 34.352473 ], "pop" : 127, "state" : "OK" } +{ "_id" : "73552", "city" : "INDIAHOMA", "loc" : [ -98.734864, 34.624226 ], "pop" : 1385, "state" : "OK" } +{ "_id" : "73553", "city" : "LOVELAND", "loc" : [ -98.72353, 34.391018 ], "pop" : 312, "state" : "OK" } +{ "_id" : "73554", "city" : "REED", "loc" : [ -99.505769, 34.875473 ], "pop" : 4057, "state" : "OK" } +{ "_id" : "73559", "city" : "MOUNTAIN PARK", "loc" : [ -98.959136, 34.703158 ], "pop" : 631, "state" : "OK" } +{ "_id" : "73560", "city" : "OLUSTEE", "loc" : [ -99.428684, 34.549634 ], "pop" : 821, "state" : "OK" } +{ "_id" : "73561", "city" : "OSCAR", "loc" : [ -97.761359, 33.973237 ], "pop" : 35, "state" : "OK" } +{ "_id" : "73562", "city" : "RANDLETT", "loc" : [ -98.459974, 34.174045 ], "pop" : 891, "state" : "OK" } +{ "_id" : "73564", "city" : "ROOSEVELT", "loc" : [ -98.983599, 34.846983 ], "pop" : 666, "state" : "OK" } +{ "_id" : "73565", "city" : "RYAN", "loc" : [ -97.946141, 34.023787 ], "pop" : 1331, "state" : "OK" } +{ "_id" : "73566", "city" : "SNYDER", "loc" : [ -98.95075199999999, 34.654779 ], "pop" : 1858, "state" : "OK" } +{ "_id" : "73568", "city" : "TEMPLE", "loc" : [ -98.23707400000001, 34.260669 ], "pop" : 1588, "state" : "OK" } +{ "_id" : "73569", "city" : "GRADY", "loc" : [ -97.935045, 33.897162 ], "pop" : 563, "state" : "OK" } +{ "_id" : "73570", "city" : "TIPTON", "loc" : [ -99.13148200000001, 34.509793 ], "pop" : 1513, "state" : "OK" } +{ "_id" : "73571", "city" : "VINSON", "loc" : [ -99.833929, 34.906179 ], "pop" : 104, "state" : "OK" } +{ "_id" : "73572", "city" : "WALTERS", "loc" : [ -98.31398299999999, 34.360526 ], "pop" : 3861, "state" : "OK" } +{ "_id" : "73573", "city" : "WAURIKA", "loc" : [ -97.99734599999999, 34.174466 ], "pop" : 2656, "state" : "OK" } +{ "_id" : "73601", "city" : "CLINTON", "loc" : [ -98.979533, 35.511543 ], "pop" : 10287, "state" : "OK" } +{ "_id" : "73620", "city" : "ARAPAHO", "loc" : [ -98.959508, 35.578864 ], "pop" : 1005, "state" : "OK" } +{ "_id" : "73622", "city" : "BESSIE", "loc" : [ -98.989638, 35.38545 ], "pop" : 271, "state" : "OK" } +{ "_id" : "73625", "city" : "BUTLER", "loc" : [ -99.242749, 35.633638 ], "pop" : 1110, "state" : "OK" } +{ "_id" : "73626", "city" : "CANUTE", "loc" : [ -99.281575, 35.403678 ], "pop" : 1245, "state" : "OK" } +{ "_id" : "73627", "city" : "CARTER", "loc" : [ -99.48223900000001, 35.220779 ], "pop" : 664, "state" : "OK" } +{ "_id" : "73628", "city" : "STRONG CITY", "loc" : [ -99.676688, 35.623181 ], "pop" : 1586, "state" : "OK" } +{ "_id" : "73632", "city" : "CORDELL", "loc" : [ -98.95105599999999, 35.278803 ], "pop" : 4210, "state" : "OK" } +{ "_id" : "73638", "city" : "CRAWFORD", "loc" : [ -99.80644599999999, 35.836766 ], "pop" : 178, "state" : "OK" } +{ "_id" : "73639", "city" : "CUSTER CITY", "loc" : [ -98.912013, 35.689371 ], "pop" : 758, "state" : "OK" } +{ "_id" : "73641", "city" : "DILL CITY", "loc" : [ -99.153738, 35.278704 ], "pop" : 966, "state" : "OK" } +{ "_id" : "73642", "city" : "DURHAM", "loc" : [ -99.90877399999999, 35.836391 ], "pop" : 173, "state" : "OK" } +{ "_id" : "73644", "city" : "ELK CITY", "loc" : [ -99.421086, 35.410359 ], "pop" : 12461, "state" : "OK" } +{ "_id" : "73645", "city" : "ERICK", "loc" : [ -99.863463, 35.228586 ], "pop" : 1638, "state" : "OK" } +{ "_id" : "73646", "city" : "FAY", "loc" : [ -98.65867799999999, 35.820417 ], "pop" : 136, "state" : "OK" } +{ "_id" : "73647", "city" : "FOSS", "loc" : [ -99.15259, 35.373645 ], "pop" : 1609, "state" : "OK" } +{ "_id" : "73650", "city" : "HAMMON", "loc" : [ -99.402683, 35.646131 ], "pop" : 873, "state" : "OK" } +{ "_id" : "73651", "city" : "HOBART", "loc" : [ -99.094433, 35.025521 ], "pop" : 4844, "state" : "OK" } +{ "_id" : "73654", "city" : "LEEDEY", "loc" : [ -99.349146, 35.869772 ], "pop" : 906, "state" : "OK" } +{ "_id" : "73655", "city" : "LONE WOLF", "loc" : [ -99.25016100000001, 34.980584 ], "pop" : 1135, "state" : "OK" } +{ "_id" : "73658", "city" : "EAGLE CITY", "loc" : [ -98.70805799999999, 35.921429 ], "pop" : 332, "state" : "OK" } +{ "_id" : "73659", "city" : "PUTNAM", "loc" : [ -98.963765, 35.853851 ], "pop" : 149, "state" : "OK" } +{ "_id" : "73660", "city" : "REYDON", "loc" : [ -99.916567, 35.657587 ], "pop" : 537, "state" : "OK" } +{ "_id" : "73661", "city" : "ROCKY", "loc" : [ -99.04803699999999, 35.152636 ], "pop" : 242, "state" : "OK" } +{ "_id" : "73662", "city" : "SAYRE", "loc" : [ -99.642928, 35.304722 ], "pop" : 4072, "state" : "OK" } +{ "_id" : "73663", "city" : "SEILING", "loc" : [ -98.88746, 36.127823 ], "pop" : 1847, "state" : "OK" } +{ "_id" : "73664", "city" : "SENTINEL", "loc" : [ -99.17061099999999, 35.161741 ], "pop" : 1358, "state" : "OK" } +{ "_id" : "73666", "city" : "SWEETWATER", "loc" : [ -99.90061900000001, 35.448835 ], "pop" : 428, "state" : "OK" } +{ "_id" : "73667", "city" : "TALOGA", "loc" : [ -98.982473, 35.997242 ], "pop" : 784, "state" : "OK" } +{ "_id" : "73668", "city" : "TEXOLA", "loc" : [ -99.98218, 35.224977 ], "pop" : 89, "state" : "OK" } +{ "_id" : "73669", "city" : "THOMAS", "loc" : [ -98.73884200000001, 35.738165 ], "pop" : 1774, "state" : "OK" } +{ "_id" : "73673", "city" : "WILLOW", "loc" : [ -99.542091, 35.070245 ], "pop" : 376, "state" : "OK" } +{ "_id" : "73701", "city" : "ENID", "loc" : [ -97.862257, 36.402842 ], "pop" : 22487, "state" : "OK" } +{ "_id" : "73703", "city" : "ENID", "loc" : [ -97.91569699999999, 36.397509 ], "pop" : 24700, "state" : "OK" } +{ "_id" : "73716", "city" : "ALINE", "loc" : [ -98.457387, 36.505621 ], "pop" : 526, "state" : "OK" } +{ "_id" : "73717", "city" : "ALVA", "loc" : [ -98.672162, 36.801564 ], "pop" : 6376, "state" : "OK" } +{ "_id" : "73718", "city" : "AMES", "loc" : [ -98.181989, 36.242293 ], "pop" : 618, "state" : "OK" } +{ "_id" : "73719", "city" : "AMORITA", "loc" : [ -98.24582100000001, 36.941221 ], "pop" : 178, "state" : "OK" } +{ "_id" : "73720", "city" : "BISON", "loc" : [ -97.880484, 36.196222 ], "pop" : 212, "state" : "OK" } +{ "_id" : "73722", "city" : "BURLINGTON", "loc" : [ -98.42145499999999, 36.903613 ], "pop" : 359, "state" : "OK" } +{ "_id" : "73723", "city" : "BYRON", "loc" : [ -98.244502, 36.879857 ], "pop" : 172, "state" : "OK" } +{ "_id" : "73724", "city" : "CANTON", "loc" : [ -98.57781799999999, 36.037194 ], "pop" : 1293, "state" : "OK" } +{ "_id" : "73725", "city" : "CAPRON", "loc" : [ -98.629891, 36.896812 ], "pop" : 268, "state" : "OK" } +{ "_id" : "73726", "city" : "CARMEN", "loc" : [ -98.457793, 36.584206 ], "pop" : 642, "state" : "OK" } +{ "_id" : "73727", "city" : "CARRIER", "loc" : [ -97.99968800000001, 36.518892 ], "pop" : 619, "state" : "OK" } +{ "_id" : "73728", "city" : "CHEROKEE", "loc" : [ -98.359375, 36.756376 ], "pop" : 2256, "state" : "OK" } +{ "_id" : "73729", "city" : "CLEO SPRINGS", "loc" : [ -98.442275, 36.408989 ], "pop" : 630, "state" : "OK" } +{ "_id" : "73730", "city" : "COVINGTON", "loc" : [ -97.575163, 36.309944 ], "pop" : 1017, "state" : "OK" } +{ "_id" : "73731", "city" : "DACOMA", "loc" : [ -98.594202, 36.660604 ], "pop" : 351, "state" : "OK" } +{ "_id" : "73733", "city" : "DOUGLAS", "loc" : [ -97.689626, 36.248138 ], "pop" : 314, "state" : "OK" } +{ "_id" : "73734", "city" : "DOVER", "loc" : [ -97.906677, 35.984761 ], "pop" : 580, "state" : "OK" } +{ "_id" : "73735", "city" : "DRUMMOND", "loc" : [ -98.03584600000001, 36.284142 ], "pop" : 896, "state" : "OK" } +{ "_id" : "73736", "city" : "FAIRMONT", "loc" : [ -97.711493, 36.391614 ], "pop" : 701, "state" : "OK" } +{ "_id" : "73737", "city" : "ORIENTA", "loc" : [ -98.506271, 36.265981 ], "pop" : 3964, "state" : "OK" } +{ "_id" : "73738", "city" : "GARBER", "loc" : [ -97.57889900000001, 36.439184 ], "pop" : 1296, "state" : "OK" } +{ "_id" : "73739", "city" : "GOLTRY", "loc" : [ -98.153978, 36.531364 ], "pop" : 436, "state" : "OK" } +{ "_id" : "73741", "city" : "HELENA", "loc" : [ -98.27781899999999, 36.54375 ], "pop" : 1365, "state" : "OK" } +{ "_id" : "73742", "city" : "HENNESSEY", "loc" : [ -97.892595, 36.086848 ], "pop" : 4006, "state" : "OK" } +{ "_id" : "73744", "city" : "HITCHCOCK", "loc" : [ -98.331535, 35.971209 ], "pop" : 231, "state" : "OK" } +{ "_id" : "73747", "city" : "ISABELLA", "loc" : [ -98.337446, 36.23407 ], "pop" : 416, "state" : "OK" } +{ "_id" : "73749", "city" : "JET", "loc" : [ -98.172121, 36.692917 ], "pop" : 526, "state" : "OK" } +{ "_id" : "73750", "city" : "KINGFISHER", "loc" : [ -97.947293, 35.863613 ], "pop" : 6323, "state" : "OK" } +{ "_id" : "73753", "city" : "KREMLIN", "loc" : [ -97.854186, 36.520735 ], "pop" : 971, "state" : "OK" } +{ "_id" : "73754", "city" : "LAHOMA", "loc" : [ -98.072738, 36.385005 ], "pop" : 1275, "state" : "OK" } +{ "_id" : "73755", "city" : "LONGDALE", "loc" : [ -98.549966, 36.121233 ], "pop" : 668, "state" : "OK" } +{ "_id" : "73756", "city" : "LOYAL", "loc" : [ -98.115516, 35.970529 ], "pop" : 132, "state" : "OK" } +{ "_id" : "73757", "city" : "LUCIEN", "loc" : [ -97.452574, 36.275327 ], "pop" : 120, "state" : "OK" } +{ "_id" : "73758", "city" : "MANCHESTER", "loc" : [ -98.03825999999999, 36.9744 ], "pop" : 206, "state" : "OK" } +{ "_id" : "73759", "city" : "MEDFORD", "loc" : [ -97.720215, 36.814195 ], "pop" : 2027, "state" : "OK" } +{ "_id" : "73760", "city" : "MENO", "loc" : [ -98.163501, 36.381497 ], "pop" : 455, "state" : "OK" } +{ "_id" : "73761", "city" : "NASH", "loc" : [ -98.025764, 36.696146 ], "pop" : 647, "state" : "OK" } +{ "_id" : "73762", "city" : "OKARCHE", "loc" : [ -97.92999, 35.750158 ], "pop" : 1703, "state" : "OK" } +{ "_id" : "73763", "city" : "OKEENE", "loc" : [ -98.325422, 36.11646 ], "pop" : 1899, "state" : "OK" } +{ "_id" : "73764", "city" : "OMEGA", "loc" : [ -98.18634400000001, 35.850653 ], "pop" : 60, "state" : "OK" } +{ "_id" : "73766", "city" : "POND CREEK", "loc" : [ -97.801903, 36.664281 ], "pop" : 1173, "state" : "OK" } +{ "_id" : "73768", "city" : "RINGWOOD", "loc" : [ -98.270639, 36.375293 ], "pop" : 1362, "state" : "OK" } +{ "_id" : "73770", "city" : "SOUTHARD", "loc" : [ -98.446456, 36.074706 ], "pop" : 8, "state" : "OK" } +{ "_id" : "73771", "city" : "WAKITA", "loc" : [ -97.94268700000001, 36.875333 ], "pop" : 684, "state" : "OK" } +{ "_id" : "73772", "city" : "WATONGA", "loc" : [ -98.41748699999999, 35.853762 ], "pop" : 5042, "state" : "OK" } +{ "_id" : "73773", "city" : "WAUKOMIS", "loc" : [ -97.89957800000001, 36.278057 ], "pop" : 1704, "state" : "OK" } +{ "_id" : "73801", "city" : "WOODWARD", "loc" : [ -99.402016, 36.426784 ], "pop" : 14279, "state" : "OK" } +{ "_id" : "73832", "city" : "HARMON", "loc" : [ -99.73266, 36.120524 ], "pop" : 1353, "state" : "OK" } +{ "_id" : "73834", "city" : "SELMAN", "loc" : [ -99.604816, 36.835901 ], "pop" : 1957, "state" : "OK" } +{ "_id" : "73835", "city" : "CAMARGO", "loc" : [ -99.27810100000001, 36.021235 ], "pop" : 233, "state" : "OK" } +{ "_id" : "73838", "city" : "CHESTER", "loc" : [ -98.884078, 36.252841 ], "pop" : 561, "state" : "OK" } +{ "_id" : "73840", "city" : "FARGO", "loc" : [ -99.65060200000001, 36.40525 ], "pop" : 692, "state" : "OK" } +{ "_id" : "73841", "city" : "FORT SUPPLY", "loc" : [ -99.526797, 36.564556 ], "pop" : 1222, "state" : "OK" } +{ "_id" : "73842", "city" : "FREEDOM", "loc" : [ -99.131922, 36.809036 ], "pop" : 532, "state" : "OK" } +{ "_id" : "73843", "city" : "GAGE", "loc" : [ -99.760003, 36.317996 ], "pop" : 567, "state" : "OK" } +{ "_id" : "73844", "city" : "GATE", "loc" : [ -100.073386, 36.875679 ], "pop" : 323, "state" : "OK" } +{ "_id" : "73847", "city" : "KNOWLES", "loc" : [ -100.217867, 36.839316 ], "pop" : 49, "state" : "OK" } +{ "_id" : "73848", "city" : "LAVERNE", "loc" : [ -99.891766, 36.70625 ], "pop" : 1747, "state" : "OK" } +{ "_id" : "73849", "city" : "LOGAN", "loc" : [ -100.167934, 36.635554 ], "pop" : 467, "state" : "OK" } +{ "_id" : "73851", "city" : "MAY", "loc" : [ -99.72469, 36.62673 ], "pop" : 88, "state" : "OK" } +{ "_id" : "73852", "city" : "MOORELAND", "loc" : [ -99.18321, 36.442828 ], "pop" : 2047, "state" : "OK" } +{ "_id" : "73853", "city" : "MUTUAL", "loc" : [ -99.114492, 36.213954 ], "pop" : 262, "state" : "OK" } +{ "_id" : "73855", "city" : "ROSSTON", "loc" : [ -99.90025300000001, 36.878915 ], "pop" : 271, "state" : "OK" } +{ "_id" : "73857", "city" : "SHARON", "loc" : [ -99.35873599999999, 36.269872 ], "pop" : 1166, "state" : "OK" } +{ "_id" : "73858", "city" : "SHATTUCK", "loc" : [ -99.87930299999999, 36.288922 ], "pop" : 1886, "state" : "OK" } +{ "_id" : "73859", "city" : "VICI", "loc" : [ -99.267004, 36.137168 ], "pop" : 1333, "state" : "OK" } +{ "_id" : "73860", "city" : "WAYNOKA", "loc" : [ -98.84874600000001, 36.585788 ], "pop" : 1516, "state" : "OK" } +{ "_id" : "73931", "city" : "BALKO", "loc" : [ -100.710329, 36.599607 ], "pop" : 826, "state" : "OK" } +{ "_id" : "73932", "city" : "ELMWOOD", "loc" : [ -100.532938, 36.795562 ], "pop" : 2128, "state" : "OK" } +{ "_id" : "73933", "city" : "BOISE CITY", "loc" : [ -102.535519, 36.728328 ], "pop" : 2064, "state" : "OK" } +{ "_id" : "73937", "city" : "FELT", "loc" : [ -102.797422, 36.566569 ], "pop" : 210, "state" : "OK" } +{ "_id" : "73938", "city" : "FORGAN", "loc" : [ -100.540875, 36.908588 ], "pop" : 688, "state" : "OK" } +{ "_id" : "73939", "city" : "GOODWELL", "loc" : [ -101.71369, 36.674382 ], "pop" : 1857, "state" : "OK" } +{ "_id" : "73942", "city" : "GUYMON", "loc" : [ -101.47778, 36.696052 ], "pop" : 9387, "state" : "OK" } +{ "_id" : "73944", "city" : "HARDESTY", "loc" : [ -101.153944, 36.601754 ], "pop" : 450, "state" : "OK" } +{ "_id" : "73945", "city" : "OPTIMA", "loc" : [ -101.190683, 36.847981 ], "pop" : 2585, "state" : "OK" } +{ "_id" : "73946", "city" : "KENTON", "loc" : [ -102.912421, 36.855639 ], "pop" : 108, "state" : "OK" } +{ "_id" : "73947", "city" : "KEYES", "loc" : [ -102.236063, 36.800316 ], "pop" : 781, "state" : "OK" } +{ "_id" : "73949", "city" : "TEXHOMA", "loc" : [ -101.839351, 36.52529 ], "pop" : 1057, "state" : "OK" } +{ "_id" : "73950", "city" : "BAKER", "loc" : [ -100.869028, 36.909012 ], "pop" : 1542, "state" : "OK" } +{ "_id" : "73951", "city" : "TYRONE", "loc" : [ -101.059408, 36.95577 ], "pop" : 1221, "state" : "OK" } +{ "_id" : "74002", "city" : "BARNSDALL", "loc" : [ -96.131789, 36.542866 ], "pop" : 2936, "state" : "OK" } +{ "_id" : "74003", "city" : "BARTLESVILLE", "loc" : [ -95.992091, 36.743956 ], "pop" : 14990, "state" : "OK" } +{ "_id" : "74006", "city" : "BARTLESVILLE", "loc" : [ -95.92513, 36.736646 ], "pop" : 23075, "state" : "OK" } +{ "_id" : "74008", "city" : "BIXBY", "loc" : [ -95.872895, 35.917291 ], "pop" : 7505, "state" : "OK" } +{ "_id" : "74010", "city" : "BRISTOW", "loc" : [ -96.375838, 35.820904 ], "pop" : 7361, "state" : "OK" } +{ "_id" : "74011", "city" : "BROKEN ARROW", "loc" : [ -95.81433199999999, 35.990812 ], "pop" : 23493, "state" : "OK" } +{ "_id" : "74012", "city" : "BROKEN ARROW", "loc" : [ -95.807863, 36.04466 ], "pop" : 35399, "state" : "OK" } +{ "_id" : "74014", "city" : "BROKEN ARROW", "loc" : [ -95.722269, 36.054435 ], "pop" : 17246, "state" : "OK" } +{ "_id" : "74015", "city" : "CATOOSA", "loc" : [ -95.727321, 36.17208 ], "pop" : 7103, "state" : "OK" } +{ "_id" : "74016", "city" : "CHELSEA", "loc" : [ -95.448871, 36.535586 ], "pop" : 3789, "state" : "OK" } +{ "_id" : "74017", "city" : "CLAREMORE", "loc" : [ -95.598539, 36.324208 ], "pop" : 29964, "state" : "OK" } +{ "_id" : "74020", "city" : "CLEVELAND", "loc" : [ -96.42300899999999, 36.255334 ], "pop" : 8636, "state" : "OK" } +{ "_id" : "74021", "city" : "COLLINSVILLE", "loc" : [ -95.84688, 36.370069 ], "pop" : 8944, "state" : "OK" } +{ "_id" : "74022", "city" : "COPAN", "loc" : [ -95.912987, 36.906181 ], "pop" : 1965, "state" : "OK" } +{ "_id" : "74023", "city" : "CUSHING", "loc" : [ -96.752628, 35.982174 ], "pop" : 9961, "state" : "OK" } +{ "_id" : "74027", "city" : "DELAWARE", "loc" : [ -95.61809599999999, 36.780382 ], "pop" : 1275, "state" : "OK" } +{ "_id" : "74028", "city" : "DEPEW", "loc" : [ -96.489665, 35.756141 ], "pop" : 2224, "state" : "OK" } +{ "_id" : "74029", "city" : "DEWEY", "loc" : [ -95.93454, 36.80125 ], "pop" : 5217, "state" : "OK" } +{ "_id" : "74030", "city" : "DRUMRIGHT", "loc" : [ -96.519789, 35.993136 ], "pop" : 7886, "state" : "OK" } +{ "_id" : "74032", "city" : "GLENCOE", "loc" : [ -96.91384499999999, 36.215815 ], "pop" : 951, "state" : "OK" } +{ "_id" : "74033", "city" : "GLENPOOL", "loc" : [ -95.999709, 35.959106 ], "pop" : 6575, "state" : "OK" } +{ "_id" : "74035", "city" : "HOMINY", "loc" : [ -96.38784800000001, 36.411068 ], "pop" : 3410, "state" : "OK" } +{ "_id" : "74036", "city" : "INOLA", "loc" : [ -95.520456, 36.150315 ], "pop" : 4268, "state" : "OK" } +{ "_id" : "74037", "city" : "JENKS", "loc" : [ -95.97971099999999, 36.014834 ], "pop" : 8086, "state" : "OK" } +{ "_id" : "74038", "city" : "JENNINGS", "loc" : [ -96.573227, 36.186302 ], "pop" : 766, "state" : "OK" } +{ "_id" : "74039", "city" : "KELLYVILLE", "loc" : [ -96.218009, 35.917075 ], "pop" : 2648, "state" : "OK" } +{ "_id" : "74042", "city" : "LENAPAH", "loc" : [ -95.623316, 36.880055 ], "pop" : 692, "state" : "OK" } +{ "_id" : "74044", "city" : "MANNFORD", "loc" : [ -96.357552, 36.092688 ], "pop" : 6963, "state" : "OK" } +{ "_id" : "74045", "city" : "MARAMEC", "loc" : [ -96.68441, 36.217465 ], "pop" : 290, "state" : "OK" } +{ "_id" : "74047", "city" : "MOUNDS", "loc" : [ -96.068513, 35.912919 ], "pop" : 5412, "state" : "OK" } +{ "_id" : "74048", "city" : "NOWATA", "loc" : [ -95.640421, 36.694565 ], "pop" : 5688, "state" : "OK" } +{ "_id" : "74051", "city" : "OCHELATA", "loc" : [ -95.969143, 36.594655 ], "pop" : 1381, "state" : "OK" } +{ "_id" : "74053", "city" : "OOLOGAH", "loc" : [ -95.72901, 36.443723 ], "pop" : 3369, "state" : "OK" } +{ "_id" : "74054", "city" : "OSAGE", "loc" : [ -96.377411, 36.283156 ], "pop" : 633, "state" : "OK" } +{ "_id" : "74055", "city" : "OWASSO", "loc" : [ -95.82215100000001, 36.286258 ], "pop" : 20281, "state" : "OK" } +{ "_id" : "74056", "city" : "PAWHUSKA", "loc" : [ -96.31209, 36.690424 ], "pop" : 6039, "state" : "OK" } +{ "_id" : "74058", "city" : "PAWNEE", "loc" : [ -96.79227, 36.336197 ], "pop" : 4209, "state" : "OK" } +{ "_id" : "74059", "city" : "PERKINS", "loc" : [ -97.044059, 35.97684 ], "pop" : 3246, "state" : "OK" } +{ "_id" : "74060", "city" : "PRUE", "loc" : [ -96.27007399999999, 36.250125 ], "pop" : 712, "state" : "OK" } +{ "_id" : "74061", "city" : "RAMONA", "loc" : [ -95.89622, 36.575245 ], "pop" : 1628, "state" : "OK" } +{ "_id" : "74062", "city" : "RIPLEY", "loc" : [ -96.89667, 35.998491 ], "pop" : 839, "state" : "OK" } +{ "_id" : "74063", "city" : "SAND SPRINGS", "loc" : [ -96.142601, 36.13414 ], "pop" : 25745, "state" : "OK" } +{ "_id" : "74066", "city" : "SAPULPA", "loc" : [ -96.11060999999999, 36.00297 ], "pop" : 24409, "state" : "OK" } +{ "_id" : "74070", "city" : "SKIATOOK", "loc" : [ -96.012325, 36.372495 ], "pop" : 8619, "state" : "OK" } +{ "_id" : "74072", "city" : "S COFFEYVILLE", "loc" : [ -95.606509, 36.983684 ], "pop" : 1397, "state" : "OK" } +{ "_id" : "74073", "city" : "SPERRY", "loc" : [ -95.980368, 36.29547 ], "pop" : 1979, "state" : "OK" } +{ "_id" : "74074", "city" : "STILLWATER", "loc" : [ -97.060868, 36.104349 ], "pop" : 25259, "state" : "OK" } +{ "_id" : "74075", "city" : "STILLWATER", "loc" : [ -97.063035, 36.139584 ], "pop" : 18955, "state" : "OK" } +{ "_id" : "74079", "city" : "KENDRICK", "loc" : [ -96.684377, 35.782389 ], "pop" : 4898, "state" : "OK" } +{ "_id" : "74080", "city" : "TALALA", "loc" : [ -95.714203, 36.542915 ], "pop" : 883, "state" : "OK" } +{ "_id" : "74081", "city" : "TERLTON", "loc" : [ -96.48756899999999, 36.188856 ], "pop" : 915, "state" : "OK" } +{ "_id" : "74083", "city" : "WANN", "loc" : [ -95.776752, 36.940211 ], "pop" : 977, "state" : "OK" } +{ "_id" : "74084", "city" : "WYNONA", "loc" : [ -96.368891, 36.50847 ], "pop" : 1815, "state" : "OK" } +{ "_id" : "74085", "city" : "YALE", "loc" : [ -96.702209, 36.110065 ], "pop" : 2296, "state" : "OK" } +{ "_id" : "74103", "city" : "TULSA", "loc" : [ -95.99542599999999, 36.153858 ], "pop" : 1105, "state" : "OK" } +{ "_id" : "74104", "city" : "TULSA", "loc" : [ -95.952566, 36.146446 ], "pop" : 13247, "state" : "OK" } +{ "_id" : "74105", "city" : "TULSA", "loc" : [ -95.96554399999999, 36.094808 ], "pop" : 29466, "state" : "OK" } +{ "_id" : "74106", "city" : "TULSA", "loc" : [ -95.985956, 36.188296 ], "pop" : 18108, "state" : "OK" } +{ "_id" : "74107", "city" : "TULSA", "loc" : [ -96.02444800000001, 36.104199 ], "pop" : 18899, "state" : "OK" } +{ "_id" : "74108", "city" : "TULSA", "loc" : [ -95.792311, 36.149893 ], "pop" : 8018, "state" : "OK" } +{ "_id" : "74110", "city" : "TULSA", "loc" : [ -95.95249200000001, 36.180296 ], "pop" : 14224, "state" : "OK" } +{ "_id" : "74112", "city" : "TULSA", "loc" : [ -95.90703600000001, 36.147039 ], "pop" : 21754, "state" : "OK" } +{ "_id" : "74114", "city" : "TULSA", "loc" : [ -95.94079600000001, 36.126152 ], "pop" : 17190, "state" : "OK" } +{ "_id" : "74115", "city" : "TULSA", "loc" : [ -95.91118299999999, 36.175408 ], "pop" : 22100, "state" : "OK" } +{ "_id" : "74116", "city" : "TULSA", "loc" : [ -95.847695, 36.174994 ], "pop" : 2067, "state" : "OK" } +{ "_id" : "74117", "city" : "TULSA", "loc" : [ -95.910768, 36.27949 ], "pop" : 824, "state" : "OK" } +{ "_id" : "74119", "city" : "TULSA", "loc" : [ -95.990194, 36.140688 ], "pop" : 4059, "state" : "OK" } +{ "_id" : "74120", "city" : "TULSA", "loc" : [ -95.973373, 36.144228 ], "pop" : 5612, "state" : "OK" } +{ "_id" : "74126", "city" : "TULSA", "loc" : [ -95.99311299999999, 36.238288 ], "pop" : 13636, "state" : "OK" } +{ "_id" : "74127", "city" : "TULSA", "loc" : [ -96.03107, 36.157636 ], "pop" : 17336, "state" : "OK" } +{ "_id" : "74128", "city" : "TULSA", "loc" : [ -95.851377, 36.145927 ], "pop" : 12260, "state" : "OK" } +{ "_id" : "74129", "city" : "TULSA", "loc" : [ -95.865354, 36.125928 ], "pop" : 17278, "state" : "OK" } +{ "_id" : "74130", "city" : "TULSA", "loc" : [ -95.959649, 36.239481 ], "pop" : 2553, "state" : "OK" } +{ "_id" : "74131", "city" : "TULSA", "loc" : [ -96.06022900000001, 36.05566 ], "pop" : 4057, "state" : "OK" } +{ "_id" : "74132", "city" : "TULSA", "loc" : [ -96.025104, 36.063971 ], "pop" : 5290, "state" : "OK" } +{ "_id" : "74133", "city" : "TULSA", "loc" : [ -95.884062, 36.046717 ], "pop" : 30499, "state" : "OK" } +{ "_id" : "74134", "city" : "TULSA", "loc" : [ -95.822472, 36.116223 ], "pop" : 12607, "state" : "OK" } +{ "_id" : "74135", "city" : "TULSA", "loc" : [ -95.922805, 36.097603 ], "pop" : 21783, "state" : "OK" } +{ "_id" : "74136", "city" : "TULSA", "loc" : [ -95.945178, 36.060548 ], "pop" : 29192, "state" : "OK" } +{ "_id" : "74137", "city" : "TULSA", "loc" : [ -95.93059700000001, 36.028426 ], "pop" : 15434, "state" : "OK" } +{ "_id" : "74145", "city" : "TULSA", "loc" : [ -95.885576, 36.093433 ], "pop" : 17509, "state" : "OK" } +{ "_id" : "74146", "city" : "TULSA", "loc" : [ -95.85061, 36.109293 ], "pop" : 12965, "state" : "OK" } +{ "_id" : "74301", "city" : "VINITA", "loc" : [ -95.138164, 36.633353 ], "pop" : 8987, "state" : "OK" } +{ "_id" : "74330", "city" : "ADAIR", "loc" : [ -95.27319900000001, 36.411453 ], "pop" : 4938, "state" : "OK" } +{ "_id" : "74331", "city" : "BERNICE", "loc" : [ -94.90749099999999, 36.630072 ], "pop" : 5352, "state" : "OK" } +{ "_id" : "74332", "city" : "BIG CABIN", "loc" : [ -95.274736, 36.607931 ], "pop" : 2634, "state" : "OK" } +{ "_id" : "74333", "city" : "BLUEJACKET", "loc" : [ -95.101844, 36.797453 ], "pop" : 1005, "state" : "OK" } +{ "_id" : "74337", "city" : "CHOUTEAU", "loc" : [ -95.34157399999999, 36.166924 ], "pop" : 3763, "state" : "OK" } +{ "_id" : "74338", "city" : "COLCORD", "loc" : [ -94.654675, 36.233349 ], "pop" : 4202, "state" : "OK" } +{ "_id" : "74339", "city" : "COMMERCE", "loc" : [ -94.872983, 36.933063 ], "pop" : 2624, "state" : "OK" } +{ "_id" : "74342", "city" : "EUCHA", "loc" : [ -94.92300299999999, 36.398709 ], "pop" : 2935, "state" : "OK" } +{ "_id" : "74343", "city" : "FAIRLAND", "loc" : [ -94.827934, 36.74178 ], "pop" : 2003, "state" : "OK" } +{ "_id" : "74344", "city" : "GROVE", "loc" : [ -94.756536, 36.592869 ], "pop" : 8408, "state" : "OK" } +{ "_id" : "74346", "city" : "JAY", "loc" : [ -94.776309, 36.436343 ], "pop" : 5073, "state" : "OK" } +{ "_id" : "74347", "city" : "KANSAS", "loc" : [ -94.81141599999999, 36.216114 ], "pop" : 1594, "state" : "OK" } +{ "_id" : "74352", "city" : "LOCUST GROVE", "loc" : [ -95.168854, 36.181902 ], "pop" : 5856, "state" : "OK" } +{ "_id" : "74354", "city" : "MIAMI", "loc" : [ -94.87186, 36.876377 ], "pop" : 16679, "state" : "OK" } +{ "_id" : "74359", "city" : "OAKS", "loc" : [ -94.850206, 36.168663 ], "pop" : 327, "state" : "OK" } +{ "_id" : "74360", "city" : "PICHER", "loc" : [ -94.817301, 36.979961 ], "pop" : 3019, "state" : "OK" } +{ "_id" : "74361", "city" : "PRYOR", "loc" : [ -95.31294200000001, 36.292112 ], "pop" : 11669, "state" : "OK" } +{ "_id" : "74363", "city" : "QUAPAW", "loc" : [ -94.742983, 36.928248 ], "pop" : 2465, "state" : "OK" } +{ "_id" : "74364", "city" : "LEACH", "loc" : [ -94.993362, 36.211263 ], "pop" : 1222, "state" : "OK" } +{ "_id" : "74365", "city" : "SALINA", "loc" : [ -95.11577200000001, 36.311597 ], "pop" : 3432, "state" : "OK" } +{ "_id" : "74366", "city" : "SPAVINAW", "loc" : [ -95.028465, 36.415548 ], "pop" : 1252, "state" : "OK" } +{ "_id" : "74367", "city" : "STRANG", "loc" : [ -95.070768, 36.463861 ], "pop" : 2240, "state" : "OK" } +{ "_id" : "74368", "city" : "TWIN OAKS", "loc" : [ -94.854444, 36.191616 ], "pop" : 435, "state" : "OK" } +{ "_id" : "74369", "city" : "WELCH", "loc" : [ -95.12945499999999, 36.902022 ], "pop" : 1746, "state" : "OK" } +{ "_id" : "74370", "city" : "WYANDOTTE", "loc" : [ -94.700239, 36.779616 ], "pop" : 2500, "state" : "OK" } +{ "_id" : "74401", "city" : "MUSKOGEE", "loc" : [ -95.375491, 35.730661 ], "pop" : 21813, "state" : "OK" } +{ "_id" : "74403", "city" : "MUSKOGEE", "loc" : [ -95.34490700000001, 35.741057 ], "pop" : 24787, "state" : "OK" } +{ "_id" : "74421", "city" : "BEGGS", "loc" : [ -96.026398, 35.789595 ], "pop" : 4590, "state" : "OK" } +{ "_id" : "74422", "city" : "BOYNTON", "loc" : [ -95.66003600000001, 35.657652 ], "pop" : 762, "state" : "OK" } +{ "_id" : "74423", "city" : "BRAGGS", "loc" : [ -95.203326, 35.657395 ], "pop" : 671, "state" : "OK" } +{ "_id" : "74425", "city" : "CANADIAN", "loc" : [ -95.653042, 35.159258 ], "pop" : 1339, "state" : "OK" } +{ "_id" : "74426", "city" : "CHECOTAH", "loc" : [ -95.535038, 35.435786 ], "pop" : 9683, "state" : "OK" } +{ "_id" : "74427", "city" : "COOKSON", "loc" : [ -94.913205, 35.711622 ], "pop" : 1312, "state" : "OK" } +{ "_id" : "74428", "city" : "COUNCIL HILL", "loc" : [ -95.711326, 35.532175 ], "pop" : 992, "state" : "OK" } +{ "_id" : "74429", "city" : "COWETA", "loc" : [ -95.652597, 35.957835 ], "pop" : 9873, "state" : "OK" } +{ "_id" : "74432", "city" : "EUFAULA", "loc" : [ -95.647227, 35.29114 ], "pop" : 5069, "state" : "OK" } +{ "_id" : "74434", "city" : "FORT GIBSON", "loc" : [ -95.22973399999999, 35.794285 ], "pop" : 5233, "state" : "OK" } +{ "_id" : "74435", "city" : "GORE", "loc" : [ -95.10947400000001, 35.541772 ], "pop" : 1167, "state" : "OK" } +{ "_id" : "74436", "city" : "HASKELL", "loc" : [ -95.683981, 35.810752 ], "pop" : 3467, "state" : "OK" } +{ "_id" : "74437", "city" : "HOFFMAN", "loc" : [ -95.976187, 35.454476 ], "pop" : 10729, "state" : "OK" } +{ "_id" : "74440", "city" : "HOYT", "loc" : [ -95.29938199999999, 35.268466 ], "pop" : 65, "state" : "OK" } +{ "_id" : "74441", "city" : "HULBERT", "loc" : [ -95.16509499999999, 35.925415 ], "pop" : 4597, "state" : "OK" } +{ "_id" : "74442", "city" : "INDIANOLA", "loc" : [ -95.784479, 35.093724 ], "pop" : 2014, "state" : "OK" } +{ "_id" : "74445", "city" : "MORRIS", "loc" : [ -95.83186000000001, 35.661877 ], "pop" : 3028, "state" : "OK" } +{ "_id" : "74447", "city" : "OKMULGEE", "loc" : [ -95.96966999999999, 35.628805 ], "pop" : 18109, "state" : "OK" } +{ "_id" : "74450", "city" : "OKTAHA", "loc" : [ -95.485591, 35.625014 ], "pop" : 2624, "state" : "OK" } +{ "_id" : "74451", "city" : "PARK HILL", "loc" : [ -94.982173, 35.797686 ], "pop" : 4003, "state" : "OK" } +{ "_id" : "74452", "city" : "PEGGS", "loc" : [ -94.991928, 36.059061 ], "pop" : 3896, "state" : "OK" } +{ "_id" : "74454", "city" : "PORTER", "loc" : [ -95.50819300000001, 35.85674 ], "pop" : 2705, "state" : "OK" } +{ "_id" : "74455", "city" : "PORUM", "loc" : [ -95.260661, 35.363059 ], "pop" : 2976, "state" : "OK" } +{ "_id" : "74457", "city" : "PROCTOR", "loc" : [ -94.744159, 35.967111 ], "pop" : 443, "state" : "OK" } +{ "_id" : "74461", "city" : "STIDHAM", "loc" : [ -95.705575, 35.381389 ], "pop" : 286, "state" : "OK" } +{ "_id" : "74462", "city" : "STIGLER", "loc" : [ -95.10706999999999, 35.268561 ], "pop" : 4932, "state" : "OK" } +{ "_id" : "74463", "city" : "TAFT", "loc" : [ -95.54935999999999, 35.758059 ], "pop" : 1822, "state" : "OK" } +{ "_id" : "74464", "city" : "TAHLEQUAH", "loc" : [ -94.97873, 35.909385 ], "pop" : 17092, "state" : "OK" } +{ "_id" : "74467", "city" : "WAGONER", "loc" : [ -95.353956, 35.954864 ], "pop" : 13813, "state" : "OK" } +{ "_id" : "74469", "city" : "WARNER", "loc" : [ -95.306434, 35.494546 ], "pop" : 2501, "state" : "OK" } +{ "_id" : "74470", "city" : "WEBBERS FALLS", "loc" : [ -95.165881, 35.513787 ], "pop" : 1530, "state" : "OK" } +{ "_id" : "74471", "city" : "WELLING", "loc" : [ -94.865326, 35.881917 ], "pop" : 3149, "state" : "OK" } +{ "_id" : "74472", "city" : "WHITEFIELD", "loc" : [ -95.237493, 35.25114 ], "pop" : 283, "state" : "OK" } +{ "_id" : "74501", "city" : "MCALESTER", "loc" : [ -95.759168, 34.926233 ], "pop" : 23786, "state" : "OK" } +{ "_id" : "74523", "city" : "ANTLERS", "loc" : [ -95.625412, 34.234923 ], "pop" : 5432, "state" : "OK" } +{ "_id" : "74525", "city" : "ATOKA", "loc" : [ -96.14182700000001, 34.34451 ], "pop" : 7450, "state" : "OK" } +{ "_id" : "74528", "city" : "BLANCO", "loc" : [ -95.792069, 34.762151 ], "pop" : 289, "state" : "OK" } +{ "_id" : "74531", "city" : "CALVIN", "loc" : [ -96.270972, 34.877987 ], "pop" : 779, "state" : "OK" } +{ "_id" : "74533", "city" : "CANEY", "loc" : [ -96.258364, 34.222112 ], "pop" : 1443, "state" : "OK" } +{ "_id" : "74534", "city" : "CENTRAHOMA", "loc" : [ -96.33858499999999, 34.606642 ], "pop" : 435, "state" : "OK" } +{ "_id" : "74536", "city" : "CLAYTON", "loc" : [ -95.379981, 34.590591 ], "pop" : 1635, "state" : "OK" } +{ "_id" : "74538", "city" : "COALGATE", "loc" : [ -96.21672599999999, 34.534408 ], "pop" : 3908, "state" : "OK" } +{ "_id" : "74540", "city" : "DAISY", "loc" : [ -95.70877299999999, 34.538357 ], "pop" : 147, "state" : "OK" } +{ "_id" : "74542", "city" : "FARRIS", "loc" : [ -95.841368, 34.255833 ], "pop" : 1226, "state" : "OK" } +{ "_id" : "74543", "city" : "FINLEY", "loc" : [ -95.53851899999999, 34.340654 ], "pop" : 149, "state" : "OK" } +{ "_id" : "74547", "city" : "HARTSHORNE", "loc" : [ -95.573972, 34.84517 ], "pop" : 5133, "state" : "OK" } +{ "_id" : "74548", "city" : "HAYWOOD", "loc" : [ -95.96715399999999, 34.951102 ], "pop" : 2185, "state" : "OK" } +{ "_id" : "74549", "city" : "HONOBIA", "loc" : [ -94.991557, 34.592604 ], "pop" : 125, "state" : "OK" } +{ "_id" : "74552", "city" : "KINTA", "loc" : [ -95.317545, 35.197065 ], "pop" : 2676, "state" : "OK" } +{ "_id" : "74553", "city" : "KIOWA", "loc" : [ -95.93283599999999, 34.727755 ], "pop" : 1390, "state" : "OK" } +{ "_id" : "74555", "city" : "LANE", "loc" : [ -95.968515, 34.269122 ], "pop" : 1001, "state" : "OK" } +{ "_id" : "74557", "city" : "MOYERS", "loc" : [ -95.663881, 34.338648 ], "pop" : 280, "state" : "OK" } +{ "_id" : "74558", "city" : "NASHOBA", "loc" : [ -95.20746699999999, 34.507204 ], "pop" : 534, "state" : "OK" } +{ "_id" : "74560", "city" : "PITTSBURG", "loc" : [ -95.84390500000001, 34.69748 ], "pop" : 536, "state" : "OK" } +{ "_id" : "74561", "city" : "QUINTON", "loc" : [ -95.467085, 35.154666 ], "pop" : 3909, "state" : "OK" } +{ "_id" : "74562", "city" : "RATTAN", "loc" : [ -95.344235, 34.245417 ], "pop" : 1648, "state" : "OK" } +{ "_id" : "74563", "city" : "RED OAK", "loc" : [ -95.09043200000001, 34.942174 ], "pop" : 2167, "state" : "OK" } +{ "_id" : "74567", "city" : "SNOW", "loc" : [ -95.42783300000001, 34.377963 ], "pop" : 317, "state" : "OK" } +{ "_id" : "74569", "city" : "STRINGTOWN", "loc" : [ -96.00024500000001, 34.467597 ], "pop" : 755, "state" : "OK" } +{ "_id" : "74570", "city" : "STUART", "loc" : [ -96.138105, 34.882581 ], "pop" : 751, "state" : "OK" } +{ "_id" : "74571", "city" : "TALIHINA", "loc" : [ -94.99781299999999, 34.73812 ], "pop" : 2930, "state" : "OK" } +{ "_id" : "74572", "city" : "TUPELO", "loc" : [ -96.42736499999999, 34.559809 ], "pop" : 1388, "state" : "OK" } +{ "_id" : "74574", "city" : "TUSKAHOMA", "loc" : [ -95.220798, 34.734778 ], "pop" : 2491, "state" : "OK" } +{ "_id" : "74576", "city" : "WARDVILLE", "loc" : [ -96.02095799999999, 34.568791 ], "pop" : 756, "state" : "OK" } +{ "_id" : "74577", "city" : "WHITESBORO", "loc" : [ -94.86997700000001, 34.684311 ], "pop" : 219, "state" : "OK" } +{ "_id" : "74578", "city" : "WILBURTON", "loc" : [ -95.33889600000001, 34.912805 ], "pop" : 5866, "state" : "OK" } +{ "_id" : "74601", "city" : "PONCA CITY", "loc" : [ -97.07840899999999, 36.703104 ], "pop" : 24347, "state" : "OK" } +{ "_id" : "74604", "city" : "PONCA CITY", "loc" : [ -97.04544300000001, 36.729916 ], "pop" : 9327, "state" : "OK" } +{ "_id" : "74630", "city" : "BILLINGS", "loc" : [ -97.41888899999999, 36.524609 ], "pop" : 855, "state" : "OK" } +{ "_id" : "74631", "city" : "BLACKWELL", "loc" : [ -97.28669499999999, 36.800574 ], "pop" : 8480, "state" : "OK" } +{ "_id" : "74632", "city" : "BRAMAN", "loc" : [ -97.30823100000001, 36.933054 ], "pop" : 746, "state" : "OK" } +{ "_id" : "74633", "city" : "BURBANK", "loc" : [ -96.786873, 36.696583 ], "pop" : 641, "state" : "OK" } +{ "_id" : "74636", "city" : "DEER CREEK", "loc" : [ -97.513581, 36.80482 ], "pop" : 260, "state" : "OK" } +{ "_id" : "74637", "city" : "FAIRFAX", "loc" : [ -96.699691, 36.557687 ], "pop" : 2307, "state" : "OK" } +{ "_id" : "74640", "city" : "HUNTER", "loc" : [ -97.64250699999999, 36.560342 ], "pop" : 533, "state" : "OK" } +{ "_id" : "74641", "city" : "KAW CITY", "loc" : [ -96.89886199999999, 36.786663 ], "pop" : 876, "state" : "OK" } +{ "_id" : "74643", "city" : "LAMONT", "loc" : [ -97.56009299999999, 36.693884 ], "pop" : 650, "state" : "OK" } +{ "_id" : "74644", "city" : "MARLAND", "loc" : [ -97.09759200000001, 36.559067 ], "pop" : 639, "state" : "OK" } +{ "_id" : "74646", "city" : "NARDIN", "loc" : [ -97.432458, 36.815517 ], "pop" : 262, "state" : "OK" } +{ "_id" : "74647", "city" : "PECKHAM", "loc" : [ -97.05132999999999, 36.887425 ], "pop" : 3274, "state" : "OK" } +{ "_id" : "74650", "city" : "RALSTON", "loc" : [ -96.775481, 36.499228 ], "pop" : 756, "state" : "OK" } +{ "_id" : "74651", "city" : "RED ROCK", "loc" : [ -97.16402100000001, 36.474754 ], "pop" : 775, "state" : "OK" } +{ "_id" : "74652", "city" : "FORAKER", "loc" : [ -96.67496199999999, 36.814915 ], "pop" : 1143, "state" : "OK" } +{ "_id" : "74653", "city" : "TONKAWA", "loc" : [ -97.30634000000001, 36.68062 ], "pop" : 4002, "state" : "OK" } +{ "_id" : "74701", "city" : "DURANT", "loc" : [ -96.384705, 34.00609 ], "pop" : 17179, "state" : "OK" } +{ "_id" : "74723", "city" : "BENNINGTON", "loc" : [ -96.01877399999999, 33.977085 ], "pop" : 1411, "state" : "OK" } +{ "_id" : "74724", "city" : "BETHEL", "loc" : [ -94.87812599999999, 34.358443 ], "pop" : 1468, "state" : "OK" } +{ "_id" : "74726", "city" : "BOKCHITO", "loc" : [ -96.162097, 33.985913 ], "pop" : 1812, "state" : "OK" } +{ "_id" : "74727", "city" : "BOSWELL", "loc" : [ -95.84031299999999, 34.024475 ], "pop" : 2162, "state" : "OK" } +{ "_id" : "74728", "city" : "BROKEN BOW", "loc" : [ -94.76229600000001, 34.026991 ], "pop" : 10436, "state" : "OK" } +{ "_id" : "74729", "city" : "CADDO", "loc" : [ -96.260017, 34.115688 ], "pop" : 1474, "state" : "OK" } +{ "_id" : "74730", "city" : "CALERA", "loc" : [ -96.410205, 33.928872 ], "pop" : 2448, "state" : "OK" } +{ "_id" : "74731", "city" : "CARTWRIGHT", "loc" : [ -96.55190899999999, 33.884552 ], "pop" : 1796, "state" : "OK" } +{ "_id" : "74733", "city" : "COLBERT", "loc" : [ -96.495345, 33.857516 ], "pop" : 2267, "state" : "OK" } +{ "_id" : "74734", "city" : "EAGLETOWN", "loc" : [ -94.559557, 34.036358 ], "pop" : 1237, "state" : "OK" } +{ "_id" : "74735", "city" : "FORT TOWSON", "loc" : [ -95.253015, 34.051968 ], "pop" : 2249, "state" : "OK" } +{ "_id" : "74736", "city" : "GARVIN", "loc" : [ -94.93230800000001, 33.920512 ], "pop" : 804, "state" : "OK" } +{ "_id" : "74738", "city" : "GRANT", "loc" : [ -95.489324, 33.930239 ], "pop" : 740, "state" : "OK" } +{ "_id" : "74740", "city" : "TOM", "loc" : [ -94.58177499999999, 33.787507 ], "pop" : 1861, "state" : "OK" } +{ "_id" : "74741", "city" : "HENDRIX", "loc" : [ -96.35813400000001, 33.801582 ], "pop" : 1812, "state" : "OK" } +{ "_id" : "74743", "city" : "HUGO", "loc" : [ -95.513876, 34.011339 ], "pop" : 8804, "state" : "OK" } +{ "_id" : "74745", "city" : "IDABEL", "loc" : [ -94.802012, 33.88512 ], "pop" : 10294, "state" : "OK" } +{ "_id" : "74748", "city" : "KENEFIC", "loc" : [ -96.38866299999999, 34.131377 ], "pop" : 370, "state" : "OK" } +{ "_id" : "74754", "city" : "RINGOLD", "loc" : [ -95.070387, 34.179892 ], "pop" : 97, "state" : "OK" } +{ "_id" : "74755", "city" : "RUFE", "loc" : [ -95.136011, 34.161684 ], "pop" : 244, "state" : "OK" } +{ "_id" : "74756", "city" : "SAWYER", "loc" : [ -95.355833, 34.027726 ], "pop" : 421, "state" : "OK" } +{ "_id" : "74759", "city" : "SOPER", "loc" : [ -95.69156599999999, 34.03659 ], "pop" : 935, "state" : "OK" } +{ "_id" : "74760", "city" : "SPENCERVILLE", "loc" : [ -95.38346799999999, 34.13263 ], "pop" : 246, "state" : "OK" } +{ "_id" : "74764", "city" : "VALLIANT", "loc" : [ -95.068625, 34.009056 ], "pop" : 3875, "state" : "OK" } +{ "_id" : "74766", "city" : "WRIGHT CITY", "loc" : [ -94.99288900000001, 34.079922 ], "pop" : 1879, "state" : "OK" } +{ "_id" : "74801", "city" : "SHAWNEE", "loc" : [ -96.931321, 35.34907 ], "pop" : 40076, "state" : "OK" } +{ "_id" : "74820", "city" : "ADA", "loc" : [ -96.69235999999999, 34.780044 ], "pop" : 24967, "state" : "OK" } +{ "_id" : "74824", "city" : "AGRA", "loc" : [ -96.87794, 35.882548 ], "pop" : 1327, "state" : "OK" } +{ "_id" : "74825", "city" : "ALLEN", "loc" : [ -96.55846200000001, 34.850176 ], "pop" : 4803, "state" : "OK" } +{ "_id" : "74826", "city" : "ASHER", "loc" : [ -96.87632600000001, 34.984862 ], "pop" : 970, "state" : "OK" } +{ "_id" : "74827", "city" : "ATWOOD", "loc" : [ -96.357703, 34.919194 ], "pop" : 723, "state" : "OK" } +{ "_id" : "74829", "city" : "BOLEY", "loc" : [ -96.470386, 35.491328 ], "pop" : 1437, "state" : "OK" } +{ "_id" : "74831", "city" : "BYARS", "loc" : [ -97.099723, 34.890397 ], "pop" : 1133, "state" : "OK" } +{ "_id" : "74832", "city" : "CARNEY", "loc" : [ -97.015942, 35.805381 ], "pop" : 663, "state" : "OK" } +{ "_id" : "74833", "city" : "CASTLE", "loc" : [ -96.379133, 35.473235 ], "pop" : 168, "state" : "OK" } +{ "_id" : "74834", "city" : "CHANDLER", "loc" : [ -96.858266, 35.704253 ], "pop" : 6506, "state" : "OK" } +{ "_id" : "74835", "city" : "CLEARVIEW", "loc" : [ -96.171404, 35.392585 ], "pop" : 227, "state" : "OK" } +{ "_id" : "74839", "city" : "DUSTIN", "loc" : [ -96.057271, 35.251937 ], "pop" : 893, "state" : "OK" } +{ "_id" : "74840", "city" : "EARLSBORO", "loc" : [ -96.80409299999999, 35.262792 ], "pop" : 572, "state" : "OK" } +{ "_id" : "74842", "city" : "FITTSTOWN", "loc" : [ -96.649458, 34.630134 ], "pop" : 759, "state" : "OK" } +{ "_id" : "74843", "city" : "FITZHUGH", "loc" : [ -96.77448699999999, 34.661545 ], "pop" : 201, "state" : "OK" } +{ "_id" : "74845", "city" : "VERNON", "loc" : [ -95.89579500000001, 35.208526 ], "pop" : 638, "state" : "OK" } +{ "_id" : "74848", "city" : "HOLDENVILLE", "loc" : [ -96.37696800000001, 35.083935 ], "pop" : 7471, "state" : "OK" } +{ "_id" : "74849", "city" : "KONAWA", "loc" : [ -96.734279, 34.970824 ], "pop" : 2800, "state" : "OK" } +{ "_id" : "74850", "city" : "LAMAR", "loc" : [ -96.114226, 35.083557 ], "pop" : 225, "state" : "OK" } +{ "_id" : "74851", "city" : "MC LOUD", "loc" : [ -97.105178, 35.41907 ], "pop" : 3334, "state" : "OK" } +{ "_id" : "74852", "city" : "MACOMB", "loc" : [ -97.033964, 35.12052 ], "pop" : 1005, "state" : "OK" } +{ "_id" : "74854", "city" : "MAUD", "loc" : [ -96.762686, 35.129224 ], "pop" : 4144, "state" : "OK" } +{ "_id" : "74855", "city" : "MEEKER", "loc" : [ -96.998052, 35.521111 ], "pop" : 6180, "state" : "OK" } +{ "_id" : "74856", "city" : "MILL CREEK", "loc" : [ -96.788419, 34.309754 ], "pop" : 1510, "state" : "OK" } +{ "_id" : "74857", "city" : "NEWALLA", "loc" : [ -97.197123, 35.373415 ], "pop" : 7768, "state" : "OK" } +{ "_id" : "74859", "city" : "BEARDEN", "loc" : [ -96.306788, 35.447516 ], "pop" : 5792, "state" : "OK" } +{ "_id" : "74860", "city" : "PADEN", "loc" : [ -96.571921, 35.518171 ], "pop" : 1508, "state" : "OK" } +{ "_id" : "74864", "city" : "PRAGUE", "loc" : [ -96.700879, 35.510482 ], "pop" : 4504, "state" : "OK" } +{ "_id" : "74865", "city" : "ROFF", "loc" : [ -96.842313, 34.615294 ], "pop" : 1316, "state" : "OK" } +{ "_id" : "74867", "city" : "SASAKWA", "loc" : [ -96.538706, 34.950982 ], "pop" : 854, "state" : "OK" } +{ "_id" : "74868", "city" : "SEMINOLE", "loc" : [ -96.668307, 35.252095 ], "pop" : 11673, "state" : "OK" } +{ "_id" : "74869", "city" : "SPARKS", "loc" : [ -96.81626900000001, 35.61378 ], "pop" : 330, "state" : "OK" } +{ "_id" : "74871", "city" : "HARDEN CITY", "loc" : [ -96.54289, 34.666194 ], "pop" : 2317, "state" : "OK" } +{ "_id" : "74872", "city" : "STRATFORD", "loc" : [ -96.976277, 34.771412 ], "pop" : 2773, "state" : "OK" } +{ "_id" : "74873", "city" : "TECUMSEH", "loc" : [ -96.966713, 35.25023 ], "pop" : 9203, "state" : "OK" } +{ "_id" : "74875", "city" : "TRYON", "loc" : [ -96.9984, 35.863151 ], "pop" : 1356, "state" : "OK" } +{ "_id" : "74878", "city" : "WANETTE", "loc" : [ -97.0419, 34.998313 ], "pop" : 1288, "state" : "OK" } +{ "_id" : "74880", "city" : "WELEETKA", "loc" : [ -96.113609, 35.341582 ], "pop" : 2133, "state" : "OK" } +{ "_id" : "74881", "city" : "WELLSTON", "loc" : [ -97.059685, 35.675738 ], "pop" : 3452, "state" : "OK" } +{ "_id" : "74882", "city" : "WELTY", "loc" : [ -96.42762, 35.610727 ], "pop" : 286, "state" : "OK" } +{ "_id" : "74883", "city" : "WETUMKA", "loc" : [ -96.242082, 35.239552 ], "pop" : 2181, "state" : "OK" } +{ "_id" : "74884", "city" : "NEW LIMA", "loc" : [ -96.503793, 35.182893 ], "pop" : 8015, "state" : "OK" } +{ "_id" : "74901", "city" : "ARKOMA", "loc" : [ -94.44031099999999, 35.343352 ], "pop" : 2764, "state" : "OK" } +{ "_id" : "74902", "city" : "POCOLA", "loc" : [ -94.476029, 35.243603 ], "pop" : 3575, "state" : "OK" } +{ "_id" : "74930", "city" : "BOKOSHE", "loc" : [ -94.72215799999999, 35.160925 ], "pop" : 3931, "state" : "OK" } +{ "_id" : "74931", "city" : "BUNCH", "loc" : [ -94.734154, 35.735691 ], "pop" : 1656, "state" : "OK" } +{ "_id" : "74932", "city" : "CAMERON", "loc" : [ -94.506015, 35.149355 ], "pop" : 935, "state" : "OK" } +{ "_id" : "74937", "city" : "HEAVENER", "loc" : [ -94.61848999999999, 34.835267 ], "pop" : 5628, "state" : "OK" } +{ "_id" : "74939", "city" : "HODGEN", "loc" : [ -94.63908000000001, 34.753757 ], "pop" : 756, "state" : "OK" } +{ "_id" : "74940", "city" : "HOWE", "loc" : [ -94.657072, 34.929936 ], "pop" : 1352, "state" : "OK" } +{ "_id" : "74941", "city" : "KEOTA", "loc" : [ -94.902822, 35.264541 ], "pop" : 1878, "state" : "OK" } +{ "_id" : "74944", "city" : "MCCURTAIN", "loc" : [ -95.012737, 35.140403 ], "pop" : 1106, "state" : "OK" } +{ "_id" : "74948", "city" : "MULDROW", "loc" : [ -94.633216, 35.401985 ], "pop" : 8185, "state" : "OK" } +{ "_id" : "74949", "city" : "MUSE", "loc" : [ -94.719007, 34.664124 ], "pop" : 183, "state" : "OK" } +{ "_id" : "74953", "city" : "POTEAU", "loc" : [ -94.60960300000001, 35.060561 ], "pop" : 9466, "state" : "OK" } +{ "_id" : "74954", "city" : "ROLAND", "loc" : [ -94.52908499999999, 35.453811 ], "pop" : 7047, "state" : "OK" } +{ "_id" : "74955", "city" : "SALLISAW", "loc" : [ -94.778998, 35.485191 ], "pop" : 11399, "state" : "OK" } +{ "_id" : "74956", "city" : "SHADY POINT", "loc" : [ -94.666534, 35.129333 ], "pop" : 937, "state" : "OK" } +{ "_id" : "74957", "city" : "OCTAVIA", "loc" : [ -94.619117, 34.479056 ], "pop" : 442, "state" : "OK" } +{ "_id" : "74959", "city" : "SPIRO", "loc" : [ -94.626546, 35.249219 ], "pop" : 7368, "state" : "OK" } +{ "_id" : "74960", "city" : "STILWELL", "loc" : [ -94.631322, 35.810703 ], "pop" : 10267, "state" : "OK" } +{ "_id" : "74962", "city" : "VIAN", "loc" : [ -94.988756, 35.540383 ], "pop" : 6030, "state" : "OK" } +{ "_id" : "74963", "city" : "WATSON", "loc" : [ -94.556217, 34.419252 ], "pop" : 797, "state" : "OK" } +{ "_id" : "74964", "city" : "WATTS", "loc" : [ -94.634472, 36.115216 ], "pop" : 2156, "state" : "OK" } +{ "_id" : "74965", "city" : "WESTVILLE", "loc" : [ -94.59262699999999, 35.991226 ], "pop" : 3899, "state" : "OK" } +{ "_id" : "74966", "city" : "WISTER", "loc" : [ -94.783205, 34.955593 ], "pop" : 3656, "state" : "OK" } +{ "_id" : "75002", "city" : "ALLEN", "loc" : [ -96.645433, 33.093383 ], "pop" : 24151, "state" : "TX" } +{ "_id" : "75006", "city" : "CARROLLTON", "loc" : [ -96.882464, 32.965736 ], "pop" : 37699, "state" : "TX" } +{ "_id" : "75007", "city" : "CARROLLTON", "loc" : [ -96.88198800000001, 33.003294 ], "pop" : 54796, "state" : "TX" } +{ "_id" : "75008", "city" : "CARROLLTON", "loc" : [ -96.923197, 33.03524 ], "pop" : 1482, "state" : "TX" } +{ "_id" : "75009", "city" : "CELINA", "loc" : [ -96.767325, 33.310316 ], "pop" : 3373, "state" : "TX" } +{ "_id" : "75010", "city" : "CARROLLTON", "loc" : [ -96.877746, 33.030414 ], "pop" : 4379, "state" : "TX" } +{ "_id" : "75019", "city" : "COPPELL", "loc" : [ -96.98051599999999, 32.96727 ], "pop" : 16862, "state" : "TX" } +{ "_id" : "75020", "city" : "DENISON", "loc" : [ -96.54957400000001, 33.745009 ], "pop" : 27172, "state" : "TX" } +{ "_id" : "75023", "city" : "PLANO", "loc" : [ -96.73645399999999, 33.054972 ], "pop" : 40832, "state" : "TX" } +{ "_id" : "75024", "city" : "PLANO", "loc" : [ -96.784307, 33.075211 ], "pop" : 1439, "state" : "TX" } +{ "_id" : "75025", "city" : "PLANO", "loc" : [ -96.729142, 33.078377 ], "pop" : 8562, "state" : "TX" } +{ "_id" : "75028", "city" : "FLOWER MOUND", "loc" : [ -97.074501, 33.038268 ], "pop" : 16825, "state" : "TX" } +{ "_id" : "75034", "city" : "FRISCO", "loc" : [ -96.824105, 33.149901 ], "pop" : 8045, "state" : "TX" } +{ "_id" : "75038", "city" : "IRVING", "loc" : [ -96.990503, 32.865309 ], "pop" : 20152, "state" : "TX" } +{ "_id" : "75039", "city" : "IRVING", "loc" : [ -96.93887599999999, 32.869669 ], "pop" : 598, "state" : "TX" } +{ "_id" : "75040", "city" : "GARLAND", "loc" : [ -96.624804, 32.922744 ], "pop" : 45359, "state" : "TX" } +{ "_id" : "75041", "city" : "GARLAND", "loc" : [ -96.641115, 32.87937 ], "pop" : 26212, "state" : "TX" } +{ "_id" : "75042", "city" : "GARLAND", "loc" : [ -96.67754499999999, 32.918486 ], "pop" : 31807, "state" : "TX" } +{ "_id" : "75043", "city" : "GARLAND", "loc" : [ -96.59988199999999, 32.856502 ], "pop" : 46620, "state" : "TX" } +{ "_id" : "75044", "city" : "GARLAND", "loc" : [ -96.66538300000001, 32.952228 ], "pop" : 30455, "state" : "TX" } +{ "_id" : "75048", "city" : "SACHSE", "loc" : [ -96.591472, 32.973576 ], "pop" : 5632, "state" : "TX" } +{ "_id" : "75050", "city" : "GRAND PRAIRIE", "loc" : [ -97.01121000000001, 32.76488 ], "pop" : 32148, "state" : "TX" } +{ "_id" : "75051", "city" : "GRAND PRAIRIE", "loc" : [ -97.006916, 32.711471 ], "pop" : 52779, "state" : "TX" } +{ "_id" : "75052", "city" : "GRAND PRAIRIE", "loc" : [ -97.031142, 32.660475 ], "pop" : 15850, "state" : "TX" } +{ "_id" : "75056", "city" : "THE COLONY", "loc" : [ -96.883574, 33.094023 ], "pop" : 22549, "state" : "TX" } +{ "_id" : "75057", "city" : "LEWISVILLE", "loc" : [ -96.999882, 33.053162 ], "pop" : 8052, "state" : "TX" } +{ "_id" : "75058", "city" : "GUNTER", "loc" : [ -96.734103, 33.449513 ], "pop" : 1410, "state" : "TX" } +{ "_id" : "75060", "city" : "IRVING", "loc" : [ -96.959665, 32.80231 ], "pop" : 41001, "state" : "TX" } +{ "_id" : "75061", "city" : "IRVING", "loc" : [ -96.963256, 32.826658 ], "pop" : 42947, "state" : "TX" } +{ "_id" : "75062", "city" : "IRVING", "loc" : [ -96.97402700000001, 32.847854 ], "pop" : 40234, "state" : "TX" } +{ "_id" : "75063", "city" : "IRVING", "loc" : [ -96.959817, 32.924686 ], "pop" : 9527, "state" : "TX" } +{ "_id" : "75065", "city" : "LAKE DALLAS", "loc" : [ -97.023709, 33.121903 ], "pop" : 5452, "state" : "TX" } +{ "_id" : "75067", "city" : "HIGHLAND VILLAGE", "loc" : [ -97.026815, 33.04503 ], "pop" : 46151, "state" : "TX" } +{ "_id" : "75068", "city" : "LAKEWOOD VILLAGE", "loc" : [ -96.967811, 33.178319 ], "pop" : 3952, "state" : "TX" } +{ "_id" : "75069", "city" : "MC KINNEY", "loc" : [ -96.60848799999999, 33.196558 ], "pop" : 20865, "state" : "TX" } +{ "_id" : "75070", "city" : "MC KINNEY", "loc" : [ -96.66422300000001, 33.195148 ], "pop" : 5573, "state" : "TX" } +{ "_id" : "75074", "city" : "PLANO", "loc" : [ -96.67771, 33.027722 ], "pop" : 29591, "state" : "TX" } +{ "_id" : "75075", "city" : "PLANO", "loc" : [ -96.739743, 33.024985 ], "pop" : 33236, "state" : "TX" } +{ "_id" : "75076", "city" : "POTTSBORO", "loc" : [ -96.690562, 33.809526 ], "pop" : 5458, "state" : "TX" } +{ "_id" : "75078", "city" : "PROSPER", "loc" : [ -96.795401, 33.236169 ], "pop" : 1103, "state" : "TX" } +{ "_id" : "75080", "city" : "RICHARDSON", "loc" : [ -96.745249, 32.965986 ], "pop" : 37227, "state" : "TX" } +{ "_id" : "75081", "city" : "RICHARDSON", "loc" : [ -96.70584100000001, 32.946217 ], "pop" : 30573, "state" : "TX" } +{ "_id" : "75082", "city" : "RICHARDSON", "loc" : [ -96.685957, 32.986461 ], "pop" : 6678, "state" : "TX" } +{ "_id" : "75087", "city" : "HEATH", "loc" : [ -96.454497, 32.90456 ], "pop" : 17438, "state" : "TX" } +{ "_id" : "75088", "city" : "ROWLETT", "loc" : [ -96.547161, 32.90315 ], "pop" : 22057, "state" : "TX" } +{ "_id" : "75090", "city" : "SHERMAN", "loc" : [ -96.60752100000001, 33.643525 ], "pop" : 35260, "state" : "TX" } +{ "_id" : "75093", "city" : "PLANO", "loc" : [ -96.788903, 33.029866 ], "pop" : 14376, "state" : "TX" } +{ "_id" : "75094", "city" : "MURPHY", "loc" : [ -96.609101, 33.004873 ], "pop" : 1722, "state" : "TX" } +{ "_id" : "75098", "city" : "WYLIE", "loc" : [ -96.539383, 33.004102 ], "pop" : 15418, "state" : "TX" } +{ "_id" : "75102", "city" : "BARRY", "loc" : [ -96.625141, 32.101356 ], "pop" : 588, "state" : "TX" } +{ "_id" : "75103", "city" : "CANTON", "loc" : [ -95.904657, 32.514301 ], "pop" : 12281, "state" : "TX" } +{ "_id" : "75104", "city" : "CEDAR HILL", "loc" : [ -96.94380200000001, 32.58847 ], "pop" : 19503, "state" : "TX" } +{ "_id" : "75105", "city" : "CHATFIELD", "loc" : [ -96.388668, 32.295416 ], "pop" : 129, "state" : "TX" } +{ "_id" : "75110", "city" : "CORSICANA", "loc" : [ -96.476151, 32.086776 ], "pop" : 28003, "state" : "TX" } +{ "_id" : "75114", "city" : "CRANDALL", "loc" : [ -96.46369, 32.597465 ], "pop" : 3720, "state" : "TX" } +{ "_id" : "75115", "city" : "DE SOTO", "loc" : [ -96.854721, 32.593167 ], "pop" : 33750, "state" : "TX" } +{ "_id" : "75116", "city" : "DUNCANVILLE", "loc" : [ -96.91139200000001, 32.65873 ], "pop" : 18023, "state" : "TX" } +{ "_id" : "75117", "city" : "EDGEWOOD", "loc" : [ -95.878011, 32.700326 ], "pop" : 3328, "state" : "TX" } +{ "_id" : "75119", "city" : "ENNIS", "loc" : [ -96.62236300000001, 32.332102 ], "pop" : 19008, "state" : "TX" } +{ "_id" : "75124", "city" : "EUSTACE", "loc" : [ -96.013693, 32.296485 ], "pop" : 2192, "state" : "TX" } +{ "_id" : "75125", "city" : "FERRIS", "loc" : [ -96.664321, 32.52232 ], "pop" : 7592, "state" : "TX" } +{ "_id" : "75126", "city" : "FORNEY", "loc" : [ -96.45975900000001, 32.749055 ], "pop" : 6803, "state" : "TX" } +{ "_id" : "75127", "city" : "FRUITVALE", "loc" : [ -95.789903, 32.676981 ], "pop" : 1622, "state" : "TX" } +{ "_id" : "75134", "city" : "LANCASTER", "loc" : [ -96.78299699999999, 32.616056 ], "pop" : 11306, "state" : "TX" } +{ "_id" : "75135", "city" : "CADDO MILLS", "loc" : [ -96.239093, 33.068267 ], "pop" : 3148, "state" : "TX" } +{ "_id" : "75137", "city" : "DUNCANVILLE", "loc" : [ -96.91132500000001, 32.634665 ], "pop" : 16979, "state" : "TX" } +{ "_id" : "75140", "city" : "GRAND SALINE", "loc" : [ -95.706411, 32.663528 ], "pop" : 4870, "state" : "TX" } +{ "_id" : "75141", "city" : "HUTCHINS", "loc" : [ -96.707021, 32.639586 ], "pop" : 2716, "state" : "TX" } +{ "_id" : "75142", "city" : "KAUFMAN", "loc" : [ -96.285239, 32.54599 ], "pop" : 9160, "state" : "TX" } +{ "_id" : "75143", "city" : "SEVEN POINTS", "loc" : [ -96.257768, 32.369146 ], "pop" : 5268, "state" : "TX" } +{ "_id" : "75144", "city" : "KERENS", "loc" : [ -96.229828, 32.127463 ], "pop" : 2991, "state" : "TX" } +{ "_id" : "75146", "city" : "LANCASTER", "loc" : [ -96.77280500000001, 32.591395 ], "pop" : 11762, "state" : "TX" } +{ "_id" : "75147", "city" : "GUN BARREL CITY", "loc" : [ -96.129524, 32.307513 ], "pop" : 18113, "state" : "TX" } +{ "_id" : "75148", "city" : "MALAKOFF", "loc" : [ -96.00595199999999, 32.170511 ], "pop" : 4972, "state" : "TX" } +{ "_id" : "75149", "city" : "MESQUITE", "loc" : [ -96.60821900000001, 32.767821 ], "pop" : 45754, "state" : "TX" } +{ "_id" : "75150", "city" : "MESQUITE", "loc" : [ -96.630681, 32.815416 ], "pop" : 51494, "state" : "TX" } +{ "_id" : "75152", "city" : "PALMER", "loc" : [ -96.679429, 32.438714 ], "pop" : 2605, "state" : "TX" } +{ "_id" : "75153", "city" : "POWELL", "loc" : [ -96.332713, 32.119557 ], "pop" : 127, "state" : "TX" } +{ "_id" : "75154", "city" : "OVILLA", "loc" : [ -96.82033699999999, 32.516096 ], "pop" : 16882, "state" : "TX" } +{ "_id" : "75155", "city" : "RICE", "loc" : [ -96.460613, 32.225788 ], "pop" : 1812, "state" : "TX" } +{ "_id" : "75158", "city" : "SCURRY", "loc" : [ -96.39245099999999, 32.48184 ], "pop" : 2589, "state" : "TX" } +{ "_id" : "75159", "city" : "SEAGOVILLE", "loc" : [ -96.557967, 32.652522 ], "pop" : 10569, "state" : "TX" } +{ "_id" : "75160", "city" : "TERRELL", "loc" : [ -96.25134199999999, 32.714292 ], "pop" : 24116, "state" : "TX" } +{ "_id" : "75163", "city" : "TRINIDAD", "loc" : [ -96.08307000000001, 32.138341 ], "pop" : 1246, "state" : "TX" } +{ "_id" : "75165", "city" : "WAXAHACHIE", "loc" : [ -96.83739799999999, 32.380796 ], "pop" : 22844, "state" : "TX" } +{ "_id" : "75169", "city" : "WILLS POINT", "loc" : [ -96.00788, 32.72834 ], "pop" : 7310, "state" : "TX" } +{ "_id" : "75172", "city" : "WILMER", "loc" : [ -96.68376000000001, 32.598133 ], "pop" : 2407, "state" : "TX" } +{ "_id" : "75173", "city" : "NEVADA", "loc" : [ -96.387657, 33.05934 ], "pop" : 3149, "state" : "TX" } +{ "_id" : "75180", "city" : "BALCH SPRINGS", "loc" : [ -96.615278, 32.720216 ], "pop" : 18848, "state" : "TX" } +{ "_id" : "75181", "city" : "MESQUITE", "loc" : [ -96.566889, 32.727166 ], "pop" : 5005, "state" : "TX" } +{ "_id" : "75182", "city" : "MESQUITE", "loc" : [ -96.567004, 32.801922 ], "pop" : 1959, "state" : "TX" } +{ "_id" : "75189", "city" : "ROYSE CITY", "loc" : [ -96.36484, 32.962778 ], "pop" : 5533, "state" : "TX" } +{ "_id" : "75201", "city" : "DALLAS", "loc" : [ -96.80439, 32.790439 ], "pop" : 1505, "state" : "TX" } +{ "_id" : "75202", "city" : "DALLAS", "loc" : [ -96.805352, 32.778056 ], "pop" : 3622, "state" : "TX" } +{ "_id" : "75203", "city" : "DALLAS", "loc" : [ -96.80697600000001, 32.745985 ], "pop" : 18850, "state" : "TX" } +{ "_id" : "75204", "city" : "DALLAS", "loc" : [ -96.785144, 32.803814 ], "pop" : 16697, "state" : "TX" } +{ "_id" : "75205", "city" : "VILLAGE", "loc" : [ -96.793828, 32.836878 ], "pop" : 23883, "state" : "TX" } +{ "_id" : "75206", "city" : "DALLAS", "loc" : [ -96.76921900000001, 32.831029 ], "pop" : 36526, "state" : "TX" } +{ "_id" : "75207", "city" : "DALLAS", "loc" : [ -96.83187100000001, 32.793897 ], "pop" : 1744, "state" : "TX" } +{ "_id" : "75208", "city" : "DALLAS", "loc" : [ -96.838898, 32.749208 ], "pop" : 33527, "state" : "TX" } +{ "_id" : "75209", "city" : "DALLAS", "loc" : [ -96.82598400000001, 32.84564 ], "pop" : 15398, "state" : "TX" } +{ "_id" : "75210", "city" : "DALLAS", "loc" : [ -96.742974, 32.769919 ], "pop" : 10216, "state" : "TX" } +{ "_id" : "75211", "city" : "COCKRELL HILL", "loc" : [ -96.88179700000001, 32.736928 ], "pop" : 54691, "state" : "TX" } +{ "_id" : "75212", "city" : "DALLAS", "loc" : [ -96.871396, 32.782884 ], "pop" : 23556, "state" : "TX" } +{ "_id" : "75214", "city" : "DALLAS", "loc" : [ -96.749774, 32.824789 ], "pop" : 32618, "state" : "TX" } +{ "_id" : "75215", "city" : "DALLAS", "loc" : [ -96.76226, 32.758206 ], "pop" : 22120, "state" : "TX" } +{ "_id" : "75216", "city" : "DALLAS", "loc" : [ -96.79548800000001, 32.708611 ], "pop" : 55166, "state" : "TX" } +{ "_id" : "75217", "city" : "DALLAS", "loc" : [ -96.675481, 32.724429 ], "pop" : 57605, "state" : "TX" } +{ "_id" : "75218", "city" : "DALLAS", "loc" : [ -96.69721199999999, 32.846335 ], "pop" : 22646, "state" : "TX" } +{ "_id" : "75219", "city" : "DALLAS", "loc" : [ -96.814166, 32.813245 ], "pop" : 19178, "state" : "TX" } +{ "_id" : "75220", "city" : "DALLAS", "loc" : [ -96.862202, 32.868131 ], "pop" : 30241, "state" : "TX" } +{ "_id" : "75223", "city" : "DALLAS", "loc" : [ -96.74747499999999, 32.794173 ], "pop" : 14700, "state" : "TX" } +{ "_id" : "75224", "city" : "DALLAS", "loc" : [ -96.838711, 32.711415 ], "pop" : 26734, "state" : "TX" } +{ "_id" : "75225", "city" : "DALLAS", "loc" : [ -96.791753, 32.862808 ], "pop" : 18255, "state" : "TX" } +{ "_id" : "75226", "city" : "DALLAS", "loc" : [ -96.76755199999999, 32.78871 ], "pop" : 1561, "state" : "TX" } +{ "_id" : "75227", "city" : "DALLAS", "loc" : [ -96.68358600000001, 32.767226 ], "pop" : 39631, "state" : "TX" } +{ "_id" : "75228", "city" : "DALLAS", "loc" : [ -96.678378, 32.824997 ], "pop" : 55010, "state" : "TX" } +{ "_id" : "75229", "city" : "DALLAS", "loc" : [ -96.8588, 32.8958 ], "pop" : 27621, "state" : "TX" } +{ "_id" : "75230", "city" : "DALLAS", "loc" : [ -96.78967900000001, 32.89994 ], "pop" : 24281, "state" : "TX" } +{ "_id" : "75231", "city" : "DALLAS", "loc" : [ -96.74952999999999, 32.875621 ], "pop" : 35407, "state" : "TX" } +{ "_id" : "75232", "city" : "DALLAS", "loc" : [ -96.838392, 32.664708 ], "pop" : 28289, "state" : "TX" } +{ "_id" : "75233", "city" : "DALLAS", "loc" : [ -96.872547, 32.704638 ], "pop" : 11206, "state" : "TX" } +{ "_id" : "75234", "city" : "FARMERS BRANCH", "loc" : [ -96.876848, 32.929803 ], "pop" : 25992, "state" : "TX" } +{ "_id" : "75235", "city" : "DALLAS", "loc" : [ -96.838843, 32.825213 ], "pop" : 14850, "state" : "TX" } +{ "_id" : "75236", "city" : "DALLAS", "loc" : [ -96.917737, 32.690002 ], "pop" : 6124, "state" : "TX" } +{ "_id" : "75237", "city" : "DALLAS", "loc" : [ -96.876453, 32.658972 ], "pop" : 12859, "state" : "TX" } +{ "_id" : "75238", "city" : "DALLAS", "loc" : [ -96.707982, 32.876976 ], "pop" : 25855, "state" : "TX" } +{ "_id" : "75239", "city" : "DALLAS", "loc" : [ -96.732769, 32.659974 ], "pop" : 541, "state" : "TX" } +{ "_id" : "75240", "city" : "DALLAS", "loc" : [ -96.78721400000001, 32.937431 ], "pop" : 37646, "state" : "TX" } +{ "_id" : "75241", "city" : "DALLAS", "loc" : [ -96.777421, 32.672216 ], "pop" : 26407, "state" : "TX" } +{ "_id" : "75243", "city" : "DALLAS", "loc" : [ -96.728472, 32.910347 ], "pop" : 48344, "state" : "TX" } +{ "_id" : "75244", "city" : "FARMERS BRANCH", "loc" : [ -96.842533, 32.925817 ], "pop" : 16870, "state" : "TX" } +{ "_id" : "75246", "city" : "DALLAS", "loc" : [ -96.769696, 32.79484 ], "pop" : 3129, "state" : "TX" } +{ "_id" : "75247", "city" : "DALLAS", "loc" : [ -96.887123, 32.801323 ], "pop" : 124, "state" : "TX" } +{ "_id" : "75248", "city" : "DALLAS", "loc" : [ -96.794242, 32.968199 ], "pop" : 34858, "state" : "TX" } +{ "_id" : "75249", "city" : "DALLAS", "loc" : [ -96.94926599999999, 32.636024 ], "pop" : 8677, "state" : "TX" } +{ "_id" : "75251", "city" : "DALLAS", "loc" : [ -96.77183100000001, 32.912203 ], "pop" : 75, "state" : "TX" } +{ "_id" : "75252", "city" : "DALLAS", "loc" : [ -96.792113, 32.996848 ], "pop" : 15152, "state" : "TX" } +{ "_id" : "75253", "city" : "DALLAS", "loc" : [ -96.59643, 32.683311 ], "pop" : 10252, "state" : "TX" } +{ "_id" : "75287", "city" : "DALLAS", "loc" : [ -96.83143, 33.000458 ], "pop" : 11388, "state" : "TX" } +{ "_id" : "75401", "city" : "GREENVILLE", "loc" : [ -96.10241600000001, 33.117476 ], "pop" : 30183, "state" : "TX" } +{ "_id" : "75407", "city" : "PRINCETON", "loc" : [ -96.49807300000001, 33.155542 ], "pop" : 7552, "state" : "TX" } +{ "_id" : "75409", "city" : "ANNA", "loc" : [ -96.563862, 33.344516 ], "pop" : 4413, "state" : "TX" } +{ "_id" : "75410", "city" : "ALBA", "loc" : [ -95.59710200000001, 32.765235 ], "pop" : 2599, "state" : "TX" } +{ "_id" : "75411", "city" : "ARTHUR CITY", "loc" : [ -95.49403700000001, 33.840031 ], "pop" : 1583, "state" : "TX" } +{ "_id" : "75412", "city" : "BAGWELL", "loc" : [ -95.14869, 33.836089 ], "pop" : 979, "state" : "TX" } +{ "_id" : "75414", "city" : "BELLS", "loc" : [ -96.42366800000001, 33.617817 ], "pop" : 1829, "state" : "TX" } +{ "_id" : "75415", "city" : "BEN FRANKLIN", "loc" : [ -95.759107, 33.474146 ], "pop" : 151, "state" : "TX" } +{ "_id" : "75416", "city" : "BLOSSOM", "loc" : [ -95.382341, 33.694547 ], "pop" : 3253, "state" : "TX" } +{ "_id" : "75417", "city" : "BOGATA", "loc" : [ -95.193725, 33.469862 ], "pop" : 2803, "state" : "TX" } +{ "_id" : "75418", "city" : "BONHAM", "loc" : [ -96.183566, 33.580559 ], "pop" : 9003, "state" : "TX" } +{ "_id" : "75420", "city" : "BRASHEAR", "loc" : [ -95.73451, 33.115521 ], "pop" : 272, "state" : "TX" } +{ "_id" : "75421", "city" : "BROOKSTON", "loc" : [ -95.688812, 33.624555 ], "pop" : 287, "state" : "TX" } +{ "_id" : "75422", "city" : "CAMPBELL", "loc" : [ -95.94391899999999, 33.151049 ], "pop" : 2029, "state" : "TX" } +{ "_id" : "75423", "city" : "CELESTE", "loc" : [ -96.207635, 33.264913 ], "pop" : 2697, "state" : "TX" } +{ "_id" : "75424", "city" : "BLUE RIDGE", "loc" : [ -96.390056, 33.306135 ], "pop" : 2312, "state" : "TX" } +{ "_id" : "75426", "city" : "CLARKSVILLE", "loc" : [ -95.046094, 33.623563 ], "pop" : 6675, "state" : "TX" } +{ "_id" : "75428", "city" : "COMMERCE", "loc" : [ -95.90967999999999, 33.2493 ], "pop" : 8421, "state" : "TX" } +{ "_id" : "75431", "city" : "COMO", "loc" : [ -95.362655, 33.064231 ], "pop" : 1679, "state" : "TX" } +{ "_id" : "75432", "city" : "COOPER", "loc" : [ -95.662311, 33.381166 ], "pop" : 3438, "state" : "TX" } +{ "_id" : "75433", "city" : "CUMBY", "loc" : [ -95.79453599999999, 33.111761 ], "pop" : 2894, "state" : "TX" } +{ "_id" : "75435", "city" : "DEPORT", "loc" : [ -95.365351, 33.522077 ], "pop" : 1927, "state" : "TX" } +{ "_id" : "75436", "city" : "DETROIT", "loc" : [ -95.23848, 33.662691 ], "pop" : 1594, "state" : "TX" } +{ "_id" : "75437", "city" : "DIKE", "loc" : [ -95.471125, 33.196485 ], "pop" : 210, "state" : "TX" } +{ "_id" : "75438", "city" : "DODD CITY", "loc" : [ -96.06194000000001, 33.564704 ], "pop" : 1094, "state" : "TX" } +{ "_id" : "75439", "city" : "ECTOR", "loc" : [ -96.273533, 33.581913 ], "pop" : 803, "state" : "TX" } +{ "_id" : "75440", "city" : "EMORY", "loc" : [ -95.741786, 32.875041 ], "pop" : 3919, "state" : "TX" } +{ "_id" : "75442", "city" : "FARMERSVILLE", "loc" : [ -96.368619, 33.165862 ], "pop" : 4777, "state" : "TX" } +{ "_id" : "75446", "city" : "HONEY GROVE", "loc" : [ -95.9109, 33.598505 ], "pop" : 2563, "state" : "TX" } +{ "_id" : "75447", "city" : "IVANHOE", "loc" : [ -96.169811, 33.67364 ], "pop" : 1004, "state" : "TX" } +{ "_id" : "75448", "city" : "KLONDIKE", "loc" : [ -95.801762, 33.303375 ], "pop" : 729, "state" : "TX" } +{ "_id" : "75449", "city" : "LADONIA", "loc" : [ -95.94548899999999, 33.424527 ], "pop" : 899, "state" : "TX" } +{ "_id" : "75450", "city" : "LAKE CREEK", "loc" : [ -95.622131, 33.467493 ], "pop" : 50, "state" : "TX" } +{ "_id" : "75451", "city" : "LEESBURG", "loc" : [ -95.107924, 32.976275 ], "pop" : 1246, "state" : "TX" } +{ "_id" : "75452", "city" : "LEONARD", "loc" : [ -96.223772, 33.404363 ], "pop" : 3229, "state" : "TX" } +{ "_id" : "75453", "city" : "LONE OAK", "loc" : [ -95.943412, 32.991571 ], "pop" : 1822, "state" : "TX" } +{ "_id" : "75454", "city" : "MELISSA", "loc" : [ -96.574009, 33.284114 ], "pop" : 703, "state" : "TX" } +{ "_id" : "75455", "city" : "MOUNT PLEASANT", "loc" : [ -94.969461, 33.173309 ], "pop" : 16878, "state" : "TX" } +{ "_id" : "75457", "city" : "MOUNT VERNON", "loc" : [ -95.21810600000001, 33.170204 ], "pop" : 5948, "state" : "TX" } +{ "_id" : "75459", "city" : "HOWE", "loc" : [ -96.64072299999999, 33.534867 ], "pop" : 4843, "state" : "TX" } +{ "_id" : "75460", "city" : "PARIS", "loc" : [ -95.537881, 33.658077 ], "pop" : 30317, "state" : "TX" } +{ "_id" : "75468", "city" : "PATTONVILLE", "loc" : [ -95.3908, 33.570234 ], "pop" : 194, "state" : "TX" } +{ "_id" : "75469", "city" : "PECAN GAP", "loc" : [ -95.826196, 33.419641 ], "pop" : 489, "state" : "TX" } +{ "_id" : "75470", "city" : "PETTY", "loc" : [ -95.789057, 33.609765 ], "pop" : 247, "state" : "TX" } +{ "_id" : "75471", "city" : "PICKTON", "loc" : [ -95.462979, 33.042401 ], "pop" : 1569, "state" : "TX" } +{ "_id" : "75472", "city" : "POINT", "loc" : [ -95.89028500000001, 32.900743 ], "pop" : 2796, "state" : "TX" } +{ "_id" : "75473", "city" : "POWDERLY", "loc" : [ -95.530692, 33.777877 ], "pop" : 1570, "state" : "TX" } +{ "_id" : "75474", "city" : "QUINLAN", "loc" : [ -96.12608299999999, 32.898347 ], "pop" : 13826, "state" : "TX" } +{ "_id" : "75476", "city" : "RAVENNA", "loc" : [ -96.145157, 33.709757 ], "pop" : 1635, "state" : "TX" } +{ "_id" : "75477", "city" : "ROXTON", "loc" : [ -95.74160500000001, 33.542934 ], "pop" : 975, "state" : "TX" } +{ "_id" : "75478", "city" : "SALTILLO", "loc" : [ -95.343324, 33.176678 ], "pop" : 500, "state" : "TX" } +{ "_id" : "75479", "city" : "SAVOY", "loc" : [ -96.350156, 33.606571 ], "pop" : 1726, "state" : "TX" } +{ "_id" : "75480", "city" : "SCROGGINS", "loc" : [ -95.239683, 32.991177 ], "pop" : 2029, "state" : "TX" } +{ "_id" : "75481", "city" : "SULPHUR BLUFF", "loc" : [ -95.37396, 33.333379 ], "pop" : 228, "state" : "TX" } +{ "_id" : "75482", "city" : "SULPHUR SPRINGS", "loc" : [ -95.592161, 33.134541 ], "pop" : 21479, "state" : "TX" } +{ "_id" : "75486", "city" : "SUMNER", "loc" : [ -95.680671, 33.758941 ], "pop" : 3596, "state" : "TX" } +{ "_id" : "75487", "city" : "TALCO", "loc" : [ -95.049718, 33.33436 ], "pop" : 1932, "state" : "TX" } +{ "_id" : "75488", "city" : "TELEPHONE", "loc" : [ -96.044945, 33.797854 ], "pop" : 709, "state" : "TX" } +{ "_id" : "75490", "city" : "TRENTON", "loc" : [ -96.339754, 33.423491 ], "pop" : 1776, "state" : "TX" } +{ "_id" : "75491", "city" : "WHITEWRIGHT", "loc" : [ -96.451025, 33.519041 ], "pop" : 4327, "state" : "TX" } +{ "_id" : "75492", "city" : "WINDOM", "loc" : [ -96.002002, 33.563295 ], "pop" : 363, "state" : "TX" } +{ "_id" : "75493", "city" : "WINFIELD", "loc" : [ -95.07898400000001, 33.161498 ], "pop" : 1956, "state" : "TX" } +{ "_id" : "75494", "city" : "WINNSBORO", "loc" : [ -95.27265, 32.91462 ], "pop" : 6204, "state" : "TX" } +{ "_id" : "75495", "city" : "VAN ALSTYNE", "loc" : [ -96.548632, 33.429169 ], "pop" : 4251, "state" : "TX" } +{ "_id" : "75496", "city" : "WOLFE CITY", "loc" : [ -96.06907, 33.360479 ], "pop" : 2225, "state" : "TX" } +{ "_id" : "75497", "city" : "YANTIS", "loc" : [ -95.531113, 32.925694 ], "pop" : 1554, "state" : "TX" } +{ "_id" : "75501", "city" : "WAKE VILLAGE", "loc" : [ -94.118245, 33.407371 ], "pop" : 40273, "state" : "TX" } +{ "_id" : "75502", "city" : "TEXARKANA", "loc" : [ -94.011281, 33.432644 ], "pop" : 30471, "state" : "AR" } +{ "_id" : "75503", "city" : "TEXARKANA", "loc" : [ -94.07737400000001, 33.466906 ], "pop" : 16443, "state" : "TX" } +{ "_id" : "75550", "city" : "ANNONA", "loc" : [ -94.899226, 33.553519 ], "pop" : 949, "state" : "TX" } +{ "_id" : "75551", "city" : "ATLANTA", "loc" : [ -94.16461700000001, 33.10898 ], "pop" : 9024, "state" : "TX" } +{ "_id" : "75554", "city" : "AVERY", "loc" : [ -94.786708, 33.533935 ], "pop" : 1317, "state" : "TX" } +{ "_id" : "75555", "city" : "BIVINS", "loc" : [ -94.140406, 32.96602 ], "pop" : 1758, "state" : "TX" } +{ "_id" : "75556", "city" : "BLOOMBURG", "loc" : [ -94.064688, 33.133859 ], "pop" : 855, "state" : "TX" } +{ "_id" : "75558", "city" : "COOKVILLE", "loc" : [ -94.87329099999999, 33.181908 ], "pop" : 2050, "state" : "TX" } +{ "_id" : "75559", "city" : "DE KALB", "loc" : [ -94.621092, 33.472741 ], "pop" : 3364, "state" : "TX" } +{ "_id" : "75560", "city" : "DOUGLASSVILLE", "loc" : [ -94.346699, 33.175806 ], "pop" : 1705, "state" : "TX" } +{ "_id" : "75561", "city" : "LEARY", "loc" : [ -94.269188, 33.477542 ], "pop" : 5815, "state" : "TX" } +{ "_id" : "75563", "city" : "LINDEN", "loc" : [ -94.36050899999999, 33.004821 ], "pop" : 5727, "state" : "TX" } +{ "_id" : "75566", "city" : "MARIETTA", "loc" : [ -94.542098, 33.179618 ], "pop" : 1526, "state" : "TX" } +{ "_id" : "75567", "city" : "MAUD", "loc" : [ -94.48226699999999, 33.35504 ], "pop" : 888, "state" : "TX" } +{ "_id" : "75568", "city" : "NAPLES", "loc" : [ -94.689061, 33.191186 ], "pop" : 2752, "state" : "TX" } +{ "_id" : "75569", "city" : "NASH", "loc" : [ -94.14223699999999, 33.439786 ], "pop" : 3464, "state" : "TX" } +{ "_id" : "75570", "city" : "BOSTON", "loc" : [ -94.433882, 33.462119 ], "pop" : 7801, "state" : "TX" } +{ "_id" : "75571", "city" : "OMAHA", "loc" : [ -94.763944, 33.180794 ], "pop" : 1791, "state" : "TX" } +{ "_id" : "75572", "city" : "QUEEN CITY", "loc" : [ -94.154825, 33.18736 ], "pop" : 4376, "state" : "TX" } +{ "_id" : "75574", "city" : "SIMMS", "loc" : [ -94.60386200000001, 33.498727 ], "pop" : 3617, "state" : "TX" } +{ "_id" : "75601", "city" : "LONGVIEW", "loc" : [ -94.72328, 32.526854 ], "pop" : 27102, "state" : "TX" } +{ "_id" : "75602", "city" : "LONGVIEW", "loc" : [ -94.710078, 32.472373 ], "pop" : 17399, "state" : "TX" } +{ "_id" : "75603", "city" : "LONGVIEW", "loc" : [ -94.711691, 32.426368 ], "pop" : 6737, "state" : "TX" } +{ "_id" : "75604", "city" : "LONGVIEW", "loc" : [ -94.798957, 32.525139 ], "pop" : 25570, "state" : "TX" } +{ "_id" : "75605", "city" : "LONGVIEW", "loc" : [ -94.776748, 32.554711 ], "pop" : 9166, "state" : "TX" } +{ "_id" : "75630", "city" : "AVINGER", "loc" : [ -94.579534, 32.848514 ], "pop" : 2764, "state" : "TX" } +{ "_id" : "75631", "city" : "BECKVILLE", "loc" : [ -94.455451, 32.245165 ], "pop" : 3114, "state" : "TX" } +{ "_id" : "75633", "city" : "CARTHAGE", "loc" : [ -94.352721, 32.154379 ], "pop" : 11062, "state" : "TX" } +{ "_id" : "75638", "city" : "DAINGERFIELD", "loc" : [ -94.735899, 33.031263 ], "pop" : 5614, "state" : "TX" } +{ "_id" : "75639", "city" : "DE BERRY", "loc" : [ -94.13557, 32.254327 ], "pop" : 4375, "state" : "TX" } +{ "_id" : "75640", "city" : "NEW DIANA", "loc" : [ -94.698122, 32.704585 ], "pop" : 1930, "state" : "TX" } +{ "_id" : "75643", "city" : "GARY", "loc" : [ -94.28150100000001, 32.019848 ], "pop" : 1394, "state" : "TX" } +{ "_id" : "75644", "city" : "GILMER", "loc" : [ -94.971434, 32.724565 ], "pop" : 10141, "state" : "TX" } +{ "_id" : "75647", "city" : "GLADEWATER", "loc" : [ -94.932001, 32.555858 ], "pop" : 14791, "state" : "TX" } +{ "_id" : "75650", "city" : "HALLSVILLE", "loc" : [ -94.53330800000001, 32.507283 ], "pop" : 7463, "state" : "TX" } +{ "_id" : "75651", "city" : "HARLETON", "loc" : [ -94.465165, 32.657858 ], "pop" : 2609, "state" : "TX" } +{ "_id" : "75652", "city" : "HENDERSON", "loc" : [ -94.791962, 32.152375 ], "pop" : 19836, "state" : "TX" } +{ "_id" : "75656", "city" : "HUGHES SPRINGS", "loc" : [ -94.622758, 33.016763 ], "pop" : 4564, "state" : "TX" } +{ "_id" : "75657", "city" : "SMITHLAND", "loc" : [ -94.371217, 32.779863 ], "pop" : 8460, "state" : "TX" } +{ "_id" : "75661", "city" : "KARNACK", "loc" : [ -94.20005, 32.620508 ], "pop" : 4434, "state" : "TX" } +{ "_id" : "75662", "city" : "KILGORE", "loc" : [ -94.86527100000001, 32.383557 ], "pop" : 22785, "state" : "TX" } +{ "_id" : "75667", "city" : "LANEVILLE", "loc" : [ -94.866027, 31.950821 ], "pop" : 3032, "state" : "TX" } +{ "_id" : "75668", "city" : "LONE STAR", "loc" : [ -94.71830300000001, 32.946982 ], "pop" : 2578, "state" : "TX" } +{ "_id" : "75669", "city" : "LONG BRANCH", "loc" : [ -94.47202799999999, 32.050224 ], "pop" : 2101, "state" : "TX" } +{ "_id" : "75670", "city" : "MARSHALL", "loc" : [ -94.36190999999999, 32.53378 ], "pop" : 27482, "state" : "TX" } +{ "_id" : "75681", "city" : "MOUNT ENTERPRISE", "loc" : [ -94.62350499999999, 31.9125 ], "pop" : 2558, "state" : "TX" } +{ "_id" : "75683", "city" : "ORE CITY", "loc" : [ -94.751401, 32.785588 ], "pop" : 5129, "state" : "TX" } +{ "_id" : "75684", "city" : "OVERTON", "loc" : [ -94.95291400000001, 32.269041 ], "pop" : 4776, "state" : "TX" } +{ "_id" : "75686", "city" : "PITTSBURG", "loc" : [ -94.960337, 32.96231 ], "pop" : 12871, "state" : "TX" } +{ "_id" : "75687", "city" : "PRICE", "loc" : [ -94.94149400000001, 32.100842 ], "pop" : 945, "state" : "TX" } +{ "_id" : "75689", "city" : "TURNERTOWN", "loc" : [ -94.950805, 32.18734 ], "pop" : 923, "state" : "TX" } +{ "_id" : "75691", "city" : "TATUM", "loc" : [ -94.59602700000001, 32.326569 ], "pop" : 4679, "state" : "TX" } +{ "_id" : "75692", "city" : "WASKOM", "loc" : [ -94.137884, 32.467183 ], "pop" : 6516, "state" : "TX" } +{ "_id" : "75693", "city" : "CLARKSVILLE CITY", "loc" : [ -94.862115, 32.537232 ], "pop" : 5887, "state" : "TX" } +{ "_id" : "75701", "city" : "TYLER", "loc" : [ -95.292179, 32.325366 ], "pop" : 30794, "state" : "TX" } +{ "_id" : "75702", "city" : "TYLER", "loc" : [ -95.311652, 32.361969 ], "pop" : 24885, "state" : "TX" } +{ "_id" : "75703", "city" : "TYLER", "loc" : [ -95.303147, 32.276827 ], "pop" : 26345, "state" : "TX" } +{ "_id" : "75704", "city" : "TYLER", "loc" : [ -95.406977, 32.373781 ], "pop" : 6100, "state" : "TX" } +{ "_id" : "75705", "city" : "TYLER", "loc" : [ -95.125225, 32.376599 ], "pop" : 1539, "state" : "TX" } +{ "_id" : "75706", "city" : "TYLER", "loc" : [ -95.33099300000001, 32.444148 ], "pop" : 6770, "state" : "TX" } +{ "_id" : "75707", "city" : "TYLER", "loc" : [ -95.19269199999999, 32.303782 ], "pop" : 9853, "state" : "TX" } +{ "_id" : "75708", "city" : "EAST TEXAS CENTE", "loc" : [ -95.244354, 32.389193 ], "pop" : 4338, "state" : "TX" } +{ "_id" : "75709", "city" : "TYLER", "loc" : [ -95.395563, 32.307817 ], "pop" : 1737, "state" : "TX" } +{ "_id" : "75750", "city" : "ARP", "loc" : [ -95.063908, 32.241758 ], "pop" : 1815, "state" : "TX" } +{ "_id" : "75751", "city" : "ATHENS", "loc" : [ -95.84318, 32.193499 ], "pop" : 18579, "state" : "TX" } +{ "_id" : "75754", "city" : "BEN WHEELER", "loc" : [ -95.637085, 32.412588 ], "pop" : 3992, "state" : "TX" } +{ "_id" : "75755", "city" : "BIG SANDY", "loc" : [ -95.08803399999999, 32.61682 ], "pop" : 3997, "state" : "TX" } +{ "_id" : "75756", "city" : "EDOM", "loc" : [ -95.62289, 32.290514 ], "pop" : 2868, "state" : "TX" } +{ "_id" : "75757", "city" : "MOUNT SELMAN", "loc" : [ -95.375045, 32.135745 ], "pop" : 4654, "state" : "TX" } +{ "_id" : "75758", "city" : "CHANDLER", "loc" : [ -95.502531, 32.270638 ], "pop" : 4835, "state" : "TX" } +{ "_id" : "75760", "city" : "CUSHING", "loc" : [ -94.853887, 31.797767 ], "pop" : 2068, "state" : "TX" } +{ "_id" : "75762", "city" : "FLINT", "loc" : [ -95.394848, 32.207927 ], "pop" : 6365, "state" : "TX" } +{ "_id" : "75763", "city" : "FRANKSTON", "loc" : [ -95.516284, 32.053488 ], "pop" : 5394, "state" : "TX" } +{ "_id" : "75765", "city" : "HAWKINS", "loc" : [ -95.222015, 32.643901 ], "pop" : 4968, "state" : "TX" } +{ "_id" : "75766", "city" : "JACKSONVILLE", "loc" : [ -95.27032800000001, 31.96177 ], "pop" : 19652, "state" : "TX" } +{ "_id" : "75770", "city" : "LARUE", "loc" : [ -95.59266100000001, 32.160758 ], "pop" : 2826, "state" : "TX" } +{ "_id" : "75771", "city" : "MT SYLVAN", "loc" : [ -95.42993199999999, 32.517152 ], "pop" : 9838, "state" : "TX" } +{ "_id" : "75773", "city" : "MINEOLA", "loc" : [ -95.487032, 32.666059 ], "pop" : 8904, "state" : "TX" } +{ "_id" : "75778", "city" : "MURCHISON", "loc" : [ -95.77372, 32.325732 ], "pop" : 1801, "state" : "TX" } +{ "_id" : "75783", "city" : "QUITMAN", "loc" : [ -95.430161, 32.804862 ], "pop" : 5864, "state" : "TX" } +{ "_id" : "75784", "city" : "REKLAW", "loc" : [ -95.01183399999999, 31.885858 ], "pop" : 334, "state" : "TX" } +{ "_id" : "75785", "city" : "DIALVILLE", "loc" : [ -95.17315600000001, 31.80976 ], "pop" : 10527, "state" : "TX" } +{ "_id" : "75789", "city" : "TROUP", "loc" : [ -95.12265600000001, 32.104003 ], "pop" : 8363, "state" : "TX" } +{ "_id" : "75790", "city" : "VAN", "loc" : [ -95.654538, 32.528265 ], "pop" : 4019, "state" : "TX" } +{ "_id" : "75791", "city" : "WHITEHOUSE", "loc" : [ -95.226552, 32.221958 ], "pop" : 8273, "state" : "TX" } +{ "_id" : "75792", "city" : "WINONA", "loc" : [ -95.124624, 32.466163 ], "pop" : 2825, "state" : "TX" } +{ "_id" : "75801", "city" : "PALESTINE", "loc" : [ -95.634158, 31.758752 ], "pop" : 26466, "state" : "TX" } +{ "_id" : "75831", "city" : "FREESTONE", "loc" : [ -96.058516, 31.457151 ], "pop" : 3404, "state" : "TX" } +{ "_id" : "75833", "city" : "CENTERVILLE", "loc" : [ -95.92128700000001, 31.272025 ], "pop" : 2618, "state" : "TX" } +{ "_id" : "75835", "city" : "AUSTONIO", "loc" : [ -95.46832999999999, 31.315067 ], "pop" : 11698, "state" : "TX" } +{ "_id" : "75838", "city" : "DONIE", "loc" : [ -96.238687, 31.487285 ], "pop" : 334, "state" : "TX" } +{ "_id" : "75839", "city" : "SLOCUM", "loc" : [ -95.55323199999999, 31.635087 ], "pop" : 4767, "state" : "TX" } +{ "_id" : "75840", "city" : "FAIRFIELD", "loc" : [ -96.15717600000001, 31.736136 ], "pop" : 6331, "state" : "TX" } +{ "_id" : "75844", "city" : "GRAPELAND", "loc" : [ -95.44471299999999, 31.49721 ], "pop" : 4705, "state" : "TX" } +{ "_id" : "75845", "city" : "GROVETON", "loc" : [ -95.09689400000001, 31.065142 ], "pop" : 2206, "state" : "TX" } +{ "_id" : "75846", "city" : "JEWETT", "loc" : [ -96.191841, 31.373925 ], "pop" : 2112, "state" : "TX" } +{ "_id" : "75847", "city" : "KENNARD", "loc" : [ -95.154118, 31.338449 ], "pop" : 1784, "state" : "TX" } +{ "_id" : "75850", "city" : "LEONA", "loc" : [ -95.928428, 31.14207 ], "pop" : 475, "state" : "TX" } +{ "_id" : "75851", "city" : "LOVELADY", "loc" : [ -95.550057, 31.0564 ], "pop" : 3649, "state" : "TX" } +{ "_id" : "75852", "city" : "MIDWAY", "loc" : [ -95.70894, 30.980579 ], "pop" : 3522, "state" : "TX" } +{ "_id" : "75853", "city" : "MONTALBA", "loc" : [ -95.75926, 31.922165 ], "pop" : 2070, "state" : "TX" } +{ "_id" : "75855", "city" : "OAKWOOD", "loc" : [ -95.902151, 31.602312 ], "pop" : 2637, "state" : "TX" } +{ "_id" : "75856", "city" : "PENNINGTON", "loc" : [ -95.15867799999999, 31.161843 ], "pop" : 565, "state" : "TX" } +{ "_id" : "75859", "city" : "STREETMAN", "loc" : [ -96.29876299999999, 31.888532 ], "pop" : 488, "state" : "TX" } +{ "_id" : "75860", "city" : "TEAGUE", "loc" : [ -96.27778000000001, 31.632772 ], "pop" : 5318, "state" : "TX" } +{ "_id" : "75861", "city" : "TENNESSEE COLONY", "loc" : [ -95.899798, 31.792882 ], "pop" : 11380, "state" : "TX" } +{ "_id" : "75862", "city" : "TRINITY", "loc" : [ -95.340295, 30.941951 ], "pop" : 7585, "state" : "TX" } +{ "_id" : "75901", "city" : "KELTYS", "loc" : [ -94.734185, 31.336004 ], "pop" : 46763, "state" : "TX" } +{ "_id" : "75925", "city" : "FOREST", "loc" : [ -95.079786, 31.647815 ], "pop" : 3203, "state" : "TX" } +{ "_id" : "75926", "city" : "APPLE SPRINGS", "loc" : [ -94.98115199999999, 31.226923 ], "pop" : 1079, "state" : "TX" } +{ "_id" : "75928", "city" : "BON WIER", "loc" : [ -93.766465, 30.687557 ], "pop" : 2283, "state" : "TX" } +{ "_id" : "75929", "city" : "BROADDUS", "loc" : [ -94.215552, 31.295241 ], "pop" : 1786, "state" : "TX" } +{ "_id" : "75930", "city" : "BRONSON", "loc" : [ -93.999256, 31.339056 ], "pop" : 1922, "state" : "TX" } +{ "_id" : "75931", "city" : "BROOKELAND", "loc" : [ -94.00356600000001, 31.106273 ], "pop" : 1883, "state" : "TX" } +{ "_id" : "75932", "city" : "BURKEVILLE", "loc" : [ -93.658517, 31.009934 ], "pop" : 2275, "state" : "TX" } +{ "_id" : "75933", "city" : "CALL", "loc" : [ -93.833355, 30.574132 ], "pop" : 1813, "state" : "TX" } +{ "_id" : "75935", "city" : "CENTER", "loc" : [ -94.186947, 31.786468 ], "pop" : 11512, "state" : "TX" } +{ "_id" : "75936", "city" : "CHESTER", "loc" : [ -94.458099, 30.928532 ], "pop" : 1588, "state" : "TX" } +{ "_id" : "75937", "city" : "CHIRENO", "loc" : [ -94.430244, 31.511935 ], "pop" : 3983, "state" : "TX" } +{ "_id" : "75938", "city" : "ROCKLAND", "loc" : [ -94.42181100000001, 30.909226 ], "pop" : 836, "state" : "TX" } +{ "_id" : "75939", "city" : "BARNUM", "loc" : [ -94.7959, 31.000657 ], "pop" : 3969, "state" : "TX" } +{ "_id" : "75941", "city" : "DIBOLL", "loc" : [ -94.77291099999999, 31.195028 ], "pop" : 7686, "state" : "TX" } +{ "_id" : "75943", "city" : "DOUGLASS", "loc" : [ -94.869649, 31.657846 ], "pop" : 1005, "state" : "TX" } +{ "_id" : "75946", "city" : "GARRISON", "loc" : [ -94.52660400000001, 31.811111 ], "pop" : 2365, "state" : "TX" } +{ "_id" : "75948", "city" : "HEMPHILL", "loc" : [ -93.79045000000001, 31.316123 ], "pop" : 4180, "state" : "TX" } +{ "_id" : "75949", "city" : "HUNTINGTON", "loc" : [ -94.566237, 31.283714 ], "pop" : 8415, "state" : "TX" } +{ "_id" : "75951", "city" : "SAM RAYBURN", "loc" : [ -94.02148099999999, 30.925348 ], "pop" : 14219, "state" : "TX" } +{ "_id" : "75954", "city" : "JOAQUIN", "loc" : [ -94.060833, 31.943989 ], "pop" : 2754, "state" : "TX" } +{ "_id" : "75956", "city" : "BON AMI", "loc" : [ -93.92793399999999, 30.688217 ], "pop" : 5772, "state" : "TX" } +{ "_id" : "75957", "city" : "MAGNOLIA SPRINGS", "loc" : [ -94.070896, 30.762882 ], "pop" : 111, "state" : "TX" } +{ "_id" : "75959", "city" : "MILAM", "loc" : [ -93.831816, 31.47001 ], "pop" : 2187, "state" : "TX" } +{ "_id" : "75960", "city" : "MOSCOW", "loc" : [ -94.85437, 30.917902 ], "pop" : 1018, "state" : "TX" } +{ "_id" : "75961", "city" : "APPLEBY", "loc" : [ -94.651093, 31.618534 ], "pop" : 45332, "state" : "TX" } +{ "_id" : "75966", "city" : "NEWTON", "loc" : [ -93.7497, 30.835074 ], "pop" : 4184, "state" : "TX" } +{ "_id" : "75968", "city" : "PINELAND", "loc" : [ -93.97542, 31.241782 ], "pop" : 1279, "state" : "TX" } +{ "_id" : "75969", "city" : "POLLOK", "loc" : [ -94.82540299999999, 31.429107 ], "pop" : 4725, "state" : "TX" } +{ "_id" : "75972", "city" : "SAN AUGUSTINE", "loc" : [ -94.132581, 31.515173 ], "pop" : 5916, "state" : "TX" } +{ "_id" : "75973", "city" : "SHELBYVILLE", "loc" : [ -93.969841, 31.713074 ], "pop" : 2949, "state" : "TX" } +{ "_id" : "75974", "city" : "TENAHA", "loc" : [ -94.248773, 31.940812 ], "pop" : 1759, "state" : "TX" } +{ "_id" : "75975", "city" : "TIMPSON", "loc" : [ -94.396733, 31.884089 ], "pop" : 3060, "state" : "TX" } +{ "_id" : "75976", "city" : "WELLS", "loc" : [ -94.969351, 31.499755 ], "pop" : 1550, "state" : "TX" } +{ "_id" : "75977", "city" : "WIERGATE", "loc" : [ -93.803854, 31.041417 ], "pop" : 290, "state" : "TX" } +{ "_id" : "75979", "city" : "DOGWOOD", "loc" : [ -94.425494, 30.775133 ], "pop" : 5942, "state" : "TX" } +{ "_id" : "75980", "city" : "ZAVALLA", "loc" : [ -94.38711499999999, 31.156863 ], "pop" : 2295, "state" : "TX" } +{ "_id" : "76006", "city" : "ARLINGTON", "loc" : [ -97.08342500000001, 32.778494 ], "pop" : 18003, "state" : "TX" } +{ "_id" : "76008", "city" : "ALEDO", "loc" : [ -97.60388500000001, 32.700351 ], "pop" : 5148, "state" : "TX" } +{ "_id" : "76009", "city" : "ALVARADO", "loc" : [ -97.212971, 32.439499 ], "pop" : 13229, "state" : "TX" } +{ "_id" : "76010", "city" : "ARLINGTON", "loc" : [ -97.082576, 32.720368 ], "pop" : 42405, "state" : "TX" } +{ "_id" : "76011", "city" : "ARLINGTON", "loc" : [ -97.100302, 32.758236 ], "pop" : 23943, "state" : "TX" } +{ "_id" : "76012", "city" : "ARLINGTON", "loc" : [ -97.13480800000001, 32.753962 ], "pop" : 24141, "state" : "TX" } +{ "_id" : "76013", "city" : "ARLINGTON", "loc" : [ -97.14416, 32.719905 ], "pop" : 30252, "state" : "TX" } +{ "_id" : "76014", "city" : "ARLINGTON", "loc" : [ -97.08755600000001, 32.695425 ], "pop" : 26087, "state" : "TX" } +{ "_id" : "76015", "city" : "ARLINGTON", "loc" : [ -97.134685, 32.693125 ], "pop" : 14544, "state" : "TX" } +{ "_id" : "76016", "city" : "ARLINGTON", "loc" : [ -97.190466, 32.688898 ], "pop" : 28219, "state" : "TX" } +{ "_id" : "76017", "city" : "ARLINGTON", "loc" : [ -97.159899, 32.65545 ], "pop" : 42829, "state" : "TX" } +{ "_id" : "76018", "city" : "ARLINGTON", "loc" : [ -97.091987, 32.654752 ], "pop" : 15590, "state" : "TX" } +{ "_id" : "76020", "city" : "AZLE", "loc" : [ -97.54115299999999, 32.903453 ], "pop" : 18198, "state" : "TX" } +{ "_id" : "76021", "city" : "BEDFORD", "loc" : [ -97.135797, 32.853579 ], "pop" : 31798, "state" : "TX" } +{ "_id" : "76022", "city" : "BEDFORD", "loc" : [ -97.14535100000001, 32.829749 ], "pop" : 13186, "state" : "TX" } +{ "_id" : "76023", "city" : "BOYD", "loc" : [ -97.586797, 33.059367 ], "pop" : 4292, "state" : "TX" } +{ "_id" : "76028", "city" : "BURLESON", "loc" : [ -97.308959, 32.531624 ], "pop" : 33535, "state" : "TX" } +{ "_id" : "76031", "city" : "CLEBURNE", "loc" : [ -97.39795700000001, 32.342891 ], "pop" : 25844, "state" : "TX" } +{ "_id" : "76034", "city" : "COLLEYVILLE", "loc" : [ -97.14602600000001, 32.88721 ], "pop" : 11726, "state" : "TX" } +{ "_id" : "76035", "city" : "CRESSON", "loc" : [ -97.651931, 32.530714 ], "pop" : 265, "state" : "TX" } +{ "_id" : "76036", "city" : "CROWLEY", "loc" : [ -97.370306, 32.581398 ], "pop" : 8749, "state" : "TX" } +{ "_id" : "76039", "city" : "EULESS", "loc" : [ -97.083212, 32.858172 ], "pop" : 22412, "state" : "TX" } +{ "_id" : "76040", "city" : "EULESS", "loc" : [ -97.09720299999999, 32.826358 ], "pop" : 17220, "state" : "TX" } +{ "_id" : "76041", "city" : "FORRESTON", "loc" : [ -96.887522, 32.281131 ], "pop" : 106, "state" : "TX" } +{ "_id" : "76043", "city" : "GLEN ROSE", "loc" : [ -97.762911, 32.229762 ], "pop" : 4432, "state" : "TX" } +{ "_id" : "76044", "city" : "GODLEY", "loc" : [ -97.534865, 32.428174 ], "pop" : 2595, "state" : "TX" } +{ "_id" : "76048", "city" : "GRANBURY", "loc" : [ -97.774173, 32.42505 ], "pop" : 13718, "state" : "TX" } +{ "_id" : "76049", "city" : "GRANBURY", "loc" : [ -97.72848399999999, 32.448811 ], "pop" : 10830, "state" : "TX" } +{ "_id" : "76050", "city" : "GRANDVIEW", "loc" : [ -97.235069, 32.277856 ], "pop" : 4850, "state" : "TX" } +{ "_id" : "76051", "city" : "GRAPEVINE", "loc" : [ -97.096203, 32.93143 ], "pop" : 30774, "state" : "TX" } +{ "_id" : "76052", "city" : "HASLET", "loc" : [ -97.33718500000001, 32.955734 ], "pop" : 866, "state" : "TX" } +{ "_id" : "76053", "city" : "HURST", "loc" : [ -97.175613, 32.821107 ], "pop" : 24835, "state" : "TX" } +{ "_id" : "76054", "city" : "HURST", "loc" : [ -97.175521, 32.855832 ], "pop" : 9953, "state" : "TX" } +{ "_id" : "76055", "city" : "ITASCA", "loc" : [ -97.146034, 32.163589 ], "pop" : 2341, "state" : "TX" } +{ "_id" : "76058", "city" : "JOSHUA", "loc" : [ -97.401123, 32.466252 ], "pop" : 12544, "state" : "TX" } +{ "_id" : "76059", "city" : "KEENE", "loc" : [ -97.32868000000001, 32.393659 ], "pop" : 5863, "state" : "TX" } +{ "_id" : "76060", "city" : "KENNEDALE", "loc" : [ -97.213853, 32.64316 ], "pop" : 5362, "state" : "TX" } +{ "_id" : "76063", "city" : "MANSFIELD", "loc" : [ -97.14155100000001, 32.577258 ], "pop" : 17381, "state" : "TX" } +{ "_id" : "76064", "city" : "MAYPEARL", "loc" : [ -96.98802999999999, 32.327878 ], "pop" : 2842, "state" : "TX" } +{ "_id" : "76065", "city" : "MIDLOTHIAN", "loc" : [ -96.993551, 32.475743 ], "pop" : 10271, "state" : "TX" } +{ "_id" : "76066", "city" : "MILLSAP", "loc" : [ -97.87838600000001, 32.670019 ], "pop" : 9110, "state" : "TX" } +{ "_id" : "76067", "city" : "MINERAL WELLS", "loc" : [ -98.063051, 32.810283 ], "pop" : 23617, "state" : "TX" } +{ "_id" : "76070", "city" : "NEMO", "loc" : [ -97.656668, 32.271312 ], "pop" : 206, "state" : "TX" } +{ "_id" : "76071", "city" : "NEWARK", "loc" : [ -97.510696, 33.007099 ], "pop" : 2670, "state" : "TX" } +{ "_id" : "76073", "city" : "PARADISE", "loc" : [ -97.697423, 33.082607 ], "pop" : 3009, "state" : "TX" } +{ "_id" : "76077", "city" : "RAINBOW", "loc" : [ -97.70652, 32.281216 ], "pop" : 722, "state" : "TX" } +{ "_id" : "76078", "city" : "RHOME", "loc" : [ -97.48168800000001, 33.054045 ], "pop" : 1771, "state" : "TX" } +{ "_id" : "76082", "city" : "SPRINGTOWN", "loc" : [ -97.634951, 32.966021 ], "pop" : 7377, "state" : "TX" } +{ "_id" : "76084", "city" : "VENUS", "loc" : [ -97.108734, 32.432975 ], "pop" : 2726, "state" : "TX" } +{ "_id" : "76086", "city" : "WEATHERFORD", "loc" : [ -97.738591, 32.784074 ], "pop" : 29937, "state" : "TX" } +{ "_id" : "76087", "city" : "WEATHERFORD", "loc" : [ -97.68943899999999, 32.749473 ], "pop" : 2502, "state" : "TX" } +{ "_id" : "76092", "city" : "GRAPEVINE", "loc" : [ -97.148066, 32.956456 ], "pop" : 5638, "state" : "TX" } +{ "_id" : "76093", "city" : "RIO VISTA", "loc" : [ -97.367825, 32.253168 ], "pop" : 1819, "state" : "TX" } +{ "_id" : "76102", "city" : "FORT WORTH", "loc" : [ -97.328023, 32.758897 ], "pop" : 8550, "state" : "TX" } +{ "_id" : "76103", "city" : "FORT WORTH", "loc" : [ -97.26039400000001, 32.747005 ], "pop" : 12611, "state" : "TX" } +{ "_id" : "76104", "city" : "FORT WORTH", "loc" : [ -97.318409, 32.725551 ], "pop" : 20012, "state" : "TX" } +{ "_id" : "76105", "city" : "FORT WORTH", "loc" : [ -97.26899, 32.723325 ], "pop" : 20947, "state" : "TX" } +{ "_id" : "76106", "city" : "FORT WORTH", "loc" : [ -97.356008, 32.796849 ], "pop" : 44367, "state" : "TX" } +{ "_id" : "76107", "city" : "FORT WORTH", "loc" : [ -97.385248, 32.739175 ], "pop" : 27082, "state" : "TX" } +{ "_id" : "76108", "city" : "WHITE SETTLEMENT", "loc" : [ -97.474063, 32.759271 ], "pop" : 22510, "state" : "TX" } +{ "_id" : "76109", "city" : "FORT WORTH", "loc" : [ -97.37887600000001, 32.700246 ], "pop" : 21893, "state" : "TX" } +{ "_id" : "76110", "city" : "FORT WORTH", "loc" : [ -97.33750499999999, 32.706505 ], "pop" : 27828, "state" : "TX" } +{ "_id" : "76111", "city" : "FORT WORTH", "loc" : [ -97.300327, 32.782382 ], "pop" : 17740, "state" : "TX" } +{ "_id" : "76112", "city" : "FORT WORTH", "loc" : [ -97.21812199999999, 32.749297 ], "pop" : 35311, "state" : "TX" } +{ "_id" : "76114", "city" : "RIVER OAKS", "loc" : [ -97.401526, 32.775379 ], "pop" : 21921, "state" : "TX" } +{ "_id" : "76115", "city" : "FORT WORTH", "loc" : [ -97.333634, 32.679618 ], "pop" : 16544, "state" : "TX" } +{ "_id" : "76116", "city" : "FORT WORTH", "loc" : [ -97.448279, 32.723032 ], "pop" : 38210, "state" : "TX" } +{ "_id" : "76117", "city" : "HALTOM CITY", "loc" : [ -97.27089100000001, 32.808742 ], "pop" : 27312, "state" : "TX" } +{ "_id" : "76118", "city" : "NORTH RICHLAND H", "loc" : [ -97.222781, 32.808944 ], "pop" : 9764, "state" : "TX" } +{ "_id" : "76119", "city" : "FORT WORTH", "loc" : [ -97.267492, 32.691379 ], "pop" : 36951, "state" : "TX" } +{ "_id" : "76120", "city" : "FORT WORTH", "loc" : [ -97.178112, 32.763912 ], "pop" : 8601, "state" : "TX" } +{ "_id" : "76123", "city" : "FORT WORTH", "loc" : [ -97.365838, 32.625361 ], "pop" : 5314, "state" : "TX" } +{ "_id" : "76126", "city" : "BENBROOK", "loc" : [ -97.464141, 32.670023 ], "pop" : 14301, "state" : "TX" } +{ "_id" : "76127", "city" : "CARSWELL AFB", "loc" : [ -97.435453, 32.771846 ], "pop" : 940, "state" : "TX" } +{ "_id" : "76131", "city" : "FORT WORTH", "loc" : [ -97.337656, 32.863156 ], "pop" : 3738, "state" : "TX" } +{ "_id" : "76132", "city" : "FORT WORTH", "loc" : [ -97.405626, 32.671092 ], "pop" : 13724, "state" : "TX" } +{ "_id" : "76133", "city" : "FORT WORTH", "loc" : [ -97.375849, 32.652561 ], "pop" : 44032, "state" : "TX" } +{ "_id" : "76134", "city" : "FORT WORTH", "loc" : [ -97.33246699999999, 32.646886 ], "pop" : 17442, "state" : "TX" } +{ "_id" : "76135", "city" : "FORT WORTH", "loc" : [ -97.45191, 32.824844 ], "pop" : 13135, "state" : "TX" } +{ "_id" : "76137", "city" : "FORT WORTH", "loc" : [ -97.289114, 32.866421 ], "pop" : 15226, "state" : "TX" } +{ "_id" : "76140", "city" : "EVERMAN", "loc" : [ -97.27040599999999, 32.631332 ], "pop" : 17658, "state" : "TX" } +{ "_id" : "76148", "city" : "WATAUGA", "loc" : [ -97.24902899999999, 32.8681 ], "pop" : 22794, "state" : "TX" } +{ "_id" : "76155", "city" : "FORT WORTH", "loc" : [ -97.050285, 32.824742 ], "pop" : 2096, "state" : "TX" } +{ "_id" : "76177", "city" : "FORT WORTH", "loc" : [ -97.332671, 32.901017 ], "pop" : 61, "state" : "TX" } +{ "_id" : "76179", "city" : "SAGINAW", "loc" : [ -97.403149, 32.872961 ], "pop" : 15143, "state" : "TX" } +{ "_id" : "76180", "city" : "NORTH RICHLAND H", "loc" : [ -97.220714, 32.853966 ], "pop" : 44496, "state" : "TX" } +{ "_id" : "76201", "city" : "DENTON", "loc" : [ -97.13143599999999, 33.22893 ], "pop" : 48643, "state" : "TX" } +{ "_id" : "76205", "city" : "DENTON", "loc" : [ -97.101833, 33.180106 ], "pop" : 27830, "state" : "TX" } +{ "_id" : "76225", "city" : "ALVORD", "loc" : [ -97.68848800000001, 33.36982 ], "pop" : 1748, "state" : "TX" } +{ "_id" : "76226", "city" : "ARGYLE", "loc" : [ -97.159977, 33.106244 ], "pop" : 4420, "state" : "TX" } +{ "_id" : "76227", "city" : "AUBREY", "loc" : [ -96.987866, 33.291997 ], "pop" : 3089, "state" : "TX" } +{ "_id" : "76228", "city" : "BELLEVUE", "loc" : [ -98.15737300000001, 33.58789 ], "pop" : 1697, "state" : "TX" } +{ "_id" : "76230", "city" : "BOWIE", "loc" : [ -97.83733700000001, 33.556796 ], "pop" : 8686, "state" : "TX" } +{ "_id" : "76233", "city" : "COLLINSVILLE", "loc" : [ -96.901365, 33.558012 ], "pop" : 1681, "state" : "TX" } +{ "_id" : "76234", "city" : "DECATUR", "loc" : [ -97.573995, 33.235077 ], "pop" : 9323, "state" : "TX" } +{ "_id" : "76238", "city" : "ERA", "loc" : [ -97.29235799999999, 33.50101 ], "pop" : 264, "state" : "TX" } +{ "_id" : "76239", "city" : "FORESTBURG", "loc" : [ -97.584774, 33.539778 ], "pop" : 805, "state" : "TX" } +{ "_id" : "76240", "city" : "LAKE KIOWA", "loc" : [ -97.103208, 33.625943 ], "pop" : 24108, "state" : "TX" } +{ "_id" : "76245", "city" : "GORDONVILLE", "loc" : [ -96.84027, 33.834283 ], "pop" : 1664, "state" : "TX" } +{ "_id" : "76247", "city" : "JUSTIN", "loc" : [ -97.309254, 33.073375 ], "pop" : 3422, "state" : "TX" } +{ "_id" : "76248", "city" : "KELLER", "loc" : [ -97.24888300000001, 32.927556 ], "pop" : 14313, "state" : "TX" } +{ "_id" : "76249", "city" : "KRUM", "loc" : [ -97.26745200000001, 33.27337 ], "pop" : 3198, "state" : "TX" } +{ "_id" : "76250", "city" : "LINDSAY", "loc" : [ -97.221436, 33.63601 ], "pop" : 610, "state" : "TX" } +{ "_id" : "76251", "city" : "MONTAGUE", "loc" : [ -97.72822600000001, 33.663899 ], "pop" : 617, "state" : "TX" } +{ "_id" : "76252", "city" : "MUENSTER", "loc" : [ -97.362409, 33.659549 ], "pop" : 3042, "state" : "TX" } +{ "_id" : "76255", "city" : "NOCONA", "loc" : [ -97.72698200000001, 33.798163 ], "pop" : 4365, "state" : "TX" } +{ "_id" : "76258", "city" : "PILOT POINT", "loc" : [ -96.944554, 33.370983 ], "pop" : 4183, "state" : "TX" } +{ "_id" : "76259", "city" : "PONDER", "loc" : [ -97.28481499999999, 33.177383 ], "pop" : 1443, "state" : "TX" } +{ "_id" : "76261", "city" : "RINGGOLD", "loc" : [ -97.94398200000001, 33.816392 ], "pop" : 243, "state" : "TX" } +{ "_id" : "76262", "city" : "TROPHY CLUB", "loc" : [ -97.20534600000001, 32.98639 ], "pop" : 11484, "state" : "TX" } +{ "_id" : "76263", "city" : "ROSSTON", "loc" : [ -97.454172, 33.483795 ], "pop" : 30, "state" : "TX" } +{ "_id" : "76264", "city" : "SADLER", "loc" : [ -96.840017, 33.730989 ], "pop" : 349, "state" : "TX" } +{ "_id" : "76265", "city" : "SAINT JO", "loc" : [ -97.55675599999999, 33.744024 ], "pop" : 2071, "state" : "TX" } +{ "_id" : "76266", "city" : "SANGER", "loc" : [ -97.181432, 33.356266 ], "pop" : 7440, "state" : "TX" } +{ "_id" : "76270", "city" : "SUNSET", "loc" : [ -97.77089100000001, 33.453909 ], "pop" : 487, "state" : "TX" } +{ "_id" : "76271", "city" : "TIOGA", "loc" : [ -96.909712, 33.467493 ], "pop" : 857, "state" : "TX" } +{ "_id" : "76272", "city" : "VALLEY VIEW", "loc" : [ -97.231053, 33.502166 ], "pop" : 2754, "state" : "TX" } +{ "_id" : "76273", "city" : "WHITESBORO", "loc" : [ -96.878984, 33.659021 ], "pop" : 5920, "state" : "TX" } +{ "_id" : "76301", "city" : "WICHITA FALLS", "loc" : [ -98.49764500000001, 33.905284 ], "pop" : 15309, "state" : "TX" } +{ "_id" : "76302", "city" : "WICHITA FALLS", "loc" : [ -98.493987, 33.864278 ], "pop" : 10724, "state" : "TX" } +{ "_id" : "76303", "city" : "WICHITA FALLS", "loc" : [ -98.460812, 33.899837 ], "pop" : 3922, "state" : "TX" } +{ "_id" : "76304", "city" : "WICHITA FALLS", "loc" : [ -98.500491, 33.930806 ], "pop" : 4529, "state" : "TX" } +{ "_id" : "76305", "city" : "WICHITA FALLS", "loc" : [ -98.540679, 33.937345 ], "pop" : 8522, "state" : "TX" } +{ "_id" : "76306", "city" : "WICHITA FALLS", "loc" : [ -98.524835, 33.974595 ], "pop" : 6808, "state" : "TX" } +{ "_id" : "76308", "city" : "WICHITA FALLS", "loc" : [ -98.53396499999999, 33.863258 ], "pop" : 19151, "state" : "TX" } +{ "_id" : "76309", "city" : "WICHITA FALLS", "loc" : [ -98.534288, 33.893084 ], "pop" : 12500, "state" : "TX" } +{ "_id" : "76310", "city" : "WICHITA FALLS", "loc" : [ -98.575548, 33.858122 ], "pop" : 11497, "state" : "TX" } +{ "_id" : "76311", "city" : "SHEPPARD AFB", "loc" : [ -98.508771, 33.982353 ], "pop" : 7080, "state" : "TX" } +{ "_id" : "76354", "city" : "BURKBURNETT", "loc" : [ -98.570842, 34.085989 ], "pop" : 10558, "state" : "TX" } +{ "_id" : "76357", "city" : "BYERS", "loc" : [ -98.18392900000001, 34.072812 ], "pop" : 665, "state" : "TX" } +{ "_id" : "76359", "city" : "ELBERT", "loc" : [ -99.05521400000001, 33.015687 ], "pop" : 445, "state" : "TX" } +{ "_id" : "76360", "city" : "ELECTRA", "loc" : [ -98.91545000000001, 34.036234 ], "pop" : 3580, "state" : "TX" } +{ "_id" : "76363", "city" : "GOREE", "loc" : [ -99.525806, 33.474832 ], "pop" : 523, "state" : "TX" } +{ "_id" : "76364", "city" : "HARROLD", "loc" : [ -99.03505199999999, 34.097097 ], "pop" : 369, "state" : "TX" } +{ "_id" : "76365", "city" : "HENRIETTA", "loc" : [ -98.25997599999999, 33.819609 ], "pop" : 6020, "state" : "TX" } +{ "_id" : "76366", "city" : "HOLLIDAY", "loc" : [ -98.657634, 33.675141 ], "pop" : 5949, "state" : "TX" } +{ "_id" : "76367", "city" : "IOWA PARK", "loc" : [ -98.674497, 33.94235 ], "pop" : 9443, "state" : "TX" } +{ "_id" : "76371", "city" : "MUNDAY", "loc" : [ -99.63262400000001, 33.456088 ], "pop" : 2028, "state" : "TX" } +{ "_id" : "76372", "city" : "NEWCASTLE", "loc" : [ -98.74464399999999, 33.190103 ], "pop" : 905, "state" : "TX" } +{ "_id" : "76373", "city" : "OKLAUNION", "loc" : [ -99.160234, 34.120372 ], "pop" : 338, "state" : "TX" } +{ "_id" : "76374", "city" : "OLNEY", "loc" : [ -98.742695, 33.360135 ], "pop" : 4554, "state" : "TX" } +{ "_id" : "76377", "city" : "PETROLIA", "loc" : [ -98.269223, 34.027331 ], "pop" : 1642, "state" : "TX" } +{ "_id" : "76379", "city" : "SCOTLAND", "loc" : [ -98.464983, 33.653486 ], "pop" : 398, "state" : "TX" } +{ "_id" : "76380", "city" : "SEYMOUR", "loc" : [ -99.25872699999999, 33.591445 ], "pop" : 4208, "state" : "TX" } +{ "_id" : "76383", "city" : "VERA", "loc" : [ -99.75909799999999, 33.615469 ], "pop" : 481, "state" : "TX" } +{ "_id" : "76384", "city" : "VERNON", "loc" : [ -99.30301, 34.149135 ], "pop" : 14414, "state" : "TX" } +{ "_id" : "76388", "city" : "WEINERT", "loc" : [ -99.666431, 33.324872 ], "pop" : 301, "state" : "TX" } +{ "_id" : "76389", "city" : "WINDTHORST", "loc" : [ -98.437589, 33.57957 ], "pop" : 381, "state" : "TX" } +{ "_id" : "76401", "city" : "STEPHENVILLE", "loc" : [ -98.222407, 32.221372 ], "pop" : 19745, "state" : "TX" } +{ "_id" : "76424", "city" : "BRECKENRIDGE", "loc" : [ -98.909882, 32.753166 ], "pop" : 8803, "state" : "TX" } +{ "_id" : "76426", "city" : "BRIDGEPORT", "loc" : [ -97.78098, 33.187027 ], "pop" : 9158, "state" : "TX" } +{ "_id" : "76427", "city" : "BRYSON", "loc" : [ -98.370256, 33.15947 ], "pop" : 915, "state" : "TX" } +{ "_id" : "76429", "city" : "CADDO", "loc" : [ -98.65898300000001, 32.688617 ], "pop" : 127, "state" : "TX" } +{ "_id" : "76430", "city" : "ALBANY", "loc" : [ -99.319581, 32.719005 ], "pop" : 2858, "state" : "TX" } +{ "_id" : "76431", "city" : "CHICO", "loc" : [ -97.803133, 33.319315 ], "pop" : 2657, "state" : "TX" } +{ "_id" : "76432", "city" : "BLANKET", "loc" : [ -98.83108900000001, 31.78819 ], "pop" : 1929, "state" : "TX" } +{ "_id" : "76433", "city" : "BLUFF DALE", "loc" : [ -98.163775, 32.401791 ], "pop" : 1751, "state" : "TX" } +{ "_id" : "76435", "city" : "CARBON", "loc" : [ -98.83479, 32.270125 ], "pop" : 462, "state" : "TX" } +{ "_id" : "76436", "city" : "CARLTON", "loc" : [ -98.152519, 31.911438 ], "pop" : 235, "state" : "TX" } +{ "_id" : "76437", "city" : "CISCO", "loc" : [ -98.986507, 32.380043 ], "pop" : 4906, "state" : "TX" } +{ "_id" : "76442", "city" : "COMANCHE", "loc" : [ -98.608227, 31.911637 ], "pop" : 7208, "state" : "TX" } +{ "_id" : "76443", "city" : "CROSS PLAINS", "loc" : [ -99.18718, 32.148159 ], "pop" : 1928, "state" : "TX" } +{ "_id" : "76444", "city" : "DE LEON", "loc" : [ -98.54894, 32.108742 ], "pop" : 4401, "state" : "TX" } +{ "_id" : "76445", "city" : "DESDEMONA", "loc" : [ -98.56732700000001, 32.281877 ], "pop" : 366, "state" : "TX" } +{ "_id" : "76446", "city" : "DUBLIN", "loc" : [ -98.34546899999999, 32.090873 ], "pop" : 5029, "state" : "TX" } +{ "_id" : "76448", "city" : "EASTLAND", "loc" : [ -98.807101, 32.399418 ], "pop" : 5837, "state" : "TX" } +{ "_id" : "76449", "city" : "GRAFORD", "loc" : [ -98.337002, 32.924192 ], "pop" : 2235, "state" : "TX" } +{ "_id" : "76450", "city" : "GRAHAM", "loc" : [ -98.583212, 33.099283 ], "pop" : 12511, "state" : "TX" } +{ "_id" : "76453", "city" : "GORDON", "loc" : [ -98.36321100000001, 32.547828 ], "pop" : 566, "state" : "TX" } +{ "_id" : "76454", "city" : "GORMAN", "loc" : [ -98.683408, 32.223441 ], "pop" : 1773, "state" : "TX" } +{ "_id" : "76455", "city" : "GUSTINE", "loc" : [ -98.383488, 31.872448 ], "pop" : 1680, "state" : "TX" } +{ "_id" : "76457", "city" : "HICO", "loc" : [ -98.024933, 31.959718 ], "pop" : 1962, "state" : "TX" } +{ "_id" : "76458", "city" : "JACKSBORO", "loc" : [ -98.168138, 33.234655 ], "pop" : 4664, "state" : "TX" } +{ "_id" : "76459", "city" : "JERMYN", "loc" : [ -98.39314899999999, 33.263554 ], "pop" : 154, "state" : "TX" } +{ "_id" : "76460", "city" : "LOVING", "loc" : [ -98.50237, 33.26886 ], "pop" : 156, "state" : "TX" } +{ "_id" : "76462", "city" : "LIPAN", "loc" : [ -97.953614, 32.507218 ], "pop" : 1582, "state" : "TX" } +{ "_id" : "76463", "city" : "MINGUS", "loc" : [ -98.42626199999999, 32.562665 ], "pop" : 278, "state" : "TX" } +{ "_id" : "76464", "city" : "MORAN", "loc" : [ -99.165567, 32.554909 ], "pop" : 458, "state" : "TX" } +{ "_id" : "76470", "city" : "RANGER", "loc" : [ -98.67465900000001, 32.46809 ], "pop" : 3414, "state" : "TX" } +{ "_id" : "76471", "city" : "RISING STAR", "loc" : [ -98.98585199999999, 32.127986 ], "pop" : 1810, "state" : "TX" } +{ "_id" : "76472", "city" : "SANTO", "loc" : [ -98.179675, 32.597935 ], "pop" : 1433, "state" : "TX" } +{ "_id" : "76474", "city" : "SIDNEY", "loc" : [ -98.767995, 31.932031 ], "pop" : 92, "state" : "TX" } +{ "_id" : "76475", "city" : "STRAWN", "loc" : [ -98.499467, 32.5945 ], "pop" : 968, "state" : "TX" } +{ "_id" : "76476", "city" : "TOLAR", "loc" : [ -97.880208, 32.377246 ], "pop" : 2586, "state" : "TX" } +{ "_id" : "76483", "city" : "THROCKMORTON", "loc" : [ -99.183812, 33.179446 ], "pop" : 1321, "state" : "TX" } +{ "_id" : "76484", "city" : "PALO PINTO", "loc" : [ -98.270262, 32.725315 ], "pop" : 867, "state" : "TX" } +{ "_id" : "76486", "city" : "PERRIN", "loc" : [ -98.044006, 33.058453 ], "pop" : 1065, "state" : "TX" } +{ "_id" : "76487", "city" : "POOLVILLE", "loc" : [ -97.847229, 32.968023 ], "pop" : 1549, "state" : "TX" } +{ "_id" : "76490", "city" : "WHITT", "loc" : [ -98.02100799999999, 32.955459 ], "pop" : 305, "state" : "TX" } +{ "_id" : "76491", "city" : "WOODSON", "loc" : [ -99.015953, 33.301972 ], "pop" : 114, "state" : "TX" } +{ "_id" : "76501", "city" : "TEMPLE", "loc" : [ -97.334264, 31.089518 ], "pop" : 16400, "state" : "TX" } +{ "_id" : "76502", "city" : "TEMPLE", "loc" : [ -97.389781, 31.071004 ], "pop" : 15632, "state" : "TX" } +{ "_id" : "76504", "city" : "TEMPLE", "loc" : [ -97.36476399999999, 31.091742 ], "pop" : 20273, "state" : "TX" } +{ "_id" : "76511", "city" : "BARTLETT", "loc" : [ -97.42630200000001, 30.799056 ], "pop" : 727, "state" : "TX" } +{ "_id" : "76513", "city" : "BELTON", "loc" : [ -97.472025, 31.072298 ], "pop" : 20331, "state" : "TX" } +{ "_id" : "76518", "city" : "BUCKHOLTS", "loc" : [ -97.124135, 30.885756 ], "pop" : 1072, "state" : "TX" } +{ "_id" : "76519", "city" : "BURLINGTON", "loc" : [ -96.88530799999999, 30.945691 ], "pop" : 1312, "state" : "TX" } +{ "_id" : "76520", "city" : "CAMERON", "loc" : [ -96.976562, 30.852713 ], "pop" : 6965, "state" : "TX" } +{ "_id" : "76522", "city" : "IZORO", "loc" : [ -97.912132, 31.125799 ], "pop" : 26431, "state" : "TX" } +{ "_id" : "76523", "city" : "DAVILLA", "loc" : [ -97.20086499999999, 30.767471 ], "pop" : 1079, "state" : "TX" } +{ "_id" : "76524", "city" : "EDDY", "loc" : [ -97.270926, 31.326724 ], "pop" : 2544, "state" : "TX" } +{ "_id" : "76525", "city" : "BEE HOUSE", "loc" : [ -98.05517500000001, 31.403967 ], "pop" : 1179, "state" : "TX" } +{ "_id" : "76526", "city" : "FLAT", "loc" : [ -97.589777, 31.306475 ], "pop" : 774, "state" : "TX" } +{ "_id" : "76527", "city" : "FLORENCE", "loc" : [ -97.834423, 30.78137 ], "pop" : 3703, "state" : "TX" } +{ "_id" : "76528", "city" : "TURNERSVILLE", "loc" : [ -97.72428600000001, 31.447646 ], "pop" : 14415, "state" : "TX" } +{ "_id" : "76530", "city" : "GRANGER", "loc" : [ -97.445065, 30.739813 ], "pop" : 3160, "state" : "TX" } +{ "_id" : "76531", "city" : "HAMILTON", "loc" : [ -98.113051, 31.678116 ], "pop" : 5260, "state" : "TX" } +{ "_id" : "76534", "city" : "HOLLAND", "loc" : [ -97.385695, 30.879977 ], "pop" : 2223, "state" : "TX" } +{ "_id" : "76537", "city" : "JARRELL", "loc" : [ -97.60083299999999, 30.748406 ], "pop" : 3430, "state" : "TX" } +{ "_id" : "76538", "city" : "JONESBORO", "loc" : [ -97.775155, 31.599601 ], "pop" : 793, "state" : "TX" } +{ "_id" : "76539", "city" : "KEMPNER", "loc" : [ -97.97206799999999, 31.073051 ], "pop" : 3884, "state" : "TX" } +{ "_id" : "76541", "city" : "KILLEEN", "loc" : [ -97.727808, 31.116426 ], "pop" : 22853, "state" : "TX" } +{ "_id" : "76542", "city" : "HARKER HEIGHTS", "loc" : [ -97.746736, 31.075056 ], "pop" : 25829, "state" : "TX" } +{ "_id" : "76543", "city" : "HARKER HEIGHTS", "loc" : [ -97.67686399999999, 31.100505 ], "pop" : 35052, "state" : "TX" } +{ "_id" : "76544", "city" : "FORT HOOD", "loc" : [ -97.776404, 31.137953 ], "pop" : 36657, "state" : "TX" } +{ "_id" : "76550", "city" : "LAMPASAS", "loc" : [ -98.183361, 31.067957 ], "pop" : 7698, "state" : "TX" } +{ "_id" : "76556", "city" : "MILANO", "loc" : [ -96.803477, 30.736612 ], "pop" : 2187, "state" : "TX" } +{ "_id" : "76557", "city" : "MOODY", "loc" : [ -97.40995700000001, 31.253321 ], "pop" : 4411, "state" : "TX" } +{ "_id" : "76559", "city" : "NOLANVILLE", "loc" : [ -97.594109, 31.083271 ], "pop" : 1820, "state" : "TX" } +{ "_id" : "76561", "city" : "OGLESBY", "loc" : [ -97.550093, 31.443767 ], "pop" : 1221, "state" : "TX" } +{ "_id" : "76565", "city" : "POTTSVILLE", "loc" : [ -98.356077, 31.68374 ], "pop" : 279, "state" : "TX" } +{ "_id" : "76566", "city" : "PURMELA", "loc" : [ -97.88894500000001, 31.472647 ], "pop" : 1111, "state" : "TX" } +{ "_id" : "76567", "city" : "ROCKDALE", "loc" : [ -97.00790000000001, 30.658282 ], "pop" : 8052, "state" : "TX" } +{ "_id" : "76569", "city" : "ROGERS", "loc" : [ -97.222793, 30.955013 ], "pop" : 2565, "state" : "TX" } +{ "_id" : "76570", "city" : "ROSEBUD", "loc" : [ -96.975455, 31.092208 ], "pop" : 3093, "state" : "TX" } +{ "_id" : "76571", "city" : "SALADO", "loc" : [ -97.532999, 30.949388 ], "pop" : 3454, "state" : "TX" } +{ "_id" : "76574", "city" : "TAYLOR", "loc" : [ -97.44010299999999, 30.58071 ], "pop" : 14135, "state" : "TX" } +{ "_id" : "76577", "city" : "THORNDALE", "loc" : [ -97.176446, 30.608237 ], "pop" : 2279, "state" : "TX" } +{ "_id" : "76578", "city" : "THRALL", "loc" : [ -97.289261, 30.591981 ], "pop" : 852, "state" : "TX" } +{ "_id" : "76579", "city" : "TROY", "loc" : [ -97.285205, 31.175855 ], "pop" : 3791, "state" : "TX" } +{ "_id" : "76621", "city" : "ABBOTT", "loc" : [ -97.06714599999999, 31.891642 ], "pop" : 577, "state" : "TX" } +{ "_id" : "76622", "city" : "AQUILLA", "loc" : [ -97.22577, 31.858882 ], "pop" : 1901, "state" : "TX" } +{ "_id" : "76624", "city" : "AXTELL", "loc" : [ -96.988178, 31.660966 ], "pop" : 3235, "state" : "TX" } +{ "_id" : "76626", "city" : "BLOOMING GROVE", "loc" : [ -96.700991, 32.075839 ], "pop" : 1594, "state" : "TX" } +{ "_id" : "76627", "city" : "BLUM", "loc" : [ -97.365183, 32.105183 ], "pop" : 2737, "state" : "TX" } +{ "_id" : "76629", "city" : "BREMOND", "loc" : [ -96.66974399999999, 31.156007 ], "pop" : 1883, "state" : "TX" } +{ "_id" : "76630", "city" : "BRUCEVILLE", "loc" : [ -97.234244, 31.326708 ], "pop" : 477, "state" : "TX" } +{ "_id" : "76631", "city" : "BYNUM", "loc" : [ -96.98370199999999, 31.990668 ], "pop" : 496, "state" : "TX" } +{ "_id" : "76632", "city" : "CHILTON", "loc" : [ -97.09002, 31.310018 ], "pop" : 2304, "state" : "TX" } +{ "_id" : "76633", "city" : "CHINA SPRING", "loc" : [ -97.30022099999999, 31.667266 ], "pop" : 3030, "state" : "TX" } +{ "_id" : "76634", "city" : "LAGUNA PARK", "loc" : [ -97.515282, 31.799689 ], "pop" : 6410, "state" : "TX" } +{ "_id" : "76635", "city" : "COOLIDGE", "loc" : [ -96.65774399999999, 31.743804 ], "pop" : 1042, "state" : "TX" } +{ "_id" : "76636", "city" : "COVINGTON", "loc" : [ -97.259091, 32.159538 ], "pop" : 767, "state" : "TX" } +{ "_id" : "76637", "city" : "CRANFILLS GAP", "loc" : [ -97.78537, 31.781071 ], "pop" : 687, "state" : "TX" } +{ "_id" : "76638", "city" : "CRAWFORD", "loc" : [ -97.38999200000001, 31.559765 ], "pop" : 3473, "state" : "TX" } +{ "_id" : "76639", "city" : "DAWSON", "loc" : [ -96.708483, 31.897429 ], "pop" : 1457, "state" : "TX" } +{ "_id" : "76640", "city" : "ELM MOTT", "loc" : [ -97.113838, 31.672547 ], "pop" : 4183, "state" : "TX" } +{ "_id" : "76641", "city" : "FROST", "loc" : [ -96.76843700000001, 32.027545 ], "pop" : 1831, "state" : "TX" } +{ "_id" : "76642", "city" : "GROESBECK", "loc" : [ -96.523381, 31.535667 ], "pop" : 5538, "state" : "TX" } +{ "_id" : "76643", "city" : "HEWITT", "loc" : [ -97.196556, 31.458166 ], "pop" : 8487, "state" : "TX" } +{ "_id" : "76645", "city" : "HILLSBORO", "loc" : [ -97.11979100000001, 32.014942 ], "pop" : 8966, "state" : "TX" } +{ "_id" : "76648", "city" : "HUBBARD", "loc" : [ -96.80001, 31.843559 ], "pop" : 2015, "state" : "TX" } +{ "_id" : "76649", "city" : "IREDELL", "loc" : [ -97.879283, 31.972197 ], "pop" : 813, "state" : "TX" } +{ "_id" : "76651", "city" : "ITALY", "loc" : [ -96.88229, 32.178508 ], "pop" : 2321, "state" : "TX" } +{ "_id" : "76652", "city" : "KOPPERL", "loc" : [ -97.542085, 32.103491 ], "pop" : 820, "state" : "TX" } +{ "_id" : "76653", "city" : "KOSSE", "loc" : [ -96.61947499999999, 31.314704 ], "pop" : 854, "state" : "TX" } +{ "_id" : "76655", "city" : "LORENA", "loc" : [ -97.230161, 31.409271 ], "pop" : 4007, "state" : "TX" } +{ "_id" : "76656", "city" : "LOTT", "loc" : [ -97.058143, 31.192462 ], "pop" : 2005, "state" : "TX" } +{ "_id" : "76657", "city" : "MC GREGOR", "loc" : [ -97.394318, 31.443099 ], "pop" : 5853, "state" : "TX" } +{ "_id" : "76660", "city" : "MALONE", "loc" : [ -96.890682, 31.923979 ], "pop" : 491, "state" : "TX" } +{ "_id" : "76661", "city" : "MARLIN", "loc" : [ -96.888942, 31.303592 ], "pop" : 8810, "state" : "TX" } +{ "_id" : "76664", "city" : "MART", "loc" : [ -96.838133, 31.545798 ], "pop" : 2588, "state" : "TX" } +{ "_id" : "76665", "city" : "MERIDIAN", "loc" : [ -97.64433, 31.929022 ], "pop" : 2354, "state" : "TX" } +{ "_id" : "76666", "city" : "MERTENS", "loc" : [ -96.898128, 32.02753 ], "pop" : 328, "state" : "TX" } +{ "_id" : "76667", "city" : "MEXIA", "loc" : [ -96.495186, 31.678386 ], "pop" : 10971, "state" : "TX" } +{ "_id" : "76670", "city" : "MILFORD", "loc" : [ -96.96115, 32.148198 ], "pop" : 1259, "state" : "TX" } +{ "_id" : "76671", "city" : "MORGAN", "loc" : [ -97.560829, 32.01946 ], "pop" : 1403, "state" : "TX" } +{ "_id" : "76673", "city" : "MOUNT CALM", "loc" : [ -96.89439299999999, 31.757504 ], "pop" : 612, "state" : "TX" } +{ "_id" : "76675", "city" : "OTTO", "loc" : [ -96.87590400000001, 31.432733 ], "pop" : 776, "state" : "TX" } +{ "_id" : "76676", "city" : "PENELOPE", "loc" : [ -96.937164, 31.855148 ], "pop" : 613, "state" : "TX" } +{ "_id" : "76678", "city" : "PRAIRIE HILL", "loc" : [ -96.809381, 31.659097 ], "pop" : 657, "state" : "TX" } +{ "_id" : "76679", "city" : "PURDON", "loc" : [ -96.58561899999999, 31.948285 ], "pop" : 752, "state" : "TX" } +{ "_id" : "76680", "city" : "REAGAN", "loc" : [ -96.74194300000001, 31.229713 ], "pop" : 796, "state" : "TX" } +{ "_id" : "76681", "city" : "RICHLAND", "loc" : [ -96.437262, 31.901785 ], "pop" : 512, "state" : "TX" } +{ "_id" : "76682", "city" : "RIESEL", "loc" : [ -96.94764000000001, 31.500247 ], "pop" : 2488, "state" : "TX" } +{ "_id" : "76687", "city" : "THORNTON", "loc" : [ -96.50237799999999, 31.408326 ], "pop" : 1438, "state" : "TX" } +{ "_id" : "76689", "city" : "VALLEY MILLS", "loc" : [ -97.493461, 31.659876 ], "pop" : 1796, "state" : "TX" } +{ "_id" : "76690", "city" : "WALNUT SPRINGS", "loc" : [ -97.751423, 32.059268 ], "pop" : 842, "state" : "TX" } +{ "_id" : "76691", "city" : "WEST", "loc" : [ -97.125843, 31.775385 ], "pop" : 6222, "state" : "TX" } +{ "_id" : "76692", "city" : "BONANZA", "loc" : [ -97.33495000000001, 31.959201 ], "pop" : 5302, "state" : "TX" } +{ "_id" : "76693", "city" : "WORTHAM", "loc" : [ -96.420208, 31.786542 ], "pop" : 1602, "state" : "TX" } +{ "_id" : "76701", "city" : "WACO", "loc" : [ -97.139608, 31.552452 ], "pop" : 1752, "state" : "TX" } +{ "_id" : "76704", "city" : "BELLMEAD", "loc" : [ -97.12674199999999, 31.575701 ], "pop" : 8919, "state" : "TX" } +{ "_id" : "76705", "city" : "BELLMEAD", "loc" : [ -97.09457500000001, 31.610787 ], "pop" : 18763, "state" : "TX" } +{ "_id" : "76706", "city" : "WACO", "loc" : [ -97.11975200000001, 31.517086 ], "pop" : 31263, "state" : "TX" } +{ "_id" : "76707", "city" : "WACO", "loc" : [ -97.158824, 31.552709 ], "pop" : 15905, "state" : "TX" } +{ "_id" : "76708", "city" : "WACO", "loc" : [ -97.178635, 31.576544 ], "pop" : 18436, "state" : "TX" } +{ "_id" : "76710", "city" : "WACO", "loc" : [ -97.189891, 31.534981 ], "pop" : 22014, "state" : "TX" } +{ "_id" : "76711", "city" : "BEVERLY HILLS", "loc" : [ -97.150254, 31.519863 ], "pop" : 8736, "state" : "TX" } +{ "_id" : "76712", "city" : "WOODWAY", "loc" : [ -97.23106199999999, 31.505074 ], "pop" : 14756, "state" : "TX" } +{ "_id" : "76801", "city" : "EARLY", "loc" : [ -98.97516400000001, 31.704658 ], "pop" : 24634, "state" : "TX" } +{ "_id" : "76820", "city" : "ART", "loc" : [ -99.093732, 30.775419 ], "pop" : 24, "state" : "TX" } +{ "_id" : "76821", "city" : "BALLINGER", "loc" : [ -99.958927, 31.746836 ], "pop" : 4957, "state" : "TX" } +{ "_id" : "76823", "city" : "BANGS", "loc" : [ -99.107657, 31.768388 ], "pop" : 5681, "state" : "TX" } +{ "_id" : "76824", "city" : "BEND", "loc" : [ -98.482102, 31.11231 ], "pop" : 1, "state" : "TX" } +{ "_id" : "76825", "city" : "FIFE", "loc" : [ -99.3372, 31.128304 ], "pop" : 7280, "state" : "TX" } +{ "_id" : "76827", "city" : "BROOKESMITH", "loc" : [ -99.127729, 31.517602 ], "pop" : 240, "state" : "TX" } +{ "_id" : "76828", "city" : "BURKETT", "loc" : [ -99.255258, 31.998623 ], "pop" : 237, "state" : "TX" } +{ "_id" : "76831", "city" : "CASTELL", "loc" : [ -98.931859, 30.697429 ], "pop" : 64, "state" : "TX" } +{ "_id" : "76832", "city" : "CHEROKEE", "loc" : [ -98.66332, 30.980598 ], "pop" : 127, "state" : "TX" } +{ "_id" : "76834", "city" : "COLEMAN", "loc" : [ -99.427007, 31.828651 ], "pop" : 6300, "state" : "TX" } +{ "_id" : "76836", "city" : "DOOLE", "loc" : [ -99.550605, 31.415743 ], "pop" : 86, "state" : "TX" } +{ "_id" : "76837", "city" : "EDEN", "loc" : [ -99.840658, 31.219219 ], "pop" : 2028, "state" : "TX" } +{ "_id" : "76841", "city" : "FORT MC KAVETT", "loc" : [ -100.080928, 30.82903 ], "pop" : 47, "state" : "TX" } +{ "_id" : "76842", "city" : "FREDONIA", "loc" : [ -99.12156, 30.921386 ], "pop" : 72, "state" : "TX" } +{ "_id" : "76844", "city" : "GOLDTHWAITE", "loc" : [ -98.574405, 31.445769 ], "pop" : 2523, "state" : "TX" } +{ "_id" : "76845", "city" : "GOULDBUSK", "loc" : [ -99.51363000000001, 31.551075 ], "pop" : 159, "state" : "TX" } +{ "_id" : "76848", "city" : "HEXT", "loc" : [ -99.554008, 30.881632 ], "pop" : 60, "state" : "TX" } +{ "_id" : "76849", "city" : "JUNCTION", "loc" : [ -99.74731, 30.47544 ], "pop" : 3248, "state" : "TX" } +{ "_id" : "76852", "city" : "LOHN", "loc" : [ -99.38334, 31.317297 ], "pop" : 233, "state" : "TX" } +{ "_id" : "76853", "city" : "LOMETA", "loc" : [ -98.400553, 31.216712 ], "pop" : 1215, "state" : "TX" } +{ "_id" : "76854", "city" : "LONDON", "loc" : [ -99.62552700000001, 30.617101 ], "pop" : 465, "state" : "TX" } +{ "_id" : "76856", "city" : "MASON", "loc" : [ -99.226117, 30.743392 ], "pop" : 3182, "state" : "TX" } +{ "_id" : "76857", "city" : "MAY", "loc" : [ -98.96564600000001, 31.957082 ], "pop" : 1454, "state" : "TX" } +{ "_id" : "76858", "city" : "MELVIN", "loc" : [ -99.54389999999999, 31.185145 ], "pop" : 361, "state" : "TX" } +{ "_id" : "76859", "city" : "MENARD", "loc" : [ -99.784721, 30.911898 ], "pop" : 2145, "state" : "TX" } +{ "_id" : "76861", "city" : "MILES", "loc" : [ -100.182292, 31.612052 ], "pop" : 1102, "state" : "TX" } +{ "_id" : "76862", "city" : "MILLERSVIEW", "loc" : [ -99.71713699999999, 31.416745 ], "pop" : 137, "state" : "TX" } +{ "_id" : "76864", "city" : "MULLIN", "loc" : [ -98.66354200000001, 31.574829 ], "pop" : 1281, "state" : "TX" } +{ "_id" : "76865", "city" : "NORTON", "loc" : [ -100.131515, 31.879498 ], "pop" : 244, "state" : "TX" } +{ "_id" : "76866", "city" : "PAINT ROCK", "loc" : [ -99.91393600000001, 31.504808 ], "pop" : 400, "state" : "TX" } +{ "_id" : "76867", "city" : "PEAR VALLEY", "loc" : [ -99.494742, 31.297211 ], "pop" : 110, "state" : "TX" } +{ "_id" : "76869", "city" : "PONTOTOC", "loc" : [ -99.021224, 30.890617 ], "pop" : 113, "state" : "TX" } +{ "_id" : "76870", "city" : "PRIDDY", "loc" : [ -98.501464, 31.687418 ], "pop" : 122, "state" : "TX" } +{ "_id" : "76871", "city" : "RICHLAND SPRINGS", "loc" : [ -98.850731, 31.275317 ], "pop" : 1103, "state" : "TX" } +{ "_id" : "76872", "city" : "ROCHELLE", "loc" : [ -99.157229, 31.300011 ], "pop" : 761, "state" : "TX" } +{ "_id" : "76873", "city" : "ROCKWOOD", "loc" : [ -99.374579, 31.503677 ], "pop" : 63, "state" : "TX" } +{ "_id" : "76874", "city" : "ROOSEVELT", "loc" : [ -99.916501, 30.532203 ], "pop" : 382, "state" : "TX" } +{ "_id" : "76875", "city" : "ROWENA", "loc" : [ -100.019094, 31.64355 ], "pop" : 802, "state" : "TX" } +{ "_id" : "76877", "city" : "SAN SABA", "loc" : [ -98.730929, 31.162678 ], "pop" : 4023, "state" : "TX" } +{ "_id" : "76878", "city" : "SANTA ANNA", "loc" : [ -99.321197, 31.721477 ], "pop" : 1835, "state" : "TX" } +{ "_id" : "76880", "city" : "STAR", "loc" : [ -98.415752, 31.479039 ], "pop" : 605, "state" : "TX" } +{ "_id" : "76882", "city" : "TALPA", "loc" : [ -99.674679, 31.803424 ], "pop" : 240, "state" : "TX" } +{ "_id" : "76883", "city" : "TELEGRAPH", "loc" : [ -99.928369, 30.367365 ], "pop" : 27, "state" : "TX" } +{ "_id" : "76884", "city" : "VALERA", "loc" : [ -99.563962, 31.77314 ], "pop" : 201, "state" : "TX" } +{ "_id" : "76885", "city" : "VALLEY SPRING", "loc" : [ -98.83254100000001, 30.836862 ], "pop" : 270, "state" : "TX" } +{ "_id" : "76887", "city" : "VOCA", "loc" : [ -99.16820300000001, 30.995874 ], "pop" : 94, "state" : "TX" } +{ "_id" : "76888", "city" : "LEADAY", "loc" : [ -99.53853599999999, 31.639194 ], "pop" : 227, "state" : "TX" } +{ "_id" : "76890", "city" : "ZEPHYR", "loc" : [ -98.81819900000001, 31.669429 ], "pop" : 433, "state" : "TX" } +{ "_id" : "76901", "city" : "SAN ANGELO", "loc" : [ -100.481752, 31.478165 ], "pop" : 23800, "state" : "TX" } +{ "_id" : "76903", "city" : "SAN ANGELO", "loc" : [ -100.438586, 31.470735 ], "pop" : 32471, "state" : "TX" } +{ "_id" : "76904", "city" : "SAN ANGELO", "loc" : [ -100.480036, 31.419411 ], "pop" : 25535, "state" : "TX" } +{ "_id" : "76905", "city" : "SAN ANGELO", "loc" : [ -100.390005, 31.464738 ], "pop" : 11284, "state" : "TX" } +{ "_id" : "76930", "city" : "BARNHART", "loc" : [ -101.191752, 31.159647 ], "pop" : 178, "state" : "TX" } +{ "_id" : "76932", "city" : "BEST", "loc" : [ -101.478776, 31.240592 ], "pop" : 4514, "state" : "TX" } +{ "_id" : "76933", "city" : "BRONTE", "loc" : [ -100.298765, 31.878939 ], "pop" : 1291, "state" : "TX" } +{ "_id" : "76934", "city" : "CARLSBAD", "loc" : [ -100.627501, 31.597995 ], "pop" : 1886, "state" : "TX" } +{ "_id" : "76935", "city" : "CHRISTOVAL", "loc" : [ -100.52031, 31.23461 ], "pop" : 1639, "state" : "TX" } +{ "_id" : "76936", "city" : "ELDORADO", "loc" : [ -100.58894, 30.86667 ], "pop" : 2990, "state" : "TX" } +{ "_id" : "76937", "city" : "EOLA", "loc" : [ -100.072892, 31.429812 ], "pop" : 479, "state" : "TX" } +{ "_id" : "76940", "city" : "MERETA", "loc" : [ -100.183391, 31.48632 ], "pop" : 768, "state" : "TX" } +{ "_id" : "76941", "city" : "MERTZON", "loc" : [ -100.822101, 31.282884 ], "pop" : 1451, "state" : "TX" } +{ "_id" : "76943", "city" : "OZONA", "loc" : [ -101.238802, 30.716369 ], "pop" : 4076, "state" : "TX" } +{ "_id" : "76945", "city" : "ROBERT LEE", "loc" : [ -100.510366, 31.895091 ], "pop" : 1826, "state" : "TX" } +{ "_id" : "76949", "city" : "SILVER", "loc" : [ -100.692229, 32.048371 ], "pop" : 45, "state" : "TX" } +{ "_id" : "76950", "city" : "SONORA", "loc" : [ -100.630667, 30.555752 ], "pop" : 4135, "state" : "TX" } +{ "_id" : "76951", "city" : "STERLING CITY", "loc" : [ -101.001729, 31.835063 ], "pop" : 1438, "state" : "TX" } +{ "_id" : "76955", "city" : "VANCOURT", "loc" : [ -100.180367, 31.340417 ], "pop" : 256, "state" : "TX" } +{ "_id" : "76957", "city" : "WALL", "loc" : [ -100.322132, 31.369445 ], "pop" : 819, "state" : "TX" } +{ "_id" : "77002", "city" : "HOUSTON", "loc" : [ -95.35936100000001, 29.759366 ], "pop" : 7658, "state" : "TX" } +{ "_id" : "77003", "city" : "HOUSTON", "loc" : [ -95.339108, 29.748903 ], "pop" : 8500, "state" : "TX" } +{ "_id" : "77004", "city" : "HOUSTON", "loc" : [ -95.36254599999999, 29.724687 ], "pop" : 29940, "state" : "TX" } +{ "_id" : "77005", "city" : "HOUSTON", "loc" : [ -95.426261, 29.717856 ], "pop" : 21772, "state" : "TX" } +{ "_id" : "77006", "city" : "HOUSTON", "loc" : [ -95.39225500000001, 29.740899 ], "pop" : 17653, "state" : "TX" } +{ "_id" : "77007", "city" : "HOUSTON", "loc" : [ -95.40342099999999, 29.773603 ], "pop" : 22511, "state" : "TX" } +{ "_id" : "77008", "city" : "HOUSTON", "loc" : [ -95.41179700000001, 29.799096 ], "pop" : 29653, "state" : "TX" } +{ "_id" : "77009", "city" : "HOUSTON", "loc" : [ -95.367481, 29.793558 ], "pop" : 42521, "state" : "TX" } +{ "_id" : "77010", "city" : "HOUSTON", "loc" : [ -95.356549, 29.75125 ], "pop" : 0, "state" : "TX" } +{ "_id" : "77011", "city" : "HOUSTON", "loc" : [ -95.30726199999999, 29.741992 ], "pop" : 22311, "state" : "TX" } +{ "_id" : "77012", "city" : "HOUSTON", "loc" : [ -95.281925, 29.71491 ], "pop" : 23344, "state" : "TX" } +{ "_id" : "77013", "city" : "HOUSTON", "loc" : [ -95.23013400000001, 29.784169 ], "pop" : 17011, "state" : "TX" } +{ "_id" : "77014", "city" : "HOUSTON", "loc" : [ -95.462497, 29.979637 ], "pop" : 11970, "state" : "TX" } +{ "_id" : "77015", "city" : "HOUSTON", "loc" : [ -95.18518899999999, 29.785287 ], "pop" : 42008, "state" : "TX" } +{ "_id" : "77016", "city" : "HOUSTON", "loc" : [ -95.30319900000001, 29.857855 ], "pop" : 31180, "state" : "TX" } +{ "_id" : "77017", "city" : "HOUSTON", "loc" : [ -95.25548499999999, 29.686301 ], "pop" : 26502, "state" : "TX" } +{ "_id" : "77018", "city" : "HOUSTON", "loc" : [ -95.426631, 29.827166 ], "pop" : 25857, "state" : "TX" } +{ "_id" : "77019", "city" : "HOUSTON", "loc" : [ -95.40539, 29.751651 ], "pop" : 15280, "state" : "TX" } +{ "_id" : "77020", "city" : "HOUSTON", "loc" : [ -95.312101, 29.775759 ], "pop" : 28011, "state" : "TX" } +{ "_id" : "77021", "city" : "HOUSTON", "loc" : [ -95.356151, 29.69538 ], "pop" : 23815, "state" : "TX" } +{ "_id" : "77022", "city" : "HOUSTON", "loc" : [ -95.376862, 29.829862 ], "pop" : 27417, "state" : "TX" } +{ "_id" : "77023", "city" : "HOUSTON", "loc" : [ -95.31777700000001, 29.724179 ], "pop" : 31983, "state" : "TX" } +{ "_id" : "77024", "city" : "HOUSTON", "loc" : [ -95.52006299999999, 29.76958 ], "pop" : 30766, "state" : "TX" } +{ "_id" : "77025", "city" : "HOUSTON", "loc" : [ -95.434107, 29.688897 ], "pop" : 21618, "state" : "TX" } +{ "_id" : "77026", "city" : "HOUSTON", "loc" : [ -95.32877499999999, 29.797168 ], "pop" : 27744, "state" : "TX" } +{ "_id" : "77027", "city" : "HOUSTON", "loc" : [ -95.446032, 29.739571 ], "pop" : 11422, "state" : "TX" } +{ "_id" : "77028", "city" : "HOUSTON", "loc" : [ -95.287886, 29.829657 ], "pop" : 17943, "state" : "TX" } +{ "_id" : "77029", "city" : "JACINTO CITY", "loc" : [ -95.25486100000001, 29.760326 ], "pop" : 17739, "state" : "TX" } +{ "_id" : "77030", "city" : "V A HOSPITAL", "loc" : [ -95.40619, 29.70372 ], "pop" : 10462, "state" : "TX" } +{ "_id" : "77031", "city" : "HOUSTON", "loc" : [ -95.541281, 29.658144 ], "pop" : 14021, "state" : "TX" } +{ "_id" : "77032", "city" : "HOUSTON", "loc" : [ -95.329883, 29.93676 ], "pop" : 8373, "state" : "TX" } +{ "_id" : "77033", "city" : "HOUSTON", "loc" : [ -95.338157, 29.668566 ], "pop" : 28295, "state" : "TX" } +{ "_id" : "77034", "city" : "HOUSTON", "loc" : [ -95.221615, 29.636395 ], "pop" : 21593, "state" : "TX" } +{ "_id" : "77035", "city" : "HOUSTON", "loc" : [ -95.48536799999999, 29.651833 ], "pop" : 30746, "state" : "TX" } +{ "_id" : "77036", "city" : "HOUSTON", "loc" : [ -95.540464, 29.698447 ], "pop" : 55414, "state" : "TX" } +{ "_id" : "77037", "city" : "HOUSTON", "loc" : [ -95.39351499999999, 29.889161 ], "pop" : 14286, "state" : "TX" } +{ "_id" : "77038", "city" : "HOUSTON", "loc" : [ -95.43860100000001, 29.91956 ], "pop" : 15653, "state" : "TX" } +{ "_id" : "77039", "city" : "HOUSTON", "loc" : [ -95.33338000000001, 29.906731 ], "pop" : 23839, "state" : "TX" } +{ "_id" : "77040", "city" : "JERSEY VILLAGE", "loc" : [ -95.52996899999999, 29.879613 ], "pop" : 33052, "state" : "TX" } +{ "_id" : "77041", "city" : "HOUSTON", "loc" : [ -95.58166300000001, 29.860187 ], "pop" : 14790, "state" : "TX" } +{ "_id" : "77042", "city" : "HOUSTON", "loc" : [ -95.55889500000001, 29.740446 ], "pop" : 31505, "state" : "TX" } +{ "_id" : "77043", "city" : "HOUSTON", "loc" : [ -95.560734, 29.805181 ], "pop" : 21752, "state" : "TX" } +{ "_id" : "77044", "city" : "HOUSTON", "loc" : [ -95.19757, 29.863485 ], "pop" : 10669, "state" : "TX" } +{ "_id" : "77045", "city" : "HOUSTON", "loc" : [ -95.438166, 29.629717 ], "pop" : 22145, "state" : "TX" } +{ "_id" : "77046", "city" : "HOUSTON", "loc" : [ -95.431845, 29.73279 ], "pop" : 557, "state" : "TX" } +{ "_id" : "77047", "city" : "HOUSTON", "loc" : [ -95.374993, 29.625443 ], "pop" : 9588, "state" : "TX" } +{ "_id" : "77048", "city" : "HOUSTON", "loc" : [ -95.341606, 29.632097 ], "pop" : 13873, "state" : "TX" } +{ "_id" : "77049", "city" : "HOUSTON", "loc" : [ -95.184815, 29.823471 ], "pop" : 14445, "state" : "TX" } +{ "_id" : "77050", "city" : "HOUSTON", "loc" : [ -95.284837, 29.901456 ], "pop" : 3709, "state" : "TX" } +{ "_id" : "77051", "city" : "HOUSTON", "loc" : [ -95.368763, 29.65792 ], "pop" : 13776, "state" : "TX" } +{ "_id" : "77053", "city" : "HOUSTON", "loc" : [ -95.458709, 29.596156 ], "pop" : 20720, "state" : "TX" } +{ "_id" : "77054", "city" : "HOUSTON", "loc" : [ -95.40167700000001, 29.685209 ], "pop" : 12399, "state" : "TX" } +{ "_id" : "77055", "city" : "HOUSTON", "loc" : [ -95.49578700000001, 29.797064 ], "pop" : 36187, "state" : "TX" } +{ "_id" : "77056", "city" : "HOUSTON", "loc" : [ -95.468282, 29.744584 ], "pop" : 13544, "state" : "TX" } +{ "_id" : "77057", "city" : "HOUSTON", "loc" : [ -95.490253, 29.74217 ], "pop" : 28217, "state" : "TX" } +{ "_id" : "77058", "city" : "HOUSTON", "loc" : [ -95.057413, 29.574787 ], "pop" : 5556, "state" : "TX" } +{ "_id" : "77059", "city" : "HOUSTON", "loc" : [ -95.113354, 29.597493 ], "pop" : 6185, "state" : "TX" } +{ "_id" : "77060", "city" : "HOUSTON", "loc" : [ -95.398061, 29.933462 ], "pop" : 31443, "state" : "TX" } +{ "_id" : "77061", "city" : "HOUSTON", "loc" : [ -95.278987, 29.665221 ], "pop" : 20966, "state" : "TX" } +{ "_id" : "77062", "city" : "HOUSTON", "loc" : [ -95.130292, 29.572084 ], "pop" : 25303, "state" : "TX" } +{ "_id" : "77063", "city" : "HOUSTON", "loc" : [ -95.52203900000001, 29.734843 ], "pop" : 24156, "state" : "TX" } +{ "_id" : "77064", "city" : "HOUSTON", "loc" : [ -95.556894, 29.918981 ], "pop" : 21388, "state" : "TX" } +{ "_id" : "77065", "city" : "HOUSTON", "loc" : [ -95.61063, 29.931933 ], "pop" : 17370, "state" : "TX" } +{ "_id" : "77066", "city" : "HOUSTON", "loc" : [ -95.49471699999999, 29.961027 ], "pop" : 23310, "state" : "TX" } +{ "_id" : "77067", "city" : "HOUSTON", "loc" : [ -95.452158, 29.954717 ], "pop" : 18416, "state" : "TX" } +{ "_id" : "77068", "city" : "HOUSTON", "loc" : [ -95.489661, 30.006867 ], "pop" : 7670, "state" : "TX" } +{ "_id" : "77069", "city" : "HOUSTON", "loc" : [ -95.520827, 29.986292 ], "pop" : 11617, "state" : "TX" } +{ "_id" : "77070", "city" : "HOUSTON", "loc" : [ -95.58027, 29.978099 ], "pop" : 25735, "state" : "TX" } +{ "_id" : "77071", "city" : "HOUSTON", "loc" : [ -95.517554, 29.651838 ], "pop" : 21037, "state" : "TX" } +{ "_id" : "77072", "city" : "HOUSTON", "loc" : [ -95.58615500000001, 29.699026 ], "pop" : 41808, "state" : "TX" } +{ "_id" : "77073", "city" : "HOUSTON", "loc" : [ -95.408671, 30.019767 ], "pop" : 10208, "state" : "TX" } +{ "_id" : "77074", "city" : "HOUSTON", "loc" : [ -95.510588, 29.689601 ], "pop" : 32691, "state" : "TX" } +{ "_id" : "77075", "city" : "HOUSTON", "loc" : [ -95.25998300000001, 29.622276 ], "pop" : 16943, "state" : "TX" } +{ "_id" : "77076", "city" : "HOUSTON", "loc" : [ -95.383442, 29.85801 ], "pop" : 23881, "state" : "TX" } +{ "_id" : "77077", "city" : "HOUSTON", "loc" : [ -95.602991, 29.747656 ], "pop" : 32090, "state" : "TX" } +{ "_id" : "77078", "city" : "HOUSTON", "loc" : [ -95.258208, 29.849724 ], "pop" : 12300, "state" : "TX" } +{ "_id" : "77079", "city" : "HOUSTON", "loc" : [ -95.597993, 29.773759 ], "pop" : 29891, "state" : "TX" } +{ "_id" : "77080", "city" : "HOUSTON", "loc" : [ -95.522986, 29.815854 ], "pop" : 39465, "state" : "TX" } +{ "_id" : "77081", "city" : "HOUSTON", "loc" : [ -95.484531, 29.711926 ], "pop" : 33787, "state" : "TX" } +{ "_id" : "77082", "city" : "HOUSTON", "loc" : [ -95.628533, 29.722283 ], "pop" : 23875, "state" : "TX" } +{ "_id" : "77083", "city" : "HOUSTON", "loc" : [ -95.651098, 29.694709 ], "pop" : 38124, "state" : "TX" } +{ "_id" : "77084", "city" : "HOUSTON", "loc" : [ -95.662329, 29.844022 ], "pop" : 45204, "state" : "TX" } +{ "_id" : "77085", "city" : "HOUSTON", "loc" : [ -95.481945, 29.621787 ], "pop" : 6519, "state" : "TX" } +{ "_id" : "77086", "city" : "HOUSTON", "loc" : [ -95.49386800000001, 29.922667 ], "pop" : 16075, "state" : "TX" } +{ "_id" : "77087", "city" : "HOUSTON", "loc" : [ -95.301062, 29.687579 ], "pop" : 31112, "state" : "TX" } +{ "_id" : "77088", "city" : "HOUSTON", "loc" : [ -95.45387700000001, 29.881694 ], "pop" : 44595, "state" : "TX" } +{ "_id" : "77089", "city" : "HOUSTON", "loc" : [ -95.22178599999999, 29.593978 ], "pop" : 37678, "state" : "TX" } +{ "_id" : "77090", "city" : "HOUSTON", "loc" : [ -95.447002, 30.016673 ], "pop" : 22054, "state" : "TX" } +{ "_id" : "77091", "city" : "HOUSTON", "loc" : [ -95.443521, 29.853448 ], "pop" : 21341, "state" : "TX" } +{ "_id" : "77092", "city" : "HOUSTON", "loc" : [ -95.472031, 29.832391 ], "pop" : 31872, "state" : "TX" } +{ "_id" : "77093", "city" : "HOUSTON", "loc" : [ -95.34028600000001, 29.861661 ], "pop" : 39118, "state" : "TX" } +{ "_id" : "77094", "city" : "HOUSTON", "loc" : [ -95.710742, 29.770536 ], "pop" : 1168, "state" : "TX" } +{ "_id" : "77095", "city" : "HOUSTON", "loc" : [ -95.648082, 29.894115 ], "pop" : 24418, "state" : "TX" } +{ "_id" : "77096", "city" : "HOUSTON", "loc" : [ -95.48606599999999, 29.672205 ], "pop" : 32124, "state" : "TX" } +{ "_id" : "77098", "city" : "HOUSTON", "loc" : [ -95.411778, 29.734987 ], "pop" : 10436, "state" : "TX" } +{ "_id" : "77099", "city" : "HOUSTON", "loc" : [ -95.586613, 29.670869 ], "pop" : 40503, "state" : "TX" } +{ "_id" : "77301", "city" : "CONROE", "loc" : [ -95.45266700000001, 30.312535 ], "pop" : 20150, "state" : "TX" } +{ "_id" : "77302", "city" : "GRANGERLAND", "loc" : [ -95.416087, 30.250357 ], "pop" : 5767, "state" : "TX" } +{ "_id" : "77303", "city" : "CUT AND SHOOT", "loc" : [ -95.369725, 30.344456 ], "pop" : 14683, "state" : "TX" } +{ "_id" : "77304", "city" : "PANORAMA VILLAGE", "loc" : [ -95.495244, 30.327351 ], "pop" : 9625, "state" : "TX" } +{ "_id" : "77327", "city" : "CLEVELAND", "loc" : [ -95.020152, 30.329977 ], "pop" : 21298, "state" : "TX" } +{ "_id" : "77331", "city" : "COLDSPRING", "loc" : [ -95.10858, 30.602661 ], "pop" : 3182, "state" : "TX" } +{ "_id" : "77335", "city" : "GOODRICH", "loc" : [ -94.95922, 30.607909 ], "pop" : 1441, "state" : "TX" } +{ "_id" : "77336", "city" : "HUFFMAN", "loc" : [ -95.105069, 30.056491 ], "pop" : 6529, "state" : "TX" } +{ "_id" : "77338", "city" : "HUMBLE", "loc" : [ -95.282476, 30.004091 ], "pop" : 19090, "state" : "TX" } +{ "_id" : "77339", "city" : "HUMBLE", "loc" : [ -95.21071600000001, 30.056333 ], "pop" : 28083, "state" : "TX" } +{ "_id" : "77340", "city" : "HUNTSVILLE", "loc" : [ -95.53418600000001, 30.73435 ], "pop" : 48879, "state" : "TX" } +{ "_id" : "77345", "city" : "HUMBLE", "loc" : [ -95.170654, 30.056641 ], "pop" : 13004, "state" : "TX" } +{ "_id" : "77346", "city" : "HUMBLE", "loc" : [ -95.172815, 30.004195 ], "pop" : 15984, "state" : "TX" } +{ "_id" : "77351", "city" : "SEGNO", "loc" : [ -94.935278, 30.718018 ], "pop" : 24261, "state" : "TX" } +{ "_id" : "77355", "city" : "MAGNOLIA", "loc" : [ -95.68898900000001, 30.1678 ], "pop" : 15638, "state" : "TX" } +{ "_id" : "77356", "city" : "MONTGOMERY", "loc" : [ -95.65034199999999, 30.363932 ], "pop" : 12002, "state" : "TX" } +{ "_id" : "77357", "city" : "NEW CANEY", "loc" : [ -95.197968, 30.157933 ], "pop" : 13214, "state" : "TX" } +{ "_id" : "77358", "city" : "NEW WAVERLY", "loc" : [ -95.453194, 30.535357 ], "pop" : 1977, "state" : "TX" } +{ "_id" : "77359", "city" : "OAKHURST", "loc" : [ -95.309478, 30.71262 ], "pop" : 283, "state" : "TX" } +{ "_id" : "77362", "city" : "PINEHURST", "loc" : [ -95.681406, 30.158052 ], "pop" : 2498, "state" : "TX" } +{ "_id" : "77363", "city" : "PLANTERSVILLE", "loc" : [ -95.849812, 30.296931 ], "pop" : 1333, "state" : "TX" } +{ "_id" : "77364", "city" : "POINTBLANK", "loc" : [ -95.229494, 30.75926 ], "pop" : 2911, "state" : "TX" } +{ "_id" : "77365", "city" : "PORTER", "loc" : [ -95.268613, 30.123731 ], "pop" : 13541, "state" : "TX" } +{ "_id" : "77371", "city" : "SHEPHERD", "loc" : [ -95.092913, 30.483396 ], "pop" : 9604, "state" : "TX" } +{ "_id" : "77372", "city" : "SPLENDORA", "loc" : [ -95.199308, 30.232609 ], "pop" : 11287, "state" : "TX" } +{ "_id" : "77373", "city" : "SPRING", "loc" : [ -95.377329, 30.053241 ], "pop" : 33118, "state" : "TX" } +{ "_id" : "77375", "city" : "TOMBALL", "loc" : [ -95.62006, 30.073923 ], "pop" : 19801, "state" : "TX" } +{ "_id" : "77378", "city" : "WILLIS", "loc" : [ -95.49758300000001, 30.432025 ], "pop" : 9988, "state" : "TX" } +{ "_id" : "77379", "city" : "KLEIN", "loc" : [ -95.528481, 30.023377 ], "pop" : 35275, "state" : "TX" } +{ "_id" : "77380", "city" : "THE WOODLANDS", "loc" : [ -95.46894399999999, 30.13739 ], "pop" : 16541, "state" : "TX" } +{ "_id" : "77381", "city" : "THE WOODLANDS", "loc" : [ -95.500743, 30.168887 ], "pop" : 19466, "state" : "TX" } +{ "_id" : "77384", "city" : "CONROE", "loc" : [ -95.492392, 30.225725 ], "pop" : 1635, "state" : "TX" } +{ "_id" : "77385", "city" : "CONROE", "loc" : [ -95.42878899999999, 30.187695 ], "pop" : 7311, "state" : "TX" } +{ "_id" : "77386", "city" : "SPRING", "loc" : [ -95.42394299999999, 30.128805 ], "pop" : 8379, "state" : "TX" } +{ "_id" : "77388", "city" : "SPRING", "loc" : [ -95.46945599999999, 30.050546 ], "pop" : 21805, "state" : "TX" } +{ "_id" : "77389", "city" : "SPRING", "loc" : [ -95.506624, 30.104398 ], "pop" : 8540, "state" : "TX" } +{ "_id" : "77396", "city" : "HUMBLE", "loc" : [ -95.262186, 29.950697 ], "pop" : 16163, "state" : "TX" } +{ "_id" : "77401", "city" : "BELLAIRE", "loc" : [ -95.461106, 29.702313 ], "pop" : 13913, "state" : "TX" } +{ "_id" : "77414", "city" : "SARGENT", "loc" : [ -95.92816999999999, 28.96183 ], "pop" : 19305, "state" : "TX" } +{ "_id" : "77417", "city" : "BEASLEY", "loc" : [ -95.96814500000001, 29.479045 ], "pop" : 2151, "state" : "TX" } +{ "_id" : "77418", "city" : "BELLVILLE", "loc" : [ -96.253083, 29.96583 ], "pop" : 6771, "state" : "TX" } +{ "_id" : "77419", "city" : "BLESSING", "loc" : [ -96.217956, 28.864947 ], "pop" : 1285, "state" : "TX" } +{ "_id" : "77420", "city" : "BOLING", "loc" : [ -95.974045, 29.252874 ], "pop" : 3459, "state" : "TX" } +{ "_id" : "77422", "city" : "BRAZORIA", "loc" : [ -95.58668299999999, 29.023642 ], "pop" : 12583, "state" : "TX" } +{ "_id" : "77423", "city" : "BROOKSHIRE", "loc" : [ -95.975537, 29.807168 ], "pop" : 4990, "state" : "TX" } +{ "_id" : "77426", "city" : "CHAPPELL HILL", "loc" : [ -96.234739, 30.183271 ], "pop" : 2916, "state" : "TX" } +{ "_id" : "77429", "city" : "CYPRESS", "loc" : [ -95.635778, 29.976608 ], "pop" : 18527, "state" : "TX" } +{ "_id" : "77430", "city" : "DAMON", "loc" : [ -95.703577, 29.301381 ], "pop" : 1493, "state" : "TX" } +{ "_id" : "77432", "city" : "DANEVANG", "loc" : [ -96.19765, 29.066969 ], "pop" : 278, "state" : "TX" } +{ "_id" : "77433", "city" : "CYPRESS", "loc" : [ -95.702456, 29.883633 ], "pop" : 1983, "state" : "TX" } +{ "_id" : "77434", "city" : "EAGLE LAKE", "loc" : [ -96.33536700000001, 29.584236 ], "pop" : 4543, "state" : "TX" } +{ "_id" : "77435", "city" : "EAST BERNARD", "loc" : [ -96.121115, 29.470458 ], "pop" : 5773, "state" : "TX" } +{ "_id" : "77437", "city" : "EL CAMPO", "loc" : [ -96.274266, 29.200776 ], "pop" : 15829, "state" : "TX" } +{ "_id" : "77440", "city" : "ELMATON", "loc" : [ -96.13351, 28.83209 ], "pop" : 470, "state" : "TX" } +{ "_id" : "77441", "city" : "FULSHEAR", "loc" : [ -95.897682, 29.721698 ], "pop" : 193, "state" : "TX" } +{ "_id" : "77442", "city" : "GARWOOD", "loc" : [ -96.49192499999999, 29.476001 ], "pop" : 2231, "state" : "TX" } +{ "_id" : "77444", "city" : "GUY", "loc" : [ -95.77022700000001, 29.332676 ], "pop" : 343, "state" : "TX" } +{ "_id" : "77445", "city" : "HEMPSTEAD", "loc" : [ -96.071648, 30.091973 ], "pop" : 5883, "state" : "TX" } +{ "_id" : "77447", "city" : "HOCKLEY", "loc" : [ -95.810447, 30.072888 ], "pop" : 5040, "state" : "TX" } +{ "_id" : "77449", "city" : "PARK ROW", "loc" : [ -95.72926699999999, 29.819922 ], "pop" : 22664, "state" : "TX" } +{ "_id" : "77450", "city" : "PARK ROW", "loc" : [ -95.744506, 29.767632 ], "pop" : 28533, "state" : "TX" } +{ "_id" : "77455", "city" : "LOUISE", "loc" : [ -96.392374, 29.14908 ], "pop" : 2431, "state" : "TX" } +{ "_id" : "77456", "city" : "MARKHAM", "loc" : [ -96.09276800000001, 28.954701 ], "pop" : 2015, "state" : "TX" } +{ "_id" : "77457", "city" : "MATAGORDA", "loc" : [ -95.951891, 28.764926 ], "pop" : 1455, "state" : "TX" } +{ "_id" : "77458", "city" : "MIDFIELD", "loc" : [ -96.226527, 28.936166 ], "pop" : 286, "state" : "TX" } +{ "_id" : "77459", "city" : "MISSOURI CITY", "loc" : [ -95.542284, 29.570434 ], "pop" : 16067, "state" : "TX" } +{ "_id" : "77461", "city" : "NEEDVILLE", "loc" : [ -95.827288, 29.41165 ], "pop" : 7609, "state" : "TX" } +{ "_id" : "77465", "city" : "PALACIOS", "loc" : [ -96.215439, 28.71504 ], "pop" : 5607, "state" : "TX" } +{ "_id" : "77468", "city" : "PLEDGER", "loc" : [ -95.898591, 29.179208 ], "pop" : 345, "state" : "TX" } +{ "_id" : "77469", "city" : "CLODINE", "loc" : [ -95.752122, 29.593226 ], "pop" : 36014, "state" : "TX" } +{ "_id" : "77471", "city" : "ROSENBERG", "loc" : [ -95.798213, 29.549727 ], "pop" : 22182, "state" : "TX" } +{ "_id" : "77474", "city" : "SEALY", "loc" : [ -96.159189, 29.782632 ], "pop" : 8680, "state" : "TX" } +{ "_id" : "77477", "city" : "STAFFORD", "loc" : [ -95.567764, 29.622816 ], "pop" : 18952, "state" : "TX" } +{ "_id" : "77478", "city" : "SUGAR LAND", "loc" : [ -95.62185599999999, 29.634153 ], "pop" : 36536, "state" : "TX" } +{ "_id" : "77479", "city" : "SUGAR LAND", "loc" : [ -95.60659099999999, 29.578537 ], "pop" : 20219, "state" : "TX" } +{ "_id" : "77480", "city" : "SWEENY", "loc" : [ -95.700363, 29.041508 ], "pop" : 5077, "state" : "TX" } +{ "_id" : "77482", "city" : "VAN VLECK", "loc" : [ -95.938903, 29.013879 ], "pop" : 6011, "state" : "TX" } +{ "_id" : "77483", "city" : "WADSWORTH", "loc" : [ -95.971307, 28.614288 ], "pop" : 145, "state" : "TX" } +{ "_id" : "77484", "city" : "WALLER", "loc" : [ -95.961275, 30.086008 ], "pop" : 10513, "state" : "TX" } +{ "_id" : "77485", "city" : "WALLIS", "loc" : [ -96.045574, 29.63968 ], "pop" : 3380, "state" : "TX" } +{ "_id" : "77486", "city" : "WEST COLUMBIA", "loc" : [ -95.669388, 29.140823 ], "pop" : 9777, "state" : "TX" } +{ "_id" : "77488", "city" : "WHARTON", "loc" : [ -96.08582800000001, 29.320488 ], "pop" : 12326, "state" : "TX" } +{ "_id" : "77489", "city" : "MISSOURI CITY", "loc" : [ -95.511512, 29.596206 ], "pop" : 27760, "state" : "TX" } +{ "_id" : "77493", "city" : "PARK ROW", "loc" : [ -95.815988, 29.804876 ], "pop" : 10312, "state" : "TX" } +{ "_id" : "77494", "city" : "PARK ROW", "loc" : [ -95.81167499999999, 29.750893 ], "pop" : 2684, "state" : "TX" } +{ "_id" : "77502", "city" : "PASADENA", "loc" : [ -95.198193, 29.678945 ], "pop" : 31270, "state" : "TX" } +{ "_id" : "77503", "city" : "PASADENA", "loc" : [ -95.15721000000001, 29.687696 ], "pop" : 23019, "state" : "TX" } +{ "_id" : "77504", "city" : "PASADENA", "loc" : [ -95.188478, 29.650133 ], "pop" : 18518, "state" : "TX" } +{ "_id" : "77505", "city" : "PASADENA", "loc" : [ -95.146388, 29.651753 ], "pop" : 10978, "state" : "TX" } +{ "_id" : "77506", "city" : "PASADENA", "loc" : [ -95.19895, 29.70087 ], "pop" : 33656, "state" : "TX" } +{ "_id" : "77507", "city" : "PASADENA", "loc" : [ -95.079365, 29.6055 ], "pop" : 0, "state" : "TX" } +{ "_id" : "77510", "city" : "ALTA LOMA", "loc" : [ -95.089429, 29.371854 ], "pop" : 11098, "state" : "TX" } +{ "_id" : "77511", "city" : "ALVIN", "loc" : [ -95.251535, 29.41195 ], "pop" : 30979, "state" : "TX" } +{ "_id" : "77514", "city" : "MONROE CITY", "loc" : [ -94.55481899999999, 29.780987 ], "pop" : 7969, "state" : "TX" } +{ "_id" : "77515", "city" : "ANGLETON", "loc" : [ -95.44666100000001, 29.181049 ], "pop" : 29204, "state" : "TX" } +{ "_id" : "77517", "city" : "ARCADIA", "loc" : [ -95.129003, 29.380259 ], "pop" : 3377, "state" : "TX" } +{ "_id" : "77518", "city" : "BACLIFF", "loc" : [ -94.989293, 29.505506 ], "pop" : 5465, "state" : "TX" } +{ "_id" : "77519", "city" : "BATSON", "loc" : [ -94.60959, 30.22502 ], "pop" : 1071, "state" : "TX" } +{ "_id" : "77520", "city" : "BAYTOWN", "loc" : [ -94.965265, 29.746063 ], "pop" : 43386, "state" : "TX" } +{ "_id" : "77521", "city" : "BAYTOWN", "loc" : [ -94.969549, 29.770482 ], "pop" : 30277, "state" : "TX" } +{ "_id" : "77530", "city" : "CHANNELVIEW", "loc" : [ -95.13165499999999, 29.791438 ], "pop" : 23408, "state" : "TX" } +{ "_id" : "77531", "city" : "CLUTE", "loc" : [ -95.40259500000001, 29.032502 ], "pop" : 13361, "state" : "TX" } +{ "_id" : "77532", "city" : "BARRETT", "loc" : [ -95.07522, 29.937812 ], "pop" : 13679, "state" : "TX" } +{ "_id" : "77534", "city" : "DANBURY", "loc" : [ -95.34346499999999, 29.229082 ], "pop" : 2522, "state" : "TX" } +{ "_id" : "77535", "city" : "DAYTON", "loc" : [ -94.878747, 30.010208 ], "pop" : 16229, "state" : "TX" } +{ "_id" : "77536", "city" : "DEER PARK", "loc" : [ -95.122192, 29.682571 ], "pop" : 25806, "state" : "TX" } +{ "_id" : "77538", "city" : "DEVERS", "loc" : [ -94.57461499999999, 29.997835 ], "pop" : 570, "state" : "TX" } +{ "_id" : "77539", "city" : "SAN LEON", "loc" : [ -95.034496, 29.466033 ], "pop" : 21905, "state" : "TX" } +{ "_id" : "77541", "city" : "QUINTANA", "loc" : [ -95.37138899999999, 28.96968 ], "pop" : 17049, "state" : "TX" } +{ "_id" : "77545", "city" : "FRESNO", "loc" : [ -95.462608, 29.52931 ], "pop" : 3144, "state" : "TX" } +{ "_id" : "77546", "city" : "FRIENDSWOOD", "loc" : [ -95.187888, 29.522399 ], "pop" : 32217, "state" : "TX" } +{ "_id" : "77547", "city" : "GALENA PARK", "loc" : [ -95.24000100000001, 29.739204 ], "pop" : 9306, "state" : "TX" } +{ "_id" : "77550", "city" : "GALVESTON", "loc" : [ -94.79297, 29.298272 ], "pop" : 31879, "state" : "TX" } +{ "_id" : "77551", "city" : "GALVESTON", "loc" : [ -94.83033399999999, 29.276584 ], "pop" : 22680, "state" : "TX" } +{ "_id" : "77554", "city" : "GALVESTON", "loc" : [ -94.91371599999999, 29.229638 ], "pop" : 5495, "state" : "TX" } +{ "_id" : "77560", "city" : "HANKAMER", "loc" : [ -94.593846, 29.87524 ], "pop" : 233, "state" : "TX" } +{ "_id" : "77562", "city" : "HIGHLANDS", "loc" : [ -95.039286, 29.829599 ], "pop" : 17005, "state" : "TX" } +{ "_id" : "77563", "city" : "HITCHCOCK", "loc" : [ -94.992591, 29.339835 ], "pop" : 8591, "state" : "TX" } +{ "_id" : "77564", "city" : "HULL", "loc" : [ -94.660382, 30.13337 ], "pop" : 3386, "state" : "TX" } +{ "_id" : "77565", "city" : "CLEAR LAKE SHORE", "loc" : [ -95.039209, 29.543823 ], "pop" : 4101, "state" : "TX" } +{ "_id" : "77566", "city" : "LAKE JACKSON", "loc" : [ -95.440119, 29.039275 ], "pop" : 24000, "state" : "TX" } +{ "_id" : "77568", "city" : "LA MARQUE", "loc" : [ -94.974159, 29.3676 ], "pop" : 13884, "state" : "TX" } +{ "_id" : "77571", "city" : "SHOREACRES", "loc" : [ -95.05721, 29.660098 ], "pop" : 31556, "state" : "TX" } +{ "_id" : "77573", "city" : "LEAGUE CITY", "loc" : [ -95.09627399999999, 29.517281 ], "pop" : 41580, "state" : "TX" } +{ "_id" : "77575", "city" : "AMES", "loc" : [ -94.763819, 30.072794 ], "pop" : 14511, "state" : "TX" } +{ "_id" : "77577", "city" : "LIVERPOOL", "loc" : [ -95.240754, 29.311457 ], "pop" : 2023, "state" : "TX" } +{ "_id" : "77578", "city" : "MANVEL", "loc" : [ -95.35033, 29.469381 ], "pop" : 4754, "state" : "TX" } +{ "_id" : "77581", "city" : "PEARLAND", "loc" : [ -95.272069, 29.561656 ], "pop" : 20807, "state" : "TX" } +{ "_id" : "77583", "city" : "ROSHARON", "loc" : [ -95.453732, 29.420329 ], "pop" : 8495, "state" : "TX" } +{ "_id" : "77584", "city" : "PEARLAND", "loc" : [ -95.320778, 29.540479 ], "pop" : 14234, "state" : "TX" } +{ "_id" : "77585", "city" : "SARATOGA", "loc" : [ -94.571718, 30.339817 ], "pop" : 1921, "state" : "TX" } +{ "_id" : "77586", "city" : "EL LAGO", "loc" : [ -95.028739, 29.572895 ], "pop" : 9490, "state" : "TX" } +{ "_id" : "77587", "city" : "SOUTH HOUSTON", "loc" : [ -95.22582, 29.660097 ], "pop" : 16109, "state" : "TX" } +{ "_id" : "77590", "city" : "TEXAS CITY", "loc" : [ -94.920298, 29.396984 ], "pop" : 30108, "state" : "TX" } +{ "_id" : "77591", "city" : "TEXAS CITY", "loc" : [ -94.994204, 29.389097 ], "pop" : 10099, "state" : "TX" } +{ "_id" : "77597", "city" : "WALLISVILLE", "loc" : [ -94.67589599999999, 29.859096 ], "pop" : 1072, "state" : "TX" } +{ "_id" : "77598", "city" : "WEBSTER", "loc" : [ -95.143985, 29.55641 ], "pop" : 11453, "state" : "TX" } +{ "_id" : "77611", "city" : "BRIDGE CITY", "loc" : [ -93.84729299999999, 30.04054 ], "pop" : 13688, "state" : "TX" } +{ "_id" : "77612", "city" : "BUNA", "loc" : [ -93.991263, 30.413209 ], "pop" : 9023, "state" : "TX" } +{ "_id" : "77614", "city" : "DEWEYVILLE", "loc" : [ -93.77305, 30.289295 ], "pop" : 3133, "state" : "TX" } +{ "_id" : "77616", "city" : "FRED", "loc" : [ -94.185948, 30.598657 ], "pop" : 1973, "state" : "TX" } +{ "_id" : "77619", "city" : "GROVES", "loc" : [ -93.915187, 29.944779 ], "pop" : 16865, "state" : "TX" } +{ "_id" : "77622", "city" : "HAMSHIRE", "loc" : [ -94.31873899999999, 29.866769 ], "pop" : 571, "state" : "TX" } +{ "_id" : "77624", "city" : "HILLISTER", "loc" : [ -94.407588, 30.689911 ], "pop" : 1326, "state" : "TX" } +{ "_id" : "77625", "city" : "KOUNTZE", "loc" : [ -94.32590500000001, 30.370316 ], "pop" : 7073, "state" : "TX" } +{ "_id" : "77627", "city" : "NEDERLAND", "loc" : [ -94.001192, 29.971609 ], "pop" : 22035, "state" : "TX" } +{ "_id" : "77630", "city" : "WEST ORANGE", "loc" : [ -93.771883, 30.125167 ], "pop" : 39125, "state" : "TX" } +{ "_id" : "77640", "city" : "PORT ACRES", "loc" : [ -93.96256200000001, 29.882557 ], "pop" : 24605, "state" : "TX" } +{ "_id" : "77642", "city" : "PORT ARTHUR", "loc" : [ -93.926962, 29.92119 ], "pop" : 33943, "state" : "TX" } +{ "_id" : "77650", "city" : "CRYSTAL BEACH", "loc" : [ -94.611678, 29.459788 ], "pop" : 2807, "state" : "TX" } +{ "_id" : "77651", "city" : "PORT NECHES", "loc" : [ -93.96262400000001, 29.976983 ], "pop" : 13009, "state" : "TX" } +{ "_id" : "77656", "city" : "SILSBEE", "loc" : [ -94.190726, 30.324387 ], "pop" : 27117, "state" : "TX" } +{ "_id" : "77659", "city" : "SOUR LAKE", "loc" : [ -94.373341, 30.149134 ], "pop" : 4138, "state" : "TX" } +{ "_id" : "77660", "city" : "SPURGER", "loc" : [ -94.212745, 30.778057 ], "pop" : 2516, "state" : "TX" } +{ "_id" : "77662", "city" : "VIDOR", "loc" : [ -94.00077899999999, 30.15018 ], "pop" : 27702, "state" : "TX" } +{ "_id" : "77664", "city" : "WARREN", "loc" : [ -94.411974, 30.597776 ], "pop" : 2465, "state" : "TX" } +{ "_id" : "77665", "city" : "WINNIE", "loc" : [ -94.339499, 29.815676 ], "pop" : 2716, "state" : "TX" } +{ "_id" : "77701", "city" : "BEAUMONT", "loc" : [ -94.10389600000001, 30.068805 ], "pop" : 18121, "state" : "TX" } +{ "_id" : "77702", "city" : "BEAUMONT", "loc" : [ -94.125412, 30.087057 ], "pop" : 4396, "state" : "TX" } +{ "_id" : "77703", "city" : "BEAUMONT", "loc" : [ -94.119698, 30.113201 ], "pop" : 16003, "state" : "TX" } +{ "_id" : "77705", "city" : "BEAUMONT", "loc" : [ -94.115673, 30.021128 ], "pop" : 26134, "state" : "TX" } +{ "_id" : "77706", "city" : "BEAUMONT", "loc" : [ -94.164816, 30.094834 ], "pop" : 25388, "state" : "TX" } +{ "_id" : "77707", "city" : "BEAUMONT", "loc" : [ -94.175541, 30.068567 ], "pop" : 15366, "state" : "TX" } +{ "_id" : "77708", "city" : "BEAUMONT", "loc" : [ -94.160357, 30.139957 ], "pop" : 10782, "state" : "TX" } +{ "_id" : "77713", "city" : "BEAUMONT", "loc" : [ -94.26071899999999, 30.084996 ], "pop" : 10798, "state" : "TX" } +{ "_id" : "77801", "city" : "BRYAN", "loc" : [ -96.36615999999999, 30.632698 ], "pop" : 12190, "state" : "TX" } +{ "_id" : "77802", "city" : "BRYAN", "loc" : [ -96.335143, 30.658171 ], "pop" : 19306, "state" : "TX" } +{ "_id" : "77803", "city" : "BRYAN", "loc" : [ -96.371398, 30.691293 ], "pop" : 32052, "state" : "TX" } +{ "_id" : "77830", "city" : "ANDERSON", "loc" : [ -96.001822, 30.544291 ], "pop" : 1792, "state" : "TX" } +{ "_id" : "77831", "city" : "SINGLETON", "loc" : [ -95.93356900000001, 30.764059 ], "pop" : 1079, "state" : "TX" } +{ "_id" : "77833", "city" : "BRENHAM", "loc" : [ -96.40276900000001, 30.17736 ], "pop" : 20178, "state" : "TX" } +{ "_id" : "77835", "city" : "BURTON", "loc" : [ -96.59247499999999, 30.176744 ], "pop" : 2444, "state" : "TX" } +{ "_id" : "77836", "city" : "CALDWELL", "loc" : [ -96.714292, 30.529819 ], "pop" : 7873, "state" : "TX" } +{ "_id" : "77837", "city" : "CALVERT", "loc" : [ -96.67107, 30.978211 ], "pop" : 1829, "state" : "TX" } +{ "_id" : "77840", "city" : "COLLEGE STATION", "loc" : [ -96.31227, 30.604476 ], "pop" : 45766, "state" : "TX" } +{ "_id" : "77843", "city" : "COLLEGE STATION", "loc" : [ -96.340001, 30.614738 ], "pop" : 10425, "state" : "TX" } +{ "_id" : "77845", "city" : "COLLEGE STATION", "loc" : [ -96.31711300000001, 30.511811 ], "pop" : 1908, "state" : "TX" } +{ "_id" : "77850", "city" : "CONCORD", "loc" : [ -96.102643, 31.263144 ], "pop" : 143, "state" : "TX" } +{ "_id" : "77853", "city" : "DIME BOX", "loc" : [ -96.824781, 30.35786 ], "pop" : 699, "state" : "TX" } +{ "_id" : "77856", "city" : "FRANKLIN", "loc" : [ -96.442643, 31.035013 ], "pop" : 4144, "state" : "TX" } +{ "_id" : "77859", "city" : "HEARNE", "loc" : [ -96.584256, 30.86686 ], "pop" : 7655, "state" : "TX" } +{ "_id" : "77861", "city" : "IOLA", "loc" : [ -96.091075, 30.732637 ], "pop" : 1418, "state" : "TX" } +{ "_id" : "77864", "city" : "MADISONVILLE", "loc" : [ -95.909094, 30.953335 ], "pop" : 5532, "state" : "TX" } +{ "_id" : "77865", "city" : "MARQUEZ", "loc" : [ -96.237499, 31.230889 ], "pop" : 1047, "state" : "TX" } +{ "_id" : "77868", "city" : "NAVASOTA", "loc" : [ -96.05935700000001, 30.357645 ], "pop" : 12634, "state" : "TX" } +{ "_id" : "77871", "city" : "HILLTOP LAKES", "loc" : [ -96.147274, 31.087473 ], "pop" : 2540, "state" : "TX" } +{ "_id" : "77872", "city" : "NORTH ZULCH", "loc" : [ -96.09248599999999, 30.928531 ], "pop" : 1887, "state" : "TX" } +{ "_id" : "77873", "city" : "RICHARDS", "loc" : [ -95.861053, 30.538166 ], "pop" : 787, "state" : "TX" } +{ "_id" : "77879", "city" : "SOMERVILLE", "loc" : [ -96.535825, 30.407585 ], "pop" : 5752, "state" : "TX" } +{ "_id" : "77880", "city" : "WASHINGTON", "loc" : [ -96.224948, 30.31819 ], "pop" : 616, "state" : "TX" } +{ "_id" : "77901", "city" : "VICTORIA", "loc" : [ -96.999347, 28.808953 ], "pop" : 50119, "state" : "TX" } +{ "_id" : "77904", "city" : "VICTORIA", "loc" : [ -96.998993, 28.867482 ], "pop" : 18982, "state" : "TX" } +{ "_id" : "77951", "city" : "BLOOMINGTON", "loc" : [ -96.88407599999999, 28.68898 ], "pop" : 4452, "state" : "TX" } +{ "_id" : "77954", "city" : "CUERO", "loc" : [ -97.28124699999999, 29.090969 ], "pop" : 8321, "state" : "TX" } +{ "_id" : "77957", "city" : "EDNA", "loc" : [ -96.64876599999999, 28.952714 ], "pop" : 8987, "state" : "TX" } +{ "_id" : "77962", "city" : "GANADO", "loc" : [ -96.503078, 29.03084 ], "pop" : 2876, "state" : "TX" } +{ "_id" : "77963", "city" : "GOLIAD", "loc" : [ -97.378321, 28.699257 ], "pop" : 5980, "state" : "TX" } +{ "_id" : "77964", "city" : "HALLETTSVILLE", "loc" : [ -96.923423, 29.442609 ], "pop" : 6905, "state" : "TX" } +{ "_id" : "77968", "city" : "INEZ", "loc" : [ -96.80029399999999, 28.899416 ], "pop" : 808, "state" : "TX" } +{ "_id" : "77971", "city" : "LOLITA", "loc" : [ -96.47933, 28.772449 ], "pop" : 2632, "state" : "TX" } +{ "_id" : "77974", "city" : "MEYERSVILLE", "loc" : [ -97.30416099999999, 28.922921 ], "pop" : 45, "state" : "TX" } +{ "_id" : "77975", "city" : "MOULTON", "loc" : [ -97.103122, 29.569992 ], "pop" : 2459, "state" : "TX" } +{ "_id" : "77979", "city" : "PORT LAVACA", "loc" : [ -96.625941, 28.601135 ], "pop" : 15627, "state" : "TX" } +{ "_id" : "77982", "city" : "PORT O CONNOR", "loc" : [ -96.775131, 28.140032 ], "pop" : 5, "state" : "TX" } +{ "_id" : "77983", "city" : "SEADRIFT", "loc" : [ -96.702279, 28.410113 ], "pop" : 1965, "state" : "TX" } +{ "_id" : "77984", "city" : "SHINER", "loc" : [ -97.163955, 29.428038 ], "pop" : 3596, "state" : "TX" } +{ "_id" : "77990", "city" : "TIVOLI", "loc" : [ -96.88717200000001, 28.440122 ], "pop" : 965, "state" : "TX" } +{ "_id" : "77994", "city" : "WESTHOFF", "loc" : [ -97.351102, 29.054983 ], "pop" : 2069, "state" : "TX" } +{ "_id" : "77995", "city" : "YOAKUM", "loc" : [ -97.13063, 29.283954 ], "pop" : 9747, "state" : "TX" } +{ "_id" : "78002", "city" : "ATASCOSA", "loc" : [ -98.74212, 29.270501 ], "pop" : 2943, "state" : "TX" } +{ "_id" : "78003", "city" : "BANDERA", "loc" : [ -99.04527899999999, 29.72755 ], "pop" : 5538, "state" : "TX" } +{ "_id" : "78004", "city" : "BERGHEIM", "loc" : [ -98.59325800000001, 29.839873 ], "pop" : 763, "state" : "TX" } +{ "_id" : "78005", "city" : "BIGFOOT", "loc" : [ -98.85823000000001, 29.053073 ], "pop" : 328, "state" : "TX" } +{ "_id" : "78006", "city" : "SISTERDALE", "loc" : [ -98.71340600000001, 29.77774 ], "pop" : 14427, "state" : "TX" } +{ "_id" : "78007", "city" : "CALLIHAM", "loc" : [ -98.407873, 28.417682 ], "pop" : 230, "state" : "TX" } +{ "_id" : "78008", "city" : "CAMPBELLTON", "loc" : [ -98.256573, 28.76699 ], "pop" : 475, "state" : "TX" } +{ "_id" : "78009", "city" : "CASTROVILLE", "loc" : [ -98.882391, 29.35532 ], "pop" : 4262, "state" : "TX" } +{ "_id" : "78010", "city" : "CAMP VERDE", "loc" : [ -99.00714000000001, 29.939658 ], "pop" : 2704, "state" : "TX" } +{ "_id" : "78011", "city" : "CHARLOTTE", "loc" : [ -98.70700100000001, 28.864871 ], "pop" : 1990, "state" : "TX" } +{ "_id" : "78013", "city" : "COMFORT", "loc" : [ -98.843772, 29.979072 ], "pop" : 3253, "state" : "TX" } +{ "_id" : "78014", "city" : "COTULLA", "loc" : [ -99.23281799999999, 28.439837 ], "pop" : 4369, "state" : "TX" } +{ "_id" : "78016", "city" : "DEVINE", "loc" : [ -98.90899400000001, 29.152078 ], "pop" : 6887, "state" : "TX" } +{ "_id" : "78017", "city" : "DILLEY", "loc" : [ -99.174684, 28.678201 ], "pop" : 3396, "state" : "TX" } +{ "_id" : "78019", "city" : "ENCINAL", "loc" : [ -99.340902, 28.051329 ], "pop" : 821, "state" : "TX" } +{ "_id" : "78021", "city" : "FOWLERTON", "loc" : [ -98.851821, 28.488666 ], "pop" : 76, "state" : "TX" } +{ "_id" : "78022", "city" : "GEORGE WEST", "loc" : [ -98.116159, 28.320388 ], "pop" : 4093, "state" : "TX" } +{ "_id" : "78023", "city" : "GREY FOREST", "loc" : [ -98.703534, 29.592203 ], "pop" : 3552, "state" : "TX" } +{ "_id" : "78024", "city" : "HUNT", "loc" : [ -99.48232899999999, 30.002694 ], "pop" : 263, "state" : "TX" } +{ "_id" : "78025", "city" : "INGRAM", "loc" : [ -99.26902200000001, 30.073126 ], "pop" : 7005, "state" : "TX" } +{ "_id" : "78026", "city" : "JOURDANTON", "loc" : [ -98.544037, 28.902985 ], "pop" : 4615, "state" : "TX" } +{ "_id" : "78027", "city" : "KENDALIA", "loc" : [ -98.51655599999999, 29.940619 ], "pop" : 251, "state" : "TX" } +{ "_id" : "78028", "city" : "KERRVILLE", "loc" : [ -99.140817, 30.041647 ], "pop" : 26128, "state" : "TX" } +{ "_id" : "78039", "city" : "LA COSTE", "loc" : [ -98.812466, 29.308178 ], "pop" : 1320, "state" : "TX" } +{ "_id" : "78040", "city" : "LAREDO", "loc" : [ -99.49857900000001, 27.515538 ], "pop" : 43486, "state" : "TX" } +{ "_id" : "78041", "city" : "LAREDO", "loc" : [ -99.49065299999999, 27.556933 ], "pop" : 46156, "state" : "TX" } +{ "_id" : "78043", "city" : "RIO BRAVO", "loc" : [ -99.46548799999999, 27.481537 ], "pop" : 42505, "state" : "TX" } +{ "_id" : "78052", "city" : "LYTLE", "loc" : [ -98.794489, 29.236568 ], "pop" : 2078, "state" : "TX" } +{ "_id" : "78053", "city" : "MC COY", "loc" : [ -98.371565, 28.792661 ], "pop" : 34, "state" : "TX" } +{ "_id" : "78055", "city" : "MEDINA", "loc" : [ -99.306431, 29.790689 ], "pop" : 1590, "state" : "TX" } +{ "_id" : "78056", "city" : "MICO", "loc" : [ -98.88210599999999, 29.59105 ], "pop" : 230, "state" : "TX" } +{ "_id" : "78057", "city" : "MOORE", "loc" : [ -98.987403, 29.035377 ], "pop" : 767, "state" : "TX" } +{ "_id" : "78058", "city" : "MOUNTAIN HOME", "loc" : [ -99.318607, 30.213249 ], "pop" : 207, "state" : "TX" } +{ "_id" : "78059", "city" : "NATALIA", "loc" : [ -98.855158, 29.211669 ], "pop" : 4136, "state" : "TX" } +{ "_id" : "78060", "city" : "OAKVILLE", "loc" : [ -98.055392, 28.464402 ], "pop" : 261, "state" : "TX" } +{ "_id" : "78061", "city" : "PEARSALL", "loc" : [ -99.09436100000001, 28.892317 ], "pop" : 8981, "state" : "TX" } +{ "_id" : "78063", "city" : "LAKEHILLS", "loc" : [ -98.922118, 29.631513 ], "pop" : 3187, "state" : "TX" } +{ "_id" : "78064", "city" : "PLEASANTON", "loc" : [ -98.48306100000001, 28.992368 ], "pop" : 11977, "state" : "TX" } +{ "_id" : "78065", "city" : "POTEET", "loc" : [ -98.624071, 29.099405 ], "pop" : 9523, "state" : "TX" } +{ "_id" : "78066", "city" : "RIOMEDINA", "loc" : [ -98.866865, 29.490395 ], "pop" : 687, "state" : "TX" } +{ "_id" : "78067", "city" : "SAN YGNACIO", "loc" : [ -99.427148, 27.062523 ], "pop" : 871, "state" : "TX" } +{ "_id" : "78069", "city" : "SOMERSET", "loc" : [ -98.62140100000001, 29.211561 ], "pop" : 3477, "state" : "TX" } +{ "_id" : "78070", "city" : "SPRING BRANCH", "loc" : [ -98.37878600000001, 29.923815 ], "pop" : 1544, "state" : "TX" } +{ "_id" : "78071", "city" : "THREE RIVERS", "loc" : [ -98.178162, 28.475646 ], "pop" : 3190, "state" : "TX" } +{ "_id" : "78072", "city" : "TILDEN", "loc" : [ -98.569322, 28.419755 ], "pop" : 575, "state" : "TX" } +{ "_id" : "78073", "city" : "VON ORMY", "loc" : [ -98.66774100000001, 29.274979 ], "pop" : 2911, "state" : "TX" } +{ "_id" : "78075", "city" : "WHITSETT", "loc" : [ -98.256484, 28.637316 ], "pop" : 135, "state" : "TX" } +{ "_id" : "78076", "city" : "ZAPATA", "loc" : [ -99.250625, 26.88966 ], "pop" : 8408, "state" : "TX" } +{ "_id" : "78101", "city" : "ADKINS", "loc" : [ -98.26504, 29.380542 ], "pop" : 3611, "state" : "TX" } +{ "_id" : "78102", "city" : "BEEVILLE", "loc" : [ -97.761571, 28.422246 ], "pop" : 23211, "state" : "TX" } +{ "_id" : "78108", "city" : "CIBOLO", "loc" : [ -98.22798299999999, 29.574971 ], "pop" : 6062, "state" : "TX" } +{ "_id" : "78109", "city" : "CONVERSE", "loc" : [ -98.321673, 29.517331 ], "pop" : 13291, "state" : "TX" } +{ "_id" : "78111", "city" : "ECLETO", "loc" : [ -97.741185, 29.020128 ], "pop" : 0, "state" : "TX" } +{ "_id" : "78112", "city" : "ELMENDORF", "loc" : [ -98.371982, 29.230793 ], "pop" : 2251, "state" : "TX" } +{ "_id" : "78113", "city" : "FALLS CITY", "loc" : [ -98.015632, 28.981413 ], "pop" : 964, "state" : "TX" } +{ "_id" : "78114", "city" : "FLORESVILLE", "loc" : [ -98.193589, 29.169338 ], "pop" : 11510, "state" : "TX" } +{ "_id" : "78116", "city" : "GILLETT", "loc" : [ -97.83432500000001, 29.051353 ], "pop" : 641, "state" : "TX" } +{ "_id" : "78117", "city" : "HOBSON", "loc" : [ -97.970743, 28.944499 ], "pop" : 302, "state" : "TX" } +{ "_id" : "78118", "city" : "KARNES CITY", "loc" : [ -97.90707, 28.882757 ], "pop" : 3827, "state" : "TX" } +{ "_id" : "78119", "city" : "KENEDY", "loc" : [ -97.845601, 28.804584 ], "pop" : 5118, "state" : "TX" } +{ "_id" : "78121", "city" : "LA VERNIA", "loc" : [ -98.112971, 29.350905 ], "pop" : 4529, "state" : "TX" } +{ "_id" : "78122", "city" : "LEESVILLE", "loc" : [ -97.75662199999999, 29.396142 ], "pop" : 206, "state" : "TX" } +{ "_id" : "78123", "city" : "MC QUEENEY", "loc" : [ -98.03759100000001, 29.605655 ], "pop" : 2055, "state" : "TX" } +{ "_id" : "78124", "city" : "MARION", "loc" : [ -98.151709, 29.56835 ], "pop" : 4167, "state" : "TX" } +{ "_id" : "78130", "city" : "CANYON LAKE", "loc" : [ -98.113041, 29.694733 ], "pop" : 32975, "state" : "TX" } +{ "_id" : "78132", "city" : "CANYON LAKE", "loc" : [ -98.16721200000001, 29.72939 ], "pop" : 6412, "state" : "TX" } +{ "_id" : "78133", "city" : "CANYON LAKE", "loc" : [ -98.24941200000001, 29.870984 ], "pop" : 8428, "state" : "TX" } +{ "_id" : "78140", "city" : "NIXON", "loc" : [ -97.752898, 29.301649 ], "pop" : 2953, "state" : "TX" } +{ "_id" : "78141", "city" : "NORDHEIM", "loc" : [ -97.594579, 28.914225 ], "pop" : 655, "state" : "TX" } +{ "_id" : "78147", "city" : "POTH", "loc" : [ -98.08247, 29.06191 ], "pop" : 3000, "state" : "TX" } +{ "_id" : "78148", "city" : "RANDOLPH A F B", "loc" : [ -98.306742, 29.551608 ], "pop" : 13215, "state" : "TX" } +{ "_id" : "78150", "city" : "RANDOLPH A F B", "loc" : [ -98.27919300000001, 29.53021 ], "pop" : 4079, "state" : "TX" } +{ "_id" : "78151", "city" : "RUNGE", "loc" : [ -97.713824, 28.887556 ], "pop" : 1603, "state" : "TX" } +{ "_id" : "78152", "city" : "SAINT HEDWIG", "loc" : [ -98.195223, 29.435284 ], "pop" : 1685, "state" : "TX" } +{ "_id" : "78154", "city" : "SELMA", "loc" : [ -98.27221400000001, 29.568159 ], "pop" : 10332, "state" : "TX" } +{ "_id" : "78155", "city" : "SEGUIN", "loc" : [ -97.962801, 29.561316 ], "pop" : 32348, "state" : "TX" } +{ "_id" : "78159", "city" : "SMILEY", "loc" : [ -97.62271200000001, 29.265529 ], "pop" : 972, "state" : "TX" } +{ "_id" : "78160", "city" : "STOCKDALE", "loc" : [ -97.93508199999999, 29.231907 ], "pop" : 3085, "state" : "TX" } +{ "_id" : "78161", "city" : "SUTHERLAND SPRIN", "loc" : [ -98.07079400000001, 29.277831 ], "pop" : 1051, "state" : "TX" } +{ "_id" : "78163", "city" : "WETMORE", "loc" : [ -98.43784599999999, 29.780175 ], "pop" : 5491, "state" : "TX" } +{ "_id" : "78164", "city" : "YORKTOWN", "loc" : [ -97.512056, 28.989191 ], "pop" : 3733, "state" : "TX" } +{ "_id" : "78201", "city" : "BALCONES HEIGHTS", "loc" : [ -98.526352, 29.468525 ], "pop" : 43037, "state" : "TX" } +{ "_id" : "78202", "city" : "SAN ANTONIO", "loc" : [ -98.460112, 29.427462 ], "pop" : 12043, "state" : "TX" } +{ "_id" : "78203", "city" : "SAN ANTONIO", "loc" : [ -98.460127, 29.414799 ], "pop" : 7261, "state" : "TX" } +{ "_id" : "78204", "city" : "SAN ANTONIO", "loc" : [ -98.5063, 29.400217 ], "pop" : 11526, "state" : "TX" } +{ "_id" : "78205", "city" : "SAN ANTONIO", "loc" : [ -98.492509, 29.423711 ], "pop" : 1714, "state" : "TX" } +{ "_id" : "78207", "city" : "SAN ANTONIO", "loc" : [ -98.52596699999999, 29.422855 ], "pop" : 58355, "state" : "TX" } +{ "_id" : "78208", "city" : "SAN ANTONIO", "loc" : [ -98.458983, 29.440039 ], "pop" : 5007, "state" : "TX" } +{ "_id" : "78209", "city" : "ALAMO HEIGHTS", "loc" : [ -98.45577400000001, 29.488623 ], "pop" : 34701, "state" : "TX" } +{ "_id" : "78210", "city" : "SAN ANTONIO", "loc" : [ -98.465796, 29.397718 ], "pop" : 39300, "state" : "TX" } +{ "_id" : "78211", "city" : "SAN ANTONIO", "loc" : [ -98.545219, 29.358366 ], "pop" : 30417, "state" : "TX" } +{ "_id" : "78212", "city" : "OLMOS PARK", "loc" : [ -98.49581499999999, 29.461181 ], "pop" : 29762, "state" : "TX" } +{ "_id" : "78213", "city" : "CASTLE HILLS", "loc" : [ -98.522679, 29.513406 ], "pop" : 36060, "state" : "TX" } +{ "_id" : "78214", "city" : "SAN ANTONIO", "loc" : [ -98.492436, 29.364115 ], "pop" : 23338, "state" : "TX" } +{ "_id" : "78215", "city" : "SAN ANTONIO", "loc" : [ -98.479338, 29.441338 ], "pop" : 1264, "state" : "TX" } +{ "_id" : "78216", "city" : "SAN ANTONIO", "loc" : [ -98.497511, 29.533387 ], "pop" : 30435, "state" : "TX" } +{ "_id" : "78217", "city" : "SAN ANTONIO", "loc" : [ -98.419444, 29.539525 ], "pop" : 27925, "state" : "TX" } +{ "_id" : "78218", "city" : "SAN ANTONIO", "loc" : [ -98.403184, 29.496852 ], "pop" : 29276, "state" : "TX" } +{ "_id" : "78219", "city" : "KIRBY", "loc" : [ -98.39731500000001, 29.448794 ], "pop" : 14249, "state" : "TX" } +{ "_id" : "78220", "city" : "SAN ANTONIO", "loc" : [ -98.412791, 29.410641 ], "pop" : 17035, "state" : "TX" } +{ "_id" : "78221", "city" : "SAN ANTONIO", "loc" : [ -98.50541699999999, 29.330913 ], "pop" : 35392, "state" : "TX" } +{ "_id" : "78222", "city" : "SAN ANTONIO", "loc" : [ -98.396005, 29.383113 ], "pop" : 12729, "state" : "TX" } +{ "_id" : "78223", "city" : "SAN ANTONIO", "loc" : [ -98.43562799999999, 29.357869 ], "pop" : 38381, "state" : "TX" } +{ "_id" : "78224", "city" : "SAN ANTONIO", "loc" : [ -98.53933499999999, 29.337432 ], "pop" : 14894, "state" : "TX" } +{ "_id" : "78225", "city" : "SAN ANTONIO", "loc" : [ -98.524494, 29.387497 ], "pop" : 13803, "state" : "TX" } +{ "_id" : "78226", "city" : "SAN ANTONIO", "loc" : [ -98.551095, 29.393001 ], "pop" : 7141, "state" : "TX" } +{ "_id" : "78227", "city" : "SAN ANTONIO", "loc" : [ -98.643311, 29.402687 ], "pop" : 42329, "state" : "TX" } +{ "_id" : "78228", "city" : "SAN ANTONIO", "loc" : [ -98.56987100000001, 29.458937 ], "pop" : 58136, "state" : "TX" } +{ "_id" : "78229", "city" : "SAN ANTONIO", "loc" : [ -98.569726, 29.504228 ], "pop" : 22681, "state" : "TX" } +{ "_id" : "78230", "city" : "SAN ANTONIO", "loc" : [ -98.552117, 29.540738 ], "pop" : 30253, "state" : "TX" } +{ "_id" : "78231", "city" : "SHAVANO PARK", "loc" : [ -98.536817, 29.571434 ], "pop" : 7504, "state" : "TX" } +{ "_id" : "78232", "city" : "HOLLYWOOD PARK", "loc" : [ -98.46729999999999, 29.582833 ], "pop" : 27332, "state" : "TX" } +{ "_id" : "78233", "city" : "LIVE OAK", "loc" : [ -98.369128, 29.554741 ], "pop" : 36334, "state" : "TX" } +{ "_id" : "78234", "city" : "FORT SAM HOUSTON", "loc" : [ -98.43540400000001, 29.461961 ], "pop" : 8258, "state" : "TX" } +{ "_id" : "78235", "city" : "BROOKS A F B", "loc" : [ -98.43944399999999, 29.341733 ], "pop" : 885, "state" : "TX" } +{ "_id" : "78236", "city" : "WILFORD HALL U S", "loc" : [ -98.613367, 29.394267 ], "pop" : 8707, "state" : "TX" } +{ "_id" : "78237", "city" : "SAN ANTONIO", "loc" : [ -98.56454600000001, 29.420758 ], "pop" : 38900, "state" : "TX" } +{ "_id" : "78238", "city" : "LEON VALLEY", "loc" : [ -98.61545099999999, 29.476833 ], "pop" : 20840, "state" : "TX" } +{ "_id" : "78239", "city" : "WINDCREST", "loc" : [ -98.361604, 29.515686 ], "pop" : 21781, "state" : "TX" } +{ "_id" : "78240", "city" : "SAN ANTONIO", "loc" : [ -98.600566, 29.518896 ], "pop" : 33776, "state" : "TX" } +{ "_id" : "78241", "city" : "KELLY A F B", "loc" : [ -98.578063, 29.392432 ], "pop" : 1784, "state" : "TX" } +{ "_id" : "78242", "city" : "SAN ANTONIO", "loc" : [ -98.610927, 29.350905 ], "pop" : 24343, "state" : "TX" } +{ "_id" : "78244", "city" : "SAN ANTONIO", "loc" : [ -98.347585, 29.479264 ], "pop" : 13798, "state" : "TX" } +{ "_id" : "78245", "city" : "SAN ANTONIO", "loc" : [ -98.689494, 29.418927 ], "pop" : 20410, "state" : "TX" } +{ "_id" : "78247", "city" : "WETMORE", "loc" : [ -98.409783, 29.577604 ], "pop" : 25572, "state" : "TX" } +{ "_id" : "78248", "city" : "SAN ANTONIO", "loc" : [ -98.520105, 29.58936 ], "pop" : 4469, "state" : "TX" } +{ "_id" : "78249", "city" : "SAN ANTONIO", "loc" : [ -98.611666, 29.561245 ], "pop" : 19127, "state" : "TX" } +{ "_id" : "78250", "city" : "SAN ANTONIO", "loc" : [ -98.66876499999999, 29.505394 ], "pop" : 43845, "state" : "TX" } +{ "_id" : "78251", "city" : "SAN ANTONIO", "loc" : [ -98.655472, 29.459743 ], "pop" : 15297, "state" : "TX" } +{ "_id" : "78252", "city" : "SAN ANTONIO", "loc" : [ -98.646395, 29.346015 ], "pop" : 1378, "state" : "TX" } +{ "_id" : "78253", "city" : "SAN ANTONIO", "loc" : [ -98.74793099999999, 29.459923 ], "pop" : 3861, "state" : "TX" } +{ "_id" : "78254", "city" : "SAN ANTONIO", "loc" : [ -98.724841, 29.54091 ], "pop" : 1340, "state" : "TX" } +{ "_id" : "78255", "city" : "SAN ANTONIO", "loc" : [ -98.65557200000001, 29.636875 ], "pop" : 2544, "state" : "TX" } +{ "_id" : "78256", "city" : "SAN ANTONIO", "loc" : [ -98.625215, 29.616946 ], "pop" : 1237, "state" : "TX" } +{ "_id" : "78257", "city" : "SAN ANTONIO", "loc" : [ -98.61370100000001, 29.64953 ], "pop" : 1360, "state" : "TX" } +{ "_id" : "78258", "city" : "SAN ANTONIO", "loc" : [ -98.49669900000001, 29.65624 ], "pop" : 2877, "state" : "TX" } +{ "_id" : "78259", "city" : "SAN ANTONIO", "loc" : [ -98.444495, 29.628331 ], "pop" : 3865, "state" : "TX" } +{ "_id" : "78260", "city" : "SAN ANTONIO", "loc" : [ -98.475908, 29.702578 ], "pop" : 1684, "state" : "TX" } +{ "_id" : "78261", "city" : "SAN ANTONIO", "loc" : [ -98.41909200000001, 29.705463 ], "pop" : 487, "state" : "TX" } +{ "_id" : "78263", "city" : "SAN ANTONIO", "loc" : [ -98.317386, 29.36143 ], "pop" : 2836, "state" : "TX" } +{ "_id" : "78264", "city" : "SAN ANTONIO", "loc" : [ -98.472272, 29.173345 ], "pop" : 3723, "state" : "TX" } +{ "_id" : "78266", "city" : "GARDEN RIDGE", "loc" : [ -98.312774, 29.644226 ], "pop" : 2016, "state" : "TX" } +{ "_id" : "78332", "city" : "ALICE", "loc" : [ -98.08362200000001, 27.743171 ], "pop" : 28292, "state" : "TX" } +{ "_id" : "78336", "city" : "ARANSAS PASS", "loc" : [ -97.159091, 27.909498 ], "pop" : 9087, "state" : "TX" } +{ "_id" : "78338", "city" : "ARMSTRONG", "loc" : [ -97.70929099999999, 26.738706 ], "pop" : 148, "state" : "TX" } +{ "_id" : "78340", "city" : "BAYSIDE", "loc" : [ -97.210643, 28.096758 ], "pop" : 454, "state" : "TX" } +{ "_id" : "78343", "city" : "BISHOP", "loc" : [ -97.78303099999999, 27.588564 ], "pop" : 4608, "state" : "TX" } +{ "_id" : "78344", "city" : "BRUNI", "loc" : [ -98.85010800000001, 27.435329 ], "pop" : 508, "state" : "TX" } +{ "_id" : "78349", "city" : "CONCEPCION", "loc" : [ -98.381489, 27.544266 ], "pop" : 3458, "state" : "TX" } +{ "_id" : "78353", "city" : "ENCINO", "loc" : [ -98.192168, 26.924862 ], "pop" : 703, "state" : "TX" } +{ "_id" : "78355", "city" : "FALFURRIAS", "loc" : [ -98.140844, 27.22416 ], "pop" : 7501, "state" : "TX" } +{ "_id" : "78357", "city" : "FREER", "loc" : [ -98.606129, 27.879984 ], "pop" : 3922, "state" : "TX" } +{ "_id" : "78358", "city" : "FULTON", "loc" : [ -96.80837699999999, 28.223448 ], "pop" : 0, "state" : "TX" } +{ "_id" : "78360", "city" : "GUERRA", "loc" : [ -98.918886, 26.912753 ], "pop" : 34, "state" : "TX" } +{ "_id" : "78361", "city" : "HEBBRONVILLE", "loc" : [ -98.68288800000001, 27.2997 ], "pop" : 5078, "state" : "TX" } +{ "_id" : "78362", "city" : "INGLESIDE", "loc" : [ -97.206906, 27.868238 ], "pop" : 5871, "state" : "TX" } +{ "_id" : "78363", "city" : "KINGSVILLE NAVAL", "loc" : [ -97.85959800000001, 27.507418 ], "pop" : 28435, "state" : "TX" } +{ "_id" : "78368", "city" : "MATHIS", "loc" : [ -97.809659, 28.080208 ], "pop" : 11068, "state" : "TX" } +{ "_id" : "78369", "city" : "MIRANDO CITY", "loc" : [ -99.00111699999999, 27.445038 ], "pop" : 584, "state" : "TX" } +{ "_id" : "78370", "city" : "ODEM", "loc" : [ -97.583752, 27.940306 ], "pop" : 3299, "state" : "TX" } +{ "_id" : "78372", "city" : "ORANGE GROVE", "loc" : [ -97.983835, 27.948659 ], "pop" : 4339, "state" : "TX" } +{ "_id" : "78374", "city" : "PORTLAND", "loc" : [ -97.316931, 27.893547 ], "pop" : 15830, "state" : "TX" } +{ "_id" : "78375", "city" : "PREMONT", "loc" : [ -98.13301800000001, 27.354444 ], "pop" : 4051, "state" : "TX" } +{ "_id" : "78376", "city" : "REALITOS", "loc" : [ -98.535493, 27.416283 ], "pop" : 520, "state" : "TX" } +{ "_id" : "78377", "city" : "REFUGIO", "loc" : [ -97.27666499999999, 28.316944 ], "pop" : 4004, "state" : "TX" } +{ "_id" : "78379", "city" : "RIVIERA", "loc" : [ -97.778707, 27.321735 ], "pop" : 1839, "state" : "TX" } +{ "_id" : "78380", "city" : "ROBSTOWN", "loc" : [ -97.699523, 27.798395 ], "pop" : 24903, "state" : "TX" } +{ "_id" : "78382", "city" : "ROCKPORT", "loc" : [ -97.06877299999999, 28.030778 ], "pop" : 16944, "state" : "TX" } +{ "_id" : "78383", "city" : "SANDIA", "loc" : [ -97.89784899999999, 28.070879 ], "pop" : 2053, "state" : "TX" } +{ "_id" : "78384", "city" : "SAN DIEGO", "loc" : [ -98.250297, 27.76535 ], "pop" : 5018, "state" : "TX" } +{ "_id" : "78385", "city" : "SARITA", "loc" : [ -97.85762699999999, 27.149622 ], "pop" : 312, "state" : "TX" } +{ "_id" : "78387", "city" : "SINTON", "loc" : [ -97.519582, 28.033895 ], "pop" : 9051, "state" : "TX" } +{ "_id" : "78389", "city" : "SKIDMORE", "loc" : [ -97.666071, 28.230577 ], "pop" : 1785, "state" : "TX" } +{ "_id" : "78390", "city" : "TAFT", "loc" : [ -97.39662300000001, 27.976517 ], "pop" : 6140, "state" : "TX" } +{ "_id" : "78391", "city" : "TYNAN", "loc" : [ -97.754881, 28.169341 ], "pop" : 327, "state" : "TX" } +{ "_id" : "78393", "city" : "WOODSBORO", "loc" : [ -97.31921, 28.223222 ], "pop" : 2559, "state" : "TX" } +{ "_id" : "78401", "city" : "CORPUS CHRISTI", "loc" : [ -97.40299400000001, 27.794086 ], "pop" : 5811, "state" : "TX" } +{ "_id" : "78402", "city" : "CORPUS CHRISTI", "loc" : [ -97.385659, 27.82621 ], "pop" : 451, "state" : "TX" } +{ "_id" : "78404", "city" : "CORPUS CHRISTI", "loc" : [ -97.40125500000001, 27.768329 ], "pop" : 17395, "state" : "TX" } +{ "_id" : "78405", "city" : "CORPUS CHRISTI", "loc" : [ -97.427132, 27.776234 ], "pop" : 17437, "state" : "TX" } +{ "_id" : "78406", "city" : "CORPUS CHRISTI", "loc" : [ -97.51445, 27.768412 ], "pop" : 1556, "state" : "TX" } +{ "_id" : "78407", "city" : "CORPUS CHRISTI", "loc" : [ -97.435597, 27.804195 ], "pop" : 6334, "state" : "TX" } +{ "_id" : "78408", "city" : "CORPUS CHRISTI", "loc" : [ -97.43814999999999, 27.794477 ], "pop" : 10071, "state" : "TX" } +{ "_id" : "78409", "city" : "CORPUS CHRISTI", "loc" : [ -97.527034, 27.814555 ], "pop" : 2655, "state" : "TX" } +{ "_id" : "78410", "city" : "CORPUS CHRISTI", "loc" : [ -97.596002, 27.84585 ], "pop" : 20860, "state" : "TX" } +{ "_id" : "78411", "city" : "CORPUS CHRISTI", "loc" : [ -97.387732, 27.731139 ], "pop" : 27625, "state" : "TX" } +{ "_id" : "78412", "city" : "CORPUS CHRISTI", "loc" : [ -97.353694, 27.70608 ], "pop" : 33510, "state" : "TX" } +{ "_id" : "78413", "city" : "CORPUS CHRISTI", "loc" : [ -97.39832, 27.691041 ], "pop" : 27278, "state" : "TX" } +{ "_id" : "78414", "city" : "CORPUS CHRISTI", "loc" : [ -97.365016, 27.677016 ], "pop" : 8600, "state" : "TX" } +{ "_id" : "78415", "city" : "CORPUS CHRISTI", "loc" : [ -97.40778, 27.726204 ], "pop" : 39998, "state" : "TX" } +{ "_id" : "78416", "city" : "CORPUS CHRISTI", "loc" : [ -97.43468, 27.753593 ], "pop" : 16634, "state" : "TX" } +{ "_id" : "78417", "city" : "CORPUS CHRISTI", "loc" : [ -97.44942899999999, 27.728964 ], "pop" : 3075, "state" : "TX" } +{ "_id" : "78418", "city" : "CORPUS CHRISTI", "loc" : [ -97.266558, 27.668531 ], "pop" : 20449, "state" : "TX" } +{ "_id" : "78419", "city" : "CORPUS CHRISTI", "loc" : [ -97.27636, 27.692502 ], "pop" : 1873, "state" : "TX" } +{ "_id" : "78473", "city" : "CORPUS CHRISTI", "loc" : [ -97.396624, 27.79515 ], "pop" : 0, "state" : "TX" } +{ "_id" : "78501", "city" : "MCALLEN", "loc" : [ -98.235871, 26.21544 ], "pop" : 53932, "state" : "TX" } +{ "_id" : "78503", "city" : "MCALLEN", "loc" : [ -98.251974, 26.177115 ], "pop" : 14820, "state" : "TX" } +{ "_id" : "78504", "city" : "MCALLEN", "loc" : [ -98.230253, 26.255645 ], "pop" : 15182, "state" : "TX" } +{ "_id" : "78516", "city" : "ALAMO", "loc" : [ -98.116445, 26.190578 ], "pop" : 16555, "state" : "TX" } +{ "_id" : "78520", "city" : "BROWNSVILLE", "loc" : [ -97.517413, 25.933743 ], "pop" : 50091, "state" : "TX" } +{ "_id" : "78521", "city" : "BROWNSVILLE", "loc" : [ -97.461236, 25.922103 ], "pop" : 79463, "state" : "TX" } +{ "_id" : "78536", "city" : "DELMITA", "loc" : [ -98.396553, 26.656571 ], "pop" : 55, "state" : "TX" } +{ "_id" : "78537", "city" : "DONNA", "loc" : [ -98.052925, 26.167138 ], "pop" : 20909, "state" : "TX" } +{ "_id" : "78538", "city" : "MONTE ALTO", "loc" : [ -97.97547299999999, 26.304208 ], "pop" : 16225, "state" : "TX" } +{ "_id" : "78539", "city" : "EDINBURG", "loc" : [ -98.15692199999999, 26.304221 ], "pop" : 52534, "state" : "TX" } +{ "_id" : "78547", "city" : "GARCIASVILLE", "loc" : [ -98.669112, 26.312894 ], "pop" : 5741, "state" : "TX" } +{ "_id" : "78548", "city" : "GRULLA", "loc" : [ -98.596041, 26.293714 ], "pop" : 303, "state" : "TX" } +{ "_id" : "78549", "city" : "HARGILL", "loc" : [ -97.99933, 26.433812 ], "pop" : 1294, "state" : "TX" } +{ "_id" : "78550", "city" : "HARLINGEN", "loc" : [ -97.688981, 26.195142 ], "pop" : 43292, "state" : "TX" } +{ "_id" : "78552", "city" : "HARLINGEN", "loc" : [ -97.746771, 26.183069 ], "pop" : 21672, "state" : "TX" } +{ "_id" : "78557", "city" : "HIDALGO", "loc" : [ -98.253641, 26.102832 ], "pop" : 3300, "state" : "TX" } +{ "_id" : "78559", "city" : "LA FERIA", "loc" : [ -97.826115, 26.166556 ], "pop" : 8446, "state" : "TX" } +{ "_id" : "78563", "city" : "LINN", "loc" : [ -98.17986999999999, 26.542054 ], "pop" : 1244, "state" : "TX" } +{ "_id" : "78566", "city" : "BAYVIEW", "loc" : [ -97.490402, 26.091068 ], "pop" : 9033, "state" : "TX" } +{ "_id" : "78569", "city" : "LYFORD", "loc" : [ -97.78165300000001, 26.408926 ], "pop" : 2757, "state" : "TX" } +{ "_id" : "78570", "city" : "MERCEDES", "loc" : [ -97.918503, 26.15133 ], "pop" : 21450, "state" : "TX" } +{ "_id" : "78572", "city" : "ALTON", "loc" : [ -98.342647, 26.24153 ], "pop" : 67604, "state" : "TX" } +{ "_id" : "78577", "city" : "PHARR", "loc" : [ -98.187022, 26.177053 ], "pop" : 36070, "state" : "TX" } +{ "_id" : "78578", "city" : "PORT ISABEL", "loc" : [ -97.254389, 26.08764 ], "pop" : 9335, "state" : "TX" } +{ "_id" : "78580", "city" : "RAYMONDVILLE", "loc" : [ -97.79666, 26.479243 ], "pop" : 11642, "state" : "TX" } +{ "_id" : "78582", "city" : "RIO GRANDE CITY", "loc" : [ -98.810444, 26.394194 ], "pop" : 19113, "state" : "TX" } +{ "_id" : "78583", "city" : "RIO HONDO", "loc" : [ -97.551311, 26.233855 ], "pop" : 4990, "state" : "TX" } +{ "_id" : "78584", "city" : "ROMA", "loc" : [ -99.00247899999999, 26.421545 ], "pop" : 14612, "state" : "TX" } +{ "_id" : "78586", "city" : "SAN BENITO", "loc" : [ -97.64474800000001, 26.133659 ], "pop" : 28609, "state" : "TX" } +{ "_id" : "78588", "city" : "SAN ISIDRO", "loc" : [ -98.416147, 26.721404 ], "pop" : 468, "state" : "TX" } +{ "_id" : "78589", "city" : "SAN JUAN", "loc" : [ -98.153729, 26.204375 ], "pop" : 18419, "state" : "TX" } +{ "_id" : "78590", "city" : "SAN PERLITA", "loc" : [ -97.61569900000001, 26.483156 ], "pop" : 886, "state" : "TX" } +{ "_id" : "78591", "city" : "SANTA ELENA", "loc" : [ -98.519412, 26.73364 ], "pop" : 223, "state" : "TX" } +{ "_id" : "78593", "city" : "SANTA ROSA", "loc" : [ -97.82566300000001, 26.255508 ], "pop" : 3393, "state" : "TX" } +{ "_id" : "78594", "city" : "SEBASTIAN", "loc" : [ -97.774728, 26.34524 ], "pop" : 2137, "state" : "TX" } +{ "_id" : "78595", "city" : "SULLIVAN CITY", "loc" : [ -98.562713, 26.27197 ], "pop" : 3351, "state" : "TX" } +{ "_id" : "78596", "city" : "WESLACO", "loc" : [ -97.988714, 26.169444 ], "pop" : 40652, "state" : "TX" } +{ "_id" : "78597", "city" : "SOUTH PADRE ISLA", "loc" : [ -97.167294, 26.111105 ], "pop" : 1796, "state" : "TX" } +{ "_id" : "78598", "city" : "PORT MANSFIELD", "loc" : [ -97.427982, 26.555237 ], "pop" : 287, "state" : "TX" } +{ "_id" : "78602", "city" : "BASTROP", "loc" : [ -97.292101, 30.13883 ], "pop" : 10588, "state" : "TX" } +{ "_id" : "78603", "city" : "BEBE", "loc" : [ -97.626594, 29.422211 ], "pop" : 82, "state" : "TX" } +{ "_id" : "78605", "city" : "BERTRAM", "loc" : [ -98.052932, 30.741082 ], "pop" : 1622, "state" : "TX" } +{ "_id" : "78606", "city" : "BLANCO", "loc" : [ -98.410663, 30.087359 ], "pop" : 3152, "state" : "TX" } +{ "_id" : "78607", "city" : "BLUFFTON", "loc" : [ -98.51503, 30.825633 ], "pop" : 31, "state" : "TX" } +{ "_id" : "78608", "city" : "BRIGGS", "loc" : [ -97.97022800000001, 30.932546 ], "pop" : 715, "state" : "TX" } +{ "_id" : "78609", "city" : "BUCHANAN DAM", "loc" : [ -98.453226, 30.759765 ], "pop" : 1457, "state" : "TX" } +{ "_id" : "78610", "city" : "BUDA", "loc" : [ -97.85342199999999, 30.091758 ], "pop" : 7487, "state" : "TX" } +{ "_id" : "78611", "city" : "BURNET", "loc" : [ -98.26424, 30.776597 ], "pop" : 8460, "state" : "TX" } +{ "_id" : "78612", "city" : "CEDAR CREEK", "loc" : [ -97.497602, 30.096636 ], "pop" : 8026, "state" : "TX" } +{ "_id" : "78613", "city" : "CEDAR PARK", "loc" : [ -97.817571, 30.477165 ], "pop" : 22192, "state" : "TX" } +{ "_id" : "78614", "city" : "COST", "loc" : [ -97.553124, 29.432098 ], "pop" : 286, "state" : "TX" } +{ "_id" : "78615", "city" : "COUPLAND", "loc" : [ -97.330364, 30.532357 ], "pop" : 2311, "state" : "TX" } +{ "_id" : "78616", "city" : "DALE", "loc" : [ -97.580968, 29.952785 ], "pop" : 2666, "state" : "TX" } +{ "_id" : "78617", "city" : "DEL VALLE", "loc" : [ -97.613443, 30.174492 ], "pop" : 5635, "state" : "TX" } +{ "_id" : "78618", "city" : "DOSS", "loc" : [ -99.17072, 30.461319 ], "pop" : 54, "state" : "TX" } +{ "_id" : "78619", "city" : "DRIFTWOOD", "loc" : [ -98.05237200000001, 30.159351 ], "pop" : 1064, "state" : "TX" } +{ "_id" : "78620", "city" : "DRIPPING SPRINGS", "loc" : [ -98.102947, 30.226768 ], "pop" : 3453, "state" : "TX" } +{ "_id" : "78621", "city" : "ELGIN", "loc" : [ -97.37374800000001, 30.323136 ], "pop" : 9852, "state" : "TX" } +{ "_id" : "78623", "city" : "FISCHER", "loc" : [ -98.25828300000001, 29.969588 ], "pop" : 459, "state" : "TX" } +{ "_id" : "78624", "city" : "FREDERICKSBURG", "loc" : [ -98.87992800000001, 30.281658 ], "pop" : 15125, "state" : "TX" } +{ "_id" : "78626", "city" : "GEORGETOWN", "loc" : [ -97.670704, 30.633038 ], "pop" : 8153, "state" : "TX" } +{ "_id" : "78628", "city" : "ANDICE", "loc" : [ -97.70093900000001, 30.659364 ], "pop" : 14100, "state" : "TX" } +{ "_id" : "78629", "city" : "GONZALES", "loc" : [ -97.449456, 29.50857 ], "pop" : 11297, "state" : "TX" } +{ "_id" : "78631", "city" : "HARPER", "loc" : [ -99.24104800000001, 30.281637 ], "pop" : 1144, "state" : "TX" } +{ "_id" : "78632", "city" : "HARWOOD", "loc" : [ -97.490622, 29.666108 ], "pop" : 295, "state" : "TX" } +{ "_id" : "78634", "city" : "HUTTO", "loc" : [ -97.56720300000001, 30.525725 ], "pop" : 2314, "state" : "TX" } +{ "_id" : "78635", "city" : "HYE", "loc" : [ -98.539607, 30.226866 ], "pop" : 341, "state" : "TX" } +{ "_id" : "78636", "city" : "JOHNSON CITY", "loc" : [ -98.36908200000001, 30.294806 ], "pop" : 2219, "state" : "TX" } +{ "_id" : "78638", "city" : "KINGSBURY", "loc" : [ -97.830634, 29.672566 ], "pop" : 1073, "state" : "TX" } +{ "_id" : "78639", "city" : "KINGSLAND", "loc" : [ -98.447492, 30.666212 ], "pop" : 2797, "state" : "TX" } +{ "_id" : "78640", "city" : "UHLAND", "loc" : [ -97.83710600000001, 30.0043 ], "pop" : 8770, "state" : "TX" } +{ "_id" : "78641", "city" : "LEANDER", "loc" : [ -97.87516599999999, 30.552888 ], "pop" : 10882, "state" : "TX" } +{ "_id" : "78642", "city" : "LIBERTY HILL", "loc" : [ -97.93159799999999, 30.662953 ], "pop" : 2028, "state" : "TX" } +{ "_id" : "78643", "city" : "SUNRISE BEACH", "loc" : [ -98.652727, 30.722533 ], "pop" : 4802, "state" : "TX" } +{ "_id" : "78644", "city" : "LOCKHART", "loc" : [ -97.676922, 29.886759 ], "pop" : 11690, "state" : "TX" } +{ "_id" : "78645", "city" : "JONESTOWN", "loc" : [ -97.97023, 30.459796 ], "pop" : 4060, "state" : "TX" } +{ "_id" : "78648", "city" : "LULING", "loc" : [ -97.649947, 29.682621 ], "pop" : 6587, "state" : "TX" } +{ "_id" : "78650", "city" : "MC DADE", "loc" : [ -97.238556, 30.296816 ], "pop" : 721, "state" : "TX" } +{ "_id" : "78652", "city" : "MANCHACA", "loc" : [ -97.853793, 30.127267 ], "pop" : 4049, "state" : "TX" } +{ "_id" : "78653", "city" : "MANOR", "loc" : [ -97.532295, 30.338817 ], "pop" : 5359, "state" : "TX" } +{ "_id" : "78654", "city" : "CYPRESS MILL", "loc" : [ -98.30699199999999, 30.57228 ], "pop" : 13422, "state" : "TX" } +{ "_id" : "78655", "city" : "MARTINDALE", "loc" : [ -97.79331999999999, 29.793328 ], "pop" : 2081, "state" : "TX" } +{ "_id" : "78656", "city" : "MAXWELL", "loc" : [ -97.852852, 29.878628 ], "pop" : 3974, "state" : "TX" } +{ "_id" : "78659", "city" : "PAIGE", "loc" : [ -97.119771, 30.185799 ], "pop" : 1294, "state" : "TX" } +{ "_id" : "78660", "city" : "PFLUGERVILLE", "loc" : [ -97.629895, 30.442133 ], "pop" : 12297, "state" : "TX" } +{ "_id" : "78662", "city" : "RED ROCK", "loc" : [ -97.408058, 29.990616 ], "pop" : 1963, "state" : "TX" } +{ "_id" : "78663", "city" : "ROUND MOUNTAIN", "loc" : [ -98.436514, 30.442879 ], "pop" : 169, "state" : "TX" } +{ "_id" : "78664", "city" : "ROUND ROCK", "loc" : [ -97.66802800000001, 30.51452 ], "pop" : 20142, "state" : "TX" } +{ "_id" : "78665", "city" : "SANDY", "loc" : [ -98.509846, 30.339127 ], "pop" : 91, "state" : "TX" } +{ "_id" : "78666", "city" : "SAN MARCOS", "loc" : [ -97.94041799999999, 29.875359 ], "pop" : 39087, "state" : "TX" } +{ "_id" : "78669", "city" : "SPICEWOOD", "loc" : [ -98.05392000000001, 30.389945 ], "pop" : 2235, "state" : "TX" } +{ "_id" : "78671", "city" : "ALBERT", "loc" : [ -98.655468, 30.224921 ], "pop" : 777, "state" : "TX" } +{ "_id" : "78672", "city" : "TOW", "loc" : [ -98.459647, 30.860867 ], "pop" : 874, "state" : "TX" } +{ "_id" : "78675", "city" : "WILLOW CITY", "loc" : [ -98.66458900000001, 30.454889 ], "pop" : 104, "state" : "TX" } +{ "_id" : "78676", "city" : "WIMBERLEY", "loc" : [ -98.11230999999999, 30.026471 ], "pop" : 7004, "state" : "TX" } +{ "_id" : "78677", "city" : "WRIGHTSBORO", "loc" : [ -97.503531, 29.357772 ], "pop" : 26, "state" : "TX" } +{ "_id" : "78681", "city" : "ROUND ROCK", "loc" : [ -97.706171, 30.508431 ], "pop" : 17196, "state" : "TX" } +{ "_id" : "78701", "city" : "AUSTIN", "loc" : [ -97.742559, 30.271289 ], "pop" : 3857, "state" : "TX" } +{ "_id" : "78702", "city" : "AUSTIN", "loc" : [ -97.716589, 30.263817 ], "pop" : 21432, "state" : "TX" } +{ "_id" : "78703", "city" : "AUSTIN", "loc" : [ -97.764809, 30.290671 ], "pop" : 18253, "state" : "TX" } +{ "_id" : "78704", "city" : "AUSTIN", "loc" : [ -97.765788, 30.242831 ], "pop" : 39211, "state" : "TX" } +{ "_id" : "78705", "city" : "AUSTIN", "loc" : [ -97.739627, 30.289619 ], "pop" : 23679, "state" : "TX" } +{ "_id" : "78717", "city" : "AUSTIN", "loc" : [ -97.747187, 30.505972 ], "pop" : 2516, "state" : "TX" } +{ "_id" : "78719", "city" : "AUSTIN", "loc" : [ -97.666701, 30.180243 ], "pop" : 5368, "state" : "TX" } +{ "_id" : "78721", "city" : "AUSTIN", "loc" : [ -97.686798, 30.272144 ], "pop" : 9091, "state" : "TX" } +{ "_id" : "78722", "city" : "AUSTIN", "loc" : [ -97.71495, 30.289305 ], "pop" : 5588, "state" : "TX" } +{ "_id" : "78723", "city" : "AUSTIN", "loc" : [ -97.68494099999999, 30.308515 ], "pop" : 22972, "state" : "TX" } +{ "_id" : "78724", "city" : "AUSTIN", "loc" : [ -97.63958700000001, 30.295982 ], "pop" : 6465, "state" : "TX" } +{ "_id" : "78725", "city" : "AUSTIN", "loc" : [ -97.624301, 30.256186 ], "pop" : 2764, "state" : "TX" } +{ "_id" : "78726", "city" : "AUSTIN", "loc" : [ -97.832649, 30.43 ], "pop" : 871, "state" : "TX" } +{ "_id" : "78727", "city" : "AUSTIN", "loc" : [ -97.719488, 30.425422 ], "pop" : 14276, "state" : "TX" } +{ "_id" : "78728", "city" : "AUSTIN", "loc" : [ -97.681123, 30.441679 ], "pop" : 8051, "state" : "TX" } +{ "_id" : "78729", "city" : "AUSTIN", "loc" : [ -97.768787, 30.45206 ], "pop" : 16611, "state" : "TX" } +{ "_id" : "78730", "city" : "AUSTIN", "loc" : [ -97.824062, 30.360745 ], "pop" : 1021, "state" : "TX" } +{ "_id" : "78731", "city" : "AUSTIN", "loc" : [ -97.760887, 30.347129 ], "pop" : 23276, "state" : "TX" } +{ "_id" : "78732", "city" : "AUSTIN", "loc" : [ -97.900685, 30.375233 ], "pop" : 919, "state" : "TX" } +{ "_id" : "78733", "city" : "AUSTIN", "loc" : [ -97.86663299999999, 30.331355 ], "pop" : 4083, "state" : "TX" } +{ "_id" : "78734", "city" : "LAKEWAY", "loc" : [ -97.95755800000001, 30.377404 ], "pop" : 7495, "state" : "TX" } +{ "_id" : "78735", "city" : "AUSTIN", "loc" : [ -97.84142300000001, 30.248978 ], "pop" : 3463, "state" : "TX" } +{ "_id" : "78736", "city" : "AUSTIN", "loc" : [ -97.91596800000001, 30.244433 ], "pop" : 5812, "state" : "TX" } +{ "_id" : "78737", "city" : "AUSTIN", "loc" : [ -97.94274900000001, 30.210692 ], "pop" : 4135, "state" : "TX" } +{ "_id" : "78738", "city" : "AUSTIN", "loc" : [ -97.982367, 30.333708 ], "pop" : 606, "state" : "TX" } +{ "_id" : "78739", "city" : "AUSTIN", "loc" : [ -97.878433, 30.172026 ], "pop" : 3104, "state" : "TX" } +{ "_id" : "78741", "city" : "AUSTIN", "loc" : [ -97.722317, 30.231513 ], "pop" : 25424, "state" : "TX" } +{ "_id" : "78742", "city" : "AUSTIN", "loc" : [ -97.670349, 30.231296 ], "pop" : 1653, "state" : "TX" } +{ "_id" : "78744", "city" : "AUSTIN", "loc" : [ -97.74723, 30.18764 ], "pop" : 23418, "state" : "TX" } +{ "_id" : "78745", "city" : "AUSTIN", "loc" : [ -97.795599, 30.206298 ], "pop" : 48151, "state" : "TX" } +{ "_id" : "78746", "city" : "WEST LAKE HILLS", "loc" : [ -97.80812899999999, 30.285009 ], "pop" : 18855, "state" : "TX" } +{ "_id" : "78747", "city" : "CREEDMOOR", "loc" : [ -97.76212700000001, 30.130235 ], "pop" : 3070, "state" : "TX" } +{ "_id" : "78748", "city" : "AUSTIN", "loc" : [ -97.822474, 30.174311 ], "pop" : 16288, "state" : "TX" } +{ "_id" : "78749", "city" : "AUSTIN", "loc" : [ -97.85075500000001, 30.216641 ], "pop" : 13674, "state" : "TX" } +{ "_id" : "78750", "city" : "AUSTIN", "loc" : [ -97.79667600000001, 30.422401 ], "pop" : 8867, "state" : "TX" } +{ "_id" : "78751", "city" : "AUSTIN", "loc" : [ -97.724163, 30.309288 ], "pop" : 12715, "state" : "TX" } +{ "_id" : "78752", "city" : "AUSTIN", "loc" : [ -97.700394, 30.331562 ], "pop" : 13311, "state" : "TX" } +{ "_id" : "78753", "city" : "AUSTIN", "loc" : [ -97.682658, 30.36485 ], "pop" : 26823, "state" : "TX" } +{ "_id" : "78754", "city" : "AUSTIN", "loc" : [ -97.667267, 30.342331 ], "pop" : 2328, "state" : "TX" } +{ "_id" : "78756", "city" : "AUSTIN", "loc" : [ -97.73903199999999, 30.322312 ], "pop" : 7525, "state" : "TX" } +{ "_id" : "78757", "city" : "AUSTIN", "loc" : [ -97.731617, 30.343732 ], "pop" : 11723, "state" : "TX" } +{ "_id" : "78758", "city" : "AUSTIN", "loc" : [ -97.707758, 30.376431 ], "pop" : 43246, "state" : "TX" } +{ "_id" : "78759", "city" : "AUSTIN", "loc" : [ -97.752602, 30.403614 ], "pop" : 27479, "state" : "TX" } +{ "_id" : "78801", "city" : "UVALDE", "loc" : [ -99.793074, 29.217238 ], "pop" : 19725, "state" : "TX" } +{ "_id" : "78827", "city" : "ASHERTON", "loc" : [ -99.748611, 28.436421 ], "pop" : 1869, "state" : "TX" } +{ "_id" : "78828", "city" : "BARKSDALE", "loc" : [ -100.070983, 29.708488 ], "pop" : 353, "state" : "TX" } +{ "_id" : "78829", "city" : "BATESVILLE", "loc" : [ -99.611457, 28.928648 ], "pop" : 1512, "state" : "TX" } +{ "_id" : "78830", "city" : "BIG WELLS", "loc" : [ -99.57808300000001, 28.569344 ], "pop" : 882, "state" : "TX" } +{ "_id" : "78832", "city" : "BRACKETTVILLE", "loc" : [ -100.415495, 29.30963 ], "pop" : 3119, "state" : "TX" } +{ "_id" : "78833", "city" : "CAMP WOOD", "loc" : [ -100.00838, 29.679491 ], "pop" : 1017, "state" : "TX" } +{ "_id" : "78834", "city" : "CARRIZO SPRINGS", "loc" : [ -99.863513, 28.52779 ], "pop" : 7682, "state" : "TX" } +{ "_id" : "78837", "city" : "COMSTOCK", "loc" : [ -101.262755, 29.74842 ], "pop" : 497, "state" : "TX" } +{ "_id" : "78838", "city" : "CONCAN", "loc" : [ -99.68424400000001, 29.524057 ], "pop" : 201, "state" : "TX" } +{ "_id" : "78839", "city" : "CRYSTAL CITY", "loc" : [ -99.826412, 28.686953 ], "pop" : 9130, "state" : "TX" } +{ "_id" : "78840", "city" : "LAUGHLIN A F B", "loc" : [ -100.891555, 29.373881 ], "pop" : 38233, "state" : "TX" } +{ "_id" : "78850", "city" : "D HANIS", "loc" : [ -99.28348800000001, 29.3398 ], "pop" : 1337, "state" : "TX" } +{ "_id" : "78851", "city" : "DRYDEN", "loc" : [ -102.33207, 30.165108 ], "pop" : 1410, "state" : "TX" } +{ "_id" : "78852", "city" : "EAGLE PASS", "loc" : [ -100.48176, 28.702786 ], "pop" : 35136, "state" : "TX" } +{ "_id" : "78861", "city" : "DUNLAY", "loc" : [ -99.12763699999999, 29.356065 ], "pop" : 8114, "state" : "TX" } +{ "_id" : "78870", "city" : "KNIPPA", "loc" : [ -99.637171, 29.291119 ], "pop" : 618, "state" : "TX" } +{ "_id" : "78872", "city" : "LA PRYOR", "loc" : [ -99.85074, 28.948848 ], "pop" : 1520, "state" : "TX" } +{ "_id" : "78873", "city" : "LEAKEY", "loc" : [ -99.747913, 29.768951 ], "pop" : 1142, "state" : "TX" } +{ "_id" : "78877", "city" : "SPOFFORD", "loc" : [ -100.574181, 28.942688 ], "pop" : 1242, "state" : "TX" } +{ "_id" : "78879", "city" : "RIO FRIO", "loc" : [ -99.77233699999999, 29.658295 ], "pop" : 253, "state" : "TX" } +{ "_id" : "78880", "city" : "ROCKSPRINGS", "loc" : [ -100.231029, 30.018756 ], "pop" : 1904, "state" : "TX" } +{ "_id" : "78881", "city" : "SABINAL", "loc" : [ -99.478109, 29.326668 ], "pop" : 2203, "state" : "TX" } +{ "_id" : "78883", "city" : "TARPLEY", "loc" : [ -99.24687400000001, 29.645494 ], "pop" : 20, "state" : "TX" } +{ "_id" : "78884", "city" : "UTOPIA", "loc" : [ -99.558454, 29.597197 ], "pop" : 593, "state" : "TX" } +{ "_id" : "78885", "city" : "VANDERPOOL", "loc" : [ -99.555542, 29.741779 ], "pop" : 227, "state" : "TX" } +{ "_id" : "78886", "city" : "YANCEY", "loc" : [ -99.14277, 29.140398 ], "pop" : 368, "state" : "TX" } +{ "_id" : "78931", "city" : "BLEIBLERVILLE", "loc" : [ -96.418719, 29.967572 ], "pop" : 1226, "state" : "TX" } +{ "_id" : "78932", "city" : "CARMINE", "loc" : [ -96.686077, 30.140351 ], "pop" : 356, "state" : "TX" } +{ "_id" : "78933", "city" : "CAT SPRING", "loc" : [ -96.390029, 29.751204 ], "pop" : 658, "state" : "TX" } +{ "_id" : "78934", "city" : "COLUMBUS", "loc" : [ -96.5527, 29.703247 ], "pop" : 5234, "state" : "TX" } +{ "_id" : "78935", "city" : "ALLEYTON", "loc" : [ -96.46312, 29.745286 ], "pop" : 273, "state" : "TX" } +{ "_id" : "78938", "city" : "ELLINGER", "loc" : [ -96.69663, 29.845915 ], "pop" : 374, "state" : "TX" } +{ "_id" : "78940", "city" : "FAYETTEVILLE", "loc" : [ -96.646317, 29.886789 ], "pop" : 2290, "state" : "TX" } +{ "_id" : "78941", "city" : "FLATONIA", "loc" : [ -97.098685, 29.709493 ], "pop" : 2934, "state" : "TX" } +{ "_id" : "78942", "city" : "GIDDINGS", "loc" : [ -96.93322000000001, 30.177725 ], "pop" : 6799, "state" : "TX" } +{ "_id" : "78944", "city" : "INDUSTRY", "loc" : [ -96.518849, 29.971789 ], "pop" : 1258, "state" : "TX" } +{ "_id" : "78945", "city" : "LA GRANGE", "loc" : [ -96.885988, 29.903978 ], "pop" : 10019, "state" : "TX" } +{ "_id" : "78946", "city" : "LEDBETTER", "loc" : [ -96.761276, 30.238307 ], "pop" : 806, "state" : "TX" } +{ "_id" : "78947", "city" : "LEXINGTON", "loc" : [ -97.052387, 30.419144 ], "pop" : 3138, "state" : "TX" } +{ "_id" : "78948", "city" : "LINCOLN", "loc" : [ -96.970159, 30.317693 ], "pop" : 1228, "state" : "TX" } +{ "_id" : "78949", "city" : "MULDOON", "loc" : [ -97.100562, 29.799305 ], "pop" : 8, "state" : "TX" } +{ "_id" : "78950", "city" : "NEW ULM", "loc" : [ -96.537963, 29.814248 ], "pop" : 689, "state" : "TX" } +{ "_id" : "78953", "city" : "ROSANKY", "loc" : [ -97.311875, 29.924122 ], "pop" : 1345, "state" : "TX" } +{ "_id" : "78954", "city" : "ROUND TOP", "loc" : [ -96.734058, 30.041131 ], "pop" : 1127, "state" : "TX" } +{ "_id" : "78956", "city" : "SCHULENBURG", "loc" : [ -96.91056399999999, 29.688247 ], "pop" : 3703, "state" : "TX" } +{ "_id" : "78957", "city" : "SMITHVILLE", "loc" : [ -97.149396, 30.017813 ], "pop" : 5244, "state" : "TX" } +{ "_id" : "78959", "city" : "WAELDER", "loc" : [ -97.295798, 29.6868 ], "pop" : 1105, "state" : "TX" } +{ "_id" : "78962", "city" : "WEIMAR", "loc" : [ -96.755045, 29.678707 ], "pop" : 3854, "state" : "TX" } +{ "_id" : "78963", "city" : "WEST POINT", "loc" : [ -97.036129, 29.95235 ], "pop" : 58, "state" : "TX" } +{ "_id" : "79001", "city" : "ADRIAN", "loc" : [ -102.69699, 35.275807 ], "pop" : 307, "state" : "TX" } +{ "_id" : "79005", "city" : "BOOKER", "loc" : [ -100.523791, 36.442948 ], "pop" : 1454, "state" : "TX" } +{ "_id" : "79007", "city" : "PHILLIPS", "loc" : [ -101.403245, 35.664299 ], "pop" : 17339, "state" : "TX" } +{ "_id" : "79009", "city" : "BOVINA", "loc" : [ -102.806115, 34.481504 ], "pop" : 2805, "state" : "TX" } +{ "_id" : "79011", "city" : "BRISCOE", "loc" : [ -100.167923, 35.58547 ], "pop" : 469, "state" : "TX" } +{ "_id" : "79014", "city" : "GLAZIER", "loc" : [ -100.353875, 35.885906 ], "pop" : 3720, "state" : "TX" } +{ "_id" : "79015", "city" : "CANYON", "loc" : [ -101.924705, 34.977222 ], "pop" : 14389, "state" : "TX" } +{ "_id" : "79018", "city" : "CHANNING", "loc" : [ -102.334269, 35.782572 ], "pop" : 648, "state" : "TX" } +{ "_id" : "79019", "city" : "CLAUDE", "loc" : [ -101.381271, 35.096715 ], "pop" : 1903, "state" : "TX" } +{ "_id" : "79022", "city" : "DALHART", "loc" : [ -102.517658, 36.073183 ], "pop" : 7051, "state" : "TX" } +{ "_id" : "79027", "city" : "DIMMITT", "loc" : [ -102.304634, 34.534089 ], "pop" : 7088, "state" : "TX" } +{ "_id" : "79029", "city" : "DUMAS", "loc" : [ -101.967984, 35.882315 ], "pop" : 15902, "state" : "TX" } +{ "_id" : "79031", "city" : "EARTH", "loc" : [ -102.421284, 34.241521 ], "pop" : 1704, "state" : "TX" } +{ "_id" : "79034", "city" : "FOLLETT", "loc" : [ -100.206776, 36.430923 ], "pop" : 983, "state" : "TX" } +{ "_id" : "79035", "city" : "BLACK", "loc" : [ -102.719139, 34.640298 ], "pop" : 4788, "state" : "TX" } +{ "_id" : "79036", "city" : "FRITCH", "loc" : [ -101.584482, 35.644121 ], "pop" : 5073, "state" : "TX" } +{ "_id" : "79039", "city" : "GROOM", "loc" : [ -101.12846, 35.216761 ], "pop" : 827, "state" : "TX" } +{ "_id" : "79040", "city" : "GRUVER", "loc" : [ -101.408906, 36.286805 ], "pop" : 2053, "state" : "TX" } +{ "_id" : "79041", "city" : "HALE CENTER", "loc" : [ -101.873623, 34.066943 ], "pop" : 3139, "state" : "TX" } +{ "_id" : "79042", "city" : "HAPPY", "loc" : [ -101.825632, 34.721899 ], "pop" : 839, "state" : "TX" } +{ "_id" : "79043", "city" : "HART", "loc" : [ -102.115534, 34.387838 ], "pop" : 1430, "state" : "TX" } +{ "_id" : "79044", "city" : "HARTLEY", "loc" : [ -102.52213, 35.931122 ], "pop" : 724, "state" : "TX" } +{ "_id" : "79045", "city" : "HEREFORD", "loc" : [ -102.40503, 34.837037 ], "pop" : 19090, "state" : "TX" } +{ "_id" : "79046", "city" : "HIGGINS", "loc" : [ -100.095191, 36.136504 ], "pop" : 672, "state" : "TX" } +{ "_id" : "79052", "city" : "KRESS", "loc" : [ -101.73705, 34.373703 ], "pop" : 1643, "state" : "TX" } +{ "_id" : "79056", "city" : "LIPSCOMB", "loc" : [ -100.270164, 36.223031 ], "pop" : 34, "state" : "TX" } +{ "_id" : "79057", "city" : "KELLERVILLE", "loc" : [ -100.611303, 35.234051 ], "pop" : 1151, "state" : "TX" } +{ "_id" : "79059", "city" : "MIAMI", "loc" : [ -100.702715, 35.719301 ], "pop" : 1025, "state" : "TX" } +{ "_id" : "79061", "city" : "MOBEETIE", "loc" : [ -100.424158, 35.529717 ], "pop" : 421, "state" : "TX" } +{ "_id" : "79062", "city" : "MORSE", "loc" : [ -101.47288, 36.059579 ], "pop" : 169, "state" : "TX" } +{ "_id" : "79063", "city" : "NAZARETH", "loc" : [ -102.106914, 34.544356 ], "pop" : 443, "state" : "TX" } +{ "_id" : "79064", "city" : "OLTON", "loc" : [ -102.141415, 34.184418 ], "pop" : 2747, "state" : "TX" } +{ "_id" : "79065", "city" : "PAMPA", "loc" : [ -100.957885, 35.538043 ], "pop" : 22816, "state" : "TX" } +{ "_id" : "79068", "city" : "PANHANDLE", "loc" : [ -101.43037, 35.380841 ], "pop" : 3669, "state" : "TX" } +{ "_id" : "79070", "city" : "PERRYTON", "loc" : [ -100.815558, 36.374825 ], "pop" : 9128, "state" : "TX" } +{ "_id" : "79072", "city" : "PLAINVIEW", "loc" : [ -101.725896, 34.196194 ], "pop" : 27037, "state" : "TX" } +{ "_id" : "79079", "city" : "TWITTY", "loc" : [ -100.262152, 35.220596 ], "pop" : 2927, "state" : "TX" } +{ "_id" : "79080", "city" : "SKELLYTOWN", "loc" : [ -101.172134, 35.568489 ], "pop" : 739, "state" : "TX" } +{ "_id" : "79081", "city" : "SPEARMAN", "loc" : [ -101.195234, 36.192689 ], "pop" : 3626, "state" : "TX" } +{ "_id" : "79082", "city" : "SPRINGLAKE", "loc" : [ -102.308999, 34.23932 ], "pop" : 331, "state" : "TX" } +{ "_id" : "79083", "city" : "STINNETT", "loc" : [ -101.450011, 35.837661 ], "pop" : 3277, "state" : "TX" } +{ "_id" : "79084", "city" : "STRATFORD", "loc" : [ -101.988568, 36.33349 ], "pop" : 2858, "state" : "TX" } +{ "_id" : "79085", "city" : "SUMMERFIELD", "loc" : [ -102.49919, 34.727244 ], "pop" : 109, "state" : "TX" } +{ "_id" : "79086", "city" : "SUNRAY", "loc" : [ -101.812334, 36.009707 ], "pop" : 1963, "state" : "TX" } +{ "_id" : "79087", "city" : "TEXLINE", "loc" : [ -102.984516, 36.374034 ], "pop" : 672, "state" : "TX" } +{ "_id" : "79088", "city" : "VIGO PARK", "loc" : [ -101.762864, 34.540258 ], "pop" : 5651, "state" : "TX" } +{ "_id" : "79092", "city" : "VEGA", "loc" : [ -102.356572, 35.373212 ], "pop" : 1738, "state" : "TX" } +{ "_id" : "79094", "city" : "WAYSIDE", "loc" : [ -101.545434, 34.803353 ], "pop" : 118, "state" : "TX" } +{ "_id" : "79095", "city" : "WELLINGTON", "loc" : [ -100.220721, 34.871726 ], "pop" : 3324, "state" : "TX" } +{ "_id" : "79096", "city" : "WHEELER", "loc" : [ -100.256824, 35.431852 ], "pop" : 2062, "state" : "TX" } +{ "_id" : "79097", "city" : "WHITE DEER", "loc" : [ -101.173993, 35.42781 ], "pop" : 1341, "state" : "TX" } +{ "_id" : "79098", "city" : "WILDORADO", "loc" : [ -102.211754, 35.19156 ], "pop" : 296, "state" : "TX" } +{ "_id" : "79101", "city" : "AMARILLO", "loc" : [ -101.842052, 35.203238 ], "pop" : 2355, "state" : "TX" } +{ "_id" : "79102", "city" : "AMARILLO", "loc" : [ -101.84963, 35.199854 ], "pop" : 9091, "state" : "TX" } +{ "_id" : "79103", "city" : "AMARILLO", "loc" : [ -101.797587, 35.175134 ], "pop" : 5336, "state" : "TX" } +{ "_id" : "79104", "city" : "AMARILLO", "loc" : [ -101.797503, 35.193918 ], "pop" : 12468, "state" : "TX" } +{ "_id" : "79106", "city" : "AMARILLO", "loc" : [ -101.894918, 35.197741 ], "pop" : 29728, "state" : "TX" } +{ "_id" : "79107", "city" : "AMARILLO", "loc" : [ -101.805962, 35.230866 ], "pop" : 29593, "state" : "TX" } +{ "_id" : "79108", "city" : "AMARILLO", "loc" : [ -101.830025, 35.277866 ], "pop" : 8461, "state" : "TX" } +{ "_id" : "79109", "city" : "AMARILLO", "loc" : [ -101.886764, 35.166332 ], "pop" : 41676, "state" : "TX" } +{ "_id" : "79110", "city" : "AMARILLO", "loc" : [ -101.864063, 35.154468 ], "pop" : 17159, "state" : "TX" } +{ "_id" : "79111", "city" : "AMARILLO", "loc" : [ -101.670342, 35.228619 ], "pop" : 2194, "state" : "TX" } +{ "_id" : "79118", "city" : "AMARILLO", "loc" : [ -101.834936, 35.07629 ], "pop" : 6981, "state" : "TX" } +{ "_id" : "79119", "city" : "AMARILLO", "loc" : [ -101.97432, 35.064214 ], "pop" : 968, "state" : "TX" } +{ "_id" : "79121", "city" : "AMARILLO", "loc" : [ -101.926594, 35.169689 ], "pop" : 3454, "state" : "TX" } +{ "_id" : "79124", "city" : "AMARILLO", "loc" : [ -101.942952, 35.270269 ], "pop" : 3694, "state" : "TX" } +{ "_id" : "79201", "city" : "KIRKLAND", "loc" : [ -100.21017, 34.428124 ], "pop" : 5862, "state" : "TX" } +{ "_id" : "79220", "city" : "AFTON", "loc" : [ -100.802131, 33.771837 ], "pop" : 132, "state" : "TX" } +{ "_id" : "79225", "city" : "CHILLICOTHE", "loc" : [ -99.515669, 34.243946 ], "pop" : 1186, "state" : "TX" } +{ "_id" : "79226", "city" : "CLARENDON", "loc" : [ -100.895157, 34.952878 ], "pop" : 2884, "state" : "TX" } +{ "_id" : "79227", "city" : "CROWELL", "loc" : [ -99.698345, 33.991208 ], "pop" : 1794, "state" : "TX" } +{ "_id" : "79229", "city" : "DICKENS", "loc" : [ -100.819695, 33.627996 ], "pop" : 569, "state" : "TX" } +{ "_id" : "79230", "city" : "DODSON", "loc" : [ -100.028593, 34.764354 ], "pop" : 197, "state" : "TX" } +{ "_id" : "79232", "city" : "DUMONT", "loc" : [ -100.319829, 33.656735 ], "pop" : 344, "state" : "TX" } +{ "_id" : "79234", "city" : "FLOMOT", "loc" : [ -101.003824, 34.232076 ], "pop" : 38, "state" : "TX" } +{ "_id" : "79235", "city" : "FLOYDADA", "loc" : [ -101.334564, 33.974296 ], "pop" : 5075, "state" : "TX" } +{ "_id" : "79237", "city" : "HEDLEY", "loc" : [ -100.680632, 34.869787 ], "pop" : 812, "state" : "TX" } +{ "_id" : "79239", "city" : "LAKEVIEW", "loc" : [ -100.725921, 34.672437 ], "pop" : 358, "state" : "TX" } +{ "_id" : "79241", "city" : "LOCKNEY", "loc" : [ -101.425934, 34.145827 ], "pop" : 3422, "state" : "TX" } +{ "_id" : "79243", "city" : "MCADOO", "loc" : [ -100.983293, 33.741265 ], "pop" : 149, "state" : "TX" } +{ "_id" : "79244", "city" : "MATADOR", "loc" : [ -100.836138, 34.052507 ], "pop" : 1173, "state" : "TX" } +{ "_id" : "79245", "city" : "MEMPHIS", "loc" : [ -100.534653, 34.712237 ], "pop" : 2843, "state" : "TX" } +{ "_id" : "79248", "city" : "CHALK", "loc" : [ -100.305917, 34.019154 ], "pop" : 2260, "state" : "TX" } +{ "_id" : "79250", "city" : "PETERSBURG", "loc" : [ -101.604591, 33.876806 ], "pop" : 1608, "state" : "TX" } +{ "_id" : "79251", "city" : "QUAIL", "loc" : [ -100.425243, 34.917969 ], "pop" : 73, "state" : "TX" } +{ "_id" : "79252", "city" : "QUANAH", "loc" : [ -99.749438, 34.29555 ], "pop" : 4097, "state" : "TX" } +{ "_id" : "79255", "city" : "QUITAQUE", "loc" : [ -101.046458, 34.379605 ], "pop" : 674, "state" : "TX" } +{ "_id" : "79256", "city" : "ROARING SPRINGS", "loc" : [ -100.852818, 33.897669 ], "pop" : 321, "state" : "TX" } +{ "_id" : "79257", "city" : "SILVERTON", "loc" : [ -101.316899, 34.464089 ], "pop" : 1297, "state" : "TX" } +{ "_id" : "79259", "city" : "TELL", "loc" : [ -100.396482, 34.378164 ], "pop" : 70, "state" : "TX" } +{ "_id" : "79260", "city" : "TRUSCOTT", "loc" : [ -99.66245499999999, 33.75323 ], "pop" : 54, "state" : "TX" } +{ "_id" : "79261", "city" : "TURKEY", "loc" : [ -100.844875, 34.403644 ], "pop" : 704, "state" : "TX" } +{ "_id" : "79311", "city" : "ABERNATHY", "loc" : [ -101.861111, 33.849961 ], "pop" : 3482, "state" : "TX" } +{ "_id" : "79312", "city" : "AMHERST", "loc" : [ -102.441614, 33.997608 ], "pop" : 1266, "state" : "TX" } +{ "_id" : "79313", "city" : "ANTON", "loc" : [ -102.165165, 33.804278 ], "pop" : 1625, "state" : "TX" } +{ "_id" : "79316", "city" : "BROWNFIELD", "loc" : [ -102.276157, 33.169801 ], "pop" : 11954, "state" : "TX" } +{ "_id" : "79320", "city" : "BULA", "loc" : [ -102.656426, 33.89696 ], "pop" : 113, "state" : "TX" } +{ "_id" : "79322", "city" : "CROSBYTON", "loc" : [ -101.228733, 33.656159 ], "pop" : 2711, "state" : "TX" } +{ "_id" : "79323", "city" : "DENVER CITY", "loc" : [ -102.831251, 32.971114 ], "pop" : 6697, "state" : "TX" } +{ "_id" : "79324", "city" : "ENOCHS", "loc" : [ -102.764107, 33.850225 ], "pop" : 53, "state" : "TX" } +{ "_id" : "79325", "city" : "FARWELL", "loc" : [ -102.990064, 34.386025 ], "pop" : 2270, "state" : "TX" } +{ "_id" : "79326", "city" : "FIELDTON", "loc" : [ -102.269692, 34.091878 ], "pop" : 48, "state" : "TX" } +{ "_id" : "79329", "city" : "IDALOU", "loc" : [ -101.678579, 33.650376 ], "pop" : 4632, "state" : "TX" } +{ "_id" : "79331", "city" : "LAMESA", "loc" : [ -101.956914, 32.736677 ], "pop" : 12989, "state" : "TX" } +{ "_id" : "79336", "city" : "LEVELLAND", "loc" : [ -102.367591, 33.578778 ], "pop" : 20952, "state" : "TX" } +{ "_id" : "79339", "city" : "LITTLEFIELD", "loc" : [ -102.320697, 33.921195 ], "pop" : 7766, "state" : "TX" } +{ "_id" : "79342", "city" : "LOOP", "loc" : [ -102.422084, 32.916169 ], "pop" : 393, "state" : "TX" } +{ "_id" : "79343", "city" : "LORENZO", "loc" : [ -101.527736, 33.666626 ], "pop" : 1753, "state" : "TX" } +{ "_id" : "79344", "city" : "MAPLE", "loc" : [ -102.926588, 33.8622 ], "pop" : 234, "state" : "TX" } +{ "_id" : "79345", "city" : "MEADOW", "loc" : [ -102.249196, 33.332098 ], "pop" : 1234, "state" : "TX" } +{ "_id" : "79346", "city" : "MORTON", "loc" : [ -102.779619, 33.715718 ], "pop" : 3569, "state" : "TX" } +{ "_id" : "79347", "city" : "MULESHOE", "loc" : [ -102.749631, 34.219308 ], "pop" : 6664, "state" : "TX" } +{ "_id" : "79351", "city" : "ODONNELL", "loc" : [ -101.827099, 32.977331 ], "pop" : 1381, "state" : "TX" } +{ "_id" : "79353", "city" : "PEP", "loc" : [ -102.56558, 33.810434 ], "pop" : 66, "state" : "TX" } +{ "_id" : "79355", "city" : "PLAINS", "loc" : [ -102.829367, 33.189354 ], "pop" : 2089, "state" : "TX" } +{ "_id" : "79356", "city" : "POST", "loc" : [ -101.39216, 33.201695 ], "pop" : 5143, "state" : "TX" } +{ "_id" : "79357", "city" : "CONE", "loc" : [ -101.382738, 33.678977 ], "pop" : 2840, "state" : "TX" } +{ "_id" : "79358", "city" : "ROPESVILLE", "loc" : [ -102.15841, 33.457499 ], "pop" : 1556, "state" : "TX" } +{ "_id" : "79359", "city" : "SEAGRAVES", "loc" : [ -102.578075, 32.93172 ], "pop" : 3307, "state" : "TX" } +{ "_id" : "79360", "city" : "SEMINOLE", "loc" : [ -102.682761, 32.721045 ], "pop" : 10423, "state" : "TX" } +{ "_id" : "79363", "city" : "SHALLOWATER", "loc" : [ -101.983626, 33.691859 ], "pop" : 4342, "state" : "TX" } +{ "_id" : "79364", "city" : "RANSOM CANYON", "loc" : [ -101.65192, 33.436795 ], "pop" : 7118, "state" : "TX" } +{ "_id" : "79366", "city" : "RANSOM CANYON", "loc" : [ -101.690805, 33.533019 ], "pop" : 1248, "state" : "TX" } +{ "_id" : "79370", "city" : "SPUR", "loc" : [ -100.857116, 33.479016 ], "pop" : 1718, "state" : "TX" } +{ "_id" : "79371", "city" : "SUDAN", "loc" : [ -102.525525, 34.069661 ], "pop" : 1210, "state" : "TX" } +{ "_id" : "79373", "city" : "TAHOKA", "loc" : [ -101.821976, 33.198803 ], "pop" : 4309, "state" : "TX" } +{ "_id" : "79376", "city" : "TOKIO", "loc" : [ -102.576753, 33.18259 ], "pop" : 30, "state" : "TX" } +{ "_id" : "79377", "city" : "WELCH", "loc" : [ -102.106792, 32.893827 ], "pop" : 575, "state" : "TX" } +{ "_id" : "79379", "city" : "WHITEFACE", "loc" : [ -102.638941, 33.586575 ], "pop" : 808, "state" : "TX" } +{ "_id" : "79381", "city" : "WILSON", "loc" : [ -101.712231, 33.329862 ], "pop" : 1068, "state" : "TX" } +{ "_id" : "79382", "city" : "WOLFFORTH", "loc" : [ -102.026101, 33.530381 ], "pop" : 3101, "state" : "TX" } +{ "_id" : "79401", "city" : "LUBBOCK", "loc" : [ -101.860634, 33.586527 ], "pop" : 10240, "state" : "TX" } +{ "_id" : "79403", "city" : "LUBBOCK", "loc" : [ -101.80982, 33.619573 ], "pop" : 17237, "state" : "TX" } +{ "_id" : "79404", "city" : "LUBBOCK", "loc" : [ -101.833263, 33.525979 ], "pop" : 12158, "state" : "TX" } +{ "_id" : "79405", "city" : "LUBBOCK", "loc" : [ -101.850655, 33.570972 ], "pop" : 2903, "state" : "TX" } +{ "_id" : "79406", "city" : "LUBBOCK", "loc" : [ -101.877828, 33.581934 ], "pop" : 5582, "state" : "TX" } +{ "_id" : "79407", "city" : "LUBBOCK", "loc" : [ -101.942333, 33.568369 ], "pop" : 12783, "state" : "TX" } +{ "_id" : "79410", "city" : "LUBBOCK", "loc" : [ -101.890377, 33.56931 ], "pop" : 9955, "state" : "TX" } +{ "_id" : "79411", "city" : "LUBBOCK", "loc" : [ -101.862593, 33.570393 ], "pop" : 4715, "state" : "TX" } +{ "_id" : "79412", "city" : "LUBBOCK", "loc" : [ -101.857737, 33.546313 ], "pop" : 14245, "state" : "TX" } +{ "_id" : "79413", "city" : "LUBBOCK", "loc" : [ -101.887142, 33.546597 ], "pop" : 20238, "state" : "TX" } +{ "_id" : "79414", "city" : "LUBBOCK", "loc" : [ -101.918666, 33.549728 ], "pop" : 16893, "state" : "TX" } +{ "_id" : "79415", "city" : "LUBBOCK", "loc" : [ -101.876015, 33.602117 ], "pop" : 13384, "state" : "TX" } +{ "_id" : "79416", "city" : "LUBBOCK", "loc" : [ -101.936705, 33.592397 ], "pop" : 20774, "state" : "TX" } +{ "_id" : "79423", "city" : "LUBBOCK", "loc" : [ -101.87946, 33.514604 ], "pop" : 17308, "state" : "TX" } +{ "_id" : "79424", "city" : "LUBBOCK", "loc" : [ -101.93439, 33.515866 ], "pop" : 22873, "state" : "TX" } +{ "_id" : "79489", "city" : "REESE AIR FORCE", "loc" : [ -102.028792, 33.594344 ], "pop" : 312, "state" : "TX" } +{ "_id" : "79501", "city" : "ANSON", "loc" : [ -99.895301, 32.748894 ], "pop" : 3724, "state" : "TX" } +{ "_id" : "79502", "city" : "ASPERMONT", "loc" : [ -100.234372, 33.130059 ], "pop" : 1424, "state" : "TX" } +{ "_id" : "79503", "city" : "AVOCA", "loc" : [ -99.69642, 32.883225 ], "pop" : 248, "state" : "TX" } +{ "_id" : "79504", "city" : "BAIRD", "loc" : [ -99.37766000000001, 32.391557 ], "pop" : 2267, "state" : "TX" } +{ "_id" : "79506", "city" : "BLACKWELL", "loc" : [ -100.311078, 32.082044 ], "pop" : 697, "state" : "TX" } +{ "_id" : "79510", "city" : "CLYDE", "loc" : [ -99.518445, 32.380289 ], "pop" : 7664, "state" : "TX" } +{ "_id" : "79511", "city" : "COAHOMA", "loc" : [ -101.319681, 32.294215 ], "pop" : 2365, "state" : "TX" } +{ "_id" : "79512", "city" : "COLORADO CITY", "loc" : [ -100.860948, 32.398736 ], "pop" : 5874, "state" : "TX" } +{ "_id" : "79517", "city" : "FLUVANNA", "loc" : [ -101.041966, 32.781022 ], "pop" : 707, "state" : "TX" } +{ "_id" : "79518", "city" : "GIRARD", "loc" : [ -100.693688, 33.363202 ], "pop" : 132, "state" : "TX" } +{ "_id" : "79519", "city" : "GOLDSBORO", "loc" : [ -99.677457, 32.048213 ], "pop" : 27, "state" : "TX" } +{ "_id" : "79520", "city" : "HAMLIN", "loc" : [ -100.128014, 32.879893 ], "pop" : 3271, "state" : "TX" } +{ "_id" : "79521", "city" : "HASKELL", "loc" : [ -99.730923, 33.157993 ], "pop" : 3917, "state" : "TX" } +{ "_id" : "79525", "city" : "HAWLEY", "loc" : [ -99.79599399999999, 32.594965 ], "pop" : 4405, "state" : "TX" } +{ "_id" : "79526", "city" : "HERMLEIGH", "loc" : [ -100.754714, 32.629441 ], "pop" : 942, "state" : "TX" } +{ "_id" : "79527", "city" : "IRA", "loc" : [ -101.025419, 32.621274 ], "pop" : 949, "state" : "TX" } +{ "_id" : "79528", "city" : "JAYTON", "loc" : [ -100.582482, 33.251774 ], "pop" : 708, "state" : "TX" } +{ "_id" : "79529", "city" : "KNOX CITY", "loc" : [ -99.8137, 33.418294 ], "pop" : 1751, "state" : "TX" } +{ "_id" : "79530", "city" : "LAWN", "loc" : [ -99.73508099999999, 32.136012 ], "pop" : 619, "state" : "TX" } +{ "_id" : "79532", "city" : "LORAINE", "loc" : [ -100.72851, 32.385047 ], "pop" : 1300, "state" : "TX" } +{ "_id" : "79533", "city" : "LUEDERS", "loc" : [ -99.672792, 32.762339 ], "pop" : 839, "state" : "TX" } +{ "_id" : "79534", "city" : "MC CAULLEY", "loc" : [ -100.216784, 32.778654 ], "pop" : 272, "state" : "TX" } +{ "_id" : "79535", "city" : "MARYNEAL", "loc" : [ -100.497178, 32.202639 ], "pop" : 123, "state" : "TX" } +{ "_id" : "79536", "city" : "MERKEL", "loc" : [ -99.99244299999999, 32.444371 ], "pop" : 4906, "state" : "TX" } +{ "_id" : "79537", "city" : "NOLAN", "loc" : [ -100.267053, 32.279333 ], "pop" : 254, "state" : "TX" } +{ "_id" : "79538", "city" : "NOVICE", "loc" : [ -99.59353, 32.000927 ], "pop" : 421, "state" : "TX" } +{ "_id" : "79539", "city" : "O BRIEN", "loc" : [ -99.847303, 33.374869 ], "pop" : 314, "state" : "TX" } +{ "_id" : "79540", "city" : "OLD GLORY", "loc" : [ -100.153155, 33.184162 ], "pop" : 431, "state" : "TX" } +{ "_id" : "79541", "city" : "OVALO", "loc" : [ -99.822873, 32.155257 ], "pop" : 326, "state" : "TX" } +{ "_id" : "79543", "city" : "ROBY", "loc" : [ -100.400766, 32.722016 ], "pop" : 1333, "state" : "TX" } +{ "_id" : "79544", "city" : "ROCHESTER", "loc" : [ -99.85936599999999, 33.310457 ], "pop" : 707, "state" : "TX" } +{ "_id" : "79545", "city" : "ROSCOE", "loc" : [ -100.539088, 32.427558 ], "pop" : 2168, "state" : "TX" } +{ "_id" : "79546", "city" : "ROTAN", "loc" : [ -100.470489, 32.855521 ], "pop" : 2449, "state" : "TX" } +{ "_id" : "79547", "city" : "RULE", "loc" : [ -99.889354, 33.184163 ], "pop" : 993, "state" : "TX" } +{ "_id" : "79548", "city" : "SAGERTON", "loc" : [ -99.892329, 33.051321 ], "pop" : 351, "state" : "TX" } +{ "_id" : "79549", "city" : "DERMOTT", "loc" : [ -100.907485, 32.715105 ], "pop" : 16206, "state" : "TX" } +{ "_id" : "79553", "city" : "STAMFORD", "loc" : [ -99.78592999999999, 32.945323 ], "pop" : 4338, "state" : "TX" } +{ "_id" : "79556", "city" : "SWEETWATER", "loc" : [ -100.397908, 32.472589 ], "pop" : 14064, "state" : "TX" } +{ "_id" : "79560", "city" : "SYLVESTER", "loc" : [ -100.242497, 32.717909 ], "pop" : 240, "state" : "TX" } +{ "_id" : "79561", "city" : "TRENT", "loc" : [ -100.119488, 32.489752 ], "pop" : 494, "state" : "TX" } +{ "_id" : "79562", "city" : "TUSCOLA", "loc" : [ -99.82438999999999, 32.234955 ], "pop" : 2980, "state" : "TX" } +{ "_id" : "79563", "city" : "TYE", "loc" : [ -99.86843399999999, 32.447728 ], "pop" : 903, "state" : "TX" } +{ "_id" : "79565", "city" : "WESTBROOK", "loc" : [ -100.990719, 32.353195 ], "pop" : 842, "state" : "TX" } +{ "_id" : "79566", "city" : "WINGATE", "loc" : [ -100.118311, 32.031777 ], "pop" : 313, "state" : "TX" } +{ "_id" : "79567", "city" : "WINTERS", "loc" : [ -99.95511399999999, 31.962028 ], "pop" : 3876, "state" : "TX" } +{ "_id" : "79601", "city" : "ABILENE", "loc" : [ -99.718208, 32.468155 ], "pop" : 16713, "state" : "TX" } +{ "_id" : "79602", "city" : "ABILENE", "loc" : [ -99.721448, 32.41783 ], "pop" : 16432, "state" : "TX" } +{ "_id" : "79603", "city" : "ABILENE", "loc" : [ -99.761916, 32.467852 ], "pop" : 24123, "state" : "TX" } +{ "_id" : "79605", "city" : "ABILENE", "loc" : [ -99.772374, 32.431987 ], "pop" : 29862, "state" : "TX" } +{ "_id" : "79606", "city" : "ABILENE", "loc" : [ -99.77457800000001, 32.392038 ], "pop" : 17332, "state" : "TX" } +{ "_id" : "79607", "city" : "DYESS AFB", "loc" : [ -99.82214, 32.418956 ], "pop" : 4965, "state" : "TX" } +{ "_id" : "79701", "city" : "MIDLAND", "loc" : [ -102.06261, 31.989636 ], "pop" : 32926, "state" : "TX" } +{ "_id" : "79703", "city" : "MIDLAND", "loc" : [ -102.136854, 31.972106 ], "pop" : 23167, "state" : "TX" } +{ "_id" : "79705", "city" : "MIDLAND", "loc" : [ -102.091483, 32.029473 ], "pop" : 27708, "state" : "TX" } +{ "_id" : "79707", "city" : "MIDLAND", "loc" : [ -102.147599, 32.019911 ], "pop" : 22810, "state" : "TX" } +{ "_id" : "79713", "city" : "ACKERLY", "loc" : [ -101.795132, 32.609085 ], "pop" : 793, "state" : "TX" } +{ "_id" : "79714", "city" : "ANDREWS", "loc" : [ -102.540926, 32.320125 ], "pop" : 14338, "state" : "TX" } +{ "_id" : "79718", "city" : "BALMORHEA", "loc" : [ -103.693316, 31.012361 ], "pop" : 1655, "state" : "TX" } +{ "_id" : "79719", "city" : "BARSTOW", "loc" : [ -103.397086, 31.463908 ], "pop" : 701, "state" : "TX" } +{ "_id" : "79720", "city" : "VEALMOOR", "loc" : [ -101.467517, 32.241767 ], "pop" : 29733, "state" : "TX" } +{ "_id" : "79730", "city" : "COYANOSA", "loc" : [ -103.053815, 31.229547 ], "pop" : 341, "state" : "TX" } +{ "_id" : "79731", "city" : "CRANE", "loc" : [ -102.354382, 31.396949 ], "pop" : 4652, "state" : "TX" } +{ "_id" : "79734", "city" : "FORT DAVIS", "loc" : [ -103.936434, 30.613144 ], "pop" : 1607, "state" : "TX" } +{ "_id" : "79735", "city" : "FORT STOCKTON", "loc" : [ -102.879942, 30.890785 ], "pop" : 11755, "state" : "TX" } +{ "_id" : "79738", "city" : "GAIL", "loc" : [ -101.450032, 32.752334 ], "pop" : 799, "state" : "TX" } +{ "_id" : "79739", "city" : "GARDEN CITY", "loc" : [ -101.526912, 31.849078 ], "pop" : 1447, "state" : "TX" } +{ "_id" : "79741", "city" : "GOLDSMITH", "loc" : [ -102.625047, 31.95412 ], "pop" : 442, "state" : "TX" } +{ "_id" : "79742", "city" : "GRANDFALLS", "loc" : [ -102.856778, 31.345856 ], "pop" : 748, "state" : "TX" } +{ "_id" : "79743", "city" : "IMPERIAL", "loc" : [ -102.710918, 31.237264 ], "pop" : 557, "state" : "TX" } +{ "_id" : "79744", "city" : "IRAAN", "loc" : [ -101.915175, 30.915564 ], "pop" : 1596, "state" : "TX" } +{ "_id" : "79745", "city" : "KERMIT", "loc" : [ -103.091269, 31.85496 ], "pop" : 7370, "state" : "TX" } +{ "_id" : "79748", "city" : "KNOTT", "loc" : [ -101.651731, 32.412489 ], "pop" : 245, "state" : "TX" } +{ "_id" : "79749", "city" : "LENORAH", "loc" : [ -101.761137, 32.439157 ], "pop" : 529, "state" : "TX" } +{ "_id" : "79752", "city" : "MC CAMEY", "loc" : [ -102.215325, 31.131894 ], "pop" : 2950, "state" : "TX" } +{ "_id" : "79754", "city" : "MENTONE", "loc" : [ -103.550316, 31.738374 ], "pop" : 107, "state" : "TX" } +{ "_id" : "79755", "city" : "MIDKIFF", "loc" : [ -101.926913, 31.306761 ], "pop" : 1497, "state" : "TX" } +{ "_id" : "79756", "city" : "MONAHANS", "loc" : [ -102.900273, 31.581294 ], "pop" : 11296, "state" : "TX" } +{ "_id" : "79758", "city" : "GARDENDALE", "loc" : [ -102.357237, 32.024476 ], "pop" : 1536, "state" : "TX" } +{ "_id" : "79761", "city" : "ODESSA", "loc" : [ -102.352252, 31.857945 ], "pop" : 30126, "state" : "TX" } +{ "_id" : "79762", "city" : "ODESSA", "loc" : [ -102.354806, 31.889029 ], "pop" : 34327, "state" : "TX" } +{ "_id" : "79763", "city" : "ODESSA", "loc" : [ -102.416179, 31.834085 ], "pop" : 30550, "state" : "TX" } +{ "_id" : "79764", "city" : "ODESSA", "loc" : [ -102.437465, 31.876683 ], "pop" : 17919, "state" : "TX" } +{ "_id" : "79765", "city" : "ODESSA", "loc" : [ -102.394403, 31.937548 ], "pop" : 2240, "state" : "TX" } +{ "_id" : "79766", "city" : "ODESSA", "loc" : [ -102.344863, 31.782683 ], "pop" : 1794, "state" : "TX" } +{ "_id" : "79772", "city" : "VERHALEN", "loc" : [ -103.508129, 31.414384 ], "pop" : 14197, "state" : "TX" } +{ "_id" : "79777", "city" : "PYOTE", "loc" : [ -103.139676, 31.539491 ], "pop" : 370, "state" : "TX" } +{ "_id" : "79781", "city" : "SHEFFIELD", "loc" : [ -101.859963, 30.693549 ], "pop" : 428, "state" : "TX" } +{ "_id" : "79782", "city" : "STANTON", "loc" : [ -101.809887, 32.139992 ], "pop" : 3776, "state" : "TX" } +{ "_id" : "79783", "city" : "TARZAN", "loc" : [ -101.960723, 32.357523 ], "pop" : 643, "state" : "TX" } +{ "_id" : "79789", "city" : "WINK", "loc" : [ -103.156084, 31.752673 ], "pop" : 1256, "state" : "TX" } +{ "_id" : "79821", "city" : "ANTHONY", "loc" : [ -106.597625, 31.990718 ], "pop" : 3341, "state" : "TX" } +{ "_id" : "79830", "city" : "ALPINE", "loc" : [ -103.654089, 30.263111 ], "pop" : 7648, "state" : "TX" } +{ "_id" : "79834", "city" : "BIG BEND NATIONA", "loc" : [ -103.330626, 29.147657 ], "pop" : 249, "state" : "TX" } +{ "_id" : "79835", "city" : "CANUTILLO", "loc" : [ -106.592888, 31.934379 ], "pop" : 8585, "state" : "TX" } +{ "_id" : "79836", "city" : "CLINT", "loc" : [ -106.20383, 31.549418 ], "pop" : 17337, "state" : "TX" } +{ "_id" : "79837", "city" : "DELL CITY", "loc" : [ -105.209902, 31.923975 ], "pop" : 915, "state" : "TX" } +{ "_id" : "79839", "city" : "FORT HANCOCK", "loc" : [ -105.823448, 31.296887 ], "pop" : 1108, "state" : "TX" } +{ "_id" : "79842", "city" : "MARATHON", "loc" : [ -103.221397, 30.18858 ], "pop" : 725, "state" : "TX" } +{ "_id" : "79843", "city" : "MARFA", "loc" : [ -104.084835, 30.292982 ], "pop" : 3155, "state" : "TX" } +{ "_id" : "79845", "city" : "PRESIDIO", "loc" : [ -104.35511, 29.557302 ], "pop" : 3482, "state" : "TX" } +{ "_id" : "79847", "city" : "SALT FLAT", "loc" : [ -104.611467, 31.359027 ], "pop" : 317, "state" : "TX" } +{ "_id" : "79851", "city" : "SIERRA BLANCA", "loc" : [ -105.321874, 31.193821 ], "pop" : 892, "state" : "TX" } +{ "_id" : "79852", "city" : "TERLINGUA", "loc" : [ -103.559671, 29.31648 ], "pop" : 59, "state" : "TX" } +{ "_id" : "79854", "city" : "VALENTINE", "loc" : [ -104.481096, 30.620043 ], "pop" : 339, "state" : "TX" } +{ "_id" : "79855", "city" : "KENT", "loc" : [ -104.832249, 31.042879 ], "pop" : 3090, "state" : "TX" } +{ "_id" : "79901", "city" : "EL PASO", "loc" : [ -106.478311, 31.758411 ], "pop" : 17467, "state" : "TX" } +{ "_id" : "79902", "city" : "EL PASO", "loc" : [ -106.493165, 31.776317 ], "pop" : 26404, "state" : "TX" } +{ "_id" : "79903", "city" : "EL PASO", "loc" : [ -106.440569, 31.786213 ], "pop" : 20768, "state" : "TX" } +{ "_id" : "79904", "city" : "EL PASO", "loc" : [ -106.438135, 31.853334 ], "pop" : 35732, "state" : "TX" } +{ "_id" : "79905", "city" : "EL PASO", "loc" : [ -106.430445, 31.767447 ], "pop" : 32865, "state" : "TX" } +{ "_id" : "79906", "city" : "FORT BLISS", "loc" : [ -106.421611, 31.807631 ], "pop" : 11364, "state" : "TX" } +{ "_id" : "79907", "city" : "EL PASO", "loc" : [ -106.329281, 31.708908 ], "pop" : 58052, "state" : "TX" } +{ "_id" : "79908", "city" : "FORT BLISS", "loc" : [ -106.386711, 31.82753 ], "pop" : 2918, "state" : "TX" } +{ "_id" : "79912", "city" : "EL PASO", "loc" : [ -106.536433, 31.838309 ], "pop" : 46537, "state" : "TX" } +{ "_id" : "79915", "city" : "EL PASO", "loc" : [ -106.368605, 31.743234 ], "pop" : 46356, "state" : "TX" } +{ "_id" : "79916", "city" : "FORT BLISS", "loc" : [ -106.159157, 31.794873 ], "pop" : 6703, "state" : "TX" } +{ "_id" : "79922", "city" : "EL PASO", "loc" : [ -106.573176, 31.821767 ], "pop" : 8540, "state" : "TX" } +{ "_id" : "79924", "city" : "EL PASO", "loc" : [ -106.414857, 31.902098 ], "pop" : 57215, "state" : "TX" } +{ "_id" : "79925", "city" : "EL PASO", "loc" : [ -106.361317, 31.781402 ], "pop" : 41235, "state" : "TX" } +{ "_id" : "79927", "city" : "HORIZON CITY", "loc" : [ -106.273064, 31.653014 ], "pop" : 30011, "state" : "TX" } +{ "_id" : "79930", "city" : "EL PASO", "loc" : [ -106.456754, 31.804795 ], "pop" : 29792, "state" : "TX" } +{ "_id" : "79932", "city" : "EL PASO", "loc" : [ -106.593186, 31.862334 ], "pop" : 14909, "state" : "TX" } +{ "_id" : "79934", "city" : "EL PASO", "loc" : [ -106.407328, 31.938585 ], "pop" : 2983, "state" : "TX" } +{ "_id" : "79935", "city" : "EL PASO", "loc" : [ -106.330258, 31.771847 ], "pop" : 20465, "state" : "TX" } +{ "_id" : "79936", "city" : "EL PASO", "loc" : [ -106.30159, 31.767655 ], "pop" : 52031, "state" : "TX" } +{ "_id" : "80002", "city" : "ARVADA", "loc" : [ -105.098402, 39.794533 ], "pop" : 12065, "state" : "CO" } +{ "_id" : "80003", "city" : "ARVADA", "loc" : [ -105.065549, 39.828572 ], "pop" : 32980, "state" : "CO" } +{ "_id" : "80004", "city" : "ARVADA", "loc" : [ -105.11771, 39.814066 ], "pop" : 33260, "state" : "CO" } +{ "_id" : "80005", "city" : "ARVADA", "loc" : [ -105.109719, 39.842189 ], "pop" : 22613, "state" : "CO" } +{ "_id" : "80010", "city" : "AURORA", "loc" : [ -104.864618, 39.736788 ], "pop" : 27090, "state" : "CO" } +{ "_id" : "80011", "city" : "AURORA", "loc" : [ -104.815233, 39.737809 ], "pop" : 36021, "state" : "CO" } +{ "_id" : "80012", "city" : "AURORA", "loc" : [ -104.837693, 39.698672 ], "pop" : 37711, "state" : "CO" } +{ "_id" : "80013", "city" : "AURORA", "loc" : [ -104.784566, 39.657457 ], "pop" : 45335, "state" : "CO" } +{ "_id" : "80014", "city" : "AURORA", "loc" : [ -104.834954, 39.666171 ], "pop" : 31059, "state" : "CO" } +{ "_id" : "80015", "city" : "AURORA", "loc" : [ -104.787438, 39.62552 ], "pop" : 28161, "state" : "CO" } +{ "_id" : "80016", "city" : "AURORA", "loc" : [ -104.741734, 39.618713 ], "pop" : 4085, "state" : "CO" } +{ "_id" : "80017", "city" : "AURORA", "loc" : [ -104.788093, 39.694827 ], "pop" : 25910, "state" : "CO" } +{ "_id" : "80018", "city" : "AURORA", "loc" : [ -104.707102, 39.710179 ], "pop" : 321, "state" : "CO" } +{ "_id" : "80019", "city" : "AURORA", "loc" : [ -104.706906, 39.765608 ], "pop" : 46, "state" : "CO" } +{ "_id" : "80020", "city" : "BROOMFIELD", "loc" : [ -105.060902, 39.924513 ], "pop" : 31533, "state" : "CO" } +{ "_id" : "80021", "city" : "WESTMINSTER", "loc" : [ -105.102837, 39.875996 ], "pop" : 20461, "state" : "CO" } +{ "_id" : "80022", "city" : "COMMERCE CITY", "loc" : [ -104.911349, 39.825875 ], "pop" : 23205, "state" : "CO" } +{ "_id" : "80026", "city" : "LAFAYETTE", "loc" : [ -105.096346, 39.997964 ], "pop" : 17111, "state" : "CO" } +{ "_id" : "80027", "city" : "LOUISVILLE", "loc" : [ -105.145557, 39.978942 ], "pop" : 12612, "state" : "CO" } +{ "_id" : "80030", "city" : "WESTMINSTER", "loc" : [ -105.037086, 39.854238 ], "pop" : 43235, "state" : "CO" } +{ "_id" : "80033", "city" : "WHEAT RIDGE", "loc" : [ -105.096195, 39.774036 ], "pop" : 23040, "state" : "CO" } +{ "_id" : "80045", "city" : "AURORA", "loc" : [ -104.837954, 39.748014 ], "pop" : 1715, "state" : "CO" } +{ "_id" : "80101", "city" : "AGATE", "loc" : [ -103.984575, 39.420256 ], "pop" : 230, "state" : "CO" } +{ "_id" : "80102", "city" : "BENNETT", "loc" : [ -104.427284, 39.725398 ], "pop" : 3885, "state" : "CO" } +{ "_id" : "80103", "city" : "BYERS", "loc" : [ -104.201872, 39.698454 ], "pop" : 1448, "state" : "CO" } +{ "_id" : "80104", "city" : "CASTLE ROCK", "loc" : [ -104.860187, 39.39256 ], "pop" : 11763, "state" : "CO" } +{ "_id" : "80105", "city" : "DEER TRAIL", "loc" : [ -104.068003, 39.593121 ], "pop" : 634, "state" : "CO" } +{ "_id" : "80106", "city" : "ELBERT", "loc" : [ -104.574631, 39.096892 ], "pop" : 1808, "state" : "CO" } +{ "_id" : "80107", "city" : "ELIZABETH", "loc" : [ -104.591961, 39.383618 ], "pop" : 4973, "state" : "CO" } +{ "_id" : "80110", "city" : "CHERRY HILLS VIL", "loc" : [ -104.990022, 39.646027 ], "pop" : 40226, "state" : "CO" } +{ "_id" : "80111", "city" : "CHERRY HILLS VIL", "loc" : [ -104.882832, 39.610327 ], "pop" : 20230, "state" : "CO" } +{ "_id" : "80112", "city" : "ENGLEWOOD", "loc" : [ -104.901115, 39.58051 ], "pop" : 20210, "state" : "CO" } +{ "_id" : "80116", "city" : "FRANKTOWN", "loc" : [ -104.725569, 39.372841 ], "pop" : 3742, "state" : "CO" } +{ "_id" : "80117", "city" : "KIOWA", "loc" : [ -104.452263, 39.323972 ], "pop" : 680, "state" : "CO" } +{ "_id" : "80118", "city" : "LARKSPUR", "loc" : [ -104.854587, 39.201079 ], "pop" : 1424, "state" : "CO" } +{ "_id" : "80120", "city" : "LITTLETON", "loc" : [ -105.0044, 39.599426 ], "pop" : 24992, "state" : "CO" } +{ "_id" : "80121", "city" : "GREENWOOD VILLAG", "loc" : [ -104.957285, 39.605835 ], "pop" : 17238, "state" : "CO" } +{ "_id" : "80122", "city" : "LITTLETON", "loc" : [ -104.955673, 39.581418 ], "pop" : 31135, "state" : "CO" } +{ "_id" : "80123", "city" : "BOW MAR", "loc" : [ -105.07766, 39.596854 ], "pop" : 59418, "state" : "CO" } +{ "_id" : "80124", "city" : "LITTLETON", "loc" : [ -104.897204, 39.55061 ], "pop" : 5393, "state" : "CO" } +{ "_id" : "80125", "city" : "LITTLETON", "loc" : [ -105.056098, 39.484466 ], "pop" : 3230, "state" : "CO" } +{ "_id" : "80126", "city" : "HIGHLANDS RANCH", "loc" : [ -104.963751, 39.55134 ], "pop" : 13649, "state" : "CO" } +{ "_id" : "80127", "city" : "LITTLETON", "loc" : [ -105.132811, 39.591968 ], "pop" : 23204, "state" : "CO" } +{ "_id" : "80132", "city" : "MONUMENT", "loc" : [ -104.85416, 39.100726 ], "pop" : 7411, "state" : "CO" } +{ "_id" : "80133", "city" : "PALMER LAKE", "loc" : [ -104.914795, 39.120498 ], "pop" : 1237, "state" : "CO" } +{ "_id" : "80134", "city" : "PARKER", "loc" : [ -104.734904, 39.505466 ], "pop" : 19466, "state" : "CO" } +{ "_id" : "80135", "city" : "DECKERS", "loc" : [ -105.008305, 39.330109 ], "pop" : 3257, "state" : "CO" } +{ "_id" : "80136", "city" : "STRASBURG", "loc" : [ -104.268258, 39.781359 ], "pop" : 1197, "state" : "CO" } +{ "_id" : "80137", "city" : "WATKINS", "loc" : [ -104.583391, 39.762317 ], "pop" : 406, "state" : "CO" } +{ "_id" : "80202", "city" : "DENVER", "loc" : [ -104.994591, 39.749107 ], "pop" : 2816, "state" : "CO" } +{ "_id" : "80203", "city" : "DENVER", "loc" : [ -104.981111, 39.731285 ], "pop" : 15775, "state" : "CO" } +{ "_id" : "80204", "city" : "DENVER", "loc" : [ -105.025854, 39.734022 ], "pop" : 27439, "state" : "CO" } +{ "_id" : "80205", "city" : "DENVER", "loc" : [ -104.966141, 39.758993 ], "pop" : 24169, "state" : "CO" } +{ "_id" : "80206", "city" : "DENVER", "loc" : [ -104.9524, 39.733109 ], "pop" : 19145, "state" : "CO" } +{ "_id" : "80207", "city" : "DENVER", "loc" : [ -104.91771, 39.758425 ], "pop" : 20955, "state" : "CO" } +{ "_id" : "80209", "city" : "DENVER", "loc" : [ -104.968587, 39.707437 ], "pop" : 19691, "state" : "CO" } +{ "_id" : "80210", "city" : "DENVER", "loc" : [ -104.963124, 39.679003 ], "pop" : 30868, "state" : "CO" } +{ "_id" : "80211", "city" : "DENVER", "loc" : [ -105.020377, 39.766515 ], "pop" : 34679, "state" : "CO" } +{ "_id" : "80212", "city" : "MOUNTAIN VIEW", "loc" : [ -105.046979, 39.772396 ], "pop" : 17745, "state" : "CO" } +{ "_id" : "80214", "city" : "EDGEWATER", "loc" : [ -105.062036, 39.746931 ], "pop" : 13154, "state" : "CO" } +{ "_id" : "80215", "city" : "LAKEWOOD", "loc" : [ -105.102329, 39.744033 ], "pop" : 27556, "state" : "CO" } +{ "_id" : "80216", "city" : "DENVER", "loc" : [ -104.966946, 39.783469 ], "pop" : 9113, "state" : "CO" } +{ "_id" : "80218", "city" : "DENVER", "loc" : [ -104.971652, 39.732747 ], "pop" : 14916, "state" : "CO" } +{ "_id" : "80219", "city" : "DENVER", "loc" : [ -105.034134, 39.695624 ], "pop" : 48234, "state" : "CO" } +{ "_id" : "80220", "city" : "DENVER", "loc" : [ -104.912866, 39.7312 ], "pop" : 35520, "state" : "CO" } +{ "_id" : "80221", "city" : "FEDERAL HEIGHTS", "loc" : [ -105.007985, 39.840562 ], "pop" : 54069, "state" : "CO" } +{ "_id" : "80222", "city" : "GLENDALE", "loc" : [ -104.927992, 39.682803 ], "pop" : 28373, "state" : "CO" } +{ "_id" : "80223", "city" : "DENVER", "loc" : [ -105.002799, 39.700239 ], "pop" : 16692, "state" : "CO" } +{ "_id" : "80224", "city" : "DENVER", "loc" : [ -104.910778, 39.687995 ], "pop" : 14918, "state" : "CO" } +{ "_id" : "80226", "city" : "LAKEWOOD", "loc" : [ -105.066703, 39.712186 ], "pop" : 13675, "state" : "CO" } +{ "_id" : "80227", "city" : "DENVER", "loc" : [ -105.085359, 39.666746 ], "pop" : 26932, "state" : "CO" } +{ "_id" : "80228", "city" : "LAKEWOOD", "loc" : [ -105.143009, 39.696898 ], "pop" : 25008, "state" : "CO" } +{ "_id" : "80229", "city" : "THORNTON", "loc" : [ -104.961749, 39.860998 ], "pop" : 33512, "state" : "CO" } +{ "_id" : "80231", "city" : "DENVER", "loc" : [ -104.884326, 39.679324 ], "pop" : 35985, "state" : "CO" } +{ "_id" : "80232", "city" : "LAKEWOOD", "loc" : [ -105.094524, 39.697282 ], "pop" : 35087, "state" : "CO" } +{ "_id" : "80233", "city" : "NORTHGLENN", "loc" : [ -104.958257, 39.901222 ], "pop" : 30749, "state" : "CO" } +{ "_id" : "80234", "city" : "NORTHGLENN", "loc" : [ -105.004474, 39.905479 ], "pop" : 13350, "state" : "CO" } +{ "_id" : "80235", "city" : "DENVER", "loc" : [ -105.079466, 39.647175 ], "pop" : 5783, "state" : "CO" } +{ "_id" : "80236", "city" : "DENVER", "loc" : [ -105.037595, 39.653535 ], "pop" : 12979, "state" : "CO" } +{ "_id" : "80237", "city" : "DENVER", "loc" : [ -104.89866, 39.64314 ], "pop" : 14211, "state" : "CO" } +{ "_id" : "80239", "city" : "DENVER", "loc" : [ -104.828837, 39.787757 ], "pop" : 17622, "state" : "CO" } +{ "_id" : "80241", "city" : "NORTHGLENN", "loc" : [ -104.941809, 39.927792 ], "pop" : 10108, "state" : "CO" } +{ "_id" : "80249", "city" : "DENVER", "loc" : [ -104.75565, 39.778264 ], "pop" : 2740, "state" : "CO" } +{ "_id" : "80301", "city" : "BOULDER", "loc" : [ -105.21426, 40.049733 ], "pop" : 18174, "state" : "CO" } +{ "_id" : "80302", "city" : "BOULDER", "loc" : [ -105.285131, 40.017235 ], "pop" : 29384, "state" : "CO" } +{ "_id" : "80303", "city" : "BOULDER", "loc" : [ -105.239178, 39.991381 ], "pop" : 39860, "state" : "CO" } +{ "_id" : "80304", "city" : "BOULDER", "loc" : [ -105.277073, 40.037482 ], "pop" : 21550, "state" : "CO" } +{ "_id" : "80401", "city" : "GOLDEN", "loc" : [ -105.191528, 39.730548 ], "pop" : 32876, "state" : "CO" } +{ "_id" : "80403", "city" : "GOLDEN", "loc" : [ -105.282516, 39.823219 ], "pop" : 13159, "state" : "CO" } +{ "_id" : "80421", "city" : "BAILEY", "loc" : [ -105.469282, 39.448233 ], "pop" : 4448, "state" : "CO" } +{ "_id" : "80422", "city" : "BLACK HAWK", "loc" : [ -105.503991, 39.801105 ], "pop" : 551, "state" : "CO" } +{ "_id" : "80423", "city" : "BOND", "loc" : [ -106.676273, 39.869119 ], "pop" : 149, "state" : "CO" } +{ "_id" : "80428", "city" : "CLARK", "loc" : [ -106.921482, 40.726783 ], "pop" : 455, "state" : "CO" } +{ "_id" : "80429", "city" : "CLIMAX", "loc" : [ -106.258027, 39.298804 ], "pop" : 346, "state" : "CO" } +{ "_id" : "80430", "city" : "COALMONT", "loc" : [ -106.532134, 40.538252 ], "pop" : 88, "state" : "CO" } +{ "_id" : "80433", "city" : "CONIFER", "loc" : [ -105.316873, 39.519735 ], "pop" : 5919, "state" : "CO" } +{ "_id" : "80435", "city" : "KEYSTONE", "loc" : [ -106.057345, 39.574827 ], "pop" : 12881, "state" : "CO" } +{ "_id" : "80439", "city" : "EVERGREEN", "loc" : [ -105.340248, 39.637405 ], "pop" : 19250, "state" : "CO" } +{ "_id" : "80440", "city" : "FAIRPLAY", "loc" : [ -105.999416, 39.225617 ], "pop" : 1030, "state" : "CO" } +{ "_id" : "80441", "city" : "FOXTON", "loc" : [ -105.24815, 39.372056 ], "pop" : 127, "state" : "CO" } +{ "_id" : "80446", "city" : "GRANBY", "loc" : [ -105.889916, 40.012834 ], "pop" : 4839, "state" : "CO" } +{ "_id" : "80447", "city" : "GRAND LAKE", "loc" : [ -105.860488, 40.228862 ], "pop" : 1202, "state" : "CO" } +{ "_id" : "80452", "city" : "IDAHO SPRINGS", "loc" : [ -105.598261, 39.740192 ], "pop" : 5113, "state" : "CO" } +{ "_id" : "80455", "city" : "JAMESTOWN", "loc" : [ -105.418971, 40.10056 ], "pop" : 654, "state" : "CO" } +{ "_id" : "80456", "city" : "JEFFERSON", "loc" : [ -105.78633, 39.300926 ], "pop" : 157, "state" : "CO" } +{ "_id" : "80459", "city" : "KREMMLING", "loc" : [ -106.395472, 40.063224 ], "pop" : 1580, "state" : "CO" } +{ "_id" : "80461", "city" : "LEADVILLE", "loc" : [ -106.301545, 39.249742 ], "pop" : 5544, "state" : "CO" } +{ "_id" : "80463", "city" : "MC COY", "loc" : [ -106.730906, 39.913377 ], "pop" : 61, "state" : "CO" } +{ "_id" : "80465", "city" : "MORRISON", "loc" : [ -105.174641, 39.612452 ], "pop" : 13657, "state" : "CO" } +{ "_id" : "80466", "city" : "NEDERLAND", "loc" : [ -105.481265, 39.970259 ], "pop" : 2621, "state" : "CO" } +{ "_id" : "80467", "city" : "OAK CREEK", "loc" : [ -106.929621, 40.256733 ], "pop" : 1135, "state" : "CO" } +{ "_id" : "80468", "city" : "PARSHALL", "loc" : [ -106.225492, 40.053765 ], "pop" : 345, "state" : "CO" } +{ "_id" : "80470", "city" : "PINE", "loc" : [ -105.374116, 39.46667 ], "pop" : 2827, "state" : "CO" } +{ "_id" : "80471", "city" : "PINECLIFFE", "loc" : [ -105.354004, 39.942898 ], "pop" : 225, "state" : "CO" } +{ "_id" : "80474", "city" : "ROLLINSVILLE", "loc" : [ -105.472596, 39.910757 ], "pop" : 343, "state" : "CO" } +{ "_id" : "80479", "city" : "TOPONAS", "loc" : [ -106.908172, 40.119601 ], "pop" : 697, "state" : "CO" } +{ "_id" : "80480", "city" : "WALDEN", "loc" : [ -106.276728, 40.709978 ], "pop" : 1517, "state" : "CO" } +{ "_id" : "80481", "city" : "WARD", "loc" : [ -105.508023, 40.072572 ], "pop" : 159, "state" : "CO" } +{ "_id" : "80487", "city" : "STEAMBOAT SPRING", "loc" : [ -106.8457, 40.474124 ], "pop" : 9773, "state" : "CO" } +{ "_id" : "80501", "city" : "LONGMONT", "loc" : [ -105.10095, 40.177921 ], "pop" : 47166, "state" : "CO" } +{ "_id" : "80503", "city" : "LONGMONT", "loc" : [ -105.162432, 40.15588 ], "pop" : 16814, "state" : "CO" } +{ "_id" : "80504", "city" : "LONGMONT", "loc" : [ -104.950446, 40.130615 ], "pop" : 3716, "state" : "CO" } +{ "_id" : "80510", "city" : "ALLENSPARK", "loc" : [ -105.520064, 40.226775 ], "pop" : 183, "state" : "CO" } +{ "_id" : "80512", "city" : "BELLVUE", "loc" : [ -105.260977, 40.626528 ], "pop" : 1982, "state" : "CO" } +{ "_id" : "80513", "city" : "BERTHOUD", "loc" : [ -105.105459, 40.299333 ], "pop" : 6886, "state" : "CO" } +{ "_id" : "80514", "city" : "DACONO", "loc" : [ -104.929705, 40.08361 ], "pop" : 2223, "state" : "CO" } +{ "_id" : "80515", "city" : "DRAKE", "loc" : [ -105.296925, 40.443257 ], "pop" : 721, "state" : "CO" } +{ "_id" : "80516", "city" : "ERIE", "loc" : [ -105.068583, 40.059746 ], "pop" : 304, "state" : "CO" } +{ "_id" : "80517", "city" : "ESTES PARK", "loc" : [ -105.514163, 40.365761 ], "pop" : 6428, "state" : "CO" } +{ "_id" : "80521", "city" : "FORT COLLINS", "loc" : [ -105.103884, 40.581293 ], "pop" : 30059, "state" : "CO" } +{ "_id" : "80524", "city" : "FORT COLLINS", "loc" : [ -105.05811, 40.59865 ], "pop" : 21204, "state" : "CO" } +{ "_id" : "80525", "city" : "FORT COLLINS", "loc" : [ -105.054715, 40.538354 ], "pop" : 31263, "state" : "CO" } +{ "_id" : "80526", "city" : "FORT COLLINS", "loc" : [ -105.107646, 40.547294 ], "pop" : 29180, "state" : "CO" } +{ "_id" : "80534", "city" : "JOHNSTOWN", "loc" : [ -104.923558, 40.335526 ], "pop" : 2601, "state" : "CO" } +{ "_id" : "80535", "city" : "LAPORTE", "loc" : [ -105.148757, 40.634683 ], "pop" : 2300, "state" : "CO" } +{ "_id" : "80536", "city" : "VIRGINIA DALE", "loc" : [ -105.367745, 40.779878 ], "pop" : 513, "state" : "CO" } +{ "_id" : "80537", "city" : "LOVELAND", "loc" : [ -105.09164, 40.384917 ], "pop" : 24502, "state" : "CO" } +{ "_id" : "80538", "city" : "LOVELAND", "loc" : [ -105.089985, 40.426239 ], "pop" : 26449, "state" : "CO" } +{ "_id" : "80540", "city" : "LYONS", "loc" : [ -105.323071, 40.235715 ], "pop" : 3696, "state" : "CO" } +{ "_id" : "80543", "city" : "MILLIKEN", "loc" : [ -104.876137, 40.310656 ], "pop" : 2632, "state" : "CO" } +{ "_id" : "80545", "city" : "RED FEATHER LAKE", "loc" : [ -105.624455, 40.796451 ], "pop" : 440, "state" : "CO" } +{ "_id" : "80549", "city" : "WELLINGTON", "loc" : [ -105.031844, 40.725525 ], "pop" : 3309, "state" : "CO" } +{ "_id" : "80550", "city" : "WINDSOR", "loc" : [ -104.899442, 40.483663 ], "pop" : 6724, "state" : "CO" } +{ "_id" : "80601", "city" : "LOCHBUI", "loc" : [ -104.810278, 39.980553 ], "pop" : 20533, "state" : "CO" } +{ "_id" : "80610", "city" : "AULT", "loc" : [ -104.735629, 40.593772 ], "pop" : 2684, "state" : "CO" } +{ "_id" : "80611", "city" : "BRIGGSDALE", "loc" : [ -104.28707, 40.639192 ], "pop" : 259, "state" : "CO" } +{ "_id" : "80612", "city" : "CARR", "loc" : [ -104.885865, 40.866551 ], "pop" : 94, "state" : "CO" } +{ "_id" : "80615", "city" : "EATON", "loc" : [ -104.714559, 40.527272 ], "pop" : 2902, "state" : "CO" } +{ "_id" : "80620", "city" : "EVANS", "loc" : [ -104.697095, 40.380255 ], "pop" : 6262, "state" : "CO" } +{ "_id" : "80621", "city" : "WATTENBURG", "loc" : [ -104.865639, 40.078876 ], "pop" : 12913, "state" : "CO" } +{ "_id" : "80622", "city" : "GALETON", "loc" : [ -104.597254, 40.515034 ], "pop" : 360, "state" : "CO" } +{ "_id" : "80624", "city" : "GILL", "loc" : [ -104.499995, 40.469586 ], "pop" : 130, "state" : "CO" } +{ "_id" : "80631", "city" : "GARDEN CITY", "loc" : [ -104.704756, 40.413968 ], "pop" : 53905, "state" : "CO" } +{ "_id" : "80634", "city" : "GREELEY", "loc" : [ -104.754113, 40.410947 ], "pop" : 14100, "state" : "CO" } +{ "_id" : "80640", "city" : "HENDERSON", "loc" : [ -104.871834, 39.898304 ], "pop" : 1388, "state" : "CO" } +{ "_id" : "80642", "city" : "HUDSON", "loc" : [ -104.653208, 40.060555 ], "pop" : 2369, "state" : "CO" } +{ "_id" : "80643", "city" : "KEENESBURG", "loc" : [ -104.446366, 40.095847 ], "pop" : 1979, "state" : "CO" } +{ "_id" : "80644", "city" : "KERSEY", "loc" : [ -104.528768, 40.396305 ], "pop" : 2843, "state" : "CO" } +{ "_id" : "80645", "city" : "LA SALLE", "loc" : [ -104.726784, 40.321138 ], "pop" : 4455, "state" : "CO" } +{ "_id" : "80648", "city" : "NUNN", "loc" : [ -104.785012, 40.726483 ], "pop" : 505, "state" : "CO" } +{ "_id" : "80649", "city" : "ORCHARD", "loc" : [ -104.097325, 40.363946 ], "pop" : 277, "state" : "CO" } +{ "_id" : "80650", "city" : "PIERCE", "loc" : [ -104.763764, 40.635911 ], "pop" : 1020, "state" : "CO" } +{ "_id" : "80651", "city" : "PLATTEVILLE", "loc" : [ -104.802776, 40.213121 ], "pop" : 2577, "state" : "CO" } +{ "_id" : "80652", "city" : "ROGGEN", "loc" : [ -104.315747, 40.207445 ], "pop" : 150, "state" : "CO" } +{ "_id" : "80653", "city" : "WELDONA", "loc" : [ -103.967755, 40.368093 ], "pop" : 328, "state" : "CO" } +{ "_id" : "80654", "city" : "HOYT", "loc" : [ -104.052814, 40.205651 ], "pop" : 1746, "state" : "CO" } +{ "_id" : "80701", "city" : "FORT MORGAN", "loc" : [ -103.803119, 40.254084 ], "pop" : 13263, "state" : "CO" } +{ "_id" : "80720", "city" : "AKRON", "loc" : [ -103.225885, 40.180315 ], "pop" : 2559, "state" : "CO" } +{ "_id" : "80721", "city" : "AMHERST", "loc" : [ -102.170567, 40.682386 ], "pop" : 86, "state" : "CO" } +{ "_id" : "80722", "city" : "ATWOOD", "loc" : [ -103.039301, 40.517432 ], "pop" : 140, "state" : "CO" } +{ "_id" : "80723", "city" : "BRUSH", "loc" : [ -103.62788, 40.260255 ], "pop" : 5603, "state" : "CO" } +{ "_id" : "80726", "city" : "CROOK", "loc" : [ -102.847174, 40.874743 ], "pop" : 638, "state" : "CO" } +{ "_id" : "80727", "city" : "ECKLEY", "loc" : [ -102.482776, 40.113775 ], "pop" : 242, "state" : "CO" } +{ "_id" : "80728", "city" : "FLEMING", "loc" : [ -102.868821, 40.637019 ], "pop" : 853, "state" : "CO" } +{ "_id" : "80729", "city" : "GROVER", "loc" : [ -104.234613, 40.871635 ], "pop" : 492, "state" : "CO" } +{ "_id" : "80731", "city" : "HAXTUN", "loc" : [ -102.605175, 40.640587 ], "pop" : 1569, "state" : "CO" } +{ "_id" : "80733", "city" : "HILLROSE", "loc" : [ -103.541816, 40.307186 ], "pop" : 516, "state" : "CO" } +{ "_id" : "80734", "city" : "HOLYOKE", "loc" : [ -102.282545, 40.582542 ], "pop" : 2642, "state" : "CO" } +{ "_id" : "80735", "city" : "HALE", "loc" : [ -102.211563, 39.733147 ], "pop" : 393, "state" : "CO" } +{ "_id" : "80736", "city" : "ILIFF", "loc" : [ -103.096808, 40.769174 ], "pop" : 778, "state" : "CO" } +{ "_id" : "80737", "city" : "JULESBURG", "loc" : [ -102.257501, 40.97083 ], "pop" : 1712, "state" : "CO" } +{ "_id" : "80740", "city" : "LINDON", "loc" : [ -103.314471, 39.830849 ], "pop" : 136, "state" : "CO" } +{ "_id" : "80741", "city" : "WILLARD", "loc" : [ -103.34471, 40.511548 ], "pop" : 959, "state" : "CO" } +{ "_id" : "80742", "city" : "NEW RAYMER", "loc" : [ -103.838982, 40.685079 ], "pop" : 310, "state" : "CO" } +{ "_id" : "80743", "city" : "OTIS", "loc" : [ -102.939219, 40.202989 ], "pop" : 1102, "state" : "CO" } +{ "_id" : "80744", "city" : "OVID", "loc" : [ -102.387396, 40.945865 ], "pop" : 563, "state" : "CO" } +{ "_id" : "80745", "city" : "PADRONI", "loc" : [ -103.358163, 40.954911 ], "pop" : 72, "state" : "CO" } +{ "_id" : "80747", "city" : "PEETZ", "loc" : [ -103.116606, 40.95195 ], "pop" : 451, "state" : "CO" } +{ "_id" : "80749", "city" : "SEDGWICK", "loc" : [ -102.529122, 40.910317 ], "pop" : 415, "state" : "CO" } +{ "_id" : "80750", "city" : "SNYDER", "loc" : [ -103.597134, 40.330655 ], "pop" : 134, "state" : "CO" } +{ "_id" : "80751", "city" : "STERLING", "loc" : [ -103.221183, 40.63062 ], "pop" : 13524, "state" : "CO" } +{ "_id" : "80754", "city" : "STONEHAM", "loc" : [ -103.638687, 40.686994 ], "pop" : 141, "state" : "CO" } +{ "_id" : "80755", "city" : "VERNON", "loc" : [ -102.319343, 39.933127 ], "pop" : 318, "state" : "CO" } +{ "_id" : "80757", "city" : "LAST CHANCE", "loc" : [ -103.578033, 39.938105 ], "pop" : 265, "state" : "CO" } +{ "_id" : "80758", "city" : "LAIRD", "loc" : [ -102.233751, 40.104917 ], "pop" : 3396, "state" : "CO" } +{ "_id" : "80759", "city" : "YUMA", "loc" : [ -102.707174, 40.130063 ], "pop" : 3811, "state" : "CO" } +{ "_id" : "80801", "city" : "ANTON", "loc" : [ -103.434296, 39.686527 ], "pop" : 240, "state" : "CO" } +{ "_id" : "80802", "city" : "ARAPAHOE", "loc" : [ -102.19401, 38.841716 ], "pop" : 335, "state" : "CO" } +{ "_id" : "80804", "city" : "ARRIBA", "loc" : [ -103.270968, 39.30253 ], "pop" : 388, "state" : "CO" } +{ "_id" : "80805", "city" : "BETHUNE", "loc" : [ -102.428142, 39.344771 ], "pop" : 543, "state" : "CO" } +{ "_id" : "80807", "city" : "BURLINGTON", "loc" : [ -102.258281, 39.310649 ], "pop" : 3982, "state" : "CO" } +{ "_id" : "80808", "city" : "CALHAN", "loc" : [ -104.355274, 38.964773 ], "pop" : 2955, "state" : "CO" } +{ "_id" : "80809", "city" : "NORTH POLE", "loc" : [ -104.993684, 38.921314 ], "pop" : 2259, "state" : "CO" } +{ "_id" : "80810", "city" : "CHEYENNE WELLS", "loc" : [ -102.358173, 38.819762 ], "pop" : 1364, "state" : "CO" } +{ "_id" : "80812", "city" : "COPE", "loc" : [ -102.988098, 39.746227 ], "pop" : 626, "state" : "CO" } +{ "_id" : "80814", "city" : "DIVIDE", "loc" : [ -105.19937, 38.957622 ], "pop" : 1675, "state" : "CO" } +{ "_id" : "80815", "city" : "FLAGLER", "loc" : [ -103.062395, 39.312654 ], "pop" : 854, "state" : "CO" } +{ "_id" : "80816", "city" : "FLORISSANT", "loc" : [ -105.226106, 38.827669 ], "pop" : 2480, "state" : "CO" } +{ "_id" : "80817", "city" : "FOUNTAIN", "loc" : [ -104.700469, 38.699563 ], "pop" : 11570, "state" : "CO" } +{ "_id" : "80818", "city" : "GENOA", "loc" : [ -103.460689, 39.338328 ], "pop" : 320, "state" : "CO" } +{ "_id" : "80820", "city" : "GUFFEY", "loc" : [ -105.57835, 38.814584 ], "pop" : 300, "state" : "CO" } +{ "_id" : "80821", "city" : "HUGO", "loc" : [ -103.498971, 39.084318 ], "pop" : 1064, "state" : "CO" } +{ "_id" : "80822", "city" : "JOES", "loc" : [ -102.615134, 39.672771 ], "pop" : 315, "state" : "CO" } +{ "_id" : "80823", "city" : "KARVAL", "loc" : [ -103.500613, 38.71194 ], "pop" : 339, "state" : "CO" } +{ "_id" : "80824", "city" : "KIRK", "loc" : [ -102.477554, 39.617072 ], "pop" : 479, "state" : "CO" } +{ "_id" : "80825", "city" : "KIT CARSON", "loc" : [ -102.819842, 38.803984 ], "pop" : 698, "state" : "CO" } +{ "_id" : "80827", "city" : "LAKE GEORGE", "loc" : [ -105.434654, 39.034233 ], "pop" : 587, "state" : "CO" } +{ "_id" : "80828", "city" : "LIMON", "loc" : [ -103.685572, 39.27126 ], "pop" : 2244, "state" : "CO" } +{ "_id" : "80829", "city" : "MANITOU SPRINGS", "loc" : [ -104.905839, 38.854994 ], "pop" : 4989, "state" : "CO" } +{ "_id" : "80830", "city" : "MATHESON", "loc" : [ -103.913165, 39.132044 ], "pop" : 439, "state" : "CO" } +{ "_id" : "80831", "city" : "PEYTON", "loc" : [ -104.54722, 38.954097 ], "pop" : 3707, "state" : "CO" } +{ "_id" : "80832", "city" : "RAMAH", "loc" : [ -104.124733, 39.073571 ], "pop" : 561, "state" : "CO" } +{ "_id" : "80833", "city" : "RUSH", "loc" : [ -104.024065, 38.764248 ], "pop" : 408, "state" : "CO" } +{ "_id" : "80834", "city" : "SEIBERT", "loc" : [ -102.882184, 39.318329 ], "pop" : 364, "state" : "CO" } +{ "_id" : "80835", "city" : "SIMLA", "loc" : [ -104.086236, 39.146457 ], "pop" : 580, "state" : "CO" } +{ "_id" : "80836", "city" : "STRATTON", "loc" : [ -102.597928, 39.308733 ], "pop" : 1102, "state" : "CO" } +{ "_id" : "80840", "city" : "UNITED STATES AI", "loc" : [ -104.860139, 38.990448 ], "pop" : 9062, "state" : "CO" } +{ "_id" : "80861", "city" : "VONA", "loc" : [ -102.739287, 39.323564 ], "pop" : 295, "state" : "CO" } +{ "_id" : "80863", "city" : "WOODLAND PARK", "loc" : [ -105.062292, 38.996929 ], "pop" : 8272, "state" : "CO" } +{ "_id" : "80864", "city" : "YODER", "loc" : [ -104.218353, 38.775252 ], "pop" : 511, "state" : "CO" } +{ "_id" : "80903", "city" : "COLORADO SPRINGS", "loc" : [ -104.814466, 38.838832 ], "pop" : 13972, "state" : "CO" } +{ "_id" : "80904", "city" : "COLORADO SPRINGS", "loc" : [ -104.859513, 38.853318 ], "pop" : 17366, "state" : "CO" } +{ "_id" : "80905", "city" : "COLORADO SPRINGS", "loc" : [ -104.836997, 38.837692 ], "pop" : 3435, "state" : "CO" } +{ "_id" : "80906", "city" : "COLORADO SPRINGS", "loc" : [ -104.819893, 38.790164 ], "pop" : 38856, "state" : "CO" } +{ "_id" : "80907", "city" : "COLORADO SPRINGS", "loc" : [ -104.817034, 38.876001 ], "pop" : 25123, "state" : "CO" } +{ "_id" : "80908", "city" : "COLORADO SPRINGS", "loc" : [ -104.693331, 39.023745 ], "pop" : 6803, "state" : "CO" } +{ "_id" : "80909", "city" : "COLORADO SPRINGS", "loc" : [ -104.773483, 38.852038 ], "pop" : 34887, "state" : "CO" } +{ "_id" : "80910", "city" : "COLORADO SPRINGS", "loc" : [ -104.770299, 38.815164 ], "pop" : 24867, "state" : "CO" } +{ "_id" : "80911", "city" : "COLORADO SPRINGS", "loc" : [ -104.722322, 38.745665 ], "pop" : 22116, "state" : "CO" } +{ "_id" : "80913", "city" : "FORT CARSON", "loc" : [ -104.782218, 38.741967 ], "pop" : 11309, "state" : "CO" } +{ "_id" : "80914", "city" : "CHEYENNE MTN AFB", "loc" : [ -104.719052, 38.784241 ], "pop" : 0, "state" : "CO" } +{ "_id" : "80915", "city" : "COLORADO SPRINGS", "loc" : [ -104.713422, 38.855845 ], "pop" : 18209, "state" : "CO" } +{ "_id" : "80916", "city" : "COLORADO SPRINGS", "loc" : [ -104.74034, 38.807619 ], "pop" : 26402, "state" : "CO" } +{ "_id" : "80917", "city" : "COLORADO SPRINGS", "loc" : [ -104.739904, 38.886027 ], "pop" : 27664, "state" : "CO" } +{ "_id" : "80918", "city" : "COLORADO SPRINGS", "loc" : [ -104.773444, 38.912924 ], "pop" : 36410, "state" : "CO" } +{ "_id" : "80919", "city" : "COLORADO SPRINGS", "loc" : [ -104.84642, 38.926795 ], "pop" : 17468, "state" : "CO" } +{ "_id" : "80920", "city" : "COLORADO SPRINGS", "loc" : [ -104.766951, 38.949732 ], "pop" : 16907, "state" : "CO" } +{ "_id" : "80921", "city" : "COLORADO SPRINGS", "loc" : [ -104.814042, 39.048674 ], "pop" : 3539, "state" : "CO" } +{ "_id" : "80922", "city" : "COLORADO SPRINGS", "loc" : [ -104.698161, 38.90503 ], "pop" : 1836, "state" : "CO" } +{ "_id" : "80925", "city" : "COLORADO SPRINGS", "loc" : [ -104.660087, 38.731329 ], "pop" : 2550, "state" : "CO" } +{ "_id" : "80926", "city" : "COLORADO SPRINGS", "loc" : [ -104.85051, 38.698073 ], "pop" : 1040, "state" : "CO" } +{ "_id" : "80928", "city" : "COLORADO SPRINGS", "loc" : [ -104.457043, 38.623261 ], "pop" : 273, "state" : "CO" } +{ "_id" : "80929", "city" : "COLORADO SPRINGS", "loc" : [ -104.607857, 38.796837 ], "pop" : 197, "state" : "CO" } +{ "_id" : "80930", "city" : "COLORADO SPRINGS", "loc" : [ -104.526924, 38.828926 ], "pop" : 484, "state" : "CO" } +{ "_id" : "81001", "city" : "PUEBLO", "loc" : [ -104.584828, 38.287876 ], "pop" : 28837, "state" : "CO" } +{ "_id" : "81003", "city" : "PUEBLO", "loc" : [ -104.62337, 38.284277 ], "pop" : 13461, "state" : "CO" } +{ "_id" : "81004", "city" : "PUEBLO", "loc" : [ -104.627829, 38.244063 ], "pop" : 25748, "state" : "CO" } +{ "_id" : "81005", "city" : "PUEBLO", "loc" : [ -104.660031, 38.235157 ], "pop" : 26273, "state" : "CO" } +{ "_id" : "81006", "city" : "PUEBLO", "loc" : [ -104.531834, 38.24465 ], "pop" : 12277, "state" : "CO" } +{ "_id" : "81007", "city" : "PUEBLO WEST", "loc" : [ -104.743264, 38.319975 ], "pop" : 4592, "state" : "CO" } +{ "_id" : "81008", "city" : "PUEBLO", "loc" : [ -104.628433, 38.313251 ], "pop" : 5953, "state" : "CO" } +{ "_id" : "81020", "city" : "AGUILAR", "loc" : [ -104.676926, 37.393304 ], "pop" : 928, "state" : "CO" } +{ "_id" : "81021", "city" : "ARLINGTON", "loc" : [ -103.369741, 38.40677 ], "pop" : 28, "state" : "CO" } +{ "_id" : "81022", "city" : "NORTH AVONDALE", "loc" : [ -104.359686, 38.211603 ], "pop" : 1483, "state" : "CO" } +{ "_id" : "81023", "city" : "BEULAH", "loc" : [ -104.97245, 38.083712 ], "pop" : 867, "state" : "CO" } +{ "_id" : "81025", "city" : "BOONE", "loc" : [ -104.25851, 38.264614 ], "pop" : 976, "state" : "CO" } +{ "_id" : "81026", "city" : "BRANDON", "loc" : [ -102.781906, 38.485133 ], "pop" : 1094, "state" : "CO" } +{ "_id" : "81027", "city" : "BRANSON", "loc" : [ -103.874115, 37.051775 ], "pop" : 140, "state" : "CO" } +{ "_id" : "81028", "city" : "BRISTOL", "loc" : [ -102.342642, 38.133184 ], "pop" : 256, "state" : "CO" } +{ "_id" : "81029", "city" : "CAMPO", "loc" : [ -102.546423, 37.119547 ], "pop" : 487, "state" : "CO" } +{ "_id" : "81036", "city" : "CHIVINGTON", "loc" : [ -102.50536, 38.444141 ], "pop" : 123, "state" : "CO" } +{ "_id" : "81039", "city" : "FOWLER", "loc" : [ -104.029908, 38.123071 ], "pop" : 1877, "state" : "CO" } +{ "_id" : "81040", "city" : "FARISITA", "loc" : [ -105.237397, 37.763753 ], "pop" : 428, "state" : "CO" } +{ "_id" : "81041", "city" : "GRANADA", "loc" : [ -102.32712, 38.054485 ], "pop" : 741, "state" : "CO" } +{ "_id" : "81043", "city" : "HARTMAN", "loc" : [ -102.186609, 38.145291 ], "pop" : 256, "state" : "CO" } +{ "_id" : "81044", "city" : "CADDOA", "loc" : [ -102.933145, 38.107347 ], "pop" : 263, "state" : "CO" } +{ "_id" : "81045", "city" : "HASWELL", "loc" : [ -103.150543, 38.447431 ], "pop" : 109, "state" : "CO" } +{ "_id" : "81047", "city" : "HOLLY", "loc" : [ -102.141466, 38.0205 ], "pop" : 1480, "state" : "CO" } +{ "_id" : "81049", "city" : "VILLEGREEN", "loc" : [ -103.358348, 37.331189 ], "pop" : 389, "state" : "CO" } +{ "_id" : "81050", "city" : "TIMPAS", "loc" : [ -103.549068, 37.991552 ], "pop" : 11742, "state" : "CO" } +{ "_id" : "81052", "city" : "LAMAR", "loc" : [ -102.619195, 38.084136 ], "pop" : 9903, "state" : "CO" } +{ "_id" : "81054", "city" : "DEORA", "loc" : [ -103.208492, 38.065514 ], "pop" : 4217, "state" : "CO" } +{ "_id" : "81055", "city" : "CUCHARA", "loc" : [ -105.012994, 37.498292 ], "pop" : 1234, "state" : "CO" } +{ "_id" : "81057", "city" : "MC CLAVE", "loc" : [ -102.816934, 38.150484 ], "pop" : 568, "state" : "CO" } +{ "_id" : "81058", "city" : "MANZANOLA", "loc" : [ -103.876602, 38.110861 ], "pop" : 961, "state" : "CO" } +{ "_id" : "81059", "city" : "DELHI", "loc" : [ -104.13074, 37.478533 ], "pop" : 237, "state" : "CO" } +{ "_id" : "81062", "city" : "OLNEY SPRINGS", "loc" : [ -103.941033, 38.201877 ], "pop" : 706, "state" : "CO" } +{ "_id" : "81063", "city" : "ORDWAY", "loc" : [ -103.800277, 38.209546 ], "pop" : 2692, "state" : "CO" } +{ "_id" : "81064", "city" : "UTLEYVILLE", "loc" : [ -102.893106, 37.355885 ], "pop" : 383, "state" : "CO" } +{ "_id" : "81067", "city" : "ROCKY FORD", "loc" : [ -103.725143, 38.049016 ], "pop" : 5946, "state" : "CO" } +{ "_id" : "81069", "city" : "RYE", "loc" : [ -104.886257, 37.937145 ], "pop" : 2369, "state" : "CO" } +{ "_id" : "81071", "city" : "TOWNER", "loc" : [ -102.295367, 38.462172 ], "pop" : 162, "state" : "CO" } +{ "_id" : "81073", "city" : "SPRINGFIELD", "loc" : [ -102.617322, 37.406727 ], "pop" : 1992, "state" : "CO" } +{ "_id" : "81076", "city" : "SUGAR CITY", "loc" : [ -103.655557, 38.244368 ], "pop" : 400, "state" : "CO" } +{ "_id" : "81081", "city" : "TRINCHERA", "loc" : [ -104.118354, 37.075662 ], "pop" : 21, "state" : "CO" } +{ "_id" : "81082", "city" : "JANSEN", "loc" : [ -104.500715, 37.175475 ], "pop" : 10978, "state" : "CO" } +{ "_id" : "81084", "city" : "LYCAN", "loc" : [ -102.320128, 37.57476 ], "pop" : 183, "state" : "CO" } +{ "_id" : "81087", "city" : "VILAS", "loc" : [ -102.44374, 37.373043 ], "pop" : 145, "state" : "CO" } +{ "_id" : "81089", "city" : "FARISTA", "loc" : [ -104.804301, 37.638159 ], "pop" : 4347, "state" : "CO" } +{ "_id" : "81090", "city" : "WALSH", "loc" : [ -102.253716, 37.352057 ], "pop" : 1366, "state" : "CO" } +{ "_id" : "81091", "city" : "WESTON", "loc" : [ -104.824749, 37.170211 ], "pop" : 1094, "state" : "CO" } +{ "_id" : "81092", "city" : "WILEY", "loc" : [ -102.714734, 38.158978 ], "pop" : 711, "state" : "CO" } +{ "_id" : "81101", "city" : "ALAMOSA", "loc" : [ -105.878602, 37.470274 ], "pop" : 12580, "state" : "CO" } +{ "_id" : "81120", "city" : "ANTONITO", "loc" : [ -106.037946, 37.085473 ], "pop" : 2246, "state" : "CO" } +{ "_id" : "81121", "city" : "ARBOLES", "loc" : [ -107.390749, 37.101633 ], "pop" : 587, "state" : "CO" } +{ "_id" : "81122", "city" : "BAYFIELD", "loc" : [ -107.613728, 37.260328 ], "pop" : 3866, "state" : "CO" } +{ "_id" : "81123", "city" : "BLANCA", "loc" : [ -105.517784, 37.431702 ], "pop" : 429, "state" : "CO" } +{ "_id" : "81125", "city" : "CENTER", "loc" : [ -106.090628, 37.734295 ], "pop" : 4419, "state" : "CO" } +{ "_id" : "81130", "city" : "CREEDE", "loc" : [ -106.927679, 37.816367 ], "pop" : 558, "state" : "CO" } +{ "_id" : "81132", "city" : "LA GARITA", "loc" : [ -106.350502, 37.671346 ], "pop" : 2791, "state" : "CO" } +{ "_id" : "81133", "city" : "FORT GARLAND", "loc" : [ -105.404879, 37.426978 ], "pop" : 725, "state" : "CO" } +{ "_id" : "81136", "city" : "HOOPER", "loc" : [ -105.871193, 37.723203 ], "pop" : 265, "state" : "CO" } +{ "_id" : "81137", "city" : "IGNACIO", "loc" : [ -107.639465, 37.126412 ], "pop" : 3494, "state" : "CO" } +{ "_id" : "81140", "city" : "LA JARA", "loc" : [ -106.005427, 37.290726 ], "pop" : 2274, "state" : "CO" } +{ "_id" : "81143", "city" : "MOFFAT", "loc" : [ -105.841051, 38.045195 ], "pop" : 737, "state" : "CO" } +{ "_id" : "81144", "city" : "MONTE VISTA", "loc" : [ -106.140833, 37.573095 ], "pop" : 6041, "state" : "CO" } +{ "_id" : "81146", "city" : "MOSCA", "loc" : [ -105.806866, 37.635796 ], "pop" : 399, "state" : "CO" } +{ "_id" : "81147", "city" : "PAGOSA SPRINGS", "loc" : [ -107.038497, 37.252345 ], "pop" : 4758, "state" : "CO" } +{ "_id" : "81149", "city" : "SAGUACHE", "loc" : [ -106.187592, 38.09775 ], "pop" : 895, "state" : "CO" } +{ "_id" : "81150", "city" : "SAN ACACIO", "loc" : [ -105.439949, 37.201347 ], "pop" : 1146, "state" : "CO" } +{ "_id" : "81151", "city" : "SANFORD", "loc" : [ -105.928588, 37.208724 ], "pop" : 3037, "state" : "CO" } +{ "_id" : "81152", "city" : "MESITA", "loc" : [ -105.575625, 37.05057 ], "pop" : 252, "state" : "CO" } +{ "_id" : "81153", "city" : "SAN PABLO", "loc" : [ -105.346196, 37.134872 ], "pop" : 638, "state" : "CO" } +{ "_id" : "81154", "city" : "SOUTH FORK", "loc" : [ -106.612451, 37.67248 ], "pop" : 722, "state" : "CO" } +{ "_id" : "81155", "city" : "VILLA GROVE", "loc" : [ -106.110183, 38.2952 ], "pop" : 53, "state" : "CO" } +{ "_id" : "81201", "city" : "SALIDA", "loc" : [ -105.997818, 38.525909 ], "pop" : 7658, "state" : "CO" } +{ "_id" : "81210", "city" : "ALMONT", "loc" : [ -106.627099, 38.64997 ], "pop" : 150, "state" : "CO" } +{ "_id" : "81211", "city" : "BUENA VISTA", "loc" : [ -106.147121, 38.838003 ], "pop" : 5220, "state" : "CO" } +{ "_id" : "81212", "city" : "CANON CITY", "loc" : [ -105.217829, 38.445074 ], "pop" : 23049, "state" : "CO" } +{ "_id" : "81220", "city" : "CIMARRON", "loc" : [ -107.482366, 38.387633 ], "pop" : 84, "state" : "CO" } +{ "_id" : "81224", "city" : "CRESTED BUTTE", "loc" : [ -106.961899, 38.869081 ], "pop" : 1750, "state" : "CO" } +{ "_id" : "81226", "city" : "FLORENCE", "loc" : [ -105.123233, 38.385016 ], "pop" : 4461, "state" : "CO" } +{ "_id" : "81228", "city" : "GRANITE", "loc" : [ -106.311417, 39.095294 ], "pop" : 79, "state" : "CO" } +{ "_id" : "81230", "city" : "GUNNISON", "loc" : [ -106.931013, 38.551056 ], "pop" : 7814, "state" : "CO" } +{ "_id" : "81233", "city" : "HOWARD", "loc" : [ -105.747124, 38.388519 ], "pop" : 485, "state" : "CO" } +{ "_id" : "81235", "city" : "LAKE CITY", "loc" : [ -107.302037, 37.986769 ], "pop" : 467, "state" : "CO" } +{ "_id" : "81236", "city" : "NATHROP", "loc" : [ -106.116576, 38.710343 ], "pop" : 440, "state" : "CO" } +{ "_id" : "81239", "city" : "PARLIN", "loc" : [ -106.677995, 38.508762 ], "pop" : 67, "state" : "CO" } +{ "_id" : "81240", "city" : "PENROSE", "loc" : [ -105.011325, 38.433622 ], "pop" : 3166, "state" : "CO" } +{ "_id" : "81241", "city" : "PITKIN", "loc" : [ -106.516774, 38.608542 ], "pop" : 53, "state" : "CO" } +{ "_id" : "81243", "city" : "POWDERHORN", "loc" : [ -107.108449, 38.282165 ], "pop" : 11, "state" : "CO" } +{ "_id" : "81251", "city" : "TWIN LAKES", "loc" : [ -106.435079, 39.090231 ], "pop" : 49, "state" : "CO" } +{ "_id" : "81252", "city" : "WESTCLIFFE", "loc" : [ -105.433154, 38.123023 ], "pop" : 1569, "state" : "CO" } +{ "_id" : "81253", "city" : "WETMORE", "loc" : [ -105.106441, 38.189857 ], "pop" : 357, "state" : "CO" } +{ "_id" : "81301", "city" : "DURANGO", "loc" : [ -107.861684, 37.287388 ], "pop" : 23506, "state" : "CO" } +{ "_id" : "81320", "city" : "CAHONE", "loc" : [ -108.579442, 37.69163 ], "pop" : 384, "state" : "CO" } +{ "_id" : "81321", "city" : "CORTEZ", "loc" : [ -108.583726, 37.354949 ], "pop" : 11937, "state" : "CO" } +{ "_id" : "81323", "city" : "DOLORES", "loc" : [ -108.471748, 37.466571 ], "pop" : 1770, "state" : "CO" } +{ "_id" : "81324", "city" : "DOVE CREEK", "loc" : [ -108.918147, 37.763199 ], "pop" : 1120, "state" : "CO" } +{ "_id" : "81325", "city" : "EGNAR", "loc" : [ -108.929889, 37.934448 ], "pop" : 119, "state" : "CO" } +{ "_id" : "81326", "city" : "HESPERUS", "loc" : [ -108.121917, 37.165368 ], "pop" : 1303, "state" : "CO" } +{ "_id" : "81327", "city" : "LEWIS", "loc" : [ -108.61891, 37.47101 ], "pop" : 1455, "state" : "CO" } +{ "_id" : "81328", "city" : "MANCOS", "loc" : [ -108.298242, 37.347133 ], "pop" : 2141, "state" : "CO" } +{ "_id" : "81331", "city" : "PLEASANT VIEW", "loc" : [ -108.809487, 37.588763 ], "pop" : 223, "state" : "CO" } +{ "_id" : "81334", "city" : "TOWAOC", "loc" : [ -108.719993, 37.208408 ], "pop" : 1135, "state" : "CO" } +{ "_id" : "81335", "city" : "YELLOW JACKET", "loc" : [ -108.785167, 37.499526 ], "pop" : 126, "state" : "CO" } +{ "_id" : "81401", "city" : "MONTROSE", "loc" : [ -107.875182, 38.46783 ], "pop" : 17834, "state" : "CO" } +{ "_id" : "81410", "city" : "AUSTIN", "loc" : [ -107.97384, 38.797544 ], "pop" : 1258, "state" : "CO" } +{ "_id" : "81411", "city" : "BEDROCK", "loc" : [ -108.953224, 38.384352 ], "pop" : 191, "state" : "CO" } +{ "_id" : "81413", "city" : "CEDAREDGE", "loc" : [ -107.926786, 38.911878 ], "pop" : 3254, "state" : "CO" } +{ "_id" : "81415", "city" : "CRAWFORD", "loc" : [ -107.614864, 38.69408 ], "pop" : 882, "state" : "CO" } +{ "_id" : "81416", "city" : "DELTA", "loc" : [ -108.060421, 38.734891 ], "pop" : 8644, "state" : "CO" } +{ "_id" : "81418", "city" : "ECKERT", "loc" : [ -107.962452, 38.844982 ], "pop" : 1211, "state" : "CO" } +{ "_id" : "81419", "city" : "HOTCHKISS", "loc" : [ -107.747173, 38.812417 ], "pop" : 2735, "state" : "CO" } +{ "_id" : "81422", "city" : "NATURITA", "loc" : [ -108.572836, 38.222559 ], "pop" : 554, "state" : "CO" } +{ "_id" : "81423", "city" : "NORWOOD", "loc" : [ -108.284472, 38.110406 ], "pop" : 1079, "state" : "CO" } +{ "_id" : "81424", "city" : "NUCLA", "loc" : [ -108.547644, 38.268219 ], "pop" : 1135, "state" : "CO" } +{ "_id" : "81425", "city" : "OLATHE", "loc" : [ -107.992118, 38.597575 ], "pop" : 4246, "state" : "CO" } +{ "_id" : "81426", "city" : "OPHIR", "loc" : [ -107.851961, 37.856197 ], "pop" : 138, "state" : "CO" } +{ "_id" : "81427", "city" : "OURAY", "loc" : [ -107.67261, 38.02576 ], "pop" : 686, "state" : "CO" } +{ "_id" : "81428", "city" : "PAONIA", "loc" : [ -107.598483, 38.864978 ], "pop" : 3314, "state" : "CO" } +{ "_id" : "81430", "city" : "PLACERVILLE", "loc" : [ -108.024775, 38.008759 ], "pop" : 467, "state" : "CO" } +{ "_id" : "81431", "city" : "REDVALE", "loc" : [ -108.389536, 38.186452 ], "pop" : 409, "state" : "CO" } +{ "_id" : "81432", "city" : "RIDGWAY", "loc" : [ -107.753341, 38.138074 ], "pop" : 1299, "state" : "CO" } +{ "_id" : "81433", "city" : "SILVERTON", "loc" : [ -107.666686, 37.808995 ], "pop" : 745, "state" : "CO" } +{ "_id" : "81434", "city" : "SOMERSET", "loc" : [ -107.378145, 38.946801 ], "pop" : 180, "state" : "CO" } +{ "_id" : "81435", "city" : "TELLURIDE", "loc" : [ -107.821371, 37.940028 ], "pop" : 1850, "state" : "CO" } +{ "_id" : "81501", "city" : "GRAND JUNCTION", "loc" : [ -108.545692, 39.078326 ], "pop" : 19665, "state" : "CO" } +{ "_id" : "81503", "city" : "GRAND JUNCTION", "loc" : [ -108.575609, 39.056777 ], "pop" : 20467, "state" : "CO" } +{ "_id" : "81504", "city" : "FRUITVALE", "loc" : [ -108.489094, 39.083136 ], "pop" : 16754, "state" : "CO" } +{ "_id" : "81505", "city" : "GRAND JUNCTION", "loc" : [ -108.596834, 39.107097 ], "pop" : 4877, "state" : "CO" } +{ "_id" : "81506", "city" : "GRAND JUNCTION", "loc" : [ -108.54911, 39.103209 ], "pop" : 7471, "state" : "CO" } +{ "_id" : "81520", "city" : "CLIFTON", "loc" : [ -108.449628, 39.0805 ], "pop" : 8408, "state" : "CO" } +{ "_id" : "81521", "city" : "FRUITA", "loc" : [ -108.721757, 39.163656 ], "pop" : 6230, "state" : "CO" } +{ "_id" : "81522", "city" : "GATEWAY", "loc" : [ -108.791344, 38.915136 ], "pop" : 752, "state" : "CO" } +{ "_id" : "81524", "city" : "LOMA", "loc" : [ -108.814902, 39.227896 ], "pop" : 1067, "state" : "CO" } +{ "_id" : "81525", "city" : "MACK", "loc" : [ -108.929597, 39.255367 ], "pop" : 176, "state" : "CO" } +{ "_id" : "81526", "city" : "PALISADE", "loc" : [ -108.367977, 39.103178 ], "pop" : 4366, "state" : "CO" } +{ "_id" : "81527", "city" : "WHITEWATER", "loc" : [ -108.399042, 38.974422 ], "pop" : 664, "state" : "CO" } +{ "_id" : "81601", "city" : "GLENWOOD SPRINGS", "loc" : [ -107.325188, 39.529607 ], "pop" : 9606, "state" : "CO" } +{ "_id" : "81610", "city" : "DINOSAUR", "loc" : [ -108.965184, 40.256609 ], "pop" : 498, "state" : "CO" } +{ "_id" : "81611", "city" : "ASPEN", "loc" : [ -106.823593, 39.195139 ], "pop" : 7431, "state" : "CO" } +{ "_id" : "81621", "city" : "BASALT", "loc" : [ -106.998752, 39.353466 ], "pop" : 3248, "state" : "CO" } +{ "_id" : "81623", "city" : "MARBLE", "loc" : [ -107.171012, 39.385431 ], "pop" : 9406, "state" : "CO" } +{ "_id" : "81624", "city" : "COLLBRAN", "loc" : [ -107.924945, 39.245267 ], "pop" : 1043, "state" : "CO" } +{ "_id" : "81625", "city" : "CRAIG", "loc" : [ -107.561458, 40.522351 ], "pop" : 10242, "state" : "CO" } +{ "_id" : "81630", "city" : "DE BEQUE", "loc" : [ -108.230405, 39.311764 ], "pop" : 464, "state" : "CO" } +{ "_id" : "81631", "city" : "EAGLE", "loc" : [ -106.75884, 39.634138 ], "pop" : 3368, "state" : "CO" } +{ "_id" : "81633", "city" : "ELK SPRINGS", "loc" : [ -108.419729, 40.414588 ], "pop" : 10, "state" : "CO" } +{ "_id" : "81635", "city" : "BATTLEMENT MESA", "loc" : [ -108.038038, 39.440729 ], "pop" : 2602, "state" : "CO" } +{ "_id" : "81637", "city" : "GYPSUM", "loc" : [ -106.967083, 39.661848 ], "pop" : 2593, "state" : "CO" } +{ "_id" : "81638", "city" : "HAMILTON", "loc" : [ -107.584089, 40.32504 ], "pop" : 191, "state" : "CO" } +{ "_id" : "81639", "city" : "HAYDEN", "loc" : [ -107.257055, 40.494487 ], "pop" : 2028, "state" : "CO" } +{ "_id" : "81640", "city" : "MAYBELL", "loc" : [ -108.272264, 40.650649 ], "pop" : 351, "state" : "CO" } +{ "_id" : "81641", "city" : "MEEKER", "loc" : [ -107.892498, 40.038726 ], "pop" : 3094, "state" : "CO" } +{ "_id" : "81642", "city" : "MEREDITH", "loc" : [ -106.67823, 39.335348 ], "pop" : 76, "state" : "CO" } +{ "_id" : "81643", "city" : "MESA", "loc" : [ -108.104401, 39.161161 ], "pop" : 741, "state" : "CO" } +{ "_id" : "81647", "city" : "NEW CASTLE", "loc" : [ -107.542758, 39.570922 ], "pop" : 2719, "state" : "CO" } +{ "_id" : "81648", "city" : "RANGELY", "loc" : [ -108.799148, 40.082844 ], "pop" : 2740, "state" : "CO" } +{ "_id" : "81650", "city" : "RIFLE", "loc" : [ -107.789804, 39.549073 ], "pop" : 7146, "state" : "CO" } +{ "_id" : "81652", "city" : "SILT", "loc" : [ -107.657411, 39.541464 ], "pop" : 2430, "state" : "CO" } +{ "_id" : "81653", "city" : "SLATER", "loc" : [ -107.497178, 40.947985 ], "pop" : 65, "state" : "CO" } +{ "_id" : "81654", "city" : "SNOWMASS", "loc" : [ -106.950839, 39.250059 ], "pop" : 2627, "state" : "CO" } +{ "_id" : "81657", "city" : "VAIL", "loc" : [ -106.463454, 39.623793 ], "pop" : 11449, "state" : "CO" } +{ "_id" : "82001", "city" : "CHEYENNE", "loc" : [ -104.796234, 41.143719 ], "pop" : 33107, "state" : "WY" } +{ "_id" : "82007", "city" : "CHEYENNE", "loc" : [ -104.810745, 41.108433 ], "pop" : 15050, "state" : "WY" } +{ "_id" : "82009", "city" : "CHEYENNE", "loc" : [ -104.802328, 41.183566 ], "pop" : 22028, "state" : "WY" } +{ "_id" : "82050", "city" : "ALBIN", "loc" : [ -104.150542, 41.434237 ], "pop" : 310, "state" : "WY" } +{ "_id" : "82051", "city" : "LARAMIE", "loc" : [ -105.819708, 41.562721 ], "pop" : 22, "state" : "WY" } +{ "_id" : "82052", "city" : "BUFORD", "loc" : [ -105.469697, 41.142115 ], "pop" : 97, "state" : "WY" } +{ "_id" : "82053", "city" : "BURNS", "loc" : [ -104.315521, 41.200297 ], "pop" : 1303, "state" : "WY" } +{ "_id" : "82054", "city" : "CARPENTER", "loc" : [ -104.276514, 41.042819 ], "pop" : 222, "state" : "WY" } +{ "_id" : "82055", "city" : "CENTENNIAL", "loc" : [ -105.99451, 41.339149 ], "pop" : 446, "state" : "WY" } +{ "_id" : "82058", "city" : "GARRETT", "loc" : [ -105.550534, 42.142015 ], "pop" : 120, "state" : "WY" } +{ "_id" : "82063", "city" : "JELM", "loc" : [ -105.925727, 41.145723 ], "pop" : 470, "state" : "WY" } +{ "_id" : "82070", "city" : "LARAMIE", "loc" : [ -105.581146, 41.312907 ], "pop" : 29327, "state" : "WY" } +{ "_id" : "82080", "city" : "MC FADDEN", "loc" : [ -106.137861, 41.6327 ], "pop" : 79, "state" : "WY" } +{ "_id" : "82081", "city" : "MERIDEN", "loc" : [ -104.286606, 41.54236 ], "pop" : 40, "state" : "WY" } +{ "_id" : "82082", "city" : "PINE BLUFFS", "loc" : [ -104.066591, 41.178799 ], "pop" : 1082, "state" : "WY" } +{ "_id" : "82083", "city" : "ROCK RIVER", "loc" : [ -105.974629, 41.746073 ], "pop" : 236, "state" : "WY" } +{ "_id" : "82084", "city" : "TIE SIDING", "loc" : [ -105.446222, 41.052785 ], "pop" : 19, "state" : "WY" } +{ "_id" : "82190", "city" : "FISHING BRIDGE", "loc" : [ -110.674366, 44.853913 ], "pop" : 443, "state" : "WY" } +{ "_id" : "82201", "city" : "WHEATLAND", "loc" : [ -104.967852, 42.049467 ], "pop" : 5952, "state" : "WY" } +{ "_id" : "82210", "city" : "CHUGWATER", "loc" : [ -104.817916, 41.748668 ], "pop" : 295, "state" : "WY" } +{ "_id" : "82212", "city" : "FORT LARAMIE", "loc" : [ -104.522595, 42.213314 ], "pop" : 325, "state" : "WY" } +{ "_id" : "82213", "city" : "GLENDO", "loc" : [ -105.000013, 42.500352 ], "pop" : 471, "state" : "WY" } +{ "_id" : "82214", "city" : "GUERNSEY", "loc" : [ -104.751164, 42.265513 ], "pop" : 1319, "state" : "WY" } +{ "_id" : "82215", "city" : "HARTVILLE", "loc" : [ -104.729564, 42.33339 ], "pop" : 108, "state" : "WY" } +{ "_id" : "82217", "city" : "HAWK SPRINGS", "loc" : [ -104.329498, 41.741481 ], "pop" : 125, "state" : "WY" } +{ "_id" : "82219", "city" : "JAY EM", "loc" : [ -104.311437, 42.357399 ], "pop" : 399, "state" : "WY" } +{ "_id" : "82220", "city" : "KEELINE", "loc" : [ -104.720277, 42.839062 ], "pop" : 209, "state" : "WY" } +{ "_id" : "82221", "city" : "LAGRANGE", "loc" : [ -104.19738, 41.642311 ], "pop" : 413, "state" : "WY" } +{ "_id" : "82222", "city" : "LANCE CREEK", "loc" : [ -104.544958, 43.231636 ], "pop" : 181, "state" : "WY" } +{ "_id" : "82223", "city" : "LINGLE", "loc" : [ -104.331992, 42.134624 ], "pop" : 714, "state" : "WY" } +{ "_id" : "82224", "city" : "LOST SPRINGS", "loc" : [ -104.920901, 42.729835 ], "pop" : 6, "state" : "WY" } +{ "_id" : "82225", "city" : "LUSK", "loc" : [ -104.465076, 42.765953 ], "pop" : 1724, "state" : "WY" } +{ "_id" : "82229", "city" : "SHAWNEE", "loc" : [ -105.032447, 42.839464 ], "pop" : 137, "state" : "WY" } +{ "_id" : "82240", "city" : "TORRINGTON", "loc" : [ -104.191662, 42.062377 ], "pop" : 9575, "state" : "WY" } +{ "_id" : "82242", "city" : "VAN TASSELL", "loc" : [ -104.315073, 42.830004 ], "pop" : 385, "state" : "WY" } +{ "_id" : "82243", "city" : "VETERAN", "loc" : [ -104.370899, 41.982091 ], "pop" : 148, "state" : "WY" } +{ "_id" : "82244", "city" : "YODER", "loc" : [ -104.353507, 41.912018 ], "pop" : 674, "state" : "WY" } +{ "_id" : "82301", "city" : "RAWLINS", "loc" : [ -107.234883, 41.795131 ], "pop" : 9914, "state" : "WY" } +{ "_id" : "82310", "city" : "JEFFREY CITY", "loc" : [ -107.872422, 42.540201 ], "pop" : 253, "state" : "WY" } +{ "_id" : "82321", "city" : "BAGGS", "loc" : [ -107.668733, 41.031191 ], "pop" : 384, "state" : "WY" } +{ "_id" : "82322", "city" : "BAIROIL", "loc" : [ -107.563288, 42.232721 ], "pop" : 236, "state" : "WY" } +{ "_id" : "82323", "city" : "DIXON", "loc" : [ -107.560354, 41.044631 ], "pop" : 253, "state" : "WY" } +{ "_id" : "82325", "city" : "ENCAMPMENT", "loc" : [ -106.780285, 41.205353 ], "pop" : 946, "state" : "WY" } +{ "_id" : "82327", "city" : "HANNA", "loc" : [ -106.528283, 41.87264 ], "pop" : 1585, "state" : "WY" } +{ "_id" : "82329", "city" : "MEDICINE BOW", "loc" : [ -106.201228, 41.903002 ], "pop" : 409, "state" : "WY" } +{ "_id" : "82331", "city" : "RYAN PARK", "loc" : [ -106.797538, 41.446293 ], "pop" : 2462, "state" : "WY" } +{ "_id" : "82332", "city" : "SAVERY", "loc" : [ -107.42338, 41.039485 ], "pop" : 97, "state" : "WY" } +{ "_id" : "82334", "city" : "SINCLAIR", "loc" : [ -107.109083, 41.779741 ], "pop" : 530, "state" : "WY" } +{ "_id" : "82336", "city" : "WAMSUTTER", "loc" : [ -108.151674, 41.658278 ], "pop" : 516, "state" : "WY" } +{ "_id" : "82401", "city" : "WORLAND", "loc" : [ -107.95626, 44.013796 ], "pop" : 7693, "state" : "WY" } +{ "_id" : "82410", "city" : "BASIN", "loc" : [ -108.043787, 44.378765 ], "pop" : 1580, "state" : "WY" } +{ "_id" : "82411", "city" : "BURLINGTON", "loc" : [ -108.432669, 44.444218 ], "pop" : 435, "state" : "WY" } +{ "_id" : "82414", "city" : "CODY", "loc" : [ -109.075611, 44.523135 ], "pop" : 11985, "state" : "WY" } +{ "_id" : "82421", "city" : "DEAVER", "loc" : [ -108.597948, 44.925695 ], "pop" : 499, "state" : "WY" } +{ "_id" : "82426", "city" : "GREYBULL", "loc" : [ -108.079503, 44.491881 ], "pop" : 2460, "state" : "WY" } +{ "_id" : "82428", "city" : "HYATTVILLE", "loc" : [ -107.605318, 44.250693 ], "pop" : 97, "state" : "WY" } +{ "_id" : "82431", "city" : "LOVELL", "loc" : [ -108.414107, 44.833637 ], "pop" : 4322, "state" : "WY" } +{ "_id" : "82432", "city" : "MANDERSON", "loc" : [ -107.953423, 44.311931 ], "pop" : 657, "state" : "WY" } +{ "_id" : "82433", "city" : "MEETEETSE", "loc" : [ -108.950045, 44.196202 ], "pop" : 1010, "state" : "WY" } +{ "_id" : "82434", "city" : "OTTO", "loc" : [ -108.304673, 44.405644 ], "pop" : 120, "state" : "WY" } +{ "_id" : "82435", "city" : "POWELL", "loc" : [ -108.777322, 44.756077 ], "pop" : 9608, "state" : "WY" } +{ "_id" : "82441", "city" : "SHELL", "loc" : [ -107.824333, 44.563649 ], "pop" : 355, "state" : "WY" } +{ "_id" : "82442", "city" : "TEN SLEEP", "loc" : [ -107.415305, 43.997848 ], "pop" : 695, "state" : "WY" } +{ "_id" : "82443", "city" : "GRASS CREEK", "loc" : [ -108.231297, 43.662152 ], "pop" : 4809, "state" : "WY" } +{ "_id" : "82450", "city" : "WAPITI", "loc" : [ -109.432629, 44.47967 ], "pop" : 214, "state" : "WY" } +{ "_id" : "82501", "city" : "GAS HILLS", "loc" : [ -108.411335, 43.045786 ], "pop" : 15471, "state" : "WY" } +{ "_id" : "82510", "city" : "ARAPAHOE", "loc" : [ -108.494134, 42.967936 ], "pop" : 605, "state" : "WY" } +{ "_id" : "82512", "city" : "CROWHEART", "loc" : [ -109.296043, 43.371569 ], "pop" : 157, "state" : "WY" } +{ "_id" : "82513", "city" : "DUBOIS", "loc" : [ -109.649175, 43.545136 ], "pop" : 1493, "state" : "WY" } +{ "_id" : "82514", "city" : "FORT WASHAKIE", "loc" : [ -108.896445, 43.004761 ], "pop" : 1131, "state" : "WY" } +{ "_id" : "82516", "city" : "KINNEAR", "loc" : [ -108.615428, 43.131777 ], "pop" : 420, "state" : "WY" } +{ "_id" : "82520", "city" : "ETHETE", "loc" : [ -108.738288, 42.859678 ], "pop" : 11770, "state" : "WY" } +{ "_id" : "82523", "city" : "PAVILLION", "loc" : [ -108.604394, 43.198515 ], "pop" : 1681, "state" : "WY" } +{ "_id" : "82601", "city" : "CASPER", "loc" : [ -106.316571, 42.845763 ], "pop" : 21224, "state" : "WY" } +{ "_id" : "82604", "city" : "CASPER", "loc" : [ -106.389634, 42.826073 ], "pop" : 24812, "state" : "WY" } +{ "_id" : "82609", "city" : "CASPER", "loc" : [ -106.280649, 42.840629 ], "pop" : 12789, "state" : "WY" } +{ "_id" : "82620", "city" : "ALCOVA", "loc" : [ -106.610199, 42.568383 ], "pop" : 10, "state" : "WY" } +{ "_id" : "82630", "city" : "ARMINTO", "loc" : [ -107.343611, 43.120883 ], "pop" : 14, "state" : "WY" } +{ "_id" : "82633", "city" : "DOUGLAS", "loc" : [ -105.385484, 42.762558 ], "pop" : 7502, "state" : "WY" } +{ "_id" : "82636", "city" : "EVANSVILLE", "loc" : [ -106.263886, 42.861384 ], "pop" : 1621, "state" : "WY" } +{ "_id" : "82637", "city" : "GLENROCK", "loc" : [ -105.857911, 42.867495 ], "pop" : 3483, "state" : "WY" } +{ "_id" : "82639", "city" : "KAYCEE", "loc" : [ -106.56323, 43.723625 ], "pop" : 876, "state" : "WY" } +{ "_id" : "82642", "city" : "LYSITE", "loc" : [ -107.648781, 43.328417 ], "pop" : 81, "state" : "WY" } +{ "_id" : "82643", "city" : "MIDWEST", "loc" : [ -106.266818, 43.410829 ], "pop" : 756, "state" : "WY" } +{ "_id" : "82649", "city" : "SHOSHONI", "loc" : [ -108.100667, 43.245707 ], "pop" : 600, "state" : "WY" } +{ "_id" : "82701", "city" : "NEWCASTLE", "loc" : [ -104.226205, 43.851098 ], "pop" : 4833, "state" : "WY" } +{ "_id" : "82710", "city" : "ALADDIN", "loc" : [ -104.19314, 44.747331 ], "pop" : 230, "state" : "WY" } +{ "_id" : "82712", "city" : "BEULAH", "loc" : [ -104.153095, 44.573575 ], "pop" : 187, "state" : "WY" } +{ "_id" : "82714", "city" : "DEVILS TOWER", "loc" : [ -104.793638, 44.617067 ], "pop" : 119, "state" : "WY" } +{ "_id" : "82715", "city" : "FOUR CORNERS", "loc" : [ -104.122897, 44.100747 ], "pop" : 38, "state" : "WY" } +{ "_id" : "82716", "city" : "GILLETTE", "loc" : [ -105.497442, 44.282009 ], "pop" : 25968, "state" : "WY" } +{ "_id" : "82720", "city" : "HULETT", "loc" : [ -104.617367, 44.735222 ], "pop" : 1054, "state" : "WY" } +{ "_id" : "82721", "city" : "PINE HAVEN", "loc" : [ -104.905904, 44.299932 ], "pop" : 1820, "state" : "WY" } +{ "_id" : "82723", "city" : "OSAGE", "loc" : [ -104.4226, 43.998982 ], "pop" : 292, "state" : "WY" } +{ "_id" : "82724", "city" : "OSHOTO", "loc" : [ -104.937659, 44.583023 ], "pop" : 57, "state" : "WY" } +{ "_id" : "82725", "city" : "RECLUSE", "loc" : [ -105.776005, 44.786149 ], "pop" : 183, "state" : "WY" } +{ "_id" : "82727", "city" : "ROZET", "loc" : [ -105.245875, 44.305825 ], "pop" : 900, "state" : "WY" } +{ "_id" : "82729", "city" : "SUNDANCE", "loc" : [ -104.383696, 44.405755 ], "pop" : 1827, "state" : "WY" } +{ "_id" : "82730", "city" : "UPTON", "loc" : [ -104.635159, 44.089271 ], "pop" : 1355, "state" : "WY" } +{ "_id" : "82731", "city" : "GILLETTE", "loc" : [ -105.373236, 44.835689 ], "pop" : 187, "state" : "WY" } +{ "_id" : "82732", "city" : "WRIGHT", "loc" : [ -105.532327, 43.829349 ], "pop" : 2132, "state" : "WY" } +{ "_id" : "82801", "city" : "SHERIDAN", "loc" : [ -106.964795, 44.78486 ], "pop" : 20025, "state" : "WY" } +{ "_id" : "82831", "city" : "ARVADA", "loc" : [ -106.109191, 44.689876 ], "pop" : 107, "state" : "WY" } +{ "_id" : "82832", "city" : "BANNER", "loc" : [ -106.87331, 44.590804 ], "pop" : 983, "state" : "WY" } +{ "_id" : "82834", "city" : "BUFFALO", "loc" : [ -106.70726, 44.34847 ], "pop" : 5269, "state" : "WY" } +{ "_id" : "82835", "city" : "CLEARMONT", "loc" : [ -106.458071, 44.66101 ], "pop" : 350, "state" : "WY" } +{ "_id" : "82836", "city" : "DAYTON", "loc" : [ -107.302605, 44.877958 ], "pop" : 986, "state" : "WY" } +{ "_id" : "82838", "city" : "PARKMAN", "loc" : [ -107.325393, 44.964965 ], "pop" : 148, "state" : "WY" } +{ "_id" : "82839", "city" : "ACME", "loc" : [ -107.159833, 44.904789 ], "pop" : 868, "state" : "WY" } +{ "_id" : "82842", "city" : "STORY", "loc" : [ -107.049229, 44.607169 ], "pop" : 63, "state" : "WY" } +{ "_id" : "82844", "city" : "RANCHESTER", "loc" : [ -107.303429, 44.768228 ], "pop" : 32, "state" : "WY" } +{ "_id" : "82901", "city" : "ROCK SPRINGS", "loc" : [ -109.230047, 41.605957 ], "pop" : 23927, "state" : "WY" } +{ "_id" : "82922", "city" : "BONDURANT", "loc" : [ -110.335287, 43.223798 ], "pop" : 116, "state" : "WY" } +{ "_id" : "82923", "city" : "BOULDER", "loc" : [ -109.540105, 42.688146 ], "pop" : 112, "state" : "WY" } +{ "_id" : "82925", "city" : "CORA", "loc" : [ -109.915351, 43.139921 ], "pop" : 30, "state" : "WY" } +{ "_id" : "82930", "city" : "EVANSTON", "loc" : [ -110.963067, 41.260947 ], "pop" : 12577, "state" : "WY" } +{ "_id" : "82933", "city" : "FORT BRIDGER", "loc" : [ -110.347428, 41.28282 ], "pop" : 3777, "state" : "WY" } +{ "_id" : "82935", "city" : "GREEN RIVER", "loc" : [ -109.471445, 41.51959 ], "pop" : 13956, "state" : "WY" } +{ "_id" : "82936", "city" : "LONETREE", "loc" : [ -110.172862, 41.049144 ], "pop" : 24, "state" : "WY" } +{ "_id" : "82937", "city" : "LYMAN", "loc" : [ -110.292629, 41.329136 ], "pop" : 2327, "state" : "WY" } +{ "_id" : "82938", "city" : "MC KINNON", "loc" : [ -109.874536, 41.040898 ], "pop" : 188, "state" : "WY" } +{ "_id" : "82941", "city" : "PINEDALE", "loc" : [ -109.856088, 42.854331 ], "pop" : 2326, "state" : "WY" } +{ "_id" : "83001", "city" : "COLTER BAY", "loc" : [ -110.766277, 43.460734 ], "pop" : 9078, "state" : "WY" } +{ "_id" : "83011", "city" : "KELLY", "loc" : [ -110.544186, 43.609361 ], "pop" : 203, "state" : "WY" } +{ "_id" : "83012", "city" : "MOOSE", "loc" : [ -110.857493, 43.771201 ], "pop" : 519, "state" : "WY" } +{ "_id" : "83013", "city" : "MORAN", "loc" : [ -110.329429, 43.881635 ], "pop" : 191, "state" : "WY" } +{ "_id" : "83014", "city" : "WILSON", "loc" : [ -110.874199, 43.49922 ], "pop" : 1099, "state" : "WY" } +{ "_id" : "83101", "city" : "KEMMERER", "loc" : [ -110.52834, 41.788661 ], "pop" : 4258, "state" : "WY" } +{ "_id" : "83110", "city" : "AFTON", "loc" : [ -110.941976, 42.712829 ], "pop" : 3201, "state" : "WY" } +{ "_id" : "83111", "city" : "AUBURN", "loc" : [ -110.994415, 42.805114 ], "pop" : 488, "state" : "WY" } +{ "_id" : "83112", "city" : "BEDFORD", "loc" : [ -110.95556, 42.932336 ], "pop" : 1177, "state" : "WY" } +{ "_id" : "83113", "city" : "MARBLETON", "loc" : [ -110.132954, 42.552059 ], "pop" : 1861, "state" : "WY" } +{ "_id" : "83114", "city" : "COKEVILLE", "loc" : [ -110.916419, 42.057983 ], "pop" : 905, "state" : "WY" } +{ "_id" : "83115", "city" : "DANIEL", "loc" : [ -110.133624, 42.917629 ], "pop" : 398, "state" : "WY" } +{ "_id" : "83118", "city" : "ETNA", "loc" : [ -111.015996, 43.138606 ], "pop" : 524, "state" : "WY" } +{ "_id" : "83120", "city" : "FREEDOM", "loc" : [ -111.029178, 43.017167 ], "pop" : 212, "state" : "WY" } +{ "_id" : "83122", "city" : "GROVER", "loc" : [ -110.924392, 42.796472 ], "pop" : 335, "state" : "WY" } +{ "_id" : "83123", "city" : "LA BARGE", "loc" : [ -110.210865, 42.24734 ], "pop" : 606, "state" : "WY" } +{ "_id" : "83126", "city" : "SMOOT", "loc" : [ -110.922351, 42.619238 ], "pop" : 414, "state" : "WY" } +{ "_id" : "83127", "city" : "THAYNE", "loc" : [ -111.011354, 42.933026 ], "pop" : 505, "state" : "WY" } +{ "_id" : "83201", "city" : "POCATELLO", "loc" : [ -112.438142, 42.887592 ], "pop" : 33282, "state" : "ID" } +{ "_id" : "83202", "city" : "CHUBBUCK", "loc" : [ -112.474873, 42.926548 ], "pop" : 11385, "state" : "ID" } +{ "_id" : "83203", "city" : "FORT HALL", "loc" : [ -112.459854, 42.988717 ], "pop" : 1566, "state" : "ID" } +{ "_id" : "83204", "city" : "POCATELLO", "loc" : [ -112.443352, 42.846463 ], "pop" : 15605, "state" : "ID" } +{ "_id" : "83210", "city" : "STERLING", "loc" : [ -112.818124, 42.976717 ], "pop" : 2653, "state" : "ID" } +{ "_id" : "83211", "city" : "AMERICAN FALLS", "loc" : [ -112.870714, 42.789876 ], "pop" : 5867, "state" : "ID" } +{ "_id" : "83212", "city" : "ARBON", "loc" : [ -112.558481, 42.502634 ], "pop" : 121, "state" : "ID" } +{ "_id" : "83213", "city" : "ARCO", "loc" : [ -113.317559, 43.635521 ], "pop" : 1823, "state" : "ID" } +{ "_id" : "83214", "city" : "ARIMO", "loc" : [ -112.174649, 42.559953 ], "pop" : 333, "state" : "ID" } +{ "_id" : "83217", "city" : "BANCROFT", "loc" : [ -111.842944, 42.720463 ], "pop" : 988, "state" : "ID" } +{ "_id" : "83220", "city" : "BERN", "loc" : [ -111.392595, 42.319144 ], "pop" : 261, "state" : "ID" } +{ "_id" : "83221", "city" : "BLACKFOOT", "loc" : [ -112.361545, 43.194327 ], "pop" : 18202, "state" : "ID" } +{ "_id" : "83226", "city" : "CHALLIS", "loc" : [ -114.19463, 44.496912 ], "pop" : 2426, "state" : "ID" } +{ "_id" : "83227", "city" : "CLAYTON", "loc" : [ -114.410189, 44.273289 ], "pop" : 41, "state" : "ID" } +{ "_id" : "83228", "city" : "CLIFTON", "loc" : [ -111.995737, 42.215972 ], "pop" : 538, "state" : "ID" } +{ "_id" : "83230", "city" : "CONDA", "loc" : [ -111.54023, 42.717126 ], "pop" : 21, "state" : "ID" } +{ "_id" : "83231", "city" : "DARLINGTON", "loc" : [ -113.380284, 43.7715 ], "pop" : 12, "state" : "ID" } +{ "_id" : "83232", "city" : "DAYTON", "loc" : [ -111.985836, 42.11836 ], "pop" : 659, "state" : "ID" } +{ "_id" : "83234", "city" : "DOWNEY", "loc" : [ -112.109019, 42.418127 ], "pop" : 939, "state" : "ID" } +{ "_id" : "83235", "city" : "ELLIS", "loc" : [ -114.001594, 44.878829 ], "pop" : 192, "state" : "ID" } +{ "_id" : "83236", "city" : "FIRTH", "loc" : [ -112.158819, 43.302066 ], "pop" : 2878, "state" : "ID" } +{ "_id" : "83237", "city" : "FRANKLIN", "loc" : [ -111.822862, 42.030389 ], "pop" : 1699, "state" : "ID" } +{ "_id" : "83238", "city" : "GENEVA", "loc" : [ -111.072185, 42.313585 ], "pop" : 125, "state" : "ID" } +{ "_id" : "83241", "city" : "GRACE", "loc" : [ -111.739981, 42.549978 ], "pop" : 2050, "state" : "ID" } +{ "_id" : "83243", "city" : "HOLBROOK", "loc" : [ -112.693404, 42.222148 ], "pop" : 213, "state" : "ID" } +{ "_id" : "83245", "city" : "INKOM", "loc" : [ -112.246474, 42.796379 ], "pop" : 823, "state" : "ID" } +{ "_id" : "83246", "city" : "LAVA HOT SPRINGS", "loc" : [ -112.017644, 42.618474 ], "pop" : 512, "state" : "ID" } +{ "_id" : "83250", "city" : "MC CAMMON", "loc" : [ -112.175758, 42.63362 ], "pop" : 2603, "state" : "ID" } +{ "_id" : "83251", "city" : "MACKAY", "loc" : [ -113.611984, 43.91106 ], "pop" : 1207, "state" : "ID" } +{ "_id" : "83252", "city" : "MALAD CITY", "loc" : [ -112.262045, 42.180783 ], "pop" : 3110, "state" : "ID" } +{ "_id" : "83253", "city" : "PATTERSON", "loc" : [ -113.916039, 44.701745 ], "pop" : 210, "state" : "ID" } +{ "_id" : "83254", "city" : "MONTPELIER", "loc" : [ -111.31946, 42.35199 ], "pop" : 4292, "state" : "ID" } +{ "_id" : "83255", "city" : "MOORE", "loc" : [ -113.260349, 43.782094 ], "pop" : 1083, "state" : "ID" } +{ "_id" : "83260", "city" : "OVID", "loc" : [ -111.451109, 42.311423 ], "pop" : 290, "state" : "ID" } +{ "_id" : "83261", "city" : "PARIS", "loc" : [ -111.402938, 42.207065 ], "pop" : 852, "state" : "ID" } +{ "_id" : "83262", "city" : "PINGREE", "loc" : [ -112.449035, 43.195618 ], "pop" : 7340, "state" : "ID" } +{ "_id" : "83263", "city" : "PRESTON", "loc" : [ -111.856516, 42.110917 ], "pop" : 5402, "state" : "ID" } +{ "_id" : "83271", "city" : "ROCKLAND", "loc" : [ -112.853982, 42.555582 ], "pop" : 478, "state" : "ID" } +{ "_id" : "83272", "city" : "SAINT CHARLES", "loc" : [ -111.389744, 42.112812 ], "pop" : 199, "state" : "ID" } +{ "_id" : "83274", "city" : "SHELLEY", "loc" : [ -112.107549, 43.376901 ], "pop" : 6164, "state" : "ID" } +{ "_id" : "83276", "city" : "SODA SPRINGS", "loc" : [ -111.569896, 42.671819 ], "pop" : 3871, "state" : "ID" } +{ "_id" : "83278", "city" : "STANLEY", "loc" : [ -114.725414, 44.22908 ], "pop" : 444, "state" : "ID" } +{ "_id" : "83280", "city" : "STONE", "loc" : [ -112.711473, 42.038983 ], "pop" : 169, "state" : "ID" } +{ "_id" : "83283", "city" : "THATCHER", "loc" : [ -111.78899, 42.331959 ], "pop" : 207, "state" : "ID" } +{ "_id" : "83285", "city" : "WAYAN", "loc" : [ -111.254056, 43.02691 ], "pop" : 117, "state" : "ID" } +{ "_id" : "83286", "city" : "WESTON", "loc" : [ -111.97154, 42.044621 ], "pop" : 727, "state" : "ID" } +{ "_id" : "83287", "city" : "FISH HAVEN", "loc" : [ -111.463323, 42.045926 ], "pop" : 65, "state" : "ID" } +{ "_id" : "83301", "city" : "TWIN FALLS", "loc" : [ -114.469265, 42.556495 ], "pop" : 34539, "state" : "ID" } +{ "_id" : "83302", "city" : "ROGERSON", "loc" : [ -114.603794, 42.219567 ], "pop" : 92, "state" : "ID" } +{ "_id" : "83313", "city" : "BELLEVUE", "loc" : [ -114.249804, 43.439694 ], "pop" : 2150, "state" : "ID" } +{ "_id" : "83314", "city" : "BLISS", "loc" : [ -114.910387, 42.944859 ], "pop" : 845, "state" : "ID" } +{ "_id" : "83316", "city" : "BUHL", "loc" : [ -114.782545, 42.600763 ], "pop" : 8014, "state" : "ID" } +{ "_id" : "83318", "city" : "BURLEY", "loc" : [ -113.793081, 42.524442 ], "pop" : 12406, "state" : "ID" } +{ "_id" : "83320", "city" : "CAREY", "loc" : [ -113.892567, 43.274443 ], "pop" : 820, "state" : "ID" } +{ "_id" : "83321", "city" : "CASTLEFORD", "loc" : [ -114.873433, 42.521015 ], "pop" : 365, "state" : "ID" } +{ "_id" : "83322", "city" : "CORRAL", "loc" : [ -115.00871, 43.307127 ], "pop" : 59, "state" : "ID" } +{ "_id" : "83323", "city" : "DECLO", "loc" : [ -113.644794, 42.524005 ], "pop" : 2592, "state" : "ID" } +{ "_id" : "83324", "city" : "DIETRICH", "loc" : [ -114.266408, 42.91254 ], "pop" : 178, "state" : "ID" } +{ "_id" : "83325", "city" : "EDEN", "loc" : [ -114.162762, 42.580374 ], "pop" : 1762, "state" : "ID" } +{ "_id" : "83326", "city" : "ELBA", "loc" : [ -113.663559, 42.180865 ], "pop" : 163, "state" : "ID" } +{ "_id" : "83327", "city" : "FAIRFIELD", "loc" : [ -114.790845, 43.367504 ], "pop" : 668, "state" : "ID" } +{ "_id" : "83328", "city" : "FILER", "loc" : [ -114.614047, 42.565269 ], "pop" : 4176, "state" : "ID" } +{ "_id" : "83330", "city" : "GOODING", "loc" : [ -114.711966, 42.937345 ], "pop" : 4846, "state" : "ID" } +{ "_id" : "83332", "city" : "HAGERMAN", "loc" : [ -114.88697, 42.814205 ], "pop" : 1613, "state" : "ID" } +{ "_id" : "83333", "city" : "HAILEY", "loc" : [ -114.306398, 43.523861 ], "pop" : 4683, "state" : "ID" } +{ "_id" : "83334", "city" : "HANSEN", "loc" : [ -114.299364, 42.524895 ], "pop" : 1525, "state" : "ID" } +{ "_id" : "83335", "city" : "HAZELTON", "loc" : [ -114.134984, 42.595462 ], "pop" : 705, "state" : "ID" } +{ "_id" : "83336", "city" : "HEYBURN", "loc" : [ -113.770885, 42.559922 ], "pop" : 4757, "state" : "ID" } +{ "_id" : "83338", "city" : "JEROME", "loc" : [ -114.501244, 42.71784 ], "pop" : 12671, "state" : "ID" } +{ "_id" : "83340", "city" : "OBSIDIAN", "loc" : [ -114.373664, 43.675459 ], "pop" : 5823, "state" : "ID" } +{ "_id" : "83341", "city" : "KIMBERLY", "loc" : [ -114.365725, 42.528656 ], "pop" : 3779, "state" : "ID" } +{ "_id" : "83342", "city" : "NAF", "loc" : [ -113.448656, 42.364652 ], "pop" : 2315, "state" : "ID" } +{ "_id" : "83343", "city" : "MINIDOKA", "loc" : [ -113.620033, 42.759784 ], "pop" : 1379, "state" : "ID" } +{ "_id" : "83344", "city" : "MURTAUGH", "loc" : [ -114.160641, 42.477597 ], "pop" : 1019, "state" : "ID" } +{ "_id" : "83346", "city" : "OAKLEY", "loc" : [ -113.906945, 42.347561 ], "pop" : 2056, "state" : "ID" } +{ "_id" : "83347", "city" : "PAUL", "loc" : [ -113.797125, 42.623999 ], "pop" : 3464, "state" : "ID" } +{ "_id" : "83348", "city" : "PICABO", "loc" : [ -114.086065, 43.310149 ], "pop" : 76, "state" : "ID" } +{ "_id" : "83349", "city" : "RICHFIELD", "loc" : [ -114.15079, 43.058839 ], "pop" : 789, "state" : "ID" } +{ "_id" : "83350", "city" : "ACEQUIA", "loc" : [ -113.66699, 42.621467 ], "pop" : 9761, "state" : "ID" } +{ "_id" : "83352", "city" : "SHOSHONE", "loc" : [ -114.382176, 42.947353 ], "pop" : 2341, "state" : "ID" } +{ "_id" : "83355", "city" : "WENDELL", "loc" : [ -114.715391, 42.757868 ], "pop" : 4400, "state" : "ID" } +{ "_id" : "83401", "city" : "AMMON", "loc" : [ -111.990626, 43.517679 ], "pop" : 27974, "state" : "ID" } +{ "_id" : "83402", "city" : "IDAHO FALLS", "loc" : [ -112.057762, 43.493373 ], "pop" : 20716, "state" : "ID" } +{ "_id" : "83404", "city" : "IDAHO FALLS", "loc" : [ -112.012449, 43.475043 ], "pop" : 14962, "state" : "ID" } +{ "_id" : "83406", "city" : "IDAHO FALLS", "loc" : [ -111.966052, 43.473233 ], "pop" : 5935, "state" : "ID" } +{ "_id" : "83420", "city" : "ASHTON", "loc" : [ -111.619526, 43.988078 ], "pop" : 8639, "state" : "ID" } +{ "_id" : "83422", "city" : "DRIGGS", "loc" : [ -111.119896, 43.726291 ], "pop" : 1495, "state" : "ID" } +{ "_id" : "83423", "city" : "DUBOIS", "loc" : [ -112.325852, 44.185769 ], "pop" : 650, "state" : "ID" } +{ "_id" : "83424", "city" : "FELT", "loc" : [ -111.189496, 43.872407 ], "pop" : 40, "state" : "ID" } +{ "_id" : "83425", "city" : "HAMER", "loc" : [ -112.187189, 43.930751 ], "pop" : 396, "state" : "ID" } +{ "_id" : "83427", "city" : "IONA", "loc" : [ -111.928356, 43.525946 ], "pop" : 1491, "state" : "ID" } +{ "_id" : "83429", "city" : "ISLAND PARK", "loc" : [ -111.367914, 44.446606 ], "pop" : 35, "state" : "ID" } +{ "_id" : "83431", "city" : "LEWISVILLE", "loc" : [ -112.018884, 43.672476 ], "pop" : 1565, "state" : "ID" } +{ "_id" : "83434", "city" : "MENAN", "loc" : [ -111.983702, 43.726576 ], "pop" : 1789, "state" : "ID" } +{ "_id" : "83435", "city" : "MONTEVIEW", "loc" : [ -112.578321, 43.986242 ], "pop" : 441, "state" : "ID" } +{ "_id" : "83436", "city" : "NEWDALE", "loc" : [ -111.604192, 43.888078 ], "pop" : 430, "state" : "ID" } +{ "_id" : "83440", "city" : "REXBURG", "loc" : [ -111.789022, 43.809968 ], "pop" : 19157, "state" : "ID" } +{ "_id" : "83442", "city" : "RIGBY", "loc" : [ -111.900481, 43.671462 ], "pop" : 8178, "state" : "ID" } +{ "_id" : "83443", "city" : "RIRIE", "loc" : [ -111.760692, 43.631961 ], "pop" : 1749, "state" : "ID" } +{ "_id" : "83444", "city" : "ROBERTS", "loc" : [ -112.119591, 43.7116 ], "pop" : 1436, "state" : "ID" } +{ "_id" : "83445", "city" : "SAINT ANTHONY", "loc" : [ -111.523156, 44.274499 ], "pop" : 747, "state" : "ID" } +{ "_id" : "83446", "city" : "SPENCER", "loc" : [ -112.098821, 44.281444 ], "pop" : 112, "state" : "ID" } +{ "_id" : "83448", "city" : "SUGAR CITY", "loc" : [ -111.79004, 43.866852 ], "pop" : 4517, "state" : "ID" } +{ "_id" : "83449", "city" : "SWAN VALLEY", "loc" : [ -111.279358, 43.405826 ], "pop" : 441, "state" : "ID" } +{ "_id" : "83450", "city" : "TERRETON", "loc" : [ -112.420041, 43.858635 ], "pop" : 1537, "state" : "ID" } +{ "_id" : "83451", "city" : "TETON", "loc" : [ -111.668145, 43.898751 ], "pop" : 1086, "state" : "ID" } +{ "_id" : "83452", "city" : "TETONIA", "loc" : [ -111.186997, 43.843713 ], "pop" : 820, "state" : "ID" } +{ "_id" : "83455", "city" : "VICTOR", "loc" : [ -111.125934, 43.614827 ], "pop" : 1084, "state" : "ID" } +{ "_id" : "83462", "city" : "CARMEN", "loc" : [ -113.857267, 45.255016 ], "pop" : 195, "state" : "ID" } +{ "_id" : "83463", "city" : "GIBBONSVILLE", "loc" : [ -113.956466, 45.484608 ], "pop" : 230, "state" : "ID" } +{ "_id" : "83464", "city" : "LEADORE", "loc" : [ -113.492586, 44.738909 ], "pop" : 594, "state" : "ID" } +{ "_id" : "83466", "city" : "NORTH FORK", "loc" : [ -113.857287, 45.377605 ], "pop" : 267, "state" : "ID" } +{ "_id" : "83467", "city" : "SALMON", "loc" : [ -113.878356, 45.157142 ], "pop" : 5159, "state" : "ID" } +{ "_id" : "83469", "city" : "SHOUP", "loc" : [ -114.405987, 45.18514 ], "pop" : 67, "state" : "ID" } +{ "_id" : "83501", "city" : "SOUTH GATE PLAZA", "loc" : [ -116.987714, 46.389457 ], "pop" : 29650, "state" : "ID" } +{ "_id" : "83520", "city" : "AHSAHKA", "loc" : [ -116.371537, 46.510318 ], "pop" : 335, "state" : "ID" } +{ "_id" : "83522", "city" : "COTTONWOOD", "loc" : [ -116.373306, 46.044789 ], "pop" : 1791, "state" : "ID" } +{ "_id" : "83523", "city" : "CRAIGMONT", "loc" : [ -116.467655, 46.245292 ], "pop" : 820, "state" : "ID" } +{ "_id" : "83524", "city" : "CULDESAC", "loc" : [ -116.653579, 46.378012 ], "pop" : 1161, "state" : "ID" } +{ "_id" : "83525", "city" : "DIXIE", "loc" : [ -115.359158, 45.888897 ], "pop" : 755, "state" : "ID" } +{ "_id" : "83526", "city" : "FERDINAND", "loc" : [ -116.39817, 46.134877 ], "pop" : 323, "state" : "ID" } +{ "_id" : "83530", "city" : "GRANGEVILLE", "loc" : [ -116.107639, 45.927239 ], "pop" : 4791, "state" : "ID" } +{ "_id" : "83533", "city" : "GREENCREEK", "loc" : [ -116.27239, 46.115523 ], "pop" : 269, "state" : "ID" } +{ "_id" : "83535", "city" : "JULIAETTA", "loc" : [ -116.718849, 46.575376 ], "pop" : 1014, "state" : "ID" } +{ "_id" : "83536", "city" : "KAMIAH", "loc" : [ -116.034742, 46.21856 ], "pop" : 2970, "state" : "ID" } +{ "_id" : "83537", "city" : "KENDRICK", "loc" : [ -116.604895, 46.628628 ], "pop" : 970, "state" : "ID" } +{ "_id" : "83538", "city" : "KEUTERVILLE", "loc" : [ -116.535583, 45.929443 ], "pop" : 0, "state" : "ID" } +{ "_id" : "83539", "city" : "CLEARWATER", "loc" : [ -115.92396, 46.125859 ], "pop" : 2704, "state" : "ID" } +{ "_id" : "83540", "city" : "LAPWAI", "loc" : [ -116.790225, 46.412403 ], "pop" : 1784, "state" : "ID" } +{ "_id" : "83541", "city" : "LENORE", "loc" : [ -116.513015, 46.535408 ], "pop" : 473, "state" : "ID" } +{ "_id" : "83542", "city" : "LUCILE", "loc" : [ -116.266899, 45.556963 ], "pop" : 216, "state" : "ID" } +{ "_id" : "83543", "city" : "NEZPERCE", "loc" : [ -116.239281, 46.247533 ], "pop" : 650, "state" : "ID" } +{ "_id" : "83544", "city" : "OROFINO", "loc" : [ -116.240417, 46.495197 ], "pop" : 5738, "state" : "ID" } +{ "_id" : "83545", "city" : "PECK", "loc" : [ -116.411394, 46.480661 ], "pop" : 295, "state" : "ID" } +{ "_id" : "83546", "city" : "PIERCE", "loc" : [ -115.807071, 46.492424 ], "pop" : 900, "state" : "ID" } +{ "_id" : "83547", "city" : "POLLOCK", "loc" : [ -116.351742, 45.306754 ], "pop" : 274, "state" : "ID" } +{ "_id" : "83548", "city" : "REUBENS", "loc" : [ -116.533334, 46.336112 ], "pop" : 121, "state" : "ID" } +{ "_id" : "83549", "city" : "RIGGINS", "loc" : [ -116.300553, 45.397006 ], "pop" : 818, "state" : "ID" } +{ "_id" : "83553", "city" : "WEIPPE", "loc" : [ -115.938593, 46.38069 ], "pop" : 1193, "state" : "ID" } +{ "_id" : "83554", "city" : "WHITE BIRD", "loc" : [ -116.2889, 45.752096 ], "pop" : 393, "state" : "ID" } +{ "_id" : "83555", "city" : "WINCHESTER", "loc" : [ -116.620382, 46.238334 ], "pop" : 380, "state" : "ID" } +{ "_id" : "83601", "city" : "ATLANTA", "loc" : [ -115.357042, 43.567436 ], "pop" : 208, "state" : "ID" } +{ "_id" : "83602", "city" : "BANKS", "loc" : [ -115.983737, 44.149152 ], "pop" : 494, "state" : "ID" } +{ "_id" : "83604", "city" : "GRASMERE", "loc" : [ -115.677259, 42.76006 ], "pop" : 609, "state" : "ID" } +{ "_id" : "83605", "city" : "CALDWELL", "loc" : [ -116.700038, 43.662719 ], "pop" : 32407, "state" : "ID" } +{ "_id" : "83610", "city" : "CAMBRIDGE", "loc" : [ -116.675717, 44.59216 ], "pop" : 962, "state" : "ID" } +{ "_id" : "83611", "city" : "WEST MOUNTAIN", "loc" : [ -116.027676, 44.493273 ], "pop" : 1681, "state" : "ID" } +{ "_id" : "83612", "city" : "COUNCIL", "loc" : [ -116.451833, 44.762754 ], "pop" : 1606, "state" : "ID" } +{ "_id" : "83615", "city" : "DONNELLY", "loc" : [ -116.08578, 44.74937 ], "pop" : 681, "state" : "ID" } +{ "_id" : "83616", "city" : "EAGLE", "loc" : [ -116.361966, 43.706879 ], "pop" : 6874, "state" : "ID" } +{ "_id" : "83617", "city" : "MONTOUR", "loc" : [ -116.511459, 43.879152 ], "pop" : 11189, "state" : "ID" } +{ "_id" : "83619", "city" : "FRUITLAND", "loc" : [ -116.914259, 44.002658 ], "pop" : 4611, "state" : "ID" } +{ "_id" : "83622", "city" : "GARDEN VALLEY", "loc" : [ -115.824311, 44.090932 ], "pop" : 513, "state" : "ID" } +{ "_id" : "83623", "city" : "GLENNS FERRY", "loc" : [ -115.315973, 42.962202 ], "pop" : 2040, "state" : "ID" } +{ "_id" : "83624", "city" : "GRAND VIEW", "loc" : [ -116.08187, 42.810101 ], "pop" : 1449, "state" : "ID" } +{ "_id" : "83627", "city" : "HAMMETT", "loc" : [ -115.565839, 42.981755 ], "pop" : 73, "state" : "ID" } +{ "_id" : "83628", "city" : "HOMEDALE", "loc" : [ -116.947228, 43.613844 ], "pop" : 3079, "state" : "ID" } +{ "_id" : "83629", "city" : "HORSESHOE BEND", "loc" : [ -116.180898, 43.922882 ], "pop" : 1111, "state" : "ID" } +{ "_id" : "83631", "city" : "IDAHO CITY", "loc" : [ -115.918436, 43.758601 ], "pop" : 1324, "state" : "ID" } +{ "_id" : "83632", "city" : "INDIAN VALLEY", "loc" : [ -116.442969, 44.549134 ], "pop" : 188, "state" : "ID" } +{ "_id" : "83633", "city" : "KING HILL", "loc" : [ -115.269098, 42.936104 ], "pop" : 357, "state" : "ID" } +{ "_id" : "83634", "city" : "KUNA", "loc" : [ -116.381859, 43.487034 ], "pop" : 8141, "state" : "ID" } +{ "_id" : "83636", "city" : "LETHA", "loc" : [ -116.585004, 43.840306 ], "pop" : 29, "state" : "ID" } +{ "_id" : "83637", "city" : "LOWMAN", "loc" : [ -115.528488, 44.110616 ], "pop" : 63, "state" : "ID" } +{ "_id" : "83638", "city" : "MC CALL", "loc" : [ -116.078873, 44.891784 ], "pop" : 3681, "state" : "ID" } +{ "_id" : "83639", "city" : "MARSING", "loc" : [ -116.823968, 43.539866 ], "pop" : 2281, "state" : "ID" } +{ "_id" : "83641", "city" : "MELBA", "loc" : [ -116.548875, 43.37842 ], "pop" : 1116, "state" : "ID" } +{ "_id" : "83642", "city" : "MERIDIAN", "loc" : [ -116.397538, 43.614963 ], "pop" : 19033, "state" : "ID" } +{ "_id" : "83643", "city" : "MESA", "loc" : [ -116.42113, 44.657747 ], "pop" : 279, "state" : "ID" } +{ "_id" : "83644", "city" : "MIDDLETON", "loc" : [ -116.61122, 43.719052 ], "pop" : 3898, "state" : "ID" } +{ "_id" : "83645", "city" : "MIDVALE", "loc" : [ -116.703838, 44.441979 ], "pop" : 621, "state" : "ID" } +{ "_id" : "83647", "city" : "MOUNTAIN HOME", "loc" : [ -115.696334, 43.139223 ], "pop" : 12235, "state" : "ID" } +{ "_id" : "83648", "city" : "MOUNTAIN HOME A", "loc" : [ -115.873609, 43.049315 ], "pop" : 6304, "state" : "ID" } +{ "_id" : "83650", "city" : "OREANA", "loc" : [ -116.605379, 43.207296 ], "pop" : 1156, "state" : "ID" } +{ "_id" : "83651", "city" : "NAMPA", "loc" : [ -116.584818, 43.58342 ], "pop" : 16068, "state" : "ID" } +{ "_id" : "83654", "city" : "NEW MEADOWS", "loc" : [ -116.287438, 44.993969 ], "pop" : 1179, "state" : "ID" } +{ "_id" : "83655", "city" : "NEW PLYMOUTH", "loc" : [ -116.804818, 43.959021 ], "pop" : 3165, "state" : "ID" } +{ "_id" : "83657", "city" : "OLA", "loc" : [ -116.290915, 44.235026 ], "pop" : 159, "state" : "ID" } +{ "_id" : "83660", "city" : "PARMA", "loc" : [ -116.940066, 43.789576 ], "pop" : 4477, "state" : "ID" } +{ "_id" : "83661", "city" : "PAYETTE", "loc" : [ -116.920277, 44.07818 ], "pop" : 7913, "state" : "ID" } +{ "_id" : "83669", "city" : "STAR", "loc" : [ -116.496735, 43.701296 ], "pop" : 1579, "state" : "ID" } +{ "_id" : "83670", "city" : "SWEET", "loc" : [ -116.323215, 43.99475 ], "pop" : 344, "state" : "ID" } +{ "_id" : "83672", "city" : "WEISER", "loc" : [ -116.96507, 44.25222 ], "pop" : 6967, "state" : "ID" } +{ "_id" : "83676", "city" : "WILDER", "loc" : [ -116.912199, 43.657851 ], "pop" : 3042, "state" : "ID" } +{ "_id" : "83677", "city" : "YELLOW PINE", "loc" : [ -115.49634, 44.969809 ], "pop" : 68, "state" : "ID" } +{ "_id" : "83686", "city" : "NAMPA", "loc" : [ -116.565962, 43.544125 ], "pop" : 17886, "state" : "ID" } +{ "_id" : "83687", "city" : "NAMPA", "loc" : [ -116.536024, 43.593657 ], "pop" : 10589, "state" : "ID" } +{ "_id" : "83702", "city" : "BOISE", "loc" : [ -116.205192, 43.632237 ], "pop" : 19423, "state" : "ID" } +{ "_id" : "83703", "city" : "BOISE", "loc" : [ -116.252396, 43.660051 ], "pop" : 17005, "state" : "ID" } +{ "_id" : "83704", "city" : "BOISE", "loc" : [ -116.295099, 43.633001 ], "pop" : 40912, "state" : "ID" } +{ "_id" : "83705", "city" : "BOISE", "loc" : [ -116.219104, 43.585077 ], "pop" : 25402, "state" : "ID" } +{ "_id" : "83706", "city" : "BOISE", "loc" : [ -116.191006, 43.588495 ], "pop" : 24826, "state" : "ID" } +{ "_id" : "83709", "city" : "BOISE", "loc" : [ -116.29407, 43.574085 ], "pop" : 30382, "state" : "ID" } +{ "_id" : "83712", "city" : "BOISE", "loc" : [ -116.164924, 43.602311 ], "pop" : 7572, "state" : "ID" } +{ "_id" : "83714", "city" : "GARDEN CITY", "loc" : [ -116.265751, 43.643036 ], "pop" : 5897, "state" : "ID" } +{ "_id" : "83801", "city" : "ATHOL", "loc" : [ -116.731821, 47.92674 ], "pop" : 2520, "state" : "ID" } +{ "_id" : "83802", "city" : "AVERY", "loc" : [ -115.866012, 47.271431 ], "pop" : 113, "state" : "ID" } +{ "_id" : "83803", "city" : "BAYVIEW", "loc" : [ -116.568745, 47.96535 ], "pop" : 722, "state" : "ID" } +{ "_id" : "83804", "city" : "BLANCHARD", "loc" : [ -116.990865, 48.022344 ], "pop" : 507, "state" : "ID" } +{ "_id" : "83805", "city" : "BONNERS FERRY", "loc" : [ -116.332178, 48.730642 ], "pop" : 5219, "state" : "ID" } +{ "_id" : "83808", "city" : "CALDER", "loc" : [ -116.222793, 47.274135 ], "pop" : 77, "state" : "ID" } +{ "_id" : "83809", "city" : "CAREYWOOD", "loc" : [ -116.598761, 48.062494 ], "pop" : 361, "state" : "ID" } +{ "_id" : "83810", "city" : "CATALDO", "loc" : [ -116.443138, 47.552169 ], "pop" : 982, "state" : "ID" } +{ "_id" : "83811", "city" : "CLARK FORK", "loc" : [ -116.169865, 48.140457 ], "pop" : 971, "state" : "ID" } +{ "_id" : "83812", "city" : "CLARKIA", "loc" : [ -116.277408, 47.044477 ], "pop" : 85, "state" : "ID" } +{ "_id" : "83813", "city" : "COCOLALLA", "loc" : [ -116.657051, 48.124828 ], "pop" : 715, "state" : "ID" } +{ "_id" : "83814", "city" : "COEUR D ALENE", "loc" : [ -116.784976, 47.692841 ], "pop" : 33589, "state" : "ID" } +{ "_id" : "83821", "city" : "COOLIN", "loc" : [ -116.840823, 48.522754 ], "pop" : 194, "state" : "ID" } +{ "_id" : "83822", "city" : "OLD TOWN", "loc" : [ -116.927382, 48.187988 ], "pop" : 2229, "state" : "ID" } +{ "_id" : "83823", "city" : "DEARY", "loc" : [ -116.523782, 46.806062 ], "pop" : 1483, "state" : "ID" } +{ "_id" : "83824", "city" : "DESMET", "loc" : [ -116.893746, 47.125954 ], "pop" : 265, "state" : "ID" } +{ "_id" : "83827", "city" : "ELK RIVER", "loc" : [ -116.179943, 46.782972 ], "pop" : 154, "state" : "ID" } +{ "_id" : "83830", "city" : "FERNWOOD", "loc" : [ -116.383126, 47.116027 ], "pop" : 372, "state" : "ID" } +{ "_id" : "83832", "city" : "GENESEE", "loc" : [ -116.928991, 46.571394 ], "pop" : 1241, "state" : "ID" } +{ "_id" : "83833", "city" : "HARRISON", "loc" : [ -116.744607, 47.501692 ], "pop" : 1077, "state" : "ID" } +{ "_id" : "83834", "city" : "HARVARD", "loc" : [ -116.702524, 46.937647 ], "pop" : 226, "state" : "ID" } +{ "_id" : "83835", "city" : "HAYDEN LAKE", "loc" : [ -116.776821, 47.773853 ], "pop" : 9287, "state" : "ID" } +{ "_id" : "83836", "city" : "HOPE", "loc" : [ -116.279504, 48.244402 ], "pop" : 687, "state" : "ID" } +{ "_id" : "83837", "city" : "KELLOGG", "loc" : [ -116.125281, 47.543069 ], "pop" : 4640, "state" : "ID" } +{ "_id" : "83839", "city" : "KINGSTON", "loc" : [ -116.288722, 47.550881 ], "pop" : 690, "state" : "ID" } +{ "_id" : "83842", "city" : "MEDIMONT", "loc" : [ -116.568291, 47.462482 ], "pop" : 32, "state" : "ID" } +{ "_id" : "83843", "city" : "MOSCOW", "loc" : [ -116.989683, 46.730921 ], "pop" : 21714, "state" : "ID" } +{ "_id" : "83845", "city" : "MOYIE SPRINGS", "loc" : [ -116.179603, 48.746434 ], "pop" : 1496, "state" : "ID" } +{ "_id" : "83846", "city" : "MULLAN", "loc" : [ -115.792603, 47.470906 ], "pop" : 995, "state" : "ID" } +{ "_id" : "83847", "city" : "NAPLES", "loc" : [ -116.319636, 48.60491 ], "pop" : 1556, "state" : "ID" } +{ "_id" : "83848", "city" : "NORDMAN", "loc" : [ -116.92126, 48.566944 ], "pop" : 446, "state" : "ID" } +{ "_id" : "83850", "city" : "PINEHURST", "loc" : [ -116.264679, 47.501823 ], "pop" : 371, "state" : "ID" } +{ "_id" : "83851", "city" : "PLUMMER", "loc" : [ -116.866161, 47.327782 ], "pop" : 1439, "state" : "ID" } +{ "_id" : "83853", "city" : "PORTHILL", "loc" : [ -116.477517, 48.992037 ], "pop" : 61, "state" : "ID" } +{ "_id" : "83854", "city" : "POST FALLS", "loc" : [ -116.935349, 47.720475 ], "pop" : 14952, "state" : "ID" } +{ "_id" : "83855", "city" : "POTLATCH", "loc" : [ -116.914101, 46.944833 ], "pop" : 1836, "state" : "ID" } +{ "_id" : "83856", "city" : "PRIEST RIVER", "loc" : [ -116.906617, 48.16637 ], "pop" : 4345, "state" : "ID" } +{ "_id" : "83857", "city" : "PRINCETON", "loc" : [ -116.828728, 46.899556 ], "pop" : 733, "state" : "ID" } +{ "_id" : "83858", "city" : "RATHDRUM", "loc" : [ -116.887294, 47.824107 ], "pop" : 4798, "state" : "ID" } +{ "_id" : "83860", "city" : "SAGLE", "loc" : [ -116.5455, 48.2035 ], "pop" : 3512, "state" : "ID" } +{ "_id" : "83861", "city" : "SAINT MARIES", "loc" : [ -116.568107, 47.297727 ], "pop" : 5894, "state" : "ID" } +{ "_id" : "83864", "city" : "SANDPOINT", "loc" : [ -116.533249, 48.311989 ], "pop" : 12421, "state" : "ID" } +{ "_id" : "83868", "city" : "SMELTERVILLE", "loc" : [ -116.240113, 47.537096 ], "pop" : 2272, "state" : "ID" } +{ "_id" : "83869", "city" : "SPIRIT LAKE", "loc" : [ -116.868046, 47.965652 ], "pop" : 860, "state" : "ID" } +{ "_id" : "83870", "city" : "TENSED", "loc" : [ -116.902716, 47.170735 ], "pop" : 332, "state" : "ID" } +{ "_id" : "83871", "city" : "TROY", "loc" : [ -116.768105, 46.742648 ], "pop" : 1481, "state" : "ID" } +{ "_id" : "83872", "city" : "VIOLA", "loc" : [ -116.97319, 46.858293 ], "pop" : 519, "state" : "ID" } +{ "_id" : "83873", "city" : "WALLACE", "loc" : [ -115.962001, 47.490842 ], "pop" : 4688, "state" : "ID" } +{ "_id" : "83876", "city" : "WORLEY", "loc" : [ -116.905634, 47.429213 ], "pop" : 845, "state" : "ID" } +{ "_id" : "84001", "city" : "ALTAMONT", "loc" : [ -110.446356, 40.370225 ], "pop" : 146, "state" : "UT" } +{ "_id" : "84002", "city" : "ALTONAH", "loc" : [ -110.438499, 40.441894 ], "pop" : 10, "state" : "UT" } +{ "_id" : "84003", "city" : "AMERICAN FORK", "loc" : [ -111.794107, 40.392784 ], "pop" : 21864, "state" : "UT" } +{ "_id" : "84004", "city" : "ALPINE", "loc" : [ -111.768861, 40.461591 ], "pop" : 3665, "state" : "UT" } +{ "_id" : "84006", "city" : "BINGHAM CANYON", "loc" : [ -112.097718, 40.564614 ], "pop" : 631, "state" : "UT" } +{ "_id" : "84007", "city" : "BLUEBELL", "loc" : [ -110.294122, 40.351728 ], "pop" : 1443, "state" : "UT" } +{ "_id" : "84010", "city" : "BOUNTIFUL", "loc" : [ -111.872658, 40.877513 ], "pop" : 41077, "state" : "UT" } +{ "_id" : "84012", "city" : "BRIDGELAND", "loc" : [ -110.160264, 40.230411 ], "pop" : 849, "state" : "UT" } +{ "_id" : "84013", "city" : "CEDAR VALLEY", "loc" : [ -111.968985, 40.142516 ], "pop" : 1836, "state" : "UT" } +{ "_id" : "84014", "city" : "CENTERVILLE", "loc" : [ -111.87701, 40.926772 ], "pop" : 11989, "state" : "UT" } +{ "_id" : "84015", "city" : "CLEARFIELD", "loc" : [ -112.048224, 41.129388 ], "pop" : 25972, "state" : "UT" } +{ "_id" : "84017", "city" : "COALVILLE", "loc" : [ -111.407108, 40.924385 ], "pop" : 3217, "state" : "UT" } +{ "_id" : "84018", "city" : "CROYDON", "loc" : [ -111.523092, 41.068915 ], "pop" : 117, "state" : "UT" } +{ "_id" : "84020", "city" : "DRAPER", "loc" : [ -111.88096, 40.504599 ], "pop" : 5602, "state" : "UT" } +{ "_id" : "84021", "city" : "DUCHESNE", "loc" : [ -110.618094, 39.95398 ], "pop" : 38, "state" : "UT" } +{ "_id" : "84022", "city" : "DUGWAY", "loc" : [ -112.872905, 40.526892 ], "pop" : 79, "state" : "UT" } +{ "_id" : "84023", "city" : "DUTCH JOHN", "loc" : [ -109.354255, 40.932244 ], "pop" : 174, "state" : "UT" } +{ "_id" : "84025", "city" : "FARMINGTON", "loc" : [ -111.893785, 40.988913 ], "pop" : 10307, "state" : "UT" } +{ "_id" : "84026", "city" : "FORT DUCHESNE", "loc" : [ -109.863726, 40.301411 ], "pop" : 1649, "state" : "UT" } +{ "_id" : "84028", "city" : "GARDEN CITY", "loc" : [ -111.407033, 41.93764 ], "pop" : 254, "state" : "UT" } +{ "_id" : "84029", "city" : "GRANTSVILLE", "loc" : [ -112.461766, 40.60054 ], "pop" : 4741, "state" : "UT" } +{ "_id" : "84031", "city" : "HANNA", "loc" : [ -110.809748, 40.450135 ], "pop" : 54, "state" : "UT" } +{ "_id" : "84032", "city" : "HEBER CITY", "loc" : [ -111.405088, 40.494703 ], "pop" : 7913, "state" : "UT" } +{ "_id" : "84035", "city" : "JENSEN", "loc" : [ -109.350982, 40.378715 ], "pop" : 471, "state" : "UT" } +{ "_id" : "84036", "city" : "KAMAS", "loc" : [ -111.261877, 40.641432 ], "pop" : 2433, "state" : "UT" } +{ "_id" : "84037", "city" : "KAYSVILLE", "loc" : [ -111.932607, 41.037527 ], "pop" : 21132, "state" : "UT" } +{ "_id" : "84038", "city" : "LAKETOWN", "loc" : [ -111.268853, 41.81068 ], "pop" : 430, "state" : "UT" } +{ "_id" : "84039", "city" : "LAPOINT", "loc" : [ -109.804102, 40.400285 ], "pop" : 362, "state" : "UT" } +{ "_id" : "84040", "city" : "LAYTON", "loc" : [ -111.927365, 41.084576 ], "pop" : 13289, "state" : "UT" } +{ "_id" : "84041", "city" : "LAYTON", "loc" : [ -111.970354, 41.087905 ], "pop" : 33600, "state" : "UT" } +{ "_id" : "84042", "city" : "LINDON", "loc" : [ -111.714358, 40.34119 ], "pop" : 3819, "state" : "UT" } +{ "_id" : "84043", "city" : "LEHI", "loc" : [ -111.850606, 40.395845 ], "pop" : 9188, "state" : "UT" } +{ "_id" : "84044", "city" : "MAGNA", "loc" : [ -112.080867, 40.700879 ], "pop" : 17841, "state" : "UT" } +{ "_id" : "84046", "city" : "MANILA", "loc" : [ -109.723503, 40.968494 ], "pop" : 516, "state" : "UT" } +{ "_id" : "84047", "city" : "MIDVALE", "loc" : [ -111.885066, 40.615178 ], "pop" : 25001, "state" : "UT" } +{ "_id" : "84049", "city" : "MIDWAY", "loc" : [ -111.477575, 40.50934 ], "pop" : 1837, "state" : "UT" } +{ "_id" : "84050", "city" : "MORGAN", "loc" : [ -111.716339, 41.067832 ], "pop" : 5411, "state" : "UT" } +{ "_id" : "84051", "city" : "MOUNTAIN HOME", "loc" : [ -110.767018, 40.191999 ], "pop" : 236, "state" : "UT" } +{ "_id" : "84052", "city" : "MYTON", "loc" : [ -110.048056, 40.194049 ], "pop" : 940, "state" : "UT" } +{ "_id" : "84053", "city" : "NEOLA", "loc" : [ -110.037221, 40.449149 ], "pop" : 810, "state" : "UT" } +{ "_id" : "84054", "city" : "NORTH SALT LAKE", "loc" : [ -111.904116, 40.844064 ], "pop" : 7216, "state" : "UT" } +{ "_id" : "84056", "city" : "HILL AIR FORCE B", "loc" : [ -111.995565, 41.116962 ], "pop" : 5432, "state" : "UT" } +{ "_id" : "84057", "city" : "OREM", "loc" : [ -111.695293, 40.313407 ], "pop" : 38292, "state" : "UT" } +{ "_id" : "84058", "city" : "VINEYARD", "loc" : [ -111.694301, 40.280761 ], "pop" : 29323, "state" : "UT" } +{ "_id" : "84060", "city" : "PARK CITY", "loc" : [ -111.528021, 40.695724 ], "pop" : 8976, "state" : "UT" } +{ "_id" : "84061", "city" : "PEOA", "loc" : [ -111.302467, 40.720937 ], "pop" : 892, "state" : "UT" } +{ "_id" : "84062", "city" : "PLEASANT GROVE", "loc" : [ -111.733284, 40.371986 ], "pop" : 15703, "state" : "UT" } +{ "_id" : "84063", "city" : "RANDLETT", "loc" : [ -109.730102, 40.21865 ], "pop" : 78, "state" : "UT" } +{ "_id" : "84064", "city" : "RANDOLPH", "loc" : [ -111.185578, 41.656328 ], "pop" : 682, "state" : "UT" } +{ "_id" : "84065", "city" : "LARK", "loc" : [ -111.954661, 40.53789 ], "pop" : 28444, "state" : "UT" } +{ "_id" : "84066", "city" : "ROOSEVELT", "loc" : [ -110.010782, 40.310229 ], "pop" : 6725, "state" : "UT" } +{ "_id" : "84067", "city" : "ROY", "loc" : [ -112.038177, 41.172365 ], "pop" : 22166, "state" : "UT" } +{ "_id" : "84069", "city" : "RUSH VALLEY", "loc" : [ -112.744033, 40.233625 ], "pop" : 1893, "state" : "UT" } +{ "_id" : "84070", "city" : "SANDY", "loc" : [ -111.881625, 40.579379 ], "pop" : 19422, "state" : "UT" } +{ "_id" : "84071", "city" : "STOCKTON", "loc" : [ -112.425214, 40.350451 ], "pop" : 490, "state" : "UT" } +{ "_id" : "84072", "city" : "TABIONA", "loc" : [ -110.702108, 40.382691 ], "pop" : 440, "state" : "UT" } +{ "_id" : "84073", "city" : "TALMAGE", "loc" : [ -110.396529, 40.174569 ], "pop" : 1743, "state" : "UT" } +{ "_id" : "84074", "city" : "TOOELE", "loc" : [ -112.300214, 40.545445 ], "pop" : 17588, "state" : "UT" } +{ "_id" : "84075", "city" : "SYRACUSE", "loc" : [ -112.0451, 41.086423 ], "pop" : 9737, "state" : "UT" } +{ "_id" : "84076", "city" : "TRIDELL", "loc" : [ -109.835906, 40.443593 ], "pop" : 363, "state" : "UT" } +{ "_id" : "84078", "city" : "VERNAL", "loc" : [ -109.546883, 40.440613 ], "pop" : 17641, "state" : "UT" } +{ "_id" : "84080", "city" : "VERNON", "loc" : [ -112.425961, 40.082609 ], "pop" : 200, "state" : "UT" } +{ "_id" : "84082", "city" : "WALLSBURG", "loc" : [ -111.464934, 40.365697 ], "pop" : 649, "state" : "UT" } +{ "_id" : "84083", "city" : "TROUT CREEK", "loc" : [ -113.993573, 40.597396 ], "pop" : 1801, "state" : "UT" } +{ "_id" : "84084", "city" : "WEST JORDAN", "loc" : [ -111.967662, 40.625429 ], "pop" : 36145, "state" : "UT" } +{ "_id" : "84085", "city" : "WHITEROCKS", "loc" : [ -109.917244, 40.452771 ], "pop" : 858, "state" : "UT" } +{ "_id" : "84086", "city" : "WOODRUFF", "loc" : [ -111.186848, 41.488783 ], "pop" : 359, "state" : "UT" } +{ "_id" : "84087", "city" : "WOODS CROSS", "loc" : [ -111.902712, 40.887447 ], "pop" : 8170, "state" : "UT" } +{ "_id" : "84088", "city" : "WEST JORDAN", "loc" : [ -111.964385, 40.595913 ], "pop" : 18592, "state" : "UT" } +{ "_id" : "84092", "city" : "ALTA", "loc" : [ -111.82736, 40.560245 ], "pop" : 25465, "state" : "UT" } +{ "_id" : "84093", "city" : "SANDY", "loc" : [ -111.830989, 40.592651 ], "pop" : 26702, "state" : "UT" } +{ "_id" : "84094", "city" : "SANDY", "loc" : [ -111.861716, 40.568757 ], "pop" : 26375, "state" : "UT" } +{ "_id" : "84101", "city" : "SALT LAKE CITY", "loc" : [ -111.896657, 40.755851 ], "pop" : 2449, "state" : "UT" } +{ "_id" : "84102", "city" : "SALT LAKE CITY", "loc" : [ -111.862721, 40.760034 ], "pop" : 15367, "state" : "UT" } +{ "_id" : "84103", "city" : "SALT LAKE CITY", "loc" : [ -111.874891, 40.777584 ], "pop" : 21427, "state" : "UT" } +{ "_id" : "84104", "city" : "SALT LAKE CITY", "loc" : [ -111.925979, 40.74985 ], "pop" : 16951, "state" : "UT" } +{ "_id" : "84105", "city" : "SALT LAKE CITY", "loc" : [ -111.858087, 40.737236 ], "pop" : 22228, "state" : "UT" } +{ "_id" : "84106", "city" : "SALT LAKE CITY", "loc" : [ -111.854841, 40.705597 ], "pop" : 30496, "state" : "UT" } +{ "_id" : "84107", "city" : "MURRAY", "loc" : [ -111.878383, 40.659014 ], "pop" : 28403, "state" : "UT" } +{ "_id" : "84108", "city" : "SALT LAKE CITY", "loc" : [ -111.825822, 40.737136 ], "pop" : 16873, "state" : "UT" } +{ "_id" : "84109", "city" : "SALT LAKE CITY", "loc" : [ -111.814218, 40.704251 ], "pop" : 24049, "state" : "UT" } +{ "_id" : "84111", "city" : "SALT LAKE CITY", "loc" : [ -111.881, 40.754834 ], "pop" : 8978, "state" : "UT" } +{ "_id" : "84112", "city" : "SALT LAKE CITY", "loc" : [ -111.827827, 40.752372 ], "pop" : 2555, "state" : "UT" } +{ "_id" : "84113", "city" : "SALT LAKE CITY", "loc" : [ -111.841825, 40.763057 ], "pop" : 1093, "state" : "UT" } +{ "_id" : "84115", "city" : "SOUTH SALT LAKE", "loc" : [ -111.883828, 40.715797 ], "pop" : 21776, "state" : "UT" } +{ "_id" : "84116", "city" : "SALT LAKE CITY", "loc" : [ -111.929054, 40.785697 ], "pop" : 23880, "state" : "UT" } +{ "_id" : "84117", "city" : "HOLLADAY", "loc" : [ -111.832943, 40.666302 ], "pop" : 23063, "state" : "UT" } +{ "_id" : "84118", "city" : "KEARNS", "loc" : [ -111.98521, 40.652759 ], "pop" : 55999, "state" : "UT" } +{ "_id" : "84119", "city" : "WEST VALLEY CITY", "loc" : [ -111.952964, 40.690977 ], "pop" : 38892, "state" : "UT" } +{ "_id" : "84120", "city" : "WEST VALLEY CITY", "loc" : [ -112.009783, 40.68708 ], "pop" : 52854, "state" : "UT" } +{ "_id" : "84121", "city" : "COTTONWOOD", "loc" : [ -111.82468, 40.623247 ], "pop" : 40235, "state" : "UT" } +{ "_id" : "84123", "city" : "MURRAY", "loc" : [ -111.919483, 40.660479 ], "pop" : 27766, "state" : "UT" } +{ "_id" : "84124", "city" : "HOLLADAY", "loc" : [ -111.820833, 40.67966 ], "pop" : 20402, "state" : "UT" } +{ "_id" : "84302", "city" : "BRIGHAM CITY", "loc" : [ -112.015177, 41.507921 ], "pop" : 17119, "state" : "UT" } +{ "_id" : "84305", "city" : "CLARKSTON", "loc" : [ -112.04859, 41.91877 ], "pop" : 665, "state" : "UT" } +{ "_id" : "84306", "city" : "COLLINSTON", "loc" : [ -112.124219, 41.78777 ], "pop" : 952, "state" : "UT" } +{ "_id" : "84307", "city" : "CORINNE", "loc" : [ -112.151388, 41.544986 ], "pop" : 1201, "state" : "UT" } +{ "_id" : "84308", "city" : "CORNISH", "loc" : [ -111.954241, 41.970178 ], "pop" : 250, "state" : "UT" } +{ "_id" : "84309", "city" : "DEWEYVILLE", "loc" : [ -112.094717, 41.697226 ], "pop" : 491, "state" : "UT" } +{ "_id" : "84310", "city" : "EDEN", "loc" : [ -111.855765, 41.330279 ], "pop" : 1707, "state" : "UT" } +{ "_id" : "84311", "city" : "FIELDING", "loc" : [ -112.118978, 41.811817 ], "pop" : 703, "state" : "UT" } +{ "_id" : "84312", "city" : "GARLAND", "loc" : [ -112.151635, 41.741319 ], "pop" : 2208, "state" : "UT" } +{ "_id" : "84313", "city" : "GROUSE CREEK", "loc" : [ -113.854043, 41.629727 ], "pop" : 124, "state" : "UT" } +{ "_id" : "84314", "city" : "HONEYVILLE", "loc" : [ -112.097425, 41.623754 ], "pop" : 2236, "state" : "UT" } +{ "_id" : "84315", "city" : "HOOPER", "loc" : [ -112.090371, 41.18267 ], "pop" : 10540, "state" : "UT" } +{ "_id" : "84317", "city" : "HUNTSVILLE", "loc" : [ -111.761821, 41.272139 ], "pop" : 2247, "state" : "UT" } +{ "_id" : "84319", "city" : "HYRUM", "loc" : [ -111.849, 41.631096 ], "pop" : 5352, "state" : "UT" } +{ "_id" : "84320", "city" : "LEWISTON", "loc" : [ -111.876814, 41.970087 ], "pop" : 1418, "state" : "UT" } +{ "_id" : "84321", "city" : "LOGAN", "loc" : [ -111.822613, 41.747025 ], "pop" : 40074, "state" : "UT" } +{ "_id" : "84324", "city" : "MANTUA", "loc" : [ -111.941646, 41.497496 ], "pop" : 715, "state" : "UT" } +{ "_id" : "84325", "city" : "MENDON", "loc" : [ -111.981692, 41.709989 ], "pop" : 1015, "state" : "UT" } +{ "_id" : "84328", "city" : "PARADISE", "loc" : [ -111.829665, 41.560009 ], "pop" : 916, "state" : "UT" } +{ "_id" : "84329", "city" : "PARK VALLEY", "loc" : [ -113.34776, 41.855125 ], "pop" : 281, "state" : "UT" } +{ "_id" : "84332", "city" : "PROVIDENCE", "loc" : [ -111.824389, 41.69522 ], "pop" : 7650, "state" : "UT" } +{ "_id" : "84333", "city" : "RICHMOND", "loc" : [ -111.806922, 41.928223 ], "pop" : 2556, "state" : "UT" } +{ "_id" : "84335", "city" : "SMITHFIELD", "loc" : [ -111.852813, 41.840328 ], "pop" : 7376, "state" : "UT" } +{ "_id" : "84336", "city" : "SNOWVILLE", "loc" : [ -112.353391, 41.840321 ], "pop" : 1982, "state" : "UT" } +{ "_id" : "84337", "city" : "TREMONTON", "loc" : [ -112.181293, 41.701564 ], "pop" : 6439, "state" : "UT" } +{ "_id" : "84338", "city" : "TRENTON", "loc" : [ -111.934033, 41.910453 ], "pop" : 450, "state" : "UT" } +{ "_id" : "84339", "city" : "WELLSVILLE", "loc" : [ -111.931676, 41.634302 ], "pop" : 2461, "state" : "UT" } +{ "_id" : "84340", "city" : "WILLARD", "loc" : [ -112.031653, 41.398944 ], "pop" : 2034, "state" : "UT" } +{ "_id" : "84401", "city" : "OGDEN", "loc" : [ -111.962121, 41.22148 ], "pop" : 21276, "state" : "UT" } +{ "_id" : "84403", "city" : "OGDEN", "loc" : [ -111.948927, 41.189412 ], "pop" : 28751, "state" : "UT" } +{ "_id" : "84404", "city" : "OGDEN", "loc" : [ -111.983686, 41.262727 ], "pop" : 35790, "state" : "UT" } +{ "_id" : "84405", "city" : "OGDEN", "loc" : [ -111.980945, 41.173928 ], "pop" : 18982, "state" : "UT" } +{ "_id" : "84414", "city" : "OGDEN", "loc" : [ -111.968924, 41.311201 ], "pop" : 16891, "state" : "UT" } +{ "_id" : "84501", "city" : "PRICE", "loc" : [ -110.808117, 39.602013 ], "pop" : 11741, "state" : "UT" } +{ "_id" : "84510", "city" : "ANETH", "loc" : [ -109.298281, 37.214671 ], "pop" : 3442, "state" : "UT" } +{ "_id" : "84511", "city" : "BLANDING", "loc" : [ -109.486599, 37.586342 ], "pop" : 4469, "state" : "UT" } +{ "_id" : "84520", "city" : "EAST CARBON", "loc" : [ -110.411308, 39.546088 ], "pop" : 1628, "state" : "UT" } +{ "_id" : "84523", "city" : "FERRON", "loc" : [ -111.146698, 39.069196 ], "pop" : 2349, "state" : "UT" } +{ "_id" : "84525", "city" : "GREEN RIVER", "loc" : [ -110.159817, 39.000243 ], "pop" : 919, "state" : "UT" } +{ "_id" : "84526", "city" : "HELPER", "loc" : [ -110.856, 39.673684 ], "pop" : 4005, "state" : "UT" } +{ "_id" : "84528", "city" : "HUNTINGTON", "loc" : [ -110.974094, 39.29202 ], "pop" : 7137, "state" : "UT" } +{ "_id" : "84531", "city" : "MEXICAN HAT", "loc" : [ -109.991865, 37.118429 ], "pop" : 647, "state" : "UT" } +{ "_id" : "84532", "city" : "MOAB", "loc" : [ -109.527087, 38.567674 ], "pop" : 6337, "state" : "UT" } +{ "_id" : "84533", "city" : "BULLFROG", "loc" : [ -110.506917, 37.459898 ], "pop" : 125, "state" : "UT" } +{ "_id" : "84535", "city" : "MONTICELLO", "loc" : [ -109.315289, 37.921709 ], "pop" : 2527, "state" : "UT" } +{ "_id" : "84536", "city" : "MONUMENT VALLEY", "loc" : [ -110.427335, 37.061425 ], "pop" : 1411, "state" : "UT" } +{ "_id" : "84540", "city" : "THOMPSON", "loc" : [ -109.794482, 38.988065 ], "pop" : 210, "state" : "UT" } +{ "_id" : "84542", "city" : "WELLINGTON", "loc" : [ -110.736954, 39.537257 ], "pop" : 2854, "state" : "UT" } +{ "_id" : "84601", "city" : "PROVO", "loc" : [ -111.675504, 40.231949 ], "pop" : 20121, "state" : "UT" } +{ "_id" : "84604", "city" : "PROVO", "loc" : [ -111.654906, 40.260681 ], "pop" : 43841, "state" : "UT" } +{ "_id" : "84606", "city" : "PROVO", "loc" : [ -111.644724, 40.234675 ], "pop" : 23536, "state" : "UT" } +{ "_id" : "84621", "city" : "AXTELL", "loc" : [ -111.824303, 39.053248 ], "pop" : 167, "state" : "UT" } +{ "_id" : "84622", "city" : "CENTERFIELD", "loc" : [ -111.818516, 39.125083 ], "pop" : 945, "state" : "UT" } +{ "_id" : "84624", "city" : "DELTA", "loc" : [ -112.531892, 39.375534 ], "pop" : 5673, "state" : "UT" } +{ "_id" : "84627", "city" : "EPHRAIM", "loc" : [ -111.582301, 39.359983 ], "pop" : 3492, "state" : "UT" } +{ "_id" : "84628", "city" : "EUREKA", "loc" : [ -112.117448, 39.954094 ], "pop" : 600, "state" : "UT" } +{ "_id" : "84629", "city" : "FAIRVIEW", "loc" : [ -111.495287, 39.645318 ], "pop" : 2089, "state" : "UT" } +{ "_id" : "84630", "city" : "FAYETTE", "loc" : [ -111.849712, 39.231533 ], "pop" : 207, "state" : "UT" } +{ "_id" : "84631", "city" : "FILLMORE", "loc" : [ -112.331321, 38.980539 ], "pop" : 3930, "state" : "UT" } +{ "_id" : "84634", "city" : "GUNNISON", "loc" : [ -111.816701, 39.154464 ], "pop" : 1330, "state" : "UT" } +{ "_id" : "84635", "city" : "HINCKLEY", "loc" : [ -112.671577, 39.330842 ], "pop" : 983, "state" : "UT" } +{ "_id" : "84642", "city" : "MANTI", "loc" : [ -111.651372, 39.235389 ], "pop" : 3088, "state" : "UT" } +{ "_id" : "84645", "city" : "MONA", "loc" : [ -111.848001, 39.838165 ], "pop" : 826, "state" : "UT" } +{ "_id" : "84647", "city" : "MOUNT PLEASANT", "loc" : [ -111.503854, 39.523227 ], "pop" : 4979, "state" : "UT" } +{ "_id" : "84648", "city" : "NEPHI", "loc" : [ -111.8359, 39.692275 ], "pop" : 4200, "state" : "UT" } +{ "_id" : "84650", "city" : "OASIS", "loc" : [ -112.648079, 39.27067 ], "pop" : 500, "state" : "UT" } +{ "_id" : "84651", "city" : "PAYSON", "loc" : [ -111.732138, 40.044866 ], "pop" : 13960, "state" : "UT" } +{ "_id" : "84653", "city" : "WOODLAND HILLS", "loc" : [ -111.65906, 40.042702 ], "pop" : 3766, "state" : "UT" } +{ "_id" : "84654", "city" : "SALINA", "loc" : [ -111.881072, 38.956028 ], "pop" : 3716, "state" : "UT" } +{ "_id" : "84655", "city" : "GENOLA", "loc" : [ -111.793819, 39.980356 ], "pop" : 3647, "state" : "UT" } +{ "_id" : "84660", "city" : "SPANISH FORK", "loc" : [ -111.646246, 40.10991 ], "pop" : 12851, "state" : "UT" } +{ "_id" : "84663", "city" : "SPRINGVILLE", "loc" : [ -111.598664, 40.162528 ], "pop" : 14403, "state" : "UT" } +{ "_id" : "84664", "city" : "MAPLETON", "loc" : [ -111.580122, 40.133711 ], "pop" : 3427, "state" : "UT" } +{ "_id" : "84701", "city" : "VENICE", "loc" : [ -112.062253, 38.757075 ], "pop" : 8412, "state" : "UT" } +{ "_id" : "84710", "city" : "ALTON", "loc" : [ -112.548389, 37.469905 ], "pop" : 159, "state" : "UT" } +{ "_id" : "84712", "city" : "ANTIMONY", "loc" : [ -111.993029, 38.1015 ], "pop" : 90, "state" : "UT" } +{ "_id" : "84713", "city" : "BEAVER", "loc" : [ -112.629916, 38.28071 ], "pop" : 2560, "state" : "UT" } +{ "_id" : "84714", "city" : "BERYL", "loc" : [ -113.619586, 37.96005 ], "pop" : 12, "state" : "UT" } +{ "_id" : "84716", "city" : "BOULDER", "loc" : [ -111.426646, 37.916606 ], "pop" : 131, "state" : "UT" } +{ "_id" : "84717", "city" : "BRYCE CANYON", "loc" : [ -112.074311, 37.608427 ], "pop" : 958, "state" : "UT" } +{ "_id" : "84719", "city" : "BRIAN HEAD", "loc" : [ -112.843698, 37.698465 ], "pop" : 111, "state" : "UT" } +{ "_id" : "84720", "city" : "PINTURA", "loc" : [ -113.074513, 37.689544 ], "pop" : 17392, "state" : "UT" } +{ "_id" : "84722", "city" : "CENTRAL", "loc" : [ -113.717199, 37.567734 ], "pop" : 1127, "state" : "UT" } +{ "_id" : "84726", "city" : "ESCALANTE", "loc" : [ -111.603695, 37.769839 ], "pop" : 955, "state" : "UT" } +{ "_id" : "84728", "city" : "GARRISON", "loc" : [ -113.894858, 39.074382 ], "pop" : 247, "state" : "UT" } +{ "_id" : "84729", "city" : "GLENDALE", "loc" : [ -112.603491, 37.321897 ], "pop" : 287, "state" : "UT" } +{ "_id" : "84731", "city" : "GREENVILLE", "loc" : [ -112.708404, 38.263582 ], "pop" : 116, "state" : "UT" } +{ "_id" : "84734", "city" : "HANKSVILLE", "loc" : [ -110.813744, 38.252051 ], "pop" : 373, "state" : "UT" } +{ "_id" : "84737", "city" : "HURRICANE", "loc" : [ -113.224706, 37.169098 ], "pop" : 9174, "state" : "UT" } +{ "_id" : "84739", "city" : "JOSEPH", "loc" : [ -112.225119, 38.622092 ], "pop" : 289, "state" : "UT" } +{ "_id" : "84741", "city" : "BIG WATER", "loc" : [ -112.345374, 37.072085 ], "pop" : 4174, "state" : "UT" } +{ "_id" : "84743", "city" : "KINGSTON", "loc" : [ -112.204864, 38.215772 ], "pop" : 825, "state" : "UT" } +{ "_id" : "84747", "city" : "FREMONT", "loc" : [ -111.629233, 38.417266 ], "pop" : 987, "state" : "UT" } +{ "_id" : "84750", "city" : "MARYSVALE", "loc" : [ -112.251848, 38.444924 ], "pop" : 452, "state" : "UT" } +{ "_id" : "84751", "city" : "MILFORD", "loc" : [ -112.993377, 38.331071 ], "pop" : 2089, "state" : "UT" } +{ "_id" : "84753", "city" : "MODENA", "loc" : [ -113.919282, 37.799452 ], "pop" : 9, "state" : "UT" } +{ "_id" : "84754", "city" : "AUSTIN", "loc" : [ -112.132434, 38.645305 ], "pop" : 2995, "state" : "UT" } +{ "_id" : "84755", "city" : "MOUNT CARMEL", "loc" : [ -112.670034, 37.237821 ], "pop" : 43, "state" : "UT" } +{ "_id" : "84756", "city" : "NEWCASTLE", "loc" : [ -113.661479, 37.736049 ], "pop" : 758, "state" : "UT" } +{ "_id" : "84758", "city" : "ORDERVILLE", "loc" : [ -112.642045, 37.274419 ], "pop" : 506, "state" : "UT" } +{ "_id" : "84759", "city" : "PANGUITCH", "loc" : [ -112.436886, 37.80777 ], "pop" : 1797, "state" : "UT" } +{ "_id" : "84760", "city" : "PARAGONAH", "loc" : [ -112.773972, 37.89172 ], "pop" : 334, "state" : "UT" } +{ "_id" : "84761", "city" : "PAROWAN", "loc" : [ -112.832251, 37.844861 ], "pop" : 1988, "state" : "UT" } +{ "_id" : "84766", "city" : "SEVIER", "loc" : [ -112.392126, 38.590709 ], "pop" : 19, "state" : "UT" } +{ "_id" : "84770", "city" : "ST GEORGE", "loc" : [ -113.595261, 37.106651 ], "pop" : 33146, "state" : "UT" } +{ "_id" : "84772", "city" : "SUMMIT", "loc" : [ -112.913407, 37.803397 ], "pop" : 185, "state" : "UT" } +{ "_id" : "84773", "city" : "TEASDALE", "loc" : [ -111.43346, 38.285334 ], "pop" : 430, "state" : "UT" } +{ "_id" : "84775", "city" : "TORREY", "loc" : [ -111.547439, 38.334993 ], "pop" : 436, "state" : "UT" } +{ "_id" : "84780", "city" : "WASHINGTON", "loc" : [ -113.505043, 37.136379 ], "pop" : 4134, "state" : "UT" } +{ "_id" : "84781", "city" : "PINE VALLEY", "loc" : [ -113.517708, 37.389772 ], "pop" : 31, "state" : "UT" } +{ "_id" : "84782", "city" : "VEYO", "loc" : [ -113.666758, 37.35896 ], "pop" : 449, "state" : "UT" } +{ "_id" : "84783", "city" : "DAMMERON VALLEY", "loc" : [ -113.658553, 37.284899 ], "pop" : 499, "state" : "UT" } +{ "_id" : "85003", "city" : "PHOENIX", "loc" : [ -112.077428, 33.451095 ], "pop" : 10633, "state" : "AZ" } +{ "_id" : "85004", "city" : "PHOENIX", "loc" : [ -112.068584, 33.455708 ], "pop" : 4491, "state" : "AZ" } +{ "_id" : "85006", "city" : "PHOENIX", "loc" : [ -112.047357, 33.465016 ], "pop" : 26747, "state" : "AZ" } +{ "_id" : "85007", "city" : "PHOENIX", "loc" : [ -112.089326, 33.452298 ], "pop" : 13650, "state" : "AZ" } +{ "_id" : "85008", "city" : "PHOENIX", "loc" : [ -111.998381, 33.466457 ], "pop" : 41733, "state" : "AZ" } +{ "_id" : "85009", "city" : "PHOENIX", "loc" : [ -112.128368, 33.456373 ], "pop" : 41512, "state" : "AZ" } +{ "_id" : "85012", "city" : "PHOENIX", "loc" : [ -112.067816, 33.509744 ], "pop" : 6141, "state" : "AZ" } +{ "_id" : "85013", "city" : "PHOENIX", "loc" : [ -112.082657, 33.508493 ], "pop" : 18467, "state" : "AZ" } +{ "_id" : "85014", "city" : "PHOENIX", "loc" : [ -112.05557, 33.510263 ], "pop" : 22646, "state" : "AZ" } +{ "_id" : "85015", "city" : "PHOENIX", "loc" : [ -112.101064, 33.508164 ], "pop" : 32497, "state" : "AZ" } +{ "_id" : "85016", "city" : "PHOENIX", "loc" : [ -112.030496, 33.502117 ], "pop" : 29527, "state" : "AZ" } +{ "_id" : "85017", "city" : "PHOENIX", "loc" : [ -112.121232, 33.515263 ], "pop" : 27741, "state" : "AZ" } +{ "_id" : "85018", "city" : "PHOENIX", "loc" : [ -111.988259, 33.495796 ], "pop" : 32926, "state" : "AZ" } +{ "_id" : "85019", "city" : "PHOENIX", "loc" : [ -112.141681, 33.512284 ], "pop" : 21879, "state" : "AZ" } +{ "_id" : "85020", "city" : "PHOENIX", "loc" : [ -112.055888, 33.562281 ], "pop" : 29043, "state" : "AZ" } +{ "_id" : "85021", "city" : "PHOENIX", "loc" : [ -112.092686, 33.559965 ], "pop" : 31201, "state" : "AZ" } +{ "_id" : "85022", "city" : "PHOENIX", "loc" : [ -112.052008, 33.631513 ], "pop" : 33573, "state" : "AZ" } +{ "_id" : "85023", "city" : "PHOENIX", "loc" : [ -112.111838, 33.632383 ], "pop" : 54668, "state" : "AZ" } +{ "_id" : "85024", "city" : "PHOENIX", "loc" : [ -112.036956, 33.661664 ], "pop" : 14090, "state" : "AZ" } +{ "_id" : "85027", "city" : "NEW RIVER STAGE", "loc" : [ -112.102723, 33.667157 ], "pop" : 24843, "state" : "AZ" } +{ "_id" : "85028", "city" : "PHOENIX", "loc" : [ -112.008724, 33.585115 ], "pop" : 22662, "state" : "AZ" } +{ "_id" : "85029", "city" : "PHOENIX", "loc" : [ -112.119913, 33.596133 ], "pop" : 40764, "state" : "AZ" } +{ "_id" : "85031", "city" : "PHOENIX", "loc" : [ -112.16963, 33.493909 ], "pop" : 21088, "state" : "AZ" } +{ "_id" : "85032", "city" : "PHOENIX", "loc" : [ -112.004369, 33.623807 ], "pop" : 53113, "state" : "AZ" } +{ "_id" : "85033", "city" : "PHOENIX", "loc" : [ -112.213185, 33.494426 ], "pop" : 41367, "state" : "AZ" } +{ "_id" : "85034", "city" : "PHOENIX", "loc" : [ -112.042135, 33.441251 ], "pop" : 9824, "state" : "AZ" } +{ "_id" : "85035", "city" : "PHOENIX", "loc" : [ -112.183177, 33.472353 ], "pop" : 35384, "state" : "AZ" } +{ "_id" : "85037", "city" : "PHOENIX", "loc" : [ -112.246763, 33.491278 ], "pop" : 13924, "state" : "AZ" } +{ "_id" : "85039", "city" : "PHOENIX", "loc" : [ -112.288573, 33.495362 ], "pop" : 7914, "state" : "AZ" } +{ "_id" : "85040", "city" : "PHOENIX", "loc" : [ -112.03126, 33.390475 ], "pop" : 47527, "state" : "AZ" } +{ "_id" : "85041", "city" : "PHOENIX", "loc" : [ -112.095437, 33.388882 ], "pop" : 29343, "state" : "AZ" } +{ "_id" : "85043", "city" : "PHOENIX", "loc" : [ -112.197245, 33.449056 ], "pop" : 7054, "state" : "AZ" } +{ "_id" : "85044", "city" : "PHOENIX", "loc" : [ -111.9943, 33.329124 ], "pop" : 32053, "state" : "AZ" } +{ "_id" : "85051", "city" : "PHOENIX", "loc" : [ -112.133168, 33.559113 ], "pop" : 35671, "state" : "AZ" } +{ "_id" : "85201", "city" : "MESA", "loc" : [ -111.846931, 33.43174 ], "pop" : 40017, "state" : "AZ" } +{ "_id" : "85202", "city" : "MESA", "loc" : [ -111.872429, 33.385095 ], "pop" : 40729, "state" : "AZ" } +{ "_id" : "85203", "city" : "MESA", "loc" : [ -111.805697, 33.436952 ], "pop" : 32853, "state" : "AZ" } +{ "_id" : "85204", "city" : "MESA", "loc" : [ -111.789554, 33.399168 ], "pop" : 55180, "state" : "AZ" } +{ "_id" : "85205", "city" : "MESA", "loc" : [ -111.712939, 33.43685 ], "pop" : 35676, "state" : "AZ" } +{ "_id" : "85206", "city" : "MESA", "loc" : [ -111.724223, 33.402603 ], "pop" : 21274, "state" : "AZ" } +{ "_id" : "85207", "city" : "MESA", "loc" : [ -111.64256, 33.432073 ], "pop" : 12547, "state" : "AZ" } +{ "_id" : "85208", "city" : "MESA", "loc" : [ -111.651297, 33.398416 ], "pop" : 22113, "state" : "AZ" } +{ "_id" : "85210", "city" : "MESA", "loc" : [ -111.842757, 33.38867 ], "pop" : 32467, "state" : "AZ" } +{ "_id" : "85213", "city" : "MESA", "loc" : [ -111.773114, 33.436688 ], "pop" : 23500, "state" : "AZ" } +{ "_id" : "85219", "city" : "GOLD CANYON", "loc" : [ -111.51331, 33.360787 ], "pop" : 14112, "state" : "AZ" } +{ "_id" : "85220", "city" : "APACHE JUNCTION", "loc" : [ -111.571818, 33.415211 ], "pop" : 19342, "state" : "AZ" } +{ "_id" : "85222", "city" : "ELEVEN MILE CORN", "loc" : [ -111.756093, 32.892667 ], "pop" : 26134, "state" : "AZ" } +{ "_id" : "85224", "city" : "CHANDLER", "loc" : [ -111.863156, 33.330091 ], "pop" : 54023, "state" : "AZ" } +{ "_id" : "85225", "city" : "CHANDLER", "loc" : [ -111.823881, 33.310505 ], "pop" : 15678, "state" : "AZ" } +{ "_id" : "85226", "city" : "CHANDLER", "loc" : [ -111.919827, 33.30917 ], "pop" : 17639, "state" : "AZ" } +{ "_id" : "85228", "city" : "COOLIDGE", "loc" : [ -111.534378, 32.957399 ], "pop" : 10698, "state" : "AZ" } +{ "_id" : "85231", "city" : "ELOY", "loc" : [ -111.583275, 32.750929 ], "pop" : 10670, "state" : "AZ" } +{ "_id" : "85232", "city" : "FLORENCE", "loc" : [ -111.361234, 32.996881 ], "pop" : 9888, "state" : "AZ" } +{ "_id" : "85234", "city" : "GILBERT", "loc" : [ -111.780876, 33.352746 ], "pop" : 32606, "state" : "AZ" } +{ "_id" : "85236", "city" : "HIGLEY", "loc" : [ -111.696926, 33.302382 ], "pop" : 3583, "state" : "AZ" } +{ "_id" : "85237", "city" : "KEARNY", "loc" : [ -110.91227, 33.059443 ], "pop" : 2736, "state" : "AZ" } +{ "_id" : "85239", "city" : "MOBILE", "loc" : [ -112.075228, 32.987379 ], "pop" : 5026, "state" : "AZ" } +{ "_id" : "85240", "city" : "WILLIAMS AFB", "loc" : [ -111.668801, 33.310289 ], "pop" : 2574, "state" : "AZ" } +{ "_id" : "85242", "city" : "ARIZONA BOYS RAN", "loc" : [ -111.643596, 33.238577 ], "pop" : 2569, "state" : "AZ" } +{ "_id" : "85247", "city" : "SACATON", "loc" : [ -111.775162, 33.097699 ], "pop" : 6792, "state" : "AZ" } +{ "_id" : "85248", "city" : "SUN LAKES", "loc" : [ -111.866899, 33.223056 ], "pop" : 9399, "state" : "AZ" } +{ "_id" : "85249", "city" : "CHANDLER", "loc" : [ -111.774486, 33.241384 ], "pop" : 3871, "state" : "AZ" } +{ "_id" : "85250", "city" : "SCOTTSDALE", "loc" : [ -111.904926, 33.521767 ], "pop" : 16133, "state" : "AZ" } +{ "_id" : "85251", "city" : "SCOTTSDALE", "loc" : [ -111.916697, 33.493559 ], "pop" : 30869, "state" : "AZ" } +{ "_id" : "85253", "city" : "PARADISE VALLEY", "loc" : [ -111.956546, 33.549439 ], "pop" : 15289, "state" : "AZ" } +{ "_id" : "85254", "city" : "SCOTTSDALE", "loc" : [ -111.955422, 33.616476 ], "pop" : 37414, "state" : "AZ" } +{ "_id" : "85255", "city" : "SCOTTSDALE", "loc" : [ -111.889213, 33.696801 ], "pop" : 2927, "state" : "AZ" } +{ "_id" : "85256", "city" : "SCOTTSDALE", "loc" : [ -111.85333, 33.485793 ], "pop" : 3367, "state" : "AZ" } +{ "_id" : "85257", "city" : "SCOTTSDALE", "loc" : [ -111.915129, 33.46693 ], "pop" : 30182, "state" : "AZ" } +{ "_id" : "85258", "city" : "SCOTTSDALE", "loc" : [ -111.893067, 33.564747 ], "pop" : 20867, "state" : "AZ" } +{ "_id" : "85259", "city" : "SCOTTSDALE", "loc" : [ -111.840438, 33.587943 ], "pop" : 7802, "state" : "AZ" } +{ "_id" : "85260", "city" : "SCOTTSDALE", "loc" : [ -111.88671, 33.601323 ], "pop" : 17908, "state" : "AZ" } +{ "_id" : "85262", "city" : "SCOTTSDALE", "loc" : [ -111.779135, 33.77524 ], "pop" : 1614, "state" : "AZ" } +{ "_id" : "85264", "city" : "FORT MCDOWELL", "loc" : [ -111.68062, 33.611807 ], "pop" : 619, "state" : "AZ" } +{ "_id" : "85268", "city" : "FOUNTAIN HILLS", "loc" : [ -111.723685, 33.608489 ], "pop" : 10030, "state" : "AZ" } +{ "_id" : "85272", "city" : "STANFIELD", "loc" : [ -111.965987, 32.882321 ], "pop" : 644, "state" : "AZ" } +{ "_id" : "85273", "city" : "SUPERIOR", "loc" : [ -111.09846, 33.288716 ], "pop" : 3901, "state" : "AZ" } +{ "_id" : "85281", "city" : "TEMPE", "loc" : [ -111.926144, 33.422675 ], "pop" : 49218, "state" : "AZ" } +{ "_id" : "85282", "city" : "TEMPE", "loc" : [ -111.924896, 33.391669 ], "pop" : 47890, "state" : "AZ" } +{ "_id" : "85283", "city" : "TEMPE", "loc" : [ -111.93122, 33.366524 ], "pop" : 38332, "state" : "AZ" } +{ "_id" : "85284", "city" : "TEMPE", "loc" : [ -111.919696, 33.336302 ], "pop" : 12320, "state" : "AZ" } +{ "_id" : "85292", "city" : "WINKELMAN", "loc" : [ -110.772682, 33.00572 ], "pop" : 1977, "state" : "AZ" } +{ "_id" : "85301", "city" : "GLENDALE", "loc" : [ -112.176703, 33.531122 ], "pop" : 46331, "state" : "AZ" } +{ "_id" : "85302", "city" : "GLENDALE", "loc" : [ -112.175289, 33.567487 ], "pop" : 32094, "state" : "AZ" } +{ "_id" : "85303", "city" : "GLENDALE", "loc" : [ -112.214937, 33.526215 ], "pop" : 16045, "state" : "AZ" } +{ "_id" : "85304", "city" : "GLENDALE", "loc" : [ -112.174575, 33.594289 ], "pop" : 26463, "state" : "AZ" } +{ "_id" : "85305", "city" : "GLENDALE", "loc" : [ -112.248232, 33.529103 ], "pop" : 1424, "state" : "AZ" } +{ "_id" : "85306", "city" : "GLENDALE", "loc" : [ -112.177563, 33.623882 ], "pop" : 23493, "state" : "AZ" } +{ "_id" : "85307", "city" : "LUKE AFB", "loc" : [ -112.326735, 33.534879 ], "pop" : 4120, "state" : "AZ" } +{ "_id" : "85308", "city" : "GLENDALE", "loc" : [ -112.169391, 33.653924 ], "pop" : 31532, "state" : "AZ" } +{ "_id" : "85309", "city" : "LUKE AFB", "loc" : [ -112.356186, 33.539993 ], "pop" : 3601, "state" : "AZ" } +{ "_id" : "85310", "city" : "GLENDALE", "loc" : [ -112.164131, 33.704726 ], "pop" : 5369, "state" : "AZ" } +{ "_id" : "85321", "city" : "WHY", "loc" : [ -112.858681, 32.373485 ], "pop" : 3288, "state" : "AZ" } +{ "_id" : "85322", "city" : "ARLINGTON", "loc" : [ -112.789058, 33.313317 ], "pop" : 329, "state" : "AZ" } +{ "_id" : "85323", "city" : "AVONDALE", "loc" : [ -112.343754, 33.432114 ], "pop" : 12321, "state" : "AZ" } +{ "_id" : "85324", "city" : "ROCK SPRINGS", "loc" : [ -112.130956, 34.073197 ], "pop" : 1819, "state" : "AZ" } +{ "_id" : "85326", "city" : "BUCKEYE", "loc" : [ -112.607728, 33.38896 ], "pop" : 13086, "state" : "AZ" } +{ "_id" : "85328", "city" : "CIBOLA", "loc" : [ -114.512204, 33.614886 ], "pop" : 1285, "state" : "AZ" } +{ "_id" : "85331", "city" : "CAVE CREEK", "loc" : [ -112.015106, 33.821896 ], "pop" : 13654, "state" : "AZ" } +{ "_id" : "85332", "city" : "CONGRESS", "loc" : [ -112.76801, 34.176425 ], "pop" : 2314, "state" : "AZ" } +{ "_id" : "85333", "city" : "DATELAND", "loc" : [ -113.463126, 32.867886 ], "pop" : 659, "state" : "AZ" } +{ "_id" : "85335", "city" : "EL MIRAGE", "loc" : [ -112.324147, 33.608153 ], "pop" : 5234, "state" : "AZ" } +{ "_id" : "85337", "city" : "GILA BEND", "loc" : [ -112.746832, 32.93059 ], "pop" : 2898, "state" : "AZ" } +{ "_id" : "85338", "city" : "GOODYEAR", "loc" : [ -112.383385, 33.436809 ], "pop" : 5819, "state" : "AZ" } +{ "_id" : "85339", "city" : "LAVEEN", "loc" : [ -112.171618, 33.343572 ], "pop" : 6187, "state" : "AZ" } +{ "_id" : "85340", "city" : "LITCHFIELD PARK", "loc" : [ -112.380497, 33.494127 ], "pop" : 6349, "state" : "AZ" } +{ "_id" : "85342", "city" : "MORRISTOWN", "loc" : [ -112.548331, 33.772993 ], "pop" : 2878, "state" : "AZ" } +{ "_id" : "85343", "city" : "PALO VERDE", "loc" : [ -112.646662, 33.34848 ], "pop" : 669, "state" : "AZ" } +{ "_id" : "85344", "city" : "EMPIRE LANDING", "loc" : [ -114.266342, 34.0254 ], "pop" : 11143, "state" : "AZ" } +{ "_id" : "85345", "city" : "PEORIA", "loc" : [ -112.234424, 33.576135 ], "pop" : 37607, "state" : "AZ" } +{ "_id" : "85347", "city" : "ROLL", "loc" : [ -113.564287, 32.936635 ], "pop" : 959, "state" : "AZ" } +{ "_id" : "85348", "city" : "SALOME", "loc" : [ -113.571459, 33.748141 ], "pop" : 1279, "state" : "AZ" } +{ "_id" : "85350", "city" : "SOMERTON", "loc" : [ -114.7127, 32.563398 ], "pop" : 15339, "state" : "AZ" } +{ "_id" : "85351", "city" : "SUN CITY", "loc" : [ -112.279701, 33.606104 ], "pop" : 31102, "state" : "AZ" } +{ "_id" : "85353", "city" : "TOLLESON", "loc" : [ -112.277444, 33.434686 ], "pop" : 9485, "state" : "AZ" } +{ "_id" : "85354", "city" : "TONOPAH", "loc" : [ -112.952785, 33.422797 ], "pop" : 95, "state" : "AZ" } +{ "_id" : "85355", "city" : "WADDELL", "loc" : [ -112.43869, 33.567285 ], "pop" : 2125, "state" : "AZ" } +{ "_id" : "85356", "city" : "WELLTON", "loc" : [ -114.176616, 32.749251 ], "pop" : 4778, "state" : "AZ" } +{ "_id" : "85361", "city" : "WITTMANN", "loc" : [ -112.446578, 33.726425 ], "pop" : 789, "state" : "AZ" } +{ "_id" : "85362", "city" : "YARNELL", "loc" : [ -112.62166, 34.414076 ], "pop" : 455, "state" : "AZ" } +{ "_id" : "85363", "city" : "YOUNGTOWN", "loc" : [ -112.301305, 33.590751 ], "pop" : 2351, "state" : "AZ" } +{ "_id" : "85364", "city" : "YUMA", "loc" : [ -114.642362, 32.701507 ], "pop" : 57131, "state" : "AZ" } +{ "_id" : "85365", "city" : "YUMA PROVING GRO", "loc" : [ -114.548633, 32.671352 ], "pop" : 28179, "state" : "AZ" } +{ "_id" : "85373", "city" : "SUN CITY", "loc" : [ -112.321397, 33.658756 ], "pop" : 25878, "state" : "AZ" } +{ "_id" : "85374", "city" : "SURPRISE", "loc" : [ -112.33143, 33.630028 ], "pop" : 5042, "state" : "AZ" } +{ "_id" : "85375", "city" : "SUN CITY WEST", "loc" : [ -112.255434, 33.662576 ], "pop" : 5702, "state" : "AZ" } +{ "_id" : "85381", "city" : "PEORIA", "loc" : [ -112.223723, 33.604761 ], "pop" : 9624, "state" : "AZ" } +{ "_id" : "85382", "city" : "PEORIA", "loc" : [ -112.207177, 33.63083 ], "pop" : 1738, "state" : "AZ" } +{ "_id" : "85390", "city" : "WICKENBURG", "loc" : [ -112.738973, 33.911282 ], "pop" : 7994, "state" : "AZ" } +{ "_id" : "85501", "city" : "GLOBE", "loc" : [ -110.789247, 33.402426 ], "pop" : 13240, "state" : "AZ" } +{ "_id" : "85530", "city" : "BYLAS", "loc" : [ -110.11702, 33.126549 ], "pop" : 1371, "state" : "AZ" } +{ "_id" : "85533", "city" : "CLIFTON", "loc" : [ -109.246199, 33.132343 ], "pop" : 376, "state" : "AZ" } +{ "_id" : "85534", "city" : "FRANKLIN", "loc" : [ -109.129575, 32.793976 ], "pop" : 2395, "state" : "AZ" } +{ "_id" : "85535", "city" : "EDEN", "loc" : [ -109.953682, 33.028629 ], "pop" : 55, "state" : "AZ" } +{ "_id" : "85539", "city" : "MIAMI", "loc" : [ -110.881182, 33.431928 ], "pop" : 4866, "state" : "AZ" } +{ "_id" : "85540", "city" : "MORENCI", "loc" : [ -109.311517, 33.043593 ], "pop" : 5223, "state" : "AZ" } +{ "_id" : "85541", "city" : "PAYSON", "loc" : [ -111.287774, 34.219779 ], "pop" : 13456, "state" : "AZ" } +{ "_id" : "85542", "city" : "PERIDOT", "loc" : [ -110.37252, 33.478874 ], "pop" : 4878, "state" : "AZ" } +{ "_id" : "85543", "city" : "PIMA", "loc" : [ -109.856009, 32.909661 ], "pop" : 2881, "state" : "AZ" } +{ "_id" : "85544", "city" : "STRAWBERRY", "loc" : [ -111.473483, 34.390915 ], "pop" : 1903, "state" : "AZ" } +{ "_id" : "85545", "city" : "ROOSEVELT", "loc" : [ -110.974884, 33.635753 ], "pop" : 65, "state" : "AZ" } +{ "_id" : "85546", "city" : "SAFFORD", "loc" : [ -109.626641, 32.829491 ], "pop" : 2676, "state" : "AZ" } +{ "_id" : "85550", "city" : "SAN CARLOS", "loc" : [ -110.395323, 33.310643 ], "pop" : 2307, "state" : "AZ" } +{ "_id" : "85552", "city" : "THATCHER", "loc" : [ -109.730245, 32.819902 ], "pop" : 15375, "state" : "AZ" } +{ "_id" : "85602", "city" : "BENSON", "loc" : [ -110.294113, 31.98826 ], "pop" : 6141, "state" : "AZ" } +{ "_id" : "85603", "city" : "BISBEE", "loc" : [ -109.911736, 31.408557 ], "pop" : 8471, "state" : "AZ" } +{ "_id" : "85606", "city" : "COCHISE", "loc" : [ -109.92393, 32.097891 ], "pop" : 290, "state" : "AZ" } +{ "_id" : "85607", "city" : "DOUGLAS", "loc" : [ -109.544698, 31.35111 ], "pop" : 17350, "state" : "AZ" } +{ "_id" : "85610", "city" : "ELFRIDA", "loc" : [ -109.619277, 31.713891 ], "pop" : 1655, "state" : "AZ" } +{ "_id" : "85611", "city" : "ELGIN", "loc" : [ -110.611403, 31.66002 ], "pop" : 638, "state" : "AZ" } +{ "_id" : "85613", "city" : "FORT HUACHUCA", "loc" : [ -110.344131, 31.558735 ], "pop" : 8710, "state" : "AZ" } +{ "_id" : "85614", "city" : "GREEN VALLEY", "loc" : [ -111.000253, 31.854271 ], "pop" : 15530, "state" : "AZ" } +{ "_id" : "85615", "city" : "HEREFORD", "loc" : [ -110.204728, 31.403545 ], "pop" : 1762, "state" : "AZ" } +{ "_id" : "85616", "city" : "HUACHUCA CITY", "loc" : [ -110.333414, 31.663896 ], "pop" : 3639, "state" : "AZ" } +{ "_id" : "85617", "city" : "MC NEAL", "loc" : [ -109.630971, 31.502969 ], "pop" : 3135, "state" : "AZ" } +{ "_id" : "85618", "city" : "MAMMOTH", "loc" : [ -110.643961, 32.723875 ], "pop" : 1876, "state" : "AZ" } +{ "_id" : "85621", "city" : "NOGALES", "loc" : [ -110.943508, 31.376969 ], "pop" : 25506, "state" : "AZ" } +{ "_id" : "85623", "city" : "ORACLE", "loc" : [ -110.796126, 32.600506 ], "pop" : 3833, "state" : "AZ" } +{ "_id" : "85624", "city" : "PATAGONIA", "loc" : [ -110.696774, 31.535317 ], "pop" : 1430, "state" : "AZ" } +{ "_id" : "85625", "city" : "PEARCE", "loc" : [ -109.795032, 31.966608 ], "pop" : 2421, "state" : "AZ" } +{ "_id" : "85629", "city" : "SAHUARITA", "loc" : [ -111.000154, 31.945169 ], "pop" : 2973, "state" : "AZ" } +{ "_id" : "85630", "city" : "SAINT DAVID", "loc" : [ -110.215377, 31.897251 ], "pop" : 1928, "state" : "AZ" } +{ "_id" : "85631", "city" : "SAN MANUEL", "loc" : [ -110.656788, 32.695831 ], "pop" : 6253, "state" : "AZ" } +{ "_id" : "85632", "city" : "PORTAL", "loc" : [ -109.367152, 32.208167 ], "pop" : 1485, "state" : "AZ" } +{ "_id" : "85634", "city" : "PISINEMO", "loc" : [ -111.922207, 32.031572 ], "pop" : 9003, "state" : "AZ" } +{ "_id" : "85635", "city" : "SIERRA VISTA", "loc" : [ -110.266565, 31.536467 ], "pop" : 33700, "state" : "AZ" } +{ "_id" : "85637", "city" : "SONOITA", "loc" : [ -110.724418, 31.866154 ], "pop" : 1399, "state" : "AZ" } +{ "_id" : "85638", "city" : "TOMBSTONE", "loc" : [ -110.058449, 31.721598 ], "pop" : 1556, "state" : "AZ" } +{ "_id" : "85640", "city" : "AMADO", "loc" : [ -111.039693, 31.594194 ], "pop" : 813, "state" : "AZ" } +{ "_id" : "85641", "city" : "VAIL", "loc" : [ -110.88375, 32.035926 ], "pop" : 2843, "state" : "AZ" } +{ "_id" : "85643", "city" : "WILLCOX", "loc" : [ -109.863111, 32.372977 ], "pop" : 7297, "state" : "AZ" } +{ "_id" : "85645", "city" : "AMADO", "loc" : [ -111.072233, 31.643759 ], "pop" : 1157, "state" : "AZ" } +{ "_id" : "85653", "city" : "MARANA", "loc" : [ -111.273621, 32.404749 ], "pop" : 7562, "state" : "AZ" } +{ "_id" : "85701", "city" : "TUCSON", "loc" : [ -110.969445, 32.213873 ], "pop" : 5191, "state" : "AZ" } +{ "_id" : "85704", "city" : "CASAS ADOBES", "loc" : [ -110.984593, 32.329175 ], "pop" : 24039, "state" : "AZ" } +{ "_id" : "85705", "city" : "TUCSON", "loc" : [ -110.984536, 32.269088 ], "pop" : 52751, "state" : "AZ" } +{ "_id" : "85706", "city" : "TUCSON", "loc" : [ -110.945127, 32.139172 ], "pop" : 52458, "state" : "AZ" } +{ "_id" : "85708", "city" : "TUCSON", "loc" : [ -110.869283, 32.179989 ], "pop" : 6191, "state" : "AZ" } +{ "_id" : "85710", "city" : "TUCSON", "loc" : [ -110.824046, 32.213813 ], "pop" : 52679, "state" : "AZ" } +{ "_id" : "85711", "city" : "TUCSON", "loc" : [ -110.882892, 32.212729 ], "pop" : 40024, "state" : "AZ" } +{ "_id" : "85712", "city" : "TUCSON", "loc" : [ -110.886919, 32.250043 ], "pop" : 28813, "state" : "AZ" } +{ "_id" : "85713", "city" : "TUCSON", "loc" : [ -110.973896, 32.194065 ], "pop" : 40625, "state" : "AZ" } +{ "_id" : "85714", "city" : "TUCSON", "loc" : [ -110.971891, 32.170657 ], "pop" : 16488, "state" : "AZ" } +{ "_id" : "85715", "city" : "TUCSON", "loc" : [ -110.834837, 32.269213 ], "pop" : 33197, "state" : "AZ" } +{ "_id" : "85716", "city" : "TUCSON", "loc" : [ -110.922176, 32.246815 ], "pop" : 32258, "state" : "AZ" } +{ "_id" : "85718", "city" : "TUCSON", "loc" : [ -110.917882, 32.311154 ], "pop" : 22441, "state" : "AZ" } +{ "_id" : "85719", "city" : "TUCSON", "loc" : [ -110.949142, 32.247426 ], "pop" : 39019, "state" : "AZ" } +{ "_id" : "85730", "city" : "TUCSON", "loc" : [ -110.81904, 32.180951 ], "pop" : 33251, "state" : "AZ" } +{ "_id" : "85735", "city" : "TUCSON", "loc" : [ -111.260758, 32.057796 ], "pop" : 2987, "state" : "AZ" } +{ "_id" : "85736", "city" : "TUCSON", "loc" : [ -111.317842, 31.667909 ], "pop" : 1130, "state" : "AZ" } +{ "_id" : "85737", "city" : "ORO VALLEY", "loc" : [ -110.954463, 32.431679 ], "pop" : 14077, "state" : "AZ" } +{ "_id" : "85741", "city" : "TUCSON", "loc" : [ -111.041873, 32.347215 ], "pop" : 36400, "state" : "AZ" } +{ "_id" : "85743", "city" : "TUCSON", "loc" : [ -111.177071, 32.33655 ], "pop" : 4507, "state" : "AZ" } +{ "_id" : "85745", "city" : "TUCSON", "loc" : [ -111.017907, 32.243359 ], "pop" : 25143, "state" : "AZ" } +{ "_id" : "85746", "city" : "TUCSON", "loc" : [ -111.050569, 32.142244 ], "pop" : 34683, "state" : "AZ" } +{ "_id" : "85747", "city" : "TUCSON", "loc" : [ -110.667337, 32.071142 ], "pop" : 2286, "state" : "AZ" } +{ "_id" : "85748", "city" : "TUCSON", "loc" : [ -110.775765, 32.214981 ], "pop" : 9675, "state" : "AZ" } +{ "_id" : "85749", "city" : "TUCSON", "loc" : [ -110.765829, 32.273285 ], "pop" : 14254, "state" : "AZ" } +{ "_id" : "85901", "city" : "SHOW LOW", "loc" : [ -110.054633, 34.060117 ], "pop" : 16493, "state" : "AZ" } +{ "_id" : "85920", "city" : "ALPINE", "loc" : [ -109.12829, 33.827878 ], "pop" : 243, "state" : "AZ" } +{ "_id" : "85922", "city" : "BLUE", "loc" : [ -109.06849, 33.651245 ], "pop" : 14, "state" : "AZ" } +{ "_id" : "85924", "city" : "CONCHO", "loc" : [ -109.674096, 34.445787 ], "pop" : 949, "state" : "AZ" } +{ "_id" : "85925", "city" : "EAGAR", "loc" : [ -109.246933, 33.954571 ], "pop" : 482, "state" : "AZ" } +{ "_id" : "85928", "city" : "HEBER", "loc" : [ -110.568647, 34.4163 ], "pop" : 1856, "state" : "AZ" } +{ "_id" : "85929", "city" : "LAKESIDE", "loc" : [ -109.986878, 34.166224 ], "pop" : 5350, "state" : "AZ" } +{ "_id" : "85935", "city" : "PINETOP", "loc" : [ -109.919668, 34.117459 ], "pop" : 1938, "state" : "AZ" } +{ "_id" : "85936", "city" : "SAINT JOHNS", "loc" : [ -109.379617, 34.501008 ], "pop" : 3844, "state" : "AZ" } +{ "_id" : "85937", "city" : "SNOWFLAKE", "loc" : [ -110.080742, 34.495859 ], "pop" : 6678, "state" : "AZ" } +{ "_id" : "85938", "city" : "SPRINGERVILLE", "loc" : [ -109.304066, 34.119333 ], "pop" : 6560, "state" : "AZ" } +{ "_id" : "86001", "city" : "FLAGSTAFF", "loc" : [ -111.661979, 35.185911 ], "pop" : 30174, "state" : "AZ" } +{ "_id" : "86004", "city" : "FLAGSTAFF", "loc" : [ -111.574109, 35.225736 ], "pop" : 26878, "state" : "AZ" } +{ "_id" : "86021", "city" : "COLORADO CITY", "loc" : [ -112.952427, 36.976266 ], "pop" : 3065, "state" : "AZ" } +{ "_id" : "86022", "city" : "FREDONIA", "loc" : [ -112.497864, 36.904397 ], "pop" : 1393, "state" : "AZ" } +{ "_id" : "86025", "city" : "HOLBROOK", "loc" : [ -110.143412, 34.908451 ], "pop" : 5567, "state" : "AZ" } +{ "_id" : "86030", "city" : "HOTEVILLA", "loc" : [ -110.566107, 36.211141 ], "pop" : 271, "state" : "AZ" } +{ "_id" : "86033", "city" : "KAYENTA", "loc" : [ -110.265229, 36.688327 ], "pop" : 7549, "state" : "AZ" } +{ "_id" : "86034", "city" : "KEAMS CANYON", "loc" : [ -110.284461, 35.808206 ], "pop" : 3240, "state" : "AZ" } +{ "_id" : "86035", "city" : "LEUPP", "loc" : [ -110.992651, 35.336528 ], "pop" : 2396, "state" : "AZ" } +{ "_id" : "86036", "city" : "MARBLE CANYON", "loc" : [ -111.558166, 36.956943 ], "pop" : 564, "state" : "AZ" } +{ "_id" : "86038", "city" : "MORMON LAKE", "loc" : [ -111.454914, 34.916896 ], "pop" : 55, "state" : "AZ" } +{ "_id" : "86039", "city" : "KYKOTSMOVI VILLA", "loc" : [ -110.368805, 35.579084 ], "pop" : 167, "state" : "AZ" } +{ "_id" : "86040", "city" : "GREENEHAVEN", "loc" : [ -111.43847, 36.896625 ], "pop" : 8428, "state" : "AZ" } +{ "_id" : "86042", "city" : "POLACCA", "loc" : [ -110.51114, 35.811812 ], "pop" : 1723, "state" : "AZ" } +{ "_id" : "86043", "city" : "SECOND MESA", "loc" : [ -110.6472, 35.903782 ], "pop" : 1653, "state" : "AZ" } +{ "_id" : "86044", "city" : "TONALEA", "loc" : [ -110.882042, 35.934555 ], "pop" : 158, "state" : "AZ" } +{ "_id" : "86045", "city" : "TUBA CITY", "loc" : [ -111.268566, 36.103729 ], "pop" : 10514, "state" : "AZ" } +{ "_id" : "86046", "city" : "WILLIAMS", "loc" : [ -112.17075, 35.543398 ], "pop" : 6117, "state" : "AZ" } +{ "_id" : "86047", "city" : "WINSLOW", "loc" : [ -110.511382, 35.16078 ], "pop" : 17429, "state" : "AZ" } +{ "_id" : "86053", "city" : "KAIBITO", "loc" : [ -111.136973, 36.484798 ], "pop" : 6098, "state" : "AZ" } +{ "_id" : "86054", "city" : "SHONTO", "loc" : [ -110.647743, 36.61594 ], "pop" : 2049, "state" : "AZ" } +{ "_id" : "86301", "city" : "PRESCOTT", "loc" : [ -113.022459, 34.629909 ], "pop" : 915, "state" : "AZ" } +{ "_id" : "86303", "city" : "GROOM CREEK", "loc" : [ -112.473459, 34.558577 ], "pop" : 36617, "state" : "AZ" } +{ "_id" : "86314", "city" : "PRESCOTT VALLEY", "loc" : [ -112.326378, 34.601934 ], "pop" : 11396, "state" : "AZ" } +{ "_id" : "86320", "city" : "ASH FORK", "loc" : [ -112.502681, 35.214998 ], "pop" : 563, "state" : "AZ" } +{ "_id" : "86321", "city" : "BAGDAD", "loc" : [ -113.175535, 34.578484 ], "pop" : 1596, "state" : "AZ" } +{ "_id" : "86322", "city" : "CAMP VERDE", "loc" : [ -111.855131, 34.569733 ], "pop" : 6250, "state" : "AZ" } +{ "_id" : "86323", "city" : "CHINO VALLEY", "loc" : [ -112.473099, 34.775739 ], "pop" : 7285, "state" : "AZ" } +{ "_id" : "86324", "city" : "CLARKDALE", "loc" : [ -112.033417, 34.747793 ], "pop" : 7574, "state" : "AZ" } +{ "_id" : "86325", "city" : "CORNVILLE", "loc" : [ -111.908556, 34.725593 ], "pop" : 2612, "state" : "AZ" } +{ "_id" : "86326", "city" : "COTTONWOOD", "loc" : [ -112.009099, 34.705547 ], "pop" : 8530, "state" : "AZ" } +{ "_id" : "86327", "city" : "DEWEY", "loc" : [ -112.256665, 34.536753 ], "pop" : 3965, "state" : "AZ" } +{ "_id" : "86332", "city" : "KIRKLAND", "loc" : [ -112.896641, 34.454149 ], "pop" : 186, "state" : "AZ" } +{ "_id" : "86333", "city" : "MAYER", "loc" : [ -112.129551, 34.365535 ], "pop" : 3248, "state" : "AZ" } +{ "_id" : "86334", "city" : "PAULDEN", "loc" : [ -112.544105, 35.03129 ], "pop" : 24, "state" : "AZ" } +{ "_id" : "86335", "city" : "RIMROCK", "loc" : [ -111.784222, 34.63799 ], "pop" : 1743, "state" : "AZ" } +{ "_id" : "86336", "city" : "SEDONA", "loc" : [ -111.750627, 34.826645 ], "pop" : 13225, "state" : "AZ" } +{ "_id" : "86337", "city" : "SELIGMAN", "loc" : [ -112.954805, 35.321246 ], "pop" : 693, "state" : "AZ" } +{ "_id" : "86343", "city" : "CROWN KING", "loc" : [ -112.333971, 34.224062 ], "pop" : 105, "state" : "AZ" } +{ "_id" : "86401", "city" : "KINGMAN", "loc" : [ -114.05689, 35.258379 ], "pop" : 32002, "state" : "AZ" } +{ "_id" : "86403", "city" : "DESERT HILLS", "loc" : [ -114.308083, 34.492879 ], "pop" : 26718, "state" : "AZ" } +{ "_id" : "86412", "city" : "HUALAPAI", "loc" : [ -113.295324, 35.540732 ], "pop" : 2, "state" : "AZ" } +{ "_id" : "86430", "city" : "BULLHEAD CITY", "loc" : [ -114.588816, 35.014832 ], "pop" : 3196, "state" : "AZ" } +{ "_id" : "86432", "city" : "LITTLEFIELD", "loc" : [ -113.913693, 36.866524 ], "pop" : 87, "state" : "AZ" } +{ "_id" : "86434", "city" : "PEACH SPRINGS", "loc" : [ -113.420199, 35.537795 ], "pop" : 798, "state" : "AZ" } +{ "_id" : "86435", "city" : "SUPAI", "loc" : [ -112.693212, 36.224157 ], "pop" : 423, "state" : "AZ" } +{ "_id" : "86436", "city" : "TOPOCK", "loc" : [ -114.481666, 34.778388 ], "pop" : 912, "state" : "AZ" } +{ "_id" : "86440", "city" : "MOHAVE VALLEY", "loc" : [ -114.595115, 34.892942 ], "pop" : 4139, "state" : "AZ" } +{ "_id" : "86441", "city" : "DOLAN SPRINGS", "loc" : [ -114.547771, 35.774789 ], "pop" : 68, "state" : "AZ" } +{ "_id" : "86442", "city" : "BULLHEAD CITY", "loc" : [ -114.594737, 35.106001 ], "pop" : 22394, "state" : "AZ" } +{ "_id" : "86444", "city" : "MEADVIEW", "loc" : [ -114.327696, 35.813733 ], "pop" : 118, "state" : "AZ" } +{ "_id" : "86502", "city" : "CHAMBERS", "loc" : [ -109.37389, 35.143044 ], "pop" : 1085, "state" : "AZ" } +{ "_id" : "86503", "city" : "CHINLE", "loc" : [ -109.603693, 36.130367 ], "pop" : 10679, "state" : "AZ" } +{ "_id" : "86505", "city" : "GANADO", "loc" : [ -109.283168, 35.651844 ], "pop" : 23428, "state" : "AZ" } +{ "_id" : "86507", "city" : "LUKACHUKAI", "loc" : [ -109.244614, 36.418111 ], "pop" : 1665, "state" : "AZ" } +{ "_id" : "86509", "city" : "NAVAJO", "loc" : [ -109.396217, 34.817202 ], "pop" : 41, "state" : "AZ" } +{ "_id" : "86510", "city" : "PINON", "loc" : [ -110.221077, 36.100243 ], "pop" : 5911, "state" : "AZ" } +{ "_id" : "86514", "city" : "TEEC NOS POS", "loc" : [ -109.359039, 36.779694 ], "pop" : 4941, "state" : "AZ" } +{ "_id" : "86535", "city" : "DENNEHOTSO", "loc" : [ -109.861001, 36.777286 ], "pop" : 1693, "state" : "AZ" } +{ "_id" : "86538", "city" : "MANY FARMS", "loc" : [ -109.634021, 36.408259 ], "pop" : 4172, "state" : "AZ" } +{ "_id" : "86556", "city" : "TSAILE", "loc" : [ -109.217627, 36.307075 ], "pop" : 1593, "state" : "AZ" } +{ "_id" : "87001", "city" : "ALGODONES", "loc" : [ -106.616589, 35.428527 ], "pop" : 0, "state" : "NM" } +{ "_id" : "87002", "city" : "BOYS RANCH", "loc" : [ -106.761215, 34.645562 ], "pop" : 14826, "state" : "NM" } +{ "_id" : "87004", "city" : "BERNALILLO", "loc" : [ -106.530873, 35.328506 ], "pop" : 7113, "state" : "NM" } +{ "_id" : "87005", "city" : "BLUEWATER", "loc" : [ -108.191663, 35.164724 ], "pop" : 1611, "state" : "NM" } +{ "_id" : "87006", "city" : "BOSQUE", "loc" : [ -106.8038, 34.49956 ], "pop" : 276, "state" : "NM" } +{ "_id" : "87007", "city" : "CASA BLANCA", "loc" : [ -107.433907, 35.035222 ], "pop" : 2986, "state" : "NM" } +{ "_id" : "87008", "city" : "CEDAR CREST", "loc" : [ -106.361737, 35.128506 ], "pop" : 1860, "state" : "NM" } +{ "_id" : "87009", "city" : "CEDARVALE", "loc" : [ -105.734516, 34.388028 ], "pop" : 66, "state" : "NM" } +{ "_id" : "87010", "city" : "CERRILLOS", "loc" : [ -106.131683, 35.422965 ], "pop" : 788, "state" : "NM" } +{ "_id" : "87013", "city" : "CUBA", "loc" : [ -107.188462, 36.048201 ], "pop" : 2764, "state" : "NM" } +{ "_id" : "87014", "city" : "CUBERO", "loc" : [ -107.856722, 35.117372 ], "pop" : 16704, "state" : "NM" } +{ "_id" : "87015", "city" : "EDGEWOOD", "loc" : [ -106.187207, 35.077603 ], "pop" : 3032, "state" : "NM" } +{ "_id" : "87016", "city" : "ESTANCIA", "loc" : [ -106.135024, 34.769983 ], "pop" : 2634, "state" : "NM" } +{ "_id" : "87017", "city" : "GALLINA", "loc" : [ -106.661388, 36.171429 ], "pop" : 1003, "state" : "NM" } +{ "_id" : "87018", "city" : "COUNSELOR", "loc" : [ -106.949789, 36.118386 ], "pop" : 566, "state" : "NM" } +{ "_id" : "87020", "city" : "GRANTS", "loc" : [ -107.935662, 35.359802 ], "pop" : 428, "state" : "NM" } +{ "_id" : "87023", "city" : "JARALES", "loc" : [ -107.029912, 34.648156 ], "pop" : 9, "state" : "NM" } +{ "_id" : "87024", "city" : "JEMEZ PUEBLO", "loc" : [ -106.721894, 35.624315 ], "pop" : 2256, "state" : "NM" } +{ "_id" : "87025", "city" : "JEMEZ SPRINGS", "loc" : [ -106.771393, 35.892689 ], "pop" : 1, "state" : "NM" } +{ "_id" : "87026", "city" : "CANONCITO", "loc" : [ -107.105843, 35.085305 ], "pop" : 1272, "state" : "NM" } +{ "_id" : "87027", "city" : "LA JARA", "loc" : [ -106.992335, 36.119383 ], "pop" : 5, "state" : "NM" } +{ "_id" : "87028", "city" : "LAJOYA", "loc" : [ -106.84279, 34.343444 ], "pop" : 74, "state" : "NM" } +{ "_id" : "87029", "city" : "LINDRITH", "loc" : [ -106.925352, 36.336141 ], "pop" : 574, "state" : "NM" } +{ "_id" : "87031", "city" : "LOS LUNAS", "loc" : [ -106.711537, 34.780607 ], "pop" : 23560, "state" : "NM" } +{ "_id" : "87035", "city" : "MORIARTY", "loc" : [ -106.060871, 34.988878 ], "pop" : 5570, "state" : "NM" } +{ "_id" : "87036", "city" : "MOUNTAINAIR", "loc" : [ -106.257738, 34.515775 ], "pop" : 1442, "state" : "NM" } +{ "_id" : "87041", "city" : "COCHITI PUEBLO", "loc" : [ -106.343472, 35.603104 ], "pop" : 1527, "state" : "NM" } +{ "_id" : "87042", "city" : "PERALTA", "loc" : [ -106.687159, 34.833188 ], "pop" : 2672, "state" : "NM" } +{ "_id" : "87043", "city" : "PLACITAS", "loc" : [ -106.529279, 35.309175 ], "pop" : 8357, "state" : "NM" } +{ "_id" : "87044", "city" : "PONDEROSA", "loc" : [ -106.654421, 35.797576 ], "pop" : 1092, "state" : "NM" } +{ "_id" : "87045", "city" : "PREWITT", "loc" : [ -108.103798, 35.35466 ], "pop" : 1114, "state" : "NM" } +{ "_id" : "87046", "city" : "REGINA", "loc" : [ -107.071932, 36.20283 ], "pop" : 0, "state" : "NM" } +{ "_id" : "87047", "city" : "SANDIA PARK", "loc" : [ -106.323846, 35.168275 ], "pop" : 2672, "state" : "NM" } +{ "_id" : "87048", "city" : "CORRALES", "loc" : [ -106.620034, 35.233888 ], "pop" : 4900, "state" : "NM" } +{ "_id" : "87050", "city" : "SAN MATEO", "loc" : [ -107.70498, 35.222614 ], "pop" : 912, "state" : "NM" } +{ "_id" : "87052", "city" : "SANTO DOMINGO PU", "loc" : [ -106.361275, 35.513892 ], "pop" : 3030, "state" : "NM" } +{ "_id" : "87053", "city" : "ZIA PUEBLO", "loc" : [ -106.737467, 35.524241 ], "pop" : 877, "state" : "NM" } +{ "_id" : "87055", "city" : "SEBOYETA", "loc" : [ -107.382281, 35.149322 ], "pop" : 1356, "state" : "NM" } +{ "_id" : "87056", "city" : "STANLEY", "loc" : [ -106.028299, 35.12948 ], "pop" : 552, "state" : "NM" } +{ "_id" : "87059", "city" : "TIJERAS", "loc" : [ -106.306226, 35.044563 ], "pop" : 6861, "state" : "NM" } +{ "_id" : "87062", "city" : "VEGUITA", "loc" : [ -106.759148, 34.485032 ], "pop" : 817, "state" : "NM" } +{ "_id" : "87063", "city" : "WILLARD", "loc" : [ -106.030706, 34.57543 ], "pop" : 276, "state" : "NM" } +{ "_id" : "87068", "city" : "BOSQUE FARMS", "loc" : [ -106.697506, 34.876366 ], "pop" : 6286, "state" : "NM" } +{ "_id" : "87102", "city" : "ALBUQUERQUE", "loc" : [ -106.648171, 35.081831 ], "pop" : 20645, "state" : "NM" } +{ "_id" : "87104", "city" : "ALBUQUERQUE", "loc" : [ -106.671215, 35.103822 ], "pop" : 11889, "state" : "NM" } +{ "_id" : "87105", "city" : "ALBUQUERQUE", "loc" : [ -106.689341, 35.044761 ], "pop" : 50233, "state" : "NM" } +{ "_id" : "87106", "city" : "ALBUQUERQUE", "loc" : [ -106.616917, 35.079011 ], "pop" : 26482, "state" : "NM" } +{ "_id" : "87107", "city" : "ALBUQUERQUE", "loc" : [ -106.642747, 35.134742 ], "pop" : 30302, "state" : "NM" } +{ "_id" : "87108", "city" : "ALBUQUERQUE", "loc" : [ -106.574864, 35.072586 ], "pop" : 36704, "state" : "NM" } +{ "_id" : "87109", "city" : "ALBUQUERQUE", "loc" : [ -106.569004, 35.15058 ], "pop" : 39310, "state" : "NM" } +{ "_id" : "87110", "city" : "ALBUQUERQUE", "loc" : [ -106.578052, 35.110417 ], "pop" : 42652, "state" : "NM" } +{ "_id" : "87111", "city" : "ALBUQUERQUE", "loc" : [ -106.522164, 35.134724 ], "pop" : 47455, "state" : "NM" } +{ "_id" : "87112", "city" : "ALBUQUERQUE", "loc" : [ -106.518338, 35.101026 ], "pop" : 45478, "state" : "NM" } +{ "_id" : "87113", "city" : "ALBUQUERQUE", "loc" : [ -106.601467, 35.175906 ], "pop" : 3622, "state" : "NM" } +{ "_id" : "87114", "city" : "ALAMEDA", "loc" : [ -106.659138, 35.195612 ], "pop" : 16352, "state" : "NM" } +{ "_id" : "87115", "city" : "KIRTLAND A F B E", "loc" : [ -106.513896, 34.904876 ], "pop" : 0, "state" : "NM" } +{ "_id" : "87116", "city" : "ALBUQUERQUE", "loc" : [ -106.550605, 35.056116 ], "pop" : 5761, "state" : "NM" } +{ "_id" : "87118", "city" : "ALBUQUERQUE", "loc" : [ -106.595802, 35.055443 ], "pop" : 3067, "state" : "NM" } +{ "_id" : "87120", "city" : "ALBUQUERQUE", "loc" : [ -106.704137, 35.142146 ], "pop" : 23796, "state" : "NM" } +{ "_id" : "87121", "city" : "ALBUQUERQUE", "loc" : [ -106.726861, 35.051209 ], "pop" : 22253, "state" : "NM" } +{ "_id" : "87122", "city" : "ALBUQUERQUE", "loc" : [ -106.510176, 35.178715 ], "pop" : 6127, "state" : "NM" } +{ "_id" : "87123", "city" : "ALBUQUERQUE", "loc" : [ -106.509003, 35.07166 ], "pop" : 33808, "state" : "NM" } +{ "_id" : "87124", "city" : "RIO RANCHO", "loc" : [ -106.681756, 35.249347 ], "pop" : 29586, "state" : "NM" } +{ "_id" : "87301", "city" : "GALLUP", "loc" : [ -108.741352, 35.506475 ], "pop" : 32311, "state" : "NM" } +{ "_id" : "87310", "city" : "BRIMHALL", "loc" : [ -108.581469, 35.800503 ], "pop" : 119, "state" : "NM" } +{ "_id" : "87312", "city" : "CONTINENTAL DIVI", "loc" : [ -108.469256, 35.504295 ], "pop" : 704, "state" : "NM" } +{ "_id" : "87313", "city" : "CROWNPOINT", "loc" : [ -108.02709, 35.720557 ], "pop" : 6400, "state" : "NM" } +{ "_id" : "87315", "city" : "FENCE LAKE", "loc" : [ -108.693392, 34.734385 ], "pop" : 112, "state" : "NM" } +{ "_id" : "87320", "city" : "MEXICAN SPRINGS", "loc" : [ -108.818964, 35.783727 ], "pop" : 562, "state" : "NM" } +{ "_id" : "87321", "city" : "RAMAH", "loc" : [ -108.491951, 35.132375 ], "pop" : 517, "state" : "NM" } +{ "_id" : "87323", "city" : "THOREAU", "loc" : [ -107.830218, 35.57869 ], "pop" : 4254, "state" : "NM" } +{ "_id" : "87324", "city" : "TOADLENA", "loc" : [ -108.750647, 36.073202 ], "pop" : 2097, "state" : "NM" } +{ "_id" : "87325", "city" : "TOHATCHI", "loc" : [ -108.687818, 35.768609 ], "pop" : 5648, "state" : "NM" } +{ "_id" : "87327", "city" : "ZUNI", "loc" : [ -108.833611, 35.06845 ], "pop" : 7382, "state" : "NM" } +{ "_id" : "87328", "city" : "NAVAJO", "loc" : [ -109.022621, 35.894193 ], "pop" : 2715, "state" : "NM" } +{ "_id" : "87401", "city" : "FARMINGTON", "loc" : [ -108.199531, 36.706514 ], "pop" : 36782, "state" : "NM" } +{ "_id" : "87402", "city" : "FARMINGTON", "loc" : [ -108.147766, 36.768503 ], "pop" : 7238, "state" : "NM" } +{ "_id" : "87410", "city" : "AZTEC", "loc" : [ -108.010982, 36.820499 ], "pop" : 10951, "state" : "NM" } +{ "_id" : "87412", "city" : "BLANCO", "loc" : [ -107.795276, 36.725612 ], "pop" : 1007, "state" : "NM" } +{ "_id" : "87413", "city" : "BLOOMFIELD", "loc" : [ -107.978437, 36.695475 ], "pop" : 9612, "state" : "NM" } +{ "_id" : "87415", "city" : "FLORA VISTA", "loc" : [ -108.082683, 36.802771 ], "pop" : 2634, "state" : "NM" } +{ "_id" : "87416", "city" : "FRUITLAND", "loc" : [ -108.45339, 36.76323 ], "pop" : 819, "state" : "NM" } +{ "_id" : "87417", "city" : "KIRTLAND", "loc" : [ -108.350956, 36.740953 ], "pop" : 5087, "state" : "NM" } +{ "_id" : "87418", "city" : "LA PLATA", "loc" : [ -108.179243, 36.957632 ], "pop" : 163, "state" : "NM" } +{ "_id" : "87419", "city" : "NAVAJO DAM", "loc" : [ -107.670991, 36.833838 ], "pop" : 32, "state" : "NM" } +{ "_id" : "87420", "city" : "SHIPROCK", "loc" : [ -108.735479, 36.655981 ], "pop" : 14805, "state" : "NM" } +{ "_id" : "87421", "city" : "WATERFLOW", "loc" : [ -108.431083, 36.780092 ], "pop" : 378, "state" : "NM" } +{ "_id" : "87501", "city" : "POJOAQUE VALLEY", "loc" : [ -105.974818, 35.702472 ], "pop" : 51715, "state" : "NM" } +{ "_id" : "87505", "city" : "SANTA FE", "loc" : [ -105.981994, 35.619623 ], "pop" : 34054, "state" : "NM" } +{ "_id" : "87510", "city" : "ABIQUIU", "loc" : [ -106.244859, 36.176923 ], "pop" : 1538, "state" : "NM" } +{ "_id" : "87513", "city" : "ARROYO HONDO", "loc" : [ -105.621998, 36.531848 ], "pop" : 1333, "state" : "NM" } +{ "_id" : "87514", "city" : "ARROYO SECO", "loc" : [ -105.594609, 36.504568 ], "pop" : 782, "state" : "NM" } +{ "_id" : "87520", "city" : "CHAMA", "loc" : [ -106.582928, 36.896214 ], "pop" : 1103, "state" : "NM" } +{ "_id" : "87521", "city" : "CHAMISAL", "loc" : [ -105.68461, 36.160411 ], "pop" : 2147, "state" : "NM" } +{ "_id" : "87522", "city" : "CUNDIYO", "loc" : [ -105.911441, 36.011906 ], "pop" : 4380, "state" : "NM" } +{ "_id" : "87524", "city" : "COSTILLA", "loc" : [ -105.501586, 36.952556 ], "pop" : 495, "state" : "NM" } +{ "_id" : "87527", "city" : "DIXON", "loc" : [ -105.86148, 36.179 ], "pop" : 1320, "state" : "NM" } +{ "_id" : "87528", "city" : "DULCE", "loc" : [ -107.060179, 36.859808 ], "pop" : 2936, "state" : "NM" } +{ "_id" : "87530", "city" : "EL RITO", "loc" : [ -106.21917, 36.364694 ], "pop" : 928, "state" : "NM" } +{ "_id" : "87531", "city" : "EMBUDO", "loc" : [ -106.024187, 36.137028 ], "pop" : 3377, "state" : "NM" } +{ "_id" : "87532", "city" : "ESPANOLA", "loc" : [ -106.071697, 35.987157 ], "pop" : 9437, "state" : "NM" } +{ "_id" : "87535", "city" : "GLORIETA", "loc" : [ -105.790316, 35.566645 ], "pop" : 1246, "state" : "NM" } +{ "_id" : "87537", "city" : "HERNANDEZ", "loc" : [ -106.139579, 36.073811 ], "pop" : 832, "state" : "NM" } +{ "_id" : "87539", "city" : "LA MADERA", "loc" : [ -106.13443, 36.246387 ], "pop" : 75, "state" : "NM" } +{ "_id" : "87540", "city" : "LAMY", "loc" : [ -105.940906, 35.431057 ], "pop" : 516, "state" : "NM" } +{ "_id" : "87544", "city" : "LOS ALAMOS", "loc" : [ -106.267624, 35.866321 ], "pop" : 18122, "state" : "NM" } +{ "_id" : "87549", "city" : "OJO CALIENTE", "loc" : [ -105.915507, 36.40991 ], "pop" : 453, "state" : "NM" } +{ "_id" : "87552", "city" : "PECOS", "loc" : [ -105.670104, 35.571011 ], "pop" : 2534, "state" : "NM" } +{ "_id" : "87553", "city" : "PENASCO", "loc" : [ -105.734245, 36.176023 ], "pop" : 632, "state" : "NM" } +{ "_id" : "87556", "city" : "QUESTA", "loc" : [ -105.560984, 36.72572 ], "pop" : 2881, "state" : "NM" } +{ "_id" : "87557", "city" : "RANCHOS DE TAOS", "loc" : [ -105.608576, 36.335692 ], "pop" : 174, "state" : "NM" } +{ "_id" : "87560", "city" : "RIBERA", "loc" : [ -105.465228, 35.334448 ], "pop" : 1619, "state" : "NM" } +{ "_id" : "87563", "city" : "RUTHERON", "loc" : [ -106.685267, 36.647146 ], "pop" : 38, "state" : "NM" } +{ "_id" : "87564", "city" : "SAN CRISTOBAL", "loc" : [ -105.635968, 36.611638 ], "pop" : 326, "state" : "NM" } +{ "_id" : "87565", "city" : "SAN JOSE", "loc" : [ -105.438341, 35.456949 ], "pop" : 844, "state" : "NM" } +{ "_id" : "87566", "city" : "SAN JUAN PUEBLO", "loc" : [ -106.079267, 36.048886 ], "pop" : 5209, "state" : "NM" } +{ "_id" : "87567", "city" : "SANTA CRUZ", "loc" : [ -106.031839, 35.986011 ], "pop" : 5947, "state" : "NM" } +{ "_id" : "87571", "city" : "TAOS", "loc" : [ -105.584732, 36.395288 ], "pop" : 13297, "state" : "NM" } +{ "_id" : "87573", "city" : "TERERRO", "loc" : [ -105.645725, 35.736881 ], "pop" : 99, "state" : "NM" } +{ "_id" : "87575", "city" : "TIERRA AMARILLA", "loc" : [ -106.556972, 36.680481 ], "pop" : 1865, "state" : "NM" } +{ "_id" : "87579", "city" : "VADITO", "loc" : [ -105.67818, 36.191305 ], "pop" : 360, "state" : "NM" } +{ "_id" : "87580", "city" : "VALDEZ", "loc" : [ -105.506971, 36.569699 ], "pop" : 238, "state" : "NM" } +{ "_id" : "87581", "city" : "VALLECITOS", "loc" : [ -106.085942, 36.516284 ], "pop" : 576, "state" : "NM" } +{ "_id" : "87701", "city" : "LAS VEGAS", "loc" : [ -105.227162, 35.594862 ], "pop" : 19567, "state" : "NM" } +{ "_id" : "87711", "city" : "ANTON CHICO", "loc" : [ -105.141041, 35.159262 ], "pop" : 296, "state" : "NM" } +{ "_id" : "87713", "city" : "CHACON", "loc" : [ -105.385411, 36.138805 ], "pop" : 180, "state" : "NM" } +{ "_id" : "87714", "city" : "CIMARRON", "loc" : [ -105.069694, 36.457424 ], "pop" : 1582, "state" : "NM" } +{ "_id" : "87715", "city" : "CLEVELAND", "loc" : [ -105.43262, 35.989831 ], "pop" : 228, "state" : "NM" } +{ "_id" : "87718", "city" : "EAGLE NEST", "loc" : [ -105.275561, 36.53255 ], "pop" : 463, "state" : "NM" } +{ "_id" : "87722", "city" : "GUADALUPITA", "loc" : [ -105.127814, 36.113046 ], "pop" : 52, "state" : "NM" } +{ "_id" : "87724", "city" : "LA LOMA", "loc" : [ -105.096864, 35.191562 ], "pop" : 233, "state" : "NM" } +{ "_id" : "87725", "city" : "LEDOUX", "loc" : [ -105.421555, 35.919118 ], "pop" : 179, "state" : "NM" } +{ "_id" : "87728", "city" : "MAXWELL", "loc" : [ -104.56395, 36.543393 ], "pop" : 390, "state" : "NM" } +{ "_id" : "87729", "city" : "MIAMI", "loc" : [ -104.811769, 36.28955 ], "pop" : 65, "state" : "NM" } +{ "_id" : "87730", "city" : "MILLS", "loc" : [ -104.227743, 36.128144 ], "pop" : 21, "state" : "NM" } +{ "_id" : "87731", "city" : "MONTEZUMA", "loc" : [ -105.409729, 35.682959 ], "pop" : 62, "state" : "NM" } +{ "_id" : "87732", "city" : "MORA", "loc" : [ -105.312837, 36.00405 ], "pop" : 2636, "state" : "NM" } +{ "_id" : "87733", "city" : "ALBERT", "loc" : [ -103.746132, 35.715938 ], "pop" : 373, "state" : "NM" } +{ "_id" : "87734", "city" : "OCATE", "loc" : [ -105.06595, 36.10366 ], "pop" : 327, "state" : "NM" } +{ "_id" : "87740", "city" : "RATON", "loc" : [ -104.434881, 36.895187 ], "pop" : 8449, "state" : "NM" } +{ "_id" : "87742", "city" : "ROCIADA", "loc" : [ -105.314716, 35.822648 ], "pop" : 480, "state" : "NM" } +{ "_id" : "87743", "city" : "ROY", "loc" : [ -104.149698, 35.952248 ], "pop" : 499, "state" : "NM" } +{ "_id" : "87745", "city" : "SAPELLO", "loc" : [ -105.107735, 35.762012 ], "pop" : 2, "state" : "NM" } +{ "_id" : "87746", "city" : "SOLANO", "loc" : [ -104.1221, 35.837828 ], "pop" : 87, "state" : "NM" } +{ "_id" : "87747", "city" : "SPRINGER", "loc" : [ -104.592705, 36.37672 ], "pop" : 1976, "state" : "NM" } +{ "_id" : "87750", "city" : "VALMORA", "loc" : [ -104.911587, 35.794033 ], "pop" : 138, "state" : "NM" } +{ "_id" : "87752", "city" : "WAGON MOUND", "loc" : [ -104.691, 35.981361 ], "pop" : 524, "state" : "NM" } +{ "_id" : "87801", "city" : "SOCORRO", "loc" : [ -106.890659, 34.047853 ], "pop" : 9663, "state" : "NM" } +{ "_id" : "87815", "city" : "BINGHAM", "loc" : [ -106.021163, 34.043864 ], "pop" : 33, "state" : "NM" } +{ "_id" : "87820", "city" : "ARAGON", "loc" : [ -108.546589, 33.88592 ], "pop" : 149, "state" : "NM" } +{ "_id" : "87821", "city" : "DATIL", "loc" : [ -108.018284, 34.04269 ], "pop" : 340, "state" : "NM" } +{ "_id" : "87823", "city" : "LEMITAR", "loc" : [ -106.904381, 34.155999 ], "pop" : 439, "state" : "NM" } +{ "_id" : "87825", "city" : "ALAMO", "loc" : [ -107.340647, 34.241178 ], "pop" : 2715, "state" : "NM" } +{ "_id" : "87827", "city" : "PIE TOWN", "loc" : [ -108.368187, 34.324282 ], "pop" : 396, "state" : "NM" } +{ "_id" : "87828", "city" : "POLVADERA", "loc" : [ -106.897505, 34.134672 ], "pop" : 225, "state" : "NM" } +{ "_id" : "87829", "city" : "QUEMADO", "loc" : [ -108.757835, 34.265158 ], "pop" : 188, "state" : "NM" } +{ "_id" : "87830", "city" : "RESERVE", "loc" : [ -108.800918, 33.688074 ], "pop" : 1172, "state" : "NM" } +{ "_id" : "87831", "city" : "SAN ACACIA", "loc" : [ -106.904884, 34.228328 ], "pop" : 522, "state" : "NM" } +{ "_id" : "87901", "city" : "TRUTH OR CONSEQU", "loc" : [ -107.248794, 33.139478 ], "pop" : 7794, "state" : "NM" } +{ "_id" : "87930", "city" : "ARREY", "loc" : [ -107.354368, 32.802057 ], "pop" : 555, "state" : "NM" } +{ "_id" : "87931", "city" : "CABALLO", "loc" : [ -107.347113, 33.013452 ], "pop" : 860, "state" : "NM" } +{ "_id" : "87932", "city" : "CUCHILLO", "loc" : [ -107.456536, 33.370269 ], "pop" : 125, "state" : "NM" } +{ "_id" : "87933", "city" : "DERRY", "loc" : [ -107.284271, 32.808561 ], "pop" : 118, "state" : "NM" } +{ "_id" : "87936", "city" : "GARFIELD", "loc" : [ -107.270409, 32.755749 ], "pop" : 432, "state" : "NM" } +{ "_id" : "87937", "city" : "HATCH", "loc" : [ -107.159028, 32.658335 ], "pop" : 2314, "state" : "NM" } +{ "_id" : "87940", "city" : "RINCON", "loc" : [ -107.064343, 32.65969 ], "pop" : 394, "state" : "NM" } +{ "_id" : "87941", "city" : "SALEM", "loc" : [ -107.215689, 32.709322 ], "pop" : 709, "state" : "NM" } +{ "_id" : "87942", "city" : "WILLIAMSBURG", "loc" : [ -107.337583, 33.226498 ], "pop" : 58, "state" : "NM" } +{ "_id" : "87943", "city" : "WINSTON", "loc" : [ -107.667456, 33.306089 ], "pop" : 97, "state" : "NM" } +{ "_id" : "88001", "city" : "LAS CRUCES", "loc" : [ -106.746034, 32.321641 ], "pop" : 57502, "state" : "NM" } +{ "_id" : "88002", "city" : "WHITE SANDS MISS", "loc" : [ -106.49236, 32.382669 ], "pop" : 2616, "state" : "NM" } +{ "_id" : "88005", "city" : "LAS CRUCES", "loc" : [ -106.79908, 32.316076 ], "pop" : 40042, "state" : "NM" } +{ "_id" : "88020", "city" : "ANIMAS", "loc" : [ -108.585695, 31.793696 ], "pop" : 1291, "state" : "NM" } +{ "_id" : "88021", "city" : "CHAPARRAL", "loc" : [ -106.573452, 31.934505 ], "pop" : 24480, "state" : "NM" } +{ "_id" : "88023", "city" : "VANADIUM", "loc" : [ -108.107667, 32.756334 ], "pop" : 3694, "state" : "NM" } +{ "_id" : "88025", "city" : "BUCKHORN", "loc" : [ -108.477951, 32.813466 ], "pop" : 1822, "state" : "NM" } +{ "_id" : "88026", "city" : "CENTRAL", "loc" : [ -108.162698, 32.779767 ], "pop" : 3161, "state" : "NM" } +{ "_id" : "88030", "city" : "DEMING", "loc" : [ -107.746559, 32.231808 ], "pop" : 18110, "state" : "NM" } +{ "_id" : "88039", "city" : "GLENWOOD", "loc" : [ -108.774282, 33.304789 ], "pop" : 318, "state" : "NM" } +{ "_id" : "88041", "city" : "SAN LORENZO", "loc" : [ -108.082185, 32.853311 ], "pop" : 271, "state" : "NM" } +{ "_id" : "88042", "city" : "HILLSBORO", "loc" : [ -107.6276, 32.923913 ], "pop" : 305, "state" : "NM" } +{ "_id" : "88043", "city" : "HURLEY", "loc" : [ -108.15162, 32.64799 ], "pop" : 1775, "state" : "NM" } +{ "_id" : "88044", "city" : "LA MESA", "loc" : [ -106.701103, 32.082312 ], "pop" : 3370, "state" : "NM" } +{ "_id" : "88045", "city" : "ROAD FORKS", "loc" : [ -108.754657, 32.314032 ], "pop" : 4667, "state" : "NM" } +{ "_id" : "88047", "city" : "MESILLA PARK", "loc" : [ -106.637016, 32.297725 ], "pop" : 83, "state" : "NM" } +{ "_id" : "88048", "city" : "MESQUITE", "loc" : [ -106.667626, 32.145958 ], "pop" : 3568, "state" : "NM" } +{ "_id" : "88049", "city" : "MIMBRES", "loc" : [ -107.942326, 32.860936 ], "pop" : 818, "state" : "NM" } +{ "_id" : "88061", "city" : "SILVER CITY", "loc" : [ -108.274916, 32.789986 ], "pop" : 16135, "state" : "NM" } +{ "_id" : "88101", "city" : "CLOVIS", "loc" : [ -103.221391, 34.412585 ], "pop" : 39152, "state" : "NM" } +{ "_id" : "88112", "city" : "BROADVIEW", "loc" : [ -103.129235, 34.803956 ], "pop" : 175, "state" : "NM" } +{ "_id" : "88113", "city" : "CAUSEY", "loc" : [ -103.150201, 33.892926 ], "pop" : 229, "state" : "NM" } +{ "_id" : "88114", "city" : "CROSSROADS", "loc" : [ -103.356387, 33.527186 ], "pop" : 17, "state" : "NM" } +{ "_id" : "88116", "city" : "ELIDA", "loc" : [ -103.632341, 33.940468 ], "pop" : 503, "state" : "NM" } +{ "_id" : "88118", "city" : "FLOYD", "loc" : [ -103.582707, 34.251951 ], "pop" : 681, "state" : "NM" } +{ "_id" : "88119", "city" : "FORT SUMNER", "loc" : [ -104.231689, 34.460018 ], "pop" : 1934, "state" : "NM" } +{ "_id" : "88120", "city" : "GRADY", "loc" : [ -103.298043, 34.810697 ], "pop" : 265, "state" : "NM" } +{ "_id" : "88121", "city" : "HOUSE", "loc" : [ -103.920256, 34.695156 ], "pop" : 235, "state" : "NM" } +{ "_id" : "88123", "city" : "LINGO", "loc" : [ -103.208161, 33.696291 ], "pop" : 52, "state" : "NM" } +{ "_id" : "88124", "city" : "MELROSE", "loc" : [ -103.632507, 34.44787 ], "pop" : 976, "state" : "NM" } +{ "_id" : "88125", "city" : "MILNESAND", "loc" : [ -103.278189, 33.60501 ], "pop" : 10, "state" : "NM" } +{ "_id" : "88126", "city" : "PEP", "loc" : [ -103.327208, 33.897032 ], "pop" : 369, "state" : "NM" } +{ "_id" : "88130", "city" : "PORTALES", "loc" : [ -103.336311, 34.179915 ], "pop" : 14828, "state" : "NM" } +{ "_id" : "88132", "city" : "ROGERS", "loc" : [ -103.127527, 34.024759 ], "pop" : 30, "state" : "NM" } +{ "_id" : "88133", "city" : "SAINT VRAIN", "loc" : [ -103.453239, 34.465205 ], "pop" : 188, "state" : "NM" } +{ "_id" : "88134", "city" : "TAIBAN", "loc" : [ -104.032899, 34.424829 ], "pop" : 94, "state" : "NM" } +{ "_id" : "88135", "city" : "TEXICO", "loc" : [ -103.061544, 34.395795 ], "pop" : 1451, "state" : "NM" } +{ "_id" : "88136", "city" : "YESO", "loc" : [ -104.527582, 34.474962 ], "pop" : 224, "state" : "NM" } +{ "_id" : "88201", "city" : "ROSWELL", "loc" : [ -104.525857, 33.388504 ], "pop" : 53644, "state" : "NM" } +{ "_id" : "88210", "city" : "ARTESIA", "loc" : [ -104.407401, 32.838355 ], "pop" : 14689, "state" : "NM" } +{ "_id" : "88213", "city" : "CAPROCK", "loc" : [ -103.639009, 33.393855 ], "pop" : 19, "state" : "NM" } +{ "_id" : "88220", "city" : "CARLSBAD", "loc" : [ -104.239539, 32.411867 ], "pop" : 31888, "state" : "NM" } +{ "_id" : "88230", "city" : "DEXTER", "loc" : [ -104.383285, 33.191006 ], "pop" : 2056, "state" : "NM" } +{ "_id" : "88231", "city" : "EUNICE", "loc" : [ -103.159407, 32.439225 ], "pop" : 3014, "state" : "NM" } +{ "_id" : "88232", "city" : "HAGERMAN", "loc" : [ -104.329778, 33.107643 ], "pop" : 1409, "state" : "NM" } +{ "_id" : "88240", "city" : "HOBBS", "loc" : [ -103.137246, 32.72217 ], "pop" : 36880, "state" : "NM" } +{ "_id" : "88250", "city" : "HOPE", "loc" : [ -104.729921, 32.81561 ], "pop" : 177, "state" : "NM" } +{ "_id" : "88252", "city" : "JAL", "loc" : [ -103.199724, 32.112816 ], "pop" : 2335, "state" : "NM" } +{ "_id" : "88253", "city" : "LAKE ARTHUR", "loc" : [ -104.406412, 33.017106 ], "pop" : 740, "state" : "NM" } +{ "_id" : "88256", "city" : "LOVING", "loc" : [ -104.091376, 32.274034 ], "pop" : 1851, "state" : "NM" } +{ "_id" : "88260", "city" : "LOVINGTON", "loc" : [ -103.348849, 32.951166 ], "pop" : 12046, "state" : "NM" } +{ "_id" : "88264", "city" : "MALJAMAR", "loc" : [ -103.723401, 32.842281 ], "pop" : 61, "state" : "NM" } +{ "_id" : "88265", "city" : "MONUMENT", "loc" : [ -103.270256, 32.587405 ], "pop" : 0, "state" : "NM" } +{ "_id" : "88266", "city" : "OIL CENTER", "loc" : [ -103.301915, 32.490383 ], "pop" : 0, "state" : "NM" } +{ "_id" : "88267", "city" : "TATUM", "loc" : [ -103.314, 33.260018 ], "pop" : 1393, "state" : "NM" } +{ "_id" : "88301", "city" : "CARRIZOZO", "loc" : [ -105.869617, 33.64962 ], "pop" : 1288, "state" : "NM" } +{ "_id" : "88310", "city" : "ALAMOGORDO", "loc" : [ -105.948544, 32.893186 ], "pop" : 31204, "state" : "NM" } +{ "_id" : "88314", "city" : "BENT", "loc" : [ -105.863472, 33.148014 ], "pop" : 172, "state" : "NM" } +{ "_id" : "88316", "city" : "CAPITAN", "loc" : [ -105.526906, 33.560232 ], "pop" : 1760, "state" : "NM" } +{ "_id" : "88317", "city" : "CLOUDCROFT", "loc" : [ -105.939028, 32.574067 ], "pop" : 4482, "state" : "NM" } +{ "_id" : "88318", "city" : "CORONA", "loc" : [ -105.533873, 34.169259 ], "pop" : 496, "state" : "NM" } +{ "_id" : "88321", "city" : "ENCINO", "loc" : [ -105.483914, 34.61496 ], "pop" : 290, "state" : "NM" } +{ "_id" : "88324", "city" : "GLENCOE", "loc" : [ -105.502991, 33.386738 ], "pop" : 68, "state" : "NM" } +{ "_id" : "88330", "city" : "HOLLOMAN AIR FOR", "loc" : [ -106.07845, 32.862093 ], "pop" : 5896, "state" : "NM" } +{ "_id" : "88336", "city" : "HONDO", "loc" : [ -105.388854, 33.462518 ], "pop" : 160, "state" : "NM" } +{ "_id" : "88337", "city" : "LA LUZ", "loc" : [ -105.953397, 32.977449 ], "pop" : 2302, "state" : "NM" } +{ "_id" : "88338", "city" : "LINCOLN", "loc" : [ -105.528427, 33.492912 ], "pop" : 150, "state" : "NM" } +{ "_id" : "88339", "city" : "MAYHILL", "loc" : [ -105.518056, 32.907048 ], "pop" : 237, "state" : "NM" } +{ "_id" : "88340", "city" : "MESCALERO", "loc" : [ -105.774293, 33.216436 ], "pop" : 2695, "state" : "NM" } +{ "_id" : "88341", "city" : "NOGAL", "loc" : [ -105.703631, 33.499552 ], "pop" : 312, "state" : "NM" } +{ "_id" : "88343", "city" : "PICACHO", "loc" : [ -105.083382, 33.345642 ], "pop" : 38, "state" : "NM" } +{ "_id" : "88344", "city" : "PINON", "loc" : [ -105.415708, 32.639584 ], "pop" : 92, "state" : "NM" } +{ "_id" : "88345", "city" : "RUIDOSO", "loc" : [ -105.650994, 33.347406 ], "pop" : 6883, "state" : "NM" } +{ "_id" : "88346", "city" : "RUIDOSO DOWNS", "loc" : [ -105.538306, 33.357718 ], "pop" : 367, "state" : "NM" } +{ "_id" : "88347", "city" : "SACRAMENTO", "loc" : [ -105.621128, 32.805221 ], "pop" : 69, "state" : "NM" } +{ "_id" : "88348", "city" : "SAN PATRICIO", "loc" : [ -105.349798, 33.38775 ], "pop" : 532, "state" : "NM" } +{ "_id" : "88351", "city" : "TINNIE", "loc" : [ -105.202681, 33.337308 ], "pop" : 165, "state" : "NM" } +{ "_id" : "88352", "city" : "TULAROSA", "loc" : [ -106.010789, 33.065049 ], "pop" : 4583, "state" : "NM" } +{ "_id" : "88353", "city" : "VAUGHN", "loc" : [ -105.192558, 34.624074 ], "pop" : 741, "state" : "NM" } +{ "_id" : "88354", "city" : "WEED", "loc" : [ -105.506296, 32.80519 ], "pop" : 196, "state" : "NM" } +{ "_id" : "88401", "city" : "TUCUMCARI", "loc" : [ -103.717935, 35.168003 ], "pop" : 8634, "state" : "NM" } +{ "_id" : "88410", "city" : "AMISTAD", "loc" : [ -103.212954, 35.898276 ], "pop" : 170, "state" : "NM" } +{ "_id" : "88411", "city" : "BARD", "loc" : [ -103.317778, 35.115364 ], "pop" : 358, "state" : "NM" } +{ "_id" : "88412", "city" : "BUEYEROS", "loc" : [ -103.666894, 36.013541 ], "pop" : 7, "state" : "NM" } +{ "_id" : "88414", "city" : "CAPULIN", "loc" : [ -103.993599, 36.747453 ], "pop" : 62, "state" : "NM" } +{ "_id" : "88415", "city" : "CLAYTON", "loc" : [ -103.188823, 36.441378 ], "pop" : 2886, "state" : "NM" } +{ "_id" : "88416", "city" : "CONCHAS DAM", "loc" : [ -104.205231, 35.378561 ], "pop" : 218, "state" : "NM" } +{ "_id" : "88417", "city" : "CUERVO", "loc" : [ -104.399867, 35.01013 ], "pop" : 66, "state" : "NM" } +{ "_id" : "88418", "city" : "DES MOINES", "loc" : [ -103.873853, 36.729069 ], "pop" : 278, "state" : "NM" } +{ "_id" : "88419", "city" : "FOLSOM", "loc" : [ -103.839925, 36.86896 ], "pop" : 172, "state" : "NM" } +{ "_id" : "88421", "city" : "GARITA", "loc" : [ -104.441911, 35.350182 ], "pop" : 113, "state" : "NM" } +{ "_id" : "88422", "city" : "GLADSTONE", "loc" : [ -103.893081, 36.307741 ], "pop" : 45, "state" : "NM" } +{ "_id" : "88424", "city" : "GRENVILLE", "loc" : [ -103.415521, 36.725396 ], "pop" : 185, "state" : "NM" } +{ "_id" : "88426", "city" : "LOGAN", "loc" : [ -103.438339, 35.368051 ], "pop" : 962, "state" : "NM" } +{ "_id" : "88427", "city" : "MC ALISTER", "loc" : [ -103.657169, 34.749206 ], "pop" : 171, "state" : "NM" } +{ "_id" : "88429", "city" : "MOUNT DORA", "loc" : [ -103.416667, 36.498795 ], "pop" : 27, "state" : "NM" } +{ "_id" : "88430", "city" : "NARA VISA", "loc" : [ -103.131738, 35.617963 ], "pop" : 170, "state" : "NM" } +{ "_id" : "88431", "city" : "NEWKIRK", "loc" : [ -104.243323, 35.084746 ], "pop" : 40, "state" : "NM" } +{ "_id" : "88432", "city" : "PUERTO DE LUNA", "loc" : [ -104.619645, 34.847826 ], "pop" : 66, "state" : "NM" } +{ "_id" : "88433", "city" : "QUAY", "loc" : [ -103.78176, 34.929916 ], "pop" : 10, "state" : "NM" } +{ "_id" : "88434", "city" : "SAN JON", "loc" : [ -103.284599, 35.119848 ], "pop" : 283, "state" : "NM" } +{ "_id" : "88435", "city" : "PASTURA", "loc" : [ -104.682155, 34.933276 ], "pop" : 2714, "state" : "NM" } +{ "_id" : "88436", "city" : "SEDAN", "loc" : [ -103.14488, 36.226027 ], "pop" : 105, "state" : "NM" } +{ "_id" : "88437", "city" : "SENECA", "loc" : [ -103.089394, 36.6279 ], "pop" : 54, "state" : "NM" } +{ "_id" : "88438", "city" : "STEAD", "loc" : [ -103.121117, 36.12359 ], "pop" : 140, "state" : "NM" } +{ "_id" : "88439", "city" : "TREMENTINA", "loc" : [ -104.616341, 35.584945 ], "pop" : 125, "state" : "NM" } +{ "_id" : "88441", "city" : "BELL RANCH", "loc" : [ -104.111991, 35.638425 ], "pop" : 80, "state" : "NM" } +{ "_id" : "89001", "city" : "ALAMO", "loc" : [ -115.308032, 37.325866 ], "pop" : 926, "state" : "NV" } +{ "_id" : "89005", "city" : "BOULDER CITY", "loc" : [ -114.834413, 35.972711 ], "pop" : 12920, "state" : "NV" } +{ "_id" : "89008", "city" : "CALIENTE", "loc" : [ -114.509727, 37.612817 ], "pop" : 1214, "state" : "NV" } +{ "_id" : "89013", "city" : "GOLDFIELD", "loc" : [ -117.269379, 37.834364 ], "pop" : 712, "state" : "NV" } +{ "_id" : "89014", "city" : "HENDERSON", "loc" : [ -115.077968, 36.056435 ], "pop" : 27761, "state" : "NV" } +{ "_id" : "89015", "city" : "HENDERSON", "loc" : [ -114.971809, 36.035705 ], "pop" : 35694, "state" : "NV" } +{ "_id" : "89017", "city" : "HIKO", "loc" : [ -115.177158, 37.651695 ], "pop" : 97, "state" : "NV" } +{ "_id" : "89018", "city" : "INDIAN SPRINGS", "loc" : [ -115.581067, 36.407223 ], "pop" : 4114, "state" : "NV" } +{ "_id" : "89019", "city" : "GOODSPRINGS", "loc" : [ -115.469154, 35.854839 ], "pop" : 1344, "state" : "NV" } +{ "_id" : "89020", "city" : "AMARGOSA VALLEY", "loc" : [ -116.57755, 36.944007 ], "pop" : 3506, "state" : "NV" } +{ "_id" : "89029", "city" : "LAUGHLIN", "loc" : [ -114.636769, 35.132138 ], "pop" : 4801, "state" : "NV" } +{ "_id" : "89030", "city" : "NORTH LAS VEGAS", "loc" : [ -114.851389, 36.4475 ], "pop" : 16, "state" : "NV" } +{ "_id" : "89031", "city" : "NORTH LAS VEGAS", "loc" : [ -115.124832, 36.206228 ], "pop" : 48113, "state" : "NV" } +{ "_id" : "89040", "city" : "OVERTON", "loc" : [ -114.378202, 36.637236 ], "pop" : 8191, "state" : "NV" } +{ "_id" : "89041", "city" : "PAHRUMP", "loc" : [ -116.014661, 36.204039 ], "pop" : 7440, "state" : "NV" } +{ "_id" : "89043", "city" : "PIOCHE", "loc" : [ -114.396824, 37.898097 ], "pop" : 1538, "state" : "NV" } +{ "_id" : "89045", "city" : "ROUND MOUNTAIN", "loc" : [ -117.127989, 38.682886 ], "pop" : 1302, "state" : "NV" } +{ "_id" : "89046", "city" : "COTTONWOOD COVE", "loc" : [ -114.924182, 35.447601 ], "pop" : 948, "state" : "NV" } +{ "_id" : "89047", "city" : "SILVERPEAK", "loc" : [ -117.94592, 37.76444 ], "pop" : 632, "state" : "NV" } +{ "_id" : "89049", "city" : "TONOPAH", "loc" : [ -117.089886, 38.204273 ], "pop" : 4724, "state" : "NV" } +{ "_id" : "89101", "city" : "LAS VEGAS", "loc" : [ -115.122366, 36.172082 ], "pop" : 40270, "state" : "NV" } +{ "_id" : "89102", "city" : "LAS VEGAS", "loc" : [ -115.200351, 36.143303 ], "pop" : 48070, "state" : "NV" } +{ "_id" : "89103", "city" : "LAS VEGAS", "loc" : [ -115.216072, 36.114865 ], "pop" : 33258, "state" : "NV" } +{ "_id" : "89104", "city" : "LAS VEGAS", "loc" : [ -115.109195, 36.15197 ], "pop" : 26805, "state" : "NV" } +{ "_id" : "89106", "city" : "LAS VEGAS", "loc" : [ -115.161703, 36.184673 ], "pop" : 21458, "state" : "NV" } +{ "_id" : "89107", "city" : "LAS VEGAS", "loc" : [ -115.217638, 36.170457 ], "pop" : 32628, "state" : "NV" } +{ "_id" : "89108", "city" : "LAS VEGAS", "loc" : [ -115.223259, 36.204399 ], "pop" : 46924, "state" : "NV" } +{ "_id" : "89109", "city" : "LAS VEGAS", "loc" : [ -115.145378, 36.125991 ], "pop" : 35139, "state" : "NV" } +{ "_id" : "89110", "city" : "LAS VEGAS", "loc" : [ -115.066892, 36.173031 ], "pop" : 43396, "state" : "NV" } +{ "_id" : "89113", "city" : "LAS VEGAS", "loc" : [ -115.256614, 36.085366 ], "pop" : 1801, "state" : "NV" } +{ "_id" : "89115", "city" : "LAS VEGAS", "loc" : [ -115.067062, 36.215818 ], "pop" : 51532, "state" : "NV" } +{ "_id" : "89117", "city" : "LAS VEGAS", "loc" : [ -115.275518, 36.130196 ], "pop" : 30271, "state" : "NV" } +{ "_id" : "89118", "city" : "LAS VEGAS", "loc" : [ -115.216856, 36.081052 ], "pop" : 9932, "state" : "NV" } +{ "_id" : "89119", "city" : "LAS VEGAS", "loc" : [ -115.136463, 36.100836 ], "pop" : 38719, "state" : "NV" } +{ "_id" : "89120", "city" : "LAS VEGAS", "loc" : [ -115.088485, 36.091423 ], "pop" : 16191, "state" : "NV" } +{ "_id" : "89121", "city" : "LAS VEGAS", "loc" : [ -115.090219, 36.12318 ], "pop" : 50168, "state" : "NV" } +{ "_id" : "89122", "city" : "LAS VEGAS", "loc" : [ -115.052322, 36.120501 ], "pop" : 27409, "state" : "NV" } +{ "_id" : "89123", "city" : "LAS VEGAS", "loc" : [ -115.146182, 36.038273 ], "pop" : 6706, "state" : "NV" } +{ "_id" : "89124", "city" : "LAS VEGAS", "loc" : [ -115.095067, 35.963391 ], "pop" : 2580, "state" : "NV" } +{ "_id" : "89128", "city" : "LAS VEGAS", "loc" : [ -115.256252, 36.175992 ], "pop" : 18956, "state" : "NV" } +{ "_id" : "89129", "city" : "LAS VEGAS", "loc" : [ -115.274254, 36.245004 ], "pop" : 5610, "state" : "NV" } +{ "_id" : "89130", "city" : "LAS VEGAS", "loc" : [ -115.221032, 36.247137 ], "pop" : 4383, "state" : "NV" } +{ "_id" : "89131", "city" : "LAS VEGAS", "loc" : [ -115.241942, 36.295604 ], "pop" : 1721, "state" : "NV" } +{ "_id" : "89134", "city" : "LAS VEGAS", "loc" : [ -115.294123, 36.209234 ], "pop" : 3630, "state" : "NV" } +{ "_id" : "89301", "city" : "ELY", "loc" : [ -114.878011, 39.309356 ], "pop" : 8558, "state" : "NV" } +{ "_id" : "89310", "city" : "AUSTIN", "loc" : [ -117.081063, 39.507986 ], "pop" : 1026, "state" : "NV" } +{ "_id" : "89311", "city" : "BAKER", "loc" : [ -114.246165, 39.065996 ], "pop" : 269, "state" : "NV" } +{ "_id" : "89316", "city" : "EUREKA", "loc" : [ -115.994308, 39.589661 ], "pop" : 1118, "state" : "NV" } +{ "_id" : "89317", "city" : "LUND", "loc" : [ -115.044026, 38.904633 ], "pop" : 437, "state" : "NV" } +{ "_id" : "89403", "city" : "DAYTON", "loc" : [ -119.52872, 39.280594 ], "pop" : 2183, "state" : "NV" } +{ "_id" : "89404", "city" : "DENIO", "loc" : [ -118.731962, 41.704263 ], "pop" : 199, "state" : "NV" } +{ "_id" : "89405", "city" : "EMPIRE", "loc" : [ -119.655265, 40.357703 ], "pop" : 246, "state" : "NV" } +{ "_id" : "89406", "city" : "FALLON", "loc" : [ -118.786112, 39.470254 ], "pop" : 17938, "state" : "NV" } +{ "_id" : "89408", "city" : "FERNLEY", "loc" : [ -119.235044, 39.601888 ], "pop" : 5188, "state" : "NV" } +{ "_id" : "89409", "city" : "GABBS", "loc" : [ -117.868556, 38.880226 ], "pop" : 809, "state" : "NV" } +{ "_id" : "89410", "city" : "GARDNERVILLE", "loc" : [ -119.726902, 38.898268 ], "pop" : 15778, "state" : "NV" } +{ "_id" : "89412", "city" : "GERLACH", "loc" : [ -119.377441, 40.674645 ], "pop" : 469, "state" : "NV" } +{ "_id" : "89413", "city" : "GLENBROOK", "loc" : [ -119.927776, 38.993752 ], "pop" : 5705, "state" : "NV" } +{ "_id" : "89414", "city" : "GOLCONDA", "loc" : [ -117.334929, 40.968325 ], "pop" : 411, "state" : "NV" } +{ "_id" : "89415", "city" : "HAWTHORNE", "loc" : [ -118.641143, 38.534658 ], "pop" : 5172, "state" : "NV" } +{ "_id" : "89418", "city" : "UNIONVILLE", "loc" : [ -118.02115, 40.652217 ], "pop" : 1060, "state" : "NV" } +{ "_id" : "89419", "city" : "LOVELOCK", "loc" : [ -118.468915, 40.1819 ], "pop" : 3276, "state" : "NV" } +{ "_id" : "89420", "city" : "LUNING", "loc" : [ -118.157114, 38.406072 ], "pop" : 501, "state" : "NV" } +{ "_id" : "89423", "city" : "MINDEN", "loc" : [ -119.731363, 39.021766 ], "pop" : 3385, "state" : "NV" } +{ "_id" : "89424", "city" : "NIXON", "loc" : [ -119.464262, 39.885388 ], "pop" : 610, "state" : "NV" } +{ "_id" : "89425", "city" : "OROVADA", "loc" : [ -117.775458, 41.822001 ], "pop" : 1039, "state" : "NV" } +{ "_id" : "89426", "city" : "PARADISE VALLEY", "loc" : [ -117.572848, 41.505726 ], "pop" : 244, "state" : "NV" } +{ "_id" : "89427", "city" : "SCHURZ", "loc" : [ -118.775578, 38.957527 ], "pop" : 802, "state" : "NV" } +{ "_id" : "89429", "city" : "SILVER SPRINGS", "loc" : [ -119.270503, 39.380045 ], "pop" : 3261, "state" : "NV" } +{ "_id" : "89430", "city" : "SMITH", "loc" : [ -119.389005, 38.917166 ], "pop" : 70, "state" : "NV" } +{ "_id" : "89431", "city" : "SPARKS", "loc" : [ -119.755588, 39.547254 ], "pop" : 33923, "state" : "NV" } +{ "_id" : "89433", "city" : "SUN VALLEY", "loc" : [ -119.775363, 39.595477 ], "pop" : 11261, "state" : "NV" } +{ "_id" : "89434", "city" : "SPARKS", "loc" : [ -119.717754, 39.550229 ], "pop" : 20249, "state" : "NV" } +{ "_id" : "89436", "city" : "SPARKS", "loc" : [ -119.708125, 39.626861 ], "pop" : 4228, "state" : "NV" } +{ "_id" : "89440", "city" : "VIRGINIA CITY", "loc" : [ -119.596063, 39.387282 ], "pop" : 2526, "state" : "NV" } +{ "_id" : "89442", "city" : "WADSWORTH", "loc" : [ -119.291778, 39.648069 ], "pop" : 757, "state" : "NV" } +{ "_id" : "89444", "city" : "WELLINGTON", "loc" : [ -119.344901, 38.78762 ], "pop" : 1004, "state" : "NV" } +{ "_id" : "89445", "city" : "WINNEMUCCA", "loc" : [ -117.746693, 40.966418 ], "pop" : 10951, "state" : "NV" } +{ "_id" : "89447", "city" : "YERINGTON", "loc" : [ -119.159558, 38.986567 ], "pop" : 6157, "state" : "NV" } +{ "_id" : "89451", "city" : "INCLINE VILLAGE", "loc" : [ -119.95206, 39.256352 ], "pop" : 7807, "state" : "NV" } +{ "_id" : "89501", "city" : "RENO", "loc" : [ -119.811275, 39.526812 ], "pop" : 2664, "state" : "NV" } +{ "_id" : "89502", "city" : "RENO", "loc" : [ -119.776395, 39.497239 ], "pop" : 38332, "state" : "NV" } +{ "_id" : "89503", "city" : "RENO", "loc" : [ -119.837409, 39.5354 ], "pop" : 23955, "state" : "NV" } +{ "_id" : "89506", "city" : "RENO", "loc" : [ -119.873505, 39.641168 ], "pop" : 24254, "state" : "NV" } +{ "_id" : "89509", "city" : "RENO", "loc" : [ -119.823932, 39.498042 ], "pop" : 36606, "state" : "NV" } +{ "_id" : "89510", "city" : "RENO", "loc" : [ -119.602678, 39.769919 ], "pop" : 613, "state" : "NV" } +{ "_id" : "89511", "city" : "RENO", "loc" : [ -119.766846, 39.41512 ], "pop" : 16412, "state" : "NV" } +{ "_id" : "89512", "city" : "RENO", "loc" : [ -119.795699, 39.548312 ], "pop" : 21009, "state" : "NV" } +{ "_id" : "89523", "city" : "RENO", "loc" : [ -119.903065, 39.524917 ], "pop" : 7697, "state" : "NV" } +{ "_id" : "89701", "city" : "CARSON CITY", "loc" : [ -119.745904, 39.150746 ], "pop" : 18817, "state" : "NV" } +{ "_id" : "89703", "city" : "CARSON CITY", "loc" : [ -119.778242, 39.17036 ], "pop" : 8047, "state" : "NV" } +{ "_id" : "89704", "city" : "CARSON CITY", "loc" : [ -119.828624, 39.089756 ], "pop" : 82, "state" : "NV" } +{ "_id" : "89705", "city" : "CARSON CITY", "loc" : [ -119.782899, 39.089147 ], "pop" : 2703, "state" : "NV" } +{ "_id" : "89706", "city" : "MOUNDHOUSE", "loc" : [ -119.742912, 39.210876 ], "pop" : 19276, "state" : "NV" } +{ "_id" : "89801", "city" : "JIGGS", "loc" : [ -115.724679, 40.826247 ], "pop" : 24461, "state" : "NV" } +{ "_id" : "89820", "city" : "BATTLE MOUNTAIN", "loc" : [ -116.955439, 40.621985 ], "pop" : 5240, "state" : "NV" } +{ "_id" : "89821", "city" : "BEOWAWE", "loc" : [ -116.477387, 40.462398 ], "pop" : 429, "state" : "NV" } +{ "_id" : "89822", "city" : "CARLIN", "loc" : [ -116.108208, 40.717216 ], "pop" : 2272, "state" : "NV" } +{ "_id" : "89823", "city" : "DEETH", "loc" : [ -115.371729, 41.431033 ], "pop" : 69, "state" : "NV" } +{ "_id" : "89825", "city" : "JACKPOT", "loc" : [ -115.112886, 41.839591 ], "pop" : 95, "state" : "NV" } +{ "_id" : "89831", "city" : "MOUNTAIN CITY", "loc" : [ -116.113801, 41.870781 ], "pop" : 1259, "state" : "NV" } +{ "_id" : "89833", "city" : "RUBY VALLEY", "loc" : [ -115.231219, 40.399514 ], "pop" : 37, "state" : "NV" } +{ "_id" : "89834", "city" : "TUSCARORA", "loc" : [ -116.931141, 41.171527 ], "pop" : 1, "state" : "NV" } +{ "_id" : "89835", "city" : "OASIS", "loc" : [ -114.532752, 41.129798 ], "pop" : 5336, "state" : "NV" } +{ "_id" : "90001", "city" : "LOS ANGELES", "loc" : [ -118.247896, 33.973093 ], "pop" : 51841, "state" : "CA" } +{ "_id" : "90002", "city" : "LOS ANGELES", "loc" : [ -118.246213, 33.94969 ], "pop" : 40629, "state" : "CA" } +{ "_id" : "90003", "city" : "LOS ANGELES", "loc" : [ -118.272739, 33.965335 ], "pop" : 53938, "state" : "CA" } +{ "_id" : "90004", "city" : "LOS ANGELES", "loc" : [ -118.302863, 34.076163 ], "pop" : 64062, "state" : "CA" } +{ "_id" : "90005", "city" : "LOS ANGELES", "loc" : [ -118.301197, 34.058508 ], "pop" : 35864, "state" : "CA" } +{ "_id" : "90006", "city" : "LOS ANGELES", "loc" : [ -118.291687, 34.049323 ], "pop" : 63389, "state" : "CA" } +{ "_id" : "90007", "city" : "LOS ANGELES", "loc" : [ -118.287095, 34.029442 ], "pop" : 46985, "state" : "CA" } +{ "_id" : "90008", "city" : "LOS ANGELES", "loc" : [ -118.341123, 34.011643 ], "pop" : 33073, "state" : "CA" } +{ "_id" : "90010", "city" : "LOS ANGELES", "loc" : [ -118.302664, 34.060633 ], "pop" : 5335, "state" : "CA" } +{ "_id" : "90011", "city" : "LOS ANGELES", "loc" : [ -118.258189, 34.007856 ], "pop" : 96074, "state" : "CA" } +{ "_id" : "90012", "city" : "LOS ANGELES", "loc" : [ -118.238479, 34.061396 ], "pop" : 28518, "state" : "CA" } +{ "_id" : "90013", "city" : "LOS ANGELES", "loc" : [ -118.243366, 34.044841 ], "pop" : 5653, "state" : "CA" } +{ "_id" : "90014", "city" : "LOS ANGELES", "loc" : [ -118.250937, 34.044272 ], "pop" : 2715, "state" : "CA" } +{ "_id" : "90015", "city" : "LOS ANGELES", "loc" : [ -118.271613, 34.043439 ], "pop" : 18880, "state" : "CA" } +{ "_id" : "90016", "city" : "LOS ANGELES", "loc" : [ -118.352787, 34.029826 ], "pop" : 43669, "state" : "CA" } +{ "_id" : "90017", "city" : "LOS ANGELES", "loc" : [ -118.266582, 34.055864 ], "pop" : 21790, "state" : "CA" } +{ "_id" : "90018", "city" : "LOS ANGELES", "loc" : [ -118.315173, 34.028972 ], "pop" : 48267, "state" : "CA" } +{ "_id" : "90019", "city" : "LOS ANGELES", "loc" : [ -118.33426, 34.048158 ], "pop" : 64996, "state" : "CA" } +{ "_id" : "90020", "city" : "LOS ANGELES", "loc" : [ -118.302211, 34.066535 ], "pop" : 34926, "state" : "CA" } +{ "_id" : "90021", "city" : "LOS ANGELES", "loc" : [ -118.244698, 34.033303 ], "pop" : 2869, "state" : "CA" } +{ "_id" : "90022", "city" : "EAST LOS ANGELES", "loc" : [ -118.155319, 34.023638 ], "pop" : 65065, "state" : "CA" } +{ "_id" : "90023", "city" : "LOS ANGELES", "loc" : [ -118.197498, 34.024478 ], "pop" : 47136, "state" : "CA" } +{ "_id" : "90024", "city" : "LOS ANGELES", "loc" : [ -118.440796, 34.063691 ], "pop" : 38370, "state" : "CA" } +{ "_id" : "90025", "city" : "LOS ANGELES", "loc" : [ -118.448717, 34.044662 ], "pop" : 37746, "state" : "CA" } +{ "_id" : "90026", "city" : "LOS ANGELES", "loc" : [ -118.264641, 34.076629 ], "pop" : 74751, "state" : "CA" } +{ "_id" : "90027", "city" : "LOS ANGELES", "loc" : [ -118.292516, 34.104031 ], "pop" : 50484, "state" : "CA" } +{ "_id" : "90028", "city" : "LOS ANGELES", "loc" : [ -118.325363, 34.100549 ], "pop" : 30152, "state" : "CA" } +{ "_id" : "90029", "city" : "LOS ANGELES", "loc" : [ -118.294393, 34.089982 ], "pop" : 41120, "state" : "CA" } +{ "_id" : "90031", "city" : "LOS ANGELES", "loc" : [ -118.211279, 34.078349 ], "pop" : 39706, "state" : "CA" } +{ "_id" : "90032", "city" : "LOS ANGELES", "loc" : [ -118.175323, 34.081785 ], "pop" : 46602, "state" : "CA" } +{ "_id" : "90033", "city" : "LOS ANGELES", "loc" : [ -118.208442, 34.048676 ], "pop" : 57469, "state" : "CA" } +{ "_id" : "90034", "city" : "LOS ANGELES", "loc" : [ -118.400482, 34.028977 ], "pop" : 53930, "state" : "CA" } +{ "_id" : "90035", "city" : "LOS ANGELES", "loc" : [ -118.380615, 34.053096 ], "pop" : 25723, "state" : "CA" } +{ "_id" : "90036", "city" : "LOS ANGELES", "loc" : [ -118.349175, 34.069888 ], "pop" : 29887, "state" : "CA" } +{ "_id" : "90037", "city" : "LOS ANGELES", "loc" : [ -118.286284, 34.002982 ], "pop" : 56922, "state" : "CA" } +{ "_id" : "90038", "city" : "LOS ANGELES", "loc" : [ -118.321489, 34.089769 ], "pop" : 33001, "state" : "CA" } +{ "_id" : "90039", "city" : "LOS ANGELES", "loc" : [ -118.259428, 34.112089 ], "pop" : 29189, "state" : "CA" } +{ "_id" : "90040", "city" : "CITY OF COMMERCE", "loc" : [ -118.151352, 33.99471 ], "pop" : 9689, "state" : "CA" } +{ "_id" : "90041", "city" : "LOS ANGELES", "loc" : [ -118.208205, 34.133932 ], "pop" : 26864, "state" : "CA" } +{ "_id" : "90042", "city" : "LOS ANGELES", "loc" : [ -118.192902, 34.114527 ], "pop" : 60003, "state" : "CA" } +{ "_id" : "90043", "city" : "LOS ANGELES", "loc" : [ -118.33211, 33.987099 ], "pop" : 45397, "state" : "CA" } +{ "_id" : "90044", "city" : "LOS ANGELES", "loc" : [ -118.290119, 33.955089 ], "pop" : 83958, "state" : "CA" } +{ "_id" : "90045", "city" : "LOS ANGELES", "loc" : [ -118.394128, 33.963075 ], "pop" : 36480, "state" : "CA" } +{ "_id" : "90046", "city" : "COLE", "loc" : [ -118.357979, 34.09743 ], "pop" : 48423, "state" : "CA" } +{ "_id" : "90047", "city" : "LOS ANGELES", "loc" : [ -118.307304, 33.956896 ], "pop" : 47975, "state" : "CA" } +{ "_id" : "90048", "city" : "LOS ANGELES", "loc" : [ -118.371969, 34.073656 ], "pop" : 20863, "state" : "CA" } +{ "_id" : "90049", "city" : "LOS ANGELES", "loc" : [ -118.473967, 34.066 ], "pop" : 35507, "state" : "CA" } +{ "_id" : "90056", "city" : "LOS ANGELES", "loc" : [ -118.370703, 33.985329 ], "pop" : 8108, "state" : "CA" } +{ "_id" : "90057", "city" : "LOS ANGELES", "loc" : [ -118.276262, 34.062172 ], "pop" : 39017, "state" : "CA" } +{ "_id" : "90058", "city" : "VERNON", "loc" : [ -118.235365, 33.997344 ], "pop" : 4090, "state" : "CA" } +{ "_id" : "90059", "city" : "LOS ANGELES", "loc" : [ -118.24628, 33.929331 ], "pop" : 34536, "state" : "CA" } +{ "_id" : "90061", "city" : "LOS ANGELES", "loc" : [ -118.271638, 33.924493 ], "pop" : 21856, "state" : "CA" } +{ "_id" : "90062", "city" : "LOS ANGELES", "loc" : [ -118.307277, 34.00324 ], "pop" : 27517, "state" : "CA" } +{ "_id" : "90063", "city" : "HAZARD", "loc" : [ -118.185432, 34.044017 ], "pop" : 61123, "state" : "CA" } +{ "_id" : "90064", "city" : "LOS ANGELES", "loc" : [ -118.425911, 34.035279 ], "pop" : 23530, "state" : "CA" } +{ "_id" : "90065", "city" : "LOS ANGELES", "loc" : [ -118.226637, 34.107307 ], "pop" : 45578, "state" : "CA" } +{ "_id" : "90066", "city" : "LOS ANGELES", "loc" : [ -118.429769, 34.002956 ], "pop" : 53095, "state" : "CA" } +{ "_id" : "90067", "city" : "LOS ANGELES", "loc" : [ -118.409479, 34.055146 ], "pop" : 2731, "state" : "CA" } +{ "_id" : "90068", "city" : "LOS ANGELES", "loc" : [ -118.330476, 34.115625 ], "pop" : 25615, "state" : "CA" } +{ "_id" : "90069", "city" : "WEST HOLLYWOOD", "loc" : [ -118.378753, 34.090573 ], "pop" : 20587, "state" : "CA" } +{ "_id" : "90071", "city" : "LOS ANGELES", "loc" : [ -118.257127, 34.052043 ], "pop" : 15, "state" : "CA" } +{ "_id" : "90077", "city" : "LOS ANGELES", "loc" : [ -118.450155, 34.111245 ], "pop" : 7989, "state" : "CA" } +{ "_id" : "90201", "city" : "BELL GARDENS", "loc" : [ -118.17205, 33.969177 ], "pop" : 99568, "state" : "CA" } +{ "_id" : "90210", "city" : "BEVERLY HILLS", "loc" : [ -118.406477, 34.090107 ], "pop" : 20700, "state" : "CA" } +{ "_id" : "90211", "city" : "BEVERLY HILLS", "loc" : [ -118.383007, 34.065217 ], "pop" : 7746, "state" : "CA" } +{ "_id" : "90212", "city" : "BEVERLY HILLS", "loc" : [ -118.399544, 34.061855 ], "pop" : 10725, "state" : "CA" } +{ "_id" : "90220", "city" : "RANCHO DOMINGUEZ", "loc" : [ -118.239044, 33.890654 ], "pop" : 47631, "state" : "CA" } +{ "_id" : "90221", "city" : "EAST RANCHO DOMI", "loc" : [ -118.203724, 33.897324 ], "pop" : 47844, "state" : "CA" } +{ "_id" : "90222", "city" : "ROSEWOOD", "loc" : [ -118.234034, 33.911535 ], "pop" : 28754, "state" : "CA" } +{ "_id" : "90230", "city" : "CULVER CITY", "loc" : [ -118.399115, 33.994927 ], "pop" : 32207, "state" : "CA" } +{ "_id" : "90232", "city" : "CULVER CITY", "loc" : [ -118.397332, 34.016809 ], "pop" : 16138, "state" : "CA" } +{ "_id" : "90240", "city" : "DOWNEY", "loc" : [ -118.117381, 33.958135 ], "pop" : 20273, "state" : "CA" } +{ "_id" : "90241", "city" : "DOWNEY", "loc" : [ -118.13062, 33.941612 ], "pop" : 34348, "state" : "CA" } +{ "_id" : "90242", "city" : "DOWNEY", "loc" : [ -118.139465, 33.921789 ], "pop" : 36988, "state" : "CA" } +{ "_id" : "90245", "city" : "EL SEGUNDO", "loc" : [ -118.411924, 33.924275 ], "pop" : 15162, "state" : "CA" } +{ "_id" : "90247", "city" : "GARDENA", "loc" : [ -118.296122, 33.892463 ], "pop" : 42072, "state" : "CA" } +{ "_id" : "90248", "city" : "GARDENA", "loc" : [ -118.289312, 33.874506 ], "pop" : 9529, "state" : "CA" } +{ "_id" : "90249", "city" : "GARDENA", "loc" : [ -118.319854, 33.899762 ], "pop" : 25806, "state" : "CA" } +{ "_id" : "90250", "city" : "HOLLY PARK", "loc" : [ -118.346978, 33.913214 ], "pop" : 78511, "state" : "CA" } +{ "_id" : "90254", "city" : "HERMOSA BEACH", "loc" : [ -118.395511, 33.864309 ], "pop" : 18289, "state" : "CA" } +{ "_id" : "90255", "city" : "HUNTINGTON PARK", "loc" : [ -118.216053, 33.976879 ], "pop" : 72139, "state" : "CA" } +{ "_id" : "90260", "city" : "LAWNDALE", "loc" : [ -118.351014, 33.887908 ], "pop" : 29576, "state" : "CA" } +{ "_id" : "90262", "city" : "LYNWOOD", "loc" : [ -118.201289, 33.924076 ], "pop" : 61606, "state" : "CA" } +{ "_id" : "90265", "city" : "MALIBU", "loc" : [ -118.735149, 34.040184 ], "pop" : 17850, "state" : "CA" } +{ "_id" : "90266", "city" : "MANHATTAN BEACH", "loc" : [ -118.399562, 33.889594 ], "pop" : 31984, "state" : "CA" } +{ "_id" : "90270", "city" : "MAYWOOD", "loc" : [ -118.187685, 33.988992 ], "pop" : 27801, "state" : "CA" } +{ "_id" : "90272", "city" : "PACIFIC PALISADE", "loc" : [ -118.536874, 34.054097 ], "pop" : 20984, "state" : "CA" } +{ "_id" : "90274", "city" : "PALOS VERDES EST", "loc" : [ -118.374763, 33.770094 ], "pop" : 60381, "state" : "CA" } +{ "_id" : "90277", "city" : "REDONDO BEACH", "loc" : [ -118.383221, 33.830656 ], "pop" : 33102, "state" : "CA" } +{ "_id" : "90278", "city" : "REDONDO BEACH", "loc" : [ -118.371459, 33.870654 ], "pop" : 34873, "state" : "CA" } +{ "_id" : "90280", "city" : "SOUTH GATE", "loc" : [ -118.201349, 33.94617 ], "pop" : 87026, "state" : "CA" } +{ "_id" : "90290", "city" : "TOPANGA", "loc" : [ -118.602268, 34.10759 ], "pop" : 5430, "state" : "CA" } +{ "_id" : "90291", "city" : "VENICE", "loc" : [ -118.463463, 33.993772 ], "pop" : 32987, "state" : "CA" } +{ "_id" : "90292", "city" : "MARINA DEL REY", "loc" : [ -118.452475, 33.977876 ], "pop" : 16572, "state" : "CA" } +{ "_id" : "90293", "city" : "PLAYA DEL REY", "loc" : [ -118.437314, 33.957745 ], "pop" : 11477, "state" : "CA" } +{ "_id" : "90301", "city" : "INGLEWOOD", "loc" : [ -118.355575, 33.955048 ], "pop" : 36481, "state" : "CA" } +{ "_id" : "90302", "city" : "INGLEWOOD", "loc" : [ -118.354805, 33.974496 ], "pop" : 28681, "state" : "CA" } +{ "_id" : "90303", "city" : "INGLEWOOD", "loc" : [ -118.332058, 33.937691 ], "pop" : 26418, "state" : "CA" } +{ "_id" : "90304", "city" : "LENNOX", "loc" : [ -118.355562, 33.938514 ], "pop" : 28216, "state" : "CA" } +{ "_id" : "90305", "city" : "INGLEWOOD", "loc" : [ -118.32585, 33.958304 ], "pop" : 14370, "state" : "CA" } +{ "_id" : "90401", "city" : "SANTA MONICA", "loc" : [ -118.490708, 34.017628 ], "pop" : 4813, "state" : "CA" } +{ "_id" : "90402", "city" : "SANTA MONICA", "loc" : [ -118.503011, 34.034875 ], "pop" : 14628, "state" : "CA" } +{ "_id" : "90403", "city" : "SANTA MONICA", "loc" : [ -118.49241, 34.028658 ], "pop" : 22303, "state" : "CA" } +{ "_id" : "90404", "city" : "SANTA MONICA", "loc" : [ -118.4733, 34.026828 ], "pop" : 22480, "state" : "CA" } +{ "_id" : "90405", "city" : "SANTA MONICA", "loc" : [ -118.471708, 34.01001 ], "pop" : 26081, "state" : "CA" } +{ "_id" : "90501", "city" : "TORRANCE", "loc" : [ -118.31183, 33.826817 ], "pop" : 37691, "state" : "CA" } +{ "_id" : "90502", "city" : "TORRANCE", "loc" : [ -118.292039, 33.828555 ], "pop" : 15963, "state" : "CA" } +{ "_id" : "90503", "city" : "TORRANCE", "loc" : [ -118.354236, 33.839709 ], "pop" : 40351, "state" : "CA" } +{ "_id" : "90504", "city" : "TORRANCE", "loc" : [ -118.329517, 33.870815 ], "pop" : 30245, "state" : "CA" } +{ "_id" : "90505", "city" : "TORRANCE", "loc" : [ -118.350733, 33.810635 ], "pop" : 33933, "state" : "CA" } +{ "_id" : "90506", "city" : "TORRANCE", "loc" : [ -118.329543, 33.885367 ], "pop" : 0, "state" : "CA" } +{ "_id" : "90601", "city" : "WHITTIER", "loc" : [ -118.037139, 34.001119 ], "pop" : 30501, "state" : "CA" } +{ "_id" : "90602", "city" : "WHITTIER", "loc" : [ -118.033703, 33.96931 ], "pop" : 23508, "state" : "CA" } +{ "_id" : "90603", "city" : "WHITTIER", "loc" : [ -117.992685, 33.943199 ], "pop" : 18063, "state" : "CA" } +{ "_id" : "90604", "city" : "WHITTIER", "loc" : [ -118.012075, 33.929931 ], "pop" : 36371, "state" : "CA" } +{ "_id" : "90605", "city" : "WHITTIER", "loc" : [ -118.035568, 33.941338 ], "pop" : 34035, "state" : "CA" } +{ "_id" : "90606", "city" : "LOS NIETOS", "loc" : [ -118.065639, 33.977019 ], "pop" : 30185, "state" : "CA" } +{ "_id" : "90620", "city" : "BUENA PARK", "loc" : [ -118.011359, 33.840607 ], "pop" : 42966, "state" : "CA" } +{ "_id" : "90621", "city" : "BUENA PARK", "loc" : [ -117.994257, 33.873136 ], "pop" : 27502, "state" : "CA" } +{ "_id" : "90623", "city" : "CERRITOS", "loc" : [ -118.040618, 33.849017 ], "pop" : 15066, "state" : "CA" } +{ "_id" : "90630", "city" : "CYPRESS", "loc" : [ -118.038696, 33.818613 ], "pop" : 43055, "state" : "CA" } +{ "_id" : "90631", "city" : "LA HABRA HEIGHTS", "loc" : [ -117.949703, 33.932173 ], "pop" : 59113, "state" : "CA" } +{ "_id" : "90638", "city" : "LA MIRADA", "loc" : [ -118.010081, 33.906681 ], "pop" : 40452, "state" : "CA" } +{ "_id" : "90640", "city" : "MONTEBELLO", "loc" : [ -118.112986, 34.013342 ], "pop" : 59068, "state" : "CA" } +{ "_id" : "90650", "city" : "NORWALK", "loc" : [ -118.081767, 33.90564 ], "pop" : 94188, "state" : "CA" } +{ "_id" : "90660", "city" : "PICO RIVERA", "loc" : [ -118.088269, 33.98857 ], "pop" : 58891, "state" : "CA" } +{ "_id" : "90670", "city" : "SANTA FE SPRINGS", "loc" : [ -118.083801, 33.946407 ], "pop" : 14417, "state" : "CA" } +{ "_id" : "90680", "city" : "STANTON", "loc" : [ -117.994709, 33.803029 ], "pop" : 25160, "state" : "CA" } +{ "_id" : "90701", "city" : "CERRITOS", "loc" : [ -118.068046, 33.866568 ], "pop" : 69130, "state" : "CA" } +{ "_id" : "90704", "city" : "AVALON", "loc" : [ -118.343706, 33.331963 ], "pop" : 3445, "state" : "CA" } +{ "_id" : "90706", "city" : "BELLFLOWER", "loc" : [ -118.126527, 33.886676 ], "pop" : 61650, "state" : "CA" } +{ "_id" : "90710", "city" : "HARBOR CITY", "loc" : [ -118.299114, 33.797006 ], "pop" : 24418, "state" : "CA" } +{ "_id" : "90712", "city" : "LAKEWOOD", "loc" : [ -118.145727, 33.851201 ], "pop" : 28992, "state" : "CA" } +{ "_id" : "90713", "city" : "LAKEWOOD", "loc" : [ -118.111464, 33.847302 ], "pop" : 26646, "state" : "CA" } +{ "_id" : "90715", "city" : "LAKEWOOD", "loc" : [ -118.076707, 33.840453 ], "pop" : 17983, "state" : "CA" } +{ "_id" : "90716", "city" : "HAWAIIAN GARDENS", "loc" : [ -118.072964, 33.82958 ], "pop" : 13921, "state" : "CA" } +{ "_id" : "90717", "city" : "RANCHO PALOS VER", "loc" : [ -118.31693, 33.793339 ], "pop" : 19635, "state" : "CA" } +{ "_id" : "90720", "city" : "ROSSMOOR", "loc" : [ -118.069891, 33.795291 ], "pop" : 21695, "state" : "CA" } +{ "_id" : "90723", "city" : "PARAMOUNT", "loc" : [ -118.163152, 33.896867 ], "pop" : 46679, "state" : "CA" } +{ "_id" : "90731", "city" : "SAN PEDRO", "loc" : [ -118.291425, 33.733894 ], "pop" : 58821, "state" : "CA" } +{ "_id" : "90732", "city" : "RANCHO PALOS VER", "loc" : [ -118.310597, 33.744947 ], "pop" : 26244, "state" : "CA" } +{ "_id" : "90740", "city" : "SEAL BEACH", "loc" : [ -118.08428, 33.760971 ], "pop" : 24537, "state" : "CA" } +{ "_id" : "90744", "city" : "WILMINGTON", "loc" : [ -118.264451, 33.785475 ], "pop" : 49178, "state" : "CA" } +{ "_id" : "90745", "city" : "CARSON", "loc" : [ -118.268352, 33.822968 ], "pop" : 50251, "state" : "CA" } +{ "_id" : "90746", "city" : "CARSON", "loc" : [ -118.255449, 33.858444 ], "pop" : 25970, "state" : "CA" } +{ "_id" : "90802", "city" : "LONG BEACH", "loc" : [ -118.182025, 33.770553 ], "pop" : 33906, "state" : "CA" } +{ "_id" : "90803", "city" : "LONG BEACH", "loc" : [ -118.134073, 33.761932 ], "pop" : 32492, "state" : "CA" } +{ "_id" : "90804", "city" : "SIGNAL HILL", "loc" : [ -118.155187, 33.782993 ], "pop" : 36092, "state" : "CA" } +{ "_id" : "90805", "city" : "LONG BEACH", "loc" : [ -118.180102, 33.863457 ], "pop" : 74011, "state" : "CA" } +{ "_id" : "90806", "city" : "SIGNAL HILL", "loc" : [ -118.187443, 33.799319 ], "pop" : 44982, "state" : "CA" } +{ "_id" : "90807", "city" : "SIGNAL HILL", "loc" : [ -118.18092, 33.830712 ], "pop" : 28037, "state" : "CA" } +{ "_id" : "90808", "city" : "LONG BEACH", "loc" : [ -118.110299, 33.824145 ], "pop" : 37809, "state" : "CA" } +{ "_id" : "90810", "city" : "CARSON", "loc" : [ -118.215006, 33.810985 ], "pop" : 36694, "state" : "CA" } +{ "_id" : "90813", "city" : "LONG BEACH", "loc" : [ -118.183488, 33.78202 ], "pop" : 58109, "state" : "CA" } +{ "_id" : "90814", "city" : "LONG BEACH", "loc" : [ -118.147988, 33.771576 ], "pop" : 17359, "state" : "CA" } +{ "_id" : "90815", "city" : "LONG BEACH", "loc" : [ -118.119249, 33.793908 ], "pop" : 38603, "state" : "CA" } +{ "_id" : "90822", "city" : "LONG BEACH", "loc" : [ -118.239257, 33.744415 ], "pop" : 7362, "state" : "CA" } +{ "_id" : "91001", "city" : "ALTADENA", "loc" : [ -118.13919, 34.191187 ], "pop" : 36013, "state" : "CA" } +{ "_id" : "91006", "city" : "ARCADIA", "loc" : [ -118.026374, 34.132389 ], "pop" : 30550, "state" : "CA" } +{ "_id" : "91007", "city" : "ARCADIA", "loc" : [ -118.051483, 34.124271 ], "pop" : 25675, "state" : "CA" } +{ "_id" : "91010", "city" : "BRADBURY", "loc" : [ -117.967005, 34.137445 ], "pop" : 26462, "state" : "CA" } +{ "_id" : "91011", "city" : "FLINTRIDGE", "loc" : [ -118.199008, 34.209282 ], "pop" : 19699, "state" : "CA" } +{ "_id" : "91016", "city" : "MONROVIA", "loc" : [ -118.001376, 34.143959 ], "pop" : 39015, "state" : "CA" } +{ "_id" : "91020", "city" : "MONTROSE", "loc" : [ -118.230529, 34.211425 ], "pop" : 6536, "state" : "CA" } +{ "_id" : "91024", "city" : "SIERRA MADRE", "loc" : [ -118.051916, 34.165101 ], "pop" : 10560, "state" : "CA" } +{ "_id" : "91030", "city" : "SOUTH PASADENA", "loc" : [ -118.154696, 34.110939 ], "pop" : 23936, "state" : "CA" } +{ "_id" : "91040", "city" : "SHADOW HILLS", "loc" : [ -118.321359, 34.261025 ], "pop" : 18303, "state" : "CA" } +{ "_id" : "91042", "city" : "TUJUNGA", "loc" : [ -118.284856, 34.254389 ], "pop" : 24853, "state" : "CA" } +{ "_id" : "91101", "city" : "PASADENA", "loc" : [ -118.139119, 34.146762 ], "pop" : 16045, "state" : "CA" } +{ "_id" : "91103", "city" : "PASADENA", "loc" : [ -118.155119, 34.166906 ], "pop" : 26641, "state" : "CA" } +{ "_id" : "91104", "city" : "PASADENA", "loc" : [ -118.12609, 34.167776 ], "pop" : 37973, "state" : "CA" } +{ "_id" : "91105", "city" : "PASADENA", "loc" : [ -118.163577, 34.135455 ], "pop" : 11165, "state" : "CA" } +{ "_id" : "91106", "city" : "PASADENA", "loc" : [ -118.126647, 34.143527 ], "pop" : 23854, "state" : "CA" } +{ "_id" : "91107", "city" : "PASADENA", "loc" : [ -118.088905, 34.150997 ], "pop" : 31390, "state" : "CA" } +{ "_id" : "91108", "city" : "SAN MARINO", "loc" : [ -118.111745, 34.120698 ], "pop" : 12953, "state" : "CA" } +{ "_id" : "91201", "city" : "GLENDALE", "loc" : [ -118.289892, 34.171606 ], "pop" : 22495, "state" : "CA" } +{ "_id" : "91202", "city" : "GLENDALE", "loc" : [ -118.265649, 34.165235 ], "pop" : 20331, "state" : "CA" } +{ "_id" : "91203", "city" : "GLENDALE", "loc" : [ -118.263614, 34.151718 ], "pop" : 12714, "state" : "CA" } +{ "_id" : "91204", "city" : "GLENDALE", "loc" : [ -118.259947, 34.137871 ], "pop" : 15541, "state" : "CA" } +{ "_id" : "91205", "city" : "GLENDALE", "loc" : [ -118.24245, 34.137798 ], "pop" : 38428, "state" : "CA" } +{ "_id" : "91206", "city" : "GLENDALE", "loc" : [ -118.232217, 34.155605 ], "pop" : 30415, "state" : "CA" } +{ "_id" : "91207", "city" : "GLENDALE", "loc" : [ -118.245086, 34.164856 ], "pop" : 8911, "state" : "CA" } +{ "_id" : "91208", "city" : "GLENDALE", "loc" : [ -118.234966, 34.19212 ], "pop" : 14831, "state" : "CA" } +{ "_id" : "91214", "city" : "LA CRESCENTA", "loc" : [ -118.245687, 34.231619 ], "pop" : 27249, "state" : "CA" } +{ "_id" : "91301", "city" : "OAK PARK", "loc" : [ -118.75718, 34.157163 ], "pop" : 35520, "state" : "CA" } +{ "_id" : "91302", "city" : "CALABASAS", "loc" : [ -118.664103, 34.141854 ], "pop" : 12690, "state" : "CA" } +{ "_id" : "91303", "city" : "CANOGA PARK", "loc" : [ -118.59828, 34.199257 ], "pop" : 19656, "state" : "CA" } +{ "_id" : "91304", "city" : "CANOGA PARK", "loc" : [ -118.611059, 34.219671 ], "pop" : 43675, "state" : "CA" } +{ "_id" : "91306", "city" : "WINNETKA", "loc" : [ -118.57492, 34.2092 ], "pop" : 39261, "state" : "CA" } +{ "_id" : "91307", "city" : "WEST HILLS", "loc" : [ -118.638892, 34.196343 ], "pop" : 22049, "state" : "CA" } +{ "_id" : "91311", "city" : "CHATSWORTH", "loc" : [ -118.591357, 34.258253 ], "pop" : 37225, "state" : "CA" } +{ "_id" : "91316", "city" : "ENCINO", "loc" : [ -118.517542, 34.165479 ], "pop" : 24538, "state" : "CA" } +{ "_id" : "91320", "city" : "NEWBURY PARK", "loc" : [ -118.935798, 34.177393 ], "pop" : 31941, "state" : "CA" } +{ "_id" : "91321", "city" : "NEWHALL", "loc" : [ -118.523005, 34.379519 ], "pop" : 23520, "state" : "CA" } +{ "_id" : "91324", "city" : "NORTHRIDGE", "loc" : [ -118.546595, 34.236743 ], "pop" : 23252, "state" : "CA" } +{ "_id" : "91325", "city" : "NORTHRIDGE", "loc" : [ -118.51884, 34.235332 ], "pop" : 28071, "state" : "CA" } +{ "_id" : "91326", "city" : "PORTER RANCH", "loc" : [ -118.541235, 34.274191 ], "pop" : 23466, "state" : "CA" } +{ "_id" : "91330", "city" : "CALIFORNIA STATE", "loc" : [ -118.528634, 34.23805 ], "pop" : 1604, "state" : "CA" } +{ "_id" : "91331", "city" : "ARLETA", "loc" : [ -118.420692, 34.258081 ], "pop" : 88114, "state" : "CA" } +{ "_id" : "91335", "city" : "RESEDA", "loc" : [ -118.539071, 34.200663 ], "pop" : 62117, "state" : "CA" } +{ "_id" : "91340", "city" : "SAN FERNANDO", "loc" : [ -118.435242, 34.287509 ], "pop" : 33379, "state" : "CA" } +{ "_id" : "91342", "city" : "SYLMAR", "loc" : [ -118.432181, 34.30538 ], "pop" : 68612, "state" : "CA" } +{ "_id" : "91343", "city" : "NORTH HILLS", "loc" : [ -118.47582, 34.236636 ], "pop" : 48751, "state" : "CA" } +{ "_id" : "91344", "city" : "GRANADA HILLS", "loc" : [ -118.4992, 34.277068 ], "pop" : 45729, "state" : "CA" } +{ "_id" : "91345", "city" : "MISSION HILLS", "loc" : [ -118.458659, 34.261873 ], "pop" : 14886, "state" : "CA" } +{ "_id" : "91350", "city" : "AGUA DULCE", "loc" : [ -118.488955, 34.459742 ], "pop" : 31741, "state" : "CA" } +{ "_id" : "91351", "city" : "CANYON COUNTRY", "loc" : [ -118.449011, 34.426203 ], "pop" : 47273, "state" : "CA" } +{ "_id" : "91352", "city" : "SUN VALLEY", "loc" : [ -118.369853, 34.220907 ], "pop" : 43722, "state" : "CA" } +{ "_id" : "91354", "city" : "VALENCIA", "loc" : [ -118.537437, 34.446608 ], "pop" : 7918, "state" : "CA" } +{ "_id" : "91355", "city" : "VALENCIA", "loc" : [ -118.55352, 34.398456 ], "pop" : 23550, "state" : "CA" } +{ "_id" : "91356", "city" : "TARZANA", "loc" : [ -118.541354, 34.16708 ], "pop" : 25316, "state" : "CA" } +{ "_id" : "91360", "city" : "THOUSAND OAKS", "loc" : [ -118.873908, 34.209179 ], "pop" : 41654, "state" : "CA" } +{ "_id" : "91361", "city" : "WESTLAKE VILLAGE", "loc" : [ -118.83832, 34.147233 ], "pop" : 18608, "state" : "CA" } +{ "_id" : "91362", "city" : "WESTLAKE VILLAGE", "loc" : [ -118.830601, 34.191884 ], "pop" : 26572, "state" : "CA" } +{ "_id" : "91364", "city" : "WOODLAND HILLS", "loc" : [ -118.600019, 34.155652 ], "pop" : 25638, "state" : "CA" } +{ "_id" : "91367", "city" : "WOODLAND HILLS", "loc" : [ -118.615891, 34.176689 ], "pop" : 34253, "state" : "CA" } +{ "_id" : "91381", "city" : "NEWHALL", "loc" : [ -118.582134, 34.381067 ], "pop" : 1677, "state" : "CA" } +{ "_id" : "91384", "city" : "CASTAIC", "loc" : [ -118.62537, 34.482695 ], "pop" : 19440, "state" : "CA" } +{ "_id" : "91401", "city" : "VAN NUYS", "loc" : [ -118.432375, 34.180152 ], "pop" : 35990, "state" : "CA" } +{ "_id" : "91402", "city" : "PANORAMA CITY", "loc" : [ -118.447009, 34.226158 ], "pop" : 52577, "state" : "CA" } +{ "_id" : "91403", "city" : "SHERMAN OAKS", "loc" : [ -118.460325, 34.151407 ], "pop" : 20046, "state" : "CA" } +{ "_id" : "91405", "city" : "VAN NUYS", "loc" : [ -118.445636, 34.200068 ], "pop" : 39669, "state" : "CA" } +{ "_id" : "91406", "city" : "VAN NUYS", "loc" : [ -118.486821, 34.200568 ], "pop" : 46124, "state" : "CA" } +{ "_id" : "91411", "city" : "VAN NUYS", "loc" : [ -118.457396, 34.178133 ], "pop" : 21616, "state" : "CA" } +{ "_id" : "91423", "city" : "SHERMAN OAKS", "loc" : [ -118.432208, 34.152565 ], "pop" : 27747, "state" : "CA" } +{ "_id" : "91436", "city" : "ENCINO", "loc" : [ -118.488238, 34.15098 ], "pop" : 13605, "state" : "CA" } +{ "_id" : "91501", "city" : "BURBANK", "loc" : [ -118.300898, 34.186238 ], "pop" : 15991, "state" : "CA" } +{ "_id" : "91502", "city" : "BURBANK", "loc" : [ -118.305912, 34.174487 ], "pop" : 9833, "state" : "CA" } +{ "_id" : "91504", "city" : "BURBANK", "loc" : [ -118.326401, 34.200097 ], "pop" : 22656, "state" : "CA" } +{ "_id" : "91505", "city" : "BURBANK", "loc" : [ -118.344175, 34.168998 ], "pop" : 27676, "state" : "CA" } +{ "_id" : "91506", "city" : "BURBANK", "loc" : [ -118.323148, 34.171746 ], "pop" : 18336, "state" : "CA" } +{ "_id" : "91601", "city" : "NORTH HOLLYWOOD", "loc" : [ -118.371274, 34.16867 ], "pop" : 33882, "state" : "CA" } +{ "_id" : "91602", "city" : "TOLUCA LAKE", "loc" : [ -118.367606, 34.151095 ], "pop" : 14301, "state" : "CA" } +{ "_id" : "91604", "city" : "STUDIO CITY", "loc" : [ -118.391311, 34.143025 ], "pop" : 24354, "state" : "CA" } +{ "_id" : "91605", "city" : "NORTH HOLLYWOOD", "loc" : [ -118.400069, 34.205747 ], "pop" : 50050, "state" : "CA" } +{ "_id" : "91606", "city" : "NORTH HOLLYWOOD", "loc" : [ -118.386538, 34.187182 ], "pop" : 39737, "state" : "CA" } +{ "_id" : "91607", "city" : "VALLEY VILLAGE", "loc" : [ -118.398905, 34.167217 ], "pop" : 28021, "state" : "CA" } +{ "_id" : "91701", "city" : "ALTA LOMA", "loc" : [ -117.599149, 34.133922 ], "pop" : 31633, "state" : "CA" } +{ "_id" : "91702", "city" : "AZUSA", "loc" : [ -117.903083, 34.12476 ], "pop" : 52261, "state" : "CA" } +{ "_id" : "91706", "city" : "IRWINDALE", "loc" : [ -117.969539, 34.084245 ], "pop" : 69464, "state" : "CA" } +{ "_id" : "91709", "city" : "CHINO HILLS", "loc" : [ -117.730791, 33.979735 ], "pop" : 37965, "state" : "CA" } +{ "_id" : "91710", "city" : "CHINO", "loc" : [ -117.684401, 34.012532 ], "pop" : 69244, "state" : "CA" } +{ "_id" : "91711", "city" : "CLAREMONT", "loc" : [ -117.718293, 34.109167 ], "pop" : 34096, "state" : "CA" } +{ "_id" : "91719", "city" : "CORONA", "loc" : [ -117.531916, 33.861839 ], "pop" : 42717, "state" : "CA" } +{ "_id" : "91720", "city" : "CORONA", "loc" : [ -117.594288, 33.876995 ], "pop" : 55741, "state" : "CA" } +{ "_id" : "91722", "city" : "COVINA", "loc" : [ -117.906544, 34.097162 ], "pop" : 31703, "state" : "CA" } +{ "_id" : "91723", "city" : "COVINA", "loc" : [ -117.884285, 34.08596 ], "pop" : 15590, "state" : "CA" } +{ "_id" : "91724", "city" : "COVINA", "loc" : [ -117.855982, 34.093752 ], "pop" : 23462, "state" : "CA" } +{ "_id" : "91730", "city" : "RANCHO CUCAMONGA", "loc" : [ -117.59408, 34.107039 ], "pop" : 41087, "state" : "CA" } +{ "_id" : "91731", "city" : "EL MONTE", "loc" : [ -118.037108, 34.079142 ], "pop" : 26178, "state" : "CA" } +{ "_id" : "91732", "city" : "EL MONTE", "loc" : [ -118.01492, 34.070533 ], "pop" : 58059, "state" : "CA" } +{ "_id" : "91733", "city" : "SOUTH EL MONTE", "loc" : [ -118.044381, 34.055676 ], "pop" : 43691, "state" : "CA" } +{ "_id" : "91737", "city" : "ALTA LOMA", "loc" : [ -117.579295, 34.144883 ], "pop" : 19708, "state" : "CA" } +{ "_id" : "91739", "city" : "ETIWANDA", "loc" : [ -117.519329, 34.119873 ], "pop" : 13553, "state" : "CA" } +{ "_id" : "91740", "city" : "GLENDORA", "loc" : [ -117.855155, 34.128663 ], "pop" : 48836, "state" : "CA" } +{ "_id" : "91744", "city" : "INDUSTRY", "loc" : [ -117.934098, 34.029428 ], "pop" : 77114, "state" : "CA" } +{ "_id" : "91745", "city" : "HACIENDA HEIGHTS", "loc" : [ -117.965205, 33.997741 ], "pop" : 52182, "state" : "CA" } +{ "_id" : "91746", "city" : "BASSETT", "loc" : [ -117.980026, 34.050963 ], "pop" : 30330, "state" : "CA" } +{ "_id" : "91748", "city" : "ROWLAND HEIGHTS", "loc" : [ -117.896946, 33.981777 ], "pop" : 40511, "state" : "CA" } +{ "_id" : "91750", "city" : "LA VERNE", "loc" : [ -117.77077, 34.115905 ], "pop" : 33621, "state" : "CA" } +{ "_id" : "91752", "city" : "MIRA LOMA", "loc" : [ -117.523574, 33.993845 ], "pop" : 17368, "state" : "CA" } +{ "_id" : "91754", "city" : "MONTEREY PARK", "loc" : [ -118.127144, 34.053409 ], "pop" : 62133, "state" : "CA" } +{ "_id" : "91759", "city" : "MT BALDY", "loc" : [ -117.580219, 34.218082 ], "pop" : 430, "state" : "CA" } +{ "_id" : "91760", "city" : "NORCO", "loc" : [ -117.557866, 33.927983 ], "pop" : 23585, "state" : "CA" } +{ "_id" : "91761", "city" : "ONTARIO", "loc" : [ -117.618662, 34.031647 ], "pop" : 47921, "state" : "CA" } +{ "_id" : "91762", "city" : "ONTARIO", "loc" : [ -117.66647, 34.058415 ], "pop" : 47653, "state" : "CA" } +{ "_id" : "91763", "city" : "MONTCLAIR", "loc" : [ -117.698669, 34.073298 ], "pop" : 25862, "state" : "CA" } +{ "_id" : "91764", "city" : "ONTARIO", "loc" : [ -117.625402, 34.076308 ], "pop" : 41958, "state" : "CA" } +{ "_id" : "91765", "city" : "DIAMOND BAR", "loc" : [ -117.809822, 34.006585 ], "pop" : 41920, "state" : "CA" } +{ "_id" : "91766", "city" : "PHILLIPS RANCH", "loc" : [ -117.752086, 34.043268 ], "pop" : 64056, "state" : "CA" } +{ "_id" : "91767", "city" : "POMONA", "loc" : [ -117.736171, 34.081187 ], "pop" : 41420, "state" : "CA" } +{ "_id" : "91768", "city" : "POMONA", "loc" : [ -117.776312, 34.066168 ], "pop" : 31007, "state" : "CA" } +{ "_id" : "91770", "city" : "ROSEMEAD", "loc" : [ -118.08529, 34.065767 ], "pop" : 59898, "state" : "CA" } +{ "_id" : "91773", "city" : "SAN DIMAS", "loc" : [ -117.81694, 34.102263 ], "pop" : 32453, "state" : "CA" } +{ "_id" : "91775", "city" : "SAN GABRIEL", "loc" : [ -118.085658, 34.115486 ], "pop" : 21426, "state" : "CA" } +{ "_id" : "91776", "city" : "SAN GABRIEL", "loc" : [ -118.095471, 34.089027 ], "pop" : 34995, "state" : "CA" } +{ "_id" : "91780", "city" : "TEMPLE CITY", "loc" : [ -118.053652, 34.101586 ], "pop" : 31297, "state" : "CA" } +{ "_id" : "91786", "city" : "UPLAND", "loc" : [ -117.658336, 34.114432 ], "pop" : 66548, "state" : "CA" } +{ "_id" : "91789", "city" : "DIAMOND BAR", "loc" : [ -117.857828, 34.016625 ], "pop" : 42206, "state" : "CA" } +{ "_id" : "91790", "city" : "WEST COVINA", "loc" : [ -117.936643, 34.067336 ], "pop" : 38113, "state" : "CA" } +{ "_id" : "91791", "city" : "WEST COVINA", "loc" : [ -117.897767, 34.065267 ], "pop" : 25685, "state" : "CA" } +{ "_id" : "91792", "city" : "WEST COVINA", "loc" : [ -117.897459, 34.022852 ], "pop" : 30496, "state" : "CA" } +{ "_id" : "91801", "city" : "ALHAMBRA", "loc" : [ -118.129288, 34.091436 ], "pop" : 51148, "state" : "CA" } +{ "_id" : "91803", "city" : "ALHAMBRA", "loc" : [ -118.143354, 34.074514 ], "pop" : 30228, "state" : "CA" } +{ "_id" : "91901", "city" : "ALPINE", "loc" : [ -116.754328, 32.828161 ], "pop" : 12566, "state" : "CA" } +{ "_id" : "91902", "city" : "BONITA", "loc" : [ -117.022065, 32.667143 ], "pop" : 16579, "state" : "CA" } +{ "_id" : "91905", "city" : "BOULEVARD", "loc" : [ -116.319982, 32.671934 ], "pop" : 1163, "state" : "CA" } +{ "_id" : "91906", "city" : "CAMPO", "loc" : [ -116.490459, 32.660491 ], "pop" : 2657, "state" : "CA" } +{ "_id" : "91910", "city" : "CHULA VISTA", "loc" : [ -117.06756, 32.637139 ], "pop" : 56320, "state" : "CA" } +{ "_id" : "91911", "city" : "CHULA VISTA", "loc" : [ -117.056459, 32.608428 ], "pop" : 65952, "state" : "CA" } +{ "_id" : "91913", "city" : "CHULA VISTA", "loc" : [ -116.985237, 32.651296 ], "pop" : 10079, "state" : "CA" } +{ "_id" : "91914", "city" : "CHULA VISTA", "loc" : [ -116.96517, 32.65875 ], "pop" : 0, "state" : "CA" } +{ "_id" : "91915", "city" : "CHULA VISTA", "loc" : [ -116.940807, 32.631513 ], "pop" : 12, "state" : "CA" } +{ "_id" : "91916", "city" : "DESCANSO", "loc" : [ -116.602732, 32.872971 ], "pop" : 1826, "state" : "CA" } +{ "_id" : "91917", "city" : "DULZURA", "loc" : [ -116.728523, 32.615172 ], "pop" : 352, "state" : "CA" } +{ "_id" : "91932", "city" : "IMPERIAL BEACH", "loc" : [ -117.11478, 32.578289 ], "pop" : 26567, "state" : "CA" } +{ "_id" : "91934", "city" : "JACUMBA", "loc" : [ -116.195184, 32.624934 ], "pop" : 599, "state" : "CA" } +{ "_id" : "91935", "city" : "JAMUL", "loc" : [ -116.832332, 32.716289 ], "pop" : 7879, "state" : "CA" } +{ "_id" : "91941", "city" : "LA MESA", "loc" : [ -117.011541, 32.760431 ], "pop" : 42536, "state" : "CA" } +{ "_id" : "91942", "city" : "LA MESA", "loc" : [ -117.018879, 32.783506 ], "pop" : 23944, "state" : "CA" } +{ "_id" : "91945", "city" : "LEMON GROVE", "loc" : [ -117.032646, 32.73323 ], "pop" : 24268, "state" : "CA" } +{ "_id" : "91950", "city" : "NATIONAL CITY", "loc" : [ -117.089747, 32.674916 ], "pop" : 52005, "state" : "CA" } +{ "_id" : "91962", "city" : "PINE VALLEY", "loc" : [ -116.512733, 32.835047 ], "pop" : 1801, "state" : "CA" } +{ "_id" : "91963", "city" : "POTRERO", "loc" : [ -116.603748, 32.620477 ], "pop" : 638, "state" : "CA" } +{ "_id" : "91977", "city" : "SPRING VALLEY", "loc" : [ -116.997644, 32.724014 ], "pop" : 52403, "state" : "CA" } +{ "_id" : "91978", "city" : "SPRING VALLEY", "loc" : [ -116.959551, 32.732892 ], "pop" : 7601, "state" : "CA" } +{ "_id" : "91980", "city" : "TECATE", "loc" : [ -116.606397, 32.592205 ], "pop" : 230, "state" : "CA" } +{ "_id" : "92003", "city" : "BONSALL", "loc" : [ -117.18969, 33.294033 ], "pop" : 2910, "state" : "CA" } +{ "_id" : "92004", "city" : "BORREGO SPRINGS", "loc" : [ -116.351394, 33.238649 ], "pop" : 2633, "state" : "CA" } +{ "_id" : "92007", "city" : "CARDIFF BY THE S", "loc" : [ -117.274371, 33.025265 ], "pop" : 10236, "state" : "CA" } +{ "_id" : "92008", "city" : "CARLSBAD", "loc" : [ -117.324998, 33.160241 ], "pop" : 35651, "state" : "CA" } +{ "_id" : "92009", "city" : "CARLSBAD", "loc" : [ -117.261888, 33.095407 ], "pop" : 27019, "state" : "CA" } +{ "_id" : "92014", "city" : "DEL MAR", "loc" : [ -117.237314, 32.971474 ], "pop" : 19885, "state" : "CA" } +{ "_id" : "92019", "city" : "EL CAJON", "loc" : [ -116.919055, 32.777726 ], "pop" : 35425, "state" : "CA" } +{ "_id" : "92020", "city" : "EL CAJON", "loc" : [ -116.966504, 32.792765 ], "pop" : 55176, "state" : "CA" } +{ "_id" : "92021", "city" : "EL CAJON", "loc" : [ -116.922336, 32.817847 ], "pop" : 51773, "state" : "CA" } +{ "_id" : "92024", "city" : "ENCINITAS", "loc" : [ -117.26891, 33.053469 ], "pop" : 45995, "state" : "CA" } +{ "_id" : "92025", "city" : "ESCONDIDO", "loc" : [ -117.069987, 33.110117 ], "pop" : 39345, "state" : "CA" } +{ "_id" : "92026", "city" : "ESCONDIDO", "loc" : [ -117.097808, 33.160513 ], "pop" : 37176, "state" : "CA" } +{ "_id" : "92027", "city" : "ESCONDIDO", "loc" : [ -117.051966, 33.138824 ], "pop" : 39305, "state" : "CA" } +{ "_id" : "92028", "city" : "FALLBROOK", "loc" : [ -117.228952, 33.369015 ], "pop" : 35232, "state" : "CA" } +{ "_id" : "92029", "city" : "ESCONDIDO", "loc" : [ -117.112793, 33.089497 ], "pop" : 18174, "state" : "CA" } +{ "_id" : "92036", "city" : "JULIAN", "loc" : [ -116.565812, 33.053355 ], "pop" : 2552, "state" : "CA" } +{ "_id" : "92037", "city" : "LA JOLLA", "loc" : [ -117.25208, 32.845488 ], "pop" : 40399, "state" : "CA" } +{ "_id" : "92040", "city" : "LAKESIDE", "loc" : [ -116.920089, 32.856181 ], "pop" : 41054, "state" : "CA" } +{ "_id" : "92054", "city" : "OCEANSIDE", "loc" : [ -117.357294, 33.20723 ], "pop" : 61760, "state" : "CA" } +{ "_id" : "92055", "city" : "MARINE CORP BASE", "loc" : [ -117.409452, 33.327929 ], "pop" : 13643, "state" : "CA" } +{ "_id" : "92056", "city" : "OCEANSIDE", "loc" : [ -117.283089, 33.196784 ], "pop" : 40161, "state" : "CA" } +{ "_id" : "92057", "city" : "OCEANSIDE", "loc" : [ -117.302484, 33.240654 ], "pop" : 33178, "state" : "CA" } +{ "_id" : "92059", "city" : "PALA", "loc" : [ -117.071725, 33.377662 ], "pop" : 1064, "state" : "CA" } +{ "_id" : "92061", "city" : "PAUMA VALLEY", "loc" : [ -116.959552, 33.306285 ], "pop" : 1929, "state" : "CA" } +{ "_id" : "92064", "city" : "POWAY", "loc" : [ -117.040223, 32.975619 ], "pop" : 43490, "state" : "CA" } +{ "_id" : "92065", "city" : "RAMONA", "loc" : [ -116.853548, 33.029349 ], "pop" : 27744, "state" : "CA" } +{ "_id" : "92066", "city" : "RANCHITA", "loc" : [ -116.539121, 33.24055 ], "pop" : 389, "state" : "CA" } +{ "_id" : "92068", "city" : "SAN LUIS REY", "loc" : [ -117.306403, 33.294367 ], "pop" : 9471, "state" : "CA" } +{ "_id" : "92069", "city" : "SAN MARCOS", "loc" : [ -117.169716, 33.144386 ], "pop" : 45382, "state" : "CA" } +{ "_id" : "92070", "city" : "SANTA YSABEL", "loc" : [ -116.69635, 33.147579 ], "pop" : 1263, "state" : "CA" } +{ "_id" : "92071", "city" : "SANTEE", "loc" : [ -116.986154, 32.848636 ], "pop" : 52816, "state" : "CA" } +{ "_id" : "92075", "city" : "SOLANA BEACH", "loc" : [ -117.2598, 32.993739 ], "pop" : 12259, "state" : "CA" } +{ "_id" : "92082", "city" : "VALLEY CENTER", "loc" : [ -117.012232, 33.249046 ], "pop" : 13196, "state" : "CA" } +{ "_id" : "92083", "city" : "VISTA", "loc" : [ -117.245854, 33.187296 ], "pop" : 50641, "state" : "CA" } +{ "_id" : "92084", "city" : "VISTA", "loc" : [ -117.224285, 33.213118 ], "pop" : 38088, "state" : "CA" } +{ "_id" : "92086", "city" : "WARNER SPRINGS", "loc" : [ -116.721385, 33.303666 ], "pop" : 780, "state" : "CA" } +{ "_id" : "92101", "city" : "SAN DIEGO", "loc" : [ -117.159316, 32.71852 ], "pop" : 20265, "state" : "CA" } +{ "_id" : "92102", "city" : "SAN DIEGO", "loc" : [ -117.121858, 32.713893 ], "pop" : 45265, "state" : "CA" } +{ "_id" : "92103", "city" : "SAN DIEGO", "loc" : [ -117.163552, 32.746638 ], "pop" : 31123, "state" : "CA" } +{ "_id" : "92104", "city" : "SAN DIEGO", "loc" : [ -117.127189, 32.745425 ], "pop" : 44032, "state" : "CA" } +{ "_id" : "92105", "city" : "SAN DIEGO", "loc" : [ -117.094681, 32.7423 ], "pop" : 63344, "state" : "CA" } +{ "_id" : "92106", "city" : "SAN DIEGO", "loc" : [ -117.226829, 32.72725 ], "pop" : 27640, "state" : "CA" } +{ "_id" : "92107", "city" : "SAN DIEGO", "loc" : [ -117.243307, 32.742531 ], "pop" : 25913, "state" : "CA" } +{ "_id" : "92108", "city" : "SAN DIEGO", "loc" : [ -117.133525, 32.778327 ], "pop" : 8860, "state" : "CA" } +{ "_id" : "92109", "city" : "SAN DIEGO", "loc" : [ -117.240534, 32.796923 ], "pop" : 44804, "state" : "CA" } +{ "_id" : "92110", "city" : "SAN DIEGO", "loc" : [ -117.202847, 32.763476 ], "pop" : 26787, "state" : "CA" } +{ "_id" : "92111", "city" : "SAN DIEGO", "loc" : [ -117.17081, 32.797185 ], "pop" : 45487, "state" : "CA" } +{ "_id" : "92113", "city" : "SAN DIEGO", "loc" : [ -117.115257, 32.697047 ], "pop" : 44741, "state" : "CA" } +{ "_id" : "92114", "city" : "SAN DIEGO", "loc" : [ -117.05235, 32.705923 ], "pop" : 62258, "state" : "CA" } +{ "_id" : "92115", "city" : "SAN DIEGO", "loc" : [ -117.072056, 32.760742 ], "pop" : 51418, "state" : "CA" } +{ "_id" : "92116", "city" : "SAN DIEGO", "loc" : [ -117.124166, 32.762446 ], "pop" : 32279, "state" : "CA" } +{ "_id" : "92117", "city" : "SAN DIEGO", "loc" : [ -117.196536, 32.823948 ], "pop" : 49737, "state" : "CA" } +{ "_id" : "92118", "city" : "CORONADO", "loc" : [ -117.169823, 32.68069 ], "pop" : 16670, "state" : "CA" } +{ "_id" : "92119", "city" : "SAN DIEGO", "loc" : [ -117.026065, 32.803587 ], "pop" : 24135, "state" : "CA" } +{ "_id" : "92120", "city" : "SAN DIEGO", "loc" : [ -117.070708, 32.79581 ], "pop" : 25375, "state" : "CA" } +{ "_id" : "92121", "city" : "SAN DIEGO", "loc" : [ -117.203503, 32.891894 ], "pop" : 2286, "state" : "CA" } +{ "_id" : "92122", "city" : "SAN DIEGO", "loc" : [ -117.211507, 32.857736 ], "pop" : 30192, "state" : "CA" } +{ "_id" : "92123", "city" : "SAN DIEGO", "loc" : [ -117.139248, 32.797297 ], "pop" : 23541, "state" : "CA" } +{ "_id" : "92124", "city" : "SAN DIEGO", "loc" : [ -117.098613, 32.820113 ], "pop" : 29171, "state" : "CA" } +{ "_id" : "92126", "city" : "SAN DIEGO", "loc" : [ -117.140227, 32.916136 ], "pop" : 56676, "state" : "CA" } +{ "_id" : "92127", "city" : "SAN DIEGO", "loc" : [ -117.085596, 33.027854 ], "pop" : 11077, "state" : "CA" } +{ "_id" : "92128", "city" : "SAN DIEGO", "loc" : [ -117.068982, 33.00666 ], "pop" : 30437, "state" : "CA" } +{ "_id" : "92129", "city" : "SAN DIEGO", "loc" : [ -117.121308, 32.965185 ], "pop" : 43092, "state" : "CA" } +{ "_id" : "92130", "city" : "SAN DIEGO", "loc" : [ -117.225201, 32.955533 ], "pop" : 12681, "state" : "CA" } +{ "_id" : "92131", "city" : "SAN DIEGO", "loc" : [ -117.089758, 32.912343 ], "pop" : 16649, "state" : "CA" } +{ "_id" : "92135", "city" : "SAN DIEGO", "loc" : [ -117.19202, 32.702482 ], "pop" : 8122, "state" : "CA" } +{ "_id" : "92136", "city" : "SAN DIEGO", "loc" : [ -117.124678, 32.681585 ], "pop" : 11750, "state" : "CA" } +{ "_id" : "92139", "city" : "SAN DIEGO", "loc" : [ -117.047375, 32.680612 ], "pop" : 35577, "state" : "CA" } +{ "_id" : "92145", "city" : "SAN DIEGO", "loc" : [ -117.116518, 32.870365 ], "pop" : 3089, "state" : "CA" } +{ "_id" : "92154", "city" : "SAN DIEGO", "loc" : [ -117.070725, 32.575276 ], "pop" : 59925, "state" : "CA" } +{ "_id" : "92155", "city" : "SAN DIEGO", "loc" : [ -117.160335, 32.676144 ], "pop" : 1570, "state" : "CA" } +{ "_id" : "92173", "city" : "SAN YSIDRO", "loc" : [ -117.042976, 32.562567 ], "pop" : 30131, "state" : "CA" } +{ "_id" : "92201", "city" : "CHIRIACO SUMMIT", "loc" : [ -116.235729, 33.721899 ], "pop" : 47118, "state" : "CA" } +{ "_id" : "92210", "city" : "INDIAN WELLS", "loc" : [ -116.338129, 33.716334 ], "pop" : 2599, "state" : "CA" } +{ "_id" : "92220", "city" : "BANNING", "loc" : [ -116.889928, 33.92816 ], "pop" : 22545, "state" : "CA" } +{ "_id" : "92223", "city" : "BEAUMONT", "loc" : [ -116.970079, 33.950429 ], "pop" : 16176, "state" : "CA" } +{ "_id" : "92225", "city" : "LOST LAKE", "loc" : [ -114.597131, 33.605715 ], "pop" : 13852, "state" : "CA" } +{ "_id" : "92227", "city" : "BRAWLEY", "loc" : [ -115.529613, 32.979181 ], "pop" : 20199, "state" : "CA" } +{ "_id" : "92230", "city" : "CABAZON", "loc" : [ -116.773948, 33.908583 ], "pop" : 1697, "state" : "CA" } +{ "_id" : "92231", "city" : "CALEXICO", "loc" : [ -115.502815, 32.683227 ], "pop" : 22345, "state" : "CA" } +{ "_id" : "92233", "city" : "CALIPATRIA", "loc" : [ -115.511402, 33.166956 ], "pop" : 4847, "state" : "CA" } +{ "_id" : "92234", "city" : "CATHEDRAL CITY", "loc" : [ -116.466497, 33.809839 ], "pop" : 29640, "state" : "CA" } +{ "_id" : "92236", "city" : "COACHELLA", "loc" : [ -116.177231, 33.674965 ], "pop" : 17147, "state" : "CA" } +{ "_id" : "92239", "city" : "EAGLE MOUNTAIN", "loc" : [ -115.052603, 33.604941 ], "pop" : 4499, "state" : "CA" } +{ "_id" : "92240", "city" : "DESERT HOT SPRIN", "loc" : [ -116.366222, 33.904973 ], "pop" : 686, "state" : "CA" } +{ "_id" : "92242", "city" : "BIG RIVER", "loc" : [ -114.33928, 34.149142 ], "pop" : 976, "state" : "CA" } +{ "_id" : "92243", "city" : "EL CENTRO", "loc" : [ -115.566508, 32.789332 ], "pop" : 39246, "state" : "CA" } +{ "_id" : "92249", "city" : "HEBER", "loc" : [ -115.428281, 32.698918 ], "pop" : 206, "state" : "CA" } +{ "_id" : "92250", "city" : "HOLTVILLE", "loc" : [ -115.377456, 32.810387 ], "pop" : 7060, "state" : "CA" } +{ "_id" : "92251", "city" : "IMPERIAL", "loc" : [ -115.572984, 32.846954 ], "pop" : 6092, "state" : "CA" } +{ "_id" : "92252", "city" : "JOSHUA TREE", "loc" : [ -116.303763, 34.150163 ], "pop" : 8227, "state" : "CA" } +{ "_id" : "92253", "city" : "LA QUINTA", "loc" : [ -116.308081, 33.668474 ], "pop" : 9392, "state" : "CA" } +{ "_id" : "92256", "city" : "MORONGO VALLEY", "loc" : [ -116.565641, 34.060646 ], "pop" : 2721, "state" : "CA" } +{ "_id" : "92257", "city" : "NILAND", "loc" : [ -115.696455, 33.378373 ], "pop" : 875, "state" : "CA" } +{ "_id" : "92260", "city" : "PALM CITY", "loc" : [ -116.366442, 33.730842 ], "pop" : 31975, "state" : "CA" } +{ "_id" : "92262", "city" : "PALM SPRINGS", "loc" : [ -116.53466, 33.841406 ], "pop" : 22808, "state" : "CA" } +{ "_id" : "92264", "city" : "PALM SPRINGS", "loc" : [ -116.516958, 33.801828 ], "pop" : 18733, "state" : "CA" } +{ "_id" : "92267", "city" : "PARKER DAM", "loc" : [ -114.155969, 34.297977 ], "pop" : 141, "state" : "CA" } +{ "_id" : "92270", "city" : "RANCHO MIRAGE", "loc" : [ -116.422451, 33.764284 ], "pop" : 9737, "state" : "CA" } +{ "_id" : "92272", "city" : "BLYTHE", "loc" : [ -116.495855, 33.951256 ], "pop" : 18605, "state" : "CA" } +{ "_id" : "92274", "city" : "SALTON CITY", "loc" : [ -116.11584, 33.543418 ], "pop" : 19112, "state" : "CA" } +{ "_id" : "92276", "city" : "THOUSAND PALMS", "loc" : [ -116.371305, 33.808158 ], "pop" : 5557, "state" : "CA" } +{ "_id" : "92277", "city" : "TWENTYNINE PALMS", "loc" : [ -116.060133, 34.145509 ], "pop" : 13371, "state" : "CA" } +{ "_id" : "92278", "city" : "TWENTYNINE PALMS", "loc" : [ -116.06041, 34.237969 ], "pop" : 11412, "state" : "CA" } +{ "_id" : "92280", "city" : "VIDAL", "loc" : [ -114.565602, 34.156109 ], "pop" : 40, "state" : "CA" } +{ "_id" : "92281", "city" : "WESTMORLAND", "loc" : [ -115.630723, 33.041058 ], "pop" : 1902, "state" : "CA" } +{ "_id" : "92282", "city" : "WHITE WATER", "loc" : [ -116.693154, 33.927591 ], "pop" : 420, "state" : "CA" } +{ "_id" : "92283", "city" : "FELICITY", "loc" : [ -114.636634, 32.832922 ], "pop" : 3867, "state" : "CA" } +{ "_id" : "92284", "city" : "YUCCA VALLEY", "loc" : [ -116.431313, 34.155936 ], "pop" : 22131, "state" : "CA" } +{ "_id" : "92301", "city" : "ADELANTO", "loc" : [ -117.424189, 34.584128 ], "pop" : 7176, "state" : "CA" } +{ "_id" : "92304", "city" : "AMBOY", "loc" : [ -115.774907, 34.599012 ], "pop" : 29, "state" : "CA" } +{ "_id" : "92305", "city" : "ANGELUS OAKS", "loc" : [ -116.948482, 34.153149 ], "pop" : 238, "state" : "CA" } +{ "_id" : "92307", "city" : "APPLE VALLEY", "loc" : [ -117.2132, 34.529081 ], "pop" : 26066, "state" : "CA" } +{ "_id" : "92308", "city" : "APPLE VALLEY", "loc" : [ -117.192684, 34.469814 ], "pop" : 24973, "state" : "CA" } +{ "_id" : "92309", "city" : "BAKER", "loc" : [ -116.063754, 35.360573 ], "pop" : 606, "state" : "CA" } +{ "_id" : "92310", "city" : "FORT IRWIN", "loc" : [ -116.644759, 35.40148 ], "pop" : 6735, "state" : "CA" } +{ "_id" : "92311", "city" : "BARSTOW", "loc" : [ -117.038702, 34.89145 ], "pop" : 33076, "state" : "CA" } +{ "_id" : "92314", "city" : "BIG BEAR CITY", "loc" : [ -116.920412, 34.242233 ], "pop" : 18959, "state" : "CA" } +{ "_id" : "92316", "city" : "BLOOMINGTON", "loc" : [ -117.399295, 34.066198 ], "pop" : 22916, "state" : "CA" } +{ "_id" : "92320", "city" : "CALIMESA", "loc" : [ -117.04304, 33.994586 ], "pop" : 6345, "state" : "CA" } +{ "_id" : "92324", "city" : "GRAND TERRACE", "loc" : [ -117.318577, 34.057964 ], "pop" : 53822, "state" : "CA" } +{ "_id" : "92327", "city" : "DAGGETT", "loc" : [ -116.887555, 34.86677 ], "pop" : 701, "state" : "CA" } +{ "_id" : "92328", "city" : "DEATH VALLEY", "loc" : [ -116.893682, 36.467165 ], "pop" : 440, "state" : "CA" } +{ "_id" : "92332", "city" : "ESSEX", "loc" : [ -115.280344, 34.560626 ], "pop" : 214, "state" : "CA" } +{ "_id" : "92335", "city" : "FONTANA", "loc" : [ -117.455114, 34.079351 ], "pop" : 81255, "state" : "CA" } +{ "_id" : "92336", "city" : "FONTANA", "loc" : [ -117.437759, 34.117276 ], "pop" : 27957, "state" : "CA" } +{ "_id" : "92338", "city" : "LUDLOW", "loc" : [ -116.386202, 34.901779 ], "pop" : 383, "state" : "CA" } +{ "_id" : "92339", "city" : "FOREST FALLS", "loc" : [ -116.914147, 34.08805 ], "pop" : 842, "state" : "CA" } +{ "_id" : "92342", "city" : "HELENDALE", "loc" : [ -117.33666, 34.749859 ], "pop" : 3612, "state" : "CA" } +{ "_id" : "92345", "city" : "HESPERIA", "loc" : [ -117.302527, 34.422215 ], "pop" : 52170, "state" : "CA" } +{ "_id" : "92346", "city" : "EAST HIGHLAND", "loc" : [ -117.208717, 34.126969 ], "pop" : 37484, "state" : "CA" } +{ "_id" : "92347", "city" : "HINKLEY", "loc" : [ -117.180867, 34.92788 ], "pop" : 1905, "state" : "CA" } +{ "_id" : "92351", "city" : "KELSO", "loc" : [ -115.577574, 34.9678 ], "pop" : 30, "state" : "CA" } +{ "_id" : "92354", "city" : "LOMA LINDA", "loc" : [ -117.251286, 34.052833 ], "pop" : 17855, "state" : "CA" } +{ "_id" : "92356", "city" : "LUCERNE VALLEY", "loc" : [ -116.918857, 34.44695 ], "pop" : 4353, "state" : "CA" } +{ "_id" : "92358", "city" : "LYTLE CREEK", "loc" : [ -117.518613, 34.255755 ], "pop" : 625, "state" : "CA" } +{ "_id" : "92359", "city" : "MENTONE", "loc" : [ -117.112581, 34.077372 ], "pop" : 5832, "state" : "CA" } +{ "_id" : "92363", "city" : "NEEDLES", "loc" : [ -114.587134, 34.782369 ], "pop" : 6316, "state" : "CA" } +{ "_id" : "92364", "city" : "NIPTON", "loc" : [ -115.481436, 35.46761 ], "pop" : 390, "state" : "CA" } +{ "_id" : "92365", "city" : "NEWBERRY SPRINGS", "loc" : [ -116.746373, 34.885001 ], "pop" : 4296, "state" : "CA" } +{ "_id" : "92368", "city" : "ORO GRANDE", "loc" : [ -117.332733, 34.617832 ], "pop" : 852, "state" : "CA" } +{ "_id" : "92371", "city" : "PHELAN", "loc" : [ -117.519604, 34.444901 ], "pop" : 13508, "state" : "CA" } +{ "_id" : "92372", "city" : "PINON HILLS", "loc" : [ -117.640262, 34.442937 ], "pop" : 1741, "state" : "CA" } +{ "_id" : "92373", "city" : "REDLANDS", "loc" : [ -117.180352, 34.039659 ], "pop" : 29784, "state" : "CA" } +{ "_id" : "92374", "city" : "REDLANDS", "loc" : [ -117.167182, 34.064989 ], "pop" : 36952, "state" : "CA" } +{ "_id" : "92376", "city" : "RIALTO", "loc" : [ -117.377133, 34.113155 ], "pop" : 75341, "state" : "CA" } +{ "_id" : "92384", "city" : "SHOSHONE", "loc" : [ -116.264476, 35.899239 ], "pop" : 353, "state" : "CA" } +{ "_id" : "92389", "city" : "TECOPA", "loc" : [ -115.829824, 35.897925 ], "pop" : 48, "state" : "CA" } +{ "_id" : "92392", "city" : "SPRING VALLEY LA", "loc" : [ -117.319235, 34.503917 ], "pop" : 51968, "state" : "CA" } +{ "_id" : "92394", "city" : "GEORGE AFB", "loc" : [ -117.363516, 34.577325 ], "pop" : 6815, "state" : "CA" } +{ "_id" : "92397", "city" : "WRIGHTWOOD", "loc" : [ -117.6249, 34.362839 ], "pop" : 4148, "state" : "CA" } +{ "_id" : "92399", "city" : "YUCAIPA", "loc" : [ -117.048925, 34.028197 ], "pop" : 33298, "state" : "CA" } +{ "_id" : "92401", "city" : "SAN BERNARDINO", "loc" : [ -117.289753, 34.110521 ], "pop" : 1193, "state" : "CA" } +{ "_id" : "92404", "city" : "SAN BERNARDINO", "loc" : [ -117.260572, 34.142577 ], "pop" : 50792, "state" : "CA" } +{ "_id" : "92405", "city" : "MUSCOY", "loc" : [ -117.310765, 34.144101 ], "pop" : 35583, "state" : "CA" } +{ "_id" : "92407", "city" : "SAN BERNARDINO", "loc" : [ -117.293697, 34.20928 ], "pop" : 44927, "state" : "CA" } +{ "_id" : "92408", "city" : "SAN BERNARDINO", "loc" : [ -117.271059, 34.083127 ], "pop" : 13378, "state" : "CA" } +{ "_id" : "92409", "city" : "SAN BERNARDINO", "loc" : [ -117.241291, 34.103685 ], "pop" : 1746, "state" : "CA" } +{ "_id" : "92410", "city" : "SAN BERNARDINO", "loc" : [ -117.296789, 34.107729 ], "pop" : 42522, "state" : "CA" } +{ "_id" : "92411", "city" : "SAN BERNARDINO", "loc" : [ -117.317158, 34.121414 ], "pop" : 22994, "state" : "CA" } +{ "_id" : "92501", "city" : "RIVERSIDE", "loc" : [ -117.369421, 33.9924 ], "pop" : 18478, "state" : "CA" } +{ "_id" : "92503", "city" : "RIVERSIDE", "loc" : [ -117.458862, 33.920808 ], "pop" : 55552, "state" : "CA" } +{ "_id" : "92504", "city" : "RIVERSIDE", "loc" : [ -117.411948, 33.931458 ], "pop" : 45308, "state" : "CA" } +{ "_id" : "92505", "city" : "RIVERSIDE", "loc" : [ -117.486687, 33.922769 ], "pop" : 37420, "state" : "CA" } +{ "_id" : "92506", "city" : "RIVERSIDE", "loc" : [ -117.375696, 33.945485 ], "pop" : 37294, "state" : "CA" } +{ "_id" : "92507", "city" : "RIVERSIDE", "loc" : [ -117.338874, 33.976086 ], "pop" : 45844, "state" : "CA" } +{ "_id" : "92508", "city" : "RIVERSIDE", "loc" : [ -117.304264, 33.889676 ], "pop" : 13582, "state" : "CA" } +{ "_id" : "92509", "city" : "RUBIDOUX", "loc" : [ -117.444896, 33.997355 ], "pop" : 52456, "state" : "CA" } +{ "_id" : "92530", "city" : "LAKE ELSINORE", "loc" : [ -117.348535, 33.659816 ], "pop" : 34619, "state" : "CA" } +{ "_id" : "92532", "city" : "LAKE ELSINORE", "loc" : [ -117.271278, 33.651662 ], "pop" : 6796, "state" : "CA" } +{ "_id" : "92536", "city" : "AGUANGA", "loc" : [ -116.799693, 33.447306 ], "pop" : 2309, "state" : "CA" } +{ "_id" : "92539", "city" : "ANZA", "loc" : [ -116.71355, 33.568812 ], "pop" : 1860, "state" : "CA" } +{ "_id" : "92543", "city" : "HEMET", "loc" : [ -116.972974, 33.741613 ], "pop" : 26985, "state" : "CA" } +{ "_id" : "92544", "city" : "HEMET", "loc" : [ -116.924306, 33.738978 ], "pop" : 34483, "state" : "CA" } +{ "_id" : "92545", "city" : "HEMET", "loc" : [ -117.015078, 33.739857 ], "pop" : 19513, "state" : "CA" } +{ "_id" : "92548", "city" : "HOMELAND", "loc" : [ -117.111845, 33.74528 ], "pop" : 4290, "state" : "CA" } +{ "_id" : "92549", "city" : "IDYLLWILD", "loc" : [ -116.710665, 33.730433 ], "pop" : 3975, "state" : "CA" } +{ "_id" : "92553", "city" : "MORENO VALLEY", "loc" : [ -117.235066, 33.915719 ], "pop" : 71314, "state" : "CA" } +{ "_id" : "92555", "city" : "MORENO VALLEY", "loc" : [ -117.185105, 33.937659 ], "pop" : 9784, "state" : "CA" } +{ "_id" : "92557", "city" : "MORENO VALLEY", "loc" : [ -117.245682, 33.955257 ], "pop" : 37853, "state" : "CA" } +{ "_id" : "92561", "city" : "MOUNTAIN CENTER", "loc" : [ -116.581954, 33.531667 ], "pop" : 1896, "state" : "CA" } +{ "_id" : "92562", "city" : "MURRIETA", "loc" : [ -117.273838, 33.563071 ], "pop" : 1988, "state" : "CA" } +{ "_id" : "92563", "city" : "MURRIETA", "loc" : [ -117.178298, 33.56903 ], "pop" : 22649, "state" : "CA" } +{ "_id" : "92567", "city" : "LAKEVIEW", "loc" : [ -117.118704, 33.807712 ], "pop" : 6480, "state" : "CA" } +{ "_id" : "92570", "city" : "MEAD VALLEY", "loc" : [ -117.280005, 33.797535 ], "pop" : 31870, "state" : "CA" } +{ "_id" : "92571", "city" : "PERRIS", "loc" : [ -117.217968, 33.810979 ], "pop" : 12436, "state" : "CA" } +{ "_id" : "92582", "city" : "SAN JACINTO", "loc" : [ -116.981911, 33.788281 ], "pop" : 3233, "state" : "CA" } +{ "_id" : "92583", "city" : "GILMAN HOT SPRIN", "loc" : [ -116.955201, 33.78604 ], "pop" : 15506, "state" : "CA" } +{ "_id" : "92584", "city" : "MENIFEE", "loc" : [ -117.1743, 33.664744 ], "pop" : 8347, "state" : "CA" } +{ "_id" : "92585", "city" : "ROMOLAND", "loc" : [ -117.171899, 33.744518 ], "pop" : 5231, "state" : "CA" } +{ "_id" : "92586", "city" : "SUN CITY", "loc" : [ -117.196942, 33.704373 ], "pop" : 15225, "state" : "CA" } +{ "_id" : "92587", "city" : "CANYON LAKE", "loc" : [ -117.252653, 33.688756 ], "pop" : 12522, "state" : "CA" } +{ "_id" : "92590", "city" : "TEMECULA", "loc" : [ -117.182437, 33.490269 ], "pop" : 2128, "state" : "CA" } +{ "_id" : "92591", "city" : "TEMECULA", "loc" : [ -117.128571, 33.521687 ], "pop" : 13480, "state" : "CA" } +{ "_id" : "92592", "city" : "TEMECULA", "loc" : [ -117.095774, 33.498314 ], "pop" : 15567, "state" : "CA" } +{ "_id" : "92595", "city" : "WILDOMAR", "loc" : [ -117.263953, 33.602115 ], "pop" : 4758, "state" : "CA" } +{ "_id" : "92596", "city" : "WINCHESTER", "loc" : [ -117.088518, 33.624269 ], "pop" : 1195, "state" : "CA" } +{ "_id" : "92610", "city" : "FOOTHILL RANCH", "loc" : [ -117.664995, 33.666822 ], "pop" : 3294, "state" : "CA" } +{ "_id" : "92621", "city" : "BREA", "loc" : [ -117.886742, 33.922897 ], "pop" : 45577, "state" : "CA" } +{ "_id" : "92624", "city" : "CAPISTRANO BEACH", "loc" : [ -117.662657, 33.459115 ], "pop" : 7498, "state" : "CA" } +{ "_id" : "92625", "city" : "CORONA DEL MAR", "loc" : [ -117.874331, 33.602066 ], "pop" : 5166, "state" : "CA" } +{ "_id" : "92626", "city" : "COSTA MESA", "loc" : [ -117.909623, 33.677711 ], "pop" : 45411, "state" : "CA" } +{ "_id" : "92627", "city" : "COSTA MESA", "loc" : [ -117.917667, 33.647793 ], "pop" : 52357, "state" : "CA" } +{ "_id" : "92629", "city" : "MONARCH BAY", "loc" : [ -117.700483, 33.476964 ], "pop" : 25618, "state" : "CA" } +{ "_id" : "92630", "city" : "LAKE FOREST", "loc" : [ -117.68819, 33.640015 ], "pop" : 51666, "state" : "CA" } +{ "_id" : "92631", "city" : "FULLERTON", "loc" : [ -117.89157, 33.880519 ], "pop" : 28902, "state" : "CA" } +{ "_id" : "92632", "city" : "FULLERTON", "loc" : [ -117.928376, 33.865848 ], "pop" : 21680, "state" : "CA" } +{ "_id" : "92633", "city" : "FULLERTON", "loc" : [ -117.961043, 33.873913 ], "pop" : 42033, "state" : "CA" } +{ "_id" : "92635", "city" : "FULLERTON", "loc" : [ -117.927801, 33.901181 ], "pop" : 10531, "state" : "CA" } +{ "_id" : "92640", "city" : "GARDEN GROVE", "loc" : [ -117.92906, 33.785826 ], "pop" : 43908, "state" : "CA" } +{ "_id" : "92641", "city" : "GARDEN GROVE", "loc" : [ -117.975526, 33.786651 ], "pop" : 29308, "state" : "CA" } +{ "_id" : "92643", "city" : "GARDEN GROVE", "loc" : [ -117.930193, 33.762641 ], "pop" : 39473, "state" : "CA" } +{ "_id" : "92644", "city" : "GARDEN GROVE", "loc" : [ -117.96935, 33.765532 ], "pop" : 20467, "state" : "CA" } +{ "_id" : "92645", "city" : "GARDEN GROVE", "loc" : [ -118.02639, 33.78324 ], "pop" : 16398, "state" : "CA" } +{ "_id" : "92646", "city" : "HUNTINGTON BEACH", "loc" : [ -117.967771, 33.668448 ], "pop" : 57915, "state" : "CA" } +{ "_id" : "92647", "city" : "HUNTINGTON BEACH", "loc" : [ -118.003035, 33.721018 ], "pop" : 56565, "state" : "CA" } +{ "_id" : "92648", "city" : "HUNTINGTON BEACH", "loc" : [ -117.999012, 33.674577 ], "pop" : 34997, "state" : "CA" } +{ "_id" : "92649", "city" : "HUNTINGTON BEACH", "loc" : [ -118.045142, 33.719111 ], "pop" : 34065, "state" : "CA" } +{ "_id" : "92651", "city" : "LAGUNA NIGUEL", "loc" : [ -117.772351, 33.542927 ], "pop" : 20315, "state" : "CA" } +{ "_id" : "92653", "city" : "LAGUNA HILLS", "loc" : [ -117.70854, 33.60028 ], "pop" : 45283, "state" : "CA" } +{ "_id" : "92655", "city" : "MIDWAY CITY", "loc" : [ -117.983539, 33.744794 ], "pop" : 6224, "state" : "CA" } +{ "_id" : "92656", "city" : "ALISO VIEJO", "loc" : [ -117.708906, 33.572367 ], "pop" : 16455, "state" : "CA" } +{ "_id" : "92657", "city" : "NEWPORT BEACH", "loc" : [ -117.855317, 33.596382 ], "pop" : 8254, "state" : "CA" } +{ "_id" : "92660", "city" : "NEWPORT BEACH", "loc" : [ -117.8757, 33.630027 ], "pop" : 25390, "state" : "CA" } +{ "_id" : "92661", "city" : "NEWPORT BEACH", "loc" : [ -117.906237, 33.604429 ], "pop" : 6123, "state" : "CA" } +{ "_id" : "92662", "city" : "NEWPORT BEACH", "loc" : [ -117.891732, 33.606459 ], "pop" : 3472, "state" : "CA" } +{ "_id" : "92663", "city" : "NEWPORT BEACH", "loc" : [ -117.92788, 33.623084 ], "pop" : 19826, "state" : "CA" } +{ "_id" : "92665", "city" : "ORANGE", "loc" : [ -117.844903, 33.83096 ], "pop" : 16566, "state" : "CA" } +{ "_id" : "92666", "city" : "ORANGE", "loc" : [ -117.845461, 33.785258 ], "pop" : 13811, "state" : "CA" } +{ "_id" : "92667", "city" : "VILLA PARK", "loc" : [ -117.828421, 33.81036 ], "pop" : 40937, "state" : "CA" } +{ "_id" : "92668", "city" : "ORANGE", "loc" : [ -117.87532, 33.786481 ], "pop" : 20139, "state" : "CA" } +{ "_id" : "92669", "city" : "ORANGE", "loc" : [ -117.800285, 33.791672 ], "pop" : 31583, "state" : "CA" } +{ "_id" : "92670", "city" : "PLACENTIA", "loc" : [ -117.859837, 33.880323 ], "pop" : 47174, "state" : "CA" } +{ "_id" : "92672", "city" : "SAN CLEMENTE", "loc" : [ -117.610139, 33.430809 ], "pop" : 46719, "state" : "CA" } +{ "_id" : "92675", "city" : "MISSION VIEJO", "loc" : [ -117.657409, 33.511714 ], "pop" : 28121, "state" : "CA" } +{ "_id" : "92677", "city" : "LAGUNA NIGUEL", "loc" : [ -117.705154, 33.522871 ], "pop" : 40072, "state" : "CA" } +{ "_id" : "92679", "city" : "COTO DE CAZA", "loc" : [ -117.577709, 33.634576 ], "pop" : 6067, "state" : "CA" } +{ "_id" : "92680", "city" : "TUSTIN", "loc" : [ -117.819193, 33.73713 ], "pop" : 51150, "state" : "CA" } +{ "_id" : "92683", "city" : "WESTMINSTER", "loc" : [ -117.991312, 33.752756 ], "pop" : 77965, "state" : "CA" } +{ "_id" : "92686", "city" : "YORBA LINDA", "loc" : [ -117.799619, 33.888361 ], "pop" : 41141, "state" : "CA" } +{ "_id" : "92687", "city" : "YORBA LINDA", "loc" : [ -117.731162, 33.88238 ], "pop" : 14429, "state" : "CA" } +{ "_id" : "92688", "city" : "RANCHO SANTA MAR", "loc" : [ -117.588388, 33.651822 ], "pop" : 9489, "state" : "CA" } +{ "_id" : "92691", "city" : "MISSION VIEJO", "loc" : [ -117.664119, 33.617155 ], "pop" : 48832, "state" : "CA" } +{ "_id" : "92692", "city" : "MISSION VIEJO", "loc" : [ -117.64245, 33.610872 ], "pop" : 30777, "state" : "CA" } +{ "_id" : "92701", "city" : "SANTA ANA", "loc" : [ -117.857665, 33.75016 ], "pop" : 63544, "state" : "CA" } +{ "_id" : "92703", "city" : "SANTA ANA", "loc" : [ -117.899589, 33.746613 ], "pop" : 63104, "state" : "CA" } +{ "_id" : "92704", "city" : "SANTA ANA", "loc" : [ -117.904683, 33.726513 ], "pop" : 77151, "state" : "CA" } +{ "_id" : "92705", "city" : "COWAN HEIGHTS", "loc" : [ -117.768902, 33.74866 ], "pop" : 37045, "state" : "CA" } +{ "_id" : "92706", "city" : "SANTA ANA", "loc" : [ -117.881791, 33.764434 ], "pop" : 30673, "state" : "CA" } +{ "_id" : "92707", "city" : "SANTA ANA HEIGHT", "loc" : [ -117.870346, 33.715938 ], "pop" : 56450, "state" : "CA" } +{ "_id" : "92708", "city" : "FOUNTAIN VALLEY", "loc" : [ -117.952318, 33.710762 ], "pop" : 54803, "state" : "CA" } +{ "_id" : "92709", "city" : "EL TORO MARINE C", "loc" : [ -117.715018, 33.681287 ], "pop" : 8078, "state" : "CA" } +{ "_id" : "92714", "city" : "IRVINE", "loc" : [ -117.798928, 33.68764 ], "pop" : 60654, "state" : "CA" } +{ "_id" : "92715", "city" : "IRVINE", "loc" : [ -117.821251, 33.650884 ], "pop" : 30690, "state" : "CA" } +{ "_id" : "92718", "city" : "IRVINE", "loc" : [ -117.711476, 33.658179 ], "pop" : 1, "state" : "CA" } +{ "_id" : "92720", "city" : "IRVINE", "loc" : [ -117.765533, 33.707495 ], "pop" : 23474, "state" : "CA" } +{ "_id" : "92801", "city" : "ANAHEIM", "loc" : [ -117.954035, 33.842679 ], "pop" : 47392, "state" : "CA" } +{ "_id" : "92802", "city" : "ANAHEIM", "loc" : [ -117.92219, 33.806909 ], "pop" : 36262, "state" : "CA" } +{ "_id" : "92804", "city" : "ANAHEIM", "loc" : [ -117.974985, 33.81908 ], "pop" : 63622, "state" : "CA" } +{ "_id" : "92805", "city" : "ANAHEIM", "loc" : [ -117.906263, 33.835332 ], "pop" : 55489, "state" : "CA" } +{ "_id" : "92806", "city" : "ANAHEIM", "loc" : [ -117.875928, 33.837344 ], "pop" : 27945, "state" : "CA" } +{ "_id" : "92807", "city" : "ANAHEIM", "loc" : [ -117.787657, 33.851583 ], "pop" : 35411, "state" : "CA" } +{ "_id" : "92808", "city" : "ANAHEIM", "loc" : [ -117.748445, 33.857569 ], "pop" : 6206, "state" : "CA" } +{ "_id" : "93001", "city" : "SAN BUENAVENTURA", "loc" : [ -119.28882, 34.290531 ], "pop" : 31453, "state" : "CA" } +{ "_id" : "93003", "city" : "SAN BUENAVENTURA", "loc" : [ -119.2214, 34.270568 ], "pop" : 44627, "state" : "CA" } +{ "_id" : "93004", "city" : "SAN BUENAVENTURA", "loc" : [ -119.168727, 34.278091 ], "pop" : 23430, "state" : "CA" } +{ "_id" : "93010", "city" : "CAMARILLO", "loc" : [ -119.046361, 34.231328 ], "pop" : 40173, "state" : "CA" } +{ "_id" : "93012", "city" : "CAMARILLO", "loc" : [ -118.986648, 34.22179 ], "pop" : 23489, "state" : "CA" } +{ "_id" : "93013", "city" : "CARPINTERIA", "loc" : [ -119.518257, 34.403589 ], "pop" : 16591, "state" : "CA" } +{ "_id" : "93015", "city" : "BARDSDALE", "loc" : [ -118.904071, 34.402557 ], "pop" : 15311, "state" : "CA" } +{ "_id" : "93021", "city" : "MOORPARK", "loc" : [ -118.877139, 34.278421 ], "pop" : 27011, "state" : "CA" } +{ "_id" : "93022", "city" : "OAK VIEW", "loc" : [ -119.298168, 34.402021 ], "pop" : 5611, "state" : "CA" } +{ "_id" : "93023", "city" : "OJAI", "loc" : [ -119.256477, 34.44512 ], "pop" : 22778, "state" : "CA" } +{ "_id" : "93030", "city" : "OXNARD", "loc" : [ -119.174952, 34.214142 ], "pop" : 66240, "state" : "CA" } +{ "_id" : "93033", "city" : "OXNARD", "loc" : [ -119.171732, 34.168505 ], "pop" : 66043, "state" : "CA" } +{ "_id" : "93035", "city" : "OXNARD", "loc" : [ -119.215975, 34.182177 ], "pop" : 23778, "state" : "CA" } +{ "_id" : "93041", "city" : "PORT HUENEME", "loc" : [ -119.197317, 34.162572 ], "pop" : 17337, "state" : "CA" } +{ "_id" : "93042", "city" : "POINT MUGU NAWC", "loc" : [ -119.09931, 34.123432 ], "pop" : 1707, "state" : "CA" } +{ "_id" : "93043", "city" : "PORT HUENEME CBC", "loc" : [ -119.206008, 34.16212 ], "pop" : 3389, "state" : "CA" } +{ "_id" : "93060", "city" : "SANTA PAULA", "loc" : [ -119.071328, 34.354718 ], "pop" : 28319, "state" : "CA" } +{ "_id" : "93063", "city" : "SANTA SUSANA", "loc" : [ -118.699229, 34.279202 ], "pop" : 47637, "state" : "CA" } +{ "_id" : "93065", "city" : "SIMI VALLEY", "loc" : [ -118.765349, 34.265589 ], "pop" : 55528, "state" : "CA" } +{ "_id" : "93066", "city" : "SOMIS", "loc" : [ -119.011537, 34.279753 ], "pop" : 3025, "state" : "CA" } +{ "_id" : "93067", "city" : "SUMMERLAND", "loc" : [ -119.596016, 34.424541 ], "pop" : 1330, "state" : "CA" } +{ "_id" : "93101", "city" : "SANTA BARBARA", "loc" : [ -119.70782, 34.419668 ], "pop" : 29235, "state" : "CA" } +{ "_id" : "93103", "city" : "SANTA BARBARA", "loc" : [ -119.683275, 34.429065 ], "pop" : 18199, "state" : "CA" } +{ "_id" : "93105", "city" : "SANTA BARBARA", "loc" : [ -119.728538, 34.436915 ], "pop" : 23284, "state" : "CA" } +{ "_id" : "93108", "city" : "MONTECITO", "loc" : [ -119.64255, 34.434258 ], "pop" : 12923, "state" : "CA" } +{ "_id" : "93109", "city" : "SANTA BARBARA", "loc" : [ -119.7194, 34.403848 ], "pop" : 11089, "state" : "CA" } +{ "_id" : "93110", "city" : "SANTA BARBARA", "loc" : [ -119.764668, 34.441814 ], "pop" : 15352, "state" : "CA" } +{ "_id" : "93111", "city" : "SANTA BARBARA", "loc" : [ -119.802509, 34.445262 ], "pop" : 17689, "state" : "CA" } +{ "_id" : "93117", "city" : "GOLETA", "loc" : [ -119.861245, 34.429631 ], "pop" : 45988, "state" : "CA" } +{ "_id" : "93202", "city" : "ARMONA", "loc" : [ -119.705279, 36.309459 ], "pop" : 752, "state" : "CA" } +{ "_id" : "93203", "city" : "ARVIN", "loc" : [ -118.8336, 35.196629 ], "pop" : 10613, "state" : "CA" } +{ "_id" : "93204", "city" : "AVENAL", "loc" : [ -120.122716, 35.987667 ], "pop" : 9882, "state" : "CA" } +{ "_id" : "93205", "city" : "BODFISH", "loc" : [ -118.484656, 35.587046 ], "pop" : 1407, "state" : "CA" } +{ "_id" : "93206", "city" : "BUTTONWILLOW", "loc" : [ -119.465926, 35.403268 ], "pop" : 1975, "state" : "CA" } +{ "_id" : "93207", "city" : "CALIFORNIA HOT S", "loc" : [ -118.646317, 35.892422 ], "pop" : 436, "state" : "CA" } +{ "_id" : "93210", "city" : "COALINGA", "loc" : [ -120.348928, 36.162435 ], "pop" : 9579, "state" : "CA" } +{ "_id" : "93212", "city" : "CORCORAN", "loc" : [ -119.560665, 36.086455 ], "pop" : 16228, "state" : "CA" } +{ "_id" : "93214", "city" : "CUYAMA", "loc" : [ -119.661339, 34.933694 ], "pop" : 808, "state" : "CA" } +{ "_id" : "93215", "city" : "DELANO", "loc" : [ -119.24594, 35.771511 ], "pop" : 23803, "state" : "CA" } +{ "_id" : "93217", "city" : "DI GIORGIO", "loc" : [ -118.846755, 35.247604 ], "pop" : 258, "state" : "CA" } +{ "_id" : "93219", "city" : "EARLIMART", "loc" : [ -119.253406, 35.854195 ], "pop" : 11963, "state" : "CA" } +{ "_id" : "93221", "city" : "EXETER", "loc" : [ -119.12928, 36.304055 ], "pop" : 11088, "state" : "CA" } +{ "_id" : "93223", "city" : "FARMERSVILLE", "loc" : [ -119.205357, 36.300169 ], "pop" : 6432, "state" : "CA" } +{ "_id" : "93224", "city" : "FELLOWS", "loc" : [ -119.564757, 35.202579 ], "pop" : 521, "state" : "CA" } +{ "_id" : "93225", "city" : "FRAZIER PARK", "loc" : [ -119.035488, 34.826463 ], "pop" : 5257, "state" : "CA" } +{ "_id" : "93226", "city" : "GLENNVILLE", "loc" : [ -118.71693, 35.737677 ], "pop" : 346, "state" : "CA" } +{ "_id" : "93230", "city" : "HANFORD", "loc" : [ -119.649094, 36.331419 ], "pop" : 44686, "state" : "CA" } +{ "_id" : "93234", "city" : "HURON", "loc" : [ -120.101964, 36.237144 ], "pop" : 7050, "state" : "CA" } +{ "_id" : "93235", "city" : "IVANHOE", "loc" : [ -119.218884, 36.385622 ], "pop" : 3326, "state" : "CA" } +{ "_id" : "93238", "city" : "KERNVILLE", "loc" : [ -118.404723, 35.755005 ], "pop" : 812, "state" : "CA" } +{ "_id" : "93239", "city" : "KETTLEMAN CITY", "loc" : [ -119.964361, 36.021501 ], "pop" : 1762, "state" : "CA" } +{ "_id" : "93240", "city" : "MOUNTAIN MESA", "loc" : [ -118.441256, 35.617889 ], "pop" : 6285, "state" : "CA" } +{ "_id" : "93241", "city" : "LAMONT", "loc" : [ -118.912419, 35.257059 ], "pop" : 13471, "state" : "CA" } +{ "_id" : "93242", "city" : "LATON", "loc" : [ -119.715565, 36.437834 ], "pop" : 2860, "state" : "CA" } +{ "_id" : "93243", "city" : "GORMAN", "loc" : [ -118.879126, 34.828862 ], "pop" : 1103, "state" : "CA" } +{ "_id" : "93244", "city" : "LEMONCOVE", "loc" : [ -119.004986, 36.396084 ], "pop" : 64, "state" : "CA" } +{ "_id" : "93245", "city" : "LEMOORE NAVAL AI", "loc" : [ -119.831017, 36.309535 ], "pop" : 26170, "state" : "CA" } +{ "_id" : "93247", "city" : "LINDSAY", "loc" : [ -119.088427, 36.209551 ], "pop" : 12983, "state" : "CA" } +{ "_id" : "93249", "city" : "LOST HILLS", "loc" : [ -119.721573, 35.613111 ], "pop" : 2373, "state" : "CA" } +{ "_id" : "93250", "city" : "MC FARLAND", "loc" : [ -119.227156, 35.675779 ], "pop" : 8494, "state" : "CA" } +{ "_id" : "93251", "city" : "MC KITTRICK", "loc" : [ -119.636627, 35.303097 ], "pop" : 616, "state" : "CA" } +{ "_id" : "93252", "city" : "MARICOPA", "loc" : [ -119.407661, 35.038353 ], "pop" : 1571, "state" : "CA" } +{ "_id" : "93254", "city" : "NEW CUYAMA", "loc" : [ -119.823806, 34.996709 ], "pop" : 80, "state" : "CA" } +{ "_id" : "93255", "city" : "ONYX", "loc" : [ -118.190227, 35.713584 ], "pop" : 380, "state" : "CA" } +{ "_id" : "93256", "city" : "PIXLEY", "loc" : [ -119.256427, 35.955286 ], "pop" : 4768, "state" : "CA" } +{ "_id" : "93257", "city" : "PORTERVILLE", "loc" : [ -119.031549, 36.068636 ], "pop" : 54599, "state" : "CA" } +{ "_id" : "93260", "city" : "POSEY", "loc" : [ -118.664286, 35.813496 ], "pop" : 253, "state" : "CA" } +{ "_id" : "93262", "city" : "GIANT FOREST", "loc" : [ -118.772271, 36.573878 ], "pop" : 132, "state" : "CA" } +{ "_id" : "93263", "city" : "SHAFTER", "loc" : [ -119.280075, 35.496994 ], "pop" : 12270, "state" : "CA" } +{ "_id" : "93265", "city" : "SPRINGVILLE", "loc" : [ -118.796059, 36.136314 ], "pop" : 3374, "state" : "CA" } +{ "_id" : "93266", "city" : "STRATFORD", "loc" : [ -119.823564, 36.178976 ], "pop" : 1135, "state" : "CA" } +{ "_id" : "93267", "city" : "STRATHMORE", "loc" : [ -119.079163, 36.147237 ], "pop" : 4774, "state" : "CA" } +{ "_id" : "93268", "city" : "TAFT", "loc" : [ -119.455674, 35.148164 ], "pop" : 15046, "state" : "CA" } +{ "_id" : "93270", "city" : "TERRA BELLA", "loc" : [ -119.031239, 35.95698 ], "pop" : 5066, "state" : "CA" } +{ "_id" : "93271", "city" : "THREE RIVERS", "loc" : [ -118.88754, 36.437686 ], "pop" : 2245, "state" : "CA" } +{ "_id" : "93272", "city" : "TIPTON", "loc" : [ -119.30781, 36.054567 ], "pop" : 2365, "state" : "CA" } +{ "_id" : "93274", "city" : "TULARE", "loc" : [ -119.33802, 36.202155 ], "pop" : 45567, "state" : "CA" } +{ "_id" : "93276", "city" : "TUPMAN", "loc" : [ -119.341994, 35.288547 ], "pop" : 280, "state" : "CA" } +{ "_id" : "93277", "city" : "VISALIA", "loc" : [ -119.306471, 36.311379 ], "pop" : 51620, "state" : "CA" } +{ "_id" : "93280", "city" : "POND", "loc" : [ -119.344728, 35.593375 ], "pop" : 13589, "state" : "CA" } +{ "_id" : "93283", "city" : "WELDON", "loc" : [ -118.285856, 35.639076 ], "pop" : 2049, "state" : "CA" } +{ "_id" : "93285", "city" : "WOFFORD HEIGHTS", "loc" : [ -118.455877, 35.724556 ], "pop" : 3480, "state" : "CA" } +{ "_id" : "93286", "city" : "WOODLAKE", "loc" : [ -119.091764, 36.431334 ], "pop" : 8421, "state" : "CA" } +{ "_id" : "93287", "city" : "WOODY", "loc" : [ -118.843872, 35.70681 ], "pop" : 72, "state" : "CA" } +{ "_id" : "93291", "city" : "VISALIA", "loc" : [ -119.301029, 36.355108 ], "pop" : 46656, "state" : "CA" } +{ "_id" : "93301", "city" : "BAKERSFIELD", "loc" : [ -119.017063, 35.386611 ], "pop" : 12822, "state" : "CA" } +{ "_id" : "93304", "city" : "BAKERSFIELD", "loc" : [ -119.021793, 35.339581 ], "pop" : 41870, "state" : "CA" } +{ "_id" : "93305", "city" : "COLLEGE HEIGHTS", "loc" : [ -118.982042, 35.387772 ], "pop" : 34046, "state" : "CA" } +{ "_id" : "93306", "city" : "BAKERSFIELD", "loc" : [ -118.939104, 35.386697 ], "pop" : 46699, "state" : "CA" } +{ "_id" : "93307", "city" : "BAKERSFIELD", "loc" : [ -118.983851, 35.327484 ], "pop" : 50585, "state" : "CA" } +{ "_id" : "93308", "city" : "BAKERSFIELD", "loc" : [ -119.043319, 35.424395 ], "pop" : 39454, "state" : "CA" } +{ "_id" : "93309", "city" : "BAKERSFIELD", "loc" : [ -119.062713, 35.33839 ], "pop" : 58179, "state" : "CA" } +{ "_id" : "93311", "city" : "BAKERSFIELD", "loc" : [ -119.105647, 35.303891 ], "pop" : 10321, "state" : "CA" } +{ "_id" : "93312", "city" : "GREENACRES", "loc" : [ -119.15014, 35.382082 ], "pop" : 15935, "state" : "CA" } +{ "_id" : "93313", "city" : "BAKERSFIELD", "loc" : [ -119.050936, 35.297391 ], "pop" : 11417, "state" : "CA" } +{ "_id" : "93401", "city" : "SAN LUIS OBISPO", "loc" : [ -120.650933, 35.263453 ], "pop" : 24638, "state" : "CA" } +{ "_id" : "93402", "city" : "LOS OSOS", "loc" : [ -120.833261, 35.317203 ], "pop" : 14648, "state" : "CA" } +{ "_id" : "93405", "city" : "SAN LUIS OBISPO", "loc" : [ -120.681724, 35.290058 ], "pop" : 31976, "state" : "CA" } +{ "_id" : "93420", "city" : "HALCYON", "loc" : [ -120.57289, 35.11449 ], "pop" : 21992, "state" : "CA" } +{ "_id" : "93422", "city" : "ATASCADERO", "loc" : [ -120.663838, 35.475439 ], "pop" : 27720, "state" : "CA" } +{ "_id" : "93426", "city" : "BRADLEY", "loc" : [ -120.972793, 35.809255 ], "pop" : 862, "state" : "CA" } +{ "_id" : "93427", "city" : "BUELLTON", "loc" : [ -120.192233, 34.62093 ], "pop" : 3883, "state" : "CA" } +{ "_id" : "93428", "city" : "CAMBRIA", "loc" : [ -121.084029, 35.556568 ], "pop" : 5635, "state" : "CA" } +{ "_id" : "93430", "city" : "CAYUCOS", "loc" : [ -120.890791, 35.444606 ], "pop" : 3384, "state" : "CA" } +{ "_id" : "93431", "city" : "CHOLAME", "loc" : [ -120.194827, 35.543847 ], "pop" : 206, "state" : "CA" } +{ "_id" : "93432", "city" : "CRESTON", "loc" : [ -120.554238, 35.491543 ], "pop" : 726, "state" : "CA" } +{ "_id" : "93433", "city" : "GROVER BEACH", "loc" : [ -120.617348, 35.120969 ], "pop" : 11790, "state" : "CA" } +{ "_id" : "93434", "city" : "GUADALUPE", "loc" : [ -120.570329, 34.959989 ], "pop" : 6064, "state" : "CA" } +{ "_id" : "93436", "city" : "LOMPOC", "loc" : [ -120.450605, 34.658349 ], "pop" : 49960, "state" : "CA" } +{ "_id" : "93437", "city" : "LOMPOC", "loc" : [ -120.517096, 34.753215 ], "pop" : 9846, "state" : "CA" } +{ "_id" : "93442", "city" : "MORRO BAY", "loc" : [ -120.844745, 35.37953 ], "pop" : 10475, "state" : "CA" } +{ "_id" : "93444", "city" : "NIPOMO", "loc" : [ -120.489413, 35.029806 ], "pop" : 11070, "state" : "CA" } +{ "_id" : "93445", "city" : "OCEANO", "loc" : [ -120.608044, 35.10187 ], "pop" : 6249, "state" : "CA" } +{ "_id" : "93446", "city" : "ADELAIDE", "loc" : [ -120.670676, 35.635248 ], "pop" : 29255, "state" : "CA" } +{ "_id" : "93449", "city" : "SHELL BEACH", "loc" : [ -120.651788, 35.149212 ], "pop" : 7474, "state" : "CA" } +{ "_id" : "93450", "city" : "SAN ARDO", "loc" : [ -120.861191, 35.985685 ], "pop" : 1684, "state" : "CA" } +{ "_id" : "93451", "city" : "PARKFIELD", "loc" : [ -120.696532, 35.753209 ], "pop" : 1218, "state" : "CA" } +{ "_id" : "93452", "city" : "SAN SIMEON", "loc" : [ -121.144033, 35.666815 ], "pop" : 500, "state" : "CA" } +{ "_id" : "93453", "city" : "CALIFORNIA VALLE", "loc" : [ -120.3202, 35.341254 ], "pop" : 1237, "state" : "CA" } +{ "_id" : "93454", "city" : "SANTA MARIA", "loc" : [ -120.43245, 34.954538 ], "pop" : 60187, "state" : "CA" } +{ "_id" : "93455", "city" : "ORCUTT", "loc" : [ -120.429128, 34.879786 ], "pop" : 32891, "state" : "CA" } +{ "_id" : "93460", "city" : "SANTA YNEZ", "loc" : [ -120.071332, 34.623966 ], "pop" : 5659, "state" : "CA" } +{ "_id" : "93461", "city" : "SHANDON", "loc" : [ -120.372047, 35.651273 ], "pop" : 908, "state" : "CA" } +{ "_id" : "93463", "city" : "BALLARD", "loc" : [ -120.129286, 34.609931 ], "pop" : 8327, "state" : "CA" } +{ "_id" : "93465", "city" : "TEMPLETON", "loc" : [ -120.710737, 35.555082 ], "pop" : 5795, "state" : "CA" } +{ "_id" : "93501", "city" : "MOJAVE", "loc" : [ -118.173475, 35.047767 ], "pop" : 4774, "state" : "CA" } +{ "_id" : "93505", "city" : "CALIFORNIA CITY", "loc" : [ -117.965142, 35.127783 ], "pop" : 6086, "state" : "CA" } +{ "_id" : "93510", "city" : "ACTON", "loc" : [ -118.195929, 34.483541 ], "pop" : 6139, "state" : "CA" } +{ "_id" : "93512", "city" : "BENTON", "loc" : [ -118.498526, 37.798099 ], "pop" : 241, "state" : "CA" } +{ "_id" : "93513", "city" : "BIG PINE", "loc" : [ -118.291597, 37.167857 ], "pop" : 1642, "state" : "CA" } +{ "_id" : "93514", "city" : "TOMS PLACE", "loc" : [ -118.44156, 37.386301 ], "pop" : 14072, "state" : "CA" } +{ "_id" : "93516", "city" : "BORON", "loc" : [ -117.662921, 35.003748 ], "pop" : 2904, "state" : "CA" } +{ "_id" : "93517", "city" : "BRIDGEPORT", "loc" : [ -119.208025, 38.256601 ], "pop" : 697, "state" : "CA" } +{ "_id" : "93518", "city" : "HAVILAH", "loc" : [ -118.410264, 35.356798 ], "pop" : 899, "state" : "CA" } +{ "_id" : "93519", "city" : "CANTIL", "loc" : [ -117.993868, 35.282558 ], "pop" : 222, "state" : "CA" } +{ "_id" : "93523", "city" : "NORTH EDWARDS", "loc" : [ -117.915384, 34.930507 ], "pop" : 8996, "state" : "CA" } +{ "_id" : "93526", "city" : "INDEPENDENCE", "loc" : [ -118.204808, 36.839578 ], "pop" : 889, "state" : "CA" } +{ "_id" : "93527", "city" : "PEARSONVILLE", "loc" : [ -117.834844, 35.674498 ], "pop" : 2633, "state" : "CA" } +{ "_id" : "93528", "city" : "JOHANNESBURG", "loc" : [ -117.637325, 35.370655 ], "pop" : 306, "state" : "CA" } +{ "_id" : "93529", "city" : "JUNE LAKE", "loc" : [ -119.082492, 37.777324 ], "pop" : 609, "state" : "CA" } +{ "_id" : "93531", "city" : "KEENE", "loc" : [ -118.607563, 35.237502 ], "pop" : 455, "state" : "CA" } +{ "_id" : "93532", "city" : "ELIZABETH LAKE", "loc" : [ -118.444719, 34.668297 ], "pop" : 2337, "state" : "CA" } +{ "_id" : "93534", "city" : "LANCASTER", "loc" : [ -118.149129, 34.690888 ], "pop" : 32929, "state" : "CA" } +{ "_id" : "93535", "city" : "HI VISTA", "loc" : [ -118.063245, 34.684751 ], "pop" : 49751, "state" : "CA" } +{ "_id" : "93536", "city" : "QUARTZ HILL", "loc" : [ -118.213336, 34.673619 ], "pop" : 39987, "state" : "CA" } +{ "_id" : "93541", "city" : "LEE VINING", "loc" : [ -119.123413, 37.988988 ], "pop" : 415, "state" : "CA" } +{ "_id" : "93543", "city" : "JUNIPER HILLS", "loc" : [ -117.957405, 34.547372 ], "pop" : 10046, "state" : "CA" } +{ "_id" : "93544", "city" : "CRYSTALAIRE", "loc" : [ -117.798841, 34.495914 ], "pop" : 1204, "state" : "CA" } +{ "_id" : "93545", "city" : "LONE PINE", "loc" : [ -118.057824, 36.579781 ], "pop" : 2257, "state" : "CA" } +{ "_id" : "93546", "city" : "CROWLEY LAKE", "loc" : [ -118.976383, 37.642361 ], "pop" : 4832, "state" : "CA" } +{ "_id" : "93550", "city" : "LAKE LOS ANGELES", "loc" : [ -118.061306, 34.571483 ], "pop" : 71024, "state" : "CA" } +{ "_id" : "93551", "city" : "LEONA VALLEY", "loc" : [ -118.181207, 34.601404 ], "pop" : 20768, "state" : "CA" } +{ "_id" : "93553", "city" : "JUNIPER HILLS", "loc" : [ -117.902893, 34.491124 ], "pop" : 1106, "state" : "CA" } +{ "_id" : "93554", "city" : "RANDSBURG", "loc" : [ -117.726396, 35.352176 ], "pop" : 190, "state" : "CA" } +{ "_id" : "93555", "city" : "CHINA LAKE NWC", "loc" : [ -117.679733, 35.631376 ], "pop" : 34246, "state" : "CA" } +{ "_id" : "93560", "city" : "WILLOW SPRINGS", "loc" : [ -118.19636, 34.863117 ], "pop" : 9898, "state" : "CA" } +{ "_id" : "93561", "city" : "BEAR VALLEY SPRI", "loc" : [ -118.522227, 35.129776 ], "pop" : 24466, "state" : "CA" } +{ "_id" : "93562", "city" : "ARGUS", "loc" : [ -117.382992, 35.760817 ], "pop" : 3189, "state" : "CA" } +{ "_id" : "93563", "city" : "VALYERMO", "loc" : [ -117.8271, 34.339014 ], "pop" : 1456, "state" : "CA" } +{ "_id" : "93601", "city" : "AHWAHNEE", "loc" : [ -119.723251, 37.407631 ], "pop" : 327, "state" : "CA" } +{ "_id" : "93602", "city" : "AUBERRY", "loc" : [ -119.457202, 37.072635 ], "pop" : 3179, "state" : "CA" } +{ "_id" : "93604", "city" : "BASS LAKE", "loc" : [ -119.556839, 37.324359 ], "pop" : 628, "state" : "CA" } +{ "_id" : "93608", "city" : "CANTUA CREEK", "loc" : [ -120.335252, 36.492123 ], "pop" : 1622, "state" : "CA" } +{ "_id" : "93609", "city" : "CARUTHERS", "loc" : [ -119.844581, 36.535847 ], "pop" : 4558, "state" : "CA" } +{ "_id" : "93610", "city" : "CHOWCHILLA", "loc" : [ -120.269077, 37.101371 ], "pop" : 10745, "state" : "CA" } +{ "_id" : "93612", "city" : "CLOVIS", "loc" : [ -119.689757, 36.823146 ], "pop" : 59963, "state" : "CA" } +{ "_id" : "93614", "city" : "COARSEGOLD", "loc" : [ -119.745545, 37.221378 ], "pop" : 6950, "state" : "CA" } +{ "_id" : "93615", "city" : "CUTLER", "loc" : [ -119.287023, 36.524266 ], "pop" : 4901, "state" : "CA" } +{ "_id" : "93616", "city" : "DEL REY", "loc" : [ -119.59291, 36.654306 ], "pop" : 1923, "state" : "CA" } +{ "_id" : "93618", "city" : "DINUBA", "loc" : [ -119.39087, 36.534931 ], "pop" : 20012, "state" : "CA" } +{ "_id" : "93620", "city" : "DOS PALOS", "loc" : [ -120.633348, 37.00253 ], "pop" : 9311, "state" : "CA" } +{ "_id" : "93621", "city" : "DUNLAP", "loc" : [ -119.089931, 36.744635 ], "pop" : 94, "state" : "CA" } +{ "_id" : "93622", "city" : "FIREBAUGH", "loc" : [ -120.470048, 36.8651 ], "pop" : 7435, "state" : "CA" } +{ "_id" : "93623", "city" : "FISH CAMP", "loc" : [ -119.642005, 37.51692 ], "pop" : 132, "state" : "CA" } +{ "_id" : "93625", "city" : "FOWLER", "loc" : [ -119.671025, 36.628153 ], "pop" : 5290, "state" : "CA" } +{ "_id" : "93626", "city" : "FRIANT", "loc" : [ -119.696501, 37.002416 ], "pop" : 871, "state" : "CA" } +{ "_id" : "93627", "city" : "HELM", "loc" : [ -120.093598, 36.499231 ], "pop" : 832, "state" : "CA" } +{ "_id" : "93630", "city" : "KERMAN", "loc" : [ -120.072444, 36.730576 ], "pop" : 11224, "state" : "CA" } +{ "_id" : "93631", "city" : "KINGSBURG", "loc" : [ -119.543298, 36.508047 ], "pop" : 12263, "state" : "CA" } +{ "_id" : "93633", "city" : "KINGS CANYON NAT", "loc" : [ -119.068201, 36.780601 ], "pop" : 472, "state" : "CA" } +{ "_id" : "93635", "city" : "LOS BANOS", "loc" : [ -120.854387, 37.06266 ], "pop" : 18199, "state" : "CA" } +{ "_id" : "93637", "city" : "MADERA", "loc" : [ -120.081966, 36.94026 ], "pop" : 20440, "state" : "CA" } +{ "_id" : "93638", "city" : "MADERA", "loc" : [ -120.012778, 36.968726 ], "pop" : 36525, "state" : "CA" } +{ "_id" : "93640", "city" : "MENDOTA", "loc" : [ -120.409287, 36.742365 ], "pop" : 8839, "state" : "CA" } +{ "_id" : "93641", "city" : "MIRAMONTE", "loc" : [ -119.047718, 36.68938 ], "pop" : 607, "state" : "CA" } +{ "_id" : "93643", "city" : "NORTH FORK", "loc" : [ -119.514324, 37.212531 ], "pop" : 2541, "state" : "CA" } +{ "_id" : "93644", "city" : "OAKHURST", "loc" : [ -119.644854, 37.347561 ], "pop" : 8190, "state" : "CA" } +{ "_id" : "93645", "city" : "O NEALS", "loc" : [ -119.745369, 37.086874 ], "pop" : 24, "state" : "CA" } +{ "_id" : "93646", "city" : "ORANGE COVE", "loc" : [ -119.313502, 36.624283 ], "pop" : 6374, "state" : "CA" } +{ "_id" : "93647", "city" : "OROSI", "loc" : [ -119.281522, 36.546368 ], "pop" : 7545, "state" : "CA" } +{ "_id" : "93648", "city" : "PARLIER", "loc" : [ -119.537482, 36.610265 ], "pop" : 9076, "state" : "CA" } +{ "_id" : "93650", "city" : "PINEDALE", "loc" : [ -119.800359, 36.841107 ], "pop" : 4164, "state" : "CA" } +{ "_id" : "93651", "city" : "PRATHER", "loc" : [ -119.526771, 36.993799 ], "pop" : 1446, "state" : "CA" } +{ "_id" : "93652", "city" : "RAISIN", "loc" : [ -119.903158, 36.598928 ], "pop" : 381, "state" : "CA" } +{ "_id" : "93653", "city" : "RAYMOND", "loc" : [ -119.876567, 37.27898 ], "pop" : 491, "state" : "CA" } +{ "_id" : "93654", "city" : "REEDLEY", "loc" : [ -119.437785, 36.604406 ], "pop" : 22370, "state" : "CA" } +{ "_id" : "93656", "city" : "RIVERDALE", "loc" : [ -119.871953, 36.429525 ], "pop" : 4386, "state" : "CA" } +{ "_id" : "93657", "city" : "SANGER", "loc" : [ -119.547796, 36.7243 ], "pop" : 27201, "state" : "CA" } +{ "_id" : "93660", "city" : "SAN JOAQUIN", "loc" : [ -120.188934, 36.605869 ], "pop" : 2727, "state" : "CA" } +{ "_id" : "93662", "city" : "SELMA", "loc" : [ -119.617026, 36.569524 ], "pop" : 21798, "state" : "CA" } +{ "_id" : "93664", "city" : "SHAVER LAKE", "loc" : [ -119.273031, 37.139695 ], "pop" : 925, "state" : "CA" } +{ "_id" : "93667", "city" : "TOLLHOUSE", "loc" : [ -119.391415, 36.99434 ], "pop" : 1820, "state" : "CA" } +{ "_id" : "93668", "city" : "TRANQUILLITY", "loc" : [ -120.261655, 36.658376 ], "pop" : 1297, "state" : "CA" } +{ "_id" : "93669", "city" : "WISHON", "loc" : [ -119.557014, 37.281028 ], "pop" : 474, "state" : "CA" } +{ "_id" : "93675", "city" : "SQUAW VALLEY", "loc" : [ -119.181449, 36.707146 ], "pop" : 2731, "state" : "CA" } +{ "_id" : "93701", "city" : "FRESNO", "loc" : [ -119.786705, 36.748727 ], "pop" : 15024, "state" : "CA" } +{ "_id" : "93702", "city" : "FRESNO", "loc" : [ -119.753215, 36.739954 ], "pop" : 44477, "state" : "CA" } +{ "_id" : "93703", "city" : "FRESNO", "loc" : [ -119.759401, 36.768445 ], "pop" : 30457, "state" : "CA" } +{ "_id" : "93704", "city" : "FIG GARDEN VILLA", "loc" : [ -119.799745, 36.798781 ], "pop" : 26496, "state" : "CA" } +{ "_id" : "93705", "city" : "FRESNO", "loc" : [ -119.828617, 36.786285 ], "pop" : 34114, "state" : "CA" } +{ "_id" : "93706", "city" : "EASTON", "loc" : [ -119.820408, 36.700589 ], "pop" : 33682, "state" : "CA" } +{ "_id" : "93710", "city" : "FRESNO", "loc" : [ -119.76205, 36.823643 ], "pop" : 29719, "state" : "CA" } +{ "_id" : "93711", "city" : "FRESNO", "loc" : [ -119.831896, 36.830297 ], "pop" : 29809, "state" : "CA" } +{ "_id" : "93720", "city" : "FRESNO", "loc" : [ -119.765522, 36.857944 ], "pop" : 21498, "state" : "CA" } +{ "_id" : "93721", "city" : "FRESNO", "loc" : [ -119.784273, 36.737714 ], "pop" : 6156, "state" : "CA" } +{ "_id" : "93722", "city" : "FRESNO", "loc" : [ -119.880119, 36.791779 ], "pop" : 33523, "state" : "CA" } +{ "_id" : "93725", "city" : "CALWA", "loc" : [ -119.742477, 36.675312 ], "pop" : 19698, "state" : "CA" } +{ "_id" : "93726", "city" : "FRESNO", "loc" : [ -119.760445, 36.794943 ], "pop" : 36325, "state" : "CA" } +{ "_id" : "93727", "city" : "FRESNO", "loc" : [ -119.706055, 36.752796 ], "pop" : 51417, "state" : "CA" } +{ "_id" : "93728", "city" : "FRESNO", "loc" : [ -119.811314, 36.758095 ], "pop" : 15386, "state" : "CA" } +{ "_id" : "93901", "city" : "SALINAS", "loc" : [ -121.659589, 36.667693 ], "pop" : 25605, "state" : "CA" } +{ "_id" : "93905", "city" : "SALINAS", "loc" : [ -121.617606, 36.681143 ], "pop" : 41956, "state" : "CA" } +{ "_id" : "93906", "city" : "SALINAS", "loc" : [ -121.643805, 36.710339 ], "pop" : 39534, "state" : "CA" } +{ "_id" : "93907", "city" : "PRUNEDALE", "loc" : [ -121.665588, 36.765385 ], "pop" : 21061, "state" : "CA" } +{ "_id" : "93908", "city" : "SALINAS", "loc" : [ -121.672861, 36.601122 ], "pop" : 15610, "state" : "CA" } +{ "_id" : "93920", "city" : "BIG SUR", "loc" : [ -121.700897, 36.245798 ], "pop" : 1669, "state" : "CA" } +{ "_id" : "93923", "city" : "CARMEL", "loc" : [ -121.894875, 36.545693 ], "pop" : 15293, "state" : "CA" } +{ "_id" : "93924", "city" : "CARMEL VALLEY", "loc" : [ -121.724356, 36.478709 ], "pop" : 6066, "state" : "CA" } +{ "_id" : "93925", "city" : "CHUALAR", "loc" : [ -121.431964, 36.595042 ], "pop" : 12, "state" : "CA" } +{ "_id" : "93926", "city" : "GONZALES", "loc" : [ -121.410347, 36.490038 ], "pop" : 12842, "state" : "CA" } +{ "_id" : "93927", "city" : "GREENFIELD", "loc" : [ -121.24507, 36.320178 ], "pop" : 8728, "state" : "CA" } +{ "_id" : "93930", "city" : "KING CITY", "loc" : [ -121.127329, 36.202776 ], "pop" : 11299, "state" : "CA" } +{ "_id" : "93932", "city" : "LOCKWOOD", "loc" : [ -121.205946, 35.989287 ], "pop" : 939, "state" : "CA" } +{ "_id" : "93933", "city" : "MARINA", "loc" : [ -121.793383, 36.684922 ], "pop" : 16973, "state" : "CA" } +{ "_id" : "93940", "city" : "DEL REY OAKS", "loc" : [ -121.8848, 36.595642 ], "pop" : 35326, "state" : "CA" } +{ "_id" : "93941", "city" : "FORT ORD", "loc" : [ -121.804999, 36.644627 ], "pop" : 25009, "state" : "CA" } +{ "_id" : "93950", "city" : "PACIFIC GROVE", "loc" : [ -121.921957, 36.616737 ], "pop" : 16040, "state" : "CA" } +{ "_id" : "93953", "city" : "PEBBLE BEACH", "loc" : [ -121.942044, 36.590735 ], "pop" : 5061, "state" : "CA" } +{ "_id" : "93955", "city" : "SAND CITY", "loc" : [ -121.835724, 36.609208 ], "pop" : 23514, "state" : "CA" } +{ "_id" : "93960", "city" : "SOLEDAD", "loc" : [ -121.324286, 36.41964 ], "pop" : 9046, "state" : "CA" } +{ "_id" : "94002", "city" : "BELMONT", "loc" : [ -122.292671, 37.517433 ], "pop" : 24960, "state" : "CA" } +{ "_id" : "94005", "city" : "BRISBANE", "loc" : [ -122.400118, 37.681104 ], "pop" : 2952, "state" : "CA" } +{ "_id" : "94010", "city" : "HILLSBOROUGH", "loc" : [ -122.362952, 37.575884 ], "pop" : 38444, "state" : "CA" } +{ "_id" : "94014", "city" : "COLMA", "loc" : [ -122.452679, 37.698187 ], "pop" : 40406, "state" : "CA" } +{ "_id" : "94015", "city" : "DALY CITY", "loc" : [ -122.478015, 37.678696 ], "pop" : 57354, "state" : "CA" } +{ "_id" : "94019", "city" : "HALF MOON BAY", "loc" : [ -122.445929, 37.479057 ], "pop" : 14073, "state" : "CA" } +{ "_id" : "94020", "city" : "LA HONDA", "loc" : [ -122.293889, 37.272285 ], "pop" : 1557, "state" : "CA" } +{ "_id" : "94021", "city" : "LOMA MAR", "loc" : [ -122.281996, 37.254437 ], "pop" : 237, "state" : "CA" } +{ "_id" : "94022", "city" : "LOS ALTOS", "loc" : [ -122.125754, 37.381432 ], "pop" : 17366, "state" : "CA" } +{ "_id" : "94024", "city" : "LOS ALTOS", "loc" : [ -122.086205, 37.354745 ], "pop" : 20795, "state" : "CA" } +{ "_id" : "94025", "city" : "WEST MENLO PARK", "loc" : [ -122.179136, 37.453401 ], "pop" : 38383, "state" : "CA" } +{ "_id" : "94027", "city" : "ATHERTON", "loc" : [ -122.200198, 37.456255 ], "pop" : 7312, "state" : "CA" } +{ "_id" : "94028", "city" : "LADERA", "loc" : [ -122.208131, 37.378859 ], "pop" : 6379, "state" : "CA" } +{ "_id" : "94030", "city" : "MILLBRAE", "loc" : [ -122.401985, 37.600382 ], "pop" : 20508, "state" : "CA" } +{ "_id" : "94035", "city" : "MOFFETT FIELD", "loc" : [ -122.051944, 37.41001 ], "pop" : 790, "state" : "CA" } +{ "_id" : "94038", "city" : "MOSS BEACH", "loc" : [ -122.50683, 37.531039 ], "pop" : 5415, "state" : "CA" } +{ "_id" : "94040", "city" : "MOUNTAIN VIEW", "loc" : [ -122.087983, 37.385532 ], "pop" : 26969, "state" : "CA" } +{ "_id" : "94041", "city" : "MOUNTAIN VIEW", "loc" : [ -122.078341, 37.389347 ], "pop" : 13438, "state" : "CA" } +{ "_id" : "94043", "city" : "MOUNTAIN VIEW", "loc" : [ -122.077468, 37.405567 ], "pop" : 28592, "state" : "CA" } +{ "_id" : "94044", "city" : "PACIFICA", "loc" : [ -122.481607, 37.619559 ], "pop" : 37596, "state" : "CA" } +{ "_id" : "94060", "city" : "PESCADERO", "loc" : [ -122.364876, 37.206518 ], "pop" : 670, "state" : "CA" } +{ "_id" : "94061", "city" : "REDWOOD CITY", "loc" : [ -122.230406, 37.464661 ], "pop" : 33316, "state" : "CA" } +{ "_id" : "94062", "city" : "WOODSIDE", "loc" : [ -122.255879, 37.452119 ], "pop" : 24947, "state" : "CA" } +{ "_id" : "94063", "city" : "REDWOOD CITY", "loc" : [ -122.209134, 37.481544 ], "pop" : 28251, "state" : "CA" } +{ "_id" : "94065", "city" : "REDWOOD CITY", "loc" : [ -122.248564, 37.533128 ], "pop" : 2285, "state" : "CA" } +{ "_id" : "94066", "city" : "SAN BRUNO", "loc" : [ -122.429021, 37.624742 ], "pop" : 38678, "state" : "CA" } +{ "_id" : "94070", "city" : "SAN CARLOS", "loc" : [ -122.267356, 37.496859 ], "pop" : 27599, "state" : "CA" } +{ "_id" : "94074", "city" : "SAN GREGORIO", "loc" : [ -122.355552, 37.325513 ], "pop" : 312, "state" : "CA" } +{ "_id" : "94080", "city" : "SOUTH SAN FRANCI", "loc" : [ -122.4347, 37.65382 ], "pop" : 54610, "state" : "CA" } +{ "_id" : "94086", "city" : "SUNNYVALE", "loc" : [ -122.023771, 37.376407 ], "pop" : 56215, "state" : "CA" } +{ "_id" : "94087", "city" : "SUNNYVALE", "loc" : [ -122.034859, 37.350214 ], "pop" : 47813, "state" : "CA" } +{ "_id" : "94089", "city" : "SUNNYVALE", "loc" : [ -122.000637, 37.398255 ], "pop" : 13522, "state" : "CA" } +{ "_id" : "94102", "city" : "SAN FRANCISCO", "loc" : [ -122.416728, 37.781334 ], "pop" : 26908, "state" : "CA" } +{ "_id" : "94103", "city" : "SAN FRANCISCO", "loc" : [ -122.414664, 37.77254 ], "pop" : 17867, "state" : "CA" } +{ "_id" : "94104", "city" : "SAN FRANCISCO", "loc" : [ -122.401826, 37.791487 ], "pop" : 760, "state" : "CA" } +{ "_id" : "94105", "city" : "SAN FRANCISCO", "loc" : [ -122.389229, 37.786427 ], "pop" : 2054, "state" : "CA" } +{ "_id" : "94107", "city" : "SAN FRANCISCO", "loc" : [ -122.397099, 37.762147 ], "pop" : 12143, "state" : "CA" } +{ "_id" : "94108", "city" : "SAN FRANCISCO", "loc" : [ -122.40791, 37.792931 ], "pop" : 14143, "state" : "CA" } +{ "_id" : "94109", "city" : "SAN FRANCISCO", "loc" : [ -122.418579, 37.791687 ], "pop" : 49396, "state" : "CA" } +{ "_id" : "94110", "city" : "SAN FRANCISCO", "loc" : [ -122.415344, 37.750858 ], "pop" : 70770, "state" : "CA" } +{ "_id" : "94111", "city" : "SAN FRANCISCO", "loc" : [ -122.400147, 37.797376 ], "pop" : 3122, "state" : "CA" } +{ "_id" : "94112", "city" : "SAN FRANCISCO", "loc" : [ -122.441081, 37.71954 ], "pop" : 64320, "state" : "CA" } +{ "_id" : "94114", "city" : "SAN FRANCISCO", "loc" : [ -122.432977, 37.758716 ], "pop" : 30698, "state" : "CA" } +{ "_id" : "94115", "city" : "SAN FRANCISCO", "loc" : [ -122.435835, 37.785607 ], "pop" : 28859, "state" : "CA" } +{ "_id" : "94116", "city" : "SAN FRANCISCO", "loc" : [ -122.486296, 37.744144 ], "pop" : 39970, "state" : "CA" } +{ "_id" : "94117", "city" : "SAN FRANCISCO", "loc" : [ -122.441272, 37.771234 ], "pop" : 38127, "state" : "CA" } +{ "_id" : "94118", "city" : "SAN FRANCISCO", "loc" : [ -122.461414, 37.781174 ], "pop" : 38499, "state" : "CA" } +{ "_id" : "94121", "city" : "SAN FRANCISCO", "loc" : [ -122.489178, 37.778616 ], "pop" : 40430, "state" : "CA" } +{ "_id" : "94122", "city" : "SAN FRANCISCO", "loc" : [ -122.483647, 37.759326 ], "pop" : 52318, "state" : "CA" } +{ "_id" : "94123", "city" : "SAN FRANCISCO", "loc" : [ -122.434163, 37.799865 ], "pop" : 23280, "state" : "CA" } +{ "_id" : "94124", "city" : "SAN FRANCISCO", "loc" : [ -122.388649, 37.730888 ], "pop" : 27239, "state" : "CA" } +{ "_id" : "94127", "city" : "SAN FRANCISCO", "loc" : [ -122.457116, 37.735385 ], "pop" : 17906, "state" : "CA" } +{ "_id" : "94129", "city" : "SAN FRANCISCO", "loc" : [ -122.464958, 37.800507 ], "pop" : 4715, "state" : "CA" } +{ "_id" : "94130", "city" : "SAN FRANCISCO", "loc" : [ -122.369319, 37.823128 ], "pop" : 4533, "state" : "CA" } +{ "_id" : "94131", "city" : "SAN FRANCISCO", "loc" : [ -122.438335, 37.745032 ], "pop" : 30521, "state" : "CA" } +{ "_id" : "94132", "city" : "SAN FRANCISCO", "loc" : [ -122.47545, 37.721118 ], "pop" : 23632, "state" : "CA" } +{ "_id" : "94133", "city" : "SAN FRANCISCO", "loc" : [ -122.409081, 37.800175 ], "pop" : 27148, "state" : "CA" } +{ "_id" : "94134", "city" : "SAN FRANCISCO", "loc" : [ -122.409577, 37.718968 ], "pop" : 34635, "state" : "CA" } +{ "_id" : "94301", "city" : "PALO ALTO", "loc" : [ -122.149685, 37.444324 ], "pop" : 15965, "state" : "CA" } +{ "_id" : "94303", "city" : "EAST PALO ALTO", "loc" : [ -122.131902, 37.455641 ], "pop" : 35680, "state" : "CA" } +{ "_id" : "94304", "city" : "PALO ALTO", "loc" : [ -122.184234, 37.433424 ], "pop" : 1835, "state" : "CA" } +{ "_id" : "94305", "city" : "STANFORD", "loc" : [ -122.161867, 37.423573 ], "pop" : 18097, "state" : "CA" } +{ "_id" : "94306", "city" : "PALO ALTO", "loc" : [ -122.127375, 37.418009 ], "pop" : 24309, "state" : "CA" } +{ "_id" : "94401", "city" : "RUSSIAN RIVER", "loc" : [ -122.320262, 37.572271 ], "pop" : 28190, "state" : "CA" } +{ "_id" : "94402", "city" : "SAN MATEO", "loc" : [ -122.32762, 37.550685 ], "pop" : 23838, "state" : "CA" } +{ "_id" : "94403", "city" : "SAN MATEO", "loc" : [ -122.299796, 37.539495 ], "pop" : 35630, "state" : "CA" } +{ "_id" : "94404", "city" : "FOSTER CITY", "loc" : [ -122.263577, 37.551614 ], "pop" : 33745, "state" : "CA" } +{ "_id" : "94501", "city" : "COAST GUARD ISLA", "loc" : [ -122.260516, 37.764783 ], "pop" : 76110, "state" : "CA" } +{ "_id" : "94507", "city" : "ALAMO", "loc" : [ -122.022868, 37.853695 ], "pop" : 8569, "state" : "CA" } +{ "_id" : "94508", "city" : "ANGWIN", "loc" : [ -122.447732, 38.576906 ], "pop" : 4067, "state" : "CA" } +{ "_id" : "94509", "city" : "ANTIOCH", "loc" : [ -121.808906, 37.993917 ], "pop" : 62830, "state" : "CA" } +{ "_id" : "94510", "city" : "BENICIA", "loc" : [ -122.161392, 38.068459 ], "pop" : 24545, "state" : "CA" } +{ "_id" : "94512", "city" : "BIRDS LANDING", "loc" : [ -121.844318, 38.150402 ], "pop" : 32, "state" : "CA" } +{ "_id" : "94513", "city" : "BRENTWOOD", "loc" : [ -121.689427, 37.932415 ], "pop" : 12372, "state" : "CA" } +{ "_id" : "94514", "city" : "BYRON", "loc" : [ -121.602211, 37.902616 ], "pop" : 5745, "state" : "CA" } +{ "_id" : "94515", "city" : "CALISTOGA", "loc" : [ -122.581384, 38.582305 ], "pop" : 5758, "state" : "CA" } +{ "_id" : "94517", "city" : "CLAYTON", "loc" : [ -121.909967, 37.915442 ], "pop" : 10353, "state" : "CA" } +{ "_id" : "94518", "city" : "CONCORD", "loc" : [ -122.026296, 37.950434 ], "pop" : 25516, "state" : "CA" } +{ "_id" : "94519", "city" : "CONCORD", "loc" : [ -122.011948, 37.984082 ], "pop" : 19032, "state" : "CA" } +{ "_id" : "94520", "city" : "CONCORD", "loc" : [ -122.036178, 37.982259 ], "pop" : 31474, "state" : "CA" } +{ "_id" : "94521", "city" : "CONCORD", "loc" : [ -121.974955, 37.957503 ], "pop" : 39005, "state" : "CA" } +{ "_id" : "94523", "city" : "PLEASANT HILL", "loc" : [ -122.07371, 37.954002 ], "pop" : 31046, "state" : "CA" } +{ "_id" : "94525", "city" : "CROCKETT", "loc" : [ -122.217659, 38.051865 ], "pop" : 3228, "state" : "CA" } +{ "_id" : "94526", "city" : "DANVILLE", "loc" : [ -121.96598, 37.813985 ], "pop" : 40613, "state" : "CA" } +{ "_id" : "94528", "city" : "DIABLO", "loc" : [ -121.960951, 37.83883 ], "pop" : 791, "state" : "CA" } +{ "_id" : "94530", "city" : "EL CERRITO", "loc" : [ -122.298521, 37.915633 ], "pop" : 28146, "state" : "CA" } +{ "_id" : "94533", "city" : "FAIRFIELD", "loc" : [ -122.03565, 38.267084 ], "pop" : 65455, "state" : "CA" } +{ "_id" : "94535", "city" : "TRAVIS AFB", "loc" : [ -121.946317, 38.274313 ], "pop" : 9874, "state" : "CA" } +{ "_id" : "94536", "city" : "FREMONT", "loc" : [ -121.999935, 37.560493 ], "pop" : 58580, "state" : "CA" } +{ "_id" : "94538", "city" : "FREMONT", "loc" : [ -121.971215, 37.530815 ], "pop" : 45430, "state" : "CA" } +{ "_id" : "94539", "city" : "FREMONT", "loc" : [ -121.928733, 37.517579 ], "pop" : 39927, "state" : "CA" } +{ "_id" : "94541", "city" : "HAYWARD", "loc" : [ -122.089418, 37.674048 ], "pop" : 48964, "state" : "CA" } +{ "_id" : "94542", "city" : "HAYWARD", "loc" : [ -122.047236, 37.658566 ], "pop" : 11165, "state" : "CA" } +{ "_id" : "94544", "city" : "HAYWARD", "loc" : [ -122.067029, 37.637443 ], "pop" : 58348, "state" : "CA" } +{ "_id" : "94545", "city" : "HAYWARD", "loc" : [ -122.0971, 37.633245 ], "pop" : 23760, "state" : "CA" } +{ "_id" : "94546", "city" : "CASTRO VALLEY", "loc" : [ -122.078183, 37.701527 ], "pop" : 37808, "state" : "CA" } +{ "_id" : "94547", "city" : "HERCULES", "loc" : [ -122.263702, 38.006649 ], "pop" : 16376, "state" : "CA" } +{ "_id" : "94548", "city" : "KNIGHTSEN", "loc" : [ -121.672149, 37.9818 ], "pop" : 118, "state" : "CA" } +{ "_id" : "94549", "city" : "LAFAYETTE", "loc" : [ -122.11194, 37.896105 ], "pop" : 25979, "state" : "CA" } +{ "_id" : "94550", "city" : "LIVERMORE", "loc" : [ -121.762983, 37.68299 ], "pop" : 59709, "state" : "CA" } +{ "_id" : "94552", "city" : "CASTRO VALLEY", "loc" : [ -122.038113, 37.713107 ], "pop" : 7936, "state" : "CA" } +{ "_id" : "94553", "city" : "PACHECO", "loc" : [ -122.111693, 37.993246 ], "pop" : 45532, "state" : "CA" } +{ "_id" : "94555", "city" : "FREMONT", "loc" : [ -122.046925, 37.573458 ], "pop" : 29437, "state" : "CA" } +{ "_id" : "94556", "city" : "MORAGA", "loc" : [ -122.124185, 37.843653 ], "pop" : 15988, "state" : "CA" } +{ "_id" : "94558", "city" : "SPANISH FLAT", "loc" : [ -122.305518, 38.328137 ], "pop" : 57901, "state" : "CA" } +{ "_id" : "94559", "city" : "NAPA", "loc" : [ -122.284086, 38.290362 ], "pop" : 23606, "state" : "CA" } +{ "_id" : "94560", "city" : "NEWARK", "loc" : [ -122.031956, 37.536812 ], "pop" : 37861, "state" : "CA" } +{ "_id" : "94561", "city" : "OAKLEY", "loc" : [ -121.703623, 37.994034 ], "pop" : 20920, "state" : "CA" } +{ "_id" : "94563", "city" : "ORINDA", "loc" : [ -122.172848, 37.878659 ], "pop" : 16883, "state" : "CA" } +{ "_id" : "94564", "city" : "PINOLE", "loc" : [ -122.287477, 37.996903 ], "pop" : 16920, "state" : "CA" } +{ "_id" : "94565", "city" : "SHORE ACRES", "loc" : [ -121.908178, 38.016887 ], "pop" : 64053, "state" : "CA" } +{ "_id" : "94566", "city" : "PLEASANTON", "loc" : [ -121.8755, 37.665804 ], "pop" : 32953, "state" : "CA" } +{ "_id" : "94567", "city" : "POPE VALLEY", "loc" : [ -122.472244, 38.678192 ], "pop" : 286, "state" : "CA" } +{ "_id" : "94568", "city" : "DUBLIN", "loc" : [ -121.922589, 37.716597 ], "pop" : 23275, "state" : "CA" } +{ "_id" : "94569", "city" : "PORT COSTA", "loc" : [ -122.186649, 38.046013 ], "pop" : 228, "state" : "CA" } +{ "_id" : "94571", "city" : "RIO VISTA", "loc" : [ -121.701635, 38.163734 ], "pop" : 4516, "state" : "CA" } +{ "_id" : "94572", "city" : "RODEO", "loc" : [ -122.258139, 38.03069 ], "pop" : 7827, "state" : "CA" } +{ "_id" : "94574", "city" : "SAINT HELENA", "loc" : [ -122.461921, 38.513776 ], "pop" : 9388, "state" : "CA" } +{ "_id" : "94577", "city" : "SAN LEANDRO", "loc" : [ -122.158705, 37.720467 ], "pop" : 36779, "state" : "CA" } +{ "_id" : "94578", "city" : "SAN LEANDRO", "loc" : [ -122.123969, 37.702377 ], "pop" : 31780, "state" : "CA" } +{ "_id" : "94579", "city" : "SAN LEANDRO", "loc" : [ -122.150659, 37.689209 ], "pop" : 15754, "state" : "CA" } +{ "_id" : "94580", "city" : "SAN LORENZO", "loc" : [ -122.129547, 37.678671 ], "pop" : 23010, "state" : "CA" } +{ "_id" : "94583", "city" : "SAN RAMON", "loc" : [ -121.952224, 37.756188 ], "pop" : 35449, "state" : "CA" } +{ "_id" : "94585", "city" : "SUISUN CITY", "loc" : [ -122.042003, 38.240834 ], "pop" : 31081, "state" : "CA" } +{ "_id" : "94586", "city" : "SUNOL", "loc" : [ -121.898636, 37.609403 ], "pop" : 953, "state" : "CA" } +{ "_id" : "94587", "city" : "UNION CITY", "loc" : [ -122.049702, 37.589458 ], "pop" : 52869, "state" : "CA" } +{ "_id" : "94588", "city" : "PLEASANTON", "loc" : [ -121.8957, 37.687311 ], "pop" : 19032, "state" : "CA" } +{ "_id" : "94589", "city" : "AMERICAN CANYON", "loc" : [ -122.249333, 38.148345 ], "pop" : 37599, "state" : "CA" } +{ "_id" : "94590", "city" : "VALLEJO", "loc" : [ -122.247367, 38.105302 ], "pop" : 35516, "state" : "CA" } +{ "_id" : "94591", "city" : "VALLEJO", "loc" : [ -122.212354, 38.09853 ], "pop" : 43336, "state" : "CA" } +{ "_id" : "94592", "city" : "MARE ISLAND", "loc" : [ -122.27273, 38.094654 ], "pop" : 3589, "state" : "CA" } +{ "_id" : "94595", "city" : "WALNUT CREEK", "loc" : [ -122.070259, 37.875317 ], "pop" : 16346, "state" : "CA" } +{ "_id" : "94596", "city" : "WALNUT CREEK", "loc" : [ -122.054909, 37.905279 ], "pop" : 38092, "state" : "CA" } +{ "_id" : "94598", "city" : "WALNUT CREEK", "loc" : [ -122.025879, 37.919424 ], "pop" : 24174, "state" : "CA" } +{ "_id" : "94599", "city" : "YOUNTVILLE", "loc" : [ -122.358506, 38.403813 ], "pop" : 1876, "state" : "CA" } +{ "_id" : "94601", "city" : "OAKLAND", "loc" : [ -122.216587, 37.780595 ], "pop" : 47715, "state" : "CA" } +{ "_id" : "94602", "city" : "OAKLAND", "loc" : [ -122.210368, 37.801133 ], "pop" : 28629, "state" : "CA" } +{ "_id" : "94603", "city" : "OAKLAND", "loc" : [ -122.171017, 37.740239 ], "pop" : 27303, "state" : "CA" } +{ "_id" : "94605", "city" : "OAKLAND", "loc" : [ -122.163326, 37.764132 ], "pop" : 38511, "state" : "CA" } +{ "_id" : "94606", "city" : "OAKLAND", "loc" : [ -122.24292, 37.79565 ], "pop" : 38555, "state" : "CA" } +{ "_id" : "94607", "city" : "OAKLAND", "loc" : [ -122.285051, 37.807084 ], "pop" : 21294, "state" : "CA" } +{ "_id" : "94608", "city" : "EMERYVILLE", "loc" : [ -122.280363, 37.836466 ], "pop" : 22318, "state" : "CA" } +{ "_id" : "94609", "city" : "OAKLAND", "loc" : [ -122.26367, 37.836096 ], "pop" : 20263, "state" : "CA" } +{ "_id" : "94610", "city" : "OAKLAND", "loc" : [ -122.244322, 37.812636 ], "pop" : 29637, "state" : "CA" } +{ "_id" : "94611", "city" : "PIEDMONT", "loc" : [ -122.22683, 37.828157 ], "pop" : 34238, "state" : "CA" } +{ "_id" : "94612", "city" : "OAKLAND", "loc" : [ -122.266774, 37.808473 ], "pop" : 10763, "state" : "CA" } +{ "_id" : "94613", "city" : "OAKLAND", "loc" : [ -122.181585, 37.782427 ], "pop" : 627, "state" : "CA" } +{ "_id" : "94618", "city" : "PIEDMONT", "loc" : [ -122.24191, 37.84368 ], "pop" : 15763, "state" : "CA" } +{ "_id" : "94619", "city" : "OAKLAND", "loc" : [ -122.18838, 37.787786 ], "pop" : 24501, "state" : "CA" } +{ "_id" : "94621", "city" : "OAKLAND", "loc" : [ -122.185335, 37.758924 ], "pop" : 26689, "state" : "CA" } +{ "_id" : "94702", "city" : "BERKELEY", "loc" : [ -122.285126, 37.865611 ], "pop" : 15004, "state" : "CA" } +{ "_id" : "94703", "city" : "BERKELEY", "loc" : [ -122.274914, 37.863028 ], "pop" : 18554, "state" : "CA" } +{ "_id" : "94704", "city" : "BERKELEY", "loc" : [ -122.257048, 37.866428 ], "pop" : 23551, "state" : "CA" } +{ "_id" : "94705", "city" : "BERKELEY", "loc" : [ -122.249964, 37.85711 ], "pop" : 11833, "state" : "CA" } +{ "_id" : "94706", "city" : "ALBANY", "loc" : [ -122.295394, 37.890045 ], "pop" : 17333, "state" : "CA" } +{ "_id" : "94707", "city" : "KENSINGTON", "loc" : [ -122.276517, 37.893118 ], "pop" : 9152, "state" : "CA" } +{ "_id" : "94708", "city" : "KENSINGTON", "loc" : [ -122.25976, 37.890829 ], "pop" : 8874, "state" : "CA" } +{ "_id" : "94709", "city" : "BERKELEY", "loc" : [ -122.265461, 37.878397 ], "pop" : 9927, "state" : "CA" } +{ "_id" : "94710", "city" : "BERKELEY", "loc" : [ -122.295929, 37.869603 ], "pop" : 6891, "state" : "CA" } +{ "_id" : "94801", "city" : "RICHMOND", "loc" : [ -122.36201, 37.940039 ], "pop" : 23948, "state" : "CA" } +{ "_id" : "94803", "city" : "EL SOBRANTE", "loc" : [ -122.290092, 37.969287 ], "pop" : 22238, "state" : "CA" } +{ "_id" : "94804", "city" : "RICHMOND", "loc" : [ -122.33421, 37.926523 ], "pop" : 33990, "state" : "CA" } +{ "_id" : "94805", "city" : "RICHMOND", "loc" : [ -122.323756, 37.941719 ], "pop" : 12342, "state" : "CA" } +{ "_id" : "94806", "city" : "SAN PABLO", "loc" : [ -122.336929, 37.972374 ], "pop" : 47668, "state" : "CA" } +{ "_id" : "94901", "city" : "SAN RAFAEL", "loc" : [ -122.510502, 37.969144 ], "pop" : 41550, "state" : "CA" } +{ "_id" : "94903", "city" : "CIVIC CENTER", "loc" : [ -122.54521, 38.015044 ], "pop" : 25563, "state" : "CA" } +{ "_id" : "94904", "city" : "KENTFIELD", "loc" : [ -122.535501, 37.950599 ], "pop" : 11820, "state" : "CA" } +{ "_id" : "94920", "city" : "BELVEDERE", "loc" : [ -122.472627, 37.889885 ], "pop" : 10993, "state" : "CA" } +{ "_id" : "94922", "city" : "BODEGA", "loc" : [ -122.951364, 38.339264 ], "pop" : 93, "state" : "CA" } +{ "_id" : "94923", "city" : "BODEGA BAY", "loc" : [ -123.037308, 38.330921 ], "pop" : 1427, "state" : "CA" } +{ "_id" : "94924", "city" : "BOLINAS", "loc" : [ -122.694655, 37.907875 ], "pop" : 1555, "state" : "CA" } +{ "_id" : "94925", "city" : "CORTE MADERA", "loc" : [ -122.513202, 37.922256 ], "pop" : 7974, "state" : "CA" } +{ "_id" : "94928", "city" : "ROHNERT PARK", "loc" : [ -122.69408, 38.347027 ], "pop" : 35730, "state" : "CA" } +{ "_id" : "94930", "city" : "FAIRFAX", "loc" : [ -122.593711, 37.988289 ], "pop" : 8051, "state" : "CA" } +{ "_id" : "94931", "city" : "COTATI", "loc" : [ -122.704831, 38.325918 ], "pop" : 6849, "state" : "CA" } +{ "_id" : "94933", "city" : "FOREST KNOLLS", "loc" : [ -122.69074, 38.012178 ], "pop" : 732, "state" : "CA" } +{ "_id" : "94937", "city" : "INVERNESS", "loc" : [ -122.856774, 38.083514 ], "pop" : 1716, "state" : "CA" } +{ "_id" : "94938", "city" : "LAGUNITAS", "loc" : [ -122.701576, 38.013929 ], "pop" : 276, "state" : "CA" } +{ "_id" : "94939", "city" : "LARKSPUR", "loc" : [ -122.536202, 37.936743 ], "pop" : 5884, "state" : "CA" } +{ "_id" : "94940", "city" : "MARSHALL", "loc" : [ -122.890011, 38.176221 ], "pop" : 55, "state" : "CA" } +{ "_id" : "94941", "city" : "MILL VALLEY", "loc" : [ -122.533885, 37.895757 ], "pop" : 27746, "state" : "CA" } +{ "_id" : "94945", "city" : "NOVATO", "loc" : [ -122.571416, 38.1163 ], "pop" : 15535, "state" : "CA" } +{ "_id" : "94946", "city" : "NICASIO", "loc" : [ -122.696402, 38.054622 ], "pop" : 665, "state" : "CA" } +{ "_id" : "94947", "city" : "NOVATO", "loc" : [ -122.583691, 38.097258 ], "pop" : 22759, "state" : "CA" } +{ "_id" : "94949", "city" : "NOVATO", "loc" : [ -122.540408, 38.061837 ], "pop" : 16219, "state" : "CA" } +{ "_id" : "94951", "city" : "PENNGROVE", "loc" : [ -122.671772, 38.315948 ], "pop" : 3886, "state" : "CA" } +{ "_id" : "94952", "city" : "PETALUMA", "loc" : [ -122.677727, 38.240349 ], "pop" : 29724, "state" : "CA" } +{ "_id" : "94954", "city" : "PETALUMA", "loc" : [ -122.615536, 38.250739 ], "pop" : 27667, "state" : "CA" } +{ "_id" : "94956", "city" : "POINT REYES STAT", "loc" : [ -122.81621, 38.064794 ], "pop" : 951, "state" : "CA" } +{ "_id" : "94960", "city" : "SAN ANSELMO", "loc" : [ -122.571062, 37.984579 ], "pop" : 15178, "state" : "CA" } +{ "_id" : "94963", "city" : "SAN GERONIMO", "loc" : [ -122.67784, 38.017155 ], "pop" : 802, "state" : "CA" } +{ "_id" : "94965", "city" : "SAUSALITO", "loc" : [ -122.494555, 37.860147 ], "pop" : 10032, "state" : "CA" } +{ "_id" : "94970", "city" : "STINSON BEACH", "loc" : [ -122.639305, 37.901992 ], "pop" : 630, "state" : "CA" } +{ "_id" : "94972", "city" : "VALLEY FORD", "loc" : [ -122.924457, 38.315729 ], "pop" : 114, "state" : "CA" } +{ "_id" : "94973", "city" : "WOODACRE", "loc" : [ -122.638247, 38.006933 ], "pop" : 1524, "state" : "CA" } +{ "_id" : "95002", "city" : "ALVISO", "loc" : [ -121.968597, 37.427659 ], "pop" : 2179, "state" : "CA" } +{ "_id" : "95003", "city" : "APTOS", "loc" : [ -121.891979, 36.978477 ], "pop" : 23964, "state" : "CA" } +{ "_id" : "95004", "city" : "AROMAS", "loc" : [ -121.639781, 36.878522 ], "pop" : 2713, "state" : "CA" } +{ "_id" : "95005", "city" : "BEN LOMOND", "loc" : [ -122.083869, 37.086183 ], "pop" : 7702, "state" : "CA" } +{ "_id" : "95006", "city" : "BOULDER CREEK", "loc" : [ -122.133053, 37.149934 ], "pop" : 9434, "state" : "CA" } +{ "_id" : "95008", "city" : "CAMPBELL", "loc" : [ -121.95539, 37.280007 ], "pop" : 41821, "state" : "CA" } +{ "_id" : "95010", "city" : "CAPITOLA", "loc" : [ -121.952145, 36.977359 ], "pop" : 9337, "state" : "CA" } +{ "_id" : "95012", "city" : "CASTROVILLE", "loc" : [ -121.747368, 36.77142 ], "pop" : 7168, "state" : "CA" } +{ "_id" : "95013", "city" : "COYOTE", "loc" : [ -121.746021, 37.216721 ], "pop" : 316, "state" : "CA" } +{ "_id" : "95014", "city" : "MONTE VISTA", "loc" : [ -122.038604, 37.317363 ], "pop" : 47598, "state" : "CA" } +{ "_id" : "95017", "city" : "DAVENPORT", "loc" : [ -122.225735, 37.06306 ], "pop" : 42, "state" : "CA" } +{ "_id" : "95018", "city" : "FELTON", "loc" : [ -122.062162, 37.063124 ], "pop" : 8194, "state" : "CA" } +{ "_id" : "95019", "city" : "FREEDOM", "loc" : [ -121.776761, 36.936483 ], "pop" : 5075, "state" : "CA" } +{ "_id" : "95020", "city" : "GILROY", "loc" : [ -121.57825, 37.016005 ], "pop" : 39878, "state" : "CA" } +{ "_id" : "95023", "city" : "HOLLISTER", "loc" : [ -121.387101, 36.848404 ], "pop" : 31243, "state" : "CA" } +{ "_id" : "95030", "city" : "MONTE SERENO", "loc" : [ -121.978684, 37.211677 ], "pop" : 25881, "state" : "CA" } +{ "_id" : "95032", "city" : "LOS GATOS", "loc" : [ -121.950088, 37.231571 ], "pop" : 18189, "state" : "CA" } +{ "_id" : "95035", "city" : "MILPITAS", "loc" : [ -121.892885, 37.436491 ], "pop" : 50907, "state" : "CA" } +{ "_id" : "95037", "city" : "MORGAN HILL", "loc" : [ -121.64636, 37.129171 ], "pop" : 31309, "state" : "CA" } +{ "_id" : "95043", "city" : "PAICINES", "loc" : [ -121.032853, 36.49478 ], "pop" : 636, "state" : "CA" } +{ "_id" : "95045", "city" : "SAN JUAN BAUTIST", "loc" : [ -121.532721, 36.849856 ], "pop" : 3657, "state" : "CA" } +{ "_id" : "95046", "city" : "SAN MARTIN", "loc" : [ -121.599901, 37.091118 ], "pop" : 5563, "state" : "CA" } +{ "_id" : "95050", "city" : "SANTA CLARA", "loc" : [ -121.954079, 37.34732 ], "pop" : 33310, "state" : "CA" } +{ "_id" : "95051", "city" : "SANTA CLARA", "loc" : [ -121.983848, 37.346992 ], "pop" : 49570, "state" : "CA" } +{ "_id" : "95054", "city" : "SANTA CLARA", "loc" : [ -121.95394, 37.394673 ], "pop" : 10370, "state" : "CA" } +{ "_id" : "95060", "city" : "SCOTTS VALLEY", "loc" : [ -122.043612, 36.982946 ], "pop" : 40334, "state" : "CA" } +{ "_id" : "95062", "city" : "SANTA CRUZ", "loc" : [ -121.988055, 36.972101 ], "pop" : 34287, "state" : "CA" } +{ "_id" : "95064", "city" : "SANTA CRUZ", "loc" : [ -122.057803, 36.995851 ], "pop" : 4658, "state" : "CA" } +{ "_id" : "95065", "city" : "SANTA CRUZ", "loc" : [ -121.982557, 37.003319 ], "pop" : 8130, "state" : "CA" } +{ "_id" : "95066", "city" : "SCOTTS VALLEY", "loc" : [ -122.014961, 37.057841 ], "pop" : 10636, "state" : "CA" } +{ "_id" : "95070", "city" : "SARATOGA", "loc" : [ -122.018238, 37.272871 ], "pop" : 28909, "state" : "CA" } +{ "_id" : "95073", "city" : "SOQUEL", "loc" : [ -121.950255, 37.003525 ], "pop" : 8143, "state" : "CA" } +{ "_id" : "95076", "city" : "LA SELVA BEACH", "loc" : [ -121.763437, 36.920515 ], "pop" : 68295, "state" : "CA" } +{ "_id" : "95110", "city" : "SAN JOSE", "loc" : [ -121.890299, 37.32966 ], "pop" : 17437, "state" : "CA" } +{ "_id" : "95111", "city" : "SAN JOSE", "loc" : [ -121.824038, 37.282276 ], "pop" : 48286, "state" : "CA" } +{ "_id" : "95112", "city" : "SAN JOSE", "loc" : [ -121.880414, 37.341388 ], "pop" : 46470, "state" : "CA" } +{ "_id" : "95113", "city" : "SAN JOSE", "loc" : [ -121.887227, 37.335188 ], "pop" : 1265, "state" : "CA" } +{ "_id" : "95116", "city" : "SAN JOSE", "loc" : [ -121.850221, 37.351342 ], "pop" : 46754, "state" : "CA" } +{ "_id" : "95117", "city" : "SAN JOSE", "loc" : [ -121.962126, 37.308896 ], "pop" : 27414, "state" : "CA" } +{ "_id" : "95118", "city" : "SAN JOSE", "loc" : [ -121.889845, 37.256162 ], "pop" : 30591, "state" : "CA" } +{ "_id" : "95119", "city" : "SAN JOSE", "loc" : [ -121.790067, 37.230135 ], "pop" : 9823, "state" : "CA" } +{ "_id" : "95120", "city" : "SAN JOSE", "loc" : [ -121.861547, 37.217538 ], "pop" : 34577, "state" : "CA" } +{ "_id" : "95121", "city" : "SAN JOSE", "loc" : [ -121.811939, 37.30593 ], "pop" : 32572, "state" : "CA" } +{ "_id" : "95122", "city" : "SAN JOSE", "loc" : [ -121.833949, 37.329313 ], "pop" : 52543, "state" : "CA" } +{ "_id" : "95123", "city" : "SAN JOSE", "loc" : [ -121.830502, 37.244594 ], "pop" : 55146, "state" : "CA" } +{ "_id" : "95124", "city" : "SAN JOSE", "loc" : [ -121.920831, 37.256844 ], "pop" : 44595, "state" : "CA" } +{ "_id" : "95125", "city" : "SAN JOSE", "loc" : [ -121.895476, 37.296187 ], "pop" : 42573, "state" : "CA" } +{ "_id" : "95126", "city" : "SAN JOSE", "loc" : [ -121.917398, 37.322482 ], "pop" : 24778, "state" : "CA" } +{ "_id" : "95127", "city" : "SAN JOSE", "loc" : [ -121.819516, 37.3664 ], "pop" : 50371, "state" : "CA" } +{ "_id" : "95128", "city" : "SAN JOSE", "loc" : [ -121.934364, 37.314657 ], "pop" : 28275, "state" : "CA" } +{ "_id" : "95129", "city" : "SAN JOSE", "loc" : [ -122.000494, 37.306537 ], "pop" : 33953, "state" : "CA" } +{ "_id" : "95130", "city" : "SAN JOSE", "loc" : [ -121.979182, 37.288628 ], "pop" : 13765, "state" : "CA" } +{ "_id" : "95131", "city" : "SAN JOSE", "loc" : [ -121.879977, 37.386368 ], "pop" : 18425, "state" : "CA" } +{ "_id" : "95132", "city" : "SAN JOSE", "loc" : [ -121.860336, 37.40408 ], "pop" : 37995, "state" : "CA" } +{ "_id" : "95133", "city" : "SAN JOSE", "loc" : [ -121.855959, 37.372875 ], "pop" : 24136, "state" : "CA" } +{ "_id" : "95134", "city" : "SAN JOSE", "loc" : [ -121.943399, 37.413999 ], "pop" : 4324, "state" : "CA" } +{ "_id" : "95135", "city" : "SAN JOSE", "loc" : [ -121.757228, 37.297539 ], "pop" : 9104, "state" : "CA" } +{ "_id" : "95136", "city" : "SAN JOSE", "loc" : [ -121.847625, 37.268423 ], "pop" : 31200, "state" : "CA" } +{ "_id" : "95138", "city" : "SAN JOSE", "loc" : [ -121.778641, 37.246259 ], "pop" : 5956, "state" : "CA" } +{ "_id" : "95139", "city" : "SAN JOSE", "loc" : [ -121.766867, 37.225162 ], "pop" : 6912, "state" : "CA" } +{ "_id" : "95140", "city" : "MOUNT HAMILTON", "loc" : [ -121.639948, 37.316087 ], "pop" : 37, "state" : "CA" } +{ "_id" : "95141", "city" : "SAN JOSE", "loc" : [ -121.755808, 37.169912 ], "pop" : 0, "state" : "CA" } +{ "_id" : "95148", "city" : "SAN JOSE", "loc" : [ -121.792111, 37.329765 ], "pop" : 37413, "state" : "CA" } +{ "_id" : "95202", "city" : "STOCKTON", "loc" : [ -121.287087, 37.960632 ], "pop" : 7753, "state" : "CA" } +{ "_id" : "95203", "city" : "STOCKTON", "loc" : [ -121.307688, 37.956515 ], "pop" : 17847, "state" : "CA" } +{ "_id" : "95204", "city" : "STOCKTON", "loc" : [ -121.315364, 37.974302 ], "pop" : 28860, "state" : "CA" } +{ "_id" : "95205", "city" : "STOCKTON", "loc" : [ -121.259241, 37.960986 ], "pop" : 31314, "state" : "CA" } +{ "_id" : "95206", "city" : "STOCKTON", "loc" : [ -121.287169, 37.931643 ], "pop" : 33154, "state" : "CA" } +{ "_id" : "95207", "city" : "STOCKTON", "loc" : [ -121.32056, 38.002025 ], "pop" : 50167, "state" : "CA" } +{ "_id" : "95209", "city" : "STOCKTON", "loc" : [ -121.343292, 38.033105 ], "pop" : 26289, "state" : "CA" } +{ "_id" : "95210", "city" : "STOCKTON", "loc" : [ -121.297229, 38.024997 ], "pop" : 33763, "state" : "CA" } +{ "_id" : "95211", "city" : "UNIV OF THE PACI", "loc" : [ -121.310336, 37.980364 ], "pop" : 1722, "state" : "CA" } +{ "_id" : "95212", "city" : "STOCKTON", "loc" : [ -121.246018, 38.034428 ], "pop" : 5584, "state" : "CA" } +{ "_id" : "95215", "city" : "STOCKTON", "loc" : [ -121.215295, 37.968545 ], "pop" : 18533, "state" : "CA" } +{ "_id" : "95219", "city" : "STOCKTON", "loc" : [ -121.363712, 38.010233 ], "pop" : 13994, "state" : "CA" } +{ "_id" : "95220", "city" : "ACAMPO", "loc" : [ -121.218576, 38.200413 ], "pop" : 7734, "state" : "CA" } +{ "_id" : "95222", "city" : "ANGELS CAMP", "loc" : [ -120.55437, 38.064011 ], "pop" : 3530, "state" : "CA" } +{ "_id" : "95223", "city" : "BEAR VALLEY", "loc" : [ -120.342231, 38.24175 ], "pop" : 6205, "state" : "CA" } +{ "_id" : "95228", "city" : "COPPEROPOLIS", "loc" : [ -120.638374, 37.937246 ], "pop" : 1336, "state" : "CA" } +{ "_id" : "95230", "city" : "FARMINGTON", "loc" : [ -120.852343, 37.944771 ], "pop" : 141, "state" : "CA" } +{ "_id" : "95231", "city" : "FRENCH CAMP", "loc" : [ -121.282704, 37.877982 ], "pop" : 3673, "state" : "CA" } +{ "_id" : "95232", "city" : "GLENCOE", "loc" : [ -120.594546, 38.351557 ], "pop" : 189, "state" : "CA" } +{ "_id" : "95236", "city" : "LINDEN", "loc" : [ -121.074442, 38.021869 ], "pop" : 3656, "state" : "CA" } +{ "_id" : "95237", "city" : "LOCKEFORD", "loc" : [ -121.135611, 38.162436 ], "pop" : 2847, "state" : "CA" } +{ "_id" : "95240", "city" : "LODI", "loc" : [ -121.263034, 38.123579 ], "pop" : 42726, "state" : "CA" } +{ "_id" : "95242", "city" : "LODI", "loc" : [ -121.311814, 38.132989 ], "pop" : 20669, "state" : "CA" } +{ "_id" : "95245", "city" : "MOKELUMNE HILL", "loc" : [ -120.567705, 38.328918 ], "pop" : 3507, "state" : "CA" } +{ "_id" : "95246", "city" : "MOUNTAIN RANCH", "loc" : [ -120.548137, 38.220363 ], "pop" : 2323, "state" : "CA" } +{ "_id" : "95247", "city" : "MURPHYS", "loc" : [ -120.461772, 38.126896 ], "pop" : 2691, "state" : "CA" } +{ "_id" : "95249", "city" : "SAN ANDREAS", "loc" : [ -120.668703, 38.186732 ], "pop" : 3081, "state" : "CA" } +{ "_id" : "95251", "city" : "VALLECITO", "loc" : [ -120.467879, 38.101472 ], "pop" : 200, "state" : "CA" } +{ "_id" : "95252", "city" : "VALLEY SPRINGS", "loc" : [ -120.859742, 38.154355 ], "pop" : 7592, "state" : "CA" } +{ "_id" : "95255", "city" : "WEST POINT", "loc" : [ -120.515862, 38.406201 ], "pop" : 1513, "state" : "CA" } +{ "_id" : "95257", "city" : "WILSEYVILLE", "loc" : [ -120.442356, 38.384566 ], "pop" : 32, "state" : "CA" } +{ "_id" : "95258", "city" : "WOODBRIDGE", "loc" : [ -121.308632, 38.155124 ], "pop" : 2241, "state" : "CA" } +{ "_id" : "95301", "city" : "ATWATER", "loc" : [ -120.600837, 37.353154 ], "pop" : 24928, "state" : "CA" } +{ "_id" : "95303", "city" : "BALLICO", "loc" : [ -120.700152, 37.452455 ], "pop" : 1296, "state" : "CA" } +{ "_id" : "95306", "city" : "CATHEYS VALLEY", "loc" : [ -120.069017, 37.441409 ], "pop" : 1033, "state" : "CA" } +{ "_id" : "95307", "city" : "CERES", "loc" : [ -120.949936, 37.588097 ], "pop" : 29037, "state" : "CA" } +{ "_id" : "95309", "city" : "CHINESE CAMP", "loc" : [ -120.406673, 37.856829 ], "pop" : 15, "state" : "CA" } +{ "_id" : "95310", "city" : "COLUMBIA", "loc" : [ -120.405552, 38.03975 ], "pop" : 1512, "state" : "CA" } +{ "_id" : "95311", "city" : "COULTERVILLE", "loc" : [ -119.985813, 37.738642 ], "pop" : 2384, "state" : "CA" } +{ "_id" : "95313", "city" : "CROWS LANDING", "loc" : [ -121.019893, 37.438956 ], "pop" : 1896, "state" : "CA" } +{ "_id" : "95315", "city" : "DELHI", "loc" : [ -120.775489, 37.428629 ], "pop" : 6151, "state" : "CA" } +{ "_id" : "95316", "city" : "DENAIR", "loc" : [ -120.796474, 37.538419 ], "pop" : 5878, "state" : "CA" } +{ "_id" : "95317", "city" : "EL NIDO", "loc" : [ -120.483235, 37.13452 ], "pop" : 1024, "state" : "CA" } +{ "_id" : "95320", "city" : "ESCALON", "loc" : [ -120.990044, 37.804428 ], "pop" : 9405, "state" : "CA" } +{ "_id" : "95321", "city" : "GROVELAND", "loc" : [ -120.191809, 37.840899 ], "pop" : 3616, "state" : "CA" } +{ "_id" : "95322", "city" : "GUSTINE", "loc" : [ -121.003965, 37.242456 ], "pop" : 6083, "state" : "CA" } +{ "_id" : "95323", "city" : "HICKMAN", "loc" : [ -120.71722, 37.619989 ], "pop" : 1405, "state" : "CA" } +{ "_id" : "95324", "city" : "HILMAR", "loc" : [ -120.856144, 37.408377 ], "pop" : 6676, "state" : "CA" } +{ "_id" : "95325", "city" : "HORNITOS", "loc" : [ -120.226443, 37.492226 ], "pop" : 49, "state" : "CA" } +{ "_id" : "95326", "city" : "HUGHSON", "loc" : [ -120.865281, 37.594364 ], "pop" : 6383, "state" : "CA" } +{ "_id" : "95327", "city" : "JAMESTOWN", "loc" : [ -120.494567, 37.906544 ], "pop" : 8359, "state" : "CA" } +{ "_id" : "95329", "city" : "LA GRANGE", "loc" : [ -120.358131, 37.678915 ], "pop" : 1305, "state" : "CA" } +{ "_id" : "95330", "city" : "LATHROP", "loc" : [ -121.282652, 37.820897 ], "pop" : 8426, "state" : "CA" } +{ "_id" : "95333", "city" : "LE GRAND", "loc" : [ -120.251737, 37.234175 ], "pop" : 1810, "state" : "CA" } +{ "_id" : "95334", "city" : "LIVINGSTON", "loc" : [ -120.716156, 37.376168 ], "pop" : 10994, "state" : "CA" } +{ "_id" : "95335", "city" : "COLD SPRINGS", "loc" : [ -120.001159, 38.20336 ], "pop" : 201, "state" : "CA" } +{ "_id" : "95336", "city" : "MANTECA", "loc" : [ -121.21856, 37.80875 ], "pop" : 51728, "state" : "CA" } +{ "_id" : "95338", "city" : "MARIPOSA", "loc" : [ -119.892496, 37.503918 ], "pop" : 9323, "state" : "CA" } +{ "_id" : "95340", "city" : "RED TOP", "loc" : [ -120.461668, 37.300724 ], "pop" : 59918, "state" : "CA" } +{ "_id" : "95345", "city" : "MIDPINES", "loc" : [ -119.946548, 37.571009 ], "pop" : 388, "state" : "CA" } +{ "_id" : "95346", "city" : "MI WUK VILLAGE", "loc" : [ -120.131762, 38.105576 ], "pop" : 701, "state" : "CA" } +{ "_id" : "95348", "city" : "MERCED", "loc" : [ -120.500897, 37.326964 ], "pop" : 19719, "state" : "CA" } +{ "_id" : "95350", "city" : "MODESTO", "loc" : [ -121.011303, 37.674649 ], "pop" : 50618, "state" : "CA" } +{ "_id" : "95351", "city" : "MODESTO", "loc" : [ -121.006033, 37.625022 ], "pop" : 69275, "state" : "CA" } +{ "_id" : "95354", "city" : "MODESTO", "loc" : [ -120.968323, 37.644526 ], "pop" : 26630, "state" : "CA" } +{ "_id" : "95355", "city" : "MODESTO", "loc" : [ -120.954658, 37.673515 ], "pop" : 43734, "state" : "CA" } +{ "_id" : "95356", "city" : "MODESTO", "loc" : [ -121.027051, 37.699431 ], "pop" : 26202, "state" : "CA" } +{ "_id" : "95360", "city" : "NEWMAN", "loc" : [ -121.025943, 37.317591 ], "pop" : 5313, "state" : "CA" } +{ "_id" : "95361", "city" : "KNIGHTS FERRY", "loc" : [ -120.849474, 37.775323 ], "pop" : 20919, "state" : "CA" } +{ "_id" : "95363", "city" : "PATTERSON", "loc" : [ -121.140732, 37.490592 ], "pop" : 13437, "state" : "CA" } +{ "_id" : "95364", "city" : "PINECREST", "loc" : [ -119.865195, 38.341062 ], "pop" : 13, "state" : "CA" } +{ "_id" : "95366", "city" : "RIPON", "loc" : [ -121.122909, 37.753286 ], "pop" : 10879, "state" : "CA" } +{ "_id" : "95367", "city" : "RIVERBANK", "loc" : [ -120.943019, 37.732809 ], "pop" : 9732, "state" : "CA" } +{ "_id" : "95368", "city" : "SALIDA", "loc" : [ -121.090484, 37.70713 ], "pop" : 3255, "state" : "CA" } +{ "_id" : "95369", "city" : "SNELLING", "loc" : [ -120.481615, 37.514359 ], "pop" : 1335, "state" : "CA" } +{ "_id" : "95370", "city" : "SONORA", "loc" : [ -120.338498, 37.995692 ], "pop" : 23398, "state" : "CA" } +{ "_id" : "95372", "city" : "SOULSBYVILLE", "loc" : [ -120.259892, 37.992794 ], "pop" : 1566, "state" : "CA" } +{ "_id" : "95374", "city" : "STEVINSON", "loc" : [ -120.869856, 37.32575 ], "pop" : 1564, "state" : "CA" } +{ "_id" : "95376", "city" : "TRACY", "loc" : [ -121.419723, 37.742116 ], "pop" : 47291, "state" : "CA" } +{ "_id" : "95379", "city" : "TUOLUMNE", "loc" : [ -120.237496, 37.971339 ], "pop" : 3402, "state" : "CA" } +{ "_id" : "95380", "city" : "TURLOCK", "loc" : [ -120.850511, 37.503605 ], "pop" : 50025, "state" : "CA" } +{ "_id" : "95383", "city" : "TWAIN HARTE", "loc" : [ -120.2155, 38.044722 ], "pop" : 5133, "state" : "CA" } +{ "_id" : "95386", "city" : "WATERFORD", "loc" : [ -120.753862, 37.650988 ], "pop" : 6505, "state" : "CA" } +{ "_id" : "95388", "city" : "WINTON", "loc" : [ -120.6132, 37.39233 ], "pop" : 10362, "state" : "CA" } +{ "_id" : "95401", "city" : "SANTA ROSA", "loc" : [ -122.751722, 38.443123 ], "pop" : 30549, "state" : "CA" } +{ "_id" : "95403", "city" : "SANTA ROSA", "loc" : [ -122.748528, 38.477273 ], "pop" : 30874, "state" : "CA" } +{ "_id" : "95404", "city" : "SANTA ROSA", "loc" : [ -122.689524, 38.449556 ], "pop" : 31216, "state" : "CA" } +{ "_id" : "95405", "city" : "SANTA ROSA", "loc" : [ -122.66988, 38.438279 ], "pop" : 20776, "state" : "CA" } +{ "_id" : "95407", "city" : "SANTA ROSA", "loc" : [ -122.727896, 38.410462 ], "pop" : 22086, "state" : "CA" } +{ "_id" : "95409", "city" : "SANTA ROSA", "loc" : [ -122.642125, 38.461242 ], "pop" : 22897, "state" : "CA" } +{ "_id" : "95410", "city" : "ALBION", "loc" : [ -123.721366, 39.215934 ], "pop" : 869, "state" : "CA" } +{ "_id" : "95412", "city" : "ANNAPOLIS", "loc" : [ -123.314214, 38.714485 ], "pop" : 24, "state" : "CA" } +{ "_id" : "95415", "city" : "BOONVILLE", "loc" : [ -123.401954, 39.035007 ], "pop" : 1744, "state" : "CA" } +{ "_id" : "95417", "city" : "BRANSCOMB", "loc" : [ -123.554982, 39.700531 ], "pop" : 708, "state" : "CA" } +{ "_id" : "95420", "city" : "CASPAR", "loc" : [ -123.798489, 39.365102 ], "pop" : 349, "state" : "CA" } +{ "_id" : "95421", "city" : "CAZADERO", "loc" : [ -123.182896, 38.566335 ], "pop" : 2367, "state" : "CA" } +{ "_id" : "95422", "city" : "CLEARLAKE", "loc" : [ -122.636089, 38.957138 ], "pop" : 12157, "state" : "CA" } +{ "_id" : "95423", "city" : "CLEARLAKE OAKS", "loc" : [ -122.66873, 39.034838 ], "pop" : 3400, "state" : "CA" } +{ "_id" : "95425", "city" : "CLOVERDALE", "loc" : [ -123.011725, 38.799396 ], "pop" : 7695, "state" : "CA" } +{ "_id" : "95427", "city" : "COMPTCHE", "loc" : [ -123.585652, 39.249919 ], "pop" : 538, "state" : "CA" } +{ "_id" : "95428", "city" : "COVELO", "loc" : [ -123.215015, 39.801864 ], "pop" : 2182, "state" : "CA" } +{ "_id" : "95429", "city" : "DOS RIOS", "loc" : [ -123.298294, 39.709298 ], "pop" : 14, "state" : "CA" } +{ "_id" : "95432", "city" : "ELK", "loc" : [ -123.723961, 39.160402 ], "pop" : 199, "state" : "CA" } +{ "_id" : "95436", "city" : "FORESTVILLE", "loc" : [ -122.896683, 38.489442 ], "pop" : 7252, "state" : "CA" } +{ "_id" : "95437", "city" : "FORT BRAGG", "loc" : [ -123.78835, 39.437452 ], "pop" : 13535, "state" : "CA" } +{ "_id" : "95439", "city" : "FULTON", "loc" : [ -122.77608, 38.494732 ], "pop" : 569, "state" : "CA" } +{ "_id" : "95441", "city" : "GEYSERVILLE", "loc" : [ -122.888921, 38.700398 ], "pop" : 2716, "state" : "CA" } +{ "_id" : "95442", "city" : "GLEN ELLEN", "loc" : [ -122.521002, 38.362538 ], "pop" : 5055, "state" : "CA" } +{ "_id" : "95443", "city" : "GLENHAVEN", "loc" : [ -122.522035, 38.99008 ], "pop" : 94, "state" : "CA" } +{ "_id" : "95444", "city" : "GRATON", "loc" : [ -122.866766, 38.434971 ], "pop" : 259, "state" : "CA" } +{ "_id" : "95445", "city" : "GUALALA", "loc" : [ -123.553975, 38.803619 ], "pop" : 1806, "state" : "CA" } +{ "_id" : "95446", "city" : "GUERNEVILLE", "loc" : [ -122.994416, 38.509573 ], "pop" : 5060, "state" : "CA" } +{ "_id" : "95448", "city" : "HEALDSBURG", "loc" : [ -122.856529, 38.61553 ], "pop" : 16884, "state" : "CA" } +{ "_id" : "95449", "city" : "HOPLAND", "loc" : [ -123.116956, 38.972056 ], "pop" : 1648, "state" : "CA" } +{ "_id" : "95450", "city" : "JENNER", "loc" : [ -123.135379, 38.474093 ], "pop" : 156, "state" : "CA" } +{ "_id" : "95451", "city" : "KELSEYVILLE", "loc" : [ -122.781707, 38.946164 ], "pop" : 10064, "state" : "CA" } +{ "_id" : "95452", "city" : "KENWOOD", "loc" : [ -122.554679, 38.416794 ], "pop" : 1411, "state" : "CA" } +{ "_id" : "95453", "city" : "LAKEPORT", "loc" : [ -122.915082, 39.055147 ], "pop" : 10351, "state" : "CA" } +{ "_id" : "95454", "city" : "LAYTONVILLE", "loc" : [ -123.486862, 39.667811 ], "pop" : 1815, "state" : "CA" } +{ "_id" : "95456", "city" : "LITTLERIVER", "loc" : [ -123.753089, 39.271042 ], "pop" : 1119, "state" : "CA" } +{ "_id" : "95457", "city" : "LOWER LAKE", "loc" : [ -122.575426, 38.860682 ], "pop" : 4880, "state" : "CA" } +{ "_id" : "95458", "city" : "LUCERNE", "loc" : [ -122.785125, 39.083393 ], "pop" : 2330, "state" : "CA" } +{ "_id" : "95459", "city" : "MANCHESTER", "loc" : [ -123.670962, 38.992088 ], "pop" : 453, "state" : "CA" } +{ "_id" : "95460", "city" : "MENDOCINO", "loc" : [ -123.78846, 39.323212 ], "pop" : 1876, "state" : "CA" } +{ "_id" : "95461", "city" : "MIDDLETOWN", "loc" : [ -122.64352, 38.782504 ], "pop" : 2863, "state" : "CA" } +{ "_id" : "95462", "city" : "RUSSIAN RIVER MD", "loc" : [ -123.00447, 38.462668 ], "pop" : 1999, "state" : "CA" } +{ "_id" : "95464", "city" : "NICE", "loc" : [ -122.842409, 39.122341 ], "pop" : 2374, "state" : "CA" } +{ "_id" : "95465", "city" : "OCCIDENTAL", "loc" : [ -122.988194, 38.396911 ], "pop" : 2094, "state" : "CA" } +{ "_id" : "95466", "city" : "PHILO", "loc" : [ -123.538218, 39.120005 ], "pop" : 498, "state" : "CA" } +{ "_id" : "95468", "city" : "POINT ARENA", "loc" : [ -123.660756, 38.915264 ], "pop" : 1129, "state" : "CA" } +{ "_id" : "95469", "city" : "POTTER VALLEY", "loc" : [ -123.104181, 39.329639 ], "pop" : 1970, "state" : "CA" } +{ "_id" : "95470", "city" : "REDWOOD VALLEY", "loc" : [ -123.213289, 39.269446 ], "pop" : 5328, "state" : "CA" } +{ "_id" : "95472", "city" : "FREESTONE", "loc" : [ -122.838503, 38.391543 ], "pop" : 27943, "state" : "CA" } +{ "_id" : "95476", "city" : "SONOMA", "loc" : [ -122.472843, 38.295659 ], "pop" : 30443, "state" : "CA" } +{ "_id" : "95482", "city" : "UKIAH", "loc" : [ -123.200692, 39.151917 ], "pop" : 28165, "state" : "CA" } +{ "_id" : "95485", "city" : "UPPER LAKE", "loc" : [ -122.896114, 39.160829 ], "pop" : 1771, "state" : "CA" } +{ "_id" : "95488", "city" : "WESTPORT", "loc" : [ -123.76426, 39.644059 ], "pop" : 369, "state" : "CA" } +{ "_id" : "95490", "city" : "WILLITS", "loc" : [ -123.350271, 39.411426 ], "pop" : 12864, "state" : "CA" } +{ "_id" : "95492", "city" : "WINDSOR", "loc" : [ -122.804375, 38.543182 ], "pop" : 13717, "state" : "CA" } +{ "_id" : "95493", "city" : "WITTER SPRINGS", "loc" : [ -122.97105, 39.182118 ], "pop" : 300, "state" : "CA" } +{ "_id" : "95494", "city" : "YORKVILLE", "loc" : [ -123.233867, 38.908945 ], "pop" : 173, "state" : "CA" } +{ "_id" : "95497", "city" : "THE SEA RANCH", "loc" : [ -123.467486, 38.725627 ], "pop" : 576, "state" : "CA" } +{ "_id" : "95501", "city" : "EUREKA", "loc" : [ -124.155892, 40.776237 ], "pop" : 45720, "state" : "CA" } +{ "_id" : "95521", "city" : "MC KINLEYVILLE", "loc" : [ -124.081069, 40.904901 ], "pop" : 32283, "state" : "CA" } +{ "_id" : "95524", "city" : "BAYSIDE", "loc" : [ -124.027305, 40.822381 ], "pop" : 1744, "state" : "CA" } +{ "_id" : "95525", "city" : "BLUE LAKE", "loc" : [ -123.896696, 40.928701 ], "pop" : 328, "state" : "CA" } +{ "_id" : "95526", "city" : "RUTH", "loc" : [ -123.549351, 40.468566 ], "pop" : 1076, "state" : "CA" } +{ "_id" : "95527", "city" : "BURNT RANCH", "loc" : [ -123.461248, 40.772238 ], "pop" : 478, "state" : "CA" } +{ "_id" : "95528", "city" : "CARLOTTA", "loc" : [ -123.974287, 40.507027 ], "pop" : 1054, "state" : "CA" } +{ "_id" : "95531", "city" : "CRESCENT CITY", "loc" : [ -124.178448, 41.785402 ], "pop" : 19400, "state" : "CA" } +{ "_id" : "95536", "city" : "FERNDALE", "loc" : [ -124.252268, 40.574488 ], "pop" : 2942, "state" : "CA" } +{ "_id" : "95540", "city" : "FORTUNA", "loc" : [ -124.140654, 40.584931 ], "pop" : 10727, "state" : "CA" } +{ "_id" : "95543", "city" : "GASQUET", "loc" : [ -123.912467, 41.862768 ], "pop" : 658, "state" : "CA" } +{ "_id" : "95546", "city" : "HOOPA", "loc" : [ -123.692754, 41.105937 ], "pop" : 2702, "state" : "CA" } +{ "_id" : "95547", "city" : "HYDESVILLE", "loc" : [ -124.084489, 40.549576 ], "pop" : 919, "state" : "CA" } +{ "_id" : "95548", "city" : "KLAMATH", "loc" : [ -124.033907, 41.542075 ], "pop" : 1390, "state" : "CA" } +{ "_id" : "95549", "city" : "KNEELAND", "loc" : [ -123.946421, 40.71262 ], "pop" : 265, "state" : "CA" } +{ "_id" : "95550", "city" : "KORBEL", "loc" : [ -123.859413, 40.824369 ], "pop" : 187, "state" : "CA" } +{ "_id" : "95551", "city" : "LOLETA", "loc" : [ -124.228826, 40.6531 ], "pop" : 1244, "state" : "CA" } +{ "_id" : "95552", "city" : "MAD RIVER", "loc" : [ -123.413994, 40.352352 ], "pop" : 6, "state" : "CA" } +{ "_id" : "95554", "city" : "MYERS FLAT", "loc" : [ -123.822713, 40.194758 ], "pop" : 3791, "state" : "CA" } +{ "_id" : "95555", "city" : "ORICK", "loc" : [ -124.050319, 41.30724 ], "pop" : 314, "state" : "CA" } +{ "_id" : "95556", "city" : "ORLEANS", "loc" : [ -123.529564, 41.318092 ], "pop" : 619, "state" : "CA" } +{ "_id" : "95558", "city" : "PETROLIA", "loc" : [ -124.251236, 40.300558 ], "pop" : 347, "state" : "CA" } +{ "_id" : "95560", "city" : "REDWAY", "loc" : [ -123.844194, 40.110081 ], "pop" : 148, "state" : "CA" } +{ "_id" : "95562", "city" : "RIO DELL", "loc" : [ -124.104386, 40.495147 ], "pop" : 4066, "state" : "CA" } +{ "_id" : "95563", "city" : "SALYER", "loc" : [ -123.547833, 40.89095 ], "pop" : 903, "state" : "CA" } +{ "_id" : "95564", "city" : "SAMOA", "loc" : [ -124.193571, 40.803712 ], "pop" : 527, "state" : "CA" } +{ "_id" : "95565", "city" : "SCOTIA", "loc" : [ -124.039074, 40.454665 ], "pop" : 321, "state" : "CA" } +{ "_id" : "95567", "city" : "SMITH RIVER", "loc" : [ -124.166115, 41.936218 ], "pop" : 2012, "state" : "CA" } +{ "_id" : "95568", "city" : "SOMES BAR", "loc" : [ -123.475928, 41.43304 ], "pop" : 195, "state" : "CA" } +{ "_id" : "95569", "city" : "REDCREST", "loc" : [ -123.94205, 40.406458 ], "pop" : 208, "state" : "CA" } +{ "_id" : "95570", "city" : "WESTHAVEN", "loc" : [ -124.101253, 41.087949 ], "pop" : 3143, "state" : "CA" } +{ "_id" : "95573", "city" : "WILLOW CREEK", "loc" : [ -123.631062, 40.938894 ], "pop" : 1503, "state" : "CA" } +{ "_id" : "95603", "city" : "AUBURN", "loc" : [ -121.084347, 38.928311 ], "pop" : 32535, "state" : "CA" } +{ "_id" : "95605", "city" : "BRYTE", "loc" : [ -121.526377, 38.592424 ], "pop" : 11611, "state" : "CA" } +{ "_id" : "95606", "city" : "BROOKS", "loc" : [ -122.133391, 38.739277 ], "pop" : 162, "state" : "CA" } +{ "_id" : "95607", "city" : "CAPAY", "loc" : [ -122.100993, 38.696964 ], "pop" : 175, "state" : "CA" } +{ "_id" : "95608", "city" : "CARMICHAEL", "loc" : [ -121.328683, 38.628393 ], "pop" : 55815, "state" : "CA" } +{ "_id" : "95610", "city" : "CITRUS HEIGHTS", "loc" : [ -121.269211, 38.694571 ], "pop" : 41476, "state" : "CA" } +{ "_id" : "95612", "city" : "CLARKSBURG", "loc" : [ -121.556853, 38.395963 ], "pop" : 1501, "state" : "CA" } +{ "_id" : "95614", "city" : "COOL", "loc" : [ -120.972963, 38.903633 ], "pop" : 2325, "state" : "CA" } +{ "_id" : "95615", "city" : "COURTLAND", "loc" : [ -121.554297, 38.305756 ], "pop" : 958, "state" : "CA" } +{ "_id" : "95616", "city" : "DAVIS", "loc" : [ -121.748495, 38.554817 ], "pop" : 52224, "state" : "CA" } +{ "_id" : "95618", "city" : "EL MACERO", "loc" : [ -121.676722, 38.542151 ], "pop" : 1126, "state" : "CA" } +{ "_id" : "95619", "city" : "DIAMOND SPRINGS", "loc" : [ -120.836071, 38.66302 ], "pop" : 6747, "state" : "CA" } +{ "_id" : "95620", "city" : "LIBERTY FARMS", "loc" : [ -121.815825, 38.458691 ], "pop" : 14536, "state" : "CA" } +{ "_id" : "95621", "city" : "CITRUS HEIGHTS", "loc" : [ -121.307501, 38.695155 ], "pop" : 40540, "state" : "CA" } +{ "_id" : "95624", "city" : "ELK GROVE", "loc" : [ -121.359914, 38.412744 ], "pop" : 23492, "state" : "CA" } +{ "_id" : "95626", "city" : "ELVERTA", "loc" : [ -121.431038, 38.716424 ], "pop" : 6154, "state" : "CA" } +{ "_id" : "95627", "city" : "ESPARTO", "loc" : [ -122.021391, 38.694191 ], "pop" : 2118, "state" : "CA" } +{ "_id" : "95628", "city" : "FAIR OAKS", "loc" : [ -121.261065, 38.655408 ], "pop" : 40502, "state" : "CA" } +{ "_id" : "95629", "city" : "FIDDLETOWN", "loc" : [ -120.715926, 38.53141 ], "pop" : 1147, "state" : "CA" } +{ "_id" : "95630", "city" : "EL DORADO HILLS", "loc" : [ -121.140927, 38.687885 ], "pop" : 38587, "state" : "CA" } +{ "_id" : "95631", "city" : "FORESTHILL", "loc" : [ -120.861127, 39.00229 ], "pop" : 4626, "state" : "CA" } +{ "_id" : "95632", "city" : "GALT", "loc" : [ -121.29383, 38.269846 ], "pop" : 14173, "state" : "CA" } +{ "_id" : "95633", "city" : "GARDEN VALLEY", "loc" : [ -120.856672, 38.866495 ], "pop" : 3628, "state" : "CA" } +{ "_id" : "95634", "city" : "GEORGETOWN", "loc" : [ -120.793388, 38.919892 ], "pop" : 1634, "state" : "CA" } +{ "_id" : "95635", "city" : "GREENWOOD", "loc" : [ -120.916589, 38.936234 ], "pop" : 226, "state" : "CA" } +{ "_id" : "95636", "city" : "GRIZZLY FLATS", "loc" : [ -120.542508, 38.628665 ], "pop" : 237, "state" : "CA" } +{ "_id" : "95637", "city" : "GUINDA", "loc" : [ -122.189659, 38.816568 ], "pop" : 198, "state" : "CA" } +{ "_id" : "95638", "city" : "HERALD", "loc" : [ -121.158898, 38.31282 ], "pop" : 1009, "state" : "CA" } +{ "_id" : "95640", "city" : "IONE", "loc" : [ -120.943265, 38.351882 ], "pop" : 8440, "state" : "CA" } +{ "_id" : "95641", "city" : "ISLETON", "loc" : [ -121.604858, 38.155392 ], "pop" : 2273, "state" : "CA" } +{ "_id" : "95642", "city" : "JACKSON", "loc" : [ -120.754877, 38.357514 ], "pop" : 5335, "state" : "CA" } +{ "_id" : "95643", "city" : "KELSEY", "loc" : [ -120.824056, 38.797636 ], "pop" : 531, "state" : "CA" } +{ "_id" : "95645", "city" : "KNIGHTS LANDING", "loc" : [ -121.720003, 38.822032 ], "pop" : 1907, "state" : "CA" } +{ "_id" : "95648", "city" : "LINCOLN", "loc" : [ -121.295541, 38.904035 ], "pop" : 11935, "state" : "CA" } +{ "_id" : "95650", "city" : "LOOMIS", "loc" : [ -121.169826, 38.80711 ], "pop" : 12973, "state" : "CA" } +{ "_id" : "95651", "city" : "LOTUS", "loc" : [ -120.928864, 38.801712 ], "pop" : 1832, "state" : "CA" } +{ "_id" : "95652", "city" : "MCCLELLAN AFB", "loc" : [ -121.40311, 38.655416 ], "pop" : 541, "state" : "CA" } +{ "_id" : "95653", "city" : "MADISON", "loc" : [ -121.972129, 38.680164 ], "pop" : 523, "state" : "CA" } +{ "_id" : "95655", "city" : "MATHER AFB", "loc" : [ -121.282394, 38.549224 ], "pop" : 4880, "state" : "CA" } +{ "_id" : "95658", "city" : "NEWCASTLE", "loc" : [ -121.142616, 38.872467 ], "pop" : 5998, "state" : "CA" } +{ "_id" : "95659", "city" : "TROWBRIDGE", "loc" : [ -121.553043, 38.882726 ], "pop" : 802, "state" : "CA" } +{ "_id" : "95660", "city" : "NORTH HIGHLANDS", "loc" : [ -121.374913, 38.68855 ], "pop" : 42271, "state" : "CA" } +{ "_id" : "95661", "city" : "ROSEVILLE", "loc" : [ -121.233968, 38.734612 ], "pop" : 29157, "state" : "CA" } +{ "_id" : "95662", "city" : "ORANGEVALE", "loc" : [ -121.222902, 38.682384 ], "pop" : 31361, "state" : "CA" } +{ "_id" : "95663", "city" : "PENRYN", "loc" : [ -121.179149, 38.856654 ], "pop" : 2048, "state" : "CA" } +{ "_id" : "95664", "city" : "PILOT HILL", "loc" : [ -121.029765, 38.826312 ], "pop" : 1152, "state" : "CA" } +{ "_id" : "95665", "city" : "PINE GROVE", "loc" : [ -120.643713, 38.396783 ], "pop" : 3066, "state" : "CA" } +{ "_id" : "95666", "city" : "PIONEER", "loc" : [ -120.531815, 38.460271 ], "pop" : 4797, "state" : "CA" } +{ "_id" : "95667", "city" : "PLACERVILLE", "loc" : [ -120.804564, 38.719479 ], "pop" : 30563, "state" : "CA" } +{ "_id" : "95668", "city" : "PLEASANT GROVE", "loc" : [ -121.507967, 38.787773 ], "pop" : 1034, "state" : "CA" } +{ "_id" : "95669", "city" : "PLYMOUTH", "loc" : [ -120.870258, 38.48811 ], "pop" : 969, "state" : "CA" } +{ "_id" : "95670", "city" : "GOLD RIVER", "loc" : [ -121.289434, 38.601897 ], "pop" : 42461, "state" : "CA" } +{ "_id" : "95672", "city" : "RESCUE", "loc" : [ -120.994526, 38.719353 ], "pop" : 2987, "state" : "CA" } +{ "_id" : "95673", "city" : "RIO LINDA", "loc" : [ -121.445152, 38.689311 ], "pop" : 12756, "state" : "CA" } +{ "_id" : "95674", "city" : "RIO OSO", "loc" : [ -121.505305, 38.960998 ], "pop" : 1102, "state" : "CA" } +{ "_id" : "95677", "city" : "ROCKLIN", "loc" : [ -121.243406, 38.791898 ], "pop" : 19125, "state" : "CA" } +{ "_id" : "95678", "city" : "ROSEVILLE", "loc" : [ -121.302801, 38.750895 ], "pop" : 28285, "state" : "CA" } +{ "_id" : "95679", "city" : "RUMSEY", "loc" : [ -122.253738, 38.8762 ], "pop" : 228, "state" : "CA" } +{ "_id" : "95681", "city" : "SHERIDAN", "loc" : [ -121.362062, 38.99153 ], "pop" : 1169, "state" : "CA" } +{ "_id" : "95682", "city" : "CAMERON PARK", "loc" : [ -120.975925, 38.665616 ], "pop" : 20139, "state" : "CA" } +{ "_id" : "95683", "city" : "RANCHO MURIETA", "loc" : [ -121.094089, 38.507475 ], "pop" : 3035, "state" : "CA" } +{ "_id" : "95684", "city" : "SOMERSET", "loc" : [ -120.666306, 38.607414 ], "pop" : 2892, "state" : "CA" } +{ "_id" : "95685", "city" : "SUTTER CREEK", "loc" : [ -120.785454, 38.418569 ], "pop" : 5677, "state" : "CA" } +{ "_id" : "95687", "city" : "VACAVILLE", "loc" : [ -121.962285, 38.341915 ], "pop" : 50280, "state" : "CA" } +{ "_id" : "95688", "city" : "VACAVILLE", "loc" : [ -121.989912, 38.3812 ], "pop" : 29052, "state" : "CA" } +{ "_id" : "95689", "city" : "VOLCANO", "loc" : [ -120.617761, 38.477319 ], "pop" : 1004, "state" : "CA" } +{ "_id" : "95690", "city" : "WALNUT GROVE", "loc" : [ -121.524849, 38.236362 ], "pop" : 1839, "state" : "CA" } +{ "_id" : "95691", "city" : "WEST SACRAMENTO", "loc" : [ -121.539671, 38.567979 ], "pop" : 17301, "state" : "CA" } +{ "_id" : "95692", "city" : "WHEATLAND", "loc" : [ -121.422126, 39.019197 ], "pop" : 2532, "state" : "CA" } +{ "_id" : "95693", "city" : "WILTON", "loc" : [ -121.225656, 38.412069 ], "pop" : 4082, "state" : "CA" } +{ "_id" : "95694", "city" : "WINTERS", "loc" : [ -121.974544, 38.529462 ], "pop" : 6253, "state" : "CA" } +{ "_id" : "95695", "city" : "WOODLAND", "loc" : [ -121.77932, 38.674294 ], "pop" : 44587, "state" : "CA" } +{ "_id" : "95698", "city" : "ZAMORA", "loc" : [ -121.90654, 38.799896 ], "pop" : 317, "state" : "CA" } +{ "_id" : "95701", "city" : "ALTA", "loc" : [ -120.773165, 39.228032 ], "pop" : 751, "state" : "CA" } +{ "_id" : "95703", "city" : "APPLEGATE", "loc" : [ -120.990511, 38.995487 ], "pop" : 1898, "state" : "CA" } +{ "_id" : "95709", "city" : "CAMINO", "loc" : [ -120.671979, 38.744938 ], "pop" : 4394, "state" : "CA" } +{ "_id" : "95713", "city" : "IOWA HILL", "loc" : [ -120.960163, 39.076936 ], "pop" : 7344, "state" : "CA" } +{ "_id" : "95714", "city" : "DUTCH FLAT", "loc" : [ -120.826224, 39.197788 ], "pop" : 533, "state" : "CA" } +{ "_id" : "95715", "city" : "EMIGRANT GAP", "loc" : [ -120.662902, 39.286907 ], "pop" : 36, "state" : "CA" } +{ "_id" : "95717", "city" : "GOLD RUN", "loc" : [ -120.856909, 39.175102 ], "pop" : 79, "state" : "CA" } +{ "_id" : "95720", "city" : "KYBURZ", "loc" : [ -120.25529, 38.780036 ], "pop" : 159, "state" : "CA" } +{ "_id" : "95721", "city" : "ECHO LAKE", "loc" : [ -120.070498, 38.810254 ], "pop" : 17, "state" : "CA" } +{ "_id" : "95722", "city" : "MEADOW VISTA", "loc" : [ -121.029155, 39.003101 ], "pop" : 3314, "state" : "CA" } +{ "_id" : "95724", "city" : "NORDEN", "loc" : [ -120.400876, 39.319566 ], "pop" : 316, "state" : "CA" } +{ "_id" : "95726", "city" : "PACIFIC HOUSE", "loc" : [ -120.585114, 38.745581 ], "pop" : 7722, "state" : "CA" } +{ "_id" : "95728", "city" : "SODA SPRINGS", "loc" : [ -120.465493, 39.338467 ], "pop" : 96, "state" : "CA" } +{ "_id" : "95735", "city" : "TWIN BRIDGES", "loc" : [ -120.128851, 38.808615 ], "pop" : 0, "state" : "CA" } +{ "_id" : "95742", "city" : "RANCHO CORDOVA", "loc" : [ -121.204019, 38.604313 ], "pop" : 186, "state" : "CA" } +{ "_id" : "95758", "city" : "ELK GROVE", "loc" : [ -121.430706, 38.404238 ], "pop" : 13455, "state" : "CA" } +{ "_id" : "95814", "city" : "SACRAMENTO", "loc" : [ -121.489404, 38.579792 ], "pop" : 16414, "state" : "CA" } +{ "_id" : "95815", "city" : "SACRAMENTO", "loc" : [ -121.443543, 38.613303 ], "pop" : 23491, "state" : "CA" } +{ "_id" : "95816", "city" : "SACRAMENTO", "loc" : [ -121.46753, 38.572788 ], "pop" : 16211, "state" : "CA" } +{ "_id" : "95817", "city" : "SACRAMENTO", "loc" : [ -121.458324, 38.549785 ], "pop" : 15767, "state" : "CA" } +{ "_id" : "95818", "city" : "SACRAMENTO", "loc" : [ -121.492884, 38.556778 ], "pop" : 22214, "state" : "CA" } +{ "_id" : "95819", "city" : "SACRAMENTO", "loc" : [ -121.436634, 38.568293 ], "pop" : 18333, "state" : "CA" } +{ "_id" : "95820", "city" : "SACRAMENTO", "loc" : [ -121.445139, 38.534694 ], "pop" : 35354, "state" : "CA" } +{ "_id" : "95821", "city" : "SACRAMENTO", "loc" : [ -121.383807, 38.623889 ], "pop" : 33040, "state" : "CA" } +{ "_id" : "95822", "city" : "SACRAMENTO", "loc" : [ -121.493541, 38.509139 ], "pop" : 43943, "state" : "CA" } +{ "_id" : "95823", "city" : "SACRAMENTO", "loc" : [ -121.443846, 38.479711 ], "pop" : 55103, "state" : "CA" } +{ "_id" : "95824", "city" : "SACRAMENTO", "loc" : [ -121.441883, 38.517843 ], "pop" : 26507, "state" : "CA" } +{ "_id" : "95825", "city" : "SACRAMENTO", "loc" : [ -121.405677, 38.589226 ], "pop" : 27116, "state" : "CA" } +{ "_id" : "95826", "city" : "SACRAMENTO", "loc" : [ -121.369265, 38.553868 ], "pop" : 38107, "state" : "CA" } +{ "_id" : "95827", "city" : "SACRAMENTO", "loc" : [ -121.328593, 38.56623 ], "pop" : 19471, "state" : "CA" } +{ "_id" : "95828", "city" : "SACRAMENTO", "loc" : [ -121.401504, 38.483718 ], "pop" : 43489, "state" : "CA" } +{ "_id" : "95829", "city" : "SACRAMENTO", "loc" : [ -121.346631, 38.472564 ], "pop" : 4610, "state" : "CA" } +{ "_id" : "95830", "city" : "SACRAMENTO", "loc" : [ -121.281453, 38.476556 ], "pop" : 420, "state" : "CA" } +{ "_id" : "95831", "city" : "SACRAMENTO", "loc" : [ -121.529661, 38.496226 ], "pop" : 39369, "state" : "CA" } +{ "_id" : "95832", "city" : "SACRAMENTO", "loc" : [ -121.482967, 38.475387 ], "pop" : 7724, "state" : "CA" } +{ "_id" : "95833", "city" : "SACRAMENTO", "loc" : [ -121.494487, 38.616993 ], "pop" : 29150, "state" : "CA" } +{ "_id" : "95834", "city" : "SACRAMENTO", "loc" : [ -121.492052, 38.633418 ], "pop" : 6375, "state" : "CA" } +{ "_id" : "95835", "city" : "SACRAMENTO", "loc" : [ -121.483444, 38.662595 ], "pop" : 373, "state" : "CA" } +{ "_id" : "95836", "city" : "SACRAMENTO", "loc" : [ -121.532259, 38.707346 ], "pop" : 8, "state" : "CA" } +{ "_id" : "95837", "city" : "SACRAMENTO", "loc" : [ -121.60297, 38.681726 ], "pop" : 259, "state" : "CA" } +{ "_id" : "95838", "city" : "SACRAMENTO", "loc" : [ -121.44396, 38.640566 ], "pop" : 26996, "state" : "CA" } +{ "_id" : "95841", "city" : "SACRAMENTO", "loc" : [ -121.340608, 38.662699 ], "pop" : 21161, "state" : "CA" } +{ "_id" : "95842", "city" : "SACRAMENTO", "loc" : [ -121.35046, 38.687385 ], "pop" : 32169, "state" : "CA" } +{ "_id" : "95864", "city" : "SACRAMENTO", "loc" : [ -121.376889, 38.587768 ], "pop" : 25105, "state" : "CA" } +{ "_id" : "95901", "city" : "MARYSVILLE", "loc" : [ -121.522467, 39.141653 ], "pop" : 43785, "state" : "CA" } +{ "_id" : "95910", "city" : "ALLEGHANY", "loc" : [ -120.727176, 39.512698 ], "pop" : 0, "state" : "CA" } +{ "_id" : "95912", "city" : "ARBUCKLE", "loc" : [ -122.027405, 39.013787 ], "pop" : 3851, "state" : "CA" } +{ "_id" : "95914", "city" : "BANGOR", "loc" : [ -121.350499, 39.424862 ], "pop" : 110, "state" : "CA" } +{ "_id" : "95915", "city" : "BELDEN", "loc" : [ -121.325924, 39.921746 ], "pop" : 32, "state" : "CA" } +{ "_id" : "95916", "city" : "BERRY CREEK", "loc" : [ -121.385467, 39.638394 ], "pop" : 1285, "state" : "CA" } +{ "_id" : "95917", "city" : "BIGGS", "loc" : [ -121.695873, 39.414918 ], "pop" : 2784, "state" : "CA" } +{ "_id" : "95918", "city" : "BROWNS VALLEY", "loc" : [ -121.346482, 39.284428 ], "pop" : 1297, "state" : "CA" } +{ "_id" : "95919", "city" : "BROWNSVILLE", "loc" : [ -121.261179, 39.452534 ], "pop" : 1013, "state" : "CA" } +{ "_id" : "95920", "city" : "BUTTE CITY", "loc" : [ -121.978046, 39.456348 ], "pop" : 548, "state" : "CA" } +{ "_id" : "95922", "city" : "CAMPTONVILLE", "loc" : [ -121.023066, 39.450784 ], "pop" : 1090, "state" : "CA" } +{ "_id" : "95923", "city" : "CANYONDAM", "loc" : [ -121.156324, 40.207958 ], "pop" : 39, "state" : "CA" } +{ "_id" : "95926", "city" : "COHASSET", "loc" : [ -121.851806, 39.756466 ], "pop" : 55269, "state" : "CA" } +{ "_id" : "95928", "city" : "CHICO", "loc" : [ -121.81555, 39.729523 ], "pop" : 27452, "state" : "CA" } +{ "_id" : "95932", "city" : "COLUSA", "loc" : [ -122.011563, 39.21311 ], "pop" : 7042, "state" : "CA" } +{ "_id" : "95934", "city" : "CRESCENT MILLS", "loc" : [ -120.881993, 40.081915 ], "pop" : 189, "state" : "CA" } +{ "_id" : "95935", "city" : "DOBBINS", "loc" : [ -121.234386, 39.371469 ], "pop" : 1502, "state" : "CA" } +{ "_id" : "95936", "city" : "DOWNIEVILLE", "loc" : [ -120.677767, 39.570265 ], "pop" : 46, "state" : "CA" } +{ "_id" : "95937", "city" : "DUNNIGAN", "loc" : [ -121.996577, 38.893671 ], "pop" : 850, "state" : "CA" } +{ "_id" : "95938", "city" : "DURHAM", "loc" : [ -121.791983, 39.641599 ], "pop" : 3327, "state" : "CA" } +{ "_id" : "95939", "city" : "ELK CREEK", "loc" : [ -122.557244, 39.598914 ], "pop" : 497, "state" : "CA" } +{ "_id" : "95941", "city" : "FORBESTOWN", "loc" : [ -121.213443, 39.541712 ], "pop" : 517, "state" : "CA" } +{ "_id" : "95942", "city" : "BUTTE MEADOWS", "loc" : [ -121.500205, 40.129931 ], "pop" : 91, "state" : "CA" } +{ "_id" : "95943", "city" : "GLENN", "loc" : [ -122.038443, 39.606871 ], "pop" : 1090, "state" : "CA" } +{ "_id" : "95944", "city" : "GOODYEARS BAR", "loc" : [ -120.820698, 39.572891 ], "pop" : 377, "state" : "CA" } +{ "_id" : "95945", "city" : "GRASS VALLEY", "loc" : [ -121.037401, 39.207617 ], "pop" : 21263, "state" : "CA" } +{ "_id" : "95946", "city" : "PENN VALLEY", "loc" : [ -121.193519, 39.218778 ], "pop" : 7603, "state" : "CA" } +{ "_id" : "95947", "city" : "GREENVILLE", "loc" : [ -120.927299, 40.142404 ], "pop" : 2690, "state" : "CA" } +{ "_id" : "95948", "city" : "GRIDLEY", "loc" : [ -121.689777, 39.358855 ], "pop" : 9499, "state" : "CA" } +{ "_id" : "95949", "city" : "GRASS VALLEY", "loc" : [ -121.069357, 39.1029 ], "pop" : 20973, "state" : "CA" } +{ "_id" : "95953", "city" : "LIVE OAK", "loc" : [ -121.66393, 39.266904 ], "pop" : 6800, "state" : "CA" } +{ "_id" : "95954", "city" : "MAGALIA", "loc" : [ -121.597455, 39.831728 ], "pop" : 10009, "state" : "CA" } +{ "_id" : "95955", "city" : "MAXWELL", "loc" : [ -122.195161, 39.292494 ], "pop" : 1410, "state" : "CA" } +{ "_id" : "95956", "city" : "MEADOW VALLEY", "loc" : [ -121.05629, 39.918488 ], "pop" : 91, "state" : "CA" } +{ "_id" : "95957", "city" : "MERIDIAN", "loc" : [ -121.88138, 39.116812 ], "pop" : 907, "state" : "CA" } +{ "_id" : "95959", "city" : "NEVADA CITY", "loc" : [ -121.019634, 39.275395 ], "pop" : 16670, "state" : "CA" } +{ "_id" : "95960", "city" : "NORTH SAN JUAN", "loc" : [ -121.13498, 39.354037 ], "pop" : 228, "state" : "CA" } +{ "_id" : "95961", "city" : "OLIVEHURST", "loc" : [ -121.550059, 39.089483 ], "pop" : 6418, "state" : "CA" } +{ "_id" : "95962", "city" : "OREGON HOUSE", "loc" : [ -121.209229, 39.314388 ], "pop" : 0, "state" : "CA" } +{ "_id" : "95963", "city" : "ORLAND", "loc" : [ -122.157885, 39.744578 ], "pop" : 14720, "state" : "CA" } +{ "_id" : "95965", "city" : "PULGA", "loc" : [ -121.578396, 39.532967 ], "pop" : 16712, "state" : "CA" } +{ "_id" : "95966", "city" : "OROVILLE", "loc" : [ -121.502029, 39.491448 ], "pop" : 27286, "state" : "CA" } +{ "_id" : "95968", "city" : "PALERMO", "loc" : [ -121.545389, 39.436148 ], "pop" : 1843, "state" : "CA" } +{ "_id" : "95969", "city" : "PARADISE", "loc" : [ -121.603097, 39.759804 ], "pop" : 26327, "state" : "CA" } +{ "_id" : "95970", "city" : "PRINCETON", "loc" : [ -122.030181, 39.428313 ], "pop" : 563, "state" : "CA" } +{ "_id" : "95971", "city" : "QUINCY", "loc" : [ -120.928493, 39.940504 ], "pop" : 6303, "state" : "CA" } +{ "_id" : "95972", "city" : "RACKERBY", "loc" : [ -121.336192, 39.4059 ], "pop" : 260, "state" : "CA" } +{ "_id" : "95975", "city" : "ROUGH AND READY", "loc" : [ -121.150856, 39.228585 ], "pop" : 1811, "state" : "CA" } +{ "_id" : "95977", "city" : "SMARTVILLE", "loc" : [ -121.266716, 39.204305 ], "pop" : 807, "state" : "CA" } +{ "_id" : "95979", "city" : "STONYFORD", "loc" : [ -122.517811, 39.333652 ], "pop" : 683, "state" : "CA" } +{ "_id" : "95981", "city" : "LA PORTE", "loc" : [ -121.074566, 39.604136 ], "pop" : 242, "state" : "CA" } +{ "_id" : "95982", "city" : "SUTTER", "loc" : [ -121.756527, 39.168114 ], "pop" : 3090, "state" : "CA" } +{ "_id" : "95983", "city" : "TAYLORSVILLE", "loc" : [ -120.801797, 40.064911 ], "pop" : 177, "state" : "CA" } +{ "_id" : "95984", "city" : "TWAIN", "loc" : [ -121.150729, 40.002769 ], "pop" : 211, "state" : "CA" } +{ "_id" : "95987", "city" : "WILLIAMS", "loc" : [ -122.162375, 39.148855 ], "pop" : 3094, "state" : "CA" } +{ "_id" : "95988", "city" : "WILLOWS", "loc" : [ -122.199204, 39.523751 ], "pop" : 8034, "state" : "CA" } +{ "_id" : "95991", "city" : "YUBA CITY", "loc" : [ -121.621599, 39.128619 ], "pop" : 30201, "state" : "CA" } +{ "_id" : "95993", "city" : "YUBA CITY", "loc" : [ -121.655168, 39.128193 ], "pop" : 19635, "state" : "CA" } +{ "_id" : "96001", "city" : "REDDING", "loc" : [ -122.411627, 40.560493 ], "pop" : 30690, "state" : "CA" } +{ "_id" : "96002", "city" : "REDDING", "loc" : [ -122.333932, 40.548586 ], "pop" : 29008, "state" : "CA" } +{ "_id" : "96003", "city" : "REDDING", "loc" : [ -122.352962, 40.627751 ], "pop" : 30889, "state" : "CA" } +{ "_id" : "96006", "city" : "ADIN", "loc" : [ -120.943193, 41.21751 ], "pop" : 355, "state" : "CA" } +{ "_id" : "96007", "city" : "ANDERSON", "loc" : [ -122.328218, 40.457432 ], "pop" : 20309, "state" : "CA" } +{ "_id" : "96008", "city" : "BELLA VISTA", "loc" : [ -122.07245, 40.740945 ], "pop" : 1218, "state" : "CA" } +{ "_id" : "96010", "city" : "BIG BAR", "loc" : [ -123.229006, 40.74796 ], "pop" : 344, "state" : "CA" } +{ "_id" : "96013", "city" : "BURNEY", "loc" : [ -121.655036, 40.894927 ], "pop" : 4666, "state" : "CA" } +{ "_id" : "96014", "city" : "CALLAHAN", "loc" : [ -122.764046, 41.383257 ], "pop" : 196, "state" : "CA" } +{ "_id" : "96015", "city" : "CANBY", "loc" : [ -120.921769, 41.466358 ], "pop" : 424, "state" : "CA" } +{ "_id" : "96016", "city" : "CASSEL", "loc" : [ -121.524497, 40.907832 ], "pop" : 566, "state" : "CA" } +{ "_id" : "96019", "city" : "SHASTA LAKE", "loc" : [ -122.365395, 40.680262 ], "pop" : 6405, "state" : "CA" } +{ "_id" : "96020", "city" : "CHESTER", "loc" : [ -121.227338, 40.297457 ], "pop" : 2361, "state" : "CA" } +{ "_id" : "96021", "city" : "CORNING", "loc" : [ -122.195991, 39.929566 ], "pop" : 12436, "state" : "CA" } +{ "_id" : "96022", "city" : "COTTONWOOD", "loc" : [ -122.337463, 40.369072 ], "pop" : 9579, "state" : "CA" } +{ "_id" : "96024", "city" : "DOUGLAS CITY", "loc" : [ -122.923867, 40.634151 ], "pop" : 727, "state" : "CA" } +{ "_id" : "96025", "city" : "DUNSMUIR", "loc" : [ -122.273397, 41.212439 ], "pop" : 2683, "state" : "CA" } +{ "_id" : "96027", "city" : "SAWYERS BAR", "loc" : [ -122.914189, 41.468303 ], "pop" : 2326, "state" : "CA" } +{ "_id" : "96028", "city" : "FALL RIVER MILLS", "loc" : [ -121.460562, 41.03931 ], "pop" : 1843, "state" : "CA" } +{ "_id" : "96031", "city" : "FORKS OF SALMON", "loc" : [ -123.09781, 41.256978 ], "pop" : 469, "state" : "CA" } +{ "_id" : "96032", "city" : "FORT JONES", "loc" : [ -122.883207, 41.617027 ], "pop" : 2363, "state" : "CA" } +{ "_id" : "96033", "city" : "FRENCH GULCH", "loc" : [ -122.622868, 40.703517 ], "pop" : 640, "state" : "CA" } +{ "_id" : "96034", "city" : "GAZELLE", "loc" : [ -122.537122, 41.510485 ], "pop" : 162, "state" : "CA" } +{ "_id" : "96035", "city" : "GERBER", "loc" : [ -122.164937, 40.042997 ], "pop" : 3337, "state" : "CA" } +{ "_id" : "96038", "city" : "GRENADA", "loc" : [ -122.525829, 41.612512 ], "pop" : 703, "state" : "CA" } +{ "_id" : "96039", "city" : "HAPPY CAMP", "loc" : [ -123.388045, 41.801802 ], "pop" : 1885, "state" : "CA" } +{ "_id" : "96040", "city" : "HAT CREEK", "loc" : [ -121.463687, 40.767673 ], "pop" : 150, "state" : "CA" } +{ "_id" : "96041", "city" : "HAYFORK", "loc" : [ -123.163416, 40.550431 ], "pop" : 2671, "state" : "CA" } +{ "_id" : "96044", "city" : "HORNBROOK", "loc" : [ -122.526528, 41.907738 ], "pop" : 905, "state" : "CA" } +{ "_id" : "96045", "city" : "HORSE CREEK", "loc" : [ -123.013919, 41.833732 ], "pop" : 379, "state" : "CA" } +{ "_id" : "96047", "city" : "IGO", "loc" : [ -122.654023, 40.431795 ], "pop" : 205, "state" : "CA" } +{ "_id" : "96048", "city" : "HELENA", "loc" : [ -123.062671, 40.768187 ], "pop" : 606, "state" : "CA" } +{ "_id" : "96050", "city" : "KLAMATH RIVER", "loc" : [ -122.819693, 41.863699 ], "pop" : 174, "state" : "CA" } +{ "_id" : "96051", "city" : "LAKEHEAD", "loc" : [ -122.359281, 40.958775 ], "pop" : 1709, "state" : "CA" } +{ "_id" : "96052", "city" : "LEWISTON", "loc" : [ -122.842591, 40.745986 ], "pop" : 2461, "state" : "CA" } +{ "_id" : "96055", "city" : "LOS MOLINOS", "loc" : [ -122.099175, 40.049735 ], "pop" : 3363, "state" : "CA" } +{ "_id" : "96056", "city" : "MCARTHUR", "loc" : [ -121.214896, 41.111407 ], "pop" : 2797, "state" : "CA" } +{ "_id" : "96057", "city" : "MCCLOUD", "loc" : [ -122.13562, 41.252108 ], "pop" : 1743, "state" : "CA" } +{ "_id" : "96058", "city" : "MACDOEL", "loc" : [ -121.944472, 41.883028 ], "pop" : 1945, "state" : "CA" } +{ "_id" : "96059", "city" : "MANTON", "loc" : [ -121.836521, 40.433125 ], "pop" : 344, "state" : "CA" } +{ "_id" : "96062", "city" : "MILLVILLE", "loc" : [ -122.111088, 40.565316 ], "pop" : 1281, "state" : "CA" } +{ "_id" : "96063", "city" : "MINERAL", "loc" : [ -121.524807, 40.328826 ], "pop" : 172, "state" : "CA" } +{ "_id" : "96064", "city" : "MONTAGUE", "loc" : [ -122.463799, 41.724294 ], "pop" : 4246, "state" : "CA" } +{ "_id" : "96065", "city" : "MONTGOMERY CREEK", "loc" : [ -121.923313, 40.912378 ], "pop" : 823, "state" : "CA" } +{ "_id" : "96067", "city" : "MOUNT SHASTA", "loc" : [ -122.324017, 41.317435 ], "pop" : 6719, "state" : "CA" } +{ "_id" : "96069", "city" : "OAK RUN", "loc" : [ -122.040932, 40.68631 ], "pop" : 1160, "state" : "CA" } +{ "_id" : "96071", "city" : "OLD STATION", "loc" : [ -121.458476, 40.62557 ], "pop" : 213, "state" : "CA" } +{ "_id" : "96073", "city" : "PALO CEDRO", "loc" : [ -122.239805, 40.576661 ], "pop" : 3905, "state" : "CA" } +{ "_id" : "96075", "city" : "PAYNES CREEK", "loc" : [ -121.764952, 40.351415 ], "pop" : 773, "state" : "CA" } +{ "_id" : "96076", "city" : "WILDWOOD", "loc" : [ -122.918013, 40.316528 ], "pop" : 119, "state" : "CA" } +{ "_id" : "96080", "city" : "RED BLUFF", "loc" : [ -122.238281, 40.179535 ], "pop" : 25180, "state" : "CA" } +{ "_id" : "96085", "city" : "SCOTT BAR", "loc" : [ -122.988183, 41.77364 ], "pop" : 21, "state" : "CA" } +{ "_id" : "96086", "city" : "SEIAD VALLEY", "loc" : [ -123.243762, 41.886589 ], "pop" : 311, "state" : "CA" } +{ "_id" : "96087", "city" : "SHASTA", "loc" : [ -122.49685, 40.610896 ], "pop" : 294, "state" : "CA" } +{ "_id" : "96088", "city" : "SHINGLETOWN", "loc" : [ -121.885668, 40.504959 ], "pop" : 3681, "state" : "CA" } +{ "_id" : "96091", "city" : "TRINITY CENTER", "loc" : [ -122.723919, 41.061548 ], "pop" : 362, "state" : "CA" } +{ "_id" : "96093", "city" : "WEAVERVILLE", "loc" : [ -122.935303, 40.731701 ], "pop" : 3188, "state" : "CA" } +{ "_id" : "96094", "city" : "EDGEWOOD", "loc" : [ -122.384803, 41.439466 ], "pop" : 5506, "state" : "CA" } +{ "_id" : "96096", "city" : "WHITMORE", "loc" : [ -121.877076, 40.65255 ], "pop" : 593, "state" : "CA" } +{ "_id" : "96097", "city" : "YREKA", "loc" : [ -122.637604, 41.720558 ], "pop" : 9151, "state" : "CA" } +{ "_id" : "96101", "city" : "ALTURAS", "loc" : [ -120.545584, 41.476742 ], "pop" : 5566, "state" : "CA" } +{ "_id" : "96103", "city" : "CROMBERG", "loc" : [ -120.627397, 39.784745 ], "pop" : 1774, "state" : "CA" } +{ "_id" : "96104", "city" : "CEDARVILLE", "loc" : [ -120.151551, 41.475871 ], "pop" : 991, "state" : "CA" } +{ "_id" : "96105", "city" : "CHILCOOT", "loc" : [ -120.175212, 39.805683 ], "pop" : 470, "state" : "CA" } +{ "_id" : "96106", "city" : "CLIO", "loc" : [ -120.560458, 39.74326 ], "pop" : 84, "state" : "CA" } +{ "_id" : "96107", "city" : "COLEVILLE", "loc" : [ -119.482784, 38.502903 ], "pop" : 1370, "state" : "CA" } +{ "_id" : "96108", "city" : "DAVIS CREEK", "loc" : [ -120.323549, 41.862555 ], "pop" : 285, "state" : "CA" } +{ "_id" : "96109", "city" : "DOYLE", "loc" : [ -120.107693, 40.000799 ], "pop" : 985, "state" : "CA" } +{ "_id" : "96111", "city" : "FLORISTON", "loc" : [ -120.025421, 39.445746 ], "pop" : 169, "state" : "CA" } +{ "_id" : "96112", "city" : "FORT BIDWELL", "loc" : [ -120.161983, 41.864441 ], "pop" : 226, "state" : "CA" } +{ "_id" : "96113", "city" : "HERLONG", "loc" : [ -120.171271, 40.148492 ], "pop" : 1518, "state" : "CA" } +{ "_id" : "96114", "city" : "JANESVILLE", "loc" : [ -120.50982, 40.296325 ], "pop" : 2655, "state" : "CA" } +{ "_id" : "96115", "city" : "LAKE CITY", "loc" : [ -120.181424, 41.668208 ], "pop" : 234, "state" : "CA" } +{ "_id" : "96117", "city" : "LITCHFIELD", "loc" : [ -120.253975, 40.362788 ], "pop" : 23, "state" : "CA" } +{ "_id" : "96118", "city" : "LOYALTON", "loc" : [ -120.229662, 39.662974 ], "pop" : 1500, "state" : "CA" } +{ "_id" : "96120", "city" : "HOPE VALLEY", "loc" : [ -119.807275, 38.76473 ], "pop" : 850, "state" : "CA" } +{ "_id" : "96121", "city" : "MILFORD", "loc" : [ -120.389508, 40.182763 ], "pop" : 376, "state" : "CA" } +{ "_id" : "96122", "city" : "PORTOLA", "loc" : [ -120.466858, 39.810883 ], "pop" : 3685, "state" : "CA" } +{ "_id" : "96123", "city" : "RAVENDALE", "loc" : [ -120.16001, 40.831705 ], "pop" : 89, "state" : "CA" } +{ "_id" : "96124", "city" : "CALPINE", "loc" : [ -120.4442, 39.651699 ], "pop" : 286, "state" : "CA" } +{ "_id" : "96125", "city" : "SIERRA CITY", "loc" : [ -120.624135, 39.559248 ], "pop" : 311, "state" : "CA" } +{ "_id" : "96126", "city" : "SIERRAVILLE", "loc" : [ -120.347789, 39.594294 ], "pop" : 355, "state" : "CA" } +{ "_id" : "96128", "city" : "STANDISH", "loc" : [ -120.406847, 40.350863 ], "pop" : 340, "state" : "CA" } +{ "_id" : "96130", "city" : "SUSANVILLE", "loc" : [ -120.646442, 40.398282 ], "pop" : 19347, "state" : "CA" } +{ "_id" : "96132", "city" : "TERMO", "loc" : [ -120.517378, 40.946667 ], "pop" : 199, "state" : "CA" } +{ "_id" : "96133", "city" : "TOPAZ", "loc" : [ -119.512164, 38.64151 ], "pop" : 87, "state" : "CA" } +{ "_id" : "96134", "city" : "TULELAKE", "loc" : [ -121.434688, 41.931621 ], "pop" : 2613, "state" : "CA" } +{ "_id" : "96135", "city" : "VINTON", "loc" : [ -120.204994, 39.720719 ], "pop" : 0, "state" : "CA" } +{ "_id" : "96136", "city" : "WENDEL", "loc" : [ -120.352156, 40.346233 ], "pop" : 148, "state" : "CA" } +{ "_id" : "96137", "city" : "PENINSULA VILLAG", "loc" : [ -121.109224, 40.270359 ], "pop" : 1843, "state" : "CA" } +{ "_id" : "96140", "city" : "CARNELIAN BAY", "loc" : [ -120.075328, 39.231937 ], "pop" : 620, "state" : "CA" } +{ "_id" : "96141", "city" : "HOMEWOOD", "loc" : [ -120.179035, 39.078157 ], "pop" : 283, "state" : "CA" } +{ "_id" : "96142", "city" : "TAHOMA", "loc" : [ -120.135747, 39.064406 ], "pop" : 1029, "state" : "CA" } +{ "_id" : "96143", "city" : "KINGS BEACH", "loc" : [ -120.023287, 39.240119 ], "pop" : 3247, "state" : "CA" } +{ "_id" : "96145", "city" : "TAHOE CITY", "loc" : [ -120.144532, 39.180618 ], "pop" : 4944, "state" : "CA" } +{ "_id" : "96148", "city" : "TAHOE VISTA", "loc" : [ -120.052128, 39.24475 ], "pop" : 717, "state" : "CA" } +{ "_id" : "96150", "city" : "SOUTH LAKE TAHOE", "loc" : [ -119.986469, 38.916976 ], "pop" : 28975, "state" : "CA" } +{ "_id" : "96161", "city" : "TRUCKEE", "loc" : [ -120.172942, 39.338546 ], "pop" : 9544, "state" : "CA" } +{ "_id" : "96162", "city" : "TRUCKEE", "loc" : [ -120.295031, 39.319321 ], "pop" : 199, "state" : "CA" } +{ "_id" : "96701", "city" : "AIEA", "loc" : [ -157.933237, 21.390795 ], "pop" : 43273, "state" : "HI" } +{ "_id" : "96704", "city" : "CAPTAIN COOK", "loc" : [ -155.887463, 19.438604 ], "pop" : 5338, "state" : "HI" } +{ "_id" : "96705", "city" : "ELEELE", "loc" : [ -159.538115, 21.923017 ], "pop" : 6466, "state" : "HI" } +{ "_id" : "96706", "city" : "EWA BEACH", "loc" : [ -158.010307, 21.327418 ], "pop" : 26089, "state" : "HI" } +{ "_id" : "96707", "city" : "KAPOLEI", "loc" : [ -158.087007, 21.345284 ], "pop" : 15891, "state" : "HI" } +{ "_id" : "96708", "city" : "HAIKU", "loc" : [ -156.299983, 20.907097 ], "pop" : 5695, "state" : "HI" } +{ "_id" : "96710", "city" : "HAKALAU", "loc" : [ -155.133335, 19.888217 ], "pop" : 198, "state" : "HI" } +{ "_id" : "96712", "city" : "HALEIWA", "loc" : [ -158.069315, 21.631151 ], "pop" : 7870, "state" : "HI" } +{ "_id" : "96713", "city" : "HANA", "loc" : [ -156.039659, 20.761635 ], "pop" : 1895, "state" : "HI" } +{ "_id" : "96716", "city" : "HANAPEPE", "loc" : [ -159.592022, 21.915644 ], "pop" : 1523, "state" : "HI" } +{ "_id" : "96717", "city" : "HAUULA", "loc" : [ -157.915704, 21.61395 ], "pop" : 3477, "state" : "HI" } +{ "_id" : "96718", "city" : "HAWAII NATIONAL", "loc" : [ -155.284015, 19.431103 ], "pop" : 91, "state" : "HI" } +{ "_id" : "96719", "city" : "HAWI", "loc" : [ -155.838007, 20.238021 ], "pop" : 1741, "state" : "HI" } +{ "_id" : "96720", "city" : "HILO", "loc" : [ -155.093921, 19.702522 ], "pop" : 40158, "state" : "HI" } +{ "_id" : "96722", "city" : "PRINCEVILLE", "loc" : [ -159.462587, 22.215948 ], "pop" : 4631, "state" : "HI" } +{ "_id" : "96725", "city" : "HOLUALOA", "loc" : [ -155.917639, 19.610316 ], "pop" : 2096, "state" : "HI" } +{ "_id" : "96726", "city" : "HONAUNAU", "loc" : [ -155.893356, 19.44845 ], "pop" : 1583, "state" : "HI" } +{ "_id" : "96727", "city" : "HONOKAA", "loc" : [ -155.488026, 20.08266 ], "pop" : 3681, "state" : "HI" } +{ "_id" : "96728", "city" : "HONOMU", "loc" : [ -155.11766, 19.872767 ], "pop" : 548, "state" : "HI" } +{ "_id" : "96729", "city" : "HOOLEHUA", "loc" : [ -157.079138, 21.173025 ], "pop" : 853, "state" : "HI" } +{ "_id" : "96730", "city" : "KAAAWA", "loc" : [ -157.873734, 21.56737 ], "pop" : 2305, "state" : "HI" } +{ "_id" : "96732", "city" : "KAHULUI", "loc" : [ -156.478327, 20.881388 ], "pop" : 17289, "state" : "HI" } +{ "_id" : "96734", "city" : "KAILUA", "loc" : [ -157.744781, 21.406262 ], "pop" : 53403, "state" : "HI" } +{ "_id" : "96740", "city" : "KAILUA KONA", "loc" : [ -155.979809, 19.653053 ], "pop" : 19616, "state" : "HI" } +{ "_id" : "96742", "city" : "KALAUPAPA", "loc" : [ -156.983453, 21.19289 ], "pop" : 130, "state" : "HI" } +{ "_id" : "96743", "city" : "KAMUELA", "loc" : [ -155.705189, 20.008128 ], "pop" : 9140, "state" : "HI" } +{ "_id" : "96744", "city" : "KANEOHE", "loc" : [ -157.811543, 21.422819 ], "pop" : 55236, "state" : "HI" } +{ "_id" : "96746", "city" : "KAPAA", "loc" : [ -159.344842, 22.086798 ], "pop" : 15627, "state" : "HI" } +{ "_id" : "96747", "city" : "KAUMAKANI", "loc" : [ -159.62413, 21.921329 ], "pop" : 819, "state" : "HI" } +{ "_id" : "96748", "city" : "KAUNAKAKAI", "loc" : [ -156.969015, 21.090504 ], "pop" : 4419, "state" : "HI" } +{ "_id" : "96749", "city" : "KEAAU", "loc" : [ -154.992644, 19.589277 ], "pop" : 4297, "state" : "HI" } +{ "_id" : "96750", "city" : "KEALAKEKUA", "loc" : [ -155.930025, 19.526149 ], "pop" : 1309, "state" : "HI" } +{ "_id" : "96752", "city" : "KEKAHA", "loc" : [ -159.71988, 21.973509 ], "pop" : 3785, "state" : "HI" } +{ "_id" : "96753", "city" : "KIHEI", "loc" : [ -156.447543, 20.744124 ], "pop" : 14759, "state" : "HI" } +{ "_id" : "96755", "city" : "KAPAAU", "loc" : [ -155.798981, 20.218323 ], "pop" : 2550, "state" : "HI" } +{ "_id" : "96756", "city" : "KOLOA", "loc" : [ -159.474927, 21.908293 ], "pop" : 4906, "state" : "HI" } +{ "_id" : "96757", "city" : "KUALAPUU", "loc" : [ -157.027669, 21.160097 ], "pop" : 818, "state" : "HI" } +{ "_id" : "96760", "city" : "KURTISTOWN", "loc" : [ -155.020659, 19.570637 ], "pop" : 3975, "state" : "HI" } +{ "_id" : "96761", "city" : "LAHAINA", "loc" : [ -156.677162, 20.917432 ], "pop" : 14508, "state" : "HI" } +{ "_id" : "96762", "city" : "LAIE", "loc" : [ -157.939377, 21.659513 ], "pop" : 8481, "state" : "HI" } +{ "_id" : "96763", "city" : "LANAI CITY", "loc" : [ -156.921027, 20.829323 ], "pop" : 2426, "state" : "HI" } +{ "_id" : "96764", "city" : "LAUPAHOEHOE", "loc" : [ -155.232263, 19.980194 ], "pop" : 1015, "state" : "HI" } +{ "_id" : "96766", "city" : "LIHUE", "loc" : [ -159.368258, 21.981618 ], "pop" : 10663, "state" : "HI" } +{ "_id" : "96768", "city" : "MAKAWAO", "loc" : [ -156.332735, 20.846932 ], "pop" : 13389, "state" : "HI" } +{ "_id" : "96769", "city" : "MAKAWELI", "loc" : [ -159.790721, 21.927639 ], "pop" : 797, "state" : "HI" } +{ "_id" : "96770", "city" : "MAUNALOA", "loc" : [ -157.219277, 21.142202 ], "pop" : 497, "state" : "HI" } +{ "_id" : "96771", "city" : "MOUNTAIN VIEW", "loc" : [ -155.086436, 19.550587 ], "pop" : 3170, "state" : "HI" } +{ "_id" : "96772", "city" : "NAALEHU", "loc" : [ -155.657474, 19.066844 ], "pop" : 2729, "state" : "HI" } +{ "_id" : "96773", "city" : "NINOLE", "loc" : [ -155.159923, 19.904436 ], "pop" : 0, "state" : "HI" } +{ "_id" : "96774", "city" : "OOKALA", "loc" : [ -155.274666, 20.011887 ], "pop" : 315, "state" : "HI" } +{ "_id" : "96775", "city" : "PAAUHAU", "loc" : [ -155.449088, 20.027748 ], "pop" : 917, "state" : "HI" } +{ "_id" : "96776", "city" : "PAAUILO", "loc" : [ -155.369728, 20.027119 ], "pop" : 947, "state" : "HI" } +{ "_id" : "96777", "city" : "PAHALA", "loc" : [ -155.481506, 19.207898 ], "pop" : 1616, "state" : "HI" } +{ "_id" : "96778", "city" : "PAHOA", "loc" : [ -154.923135, 19.508901 ], "pop" : 6702, "state" : "HI" } +{ "_id" : "96779", "city" : "PAIA", "loc" : [ -156.38017, 20.91539 ], "pop" : 2311, "state" : "HI" } +{ "_id" : "96780", "city" : "PAPAALOA", "loc" : [ -155.218402, 19.904835 ], "pop" : 208, "state" : "HI" } +{ "_id" : "96781", "city" : "PAPAIKOU", "loc" : [ -155.098442, 19.791643 ], "pop" : 1700, "state" : "HI" } +{ "_id" : "96782", "city" : "PEARL CITY", "loc" : [ -157.965164, 21.408393 ], "pop" : 38207, "state" : "HI" } +{ "_id" : "96783", "city" : "PEPEEKEO", "loc" : [ -155.112994, 19.835283 ], "pop" : 2038, "state" : "HI" } +{ "_id" : "96785", "city" : "VOLCANO", "loc" : [ -155.19743, 19.480066 ], "pop" : 2639, "state" : "HI" } +{ "_id" : "96786", "city" : "WAHIAWA", "loc" : [ -158.043527, 21.500596 ], "pop" : 43663, "state" : "HI" } +{ "_id" : "96789", "city" : "MILILANI", "loc" : [ -158.017379, 21.45311 ], "pop" : 34734, "state" : "HI" } +{ "_id" : "96790", "city" : "KULA", "loc" : [ -156.326026, 20.753353 ], "pop" : 5697, "state" : "HI" } +{ "_id" : "96791", "city" : "WAIALUA", "loc" : [ -158.126673, 21.576623 ], "pop" : 7975, "state" : "HI" } +{ "_id" : "96792", "city" : "WAIANAE", "loc" : [ -158.178071, 21.435192 ], "pop" : 37518, "state" : "HI" } +{ "_id" : "96793", "city" : "WAILUKU", "loc" : [ -156.503612, 20.896586 ], "pop" : 15818, "state" : "HI" } +{ "_id" : "96795", "city" : "WAIMANALO", "loc" : [ -157.713094, 21.341786 ], "pop" : 9055, "state" : "HI" } +{ "_id" : "96796", "city" : "WAIMEA", "loc" : [ -159.669429, 21.968487 ], "pop" : 1960, "state" : "HI" } +{ "_id" : "96797", "city" : "WAIPAHU", "loc" : [ -158.012418, 21.398203 ], "pop" : 52411, "state" : "HI" } +{ "_id" : "96813", "city" : "HONOLULU", "loc" : [ -157.852072, 21.317905 ], "pop" : 23082, "state" : "HI" } +{ "_id" : "96814", "city" : "HONOLULU", "loc" : [ -157.843876, 21.299846 ], "pop" : 14182, "state" : "HI" } +{ "_id" : "96815", "city" : "HONOLULU", "loc" : [ -157.826616, 21.281084 ], "pop" : 28650, "state" : "HI" } +{ "_id" : "96816", "city" : "HONOLULU", "loc" : [ -157.800626, 21.288677 ], "pop" : 49208, "state" : "HI" } +{ "_id" : "96817", "city" : "HONOLULU", "loc" : [ -157.861469, 21.329452 ], "pop" : 48920, "state" : "HI" } +{ "_id" : "96818", "city" : "HONOLULU", "loc" : [ -157.926925, 21.353173 ], "pop" : 62915, "state" : "HI" } +{ "_id" : "96819", "city" : "HONOLULU", "loc" : [ -157.875947, 21.34877 ], "pop" : 50584, "state" : "HI" } +{ "_id" : "96821", "city" : "HONOLULU", "loc" : [ -157.755242, 21.292811 ], "pop" : 18366, "state" : "HI" } +{ "_id" : "96822", "city" : "HONOLULU", "loc" : [ -157.829819, 21.311704 ], "pop" : 39632, "state" : "HI" } +{ "_id" : "96825", "city" : "HONOLULU", "loc" : [ -157.698523, 21.298684 ], "pop" : 27432, "state" : "HI" } +{ "_id" : "96826", "city" : "HONOLULU", "loc" : [ -157.828388, 21.294139 ], "pop" : 33672, "state" : "HI" } +{ "_id" : "97001", "city" : "ANTELOPE", "loc" : [ -120.791384, 44.889196 ], "pop" : 129, "state" : "OR" } +{ "_id" : "97002", "city" : "AURORA", "loc" : [ -122.803881, 45.228432 ], "pop" : 4638, "state" : "OR" } +{ "_id" : "97004", "city" : "BEAVERCREEK", "loc" : [ -122.475122, 45.259723 ], "pop" : 4253, "state" : "OR" } +{ "_id" : "97005", "city" : "BEAVERTON", "loc" : [ -122.805395, 45.475035 ], "pop" : 46660, "state" : "OR" } +{ "_id" : "97006", "city" : "ALOHA", "loc" : [ -122.859209, 45.517675 ], "pop" : 31650, "state" : "OR" } +{ "_id" : "97007", "city" : "ALOHA", "loc" : [ -122.859473, 45.472985 ], "pop" : 35583, "state" : "OR" } +{ "_id" : "97009", "city" : "BORING", "loc" : [ -122.380713, 45.429704 ], "pop" : 11406, "state" : "OR" } +{ "_id" : "97010", "city" : "BRIDAL VEIL", "loc" : [ -122.176587, 45.557904 ], "pop" : 8, "state" : "OR" } +{ "_id" : "97011", "city" : "BRIGHTWOOD", "loc" : [ -122.003621, 45.365218 ], "pop" : 788, "state" : "OR" } +{ "_id" : "97013", "city" : "CANBY", "loc" : [ -122.68322, 45.251425 ], "pop" : 15801, "state" : "OR" } +{ "_id" : "97014", "city" : "BONNEVILLE", "loc" : [ -121.882411, 45.671447 ], "pop" : 951, "state" : "OR" } +{ "_id" : "97015", "city" : "CLACKAMAS", "loc" : [ -122.52005, 45.414992 ], "pop" : 12352, "state" : "OR" } +{ "_id" : "97016", "city" : "WESTPORT", "loc" : [ -123.2124, 46.09978 ], "pop" : 6361, "state" : "OR" } +{ "_id" : "97017", "city" : "COLTON", "loc" : [ -122.424753, 45.157291 ], "pop" : 4223, "state" : "OR" } +{ "_id" : "97018", "city" : "COLUMBIA CITY", "loc" : [ -122.812174, 45.892474 ], "pop" : 1003, "state" : "OR" } +{ "_id" : "97019", "city" : "CORBETT", "loc" : [ -122.241746, 45.522116 ], "pop" : 2355, "state" : "OR" } +{ "_id" : "97021", "city" : "FRIEND", "loc" : [ -121.146797, 45.429099 ], "pop" : 1111, "state" : "OR" } +{ "_id" : "97022", "city" : "EAGLE CREEK", "loc" : [ -122.338053, 45.358205 ], "pop" : 3285, "state" : "OR" } +{ "_id" : "97023", "city" : "ESTACADA", "loc" : [ -122.325858, 45.287177 ], "pop" : 8703, "state" : "OR" } +{ "_id" : "97026", "city" : "GERVAIS", "loc" : [ -122.896185, 45.108645 ], "pop" : 992, "state" : "OR" } +{ "_id" : "97027", "city" : "GLADSTONE", "loc" : [ -122.590197, 45.389882 ], "pop" : 10148, "state" : "OR" } +{ "_id" : "97028", "city" : "TIMBERLINE LODGE", "loc" : [ -121.785426, 45.318366 ], "pop" : 268, "state" : "OR" } +{ "_id" : "97029", "city" : "GRASS VALLEY", "loc" : [ -120.747795, 45.301333 ], "pop" : 415, "state" : "OR" } +{ "_id" : "97030", "city" : "GRESHAM", "loc" : [ -122.420258, 45.515397 ], "pop" : 35728, "state" : "OR" } +{ "_id" : "97031", "city" : "HOOD RIVER", "loc" : [ -121.539104, 45.671058 ], "pop" : 13718, "state" : "OR" } +{ "_id" : "97032", "city" : "HUBBARD", "loc" : [ -122.754115, 45.160422 ], "pop" : 6393, "state" : "OR" } +{ "_id" : "97033", "city" : "KENT", "loc" : [ -120.664895, 45.083789 ], "pop" : 0, "state" : "OR" } +{ "_id" : "97034", "city" : "LAKE OSWEGO", "loc" : [ -122.684721, 45.409263 ], "pop" : 18063, "state" : "OR" } +{ "_id" : "97035", "city" : "LAKE OSWEGO", "loc" : [ -122.722709, 45.414666 ], "pop" : 19305, "state" : "OR" } +{ "_id" : "97037", "city" : "MAUPIN", "loc" : [ -121.228164, 45.074247 ], "pop" : 1758, "state" : "OR" } +{ "_id" : "97038", "city" : "MOLALLA", "loc" : [ -122.575574, 45.122256 ], "pop" : 7829, "state" : "OR" } +{ "_id" : "97039", "city" : "MORO", "loc" : [ -120.695666, 45.485332 ], "pop" : 550, "state" : "OR" } +{ "_id" : "97040", "city" : "MOSIER", "loc" : [ -121.324532, 45.66167 ], "pop" : 1573, "state" : "OR" } +{ "_id" : "97041", "city" : "MOUNT HOOD PARKD", "loc" : [ -121.588485, 45.521584 ], "pop" : 2236, "state" : "OR" } +{ "_id" : "97042", "city" : "MULINO", "loc" : [ -122.535068, 45.212973 ], "pop" : 2935, "state" : "OR" } +{ "_id" : "97044", "city" : "ODELL", "loc" : [ -121.440131, 45.623245 ], "pop" : 0, "state" : "OR" } +{ "_id" : "97045", "city" : "OREGON CITY", "loc" : [ -122.569991, 45.337718 ], "pop" : 36753, "state" : "OR" } +{ "_id" : "97048", "city" : "RAINIER", "loc" : [ -122.967067, 46.064552 ], "pop" : 6357, "state" : "OR" } +{ "_id" : "97049", "city" : "ZIGZAG", "loc" : [ -121.953691, 45.355201 ], "pop" : 1325, "state" : "OR" } +{ "_id" : "97050", "city" : "RUFUS", "loc" : [ -120.726777, 45.68515 ], "pop" : 389, "state" : "OR" } +{ "_id" : "97051", "city" : "SAINT HELENS", "loc" : [ -122.828177, 45.860825 ], "pop" : 10355, "state" : "OR" } +{ "_id" : "97053", "city" : "WARREN", "loc" : [ -122.863445, 45.826043 ], "pop" : 2378, "state" : "OR" } +{ "_id" : "97054", "city" : "DEER ISLAND", "loc" : [ -122.898458, 45.935553 ], "pop" : 1317, "state" : "OR" } +{ "_id" : "97055", "city" : "SANDY", "loc" : [ -122.223049, 45.378954 ], "pop" : 12936, "state" : "OR" } +{ "_id" : "97056", "city" : "SCAPPOOSE", "loc" : [ -122.892771, 45.765451 ], "pop" : 7812, "state" : "OR" } +{ "_id" : "97057", "city" : "SHANIKO", "loc" : [ -120.806953, 45.047231 ], "pop" : 81, "state" : "OR" } +{ "_id" : "97058", "city" : "THE DALLES", "loc" : [ -121.190493, 45.599504 ], "pop" : 16319, "state" : "OR" } +{ "_id" : "97060", "city" : "TROUTDALE", "loc" : [ -122.373866, 45.525398 ], "pop" : 4849, "state" : "OR" } +{ "_id" : "97062", "city" : "TUALATIN", "loc" : [ -122.763132, 45.372688 ], "pop" : 16371, "state" : "OR" } +{ "_id" : "97063", "city" : "WAMIC", "loc" : [ -121.296517, 45.231789 ], "pop" : 712, "state" : "OR" } +{ "_id" : "97064", "city" : "VERNONIA", "loc" : [ -123.196662, 45.857298 ], "pop" : 2931, "state" : "OR" } +{ "_id" : "97065", "city" : "WASCO", "loc" : [ -120.730356, 45.597447 ], "pop" : 564, "state" : "OR" } +{ "_id" : "97067", "city" : "WELCHES", "loc" : [ -121.959826, 45.339862 ], "pop" : 802, "state" : "OR" } +{ "_id" : "97068", "city" : "WEST LINN", "loc" : [ -122.647952, 45.366874 ], "pop" : 19962, "state" : "OR" } +{ "_id" : "97070", "city" : "WILSONVILLE", "loc" : [ -122.769886, 45.298646 ], "pop" : 9397, "state" : "OR" } +{ "_id" : "97071", "city" : "WOODBURN", "loc" : [ -122.858342, 45.144617 ], "pop" : 17482, "state" : "OR" } +{ "_id" : "97080", "city" : "GRESHAM", "loc" : [ -122.415645, 45.481699 ], "pop" : 25232, "state" : "OR" } +{ "_id" : "97101", "city" : "AMITY", "loc" : [ -123.174402, 45.115704 ], "pop" : 2810, "state" : "OR" } +{ "_id" : "97103", "city" : "ASTORIA", "loc" : [ -123.79798, 46.155802 ], "pop" : 19140, "state" : "OR" } +{ "_id" : "97106", "city" : "BANKS", "loc" : [ -123.120982, 45.653476 ], "pop" : 3316, "state" : "OR" } +{ "_id" : "97107", "city" : "BAY CITY", "loc" : [ -123.876075, 45.519658 ], "pop" : 1483, "state" : "OR" } +{ "_id" : "97108", "city" : "BEAVER", "loc" : [ -123.823417, 45.276746 ], "pop" : 133, "state" : "OR" } +{ "_id" : "97109", "city" : "BUXTON", "loc" : [ -123.214555, 45.736983 ], "pop" : 420, "state" : "OR" } +{ "_id" : "97111", "city" : "CARLTON", "loc" : [ -123.152346, 45.28593 ], "pop" : 1555, "state" : "OR" } +{ "_id" : "97112", "city" : "CLOVERDALE", "loc" : [ -123.835628, 45.285821 ], "pop" : 1269, "state" : "OR" } +{ "_id" : "97113", "city" : "CORNELIUS", "loc" : [ -123.041536, 45.529034 ], "pop" : 13173, "state" : "OR" } +{ "_id" : "97114", "city" : "DAYTON", "loc" : [ -123.075332, 45.197722 ], "pop" : 3640, "state" : "OR" } +{ "_id" : "97115", "city" : "DUNDEE", "loc" : [ -123.01523, 45.27761 ], "pop" : 2382, "state" : "OR" } +{ "_id" : "97116", "city" : "GLENWOOD", "loc" : [ -123.115152, 45.532835 ], "pop" : 17626, "state" : "OR" } +{ "_id" : "97117", "city" : "GALES CREEK", "loc" : [ -123.233967, 45.595747 ], "pop" : 374, "state" : "OR" } +{ "_id" : "97119", "city" : "GASTON", "loc" : [ -123.16657, 45.442738 ], "pop" : 3844, "state" : "OR" } +{ "_id" : "97121", "city" : "HAMMOND", "loc" : [ -123.952726, 46.198028 ], "pop" : 627, "state" : "OR" } +{ "_id" : "97122", "city" : "HEBO", "loc" : [ -123.871433, 45.212016 ], "pop" : 366, "state" : "OR" } +{ "_id" : "97123", "city" : "HILLSBORO", "loc" : [ -122.956998, 45.498401 ], "pop" : 24201, "state" : "OR" } +{ "_id" : "97124", "city" : "HILLSBORO", "loc" : [ -122.963608, 45.53868 ], "pop" : 20503, "state" : "OR" } +{ "_id" : "97125", "city" : "MANNING", "loc" : [ -123.186113, 45.652468 ], "pop" : 549, "state" : "OR" } +{ "_id" : "97127", "city" : "LAFAYETTE", "loc" : [ -123.111362, 45.246638 ], "pop" : 1315, "state" : "OR" } +{ "_id" : "97128", "city" : "MCMINNVILLE", "loc" : [ -123.204342, 45.209677 ], "pop" : 21848, "state" : "OR" } +{ "_id" : "97131", "city" : "NEHALEM", "loc" : [ -123.904943, 45.72159 ], "pop" : 2118, "state" : "OR" } +{ "_id" : "97132", "city" : "NEWBERG", "loc" : [ -122.968503, 45.309901 ], "pop" : 18911, "state" : "OR" } +{ "_id" : "97136", "city" : "ROCKAWAY", "loc" : [ -123.907834, 45.608511 ], "pop" : 3164, "state" : "OR" } +{ "_id" : "97137", "city" : "SAINT PAUL", "loc" : [ -122.96737, 45.195996 ], "pop" : 1623, "state" : "OR" } +{ "_id" : "97138", "city" : "GEARHART", "loc" : [ -123.878837, 45.969506 ], "pop" : 7239, "state" : "OR" } +{ "_id" : "97140", "city" : "SHERWOOD", "loc" : [ -122.856724, 45.351419 ], "pop" : 7623, "state" : "OR" } +{ "_id" : "97141", "city" : "TILLAMOOK", "loc" : [ -123.818851, 45.449185 ], "pop" : 11010, "state" : "OR" } +{ "_id" : "97144", "city" : "TIMBER", "loc" : [ -123.311852, 45.727033 ], "pop" : 124, "state" : "OR" } +{ "_id" : "97145", "city" : "TOLOVANA PARK", "loc" : [ -123.95887, 45.886172 ], "pop" : 1114, "state" : "OR" } +{ "_id" : "97146", "city" : "WARRENTON", "loc" : [ -123.925366, 46.145017 ], "pop" : 4224, "state" : "OR" } +{ "_id" : "97148", "city" : "YAMHILL", "loc" : [ -123.203639, 45.335049 ], "pop" : 4276, "state" : "OR" } +{ "_id" : "97149", "city" : "NESKOWIN", "loc" : [ -123.926344, 45.178165 ], "pop" : 2027, "state" : "OR" } +{ "_id" : "97201", "city" : "PORTLAND", "loc" : [ -122.690258, 45.498819 ], "pop" : 22763, "state" : "OR" } +{ "_id" : "97202", "city" : "PORTLAND", "loc" : [ -122.636534, 45.484007 ], "pop" : 37147, "state" : "OR" } +{ "_id" : "97203", "city" : "PORTLAND", "loc" : [ -122.734699, 45.588872 ], "pop" : 24789, "state" : "OR" } +{ "_id" : "97204", "city" : "PORTLAND", "loc" : [ -122.674498, 45.51807 ], "pop" : 1094, "state" : "OR" } +{ "_id" : "97205", "city" : "PORTLAND", "loc" : [ -122.688846, 45.52072 ], "pop" : 5804, "state" : "OR" } +{ "_id" : "97206", "city" : "PORTLAND", "loc" : [ -122.59727, 45.483995 ], "pop" : 43134, "state" : "OR" } +{ "_id" : "97209", "city" : "PORTLAND", "loc" : [ -122.685447, 45.526962 ], "pop" : 5810, "state" : "OR" } +{ "_id" : "97210", "city" : "PORTLAND", "loc" : [ -122.703348, 45.530318 ], "pop" : 9284, "state" : "OR" } +{ "_id" : "97211", "city" : "PORTLAND", "loc" : [ -122.644815, 45.565259 ], "pop" : 28736, "state" : "OR" } +{ "_id" : "97212", "city" : "PORTLAND", "loc" : [ -122.642319, 45.544127 ], "pop" : 23898, "state" : "OR" } +{ "_id" : "97213", "city" : "PORTLAND", "loc" : [ -122.59867, 45.537292 ], "pop" : 29400, "state" : "OR" } +{ "_id" : "97214", "city" : "PORTLAND", "loc" : [ -122.636397, 45.514207 ], "pop" : 23413, "state" : "OR" } +{ "_id" : "97215", "city" : "PORTLAND", "loc" : [ -122.599001, 45.514282 ], "pop" : 16563, "state" : "OR" } +{ "_id" : "97216", "city" : "PORTLAND", "loc" : [ -122.55688, 45.513746 ], "pop" : 11436, "state" : "OR" } +{ "_id" : "97217", "city" : "PORTLAND", "loc" : [ -122.684196, 45.57424 ], "pop" : 29086, "state" : "OR" } +{ "_id" : "97218", "city" : "PORTLAND", "loc" : [ -122.600131, 45.560032 ], "pop" : 12305, "state" : "OR" } +{ "_id" : "97219", "city" : "PORTLAND", "loc" : [ -122.70738, 45.457956 ], "pop" : 34992, "state" : "OR" } +{ "_id" : "97220", "city" : "PORTLAND", "loc" : [ -122.556586, 45.541109 ], "pop" : 25679, "state" : "OR" } +{ "_id" : "97221", "city" : "PORTLAND", "loc" : [ -122.726723, 45.491829 ], "pop" : 10834, "state" : "OR" } +{ "_id" : "97222", "city" : "MILWAUKIE", "loc" : [ -122.615092, 45.442919 ], "pop" : 30905, "state" : "OR" } +{ "_id" : "97223", "city" : "GARDEN HOME", "loc" : [ -122.775974, 45.443343 ], "pop" : 33529, "state" : "OR" } +{ "_id" : "97224", "city" : "TIGARD", "loc" : [ -122.788379, 45.407292 ], "pop" : 17149, "state" : "OR" } +{ "_id" : "97225", "city" : "CEDAR HILLS", "loc" : [ -122.768344, 45.500449 ], "pop" : 20934, "state" : "OR" } +{ "_id" : "97227", "city" : "PORTLAND", "loc" : [ -122.674257, 45.549564 ], "pop" : 3171, "state" : "OR" } +{ "_id" : "97229", "city" : "PORTLAND", "loc" : [ -122.829924, 45.541087 ], "pop" : 23490, "state" : "OR" } +{ "_id" : "97230", "city" : "ROCKWOOD CORNERS", "loc" : [ -122.500343, 45.535753 ], "pop" : 30643, "state" : "OR" } +{ "_id" : "97231", "city" : "PORTLAND", "loc" : [ -122.838032, 45.640124 ], "pop" : 3760, "state" : "OR" } +{ "_id" : "97232", "city" : "PORTLAND", "loc" : [ -122.63631, 45.528712 ], "pop" : 10323, "state" : "OR" } +{ "_id" : "97233", "city" : "PORTLAND", "loc" : [ -122.498493, 45.514206 ], "pop" : 27274, "state" : "OR" } +{ "_id" : "97236", "city" : "PORTLAND", "loc" : [ -122.509091, 45.488748 ], "pop" : 24710, "state" : "OR" } +{ "_id" : "97266", "city" : "PORTLAND", "loc" : [ -122.559607, 45.476207 ], "pop" : 29648, "state" : "OR" } +{ "_id" : "97267", "city" : "OAK GROVE", "loc" : [ -122.610631, 45.407494 ], "pop" : 29597, "state" : "OR" } +{ "_id" : "97301", "city" : "SALEM", "loc" : [ -122.979692, 44.926039 ], "pop" : 48007, "state" : "OR" } +{ "_id" : "97302", "city" : "SALEM", "loc" : [ -123.044514, 44.903899 ], "pop" : 34814, "state" : "OR" } +{ "_id" : "97303", "city" : "KEIZER", "loc" : [ -123.019015, 44.985794 ], "pop" : 35826, "state" : "OR" } +{ "_id" : "97304", "city" : "SALEM", "loc" : [ -123.075323, 44.958846 ], "pop" : 16986, "state" : "OR" } +{ "_id" : "97305", "city" : "BROOKS", "loc" : [ -122.966892, 44.982502 ], "pop" : 28239, "state" : "OR" } +{ "_id" : "97306", "city" : "SALEM", "loc" : [ -123.043789, 44.8685 ], "pop" : 14770, "state" : "OR" } +{ "_id" : "97321", "city" : "ALBANY", "loc" : [ -123.094409, 44.627722 ], "pop" : 42908, "state" : "OR" } +{ "_id" : "97324", "city" : "ALSEA", "loc" : [ -123.60892, 44.369068 ], "pop" : 1008, "state" : "OR" } +{ "_id" : "97325", "city" : "WEST STAYTON", "loc" : [ -122.878575, 44.817817 ], "pop" : 4185, "state" : "OR" } +{ "_id" : "97326", "city" : "BLODGETT", "loc" : [ -123.606715, 44.628141 ], "pop" : 657, "state" : "OR" } +{ "_id" : "97327", "city" : "BROWNSVILLE", "loc" : [ -122.948491, 44.376974 ], "pop" : 3249, "state" : "OR" } +{ "_id" : "97329", "city" : "CASCADIA", "loc" : [ -122.464214, 44.392239 ], "pop" : 163, "state" : "OR" } +{ "_id" : "97330", "city" : "CORVALLIS", "loc" : [ -123.272171, 44.590411 ], "pop" : 38801, "state" : "OR" } +{ "_id" : "97331", "city" : "CORVALLIS", "loc" : [ -123.277889, 44.563783 ], "pop" : 2528, "state" : "OR" } +{ "_id" : "97333", "city" : "CORVALLIS", "loc" : [ -123.279908, 44.539281 ], "pop" : 13009, "state" : "OR" } +{ "_id" : "97338", "city" : "DALLAS", "loc" : [ -123.319991, 44.922534 ], "pop" : 14447, "state" : "OR" } +{ "_id" : "97341", "city" : "DEPOE BAY", "loc" : [ -124.03234, 44.851445 ], "pop" : 3022, "state" : "OR" } +{ "_id" : "97342", "city" : "DETROIT", "loc" : [ -122.18447, 44.776619 ], "pop" : 589, "state" : "OR" } +{ "_id" : "97343", "city" : "EDDYVILLE", "loc" : [ -123.753096, 44.637139 ], "pop" : 599, "state" : "OR" } +{ "_id" : "97344", "city" : "FALLS CITY", "loc" : [ -123.446149, 44.870597 ], "pop" : 957, "state" : "OR" } +{ "_id" : "97345", "city" : "FOSTER", "loc" : [ -122.544898, 44.383556 ], "pop" : 192, "state" : "OR" } +{ "_id" : "97346", "city" : "GATES", "loc" : [ -122.399498, 44.752716 ], "pop" : 697, "state" : "OR" } +{ "_id" : "97347", "city" : "GRAND RONDE", "loc" : [ -123.633518, 45.074973 ], "pop" : 1151, "state" : "OR" } +{ "_id" : "97348", "city" : "HALSEY", "loc" : [ -123.125103, 44.386151 ], "pop" : 1159, "state" : "OR" } +{ "_id" : "97350", "city" : "IDANHA", "loc" : [ -122.047574, 44.701484 ], "pop" : 340, "state" : "OR" } +{ "_id" : "97351", "city" : "INDEPENDENCE", "loc" : [ -123.187913, 44.848098 ], "pop" : 5955, "state" : "OR" } +{ "_id" : "97352", "city" : "JEFFERSON", "loc" : [ -123.00596, 44.749452 ], "pop" : 5829, "state" : "OR" } +{ "_id" : "97355", "city" : "LEBANON", "loc" : [ -122.882064, 44.531558 ], "pop" : 23147, "state" : "OR" } +{ "_id" : "97357", "city" : "LOGSDEN", "loc" : [ -123.773645, 44.747514 ], "pop" : 234, "state" : "OR" } +{ "_id" : "97358", "city" : "LYONS", "loc" : [ -122.820083, 44.776792 ], "pop" : 0, "state" : "OR" } +{ "_id" : "97360", "city" : "MILL CITY", "loc" : [ -122.476825, 44.751566 ], "pop" : 2340, "state" : "OR" } +{ "_id" : "97361", "city" : "MONMOUTH", "loc" : [ -123.251233, 44.837706 ], "pop" : 8071, "state" : "OR" } +{ "_id" : "97362", "city" : "MOUNT ANGEL", "loc" : [ -122.785611, 45.073727 ], "pop" : 4747, "state" : "OR" } +{ "_id" : "97364", "city" : "NEOTSU", "loc" : [ -123.984337, 44.998801 ], "pop" : 347, "state" : "OR" } +{ "_id" : "97365", "city" : "NEWPORT", "loc" : [ -124.050903, 44.648653 ], "pop" : 9239, "state" : "OR" } +{ "_id" : "97366", "city" : "SOUTH BEACH", "loc" : [ -124.059968, 44.57122 ], "pop" : 1423, "state" : "OR" } +{ "_id" : "97367", "city" : "LINCOLN CITY", "loc" : [ -123.99556, 44.968139 ], "pop" : 6786, "state" : "OR" } +{ "_id" : "97368", "city" : "OTIS", "loc" : [ -123.933244, 45.013755 ], "pop" : 2506, "state" : "OR" } +{ "_id" : "97370", "city" : "PHILOMATH", "loc" : [ -123.392271, 44.548817 ], "pop" : 6879, "state" : "OR" } +{ "_id" : "97371", "city" : "RICKREALL", "loc" : [ -123.206424, 45.020032 ], "pop" : 266, "state" : "OR" } +{ "_id" : "97374", "city" : "SCIO", "loc" : [ -122.768356, 44.716792 ], "pop" : 7170, "state" : "OR" } +{ "_id" : "97375", "city" : "SCOTTS MILLS", "loc" : [ -122.665418, 45.022 ], "pop" : 1326, "state" : "OR" } +{ "_id" : "97376", "city" : "SEAL ROCK", "loc" : [ -124.060708, 44.477749 ], "pop" : 1845, "state" : "OR" } +{ "_id" : "97377", "city" : "SHEDD", "loc" : [ -123.106462, 44.452951 ], "pop" : 1067, "state" : "OR" } +{ "_id" : "97378", "city" : "SHERIDAN", "loc" : [ -123.400335, 45.089703 ], "pop" : 6591, "state" : "OR" } +{ "_id" : "97380", "city" : "SILETZ", "loc" : [ -123.906239, 44.731333 ], "pop" : 1869, "state" : "OR" } +{ "_id" : "97381", "city" : "SILVERTON", "loc" : [ -122.762724, 44.991041 ], "pop" : 10399, "state" : "OR" } +{ "_id" : "97383", "city" : "STAYTON", "loc" : [ -122.76241, 44.80211 ], "pop" : 6808, "state" : "OR" } +{ "_id" : "97385", "city" : "SUBLIMITY", "loc" : [ -122.800718, 44.842523 ], "pop" : 2881, "state" : "OR" } +{ "_id" : "97386", "city" : "SWEET HOME", "loc" : [ -122.728561, 44.398111 ], "pop" : 11237, "state" : "OR" } +{ "_id" : "97389", "city" : "TANGENT", "loc" : [ -123.110815, 44.54973 ], "pop" : 1257, "state" : "OR" } +{ "_id" : "97390", "city" : "TIDEWATER", "loc" : [ -123.914861, 44.405538 ], "pop" : 523, "state" : "OR" } +{ "_id" : "97391", "city" : "TOLEDO", "loc" : [ -123.930119, 44.627082 ], "pop" : 5609, "state" : "OR" } +{ "_id" : "97392", "city" : "TURNER", "loc" : [ -122.950117, 44.847607 ], "pop" : 1243, "state" : "OR" } +{ "_id" : "97394", "city" : "WALDPORT", "loc" : [ -124.035053, 44.408497 ], "pop" : 3302, "state" : "OR" } +{ "_id" : "97396", "city" : "WILLAMINA", "loc" : [ -123.504708, 45.082605 ], "pop" : 2697, "state" : "OR" } +{ "_id" : "97401", "city" : "COBURG", "loc" : [ -123.078757, 44.073677 ], "pop" : 36277, "state" : "OR" } +{ "_id" : "97402", "city" : "EUGENE", "loc" : [ -123.155525, 44.061243 ], "pop" : 37830, "state" : "OR" } +{ "_id" : "97403", "city" : "EUGENE", "loc" : [ -123.061422, 44.038534 ], "pop" : 11073, "state" : "OR" } +{ "_id" : "97404", "city" : "EUGENE", "loc" : [ -123.13336, 44.100536 ], "pop" : 23778, "state" : "OR" } +{ "_id" : "97405", "city" : "EUGENE", "loc" : [ -123.099769, 44.018497 ], "pop" : 40921, "state" : "OR" } +{ "_id" : "97406", "city" : "AGNESS", "loc" : [ -124.064769, 42.574788 ], "pop" : 126, "state" : "OR" } +{ "_id" : "97410", "city" : "AZALEA", "loc" : [ -123.155017, 42.844992 ], "pop" : 1111, "state" : "OR" } +{ "_id" : "97411", "city" : "BANDON", "loc" : [ -124.40367, 43.096806 ], "pop" : 4852, "state" : "OR" } +{ "_id" : "97412", "city" : "BLACHLY", "loc" : [ -123.534816, 44.196597 ], "pop" : 495, "state" : "OR" } +{ "_id" : "97413", "city" : "MC KENZIE BRIDGE", "loc" : [ -122.222951, 44.177809 ], "pop" : 1139, "state" : "OR" } +{ "_id" : "97414", "city" : "BROADBENT", "loc" : [ -124.118924, 42.985048 ], "pop" : 121, "state" : "OR" } +{ "_id" : "97415", "city" : "HARBOR", "loc" : [ -124.267811, 42.064004 ], "pop" : 11673, "state" : "OR" } +{ "_id" : "97416", "city" : "CAMAS VALLEY", "loc" : [ -123.665465, 43.05566 ], "pop" : 972, "state" : "OR" } +{ "_id" : "97417", "city" : "CANYONVILLE", "loc" : [ -123.278015, 42.930683 ], "pop" : 1670, "state" : "OR" } +{ "_id" : "97419", "city" : "CHESHIRE", "loc" : [ -123.371516, 44.178206 ], "pop" : 1050, "state" : "OR" } +{ "_id" : "97420", "city" : "CHARLESTON", "loc" : [ -124.233101, 43.362812 ], "pop" : 24343, "state" : "OR" } +{ "_id" : "97423", "city" : "COQUILLE", "loc" : [ -124.201386, 43.188413 ], "pop" : 8374, "state" : "OR" } +{ "_id" : "97424", "city" : "COTTAGE GROVE", "loc" : [ -123.05291, 43.783934 ], "pop" : 15067, "state" : "OR" } +{ "_id" : "97426", "city" : "CRESWELL", "loc" : [ -123.02838, 43.90583 ], "pop" : 6332, "state" : "OR" } +{ "_id" : "97427", "city" : "CULP CREEK", "loc" : [ -122.752417, 43.684534 ], "pop" : 317, "state" : "OR" } +{ "_id" : "97429", "city" : "DAYS CREEK", "loc" : [ -123.14387, 42.981946 ], "pop" : 392, "state" : "OR" } +{ "_id" : "97430", "city" : "GREENLEAF", "loc" : [ -123.688328, 44.145131 ], "pop" : 492, "state" : "OR" } +{ "_id" : "97431", "city" : "DEXTER", "loc" : [ -122.842351, 43.921691 ], "pop" : 2980, "state" : "OR" } +{ "_id" : "97434", "city" : "DORENA", "loc" : [ -122.885796, 43.758655 ], "pop" : 225, "state" : "OR" } +{ "_id" : "97435", "city" : "DRAIN", "loc" : [ -123.292922, 43.687659 ], "pop" : 2331, "state" : "OR" } +{ "_id" : "97436", "city" : "ELKTON", "loc" : [ -123.590014, 43.637761 ], "pop" : 878, "state" : "OR" } +{ "_id" : "97437", "city" : "ELMIRA", "loc" : [ -123.367051, 44.08726 ], "pop" : 2424, "state" : "OR" } +{ "_id" : "97438", "city" : "FALL CREEK", "loc" : [ -122.785904, 43.95616 ], "pop" : 1581, "state" : "OR" } +{ "_id" : "97439", "city" : "FLORENCE", "loc" : [ -124.099303, 43.988099 ], "pop" : 10063, "state" : "OR" } +{ "_id" : "97441", "city" : "GARDINER", "loc" : [ -124.143695, 43.785736 ], "pop" : 14, "state" : "OR" } +{ "_id" : "97442", "city" : "GLENDALE", "loc" : [ -123.394302, 42.751751 ], "pop" : 2050, "state" : "OR" } +{ "_id" : "97443", "city" : "GLIDE", "loc" : [ -122.963846, 43.277395 ], "pop" : 2905, "state" : "OR" } +{ "_id" : "97444", "city" : "PISTOL RIVER", "loc" : [ -124.396072, 42.434818 ], "pop" : 4760, "state" : "OR" } +{ "_id" : "97446", "city" : "HARRISBURG", "loc" : [ -123.143165, 44.271656 ], "pop" : 3272, "state" : "OR" } +{ "_id" : "97447", "city" : "IDLEYLD PARK", "loc" : [ -122.901789, 43.371571 ], "pop" : 222, "state" : "OR" } +{ "_id" : "97448", "city" : "JUNCTION CITY", "loc" : [ -123.230014, 44.198792 ], "pop" : 10456, "state" : "OR" } +{ "_id" : "97449", "city" : "LAKESIDE", "loc" : [ -124.162364, 43.583306 ], "pop" : 994, "state" : "OR" } +{ "_id" : "97450", "city" : "LANGLOIS", "loc" : [ -124.441322, 42.915386 ], "pop" : 557, "state" : "OR" } +{ "_id" : "97451", "city" : "LORANE", "loc" : [ -123.247679, 43.829044 ], "pop" : 499, "state" : "OR" } +{ "_id" : "97452", "city" : "LOWELL", "loc" : [ -122.780627, 43.920993 ], "pop" : 792, "state" : "OR" } +{ "_id" : "97453", "city" : "MAPLETON", "loc" : [ -123.865735, 44.031189 ], "pop" : 1104, "state" : "OR" } +{ "_id" : "97454", "city" : "MARCOLA", "loc" : [ -122.82464, 44.206439 ], "pop" : 1442, "state" : "OR" } +{ "_id" : "97455", "city" : "PLEASANT HILL", "loc" : [ -122.928487, 43.945816 ], "pop" : 2218, "state" : "OR" } +{ "_id" : "97456", "city" : "MONROE", "loc" : [ -123.32033, 44.32446 ], "pop" : 2478, "state" : "OR" } +{ "_id" : "97457", "city" : "MYRTLE CREEK", "loc" : [ -123.285054, 43.016161 ], "pop" : 9453, "state" : "OR" } +{ "_id" : "97458", "city" : "MYRTLE POINT", "loc" : [ -124.121327, 43.066694 ], "pop" : 5246, "state" : "OR" } +{ "_id" : "97459", "city" : "NORTH BEND", "loc" : [ -124.213103, 43.432665 ], "pop" : 15269, "state" : "OR" } +{ "_id" : "97461", "city" : "NOTI", "loc" : [ -123.456962, 44.119509 ], "pop" : 1189, "state" : "OR" } +{ "_id" : "97462", "city" : "OAKLAND", "loc" : [ -123.355774, 43.452968 ], "pop" : 3315, "state" : "OR" } +{ "_id" : "97463", "city" : "OAKRIDGE", "loc" : [ -122.457711, 43.749767 ], "pop" : 4058, "state" : "OR" } +{ "_id" : "97465", "city" : "PORT ORFORD", "loc" : [ -124.491283, 42.757194 ], "pop" : 1799, "state" : "OR" } +{ "_id" : "97466", "city" : "POWERS", "loc" : [ -124.066441, 42.891006 ], "pop" : 953, "state" : "OR" } +{ "_id" : "97467", "city" : "WINCHESTER BAY", "loc" : [ -124.105476, 43.695701 ], "pop" : 6723, "state" : "OR" } +{ "_id" : "97468", "city" : "REMOTE", "loc" : [ -123.89149, 43.007909 ], "pop" : 121, "state" : "OR" } +{ "_id" : "97469", "city" : "RIDDLE", "loc" : [ -123.361247, 42.938867 ], "pop" : 2698, "state" : "OR" } +{ "_id" : "97470", "city" : "ROSEBURG", "loc" : [ -123.366437, 43.222726 ], "pop" : 41697, "state" : "OR" } +{ "_id" : "97473", "city" : "SCOTTSBURG", "loc" : [ -123.804065, 43.676481 ], "pop" : 329, "state" : "OR" } +{ "_id" : "97476", "city" : "SIXES", "loc" : [ -124.44093, 42.824984 ], "pop" : 412, "state" : "OR" } +{ "_id" : "97477", "city" : "SPRINGFIELD", "loc" : [ -123.015259, 44.06106 ], "pop" : 32384, "state" : "OR" } +{ "_id" : "97478", "city" : "SPRINGFIELD", "loc" : [ -122.917108, 44.056056 ], "pop" : 27521, "state" : "OR" } +{ "_id" : "97479", "city" : "SUTHERLIN", "loc" : [ -123.297425, 43.390404 ], "pop" : 7304, "state" : "OR" } +{ "_id" : "97480", "city" : "SWISSHOME", "loc" : [ -123.827899, 44.089903 ], "pop" : 641, "state" : "OR" } +{ "_id" : "97481", "city" : "TENMILE", "loc" : [ -123.530104, 43.137116 ], "pop" : 1231, "state" : "OR" } +{ "_id" : "97484", "city" : "TILLER", "loc" : [ -122.908088, 42.985896 ], "pop" : 534, "state" : "OR" } +{ "_id" : "97486", "city" : "UMPQUA", "loc" : [ -123.535771, 43.374537 ], "pop" : 587, "state" : "OR" } +{ "_id" : "97487", "city" : "VENETA", "loc" : [ -123.35159, 44.038235 ], "pop" : 6004, "state" : "OR" } +{ "_id" : "97488", "city" : "VIDA", "loc" : [ -122.504429, 44.130041 ], "pop" : 1040, "state" : "OR" } +{ "_id" : "97489", "city" : "LEABURG", "loc" : [ -122.629064, 44.135163 ], "pop" : 432, "state" : "OR" } +{ "_id" : "97490", "city" : "WALTON", "loc" : [ -123.589304, 44.028194 ], "pop" : 298, "state" : "OR" } +{ "_id" : "97492", "city" : "WESTFIR", "loc" : [ -122.514095, 43.756636 ], "pop" : 514, "state" : "OR" } +{ "_id" : "97493", "city" : "WESTLAKE", "loc" : [ -124.033364, 43.914017 ], "pop" : 272, "state" : "OR" } +{ "_id" : "97496", "city" : "WINSTON", "loc" : [ -123.432481, 43.104855 ], "pop" : 5971, "state" : "OR" } +{ "_id" : "97497", "city" : "SUNNY VALLEY", "loc" : [ -123.351538, 42.655128 ], "pop" : 1253, "state" : "OR" } +{ "_id" : "97498", "city" : "YACHATS", "loc" : [ -124.086262, 44.325563 ], "pop" : 1235, "state" : "OR" } +{ "_id" : "97499", "city" : "YONCALLA", "loc" : [ -123.292562, 43.60434 ], "pop" : 2261, "state" : "OR" } +{ "_id" : "97501", "city" : "WEST MAIN", "loc" : [ -122.887011, 42.319293 ], "pop" : 28708, "state" : "OR" } +{ "_id" : "97502", "city" : "CENTRAL POINT", "loc" : [ -122.922235, 42.389914 ], "pop" : 17293, "state" : "OR" } +{ "_id" : "97503", "city" : "WHITE CITY", "loc" : [ -122.82962, 42.431919 ], "pop" : 7024, "state" : "OR" } +{ "_id" : "97504", "city" : "MEDFORD", "loc" : [ -122.839801, 42.336251 ], "pop" : 30933, "state" : "OR" } +{ "_id" : "97520", "city" : "ASHLAND", "loc" : [ -122.693033, 42.188509 ], "pop" : 19579, "state" : "OR" } +{ "_id" : "97522", "city" : "BUTTE FALLS", "loc" : [ -122.563801, 42.549243 ], "pop" : 1115, "state" : "OR" } +{ "_id" : "97523", "city" : "CAVE JUNCTION", "loc" : [ -123.627199, 42.134789 ], "pop" : 5500, "state" : "OR" } +{ "_id" : "97524", "city" : "EAGLE POINT", "loc" : [ -122.808802, 42.493467 ], "pop" : 7468, "state" : "OR" } +{ "_id" : "97525", "city" : "GOLD HILL", "loc" : [ -123.08543, 42.424436 ], "pop" : 6650, "state" : "OR" } +{ "_id" : "97526", "city" : "GRANTS PASS", "loc" : [ -123.345727, 42.463758 ], "pop" : 27145, "state" : "OR" } +{ "_id" : "97527", "city" : "GRANTS PASS", "loc" : [ -123.353799, 42.398913 ], "pop" : 21774, "state" : "OR" } +{ "_id" : "97530", "city" : "APPLEGATE", "loc" : [ -123.028098, 42.254894 ], "pop" : 5723, "state" : "OR" } +{ "_id" : "97531", "city" : "KERBY", "loc" : [ -123.657302, 42.209343 ], "pop" : 78, "state" : "OR" } +{ "_id" : "97532", "city" : "MERLIN", "loc" : [ -123.439256, 42.529654 ], "pop" : 1806, "state" : "OR" } +{ "_id" : "97534", "city" : "O BRIEN", "loc" : [ -123.720898, 42.068816 ], "pop" : 247, "state" : "OR" } +{ "_id" : "97535", "city" : "PHOENIX", "loc" : [ -122.822694, 42.276555 ], "pop" : 6054, "state" : "OR" } +{ "_id" : "97536", "city" : "PROSPECT", "loc" : [ -122.50898, 42.754394 ], "pop" : 869, "state" : "OR" } +{ "_id" : "97537", "city" : "ROGUE RIVER", "loc" : [ -123.158726, 42.488889 ], "pop" : 6131, "state" : "OR" } +{ "_id" : "97538", "city" : "SELMA", "loc" : [ -123.568394, 42.296358 ], "pop" : 2065, "state" : "OR" } +{ "_id" : "97539", "city" : "SHADY COVE", "loc" : [ -122.812191, 42.607575 ], "pop" : 2364, "state" : "OR" } +{ "_id" : "97540", "city" : "TALENT", "loc" : [ -122.78605, 42.236252 ], "pop" : 5288, "state" : "OR" } +{ "_id" : "97541", "city" : "TRAIL", "loc" : [ -122.816029, 42.686358 ], "pop" : 1028, "state" : "OR" } +{ "_id" : "97543", "city" : "WILDERVILLE", "loc" : [ -123.513861, 42.392483 ], "pop" : 927, "state" : "OR" } +{ "_id" : "97544", "city" : "WILLIAMS", "loc" : [ -123.282877, 42.223049 ], "pop" : 1854, "state" : "OR" } +{ "_id" : "97601", "city" : "ORETECH", "loc" : [ -121.786969, 42.229601 ], "pop" : 18626, "state" : "OR" } +{ "_id" : "97603", "city" : "KLAMATH FALLS", "loc" : [ -121.724124, 42.191915 ], "pop" : 24894, "state" : "OR" } +{ "_id" : "97620", "city" : "ADEL", "loc" : [ -119.883291, 42.148697 ], "pop" : 190, "state" : "OR" } +{ "_id" : "97621", "city" : "BEATTY", "loc" : [ -121.219962, 42.436942 ], "pop" : 95, "state" : "OR" } +{ "_id" : "97623", "city" : "BONANZA", "loc" : [ -121.333558, 42.246268 ], "pop" : 2753, "state" : "OR" } +{ "_id" : "97624", "city" : "CHILOQUIN", "loc" : [ -121.744959, 42.546293 ], "pop" : 3608, "state" : "OR" } +{ "_id" : "97625", "city" : "DAIRY", "loc" : [ -121.642453, 42.258141 ], "pop" : 8, "state" : "OR" } +{ "_id" : "97627", "city" : "KENO", "loc" : [ -121.972427, 42.175472 ], "pop" : 2696, "state" : "OR" } +{ "_id" : "97630", "city" : "LAKEVIEW", "loc" : [ -120.377533, 42.185443 ], "pop" : 4890, "state" : "OR" } +{ "_id" : "97632", "city" : "MALIN", "loc" : [ -121.422121, 42.019502 ], "pop" : 1456, "state" : "OR" } +{ "_id" : "97633", "city" : "MERRILL", "loc" : [ -121.598545, 42.029516 ], "pop" : 1344, "state" : "OR" } +{ "_id" : "97635", "city" : "NEW PINE CREEK", "loc" : [ -120.28939, 42.027759 ], "pop" : 198, "state" : "OR" } +{ "_id" : "97636", "city" : "PAISLEY", "loc" : [ -120.553208, 42.703089 ], "pop" : 619, "state" : "OR" } +{ "_id" : "97637", "city" : "PLUSH", "loc" : [ -119.894722, 42.503493 ], "pop" : 126, "state" : "OR" } +{ "_id" : "97638", "city" : "SILVER LAKE", "loc" : [ -120.780109, 43.258164 ], "pop" : 1127, "state" : "OR" } +{ "_id" : "97640", "city" : "SUMMER LAKE", "loc" : [ -121.063254, 42.831302 ], "pop" : 1, "state" : "OR" } +{ "_id" : "97701", "city" : "BEND", "loc" : [ -121.293632, 44.092788 ], "pop" : 29432, "state" : "OR" } +{ "_id" : "97702", "city" : "BEND", "loc" : [ -121.298543, 44.022332 ], "pop" : 20214, "state" : "OR" } +{ "_id" : "97707", "city" : "SUNRIVER", "loc" : [ -121.457871, 43.850336 ], "pop" : 2881, "state" : "OR" } +{ "_id" : "97711", "city" : "ASHWOOD", "loc" : [ -120.719161, 44.719479 ], "pop" : 114, "state" : "OR" } +{ "_id" : "97712", "city" : "BROTHERS", "loc" : [ -120.477035, 43.778877 ], "pop" : 41, "state" : "OR" } +{ "_id" : "97720", "city" : "BURNS", "loc" : [ -119.050398, 43.51451 ], "pop" : 5844, "state" : "OR" } +{ "_id" : "97730", "city" : "CAMP SHERMAN", "loc" : [ -121.639363, 44.454997 ], "pop" : 378, "state" : "OR" } +{ "_id" : "97731", "city" : "DIAMOND LAKE", "loc" : [ -121.8447, 43.124669 ], "pop" : 388, "state" : "OR" } +{ "_id" : "97732", "city" : "CRANE", "loc" : [ -118.4642, 43.426219 ], "pop" : 280, "state" : "OR" } +{ "_id" : "97733", "city" : "CRESCENT", "loc" : [ -121.664813, 43.497226 ], "pop" : 1848, "state" : "OR" } +{ "_id" : "97734", "city" : "CULVER", "loc" : [ -121.234353, 44.481796 ], "pop" : 2517, "state" : "OR" } +{ "_id" : "97735", "city" : "FORT ROCK", "loc" : [ -121.08243, 43.44615 ], "pop" : 35, "state" : "OR" } +{ "_id" : "97737", "city" : "GILCHRIST", "loc" : [ -121.886596, 43.30759 ], "pop" : 148, "state" : "OR" } +{ "_id" : "97739", "city" : "LA PINE", "loc" : [ -121.519445, 43.709125 ], "pop" : 4815, "state" : "OR" } +{ "_id" : "97740", "city" : "LAWEN", "loc" : [ -118.8418, 43.561816 ], "pop" : 708, "state" : "OR" } +{ "_id" : "97741", "city" : "MADRAS", "loc" : [ -121.134924, 44.637579 ], "pop" : 8294, "state" : "OR" } +{ "_id" : "97750", "city" : "MITCHELL", "loc" : [ -120.145579, 44.565734 ], "pop" : 394, "state" : "OR" } +{ "_id" : "97751", "city" : "PAULINA", "loc" : [ -119.782768, 44.210243 ], "pop" : 98, "state" : "OR" } +{ "_id" : "97752", "city" : "POST", "loc" : [ -120.299781, 44.079273 ], "pop" : 252, "state" : "OR" } +{ "_id" : "97753", "city" : "POWELL BUTTE", "loc" : [ -121.011326, 44.241512 ], "pop" : 1056, "state" : "OR" } +{ "_id" : "97754", "city" : "PRINEVILLE", "loc" : [ -120.833616, 44.30445 ], "pop" : 12484, "state" : "OR" } +{ "_id" : "97756", "city" : "REDMOND", "loc" : [ -121.189604, 44.27669 ], "pop" : 12161, "state" : "OR" } +{ "_id" : "97758", "city" : "RILEY", "loc" : [ -116.900621, 44.930529 ], "pop" : 157, "state" : "OR" } +{ "_id" : "97759", "city" : "BLACK BUTTE RANC", "loc" : [ -121.524133, 44.307329 ], "pop" : 3534, "state" : "OR" } +{ "_id" : "97760", "city" : "CROOKED RIVER RA", "loc" : [ -121.167565, 44.355505 ], "pop" : 2101, "state" : "OR" } +{ "_id" : "97761", "city" : "WARM SPRINGS", "loc" : [ -121.290941, 44.746826 ], "pop" : 2400, "state" : "OR" } +{ "_id" : "97801", "city" : "PENDLETON", "loc" : [ -118.783104, 45.660535 ], "pop" : 20225, "state" : "OR" } +{ "_id" : "97810", "city" : "ADAMS", "loc" : [ -118.617582, 45.749678 ], "pop" : 609, "state" : "OR" } +{ "_id" : "97812", "city" : "ARLINGTON", "loc" : [ -120.197148, 45.666417 ], "pop" : 708, "state" : "OR" } +{ "_id" : "97813", "city" : "ATHENA", "loc" : [ -118.497147, 45.828893 ], "pop" : 1334, "state" : "OR" } +{ "_id" : "97814", "city" : "MEDICAL SPRINGS", "loc" : [ -117.828631, 44.780102 ], "pop" : 10024, "state" : "OR" } +{ "_id" : "97818", "city" : "BOARDMAN", "loc" : [ -119.72057, 45.827165 ], "pop" : 2143, "state" : "OR" } +{ "_id" : "97820", "city" : "CANYON CITY", "loc" : [ -118.950155, 44.410005 ], "pop" : 2806, "state" : "OR" } +{ "_id" : "97823", "city" : "CONDON", "loc" : [ -120.189834, 45.230587 ], "pop" : 1009, "state" : "OR" } +{ "_id" : "97824", "city" : "COVE", "loc" : [ -117.814741, 45.319902 ], "pop" : 1280, "state" : "OR" } +{ "_id" : "97825", "city" : "DAYVILLE", "loc" : [ -119.531178, 44.466307 ], "pop" : 144, "state" : "OR" } +{ "_id" : "97826", "city" : "ECHO", "loc" : [ -119.194904, 45.74109 ], "pop" : 648, "state" : "OR" } +{ "_id" : "97827", "city" : "ELGIN", "loc" : [ -117.91119, 45.594101 ], "pop" : 2549, "state" : "OR" } +{ "_id" : "97828", "city" : "ENTERPRISE", "loc" : [ -117.288808, 45.437037 ], "pop" : 3201, "state" : "OR" } +{ "_id" : "97830", "city" : "KINZUA", "loc" : [ -120.206699, 44.985289 ], "pop" : 564, "state" : "OR" } +{ "_id" : "97831", "city" : "FOX", "loc" : [ -119.291646, 44.660681 ], "pop" : 47, "state" : "OR" } +{ "_id" : "97833", "city" : "HAINES", "loc" : [ -117.97556, 44.877622 ], "pop" : 1642, "state" : "OR" } +{ "_id" : "97834", "city" : "HALFWAY", "loc" : [ -117.113152, 44.895272 ], "pop" : 1020, "state" : "OR" } +{ "_id" : "97835", "city" : "HELIX", "loc" : [ -118.722219, 45.866541 ], "pop" : 383, "state" : "OR" } +{ "_id" : "97836", "city" : "HEPPNER", "loc" : [ -119.536897, 45.348577 ], "pop" : 2127, "state" : "OR" } +{ "_id" : "97837", "city" : "HEREFORD", "loc" : [ -117.98896, 44.641048 ], "pop" : 287, "state" : "OR" } +{ "_id" : "97838", "city" : "HERMISTON", "loc" : [ -119.284876, 45.844992 ], "pop" : 16982, "state" : "OR" } +{ "_id" : "97839", "city" : "LEXINGTON", "loc" : [ -119.74636, 45.426362 ], "pop" : 519, "state" : "OR" } +{ "_id" : "97841", "city" : "IMBLER", "loc" : [ -117.954377, 45.459908 ], "pop" : 561, "state" : "OR" } +{ "_id" : "97842", "city" : "IMNAHA", "loc" : [ -116.825741, 45.513733 ], "pop" : 255, "state" : "OR" } +{ "_id" : "97843", "city" : "IONE", "loc" : [ -119.769034, 45.54033 ], "pop" : 535, "state" : "OR" } +{ "_id" : "97844", "city" : "IRRIGON", "loc" : [ -119.507016, 45.88768 ], "pop" : 2301, "state" : "OR" } +{ "_id" : "97845", "city" : "JOHN DAY", "loc" : [ -119.105157, 44.409977 ], "pop" : 1367, "state" : "OR" } +{ "_id" : "97846", "city" : "JOSEPH", "loc" : [ -117.212805, 45.349432 ], "pop" : 1749, "state" : "OR" } +{ "_id" : "97848", "city" : "KIMBERLY", "loc" : [ -119.596497, 44.72263 ], "pop" : 62, "state" : "OR" } +{ "_id" : "97850", "city" : "LA GRANDE", "loc" : [ -118.085228, 45.330435 ], "pop" : 15401, "state" : "OR" } +{ "_id" : "97856", "city" : "LONG CREEK", "loc" : [ -119.09702, 44.755416 ], "pop" : 442, "state" : "OR" } +{ "_id" : "97857", "city" : "LOSTINE", "loc" : [ -117.435909, 45.493861 ], "pop" : 456, "state" : "OR" } +{ "_id" : "97862", "city" : "MILTON FREEWATER", "loc" : [ -118.391172, 45.948581 ], "pop" : 9723, "state" : "OR" } +{ "_id" : "97864", "city" : "MONUMENT", "loc" : [ -119.430164, 44.818451 ], "pop" : 410, "state" : "OR" } +{ "_id" : "97865", "city" : "MOUNT VERNON", "loc" : [ -119.112142, 44.417095 ], "pop" : 538, "state" : "OR" } +{ "_id" : "97867", "city" : "NORTH POWDER", "loc" : [ -117.933666, 45.031667 ], "pop" : 571, "state" : "OR" } +{ "_id" : "97868", "city" : "PILOT ROCK", "loc" : [ -118.848331, 45.422724 ], "pop" : 2298, "state" : "OR" } +{ "_id" : "97869", "city" : "PRAIRIE CITY", "loc" : [ -118.695199, 44.456977 ], "pop" : 1614, "state" : "OR" } +{ "_id" : "97870", "city" : "RICHLAND", "loc" : [ -117.301825, 44.797013 ], "pop" : 927, "state" : "OR" } +{ "_id" : "97872", "city" : "RITTER", "loc" : [ -118.941818, 44.95404 ], "pop" : 71, "state" : "OR" } +{ "_id" : "97873", "city" : "SENECA", "loc" : [ -119.057797, 44.127704 ], "pop" : 352, "state" : "OR" } +{ "_id" : "97874", "city" : "SPRAY", "loc" : [ -119.830318, 44.824186 ], "pop" : 438, "state" : "OR" } +{ "_id" : "97875", "city" : "STANFIELD", "loc" : [ -119.211602, 45.785988 ], "pop" : 2031, "state" : "OR" } +{ "_id" : "97876", "city" : "SUMMERVILLE", "loc" : [ -118.026978, 45.507687 ], "pop" : 773, "state" : "OR" } +{ "_id" : "97877", "city" : "SUMPTER", "loc" : [ -118.190604, 44.73164 ], "pop" : 251, "state" : "OR" } +{ "_id" : "97882", "city" : "MCNARY", "loc" : [ -119.313715, 45.915725 ], "pop" : 4009, "state" : "OR" } +{ "_id" : "97883", "city" : "UNION", "loc" : [ -117.853554, 45.201939 ], "pop" : 2463, "state" : "OR" } +{ "_id" : "97884", "city" : "UNITY", "loc" : [ -118.16273, 44.449063 ], "pop" : 315, "state" : "OR" } +{ "_id" : "97885", "city" : "WALLOWA", "loc" : [ -117.535727, 45.571722 ], "pop" : 1250, "state" : "OR" } +{ "_id" : "97886", "city" : "WESTON", "loc" : [ -118.373279, 45.807365 ], "pop" : 1007, "state" : "OR" } +{ "_id" : "97901", "city" : "ADRIAN", "loc" : [ -117.060193, 43.653712 ], "pop" : 568, "state" : "OR" } +{ "_id" : "97902", "city" : "AROCK", "loc" : [ -117.034189, 43.970896 ], "pop" : 846, "state" : "OR" } +{ "_id" : "97903", "city" : "BROGAN", "loc" : [ -117.590371, 44.199396 ], "pop" : 205, "state" : "OR" } +{ "_id" : "97904", "city" : "DREWSEY", "loc" : [ -118.47066, 43.864277 ], "pop" : 228, "state" : "OR" } +{ "_id" : "97906", "city" : "HARPER", "loc" : [ -117.528433, 43.873363 ], "pop" : 326, "state" : "OR" } +{ "_id" : "97907", "city" : "HUNTINGTON", "loc" : [ -117.309691, 44.381113 ], "pop" : 694, "state" : "OR" } +{ "_id" : "97908", "city" : "IRONSIDE", "loc" : [ -117.944435, 44.300913 ], "pop" : 79, "state" : "OR" } +{ "_id" : "97909", "city" : "JAMIESON", "loc" : [ -117.437269, 44.181873 ], "pop" : 53, "state" : "OR" } +{ "_id" : "97910", "city" : "JORDAN VALLEY", "loc" : [ -117.280984, 42.880139 ], "pop" : 879, "state" : "OR" } +{ "_id" : "97911", "city" : "JUNTURA", "loc" : [ -118.092118, 43.825277 ], "pop" : 83, "state" : "OR" } +{ "_id" : "97913", "city" : "NYSSA", "loc" : [ -117.025113, 43.860386 ], "pop" : 5288, "state" : "OR" } +{ "_id" : "97914", "city" : "ONTARIO", "loc" : [ -116.978268, 44.04156 ], "pop" : 13665, "state" : "OR" } +{ "_id" : "97917", "city" : "RIVERSIDE", "loc" : [ -118.095769, 43.467415 ], "pop" : 65, "state" : "OR" } +{ "_id" : "97918", "city" : "VALE", "loc" : [ -117.267412, 44.003902 ], "pop" : 3940, "state" : "OR" } +{ "_id" : "97920", "city" : "WESTFALL", "loc" : [ -117.687673, 43.992246 ], "pop" : 41, "state" : "OR" } +{ "_id" : "98001", "city" : "ALGONA", "loc" : [ -122.270057, 47.316339 ], "pop" : 22846, "state" : "WA" } +{ "_id" : "98002", "city" : "AUBURN", "loc" : [ -122.206741, 47.30503 ], "pop" : 38163, "state" : "WA" } +{ "_id" : "98003", "city" : "FEDERAL WAY", "loc" : [ -122.311726, 47.3203 ], "pop" : 34573, "state" : "WA" } +{ "_id" : "98004", "city" : "BEAUX ARTS", "loc" : [ -122.207371, 47.619899 ], "pop" : 23724, "state" : "WA" } +{ "_id" : "98005", "city" : "BELLEVUE", "loc" : [ -122.166288, 47.614961 ], "pop" : 14297, "state" : "WA" } +{ "_id" : "98006", "city" : "BELLEVUE", "loc" : [ -122.155179, 47.561425 ], "pop" : 26775, "state" : "WA" } +{ "_id" : "98007", "city" : "BELLEVUE", "loc" : [ -122.142572, 47.617443 ], "pop" : 21887, "state" : "WA" } +{ "_id" : "98008", "city" : "BELLEVUE", "loc" : [ -122.116173, 47.611468 ], "pop" : 24046, "state" : "WA" } +{ "_id" : "98010", "city" : "BLACK DIAMOND", "loc" : [ -122.005265, 47.311372 ], "pop" : 1817, "state" : "WA" } +{ "_id" : "98011", "city" : "BOTHELL", "loc" : [ -122.2159, 47.749692 ], "pop" : 32985, "state" : "WA" } +{ "_id" : "98012", "city" : "MILL CREEK", "loc" : [ -122.206981, 47.848941 ], "pop" : 19247, "state" : "WA" } +{ "_id" : "98014", "city" : "CARNATION", "loc" : [ -121.911095, 47.638007 ], "pop" : 2808, "state" : "WA" } +{ "_id" : "98019", "city" : "DUVALL", "loc" : [ -121.936906, 47.724987 ], "pop" : 7866, "state" : "WA" } +{ "_id" : "98020", "city" : "WOODWAY", "loc" : [ -122.366949, 47.800693 ], "pop" : 17396, "state" : "WA" } +{ "_id" : "98021", "city" : "BOTHELL", "loc" : [ -122.224339, 47.791806 ], "pop" : 18013, "state" : "WA" } +{ "_id" : "98022", "city" : "ENUMCLAW", "loc" : [ -122.031429, 47.266545 ], "pop" : 34850, "state" : "WA" } +{ "_id" : "98023", "city" : "FEDERAL WAY", "loc" : [ -122.36123, 47.310358 ], "pop" : 38292, "state" : "WA" } +{ "_id" : "98024", "city" : "FALL CITY", "loc" : [ -121.889646, 47.568233 ], "pop" : 3213, "state" : "WA" } +{ "_id" : "98026", "city" : "EDMONDS", "loc" : [ -122.334463, 47.823324 ], "pop" : 33385, "state" : "WA" } +{ "_id" : "98027", "city" : "ISSAQUAH", "loc" : [ -122.033517, 47.550911 ], "pop" : 37255, "state" : "WA" } +{ "_id" : "98031", "city" : "KENT", "loc" : [ -122.193184, 47.388004 ], "pop" : 50515, "state" : "WA" } +{ "_id" : "98032", "city" : "KENT", "loc" : [ -122.285362, 47.377633 ], "pop" : 31379, "state" : "WA" } +{ "_id" : "98033", "city" : "KIRKLAND", "loc" : [ -122.189442, 47.678597 ], "pop" : 28211, "state" : "WA" } +{ "_id" : "98034", "city" : "KIRKLAND", "loc" : [ -122.196571, 47.718777 ], "pop" : 38266, "state" : "WA" } +{ "_id" : "98036", "city" : "BRIER", "loc" : [ -122.287789, 47.811825 ], "pop" : 28602, "state" : "WA" } +{ "_id" : "98037", "city" : "LYNNWOOD", "loc" : [ -122.282139, 47.850532 ], "pop" : 36995, "state" : "WA" } +{ "_id" : "98038", "city" : "MAPLE VALLEY", "loc" : [ -122.057413, 47.384526 ], "pop" : 13768, "state" : "WA" } +{ "_id" : "98040", "city" : "MERCER ISLAND", "loc" : [ -122.226562, 47.563149 ], "pop" : 20816, "state" : "WA" } +{ "_id" : "98042", "city" : "KENT", "loc" : [ -122.120615, 47.368044 ], "pop" : 22576, "state" : "WA" } +{ "_id" : "98043", "city" : "MOUNTLAKE TERRAC", "loc" : [ -122.304036, 47.793061 ], "pop" : 20059, "state" : "WA" } +{ "_id" : "98045", "city" : "NORTH BEND", "loc" : [ -121.757142, 47.475546 ], "pop" : 10083, "state" : "WA" } +{ "_id" : "98047", "city" : "PACIFIC", "loc" : [ -122.243481, 47.266605 ], "pop" : 3902, "state" : "WA" } +{ "_id" : "98051", "city" : "RAVENSDALE", "loc" : [ -121.987897, 47.415476 ], "pop" : 3778, "state" : "WA" } +{ "_id" : "98052", "city" : "REDMOND", "loc" : [ -122.123242, 47.671796 ], "pop" : 37639, "state" : "WA" } +{ "_id" : "98053", "city" : "REDMOND", "loc" : [ -122.038578, 47.646238 ], "pop" : 22112, "state" : "WA" } +{ "_id" : "98055", "city" : "RENTON", "loc" : [ -122.207484, 47.464759 ], "pop" : 17902, "state" : "WA" } +{ "_id" : "98056", "city" : "RENTON", "loc" : [ -122.181942, 47.507336 ], "pop" : 23790, "state" : "WA" } +{ "_id" : "98058", "city" : "RENTON", "loc" : [ -122.121586, 47.446507 ], "pop" : 10153, "state" : "WA" } +{ "_id" : "98059", "city" : "RENTON", "loc" : [ -122.151178, 47.467383 ], "pop" : 48197, "state" : "WA" } +{ "_id" : "98065", "city" : "SNOQUALMIE", "loc" : [ -121.822533, 47.529286 ], "pop" : 3913, "state" : "WA" } +{ "_id" : "98070", "city" : "VASHON", "loc" : [ -122.464415, 47.425949 ], "pop" : 9309, "state" : "WA" } +{ "_id" : "98072", "city" : "WOODINVILLE", "loc" : [ -122.127087, 47.768384 ], "pop" : 40666, "state" : "WA" } +{ "_id" : "98101", "city" : "SEATTLE", "loc" : [ -122.330456, 47.611435 ], "pop" : 5801, "state" : "WA" } +{ "_id" : "98102", "city" : "SEATTLE", "loc" : [ -122.320993, 47.63025 ], "pop" : 19000, "state" : "WA" } +{ "_id" : "98103", "city" : "SEATTLE", "loc" : [ -122.342621, 47.67335 ], "pop" : 39491, "state" : "WA" } +{ "_id" : "98104", "city" : "SEATTLE", "loc" : [ -122.325644, 47.603631 ], "pop" : 9680, "state" : "WA" } +{ "_id" : "98105", "city" : "SEATTLE", "loc" : [ -122.302236, 47.663266 ], "pop" : 37120, "state" : "WA" } +{ "_id" : "98106", "city" : "SEATTLE", "loc" : [ -122.354688, 47.534362 ], "pop" : 17510, "state" : "WA" } +{ "_id" : "98107", "city" : "SEATTLE", "loc" : [ -122.37626, 47.67012 ], "pop" : 18288, "state" : "WA" } +{ "_id" : "98108", "city" : "TUKWILA", "loc" : [ -122.306823, 47.547448 ], "pop" : 18776, "state" : "WA" } +{ "_id" : "98109", "city" : "SEATTLE", "loc" : [ -122.347615, 47.633875 ], "pop" : 13401, "state" : "WA" } +{ "_id" : "98110", "city" : "BAINBRIDGE ISLAN", "loc" : [ -122.531297, 47.645048 ], "pop" : 15846, "state" : "WA" } +{ "_id" : "98112", "city" : "SEATTLE", "loc" : [ -122.297157, 47.630115 ], "pop" : 19760, "state" : "WA" } +{ "_id" : "98115", "city" : "SEATTLE", "loc" : [ -122.296828, 47.684918 ], "pop" : 40454, "state" : "WA" } +{ "_id" : "98116", "city" : "SEATTLE", "loc" : [ -122.393445, 47.574591 ], "pop" : 20408, "state" : "WA" } +{ "_id" : "98117", "city" : "SEATTLE", "loc" : [ -122.377223, 47.687263 ], "pop" : 28572, "state" : "WA" } +{ "_id" : "98118", "city" : "SEATTLE", "loc" : [ -122.275021, 47.541234 ], "pop" : 36684, "state" : "WA" } +{ "_id" : "98119", "city" : "SEATTLE", "loc" : [ -122.364272, 47.637917 ], "pop" : 19064, "state" : "WA" } +{ "_id" : "98121", "city" : "SEATTLE", "loc" : [ -122.344696, 47.615135 ], "pop" : 4091, "state" : "WA" } +{ "_id" : "98122", "city" : "SEATTLE", "loc" : [ -122.305608, 47.611633 ], "pop" : 25105, "state" : "WA" } +{ "_id" : "98125", "city" : "SEATTLE", "loc" : [ -122.301546, 47.717002 ], "pop" : 31928, "state" : "WA" } +{ "_id" : "98126", "city" : "SEATTLE", "loc" : [ -122.373458, 47.544361 ], "pop" : 18627, "state" : "WA" } +{ "_id" : "98133", "city" : "SEATTLE", "loc" : [ -122.343132, 47.737717 ], "pop" : 39634, "state" : "WA" } +{ "_id" : "98134", "city" : "SEATTLE", "loc" : [ -122.326346, 47.590276 ], "pop" : 1437, "state" : "WA" } +{ "_id" : "98136", "city" : "SEATTLE", "loc" : [ -122.387768, 47.539769 ], "pop" : 13816, "state" : "WA" } +{ "_id" : "98144", "city" : "SEATTLE", "loc" : [ -122.300457, 47.584624 ], "pop" : 23333, "state" : "WA" } +{ "_id" : "98146", "city" : "BURIEN", "loc" : [ -122.353989, 47.501069 ], "pop" : 25963, "state" : "WA" } +{ "_id" : "98148", "city" : "NORMANDY PARK", "loc" : [ -122.326112, 47.450209 ], "pop" : 8818, "state" : "WA" } +{ "_id" : "98155", "city" : "LK FOREST PARK", "loc" : [ -122.296305, 47.758161 ], "pop" : 38296, "state" : "WA" } +{ "_id" : "98158", "city" : "SEATAC", "loc" : [ -122.318454, 47.442739 ], "pop" : 97, "state" : "WA" } +{ "_id" : "98166", "city" : "NORMANDY PARK", "loc" : [ -122.347392, 47.455052 ], "pop" : 19331, "state" : "WA" } +{ "_id" : "98168", "city" : "TUKWILA", "loc" : [ -122.302376, 47.48851 ], "pop" : 27990, "state" : "WA" } +{ "_id" : "98177", "city" : "SEATTLE", "loc" : [ -122.368585, 47.746678 ], "pop" : 18532, "state" : "WA" } +{ "_id" : "98178", "city" : "TUKWILA", "loc" : [ -122.247366, 47.499489 ], "pop" : 19522, "state" : "WA" } +{ "_id" : "98188", "city" : "TUKWILA", "loc" : [ -122.281159, 47.449808 ], "pop" : 18001, "state" : "WA" } +{ "_id" : "98198", "city" : "DES MOINES", "loc" : [ -122.309559, 47.407286 ], "pop" : 20550, "state" : "WA" } +{ "_id" : "98199", "city" : "SEATTLE", "loc" : [ -122.396357, 47.648845 ], "pop" : 18360, "state" : "WA" } +{ "_id" : "98201", "city" : "EVERETT", "loc" : [ -122.200571, 47.988431 ], "pop" : 26440, "state" : "WA" } +{ "_id" : "98203", "city" : "EVERETT", "loc" : [ -122.221846, 47.941937 ], "pop" : 26506, "state" : "WA" } +{ "_id" : "98204", "city" : "EVERETT", "loc" : [ -122.247217, 47.901659 ], "pop" : 20496, "state" : "WA" } +{ "_id" : "98205", "city" : "EVERETT", "loc" : [ -122.115759, 47.990065 ], "pop" : 10083, "state" : "WA" } +{ "_id" : "98208", "city" : "EVERETT", "loc" : [ -122.198722, 47.894822 ], "pop" : 32818, "state" : "WA" } +{ "_id" : "98220", "city" : "ACME", "loc" : [ -122.191391, 48.675248 ], "pop" : 471, "state" : "WA" } +{ "_id" : "98221", "city" : "ANACORTES", "loc" : [ -122.630873, 48.500438 ], "pop" : 12986, "state" : "WA" } +{ "_id" : "98223", "city" : "ARLINGTON", "loc" : [ -122.112126, 48.18293 ], "pop" : 24435, "state" : "WA" } +{ "_id" : "98224", "city" : "BARING", "loc" : [ -121.44757, 47.757787 ], "pop" : 210, "state" : "WA" } +{ "_id" : "98225", "city" : "BELLINGHAM", "loc" : [ -122.488676, 48.748957 ], "pop" : 38415, "state" : "WA" } +{ "_id" : "98226", "city" : "BELLINGHAM", "loc" : [ -122.441457, 48.762763 ], "pop" : 38518, "state" : "WA" } +{ "_id" : "98230", "city" : "BLAINE", "loc" : [ -122.732327, 48.963572 ], "pop" : 7057, "state" : "WA" } +{ "_id" : "98232", "city" : "BOW", "loc" : [ -122.413438, 48.562037 ], "pop" : 3245, "state" : "WA" } +{ "_id" : "98233", "city" : "BURLINGTON", "loc" : [ -122.33449, 48.478577 ], "pop" : 9113, "state" : "WA" } +{ "_id" : "98236", "city" : "CLINTON", "loc" : [ -122.391588, 47.950845 ], "pop" : 3242, "state" : "WA" } +{ "_id" : "98237", "city" : "CONCRETE", "loc" : [ -121.664294, 48.530962 ], "pop" : 3217, "state" : "WA" } +{ "_id" : "98239", "city" : "COUPEVILLE", "loc" : [ -122.682346, 48.218911 ], "pop" : 5753, "state" : "WA" } +{ "_id" : "98240", "city" : "CUSTER", "loc" : [ -122.622571, 48.937412 ], "pop" : 2791, "state" : "WA" } +{ "_id" : "98241", "city" : "DARRINGTON", "loc" : [ -121.591807, 48.249285 ], "pop" : 1761, "state" : "WA" } +{ "_id" : "98244", "city" : "GLACIER", "loc" : [ -122.153957, 48.803366 ], "pop" : 2110, "state" : "WA" } +{ "_id" : "98245", "city" : "EASTSOUND", "loc" : [ -122.937045, 48.665554 ], "pop" : 2259, "state" : "WA" } +{ "_id" : "98247", "city" : "EVERSON", "loc" : [ -122.332474, 48.90447 ], "pop" : 6986, "state" : "WA" } +{ "_id" : "98248", "city" : "FERNDALE", "loc" : [ -122.595293, 48.862531 ], "pop" : 13697, "state" : "WA" } +{ "_id" : "98249", "city" : "FREELAND", "loc" : [ -122.564086, 48.03417 ], "pop" : 2321, "state" : "WA" } +{ "_id" : "98250", "city" : "FRIDAY HARBOR", "loc" : [ -123.094717, 48.545416 ], "pop" : 2508, "state" : "WA" } +{ "_id" : "98252", "city" : "GRANITE FALLS", "loc" : [ -121.942752, 48.078977 ], "pop" : 3634, "state" : "WA" } +{ "_id" : "98253", "city" : "GREENBANK", "loc" : [ -122.587086, 48.124432 ], "pop" : 926, "state" : "WA" } +{ "_id" : "98257", "city" : "LA CONNER", "loc" : [ -122.53134, 48.409306 ], "pop" : 3154, "state" : "WA" } +{ "_id" : "98258", "city" : "LAKE STEVENS", "loc" : [ -122.067153, 48.017103 ], "pop" : 12728, "state" : "WA" } +{ "_id" : "98260", "city" : "LANGLEY", "loc" : [ -122.452992, 48.018672 ], "pop" : 6036, "state" : "WA" } +{ "_id" : "98261", "city" : "LOPEZ", "loc" : [ -122.967434, 48.520804 ], "pop" : 4147, "state" : "WA" } +{ "_id" : "98262", "city" : "LUMMI ISLAND", "loc" : [ -122.682285, 48.712765 ], "pop" : 628, "state" : "WA" } +{ "_id" : "98263", "city" : "LYMAN", "loc" : [ -122.016183, 48.525744 ], "pop" : 1887, "state" : "WA" } +{ "_id" : "98264", "city" : "LYNDEN", "loc" : [ -122.459153, 48.937225 ], "pop" : 12896, "state" : "WA" } +{ "_id" : "98270", "city" : "MARYSVILLE", "loc" : [ -122.156168, 48.065639 ], "pop" : 19966, "state" : "WA" } +{ "_id" : "98271", "city" : "MARYSVILLE", "loc" : [ -122.197956, 48.096572 ], "pop" : 19743, "state" : "WA" } +{ "_id" : "98272", "city" : "MONROE", "loc" : [ -121.947376, 47.85853 ], "pop" : 14143, "state" : "WA" } +{ "_id" : "98273", "city" : "MOUNT VERNON", "loc" : [ -122.326548, 48.416427 ], "pop" : 30295, "state" : "WA" } +{ "_id" : "98275", "city" : "MUKILTEO", "loc" : [ -122.301906, 47.919896 ], "pop" : 10373, "state" : "WA" } +{ "_id" : "98277", "city" : "OAK HARBOR", "loc" : [ -122.637439, 48.315096 ], "pop" : 32450, "state" : "WA" } +{ "_id" : "98278", "city" : "WHIDBEY ISLAND N", "loc" : [ -122.69005, 48.295271 ], "pop" : 3434, "state" : "WA" } +{ "_id" : "98279", "city" : "OLGA", "loc" : [ -122.836224, 48.655526 ], "pop" : 1029, "state" : "WA" } +{ "_id" : "98281", "city" : "POINT ROBERTS", "loc" : [ -123.055474, 48.987876 ], "pop" : 923, "state" : "WA" } +{ "_id" : "98283", "city" : "ROCKPORT", "loc" : [ -121.555352, 48.470388 ], "pop" : 157, "state" : "WA" } +{ "_id" : "98284", "city" : "SEDRO WOOLLEY", "loc" : [ -122.232943, 48.527405 ], "pop" : 14902, "state" : "WA" } +{ "_id" : "98288", "city" : "SKYKOMISH", "loc" : [ -121.371297, 47.692158 ], "pop" : 388, "state" : "WA" } +{ "_id" : "98290", "city" : "SNOHOMISH", "loc" : [ -122.071562, 47.895381 ], "pop" : 37327, "state" : "WA" } +{ "_id" : "98292", "city" : "STANWOOD", "loc" : [ -122.377978, 48.201067 ], "pop" : 19288, "state" : "WA" } +{ "_id" : "98294", "city" : "SULTAN", "loc" : [ -121.736869, 47.858942 ], "pop" : 7010, "state" : "WA" } +{ "_id" : "98295", "city" : "SUMAS", "loc" : [ -122.207425, 48.970763 ], "pop" : 2537, "state" : "WA" } +{ "_id" : "98303", "city" : "ANDERSON ISLAND", "loc" : [ -122.696025, 47.15872 ], "pop" : 548, "state" : "WA" } +{ "_id" : "98304", "city" : "ASHFORD", "loc" : [ -121.989791, 46.753121 ], "pop" : 339, "state" : "WA" } +{ "_id" : "98305", "city" : "BEAVER", "loc" : [ -124.305424, 48.067263 ], "pop" : 695, "state" : "WA" } +{ "_id" : "98310", "city" : "BREMERTON", "loc" : [ -122.629913, 47.601916 ], "pop" : 49057, "state" : "WA" } +{ "_id" : "98312", "city" : "BREMERTON", "loc" : [ -122.695786, 47.575424 ], "pop" : 28858, "state" : "WA" } +{ "_id" : "98314", "city" : "PUGET SOUND NAVA", "loc" : [ -122.724354, 47.746255 ], "pop" : 708, "state" : "WA" } +{ "_id" : "98315", "city" : "SILVERDALE", "loc" : [ -122.716106, 47.692017 ], "pop" : 3702, "state" : "WA" } +{ "_id" : "98320", "city" : "BRINNON", "loc" : [ -122.937509, 47.677596 ], "pop" : 1049, "state" : "WA" } +{ "_id" : "98321", "city" : "BUCKLEY", "loc" : [ -122.062098, 47.152449 ], "pop" : 10153, "state" : "WA" } +{ "_id" : "98323", "city" : "CARBONADO", "loc" : [ -122.051339, 47.080242 ], "pop" : 495, "state" : "WA" } +{ "_id" : "98325", "city" : "CHIMACUM", "loc" : [ -122.788323, 47.98607 ], "pop" : 1191, "state" : "WA" } +{ "_id" : "98326", "city" : "CLALLAM BAY", "loc" : [ -124.201512, 48.225486 ], "pop" : 384, "state" : "WA" } +{ "_id" : "98328", "city" : "EATONVILLE", "loc" : [ -122.269626, 46.870778 ], "pop" : 3972, "state" : "WA" } +{ "_id" : "98329", "city" : "GIG HARBOR", "loc" : [ -122.7, 47.378579 ], "pop" : 6678, "state" : "WA" } +{ "_id" : "98330", "city" : "ELBE", "loc" : [ -122.150344, 46.766607 ], "pop" : 103, "state" : "WA" } +{ "_id" : "98331", "city" : "FORKS", "loc" : [ -124.398949, 47.928732 ], "pop" : 6657, "state" : "WA" } +{ "_id" : "98332", "city" : "GIG HARBOR", "loc" : [ -122.600144, 47.3607 ], "pop" : 9138, "state" : "WA" } +{ "_id" : "98333", "city" : "FOX ISLAND", "loc" : [ -122.628579, 47.25238 ], "pop" : 2017, "state" : "WA" } +{ "_id" : "98335", "city" : "GIG HARBOR", "loc" : [ -122.608377, 47.300154 ], "pop" : 17299, "state" : "WA" } +{ "_id" : "98336", "city" : "GLENOMA", "loc" : [ -122.099014, 46.528266 ], "pop" : 657, "state" : "WA" } +{ "_id" : "98338", "city" : "GRAHAM", "loc" : [ -122.293648, 47.024575 ], "pop" : 11136, "state" : "WA" } +{ "_id" : "98339", "city" : "PORT HADLOCK", "loc" : [ -122.768151, 48.034531 ], "pop" : 2574, "state" : "WA" } +{ "_id" : "98340", "city" : "HANSVILLE", "loc" : [ -122.565509, 47.906143 ], "pop" : 1256, "state" : "WA" } +{ "_id" : "98346", "city" : "KINGSTON", "loc" : [ -122.525503, 47.810844 ], "pop" : 5507, "state" : "WA" } +{ "_id" : "98349", "city" : "HOME", "loc" : [ -122.74273, 47.247366 ], "pop" : 3373, "state" : "WA" } +{ "_id" : "98351", "city" : "LONGBRANCH", "loc" : [ -122.756126, 47.200737 ], "pop" : 733, "state" : "WA" } +{ "_id" : "98354", "city" : "MILTON", "loc" : [ -122.315514, 47.24827 ], "pop" : 3562, "state" : "WA" } +{ "_id" : "98355", "city" : "MINERAL", "loc" : [ -122.186056, 46.709635 ], "pop" : 814, "state" : "WA" } +{ "_id" : "98356", "city" : "MORTON", "loc" : [ -122.249573, 46.558056 ], "pop" : 2530, "state" : "WA" } +{ "_id" : "98358", "city" : "NORDLAND", "loc" : [ -122.692553, 48.04321 ], "pop" : 738, "state" : "WA" } +{ "_id" : "98359", "city" : "OLALLA", "loc" : [ -122.574512, 47.424088 ], "pop" : 3173, "state" : "WA" } +{ "_id" : "98360", "city" : "ORTING", "loc" : [ -122.185978, 47.082206 ], "pop" : 4493, "state" : "WA" } +{ "_id" : "98361", "city" : "PACKWOOD", "loc" : [ -121.655254, 46.650038 ], "pop" : 495, "state" : "WA" } +{ "_id" : "98362", "city" : "PORT ANGELES", "loc" : [ -123.438442, 48.106489 ], "pop" : 30373, "state" : "WA" } +{ "_id" : "98365", "city" : "PORT LUDLOW", "loc" : [ -122.689615, 47.922192 ], "pop" : 2229, "state" : "WA" } +{ "_id" : "98366", "city" : "SOUTH PARK VILLA", "loc" : [ -122.615276, 47.504838 ], "pop" : 44359, "state" : "WA" } +{ "_id" : "98368", "city" : "PORT TOWNSEND", "loc" : [ -122.794457, 48.104012 ], "pop" : 9870, "state" : "WA" } +{ "_id" : "98370", "city" : "POULSBO", "loc" : [ -122.627721, 47.742278 ], "pop" : 20554, "state" : "WA" } +{ "_id" : "98371", "city" : "PUYALLUP", "loc" : [ -122.315097, 47.199123 ], "pop" : 18207, "state" : "WA" } +{ "_id" : "98372", "city" : "PUYALLUP", "loc" : [ -122.273415, 47.204202 ], "pop" : 17053, "state" : "WA" } +{ "_id" : "98373", "city" : "PUYALLUP", "loc" : [ -122.321868, 47.128363 ], "pop" : 23219, "state" : "WA" } +{ "_id" : "98374", "city" : "PUYALLUP", "loc" : [ -122.265248, 47.142427 ], "pop" : 21982, "state" : "WA" } +{ "_id" : "98376", "city" : "QUILCENE", "loc" : [ -122.858304, 47.832429 ], "pop" : 1592, "state" : "WA" } +{ "_id" : "98377", "city" : "RANDLE", "loc" : [ -121.855533, 46.549195 ], "pop" : 2620, "state" : "WA" } +{ "_id" : "98380", "city" : "SEABECK", "loc" : [ -122.822685, 47.625497 ], "pop" : 2555, "state" : "WA" } +{ "_id" : "98381", "city" : "SEKIU", "loc" : [ -124.468467, 48.303166 ], "pop" : 2582, "state" : "WA" } +{ "_id" : "98382", "city" : "SEQUIM", "loc" : [ -123.119814, 48.088136 ], "pop" : 16523, "state" : "WA" } +{ "_id" : "98383", "city" : "SILVERDALE", "loc" : [ -122.698054, 47.662139 ], "pop" : 12276, "state" : "WA" } +{ "_id" : "98387", "city" : "SPANAWAY", "loc" : [ -122.394336, 47.073218 ], "pop" : 24035, "state" : "WA" } +{ "_id" : "98388", "city" : "STEILACOOM", "loc" : [ -122.588837, 47.170369 ], "pop" : 6099, "state" : "WA" } +{ "_id" : "98390", "city" : "BONNEY LAKE", "loc" : [ -122.180275, 47.188801 ], "pop" : 35436, "state" : "WA" } +{ "_id" : "98392", "city" : "SUQUAMISH", "loc" : [ -122.557295, 47.734303 ], "pop" : 1880, "state" : "WA" } +{ "_id" : "98394", "city" : "VAUGHN", "loc" : [ -122.773598, 47.330921 ], "pop" : 804, "state" : "WA" } +{ "_id" : "98402", "city" : "TACOMA", "loc" : [ -122.440536, 47.254508 ], "pop" : 2994, "state" : "WA" } +{ "_id" : "98403", "city" : "TACOMA", "loc" : [ -122.457538, 47.26428 ], "pop" : 7493, "state" : "WA" } +{ "_id" : "98404", "city" : "TACOMA", "loc" : [ -122.412625, 47.211312 ], "pop" : 27135, "state" : "WA" } +{ "_id" : "98405", "city" : "TACOMA", "loc" : [ -122.46435, 47.248351 ], "pop" : 23918, "state" : "WA" } +{ "_id" : "98406", "city" : "TACOMA", "loc" : [ -122.499349, 47.26325 ], "pop" : 22971, "state" : "WA" } +{ "_id" : "98407", "city" : "TACOMA", "loc" : [ -122.503881, 47.282479 ], "pop" : 19881, "state" : "WA" } +{ "_id" : "98408", "city" : "TACOMA", "loc" : [ -122.444381, 47.207267 ], "pop" : 28753, "state" : "WA" } +{ "_id" : "98409", "city" : "TACOMA", "loc" : [ -122.482503, 47.20381 ], "pop" : 25045, "state" : "WA" } +{ "_id" : "98421", "city" : "TACOMA", "loc" : [ -122.401457, 47.266373 ], "pop" : 508, "state" : "WA" } +{ "_id" : "98422", "city" : "TACOMA", "loc" : [ -122.398349, 47.294805 ], "pop" : 10385, "state" : "WA" } +{ "_id" : "98424", "city" : "FIFE", "loc" : [ -122.350962, 47.243632 ], "pop" : 5626, "state" : "WA" } +{ "_id" : "98433", "city" : "FORT LEWIS", "loc" : [ -122.583486, 47.100864 ], "pop" : 27463, "state" : "WA" } +{ "_id" : "98439", "city" : "LAKEWOOD CENTER", "loc" : [ -122.529326, 47.122905 ], "pop" : 3064, "state" : "WA" } +{ "_id" : "98443", "city" : "TACOMA", "loc" : [ -122.372815, 47.204369 ], "pop" : 5457, "state" : "WA" } +{ "_id" : "98444", "city" : "PARKLAND", "loc" : [ -122.448842, 47.156553 ], "pop" : 27406, "state" : "WA" } +{ "_id" : "98445", "city" : "PARKLAND", "loc" : [ -122.411614, 47.133967 ], "pop" : 20298, "state" : "WA" } +{ "_id" : "98446", "city" : "PARKLAND", "loc" : [ -122.37189, 47.14041 ], "pop" : 7156, "state" : "WA" } +{ "_id" : "98465", "city" : "TACOMA", "loc" : [ -122.527272, 47.249139 ], "pop" : 6919, "state" : "WA" } +{ "_id" : "98466", "city" : "FIRCREST", "loc" : [ -122.53503, 47.22788 ], "pop" : 22719, "state" : "WA" } +{ "_id" : "98467", "city" : "TACOMA", "loc" : [ -122.533562, 47.205395 ], "pop" : 12823, "state" : "WA" } +{ "_id" : "98498", "city" : "LAKEWOOD CENTER", "loc" : [ -122.555357, 47.164269 ], "pop" : 28193, "state" : "WA" } +{ "_id" : "98499", "city" : "LAKEWOOD CENTER", "loc" : [ -122.509074, 47.160786 ], "pop" : 20970, "state" : "WA" } +{ "_id" : "98501", "city" : "OLYMPIA", "loc" : [ -122.876311, 47.012906 ], "pop" : 25979, "state" : "WA" } +{ "_id" : "98502", "city" : "OLYMPIA", "loc" : [ -122.95214, 47.029828 ], "pop" : 40246, "state" : "WA" } +{ "_id" : "98503", "city" : "LACEY", "loc" : [ -122.782665, 47.023967 ], "pop" : 43492, "state" : "WA" } +{ "_id" : "98506", "city" : "LACEY", "loc" : [ -122.832844, 47.076259 ], "pop" : 24889, "state" : "WA" } +{ "_id" : "98520", "city" : "ABERDEEN", "loc" : [ -123.79629, 46.984293 ], "pop" : 22346, "state" : "WA" } +{ "_id" : "98524", "city" : "ALLYN", "loc" : [ -122.853571, 47.385004 ], "pop" : 2049, "state" : "WA" } +{ "_id" : "98526", "city" : "AMANDA PARK", "loc" : [ -123.907375, 47.470579 ], "pop" : 470, "state" : "WA" } +{ "_id" : "98528", "city" : "BEAR CREEK", "loc" : [ -122.822381, 47.454956 ], "pop" : 2351, "state" : "WA" } +{ "_id" : "98531", "city" : "CENTRALIA", "loc" : [ -122.967068, 46.724635 ], "pop" : 17633, "state" : "WA" } +{ "_id" : "98532", "city" : "CHEHALIS", "loc" : [ -122.965764, 46.638193 ], "pop" : 18065, "state" : "WA" } +{ "_id" : "98533", "city" : "CINEBAR", "loc" : [ -122.566005, 46.567131 ], "pop" : 796, "state" : "WA" } +{ "_id" : "98535", "city" : "COPALIS BEACH", "loc" : [ -124.135881, 47.065044 ], "pop" : 703, "state" : "WA" } +{ "_id" : "98536", "city" : "COPALIS CROSSING", "loc" : [ -124.13471, 47.12535 ], "pop" : 685, "state" : "WA" } +{ "_id" : "98537", "city" : "COSMOPOLIS", "loc" : [ -123.77394, 46.953789 ], "pop" : 1424, "state" : "WA" } +{ "_id" : "98538", "city" : "CURTIS", "loc" : [ -123.156974, 46.558372 ], "pop" : 449, "state" : "WA" } +{ "_id" : "98541", "city" : "ELMA", "loc" : [ -123.39969, 47.005813 ], "pop" : 7356, "state" : "WA" } +{ "_id" : "98542", "city" : "ETHEL", "loc" : [ -122.776009, 46.53581 ], "pop" : 320, "state" : "WA" } +{ "_id" : "98546", "city" : "GRAPEVIEW", "loc" : [ -122.949742, 47.305783 ], "pop" : 3234, "state" : "WA" } +{ "_id" : "98547", "city" : "GRAYLAND", "loc" : [ -124.056194, 46.853201 ], "pop" : 1677, "state" : "WA" } +{ "_id" : "98548", "city" : "HOODSPORT", "loc" : [ -123.173932, 47.423526 ], "pop" : 1165, "state" : "WA" } +{ "_id" : "98550", "city" : "HOQUIAM", "loc" : [ -123.884169, 46.982269 ], "pop" : 9597, "state" : "WA" } +{ "_id" : "98552", "city" : "HUMPTULIPS", "loc" : [ -123.971695, 47.135632 ], "pop" : 1301, "state" : "WA" } +{ "_id" : "98555", "city" : "LILLIWAUP", "loc" : [ -123.063119, 47.512773 ], "pop" : 635, "state" : "WA" } +{ "_id" : "98557", "city" : "MC CLEARY", "loc" : [ -123.273301, 47.053987 ], "pop" : 2644, "state" : "WA" } +{ "_id" : "98560", "city" : "MATLOCK", "loc" : [ -123.337638, 47.177545 ], "pop" : 1716, "state" : "WA" } +{ "_id" : "98562", "city" : "MOCLIPS", "loc" : [ -124.20438, 47.222619 ], "pop" : 574, "state" : "WA" } +{ "_id" : "98563", "city" : "MONTESANO", "loc" : [ -123.500584, 47.09013 ], "pop" : 10079, "state" : "WA" } +{ "_id" : "98564", "city" : "MOSSYROCK", "loc" : [ -122.478935, 46.513136 ], "pop" : 1390, "state" : "WA" } +{ "_id" : "98568", "city" : "OAKVILLE", "loc" : [ -123.249329, 46.843366 ], "pop" : 1915, "state" : "WA" } +{ "_id" : "98569", "city" : "OCEAN CITY", "loc" : [ -124.15323, 46.982905 ], "pop" : 2307, "state" : "WA" } +{ "_id" : "98570", "city" : "ONALASKA", "loc" : [ -122.707503, 46.573016 ], "pop" : 3077, "state" : "WA" } +{ "_id" : "98571", "city" : "PACIFIC BEACH", "loc" : [ -124.158833, 47.198144 ], "pop" : 122, "state" : "WA" } +{ "_id" : "98572", "city" : "PE ELL", "loc" : [ -123.285244, 46.56558 ], "pop" : 921, "state" : "WA" } +{ "_id" : "98575", "city" : "QUINAULT", "loc" : [ -123.803744, 47.448505 ], "pop" : 545, "state" : "WA" } +{ "_id" : "98576", "city" : "RAINIER", "loc" : [ -122.679468, 46.882942 ], "pop" : 2397, "state" : "WA" } +{ "_id" : "98577", "city" : "RAYMOND", "loc" : [ -123.692889, 46.671046 ], "pop" : 6144, "state" : "WA" } +{ "_id" : "98579", "city" : "ROCHESTER", "loc" : [ -123.040634, 46.819295 ], "pop" : 8231, "state" : "WA" } +{ "_id" : "98580", "city" : "ROY", "loc" : [ -122.448271, 46.956048 ], "pop" : 7730, "state" : "WA" } +{ "_id" : "98581", "city" : "RYDERWOOD", "loc" : [ -123.043134, 46.375176 ], "pop" : 330, "state" : "WA" } +{ "_id" : "98582", "city" : "SALKUM", "loc" : [ -122.645364, 46.515059 ], "pop" : 336, "state" : "WA" } +{ "_id" : "98584", "city" : "SHELTON", "loc" : [ -123.072862, 47.20863 ], "pop" : 19074, "state" : "WA" } +{ "_id" : "98585", "city" : "SILVER CREEK", "loc" : [ -122.475716, 46.549077 ], "pop" : 697, "state" : "WA" } +{ "_id" : "98586", "city" : "SOUTH BEND", "loc" : [ -123.820315, 46.6544 ], "pop" : 2575, "state" : "WA" } +{ "_id" : "98587", "city" : "TAHOLAH", "loc" : [ -124.2827, 47.340711 ], "pop" : 851, "state" : "WA" } +{ "_id" : "98588", "city" : "TAHUYA", "loc" : [ -122.921126, 47.435618 ], "pop" : 3794, "state" : "WA" } +{ "_id" : "98589", "city" : "TENINO", "loc" : [ -122.849269, 46.864119 ], "pop" : 6451, "state" : "WA" } +{ "_id" : "98590", "city" : "TOKELAND", "loc" : [ -124.046008, 46.746874 ], "pop" : 891, "state" : "WA" } +{ "_id" : "98591", "city" : "TOLEDO", "loc" : [ -122.826559, 46.439552 ], "pop" : 2829, "state" : "WA" } +{ "_id" : "98592", "city" : "UNION", "loc" : [ -123.034364, 47.351305 ], "pop" : 1592, "state" : "WA" } +{ "_id" : "98593", "city" : "VADER", "loc" : [ -122.958493, 46.398505 ], "pop" : 523, "state" : "WA" } +{ "_id" : "98595", "city" : "WESTPORT", "loc" : [ -124.106055, 46.883619 ], "pop" : 2463, "state" : "WA" } +{ "_id" : "98596", "city" : "WINLOCK", "loc" : [ -122.915806, 46.494014 ], "pop" : 5206, "state" : "WA" } +{ "_id" : "98597", "city" : "YELM", "loc" : [ -122.588049, 46.920589 ], "pop" : 9553, "state" : "WA" } +{ "_id" : "98601", "city" : "AMBOY", "loc" : [ -122.457418, 45.9195 ], "pop" : 1910, "state" : "WA" } +{ "_id" : "98602", "city" : "APPLETON", "loc" : [ -121.148618, 45.909041 ], "pop" : 13, "state" : "WA" } +{ "_id" : "98603", "city" : "ARIEL", "loc" : [ -122.46769, 45.995154 ], "pop" : 735, "state" : "WA" } +{ "_id" : "98604", "city" : "BATTLE GROUND", "loc" : [ -122.531845, 45.790667 ], "pop" : 16072, "state" : "WA" } +{ "_id" : "98605", "city" : "COOK", "loc" : [ -121.175778, 45.6341 ], "pop" : 954, "state" : "WA" } +{ "_id" : "98606", "city" : "BRUSH PRAIRIE", "loc" : [ -122.484342, 45.730432 ], "pop" : 6663, "state" : "WA" } +{ "_id" : "98607", "city" : "CAMAS", "loc" : [ -122.414231, 45.605772 ], "pop" : 12058, "state" : "WA" } +{ "_id" : "98610", "city" : "CARSON", "loc" : [ -121.835138, 45.749332 ], "pop" : 2009, "state" : "WA" } +{ "_id" : "98611", "city" : "CASTLE ROCK", "loc" : [ -122.9139, 46.278291 ], "pop" : 8455, "state" : "WA" } +{ "_id" : "98612", "city" : "CATHLAMET", "loc" : [ -123.362716, 46.195383 ], "pop" : 2114, "state" : "WA" } +{ "_id" : "98613", "city" : "CENTERVILLE", "loc" : [ -120.945973, 45.703183 ], "pop" : 681, "state" : "WA" } +{ "_id" : "98616", "city" : "COUGAR", "loc" : [ -122.294186, 46.069012 ], "pop" : 122, "state" : "WA" } +{ "_id" : "98619", "city" : "GLENWOOD", "loc" : [ -121.28849, 46.007104 ], "pop" : 549, "state" : "WA" } +{ "_id" : "98620", "city" : "GOLDENDALE", "loc" : [ -120.812981, 45.832021 ], "pop" : 5761, "state" : "WA" } +{ "_id" : "98621", "city" : "GRAYS RIVER", "loc" : [ -123.588845, 46.353481 ], "pop" : 209, "state" : "WA" } +{ "_id" : "98624", "city" : "ILWACO", "loc" : [ -124.02822, 46.314214 ], "pop" : 1210, "state" : "WA" } +{ "_id" : "98625", "city" : "KALAMA", "loc" : [ -122.816588, 46.011229 ], "pop" : 3627, "state" : "WA" } +{ "_id" : "98626", "city" : "KELSO", "loc" : [ -122.886994, 46.148491 ], "pop" : 20593, "state" : "WA" } +{ "_id" : "98628", "city" : "KLICKITAT", "loc" : [ -121.229231, 45.751534 ], "pop" : 23, "state" : "WA" } +{ "_id" : "98629", "city" : "LA CENTER", "loc" : [ -122.623972, 45.880587 ], "pop" : 3969, "state" : "WA" } +{ "_id" : "98631", "city" : "LONG BEACH", "loc" : [ -124.047041, 46.377369 ], "pop" : 3648, "state" : "WA" } +{ "_id" : "98632", "city" : "LONGVIEW", "loc" : [ -122.963421, 46.151354 ], "pop" : 42028, "state" : "WA" } +{ "_id" : "98635", "city" : "LYLE", "loc" : [ -121.250112, 45.74495 ], "pop" : 1583, "state" : "WA" } +{ "_id" : "98638", "city" : "NASELLE", "loc" : [ -123.804381, 46.352758 ], "pop" : 2177, "state" : "WA" } +{ "_id" : "98640", "city" : "OCEAN PARK", "loc" : [ -124.043582, 46.502867 ], "pop" : 2601, "state" : "WA" } +{ "_id" : "98642", "city" : "RIDGEFIELD", "loc" : [ -122.693354, 45.784634 ], "pop" : 7845, "state" : "WA" } +{ "_id" : "98643", "city" : "ROSBURG", "loc" : [ -123.657105, 46.307076 ], "pop" : 279, "state" : "WA" } +{ "_id" : "98645", "city" : "SILVERLAKE", "loc" : [ -122.764886, 46.316322 ], "pop" : 927, "state" : "WA" } +{ "_id" : "98647", "city" : "SKAMOKAWA", "loc" : [ -123.43316, 46.295186 ], "pop" : 361, "state" : "WA" } +{ "_id" : "98648", "city" : "STEVENSON", "loc" : [ -121.909346, 45.688173 ], "pop" : 3203, "state" : "WA" } +{ "_id" : "98649", "city" : "TOUTLE", "loc" : [ -122.647696, 46.295605 ], "pop" : 599, "state" : "WA" } +{ "_id" : "98650", "city" : "TROUT LAKE", "loc" : [ -121.516272, 45.982789 ], "pop" : 766, "state" : "WA" } +{ "_id" : "98651", "city" : "UNDERWOOD", "loc" : [ -121.597408, 45.740872 ], "pop" : 1161, "state" : "WA" } +{ "_id" : "98660", "city" : "VANCOUVER", "loc" : [ -122.68014, 45.64183 ], "pop" : 10432, "state" : "WA" } +{ "_id" : "98661", "city" : "VANCOUVER", "loc" : [ -122.625146, 45.641807 ], "pop" : 28837, "state" : "WA" } +{ "_id" : "98662", "city" : "ORCHARDS", "loc" : [ -122.576182, 45.674519 ], "pop" : 17842, "state" : "WA" } +{ "_id" : "98663", "city" : "VANCOUVER", "loc" : [ -122.660385, 45.6514 ], "pop" : 13198, "state" : "WA" } +{ "_id" : "98664", "city" : "VANCOUVER", "loc" : [ -122.576741, 45.623086 ], "pop" : 17179, "state" : "WA" } +{ "_id" : "98665", "city" : "HAZEL DELL", "loc" : [ -122.664223, 45.68217 ], "pop" : 16488, "state" : "WA" } +{ "_id" : "98670", "city" : "WAHKIACUS", "loc" : [ -121.148586, 45.815567 ], "pop" : 442, "state" : "WA" } +{ "_id" : "98671", "city" : "WASHOUGAL", "loc" : [ -122.310396, 45.595921 ], "pop" : 10873, "state" : "WA" } +{ "_id" : "98672", "city" : "WHITE SALMON", "loc" : [ -121.479459, 45.755142 ], "pop" : 5396, "state" : "WA" } +{ "_id" : "98674", "city" : "WOODLAND", "loc" : [ -122.71256, 45.921859 ], "pop" : 6266, "state" : "WA" } +{ "_id" : "98675", "city" : "YACOLT", "loc" : [ -122.427545, 45.862247 ], "pop" : 3295, "state" : "WA" } +{ "_id" : "98682", "city" : "VANCOUVER", "loc" : [ -122.521224, 45.664399 ], "pop" : 21359, "state" : "WA" } +{ "_id" : "98684", "city" : "CASCADE PARK", "loc" : [ -122.524969, 45.617522 ], "pop" : 26400, "state" : "WA" } +{ "_id" : "98685", "city" : "FELIDA", "loc" : [ -122.682474, 45.707313 ], "pop" : 13972, "state" : "WA" } +{ "_id" : "98686", "city" : "VANCOUVER", "loc" : [ -122.632226, 45.712017 ], "pop" : 9966, "state" : "WA" } +{ "_id" : "98801", "city" : "WENATCHEE", "loc" : [ -120.327345, 47.425269 ], "pop" : 28906, "state" : "WA" } +{ "_id" : "98802", "city" : "EAST WENATCHEE", "loc" : [ -120.273136, 47.418596 ], "pop" : 17975, "state" : "WA" } +{ "_id" : "98812", "city" : "BREWSTER", "loc" : [ -119.771999, 48.120641 ], "pop" : 3177, "state" : "WA" } +{ "_id" : "98813", "city" : "BRIDGEPORT", "loc" : [ -119.702772, 48.016083 ], "pop" : 2757, "state" : "WA" } +{ "_id" : "98814", "city" : "CARLTON", "loc" : [ -120.10551, 48.252615 ], "pop" : 332, "state" : "WA" } +{ "_id" : "98815", "city" : "CASHMERE", "loc" : [ -120.503274, 47.517293 ], "pop" : 7504, "state" : "WA" } +{ "_id" : "98816", "city" : "CHELAN", "loc" : [ -120.027306, 47.848263 ], "pop" : 4949, "state" : "WA" } +{ "_id" : "98822", "city" : "ENTIAT", "loc" : [ -120.276031, 47.705653 ], "pop" : 1507, "state" : "WA" } +{ "_id" : "98823", "city" : "EPHRATA", "loc" : [ -119.533582, 47.277051 ], "pop" : 8779, "state" : "WA" } +{ "_id" : "98826", "city" : "LEAVENWORTH", "loc" : [ -120.674792, 47.6438 ], "pop" : 4288, "state" : "WA" } +{ "_id" : "98827", "city" : "LOOMIS", "loc" : [ -119.642675, 48.869627 ], "pop" : 329, "state" : "WA" } +{ "_id" : "98828", "city" : "MALAGA", "loc" : [ -120.208562, 47.355306 ], "pop" : 1633, "state" : "WA" } +{ "_id" : "98830", "city" : "MANSFIELD", "loc" : [ -119.405315, 47.902136 ], "pop" : 960, "state" : "WA" } +{ "_id" : "98831", "city" : "MANSON", "loc" : [ -120.148963, 47.895764 ], "pop" : 2309, "state" : "WA" } +{ "_id" : "98832", "city" : "MARLIN", "loc" : [ -119.090897, 47.320929 ], "pop" : 856, "state" : "WA" } +{ "_id" : "98833", "city" : "MAZAMA", "loc" : [ -120.38796, 48.597728 ], "pop" : 115, "state" : "WA" } +{ "_id" : "98834", "city" : "METHOW", "loc" : [ -120.0059, 48.09001 ], "pop" : 623, "state" : "WA" } +{ "_id" : "98837", "city" : "MOSES LAKE", "loc" : [ -119.289149, 47.137363 ], "pop" : 22935, "state" : "WA" } +{ "_id" : "98840", "city" : "OKANOGAN", "loc" : [ -119.604563, 48.351328 ], "pop" : 3782, "state" : "WA" } +{ "_id" : "98841", "city" : "OMAK", "loc" : [ -119.527156, 48.414347 ], "pop" : 6059, "state" : "WA" } +{ "_id" : "98843", "city" : "ORONDO", "loc" : [ -120.172143, 47.696928 ], "pop" : 1424, "state" : "WA" } +{ "_id" : "98844", "city" : "OROVILLE", "loc" : [ -119.403236, 48.939681 ], "pop" : 3283, "state" : "WA" } +{ "_id" : "98845", "city" : "PALISADES", "loc" : [ -119.802264, 47.469367 ], "pop" : 36, "state" : "WA" } +{ "_id" : "98846", "city" : "PATEROS", "loc" : [ -119.913322, 48.059147 ], "pop" : 696, "state" : "WA" } +{ "_id" : "98847", "city" : "PESHASTIN", "loc" : [ -120.613928, 47.581294 ], "pop" : 1030, "state" : "WA" } +{ "_id" : "98848", "city" : "QUINCY", "loc" : [ -119.845922, 47.197574 ], "pop" : 7429, "state" : "WA" } +{ "_id" : "98849", "city" : "RIVERSIDE", "loc" : [ -119.580316, 48.487567 ], "pop" : 1871, "state" : "WA" } +{ "_id" : "98850", "city" : "ROCK ISLAND", "loc" : [ -120.137794, 47.370558 ], "pop" : 1336, "state" : "WA" } +{ "_id" : "98851", "city" : "SOAP LAKE", "loc" : [ -119.485962, 47.383034 ], "pop" : 2482, "state" : "WA" } +{ "_id" : "98852", "city" : "STEHEKIN", "loc" : [ -120.755185, 48.298034 ], "pop" : 124, "state" : "WA" } +{ "_id" : "98855", "city" : "TONASKET", "loc" : [ -119.394252, 48.71944 ], "pop" : 4921, "state" : "WA" } +{ "_id" : "98856", "city" : "TWISP", "loc" : [ -120.135035, 48.363231 ], "pop" : 1938, "state" : "WA" } +{ "_id" : "98857", "city" : "WARDEN", "loc" : [ -119.053932, 46.97697 ], "pop" : 2678, "state" : "WA" } +{ "_id" : "98858", "city" : "WATERVILLE", "loc" : [ -119.988743, 47.62951 ], "pop" : 1717, "state" : "WA" } +{ "_id" : "98859", "city" : "WAUCONDA", "loc" : [ -118.946947, 48.822449 ], "pop" : 325, "state" : "WA" } +{ "_id" : "98862", "city" : "WINTHROP", "loc" : [ -120.180468, 48.475607 ], "pop" : 1263, "state" : "WA" } +{ "_id" : "98901", "city" : "TERRACE HEIGHTS", "loc" : [ -120.477336, 46.606991 ], "pop" : 22057, "state" : "WA" } +{ "_id" : "98902", "city" : "YAKIMA", "loc" : [ -120.531084, 46.593393 ], "pop" : 39091, "state" : "WA" } +{ "_id" : "98903", "city" : "UNION GAP", "loc" : [ -120.556587, 46.5572 ], "pop" : 10498, "state" : "WA" } +{ "_id" : "98908", "city" : "WIDE HOLLOW", "loc" : [ -120.605175, 46.605865 ], "pop" : 27078, "state" : "WA" } +{ "_id" : "98922", "city" : "CLE ELUM", "loc" : [ -120.968505, 47.206319 ], "pop" : 5299, "state" : "WA" } +{ "_id" : "98923", "city" : "COWICHE", "loc" : [ -120.714893, 46.66611 ], "pop" : 920, "state" : "WA" } +{ "_id" : "98926", "city" : "ELLENSBURG", "loc" : [ -120.516274, 46.999632 ], "pop" : 20344, "state" : "WA" } +{ "_id" : "98930", "city" : "GRANDVIEW", "loc" : [ -119.915734, 46.253846 ], "pop" : 10558, "state" : "WA" } +{ "_id" : "98932", "city" : "GRANGER", "loc" : [ -120.181848, 46.348045 ], "pop" : 3562, "state" : "WA" } +{ "_id" : "98933", "city" : "HARRAH", "loc" : [ -120.573606, 46.410383 ], "pop" : 2643, "state" : "WA" } +{ "_id" : "98935", "city" : "MABTON", "loc" : [ -120.015141, 46.212082 ], "pop" : 3586, "state" : "WA" } +{ "_id" : "98936", "city" : "MOXEE", "loc" : [ -120.368463, 46.554205 ], "pop" : 4194, "state" : "WA" } +{ "_id" : "98937", "city" : "WHITE PASS", "loc" : [ -120.826699, 46.735335 ], "pop" : 2996, "state" : "WA" } +{ "_id" : "98938", "city" : "OUTLOOK", "loc" : [ -120.097005, 46.352497 ], "pop" : 1705, "state" : "WA" } +{ "_id" : "98942", "city" : "SELAH", "loc" : [ -120.540813, 46.67671 ], "pop" : 12507, "state" : "WA" } +{ "_id" : "98944", "city" : "SUNNYSIDE", "loc" : [ -120.012631, 46.321273 ], "pop" : 16774, "state" : "WA" } +{ "_id" : "98946", "city" : "THORP", "loc" : [ -120.678557, 47.017785 ], "pop" : 1082, "state" : "WA" } +{ "_id" : "98947", "city" : "TIETON", "loc" : [ -120.747275, 46.706331 ], "pop" : 2079, "state" : "WA" } +{ "_id" : "98948", "city" : "TOPPENISH", "loc" : [ -120.330534, 46.375123 ], "pop" : 11101, "state" : "WA" } +{ "_id" : "98951", "city" : "WAPATO", "loc" : [ -120.426484, 46.45066 ], "pop" : 10262, "state" : "WA" } +{ "_id" : "98952", "city" : "WHITE SWAN", "loc" : [ -120.745317, 46.371558 ], "pop" : 1941, "state" : "WA" } +{ "_id" : "98953", "city" : "ZILLAH", "loc" : [ -120.266161, 46.415777 ], "pop" : 5266, "state" : "WA" } +{ "_id" : "99003", "city" : "CHATTAROY", "loc" : [ -117.29209, 47.919178 ], "pop" : 1991, "state" : "WA" } +{ "_id" : "99004", "city" : "CHENEY", "loc" : [ -117.583372, 47.494257 ], "pop" : 12257, "state" : "WA" } +{ "_id" : "99005", "city" : "COLBERT", "loc" : [ -117.375895, 47.841093 ], "pop" : 3926, "state" : "WA" } +{ "_id" : "99006", "city" : "DEER PARK", "loc" : [ -117.443559, 47.948615 ], "pop" : 7287, "state" : "WA" } +{ "_id" : "99008", "city" : "EDWALL", "loc" : [ -117.907095, 47.537896 ], "pop" : 379, "state" : "WA" } +{ "_id" : "99009", "city" : "ELK", "loc" : [ -117.296253, 48.020523 ], "pop" : 2386, "state" : "WA" } +{ "_id" : "99011", "city" : "FAIRCHILD AIR FO", "loc" : [ -117.643746, 47.613068 ], "pop" : 4854, "state" : "WA" } +{ "_id" : "99012", "city" : "FAIRFIELD", "loc" : [ -117.192054, 47.398726 ], "pop" : 641, "state" : "WA" } +{ "_id" : "99013", "city" : "FORD", "loc" : [ -117.811858, 47.916873 ], "pop" : 790, "state" : "WA" } +{ "_id" : "99016", "city" : "GREENACRES", "loc" : [ -117.156801, 47.658357 ], "pop" : 5312, "state" : "WA" } +{ "_id" : "99017", "city" : "LAMONT", "loc" : [ -117.830239, 47.17304 ], "pop" : 317, "state" : "WA" } +{ "_id" : "99018", "city" : "LATAH", "loc" : [ -117.16884, 47.303815 ], "pop" : 477, "state" : "WA" } +{ "_id" : "99019", "city" : "LIBERTY LAKE", "loc" : [ -117.083808, 47.651672 ], "pop" : 2372, "state" : "WA" } +{ "_id" : "99021", "city" : "MEAD", "loc" : [ -117.311716, 47.793268 ], "pop" : 5903, "state" : "WA" } +{ "_id" : "99022", "city" : "ESPANOLA", "loc" : [ -117.679351, 47.583696 ], "pop" : 6436, "state" : "WA" } +{ "_id" : "99023", "city" : "MICA", "loc" : [ -117.163711, 47.553814 ], "pop" : 921, "state" : "WA" } +{ "_id" : "99025", "city" : "NEWMAN LAKE", "loc" : [ -117.064041, 47.727371 ], "pop" : 3092, "state" : "WA" } +{ "_id" : "99026", "city" : "NINE MILE FALLS", "loc" : [ -117.589359, 47.801945 ], "pop" : 4872, "state" : "WA" } +{ "_id" : "99027", "city" : "OTIS ORCHARDS", "loc" : [ -117.11209, 47.70273 ], "pop" : 5922, "state" : "WA" } +{ "_id" : "99029", "city" : "REARDAN", "loc" : [ -117.866264, 47.705407 ], "pop" : 1072, "state" : "WA" } +{ "_id" : "99030", "city" : "ROCKFORD", "loc" : [ -117.131842, 47.452804 ], "pop" : 844, "state" : "WA" } +{ "_id" : "99031", "city" : "SPANGLE", "loc" : [ -117.382696, 47.4338 ], "pop" : 1434, "state" : "WA" } +{ "_id" : "99032", "city" : "SPRAGUE", "loc" : [ -117.989684, 47.324725 ], "pop" : 672, "state" : "WA" } +{ "_id" : "99033", "city" : "TEKOA", "loc" : [ -117.081919, 47.227081 ], "pop" : 950, "state" : "WA" } +{ "_id" : "99034", "city" : "TUMTUM", "loc" : [ -117.698996, 47.898173 ], "pop" : 312, "state" : "WA" } +{ "_id" : "99036", "city" : "VALLEYFORD", "loc" : [ -117.268601, 47.529176 ], "pop" : 698, "state" : "WA" } +{ "_id" : "99037", "city" : "VERADALE", "loc" : [ -117.197706, 47.642103 ], "pop" : 8397, "state" : "WA" } +{ "_id" : "99039", "city" : "WAVERLY", "loc" : [ -117.233108, 47.335393 ], "pop" : 166, "state" : "WA" } +{ "_id" : "99040", "city" : "WELLPINIT", "loc" : [ -117.985646, 47.86974 ], "pop" : 488, "state" : "WA" } +{ "_id" : "99101", "city" : "ADDY", "loc" : [ -117.892383, 48.44769 ], "pop" : 1226, "state" : "WA" } +{ "_id" : "99103", "city" : "ALMIRA", "loc" : [ -118.91225, 47.763175 ], "pop" : 646, "state" : "WA" } +{ "_id" : "99105", "city" : "BENGE", "loc" : [ -117.969895, 46.867636 ], "pop" : 2, "state" : "WA" } +{ "_id" : "99107", "city" : "BOYDS", "loc" : [ -118.19906, 48.691919 ], "pop" : 782, "state" : "WA" } +{ "_id" : "99109", "city" : "CHEWELAH", "loc" : [ -117.77539, 48.287585 ], "pop" : 5239, "state" : "WA" } +{ "_id" : "99110", "city" : "CLAYTON", "loc" : [ -117.574021, 47.955206 ], "pop" : 1621, "state" : "WA" } +{ "_id" : "99111", "city" : "COLFAX", "loc" : [ -117.366975, 46.879996 ], "pop" : 3592, "state" : "WA" } +{ "_id" : "99113", "city" : "COLTON", "loc" : [ -117.169243, 46.590098 ], "pop" : 650, "state" : "WA" } +{ "_id" : "99114", "city" : "COLVILLE", "loc" : [ -117.864463, 48.57799 ], "pop" : 8805, "state" : "WA" } +{ "_id" : "99115", "city" : "COULEE CITY", "loc" : [ -119.27582, 47.596571 ], "pop" : 1013, "state" : "WA" } +{ "_id" : "99116", "city" : "COULEE DAM", "loc" : [ -119.180907, 48.173861 ], "pop" : 4636, "state" : "WA" } +{ "_id" : "99117", "city" : "CRESTON", "loc" : [ -118.530656, 47.797681 ], "pop" : 527, "state" : "WA" } +{ "_id" : "99118", "city" : "CURLEW", "loc" : [ -118.645182, 48.910775 ], "pop" : 986, "state" : "WA" } +{ "_id" : "99119", "city" : "CUSICK", "loc" : [ -117.329464, 48.391513 ], "pop" : 439, "state" : "WA" } +{ "_id" : "99121", "city" : "DANVILLE", "loc" : [ -118.488408, 48.972524 ], "pop" : 48, "state" : "WA" } +{ "_id" : "99122", "city" : "DAVENPORT", "loc" : [ -118.166657, 47.680855 ], "pop" : 2383, "state" : "WA" } +{ "_id" : "99123", "city" : "ELECTRIC CITY", "loc" : [ -119.036728, 47.926446 ], "pop" : 1152, "state" : "WA" } +{ "_id" : "99125", "city" : "ENDICOTT", "loc" : [ -117.723005, 46.936407 ], "pop" : 673, "state" : "WA" } +{ "_id" : "99126", "city" : "EVANS", "loc" : [ -118.00012, 48.745787 ], "pop" : 350, "state" : "WA" } +{ "_id" : "99128", "city" : "FARMINGTON", "loc" : [ -117.076327, 47.084742 ], "pop" : 355, "state" : "WA" } +{ "_id" : "99129", "city" : "FRUITLAND", "loc" : [ -118.215906, 47.979746 ], "pop" : 515, "state" : "WA" } +{ "_id" : "99130", "city" : "GARFIELD", "loc" : [ -117.152293, 46.994639 ], "pop" : 795, "state" : "WA" } +{ "_id" : "99131", "city" : "GIFFORD", "loc" : [ -118.12989, 48.22287 ], "pop" : 60, "state" : "WA" } +{ "_id" : "99133", "city" : "GRAND COULEE", "loc" : [ -118.997835, 47.938511 ], "pop" : 1073, "state" : "WA" } +{ "_id" : "99134", "city" : "HARRINGTON", "loc" : [ -118.277793, 47.4555 ], "pop" : 786, "state" : "WA" } +{ "_id" : "99135", "city" : "HARTLINE", "loc" : [ -119.104467, 47.725631 ], "pop" : 315, "state" : "WA" } +{ "_id" : "99137", "city" : "HUNTERS", "loc" : [ -118.152491, 48.133261 ], "pop" : 349, "state" : "WA" } +{ "_id" : "99138", "city" : "INCHELIUM", "loc" : [ -118.355166, 48.292411 ], "pop" : 1297, "state" : "WA" } +{ "_id" : "99139", "city" : "IONE", "loc" : [ -117.404859, 48.713023 ], "pop" : 1204, "state" : "WA" } +{ "_id" : "99140", "city" : "KELLER", "loc" : [ -118.654731, 48.023594 ], "pop" : 255, "state" : "WA" } +{ "_id" : "99141", "city" : "KETTLE FALLS", "loc" : [ -118.054801, 48.636375 ], "pop" : 3668, "state" : "WA" } +{ "_id" : "99143", "city" : "LACROSSE", "loc" : [ -117.770277, 46.771684 ], "pop" : 1066, "state" : "WA" } +{ "_id" : "99147", "city" : "LINCOLN", "loc" : [ -118.481012, 47.78204 ], "pop" : 31, "state" : "WA" } +{ "_id" : "99148", "city" : "LOON LAKE", "loc" : [ -117.632496, 48.078393 ], "pop" : 1885, "state" : "WA" } +{ "_id" : "99150", "city" : "MALO", "loc" : [ -118.623712, 48.81862 ], "pop" : 396, "state" : "WA" } +{ "_id" : "99153", "city" : "METALINE FALLS", "loc" : [ -117.36332, 48.859747 ], "pop" : 729, "state" : "WA" } +{ "_id" : "99156", "city" : "NEWPORT", "loc" : [ -117.150784, 48.169465 ], "pop" : 5881, "state" : "WA" } +{ "_id" : "99157", "city" : "NORTHPORT", "loc" : [ -117.793052, 48.924663 ], "pop" : 462, "state" : "WA" } +{ "_id" : "99158", "city" : "OAKESDALE", "loc" : [ -117.280326, 47.080556 ], "pop" : 764, "state" : "WA" } +{ "_id" : "99159", "city" : "ODESSA", "loc" : [ -118.698316, 47.339491 ], "pop" : 1324, "state" : "WA" } +{ "_id" : "99161", "city" : "PALOUSE", "loc" : [ -117.085475, 46.907555 ], "pop" : 1270, "state" : "WA" } +{ "_id" : "99163", "city" : "PULLMAN", "loc" : [ -117.172936, 46.735247 ], "pop" : 25909, "state" : "WA" } +{ "_id" : "99166", "city" : "REPUBLIC", "loc" : [ -118.699942, 48.670366 ], "pop" : 2531, "state" : "WA" } +{ "_id" : "99167", "city" : "RICE", "loc" : [ -118.124865, 48.406169 ], "pop" : 615, "state" : "WA" } +{ "_id" : "99169", "city" : "RITZVILLE", "loc" : [ -118.395812, 47.131528 ], "pop" : 2472, "state" : "WA" } +{ "_id" : "99170", "city" : "ROSALIA", "loc" : [ -117.41468, 47.221777 ], "pop" : 1081, "state" : "WA" } +{ "_id" : "99171", "city" : "SAINT JOHN", "loc" : [ -117.573002, 47.075539 ], "pop" : 765, "state" : "WA" } +{ "_id" : "99173", "city" : "SPRINGDALE", "loc" : [ -117.873273, 47.992737 ], "pop" : 361, "state" : "WA" } +{ "_id" : "99176", "city" : "THORNTON", "loc" : [ -117.386416, 47.12525 ], "pop" : 186, "state" : "WA" } +{ "_id" : "99179", "city" : "UNIONTOWN", "loc" : [ -117.090756, 46.525818 ], "pop" : 433, "state" : "WA" } +{ "_id" : "99180", "city" : "USK", "loc" : [ -117.318947, 48.295969 ], "pop" : 501, "state" : "WA" } +{ "_id" : "99181", "city" : "VALLEY", "loc" : [ -117.760967, 48.135114 ], "pop" : 1328, "state" : "WA" } +{ "_id" : "99185", "city" : "WILBUR", "loc" : [ -118.706271, 47.741012 ], "pop" : 1238, "state" : "WA" } +{ "_id" : "99201", "city" : "SPOKANE", "loc" : [ -117.436527, 47.666485 ], "pop" : 9599, "state" : "WA" } +{ "_id" : "99202", "city" : "SPOKANE", "loc" : [ -117.380972, 47.654741 ], "pop" : 17424, "state" : "WA" } +{ "_id" : "99203", "city" : "SPOKANE", "loc" : [ -117.404121, 47.629443 ], "pop" : 20454, "state" : "WA" } +{ "_id" : "99204", "city" : "SPOKANE", "loc" : [ -117.471896, 47.640682 ], "pop" : 24611, "state" : "WA" } +{ "_id" : "99205", "city" : "SPOKANE", "loc" : [ -117.439912, 47.69641 ], "pop" : 42032, "state" : "WA" } +{ "_id" : "99206", "city" : "SPOKANE", "loc" : [ -117.258126, 47.649588 ], "pop" : 29077, "state" : "WA" } +{ "_id" : "99207", "city" : "SPOKANE", "loc" : [ -117.374565, 47.697712 ], "pop" : 46237, "state" : "WA" } +{ "_id" : "99208", "city" : "SPOKANE", "loc" : [ -117.435207, 47.737434 ], "pop" : 27989, "state" : "WA" } +{ "_id" : "99212", "city" : "SPOKANE", "loc" : [ -117.304853, 47.668598 ], "pop" : 16771, "state" : "WA" } +{ "_id" : "99216", "city" : "SPOKANE", "loc" : [ -117.219307, 47.663389 ], "pop" : 18834, "state" : "WA" } +{ "_id" : "99218", "city" : "SPOKANE", "loc" : [ -117.4146, 47.755648 ], "pop" : 11902, "state" : "WA" } +{ "_id" : "99223", "city" : "SPOKANE", "loc" : [ -117.362215, 47.61558 ], "pop" : 19056, "state" : "WA" } +{ "_id" : "99301", "city" : "PASCO", "loc" : [ -119.104387, 46.249183 ], "pop" : 33988, "state" : "WA" } +{ "_id" : "99320", "city" : "BENTON CITY", "loc" : [ -119.491349, 46.280624 ], "pop" : 5047, "state" : "WA" } +{ "_id" : "99321", "city" : "BEVERLY", "loc" : [ -119.912074, 46.848429 ], "pop" : 315, "state" : "WA" } +{ "_id" : "99322", "city" : "BICKLETON", "loc" : [ -120.104223, 45.959687 ], "pop" : 329, "state" : "WA" } +{ "_id" : "99324", "city" : "COLLEGE PLACE", "loc" : [ -118.385338, 46.045723 ], "pop" : 6904, "state" : "WA" } +{ "_id" : "99326", "city" : "CONNELL", "loc" : [ -118.85454, 46.66426 ], "pop" : 2699, "state" : "WA" } +{ "_id" : "99327", "city" : "CUNNINGHAM", "loc" : [ -119.107604, 46.757333 ], "pop" : 511, "state" : "WA" } +{ "_id" : "99328", "city" : "DAYTON", "loc" : [ -117.973791, 46.307459 ], "pop" : 3373, "state" : "WA" } +{ "_id" : "99330", "city" : "ELTOPIA", "loc" : [ -119.101333, 46.474996 ], "pop" : 758, "state" : "WA" } +{ "_id" : "99336", "city" : "KENNEWICK", "loc" : [ -119.167951, 46.210913 ], "pop" : 33860, "state" : "WA" } +{ "_id" : "99337", "city" : "KENNEWICK", "loc" : [ -119.138289, 46.181387 ], "pop" : 25962, "state" : "WA" } +{ "_id" : "99341", "city" : "LIND", "loc" : [ -118.706057, 46.955954 ], "pop" : 1134, "state" : "WA" } +{ "_id" : "99343", "city" : "MESA", "loc" : [ -119.137324, 46.578223 ], "pop" : 2382, "state" : "WA" } +{ "_id" : "99344", "city" : "MATTAWA", "loc" : [ -119.316405, 46.792518 ], "pop" : 11812, "state" : "WA" } +{ "_id" : "99345", "city" : "PATERSON", "loc" : [ -119.755873, 45.991139 ], "pop" : 94, "state" : "WA" } +{ "_id" : "99346", "city" : "PLYMOUTH", "loc" : [ -119.502998, 46.038184 ], "pop" : 219, "state" : "WA" } +{ "_id" : "99347", "city" : "POMEROY", "loc" : [ -117.599282, 46.469838 ], "pop" : 2467, "state" : "WA" } +{ "_id" : "99348", "city" : "PRESCOTT", "loc" : [ -118.409663, 46.353879 ], "pop" : 638, "state" : "WA" } +{ "_id" : "99350", "city" : "PROSSER", "loc" : [ -119.771014, 46.223183 ], "pop" : 9714, "state" : "WA" } +{ "_id" : "99352", "city" : "RICHLAND", "loc" : [ -119.289201, 46.283265 ], "pop" : 37664, "state" : "WA" } +{ "_id" : "99356", "city" : "ROOSEVELT", "loc" : [ -120.356611, 45.82962 ], "pop" : 172, "state" : "WA" } +{ "_id" : "99357", "city" : "ROYAL CITY", "loc" : [ -119.581473, 46.91557 ], "pop" : 3388, "state" : "WA" } +{ "_id" : "99360", "city" : "LOWDEN", "loc" : [ -118.655411, 46.04851 ], "pop" : 1234, "state" : "WA" } +{ "_id" : "99361", "city" : "WAITSBURG", "loc" : [ -118.144734, 46.269092 ], "pop" : 2138, "state" : "WA" } +{ "_id" : "99362", "city" : "WALLA WALLA", "loc" : [ -118.331544, 46.061373 ], "pop" : 34993, "state" : "WA" } +{ "_id" : "99371", "city" : "WASHTUCNA", "loc" : [ -118.286203, 46.820912 ], "pop" : 625, "state" : "WA" } +{ "_id" : "99401", "city" : "ANATONE", "loc" : [ -117.088316, 46.128466 ], "pop" : 141, "state" : "WA" } +{ "_id" : "99402", "city" : "ASOTIN", "loc" : [ -117.001548, 46.134318 ], "pop" : 89, "state" : "WA" } +{ "_id" : "99403", "city" : "CLARKSTON", "loc" : [ -117.064457, 46.394622 ], "pop" : 17375, "state" : "WA" } +{ "_id" : "99501", "city" : "ANCHORAGE", "loc" : [ -149.876077, 61.211571 ], "pop" : 14436, "state" : "AK" } +{ "_id" : "99502", "city" : "ANCHORAGE", "loc" : [ -150.093943, 61.096163 ], "pop" : 15891, "state" : "AK" } +{ "_id" : "99503", "city" : "ANCHORAGE", "loc" : [ -149.893844, 61.189953 ], "pop" : 12534, "state" : "AK" } +{ "_id" : "99504", "city" : "ANCHORAGE", "loc" : [ -149.74467, 61.203696 ], "pop" : 32383, "state" : "AK" } +{ "_id" : "99505", "city" : "FORT RICHARDSON", "loc" : [ -149.675454, 61.275256 ], "pop" : 7979, "state" : "AK" } +{ "_id" : "99506", "city" : "ELMENDORF AFB", "loc" : [ -149.812667, 61.251531 ], "pop" : 7907, "state" : "AK" } +{ "_id" : "99507", "city" : "ANCHORAGE", "loc" : [ -149.828912, 61.153543 ], "pop" : 20128, "state" : "AK" } +{ "_id" : "99508", "city" : "ANCHORAGE", "loc" : [ -149.810085, 61.205959 ], "pop" : 29857, "state" : "AK" } +{ "_id" : "99515", "city" : "ANCHORAGE", "loc" : [ -149.897401, 61.119381 ], "pop" : 17094, "state" : "AK" } +{ "_id" : "99516", "city" : "ANCHORAGE", "loc" : [ -149.779998, 61.10541 ], "pop" : 18356, "state" : "AK" } +{ "_id" : "99517", "city" : "ANCHORAGE", "loc" : [ -149.936111, 61.190136 ], "pop" : 15192, "state" : "AK" } +{ "_id" : "99518", "city" : "ANCHORAGE", "loc" : [ -149.886571, 61.154862 ], "pop" : 8116, "state" : "AK" } +{ "_id" : "99549", "city" : "PORT HEIDEN", "loc" : [ -158.566367, 56.964333 ], "pop" : 119, "state" : "AK" } +{ "_id" : "99551", "city" : "AKIACHAK", "loc" : [ -161.39233, 60.891854 ], "pop" : 481, "state" : "AK" } +{ "_id" : "99552", "city" : "AKIAK", "loc" : [ -161.199325, 60.890632 ], "pop" : 285, "state" : "AK" } +{ "_id" : "99553", "city" : "AKUTAN", "loc" : [ -165.785368, 54.143012 ], "pop" : 589, "state" : "AK" } +{ "_id" : "99554", "city" : "ALAKANUK", "loc" : [ -164.60228, 62.746967 ], "pop" : 1186, "state" : "AK" } +{ "_id" : "99555", "city" : "ALEKNAGIK", "loc" : [ -158.619882, 59.269688 ], "pop" : 185, "state" : "AK" } +{ "_id" : "99556", "city" : "NIKOLAEVSK", "loc" : [ -151.732933, 59.788818 ], "pop" : 1698, "state" : "AK" } +{ "_id" : "99557", "city" : "CHUATHBALUK", "loc" : [ -157.758502, 61.691648 ], "pop" : 352, "state" : "AK" } +{ "_id" : "99558", "city" : "ANVIK", "loc" : [ -160.130441, 62.830913 ], "pop" : 296, "state" : "AK" } +{ "_id" : "99559", "city" : "ATMAUTLUAK", "loc" : [ -161.824053, 60.832389 ], "pop" : 7188, "state" : "AK" } +{ "_id" : "99561", "city" : "CHEFORNAK", "loc" : [ -164.210294, 60.153746 ], "pop" : 320, "state" : "AK" } +{ "_id" : "99563", "city" : "CHEVAK", "loc" : [ -164.776457, 61.583982 ], "pop" : 0, "state" : "AK" } +{ "_id" : "99564", "city" : "CHIGNIK", "loc" : [ -158.415696, 56.301639 ], "pop" : 188, "state" : "AK" } +{ "_id" : "99565", "city" : "CHIGNIK LAGOON", "loc" : [ -158.673528, 56.251277 ], "pop" : 186, "state" : "AK" } +{ "_id" : "99567", "city" : "CHUGIAK", "loc" : [ -149.453736, 61.409802 ], "pop" : 6910, "state" : "AK" } +{ "_id" : "99568", "city" : "CLAM GULCH", "loc" : [ -151.422628, 60.201603 ], "pop" : 133, "state" : "AK" } +{ "_id" : "99569", "city" : "CLARKS POINT", "loc" : [ -158.451241, 58.84921 ], "pop" : 68, "state" : "AK" } +{ "_id" : "99571", "city" : "NELSON LAGOON", "loc" : [ -161.942941, 55.610952 ], "pop" : 475, "state" : "AK" } +{ "_id" : "99572", "city" : "COOPER LANDING", "loc" : [ -149.823514, 60.476692 ], "pop" : 252, "state" : "AK" } +{ "_id" : "99573", "city" : "COPPER CENTER", "loc" : [ -144.97793, 61.91581 ], "pop" : 1389, "state" : "AK" } +{ "_id" : "99574", "city" : "CHENEGA BAY", "loc" : [ -147.943316, 60.102558 ], "pop" : 96, "state" : "AK" } +{ "_id" : "99575", "city" : "CROOKED CREEK", "loc" : [ -158.002483, 61.818072 ], "pop" : 1, "state" : "AK" } +{ "_id" : "99576", "city" : "KOLIGANEK", "loc" : [ -158.973533, 59.059279 ], "pop" : 2711, "state" : "AK" } +{ "_id" : "99577", "city" : "EAGLE RIVER", "loc" : [ -149.508515, 61.311357 ], "pop" : 18429, "state" : "AK" } +{ "_id" : "99578", "city" : "EEK", "loc" : [ -162.032341, 60.215058 ], "pop" : 254, "state" : "AK" } +{ "_id" : "99579", "city" : "EGEGIK", "loc" : [ -157.342202, 58.206174 ], "pop" : 122, "state" : "AK" } +{ "_id" : "99580", "city" : "EKWOK", "loc" : [ -157.478211, 59.362792 ], "pop" : 77, "state" : "AK" } +{ "_id" : "99581", "city" : "EMMONAK", "loc" : [ -164.131298, 62.827404 ], "pop" : 0, "state" : "AK" } +{ "_id" : "99583", "city" : "FALSE PASS", "loc" : [ -163.436845, 54.841028 ], "pop" : 68, "state" : "AK" } +{ "_id" : "99585", "city" : "MARSHALL", "loc" : [ -161.7394, 61.837087 ], "pop" : 530, "state" : "AK" } +{ "_id" : "99586", "city" : "SLANA", "loc" : [ -143.568393, 62.654744 ], "pop" : 394, "state" : "AK" } +{ "_id" : "99588", "city" : "GLENNALLEN", "loc" : [ -145.661684, 62.103895 ], "pop" : 1024, "state" : "AK" } +{ "_id" : "99589", "city" : "GOODNEWS BAY", "loc" : [ -161.587146, 59.085008 ], "pop" : 305, "state" : "AK" } +{ "_id" : "99590", "city" : "GRAYLING", "loc" : [ -159.404907, 63.372013 ], "pop" : 0, "state" : "AK" } +{ "_id" : "99591", "city" : "SAINT GEORGE ISL", "loc" : [ -169.547257, 56.60324 ], "pop" : 138, "state" : "AK" } +{ "_id" : "99602", "city" : "HOLY CROSS", "loc" : [ -159.825092, 62.192584 ], "pop" : 277, "state" : "AK" } +{ "_id" : "99603", "city" : "PORT GRAHAM", "loc" : [ -151.462644, 59.665495 ], "pop" : 8186, "state" : "AK" } +{ "_id" : "99604", "city" : "HOOPER BAY", "loc" : [ -165.891045, 61.537157 ], "pop" : 1443, "state" : "AK" } +{ "_id" : "99606", "city" : "KOKHANOK", "loc" : [ -155.462556, 59.564836 ], "pop" : 362, "state" : "AK" } +{ "_id" : "99607", "city" : "KALSKAG", "loc" : [ -160.3261, 61.541006 ], "pop" : 172, "state" : "AK" } +{ "_id" : "99610", "city" : "KASILOF", "loc" : [ -151.28958, 60.316365 ], "pop" : 963, "state" : "AK" } +{ "_id" : "99611", "city" : "KENAI", "loc" : [ -151.254556, 60.614467 ], "pop" : 10508, "state" : "AK" } +{ "_id" : "99612", "city" : "KING COVE", "loc" : [ -162.305561, 55.062848 ], "pop" : 451, "state" : "AK" } +{ "_id" : "99613", "city" : "IGIUGIG", "loc" : [ -156.641603, 58.724264 ], "pop" : 480, "state" : "AK" } +{ "_id" : "99614", "city" : "KIPNUK", "loc" : [ -164.101013, 59.923204 ], "pop" : 470, "state" : "AK" } +{ "_id" : "99615", "city" : "AKHIOK", "loc" : [ -152.500169, 57.781967 ], "pop" : 13309, "state" : "AK" } +{ "_id" : "99620", "city" : "KOTLIK", "loc" : [ -163.554153, 63.029471 ], "pop" : 462, "state" : "AK" } +{ "_id" : "99621", "city" : "KWETHLUK", "loc" : [ -161.38849, 60.771814 ], "pop" : 558, "state" : "AK" } +{ "_id" : "99622", "city" : "KWIGILLINGOK", "loc" : [ -162.984938, 59.881022 ], "pop" : 572, "state" : "AK" } +{ "_id" : "99625", "city" : "LEVELOCK", "loc" : [ -154.976815, 59.371395 ], "pop" : 204, "state" : "AK" } +{ "_id" : "99626", "city" : "LOWER KALSKAG", "loc" : [ -160.359966, 61.51377 ], "pop" : 291, "state" : "AK" } +{ "_id" : "99627", "city" : "MC GRATH", "loc" : [ -155.585153, 62.967153 ], "pop" : 618, "state" : "AK" } +{ "_id" : "99628", "city" : "MANOKOTAK", "loc" : [ -158.989699, 59.009559 ], "pop" : 385, "state" : "AK" } +{ "_id" : "99630", "city" : "MEKORYUK", "loc" : [ -166.283583, 60.365679 ], "pop" : 177, "state" : "AK" } +{ "_id" : "99631", "city" : "MOOSE PASS", "loc" : [ -149.255911, 60.85852 ], "pop" : 1649, "state" : "AK" } +{ "_id" : "99632", "city" : "MOUNTAIN VILLAGE", "loc" : [ -163.883822, 62.158913 ], "pop" : 788, "state" : "AK" } +{ "_id" : "99633", "city" : "NAKNEK", "loc" : [ -156.705405, 58.885699 ], "pop" : 0, "state" : "AK" } +{ "_id" : "99634", "city" : "NAPAKIAK", "loc" : [ -161.738144, 60.663758 ], "pop" : 328, "state" : "AK" } +{ "_id" : "99636", "city" : "NEW STUYAHOK", "loc" : [ -157.297205, 59.593533 ], "pop" : 586, "state" : "AK" } +{ "_id" : "99638", "city" : "NIKOLSKI", "loc" : [ -168.788427, 52.988337 ], "pop" : 42, "state" : "AK" } +{ "_id" : "99639", "city" : "NINILCHIK", "loc" : [ -151.639604, 60.010833 ], "pop" : 767, "state" : "AK" } +{ "_id" : "99640", "city" : "NONDALTON", "loc" : [ -154.731675, 60.030837 ], "pop" : 233, "state" : "AK" } +{ "_id" : "99645", "city" : "BUTTE", "loc" : [ -149.065323, 61.613814 ], "pop" : 12358, "state" : "AK" } +{ "_id" : "99647", "city" : "PEDRO BAY", "loc" : [ -153.821856, 59.92238 ], "pop" : 59, "state" : "AK" } +{ "_id" : "99648", "city" : "PERRYVILLE", "loc" : [ -159.259333, 55.945289 ], "pop" : 143, "state" : "AK" } +{ "_id" : "99649", "city" : "PILOT POINT", "loc" : [ -157.449272, 57.595193 ], "pop" : 63, "state" : "AK" } +{ "_id" : "99650", "city" : "PILOT STATION", "loc" : [ -162.874716, 61.946159 ], "pop" : 463, "state" : "AK" } +{ "_id" : "99651", "city" : "PLATINUM", "loc" : [ -162.043201, 58.63364 ], "pop" : 4, "state" : "AK" } +{ "_id" : "99653", "city" : "PORT ALSWORTH", "loc" : [ -154.433803, 60.636416 ], "pop" : 7, "state" : "AK" } +{ "_id" : "99654", "city" : "WASILLA", "loc" : [ -149.395875, 61.592349 ], "pop" : 10404, "state" : "AK" } +{ "_id" : "99655", "city" : "QUINHAGAK", "loc" : [ -161.874938, 59.738057 ], "pop" : 501, "state" : "AK" } +{ "_id" : "99656", "city" : "RED DEVIL", "loc" : [ -157.195969, 61.735389 ], "pop" : 159, "state" : "AK" } +{ "_id" : "99657", "city" : "RUSSIAN MISSION", "loc" : [ -161.558413, 61.591302 ], "pop" : 0, "state" : "AK" } +{ "_id" : "99658", "city" : "SAINT MARYS", "loc" : [ -163.205263, 62.054106 ], "pop" : 576, "state" : "AK" } +{ "_id" : "99659", "city" : "SAINT MICHAEL", "loc" : [ -162.109141, 63.47759 ], "pop" : 295, "state" : "AK" } +{ "_id" : "99660", "city" : "SAINT PAUL ISLAN", "loc" : [ -170.293408, 57.178697 ], "pop" : 763, "state" : "AK" } +{ "_id" : "99661", "city" : "SAND POINT", "loc" : [ -160.491435, 55.319236 ], "pop" : 881, "state" : "AK" } +{ "_id" : "99662", "city" : "SCAMMON BAY", "loc" : [ -165.581945, 61.845019 ], "pop" : 343, "state" : "AK" } +{ "_id" : "99664", "city" : "SEWARD", "loc" : [ -149.39849, 60.132874 ], "pop" : 3937, "state" : "AK" } +{ "_id" : "99665", "city" : "SHAGELUK", "loc" : [ -159.52816, 62.661092 ], "pop" : 139, "state" : "AK" } +{ "_id" : "99668", "city" : "SLEETMUTE", "loc" : [ -157.118284, 61.634555 ], "pop" : 0, "state" : "AK" } +{ "_id" : "99669", "city" : "SOLDOTNA", "loc" : [ -151.13582, 60.481778 ], "pop" : 9825, "state" : "AK" } +{ "_id" : "99670", "city" : "SOUTH NAKNEK", "loc" : [ -156.850289, 58.736221 ], "pop" : 929, "state" : "AK" } +{ "_id" : "99671", "city" : "STEBBINS", "loc" : [ -162.227355, 63.478468 ], "pop" : 400, "state" : "AK" } +{ "_id" : "99672", "city" : "STERLING", "loc" : [ -150.849792, 60.520373 ], "pop" : 3814, "state" : "AK" } +{ "_id" : "99676", "city" : "TALKEETNA", "loc" : [ -150.110097, 62.260516 ], "pop" : 1420, "state" : "AK" } +{ "_id" : "99679", "city" : "TULUKSAK", "loc" : [ -160.938924, 61.108848 ], "pop" : 358, "state" : "AK" } +{ "_id" : "99681", "city" : "TUNUNAK", "loc" : [ -165.097464, 60.539322 ], "pop" : 889, "state" : "AK" } +{ "_id" : "99682", "city" : "TYONEK", "loc" : [ -151.348495, 61.117929 ], "pop" : 277, "state" : "AK" } +{ "_id" : "99683", "city" : "TRAPPER CREEK", "loc" : [ -150.284455, 61.441361 ], "pop" : 20, "state" : "AK" } +{ "_id" : "99684", "city" : "UNALAKLEET", "loc" : [ -160.788365, 63.883478 ], "pop" : 716, "state" : "AK" } +{ "_id" : "99685", "city" : "UNALASKA", "loc" : [ -166.519855, 53.887114 ], "pop" : 3089, "state" : "AK" } +{ "_id" : "99686", "city" : "VALDEZ", "loc" : [ -146.195628, 60.895044 ], "pop" : 7049, "state" : "AK" } +{ "_id" : "99687", "city" : "WASILLA", "loc" : [ -149.533003, 61.578032 ], "pop" : 14215, "state" : "AK" } +{ "_id" : "99688", "city" : "WILLOW", "loc" : [ -150.188891, 61.771511 ], "pop" : 1237, "state" : "AK" } +{ "_id" : "99689", "city" : "YAKUTAT", "loc" : [ -139.778858, 59.620211 ], "pop" : 705, "state" : "AK" } +{ "_id" : "99691", "city" : "NIKOLAI", "loc" : [ -154.381247, 63.001603 ], "pop" : 109, "state" : "AK" } +{ "_id" : "99692", "city" : "DUTCH HARBOR", "loc" : [ -167.510656, 53.362757 ], "pop" : 3, "state" : "AK" } +{ "_id" : "99701", "city" : "COLDFOOT", "loc" : [ -147.710431, 64.840238 ], "pop" : 19316, "state" : "AK" } +{ "_id" : "99702", "city" : "EIELSON AFB", "loc" : [ -147.08051, 64.67352 ], "pop" : 5266, "state" : "AK" } +{ "_id" : "99703", "city" : "FORT WAINWRIGHT", "loc" : [ -147.655673, 64.82830300000001 ], "pop" : 6238, "state" : "AK" } +{ "_id" : "99704", "city" : "CLEAR", "loc" : [ -149.139885, 64.418121 ], "pop" : 440, "state" : "AK" } +{ "_id" : "99705", "city" : "NORTH POLE", "loc" : [ -147.369353, 64.78049 ], "pop" : 14672, "state" : "AK" } +{ "_id" : "99709", "city" : "FAIRBANKS", "loc" : [ -147.846917, 64.85437 ], "pop" : 23238, "state" : "AK" } +{ "_id" : "99712", "city" : "FAIRBANKS", "loc" : [ -147.510479, 64.91087899999999 ], "pop" : 8141, "state" : "AK" } +{ "_id" : "99714", "city" : "SALCHA", "loc" : [ -146.952974, 64.50905 ], "pop" : 890, "state" : "AK" } +{ "_id" : "99720", "city" : "ALLAKAKET", "loc" : [ -152.712155, 66.54319700000001 ], "pop" : 170, "state" : "AK" } +{ "_id" : "99721", "city" : "ANAKTUVUK PASS", "loc" : [ -151.679005, 68.11878 ], "pop" : 260, "state" : "AK" } +{ "_id" : "99722", "city" : "ARCTIC VILLAGE", "loc" : [ -145.423115, 68.077395 ], "pop" : 107, "state" : "AK" } +{ "_id" : "99723", "city" : "BARROW", "loc" : [ -156.817409, 71.23463700000001 ], "pop" : 3696, "state" : "AK" } +{ "_id" : "99724", "city" : "BEAVER", "loc" : [ -147.279803, 66.33883 ], "pop" : 103, "state" : "AK" } +{ "_id" : "99726", "city" : "BETTLES FIELD", "loc" : [ -151.062414, 67.100495 ], "pop" : 156, "state" : "AK" } +{ "_id" : "99727", "city" : "BUCKLAND", "loc" : [ -161.131676, 65.98105200000001 ], "pop" : 318, "state" : "AK" } +{ "_id" : "99729", "city" : "CANTWELL", "loc" : [ -148.89735, 63.395458 ], "pop" : 210, "state" : "AK" } +{ "_id" : "99730", "city" : "CENTRAL", "loc" : [ -144.74886, 65.468058 ], "pop" : 107, "state" : "AK" } +{ "_id" : "99733", "city" : "CIRCLE", "loc" : [ -144.08262, 65.82454199999999 ], "pop" : 73, "state" : "AK" } +{ "_id" : "99734", "city" : "PRUDHOE BAY", "loc" : [ -148.559636, 70.07005700000001 ], "pop" : 153, "state" : "AK" } +{ "_id" : "99736", "city" : "DEERING", "loc" : [ -162.711951, 66.062265 ], "pop" : 167, "state" : "AK" } +{ "_id" : "99737", "city" : "DOT LAKE", "loc" : [ -145.613611, 64.005426 ], "pop" : 4111, "state" : "AK" } +{ "_id" : "99739", "city" : "ELIM", "loc" : [ -162.260371, 64.621662 ], "pop" : 264, "state" : "AK" } +{ "_id" : "99740", "city" : "FORT YUKON", "loc" : [ -145.306439, 66.52074399999999 ], "pop" : 662, "state" : "AK" } +{ "_id" : "99741", "city" : "GALENA", "loc" : [ -156.797701, 64.760784 ], "pop" : 847, "state" : "AK" } +{ "_id" : "99742", "city" : "GAMBELL", "loc" : [ -171.701685, 63.776555 ], "pop" : 525, "state" : "AK" } +{ "_id" : "99743", "city" : "HEALY", "loc" : [ -149.011128, 63.917123 ], "pop" : 1057, "state" : "AK" } +{ "_id" : "99744", "city" : "ANDERSON", "loc" : [ -149.1718, 64.300693 ], "pop" : 300, "state" : "AK" } +{ "_id" : "99745", "city" : "HUGHES", "loc" : [ -154.26443, 66.038246 ], "pop" : 64, "state" : "AK" } +{ "_id" : "99746", "city" : "HUSLIA", "loc" : [ -156.291976, 65.68991800000001 ], "pop" : 207, "state" : "AK" } +{ "_id" : "99747", "city" : "KAKTOVIK", "loc" : [ -143.631329, 70.042889 ], "pop" : 245, "state" : "AK" } +{ "_id" : "99748", "city" : "KALTAG", "loc" : [ -158.724251, 64.33045199999999 ], "pop" : 240, "state" : "AK" } +{ "_id" : "99749", "city" : "KIANA", "loc" : [ -158.152204, 67.18026 ], "pop" : 349, "state" : "AK" } +{ "_id" : "99750", "city" : "KIVALINA", "loc" : [ -163.733617, 67.665859 ], "pop" : 689, "state" : "AK" } +{ "_id" : "99751", "city" : "KOBUK", "loc" : [ -157.066864, 66.91225300000001 ], "pop" : 306, "state" : "AK" } +{ "_id" : "99752", "city" : "KOTZEBUE", "loc" : [ -162.126493, 66.846459 ], "pop" : 3347, "state" : "AK" } +{ "_id" : "99753", "city" : "KOYUK", "loc" : [ -161.149957, 64.931668 ], "pop" : 231, "state" : "AK" } +{ "_id" : "99755", "city" : "DENALI NATIONAL", "loc" : [ -149.539532, 63.516075 ], "pop" : 27, "state" : "AK" } +{ "_id" : "99756", "city" : "MANLEY HOT SPRIN", "loc" : [ -150.573267, 65.02058 ], "pop" : 122, "state" : "AK" } +{ "_id" : "99757", "city" : "LAKE MINCHUMINA", "loc" : [ -152.430081, 63.903884 ], "pop" : 32, "state" : "AK" } +{ "_id" : "99758", "city" : "MINTO", "loc" : [ -149.691186, 65.05839899999999 ], "pop" : 228, "state" : "AK" } +{ "_id" : "99759", "city" : "POINT LAY", "loc" : [ -162.906148, 69.705626 ], "pop" : 139, "state" : "AK" } +{ "_id" : "99760", "city" : "NENANA", "loc" : [ -149.086744, 64.55765599999999 ], "pop" : 393, "state" : "AK" } +{ "_id" : "99761", "city" : "NOATAK", "loc" : [ -160.509453, 66.97553000000001 ], "pop" : 395, "state" : "AK" } +{ "_id" : "99762", "city" : "GOLOVIN", "loc" : [ -165.310667, 64.505775 ], "pop" : 3706, "state" : "AK" } +{ "_id" : "99763", "city" : "NOORVIK", "loc" : [ -161.044132, 66.836353 ], "pop" : 534, "state" : "AK" } +{ "_id" : "99765", "city" : "NULATO", "loc" : [ -157.991353, 64.778024 ], "pop" : 492, "state" : "AK" } +{ "_id" : "99766", "city" : "POINT HOPE", "loc" : [ -166.72618, 68.31205799999999 ], "pop" : 640, "state" : "AK" } +{ "_id" : "99767", "city" : "RAMPART", "loc" : [ -150.011201, 65.383627 ], "pop" : 68, "state" : "AK" } +{ "_id" : "99768", "city" : "RUBY", "loc" : [ -155.503872, 64.720062 ], "pop" : 172, "state" : "AK" } +{ "_id" : "99769", "city" : "SAVOONGA", "loc" : [ -170.470908, 63.679737 ], "pop" : 519, "state" : "AK" } +{ "_id" : "99770", "city" : "SELAWIK", "loc" : [ -158.534287, 65.713537 ], "pop" : 0, "state" : "AK" } +{ "_id" : "99771", "city" : "SHAKTOOLIK", "loc" : [ -161.174589, 64.37549799999999 ], "pop" : 183, "state" : "AK" } +{ "_id" : "99772", "city" : "SHISHMAREF", "loc" : [ -166.137276, 66.23056200000001 ], "pop" : 456, "state" : "AK" } +{ "_id" : "99773", "city" : "SHUNGNAK", "loc" : [ -157.613496, 66.958141 ], "pop" : 0, "state" : "AK" } +{ "_id" : "99774", "city" : "STEVENS VILLAGE", "loc" : [ -149.118286, 65.99589400000001 ], "pop" : 110, "state" : "AK" } +{ "_id" : "99777", "city" : "TANANA", "loc" : [ -152.103747, 65.15648299999999 ], "pop" : 345, "state" : "AK" } +{ "_id" : "99778", "city" : "TELLER", "loc" : [ -166.3833, 65.24016399999999 ], "pop" : 260, "state" : "AK" } +{ "_id" : "99780", "city" : "BORDER", "loc" : [ -142.523046, 63.435022 ], "pop" : 1805, "state" : "AK" } +{ "_id" : "99781", "city" : "VENETIE", "loc" : [ -146.413723, 67.010446 ], "pop" : 184, "state" : "AK" } +{ "_id" : "99782", "city" : "WAINWRIGHT", "loc" : [ -160.012532, 70.620064 ], "pop" : 492, "state" : "AK" } +{ "_id" : "99783", "city" : "WALES", "loc" : [ -168.520521, 65.68821199999999 ], "pop" : 341, "state" : "AK" } +{ "_id" : "99784", "city" : "WHITE MOUNTAIN", "loc" : [ -163.42185, 64.702791 ], "pop" : 194, "state" : "AK" } +{ "_id" : "99785", "city" : "BREVIG MISSION", "loc" : [ -166.478578, 65.334187 ], "pop" : 198, "state" : "AK" } +{ "_id" : "99786", "city" : "AMBLER", "loc" : [ -156.455652, 67.46951 ], "pop" : 8, "state" : "AK" } +{ "_id" : "99788", "city" : "CHALKYITSIK", "loc" : [ -143.638121, 66.71899999999999 ], "pop" : 99, "state" : "AK" } +{ "_id" : "99789", "city" : "NUIQSUT", "loc" : [ -150.997119, 70.19273699999999 ], "pop" : 354, "state" : "AK" } +{ "_id" : "99801", "city" : "JUNEAU", "loc" : [ -134.529429, 58.362767 ], "pop" : 24947, "state" : "AK" } +{ "_id" : "99820", "city" : "ANGOON", "loc" : [ -134.371052, 57.569832 ], "pop" : 1002, "state" : "AK" } +{ "_id" : "99824", "city" : "DOUGLAS", "loc" : [ -134.395041, 58.275597 ], "pop" : 1802, "state" : "AK" } +{ "_id" : "99826", "city" : "GUSTAVUS", "loc" : [ -135.761542, 58.42835 ], "pop" : 258, "state" : "AK" } +{ "_id" : "99827", "city" : "HAINES", "loc" : [ -135.542032, 59.251886 ], "pop" : 2246, "state" : "AK" } +{ "_id" : "99829", "city" : "HOONAH", "loc" : [ -135.558435, 58.032237 ], "pop" : 1670, "state" : "AK" } +{ "_id" : "99833", "city" : "PETERSBURG", "loc" : [ -133.160683, 56.827134 ], "pop" : 4253, "state" : "AK" } +{ "_id" : "99835", "city" : "SITKA", "loc" : [ -135.316569, 57.051436 ], "pop" : 8638, "state" : "AK" } +{ "_id" : "99840", "city" : "SKAGWAY", "loc" : [ -135.301794, 59.468471 ], "pop" : 692, "state" : "AK" } +{ "_id" : "99901", "city" : "KETCHIKAN", "loc" : [ -131.683175, 55.372028 ], "pop" : 13886, "state" : "AK" } +{ "_id" : "99919", "city" : "THORNE BAY", "loc" : [ -132.513815, 55.66086 ], "pop" : 744, "state" : "AK" } +{ "_id" : "99921", "city" : "CRAIG", "loc" : [ -133.117081, 55.47317 ], "pop" : 1398, "state" : "AK" } +{ "_id" : "99922", "city" : "HYDABURG", "loc" : [ -132.633175, 55.137406 ], "pop" : 891, "state" : "AK" } +{ "_id" : "99923", "city" : "HYDER", "loc" : [ -130.124915, 55.925867 ], "pop" : 116, "state" : "AK" } +{ "_id" : "99925", "city" : "KLAWOCK", "loc" : [ -133.055503, 55.552611 ], "pop" : 851, "state" : "AK" } +{ "_id" : "99926", "city" : "METLAKATLA", "loc" : [ -131.579001, 55.121491 ], "pop" : 1469, "state" : "AK" } +{ "_id" : "99927", "city" : "POINT BAKER", "loc" : [ -133.376372, 56.307858 ], "pop" : 426, "state" : "AK" } +{ "_id" : "99929", "city" : "WRANGELL", "loc" : [ -132.352918, 56.433524 ], "pop" : 2573, "state" : "AK" } +{ "_id" : "99950", "city" : "KETCHIKAN", "loc" : [ -133.18479, 55.942471 ], "pop" : 422, "state" : "AK" } diff --git a/storage/connect/mysql-test/connect/t/alter_xml.test b/storage/connect/mysql-test/connect/t/alter_xml.test index 0b876296e58..8b2164d5548 100644 --- a/storage/connect/mysql-test/connect/t/alter_xml.test +++ b/storage/connect/mysql-test/connect/t/alter_xml.test @@ -1,4 +1,4 @@ ---source have_libxml2.inc +--source windows.inc --echo # --echo # Testing changing table type (not in-place) @@ -11,7 +11,7 @@ SELECT * FROM t1; --echo # This is because the XML top node name defaults to the table name. --echo # Sure enough the temporary table name begins with '#' and is rejected by XML. --echo # Therefore the top node name must be specified (along with the row nodes name). -ALTER TABLE t1 TABLE_TYPE=XML TABNAME=t1 OPTION_LIST='rownode=row'; +ALTER TABLE t1 TABLE_TYPE=XML TABNAME=t1 OPTION_LIST='xmlsup=domdoc,rownode=row'; SELECT * FROM t1; SHOW CREATE TABLE t1; diff --git a/storage/connect/mysql-test/connect/t/alter_xml2.test b/storage/connect/mysql-test/connect/t/alter_xml2.test new file mode 100644 index 00000000000..d67c80c4e9f --- /dev/null +++ b/storage/connect/mysql-test/connect/t/alter_xml2.test @@ -0,0 +1,29 @@ +--source have_libxml2.inc + +--echo # +--echo # Testing changing table type (not in-place) +--echo # +CREATE TABLE t1 (c INT NOT NULL, d CHAR(10) NOT NULL) ENGINE=CONNECT TABLE_TYPE=CSV HEADER=1 QUOTED=1; +INSERT INTO t1 VALUES (1,'One'), (2,'Two'), (3,'Three'); +SELECT * FROM t1; + +--echo # This would fail if the top node name is not specified. +--echo # This is because the XML top node name defaults to the table name. +--echo # Sure enough the temporary table name begins with '#' and is rejected by XML. +--echo # Therefore the top node name must be specified (along with the row nodes name). +ALTER TABLE t1 TABLE_TYPE=XML TABNAME=t1 OPTION_LIST='xmlsup=libxml2,rownode=row'; +SELECT * FROM t1; +SHOW CREATE TABLE t1; + +--echo # Let us see the XML file +CREATE TABLE t2 (line VARCHAR(100) NOT NULL) ENGINE=CONNECT FILE_NAME='t1.xml'; +SELECT * FROM t2; +--echo # NOTE: The first (ignored) row is due to the remaining HEADER=1 option. + +--echo # Testing field option modification +ALTER TABLE t1 MODIFY d CHAR(10) NOT NULL FIELD_FORMAT='@', HEADER=0; +SELECT * FROM t1; +SHOW CREATE TABLE t1; +SELECT * FROM t2; + +DROP TABLE t1, t2; diff --git a/storage/connect/mysql-test/connect/t/dir.test b/storage/connect/mysql-test/connect/t/dir.test index 8a56d4f8829..684b5522b08 100644 --- a/storage/connect/mysql-test/connect/t/dir.test +++ b/storage/connect/mysql-test/connect/t/dir.test @@ -23,10 +23,7 @@ ALTER TABLE t1 OPTION_LIST='subdir=0'; SHOW CREATE TABLE t1; --replace_result $MYSQLD_DATADIR DATADIR/ SELECT fname, ftype, size FROM t1 ORDER BY fname, ftype, size; - -# TODO: add a better error message ---error ER_GET_ERRMSG -SET STATEMENT sql_mode = '' FOR +--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD INSERT INTO t1 VALUES ('','','',''); DROP TABLE t1; diff --git a/storage/connect/mysql-test/connect/t/infoschema-9739.test b/storage/connect/mysql-test/connect/t/infoschema-9739.test index e9eb7fb796e..de61164d10d 100644 --- a/storage/connect/mysql-test/connect/t/infoschema-9739.test +++ b/storage/connect/mysql-test/connect/t/infoschema-9739.test @@ -2,8 +2,8 @@ # MDEV-9739 Assertion `m_status == DA_ERROR || m_status == DA_OK' failed in Diagnostics_area::message() ; connect.xml* tests fail in buildbot # ---source have_libxml2.inc +--source windows.inc -create table t1 (i int) engine=Connect table_type=XML; +create table t1 (i int) engine=Connect table_type=XML option_list='xmlsup=domdoc'; select * from information_schema.tables where create_options like '%table_type=XML%'; drop table t1; diff --git a/storage/connect/mysql-test/connect/t/infoschema2-9739.test b/storage/connect/mysql-test/connect/t/infoschema2-9739.test new file mode 100644 index 00000000000..345274b0577 --- /dev/null +++ b/storage/connect/mysql-test/connect/t/infoschema2-9739.test @@ -0,0 +1,9 @@ +# +# MDEV-9739 Assertion `m_status == DA_ERROR || m_status == DA_OK' failed in Diagnostics_area::message() ; connect.xml* tests fail in buildbot +# + +--source have_libxml2.inc + +create table t1 (i int) engine=Connect table_type=XML option_list='xmlsup=libxml2'; +select * from information_schema.tables where create_options like '%table_type=XML%'; +drop table t1; diff --git a/storage/connect/mysql-test/connect/t/jdbc_new.test b/storage/connect/mysql-test/connect/t/jdbc_new.test index 5586cf8c027..36e8f36ced0 100644 --- a/storage/connect/mysql-test/connect/t/jdbc_new.test +++ b/storage/connect/mysql-test/connect/t/jdbc_new.test @@ -24,11 +24,9 @@ SET GLOBAL time_zone='+1:00'; # Bad user name # Suppress "mysql_real_connect failed:" (printed in _DEBUG build) --replace_result $SLAVE_MYPORT SLAVE_PORT "mysql_real_connect failed: " "" +--error ER_UNKNOWN_ERROR eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=unknown'; ---error ER_GET_ERRMSG -SELECT * FROM t1; -DROP TABLE t1; # Bad database name --replace_result $SLAVE_MYPORT SLAVE_PORT "mysql_real_connect failed: " "" @@ -163,7 +161,7 @@ DROP TABLE t1; CREATE TABLE t1 (a date, b datetime, c time, d timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, e year); SHOW CREATE TABLE t1; -INSERT INTO t1 VALUES('2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23'); +INSERT IGNORE INTO t1 VALUES('2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23'); SELECT * FROM t1; connection master; diff --git a/storage/connect/mysql-test/connect/t/json.test b/storage/connect/mysql-test/connect/t/json.test index fa962d3b302..018489525f7 100644 --- a/storage/connect/mysql-test/connect/t/json.test +++ b/storage/connect/mysql-test/connect/t/json.test @@ -35,15 +35,15 @@ DROP TABLE t1; CREATE TABLE t1 ( ISBN CHAR(15), - Language CHAR(2) FIELD_FORMAT='LANG', - Subject CHAR(32) FIELD_FORMAT='SUBJECT', - Authors INT(2) FIELD_FORMAT='AUTHOR:[#]', - Title CHAR(32) FIELD_FORMAT='TITLE', - Translation CHAR(32) FIELD_FORMAT='TRANSLATION', - Translator CHAR(80) FIELD_FORMAT='TRANSLATOR', - Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', - Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', - Year int(4) FIELD_FORMAT='DATEPUB' + Language CHAR(2) FIELD_FORMAT='$.LANG', + Subject CHAR(32) FIELD_FORMAT='$.SUBJECT', + Authors INT(2) FIELD_FORMAT='$.AUTHOR[#]', + Title CHAR(32) FIELD_FORMAT='$.TITLE', + Translation CHAR(32) FIELD_FORMAT='$.TRANSLATION', + Translator CHAR(80) FIELD_FORMAT='$.TRANSLATOR', + Publisher CHAR(20) FIELD_FORMAT='$.PUBLISHER.NAME', + Location CHAR(16) FIELD_FORMAT='$.PUBLISHER.PLACE', + Year int(4) FIELD_FORMAT='$.DATEPUB' ) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; SELECT * FROM t1; @@ -55,16 +55,16 @@ DROP TABLE t1; CREATE TABLE t1 ( ISBN CHAR(15), - Language CHAR(2) FIELD_FORMAT='LANG', - Subject CHAR(32) FIELD_FORMAT='SUBJECT', - AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[" and "]:FIRSTNAME', - AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[" and "]:LASTNAME', - Title CHAR(32) FIELD_FORMAT='TITLE', - Translation CHAR(32) FIELD_FORMAT='TRANSLATION', - Translator CHAR(80) FIELD_FORMAT='TRANSLATOR', - Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', - Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', - Year int(4) FIELD_FORMAT='DATEPUB' + Language CHAR(2) FIELD_FORMAT='$.LANG', + Subject CHAR(32) FIELD_FORMAT='$.SUBJECT', + AuthorFN CHAR(128) FIELD_FORMAT='$.AUTHOR[" and "].FIRSTNAME', + AuthorLN CHAR(128) FIELD_FORMAT='$.AUTHOR[" and "].LASTNAME', + Title CHAR(32) FIELD_FORMAT='$.TITLE', + Translation CHAR(32) FIELD_FORMAT='$.TRANSLATION', + Translator CHAR(80) FIELD_FORMAT='$.TRANSLATOR', + Publisher CHAR(20) FIELD_FORMAT='$.PUBLISHER.NAME', + Location CHAR(16) FIELD_FORMAT='$.PUBLISHER.PLACE', + Year int(4) FIELD_FORMAT='$.DATEPUB' ) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; SELECT * FROM t1; @@ -76,16 +76,16 @@ DROP TABLE t1; CREATE TABLE t1 ( ISBN CHAR(15), - Language CHAR(2) FIELD_FORMAT='LANG', - Subject CHAR(32) FIELD_FORMAT='SUBJECT', - AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:FIRSTNAME', - AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:LASTNAME', - Title CHAR(32) FIELD_FORMAT='TITLE', - Translation CHAR(32) FIELD_FORMAT='TRANSLATION', - Translator CHAR(80) FIELD_FORMAT='TRANSLATOR', - Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', - Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', - Year int(4) FIELD_FORMAT='DATEPUB' + Language CHAR(2) FIELD_FORMAT='$.LANG', + Subject CHAR(32) FIELD_FORMAT='$.SUBJECT', + AuthorFN CHAR(128) FIELD_FORMAT='$.AUTHOR[*].FIRSTNAME', + AuthorLN CHAR(128) FIELD_FORMAT='$.AUTHOR[*].LASTNAME', + Title CHAR(32) FIELD_FORMAT='$.TITLE', + Translation CHAR(32) FIELD_FORMAT='$.TRANSLATION', + Translator CHAR(80) FIELD_FORMAT='$.TRANSLATOR', + Publisher CHAR(20) FIELD_FORMAT='$.PUBLISHER.NAME', + Location CHAR(16) FIELD_FORMAT='$.PUBLISHER.PLACE', + Year int(4) FIELD_FORMAT='$.DATEPUB' ) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; SELECT * FROM t1; @@ -98,7 +98,7 @@ SELECT * FROM t1 WHERE ISBN = '9782212090819'; CREATE TABLE t2 ( FIRSTNAME CHAR(32), LASTNAME CHAR(32)) -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json' OPTION_LIST='Object=[1]:AUTHOR'; +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json' OPTION_LIST='Object=$[1].AUTHOR'; SELECT * FROM t2; INSERT INTO t2 VALUES('Charles','Dickens'); SELECT * FROM t1; @@ -122,17 +122,17 @@ DROP TABLE t1; CREATE TABLE t1 ( ISBN CHAR(15) NOT NULL, - Language CHAR(2) FIELD_FORMAT='LANG', - Subject CHAR(32) FIELD_FORMAT='SUBJECT', - AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:FIRSTNAME', - AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:LASTNAME', - Title CHAR(32) FIELD_FORMAT='TITLE', - Translation CHAR(32) FIELD_FORMAT='TRANSLATED:PREFIX', - TranslatorFN CHAR(80) FIELD_FORMAT='TRANSLATED:TRANSLATOR:FIRSTNAME', - TranslatorLN CHAR(80) FIELD_FORMAT='TRANSLATED:TRANSLATOR:LASTNAME', - Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', - Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', - Year int(4) FIELD_FORMAT='DATEPUB', + Language CHAR(2) FIELD_FORMAT='$.LANG', + Subject CHAR(32) FIELD_FORMAT='$.SUBJECT', + AuthorFN CHAR(128) FIELD_FORMAT='$.AUTHOR[*].FIRSTNAME', + AuthorLN CHAR(128) FIELD_FORMAT='$.AUTHOR[*].LASTNAME', + Title CHAR(32) FIELD_FORMAT='$.TITLE', + Translation CHAR(32) FIELD_FORMAT='$.TRANSLATED.PREFIX', + TranslatorFN CHAR(80) FIELD_FORMAT='$.TRANSLATED.TRANSLATOR.FIRSTNAME', + TranslatorLN CHAR(80) FIELD_FORMAT='$.TRANSLATED.TRANSLATOR.LASTNAME', + Publisher CHAR(20) FIELD_FORMAT='$.PUBLISHER.NAME', + Location CHAR(16) FIELD_FORMAT='$.PUBLISHER.PLACE', + Year int(4) FIELD_FORMAT='$.DATEPUB', INDEX IX(ISBN) ) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='bib0.json' LRECL=320 OPTION_LIST='Pretty=0'; @@ -148,9 +148,9 @@ DROP TABLE t1; --echo # CREATE TABLE t1 ( WHO CHAR(12), -WEEK INT(2) FIELD_FORMAT='WEEK:[X]:NUMBER', -WHAT CHAR(32) FIELD_FORMAT='WEEK::EXPENSE:["+"]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK::EXPENSE:[+]:AMOUNT') +WEEK INT(2) FIELD_FORMAT='$.WEEK[*].NUMBER', +WHAT CHAR(32) FIELD_FORMAT='$.WEEK[].EXPENSE["+"].WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[].EXPENSE[+].AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; SELECT * FROM t1; DROP TABLE t1; @@ -160,9 +160,9 @@ DROP TABLE t1; --echo # CREATE TABLE t1 ( WHO CHAR(12), -WEEK INT(2) FIELD_FORMAT='WEEK:[X]:NUMBER', -WHAT CHAR(32) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:AMOUNT') +WEEK INT(2) FIELD_FORMAT='$.WEEK[*].NUMBER', +WHAT CHAR(32) FIELD_FORMAT='$.WEEK[*].EXPENSE[*].WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[*].EXPENSE[*].AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; #--error ER_GET_ERRMSG SELECT * FROM t1; @@ -173,14 +173,14 @@ DROP TABLE t1; --echo # CREATE TABLE t1 ( WHO CHAR(12) NOT NULL, -WEEKS CHAR(12) NOT NULL FIELD_FORMAT='WEEK:[", "]:NUMBER', -SUMS CHAR(64) NOT NULL FIELD_FORMAT='WEEK:["+"]:EXPENSE:[+]:AMOUNT', -SUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[+]:EXPENSE:[+]:AMOUNT', -AVGS CHAR(64) NOT NULL FIELD_FORMAT='WEEK:["+"]:EXPENSE:[!]:AMOUNT', -SUMAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[+]:EXPENSE:[!]:AMOUNT', -AVGSUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[!]:EXPENSE:[+]:AMOUNT', -AVGAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[!]:EXPENSE:[!]:AMOUNT', -AVERAGE DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[!]:EXPENSE:[X]:AMOUNT') +WEEKS CHAR(12) NOT NULL FIELD_FORMAT='$.WEEK[", "].NUMBER', +SUMS CHAR(64) NOT NULL FIELD_FORMAT='$.WEEK["+"].EXPENSE[+].AMOUNT', +SUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[+].EXPENSE[+].AMOUNT', +AVGS CHAR(64) NOT NULL FIELD_FORMAT='$.WEEK["+"].EXPENSE[!].AMOUNT', +SUMAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[+].EXPENSE[!].AMOUNT', +AVGSUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[!].EXPENSE[+].AMOUNT', +AVGAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[!].EXPENSE[!].AMOUNT', +AVERAGE DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[!].EXPENSE[*].AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; SELECT * FROM t1; DROP TABLE t1; @@ -190,25 +190,25 @@ DROP TABLE t1; --echo # CREATE TABLE t2 ( WHO CHAR(12), -WEEK INT(2) FIELD_FORMAT='WEEK:[0]:NUMBER', -WHAT CHAR(32) FIELD_FORMAT='WEEK:[0]:EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[0]:EXPENSE:[X]:AMOUNT') +WEEK INT(2) FIELD_FORMAT='$.WEEK[0].NUMBER', +WHAT CHAR(32) FIELD_FORMAT='$.WEEK[0].EXPENSE[*].WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[0].EXPENSE[*].AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; SELECT * FROM t2; CREATE TABLE t3 ( WHO CHAR(12), -WEEK INT(2) FIELD_FORMAT='WEEK:[1]:NUMBER', -WHAT CHAR(32) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:AMOUNT') +WEEK INT(2) FIELD_FORMAT='$.WEEK[1].NUMBER', +WHAT CHAR(32) FIELD_FORMAT='$.WEEK[1].EXPENSE[*].WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[1].EXPENSE[*].AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; SELECT * FROM t3; CREATE TABLE t4 ( WHO CHAR(12), -WEEK INT(2) FIELD_FORMAT='WEEK:[2]:NUMBER', -WHAT CHAR(32) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:AMOUNT') +WEEK INT(2) FIELD_FORMAT='$.WEEK[2].NUMBER', +WHAT CHAR(32) FIELD_FORMAT='$.WEEK[2].EXPENSE[*].WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[2].EXPENSE[*].AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; SELECT * FROM t4; @@ -230,24 +230,24 @@ DROP TABLE t1, t2, t3, t4; CREATE TABLE t2 ( WHO CHAR(12), WEEK INT(2), -WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') +WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp3.json'; SELECT * FROM t2; CREATE TABLE t3 ( WHO CHAR(12), WEEK INT(2), -WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') +WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp4.json'; SELECT * FROM t3; CREATE TABLE t4 ( WHO CHAR(12), WEEK INT(2), -WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') +WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp5.json'; SELECT * FROM t4; @@ -257,8 +257,8 @@ SELECT * FROM t4; CREATE TABLE t1 ( WHO CHAR(12), WEEK INT(2), -WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') +WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp*.json' MULTIPLE=1; SELECT * FROM t1 ORDER BY WHO, WEEK, WHAT, AMOUNT; DROP TABLE t1; @@ -269,8 +269,8 @@ DROP TABLE t1; CREATE TABLE t1 ( WHO CHAR(12), WEEK INT(2), -WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') +WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp%s.json'; ALTER TABLE t1 PARTITION BY LIST COLUMNS(WEEK) ( diff --git a/storage/connect/mysql-test/connect/t/json_java_2.test b/storage/connect/mysql-test/connect/t/json_java_2.test new file mode 100644 index 00000000000..bb32eff4e94 --- /dev/null +++ b/storage/connect/mysql-test/connect/t/json_java_2.test @@ -0,0 +1,11 @@ +-- source jdbconn.inc +-- source mongo.inc + +eval SET GLOBAL connect_class_path='$MTR_SUITE_DIR/std_data/Mongo2.jar'; +let $DRV= Java; +let $VERS= 2; +let $TYPE= JSON; +let $CONN= CONNECTION='mongodb://localhost:27017' LRECL=4096; + +-- source mongo_test.inc +-- source jdbconn_cleanup.inc diff --git a/storage/connect/mysql-test/connect/t/json_java_3.test b/storage/connect/mysql-test/connect/t/json_java_3.test new file mode 100644 index 00000000000..29e66cd5a1c --- /dev/null +++ b/storage/connect/mysql-test/connect/t/json_java_3.test @@ -0,0 +1,11 @@ +-- source jdbconn.inc +-- source mongo.inc + +eval SET GLOBAL connect_class_path='$MTR_SUITE_DIR/std_data/Mongo3.jar'; +let $DRV= Java; +let $VERS= 3; +let $TYPE= JSON; +let $CONN= CONNECTION='mongodb://localhost:27017' LRECL=4096; + +-- source mongo_test.inc +-- source jdbconn_cleanup.inc diff --git a/storage/connect/mysql-test/connect/t/json_mongo_c.test b/storage/connect/mysql-test/connect/t/json_mongo_c.test new file mode 100644 index 00000000000..b2148124487 --- /dev/null +++ b/storage/connect/mysql-test/connect/t/json_mongo_c.test @@ -0,0 +1,10 @@ +-- source mongo.inc + +let $DRV= C; +let $VERS= 0; +let $PROJ= {"projection":; +let $ENDP= }; +let $TYPE= JSON; +let $CONN= CONNECTION='mongodb://localhost:27017' LRECL=1024; + +-- source mongo_test.inc diff --git a/storage/connect/mysql-test/connect/t/json_udf.inc b/storage/connect/mysql-test/connect/t/json_udf.inc index 2ade7ad02fe..4f675023c44 100644 --- a/storage/connect/mysql-test/connect/t/json_udf.inc +++ b/storage/connect/mysql-test/connect/t/json_udf.inc @@ -9,11 +9,11 @@ if (!$HA_CONNECT_SO) { --skip Needs a dynamically built ha_connect.so } ---eval CREATE FUNCTION json_array RETURNS STRING SONAME '$HA_CONNECT_SO'; +--eval CREATE FUNCTION json_make_array RETURNS STRING SONAME '$HA_CONNECT_SO'; --eval CREATE FUNCTION json_array_add RETURNS STRING SONAME '$HA_CONNECT_SO'; --eval CREATE FUNCTION json_array_add_values RETURNS STRING SONAME '$HA_CONNECT_SO'; --eval CREATE FUNCTION json_array_delete RETURNS STRING SONAME '$HA_CONNECT_SO'; ---eval CREATE FUNCTION json_object RETURNS STRING SONAME '$HA_CONNECT_SO'; +--eval CREATE FUNCTION json_make_object RETURNS STRING SONAME '$HA_CONNECT_SO'; --eval CREATE FUNCTION json_object_nonull RETURNS STRING SONAME '$HA_CONNECT_SO'; --eval CREATE FUNCTION json_object_key RETURNS STRING SONAME '$HA_CONNECT_SO'; --eval CREATE FUNCTION json_object_add RETURNS STRING SONAME '$HA_CONNECT_SO'; diff --git a/storage/connect/mysql-test/connect/t/json_udf.test b/storage/connect/mysql-test/connect/t/json_udf.test index d11e2fd7cf6..35dbbfed706 100644 --- a/storage/connect/mysql-test/connect/t/json_udf.test +++ b/storage/connect/mysql-test/connect/t/json_udf.test @@ -22,13 +22,13 @@ SELECT JsonValue(FALSE); SELECT JsonValue(); SELECT JsonValue('[11, 22, 33]' json_) FROM t1; # -SELECT Json_Array(); -SELECT Json_Array(56, 3.1416, 'My name is "Foo"', NULL); -SELECT Json_Array(Json_Array(56, 3.1416, 'foo'), TRUE); +SELECT Json_Make_Array(); +SELECT Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL); +SELECT Json_Make_Array(Json_Make_Array(56, 3.1416, 'foo'), TRUE); # --error ER_CANT_INITIALIZE_UDF -SELECT Json_Array_Add(Json_Array(56, 3.1416, 'foo', NULL)) Array; -SELECT Json_Array_Add(Json_Array(56, 3.1416, 'foo', NULL), 'One more') Array; +SELECT Json_Array_Add(Json_Make_Array(56, 3.1416, 'foo', NULL)) Array; +SELECT Json_Array_Add(Json_Make_Array(56, 3.1416, 'foo', NULL), 'One more') Array; --error ER_CANT_INITIALIZE_UDF SELECT Json_Array_Add(JsonValue('one value'), 'One more'); --error ER_CANT_INITIALIZE_UDF @@ -39,38 +39,38 @@ SELECT Json_Array_Add(5 json_, 'One more'); SELECT Json_Array_Add('[5,3,8,7,9]' json_, 4, 0); SELECT Json_Array_Add('[5,3,8,7,9]' json_, 4, 2) Array; SELECT Json_Array_Add('[5,3,8,7,9]' json_, 4, 9); -SELECT Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), '[2]', 33, 1); -SELECT Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), 33, '[2]', 1); -SELECT Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), 33, 1, '[2]'); +SELECT Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), '[2]', 33, 1); +SELECT Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), 33, '[2]', 1); +SELECT Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), 33, 1, '[2]'); # -SELECT Json_Array_Add_Values(Json_Array(56, 3.1416, 'machin', NULL), 'One more', 'Two more') Array; -SELECT Json_Array_Add_Values(Json_Array(56, 3.1416, 'machin'), 'One more', 'Two more') Array FROM t1; -SELECT Json_Array_Add_Values(Json_Array(56, 3.1416, 'machin'), n) Array FROM t1; -SELECT Json_Array_Add_Values(Json_Array(n, 3.1416, 'machin'), n) Array FROM t1; +SELECT Json_Array_Add_Values(Json_Make_Array(56, 3.1416, 'machin', NULL), 'One more', 'Two more') Array; +SELECT Json_Array_Add_Values(Json_Make_Array(56, 3.1416, 'machin'), 'One more', 'Two more') Array FROM t1; +SELECT Json_Array_Add_Values(Json_Make_Array(56, 3.1416, 'machin'), n) Array FROM t1; +SELECT Json_Array_Add_Values(Json_Make_Array(n, 3.1416, 'machin'), n) Array FROM t1; SELECT Json_Array_Add_Values('[56]', 3.1416, 'machin') Array; # -SELECT Json_Array_Delete(Json_Array(56, 3.1416, 'My name is "Foo"', NULL), 0); -SELECT Json_Array_Delete(Json_Object(56, 3.1416, 'My name is Foo', NULL), 2); -SELECT Json_Array_Delete(Json_Array(56, 3.1416, 'My name is "Foo"', NULL), '2'); -SELECT Json_Array_Delete(json_array(56, 3.1416, 'My name is "Foo"', NULL), '2', 2); +SELECT Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), 0); +SELECT Json_Array_Delete(Json_Make_Object(56, 3.1416, 'My name is Foo', NULL), 2); +SELECT Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), '2'); +SELECT Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), '2', 2); # -SELECT Json_Object(56, 3.1416, 'foo', NULL); -SELECT Json_Object(56 qty, 3.1416 price, 'foo' truc, NULL garanty); -SELECT Json_Object(); -SELECT Json_Object(Json_Array(56, 3.1416, 'foo'), NULL); -SELECT Json_Array(Json_Object(56 "qty", 3.1416 "price", 'foo') ,NULL); +SELECT Json_Make_Object(56, 3.1416, 'foo', NULL); +SELECT Json_Make_Object(56 qty, 3.1416 price, 'foo' truc, NULL garanty); +SELECT Json_Make_Object(); +SELECT Json_Make_Object(Json_Make_Array(56, 3.1416, 'foo'), NULL); +SELECT Json_Make_Array(Json_Make_Object(56 "qty", 3.1416 "price", 'foo') ,NULL); SELECT Json_Object_Key('qty', 56, 'price', 3.1416, 'truc', 'machin', 'garanty', NULL); --error ER_CANT_INITIALIZE_UDF SELECT Json_Object_Key('qty', 56, 'price', 3.1416, 'truc', 'machin', 'garanty'); # -SELECT Json_Object_Add(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'blue' color); -SELECT Json_Object_Add(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 45.99 price); +SELECT Json_Object_Add(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'blue' color); +SELECT Json_Object_Add(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 45.99 price); SELECT Json_Object_Add(Json_File('notexist.json'), 'cheese' item, '[1]', 1); # -SELECT Json_Object_Delete(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'truc'); -SELECT Json_Object_Delete(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'chose'); +SELECT Json_Object_Delete(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'truc'); +SELECT Json_Object_Delete(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'chose'); # -SELECT Json_Object_List(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty)) "Key List"; +SELECT Json_Object_List(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty)) "Key List"; SELECT Json_Object_List('{"qty":56, "price":3.1416, "truc":"machin", "garanty":null}') "Key List"; --echo # @@ -89,8 +89,8 @@ CREATE TABLE t2 DATEPUB int(4) ) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; -SELECT Json_Array(AUTHOR, TITLE, DATEPUB) FROM t2; -SELECT Json_Object(AUTHOR, TITLE, DATEPUB) FROM t2; +SELECT Json_Make_Array(AUTHOR, TITLE, DATEPUB) FROM t2; +SELECT Json_Make_Object(AUTHOR, TITLE, DATEPUB) FROM t2; --error ER_CANT_INITIALIZE_UDF SELECT Json_Array_Grp(TITLE, DATEPUB) FROM t2; SELECT Json_Array_Grp(TITLE) FROM t2; @@ -106,19 +106,19 @@ CREATE TABLE t3 ( SALARY DOUBLE(8,2) NOT NULL FLAG=52 ) ENGINE=CONNECT TABLE_TYPE=FIX BLOCK_SIZE=8 FILE_NAME='employee.dat' ENDING=1; -SELECT Json_Object(SERIALNO, NAME, TITLE, SALARY) FROM t3 WHERE NAME = 'MERCHANT'; +SELECT Json_Make_Object(SERIALNO, NAME, TITLE, SALARY) FROM t3 WHERE NAME = 'MERCHANT'; SELECT DEPARTMENT, Json_Array_Grp(NAME) FROM t3 GROUP BY DEPARTMENT; #SET connect_json_grp_size=30; Deprecated SELECT JsonSet_Grp_Size(30); -SELECT Json_Object(title, Json_Array_Grp(name) `json_names`) from t3 GROUP BY title; -SELECT Json_Array(DEPARTMENT, Json_Array_Grp(NAME)) FROM t3 GROUP BY DEPARTMENT; -SELECT Json_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES) FROM t3 GROUP BY DEPARTMENT; -SELECT Json_Object(DEPARTMENT, Json_Array_Grp(Json_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT; -SELECT Json_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT, TITLE; +SELECT Json_Make_Object(title, Json_Array_Grp(name) `json_names`) from t3 GROUP BY title; +SELECT Json_Make_Array(DEPARTMENT, Json_Array_Grp(NAME)) FROM t3 GROUP BY DEPARTMENT; +SELECT Json_Make_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES) FROM t3 GROUP BY DEPARTMENT; +SELECT Json_Make_Object(DEPARTMENT, Json_Array_Grp(Json_Make_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT; +SELECT Json_Make_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Make_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT, TITLE; --error ER_CANT_INITIALIZE_UDF SELECT Json_Object_Grp(SALARY) FROM t3; SELECT Json_Object_Grp(NAME, SALARY) FROM t3; -SELECT Json_Object(DEPARTMENT, Json_Object_Grp(NAME, SALARY) "Json_SALARIES") FROM t3 GROUP BY DEPARTMENT; +SELECT Json_Make_Object(DEPARTMENT, Json_Object_Grp(NAME, SALARY) "Json_SALARIES") FROM t3 GROUP BY DEPARTMENT; SELECT Json_Array_Grp(NAME) FROM t3; # SELECT Json_Object_Key(name, title) FROM t3 WHERE DEPARTMENT = 318; @@ -131,59 +131,59 @@ SELECT JsonGet_String(Json_Array_Grp(name),'[#]') FROM t3; SELECT JsonGet_String(Json_Array_Grp(name),'[","]') FROM t3; SELECT JsonGet_String(Json_Array_Grp(name),'[>]') FROM t3; SET @j1 = '[45,28,36,45,89]'; -SELECT JsonGet_String(@j1,'[1]'); -SELECT JsonGet_String(@j1 json_,'[3]'); -SELECT JsonGet_String(Json_Array(45,28,36,45,89),'[3]'); -SELECT JsonGet_String(Json_Array(45,28,36,45,89),'["+"]') "list",'=' as "egal",JsonGet_String(Json_Array(45,28,36,45,89),'[+]') "sum"; -SELECT JsonGet_String(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:[0]'); -SELECT JsonGet_String(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:*'); -SELECT JsonGet_String(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'truc'); +SELECT JsonGet_String(@j1,'1'); +SELECT JsonGet_String(@j1 json_,'3'); +SELECT JsonGet_String(Json_Make_Array(45,28,36,45,89),'3'); +SELECT JsonGet_String(Json_Make_Array(45,28,36,45,89),'["+"]') "list",'=' as "egal",JsonGet_String(Json_Make_Array(45,28,36,45,89),'[+]') "sum"; +SELECT JsonGet_String(Json_Make_Array(Json_Make_Array(45,28),Json_Make_Array(36,45,89)),'1.0'); +SELECT JsonGet_String(Json_Make_Array(Json_Make_Array(45,28),Json_Make_Array(36,45,89)),'1.*'); +SELECT JsonGet_String(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'truc'); SET @j2 = '{"qty":56,"price":3.141600,"truc":"machin","garanty":null}'; SELECT JsonGet_String(@j2 json_,'truc'); SELECT JsonGet_String(@j2,'truc'); SELECT JsonGet_String(@j2,'chose'); SELECT JsonGet_String(NULL json_, NULL); -SELECT department, JsonGet_String(Json_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries:[+]') Sumsal FROM t3 GROUP BY department; +SELECT department, JsonGet_String(Json_Make_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries.[+]') Sumsal FROM t3 GROUP BY department; # -SELECT JsonGet_Int(@j1, '[4]'); +SELECT JsonGet_Int(@j1, '4'); SELECT JsonGet_Int(@j1, '[#]'); SELECT JsonGet_Int(@j1, '[+]'); -SELECT JsonGet_Int(@j1 json_, '[3]'); -SELECT JsonGet_Int(Json_Array(45,28,36,45,89), '[3]'); -SELECT JsonGet_Int(Json_Array(45,28,36,45,89), '["+"]'); -SELECT JsonGet_Int(Json_Array(45,28,36,45,89), '[+]'); -SELECT JsonGet_Int(Json_Array(json_array(45,28), json_array(36,45,89)), '[1]:[0]'); -SELECT JsonGet_Int(Json_Array(json_array(45,28), json_array(36,45,89)), '[0]:[1]'); -SELECT JsonGet_Int(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'qty'); +SELECT JsonGet_Int(@j1 json_, '3'); +SELECT JsonGet_Int(Json_Make_Array(45,28,36,45,89), '3'); +SELECT JsonGet_Int(Json_Make_Array(45,28,36,45,89), '["+"]'); +SELECT JsonGet_Int(Json_Make_Array(45,28,36,45,89), '[+]'); +SELECT JsonGet_Int(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '1.0'); +SELECT JsonGet_Int(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '0.1'); +SELECT JsonGet_Int(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'qty'); SELECT JsonGet_Int(@j2 json_, 'price'); SELECT JsonGet_Int(@j2, 'qty'); SELECT JsonGet_Int('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}', 'chose'); -SELECT JsonGet_Int(JsonGet_String(Json_Array(Json_Array(45,28),Json_Array(36,45,89)), '[1]:*'), '[+]') sum; -SELECT department, JsonGet_Int(Json_Object(department, Json_Array_Grp(salary) "Json_salaries"), 'salaries:[+]') Sumsal FROM t3 GROUP BY department; +SELECT JsonGet_Int(JsonGet_String(Json_Make_Array(Json_Make_Array(45,28),Json_Make_Array(36,45,89)), '1.*'), '[+]') sum; +SELECT department, JsonGet_Int(Json_Make_Object(department, Json_Array_Grp(salary) "Json_salaries"), 'salaries.[+]') Sumsal FROM t3 GROUP BY department; # -SELECT JsonGet_Real(@j1, '[2]'); -SELECT JsonGet_Real(@j1 json_, '[3]', 2); -SELECT JsonGet_Real(Json_Array(45,28,36,45,89), '[3]'); -SELECT JsonGet_Real(Json_Array(45,28,36,45,89), '["+"]'); -SELECT JsonGet_Real(Json_Array(45,28,36,45,89), '[+]'); -SELECT JsonGet_Real(Json_Array(45,28,36,45,89), '[!]'); -SELECT JsonGet_Real(Json_Array(json_array(45,28), json_array(36,45,89)), '[1]:[0]'); -SELECT JsonGet_Real(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'price'); +SELECT JsonGet_Real(@j1, '2'); +SELECT JsonGet_Real(@j1 json_, '3', 2); +SELECT JsonGet_Real(Json_Make_Array(45,28,36,45,89), '3'); +SELECT JsonGet_Real(Json_Make_Array(45,28,36,45,89), '["+"]'); +SELECT JsonGet_Real(Json_Make_Array(45,28,36,45,89), '[+]'); +SELECT JsonGet_Real(Json_Make_Array(45,28,36,45,89), '[!]'); +SELECT JsonGet_Real(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '1.0'); +SELECT JsonGet_Real(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'price'); SELECT JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}' json_, 'qty'); SELECT JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}', 'price'); SELECT JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}', 'price', 4); SELECT JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}', 'chose'); -SELECT department, JsonGet_Real(Json_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries:[+]') Sumsal FROM t3 GROUP BY department; +SELECT department, JsonGet_Real(Json_Make_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries.[+]') Sumsal FROM t3 GROUP BY department; --echo # --echo # Documentation examples --echo # SELECT - JsonGet_Int(Json_Array(45,28,36,45,89), '[4]') "Rank", - JsonGet_Int(Json_Array(45,28,36,45,89), '[#]') "Number", - JsonGet_String(Json_Array(45,28,36,45,89), '[","]') "Concat", - JsonGet_Int(Json_Array(45,28,36,45,89), '[+]') "Sum", - JsonGet_Real(Json_Array(45,28,36,45,89), '[!]', 2) "Avg"; + JsonGet_Int(Json_Make_Array(45,28,36,45,89), '4') "Rank", + JsonGet_Int(Json_Make_Array(45,28,36,45,89), '[#]') "Number", + JsonGet_String(Json_Make_Array(45,28,36,45,89), '[","]') "Concat", + JsonGet_Int(Json_Make_Array(45,28,36,45,89), '[+]') "Sum", + JsonGet_Real(Json_Make_Array(45,28,36,45,89), '[!]', 2) "Avg"; SELECT JsonGet_String('{"qty":7,"price":29.50,"garanty":null}', 'price') "String", JsonGet_Int('{"qty":7,"price":29.50,"garanty":null}', 'price') "Int", @@ -193,10 +193,10 @@ SELECT JsonGet_Real('{"qty":7,"price":29.50,"garanty":null}', 'price', 3) "Real" --echo # --echo # Testing Locate --echo # -SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'machin'); -SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),56); -SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),3.1416); -SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'chose'); +SELECT JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'machin'); +SELECT JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),56); +SELECT JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),3.1416); +SELECT JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'chose'); SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, 'Jack') Path; SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, 'jack' ci) Path; SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, '{"FN":"Jack", "LN":"London"}' json_) Path; @@ -220,7 +220,7 @@ SELECT Json_Locate_All('[[45,28],[[36,45],89]]','45') "All paths"; SELECT Json_Locate_All('[[45,28],[[36,45],89]]','[36,45]' json_); SELECT JsonGet_Int(Json_Locate_All('[[45,28],[[36,45],89]]',45), '[#]') "Nb of occurs"; SELECT Json_Locate_All('[[45,28],[[36,45],89]]',45,2); -SELECT JsonGet_String(Json_Locate_All('[45,28,36,45,89]',45),'[0]'); +SELECT JsonGet_String(Json_Locate_All('[45,28,36,45,89]',45),'0'); SELECT JsonLocate(Json_File('test/biblio.json'), 'Knab'); SELECT Json_Locate_All('test/biblio.json' jfile_, 'Knab'); @@ -237,21 +237,21 @@ SELECT Jfile_Make(Jbin_File('test/fx.json'), 0); SELECT Json_File('test/fx.json', 1); SELECT Json_File('test/fx.json', 2); SELECT Json_File('test/fx.json', 0); -SELECT Json_File('test/fx.json', '[0]'); +SELECT Json_File('test/fx.json', '0'); SELECT Json_File('test/fx.json', '[?]'); -SELECT JsonGet_String(Json_File('test/fx.json'), '[1]:*'); -SELECT JsonGet_String(Json_File('test/fx.json'), '[1]'); -SELECT JsonGet_Int(Json_File('test/fx.json'), '[1]:mileage') AS Mileage; -SELECT JsonGet_Real(Json_File('test/fx.json'), '[0]:price', 2) AS Price; -SELECT Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 'ratings'); -SELECT Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 1, 'ratings'); -SELECT Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 'ratings', 1); -SELECT Json_Array_Add(Json_File('test/fx.json', '[2]:ratings'), 6, 0); -SELECT Json_Array_Delete(Json_File('test/fx.json', '[2]'), 'ratings', 1); -SELECT Json_Object_Add(Json_File('test/fx.json', '[2]'), 'france' origin); -SELECT Json_Object_Add(Json_File('test/fx.json', '[2]'), 70 H, 'size'); -SELECT Json_Object_Add(Json_File('test/fx.json', '[3]'), 70 H, 'size'); -SELECT Json_Object_List(Json_File('test/fx.json', '[3]:size')); +SELECT JsonGet_String(Json_File('test/fx.json'), '1.*'); +SELECT JsonGet_String(Json_File('test/fx.json'), '1'); +SELECT JsonGet_Int(Json_File('test/fx.json'), '1.mileage') AS Mileage; +SELECT JsonGet_Real(Json_File('test/fx.json'), '0.price', 2) AS Price; +SELECT Json_Array_Add(Json_File('test/fx.json', '2'), 6, 'ratings'); +SELECT Json_Array_Add(Json_File('test/fx.json', '2'), 6, 1, 'ratings'); +SELECT Json_Array_Add(Json_File('test/fx.json', '2'), 6, 'ratings', 1); +SELECT Json_Array_Add(Json_File('test/fx.json', '2.ratings'), 6, 0); +SELECT Json_Array_Delete(Json_File('test/fx.json', '2'), 'ratings', 1); +SELECT Json_Object_Add(Json_File('test/fx.json', '2'), 'france' origin); +SELECT Json_Object_Add(Json_File('test/fx.json', '2'), 70 H, 'size'); +SELECT Json_Object_Add(Json_File('test/fx.json', '3'), 70 H, 'size'); +SELECT Json_Object_List(Json_File('test/fx.json', '3.size')); DROP TABLE t1; DROP TABLE t2; @@ -264,3 +264,5 @@ DROP TABLE t3; --remove_file $MYSQLD_DATADIR/test/biblio.json --remove_file $MYSQLD_DATADIR/test/employee.dat --remove_file $MYSQLD_DATADIR/test/fx.json + + diff --git a/storage/connect/mysql-test/connect/t/json_udf2.inc b/storage/connect/mysql-test/connect/t/json_udf2.inc index 4c74e2c11f2..fe23692af46 100644 --- a/storage/connect/mysql-test/connect/t/json_udf2.inc +++ b/storage/connect/mysql-test/connect/t/json_udf2.inc @@ -1,10 +1,10 @@ --disable_query_log -DROP FUNCTION json_array; +DROP FUNCTION json_make_array; DROP FUNCTION json_array_add; DROP FUNCTION json_array_add_values; DROP FUNCTION json_array_delete; -DROP FUNCTION json_object; +DROP FUNCTION json_make_object; DROP FUNCTION json_object_nonull; DROP FUNCTION json_object_key; DROP FUNCTION json_object_add; diff --git a/storage/connect/mysql-test/connect/t/json_udf_bin.test b/storage/connect/mysql-test/connect/t/json_udf_bin.test index e4ee422c263..cbbfca9d2d2 100644 --- a/storage/connect/mysql-test/connect/t/json_udf_bin.test +++ b/storage/connect/mysql-test/connect/t/json_udf_bin.test @@ -16,7 +16,7 @@ SELECT Json_Array_Add(Jbin_Array(56, 3.1416, 'My name is "Foo"', NULL), JsonGet_ SELECT Json_Array_Delete(Jbin_Array_Add_Values(Jbin_Array(56, 3.1416, 'My name is "Foo"', NULL), "One more", 2), 4); SELECT Json_Array_Delete(Jbin_Array(56, Jbin_Array(3.1416, 'My name is "Foo"'), NULL), '[1]', 1); SELECT Json_Array_Delete(Jbin_Array(56, Jbin_Array(3.1416, 'My name is "Foo"'), TRUE), 1, '[1]'); -SELECT Json_Array(1, TRUE, 0, FALSE); +SELECT Json_Make_Array(1, TRUE, 0, FALSE); SELECT Json_Serialize(Jbin_Array(TRUE, FALSE)); # SELECT Json_Object_Key('qty', 56, 'price', 3.1416, 'truc', 'machin', 'garanty', NULL); @@ -35,65 +35,65 @@ SELECT Json_Serialize(Jbin_File('gloss.json')); SELECT JsonLocate(Jbin_File('gloss.json'),'XML'); # SELECT Json_Object_Key('first', 'foo', 'second', Jbin_Array('a', 33)); -SELECT Json_Get_Item(Json_Array('a','b','c'), '[1]'); -SELECT Json_Get_Item(Json_Object('foo' AS "first", Json_Array('a', 33) AS "json_second"), 'second') AS "item"; -SELECT Json_Get_Item(Jbin_Object('foo' first, Jbin_Array('a', 33) jbin_second), 'second:*') item; -SELECT Json_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv'); -SELECT Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv')); -SELECT Json_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv:*'); -SELECT JsonGet_String(Json_File('gloss.json'),'glossary:GlossDiv:GlossList:GlossEntry:GlossDef:GlossSeeAlso') lang; -SELECT Json_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv:GlossList:GlossEntry:GlossDef:GlossSeeAlso') "See also"; -SELECT Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv:GlossList:GlossEntry:GlossDef:GlossSeeAlso')) "See also"; -SELECT JsonGet_String(Json_Get_Item(Json_File('gloss.json'),'glossary:GlossDiv:GlossList:GlossEntry:GlossDef:GlossSeeAlso'),'[0]') lang; +SELECT Json_Get_Item(Json_Make_Array('a','b','c'), '$[1]'); +SELECT Json_Get_Item(Json_Make_Object('foo' AS "first", Json_Make_Array('a', 33) AS "json_second"), '$.second') AS "item"; +SELECT Json_Get_Item(Jbin_Object('foo' first, Jbin_Array('a', 33) jbin_second), '$.second') item; +SELECT Json_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv'); +SELECT Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv')); +SELECT Json_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv'); +SELECT JsonGet_String(Json_File('gloss.json'),'$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso') lang; +SELECT Json_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso') "See also"; +SELECT Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso')) "See also"; +SELECT JsonGet_String(Json_Get_Item(Json_File('gloss.json'),'$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso'),'$[0]') lang; --echo # --echo # Test Item Get/Set/Insert/Update UDF's --echo # -SELECT Json_Get_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '[]'); -SELECT Json_Get_Item(Jbin_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '[1]'); -SELECT Json_Get_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), '[1]'); +SELECT Json_Get_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '$[]'); +SELECT Json_Get_Item(Jbin_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '$[1]'); +SELECT Json_Get_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), '$[1]'); # -SELECT Json_Set_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4))); +SELECT Json_Set_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4))); --error ER_CANT_INITIALIZE_UDF -SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 'foo'); -SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq'); -SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 7, '[1]'); -SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 7, '[1]'); -SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Json_Array(7, 8, 9), '[1]'); -SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[2]'); -SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[2]:*'); -SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 3.1416, 'foo'); -SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 'toto', '[1]:[2]'); -SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 300, '[2]:nxt:total:[]'); -SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 300, '[2]:nxt:total:[]'); -SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[1]', 5, '[2]:cinq', 10, '[1]:[]'); -SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 44, '[2]:quatre'); +SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), '$.foo'); +SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq'); +SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 7, '$[1]'); +SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 7, '$[1]'); +SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Json_Make_Array(7, 8, 9), '$[1]'); +SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[2]'); +SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[2].*'); +SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 3.1416, '$.foo'); +SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 'toto', '$[1][2]'); +SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 300, '$[2].nxt.total[]'); +SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 300, '$[2].nxt.total[]'); +SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[1]', 5, '$[2].cinq', 10, '$[1][]'); +SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 44, '$[2].quatre'); SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, 'truc'); SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, ''); SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '*'); -SELECT Json_Serialize(Jbin_Set_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq')); +SELECT Json_Serialize(Jbin_Set_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq')); # -SELECT Json_Insert_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq'); -SELECT Json_Update_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq'); -SELECT Json_Insert_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 44, '[2]:quatre'); -SELECT Json_Update_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 44, '[2]:quatre'); -SELECT Json_Insert_Item(Json_Array(1, Json_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[1]', 300, '[2]:nxt:total:[]'); -SELECT Json_Update_Item(Json_Array(1, Json_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[1]', 300, '[2]:nxt:total:[]'); -SELECT Json_Insert_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[]'); -SELECT Json_Update_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[]'); +SELECT Json_Insert_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq'); +SELECT Json_Update_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq'); +SELECT Json_Insert_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 44, '$[2].quatre'); +SELECT Json_Update_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 44, '$[2].quatre'); +SELECT Json_Insert_Item(Json_Make_Array(1, Json_Make_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][1]', 300, '$[2].nxt.total[]'); +SELECT Json_Update_Item(Json_Make_Array(1, Json_Make_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][1]', 300, '$[2].nxt.total[]'); +SELECT Json_Insert_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[]'); +SELECT Json_Update_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[]'); --echo # --echo # Test merging items UDF's --echo # SELECT Json_Item_Merge(Jbin_Array('a','b','c'), Jbin_Array('d','e','f')); -SELECT Json_Item_Merge(Json_Array('a','b','c'), Json_Array('d','e','f')) AS "Result"; +SELECT Json_Item_Merge(Json_Make_Array('a','b','c'), Json_Make_Array('d','e','f')) AS "Result"; SELECT Json_Array_Add(Jbin_Item_Merge(Jbin_Array('a','b','c'), Jbin_Array('d','e','f')), 'and', 3); SELECT Json_Item_Merge(Jbin_Object(1 "a",2 "b",3 "c"), Jbin_Object(4 "d",5 "e",6 "f")); SELECT Json_Item_Merge(Jbin_Object(1 "a",2 "b",2 "c"), Jbin_Array('d','e','f')); SELECT Json_Object_Add(Jbin_Item_Merge(Jbin_Object(1 "a",2 "b",3 "c"), Jbin_Object(4 "d",5 "e",6 "f")), 'x' AS "and"); SELECT Json_Item_Merge(Jbin_Object(1 "a",2 "b",3 "c"), Jbin_Object(4 "a",5 "e",6 "f")); --error ER_CANT_INITIALIZE_UDF -SELECT Json_Item_Merge('foo', Json_Array('d','e','f')); +SELECT Json_Item_Merge('foo', Json_Make_Array('d','e','f')); --echo # --echo # Test making file UDF's @@ -116,14 +116,14 @@ SELECT Json_Array_Add(Jbin_File('bt1.json'), 'd'); SELECT Json_File('bt1.json', 2); --echo # Back to the original file SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json'); -SELECT Json_Object(Jbin_Array_Add(Jbin_Array('a','b','c'), 'd') "Jbin_foo") AS "Result"; -SELECT Json_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd')) AS "Result"; -SELECT Json_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1") AS "Result"; +SELECT Json_Make_Object(Jbin_Array_Add(Jbin_Array('a','b','c'), 'd') "Jbin_foo") AS "Result"; +SELECT Json_Make_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd')) AS "Result"; +SELECT Json_Make_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1") AS "Result"; --echo # This does modify the file -SELECT Json_Object(Json_Array_Add(Jbin_File('bt1.json'), 'd') "Jfile_bt1") AS "Result"; +SELECT Json_Make_Object(Json_Array_Add(Jbin_File('bt1.json'), 'd') "Jfile_bt1") AS "Result"; SELECT Json_File('bt1.json'); SELECT Json_File(Json_Array_Delete(Jbin_File('bt1.json'), 3), 2); -SELECT Json_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1", n "t1") AS "Result" from t1; +SELECT Json_Make_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1", n "t1") AS "Result" from t1; SELECT Json_File(Json_Array_Add(Jbin_Array_Add(Jbin_File('bt1.json'), 'd'), 'e')) AS "Result"; SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json'); SELECT Json_File(Json_Array_Add(Jbin_Array_Add(Jbin_File('bt1.json'), 'd'), 'e')) AS "Result" from t1; @@ -140,11 +140,11 @@ SELECT Json_File(Jbin_Item_Merge(Jbin_File('bt1.json'), Jbin_Array('d','e','f')) SELECT Json_File(Json_Item_Merge(Jbin_File('bt1.json'), Jbin_Array('d','e','f'))); SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json'); --echo # Test DELETE from file -SELECT Json_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 1)) AS "Result"; -SELECT Json_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 2) "Jbin_bt1") AS "Result"; -SELECT Json_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 0) "Jbin_bt1", n "t1") AS "Result" from t1; -SELECT Json_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1; -SELECT Json_Object(Json_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1; +SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 1)) AS "Result"; +SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 2) "Jbin_bt1") AS "Result"; +SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 0) "Jbin_bt1", n "t1") AS "Result" from t1; +SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1; +SELECT Json_Make_Object(Json_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1; --echo # Show modified file SELECT Json_File('bt1.json'); --echo # Object file @@ -153,11 +153,11 @@ SELECT Json_File('bt2.json', 0); SELECT Json_File('bt2.json'); SELECT Json_Serialize(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d")); --echo # First query (file not modified) -SELECT Json_Object(Jbin_Object_Add(Jbin_File('bt2.json'), 4 AS "d") AS "Jbin_new") AS "Result"; +SELECT Json_Make_Object(Jbin_Object_Add(Jbin_File('bt2.json'), 4 AS "d") AS "Jbin_new") AS "Result"; --echo # First query (file modified) -SELECT Json_Object(Json_Object_Add(Jbin_File('bt2.json'), 4 AS "d") AS "Jfile_new") AS "Result"; +SELECT Json_Make_Object(Json_Object_Add(Jbin_File('bt2.json'), 4 AS "d") AS "Jfile_new") AS "Result"; SELECT Jfile_Make(Jbin_Object(1 "a", 2 "b", 3 "c"), 'bt2.json', 0); -SELECT Json_Object(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d") "Jbin_new", n "t1") AS "Result" from t1; +SELECT Json_Make_Object(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d") "Jbin_new", n "t1") AS "Result" from t1; SELECT Json_File(Json_Object_Add(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d"), 5 "e")) AS "Result"; SELECT Json_Object_Add(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d"), 5 "e") AS "Result" from t1; SELECT Json_Object_Add(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d"), n "n") AS "Result" from t1; @@ -167,13 +167,13 @@ SELECT Json_File('bt2.json'); SELECT Jfile_Make(Jbin_Object(1 "a", 2 "b", 3 "c"), 'bt2.json', 0); SELECT Json_Serialize(Jbin_Item_Merge(Jbin_File('bt2.json'), Jbin_Object(4 "d",5 "e",6 "f"))) AS "Result"; SELECT Json_File(Json_Item_Merge(Jbin_File('bt2.json'), Jbin_Object(4 "d",5 "e",6 "f"))) AS "Result"; -SELECT Json_Item_Merge(Json_Object(1 "a", 2 "b", 3 "c"), Json_Object(4 "d",5 "b",6 "f")) AS "Result"; +SELECT Json_Item_Merge(Json_Make_Object(1 "a", 2 "b", 3 "c"), Json_Make_Object(4 "d",5 "b",6 "f")) AS "Result"; # -SELECT Json_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'b')) AS "Result"; -SELECT Json_Object(Jbin_Object_Delete(Jbin_File('bt2.json'), 'c') "Jbin_bt1") AS "Result"; -SELECT Json_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'c') "Jbin_bt1") AS "Result"; -SELECT Json_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'c') "Jfile_bt1") AS "Result"; -SELECT Json_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'a') "Jbin_bt1", n "t1") AS "Result" from t1; +SELECT Json_Make_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'b')) AS "Result"; +SELECT Json_Make_Object(Jbin_Object_Delete(Jbin_File('bt2.json'), 'c') "Jbin_bt1") AS "Result"; +SELECT Json_Make_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'c') "Jbin_bt1") AS "Result"; +SELECT Json_Make_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'c') "Jfile_bt1") AS "Result"; +SELECT Json_Make_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'a') "Jbin_bt1", n "t1") AS "Result" from t1; # SELECT Json_Serialize(Jbin_Object_List(Jbin_File('bt2.json'))) "Key list"; @@ -181,9 +181,9 @@ SELECT Json_Serialize(Jbin_Object_List(Jbin_File('bt2.json'))) "Key list"; # Test documentation examples # SELECT Jfile_Make('{"a":1, "b":[44, 55]}' json_, 'bt3.json', 0); -SELECT Json_Array_Add(Json_File('bt3.json', 'b'), 66); -SELECT Json_Array_Add(Json_File('bt3.json'), 66, 'b'); -SELECT Json_Array_Add(Jbin_File('bt3.json', 'b'), 66); +SELECT Json_Array_Add(Json_File('bt3.json', '$.b'), 66); +SELECT Json_Array_Add(Json_File('bt3.json'), 66, '$.b'); +SELECT Json_Array_Add(Jbin_File('bt3.json', '$.b'), 66); SELECT Json_File('bt3.json', 3); SELECT Jfile_Make('{"a":1, "b":[44, 55]}' json_, 'bt3.json', 0); # @@ -193,11 +193,11 @@ CREATE TABLE t2 ( ENGINE= MYISAM; INSERT INTO t2 VALUES(1,'bt3.json'); --echo # In this table, the jfile_cols column just contains a file name -UPDATE t2 SET jfile_cols = Json_Array_Add(Jbin_File('bt3.json', 'b'), 66) WHERE n = 1; +UPDATE t2 SET jfile_cols = Json_Array_Add(Jbin_File('bt3.json', '$.b'), 66) WHERE n = 1; SELECT JsonGet_String(jfile_cols, '*') FROM t2; -UPDATE t2 SET jfile_cols = Json_Insert_Item(jfile_cols, 77, 'b:[]') WHERE n = 1; -SELECT JsonGet_String(jfile_cols, 'b:*') FROM t2; -UPDATE t2 SET jfile_cols = Json_Insert_Item(Jbin_Insert_Item(jfile_cols, 88, 'b:') , 99, 'b:') WHERE n = 1; +UPDATE t2 SET jfile_cols = Json_Insert_Item(jfile_cols, 77, '$.b[]') WHERE n = 1; +SELECT JsonGet_String(jfile_cols, '$.b.*') FROM t2; +UPDATE t2 SET jfile_cols = Json_Insert_Item(Jbin_Insert_Item(jfile_cols, 88, '$.b[]') , 99, '$.b[]') WHERE n = 1; SELECT JsonGet_String(jfile_cols, '*') FROM t2; DROP TABLE t1, t2; @@ -210,3 +210,4 @@ DROP TABLE t1, t2; --remove_file $MYSQLD_DATADIR/bt1.json --remove_file $MYSQLD_DATADIR/bt2.json --remove_file $MYSQLD_DATADIR/bt3.json + diff --git a/storage/connect/mysql-test/connect/t/mongo.inc b/storage/connect/mysql-test/connect/t/mongo.inc new file mode 100644 index 00000000000..2d7cbcfa8bd --- /dev/null +++ b/storage/connect/mysql-test/connect/t/mongo.inc @@ -0,0 +1,3 @@ +let $MONGO= C:/PROGRA~1/MongoDB/Server/3.4/bin/mongo; +let $MONGOIMPORT= C:/PROGRA~1/MongoDB/Server/3.4/bin/mongoimport; + diff --git a/storage/connect/mysql-test/connect/t/mongo_c.test b/storage/connect/mysql-test/connect/t/mongo_c.test new file mode 100644 index 00000000000..1c4930e91d5 --- /dev/null +++ b/storage/connect/mysql-test/connect/t/mongo_c.test @@ -0,0 +1,9 @@ +-- source mongo.inc + +let $DRV= C; +let $VERS= 0; +let $PROJ= {"projection":; +let $ENDP= }; +let $TYPE= MONGO; + +-- source mongo_test.inc diff --git a/storage/connect/mysql-test/connect/t/mongo_java_2.test b/storage/connect/mysql-test/connect/t/mongo_java_2.test new file mode 100644 index 00000000000..21da5dce68f --- /dev/null +++ b/storage/connect/mysql-test/connect/t/mongo_java_2.test @@ -0,0 +1,10 @@ +-- source jdbconn.inc +-- source mongo.inc + +eval SET GLOBAL connect_class_path='$MTR_SUITE_DIR/std_data/Mongo2.jar'; +let $DRV= Java; +let $VERS= 2; +let $TYPE= MONGO; + +-- source mongo_test.inc +-- source jdbconn_cleanup.inc diff --git a/storage/connect/mysql-test/connect/t/mongo_java_3.test b/storage/connect/mysql-test/connect/t/mongo_java_3.test new file mode 100644 index 00000000000..b7584adcc7e --- /dev/null +++ b/storage/connect/mysql-test/connect/t/mongo_java_3.test @@ -0,0 +1,10 @@ +-- source jdbconn.inc +-- source mongo.inc + +eval SET GLOBAL connect_class_path='$MTR_SUITE_DIR/std_data/Mongo3.jar'; +let $DRV= Java; +let $VERS= 3; +let $TYPE= MONGO; + +-- source mongo_test.inc +-- source jdbconn_cleanup.inc diff --git a/storage/connect/mysql-test/connect/t/mongo_test.inc b/storage/connect/mysql-test/connect/t/mongo_test.inc new file mode 100644 index 00000000000..c223e70f719 --- /dev/null +++ b/storage/connect/mysql-test/connect/t/mongo_test.inc @@ -0,0 +1,203 @@ +--echo # +--echo # Test the MONGO table type +--echo # +eval CREATE TABLE t1 (Document varchar(1024) field_format='*') +ENGINE=CONNECT TABLE_TYPE=$TYPE TABNAME=restaurants $CONN +OPTION_LIST='Driver=$DRV,Version=$VERS' DATA_CHARSET=utf8; +SELECT * from t1 limit 3; +DROP TABLE t1; + +--echo # +--echo # Test catfunc +--echo # +eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=$TYPE TABNAME=restaurants CATFUNC=columns +OPTION_LIST='Level=1,Driver=$DRV,Version=$VERS' DATA_CHARSET=utf8 $CONN; +SELECT * from t1; +DROP TABLE t1; + +--echo # +--echo # Explicit columns +--echo # +eval CREATE TABLE t1 ( +_id VARCHAR(24) NOT NULL, +name VARCHAR(255) NOT NULL, +cuisine VARCHAR(255) NOT NULL, +borough VARCHAR(255) NOT NULL, +restaurant_id VARCHAR(255) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=$TYPE TABNAME=restaurants +CONNECTION='mongodb://localhost:27017' LRECL=1024 DATA_CHARSET=utf8 +OPTION_LIST='Driver=$DRV,Version=$VERS'; +SELECT * FROM t1 LIMIT 10; +DROP TABLE t1; + +--echo # +--echo # Test discovery +--echo # +eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=$TYPE TABNAME=restaurants +OPTION_LIST='Level=1,Driver=$DRV,Version=$VERS' $CONN DATA_CHARSET=utf8; +SHOW CREATE TABLE t1; +SELECT * FROM t1 LIMIT 5; +DROP TABLE t1; + +--echo # +--echo # Dropping a column +--echo # +let $COLIST= $PROJ{"grades":0}$ENDP; +eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=$TYPE TABNAME=restaurants DATA_CHARSET=utf8 +COLIST='$COLIST' OPTION_LIST='Driver=$DRV,Version=$VERS,level=0' $CONN; +SELECT * FROM t1 LIMIT 10; +DROP TABLE t1; + +--echo # +--echo # Specifying Jpath +--echo # +eval CREATE TABLE t1 ( +_id VARCHAR(24) NOT NULL, +name VARCHAR(64) NOT NULL, +cuisine CHAR(200) NOT NULL, +borough CHAR(16) NOT NULL, +street VARCHAR(65) FIELD_FORMAT='address.street', +building CHAR(16) FIELD_FORMAT='address.building', +zipcode CHAR(5) FIELD_FORMAT='address.zipcode', +grade CHAR(1) FIELD_FORMAT='grades.0.grade', +score INT(4) NOT NULL FIELD_FORMAT='grades.0.score', +`date` DATE FIELD_FORMAT='grades.0.date', +restaurant_id VARCHAR(255) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=$TYPE TABNAME='restaurants' DATA_CHARSET=utf8 +OPTION_LIST='Driver=$DRV,Version=$VERS' $CONN; +--vertical_results +SELECT * FROM t1 LIMIT 1; +--horizontal_results +SELECT name, street, score, date FROM t1 LIMIT 5; +SELECT name, cuisine, borough FROM t1 WHERE grade = 'A' LIMIT 10; +SELECT COUNT(*) FROM t1 WHERE grade = 'A'; +SELECT * FROM t1 WHERE cuisine = 'English'; +SELECT * FROM t1 WHERE score = building; +DROP TABLE t1; + +--echo # +--echo # Specifying Filter +--echo # +eval CREATE TABLE t1 ( +_id CHAR(24) NOT NULL, +name CHAR(64) NOT NULL, +borough CHAR(16) NOT NULL, +restaurant_id CHAR(8) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=$TYPE TABNAME=restaurants DATA_CHARSET=utf8 +FILTER='{"cuisine":"French","borough":{"\$ne":"Manhattan"}}' +OPTION_LIST='Driver=$DRV,Version=$VERS' $CONN; +SELECT name FROM t1 WHERE borough = 'Queens'; +DROP TABLE t1; + +--echo # +--echo # Testing pipeline +--echo # +eval CREATE TABLE t1 ( +name VARCHAR(64) NOT NULL, +borough CHAR(16) NOT NULL, +date DATETIME NOT NULL, +grade CHAR(1) NOT NULL, +score INT(4) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=$TYPE TABNAME='restaurants' DATA_CHARSET=utf8 +COLIST='{"pipeline":[{"\$match":{"cuisine":"French"}},{"\$unwind":"\$grades"},{"\$project":{"_id":0,"name":1,"borough":1,"date":"\$grades.date","grade":"\$grades.grade","score":"\$grades.score"}}]}' +OPTION_LIST='Driver=$DRV,Version=$VERS,Pipeline=1' $CONN; +SELECT * FROM t1 LIMIT 10; +SELECT name, grade, score, date FROM t1 WHERE borough = 'Bronx'; +DROP TABLE t1; + +--echo # +--echo # try level 2 discovery +--echo # +let $COLIST= $PROJ{"cuisine":0}$ENDP; +eval CREATE TABLE t1 +ENGINE=CONNECT TABLE_TYPE=$TYPE TABNAME=restaurants +FILTER='{"cuisine":"French","borough":{"\$ne":"Manhattan"}}' +COLIST='$COLIST' $CONN +OPTION_LIST='Driver=$DRV,level=2,version=$VERS'; +SHOW CREATE TABLE t1; +IF ($TYPE == MONGO) +{ +SELECT name, borough, address_street, grades_0_score AS score FROM t1 WHERE grades_0_grade = 'B'; +} +IF ($TYPE == JSON) +{ +SELECT name, borough, address_street, grades_score AS score FROM t1 WHERE grades_grade = 'B'; +} +DROP TABLE t1; + +--echo # +--echo # try CRUD operations +--echo # +--exec $MONGO --eval "db.testcoll.drop()" --quiet +eval CREATE TABLE t1 (_id INT(4) NOT NULL, msg CHAR(64)) +ENGINE=CONNECT TABLE_TYPE=$TYPE TABNAME='testcoll' +OPTION_LIST='Driver=$DRV,Version=$VERS' $CONN; +DELETE FROM t1; +INSERT INTO t1 VALUES(0,NULL),(1,'One'),(2,'Two'),(3,'Three'); +SELECT * FROM t1; +UPDATE t1 SET msg = 'Deux' WHERE _id = 2; +DELETE FROM t1 WHERE msg IS NULL; +SELECT * FROM t1; +DELETE FROM t1; +DROP TABLE t1; +--exec $MONGO --eval "db.testcoll.drop()" --quiet + +--echo # +--echo # List states whose population is equal or more than 10 millions +--echo # +--exec $MONGO --eval "db.cities.drop()" --quiet +--exec $MONGOIMPORT --quiet $MTR_SUITE_DIR/std_data/cities.json +eval CREATE TABLE t1 ( + _id char(5) NOT NULL, + city char(16) NOT NULL, + loc_0 double(12,6) NOT NULL `FIELD_FORMAT`='loc.0', + loc_1 char(12) NOT NULL `FIELD_FORMAT`='loc.1', + pop int(11) NOT NULL, + state char(2) NOT NULL) +ENGINE=CONNECT CONNECTION='mongodb://localhost:27017' TABLE_TYPE='MONGO' TABNAME='cities' +OPTION_LIST='Driver=$DRV,Version=$VERS' $CONN DATA_CHARSET='utf8'; +--echo # Using SQL for grouping +SELECT state, sum(pop) AS totalPop FROM t1 GROUP BY state HAVING totalPop >= 10000000 ORDER BY totalPop DESC; +DROP TABLE t1; + +--echo # Using a pipeline for grouping +eval CREATE TABLE t1 (_id CHAR(2) NOT NULL, totalPop INT(11) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=$TYPE TABNAME='cities' DATA_CHARSET=utf8 +COLIST='{"pipeline":[{"\$group":{"_id":"\$state","totalPop":{"\$sum":"\$pop"}}},{"\$match":{"totalPop":{"\$gte":10000000}}},{"\$sort":{"totalPop":-1}}]}' +OPTION_LIST='Driver=$DRV,Version=$VERS,Pipeline=1' $CONN; +SELECT * FROM t1; +DROP TABLE t1; +--exec $MONGO --eval "db.cities.drop()" --quiet + +--echo # +--echo # Test making array +--echo # +eval CREATE TABLE t1 ( + _id int(4) NOT NULL, + item CHAR(8) NOT NULL, + prices_0 INT(6) FIELD_FORMAT='prices.0', + prices_1 INT(6) FIELD_FORMAT='prices.1', + prices_2 INT(6) FIELD_FORMAT='prices.2', + prices_3 INT(6) FIELD_FORMAT='prices.3', + prices_4 INT(6) FIELD_FORMAT='prices.4') +ENGINE=CONNECT TABLE_TYPE=$TYPE TABNAME='testcoll' DATA_CHARSET=utf8 +OPTION_LIST='Driver=$DRV,Version=$VERS' $CONN; +INSERT INTO t1 VALUES +(1,'journal',87,45,63,12,78), +(2,'notebook',123,456,789,NULL,NULL), +(3,'paper',5,7,3,8,NULL), +(4,'planner',25,71,NULL,44,27), +(5,'postcard',5,7,3,8,NULL); +SELECT * FROM t1; +DROP TABLE t1; + +--echo # +--echo # Test array aggregation +--echo # +eval CREATE TABLE t1 +ENGINE=CONNECT TABLE_TYPE=$TYPE TABNAME='testcoll' +COLIST='{"pipeline":[{"\$project":{"_id":0,"item":1,"total":{"\$sum":"\$prices"},"average":{"\$avg":"\$prices"}}}]}' +OPTION_LIST='Driver=$DRV,Version=$VERS,Pipeline=YES' $CONN; +SELECT * FROM t1; +DROP TABLE t1; +--exec $MONGO --eval "db.testcoll.drop()" --quiet diff --git a/storage/connect/mysql-test/connect/t/mul_new.test b/storage/connect/mysql-test/connect/t/mul_new.test new file mode 100644 index 00000000000..33011f6c6a7 --- /dev/null +++ b/storage/connect/mysql-test/connect/t/mul_new.test @@ -0,0 +1,67 @@ +let $MYSQLD_DATADIR= `select @@datadir`; +--mkdir $MYSQLD_DATADIR/test/subdir/ + +--echo # +--echo # Testing multiple 1 +--echo # +CREATE TABLE t1 ( + Chiffre int(3) NOT NULL, + Lettre char(16) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=CSV FILE_NAME='num1.csv' LRECL=20 HEADER=1; +INSERT INTO t1 VALUES(1,'One'),(2,'Two'),(3,'Three'),(4,'Four'),(5,'Five'),(6,'Six'); +SELECT * FROM t1; + +CREATE TABLE t2 ( + Chiffre int(3) NOT NULL, + Lettre char(16) NOT NULL) +ENGINE=CONNECT TABLE_TYPE='CSV' FILE_NAME='subdir/num2.csv' LRECL=20 HEADER=1; +INSERT INTO t2 VALUES(7,'Seven'),(8,'Eight'),(9,'Nine'),(10,'Ten'),(11,'Eleven'),(12,'Twelve'); +SELECT * FROM t2; + +CREATE TABLE t3 ( + Chiffre int(3) NOT NULL, + Lettre char(16) NOT NULL) +ENGINE=CONNECT TABLE_TYPE='CSV' FILE_NAME='num3.csv' LRECL=20 HEADER=1; +INSERT INTO t3 VALUES(13,'Thirteen'),(14,'Fourteen'),(15,'Fifteen'),(16,'Sixteen'),(17,'Seventeen'),(18,'Eighteen'); +SELECT * FROM t3; + +CREATE TABLE t4 ( + Chiffre int(3) NOT NULL, + Lettre char(16) NOT NULL) +ENGINE=CONNECT TABLE_TYPE='CSV' FILE_NAME='subdir/num4.csv' LRECL=20 HEADER=1; +INSERT INTO t4 VALUES(19,'Nineteen'),(20,'Twenty'),(21,'Twenty one'),(22,'Twenty two'),(23,'Tenty three'),(24,'Twenty four'); +SELECT * FROM t4; + +CREATE TABLE t5 ( + Chiffre int(3) NOT NULL, + Lettre char(16) NOT NULL) +ENGINE=CONNECT TABLE_TYPE='CSV' FILE_NAME='num5.csv' LRECL=20 HEADER=1; +INSERT INTO t5 VALUES(25,'Twenty five'),(26,'Twenty six'),(27,'Twenty seven'),(28,'Twenty eight'),(29,'Tenty eight'),(30,'Thirty'); +SELECT * FROM t5; + +CREATE TABLE t_all ( + Chiffre int(3) not null, + Lettre char(16) not null) +ENGINE=CONNECT TABLE_TYPE=CSV FILE_NAME='num?.csv' HEADER=1 LRECL=20 MULTIPLE=1; +SELECT * FROM t_all ORDER BY Chiffre; + +--echo # +--echo # Testing multiple 3 +--echo # +ALTER TABLE t_all MULTIPLE=3; +SELECT * FROM t_all ORDER BY Chiffre; + +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; +DROP TABLE t4; +DROP TABLE t5; +DROP TABLE t_all; + +--remove_file $MYSQLD_DATADIR/test/subdir/num2.csv +--remove_file $MYSQLD_DATADIR/test/subdir/num4.csv +--rmdir $MYSQLD_DATADIR/test/subdir/ +--remove_file $MYSQLD_DATADIR/test/num1.csv +--remove_file $MYSQLD_DATADIR/test/num3.csv +--remove_file $MYSQLD_DATADIR/test/num5.csv + diff --git a/storage/connect/mysql-test/connect/t/mysql_exec.test b/storage/connect/mysql-test/connect/t/mysql_exec.test index 9226592eded..4aad23cd588 100644 --- a/storage/connect/mysql-test/connect/t/mysql_exec.test +++ b/storage/connect/mysql-test/connect/t/mysql_exec.test @@ -19,7 +19,7 @@ SELECT * FROM t1 WHERE command IN ('Warning','Note', "insert into t1(msg) values('One'),(NULL),('Three')", "insert into t1 values(2,'Deux') on duplicate key update msg = 'Two'", "insert into t1(message) values('Four'),('Five'),('Six')", - 'insert into t1(id) values(NULL)', + 'insert ignore into t1(id) values(NULL)', "update t1 set msg = 'Four' where id = 4", 'select * from t1'); @@ -31,7 +31,7 @@ CREATE PROCEDURE p1(cmd varchar(512)) READS SQL DATA SELECT * FROM t1 WHERE command IN ('Warning','Note',cmd); -CALL p1('insert into t1(id) values(NULL)'); +CALL p1('insert ignore into t1(id) values(NULL)'); CALL p1('update t1 set msg = "Five" where id = 5'); DROP PROCEDURE p1; DROP TABLE t1; diff --git a/storage/connect/mysql-test/connect/t/secure_file_priv.test b/storage/connect/mysql-test/connect/t/secure_file_priv.test index 46633502034..f7792536892 100644 --- a/storage/connect/mysql-test/connect/t/secure_file_priv.test +++ b/storage/connect/mysql-test/connect/t/secure_file_priv.test @@ -10,4 +10,4 @@ let $SECUREDIR= `select @@secure_file_priv`; INSERT INTO t1 VALUES (10); SELECT * FROM t1; DROP TABLE t1; ---remove_file $SECUREDIR/t1.dbf +--remove_file $MYSQL_TMP_DIR/t1.dbf diff --git a/storage/connect/mysql-test/connect/t/tbl.test b/storage/connect/mysql-test/connect/t/tbl.test index 3dc4b2e64b0..4f8497d4e6a 100644 --- a/storage/connect/mysql-test/connect/t/tbl.test +++ b/storage/connect/mysql-test/connect/t/tbl.test @@ -1,4 +1,4 @@ --- source include/not_embedded.inc +--source include/not_embedded.inc let $MYSQLD_DATADIR= `select @@datadir`; let $PORT= `select @@port`; @@ -51,20 +51,3 @@ DROP TABLE t1; DROP TABLE t2; DROP TABLE t3; DROP TABLE t4; - ---echo # ---echo # Checking thread TBL tables ---echo # -CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL SRCDEF='select 11 as v'; -SELECT * FROM t1; - -CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL SRCDEF='select 22 as v'; -SELECT * FROM t2; - ---replace_result $PORT PORT ---eval CREATE TABLE total (v BIGINT(20) UNSIGNED NOT NULL) ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t1,t2' OPTION_LIST='thread=yes,port=$PORT'; -SELECT * FROM total order by v desc; - -DROP TABLE total; -DROP TABLE t1; -DROP TABLE t2; diff --git a/storage/connect/mysql-test/connect/t/tbl_thread.test b/storage/connect/mysql-test/connect/t/tbl_thread.test new file mode 100644 index 00000000000..abc1ef34729 --- /dev/null +++ b/storage/connect/mysql-test/connect/t/tbl_thread.test @@ -0,0 +1,90 @@ +-- source myconn.inc + +connection default; + +let $PORT= `select @@port`; + +--echo # +--echo # Checking thread TBL tables +--echo # +CREATE TABLE t1 (a int, b char(10)); +INSERT INTO t1 VALUES (0,'test00'),(1,'test01'),(2,'test02'),(3,'test03'); +SELECT * FROM t1; + +connection master; + +CREATE TABLE rt2 (a int, b char(10)); +INSERT INTO rt2 VALUES (4,'test04'),(5,'test05'),(6,'test06'),(7,'test07'); +SELECT * FROM rt2; + +connection slave; + +USE test; +CREATE TABLE rt3 (a int, b char(10)); +INSERT INTO rt3 VALUES (8,'test08'),(9,'test09'),(10,'test10'),(11,'test11'); +SELECT * FROM rt3; + +connection default; + +--replace_result $MASTER_MYPORT MASTER_PORT +eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL +CONNECTION='mysql://root@127.0.0.1:$MASTER_MYPORT/test/rt2'; +SELECT * FROM t2; + +--replace_result $SLAVE_MYPORT SLAVE_PORT +eval CREATE TABLE t3 ENGINE=CONNECT TABLE_TYPE=MYSQL +CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/test/rt3'; +SELECT * FROM t3; + +--replace_result $PORT PORT +eval CREATE TABLE total (a int, b char(10)) +ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t1,t2,t3' +OPTION_LIST='thread=yes,port=$PORT'; +SELECT * FROM total order by a desc; + +connection master; + +DROP TABLE rt2; + +connection slave; + +DROP TABLE rt3; + +connection default; + +DROP TABLE t1,t2,t3,total; + +--echo # +--echo # Old thread TBL tables test modified +--echo # +--replace_result $MASTER_MYPORT MASTER_PORT +--eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL SRCDEF='select 11 as v' OPTION_LIST='port=$MASTER_MYPORT' +SELECT * FROM t1; + +--replace_result $SLAVE_MYPORT SLAVE_PORT +--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL SRCDEF='select 22 as v' OPTION_LIST='port=$SLAVE_MYPORT' +SELECT * FROM t2; + +--replace_result $PORT PORT +--eval CREATE TABLE total (v BIGINT(20) UNSIGNED NOT NULL) ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t1,t2' OPTION_LIST='thread=yes,port=$PORT'; +SELECT * FROM total order by v desc; +DROP TABLE t1,t2,total; + +--echo # +--echo # Old thread TBL tables test not modified +--echo # +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL SRCDEF='select 11 as v'; +SELECT * FROM t1; + +CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL SRCDEF='select 22 as v'; +SELECT * FROM t2; + +--replace_result $PORT PORT +--eval CREATE TABLE total (v BIGINT(20) UNSIGNED NOT NULL) ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t1,t2' OPTION_LIST='thread=yes,port=$PORT'; +SELECT * FROM total order by v desc; + +DROP TABLE total; +DROP TABLE t1; +DROP TABLE t2; + +-- source myconn_cleanup.inc diff --git a/storage/connect/mysql-test/connect/t/xml.test b/storage/connect/mysql-test/connect/t/xml.test index 0f26b8ab5c0..0fdf8e90b6e 100644 --- a/storage/connect/mysql-test/connect/t/xml.test +++ b/storage/connect/mysql-test/connect/t/xml.test @@ -1,4 +1,4 @@ ---source have_libxml2.inc +--source windows.inc let $MYSQLD_DATADIR= `select @@datadir`; @@ -26,7 +26,7 @@ CREATE TABLE t1 PUBLISHER CHAR(40), DATEPUB INT(4) ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' - OPTION_LIST='xmlsup=libxml2'; + OPTION_LIST='xmlsup=domdoc'; SELECT * FROM t1; DROP TABLE t1; @@ -42,7 +42,7 @@ CREATE TABLE t1 PUBLISHER CHAR(40), DATEPUB INT(4) ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' - OPTION_LIST='xmlsup=libxml2'; + OPTION_LIST='xmlsup=domdoc'; SELECT * FROM t1; DROP TABLE t1; @@ -55,7 +55,7 @@ CREATE TABLE t1 ( LANG CHAR(2), SUBJECT CHAR(32) ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' - OPTION_LIST='Coltype=@,xmlsup=libxml2'; + OPTION_LIST='Coltype=@,xmlsup=domdoc'; SELECT * FROM t1; DROP TABLE t1; @@ -68,7 +68,7 @@ CREATE TABLE t1 ( LANG CHAR(2), SUBJECT CHAR(32) ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' - OPTION_LIST='Coltype=@,xmlsup=libxml2'; + OPTION_LIST='Coltype=@,xmlsup=domdoc'; SELECT * FROM t1; DROP TABLE t1; @@ -87,7 +87,7 @@ CREATE TABLE t1 ( DATEPUB INT(4) ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK' - OPTION_LIST='xmlsup=libxml2'; + OPTION_LIST='xmlsup=domdoc'; SELECT * FROM t1; DROP TABLE t1; @@ -108,7 +108,7 @@ CREATE TABLE t1 ( DATEPUB INT(4) ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample2.xml' TABNAME='BIBLIO' - OPTION_LIST='rownode=BOOK,xmlsup=libxml2'; + OPTION_LIST='rownode=BOOK,xmlsup=domdoc'; INSERT INTO t1 (ISBN, LANG, SUBJECT, AUTHOR, TITLE, PUBLISHEr, DATEPUB) VALUES('9782212090529','fr','général','Alain Michard', 'XML, Langage et Applications','Eyrolles Paris',1998); @@ -136,7 +136,7 @@ CREATE TABLE t1 ( location CHAR(20) FIELD_FORMAT='PUBLISHER/PLACE', year INT(4) FIELD_FORMAT='DATEPUB' ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' - TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK,skipnull=1,xmlsup=libxml2'; + TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK,skipnull=1,xmlsup=domdoc'; SELECT * FROM t1; SELECT isbn, title, translated, tranfn, tranln, location FROM t1 WHERE translated <> ''; @@ -180,7 +180,7 @@ CREATE TABLE t1 ( isbn CHAR(15) FIELD_FORMAT='@isbn' ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' - TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK,skipnull=1,xmlsup=libxml2'; + TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK,skipnull=1,xmlsup=domdoc'; SELECT * FROM t1; DROP TABLE t1; @@ -194,14 +194,14 @@ CREATE TABLE t1 ( c CHAR(16) ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml' - OPTION_LIST='xmlsup=libxml2' + OPTION_LIST='xmlsup=domdoc' DATA_CHARSET=latin1; CREATE TABLE t1 ( c CHAR(16) ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml' - OPTION_LIST='xmlsup=libxml2' + OPTION_LIST='xmlsup=domdoc' DATA_CHARSET=utf8; SHOW CREATE TABLE t1; SELECT c, HEX(c) FROM t1; @@ -211,7 +211,7 @@ CREATE TABLE t1 ( c CHAR(16) ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml' - OPTION_LIST='xmlsup=libxml2'; + OPTION_LIST='xmlsup=domdoc'; SELECT c, HEX(c) FROM t1; DROP TABLE t1; @@ -219,7 +219,7 @@ CREATE TABLE t1 ( c CHAR(16) CHARACTER SET utf8 ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml' - OPTION_LIST='xmlsup=libxml2'; + OPTION_LIST='xmlsup=domdoc'; SELECT c, HEX(c) FROM t1; DROP TABLE t1; @@ -232,7 +232,7 @@ CREATE TABLE t1 ( c CHAR(16) CHARACTER SET cp1251 ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml' - OPTION_LIST='xmlsup=libxml2'; + OPTION_LIST='xmlsup=domdoc'; SELECT c, HEX(c) FROM t1; DROP TABLE t1; @@ -240,24 +240,24 @@ DROP TABLE t1; --echo # --echo # Testing Cyrillic --echo # -CREATE TABLE t1 -( - c CHAR(16) CHARACTER SET utf8 -) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='cp1251.xml' - OPTION_LIST='xmlsup=libxml2,rownode=b'; -SELECT * FROM t1; -INSERT INTO t1 VALUES ('ИКЛМÐ'); -SELECT c, HEX(c) FROM t1; -DROP TABLE t1; -CREATE TABLE t1 -( - c CHAR(16) CHARACTER SET cp1251 -) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='cp1251.xml' - OPTION_LIST='xmlsup=libxml2,rownode=b'; -SELECT * FROM t1; -INSERT INTO t1 VALUES ('ОПРСТ'); -SELECT c, HEX(c) FROM t1; -DROP TABLE t1; +#CREATE TABLE t1 +#( +# c CHAR(16) CHARACTER SET utf8 +#) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='cp1251.xml' +# OPTION_LIST='xmlsup=domdoc,rownode=b'; +#SELECT * FROM t1; +#INSERT INTO t1 VALUES ('ИКЛМÐ'); +#SELECT c, HEX(c) FROM t1; +#DROP TABLE t1; +#CREATE TABLE t1 +#( +# c CHAR(16) CHARACTER SET cp1251 +#) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='cp1251.xml' +# OPTION_LIST='xmlsup=domdoc,rownode=b'; +#SELECT * FROM t1; +#INSERT INTO t1 VALUES ('ОПРСТ'); +#SELECT c, HEX(c) FROM t1; +#DROP TABLE t1; --echo # @@ -266,11 +266,11 @@ DROP TABLE t1; CREATE TABLE t1 (node VARCHAR(50)) CHARACTER SET latin1 ENGINE=connect TABLE_TYPE=xml FILE_NAME='t1.xml' - OPTION_LIST='xmlsup=libxml2,rownode=line,encoding=utf-8'; + OPTION_LIST='xmlsup=domdoc,rownode=line,encoding=utf-8'; INSERT INTO t1 VALUES (_latin1 0xC0C1C2C3); SELECT node, hex(node) FROM t1; DROP TABLE t1; ---chmod 0777 $MYSQLD_DATADIR/test/t1.xml +#--chmod 0777 $MYSQLD_DATADIR/test/t1.xml --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR --eval SET @a=LOAD_FILE('$MYSQLD_DATADIR/test/t1.xml') SELECT LEFT(@a,38); @@ -280,11 +280,11 @@ SELECT HEX(EXTRACTVALUE(@a,'/t1/line/node')); CREATE TABLE t1 (node VARCHAR(50)) CHARACTER SET latin1 ENGINE=connect TABLE_TYPE=xml FILE_NAME='t1.xml' - OPTION_LIST='xmlsup=libxml2,rownode=line,encoding=iso-8859-1'; + OPTION_LIST='xmlsup=domdoc,rownode=line,encoding=iso-8859-1'; INSERT INTO t1 VALUES (_latin1 0xC0C1C2C3); SELECT node, hex(node) FROM t1; DROP TABLE t1; ---chmod 0777 $MYSQLD_DATADIR/test/t1.xml +#--chmod 0777 $MYSQLD_DATADIR/test/t1.xml --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR --eval SET @a=LOAD_FILE('$MYSQLD_DATADIR/test/t1.xml') SELECT LEFT(@a,43); @@ -298,13 +298,13 @@ SELECT HEX(EXTRACTVALUE(@a,'/t1/line/node')); CREATE TABLE t1 (node VARCHAR(50)) CHARACTER SET utf8 ENGINE=connect TABLE_TYPE=xml FILE_NAME='t1.xml' - OPTION_LIST='xmlsup=libxml2,rownode=line,encoding=iso-8859-1'; + OPTION_LIST='xmlsup=domdoc,rownode=line,encoding=iso-8859-1'; INSERT INTO t1 VALUES (_latin1 0xC0C1C2C3); INSERT INTO t1 VALUES (_cp1251 0xC0C1C2C3); INSERT INTO t1 VALUES ('&<>"\''); SELECT node, hex(node) FROM t1; DROP TABLE t1; ---chmod 0777 $MYSQLD_DATADIR/test/t1.xml +#--chmod 0777 $MYSQLD_DATADIR/test/t1.xml --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR --eval SET @a=LOAD_FILE('$MYSQLD_DATADIR/test/t1.xml') SELECT CAST(@a AS CHAR CHARACTER SET latin1); diff --git a/storage/connect/mysql-test/connect/t/xml2.test b/storage/connect/mysql-test/connect/t/xml2.test new file mode 100644 index 00000000000..0f26b8ab5c0 --- /dev/null +++ b/storage/connect/mysql-test/connect/t/xml2.test @@ -0,0 +1,320 @@ +--source have_libxml2.inc + +let $MYSQLD_DATADIR= `select @@datadir`; + +SET NAMES utf8; + +--vertical_results + +--copy_file $MTR_SUITE_DIR/std_data/xsample.xml $MYSQLD_DATADIR/test/xsample.xml +--copy_file $MTR_SUITE_DIR/std_data/latin1.xml $MYSQLD_DATADIR/test/latin1.xml +--copy_file $MTR_SUITE_DIR/std_data/cp1251.xml $MYSQLD_DATADIR/test/cp1251.xml + +#--echo $MYSQL_TEST_DIR +#--exec pwd +#SELECT LOAD_FILE('test/xsample.xml'); + + +--echo # +--echo # Testing tag values +--echo # +CREATE TABLE t1 +( + AUTHOR CHAR(50), + TITLE CHAR(32), + TRANSLATOR CHAR(40), + PUBLISHER CHAR(40), + DATEPUB INT(4) +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' + OPTION_LIST='xmlsup=libxml2'; +SELECT * FROM t1; +DROP TABLE t1; + + +--echo # +--echo # Testing that tag names are case sensitive +--echo # +CREATE TABLE t1 +( + author CHAR(50), + TITLE CHAR(32), + TRANSLATOR CHAR(40), + PUBLISHER CHAR(40), + DATEPUB INT(4) +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' + OPTION_LIST='xmlsup=libxml2'; +SELECT * FROM t1; +DROP TABLE t1; + + +--echo # +--echo # Testing attribute values +--echo # +CREATE TABLE t1 ( + ISBN CHAR(15), + LANG CHAR(2), + SUBJECT CHAR(32) +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' + OPTION_LIST='Coltype=@,xmlsup=libxml2'; +SELECT * FROM t1; +DROP TABLE t1; + + +--echo # +--echo # Testing that attribute names are case sensitive +--echo # +CREATE TABLE t1 ( + isbn CHAR(15), + LANG CHAR(2), + SUBJECT CHAR(32) +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' + OPTION_LIST='Coltype=@,xmlsup=libxml2'; +SELECT * FROM t1; +DROP TABLE t1; + + +--echo # +--echo # Testing mixed tag and attribute values +--echo # +CREATE TABLE t1 ( + ISBN CHAR(15) FIELD_FORMAT='@', + LANG CHAR(2) FIELD_FORMAT='@', + SUBJECT CHAR(32) FIELD_FORMAT='@', + AUTHOR CHAR(50), + TITLE CHAR(32), + TRANSLATOR CHAR(40), + PUBLISHER CHAR(40), + DATEPUB INT(4) +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' + TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK' + OPTION_LIST='xmlsup=libxml2'; +SELECT * FROM t1; +DROP TABLE t1; + + +--echo # +--echo # Testing INSERT on mixed tag and attribute values +--echo # +--copy_file $MTR_SUITE_DIR/std_data/xsample.xml $MYSQLD_DATADIR/test/xsample2.xml +--chmod 0644 $MYSQLD_DATADIR/test/xsample2.xml +CREATE TABLE t1 ( + ISBN CHAR(15) FIELD_FORMAT='@', + LANG CHAR(2) FIELD_FORMAT='@', + SUBJECT CHAR(32) FIELD_FORMAT='@', + AUTHOR CHAR(50), + TITLE CHAR(32), + TRANSLATOR CHAR(40), + PUBLISHER CHAR(40), + DATEPUB INT(4) +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample2.xml' + TABNAME='BIBLIO' + OPTION_LIST='rownode=BOOK,xmlsup=libxml2'; +INSERT INTO t1 (ISBN, LANG, SUBJECT, AUTHOR, TITLE, PUBLISHEr, DATEPUB) +VALUES('9782212090529','fr','général','Alain Michard', +'XML, Langage et Applications','Eyrolles Paris',1998); +SELECT * FROM t1; +--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR +--eval SELECT LOAD_FILE('$MYSQLD_DATADIR/test/xsample2.xml') AS xml +DROP TABLE t1; +--remove_file $MYSQLD_DATADIR/test/xsample2.xml + + +--echo # +--echo # Testing XPath +--echo # +CREATE TABLE t1 ( + isbn CHAR(15) FIELD_FORMAT='@ISBN', + language CHAR(2) FIELD_FORMAT='@LANG', + subject CHAR(32) FIELD_FORMAT='@SUBJECT', + authorfn CHAR(20) FIELD_FORMAT='AUTHOR/FIRSTNAME', + authorln CHAR(20) FIELD_FORMAT='AUTHOR/LASTNAME', + title CHAR(32) FIELD_FORMAT='TITLE', + translated CHAR(32) FIELD_FORMAT='TRANSLATOR/@PREFIX', + tranfn CHAR(20) FIELD_FORMAT='TRANSLATOR/FIRSTNAME', + tranln CHAR(20) FIELD_FORMAT='TRANSLATOR/LASTNAME', + publisher CHAR(20) FIELD_FORMAT='PUBLISHER/NAME', + location CHAR(20) FIELD_FORMAT='PUBLISHER/PLACE', + year INT(4) FIELD_FORMAT='DATEPUB' +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' + TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK,skipnull=1,xmlsup=libxml2'; +SELECT * FROM t1; +SELECT isbn, title, translated, tranfn, tranln, location FROM t1 +WHERE translated <> ''; +DROP TABLE t1; + + +# +# TODO: Connect.pdf says nodes with variable depth are not supported +# +#--echo # +#--echo # Relative paths are not supported +#--echo # +#CREATE TABLE t1 ( +# authorfn CHAR(20) FIELD_FORMAT='//FIRSTNAME', +# authorln CHAR(20) FIELD_FORMAT='//LASTNAME' +#) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' +# TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK,skipnull=1'; +#SELECT * FROM t1; +#DROP TABLE t1; + + +# +# TODO: Connect.pdf says absolute paths are not supported +# +#--echo # +#--echo # Absolute path is not supported +#--echo # +#CREATE TABLE t1 ( +# authorfn CHAR(20) FIELD_FORMAT='/BIBLIO/BOOK/AUTHOR/FIRSTNAME', +# authorln CHAR(20) FIELD_FORMAT='/BIBLIO/BOOK/AUTHOR/LASTNAME' +#) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' +# TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK,skipnull=1'; +#SELECT * FROM t1; +#DROP TABLE t1; + + +--echo # +--echo # Testing that XPath is case sensitive +--echo # +CREATE TABLE t1 +( + isbn CHAR(15) FIELD_FORMAT='@isbn' +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml' + TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK,skipnull=1,xmlsup=libxml2'; +SELECT * FROM t1; +DROP TABLE t1; + + +--echo # +--echo # Testing character sets +--echo # + +--error ER_UNKNOWN_ERROR +CREATE TABLE t1 +( + c CHAR(16) +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml' + OPTION_LIST='xmlsup=libxml2' + DATA_CHARSET=latin1; + +CREATE TABLE t1 +( + c CHAR(16) +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml' + OPTION_LIST='xmlsup=libxml2' + DATA_CHARSET=utf8; +SHOW CREATE TABLE t1; +SELECT c, HEX(c) FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 +( + c CHAR(16) +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml' + OPTION_LIST='xmlsup=libxml2'; +SELECT c, HEX(c) FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 +( + c CHAR(16) CHARACTER SET utf8 +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml' + OPTION_LIST='xmlsup=libxml2'; +SELECT c, HEX(c) FROM t1; +DROP TABLE t1; + + +--echo # +--echo # Conversion from latin1 to cp1251 produces a warning. +--echo # Question marks are returned. +--echo # +CREATE TABLE t1 +( + c CHAR(16) CHARACTER SET cp1251 +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml' + OPTION_LIST='xmlsup=libxml2'; +SELECT c, HEX(c) FROM t1; +DROP TABLE t1; + + +--echo # +--echo # Testing Cyrillic +--echo # +CREATE TABLE t1 +( + c CHAR(16) CHARACTER SET utf8 +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='cp1251.xml' + OPTION_LIST='xmlsup=libxml2,rownode=b'; +SELECT * FROM t1; +INSERT INTO t1 VALUES ('ИКЛМÐ'); +SELECT c, HEX(c) FROM t1; +DROP TABLE t1; +CREATE TABLE t1 +( + c CHAR(16) CHARACTER SET cp1251 +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='cp1251.xml' + OPTION_LIST='xmlsup=libxml2,rownode=b'; +SELECT * FROM t1; +INSERT INTO t1 VALUES ('ОПРСТ'); +SELECT c, HEX(c) FROM t1; +DROP TABLE t1; + + +--echo # +--echo # Testing that the underlying file is created with a proper Encoding +--echo # +CREATE TABLE t1 (node VARCHAR(50)) + CHARACTER SET latin1 + ENGINE=connect TABLE_TYPE=xml FILE_NAME='t1.xml' + OPTION_LIST='xmlsup=libxml2,rownode=line,encoding=utf-8'; +INSERT INTO t1 VALUES (_latin1 0xC0C1C2C3); +SELECT node, hex(node) FROM t1; +DROP TABLE t1; +--chmod 0777 $MYSQLD_DATADIR/test/t1.xml +--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR +--eval SET @a=LOAD_FILE('$MYSQLD_DATADIR/test/t1.xml') +SELECT LEFT(@a,38); +SELECT HEX(EXTRACTVALUE(@a,'/t1/line/node')); +--remove_file $MYSQLD_DATADIR/test/t1.xml + +CREATE TABLE t1 (node VARCHAR(50)) + CHARACTER SET latin1 + ENGINE=connect TABLE_TYPE=xml FILE_NAME='t1.xml' + OPTION_LIST='xmlsup=libxml2,rownode=line,encoding=iso-8859-1'; +INSERT INTO t1 VALUES (_latin1 0xC0C1C2C3); +SELECT node, hex(node) FROM t1; +DROP TABLE t1; +--chmod 0777 $MYSQLD_DATADIR/test/t1.xml +--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR +--eval SET @a=LOAD_FILE('$MYSQLD_DATADIR/test/t1.xml') +SELECT LEFT(@a,43); +SELECT HEX(EXTRACTVALUE(@a,'/t1/line/node')); +--remove_file $MYSQLD_DATADIR/test/t1.xml + + +--echo # +--echo # Testing XML entities +--echo # +CREATE TABLE t1 (node VARCHAR(50)) + CHARACTER SET utf8 + ENGINE=connect TABLE_TYPE=xml FILE_NAME='t1.xml' + OPTION_LIST='xmlsup=libxml2,rownode=line,encoding=iso-8859-1'; +INSERT INTO t1 VALUES (_latin1 0xC0C1C2C3); +INSERT INTO t1 VALUES (_cp1251 0xC0C1C2C3); +INSERT INTO t1 VALUES ('&<>"\''); +SELECT node, hex(node) FROM t1; +DROP TABLE t1; +--chmod 0777 $MYSQLD_DATADIR/test/t1.xml +--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR +--eval SET @a=LOAD_FILE('$MYSQLD_DATADIR/test/t1.xml') +SELECT CAST(@a AS CHAR CHARACTER SET latin1); +--remove_file $MYSQLD_DATADIR/test/t1.xml + + + +# +# Clean up +# +--remove_file $MYSQLD_DATADIR/test/xsample.xml +--remove_file $MYSQLD_DATADIR/test/latin1.xml +--remove_file $MYSQLD_DATADIR/test/cp1251.xml diff --git a/storage/connect/mysql-test/connect/t/xml2_grant.test b/storage/connect/mysql-test/connect/t/xml2_grant.test new file mode 100644 index 00000000000..26753c96633 --- /dev/null +++ b/storage/connect/mysql-test/connect/t/xml2_grant.test @@ -0,0 +1,8 @@ +-- source include/not_embedded.inc +-- source have_libxml2.inc + +let $MYSQLD_DATADIR= `select @@datadir`; + +let $TABLE_OPTIONS=TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2,rownode=row'; +let $FILE_EXT=XML; +--source grant.inc diff --git a/storage/connect/mysql-test/connect/t/xml2_html.test b/storage/connect/mysql-test/connect/t/xml2_html.test new file mode 100644 index 00000000000..1c84b46ec38 --- /dev/null +++ b/storage/connect/mysql-test/connect/t/xml2_html.test @@ -0,0 +1,39 @@ +--source have_libxml2.inc + +let $MYSQLD_DATADIR= `select @@datadir`; + +SET NAMES utf8; + +--copy_file $MTR_SUITE_DIR/std_data/beers.xml $MYSQLD_DATADIR/test/beers.xml +--copy_file $MTR_SUITE_DIR/std_data/coffee.htm $MYSQLD_DATADIR/test/coffee.htm + +--echo # +--echo # Testing HTML like XML file +--echo # +CREATE TABLE beers ( +`Name` CHAR(16) FIELD_FORMAT='brandName', +`Origin` CHAR(16) FIELD_FORMAT='origin', +`Description` CHAR(32) FIELD_FORMAT='details') +ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='beers.xml' +TABNAME='table' OPTION_LIST='xmlsup=libxml2,rownode=tr,colnode=td'; +SELECT * FROM beers; +DROP TABLE beers; + +--echo # +--echo # Testing HTML file +--echo # +CREATE TABLE coffee ( +`Name` CHAR(16), +`Cups` INT(8), +`Type` CHAR(16), +`Sugar` CHAR(4)) +ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='coffee.htm' +TABNAME='TABLE' HEADER=1 OPTION_LIST='xmlsup=libxml2,Coltype=HTML'; +SELECT * FROM coffee; +DROP TABLE coffee; + +# +# Clean up +# +--remove_file $MYSQLD_DATADIR/test/beers.xml +--remove_file $MYSQLD_DATADIR/test/coffee.htm diff --git a/storage/connect/mysql-test/connect/t/xml2_mdev5261.test b/storage/connect/mysql-test/connect/t/xml2_mdev5261.test new file mode 100644 index 00000000000..16640c8bb74 --- /dev/null +++ b/storage/connect/mysql-test/connect/t/xml2_mdev5261.test @@ -0,0 +1,27 @@ +--source have_libxml2.inc + +let $MYSQLD_DATADIR= `select @@datadir`; + +SET NAMES utf8; + +# +#--echo Testing indexing on not indexable table type +# +--error ER_UNKNOWN_ERROR +CREATE TABLE t1 (i INT UNIQUE NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='xmlsup=libxml2,Rownode=N'; +CREATE TABLE t1 (i INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='xmlsup=libxml2,Rownode=N'; +DESCRIBE t1; +# one could *add* an index to an existing table +--error ER_UNKNOWN_ERROR +ALTER TABLE t1 ADD UNIQUE(i); +--error ER_UNKNOWN_ERROR +CREATE UNIQUE INDEX i ON t1(i); +DESCRIBE t1; +INSERT INTO t1 VALUES(2),(5),(7); +SELECT * FROM t1 WHERE i = 5; +--error ER_CANT_DROP_FIELD_OR_KEY +ALTER TABLE t1 DROP INDEX i; +--error ER_CANT_DROP_FIELD_OR_KEY +DROP INDEX i ON t1; +DROP TABLE t1; +--remove_file $MYSQLD_DATADIR/test/xt1.xml diff --git a/storage/connect/mysql-test/connect/t/xml2_mult.test b/storage/connect/mysql-test/connect/t/xml2_mult.test new file mode 100644 index 00000000000..cd83827fe34 --- /dev/null +++ b/storage/connect/mysql-test/connect/t/xml2_mult.test @@ -0,0 +1,64 @@ +--source have_libxml2.inc + +let $MYSQLD_DATADIR= `select @@datadir`; + +SET NAMES utf8; + +--copy_file $MTR_SUITE_DIR/std_data/bookstore.xml $MYSQLD_DATADIR/test/bookstore.xml + +#--echo $MYSQL_TEST_DIR +#--exec pwd +#SELECT LOAD_FILE('test/bookstore.xml'); + + +--echo # +--echo # Testing expanded values +--echo # +CREATE TABLE `bookstore` ( + `category` CHAR(16) NOT NULL FIELD_FORMAT='@', + `title` VARCHAR(50) NOT NULL, + `lang` char(2) NOT NULL FIELD_FORMAT='title/@', + `author` VARCHAR(24) NOT NULL, + `year` INT(4) NOT NULL, + `price` DOUBLE(8,2) NOT NULL) +ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='bookstore.xml' OPTION_LIST='expand=1,mulnode=author,limit=6,xmlsup=libxml2'; +SELECT * FROM bookstore; +SELECT category, title, price FROM bookstore; +SELECT category, title, author, price FROM bookstore WHERE author LIKE '%K%'; +SELECT category, title, price FROM bookstore WHERE author LIKE 'J%'; + + +--echo # +--echo # Limiting expanded values +--echo # +ALTER TABLE bookstore OPTION_LIST='expand=1,mulnode=author,limit=3,xmlsup=libxml2'; +SELECT * FROM bookstore; +--echo # One line lost because the where clause is applied only on the first 3 rows +SELECT category, title, author, price FROM bookstore WHERE author LIKE 'J%'; + + +--echo # +--echo # Testing concatenated values +--echo # +ALTER TABLE bookstore OPTION_LIST='mulnode=author,limit=6,xmlsup=libxml2'; +--echo # truncated +SELECT * FROM bookstore; +--echo # increase author size +ALTER TABLE bookstore MODIFY `author` VARCHAR(128) NOT NULL; +SELECT * FROM bookstore; + + +--echo # +--echo # Limiting concatenated values +--echo # +ALTER TABLE bookstore OPTION_LIST='mulnode=author,limit=4,xmlsup=libxml2'; +SELECT * FROM bookstore; +--echo # The where clause is applied on the concatenated column result +SELECT category, title, author, price FROM bookstore WHERE author LIKE 'J%'; +DROP TABLE bookstore; + + +# +# Clean up +# +--remove_file $MYSQLD_DATADIR/test/bookstore.xml diff --git a/storage/connect/mysql-test/connect/t/xml2_zip.test b/storage/connect/mysql-test/connect/t/xml2_zip.test new file mode 100644 index 00000000000..d8c7894f861 --- /dev/null +++ b/storage/connect/mysql-test/connect/t/xml2_zip.test @@ -0,0 +1,41 @@ +--source have_zip.inc +--source have_libxml2.inc + +let $MYSQLD_DATADIR= `select @@datadir`; + +--vertical_results + +--copy_file $MTR_SUITE_DIR/std_data/xsample2.xml $MYSQLD_DATADIR/test/xsample2.xml + +--echo # +--echo # Testing zipped XML tables +--echo # +CREATE TABLE t1 ( +ISBN CHAR(13) NOT NULL FIELD_FORMAT='@', +LANG CHAR(2) NOT NULL FIELD_FORMAT='@', +SUBJECT CHAR(12) NOT NULL FIELD_FORMAT='@', +AUTHOR_FIRSTNAME CHAR(15) NOT NULL FIELD_FORMAT='AUTHOR/FIRSTNAME', +AUTHOR_LASTNAME CHAR(8) NOT NULL FIELD_FORMAT='AUTHOR/LASTNAME', +TRANSLATOR_PREFIX CHAR(24) DEFAULT NULL FIELD_FORMAT='TRANSLATOR/@PREFIX', +TRANSLATOR_FIRSTNAME CHAR(6) DEFAULT NULL FIELD_FORMAT='TRANSLATOR/FIRSTNAME', +TRANSLATOR_LASTNAME CHAR(6) DEFAULT NULL FIELD_FORMAT='TRANSLATOR/LASTNAME', +TITLE CHAR(30) NOT NULL, +PUBLISHER_NAME CHAR(15) NOT NULL FIELD_FORMAT='PUBLISHER/NAME', +PUBLISHER_PLACE CHAR(5) NOT NULL FIELD_FORMAT='PUBLISHER/PLACE', +DATEPUB CHAR(4) NOT NULL +) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample2.zip' ZIPPED=YES +OPTION_LIST='entry=xsample2.xml,load=xsample2.xml,rownode=BOOK,xmlsup=libxml2,expand=1,mulnode=AUTHOR'; +SELECT * FROM t1; + +#testing discovery +CREATE TABLE t2 +ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample2.zip' ZIPPED=YES +OPTION_LIST='xmlsup=libxml2'; +SELECT * FROM t2; +DROP TABLE t1,t2; + +# +# Clean up +# +--remove_file $MYSQLD_DATADIR/test/xsample2.xml +--remove_file $MYSQLD_DATADIR/test/xsample2.zip diff --git a/storage/connect/mysql-test/connect/t/xml_grant.test b/storage/connect/mysql-test/connect/t/xml_grant.test index 26753c96633..94f640b9593 100644 --- a/storage/connect/mysql-test/connect/t/xml_grant.test +++ b/storage/connect/mysql-test/connect/t/xml_grant.test @@ -1,8 +1,8 @@ -- source include/not_embedded.inc --- source have_libxml2.inc +-- source windows.inc let $MYSQLD_DATADIR= `select @@datadir`; -let $TABLE_OPTIONS=TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2,rownode=row'; +let $TABLE_OPTIONS=TABLE_TYPE=XML OPTION_LIST='xmlsup=domdoc,rownode=row'; let $FILE_EXT=XML; --source grant.inc diff --git a/storage/connect/mysql-test/connect/t/xml_html.test b/storage/connect/mysql-test/connect/t/xml_html.test index 1c84b46ec38..34d29953f68 100644 --- a/storage/connect/mysql-test/connect/t/xml_html.test +++ b/storage/connect/mysql-test/connect/t/xml_html.test @@ -1,4 +1,4 @@ ---source have_libxml2.inc +--source windows.inc let $MYSQLD_DATADIR= `select @@datadir`; @@ -15,7 +15,7 @@ CREATE TABLE beers ( `Origin` CHAR(16) FIELD_FORMAT='origin', `Description` CHAR(32) FIELD_FORMAT='details') ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='beers.xml' -TABNAME='table' OPTION_LIST='xmlsup=libxml2,rownode=tr,colnode=td'; +TABNAME='table' OPTION_LIST='xmlsup=domdoc,rownode=tr,colnode=td'; SELECT * FROM beers; DROP TABLE beers; @@ -28,7 +28,7 @@ CREATE TABLE coffee ( `Type` CHAR(16), `Sugar` CHAR(4)) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='coffee.htm' -TABNAME='TABLE' HEADER=1 OPTION_LIST='xmlsup=libxml2,Coltype=HTML'; +TABNAME='TABLE' HEADER=1 OPTION_LIST='xmlsup=domdoc,Coltype=HTML'; SELECT * FROM coffee; DROP TABLE coffee; diff --git a/storage/connect/mysql-test/connect/t/xml_mdev5261.test b/storage/connect/mysql-test/connect/t/xml_mdev5261.test index b554f251e09..25cace50548 100644 --- a/storage/connect/mysql-test/connect/t/xml_mdev5261.test +++ b/storage/connect/mysql-test/connect/t/xml_mdev5261.test @@ -1,4 +1,4 @@ ---source have_libxml2.inc +--source windows.inc let $MYSQLD_DATADIR= `select @@datadir`; @@ -8,8 +8,8 @@ SET NAMES utf8; #--echo Testing indexing on not indexable table type # --error ER_UNKNOWN_ERROR -CREATE TABLE t1 (i INT UNIQUE NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='Rownode=N'; -CREATE TABLE t1 (i INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='Rownode=N'; +CREATE TABLE t1 (i INT UNIQUE NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='xmlsup=domdoc,Rownode=N'; +CREATE TABLE t1 (i INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='xmlsup=domdoc,Rownode=N'; DESCRIBE t1; # one could *add* an index to an existing table --error ER_UNKNOWN_ERROR diff --git a/storage/connect/mysql-test/connect/t/xml_mult.test b/storage/connect/mysql-test/connect/t/xml_mult.test index cd83827fe34..cf703e90da4 100644 --- a/storage/connect/mysql-test/connect/t/xml_mult.test +++ b/storage/connect/mysql-test/connect/t/xml_mult.test @@ -1,4 +1,4 @@ ---source have_libxml2.inc +--source windows.inc let $MYSQLD_DATADIR= `select @@datadir`; @@ -21,7 +21,7 @@ CREATE TABLE `bookstore` ( `author` VARCHAR(24) NOT NULL, `year` INT(4) NOT NULL, `price` DOUBLE(8,2) NOT NULL) -ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='bookstore.xml' OPTION_LIST='expand=1,mulnode=author,limit=6,xmlsup=libxml2'; +ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='bookstore.xml' OPTION_LIST='expand=1,mulnode=author,limit=6,xmlsup=domdoc'; SELECT * FROM bookstore; SELECT category, title, price FROM bookstore; SELECT category, title, author, price FROM bookstore WHERE author LIKE '%K%'; @@ -31,7 +31,7 @@ SELECT category, title, price FROM bookstore WHERE author LIKE 'J%'; --echo # --echo # Limiting expanded values --echo # -ALTER TABLE bookstore OPTION_LIST='expand=1,mulnode=author,limit=3,xmlsup=libxml2'; +ALTER TABLE bookstore OPTION_LIST='expand=1,mulnode=author,limit=3,xmlsup=domdoc'; SELECT * FROM bookstore; --echo # One line lost because the where clause is applied only on the first 3 rows SELECT category, title, author, price FROM bookstore WHERE author LIKE 'J%'; @@ -40,7 +40,7 @@ SELECT category, title, author, price FROM bookstore WHERE author LIKE 'J%'; --echo # --echo # Testing concatenated values --echo # -ALTER TABLE bookstore OPTION_LIST='mulnode=author,limit=6,xmlsup=libxml2'; +ALTER TABLE bookstore OPTION_LIST='mulnode=author,limit=6,xmlsup=domdoc'; --echo # truncated SELECT * FROM bookstore; --echo # increase author size @@ -51,7 +51,7 @@ SELECT * FROM bookstore; --echo # --echo # Limiting concatenated values --echo # -ALTER TABLE bookstore OPTION_LIST='mulnode=author,limit=4,xmlsup=libxml2'; +ALTER TABLE bookstore OPTION_LIST='mulnode=author,limit=4,xmlsup=domdoc'; SELECT * FROM bookstore; --echo # The where clause is applied on the concatenated column result SELECT category, title, author, price FROM bookstore WHERE author LIKE 'J%'; diff --git a/storage/connect/mysql-test/connect/t/xml_zip.test b/storage/connect/mysql-test/connect/t/xml_zip.test index d8c7894f861..ad31ca46d4c 100644 --- a/storage/connect/mysql-test/connect/t/xml_zip.test +++ b/storage/connect/mysql-test/connect/t/xml_zip.test @@ -1,5 +1,5 @@ --source have_zip.inc ---source have_libxml2.inc +--source windows.inc let $MYSQLD_DATADIR= `select @@datadir`; @@ -24,13 +24,13 @@ PUBLISHER_NAME CHAR(15) NOT NULL FIELD_FORMAT='PUBLISHER/NAME', PUBLISHER_PLACE CHAR(5) NOT NULL FIELD_FORMAT='PUBLISHER/PLACE', DATEPUB CHAR(4) NOT NULL ) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample2.zip' ZIPPED=YES -OPTION_LIST='entry=xsample2.xml,load=xsample2.xml,rownode=BOOK,xmlsup=libxml2,expand=1,mulnode=AUTHOR'; +OPTION_LIST='entry=xsample2.xml,load=xsample2.xml,rownode=BOOK,xmlsup=domdoc,expand=1,mulnode=AUTHOR'; SELECT * FROM t1; #testing discovery CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample2.zip' ZIPPED=YES -OPTION_LIST='xmlsup=libxml2'; +OPTION_LIST='xmlsup=domdoc'; SELECT * FROM t2; DROP TABLE t1,t2; diff --git a/storage/connect/mysql-test/connect/t/zip.test b/storage/connect/mysql-test/connect/t/zip.test index a4892e9ed4e..dce68c17eee 100644 --- a/storage/connect/mysql-test/connect/t/zip.test +++ b/storage/connect/mysql-test/connect/t/zip.test @@ -83,16 +83,16 @@ DROP TABLE t1,t2,t3,t4; --echo # CREATE TABLE t1 ( _id INT(2) NOT NULL, -name_first CHAR(9) NOT NULL FIELD_FORMAT='name:first', -name_aka CHAR(4) DEFAULT NULL FIELD_FORMAT='name:aka', -name_last CHAR(10) NOT NULL FIELD_FORMAT='name:last', +name_first CHAR(9) NOT NULL FIELD_FORMAT='$.name.first', +name_aka CHAR(4) DEFAULT NULL FIELD_FORMAT='$.name.aka', +name_last CHAR(10) NOT NULL FIELD_FORMAT='$.name.last', title CHAR(12) DEFAULT NULL, birth CHAR(20) DEFAULT NULL, death CHAR(20) DEFAULT NULL, -contribs CHAR(7) NOT NULL FIELD_FORMAT='contribs:', -awards_award CHAR(42) DEFAULT NULL FIELD_FORMAT='awards::award', -awards_year CHAR(4) DEFAULT NULL FIELD_FORMAT='awards::year', -awards_by CHAR(38) DEFAULT NULL FIELD_FORMAT='awards::by' +contribs CHAR(7) NOT NULL FIELD_FORMAT='$.contribs', +awards_award CHAR(42) DEFAULT NULL FIELD_FORMAT='$.awards.award', +awards_year CHAR(4) DEFAULT NULL FIELD_FORMAT='$.awards.year', +awards_by CHAR(38) DEFAULT NULL FIELD_FORMAT='$.awards.by' ) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='bios.zip' OPTION_LIST='ENTRY=bios.json,LOAD=bios.json' ZIPPED=YES; SELECT * FROM t1; @@ -104,16 +104,16 @@ SELECT * FROM t2; CREATE TABLE t3 ( _id INT(2) NOT NULL, -firstname CHAR(9) NOT NULL FIELD_FORMAT='name:first', -aka CHAR(4) DEFAULT NULL FIELD_FORMAT='name:aka', -lastname CHAR(10) NOT NULL FIELD_FORMAT='name:last', +firstname CHAR(9) NOT NULL FIELD_FORMAT='$.name.first', +aka CHAR(4) DEFAULT NULL FIELD_FORMAT='$.name.aka', +lastname CHAR(10) NOT NULL FIELD_FORMAT='$.name.last', title CHAR(12) DEFAULT NULL, birth date DEFAULT NULL date_format="YYYY-DD-MM'T'hh:mm:ss'Z'", death date DEFAULT NULL date_format="YYYY-DD-MM'T'hh:mm:ss'Z'", -contribs CHAR(64) NOT NULL FIELD_FORMAT='contribs:[", "]', -award CHAR(42) DEFAULT NULL FIELD_FORMAT='awards:[x]:award', -year CHAR(4) DEFAULT NULL FIELD_FORMAT='awards:[x]:year', -`by` CHAR(38) DEFAULT NULL FIELD_FORMAT='awards:[x]:by' +contribs CHAR(64) NOT NULL FIELD_FORMAT='$.contribs.[", "]', +award CHAR(42) DEFAULT NULL FIELD_FORMAT='$.awards[*].award', +year CHAR(4) DEFAULT NULL FIELD_FORMAT='$.awards[*].year', +`by` CHAR(38) DEFAULT NULL FIELD_FORMAT='$.awards[*].by' ) ENGINE=CONNECT TABLE_TYPE='json' FILE_NAME='bios.zip' ZIPPED=YES; SELECT * FROM t3 WHERE _id = 1; diff --git a/storage/connect/myutil.cpp b/storage/connect/myutil.cpp index d4416e188c8..c2053f1c832 100644 --- a/storage/connect/myutil.cpp +++ b/storage/connect/myutil.cpp @@ -42,7 +42,8 @@ int MYSQLtoPLG(char *typname, char *var) type = TYPE_INT; else if (!stricmp(typname, "smallint")) type = TYPE_SHORT; - else if (!stricmp(typname, "char") || !stricmp(typname, "varchar")) + else if (!stricmp(typname, "char") || !stricmp(typname, "varchar") || + !stricmp(typname, "enum") || !stricmp(typname, "set")) type = TYPE_STRING; else if (!stricmp(typname, "double") || !stricmp(typname, "float") || !stricmp(typname, "real")) @@ -87,10 +88,12 @@ int MYSQLtoPLG(char *typname, char *var) else if (!stricmp(typname, "year")) *var = 'Y'; - } else if (type == TYPE_STRING && !stricmp(typname, "varchar")) - // This is to make the difference between CHAR and VARCHAR - *var = 'V'; - else if (type == TYPE_ERROR && xconv == TPC_SKIP) + } else if (type == TYPE_STRING) { + if (!stricmp(typname, "varchar")) + // This is to make the difference between CHAR and VARCHAR + *var = 'V'; + + } else if (type == TYPE_ERROR && xconv == TPC_SKIP) *var = 'K'; else *var = 0; @@ -266,9 +269,9 @@ int MYSQLtoPLG(int mytype, char *var) /************************************************************************/ /* Returns the format corresponding to a MySQL date type number. */ /************************************************************************/ -char *MyDateFmt(int mytype) +PCSZ MyDateFmt(int mytype) { - char *fmt; + PCSZ fmt; switch (mytype) { case MYSQL_TYPE_TIMESTAMP: @@ -294,9 +297,9 @@ char *MyDateFmt(int mytype) /************************************************************************/ /* Returns the format corresponding to a MySQL date type name. */ /************************************************************************/ -char *MyDateFmt(char *typname) +PCSZ MyDateFmt(char *typname) { - char *fmt; + PCSZ fmt; if (!stricmp(typname, "datetime") || !stricmp(typname, "timestamp")) fmt = "YYYY-MM-DD hh:mm:ss"; diff --git a/storage/connect/myutil.h b/storage/connect/myutil.h index 9c22cfef118..6991172b39e 100644 --- a/storage/connect/myutil.h +++ b/storage/connect/myutil.h @@ -6,9 +6,9 @@ enum enum_field_types PLGtoMYSQL(int type, bool dbf, char var = 0); const char *PLGtoMYSQLtype(int type, bool dbf, char var = 0); -int MYSQLtoPLG(char *typname, char *var = NULL); -int MYSQLtoPLG(int mytype, char *var = NULL); -char *MyDateFmt(int mytype); -char *MyDateFmt(char *typname); +int MYSQLtoPLG(char *typname, char *var = NULL); +int MYSQLtoPLG(int mytype, char *var = NULL); +PCSZ MyDateFmt(int mytype); +PCSZ MyDateFmt(char *typname); #endif // __MYUTIL__H diff --git a/storage/connect/odbccat.h b/storage/connect/odbccat.h index 3b729bcb4bb..05b82e49727 100644 --- a/storage/connect/odbccat.h +++ b/storage/connect/odbccat.h @@ -3,11 +3,11 @@ #define DEFAULT_QUERY_TIMEOUT -1 // means do not set typedef struct odbc_parms { - char *User; // User connect info - char *Pwd; // Password connect info - int Cto; // Connect timeout - int Qto; // Query timeout - bool UseCnc; // Use SQLConnect (!SQLDriverConnect) + PCSZ User; // User connect info + PCSZ Pwd; // Password connect info + int Cto; // Connect timeout + int Qto; // Query timeout + bool UseCnc; // Use SQLConnect (!SQLDriverConnect) } ODBCPARM, *POPARM; /***********************************************************************/ @@ -17,9 +17,9 @@ typedef struct odbc_parms { char *ODBCCheckConnection(PGLOBAL g, char *dsn, int cop); #endif // PROMPT_OK PQRYRES ODBCDataSources(PGLOBAL g, int maxres, bool info); -PQRYRES ODBCColumns(PGLOBAL g, char *dsn, char *db, char *table, - char *colpat, int maxres, bool info, POPARM sop); +PQRYRES ODBCColumns(PGLOBAL g, PCSZ dsn, PCSZ db, PCSZ table, + PCSZ colpat, int maxres, bool info, POPARM sop); PQRYRES ODBCSrcCols(PGLOBAL g, char *dsn, char *src, POPARM sop); -PQRYRES ODBCTables(PGLOBAL g, char *dsn, char *db, char *tabpat, - char *tabtyp, int maxres, bool info, POPARM sop); +PQRYRES ODBCTables(PGLOBAL g, PCSZ dsn, PCSZ db, PCSZ tabpat, + PCSZ tabtyp, int maxres, bool info, POPARM sop); PQRYRES ODBCDrivers(PGLOBAL g, int maxres, bool info); diff --git a/storage/connect/odbconn.cpp b/storage/connect/odbconn.cpp index 433e392eace..70a0a6a1450 100644 --- a/storage/connect/odbconn.cpp +++ b/storage/connect/odbconn.cpp @@ -1,7 +1,7 @@ -/************ Odbconn C++ Functions Source Code File (.CPP) ************/ -/* Name: ODBCONN.CPP Version 2.2 */ +/***********************************************************************/ +/* Name: ODBCONN.CPP Version 2.3 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 1998-2016 */ +/* (C) Copyright to the author Olivier BERTRAND 1998-2017 */ /* */ /* This file contains the ODBC connection classes functions. */ /***********************************************************************/ @@ -55,6 +55,7 @@ extern "C" HINSTANCE s_hModule; // Saved module handle TYPCONV GetTypeConv(); int GetConvSize(); +void OdbcClose(PGLOBAL g, PFBLOCK fp); /***********************************************************************/ /* Some macro's (should be defined elsewhere to be more accessible) */ @@ -239,47 +240,43 @@ char *ODBCCheckConnection(PGLOBAL g, char *dsn, int cop) /***********************************************************************/ /* Allocate the structure used to refer to the result set. */ /***********************************************************************/ -static CATPARM *AllocCatInfo(PGLOBAL g, CATINFO fid, char *db, - char *tab, PQRYRES qrp) - { - size_t i, m, n; - CATPARM *cap; +static CATPARM *AllocCatInfo(PGLOBAL g, CATINFO fid, PCSZ db, + PCSZ tab, PQRYRES qrp) +{ + size_t i, m, n; + CATPARM *cap; #if defined(_DEBUG) - assert(qrp); + assert(qrp); #endif - // Save stack and allocation environment and prepare error return - if (g->jump_level == MAX_JUMP) { - strcpy(g->Message, MSG(TOO_MANY_JUMPS)); - return NULL; - } // endif jump_level + try { + m = (size_t)qrp->Maxres; + n = (size_t)qrp->Nbcol; + cap = (CATPARM *)PlugSubAlloc(g, NULL, sizeof(CATPARM)); + memset(cap, 0, sizeof(CATPARM)); + cap->Id = fid; + cap->Qrp = qrp; + cap->DB = db; + cap->Tab = tab; + cap->Vlen = (SQLLEN* *)PlugSubAlloc(g, NULL, n * sizeof(SQLLEN *)); - if (setjmp(g->jumper[++g->jump_level]) != 0) { - printf("%s\n", g->Message); - cap = NULL; - goto fin; - } // endif rc + for (i = 0; i < n; i++) + cap->Vlen[i] = (SQLLEN *)PlugSubAlloc(g, NULL, m * sizeof(SQLLEN)); - m = (size_t)qrp->Maxres; - n = (size_t)qrp->Nbcol; - cap = (CATPARM *)PlugSubAlloc(g, NULL, sizeof(CATPARM)); - memset(cap, 0, sizeof(CATPARM)); - cap->Id = fid; - cap->Qrp = qrp; - cap->DB = (PUCHAR)db; - cap->Tab = (PUCHAR)tab; - cap->Vlen = (SQLLEN* *)PlugSubAlloc(g, NULL, n * sizeof(SQLLEN *)); + cap->Status = (UWORD *)PlugSubAlloc(g, NULL, m * sizeof(UWORD)); - for (i = 0; i < n; i++) - cap->Vlen[i] = (SQLLEN *)PlugSubAlloc(g, NULL, m * sizeof(SQLLEN)); + } catch (int n) { + htrc("Exeption %d: %s\n", n, g->Message); + cap = NULL; + } catch (const char *msg) { + htrc(g->Message, msg); + printf("%s\n", g->Message); + cap = NULL; + } // end catch - cap->Status = (UWORD *)PlugSubAlloc(g, NULL, m * sizeof(UWORD)); - - fin: - g->jump_level--; - return cap; - } // end of AllocCatInfo + return cap; +} // end of AllocCatInfo #if 0 /***********************************************************************/ @@ -305,12 +302,19 @@ static void ResetNullValues(CATPARM *cap) } // end of ResetNullValues #endif +/***********************************************************************/ +/* Close an ODBC table after a thrown error (called by PlugCloseFile) */ +/***********************************************************************/ +void OdbcClose(PGLOBAL g, PFBLOCK fp) { + ((ODBConn*)fp->File)->Close(); +} // end of OdbcClose + /***********************************************************************/ /* ODBCColumns: constructs the result blocks containing all columns */ /* of an ODBC table that will be retrieved by GetData commands. */ /***********************************************************************/ -PQRYRES ODBCColumns(PGLOBAL g, char *dsn, char *db, char *table, - char *colpat, int maxres, bool info, POPARM sop) +PQRYRES ODBCColumns(PGLOBAL g, PCSZ dsn, PCSZ db, PCSZ table, + PCSZ colpat, int maxres, bool info, POPARM sop) { int buftyp[] = {TYPE_STRING, TYPE_STRING, TYPE_STRING, TYPE_STRING, TYPE_SHORT, TYPE_STRING, TYPE_INT, TYPE_INT, @@ -383,7 +387,7 @@ PQRYRES ODBCColumns(PGLOBAL g, char *dsn, char *db, char *table, if (!(cap = AllocCatInfo(g, CAT_COL, db, table, qrp))) return NULL; - cap->Pat = (PUCHAR)colpat; + cap->Pat = colpat; /************************************************************************/ /* Now get the results into blocks. */ @@ -618,8 +622,8 @@ PQRYRES ODBCDataSources(PGLOBAL g, int maxres, bool info) /* ODBCTables: constructs the result blocks containing all tables in */ /* an ODBC database that will be retrieved by GetData commands. */ /**************************************************************************/ -PQRYRES ODBCTables(PGLOBAL g, char *dsn, char *db, char *tabpat, - char *tabtyp, int maxres, bool info, POPARM sop) +PQRYRES ODBCTables(PGLOBAL g, PCSZ dsn, PCSZ db, PCSZ tabpat, PCSZ tabtyp, + int maxres, bool info, POPARM sop) { int buftyp[] = {TYPE_STRING, TYPE_STRING, TYPE_STRING, TYPE_STRING, TYPE_STRING}; @@ -681,7 +685,7 @@ PQRYRES ODBCTables(PGLOBAL g, char *dsn, char *db, char *tabpat, if (!(cap = AllocCatInfo(g, CAT_TAB, db, tabpat, qrp))) return NULL; - cap->Pat = (PUCHAR)tabtyp; + cap->Pat = tabtyp; if (trace) htrc("Getting table results ncol=%d\n", cap->Qrp->Nbcol); @@ -879,7 +883,7 @@ PQRYRES ODBCStatistics(PGLOBAL g, ODBConn *op, char *dsn, char *pat, /***********************************************************************/ /* Implementation of DBX class. */ /***********************************************************************/ -DBX::DBX(RETCODE rc, PSZ msg) +DBX::DBX(RETCODE rc, PCSZ msg) { m_RC = rc; m_Msg = msg; @@ -972,6 +976,7 @@ ODBConn::ODBConn(PGLOBAL g, TDBODBC *tdbp) m_Catver = (tdbp) ? tdbp->Catver : 0; m_Rows = 0; m_Fetch = 0; + m_Fp = NULL; m_Connect = NULL; m_User = NULL; m_Pwd = NULL; @@ -1020,7 +1025,7 @@ bool ODBConn::Check(RETCODE rc) /***********************************************************************/ /* DB exception throw routines. */ /***********************************************************************/ -void ODBConn::ThrowDBX(RETCODE rc, PSZ msg, HSTMT hstmt) +void ODBConn::ThrowDBX(RETCODE rc, PCSZ msg, HSTMT hstmt) { DBX* xp = new(m_G) DBX(rc, msg); @@ -1030,7 +1035,7 @@ void ODBConn::ThrowDBX(RETCODE rc, PSZ msg, HSTMT hstmt) } // end of ThrowDBX -void ODBConn::ThrowDBX(PSZ msg) +void ODBConn::ThrowDBX(PCSZ msg) { DBX* xp = new(m_G) DBX(0, "Error"); @@ -1110,7 +1115,7 @@ void ODBConn::OnSetOptions(HSTMT hstmt) /***********************************************************************/ /* Open: connect to a data source. */ /***********************************************************************/ -int ODBConn::Open(PSZ ConnectString, POPARM sop, DWORD options) +int ODBConn::Open(PCSZ ConnectString, POPARM sop, DWORD options) { PGLOBAL& g = m_G; //ASSERT_VALID(this); @@ -1141,7 +1146,25 @@ int ODBConn::Open(PSZ ConnectString, POPARM sop, DWORD options) } else // Connect using SQLConnect Connect(); - /*ver = GetStringInfo(SQL_DRIVER_ODBC_VER);*/ + /*********************************************************************/ + /* Link a Fblock. This make possible to automatically close it */ + /* in case of error (throw). */ + /*********************************************************************/ + PDBUSER dbuserp = (PDBUSER)g->Activityp->Aptr; + + m_Fp = (PFBLOCK)PlugSubAlloc(g, NULL, sizeof(FBLOCK)); + m_Fp->Type = TYPE_FB_ODBC; + m_Fp->Fname = NULL; + m_Fp->Next = dbuserp->Openlist; + dbuserp->Openlist = m_Fp; + m_Fp->Count = 1; + m_Fp->Length = 0; + m_Fp->Memory = NULL; + m_Fp->Mode = MODE_ANY; + m_Fp->File = this; + m_Fp->Handle = 0; + + /*ver = GetStringInfo(SQL_DRIVER_ODBC_VER);*/ // Verify support for required functionality and cache info // VerifyConnect(); Deprecated GetConnectInfo(); @@ -1192,7 +1215,7 @@ void ODBConn::AllocConnect(DWORD Options) #if defined(_DEBUG) if (Options & traceSQL) { - SQLSetConnectOption(m_hdbc, SQL_OPT_TRACEFILE, (DWORD)"xodbc.out"); + SQLSetConnectOption(m_hdbc, SQL_OPT_TRACEFILE, (SQLULEN)"xodbc.out"); SQLSetConnectOption(m_hdbc, SQL_OPT_TRACE, 1); } // endif #endif // _DEBUG @@ -1215,7 +1238,7 @@ void ODBConn::AllocConnect(DWORD Options) // Turn on cursor lib support if (Options & useCursorLib) - rc = SQLSetConnectOption(m_hdbc, SQL_ODBC_CURSORS, SQL_CUR_USE_ODBC); + rc = SQLSetConnectOption(m_hdbc, SQL_ODBC_CURSORS, SQL_CUR_USE_DRIVER); return; } // end of AllocConnect @@ -1921,7 +1944,7 @@ bool ODBConn::ExecSQLcommand(char *sql) /* GetMetaData: constructs the result blocks containing the */ /* description of all the columns of an SQL command. */ /**************************************************************************/ -PQRYRES ODBConn::GetMetaData(PGLOBAL g, char *dsn, char *src) +PQRYRES ODBConn::GetMetaData(PGLOBAL g, PCSZ dsn, PCSZ src) { static int buftyp[] = {TYPE_STRING, TYPE_SHORT, TYPE_INT, TYPE_SHORT, TYPE_SHORT}; @@ -2244,7 +2267,7 @@ int ODBConn::GetCatInfo(CATPARM *cap) void *buffer; int i, irc; bool b; - PSZ fnc = "Unknown"; + PCSZ fnc = "Unknown"; UWORD n; SWORD ncol, len, tp; SQLULEN crow = 0; @@ -2283,22 +2306,20 @@ int ODBConn::GetCatInfo(CATPARM *cap) // Now do call the proper ODBC API switch (cap->Id) { case CAT_TAB: -// rc = SQLSetStmtAttr(hstmt, SQL_ATTR_METADATA_ID, -// (SQLPOINTER)false, 0); fnc = "SQLTables"; rc = SQLTables(hstmt, name.ptr(2), name.length(2), name.ptr(1), name.length(1), name.ptr(0), name.length(0), - cap->Pat, cap->Pat ? SQL_NTS : 0); + (SQLCHAR *)cap->Pat, + cap->Pat ? SQL_NTS : 0); break; case CAT_COL: -// rc = SQLSetStmtAttr(hstmt, SQL_ATTR_METADATA_ID, -// (SQLPOINTER)true, 0); fnc = "SQLColumns"; rc = SQLColumns(hstmt, name.ptr(2), name.length(2), name.ptr(1), name.length(1), name.ptr(0), name.length(0), - cap->Pat, cap->Pat ? SQL_NTS : 0); + (SQLCHAR *)cap->Pat, + cap->Pat ? SQL_NTS : 0); break; case CAT_KEY: fnc = "SQLPrimaryKeys"; @@ -2346,6 +2367,7 @@ int ODBConn::GetCatInfo(CATPARM *cap) } // endif len pval[n] = AllocateValue(g, crp->Type, len); + pval[n]->SetNullable(true); if (crp->Type == TYPE_STRING) { pbuf[n] = (char*)PlugSubAlloc(g, NULL, len); @@ -2603,4 +2625,7 @@ void ODBConn::Close() m_henv = SQL_NULL_HENV; } // endif m_henv + if (m_Fp) + m_Fp->Count = 0; + } // end of Close diff --git a/storage/connect/odbconn.h b/storage/connect/odbconn.h index 063985218ec..f98c67bd12f 100644 --- a/storage/connect/odbconn.h +++ b/storage/connect/odbconn.h @@ -27,7 +27,7 @@ //efine MAX_DNAME_LEN 256 // Max size of Recordset names #define MAX_CONNECT_LEN 1024 // Max size of Connect string //efine MAX_CURSOR_NAME 18 // Max size of a cursor name -#define DEFAULT_FIELD_TYPE SQL_TYPE_NULL // pick "C" data type to match SQL data type +//efine DEFAULT_FIELD_TYPE SQL_TYPE_NULL // pick "C" data type to match SQL data type #if !defined(__WIN__) typedef unsigned char *PUCHAR; @@ -54,9 +54,9 @@ enum CATINFO {CAT_TAB = 1, /* SQLTables */ typedef struct tagCATPARM { CATINFO Id; // Id to indicate function PQRYRES Qrp; // Result set pointer - PUCHAR DB; // Database (Schema) - PUCHAR Tab; // Table name or pattern - PUCHAR Pat; // Table type or column pattern + PCSZ DB; // Database (Schema) + PCSZ Tab; // Table name or pattern + PCSZ Pat; // Table type or column pattern SQLLEN* *Vlen; // To array of indicator values UWORD *Status; // To status block // For SQLStatistics @@ -80,23 +80,23 @@ class DBX : public BLOCK { friend class ODBConn; // Construction (by ThrowDBX only) -- destruction protected: - DBX(RETCODE rc, PSZ msg = NULL); + DBX(RETCODE rc, PCSZ msg = NULL); public: //virtual ~DBX() {} //void operator delete(void*, PGLOBAL, void*) {}; // Implementation (use ThrowDBX to create) RETCODE GetRC(void) {return m_RC;} - PSZ GetMsg(void) {return m_Msg;} - const char *GetErrorMessage(int i); + PCSZ GetMsg(void) {return m_Msg;} + PCSZ GetErrorMessage(int i); protected: bool BuildErrorMessage(ODBConn* pdb, HSTMT hstmt = SQL_NULL_HSTMT); // Attributes RETCODE m_RC; - PSZ m_Msg; - PSZ m_ErrMsg[MAX_NUM_OF_MSG]; + PCSZ m_Msg; + PCSZ m_ErrMsg[MAX_NUM_OF_MSG]; }; // end of DBX class definition /***********************************************************************/ @@ -105,7 +105,7 @@ class DBX : public BLOCK { class ODBConn : public BLOCK { friend class TDBODBC; friend class DBX; - friend PQRYRES GetColumnInfo(PGLOBAL, char*&, char *, int, PVBLK&); +//friend PQRYRES GetColumnInfo(PGLOBAL, char*&, char *, int, PVBLK&); private: ODBConn(); // Standard (unused) constructor @@ -119,7 +119,7 @@ class ODBConn : public BLOCK { noOdbcDialog = 0x0008, // Don't display ODBC Connect dialog forceOdbcDialog = 0x0010}; // Always display ODBC connect dialog - int Open(PSZ ConnectString, POPARM sop, DWORD Options = 0); + int Open(PCSZ ConnectString, POPARM sop, DWORD Options = 0); int Rewind(char *sql, ODBCCOL *tocols); void Close(void); PQRYRES AllocateResult(PGLOBAL g); @@ -131,7 +131,7 @@ class ODBConn : public BLOCK { bool IsOpen(void) {return m_hdbc != SQL_NULL_HDBC;} PSZ GetStringInfo(ushort infotype); int GetMaxValue(ushort infotype); - PSZ GetConnect(void) {return m_Connect;} + PCSZ GetConnect(void) {return m_Connect;} public: // Operations @@ -149,7 +149,7 @@ class ODBConn : public BLOCK { int GetCatInfo(CATPARM *cap); bool GetDataSources(PQRYRES qrp); bool GetDrivers(PQRYRES qrp); - PQRYRES GetMetaData(PGLOBAL g, char *dsn, char *src); + PQRYRES GetMetaData(PGLOBAL g, PCSZ dsn, PCSZ src); public: // Set special options @@ -162,14 +162,14 @@ class ODBConn : public BLOCK { // ODBC operations protected: bool Check(RETCODE rc); - void ThrowDBX(RETCODE rc, PSZ msg, HSTMT hstmt = SQL_NULL_HSTMT); - void ThrowDBX(PSZ msg); + void ThrowDBX(RETCODE rc, PCSZ msg, HSTMT hstmt = SQL_NULL_HSTMT); + void ThrowDBX(PCSZ msg); void AllocConnect(DWORD dwOptions); void Connect(void); bool DriverConnect(DWORD Options); void VerifyConnect(void); void GetConnectInfo(void); - void Free(void); +//void Free(void); protected: // Static members @@ -187,9 +187,10 @@ class ODBConn : public BLOCK { DWORD m_UpdateOptions; DWORD m_RowsetSize; char m_IDQuoteChar[2]; - PSZ m_Connect; - PSZ m_User; - PSZ m_Pwd; + PFBLOCK m_Fp; + PCSZ m_Connect; + PCSZ m_User; + PCSZ m_Pwd; int m_Catver; int m_Rows; int m_Fetch; diff --git a/storage/connect/os.h b/storage/connect/os.h index 2dc603fdcda..797692d47b2 100644 --- a/storage/connect/os.h +++ b/storage/connect/os.h @@ -1,3 +1,4 @@ +/* Copyright (C) MariaDB Corporation Ab */ #ifndef _OS_H_INCLUDED #define _OS_H_INCLUDED @@ -17,13 +18,16 @@ typedef off_t off64_t; #if defined(__WIN__) typedef __int64 BIGINT; +typedef _Null_terminated_ const char *PCSZ; #else // !__WIN__ typedef longlong BIGINT; #define FILE_BEGIN SEEK_SET #define FILE_CURRENT SEEK_CUR #define FILE_END SEEK_END +typedef const char *PCSZ; #endif // !__WIN__ + #if !defined(__WIN__) typedef const void *LPCVOID; typedef const char *LPCTSTR; @@ -42,7 +46,7 @@ typedef int INT; sqltypes.h (through sql.h or sqlext.h). */ typedef unsigned long DWORD; -#endif /* !NODW */ +#endif // !NODW #undef HANDLE typedef int HANDLE; diff --git a/storage/connect/osutil.c b/storage/connect/osutil.c index 2e9e120b0c8..da896fec50e 100644 --- a/storage/connect/osutil.c +++ b/storage/connect/osutil.c @@ -1,3 +1,4 @@ +/* Copyright (C) MariaDB Corporation Ab */ #include "my_global.h" #include #include @@ -43,34 +44,6 @@ PSZ strlwr(PSZ p) return (p); } /* end of strlwr */ -#if defined(NOT_USED) /*&& !defined(sun) && !defined(LINUX) && !defined(AIX)*/ -/***********************************************************************/ -/* Define stricmp function not existing in some UNIX libraries. */ -/***********************************************************************/ -int stricmp(char *str1, char *str2) - { - register int i; - int n; - char c; - char *sup1 = malloc(strlen(str1) + 1); - char *sup2 = malloc(strlen(str2) + 1); - - for (i = 0; c = str1[i]; i++) - sup1[i] = toupper(c); - - sup1[i] = 0; - - for (i = 0; c = str2[i]; i++) - sup2[i] = toupper(c); - - sup2[i] = 0; - n = strcmp(sup1, sup2); - free(sup1); - free(sup2); - return (n); - } /* end of stricmp */ -#endif /* sun */ - /***********************************************************************/ /* Define the splitpath function not existing in the UNIX library. */ /***********************************************************************/ @@ -143,13 +116,6 @@ my_bool CloseFileHandle(HANDLE h) return (close(h)) ? TRUE : FALSE; } /* end of CloseFileHandle */ -#if 0 -void Sleep(DWORD time) - { - //FIXME: TODO - } /* end of Sleep */ -#endif - int GetLastError() { return errno; @@ -210,21 +176,4 @@ BOOL MessageBeep(uint i __attribute__((unused))) return TRUE; } /* end of MessageBeep */ -#if 0 -/* This function is ridiculous and should be revisited */ -DWORD FormatMessage(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, - DWORD dwLanguageId, LPSTR lpBuffer, DWORD nSize, ...) - { - char buff[32]; - int n; - -//if (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) -// return 0; /* means error */ - - n = sprintf(buff, "Error code: %d", (int) dwMessageId); - strncpy(lpBuffer, buff, nSize); - return min(n, nSize); - } /* end of FormatMessage */ -#endif - #endif // UNIX diff --git a/storage/connect/osutil.h b/storage/connect/osutil.h index ac63d4ee973..7e6b8823b9b 100644 --- a/storage/connect/osutil.h +++ b/storage/connect/osutil.h @@ -1,3 +1,4 @@ +/* Copyright (C) MariaDB Corporation Ab */ #ifndef __OSUTIL_H__ #define __OSUTIL_H__ diff --git a/storage/connect/plgdbsem.h b/storage/connect/plgdbsem.h index 800b1098d50..6a0a8be8ff8 100644 --- a/storage/connect/plgdbsem.h +++ b/storage/connect/plgdbsem.h @@ -36,8 +36,6 @@ enum BLKTYP {TYPE_TABLE = 50, /* Table Name/Srcdef/... Block */ TYPE_COLCRT = 71, /* Column creation block */ TYPE_CONST = 72, /* Constant */ -/*-------------------- type tokenized string --------------------------*/ - TYPE_DATE = 8, /* Timestamp */ /*-------------------- additional values used by LNA ------------------*/ TYPE_COLIST = 14, /* Column list */ TYPE_COL = 41, /* Column */ @@ -50,7 +48,10 @@ enum BLKTYP {TYPE_TABLE = 50, /* Table Name/Srcdef/... Block */ TYPE_FB_HANDLE = 24, /* File block (handle) */ TYPE_FB_XML = 21, /* DOM XML file block */ TYPE_FB_XML2 = 27, /* libxml2 XML file block */ - TYPE_FB_ZIP = 28}; /* ZIP file block */ + TYPE_FB_ODBC = 25, /* ODBC file block */ + TYPE_FB_ZIP = 28, /* ZIP file block */ + TYPE_FB_JAVA = 29, /* JAVA file block */ + TYPE_FB_MONGO = 30}; /* MONGO file block */ enum TABTYPE {TAB_UNDEF = 0, /* Table of undefined type */ TAB_DOS = 1, /* Fixed column offset, variable LRECL */ @@ -80,7 +81,8 @@ enum TABTYPE {TAB_UNDEF = 0, /* Table of undefined type */ TAB_DMY = 25, /* DMY Dummy tables NIY */ TAB_JDBC = 26, /* Table accessed via JDBC */ TAB_ZIP = 27, /* ZIP file info table */ - TAB_NIY = 28}; /* Table not implemented yet */ + TAB_MONGO = 28, /* Table retrieved from MongoDB */ + TAB_NIY = 30}; /* Table not implemented yet */ enum AMT {TYPE_AM_ERROR = 0, /* Type not defined */ TYPE_AM_ROWID = 1, /* ROWID type (special column) */ @@ -139,10 +141,11 @@ enum AMT {TYPE_AM_ERROR = 0, /* Type not defined */ TYPE_AM_VIR = 171, /* Virtual tables am type no */ TYPE_AM_DMY = 172, /* DMY Dummy tables am type no */ TYPE_AM_SET = 180, /* SET Set tables am type no */ - TYPE_AM_MYSQL = 192, /* MYSQL access method type no */ - TYPE_AM_MYX = 193, /* MYSQL EXEC access method type */ - TYPE_AM_CAT = 195, /* Catalog access method type no */ - TYPE_AM_ZIP = 198, /* ZIP access method type no */ + TYPE_AM_MYSQL = 190, /* MYSQL access method type no */ + TYPE_AM_MYX = 191, /* MYSQL EXEC access method type */ + TYPE_AM_CAT = 192, /* Catalog access method type no */ + TYPE_AM_ZIP = 193, /* ZIP access method type no */ + TYPE_AM_MGO = 194, /* MGO access method type no */ TYPE_AM_OUT = 200}; /* Output relations (storage) */ enum RECFM {RECFM_NAF = -2, /* Not a file */ @@ -553,7 +556,7 @@ typedef struct _qryres { typedef struct _colres { PCOLRES Next; /* To next result column */ PCOL Colp; /* To matching column block */ - PSZ Name; /* Column header */ + PCSZ Name; /* Column header */ PVBLK Kdata; /* Column block of values */ char *Nulls; /* Column null value array */ int Type; /* Internal type */ @@ -583,7 +586,7 @@ void PlugLineDB(PGLOBAL, PSZ, short, void *, uint); char *SetPath(PGLOBAL g, const char *path); char *ExtractFromPath(PGLOBAL, char *, char *, OPVAL); void AddPointer(PTABS, void *); -PDTP MakeDateFormat(PGLOBAL, PSZ, bool, bool, int); +PDTP MakeDateFormat(PGLOBAL, PCSZ, bool, bool, int); int ExtractDate(char *, PDTP, int, int val[6]); /**************************************************************************/ @@ -615,11 +618,10 @@ DllExport void *PlgDBrealloc(PGLOBAL, void *, MBLOCK&, size_t); DllExport void NewPointer(PTABS, void *, void *); //lExport char *GetIni(int n= 0); // Not used anymore DllExport void SetTrc(void); -DllExport char *GetListOption(PGLOBAL, const char *, const char *, - const char *def=NULL); -DllExport char *GetStringTableOption(PGLOBAL, PTOS, char *, char *); -DllExport bool GetBooleanTableOption(PGLOBAL, PTOS, char *, bool); -DllExport int GetIntegerTableOption(PGLOBAL, PTOS, char *, int); +DllExport PCSZ GetListOption(PGLOBAL, PCSZ, PCSZ, PCSZ def=NULL); +DllExport PCSZ GetStringTableOption(PGLOBAL, PTOS, PCSZ, PCSZ); +DllExport bool GetBooleanTableOption(PGLOBAL, PTOS, PCSZ, bool); +DllExport int GetIntegerTableOption(PGLOBAL, PTOS, PCSZ, int); #define MSGID_NONE 0 #define MSGID_CANNOT_OPEN 1 diff --git a/storage/connect/plgdbutl.cpp b/storage/connect/plgdbutl.cpp index 1910cdcdec8..25da3162516 100644 --- a/storage/connect/plgdbutl.cpp +++ b/storage/connect/plgdbutl.cpp @@ -70,7 +70,13 @@ #include "rcmsg.h" #ifdef ZIP_SUPPORT #include "filamzip.h" -#endif // ZIP_SUPPORT +#endif // ZIP_SUPPORT +#ifdef JDBC_SUPPORT +#include "javaconn.h" +#endif // JDBC_SUPPORT +#ifdef CMGO_SUPPORT +#include "cmgoconn.h" +#endif // MONGO_SUPPORT /***********************************************************************/ /* DB static variables. */ @@ -82,14 +88,14 @@ extern "C" { extern char version[]; } // extern "C" -#if defined(__WIN__) -extern CRITICAL_SECTION parsec; // Used calling the Flex parser -#else // !__WIN__ +//#if defined(__WIN__) +//extern CRITICAL_SECTION parsec; // Used calling the Flex parser +//#else // !__WIN__ extern pthread_mutex_t parmut; -#endif // !__WIN__ +//#endif // !__WIN__ // The debug trace used by the main thread - FILE *pfile = NULL; +FILE *pfile = NULL; MBLOCK Nmblk = {NULL, false, 0, false, NULL}; // Used to init MBLOCK's @@ -108,6 +114,9 @@ void CloseXMLFile(PGLOBAL, PFBLOCK, bool); #include "libdoc.h" #endif // LIBXML2_SUPPORT +#ifdef ODBC_SUPPORT +void OdbcClose(PGLOBAL g, PFBLOCK fp); +#endif // ODBC_SUPPORT /***********************************************************************/ /* Routines for file IO with error reporting to g->Message */ @@ -238,88 +247,84 @@ void ptrc(char const *fmt, ...) PQRYRES PlgAllocResult(PGLOBAL g, int ncol, int maxres, int ids, int *buftyp, XFLD *fldtyp, unsigned int *length, bool blank, bool nonull) - { +{ char cname[NAM_LEN+1]; int i; PCOLRES *pcrp, crp; PQRYRES qrp; - // Save stack and allocation environment and prepare error return - if (g->jump_level == MAX_JUMP) { - strcpy(g->Message, MSG(TOO_MANY_JUMPS)); - return NULL; - } // endif jump_level + try { + /**********************************************************************/ + /* Allocate the structure used to contain the result set. */ + /**********************************************************************/ + qrp = (PQRYRES)PlugSubAlloc(g, NULL, sizeof(QRYRES)); + pcrp = &qrp->Colresp; + qrp->Continued = false; + qrp->Truncated = false; + qrp->Info = false; + qrp->Suball = true; + qrp->Maxres = maxres; + qrp->Maxsize = 0; + qrp->Nblin = 0; + qrp->Nbcol = 0; // will be ncol + qrp->Cursor = 0; + qrp->BadLines = 0; - if (setjmp(g->jumper[++g->jump_level]) != 0) { - printf("%s\n", g->Message); - qrp = NULL; - goto fin; - } // endif rc + for (i = 0; i < ncol; i++) { + *pcrp = (PCOLRES)PlugSubAlloc(g, NULL, sizeof(COLRES)); + crp = *pcrp; + pcrp = &crp->Next; + memset(crp, 0, sizeof(COLRES)); + crp->Colp = NULL; + crp->Ncol = ++qrp->Nbcol; + crp->Type = buftyp[i]; + crp->Length = length[i]; + crp->Clen = GetTypeSize(crp->Type, length[i]); + crp->Prec = 0; - /************************************************************************/ - /* Allocate the structure used to contain the result set. */ - /************************************************************************/ - qrp = (PQRYRES)PlugSubAlloc(g, NULL, sizeof(QRYRES)); - pcrp = &qrp->Colresp; - qrp->Continued = false; - qrp->Truncated = false; - qrp->Info = false; - qrp->Suball = true; - qrp->Maxres = maxres; - qrp->Maxsize = 0; - qrp->Nblin = 0; - qrp->Nbcol = 0; // will be ncol - qrp->Cursor = 0; - qrp->BadLines = 0; - - for (i = 0; i < ncol; i++) { - *pcrp = (PCOLRES)PlugSubAlloc(g, NULL, sizeof(COLRES)); - crp = *pcrp; - pcrp = &crp->Next; - memset(crp, 0, sizeof(COLRES)); - crp->Colp = NULL; - crp->Ncol = ++qrp->Nbcol; - crp->Type = buftyp[i]; - crp->Length = length[i]; - crp->Clen = GetTypeSize(crp->Type, length[i]); - crp->Prec = 0; - - if (ids > 0) { + if (ids > 0) { #if defined(XMSG) - // Get header from message file - strncpy(cname, PlugReadMessage(g, ids + crp->Ncol, NULL), NAM_LEN); - cname[NAM_LEN] = 0; // for truncated long names + // Get header from message file + strncpy(cname, PlugReadMessage(g, ids + crp->Ncol, NULL), NAM_LEN); + cname[NAM_LEN] = 0; // for truncated long names #else // !XMSG - GetRcString(ids + crp->Ncol, cname, sizeof(cname)); + GetRcString(ids + crp->Ncol, cname, sizeof(cname)); #endif // !XMSG - crp->Name = (PSZ)PlugDup(g, cname); - } else - crp->Name = NULL; // Will be set by caller + crp->Name = (PSZ)PlugDup(g, cname); + } else + crp->Name = NULL; // Will be set by caller - if (fldtyp) - crp->Fld = fldtyp[i]; - else - crp->Fld = FLD_NO; + if (fldtyp) + crp->Fld = fldtyp[i]; + else + crp->Fld = FLD_NO; - // Allocate the Value Block that will contain data - if (crp->Length || nonull) - crp->Kdata = AllocValBlock(g, NULL, crp->Type, maxres, - crp->Length, 0, true, blank, false); - else - crp->Kdata = NULL; + // Allocate the Value Block that will contain data + if (crp->Length || nonull) + crp->Kdata = AllocValBlock(g, NULL, crp->Type, maxres, + crp->Length, 0, true, blank, false); + else + crp->Kdata = NULL; - if (trace) - htrc("Column(%d) %s type=%d len=%d value=%p\n", - crp->Ncol, crp->Name, crp->Type, crp->Length, crp->Kdata); + if (trace) + htrc("Column(%d) %s type=%d len=%d value=%p\n", + crp->Ncol, crp->Name, crp->Type, crp->Length, crp->Kdata); - } // endfor i + } // endfor i - *pcrp = NULL; + *pcrp = NULL; - fin: - g->jump_level--; - return qrp; - } // end of PlgAllocResult + } catch (int n) { + htrc("Exception %d: %s\n", n, g->Message); + qrp = NULL; + } catch (const char *msg) { + strcpy(g->Message, msg); + htrc("%s\n", g->Message); + qrp = NULL; + } // end catch + + return qrp; +} // end of PlgAllocResult /***********************************************************************/ /* Allocate and initialize the new DB User Block. */ @@ -365,8 +370,8 @@ PCATLG PlgGetCatalog(PGLOBAL g, bool jump) if (!cat && jump) { // Raise exception so caller doesn't have to check return value strcpy(g->Message, MSG(NO_ACTIVE_DB)); - longjmp(g->jumper[g->jump_level], 1); - } // endif cat + throw 1; + } // endif cat return cat; } // end of PlgGetCatalog @@ -391,26 +396,27 @@ char *SetPath(PGLOBAL g, const char *path) char *buf= NULL; if (path) { - size_t len= strlen(path) + (*path != '.' ? 4 : 1); + size_t len = strlen(path) + (*path != '.' ? 4 : 1); + + if (!(buf = (char*)PlgDBSubAlloc(g, NULL, len))) + return NULL; - buf= (char*)PlugSubAlloc(g, NULL, len); - if (PlugIsAbsolutePath(path)) { - strcpy(buf, path); - return buf; - } // endif path + strcpy(buf, path); + return buf; + } // endif path if (*path != '.') { #if defined(__WIN__) - char *s= "\\"; + const char *s = "\\"; #else // !__WIN__ - char *s= "/"; + const char *s = "/"; #endif // !__WIN__ strcat(strcat(strcat(strcpy(buf, "."), s), path), s); } else strcpy(buf, path); - } // endif path + } // endif path return buf; } // end of SetPath @@ -448,7 +454,7 @@ char *ExtractFromPath(PGLOBAL g, char *pBuff, char *FileName, OPVAL op) static bool PlugCheckPattern(PGLOBAL g, LPCSTR string, LPCSTR pat) { if (pat && strlen(pat)) { - // This leaves 512 bytes (MAX_STR / 2) for each components + // This leaves 2048 bytes (MAX_STR / 2) for each components LPSTR name = g->Message + MAX_STR / 2; strlwr(strcpy(name, string)); @@ -476,8 +482,8 @@ bool PlugEvalLike(PGLOBAL g, LPCSTR strg, LPCSTR pat, bool ci) tp = g->Message; else if (!(tp = new char[strlen(pat) + strlen(strg) + 2])) { strcpy(g->Message, MSG(NEW_RETURN_NULL)); - longjmp(g->jumper[g->jump_level], OP_LIKE); - } /* endif tp */ + throw (int)OP_LIKE; + } /* endif tp */ sp = tp + strlen(pat) + 1; strlwr(strcpy(tp, pat)); /* Make a lower case copy of pat */ @@ -487,8 +493,8 @@ bool PlugEvalLike(PGLOBAL g, LPCSTR strg, LPCSTR pat, bool ci) tp = g->Message; /* Use this as temporary work space. */ else if (!(tp = new char[strlen(pat) + 1])) { strcpy(g->Message, MSG(NEW_RETURN_NULL)); - longjmp(g->jumper[g->jump_level], OP_LIKE); - } /* endif tp */ + throw (int)OP_LIKE; + } /* endif tp */ strcpy(tp, pat); /* Make a copy to be worked into */ sp = (char*)strg; @@ -676,7 +682,7 @@ void PlugConvertConstant(PGLOBAL g, void* & value, short& type) /* format and a Strftime output format. Flag if not 0 indicates that */ /* non quoted blanks are not included in the output format. */ /***********************************************************************/ -PDTP MakeDateFormat(PGLOBAL g, PSZ dfmt, bool in, bool out, int flag) +PDTP MakeDateFormat(PGLOBAL g, PCSZ dfmt, bool in, bool out, int flag) { int rc; PDTP pdp = (PDTP)PlugSubAlloc(g, NULL, sizeof(DATPAR)); @@ -685,7 +691,7 @@ PDTP MakeDateFormat(PGLOBAL g, PSZ dfmt, bool in, bool out, int flag) htrc("MakeDateFormat: dfmt=%s\n", dfmt); memset(pdp, 0, sizeof(DATPAR)); - pdp->Format = pdp->Curp = dfmt; + pdp->Format = pdp->Curp = PlugDup(g, dfmt); pdp->Outsize = 2 * strlen(dfmt) + 1; if (in) @@ -698,23 +704,11 @@ PDTP MakeDateFormat(PGLOBAL g, PSZ dfmt, bool in, bool out, int flag) /*********************************************************************/ /* Call the FLEX generated parser. In multi-threading mode the next */ - /* instruction is included in an Enter/LeaveCriticalSection bracket. */ + /* instruction is protected by mutex fmdflex using static variables. */ /*********************************************************************/ - //#if defined(THREAD) -#if defined(__WIN__) - EnterCriticalSection((LPCRITICAL_SECTION)&parsec); -#else // !__WIN__ pthread_mutex_lock(&parmut); -#endif // !__WIN__ -//#endif // THREAD rc = fmdflex(pdp); -//#if defined(THREAD) -#if defined(__WIN__) - LeaveCriticalSection((LPCRITICAL_SECTION)&parsec); -#else // !__WIN__ pthread_mutex_unlock(&parmut); -#endif // !__WIN__ -//#endif // THREAD if (trace) htrc("Done: in=%s out=%s rc=%d\n", SVP(pdp->InFmt), SVP(pdp->OutFmt), rc); @@ -727,10 +721,11 @@ PDTP MakeDateFormat(PGLOBAL g, PSZ dfmt, bool in, bool out, int flag) /***********************************************************************/ int ExtractDate(char *dts, PDTP pdp, int defy, int val[6]) { - char *fmt, c, d, e, W[8][12]; - int i, k, m, numval; - int n, y = 30; - bool b = true; // true for null dates + PCSZ fmt; + char c, d, e, W[8][12]; + int i, k, m, numval; + int n, y = 30; + bool b = true; // true for null dates if (pdp) fmt = pdp->InFmt; @@ -888,7 +883,7 @@ FILE *PlugReopenFile(PGLOBAL g, PFBLOCK fp, LPCSTR md) /* Close file routine: the purpose of this routine is to avoid */ /* double closing that freeze the system on some Unix platforms. */ /***********************************************************************/ -int PlugCloseFile(PGLOBAL g __attribute__((unused)), PFBLOCK fp, bool all) +int PlugCloseFile(PGLOBAL g, PFBLOCK fp, bool all) { int rc = 0; @@ -917,7 +912,7 @@ int PlugCloseFile(PGLOBAL g __attribute__((unused)), PFBLOCK fp, bool all) fp->Memory = NULL; fp->Mode = MODE_ANY; - // Passthru + // fall through case TYPE_FB_HANDLE: if (fp->Handle && fp->Handle != INVALID_HANDLE_VALUE) if (CloseFileHandle(fp->Handle)) @@ -937,6 +932,13 @@ int PlugCloseFile(PGLOBAL g __attribute__((unused)), PFBLOCK fp, bool all) CloseXML2File(g, fp, all); break; #endif // LIBXML2_SUPPORT +#ifdef ODBC_SUPPORT + case TYPE_FB_ODBC: + OdbcClose(g, fp); + fp->Count = 0; + fp->File = NULL; + break; +#endif // ODBC_SUPPORT #ifdef ZIP_SUPPORT case TYPE_FB_ZIP: if (fp->Mode == MODE_INSERT) @@ -950,6 +952,20 @@ int PlugCloseFile(PGLOBAL g __attribute__((unused)), PFBLOCK fp, bool all) fp->File = NULL; break; #endif // ZIP_SUPPORT +#ifdef JDBC_SUPPORT + case TYPE_FB_JAVA: + ((JAVAConn*)fp->File)->Close(); + fp->Count = 0; + fp->File = NULL; + break; +#endif // JDBC_SUPPORT +#ifdef CMGO_SUPPORT + case TYPE_FB_MONGO: + ((CMgoConn*)fp->File)->Close(); + fp->Count = 0; + fp->File = NULL; + break; +#endif // MONGO_SUPPORT default: rc = RC_FX; } // endswitch Type @@ -1255,7 +1271,7 @@ void *PlgDBalloc(PGLOBAL g, void *area, MBLOCK& mp) // in the area, do allocate from virtual storage. #if defined(__WIN__) if (mp.Size >= BIGMEM) - mp.Memp = VirtualAlloc(NULL, mp.Size, MEM_COMMIT, PAGE_READWRITE); + mp.Memp = VirtualAlloc(NULL, mp.Size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); else #endif mp.Memp = malloc(mp.Size); @@ -1494,7 +1510,7 @@ void PlugPutOut(PGLOBAL g, FILE *f, short t, void *v, uint n) case TYPE_TABLE: case TYPE_TDB: case TYPE_XOBJECT: - ((PBLOCK)v)->Print(g, f, n-2); + ((PBLOCK)v)->Printf(g, f, n-2); break; default: @@ -1520,8 +1536,8 @@ DllExport void NewPointer(PTABS t, void *oldv, void *newv) PGLOBAL g = t->G; sprintf(g->Message, "NewPointer: %s", MSG(MEM_ALLOC_ERROR)); - longjmp(g->jumper[g->jump_level], 3); - } else { + throw 3; + } else { tp->Next = t->P1; tp->Num = 0; t->P1 = tp; @@ -1557,15 +1573,15 @@ int FileComp(PGLOBAL g, char *file1, char *file2) sprintf(g->Message, MSG(OPEN_MODE_ERROR), "rb", (int)errno, fn[i]); strcat(strcat(g->Message, ": "), strerror(errno)); - longjmp(g->jumper[g->jump_level], 666); -// } else + throw 666; + // } else // len[i] = 0; // File does not exist yet } else { if ((len[i] = _filelength(h[i])) < 0) { sprintf(g->Message, MSG(FILELEN_ERROR), "_filelength", fn[i]); - longjmp(g->jumper[g->jump_level], 666); - } // endif len + throw 666; + } // endif len } // endif h diff --git a/storage/connect/plgxml.cpp b/storage/connect/plgxml.cpp index eb31e24235b..f3d3a010266 100644 --- a/storage/connect/plgxml.cpp +++ b/storage/connect/plgxml.cpp @@ -45,7 +45,7 @@ XMLDOCUMENT::XMLDOCUMENT(char *nsl, char *nsdf, char *enc) /******************************************************************/ /* Initialize zipped file processing. */ /******************************************************************/ -bool XMLDOCUMENT::InitZip(PGLOBAL g, char *entry) +bool XMLDOCUMENT::InitZip(PGLOBAL g, PCSZ entry) { #if defined(ZIP_SUPPORT) bool mul = (entry) ? strchr(entry, '*') || strchr(entry, '?') : false; @@ -173,7 +173,7 @@ void XMLNODE::Delete(PXNODE dnp) /******************************************************************/ /* Store a string in Buf, enventually reallocating it. */ /******************************************************************/ -char *XMLNODE::BufAlloc(PGLOBAL g, char *p, int n) +char *XMLNODE::BufAlloc(PGLOBAL g, const char *p, int n) { if (Len < n) { Len = n; diff --git a/storage/connect/plgxml.h b/storage/connect/plgxml.h index 6870764c503..82629e4c7db 100644 --- a/storage/connect/plgxml.h +++ b/storage/connect/plgxml.h @@ -76,9 +76,9 @@ class XMLDOCUMENT : public BLOCK { virtual void SetNofree(bool b) = 0; // Methods - virtual bool Initialize(PGLOBAL, char *, bool) = 0; + virtual bool Initialize(PGLOBAL, PCSZ, bool) = 0; virtual bool ParseFile(PGLOBAL, char *) = 0; - virtual bool NewDoc(PGLOBAL, char *) = 0; + virtual bool NewDoc(PGLOBAL, PCSZ) = 0; virtual void AddComment(PGLOBAL, char *) = 0; virtual PXNODE GetRoot(PGLOBAL) = 0; virtual PXNODE NewRoot(PGLOBAL, char *) = 0; @@ -95,7 +95,7 @@ class XMLDOCUMENT : public BLOCK { // Utility bool MakeNSlist(PGLOBAL g); - bool InitZip(PGLOBAL g, char *entry); + bool InitZip(PGLOBAL g, PCSZ entry); char *GetMemDoc(PGLOBAL g, char *fn); void CloseZip(void); @@ -131,15 +131,15 @@ class XMLNODE : public BLOCK { virtual PXLIST SelectNodes(PGLOBAL, char *, PXLIST = NULL) = 0; virtual PXNODE SelectSingleNode(PGLOBAL, char *, PXNODE = NULL) = 0; virtual PXATTR GetAttribute(PGLOBAL, char *, PXATTR = NULL) = 0; - virtual PXNODE AddChildNode(PGLOBAL, char *, PXNODE = NULL) = 0; + virtual PXNODE AddChildNode(PGLOBAL, PCSZ, PXNODE = NULL) = 0; virtual PXATTR AddProperty(PGLOBAL, char *, PXATTR = NULL) = 0; - virtual void AddText(PGLOBAL, char *) = 0; + virtual void AddText(PGLOBAL, PCSZ) = 0; virtual void DeleteChild(PGLOBAL, PXNODE) = 0; protected: PXNODE NewChild(PXNODE ncp); void Delete(PXNODE dnp); - char *BufAlloc(PGLOBAL g, char *p, int n); + char *BufAlloc(PGLOBAL g, const char *p, int n); // Constructor XMLNODE(PXDOC dp); diff --git a/storage/connect/plugutil.c b/storage/connect/plugutil.cpp similarity index 91% rename from storage/connect/plugutil.c rename to storage/connect/plugutil.cpp index bfac8a5fd99..d63674e2e36 100644 --- a/storage/connect/plugutil.c +++ b/storage/connect/plugutil.cpp @@ -2,11 +2,11 @@ /* */ /* PROGRAM NAME: PLUGUTIL */ /* ------------- */ -/* Version 2.9 */ +/* Version 3.0 */ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 1993-2015 */ +/* (C) Copyright to the author Olivier BERTRAND 1993-2017 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -76,6 +76,7 @@ #include "osutil.h" #include "global.h" +#include "plgdbsem.h" #if defined(NEWMSG) #include "rcmsg.h" #endif // NEWMSG @@ -132,59 +133,70 @@ void htrc(char const *fmt, ...) /* Return value is the pointer to the Global structure. */ /***********************************************************************/ PGLOBAL PlugInit(LPCSTR Language, uint worksize) - { - PGLOBAL g; +{ + PGLOBAL g; - if (trace > 1) - htrc("PlugInit: Language='%s'\n", - ((!Language) ? "Null" : (char*)Language)); + if (trace > 1) + htrc("PlugInit: Language='%s'\n", + ((!Language) ? "Null" : (char*)Language)); - if (!(g = malloc(sizeof(GLOBAL)))) { - fprintf(stderr, MSG(GLOBAL_ERROR), (int)sizeof(GLOBAL)); - return NULL; - } else { - g->Sarea = NULL; - g->Createas = 0; - g->Alchecked = 0; - g->Mrr = 0; - g->Activityp = g->ActivityStart = NULL; - g->Xchk = NULL; - g->N = 0; - strcpy(g->Message, ""); + try { + g = new GLOBAL; + } catch (...) { + fprintf(stderr, MSG(GLOBAL_ERROR), (int)sizeof(GLOBAL)); + return NULL; + } // end try/catch - /*******************************************************************/ - /* Allocate the main work segment. */ - /*******************************************************************/ - if (worksize && !(g->Sarea = PlugAllocMem(g, worksize))) { - char errmsg[256]; - sprintf(errmsg, MSG(WORK_AREA), g->Message); - strcpy(g->Message, errmsg); - g->Sarea_Size = 0; - } else - g->Sarea_Size = worksize; + g->Sarea = NULL; + g->Createas = 0; + g->Alchecked = 0; + g->Mrr = 0; + g->Activityp = NULL; + g->Xchk = NULL; + g->N = 0; + g->More = 0; + strcpy(g->Message, ""); - } /* endif g */ + /*******************************************************************/ + /* Allocate the main work segment. */ + /*******************************************************************/ + if (worksize && !(g->Sarea = PlugAllocMem(g, worksize))) { + char errmsg[MAX_STR]; + sprintf(errmsg, MSG(WORK_AREA), g->Message); + strcpy(g->Message, errmsg); + g->Sarea_Size = 0; + } else + g->Sarea_Size = worksize; - g->jump_level = -1; /* New setting to allow recursive call of Plug */ - return(g); - } /* end of PlugInit */ + g->jump_level = -1; /* New setting to allow recursive call of Plug */ + return(g); +} /* end of PlugInit */ /***********************************************************************/ /* PlugExit: Terminate Plug operations. */ /***********************************************************************/ int PlugExit(PGLOBAL g) - { - int rc = 0; +{ + if (g) { + PDBUSER dup = PlgGetUser(g); - if (!g) - return rc; + if (dup) + free(dup); - if (g->Sarea) - free(g->Sarea); + if (g->Sarea) { +#if !defined(DEVELOPMENT) + if (trace) +#endif + htrc("Freeing Sarea at %p size=%d\n", g->Sarea, g->Sarea_Size); - free(g); - return rc; - } /* end of PlugExit */ + free(g->Sarea); + } // endif Sarea + + delete g; + } // endif g + + return 0; +} // end of PlugExit /***********************************************************************/ /* Remove the file type from a file name. */ @@ -448,7 +460,7 @@ short GetLineLength(PGLOBAL g) /* Program for memory allocation of work and language areas. */ /***********************************************************************/ void *PlugAllocMem(PGLOBAL g, uint size) - { +{ void *areap; /* Pointer to allocated area */ /*********************************************************************/ @@ -457,16 +469,20 @@ void *PlugAllocMem(PGLOBAL g, uint size) if (!(areap = malloc(size))) sprintf(g->Message, MSG(MALLOC_ERROR), "malloc"); - if (trace > 1) { +#if defined(DEVELOPMENT) + if (true) { +#else + if (trace) { +#endif if (areap) htrc("Memory of %u allocated at %p\n", size, areap); else htrc("PlugAllocMem: %s\n", g->Message); - } // endif trace + } // endif trace return (areap); - } /* end of PlugAllocMem */ +} // end of PlugAllocMem /***********************************************************************/ /* Program for SubSet initialization of memory pools. */ @@ -475,7 +491,7 @@ void *PlugAllocMem(PGLOBAL g, uint size) /***********************************************************************/ BOOL PlugSubSet(PGLOBAL g __attribute__((unused)), void *memp, uint size) { - PPOOLHEADER pph = memp; + PPOOLHEADER pph = (PPOOLHEADER)memp; pph->To_Free = (OFFSET)sizeof(POOLHEADER); pph->FreeBlk = size - pph->To_Free; @@ -501,7 +517,6 @@ void *PlugSubAlloc(PGLOBAL g, void *memp, size_t size) /*******************************************************************/ memp = g->Sarea; -//size = ((size + 3) / 4) * 4; /* Round up size to multiple of 4 */ size = ((size + 7) / 8) * 8; /* Round up size to multiple of 8 */ pph = (PPOOLHEADER)memp; @@ -510,26 +525,24 @@ void *PlugSubAlloc(PGLOBAL g, void *memp, size_t size) memp, size, pph->To_Free, pph->FreeBlk); if ((uint)size > pph->FreeBlk) { /* Not enough memory left in pool */ - char *pname = "Work"; + PCSZ pname = "Work"; sprintf(g->Message, "Not enough memory in %s area for request of %u (used=%d free=%d)", - pname, (uint) size, pph->To_Free, pph->FreeBlk); + pname, (uint)size, pph->To_Free, pph->FreeBlk); if (trace) htrc("PlugSubAlloc: %s\n", g->Message); - /* Nothing we can do if longjmp is not initialized. */ - assert(g->jump_level >= 0); - longjmp(g->jumper[g->jump_level], 1); + throw 1234; } /* endif size OS32 code */ /*********************************************************************/ /* Do the suballocation the simplest way. */ /*********************************************************************/ memp = MakePtr(memp, pph->To_Free); /* Points to suballocated block */ - pph->To_Free += size; /* New offset of pool free block */ - pph->FreeBlk -= size; /* New size of pool free block */ + pph->To_Free += (OFFSET)size; /* New offset of pool free block */ + pph->FreeBlk -= (uint)size; /* New size of pool free block */ if (trace > 3) htrc("Done memp=%p used=%d free=%d\n", diff --git a/storage/connect/preparse.h b/storage/connect/preparse.h index 2892a958bdd..f16624548fb 100644 --- a/storage/connect/preparse.h +++ b/storage/connect/preparse.h @@ -7,14 +7,14 @@ /* Struct of variables used by the date format pre-parser. */ /***********************************************************************/ typedef struct _datpar { - char *Format; // Points to format to decode + const char *Format; // Points to format to decode char *Curp; // Points to current parsing position char *InFmt; // Start of input format char *OutFmt; // Start of output format int Index[8]; // Indexes of date values int Num; // Number of values to retrieve int Flag; // 1: Input, 2: Output, 4: no output blank - int Outsize; // Size of output buffers + int Outsize; // Size of output buffers } DATPAR, *PDTP; /***********************************************************************/ diff --git a/storage/connect/reldef.cpp b/storage/connect/reldef.cpp index c6878737f1d..95069baf76e 100644 --- a/storage/connect/reldef.cpp +++ b/storage/connect/reldef.cpp @@ -88,7 +88,7 @@ PTOS RELDEF::GetTopt(void) /***********************************************************************/ /* This function sets an integer table information. */ /***********************************************************************/ -bool RELDEF::SetIntCatInfo(PSZ what, int n) +bool RELDEF::SetIntCatInfo(PCSZ what, int n) { return Hc->SetIntegerOption(what, n); } // end of SetIntCatInfo @@ -96,7 +96,7 @@ bool RELDEF::SetIntCatInfo(PSZ what, int n) /***********************************************************************/ /* This function returns integer table information. */ /***********************************************************************/ -int RELDEF::GetIntCatInfo(PSZ what, int idef) +int RELDEF::GetIntCatInfo(PCSZ what, int idef) { int n= Hc->GetIntegerOption(what); @@ -106,7 +106,7 @@ int RELDEF::GetIntCatInfo(PSZ what, int idef) /***********************************************************************/ /* This function returns Boolean table information. */ /***********************************************************************/ -bool RELDEF::GetBoolCatInfo(PSZ what, bool bdef) +bool RELDEF::GetBoolCatInfo(PCSZ what, bool bdef) { bool b= Hc->GetBooleanOption(what, bdef); @@ -116,9 +116,10 @@ bool RELDEF::GetBoolCatInfo(PSZ what, bool bdef) /***********************************************************************/ /* This function returns size catalog information. */ /***********************************************************************/ -int RELDEF::GetSizeCatInfo(PSZ what, PSZ sdef) +int RELDEF::GetSizeCatInfo(PCSZ what, PCSZ sdef) { - char * s, c; + char c; + PCSZ s; int i, n= 0; if (!(s= Hc->GetStringOption(what))) @@ -128,6 +129,7 @@ int RELDEF::GetSizeCatInfo(PSZ what, PSZ sdef) switch (toupper(c)) { case 'M': n *= 1024; + // fall through case 'K': n *= 1024; } // endswitch c @@ -138,9 +140,9 @@ int RELDEF::GetSizeCatInfo(PSZ what, PSZ sdef) /***********************************************************************/ /* This function sets char table information in buf. */ /***********************************************************************/ -int RELDEF::GetCharCatInfo(PSZ what, PSZ sdef, char *buf, int size) +int RELDEF::GetCharCatInfo(PCSZ what, PCSZ sdef, char *buf, int size) { - char *s= Hc->GetStringOption(what); + PCSZ s= Hc->GetStringOption(what); strncpy(buf, ((s) ? s : sdef), size); return size; @@ -158,9 +160,10 @@ bool RELDEF::Partitioned(void) /* This function returns string table information. */ /* Default parameter is "*" to get the handler default. */ /***********************************************************************/ -char *RELDEF::GetStringCatInfo(PGLOBAL g, PSZ what, PSZ sdef) +char *RELDEF::GetStringCatInfo(PGLOBAL g, PCSZ what, PCSZ sdef) { - char *name, *sval= NULL, *s= Hc->GetStringOption(what, sdef); + char *sval = NULL; + PCSZ name, s= Hc->GetStringOption(what, sdef); if (s) { if (!Hc->IsPartitioned() || @@ -168,12 +171,12 @@ char *RELDEF::GetStringCatInfo(PGLOBAL g, PSZ what, PSZ sdef) && stricmp(what, "connect"))) sval= PlugDup(g, s); else - sval= s; + sval= (char*)s; } else if (!stricmp(what, "filename")) { // Return default file name - char *ftype= Hc->GetStringOption("Type", "*"); - int i, n; + PCSZ ftype= Hc->GetStringOption("Type", "*"); + int i, n; if (IsFileType(GetTypeID(ftype))) { name= Hc->GetPartName(); @@ -225,10 +228,10 @@ bool TABDEF::Define(PGLOBAL g, PCATLG cat, { int poff = 0; - Name = (PSZ)name; - Schema = (PSZ)schema; + Hc = ((MYCAT*)cat)->GetHandler(); + Name = (PSZ)name; + Schema = (PSZ)Hc->GetDBName(schema); Cat = cat; - Hc = ((MYCAT*)cat)->GetHandler(); Catfunc = GetFuncID(GetStringCatInfo(g, "Catfunc", NULL)); Elemt = GetIntCatInfo("Elements", 0); Multiple = GetIntCatInfo("Multiple", 0); @@ -251,9 +254,9 @@ bool TABDEF::Define(PGLOBAL g, PCATLG cat, /***********************************************************************/ /* This function returns the database data path. */ /***********************************************************************/ -PSZ TABDEF::GetPath(void) +PCSZ TABDEF::GetPath(void) { - return (Database) ? (PSZ)Database : (Hc) ? Hc->GetDataPath() : NULL; + return (Database) ? Database : (Hc) ? Hc->GetDataPath() : NULL; } // end of GetPath /***********************************************************************/ @@ -277,8 +280,13 @@ int TABDEF::GetColCatInfo(PGLOBAL g) // Take care of the column definitions i= poff= nof= nlg= 0; +#if defined(__WIN__) // Offsets of HTML and DIR tables start from 0, DBF at 1 - loff= (tc == TAB_DBF) ? 1 : (tc == TAB_XML || tc == TAB_DIR) ? -1 : 0; + loff= (tc == TAB_DBF) ? 1 : (tc == TAB_XML || tc == TAB_DIR) ? -1 : 0; +#else // !__WIN__ + // Offsets of HTML tables start from 0, DIR and DBF at 1 + loff = (tc == TAB_DBF || tc == TAB_DIR) ? 1 : (tc == TAB_XML) ? -1 : 0; +#endif // !__WIN__ while (true) { // Default Offset depends on table type @@ -540,7 +548,7 @@ PTABDEF OEMDEF::GetXdef(PGLOBAL g) #endif // 0 // Is the library already loaded? - if (!Hdll) + if (!Hdll && !(Hdll = dlopen(soname, RTLD_NOLOAD))) // Load the desired shared library if (!(Hdll = dlopen(soname, RTLD_LAZY))) { error = dlerror(); @@ -610,9 +618,10 @@ bool OEMDEF::DefineAM(PGLOBAL g, LPCSTR, int) if (!*Module) Module = Subtype; - Desc = (char*)PlugSubAlloc(g, NULL, strlen(Module) - + strlen(Subtype) + 3); - sprintf(Desc, "%s(%s)", Module, Subtype); + char *desc = (char*)PlugSubAlloc(g, NULL, strlen(Module) + + strlen(Subtype) + 3); + sprintf(desc, "%s(%s)", Module, Subtype); + Desc = desc; return false; } // end of DefineAM diff --git a/storage/connect/reldef.h b/storage/connect/reldef.h index 52a131dbf3d..8b19a413ade 100644 --- a/storage/connect/reldef.h +++ b/storage/connect/reldef.h @@ -42,13 +42,13 @@ class DllExport RELDEF : public BLOCK { // Relation definition block // Methods PTOS GetTopt(void); - bool GetBoolCatInfo(PSZ what, bool bdef); - bool SetIntCatInfo(PSZ what, int ival); + bool GetBoolCatInfo(PCSZ what, bool bdef); + bool SetIntCatInfo(PCSZ what, int ival); bool Partitioned(void); - int GetIntCatInfo(PSZ what, int idef); - int GetSizeCatInfo(PSZ what, PSZ sdef); - int GetCharCatInfo(PSZ what, PSZ sdef, char *buf, int size); - char *GetStringCatInfo(PGLOBAL g, PSZ what, PSZ sdef); + int GetIntCatInfo(PCSZ what, int idef); + int GetSizeCatInfo(PCSZ what, PCSZ sdef); + int GetCharCatInfo(PCSZ what, PCSZ sdef, char *buf, int size); + char *GetStringCatInfo(PGLOBAL g, PCSZ what, PCSZ sdef); virtual int Indexable(void) {return 0;} virtual bool Define(PGLOBAL g, PCATLG cat, LPCSTR name, LPCSTR schema, LPCSTR am) = 0; @@ -84,7 +84,7 @@ public: void SetNext(PTABDEF tdfp) {Next = tdfp;} int GetMultiple(void) {return Multiple;} int GetPseudo(void) {return Pseudo;} - PSZ GetPath(void); + PCSZ GetPath(void); //PSZ GetPath(void) // {return (Database) ? (PSZ)Database : Cat->GetDataPath();} bool SepIndex(void) {return GetBoolCatInfo("SepIndex", false);} @@ -105,8 +105,8 @@ public: protected: // Members - PSZ Schema; /* Table schema (for ODBC) */ - PSZ Desc; /* Table description */ + PCSZ Schema; /* Table schema (for ODBC) */ + PCSZ Desc; /* Table description */ uint Catfunc; /* Catalog function ID */ int Card; /* (max) number of rows in table */ int Elemt; /* Number of rows in blocks or rowset */ diff --git a/storage/connect/tabcmg.cpp b/storage/connect/tabcmg.cpp new file mode 100644 index 00000000000..da1cfd34ac7 --- /dev/null +++ b/storage/connect/tabcmg.cpp @@ -0,0 +1,464 @@ +/************** tabcmg C++ Program Source Code File (.CPP) *************/ +/* PROGRAM NAME: tabcmg Version 1.1 */ +/* (C) Copyright to the author Olivier BERTRAND 2017 */ +/* This program are the C MongoDB class DB execution routines. */ +/***********************************************************************/ + +/***********************************************************************/ +/* Include relevant sections of the MariaDB header file. */ +/***********************************************************************/ +#include + +/***********************************************************************/ +/* Include application header files: */ +/* global.h is header containing all global declarations. */ +/* plgdbsem.h is header containing the DB application declarations. */ +/* tdbdos.h is header containing the TDBDOS declarations. */ +/* json.h is header containing the JSON classes declarations. */ +/***********************************************************************/ +#include "global.h" +#include "plgdbsem.h" +#include "xtable.h" +#include "maputil.h" +#include "filamtxt.h" +#include "tabext.h" +#include "tabcmg.h" +#include "tabmul.h" +#include "filter.h" + +/* -------------------------- Class CMGDISC -------------------------- */ + +/***********************************************************************/ +/* Get document. */ +/***********************************************************************/ +void CMGDISC::GetDoc(void) +{ + doc = ((TDBCMG*)tmgp)->Cmgp->Document; +} // end of GetDoc + +/***********************************************************************/ +/* Analyse passed document. */ +/***********************************************************************/ +//bool CMGDISC::Find(PGLOBAL g, int i, int k, bool b) +bool CMGDISC::Find(PGLOBAL g) +{ + return FindInDoc(g, &iter, doc, NULL, NULL, 0, false); +} // end of Find + +/***********************************************************************/ +/* Analyse passed document. */ +/***********************************************************************/ +bool CMGDISC::FindInDoc(PGLOBAL g, bson_iter_t *iter, const bson_t *doc, + char *pcn, char *pfmt, int k, bool b) +{ + if (!doc || bson_iter_init(iter, doc)) { + const char *key; + char colname[65]; + char fmt[129]; + bool newcol; + + while (bson_iter_next(iter)) { + key = bson_iter_key(iter); + newcol = true; + + if (pcn) { + strncpy(colname, pcn, 64); + colname[64] = 0; + strncat(strncat(colname, "_", 65), key, 65); + } else + strcpy(colname, key); + + if (pfmt) { + strncpy(fmt, pfmt, 128); + fmt[128] = 0; + strncat(strncat(fmt, ".", 129), key, 129); + } else + strcpy(fmt, key); + + bcol.Cbn = false; + + if (BSON_ITER_HOLDS_UTF8(iter)) { + bcol.Type = TYPE_STRING; + bcol.Len = strlen(bson_iter_utf8(iter, NULL)); + } else if (BSON_ITER_HOLDS_INT32(iter)) { + bcol.Type = TYPE_INT; + bcol.Len = 11; // bson_iter_int32(iter) + } else if (BSON_ITER_HOLDS_INT64(iter)) { + bcol.Type = TYPE_BIGINT; + bcol.Len = 22; // bson_iter_int64(iter) + } else if (BSON_ITER_HOLDS_DOUBLE(iter)) { + bcol.Type = TYPE_DOUBLE; + bcol.Len = 12; + bcol.Scale = 6; // bson_iter_double(iter) + } else if (BSON_ITER_HOLDS_DATE_TIME(iter)) { + bcol.Type = TYPE_DATE; + bcol.Len = 19; // bson_iter_date_time(iter) + } else if (BSON_ITER_HOLDS_BOOL(iter)) { + bcol.Type = TYPE_TINY; + bcol.Len = 1; + } else if (BSON_ITER_HOLDS_OID(iter)) { + bcol.Type = TYPE_STRING; + bcol.Len = 24; // bson_iter_oid(iter) + } else if (BSON_ITER_HOLDS_DECIMAL128(iter)) { + bcol.Type = TYPE_DECIM; + bcol.Len = 32; // bson_iter_decimal128(iter, &dec) + } else if (BSON_ITER_HOLDS_DOCUMENT(iter)) { + if (lvl < 0) + continue; + else if (lvl <= k) { + bcol.Type = TYPE_STRING; + bcol.Len = 512; + } else { + bson_iter_t child; + + if (bson_iter_recurse(iter, &child)) + if (FindInDoc(g, &child, NULL, colname, fmt, k + 1, false)) + return true; + + newcol = false; + } // endif lvl + + } else if (BSON_ITER_HOLDS_ARRAY(iter)) { + if (lvl < 0) + continue; + else if (lvl <= k) { + bcol.Type = TYPE_STRING; + bcol.Len = 512; + } else { + bson_t *arr; + bson_iter_t itar; + const uint8_t *data = NULL; + uint32_t len = 0; + + bson_iter_array(iter, &len, &data); + arr = bson_new_from_data(data, len); + + if (FindInDoc(g, &itar, arr, colname, fmt, k + 1, !all)) + return true; + + newcol = false; + } // endif lvl + + } // endif's + + if (newcol) + AddColumn(g, colname, fmt, k); + + if (b) + break; // Test only first element of arrays + + } // endwhile iter + + } // endif doc + + return false; +} // end of FindInDoc + +/* --------------------------- Class TDBCMG -------------------------- */ + +/***********************************************************************/ +/* Implementation of the TDBCMG class. */ +/***********************************************************************/ +TDBCMG::TDBCMG(MGODEF *tdp) : TDBEXT(tdp) +{ + Cmgp = NULL; + Cnd = NULL; + Pcg.Tdbp = this; + + if (tdp) { + Pcg.Uristr = tdp->Uri; + Pcg.Db_name = tdp->Tabschema; + Pcg.Coll_name = tdp->Tabname; + Pcg.Options = tdp->Colist; + Pcg.Filter = tdp->Filter; + Pcg.Pipe = tdp->Pipe && tdp->Colist != NULL; + B = tdp->Base ? 1 : 0; + } else { + Pcg.Uristr = NULL; + Pcg.Db_name = NULL; + Pcg.Coll_name = NULL; + Pcg.Options = NULL; + Pcg.Filter = NULL; + Pcg.Pipe = false; + B = 0; + } // endif tdp + + Fpos = -1; + N = 0; + Done = false; +} // end of TDBCMG standard constructor + +TDBCMG::TDBCMG(TDBCMG *tdbp) : TDBEXT(tdbp) +{ + Cmgp = tdbp->Cmgp; + Cnd = tdbp->Cnd; + Pcg = tdbp->Pcg; + B = tdbp->B; + Fpos = tdbp->Fpos; + N = tdbp->N; + Done = tdbp->Done; +} // end of TDBCMG copy constructor + +// Used for update +PTDB TDBCMG::Clone(PTABS t) +{ + PTDB tp; + PMGOCOL cp1, cp2; + PGLOBAL g = t->G; + + tp = new(g) TDBCMG(this); + + for (cp1 = (PMGOCOL)Columns; cp1; cp1 = (PMGOCOL)cp1->GetNext()) + if (!cp1->IsSpecial()) { + cp2 = new(g) MGOCOL(cp1, tp); // Make a copy + NewPointer(t, cp1, cp2); + } // endif cp1 + + return tp; +} // end of Clone + +/***********************************************************************/ +/* Allocate JSN column description block. */ +/***********************************************************************/ +PCOL TDBCMG::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) +{ + PMGOCOL colp = new(g) MGOCOL(g, cdp, this, cprec, n); + + return colp; +} // end of MakeCol + +/***********************************************************************/ +/* InsertSpecialColumn: Put a special column ahead of the column list.*/ +/***********************************************************************/ +PCOL TDBCMG::InsertSpecialColumn(PCOL colp) +{ + if (!colp->IsSpecial()) + return NULL; + + colp->SetNext(Columns); + Columns = colp; + return colp; +} // end of InsertSpecialColumn + +/***********************************************************************/ +/* Init: initialize MongoDB processing. */ +/***********************************************************************/ +bool TDBCMG::Init(PGLOBAL g) +{ + if (Done) + return false; + + /*********************************************************************/ + /* Open an C connection for this table. */ + /*********************************************************************/ + if (!Cmgp) + Cmgp = new(g) CMgoConn(g, &Pcg); + else if (Cmgp->IsConnected()) + Cmgp->Close(); + + if (Cmgp->Connect(g)) + return true; + + Done = true; + return false; +} // end of Init + +/***********************************************************************/ +/* MONGO Cardinality: returns table size in number of rows. */ +/***********************************************************************/ +int TDBCMG::Cardinality(PGLOBAL g) +{ + if (!g) + return 1; + else if (Cardinal < 0) + Cardinal = (!Init(g)) ? Cmgp->CollSize(g) : 0; + + return Cardinal; +} // end of Cardinality + +/***********************************************************************/ +/* MONGO GetMaxSize: returns collection size estimate. */ +/***********************************************************************/ +int TDBCMG::GetMaxSize(PGLOBAL g) +{ + if (MaxSize < 0) + MaxSize = Cardinality(g); + + return MaxSize; +} // end of GetMaxSize + +/***********************************************************************/ +/* OpenDB: Data Base open routine for MONGO access method. */ +/***********************************************************************/ +bool TDBCMG::OpenDB(PGLOBAL g) +{ + if (Use == USE_OPEN) { + /*******************************************************************/ + /* Table already open replace it at its beginning. */ + /*******************************************************************/ + Cmgp->Rewind(); + Fpos = -1; + return false; + } // endif Use + + /*********************************************************************/ + /* First opening. */ + /*********************************************************************/ + if (Pcg.Pipe && Mode != MODE_READ) { + strcpy(g->Message, "Pipeline tables are read only"); + return true; + } // endif Pipe + + Use = USE_OPEN; // Do it now in case we are recursively called + + if (Init(g)) + return true; + + if (Mode == MODE_DELETE && !Next) + // Delete all documents + return Cmgp->DocDelete(g); + else if (Mode == MODE_INSERT) + Cmgp->MakeColumnGroups(g); + + return false; +} // end of OpenDB + +/***********************************************************************/ +/* Data Base indexed read routine for ODBC access method. */ +/***********************************************************************/ +bool TDBCMG::ReadKey(PGLOBAL g, OPVAL op, const key_range *kr) +{ + strcpy(g->Message, "MONGO tables are not indexable"); + return true; +} // end of ReadKey + +/***********************************************************************/ +/* ReadDB: Get next document from a collection. */ +/***********************************************************************/ +int TDBCMG::ReadDB(PGLOBAL g) +{ + return Cmgp->ReadNext(g); +} // end of ReadDB + +/***********************************************************************/ +/* WriteDB: Data Base write routine for MGO access method. */ +/***********************************************************************/ +int TDBCMG::WriteDB(PGLOBAL g) +{ + return Cmgp->Write(g); +} // end of WriteDB + +/***********************************************************************/ +/* Data Base delete line routine for MGO access method. */ +/***********************************************************************/ +int TDBCMG::DeleteDB(PGLOBAL g, int irc) +{ + return (irc == RC_OK) ? WriteDB(g) : RC_OK; +} // end of DeleteDB + +/***********************************************************************/ +/* Table close routine for MONGO tables. */ +/***********************************************************************/ +void TDBCMG::CloseDB(PGLOBAL g) +{ + Cmgp->Close(); + Done = false; +} // end of CloseDB + +/* ----------------------------- MGOCOL ------------------------------ */ + +/***********************************************************************/ +/* MGOCOL public constructor. */ +/***********************************************************************/ +MGOCOL::MGOCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i) + : EXTCOL(cdp, tdbp, cprec, i, "MGO") +{ + Tmgp = (PTDBCMG)(tdbp->GetOrig() ? tdbp->GetOrig() : tdbp); + Jpath = cdp->GetFmt() ? cdp->GetFmt() : cdp->GetName(); +} // end of MGOCOL constructor + +/***********************************************************************/ +/* MGOCOL constructor used for copying columns. */ +/* tdbp is the pointer to the new table descriptor. */ +/***********************************************************************/ +MGOCOL::MGOCOL(MGOCOL *col1, PTDB tdbp) : EXTCOL(col1, tdbp) +{ + Tmgp = col1->Tmgp; + Jpath = col1->Jpath; +} // end of MGOCOL copy constructor + +/***********************************************************************/ +/* Get path when proj is false or projection path when proj is true. */ +/***********************************************************************/ +PSZ MGOCOL::GetJpath(PGLOBAL g, bool proj) +{ + if (Jpath) { + if (proj) { + char *p1, *p2, *projpath = PlugDup(g, Jpath); + int i = 0; + + for (p1 = p2 = projpath; *p1; p1++) + if (*p1 == '.') { + if (!i) + *p2++ = *p1; + + i = 1; + } else if (i) { + if (!isdigit(*p1)) { + *p2++ = *p1; + i = 0; + } // endif p1 + + } else + *p2++ = *p1; + + *p2 = 0; + return projpath; + } else + return Jpath; + + } else + return Name; + +} // end of GetJpath + +/***********************************************************************/ +/* ReadColumn: */ +/***********************************************************************/ +void MGOCOL::ReadColumn(PGLOBAL g) +{ + Tmgp->Cmgp->GetColumnValue(g, this); +} // end of ReadColumn + +/***********************************************************************/ +/* WriteColumn: */ +/***********************************************************************/ +void MGOCOL::WriteColumn(PGLOBAL g) +{ + // Check whether this node must be written + if (Value != To_Val) + Value->SetValue_pval(To_Val, FALSE); // Convert the updated value + +} // end of WriteColumn + +/* ---------------------------TDBGOL class --------------------------- */ + +/***********************************************************************/ +/* TDBGOL class constructor. */ +/***********************************************************************/ +TDBGOL::TDBGOL(PMGODEF tdp) : TDBCAT(tdp) +{ + Topt = tdp->GetTopt(); + Uri = tdp->Uri; + Db = tdp->GetTabschema(); +} // end of TDBJCL constructor + +/***********************************************************************/ +/* GetResult: Get the list the JSON file columns. */ +/***********************************************************************/ +PQRYRES TDBGOL::GetResult(PGLOBAL g) +{ + return MGOColumns(g, Db, Uri, Topt, false); +} // end of GetResult + +/* -------------------------- End of mongo --------------------------- */ diff --git a/storage/connect/tabcmg.h b/storage/connect/tabcmg.h new file mode 100644 index 00000000000..260f2def8a2 --- /dev/null +++ b/storage/connect/tabcmg.h @@ -0,0 +1,130 @@ +/**************** tabcmg H Declares Source Code File (.H) **************/ +/* Name: tabcmg.h Version 1.2 */ +/* */ +/* (C) Copyright to the author Olivier BERTRAND 2017 */ +/* */ +/* This file contains the MongoDB classes declares. */ +/***********************************************************************/ +#include "mongo.h" +#include "cmgoconn.h" + +/***********************************************************************/ +/* Class used to get the columns of a mongo collection. */ +/***********************************************************************/ +class CMGDISC : public MGODISC { +public: + // Constructor + CMGDISC(PGLOBAL g, int *lg) : MGODISC(g, lg) { drv = "C"; } + + // Methods + virtual void GetDoc(void); +//virtual bool Find(PGLOBAL g, int i, int k, bool b); + virtual bool Find(PGLOBAL g); + + // BSON Function +//bool FindInDoc(PGLOBAL g, bson_iter_t *iter, const bson_t *doc, +// char *pcn, char *pfmt, int i, int k, bool b); + bool FindInDoc(PGLOBAL g, bson_iter_t *iter, const bson_t *doc, + char *pcn, char *pfmt, int k, bool b); + + // Members + bson_iter_t iter; + const bson_t *doc; +}; // end of CMGDISC + +/* -------------------------- TDBCMG class --------------------------- */ + +/***********************************************************************/ +/* This is the MongoDB Table Type class declaration. */ +/* The table is a collection, each record being a document. */ +/***********************************************************************/ +class DllExport TDBCMG : public TDBEXT { + friend class MGOCOL; + friend class MGODEF; + friend class CMGDISC; + friend PQRYRES MGOColumns(PGLOBAL, PCSZ, PCSZ, PTOS, bool); +public: + // Constructor + TDBCMG(MGODEF *tdp); + TDBCMG(TDBCMG *tdbp); + + // Implementation + virtual AMT GetAmType(void) {return TYPE_AM_MGO;} + virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBCMG(this);} + + // Methods + virtual PTDB Clone(PTABS t); + virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); + virtual PCOL InsertSpecialColumn(PCOL colp); + virtual int RowNumber(PGLOBAL g, bool b = FALSE) {return N;} + + // Database routines + virtual int Cardinality(PGLOBAL g); + virtual int GetMaxSize(PGLOBAL g); + virtual bool OpenDB(PGLOBAL g); + virtual int ReadDB(PGLOBAL g); + virtual int WriteDB(PGLOBAL g); + virtual int DeleteDB(PGLOBAL g, int irc); + virtual void CloseDB(PGLOBAL g); + virtual bool ReadKey(PGLOBAL g, OPVAL op, const key_range *kr); + +protected: + bool Init(PGLOBAL g); + + // Members + CMgoConn *Cmgp; // Points to a C Mongo connection class + CMGOPARM Pcg; // Parms passed to Cmgp + const Item *Cnd; // The first condition + int Fpos; // The current row index + int N; // The current Rownum + int B; // Array index base + bool Done; // Init done +}; // end of class TDBCMG + +/* --------------------------- MGOCOL class -------------------------- */ + +/***********************************************************************/ +/* Class MGOCOL: MongoDB access method column descriptor. */ +/***********************************************************************/ +class DllExport MGOCOL : public EXTCOL { + friend class TDBCMG; + friend class FILTER; +public: + // Constructors + MGOCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i); + MGOCOL(MGOCOL *colp, PTDB tdbp); // Constructor used in copy process + + // Implementation + virtual int GetAmType(void) { return Tmgp->GetAmType(); } + + // Methods + virtual PSZ GetJpath(PGLOBAL g, bool proj); + virtual void ReadColumn(PGLOBAL g); + virtual void WriteColumn(PGLOBAL g); + +protected: + // Default constructor not to be used + MGOCOL(void) {} + + // Members + TDBCMG *Tmgp; // To the MGO table block + char *Jpath; // The json path +}; // end of class MGOCOL + +/***********************************************************************/ +/* This is the class declaration for the MONGO catalog table. */ +/***********************************************************************/ +class DllExport TDBGOL : public TDBCAT { +public: + // Constructor + TDBGOL(PMGODEF tdp); + +protected: + // Specific routines + virtual PQRYRES GetResult(PGLOBAL g); + + // Members + PTOS Topt; + PCSZ Uri; + PCSZ Db; +}; // end of class TDBGOL diff --git a/storage/connect/tabcol.cpp b/storage/connect/tabcol.cpp index fde1baa6317..5065d86ce6a 100644 --- a/storage/connect/tabcol.cpp +++ b/storage/connect/tabcol.cpp @@ -73,7 +73,7 @@ PTABLE XTAB::Link(PTABLE tab2) /***********************************************************************/ /* Make file output of XTAB contents. */ /***********************************************************************/ -void XTAB::Print(PGLOBAL g, FILE *f, uint n) +void XTAB::Printf(PGLOBAL g, FILE *f, uint n) { char m[64]; @@ -86,12 +86,12 @@ void XTAB::Print(PGLOBAL g, FILE *f, uint n) PlugPutOut(g, f, TYPE_TDB, tp->To_Tdb, n + 2); } /* endfor tp */ - } /* end of Print */ + } /* end of Printf */ /***********************************************************************/ /* Make string output of XTAB contents. */ /***********************************************************************/ -void XTAB::Print(PGLOBAL, char *ps, uint z) +void XTAB::Prints(PGLOBAL, char *ps, uint z) { char buf[128]; int i, n = (int)z - 1; @@ -105,7 +105,7 @@ void XTAB::Print(PGLOBAL, char *ps, uint z) n -= i; } // endif tp - } /* end of Print */ + } /* end of Prints */ /***********************************************************************/ @@ -134,7 +134,7 @@ bool COLUMN::SetFormat(PGLOBAL g, FORMAT&) /***********************************************************************/ /* Make file output of COLUMN contents. */ /***********************************************************************/ -void COLUMN::Print(PGLOBAL g, FILE *f, uint n) +void COLUMN::Printf(PGLOBAL g, FILE *f, uint n) { char m[64]; @@ -149,12 +149,12 @@ void COLUMN::Print(PGLOBAL g, FILE *f, uint n) PlugPutOut(g, f, TYPE_TABLE, To_Table, n + 2); PlugPutOut(g, f, TYPE_XOBJECT, To_Col, n + 2); - } /* end of Print */ + } /* end of Printf */ /***********************************************************************/ /* Make string output of COLUMN contents. */ /***********************************************************************/ -void COLUMN::Print(PGLOBAL, char *ps, uint z) +void COLUMN::Prints(PGLOBAL, char *ps, uint z) { char buf[80]; @@ -166,4 +166,4 @@ void COLUMN::Print(PGLOBAL, char *ps, uint z) strncpy(ps, buf, z); ps[z - 1] = '\0'; - } /* end of Print */ + } /* end of Prints */ diff --git a/storage/connect/tabcol.h b/storage/connect/tabcol.h index 3bfc37e69c1..e4657e2f261 100644 --- a/storage/connect/tabcol.h +++ b/storage/connect/tabcol.h @@ -38,8 +38,8 @@ class DllExport XTAB: public BLOCK { // Table Name-Schema-Srcdef block. // Methods PTABLE Link(PTABLE); - void Print(PGLOBAL g, FILE *f, uint n); - void Print(PGLOBAL g, char *ps, uint z); + void Printf(PGLOBAL g, FILE *f, uint n); + void Prints(PGLOBAL g, char *ps, uint z); protected: // Members @@ -78,8 +78,8 @@ class DllExport COLUMN: public XOBJECT { // Column Name/Qualifier block. void SetTo_Col(PCOL colp) {To_Col = colp;} // Methods - virtual void Print(PGLOBAL g, FILE *f, uint n); - virtual void Print(PGLOBAL g, char *ps, uint z); + virtual void Printf(PGLOBAL g, FILE *f, uint n); + virtual void Prints(PGLOBAL g, char *ps, uint z); // All methods below should never be used for COLUMN's virtual void Reset(void) {assert(false);} virtual bool Compare(PXOB) {assert(false); return false;} diff --git a/storage/connect/tabdos.cpp b/storage/connect/tabdos.cpp index d2bb3d7a4af..3b850cfd258 100644 --- a/storage/connect/tabdos.cpp +++ b/storage/connect/tabdos.cpp @@ -1,11 +1,11 @@ /************* TabDos C++ Program Source Code File (.CPP) **************/ /* PROGRAM NAME: TABDOS */ /* ------------- */ -/* Version 4.9.2 */ +/* Version 4.9.3 */ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 1998-2016 */ +/* (C) Copyright to the author Olivier BERTRAND 1998-2017 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -98,6 +98,7 @@ DOSDEF::DOSDEF(void) Ofn = NULL; Entry = NULL; To_Indx = NULL; + Pwd = NULL; Recfm = RECFM_VAR; Mapped = false; Zipped = false; @@ -131,7 +132,8 @@ bool DOSDEF::DefineAM(PGLOBAL g, LPCSTR am, int) bool map = (am && (*am == 'M' || *am == 'm')); LPCSTR dfm = (am && (*am == 'F' || *am == 'f')) ? "F" : (am && (*am == 'B' || *am == 'b')) ? "B" - : (am && !stricmp(am, "DBF")) ? "D" : "V"; + : (am && (*am == 'X' || *am == 'x')) ? "X" + : (am && !stricmp(am, "DBF")) ? "D" : "V"; if ((Zipped = GetBoolCatInfo("Zipped", false))) { Entry = GetStringCatInfo(g, "Entry", NULL); @@ -139,14 +141,16 @@ bool DOSDEF::DefineAM(PGLOBAL g, LPCSTR am, int) : false; Mulentries = GetBoolCatInfo("Mulentries", Mulentries); Append = GetBoolCatInfo("Append", false); - } + Pwd = GetStringCatInfo(g, "Password", NULL); + } // endif Zipped Desc = Fn = GetStringCatInfo(g, "Filename", NULL); Ofn = GetStringCatInfo(g, "Optname", Fn); GetCharCatInfo("Recfm", (PSZ)dfm, buf, sizeof(buf)); Recfm = (toupper(*buf) == 'F') ? RECFM_FIX : (toupper(*buf) == 'B') ? RECFM_BIN : - (toupper(*buf) == 'D') ? RECFM_DBF : RECFM_VAR; + (toupper(*buf) == 'X') ? RECFM_NAF : // MGO + (toupper(*buf) == 'D') ? RECFM_DBF : RECFM_VAR; Lrecl = GetIntCatInfo("Lrecl", 0); if (Recfm != RECFM_DBF) @@ -180,7 +184,7 @@ bool DOSDEF::DefineAM(PGLOBAL g, LPCSTR am, int) /***********************************************************************/ bool DOSDEF::GetOptFileName(PGLOBAL g, char *filename) { - char *ftype; + PCSZ ftype; switch (Recfm) { case RECFM_VAR: ftype = ".dop"; break; @@ -237,9 +241,9 @@ void DOSDEF::RemoveOptValues(PGLOBAL g) /***********************************************************************/ bool DOSDEF::DeleteIndexFile(PGLOBAL g, PIXDEF pxdf) { - char *ftype; - char filename[_MAX_PATH]; - bool sep, rc = false; + PCSZ ftype; + char filename[_MAX_PATH]; + bool sep, rc = false; if (!To_Indx) return false; // No index @@ -351,7 +355,7 @@ PTDB DOSDEF::GetTable(PGLOBAL g, MODE mode) if (Zipped) { #if defined(ZIP_SUPPORT) if (Recfm == RECFM_VAR) { - if (mode == MODE_READ || mode == MODE_ANY) { + if (mode == MODE_READ || mode == MODE_ANY || mode == MODE_ALTER) { txfp = new(g) UNZFAM(this); } else if (mode == MODE_INSERT) { txfp = new(g) ZIPFAM(this); @@ -362,7 +366,7 @@ PTDB DOSDEF::GetTable(PGLOBAL g, MODE mode) tdbp = new(g) TDBDOS(this, txfp); } else { - if (mode == MODE_READ || mode == MODE_ANY) { + if (mode == MODE_READ || mode == MODE_ANY || mode == MODE_ALTER) { txfp = new(g) UZXFAM(this); } else if (mode == MODE_INSERT) { txfp = new(g) ZPXFAM(this); @@ -1307,6 +1311,7 @@ PBF TDBDOS::InitBlockFilter(PGLOBAL g, PFIL filp) } // endif !opm // if opm, pass thru + // fall through case OP_IN: if (filp->GetArgType(0) == TYPE_COLBLK && filp->GetArgType(1) == TYPE_ARRAY) { @@ -1509,8 +1514,8 @@ PBF TDBDOS::CheckBlockFilari(PGLOBAL g, PXOB *arg, int op, bool *cnv) if (n == 8 && ctype != TYPE_LIST) { // Should never happen strcpy(g->Message, "Block opt: bad constant"); - longjmp(g->jumper[g->jump_level], 99); - } // endif Conv + throw 99; + } // endif Conv if (type[0] == 1) { // Make it always as Column-op-Value @@ -1642,8 +1647,8 @@ int TDBDOS::TestBlock(PGLOBAL g) /***********************************************************************/ int TDBDOS::MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add) { - int k, n; - bool fixed, doit, sep, b = (pxdf != NULL); + int k, n, rc = RC_OK; + bool fixed, doit, sep, b = (pxdf != NULL); PCOL *keycols, colp; PIXDEF xdp, sxp = NULL; PKPDEF kdp; @@ -1687,95 +1692,105 @@ int TDBDOS::MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add) } else if (!(pxdf = dfp->GetIndx())) return RC_INFO; // No index to make - // Allocate all columns that will be used by indexes. - // This must be done before opening the table so specific - // column initialization can be done (in particular by TDBVCT) - for (n = 0, xdp = pxdf; xdp; xdp = xdp->GetNext()) - for (kdp = xdp->GetToKeyParts(); kdp; kdp = kdp->GetNext()) { - if (!(colp = ColDB(g, kdp->GetName(), 0))) { - sprintf(g->Message, MSG(INDX_COL_NOTIN), kdp->GetName(), Name); - goto err; - } else if (colp->GetResultType() == TYPE_DECIM) { - sprintf(g->Message, "Decimal columns are not indexable yet"); - goto err; - } // endif Type + try { + // Allocate all columns that will be used by indexes. + // This must be done before opening the table so specific + // column initialization can be done (in particular by TDBVCT) + for (n = 0, xdp = pxdf; xdp; xdp = xdp->GetNext()) + for (kdp = xdp->GetToKeyParts(); kdp; kdp = kdp->GetNext()) { + if (!(colp = ColDB(g, kdp->GetName(), 0))) { + sprintf(g->Message, MSG(INDX_COL_NOTIN), kdp->GetName(), Name); + goto err; + } else if (colp->GetResultType() == TYPE_DECIM) { + sprintf(g->Message, "Decimal columns are not indexable yet"); + goto err; + } // endif Type - colp->InitValue(g); - n = MY_MAX(n, xdp->GetNparts()); - } // endfor kdp + colp->InitValue(g); + n = MY_MAX(n, xdp->GetNparts()); + } // endfor kdp - keycols = (PCOL*)PlugSubAlloc(g, NULL, n * sizeof(PCOL)); - sep = dfp->GetBoolCatInfo("SepIndex", false); + keycols = (PCOL*)PlugSubAlloc(g, NULL, n * sizeof(PCOL)); + sep = dfp->GetBoolCatInfo("SepIndex", false); - /*********************************************************************/ - /* Construct and save the defined indexes. */ - /*********************************************************************/ - for (xdp = pxdf; xdp; xdp = xdp->GetNext()) - if (!OpenDB(g)) { - if (xdp->IsAuto() && fixed) - // Auto increment key and fixed file: use an XXROW index - continue; // XXROW index doesn't need to be made + /*********************************************************************/ + /* Construct and save the defined indexes. */ + /*********************************************************************/ + for (xdp = pxdf; xdp; xdp = xdp->GetNext()) + if (!OpenDB(g)) { + if (xdp->IsAuto() && fixed) + // Auto increment key and fixed file: use an XXROW index + continue; // XXROW index doesn't need to be made - // On Update, redo only indexes that are modified - doit = !To_SetCols; - n = 0; + // On Update, redo only indexes that are modified + doit = !To_SetCols; + n = 0; - if (sxp) - xdp->SetID(sxp->GetID() + 1); + if (sxp) + xdp->SetID(sxp->GetID() + 1); - for (kdp = xdp->GetToKeyParts(); kdp; kdp = kdp->GetNext()) { - // Check whether this column was updated - for (colp = To_SetCols; !doit && colp; colp = colp->GetNext()) - if (!stricmp(kdp->GetName(), colp->GetName())) - doit = true; + for (kdp = xdp->GetToKeyParts(); kdp; kdp = kdp->GetNext()) { + // Check whether this column was updated + for (colp = To_SetCols; !doit && colp; colp = colp->GetNext()) + if (!stricmp(kdp->GetName(), colp->GetName())) + doit = true; - keycols[n++] = ColDB(g, kdp->GetName(), 0); - } // endfor kdp + keycols[n++] = ColDB(g, kdp->GetName(), 0); + } // endfor kdp - // If no indexed columns were updated, don't remake the index - // if indexes are in separate files. - if (!doit && sep) - continue; + // If no indexed columns were updated, don't remake the index + // if indexes are in separate files. + if (!doit && sep) + continue; - k = xdp->GetNparts(); + k = xdp->GetNparts(); - // Make the index and save it - if (dfp->Huge) - pxp = new(g) XHUGE; - else - pxp = new(g) XFILE; + // Make the index and save it + if (dfp->Huge) + pxp = new(g) XHUGE; + else + pxp = new(g) XFILE; - if (k == 1) // Simple index - x = new(g) XINDXS(this, xdp, pxp, keycols); - else // Multi-Column index - x = new(g) XINDEX(this, xdp, pxp, keycols); + if (k == 1) // Simple index + x = new(g) XINDXS(this, xdp, pxp, keycols); + else // Multi-Column index + x = new(g) XINDEX(this, xdp, pxp, keycols); - if (!x->Make(g, sxp)) { - // Retreive define values from the index - xdp->SetMaxSame(x->GetMaxSame()); -// xdp->SetSize(x->GetSize()); + if (!x->Make(g, sxp)) { + // Retreive define values from the index + xdp->SetMaxSame(x->GetMaxSame()); + // xdp->SetSize(x->GetSize()); - // store KXYCOL Mxs in KPARTDEF Mxsame - xdp->SetMxsame(x); + // store KXYCOL Mxs in KPARTDEF Mxsame + xdp->SetMxsame(x); #if defined(TRACE) - printf("Make done...\n"); + printf("Make done...\n"); #endif // TRACE -// if (x->GetSize() > 0) - sxp = xdp; + // if (x->GetSize() > 0) + sxp = xdp; - xdp->SetInvalid(false); - } else - goto err; + xdp->SetInvalid(false); + } else + goto err; - } else - return RC_INFO; // Error or Physical table does not exist + } else + return RC_INFO; // Error or Physical table does not exist - if (Use == USE_OPEN) + } catch (int n) { + if (trace) + htrc("Exception %d: %s\n", n, g->Message); + rc = RC_FX; + } catch (const char *msg) { + strcpy(g->Message, msg); + rc = RC_FX; + } // end catch + + if (Use == USE_OPEN) CloseDB(g); - return RC_OK; + return rc; err: if (sxp) @@ -1790,8 +1805,8 @@ err: /* Make a dynamic index. */ /***********************************************************************/ bool TDBDOS::InitialyzeIndex(PGLOBAL g, volatile PIXDEF xdp, bool sorted) - { - int k, rc; +{ + int k; volatile bool dynamic; bool brc; PCOL colp; @@ -1861,13 +1876,7 @@ bool TDBDOS::InitialyzeIndex(PGLOBAL g, volatile PIXDEF xdp, bool sorted) } else // Column contains same values as ROWID kxp = new(g) XXROW(this); - // Prepare error return - if (g->jump_level == MAX_JUMP) { - strcpy(g->Message, MSG(TOO_MANY_JUMPS)); - return true; - } // endif - - if (!(rc = setjmp(g->jumper[++g->jump_level])) != 0) { + try { if (dynamic) { ResetBlockFilter(g); kxp->SetDynamic(dynamic); @@ -1892,12 +1901,17 @@ bool TDBDOS::InitialyzeIndex(PGLOBAL g, volatile PIXDEF xdp, bool sorted) } // endif brc - } else - brc = true; + } catch (int n) { + if (trace) + htrc("Exception %d: %s\n", n, g->Message); + brc = true; + } catch (const char *msg) { + strcpy(g->Message, msg); + brc = true; + } // end catch - g->jump_level--; - return brc; - } // end of InitialyzeIndex + return brc; +} // end of InitialyzeIndex /***********************************************************************/ /* DOS GetProgMax: get the max value for progress information. */ @@ -2118,7 +2132,8 @@ bool TDBDOS::OpenDB(PGLOBAL g) return false; } // endif use - if (Mode == MODE_DELETE && !Next && Txfp->GetAmType() != TYPE_AM_DOS) { + if (Mode == MODE_DELETE && !Next && Txfp->GetAmType() != TYPE_AM_DOS + && Txfp->GetAmType() != TYPE_AM_MGO) { // Delete all lines. Not handled in MAP or block mode Txfp = new(g) DOSFAM((PDOSDEF)To_Def); Txfp->SetTdbp(this); @@ -2156,16 +2171,18 @@ bool TDBDOS::OpenDB(PGLOBAL g) To_BlkFil = InitBlockFilter(g, To_Filter); /*********************************************************************/ - /* Allocate the line buffer plus a null character. */ - /*********************************************************************/ - To_Line = (char*)PlugSubAlloc(g, NULL, Lrecl + 1); + /* Lrecl does not include line ending */ + /*********************************************************************/ + size_t linelen = Lrecl + ((PDOSDEF)To_Def)->Ending + 1; + + To_Line = (char*)PlugSubAlloc(g, NULL, linelen); if (Mode == MODE_INSERT) { // Spaces between fields must be filled with blanks memset(To_Line, ' ', Lrecl); To_Line[Lrecl] = '\0'; } else - memset(To_Line, 0, Lrecl + 1); + memset(To_Line, 0, linelen); if (trace) htrc("OpenDos: R%hd mode=%d To_Line=%p\n", Tdb_No, Mode, To_Line); @@ -2304,8 +2321,8 @@ void TDBDOS::CloseDB(PGLOBAL g) /***********************************************************************/ /* DOSCOL public constructor (also called by MAPCOL). */ /***********************************************************************/ -DOSCOL::DOSCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PSZ am) - : COLBLK(cdp, tp, i) +DOSCOL::DOSCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PCSZ am) + : COLBLK(cdp, tp, i) { char *p; int prec = Format.Prec; @@ -2335,7 +2352,7 @@ DOSCOL::DOSCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PSZ am) Dval = NULL; Buf = NULL; - if (txfp->Blocked && Opt && (cdp->GetMin() || cdp->GetDval())) { + if (txfp && txfp->Blocked && Opt && (cdp->GetMin() || cdp->GetDval())) { int nblk = txfp->GetBlock(); Clustered = (cdp->GetXdb2()) ? 2 : 1; @@ -2514,8 +2531,8 @@ void DOSCOL::ReadColumn(PGLOBAL g) if (rc == RC_EF) sprintf(g->Message, MSG(INV_DEF_READ), rc); - longjmp(g->jumper[g->jump_level], 11); - } // endif + throw 11; + } // endif p = tdbp->To_Line + Deplac; field = Long; @@ -2570,8 +2587,8 @@ void DOSCOL::ReadColumn(PGLOBAL g) break; default: sprintf(g->Message, MSG(BAD_RECFM), tdbp->Ftype); - longjmp(g->jumper[g->jump_level], 34); - } // endswitch Ftype + throw 34; + } // endswitch Ftype // Set null when applicable if (Nullable) @@ -2679,8 +2696,8 @@ void DOSCOL::WriteColumn(PGLOBAL g) break; default: sprintf(g->Message, "Invalid field format for column %s", Name); - longjmp(g->jumper[g->jump_level], 31); - } // endswitch BufType + throw 31; + } // endswitch BufType p2 = Buf; } else // Standard CONNECT format @@ -2691,8 +2708,8 @@ void DOSCOL::WriteColumn(PGLOBAL g) if ((len = strlen(p2)) > field) { sprintf(g->Message, MSG(VALUE_TOO_LONG), p2, Name, field); - longjmp(g->jumper[g->jump_level], 31); - } else if (Dsp) + throw 31; + } else if (Dsp) for (i = 0; i < len; i++) if (p2[i] == '.') p2[i] = Dsp; @@ -2720,7 +2737,7 @@ void DOSCOL::WriteColumn(PGLOBAL g) if (Value->GetBinValue(p, Long, Status)) { sprintf(g->Message, MSG(BIN_F_TOO_LONG), Name, Value->GetSize(), Long); - longjmp(g->jumper[g->jump_level], 31); + throw 31; } // endif } // end of WriteColumn @@ -2863,13 +2880,4 @@ bool DOSCOL::AddDistinctValue(PGLOBAL g) return false; } // end of AddDistinctValue -/***********************************************************************/ -/* Make file output of a Dos column descriptor block. */ -/***********************************************************************/ -void DOSCOL::Print(PGLOBAL g, FILE *f, uint n) - { - COLBLK::Print(g, f, n); - } // end of Print - /* ------------------------------------------------------------------- */ - diff --git a/storage/connect/tabdos.h b/storage/connect/tabdos.h index 922d52ee399..948b357dc1f 100644 --- a/storage/connect/tabdos.h +++ b/storage/connect/tabdos.h @@ -39,9 +39,9 @@ class DllExport DOSDEF : public TABDEF { /* Logical table description */ virtual PIXDEF GetIndx(void) {return To_Indx;} virtual void SetIndx(PIXDEF xdp) {To_Indx = xdp;} virtual bool IsHuge(void) {return Huge;} - PSZ GetFn(void) {return Fn;} - PSZ GetOfn(void) {return Ofn;} - PSZ GetEntry(void) {return Entry;} + PCSZ GetFn(void) {return Fn;} + PCSZ GetOfn(void) {return Ofn;} + PCSZ GetEntry(void) {return Entry;} bool GetMul(void) {return Mulentries;} bool GetAppend(void) {return Append;} void SetBlock(int block) { Block = block; } @@ -74,9 +74,10 @@ class DllExport DOSDEF : public TABDEF { /* Logical table description */ //virtual bool Erase(char *filename); // Members - PSZ Fn; /* Path/Name of corresponding file */ - PSZ Ofn; /* Base Path/Name of matching index files*/ - PSZ Entry; /* Zip entry name or pattern */ + PCSZ Fn; /* Path/Name of corresponding file */ + PCSZ Ofn; /* Base Path/Name of matching index files*/ + PCSZ Entry; /* Zip entry name or pattern */ + PCSZ Pwd; /* Zip password */ PIXDEF To_Indx; /* To index definitions blocks */ RECFM Recfm; /* 0:VAR, 1:FIX, 2:BIN, 3:VCT, 6:DBF */ bool Mapped; /* 0: disk file, 1: memory mapped file */ @@ -132,8 +133,8 @@ class DllExport TDBDOS : public TDBASE { // Implementation virtual AMT GetAmType(void) {return Txfp->GetAmType();} - virtual PSZ GetFile(PGLOBAL) {return Txfp->To_File;} - virtual void SetFile(PGLOBAL, PSZ fn) {Txfp->To_File = fn;} + virtual PCSZ GetFile(PGLOBAL) {return Txfp->To_File;} + virtual void SetFile(PGLOBAL, PCSZ fn) {Txfp->To_File = fn;} virtual void SetAbort(bool b) {Abort = b;} virtual RECFM GetFtype(void) {return Ftype;} virtual bool SkipHeader(PGLOBAL) {return false;} @@ -213,7 +214,7 @@ class DllExport DOSCOL : public COLBLK { friend class TDBFIX; public: // Constructors - DOSCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PSZ am = "DOS"); + DOSCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PCSZ am = "DOS"); DOSCOL(DOSCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation @@ -231,12 +232,10 @@ class DllExport DOSCOL : public COLBLK { virtual PVBLK GetDval(void) {return Dval;} // Methods - using COLBLK::Print; virtual bool VarSize(void); virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); virtual void ReadColumn(PGLOBAL g); virtual void WriteColumn(PGLOBAL g); - virtual void Print(PGLOBAL g, FILE *, uint); protected: virtual bool SetMinMax(PGLOBAL g); diff --git a/storage/connect/tabext.cpp b/storage/connect/tabext.cpp index e3518126a49..8f6e610dfc2 100644 --- a/storage/connect/tabext.cpp +++ b/storage/connect/tabext.cpp @@ -35,9 +35,9 @@ /***********************************************************************/ /* CONDFIL Constructor. */ /***********************************************************************/ -CONDFIL::CONDFIL(const Item *cond, uint idx, AMT type) +CONDFIL::CONDFIL(uint idx, AMT type) { - Cond = cond; +//Cond = cond; Idx = idx; Type = type; Op = OP_XX; @@ -61,7 +61,7 @@ int CONDFIL::Init(PGLOBAL g, PHC hc) bool h; if (options) - alt = GetListOption(g, "Alias", options->oplist, NULL); + alt = (char*)GetListOption(g, "Alias", options->oplist, NULL); while (alt) { if (!(p = strchr(alt, '='))) { @@ -267,7 +267,7 @@ TDBEXT::TDBEXT(PTDBEXT tdbp) : TDB(tdbp) /******************************************************************/ /* Convert an UTF-8 string to latin characters. */ /******************************************************************/ -int TDBEXT::Decode(char *txt, char *buf, size_t n) +int TDBEXT::Decode(PCSZ txt, char *buf, size_t n) { uint dummy_errors; uint32 len = copy_and_convert(buf, n, &my_charset_latin1, @@ -285,20 +285,20 @@ int TDBEXT::Decode(char *txt, char *buf, size_t n) /***********************************************************************/ bool TDBEXT::MakeSQL(PGLOBAL g, bool cnt) { - char *schmp = NULL, *catp = NULL, buf[NAM_LEN * 3]; + PCSZ schmp = NULL; + char *catp = NULL, buf[NAM_LEN * 3]; int len; - bool oom = false, first = true; + bool first = true; PTABLE tablep = To_Table; PCOL colp; if (Srcdef) { if ((catp = strstr(Srcdef, "%s"))) { char *fil1, *fil2; - PSZ ph = ((EXTDEF*)To_Def)->Phpos; + PCSZ ph = ((EXTDEF*)To_Def)->Phpos; if (!ph) - ph = (strstr(catp + 2, "%s")) ? const_cast("WH") : - const_cast("W"); + ph = (strstr(catp + 2, "%s")) ? "WH" : "W"; if (stricmp(ph, "H")) { fil1 = (To_CondFil && *To_CondFil->Body) @@ -342,7 +342,7 @@ bool TDBEXT::MakeSQL(PGLOBAL g, bool cnt) for (colp = Columns; colp; colp = colp->GetNext()) if (!colp->IsSpecial()) { if (!first) - oom |= Query->Append(", "); + Query->Append(", "); else first = false; @@ -351,11 +351,11 @@ bool TDBEXT::MakeSQL(PGLOBAL g, bool cnt) if (Quote) { // Put column name between identifier quotes in case in contains blanks - oom |= Query->Append(Quote); - oom |= Query->Append(buf); - oom |= Query->Append(Quote); + Query->Append(Quote); + Query->Append(buf); + Query->Append(Quote); } else - oom |= Query->Append(buf); + Query->Append(buf); ((PEXTCOL)colp)->SetRank(++Ncol); } // endif colp @@ -363,13 +363,13 @@ bool TDBEXT::MakeSQL(PGLOBAL g, bool cnt) } else // !Columns can occur for queries such that sql count(*) from... // for which we will count the rows from sql * from... - oom |= Query->Append('*'); + Query->Append('*'); } else // SQL statement used to retrieve the size of the result - oom |= Query->Append("count(*)"); + Query->Append("count(*)"); - oom |= Query->Append(" FROM "); + Query->Append(" FROM "); if (Catalog && *Catalog) catp = Catalog; @@ -381,17 +381,17 @@ bool TDBEXT::MakeSQL(PGLOBAL g, bool cnt) schmp = Schema; if (catp) { - oom |= Query->Append(catp); + Query->Append(catp); if (schmp) { - oom |= Query->Append('.'); - oom |= Query->Append(schmp); + Query->Append('.'); + Query->Append(schmp); } // endif schmp - oom |= Query->Append('.'); + Query->Append('.'); } else if (schmp) { - oom |= Query->Append(schmp); - oom |= Query->Append('.'); + Query->Append(schmp); + Query->Append('.'); } // endif schmp // Table name can be encoded in UTF-8 @@ -399,18 +399,18 @@ bool TDBEXT::MakeSQL(PGLOBAL g, bool cnt) if (Quote) { // Put table name between identifier quotes in case in contains blanks - oom |= Query->Append(Quote); - oom |= Query->Append(buf); - oom |= Query->Append(Quote); + Query->Append(Quote); + Query->Append(buf); + Query->Append(Quote); } else - oom |= Query->Append(buf); + Query->Append(buf); len = Query->GetLength(); if (To_CondFil) { if (Mode == MODE_READ) { - oom |= Query->Append(" WHERE "); - oom |= Query->Append(To_CondFil->Body); + Query->Append(" WHERE "); + Query->Append(To_CondFil->Body); len = Query->GetLength() + 1; } else len += (strlen(To_CondFil->Body) + 256); @@ -418,10 +418,11 @@ bool TDBEXT::MakeSQL(PGLOBAL g, bool cnt) } else len += ((Mode == MODE_READX) ? 256 : 1); - if (oom || Query->Resize(len)) { + if (Query->IsTruncated()) { strcpy(g->Message, "MakeSQL: Out of memory"); return true; - } // endif oom + } else + Query->Resize(len); if (trace) htrc("Query=%s\n", Query->GetStr()); @@ -435,15 +436,17 @@ bool TDBEXT::MakeSQL(PGLOBAL g, bool cnt) /***********************************************************************/ bool TDBEXT::MakeCommand(PGLOBAL g) { - char *p, *stmt, name[68], *body = NULL; + PCSZ schmp = NULL; + char *p, *stmt, name[132], *body = NULL; char *qrystr = (char*)PlugSubAlloc(g, NULL, strlen(Qrystr) + 1); bool qtd = Quoted > 0; + char q = qtd ? *Quote : ' '; int i = 0, k = 0; // Make a lower case copy of the originale query and change // back ticks to the data source identifier quoting character do { - qrystr[i] = (Qrystr[i] == '`') ? *Quote : tolower(Qrystr[i]); + qrystr[i] = (Qrystr[i] == '`') ? q : tolower(Qrystr[i]); } while (Qrystr[i++]); if (To_CondFil && (p = strstr(qrystr, " where "))) { @@ -460,27 +463,50 @@ bool TDBEXT::MakeCommand(PGLOBAL g) strlwr(strcat(strcat(strcpy(name, " "), Name), " ")); if (strstr(" update delete low_priority ignore quick from ", name)) { - strlwr(strcat(strcat(strcpy(name, Quote), Name), Quote)); - k += 2; + if (Quote) { + strlwr(strcat(strcat(strcpy(name, Quote), Name), Quote)); + k += 2; + } else { + strcpy(g->Message, "Quoted must be specified"); + return true; + } // endif Quote + } else strlwr(strcpy(name, Name)); // Not a keyword if ((p = strstr(qrystr, name))) { for (i = 0; i < p - qrystr; i++) - stmt[i] = (Qrystr[i] == '`') ? *Quote : Qrystr[i]; + stmt[i] = (Qrystr[i] == '`') ? q : Qrystr[i]; stmt[i] = 0; + k += i + (int)strlen(Name); - if (qtd && *(p - 1) == ' ') + if (Schema && *Schema) + schmp = Schema; + + if (qtd && *(p - 1) == ' ') { + if (schmp) + strcat(strcat(stmt, schmp), "."); + strcat(strcat(strcat(stmt, Quote), TableName), Quote); - else + } else { + if (schmp) { + if (qtd && *(p - 1) != ' ') { + stmt[i - 1] = 0; + strcat(strcat(strcat(stmt, schmp), "."), Quote); + } else + strcat(strcat(stmt, schmp), "."); + + } // endif schmp + strcat(stmt, TableName); + } // endif's i = (int)strlen(stmt); do { - stmt[i++] = (Qrystr[k] == '`') ? *Quote : Qrystr[k]; + stmt[i++] = (Qrystr[k] == '`') ? q : Qrystr[k]; } while (Qrystr[k++]); if (body) @@ -539,7 +565,7 @@ int TDBEXT::GetProgMax(PGLOBAL g) /***********************************************************************/ /* EXTCOL public constructor. */ /***********************************************************************/ -EXTCOL::EXTCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am) +EXTCOL::EXTCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am) : COLBLK(cdp, tdbp, i) { if (cprec) { diff --git a/storage/connect/tabext.h b/storage/connect/tabext.h index 2ef20c89f2c..7ddf2a68117 100644 --- a/storage/connect/tabext.h +++ b/storage/connect/tabext.h @@ -7,7 +7,7 @@ /***********************************************************************/ #ifndef __TABEXT_H -#define __TABEXTF_H +#define __TABEXT_H #include "reldef.h" @@ -28,14 +28,14 @@ class ALIAS : public BLOCK { class CONDFIL : public BLOCK { public: // Constructor - CONDFIL(const Item *cond, uint idx, AMT type); + CONDFIL(uint idx, AMT type); // Functions int Init(PGLOBAL g, PHC hc); const char *Chk(const char *cln, bool *h); // Members - const Item *Cond; +//const Item *Cond; AMT Type; uint Idx; OPVAL Op; @@ -60,10 +60,10 @@ public: // Implementation virtual const char *GetType(void) { return "EXT"; } - inline PSZ GetTabname(void) { return Tabname; } - inline PSZ GetTabschema(void) { return Tabschema; } - inline PSZ GetUsername(void) { return Username; }; - inline PSZ GetPassword(void) { return Password; }; + inline PCSZ GetTabname(void) { return Tabname; } + inline PCSZ GetTabschema(void) { return Tabschema; } + inline PCSZ GetUsername(void) { return Username; }; + inline PCSZ GetPassword(void) { return Password; }; inline PSZ GetTabcat(void) { return Tabcat; } inline PSZ GetSrcdef(void) { return Srcdef; } inline char GetSep(void) { return (Sep) ? *Sep : 0; } @@ -76,10 +76,10 @@ public: protected: // Members - PSZ Tabname; /* External table name */ - PSZ Tabschema; /* External table schema */ - PSZ Username; /* User connect name */ - PSZ Password; /* Password connect info */ + PCSZ Tabname; /* External table name */ + PCSZ Tabschema; /* External table schema */ + PCSZ Username; /* User connect name */ + PCSZ Password; /* Password connect info */ PSZ Tabcat; /* External table catalog */ PSZ Tabtyp; /* Catalog table type */ PSZ Colpat; /* Catalog column pattern */ @@ -104,6 +104,8 @@ protected: /* This is the base class for all external tables. */ /***********************************************************************/ class DllExport TDBEXT : public TDB { + friend class JAVAConn; + friend class JMgoConn; public: // Constructors TDBEXT(EXTDEF *tdp); @@ -115,7 +117,7 @@ public: virtual bool IsRemote(void) { return true; } // Methods - virtual PSZ GetServer(void) { return "Remote"; } + virtual PCSZ GetServer(void) { return "Remote"; } virtual int GetRecpos(void); // Database routines @@ -127,19 +129,19 @@ protected: virtual bool MakeSQL(PGLOBAL g, bool cnt); //virtual bool MakeInsert(PGLOBAL g); virtual bool MakeCommand(PGLOBAL g); - int Decode(char *utf, char *buf, size_t n); + int Decode(PCSZ utf, char *buf, size_t n); // Members PQRYRES Qrp; // Points to storage result PSTRG Query; // Constructed SQL query - char *TableName; // Points to ODBC table name - char *Schema; // Points to ODBC table Schema - char *User; // User connect info - char *Pwd; // Password connect info + PCSZ TableName; // Points to ODBC table name + PCSZ Schema; // Points to ODBC table Schema + PCSZ User; // User connect info + PCSZ Pwd; // Password connect info char *Catalog; // Points to ODBC table Catalog char *Srcdef; // The source table SQL definition char *Count; // Points to count(*) SQL statement - //char *Where; // Points to local where clause + //char *Where; // Points to local where clause char *Quote; // The identifier quoting character char *MulConn; // Used for multiple ODBC tables char *DBQ; // The address part of Connect string @@ -164,13 +166,13 @@ protected: }; // end of class TDBEXT /***********************************************************************/ -/* Virual class EXTCOL: external column. */ +/* Virtual class EXTCOL: external column. */ /***********************************************************************/ class DllExport EXTCOL : public COLBLK { friend class TDBEXT; public: // Constructor - EXTCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am); + EXTCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am); EXTCOL(PEXTCOL colp, PTDB tdbp); // Constructor used in copy process // Implementation diff --git a/storage/connect/tabfix.cpp b/storage/connect/tabfix.cpp index bf123cd36c8..a78d5861e53 100644 --- a/storage/connect/tabfix.cpp +++ b/storage/connect/tabfix.cpp @@ -1,11 +1,11 @@ /************* TabFix C++ Program Source Code File (.CPP) **************/ /* PROGRAM NAME: TABFIX */ /* ------------- */ -/* Version 4.9.1 */ +/* Version 4.9.2 */ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 1998-2016 */ +/* (C) Copyright to the author Olivier BERTRAND 1998-2017 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -373,7 +373,7 @@ int TDBFIX::WriteDB(PGLOBAL g) /***********************************************************************/ /* BINCOL public constructor. */ /***********************************************************************/ -BINCOL::BINCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PSZ am) +BINCOL::BINCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PCSZ am) : DOSCOL(g, cdp, tp, cp, i, am) { char c, *fmt = cdp->GetFmt(); @@ -411,8 +411,8 @@ BINCOL::BINCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PSZ am) case 'D': M = sizeof(double); break; default: sprintf(g->Message, MSG(BAD_BIN_FMT), Fmt, Name); - longjmp(g->jumper[g->jump_level], 11); - } // endswitch Fmt + throw 11; + } // endswitch Fmt } else if (IsTypeChar(Buf_Type)) Eds = 0; @@ -486,8 +486,8 @@ void BINCOL::ReadColumn(PGLOBAL g) if (rc == RC_EF) sprintf(g->Message, MSG(INV_DEF_READ), rc); - longjmp(g->jumper[g->jump_level], 11); - } // endif + throw 11; + } // endif p = tdbp->To_Line + Deplac; @@ -545,8 +545,8 @@ void BINCOL::ReadColumn(PGLOBAL g) break; default: sprintf(g->Message, MSG(BAD_BIN_FMT), Fmt, Name); - longjmp(g->jumper[g->jump_level], 11); - } // endswitch Fmt + throw 11; + } // endswitch Fmt // Set null when applicable if (Nullable) @@ -595,8 +595,8 @@ void BINCOL::WriteColumn(PGLOBAL g) } else if (Value->GetBinValue(p, Long, Status)) { sprintf(g->Message, MSG(BIN_F_TOO_LONG), Name, Value->GetSize(), Long); - longjmp(g->jumper[g->jump_level], 31); - } // endif p + throw 31; + } // endif p break; case 'S': // Short integer @@ -604,8 +604,8 @@ void BINCOL::WriteColumn(PGLOBAL g) if (n > 32767LL || n < -32768LL) { sprintf(g->Message, MSG(VALUE_TOO_BIG), n, Name); - longjmp(g->jumper[g->jump_level], 31); - } else if (Status) + throw 31; + } else if (Status) Value->GetValueNonAligned(p, (short)n); break; @@ -614,8 +614,8 @@ void BINCOL::WriteColumn(PGLOBAL g) if (n > 255LL || n < -256LL) { sprintf(g->Message, MSG(VALUE_TOO_BIG), n, Name); - longjmp(g->jumper[g->jump_level], 31); - } else if (Status) + throw 31; + } else if (Status) *p = (char)n; break; @@ -624,8 +624,8 @@ void BINCOL::WriteColumn(PGLOBAL g) if (n > INT_MAX || n < INT_MIN) { sprintf(g->Message, MSG(VALUE_TOO_BIG), n, Name); - longjmp(g->jumper[g->jump_level], 31); - } else if (Status) + throw 31; + } else if (Status) Value->GetValueNonAligned(p, (int)n); break; @@ -648,8 +648,8 @@ void BINCOL::WriteColumn(PGLOBAL g) case 'C': // Characters if ((n = (signed)strlen(Value->GetCharString(Buf))) > Long) { sprintf(g->Message, MSG(BIN_F_TOO_LONG), Name, (int) n, Long); - longjmp(g->jumper[g->jump_level], 31); - } // endif n + throw 31; + } // endif n if (Status) { s = Value->GetCharString(Buf); @@ -660,8 +660,8 @@ void BINCOL::WriteColumn(PGLOBAL g) break; default: sprintf(g->Message, MSG(BAD_BIN_FMT), Fmt, Name); - longjmp(g->jumper[g->jump_level], 11); - } // endswitch Fmt + throw 31; + } // endswitch Fmt if (Eds && Status) { p = tdbp->To_Line + Deplac; diff --git a/storage/connect/tabfix.h b/storage/connect/tabfix.h index 4b9f9689992..53c0af1c422 100644 --- a/storage/connect/tabfix.h +++ b/storage/connect/tabfix.h @@ -65,7 +65,7 @@ class DllExport BINCOL : public DOSCOL { friend class TDBFIX; public: // Constructors - BINCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PSZ am = "BIN"); + BINCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PCSZ am = "BIN"); BINCOL(BINCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation @@ -108,7 +108,7 @@ class TDBDCL : public TDBCAT { {return DBFColumns(g, ((PTABDEF)To_Def)->GetPath(), Fn, false);} // Members - char *Fn; // The DBF file (path) name + PCSZ Fn; // The DBF file (path) name }; // end of class TDBOCL diff --git a/storage/connect/tabfmt.cpp b/storage/connect/tabfmt.cpp index 1a75d572ecd..516601a5eb4 100644 --- a/storage/connect/tabfmt.cpp +++ b/storage/connect/tabfmt.cpp @@ -81,7 +81,7 @@ USETEMP UseTemp(void); /* of types (TYPE_STRING < TYPE_DOUBLE < TYPE_INT) (1 < 2 < 7). */ /* If these values are changed, this will have to be revisited. */ /***********************************************************************/ -PQRYRES CSVColumns(PGLOBAL g, char *dp, PTOS topt, bool info) +PQRYRES CSVColumns(PGLOBAL g, PCSZ dp, PTOS topt, bool info) { static int buftyp[] = {TYPE_STRING, TYPE_SHORT, TYPE_STRING, TYPE_INT, TYPE_INT, TYPE_SHORT}; @@ -153,7 +153,7 @@ PQRYRES CSVColumns(PGLOBAL g, char *dp, PTOS topt, bool info) tdp->Lrecl = 4096; tdp->Multiple = GetIntegerTableOption(g, topt, "Multiple", 0); - p = GetStringTableOption(g, topt, "Separator", ","); + p = (char*)GetStringTableOption(g, topt, "Separator", ","); tdp->Sep = (strlen(p) == 2 && p[0] == '\\' && p[1] == 't') ? '\t' : *p; #if defined(__WIN__) @@ -167,7 +167,7 @@ PQRYRES CSVColumns(PGLOBAL g, char *dp, PTOS topt, bool info) sep = tdp->Sep; tdp->Quoted = GetIntegerTableOption(g, topt, "Quoted", -1); - p = GetStringTableOption(g, topt, "Qchar", ""); + p = (char*)GetStringTableOption(g, topt, "Qchar", ""); tdp->Qot = *p; if (tdp->Qot && tdp->Quoted < 0) @@ -517,7 +517,7 @@ PTDB CSVDEF::GetTable(PGLOBAL g, MODE mode) /*******************************************************************/ if (Zipped) { #if defined(ZIP_SUPPORT) - if (mode == MODE_READ || mode == MODE_ANY) { + if (mode == MODE_READ || mode == MODE_ANY || mode == MODE_ALTER) { txfp = new(g) UNZFAM(this); } else if (mode == MODE_INSERT) { txfp = new(g) ZIPFAM(this); @@ -1047,7 +1047,7 @@ bool TDBCSV::PrepareWriting(PGLOBAL g) if (!strlen(Field[i])) { // Generally null fields are not quoted if (Quoted > 2) - // Except if explicitly required + // Except if explicitely required strcat(strcat(To_Line, qot), qot); } else if (Qot && (strchr(Field[i], Sep) || *Field[i] == Qot @@ -1435,8 +1435,8 @@ void CSVCOL::ReadColumn(PGLOBAL g) if (rc == RC_EF) sprintf(g->Message, MSG(INV_DEF_READ), rc); - longjmp(g->jumper[g->jump_level], 34); - } // endif + throw 34; + } // endif if (tdbp->Mode != MODE_UPDATE) { int colen = Long; // Column length @@ -1453,8 +1453,8 @@ void CSVCOL::ReadColumn(PGLOBAL g) Long = colen; // Restore column length sprintf(g->Message, MSG(FLD_TOO_LNG_FOR), Fldnum + 1, Name, To_Tdb->RowNumber(g), tdbp->GetFile(g)); - longjmp(g->jumper[g->jump_level], 34); - } // endif Long + throw 34; + } // endif Long // Now do the reading DOSCOL::ReadColumn(g); @@ -1516,8 +1516,8 @@ void CSVCOL::WriteColumn(PGLOBAL g) if ((signed)strlen(p) > flen) { sprintf(g->Message, MSG(BAD_FLD_LENGTH), Name, p, flen, tdbp->RowNumber(g), tdbp->GetFile(g)); - longjmp(g->jumper[g->jump_level], 34); - } else if (Dsp) + throw 34; + } else if (Dsp) for (int i = 0; p[i]; i++) if (p[i] == '.') p[i] = Dsp; @@ -1532,8 +1532,8 @@ void CSVCOL::WriteColumn(PGLOBAL g) if (Fldnum < 0) { // This can happen for wrong offset value in XDB files sprintf(g->Message, MSG(BAD_FIELD_RANK), Fldnum + 1, Name); - longjmp(g->jumper[g->jump_level], 34); - } else + throw 34; + } else strncpy(tdbp->Field[Fldnum], p, flen); if (trace > 1) diff --git a/storage/connect/tabfmt.h b/storage/connect/tabfmt.h index e5655435be7..396bba568ff 100644 --- a/storage/connect/tabfmt.h +++ b/storage/connect/tabfmt.h @@ -13,7 +13,7 @@ typedef class TDBFMT *PTDBFMT; /***********************************************************************/ /* Functions used externally. */ /***********************************************************************/ -PQRYRES CSVColumns(PGLOBAL g, char *dp, PTOS topt, bool info); +PQRYRES CSVColumns(PGLOBAL g, PCSZ dp, PTOS topt, bool info); /***********************************************************************/ /* CSV table. */ @@ -21,7 +21,7 @@ PQRYRES CSVColumns(PGLOBAL g, char *dp, PTOS topt, bool info); class DllExport CSVDEF : public DOSDEF { /* Logical table description */ friend class TDBCSV; friend class TDBCCL; - friend PQRYRES CSVColumns(PGLOBAL, char *, PTOS, bool); + friend PQRYRES CSVColumns(PGLOBAL, PCSZ, PTOS, bool); public: // Constructor CSVDEF(void); @@ -53,7 +53,7 @@ public: class DllExport TDBCSV : public TDBDOS { friend class CSVCOL; friend class MAPFAM; - friend PQRYRES CSVColumns(PGLOBAL, char *, PTOS, bool); + friend PQRYRES CSVColumns(PGLOBAL, PCSZ, PTOS, bool); public: // Constructor TDBCSV(PCSVDEF tdp, PTXF txfp); diff --git a/storage/connect/tabjdbc.cpp b/storage/connect/tabjdbc.cpp index 5431e35e0ec..b6a1487955b 100644 --- a/storage/connect/tabjdbc.cpp +++ b/storage/connect/tabjdbc.cpp @@ -223,45 +223,12 @@ bool JDBCDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) } // endif Connect if (Url) - rc = ParseURL(g, Url); - - if (rc == RC_FX) // Error - return true; -//else if (rc == RC_OK) { // Url was not a server name -// Tabname = GetStringCatInfo(g, "Name", -// (Catfunc & (FNC_TABLE | FNC_COL)) ? NULL : Name); -// Tabname = GetStringCatInfo(g, "Tabname", Tabname); -// Username = GetStringCatInfo(g, "User", NULL); -// Password = GetStringCatInfo(g, "Password", NULL); -//} // endif rc - -//if ((Srcdef = GetStringCatInfo(g, "Srcdef", NULL))) -// Read_Only = true; + if ((rc = ParseURL(g, Url)) == RC_FX) { + sprintf(g->Message, "Wrong JDBC URL %s", Url); + return true; + } // endif rc Wrapname = GetStringCatInfo(g, "Wrapper", NULL); -//Prop = GetStringCatInfo(g, "Properties", NULL); -//Tabcat = GetStringCatInfo(g, "Qualifier", NULL); -//Tabcat = GetStringCatInfo(g, "Catalog", Tabcat); -//Tabschema = GetStringCatInfo(g, "Dbname", NULL); -//Tabschema = GetStringCatInfo(g, "Schema", Tabschema); - -//if (Catfunc == FNC_COL) -// Colpat = GetStringCatInfo(g, "Colpat", NULL); - -//if (Catfunc == FNC_TABLE) -// Tabtyp = GetStringCatInfo(g, "Tabtype", NULL); - -//Qrystr = GetStringCatInfo(g, "Query_String", "?"); -//Sep = GetStringCatInfo(g, "Separator", NULL); -//Xsrc = GetBoolCatInfo("Execsrc", FALSE); -//Maxerr = GetIntCatInfo("Maxerr", 0); -//Maxres = GetIntCatInfo("Maxres", 0); -//Quoted = GetIntCatInfo("Quoted", 0); -// Cto= GetIntCatInfo("ConnectTimeout", DEFAULT_LOGIN_TIMEOUT); -// Qto= GetIntCatInfo("QueryTimeout", DEFAULT_QUERY_TIMEOUT); -//Scrollable = GetBoolCatInfo("Scrollable", false); -//Memory = GetIntCatInfo("Memory", 0); -//Pseudo = 2; // FILID is Ok but not ROWID return false; } // end of DefineAM @@ -338,26 +305,19 @@ TDBJDBC::TDBJDBC(PJDBCDEF tdp) : TDBEXT(tdp) if (tdp) { Ops.Driver = tdp->Driver; Ops.Url = tdp->Url; - WrapName = tdp->Wrapname; + Wrapname = tdp->Wrapname; Ops.User = tdp->Username; Ops.Pwd = tdp->Password; -// Ops.Properties = tdp->Prop; -// Ops.Cto = tdp->Cto; -// Ops.Qto = tdp->Qto; Ops.Scrollable = tdp->Scrollable; } else { - WrapName = NULL; + Wrapname = NULL; Ops.Driver = NULL; Ops.Url = NULL; Ops.User = NULL; Ops.Pwd = NULL; -// Ops.Properties = NULL; -// Ops.Cto = DEFAULT_LOGIN_TIMEOUT; -// Ops.Qto = DEFAULT_QUERY_TIMEOUT; Ops.Scrollable = false; } // endif tdp -//Ncol = 0; Prepared = false; Werr = false; Rerr = false; @@ -368,9 +328,8 @@ TDBJDBC::TDBJDBC(PTDBJDBC tdbp) : TDBEXT(tdbp) { Jcp = tdbp->Jcp; // is that right ? Cnp = tdbp->Cnp; - WrapName = tdbp->WrapName; + Wrapname = tdbp->Wrapname; Ops = tdbp->Ops; -//Ncol = tdbp->Ncol; Prepared = tdbp->Prepared; Werr = tdbp->Werr; Rerr = tdbp->Rerr; @@ -406,10 +365,11 @@ PCOL TDBJDBC::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) /***********************************************************************/ bool TDBJDBC::MakeInsert(PGLOBAL g) { - char *schmp = NULL, *catp = NULL, buf[NAM_LEN * 3]; + PCSZ schmp = NULL; + char *catp = NULL, buf[NAM_LEN * 3]; int len = 0; uint pos; - bool b = false, oom = false; + bool b = false; PTABLE tablep = To_Table; PCOL colp; @@ -446,32 +406,32 @@ bool TDBJDBC::MakeInsert(PGLOBAL g) Query = new(g)STRING(g, len, "INSERT INTO "); if (catp) { - oom |= Query->Append(catp); + Query->Append(catp); if (schmp) { - oom |= Query->Append('.'); - oom |= Query->Append(schmp); + Query->Append('.'); + Query->Append(schmp); } // endif schmp - oom |= Query->Append('.'); + Query->Append('.'); } else if (schmp) { - oom |= Query->Append(schmp); - oom |= Query->Append('.'); + Query->Append(schmp); + Query->Append('.'); } // endif schmp if (Quote) { // Put table name between identifier quotes in case in contains blanks - oom |= Query->Append(Quote); - oom |= Query->Append(buf); - oom |= Query->Append(Quote); + Query->Append(Quote); + Query->Append(buf); + Query->Append(Quote); } else - oom |= Query->Append(buf); + Query->Append(buf); - oom |= Query->Append('('); + Query->Append('('); for (colp = Columns; colp; colp = colp->GetNext()) { if (b) - oom |= Query->Append(", "); + Query->Append(", "); else b = true; @@ -480,15 +440,15 @@ bool TDBJDBC::MakeInsert(PGLOBAL g) if (Quote) { // Put column name between identifier quotes in case in contains blanks - oom |= Query->Append(Quote); - oom |= Query->Append(buf); - oom |= Query->Append(Quote); + Query->Append(Quote); + Query->Append(buf); + Query->Append(Quote); } else - oom |= Query->Append(buf); + Query->Append(buf); } // endfor colp - if ((oom |= Query->Append(") VALUES ("))) { + if ((Query->Append(") VALUES ("))) { strcpy(g->Message, "MakeInsert: Out of memory"); return true; } else // in case prepared statement fails @@ -496,9 +456,9 @@ bool TDBJDBC::MakeInsert(PGLOBAL g) // Make prepared statement for (int i = 0; i < Nparm; i++) - oom |= Query->Append("?,"); + Query->Append("?,"); - if (oom) { + if (Query->IsTruncated()) { strcpy(g->Message, "MakeInsert: Out of memory"); return true; } else @@ -602,7 +562,7 @@ bool TDBJDBC::OpenDB(PGLOBAL g) /* Table already open, just replace it at its beginning. */ /*******************************************************************/ if (Memory == 1) { - if ((Qrp = Jcp->AllocateResult(g))) + if ((Qrp = Jcp->AllocateResult(g, this))) Memory = 2; // Must be filled else Memory = 0; // Allocation failed, don't use it @@ -636,11 +596,11 @@ bool TDBJDBC::OpenDB(PGLOBAL g) /* drivers allowing concurency in getting results ??? */ /*********************************************************************/ if (!Jcp) - Jcp = new(g)JDBConn(g, this); + Jcp = new(g)JDBConn(g, Wrapname); else if (Jcp->IsOpen()) Jcp->Close(); - if (Jcp->Open(&Ops) == RC_FX) + if (Jcp->Connect(&Ops)) return true; else if (Quoted) Quote = Jcp->GetQuoteChar(); @@ -648,7 +608,7 @@ bool TDBJDBC::OpenDB(PGLOBAL g) Use = USE_OPEN; // Do it now in case we are recursively called /*********************************************************************/ - /* Make the command and allocate whatever is used for getting results. */ + /* Make the command and allocate whatever is used for getting results*/ /*********************************************************************/ if (Mode == MODE_READ || Mode == MODE_READX) { if (Memory > 1 && !Srcdef) { @@ -665,7 +625,7 @@ bool TDBJDBC::OpenDB(PGLOBAL g) } else if (n) { Jcp->m_Rows = n; - if ((Qrp = Jcp->AllocateResult(g))) + if ((Qrp = Jcp->AllocateResult(g, this))) Memory = 2; // Must be filled else { strcpy(g->Message, "Result set memory allocation failed"); @@ -737,18 +697,12 @@ bool TDBJDBC::SetRecpos(PGLOBAL g, int recpos) { if (Jcp->m_Full) { Fpos = 0; -// CurNum = 0; CurNum = 1; } else if (Memory == 3) { -// Fpos = recpos; -// CurNum = -1; Fpos = 0; CurNum = recpos; } else if (Ops.Scrollable) { // Is new position in the current row set? -// if (recpos >= Curpos && recpos < Curpos + Rbuf) { -// CurNum = recpos - Curpos; -// Fpos = 0; if (recpos > 0 && recpos <= Rbuf) { CurNum = recpos; Fpos = recpos; @@ -797,7 +751,7 @@ bool TDBJDBC::ReadKey(PGLOBAL g, OPVAL op, const key_range *kr) To_CondFil->Body= (char*)PlugSubAlloc(g, NULL, 0); *To_CondFil->Body= 0; - if ((To_CondFil = hc->CheckCond(g, To_CondFil, To_CondFil->Cond))) + if ((To_CondFil = hc->CheckCond(g, To_CondFil, Cond))) PlugSubAlloc(g, NULL, strlen(To_CondFil->Body) + 1); } // endif active_index @@ -911,7 +865,6 @@ int TDBJDBC::WriteDB(PGLOBAL g) // an insert query for each line to insert uint len = Query->GetLength(); char buf[64]; - bool oom = false; // Make the Insert command value list for (PCOL colp = Columns; colp; colp = colp->GetNext()) { @@ -919,28 +872,28 @@ int TDBJDBC::WriteDB(PGLOBAL g) char *s = colp->GetValue()->GetCharString(buf); if (colp->GetResultType() == TYPE_STRING) - oom |= Query->Append_quoted(s); + Query->Append_quoted(s); else if (colp->GetResultType() == TYPE_DATE) { DTVAL *dtv = (DTVAL*)colp->GetValue(); if (dtv->IsFormatted()) - oom |= Query->Append_quoted(s); + Query->Append_quoted(s); else - oom |= Query->Append(s); + Query->Append(s); } else - oom |= Query->Append(s); + Query->Append(s); } else - oom |= Query->Append("NULL"); + Query->Append("NULL"); - oom |= Query->Append(','); + Query->Append(','); } // endfor colp - if (unlikely(oom)) { + if (unlikely(Query->IsTruncated())) { strcpy(g->Message, "WriteDB: Out of memory"); return RC_FX; - } // endif oom + } // endif Query Query->RepLast(')'); @@ -990,11 +943,6 @@ int TDBJDBC::DeleteDB(PGLOBAL g, int irc) /***********************************************************************/ void TDBJDBC::CloseDB(PGLOBAL g) { - //if (To_Kindex) { - // To_Kindex->Close(); - // To_Kindex = NULL; - // } // endif - if (Jcp) Jcp->Close(); @@ -1019,7 +967,7 @@ void TDBJDBC::CloseDB(PGLOBAL g) /***********************************************************************/ /* JDBCCOL public constructor. */ /***********************************************************************/ -JDBCCOL::JDBCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am) +JDBCCOL::JDBCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am) : EXTCOL(cdp, tdbp, cprec, i, am) { } // end of JDBCCOL constructor @@ -1039,54 +987,6 @@ JDBCCOL::JDBCCOL(JDBCCOL *col1, PTDB tdbp) : EXTCOL(col1, tdbp) { } // end of JDBCCOL copy constructor -#if 0 -/***********************************************************************/ -/* SetBuffer: prepare a column block for write operation. */ -/***********************************************************************/ -bool JDBCCOL::SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check) -{ - if (!(To_Val = value)) { - sprintf(g->Message, MSG(VALUE_ERROR), Name); - return true; - } else if (Buf_Type == value->GetType()) { - // Values are of the (good) column type - if (Buf_Type == TYPE_DATE) { - // If any of the date values is formatted - // output format must be set for the receiving table - if (GetDomain() || ((DTVAL *)value)->IsFormatted()) - goto newval; // This will make a new value; - - } else if (Buf_Type == TYPE_DOUBLE) - // Float values must be written with the correct (column) precision - // Note: maybe this should be forced by ShowValue instead of this ? - value->SetPrec(GetScale()); - - Value = value; // Directly access the external value - } else { - // Values are not of the (good) column type - if (check) { - sprintf(g->Message, MSG(TYPE_VALUE_ERR), Name, - GetTypeName(Buf_Type), GetTypeName(value->GetType())); - return true; - } // endif check - - newval: - if (InitValue(g)) // Allocate the matching value block - return true; - - } // endif's Value, Buf_Type - - // Because Colblk's have been made from a copy of the original TDB in - // case of Update, we must reset them to point to the original one. - if (To_Tdb->GetOrig()) - To_Tdb = (PTDB)To_Tdb->GetOrig(); - - // Set the Column - Status = (ok) ? BUF_EMPTY : BUF_NO; - return false; -} // end of SetBuffer -#endif // 0 - /***********************************************************************/ /* ReadColumn: when SQLFetch is used there is nothing to do as the */ /* column buffer was bind to the record set. This is also the case */ @@ -1196,26 +1096,6 @@ PCMD TDBXJDC::MakeCMD(PGLOBAL g) return xcmd; } // end of MakeCMD -#if 0 -/***********************************************************************/ -/* JDBC Bind Parameter function. */ -/***********************************************************************/ -bool TDBXJDC::BindParameters(PGLOBAL g) -{ - PJDBCCOL colp; - - for (colp = (PJDBCCOL)Columns; colp; colp = (PJDBCCOL)colp->Next) { - colp->AllocateBuffers(g, 0); - - if (Jcp->BindParam(colp)) - return true; - - } // endfor colp - - return false; -} // end of BindParameters -#endif // 0 - /***********************************************************************/ /* XDBC GetMaxSize: returns table size (not always one row). */ /***********************************************************************/ @@ -1254,11 +1134,11 @@ bool TDBXJDC::OpenDB(PGLOBAL g) /* drivers allowing concurency in getting results ??? */ /*********************************************************************/ if (!Jcp) { - Jcp = new(g) JDBConn(g, this); + Jcp = new(g) JDBConn(g, Wrapname); } else if (Jcp->IsOpen()) Jcp->Close(); - if (Jcp->Open(&Ops) == RC_FX) + if (Jcp->Connect(&Ops)) return true; Use = USE_OPEN; // Do it now in case we are recursively called @@ -1293,7 +1173,7 @@ int TDBXJDC::ReadDB(PGLOBAL g) else Query->Set(Cmdlist->Cmd); - if ((rc = Jcp->ExecSQLcommand(Query->GetStr())) == RC_FX) + if ((rc = Jcp->ExecuteCommand(Query->GetStr())) == RC_FX) Nerr++; if (rc == RC_NF) @@ -1332,8 +1212,8 @@ int TDBXJDC::DeleteDB(PGLOBAL g, int irc) /***********************************************************************/ /* JSRCCOL public constructor. */ /***********************************************************************/ -JSRCCOL::JSRCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am) - : JDBCCOL(cdp, tdbp, cprec, i, am) +JSRCCOL::JSRCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am) + : JDBCCOL(cdp, tdbp, cprec, i, am) { // Set additional JDBC access method information for column. Flag = cdp->GetOffset(); @@ -1416,17 +1296,3 @@ PQRYRES TDBJDBCL::GetResult(PGLOBAL g) { return JDBCColumns(g, Schema, Tab, Colpat, Maxres, false, &Ops); } // end of GetResult - -#if 0 -/* ---------------------------TDBJSRC class -------------------------- */ - -/***********************************************************************/ -/* GetResult: Get the list of JDBC data sources. */ -/***********************************************************************/ -PQRYRES TDBJSRC::GetResult(PGLOBAL g) -{ - return JDBCDataSources(g, Maxres, false); -} // end of GetResult - -/* ------------------------ End of TabJDBC --------------------------- */ -#endif // 0 diff --git a/storage/connect/tabjdbc.h b/storage/connect/tabjdbc.h index 46d2073e923..d422ed26ef2 100644 --- a/storage/connect/tabjdbc.h +++ b/storage/connect/tabjdbc.h @@ -1,7 +1,7 @@ /*************** Tabjdbc H Declares Source Code File (.H) **************/ -/* Name: TABJDBC.H Version 1.0 */ +/* Name: TABJDBC.H Version 1.1 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2016 */ +/* (C) Copyright to the author Olivier BERTRAND 2016-2017 */ /* */ /* This file contains the TDBJDBC classes declares. */ /***********************************************************************/ @@ -14,9 +14,6 @@ typedef class TDBJDBC *PTDBJDBC; typedef class JDBCCOL *PJDBCCOL; typedef class TDBXJDC *PTDBXJDC; typedef class JSRCCOL *PJSRCCOL; -//typedef class TDBOIF *PTDBOIF; -//typedef class OIFCOL *POIFCOL; -//typedef class TDBJSRC *PTDBJSRC; /***********************************************************************/ /* JDBC table. */ @@ -44,7 +41,7 @@ protected: // Members PSZ Driver; /* JDBC driver */ PSZ Url; /* JDBC driver URL */ - PSZ Wrapname; /* Java wrapper name */ + PSZ Wrapname; /* Java driver name */ }; // end of JDBCDEF #if !defined(NJDBC) @@ -68,20 +65,14 @@ public: // Methods virtual PTDB Clone(PTABS t); -//virtual int GetRecpos(void); virtual bool SetRecpos(PGLOBAL g, int recpos); -//virtual PSZ GetFile(PGLOBAL g); -//virtual void SetFile(PGLOBAL g, PSZ fn); virtual void ResetSize(void); -//virtual int GetAffectedRows(void) {return AftRows;} - virtual PSZ GetServer(void) { return "JDBC"; } + virtual PCSZ GetServer(void) { return "JDBC"; } virtual int Indexable(void) { return 2; } // Database routines virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); virtual int Cardinality(PGLOBAL g); -//virtual int GetMaxSize(PGLOBAL g); -//virtual int GetProgMax(PGLOBAL g); virtual bool OpenDB(PGLOBAL g); virtual int ReadDB(PGLOBAL g); virtual int WriteDB(PGLOBAL g); @@ -91,21 +82,14 @@ public: protected: // Internal functions -//int Decode(char *utf, char *buf, size_t n); -//bool MakeSQL(PGLOBAL g, bool cnt); bool MakeInsert(PGLOBAL g); -//virtual bool MakeCommand(PGLOBAL g); -//bool MakeFilter(PGLOBAL g, bool c); bool SetParameters(PGLOBAL g); -//char *MakeUpdate(PGLOBAL g); -//char *MakeDelete(PGLOBAL g); // Members JDBConn *Jcp; // Points to a JDBC connection class JDBCCOL *Cnp; // Points to count(*) column JDBCPARM Ops; // Additional parameters - char *WrapName; // Points to Java wrapper name -//int Ncol; // The column number + PSZ Wrapname; // Points to Java wrapper name bool Prepared; // True when using prepared statement bool Werr; // Write error bool Rerr; // Rewind error @@ -119,7 +103,7 @@ class JDBCCOL : public EXTCOL { friend class TDBJDBC; public: // Constructors - JDBCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am = "JDBC"); + JDBCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "JDBC"); JDBCCOL(JDBCCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation @@ -152,12 +136,6 @@ public: virtual AMT GetAmType(void) {return TYPE_AM_XDBC;} // Methods - //virtual int GetRecpos(void); - //virtual PSZ GetFile(PGLOBAL g); - //virtual void SetFile(PGLOBAL g, PSZ fn); - //virtual void ResetSize(void); - //virtual int GetAffectedRows(void) {return AftRows;} - //virtual PSZ GetServer(void) {return "JDBC";} // Database routines virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); @@ -172,7 +150,6 @@ public: protected: // Internal functions PCMD MakeCMD(PGLOBAL g); - //bool BindParameters(PGLOBAL g); // Members PCMD Cmdlist; // The commands to execute @@ -188,7 +165,7 @@ class JSRCCOL : public JDBCCOL { friend class TDBXJDC; public: // Constructors - JSRCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am = "JDBC"); + JSRCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "JDBC"); // Implementation virtual int GetAmType(void) {return TYPE_AM_JDBC;} @@ -196,7 +173,6 @@ public: // Methods virtual void ReadColumn(PGLOBAL g); virtual void WriteColumn(PGLOBAL g); - // void Print(PGLOBAL g, FILE *, uint); protected: // Members @@ -233,9 +209,9 @@ protected: virtual PQRYRES GetResult(PGLOBAL g); // Members - char *Schema; // Points to schema name or NULL - char *Tab; // Points to JDBC table name or pattern - char *Tabtype; // Points to JDBC table type + PCSZ Schema; // Points to schema name or NULL + PCSZ Tab; // Points to JDBC table name or pattern + PCSZ Tabtype; // Points to JDBC table type JDBCPARM Ops; // Additional parameters }; // end of class TDBJTB @@ -252,24 +228,7 @@ protected: virtual PQRYRES GetResult(PGLOBAL g); // Members - char *Colpat; // Points to catalog column pattern + PCSZ Colpat; // Points to catalog column pattern }; // end of class TDBJDBCL -#if 0 -/***********************************************************************/ -/* This is the class declaration for the Data Sources catalog table. */ -/***********************************************************************/ -class TDBJSRC : public TDBJDRV { -public: - // Constructor - TDBJSRC(PJDBCDEF tdp) : TDBJDRV(tdp) {} - -protected: - // Specific routines - virtual PQRYRES GetResult(PGLOBAL g); - - // No additional Members -}; // end of class TDBJSRC -#endif // 0 - #endif // !NJDBC diff --git a/storage/connect/tabjmg.cpp b/storage/connect/tabjmg.cpp new file mode 100644 index 00000000000..50efd727604 --- /dev/null +++ b/storage/connect/tabjmg.cpp @@ -0,0 +1,601 @@ +/************** tabjmg C++ Program Source Code File (.CPP) *************/ +/* PROGRAM NAME: tabjmg Version 1.2 */ +/* (C) Copyright to the author Olivier BERTRAND 2017 */ +/* This file contains the MongoDB classes using the Java Driver. */ +/***********************************************************************/ + +/***********************************************************************/ +/* Include relevant sections of the MariaDB header file. */ +/***********************************************************************/ +#include + +/***********************************************************************/ +/* Include application header files: */ +/* global.h is header containing all global declarations. */ +/* plgdbsem.h is header containing the DB application declarations. */ +/***********************************************************************/ +#include "global.h" +#include "plgdbsem.h" +#include "xtable.h" +#include "maputil.h" +#include "filamtxt.h" +#include "tabext.h" +#include "tabjmg.h" +#include "tabmul.h" +#include "checklvl.h" +#include "resource.h" +#include "mycat.h" // for FNC_COL +#include "filter.h" + +#define nullptr 0 + +PQRYRES MGOColumns(PGLOBAL g, PCSZ db, PCSZ uri, PTOS topt, bool info); + +/* -------------------------- Class JMGDISC -------------------------- */ + +/***********************************************************************/ +/* Constructor */ +/***********************************************************************/ +JMGDISC::JMGDISC(PGLOBAL g, int *lg) : MGODISC(g, lg) +{ + drv = "Java"; Jcp = NULL; columnid = nullptr; bvnameid = nullptr; +} // end of JMGDISC constructor + +/***********************************************************************/ +/* Initialyze. */ +/***********************************************************************/ +bool JMGDISC::Init(PGLOBAL g) +{ + if (!(Jcp = ((TDBJMG*)tmgp)->Jcp)) { + strcpy(g->Message, "Init: Jcp is NULL"); + return true; + } else if (Jcp->gmID(g, columnid, "ColumnDesc", + "(Ljava/lang/Object;I[II)Ljava/lang/Object;")) + return true; + else if (Jcp->gmID(g, bvnameid, "ColDescName", "()Ljava/lang/String;")) + return true; + + return false; +} // end of Init + +/***********************************************************************/ +/* Analyse passed document. */ +/***********************************************************************/ +bool JMGDISC::Find(PGLOBAL g) +{ + return ColDesc(g, nullptr, NULL, NULL, Jcp->m_Ncol, 0); +} // end of Find + +/***********************************************************************/ +/* Analyse passed document. */ +/***********************************************************************/ +bool JMGDISC::ColDesc(PGLOBAL g, jobject obj, char *pcn, char *pfmt, + int ncol, int k) +{ + const char *key; + char colname[65]; + char fmt[129]; + bool rc = true; + jint *n = nullptr; + jstring jkey; + jobject jres; + + // Build the java int array + jintArray val = Jcp->env->NewIntArray(5); + + if (val == nullptr) { + strcpy(g->Message, "Cannot allocate jint array"); + return true; + } else if (!ncol) + n = Jcp->env->GetIntArrayElements(val, 0); + + for (int i = 0; i < ncol; i++) { + jres = Jcp->env->CallObjectMethod(Jcp->job, columnid, obj, i, val, lvl - k); + n = Jcp->env->GetIntArrayElements(val, 0); + + if (Jcp->Check(n[0])) { + sprintf(g->Message, "ColDesc: %s", Jcp->Msg); + goto err; + } else if (!n[0]) + continue; + + jkey = (jstring)Jcp->env->CallObjectMethod(Jcp->job, bvnameid); + key = Jcp->env->GetStringUTFChars(jkey, (jboolean)false); + + if (pcn) { + strncpy(colname, pcn, 64); + colname[64] = 0; + strncat(strncat(colname, "_", 65), key, 65); + } else + strcpy(colname, key); + + if (pfmt) { + strncpy(fmt, pfmt, 128); + fmt[128] = 0; + strncat(strncat(fmt, ".", 129), key, 129); + } else + strcpy(fmt, key); + + if (!jres) { + bcol.Type = n[0]; + bcol.Len = n[1]; + bcol.Scale = n[2]; + bcol.Cbn = n[3]; + AddColumn(g, colname, fmt, k); + } else { + if (n[0] == 2 && !all) + n[4] = MY_MIN(n[4], 1); + + if (ColDesc(g, jres, colname, fmt, n[4], k + 1)) + goto err; + + } // endif jres + + } // endfor i + + rc = false; + + err: + Jcp->env->ReleaseIntArrayElements(val, n, 0); + return rc; +} // end of ColDesc + +/* --------------------------- Class TDBJMG -------------------------- */ + +/***********************************************************************/ +/* Implementation of the TDBJMG class. */ +/***********************************************************************/ +TDBJMG::TDBJMG(PMGODEF tdp) : TDBEXT(tdp) +{ + Jcp = NULL; +//Cnp = NULL; + + if (tdp) { + Ops.Driver = tdp->Tabschema; + Ops.Url = tdp->Uri; + Ops.Version = tdp->Version; + Uri = tdp->Uri; + Db_name = tdp->Tabschema; + Wrapname = tdp->Wrapname; + Coll_name = tdp->Tabname; + Options = tdp->Colist; + Filter = tdp->Filter; + B = tdp->Base ? 1 : 0; + Pipe = tdp->Pipe && Options != NULL; + } else { + Ops.Driver = NULL; + Ops.Url = NULL; + Ops.Version = 0; + Uri = NULL; + Db_name = NULL; + Coll_name = NULL; + Options = NULL; + Filter = NULL; + B = 0; + Pipe = false; + } // endif tdp + + Ops.User = NULL; + Ops.Pwd = NULL; + Ops.Scrollable = false; + Ops.Fsize = Ops.CheckSize(Rows); + Fpos = -1; + N = 0; + Done = false; +} // end of TDBJMG standard constructor + +TDBJMG::TDBJMG(TDBJMG *tdbp) : TDBEXT(tdbp) +{ + Uri = tdbp->Uri; + Db_name = tdbp->Db_name;; + Coll_name = tdbp->Coll_name; + Options = tdbp->Options; + Filter = tdbp->Filter; + B = tdbp->B; + Fpos = tdbp->Fpos; + N = tdbp->N; + Done = tdbp->Done; + Pipe = tdbp->Pipe; +} // end of TDBJMG copy constructor + +// Used for update +PTDB TDBJMG::Clone(PTABS t) +{ + PTDB tp; + PJMGCOL cp1, cp2; + PGLOBAL g = t->G; + + tp = new(g) TDBJMG(this); + + for (cp1 = (PJMGCOL)Columns; cp1; cp1 = (PJMGCOL)cp1->GetNext()) + if (!cp1->IsSpecial()) { + cp2 = new(g) JMGCOL(cp1, tp); // Make a copy + NewPointer(t, cp1, cp2); + } // endif cp1 + + return tp; +} // end of Clone + +/***********************************************************************/ +/* Allocate JSN column description block. */ +/***********************************************************************/ +PCOL TDBJMG::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) +{ + return new(g) JMGCOL(g, cdp, this, cprec, n); +} // end of MakeCol + +/***********************************************************************/ +/* InsertSpecialColumn: Put a special column ahead of the column list.*/ +/***********************************************************************/ +PCOL TDBJMG::InsertSpecialColumn(PCOL colp) +{ + if (!colp->IsSpecial()) + return NULL; + + colp->SetNext(Columns); + Columns = colp; + return colp; +} // end of InsertSpecialColumn + +/***********************************************************************/ +/* MONGO Cardinality: returns table size in number of rows. */ +/***********************************************************************/ +int TDBJMG::Cardinality(PGLOBAL g) +{ + if (!g) + return 1; + else if (Cardinal < 0) + Cardinal = (!Init(g)) ? Jcp->CollSize(g) : 0; + + return Cardinal; +} // end of Cardinality + +/***********************************************************************/ +/* MONGO GetMaxSize: returns collection size estimate. */ +/***********************************************************************/ +int TDBJMG::GetMaxSize(PGLOBAL g) +{ + if (MaxSize < 0) + MaxSize = Cardinality(g); + + return MaxSize; +} // end of GetMaxSize + +/***********************************************************************/ +/* Init: initialize MongoDB processing. */ +/***********************************************************************/ +bool TDBJMG::Init(PGLOBAL g) +{ + if (Done) + return false; + + /*********************************************************************/ + /* Open an JDBC connection for this table. */ + /* Note: this may not be the proper way to do. Perhaps it is better */ + /* to test whether a connection is already open for this datasource */ + /* and if so to allocate just a new result set. But this only for */ + /* drivers allowing concurency in getting results ??? */ + /*********************************************************************/ + if (!Jcp) + Jcp = new(g) JMgoConn(g, Coll_name, Wrapname); + else if (Jcp->IsOpen()) + Jcp->Close(); + + if (Jcp->Connect(&Ops)) + return true; + + Done = true; + return false; +} // end of Init + +/***********************************************************************/ +/* OpenDB: Data Base open routine for MONGO access method. */ +/***********************************************************************/ +bool TDBJMG::OpenDB(PGLOBAL g) +{ + if (Use == USE_OPEN) { + /*******************************************************************/ + /* Table already open replace it at its beginning. */ + /*******************************************************************/ + if (Jcp->Rewind()) + return true; + + Fpos = -1; + return false; + } // endif Use + + /*********************************************************************/ + /* First opening. */ + /*********************************************************************/ + if (Pipe && Mode != MODE_READ) { + strcpy(g->Message, "Pipeline tables are read only"); + return true; + } // endif Pipe + + Use = USE_OPEN; // Do it now in case we are recursively called + + if (Init(g)) + return true; + + if (Jcp->GetMethodId(g, Mode)) + return true; + + if (Mode == MODE_DELETE && !Next) { + // Delete all documents + if (!Jcp->MakeCursor(g, this, "all", Filter, false)) + if (Jcp->DocDelete(g, true) == RC_OK) + return false; + + return true; + } // endif Mode + + if (Mode == MODE_INSERT) + Jcp->MakeColumnGroups(g, this); + + if (Mode != MODE_UPDATE) + return Jcp->MakeCursor(g, this, Options, Filter, Pipe); + + return false; +} // end of OpenDB + +/***********************************************************************/ +/* Data Base indexed read routine for ODBC access method. */ +/***********************************************************************/ +bool TDBJMG::ReadKey(PGLOBAL g, OPVAL op, const key_range *kr) +{ + strcpy(g->Message, "MONGO tables are not indexable"); + return true; +} // end of ReadKey + +/***********************************************************************/ +/* ReadDB: Get next document from a collection. */ +/***********************************************************************/ +int TDBJMG::ReadDB(PGLOBAL g) +{ + int rc = RC_OK; + + if (!N && Mode == MODE_UPDATE) + if (Jcp->MakeCursor(g, this, Options, Filter, Pipe)) + return RC_FX; + + if (++CurNum >= Rbuf) { + Rbuf = Jcp->Fetch(); + Curpos = Fpos + 1; + CurNum = 0; + N++; + } // endif CurNum + + rc = (Rbuf > 0) ? RC_OK : (Rbuf == 0) ? RC_EF : RC_FX; + + return rc; +} // end of ReadDB + +/***********************************************************************/ +/* WriteDB: Data Base write routine for DOS access method. */ +/***********************************************************************/ +int TDBJMG::WriteDB(PGLOBAL g) +{ + int rc = RC_OK; + + if (Mode == MODE_INSERT) { + rc = Jcp->DocWrite(g); + } else if (Mode == MODE_DELETE) { + rc = Jcp->DocDelete(g, false); + } else if (Mode == MODE_UPDATE) { + rc = Jcp->DocUpdate(g, this); + } // endif Mode + + return rc; +} // end of WriteDB + +/***********************************************************************/ +/* Data Base delete line routine for ODBC access method. */ +/***********************************************************************/ +int TDBJMG::DeleteDB(PGLOBAL g, int irc) +{ + return (irc == RC_OK) ? WriteDB(g) : RC_OK; +} // end of DeleteDB + +/***********************************************************************/ +/* Table close routine for MONGO tables. */ +/***********************************************************************/ +void TDBJMG::CloseDB(PGLOBAL g) +{ + Jcp->Close(); + Done = false; +} // end of CloseDB + +/* ----------------------------- JMGCOL ------------------------------ */ + +/***********************************************************************/ +/* JMGCOL public constructor. */ +/***********************************************************************/ +JMGCOL::JMGCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i) + : EXTCOL(cdp, tdbp, cprec, i, "MGO") +{ + Tmgp = (PTDBJMG)(tdbp->GetOrig() ? tdbp->GetOrig() : tdbp); + Jpath = cdp->GetFmt() ? cdp->GetFmt() : cdp->GetName(); +//Mbuf = NULL; +} // end of JMGCOL constructor + +/***********************************************************************/ +/* JMGCOL constructor used for copying columns. */ +/* tdbp is the pointer to the new table descriptor. */ +/***********************************************************************/ +JMGCOL::JMGCOL(JMGCOL *col1, PTDB tdbp) : EXTCOL(col1, tdbp) +{ + Tmgp = col1->Tmgp; + Jpath = col1->Jpath; +//Mbuf = col1->Mbuf; +} // end of JMGCOL copy constructor + +/***********************************************************************/ +/* Get path when proj is false or projection path when proj is true. */ +/***********************************************************************/ +PSZ JMGCOL::GetJpath(PGLOBAL g, bool proj) +{ + if (Jpath) { + if (proj) { + char *p1, *p2, *projpath = PlugDup(g, Jpath); + int i = 0; + + for (p1 = p2 = projpath; *p1; p1++) + if (*p1 == '.') { + if (!i) + *p2++ = *p1; + + i = 1; + } else if (i) { + if (!isdigit(*p1)) { + *p2++ = *p1; + i = 0; + } // endif p1 + + } else + *p2++ = *p1; + + *p2 = 0; + return projpath; + } else + return Jpath; + + } else + return Name; + +} // end of GetJpath + +#if 0 +/***********************************************************************/ +/* Mini: used to suppress blanks to json strings. */ +/***********************************************************************/ +char *JMGCOL::Mini(PGLOBAL g, const bson_t *bson, bool b) +{ + char *s, *str = NULL; + int i, k = 0; + bool ok = true; + + if (b) + s = str = bson_array_as_json(bson, NULL); + else + s = str = bson_as_json(bson, NULL); + + for (i = 0; i < Long && s[i]; i++) { + switch (s[i]) { + case ' ': + if (ok) continue; + case '"': + ok = !ok; + default: + break; + } // endswitch s[i] + + Mbuf[k++] = s[i]; + } // endfor i + + bson_free(str); + + if (i >= Long) { + sprintf(g->Message, "Value too long for column %s", Name); + throw (int)TYPE_AM_MGO; + } // endif i + + Mbuf[k] = 0; + return Mbuf; +} // end of Mini +#endif // 0 + +/***********************************************************************/ +/* ReadColumn: */ +/***********************************************************************/ +void JMGCOL::ReadColumn(PGLOBAL g) +{ + Value->SetValue_psz(Tmgp->Jcp->GetColumnValue(Jpath)); +} // end of ReadColumn + +/***********************************************************************/ +/* WriteColumn: */ +/***********************************************************************/ +void JMGCOL::WriteColumn(PGLOBAL g) +{ + // Check whether this node must be written + if (Value != To_Val) + Value->SetValue_pval(To_Val, FALSE); // Convert the updated value + +} // end of WriteColumn + +#if 0 +/***********************************************************************/ +/* AddValue: Add column value to the document to insert or update. */ +/***********************************************************************/ +bool JMGCOL::AddValue(PGLOBAL g, bson_t *doc, char *key, bool upd) +{ + bool rc = false; + + if (Value->IsNull()) { + if (upd) + rc = BSON_APPEND_NULL(doc, key); + else + return false; + + } else switch (Buf_Type) { + case TYPE_STRING: + rc = BSON_APPEND_UTF8(doc, key, Value->GetCharValue()); + break; + case TYPE_INT: + case TYPE_SHORT: + rc = BSON_APPEND_INT32(doc, key, Value->GetIntValue()); + break; + case TYPE_TINY: + rc = BSON_APPEND_BOOL(doc, key, Value->GetIntValue()); + break; + case TYPE_BIGINT: + rc = BSON_APPEND_INT64(doc, key, Value->GetBigintValue()); + break; + case TYPE_DOUBLE: + rc = BSON_APPEND_DOUBLE(doc, key, Value->GetFloatValue()); + break; + case TYPE_DECIM: + {bson_decimal128_t dec; + + if (bson_decimal128_from_string(Value->GetCharValue(), &dec)) + rc = BSON_APPEND_DECIMAL128(doc, key, &dec); + + } break; + case TYPE_DATE: + rc = BSON_APPEND_DATE_TIME(doc, key, Value->GetBigintValue() * 1000); + break; + default: + sprintf(g->Message, "Type %d not supported yet", Buf_Type); + return true; + } // endswitch Buf_Type + + if (!rc) { + strcpy(g->Message, "Adding value failed"); + return true; + } else + return false; + +} // end of AddValue +#endif // 0 + +/* -------------------------- TDBJGL class --------------------------- */ + +/***********************************************************************/ +/* TDBJGL class constructor. */ +/***********************************************************************/ +TDBJGL::TDBJGL(PMGODEF tdp) : TDBCAT(tdp) +{ + Topt = tdp->GetTopt(); + Uri = tdp->Uri; + Db = tdp->GetTabschema(); +} // end of TDBJCL constructor + +/***********************************************************************/ +/* GetResult: Get the list the MongoDB collection columns. */ +/***********************************************************************/ +PQRYRES TDBJGL::GetResult(PGLOBAL g) +{ + return MGOColumns(g, Db, Uri, Topt, false); +} // end of GetResult + +/* -------------------------- End of mongo --------------------------- */ diff --git a/storage/connect/tabjmg.h b/storage/connect/tabjmg.h new file mode 100644 index 00000000000..5a637145cff --- /dev/null +++ b/storage/connect/tabjmg.h @@ -0,0 +1,145 @@ +/**************** tabjmg H Declares Source Code File (.H) **************/ +/* Name: tabjmg.h Version 1.1 */ +/* */ +/* (C) Copyright to the author Olivier BERTRAND 2017 */ +/* */ +/* This file contains the MongoDB classes using the Java Driver. */ +/***********************************************************************/ +#include "mongo.h" +#include "jmgoconn.h" +#include "jdbccat.h" + +/***********************************************************************/ +/* Class used to get the columns of a mongo collection. */ +/***********************************************************************/ +class JMGDISC : public MGODISC { +public: + // Constructor + JMGDISC(PGLOBAL g, int *lg); + + // Methods + virtual bool Init(PGLOBAL g); + virtual void GetDoc(void) {} + virtual bool Find(PGLOBAL g); + +protected: + // Function + bool ColDesc(PGLOBAL g, jobject obj, char *pcn, char *pfmt, + int ncol, int k); + + // Members + JMgoConn *Jcp; // Points to a Mongo connection class + jmethodID columnid; // The ColumnDesc method ID + jmethodID bvnameid; // The ColDescName method ID +}; // end of JMGDISC + +/* -------------------------- TDBJMG class --------------------------- */ + +/***********************************************************************/ +/* This is the MongoDB Table Type using the Java Driver. */ +/* The table is a collection, each record being a document. */ +/***********************************************************************/ +class DllExport TDBJMG : public TDBEXT { + friend class JMGCOL; + friend class MGODEF; + friend class JMGDISC; + friend class JAVAConn; + friend PQRYRES MGOColumns(PGLOBAL, PCSZ, PCSZ, PTOS, bool); +public: + // Constructor + TDBJMG(PMGODEF tdp); + TDBJMG(TDBJMG *tdbp); + + // Implementation + virtual AMT GetAmType(void) { return TYPE_AM_MGO; } + virtual PTDB Duplicate(PGLOBAL g) { return (PTDB)new(g) TDBJMG(this); } + + // Methods + virtual PTDB Clone(PTABS t); + virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); + virtual PCOL InsertSpecialColumn(PCOL colp); +//virtual void SetFilter(PFIL fp); + virtual int RowNumber(PGLOBAL g, bool b = FALSE) { return N; } + + // Database routines + virtual int Cardinality(PGLOBAL g); + virtual int GetMaxSize(PGLOBAL g); + virtual bool OpenDB(PGLOBAL g); + virtual int ReadDB(PGLOBAL g); + virtual int WriteDB(PGLOBAL g); + virtual int DeleteDB(PGLOBAL g, int irc); + virtual void CloseDB(PGLOBAL g); + virtual bool ReadKey(PGLOBAL g, OPVAL op, const key_range *kr); + +protected: + bool Init(PGLOBAL g); + + // Members + JMgoConn *Jcp; // Points to a Mongo connection class +//JMGCOL *Cnp; // Points to count(*) column + JDBCPARM Ops; // Additional parameters + PCSZ Uri; + PCSZ Db_name; + PCSZ Coll_name; + PCSZ Options; // The MongoDB options + PCSZ Filter; // The filtering query + PSZ Wrapname; // Java wrapper name + int Fpos; // The current row index + int N; // The current Rownum + int B; // Array index base + bool Done; // Init done + bool Pipe; // True for pipeline +}; // end of class TDBJMG + +/* --------------------------- JMGCOL class -------------------------- */ + +/***********************************************************************/ +/* Class JMGCOL: MongoDB access method column descriptor. */ +/***********************************************************************/ +class DllExport JMGCOL : public EXTCOL { + friend class TDBJMG; + friend class FILTER; +public: + // Constructors + JMGCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i); + JMGCOL(JMGCOL *colp, PTDB tdbp); // Constructor used in copy process + + // Implementation + virtual int GetAmType(void) {return Tmgp->GetAmType();} + + // Methods + //virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); + virtual PSZ GetJpath(PGLOBAL g, bool proj); + virtual void ReadColumn(PGLOBAL g); + virtual void WriteColumn(PGLOBAL g); +//bool AddValue(PGLOBAL g, bson_t *doc, char *key, bool upd); + +protected: + // Default constructor not to be used + JMGCOL(void) {} +//char *GetProjPath(PGLOBAL g); +//char *Mini(PGLOBAL g, const bson_t *bson, bool b); + + // Members + TDBJMG *Tmgp; // To the MGO table block + char *Jpath; // The json path +//char *Mbuf; // The Mini buffer +}; // end of class JMGCOL + +/***********************************************************************/ +/* This is the class declaration for the MONGO catalog table. */ +/***********************************************************************/ +class DllExport TDBJGL : public TDBCAT { +public: + // Constructor + TDBJGL(PMGODEF tdp); + +protected: + // Specific routines + virtual PQRYRES GetResult(PGLOBAL g); + + // Members + PTOS Topt; + PCSZ Uri; + PCSZ Db; +}; // end of class TDBGOL diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp index 1e11d454cfc..76a3d5e9988 100644 --- a/storage/connect/tabjson.cpp +++ b/storage/connect/tabjson.cpp @@ -1,6 +1,6 @@ /************* tabjson C++ Program Source Code File (.CPP) *************/ -/* PROGRAM NAME: tabjson Version 1.3 */ -/* (C) Copyright to the author Olivier BERTRAND 2014 - 2016 */ +/* PROGRAM NAME: tabjson Version 1.5 */ +/* (C) Copyright to the author Olivier BERTRAND 2014 - 2017 */ /* This program are the JSON class DB execution routines. */ /***********************************************************************/ @@ -31,6 +31,14 @@ #if defined(ZIP_SUPPORT) #include "filamzip.h" #endif // ZIP_SUPPORT +#if defined(MONGO_SUPPORT) +#if defined(JDBC_SUPPORT) +#include "jmgfam.h" +#endif // JDBC_SUPPORT +#if defined(CMGO_SUPPORT) +#include "cmgfam.h" +#endif // CMGO_SUPPORT +#endif // MONGO_SUPPORT #include "tabmul.h" #include "checklvl.h" #include "resource.h" @@ -41,12 +49,12 @@ /***********************************************************************/ #define MAXCOL 200 /* Default max column nb in result */ #define TYPE_UNKNOWN 12 /* Must be greater than other types */ -#define USE_G 1 /* Use recoverable memory if 1 */ /***********************************************************************/ -/* External function. */ +/* External functions. */ /***********************************************************************/ USETEMP UseTemp(void); +char *GetJsonNull(void); typedef struct _jncol { struct _jncol *Next; @@ -63,16 +71,18 @@ typedef struct _jncol { /* JSONColumns: construct the result blocks containing the description */ /* of all the columns of a table contained inside a JSON file. */ /***********************************************************************/ -PQRYRES JSONColumns(PGLOBAL g, char *db, PTOS topt, bool info) +PQRYRES JSONColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt, bool info) { static int buftyp[] = {TYPE_STRING, TYPE_SHORT, TYPE_STRING, TYPE_INT, TYPE_INT, TYPE_SHORT, TYPE_SHORT, TYPE_STRING}; static XFLD fldtyp[] = {FLD_NAME, FLD_TYPE, FLD_TYPENAME, FLD_PREC, FLD_LENGTH, FLD_SCALE, FLD_NULL, FLD_FORMAT}; static unsigned int length[] = {0, 6, 8, 10, 10, 6, 6, 0}; - char colname[65], fmt[129]; + char *p, colname[65], fmt[129]; int i, j, lvl, n = 0; int ncol = sizeof(buftyp) / sizeof(int); + bool mgo = (GetTypeID(topt->type) == TAB_MONGO); + PCSZ sep, level; PVAL valp; JCOL jcol; PJCL jcp, fjcp = NULL, pjcp = NULL; @@ -102,8 +112,15 @@ PQRYRES JSONColumns(PGLOBAL g, char *db, PTOS topt, bool info) /*********************************************************************/ /* Open the input file. */ /*********************************************************************/ - lvl = GetIntegerTableOption(g, topt, "Level", 0); - lvl = (lvl < 0) ? 0 : (lvl > 16) ? 16 : lvl; + level = GetStringTableOption(g, topt, "Level", NULL); + + if (level) { + lvl = atoi(level); + lvl = (lvl > 16) ? 16 : lvl; + } else + lvl = 0; + + sep = GetStringTableOption(g, topt, "Separator", "."); tdp = new(g) JSONDEF; #if defined(ZIP_SUPPORT) @@ -112,20 +129,44 @@ PQRYRES JSONColumns(PGLOBAL g, char *db, PTOS topt, bool info) #endif // ZIP_SUPPORT tdp->Fn = GetStringTableOption(g, topt, "Filename", NULL); - if (!tdp->Fn) { + if (!(tdp->Database = SetPath(g, db))) + return NULL; + + tdp->Objname = GetStringTableOption(g, topt, "Object", NULL); + tdp->Base = GetIntegerTableOption(g, topt, "Base", 0) ? 1 : 0; + tdp->Pretty = GetIntegerTableOption(g, topt, "Pretty", 2); + tdp->Xcol = GetStringTableOption(g, topt, "Expand", NULL); + tdp->Uri = (dsn && *dsn ? dsn : NULL); + + if (!tdp->Fn && !tdp->Uri) { strcpy(g->Message, MSG(MISSING_FNAME)); return NULL; } // endif Fn - tdp->Database = SetPath(g, db); - tdp->Objname = GetStringTableOption(g, topt, "Object", NULL); - tdp->Base = GetIntegerTableOption(g, topt, "Base", 0) ? 1 : 0; - tdp->Pretty = GetIntegerTableOption(g, topt, "Pretty", 2); - - if (trace) + if (trace) htrc("File %s objname=%s pretty=%d lvl=%d\n", tdp->Fn, tdp->Objname, tdp->Pretty, lvl); + if (tdp->Uri) { +#if defined(MONGO_SUPPORT) + tdp->Collname = GetStringTableOption(g, topt, "Name", NULL); + tdp->Collname = GetStringTableOption(g, topt, "Tabname", tdp->Collname); + tdp->Schema = GetStringTableOption(g, topt, "Dbname", "test"); + tdp->Options = (PSZ)GetStringTableOption(g, topt, "Colist", "all"); + tdp->Pipe = GetBooleanTableOption(g, topt, "Pipeline", false); + tdp->Driver = (PSZ)GetStringTableOption(g, topt, "Driver", NULL); + tdp->Version = GetIntegerTableOption(g, topt, "Version", 3); +#if defined(JDBC_SUPPORT) + tdp->Wrapname = (PSZ)GetStringTableOption(g, topt, "Wrapper", + (tdp->Version == 2) ? "Mongo2Interface" : "Mongo3Interface"); +#endif // JDBC_SUPPORT + tdp->Pretty = 0; +#else // !MONGO_SUPPORT + sprintf(g->Message, MSG(NO_FEAT_SUPPORT), "MONGO"); + return NULL; +#endif // !MONGO_SUPPORT + } // endif Uri + if (tdp->Pretty == 2) { if (tdp->Zipped) { #if defined(ZIP_SUPPORT) @@ -142,37 +183,62 @@ PQRYRES JSONColumns(PGLOBAL g, char *db, PTOS topt, bool info) jsp = (tjsp->GetDoc()) ? tjsp->GetDoc()->GetValue(0) : NULL; } else { - if (!(tdp->Lrecl = GetIntegerTableOption(g, topt, "Lrecl", 0))) { - sprintf(g->Message, "LRECL must be specified for pretty=%d", tdp->Pretty); - return NULL; - } // endif lrecl + if (!(tdp->Lrecl = GetIntegerTableOption(g, topt, "Lrecl", 0))) + if (!mgo) { + sprintf(g->Message, "LRECL must be specified for pretty=%d", tdp->Pretty); + return NULL; + } else + tdp->Lrecl = 8192; // Should be enough tdp->Ending = GetIntegerTableOption(g, topt, "Ending", CRLF); if (tdp->Zipped) { #if defined(ZIP_SUPPORT) - tjnp = new(g)TDBJSN(tdp, new(g)UNZFAM(tdp)); + tjnp = new(g)TDBJSN(tdp, new(g) UNZFAM(tdp)); #else // !ZIP_SUPPORT sprintf(g->Message, MSG(NO_FEAT_SUPPORT), "ZIP"); return NULL; #endif // !ZIP_SUPPORT + } else if (tdp->Uri) { +#if defined(MONGO_SUPPORT) + if (tdp->Driver && toupper(*tdp->Driver) == 'C') { +#if defined(CMGO_SUPPORT) + tjnp = new(g) TDBJSN(tdp, new(g) CMGFAM(tdp)); +#else + sprintf(g->Message, "Mongo %s Driver not available", "C"); + return NULL; +#endif + } else if (tdp->Driver && toupper(*tdp->Driver) == 'J') { +#if defined(JDBC_SUPPORT) + tjnp = new(g) TDBJSN(tdp, new(g) JMGFAM(tdp)); +#else + sprintf(g->Message, "Mongo %s Driver not available", "Java"); + return NULL; +#endif + } else { // Driver not specified +#if defined(CMGO_SUPPORT) + tjnp = new(g) TDBJSN(tdp, new(g) CMGFAM(tdp)); +#else + tjnp = new(g) TDBJSN(tdp, new(g) JMGFAM(tdp)); +#endif + } // endif Driver +#else + sprintf(g->Message, MSG(NO_FEAT_SUPPORT), "MONGO"); + return NULL; +#endif // MONGO_SUPPORT } else tjnp = new(g) TDBJSN(tdp, new(g) DOSFAM(tdp)); tjnp->SetMode(MODE_READ); -#if USE_G // Allocate the parse work memory PGLOBAL G = (PGLOBAL)PlugSubAlloc(g, NULL, sizeof(GLOBAL)); memset(G, 0, sizeof(GLOBAL)); G->Sarea_Size = tdp->Lrecl * 10; G->Sarea = PlugSubAlloc(g, NULL, G->Sarea_Size); PlugSubSet(G, G->Sarea, G->Sarea_Size); - G->jump_level = -1; + G->jump_level = 0; tjnp->SetG(G); -#else - tjnp->SetG(g); -#endif if (tjnp->OpenDB(g)) return NULL; @@ -197,7 +263,15 @@ PQRYRES JSONColumns(PGLOBAL g, char *db, PTOS topt, bool info) jcol.Found = true; colname[64] = 0; fmt[128] = 0; - jrp = (PJPR*)PlugSubAlloc(g, NULL, sizeof(PJPR) * lvl); + + if (!tdp->Uri) { + *fmt = '$'; + fmt[1] = '.'; + p = fmt + 2; + } else + p = fmt; + + jrp = (PJPR*)PlugSubAlloc(g, NULL, sizeof(PJPR) * MY_MAX(lvl, 0)); /*********************************************************************/ /* Analyse the JSON tree and define columns. */ @@ -209,7 +283,7 @@ PQRYRES JSONColumns(PGLOBAL g, char *db, PTOS topt, bool info) more: strncpy(colname, jpp->GetKey(), 64); - *fmt = 0; + *p = 0; j = 0; jvp = jpp->GetVal(); @@ -224,8 +298,8 @@ PQRYRES JSONColumns(PGLOBAL g, char *db, PTOS topt, bool info) jcol.Len = jcol.Scale = 0; jcol.Cbn = true; } else if (j < lvl) { - if (!*fmt) - strcpy(fmt, colname); + if (!*p) + strcat(fmt, colname); jsp = jvp->GetJson(); @@ -234,13 +308,24 @@ PQRYRES JSONColumns(PGLOBAL g, char *db, PTOS topt, bool info) if (!jrp[j]) jrp[j] = jsp->GetFirst(); - strncat(strncat(fmt, ":", 128), jrp[j]->GetKey(), 128); - strncat(strncat(colname, "_", 64), jrp[j]->GetKey(), 64); - jvp = jrp[j]->GetVal(); - j++; + if (*jrp[j]->GetKey() != '$') { + strncat(strncat(fmt, sep, 128), jrp[j]->GetKey(), 128); + strncat(strncat(colname, "_", 64), jrp[j]->GetKey(), 64); + } // endif Key + + jvp = jrp[j]->GetVal(); + j++; break; case TYPE_JAR: - strncat(fmt, ":", 128); + if (!tdp->Xcol || stricmp(tdp->Xcol, colname)) { + if (tdp->Uri) + strncat(strncat(fmt, sep, 128), "0", 128); + else + strncat(fmt, "[0]", 128); + + } else + strncat(fmt, (tdp->Uri ? sep : "[]"), 128); + jvp = jsp->GetValue(0); break; default: @@ -249,12 +334,13 @@ PQRYRES JSONColumns(PGLOBAL g, char *db, PTOS topt, bool info) } // endswitch jsp goto retry; - } else { + } else if (lvl >= 0) { jcol.Type = TYPE_STRING; jcol.Len = 256; jcol.Scale = 0; jcol.Cbn = true; - } // endif's + } else + continue; // Check whether this column was already found for (jcp = fjcp; jcp; jcp = jcp->Next) @@ -262,13 +348,18 @@ PQRYRES JSONColumns(PGLOBAL g, char *db, PTOS topt, bool info) break; if (jcp) { - if (jcp->Type != jcol.Type) - jcp->Type = TYPE_STRING; + if (jcp->Type != jcol.Type) { + if (jcp->Type == TYPE_UNKNOWN) + jcp->Type = jcol.Type; + else if (jcol.Type != TYPE_UNKNOWN) + jcp->Type = TYPE_STRING; - if (*fmt && (!jcp->Fmt || strlen(jcp->Fmt) < strlen(fmt))) { + } // endif Type + + if (*p && (!jcp->Fmt || strlen(jcp->Fmt) < strlen(fmt))) { jcp->Fmt = PlugDup(g, fmt); length[7] = MY_MAX(length[7], strlen(fmt)); - } // endif *fmt + } // endif fmt jcp->Len = MY_MAX(jcp->Len, jcol.Len); jcp->Scale = MY_MAX(jcp->Scale, jcol.Scale); @@ -282,7 +373,7 @@ PQRYRES JSONColumns(PGLOBAL g, char *db, PTOS topt, bool info) jcp->Name = PlugDup(g, colname); length[0] = MY_MAX(length[0], strlen(colname)); - if (*fmt) { + if (*p) { jcp->Fmt = PlugDup(g, fmt); length[7] = MY_MAX(length[7], strlen(fmt)); } else @@ -336,7 +427,7 @@ PQRYRES JSONColumns(PGLOBAL g, char *db, PTOS topt, bool info) skipit: if (trace) - htrc("CSVColumns: n=%d len=%d\n", n, length[0]); + htrc("JSONColumns: n=%d len=%d\n", n, length[0]); /*********************************************************************/ /* Allocate the structures used to refer to the result set. */ @@ -404,6 +495,17 @@ JSONDEF::JSONDEF(void) Limit = 1; Base = 0; Strict = false; + Sep = '.'; +#if defined(MONGO_SUPPORT) + Uri = NULL; + Collname = Options = Filter = NULL; + Pipe = false; + Driver = NULL; + Version = 0; +#if defined(JDBC_SUPPORT) + Wrapname = NULL; +#endif // JDBC_SUPPORT +#endif // MONGO_SUPPORT } // end of JSONDEF constructor /***********************************************************************/ @@ -411,13 +513,39 @@ JSONDEF::JSONDEF(void) /***********************************************************************/ bool JSONDEF::DefineAM(PGLOBAL g, LPCSTR, int poff) { - Jmode = (JMODE)GetIntCatInfo("Jmode", MODE_OBJECT); + Schema = GetStringCatInfo(g, "DBname", Schema); + Jmode = (JMODE)GetIntCatInfo("Jmode", MODE_OBJECT); Objname = GetStringCatInfo(g, "Object", NULL); Xcol = GetStringCatInfo(g, "Expand", NULL); Pretty = GetIntCatInfo("Pretty", 2); Limit = GetIntCatInfo("Limit", 10); Base = GetIntCatInfo("Base", 0) ? 1 : 0; - return DOSDEF::DefineAM(g, "DOS", poff); + Sep = *GetStringCatInfo(g, "Separator", "."); + + if (Uri = GetStringCatInfo(g, "Connect", NULL)) { +#if defined(MONGO_SUPPORT) + Collname = GetStringCatInfo(g, "Name", + (Catfunc & (FNC_TABLE | FNC_COL)) ? NULL : Name); + Collname = GetStringCatInfo(g, "Tabname", Collname); + Options = GetStringCatInfo(g, "Colist", NULL); + Filter = GetStringCatInfo(g, "Filter", NULL); + Pipe = GetBoolCatInfo("Pipeline", false); + Driver = GetStringCatInfo(g, "Driver", NULL); + Version = GetIntCatInfo("Version", 3); + Pretty = 0; +#if defined(JDBC_SUPPORT) + if (Version == 2) + Wrapname = GetStringCatInfo(g, "Wrapper", "Mongo2Interface"); + else + Wrapname = GetStringCatInfo(g, "Wrapper", "Mongo3Interface"); +#endif // JDBC_SUPPORT +#else // !MONGO_SUPPORT + sprintf(g->Message, MSG(NO_FEAT_SUPPORT), "MONGO"); + return true; +#endif // !MONGO_SUPPORT + } // endif Uri + + return DOSDEF::DefineAM(g, (Uri ? "XMGO" : "DOS"), poff); } // end of DefineAM /***********************************************************************/ @@ -439,9 +567,36 @@ PTDB JSONDEF::GetTable(PGLOBAL g, MODE m) !(tmp == TMP_FORCE && (m == MODE_UPDATE || m == MODE_DELETE)); - if (Zipped) { + if (Uri) { +#if defined(MONGO_SUPPORT) + if (Driver && toupper(*Driver) == 'C') { +#if defined(CMGO_SUPPORT) + txfp = new(g) CMGFAM(this); +#else + sprintf(g->Message, "Mongo %s Driver not available", "C"); + return NULL; +#endif + } else if (Driver && toupper(*Driver) == 'J') { +#if defined(JDBC_SUPPORT) + txfp = new(g) JMGFAM(this); +#else + sprintf(g->Message, "Mongo %s Driver not available", "Java"); + return NULL; +#endif + } else { // Driver not specified +#if defined(CMGO_SUPPORT) + txfp = new(g) CMGFAM(this); +#else + txfp = new(g) JMGFAM(this); +#endif + } // endif Driver +#else + sprintf(g->Message, MSG(NO_FEAT_SUPPORT), "MONGO"); + return NULL; +#endif // MONGO_SUPPORT + } else if (Zipped) { #if defined(ZIP_SUPPORT) - if (m == MODE_READ || m == MODE_UPDATE) { + if (m == MODE_READ || m == MODE_ANY || m == MODE_ALTER) { txfp = new(g) UNZFAM(this); } else if (m == MODE_INSERT) { txfp = new(g) ZIPFAM(this); @@ -463,7 +618,7 @@ PTDB JSONDEF::GetTable(PGLOBAL g, MODE m) sprintf(g->Message, MSG(NO_FEAT_SUPPORT), "GZ"); return NULL; #endif // !GZ_SUPPORT - } else if (map) + } else if (map) txfp = new(g) MAPFAM(this); else txfp = new(g) DOSFAM(this); @@ -471,22 +626,24 @@ PTDB JSONDEF::GetTable(PGLOBAL g, MODE m) // Txfp must be set for TDBDOS tdbp = new(g) TDBJSN(this, txfp); -#if USE_G - // Allocate the parse work memory - PGLOBAL G = (PGLOBAL)PlugSubAlloc(g, NULL, sizeof(GLOBAL)); - memset(G, 0, sizeof(GLOBAL)); - G->Sarea_Size = Lrecl * 10; - G->Sarea = PlugSubAlloc(g, NULL, G->Sarea_Size); - PlugSubSet(G, G->Sarea, G->Sarea_Size); - G->jump_level = -1; - ((TDBJSN*)tdbp)->G = G; -#else - ((TDBJSN*)tdbp)->G = g; -#endif + if (Lrecl) { + // Allocate the parse work memory + PGLOBAL G = (PGLOBAL)PlugSubAlloc(g, NULL, sizeof(GLOBAL)); + memset(G, 0, sizeof(GLOBAL)); + G->Sarea_Size = Lrecl * 10; + G->Sarea = PlugSubAlloc(g, NULL, G->Sarea_Size); + PlugSubSet(G, G->Sarea, G->Sarea_Size); + G->jump_level = 0; + ((TDBJSN*)tdbp)->G = G; + } else { + strcpy(g->Message, "LRECL is not defined"); + return NULL; + } // endif Lrecl + } else { if (Zipped) { #if defined(ZIP_SUPPORT) - if (m == MODE_READ || m == MODE_UPDATE) { + if (m == MODE_READ || m == MODE_ANY || m == MODE_ALTER) { txfp = new(g) UNZFAM(this); } else if (m == MODE_INSERT) { strcpy(g->Message, "INSERT supported only for zipped JSON when pretty=0"); @@ -531,14 +688,16 @@ TDBJSN::TDBJSN(PJDEF tdp, PTXF txfp) : TDBDOS(tdp, txfp) Limit = tdp->Limit; Pretty = tdp->Pretty; B = tdp->Base ? 1 : 0; + Sep = tdp->Sep; Strict = tdp->Strict; } else { Jmode = MODE_OBJECT; Objname = NULL; - Xcol = NULL; + Xcol = NULL; Limit = 1; Pretty = 0; B = 0; + Sep = '.'; Strict = false; } // endif tdp @@ -568,6 +727,7 @@ TDBJSN::TDBJSN(TDBJSN *tdbp) : TDBDOS(NULL, tdbp) SameRow = tdbp->SameRow; Xval = tdbp->Xval; B = tdbp->B; + Sep = tdbp->Sep; Pretty = tdbp->Pretty; Strict = tdbp->Strict; Comma = tdbp->Comma; @@ -650,21 +810,27 @@ PJSON TDBJSN::FindRow(PGLOBAL g) PJSON jsp = Row; PJVAL val = NULL; - for (objpath = PlugDup(g, Objname); jsp && objpath; objpath = p) { - if ((p = strchr(objpath, ':'))) - *p++ = 0; + for (objpath = PlugDup(g, Objname); jsp && objpath; objpath = p) { + if ((p = strchr(objpath, Sep))) + *p++ = 0; - if (*objpath != '[') { // objpass is a key - val = (jsp->GetType() == TYPE_JOB) ? - jsp->GetObject()->GetValue(objpath) : NULL; - } else if (objpath[strlen(objpath)-1] == ']') { - val = (jsp->GetType() == TYPE_JAR) ? - jsp->GetArray()->GetValue(atoi(objpath+1) - B) : NULL; - } else - val = NULL; + if (*objpath != '[' && !IsNum(objpath)) { // objpass is a key + val = (jsp->GetType() == TYPE_JOB) ? + jsp->GetObject()->GetValue(objpath) : NULL; + } else { + if (*objpath == '[') { + if (objpath[strlen(objpath) - 1] == ']') + objpath++; + else + return NULL; + } // endif [ - jsp = (val) ? val->GetJson() : NULL; - } // endfor objpath + val = (jsp->GetType() == TYPE_JAR) ? + jsp->GetArray()->GetValue(atoi(objpath) - B) : NULL; + } // endif objpath + + jsp = (val) ? val->GetJson() : NULL; + } // endfor objpath return jsp; } // end of FindRow @@ -697,8 +863,14 @@ bool TDBJSN::OpenDB(PGLOBAL g) } // endif Use - return TDBDOS::OpenDB(g); - } // end of OpenDB + if (TDBDOS::OpenDB(g)) + return true; + + if (Xcol) + To_Filter = NULL; // Imcompatible + + return false; +} // end of OpenDB /***********************************************************************/ /* SkipHeader: Physically skip first header line if applicable. */ @@ -752,10 +924,8 @@ int TDBJSN::ReadDB(PGLOBAL g) // Deferred reading failed return rc; -#if USE_G // Recover the memory used for parsing PlugSubSet(G, G->Sarea, G->Sarea_Size); -#endif if ((Row = ParseJson(G, To_Line, strlen(To_Line), &Pretty, &Comma))) { Row = FindRow(g); @@ -764,9 +934,7 @@ int TDBJSN::ReadDB(PGLOBAL g) M = 1; rc = RC_OK; } else if (Pretty != 1 || strcmp(To_Line, "]")) { -#if USE_G strcpy(g->Message, G->Message); -#endif rc = RC_FX; } else rc = RC_EF; @@ -780,63 +948,70 @@ int TDBJSN::ReadDB(PGLOBAL g) /* Make the top tree from the object path. */ /***********************************************************************/ int TDBJSN::MakeTopTree(PGLOBAL g, PJSON jsp) - { - if (Objname) { - if (!Val) { - // Parse and allocate Objname item(s) - char *p; - char *objpath = PlugDup(g, Objname); - int i; - PJOB objp; - PJAR arp; - PJVAL val = NULL; - - Top = NULL; - - for (; objpath; objpath = p) { - if ((p = strchr(objpath, ':'))) - *p++ = 0; - - if (*objpath != '[') { - objp = new(g) JOBJECT; - - if (!Top) - Top = objp; - - if (val) - val->SetValue(objp); - - val = new(g) JVALUE; - objp->SetValue(g, val, objpath); - } else if (objpath[strlen(objpath)-1] == ']') { - arp = new(g) JARRAY; +{ + if (Objname) { + if (!Val) { + // Parse and allocate Objname item(s) + char *p; + char *objpath = PlugDup(g, Objname); + int i; + PJOB objp; + PJAR arp; + PJVAL val = NULL; - if (!Top) - Top = arp; - - if (val) - val->SetValue(arp); - - val = new(g) JVALUE; - i = atoi(objpath+1) - B; - arp->SetValue(g, val, i); - arp->InitArray(g); - } else { - sprintf(g->Message, "Invalid Table path %s", Objname); - return RC_FX; - } // endif objpath - - } // endfor p + Top = NULL; - Val = val; - } // endif Val + for (; objpath; objpath = p) { + if ((p = strchr(objpath, Sep))) + *p++ = 0; - Val->SetValue(jsp); - } else - Top = jsp; + if (*objpath != '[' && !IsNum(objpath)) { + objp = new(g) JOBJECT; - return RC_OK; - } // end of MakeTopTree + if (!Top) + Top = objp; + + if (val) + val->SetValue(objp); + + val = new(g) JVALUE; + objp->SetValue(g, val, objpath); + } else { + if (*objpath == '[') { + // Old style + if (objpath[strlen(objpath) - 1] != ']') { + sprintf(g->Message, "Invalid Table path %s", Objname); + return RC_FX; + } else + objpath++; + + } // endif objpath + + arp = new(g) JARRAY; + + if (!Top) + Top = arp; + + if (val) + val->SetValue(arp); + + val = new(g) JVALUE; + i = atoi(objpath) - B; + arp->SetValue(g, val, i); + arp->InitArray(g); + } // endif objpath + + } // endfor p + + Val = val; + } // endif Val + + Val->SetValue(jsp); + } else + Top = jsp; + + return RC_OK; +} // end of MakeTopTree /***********************************************************************/ /* PrepareWriting: Prepare the line for WriteDB. */ @@ -865,24 +1040,19 @@ int TDBJSN::MakeTopTree(PGLOBAL g, PJSON jsp) } // end of PrepareWriting - /***********************************************************************/ - /* WriteDB: Data Base write routine for DOS access method. */ - /***********************************************************************/ - int TDBJSN::WriteDB(PGLOBAL g) +/***********************************************************************/ +/* WriteDB: Data Base write routine for DOS access method. */ +/***********************************************************************/ +int TDBJSN::WriteDB(PGLOBAL g) { int rc = TDBDOS::WriteDB(g); -#if USE_G - if (rc == RC_FX) - strcpy(g->Message, G->Message); - PlugSubSet(G, G->Sarea, G->Sarea_Size); -#endif Row->Clear(); return rc; } // end of WriteDB - /* ---------------------------- JSONCOL ------------------------------ */ +/* ---------------------------- JSONCOL ------------------------------ */ /***********************************************************************/ /* JSONCOL public constructor. */ @@ -896,6 +1066,7 @@ JSONCOL::JSONCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i) MulVal = NULL; Nodes = NULL; Nod = 0; + Sep = Tjp->Sep; Xnod = -1; Xpd = false; Parsed = false; @@ -913,7 +1084,8 @@ JSONCOL::JSONCOL(JSONCOL *col1, PTDB tdbp) : DOSCOL(col1, tdbp) MulVal = col1->MulVal; Nodes = col1->Nodes; Nod = col1->Nod; - Xnod = col1->Xnod; + Sep = col1->Sep; + Xnod = col1->Xnod; Xpd = col1->Xpd; Parsed = col1->Parsed; } // end of JSONCOL copy constructor @@ -956,125 +1128,132 @@ bool JSONCOL::CheckExpand(PGLOBAL g, int i, PSZ nm, bool b) /* Analyse array processing options. */ /***********************************************************************/ bool JSONCOL::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) - { - int n = (int)strlen(p); - bool dg = true, b = false; - PJNODE jnp = &Nodes[i]; +{ + int n; + bool dg = true, b = false; + PJNODE jnp = &Nodes[i]; - if (*p) { - if (p[--n] == ']') { - p[n--] = 0; - p++; - } else { - // Wrong array specification - sprintf(g->Message, - "Invalid array specification %s for %s", p, Name); - return true; - } // endif p + //if (*p == '[') p++; // Old syntax .[ or :[ + n = (int)strlen(p); - } else - b = true; + if (*p) { + if (p[n - 1] == ']') { + p[--n] = 0; + } else if (!IsNum(p)) { + // Wrong array specification + sprintf(g->Message, "Invalid array specification %s for %s", p, Name); + return true; + } // endif p - // To check whether a numeric Rank was specified - for (int k = 0; dg && p[k]; k++) - dg = isdigit(p[k]) > 0; + } else + b = true; - if (!n) { - // Default specifications - if (CheckExpand(g, i, nm, false)) - return true; - else if (jnp->Op != OP_EXP) { - if (b) { - // Return 1st value (B is the index base) - jnp->Rank = Tjp->B; - jnp->Op = OP_EQ; - } else if (!Value->IsTypeNum()) { - jnp->CncVal = AllocateValue(g, (void*)", ", TYPE_STRING); - jnp->Op = OP_CNC; - } else - jnp->Op = OP_ADD; + // To check whether a numeric Rank was specified + dg = IsNum(p); - } // endif OP + if (!n) { + // Default specifications + if (CheckExpand(g, i, nm, false)) + return true; + else if (jnp->Op != OP_EXP) { + if (b) { + // Return 1st value (B is the index base) + jnp->Rank = Tjp->B; + jnp->Op = OP_EQ; + } else if (!Value->IsTypeNum()) { + jnp->CncVal = AllocateValue(g, (void*)", ", TYPE_STRING); + jnp->Op = OP_CNC; + } else + jnp->Op = OP_ADD; - } else if (dg) { - // Return nth value - jnp->Rank = atoi(p) - Tjp->B; - jnp->Op = OP_EQ; - } else if (n == 1) { - // Set the Op value; - switch (*p) { - case '+': jnp->Op = OP_ADD; break; - case '*': jnp->Op = OP_MULT; break; - case '>': jnp->Op = OP_MAX; break; - case '<': jnp->Op = OP_MIN; break; - case '!': jnp->Op = OP_SEP; break; // Average - case '#': jnp->Op = OP_NUM; break; - case 'x': - case 'X': // Expand this array - if (!Tjp->Xcol && nm) { - Xpd = true; - jnp->Op = OP_EXP; - Tjp->Xval = i; - Tjp->Xcol = nm; - } else if (CheckExpand(g, i, nm, true)) - return true; + } // endif OP - break; - default: - sprintf(g->Message, - "Invalid function specification %c for %s", *p, Name); - return true; - } // endswitch *p + } else if (dg) { + // Return nth value + jnp->Rank = atoi(p) - Tjp->B; + jnp->Op = OP_EQ; + } else if (n == 1) { + // Set the Op value; + if (Sep == ':') + switch (*p) { + case '*': *p = 'x'; break; + case 'x': + case 'X': *p = '*'; break; // Expand this array + default: break; + } // endswitch p - } else if (*p == '"' && p[n - 1] == '"') { - // This is a concat specification - jnp->Op = OP_CNC; + switch (*p) { + case '+': jnp->Op = OP_ADD; break; + case 'x': jnp->Op = OP_MULT; break; + case '>': jnp->Op = OP_MAX; break; + case '<': jnp->Op = OP_MIN; break; + case '!': jnp->Op = OP_SEP; break; // Average + case '#': jnp->Op = OP_NUM; break; + case '*': // Expand this array + if (!Tjp->Xcol && nm) { + Xpd = true; + jnp->Op = OP_EXP; + Tjp->Xval = i; + Tjp->Xcol = nm; + } else if (CheckExpand(g, i, nm, true)) + return true; - if (n > 2) { - // Set concat intermediate string - p[n - 1] = 0; - jnp->CncVal = AllocateValue(g, p + 1, TYPE_STRING); - } // endif n + break; + default: + sprintf(g->Message, + "Invalid function specification %c for %s", *p, Name); + return true; + } // endswitch *p - } else { - sprintf(g->Message, "Wrong array specification for %s", Name); - return true; - } // endif's + } else if (*p == '"' && p[n - 1] == '"') { + // This is a concat specification + jnp->Op = OP_CNC; - // For calculated arrays, a local Value must be used - switch (jnp->Op) { - case OP_NUM: - jnp->Valp = AllocateValue(g, TYPE_INT); - break; - case OP_ADD: - case OP_MULT: - case OP_SEP: - if (!IsTypeChar(Buf_Type)) - jnp->Valp = AllocateValue(g, Buf_Type, 0, GetPrecision()); - else - jnp->Valp = AllocateValue(g, TYPE_DOUBLE, 0, 2); + if (n > 2) { + // Set concat intermediate string + p[n - 1] = 0; + jnp->CncVal = AllocateValue(g, p + 1, TYPE_STRING); + } // endif n - break; - case OP_MIN: - case OP_MAX: - jnp->Valp = AllocateValue(g, Buf_Type, Long, GetPrecision()); - break; - case OP_CNC: - if (IsTypeChar(Buf_Type)) - jnp->Valp = AllocateValue(g, TYPE_STRING, Long, GetPrecision()); - else - jnp->Valp = AllocateValue(g, TYPE_STRING, 512); + } else { + sprintf(g->Message, "Wrong array specification for %s", Name); + return true; + } // endif's - break; - default: - break; - } // endswitch Op + // For calculated arrays, a local Value must be used + switch (jnp->Op) { + case OP_NUM: + jnp->Valp = AllocateValue(g, TYPE_INT); + break; + case OP_ADD: + case OP_MULT: + case OP_SEP: + if (!IsTypeChar(Buf_Type)) + jnp->Valp = AllocateValue(g, Buf_Type, 0, GetPrecision()); + else + jnp->Valp = AllocateValue(g, TYPE_DOUBLE, 0, 2); - if (jnp->Valp) - MulVal = AllocateValue(g, jnp->Valp); + break; + case OP_MIN: + case OP_MAX: + jnp->Valp = AllocateValue(g, Buf_Type, Long, GetPrecision()); + break; + case OP_CNC: + if (IsTypeChar(Buf_Type)) + jnp->Valp = AllocateValue(g, TYPE_STRING, Long, GetPrecision()); + else + jnp->Valp = AllocateValue(g, TYPE_STRING, 512); - return false; - } // end of SetArrayOptions + break; + default: + break; + } // endswitch Op + + if (jnp->Valp) + MulVal = AllocateValue(g, jnp->Valp); + + return false; +} // end of SetArrayOptions /***********************************************************************/ /* Parse the eventual passed Jpath information. */ @@ -1083,75 +1262,164 @@ bool JSONCOL::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) /* the node corresponding to that column. */ /***********************************************************************/ bool JSONCOL::ParseJpath(PGLOBAL g) - { - char *p, *p2 = NULL, *pbuf = NULL; - int i; - bool mul = false; +{ + char *p, *p1 = NULL, *p2 = NULL, *pbuf = NULL; + int i; + bool a, mul = false; - if (Parsed) - return false; // Already done - else if (InitValue(g)) - return true; - else if (!Jpath) - Jpath = Name; + if (Parsed) + return false; // Already done + else if (InitValue(g)) + return true; + else if (!Jpath) + Jpath = Name; - if (To_Tdb->GetOrig()) { - // This is an updated column, get nodes from origin - for (PJCOL colp = (PJCOL)Tjp->GetColumns(); colp; - colp = (PJCOL)colp->GetNext()) - if (!stricmp(Name, colp->GetName())) { - Nod = colp->Nod; - Nodes = colp->Nodes; + if (To_Tdb->GetOrig()) { + // This is an updated column, get nodes from origin + for (PJCOL colp = (PJCOL)Tjp->GetColumns(); colp; + colp = (PJCOL)colp->GetNext()) + if (!stricmp(Name, colp->GetName())) { + Nod = colp->Nod; + Nodes = colp->Nodes; Xpd = colp->Xpd; - goto fin; - } // endif Name + goto fin; + } // endif Name - sprintf(g->Message, "Cannot parse updated column %s", Name); - return true; - } // endif To_Orig + sprintf(g->Message, "Cannot parse updated column %s", Name); + return true; + } // endif To_Orig - pbuf = PlugDup(g, Jpath); + pbuf = PlugDup(g, Jpath); + if (*pbuf == '$') pbuf++; + if (*pbuf == Sep) pbuf++; + if (*pbuf == '[') p1 = pbuf++; - // The Jpath must be analyzed - for (i = 0, p = pbuf; (p = strchr(p, ':')); i++, p++) - Nod++; // One path node found + // Estimate the required number of nodes + for (i = 0, p = pbuf; (p = NextChr(p, Sep)); i++, p++) + Nod++; // One path node found - Nodes = (PJNODE)PlugSubAlloc(g, NULL, (++Nod) * sizeof(JNODE)); - memset(Nodes, 0, (Nod) * sizeof(JNODE)); + Nodes = (PJNODE)PlugSubAlloc(g, NULL, (++Nod) * sizeof(JNODE)); + memset(Nodes, 0, (Nod) * sizeof(JNODE)); - // Analyze the Jpath for this column - for (i = 0, p = pbuf; i < Nod; i++, p = (p2 ? p2 + 1 : p + strlen(p))) { - if ((p2 = strchr(p, ':'))) - *p2 = 0; + // Analyze the Jpath for this column + for (i = 0, p = pbuf; p && i < Nod; i++, p = (p2 ? p2 : NULL)) { + a = (p1 != NULL); + p1 = strchr(p, '['); + p2 = strchr(p, Sep); - // Jpath must be explicit - if (*p == 0 || *p == '[') { - // Analyse intermediate array processing - if (SetArrayOptions(g, p, i, Nodes[i-1].Key)) - return true; + if (!p2) + p2 = p1; + else if (p1) { + if (p1 < p2) + p2 = p1; + else if (p1 == p2 + 1) + *p2++ = 0; // Old syntax .[ or :[ + else + p1 = NULL; - } else if (*p == '*') { - // Return JSON - Nodes[i].Op = OP_XX; - } else { - Nodes[i].Key = p; - Nodes[i].Op = OP_EXIST; - } // endif's + } // endif p1 - } // endfor i, p + if (p2) + *p2++ = 0; - fin: - MulVal = AllocateValue(g, Value); - Parsed = true; - return false; - } // end of ParseJpath + // Jpath must be explicit + if (a || *p == 0 || *p == '[' || IsNum(p)) { + // Analyse intermediate array processing + if (SetArrayOptions(g, p, i, Nodes[i - 1].Key)) + return true; + + } else if (*p == '*') { + // Return JSON + Nodes[i].Op = OP_XX; + } else { + Nodes[i].Key = p; + Nodes[i].Op = OP_EXIST; + } // endif's + + } // endfor i, p + + Nod = i; + +fin: + MulVal = AllocateValue(g, Value); + Parsed = true; + return false; +} // end of ParseJpath + +/***********************************************************************/ +/* Get Jpath converted to Mongo path. */ +/***********************************************************************/ +PSZ JSONCOL::GetJpath(PGLOBAL g, bool proj) +{ + if (Jpath) { + char *p1, *p2, *mgopath; + int i = 0; + + if (strcmp(Jpath, "*")) { + p1 = Jpath; + if (*p1 == '$') p1++; + if (*p1 == '.') p1++; + mgopath = PlugDup(g, p1); + } else + return NULL; + + for (p1 = p2 = mgopath; *p1; p1++) + if (i) { // Inside [] + if (isdigit(*p1)) { + if (!proj) + *p2++ = *p1; + + } else if (*p1 == ']' && i == 1) { + if (proj && p1[1] == '.') + p1++; + + i = 0; + } else if (*p1 == '.' && i == 2) { + if (!proj) + *p2++ = '.'; + + i = 0; + } else if (!proj) + return NULL; + + } else switch (*p1) { + case ':': + case '.': + if (isdigit(p1[1])) + i = 2; + + *p2++ = '.'; + break; + case '[': + if (*(p2 - 1) != '.') + *p2++ = '.'; + + i = 1; + break; + case '*': + if (*(p2 - 1) == '.' && !*(p1 + 1)) { + p2--; // Suppress last :* + break; + } // endif p2 + + default: + *p2++ = *p1; + break; + } // endswitch p1; + + *p2 = 0; + return mgopath; + } else + return NULL; + +} // end of GetJpath /***********************************************************************/ /* MakeJson: Serialize the json item and set value to it. */ /***********************************************************************/ PVAL JSONCOL::MakeJson(PGLOBAL g, PJSON jsp) - { - if (Value->IsTypeNum()) { +{ + if (Value->IsTypeNum()) { strcpy(g->Message, "Cannot make Json for a numeric column"); Value->Reset(); } else @@ -1166,12 +1434,15 @@ PVAL JSONCOL::MakeJson(PGLOBAL g, PJSON jsp) void JSONCOL::SetJsonValue(PGLOBAL g, PVAL vp, PJVAL val, int n) { if (val) { + vp->SetNull(false); + switch (val->GetValType()) { case TYPE_STRG: case TYPE_INTG: case TYPE_BINT: case TYPE_DBL: - vp->SetValue_pval(val->GetValue()); + case TYPE_DTM: + vp->SetValue_pval(val->GetValue()); break; case TYPE_BOOL: if (vp->IsTypeNum()) @@ -1190,11 +1461,14 @@ void JSONCOL::SetJsonValue(PGLOBAL g, PVAL vp, PJVAL val, int n) // } // endif Type default: - vp->Reset(); - } // endswitch Type + vp->Reset(); + vp->SetNull(true); + } // endswitch Type - } else - vp->Reset(); + } else { + vp->Reset(); + vp->SetNull(true); + } // endif val } // end of SetJsonValue @@ -1207,8 +1481,8 @@ void JSONCOL::ReadColumn(PGLOBAL g) Value->SetValue_pval(GetColumnValue(g, Tjp->Row, 0)); // Set null when applicable - if (Nullable) - Value->SetNull(Value->IsZero()); + if (!Nullable) + Value->SetNull(false); } // end of ReadColumn @@ -1289,8 +1563,8 @@ PVAL JSONCOL::ExpandArray(PGLOBAL g, PJAR arp, int n) if (!(jvp = arp->GetValue((Nodes[n].Rx = Nodes[n].Nx)))) { strcpy(g->Message, "Logical error expanding array"); - longjmp(g->jumper[g->jump_level], 666); - } // endif jvp + throw 666; + } // endif jvp if (n < Nod - 1 && jvp->GetJson()) { jval.SetValue(GetColumnValue(g, jvp->GetJson(), n + 1)); @@ -1316,21 +1590,26 @@ PVAL JSONCOL::ExpandArray(PGLOBAL g, PJAR arp, int n) /***********************************************************************/ PVAL JSONCOL::CalculateArray(PGLOBAL g, PJAR arp, int n) { - int i, ars, nv = 0, nextsame = Tjp->NextSame; - bool err; +//int i, ars, nv = 0, nextsame = Tjp->NextSame; + int i, nv = 0, nextsame = Tjp->NextSame; + bool err; OPVAL op = Nodes[n].Op; PVAL val[2], vp = Nodes[n].Valp; PJVAL jvrp, jvp; JVALUE jval; vp->Reset(); - ars = MY_MIN(Tjp->Limit, arp->size()); +//ars = MY_MIN(Tjp->Limit, arp->size()); - for (i = 0; i < ars; i++) { - jvrp = arp->GetValue(i); +//for (i = 0; i < ars; i++) { + for (i = 0; i < arp->size(); i++) { + jvrp = arp->GetValue(i); - do { - if (n < Nod - 1 && jvrp->GetJson()) { + if (!jvrp->IsNull() || (op == OP_CNC && GetJsonNull())) do { + if (jvrp->IsNull()) { + jvrp->Value = AllocateValue(g, GetJsonNull(), TYPE_STRING); + jvp = jvrp; + } else if (n < Nod - 1 && jvrp->GetJson()) { Tjp->NextSame = nextsame; jval.SetValue(GetColumnValue(g, jvrp->GetJson(), n + 1)); jvp = &jval; @@ -1343,8 +1622,9 @@ PVAL JSONCOL::CalculateArray(PGLOBAL g, PJAR arp, int n) } else SetJsonValue(g, MulVal, jvp, n); - if (!MulVal->IsZero()) { - switch (op) { +// if (!MulVal->IsZero()) { + if (!MulVal->IsNull()) { + switch (op) { case OP_CNC: if (Nodes[n].CncVal) { val[0] = Nodes[n].CncVal; @@ -1369,7 +1649,7 @@ PVAL JSONCOL::CalculateArray(PGLOBAL g, PJAR arp, int n) if (err) vp->Reset(); - } // endif Zero + } // endif Null } while (Tjp->NextSame > nextsame); @@ -1475,8 +1755,8 @@ void JSONCOL::WriteColumn(PGLOBAL g) { if (Xpd && Tjp->Pretty < 2) { strcpy(g->Message, "Cannot write expanded column when Pretty is not 2"); - longjmp(g->jumper[g->jump_level], 666); - } // endif Xpd + throw 666; + } // endif Xpd /*********************************************************************/ /* Check whether this node must be written. */ @@ -1510,8 +1790,8 @@ void JSONCOL::WriteColumn(PGLOBAL g) if (!(jsp = ParseJson(G, s, (int)strlen(s)))) { strcpy(g->Message, s); - longjmp(g->jumper[g->jump_level], 666); - } // endif jsp + throw 666; + } // endif jsp if (arp) { if (Nod > 1 && Nodes[Nod-2].Op == OP_EQ) @@ -1530,9 +1810,10 @@ void JSONCOL::WriteColumn(PGLOBAL g) break; } // endif Op - // Passthru + // fall through case TYPE_DATE: case TYPE_INT: + case TYPE_TINY: case TYPE_SHORT: case TYPE_BIGINT: case TYPE_DOUBLE: @@ -1655,54 +1936,66 @@ int TDBJSON::MakeDocument(PGLOBAL g) if (!jsp && g->Message[0]) return RC_FX; - objpath = PlugDup(g, Objname); + if ((objpath = PlugDup(g, Objname))) { + if (*objpath == '$') objpath++; + if (*objpath == '.') objpath++; - /*********************************************************************/ - /* Find the table in the tree structure. */ - /*********************************************************************/ - for (; jsp && objpath; objpath = p) { - if ((p = strchr(objpath, ':'))) - *p++ = 0; + /*********************************************************************/ + /* Find the table in the tree structure. */ + /*********************************************************************/ + for (; jsp && objpath; objpath = p) { + if ((p = strchr(objpath, Sep))) + *p++ = 0; - if (*objpath != '[') { // objpass is a key - if (jsp->GetType() != TYPE_JOB) { - strcpy(g->Message, "Table path does not match the json file"); - return RC_FX; - } // endif Type + if (*objpath != '[' && !IsNum(objpath)) { + // objpass is a key + if (jsp->GetType() != TYPE_JOB) { + strcpy(g->Message, "Table path does not match the json file"); + return RC_FX; + } // endif Type - key = objpath; - objp = jsp->GetObject(); - arp = NULL; - val = objp->GetValue(key); + key = objpath; + objp = jsp->GetObject(); + arp = NULL; + val = objp->GetValue(key); - if (!val || !(jsp = val->GetJson())) { - sprintf(g->Message, "Cannot find object key %s", key); - return RC_FX; - } // endif val + if (!val || !(jsp = val->GetJson())) { + sprintf(g->Message, "Cannot find object key %s", key); + return RC_FX; + } // endif val - } else if (objpath[strlen(objpath)-1] == ']') { - if (jsp->GetType() != TYPE_JAR) { - strcpy(g->Message, "Table path does not match the json file"); - return RC_FX; - } // endif Type + } else { + if (*objpath == '[') { + // Old style + if (objpath[strlen(objpath) - 1] != ']') { + sprintf(g->Message, "Invalid Table path %s", Objname); + return RC_FX; + } else + objpath++; - arp = jsp->GetArray(); - objp = NULL; - i = atoi(objpath+1) - B; - val = arp->GetValue(i); + } // endif objpath - if (!val) { - sprintf(g->Message, "Cannot find array value %d", i); - return RC_FX; - } // endif val + if (jsp->GetType() != TYPE_JAR) { + strcpy(g->Message, "Table path does not match the json file"); + return RC_FX; + } // endif Type - } else { - sprintf(g->Message, "Invalid Table path %s", Objname); - return RC_FX; - } // endif objpath + arp = jsp->GetArray(); + objp = NULL; + i = atoi(objpath) - B; + val = arp->GetValue(i); - jsp = val->GetJson(); - } // endfor objpath + if (!val) { + sprintf(g->Message, "Cannot find array value %d", i); + return RC_FX; + } // endif val + + } // endif + + jsp = val->GetJson(); + } // endfor objpath + + } // endif objpath if (jsp && jsp->GetType() == TYPE_JAR) Doc = jsp->GetArray(); @@ -1860,8 +2153,11 @@ bool TDBJSON::OpenDB(PGLOBAL g) return true; } // endswitch Jmode - Use = USE_OPEN; - return false; + if (Xcol) + To_Filter = NULL; // Imcompatible + + Use = USE_OPEN; + return false; } // end of OpenDB /***********************************************************************/ @@ -1871,7 +2167,7 @@ int TDBJSON::ReadDB(PGLOBAL) { int rc; - N++; + N++; if (NextSame) { SameRow = NextSame; @@ -1982,7 +2278,8 @@ void TDBJSON::CloseDB(PGLOBAL g) TDBJCL::TDBJCL(PJDEF tdp) : TDBCAT(tdp) { Topt = tdp->GetTopt(); - Db = (char*)tdp->GetDB(); + Db = tdp->Schema; + Dsn = tdp->Uri; } // end of TDBJCL constructor /***********************************************************************/ @@ -1990,7 +2287,7 @@ TDBJCL::TDBJCL(PJDEF tdp) : TDBCAT(tdp) /***********************************************************************/ PQRYRES TDBJCL::GetResult(PGLOBAL g) { - return JSONColumns(g, Db, Topt, false); + return JSONColumns(g, Db, Dsn, Topt, false); } // end of GetResult /* --------------------------- End of json --------------------------- */ diff --git a/storage/connect/tabjson.h b/storage/connect/tabjson.h index 924ce387900..00e2f4614e7 100644 --- a/storage/connect/tabjson.h +++ b/storage/connect/tabjson.h @@ -1,7 +1,7 @@ /*************** tabjson H Declares Source Code File (.H) **************/ -/* Name: tabjson.h Version 1.1 */ +/* Name: tabjson.h Version 1.3 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2014 - 2015 */ +/* (C) Copyright to the author Olivier BERTRAND 2014 - 2017 */ /* */ /* This file contains the JSON classes declares. */ /***********************************************************************/ @@ -32,12 +32,20 @@ typedef struct _jnode { /***********************************************************************/ /* JSON table. */ /***********************************************************************/ -class JSONDEF : public DOSDEF { /* Table description */ +class DllExport JSONDEF : public DOSDEF { /* Table description */ friend class TDBJSON; friend class TDBJSN; friend class TDBJCL; - friend PQRYRES JSONColumns(PGLOBAL, char*, PTOS, bool); - public: +#if defined(MONGO_SUPPORT) +#if defined(CMGO_SUPPORT) + friend class CMGFAM; +#endif // CMGO_SUPPORT +#if defined(JDBC_SUPPORT) + friend class JMGFAM; +#endif // JDBC_SUPPORT +#endif // MONGO_SUPPORT + friend PQRYRES JSONColumns(PGLOBAL, PCSZ, PCSZ, PTOS, bool); +public: // Constructor JSONDEF(void); @@ -51,13 +59,26 @@ class JSONDEF : public DOSDEF { /* Table description */ protected: // Members JMODE Jmode; /* MODE_OBJECT by default */ - char *Objname; /* Name of first level object */ - char *Xcol; /* Name of expandable column */ + PCSZ Objname; /* Name of first level object */ + PCSZ Xcol; /* Name of expandable column */ int Limit; /* Limit of multiple values */ int Pretty; /* Depends on file structure */ int Level; /* Used for catalog table */ - int Base; /* Tne array index base */ + int Base; /* The array index base */ bool Strict; /* Strict syntax checking */ + char Sep; /* The Jpath separator */ + const char *Uri; /* MongoDB connection URI */ +#if defined(MONGO_SUPPORT) + PCSZ Collname; /* External collection name */ + PSZ Options; /* Colist ; Pipe */ + PSZ Filter; /* Filter */ + PSZ Driver; /* MongoDB Driver (C or JAVA) */ + bool Pipe; /* True if Colist is a pipeline */ + int Version; /* Driver version */ +#if defined(JDBC_SUPPORT) + PSZ Wrapname; /* MongoDB java wrapper name */ +#endif // JDBC_SUPPORT +#endif // MONGO_SUPPORT }; // end of JSONDEF /* -------------------------- TDBJSN class --------------------------- */ @@ -66,9 +87,17 @@ class JSONDEF : public DOSDEF { /* Table description */ /* This is the JSN Access Method class declaration. */ /* The table is a DOS file, each record being a JSON object. */ /***********************************************************************/ -class TDBJSN : public TDBDOS { +class DllExport TDBJSN : public TDBDOS { friend class JSONCOL; friend class JSONDEF; +#if defined(MONGO_SUPPORT) +#if defined(CMGO_SUPPORT) + friend class CMGFAM; +#endif // CMGO_SUPPORT +#if defined(JDBC_SUPPORT) + friend class JMGFAM; +#endif // JDBC_SUPPORT +#endif // MONGO_SUPPORT public: // Constructor TDBJSN(PJDEF tdp, PTXF txfp); @@ -87,6 +116,8 @@ public: virtual PCOL InsertSpecialColumn(PCOL colp); virtual int RowNumber(PGLOBAL g, bool b = FALSE) {return (b) ? M : N;} + virtual bool CanBeFiltered(void) + {return Txfp->GetAmType() == TYPE_AM_MGO || !Xcol;} // Database routines virtual int Cardinality(PGLOBAL g); @@ -107,8 +138,8 @@ public: PJSON Val; // The value of the current row PJCOL Colp; // The multiple column JMODE Jmode; // MODE_OBJECT by default - char *Objname; // The table object name - char *Xcol; // Name of expandable column + PCSZ Objname; // The table object name + PCSZ Xcol; // Name of expandable column int Fpos; // The current row index int N; // The current Rownum int M; // Index of multiple value @@ -118,6 +149,7 @@ public: int SameRow; // Same row nb int Xval; // Index of expandable array int B; // Array index base + char Sep; // The Jpath separator bool Strict; // Strict syntax checking bool Comma; // Row has final comma }; // end of class TDBJSN @@ -127,10 +159,18 @@ public: /***********************************************************************/ /* Class JSONCOL: JSON access method column descriptor. */ /***********************************************************************/ -class JSONCOL : public DOSCOL { +class DllExport JSONCOL : public DOSCOL { friend class TDBJSN; friend class TDBJSON; - public: +#if defined(MONGO_SUPPORT) +#if defined(CMGO_SUPPORT) + friend class CMGFAM; +#endif // CMGO_SUPPORT +#if defined(JDBC_SUPPORT) + friend class JMGFAM; +#endif // JDBC_SUPPORT +#endif // MONGO_SUPPORT +public: // Constructors JSONCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i); JSONCOL(JSONCOL *colp, PTDB tdbp); // Constructor used in copy process @@ -139,20 +179,21 @@ class JSONCOL : public DOSCOL { virtual int GetAmType(void) {return Tjp->GetAmType();} // Methods - virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); - bool ParseJpath(PGLOBAL g); - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); + virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); + bool ParseJpath(PGLOBAL g); + virtual PSZ GetJpath(PGLOBAL g, bool proj); + virtual void ReadColumn(PGLOBAL g); + virtual void WriteColumn(PGLOBAL g); protected: - bool CheckExpand(PGLOBAL g, int i, PSZ nm, bool b); - bool SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm); - PVAL GetColumnValue(PGLOBAL g, PJSON row, int i); - PVAL ExpandArray(PGLOBAL g, PJAR arp, int n); - PVAL CalculateArray(PGLOBAL g, PJAR arp, int n); - PVAL MakeJson(PGLOBAL g, PJSON jsp); - void SetJsonValue(PGLOBAL g, PVAL vp, PJVAL val, int n); - PJSON GetRow(PGLOBAL g); + bool CheckExpand(PGLOBAL g, int i, PSZ nm, bool b); + bool SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm); + PVAL GetColumnValue(PGLOBAL g, PJSON row, int i); + PVAL ExpandArray(PGLOBAL g, PJAR arp, int n); + PVAL CalculateArray(PGLOBAL g, PJAR arp, int n); + PVAL MakeJson(PGLOBAL g, PJSON jsp); + void SetJsonValue(PGLOBAL g, PVAL vp, PJVAL val, int n); + PJSON GetRow(PGLOBAL g); // Default constructor not to be used JSONCOL(void) {} @@ -165,7 +206,8 @@ class JSONCOL : public DOSCOL { JNODE *Nodes; // The intermediate objects int Nod; // The number of intermediate objects int Xnod; // Index of multiple values - bool Xpd; // True for expandable column + char Sep; // The Jpath separator + bool Xpd; // True for expandable column bool Parsed; // True when parsed }; // end of class JSONCOL @@ -174,7 +216,7 @@ class JSONCOL : public DOSCOL { /***********************************************************************/ /* This is the JSON Access Method class declaration. */ /***********************************************************************/ -class TDBJSON : public TDBJSN { +class DllExport TDBJSON : public TDBJSN { friend class JSONDEF; friend class JSONCOL; public: @@ -221,7 +263,7 @@ class TDBJSON : public TDBJSN { /***********************************************************************/ /* This is the class declaration for the JSON catalog table. */ /***********************************************************************/ -class TDBJCL : public TDBCAT { +class DllExport TDBJCL : public TDBCAT { public: // Constructor TDBJCL(PJDEF tdp); @@ -231,6 +273,7 @@ class TDBJCL : public TDBCAT { virtual PQRYRES GetResult(PGLOBAL g); // Members - PTOS Topt; - char *Db; + PTOS Topt; + PCSZ Db; + PCSZ Dsn; }; // end of class TDBJCL diff --git a/storage/connect/table.cpp b/storage/connect/table.cpp index 916449be6c6..61aefc93082 100644 --- a/storage/connect/table.cpp +++ b/storage/connect/table.cpp @@ -47,6 +47,7 @@ TDB::TDB(PTABDEF tdp) : Tdb_No(++Tnum) To_Orig = NULL; To_Filter = NULL; To_CondFil = NULL; + Cond = NULL; Next = NULL; Name = (tdp) ? tdp->GetName() : NULL; To_Table = NULL; @@ -68,6 +69,7 @@ TDB::TDB(PTDB tdbp) : Tdb_No(++Tnum) To_Orig = tdbp; To_Filter = NULL; To_CondFil = NULL; + Cond = NULL; Next = NULL; Name = tdbp->Name; To_Table = tdbp->To_Table; @@ -97,7 +99,7 @@ CHARSET_INFO *TDB::data_charset(void) /***********************************************************************/ /* Return the datapath of the DB this table belongs to. */ /***********************************************************************/ -PSZ TDB::GetPath(void) +PCSZ TDB::GetPath(void) { return To_Def->GetPath(); } // end of GetPath @@ -297,7 +299,7 @@ bool TDB::SetRecpos(PGLOBAL g, int) return true; } // end of SetRecpos -void TDB::Print(PGLOBAL g, FILE *f, uint n) +void TDB::Printf(PGLOBAL g, FILE *f, uint n) { PCOL cp; char m[64]; @@ -313,16 +315,16 @@ void TDB::Print(PGLOBAL g, FILE *f, uint n) fprintf(f, "%s Columns (deg=%d):\n", m, tp->Degree); for (cp = tp->Columns; cp; cp = cp->GetNext()) - cp->Print(g, f, n); + cp->Printf(g, f, n); } /* endfor tp */ - } // end of Print + } // end of Printf -void TDB::Print(PGLOBAL, char *ps, uint) +void TDB::Prints(PGLOBAL, char *ps, uint) { sprintf(ps, "R%d.%s", Tdb_No, Name); - } // end of Print + } // end of Prints /* -------------------------- class TDBASE --------------------------- */ diff --git a/storage/connect/tabmac.cpp b/storage/connect/tabmac.cpp index bbaba591540..a28b5d7108c 100644 --- a/storage/connect/tabmac.cpp +++ b/storage/connect/tabmac.cpp @@ -329,7 +329,7 @@ void MACCOL::ReadColumn(PGLOBAL g) n = 0; break; default: - p = ""; + p = PlugDup(g, ""); } // endswitch Flag } else switch (Flag) { diff --git a/storage/connect/tabmul.cpp b/storage/connect/tabmul.cpp index 78adde81d12..5c41f9094ac 100644 --- a/storage/connect/tabmul.cpp +++ b/storage/connect/tabmul.cpp @@ -1,7 +1,7 @@ /************* TabMul C++ Program Source Code File (.CPP) **************/ /* PROGRAM NAME: TABMUL */ /* ------------- */ -/* Version 1.8 */ +/* Version 1.9 */ /* */ /* COPYRIGHT: */ /* ---------- */ @@ -44,6 +44,11 @@ #define __MFC_COMPAT__ // To define min/max as macro #endif //#include +#if defined(PATHMATCHSPEC) +#include "Shlwapi.h" +//using namespace std; +#pragma comment(lib,"shlwapi.lib") +#endif // PATHMATCHSPEC #else #if defined(UNIX) #include @@ -124,9 +129,10 @@ bool TDBMUL::InitFileNames(PGLOBAL g) { #define PFNZ 4096 #define FNSZ (_MAX_DRIVE+_MAX_DIR+_MAX_FNAME+_MAX_EXT) - char *pfn[PFNZ]; - char *filename; - int rc, n = 0; + PTDBDIR dirp; + PSZ pfn[PFNZ]; + PSZ filename; + int rc, n = 0; if (trace) htrc("in InitFileName: fn[]=%d\n", FNSZ); @@ -141,115 +147,39 @@ bool TDBMUL::InitFileNames(PGLOBAL g) if (trace) htrc("InitFileName: fn='%s'\n", filename); - if (Mul == 1) { + if (Mul != 2) { /*******************************************************************/ /* To_File is a multiple name with special characters */ /*******************************************************************/ + if (Mul == 1) + dirp = new(g) TDBDIR(PlugDup(g, filename)); + else // Mul == 3 (Subdir) + dirp = new(g) TDBSDR(PlugDup(g, filename)); + + if (dirp->OpenDB(g)) + return true; + + if (trace && Mul == 3) { + int nf = ((PTDBSDR)dirp)->FindInDir(g); + htrc("Number of files = %d\n", nf); + } // endif trace + + while (true) + if ((rc = dirp->ReadDB(g)) == RC_OK) { #if defined(__WIN__) - char drive[_MAX_DRIVE], direc[_MAX_DIR]; - WIN32_FIND_DATA FileData; - HANDLE hSearch; - - _splitpath(filename, drive, direc, NULL, NULL); - - // Start searching files in the target directory. - hSearch = FindFirstFile(filename, &FileData); - - if (hSearch == INVALID_HANDLE_VALUE) { - rc = GetLastError(); - - if (rc != ERROR_FILE_NOT_FOUND) { - FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, GetLastError(), 0, - (LPTSTR)&filename, sizeof(filename), NULL); - sprintf(g->Message, MSG(BAD_FILE_HANDLE), filename); - return true; - } // endif rc - - goto suite; - } // endif hSearch - - while (n < PFNZ) { - if (!(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { - strcat(strcat(strcpy(filename, drive), direc), FileData.cFileName); - pfn[n++] = PlugDup(g, filename); - } // endif dwFileAttributes - - if (!FindNextFile(hSearch, &FileData)) { - rc = GetLastError(); - - if (rc != ERROR_NO_MORE_FILES) { - sprintf(g->Message, MSG(NEXT_FILE_ERROR), rc); - FindClose(hSearch); - return true; - } // endif rc - - break; - } // endif FindNextFile - - } // endwhile n - - // Close the search handle. - if (!FindClose(hSearch)) { - strcpy(g->Message, MSG(SRCH_CLOSE_ERR)); - return true; - } // endif FindClose - + strcat(strcpy(filename, dirp->Drive), dirp->Direc); #else // !__WIN__ - struct stat fileinfo; - char fn[FN_REFLEN], direc[FN_REFLEN], pattern[FN_HEADLEN], ftype[FN_EXTLEN]; - DIR *dir; - struct dirent *entry; - - _splitpath(filename, NULL, direc, pattern, ftype); - strcat(pattern, ftype); - - if (trace) - htrc("direc=%s pattern=%s ftype=%s\n", direc, pattern, ftype); - - // Start searching files in the target directory. - if (!(dir = opendir(direc))) { - sprintf(g->Message, MSG(BAD_DIRECTORY), direc, strerror(errno)); - - if (trace) - htrc("%s\n", g->Message); - - return true; - } // endif dir - - if (trace) - htrc("dir opened: reading files\n"); - - while ((entry = readdir(dir)) && n < PFNZ) { - strcat(strcpy(fn, direc), entry->d_name); - - if (trace) - htrc("%s read\n", fn); - - if (lstat(fn, &fileinfo) < 0) { - sprintf(g->Message, "%s: %s", fn, strerror(errno)); - return true; - } else if (!S_ISREG(fileinfo.st_mode)) - continue; // Not a regular file (should test for links) - - /*******************************************************************/ - /* Test whether the file name matches the table name filter. */ - /*******************************************************************/ - if (fnmatch(pattern, entry->d_name, 0)) - continue; // Not a match - - strcat(strcpy(filename, direc), entry->d_name); - pfn[n++] = PlugDup(g, filename); - - if (trace) - htrc("Adding pfn[%d] %s\n", n, filename); - - } // endwhile readdir - - // Close the dir handle. - closedir(dir); + strcpy(filename, dirp->Direc); #endif // !__WIN__ + strcat(strcat(filename, dirp->Fname), dirp->Ftype); + pfn[n++] = PlugDup(g, filename); + } else + break; + + dirp->CloseDB(g); + + if (rc == RC_FX) + return true; } else { /*******************************************************************/ @@ -297,10 +227,6 @@ bool TDBMUL::InitFileNames(PGLOBAL g) } // endif Mul -#if defined(__WIN__) - suite: -#endif - if (n) { Filenames = (char**)PlugSubAlloc(g, NULL, n * sizeof(char*)); @@ -581,7 +507,95 @@ void TDBMUL::CloseDB(PGLOBAL g) } // end of CloseDB -/* --------------------------- Class DIRDEF -------------------------- */ +#if 0 +/* ------------------------- Class TDBMSD ---------------------------- */ + + // Method +PTDB TDBMSD::Clone(PTABS t) +{ + PTDBMSD tp; + PGLOBAL g = t->G; // Is this really useful ??? + + tp = new(g) TDBMSD(this); + tp->Tdbp = Tdbp->Clone(t); + tp->Columns = tp->Tdbp->GetColumns(); + return tp; +} // end of Clone + +PTDB TDBMSD::Duplicate(PGLOBAL g) +{ + PTDBMSD tmup = new(g) TDBMSD(this); + + tmup->Tdbp = Tdbp->Duplicate(g); + return tmup; +} // end of Duplicate + +/***********************************************************************/ +/* Initializes the table filename list. */ +/* Note: tables created by concatenating the file components without */ +/* specifying the LRECL value (that should be restricted to _MAX_PATH)*/ +/* have a LRECL that is the sum of the lengths of all components. */ +/* This is why we use a big filename array to take care of that. */ +/***********************************************************************/ +bool TDBMSD::InitFileNames(PGLOBAL g) +{ +#define PFNZ 4096 +#define FNSZ (_MAX_DRIVE+_MAX_DIR+_MAX_FNAME+_MAX_EXT) + PTDBSDR dirp; + PSZ pfn[PFNZ]; + PSZ filename; + int rc, n = 0; + + if (trace) + htrc("in InitFileName: fn[]=%d\n", FNSZ); + + filename = (char*)PlugSubAlloc(g, NULL, FNSZ); + + // The sub table may need to refer to the Table original block + Tdbp->SetTable(To_Table); // Was not set at construction + + PlugSetPath(filename, Tdbp->GetFile(g), Tdbp->GetPath()); + + if (trace) + htrc("InitFileName: fn='%s'\n", filename); + + dirp = new(g) TDBSDR(filename); + + if (dirp->OpenDB(g)) + return true; + + while (true) + if ((rc = dirp->ReadDB(g)) == RC_OK) { +#if defined(__WIN__) + strcat(strcpy(filename, dirp->Drive), dirp->Direc); +#else // !__WIN__ + strcpy(filename, dirp->Direc); +#endif // !__WIN__ + strcat(strcat(filename, dirp->Fname), dirp->Ftype); + pfn[n++] = PlugDup(g, filename); + } else + break; + + if (rc == RC_FX) + return true; + + if (n) { + Filenames = (char**)PlugSubAlloc(g, NULL, n * sizeof(char*)); + + for (int i = 0; i < n; i++) + Filenames[i] = pfn[i]; + + } else { + Filenames = (char**)PlugSubAlloc(g, NULL, sizeof(char*)); + Filenames[0] = NULL; + } // endif n + + NumFiles = n; + return false; +} // end of InitFileNames +#endif // 0 + + /* --------------------------- Class DIRDEF -------------------------- */ /***********************************************************************/ /* DefineAM: define specific AM block values from XDB file. */ @@ -589,8 +603,9 @@ void TDBMUL::CloseDB(PGLOBAL g) bool DIRDEF::DefineAM(PGLOBAL g, LPCSTR, int) { Desc = Fn = GetStringCatInfo(g, "Filename", NULL); - Incl = (GetIntCatInfo("Subdir", 0) != 0); - Huge = (GetIntCatInfo("Huge", 0) != 0); + Incl = GetBoolCatInfo("Subdir", false); + Huge = GetBoolCatInfo("Huge", false); + Nodir = GetBoolCatInfo("Nodir", true); return false; } // end of DefineAM @@ -616,57 +631,40 @@ PTDB DIRDEF::GetTable(PGLOBAL g, MODE) /***********************************************************************/ /* TABDIR constructors. */ /***********************************************************************/ +void TDBDIR::Init(void) +{ + iFile = 0; +#if defined(__WIN__) + Dvalp = NULL; + memset(&FileData, 0, sizeof(_finddata_t)); + hSearch = INVALID_HANDLE_VALUE; + *Drive = '\0'; +#else // !__WIN__ + memset(&Fileinfo, 0, sizeof(struct stat)); + Entry = NULL; + Dir = NULL; + Done = false; + *Pattern = '\0'; +#endif // !__WIN__ + *Fpath = '\0'; + *Direc = '\0'; + *Fname = '\0'; + *Ftype = '\0'; +} // end of Init + TDBDIR::TDBDIR(PDIRDEF tdp) : TDBASE(tdp) - { +{ To_File = tdp->Fn; - iFile = 0; -#if defined(__WIN__) - memset(&FileData, 0, sizeof(_finddata_t)); - Hsearch = -1; - *Drive = '\0'; -#else // !__WIN__ - memset(&Fileinfo, 0, sizeof(struct stat)); - Entry = NULL; - Dir = NULL; - Done = false; - *Pattern = '\0'; -#endif // !__WIN__ - *Fpath = '\0'; - *Direc = '\0'; - *Fname = '\0'; - *Ftype = '\0'; - } // end of TDBDIR standard constructor + Nodir = tdp->Nodir; + Init(); +} // end of TDBDIR standard constructor -TDBDIR::TDBDIR(PTDBDIR tdbp) : TDBASE(tdbp) - { - To_File = tdbp->To_File; - iFile = tdbp->iFile; -#if defined(__WIN__) - FileData = tdbp->FileData; - Hsearch = tdbp->Hsearch; - strcpy(Drive, tdbp->Drive); -#else // !__WIN__ - Fileinfo = tdbp->Fileinfo; - Entry = tdbp->Entry; - Dir = tdbp->Dir; - Done = tdbp->Done; - strcpy(Pattern, tdbp->Pattern); -#endif // !__WIN__ - strcpy(Direc, tdbp->Direc); - strcpy(Fname, tdbp->Fname); - strcpy(Ftype, tdbp->Ftype); - } // end of TDBDIR copy constructor - -// Method -PTDB TDBDIR::Clone(PTABS t) - { - PTDB tp; - PGLOBAL g = t->G; // Is this really useful ??? - - tp = new(g) TDBDIR(this); - tp->SetColumns(Columns); - return tp; - } // end of Clone +TDBDIR::TDBDIR(PSZ fpat) : TDBASE((PTABDEF)NULL) +{ + To_File = fpat; + Nodir = true; + Init(); +} // end of TDBDIR constructor /***********************************************************************/ /* Initialize/get the components of the search file pattern. */ @@ -674,18 +672,19 @@ PTDB TDBDIR::Clone(PTABS t) char* TDBDIR::Path(PGLOBAL g) { PCATLG cat = PlgGetCatalog(g); + PTABDEF defp = (PTABDEF)To_Def; #if defined(__WIN__) if (!*Drive) { - PlugSetPath(Fpath, To_File, ((PTABDEF)To_Def)->GetPath()); + PlugSetPath(Fpath, To_File, defp ? defp->GetPath() : NULL); _splitpath(Fpath, Drive, Direc, Fname, Ftype); } else - _makepath(Fpath, Drive, Direc, Fname, Ftype); // Usefull ??? + _makepath(Fpath, Drive, Direc, Fname, Ftype); // Usefull for TDBSDR return Fpath; #else // !__WIN__ if (!Done) { - PlugSetPath(Fpath, To_File, ((PTABDEF)To_Def)->GetPath()); + PlugSetPath(Fpath, To_File, defp ? defp->GetPath() : NULL); _splitpath(Fpath, NULL, Direc, Fname, Ftype); strcat(strcpy(Pattern, Fname), Ftype); Done = true; @@ -709,23 +708,48 @@ PCOL TDBDIR::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) int TDBDIR::GetMaxSize(PGLOBAL g) { if (MaxSize < 0) { - int n = -1; + int rc, n = -1; #if defined(__WIN__) - int h; // Start searching files in the target directory. - h = _findfirst(Path(g), &FileData); + hSearch = FindFirstFile(Path(g), &FileData); - if (h != -1) { - for (n = 1;; n++) - if (_findnext(h, &FileData)) - break; + if (hSearch == INVALID_HANDLE_VALUE) { + rc = GetLastError(); - // Close the search handle. - _findclose(h); - } else - n = 0; + if (rc != ERROR_FILE_NOT_FOUND) { + char buf[512]; + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, GetLastError(), 0, (LPTSTR)&buf, sizeof(buf), NULL); + sprintf(g->Message, MSG(BAD_FILE_HANDLE), buf); + return -1; + } // endif rc + + return 0; + } // endif hSearch + + while (true) { + if (!(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + n++; + + if (!FindNextFile(hSearch, &FileData)) { + rc = GetLastError(); + + if (rc != ERROR_NO_MORE_FILES) { + sprintf(g->Message, MSG(NEXT_FILE_ERROR), rc); + FindClose(hSearch); + return -1; + } // endif rc + + break; + } // endif Next + + } // endwhile + + // Close the search handle. + FindClose(hSearch); #else // !__WIN__ Path(g); @@ -791,30 +815,35 @@ int TDBDIR::ReadDB(PGLOBAL g) int rc = RC_OK; #if defined(__WIN__) - if (Hsearch == -1) { - /*******************************************************************/ - /* Start searching files in the target directory. The use of the */ - /* Path function is required when called from TDBSDR. */ - /*******************************************************************/ - Hsearch = _findfirst(Path(g), &FileData); + do { + if (hSearch == INVALID_HANDLE_VALUE) { + /*****************************************************************/ + /* Start searching files in the target directory. The use of */ + /* the Path function is required when called from TDBSDR. */ + /*****************************************************************/ + hSearch = FindFirstFile(Path(g), &FileData); - if (Hsearch == -1) - rc = RC_EF; - else - iFile++; + if (hSearch == INVALID_HANDLE_VALUE) { + rc = RC_EF; + break; + } else + iFile++; - } else { - if (_findnext(Hsearch, &FileData)) { - // Restore file name and type pattern - _splitpath(To_File, NULL, NULL, Fname, Ftype); - rc = RC_EF; - } else - iFile++; + } else { + if (!FindNextFile(hSearch, &FileData)) { + // Restore file name and type pattern + _splitpath(To_File, NULL, NULL, Fname, Ftype); + rc = RC_EF; + break; + } else + iFile++; - } // endif Hsearch + } // endif hSearch + + } while (Nodir && FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY); if (rc == RC_OK) - _splitpath(FileData.name, NULL, NULL, Fname, Ftype); + _splitpath(FileData.cFileName, NULL, NULL, Fname, Ftype); #else // !Win32 rc = RC_NF; @@ -878,8 +907,8 @@ void TDBDIR::CloseDB(PGLOBAL) { #if defined(__WIN__) // Close the search handle. - _findclose(Hsearch); - Hsearch = -1; + FindClose(hSearch); + hSearch = INVALID_HANDLE_VALUE; #else // !__WIN__ // Close the DIR handle if (Dir) { @@ -895,7 +924,7 @@ void TDBDIR::CloseDB(PGLOBAL) /***********************************************************************/ /* DIRCOL public constructor. */ /***********************************************************************/ -DIRCOL::DIRCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ) +DIRCOL::DIRCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ) : COLBLK(cdp, tdbp, i) { if (cprec) { @@ -907,6 +936,7 @@ DIRCOL::DIRCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ) } // endif cprec // Set additional DIR access method information for column. + Tdbp = (PTDBDIR)tdbp; N = cdp->GetOffset(); } // end of DIRCOL constructor @@ -916,74 +946,83 @@ DIRCOL::DIRCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ) /***********************************************************************/ DIRCOL::DIRCOL(DIRCOL *col1, PTDB tdbp) : COLBLK(col1, tdbp) { - N = col1->N; + Tdbp = (PTDBDIR)tdbp; + N = col1->N; } // end of DIRCOL copy constructor +#if defined(__WIN__) +/***********************************************************************/ +/* Retrieve time information from FileData. */ +/***********************************************************************/ +void DIRCOL::SetTimeValue(PGLOBAL g, FILETIME& ftime) +{ + char tsp[24]; + SYSTEMTIME stp; + + if (FileTimeToSystemTime(&ftime, &stp)) { + sprintf(tsp, "%04d-%02d-%02d %02d:%02d:%02d", + stp.wYear, stp.wMonth, stp.wDay, stp.wHour, stp.wMinute, stp.wSecond); + + if (Value->GetType() != TYPE_STRING) { + if (!Tdbp->Dvalp) + Tdbp->Dvalp = AllocateValue(g, TYPE_DATE, 20, 0, false, + "YYYY-MM-DD hh:mm:ss"); + + Tdbp->Dvalp->SetValue_psz(tsp); + Value->SetValue_pval(Tdbp->Dvalp); + } else + Value->SetValue_psz(tsp); + + } else + Value->Reset(); + +} // end of SetTimeValue +#endif // __WIN__ + /***********************************************************************/ /* ReadColumn: what this routine does is to access the information */ /* corresponding to this column and convert it to buffer type. */ /***********************************************************************/ void DIRCOL::ReadColumn(PGLOBAL g) - { - PTDBDIR tdbp = (PTDBDIR)To_Tdb; - + { if (trace) htrc("DIR ReadColumn: col %s R%d use=%.4X status=%.4X type=%d N=%d\n", - Name, tdbp->GetTdb_No(), ColUse, Status, Buf_Type, N); + Name, Tdbp->GetTdb_No(), ColUse, Status, Buf_Type, N); /*********************************************************************/ /* Retrieve the information corresponding to the column number. */ /*********************************************************************/ switch (N) { #if defined(__WIN__) - case 0: Value->SetValue_psz(tdbp->Drive); break; + case 0: Value->SetValue_psz(Tdbp->Drive); break; #endif // __WIN__ - case 1: Value->SetValue_psz(tdbp->Direc); break; - case 2: Value->SetValue_psz(tdbp->Fname); break; - case 3: Value->SetValue_psz(tdbp->Ftype); break; + case 1: Value->SetValue_psz(Tdbp->Direc); break; + case 2: Value->SetValue_psz(Tdbp->Fname); break; + case 3: Value->SetValue_psz(Tdbp->Ftype); break; #if defined(__WIN__) - case 4: Value->SetValue((int)tdbp->FileData.attrib); break; - case 5: Value->SetValue((int)tdbp->FileData.size); break; - case 6: Value->SetValue((int)tdbp->FileData.time_write); break; - case 7: Value->SetValue((int)tdbp->FileData.time_create); break; - case 8: Value->SetValue((int)tdbp->FileData.time_access); break; + case 4: Value->SetValue((int)Tdbp->FileData.dwFileAttributes); break; + case 5: Value->SetValue((int)Tdbp->FileData.nFileSizeLow); break; + case 6: SetTimeValue(g, Tdbp->FileData.ftLastWriteTime); break; + case 7: SetTimeValue(g, Tdbp->FileData.ftCreationTime); break; + case 8: SetTimeValue(g, Tdbp->FileData.ftLastAccessTime); break; #else // !__WIN__ - case 4: Value->SetValue((int)tdbp->Fileinfo.st_mode); break; - case 5: Value->SetValue((int)tdbp->Fileinfo.st_size); break; - case 6: Value->SetValue((int)tdbp->Fileinfo.st_mtime); break; - case 7: Value->SetValue((int)tdbp->Fileinfo.st_ctime); break; - case 8: Value->SetValue((int)tdbp->Fileinfo.st_atime); break; - case 9: Value->SetValue((int)tdbp->Fileinfo.st_uid); break; - case 10: Value->SetValue((int)tdbp->Fileinfo.st_gid); break; + case 4: Value->SetValue((int)Tdbp->Fileinfo.st_mode); break; + case 5: Value->SetValue((int)Tdbp->Fileinfo.st_size); break; + case 6: Value->SetValue((int)Tdbp->Fileinfo.st_mtime); break; + case 7: Value->SetValue((int)Tdbp->Fileinfo.st_ctime); break; + case 8: Value->SetValue((int)Tdbp->Fileinfo.st_atime); break; + case 9: Value->SetValue((int)Tdbp->Fileinfo.st_uid); break; + case 10: Value->SetValue((int)Tdbp->Fileinfo.st_gid); break; #endif // !__WIN__ default: sprintf(g->Message, MSG(INV_DIRCOL_OFST), N); - longjmp(g->jumper[g->jump_level], GetAmType()); - } // endswitch N + throw GetAmType(); + } // endswitch N } // end of ReadColumn /* ------------------------- Class TDBSDR ---------------------------- */ -/***********************************************************************/ -/* TABSDR copy constructors. */ -/***********************************************************************/ -TDBSDR::TDBSDR(PTDBSDR tdbp) : TDBDIR(tdbp) - { - Sub = tdbp->Sub; - } // end of TDBSDR copy constructor - -// Method -PTDB TDBSDR::Clone(PTABS t) - { - PTDB tp; - PGLOBAL g = t->G; // Is this really useful ??? - - tp = new(g) TDBSDR(this); - tp->SetColumns(Columns); - return tp; - } // end of Clone - /***********************************************************************/ /* SDR GetMaxSize: returns the number of retrieved files. */ /***********************************************************************/ @@ -998,47 +1037,124 @@ int TDBSDR::GetMaxSize(PGLOBAL g) } // end of GetMaxSize /***********************************************************************/ -/* SDR GetMaxSize: returns the number of retrieved files. */ +/* SDR FindInDir: returns the number of retrieved files. */ /***********************************************************************/ int TDBSDR::FindInDir(PGLOBAL g) { - int n = 0; + int rc, n = 0; size_t m = strlen(Direc); // Start searching files in the target directory. #if defined(__WIN__) - int h = _findfirst(Path(g), &FileData); + HANDLE h; - if (h != -1) { - for (n = 1;; n++) - if (_findnext(h, &FileData)) - break; +#if defined(PATHMATCHSPEC) + if (!*Drive) + Path(g); - // Close the search handle. - _findclose(h); - } // endif h + _makepath(Fpath, Drive, Direc, "*", "*"); - // Now search files in sub-directories. - _makepath(Fpath, Drive, Direc, "*", ""); - h = _findfirst(Fpath, &FileData); + h = FindFirstFile(Fpath, &FileData); - if (h != -1) { - while (true) { - if (FileData.attrib & _A_SUBDIR && *FileData.name != '.') { - // Look in the name sub-directory - strcat(strcat(Direc, FileData.name), "\\"); - n += FindInDir(g); - Direc[m] = '\0'; // Restore path - } // endif SUBDIR + if (h == INVALID_HANDLE_VALUE) { + rc = GetLastError(); - if (_findnext(h, &FileData)) - break; + if (rc != ERROR_FILE_NOT_FOUND) { + char buf[512]; - } // endwhile + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, GetLastError(), 0, (LPTSTR)&buf, sizeof(buf), NULL); + sprintf(g->Message, MSG(BAD_FILE_HANDLE), buf); + return -1; + } // endif rc - // Close the search handle. - _findclose(h); - } // endif h + return 0; + } // endif h + + while (true) { + if ((FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && + *FileData.cFileName != '.') { + // Look in the name sub-directory + strcat(strcat(Direc, FileData.cFileName), "/"); + n += FindInDir(g); + Direc[m] = '\0'; // Restore path + } else if (PathMatchSpec(FileData.cFileName, Fpath)) + n++; + + if (!FindNextFile(h, &FileData)) { + rc = GetLastError(); + + if (rc != ERROR_NO_MORE_FILES) { + sprintf(g->Message, MSG(NEXT_FILE_ERROR), rc); + FindClose(h); + return -1; + } // endif rc + + break; + } // endif Next + + } // endwhile +#else // !PATHMATCHSPEC + h = FindFirstFile(Path(g), &FileData); + + if (h == INVALID_HANDLE_VALUE) { + rc = GetLastError(); + + if (rc != ERROR_FILE_NOT_FOUND) { + char buf[512]; + + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, GetLastError(), 0, (LPTSTR)&buf, sizeof(buf), NULL); + sprintf(g->Message, MSG(BAD_FILE_HANDLE), buf); + return -1; + } // endif rc + + return 0; + } // endif hSearch + + while (true) { + n++; + + if (!FindNextFile(h, &FileData)) { + rc = GetLastError(); + + if (rc != ERROR_NO_MORE_FILES) { + sprintf(g->Message, MSG(NEXT_FILE_ERROR), rc); + FindClose(h); + return -1; + } // endif rc + + break; + } // endif Next + + } // endwhile + + // Now search files in sub-directories. + _makepath(Fpath, Drive, Direc, "*", "."); + h = FindFirstFile(Fpath, &FileData); + + if (h != INVALID_HANDLE_VALUE) { + while (true) { + if ((FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && + *FileData.cFileName != '.') { + // Look in the name sub-directory + strcat(strcat(Direc, FileData.cFileName), "/"); + n += FindInDir(g); + Direc[m] = '\0'; // Restore path + } // endif SUBDIR + + if (!FindNextFile(h, &FileData)) + break; + + } // endwhile + + } // endif h +#endif // !PATHMATCHSPEC + + // Close the search handle. + FindClose(h); #else // !__WIN__ int k; DIR *dir = opendir(Direc); @@ -1090,7 +1206,7 @@ bool TDBSDR::OpenDB(PGLOBAL g) Sub->Next = NULL; Sub->Prev = NULL; #if defined(__WIN__) - Sub->H = -1; + Sub->H = INVALID_HANDLE_VALUE; Sub->Len = strlen(Direc); #else // !__WIN__ Sub->D = NULL; @@ -1116,18 +1232,22 @@ int TDBSDR::ReadDB(PGLOBAL g) // Are there more files in sub-directories retry: do { - if (Sub->H == -1) { - _makepath(Fpath, Drive, Direc, "*", ""); - Sub->H = _findfirst(Fpath, &FileData); - } else if (_findnext(Sub->H, &FileData)) { - _findclose(Sub->H); - Sub->H = -1; - *FileData.name = '\0'; - } // endif findnext + if (Sub->H == INVALID_HANDLE_VALUE) { +// _makepath(Fpath, Drive, Direc, "*", "."); why was this made? + _makepath(Fpath, Drive, Direc, "*", NULL); + Sub->H = FindFirstFile(Fpath, &FileData); + } else if (!FindNextFile(Sub->H, &FileData)) { + FindClose(Sub->H); + Sub->H = INVALID_HANDLE_VALUE; + *FileData.cFileName= '\0'; + break; + } // endif findnext - } while(*FileData.name == '.'); + } while(!(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || + (*FileData.cFileName == '.' && + (!FileData.cFileName[1] || FileData.cFileName[1] == '.'))); - if (Sub->H == -1) { + if (Sub->H == INVALID_HANDLE_VALUE) { // No more sub-directories. Are we in a sub-directory? if (!Sub->Prev) return rc; // No, all is finished @@ -1145,17 +1265,17 @@ int TDBSDR::ReadDB(PGLOBAL g) sup = (PSUBDIR)PlugSubAlloc(g, NULL, sizeof(SUBDIR)); sup->Next = NULL; sup->Prev = Sub; - sup->H = -1; + sup->H = INVALID_HANDLE_VALUE; Sub->Next = sup; } // endif Next Sub = Sub->Next; - strcat(strcat(Direc, FileData.name), "\\"); + strcat(strcat(Direc, FileData.cFileName), "/"); Sub->Len = strlen(Direc); // Reset Hsearch used by TDBDIR::ReadDB - _findclose(Hsearch); - Hsearch = -1; + FindClose(hSearch); + hSearch = INVALID_HANDLE_VALUE; goto again; } // endif H @@ -1179,7 +1299,8 @@ int TDBSDR::ReadDB(PGLOBAL g) if (lstat(Fpath, &Fileinfo) < 0) { sprintf(g->Message, "%s: %s", Fpath, strerror(errno)); rc = RC_FX; - } else if (S_ISDIR(Fileinfo.st_mode) && *Entry->d_name != '.') { + } else if (S_ISDIR(Fileinfo.st_mode) && strcmp(Entry->d_name, ".") + && strcmp(Entry->d_name, "..")) { // Look in the name sub-directory if (!Sub->Next) { PSUBDIR sup; @@ -1423,8 +1544,8 @@ void TDBDHR::CloseDB(PGLOBAL g) // Close the search handle. if (!FindClose(Hsearch)) { strcpy(g->Message, MSG(SRCH_CLOSE_ERR)); - longjmp(g->jumper[g->jump_level], GetAmType()); - } // endif FindClose + throw GetAmType(); + } // endif FindClose iFile = 0; Hsearch = INVALID_HANDLE_VALUE; @@ -1435,8 +1556,8 @@ void TDBDHR::CloseDB(PGLOBAL g) /***********************************************************************/ /* DHRCOL public constructor. */ /***********************************************************************/ -DHRCOL::DHRCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am) - : COLBLK(cdp, tdbp, i) +DHRCOL::DHRCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am) + : COLBLK(cdp, tdbp, i) { if (cprec) { Next = cprec->GetNext(); diff --git a/storage/connect/tabmul.h b/storage/connect/tabmul.h index 51fa7f9000a..8a95a772c41 100644 --- a/storage/connect/tabmul.h +++ b/storage/connect/tabmul.h @@ -39,7 +39,7 @@ class DllExport TDBMUL : public TDBASE { virtual void ResetDB(void); virtual PTDB Clone(PTABS t); virtual bool IsSame(PTDB tp) {return tp == (PTDB)Tdbp;} - virtual PSZ GetFile(PGLOBAL g) {return Tdbp->GetFile(g);} + virtual PCSZ GetFile(PGLOBAL g) {return Tdbp->GetFile(g);} virtual int GetRecpos(void) {return 0;} virtual PCOL ColDB(PGLOBAL g, PSZ name, int num); bool InitFileNames(PGLOBAL g); @@ -69,6 +69,34 @@ class DllExport TDBMUL : public TDBASE { int iFile; // Index of currently processed file }; // end of class TDBMUL +#if 0 +/***********************************************************************/ +/* This is the MSD Access Method class declaration for files that are */ +/* physically split in multiple files having the same format. */ +/* This sub-class also include files of the sub-directories. */ +/***********************************************************************/ +class DllExport TDBMSD : public TDBMUL { + //friend class MULCOL; +public: + // Constructor + TDBMSD(PTDB tdbp) : TDBMUL(tdbp) {} + TDBMSD(PTDBMSD tdbp) : TDBMUL(tdbp) {} + + // Implementation + virtual PTDB Duplicate(PGLOBAL g); + + // Methods + virtual PTDB Clone(PTABS t); + bool InitFileNames(PGLOBAL g); + + // Database routines + +protected: + + // Members +}; // end of class TDBMSD +#endif + /***********************************************************************/ /* Directory listing table. */ /***********************************************************************/ @@ -90,7 +118,8 @@ class DllExport DIRDEF : public TABDEF { /* Directory listing table */ // Members PSZ Fn; /* Path/Name of file search */ bool Incl; /* true to include sub-directories */ - bool Huge; /* true if files can be larger than 2GB */ + bool Huge; /* true if files can be larger than 2GB */ + bool Nodir; /* true to exclude directories */ }; // end of DIRDEF /***********************************************************************/ @@ -101,18 +130,16 @@ class DllExport DIRDEF : public TABDEF { /* Directory listing table */ /***********************************************************************/ class TDBDIR : public TDBASE { friend class DIRCOL; - public: + friend class TDBMUL; +public: // Constructor TDBDIR(PDIRDEF tdp); - TDBDIR(PTDBDIR tdbp); + TDBDIR(PSZ fpat); // Implementation virtual AMT GetAmType(void) {return TYPE_AM_DIR;} - virtual PTDB Duplicate(PGLOBAL g) - {return (PTDB)new(g) TDBDIR(this);} // Methods - virtual PTDB Clone(PTABS t); virtual int GetRecpos(void) {return iFile;} // Database routines @@ -127,14 +154,16 @@ class TDBDIR : public TDBASE { virtual void CloseDB(PGLOBAL g); protected: + void Init(void); char *Path(PGLOBAL g); // Members PSZ To_File; // Points to file search pathname int iFile; // Index of currently retrieved file #if defined(__WIN__) - _finddata_t FileData; // Find data structure - intptr_t Hsearch; // Search handle + PVAL Dvalp; // Used to retrieve file date values + WIN32_FIND_DATA FileData; // Find data structure + HANDLE hSearch; // Search handle char Drive[_MAX_DRIVE]; // Drive name #else // !__WIN__ struct stat Fileinfo; // File info structure @@ -147,6 +176,7 @@ class TDBDIR : public TDBASE { char Direc[_MAX_DIR]; // Search path char Fname[_MAX_FNAME]; // File name char Ftype[_MAX_EXT]; // File extention + bool Nodir; // Exclude directories from file list }; // end of class TDBDIR /***********************************************************************/ @@ -158,17 +188,11 @@ class TDBDIR : public TDBASE { /***********************************************************************/ class TDBSDR : public TDBDIR { friend class DIRCOL; + friend class TDBMUL; public: // Constructors TDBSDR(PDIRDEF tdp) : TDBDIR(tdp) {Sub = NULL;} - TDBSDR(PTDBSDR tdbp); - - // Implementation - virtual PTDB Duplicate(PGLOBAL g) - {return (PTDB)new(g) TDBSDR(this);} - - // Methods - virtual PTDB Clone(PTABS t); + TDBSDR(PSZ fpat) : TDBDIR(fpat) {Sub = NULL;} // Database routines virtual int GetMaxSize(PGLOBAL g); @@ -184,7 +208,7 @@ class TDBSDR : public TDBDIR { struct _Sub_Dir *Next; struct _Sub_Dir *Prev; #if defined(__WIN__) - intptr_t H; // Search handle + HANDLE H; // Search handle #else // !__WIN__ DIR *D; #endif // !__WIN__ @@ -202,7 +226,7 @@ class TDBSDR : public TDBDIR { class DIRCOL : public COLBLK { public: // Constructors - DIRCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am = "DIR"); + DIRCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "DIR"); DIRCOL(DIRCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation @@ -214,7 +238,11 @@ class DIRCOL : public COLBLK { protected: // Default constructor not to be used DIRCOL(void) {} +#if defined(__WIN__) + void SetTimeValue(PGLOBAL g, FILETIME& ftime); +#endif // __WIN__ // Members + PTDBDIR Tdbp; // To DIR table int N; // Column number }; // end of class DIRCOL diff --git a/storage/connect/tabmysql.cpp b/storage/connect/tabmysql.cpp index 1a715819fc8..bdddcf64ca8 100644 --- a/storage/connect/tabmysql.cpp +++ b/storage/connect/tabmysql.cpp @@ -68,8 +68,8 @@ void PrintResult(PGLOBAL, PSEM, PQRYRES); #endif // _CONSOLE // Used to check whether a MYSQL table is created on itself -bool CheckSelf(PGLOBAL g, TABLE_SHARE *s, const char *host, - const char *db, char *tab, const char *src, int port); +bool CheckSelf(PGLOBAL g, TABLE_SHARE *s, PCSZ host, PCSZ db, + PCSZ tab, PCSZ src, int port); /***********************************************************************/ /* External function. */ @@ -125,7 +125,7 @@ bool MYSQLDEF::GetServerInfo(PGLOBAL g, const char *server_name) } // endif server DBUG_PRINT("info", ("get_server_by_name returned server at %lx", - (long unsigned int) server)); + (size_t) server)); // TODO: We need to examine which of these can really be NULL Hostname = PlugDup(g, server->host); @@ -183,19 +183,22 @@ bool MYSQLDEF::GetServerInfo(PGLOBAL g, const char *server_name) /***********************************************************************/ bool MYSQLDEF::ParseURL(PGLOBAL g, char *url, bool b) { + char *tabn, *pwd, *schema; + if ((!strstr(url, "://") && (!strchr(url, '@')))) { // No :// or @ in connection string. Must be a straight // connection name of either "server" or "server/table" // ok, so we do a little parsing, but not completely! - if ((Tabname= strchr(url, '/'))) { + if ((tabn= strchr(url, '/'))) { // If there is a single '/' in the connection string, // this means the user is specifying a table name - *Tabname++= '\0'; + *tabn++= '\0'; // there better not be any more '/'s ! - if (strchr(Tabname, '/')) + if (strchr(tabn, '/')) return true; + Tabname = tabn; } else // Otherwise, straight server name, Tabname = (b) ? GetStringCatInfo(g, "Tabname", Name) : NULL; @@ -223,7 +226,7 @@ bool MYSQLDEF::ParseURL(PGLOBAL g, char *url, bool b) Username += 3; - if (!(Hostname = strchr(Username, '@'))) { + if (!(Hostname = (char*)strchr(Username, '@'))) { strcpy(g->Message, "No host specified in URL"); return true; } else { @@ -231,11 +234,11 @@ bool MYSQLDEF::ParseURL(PGLOBAL g, char *url, bool b) Server = Hostname; } // endif Hostname - if ((Password = strchr(Username, ':'))) { - *Password++ = 0; // End username + if ((pwd = (char*)strchr(Username, ':'))) { + *pwd++ = 0; // End username - // Make sure there isn't an extra / or @ - if ((strchr(Password, '/') || strchr(Hostname, '@'))) { + // Make sure there isn't an extra / + if (strchr(pwd, '/')) { strcpy(g->Message, "Syntax error in URL"); return true; } // endif @@ -243,8 +246,10 @@ bool MYSQLDEF::ParseURL(PGLOBAL g, char *url, bool b) // Found that if the string is: // user:@hostname:port/db/table // Then password is a null string, so set to NULL - if ((Password[0] == 0)) - Password = NULL; + if ((pwd[0] == 0)) + Password = NULL; + else + Password = pwd; } // endif password @@ -254,21 +259,23 @@ bool MYSQLDEF::ParseURL(PGLOBAL g, char *url, bool b) return true; } // endif - if ((Tabschema = strchr(Hostname, '/'))) { - *Tabschema++ = 0; + if ((schema = strchr(Hostname, '/'))) { + *schema++ = 0; - if ((Tabname = strchr(Tabschema, '/'))) { - *Tabname++ = 0; + if ((tabn = strchr(schema, '/'))) { + *tabn++ = 0; // Make sure there's not an extra / - if ((strchr(Tabname, '/'))) { + if ((strchr(tabn, '/'))) { strcpy(g->Message, "Syntax error in URL"); return true; } // endif / + Tabname = tabn; } // endif TableName - } // endif database + Tabschema = schema; + } // endif database if ((sport = strchr(Hostname, ':'))) *sport++ = 0; @@ -349,7 +356,7 @@ bool MYSQLDEF::DefineAM(PGLOBAL g, LPCSTR am, int) Portnumber = GetIntCatInfo("Port", GetDefaultPort()); Server = Hostname; } else { - char *locdb = Tabschema; + PCSZ locdb = Tabschema; if (ParseURL(g, url)) return true; @@ -495,11 +502,11 @@ PCOL TDBMYSQL::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) /* filter should be removed from column list. */ /***********************************************************************/ bool TDBMYSQL::MakeSelect(PGLOBAL g, bool mx) - { +{ //char *tk = "`"; char tk = '`'; int len = 0, rank = 0; - bool b = false, oom = false; + bool b = false; PCOL colp; //PDBUSER dup = PlgGetUser(g); @@ -526,13 +533,13 @@ bool TDBMYSQL::MakeSelect(PGLOBAL g, bool mx) for (colp = Columns; colp; colp = colp->GetNext()) if (!colp->IsSpecial()) { if (b) - oom |= Query->Append(", "); + Query->Append(", "); else b = true; - oom |= Query->Append(tk); - oom |= Query->Append(colp->GetName()); - oom |= Query->Append(tk); + Query->Append(tk); + Query->Append(colp->GetName()); + Query->Append(tk); ((PMYCOL)colp)->Rank = rank++; } // endif colp @@ -542,22 +549,22 @@ bool TDBMYSQL::MakeSelect(PGLOBAL g, bool mx) // Query '*' from... // (the use of a char constant minimize the result storage) if (Isview) - oom |= Query->Append('*'); + Query->Append('*'); else - oom |= Query->Append("'*'"); + Query->Append("'*'"); } // endif ncol - oom |= Query->Append(" FROM "); - oom |= Query->Append(tk); - oom |= Query->Append(TableName); - oom |= Query->Append(tk); + Query->Append(" FROM "); + Query->Append(tk); + Query->Append(TableName); + Query->Append(tk); len = Query->GetLength(); if (To_CondFil) { if (!mx) { - oom |= Query->Append(" WHERE "); - oom |= Query->Append(To_CondFil->Body); + Query->Append(" WHERE "); + Query->Append(To_CondFil->Body); len = Query->GetLength() + 1; } else len += (strlen(To_CondFil->Body) + 256); @@ -565,25 +572,25 @@ bool TDBMYSQL::MakeSelect(PGLOBAL g, bool mx) } else len += (mx ? 256 : 1); - if (oom || Query->Resize(len)) { + if (Query->IsTruncated() || Query->Resize(len)) { strcpy(g->Message, "MakeSelect: Out of memory"); return true; - } // endif oom + } // endif Query if (trace) htrc("Query=%s\n", Query->GetStr()); return false; - } // end of MakeSelect +} // end of MakeSelect /***********************************************************************/ /* MakeInsert: make the Insert statement used with MySQL connection. */ /***********************************************************************/ bool TDBMYSQL::MakeInsert(PGLOBAL g) { - char *tk = "`"; + const char *tk = "`"; uint len = 0; - bool b = false, oom; + bool oom, b = false; PCOL colp; if (Query) @@ -622,38 +629,38 @@ bool TDBMYSQL::MakeInsert(PGLOBAL g) Query = new(g) STRING(g, len); if (Delayed) - oom = Query->Set("INSERT DELAYED INTO "); + Query->Set("INSERT DELAYED INTO "); else - oom = Query->Set("INSERT INTO "); + Query->Set("INSERT INTO "); - oom |= Query->Append(tk); - oom |= Query->Append(TableName); - oom |= Query->Append("` ("); + Query->Append(tk); + Query->Append(TableName); + Query->Append("` ("); for (colp = Columns; colp; colp = colp->GetNext()) { if (b) - oom |= Query->Append(", "); + Query->Append(", "); else b = true; - oom |= Query->Append(tk); - oom |= Query->Append(colp->GetName()); - oom |= Query->Append(tk); + Query->Append(tk); + Query->Append(colp->GetName()); + Query->Append(tk); } // endfor colp - oom |= Query->Append(") VALUES ("); + Query->Append(") VALUES ("); #if defined(MYSQL_PREPARED_STATEMENTS) if (Prep) { for (int i = 0; i < Nparm; i++) - oom |= Query->Append("?,"); + Query->Append("?,"); Query->RepLast(')'); Query->Trim(); } // endif Prep #endif // MYSQL_PREPARED_STATEMENTS - if (oom) + if ((oom = Query->IsTruncated())) strcpy(g->Message, "MakeInsert: Out of memory"); return oom; @@ -684,18 +691,18 @@ bool TDBMYSQL::MakeCommand(PGLOBAL g) strlwr(strcpy(name, Name)); // Not a keyword if ((p = strstr(qrystr, name))) { - bool oom = Query->Set(Qrystr, p - qrystr); + Query->Set(Qrystr, p - qrystr); if (qtd && *(p-1) == ' ') { - oom |= Query->Append('`'); - oom |= Query->Append(TableName); - oom |= Query->Append('`'); + Query->Append('`'); + Query->Append(TableName); + Query->Append('`'); } else - oom |= Query->Append(TableName); + Query->Append(TableName); - oom |= Query->Append(Qrystr + (p - qrystr) + strlen(name)); + Query->Append(Qrystr + (p - qrystr) + strlen(name)); - if (oom) { + if (Query->IsTruncated()) { strcpy(g->Message, "MakeCommand: Out of memory"); return true; } else @@ -1096,7 +1103,7 @@ bool TDBMYSQL::ReadKey(PGLOBAL g, OPVAL op, const key_range *kr) To_CondFil->Body= (char*)PlugSubAlloc(g, NULL, 0); *To_CondFil->Body= 0; - if ((To_CondFil = hc->CheckCond(g, To_CondFil, To_CondFil->Cond))) + if ((To_CondFil = hc->CheckCond(g, To_CondFil, Cond))) PlugSubAlloc(g, NULL, strlen(To_CondFil->Body) + 1); } // endif active_index @@ -1161,24 +1168,23 @@ int TDBMYSQL::WriteDB(PGLOBAL g) int rc; uint len = Query->GetLength(); char buf[64]; - bool oom = false; // Make the Insert command value list for (PCOL colp = Columns; colp; colp = colp->GetNext()) { if (!colp->GetValue()->IsNull()) { if (colp->GetResultType() == TYPE_STRING || colp->GetResultType() == TYPE_DATE) - oom |= Query->Append_quoted(colp->GetValue()->GetCharString(buf)); + Query->Append_quoted(colp->GetValue()->GetCharString(buf)); else - oom |= Query->Append(colp->GetValue()->GetCharString(buf)); + Query->Append(colp->GetValue()->GetCharString(buf)); } else - oom |= Query->Append("NULL"); + Query->Append("NULL"); - oom |= Query->Append(','); + Query->Append(','); } // endfor colp - if (unlikely(oom)) { + if (unlikely(Query->IsTruncated())) { strcpy(g->Message, "WriteDB: Out of memory"); rc = RC_FX; } else { @@ -1186,7 +1192,7 @@ int TDBMYSQL::WriteDB(PGLOBAL g) Myc.m_Rows = -1; // To execute the query rc = Myc.ExecSQL(g, Query->GetStr()); Query->Truncate(len); // Restore query - } // endif oom + } // endif Query return (rc == RC_NF) ? RC_OK : rc; // RC_NF is Ok } // end of WriteDB @@ -1234,7 +1240,7 @@ void TDBMYSQL::CloseDB(PGLOBAL g) /***********************************************************************/ /* MYSQLCOL public constructor. */ /***********************************************************************/ -MYSQLCOL::MYSQLCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am) +MYSQLCOL::MYSQLCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am) : COLBLK(cdp, tdbp, i) { if (cprec) { @@ -1260,7 +1266,7 @@ MYSQLCOL::MYSQLCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am) /***********************************************************************/ /* MYSQLCOL public constructor. */ /***********************************************************************/ -MYSQLCOL::MYSQLCOL(MYSQL_FIELD *fld, PTDB tdbp, int i, PSZ am) +MYSQLCOL::MYSQLCOL(MYSQL_FIELD *fld, PTDB tdbp, int i, PCSZ am) : COLBLK(NULL, tdbp, i) { const char *chset = get_charset_name(fld->charsetnr); @@ -1407,8 +1413,8 @@ void MYSQLCOL::ReadColumn(PGLOBAL g) if (rc == RC_EF) sprintf(g->Message, MSG(INV_DEF_READ), rc); - longjmp(g->jumper[g->jump_level], 11); - } else + throw 11; + } else tdbp->Fetched = true; if ((buf = ((PTDBMY)To_Tdb)->Myc.GetCharField(Rank))) { @@ -1669,7 +1675,7 @@ int TDBMYEXC::WriteDB(PGLOBAL g) /***********************************************************************/ /* MYXCOL public constructor. */ /***********************************************************************/ -MYXCOL::MYXCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am) +MYXCOL::MYXCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am) : MYSQLCOL(cdp, tdbp, cprec, i, am) { // Set additional EXEC MYSQL access method information for column. @@ -1679,7 +1685,7 @@ MYXCOL::MYXCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am) /***********************************************************************/ /* MYSQLCOL public constructor. */ /***********************************************************************/ -MYXCOL::MYXCOL(MYSQL_FIELD *fld, PTDB tdbp, int i, PSZ am) +MYXCOL::MYXCOL(MYSQL_FIELD *fld, PTDB tdbp, int i, PCSZ am) : MYSQLCOL(fld, tdbp, i, am) { if (trace) diff --git a/storage/connect/tabmysql.h b/storage/connect/tabmysql.h index 050fa59259b..3c37ae5bf3b 100644 --- a/storage/connect/tabmysql.h +++ b/storage/connect/tabmysql.h @@ -86,7 +86,7 @@ class TDBMYSQL : public TDBEXT { virtual void ResetDB(void) {N = 0;} virtual int RowNumber(PGLOBAL g, bool b = false); virtual bool IsView(void) {return Isview;} - virtual PSZ GetServer(void) {return Server;} + virtual PCSZ GetServer(void) {return Server;} void SetDatabase(LPCSTR db) {Schema = (char*)db;} // Schema routines @@ -109,7 +109,7 @@ class TDBMYSQL : public TDBEXT { // Internal functions bool MakeSelect(PGLOBAL g, bool mx); bool MakeInsert(PGLOBAL g); - int BindColumns(PGLOBAL g); + int BindColumns(PGLOBAL g __attribute__((unused))); virtual bool MakeCommand(PGLOBAL g); //int MakeUpdate(PGLOBAL g); //int MakeDelete(PGLOBAL g); @@ -146,8 +146,8 @@ class MYSQLCOL : public COLBLK { friend class TDBMYSQL; public: // Constructors - MYSQLCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am = "MYSQL"); - MYSQLCOL(MYSQL_FIELD *fld, PTDB tdbp, int i, PSZ am = "MYSQL"); + MYSQLCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "MYSQL"); + MYSQLCOL(MYSQL_FIELD *fld, PTDB tdbp, int i, PCSZ am = "MYSQL"); MYSQLCOL(MYSQLCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation @@ -215,8 +215,8 @@ class MYXCOL : public MYSQLCOL { friend class TDBMYEXC; public: // Constructors - MYXCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am = "MYSQL"); - MYXCOL(MYSQL_FIELD *fld, PTDB tdbp, int i, PSZ am = "MYSQL"); + MYXCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "MYSQL"); + MYXCOL(MYSQL_FIELD *fld, PTDB tdbp, int i, PCSZ am = "MYSQL"); MYXCOL(MYXCOL *colp, PTDB tdbp); // Constructor used in copy process // Methods @@ -242,10 +242,10 @@ class TDBMCL : public TDBCAT { virtual PQRYRES GetResult(PGLOBAL g); // Members - PSZ Host; // Host machine to use - PSZ Db; // Database to be used by server - PSZ Tab; // External table name - PSZ User; // User logon name - PSZ Pwd; // Password logon info - int Port; // MySQL port number (0 = default) + PCSZ Host; // Host machine to use + PCSZ Db; // Database to be used by server + PCSZ Tab; // External table name + PCSZ User; // User logon name + PCSZ Pwd; // Password logon info + int Port; // MySQL port number (0 = default) }; // end of class TDBMCL diff --git a/storage/connect/tabodbc.cpp b/storage/connect/tabodbc.cpp index 488acdd330d..8ffa234ba5c 100644 --- a/storage/connect/tabodbc.cpp +++ b/storage/connect/tabodbc.cpp @@ -1,11 +1,11 @@ /************* Tabodbc C++ Program Source Code File (.CPP) *************/ /* PROGRAM NAME: TABODBC */ /* ------------- */ -/* Version 3.1 */ +/* Version 3.2 */ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 2000-2016 */ +/* (C) Copyright to the author Olivier BERTRAND 2000-2017 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -116,47 +116,12 @@ bool ODBCDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) if (EXTDEF::DefineAM(g, am, poff)) return true; - // Tabname = GetStringCatInfo(g, "Name", - // (Catfunc & (FNC_TABLE | FNC_COL)) ? NULL : Name); - // Tabname = GetStringCatInfo(g, "Tabname", Tabname); - // Tabschema = GetStringCatInfo(g, "Dbname", NULL); - // Tabschema = GetStringCatInfo(g, "Schema", Tabschema); - // Tabcat = GetStringCatInfo(g, "Qualifier", NULL); - // Tabcat = GetStringCatInfo(g, "Catalog", Tabcat); - //Username = GetStringCatInfo(g, "User", NULL); - // Password = GetStringCatInfo(g, "Password", NULL); - - // if ((Srcdef = GetStringCatInfo(g, "Srcdef", NULL))) - // Read_Only = true; - - // Qrystr = GetStringCatInfo(g, "Query_String", "?"); - // Sep = GetStringCatInfo(g, "Separator", NULL); Catver = GetIntCatInfo("Catver", 2); - //Xsrc = GetBoolCatInfo("Execsrc", FALSE); - //Maxerr = GetIntCatInfo("Maxerr", 0); - //Maxres = GetIntCatInfo("Maxres", 0); - //Quoted = GetIntCatInfo("Quoted", 0); Options = ODBConn::noOdbcDialog; //Options = ODBConn::noOdbcDialog | ODBConn::useCursorLib; Cto= GetIntCatInfo("ConnectTimeout", DEFAULT_LOGIN_TIMEOUT); Qto= GetIntCatInfo("QueryTimeout", DEFAULT_QUERY_TIMEOUT); - - //if ((Scrollable = GetBoolCatInfo("Scrollable", false)) && !Elemt) - // Elemt = 1; // Cannot merge SQLFetch and SQLExtendedFetch - - //if (Catfunc == FNC_COL) - // Colpat = GetStringCatInfo(g, "Colpat", NULL); - - //if (Catfunc == FNC_TABLE) - // Tabtyp = GetStringCatInfo(g, "Tabtype", NULL); - UseCnc = GetBoolCatInfo("UseDSN", false); - - // Memory was Boolean, it is now integer - //if (!(Memory = GetIntCatInfo("Memory", 0))) - // Memory = GetBoolCatInfo("Memory", false) ? 1 : 0; - - //Pseudo = 2; // FILID is Ok but not ROWID return false; } // end of DefineAM @@ -210,59 +175,22 @@ TDBODBC::TDBODBC(PODEF tdp) : TDBEXT(tdp) if (tdp) { Connect = tdp->Connect; - //TableName = tdp->Tabname; - //Schema = tdp->Tabschema; Ops.User = tdp->Username; Ops.Pwd = tdp->Password; - //Catalog = tdp->Tabcat; - //Srcdef = tdp->Srcdef; - //Qrystr = tdp->Qrystr; - //Sep = tdp->GetSep(); - //Options = tdp->Options; Ops.Cto = tdp->Cto; Ops.Qto = tdp->Qto; - //Quoted = MY_MAX(0, tdp->GetQuoted()); - //Rows = tdp->GetElemt(); Catver = tdp->Catver; - //Memory = tdp->Memory; - //Scrollable = tdp->Scrollable; Ops.UseCnc = tdp->UseCnc; } else { Connect = NULL; - //TableName = NULL; - //Schema = NULL; Ops.User = NULL; Ops.Pwd = NULL; - //Catalog = NULL; - //Srcdef = NULL; - //Qrystr = NULL; - //Sep = 0; - //Options = 0; Ops.Cto = DEFAULT_LOGIN_TIMEOUT; Ops.Qto = DEFAULT_QUERY_TIMEOUT; - //Quoted = 0; - //Rows = 0; Catver = 0; - //Memory = 0; - //Scrollable = false; Ops.UseCnc = false; } // endif tdp - //Quote = NULL; - //Query = NULL; - //Count = NULL; -//Where = NULL; - //MulConn = NULL; - //DBQ = NULL; - //Qrp = NULL; - //Fpos = 0; - //Curpos = 0; - //AftRows = 0; - //CurNum = 0; - //Rbuf = 0; - //BufSize = 0; - //Nparm = 0; - //Placed = false; } // end of TDBODBC standard constructor TDBODBC::TDBODBC(PTDBODBC tdbp) : TDBEXT(tdbp) @@ -270,32 +198,7 @@ TDBODBC::TDBODBC(PTDBODBC tdbp) : TDBEXT(tdbp) Ocp = tdbp->Ocp; // is that right ? Cnp = tdbp->Cnp; Connect = tdbp->Connect; - //TableName = tdbp->TableName; - //Schema = tdbp->Schema; Ops = tdbp->Ops; - //Catalog = tdbp->Catalog; - //Srcdef = tdbp->Srcdef; - //Qrystr = tdbp->Qrystr; - //Memory = tdbp->Memory; - //Scrollable = tdbp->Scrollable; - //Quote = tdbp->Quote; - //Query = tdbp->Query; - //Count = tdbp->Count; -//Where = tdbp->Where; - //MulConn = tdbp->MulConn; - //DBQ = tdbp->DBQ; - //Options = tdbp->Options; - //Quoted = tdbp->Quoted; - //Rows = tdbp->Rows; - //Fpos = 0; - //Curpos = 0; - //AftRows = 0; - //CurNum = 0; - //Rbuf = 0; - //BufSize = tdbp->BufSize; - //Nparm = tdbp->Nparm; - //Qrp = tdbp->Qrp; - //Placed = false; } // end of TDBODBC copy constructor // Method @@ -328,7 +231,7 @@ PCOL TDBODBC::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) /* This used for Multiple(1) tables. Also prepare a connect string */ /* with a place holder to be used by SetFile. */ /***********************************************************************/ -PSZ TDBODBC::GetFile(PGLOBAL g) +PCSZ TDBODBC::GetFile(PGLOBAL g) { if (Connect) { char *p1, *p2; @@ -370,7 +273,7 @@ PSZ TDBODBC::GetFile(PGLOBAL g) /***********************************************************************/ /* Set DBQ and get the new file name into the connect string. */ /***********************************************************************/ -void TDBODBC::SetFile(PGLOBAL g, PSZ fn) +void TDBODBC::SetFile(PGLOBAL g, PCSZ fn) { if (MulConn) { int n = strlen(MulConn) + strlen(fn) - 1; @@ -386,155 +289,18 @@ void TDBODBC::SetFile(PGLOBAL g, PSZ fn) sprintf(Connect, MulConn, fn); } // endif MultConn - DBQ = fn; + DBQ = PlugDup(g, fn); } // end of SetFile -#if 0 -/******************************************************************/ -/* Convert an UTF-8 string to latin characters. */ -/******************************************************************/ -int TDBODBC::Decode(char *txt, char *buf, size_t n) -{ - uint dummy_errors; - uint32 len= copy_and_convert(buf, n, &my_charset_latin1, - txt, strlen(txt), - &my_charset_utf8_general_ci, - &dummy_errors); - buf[len]= '\0'; - return 0; -} // end of Decode - -/***********************************************************************/ -/* MakeSQL: make the SQL statement use with ODBC connection. */ -/* Note: when implementing EOM filtering, column only used in local */ -/* filter should be removed from column list. */ -/***********************************************************************/ -bool TDBODBC::MakeSQL(PGLOBAL g, bool cnt) - { - char *schmp = NULL, *catp = NULL, buf[NAM_LEN * 3]; - int len; - bool oom = false, first = true; - PTABLE tablep = To_Table; - PCOL colp; - - if (Srcdef) { - if (strstr(Srcdef, "%s")) { - char *fil; - - fil = (To_CondFil) ? To_CondFil->Body : PlugDup(g, "1=1"); - Query = new(g)STRING(g, strlen(Srcdef) + strlen(fil)); - Query->SetLength(sprintf(Query->GetStr(), Srcdef, fil)); - } else - Query = new(g)STRING(g, 0, Srcdef); - - return false; - } // endif Srcdef - - // Allocate the string used to contain the Query - Query = new(g)STRING(g, 1023, "SELECT "); - - if (!cnt) { - if (Columns) { - // Normal SQL statement to retrieve results - for (colp = Columns; colp; colp = colp->GetNext()) - if (!colp->IsSpecial()) { - if (!first) - oom |= Query->Append(", "); - else - first = false; - - // Column name can be encoded in UTF-8 - Decode(colp->GetName(), buf, sizeof(buf)); - - if (Quote) { - // Put column name between identifier quotes in case in contains blanks - oom |= Query->Append(Quote); - oom |= Query->Append(buf); - oom |= Query->Append(Quote); - } else - oom |= Query->Append(buf); - - ((PEXTCOL)colp)->SetRank(++Ncol); - } // endif colp - - } else - // !Columns can occur for queries such that sql count(*) from... - // for which we will count the rows from sql * from... - oom |= Query->Append('*'); - - } else - // SQL statement used to retrieve the size of the result - oom |= Query->Append("count(*)"); - - oom |= Query->Append(" FROM "); - - if (Catalog && *Catalog) - catp = Catalog; - - //if (tablep->GetSchema()) - // schmp = (char*)tablep->GetSchema(); - //else - if (Schema && *Schema) - schmp = Schema; - - if (catp) { - oom |= Query->Append(catp); - - if (schmp) { - oom |= Query->Append('.'); - oom |= Query->Append(schmp); - } // endif schmp - - oom |= Query->Append('.'); - } else if (schmp) { - oom |= Query->Append(schmp); - oom |= Query->Append('.'); - } // endif schmp - - // Table name can be encoded in UTF-8 - Decode(TableName, buf, sizeof(buf)); - - if (Quote) { - // Put table name between identifier quotes in case in contains blanks - oom |= Query->Append(Quote); - oom |= Query->Append(buf); - oom |= Query->Append(Quote); - } else - oom |= Query->Append(buf); - - len = Query->GetLength(); - - if (To_CondFil) { - if (Mode == MODE_READ) { - oom |= Query->Append(" WHERE "); - oom |= Query->Append(To_CondFil->Body); - len = Query->GetLength() + 1; - } else - len += (strlen(To_CondFil->Body) + 256); - - } else - len += ((Mode == MODE_READX) ? 256 : 1); - - if (oom || Query->Resize(len)) { - strcpy(g->Message, "MakeSQL: Out of memory"); - return true; - } // endif oom - - if (trace) - htrc("Query=%s\n", Query->GetStr()); - - return false; - } // end of MakeSQL -#endif // 0 - /***********************************************************************/ /* MakeInsert: make the Insert statement used with ODBC connection. */ /***********************************************************************/ bool TDBODBC::MakeInsert(PGLOBAL g) { - char *schmp = NULL, *catp = NULL, buf[NAM_LEN * 3]; + PCSZ schmp = NULL; + char *catp = NULL, buf[NAM_LEN * 3]; int len = 0; - bool b = false, oom = false; + bool oom, b = false; PTABLE tablep = To_Table; PCOL colp; @@ -571,32 +337,32 @@ bool TDBODBC::MakeInsert(PGLOBAL g) Query = new(g) STRING(g, len, "INSERT INTO "); if (catp) { - oom |= Query->Append(catp); + Query->Append(catp); if (schmp) { - oom |= Query->Append('.'); - oom |= Query->Append(schmp); + Query->Append('.'); + Query->Append(schmp); } // endif schmp - oom |= Query->Append('.'); + Query->Append('.'); } else if (schmp) { - oom |= Query->Append(schmp); - oom |= Query->Append('.'); + Query->Append(schmp); + Query->Append('.'); } // endif schmp if (Quote) { // Put table name between identifier quotes in case in contains blanks - oom |= Query->Append(Quote); - oom |= Query->Append(buf); - oom |= Query->Append(Quote); + Query->Append(Quote); + Query->Append(buf); + Query->Append(Quote); } else - oom |= Query->Append(buf); + Query->Append(buf); - oom |= Query->Append('('); + Query->Append('('); for (colp = Columns; colp; colp = colp->GetNext()) { if (b) - oom |= Query->Append(", "); + Query->Append(", "); else b = true; @@ -605,20 +371,20 @@ bool TDBODBC::MakeInsert(PGLOBAL g) if (Quote) { // Put column name between identifier quotes in case in contains blanks - oom |= Query->Append(Quote); - oom |= Query->Append(buf); - oom |= Query->Append(Quote); + Query->Append(Quote); + Query->Append(buf); + Query->Append(Quote); } else - oom |= Query->Append(buf); + Query->Append(buf); } // endfor colp - oom |= Query->Append(") VALUES ("); + Query->Append(") VALUES ("); for (int i = 0; i < Nparm; i++) - oom |= Query->Append("?,"); + Query->Append("?,"); - if (oom) + if ((oom = Query->IsTruncated())) strcpy(g->Message, "MakeInsert: Out of memory"); else Query->RepLast(')'); @@ -645,73 +411,6 @@ bool TDBODBC::BindParameters(PGLOBAL g) } // end of BindParameters #if 0 -/***********************************************************************/ -/* MakeCommand: make the Update or Delete statement to send to the */ -/* MySQL server. Limited to remote values and filtering. */ -/***********************************************************************/ -bool TDBODBC::MakeCommand(PGLOBAL g) - { - char *p, *stmt, name[68], *body = NULL, *qc = Ocp->GetQuoteChar(); - char *qrystr = (char*)PlugSubAlloc(g, NULL, strlen(Qrystr) + 1); - bool qtd = Quoted > 0; - int i = 0, k = 0; - - // Make a lower case copy of the originale query and change - // back ticks to the data source identifier quoting character - do { - qrystr[i] = (Qrystr[i] == '`') ? *qc : tolower(Qrystr[i]); - } while (Qrystr[i++]); - - if (To_CondFil && (p = strstr(qrystr, " where "))) { - p[7] = 0; // Remove where clause - Qrystr[(p - qrystr) + 7] = 0; - body = To_CondFil->Body; - stmt = (char*)PlugSubAlloc(g, NULL, strlen(qrystr) - + strlen(body) + 64); - } else - stmt = (char*)PlugSubAlloc(g, NULL, strlen(Qrystr) + 64); - - // Check whether the table name is equal to a keyword - // If so, it must be quoted in the original query - strlwr(strcat(strcat(strcpy(name, " "), Name), " ")); - - if (strstr(" update delete low_priority ignore quick from ", name)) { - strlwr(strcat(strcat(strcpy(name, qc), Name), qc)); - k += 2; - } else - strlwr(strcpy(name, Name)); // Not a keyword - - if ((p = strstr(qrystr, name))) { - for (i = 0; i < p - qrystr; i++) - stmt[i] = (Qrystr[i] == '`') ? *qc : Qrystr[i]; - - stmt[i] = 0; - k += i + (int)strlen(Name); - - if (qtd && *(p - 1) == ' ') - strcat(strcat(strcat(stmt, qc), TableName), qc); - else - strcat(stmt, TableName); - - i = (int)strlen(stmt); - - do { - stmt[i++] = (Qrystr[k] == '`') ? *qc : Qrystr[k]; - } while (Qrystr[k++]); - - if (body) - strcat(stmt, body); - - } else { - sprintf(g->Message, "Cannot use this %s command", - (Mode == MODE_UPDATE) ? "UPDATE" : "DELETE"); - return true; - } // endif p - - Query = new(g) STRING(g, 0, stmt); - return (!Query->GetSize()); - } // end of MakeCommand - /***********************************************************************/ /* MakeUpdate: make the SQL statement to send to ODBC connection. */ /***********************************************************************/ @@ -829,35 +528,6 @@ int TDBODBC::Cardinality(PGLOBAL g) return Cardinal; } // end of Cardinality -#if 0 -/***********************************************************************/ -/* ODBC GetMaxSize: returns table size estimate in number of lines. */ -/***********************************************************************/ -int TDBODBC::GetMaxSize(PGLOBAL g) - { - if (MaxSize < 0) { - if (Mode == MODE_DELETE) - // Return 0 in mode DELETE in case of delete all. - MaxSize = 0; - else if (!Cardinality(NULL)) - MaxSize = 10; // To make MySQL happy - else if ((MaxSize = Cardinality(g)) < 0) - MaxSize = 12; // So we can see an error occurred - - } // endif MaxSize - - return MaxSize; - } // end of GetMaxSize - -/***********************************************************************/ -/* Return max size value. */ -/***********************************************************************/ -int TDBODBC::GetProgMax(PGLOBAL g) - { - return GetMaxSize(g); - } // end of GetProgMax -#endif // 0 - /***********************************************************************/ /* ODBC Access Method opening routine. */ /* New method now that this routine is called recursively (last table */ @@ -1064,7 +734,7 @@ bool TDBODBC::ReadKey(PGLOBAL g, OPVAL op, const key_range *kr) To_CondFil->Body= (char*)PlugSubAlloc(g, NULL, 0); *To_CondFil->Body= 0; - if ((To_CondFil = hc->CheckCond(g, To_CondFil, To_CondFil->Cond))) + if ((To_CondFil = hc->CheckCond(g, To_CondFil, Cond))) PlugSubAlloc(g, NULL, strlen(To_CondFil->Body) + 1); } // endif active_index @@ -1097,8 +767,6 @@ int TDBODBC::ReadDB(PGLOBAL g) if (trace > 1) htrc("ODBC ReadDB: R%d Mode=%d\n", GetTdb_No(), Mode); - //htrc("ODBC ReadDB: R%d Mode=%d key=%p link=%p Kindex=%p\n", - // GetTdb_No(), Mode, To_Key_Col, To_Link, To_Kindex); if (Mode == MODE_UPDATE || Mode == MODE_DELETE) { if (!Query && MakeCommand(g)) @@ -1118,12 +786,6 @@ int TDBODBC::ReadDB(PGLOBAL g) } // endif Mode - //if (To_Kindex) { - // // Direct access of ODBC tables is not implemented yet - // strcpy(g->Message, MSG(NO_ODBC_DIRECT)); - // return RC_FX; - // } // endif To_Kindex - /*********************************************************************/ /* Now start the reading process. */ /* Here is the place to fetch the line(s). */ @@ -1208,11 +870,6 @@ int TDBODBC::DeleteDB(PGLOBAL g, int irc) /***********************************************************************/ void TDBODBC::CloseDB(PGLOBAL g) { -//if (To_Kindex) { -// To_Kindex->Close(); -// To_Kindex = NULL; -// } // endif - if (Ocp) Ocp->Close(); @@ -1227,20 +884,13 @@ void TDBODBC::CloseDB(PGLOBAL g) /***********************************************************************/ /* ODBCCOL public constructor. */ /***********************************************************************/ -ODBCCOL::ODBCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am) +ODBCCOL::ODBCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am) : EXTCOL(cdp, tdbp, cprec, i, am) { // Set additional ODBC access method information for column. -//Crp = NULL; -//Long = Precision; -//strcpy(F_Date, cdp->F_Date); -//To_Val = NULL; Slen = 0; StrLen = &Slen; Sqlbuf = NULL; -//Bufp = NULL; -//Blkp = NULL; -//Rank = 0; // Not known yet } // end of ODBCCOL constructor /***********************************************************************/ @@ -1248,17 +898,9 @@ ODBCCOL::ODBCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am) /***********************************************************************/ ODBCCOL::ODBCCOL(void) : EXTCOL() { -//Crp = NULL; -//Buf_Type = TYPE_INT; // This is a count(*) column -//// Set additional Dos access method information for column. -//Long = sizeof(int); -//To_Val = NULL; Slen = 0; StrLen = &Slen; Sqlbuf = NULL; -//Bufp = NULL; -//Blkp = NULL; -//Rank = 1; } // end of ODBCCOL constructor /***********************************************************************/ @@ -1267,66 +909,11 @@ ODBCCOL::ODBCCOL(void) : EXTCOL() /***********************************************************************/ ODBCCOL::ODBCCOL(ODBCCOL *col1, PTDB tdbp) : EXTCOL(col1, tdbp) { -//Crp = col1->Crp; -//Long = col1->Long; -//strcpy(F_Date, col1->F_Date); -//To_Val = col1->To_Val; Slen = col1->Slen; StrLen = col1->StrLen; Sqlbuf = col1->Sqlbuf; -//Bufp = col1->Bufp; -//Blkp = col1->Blkp; -//Rank = col1->Rank; } // end of ODBCCOL copy constructor -#if 0 -/***********************************************************************/ -/* SetBuffer: prepare a column block for write operation. */ -/***********************************************************************/ -bool ODBCCOL::SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check) - { - if (!(To_Val = value)) { - sprintf(g->Message, MSG(VALUE_ERROR), Name); - return true; - } else if (Buf_Type == value->GetType()) { - // Values are of the (good) column type - if (Buf_Type == TYPE_DATE) { - // If any of the date values is formatted - // output format must be set for the receiving table - if (GetDomain() || ((DTVAL *)value)->IsFormatted()) - goto newval; // This will make a new value; - - } else if (Buf_Type == TYPE_DOUBLE) - // Float values must be written with the correct (column) precision - // Note: maybe this should be forced by ShowValue instead of this ? - value->SetPrec(GetScale()); - - Value = value; // Directly access the external value - } else { - // Values are not of the (good) column type - if (check) { - sprintf(g->Message, MSG(TYPE_VALUE_ERR), Name, - GetTypeName(Buf_Type), GetTypeName(value->GetType())); - return true; - } // endif check - - newval: - if (InitValue(g)) // Allocate the matching value block - return true; - - } // endif's Value, Buf_Type - - // Because Colblk's have been made from a copy of the original TDB in - // case of Update, we must reset them to point to the original one. - if (To_Tdb->GetOrig()) - To_Tdb = (PTDB)To_Tdb->GetOrig(); - - // Set the Column - Status = (ok) ? BUF_EMPTY : BUF_NO; - return false; - } // end of SetBuffer -#endif // 0 - /***********************************************************************/ /* ReadColumn: when SQLFetch is used there is nothing to do as the */ /* column buffer was bind to the record set. This is also the case */ @@ -1715,7 +1302,7 @@ int TDBXDBC::DeleteDB(PGLOBAL g, int irc) /***********************************************************************/ /* XSRCCOL public constructor. */ /***********************************************************************/ -XSRCCOL::XSRCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am) +XSRCCOL::XSRCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am) : ODBCCOL(cdp, tdbp, cprec, i, am) { // Set additional ODBC access method information for column. diff --git a/storage/connect/tabodbc.h b/storage/connect/tabodbc.h index fcefad5647b..cedcf0f5f77 100644 --- a/storage/connect/tabodbc.h +++ b/storage/connect/tabodbc.h @@ -1,7 +1,7 @@ /*************** Tabodbc H Declares Source Code File (.H) **************/ -/* Name: TABODBC.H Version 1.8 */ +/* Name: TABODBC.H Version 1.9 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2000-2015 */ +/* (C) Copyright to the author Olivier BERTRAND 2000-2017 */ /* */ /* This file contains the TDBODBC classes declares. */ /***********************************************************************/ @@ -33,14 +33,7 @@ public: // Implementation virtual const char *GetType(void) {return "ODBC";} PSZ GetConnect(void) {return Connect;} - //PSZ GetTabname(void) {return Tabname;} - //PSZ GetTabschema(void) {return Tabschema;} - //PSZ GetTabcat(void) {return Tabcat;} - //PSZ GetSrcdef(void) {return Srcdef;} - //char GetSep(void) {return (Sep) ? *Sep : 0;} - //int GetQuoted(void) {return Quoted;} int GetCatver(void) {return Catver;} - //int GetOptions(void) {return Options;} // Methods virtual int Indexable(void) {return 2;} @@ -50,27 +43,7 @@ public: protected: // Members PSZ Connect; /* ODBC connection string */ - //PSZ Tabname; /* External table name */ - //PSZ Tabschema; /* External table schema */ - //PSZ Username; /* User connect name */ - //PSZ Password; /* Password connect info */ - //PSZ Tabcat; /* External table catalog */ - //PSZ Tabtyp; /* Catalog table type */ - //PSZ Colpat; /* Catalog column pattern */ - //PSZ Srcdef; /* The source table SQL definition */ - //PSZ Qchar; /* Identifier quoting character */ - //PSZ Qrystr; /* The original query */ - //PSZ Sep; /* Decimal separator */ int Catver; /* ODBC version for catalog functions */ - //int Options; /* Open connection options */ - //int Cto; /* Open connection timeout */ - //int Qto; /* Query (command) timeout */ - //int Quoted; /* Identifier quoting level */ - //int Maxerr; /* Maxerr for an Exec table */ - //int Maxres; /* Maxres for a catalog table */ - //int Memory; /* Put result set in memory */ - //bool Scrollable; /* Use scrollable cursor */ - //bool Xsrc; /* Execution type */ bool UseCnc; /* Use SQLConnect (!SQLDriverConnect) */ }; // end of ODBCDEF @@ -96,20 +69,16 @@ class TDBODBC : public TDBEXT { // Methods virtual PTDB Clone(PTABS t); -//virtual int GetRecpos(void); virtual bool SetRecpos(PGLOBAL g, int recpos); - virtual PSZ GetFile(PGLOBAL g); - virtual void SetFile(PGLOBAL g, PSZ fn); + virtual PCSZ GetFile(PGLOBAL g); + virtual void SetFile(PGLOBAL g, PCSZ fn); virtual void ResetSize(void); -//virtual int GetAffectedRows(void) {return AftRows;} - virtual PSZ GetServer(void) {return "ODBC";} + virtual PCSZ GetServer(void) {return "ODBC";} virtual int Indexable(void) {return 2;} // Database routines virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); virtual int Cardinality(PGLOBAL g); -//virtual int GetMaxSize(PGLOBAL g); -//virtual int GetProgMax(PGLOBAL g); virtual bool OpenDB(PGLOBAL g); virtual int ReadDB(PGLOBAL g); virtual int WriteDB(PGLOBAL g); @@ -119,14 +88,8 @@ class TDBODBC : public TDBEXT { protected: // Internal functions -//int Decode(char *utf, char *buf, size_t n); -//bool MakeSQL(PGLOBAL g, bool cnt); bool MakeInsert(PGLOBAL g); -//virtual bool MakeCommand(PGLOBAL g); -//bool MakeFilter(PGLOBAL g, bool c); bool BindParameters(PGLOBAL g); -//char *MakeUpdate(PGLOBAL g); -//char *MakeDelete(PGLOBAL g); // Members ODBConn *Ocp; // Points to an ODBC connection class @@ -145,15 +108,12 @@ class ODBCCOL : public EXTCOL { friend class TDBODBC; public: // Constructors - ODBCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am = "ODBC"); + ODBCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "ODBC"); ODBCCOL(ODBCCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation virtual int GetAmType(void) {return TYPE_AM_ODBC;} SQLLEN *GetStrLen(void) {return StrLen;} -// int GetRank(void) {return Rank;} -// PVBLK GetBlkp(void) {return Blkp;} -// void SetCrp(PCOLRES crp) {Crp = crp;} // Methods //virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); @@ -162,7 +122,6 @@ class ODBCCOL : public EXTCOL { void AllocateBuffers(PGLOBAL g, int rows); void *GetBuffer(DWORD rows); SWORD GetBuflen(void); -// void Print(PGLOBAL g, FILE *, uint); protected: // Constructor for count(*) column @@ -170,14 +129,8 @@ class ODBCCOL : public EXTCOL { // Members TIMESTAMP_STRUCT *Sqlbuf; // To get SQL_TIMESTAMP's -//PCOLRES Crp; // To storage result -//void *Bufp; // To extended buffer -//PVBLK Blkp; // To Value Block -//char F_Date[12]; // Internal Date format -//PVAL To_Val; // To value used for Insert SQLLEN *StrLen; // As returned by ODBC SQLLEN Slen; // Used with Fetch -//int Rank; // Rank (position) number in the query }; // end of class ODBCCOL /***********************************************************************/ @@ -226,16 +179,14 @@ class XSRCCOL : public ODBCCOL { friend class TDBXDBC; public: // Constructors - XSRCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am = "ODBC"); + XSRCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "ODBC"); XSRCCOL(XSRCCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation -//virtual int GetAmType(void) {return TYPE_AM_ODBC;} // Methods virtual void ReadColumn(PGLOBAL g); virtual void WriteColumn(PGLOBAL g); -// void Print(PGLOBAL g, FILE *, uint); protected: // Members @@ -287,10 +238,10 @@ class TDBOTB : public TDBDRV { virtual PQRYRES GetResult(PGLOBAL g); // Members - char *Dsn; // Points to connection string - char *Schema; // Points to schema name or NULL - char *Tab; // Points to ODBC table name or pattern - char *Tabtyp; // Points to ODBC table type + PCSZ Dsn; // Points to connection string + PCSZ Schema; // Points to schema name or NULL + PCSZ Tab; // Points to ODBC table name or pattern + PCSZ Tabtyp; // Points to ODBC table type ODBCPARM Ops; // Additional parameters }; // end of class TDBOTB diff --git a/storage/connect/tabpivot.cpp b/storage/connect/tabpivot.cpp index c6d32884417..76a46e6899b 100644 --- a/storage/connect/tabpivot.cpp +++ b/storage/connect/tabpivot.cpp @@ -106,214 +106,211 @@ bool PIVAID::SkipColumn(PCOLRES crp, char *skc) /* Make the Pivot table column list. */ /***********************************************************************/ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) - { +{ char *p, *query, *colname, *skc, buf[64]; - int rc, ndif, nblin, w = 0; + int ndif, nblin, w = 0; bool b = false; PVAL valp; PQRYRES qrp; PCOLRES *pcrp, crp, fncrp = NULL; - // Save stack and allocation environment and prepare error return - if (g->jump_level == MAX_JUMP) { - strcpy(g->Message, MSG(TOO_MANY_JUMPS)); - return NULL; - } // endif jump_level + try { + // Are there columns to skip? + if (Skcol) { + uint n = strlen(Skcol); - if ((rc= setjmp(g->jumper[++g->jump_level])) != 0) { - goto err; - } // endif rc + skc = (char*)PlugSubAlloc(g, NULL, n + 2); + strcpy(skc, Skcol); + skc[n + 1] = 0; - // Are there columns to skip? - if (Skcol) { - uint n = strlen(Skcol); + // Replace ; by nulls in skc + for (p = strchr(skc, ';'); p; p = strchr(p, ';')) + *p++ = 0; - skc = (char*)PlugSubAlloc(g, NULL, n + 2); - strcpy(skc, Skcol); - skc[n + 1] = 0; + } else + skc = NULL; - // Replace ; by nulls in skc - for (p = strchr(skc, ';'); p; p = strchr(p, ';')) - *p++ = 0; + if (!Tabsrc && Tabname) { + // Locate the query + query = (char*)PlugSubAlloc(g, NULL, strlen(Tabname) + 26); + sprintf(query, "SELECT * FROM `%s` LIMIT 1", Tabname); + } else if (!Tabsrc) { + strcpy(g->Message, MSG(SRC_TABLE_UNDEF)); + goto err; + } else + query = (char*)Tabsrc; - } else - skc = NULL; + // Open a MySQL connection for this table + if (!Myc.Open(g, Host, Database, User, Pwd, Port)) { + b = true; - if (!Tabsrc && Tabname) { - // Locate the query - query = (char*)PlugSubAlloc(g, NULL, strlen(Tabname) + 26); - sprintf(query, "SELECT * FROM `%s` LIMIT 1", Tabname); - } else if (!Tabsrc) { - strcpy(g->Message, MSG(SRC_TABLE_UNDEF)); - return NULL; - } else - query = Tabsrc; + // Returned values must be in their original character set + if (Myc.ExecSQL(g, "SET character_set_results=NULL", &w) == RC_FX) + goto err; + else + Myc.FreeResult(); - // Open a MySQL connection for this table - if (!Myc.Open(g, Host, Database, User, Pwd, Port)) { - b = true; + } else + goto err; - // Returned values must be in their original character set - if (Myc.ExecSQL(g, "SET character_set_results=NULL", &w) == RC_FX) - goto err; - else - Myc.FreeResult(); + // Send the source command to MySQL + if (Myc.ExecSQL(g, query, &w) == RC_FX) + goto err; - } else - return NULL; + // We must have a storage query to get pivot column values + if (!(Qryp = Myc.GetResult(g, true))) + goto err; - // Send the source command to MySQL - if (Myc.ExecSQL(g, query, &w) == RC_FX) - goto err; + if (!Fncol) { + for (crp = Qryp->Colresp; crp; crp = crp->Next) + if ((!Picol || stricmp(Picol, crp->Name)) && !SkipColumn(crp, skc)) + Fncol = crp->Name; - // We must have a storage query to get pivot column values - if (!(Qryp = Myc.GetResult(g, true))) - goto err; + if (!Fncol) { + strcpy(g->Message, MSG(NO_DEF_FNCCOL)); + goto err; + } // endif Fncol - if (!Fncol) { - for (crp = Qryp->Colresp; crp; crp = crp->Next) - if ((!Picol || stricmp(Picol, crp->Name)) && !SkipColumn(crp, skc)) - Fncol = crp->Name; - - if (!Fncol) { - strcpy(g->Message, MSG(NO_DEF_FNCCOL)); - goto err; - } // endif Fncol - - } // endif Fncol - - if (!Picol) { - // Find default Picol as the last one not equal to Fncol - for (crp = Qryp->Colresp; crp; crp = crp->Next) - if (stricmp(Fncol, crp->Name) && !SkipColumn(crp, skc)) - Picol = crp->Name; - - if (!Picol) { - strcpy(g->Message, MSG(NO_DEF_PIVOTCOL)); - goto err; - } // endif Picol - - } // endif picol - - // Prepare the column list - for (pcrp = &Qryp->Colresp; crp = *pcrp; ) - if (SkipColumn(crp, skc)) { - // Ignore this column - *pcrp = crp->Next; - } else if (!stricmp(Picol, crp->Name)) { - if (crp->Nulls) { - sprintf(g->Message, "Pivot column %s cannot be nullable", Picol); - goto err; - } // endif Nulls + } // endif Fncol - Rblkp = crp->Kdata; - *pcrp = crp->Next; - } else if (!stricmp(Fncol, crp->Name)) { - fncrp = crp; - *pcrp = crp->Next; - } else - pcrp = &crp->Next; + if (!Picol) { + // Find default Picol as the last one not equal to Fncol + for (crp = Qryp->Colresp; crp; crp = crp->Next) + if (stricmp(Fncol, crp->Name) && !SkipColumn(crp, skc)) + Picol = crp->Name; - if (!Rblkp) { - strcpy(g->Message, MSG(NO_DEF_PIVOTCOL)); - goto err; - } else if (!fncrp) { - strcpy(g->Message, MSG(NO_DEF_FNCCOL)); - goto err; - } // endif + if (!Picol) { + strcpy(g->Message, MSG(NO_DEF_PIVOTCOL)); + goto err; + } // endif Picol - if (Tabsrc) { - Myc.Close(); - b = false; + } // endif picol - // Before calling sort, initialize all - nblin = Qryp->Nblin; + // Prepare the column list + for (pcrp = &Qryp->Colresp; crp = *pcrp; ) + if (SkipColumn(crp, skc)) { + // Ignore this column + *pcrp = crp->Next; + } else if (!stricmp(Picol, crp->Name)) { + if (crp->Nulls) { + sprintf(g->Message, "Pivot column %s cannot be nullable", Picol); + goto err; + } // endif Nulls - Index.Size = nblin * sizeof(int); - Index.Sub = TRUE; // Should be small enough + Rblkp = crp->Kdata; + *pcrp = crp->Next; + } else if (!stricmp(Fncol, crp->Name)) { + fncrp = crp; + *pcrp = crp->Next; + } else + pcrp = &crp->Next; - if (!PlgDBalloc(g, NULL, Index)) - return NULL; + if (!Rblkp) { + strcpy(g->Message, MSG(NO_DEF_PIVOTCOL)); + goto err; + } else if (!fncrp) { + strcpy(g->Message, MSG(NO_DEF_FNCCOL)); + goto err; + } // endif - Offset.Size = (nblin + 1) * sizeof(int); - Offset.Sub = TRUE; // Should be small enough + if (Tabsrc) { + Myc.Close(); + b = false; - if (!PlgDBalloc(g, NULL, Offset)) - return NULL; + // Before calling sort, initialize all + nblin = Qryp->Nblin; - ndif = Qsort(g, nblin); + Index.Size = nblin * sizeof(int); + Index.Sub = TRUE; // Should be small enough - if (ndif < 0) // error - return NULL; + if (!PlgDBalloc(g, NULL, Index)) + goto err; - } else { - // The query was limited, we must get pivot column values - // Returned values must be in their original character set -// if (Myc.ExecSQL(g, "SET character_set_results=NULL", &w) == RC_FX) -// goto err; + Offset.Size = (nblin + 1) * sizeof(int); + Offset.Sub = TRUE; // Should be small enough - query = (char*)PlugSubAlloc(g, NULL, 0); - sprintf(query, "SELECT DISTINCT `%s` FROM `%s`", Picol, Tabname); - PlugSubAlloc(g, NULL, strlen(query) + 1); - Myc.FreeResult(); + if (!PlgDBalloc(g, NULL, Offset)) + goto err; - // Send the source command to MySQL - if (Myc.ExecSQL(g, query, &w) == RC_FX) - goto err; + ndif = Qsort(g, nblin); - // We must have a storage query to get pivot column values - if (!(qrp = Myc.GetResult(g, true))) - goto err; + if (ndif < 0) // error + goto err; - Myc.Close(); - b = false; + } else { + // The query was limited, we must get pivot column values + // Returned values must be in their original character set + // if (Myc.ExecSQL(g, "SET character_set_results=NULL", &w) == RC_FX) + // goto err; - // Get the column list - crp = qrp->Colresp; - Rblkp = crp->Kdata; - ndif = qrp->Nblin; - } // endif Tabsrc + query = (char*)PlugSubAlloc(g, NULL, 0); + sprintf(query, "SELECT DISTINCT `%s` FROM `%s`", Picol, Tabname); + PlugSubAlloc(g, NULL, strlen(query) + 1); + Myc.FreeResult(); - // Allocate the Value used to retieve column names - if (!(valp = AllocateValue(g, Rblkp->GetType(), - Rblkp->GetVlen(), - Rblkp->GetPrec()))) - return NULL; + // Send the source command to MySQL + if (Myc.ExecSQL(g, query, &w) == RC_FX) + goto err; - // Now make the functional columns - for (int i = 0; i < ndif; i++) { - if (i) { - crp = (PCOLRES)PlugSubAlloc(g, NULL, sizeof(COLRES)); - memcpy(crp, fncrp, sizeof(COLRES)); - } else - crp = fncrp; + // We must have a storage query to get pivot column values + if (!(qrp = Myc.GetResult(g, true))) + goto err; - // Get the value that will be the generated column name - if (Tabsrc) - valp->SetValue_pvblk(Rblkp, Pex[Pof[i]]); - else - valp->SetValue_pvblk(Rblkp, i); + Myc.Close(); + b = false; - colname = valp->GetCharString(buf); - crp->Name = PlugDup(g, colname); - crp->Flag = 1; + // Get the column list + crp = qrp->Colresp; + Rblkp = crp->Kdata; + ndif = qrp->Nblin; + } // endif Tabsrc - // Add this column - *pcrp = crp; - crp->Next = NULL; - pcrp = &crp->Next; - } // endfor i + // Allocate the Value used to retieve column names + if (!(valp = AllocateValue(g, Rblkp->GetType(), + Rblkp->GetVlen(), + Rblkp->GetPrec()))) + goto err; - // We added ndif columns and removed 2 (picol and fncol) - Qryp->Nbcol += (ndif - 2); - return Qryp; + // Now make the functional columns + for (int i = 0; i < ndif; i++) { + if (i) { + crp = (PCOLRES)PlugSubAlloc(g, NULL, sizeof(COLRES)); + memcpy(crp, fncrp, sizeof(COLRES)); + } else + crp = fncrp; + + // Get the value that will be the generated column name + if (Tabsrc) + valp->SetValue_pvblk(Rblkp, Pex[Pof[i]]); + else + valp->SetValue_pvblk(Rblkp, i); + + colname = valp->GetCharString(buf); + crp->Name = PlugDup(g, colname); + crp->Flag = 1; + + // Add this column + *pcrp = crp; + crp->Next = NULL; + pcrp = &crp->Next; + } // endfor i + + // We added ndif columns and removed 2 (picol and fncol) + Qryp->Nbcol += (ndif - 2); + return Qryp; + } catch (int n) { + if (trace) + htrc("Exception %d: %s\n", n, g->Message); + } catch (const char *msg) { + strcpy(g->Message, msg); + } // end catch err: if (b) Myc.Close(); return NULL; - } // end of MakePivotColumns +} // end of MakePivotColumns /***********************************************************************/ /* PIVAID: Compare routine for sorting pivot column values. */ diff --git a/storage/connect/tabpivot.h b/storage/connect/tabpivot.h index 07d5c3e456b..6c2d53e9527 100644 --- a/storage/connect/tabpivot.h +++ b/storage/connect/tabpivot.h @@ -32,16 +32,16 @@ class PIVAID : public CSORT { protected: // Members MYSQLC Myc; // MySQL connection class - char *Host; // Host machine to use - char *User; // User logon info - char *Pwd; // Password logon info - char *Database; // Database to be used by server + PCSZ Host; // Host machine to use + PCSZ User; // User logon info + PCSZ Pwd; // Password logon info + PCSZ Database; // Database to be used by server PQRYRES Qryp; // Points to Query result block - char *Tabname; // Name of source table - char *Tabsrc; // SQL of source table - char *Picol; // Pivot column name - char *Fncol; // Function column name - char *Skcol; // Skipped columns + PCSZ Tabname; // Name of source table + PCSZ Tabsrc; // SQL of source table + PCSZ Picol; // Pivot column name + PCSZ Fncol; // Function column name + PCSZ Skcol; // Skipped columns PVBLK Rblkp; // The value block of the pivot column int Port; // MySQL port number }; // end of class PIVAID diff --git a/storage/connect/tabsys.cpp b/storage/connect/tabsys.cpp index 2ddd1c3c753..7f0d9881298 100644 --- a/storage/connect/tabsys.cpp +++ b/storage/connect/tabsys.cpp @@ -1,9 +1,9 @@ /************* TabSys C++ Program Source Code File (.CPP) **************/ /* PROGRAM NAME: TABSYS */ /* ------------- */ -/* Version 2.3 */ +/* Version 2.4 */ /* */ -/* Author Olivier BERTRAND 2004-2015 */ +/* Author Olivier BERTRAND 2004-2017 */ /* */ /* This program are the INI/CFG tables classes. */ /***********************************************************************/ @@ -355,7 +355,7 @@ void TDBINI::CloseDB(PGLOBAL) /***********************************************************************/ /* INICOL public constructor. */ /***********************************************************************/ -INICOL::INICOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ) +INICOL::INICOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ) : COLBLK(cdp, tdbp, i) { if (cprec) { @@ -511,12 +511,12 @@ void INICOL::WriteColumn(PGLOBAL g) if (strlen(p) > (unsigned)Long) { sprintf(g->Message, MSG(VALUE_TOO_LONG), p, Name, Long); - longjmp(g->jumper[g->jump_level], 31); - } else if (Flag == 1) { + throw 31; + } else if (Flag == 1) { if (tdbp->Mode == MODE_UPDATE) { strcpy(g->Message, MSG(NO_SEC_UPDATE)); - longjmp(g->jumper[g->jump_level], 31); - } else if (*p) { + throw 31; + } else if (*p) { tdbp->Section = p; } else tdbp->Section = NULL; @@ -524,8 +524,8 @@ void INICOL::WriteColumn(PGLOBAL g) return; } else if (!tdbp->Section) { strcpy(g->Message, MSG(SEC_NAME_FIRST)); - longjmp(g->jumper[g->jump_level], 31); - } // endif's + throw 31; + } // endif's /*********************************************************************/ /* Updating must be done only when not in checking pass. */ @@ -536,8 +536,8 @@ void INICOL::WriteColumn(PGLOBAL g) if (!rc) { sprintf(g->Message, "Error %d writing to %s", GetLastError(), tdbp->Ifile); - longjmp(g->jumper[g->jump_level], 31); - } // endif rc + throw 31; + } // endif rc } // endif Status @@ -769,7 +769,7 @@ int TDBXIN::DeleteDB(PGLOBAL g, int irc) /***********************************************************************/ /* XINCOL public constructor. */ /***********************************************************************/ -XINCOL::XINCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am) +XINCOL::XINCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am) : INICOL(cdp, tdbp, cprec, i, am) { } // end of XINCOL constructor @@ -837,12 +837,12 @@ void XINCOL::WriteColumn(PGLOBAL g) if (strlen(p) > (unsigned)Long) { sprintf(g->Message, MSG(VALUE_TOO_LONG), p, Name, Long); - longjmp(g->jumper[g->jump_level], 31); - } else if (Flag == 1) { + throw 31; + } else if (Flag == 1) { if (tdbp->Mode == MODE_UPDATE) { strcpy(g->Message, MSG(NO_SEC_UPDATE)); - longjmp(g->jumper[g->jump_level], 31); - } else if (*p) { + throw 31; + } else if (*p) { tdbp->Section = p; } else tdbp->Section = NULL; @@ -851,8 +851,8 @@ void XINCOL::WriteColumn(PGLOBAL g) } else if (Flag == 2) { if (tdbp->Mode == MODE_UPDATE) { strcpy(g->Message, MSG(NO_KEY_UPDATE)); - longjmp(g->jumper[g->jump_level], 31); - } else if (*p) { + throw 31; + } else if (*p) { tdbp->Keycur = p; } else tdbp->Keycur = NULL; @@ -860,8 +860,8 @@ void XINCOL::WriteColumn(PGLOBAL g) return; } else if (!tdbp->Section || !tdbp->Keycur) { strcpy(g->Message, MSG(SEC_KEY_FIRST)); - longjmp(g->jumper[g->jump_level], 31); - } // endif's + throw 31; + } // endif's /*********************************************************************/ /* Updating must be done only when not in checking pass. */ @@ -872,8 +872,8 @@ void XINCOL::WriteColumn(PGLOBAL g) if (!rc) { sprintf(g->Message, "Error %d writing to %s", GetLastError(), tdbp->Ifile); - longjmp(g->jumper[g->jump_level], 31); - } // endif rc + throw 31; + } // endif rc } // endif Status diff --git a/storage/connect/tabsys.h b/storage/connect/tabsys.h index ff1b8335690..0c6017af177 100644 --- a/storage/connect/tabsys.h +++ b/storage/connect/tabsys.h @@ -61,8 +61,8 @@ class TDBINI : public TDBASE { virtual int GetRecpos(void) {return N;} virtual int GetProgCur(void) {return N;} //virtual int GetAffectedRows(void) {return 0;} - virtual PSZ GetFile(PGLOBAL g) {return Ifile;} - virtual void SetFile(PGLOBAL g, PSZ fn) {Ifile = fn;} + virtual PCSZ GetFile(PGLOBAL g) {return Ifile;} + virtual void SetFile(PGLOBAL g, PCSZ fn) {Ifile = fn;} virtual void ResetDB(void) {Seclist = Section = NULL; N = 0;} virtual void ResetSize(void) {MaxSize = -1; Seclist = NULL;} virtual int RowNumber(PGLOBAL g, bool b = false) {return N;} @@ -80,7 +80,7 @@ class TDBINI : public TDBASE { protected: // Members - char *Ifile; // The INI file + PCSZ Ifile; // The INI file char *Seclist; // The section list char *Section; // The current section int Seclen; // Length of seclist buffer @@ -93,7 +93,7 @@ class TDBINI : public TDBASE { class INICOL : public COLBLK { public: // Constructors - INICOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am = "INI"); + INICOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "INI"); INICOL(INICOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation @@ -165,7 +165,7 @@ class TDBXIN : public TDBINI { class XINCOL : public INICOL { public: // Constructors - XINCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am = "INI"); + XINCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "INI"); XINCOL(XINCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation diff --git a/storage/connect/tabtbl.cpp b/storage/connect/tabtbl.cpp index 0bf3f6beb43..b567e9aecd4 100644 --- a/storage/connect/tabtbl.cpp +++ b/storage/connect/tabtbl.cpp @@ -84,6 +84,8 @@ #define SYSEXIT void * #endif // !__WIN__ +extern pthread_mutex_t tblmut; + /* ---------------------------- Class TBLDEF ---------------------------- */ /**************************************************************************/ @@ -575,8 +577,10 @@ pthread_handler_t ThreadOpen(void *p) // Try to open the connection if (!cmp->Tap->GetTo_Tdb()->OpenDB(cmp->G)) { - cmp->Ready = true; - } else + pthread_mutex_lock(&tblmut); + cmp->Ready = true; + pthread_mutex_unlock(&tblmut); + } else cmp->Rc = RC_FX; my_thread_end(); @@ -648,6 +652,7 @@ bool TDBTBM::OpenTables(PGLOBAL g) tp = (PTBMT)PlugSubAlloc(g, NULL, sizeof(TBMT)); memset(tp, 0, sizeof(TBMT)); tp->G = g; + tp->Ready = false; tp->Tap = tabp; tp->Thd = thd; @@ -792,14 +797,19 @@ int TDBTBM::ReadNextRemote(PGLOBAL g) retry: // Search for a remote table having its result set - for (PTBMT tp = Tmp; tp; tp = tp->Next) + pthread_mutex_lock(&tblmut); + for (PTBMT tp = Tmp; tp; tp = tp->Next) if (tp->Ready) { - if (!tp->Complete) - Cmp = tp; + if (!tp->Complete) { + Cmp = tp; + break; + } // endif Complete } else b = true; + pthread_mutex_unlock(&tblmut); + if (!Cmp) { if (b) { // more result to come // sleep(20); diff --git a/storage/connect/tabutil.cpp b/storage/connect/tabutil.cpp index 762c61bd1a1..574cef28ea3 100644 --- a/storage/connect/tabutil.cpp +++ b/storage/connect/tabutil.cpp @@ -119,7 +119,8 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db, FLD_LENGTH, FLD_SCALE, FLD_RADIX, FLD_NULL, FLD_REM, FLD_NO, FLD_CHARSET}; unsigned int length[] = {0, 4, 16, 4, 4, 4, 4, 4, 0, 32, 32}; - char *pn, *tn, *fld, *colname, *chset, *fmt, v; + PCSZ fmt; + char *pn, *tn, *fld, *colname, *chset, v; int i, n, ncol = sizeof(buftyp) / sizeof(int); int prec, len, type, scale; int zconv = GetConvSize(); @@ -227,7 +228,7 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db, fmt = MyDateFmt(fp->type()); prec = len = strlen(fmt); } else { - fmt = (char*)fp->option_struct->dateformat; + fmt = (PCSZ)fp->option_struct->dateformat; prec = len = fp->field_length; } // endif mysql @@ -314,7 +315,7 @@ bool PRXDEF::DefineAM(PGLOBAL g, LPCSTR, int) strcpy(g->Message, "Missing object table definition"); return true; } else - tab = "Noname"; + tab = PlugDup(g, "Noname"); } else // Analyze the table name, it may have the format: [dbname.]tabname @@ -626,7 +627,7 @@ void TDBPRX::RemoveNext(PTABLE tp) /***********************************************************************/ /* PRXCOL public constructor. */ /***********************************************************************/ -PRXCOL::PRXCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am) +PRXCOL::PRXCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am) : COLBLK(cdp, tdbp, i) { if (cprec) { @@ -741,7 +742,14 @@ void PRXCOL::ReadColumn(PGLOBAL g) if (Nullable) Value->SetNull(Value->IsNull()); - } // endif Colp + } else { + Value->Reset(); + + // Set null when applicable + if (Nullable) + Value->SetNull(true); + + } // endif Colp } // end of ReadColumn diff --git a/storage/connect/tabutil.h b/storage/connect/tabutil.h index 8e56aecff86..62678508ca1 100644 --- a/storage/connect/tabutil.h +++ b/storage/connect/tabutil.h @@ -71,7 +71,7 @@ class DllExport TDBPRX : public TDBASE { virtual int GetRecpos(void) {return Tdbp->GetRecpos();} virtual void ResetDB(void) {Tdbp->ResetDB();} virtual int RowNumber(PGLOBAL g, bool b = FALSE); - virtual PSZ GetServer(void) {return (Tdbp) ? Tdbp->GetServer() : (PSZ)"?";} + virtual PCSZ GetServer(void) {return (Tdbp) ? Tdbp->GetServer() : (PSZ)"?";} // Database routines virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); @@ -101,7 +101,7 @@ class DllExport PRXCOL : public COLBLK { friend class TDBOCCUR; public: // Constructors - PRXCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am = "PRX"); + PRXCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "PRX"); PRXCOL(PRXCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation diff --git a/storage/connect/tabvct.cpp b/storage/connect/tabvct.cpp index 282fb55a43c..533986e44da 100644 --- a/storage/connect/tabvct.cpp +++ b/storage/connect/tabvct.cpp @@ -1,11 +1,11 @@ /************* TabVct C++ Program Source Code File (.CPP) **************/ /* PROGRAM NAME: TABVCT */ /* ------------- */ -/* Version 3.8 */ +/* Version 3.9 */ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 1999-2015 */ +/* (C) Copyright to the author Olivier BERTRAND 1999-2017 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -174,7 +174,7 @@ bool VCTDEF::Erase(char *filename) /***********************************************************************/ int VCTDEF::MakeFnPattern(char *fpat) { - char pat[8]; + char pat[16]; #if defined(__WIN__) char drive[_MAX_DRIVE]; #else @@ -490,15 +490,15 @@ void VCTCOL::ReadBlock(PGLOBAL g) #if defined(_DEBUG) if (!Blk) { strcpy(g->Message, MSG(TO_BLK_IS_NULL)); - longjmp(g->jumper[g->jump_level], 58); - } // endif + throw 58; + } // endif #endif /*********************************************************************/ /* Read column block according to used access method. */ /*********************************************************************/ if (txfp->ReadBlock(g, this)) - longjmp(g->jumper[g->jump_level], 6); + throw 6; ColBlk = txfp->CurBlk; ColPos = -1; // Any invalid position @@ -518,15 +518,15 @@ void VCTCOL::WriteBlock(PGLOBAL g) #if defined(_DEBUG) if (!Blk) { strcpy(g->Message, MSG(BLK_IS_NULL)); - longjmp(g->jumper[g->jump_level], 56); - } // endif + throw 56; + } // endif #endif /*******************************************************************/ /* Write column block according to used access method. */ /*******************************************************************/ if (txfp->WriteBlock(g, this)) - longjmp(g->jumper[g->jump_level], 6); + throw 6; Modif = 0; } // endif Modif diff --git a/storage/connect/tabvir.cpp b/storage/connect/tabvir.cpp index 155c71fe268..c78a8f531f6 100644 --- a/storage/connect/tabvir.cpp +++ b/storage/connect/tabvir.cpp @@ -1,6 +1,6 @@ /************* tdbvir C++ Program Source Code File (.CPP) **************/ -/* PROGRAM NAME: tdbvir.cpp Version 1.1 */ -/* (C) Copyright to the author Olivier BERTRAND 2014 */ +/* PROGRAM NAME: tdbvir.cpp Version 1.2 */ +/* (C) Copyright to the author Olivier BERTRAND 2014-2017 */ /* This program are the VIR classes DB execution routines. */ /***********************************************************************/ @@ -269,7 +269,7 @@ int TDBVIR::DeleteDB(PGLOBAL g, int) /***********************************************************************/ /* VIRCOL public constructor. */ /***********************************************************************/ -VIRCOL::VIRCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ) +VIRCOL::VIRCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ) : COLBLK(cdp, tdbp, i) { if (cprec) { @@ -289,8 +289,8 @@ void VIRCOL::ReadColumn(PGLOBAL g) { // This should never be called sprintf(g->Message, "ReadColumn: Column %s is not virtual", Name); - longjmp(g->jumper[g->jump_level], TYPE_COLBLK); - } // end of ReadColumn + throw (int)TYPE_COLBLK; +} // end of ReadColumn /* ---------------------------TDBVICL class -------------------------- */ diff --git a/storage/connect/tabvir.h b/storage/connect/tabvir.h index a53aceaeceb..e7313bbae67 100644 --- a/storage/connect/tabvir.h +++ b/storage/connect/tabvir.h @@ -76,7 +76,7 @@ class VIRCOL : public COLBLK { friend class TDBVIR; public: // Constructors - VIRCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am = "VIRTUAL"); + VIRCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "VIRTUAL"); // Implementation virtual int GetAmType(void) {return TYPE_AM_VIR;} diff --git a/storage/connect/tabwmi.cpp b/storage/connect/tabwmi.cpp index 4871a1d66dc..335ffce5d7f 100644 --- a/storage/connect/tabwmi.cpp +++ b/storage/connect/tabwmi.cpp @@ -27,7 +27,7 @@ /***********************************************************************/ /* Initialize WMI operations. */ /***********************************************************************/ -PWMIUT InitWMI(PGLOBAL g, char *nsp, char *classname) +PWMIUT InitWMI(PGLOBAL g, PCSZ nsp, PCSZ classname) { IWbemLocator *loc; char *p; @@ -132,7 +132,7 @@ PWMIUT InitWMI(PGLOBAL g, char *nsp, char *classname) /* WMIColumns: constructs the result blocks containing the description */ /* of all the columns of a WMI table of a specified class. */ /***********************************************************************/ -PQRYRES WMIColumns(PGLOBAL g, char *nsp, char *cls, bool info) +PQRYRES WMIColumns(PGLOBAL g, PCSZ nsp, PCSZ cls, bool info) { static int buftyp[] = {TYPE_STRING, TYPE_SHORT, TYPE_STRING, TYPE_INT, TYPE_INT, TYPE_SHORT}; diff --git a/storage/connect/tabwmi.h b/storage/connect/tabwmi.h index 6abb85453a1..7a18453374e 100644 --- a/storage/connect/tabwmi.h +++ b/storage/connect/tabwmi.h @@ -27,7 +27,7 @@ typedef struct _WMIutil { /***********************************************************************/ /* Functions used externally. */ /***********************************************************************/ -PQRYRES WMIColumns(PGLOBAL g, char *nsp, char *cls, bool info); +PQRYRES WMIColumns(PGLOBAL g, PCSZ nsp, PCSZ cls, bool info); /* -------------------------- WMI classes ---------------------------- */ diff --git a/storage/connect/tabxml.cpp b/storage/connect/tabxml.cpp index 52cf3d3812f..c09386451ff 100644 --- a/storage/connect/tabxml.cpp +++ b/storage/connect/tabxml.cpp @@ -1,9 +1,9 @@ /************* Tabxml C++ Program Source Code File (.CPP) **************/ /* PROGRAM NAME: TABXML */ /* ------------- */ -/* Version 2.9 */ +/* Version 3.0 */ /* */ -/* Author Olivier BERTRAND 2007 - 2016 */ +/* Author Olivier BERTRAND 2007 - 2017 */ /* */ /* This program are the XML tables classes using MS-DOM or libxml2. */ /***********************************************************************/ @@ -118,10 +118,11 @@ PQRYRES XMLColumns(PGLOBAL g, char *db, char *tab, PTOS topt, bool info) static XFLD fldtyp[] = {FLD_NAME, FLD_TYPE, FLD_TYPENAME, FLD_PREC, FLD_LENGTH, FLD_SCALE, FLD_NULL, FLD_FORMAT}; static unsigned int length[] = {0, 6, 8, 10, 10, 6, 6, 0}; - char *fn, *op, colname[65], fmt[129], buf[512]; + char colname[65], fmt[129], buf[512]; int i, j, lvl, n = 0; int ncol = sizeof(buftyp) / sizeof(int); bool ok = true; + PCSZ fn, op; PXCL xcol, xcp, fxcp = NULL, pxcp = NULL; PLVL *lvlp, vp; PXNODE node = NULL; @@ -157,7 +158,10 @@ PQRYRES XMLColumns(PGLOBAL g, char *db, char *tab, PTOS topt, bool info) tdp = new(g) XMLDEF; tdp->Fn = fn; - tdp->Database = SetPath(g, db); + + if (!(tdp->Database = SetPath(g, db))) + return NULL; + tdp->Tabname = tab; tdp->Zipped = GetBooleanTableOption(g, topt, "Zipped", false); tdp->Entry = GetStringTableOption(g, topt, "Entry", NULL); @@ -359,7 +363,7 @@ PQRYRES XMLColumns(PGLOBAL g, char *db, char *tab, PTOS topt, bool info) skipit: if (trace) - htrc("CSVColumns: n=%d len=%d\n", n, length[0]); + htrc("XMLColumns: n=%d len=%d\n", n, length[0]); /*********************************************************************/ /* Allocate the structures used to refer to the result set. */ @@ -448,7 +452,8 @@ XMLDEF::XMLDEF(void) /***********************************************************************/ bool XMLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) { - char *defrow, *defcol, buf[10]; + PCSZ defrow, defcol; + char buf[10]; Fn = GetStringCatInfo(g, "Filename", NULL); Encoding = GetStringCatInfo(g, "Encoding", "UTF-8"); @@ -1314,8 +1319,8 @@ void TDBXML::CloseDB(PGLOBAL g) Docp->CloseDoc(g, To_Xb); // This causes a crash in Diagnostics_area::set_error_status -// longjmp(g->jumper[g->jump_level], TYPE_AM_XML); - } // endif DumpDoc +// throw (int)TYPE_AM_XML; + } // endif DumpDoc } // endif Changed @@ -1357,8 +1362,8 @@ void TDBXML::CloseDB(PGLOBAL g) /***********************************************************************/ /* XMLCOL public constructor. */ /***********************************************************************/ -XMLCOL::XMLCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am) - : COLBLK(cdp, tdbp, i) +XMLCOL::XMLCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am) + : COLBLK(cdp, tdbp, i) { if (cprec) { Next = cprec->GetNext(); @@ -1637,8 +1642,8 @@ void XMLCOL::ReadColumn(PGLOBAL g) if (ValNode->GetType() != XML_ELEMENT_NODE && ValNode->GetType() != XML_ATTRIBUTE_NODE) { sprintf(g->Message, MSG(BAD_VALNODE), ValNode->GetType(), Name); - longjmp(g->jumper[g->jump_level], TYPE_AM_XML); - } // endif type + throw (int)TYPE_AM_XML; + } // endif type // Get the Xname value from the XML file switch (ValNode->GetContent(g, Valbuf, Long + 1)) { @@ -1648,8 +1653,8 @@ void XMLCOL::ReadColumn(PGLOBAL g) PushWarning(g, Tdbp); break; default: - longjmp(g->jumper[g->jump_level], TYPE_AM_XML); - } // endswitch + throw (int)TYPE_AM_XML; + } // endswitch Value->SetValue_psz(Valbuf); } else { @@ -1699,7 +1704,7 @@ void XMLCOL::WriteColumn(PGLOBAL g) /* For columns having an Xpath, the Clist must be updated. */ /*********************************************************************/ if (Tdbp->CheckRow(g, Nod || Tdbp->Colname)) - longjmp(g->jumper[g->jump_level], TYPE_AM_XML); + throw (int)TYPE_AM_XML; /*********************************************************************/ /* Null values are represented by no node. */ @@ -1771,8 +1776,8 @@ void XMLCOL::WriteColumn(PGLOBAL g) if (ColNode == NULL) { strcpy(g->Message, MSG(COL_ALLOC_ERR)); - longjmp(g->jumper[g->jump_level], TYPE_AM_XML); - } // endif ColNode + throw (int)TYPE_AM_XML; + } // endif ColNode } // endif ColNode @@ -1790,7 +1795,7 @@ void XMLCOL::WriteColumn(PGLOBAL g) if (ValNode == NULL && AttNode == NULL) { strcpy(g->Message, MSG(VAL_ALLOC_ERR)); - longjmp(g->jumper[g->jump_level], TYPE_AM_XML); + throw (int)TYPE_AM_XML; } // endif ValNode /*********************************************************************/ @@ -1800,8 +1805,8 @@ void XMLCOL::WriteColumn(PGLOBAL g) if (strlen(p) > (unsigned)Long) { sprintf(g->Message, MSG(VALUE_TOO_LONG), p, Name, Long); - longjmp(g->jumper[g->jump_level], TYPE_AM_XML); - } else + throw (int)TYPE_AM_XML; + } else strcpy(Valbuf, p); /*********************************************************************/ @@ -1850,8 +1855,8 @@ void XMULCOL::ReadColumn(PGLOBAL g) if (ValNode->GetType() != XML_ELEMENT_NODE && ValNode->GetType() != XML_ATTRIBUTE_NODE) { sprintf(g->Message, MSG(BAD_VALNODE), ValNode->GetType(), Name); - longjmp(g->jumper[g->jump_level], TYPE_AM_XML); - } // endif type + throw (int)TYPE_AM_XML; + } // endif type // Get the Xname value from the XML file switch (ValNode->GetContent(g, p, (b ? Long : len))) { @@ -1861,7 +1866,7 @@ void XMULCOL::ReadColumn(PGLOBAL g) PushWarning(g, Tdbp); break; default: - longjmp(g->jumper[g->jump_level], TYPE_AM_XML); + throw (int)TYPE_AM_XML; } // endswitch if (!b) { @@ -1936,7 +1941,7 @@ void XMULCOL::WriteColumn(PGLOBAL g) /* For columns having an Xpath, the Clist must be updated. */ /*********************************************************************/ if (Tdbp->CheckRow(g, Nod)) - longjmp(g->jumper[g->jump_level], TYPE_AM_XML); + throw (int)TYPE_AM_XML; /*********************************************************************/ /* Find the column and value nodes to update or insert. */ @@ -1985,8 +1990,8 @@ void XMULCOL::WriteColumn(PGLOBAL g) if (len > 1 && !Tdbp->Xpand) { sprintf(g->Message, MSG(BAD_VAL_UPDATE), Name); - longjmp(g->jumper[g->jump_level], TYPE_AM_XML); - } else + throw (int)TYPE_AM_XML; + } else ValNode = Nlx->GetItem(g, Tdbp->Nsub, Vxnp); } else // Inod != Nod @@ -2027,8 +2032,8 @@ void XMULCOL::WriteColumn(PGLOBAL g) if (ColNode == NULL) { strcpy(g->Message, MSG(COL_ALLOC_ERR)); - longjmp(g->jumper[g->jump_level], TYPE_AM_XML); - } // endif ColNode + throw (int)TYPE_AM_XML; + } // endif ColNode } // endif ColNode @@ -2046,8 +2051,8 @@ void XMULCOL::WriteColumn(PGLOBAL g) if (ValNode == NULL && AttNode == NULL) { strcpy(g->Message, MSG(VAL_ALLOC_ERR)); - longjmp(g->jumper[g->jump_level], TYPE_AM_XML); - } // endif ValNode + throw (int)TYPE_AM_XML; + } // endif ValNode /*********************************************************************/ /* Get the string representation of Value according to column type. */ @@ -2056,8 +2061,8 @@ void XMULCOL::WriteColumn(PGLOBAL g) if (strlen(p) > (unsigned)Long) { sprintf(g->Message, MSG(VALUE_TOO_LONG), p, Name, Long); - longjmp(g->jumper[g->jump_level], TYPE_AM_XML); - } else + throw (int)TYPE_AM_XML; + } else strcpy(Valbuf, p); /*********************************************************************/ @@ -2088,8 +2093,8 @@ void XPOSCOL::ReadColumn(PGLOBAL g) if (Tdbp->Clist == NULL) { strcpy(g->Message, MSG(MIS_TAG_LIST)); - longjmp(g->jumper[g->jump_level], TYPE_AM_XML); - } // endif Clist + throw (int)TYPE_AM_XML; + } // endif Clist if ((ValNode = Tdbp->Clist->GetItem(g, Rank, Vxnp))) { // Get the column value from the XML file @@ -2100,8 +2105,8 @@ void XPOSCOL::ReadColumn(PGLOBAL g) PushWarning(g, Tdbp); break; default: - longjmp(g->jumper[g->jump_level], TYPE_AM_XML); - } // endswitch + throw (int)TYPE_AM_XML; + } // endswitch Value->SetValue_psz(Valbuf); } else { @@ -2151,15 +2156,15 @@ void XPOSCOL::WriteColumn(PGLOBAL g) /* For all columns the Clist must be updated. */ /*********************************************************************/ if (Tdbp->CheckRow(g, true)) - longjmp(g->jumper[g->jump_level], TYPE_AM_XML); + throw (int)TYPE_AM_XML; /*********************************************************************/ /* Find the column and value nodes to update or insert. */ /*********************************************************************/ if (Tdbp->Clist == NULL) { strcpy(g->Message, MSG(MIS_TAG_LIST)); - longjmp(g->jumper[g->jump_level], TYPE_AM_XML); - } // endif Clist + throw (int)TYPE_AM_XML; + } // endif Clist n = Tdbp->Clist->GetLength(); k = Rank; @@ -2183,8 +2188,8 @@ void XPOSCOL::WriteColumn(PGLOBAL g) if (strlen(p) > (unsigned)Long) { sprintf(g->Message, MSG(VALUE_TOO_LONG), p, Name, Long); - longjmp(g->jumper[g->jump_level], TYPE_AM_XML); - } else + throw (int)TYPE_AM_XML; + } else strcpy(Valbuf, p); /*********************************************************************/ diff --git a/storage/connect/tabxml.h b/storage/connect/tabxml.h index 65b353072cb..813f62dde52 100644 --- a/storage/connect/tabxml.h +++ b/storage/connect/tabxml.h @@ -31,7 +31,7 @@ class DllExport XMLDEF : public TABDEF { /* Logical table description */ protected: // Members - char *Fn; /* Path/Name of corresponding file */ + PCSZ Fn; /* Path/Name of corresponding file */ char *Encoding; /* New XML table file encoding */ char *Tabname; /* Name of Table node */ char *Rowname; /* Name of first level nodes */ @@ -42,7 +42,7 @@ class DllExport XMLDEF : public TABDEF { /* Logical table description */ char *DefNs; /* Dummy name of default namespace */ char *Attrib; /* Table node attributes */ char *Hdattr; /* Header node attributes */ - char *Entry; /* Zip entry name or pattern */ + PCSZ Entry; /* Zip entry name or pattern */ int Coltype; /* Default column type */ int Limit; /* Limit of multiple values */ int Header; /* n first rows are header rows */ @@ -74,8 +74,8 @@ class DllExport TDBXML : public TDBASE { virtual PTDB Clone(PTABS t); virtual int GetRecpos(void); virtual int GetProgCur(void) {return N;} - virtual PSZ GetFile(PGLOBAL g) {return Xfile;} - virtual void SetFile(PGLOBAL g, PSZ fn) {Xfile = fn;} + virtual PCSZ GetFile(PGLOBAL g) {return Xfile;} + virtual void SetFile(PGLOBAL g, PCSZ fn) {Xfile = fn;} virtual void ResetDB(void) {N = 0;} virtual void ResetSize(void) {MaxSize = -1;} virtual int RowNumber(PGLOBAL g, bool b = false); @@ -127,7 +127,7 @@ class DllExport TDBXML : public TDBASE { bool Void; // True if the file does not exist bool Zipped; // True if Zipped XML file(s) bool Mulentries; // True if multiple entries in zip file - char *Xfile; // The XML file + PCSZ Xfile; // The XML file char *Enc; // New XML table file encoding char *Tabname; // Name of Table node char *Rowname; // Name of first level nodes @@ -138,7 +138,7 @@ class DllExport TDBXML : public TDBASE { char *DefNs; // Dummy name of default namespace char *Attrib; // Table node attribut(s) char *Hdattr; // Header node attribut(s) - char *Entry; // Zip entry name or pattern + PCSZ Entry; // Zip entry name or pattern int Coltype; // Default column type int Limit; // Limit of multiple values int Header; // n first rows are header rows @@ -155,7 +155,7 @@ class DllExport TDBXML : public TDBASE { class XMLCOL : public COLBLK { public: // Constructors - XMLCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am = "XML"); + XMLCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "XML"); XMLCOL(XMLCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation diff --git a/storage/connect/tabzip.cpp b/storage/connect/tabzip.cpp index b91059a3843..c026744dba8 100644 --- a/storage/connect/tabzip.cpp +++ b/storage/connect/tabzip.cpp @@ -195,8 +195,8 @@ void TDBZIP::CloseDB(PGLOBAL g) /***********************************************************************/ /* ZIPCOL public constructor. */ /***********************************************************************/ -ZIPCOL::ZIPCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am) - : COLBLK(cdp, tdbp, i) +ZIPCOL::ZIPCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am) + : COLBLK(cdp, tdbp, i) { if (cprec) { Next = cprec->GetNext(); diff --git a/storage/connect/tabzip.h b/storage/connect/tabzip.h index dcec3475371..32b15281f81 100644 --- a/storage/connect/tabzip.h +++ b/storage/connect/tabzip.h @@ -34,7 +34,7 @@ public: protected: // Members - PSZ target; // The inside file to query + PCSZ target; // The inside file to query }; // end of ZIPDEF /***********************************************************************/ @@ -68,7 +68,7 @@ protected: // Members unzFile zipfile; // The ZIP container file - PSZ zfn; // The ZIP file name + PCSZ zfn; // The ZIP file name //PSZ target; unz_file_info64 finfo; // The current file info char fn[FILENAME_MAX]; // The current file name @@ -82,7 +82,7 @@ class DllExport ZIPCOL : public COLBLK { friend class TDBZIP; public: // Constructors - ZIPCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am = "ZIP"); + ZIPCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "ZIP"); // Implementation virtual int GetAmType(void) { return TYPE_AM_ZIP; } diff --git a/storage/connect/user_connect.cc b/storage/connect/user_connect.cc index ca3557666a4..94d2c8ad5fd 100644 --- a/storage/connect/user_connect.cc +++ b/storage/connect/user_connect.cc @@ -1,4 +1,4 @@ -/* Copyright (C) Olivier Bertrand 2004 - 2015 +/* Copyright (C) MariaDB Corporation Ab This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,7 +24,7 @@ that is a connection with its personnal memory allocation. @note - + Author Olivier Bertrand */ /****************************************************************************/ @@ -47,6 +47,8 @@ #include "user_connect.h" #include "mycat.h" +extern pthread_mutex_t usrmut; + /****************************************************************************/ /* Initialize the user_connect static member. */ /****************************************************************************/ @@ -111,7 +113,10 @@ bool user_connect::user_init() int rc= PlugExit(g); g= NULL; - free(dup); + + if (dup) + free(dup); + return true; } // endif g-> @@ -122,14 +127,18 @@ bool user_connect::user_init() strcpy(ap->Ap_Name, "CONNECT"); g->Activityp= ap; g->Activityp->Aptr= dup; + + pthread_mutex_lock(&usrmut); next= to_users; to_users= this; if (next) next->previous= this; - last_query_id= thdp->query_id; - count= 1; + count = 1; + pthread_mutex_unlock(&usrmut); + + last_query_id= thdp->query_id; return false; } // end of user_init @@ -144,18 +153,25 @@ void user_connect::SetHandler(ha_connect *hc) /****************************************************************************/ /* Check whether we begin a new query and if so cleanup the previous one. */ /****************************************************************************/ -bool user_connect::CheckCleanup(void) +bool user_connect::CheckCleanup(bool force) { - if (thdp->query_id > last_query_id) { + if (thdp->query_id > last_query_id || force) { uint worksize= GetWorkSize(); PlugCleanup(g, true); if (g->Sarea_Size != worksize) { - if (g->Sarea) - free(g->Sarea); + if (g->Sarea) { +#if !defined(DEVELOPMENT) + if (trace) +#endif + htrc("CheckCleanup: Free Sarea at %p size=%d\n", + g->Sarea, g->Sarea_Size); - // Check whether the work area size was changed + free(g->Sarea); + } // endif Size + + // Check whether the work area could be allocated if (!(g->Sarea = PlugAllocMem(g, worksize))) { g->Sarea = PlugAllocMem(g, g->Sarea_Size); SetWorkSize(g->Sarea_Size); // Was too big @@ -171,7 +187,7 @@ bool user_connect::CheckCleanup(void) g->Mrr = 0; last_query_id= thdp->query_id; - if (trace) + if (trace && !force) printf("=====> Begin new query %llu\n", last_query_id); return true; diff --git a/storage/connect/user_connect.h b/storage/connect/user_connect.h index a883eb85934..983d9adc478 100644 --- a/storage/connect/user_connect.h +++ b/storage/connect/user_connect.h @@ -1,4 +1,4 @@ -/* Copyright (C) Olivier Bertrand 2004 - 2011 +/* Copyright (C) MariaDB Corporation Ab This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,6 +19,7 @@ Declaration of the user_connect class. @note + Author Olivier Bertrand @see /sql/handler.h and /storage/connect/user_connect.cc @@ -53,7 +54,7 @@ public: // Implementation bool user_init(); void SetHandler(ha_connect *hc); - bool CheckCleanup(void); + bool CheckCleanup(bool force = false); bool CheckQueryID(void) {return thdp->query_id > last_query_id;} bool CheckQuery(query_id_t vid) {return last_query_id > vid;} diff --git a/storage/connect/valblk.cpp b/storage/connect/valblk.cpp index 5fefcba5856..5b98f3eb425 100644 --- a/storage/connect/valblk.cpp +++ b/storage/connect/valblk.cpp @@ -1,7 +1,7 @@ /************ Valblk C++ Functions Source Code File (.CPP) *************/ -/* Name: VALBLK.CPP Version 2.1 */ +/* Name: VALBLK.CPP Version 2.3 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2005-2015 */ +/* (C) Copyright to the author Olivier BERTRAND 2005-2017 */ /* */ /* This file contains the VALBLK and derived classes functions. */ /* Second family is VALBLK, representing simple suballocated arrays */ @@ -138,14 +138,14 @@ PSZ VALBLK::GetCharValue(int) assert(g); sprintf(g->Message, MSG(NO_CHAR_FROM), Type); - longjmp(g->jumper[g->jump_level], Type); - return NULL; + throw Type; + return NULL; } // end of GetCharValue /***********************************************************************/ /* Set format so formatted dates can be converted on input. */ /***********************************************************************/ -bool VALBLK::SetFormat(PGLOBAL g, PSZ, int, int) +bool VALBLK::SetFormat(PGLOBAL g, PCSZ, int, int) { sprintf(g->Message, MSG(NO_DATE_FMT), Type); return true; @@ -206,8 +206,8 @@ void VALBLK::ChkIndx(int n) if (n < 0 || n >= Nval) { PGLOBAL& g = Global; strcpy(g->Message, MSG(BAD_VALBLK_INDX)); - longjmp(g->jumper[g->jump_level], Type); - } // endif n + throw Type; + } // endif n } // end of ChkIndx @@ -216,8 +216,8 @@ void VALBLK::ChkTyp(PVAL v) if (Check && (Type != v->GetType() || Unsigned != v->IsUnsigned())) { PGLOBAL& g = Global; strcpy(g->Message, MSG(VALTYPE_NOMATCH)); - longjmp(g->jumper[g->jump_level], Type); - } // endif Type + throw Type; + } // endif Type } // end of ChkTyp @@ -226,8 +226,8 @@ void VALBLK::ChkTyp(PVBLK vb) if (Check && (Type != vb->GetType() || Unsigned != vb->IsUnsigned())) { PGLOBAL& g = Global; strcpy(g->Message, MSG(VALTYPE_NOMATCH)); - longjmp(g->jumper[g->jump_level], Type); - } // endif Type + throw Type; + } // endif Type } // end of ChkTyp @@ -335,15 +335,15 @@ uchar TYPBLK::GetTypedValue(PVAL valp) /* Set one value in a block from a zero terminated string. */ /***********************************************************************/ template -void TYPBLK::SetValue(PSZ p, int n) +void TYPBLK::SetValue(PCSZ p, int n) { ChkIndx(n); if (Check) { PGLOBAL& g = Global; strcpy(g->Message, MSG(BAD_SET_STRING)); - longjmp(g->jumper[g->jump_level], Type); - } // endif Check + throw Type; + } // endif Check bool minus; ulonglong maxval = MaxVal(); @@ -385,15 +385,15 @@ template <> ulonglong TYPBLK::MaxVal(void) {return ULONGLONG_MAX;} template <> -void TYPBLK::SetValue(PSZ p, int n) +void TYPBLK::SetValue(PCSZ p, int n) { ChkIndx(n); if (Check) { PGLOBAL& g = Global; strcpy(g->Message, MSG(BAD_SET_STRING)); - longjmp(g->jumper[g->jump_level], Type); - } // endif Check + throw Type; + } // endif Check Typp[n] = atof(p); SetNull(n, false); @@ -403,7 +403,7 @@ void TYPBLK::SetValue(PSZ p, int n) /* Set one value in a block from an array of characters. */ /***********************************************************************/ template -void TYPBLK::SetValue(char *sp, uint len, int n) +void TYPBLK::SetValue(PCSZ sp, uint len, int n) { PGLOBAL& g = Global; PSZ spz = (PSZ)PlugSubAlloc(g, NULL, 0); // Temporary @@ -778,7 +778,7 @@ void CHRBLK::SetValue(PVAL valp, int n) /***********************************************************************/ /* Set one value in a block from a zero terminated string. */ /***********************************************************************/ -void CHRBLK::SetValue(PSZ sp, int n) +void CHRBLK::SetValue(PCSZ sp, int n) { uint len = (sp) ? strlen(sp) : 0; SetValue(sp, len, n); @@ -787,7 +787,7 @@ void CHRBLK::SetValue(PSZ sp, int n) /***********************************************************************/ /* Set one value in a block from an array of characters. */ /***********************************************************************/ -void CHRBLK::SetValue(char *sp, uint len, int n) +void CHRBLK::SetValue(const char *sp, uint len, int n) { char *p = Chrp + n * Long; @@ -795,8 +795,8 @@ void CHRBLK::SetValue(char *sp, uint len, int n) if (Check && (signed)len > Long) { PGLOBAL& g = Global; strcpy(g->Message, MSG(SET_STR_TRUNC)); - longjmp(g->jumper[g->jump_level], Type); - } // endif Check + throw Type; + } // endif Check #endif // _DEBUG if (sp) @@ -823,8 +823,8 @@ void CHRBLK::SetValue(PVBLK pv, int n1, int n2) if (Type != pv->GetType() || Long != ((CHRBLK*)pv)->Long) { PGLOBAL& g = Global; strcpy(g->Message, MSG(BLKTYPLEN_MISM)); - longjmp(g->jumper[g->jump_level], Type); - } // endif Type + throw Type; + } // endif Type if (!(b = pv->IsNull(n2))) memcpy(Chrp + n1 * Long, ((CHRBLK*)pv)->Chrp + n2 * Long, Long); @@ -874,8 +874,8 @@ void CHRBLK::SetValues(PVBLK pv, int k, int n) if (Type != pv->GetType() || Long != ((CHRBLK*)pv)->Long) { PGLOBAL& g = Global; strcpy(g->Message, MSG(BLKTYPLEN_MISM)); - longjmp(g->jumper[g->jump_level], Type); - } // endif Type + throw Type; + } // endif Type #endif // _DEBUG char *p = ((CHRBLK*)pv)->Chrp; @@ -1152,7 +1152,7 @@ void STRBLK::SetValue(PVAL valp, int n) /***********************************************************************/ /* Set one value in a block from a zero terminated string. */ /***********************************************************************/ -void STRBLK::SetValue(PSZ p, int n) +void STRBLK::SetValue(PCSZ p, int n) { if (p) { if (!Sorted || !n || !Strp[n-1] || strcmp(p, Strp[n-1])) @@ -1168,7 +1168,7 @@ void STRBLK::SetValue(PSZ p, int n) /***********************************************************************/ /* Set one value in a block from an array of characters. */ /***********************************************************************/ -void STRBLK::SetValue(char *sp, uint len, int n) +void STRBLK::SetValue(const char *sp, uint len, int n) { PSZ p; @@ -1316,7 +1316,7 @@ DATBLK::DATBLK(void *mp, int nval) : TYPBLK(mp, nval, TYPE_INT) /***********************************************************************/ /* Set format so formatted dates can be converted on input. */ /***********************************************************************/ -bool DATBLK::SetFormat(PGLOBAL g, PSZ fmt, int len, int year) +bool DATBLK::SetFormat(PGLOBAL g, PCSZ fmt, int len, int year) { if (!(Dvalp = AllocateValue(g, TYPE_DATE, len, year, false, fmt))) return true; @@ -1343,7 +1343,7 @@ char *DATBLK::GetCharString(char *p, int n) /***********************************************************************/ /* Set one value in a block from a char string. */ /***********************************************************************/ -void DATBLK::SetValue(PSZ p, int n) +void DATBLK::SetValue(PCSZ p, int n) { if (Dvalp) { // Decode the string according to format diff --git a/storage/connect/valblk.h b/storage/connect/valblk.h index c3cad79b234..38a73424985 100644 --- a/storage/connect/valblk.h +++ b/storage/connect/valblk.h @@ -91,7 +91,7 @@ class VALBLK : public BLOCK { virtual char *GetCharString(char *p, int n) = 0; virtual void ReAlloc(void *mp, int n) {Blkp = mp; Nval = n;} virtual void Reset(int n) = 0; - virtual bool SetFormat(PGLOBAL g, PSZ fmt, int len, int year = 0); + virtual bool SetFormat(PGLOBAL g, PCSZ fmt, int len, int year = 0); virtual void SetPrec(int p) {} virtual bool IsCi(void) {return false;} @@ -105,8 +105,8 @@ class VALBLK : public BLOCK { virtual void SetValue(double, int) {assert(false);} virtual void SetValue(char, int) {assert(false);} virtual void SetValue(uchar, int) {assert(false);} - virtual void SetValue(PSZ, int) {assert(false);} - virtual void SetValue(char *, uint, int) {assert(false);} + virtual void SetValue(PCSZ, int) {assert(false);} + virtual void SetValue(const char *, uint, int) {assert(false);} virtual void SetValue(PVAL valp, int n) = 0; virtual void SetValue(PVBLK pv, int n1, int n2) = 0; virtual void SetMin(PVAL valp, int n) = 0; @@ -165,8 +165,8 @@ class TYPBLK : public VALBLK { // Methods using VALBLK::SetValue; - virtual void SetValue(PSZ sp, int n); - virtual void SetValue(char *sp, uint len, int n); + virtual void SetValue(PCSZ sp, int n); + virtual void SetValue(const char *sp, uint len, int n); virtual void SetValue(short sval, int n) {Typp[n] = (TYPE)sval; SetNull(n, false);} virtual void SetValue(ushort sval, int n) @@ -236,8 +236,8 @@ class CHRBLK : public VALBLK { // Methods using VALBLK::SetValue; - virtual void SetValue(PSZ sp, int n); - virtual void SetValue(char *sp, uint len, int n); + virtual void SetValue(PCSZ sp, int n); + virtual void SetValue(const char *sp, uint len, int n); virtual void SetValue(PVAL valp, int n); virtual void SetValue(PVBLK pv, int n1, int n2); virtual void SetMin(PVAL valp, int n); @@ -290,8 +290,8 @@ class STRBLK : public VALBLK { // Methods using VALBLK::SetValue; - virtual void SetValue(PSZ sp, int n); - virtual void SetValue(char *sp, uint len, int n); + virtual void SetValue(PCSZ sp, int n); + virtual void SetValue(const char *sp, uint len, int n); virtual void SetValue(PVAL valp, int n); virtual void SetValue(PVBLK pv, int n1, int n2); virtual void SetMin(PVAL valp, int n); @@ -322,12 +322,12 @@ class DATBLK : public TYPBLK { DATBLK(void *mp, int size); // Implementation - virtual bool SetFormat(PGLOBAL g, PSZ fmt, int len, int year = 0); + virtual bool SetFormat(PGLOBAL g, PCSZ fmt, int len, int year = 0); virtual char *GetCharString(char *p, int n); // Methods using TYPBLK::SetValue; - virtual void SetValue(PSZ sp, int n); + virtual void SetValue(PCSZ sp, int n); protected: // Members @@ -352,7 +352,7 @@ class PTRBLK : public STRBLK { // Methods using STRBLK::SetValue; using STRBLK::CompVal; - virtual void SetValue(PSZ p, int n) {Strp[n] = p;} + virtual void SetValue(PCSZ p, int n) {Strp[n] = (char*)p;} virtual int CompVal(int i1, int i2); protected: diff --git a/storage/connect/value.cpp b/storage/connect/value.cpp index ced690e77c0..60d1c2f459c 100644 --- a/storage/connect/value.cpp +++ b/storage/connect/value.cpp @@ -1,7 +1,7 @@ /************* Value C++ Functions Source Code File (.CPP) *************/ -/* Name: VALUE.CPP Version 2.6 */ +/* Name: VALUE.CPP Version 2.8 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2001-2016 */ +/* (C) Copyright to the author Olivier BERTRAND 2001-2017 */ /* */ /* This file contains the VALUE and derived classes family functions. */ /* These classes contain values of different types. They are used so */ @@ -60,7 +60,7 @@ #define CheckType(V) if (Type != V->GetType()) { \ PGLOBAL& g = Global; \ strcpy(g->Message, MSG(VALTYPE_NOMATCH)); \ - longjmp(g->jumper[g->jump_level], Type); } + throw Type; #else #define CheckType(V) #endif @@ -94,12 +94,12 @@ PSZ strlwr(PSZ s); /* OUT minus: Set to true if the number is negative */ /* Returned val: The resulting number */ /***********************************************************************/ -ulonglong CharToNumber(char *p, int n, ulonglong maxval, +ulonglong CharToNumber(const char *p, int n, ulonglong maxval, bool un, bool *minus, bool *rc) { - char *p2; - uchar c; - ulonglong val; + const char *p2; + uchar c; + ulonglong val; if (minus) *minus = false; if (rc) *rc = false; @@ -119,6 +119,7 @@ ulonglong CharToNumber(char *p, int n, ulonglong maxval, if (minus) *minus = true; } // endif Unsigned + // Fall through case '+': p++; break; @@ -138,9 +139,9 @@ ulonglong CharToNumber(char *p, int n, ulonglong maxval, /***********************************************************************/ /* GetTypeName: returns the PlugDB internal type name. */ /***********************************************************************/ -PSZ GetTypeName(int type) +PCSZ GetTypeName(int type) { - PSZ name; + PCSZ name; switch (type) { case TYPE_STRING: name = "CHAR"; break; @@ -184,9 +185,9 @@ int GetTypeSize(int type, int len) /***********************************************************************/ /* GetFormatType: returns the FORMAT character(s) according to type. */ /***********************************************************************/ -char *GetFormatType(int type) +const char *GetFormatType(int type) { - char *c = "X"; + const char *c = "X"; switch (type) { case TYPE_STRING: c = "C"; break; @@ -370,7 +371,7 @@ PVAL AllocateValue(PGLOBAL g, void *value, short type, short prec) /* Allocate a variable Value according to type, length and precision. */ /***********************************************************************/ PVAL AllocateValue(PGLOBAL g, int type, int len, int prec, - bool uns, PSZ fmt) + bool uns, PCSZ fmt) { PVAL valp; @@ -558,6 +559,38 @@ bool VALUE::Compute(PGLOBAL g, PVAL *, int, OPVAL) return true; } // end of Compute +/***********************************************************************/ +/* Make file output of an object value. */ +/***********************************************************************/ +void VALUE::Printf(PGLOBAL g, FILE *f, uint n) +{ + char m[64], buf[64]; + + memset(m, ' ', n); /* Make margin string */ + m[n] = '\0'; + + if (Null) + fprintf(f, "%s\n", m); + else + fprintf(f, "%s%s\n", m, GetCharString(buf)); + +} /* end of Printf */ + +/***********************************************************************/ +/* Make string output of an object value. */ +/***********************************************************************/ +void VALUE::Prints(PGLOBAL g, char *ps, uint z) +{ + char *p, buf[64]; + + if (Null) + p = strcpy(buf, ""); + else + p = GetCharString(buf); + + strncpy(ps, p, z); +} // end of Prints + /* -------------------------- Class TYPVAL ---------------------------- */ /***********************************************************************/ @@ -632,7 +665,7 @@ bool TYPVAL::SetValue_pval(PVAL valp, bool chktype) if (chktype && Type != valp->GetType()) return true; - if (!(Null = valp->IsNull() && Nullable)) + if (!(Null = (valp->IsNull() && Nullable))) Tval = GetTypedValue(valp); else Reset(); @@ -682,7 +715,7 @@ uchar TYPVAL::GetTypedValue(PVAL valp) /* TYPVAL SetValue: convert chars extracted from a line to TYPE value.*/ /***********************************************************************/ template -bool TYPVAL::SetValue_char(char *p, int n) +bool TYPVAL::SetValue_char(const char *p, int n) { bool rc, minus; ulonglong maxval = MaxVal(); @@ -704,7 +737,7 @@ bool TYPVAL::SetValue_char(char *p, int n) } // end of SetValue template <> -bool TYPVAL::SetValue_char(char *p, int n) +bool TYPVAL::SetValue_char(const char *p, int n) { if (p && n > 0) { char buf[64]; @@ -732,7 +765,7 @@ bool TYPVAL::SetValue_char(char *p, int n) /* TYPVAL SetValue: fill a typed value from a string. */ /***********************************************************************/ template -void TYPVAL::SetValue_psz(PSZ s) +void TYPVAL::SetValue_psz(PCSZ s) { if (s) { SetValue_char(s, (int)strlen(s)); @@ -1019,12 +1052,12 @@ TYPE TYPVAL::SafeAdd(TYPE n1, TYPE n2) if ((n2 > 0) && (n < n1)) { // Overflow strcpy(g->Message, MSG(FIX_OVFLW_ADD)); - longjmp(g->jumper[g->jump_level], 138); - } else if ((n2 < 0) && (n > n1)) { + throw 138; + } else if ((n2 < 0) && (n > n1)) { // Underflow strcpy(g->Message, MSG(FIX_UNFLW_ADD)); - longjmp(g->jumper[g->jump_level], 138); - } // endif's n2 + throw 138; + } // endif's n2 return n; } // end of SafeAdd @@ -1047,12 +1080,12 @@ TYPE TYPVAL::SafeMult(TYPE n1, TYPE n2) if (n > MinMaxVal(true)) { // Overflow strcpy(g->Message, MSG(FIX_OVFLW_TIMES)); - longjmp(g->jumper[g->jump_level], 138); - } else if (n < MinMaxVal(false)) { + throw 138; + } else if (n < MinMaxVal(false)) { // Underflow strcpy(g->Message, MSG(FIX_UNFLW_TIMES)); - longjmp(g->jumper[g->jump_level], 138); - } // endif's n2 + throw 138; + } // endif's n2 return (TYPE)n; } // end of SafeMult @@ -1170,7 +1203,7 @@ bool TYPVAL::Compall(PGLOBAL g, PVAL *vp, int np, OPVAL op) /* This function assumes that the format matches the value type. */ /***********************************************************************/ template -bool TYPVAL::FormatValue(PVAL vp, char *fmt) +bool TYPVAL::FormatValue(PVAL vp, PCSZ fmt) { char *buf = (char*)vp->GetTo_Val(); // Should be big enough int n = sprintf(buf, fmt, Tval); @@ -1192,37 +1225,6 @@ bool TYPVAL::SetConstFormat(PGLOBAL g, FORMAT& fmt) return false; } // end of SetConstFormat -/***********************************************************************/ -/* Make file output of a typed object. */ -/***********************************************************************/ -template -void TYPVAL::Print(PGLOBAL g, FILE *f, uint n) - { - char m[64], buf[12]; - - memset(m, ' ', n); /* Make margin string */ - m[n] = '\0'; - - if (Null) - fprintf(f, "%s\n", m); - else - fprintf(f, strcat(strcat(strcpy(buf, "%s"), Fmt), "\n"), m, Tval); - - } /* end of Print */ - -/***********************************************************************/ -/* Make string output of a int object. */ -/***********************************************************************/ -template -void TYPVAL::Print(PGLOBAL g, char *ps, uint z) - { - if (Null) - strcpy(ps, ""); - else - sprintf(ps, Fmt, Tval); - - } /* end of Print */ - /* -------------------------- Class STRING --------------------------- */ /***********************************************************************/ @@ -1348,7 +1350,7 @@ bool TYPVAL::SetValue_pval(PVAL valp, bool chktype) char buf[64]; - if (!(Null = valp->IsNull() && Nullable)) + if (!(Null = (valp->IsNull() && Nullable))) strncpy(Strp, valp->GetCharString(buf), Len); else Reset(); @@ -1361,25 +1363,25 @@ bool TYPVAL::SetValue_pval(PVAL valp, bool chktype) /***********************************************************************/ /* STRING SetValue: fill string with chars extracted from a line. */ /***********************************************************************/ -bool TYPVAL::SetValue_char(char *p, int n) +bool TYPVAL::SetValue_char(const char *cp, int n) { bool rc = false; - if (!p || n == 0) { + if (!cp || n == 0) { Reset(); Null = Nullable; - } else if (p != Strp) { + } else if (cp != Strp) { + const char *p = cp + n - 1; + + for (p; p >= cp; p--, n--) + if (*p && *p != ' ') + break; + rc = n > Len; if ((n = MY_MIN(n, Len))) { - strncpy(Strp, p, n); - -// for (p = Strp + n - 1; p >= Strp && (*p == ' ' || *p == '\0'); p--) ; - for (p = Strp + n - 1; p >= Strp; p--) - if (*p && *p != ' ') - break; - - *(++p) = '\0'; + strncpy(Strp, cp, n); + Strp[n] = '\0'; if (trace > 1) htrc(" Setting string to: '%s'\n", Strp); @@ -1396,7 +1398,7 @@ bool TYPVAL::SetValue_char(char *p, int n) /***********************************************************************/ /* STRING SetValue: fill string with another string. */ /***********************************************************************/ -void TYPVAL::SetValue_psz(PSZ s) +void TYPVAL::SetValue_psz(PCSZ s) { if (!s) { Reset(); @@ -1432,8 +1434,8 @@ void TYPVAL::SetValue(int n) if (k > Len) { sprintf(g->Message, MSG(VALSTR_TOO_LONG), buf, Len); - longjmp(g->jumper[g->jump_level], 138); - } else + throw 138; + } else SetValue_psz(buf); Null = false; @@ -1450,7 +1452,7 @@ void TYPVAL::SetValue(uint n) if (k > Len) { sprintf(g->Message, MSG(VALSTR_TOO_LONG), buf, Len); - longjmp(g->jumper[g->jump_level], 138); + throw 138; } else SetValue_psz(buf); @@ -1486,8 +1488,8 @@ void TYPVAL::SetValue(longlong n) if (k > Len) { sprintf(g->Message, MSG(VALSTR_TOO_LONG), buf, Len); - longjmp(g->jumper[g->jump_level], 138); - } else + throw 138; + } else SetValue_psz(buf); Null = false; @@ -1504,7 +1506,7 @@ void TYPVAL::SetValue(ulonglong n) if (k > Len) { sprintf(g->Message, MSG(VALSTR_TOO_LONG), buf, Len); - longjmp(g->jumper[g->jump_level], 138); + throw 138; } else SetValue_psz(buf); @@ -1529,8 +1531,8 @@ void TYPVAL::SetValue(double f) if (k > Len) { sprintf(g->Message, MSG(VALSTR_TOO_LONG), buf, Len); - longjmp(g->jumper[g->jump_level], 138); - } else + throw 138; + } else SetValue_psz(buf); Null = false; @@ -1559,7 +1561,7 @@ void TYPVAL::SetValue(uchar c) /***********************************************************************/ void TYPVAL::SetBinValue(void *p) { - SetValue_char((char *)p, Len); + SetValue_char((const char *)p, Len); } // end of SetBinValue /***********************************************************************/ @@ -1654,33 +1656,38 @@ bool TYPVAL::Compute(PGLOBAL g, PVAL *vp, int np, OPVAL op) int i; for (i = 0; i < np; i++) - p[i] = vp[i]->GetCharString(val[i]); + p[i] = vp[i]->IsNull() ? NULL : vp[i]->GetCharString(val[i]); - switch (op) { - case OP_CNC: - assert(np == 1 || np == 2); + if (p[i-1]) { + switch (op) { + case OP_CNC: + assert(np == 1 || np == 2); - if (np == 2) - SetValue_psz(p[0]); + if (np == 2) + SetValue_psz(p[0]); - if ((i = Len - (signed)strlen(Strp)) > 0) - strncat(Strp, p[np - 1], i); + if ((i = Len - (signed)strlen(Strp)) > 0) + strncat(Strp, p[np - 1], i); - break; - case OP_MIN: - assert(np == 2); - SetValue_psz((strcmp(p[0], p[1]) < 0) ? p[0] : p[1]); - break; - case OP_MAX: - assert(np == 2); - SetValue_psz((strcmp(p[0], p[1]) > 0) ? p[0] : p[1]); - break; - default: -// sprintf(g->Message, MSG(BAD_EXP_OPER), op); - strcpy(g->Message, "Function not supported"); - return true; - } // endswitch op + break; + case OP_MIN: + assert(np == 2); + SetValue_psz((strcmp(p[0], p[1]) < 0) ? p[0] : p[1]); + break; + case OP_MAX: + assert(np == 2); + SetValue_psz((strcmp(p[0], p[1]) > 0) ? p[0] : p[1]); + break; + default: + // sprintf(g->Message, MSG(BAD_EXP_OPER), op); + strcpy(g->Message, "Function not supported"); + return true; + } // endswitch op + Null = false; + } // endif p[i] + + Null = false; return false; } // end of Compute @@ -1689,7 +1696,7 @@ bool TYPVAL::Compute(PGLOBAL g, PVAL *vp, int np, OPVAL op) /* constructed from its own value formated using the fmt format. */ /* This function assumes that the format matches the value type. */ /***********************************************************************/ -bool TYPVAL::FormatValue(PVAL vp, char *fmt) +bool TYPVAL::FormatValue(PVAL vp, PCSZ fmt) { char *buf = (char*)vp->GetTo_Val(); // Should be big enough int n = sprintf(buf, fmt, Strp); @@ -1708,6 +1715,18 @@ bool TYPVAL::SetConstFormat(PGLOBAL, FORMAT& fmt) return false; } // end of SetConstFormat +/***********************************************************************/ +/* Make string output of an object value. */ +/***********************************************************************/ +void TYPVAL::Prints(PGLOBAL g, char *ps, uint z) +{ + if (Null) + strncpy(ps, "null", z); + else + strcat(strncat(strncpy(ps, "\"", z), Strp, z-2), "\""); + +} // end of Prints + /* -------------------------- Class DECIMAL -------------------------- */ /***********************************************************************/ @@ -1797,102 +1816,6 @@ bool DECVAL::GetBinValue(void *buf, int buflen, bool go) return false; } // end of GetBinValue -#if 0 -/***********************************************************************/ -/* DECIMAL SetValue: copy the value of another Value object. */ -/***********************************************************************/ -bool DECVAL::SetValue_pval(PVAL valp, bool chktype) - { - if (chktype && (valp->GetType() != Type || valp->GetSize() > Len)) - return true; - - char buf[64]; - - if (!(Null = valp->IsNull() && Nullable)) - strncpy(Strp, valp->GetCharString(buf), Len); - else - Reset(); - - return false; - } // end of SetValue_pval - -/***********************************************************************/ -/* DECIMAL SetValue: fill string with chars extracted from a line. */ -/***********************************************************************/ -bool DECVAL::SetValue_char(char *p, int n) - { - bool rc; - - if (p && n > 0) { - rc = n > Len; - - if ((n = MY_MIN(n, Len))) { - strncpy(Strp, p, n); - -// for (p = Strp + n - 1; p >= Strp && (*p == ' ' || *p == '\0'); p--) ; - for (p = Strp + n - 1; p >= Strp; p--) - if (*p && *p != ' ') - break; - - *(++p) = '\0'; - - if (trace > 1) - htrc(" Setting string to: '%s'\n", Strp); - - } else - Reset(); - - Null = false; - } else { - rc = false; - Reset(); - Null = Nullable; - } // endif p - - return rc; - } // end of SetValue_char - -/***********************************************************************/ -/* DECIMAL SetValue: fill string with another string. */ -/***********************************************************************/ -void DECVAL::SetValue_psz(PSZ s) - { - if (s) { - strncpy(Strp, s, Len); - Null = false; - } else { - Reset(); - Null = Nullable; - } // endif s - - } // end of SetValue_psz - -/***********************************************************************/ -/* DECIMAL SetValue: fill string with a string extracted from a block.*/ -/***********************************************************************/ -void DECVAL::SetValue_pvblk(PVBLK blk, int n) - { - // STRBLK's can return a NULL pointer - SetValue_psz(blk->GetCharValue(n)); - } // end of SetValue_pvblk - -/***********************************************************************/ -/* DECIMAL SetBinValue: fill string with chars extracted from a line. */ -/***********************************************************************/ -void DECVAL::SetBinValue(void *p) - { - SetValue_char((char *)p, Len); - } // end of SetBinValue - -/***********************************************************************/ -/* DECIMAL GetCharString: get string representation of a char value. */ -/***********************************************************************/ -char *DECVAL::GetCharString(char *p) - { - return Strp; - } // end of GetCharString -#endif // 0 - /***********************************************************************/ /* DECIMAL compare value with another Value. */ /***********************************************************************/ @@ -1927,32 +1850,6 @@ int DECVAL::CompareValue(PVAL vp) return (f > n) ? 1 : (f < n) ? (-1) : 0; } // end of CompareValue -#if 0 -/***********************************************************************/ -/* FormatValue: This function set vp (a STRING value) to the string */ -/* constructed from its own value formated using the fmt format. */ -/* This function assumes that the format matches the value type. */ -/***********************************************************************/ -bool DECVAL::FormatValue(PVAL vp, char *fmt) - { - char *buf = (char*)vp->GetTo_Val(); // Should be big enough - int n = sprintf(buf, fmt, Strp); - - return (n > vp->GetValLen()); - } // end of FormatValue - -/***********************************************************************/ -/* DECIMAL SetFormat function (used to set SELECT output format). */ -/***********************************************************************/ -bool DECVAL::SetConstFormat(PGLOBAL g, FORMAT& fmt) - { - fmt.Type[0] = 'C'; - fmt.Length = Len; - fmt.Prec = 0; - return false; - } // end of SetConstFormat -#endif // 0 - /* -------------------------- Class BINVAL --------------------------- */ /***********************************************************************/ @@ -2110,7 +2007,7 @@ bool BINVAL::SetValue_pval(PVAL valp, bool chktype) /***********************************************************************/ /* BINVAL SetValue: fill value with chars extracted from a line. */ /***********************************************************************/ -bool BINVAL::SetValue_char(char *p, int n) +bool BINVAL::SetValue_char(const char *p, int n) { bool rc; @@ -2131,7 +2028,7 @@ bool BINVAL::SetValue_char(char *p, int n) /***********************************************************************/ /* BINVAL SetValue: fill value with another string. */ /***********************************************************************/ -void BINVAL::SetValue_psz(PSZ s) +void BINVAL::SetValue_psz(PCSZ s) { if (s) { Len = MY_MIN(Clen, (signed)strlen(s)); @@ -2357,7 +2254,7 @@ bool BINVAL::IsEqual(PVAL vp, bool chktype) /* constructed from its own value formated using the fmt format. */ /* This function assumes that the format matches the value type. */ /***********************************************************************/ -bool BINVAL::FormatValue(PVAL vp, char *fmt) +bool BINVAL::FormatValue(PVAL vp, PCSZ fmt) { char *buf = (char*)vp->GetTo_Val(); // Should be big enough int n = sprintf(buf, fmt, Len, Binp); @@ -2381,7 +2278,7 @@ bool BINVAL::SetConstFormat(PGLOBAL, FORMAT& fmt) /***********************************************************************/ /* DTVAL public constructor for new void values. */ /***********************************************************************/ -DTVAL::DTVAL(PGLOBAL g, int n, int prec, PSZ fmt) +DTVAL::DTVAL(PGLOBAL g, int n, int prec, PCSZ fmt) : TYPVAL((int)0, TYPE_DATE) { if (!fmt) { @@ -2410,7 +2307,7 @@ DTVAL::DTVAL(int n) : TYPVAL(n, TYPE_DATE) /***********************************************************************/ /* Set format so formatted dates can be converted on input/output. */ /***********************************************************************/ -bool DTVAL::SetFormat(PGLOBAL g, PSZ fmt, int len, int year) +bool DTVAL::SetFormat(PGLOBAL g, PCSZ fmt, int len, int year) { Pdtp = MakeDateFormat(g, fmt, true, true, (year > 9999) ? 1 : 0); Sdate = (char*)PlugSubAlloc(g, NULL, len + 1); @@ -2668,7 +2565,11 @@ bool DTVAL::SetValue_pval(PVAL valp, bool chktype) ndv = ExtractDate(valp->GetCharValue(), Pdtp, DefYear, dval); MakeDate(NULL, dval, ndv); - } else + } else if (valp->GetType() == TYPE_BIGINT && + !(valp->GetBigintValue() % 1000)) { + // Assuming that this timestamp is in milliseconds + Tval = (int)(valp->GetBigintValue() / 1000); + } else Tval = valp->GetIntValue(); } else @@ -2682,14 +2583,14 @@ bool DTVAL::SetValue_pval(PVAL valp, bool chktype) /***********************************************************************/ /* SetValue: convert chars extracted from a line to date value. */ /***********************************************************************/ -bool DTVAL::SetValue_char(char *p, int n) +bool DTVAL::SetValue_char(const char *p, int n) { bool rc= 0; if (Pdtp) { - char *p2; - int ndv; - int dval[6]; + const char *p2; + int ndv; + int dval[6]; if (n > 0) { // Trim trailing blanks @@ -2721,11 +2622,11 @@ bool DTVAL::SetValue_char(char *p, int n) /***********************************************************************/ /* SetValue: convert a char string to date value. */ /***********************************************************************/ -void DTVAL::SetValue_psz(PSZ p) +void DTVAL::SetValue_psz(PCSZ p) { if (Pdtp) { - int ndv; - int dval[6]; + int ndv; + int dval[6]; strncpy(Sdate, p, Len); Sdate[Len] = '\0'; @@ -2815,8 +2716,10 @@ char *DTVAL::ShowValue(char *buf, int len) strncat(p, "Error", m); } // endif n - } else - p = ""; // DEFAULT VALUE ??? + } else { + p = buf; + *p = '\0'; // DEFAULT VALUE ??? + } // endif Null return p; } else @@ -2881,7 +2784,7 @@ bool DTVAL::WeekNum(PGLOBAL g, int& nval) /* constructed from its own value formated using the fmt format. */ /* This function assumes that the format matches the value type. */ /***********************************************************************/ -bool DTVAL::FormatValue(PVAL vp, char *fmt) +bool DTVAL::FormatValue(PVAL vp, PCSZ fmt) { char *buf = (char*)vp->GetTo_Val(); // Should be big enough struct tm tm, *ptm = GetGmTime(&tm); diff --git a/storage/connect/value.h b/storage/connect/value.h index 14a568c3549..f771d33dc52 100644 --- a/storage/connect/value.h +++ b/storage/connect/value.h @@ -1,7 +1,7 @@ /**************** Value H Declares Source Code File (.H) ***************/ -/* Name: VALUE.H Version 2.2 */ +/* Name: VALUE.H Version 2.3 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2001-2016 */ +/* (C) Copyright to the author Olivier BERTRAND 2001-2017 */ /* */ /* This file contains the VALUE and derived classes declares. */ /***********************************************************************/ @@ -40,14 +40,14 @@ typedef struct _datpar *PDTP; // For DTVAL /* Utilities used to test types and to allocated values. */ /***********************************************************************/ // Exported functions -DllExport PSZ GetTypeName(int); +DllExport PCSZ GetTypeName(int); DllExport int GetTypeSize(int, int); #ifdef ODBC_SUPPORT /* This function is exported for use in OEM table type DLLs */ DllExport int TranslateSQLType(int stp, int prec, int& len, char& v, bool& w); #endif -DllExport char *GetFormatType(int); +DllExport const char *GetFormatType(int); DllExport int GetFormatType(char); DllExport bool IsTypeChar(int type); DllExport bool IsTypeNum(int type); @@ -55,8 +55,8 @@ DllExport int ConvertType(int, int, CONV, bool match = false); DllExport PVAL AllocateValue(PGLOBAL, void *, short, short = 2); DllExport PVAL AllocateValue(PGLOBAL, PVAL, int = TYPE_VOID, int = 0); DllExport PVAL AllocateValue(PGLOBAL, int, int len = 0, int prec = 0, - bool uns = false, PSZ fmt = NULL); -DllExport ulonglong CharToNumber(char *, int, ulonglong, bool, + bool uns = false, PCSZ fmt = NULL); +DllExport ulonglong CharToNumber(PCSZ, int, ulonglong, bool, bool *minus = NULL, bool *rc = NULL); DllExport BYTE OpBmp(PGLOBAL g, OPVAL opc); @@ -90,8 +90,8 @@ class DllExport VALUE : public BLOCK { virtual double GetFloatValue(void) = 0; virtual void *GetTo_Val(void) = 0; virtual void SetPrec(int prec) {Prec = prec;} - bool IsNull(void) {return Null;} - void SetNull(bool b) {Null = b;} + bool IsNull(void) {return (Nullable && Null);} + void SetNull(bool b) {Null = (Nullable ? b : false);} bool GetNullable(void) {return Nullable;} void SetNullable(bool b) {Nullable = b;} int GetType(void) {return Type;} @@ -100,8 +100,8 @@ class DllExport VALUE : public BLOCK { // Methods virtual bool SetValue_pval(PVAL valp, bool chktype = false) = 0; - virtual bool SetValue_char(char *p, int n) = 0; - virtual void SetValue_psz(PSZ s) = 0; + virtual bool SetValue_char(const char *p, int n) = 0; + virtual void SetValue_psz(PCSZ s) = 0; virtual void SetValue_bool(bool) {assert(FALSE);} virtual int CompareValue(PVAL vp) = 0; virtual BYTE TestValue(PVAL vp); @@ -121,7 +121,9 @@ class DllExport VALUE : public BLOCK { virtual char *GetCharString(char *p) = 0; virtual bool IsEqual(PVAL vp, bool chktype) = 0; virtual bool Compute(PGLOBAL g, PVAL *vp, int np, OPVAL op); - virtual bool FormatValue(PVAL vp, char *fmt) = 0; + virtual bool FormatValue(PVAL vp, PCSZ fmt) = 0; + virtual void Printf(PGLOBAL g, FILE *, uint); + virtual void Prints(PGLOBAL g, char *ps, uint z); /** Set value from a non-aligned in-memory value in the machine byte order. @@ -211,8 +213,8 @@ class DllExport TYPVAL : public VALUE { // Methods virtual bool SetValue_pval(PVAL valp, bool chktype); - virtual bool SetValue_char(char *p, int n); - virtual void SetValue_psz(PSZ s); + virtual bool SetValue_char(const char *p, int n); + virtual void SetValue_psz(PCSZ s); virtual void SetValue_bool(bool b) {Tval = (b) ? 1 : 0;} virtual int CompareValue(PVAL vp); virtual void SetValue(char c) {Tval = (TYPE)c; Null = false;} @@ -232,9 +234,7 @@ class DllExport TYPVAL : public VALUE { virtual bool IsEqual(PVAL vp, bool chktype); virtual bool Compute(PGLOBAL g, PVAL *vp, int np, OPVAL op); virtual bool SetConstFormat(PGLOBAL, FORMAT&); - virtual bool FormatValue(PVAL vp, char *fmt); - virtual void Print(PGLOBAL g, FILE *, uint); - virtual void Print(PGLOBAL g, char *, uint); + virtual bool FormatValue(PVAL vp, PCSZ fmt); protected: static TYPE MinMaxVal(bool b); @@ -287,8 +287,8 @@ class DllExport TYPVAL: public VALUE { // Methods virtual bool SetValue_pval(PVAL valp, bool chktype); - virtual bool SetValue_char(char *p, int n); - virtual void SetValue_psz(PSZ s); + virtual bool SetValue_char(const char *p, int n); + virtual void SetValue_psz(PCSZ s); virtual void SetValue_pvblk(PVBLK blk, int n); virtual void SetValue(char c); virtual void SetValue(uchar c); @@ -306,8 +306,9 @@ class DllExport TYPVAL: public VALUE { virtual char *GetCharString(char *p); virtual bool IsEqual(PVAL vp, bool chktype); virtual bool Compute(PGLOBAL g, PVAL *vp, int np, OPVAL op); - virtual bool FormatValue(PVAL vp, char *fmt); + virtual bool FormatValue(PVAL vp, PCSZ fmt); virtual bool SetConstFormat(PGLOBAL, FORMAT&); + virtual void Prints(PGLOBAL g, char *ps, uint z); protected: // Members @@ -371,8 +372,8 @@ class DllExport BINVAL: public VALUE { // Methods virtual bool SetValue_pval(PVAL valp, bool chktype); - virtual bool SetValue_char(char *p, int n); - virtual void SetValue_psz(PSZ s); + virtual bool SetValue_char(const char *p, int n); + virtual void SetValue_psz(PCSZ s); virtual void SetValue_pvblk(PVBLK blk, int n); virtual void SetValue(char c); virtual void SetValue(uchar c); @@ -389,7 +390,7 @@ class DllExport BINVAL: public VALUE { virtual char *ShowValue(char *buf, int); virtual char *GetCharString(char *p); virtual bool IsEqual(PVAL vp, bool chktype); - virtual bool FormatValue(PVAL vp, char *fmt); + virtual bool FormatValue(PVAL vp, PCSZ fmt); virtual bool SetConstFormat(PGLOBAL, FORMAT&); protected: @@ -405,18 +406,18 @@ class DllExport BINVAL: public VALUE { class DllExport DTVAL : public TYPVAL { public: // Constructors - DTVAL(PGLOBAL g, int n, int p, PSZ fmt); + DTVAL(PGLOBAL g, int n, int p, PCSZ fmt); DTVAL(int n); // Implementation virtual bool SetValue_pval(PVAL valp, bool chktype); - virtual bool SetValue_char(char *p, int n); - virtual void SetValue_psz(PSZ s); + virtual bool SetValue_char(const char *p, int n); + virtual void SetValue_psz(PCSZ s); virtual void SetValue_pvblk(PVBLK blk, int n); virtual char *GetCharString(char *p); virtual char *ShowValue(char *buf, int); - virtual bool FormatValue(PVAL vp, char *fmt); - bool SetFormat(PGLOBAL g, PSZ fmt, int len, int year = 0); + virtual bool FormatValue(PVAL vp, PCSZ fmt); + bool SetFormat(PGLOBAL g, PCSZ fmt, int len, int year = 0); bool SetFormat(PGLOBAL g, PVAL valp); bool IsFormatted(void) {return Pdtp != NULL;} bool MakeTime(struct tm *ptm); diff --git a/storage/connect/xindex.cpp b/storage/connect/xindex.cpp index 15fb71ab88a..30dce3b7fef 100755 --- a/storage/connect/xindex.cpp +++ b/storage/connect/xindex.cpp @@ -1,7 +1,7 @@ /***************** Xindex C++ Class Xindex Code (.CPP) *****************/ -/* Name: XINDEX.CPP Version 2.9 */ +/* Name: XINDEX.CPP Version 3.0 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2004-2015 */ +/* (C) Copyright to the author Olivier BERTRAND 2004-2017 */ /* */ /* This file contains the class XINDEX implementation code. */ /***********************************************************************/ @@ -181,23 +181,23 @@ XXBASE::XXBASE(PTDBDOS tbxp, bool b) : CSORT(b), /***********************************************************************/ /* Make file output of XINDEX contents. */ /***********************************************************************/ -void XXBASE::Print(PGLOBAL, FILE *f, uint n) +void XXBASE::Printf(PGLOBAL, FILE *f, uint n) { char m[64]; memset(m, ' ', n); // Make margin string m[n] = '\0'; fprintf(f, "%sXINDEX: Tbxp=%p Num=%d\n", m, Tbxp, Num_K); - } // end of Print + } // end of Printf /***********************************************************************/ /* Make string output of XINDEX contents. */ /***********************************************************************/ -void XXBASE::Print(PGLOBAL, char *ps, uint z) +void XXBASE::Prints(PGLOBAL, char *ps, uint z) { *ps = '\0'; strncat(ps, "Xindex", z); - } // end of Print + } // end of Prints /* -------------------------- XINDEX Class --------------------------- */ @@ -446,8 +446,8 @@ bool XINDEX::Make(PGLOBAL g, PIXDEF sxp) #if 0 if (!dup->Step) { strcpy(g->Message, MSG(QUERY_CANCELLED)); - longjmp(g->jumper[g->jump_level], 99); - } // endif Step + throw 99; + } // endif Step #endif // 0 /*******************************************************************/ @@ -464,7 +464,7 @@ bool XINDEX::Make(PGLOBAL g, PIXDEF sxp) if (ApplyFilter(g, filp)) break; - // passthru + // fall through case RC_NF: continue; case RC_EF: @@ -819,7 +819,7 @@ bool XINDEX::Reorder(PGLOBAL g __attribute__((unused))) /***********************************************************************/ bool XINDEX::SaveIndex(PGLOBAL g, PIXDEF sxp) { - char *ftype; + PCSZ ftype; char fn[_MAX_PATH]; int n[NZ], nof = (Mul) ? (Ndif + 1) : 0; int id = -1, size = 0; @@ -948,7 +948,7 @@ bool XINDEX::Init(PGLOBAL g) /* Table will be accessed through an index table. */ /* If sorting is required, this will be done later. */ /*********************************************************************/ - char *ftype; + PCSZ ftype; char fn[_MAX_PATH]; int k, n, nv[NZ], id = -1; bool estim = false; @@ -965,7 +965,7 @@ bool XINDEX::Init(PGLOBAL g) // For DBF tables, Cardinality includes bad or soft deleted lines // that are not included in the index, and can be larger then the // index size. - estim = (Tdbp->Ftype == RECFM_DBF); + estim = (Tdbp->Ftype == RECFM_DBF || Tdbp->Txfp->GetAmType() == TYPE_AM_ZIP); n = Tdbp->Cardinality(g); // n is exact table size } else { // Variable table not optimized @@ -1412,7 +1412,7 @@ err: /***********************************************************************/ bool XINDEX::GetAllSizes(PGLOBAL g,/* int &ndif,*/ int &numk) { - char *ftype; + PCSZ ftype; char fn[_MAX_PATH]; int nv[NZ], id = -1; // n //bool estim = false; @@ -2320,9 +2320,9 @@ XFILE::XFILE(void) : XLOAD() /***********************************************************************/ bool XFILE::Open(PGLOBAL g, char *filename, int id, MODE mode) { - char *pmod; - bool rc; - IOFF noff[MAX_INDX]; + PCSZ pmod; + bool rc; + IOFF noff[MAX_INDX]; /*********************************************************************/ /* Open the index file according to mode. */ @@ -3008,7 +3008,8 @@ KXYCOL::KXYCOL(PKXBASE kp) : To_Keys(Keys.Memp), /***********************************************************************/ bool KXYCOL::Init(PGLOBAL g, PCOL colp, int n, bool sm, int kln) { - int len = colp->GetLength(), prec = colp->GetScale(); + int len = colp->GetLength(), prec = colp->GetScale(); + bool un = colp->IsUnsigned(); // Currently no indexing on NULL columns if (colp->IsNullable() && kln) { @@ -3028,11 +3029,11 @@ bool KXYCOL::Init(PGLOBAL g, PCOL colp, int n, bool sm, int kln) // Allocate the Value object used when moving items Type = colp->GetResultType(); - if (!(Valp = AllocateValue(g, Type, len, prec, colp->IsUnsigned()))) + if (!(Valp = AllocateValue(g, Type, len, prec, un))) return true; Klen = Valp->GetClen(); - Keys.Size = n * Klen; + Keys.Size = (size_t)n * (size_t)Klen; if (!PlgDBalloc(g, NULL, Keys)) { sprintf(g->Message, MSG(KEY_ALLOC_ERROR), Klen, n); @@ -3044,7 +3045,7 @@ bool KXYCOL::Init(PGLOBAL g, PCOL colp, int n, bool sm, int kln) // Currently we set it to true to be compatible with QRY blocks, // and the one before last is to enable length/type checking, set to // true if not a prefix key. - Kblp = AllocValBlock(g, To_Keys, Type, n, len, prec, !Prefix, true); + Kblp = AllocValBlock(g, To_Keys, Type, n, len, prec, !Prefix, true, un); Asc = sm; // Sort mode: Asc=true Desc=false Ndf = n; @@ -3064,7 +3065,8 @@ bool KXYCOL::Init(PGLOBAL g, PCOL colp, int n, bool sm, int kln) /***********************************************************************/ BYTE* KXYCOL::MapInit(PGLOBAL g, PCOL colp, int *n, BYTE *m) { - int len = colp->GetLength(), prec = colp->GetScale(); + int len = colp->GetLength(), prec = colp->GetScale(); + bool un = colp->IsUnsigned(); if (n[3] && colp->GetLength() > n[3] && colp->GetResultType() == TYPE_STRING) { @@ -3079,7 +3081,7 @@ BYTE* KXYCOL::MapInit(PGLOBAL g, PCOL colp, int *n, BYTE *m) this, colp, Type, n[0], len, m); // Allocate the Value object used when moving items - Valp = AllocateValue(g, Type, len, prec, colp->IsUnsigned()); + Valp = AllocateValue(g, Type, len, prec, un); Klen = Valp->GetClen(); if (n[2]) { @@ -3088,7 +3090,7 @@ BYTE* KXYCOL::MapInit(PGLOBAL g, PCOL colp, int *n, BYTE *m) Bkeys.Sub = true; // Allocate the Valblk containing initial block key values - Blkp = AllocValBlock(g, To_Bkeys, Type, n[2], len, prec, true, true); + Blkp = AllocValBlock(g, To_Bkeys, Type, n[2], len, prec, true, true, un); } // endif nb Keys.Size = n[0] * Klen; @@ -3099,7 +3101,7 @@ BYTE* KXYCOL::MapInit(PGLOBAL g, PCOL colp, int *n, BYTE *m) // by blanks (if true) or keep the zero ending char (if false). // Currently we set it to true to be compatible with QRY blocks, // and last one to enable type checking (no conversion). - Kblp = AllocValBlock(g, To_Keys, Type, n[0], len, prec, !Prefix, true); + Kblp = AllocValBlock(g, To_Keys, Type, n[0], len, prec, !Prefix, true, un); if (n[1]) { Koff.Size = n[1] * sizeof(int); diff --git a/storage/connect/xindex.h b/storage/connect/xindex.h index 2d10d72722e..339d7e68b75 100644 --- a/storage/connect/xindex.h +++ b/storage/connect/xindex.h @@ -200,8 +200,8 @@ class DllExport XXBASE : public CSORT, public BLOCK { void FreeIndex(void) {PlgDBfree(Index);} // Methods - virtual void Print(PGLOBAL g, FILE *f, uint n); - virtual void Print(PGLOBAL g, char *ps, uint z); + virtual void Printf(PGLOBAL g, FILE *f, uint n); + virtual void Prints(PGLOBAL g, char *ps, uint z); virtual bool Init(PGLOBAL g) = 0; virtual bool Make(PGLOBAL g, PIXDEF sxp) = 0; #if defined(XMAP) diff --git a/storage/connect/xobject.cpp b/storage/connect/xobject.cpp index a0b7849543d..85af3779701 100644 --- a/storage/connect/xobject.cpp +++ b/storage/connect/xobject.cpp @@ -1,7 +1,7 @@ /************ Xobject C++ Functions Source Code File (.CPP) ************/ -/* Name: XOBJECT.CPP Version 2.4 */ +/* Name: XOBJECT.CPP Version 2.5 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 1998-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 1998-2017 */ /* */ /* This file contains base XOBJECT class functions. */ /* Also here is the implementation of the CONSTANT class. */ @@ -84,7 +84,7 @@ double XOBJECT::GetFloatValue(void) CONSTANT::CONSTANT(PGLOBAL g, void *value, short type) { if (!(Value = AllocateValue(g, value, (int)type))) - longjmp(g->jumper[g->jump_level], TYPE_CONST); + throw (int)TYPE_CONST; Constant = true; } // end of CONSTANT constructor @@ -95,7 +95,7 @@ CONSTANT::CONSTANT(PGLOBAL g, void *value, short type) CONSTANT::CONSTANT(PGLOBAL g, int n) { if (!(Value = AllocateValue(g, &n, TYPE_INT))) - longjmp(g->jumper[g->jump_level], TYPE_CONST); + throw (int)TYPE_CONST; Constant = true; } // end of CONSTANT constructor @@ -117,7 +117,7 @@ void CONSTANT::Convert(PGLOBAL g, int newtype) { if (Value->GetType() != newtype) if (!(Value = AllocateValue(g, Value, newtype))) - longjmp(g->jumper[g->jump_level], TYPE_CONST); + throw (int)TYPE_CONST; } // end of Convert @@ -173,18 +173,18 @@ bool CONSTANT::Rephrase(PGLOBAL g, PSZ work) /***********************************************************************/ /* Make file output of a constant object. */ /***********************************************************************/ -void CONSTANT::Print(PGLOBAL g, FILE *f, uint n) +void CONSTANT::Printf(PGLOBAL g, FILE *f, uint n) { - Value->Print(g, f, n); - } /* end of Print */ + Value->Printf(g, f, n); + } /* end of Printf */ /***********************************************************************/ /* Make string output of a constant object. */ /***********************************************************************/ -void CONSTANT::Print(PGLOBAL g, char *ps, uint z) +void CONSTANT::Prints(PGLOBAL g, char *ps, uint z) { - Value->Print(g, ps, z); - } /* end of Print */ + Value->Prints(g, ps, z); + } /* end of Prints */ /* -------------------------- Class STRING --------------------------- */ @@ -192,7 +192,7 @@ void CONSTANT::Print(PGLOBAL g, char *ps, uint z) /* STRING public constructor for new char values. Alloc Size must be */ /* calculated because PlugSubAlloc rounds up size to multiple of 8. */ /***********************************************************************/ -STRING::STRING(PGLOBAL g, uint n, char *str) +STRING::STRING(PGLOBAL g, uint n, PCSZ str) { G = g; Length = (str) ? strlen(str) : 0; @@ -205,10 +205,12 @@ STRING::STRING(PGLOBAL g, uint n, char *str) Next = GetNext(); Size = Next - Strp; + Trc = false; } else { // This should normally never happen Next = NULL; Size = 0; + Trc = true; } // endif Strp } // end of STRING constructor @@ -229,6 +231,7 @@ char *STRING::Realloc(uint len) if (!p) { // No more room in Sarea; this is very unlikely strcpy(G->Message, "No more room in work area"); + Trc = true; return NULL; } // endif p @@ -243,7 +246,7 @@ char *STRING::Realloc(uint len) /***********************************************************************/ /* Set a STRING new PSZ value. */ /***********************************************************************/ -bool STRING::Set(PSZ s) +bool STRING::Set(PCSZ s) { if (!s) return false; @@ -333,9 +336,9 @@ bool STRING::Append(const char *s, uint ln, bool nq) } // end of Append /***********************************************************************/ -/* Append a PSZ to a STRING. */ +/* Append a PCSZ to a STRING. */ /***********************************************************************/ -bool STRING::Append(PSZ s) +bool STRING::Append(PCSZ s) { if (!s) return false; @@ -392,11 +395,11 @@ bool STRING::Append(char c) /***********************************************************************/ /* Append a quoted PSZ to a STRING. */ /***********************************************************************/ -bool STRING::Append_quoted(PSZ s) +bool STRING::Append_quoted(PCSZ s) { bool b = Append('\''); - if (s) for (char *p = s; !b && *p; p++) + if (s) for (const char *p = s; !b && *p; p++) switch (*p) { case '\'': case '\\': @@ -405,7 +408,7 @@ bool STRING::Append_quoted(PSZ s) case '\r': case '\b': case '\f': b |= Append('\\'); - // passthru + // fall through default: b |= Append(*p); break; @@ -436,4 +439,3 @@ bool STRING::Resize(uint newsize) return newsize > Size; } // end of Resize - diff --git a/storage/connect/xobject.h b/storage/connect/xobject.h index 8f6c23c4aeb..bc5912d3054 100644 --- a/storage/connect/xobject.h +++ b/storage/connect/xobject.h @@ -112,8 +112,8 @@ class DllExport CONSTANT : public XOBJECT { {return Value->SetConstFormat(g, fmt);} void Convert(PGLOBAL g, int newtype); void SetValue(PVAL vp) {Value = vp;} - virtual void Print(PGLOBAL g, FILE *, uint); - virtual void Print(PGLOBAL g, char *, uint); + virtual void Printf(PGLOBAL g, FILE *, uint); + virtual void Prints(PGLOBAL g, char *, uint); }; // end of class CONSTANT /***********************************************************************/ @@ -123,24 +123,25 @@ class DllExport CONSTANT : public XOBJECT { class DllExport STRING : public BLOCK { public: // Constructor - STRING(PGLOBAL g, uint n, PSZ str = NULL); + STRING(PGLOBAL g, uint n, PCSZ str = NULL); // Implementation inline int GetLength(void) {return (int)Length;} inline void SetLength(uint n) {Length = n;} inline PSZ GetStr(void) {return Strp;} inline uint32 GetSize(void) {return Size;} + inline bool IsTruncated(void) {return Trc;} // Methods inline void Reset(void) {*Strp = 0;} - bool Set(PSZ s); + bool Set(PCSZ s); bool Set(char *s, uint n); bool Append(const char *s, uint ln, bool nq = false); - bool Append(PSZ s); + bool Append(PCSZ s); bool Append(STRING &str); bool Append(char c); bool Resize(uint n); - bool Append_quoted(PSZ s); + bool Append_quoted(PCSZ s); inline void Trim(void) {(void)Resize(Length + 1);} inline void Chop(void) {if (Length) Strp[--Length] = 0;} inline void RepLast(char c) {if (Length) Strp[Length-1] = c;} @@ -156,6 +157,7 @@ class DllExport STRING : public BLOCK { PSZ Strp; // The char string uint Length; // String length uint Size; // Allocated size + bool Trc; // When truncated char *Next; // Next alloc position }; // end of class STRING diff --git a/storage/connect/xtable.h b/storage/connect/xtable.h index 4aeea05946a..ebef7a2549a 100644 --- a/storage/connect/xtable.h +++ b/storage/connect/xtable.h @@ -33,29 +33,6 @@ class CMD : public BLOCK { char *Cmd; }; // end of class CMD -#if 0 -// Condition filter structure -class CONDFIL : public BLOCK { - public: - // Constructor - CONDFIL(const Item *cond, uint idx, AMT type) - { - Cond = cond; Idx = idx; Type = type; Op = OP_XX; - Cmds = NULL; All = true; Body = NULL, Having = NULL; - } - - // Members - const Item *Cond; - AMT Type; - uint Idx; - OPVAL Op; - PCMD Cmds; - bool All; - char *Body; - char *Having; -}; // end of class CONDFIL -#endif // 0 - typedef class EXTCOL *PEXTCOL; typedef class CONDFIL *PCFIL; typedef class TDBCAT *PTDBCAT; @@ -84,7 +61,6 @@ class DllExport TDB: public BLOCK { // Table Descriptor Block. inline PFIL GetFilter(void) {return To_Filter;} inline PCOL GetSetCols(void) {return To_SetCols;} inline void SetSetCols(PCOL colp) {To_SetCols = colp;} - inline void SetFilter(PFIL fp) {To_Filter = fp;} inline void SetOrig(PTDB txp) {To_Orig = txp;} inline void SetUse(TUSE n) {Use = n;} inline void SetCondFil(PCFIL cfp) {To_CondFil = cfp;} @@ -94,11 +70,14 @@ class DllExport TDB: public BLOCK { // Table Descriptor Block. inline void SetColumns(PCOL colp) {Columns = colp;} inline void SetDegree(int degree) {Degree = degree;} inline void SetMode(MODE mode) {Mode = mode;} + inline const Item *GetCond(void) {return Cond;} + inline void SetCond(const Item *cond) {Cond = cond;} // Properties virtual AMT GetAmType(void) {return TYPE_AM_ERROR;} virtual bool IsRemote(void) {return false;} virtual bool IsIndexed(void) {return false;} + virtual void SetFilter(PFIL fp) {To_Filter = fp;} virtual int GetTdb_No(void) {return Tdb_No;} virtual PTDB GetNext(void) {return Next;} virtual PCATLG GetCat(void) {return NULL;} @@ -110,7 +89,7 @@ class DllExport TDB: public BLOCK { // Table Descriptor Block. virtual bool IsSpecial(PSZ name); virtual bool IsReadOnly(void) {return Read_Only;} virtual bool IsView(void) {return FALSE;} - virtual PSZ GetPath(void); + virtual PCSZ GetPath(void); virtual RECFM GetFtype(void) {return RECFM_NAF;} virtual bool GetBlockValues(PGLOBAL) { return false; } virtual int Cardinality(PGLOBAL) {return 0;} @@ -119,19 +98,20 @@ class DllExport TDB: public BLOCK { // Table Descriptor Block. virtual int GetMaxSize(PGLOBAL) = 0; virtual int GetProgMax(PGLOBAL) = 0; virtual int GetProgCur(void) {return GetRecpos();} - virtual PSZ GetFile(PGLOBAL) {return "Not a file";} - virtual void SetFile(PGLOBAL, PSZ) {} + virtual PCSZ GetFile(PGLOBAL) {return "Not a file";} + virtual void SetFile(PGLOBAL, PCSZ) {} virtual void ResetDB(void) {} virtual void ResetSize(void) {MaxSize = -1;} virtual int RowNumber(PGLOBAL g, bool b = false); + virtual bool CanBeFiltered(void) {return true;} virtual PTDB Duplicate(PGLOBAL) {return NULL;} virtual PTDB Clone(PTABS) {return this;} virtual PTDB Copy(PTABS t); virtual void PrintAM(FILE *f, char *m) {fprintf(f, "%s AM(%d)\n", m, GetAmType());} - virtual void Print(PGLOBAL g, FILE *f, uint n); - virtual void Print(PGLOBAL g, char *ps, uint z); - virtual PSZ GetServer(void) = 0; + virtual void Printf(PGLOBAL g, FILE *f, uint n); + virtual void Prints(PGLOBAL g, char *ps, uint z); + virtual PCSZ GetServer(void) = 0; virtual int GetBadLines(void) {return 0;} virtual CHARSET_INFO *data_charset(void); @@ -157,6 +137,7 @@ class DllExport TDB: public BLOCK { // Table Descriptor Block. TUSE Use; PFIL To_Filter; PCFIL To_CondFil; // To condition filter structure + const Item *Cond; // The condition used to make filters static int Tnum; // Used to generate Tdb_no's const int Tdb_No; // GetTdb_No() is always 0 for OPJOIN PTDB Next; // Next in linearized queries @@ -187,9 +168,6 @@ class DllExport TDBASE : public TDB { // Implementation inline int GetKnum(void) {return Knum;} -//inline PTABDEF GetDef(void) {return To_Def;} -//inline PCOL GetSetCols(void) {return To_SetCols;} -//inline void SetSetCols(PCOL colp) {To_SetCols = colp;} inline void SetKey_Col(PCOL *cpp) {To_Key_Col = cpp;} inline void SetXdp(PIXDEF xdp) {To_Xdp = xdp;} inline void SetKindex(PKXBASE kxp) {To_Kindex = kxp;} @@ -201,36 +179,14 @@ class DllExport TDBASE : public TDB { // Methods virtual bool IsUsingTemp(PGLOBAL) {return false;} -//virtual bool IsIndexed(void) {return false;} -//virtual bool IsSpecial(PSZ name); virtual PCATLG GetCat(void); -//virtual PSZ GetPath(void); virtual void PrintAM(FILE *f, char *m); -//virtual RECFM GetFtype(void) {return RECFM_NAF;} -//virtual int GetAffectedRows(void) {return -1;} -//virtual int GetRecpos(void) = 0; -//virtual bool SetRecpos(PGLOBAL g, int recpos); -//virtual bool IsReadOnly(void) {return Read_Only;} -//virtual bool IsView(void) {return FALSE;} -//virtual CHARSET_INFO *data_charset(void); virtual int GetProgMax(PGLOBAL g) {return GetMaxSize(g);} -//virtual int GetProgCur(void) {return GetRecpos();} -//virtual PSZ GetFile(PGLOBAL) {return "Not a file";} -//virtual int GetRemote(void) {return 0;} -//virtual void SetFile(PGLOBAL, PSZ) {} -//virtual void ResetDB(void) {} -//virtual void ResetSize(void) {MaxSize = -1;} virtual void RestoreNrec(void) {} virtual int ResetTableOpt(PGLOBAL g, bool dop, bool dox); - virtual PSZ GetServer(void) {return "Current";} + virtual PCSZ GetServer(void) {return "Current";} // Database routines -//virtual PCOL ColDB(PGLOBAL g, PSZ name, int num); -//virtual PCOL MakeCol(PGLOBAL, PCOLDEF, PCOL, int) -// {assert(false); return NULL;} -//virtual PCOL InsertSpecialColumn(PCOL colp); -//virtual PCOL InsertSpcBlk(PGLOBAL g, PCOLDEF cdp); -//virtual void MarkDB(PGLOBAL g, PTDB tdb2); virtual int MakeIndex(PGLOBAL g, PIXDEF, bool) {strcpy(g->Message, "Remote index"); return RC_INFO;} virtual bool ReadKey(PGLOBAL, OPVAL, const key_range *) @@ -241,18 +197,12 @@ class DllExport TDBASE : public TDB { "This function should not be called for this table"); return true;} // Members -//PTABDEF To_Def; // Points to catalog description block PXOB *To_Link; // Points to column of previous relations PCOL *To_Key_Col; // Points to key columns in current file PKXBASE To_Kindex; // Points to table key index PIXDEF To_Xdp; // To the index definition block -//PCOL To_SetCols; // Points to updated columns RECFM Ftype; // File type: 0-var 1-fixed 2-binary (VCT) -//int MaxSize; // Max size in number of lines int Knum; // Size of key arrays -//bool Read_Only; // True for read only tables -//const CHARSET_INFO *m_data_charset; -//const char *csname; // Table charset name }; // end of class TDBASE /***********************************************************************/ diff --git a/storage/csv/ha_tina.cc b/storage/csv/ha_tina.cc index 308e6f12d73..7e0c61ff634 100644 --- a/storage/csv/ha_tina.cc +++ b/storage/csv/ha_tina.cc @@ -300,7 +300,7 @@ static int read_meta_file(File meta_file, ha_rows *rows) mysql_file_seek(meta_file, 0, MY_SEEK_SET, MYF(0)); if (mysql_file_read(meta_file, (uchar*)meta_buffer, META_BUFFER_SIZE, 0) != META_BUFFER_SIZE) - DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE); + DBUG_RETURN(my_errno= HA_ERR_CRASHED_ON_USAGE); /* Parse out the meta data, we ignore version at the moment @@ -429,10 +429,13 @@ static int free_share(TINA_SHARE *share) int result_code= 0; if (!--share->use_count){ /* Write the meta file. Mark it as crashed if needed. */ - (void)write_meta_file(share->meta_file, share->rows_recorded, - share->crashed ? TRUE :FALSE); - if (mysql_file_close(share->meta_file, MYF(0))) - result_code= 1; + if (share->meta_file != -1) + { + (void)write_meta_file(share->meta_file, share->rows_recorded, + share->crashed ? TRUE :FALSE); + if (mysql_file_close(share->meta_file, MYF(0))) + result_code= 1; + } if (share->tina_write_opened) { if (mysql_file_close(share->tina_write_filedes, MYF(0))) @@ -954,7 +957,7 @@ int ha_tina::open(const char *name, int mode, uint open_options) if (share->crashed && !(open_options & HA_OPEN_FOR_REPAIR)) { free_share(share); - DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE); + DBUG_RETURN(my_errno ? my_errno : HA_ERR_CRASHED_ON_USAGE); } local_data_file_version= share->data_file_version; @@ -1505,13 +1508,13 @@ int ha_tina::repair(THD* thd, HA_CHECK_OPT* check_opt) /* Don't assert in field::val() functions */ table->use_all_columns(); - if (!(buf= (uchar*) my_malloc(table->s->reclength, MYF(MY_WME)))) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); /* position buffer to the start of the file */ if (init_data_file()) DBUG_RETURN(HA_ERR_CRASHED_ON_REPAIR); + if (!(buf= (uchar*) my_malloc(table->s->reclength, MYF(MY_WME)))) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); /* Local_saved_data_file_length is initialized during the lock phase. Sometimes this is not getting executed before ::repair (e.g. for @@ -1595,9 +1598,9 @@ int ha_tina::repair(THD* thd, HA_CHECK_OPT* check_opt) DBUG_RETURN(my_errno ? my_errno : -1); share->tina_write_opened= FALSE; } - if (mysql_file_close(data_file, MYF(0)) || - mysql_file_close(repair_file, MYF(0)) || - mysql_file_rename(csv_key_file_data, + mysql_file_close(data_file, MYF(0)); + mysql_file_close(repair_file, MYF(0)); + if (mysql_file_rename(csv_key_file_data, repaired_fname, share->data_file_name, MYF(0))) DBUG_RETURN(-1); @@ -1719,13 +1722,14 @@ int ha_tina::check(THD* thd, HA_CHECK_OPT* check_opt) DBUG_ENTER("ha_tina::check"); old_proc_info= thd_proc_info(thd, "Checking table"); - if (!(buf= (uchar*) my_malloc(table->s->reclength, MYF(MY_WME)))) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); /* position buffer to the start of the file */ if (init_data_file()) DBUG_RETURN(HA_ERR_CRASHED); + if (!(buf= (uchar*) my_malloc(table->s->reclength, MYF(MY_WME)))) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + /* Local_saved_data_file_length is initialized during the lock phase. Check does not use store_lock in certain cases. So, we set it diff --git a/storage/federated/ha_federated.cc b/storage/federated/ha_federated.cc index 879a17782aa..6b88ab6f2bb 100644 --- a/storage/federated/ha_federated.cc +++ b/storage/federated/ha_federated.cc @@ -1,4 +1,5 @@ /* Copyright (c) 2004, 2015, Oracle and/or its affiliates. + Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -1420,6 +1421,7 @@ bool ha_federated::create_where_from_key(String *to, } break; } + /* fall through */ case HA_READ_KEY_OR_NEXT: DBUG_PRINT("info", ("federated HA_READ_KEY_OR_NEXT %d", i)); if (emit_key_part_name(&tmp, key_part) || @@ -1439,6 +1441,7 @@ bool ha_federated::create_where_from_key(String *to, goto err; break; } + /* fall through */ case HA_READ_KEY_OR_PREV: DBUG_PRINT("info", ("federated HA_READ_KEY_OR_PREV %d", i)); if (emit_key_part_name(&tmp, key_part) || @@ -2943,6 +2946,7 @@ int ha_federated::extra(ha_extra_function operation) break; case HA_EXTRA_PREPARE_FOR_DROP: table_will_be_deleted = TRUE; + break; default: /* do nothing */ DBUG_PRINT("info",("unhandled operation: %d", (uint) operation)); @@ -2976,6 +2980,9 @@ int ha_federated::reset(void) } reset_dynamic(&results); + if (mysql) + mysql->net.thd= NULL; + return 0; } @@ -3196,11 +3203,13 @@ int ha_federated::real_query(const char *query, size_t length) int rc= 0; DBUG_ENTER("ha_federated::real_query"); + if (!query || !length) + goto end; + if (!mysql && (rc= real_connect())) goto end; - if (!query || !length) - goto end; + mysql->net.thd= table->in_use; rc= mysql_real_query(mysql, query, (uint) length); @@ -3285,66 +3294,6 @@ int ha_federated::external_lock(THD *thd, int lock_type) int error= 0; DBUG_ENTER("ha_federated::external_lock"); - /* - Support for transactions disabled until WL#2952 fixes it. - */ -#ifdef XXX_SUPERCEDED_BY_WL2952 - if (lock_type != F_UNLCK) - { - ha_federated *trx= (ha_federated *)thd_get_ha_data(thd, ht); - - DBUG_PRINT("info",("federated not lock F_UNLCK")); - if (!(thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))) - { - DBUG_PRINT("info",("federated autocommit")); - /* - This means we are doing an autocommit - */ - error= connection_autocommit(TRUE); - if (error) - { - DBUG_PRINT("info", ("error setting autocommit TRUE: %d", error)); - DBUG_RETURN(error); - } - trans_register_ha(thd, FALSE, ht); - } - else - { - DBUG_PRINT("info",("not autocommit")); - if (!trx) - { - /* - This is where a transaction gets its start - */ - error= connection_autocommit(FALSE); - if (error) - { - DBUG_PRINT("info", ("error setting autocommit FALSE: %d", error)); - DBUG_RETURN(error); - } - thd_set_ha_data(thd, ht, this); - trans_register_ha(thd, TRUE, ht); - /* - Send a lock table to the remote end. - We do not support this at the moment - */ - if (thd->options & (OPTION_TABLE_LOCK)) - { - DBUG_PRINT("info", ("We do not support lock table yet")); - } - } - else - { - ha_federated *ptr; - for (ptr= trx; ptr; ptr= ptr->trx_next) - if (ptr == this) - break; - else if (!ptr->trx_next) - ptr->trx_next= this; - } - } - } -#endif /* XXX_SUPERCEDED_BY_WL2952 */ table_will_be_deleted = FALSE; DBUG_RETURN(error); } diff --git a/storage/federatedx/federatedx_io_mysql.cc b/storage/federatedx/federatedx_io_mysql.cc index 8f027e1b5e0..54059c0ecff 100644 --- a/storage/federatedx/federatedx_io_mysql.cc +++ b/storage/federatedx/federatedx_io_mysql.cc @@ -120,6 +120,7 @@ public: void *ref); virtual int seek_position(FEDERATEDX_IO_RESULT **io_result, const void *ref); + virtual void set_thd(void *thd); }; @@ -648,3 +649,7 @@ int federatedx_io_mysql::seek_position(FEDERATEDX_IO_RESULT **io_result, return 0; } +void federatedx_io_mysql::set_thd(void *thd) +{ + mysql.net.thd= thd; +} diff --git a/storage/federatedx/federatedx_txn.cc b/storage/federatedx/federatedx_txn.cc index 232ac335dfc..220896cc2a4 100644 --- a/storage/federatedx/federatedx_txn.cc +++ b/storage/federatedx/federatedx_txn.cc @@ -93,8 +93,8 @@ void federatedx_txn::close(FEDERATEDX_SERVER *server) } -int federatedx_txn::acquire(FEDERATEDX_SHARE *share, bool readonly, - federatedx_io **ioptr) +int federatedx_txn::acquire(FEDERATEDX_SHARE *share, void *thd, + bool readonly, federatedx_io **ioptr) { federatedx_io *io; FEDERATEDX_SERVER *server= share->s; @@ -131,6 +131,7 @@ int federatedx_txn::acquire(FEDERATEDX_SHARE *share, bool readonly, io->busy= TRUE; io->owner_ptr= ioptr; + io->set_thd(thd); } DBUG_ASSERT(io->busy && io->server == server); @@ -157,7 +158,10 @@ void federatedx_txn::release(federatedx_io **ioptr) io->active, io->is_autocommit())); if (io->is_autocommit()) + { + io->set_thd(NULL); io->active= FALSE; + } } release_scan(); diff --git a/storage/federatedx/ha_federatedx.cc b/storage/federatedx/ha_federatedx.cc index e3506e1a4df..ed97c08ddf7 100644 --- a/storage/federatedx/ha_federatedx.cc +++ b/storage/federatedx/ha_federatedx.cc @@ -1340,6 +1340,7 @@ bool ha_federatedx::create_where_from_key(String *to, } break; } + /* fall through */ case HA_READ_KEY_OR_NEXT: DBUG_PRINT("info", ("federatedx HA_READ_KEY_OR_NEXT %d", i)); if (emit_key_part_name(&tmp, key_part) || @@ -1359,6 +1360,7 @@ bool ha_federatedx::create_where_from_key(String *to, goto err; break; } + /* fall through */ case HA_READ_KEY_OR_PREV: DBUG_PRINT("info", ("federatedx HA_READ_KEY_OR_PREV %d", i)); if (emit_key_part_name(&tmp, key_part) || @@ -1760,7 +1762,7 @@ int ha_federatedx::open(const char *name, int mode, uint test_if_locked) txn= get_txn(thd); - if ((error= txn->acquire(share, TRUE, &io))) + if ((error= txn->acquire(share, thd, TRUE, &io))) { free_share(txn, share); DBUG_RETURN(error); @@ -2045,7 +2047,7 @@ int ha_federatedx::write_row(uchar *buf) /* we always want to append this, even if there aren't any fields */ values_string.append(STRING_WITH_LEN(") ")); - if ((error= txn->acquire(share, FALSE, &io))) + if ((error= txn->acquire(share, ha_thd(), FALSE, &io))) DBUG_RETURN(error); if (use_bulk_insert) @@ -2134,7 +2136,7 @@ void ha_federatedx::start_bulk_insert(ha_rows rows, uint flags) Make sure we have an open connection so that we know the maximum packet size. */ - if (txn->acquire(share, FALSE, &io)) + if (txn->acquire(share, ha_thd(), FALSE, &io)) DBUG_VOID_RETURN; page_size= (uint) my_getpagesize(); @@ -2165,7 +2167,7 @@ int ha_federatedx::end_bulk_insert() if (bulk_insert.str && bulk_insert.length && !table_will_be_deleted) { - if ((error= txn->acquire(share, FALSE, &io))) + if ((error= txn->acquire(share, ha_thd(), FALSE, &io))) DBUG_RETURN(error); if (io->query(bulk_insert.str, bulk_insert.length)) error= stash_remote_error(); @@ -2217,7 +2219,7 @@ int ha_federatedx::optimize(THD* thd, HA_CHECK_OPT* check_opt) DBUG_ASSERT(txn == get_txn(thd)); - if ((error= txn->acquire(share, FALSE, &io))) + if ((error= txn->acquire(share, thd, FALSE, &io))) DBUG_RETURN(error); if (io->query(query.ptr(), query.length())) @@ -2249,7 +2251,7 @@ int ha_federatedx::repair(THD* thd, HA_CHECK_OPT* check_opt) DBUG_ASSERT(txn == get_txn(thd)); - if ((error= txn->acquire(share, FALSE, &io))) + if ((error= txn->acquire(share, thd, FALSE, &io))) DBUG_RETURN(error); if (io->query(query.ptr(), query.length())) @@ -2408,7 +2410,7 @@ int ha_federatedx::update_row(const uchar *old_data, uchar *new_data) if (!has_a_primary_key) update_string.append(STRING_WITH_LEN(" LIMIT 1")); - if ((error= txn->acquire(share, FALSE, &io))) + if ((error= txn->acquire(share, ha_thd(), FALSE, &io))) DBUG_RETURN(error); if (io->query(update_string.ptr(), update_string.length())) @@ -2486,7 +2488,7 @@ int ha_federatedx::delete_row(const uchar *buf) DBUG_PRINT("info", ("Delete sql: %s", delete_string.c_ptr_quick())); - if ((error= txn->acquire(share, FALSE, &io))) + if ((error= txn->acquire(share, ha_thd(), FALSE, &io))) DBUG_RETURN(error); if (io->query(delete_string.ptr(), delete_string.length())) @@ -2595,7 +2597,7 @@ int ha_federatedx::index_read_idx_with_result_set(uchar *buf, uint index, NULL, 0, 0); sql_query.append(index_string); - if ((retval= txn->acquire(share, TRUE, &io))) + if ((retval= txn->acquire(share, ha_thd(), TRUE, &io))) DBUG_RETURN(retval); if (io->query(sql_query.ptr(), sql_query.length())) @@ -2675,7 +2677,7 @@ int ha_federatedx::read_range_first(const key_range *start_key, &table->key_info[active_index], start_key, end_key, 0, eq_range_arg); - if ((retval= txn->acquire(share, TRUE, &io))) + if ((retval= txn->acquire(share, ha_thd(), TRUE, &io))) DBUG_RETURN(retval); if (stored_result) @@ -2775,7 +2777,7 @@ int ha_federatedx::rnd_init(bool scan) { int error; - if ((error= txn->acquire(share, TRUE, &io))) + if ((error= txn->acquire(share, ha_thd(), TRUE, &io))) DBUG_RETURN(error); if (stored_result) @@ -2822,7 +2824,7 @@ int ha_federatedx::free_result() else { federatedx_io *tmp_io= 0, **iop; - if (!*(iop= &io) && (error= txn->acquire(share, TRUE, (iop= &tmp_io)))) + if (!*(iop= &io) && (error= txn->acquire(share, ha_thd(), TRUE, (iop= &tmp_io)))) { DBUG_ASSERT(0); // Fail when testing insert_dynamic(&results, (uchar*) &stored_result); @@ -2902,7 +2904,7 @@ int ha_federatedx::read_next(uchar *buf, FEDERATEDX_IO_RESULT *result) FEDERATEDX_IO_ROW *row; DBUG_ENTER("ha_federatedx::read_next"); - if ((retval= txn->acquire(share, TRUE, &io))) + if ((retval= txn->acquire(share, ha_thd(), TRUE, &io))) DBUG_RETURN(retval); /* Fetch a row, insert it back in a row format. */ @@ -2947,7 +2949,7 @@ void ha_federatedx::position(const uchar *record __attribute__ ((unused))) DBUG_VOID_RETURN; } - if (txn->acquire(share, TRUE, &io)) + if (txn->acquire(share, ha_thd(), TRUE, &io)) DBUG_VOID_RETURN; io->mark_position(stored_result, ref); @@ -2976,7 +2978,7 @@ int ha_federatedx::rnd_pos(uchar *buf, uchar *pos) /* We have to move this to 'ref' to get things aligned */ bmove(ref, pos, ref_length); - if ((retval= txn->acquire(share, TRUE, &io))) + if ((retval= txn->acquire(share, ha_thd(), TRUE, &io))) goto error; if ((retval= io->seek_position(&result, ref))) @@ -3050,7 +3052,7 @@ int ha_federatedx::info(uint flag) /* we want not to show table status if not needed to do so */ if (flag & (HA_STATUS_VARIABLE | HA_STATUS_CONST | HA_STATUS_AUTO)) { - if (!*(iop= &io) && (error_code= tmp_txn->acquire(share, TRUE, (iop= &tmp_io)))) + if (!*(iop= &io) && (error_code= tmp_txn->acquire(share, thd, TRUE, (iop= &tmp_io)))) goto fail; } @@ -3151,6 +3153,7 @@ int ha_federatedx::extra(ha_extra_function operation) int ha_federatedx::reset(void) { + THD *thd= ha_thd(); int error = 0; insert_dup_update= FALSE; @@ -3168,9 +3171,9 @@ int ha_federatedx::reset(void) federatedx_io *tmp_io= 0, **iop; // external_lock may not have been called so txn may not be set - tmp_txn= get_txn(ha_thd()); + tmp_txn= get_txn(thd); - if (!*(iop= &io) && (error= tmp_txn->acquire(share, TRUE, (iop= &tmp_io)))) + if (!*(iop= &io) && (error= tmp_txn->acquire(share, thd, TRUE, (iop= &tmp_io)))) { DBUG_ASSERT(0); // Fail when testing return error; @@ -3204,6 +3207,7 @@ int ha_federatedx::reset(void) int ha_federatedx::delete_all_rows() { + THD *thd= ha_thd(); char query_buffer[FEDERATEDX_QUERY_BUFFER_SIZE]; String query(query_buffer, sizeof(query_buffer), &my_charset_bin); int error; @@ -3217,14 +3221,14 @@ int ha_federatedx::delete_all_rows() ident_quote_char); /* no need for savepoint in autocommit mode */ - if (!(ha_thd()->variables.option_bits & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))) + if (!(thd->variables.option_bits & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))) txn->stmt_autocommit(); /* TRUNCATE won't return anything in mysql_affected_rows */ - if ((error= txn->acquire(share, FALSE, &io))) + if ((error= txn->acquire(share, thd, FALSE, &io))) DBUG_RETURN(error); if (io->query(query.ptr(), query.length())) @@ -3369,7 +3373,7 @@ int ha_federatedx::create(const char *name, TABLE *table_arg, if (tmp_share.s) { tmp_txn= get_txn(thd); - if (!(retval= tmp_txn->acquire(&tmp_share, TRUE, &tmp_io))) + if (!(retval= tmp_txn->acquire(&tmp_share, thd, TRUE, &tmp_io))) { retval= test_connection(thd, tmp_io, &tmp_share); tmp_txn->release(&tmp_io); @@ -3466,7 +3470,7 @@ int ha_federatedx::external_lock(MYSQL_THD thd, int lock_type) { table_will_be_deleted = FALSE; txn= get_txn(thd); - if (!(error= txn->acquire(share, lock_type == F_RDLCK, &io)) && + if (!(error= txn->acquire(share, ha_thd(), lock_type == F_RDLCK, &io)) && (lock_type == F_WRLCK || !io->is_autocommit())) { if (!thd_test_options(thd, (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))) diff --git a/storage/federatedx/ha_federatedx.h b/storage/federatedx/ha_federatedx.h index 2c2c6eef26b..abf25abe0c5 100644 --- a/storage/federatedx/ha_federatedx.h +++ b/storage/federatedx/ha_federatedx.h @@ -215,6 +215,7 @@ public: void *ref)=0; virtual int seek_position(FEDERATEDX_IO_RESULT **io_result, const void *ref)=0; + virtual void set_thd(void *thd) { } }; @@ -233,7 +234,7 @@ public: bool has_connections() const { return txn_list != NULL; } bool in_transaction() const { return savepoint_next != 0; } - int acquire(FEDERATEDX_SHARE *share, bool readonly, federatedx_io **io); + int acquire(FEDERATEDX_SHARE *share, void *thd, bool readonly, federatedx_io **io); void release(federatedx_io **io); void close(FEDERATEDX_SERVER *); @@ -330,7 +331,7 @@ public: return (HA_PRIMARY_KEY_IN_READ_INDEX | HA_FILE_BASED | HA_REC_NOT_IN_SEQ | HA_AUTO_PART_KEY | HA_CAN_INDEX_BLOBS | HA_BINLOG_ROW_CAPABLE | HA_BINLOG_STMT_CAPABLE | HA_CAN_REPAIR | - HA_NO_PREFIX_CHAR_KEYS | HA_PRIMARY_KEY_REQUIRED_FOR_DELETE | + HA_PRIMARY_KEY_REQUIRED_FOR_DELETE | HA_PARTIAL_COLUMN_READ | HA_NULL_IN_KEY); } /* diff --git a/storage/heap/hp_create.c b/storage/heap/hp_create.c index bb5537c9363..431e992e75b 100644 --- a/storage/heap/hp_create.c +++ b/storage/heap/hp_create.c @@ -1,5 +1,5 @@ /* Copyright (c) 2000, 2011, Oracle and/or its affiliates. - Copyright (c) 2010, 2014, SkySQL Ab. + Copyright (c) 2010, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -94,7 +94,7 @@ int heap_create(const char *name, HP_CREATE_INFO *create_info, case HA_KEYTYPE_VARBINARY1: /* Case-insensitiveness is handled in coll->hash_sort */ keyinfo->seg[j].type= HA_KEYTYPE_VARTEXT1; - /* fall_through */ + /* fall through */ case HA_KEYTYPE_VARTEXT1: keyinfo->flag|= HA_VAR_LENGTH_KEY; length+= 2; diff --git a/storage/heap/hp_extra.c b/storage/heap/hp_extra.c index c83efd5af61..9a19f818d3b 100644 --- a/storage/heap/hp_extra.c +++ b/storage/heap/hp_extra.c @@ -34,6 +34,7 @@ int heap_extra(register HP_INFO *info, enum ha_extra_function function) switch (function) { case HA_EXTRA_RESET_STATE: heap_reset(info); + /* fall through */ case HA_EXTRA_NO_READCHECK: info->opt_flag&= ~READ_CHECK_USED; /* No readcheck */ break; diff --git a/storage/innobase/CMakeLists.txt b/storage/innobase/CMakeLists.txt index 1ecf80bb92d..061ff1ce2ac 100644 --- a/storage/innobase/CMakeLists.txt +++ b/storage/innobase/CMakeLists.txt @@ -74,7 +74,6 @@ SET(INNOBASE_SOURCES gis/gis0sea.cc fts/fts0plugin.cc handler/ha_innodb.cc -# handler/ha_innopart.cc handler/handler0alter.cc handler/i_s.cc ibuf/ibuf0ibuf.cc @@ -151,23 +150,17 @@ SET(INNOBASE_SOURCES ut/ut0wqueue.cc ut/ut0timer.cc) -IF(WITH_INNODB) - # Legacy option - SET(WITH_INNOBASE_STORAGE_ENGINE TRUE) -ENDIF() - MYSQL_ADD_PLUGIN(innobase ${INNOBASE_SOURCES} STORAGE_ENGINE -# MODULE_ONLY -# MODULE_OUTPUT_NAME ha_innodb DEFAULT RECOMPILE_FOR_EMBEDDED LINK_LIBRARIES ${ZLIB_LIBRARY} ${CRC32_VPMSUM_LIBRARY} ${NUMA_LIBRARY} + ${LIBSYSTEMD} ${LINKER_SCRIPT}) -IF(WITH_INNOBASE_STORAGE_ENGINE) - ADD_DEPENDENCIES(innobase GenError) +IF(NOT TARGET innobase) + RETURN() ENDIF() # A GCC bug causes crash when compiling these files on ARM64 with -O1+ @@ -187,3 +180,5 @@ IF(CMAKE_COMPILER_IS_GNUCXX AND CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") ) ENDIF() ENDIF() + +ADD_SUBDIRECTORY(${CMAKE_SOURCE_DIR}/extra/mariabackup ${CMAKE_BINARY_DIR}/extra/mariabackup) diff --git a/storage/innobase/btr/btr0btr.cc b/storage/innobase/btr/btr0btr.cc index 489b612a17a..815324825bd 100644 --- a/storage/innobase/btr/btr0btr.cc +++ b/storage/innobase/btr/btr0btr.cc @@ -169,10 +169,10 @@ btr_root_block_get( if (!block) { if (index && index->table) { - index->table->is_encrypted = TRUE; - index->table->corrupted = FALSE; + index->table->file_unreadable = true; - ib_push_warning(index->table->thd, DB_DECRYPTION_FAILED, + ib_push_warning( + static_cast(NULL), DB_DECRYPTION_FAILED, "Table %s in tablespace %lu is encrypted but encryption service or" " used key_id is not available. " " Can't continue reading table.", @@ -183,6 +183,7 @@ btr_root_block_get( } btr_assert_not_corrupted(block, index); + #ifdef UNIV_BTR_DEBUG if (!dict_index_is_ibuf(index)) { const page_t* root = buf_block_get_frame(block); @@ -713,7 +714,7 @@ btr_page_free_low( * pages should be possible */ uint cnt = 0; - uint bytes = 0; + ulint bytes = 0; page_t* page = buf_block_get_frame(block); mem_heap_t* heap = NULL; ulint* offsets = NULL; @@ -731,7 +732,7 @@ btr_page_free_low( #ifdef UNIV_DEBUG_SCRUBBING fprintf(stderr, "btr_page_free_low: scrub %lu/%lu - " - "%u records %u bytes\n", + "%u records " ULINTPF " bytes\n", buf_block_get_space(block), buf_block_get_page_no(block), cnt, bytes); @@ -1133,9 +1134,7 @@ btr_create( const btr_create_t* btr_redo_create_info, mtr_t* mtr) { - ulint page_no; buf_block_t* block; - buf_frame_t* frame; page_t* page; page_zip_des_t* page_zip; @@ -1170,33 +1169,28 @@ btr_create( + IBUF_HEADER + IBUF_TREE_SEG_HEADER, IBUF_TREE_ROOT_PAGE_NO, FSP_UP, mtr); + + if (block == NULL) { + return(FIL_NULL); + } + ut_ad(block->page.id.page_no() == IBUF_TREE_ROOT_PAGE_NO); + + buf_block_dbg_add_level(block, SYNC_IBUF_TREE_NODE_NEW); + + flst_init(block->frame + PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST, + mtr); } else { block = fseg_create(space, 0, PAGE_HEADER + PAGE_BTR_SEG_TOP, mtr); - } - if (block == NULL) { + if (block == NULL) { + return(FIL_NULL); + } - return(FIL_NULL); - } - - page_no = block->page.id.page_no(); - frame = buf_block_get_frame(block); - - if (type & DICT_IBUF) { - /* It is an insert buffer tree: initialize the free list */ - buf_block_dbg_add_level(block, SYNC_IBUF_TREE_NODE_NEW); - - ut_ad(page_no == IBUF_TREE_ROOT_PAGE_NO); - - flst_init(frame + PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST, mtr); - } else { - /* It is a non-ibuf tree: create a file segment for leaf - pages */ buf_block_dbg_add_level(block, SYNC_TREE_NODE_NEW); - if (!fseg_create(space, page_no, + if (!fseg_create(space, block->page.id.page_no(), PAGE_HEADER + PAGE_BTR_SEG_LEAF, mtr)) { /* Not enough space for new segment, free root segment before return. */ @@ -1287,7 +1281,7 @@ btr_create( ut_ad(page_get_max_insert_size(page, 2) > 2 * BTR_PAGE_MAX_REC_SIZE); - return(page_no); + return(block->page.id.page_no()); } /** Free a B-tree except the root page. The root page MUST be freed after @@ -1991,10 +1985,9 @@ btr_root_raise_and_insert( longer is a leaf page. (Older versions of InnoDB did set PAGE_MAX_TRX_ID on all secondary index pages.) */ if (root_page_zip) { - page_zip_write_header( - root_page_zip, - PAGE_HEADER + PAGE_MAX_TRX_ID - + root, 0, mtr); + byte* p = PAGE_HEADER + PAGE_MAX_TRX_ID + root; + memset(p, 0, 8); + page_zip_write_header(root_page_zip, p, 8, mtr); } else { mlog_write_ull(PAGE_HEADER + PAGE_MAX_TRX_ID + root, 0, mtr); @@ -2004,10 +1997,9 @@ btr_root_raise_and_insert( root page; on other clustered index pages, we want to reserve the field PAGE_MAX_TRX_ID for future use. */ if (new_page_zip) { - page_zip_write_header( - new_page_zip, - PAGE_HEADER + PAGE_MAX_TRX_ID - + new_page, 0, mtr); + byte* p = PAGE_HEADER + PAGE_MAX_TRX_ID + new_page; + memset(p, 0, 8); + page_zip_write_header(new_page_zip, p, 8, mtr); } else { mlog_write_ull(PAGE_HEADER + PAGE_MAX_TRX_ID + new_page, 0, mtr); @@ -4681,29 +4673,12 @@ btr_index_rec_validate( rec_get_nth_field_offs(offsets, i, &len); /* Note that if fixed_size != 0, it equals the - length of a fixed-size column in the clustered index, - except the DATA_POINT, whose length would be MBR_LEN - when it's indexed in a R-TREE. We should adjust it here. + length of a fixed-size column in the clustered index. + We should adjust it here. A prefix index of the column is of fixed, but different length. When fixed_size == 0, prefix_len is the maximum length of the prefix index column. */ - if (dict_field_get_col(field)->mtype == DATA_POINT) { - ut_ad(fixed_size == DATA_POINT_LEN); - if (dict_index_is_spatial(index)) { - /* For DATA_POINT data, when it has R-tree - index, the fixed_len is the MBR of the point. - But if it's a primary key and on R-TREE - as the PK pointer, the length shall be - DATA_POINT_LEN as well. */ - ut_ad((field->fixed_len == DATA_MBR_LEN - && i == 0) - || (field->fixed_len == DATA_POINT_LEN - && i != 0)); - fixed_size = field->fixed_len; - } - } - if ((field->prefix_len == 0 && len != UNIV_SQL_NULL && fixed_size && len != fixed_size) @@ -4871,7 +4846,6 @@ btr_validate_level( bool ret = true; mtr_t mtr; mem_heap_t* heap = mem_heap_create(256); - fseg_header_t* seg; ulint* offsets = NULL; ulint* offsets2= NULL; #ifdef UNIV_ZIP_DEBUG @@ -4895,7 +4869,6 @@ btr_validate_level( block = btr_root_block_get(index, RW_SX_LATCH, &mtr); page = buf_block_get_frame(block); - seg = page + PAGE_HEADER + PAGE_BTR_SEG_TOP; #ifdef UNIV_DEBUG if (dict_index_is_spatial(index)) { @@ -4904,7 +4877,7 @@ btr_validate_level( } #endif - const fil_space_t* space = fil_space_get(index->space); + fil_space_t* space = fil_space_get(index->space); const page_size_t table_page_size( dict_table_page_size(index->table)); const page_size_t space_page_size(space->flags); @@ -4922,9 +4895,7 @@ btr_validate_level( while (level != btr_page_get_level(page, &mtr)) { const rec_t* node_ptr; - if (fseg_page_is_free(seg, - block->page.id.space(), - block->page.id.page_no())) { + if (fseg_page_is_free(space, block->page.id.page_no())) { btr_validate_report1(index, level, block); @@ -4984,11 +4955,6 @@ btr_validate_level( /* Now we are on the desired level. Loop through the pages on that level. */ - if (level == 0) { - /* Leaf pages are managed in their own file segment. */ - seg -= PAGE_BTR_SEG_TOP - PAGE_BTR_SEG_LEAF; - } - loop: mem_heap_empty(heap); offsets = offsets2 = NULL; @@ -5007,9 +4973,7 @@ loop: ut_a(block->page.id.space() == index->space); - if (fseg_page_is_free(seg, - block->page.id.space(), - block->page.id.page_no())) { + if (fseg_page_is_free(space, block->page.id.page_no())) { btr_validate_report1(index, level, block); @@ -5418,7 +5382,7 @@ btr_validate_index( page_t* root = btr_root_get(index, &mtr); - if (root == NULL && index->table->is_encrypted) { + if (root == NULL && !index->is_readable()) { err = DB_DECRYPTION_FAILED; mtr_commit(&mtr); return err; diff --git a/storage/innobase/btr/btr0bulk.cc b/storage/innobase/btr/btr0bulk.cc index 9ff3bc5f6d1..8a954f9d3c3 100644 --- a/storage/innobase/btr/btr0bulk.cc +++ b/storage/innobase/btr/btr0bulk.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 2014, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -991,11 +992,7 @@ BtrBulk::finish(dberr_t err) ut_ad(err == DB_SUCCESS); } -#ifdef UNIV_DEBUG - dict_sync_check check(true); - - ut_ad(!sync_check_iterate(check)); -#endif /* UNIV_DEBUG */ + ut_ad(!sync_check_iterate(dict_sync_check())); ut_ad(err != DB_SUCCESS || btr_validate_index(m_index, NULL, false)); return(err); diff --git a/storage/innobase/btr/btr0cur.cc b/storage/innobase/btr/btr0cur.cc index 773b03775be..e740370d2f0 100644 --- a/storage/innobase/btr/btr0cur.cc +++ b/storage/innobase/btr/btr0cur.cc @@ -1109,7 +1109,11 @@ retry_page_get: buf_mode, file, line, mtr, &err); tree_blocks[n_blocks] = block; + /* Note that block==NULL signifies either an error or change + buffering. */ + if (err != DB_SUCCESS) { + ut_ad(block == NULL); if (err == DB_DECRYPTION_FAILED) { ib_push_warning((void *)NULL, DB_DECRYPTION_FAILED, @@ -1117,7 +1121,7 @@ retry_page_get: " used key_id is not available. " " Can't continue reading table.", index->table->name); - index->table->is_encrypted = true; + index->table->file_unreadable = true; } goto func_exit; @@ -1230,7 +1234,7 @@ retry_page_get: " used key_id is not available. " " Can't continue reading table.", index->table->name); - index->table->is_encrypted = true; + index->table->file_unreadable = true; } goto func_exit; @@ -1259,7 +1263,7 @@ retry_page_get: " used key_id is not available. " " Can't continue reading table.", index->table->name); - index->table->is_encrypted = true; + index->table->file_unreadable = true; } goto func_exit; @@ -2057,7 +2061,7 @@ btr_cur_open_at_index_side_func( ulint offsets_[REC_OFFS_NORMAL_SIZE]; ulint* offsets = offsets_; dberr_t err = DB_SUCCESS; - + rec_offs_init(offsets_); estimate = latch_mode & BTR_ESTIMATE; @@ -2139,8 +2143,7 @@ btr_cur_open_at_index_side_func( height = ULINT_UNDEFINED; for (;;) { - buf_block_t* block=NULL; - page_t* page=NULL; + buf_block_t* block; ulint rw_latch; ut_ad(n_blocks < BTR_MAX_LEVELS); @@ -2156,6 +2159,7 @@ btr_cur_open_at_index_side_func( tree_savepoints[n_blocks] = mtr_set_savepoint(mtr); block = buf_page_get_gen(page_id, page_size, rw_latch, NULL, BUF_GET, file, line, mtr, &err); + ut_ad((block != NULL) == (err == DB_SUCCESS)); tree_blocks[n_blocks] = block; if (err != DB_SUCCESS) { @@ -2166,13 +2170,13 @@ btr_cur_open_at_index_side_func( " used key_id is not available. " " Can't continue reading table.", index->table->name); - index->table->is_encrypted = true; + index->table->file_unreadable = true; } goto exit_loop; } - page = buf_block_get_frame(block); + const page_t* page = buf_block_get_frame(block); if (height == ULINT_UNDEFINED && page_is_leaf(page) @@ -2516,6 +2520,8 @@ btr_cur_open_at_rnd_pos_func( BUF_GET, file, line, mtr, &err); tree_blocks[n_blocks] = block; + ut_ad((block != NULL) == (err == DB_SUCCESS)); + if (err != DB_SUCCESS) { if (err == DB_DECRYPTION_FAILED) { ib_push_warning((void *)NULL, @@ -2524,8 +2530,9 @@ btr_cur_open_at_rnd_pos_func( " used key_id is not available. " " Can't continue reading table.", index->table->name); - index->table->is_encrypted = true; + index->table->file_unreadable = true; } + goto exit_loop; } @@ -2806,18 +2813,21 @@ btr_cur_ins_lock_and_undo( } if (err != DB_SUCCESS + || !(~flags | (BTR_NO_UNDO_LOG_FLAG | BTR_KEEP_SYS_FLAG)) || !dict_index_is_clust(index) || dict_index_is_ibuf(index)) { return(err); } - err = trx_undo_report_row_operation(flags, TRX_UNDO_INSERT_OP, - thr, index, entry, - NULL, 0, NULL, NULL, - &roll_ptr); - if (err != DB_SUCCESS) { - - return(err); + if (flags & BTR_NO_UNDO_LOG_FLAG) { + roll_ptr = 0; + } else { + err = trx_undo_report_row_operation(thr, index, entry, + NULL, 0, NULL, NULL, + &roll_ptr); + if (err != DB_SUCCESS) { + return(err); + } } /* Now we can fill in the roll ptr field in entry */ @@ -2877,15 +2887,17 @@ btr_cur_optimistic_insert( btr_cur_t* cursor, /*!< in: cursor on page after which to insert; cursor stays valid */ ulint** offsets,/*!< out: offsets on *rec */ - mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */ + mem_heap_t** heap, /*!< in/out: pointer to memory heap */ dtuple_t* entry, /*!< in/out: entry to insert */ rec_t** rec, /*!< out: pointer to inserted record if succeed */ big_rec_t** big_rec,/*!< out: big rec vector whose fields have to - be stored externally by the caller, or - NULL */ + be stored externally by the caller */ ulint n_ext, /*!< in: number of externally stored columns */ - que_thr_t* thr, /*!< in: query thread or NULL */ + que_thr_t* thr, /*!< in/out: query thread; can be NULL if + !(~flags + & (BTR_NO_LOCKING_FLAG + | BTR_NO_UNDO_LOG_FLAG)) */ mtr_t* mtr) /*!< in/out: mini-transaction; if this function returns DB_SUCCESS on a leaf page of a secondary index in a @@ -2905,6 +2917,7 @@ btr_cur_optimistic_insert( ulint rec_size; dberr_t err; + ut_ad(thr || !(~flags & (BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG))); *big_rec = NULL; block = btr_cur_get_block(cursor); @@ -3140,15 +3153,17 @@ btr_cur_pessimistic_insert( cursor stays valid */ ulint** offsets,/*!< out: offsets on *rec */ mem_heap_t** heap, /*!< in/out: pointer to memory heap - that can be emptied, or NULL */ + that can be emptied */ dtuple_t* entry, /*!< in/out: entry to insert */ rec_t** rec, /*!< out: pointer to inserted record if succeed */ big_rec_t** big_rec,/*!< out: big rec vector whose fields have to - be stored externally by the caller, or - NULL */ + be stored externally by the caller */ ulint n_ext, /*!< in: number of externally stored columns */ - que_thr_t* thr, /*!< in: query thread or NULL */ + que_thr_t* thr, /*!< in/out: query thread; can be NULL if + !(~flags + & (BTR_NO_LOCKING_FLAG + | BTR_NO_UNDO_LOG_FLAG)) */ mtr_t* mtr) /*!< in/out: mini-transaction */ { dict_index_t* index = cursor->index; @@ -3159,6 +3174,7 @@ btr_cur_pessimistic_insert( ulint n_reserved = 0; ut_ad(dtuple_check_typed(entry)); + ut_ad(thr || !(~flags & (BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG))); *big_rec = NULL; @@ -3346,9 +3362,10 @@ btr_cur_upd_lock_and_undo( /* Append the info about the update in the undo log */ - return(trx_undo_report_row_operation( - flags, TRX_UNDO_MODIFY_OP, thr, - index, NULL, update, + return((flags & BTR_NO_UNDO_LOG_FLAG) + ? DB_SUCCESS + : trx_undo_report_row_operation( + thr, index, NULL, update, cmpl_info, rec, offsets, roll_ptr)); } @@ -3662,6 +3679,11 @@ btr_cur_update_in_place( was_delete_marked = rec_get_deleted_flag( rec, page_is_comp(buf_block_get_frame(block))); + /* In delete-marked records, DB_TRX_ID must always refer to an + existing undo log record. */ + ut_ad(!was_delete_marked + || !dict_index_is_clust(index) + || row_get_rec_trx_id(rec, index, offsets)); #ifdef BTR_CUR_HASH_ADAPT if (block->index) { @@ -3879,8 +3901,10 @@ any_extern: } /* We limit max record size to 16k even for 64k page size. */ - if (new_rec_size >= REC_MAX_DATA_SIZE) { - err = DB_OVERFLOW; + if (new_rec_size >= COMPRESSED_REC_MAX_DATA_SIZE || + (!dict_table_is_comp(index->table) + && new_rec_size >= REDUNDANT_REC_MAX_DATA_SIZE)) { + err = DB_OVERFLOW; goto func_exit; } @@ -4062,12 +4086,12 @@ btr_cur_pessimistic_update( ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */ mem_heap_t** offsets_heap, /*!< in/out: pointer to memory heap - that can be emptied, or NULL */ + that can be emptied */ mem_heap_t* entry_heap, /*!< in/out: memory heap for allocating big_rec and the index tuple */ big_rec_t** big_rec,/*!< out: big rec vector whose fields have to - be stored externally by the caller, or NULL */ + be stored externally by the caller */ upd_t* update, /*!< in/out: update vector; this is allowed to also contain trx id and roll ptr fields. Non-updated columns that are moved offpage will @@ -4304,6 +4328,10 @@ btr_cur_pessimistic_update( stored fields */ btr_cur_unmark_extern_fields( page_zip, rec, index, *offsets, mtr); + } else { + /* In delete-marked records, DB_TRX_ID must + always refer to an existing undo log record. */ + ut_ad(row_get_rec_trx_id(rec, index, *offsets)); } bool adjust = big_rec_vec && (flags & BTR_KEEP_POS_FLAG); @@ -4431,6 +4459,10 @@ btr_cur_pessimistic_update( btr_cur_unmark_extern_fields(page_zip, rec, index, *offsets, mtr); + } else { + /* In delete-marked records, DB_TRX_ID must + always refer to an existing undo log record. */ + ut_ad(row_get_rec_trx_id(rec, index, *offsets)); } if (!dict_table_is_locking_disabled(index->table)) { @@ -4556,6 +4588,10 @@ btr_cur_parse_del_mark_set_clust_rec( ut_a(offset <= UNIV_PAGE_SIZE); + /* In delete-marked records, DB_TRX_ID must + always refer to an existing undo log record. */ + ut_ad(trx_id || (flags & BTR_KEEP_SYS_FLAG)); + if (page) { rec = page + offset; @@ -4565,20 +4601,37 @@ btr_cur_parse_del_mark_set_clust_rec( and the adaptive hash index does not depend on them. */ btr_rec_set_deleted_flag(rec, page_zip, val); + /* pos is the offset of DB_TRX_ID in the clustered index. + Debug assertions may also access DB_ROLL_PTR at pos+1. + Therefore, we must compute offsets for the first pos+2 + clustered index fields. */ + ut_ad(pos <= MAX_REF_PARTS); + + ulint offsets[REC_OFFS_HEADER_SIZE + MAX_REF_PARTS + 2]; + rec_offs_init(offsets); + mem_heap_t* heap = NULL; if (!(flags & BTR_KEEP_SYS_FLAG)) { - mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - rec_offs_init(offsets_); - row_upd_rec_sys_fields_in_recovery( rec, page_zip, - rec_get_offsets(rec, index, offsets_, - ULINT_UNDEFINED, &heap), + rec_get_offsets(rec, index, offsets, + pos + 2, &heap), pos, trx_id, roll_ptr); - if (UNIV_LIKELY_NULL(heap)) { - mem_heap_free(heap); - } + } else { + /* In delete-marked records, DB_TRX_ID must + always refer to an existing undo log record. */ + ut_ad(memcmp(rec_get_nth_field( + rec, + rec_get_offsets(rec, index, + offsets, pos, + &heap), + pos, &offset), + field_ref_zero, DATA_TRX_ID_LEN)); + ut_ad(offset == DATA_TRX_ID_LEN); + } + + if (UNIV_LIKELY_NULL(heap)) { + mem_heap_free(heap); } } @@ -4594,7 +4647,6 @@ undo log record created. dberr_t btr_cur_del_mark_set_clust_rec( /*===========================*/ - ulint flags, /*!< in: undo logging and locking flags */ buf_block_t* block, /*!< in/out: buffer block of the record */ rec_t* rec, /*!< in/out: record */ dict_index_t* index, /*!< in: clustered index of the record */ @@ -4617,8 +4669,10 @@ btr_cur_del_mark_set_clust_rec( ut_ad(mtr->is_named_space(index->space)); if (rec_get_deleted_flag(rec, rec_offs_comp(offsets))) { - /* While cascading delete operations, this becomes possible. */ - ut_ad(rec_get_trx_id(rec, index) == thr_get_trx(thr)->id); + /* We may already have delete-marked this record + when executing an ON DELETE CASCADE operation. */ + ut_ad(row_get_rec_trx_id(rec, index, offsets) + == thr_get_trx(thr)->id); return(DB_SUCCESS); } @@ -4630,8 +4684,8 @@ btr_cur_del_mark_set_clust_rec( return(err); } - err = trx_undo_report_row_operation(flags, TRX_UNDO_MODIFY_OP, thr, - index, entry, NULL, 0, rec, offsets, + err = trx_undo_report_row_operation(thr, index, + entry, NULL, 0, rec, offsets, &roll_ptr); if (err != DB_SUCCESS) { @@ -4647,10 +4701,6 @@ btr_cur_del_mark_set_clust_rec( btr_rec_set_deleted_flag(rec, page_zip, TRUE); trx = thr_get_trx(thr); - /* This function must not be invoked during rollback - (of a TRX_STATE_PREPARE transaction or otherwise). */ - ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE)); - ut_ad(!trx->in_rollback); DBUG_LOG("ib_cur", "delete-mark clust " << index->table->name @@ -5323,6 +5373,8 @@ btr_estimate_n_rows_in_range_on_level( NULL, BUF_GET_POSSIBLY_FREED, __FILE__, __LINE__, &mtr, &err); + ut_ad((block != NULL) == (err == DB_SUCCESS)); + if (err != DB_SUCCESS) { if (err == DB_DECRYPTION_FAILED) { ib_push_warning((void *)NULL, @@ -5331,7 +5383,7 @@ btr_estimate_n_rows_in_range_on_level( " used key_id is not available. " " Can't continue reading table.", index->table->name); - index->table->is_encrypted = true; + index->table->file_unreadable = true; } mtr_commit(&mtr); @@ -5518,6 +5570,10 @@ btr_estimate_n_rows_in_range_low( mtr_commit(&mtr); + if (!index->is_readable()) { + return 0; + } + mtr_start(&mtr); cursor.path_arr = path2; @@ -5997,6 +6053,11 @@ btr_estimate_number_of_different_key_vals( because otherwise our algorithm would give a wrong estimate for an index where there is just one key value. */ + if (!index->is_readable()) { + mtr_commit(&mtr); + goto exit_loop; + } + page = btr_cur_get_page(&cursor); rec = page_rec_get_next(page_get_infimum_rec(page)); @@ -6080,6 +6141,7 @@ btr_estimate_number_of_different_key_vals( mtr_commit(&mtr); } +exit_loop: /* If we saw k borders between different key values on n_sample_pages leaf pages, we can estimate how many there will be in index->stat_n_leaf_pages */ diff --git a/storage/innobase/btr/btr0defragment.cc b/storage/innobase/btr/btr0defragment.cc index 06cd1315590..d4b83930191 100644 --- a/storage/innobase/btr/btr0defragment.cc +++ b/storage/innobase/btr/btr0defragment.cc @@ -154,7 +154,6 @@ btr_defragment_init() srv_defragment_interval = ut_microseconds_to_timer( (ulonglong) (1000000.0 / srv_defragment_frequency)); mutex_create(LATCH_ID_BTR_DEFRAGMENT_MUTEX, &btr_defragment_mutex); - os_thread_create(btr_defragment_thread, NULL, NULL); } /******************************************************************//** @@ -227,7 +226,7 @@ btr_defragment_add_index( page = buf_block_get_frame(block); } - if (page == NULL && index->table->is_encrypted) { + if (page == NULL && !index->is_readable()) { mtr_commit(&mtr); *err = DB_DECRYPTION_FAILED; return NULL; @@ -736,14 +735,13 @@ btr_defragment_n_pages( return current_block; } -/******************************************************************//** -Thread that merges consecutive b-tree pages into fewer pages to defragment -the index. */ +/** Whether btr_defragment_thread is active */ +bool btr_defragment_thread_active; + +/** Merge consecutive b-tree pages into fewer pages to defragment indexes */ extern "C" UNIV_INTERN os_thread_ret_t -DECLARE_THREAD(btr_defragment_thread)( -/*==========================================*/ - void* arg) /*!< in: work queue */ +DECLARE_THREAD(btr_defragment_thread)(void*) { btr_pcur_t* pcur; btr_cur_t* cursor; @@ -753,6 +751,8 @@ DECLARE_THREAD(btr_defragment_thread)( buf_block_t* last_block; while (srv_shutdown_state == SRV_SHUTDOWN_NONE) { + ut_ad(btr_defragment_thread_active); + /* If defragmentation is disabled, sleep before checking whether it's enabled. */ if (!srv_defragment) { @@ -844,7 +844,8 @@ DECLARE_THREAD(btr_defragment_thread)( btr_defragment_remove_item(item); } } - btr_defragment_shutdown(); + + btr_defragment_thread_active = false; os_thread_exit(); OS_THREAD_DUMMY_RETURN; } diff --git a/storage/innobase/btr/btr0pcur.cc b/storage/innobase/btr/btr0pcur.cc index 445aa3504b7..fdde6f5d3e7 100644 --- a/storage/innobase/btr/btr0pcur.cc +++ b/storage/innobase/btr/btr0pcur.cc @@ -418,6 +418,11 @@ btr_pcur_move_to_next_page( cursor->old_stored = false; page = btr_pcur_get_page(cursor); + + if (UNIV_UNLIKELY(!page)) { + return; + } + next_page_no = btr_page_get_next(page, mtr); ut_ad(next_page_no != FIL_NULL); @@ -438,6 +443,10 @@ btr_pcur_move_to_next_page( block->page.size, mode, btr_pcur_get_btr_cur(cursor)->index, mtr); + if (UNIV_UNLIKELY(!next_block)) { + return; + } + next_page = buf_block_get_frame(next_block); #ifdef UNIV_BTR_DEBUG ut_a(page_is_comp(next_page) == page_is_comp(page)); diff --git a/storage/innobase/btr/btr0scrub.cc b/storage/innobase/btr/btr0scrub.cc index 307d6d0ec6c..376a106bf8a 100644 --- a/storage/innobase/btr/btr0scrub.cc +++ b/storage/innobase/btr/btr0scrub.cc @@ -140,6 +140,7 @@ btr_scrub_lock_dict_func(ulint space_id, bool lock_to_close_table, } else { return false; } + os_thread_sleep(250000); time_t now = time(0); @@ -571,7 +572,7 @@ btr_scrub_table_needs_scrubbing( return false; } - if (table->corrupted) { + if (!table->is_readable()) { return false; } @@ -882,17 +883,15 @@ btr_scrub_update_total_stat(btr_scrub_t *scrub_data) memset(&scrub_data->scrub_stat, 0, sizeof(scrub_data->scrub_stat)); } -/**************************************************************//** -Complete iterating a space */ +/** Complete iterating a space. +@param[in,out] scrub_data scrub data */ UNIV_INTERN -bool -btr_scrub_complete_space( -/*=====================*/ - btr_scrub_t* scrub_data) /*!< in/out: scrub data */ +void +btr_scrub_complete_space(btr_scrub_t* scrub_data) { + ut_ad(scrub_data->scrubbing); btr_scrub_table_close_for_thread(scrub_data); btr_scrub_update_total_stat(scrub_data); - return scrub_data->scrubbing; } /********************************************************************* diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index 754b2cd1c25..eac8cf7c924 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -31,16 +31,17 @@ The database buffer buf_pool Created 11/5/1995 Heikki Tuuri *******************************************************/ -#include "ha_prototypes.h" - +#include "univ.i" +#include "mtr0types.h" +#include "mach0data.h" #include "page0size.h" #include "buf0buf.h" -#include "os0api.h" +#include + +#ifdef UNIV_NONINL +#include "buf0buf.ic" +#endif -#ifdef UNIV_INNOCHECKSUM -#include "string.h" -#include "mach0data.h" -#endif /* UNIV_INNOCHECKSUM */ #ifndef UNIV_INNOCHECKSUM #include "mem0mem.h" #include "btr0btr.h" @@ -64,7 +65,6 @@ Created 11/5/1995 Heikki Tuuri #include "fsp0sysspace.h" #endif /* !UNIV_INNOCHECKSUM */ #include "page0zip.h" -#include "buf0checksum.h" #include "sync0sync.h" #include "buf0dump.h" #include "ut0new.h" @@ -79,6 +79,10 @@ Created 11/5/1995 Heikki Tuuri #include "ut0byte.h" #include +#ifdef UNIV_LINUX +#include +#endif + #ifdef HAVE_LZO #include "lzo/lzo1x.h" #endif @@ -126,6 +130,30 @@ struct set_numa_interleave_t #define NUMA_MEMPOLICY_INTERLEAVE_IN_SCOPE #endif /* HAVE_LIBNUMA */ +#ifdef HAVE_SNAPPY +#include "snappy-c.h" +#endif + +inline void* aligned_malloc(size_t size, size_t align) { + void *result; +#ifdef _MSC_VER + result = _aligned_malloc(size, align); +#else + if(posix_memalign(&result, align, size)) { + result = 0; + } +#endif + return result; +} + +inline void aligned_free(void *ptr) { +#ifdef _MSC_VER + _aligned_free(ptr); +#else + free(ptr); +#endif +} + /* IMPLEMENTATION OF THE BUFFER POOL ================================= @@ -412,16 +440,6 @@ bool buf_page_decrypt_after_read(buf_page_t* bpage, fil_space_t* space) MY_ATTRIBUTE((nonnull)); -/** Check if page is maybe compressed, encrypted or both when we encounter -corrupted page. Note that we can't be 100% sure if page is corrupted -or decrypt/decompress just failed. -@param[in,out] bpage Page -@return true if page corrupted, false if not */ -static -bool -buf_page_check_corrupt(buf_page_t* bpage) - MY_ATTRIBUTE((nonnull, warn_unused_result)); - /* prototypes for new functions added to ha_innodb.cc */ trx_t* innobase_get_trx(); @@ -627,10 +645,10 @@ buf_page_is_checksum_valid_crc32( #ifdef UNIV_INNOCHECKSUM if (log_file && srv_checksum_algorithm == SRV_CHECKSUM_ALGORITHM_STRICT_CRC32) { - fprintf(log_file, "page::%lu;" + fprintf(log_file, "page::%llu;" " crc32 calculated = %u;" - " recorded checksum field1 = %lu recorded" - " checksum field2 =%lu\n", cur_page_num, + " recorded checksum field1 = " ULINTPF " recorded" + " checksum field2 =" ULINTPF "\n", cur_page_num, crc32, checksum_field1, checksum_field2); } #endif /* UNIV_INNOCHECKSUM */ @@ -684,33 +702,34 @@ buf_page_is_checksum_valid_innodb( #ifdef UNIV_INNOCHECKSUM if (log_file && srv_checksum_algorithm == SRV_CHECKSUM_ALGORITHM_INNODB) { - fprintf(log_file, "page::%lu;" + fprintf(log_file, "page::%llu;" " old style: calculated =" - " %lu; recorded = %lu\n", + " " ULINTPF "; recorded = " ULINTPF "\n", cur_page_num, old_checksum, checksum_field2); - fprintf(log_file, "page::%lu;" + fprintf(log_file, "page::%llu;" " new style: calculated =" - " %lu; crc32 = %u; recorded = %lu\n", + " " ULINTPF "; crc32 = %u; recorded = " ULINTPF "\n", cur_page_num, new_checksum, buf_calc_page_crc32(read_buf), checksum_field1); } if (log_file && srv_checksum_algorithm == SRV_CHECKSUM_ALGORITHM_STRICT_INNODB) { - fprintf(log_file, "page::%lu;" + fprintf(log_file, "page::%llu;" " old style: calculated =" - " %lu; recorded checksum = %lu\n", + " " ULINTPF "; recorded checksum = " ULINTPF "\n", cur_page_num, old_checksum, checksum_field2); - fprintf(log_file, "page::%lu;" + fprintf(log_file, "page::%llu;" " new style: calculated =" - " %lu; recorded checksum = %lu\n", + " " ULINTPF "; recorded checksum = " ULINTPF "\n", cur_page_num, new_checksum, checksum_field1); } #endif /* UNIV_INNOCHECKSUM */ + if (checksum_field2 != mach_read_from_4(read_buf + FIL_PAGE_LSN) && checksum_field2 != old_checksum) { DBUG_LOG("checksum", @@ -770,9 +789,9 @@ buf_page_is_checksum_valid_none( if (log_file && srv_checksum_algorithm == SRV_CHECKSUM_ALGORITHM_STRICT_NONE) { fprintf(log_file, - "page::%lu; none checksum: calculated" - " = %lu; recorded checksum_field1 = %lu" - " recorded checksum_field2 = %lu\n", + "page::%llu; none checksum: calculated" + " = " ULINTPF "; recorded checksum_field1 = " ULINTPF + " recorded checksum_field2 = " ULINTPF "\n", cur_page_num, BUF_NO_CHECKSUM_MAGIC, checksum_field1, checksum_field2); } @@ -782,29 +801,29 @@ buf_page_is_checksum_valid_none( && checksum_field1 == BUF_NO_CHECKSUM_MAGIC); } -/** Checks if a page is corrupt. -@param[in] check_lsn true if we need to check and complain about -the LSN +/** Check if a page is corrupt. +@param[in] check_lsn whether the LSN should be checked @param[in] read_buf database page @param[in] page_size page size @param[in] space tablespace -@return TRUE if corrupted */ +@return whether the page is corrupted */ bool buf_page_is_corrupted( bool check_lsn, const byte* read_buf, const page_size_t& page_size, - const fil_space_t* space -) +#ifndef UNIV_INNOCHECKSUM + const fil_space_t* space) +#else + const void* space) +#endif { - ulint checksum_field1; - ulint checksum_field2; - + size_t checksum_field1 = 0; + size_t checksum_field2 = 0; #ifndef UNIV_INNOCHECKSUM DBUG_EXECUTE_IF("buf_page_import_corrupt_failure", return(true); ); - - ulint page_type = mach_read_from_2( - read_buf + FIL_PAGE_TYPE); +#endif + ulint page_type = mach_read_from_2(read_buf + FIL_PAGE_TYPE); /* We can trust page type if page compression is set on tablespace flags because page compression flag means file must have been @@ -817,15 +836,12 @@ buf_page_is_corrupted( decompressed at this stage). */ if ((page_type == FIL_PAGE_PAGE_COMPRESSED || page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED) - && space && FSP_FLAGS_HAS_PAGE_COMPRESSION(space->flags)) { - return(false); - } -#else - if (mach_read_from_4(read_buf+FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION) != 0 - || mach_read_from_2(read_buf+FIL_PAGE_TYPE) == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED) { - return(false); - } +#ifndef UNIV_INNOCHECKSUM + && space && FSP_FLAGS_HAS_PAGE_COMPRESSION(space->flags) #endif + ) { + return(false); + } if (!page_size.is_compressed() && memcmp(read_buf + FIL_PAGE_LSN + 4, @@ -834,14 +850,13 @@ buf_page_is_corrupted( /* Stored log sequence numbers at the start and the end of page do not match */ - #ifndef UNIV_INNOCHECKSUM ib::info() << "Log sequence number at the start " << mach_read_from_4(read_buf + FIL_PAGE_LSN + 4) << " and the end " << mach_read_from_4(read_buf + UNIV_PAGE_SIZE - FIL_PAGE_END_LSN_OLD_CHKSUM + 4) << " do not match"; -#endif +#endif /* UNIV_INNOCHECKSUM */ return(true); } @@ -904,10 +919,9 @@ buf_page_is_corrupted( && *reinterpret_cast( read_buf + FIL_PAGE_LSN) == 0) { + ulint i; + /* make sure that the page is really empty */ - - ulint i; - for (i = 0; i < page_size.logical(); ++i) { /* The FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID has been @@ -928,7 +942,7 @@ buf_page_is_corrupted( #ifdef UNIV_INNOCHECKSUM if (i >= page_size.logical()) { if (log_file) { - fprintf(log_file, "Page::%lu" + fprintf(log_file, "Page::%llu" " is empty and uncorrupted\n", cur_page_num); } @@ -962,33 +976,34 @@ buf_page_is_corrupted( if (buf_page_is_checksum_valid_none(read_buf, checksum_field1, checksum_field2)) { -#ifndef UNIV_INNOCHECKSUM if (curr_algo == SRV_CHECKSUM_ALGORITHM_STRICT_CRC32) { +#ifndef UNIV_INNOCHECKSUM page_warn_strict_checksum( curr_algo, SRV_CHECKSUM_ALGORITHM_NONE, page_id); - } #endif /* !UNIV_INNOCHECKSUM */ + } #ifdef UNIV_INNOCHECKSUM if (log_file) { - - fprintf(log_file, "page::%lu;" - " old style: calculated = " ULINTPF ";" - " recorded = " ULINTPF "\n", cur_page_num, + fprintf(log_file, "page::%llu;" + " old style: calculated = %u;" + " recorded = " ULINTPF ";\n", + cur_page_num, buf_calc_page_old_checksum(read_buf), checksum_field2); - fprintf(log_file, "page::%lu;" - " new style: calculated = " ULINTPF ";" - " crc32 = %u; recorded = " ULINTPF "\n", + fprintf(log_file, "page::%llu;" + " new style: calculated = %u;" + " crc32 = %u; recorded = " ULINTPF ";\n", cur_page_num, buf_calc_page_new_checksum(read_buf), buf_calc_page_crc32(read_buf), checksum_field1); } #endif /* UNIV_INNOCHECKSUM */ + return(false); } @@ -1008,15 +1023,16 @@ buf_page_is_corrupted( if (buf_page_is_checksum_valid_innodb(read_buf, checksum_field1, checksum_field2)) { -#ifndef UNIV_INNOCHECKSUM if (curr_algo == SRV_CHECKSUM_ALGORITHM_STRICT_CRC32) { +#ifndef UNIV_INNOCHECKSUM page_warn_strict_checksum( curr_algo, SRV_CHECKSUM_ALGORITHM_INNODB, page_id); +#endif } -#endif /* !UNIV_INNOCHECKSUM */ + return(false); } @@ -1024,13 +1040,13 @@ buf_page_is_corrupted( if (!legacy_checksum_checked && buf_page_is_checksum_valid_crc32( read_buf, checksum_field1, checksum_field2, true)) { - legacy_big_endian_checksum = true; - return(false); + legacy_big_endian_checksum = true; + return(false); } #ifdef UNIV_INNOCHECKSUM if (log_file) { - fprintf(log_file, "Fail; page %lu" + fprintf(log_file, "Fail; page::%llu;" " invalid (fails crc32 checksum)\n", cur_page_num); } @@ -1047,32 +1063,32 @@ buf_page_is_corrupted( if (buf_page_is_checksum_valid_none(read_buf, checksum_field1, checksum_field2)) { -#ifndef UNIV_INNOCHECKSUM if (curr_algo == SRV_CHECKSUM_ALGORITHM_STRICT_INNODB) { +#ifndef UNIV_INNOCHECKSUM page_warn_strict_checksum( curr_algo, SRV_CHECKSUM_ALGORITHM_NONE, page_id); +#endif } -#endif /* !UNIV_INNOCHECKSUM */ - #ifdef UNIV_INNOCHECKSUM if (log_file) { - fprintf(log_file, "page::%lu;" - " old style: calculated = %lu;" - " recorded = %lu\n", cur_page_num, + fprintf(log_file, "page::%llu;" + " old style: calculated = %u;" + " recorded = %zu;\n", cur_page_num, buf_calc_page_old_checksum(read_buf), checksum_field2); - fprintf(log_file, "page::%lu;" - " new style: calculated = %lu;" - " crc32 = %u; recorded = %lu\n", + fprintf(log_file, "page::%llu;" + " new style: calculated = %u;" + " crc32 = %u; recorded = %zu;\n", cur_page_num, buf_calc_page_new_checksum(read_buf), buf_calc_page_crc32(read_buf), checksum_field1); } #endif /* UNIV_INNOCHECKSUM */ + return(false); } @@ -1080,26 +1096,28 @@ buf_page_is_corrupted( checksum_field1, checksum_field2, false) || buf_page_is_checksum_valid_crc32(read_buf, checksum_field1, checksum_field2, true)) { -#ifndef UNIV_INNOCHECKSUM + if (curr_algo == SRV_CHECKSUM_ALGORITHM_STRICT_INNODB) { +#ifndef UNIV_INNOCHECKSUM page_warn_strict_checksum( curr_algo, SRV_CHECKSUM_ALGORITHM_CRC32, page_id); +#endif } -#endif /* !UNIV_INNOCHECKSUM */ return(false); } #ifdef UNIV_INNOCHECKSUM if (log_file) { - fprintf(log_file, "Fail; page %lu" + fprintf(log_file, "Fail; page::%llu;" " invalid (fails innodb checksum)\n", cur_page_num); } #endif /* UNIV_INNOCHECKSUM */ + return(true); case SRV_CHECKSUM_ALGORITHM_STRICT_NONE: @@ -1135,11 +1153,12 @@ buf_page_is_corrupted( #ifdef UNIV_INNOCHECKSUM if (log_file) { - fprintf(log_file, "Fail; page %lu" + fprintf(log_file, "Fail; page::%llu;" " invalid (fails none checksum)\n", cur_page_num); } #endif /* UNIV_INNOCHECKSUM */ + return(true); case SRV_CHECKSUM_ALGORITHM_NONE: @@ -1154,28 +1173,20 @@ buf_page_is_corrupted( } #ifndef UNIV_INNOCHECKSUM - -/** Prints a page to stderr. -@param[in] read_buf a database page -@param[in] page_size page size -@param[in] flags 0 or BUF_PAGE_PRINT_NO_CRASH or -BUF_PAGE_PRINT_NO_FULL */ +/** Dump a page to stderr. +@param[in] read_buf database page +@param[in] page_size page size */ +UNIV_INTERN void -buf_page_print( - const byte* read_buf, - const page_size_t& page_size, - ulint flags) +buf_page_print(const byte* read_buf, const page_size_t& page_size) { dict_index_t* index; - if (!(flags & BUF_PAGE_PRINT_NO_FULL)) { + ib::info() << "Page dump in ascii and hex (" + << page_size.physical() << " bytes):"; - ib::info() << "Page dump in ascii and hex (" - << page_size.physical() << " bytes):"; - - ut_print_buf(stderr, read_buf, page_size.physical()); - fputs("\nInnoDB: End of page dump\n", stderr); - } + ut_print_buf(stderr, read_buf, page_size.physical()); + fputs("\nInnoDB: End of page dump\n", stderr); if (page_size.is_compressed()) { /* Print compressed page. */ @@ -1340,8 +1351,6 @@ buf_page_print( stderr); break; } - - ut_ad(flags & BUF_PAGE_PRINT_NO_CRASH); } # ifdef PFS_GROUP_BUFFER_SYNC @@ -1423,7 +1432,6 @@ buf_block_init( block->page.buf_fix_count = 0; block->page.io_fix = BUF_IO_NONE; block->page.flush_observer = NULL; - block->page.key_version = 0; block->page.encrypted = false; block->page.real_size = 0; block->page.write_size = 0; @@ -1459,17 +1467,15 @@ buf_block_init( rw_lock_create(PFS_NOT_INSTRUMENTED, &block->lock, SYNC_LEVEL_VARYING); - ut_d(rw_lock_create( - PFS_NOT_INSTRUMENTED, - &block->debug_latch, SYNC_NO_ORDER_CHECK)); + ut_d(rw_lock_create(PFS_NOT_INSTRUMENTED, &block->debug_latch, + SYNC_LEVEL_VARYING)); #else /* PFS_SKIP_BUFFER_MUTEX_RWLOCK || PFS_GROUP_BUFFER_SYNC */ rw_lock_create(buf_block_lock_key, &block->lock, SYNC_LEVEL_VARYING); - ut_d(rw_lock_create( - buf_block_debug_latch_key, - &block->debug_latch, SYNC_NO_ORDER_CHECK)); + ut_d(rw_lock_create(buf_block_debug_latch_key, + &block->debug_latch, SYNC_LEVEL_VARYING)); #endif /* PFS_SKIP_BUFFER_MUTEX_RWLOCK || PFS_GROUP_BUFFER_SYNC */ @@ -1960,20 +1966,14 @@ buf_pool_free_instance( if (buf_pool->tmp_arr) { for(ulint i = 0; i < buf_pool->tmp_arr->n_slots; i++) { buf_tmp_buffer_t* slot = &(buf_pool->tmp_arr->slots[i]); -#ifdef HAVE_LZO - if (slot && slot->lzo_mem) { - ut_free(slot->lzo_mem); - slot->lzo_mem = NULL; - } -#endif - if (slot && slot->crypt_buf_free) { - ut_free(slot->crypt_buf_free); - slot->crypt_buf_free = NULL; + if (slot && slot->crypt_buf) { + aligned_free(slot->crypt_buf); + slot->crypt_buf = NULL; } - if (slot && slot->comp_buf_free) { - ut_free(slot->comp_buf_free); - slot->comp_buf_free = NULL; + if (slot && slot->comp_buf) { + aligned_free(slot->comp_buf); + slot->comp_buf = NULL; } } @@ -3709,7 +3709,6 @@ buf_page_get_zip( ibool discard_attempted = FALSE; ibool must_read; buf_pool_t* buf_pool = buf_pool_get(page_id); - buf_page_t* rpage = NULL; buf_pool->stat.n_page_gets++; @@ -3728,7 +3727,14 @@ lookup: /* Page not in buf_pool: needs to be read from file */ ut_ad(!hash_lock); - buf_read_page(page_id, page_size, &rpage); + dberr_t err = buf_read_page(page_id, page_size); + + if (err != DB_SUCCESS) { + ib::error() << "Reading compressed page " << page_id + << " failed with error: " << ut_strerr(err); + + goto err_exit; + } #if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG ut_a(++buf_dbg_counter % 5771 || buf_validate()); @@ -3861,14 +3867,25 @@ buf_zip_decompress( { const byte* frame = block->page.zip.data; ulint size = page_zip_get_size(&block->page.zip); + /* The tablespace will not be found if this function is called + during IMPORT. */ + fil_space_t* space = fil_space_acquire_for_io(block->page.id.space()); + const unsigned key_version = mach_read_from_4( + frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); + fil_space_crypt_t* crypt_data = space ? space->crypt_data : NULL; + const bool encrypted = crypt_data + && crypt_data->type != CRYPT_SCHEME_UNENCRYPTED + && (!crypt_data->is_default_encryption() + || srv_encrypt_tables); ut_ad(block->page.size.is_compressed()); ut_a(block->page.id.space() != 0); if (UNIV_UNLIKELY(check && !page_zip_verify_checksum(frame, size))) { - ib::error() << "Compressed page checksum mismatch " - << block->page.id << "): stored: " + ib::error() << "Compressed page checksum mismatch for " + << (space ? space->chain.start->name : "") + << block->page.id << ": stored: " << mach_read_from_4(frame + FIL_PAGE_SPACE_OR_CHKSUM) << ", crc32: " << page_zip_calc_checksum( @@ -3884,7 +3901,7 @@ buf_zip_decompress( << page_zip_calc_checksum( frame, size, SRV_CHECKSUM_ALGORITHM_NONE); - return(FALSE); + goto err_exit; } switch (fil_page_get_type(frame)) { @@ -3892,15 +3909,16 @@ buf_zip_decompress( case FIL_PAGE_RTREE: if (page_zip_decompress(&block->page.zip, block->frame, TRUE)) { + if (space) { + fil_space_release_for_io(space); + } return(TRUE); } - ib::error() << "Unable to decompress space " - << block->page.id.space() - << " page " << block->page.id.page_no(); - - return(FALSE); - + ib::error() << "Unable to decompress " + << (space ? space->chain.start->name : "") + << block->page.id; + goto err_exit; case FIL_PAGE_TYPE_ALLOCATED: case FIL_PAGE_INODE: case FIL_PAGE_IBUF_BITMAP: @@ -3910,11 +3928,31 @@ buf_zip_decompress( case FIL_PAGE_TYPE_ZBLOB2: /* Copy to uncompressed storage. */ memcpy(block->frame, frame, block->page.size.physical()); + if (space) { + fil_space_release_for_io(space); + } + return(TRUE); } ib::error() << "Unknown compressed page type " - << fil_page_get_type(frame); + << fil_page_get_type(frame) + << " in " << (space ? space->chain.start->name : "") + << block->page.id; + +err_exit: + if (encrypted) { + ib::info() << "Row compressed page could be encrypted" + " with key_version " << key_version; + block->page.encrypted = true; + dict_set_encrypted_by_space(block->page.id.space()); + } else { + dict_set_corrupted_by_space(block->page.id.space()); + } + + if (space) { + fil_space_release_for_io(space); + } return(FALSE); } @@ -4205,7 +4243,6 @@ loop: } if (block == NULL) { - buf_page_t* bpage=NULL; /* Page not in buf_pool: needs to be read from file */ @@ -4263,7 +4300,20 @@ loop: return(NULL); } - if (buf_read_page(page_id, page_size, &bpage)) { + /* The call path is buf_read_page() -> + buf_read_page_low() (fil_io()) -> + buf_page_io_complete() -> + buf_decrypt_after_read(). Here fil_space_t* is used + and we decrypt -> buf_page_check_corrupt() where page + checksums are compared. Decryption, decompression as + well as error handling takes place at a lower level. + Here we only need to know whether the page really is + corrupted, or if an encrypted page with a valid + checksum cannot be decypted. */ + + dberr_t local_err = buf_read_page(page_id, page_size); + + if (local_err == DB_SUCCESS) { buf_read_ahead_random(page_id, page_size, ibuf_inside(mtr)); @@ -4271,82 +4321,44 @@ loop: } else if (retries < BUF_PAGE_READ_MAX_RETRIES) { ++retries; - bool corrupted = false; - - if (bpage) { - corrupted = buf_page_check_corrupt(bpage); - } - - /* Do not try again for encrypted pages */ - if (corrupted && bpage->encrypted) { - BPageMutex* pmutex = buf_page_get_mutex(bpage); - - buf_pool = buf_pool_from_bpage(bpage); - buf_pool_mutex_enter(buf_pool); - mutex_enter(pmutex); - - ut_ad(buf_pool->n_pend_reads > 0); - my_atomic_addlint(&buf_pool->n_pend_reads, -1); - buf_page_set_io_fix(bpage, BUF_IO_NONE); - mutex_exit(pmutex); - buf_LRU_free_page(bpage, true); - buf_pool_mutex_exit(buf_pool); - rw_lock_x_unlock_gen(&((buf_block_t*) bpage)->lock, - BUF_IO_READ); - - if (err) { - *err = DB_DECRYPTION_FAILED; - } - - return (NULL); - } - DBUG_EXECUTE_IF( "innodb_page_corruption_retries", retries = BUF_PAGE_READ_MAX_RETRIES; ); } else { - bool corrupted = false; - - if (bpage) { - corrupted = buf_page_check_corrupt(bpage); + if (err) { + *err = local_err; } - if (corrupted && !bpage->encrypted) { - ib::fatal() << "Unable to read page " << page_id - << " into the buffer pool after " - << BUF_PAGE_READ_MAX_RETRIES << " attempts." - " The most probable cause of this error may" - " be that the table has been corrupted. Or," - " the table was compressed with with an" - " algorithm that is not supported by this" - " instance. If it is not a decompress failure," - " you can try to fix this problem by using" - " innodb_force_recovery." - " Please see " REFMAN " for more" - " details. Aborting..."; - } else { - BPageMutex* pmutex = buf_page_get_mutex(bpage); - - buf_pool = buf_pool_from_bpage(bpage); - buf_pool_mutex_enter(buf_pool); - mutex_enter(pmutex); - - ut_ad(buf_pool->n_pend_reads > 0); - my_atomic_addlint(&buf_pool->n_pend_reads, -1); - buf_page_set_io_fix(bpage, BUF_IO_NONE); - mutex_exit(pmutex); - buf_LRU_free_page(bpage, true); - buf_pool_mutex_exit(buf_pool); - rw_lock_x_unlock_gen(&((buf_block_t*) bpage)->lock, - BUF_IO_READ); - - if (err) { - *err = DB_DECRYPTION_FAILED; - } - + /* Pages whose encryption key is unavailable or used + key, encryption algorithm or encryption method is + incorrect are marked as encrypted in + buf_page_check_corrupt(). Unencrypted page could be + corrupted in a way where the key_id field is + nonzero. There is no checksum on field + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION. */ + if (local_err == DB_DECRYPTION_FAILED) { return (NULL); } + + /* Try to set table as corrupted instead of + asserting. */ + if (page_id.space() != TRX_SYS_SPACE && + dict_set_corrupted_by_space(page_id.space())) { + return (NULL); + } + + ib::fatal() << "Unable to read page " << page_id + << " into the buffer pool after " + << BUF_PAGE_READ_MAX_RETRIES + << ". The most probable cause" + " of this error may be that the" + " table has been corrupted." + " You can try to fix this" + " problem by using" + " innodb_force_recovery." + " Please see " REFMAN " for more" + " details. Aborting..."; } #if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG @@ -4541,12 +4553,21 @@ got_block: /* Decompress the page while not holding buf_pool->mutex or block->mutex. */ - /* Page checksum verification is already done when - the page is read from disk. Hence page checksum - verification is not necessary when decompressing the page. */ { - bool success = buf_zip_decompress(block, FALSE); - ut_a(success); + bool success = buf_zip_decompress(block, TRUE); + + if (!success) { + buf_pool_mutex_enter(buf_pool); + buf_page_mutex_enter(fix_block); + buf_block_set_io_fix(fix_block, BUF_IO_NONE); + buf_page_mutex_exit(fix_block); + + --buf_pool->n_pend_unzip; + buf_block_unfix(fix_block); + buf_pool_mutex_exit(buf_pool); + rw_lock_x_unlock(&fix_block->lock); + return NULL; + } } if (!recv_no_ibuf_operations) { @@ -4649,19 +4670,12 @@ got_block: goto loop; } - ib::info() << "innodb_change_buffering_debug evict " - << page_id; - return(NULL); } buf_page_mutex_enter(fix_block); if (buf_flush_page_try(buf_pool, fix_block)) { - - ib::info() << "innodb_change_buffering_debug flush " - << page_id; - guess = fix_block; goto loop; @@ -5113,7 +5127,6 @@ buf_page_init_low( bpage->newest_modification = 0; bpage->oldest_modification = 0; bpage->write_size = 0; - bpage->key_version = 0; bpage->encrypted = false; bpage->real_size = 0; bpage->slot = NULL; @@ -5210,7 +5223,7 @@ buf_page_init( } } -/** Inits a page for read to the buffer buf_pool. If the page is +/** Initialize a page for read to the buffer buf_pool. If the page is (1) already in buf_pool, or (2) if we specify to read only ibuf pages and the page is not an ibuf page, or (3) if the space is deleted or being deleted, @@ -5221,15 +5234,17 @@ and the lock released later. @param[out] err DB_SUCCESS or DB_TABLESPACE_DELETED @param[in] mode BUF_READ_IBUF_PAGES_ONLY, ... @param[in] page_id page id -@param[in] unzip TRUE=request uncompressed page -@return pointer to the block or NULL */ +@param[in] unzip whether the uncompressed page is + requested (for ROW_FORMAT=COMPRESSED) +@return pointer to the block +@retval NULL in case of an error */ buf_page_t* buf_page_init_for_read( dberr_t* err, ulint mode, const page_id_t& page_id, const page_size_t& page_size, - ibool unzip) + bool unzip) { buf_block_t* block; buf_page_t* bpage = NULL; @@ -5577,15 +5592,11 @@ buf_page_create( memset(frame + FIL_PAGE_NEXT, 0xff, 4); mach_write_to_2(frame + FIL_PAGE_TYPE, FIL_PAGE_TYPE_ALLOCATED); - /* These 8 bytes are also repurposed for PageIO compression and must - be reset when the frame is assigned to a new page id. See fil0fil.h. - - - FIL_PAGE_FILE_FLUSH_LSN is used on the following pages: + /* FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION is only used on the + following pages: (1) The first page of the InnoDB system tablespace (page 0:0) - (2) FIL_RTREE_SPLIT_SEQ_NUM on R-tree pages . - - Therefore we don't transparently compress such pages. */ + (2) FIL_RTREE_SPLIT_SEQ_NUM on R-tree pages + (3) key_version on encrypted pages (not page 0:0) */ memset(frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, 0, 8); @@ -5708,72 +5719,74 @@ buf_page_monitor( /********************************************************************//** Mark a table with the specified space pointed by bpage->id.space() corrupted. Also remove the bpage from LRU list. -@return TRUE if successful */ +@param[in,out] bpage Block */ static -ibool -buf_mark_space_corrupt( -/*===================*/ - buf_page_t* bpage) /*!< in: pointer to the block in question */ +void +buf_mark_space_corrupt(buf_page_t* bpage) { buf_pool_t* buf_pool = buf_pool_from_bpage(bpage); const ibool uncompressed = (buf_page_get_state(bpage) == BUF_BLOCK_FILE_PAGE); - ib_uint32_t space = bpage->id.space(); - ibool ret = TRUE; + uint32_t space = bpage->id.space(); - if (!bpage->encrypted) { - /* First unfix and release lock on the bpage */ - buf_pool_mutex_enter(buf_pool); - mutex_enter(buf_page_get_mutex(bpage)); - ut_ad(buf_page_get_io_fix(bpage) == BUF_IO_READ); - ut_ad(bpage->buf_fix_count == 0); + /* First unfix and release lock on the bpage */ + buf_pool_mutex_enter(buf_pool); + mutex_enter(buf_page_get_mutex(bpage)); + ut_ad(buf_page_get_io_fix(bpage) == BUF_IO_READ); + ut_ad(bpage->buf_fix_count == 0); - /* Set BUF_IO_NONE before we remove the block from LRU list */ - buf_page_set_io_fix(bpage, BUF_IO_NONE); + /* Set BUF_IO_NONE before we remove the block from LRU list */ + buf_page_set_io_fix(bpage, BUF_IO_NONE); - if (uncompressed) { - rw_lock_x_unlock_gen( - &((buf_block_t*) bpage)->lock, - BUF_IO_READ); - } - - mutex_exit(buf_page_get_mutex(bpage)); + if (uncompressed) { + rw_lock_x_unlock_gen( + &((buf_block_t*) bpage)->lock, + BUF_IO_READ); } - /* Find the table with specified space id, and mark it corrupted */ - if (dict_set_corrupted_by_space(space)) { - if (!bpage->encrypted) { - buf_LRU_free_one_page(bpage); - } + mutex_exit(buf_page_get_mutex(bpage)); + + /* If block is not encrypted find the table with specified + space id, and mark it corrupted. Encrypted tables + are marked unusable later e.g. in ::open(). */ + if (!bpage->encrypted) { + dict_set_corrupted_by_space(space); } else { - ret = FALSE; + dict_set_encrypted_by_space(space); } - if (!bpage->encrypted) { - ut_ad(buf_pool->n_pend_reads > 0); - buf_pool->n_pend_reads--; + /* After this point bpage can't be referenced. */ + buf_LRU_free_one_page(bpage); - buf_pool_mutex_exit(buf_pool); - } + ut_ad(buf_pool->n_pend_reads > 0); + buf_pool->n_pend_reads--; - return(ret); + buf_pool_mutex_exit(buf_pool); } /** Check if page is maybe compressed, encrypted or both when we encounter corrupted page. Note that we can't be 100% sure if page is corrupted or decrypt/decompress just failed. -@param[in,out] bpage Page -@return true if page corrupted, false if not */ +@param[in,out] bpage page +@param[in,out] space tablespace from fil_space_acquire_for_io() +@return whether the operation succeeded +@retval DB_SUCCESS if page has been read and is not corrupted +@retval DB_PAGE_CORRUPTED if page based on checksum check is corrupted +@retval DB_DECRYPTION_FAILED if page post encryption checksum matches but +after decryption normal page checksum does not match. +@retval DB_TABLESPACE_DELETED if accessed tablespace is not found */ static -bool -buf_page_check_corrupt(buf_page_t* bpage) +dberr_t +buf_page_check_corrupt(buf_page_t* bpage, fil_space_t* space) { + ut_ad(space->n_pending_ios > 0); + byte* dst_frame = (bpage->zip.data) ? bpage->zip.data : ((buf_block_t*) bpage)->frame; - fil_space_t* space = fil_space_acquire_silent(bpage->id.space()); bool still_encrypted = false; + dberr_t err = DB_SUCCESS; bool corrupted = false; - fil_space_crypt_t* crypt_data = space ? space->crypt_data : NULL; + fil_space_crypt_t* crypt_data = space->crypt_data; /* In buf_decrypt_after_read we have either decrypted the page if page post encryption checksum matches and used key_id is found @@ -5784,9 +5797,9 @@ buf_page_check_corrupt(buf_page_t* bpage) still_encrypted = crypt_data && crypt_data->type != CRYPT_SCHEME_UNENCRYPTED && !bpage->encrypted - && fil_space_verify_crypt_checksum(dst_frame, bpage->size, - bpage->id.space(), - bpage->id.page_no()); + && fil_space_verify_crypt_checksum( + dst_frame, bpage->size, + bpage->id.space(), bpage->id.page_no()); if (!still_encrypted) { /* If traditional checksums match, we assume that page is @@ -5796,6 +5809,8 @@ buf_page_check_corrupt(buf_page_t* bpage) if (!corrupted) { bpage->encrypted = false; + } else { + err = DB_PAGE_CORRUPTED; } } @@ -5806,16 +5821,18 @@ buf_page_check_corrupt(buf_page_t* bpage) buf_page_io_complete(). */ } else if (still_encrypted || (bpage->encrypted && corrupted)) { bpage->encrypted = true; - corrupted = true; + err = DB_DECRYPTION_FAILED; ib::error() - << "The page " << bpage->id << " in file " - << (space && space->name ? space->name : "NULL") - << " cannot be decrypted."; + << "The page " << bpage->id << " in file '" + << space->chain.start->name + << "' cannot be decrypted."; ib::info() << "However key management plugin or used key_version " - << bpage->key_version << " is not found or" + << mach_read_from_4(dst_frame + + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION) + << " is not found or" " used encryption algorithm or method does not match."; if (bpage->id.space() != TRX_SYS_SPACE) { @@ -5827,32 +5844,28 @@ buf_page_check_corrupt(buf_page_t* bpage) } } - if (space) { - fil_space_release(space); - } - - return corrupted; + return (err); } -/********************************************************************//** -Completes an asynchronous read or write request of a file page to or from -the buffer pool. -@return true if successful */ -bool -buf_page_io_complete( -/*=================*/ - buf_page_t* bpage, /*!< in: pointer to the block in question */ - bool evict) /*!< in: whether or not to evict the page - from LRU list. */ - +/** Complete a read or write request of a file page to or from the buffer pool. +@param[in,out] bpage Page to complete +@param[in] evict whether or not to evict the page + from LRU list. +@return whether the operation succeeded +@retval DB_SUCCESS always when writing, or if a read page was OK +@retval DB_TABLESPACE_DELETED if the tablespace does not exist +@retval DB_PAGE_CORRUPTED if the checksum fails on a page read +@retval DB_DECRYPTION_FAILED if page post encryption checksum matches but + after decryption normal page checksum does + not match */ +UNIV_INTERN +dberr_t +buf_page_io_complete(buf_page_t* bpage, bool evict) { enum buf_io_fix io_type; buf_pool_t* buf_pool = buf_pool_from_bpage(bpage); - const ibool uncompressed = (buf_page_get_state(bpage) + const bool uncompressed = (buf_page_get_state(bpage) == BUF_BLOCK_FILE_PAGE); - byte* frame = NULL; - bool corrupted = false; - ut_a(buf_page_in_file(bpage)); /* We do not need protect io_fix here by mutex to read @@ -5863,46 +5876,42 @@ buf_page_io_complete( io_type = buf_page_get_io_fix(bpage); ut_ad(io_type == BUF_IO_READ || io_type == BUF_IO_WRITE); + ut_ad(bpage->size.is_compressed() == (bpage->zip.data != NULL)); + ut_ad(uncompressed || bpage->zip.data); if (io_type == BUF_IO_READ) { - ulint read_page_no; - ulint read_space_id; + ulint read_page_no = 0; + ulint read_space_id = 0; + uint key_version = 0; ut_ad(bpage->zip.data != NULL || ((buf_block_t*)bpage)->frame != NULL); fil_space_t* space = fil_space_acquire_for_io( bpage->id.space()); if (!space) { - return false; + return DB_TABLESPACE_DELETED; } buf_page_decrypt_after_read(bpage, space); - if (bpage->size.is_compressed()) { - frame = bpage->zip.data; - } else { - frame = ((buf_block_t*) bpage)->frame; - } + byte* frame = bpage->zip.data + ? bpage->zip.data + : reinterpret_cast(bpage)->frame; + dberr_t err; - if (bpage->size.is_compressed()) { - frame = bpage->zip.data; - buf_pool->n_pend_unzip++; - - if (uncompressed - && !buf_zip_decompress((buf_block_t*) bpage, - FALSE)) { - - buf_pool->n_pend_unzip--; + if (bpage->zip.data && uncompressed) { + my_atomic_addlint(&buf_pool->n_pend_unzip, 1); + ibool ok = buf_zip_decompress((buf_block_t*) bpage, + FALSE); + my_atomic_addlint(&buf_pool->n_pend_unzip, -1); + if (!ok) { ib::info() << "Page " << bpage->id << " zip_decompress failure."; + err = DB_PAGE_CORRUPTED; goto database_corrupted; } - buf_pool->n_pend_unzip--; - } else { - ut_a(uncompressed); - frame = ((buf_block_t*) bpage)->frame; } /* If this page is not uninitialized and not in the @@ -5911,6 +5920,8 @@ buf_page_io_complete( read_page_no = mach_read_from_4(frame + FIL_PAGE_OFFSET); read_space_id = mach_read_from_4( frame + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID); + key_version = mach_read_from_4( + frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); if (bpage->id.space() == TRX_SYS_SPACE && buf_dblwr_page_inside(bpage->id.page_no())) { @@ -5934,28 +5945,28 @@ buf_page_io_complete( << ", should be " << bpage->id; } - corrupted = buf_page_check_corrupt(bpage); + err = buf_page_check_corrupt(bpage, space); database_corrupted: - if (corrupted) { + if (err != DB_SUCCESS) { /* Not a real corruption if it was triggered by error injection */ DBUG_EXECUTE_IF( "buf_page_import_corrupt_failure", - if (bpage->id.space() - > srv_undo_tablespaces_open - && bpage->id.space() != SRV_TMP_SPACE_ID - && buf_mark_space_corrupt(bpage)) { + if (!is_predefined_tablespace( + bpage->id.space())) { + buf_mark_space_corrupt(bpage); ib::info() << "Simulated IMPORT " "corruption"; fil_space_release_for_io(space); - return(true); + return(err); } + err = DB_SUCCESS; goto page_not_corrupt; ); - if (!bpage->encrypted) { + if (err == DB_PAGE_CORRUPTED) { ib::error() << "Database page corruption on disk" " or a failed file read of tablespace " @@ -5963,8 +5974,7 @@ database_corrupted: << ". You may have to recover from " << "a backup."; - buf_page_print(frame, bpage->size, - BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(frame, bpage->size); ib::info() << "It is also possible that your" @@ -5985,38 +5995,14 @@ database_corrupted: /* If page space id is larger than TRX_SYS_SPACE (0), we will attempt to mark the corresponding table as corrupted instead of crashing server */ - - if (bpage->id.space() > TRX_SYS_SPACE - && buf_mark_space_corrupt(bpage)) { - fil_space_release_for_io(space); - return(false); - } else { - if (!bpage->encrypted) { - ib::fatal() - << "Aborting because of a" - " corrupt database page in" - " the system tablespace. Or, " - " there was a failure in" - " tagging the tablespace " - " as corrupt."; - } - - ib_push_warning(innobase_get_trx(), DB_DECRYPTION_FAILED, - "Table in tablespace %u encrypted." - "However key management plugin or used key_id %lu is not found or" - " used encryption algorithm or method does not match." - " Can't continue opening the table.", - bpage->id.space(), bpage->key_version); - - if (bpage->encrypted && bpage->id.space() > TRX_SYS_SPACE) { - buf_mark_space_corrupt(bpage); - } else { - ut_error; - } - - fil_space_release_for_io(space); - return(false); + if (bpage->id.space() == TRX_SYS_SPACE) { + ib::fatal() << "Aborting because of" + " a corrupt database page."; } + + buf_mark_space_corrupt(bpage); + fil_space_release_for_io(space); + return(err); } } @@ -6034,19 +6020,18 @@ database_corrupted: if (uncompressed && !recv_no_ibuf_operations && (bpage->id.space() == 0 - || (bpage->id.space() > srv_undo_tablespaces_open - && bpage->id.space() != SRV_TMP_SPACE_ID)) + || !is_predefined_tablespace(bpage->id.space())) && !srv_is_tablespace_truncated(bpage->id.space()) && fil_page_get_type(frame) == FIL_PAGE_INDEX && page_is_leaf(frame)) { - if (bpage && bpage->encrypted) { + if (bpage->encrypted) { ib::warn() << "Table in tablespace " << bpage->id.space() << " encrypted. However key " "management plugin or used " - << "key_version " << bpage->key_version + << "key_version " << key_version << "is not found or" " used encryption algorithm or method does not match." " Can't continue opening the table."; @@ -6150,7 +6135,7 @@ database_corrupted: buf_pool_mutex_exit(buf_pool); - return(true); + return DB_SUCCESS; } /*********************************************************************//** @@ -6173,9 +6158,7 @@ buf_all_freed_instance( for (i = buf_pool->n_chunks; i--; chunk++) { - const buf_block_t* block = buf_chunk_not_freed(chunk); - - if (UNIV_LIKELY_NULL(block) && block->page.key_version == 0) { + if (const buf_block_t* block = buf_chunk_not_freed(chunk)) { ib::fatal() << "Page " << block->page.id << " still fixed or dirty"; } @@ -7281,22 +7264,27 @@ buf_pool_reserve_tmp_slot( buf_pool_mutex_exit(buf_pool); /* Allocate temporary memory for encryption/decryption */ - if (free_slot->crypt_buf_free == NULL) { - free_slot->crypt_buf_free = static_cast(ut_malloc_nokey(UNIV_PAGE_SIZE*2)); - free_slot->crypt_buf = static_cast(ut_align(free_slot->crypt_buf_free, UNIV_PAGE_SIZE)); - memset(free_slot->crypt_buf_free, 0, UNIV_PAGE_SIZE *2); + if (free_slot->crypt_buf == NULL) { + free_slot->crypt_buf = static_cast(aligned_malloc(UNIV_PAGE_SIZE, UNIV_PAGE_SIZE)); + memset(free_slot->crypt_buf, 0, UNIV_PAGE_SIZE); } /* For page compressed tables allocate temporary memory for compression/decompression */ - if (compressed && free_slot->comp_buf_free == NULL) { - free_slot->comp_buf_free = static_cast(ut_malloc_nokey(UNIV_PAGE_SIZE*2)); - free_slot->comp_buf = static_cast(ut_align(free_slot->comp_buf_free, UNIV_PAGE_SIZE)); - memset(free_slot->comp_buf_free, 0, UNIV_PAGE_SIZE *2); -#ifdef HAVE_LZO - free_slot->lzo_mem = static_cast(ut_malloc_nokey(LZO1X_1_15_MEM_COMPRESS)); - memset(free_slot->lzo_mem, 0, LZO1X_1_15_MEM_COMPRESS); + if (compressed && free_slot->comp_buf == NULL) { + ulint size = UNIV_PAGE_SIZE; + + /* Both snappy and lzo compression methods require that + output buffer used for compression is bigger than input + buffer. Increase the allocated buffer size accordingly. */ +#if HAVE_SNAPPY + size = snappy_max_compressed_length(size); #endif +#if HAVE_LZO + size += LZO1X_1_15_MEM_COMPRESS; +#endif + free_slot->comp_buf = static_cast(aligned_malloc(size, UNIV_PAGE_SIZE)); + memset(free_slot->comp_buf, 0, size); } return (free_slot); @@ -7324,33 +7312,29 @@ buf_page_encrypt_before_write( switch (bpage->id.page_no()) { case 0: /* Page 0 of a tablespace is not encrypted/compressed */ - ut_ad(bpage->key_version == 0); return src_frame; case TRX_SYS_PAGE_NO: if (bpage->id.space() == TRX_SYS_SPACE) { /* don't encrypt/compress page as it contains address to dblwr buffer */ - bpage->key_version = 0; return src_frame; } } - const page_size_t page_size(space->flags); fil_space_crypt_t* crypt_data = space->crypt_data; + const bool encrypted = crypt_data && !crypt_data->not_encrypted() && crypt_data->type != CRYPT_SCHEME_UNENCRYPTED && (!crypt_data->is_default_encryption() || srv_encrypt_tables); - if (!encrypted) { - bpage->key_version = 0; - } - bool page_compressed = FSP_FLAGS_HAS_PAGE_COMPRESSION(space->flags); if (!encrypted && !page_compressed) { - /* No need to encrypt or page compress the page */ + /* No need to encrypt or page compress the page. + Clear key-version & crypt-checksum. */ + memset(src_frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, 0, 8); return src_frame; } @@ -7370,11 +7354,6 @@ buf_page_encrypt_before_write( src_frame, dst_frame); - uint32_t key_version = mach_read_from_4( - dst_frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); - ut_ad(key_version == 0 || key_version >= bpage->key_version); - bpage->key_version = key_version; - bpage->real_size = page_size.physical(); slot->out_buf = dst_frame = tmp; ut_d(fil_page_type_validate(tmp)); @@ -7386,12 +7365,11 @@ buf_page_encrypt_before_write( space, (byte *)src_frame, slot->comp_buf, - page_size.logical(), + srv_page_size, fsp_flags_get_page_compression_level(space->flags), fil_space_get_block_size(space, bpage->id.page_no()), encrypted, - &out_len, - IF_LZO(slot->lzo_mem, NULL)); + &out_len); bpage->real_size = out_len; @@ -7440,8 +7418,6 @@ buf_page_decrypt_after_read(buf_page_t* bpage, fil_space_t* space) buf_pool_t* buf_pool = buf_pool_from_bpage(bpage); bool success = true; - bpage->key_version = key_version; - if (bpage->id.page_no() == 0) { /* File header pages are not encrypted/compressed */ return (true); @@ -7481,6 +7457,10 @@ buf_page_decrypt_after_read(buf_page_t* bpage, fil_space_t* space) if (!fil_space_verify_crypt_checksum( dst_frame, size, bpage->id.space(), bpage->id.page_no())) { + if (space->crypt_data->type + != CRYPT_SCHEME_UNENCRYPTED) { + bpage->encrypted = true; + } return (false); } @@ -7490,12 +7470,8 @@ buf_page_decrypt_after_read(buf_page_t* bpage, fil_space_t* space) ut_d(fil_page_type_validate(dst_frame)); /* decrypt using crypt_buf to dst_frame */ - byte* res = fil_space_decrypt(space, - slot->crypt_buf, - dst_frame, - &bpage->encrypted); - - if (!res) { + if (!fil_space_decrypt(space, slot->crypt_buf, + dst_frame, &bpage->encrypted)) { success = false; } diff --git a/storage/innobase/buf/buf0checksum.cc b/storage/innobase/buf/buf0checksum.cc index 94eafec0584..4b56cc81e98 100644 --- a/storage/innobase/buf/buf0checksum.cc +++ b/storage/innobase/buf/buf0checksum.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -80,15 +81,13 @@ buf_calc_page_crc32( return(c1 ^ c2); } -/********************************************************************//** -Calculates a page checksum which is stored to the page when it is written +/** Calculate a checksum which is stored to the page when it is written to a file. Note that we must be careful to calculate the same value on 32-bit and 64-bit architectures. +@param[in] page file page (srv_page_size bytes) @return checksum */ -ulint -buf_calc_page_new_checksum( -/*=======================*/ - const byte* page) /*!< in: buffer page */ +uint32_t +buf_calc_page_new_checksum(const byte* page) { ulint checksum; @@ -106,40 +105,29 @@ buf_calc_page_new_checksum( + ut_fold_binary(page + FIL_PAGE_DATA, UNIV_PAGE_SIZE - FIL_PAGE_DATA - FIL_PAGE_END_LSN_OLD_CHKSUM); - checksum = checksum & 0xFFFFFFFFUL; - - return(checksum); + return(static_cast(checksum)); } -/********************************************************************//** -In versions < 4.0.14 and < 4.1.1 there was a bug that the checksum only -looked at the first few bytes of the page. This calculates that old -checksum. +/** In MySQL before 4.0.14 or 4.1.1 there was an InnoDB bug that +the checksum only looked at the first few bytes of the page. +This calculates that old checksum. NOTE: we must first store the new formula checksum to FIL_PAGE_SPACE_OR_CHKSUM before calculating and storing this old checksum because this takes that field as an input! +@param[in] page file page (srv_page_size bytes) @return checksum */ -ulint -buf_calc_page_old_checksum( -/*=======================*/ - const byte* page) /*!< in: buffer page */ +uint32_t +buf_calc_page_old_checksum(const byte* page) { - ulint checksum; - - checksum = ut_fold_binary(page, FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); - - checksum = checksum & 0xFFFFFFFFUL; - - return(checksum); + return(static_cast + (ut_fold_binary(page, FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION))); } -/********************************************************************//** -Return a printable string describing the checksum algorithm. +/** Return a printable string describing the checksum algorithm. +@param[in] algo algorithm @return algorithm name */ const char* -buf_checksum_algorithm_name( -/*========================*/ - srv_checksum_algorithm_t algo) /*!< in: algorithm */ +buf_checksum_algorithm_name(srv_checksum_algorithm_t algo) { switch (algo) { case SRV_CHECKSUM_ALGORITHM_CRC32: diff --git a/storage/innobase/buf/buf0dblwr.cc b/storage/innobase/buf/buf0dblwr.cc index f99fc6434de..2bc3630d3f5 100644 --- a/storage/innobase/buf/buf0dblwr.cc +++ b/storage/innobase/buf/buf0dblwr.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2013, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under @@ -162,11 +162,11 @@ buf_dblwr_init( ut_zalloc_nokey(buf_size * sizeof(void*))); } -/****************************************************************//** -Creates the doublewrite buffer to a new InnoDB installation. The header of the -doublewrite buffer is placed on the trx system header page. -@return true if successful, false if not. */ -MY_ATTRIBUTE((warn_unused_result)) +/** Create the doublewrite buffer if the doublewrite buffer header +is not present in the TRX_SYS page. +@return whether the operation succeeded +@retval true if the doublewrite buffer exists or was created +@retval false if the creation failed (too small first data file) */ bool buf_dblwr_create() { @@ -181,12 +181,11 @@ buf_dblwr_create() if (buf_dblwr) { /* Already inited */ - return(true); } start_again: - mtr_start(&mtr); + mtr.start(); buf_dblwr_being_created = TRUE; doublewrite = buf_dblwr_get(&mtr); @@ -198,33 +197,49 @@ start_again: buf_dblwr_init(doublewrite); - mtr_commit(&mtr); + mtr.commit(); buf_dblwr_being_created = FALSE; return(true); - } + } else { + fil_space_t* space = fil_space_acquire(TRX_SYS_SPACE); + const bool fail = UT_LIST_GET_FIRST(space->chain)->size + < 3 * FSP_EXTENT_SIZE; + fil_space_release(space); - ib::info() << "Doublewrite buffer not found: creating new"; + if (fail) { + goto too_small; + } + } block2 = fseg_create(TRX_SYS_SPACE, TRX_SYS_PAGE_NO, TRX_SYS_DOUBLEWRITE + TRX_SYS_DOUBLEWRITE_FSEG, &mtr); + if (block2 == NULL) { +too_small: + ib::error() + << "Cannot create doublewrite buffer: " + "the first file in innodb_data_file_path" + " must be at least " + << (3 * (FSP_EXTENT_SIZE * UNIV_PAGE_SIZE) >> 20) + << "M."; + mtr.commit(); + return(false); + } + + ib::info() << "Doublewrite buffer not found: creating new"; + + /* FIXME: After this point, the doublewrite buffer creation + is not atomic. The doublewrite buffer should not exist in + the InnoDB system tablespace file in the first place. + It could be located in separate optional file(s) in a + user-specified location. */ + /* fseg_create acquires a second latch on the page, therefore we must declare it: */ buf_block_dbg_add_level(block2, SYNC_NO_ORDER_CHECK); - if (block2 == NULL) { - ib::error() << "Cannot create doublewrite buffer: you must" - " increase your tablespace size." - " Cannot continue operation."; - - /* The mini-transaction did not write anything yet; - we merely failed to allocate a page. */ - mtr.commit(); - return(false); - } - fseg_header = doublewrite + TRX_SYS_DOUBLEWRITE_FSEG; prev_page_no = 0; @@ -338,7 +353,7 @@ recovery, this function loads the pages from double write buffer into memory. @return DB_SUCCESS or error code */ dberr_t buf_dblwr_init_or_load_pages( - os_file_t file, + pfs_os_file_t file, const char* path) { byte* buf; @@ -516,6 +531,10 @@ buf_dblwr_process() byte* unaligned_read_buf; recv_dblwr_t& recv_dblwr = recv_sys->dblwr; + if (!buf_dblwr) { + return; + } + unaligned_read_buf = static_cast( ut_malloc_nokey(2 * UNIV_PAGE_SIZE)); @@ -640,7 +659,7 @@ buf_dblwr_process() if (page_no == 0) { /* Check the FSP_SPACE_FLAGS. */ ulint flags = fsp_header_get_flags(page); - if (!fsp_flags_is_valid(flags) + if (!fsp_flags_is_valid(flags, space_id) && fsp_flags_convert_from_101(flags) == ULINT_UNDEFINED) { ib::warn() << "Ignoring a doublewrite copy" @@ -808,7 +827,7 @@ buf_dblwr_assert_on_corrupt_block( /*==============================*/ const buf_block_t* block) /*!< in: block to check */ { - buf_page_print(block->frame, univ_page_size, BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(block->frame, univ_page_size); ib::fatal() << "Apparent corruption of an index page " << block->page.id diff --git a/storage/innobase/buf/buf0dump.cc b/storage/innobase/buf/buf0dump.cc index ce7488e3d1f..945a1543b72 100644 --- a/storage/innobase/buf/buf0dump.cc +++ b/storage/innobase/buf/buf0dump.cc @@ -44,6 +44,8 @@ Created April 08, 2011 Vasil Dimov #include +#include "mysql/service_wsrep.h" /* wsrep_recovery */ + enum status_severity { STATUS_VERBOSE, STATUS_INFO, @@ -394,7 +396,7 @@ buf_dump( buf_dump_status( STATUS_VERBOSE, "Dumping buffer pool" - " " ULINTPF "/" ULINTPF "," + " " ULINTPF "/%lu," " page " ULINTPF "/" ULINTPF, i + 1, srv_buf_pool_instances, j + 1, n_pages); @@ -595,8 +597,8 @@ buf_load() if (dump == NULL) { fclose(f); buf_load_status(STATUS_ERR, - "Cannot allocate %lu bytes: %s", - (ulint) (dump_n * sizeof(*dump)), + "Cannot allocate " ULINTPF " bytes: %s", + dump_n * sizeof(*dump), strerror(errno)); return; } @@ -807,7 +809,14 @@ DECLARE_THREAD(buf_dump_thread)(void*) buf_load_status(STATUS_VERBOSE, "Loading of buffer pool not started"); if (srv_buffer_pool_load_at_startup) { - buf_load(); + +#ifdef WITH_WSREP + if (!wsrep_recovery) { +#endif /* WITH_WSREP */ + buf_load(); +#ifdef WITH_WSREP + } +#endif /* WITH_WSREP */ } while (!SHUTTING_DOWN()) { @@ -831,8 +840,15 @@ DECLARE_THREAD(buf_dump_thread)(void*) } if (srv_buffer_pool_dump_at_shutdown && srv_fast_shutdown != 2) { +#ifdef WITH_WSREP + if (!wsrep_recovery) { +#endif /* WITH_WSREP */ + buf_dump(FALSE /* ignore shutdown down flag, keep going even if we are in a shutdown state */); +#ifdef WITH_WSREP + } +#endif /* WITH_WSREP */ } srv_buf_dump_thread_active = false; diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index d0c0316bf13..8575de8bfa3 100644 --- a/storage/innobase/buf/buf0flu.cc +++ b/storage/innobase/buf/buf0flu.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2013, 2017, MariaDB Corporation. Copyright (c) 2013, 2014, Fusion-io @@ -70,7 +70,7 @@ is set to TRUE by the page_cleaner thread when it is spawned and is set back to FALSE at shutdown by the page_cleaner as well. Therefore no need to protect it by a mutex. It is only ever read by the thread doing the shutdown */ -bool buf_page_cleaner_is_active = false; +bool buf_page_cleaner_is_active; /** Factor for scan length to determine n_pages for intended oldest LSN progress */ @@ -269,6 +269,7 @@ buf_flush_insert_in_flush_rbt( buf_page_t* prev = NULL; buf_pool_t* buf_pool = buf_pool_from_bpage(bpage); + ut_ad(srv_shutdown_state != SRV_SHUTDOWN_FLUSH_PHASE); ut_ad(buf_flush_list_mutex_own(buf_pool)); /* Insert this buffer into the rbt. */ @@ -480,6 +481,7 @@ buf_flush_insert_sorted_into_flush_list( buf_page_t* prev_b; buf_page_t* b; + ut_ad(srv_shutdown_state != SRV_SHUTDOWN_FLUSH_PHASE); ut_ad(!buf_pool_mutex_own(buf_pool)); ut_ad(log_flush_order_mutex_own()); ut_ad(buf_page_mutex_own(block)); @@ -789,6 +791,7 @@ buf_flush_write_complete( flush_type = buf_page_get_flush_type(bpage); buf_pool->n_flush[flush_type]--; + ut_ad(buf_pool->n_flush[flush_type] != ULINT_MAX); ut_ad(buf_pool_mutex_own(buf_pool)); @@ -914,6 +917,15 @@ buf_flush_init_for_writing( case 1: reset_type = FIL_PAGE_IBUF_BITMAP; break; + case FSP_TRX_SYS_PAGE_NO: + if (block->page.id.page_no() + == TRX_SYS_PAGE_NO + && block->page.id.space() + == TRX_SYS_SPACE) { + reset_type = FIL_PAGE_TYPE_TRX_SYS; + break; + } + /* fall through */ default: switch (page_type) { case FIL_PAGE_INDEX: @@ -1119,15 +1131,20 @@ buf_flush_write_block_low( fil_flush(space); } - /* true means we want to evict this page from the - LRU list as well. */ /* The tablespace could already have been dropped, because fil_io(request, sync) would already have decremented the node->n_pending. However, buf_page_io_complete() only needs to look up the tablespace during read requests, not during writes. */ ut_ad(buf_page_get_io_fix(bpage) == BUF_IO_WRITE); +#ifdef UNIV_DEBUG + dberr_t err = +#endif + /* true means we want to evict this page from the + LRU list as well. */ buf_page_io_complete(bpage, true); + + ut_ad(err == DB_SUCCESS); } fil_space_release_for_io(space); @@ -1209,6 +1226,7 @@ buf_flush_page( } ++buf_pool->n_flush[flush_type]; + ut_ad(buf_pool->n_flush[flush_type] != 0); mutex_exit(block_mutex); @@ -1861,20 +1879,11 @@ buf_flush_batch( counts */ { ut_ad(flush_type == BUF_FLUSH_LRU || flush_type == BUF_FLUSH_LIST); - -#ifdef UNIV_DEBUG - { - dict_sync_check check(true); - - ut_ad(flush_type != BUF_FLUSH_LIST - || !sync_check_iterate(check)); - } -#endif /* UNIV_DEBUG */ + ut_ad(flush_type == BUF_FLUSH_LRU + || !sync_check_iterate(dict_sync_check())); buf_pool_mutex_enter(buf_pool); - ulint count = 0; - /* Note: The buffer pool mutex is released and reacquired within the flush functions. */ switch (flush_type) { @@ -1891,8 +1900,7 @@ buf_flush_batch( buf_pool_mutex_exit(buf_pool); - DBUG_PRINT("ib_buf", ("flush %u completed, %u pages", - unsigned(flush_type), unsigned(count))); + DBUG_LOG("ib_buf", "flush " << flush_type << " completed"); } /******************************************************************//** @@ -2692,6 +2700,11 @@ pc_sleep_if_needed( ulint next_loop_time, int64_t sig_count) { + /* No sleep if we are cleaning the buffer pool during the shutdown + with everything else finished */ + if (srv_shutdown_state == SRV_SHUTDOWN_FLUSH_PHASE) + return OS_SYNC_TIME_EXCEEDED; + ulint cur_time = ut_time_ms(); if (next_loop_time > cur_time) { @@ -3110,21 +3123,13 @@ pools. As of now we'll have only one coordinator. @return a dummy parameter */ extern "C" os_thread_ret_t -DECLARE_THREAD(buf_flush_page_cleaner_coordinator)( -/*===============================================*/ - void* arg MY_ATTRIBUTE((unused))) - /*!< in: a dummy parameter required by - os_thread_create */ +DECLARE_THREAD(buf_flush_page_cleaner_coordinator)(void*) { - ulint next_loop_time = ut_time_ms() + 1000; - ulint n_flushed = 0; - ulint last_activity = srv_get_activity_count(); - ulint last_pages = 0; - my_thread_init(); #ifdef UNIV_PFS_THREAD pfs_register_thread(page_cleaner_thread_key); #endif /* UNIV_PFS_THREAD */ + ut_ad(!srv_read_only_mode); #ifdef UNIV_DEBUG_THREAD_CREATION ib::info() << "page_cleaner thread running, id " @@ -3143,21 +3148,18 @@ DECLARE_THREAD(buf_flush_page_cleaner_coordinator)( " page cleaner thread priority can be changed." " See the man page of setpriority()."; } + /* Signal that setpriority() has been attempted. */ + os_event_set(recv_sys->flush_end); #endif /* UNIV_LINUX */ - buf_page_cleaner_is_active = true; - - while (!srv_read_only_mode - && srv_shutdown_state == SRV_SHUTDOWN_NONE - && recv_sys->heap != NULL) { + do { /* treat flushing requests during recovery. */ ulint n_flushed_lru = 0; ulint n_flushed_list = 0; os_event_wait(recv_sys->flush_start); - if (srv_shutdown_state != SRV_SHUTDOWN_NONE - || recv_sys->heap == NULL) { + if (!recv_writer_thread_active) { break; } @@ -3184,16 +3186,20 @@ DECLARE_THREAD(buf_flush_page_cleaner_coordinator)( os_event_reset(recv_sys->flush_start); os_event_set(recv_sys->flush_end); - } + } while (recv_writer_thread_active); os_event_wait(buf_flush_event); - ulint ret_sleep = 0; - ulint n_evicted = 0; - ulint n_flushed_last = 0; - ulint warn_interval = 1; - ulint warn_count = 0; - int64_t sig_count = os_event_reset(buf_flush_event); + ulint ret_sleep = 0; + ulint n_evicted = 0; + ulint n_flushed_last = 0; + ulint warn_interval = 1; + ulint warn_count = 0; + int64_t sig_count = os_event_reset(buf_flush_event); + ulint next_loop_time = ut_time_ms() + 1000; + ulint n_flushed = 0; + ulint last_activity = srv_get_activity_count(); + ulint last_pages = 0; while (srv_shutdown_state == SRV_SHUTDOWN_NONE) { @@ -3474,7 +3480,6 @@ thread_exit: buf_page_cleaner_is_active = false; my_thread_end(); - /* We count the number of threads in os_thread_exit(). A created thread should always use that to exit and not use return() to exit. */ os_thread_exit(); diff --git a/storage/innobase/buf/buf0lru.cc b/storage/innobase/buf/buf0lru.cc index 10a8561d38d..2137760e815 100644 --- a/storage/innobase/buf/buf0lru.cc +++ b/storage/innobase/buf/buf0lru.cc @@ -1420,7 +1420,7 @@ loop: ++flush_failures; } - srv_stats.buf_pool_wait_free.add(n_iterations, 1); + srv_stats.buf_pool_wait_free.inc(); n_iterations++; @@ -2697,14 +2697,13 @@ buf_LRU_print_instance( const byte* frame; case BUF_BLOCK_FILE_PAGE: frame = buf_block_get_frame((buf_block_t*) bpage); - fprintf(stderr, "\ntype " ULINTPF - " index id " IB_ID_FMT "\n", + fprintf(stderr, "\ntype %u index id " IB_ID_FMT "\n", fil_page_get_type(frame), btr_page_get_index_id(frame)); break; case BUF_BLOCK_ZIP_PAGE: frame = bpage->zip.data; - fprintf(stderr, "\ntype " ULINTPF " size " ULINTPF + fprintf(stderr, "\ntype %u size " ULINTPF " index id " IB_ID_FMT "\n", fil_page_get_type(frame), bpage->size.physical(), diff --git a/storage/innobase/buf/buf0rea.cc b/storage/innobase/buf/buf0rea.cc index f5bd088ce5c..3c2b697b0f4 100644 --- a/storage/innobase/buf/buf0rea.cc +++ b/storage/innobase/buf/buf0rea.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2015, 2016 MariaDB Corporation. +Copyright (c) 2015, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -105,6 +105,7 @@ flag is cleared and the x-lock released by an i/o-handler thread. @param[in] mode BUF_READ_IBUF_PAGES_ONLY, ..., @param[in] page_id page id @param[in] unzip true=request uncompressed page +@param[in] ignore_missing_space true=ignore missing space when reading @return 1 if a read request was queued, 0 if the page already resided in buf_pool, or if the page is in the doublewrite buffer blocks in which case it is never read into the pool, or if the tablespace does @@ -119,7 +120,7 @@ buf_read_page_low( const page_id_t& page_id, const page_size_t& page_size, bool unzip, - buf_page_t** rbpage) /*!< out: page */ + bool ignore_missing_space = false) { buf_page_t* bpage; @@ -155,12 +156,9 @@ buf_read_page_low( return(0); } - DBUG_PRINT("ib_buf", ("read page %u:%u size=%u unzip=%u,%s", - (unsigned) page_id.space(), - (unsigned) page_id.page_no(), - (unsigned) page_size.physical(), - (unsigned) unzip, - sync ? "sync" : "async")); + DBUG_LOG("ib_buf", + "read page " << page_id << " size=" << page_size.physical() + << " unzip=" << unzip << ',' << (sync ? "sync" : "async")); ut_ad(buf_page_in_file(bpage)); @@ -182,7 +180,7 @@ buf_read_page_low( *err = fil_io( request, sync, page_id, page_size, 0, page_size.physical(), - dst, bpage); + dst, bpage, ignore_missing_space); if (sync) { thd_wait_end(NULL); @@ -213,19 +211,13 @@ buf_read_page_low( if (sync) { /* The i/o is already completed when we arrive from fil_read */ + *err = buf_page_io_complete(bpage); - if (!buf_page_io_complete(bpage)) { - if (rbpage) { - *rbpage = bpage; - } + if (*err != DB_SUCCESS) { return(0); } } - if (rbpage) { - *rbpage = bpage; - } - return(1); } @@ -256,7 +248,7 @@ buf_read_ahead_random( ulint ibuf_mode; ulint count; ulint low, high; - dberr_t err; + dberr_t err = DB_SUCCESS; ulint i; const ulint buf_read_ahead_random_area = BUF_READ_AHEAD_AREA(buf_pool); @@ -369,19 +361,25 @@ read_ahead: const page_id_t cur_page_id(page_id.space(), i); if (!ibuf_bitmap_page(cur_page_id, page_size)) { - buf_page_t* rpage = NULL; count += buf_read_page_low( &err, false, IORequest::DO_NOT_WAKE, ibuf_mode, - cur_page_id, page_size, false, &rpage); + cur_page_id, page_size, false); - if (err == DB_TABLESPACE_DELETED) { - ib::warn() << "Random readahead trying to" + switch (err) { + case DB_SUCCESS: + case DB_TABLESPACE_TRUNCATED: + case DB_ERROR: + break; + case DB_TABLESPACE_DELETED: + ib::info() << "Random readahead trying to" " access page " << cur_page_id << " in nonexisting or" " being-dropped tablespace"; break; + default: + ut_error; } } } @@ -414,15 +412,18 @@ an exclusive lock on the buffer frame. The flag is cleared and the x-lock released by the i/o-handler thread. @param[in] page_id page id @param[in] page_size page size -@return TRUE if page has been read in, FALSE in case of failure */ -ibool +@retval DB_SUCCESS if the page was read and is not corrupted, +@retval DB_PAGE_CORRUPTED if page based on checksum check is corrupted, +@retval DB_DECRYPTION_FAILED if page post encryption checksum matches but +after decryption normal page checksum does not match. +@retval DB_TABLESPACE_DELETED if tablespace .ibd file is missing */ +dberr_t buf_read_page( const page_id_t& page_id, - const page_size_t& page_size, - buf_page_t** bpage) /*!< out: page */ + const page_size_t& page_size) { ulint count; - dberr_t err; + dberr_t err = DB_SUCCESS; /* We do synchronous IO because our AIO completion code is sub-optimal. See buf_page_io_complete(), we have to @@ -432,19 +433,19 @@ buf_read_page( count = buf_read_page_low( &err, true, - 0, BUF_READ_ANY_PAGE, page_id, page_size, false, bpage); + 0, BUF_READ_ANY_PAGE, page_id, page_size, false); srv_stats.buf_pool_reads.add(count); if (err == DB_TABLESPACE_DELETED) { - ib::error() << "trying to read page " << page_id + ib::info() << "trying to read page " << page_id << " in nonexisting or being-dropped tablespace"; } /* Increment number of I/O operations used for LRU policy. */ buf_LRU_stat_inc_io(); - return(count > 0); + return(err); } /** High-level function which reads a page asynchronously from a file to the @@ -453,9 +454,8 @@ an exclusive lock on the buffer frame. The flag is cleared and the x-lock released by the i/o-handler thread. @param[in] page_id page id @param[in] page_size page size -@param[in] sync true if synchronous aio is desired -@return TRUE if page has been read in, FALSE in case of failure */ -ibool +@param[in] sync true if synchronous aio is desired */ +void buf_read_page_background( const page_id_t& page_id, const page_size_t& page_size, @@ -463,13 +463,33 @@ buf_read_page_background( { ulint count; dberr_t err; - buf_page_t* rbpage = NULL; count = buf_read_page_low( &err, sync, IORequest::DO_NOT_WAKE | IORequest::IGNORE_MISSING, BUF_READ_ANY_PAGE, - page_id, page_size, false, &rbpage); + page_id, page_size, false); + + switch (err) { + case DB_SUCCESS: + case DB_TABLESPACE_TRUNCATED: + case DB_ERROR: + break; + case DB_TABLESPACE_DELETED: + ib::info() << "trying to read page " << page_id + << " in the background" + " in a non-existing or being-dropped tablespace"; + break; + case DB_PAGE_CORRUPTED: + case DB_DECRYPTION_FAILED: + ib::error() + << "Background Page read failed to " + "read or decrypt " << page_id; + break; + default: + ib::fatal() << "Error " << err << " in background read of " + << page_id; + } srv_stats.buf_pool_reads.add(count); @@ -479,8 +499,6 @@ buf_read_page_background( buffer pool. Since this function is called from buffer pool load these IOs are deliberate and are not part of normal workload we can ignore these in our heuristics. */ - - return(count > 0); } /** Applies linear read-ahead if in the buf_pool the page is a border page of @@ -525,7 +543,7 @@ buf_read_ahead_linear( ulint new_offset; ulint fail_count; ulint low, high; - dberr_t err; + dberr_t err = DB_SUCCESS; ulint i; const ulint buf_read_ahead_linear_area = BUF_READ_AHEAD_AREA(buf_pool); @@ -730,19 +748,25 @@ buf_read_ahead_linear( const page_id_t cur_page_id(page_id.space(), i); if (!ibuf_bitmap_page(cur_page_id, page_size)) { - buf_page_t* rpage = NULL; - count += buf_read_page_low( &err, false, IORequest::DO_NOT_WAKE, - ibuf_mode, cur_page_id, page_size, false, &rpage); + ibuf_mode, cur_page_id, page_size, false); - if (err == DB_TABLESPACE_DELETED) { - ib::warn() << "linear readahead trying to" - " access page " - << page_id_t(page_id.space(), i) - << " in nonexisting or being-dropped" - " tablespace"; + switch (err) { + case DB_SUCCESS: + case DB_TABLESPACE_TRUNCATED: + case DB_TABLESPACE_DELETED: + case DB_ERROR: + break; + case DB_PAGE_CORRUPTED: + case DB_DECRYPTION_FAILED: + ib::error() << "linear readahead failed to" + " read or decrypt " + << page_id_t(page_id.space(), i); + break; + default: + ut_error; } } } @@ -754,11 +778,11 @@ buf_read_ahead_linear( os_aio_simulated_wake_handler_threads(); if (count) { - DBUG_PRINT("ib_buf", ("linear read-ahead %lu pages, " - "%lu:%lu", + DBUG_PRINT("ib_buf", ("linear read-ahead " ULINTPF " pages, " + "%u:%u", count, - (ulint)page_id.space(), - (ulint)page_id.page_no())); + page_id.space(), + page_id.page_no())); } /* Read ahead is considered one I/O operation for the purpose of @@ -794,23 +818,26 @@ buf_read_ibuf_merge_pages( #endif for (ulint i = 0; i < n_stored; i++) { - const page_id_t page_id(space_ids[i], page_nos[i]); - - buf_pool_t* buf_pool = buf_pool_get(page_id); - buf_page_t* rpage = NULL; - bool found; const page_size_t page_size(fil_space_get_page_size( space_ids[i], &found)); if (!found) { - /* The tablespace was not found, remove the - entries for that page */ - ibuf_merge_or_delete_for_page(NULL, page_id, - NULL, FALSE); +tablespace_deleted: + /* The tablespace was not found: remove all + entries for it */ + ibuf_delete_for_discarded_space(space_ids[i]); + while (i + 1 < n_stored + && space_ids[i + 1] == space_ids[i]) { + i++; + } continue; } + const page_id_t page_id(space_ids[i], page_nos[i]); + + buf_pool_t* buf_pool = buf_pool_get(page_id); + while (buf_pool->n_pend_reads > buf_pool->curr_size / BUF_READ_AHEAD_PEND_LIMIT) { os_thread_sleep(500000); @@ -822,13 +849,22 @@ buf_read_ibuf_merge_pages( sync && (i + 1 == n_stored), 0, BUF_READ_ANY_PAGE, page_id, page_size, - true, &rpage); + true, true /* ignore_missing_space */); - if (err == DB_TABLESPACE_DELETED) { - /* We have deleted or are deleting the single-table - tablespace: remove the entries for that page */ - ibuf_merge_or_delete_for_page(NULL, page_id, - &page_size, FALSE); + switch(err) { + case DB_SUCCESS: + case DB_TABLESPACE_TRUNCATED: + case DB_ERROR: + break; + case DB_TABLESPACE_DELETED: + goto tablespace_deleted; + case DB_PAGE_CORRUPTED: + case DB_DECRYPTION_FAILED: + ib::error() << "Failed to read or decrypt " << page_id + << " for change buffer merge"; + break; + default: + ut_error; } } @@ -855,9 +891,6 @@ buf_read_recv_pages( const ulint* page_nos, ulint n_stored) { - ulint count; - dberr_t err; - ulint i; fil_space_t* space = fil_space_get(space_id); if (space == NULL) { @@ -869,12 +902,11 @@ buf_read_recv_pages( const page_size_t page_size(space->flags); - for (i = 0; i < n_stored; i++) { + for (ulint i = 0; i < n_stored; i++) { buf_pool_t* buf_pool; const page_id_t cur_page_id(space_id, page_nos[i]); - buf_page_t* rpage = NULL; - count = 0; + ulint count = 0; buf_pool = buf_pool_get(cur_page_id); while (buf_pool->n_pend_reads >= recv_n_pool_free_frames / 2) { @@ -894,18 +926,25 @@ buf_read_recv_pages( } } - if ((i + 1 == n_stored) && sync) { + dberr_t err; + + if (sync && i + 1 == n_stored) { buf_read_page_low( &err, true, 0, BUF_READ_ANY_PAGE, - cur_page_id, page_size, true, &rpage); + cur_page_id, page_size, true); } else { buf_read_page_low( &err, false, IORequest::DO_NOT_WAKE, BUF_READ_ANY_PAGE, - cur_page_id, page_size, true, &rpage); + cur_page_id, page_size, true); + } + + if (err == DB_DECRYPTION_FAILED || err == DB_PAGE_CORRUPTED) { + ib::error() << "Recovery failed to read or decrypt " + << cur_page_id; } } diff --git a/storage/innobase/data/data0type.cc b/storage/innobase/data/data0type.cc index 315b12e135c..d4b809c3f59 100644 --- a/storage/innobase/data/data0type.cc +++ b/storage/innobase/data/data0type.cc @@ -193,13 +193,6 @@ dtype_print(const dtype_t* type) fputs("DATA_BLOB", stderr); break; - case DATA_POINT: - fputs("DATA_POINT", stderr); - break; - - case DATA_VAR_POINT: - fputs("DATA_VAR_POINT", stderr); - case DATA_GEOMETRY: fputs("DATA_GEOMETRY", stderr); break; diff --git a/storage/innobase/dict/dict0boot.cc b/storage/innobase/dict/dict0boot.cc index 3ae6639cd73..a4f0e6b669d 100644 --- a/storage/innobase/dict/dict0boot.cc +++ b/storage/innobase/dict/dict0boot.cc @@ -342,8 +342,7 @@ dict_boot(void) dict_mem_table_add_col(table, heap, "TYPE", DATA_INT, 0, 4); dict_mem_table_add_col(table, heap, "MIX_ID", DATA_BINARY, 0, 0); /* MIX_LEN may contain additional table flags when - ROW_FORMAT!=REDUNDANT. Currently, these flags include - DICT_TF2_TEMPORARY. */ + ROW_FORMAT!=REDUNDANT. */ dict_mem_table_add_col(table, heap, "MIX_LEN", DATA_INT, 0, 4); dict_mem_table_add_col(table, heap, "CLUSTER_NAME", DATA_BINARY, 0, 0); dict_mem_table_add_col(table, heap, "SPACE", DATA_INT, 0, 4); diff --git a/storage/innobase/dict/dict0crea.cc b/storage/innobase/dict/dict0crea.cc index c1bd5c2d368..1c28a39a62e 100644 --- a/storage/innobase/dict/dict0crea.cc +++ b/storage/innobase/dict/dict0crea.cc @@ -104,6 +104,7 @@ dict_create_sys_tables_tuple( | ((table->flags & DICT_TF_COMPACT) << 31)); dfield_set_data(dfield, ptr, 4); + /* 5: TYPE (table flags) -----------------------------*/ dfield = dtuple_get_nth_field( entry, DICT_COL__SYS_TABLES__TYPE); @@ -460,14 +461,9 @@ dict_build_tablespace_for_table( mtr_start(&mtr); mtr.set_named_space(table->space); - bool ret = fsp_header_init(table->space, - FIL_IBD_FILE_INITIAL_SIZE, - &mtr); + fsp_header_init(table->space, FIL_IBD_FILE_INITIAL_SIZE, &mtr); mtr_commit(&mtr); - if (!ret) { - return(DB_ERROR); - } } else { ut_ad(dict_tf_get_rec_format(table->flags) != REC_FORMAT_COMPRESSED); @@ -890,7 +886,7 @@ dict_create_index_tree_step( mtr_start(&mtr); - const bool missing = index->table->ibd_file_missing + const bool missing = !index->is_readable() || dict_table_is_discarded(index->table); if (!missing) { @@ -963,8 +959,8 @@ dict_create_index_tree_in_mem( /* Currently this function is being used by temp-tables only. Import/Discard of temp-table is blocked and so this assert. */ - ut_ad(index->table->ibd_file_missing == 0 - && !dict_table_is_discarded(index->table)); + ut_ad(index->is_readable()); + ut_ad(!dict_table_is_discarded(index->table)); page_no = btr_create( index->type, index->space, @@ -1246,7 +1242,7 @@ tab_create_graph_create( structure */ mem_heap_t* heap, /*!< in: heap where created */ fil_encryption_t mode, /*!< in: encryption mode */ - ulint key_id) /*!< in: encryption key_id */ + uint32_t key_id) /*!< in: encryption key_id */ { tab_node_t* node; @@ -2054,7 +2050,7 @@ dict_foreign_def_get_fields( trx_t* trx, /*!< in: trx */ char** field, /*!< out: foreign column */ char** field2, /*!< out: referenced column */ - int col_no) /*!< in: column number */ + ulint col_no) /*!< in: column number */ { char* bufend; char* fieldbuf = (char *)mem_heap_alloc(foreign->heap, MAX_TABLE_NAME_LEN+1); @@ -2511,6 +2507,7 @@ dict_create_or_check_sys_tablespace(void) << ". Dropping incompletely created tables."; ut_a(err == DB_OUT_OF_FILE_SPACE + || err == DB_DUPLICATE_KEY || err == DB_TOO_MANY_CONCURRENT_TRXS); row_drop_table_for_mysql("SYS_TABLESPACES", trx, TRUE, TRUE); @@ -2538,11 +2535,11 @@ dict_create_or_check_sys_tablespace(void) sys_tablespaces_err = dict_check_if_system_table_exists( "SYS_TABLESPACES", DICT_NUM_FIELDS__SYS_TABLESPACES + 1, 1); - ut_a(sys_tablespaces_err == DB_SUCCESS); + ut_a(sys_tablespaces_err == DB_SUCCESS || err != DB_SUCCESS); sys_datafiles_err = dict_check_if_system_table_exists( "SYS_DATAFILES", DICT_NUM_FIELDS__SYS_DATAFILES + 1, 1); - ut_a(sys_datafiles_err == DB_SUCCESS); + ut_a(sys_datafiles_err == DB_SUCCESS || err != DB_SUCCESS); return(err); } diff --git a/storage/innobase/dict/dict0defrag_bg.cc b/storage/innobase/dict/dict0defrag_bg.cc index 016b774217f..ccb73e02f43 100644 --- a/storage/innobase/dict/dict0defrag_bg.cc +++ b/storage/innobase/dict/dict0defrag_bg.cc @@ -320,25 +320,14 @@ dict_stats_save_defrag_stats( { dberr_t ret; - if (index->table->ibd_file_missing) { - ut_print_timestamp(stderr); - fprintf(stderr, - " InnoDB: Cannot save defragment stats because " - ".ibd file is missing.\n"); - return (DB_TABLESPACE_DELETED); - } - if (dict_index_is_corrupted(index)) { - ut_print_timestamp(stderr); - fprintf(stderr, - " InnoDB: Cannot save defragment stats because " - "index is corrupted.\n"); - return(DB_CORRUPTION); - } - if (dict_index_is_univ(index)) { return DB_SUCCESS; } + if (!index->is_readable()) { + return dict_stats_report_error(index->table, true); + } + lint now = (lint) ut_time(); mtr_t mtr; ulint n_leaf_pages; diff --git a/storage/innobase/dict/dict0dict.cc b/storage/innobase/dict/dict0dict.cc index c6420129164..146f3a15151 100644 --- a/storage/innobase/dict/dict0dict.cc +++ b/storage/innobase/dict/dict0dict.cc @@ -1178,12 +1178,24 @@ dict_table_open_on_name( if (table != NULL) { - /* If table is encrypted return table */ + /* If table is encrypted or corrupted */ if (ignore_err == DICT_ERR_IGNORE_NONE - && table->is_encrypted) { + && !table->is_readable()) { /* Make life easy for drop table. */ dict_table_prevent_eviction(table); + if (table->corrupted) { + + ib::error() << "Table " << table->name + << " is corrupted. Please " + "drop the table and recreate."; + if (!dict_locked) { + mutex_exit(&dict_sys->mutex); + } + + DBUG_RETURN(NULL); + } + if (table->can_be_evicted) { dict_move_to_mru(table); } @@ -1196,22 +1208,6 @@ dict_table_open_on_name( DBUG_RETURN(table); } - /* If table is corrupted, return NULL */ - else if (ignore_err == DICT_ERR_IGNORE_NONE - && table->corrupted) { - /* Make life easy for drop table. */ - dict_table_prevent_eviction(table); - if (!dict_locked) { - mutex_exit(&dict_sys->mutex); - } - - ib::info() << "Table " - << table->name - << " is corrupted. Please drop the table" - " and recreate it"; - - DBUG_RETURN(NULL); - } if (table->can_be_evicted) { dict_move_to_mru(table); @@ -1379,9 +1375,6 @@ dict_table_add_to_cache( } ut_ad(dict_lru_validate()); - - dict_sys->size += mem_heap_get_size(table->heap) - + strlen(table->name.m_name) + 1; } /**********************************************************************//** @@ -1760,9 +1753,6 @@ dict_table_rename_in_cache( HASH_INSERT(dict_table_t, name_hash, dict_sys->table_hash, fold, table); - dict_sys->size += strlen(new_name) - strlen(old_name); - ut_a(dict_sys->size > 0); - /* Update the table_name field in indexes */ for (index = dict_table_get_first_index(table); index != NULL; @@ -2053,7 +2043,6 @@ dict_table_remove_from_cache_low( { dict_foreign_t* foreign; dict_index_t* index; - lint size; ut_ad(table); ut_ad(dict_lru_validate()); @@ -2134,12 +2123,6 @@ dict_table_remove_from_cache_low( UT_DELETE(table->vc_templ); } - size = mem_heap_get_size(table->heap) + strlen(table->name.m_name) + 1; - - ut_ad(dict_sys->size >= size); - - dict_sys->size -= size; - dict_mem_table_free(table); } @@ -2334,9 +2317,10 @@ dict_index_too_big_for_tree( page(16k for 64k page size). No additional sparse page directory entry will be generated for the first few user records. */ - page_rec_max = srv_page_size == UNIV_PAGE_SIZE_MAX - ? REC_MAX_DATA_SIZE - 1 - : page_get_free_space_of_empty(comp) / 2; + page_rec_max = (comp || srv_page_size < UNIV_PAGE_SIZE_MAX) + ? page_get_free_space_of_empty(comp) / 2 + : REDUNDANT_REC_MAX_DATA_SIZE; + page_ptr_max = page_rec_max; /* Each record has a header. */ rec_max_size = comp @@ -2613,8 +2597,6 @@ dict_index_add_to_cache_w_vcol( rw_lock_create(index_tree_rw_lock_key, &new_index->lock, SYNC_INDEX_TREE); - dict_sys->size += mem_heap_get_size(new_index->heap); - dict_mem_index_free(index); return(DB_SUCCESS); @@ -2631,8 +2613,6 @@ dict_index_remove_from_cache_low( ibool lru_evict) /*!< in: TRUE if index being evicted to make room in the table LRU list */ { - lint size; - ut_ad(table && index); ut_ad(table->magic_n == DICT_TABLE_MAGIC_N); ut_ad(index->magic_n == DICT_INDEX_MAGIC_N); @@ -2733,12 +2713,6 @@ dict_index_remove_from_cache_low( } } - size = mem_heap_get_size(index->heap); - - ut_ad(dict_sys->size >= size); - - dict_sys->size -= size; - dict_mem_index_free(index); } @@ -2895,22 +2869,9 @@ dict_index_add_col( field = dict_index_get_nth_field(index, index->n_def - 1); field->col = col; - /* DATA_POINT is a special type, whose fixed_len should be: - 1) DATA_MBR_LEN, when it's indexed in R-TREE. In this case, - it must be the first col to be added. - 2) DATA_POINT_LEN(be equal to fixed size of column), when it's - indexed in B-TREE, - 3) DATA_POINT_LEN, if a POINT col is the PRIMARY KEY, and we are - adding the PK col to other B-TREE/R-TREE. */ - /* TODO: We suppose the dimension is 2 now. */ - if (dict_index_is_spatial(index) && DATA_POINT_MTYPE(col->mtype) - && index->n_def == 1) { - field->fixed_len = DATA_MBR_LEN; - } else { - field->fixed_len = static_cast( - dict_col_get_fixed_size( - col, dict_table_is_comp(table))); - } + field->fixed_len = static_cast( + dict_col_get_fixed_size( + col, dict_table_is_comp(table))); if (prefix_len && field->fixed_len > prefix_len) { field->fixed_len = (unsigned int) prefix_len; @@ -4370,7 +4331,7 @@ dict_table_get_highest_foreign_id( } DBUG_PRINT("dict_table_get_highest_foreign_id", - ("id: %lu", biggest_id)); + ("id: " ULINTPF, biggest_id)); DBUG_RETURN(biggest_id); } @@ -4639,7 +4600,6 @@ dict_create_foreign_constraints_low( if (!success) { ib::error() << "Could not find the table " << create_name << " being" << operation << " near to " << orig; - mutex_exit(&dict_foreign_err_mutex); ib_push_warning(trx, DB_ERROR, "%s table %s with foreign key constraint" @@ -5317,6 +5277,7 @@ try_find_index: " failed. You have more than one on delete or on update clause" " in '%s' near '%s'.\n", operation, create_name, start_of_latest_foreign, start_of_latest_set); + mutex_exit(&dict_foreign_err_mutex); ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, "%s table %s with foreign key constraint" @@ -5325,7 +5286,6 @@ try_find_index: operation, create_name, start_of_latest_foreign, start_of_latest_set); dict_foreign_free(foreign); - mutex_exit(&dict_foreign_err_mutex); return(DB_CANNOT_ADD_CONSTRAINT); } @@ -6067,11 +6027,29 @@ dict_set_corrupted_by_space( /* mark the table->corrupted bit only, since the caller could be too deep in the stack for SYS_INDEXES update */ - table->corrupted = TRUE; + table->corrupted = true; + table->file_unreadable = true; return(TRUE); } + +/** Flag a table with specified space_id encrypted in the data dictionary +cache +@param[in] space_id Tablespace id */ +UNIV_INTERN +void +dict_set_encrypted_by_space(ulint space_id) +{ + dict_table_t* table; + + table = dict_find_single_table_by_space(space_id); + + if (table) { + table->file_unreadable = true; + } +} + /**********************************************************************//** Flags an index corrupted both in the data dictionary cache and in the SYS_INDEXES */ @@ -6099,14 +6077,7 @@ dict_set_corrupted( ut_ad(mutex_own(&dict_sys->mutex)); ut_ad(!dict_table_is_comp(dict_sys->sys_tables)); ut_ad(!dict_table_is_comp(dict_sys->sys_indexes)); - -#ifdef UNIV_DEBUG - { - dict_sync_check check(true); - - ut_ad(!sync_check_iterate(check)); - } -#endif /* UNIV_DEBUG */ + ut_ad(!sync_check_iterate(dict_sync_check())); /* Mark the table as corrupted only if the clustered index is corrupted */ @@ -6581,7 +6552,8 @@ dict_table_schema_check( } } - if (table->ibd_file_missing) { + if (!table->is_readable() && + fil_space_get(table->space) == NULL) { /* missing tablespace */ ut_snprintf(errstr, errstr_sz, @@ -6596,7 +6568,8 @@ dict_table_schema_check( if ((ulint) table->n_def - n_sys_cols != req_schema->n_cols) { /* the table has a different number of columns than required */ ut_snprintf(errstr, errstr_sz, - "%s has %lu columns but should have " ULINTPF ".", + "%s has " ULINTPF " columns but should have " + ULINTPF ".", ut_format_name(req_schema->table_name, buf, sizeof(buf)), table->n_def - n_sys_cols, @@ -6745,7 +6718,7 @@ dict_fs2utf8( db[db_len] = '\0'; strconvert( - &my_charset_filename, db, db_len, system_charset_info, + &my_charset_filename, db, uint(db_len), system_charset_info, db_utf8, uint(db_utf8_size), &errors); /* convert each # to @0023 in table name and store the result in buf */ @@ -6875,8 +6848,6 @@ dict_close(void) mutex_free(&dict_foreign_err_mutex); - ut_ad(dict_sys->size == 0); - ut_free(dict_sys); dict_sys = NULL; @@ -7249,6 +7220,41 @@ dict_tf_to_row_format_string( return(0); } +/** Calculate the used memory occupied by the data dictionary +table and index objects. +@return number of bytes occupied. */ +UNIV_INTERN +ulint +dict_sys_get_size() +{ + ulint size = 0; + + ut_ad(dict_sys); + + mutex_enter(&dict_sys->mutex); + + for(ulint i = 0; i < hash_get_n_cells(dict_sys->table_hash); i++) { + dict_table_t* table; + + for (table = static_cast(HASH_GET_FIRST(dict_sys->table_hash,i)); + table != NULL; + table = static_cast(HASH_GET_NEXT(name_hash, table))) { + dict_index_t* index; + size += mem_heap_get_size(table->heap) + strlen(table->name.m_name) +1; + + for(index = dict_table_get_first_index(table); + index != NULL; + index = dict_table_get_next_index(index)) { + size += mem_heap_get_size(index->heap); + } + } + } + + mutex_exit(&dict_sys->mutex); + + return (size); +} + /** Look for any dictionary objects that are found in the given tablespace. @param[in] space_id Tablespace ID to search for. @return true if tablespace is empty. */ diff --git a/storage/innobase/dict/dict0load.cc b/storage/innobase/dict/dict0load.cc index da72126793f..c8b5f2d7c90 100644 --- a/storage/innobase/dict/dict0load.cc +++ b/storage/innobase/dict/dict0load.cc @@ -80,7 +80,7 @@ key constraints are loaded into memory. constraints are loaded. @return table, NULL if does not exist; if the table is stored in an .ibd file, but the file does not exist, then we set the -ibd_file_missing flag TRUE in the table object we return */ +file_unreadable flag in the table object we return */ static dict_table_t* dict_load_table_one( @@ -185,17 +185,6 @@ dict_load_field_low( for temporary storage */ const rec_t* rec); /*!< in: SYS_FIELDS record */ -/** Load a table definition from a SYS_TABLES record to dict_table_t. -Do not load any columns or indexes. -@param[in] name Table name -@param[in] rec SYS_TABLES record -@param[out,own] table table, or NULL -@return error message -@retval NULL on success */ -static -const char* -dict_load_table_low(table_name_t& name, const rec_t* rec, dict_table_t** table); - /* If this flag is TRUE, then we will load the cluster index's (and tables') metadata even if it is marked as "corrupted". */ my_bool srv_load_corrupted; @@ -1140,6 +1129,71 @@ dict_sys_tablespaces_rec_read( return(true); } +/** Check if SYS_TABLES.TYPE is valid +@param[in] type SYS_TABLES.TYPE +@param[in] not_redundant whether ROW_FORMAT=REDUNDANT is not used +@return whether the SYS_TABLES.TYPE value is valid */ +static +bool +dict_sys_tables_type_valid(ulint type, bool not_redundant) +{ + /* The DATA_DIRECTORY flag can be assigned fully independently + of all other persistent table flags. */ + type &= ~DICT_TF_MASK_DATA_DIR; + + if (type == 1) { + return(true); /* ROW_FORMAT=REDUNDANT or ROW_FORMAT=COMPACT */ + } + + if (!(type & 1)) { + /* For ROW_FORMAT=REDUNDANT and ROW_FORMAT=COMPACT, + SYS_TABLES.TYPE=1. Else, it is the same as + dict_table_t::flags, and the least significant bit + would be set. So, the bit never can be 0. */ + return(false); + } + + if (!not_redundant) { + /* SYS_TABLES.TYPE must be 1 for ROW_FORMAT=REDUNDANT. */ + return(false); + } + + if (type >= 1U << DICT_TF_POS_UNUSED) { + /* Some unknown bits are set. */ + return(false); + } + + /* ATOMIC_WRITES cannot be 3; it is the 10.3 NO_ROLLBACK flag. */ + if (!(~type & DICT_TF_MASK_ATOMIC_WRITES)) { + return(false); + } + + return(dict_tf_is_valid_not_redundant(type)); +} + +/** Convert SYS_TABLES.TYPE to dict_table_t::flags. +@param[in] type SYS_TABLES.TYPE +@param[in] not_redundant whether ROW_FORMAT=REDUNDANT is not used +@return table flags */ +static +ulint +dict_sys_tables_type_to_tf(ulint type, bool not_redundant) +{ + ut_ad(dict_sys_tables_type_valid(type, not_redundant)); + ulint flags = not_redundant ? 1 : 0; + + /* ZIP_SSIZE, ATOMIC_BLOBS, DATA_DIR, PAGE_COMPRESSION, + PAGE_COMPRESSION_LEVEL are the same. */ + flags |= type & (DICT_TF_MASK_ZIP_SSIZE + | DICT_TF_MASK_ATOMIC_BLOBS + | DICT_TF_MASK_DATA_DIR + | DICT_TF_MASK_PAGE_COMPRESSION + | DICT_TF_MASK_PAGE_COMPRESSION_LEVEL); + + ut_ad(dict_tf_is_valid(flags)); + return(flags); +} + /** Read and return 5 integer fields from a SYS_TABLES record. @param[in] rec A record of SYS_TABLES @param[in] name Table Name, the same as SYS_TABLES.NAME @@ -1149,6 +1203,7 @@ dict_sys_tablespaces_rec_read( @param[out] flags Pointer to table flags @param[out] flags2 Pointer to table flags2 @return true if the record was read correctly, false if not. */ +MY_ATTRIBUTE((warn_unused_result)) static bool dict_sys_tables_rec_read( @@ -1164,8 +1219,6 @@ dict_sys_tables_rec_read( ulint len; ulint type; - *flags2 = 0; - field = rec_get_nth_field_old( rec, DICT_FLD__SYS_TABLES__ID, &len); ut_ad(len == 8); @@ -1182,6 +1235,78 @@ dict_sys_tables_rec_read( ut_a(len == 4); type = mach_read_from_4(field); + /* Handle MDEV-12873 InnoDB SYS_TABLES.TYPE incompatibility + for PAGE_COMPRESSED=YES in MariaDB 10.2.2 to 10.2.6. + + MariaDB 10.2.2 introduced the SHARED_SPACE flag from MySQL 5.7, + shifting the flags PAGE_COMPRESSION, PAGE_COMPRESSION_LEVEL, + ATOMIC_WRITES by one bit. The SHARED_SPACE flag would always + be written as 0 by MariaDB, because MariaDB does not support + CREATE TABLESPACE or CREATE TABLE...TABLESPACE for InnoDB. + + So, instead of the bits AALLLLCxxxxxxx we would have + AALLLLC0xxxxxxx if the table was created with MariaDB 10.2.2 + to 10.2.6. (AA=ATOMIC_WRITES, LLLL=PAGE_COMPRESSION_LEVEL, + C=PAGE_COMPRESSED, xxxxxxx=7 bits that were not moved.) + + The case LLLLC=00000 is not a problem. The problem is the case + AALLLL10DB00001 where D is the (mostly ignored) DATA_DIRECTORY + flag and B is the ATOMIC_BLOBS flag (1 for ROW_FORMAT=DYNAMIC + and 0 for ROW_FORMAT=COMPACT in this case). Other low-order + bits must be so, because PAGE_COMPRESSED=YES is only allowed + for ROW_FORMAT=DYNAMIC and ROW_FORMAT=COMPACT, not for + ROW_FORMAT=REDUNDANT or ROW_FORMAT=COMPRESSED. + + Starting with MariaDB 10.2.4, the flags would be + 00LLLL10DB00001, because ATOMIC_WRITES is always written as 0. + + We will concentrate on the PAGE_COMPRESSION_LEVEL and + PAGE_COMPRESSED=YES. PAGE_COMPRESSED=NO implies + PAGE_COMPRESSION_LEVEL=0, and in that case all the affected + bits will be 0. For PAGE_COMPRESSED=YES, the values 1..9 are + allowed for PAGE_COMPRESSION_LEVEL. That is, we must interpret + the bits AALLLL10DB00001 as AALLLL1DB00001. + + If someone created a table in MariaDB 10.2.2 or 10.2.3 with + the attribute ATOMIC_WRITES=OFF (value 2) and without + PAGE_COMPRESSED=YES or PAGE_COMPRESSION_LEVEL, that should be + rejected. The value ATOMIC_WRITES=ON (1) would look like + ATOMIC_WRITES=OFF, but it would be ignored starting with + MariaDB 10.2.4. */ + compile_time_assert(DICT_TF_POS_PAGE_COMPRESSION == 7); + compile_time_assert(DICT_TF_POS_UNUSED == 14); + + if ((type & 0x19f) != 0x101) { + /* The table cannot have been created with MariaDB + 10.2.2 to 10.2.6, because they would write the + low-order bits of SYS_TABLES.TYPE as 0b10xx00001 for + PAGE_COMPRESSED=YES. No adjustment is applicable. */ + } else if (type >= 3 << 13) { + /* 10.2.2 and 10.2.3 write ATOMIC_WRITES less than 3, + and no other flags above that can be set for the + SYS_TABLES.TYPE to be in the 10.2.2..10.2.6 format. + This would in any case be invalid format for 10.2 and + earlier releases. */ + ut_ad(!dict_sys_tables_type_valid(type, true)); + } else { + /* SYS_TABLES.TYPE is of the form AALLLL10DB00001. We + must still validate that the LLLL bits are between 0 + and 9 before we can discard the extraneous 0 bit. */ + ut_ad(!DICT_TF_GET_PAGE_COMPRESSION(type)); + + if ((((type >> 9) & 0xf) - 1) < 9) { + ut_ad(DICT_TF_GET_PAGE_COMPRESSION_LEVEL(type) & 1); + + type = (type & 0x7fU) | (type >> 1 & ~0x7fU); + + ut_ad(DICT_TF_GET_PAGE_COMPRESSION(type)); + ut_ad(DICT_TF_GET_PAGE_COMPRESSION_LEVEL(type) >= 1); + ut_ad(DICT_TF_GET_PAGE_COMPRESSION_LEVEL(type) <= 9); + } else { + ut_ad(!dict_sys_tables_type_valid(type, true)); + } + } + /* The low order bit of SYS_TABLES.TYPE is always set to 1. But in dict_table_t::flags the low order bit is used to determine if the row format is Redundant (0) or Compact (1) when the format is Antelope. @@ -1193,31 +1318,48 @@ dict_sys_tables_rec_read( ut_a(len == 4); *n_cols = mach_read_from_4(field); - /* This validation function also combines the DICT_N_COLS_COMPACT - flag in n_cols into the type field to effectively make it a - dict_table_t::flags. */ + const bool not_redundant = 0 != (*n_cols & DICT_N_COLS_COMPACT); - if (ULINT_UNDEFINED == dict_sys_tables_type_validate(type, *n_cols)) { + if (!dict_sys_tables_type_valid(type, not_redundant)) { ib::error() << "Table " << table_name << " in InnoDB" " data dictionary contains invalid flags." " SYS_TABLES.TYPE=" << type << " SYS_TABLES.N_COLS=" << *n_cols; - *flags = ULINT_UNDEFINED; return(false); } - *flags = dict_sys_tables_type_to_tf(type, *n_cols); + *flags = dict_sys_tables_type_to_tf(type, not_redundant); - /* Get flags2 from SYS_TABLES.MIX_LEN */ - field = rec_get_nth_field_old( - rec, DICT_FLD__SYS_TABLES__MIX_LEN, &len); - *flags2 = mach_read_from_4(field); + /* For tables created before MySQL 4.1, there may be + garbage in SYS_TABLES.MIX_LEN where flags2 are found. Such tables + would always be in ROW_FORMAT=REDUNDANT which do not have the + high bit set in n_cols, and flags would be zero. + MySQL 4.1 was the first version to support innodb_file_per_table, + that is, *space_id != 0. */ + if (not_redundant || *space_id != 0 || *n_cols & DICT_N_COLS_COMPACT) { - /* DICT_TF2_FTS will be set when indexes are being loaded */ - *flags2 &= ~DICT_TF2_FTS; + /* Get flags2 from SYS_TABLES.MIX_LEN */ + field = rec_get_nth_field_old( + rec, DICT_FLD__SYS_TABLES__MIX_LEN, &len); + *flags2 = mach_read_from_4(field); + + if (!dict_tf2_is_valid(*flags, *flags2)) { + ib::error() << "Table " << table_name << " in InnoDB" + " data dictionary contains invalid flags." + " SYS_TABLES.TYPE=" << type + << " SYS_TABLES.MIX_LEN=" << *flags2; + return(false); + } + + /* DICT_TF2_FTS will be set when indexes are being loaded */ + *flags2 &= ~DICT_TF2_FTS; + + /* Now that we have used this bit, unset it. */ + *n_cols &= ~DICT_N_COLS_COMPACT; + } else { + *flags2 = 0; + } - /* Now that we have used this bit, unset it. */ - *n_cols &= ~DICT_N_COLS_COMPACT; return(true); } @@ -1280,11 +1422,10 @@ dict_check_sys_tables( ("name: %p, '%s'", table_name.m_name, table_name.m_name)); - dict_sys_tables_rec_read(rec, table_name, - &table_id, &space_id, - &n_cols, &flags, &flags2); - if (flags == ULINT_UNDEFINED - || is_system_tablespace(space_id)) { + if (!dict_sys_tables_rec_read(rec, table_name, + &table_id, &space_id, + &n_cols, &flags, &flags2) + || space_id == TRX_SYS_SPACE) { ut_free(table_name.m_name); continue; } @@ -1307,7 +1448,7 @@ dict_check_sys_tables( look to see if it is already in the tablespace cache. */ if (fil_space_for_table_exists_in_mem( space_id, table_name.m_name, - false, true, NULL, 0, NULL, flags)) { + false, true, NULL, 0, flags)) { /* Recovery can open a datafile that does not match SYS_DATAFILES. If they don't match, update SYS_DATAFILES. */ @@ -1339,8 +1480,7 @@ dict_check_sys_tables( FIL_TYPE_TABLESPACE, space_id, dict_tf_to_fsp_flags(flags), table_name.m_name, - filepath, - NULL); + filepath); if (err != DB_SUCCESS) { ib::warn() << "Ignoring tablespace for " @@ -2091,6 +2231,8 @@ func_exit: static const char* dict_load_index_del = "delete-marked record in SYS_INDEXES"; /** Error message for table->id mismatch in dict_load_index_low() */ static const char* dict_load_index_id_err = "SYS_INDEXES.TABLE_ID mismatch"; +/** Error message for SYS_TABLES flags mismatch in dict_load_table_low() */ +static const char* dict_load_table_flags = "incorrect flags in SYS_TABLES"; /** Load an index definition from a SYS_INDEXES record to dict_index_t. If allocate=TRUE, we will create a dict_index_t structure and fill it @@ -2430,7 +2572,7 @@ dict_load_indexes( dict_mem_index_free(index); goto func_exit; } else if (index->page == FIL_NULL - && !table->ibd_file_missing + && table->is_readable() && (!(index->type & DICT_FTS))) { ib::error() << "Trying to load index " << index->name @@ -2534,16 +2676,13 @@ dict_load_table_low(table_name_t& name, const rec_t* rec, dict_table_t** table) ulint flags2; ulint n_v_col; - const char* error_text = dict_sys_tables_rec_check(rec); - if (error_text != NULL) { + if (const char* error_text = dict_sys_tables_rec_check(rec)) { return(error_text); } - dict_sys_tables_rec_read(rec, name, &table_id, &space_id, - &t_num, &flags, &flags2); - - if (flags == ULINT_UNDEFINED) { - return("incorrect flags in SYS_TABLES"); + if (!dict_sys_tables_rec_read(rec, name, &table_id, &space_id, + &t_num, &flags, &flags2)) { + return(dict_load_table_flags); } dict_table_decode_n_col(t_num, &n_cols, &n_v_col); @@ -2551,7 +2690,7 @@ dict_load_table_low(table_name_t& name, const rec_t* rec, dict_table_t** table) *table = dict_mem_table_create( name.m_name, space_id, n_cols + n_v_col, n_v_col, flags, flags2); (*table)->id = table_id; - (*table)->ibd_file_missing = FALSE; + (*table)->file_unreadable = false; return(NULL); } @@ -2644,7 +2783,7 @@ a foreign key references columns in this table. @param[in] ignore_err Error to be ignored when loading table and its index definition @return table, NULL if does not exist; if the table is stored in an -.ibd file, but the file does not exist, then we set the ibd_file_missing +.ibd file, but the file does not exist, then we set the file_unreadable flag in the table object we return. */ dict_table_t* dict_load_table( @@ -2709,7 +2848,7 @@ dict_load_tablespace( if (table->flags2 & DICT_TF2_DISCARDED) { ib::warn() << "Tablespace for table " << table->name << " is set as discarded."; - table->ibd_file_missing = TRUE; + table->file_unreadable = true; return; } @@ -2718,7 +2857,7 @@ dict_load_tablespace( /* The tablespace may already be open. */ if (fil_space_for_table_exists_in_mem( table->space, space_name, false, - true, heap, table->id, table, table->flags)) { + true, heap, table->id, table->flags)) { return; } @@ -2750,11 +2889,11 @@ dict_load_tablespace( dberr_t err = fil_ibd_open( true, false, FIL_TYPE_TABLESPACE, table->space, dict_tf_to_fsp_flags(table->flags), - space_name, filepath, table); + space_name, filepath); if (err != DB_SUCCESS) { /* We failed to find a sensible tablespace file */ - table->ibd_file_missing = TRUE; + table->file_unreadable = true; } ut_free(filepath); @@ -2777,7 +2916,7 @@ key constraints are loaded into memory. constraints are loaded. @return table, NULL if does not exist; if the table is stored in an .ibd file, but the file does not exist, then we set the -ibd_file_missing flag TRUE in the table object we return */ +file_unreadable flag in the table object we return */ static dict_table_t* dict_load_table_one( @@ -2797,7 +2936,6 @@ dict_load_table_one( const rec_t* rec; const byte* field; ulint len; - const char* err_msg; mtr_t mtr; DBUG_ENTER("dict_load_table_one"); @@ -2854,11 +2992,10 @@ err_exit: goto err_exit; } - err_msg = dict_load_table_low(name, rec, &table); - - if (err_msg) { - - ib::error() << err_msg; + if (const char* err_msg = dict_load_table_low(name, rec, &table)) { + if (err_msg != dict_load_table_flags) { + ib::error() << err_msg; + } goto err_exit; } @@ -2879,6 +3016,8 @@ err_exit: mem_heap_empty(heap); + ut_ad(dict_tf2_is_valid(table->flags, table->flags2)); + /* If there is no tablespace for the table then we only need to load the index definitions. So that we can IMPORT the tablespace later. When recovering table locks for resurrected incomplete @@ -2886,9 +3025,10 @@ err_exit: were not allowed while the table is being locked by a transaction. */ dict_err_ignore_t index_load_err = !(ignore_err & DICT_ERR_IGNORE_RECOVER_LOCK) - && table->ibd_file_missing + && !table->is_readable() ? DICT_ERR_IGNORE_ALL : ignore_err; + err = dict_load_indexes(table, heap, index_load_err); if (err == DB_INDEX_CORRUPT) { @@ -2908,37 +3048,11 @@ err_exit: clust_index = dict_table_get_first_index(table); if (dict_index_is_corrupted(clust_index)) { - table->corrupted = TRUE; + table->corrupted = true; } } } - /* We don't trust the table->flags2(retrieved from SYS_TABLES.MIX_LEN - field) if the datafiles are from 3.23.52 version. To identify this - version, we do the below check and reset the flags. */ - if (!DICT_TF2_FLAG_IS_SET(table, DICT_TF2_FTS_HAS_DOC_ID) - && table->space == srv_sys_space.space_id() - && table->flags == 0) { - table->flags2 = 0; - } - - DBUG_EXECUTE_IF("ib_table_invalid_flags", - if(strcmp(table->name.m_name, "test/t1") == 0) { - table->flags2 = 255; - table->flags = 255; - }); - - if (!dict_tf2_is_valid(table->flags, table->flags2)) { - ib::error() << "Table " << table->name << " in InnoDB" - " data dictionary contains invalid flags." - " SYS_TABLES.MIX_LEN=" << table->flags2; - table->flags2 &= ~DICT_TF2_TEMPORARY; - dict_table_remove_from_cache(table); - table = NULL; - err = DB_FAIL; - goto func_exit; - } - /* Initialize table foreign_child value. Its value could be changed when dict_load_foreigns() is called below */ table->fk_max_recusive_level = 0; @@ -2947,7 +3061,7 @@ err_exit: of the error condition, since the user may want to dump data from the clustered index. However we load the foreign key information only if all indexes were loaded. */ - if (!cached || table->ibd_file_missing) { + if (!cached || !table->is_readable()) { /* Don't attempt to load the indexes from disk. */ } else if (err == DB_SUCCESS) { err = dict_load_foreigns(table->name.m_name, NULL, @@ -2981,12 +3095,12 @@ err_exit: table = NULL; } else if (dict_index_is_corrupted(index) - && !table->ibd_file_missing) { + && table->is_readable()) { /* It is possible we force to load a corrupted clustered index if srv_load_corrupted is set. Mark the table as corrupted in this case */ - table->corrupted = TRUE; + table->corrupted = true; } } @@ -2995,7 +3109,7 @@ func_exit: ut_ad(!table || ignore_err != DICT_ERR_IGNORE_NONE - || table->ibd_file_missing + || !table->is_readable() || !table->corrupted); if (table && table->fts) { @@ -3418,17 +3532,12 @@ dict_load_foreign( here. The child table will be loaded later, along with its foreign key constraint. */ - lint old_size = mem_heap_get_size(ref_table->heap); - ut_a(ref_table != NULL); fk_tables.push_back( mem_heap_strdupl(ref_table->heap, foreign->foreign_table_name_lookup, foreign_table_name_len)); - lint new_size = mem_heap_get_size(ref_table->heap); - dict_sys->size += new_size - old_size; - dict_foreign_remove_from_cache(foreign); DBUG_RETURN(DB_SUCCESS); } diff --git a/storage/innobase/dict/dict0mem.cc b/storage/innobase/dict/dict0mem.cc index 7a6f09569a6..230706976dc 100644 --- a/storage/innobase/dict/dict0mem.cc +++ b/storage/innobase/dict/dict0mem.cc @@ -2,7 +2,7 @@ Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2017, MariaDB Corporation. +Copyright (c) 2013, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software diff --git a/storage/innobase/dict/dict0stats.cc b/storage/innobase/dict/dict0stats.cc index 537a70c2069..177a16a2b37 100644 --- a/storage/innobase/dict/dict0stats.cc +++ b/storage/innobase/dict/dict0stats.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2009, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. +Copyright (c) 2015, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -913,10 +913,15 @@ dict_stats_update_transient_for_index( index->stat_n_leaf_pages = size; - /* We don't handle the return value since it will be false - only when some thread is dropping the table and we don't - have to empty the statistics of the to be dropped index */ - btr_estimate_number_of_different_key_vals(index); + /* Do not continue if table decryption has failed or + table is already marked as corrupted. */ + if (index->is_readable()) { + /* We don't handle the return value since it + will be false only when some thread is + dropping the table and we don't have to empty + the statistics of the to be dropped index */ + btr_estimate_number_of_different_key_vals(index); + } } } @@ -967,8 +972,9 @@ dict_stats_update_transient( continue; } - /* Do not continue if table decryption has failed. */ - if (index->table->is_encrypted) { + /* Do not continue if table decryption has failed or + table is already marked as corrupted. */ + if (!index->is_readable()) { break; } @@ -1153,10 +1159,11 @@ dict_stats_analyze_index_level( leaf-level delete marks because delete marks on non-leaf level do not make sense. */ - if (level == 0 && (srv_stats_include_delete_marked ? 0: - rec_get_deleted_flag( + if (level == 0 + && !srv_stats_include_delete_marked + && rec_get_deleted_flag( rec, - page_is_comp(btr_pcur_get_page(&pcur))))) { + page_is_comp(btr_pcur_get_page(&pcur)))) { if (rec_is_last_on_page && !prev_rec_is_copied @@ -1328,21 +1335,6 @@ dict_stats_analyze_index_level( mem_heap_free(heap); } -/* aux enum for controlling the behavior of dict_stats_scan_page() @{ */ -enum page_scan_method_t { - COUNT_ALL_NON_BORING_AND_SKIP_DEL_MARKED,/* scan all records on - the given page and count the number of - distinct ones, also ignore delete marked - records */ - QUIT_ON_FIRST_NON_BORING,/* quit when the first record that differs - from its right neighbor is found */ - COUNT_ALL_NON_BORING_INCLUDE_DEL_MARKED/* scan all records on - the given page and count the number of - distinct ones, include delete marked - records */ -}; -/* @} */ - /** Scan a page, reading records from left to right and counting the number of distinct records (looking only at the first n_prefix columns) and the number of external pages pointed by records from this page. @@ -1359,7 +1351,7 @@ be big enough) @param[in] index index of the page @param[in] page the page to scan @param[in] n_prefix look at the first n_prefix columns -@param[in] scan_method scan to the end of the page or not +@param[in] is_leaf whether this is the leaf page @param[out] n_diff number of distinct records encountered @param[out] n_external_pages if this is non-NULL then it will be set to the number of externally stored pages which were encountered @@ -1374,7 +1366,7 @@ dict_stats_scan_page( const dict_index_t* index, const page_t* page, ulint n_prefix, - page_scan_method_t scan_method, + bool is_leaf, ib_uint64_t* n_diff, ib_uint64_t* n_external_pages) { @@ -1386,13 +1378,11 @@ dict_stats_scan_page( Because offsets1,offsets2 should be big enough, this memory heap should never be used. */ mem_heap_t* heap = NULL; - const rec_t* (*get_next)(const rec_t*); - - if (scan_method == COUNT_ALL_NON_BORING_AND_SKIP_DEL_MARKED) { - get_next = page_rec_get_next_non_del_marked; - } else { - get_next = page_rec_get_next_const; - } + ut_ad(is_leaf == page_is_leaf(page)); + const rec_t* (*get_next)(const rec_t*) + = !is_leaf || srv_stats_include_delete_marked + ? page_rec_get_next_const + : page_rec_get_next_non_del_marked; const bool should_count_external_pages = n_external_pages != NULL; @@ -1441,7 +1431,7 @@ dict_stats_scan_page( (*n_diff)++; - if (scan_method == QUIT_ON_FIRST_NON_BORING) { + if (!is_leaf) { break; } } @@ -1567,7 +1557,7 @@ dict_stats_analyze_index_below_cur( /* search for the first non-boring record on the page */ offsets_rec = dict_stats_scan_page( &rec, offsets1, offsets2, index, page, n_prefix, - QUIT_ON_FIRST_NON_BORING, n_diff, NULL); + false, n_diff, NULL); /* pages on level > 0 are not allowed to be empty */ ut_a(offsets_rec != NULL); @@ -1612,9 +1602,7 @@ dict_stats_analyze_index_below_cur( offsets_rec = dict_stats_scan_page( &rec, offsets1, offsets2, index, page, n_prefix, - srv_stats_include_delete_marked ? - COUNT_ALL_NON_BORING_INCLUDE_DEL_MARKED: - COUNT_ALL_NON_BORING_AND_SKIP_DEL_MARKED, n_diff, + true, n_diff, n_external_pages); #if 0 @@ -2419,6 +2407,41 @@ dict_stats_save_index_stat( return(ret); } +/** Report an error if updating table statistics failed because +.ibd file is missing, table decryption failed or table is corrupted. +@param[in,out] table Table +@param[in] defragment true if statistics is for defragment +@retval DB_DECRYPTION_FAILED if decryption of the table failed +@retval DB_TABLESPACE_DELETED if .ibd file is missing +@retval DB_CORRUPTION if table is marked as corrupted */ +dberr_t +dict_stats_report_error(dict_table_t* table, bool defragment) +{ + dberr_t err; + + FilSpace space(table->space); + const char* df = defragment ? " defragment" : ""; + + if (!space()) { + ib::warn() << "Cannot save" << df << " statistics for table " + << table->name + << " because the .ibd file is missing. " + << TROUBLESHOOTING_MSG; + err = DB_TABLESPACE_DELETED; + } else { + ib::warn() << "Cannot save" << df << " statistics for table " + << table->name + << " because file " << space()->chain.start->name + << (table->corrupted + ? " is corrupted." + : " cannot be decrypted."); + err = table->corrupted ? DB_CORRUPTION : DB_DECRYPTION_FAILED; + } + + dict_stats_empty_table(table, defragment); + return err; +} + /** Save the table's statistics into the persistent statistics storage. @param[in] table_orig table whose stats to save @param[in] only_for_index if this is non-NULL, then stats for indexes @@ -2438,6 +2461,11 @@ dict_stats_save( char db_utf8[MAX_DB_UTF8_LEN]; char table_utf8[MAX_TABLE_UTF8_LEN]; + if (table_orig->is_readable()) { + } else { + return (dict_stats_report_error(table_orig)); + } + table = dict_stats_snapshot_create(table_orig); dict_fs2utf8(table->name.m_name, db_utf8, sizeof(db_utf8), @@ -3160,15 +3188,8 @@ dict_stats_update( { ut_ad(!mutex_own(&dict_sys->mutex)); - if (table->ibd_file_missing) { - - ib::warn() << "Cannot calculate statistics for table " - << table->name - << " because the .ibd file is missing. " - << TROUBLESHOOTING_MSG; - - dict_stats_empty_table(table, true); - return(DB_TABLESPACE_DELETED); + if (!table->is_readable()) { + return (dict_stats_report_error(table)); } else if (srv_force_recovery >= SRV_FORCE_NO_IBUF_MERGE) { /* If we have set a high innodb_force_recovery level, do not calculate statistics, as a badly corrupted index can diff --git a/storage/innobase/dict/dict0stats_bg.cc b/storage/innobase/dict/dict0stats_bg.cc index 876d1bcb342..f2ef18b116d 100644 --- a/storage/innobase/dict/dict0stats_bg.cc +++ b/storage/innobase/dict/dict0stats_bg.cc @@ -38,8 +38,6 @@ Created Apr 25, 2012 Vasil Dimov /** Minimum time interval between stats recalc for a given table */ #define MIN_RECALC_INTERVAL 10 /* seconds */ -#define SHUTTING_DOWN() (srv_shutdown_state != SRV_SHUTDOWN_NONE) - /** Event to wake up dict_stats_thread on dict_stats_recalc_pool_add() or shutdown. Not protected by any mutex. */ os_event_t dict_stats_event; @@ -120,6 +118,7 @@ background stats gathering thread. Only the table id is added to the list, so the table can be closed after being enqueued and it will be opened when needed. If the table does not exist later (has been DROPped), then it will be removed from the pool and skipped. */ +static void dict_stats_recalc_pool_add( /*=======================*/ @@ -147,6 +146,44 @@ dict_stats_recalc_pool_add( os_event_set(dict_stats_event); } +/** Update the table modification counter and if necessary, +schedule new estimates for table and index statistics to be calculated. +@param[in,out] table persistent or temporary table */ +void +dict_stats_update_if_needed(dict_table_t* table) +{ + ut_ad(table->stat_initialized); + ut_ad(!mutex_own(&dict_sys->mutex)); + + ulonglong counter = table->stat_modified_counter++; + ulonglong n_rows = dict_table_get_n_rows(table); + + if (dict_stats_is_persistent_enabled(table)) { + if (counter > n_rows / 10 /* 10% */ + && dict_stats_auto_recalc_is_enabled(table)) { + + dict_stats_recalc_pool_add(table); + table->stat_modified_counter = 0; + } + return; + } + + /* Calculate new statistics if 1 / 16 of table has been modified + since the last time a statistics batch was run. + We calculate statistics at most every 16th round, since we may have + a counter table which is very small and updated very often. */ + ulonglong threshold = 16 + n_rows / 16; /* 6.25% */ + + if (srv_stats_modified_counter) { + threshold = std::min(srv_stats_modified_counter, threshold); + } + + if (counter > threshold) { + /* this will reset table->stat_modified_counter to 0 */ + dict_stats_update(table, DICT_STATS_RECALC_TRANSIENT); + } +} + /*****************************************************************//** Get a table from the auto recalc pool. The returned table id is removed from the pool. @@ -231,7 +268,6 @@ Initialize global variables needed for the operation of dict_stats_thread() Must be called before dict_stats_thread() is started. */ void dict_stats_thread_init() -/*====================*/ { ut_a(!srv_read_only_mode); @@ -276,15 +312,9 @@ dict_stats_thread_deinit() mutex_free(&recalc_pool_mutex); -#ifdef UNIV_DEBUG - os_event_destroy(dict_stats_disabled_event); - dict_stats_disabled_event = NULL; -#endif /* UNIV_DEBUG */ - + ut_d(os_event_destroy(dict_stats_disabled_event)); os_event_destroy(dict_stats_event); os_event_destroy(dict_stats_shutdown_event); - dict_stats_event = NULL; - dict_stats_shutdown_event = NULL; dict_stats_start_shutdown = false; } @@ -401,6 +431,7 @@ extern "C" os_thread_ret_t DECLARE_THREAD(dict_stats_thread)(void*) { + my_thread_init(); ut_a(!srv_read_only_mode); #ifdef UNIV_PFS_THREAD @@ -452,7 +483,7 @@ DECLARE_THREAD(dict_stats_thread)(void*) OS_THREAD_DUMMY_RETURN; } -/** Shutdown the dict stats thread. */ +/** Shut down the dict_stats_thread. */ void dict_stats_shutdown() { diff --git a/storage/innobase/fil/fil0crypt.cc b/storage/innobase/fil/fil0crypt.cc index b031a77baa8..5e7e5a2f21b 100644 --- a/storage/innobase/fil/fil0crypt.cc +++ b/storage/innobase/fil/fil0crypt.cc @@ -24,6 +24,7 @@ Modified Jan Lindström jan.lindstrom@mariadb.com *******************************************************/ #include "fil0fil.h" +#include "mtr0types.h" #include "mach0data.h" #include "page0size.h" #include "page0zip.h" @@ -92,13 +93,20 @@ static ib_mutex_t crypt_stat_mutex; extern my_bool srv_background_scrub_data_uncompressed; extern my_bool srv_background_scrub_data_compressed; +/*********************************************************************** +Check if a key needs rotation given a key_state +@param[in] encrypt_mode Encryption mode +@param[in] key_version Current key version +@param[in] latest_key_version Latest key version +@param[in] rotate_key_age when to rotate +@return true if key needs rotation, false if not */ static bool fil_crypt_needs_rotation( - fil_encryption_t encrypt_mode, /*!< in: Encryption - mode */ - uint key_version, /*!< in: Key version */ - uint latest_key_version, /*!< in: Latest key version */ - uint rotate_key_age); /*!< in: When to rotate */ + fil_encryption_t encrypt_mode, + uint key_version, + uint latest_key_version, + uint rotate_key_age) + MY_ATTRIBUTE((warn_unused_result)); /********************************************************************* Init space crypt */ @@ -160,7 +168,12 @@ fil_crypt_get_latest_key_version( crypt_data->min_key_version, key_version, srv_fil_crypt_rotate_key_age)) { - os_event_set(fil_crypt_threads_event); + /* Below event seen as NULL-pointer at startup + when new database was created and we create a + checkpoint. Only seen when debugging. */ + if (fil_crypt_threads_inited) { + os_event_set(fil_crypt_threads_event); + } } } @@ -277,8 +290,8 @@ fil_space_read_crypt_data(const page_size_t& page_size, const byte* page) return NULL; } - ulint type = mach_read_from_1(page + offset + MAGIC_SZ + 0); - ulint iv_length = mach_read_from_1(page + offset + MAGIC_SZ + 1); + uint8_t type = mach_read_from_1(page + offset + MAGIC_SZ + 0); + uint8_t iv_length = mach_read_from_1(page + offset + MAGIC_SZ + 1); fil_space_crypt_t* crypt_data; if (!(type == CRYPT_SCHEME_UNENCRYPTED || @@ -325,10 +338,17 @@ fil_space_destroy_crypt_data( fil_space_crypt_t **crypt_data) { if (crypt_data != NULL && (*crypt_data) != NULL) { - mutex_enter(&fil_crypt_threads_mutex); - fil_space_crypt_t* c = *crypt_data; - *crypt_data = NULL; - mutex_exit(&fil_crypt_threads_mutex); + fil_space_crypt_t* c; + if (UNIV_LIKELY(fil_crypt_threads_inited)) { + mutex_enter(&fil_crypt_threads_mutex); + c = *crypt_data; + *crypt_data = NULL; + mutex_exit(&fil_crypt_threads_mutex); + } else { + ut_ad(srv_read_only_mode || !srv_was_started); + c = *crypt_data; + *crypt_data = NULL; + } if (c) { c->~fil_space_crypt_t(); ut_free(c); @@ -444,11 +464,12 @@ Parse a MLOG_FILE_WRITE_CRYPT_DATA log entry @param[in] block buffer block @return position on log buffer */ UNIV_INTERN -const byte* +byte* fil_parse_write_crypt_data( - const byte* ptr, + byte* ptr, const byte* end_ptr, - const buf_block_t* block) + const buf_block_t* block, + dberr_t* err) { /* check that redo log entry is complete */ uint entry_size = @@ -460,6 +481,8 @@ fil_parse_write_crypt_data( 4 + // size of key_id 1; // fil_encryption_t + *err = DB_SUCCESS; + if (ptr + entry_size > end_ptr) { return NULL; } @@ -499,11 +522,16 @@ fil_parse_write_crypt_data( ptr += len; /* update fil_space memory cache with crypt_data */ - fil_space_t* space = fil_space_acquire_silent(space_id); - - if (space) { + if (fil_space_t* space = fil_space_acquire_silent(space_id)) { crypt_data = fil_space_set_crypt_data(space, crypt_data); fil_space_release(space); + /* Check is used key found from encryption plugin */ + if (crypt_data->should_encrypt() + && !crypt_data->is_key_found()) { + *err = DB_DECRYPTION_FAILED; + } + } else { + fil_space_destroy_crypt_data(&crypt_data); } return ptr; @@ -529,14 +557,14 @@ fil_encrypt_buf( const page_size_t& page_size, byte* dst_frame) { - ulint size = page_size.physical(); + uint size = uint(page_size.physical()); uint key_version = fil_crypt_get_latest_key_version(crypt_data); ut_a(key_version != ENCRYPTION_KEY_VERSION_INVALID); ulint orig_page_type = mach_read_from_2(src_frame+FIL_PAGE_TYPE); ibool page_compressed = (orig_page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED); - ulint header_len = FIL_PAGE_DATA; + uint header_len = FIL_PAGE_DATA; if (page_compressed) { header_len += (FIL_PAGE_COMPRESSED_SIZE + FIL_PAGE_COMPRESSION_METHOD_SIZE); @@ -549,8 +577,8 @@ fil_encrypt_buf( mach_write_to_4(dst_frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, key_version); /* Calculate the start offset in a page */ - ulint unencrypted_bytes = header_len + FIL_PAGE_DATA_END; - ulint srclen = size - unencrypted_bytes; + uint unencrypted_bytes = header_len + FIL_PAGE_DATA_END; + uint srclen = size - unencrypted_bytes; const byte* src = src_frame + header_len; byte* dst = dst_frame + header_len; uint32 dstlen = 0; @@ -663,16 +691,19 @@ fil_space_encrypt( } bool corrupted = buf_page_is_corrupted(true, tmp_mem, page_size, space); + memcpy(tmp_mem+FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, src+FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, 8); bool different = memcmp(src, tmp_mem, page_size.physical()); if (!ok || corrupted || corrupted1 || err != DB_SUCCESS || different) { - fprintf(stderr, "ok %d corrupted %d corrupted1 %d err %d different %d\n", ok , corrupted, corrupted1, err, different); + fprintf(stderr, "ok %d corrupted %d corrupted1 %d err %d different %d\n", + ok , corrupted, corrupted1, err, different); fprintf(stderr, "src_frame\n"); - buf_page_print(src_frame, page_size, BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(src_frame, page_size); fprintf(stderr, "encrypted_frame\n"); - buf_page_print(tmp, page_size, BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(tmp, page_size); fprintf(stderr, "decrypted_frame\n"); - buf_page_print(tmp_mem, page_size, 0); + buf_page_print(tmp_mem, page_size); + ut_ad(0); } free(tmp_mem); @@ -709,8 +740,8 @@ fil_space_decrypt( ulint page_type = mach_read_from_2(src_frame+FIL_PAGE_TYPE); uint key_version = mach_read_from_4(src_frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); bool page_compressed = (page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED); - ulint offset = mach_read_from_4(src_frame + FIL_PAGE_OFFSET); - ulint space = mach_read_from_4(src_frame + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID); + uint offset = mach_read_from_4(src_frame + FIL_PAGE_OFFSET); + uint space = mach_read_from_4(src_frame + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID); ib_uint64_t lsn = mach_read_from_8(src_frame + FIL_PAGE_LSN); *err = DB_SUCCESS; @@ -719,31 +750,10 @@ fil_space_decrypt( return false; } - if (crypt_data == NULL) { - if (!(space == 0 && offset == 0) && key_version != 0) { - /* FIL_PAGE_FILE_FLUSH_LSN field i.e. - FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION - should be only defined for the - first page in a system tablespace - data file (ibdata*, not *.ibd), if not - clear it. */ - - DBUG_LOG("crypt", - "Page " << page_id_t(space, offset) - << " carries key_version " << key_version - << " (should be undefined)"); - - memset(src_frame - + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, 0, 4); - } - - return false; - } - ut_a(crypt_data != NULL && crypt_data->is_encrypted()); /* read space & lsn */ - ulint header_len = FIL_PAGE_DATA; + uint header_len = FIL_PAGE_DATA; if (page_compressed) { header_len += (FIL_PAGE_COMPRESSED_SIZE + FIL_PAGE_COMPRESSION_METHOD_SIZE); @@ -756,7 +766,8 @@ fil_space_decrypt( const byte* src = src_frame + header_len; byte* dst = tmp_frame + header_len; uint32 dstlen = 0; - ulint srclen = page_size.physical() - (header_len + FIL_PAGE_DATA_END); + uint srclen = uint(page_size.physical()) + - header_len - FIL_PAGE_DATA_END; if (page_compressed) { srclen = mach_read_from_2(src_frame + FIL_PAGE_DATA); @@ -789,9 +800,6 @@ fil_space_decrypt( memcpy(tmp_frame + page_size.physical() - FIL_PAGE_DATA_END, src_frame + page_size.physical() - FIL_PAGE_DATA_END, FIL_PAGE_DATA_END); - - // clear key-version & crypt-checksum from dst - memset(tmp_frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, 0, 8); } srv_stats.pages_decrypted.inc(); @@ -844,42 +852,19 @@ fil_space_decrypt( Calculate post encryption checksum @param[in] page_size page size @param[in] dst_frame Block where checksum is calculated -@return page checksum or BUF_NO_CHECKSUM_MAGIC +@return page checksum not needed. */ UNIV_INTERN -ulint +uint32_t fil_crypt_calculate_checksum( const page_size_t& page_size, const byte* dst_frame) { - ib_uint32_t checksum = 0; - srv_checksum_algorithm_t algorithm = - static_cast(srv_checksum_algorithm); - - if (!page_size.is_compressed()) { - switch (algorithm) { - case SRV_CHECKSUM_ALGORITHM_CRC32: - case SRV_CHECKSUM_ALGORITHM_STRICT_CRC32: - checksum = buf_calc_page_crc32(dst_frame); - break; - case SRV_CHECKSUM_ALGORITHM_INNODB: - case SRV_CHECKSUM_ALGORITHM_STRICT_INNODB: - checksum = (ib_uint32_t) buf_calc_page_new_checksum( - dst_frame); - break; - case SRV_CHECKSUM_ALGORITHM_NONE: - case SRV_CHECKSUM_ALGORITHM_STRICT_NONE: - checksum = BUF_NO_CHECKSUM_MAGIC; - break; - /* no default so the compiler will emit a warning - * if new enum is added and not handled here */ - } - } else { - checksum = page_zip_calc_checksum(dst_frame, page_size.physical(), - algorithm); - } - - return checksum; + /* For encrypted tables we use only crc32 and strict_crc32 */ + return page_size.is_compressed() + ? page_zip_calc_checksum(dst_frame, page_size.physical(), + SRV_CHECKSUM_ALGORITHM_CRC32) + : buf_calc_page_crc32(dst_frame); } /***********************************************************************/ @@ -958,6 +943,34 @@ fil_crypt_needs_rotation( return false; } +/** Read page 0 and possible crypt data from there. +@param[in,out] space Tablespace */ +static inline +void +fil_crypt_read_crypt_data(fil_space_t* space) +{ + if (space->crypt_data || space->size) { + /* The encryption metadata has already been read, or + the tablespace is not encrypted and the file has been + opened already. */ + return; + } + + const page_size_t page_size(space->flags); + mtr_t mtr; + mtr.start(); + if (buf_block_t* block = buf_page_get(page_id_t(space->id, 0), + page_size, RW_S_LATCH, &mtr)) { + mutex_enter(&fil_system->mutex); + if (!space->crypt_data) { + space->crypt_data = fil_space_read_crypt_data( + page_size, block->frame); + } + mutex_exit(&fil_system->mutex); + } + mtr.commit(); +} + /*********************************************************************** Start encrypting a space @param[in,out] space Tablespace @@ -968,6 +981,7 @@ fil_crypt_start_encrypting_space( fil_space_t* space) { bool recheck = false; + mutex_enter(&fil_crypt_threads_mutex); fil_space_crypt_t *crypt_data = space->crypt_data; @@ -1018,7 +1032,8 @@ fil_crypt_start_encrypting_space( do { mtr_t mtr; - mtr_start(&mtr); + mtr.start(); + mtr.set_named_space(space); /* 2 - get page 0 */ dberr_t err = DB_SUCCESS; @@ -1034,7 +1049,7 @@ fil_crypt_start_encrypting_space( crypt_data->type = CRYPT_SCHEME_1; crypt_data->write_page0(space, frame, &mtr); - mtr_commit(&mtr); + mtr.commit(); /* record lsn of update */ lsn_t end_lsn = mtr.commit_lsn(); @@ -1097,7 +1112,7 @@ struct rotate_thread_t { uint estimated_max_iops; /*!< estimation of max iops */ uint allocated_iops; /*!< allocated iops */ - uint cnt_waited; /*!< #times waited during this slot */ + ulint cnt_waited; /*!< #times waited during this slot */ uintmax_t sum_waited_us; /*!< wait time during this slot */ fil_crypt_stat_t crypt_stat; // statistics @@ -1109,12 +1124,12 @@ struct rotate_thread_t { bool should_shutdown() const { switch (srv_shutdown_state) { case SRV_SHUTDOWN_NONE: - case SRV_SHUTDOWN_CLEANUP: return thread_no >= srv_n_fil_crypt_threads; case SRV_SHUTDOWN_EXIT_THREADS: /* srv_init_abort() must have been invoked */ - case SRV_SHUTDOWN_FLUSH_PHASE: + case SRV_SHUTDOWN_CLEANUP: return true; + case SRV_SHUTDOWN_FLUSH_PHASE: case SRV_SHUTDOWN_LAST_PHASE: break; } @@ -1326,12 +1341,12 @@ fil_crypt_realloc_iops( state->cnt_waited = 0; state->sum_waited_us = 0; } else { - DBUG_PRINT("ib_crypt", - ("thr_no: %u only waited " ULINTPF - "%% skip re-estimate.", - state->thread_no, - (100 * state->cnt_waited) / state->batch)); + ("thr_no: %u only waited " ULINTPF + "%% skip re-estimate.", + state->thread_no, + (100 * state->cnt_waited) + / (state->batch ? state->batch : 1))); } if (state->estimated_max_iops <= state->allocated_iops) { @@ -1434,7 +1449,7 @@ fil_crypt_find_space_to_rotate( /* we need iops to start rotating */ while (!state->should_shutdown() && !fil_crypt_alloc_iops(state)) { os_event_reset(fil_crypt_threads_event); - os_event_wait_time(fil_crypt_threads_event, 1000000); + os_event_wait_time(fil_crypt_threads_event, 100000); } if (state->should_shutdown()) { @@ -1463,6 +1478,13 @@ fil_crypt_find_space_to_rotate( } while (!state->should_shutdown() && state->space) { + /* If there is no crypt data and we have not yet read + page 0 for this tablespace, we need to read it before + we can continue. */ + if (!state->space->crypt_data) { + fil_crypt_read_crypt_data(state->space); + } + if (fil_crypt_space_needs_rotation(state, key_state, recheck)) { ut_ad(key_state->key_id); /* init state->min_key_version_found before @@ -1580,20 +1602,6 @@ fil_crypt_find_page_to_rotate( return found; } -/*********************************************************************** -Check if a page is uninitialized (doesn't need to be rotated) -@param[in] frame Page to check -@param[in] page_size Page size -@return true if page is uninitialized, false if not. */ -static inline -bool -fil_crypt_is_page_uninitialized( - const byte *frame, - const page_size_t& page_size) -{ - return (buf_page_is_zeroes(frame, page_size)); -} - #define fil_crypt_get_page_throttle(state,offset,mtr,sleeptime_ms) \ fil_crypt_get_page_throttle_func(state, offset, mtr, \ sleeptime_ms, __FILE__, __LINE__) @@ -1615,7 +1623,7 @@ fil_crypt_get_page_throttle_func( mtr_t* mtr, ulint* sleeptime_ms, const char* file, - ulint line) + unsigned line) { fil_space_t* space = state->space; const page_size_t page_size = page_size_t(space->flags); @@ -1707,7 +1715,7 @@ btr_scrub_get_block_and_allocation_status( mtr_start(&local_mtr); - *allocation_status = fsp_page_is_free(space->id, offset, &local_mtr) ? + *allocation_status = fseg_page_is_free(space, offset) ? BTR_SCRUB_PAGE_FREE : BTR_SCRUB_PAGE_ALLOCATED; @@ -1754,9 +1762,9 @@ fil_crypt_rotate_page( ulint offset = state->offset; ulint sleeptime_ms = 0; fil_space_crypt_t *crypt_data = space->crypt_data; - const page_size_t page_size = page_size_t(space->flags); ut_ad(space->n_pending_ops > 0); + ut_ad(offset > 0); /* In fil_crypt_thread where key rotation is done we have acquired space and checked that this space is not yet @@ -1771,56 +1779,55 @@ fil_crypt_rotate_page( return; } + ut_d(const bool was_free = fseg_page_is_free(space, offset)); + mtr_t mtr; - mtr_start(&mtr); - buf_block_t* block = fil_crypt_get_page_throttle(state, - offset, &mtr, - &sleeptime_ms); - - if (block) { - + mtr.start(); + if (buf_block_t* block = fil_crypt_get_page_throttle(state, + offset, &mtr, + &sleeptime_ms)) { bool modified = false; int needs_scrubbing = BTR_SCRUB_SKIP_PAGE; lsn_t block_lsn = block->page.newest_modification; - uint kv = block->page.key_version; + byte* frame = buf_block_get_frame(block); + uint kv = mach_read_from_4(frame+FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); - /* check if tablespace is closing after reading page */ if (space->is_stopping()) { - byte* frame = buf_block_get_frame(block); + /* The tablespace is closing (in DROP TABLE or + TRUNCATE TABLE or similar): avoid further access */ + } else if (!*reinterpret_cast(FIL_PAGE_OFFSET + + frame)) { + /* It looks like this page was never + allocated. Because key rotation is accessing + pages in a pattern that is unlike the normal + B-tree and undo log access pattern, we cannot + invoke fseg_page_is_free() here, because that + could result in a deadlock. If we invoked + fseg_page_is_free() and released the + tablespace latch before acquiring block->lock, + then the fseg_page_is_free() information + could be stale already. */ + ut_ad(was_free); + ut_ad(kv == 0); + ut_ad(page_get_space_id(frame) == 0); + } else if (fil_crypt_needs_rotation( + crypt_data->encryption, + kv, key_state->key_version, + key_state->rotate_key_age)) { - if (kv == 0 && - fil_crypt_is_page_uninitialized(frame, page_size)) { - ; - } else if (fil_crypt_needs_rotation( - crypt_data->encryption, - kv, key_state->key_version, - key_state->rotate_key_age)) { + mtr.set_named_space(space); + modified = true; - /* page can be "fresh" i.e never written in case - * kv == 0 or it should have a key version at least - * as big as the space minimum key version*/ - ut_a(kv == 0 || kv >= crypt_data->min_key_version); + /* force rotation by dummy updating page */ + mlog_write_ulint(frame + FIL_PAGE_SPACE_ID, + space_id, MLOG_4BYTES, &mtr); - modified = true; - - /* force rotation by dummy updating page */ - mlog_write_ulint(frame + - FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID, - space_id, MLOG_4BYTES, &mtr); - - /* update block */ - block->page.key_version = key_state->key_version; - - /* statistics */ - state->crypt_stat.pages_modified++; - } else { - if (crypt_data->is_encrypted()) { - ut_a(kv >= crypt_data->min_key_version || - (kv == 0 && key_state->key_version == 0)); - - if (kv < state->min_key_version_found) { - state->min_key_version_found = kv; - } + /* statistics */ + state->crypt_stat.pages_modified++; + } else { + if (crypt_data->is_encrypted()) { + if (kv < state->min_key_version_found) { + state->min_key_version_found = kv; } } @@ -1829,11 +1836,11 @@ fil_crypt_rotate_page( BTR_SCRUB_PAGE_ALLOCATION_UNKNOWN); } - mtr_commit(&mtr); + mtr.commit(); lsn_t end_lsn = mtr.commit_lsn(); if (needs_scrubbing == BTR_SCRUB_PAGE) { - mtr_start(&mtr); + mtr.start(); /* * refetch page and allocation status */ @@ -1845,6 +1852,7 @@ fil_crypt_rotate_page( &sleeptime_ms); if (block) { + mtr.set_named_space(space); /* get required table/index and index-locks */ needs_scrubbing = btr_scrub_recheck_page( @@ -1902,6 +1910,13 @@ fil_crypt_rotate_page( state->end_lsn = block_lsn; } } + } else { + /* If block read failed mtr memo and log should be empty. */ + ut_ad(!mtr.has_modifications()); + ut_ad(!mtr.is_dirty()); + ut_ad(mtr.get_memo()->size() == 0); + ut_ad(mtr.get_log()->size() == 0); + mtr.commit(); } if (sleeptime_ms) { @@ -1922,7 +1937,8 @@ fil_crypt_rotate_pages( rotate_thread_t* state) { ulint space = state->space->id; - ulint end = state->offset + state->batch; + ulint end = std::min(state->offset + state->batch, + state->space->free_limit); ut_ad(state->space->n_pending_ops > 0); @@ -1999,6 +2015,7 @@ fil_crypt_flush_space( page_id_t(space->id, 0), page_size_t(space->flags), RW_X_LATCH, NULL, BUF_GET, __FILE__, __LINE__, &mtr, &err)) { + mtr.set_named_space(space); crypt_data->write_page0(space, block->frame, &mtr); } @@ -2067,7 +2084,8 @@ fil_crypt_complete_rotate_space( mutex_exit(&crypt_data->mutex); /* all threads must call btr_scrub_complete_space wo/ mutex held */ - if (btr_scrub_complete_space(&state->scrub_data) == true) { + if (state->scrub_data.scrubbing) { + btr_scrub_complete_space(&state->scrub_data); if (should_flush) { /* only last thread updates last_scrub_completed */ ut_ad(crypt_data); @@ -2085,6 +2103,11 @@ fil_crypt_complete_rotate_space( crypt_data->rotate_state.flushing = false; mutex_exit(&crypt_data->mutex); } + } else { + mutex_enter(&crypt_data->mutex); + ut_a(crypt_data->rotate_state.active_threads > 0); + crypt_data->rotate_state.active_threads--; + mutex_exit(&crypt_data->mutex); } } @@ -2162,8 +2185,10 @@ DECLARE_THREAD(fil_crypt_thread)( while (!thr.should_shutdown() && fil_crypt_find_page_to_rotate(&new_state, &thr)) { - /* rotate a (set) of pages */ - fil_crypt_rotate_pages(&new_state, &thr); + if (!thr.space->is_stopping()) { + /* rotate a (set) of pages */ + fil_crypt_rotate_pages(&new_state, &thr); + } /* If space is marked as stopping, release space and stop rotation. */ @@ -2234,7 +2259,7 @@ fil_crypt_set_thread_cnt( for (uint i = 0; i < add; i++) { os_thread_id_t rotation_thread_id; os_thread_create(fil_crypt_thread, NULL, &rotation_thread_id); - ib::info() << "Creating " + ib::info() << "Creating #" << i+1 << " encryption thread id " << os_thread_pf(rotation_thread_id) << " total threads " << new_cnt << "."; @@ -2248,7 +2273,13 @@ fil_crypt_set_thread_cnt( while(srv_n_fil_crypt_threads_started != srv_n_fil_crypt_threads) { os_event_reset(fil_crypt_event); - os_event_wait_time(fil_crypt_event, 1000000); + os_event_wait_time(fil_crypt_event, 100000); + } + + /* Send a message to encryption threads that there could be + something to do. */ + if (srv_n_fil_crypt_threads) { + os_event_set(fil_crypt_threads_event); } } @@ -2345,7 +2376,7 @@ fil_space_crypt_close_tablespace( mutex_enter(&crypt_data->mutex); mutex_exit(&fil_crypt_threads_mutex); - uint cnt = crypt_data->rotate_state.active_threads; + ulint cnt = crypt_data->rotate_state.active_threads; bool flushing = crypt_data->rotate_state.flushing; while (cnt > 0 || flushing) { @@ -2369,7 +2400,10 @@ fil_space_crypt_close_tablespace( ib::warn() << "Waited " << now - start << " seconds to drop space: " - << space->name << "."; + << space->name << " (" + << space->id << ") active threads " + << cnt << "flushing=" + << flushing << "."; last = now; } } @@ -2390,10 +2424,18 @@ fil_space_crypt_get_status( memset(status, 0, sizeof(*status)); ut_ad(space->n_pending_ops > 0); - fil_space_crypt_t* crypt_data = space->crypt_data; - status->space = space->id; - if (crypt_data != NULL) { + /* If there is no crypt data and we have not yet read + page 0 for this tablespace, we need to read it before + we can continue. */ + if (!space->crypt_data) { + fil_crypt_read_crypt_data(const_cast(space)); + } + + status->space = ULINT_UNDEFINED; + + if (fil_space_crypt_t* crypt_data = space->crypt_data) { + status->space = space->id; mutex_enter(&crypt_data->mutex); status->scheme = crypt_data->type; status->keyserver_requests = crypt_data->keyserver_requests; @@ -2502,15 +2544,8 @@ fil_space_verify_crypt_checksum( return false; } - srv_checksum_algorithm_t algorithm = - static_cast(srv_checksum_algorithm); - /* If no checksum is used, can't continue checking. */ - if (algorithm == SRV_CHECKSUM_ALGORITHM_NONE) { - return(true); - } - /* Read stored post encryption checksum. */ - ib_uint32_t checksum = mach_read_from_4( + uint32_t checksum = mach_read_from_4( page + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION + 4); /* Declare empty pages non-corrupted */ @@ -2527,29 +2562,29 @@ fil_space_verify_crypt_checksum( return (true); } - /* Compressed pages use different checksum method. We first store - the post encryption checksum on checksum location and after function - restore the original. */ + uint32 cchecksum1, cchecksum2; + + /* Calculate checksums */ if (page_size.is_compressed()) { - ib_uint32_t old = static_cast(mach_read_from_4( - page + FIL_PAGE_SPACE_OR_CHKSUM)); + cchecksum1 = page_zip_calc_checksum( + page, page_size.physical(), + SRV_CHECKSUM_ALGORITHM_CRC32); - mach_write_to_4(page + FIL_PAGE_SPACE_OR_CHKSUM, checksum); - - bool valid = page_zip_verify_checksum(page, - page_size.physical()); - - mach_write_to_4(page + FIL_PAGE_SPACE_OR_CHKSUM, old); - - return (valid); + cchecksum2 = (cchecksum1 == checksum) + ? 0 + : page_zip_calc_checksum( + page, page_size.physical(), + SRV_CHECKSUM_ALGORITHM_INNODB); + } else { + cchecksum1 = buf_calc_page_crc32(page); + cchecksum2 = (cchecksum1 == checksum) + ? 0 + : buf_calc_page_new_checksum(page); } /* If stored checksum matches one of the calculated checksums page is not corrupted. */ - ib_uint32_t cchecksum1 = buf_calc_page_crc32(page); - ib_uint32_t cchecksum2 = (ib_uint32_t) buf_calc_page_new_checksum( - page); bool encrypted = (checksum == cchecksum1 || checksum == cchecksum2 || checksum == BUF_NO_CHECKSUM_MAGIC); @@ -2577,17 +2612,24 @@ fil_space_verify_crypt_checksum( when FIL_PAGE_FILE_FLUSH_LSN does not contain 0. */ - ulint checksum1 = mach_read_from_4( - page + FIL_PAGE_SPACE_OR_CHKSUM); + uint32_t checksum1 = mach_read_from_4(page + FIL_PAGE_SPACE_OR_CHKSUM); + uint32_t checksum2; - ulint checksum2 = mach_read_from_4( - page + UNIV_PAGE_SIZE - FIL_PAGE_END_LSN_OLD_CHKSUM); + bool valid; - bool valid = buf_page_is_checksum_valid_crc32( - page, checksum1, checksum2, false - /* FIXME: also try the original crc32 that was - buggy on big-endian architectures? */) - || buf_page_is_checksum_valid_innodb(page, checksum1, checksum2); + if (page_size.is_compressed()) { + valid = checksum1 == cchecksum1; + checksum2 = checksum1; + } else { + checksum2 = mach_read_from_4( + page + UNIV_PAGE_SIZE - FIL_PAGE_END_LSN_OLD_CHKSUM); + valid = buf_page_is_checksum_valid_crc32( + page, checksum1, checksum2, false + /* FIXME: also try the original crc32 that was + buggy on big-endian architectures? */) + || buf_page_is_checksum_valid_innodb( + page, checksum1, checksum2); + } if (encrypted && valid) { /* If page is encrypted and traditional checksums match, @@ -2597,7 +2639,7 @@ fil_space_verify_crypt_checksum( fprintf(log_file ? log_file : stderr, "Page " ULINTPF ":" ULINTPF " may be corrupted." " Post encryption checksum %u" - " stored [" ULINTPF ":" ULINTPF "] key_version %u\n", + " stored [%u:%u] key_version %u\n", space, offset, checksum, checksum1, checksum2, key_version); #else /* UNIV_INNOCHECKSUM */ diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index 7a169c0bf2c..f34619663ad 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -167,13 +167,13 @@ UNIV_INTERN extern ib_mutex_t fil_crypt_threads_mutex; /** Determine if the space id is a user tablespace id or not. @param[in] space_id Space ID to check @return true if it is a user tablespace ID */ -UNIV_INLINE +inline bool -fil_is_user_tablespace_id( - ulint space_id) +fil_is_user_tablespace_id(ulint space_id) { - return(space_id > srv_undo_tablespaces_open - && space_id != SRV_TMP_SPACE_ID); + return(space_id != TRX_SYS_SPACE + && space_id != SRV_TMP_SPACE_ID + && !srv_is_undo_tablespace(space_id)); } #ifdef UNIV_DEBUG @@ -306,7 +306,9 @@ fil_write( } /*******************************************************************//** -Returns the table space by a given id, NULL if not found. */ +Returns the table space by a given id, NULL if not found. +It is unsafe to dereference the returned pointer. It is fine to check +for NULL. */ fil_space_t* fil_space_get_by_id( /*================*/ @@ -324,13 +326,12 @@ fil_space_get_by_id( return(space); } -/*******************************************************************//** -Returns the table space by a given name, NULL if not found. */ -UNIV_INLINE +/** Look up a tablespace. +@param[in] name tablespace name +@return tablespace +@retval NULL if not found */ fil_space_t* -fil_space_get_by_name( -/*==================*/ - const char* name) /*!< in: space name */ +fil_space_get_by_name(const char* name) { fil_space_t* space; ulint fold; @@ -653,12 +654,8 @@ retry: FSP_HEADER_OFFSET + FSP_FREE + page); /* Try to read crypt_data from page 0 if it is not yet - read. FIXME: Remove page_0_crypt_read, and simply ensure in - fil_space_t object creation that node->size==0 if and only - if the crypt_data is not known and must be read. */ - if (!space->page_0_crypt_read) { - space->page_0_crypt_read = true; - ut_ad(space->crypt_data == NULL); + read. */ + if (!space->crypt_data) { space->crypt_data = fil_space_read_crypt_data( page_size_t(space->flags), page); } @@ -666,12 +663,12 @@ retry: ut_free(buf2); os_file_close(node->handle); - if (!fsp_flags_is_valid(flags)) { + if (!fsp_flags_is_valid(flags, space->id)) { ulint cflags = fsp_flags_convert_from_101(flags); if (cflags == ULINT_UNDEFINED) { ib::error() << "Expected tablespace flags " - << ib::hex(flags) + << ib::hex(space->flags) << " but found " << ib::hex(flags) << " in the file " << node->name; return(false); @@ -1008,7 +1005,7 @@ skip_flush: @param[in] size desired size in number of pages @param[out] success whether the operation succeeded @return whether the operation should be retried */ -static UNIV_COLD __attribute__((warn_unused_result, nonnull)) +static ATTRIBUTE_COLD __attribute__((warn_unused_result, nonnull)) bool fil_space_extend_must_retry( fil_space_t* space, @@ -1589,7 +1586,6 @@ Error messages are issued to the server log. @param[in] flags tablespace flags @param[in] purpose tablespace purpose @param[in,out] crypt_data encryption information -@param[in] create_table whether this is CREATE TABLE @param[in] mode encryption mode @return pointer to created tablespace, to be filled in with fil_node_create() @retval NULL on failure (such as when the same tablespace exists) */ @@ -1600,13 +1596,12 @@ fil_space_create( ulint flags, fil_type_t purpose, fil_space_crypt_t* crypt_data, - bool create_table, fil_encryption_t mode) { fil_space_t* space; ut_ad(fil_system); - ut_ad(fsp_flags_is_valid(flags & ~FSP_FLAGS_MEM_MASK)); + ut_ad(fsp_flags_is_valid(flags & ~FSP_FLAGS_MEM_MASK, id)); ut_ad(purpose == FIL_TYPE_LOG || srv_page_size == UNIV_PAGE_SIZE_ORIG || flags != 0); @@ -1665,16 +1660,8 @@ fil_space_create( space->magic_n = FIL_SPACE_MAGIC_N; space->crypt_data = crypt_data; - /* In create table we write page 0 so we have already - "read" it and for system tablespaces we have read - crypt data at startup. */ - if (create_table || crypt_data != NULL) { - space->page_0_crypt_read = true; - } - DBUG_LOG("tablespace", - "Tablespace for space " << id << " name " << name - << (create_table ? " created" : " opened")); + "Created metadata for " << id << " name " << name); if (crypt_data) { DBUG_LOG("crypt", "Tablespace " << id << " name " << name @@ -2276,7 +2263,7 @@ for concurrency control. @param[in] silent whether to silently ignore missing tablespaces @return the tablespace @retval NULL if missing or being deleted or truncated */ -inline +UNIV_INTERN fil_space_t* fil_space_acquire_low(ulint id, bool silent) { @@ -2302,30 +2289,6 @@ fil_space_acquire_low(ulint id, bool silent) return(space); } -/** Acquire a tablespace when it could be dropped concurrently. -Used by background threads that do not necessarily hold proper locks -for concurrency control. -@param[in] id tablespace ID -@return the tablespace -@retval NULL if missing or being deleted or truncated */ -fil_space_t* -fil_space_acquire(ulint id) -{ - return(fil_space_acquire_low(id, false)); -} - -/** Acquire a tablespace that may not exist. -Used by background threads that do not necessarily hold proper locks -for concurrency control. -@param[in] id tablespace ID -@return the tablespace -@retval NULL if missing or being deleted */ -fil_space_t* -fil_space_acquire_silent(ulint id) -{ - return(fil_space_acquire_low(id, true)); -} - /** Release a tablespace acquired with fil_space_acquire(). @param[in,out] space tablespace to release */ void @@ -2425,7 +2388,7 @@ fil_op_write_log( ulint len; ut_ad(first_page_no == 0); - ut_ad(fsp_flags_is_valid(flags)); + ut_ad(fsp_flags_is_valid(flags, space_id)); /* fil_name_parse() requires that there be at least one path separator and that the file path end with ".ibd". */ @@ -3102,7 +3065,7 @@ checked @return whether the table is accessible */ bool fil_table_accessible(const dict_table_t* table) { - if (UNIV_UNLIKELY(table->ibd_file_missing || table->corrupted)) { + if (UNIV_UNLIKELY(!table->is_readable() || table->corrupted)) { return(false); } @@ -3329,15 +3292,17 @@ fil_prepare_for_truncate( /** Reinitialize the original tablespace header with the same space id for single tablespace -@param[in] id space id of the tablespace +@param[in] table table belongs to tablespace @param[in] size size in blocks @param[in] trx Transaction covering truncate */ void -fil_reinit_space_header( - ulint id, +fil_reinit_space_header_for_table( + dict_table_t* table, ulint size, trx_t* trx) { + ulint id = table->space; + ut_a(!is_system_tablespace(id)); /* Invalidate in the buffer pool all pages belonging @@ -3346,6 +3311,9 @@ fil_reinit_space_header( and the dict operation lock during the scan and aquire it again after the buffer pool scan.*/ + /* Release the lock on the indexes too. So that + they won't violate the latch ordering. */ + dict_table_x_unlock_indexes(table); row_mysql_unlock_data_dictionary(trx); /* Lock the search latch in shared mode to prevent user @@ -3354,8 +3322,11 @@ fil_reinit_space_header( DEBUG_SYNC_C("buffer_pool_scan"); buf_LRU_flush_or_remove_pages(id, BUF_REMOVE_ALL_NO_WRITE, 0); btr_search_s_unlock_all(); + row_mysql_lock_data_dictionary(trx); + dict_table_x_lock_indexes(table); + /* Remove all insert buffer entries for the tablespace */ ibuf_delete_for_discarded_space(id); @@ -3816,9 +3787,9 @@ fil_ibd_create( ulint flags, ulint size, fil_encryption_t mode, - ulint key_id) + uint32_t key_id) { - os_file_t file; + pfs_os_file_t file; dberr_t err; byte* buf2; byte* page; @@ -3831,7 +3802,7 @@ fil_ibd_create( ut_ad(!srv_read_only_mode); ut_a(space_id < SRV_LOG_SPACE_FIRST_ID); ut_a(size >= FIL_IBD_FILE_INITIAL_SIZE); - ut_a(fsp_flags_is_valid(flags & ~FSP_FLAGS_MEM_MASK)); + ut_a(fsp_flags_is_valid(flags & ~FSP_FLAGS_MEM_MASK, space_id)); /* Create the subdirectories in the path, if they are not there already. */ @@ -3855,18 +3826,12 @@ fil_ibd_create( ib::error() << "Cannot create file '" << path << "'"; if (error == OS_FILE_ALREADY_EXISTS) { - ib::error() << "The file '" << path << "'" + ib::info() << "The file '" << path << "'" " already exists though the" " corresponding table did not exist" " in the InnoDB data dictionary." - " Have you moved InnoDB .ibd files" - " around without using the SQL commands" - " DISCARD TABLESPACE and IMPORT TABLESPACE," - " or did mysqld crash in the middle of" - " CREATE TABLE?" " You can resolve the problem by removing" - " the file '" << path - << "' under the 'datadir' of MySQL."; + " the file."; return(DB_TABLESPACE_EXISTS); } @@ -3880,17 +3845,21 @@ fil_ibd_create( success= false; #ifdef HAVE_POSIX_FALLOCATE - /* - Extend the file using posix_fallocate(). This is required by - FusionIO HW/Firmware but should also be the prefered way to extend - a file. - */ - int ret = posix_fallocate(file, 0, size * UNIV_PAGE_SIZE); + /* + Extend the file using posix_fallocate(). This is required by + FusionIO HW/Firmware but should also be the prefered way to extend + a file. + */ + int ret; + do { + ret = posix_fallocate(file, 0, size * UNIV_PAGE_SIZE); + } while (ret == EINTR + && srv_shutdown_state == SRV_SHUTDOWN_NONE); - if (ret == 0) { + if (ret == 0) { success = true; } else if (ret != EINVAL) { - ib::error() << + ib::error() << "posix_fallocate(): Failed to preallocate" " data for file " << path << ", desired size " @@ -4022,7 +3991,7 @@ fil_ibd_create( } space = fil_space_create(name, space_id, flags, FIL_TYPE_TABLESPACE, - crypt_data, true, mode); + crypt_data, mode); fil_node_t* node = NULL; @@ -4103,8 +4072,7 @@ fil_ibd_open( ulint id, ulint flags, const char* space_name, - const char* path_in, - dict_table_t* table) + const char* path_in) { dberr_t err = DB_SUCCESS; bool dict_filepath_same_as_default = false; @@ -4129,7 +4097,7 @@ fil_ibd_open( return(DB_CORRUPTION); } - ut_ad(fsp_flags_is_valid(flags & ~FSP_FLAGS_MEM_MASK)); + ut_ad(fsp_flags_is_valid(flags & ~FSP_FLAGS_MEM_MASK, id)); df_default.init(space_name, flags); df_dict.init(space_name, flags); df_remote.init(space_name, flags); @@ -4149,10 +4117,6 @@ fil_ibd_open( validate = true; ++tablespaces_found; link_file_found = true; - if (table) { - table->crypt_data = df_remote.get_crypt_info(); - table->page_0_read = true; - } } else if (df_remote.filepath() != NULL) { /* An ISL file was found but contained a bad filepath in it. Better validate anything we do find. */ @@ -4171,11 +4135,6 @@ fil_ibd_open( if (df_dict.open_read_only(true) == DB_SUCCESS) { ut_ad(df_dict.is_open()); ++tablespaces_found; - - if (table) { - table->crypt_data = df_dict.get_crypt_info(); - table->page_0_read = true; - } } } } @@ -4187,10 +4146,6 @@ fil_ibd_open( if (df_default.open_read_only(strict) == DB_SUCCESS) { ut_ad(df_default.is_open()); ++tablespaces_found; - if (table) { - table->crypt_data = df_default.get_crypt_info(); - table->page_0_read = true; - } } /* Check if multiple locations point to the same file. */ @@ -4300,12 +4255,14 @@ fil_ibd_open( df_default.close(); tablespaces_found--; } + if (df_dict.is_open() && !df_dict.is_valid()) { df_dict.close(); /* Leave dict.filepath so that SYS_DATAFILES can be corrected below. */ tablespaces_found--; } + if (df_remote.is_open() && !df_remote.is_valid()) { df_remote.close(); tablespaces_found--; @@ -4384,11 +4341,18 @@ fil_ibd_open( skip_validate: if (err == DB_SUCCESS) { - fil_space_t* space = fil_space_create( - space_name, id, flags, purpose, - df_remote.is_open() ? df_remote.get_crypt_info() : - df_dict.is_open() ? df_dict.get_crypt_info() : - df_default.get_crypt_info(), false); + const byte* first_page = + df_default.is_open() ? df_default.get_first_page() : + df_dict.is_open() ? df_dict.get_first_page() : + df_remote.get_first_page(); + + fil_space_crypt_t* crypt_data = first_page + ? fil_space_read_crypt_data(page_size_t(flags), + first_page) + : NULL; + + fil_space_t* space = fil_space_create( + space_name, id, flags, purpose, crypt_data); /* We do not measure the size of the file, that is why we pass the 0 below */ @@ -4687,7 +4651,7 @@ fil_ibd_load( break; } - /* Fall through to error handling */ + /* fall through */ case DB_TABLESPACE_EXISTS: return(FIL_LOAD_INVALID); @@ -4706,9 +4670,12 @@ fil_ibd_load( << FSP_FLAGS_MEM_COMPRESSION_LEVEL; } + const byte* first_page = file.get_first_page(); + fil_space_crypt_t* crypt_data = first_page + ? fil_space_read_crypt_data(page_size_t(flags), first_page) + : NULL; space = fil_space_create( - file.name(), space_id, flags, FIL_TYPE_TABLESPACE, - file.get_crypt_info(), false); + file.name(), space_id, flags, FIL_TYPE_TABLESPACE, crypt_data); if (space == NULL) { return(FIL_LOAD_INVALID); @@ -4788,10 +4755,10 @@ void fsp_flags_try_adjust(ulint space_id, ulint flags) { ut_ad(!srv_read_only_mode); - ut_ad(fsp_flags_is_valid(flags)); + ut_ad(fsp_flags_is_valid(flags, space_id)); mtr_t mtr; - mtr_start(&mtr); + mtr.start(); if (buf_block_t* b = buf_page_get( page_id_t(space_id, 0), page_size_t(flags), RW_X_LATCH, &mtr)) { @@ -4805,12 +4772,13 @@ fsp_flags_try_adjust(ulint space_id, ulint flags) << " to " << ib::hex(flags); } if (f != flags) { + mtr.set_named_space(space_id); mlog_write_ulint(FSP_HEADER_OFFSET + FSP_SPACE_FLAGS + b->frame, flags, MLOG_4BYTES, &mtr); } } - mtr_commit(&mtr); + mtr.commit(); } /** Determine if a matching tablespace exists in the InnoDB tablespace @@ -4824,7 +4792,6 @@ error log if a matching tablespace is not found from memory. @param[in] adjust_space Whether to adjust space id on mismatch @param[in] heap Heap memory @param[in] table_id table id -@param[in] table table @param[in] table_flags table flags @return true if a matching tablespace exists in the memory cache */ bool @@ -4835,7 +4802,6 @@ fil_space_for_table_exists_in_mem( bool adjust_space, mem_heap_t* heap, table_id_t table_id, - dict_table_t* table, ulint table_flags) { fil_space_t* fnamespace; @@ -4856,10 +4822,6 @@ fil_space_for_table_exists_in_mem( bool valid = space && !((space->flags ^ expected_flags) & ~FSP_FLAGS_MEM_MASK); - if (valid && table && !table->crypt_data) { - table->crypt_data = space->crypt_data; - } - if (!space) { } else if (!valid || space == fnamespace) { /* Found with the same file name, or got a flag mismatch. */ @@ -4921,7 +4883,7 @@ fil_space_for_table_exists_in_mem( " deleted or moved .ibd files?"; } error_exit: - ib::warn() << TROUBLESHOOT_DATADICT_MSG; + ib::info() << TROUBLESHOOT_DATADICT_MSG; valid = false; goto func_exit; } @@ -5168,23 +5130,16 @@ fil_report_invalid_page_access( ulint len, /*!< in: I/O length */ bool is_read) /*!< in: I/O type */ { - ib::error() - << "Trying to access page number " << block_offset << " in" + ib::fatal() + << "Trying to " << (is_read ? "read" : "write") + << " page number " << block_offset << " in" " space " << space_id << ", space name " << space_name << "," " which is outside the tablespace bounds. Byte offset " - << byte_offset << ", len " << len << ", i/o type " << - (is_read ? "read" : "write") - << ". If you get this error at mysqld startup, please check" - " that your my.cnf matches the ibdata files that you have in" - " the MySQL server."; - - ib::error() << "Server exits" -#ifdef UNIV_DEBUG - << " at " << __FILE__ << "[" << __LINE__ << "]" -#endif - << "."; - - _exit(1); + << byte_offset << ", len " << len << + (space_id == 0 && !srv_was_started + ? "Please check that the configuration matches" + " the InnoDB system tablespace location (ibdata files)" + : ""); } /** Reads or writes data. This operation could be asynchronous (aio). @@ -5203,6 +5158,7 @@ fil_report_invalid_page_access( aligned @param[in] message message for aio handler if non-sync aio used, else ignored +@param[in] ignore_missing_space true=ignore missing space duging read @return DB_SUCCESS, DB_TABLESPACE_DELETED or DB_TABLESPACE_TRUNCATED if we are trying to do i/o on a tablespace which does not exist */ dberr_t @@ -5214,7 +5170,8 @@ fil_io( ulint byte_offset, ulint len, void* buf, - void* message) + void* message, + bool ignore_missing_space) { os_offset_t offset; IORequest req_type(type); @@ -5293,7 +5250,7 @@ fil_io( mutex_exit(&fil_system->mutex); - if (!req_type.ignore_missing()) { + if (!req_type.ignore_missing() && !ignore_missing_space) { ib::error() << "Trying to do I/O to a tablespace which" " does not exist. I/O type: " @@ -5509,6 +5466,8 @@ fil_aio_wait( mutex_enter(&fil_system->mutex); fil_node_complete_io(node, type); + const fil_type_t purpose = node->space->purpose; + const ulint space_id = node->space->id; mutex_exit(&fil_system->mutex); @@ -5520,7 +5479,11 @@ fil_aio_wait( deadlocks in the i/o system. We keep tablespace 0 data files always open, and use a special i/o thread to serve insert buffer requests. */ - switch (node->space->purpose) { + switch (purpose) { + case FIL_TYPE_LOG: + srv_set_io_thread_op_info(segment, "complete io for log"); + log_io_complete(static_cast(message)); + return; case FIL_TYPE_TABLESPACE: case FIL_TYPE_TEMPORARY: case FIL_TYPE_IMPORT: @@ -5528,13 +5491,32 @@ fil_aio_wait( /* async single page writes from the dblwr buffer don't have access to the page */ - if (message != NULL) { - buf_page_io_complete(static_cast(message)); + buf_page_t* bpage = static_cast(message); + if (!bpage) { + return; + } + + ulint offset = bpage->id.page_no(); + dberr_t err = buf_page_io_complete(bpage); + if (err == DB_SUCCESS) { + return; + } + + ut_ad(type.is_read()); + if (recv_recovery_is_on() && !srv_force_recovery) { + recv_sys->found_corrupt_fs = true; + } + + if (fil_space_t* space = fil_space_acquire_for_io(space_id)) { + if (space == node->space) { + ib::error() << "Failed to read file '" + << node->name + << "' at offset " << offset + << ": " << ut_strerr(err); + } + + fil_space_release_for_io(space); } - return; - case FIL_TYPE_LOG: - srv_set_io_thread_op_info(segment, "complete io for log"); - log_io_complete(static_cast(message)); return; } @@ -5825,7 +5807,7 @@ fil_buf_block_init( } struct fil_iterator_t { - os_file_t file; /*!< File handle */ + pfs_os_file_t file; /*!< File handle */ const char* filepath; /*!< File path name */ os_offset_t start; /*!< From where to start */ os_offset_t end; /*!< Where to stop */ @@ -5867,18 +5849,15 @@ fil_iterate( ut_ad(!srv_read_only_mode); - /* For old style compressed tables we do a lot of useless copying - for non-index pages. Unfortunately, it is required by - buf_zip_decompress() */ - - ulint read_type = IORequest::READ; - ulint write_type = IORequest::WRITE; + /* TODO: For compressed tables we do a lot of useless + copying for non-index pages. Unfortunately, it is + required by buf_zip_decompress() */ + const bool row_compressed + = callback.get_page_size().is_compressed(); for (offset = iter.start; offset < iter.end; offset += n_bytes) { byte* io_buffer = iter.io_buffer; - const bool row_compressed - = callback.get_page_size().is_compressed(); block->frame = io_buffer; @@ -5898,8 +5877,6 @@ fil_iterate( /* Zip IO is done in the compressed page buffer. */ io_buffer = block->page.zip.data; - } else { - io_buffer = iter.io_buffer; } /* We have to read the exact number of bytes. Otherwise the @@ -5912,22 +5889,14 @@ fil_iterate( ut_ad(n_bytes > 0); ut_ad(!(n_bytes % iter.page_size)); - dberr_t err = DB_SUCCESS; - IORequest read_request(read_type); - - byte* readptr = io_buffer; - byte* writeptr = io_buffer; - bool encrypted = false; - + const bool encrypted = iter.crypt_data != NULL + && iter.crypt_data->should_encrypt(); /* Use additional crypt io buffer if tablespace is encrypted */ - if (iter.crypt_data != NULL && iter.crypt_data->should_encrypt()) { - - encrypted = true; - readptr = iter.crypt_io_buffer; - writeptr = iter.crypt_io_buffer; - } - - err = os_file_read( + byte* const readptr = encrypted + ? iter.crypt_io_buffer : io_buffer; + byte* const writeptr = readptr; + IORequest read_request(IORequest::READ); + dberr_t err = os_file_read( read_request, iter.file, readptr, offset, (ulint) n_bytes); @@ -5952,9 +5921,9 @@ fil_iterate( ulint page_type = mach_read_from_2(src+FIL_PAGE_TYPE); - bool page_compressed = - (page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED - || page_type == FIL_PAGE_PAGE_COMPRESSED); + const bool page_compressed + = page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED + || page_type == FIL_PAGE_PAGE_COMPRESSED; /* If tablespace is encrypted, we need to decrypt the page. Note that tablespaces are not in @@ -6056,8 +6025,7 @@ fil_iterate( dict_table_page_compression_level(iter.table), 512,/* FIXME: use proper block size */ encrypted, - &len, - NULL); + &len); if (len != size) { memset(res+len, 0, size-len); @@ -6099,7 +6067,7 @@ fil_iterate( block->frame += iter.page_size; } - IORequest write_request(write_type); + IORequest write_request(IORequest::WRITE); /* A page was updated in the set, write back to disk. Note: We don't have the compression algorithm, we write @@ -6136,7 +6104,7 @@ fil_tablespace_iterate( PageCallback& callback) { dberr_t err; - os_file_t file; + pfs_os_file_t file; char* filepath; bool success; @@ -6920,8 +6888,8 @@ fil_space_keyrotate_next( or dropped or truncated. Note that rotation_list contains only space->purpose == FIL_TYPE_TABLESPACE. */ while (space != NULL - && (UT_LIST_GET_LEN(space->chain) == 0 - || space->is_stopping())) { + && (UT_LIST_GET_LEN(space->chain) == 0 + || space->is_stopping())) { old = space; space = UT_LIST_GET_NEXT(rotation_list, space); @@ -6952,9 +6920,10 @@ fil_space_get_block_size(const fil_space_t* space, unsigned offset) node = UT_LIST_GET_NEXT(chain, node)) { block_size = node->block_size; if (node->size > offset) { + ut_ad(node->size <= 0xFFFFFFFFU); break; } - offset -= node->size; + offset -= static_cast(node->size); } /* Currently supporting block size up to 4K, diff --git a/storage/innobase/fil/fil0pagecompress.cc b/storage/innobase/fil/fil0pagecompress.cc index cb3e50745a7..58fbb4cd9ef 100644 --- a/storage/innobase/fil/fil0pagecompress.cc +++ b/storage/innobase/fil/fil0pagecompress.cc @@ -93,17 +93,16 @@ fil_compress_page( ulint level, /* in: compression level */ ulint block_size, /*!< in: block size */ bool encrypted, /*!< in: is page also encrypted */ - ulint* out_len, /*!< out: actual length of compressed + ulint* out_len) /*!< out: actual length of compressed page */ - byte* lzo_mem) /*!< in: temporal memory used by LZO */ { int err = Z_OK; int comp_level = int(level); ulint header_len = FIL_PAGE_DATA + FIL_PAGE_COMPRESSED_SIZE; - ulint write_size=0; + ulint write_size = 0; /* Cache to avoid change during function execution */ ulint comp_method = innodb_compression_algorithm; - bool allocated=false; + bool allocated = false; /* page_compression does not apply to tables or tablespaces that use ROW_FORMAT=COMPRESSED */ @@ -115,13 +114,23 @@ fil_compress_page( if (!out_buf) { allocated = true; - out_buf = static_cast(ut_malloc_nokey(UNIV_PAGE_SIZE)); -#ifdef HAVE_LZO - if (comp_method == PAGE_LZO_ALGORITHM) { - lzo_mem = static_cast(ut_malloc_nokey(LZO1X_1_15_MEM_COMPRESS)); - memset(lzo_mem, 0, LZO1X_1_15_MEM_COMPRESS); + ulint size = UNIV_PAGE_SIZE; + + /* Both snappy and lzo compression methods require that + output buffer used for compression is bigger than input + buffer. Increase the allocated buffer size accordingly. */ +#if HAVE_SNAPPY + if (comp_method == PAGE_SNAPPY_ALGORITHM) { + size = snappy_max_compressed_length(size); } #endif +#if HAVE_LZO + if (comp_method == PAGE_LZO_ALGORITHM) { + size += LZO1X_1_15_MEM_COMPRESS; + } +#endif + + out_buf = static_cast(ut_malloc_nokey(size)); } ut_ad(buf); @@ -173,7 +182,7 @@ fil_compress_page( #ifdef HAVE_LZO case PAGE_LZO_ALGORITHM: err = lzo1x_1_15_compress( - buf, len, out_buf+header_len, &write_size, lzo_mem); + buf, len, out_buf+header_len, &write_size, out_buf+UNIV_PAGE_SIZE); if (err != LZO_E_OK || write_size > UNIV_PAGE_SIZE-header_len) { goto err_exit; @@ -229,6 +238,7 @@ fil_compress_page( case PAGE_SNAPPY_ALGORITHM: { snappy_status cstatus; + write_size = snappy_max_compressed_length(UNIV_PAGE_SIZE); cstatus = snappy_compress( (const char *)buf, @@ -303,7 +313,8 @@ fil_compress_page( if (buf_page_is_corrupted(false, uncomp_page, univ_page_size, space)) { - buf_page_print(uncomp_page, univ_page_size, 0); + buf_page_print(uncomp_page, univ_page_size); + ut_ad(0); } ut_free(comp_page); @@ -380,11 +391,6 @@ err_exit: exit_free: if (allocated) { ut_free(out_buf); -#ifdef HAVE_LZO - if (comp_method == PAGE_LZO_ALGORITHM) { - ut_free(lzo_mem); - } -#endif } return (buf); @@ -443,13 +449,14 @@ fil_decompress_page( /* Before actual decompress, make sure that page type is correct */ - if (mach_read_from_4(buf+FIL_PAGE_SPACE_OR_CHKSUM) != BUF_NO_CHECKSUM_MAGIC) { - ib::error() << "Corruption: We try to uncompress corrupted page:" - << " CRC " - << mach_read_from_4(buf+FIL_PAGE_SPACE_OR_CHKSUM) - << " page_type " - << mach_read_from_2(buf+FIL_PAGE_TYPE) - << " page len " << len << "."; + if (mach_read_from_4(buf+FIL_PAGE_SPACE_OR_CHKSUM) + != BUF_NO_CHECKSUM_MAGIC + || (ptype != FIL_PAGE_PAGE_COMPRESSED + && ptype != FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED)) { + ib::error() << "Corruption: We try to uncompress corrupted " + "page CRC " + << mach_read_from_4(buf+FIL_PAGE_SPACE_OR_CHKSUM) + << " type " << ptype << " len " << len << "."; if (return_error) { goto error_return; @@ -515,7 +522,7 @@ fil_decompress_page( #endif /* HAVE_LZ4 */ #ifdef HAVE_LZO case PAGE_LZO_ALGORITHM: { - ulint olen=0; + ulint olen = 0; err = lzo1x_decompress((const unsigned char *)buf+header_len, actual_size,(unsigned char *)in_buf, &olen, NULL); @@ -586,7 +593,7 @@ fil_decompress_page( case PAGE_SNAPPY_ALGORITHM: { snappy_status cstatus; - ulint olen = 0; + ulint olen = UNIV_PAGE_SIZE; cstatus = snappy_uncompress( (const char *)(buf+header_len), @@ -602,6 +609,7 @@ fil_decompress_page( goto error_return; } } + break; } #endif /* HAVE_SNAPPY */ @@ -620,8 +628,7 @@ fil_decompress_page( memcpy(buf, in_buf, len); error_return: - // Need to free temporal buffer if no buffer was given - if (page_buf == NULL) { + if (page_buf != in_buf) { ut_free(in_buf); } @@ -642,6 +649,7 @@ err_exit: << " compression method: " << fil_get_compression_alg_name(compression_alg) << "."; - buf_page_print(buf, univ_page_size, 0); + buf_page_print(buf, univ_page_size); fil_space_release_for_io(space); + ut_ad(0); } diff --git a/storage/innobase/fsp/fsp0file.cc b/storage/innobase/fsp/fsp0file.cc index b8ad49a254f..c21c9497735 100644 --- a/storage/innobase/fsp/fsp0file.cc +++ b/storage/innobase/fsp/fsp0file.cc @@ -58,11 +58,6 @@ Datafile::shutdown() ut_free(m_name); m_name = NULL; - - /* The fil_space_t::crypt_data was freed in - fil_space_free_low(). Invalidate our redundant pointer. */ - m_crypt_info = NULL; - free_filepath(); free_first_page(); } @@ -334,6 +329,8 @@ Datafile::read_first_page(bool read_only_mode) break; + } else if (srv_operation == SRV_OPERATION_BACKUP) { + break; } else { ib::error() @@ -351,7 +348,7 @@ Datafile::read_first_page(bool read_only_mode) if (m_order == 0) { m_space_id = fsp_header_get_space_id(m_first_page); m_flags = fsp_header_get_flags(m_first_page); - if (!fsp_flags_is_valid(m_flags)) { + if (!fsp_flags_is_valid(m_flags, m_space_id)) { ulint cflags = fsp_flags_convert_from_101(m_flags); if (cflags == ULINT_UNDEFINED) { ib::error() @@ -372,8 +369,6 @@ Datafile::read_first_page(bool read_only_mode) return(DB_CORRUPTION); } - m_crypt_info = fil_space_read_crypt_data(ps, m_first_page); - return(err); } @@ -425,13 +420,10 @@ Datafile::validate_to_dd(ulint space_id, ulint flags) /* else do not use this tablespace. */ m_is_valid = false; - ib::error() << "In file '" << m_filepath << "', tablespace id and" - " flags are " << m_space_id << " and " << ib::hex(m_flags) - << ", but in the InnoDB data dictionary they are " - << space_id << " and " << ib::hex(flags) - << ". Have you moved InnoDB .ibd files around without" - " using the commands DISCARD TABLESPACE and IMPORT TABLESPACE?" - " " << TROUBLESHOOT_DATADICT_MSG; + ib::error() << "Refusing to load '" << m_filepath << "' (id=" + << m_space_id << ", flags=" << ib::hex(m_flags) + << "); dictionary contains id=" + << space_id << ", flags=" << ib::hex(flags); return(DB_ERROR); } @@ -525,9 +517,7 @@ Datafile::validate_first_page(lsn_t* flush_lsn) } /* Check if the whole page is blank. */ - if (error_txt == NULL - && m_space_id == srv_sys_space.space_id() - && !m_flags) { + if (error_txt == NULL && !m_space_id && !m_flags) { const byte* b = m_first_page; ulint nonzero_bytes = UNIV_PAGE_SIZE; @@ -559,7 +549,7 @@ Datafile::validate_first_page(lsn_t* flush_lsn) free_first_page(); return(DB_ERROR); - } else if (!fsp_flags_is_valid(m_flags)) { + } else if (!fsp_flags_is_valid(m_flags, m_space_id)) { /* Tablespace flags must be valid. */ error_txt = "Tablespace flags are invalid"; } else if (page_get_page_no(m_first_page) != 0) { @@ -800,7 +790,7 @@ Datafile::restore_from_doublewrite() ulint flags = mach_read_from_4( FSP_HEADER_OFFSET + FSP_SPACE_FLAGS + page); - if (!fsp_flags_is_valid(flags)) { + if (!fsp_flags_is_valid(flags, m_space_id)) { ulint cflags = fsp_flags_convert_from_101(flags); if (cflags == ULINT_UNDEFINED) { ib::warn() diff --git a/storage/innobase/fsp/fsp0fsp.cc b/storage/innobase/fsp/fsp0fsp.cc index 57b6c8de825..80303314d9f 100644 --- a/storage/innobase/fsp/fsp0fsp.cc +++ b/storage/innobase/fsp/fsp0fsp.cc @@ -102,7 +102,7 @@ then we will not allocate more extents @param[in,out] space tablespace @param[in,out] header tablespace header @param[in,out] mtr mini-transaction */ -static UNIV_COLD +static ATTRIBUTE_COLD void fsp_fill_free_list( bool init_space, @@ -436,7 +436,8 @@ xdes_get_descriptor_with_space_hdr( && (init_space || space->purpose == FIL_TYPE_TEMPORARY || (srv_startup_is_before_trx_rollback_phase - && space->id <= srv_undo_tablespaces)))); + && (space->id == TRX_SYS_SPACE + || srv_is_undo_tablespace(space->id)))))); ut_ad(size == space->size_in_header); if ((offset >= size) || (offset >= limit)) { @@ -506,6 +507,51 @@ xdes_get_descriptor( sp_header, space, offset, mtr)); } +/** Get the extent descriptor of a page. +The page where the extent descriptor resides is x-locked. If the page +offset is equal to the free limit of the space, we will add new +extents from above the free limit to the space free list, if not free +limit == space size. This adding is necessary to make the descriptor +defined, as they are uninitialized above the free limit. +@param[in] space tablespace +@param[in] page descriptor page offset +@param[in] offset page offset +@param[in] page_size page size +@param[in,out] mtr mini-transaction +@return the extent descriptor +@retval NULL if the descriptor is not available */ +MY_ATTRIBUTE((warn_unused_result)) +static +const xdes_t* +xdes_get_descriptor_const( + const fil_space_t* space, + page_no_t page, + page_no_t offset, + const page_size_t& page_size, + mtr_t* mtr) +{ + ut_ad(mtr_memo_contains(mtr, &space->latch, MTR_MEMO_S_LOCK)); + ut_ad(offset < space->free_limit); + ut_ad(offset < space->size_in_header); + + if (buf_block_t* block = buf_page_get(page_id_t(space->id, page), + page_size, RW_S_LATCH, mtr)) { + buf_block_dbg_add_level(block, SYNC_FSP_PAGE); + + ut_ad(page != 0 || space->free_limit == mach_read_from_4( + FSP_FREE_LIMIT + FSP_HEADER_OFFSET + + block->frame)); + ut_ad(page != 0 || space->size_in_header == mach_read_from_4( + FSP_SIZE + FSP_HEADER_OFFSET + + block->frame)); + + return(block->frame + XDES_ARR_OFFSET + XDES_SIZE + * xdes_calc_descriptor_index(page_size, offset)); + } + + return(NULL); +} + /** Get a pointer to the extent descriptor. The page where the extent descriptor resides is x-locked. @param[in] space tablespace @@ -611,25 +657,31 @@ fsp_space_modify_check( #endif /* UNIV_DEBUG */ /** Initialize a file page. -@param[in] space tablespace @param[in,out] block file page @param[in,out] mtr mini-transaction */ -MY_ATTRIBUTE((nonnull)) static void -fsp_init_file_page( - const fil_space_t* space MY_ATTRIBUTE((unused)), - buf_block_t* block, - mtr_t* mtr) +fsp_init_file_page(buf_block_t* block, mtr_t* mtr) { - ut_d(fsp_space_modify_check(space, mtr)); - ut_ad(space->id == block->page.id.space()); fsp_init_file_page_low(block); mlog_write_initial_log_record(buf_block_get_frame(block), MLOG_INIT_FILE_PAGE2, mtr); } +#ifdef UNIV_DEBUG +static +void +fsp_init_file_page(const fil_space_t* space, buf_block_t* block, mtr_t* mtr) +{ + ut_d(fsp_space_modify_check(space, mtr)); + ut_ad(space->id == block->page.id.space()); + fsp_init_file_page(block, mtr); +} +#else /* UNIV_DEBUG */ +# define fsp_init_file_page(space, block, mtr) fsp_init_file_page(block, mtr) +#endif + /***********************************************************//** Parses a redo log record of a file page init. @return end of log record or NULL */ @@ -682,7 +734,7 @@ fsp_header_init_fields( ulint flags) /*!< in: tablespace flags (FSP_SPACE_FLAGS) */ { flags &= ~FSP_FLAGS_MEM_MASK; - ut_a(fsp_flags_is_valid(flags)); + ut_a(fsp_flags_is_valid(flags, space_id)); mach_write_to_4(FSP_HEADER_OFFSET + FSP_SPACE_ID + page, space_id); @@ -690,17 +742,12 @@ fsp_header_init_fields( flags); } -/** Initializes the space header of a new created space and creates also the -insert buffer tree root if space == 0. +/** Initialize a tablespace header. @param[in] space_id space id @param[in] size current size in blocks -@param[in,out] mtr min-transaction -@return true on success, otherwise false. */ -bool -fsp_header_init( - ulint space_id, - ulint size, - mtr_t* mtr) +@param[in,out] mtr mini-transaction */ +void +fsp_header_init(ulint space_id, ulint size, mtr_t* mtr) { fsp_header_t* header; buf_block_t* block; @@ -752,19 +799,13 @@ fsp_header_init( fsp_fill_free_list(!is_system_tablespace(space_id), space, header, mtr); - if (space_id == srv_sys_space.space_id()) { - if (btr_create(DICT_CLUSTERED | DICT_UNIVERSAL | DICT_IBUF, - 0, univ_page_size, DICT_IBUF_ID_MIN + space_id, - dict_ind_redundant, NULL, mtr) == FIL_NULL) { - return(false); - } - } - - if (space->crypt_data) { + /* Write encryption metadata to page 0 if tablespace is + encrypted or encryption is disabled by table option. */ + if (space->crypt_data && + (space->crypt_data->should_encrypt() || + space->crypt_data->not_encrypted())) { space->crypt_data->write_page0(space, page, mtr); } - - return(true); } /**********************************************************************//** @@ -858,7 +899,7 @@ data file. @param[in,out] header tablespace header @param[in,out] mtr mini-transaction @return true if success */ -static UNIV_COLD MY_ATTRIBUTE((warn_unused_result)) +static ATTRIBUTE_COLD __attribute__((warn_unused_result)) bool fsp_try_extend_data_file_with_pages( fil_space_t* space, @@ -889,14 +930,12 @@ fsp_try_extend_data_file_with_pages( @param[in,out] space tablespace @param[in,out] header tablespace header @param[in,out] mtr mini-transaction -@return whether the tablespace was extended */ -static UNIV_COLD MY_ATTRIBUTE((nonnull)) +@return number of pages added +@retval 0 if the tablespace was not extended */ +ATTRIBUTE_COLD __attribute__((nonnull)) +static ulint -fsp_try_extend_data_file( - fil_space_t* space, - fsp_header_t* header, - mtr_t* mtr, - ulint* n_pages_added) +fsp_try_extend_data_file(fil_space_t* space, fsp_header_t* header, mtr_t* mtr) { ulint size; /* current number of pages in the datafile */ ulint size_increase; /* number of pages to extend this file */ @@ -919,7 +958,7 @@ fsp_try_extend_data_file( << " innodb_data_file_path."; srv_sys_space.set_tablespace_full_status(true); } - return(false); + return(0); } else if (fsp_is_system_temporary(space->id) && !srv_tmp_space.can_auto_extend_last_file()) { @@ -933,7 +972,7 @@ fsp_try_extend_data_file( << " innodb_temp_data_file_path."; srv_tmp_space.set_tablespace_full_status(true); } - return(false); + return(0); } size = mach_read_from_4(header + FSP_SIZE); @@ -956,7 +995,7 @@ fsp_try_extend_data_file( /* Let us first extend the file to extent_size */ if (!fsp_try_extend_data_file_with_pages( space, extent_pages - 1, header, mtr)) { - return(false); + return(0); } size = extent_pages; @@ -966,16 +1005,13 @@ fsp_try_extend_data_file( } if (size_increase == 0) { - - return(false); + return(0); } if (!fil_space_extend(space, size + size_increase)) { - return(false); + return(0); } - *n_pages_added = size_increase; - /* We ignore any fragments of a full megabyte when storing the size to the space header */ @@ -985,7 +1021,7 @@ fsp_try_extend_data_file( mlog_write_ulint( header + FSP_SIZE, space->size_in_header, MLOG_4BYTES, mtr); - return(true); + return(size_increase); } /** Calculate the number of pages to extend a datafile. @@ -1077,8 +1113,7 @@ fsp_fill_free_list( } if (!skip_resize) { - ulint n_pages = 0; - fsp_try_extend_data_file(space, header, mtr, &n_pages); + fsp_try_extend_data_file(space, header, mtr); size = space->size_in_header; } } @@ -2076,15 +2111,6 @@ fseg_create_general( fil_block_check_type(block, type, mtr); } - if (rw_lock_get_x_lock_count(&space->latch) == 1) { - /* This thread did not own the latch before this call: free - excess pages from the insert buffer free list */ - - if (space_id == IBUF_SPACE_ID) { - ibuf_free_excess_pages(); - } - } - if (!has_done_reservation && !fsp_reserve_free_extents(&n_reserved, space_id, 2, FSP_NORMAL, mtr)) { @@ -2096,7 +2122,6 @@ fseg_create_general( inode = fsp_alloc_seg_inode(space, space_header, mtr); if (inode == NULL) { - goto funct_exit; } @@ -2669,15 +2694,6 @@ fseg_alloc_free_page_general( space = mtr_x_lock_space(space_id, mtr); const page_size_t page_size(space->flags); - if (rw_lock_get_x_lock_count(&space->latch) == 1) { - /* This thread did not own the latch before this call: free - excess pages from the insert buffer free list */ - - if (space_id == IBUF_SPACE_ID) { - ibuf_free_excess_pages(); - } - } - inode = fseg_inode_get(seg_header, space_id, page_size, mtr, &iblock); fil_block_check_type(iblock, FIL_PAGE_INODE, mtr); @@ -2800,8 +2816,6 @@ fsp_reserve_free_extents( ulint n_free_up; ulint reserve; size_t total_reserved = 0; - ulint rounds = 0; - ulint n_pages_added = 0; ut_ad(mtr); *n_reserved = n_ext; @@ -2882,23 +2896,8 @@ try_again: return(true); } try_to_extend: - n_pages_added = 0; - - if (fsp_try_extend_data_file(space, space_header, mtr, &n_pages_added)) { - - rounds++; - total_reserved += n_pages_added; - - if (rounds > 10) { - ib::info() << "Space id: " - << space << " trying to reserve: " - << n_ext << " extents actually reserved: " - << n_pages_added << " reserve: " - << reserve << " free: " << n_free - << " size: " << size - << " rounds: " << rounds - << " total_reserved: " << total_reserved << "."; - } + if (ulint n = fsp_try_extend_data_file(space, space_header, mtr)) { + total_reserved += n; goto try_again; } @@ -3188,39 +3187,31 @@ fseg_free_page_func( DBUG_VOID_RETURN; } -/**********************************************************************//** -Checks if a single page of a segment is free. -@return true if free */ +/** Determine whether a page is free. +@param[in,out] space tablespace +@param[in] page page number +@return whether the page is marked as free */ bool -fseg_page_is_free( -/*==============*/ - fseg_header_t* seg_header, /*!< in: segment header */ - ulint space_id, /*!< in: space id */ - ulint page) /*!< in: page offset */ +fseg_page_is_free(fil_space_t* space, unsigned page) { + bool is_free; mtr_t mtr; - ibool is_free; - xdes_t* descr; - fseg_inode_t* seg_inode; + page_size_t page_size(space->flags); + page_no_t dpage = xdes_calc_descriptor_page(page_size, page); - mtr_start(&mtr); - const fil_space_t* space = mtr_x_lock_space(space_id, &mtr); - const page_size_t page_size(space->flags); + mtr.start(); + mtr_s_lock(&space->latch, &mtr); - seg_inode = fseg_inode_get(seg_header, space_id, page_size, &mtr); - - ut_a(seg_inode); - ut_ad(mach_read_from_4(seg_inode + FSEG_MAGIC_N) - == FSEG_MAGIC_N_VALUE); - ut_ad(!((page_offset(seg_inode) - FSEG_ARR_OFFSET) % FSEG_INODE_SIZE)); - - descr = xdes_get_descriptor(space, page, page_size, &mtr); - ut_a(descr); - - is_free = xdes_mtr_get_bit( - descr, XDES_FREE_BIT, page % FSP_EXTENT_SIZE, &mtr); - - mtr_commit(&mtr); + if (page >= space->free_limit || page >= space->size_in_header) { + is_free = true; + } else if (const xdes_t* descr = xdes_get_descriptor_const( + space, dpage, page, page_size, &mtr)) { + is_free = xdes_get_bit(descr, XDES_FREE_BIT, + page % FSP_EXTENT_SIZE); + } else { + is_free = true; + } + mtr.commit(); return(is_free); } @@ -3602,28 +3593,3 @@ fseg_header::to_stream(std::ostream& out) const return(out); } #endif /* UNIV_DEBUG */ - -/**********************************************************************//** -Checks if a single page is free. -@return true if free */ -UNIV_INTERN -bool -fsp_page_is_free_func( -/*==============*/ - ulint space_id, /*!< in: space id */ - ulint page_no, /*!< in: page offset */ - mtr_t* mtr, /*!< in/out: mini-transaction */ - const char *file, - unsigned line) -{ - ut_ad(mtr); - - fil_space_t* space = mtr_x_lock_space(space_id, mtr); - const page_size_t page_size(space->flags); - - xdes_t* descr = xdes_get_descriptor(space, page_no, page_size, mtr); - ut_a(descr); - - return xdes_mtr_get_bit( - descr, XDES_FREE_BIT, page_no % FSP_EXTENT_SIZE, mtr); -} diff --git a/storage/innobase/fsp/fsp0space.cc b/storage/innobase/fsp/fsp0space.cc index 76269a749f9..9ca2786b935 100644 --- a/storage/innobase/fsp/fsp0space.cc +++ b/storage/innobase/fsp/fsp0space.cc @@ -39,11 +39,8 @@ bool Tablespace::intersection( const Tablespace* other_space) { - files_t::const_iterator end = other_space->m_files.end(); - - for (files_t::const_iterator it = other_space->m_files.begin(); - it != end; - ++it) { + for (files_t::const_iterator it(other_space->begin()), + end(other_space->end()); it != end; ++it) { if (find(it->m_filename)) { @@ -58,14 +55,13 @@ Tablespace::intersection( void Tablespace::shutdown() { - files_t::iterator end = m_files.end(); - - for (files_t::iterator it = m_files.begin(); it != end; ++it) { + for (iterator it = begin(); it != end(); ++it) { it->shutdown(); } m_files.clear(); - + ut_free(m_path); + m_path = NULL; m_space_id = ULINT_UNDEFINED; } @@ -94,10 +90,7 @@ Tablespace::open_or_create(bool is_temp) ut_ad(!m_files.empty()); - files_t::iterator begin = m_files.begin(); - files_t::iterator end = m_files.end(); - - for (files_t::iterator it = begin; it != end; ++it) { + for (iterator it = begin(); it != end(); ++it) { if (it->m_exists) { err = it->open_or_create( @@ -123,7 +116,7 @@ Tablespace::open_or_create(bool is_temp) the proper way. */ it->close(); - if (it == begin) { + if (it == begin()) { /* First data file. */ /* Create the tablespace entry for the multi-file @@ -132,8 +125,7 @@ Tablespace::open_or_create(bool is_temp) m_name, m_space_id, FSP_FLAGS_PAGE_SSIZE(), is_temp ? FIL_TYPE_TEMPORARY : FIL_TYPE_TABLESPACE, - it->m_crypt_info, - false); + NULL); } ut_a(fil_validate()); @@ -154,11 +146,9 @@ Tablespace::open_or_create(bool is_temp) /** Find a filename in the list of Datafiles for a tablespace @return true if the filename exists in the data files */ bool -Tablespace::find(const char* filename) +Tablespace::find(const char* filename) const { - files_t::const_iterator end = m_files.end(); - - for (files_t::const_iterator it = m_files.begin(); it != end; ++it) { + for (const_iterator it = begin(); it != end(); ++it) { if (innobase_strcasecmp(filename, it->m_filename) == 0) { return(true); @@ -172,9 +162,7 @@ Tablespace::find(const char* filename) void Tablespace::delete_files() { - files_t::iterator end = m_files.end(); - - for (files_t::iterator it = m_files.begin(); it != end; ++it) { + for (iterator it = begin(); it != end(); ++it) { it->close(); diff --git a/storage/innobase/fsp/fsp0sysspace.cc b/storage/innobase/fsp/fsp0sysspace.cc index 974140fe565..cc156a5353a 100644 --- a/storage/innobase/fsp/fsp0sysspace.cc +++ b/storage/innobase/fsp/fsp0sysspace.cc @@ -562,8 +562,6 @@ SysTablespace::read_lsn_and_check_flags(lsn_t* flushed_lsn) err = it->read_first_page( m_ignore_read_only ? false : srv_read_only_mode); - m_crypt_info = it->m_crypt_info; - if (err != DB_SUCCESS) { return(err); } @@ -834,17 +832,6 @@ SysTablespace::check_file_spec( } } - /* We assume doublewirte blocks in the first data file. */ - if (err == DB_SUCCESS && *create_new_db - && begin->m_size < TRX_SYS_DOUBLEWRITE_BLOCK_SIZE * 3) { - ib::error() << "The " << name() << " data file " - << "'" << begin->name() << "' must be at least " - << TRX_SYS_DOUBLEWRITE_BLOCK_SIZE * 3 * UNIV_PAGE_SIZE - / (1024 * 1024) << " MB"; - - err = DB_ERROR; - } - return(err); } @@ -930,19 +917,10 @@ SysTablespace::open_or_create( /* Create the tablespace entry for the multi-file tablespace in the tablespace manager. */ - - if (!m_crypt_info) { - /* Create default crypt info for system - tablespace if it does not yet exists. */ - m_crypt_info = fil_space_create_crypt_data( - FIL_ENCRYPTION_DEFAULT, - FIL_DEFAULT_ENCRYPTION_KEY); - } - space = fil_space_create( name(), space_id(), flags(), is_temp - ? FIL_TYPE_TEMPORARY : FIL_TYPE_TABLESPACE, m_crypt_info, - false); + ? FIL_TYPE_TEMPORARY : FIL_TYPE_TABLESPACE, + NULL); } ut_a(fil_validate()); diff --git a/storage/innobase/fts/fts0fts.cc b/storage/innobase/fts/fts0fts.cc index 79020fb4442..60cc3c91fef 100644 --- a/storage/innobase/fts/fts0fts.cc +++ b/storage/innobase/fts/fts0fts.cc @@ -1200,7 +1200,6 @@ fts_tokenizer_word_get( /* If it is a stopword, do not index it */ if (!fts_check_token(text, cache->stopword_info.cached_stopword, - index_cache->index->is_ngram, index_cache->charset)) { return(NULL); @@ -1716,21 +1715,6 @@ fts_drop_tables( return(error); } -/** Extract only the required flags from table->flags2 for FTS Aux -tables. -@param[in] in_flags2 Table flags2 -@return extracted flags2 for FTS aux tables */ -static inline -ulint -fts_get_table_flags2_for_aux_tables( - ulint flags2) -{ - /* Extract the file_per_table flag & temporary file flag - from the main FTS table flags2 */ - return((flags2 & DICT_TF2_USE_FILE_PER_TABLE) | - (flags2 & DICT_TF2_TEMPORARY)); -} - /** Create dict_table_t object for FTS Aux tables. @param[in] aux_table_name FTS Aux table name @param[in] table table object of FTS Index @@ -1745,7 +1729,9 @@ fts_create_in_mem_aux_table( { dict_table_t* new_table = dict_mem_table_create( aux_table_name, table->space, n_cols, 0, table->flags, - fts_get_table_flags2_for_aux_tables(table->flags2)); + table->space == TRX_SYS_SPACE + ? 0 : table->space == SRV_TMP_SPACE_ID + ? DICT_TF2_TEMPORARY : DICT_TF2_USE_FILE_PER_TABLE); if (DICT_TF_HAS_DATA_DIR(table->flags)) { ut_ad(table->data_dir_path != NULL); @@ -3241,7 +3227,6 @@ fts_query_expansion_fetch_doc( } doc.charset = doc_charset; - doc.is_ngram = result_doc->is_ngram; if (dfield_is_ext(dfield)) { /* We ignore columns that are stored externally, this @@ -3347,7 +3332,6 @@ fts_fetch_doc_from_rec( doc->found = TRUE; doc->charset = get_doc->index_cache->charset; - doc->is_ngram = index->is_ngram; /* Null Field */ if (doc->text.f_len == UNIV_SQL_NULL || doc->text.f_len == 0) { @@ -4379,13 +4363,10 @@ fts_sync_table( return(err); } -/** Check fts token -1. for ngram token, check whether the token contains any words in stopwords -2. for non-ngram token, check if it's stopword or less than fts_min_token_size +/** Check if a fts token is a stopword or less than fts_min_token_size or greater than fts_max_token_size. @param[in] token token string @param[in] stopwords stopwords rb tree -@param[in] is_ngram is ngram parser @param[in] cs token charset @retval true if it is not stopword and length in range @retval false if it is stopword or lenght not in range */ @@ -4393,96 +4374,16 @@ bool fts_check_token( const fts_string_t* token, const ib_rbt_t* stopwords, - bool is_ngram, const CHARSET_INFO* cs) { ut_ad(cs != NULL || stopwords == NULL); - if (!is_ngram) { - ib_rbt_bound_t parent; + ib_rbt_bound_t parent; - if (token->f_n_char < fts_min_token_size - || token->f_n_char > fts_max_token_size - || (stopwords != NULL - && rbt_search(stopwords, &parent, token) == 0)) { - return(false); - } else { - return(true); - } - } - - /* Check token for ngram. */ - DBUG_EXECUTE_IF( - "fts_instrument_ignore_ngram_check", - return(true); - ); - - /* We ignore fts_min_token_size when ngram */ - ut_ad(token->f_n_char > 0 - && token->f_n_char <= fts_max_token_size); - - if (stopwords == NULL) { - return(true); - } - - /*Ngram checks whether the token contains any words in stopwords. - We can't simply use CONTAIN to search in stopwords, because it's - built on COMPARE. So we need to tokenize the token into words - from unigram to f_n_char, and check them separately. */ - for (ulint ngram_token_size = 1; ngram_token_size <= token->f_n_char; - ngram_token_size ++) { - const char* start; - const char* next; - const char* end; - ulint char_len; - ulint n_chars; - - start = reinterpret_cast(token->f_str); - next = start; - end = start + token->f_len; - n_chars = 0; - - while (next < end) { - char_len = my_charlen(cs, next, end); - - if (next + char_len > end || char_len == 0) { - break; - } else { - /* Skip SPACE */ - if (char_len == 1 && *next == ' ') { - start = next + 1; - next = start; - n_chars = 0; - - continue; - } - - next += char_len; - n_chars++; - } - - if (n_chars == ngram_token_size) { - fts_string_t ngram_token; - ngram_token.f_str = - reinterpret_cast( - const_cast(start)); - ngram_token.f_len = next - start; - ngram_token.f_n_char = ngram_token_size; - - ib_rbt_bound_t parent; - if (rbt_search(stopwords, &parent, - &ngram_token) == 0) { - return(false); - } - - /* Move a char forward */ - start += my_charlen(cs, start, end); - n_chars = ngram_token_size - 1; - } - } - } - - return(true); + return(token->f_n_char >= fts_min_token_size + && token->f_n_char <= fts_max_token_size + && (stopwords == NULL + || rbt_search(stopwords, &parent, token) != 0)); } /** Add the token and its start position to the token's list of positions. @@ -4499,8 +4400,7 @@ fts_add_token( /* Ignore string whose character number is less than "fts_min_token_size" or more than "fts_max_token_size" */ - if (fts_check_token(&str, NULL, result_doc->is_ngram, - result_doc->charset)) { + if (fts_check_token(&str, NULL, result_doc->charset)) { mem_heap_t* heap; fts_string_t t_str; @@ -7487,7 +7387,6 @@ fts_init_recover_doc( } doc.charset = get_doc->index_cache->charset; - doc.is_ngram = get_doc->index_cache->index->is_ngram; if (dfield_is_ext(dfield)) { dict_table_t* table = cache->sync->table; diff --git a/storage/innobase/fts/fts0plugin.cc b/storage/innobase/fts/fts0plugin.cc index e78dcdacfb9..b7a05deeb34 100644 --- a/storage/innobase/fts/fts0plugin.cc +++ b/storage/innobase/fts/fts0plugin.cc @@ -130,6 +130,7 @@ fts_query_add_word_for_parser( if (cur_node->type != FTS_AST_PARSER_PHRASE_LIST) { break; } + /* fall through */ case FT_TOKEN_WORD: term_node = fts_ast_create_node_term_for_parser( diff --git a/storage/innobase/fts/fts0que.cc b/storage/innobase/fts/fts0que.cc index bc1d173cc29..594f337c978 100644 --- a/storage/innobase/fts/fts0que.cc +++ b/storage/innobase/fts/fts0que.cc @@ -2430,7 +2430,8 @@ fts_query_terms_in_document( /*****************************************************************//** Retrieve the document and match the phrase tokens. @return DB_SUCCESS or error code */ -static MY_ATTRIBUTE((nonnull, warn_unused_result)) +MY_ATTRIBUTE((nonnull(1,2,3,6), warn_unused_result)) +static dberr_t fts_query_match_document( /*=====================*/ @@ -2692,7 +2693,6 @@ fts_query_phrase_split( if (fts_check_token( &result_str, cache->stopword_info.cached_stopword, - query->index->is_ngram, query->fts_index_table.charset)) { /* Add the word to the RB tree so that we can calculate it's frequencey within a document. */ @@ -4277,7 +4277,6 @@ fts_expand_query( result_doc.charset = index_cache->charset; result_doc.parser = index_cache->index->parser; - result_doc.is_ngram = index_cache->index->is_ngram; query->total_size += SIZEOF_RBT_CREATE; diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index c486b0d4c4d..f6b065e96b1 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 2000, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2000, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2013, 2017, MariaDB Corporation. Copyright (c) 2008, 2009 Google Inc. Copyright (c) 2009, Percona Inc. @@ -132,6 +132,13 @@ void destroy_thd(MYSQL_THD thd); void reset_thd(MYSQL_THD thd); TABLE *open_purge_table(THD *thd, const char *db, size_t dblen, const char *tb, size_t tblen); +TABLE *get_purge_table(THD *thd); + +/** Check if user has used xtradb extended system variable that +is not currently supported by innodb or marked as deprecated. */ +static +void +innodb_check_deprecated(void); #ifdef MYSQL_DYNAMIC_PLUGIN #define tc_size 400 @@ -206,7 +213,7 @@ static ulong innobase_commit_concurrency = 0; static ulong innobase_read_io_threads; static ulong innobase_write_io_threads; -static long long innobase_buffer_pool_size, innobase_log_file_size; +static long long innobase_buffer_pool_size; /** Percentage of the buffer pool to reserve for 'old' blocks. Connected to buf_LRU_old_ratio. */ @@ -284,6 +291,11 @@ void set_my_errno(int err) errno = err; } +static uint mysql_fields(const TABLE *table) +{ + return table->s->frm_version < FRM_VER_EXPRESSSIONS + ? table->s->stored_fields : table->s->fields; +} /** Checks whether the file name belongs to a partition of a table. @param[in] file_name file name @@ -339,16 +351,17 @@ thd_destructor_proxy(void *) mysql_mutex_unlock(&thd_destructor_mutex); srv_running = NULL; - if (srv_fast_shutdown == 0) { - while (trx_sys_any_active_transactions()) { - os_thread_sleep(1000); - } - - /* Some background threads might generate undo pages that will - need to be purged, so they have to be shut down before purge - threads if slow shutdown is requested. */ - srv_shutdown_bg_undo_sources(); + while (srv_fast_shutdown == 0 && + (trx_sys_any_active_transactions() || + (uint)thread_count > srv_n_purge_threads + 1)) { + thd_proc_info(thd, "InnoDB slow shutdown wait"); + os_thread_sleep(1000); } + + /* Some background threads might generate undo pages that will + need to be purged, so they have to be shut down before purge + threads if slow shutdown is requested. */ + srv_shutdown_bg_undo_sources(); srv_purge_wakeup(); destroy_thd(thd); @@ -401,7 +414,7 @@ static TYPELIB innodb_stats_method_typelib = { }; /** Possible values of the parameter innodb_checksum_algorithm */ -static const char* innodb_checksum_algorithm_names[] = { +const char* innodb_checksum_algorithm_names[] = { "crc32", "strict_crc32", "innodb", @@ -413,7 +426,7 @@ static const char* innodb_checksum_algorithm_names[] = { /** Used to define an enumerate type of the system variable innodb_checksum_algorithm. */ -static TYPELIB innodb_checksum_algorithm_typelib = { +TYPELIB innodb_checksum_algorithm_typelib = { array_elements(innodb_checksum_algorithm_names) - 1, "innodb_checksum_algorithm_typelib", innodb_checksum_algorithm_names, @@ -619,7 +632,6 @@ static PSI_mutex_info all_innodb_mutexes[] = { # endif /* UNIV_DEBUG */ PSI_KEY(rw_lock_list_mutex), PSI_KEY(rw_lock_mutex), - PSI_KEY(srv_dict_tmpfile_mutex), PSI_KEY(srv_innodb_monitor_mutex), PSI_KEY(srv_misc_tmpfile_mutex), PSI_KEY(srv_monitor_file_mutex), @@ -711,6 +723,7 @@ static PSI_file_info all_innodb_files[] = { static void innodb_remember_check_sysvar_funcs(); mysql_var_check_func check_sysvar_enum; +mysql_var_check_func check_sysvar_int; // should page compression be used by default for new tables static MYSQL_THDVAR_BOOL(compression_default, PLUGIN_VAR_OPCMDARG, @@ -1187,6 +1200,18 @@ static SHOW_VAR innodb_status_variables[]= { {"encryption_key_rotation_list_length", (char*)&export_vars.innodb_key_rotation_list_length, SHOW_LONGLONG}, + {"encryption_n_merge_blocks_encrypted", + (char*)&export_vars.innodb_n_merge_blocks_encrypted, + SHOW_LONGLONG}, + {"encryption_n_merge_blocks_decrypted", + (char*)&export_vars.innodb_n_merge_blocks_decrypted, + SHOW_LONGLONG}, + {"encryption_n_rowlog_blocks_encrypted", + (char*)&export_vars.innodb_n_rowlog_blocks_encrypted, + SHOW_LONGLONG}, + {"encryption_n_rowlog_blocks_decrypted", + (char*)&export_vars.innodb_n_rowlog_blocks_decrypted, + SHOW_LONGLONG}, /* scrubing */ {"scrub_background_page_reorganizations", @@ -1442,14 +1467,11 @@ innobase_drop_database( handlerton* hton, char* path); -/*******************************************************************//** -Closes an InnoDB database. */ +/** Shut down the InnoDB storage engine. +@return 0 */ static int -innobase_end( -/*=========*/ - handlerton* hton, /* in: InnoDB handlerton */ - ha_panic_function type); +innobase_end(handlerton*, ha_panic_function); /*****************************************************************//** Creates an InnoDB transaction struct for the thd if it does not yet have one. @@ -1679,18 +1701,6 @@ thd_is_replication_slave_thread( return thd && ((ibool) thd_slave_thread(thd)); } -/******************************************************************//** -Gets information on the durability property requested by thread. -Used when writing either a prepare or commit record to the log -buffer. @return the durability property. */ -enum durability_properties -thd_requested_durability( -/*=====================*/ - const THD* thd) /*!< in: thread handle */ -{ - return(thd_get_durability_property(thd)); -} - /******************************************************************//** Returns true if transaction should be flagged as read-only. @return true if the thd is marked as read-only */ @@ -1748,8 +1758,9 @@ innobase_reset_background_thd(MYSQL_THD thd) ut_ad(THDVAR(thd, background_thread)); /* background purge thread */ + const char *proc_info= thd_proc_info(thd, "reset"); reset_thd(thd); - thd_proc_info(thd, ""); + thd_proc_info(thd, proc_info); } @@ -1835,6 +1846,7 @@ innobase_srv_conc_enter_innodb( #endif /* WITH_WSREP */ trx_t* trx = prebuilt->trx; + if (srv_thread_concurrency) { if (trx->n_tickets_to_enter_innodb > 0) { @@ -1865,6 +1877,8 @@ void innobase_srv_conc_exit_innodb( row_prebuilt_t* prebuilt) { + ut_ad(!sync_check_iterate(sync_check())); + #ifdef WITH_WSREP if (wsrep_on(prebuilt->trx->mysql_thd) && wsrep_thd_is_BF(prebuilt->trx->mysql_thd, FALSE)) { @@ -1873,13 +1887,6 @@ innobase_srv_conc_exit_innodb( #endif /* WITH_WSREP */ trx_t* trx = prebuilt->trx; -#ifdef BTR_CUR_HASH_ADAPT -# ifdef UNIV_DEBUG - btrsea_sync_check check(trx->has_search_latch); - - ut_ad(!sync_check_iterate(check)); -# endif /* UNIV_DEBUG */ -#endif /* BTR_CUR_HASH_ADAPT */ /* This is to avoid making an unnecessary function call. */ if (trx->declared_to_be_inside_innodb @@ -1897,13 +1904,7 @@ innobase_srv_conc_force_exit_innodb( /*================================*/ trx_t* trx) /*!< in: transaction handle */ { -#ifdef BTR_CUR_HASH_ADAPT -# ifdef UNIV_DEBUG - btrsea_sync_check check(trx->has_search_latch); - - ut_ad(!sync_check_iterate(check)); -# endif /* UNIV_DEBUG */ -#endif /* BTR_CUR_HASH_ADAPT */ + ut_ad(!sync_check_iterate(sync_check())); /* This is to avoid making an unnecessary function call. */ if (trx->declared_to_be_inside_innodb) { @@ -1990,13 +1991,7 @@ const char* thd_innodb_tmpdir( THD* thd) { -#ifdef BTR_CUR_HASH_ADAPT -# ifdef UNIV_DEBUG - trx_t* trx = thd_to_trx(thd); - btrsea_sync_check check(trx->has_search_latch); - ut_ad(!sync_check_iterate(check)); -# endif /* UNIV_DEBUG */ -#endif /* BTR_CUR_HASH_ADAPT */ + ut_ad(!sync_check_iterate(sync_check())); const char* tmp_dir = THDVAR(thd, tmpdir); @@ -2031,28 +2026,6 @@ thd_to_trx_id( } #endif /* WITH_WSREP */ -/********************************************************************//** -Call this function when mysqld passes control to the client. That is to -avoid deadlocks on the adaptive hash S-latch possibly held by thd. For more -documentation, see handler.cc. -@return 0 */ -inline -int -innobase_release_temporary_latches( -/*===============================*/ - handlerton* hton, /*!< in: handlerton */ - THD* thd) /*!< in: MySQL thread */ -{ - DBUG_ASSERT(hton == innodb_hton_ptr); - - if (!srv_was_started) { - } else if (trx_t* trx = thd_to_trx(thd)) { - trx_assert_no_search_latch(trx); - } - - return(0); -} - /********************************************************************//** Increments innobase_active_counter and every INNOBASE_WAKE_INTERVALth time calls srv_active_wake_master_thread. This function should be used @@ -2205,15 +2178,21 @@ convert_error_code_to_mysql( locally for BLOB fields. Refer to dict_table_get_format(). We limit max record size to 16k for 64k page size. */ bool prefix = (dict_tf_get_format(flags) == UNIV_FORMAT_A); + bool comp = !!(flags & DICT_TF_COMPACT); + ulint free_space = page_get_free_space_of_empty(comp) / 2; + + if (free_space >= (comp ? COMPRESSED_REC_MAX_DATA_SIZE : + REDUNDANT_REC_MAX_DATA_SIZE)) { + free_space = (comp ? COMPRESSED_REC_MAX_DATA_SIZE : + REDUNDANT_REC_MAX_DATA_SIZE) - 1; + } + my_printf_error(ER_TOO_BIG_ROWSIZE, - "Row size too large (> %lu). Changing some columns" - " to TEXT or BLOB %smay help. In current row" - " format, BLOB prefix of %d bytes is stored inline.", + "Row size too large (> " ULINTPF "). Changing some columns " + "to TEXT or BLOB %smay help. In current row " + "format, BLOB prefix of %d bytes is stored inline.", MYF(0), - srv_page_size == UNIV_PAGE_SIZE_MAX - ? REC_MAX_DATA_SIZE - 1 - : page_get_free_space_of_empty(flags & - DICT_TF_COMPACT) / 2, + free_space, prefix ? "or using ROW_FORMAT=DYNAMIC or" " ROW_FORMAT=COMPRESSED " @@ -2472,25 +2451,16 @@ Thread unsafe, can only be called from the thread owning the THD. @return SQL statement string */ const char* innobase_get_stmt_unsafe( -/*=====================*/ THD* thd, size_t* length) { - LEX_STRING* stmt; - const char* query=NULL; - - stmt = thd ? thd_query_string(thd) : NULL; - // MySQL 5.7 - //stmt = thd_query_unsafe(thd); - - if (stmt && stmt->str) { + if (const LEX_STRING *stmt = thd_query_string(thd)) { *length = stmt->length; - query = stmt->str; - } else { - *length = 0; + return stmt->str; } - return(query); + *length = 0; + return NULL; } /** Determines the current SQL statement. @@ -2502,27 +2472,11 @@ into the provided buffer. @return Length of the SQL statement */ size_t innobase_get_stmt_safe( -/*===================*/ THD* thd, char* buf, size_t buflen) { - LEX_STRING* stmt; - size_t length=0; - - ut_ad(buflen > 1); - - stmt = thd ? thd_query_string(thd) : NULL; - - if (stmt && stmt->str) { - length = stmt->length >= buflen ? buflen - 1 : stmt->length; - memcpy(buf, stmt->str, length); - buf[length]='\0'; - } else { - buf[0]='\0'; - } - - return (length); + return thd_query_safe(thd, buf, buflen); } /**********************************************************************//** @@ -3388,7 +3342,6 @@ innobase_query_caching_of_table_permitted( return(false); } - trx_assert_no_search_latch(trx); innobase_srv_conc_force_exit_innodb(trx); if (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN) @@ -3441,11 +3394,35 @@ innobase_invalidate_query_cache( above the InnoDB trx_sys_t->lock. The caller of this function must not have latches of a lower rank. */ - /* Argument TRUE below means we are using transactions */ - mysql_query_cache_invalidate4(trx->mysql_thd, - full_name, - (uint32) full_name_len, - TRUE); +#ifdef HAVE_QUERY_CACHE + char qcache_key_name[2 * (NAME_LEN + 1)]; + char db_name[NAME_CHAR_LEN * MY_CS_MBMAXLEN + 1]; + const char *key_ptr; + size_t tabname_len; + size_t dbname_len; + + // Extract the database name. + key_ptr= strchr(full_name, '/'); + DBUG_ASSERT(key_ptr != NULL); // Database name should be present + memcpy(db_name, full_name, (dbname_len= (key_ptr - full_name))); + db_name[dbname_len]= '\0'; + + /* Construct the key("db-name\0table$name\0") for the query cache using + the path name("db@002dname\0table@0024name\0") of the table in its + canonical form. */ + dbname_len = filename_to_tablename(db_name, qcache_key_name, + sizeof(qcache_key_name)); + tabname_len = filename_to_tablename(++key_ptr, + (qcache_key_name + dbname_len + 1), + sizeof(qcache_key_name) - + dbname_len - 1); + + /* Argument TRUE below means we are using transactions */ + mysql_query_cache_invalidate4(trx->mysql_thd, + qcache_key_name, + (dbname_len + tabname_len + 2), + TRUE); +#endif } /** Quote a standard SQL identifier like index or column name. @@ -3672,8 +3649,6 @@ ha_innobase::init_table_handle_for_HANDLER(void) /* Initialize the m_prebuilt struct much like it would be inited in external_lock */ - trx_assert_no_search_latch(m_prebuilt->trx); - innobase_srv_conc_force_exit_innodb(m_prebuilt->trx); /* If the transaction is not started yet, start it */ @@ -3728,10 +3703,7 @@ innobase_space_shutdown() srv_tmp_space.shutdown(); #ifdef WITH_INNODB_DISALLOW_WRITES - if (srv_allow_writes_event) { - os_event_destroy(srv_allow_writes_event); - srv_allow_writes_event = NULL; - } + os_event_destroy(srv_allow_writes_event); #endif /* WITH_INNODB_DISALLOW_WRITES */ DBUG_VOID_RETURN; @@ -3791,6 +3763,16 @@ static const char* deprecated_instrument_semaphores = "Using innodb_instrument_semaphores is deprecated" " and the parameter will be removed in MariaDB 10.3."; +static const char* deprecated_use_mtflush + = "Using innodb_use_mtflush is deprecated" + " and the parameter will be removed in MariaDB 10.3." + " Use innodb-page-cleaners instead. "; + +static const char* deprecated_mtflush_threads + = "Using innodb_mtflush_threads is deprecated" + " and the parameter will be removed in MariaDB 10.3." + " Use innodb-page-cleaners instead. "; + static my_bool innodb_instrument_semaphores; /** Update log_checksum_algorithm_ptr with a pointer to the function @@ -3896,9 +3878,6 @@ innobase_init( innobase_hton->flags = HTON_SUPPORTS_EXTENDED_KEYS | HTON_SUPPORTS_FOREIGN_KEYS; - innobase_hton->release_temporary_latches = - innobase_release_temporary_latches; - #ifdef MYSQL_REPLACE_TRX_IN_THD innobase_hton->replace_native_transaction_in_thd = innodb_replace_trx_in_thd; @@ -4021,6 +4000,8 @@ innobase_init( goto error; } + innodb_check_deprecated(); + /* First calculate the default path for innodb_data_home_dir etc., in case the user has not given any value. @@ -4152,6 +4133,14 @@ innobase_init( ib::warn() << deprecated_instrument_semaphores; } + if (srv_use_mtflush) { + ib::warn() << deprecated_use_mtflush; + } + + if (srv_use_mtflush && srv_mtflush_threads != MTFLUSH_DEFAULT_WORKER) { + ib::warn() << deprecated_mtflush_threads; + } + /* Validate the file format by animal name */ if (innobase_file_format_name != NULL) { @@ -4283,8 +4272,6 @@ innobase_change_buffering_inited_ok: srv_file_flush_method_str = innobase_file_flush_method; - srv_log_file_size = (ib_uint64_t) innobase_log_file_size; - if (UNIV_PAGE_SIZE_DEF != srv_page_size) { ib::info() << "innodb_page_size=" << srv_page_size; @@ -4552,21 +4539,13 @@ error: DBUG_RETURN(1); } -/*******************************************************************//** -Closes an InnoDB database. -@return TRUE if error */ +/** Shut down the InnoDB storage engine. +@return 0 */ static int -innobase_end( -/*=========*/ - handlerton* hton, /*!< in/out: InnoDB handlerton */ - ha_panic_function type MY_ATTRIBUTE((unused))) - /*!< in: ha_panic() parameter */ +innobase_end(handlerton*, ha_panic_function) { - int err= 0; - DBUG_ENTER("innobase_end"); - DBUG_ASSERT(hton == innodb_hton_ptr); if (srv_was_started) { THD *thd= current_thd; @@ -4599,7 +4578,7 @@ innobase_end( mysql_mutex_destroy(&pending_checkpoint_mutex); } - DBUG_RETURN(err); + DBUG_RETURN(0); } /*****************************************************************//** @@ -4797,12 +4776,6 @@ innobase_commit_ordered( trx = check_trx_exists(thd); TrxInInnoDB trx_in_innodb(trx); - /* Since we will reserve the kernel mutex, we must not be holding the - search system latch, or we will disobey the latching order. But we - already released it in innobase_xa_prepare() (if not before), so just - have an assert here.*/ - trx_assert_no_search_latch(trx); - if (!trx_is_registered_for_2pc(trx) && trx_is_started(trx)) { /* We cannot throw error here; instead we will catch this error again in innobase_commit() and report it from there. */ @@ -4892,10 +4865,6 @@ innobase_commit( this one, to allow then to group commit with us. */ thd_wakeup_subsequent_commits(thd, 0); - if (!read_only) { - trx->flush_log_later = false; - } - /* Now do a write + flush of logs. */ trx_commit_complete_for_mysql(trx); @@ -5014,12 +4983,6 @@ innobase_rollback_trx( DBUG_ENTER("innobase_rollback_trx"); DBUG_PRINT("trans", ("aborting transaction")); - /* Release a possible FIFO ticket and search latch. Since we will - reserve the trx_sys->mutex, we have to release the search system - latch first to obey the latching order. */ - - trx_assert_no_search_latch(trx); - innobase_srv_conc_force_exit_innodb(trx); /* If we had reserved the auto-inc lock for some table (if @@ -6036,14 +5999,6 @@ innobase_match_index_columns( spatial index on it and we intend to use DATA_GEOMETRY for legacy GIS data types which are of var-length. */ switch (col_type) { - case DATA_POINT: - case DATA_VAR_POINT: - if (DATA_POINT_MTYPE(mtype) - || mtype == DATA_GEOMETRY - || mtype == DATA_BLOB) { - break; - } - /* Fall through */ case DATA_GEOMETRY: if (mtype == DATA_BLOB) { break; @@ -6529,37 +6484,19 @@ initialize_auto_increment(dict_table_t* table, const Field* field) dict_table_autoinc_unlock(table); } -/*****************************************************************//** -Creates and opens a handle to a table which already exists in an InnoDB -database. -@return 1 if error, 0 if success */ - +/** Open an InnoDB table +@param[in] name table name +@return error code +@retval 0 on success */ int -ha_innobase::open( -/*==============*/ - const char* name, /*!< in: table name */ - int mode, /*!< in: not used */ - uint test_if_locked) /*!< in: not used */ +ha_innobase::open(const char* name, int, uint) { dict_table_t* ib_table; char norm_name[FN_REFLEN]; - THD* thd; dict_err_ignore_t ignore_err = DICT_ERR_IGNORE_NONE; DBUG_ENTER("ha_innobase::open"); - UT_NOT_USED(mode); - UT_NOT_USED(test_if_locked); - - thd = ha_thd(); - - /* Under some cases MySQL seems to call this function while - holding search latch(es). This breaks the latching order as - we acquire dict_sys->mutex below and leads to a deadlock. */ - if (thd != NULL) { - innobase_release_temporary_latches(ht, thd); - } - normalize_table_name(norm_name, name); m_user_thd = NULL; @@ -6574,6 +6511,7 @@ ha_innobase::open( m_upd_buf_size = 0; char* is_part = is_partition(norm_name); + THD* thd = ha_thd(); /* Check whether FOREIGN_KEY_CHECKS is set to 0. If so, the table can be opened even if some FK indexes are missing. If not, the table @@ -6584,16 +6522,17 @@ ha_innobase::open( ib_table = open_dict_table(name, norm_name, is_part, ignore_err); + uint n_fields = mysql_fields(table); + if (ib_table != NULL && ((!DICT_TF2_FLAG_IS_SET(ib_table, DICT_TF2_FTS_HAS_DOC_ID) - && table->s->fields != dict_table_get_n_tot_u_cols(ib_table)) + && n_fields != dict_table_get_n_tot_u_cols(ib_table)) || (DICT_TF2_FLAG_IS_SET(ib_table, DICT_TF2_FTS_HAS_DOC_ID) - && (table->s->fields - != dict_table_get_n_tot_u_cols(ib_table) - 1)))) { + && (n_fields != dict_table_get_n_tot_u_cols(ib_table) - 1)))) { ib::warn() << "Table " << norm_name << " contains " - << dict_table_get_n_user_cols(ib_table) << " user" - " defined columns in InnoDB, but " << table->s->fields + << dict_table_get_n_tot_u_cols(ib_table) << " user" + " defined columns in InnoDB, but " << n_fields << " columns in MariaDB. Please check" " INFORMATION_SCHEMA.INNODB_SYS_COLUMNS and " REFMAN "innodb-troubleshooting.html for how to resolve the" @@ -6601,6 +6540,7 @@ ha_innobase::open( /* Mark this table as corrupted, so the drop table or force recovery can still use it, but not others. */ + ib_table->file_unreadable = true; ib_table->corrupted = true; dict_table_close(ib_table, FALSE, FALSE); ib_table = NULL; @@ -6614,10 +6554,6 @@ ha_innobase::open( norm_name); } - ib::warn() << "Cannot open table " << norm_name << " from the" - " internal data dictionary of InnoDB though the .frm" - " file for the table exists. " << TROUBLESHOOTING_MSG; - free_share(m_share); set_my_errno(ENOENT); @@ -6626,10 +6562,8 @@ ha_innobase::open( innobase_copy_frm_flags_from_table_share(ib_table, table->s); - ib_table->thd = (void*)thd; - /* No point to init any statistics if tablespace is still encrypted. */ - if (!ib_table->is_encrypted) { + if (ib_table->is_readable()) { dict_stats_init(ib_table); } else { ib_table->stat_initialized = 1; @@ -6637,7 +6571,9 @@ ha_innobase::open( MONITOR_INC(MONITOR_TABLE_OPEN); - bool no_tablespace; + bool no_tablespace = false; + bool encrypted = false; + FilSpace space; if (dict_table_is_discarded(ib_table)) { @@ -6652,21 +6588,28 @@ ha_innobase::open( no_tablespace = false; - } else if (ib_table->ibd_file_missing) { + } else if (!ib_table->is_readable()) { + space = fil_space_acquire_silent(ib_table->space); - ib_senderrf( - thd, IB_LOG_LEVEL_WARN, - ER_TABLESPACE_MISSING, norm_name); + if (space()) { + if (space()->crypt_data && space()->crypt_data->is_encrypted()) { + /* This means that tablespace was found but we could not + decrypt encrypted page. */ + no_tablespace = true; + encrypted = true; + } else { + no_tablespace = true; + } + } else { + ib_senderrf( + thd, IB_LOG_LEVEL_WARN, + ER_TABLESPACE_MISSING, norm_name); - /* This means we have no idea what happened to the tablespace - file, best to play it safe. */ + /* This means we have no idea what happened to the tablespace + file, best to play it safe. */ - no_tablespace = true; - } else if (ib_table->is_encrypted) { - /* This means that tablespace was found but we could not - decrypt encrypted page. */ - no_tablespace = true; - ib_table->ibd_file_missing = true; + no_tablespace = true; + } } else { no_tablespace = false; } @@ -6679,34 +6622,35 @@ ha_innobase::open( /* If table has no talespace but it has crypt data, check is tablespace made unaccessible because encryption service or used key_id is not available. */ - if (ib_table) { + if (encrypted) { bool warning_pushed = false; - fil_space_crypt_t* crypt_data = ib_table->crypt_data; - if (crypt_data && crypt_data->should_encrypt()) { - - if (!encryption_key_id_exists(crypt_data->key_id)) { - push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, - HA_ERR_DECRYPTION_FAILED, - "Table %s is encrypted but encryption service or" - " used key_id %u is not available. " - " Can't continue reading table.", - ib_table->name, crypt_data->key_id); - ret_err = HA_ERR_DECRYPTION_FAILED; - warning_pushed = true; - } + if (!encryption_key_id_exists(space()->crypt_data->key_id)) { + push_warning_printf( + thd, Sql_condition::WARN_LEVEL_WARN, + HA_ERR_DECRYPTION_FAILED, + "Table %s in file %s is encrypted but encryption service or" + " used key_id %u is not available. " + " Can't continue reading table.", + table_share->table_name.str, + space()->chain.start->name, + space()->crypt_data->key_id); + ret_err = HA_ERR_DECRYPTION_FAILED; + warning_pushed = true; } /* If table is marked as encrypted then we push warning if it has not been already done as used key_id might be found but it is incorrect. */ - if (ib_table->is_encrypted && !warning_pushed) { - push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + if (!warning_pushed) { + push_warning_printf( + thd, Sql_condition::WARN_LEVEL_WARN, HA_ERR_DECRYPTION_FAILED, - "Table %s is encrypted but encryption service or" + "Table %s in file %s is encrypted but encryption service or" " used key_id is not available. " " Can't continue reading table.", - ib_table->name); + table_share->table_name.str, + space()->chain.start->name); ret_err = HA_ERR_DECRYPTION_FAILED; } } @@ -6757,11 +6701,8 @@ ha_innobase::open( a row in our table. Note that MySQL may also compare two row references for equality by doing a simple memcmp on the strings of length ref_length! */ - - if (!row_table_got_default_clust_index(ib_table)) { - - m_prebuilt->clust_index_was_generated = FALSE; - + if (!(m_prebuilt->clust_index_was_generated + = dict_index_is_auto_gen_clust(ib_table->indexes.start))) { if (m_primary_key >= MAX_KEY) { ib_table->dict_frm_mismatch = DICT_FRM_NO_PK; @@ -6827,8 +6768,6 @@ ha_innobase::open( ib_push_frm_error(thd, ib_table, table, 0, true); } - m_prebuilt->clust_index_was_generated = TRUE; - ref_length = DATA_ROW_ID_LEN; /* If we automatically created the clustered index, then @@ -6865,7 +6804,7 @@ ha_innobase::open( if (m_prebuilt->table == NULL || dict_table_is_temporary(m_prebuilt->table) || m_prebuilt->table->persistent_autoinc - || m_prebuilt->table->ibd_file_missing) { + || !m_prebuilt->table->is_readable()) { } else if (const Field* ai = table->found_next_number_field) { initialize_auto_increment(m_prebuilt->table, ai); } @@ -6881,11 +6820,6 @@ ha_innobase::open( static_cast( plugin_decl(parser)->info); - index->is_ngram = strncmp( - plugin_name(parser)->str, - FTS_NGRAM_PARSER_NAME, - plugin_name(parser)->length) == 0; - DBUG_EXECUTE_IF("fts_instrument_use_default_parser", index->parser = &fts_default_parser;); } @@ -7044,12 +6978,6 @@ ha_innobase::close() { DBUG_ENTER("ha_innobase::close"); - THD* thd = ha_thd(); - - if (thd != NULL) { - innobase_release_temporary_latches(ht, thd); - } - row_prebuilt_free(m_prebuilt, FALSE); if (m_upd_buf != NULL) { @@ -8057,12 +7985,6 @@ build_template_field( prebuilt->templ_contains_blob = TRUE; } - if (templ->type == DATA_POINT) { - /* We set this only when it's DATA_POINT, but not - DATA_VAR_POINT */ - prebuilt->templ_contains_fixed_point = TRUE; - } - return(templ); } @@ -8134,7 +8056,7 @@ ha_innobase::build_template( /* Below we check column by column if we need to access the clustered index. */ - n_fields = (ulint) table->s->fields; /* number of columns */ + n_fields = (ulint) mysql_fields(table); if (!m_prebuilt->mysql_template) { m_prebuilt->mysql_template = (mysql_row_templ_t*) @@ -8147,7 +8069,6 @@ ha_innobase::build_template( /* Prepare to build m_prebuilt->mysql_template[]. */ m_prebuilt->templ_contains_blob = FALSE; - m_prebuilt->templ_contains_fixed_point = FALSE; m_prebuilt->mysql_prefix_len = 0; m_prebuilt->n_template = 0; m_prebuilt->idx_cond_n_cols = 0; @@ -8478,8 +8399,8 @@ ha_innobase::innobase_lock_autoinc(void) break; } } - /* Fall through to old style locking. */ - + /* Use old style locking. */ + /* fall through */ case AUTOINC_OLD_STYLE_LOCKING: DBUG_EXECUTE_IF("die_if_autoinc_old_lock_style_used", ut_ad(0);); @@ -8584,15 +8505,15 @@ ha_innobase::write_row( || sql_command == SQLCOM_OPTIMIZE || sql_command == SQLCOM_CREATE_INDEX #ifdef WITH_WSREP - || (wsrep_on(m_user_thd) && wsrep_load_data_splitting && - sql_command == SQLCOM_LOAD && - !thd_test_options( - m_user_thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) + || (sql_command == SQLCOM_LOAD + && wsrep_load_data_splitting && wsrep_on(m_user_thd) + && !thd_test_options( + m_user_thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) #endif /* WITH_WSREP */ || sql_command == SQLCOM_DROP_INDEX) && m_num_write_row >= 10000) { #ifdef WITH_WSREP - if (wsrep_on(m_user_thd) && sql_command == SQLCOM_LOAD) { + if (sql_command == SQLCOM_LOAD && wsrep_on(m_user_thd)) { WSREP_DEBUG("forced trx split for LOAD: %s", wsrep_thd_query(m_user_thd)); } @@ -8996,6 +8917,7 @@ calc_row_difference( trx_t* const trx = prebuilt->trx; doc_id_t doc_id = FTS_NULL_DOC_ID; ulint num_v = 0; + uint n_fields = mysql_fields(table); ut_ad(!srv_read_only_mode); @@ -9005,7 +8927,7 @@ calc_row_difference( /* We use upd_buff to convert changed fields */ buf = (byte*) upd_buff; - for (i = 0; i < table->s->fields; i++) { + for (i = 0; i < n_fields; i++) { field = table->field[i]; bool is_virtual = innobase_is_v_fld(field); dict_col_t* col; @@ -9038,8 +8960,6 @@ calc_row_difference( switch (col_type) { case DATA_BLOB: - case DATA_POINT: - case DATA_VAR_POINT: case DATA_GEOMETRY: o_ptr = row_mysql_read_blob_ref(&o_len, o_ptr, o_len); n_ptr = row_mysql_read_blob_ref(&n_len, n_ptr, n_len); @@ -9149,8 +9069,8 @@ calc_row_difference( } } - if (o_len != n_len || (o_len != UNIV_SQL_NULL && - 0 != memcmp(o_ptr, n_ptr, o_len))) { + if (o_len != n_len || (o_len != 0 && o_len != UNIV_SQL_NULL + && 0 != memcmp(o_ptr, n_ptr, o_len))) { /* The field has changed */ ufield = uvect->fields + n_changed; @@ -9389,7 +9309,7 @@ wsrep_calc_row_hash( void *ctx = alloca(my_md5_context_size()); my_md5_init(ctx); - n_fields = table->s->fields; + n_fields = mysql_fields(table); for (i = 0; i < n_fields; i++) { byte null_byte=0; @@ -9530,7 +9450,7 @@ ha_innobase::update_row( innobase_srv_conc_enter_innodb(m_prebuilt); - error = row_update_for_mysql((byte*) old_row, m_prebuilt); + error = row_update_for_mysql(m_prebuilt); if (error == DB_SUCCESS && autoinc) { /* A value for an AUTO_INCREMENT column @@ -9645,7 +9565,7 @@ ha_innobase::delete_row( innobase_srv_conc_enter_innodb(m_prebuilt); - error = row_update_for_mysql((byte*) record, m_prebuilt); + error = row_update_for_mysql(m_prebuilt); innobase_srv_conc_exit_innodb(m_prebuilt); @@ -10303,7 +10223,6 @@ ha_innobase::general_fetch( DBUG_ENTER("general_fetch"); const trx_t* trx = m_prebuilt->trx; - dberr_t ret; ut_ad(trx == thd_to_trx(m_user_thd)); @@ -10315,9 +10234,20 @@ ha_innobase::general_fetch( DB_FORCED_ABORT, 0, m_user_thd)); } + if (m_prebuilt->table->is_readable()) { + } else if (m_prebuilt->table->corrupted) { + DBUG_RETURN(HA_ERR_CRASHED); + } else { + FilSpace space(m_prebuilt->table->space, true); + + DBUG_RETURN(space() + ? HA_ERR_DECRYPTION_FAILED + : HA_ERR_NO_SUCH_TABLE); + } + innobase_srv_conc_enter_innodb(m_prebuilt); - ret = row_search_mvcc( + dberr_t ret = row_search_mvcc( buf, PAGE_CUR_UNSUPP, m_prebuilt, match_mode, direction); innobase_srv_conc_exit_innodb(m_prebuilt); @@ -10520,6 +10450,8 @@ ha_innobase::rnd_next( DBUG_ENTER("rnd_next"); + TrxInInnoDB trx_in_innodb(m_prebuilt->trx); + if (m_start_of_scan) { error = index_first(buf); @@ -11444,7 +11376,9 @@ create_table_check_doc_id_col( ULINT_UNDEFINED if column is of the wrong type/name/size */ { - for (ulint i = 0; i < form->s->fields; i++) { + uint n_fields = mysql_fields(form); + + for (ulint i = 0; i < n_fields; i++) { const Field* field; ulint col_type; ulint col_len; @@ -11790,10 +11724,6 @@ create_table_info_t::create_table_def() } } - if (col_type == DATA_POINT) { - col_len = DATA_POINT_LEN; - } - is_virtual = (innobase_is_v_fld(field)) ? DATA_VIRTUAL : 0; is_stored = innobase_is_s_fld(field); @@ -11920,8 +11850,7 @@ err_col: err = row_create_table_for_mysql( table, m_trx, false, (fil_encryption_t)options->encryption, - (ulint)options->encryption_key_id); - + options->encryption_key_id); } DBUG_EXECUTE_IF("ib_crash_during_create_for_encryption", @@ -12329,7 +12258,8 @@ create_table_info_t::create_options_are_invalid() get_row_format_name(row_format)); ret = "ROW_FORMAT"; } - /* FALLTRHOUGH */ + /* ROW_FORMAT=DYNAMIC also shuns KEY_BLOCK_SIZE */ + /* fall through */ case ROW_TYPE_COMPACT: case ROW_TYPE_REDUNDANT: if (has_key_block_size) { @@ -12846,7 +12776,8 @@ index_bad: break; } zip_allowed = false; - /* fall through to set row_type = DYNAMIC */ + /* Set ROW_FORMAT = COMPACT */ + /* fall through */ case ROW_TYPE_NOT_USED: case ROW_TYPE_FIXED: case ROW_TYPE_PAGE: @@ -12854,6 +12785,7 @@ index_bad: m_thd, Sql_condition::WARN_LEVEL_WARN, ER_ILLEGAL_HA_CREATE_OPTION, "InnoDB: assuming ROW_FORMAT=DYNAMIC."); + /* fall through */ case ROW_TYPE_DYNAMIC: innodb_row_format = REC_FORMAT_DYNAMIC; break; @@ -13101,8 +13033,6 @@ create_table_info_t::set_tablespace_type( int create_table_info_t::initialize() { - trx_t* parent_trx; - DBUG_ENTER("create_table_info_t::initialize"); ut_ad(m_thd != NULL); @@ -13124,12 +13054,8 @@ create_table_info_t::initialize() /* Get the transaction associated with the current thd, or create one if not yet created */ - parent_trx = check_trx_exists(m_thd); + check_trx_exists(m_thd); - /* In case MySQL calls this in the middle of a SELECT query, release - possible adaptive hash latch to avoid deadlocks of threads */ - - trx_assert_no_search_latch(parent_trx); DBUG_RETURN(0); } @@ -13646,7 +13572,7 @@ ha_innobase::discard_or_import_tablespace( user may want to set the DISCARD flag in order to IMPORT a new tablespace. */ - if (dict_table->ibd_file_missing) { + if (!dict_table->is_readable()) { ib_senderrf( m_prebuilt->trx->mysql_thd, IB_LOG_LEVEL_WARN, ER_TABLESPACE_MISSING, @@ -13656,7 +13582,7 @@ ha_innobase::discard_or_import_tablespace( err = row_discard_tablespace_for_mysql( dict_table->name.m_name, m_prebuilt->trx); - } else if (!dict_table->ibd_file_missing) { + } else if (dict_table->is_readable()) { /* Commit the transaction in order to release the table lock. */ trx_commit_for_mysql(m_prebuilt->trx); @@ -13978,12 +13904,6 @@ innobase_drop_database( THD* thd = current_thd; - /* In case MySQL calls this in the middle of a SELECT - query, release possible adaptive hash latch to avoid - deadlocks of threads */ - - trx_assert_no_search_latch(check_trx_exists(thd)); - ulint len = 0; char* ptr = strend(path) - 2; @@ -14549,7 +14469,8 @@ innobase_get_mysql_key_number_for_index( i++; } - if (row_table_got_default_clust_index(index->table)) { + if (dict_index_is_clust(index) + && dict_index_is_auto_gen_clust(index)) { ut_a(i > 0); i--; } @@ -14717,12 +14638,7 @@ ha_innobase::info_low( update_thd(ha_thd()); - /* In case MySQL calls this in the middle of a SELECT query, release - possible adaptive hash latch to avoid deadlocks of threads */ - - m_prebuilt->trx->op_info = (char*)"returning various info to MariaDB"; - - trx_assert_no_search_latch(m_prebuilt->trx); + m_prebuilt->trx->op_info = "returning various info to MariaDB"; ib_table = m_prebuilt->table; DBUG_ASSERT(ib_table->n_ref_count > 0); @@ -15248,7 +15164,8 @@ ha_innobase::optimize( This works OK otherwise, but MySQL locks the entire table during calls to OPTIMIZE, which is undesirable. */ - if (srv_defragment) { + /* TODO: Defragment is disabled for now */ + if (0) { int err; err = defragment_table(m_prebuilt->table->name.m_name, NULL, false); @@ -15325,7 +15242,8 @@ ha_innobase::check( DBUG_RETURN(HA_ADMIN_CORRUPT); - } else if (m_prebuilt->table->ibd_file_missing) { + } else if (!m_prebuilt->table->is_readable() && + !fil_space_get(m_prebuilt->table->space)) { ib_senderrf( thd, IB_LOG_LEVEL_ERROR, @@ -15567,12 +15485,7 @@ ha_innobase::update_table_comment( update_thd(ha_thd()); - m_prebuilt->trx->op_info = (char*)"returning table comment"; - - /* In case MySQL calls this in the middle of a SELECT query, release - possible adaptive hash latch to avoid deadlocks of threads */ - - trx_assert_no_search_latch(m_prebuilt->trx); + m_prebuilt->trx->op_info = "returning table comment"; #define SSTR( x ) reinterpret_cast< std::ostringstream & >( \ ( std::ostringstream() << std::dec << x ) ).str() @@ -15628,22 +15541,14 @@ ha_innobase::get_foreign_key_create_info(void) update_thd(ha_thd()); - m_prebuilt->trx->op_info = (char*)"getting info on foreign keys"; - - /* In case MySQL calls this in the middle of a SELECT query, - release possible adaptive hash latch to avoid - deadlocks of threads */ - - trx_assert_no_search_latch(m_prebuilt->trx); - - + m_prebuilt->trx->op_info = "getting info on foreign keys"; /* Output the data to a temporary string */ std::string str = dict_print_info_on_foreign_keys( TRUE, m_prebuilt->trx, m_prebuilt->table); - m_prebuilt->trx->op_info = (char*)""; + m_prebuilt->trx->op_info = ""; /* Allocate buffer for the string */ char* fk_str = (char*) my_malloc(str.length() + 1, MYF(0)); @@ -15766,10 +15671,14 @@ get_foreign_key_info( if (ref_table == NULL) { - ib::info() << "Foreign Key referenced table " - << foreign->referenced_table_name - << " not found for foreign table " - << foreign->foreign_table_name; + if (!thd_test_options( + thd, OPTION_NO_FOREIGN_KEY_CHECKS)) { + ib::info() + << "Foreign Key referenced table " + << foreign->referenced_table_name + << " not found for foreign table " + << foreign->foreign_table_name; + } } else { dict_table_close(ref_table, TRUE, FALSE); @@ -16643,9 +16552,9 @@ innodb_show_status( DBUG_RETURN(0); } - trx_t* trx = check_trx_exists(thd); + srv_wake_purge_thread_if_not_active(); - trx_assert_no_search_latch(trx); + trx_t* trx = check_trx_exists(thd); innobase_srv_conc_force_exit_innodb(trx); @@ -17957,12 +17866,6 @@ innobase_xa_prepare( thd_get_xid(thd, (MYSQL_XID*) trx->xid); - /* Release a possible FIFO ticket and search latch. Since we will - reserve the trx_sys->mutex, we have to release the search system - latch first to obey the latching order. */ - - trx_assert_no_search_latch(trx); - innobase_srv_conc_force_exit_innodb(trx); TrxInInnoDB trx_in_innodb(trx); @@ -18072,9 +17975,11 @@ innobase_commit_by_xid( { DBUG_ASSERT(hton == innodb_hton_ptr); - trx_t* trx = trx_get_trx_by_xid(xid); + if (high_level_read_only) { + return(XAER_RMFAIL); + } - if (trx != NULL) { + if (trx_t* trx = trx_get_trx_by_xid(xid)) { TrxInInnoDB trx_in_innodb(trx); innobase_commit_low(trx); @@ -18104,9 +18009,11 @@ innobase_rollback_by_xid( { DBUG_ASSERT(hton == innodb_hton_ptr); - trx_t* trx = trx_get_trx_by_xid(xid); + if (high_level_read_only) { + return(XAER_RMFAIL); + } - if (trx != NULL) { + if (trx_t* trx = trx_get_trx_by_xid(xid)) { TrxInInnoDB trx_in_innodb(trx); int ret = innobase_rollback_trx(trx); @@ -18417,6 +18324,34 @@ innodb_file_format_name_validate( return(1); } +/*************************************************************//** +Don't allow to set innodb_fast_shutdown=0 if purge threads are +already down. +@return 0 if innodb_fast_shutdown can be set */ +static +int +fast_shutdown_validate( +/*=============================*/ + THD* thd, /*!< in: thread handle */ + struct st_mysql_sys_var* var, /*!< in: pointer to system + variable */ + void* save, /*!< out: immediate result + for update function */ + struct st_mysql_value* value) /*!< in: incoming string */ +{ + if (check_sysvar_int(thd, var, save, value)) { + return(1); + } + + uint new_val = *reinterpret_cast(save); + + if (srv_fast_shutdown && !new_val && !srv_running) { + return(1); + } + + return(0); +} + /****************************************************************//** Update the system variable innodb_file_format using the "saved" value. This function is registered as a callback with MySQL. */ @@ -19823,8 +19758,6 @@ innobase_fts_find_ranking(FT_INFO* fts_hdl, uchar*, uint) #ifdef UNIV_DEBUG static my_bool innodb_background_drop_list_empty = TRUE; -static my_bool innodb_purge_run_now = TRUE; -static my_bool innodb_purge_stop_now = TRUE; static my_bool innodb_log_checkpoint_now = TRUE; static my_bool innodb_buf_flush_list_now = TRUE; static uint innodb_merge_threshold_set_all_debug @@ -19848,52 +19781,6 @@ wait_background_drop_list_empty( row_wait_for_background_drop_list_empty(); } -/****************************************************************//** -Set the purge state to RUN. If purge is disabled then it -is a no-op. This function is registered as a callback with MySQL. */ -static -void -purge_run_now_set( -/*==============*/ - THD* thd /*!< in: thread handle */ - MY_ATTRIBUTE((unused)), - struct st_mysql_sys_var* var /*!< in: pointer to system - variable */ - MY_ATTRIBUTE((unused)), - void* var_ptr /*!< out: where the formal - string goes */ - MY_ATTRIBUTE((unused)), - const void* save) /*!< in: immediate result from - check function */ -{ - if (*(my_bool*) save && trx_purge_state() != PURGE_STATE_DISABLED) { - trx_purge_run(); - } -} - -/****************************************************************//** -Set the purge state to STOP. If purge is disabled then it -is a no-op. This function is registered as a callback with MySQL. */ -static -void -purge_stop_now_set( -/*===============*/ - THD* thd /*!< in: thread handle */ - MY_ATTRIBUTE((unused)), - struct st_mysql_sys_var* var /*!< in: pointer to system - variable */ - MY_ATTRIBUTE((unused)), - void* var_ptr /*!< out: where the formal - string goes */ - MY_ATTRIBUTE((unused)), - const void* save) /*!< in: immediate result from - check function */ -{ - if (*(my_bool*) save && trx_purge_state() != PURGE_STATE_DISABLED) { - trx_purge_stop(); - } -} - /****************************************************************//** Force innodb to checkpoint. */ static @@ -20561,7 +20448,7 @@ wsrep_fake_trx_id( mutex_enter(&trx_sys->mutex); trx_id_t trx_id = trx_sys_get_new_trx_id(); mutex_exit(&trx_sys->mutex); - + WSREP_DEBUG("innodb fake trx id: %lu thd: %s", trx_id, wsrep_thd_query(thd)); wsrep_ws_handle_for_trx(wsrep_thd_ws_handle(thd), trx_id); } @@ -20702,16 +20589,6 @@ static MYSQL_SYSVAR_BOOL(background_drop_list_empty, "Wait for the background drop list to become empty", NULL, wait_background_drop_list_empty, FALSE); -static MYSQL_SYSVAR_BOOL(purge_run_now, innodb_purge_run_now, - PLUGIN_VAR_OPCMDARG, - "Set purge state to RUN", - NULL, purge_run_now_set, FALSE); - -static MYSQL_SYSVAR_BOOL(purge_stop_now, innodb_purge_stop_now, - PLUGIN_VAR_OPCMDARG, - "Set purge state to STOP", - NULL, purge_stop_now_set, FALSE); - static MYSQL_SYSVAR_BOOL(log_checkpoint_now, innodb_log_checkpoint_now, PLUGIN_VAR_OPCMDARG, "Force checkpoint now", @@ -20759,7 +20636,7 @@ static MYSQL_SYSVAR_UINT(fast_shutdown, srv_fast_shutdown, PLUGIN_VAR_OPCMDARG, "Speeds up the shutdown process of the InnoDB storage engine. Possible" " values are 0, 1 (faster) or 2 (fastest - crash-like).", - NULL, NULL, 1, 0, 2, 0); + fast_shutdown_validate, NULL, 1, 0, 2, 0); static MYSQL_SYSVAR_BOOL(file_per_table, srv_file_per_table, PLUGIN_VAR_NOCMDARG, @@ -21288,10 +21165,12 @@ static MYSQL_SYSVAR_LONG(log_buffer_size, innobase_log_buffer_size, "The size of the buffer which InnoDB uses to write log to the log files on disk.", NULL, NULL, 16*1024*1024L, 256*1024L, LONG_MAX, 1024); -static MYSQL_SYSVAR_LONGLONG(log_file_size, innobase_log_file_size, +static MYSQL_SYSVAR_ULONGLONG(log_file_size, srv_log_file_size, PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, "Size of each log file in a log group.", - NULL, NULL, 48*1024*1024L, 4*1024*1024L, LLONG_MAX, 1024*1024L); + NULL, NULL, 48 << 20, 1 << 20, 512ULL << 30, UNIV_PAGE_SIZE_MAX); +/* OS_FILE_LOG_BLOCK_SIZE would be more appropriate than UNIV_PAGE_SIZE_MAX, +but fil_space_t is being used for the redo log, and it uses data pages. */ static MYSQL_SYSVAR_ULONG(log_files_in_group, srv_n_log_files, PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, @@ -21704,7 +21583,7 @@ static MYSQL_SYSVAR_ENUM(compression_algorithm, innodb_compression_algorithm, static MYSQL_SYSVAR_LONG(mtflush_threads, srv_mtflush_threads, PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, - "Number of multi-threaded flush threads", + "DEPRECATED. Number of multi-threaded flush threads", NULL, NULL, MTFLUSH_DEFAULT_WORKER, /* Default setting */ 1, /* Minimum setting */ @@ -21713,7 +21592,7 @@ static MYSQL_SYSVAR_LONG(mtflush_threads, srv_mtflush_threads, static MYSQL_SYSVAR_BOOL(use_mtflush, srv_use_mtflush, PLUGIN_VAR_NOCMDARG | PLUGIN_VAR_READONLY, - "Use multi-threaded flush. Default FALSE.", + "DEPRECATED. Use multi-threaded flush. Default FALSE.", NULL, NULL, FALSE); static MYSQL_SYSVAR_ULONG(fatal_semaphore_wait_threshold, srv_fatal_semaphore_wait_threshold, @@ -21837,6 +21716,8 @@ static MYSQL_SYSVAR_BOOL(instrument_semaphores, innodb_instrument_semaphores, "DEPRECATED. This setting has no effect.", NULL, innodb_instrument_semaphores_update, FALSE); +#include "ha_xtradb.h" + static struct st_mysql_sys_var* innobase_system_variables[]= { MYSQL_SYSVAR(autoextend_increment), MYSQL_SYSVAR(buffer_pool_size), @@ -21981,8 +21862,6 @@ static struct st_mysql_sys_var* innobase_system_variables[]= { MYSQL_SYSVAR(purge_batch_size), #ifdef UNIV_DEBUG MYSQL_SYSVAR(background_drop_list_empty), - MYSQL_SYSVAR(purge_run_now), - MYSQL_SYSVAR(purge_stop_now), MYSQL_SYSVAR(log_checkpoint_now), MYSQL_SYSVAR(buf_flush_list_now), MYSQL_SYSVAR(merge_threshold_set_all_debug), @@ -22049,6 +21928,11 @@ static struct st_mysql_sys_var* innobase_system_variables[]= { MYSQL_SYSVAR(instrument_semaphores), MYSQL_SYSVAR(buf_dump_status_frequency), MYSQL_SYSVAR(background_thread), + + /* XtraDB compatibility system variables */ +#define HA_XTRADB_SYSVARS +#include "ha_xtradb.h" + NULL }; @@ -22239,8 +22123,17 @@ innobase_find_mysql_table_for_vc( THD* thd, dict_table_t* table) { - if (table->vc_templ->mysql_table_query_id == thd_get_query_id(thd)) { - return table->vc_templ->mysql_table; + TABLE *mysql_table; + bool bg_thread = THDVAR(thd, background_thread); + + if (bg_thread) { + if ((mysql_table = get_purge_table(thd))) { + return mysql_table; + } + } else { + if (table->vc_templ->mysql_table_query_id == thd_get_query_id(thd)) { + return table->vc_templ->mysql_table; + } } char dbname[MAX_DATABASE_NAME_LEN + 1]; @@ -22270,15 +22163,14 @@ innobase_find_mysql_table_for_vc( tbnamelen = filename_to_tablename(tbname, t_tbname, MAX_TABLE_NAME_LEN + 1); - TABLE *mysql_table = find_fk_open_table(thd, t_dbname, dbnamelen, - t_tbname, tbnamelen); - - if (!mysql_table && THDVAR(thd, background_thread)) { - /* only open the table in background purge threads */ - mysql_table = open_purge_table(thd, t_dbname, dbnamelen, - t_tbname, tbnamelen); + if (bg_thread) { + return open_purge_table(thd, t_dbname, dbnamelen, + t_tbname, tbnamelen); } + mysql_table = find_fk_open_table(thd, t_dbname, dbnamelen, + t_tbname, tbnamelen); + table->vc_templ->mysql_table = mysql_table; table->vc_templ->mysql_table_query_id = thd_get_query_id(thd); return mysql_table; @@ -23038,6 +22930,9 @@ static void innodb_remember_check_sysvar_funcs() /* remember build-in sysvar check functions */ ut_ad((MYSQL_SYSVAR_NAME(checksum_algorithm).flags & 0x1FF) == PLUGIN_VAR_ENUM); check_sysvar_enum = MYSQL_SYSVAR_NAME(checksum_algorithm).check; + + ut_ad((MYSQL_SYSVAR_NAME(flush_log_at_timeout).flags & 15) == PLUGIN_VAR_INT); + check_sysvar_int = MYSQL_SYSVAR_NAME(flush_log_at_timeout).check; } /********************************************************************//** diff --git a/storage/innobase/handler/ha_innodb.h b/storage/innobase/handler/ha_innodb.h index a5e9c533fb0..6f87e0cf2f0 100644 --- a/storage/innobase/handler/ha_innodb.h +++ b/storage/innobase/handler/ha_innodb.h @@ -170,6 +170,10 @@ public: int index_last(uchar * buf); + /* Copy a cached MySQL row. If requested, also avoids + overwriting non-read columns. */ + void copy_cached_row(uchar *to_rec, const uchar *from_rec, + uint rec_length); int rnd_init(bool scan); int rnd_end(); @@ -570,11 +574,6 @@ bool thd_binlog_filter_ok(const MYSQL_THD thd); */ bool thd_sqlcom_can_generate_row_events(const MYSQL_THD thd); -/** Gets information on the durability property requested by a thread. -@param thd Thread handle -@return a durability property. */ -durability_properties thd_get_durability_property(const MYSQL_THD thd); - /** Is strict sql_mode set. @param thd Thread object @return True if sql_mode has strict mode (all or trans), false otherwise. */ @@ -619,8 +618,6 @@ extern "C" void wsrep_thd_set_wsrep_last_query_id(THD *thd, query_id_t id); extern const struct _ft_vft ft_vft_result; -#define FTS_NGRAM_PARSER_NAME "ngram" - /** Structure Returned by ha_innobase::ft_init_ext() */ typedef struct new_ft_info { @@ -656,14 +653,11 @@ and returns true. @return true if the index name matches the reserved name */ bool innobase_index_name_is_reserved( - THD* thd, /*!< in/out: MySQL connection */ - const KEY* key_info, /*!< in: Indexes to be - created */ - ulint num_of_keys) /*!< in: Number of indexes to - be created. */ - MY_ATTRIBUTE((warn_unused_result)); - -extern const char reserved_file_per_table_space_name[]; + THD* thd, /*!< in/out: MySQL connection */ + const KEY* key_info, /*!< in: Indexes to be created */ + ulint num_of_keys) /*!< in: Number of indexes to + be created. */ + MY_ATTRIBUTE((nonnull(1), warn_unused_result)); #ifdef WITH_WSREP //extern "C" int wsrep_trx_is_aborting(void *thd_ptr); @@ -911,18 +905,6 @@ innodb_base_col_setup_for_stored( /** whether this is a computed virtual column */ #define innobase_is_v_fld(field) ((field)->vcol_info && !(field)->stored_in_db()) -/** Release temporary latches. -Call this function when mysqld passes control to the client. That is to -avoid deadlocks on the adaptive hash S-latch possibly held by thd. For more -documentation, see handler.cc. -@param[in] hton Handlerton. -@param[in] thd MySQL thread. -@return 0 */ -int -innobase_release_temporary_latches( - handlerton* hton, - THD* thd); - /** Always normalize table name to lower case on Windows */ #ifdef _WIN32 #define normalize_table_name(norm_name, name) \ diff --git a/storage/innobase/handler/ha_innopart.cc b/storage/innobase/handler/ha_innopart.cc deleted file mode 100644 index 1041871805e..00000000000 --- a/storage/innobase/handler/ha_innopart.cc +++ /dev/null @@ -1,4291 +0,0 @@ -/***************************************************************************** - -Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. -Copyright (c) 2016, 2017, MariaDB Corporation. - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; version 2 of the License. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA - -*****************************************************************************/ - -/** @file ha_innopart.cc -Code for native partitioning in InnoDB. - -Created Nov 22, 2013 Mattias Jonsson */ - -#include "univ.i" - -/* Include necessary SQL headers */ -#include -#include -#include -#include -#include -#include -#include -#include - -/* Include necessary InnoDB headers */ -#include "btr0sea.h" -#include "dict0dict.h" -#include "dict0stats.h" -#include "lock0lock.h" -#include "row0import.h" -#include "row0merge.h" -#include "row0mysql.h" -#include "row0quiesce.h" -#include "row0sel.h" -#include "row0ins.h" -#include "row0upd.h" -#include "fsp0sysspace.h" -#include "ut0ut.h" - -#include "ha_innodb.h" -#include "ha_innopart.h" -#include "partition_info.h" -#include "key.h" - -#define INSIDE_HA_INNOPART_CC - -/* To be backwards compatible we also fold partition separator on windows. */ -#ifdef _WIN32 -static const char* part_sep = "#p#"; -static const char* sub_sep = "#sp#"; -#else -static const char* part_sep = "#P#"; -static const char* sub_sep = "#SP#"; -#endif /* _WIN32 */ - -/* Partition separator for *nix platforms */ -const char* part_sep_nix = "#P#"; -const char* sub_sep_nix = "#SP#"; - -extern char* innobase_file_format_max; - -Ha_innopart_share::Ha_innopart_share( - TABLE_SHARE* table_share) - : - Partition_share(), - m_table_parts(), - m_index_mapping(), - m_tot_parts(), - m_index_count(), - m_ref_count(), - m_table_share(table_share) -{} - -Ha_innopart_share::~Ha_innopart_share() -{ - ut_ad(m_ref_count == 0); - if (m_table_parts != NULL) { - ut_free(m_table_parts); - m_table_parts = NULL; - } - if (m_index_mapping != NULL) { - ut_free(m_index_mapping); - m_index_mapping = NULL; - } -} - -/** Fold to lower case if windows or lower_case_table_names == 1. -@param[in,out] s String to fold.*/ -void -Ha_innopart_share::partition_name_casedn_str( - char* s) -{ -#ifdef _WIN32 - innobase_casedn_str(s); -#endif -} - -/** Translate and append partition name. -@param[out] to String to write in filesystem charset -@param[in] from Name in system charset -@param[in] sep Separator -@param[in] len Max length of to buffer -@return length of written string. */ -size_t -Ha_innopart_share::append_sep_and_name( - char* to, - const char* from, - const char* sep, - size_t len) -{ - size_t ret; - size_t sep_len = strlen(sep); - - ut_ad(len > sep_len + strlen(from)); - ut_ad(to != NULL); - ut_ad(from != NULL); - ut_ad(from[0] != '\0'); - memcpy(to, sep, sep_len); - - ret = tablename_to_filename(from, to + sep_len, - len - sep_len); - - /* Don't convert to lower case for nix style name. */ - if (strcmp(sep, part_sep_nix) != 0 - && strcmp(sep, sub_sep_nix) != 0) { - - partition_name_casedn_str(to); - } - - return(ret + sep_len); -} - -/** Copy a cached MySQL row. -If requested, also avoids overwriting non-read columns. -@param[out] buf Row in MySQL format. -@param[in] cached_row Which row to copy. */ -inline -void -ha_innopart::copy_cached_row( - uchar* buf, - const uchar* cached_row) -{ - if (m_prebuilt->keep_other_fields_on_keyread) { - row_sel_copy_cached_fields_for_mysql(buf, cached_row, - m_prebuilt); - } else { - memcpy(buf, cached_row, m_rec_length); - } -} - -/** Open one partition. -@param[in] part_id Partition id to open. -@param[in] partition_name Name of internal innodb table to open. -@return false on success else true. */ -bool -Ha_innopart_share::open_one_table_part( - uint part_id, - const char* partition_name) -{ - char norm_name[FN_REFLEN]; - - normalize_table_name(norm_name, partition_name); - m_table_parts[part_id] = - ha_innobase::open_dict_table(partition_name, norm_name, - TRUE, DICT_ERR_IGNORE_NONE); - - if (m_table_parts[part_id] == NULL) { - return(true); - } - - dict_table_t *ib_table = m_table_parts[part_id]; - if ((!DICT_TF2_FLAG_IS_SET(ib_table, DICT_TF2_FTS_HAS_DOC_ID) - && m_table_share->fields - != (dict_table_get_n_user_cols(ib_table) - + dict_table_get_n_v_cols(ib_table))) - || (DICT_TF2_FLAG_IS_SET(ib_table, DICT_TF2_FTS_HAS_DOC_ID) - && (m_table_share->fields - != dict_table_get_n_user_cols(ib_table) - + dict_table_get_n_v_cols(ib_table) - 1))) { - ib::warn() << "Partition `" << get_partition_name(part_id) - << "` contains " << dict_table_get_n_user_cols(ib_table) - << " user defined columns in InnoDB, but " - << m_table_share->fields - << " columns in MySQL. Please check" - " INFORMATION_SCHEMA.INNODB_SYS_COLUMNS and " REFMAN - "innodb-troubleshooting.html for how to resolve the" - " issue."; - - /* Mark this partition as corrupted, so the drop table - or force recovery can still use it, but not others. - TODO: persist table->corrupted so it will be retained on - restart and out-of-bounds operations will see it. */ - - ib_table->corrupted = true; - dict_table_close(ib_table, FALSE, FALSE); - } - - /* TODO: To save memory, compare with first partition and reuse - the column names etc. in the internal InnoDB meta-data cache. */ - - return(false); -} - -/** Set up the virtual column template for partition table, and points -all m_table_parts[]->vc_templ to it. -@param[in] table MySQL TABLE object -@param[in] ib_table InnoDB dict_table_t -@param[in] table_name Table name (db/table_name) */ -void -Ha_innopart_share::set_v_templ( - TABLE* table, - dict_table_t* ib_table, - const char* name) -{ - ut_ad(mutex_own(&dict_sys->mutex)); - - if (ib_table->n_v_cols > 0) { - for (ulint i = 0; i < m_tot_parts; i++) { - if (m_table_parts[i]->vc_templ == NULL) { - m_table_parts[i]->vc_templ - = UT_NEW_NOKEY(dict_vcol_templ_t()); - m_table_parts[i]->vc_templ->vtempl = NULL; - } else if (m_table_parts[i]->get_ref_count() == 1) { - /* Clean and refresh the template */ - dict_free_vc_templ(m_table_parts[i]->vc_templ); - m_table_parts[i]->vc_templ->vtempl = NULL; - } - - if (m_table_parts[i]->vc_templ->vtempl == NULL) { - innobase_build_v_templ( - table, ib_table, - m_table_parts[i]->vc_templ, - NULL, true, name); - } - } - } -} - -/** Initialize the share with table and indexes per partition. -@param[in] part_info Partition info (partition names to use). -@param[in] table_name Table name (db/table_name). -@return false on success else true. */ -bool -Ha_innopart_share::open_table_parts( - partition_info* part_info, - const char* table_name) -{ - size_t table_name_len; - size_t len; - uint ib_num_index; - uint mysql_num_index; - char partition_name[FN_REFLEN]; - bool index_loaded = true; - -#ifndef DBUG_OFF - if (m_table_share->tmp_table == NO_TMP_TABLE) { - mysql_mutex_assert_owner(&m_table_share->LOCK_ha_data); - } -#endif /* DBUG_OFF */ - m_ref_count++; - if (m_table_parts != NULL) { - ut_ad(m_ref_count > 1); - ut_ad(m_tot_parts > 0); - - /* Increment dict_table_t reference count for all partitions */ - mutex_enter(&dict_sys->mutex); - for (uint i = 0; i < m_tot_parts; i++) { - dict_table_t* table = m_table_parts[i]; - table->acquire(); - ut_ad(table->get_ref_count() >= m_ref_count); - } - mutex_exit(&dict_sys->mutex); - - return(false); - } - ut_ad(m_ref_count == 1); - m_tot_parts = part_info->get_tot_partitions(); - size_t table_parts_size = sizeof(dict_table_t*) * m_tot_parts; - m_table_parts = static_cast( - ut_zalloc(table_parts_size, mem_key_partitioning)); - if (m_table_parts == NULL) { - m_ref_count--; - return(true); - } - - /* Set up the array over all table partitions. */ - table_name_len = strlen(table_name); - memcpy(partition_name, table_name, table_name_len); - List_iterator - part_it(part_info->partitions); - partition_element* part_elem; - uint i = 0; - - while ((part_elem = part_it++)) { - len = append_sep_and_name( - partition_name + table_name_len, - part_elem->partition_name, - part_sep_nix, - FN_REFLEN - table_name_len); - if (part_info->is_sub_partitioned()) { - List_iterator - sub_it(part_elem->subpartitions); - partition_element* sub_elem; - while ((sub_elem = sub_it++)) { - append_sep_and_name( - partition_name - + table_name_len + len, - sub_elem->partition_name, - sub_sep_nix, - FN_REFLEN - table_name_len - len); - if (open_one_table_part(i, partition_name)) { - goto err; - } - i++; - } - } else { - if (open_one_table_part(i, partition_name)) { - goto err; - } - i++; - } - } - ut_ad(i == m_tot_parts); - - /* Create the mapping of mysql index number to innodb indexes. */ - - ib_num_index = (uint) UT_LIST_GET_LEN(m_table_parts[0]->indexes); - mysql_num_index = part_info->table->s->keys; - - /* If there exists inconsistency between MySQL and InnoDB dictionary - (metadata) information, the number of index defined in MySQL - could exceed that in InnoDB, do not build index translation - table in such case. */ - - if (ib_num_index < mysql_num_index) { - ut_ad(0); - goto err; - } - - if (mysql_num_index != 0) { - size_t alloc_size = mysql_num_index * m_tot_parts - * sizeof(*m_index_mapping); - m_index_mapping = static_cast( - ut_zalloc(alloc_size, mem_key_partitioning)); - if (m_index_mapping == NULL) { - - /* Report an error if index_mapping continues to be - NULL and mysql_num_index is a non-zero value. */ - - ib::error() << "Failed to allocate memory for" - " index translation table. Number of" - " Index:" << mysql_num_index; - goto err; - } - } - - /* For each index in the mysql key_info array, fetch its - corresponding InnoDB index pointer into index_mapping - array. */ - - for (ulint idx = 0; idx < mysql_num_index; idx++) { - for (ulint part = 0; part < m_tot_parts; part++) { - ulint count = part * mysql_num_index + idx; - - /* Fetch index pointers into index_mapping according - to mysql index sequence. */ - - m_index_mapping[count] = dict_table_get_index_on_name( - m_table_parts[part], - part_info->table->key_info[idx].name); - - if (m_index_mapping[count] == NULL) { - ib::error() << "Cannot find index `" - << part_info->table->key_info[idx].name - << "` in InnoDB index dictionary" - " partition `" - << get_partition_name(part) << "`."; - index_loaded = false; - break; - } - - /* Double check fetched index has the same - column info as those in mysql key_info. */ - - if (!innobase_match_index_columns( - &part_info->table->key_info[idx], - m_index_mapping[count])) { - ib::error() << "Found index `" - << part_info->table->key_info[idx].name - << "` whose column info does not match" - " that of MySQL."; - index_loaded = false; - break; - } - } - } - if (!index_loaded && m_index_mapping != NULL) { - ut_free(m_index_mapping); - m_index_mapping = NULL; - } - - /* Successfully built the translation table. */ - m_index_count = mysql_num_index; - - return(false); -err: - close_table_parts(); - - return(true); -} - -/** Close all partitions. */ -void -Ha_innopart_share::close_table_parts() -{ -#ifndef DBUG_OFF - if (m_table_share->tmp_table == NO_TMP_TABLE) { - mysql_mutex_assert_owner(&m_table_share->LOCK_ha_data); - } -#endif /* DBUG_OFF */ - m_ref_count--; - if (m_ref_count != 0) { - - /* Decrement dict_table_t reference count for all partitions */ - mutex_enter(&dict_sys->mutex); - for (uint i = 0; i < m_tot_parts; i++) { - dict_table_t* table = m_table_parts[i]; - table->release(); - ut_ad(table->get_ref_count() >= m_ref_count); - } - mutex_exit(&dict_sys->mutex); - - return; - } - - /* Last instance closed, close all table partitions and - free the memory. */ - - mutex_enter(&dict_sys->mutex); - if (m_table_parts != NULL) { - for (uint i = 0; i < m_tot_parts; i++) { - if (m_table_parts[i] != NULL) { - dict_table_close(m_table_parts[i], TRUE, TRUE); - } - } - ut_free(m_table_parts); - m_table_parts = NULL; - } - mutex_exit(&dict_sys->mutex); - if (m_index_mapping != NULL) { - ut_free(m_index_mapping); - m_index_mapping = NULL; - } - - m_tot_parts = 0; - m_index_count = 0; -} - -/** Get index. -Find the index of the specified partition and key number. -@param[in] part_id Partition number. -@param[in] keynr Key number. -@return Index pointer or NULL. */ -inline -dict_index_t* -Ha_innopart_share::get_index( - uint part_id, - uint keynr) -{ - ut_a(part_id < m_tot_parts); - ut_ad(keynr < m_index_count || keynr == MAX_KEY); - if (m_index_mapping == NULL - || keynr >= m_index_count) { - - if (keynr == MAX_KEY) { - return(dict_table_get_first_index( - get_table_part(part_id))); - } - return(NULL); - } - return(m_index_mapping[m_index_count * part_id + keynr]); -} - -/** Get MySQL key number corresponding to InnoDB index. -Calculates the key number used inside MySQL for an Innobase index. We will -first check the "index translation table" for a match of the index to get -the index number. If there does not exist an "index translation table", -or not able to find the index in the translation table, then we will fall back -to the traditional way of looping through dict_index_t list to find a -match. In this case, we have to take into account if we generated a -default clustered index for the table -@param[in] part_id Partition the index belongs to. -@param[in] index Index to return MySQL key number for. -@return the key number used inside MySQL or UINT_MAX if key is not found. */ -inline -uint -Ha_innopart_share::get_mysql_key( - uint part_id, - const dict_index_t* index) -{ - ut_ad(index != NULL); - ut_ad(m_index_mapping != NULL); - ut_ad(m_tot_parts); - - if (index != NULL && m_index_mapping != NULL) { - uint start; - uint end; - - if (part_id < m_tot_parts) { - start = part_id * m_index_count; - end = start + m_index_count; - } else { - start = 0; - end = m_tot_parts * m_index_count; - } - for (uint i = start; i < end; i++) { - if (m_index_mapping[i] == index) { - return(i % m_index_count); - } - } - - /* Print an error message if we cannot find the index - in the "index translation table". */ - - if (index->is_committed()) { - ib::error() << "Cannot find index " - << index->name - << " in InnoDB index translation table."; - } - } - - return(UINT_MAX); -} - -/** Helper function for set bit in bitmap. -@param[in,out] buf Bitmap buffer to update bit in. -@param[in] bit_pos Bit number (index starts at 0). */ -static -inline -void -set_bit( - byte* buf, - size_t pos) -{ - buf[pos/8] |= (0x1 << (pos & 0x7)); -} - -/** Helper function for clear bit in bitmap. -@param[in,out] buf Bitmap buffer to update bit in. -@param[in] bit_pos Bit number (index starts at 0). */ -static -inline -void -clear_bit( - byte* buf, - size_t pos) -{ - buf[pos/8] &= ~(0x1 << (pos & 0x7)); -} - -/** Helper function for get bit in bitmap. -@param[in,out] buf Bitmap buffer. -@param[in] bit_pos Bit number (index starts at 0). -@return byte set to 0x0 or 0x1. -@retval 0x0 bit not set. -@retval 0x1 bet set. */ -static -inline -byte -get_bit( - byte* buf, - size_t pos) -{ - return((buf[pos/8] >> (pos & 0x7)) & 0x1); -} - -/** Helper class for encapsulating new/altered partitions during -ADD/REORG/... PARTITION. */ -class Altered_partitions -{ -private: - /** New partitions during ADD/REORG/... PARTITION. */ - dict_table_t** m_new_table_parts; - - /** Insert nodes per partition. */ - ins_node_t** m_ins_nodes; - - /** sql_stat_start per partition. */ - byte* m_sql_stat_start; - - /** Trx id per partition. */ - trx_id_t* m_trx_ids; - - /** Number of new partitions. */ - size_t m_num_new_parts; - - /** Only need to create the partitions (no open/lock). */ - bool m_only_create; - -public: - Altered_partitions( - uint n_partitions, - bool only_create); - - ~Altered_partitions(); - - bool - initialize(); - - bool - only_create() const - { - return(m_only_create); - } - - /** Set currently used partition. - @param[in] new_part_id Partition id to set. - @param[in] part InnoDB table to use. */ - inline - void - set_part( - ulint new_part_id, - dict_table_t* part) - { - ut_ad(m_new_table_parts[new_part_id] == NULL); - m_new_table_parts[new_part_id] = part; - set_bit(m_sql_stat_start, new_part_id); - } - - /** Get lower level InnoDB table for partition. - @param[in] part_id Partition id. - @return Lower level InnoDB table for the partition id. */ - inline - dict_table_t* - part( - uint part_id) const - { - ut_ad(part_id < m_num_new_parts); - return(m_new_table_parts[part_id]); - } - - /** Set up prebuilt for using a specified partition. - @param[in] prebuilt Prebuilt to update. - @param[in] new_part_id Partition to use. */ - inline - void - get_prebuilt( - row_prebuilt_t* prebuilt, - uint new_part_id) const - { - ut_ad(m_new_table_parts[new_part_id]); - prebuilt->table = m_new_table_parts[new_part_id]; - prebuilt->ins_node = m_ins_nodes[new_part_id]; - prebuilt->trx_id = m_trx_ids[new_part_id]; - prebuilt->sql_stat_start = get_bit(m_sql_stat_start, - new_part_id); - } - - /** Update cached values for a partition from prebuilt. - @param[in] prebuilt Prebuilt to copy from. - @param[in] new_part_id Partition id to copy. */ - inline - void - set_from_prebuilt( - row_prebuilt_t* prebuilt, - uint new_part_id) - { - ut_ad(m_new_table_parts[new_part_id] == prebuilt->table); - m_ins_nodes[new_part_id] = prebuilt->ins_node; - m_trx_ids[new_part_id] = prebuilt->trx_id; - if (prebuilt->sql_stat_start == 0) { - clear_bit(m_sql_stat_start, new_part_id); - } - } -}; - -Altered_partitions::Altered_partitions( - uint n_partitions, - bool only_create) - : - m_new_table_parts(), - m_ins_nodes(), - m_sql_stat_start(), - m_trx_ids(), - m_num_new_parts(n_partitions), - m_only_create(only_create) - {} - -Altered_partitions::~Altered_partitions() -{ - if (m_new_table_parts != NULL) { - for (ulint i = 0; i < m_num_new_parts; i++) { - if (m_new_table_parts[i] != NULL) { - dict_table_close(m_new_table_parts[i], - false, true); - } - } - ut_free(m_new_table_parts); - m_new_table_parts = NULL; - } - if (m_ins_nodes != NULL) { - for (ulint i = 0; i < m_num_new_parts; i++) { - if (m_ins_nodes[i] != NULL) { - ins_node_t* ins = m_ins_nodes[i]; - ut_ad(ins->select == NULL); - que_graph_free_recursive(ins->select); - ins->select = NULL; - if (ins->entry_sys_heap != NULL) { - mem_heap_free(ins->entry_sys_heap); - ins->entry_sys_heap = NULL; - } - } - } - ut_free(m_ins_nodes); - m_ins_nodes = NULL; - } - if (m_sql_stat_start != NULL) { - ut_free(m_sql_stat_start); - m_sql_stat_start = NULL; - } - if (m_trx_ids != NULL) { - ut_free(m_trx_ids); - m_trx_ids = NULL; - } -} - -/** Initialize the object. -@return false on success else true. */ -bool -Altered_partitions::initialize() -{ - size_t alloc_size = sizeof(*m_new_table_parts) * m_num_new_parts; - m_new_table_parts = static_cast( - ut_zalloc(alloc_size, mem_key_partitioning)); - if (m_new_table_parts == NULL) { - return(true); - } - - alloc_size = sizeof(*m_ins_nodes) * m_num_new_parts; - m_ins_nodes = static_cast( - ut_zalloc(alloc_size, mem_key_partitioning)); - if (m_ins_nodes == NULL) { - ut_free(m_new_table_parts); - m_new_table_parts = NULL; - return(true); - } - - alloc_size = sizeof(*m_sql_stat_start) - * UT_BITS_IN_BYTES(m_num_new_parts); - m_sql_stat_start = static_cast( - ut_zalloc(alloc_size, mem_key_partitioning)); - if (m_sql_stat_start == NULL) { - ut_free(m_new_table_parts); - m_new_table_parts = NULL; - ut_free(m_ins_nodes); - m_ins_nodes = NULL; - return(true); - } - - alloc_size = sizeof(*m_trx_ids) * m_num_new_parts; - m_trx_ids = static_cast( - ut_zalloc(alloc_size, mem_key_partitioning)); - if (m_trx_ids == NULL) { - ut_free(m_new_table_parts); - m_new_table_parts = NULL; - ut_free(m_ins_nodes); - m_ins_nodes = NULL; - ut_free(m_sql_stat_start); - m_sql_stat_start = NULL; - return(true); - } - - return(false); -} - -/** Construct ha_innopart handler. -@param[in] hton Handlerton. -@param[in] table_arg MySQL Table. -@return a new ha_innopart handler. */ -ha_innopart::ha_innopart( - handlerton* hton, - TABLE_SHARE* table_arg) - : - ha_innobase(hton, table_arg), - Partition_helper(this), - m_ins_node_parts(), - m_upd_node_parts(), - m_blob_heap_parts(), - m_trx_id_parts(), - m_row_read_type_parts(), - m_sql_stat_start_parts(), - m_pcur(), - m_clust_pcur(), - m_new_partitions() -{ - m_int_table_flags &= ~(HA_INNOPART_DISABLED_TABLE_FLAGS); - - /* INNOBASE_SHARE is not used in ha_innopart. - This also flags for ha_innobase that it is a partitioned table. - And make it impossible to use legacy share functionality. */ - - m_share = NULL; -} - -/** Destruct ha_innopart handler. */ -ha_innopart::~ha_innopart() -{} - -/** Returned supported alter table flags. -@param[in] flags Flags to support. -@return Supported flags. */ -uint -ha_innopart::alter_table_flags( - uint flags) -{ - return(HA_PARTITION_FUNCTION_SUPPORTED | HA_FAST_CHANGE_PARTITION); -} - -/** Set the autoinc column max value. -This should only be called once from ha_innobase::open(). -Therefore there's no need for a covering lock. -@param[in] no_lock Ignored! -@return 0 for success or error code. */ -inline -int -ha_innopart::initialize_auto_increment( - bool /* no_lock */) -{ - int error = 0; - ulonglong auto_inc = 0; - const Field* field = table->found_next_number_field; - -#ifndef DBUG_OFF - if (table_share->tmp_table == NO_TMP_TABLE) - { - mysql_mutex_assert_owner(m_part_share->auto_inc_mutex); - } -#endif - - /* Since a table can already be "open" in InnoDB's internal - data dictionary, we only init the autoinc counter once, the - first time the table is loaded. We can safely reuse the - autoinc value from a previous MySQL open. */ - - if (m_part_share->auto_inc_initialized) { - /* Already initialized, nothing to do. */ - return(0); - } - - if (field == NULL) { - ib::info() << "Unable to determine the AUTOINC column name"; - } - - if (srv_force_recovery >= SRV_FORCE_NO_IBUF_MERGE) { - /* If the recovery level is set so high that writes - are disabled we force the AUTOINC counter to 0 - value effectively disabling writes to the table. - Secondly, we avoid reading the table in case the read - results in failure due to a corrupted table/index. - - We will not return an error to the client, so that the - tables can be dumped with minimal hassle. If an error - were returned in this case, the first attempt to read - the table would fail and subsequent SELECTs would succeed. */ - - } else if (field == NULL) { - /* This is a far more serious error, best to avoid - opening the table and return failure. */ - - my_error(ER_AUTOINC_READ_FAILED, MYF(0)); - error = HA_ERR_AUTOINC_READ_FAILED; - } else { - ib_uint64_t col_max_value = field->get_max_int_value(); - - update_thd(ha_thd()); - - for (uint part = 0; part < m_tot_parts; part++) { - dict_table_t* ib_table - = m_part_share->get_table_part(part); - dict_table_autoinc_lock(ib_table); - ut_ad(ib_table->persistent_autoinc); - ib_uint64_t read_auto_inc - = dict_table_autoinc_read(ib_table); - if (read_auto_inc == 0) { - read_auto_inc = btr_read_autoinc( - dict_table_get_first_index(ib_table)); - - /* At the this stage we do not know the - increment nor the offset, - so use a default increment of 1. */ - - read_auto_inc = innobase_next_autoinc( - read_auto_inc, 1, 1, 0, col_max_value); - dict_table_autoinc_initialize(ib_table, - read_auto_inc); - } - set_if_bigger(auto_inc, read_auto_inc); - dict_table_autoinc_unlock(ib_table); - } - } - -done: - m_part_share->next_auto_inc_val = auto_inc; - m_part_share->auto_inc_initialized = true; - return(error); -} - -/** Opens a partitioned InnoDB table. -Initializes needed data and opens the table which already exists -in an InnoDB database. -@param[in] name Table name (db/tablename) -@param[in] mode Not used -@param[in] test_if_locked Not used -@return 0 or error number. */ -int -ha_innopart::open( - const char* name, - int /*mode*/, - uint /*test_if_locked*/) -{ - dict_table_t* ib_table; - char norm_name[FN_REFLEN]; - THD* thd; - - DBUG_ENTER("ha_innopart::open"); - - ut_ad(table); - if (m_part_info == NULL) { - /* Must be during ::clone()! */ - ut_ad(table->part_info != NULL); - m_part_info = table->part_info; - } - thd = ha_thd(); - - /* Under some cases MySQL seems to call this function while - holding search latch(es). This breaks the latching order as - we acquire dict_sys->mutex below and leads to a deadlock. */ - - if (thd != NULL) { - innobase_release_temporary_latches(ht, thd); - } - - normalize_table_name(norm_name, name); - - m_user_thd = NULL; - - /* Get the Ha_innopart_share from the TABLE_SHARE. */ - lock_shared_ha_data(); - m_part_share = static_cast(get_ha_share_ptr()); - if (m_part_share == NULL) { - m_part_share = new (std::nothrow) - Ha_innopart_share(table_share); - if (m_part_share == NULL) { -share_error: - unlock_shared_ha_data(); - DBUG_RETURN(HA_ERR_INTERNAL_ERROR); - } - set_ha_share_ptr(static_cast(m_part_share)); - } - if (m_part_share->open_table_parts(m_part_info, name) - || m_part_share->populate_partition_name_hash(m_part_info)) { - goto share_error; - } - if (m_part_share->auto_inc_mutex == NULL - && table->found_next_number_field != NULL) { - if (m_part_share->init_auto_inc_mutex(table_share)) { - goto share_error; - } - } - unlock_shared_ha_data(); - - /* Will be allocated if it is needed in ::update_row(). */ - m_upd_buf = NULL; - m_upd_buf_size = 0; - - /* Get pointer to a table object in InnoDB dictionary cache. */ - ib_table = m_part_share->get_table_part(0); - - m_pcur_parts = NULL; - m_clust_pcur_parts = NULL; - m_pcur_map = NULL; - - /* TODO: Handle mismatching #P# vs #p# in upgrading to new DD instead! - See bug#58406, The problem exists when moving partitioned tables - between Windows and Unix-like platforms. InnoDB always folds the name - on windows, partitioning never folds partition (and #P# separator). - I.e. non of it follows lower_case_table_names correctly :( */ - - if (open_partitioning(m_part_share)) - { - close(); - DBUG_RETURN(HA_ERR_INITIALIZATION); - } - - /* Currently we track statistics for all partitions, but for - the secondary indexes we only use the biggest partition. */ - - for (uint part_id = 0; part_id < m_tot_parts; part_id++) { - innobase_copy_frm_flags_from_table_share( - m_part_share->get_table_part(part_id), - table->s); - dict_stats_init(m_part_share->get_table_part(part_id)); - } - - MONITOR_INC(MONITOR_TABLE_OPEN); - - bool no_tablespace; - - /* TODO: Should we do this check for every partition during ::open()? */ - /* TODO: refactor this in ha_innobase so it can increase code reuse. */ - if (dict_table_is_discarded(ib_table)) { - - ib_senderrf(thd, - IB_LOG_LEVEL_WARN, ER_TABLESPACE_DISCARDED, - table->s->table_name.str); - - /* Allow an open because a proper DISCARD should have set - all the flags and index root page numbers to FIL_NULL that - should prevent any DML from running but it should allow DDL - operations. */ - - no_tablespace = false; - - } else if (ib_table->ibd_file_missing) { - - ib_senderrf( - thd, IB_LOG_LEVEL_WARN, - ER_TABLESPACE_MISSING, norm_name); - - /* This means we have no idea what happened to the tablespace - file, best to play it safe. */ - - no_tablespace = true; - } else { - no_tablespace = false; - } - - if (!thd_tablespace_op(thd) && no_tablespace) { - set_my_errno(ENOENT); - - lock_shared_ha_data(); - m_part_share->close_table_parts(); - unlock_shared_ha_data(); - m_part_share = NULL; - - DBUG_RETURN(HA_ERR_NO_SUCH_TABLE); - } - - m_prebuilt = row_create_prebuilt(ib_table, table->s->reclength); - - m_prebuilt->default_rec = table->s->default_values; - ut_ad(m_prebuilt->default_rec); - - DBUG_ASSERT(table != NULL); - m_prebuilt->m_mysql_table = table; - - if (ib_table->n_v_cols > 0) { - mutex_enter(&dict_sys->mutex); - m_part_share->set_v_templ(table, ib_table, name); - mutex_exit(&dict_sys->mutex); - } - - /* Looks like MySQL-3.23 sometimes has primary key number != 0. */ - m_primary_key = table->s->primary_key; - key_used_on_scan = m_primary_key; - - /* Allocate a buffer for a 'row reference'. A row reference is - a string of bytes of length ref_length which uniquely specifies - a row in our table. Note that MySQL may also compare two row - references for equality by doing a simple memcmp on the strings - of length ref_length! */ - - if (!row_table_got_default_clust_index(ib_table)) { - - m_prebuilt->clust_index_was_generated = FALSE; - - if (UNIV_UNLIKELY(m_primary_key >= MAX_KEY)) { - table_name_t table_name; - table_name.m_name = const_cast(name); - ib::error() << "Table " << table_name - << " has a primary key in InnoDB data" - " dictionary, but not in MySQL!"; - - /* This mismatch could cause further problems - if not attended, bring this to the user's attention - by printing a warning in addition to log a message - in the errorlog. */ - - push_warning_printf(thd, Sql_condition::SL_WARNING, - ER_NO_SUCH_INDEX, - "Table %s has a" - " primary key in InnoDB data" - " dictionary, but not in" - " MySQL!", name); - - /* If m_primary_key >= MAX_KEY, its (m_primary_key) - value could be out of bound if continue to index - into key_info[] array. Find InnoDB primary index, - and assign its key_length to ref_length. - In addition, since MySQL indexes are sorted starting - with primary index, unique index etc., initialize - ref_length to the first index key length in - case we fail to find InnoDB cluster index. - - Please note, this will not resolve the primary - index mismatch problem, other side effects are - possible if users continue to use the table. - However, we allow this table to be opened so - that user can adopt necessary measures for the - mismatch while still being accessible to the table - date. */ - - if (table->key_info == NULL) { - ut_ad(table->s->keys == 0); - ref_length = 0; - } else { - ref_length = table->key_info[0].key_length; - } - - /* Find corresponding cluster index - key length in MySQL's key_info[] array. */ - - for (uint i = 0; i < table->s->keys; i++) { - dict_index_t* index; - index = innopart_get_index(0, i); - if (dict_index_is_clust(index)) { - ref_length = - table->key_info[i].key_length; - } - } - ut_a(ref_length); - ref_length += PARTITION_BYTES_IN_POS; - } else { - /* MySQL allocates the buffer for ref. - key_info->key_length includes space for all key - columns + one byte for each column that may be - NULL. ref_length must be as exact as possible to - save space, because all row reference buffers are - allocated based on ref_length. */ - - ref_length = table->key_info[m_primary_key].key_length; - ref_length += PARTITION_BYTES_IN_POS; - } - } else { - if (m_primary_key != MAX_KEY) { - table_name_t table_name; - table_name.m_name = const_cast(name); - ib::error() << "Table " << table_name - << " has no primary key in InnoDB data" - " dictionary, but has one in MySQL! If you" - " created the table with a MySQL version <" - " 3.23.54 and did not define a primary key," - " but defined a unique key with all non-NULL" - " columns, then MySQL internally treats that" - " key as the primary key. You can fix this" - " error by dump + DROP + CREATE + reimport" - " of the table."; - - /* This mismatch could cause further problems - if not attended, bring this to the user attention - by printing a warning in addition to log a message - in the errorlog. */ - - push_warning_printf(thd, Sql_condition::SL_WARNING, - ER_NO_SUCH_INDEX, - "InnoDB: Table %s has no" - " primary key in InnoDB data" - " dictionary, but has one in" - " MySQL!", name); - } - - m_prebuilt->clust_index_was_generated = TRUE; - - ref_length = DATA_ROW_ID_LEN; - ref_length += PARTITION_BYTES_IN_POS; - - /* If we automatically created the clustered index, then - MySQL does not know about it, and MySQL must NOT be aware - of the index used on scan, to make it avoid checking if we - update the column of the index. That is why we assert below - that key_used_on_scan is the undefined value MAX_KEY. - The column is the row id in the automatical generation case, - and it will never be updated anyway. */ - - if (key_used_on_scan != MAX_KEY) { - table_name_t table_name; - table_name.m_name = const_cast(name); - ib::warn() << "Table " << table_name - << " key_used_on_scan is " - << key_used_on_scan << " even though there is" - " no primary key inside InnoDB."; - } - } - - /* Index block size in InnoDB: used by MySQL in query optimization. */ - stats.block_size = UNIV_PAGE_SIZE; - - if (m_prebuilt->table != NULL) { - /* We update the highest file format in the system table - space, if this table has higher file format setting. */ - - trx_sys_file_format_max_upgrade( - (const char**) &innobase_file_format_max, - dict_table_get_format(m_prebuilt->table)); - } - - /* Only if the table has an AUTOINC column. */ - if (m_prebuilt->table != NULL - && !m_prebuilt->table->ibd_file_missing - && table->found_next_number_field != NULL) { - int error; - - /* Since a table can already be "open" in InnoDB's internal - data dictionary, we only init the autoinc counter once, the - first time the table is loaded, - see ha_innopart::initialize_auto_increment. - We can safely reuse the autoinc value from a previous MySQL - open. */ - - lock_auto_increment(); - error = initialize_auto_increment(false); - unlock_auto_increment(); - if (error != 0) { - close(); - DBUG_RETURN(error); - } - } - -#ifdef HA_INNOPART_SUPPORTS_FULLTEXT - /* Set plugin parser for fulltext index. */ - for (uint i = 0; i < table->s->keys; i++) { - if (table->key_info[i].flags & HA_USES_PARSER) { - dict_index_t* index = innobase_get_index(i); - plugin_ref parser = table->key_info[i].parser; - - ut_ad(index->type & DICT_FTS); - index->parser = - static_cast( - plugin_decl(parser)->info); - - DBUG_EXECUTE_IF("fts_instrument_use_default_parser", - index->parser = &fts_default_parser;); - } - } -#endif /* HA_INNOPART_SUPPORTS_FULLTEXT */ - - size_t alloc_size = sizeof(*m_ins_node_parts) * m_tot_parts; - m_ins_node_parts = static_cast( - ut_zalloc(alloc_size, mem_key_partitioning)); - - alloc_size = sizeof(*m_upd_node_parts) * m_tot_parts; - m_upd_node_parts = static_cast( - ut_zalloc(alloc_size, mem_key_partitioning)); - - alloc_blob_heap_array(); - - alloc_size = sizeof(*m_trx_id_parts) * m_tot_parts; - m_trx_id_parts = static_cast( - ut_zalloc(alloc_size, mem_key_partitioning)); - - alloc_size = sizeof(*m_row_read_type_parts) * m_tot_parts; - m_row_read_type_parts = static_cast( - ut_zalloc(alloc_size, mem_key_partitioning)); - - alloc_size = UT_BITS_IN_BYTES(m_tot_parts); - m_sql_stat_start_parts = static_cast( - ut_zalloc(alloc_size, mem_key_partitioning)); - if (m_ins_node_parts == NULL - || m_upd_node_parts == NULL - || m_blob_heap_parts == NULL - || m_trx_id_parts == NULL - || m_row_read_type_parts == NULL - || m_sql_stat_start_parts == NULL) { - close(); // Frees all the above. - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - info(HA_STATUS_NO_LOCK | HA_STATUS_VARIABLE | HA_STATUS_CONST); - - DBUG_RETURN(0); -} - -/** Get a cloned ha_innopart handler. -@param[in] name Table name. -@param[in] mem_root MySQL mem_root to use. -@return new ha_innopart handler. */ -handler* -ha_innopart::clone( - const char* name, - MEM_ROOT* mem_root) -{ - ha_innopart* new_handler; - - DBUG_ENTER("ha_innopart::clone"); - - new_handler = dynamic_cast(handler::clone(name, - mem_root)); - if (new_handler != NULL) { - ut_ad(new_handler->m_prebuilt != NULL); - - new_handler->m_prebuilt->select_lock_type = - m_prebuilt->select_lock_type; - } - - DBUG_RETURN(new_handler); -} - -/** Clear used ins_nodes and upd_nodes. */ -void ha_innopart::clear_ins_upd_nodes() -{ - /* Free memory from insert nodes. */ - if (m_ins_node_parts != NULL) { - for (uint i = 0; i < m_tot_parts; i++) { - if (m_ins_node_parts[i] != NULL) { - ins_node_t* ins = m_ins_node_parts[i]; - if (ins->select != NULL) { - que_graph_free_recursive(ins->select); - ins->select = NULL; - } - - if (ins->entry_sys_heap != NULL) { - mem_heap_free(ins->entry_sys_heap); - ins->entry_sys_heap = NULL; - } - m_ins_node_parts[i] = NULL; - } - } - } - - /* Free memory from update nodes. */ - if (m_upd_node_parts != NULL) { - for (uint i = 0; i < m_tot_parts; i++) { - if (m_upd_node_parts[i] != NULL) { - upd_node_t* upd = m_upd_node_parts[i]; - if (upd->cascade_top) { - mem_heap_free(upd->cascade_heap); - upd->cascade_top = false; - upd->cascade_heap = NULL; - } - if (upd->in_mysql_interface) { - btr_pcur_free_for_mysql(upd->pcur); - upd->in_mysql_interface = FALSE; - } - - if (upd->select != NULL) { - que_graph_free_recursive(upd->select); - upd->select = NULL; - } - if (upd->heap != NULL) { - mem_heap_free(upd->heap); - upd->heap = NULL; - } - m_upd_node_parts[i] = NULL; - } - } - } -} - -/** Closes a handle to an InnoDB table. -@return 0 */ -int -ha_innopart::close() -{ - THD* thd; - - DBUG_ENTER("ha_innopart::close"); - - thd = ha_thd(); - if (thd != NULL) { - innobase_release_temporary_latches(ht, thd); - } - - ut_ad(m_pcur_parts == NULL); - ut_ad(m_clust_pcur_parts == NULL); - close_partitioning(); - - ut_ad(m_part_share != NULL); - if (m_part_share != NULL) { - lock_shared_ha_data(); - m_part_share->close_table_parts(); - unlock_shared_ha_data(); - m_part_share = NULL; - } - clear_ins_upd_nodes(); - free_blob_heap_array(); - - /* Prevent double close of m_prebuilt->table. The real one was done - done in m_part_share->close_table_parts(). */ - m_prebuilt->table = NULL; - row_prebuilt_free(m_prebuilt, FALSE); - - if (m_upd_buf != NULL) { - ut_ad(m_upd_buf_size != 0); - /* Allocated with my_malloc! */ - my_free(m_upd_buf); - m_upd_buf = NULL; - m_upd_buf_size = 0; - } - - if (m_ins_node_parts != NULL) { - ut_free(m_ins_node_parts); - m_ins_node_parts = NULL; - } - if (m_upd_node_parts != NULL) { - ut_free(m_upd_node_parts); - m_upd_node_parts = NULL; - } - if (m_trx_id_parts != NULL) { - ut_free(m_trx_id_parts); - m_trx_id_parts = NULL; - } - if (m_row_read_type_parts != NULL) { - ut_free(m_row_read_type_parts); - m_row_read_type_parts = NULL; - } - if (m_sql_stat_start_parts != NULL) { - ut_free(m_sql_stat_start_parts); - m_sql_stat_start_parts = NULL; - } - - MONITOR_INC(MONITOR_TABLE_CLOSE); - - /* Tell InnoDB server that there might be work for - utility threads: */ - - srv_active_wake_master_thread(); - - DBUG_RETURN(0); -} - -/** Change active partition. -Copies needed info into m_prebuilt from the partition specific memory. -@param[in] part_id Partition to set as active. */ -void -ha_innopart::set_partition( - uint part_id) -{ - DBUG_ENTER("ha_innopart::set_partition"); - - DBUG_PRINT("ha_innopart", ("partition id: %u", part_id)); - - if (part_id >= m_tot_parts) { - ut_ad(0); - DBUG_VOID_RETURN; - } - if (m_pcur_parts != NULL) { - m_prebuilt->pcur = &m_pcur_parts[m_pcur_map[part_id]]; - } - if (m_clust_pcur_parts != NULL) { - m_prebuilt->clust_pcur = - &m_clust_pcur_parts[m_pcur_map[part_id]]; - } - m_prebuilt->ins_node = m_ins_node_parts[part_id]; - m_prebuilt->upd_node = m_upd_node_parts[part_id]; - - /* For unordered scan and table scan, use blob_heap from first - partition as we need exactly one blob. */ - m_prebuilt->blob_heap = m_blob_heap_parts[m_ordered ? part_id : 0]; - -#ifdef UNIV_DEBUG - if (m_prebuilt->blob_heap != NULL) { - DBUG_PRINT("ha_innopart", ("validating blob_heap: %p", - m_prebuilt->blob_heap)); - mem_heap_validate(m_prebuilt->blob_heap); - } -#endif - - m_prebuilt->trx_id = m_trx_id_parts[part_id]; - m_prebuilt->row_read_type = m_row_read_type_parts[part_id]; - m_prebuilt->sql_stat_start = get_bit(m_sql_stat_start_parts, part_id); - m_prebuilt->table = m_part_share->get_table_part(part_id); - m_prebuilt->index = innopart_get_index(part_id, active_index); - - DBUG_VOID_RETURN; -} - -/** Update active partition. -Copies needed info from m_prebuilt into the partition specific memory. -@param[in] part_id Partition to set as active. */ -void -ha_innopart::update_partition( - uint part_id) -{ - DBUG_ENTER("ha_innopart::update_partition"); - DBUG_PRINT("ha_innopart", ("partition id: %u", part_id)); - - if (part_id >= m_tot_parts) { - ut_ad(0); - DBUG_VOID_RETURN; - } - m_ins_node_parts[part_id] = m_prebuilt->ins_node; - m_upd_node_parts[part_id] = m_prebuilt->upd_node; - -#ifdef UNIV_DEBUG - if (m_prebuilt->blob_heap != NULL) { - DBUG_PRINT("ha_innopart", ("validating blob_heap: %p", - m_prebuilt->blob_heap)); - mem_heap_validate(m_prebuilt->blob_heap); - } -#endif - - /* For unordered scan and table scan, use blob_heap from first - partition as we need exactly one blob anytime. */ - m_blob_heap_parts[m_ordered ? part_id : 0] = m_prebuilt->blob_heap; - - m_trx_id_parts[part_id] = m_prebuilt->trx_id; - m_row_read_type_parts[part_id] = m_prebuilt->row_read_type; - if (m_prebuilt->sql_stat_start == 0) { - clear_bit(m_sql_stat_start_parts, part_id); - } - m_last_part = part_id; - DBUG_VOID_RETURN; -} - -/** Was the last returned row semi consistent read. -In an UPDATE or DELETE, if the row under the cursor was locked by -another transaction, and the engine used an optimistic read of the last -committed row value under the cursor, then the engine returns 1 from -this function. MySQL must NOT try to update this optimistic value. If -the optimistic value does not match the WHERE condition, MySQL can -decide to skip over this row. This can be used to avoid unnecessary -lock waits. - -If this method returns true, it will also signal the storage -engine that the next read will be a locking re-read of the row. -@see handler.h and row0mysql.h -@return true if last read was semi consistent else false. */ -bool -ha_innopart::was_semi_consistent_read() -{ - return(m_row_read_type_parts[m_last_part] - == ROW_READ_DID_SEMI_CONSISTENT); -} - -/** Try semi consistent read. -Tell the engine whether it should avoid unnecessary lock waits. -If yes, in an UPDATE or DELETE, if the row under the cursor was locked -by another transaction, the engine may try an optimistic read of -the last committed row value under the cursor. -@see handler.h and row0mysql.h -@param[in] yes Should semi-consistent read be used. */ -void -ha_innopart::try_semi_consistent_read( - bool yes) -{ - ha_innobase::try_semi_consistent_read(yes); - for (uint i = m_part_info->get_first_used_partition(); - i < m_tot_parts; - i = m_part_info->get_next_used_partition(i)) { - - m_row_read_type_parts[i] = m_prebuilt->row_read_type; - } -} - -/** Removes a lock on a row. -Removes a new lock set on a row, if it was not read optimistically. -This can be called after a row has been read in the processing of -an UPDATE or a DELETE query. @see ha_innobase::unlock_row(). */ -void -ha_innopart::unlock_row() -{ - ut_ad(m_last_part < m_tot_parts); - set_partition(m_last_part); - ha_innobase::unlock_row(); - update_partition(m_last_part); -} - -/** Write a row in partition. -Stores a row in an InnoDB database, to the table specified in this -handle. -@param[in] part_id Partition to write to. -@param[in] record A row in MySQL format. -@return 0 or error code. */ -int -ha_innopart::write_row_in_part( - uint part_id, - uchar* record) -{ - int error; - Field* saved_next_number_field = table->next_number_field; - DBUG_ENTER("ha_innopart::write_row_in_part"); - set_partition(part_id); - - /* Prevent update_auto_increment to be called - again in ha_innobase::write_row(). */ - - table->next_number_field = NULL; - - /* TODO: try to avoid creating a new dtuple - (in row_get_prebuilt_insert_row()) for each partition). - Might be needed due to ins_node implementation. */ - - error = ha_innobase::write_row(record); - update_partition(part_id); - table->next_number_field = saved_next_number_field; - DBUG_RETURN(error); -} - -/** Update a row in partition. -Updates a row given as a parameter to a new value. -@param[in] part_id Partition to update row in. -@param[in] old_row Old row in MySQL format. -@param[in] new_row New row in MySQL format. -@return 0 or error number. */ -int -ha_innopart::update_row_in_part( - uint part_id, - const uchar* old_row, - uchar* new_row) -{ - int error; - DBUG_ENTER("ha_innopart::update_row_in_part"); - - set_partition(part_id); - error = ha_innobase::update_row(old_row, new_row); - update_partition(part_id); - DBUG_RETURN(error); -} - -/** Deletes a row in partition. -@param[in] part_id Partition to delete from. -@param[in] record Row to delete in MySQL format. -@return 0 or error number. */ -int -ha_innopart::delete_row_in_part( - uint part_id, - const uchar* record) -{ - int error; - DBUG_ENTER("ha_innopart::delete_row_in_part"); - m_err_rec = NULL; - - m_last_part = part_id; - set_partition(part_id); - error = ha_innobase::delete_row(record); - update_partition(part_id); - DBUG_RETURN(error); -} - -/** Initializes a handle to use an index. -@param[in] keynr Key (index) number. -@param[in] sorted True if result MUST be sorted according to index. -@return 0 or error number. */ -int -ha_innopart::index_init( - uint keynr, - bool sorted) -{ - int error; - uint part_id = m_part_info->get_first_used_partition(); - DBUG_ENTER("ha_innopart::index_init"); - - active_index = keynr; - if (part_id == MY_BIT_NONE) { - DBUG_RETURN(0); - } - - error = ph_index_init_setup(keynr, sorted); - if (error != 0) { - DBUG_RETURN(error); - } - - if (sorted) { - error = init_record_priority_queue(); - if (error != 0) { - /* Needs cleanup in case it returns error. */ - destroy_record_priority_queue(); - DBUG_RETURN(error); - } - /* Disable prefetch. - The prefetch buffer is not partitioning aware, so it may return - rows from a different partition if either the prefetch buffer is - full, or it is non-empty and the partition is exhausted. */ - m_prebuilt->m_no_prefetch = true; - } - - /* For scan across partitions, the keys needs to be materialized */ - m_prebuilt->m_read_virtual_key = true; - - error = change_active_index(part_id, keynr); - if (error != 0) { - destroy_record_priority_queue(); - DBUG_RETURN(error); - } - - DBUG_EXECUTE_IF("partition_fail_index_init", { - destroy_record_priority_queue(); - DBUG_RETURN(HA_ERR_NO_PARTITION_FOUND); - }); - - DBUG_RETURN(0); -} - -/** End index cursor. -@return 0 or error code. */ -int -ha_innopart::index_end() -{ - uint part_id = m_part_info->get_first_used_partition(); - DBUG_ENTER("ha_innopart::index_end"); - - if (part_id == MY_BIT_NONE) { - /* Never initialized any index. */ - active_index = MAX_KEY; - DBUG_RETURN(0); - } - if (m_ordered) { - destroy_record_priority_queue(); - m_prebuilt->m_no_prefetch = false; - } - m_prebuilt->m_read_virtual_key = false; - - DBUG_RETURN(ha_innobase::index_end()); -} - -/* Partitioning support functions. */ - -/** Setup the ordered record buffer and the priority queue. -@param[in] used_parts Number of used partitions in query. -@return false for success else true. */ -int -ha_innopart::init_record_priority_queue_for_parts( - uint used_parts) -{ - size_t alloc_size; - void* buf; - - DBUG_ENTER("ha_innopart::init_record_priority_queue_for_parts"); - ut_ad(used_parts >= 1); - /* TODO: Don't use this if only one partition is used! */ - //ut_ad(used_parts > 1); - - /* We could reuse current m_prebuilt->pcur/clust_pcur for the first - used partition, but it would complicate and affect performance, - so we trade some extra memory instead. */ - - m_pcur = m_prebuilt->pcur; - m_clust_pcur = m_prebuilt->clust_pcur; - - /* If we searching for secondary key or doing a write/update - we will need two pcur, one for the active (secondary) index and - one for the clustered index. */ - - bool need_clust_index = - m_curr_key_info[1] != NULL - || get_lock_type() != F_RDLCK; - - /* pcur and clust_pcur per partition. - By using zalloc, we do not need to initialize the pcur's! */ - - alloc_size = used_parts * sizeof(btr_pcur_t); - if (need_clust_index) { - alloc_size *= 2; - } - buf = ut_zalloc(alloc_size, mem_key_partitioning); - if (buf == NULL) { - DBUG_RETURN(true); - } - m_pcur_parts = static_cast(buf); - if (need_clust_index) { - m_clust_pcur_parts = &m_pcur_parts[used_parts]; - } - /* mapping from part_id to pcur. */ - alloc_size = m_tot_parts * sizeof(*m_pcur_map); - buf = ut_zalloc(alloc_size, mem_key_partitioning); - if (buf == NULL) { - DBUG_RETURN(true); - } - m_pcur_map = static_cast(buf); - { - uint16_t pcur_count = 0; - for (uint i = m_part_info->get_first_used_partition(); - i < m_tot_parts; - i = m_part_info->get_next_used_partition(i)) { - m_pcur_map[i] = pcur_count++; - } - } - - DBUG_RETURN(false); -} - -/** Destroy the ordered record buffer and the priority queue. */ -inline -void -ha_innopart::destroy_record_priority_queue_for_parts() -{ - DBUG_ENTER("ha_innopart::destroy_record_priority_queue"); - if (m_pcur_parts != NULL) { - uint used_parts; - used_parts = bitmap_bits_set(&m_part_info->read_partitions); - for (uint i = 0; i < used_parts; i++) { - btr_pcur_free(&m_pcur_parts[i]); - if (m_clust_pcur_parts != NULL) { - btr_pcur_free(&m_clust_pcur_parts[i]); - } - } - ut_free(m_pcur_parts); - m_clust_pcur_parts = NULL; - m_pcur_parts = NULL; - /* Reset the original m_prebuilt->pcur. */ - m_prebuilt->pcur = m_pcur; - m_prebuilt->clust_pcur = m_clust_pcur; - } - if (m_pcur_map != NULL) { - ut_free(m_pcur_map); - m_pcur_map = NULL; - } - DBUG_VOID_RETURN; -} - -/** Print error information. -@param[in] error Error code (MySQL). -@param[in] errflag Flags. */ -void -ha_innopart::print_error( - int error, - myf errflag) -{ - DBUG_ENTER("ha_innopart::print_error"); - if (print_partition_error(error, errflag)) { - ha_innobase::print_error(error, errflag); - } - - DBUG_VOID_RETURN; -} - -/** Can error be ignored. -@param[in] error Error code to check. -@return true if ignorable else false. */ -bool -ha_innopart::is_ignorable_error( - int error) -{ - if (ha_innobase::is_ignorable_error(error) - || error == HA_ERR_NO_PARTITION_FOUND - || error == HA_ERR_NOT_IN_LOCK_PARTITIONS) { - - return(true); - } - return(false); -} - -/** Get the index for the current partition -@param[in] keynr MySQL index number. -@return InnoDB index or NULL. */ -inline -dict_index_t* -ha_innopart::innobase_get_index( - uint keynr) -{ - uint part_id = m_last_part; - if (part_id >= m_tot_parts) { - ut_ad(0); - part_id = 0; - } - return(innopart_get_index(part_id, keynr)); -} - -/** Get the index for a handle. -Does not change active index. -@param[in] keynr Use this index; MAX_KEY means always clustered index, -even if it was internally generated by InnoDB. -@param[in] part_id From this partition. -@return NULL or index instance. */ -inline -dict_index_t* -ha_innopart::innopart_get_index( - uint part_id, - uint keynr) -{ - KEY* key = NULL; - dict_index_t* index = NULL; - - DBUG_ENTER("innopart_get_index"); - - if (keynr != MAX_KEY && table->s->keys > 0) { - key = table->key_info + keynr; - - index = m_part_share->get_index(part_id, keynr); - - if (index != NULL) { - ut_a(ut_strcmp(index->name, key->name) == 0); - } else { - /* Can't find index with keynr in the translation - table. Only print message if the index translation - table exists. */ - - ib::warn() << "InnoDB could not find index " - << (key ? key->name : "NULL") - << " key no " << keynr << " for table " - << m_prebuilt->table->name - << " through its index translation table"; - - index = dict_table_get_index_on_name(m_prebuilt->table, - key->name); - } - } else { - /* Get the generated index. */ - ut_ad(keynr == MAX_KEY); - index = dict_table_get_first_index( - m_part_share->get_table_part(part_id)); - } - - if (index == NULL) { - ib::error() << "InnoDB could not find key n:o " - << keynr << " with name " << (key ? key->name : "NULL") - << " from dict cache for table " - << m_prebuilt->table->name << " partition n:o " - << part_id; - } - - DBUG_RETURN(index); -} - -/** Changes the active index of a handle. -@param[in] part_id Use this partition. -@param[in] keynr Use this index; MAX_KEY means always clustered index, -even if it was internally generated by InnoDB. -@return 0 or error number. */ -int -ha_innopart::change_active_index( - uint part_id, - uint keynr) -{ - DBUG_ENTER("ha_innopart::change_active_index"); - - ut_ad(m_user_thd == ha_thd()); - ut_a(m_prebuilt->trx == thd_to_trx(m_user_thd)); - - active_index = keynr; - set_partition(part_id); - - if (UNIV_UNLIKELY(m_prebuilt->index == NULL)) { - ib::warn() << "change_active_index(" << part_id - << "," << keynr << ") failed"; - m_prebuilt->index_usable = FALSE; - DBUG_RETURN(1); - } - - m_prebuilt->index_usable = row_merge_is_index_usable(m_prebuilt->trx, - m_prebuilt->index); - - if (UNIV_UNLIKELY(!m_prebuilt->index_usable)) { - if (dict_index_is_corrupted(m_prebuilt->index)) { - char table_name[MAX_FULL_NAME_LEN + 1]; - - innobase_format_name( - table_name, sizeof table_name, - m_prebuilt->index->table->name.m_name); - - push_warning_printf( - m_user_thd, Sql_condition::SL_WARNING, - HA_ERR_INDEX_CORRUPT, - "InnoDB: Index %s for table %s is" - " marked as corrupted" - " (partition %u)", - m_prebuilt->index->name(), table_name, part_id); - DBUG_RETURN(HA_ERR_INDEX_CORRUPT); - } else { - push_warning_printf( - m_user_thd, Sql_condition::SL_WARNING, - HA_ERR_TABLE_DEF_CHANGED, - "InnoDB: insufficient history for index %u", - keynr); - } - - /* The caller seems to ignore this. Thus, we must check - this again in row_search_for_mysql(). */ - - DBUG_RETURN(HA_ERR_TABLE_DEF_CHANGED); - } - - ut_a(m_prebuilt->search_tuple != NULL); - - /* If too expensive, cache the keynr and only update search_tuple when - keynr changes. Remember that the clustered index is also used for - MAX_KEY. */ - dtuple_set_n_fields(m_prebuilt->search_tuple, - m_prebuilt->index->n_fields); - - dict_index_copy_types(m_prebuilt->search_tuple, m_prebuilt->index, - m_prebuilt->index->n_fields); - - /* MySQL changes the active index for a handle also during some - queries, for example SELECT MAX(a), SUM(a) first retrieves the - MAX() and then calculates the sum. Previously we played safe - and used the flag ROW_MYSQL_WHOLE_ROW below, but that caused - unnecessary copying. Starting from MySQL-4.1 we use a more - efficient flag here. */ - - /* TODO: Is this really needed? - Will it not be built in index_read? */ - - build_template(false); - - DBUG_RETURN(0); -} - -/** Return first record in index from a partition. -@param[in] part Partition to read from. -@param[out] record First record in index in the partition. -@return error number or 0. */ -int -ha_innopart::index_first_in_part( - uint part, - uchar* record) -{ - int error; - DBUG_ENTER("ha_innopart::index_first_in_part"); - - set_partition(part); - error = ha_innobase::index_first(record); - update_partition(part); - - DBUG_RETURN(error); -} - -/** Return next record in index from a partition. -@param[in] part Partition to read from. -@param[out] record Last record in index in the partition. -@return error number or 0. */ -int -ha_innopart::index_next_in_part( - uint part, - uchar* record) -{ - DBUG_ENTER("ha_innopart::index_next_in_part"); - - int error; - - set_partition(part); - error = ha_innobase::index_next(record); - update_partition(part); - - ut_ad(m_ordered_scan_ongoing - || m_ordered_rec_buffer == NULL - || m_prebuilt->used_in_HANDLER - || m_part_spec.start_part >= m_part_spec.end_part); - - DBUG_RETURN(error); -} - -/** Return next same record in index from a partition. -This routine is used to read the next record, but only if the key is -the same as supplied in the call. -@param[in] part Partition to read from. -@param[out] record Last record in index in the partition. -@param[in] key Key to match. -@param[in] length Length of key. -@return error number or 0. */ -int -ha_innopart::index_next_same_in_part( - uint part, - uchar* record, - const uchar* key, - uint length) -{ - int error; - - set_partition(part); - error = ha_innobase::index_next_same(record, key, length); - update_partition(part); - return(error); -} - -/** Return last record in index from a partition. -@param[in] part Partition to read from. -@param[out] record Last record in index in the partition. -@return error number or 0. */ -int -ha_innopart::index_last_in_part( - uint part, - uchar* record) -{ - int error; - - set_partition(part); - error = ha_innobase::index_last(record); - update_partition(part); - return(error); -} - -/** Return previous record in index from a partition. -@param[in] part Partition to read from. -@param[out] record Last record in index in the partition. -@return error number or 0. */ -int -ha_innopart::index_prev_in_part( - uint part, - uchar* record) -{ - int error; - - set_partition(part); - error = ha_innobase::index_prev(record); - update_partition(part); - - ut_ad(m_ordered_scan_ongoing - || m_ordered_rec_buffer == NULL - || m_prebuilt->used_in_HANDLER - || m_part_spec.start_part >= m_part_spec.end_part); - - return(error); -} - -/** Start index scan and return first record from a partition. -This routine starts an index scan using a start key. The calling -function will check the end key on its own. -@param[in] part Partition to read from. -@param[out] record First matching record in index in the partition. -@param[in] key Key to match. -@param[in] keypart_map Which part of the key to use. -@param[in] find_flag Key condition/direction to use. -@return error number or 0. */ -int -ha_innopart::index_read_map_in_part( - uint part, - uchar* record, - const uchar* key, - key_part_map keypart_map, - enum ha_rkey_function find_flag) -{ - int error; - - set_partition(part); - error = ha_innobase::index_read_map( - record, - key, - keypart_map, - find_flag); - update_partition(part); - return(error); -} - -/** Start index scan and return first record from a partition. -This routine starts an index scan using a start key. The calling -function will check the end key on its own. -@param[in] part Partition to read from. -@param[out] record First matching record in index in the partition. -@param[in] index Index to read from. -@param[in] key Key to match. -@param[in] keypart_map Which part of the key to use. -@param[in] find_flag Key condition/direction to use. -@return error number or 0. */ -int -ha_innopart::index_read_idx_map_in_part( - uint part, - uchar* record, - uint index, - const uchar* key, - key_part_map keypart_map, - enum ha_rkey_function find_flag) -{ - int error; - - set_partition(part); - error = ha_innobase::index_read_idx_map( - record, - index, - key, - keypart_map, - find_flag); - update_partition(part); - return(error); -} - -/** Return last matching record in index from a partition. -@param[in] part Partition to read from. -@param[out] record Last matching record in index in the partition. -@param[in] key Key to match. -@param[in] keypart_map Which part of the key to use. -@return error number or 0. */ -int -ha_innopart::index_read_last_map_in_part( - uint part, - uchar* record, - const uchar* key, - key_part_map keypart_map) -{ - int error; - set_partition(part); - error = ha_innobase::index_read_last_map(record, key, keypart_map); - update_partition(part); - return(error); -} - -/** Start index scan and return first record from a partition. -This routine starts an index scan using a start and end key. -@param[in] part Partition to read from. -@param[in,out] record First matching record in index in the partition, -if NULL use table->record[0] as return buffer. -@param[in] start_key Start key to match. -@param[in] end_key End key to match. -@param[in] eq_range Is equal range, start_key == end_key. -@param[in] sorted Return rows in sorted order. -@return error number or 0. */ -int -ha_innopart::read_range_first_in_part( - uint part, - uchar* record, - const key_range* start_key, - const key_range* end_key, - bool eq_range, - bool sorted) -{ - int error; - uchar* read_record = record; - set_partition(part); - if (read_record == NULL) { - read_record = table->record[0]; - } - if (m_start_key.key != NULL) { - error = ha_innobase::index_read( - read_record, - m_start_key.key, - m_start_key.length, - m_start_key.flag); - } else { - error = ha_innobase::index_first(read_record); - } - if (error == HA_ERR_KEY_NOT_FOUND) { - error = HA_ERR_END_OF_FILE; - } else if (error == 0 && !in_range_check_pushed_down) { - /* compare_key uses table->record[0], so we - need to copy the data if not already there. */ - - if (record != NULL) { - copy_cached_row(table->record[0], read_record); - } - if (compare_key(end_range) > 0) { - /* must use ha_innobase:: due to set/update_partition - could overwrite states if ha_innopart::unlock_row() - was used. */ - ha_innobase::unlock_row(); - error = HA_ERR_END_OF_FILE; - } - } - update_partition(part); - return(error); -} - -/** Return next record in index range scan from a partition. -@param[in] part Partition to read from. -@param[in,out] record First matching record in index in the partition, -if NULL use table->record[0] as return buffer. -@return error number or 0. */ -int -ha_innopart::read_range_next_in_part( - uint part, - uchar* record) -{ - int error; - uchar* read_record = record; - - set_partition(part); - if (read_record == NULL) { - read_record = table->record[0]; - } - - /* TODO: Implement ha_innobase::read_range*? - So it will return HA_ERR_END_OF_FILE or - HA_ERR_KEY_NOT_FOUND when passing end_range. */ - - error = ha_innobase::index_next(read_record); - if (error == 0 && !in_range_check_pushed_down) { - /* compare_key uses table->record[0], so we - need to copy the data if not already there. */ - - if (record != NULL) { - copy_cached_row(table->record[0], read_record); - } - if (compare_key(end_range) > 0) { - /* must use ha_innobase:: due to set/update_partition - could overwrite states if ha_innopart::unlock_row() - was used. */ - ha_innobase::unlock_row(); - error = HA_ERR_END_OF_FILE; - } - } - update_partition(part); - - return(error); -} - -/** Initialize a table scan in a specific partition. -@param[in] part_id Partition to initialize. -@param[in] scan True if table/index scan false otherwise (for rnd_pos) -@return 0 or error number. */ -int -ha_innopart::rnd_init_in_part( - uint part_id, - bool scan) -{ - int err; - - if (m_prebuilt->clust_index_was_generated) { - err = change_active_index(part_id, MAX_KEY); - } else { - err = change_active_index(part_id, m_primary_key); - } - - m_start_of_scan = 1; - - /* Don't use semi-consistent read in random row reads (by position). - This means we must disable semi_consistent_read if scan is false. */ - - if (!scan) { - try_semi_consistent_read(false); - } - - return(err); -} - -/** Ends a table scan. -@param[in] part_id Partition to end table scan in. -@param[in] scan True for scan else random access. -@return 0 or error number. */ -int -ha_innopart::rnd_end_in_part( - uint part_id, - bool scan) -{ - return(index_end()); -} - -/** Read next row in partition. -Reads the next row in a table scan (also used to read the FIRST row -in a table scan). -@param[in] part_id Partition to end table scan in. -@param[out] buf Returns the row in this buffer, in MySQL format. -@return 0, HA_ERR_END_OF_FILE or error number. */ -int -ha_innopart::rnd_next_in_part( - uint part_id, - uchar* buf) -{ - int error; - - DBUG_ENTER("ha_innopart::rnd_next_in_part"); - - set_partition(part_id); - if (m_start_of_scan) { - error = ha_innobase::index_first(buf); - - if (error == HA_ERR_KEY_NOT_FOUND) { - error = HA_ERR_END_OF_FILE; - } - m_start_of_scan = 0; - } else { - ha_statistic_increment(&SSV::ha_read_rnd_next_count); - error = ha_innobase::general_fetch(buf, ROW_SEL_NEXT, 0); - } - - update_partition(part_id); - DBUG_RETURN(error); -} - -/** Get a row from a position. -Fetches a row from the table based on a row reference. -@param[out] buf Returns the row in this buffer, in MySQL format. -@param[in] pos Position, given as primary key value or DB_ROW_ID -(if no primary key) of the row in MySQL format. The length of data in pos has -to be ref_length. -@return 0, HA_ERR_KEY_NOT_FOUND or error code. */ -int -ha_innopart::rnd_pos( - uchar* buf, - uchar* pos) -{ - int error; - uint part_id; - DBUG_ENTER("ha_innopart::rnd_pos"); - ut_ad(PARTITION_BYTES_IN_POS == 2); - DBUG_DUMP("pos", pos, ref_length); - - ha_statistic_increment(&SSV::ha_read_rnd_count); - - ut_a(m_prebuilt->trx == thd_to_trx(ha_thd())); - - /* Restore used partition. */ - part_id = uint2korr(pos); - - set_partition(part_id); - - /* Note that we assume the length of the row reference is fixed - for the table, and it is == ref_length. */ - - error = ha_innobase::index_read(buf, pos + PARTITION_BYTES_IN_POS, - ref_length - PARTITION_BYTES_IN_POS, - HA_READ_KEY_EXACT); - DBUG_PRINT("info", ("part %u index_read returned %d", part_id, error)); - DBUG_DUMP("buf", buf, table_share->reclength); - - update_partition(part_id); - - DBUG_RETURN(error); -} - -/** Return position for cursor in last used partition. -Stores a reference to the current row to 'ref' field of the handle. Note -that in the case where we have generated the clustered index for the -table, the function parameter is illogical: we MUST ASSUME that 'record' -is the current 'position' of the handle, because if row ref is actually -the row id internally generated in InnoDB, then 'record' does not contain -it. We just guess that the row id must be for the record where the handle -was positioned the last time. -@param[out] ref_arg Pointer to buffer where to write the position. -@param[in] record Record to position for. */ -void -ha_innopart::position_in_last_part( - uchar* ref_arg, - const uchar* record) -{ - if (m_prebuilt->clust_index_was_generated) { - /* No primary key was defined for the table and we - generated the clustered index from row id: the - row reference will be the row id, not any key value - that MySQL knows of. */ - - memcpy(ref_arg, m_prebuilt->row_id, DATA_ROW_ID_LEN); - } else { - - /* Copy primary key as the row reference */ - KEY* key_info = table->key_info + m_primary_key; - key_copy(ref_arg, (uchar*)record, key_info, - key_info->key_length); - } -} - -/** Fill in data_dir_path and tablespace name from internal data -dictionary. -@param part_elem Partition element to fill. -@param ib_table InnoDB table to copy from. */ -void -ha_innopart::update_part_elem( - partition_element* part_elem, - dict_table_t* ib_table) -{ - dict_get_and_save_data_dir_path(ib_table, false); - if (ib_table->data_dir_path != NULL) { - if (part_elem->data_file_name == NULL - || strcmp(ib_table->data_dir_path, - part_elem->data_file_name) != 0) { - - /* Play safe and allocate memory from TABLE and copy - instead of expose the internal data dictionary. */ - part_elem->data_file_name = - strdup_root(&table->mem_root, - ib_table->data_dir_path); - } - } else { - part_elem->data_file_name = NULL; - } - - part_elem->index_file_name = NULL; -} - -/** Update create_info. -Used in SHOW CREATE TABLE et al. -@param[in,out] create_info Create info to update. */ -void -ha_innopart::update_create_info( - HA_CREATE_INFO* create_info) -{ - uint num_subparts = m_part_info->num_subparts; - uint num_parts; - uint part; - dict_table_t* table; - List_iterator - part_it(m_part_info->partitions); - partition_element* part_elem; - partition_element* sub_elem; - DBUG_ENTER("ha_innopart::update_create_info"); - if ((create_info->used_fields & HA_CREATE_USED_AUTO) == 0) { - info(HA_STATUS_AUTO); - create_info->auto_increment_value = stats.auto_increment_value; - } - - num_parts = (num_subparts != 0) ? m_tot_parts / num_subparts : m_tot_parts; - - /* DATA/INDEX DIRECTORY are never applied to the whole partitioned - table, only to its parts. */ - - create_info->data_file_name = NULL; - create_info->index_file_name = NULL; - - /* Since update_create_info() can be called from - mysql_prepare_alter_table() when not all partitions are set up, - we look for that condition first. - If all partitions are not available then simply return, - since it does not need any updated partitioning info. */ - - if (!m_part_info->temp_partitions.is_empty()) { - DBUG_VOID_RETURN; - } - part = 0; - while ((part_elem = part_it++)) { - if (part >= num_parts) { - DBUG_VOID_RETURN; - } - if (m_part_info->is_sub_partitioned()) { - List_iterator - subpart_it(part_elem->subpartitions); - uint subpart = 0; - while ((sub_elem = subpart_it++)) { - if (subpart >= num_subparts) { - DBUG_VOID_RETURN; - } - subpart++; - } - if (subpart != num_subparts) { - DBUG_VOID_RETURN; - } - } - part++; - } - if (part != num_parts) { - DBUG_VOID_RETURN; - } - - /* part_elem->data_file_name should be correct from - the .frm, but may have been changed, so update from SYS_DATAFILES. - index_file_name is ignored, so remove it. */ - - part = 0; - part_it.rewind(); - while ((part_elem = part_it++)) { - if (m_part_info->is_sub_partitioned()) { - List_iterator - subpart_it(part_elem->subpartitions); - while ((sub_elem = subpart_it++)) { - table = m_part_share->get_table_part(part++); - update_part_elem(sub_elem, table); - } - } else { - table = m_part_share->get_table_part(part++); - update_part_elem(part_elem, table); - } - } - DBUG_VOID_RETURN; -} - -/** Set create_info->data_file_name. -@param[in] part_elem Partition to copy from. -@param[in,out] info Create info to set. */ -static -void -set_create_info_dir( - partition_element* part_elem, - HA_CREATE_INFO* info) -{ - if (part_elem->data_file_name != NULL - && part_elem->data_file_name[0] != '\0') { - info->data_file_name = part_elem->data_file_name; - } - if (part_elem->index_file_name != NULL - && part_elem->index_file_name[0] != '\0') { - info->index_file_name = part_elem->index_file_name; - } -} - -/** Set flags and append '/' to remote path if necessary. */ -void -create_table_info_t::set_remote_path_flags() -{ - if (m_remote_path[0] != '\0') { - ut_ad(DICT_TF_HAS_DATA_DIR(m_flags) != 0); - - /* os_file_make_remote_pathname will truncate - everything after the last '/', so append '/' - if it is not the last character. */ - - size_t len = strlen(m_remote_path); - if (m_remote_path[len - 1] != OS_PATH_SEPARATOR) { - m_remote_path[len] = OS_PATH_SEPARATOR; - m_remote_path[len + 1] = '\0'; - } - } else { - ut_ad(DICT_TF_HAS_DATA_DIR(m_flags) == 0); - } -} - -/** Creates a new table to an InnoDB database. -@param[in] name Table name (in filesystem charset). -@param[in] form MySQL Table containing information of -partitions, columns and indexes etc. -@param[in] create_info Additional create information, like -create statement string. -@return 0 or error number. */ -int -ha_innopart::create( - const char* name, - TABLE* form, - HA_CREATE_INFO* create_info) -{ - int error; - /** {database}/{tablename} */ - char table_name[FN_REFLEN]; - /** absolute path of table */ - char remote_path[FN_REFLEN]; - char partition_name[FN_REFLEN]; - char* table_name_end; - size_t table_name_len; - char* partition_name_start; - char table_data_file_name[FN_REFLEN]; - const char* index_file_name; - size_t len; - - create_table_info_t info(ha_thd(), - form, - create_info, - table_name, - remote_path); - - DBUG_ENTER("ha_innopart::create"); - ut_ad(create_info != NULL); - ut_ad(m_part_info == form->part_info); - ut_ad(table_share != NULL); - - /* Not allowed to create temporary partitioned tables. */ - if (create_info != NULL - && (create_info->options & HA_LEX_CREATE_TMP_TABLE) != 0) { - my_error(ER_PARTITION_NO_TEMPORARY, MYF(0)); - ut_ad(0); // Can we support partitioned temporary tables? - DBUG_RETURN(HA_ERR_INTERNAL_ERROR); - } - - error = info.initialize(); - if (error != 0) { - DBUG_RETURN(error); - } - - /* Setup and check table level options. */ - error = info.prepare_create_table(name); - if (error != 0) { - DBUG_RETURN(error); - } - strcpy(partition_name, table_name); - partition_name_start = partition_name + strlen(partition_name); - table_name_len = strlen(table_name); - table_name_end = table_name + table_name_len; - if (create_info->data_file_name != NULL) { - /* Strip the tablename from the path. */ - strncpy(table_data_file_name, create_info->data_file_name, - FN_REFLEN-1); - table_data_file_name[FN_REFLEN - 1] = '\0'; - char* ptr = strrchr(table_data_file_name, OS_PATH_SEPARATOR); - ut_ad(ptr != NULL); - if (ptr != NULL) { - ptr++; - *ptr = '\0'; - create_info->data_file_name = table_data_file_name; - } - } else { - table_data_file_name[0] = '\0'; - } - index_file_name = create_info->index_file_name; - - info.allocate_trx(); - - /* Latch the InnoDB data dictionary exclusively so that no deadlocks - or lock waits can happen in it during a table create operation. - Drop table etc. do this latching in row0mysql.cc. */ - - row_mysql_lock_data_dictionary(info.trx()); - - /* TODO: use the new DD tables instead to decrease duplicate info. */ - List_iterator_fast - part_it(form->part_info->partitions); - partition_element* part_elem; - while ((part_elem = part_it++)) { - /* Append the partition name to the table name. */ - len = Ha_innopart_share::append_sep_and_name( - partition_name_start, - part_elem->partition_name, - part_sep, - FN_REFLEN - table_name_len); - if ((table_name_len + len) >= FN_REFLEN) { - ut_ad(0); - goto cleanup; - } - - /* Override table level DATA/INDEX DIRECTORY. */ - set_create_info_dir(part_elem, create_info); - - if (!form->part_info->is_sub_partitioned()) { - error = info.prepare_create_table(partition_name); - if (error != 0) { - goto cleanup; - } - info.set_remote_path_flags(); - error = info.create_table(); - if (error != 0) { - goto cleanup; - } - } else { - size_t part_name_len = strlen(partition_name_start) - + table_name_len; - char* part_name_end = partition_name + part_name_len; - List_iterator_fast - sub_it(part_elem->subpartitions); - partition_element* sub_elem; - - while ((sub_elem = sub_it++)) { - ut_ad(sub_elem->partition_name != NULL); - - /* 'table' will be - #P##SP#. - Append the sub-partition name to - the partition name. */ - - len = Ha_innopart_share::append_sep_and_name( - part_name_end, - sub_elem->partition_name, - sub_sep, - FN_REFLEN - part_name_len); - if ((len + part_name_len) >= FN_REFLEN) { - ut_ad(0); - goto cleanup; - } - /* Override part level DATA/INDEX DIRECTORY. */ - set_create_info_dir(sub_elem, create_info); - - Ha_innopart_share::partition_name_casedn_str( - part_name_end + 4); - error = info.prepare_create_table(partition_name); - if (error != 0) { - goto cleanup; - } - info.set_remote_path_flags(); - error = info.create_table(); - if (error != 0) { - goto cleanup; - } - - /* Reset partition level - DATA/INDEX DIRECTORY. */ - - create_info->data_file_name = - table_data_file_name; - create_info->index_file_name = - index_file_name; - set_create_info_dir(part_elem, create_info); - } - } - /* Reset table level DATA/INDEX DIRECTORY. */ - create_info->data_file_name = table_data_file_name; - create_info->index_file_name = index_file_name; - } - - innobase_commit_low(info.trx()); - - row_mysql_unlock_data_dictionary(info.trx()); - - /* Flush the log to reduce probability that the .frm files and - the InnoDB data dictionary get out-of-sync if the user runs - with innodb_flush_log_at_trx_commit = 0. */ - - log_buffer_flush_to_disk(); - - part_it.rewind(); - /* No need to use these now, only table_name will be used. */ - create_info->data_file_name = NULL; - create_info->index_file_name = NULL; - while ((part_elem = part_it++)) { - Ha_innopart_share::append_sep_and_name( - table_name_end, - part_elem->partition_name, - part_sep, - FN_REFLEN - table_name_len); - if (!form->part_info->is_sub_partitioned()) { - error = info.create_table_update_dict(); - if (error != 0) { - ut_ad(0); - goto end; - } - } else { - size_t part_name_len = strlen(table_name_end); - char* part_name_end = table_name_end + part_name_len; - List_iterator_fast - sub_it(part_elem->subpartitions); - partition_element* sub_elem; - while ((sub_elem = sub_it++)) { - Ha_innopart_share::append_sep_and_name( - part_name_end, - sub_elem->partition_name, - sub_sep, - FN_REFLEN - table_name_len - - part_name_len); - error = info.create_table_update_dict(); - if (error != 0) { - ut_ad(0); - goto end; - } - } - } - } - -end: - /* Tell the InnoDB server that there might be work for - utility threads: */ - - srv_active_wake_master_thread(); - - trx_free_for_mysql(info.trx()); - - DBUG_RETURN(error); - -cleanup: - trx_rollback_for_mysql(info.trx()); - - row_mysql_unlock_data_dictionary(info.trx()); - - trx_free_for_mysql(info.trx()); - - DBUG_RETURN(error); -} - -/** Discards or imports an InnoDB tablespace. -@param[in] discard True if discard, else import. -@return 0 or error number. */ -int -ha_innopart::discard_or_import_tablespace( - my_bool discard) -{ - int error = 0; - uint i; - DBUG_ENTER("ha_innopart::discard_or_import_tablespace"); - - for (i= m_part_info->get_first_used_partition(); - i < m_tot_parts; - i= m_part_info->get_next_used_partition(i)) { - - m_prebuilt->table = m_part_share->get_table_part(i); - error= ha_innobase::discard_or_import_tablespace(discard); - if (error != 0) { - break; - } - } - m_prebuilt->table = m_part_share->get_table_part(0); - - /* IMPORT/DISCARD also means resetting auto_increment. Make sure - that auto_increment initialization is done after all partitions - are imported. */ - if (table->found_next_number_field != NULL) { - lock_auto_increment(); - m_part_share->next_auto_inc_val = 0; - m_part_share->auto_inc_initialized = false; - unlock_auto_increment(); - } - - DBUG_RETURN(error); -} - -/** Compare key and rowid. -Helper function for sorting records in the priority queue. -a/b points to table->record[0] rows which must have the -key fields set. The bytes before a and b store the rowid. -This is used for comparing/sorting rows first according to -KEY and if same KEY, by rowid (ref). -@param[in] key_info Null terminated array of index information. -@param[in] a Pointer to record+ref in first record. -@param[in] b Pointer to record+ref in second record. -@return Return value is SIGN(first_rec - second_rec) -@retval 0 Keys are equal. -@retval -1 second_rec is greater than first_rec. -@retval +1 first_rec is greater than second_rec. */ -int -ha_innopart::key_and_rowid_cmp( - KEY** key_info, - uchar *a, - uchar *b) -{ - int cmp = key_rec_cmp(key_info, a, b); - if (cmp != 0) { - return(cmp); - } - - /* We must compare by rowid, which is added before the record, - in the priority queue. */ - - return(memcmp(a - DATA_ROW_ID_LEN, b - DATA_ROW_ID_LEN, - DATA_ROW_ID_LEN)); -} - -/** Extra hints from MySQL. -@param[in] operation Operation hint. -@return 0 or error number. */ -int -ha_innopart::extra( - enum ha_extra_function operation) -{ - if (operation == HA_EXTRA_SECONDARY_SORT_ROWID) { - /* index_init(sorted=true) must have been called! */ - ut_ad(m_ordered); - ut_ad(m_ordered_rec_buffer != NULL); - /* No index_read call must have been done! */ - ut_ad(m_queue->empty()); - - /* If not PK is set as secondary sort, do secondary sort by - rowid/ref. */ - - ut_ad(m_curr_key_info[1] != NULL - || m_prebuilt->clust_index_was_generated != 0 - || m_curr_key_info[0] - == table->key_info + table->s->primary_key); - - if (m_curr_key_info[1] == NULL - && m_prebuilt->clust_index_was_generated) { - m_ref_usage = Partition_helper::REF_USED_FOR_SORT; - m_queue->m_fun = key_and_rowid_cmp; - } - return(0); - } - return(ha_innobase::extra(operation)); -} - -/** Delete all rows in a partition. -@return 0 or error number. */ -int -ha_innopart::truncate_partition_low() -{ - return(truncate()); -} - -/** Deletes all rows of a partitioned InnoDB table. -@return 0 or error number. */ -int -ha_innopart::truncate() -{ - dberr_t err = DB_SUCCESS; - int error; - - DBUG_ENTER("ha_innopart::truncate"); - - if (high_level_read_only) { - DBUG_RETURN(HA_ERR_TABLE_READONLY); - } - - /* TRUNCATE also means resetting auto_increment. Hence, reset - it so that it will be initialized again at the next use. */ - - if (table->found_next_number_field != NULL) { - lock_auto_increment(); - m_part_share->next_auto_inc_val= 0; - m_part_share->auto_inc_initialized= false; - unlock_auto_increment(); - } - - /* Get the transaction associated with the current thd, or create one - if not yet created, and update m_prebuilt->trx. */ - - update_thd(ha_thd()); - - if (!trx_is_started(m_prebuilt->trx)) { - ++m_prebuilt->trx->will_lock; - } - /* Truncate the table in InnoDB. */ - - for (uint i = m_part_info->get_first_used_partition(); - i < m_tot_parts; - i = m_part_info->get_next_used_partition(i)) { - - set_partition(i); - err = row_truncate_table_for_mysql(m_prebuilt->table, - m_prebuilt->trx); - update_partition(i); - if (err != DB_SUCCESS) { - break; - } - } - - switch (err) { - - case DB_TABLESPACE_DELETED: - case DB_TABLESPACE_NOT_FOUND: - ib_senderrf( - m_prebuilt->trx->mysql_thd, IB_LOG_LEVEL_ERROR, - (err == DB_TABLESPACE_DELETED ? - ER_TABLESPACE_DISCARDED : ER_TABLESPACE_MISSING), - table->s->table_name.str); - table->status = STATUS_NOT_FOUND; - error = HA_ERR_NO_SUCH_TABLE; - break; - - default: - error = convert_error_code_to_mysql( - err, m_prebuilt->table->flags, - m_prebuilt->trx->mysql_thd); - table->status = STATUS_NOT_FOUND; - break; - } - DBUG_RETURN(error); -} - -/** Estimates the number of index records in a range. -@param[in] keynr Index number. -@param[in] min_key Start key value (or NULL). -@param[in] max_key End key value (or NULL). -@return estimated number of rows. */ -ha_rows -ha_innopart::records_in_range( - uint keynr, - key_range* min_key, - key_range* max_key) -{ - KEY* key; - dict_index_t* index; - dtuple_t* range_start; - dtuple_t* range_end; - int64_t n_rows = 0; - page_cur_mode_t mode1; - page_cur_mode_t mode2; - mem_heap_t* heap; - uint part_id; - - DBUG_ENTER("ha_innopart::records_in_range"); - DBUG_PRINT("info", ("keynr %u min %p max %p", keynr, min_key, max_key)); - - ut_a(m_prebuilt->trx == thd_to_trx(ha_thd())); - - m_prebuilt->trx->op_info = (char*)"estimating records in index range"; - - /* In case MySQL calls this in the middle of a SELECT query, release - possible adaptive hash latch to avoid deadlocks of threads. */ - - trx_assert_no_search_latch(m_prebuilt->trx); - - active_index = keynr; - - key = table->key_info + active_index; - - part_id = m_part_info->get_first_used_partition(); - if (part_id == MY_BIT_NONE) { - DBUG_RETURN(0); - } - /* This also sets m_prebuilt->index! */ - set_partition(part_id); - index = m_prebuilt->index; - - /* Only validate the first partition, to avoid too much overhead. */ - - /* There exists possibility of not being able to find requested - index due to inconsistency between MySQL and InoDB dictionary info. - Necessary message should have been printed in innopart_get_index(). */ - if (index == NULL - || dict_table_is_discarded(m_prebuilt->table) - || dict_index_is_corrupted(index) - || !row_merge_is_index_usable(m_prebuilt->trx, index)) { - - n_rows = HA_POS_ERROR; - goto func_exit; - } - - heap = mem_heap_create(2 * (key->actual_key_parts * sizeof(dfield_t) - + sizeof(dtuple_t))); - - range_start = dtuple_create(heap, key->actual_key_parts); - dict_index_copy_types(range_start, index, key->actual_key_parts); - - range_end = dtuple_create(heap, key->actual_key_parts); - dict_index_copy_types(range_end, index, key->actual_key_parts); - - row_sel_convert_mysql_key_to_innobase( - range_start, - m_prebuilt->srch_key_val1, - m_prebuilt->srch_key_val_len, - index, - (byte*) (min_key ? min_key->key : (const uchar*) 0), - (ulint) (min_key ? min_key->length : 0), - m_prebuilt->trx); - - ut_ad(min_key != NULL - ? range_start->n_fields > 0 - : range_start->n_fields == 0); - - row_sel_convert_mysql_key_to_innobase( - range_end, - m_prebuilt->srch_key_val2, - m_prebuilt->srch_key_val_len, - index, - (byte*) (max_key != NULL ? max_key->key : (const uchar*) 0), - (ulint) (max_key != NULL ? max_key->length : 0), - m_prebuilt->trx); - - ut_ad(max_key != NULL - ? range_end->n_fields > 0 - : range_end->n_fields == 0); - - mode1 = convert_search_mode_to_innobase(min_key ? min_key->flag : - HA_READ_KEY_EXACT); - mode2 = convert_search_mode_to_innobase(max_key ? max_key->flag : - HA_READ_KEY_EXACT); - - if (mode1 != PAGE_CUR_UNSUPP && mode2 != PAGE_CUR_UNSUPP) { - - n_rows = btr_estimate_n_rows_in_range(index, range_start, - mode1, range_end, - mode2); - DBUG_PRINT("info", ("part_id %u rows %ld", part_id, - (long int) n_rows)); - for (part_id = m_part_info->get_next_used_partition(part_id); - part_id < m_tot_parts; - part_id = m_part_info->get_next_used_partition(part_id)) { - - index = m_part_share->get_index(part_id, keynr); - int64_t n = btr_estimate_n_rows_in_range(index, - range_start, - mode1, - range_end, - mode2); - n_rows += n; - DBUG_PRINT("info", ("part_id %u rows %ld (%ld)", - part_id, - (long int) n, - (long int) n_rows)); - } - } else { - - n_rows = HA_POS_ERROR; - } - - mem_heap_free(heap); - -func_exit: - - m_prebuilt->trx->op_info = (char*)""; - - /* The MySQL optimizer seems to believe an estimate of 0 rows is - always accurate and may return the result 'Empty set' based on that. - The accuracy is not guaranteed, and even if it were, for a locking - read we should anyway perform the search to set the next-key lock. - Add 1 to the value to make sure MySQL does not make the assumption! */ - - if (n_rows == 0) { - n_rows = 1; - } - - DBUG_RETURN((ha_rows) n_rows); -} - -/** Gives an UPPER BOUND to the number of rows in a table. -This is used in filesort.cc. -@return upper bound of rows. */ -ha_rows -ha_innopart::estimate_rows_upper_bound() -{ - const dict_index_t* index; - ulonglong estimate = 0; - ulonglong local_data_file_length; - ulint stat_n_leaf_pages; - - DBUG_ENTER("ha_innopart::estimate_rows_upper_bound"); - - /* We do not know if MySQL can call this function before calling - external_lock(). To be safe, update the thd of the current table - handle. */ - - update_thd(ha_thd()); - - m_prebuilt->trx->op_info = "calculating upper bound for table rows"; - - /* In case MySQL calls this in the middle of a SELECT query, release - possible adaptive hash latch to avoid deadlocks of threads. */ - - trx_assert_no_search_latch(m_prebuilt->trx); - - for (uint i = m_part_info->get_first_used_partition(); - i < m_tot_parts; - i = m_part_info->get_next_used_partition(i)) { - - m_prebuilt->table = m_part_share->get_table_part(i); - index = dict_table_get_first_index(m_prebuilt->table); - - stat_n_leaf_pages = index->stat_n_leaf_pages; - - ut_a(stat_n_leaf_pages > 0); - - local_data_file_length = - ((ulonglong) stat_n_leaf_pages) * UNIV_PAGE_SIZE; - - /* Calculate a minimum length for a clustered index record - and from that an upper bound for the number of rows. - Since we only calculate new statistics in row0mysql.cc when a - table has grown by a threshold factor, - we must add a safety factor 2 in front of the formula below. */ - - estimate += 2 * local_data_file_length - / dict_index_calc_min_rec_len(index); - } - - m_prebuilt->trx->op_info = ""; - - DBUG_RETURN((ha_rows) estimate); -} - -/** Time estimate for full table scan. -How many seeks it will take to read through the table. This is to be -comparable to the number returned by records_in_range so that we can -decide if we should scan the table or use keys. -@return estimated time measured in disk seeks. */ -double -ha_innopart::scan_time() -{ - double scan_time = 0.0; - DBUG_ENTER("ha_innopart::scan_time"); - - for (uint i = m_part_info->get_first_used_partition(); - i < m_tot_parts; - i = m_part_info->get_next_used_partition(i)) { - m_prebuilt->table = m_part_share->get_table_part(i); - scan_time += ha_innobase::scan_time(); - } - DBUG_RETURN(scan_time); -} - -/** Updates the statistics for one partition (table). -@param[in] table Table to update the statistics for. -@param[in] is_analyze True if called from ::analyze(). -@return error code. */ -static -int -update_table_stats( - dict_table_t* table, - bool is_analyze) -{ - dict_stats_upd_option_t opt; - dberr_t ret; - - if (dict_stats_is_persistent_enabled(table)) { - if (is_analyze) { - opt = DICT_STATS_RECALC_PERSISTENT; - } else { - /* This is e.g. 'SHOW INDEXES', - fetch the persistent stats from disk. */ - opt = DICT_STATS_FETCH_ONLY_IF_NOT_IN_MEMORY; - } - } else { - opt = DICT_STATS_RECALC_TRANSIENT; - } - - ut_ad(!mutex_own(&dict_sys->mutex)); - ret = dict_stats_update(table, opt); - - if (ret != DB_SUCCESS) { - return(HA_ERR_GENERIC); - } - return(0); -} - -/** Updates and return statistics. -Returns statistics information of the table to the MySQL interpreter, -in various fields of the handle object. -@param[in] flag Flags for what to update and return. -@param[in] is_analyze True if called from ::analyze(). -@return HA_ERR_* error code or 0. */ -int -ha_innopart::info_low( - uint flag, - bool is_analyze) -{ - dict_table_t* ib_table; - ib_uint64_t max_rows = 0; - uint biggest_partition = 0; - int error = 0; - - DBUG_ENTER("ha_innopart::info_low"); - - /* If we are forcing recovery at a high level, we will suppress - statistics calculation on tables, because that may crash the - server if an index is badly corrupted. */ - - /* We do not know if MySQL can call this function before calling - external_lock(). To be safe, update the thd of the current table - handle. */ - - update_thd(ha_thd()); - - /* In case MySQL calls this in the middle of a SELECT query, release - possible adaptive hash latch to avoid deadlocks of threads. */ - - m_prebuilt->trx->op_info = (char*)"returning various info to MySQL"; - - trx_assert_no_search_latch(m_prebuilt->trx); - - ut_ad(m_part_share->get_table_part(0)->n_ref_count > 0); - - if ((flag & HA_STATUS_TIME) != 0) { - stats.update_time = 0; - - if (is_analyze) { - /* Only analyze the given partitions. */ - int error = set_altered_partitions(); - if (error != 0) { - /* Already checked in mysql_admin_table! */ - ut_ad(0); - DBUG_RETURN(error); - } - } - if (is_analyze || innobase_stats_on_metadata) { - m_prebuilt->trx->op_info = "updating table statistics"; - } - - /* TODO: Only analyze the PK for all partitions, - then the secondary indexes only for the largest partition! */ - for (uint i = m_part_info->get_first_used_partition(); - i < m_tot_parts; - i = m_part_info->get_next_used_partition(i)) { - - ib_table = m_part_share->get_table_part(i); - if (is_analyze || innobase_stats_on_metadata) { - error = update_table_stats(ib_table, is_analyze); - if (error != 0) { - m_prebuilt->trx->op_info = ""; - DBUG_RETURN(error); - } - } - set_if_bigger(stats.update_time, - (ulong) ib_table->update_time); - } - - if (is_analyze || innobase_stats_on_metadata) { - m_prebuilt->trx->op_info = - "returning various info to MySQL"; - } - } - - if ((flag & HA_STATUS_VARIABLE) != 0) { - - /* TODO: If this is called after pruning, then we could - also update the statistics according to the non-pruned - partitions, by allocating new rec_per_key on the TABLE, - instead of using the info from the TABLE_SHARE. */ - ulint stat_clustered_index_size = 0; - ulint stat_sum_of_other_index_sizes = 0; - ib_uint64_t n_rows = 0; - ulint avail_space = 0; - bool checked_sys_tablespace = false; - - if ((flag & HA_STATUS_VARIABLE_EXTRA) != 0) { - stats.delete_length = 0; - } - - for (uint i = m_part_info->get_first_used_partition(); - i < m_tot_parts; - i = m_part_info->get_next_used_partition(i)) { - - ib_table = m_part_share->get_table_part(i); - if ((flag & HA_STATUS_NO_LOCK) == 0) { - dict_table_stats_lock(ib_table, RW_S_LATCH); - } - - ut_a(ib_table->stat_initialized); - - n_rows += ib_table->stat_n_rows; - if (ib_table->stat_n_rows > max_rows) { - max_rows = ib_table->stat_n_rows; - biggest_partition = i; - } - - stat_clustered_index_size += - ib_table->stat_clustered_index_size; - - stat_sum_of_other_index_sizes += - ib_table->stat_sum_of_other_index_sizes; - - if ((flag & HA_STATUS_NO_LOCK) == 0) { - dict_table_stats_unlock(ib_table, RW_S_LATCH); - } - - if ((flag & HA_STATUS_VARIABLE_EXTRA) != 0 - && (flag & HA_STATUS_NO_LOCK) == 0 - && srv_force_recovery < SRV_FORCE_NO_IBUF_MERGE - && avail_space != ULINT_UNDEFINED) { - - /* Only count system tablespace once! */ - if (is_system_tablespace(ib_table->space)) { - if (checked_sys_tablespace) { - continue; - } - checked_sys_tablespace = true; - } - - uintmax_t space = - fsp_get_available_space_in_free_extents( - ib_table->space); - if (space == UINTMAX_MAX) { - THD* thd = ha_thd(); - const char* table_name - = ib_table->name.m_name; - - push_warning_printf( - thd, - Sql_condition::SL_WARNING, - ER_CANT_GET_STAT, - "InnoDB: Trying to get the" - " free space for partition %s" - " but its tablespace has been" - " discarded or the .ibd file" - " is missing. Setting the free" - " space of the partition to" - " zero.", - ut_get_name( - m_prebuilt->trx, - table_name).c_str()); - } else { - avail_space += - static_cast(space); - } - } - } - - /* - The MySQL optimizer seems to assume in a left join that n_rows - is an accurate estimate if it is zero. Of course, it is not, - since we do not have any locks on the rows yet at this phase. - Since SHOW TABLE STATUS seems to call this function with the - HA_STATUS_TIME flag set, while the left join optimizer does not - set that flag, we add one to a zero value if the flag is not - set. That way SHOW TABLE STATUS will show the best estimate, - while the optimizer never sees the table empty. */ - - if (n_rows == 0 && (flag & HA_STATUS_TIME) == 0) { - n_rows++; - } - - /* Fix bug#40386: Not flushing query cache after truncate. - n_rows can not be 0 unless the table is empty, set to 1 - instead. The original problem of bug#29507 is actually - fixed in the server code. */ - if (thd_sql_command(m_user_thd) == SQLCOM_TRUNCATE) { - - n_rows = 1; - - /* We need to reset the m_prebuilt value too, otherwise - checks for values greater than the last value written - to the table will fail and the autoinc counter will - not be updated. This will force write_row() into - attempting an update of the table's AUTOINC counter. */ - - m_prebuilt->autoinc_last_value = 0; - } - - /* Take page_size from first partition. */ - ib_table = m_part_share->get_table_part(0); - const page_size_t& page_size = - dict_table_page_size(ib_table); - - stats.records = (ha_rows) n_rows; - stats.deleted = 0; - stats.data_file_length = - ((ulonglong) stat_clustered_index_size) - * page_size.physical(); - stats.index_file_length = - ((ulonglong) stat_sum_of_other_index_sizes) - * page_size.physical(); - - /* See ha_innobase::info_low() for comments! */ - if ((flag & HA_STATUS_NO_LOCK) == 0 - && (flag & HA_STATUS_VARIABLE_EXTRA) != 0 - && srv_force_recovery < SRV_FORCE_NO_IBUF_MERGE) { - stats.delete_length = avail_space * 1024; - } - - stats.check_time = 0; - stats.mrr_length_per_rec = ref_length + sizeof(void*) - - PARTITION_BYTES_IN_POS; - - if (stats.records == 0) { - stats.mean_rec_length = 0; - } else { - stats.mean_rec_length = (ulong) - (stats.data_file_length / stats.records); - } - } - - if ((flag & HA_STATUS_CONST) != 0) { - /* Find max rows and biggest partition. */ - for (uint i = 0; i < m_tot_parts; i++) { - /* Skip partitions from above. */ - if ((flag & HA_STATUS_VARIABLE) == 0 - || !bitmap_is_set(&(m_part_info->read_partitions), - i)) { - - ib_table = m_part_share->get_table_part(i); - if (ib_table->stat_n_rows > max_rows) { - max_rows = ib_table->stat_n_rows; - biggest_partition = i; - } - } - } - ib_table = m_part_share->get_table_part(biggest_partition); - /* Verify the number of index in InnoDB and MySQL - matches up. If m_prebuilt->clust_index_was_generated - holds, InnoDB defines GEN_CLUST_INDEX internally. */ - ulint num_innodb_index = UT_LIST_GET_LEN(ib_table->indexes) - - m_prebuilt->clust_index_was_generated; - if (table->s->keys < num_innodb_index) { - /* If there are too many indexes defined - inside InnoDB, ignore those that are being - created, because MySQL will only consider - the fully built indexes here. */ - - for (const dict_index_t* index = - UT_LIST_GET_FIRST(ib_table->indexes); - index != NULL; - index = UT_LIST_GET_NEXT(indexes, index)) { - - /* First, online index creation is - completed inside InnoDB, and then - MySQL attempts to upgrade the - meta-data lock so that it can rebuild - the .frm file. If we get here in that - time frame, dict_index_is_online_ddl() - would not hold and the index would - still not be included in TABLE_SHARE. */ - if (!index->is_committed()) { - num_innodb_index--; - } - } - - if (table->s->keys < num_innodb_index - && (innobase_fts_check_doc_id_index(ib_table, - NULL, NULL) - == FTS_EXIST_DOC_ID_INDEX)) { - num_innodb_index--; - } - } - - if (table->s->keys != num_innodb_index) { - ib::error() << "Table " - << ib_table->name << " contains " - << num_innodb_index - << " indexes inside InnoDB, which" - " is different from the number of" - " indexes " << table->s->keys - << " defined in the MySQL"; - } - - if ((flag & HA_STATUS_NO_LOCK) == 0) { - dict_table_stats_lock(ib_table, RW_S_LATCH); - } - - ut_a(ib_table->stat_initialized); - - for (ulong i = 0; i < table->s->keys; i++) { - ulong j; - /* We could get index quickly through internal - index mapping with the index translation table. - The identity of index (match up index name with - that of table->key_info[i]) is already verified in - innopart_get_index(). */ - dict_index_t* index = innopart_get_index( - biggest_partition, i); - - if (index == NULL) { - ib::error() << "Table " - << ib_table->name << " contains fewer" - " indexes inside InnoDB than" - " are defined in the MySQL" - " .frm file. Have you mixed up" - " .frm files from different" - " installations? " - << TROUBLESHOOTING_MSG; - break; - } - - KEY* key = &table->key_info[i]; - for (j = 0; - j < key->actual_key_parts; - j++) { - - if ((key->flags & HA_FULLTEXT) != 0) { - /* The whole concept has no validity - for FTS indexes. */ - key->rec_per_key[j] = 1; - continue; - } - - if ((j + 1) > index->n_uniq) { - ib::error() << "Index " << index->name - << " of " << ib_table->name - << " has " << index->n_uniq - << " columns unique inside" - " InnoDB, but MySQL is" - " asking statistics for " - << j + 1 << " columns. Have" - " you mixed up .frm files" - " from different" - " installations? " - << TROUBLESHOOTING_MSG; - break; - } - - /* innodb_rec_per_key() will use - index->stat_n_diff_key_vals[] and the value we - pass index->table->stat_n_rows. Both are - calculated by ANALYZE and by the background - stats gathering thread (which kicks in when too - much of the table has been changed). In - addition table->stat_n_rows is adjusted with - each DML (e.g. ++ on row insert). Those - adjustments are not MVCC'ed and not even - reversed on rollback. So, - index->stat_n_diff_key_vals[] and - index->table->stat_n_rows could have been - calculated at different time. This is - acceptable. */ - const rec_per_key_t rec_per_key = - innodb_rec_per_key( - index, j, - max_rows); - - key->set_records_per_key(j, rec_per_key); - - /* The code below is legacy and should be - removed together with this comment once we - are sure the new floating point rec_per_key, - set via set_records_per_key(), works fine. */ - - ulong rec_per_key_int = static_cast( - innodb_rec_per_key(index, j, - max_rows)); - - /* Since MySQL seems to favor table scans - too much over index searches, we pretend - index selectivity is 2 times better than - our estimate: */ - - rec_per_key_int = rec_per_key_int / 2; - - if (rec_per_key_int == 0) { - rec_per_key_int = 1; - } - - key->rec_per_key[j] = rec_per_key_int; - } - } - - if ((flag & HA_STATUS_NO_LOCK) == 0) { - dict_table_stats_unlock(ib_table, RW_S_LATCH); - } - - char path[FN_REFLEN]; - os_file_stat_t stat_info; - /* Use the first partition for create time until new DD. */ - ib_table = m_part_share->get_table_part(0); - my_snprintf(path, sizeof(path), "%s/%s%s", - mysql_data_home, - table->s->normalized_path.str, - reg_ext); - - unpack_filename(path,path); - - if (os_file_get_status(path, &stat_info, false, true) == DB_SUCCESS) { - stats.create_time = (ulong) stat_info.ctime; - } - } - - if (srv_force_recovery >= SRV_FORCE_NO_IBUF_MERGE) { - - goto func_exit; - } - - if ((flag & HA_STATUS_ERRKEY) != 0) { - const dict_index_t* err_index; - - ut_a(m_prebuilt->trx); - ut_a(m_prebuilt->trx->magic_n == TRX_MAGIC_N); - - err_index = trx_get_error_info(m_prebuilt->trx); - - if (err_index != NULL) { - errkey = m_part_share->get_mysql_key(m_last_part, - err_index); - } else { - errkey = (unsigned int) ( - (m_prebuilt->trx->error_key_num - == ULINT_UNDEFINED) - ? UINT_MAX - : m_prebuilt->trx->error_key_num); - } - } - - if ((flag & HA_STATUS_AUTO) != 0) { - /* auto_inc is only supported in first key for InnoDB! */ - ut_ad(table_share->next_number_keypart == 0); - DBUG_PRINT("info", ("HA_STATUS_AUTO")); - if (table->found_next_number_field == NULL) { - stats.auto_increment_value = 0; - } else { - /* Lock to avoid two concurrent initializations. */ - lock_auto_increment(); - if (m_part_share->auto_inc_initialized) { - stats.auto_increment_value = - m_part_share->next_auto_inc_val; - } else { - /* The auto-inc mutex in the table_share is - locked, so we do not need to have the handlers - locked. */ - - error = initialize_auto_increment( - (flag & HA_STATUS_NO_LOCK) != 0); - stats.auto_increment_value = - m_part_share->next_auto_inc_val; - } - unlock_auto_increment(); - } - } - -func_exit: - m_prebuilt->trx->op_info = (char*)""; - - DBUG_RETURN(error); -} - -/** Optimize table. -This is mapped to "ALTER TABLE tablename ENGINE=InnoDB", which rebuilds -the table in MySQL. -@param[in] thd Connection thread handle. -@param[in] check_opt Currently ignored. -@return 0 for success else error code. */ -int -ha_innopart::optimize( - THD* thd, - HA_CHECK_OPT* check_opt) -{ - return(HA_ADMIN_TRY_ALTER); -} - -/** Checks a partitioned table. -Tries to check that an InnoDB table is not corrupted. If corruption is -noticed, prints to stderr information about it. In case of corruption -may also assert a failure and crash the server. Also checks for records -in wrong partition. -@param[in] thd MySQL THD object/thread handle. -@param[in] check_opt Check options. -@return HA_ADMIN_CORRUPT or HA_ADMIN_OK. */ -int -ha_innopart::check( - THD* thd, - HA_CHECK_OPT* check_opt) -{ - uint error = HA_ADMIN_OK; - uint i; - - DBUG_ENTER("ha_innopart::check"); - /* TODO: Enhance this to: - - Every partition has the same structure. - - The names are correct (partition names checked in ::open()?) - Currently it only does normal InnoDB check of each partition. */ - - if (set_altered_partitions()) { - ut_ad(0); // Already checked by set_part_state()! - DBUG_RETURN(HA_ADMIN_INVALID); - } - for (i = m_part_info->get_first_used_partition(); - i < m_tot_parts; - i = m_part_info->get_next_used_partition(i)) { - - m_prebuilt->table = m_part_share->get_table_part(i); - error = ha_innobase::check(thd, check_opt); - if (error != 0) { - break; - } - if ((check_opt->flags & (T_MEDIUM | T_EXTEND)) != 0) { - error = Partition_helper::check_misplaced_rows(i, false); - if (error != 0) { - break; - } - } - } - if (error != 0) { - print_admin_msg( - thd, - 256, - "error", - table_share->db.str, - table->alias, - "check", - m_is_sub_partitioned ? - "Subpartition %s returned error" - : "Partition %s returned error", - m_part_share->get_partition_name(i)); - } - - DBUG_RETURN(error); -} - -/** Repair a partitioned table. -Only repairs records in wrong partitions (moves them to the correct -partition or deletes them if not in any partition). -@param[in] thd MySQL THD object/thread handle. -@param[in] repair_opt Repair options. -@return 0 or error code. */ -int -ha_innopart::repair( - THD* thd, - HA_CHECK_OPT* repair_opt) -{ - uint error = HA_ADMIN_OK; - - DBUG_ENTER("ha_innopart::repair"); - - /* TODO: enable this warning to be clear about what is repaired. - Currently disabled to generate smaller test diffs. */ -#ifdef ADD_WARNING_FOR_REPAIR_ONLY_PARTITION - push_warning_printf(thd, Sql_condition::SL_WARNING, - ER_ILLEGAL_HA, - "Only moving rows from wrong partition to correct" - " partition is supported," - " repairing InnoDB indexes is not yet supported!"); -#endif - - /* Only repair partitions for MEDIUM or EXTENDED options. */ - if ((repair_opt->flags & (T_MEDIUM | T_EXTEND)) == 0) { - DBUG_RETURN(HA_ADMIN_OK); - } - if (set_altered_partitions()) { - ut_ad(0); // Already checked by set_part_state()! - DBUG_RETURN(HA_ADMIN_INVALID); - } - for (uint i = m_part_info->get_first_used_partition(); - i < m_tot_parts; - i = m_part_info->get_next_used_partition(i)) { - - /* TODO: Implement and use ha_innobase::repair()! */ - error = Partition_helper::check_misplaced_rows(i, true); - if (error != 0) { - print_admin_msg( - thd, - 256, - "error", - table_share->db.str, - table->alias, - "repair", - m_is_sub_partitioned ? - "Subpartition %s returned error" - : "Partition %s returned error", - m_part_share->get_partition_name(i)); - break; - } - } - - DBUG_RETURN(error); -} - -/** Check if possible to switch engine (no foreign keys). -Checks if ALTER TABLE may change the storage engine of the table. -Changing storage engines is not allowed for tables for which there -are foreign key constraints (parent or child tables). -@return true if can switch engines. */ -bool -ha_innopart::can_switch_engines() -{ - bool can_switch; - - DBUG_ENTER("ha_innopart::can_switch_engines"); - can_switch = ha_innobase::can_switch_engines(); - ut_ad(can_switch); - - DBUG_RETURN(can_switch); -} - -/** Checks if a table is referenced by a foreign key. -The MySQL manual states that a REPLACE is either equivalent to an INSERT, -or DELETE(s) + INSERT. Only a delete is then allowed internally to resolve -a duplicate key conflict in REPLACE, not an update. -@return > 0 if referenced by a FOREIGN KEY. */ -uint -ha_innopart::referenced_by_foreign_key() -{ - if (dict_table_is_referenced_by_foreign_key(m_prebuilt->table)) { - -#ifndef HA_INNOPART_SUPPORTS_FOREIGN_KEYS - ut_ad(0); -#endif /* HA_INNOPART_SUPPORTS_FOREIGN_KEYS */ - return(1); - } - - return(0); -} - -/** Start statement. -MySQL calls this function at the start of each SQL statement inside LOCK -TABLES. Inside LOCK TABLES the ::external_lock method does not work to -mark SQL statement borders. Note also a special case: if a temporary table -is created inside LOCK TABLES, MySQL has not called external_lock() at all -on that table. -MySQL-5.0 also calls this before each statement in an execution of a stored -procedure. To make the execution more deterministic for binlogging, MySQL-5.0 -locks all tables involved in a stored procedure with full explicit table -locks (thd_in_lock_tables(thd) holds in store_lock()) before executing the -procedure. -@param[in] thd Handle to the user thread. -@param[in] lock_type Lock type. -@return 0 or error code. */ -int -ha_innopart::start_stmt( - THD* thd, - thr_lock_type lock_type) -{ - int error = 0; - - if (m_part_info->get_first_used_partition() == MY_BIT_NONE) { - /* All partitions pruned away, do nothing! */ - return(error); - } - - error = ha_innobase::start_stmt(thd, lock_type); - if (m_prebuilt->sql_stat_start) { - memset(m_sql_stat_start_parts, 0xff, - UT_BITS_IN_BYTES(m_tot_parts)); - } else { - memset(m_sql_stat_start_parts, 0, - UT_BITS_IN_BYTES(m_tot_parts)); - } - return(error); -} - -/** Function to store lock for all partitions in native partitioned table. Also -look at ha_innobase::store_lock for more details. -@param[in] thd user thread handle -@param[in] to pointer to the current element in an array of -pointers to lock structs -@param[in] lock_type lock type to store in 'lock'; this may also be -TL_IGNORE -@retval to pointer to the current element in the 'to' array */ -THR_LOCK_DATA** -ha_innopart::store_lock( - THD* thd, - THR_LOCK_DATA** to, - thr_lock_type lock_type) -{ - trx_t* trx = m_prebuilt->trx; - const uint sql_command = thd_sql_command(thd); - - ha_innobase::store_lock(thd, to, lock_type); - - if (sql_command == SQLCOM_FLUSH - && lock_type == TL_READ_NO_INSERT) { - for (uint i = 1; i < m_tot_parts; i++) { - dict_table_t* table = m_part_share->get_table_part(i); - - dberr_t err = row_quiesce_set_state( - table, QUIESCE_START, trx); - ut_a(err == DB_SUCCESS || err == DB_UNSUPPORTED); - } - } - - return to; -} - -/** Lock/prepare to lock table. -As MySQL will execute an external lock for every new table it uses when it -starts to process an SQL statement (an exception is when MySQL calls -start_stmt for the handle) we can use this function to store the pointer to -the THD in the handle. We will also use this function to communicate -to InnoDB that a new SQL statement has started and that we must store a -savepoint to our transaction handle, so that we are able to roll back -the SQL statement in case of an error. -@param[in] thd Handle to the user thread. -@param[in] lock_type Lock type. -@return 0 or error number. */ -int -ha_innopart::external_lock( - THD* thd, - int lock_type) -{ - int error = 0; - - if (m_part_info->get_first_used_partition() == MY_BIT_NONE - && !(m_mysql_has_locked - && lock_type == F_UNLCK)) { - - /* All partitions pruned away, do nothing! */ - ut_ad(!m_mysql_has_locked); - return(error); - } - ut_ad(m_mysql_has_locked || lock_type != F_UNLCK); - - m_prebuilt->table = m_part_share->get_table_part(0); - error = ha_innobase::external_lock(thd, lock_type); - - for (uint i = 0; i < m_tot_parts; i++) { - dict_table_t* table = m_part_share->get_table_part(i); - - switch (table->quiesce) { - case QUIESCE_START: - /* Check for FLUSH TABLE t WITH READ LOCK */ - if (!srv_read_only_mode - && thd_sql_command(thd) == SQLCOM_FLUSH - && lock_type == F_RDLCK) { - - ut_ad(table->quiesce == QUIESCE_START); - - row_quiesce_table_start(table, - m_prebuilt->trx); - - /* Use the transaction instance to track - UNLOCK TABLES. It can be done via START - TRANSACTION; too implicitly. */ - - ++m_prebuilt->trx->flush_tables; - } - break; - - case QUIESCE_COMPLETE: - /* Check for UNLOCK TABLES; implicit or explicit - or trx interruption. */ - if (m_prebuilt->trx->flush_tables > 0 - && (lock_type == F_UNLCK - || trx_is_interrupted(m_prebuilt->trx))) { - - ut_ad(table->quiesce == QUIESCE_COMPLETE); - row_quiesce_table_complete(table, - m_prebuilt->trx); - - ut_a(m_prebuilt->trx->flush_tables > 0); - --m_prebuilt->trx->flush_tables; - } - break; - - case QUIESCE_NONE: - break; - - default: - ut_ad(0); - } - } - - ut_ad(!m_auto_increment_lock); - ut_ad(!m_auto_increment_safe_stmt_log_lock); - - if (m_prebuilt->sql_stat_start) { - memset(m_sql_stat_start_parts, 0xff, - UT_BITS_IN_BYTES(m_tot_parts)); - } else { - memset(m_sql_stat_start_parts, 0, - UT_BITS_IN_BYTES(m_tot_parts)); - } - return(error); -} - -/** Get the current auto_increment value. -@param[in] offset Table auto-inc offset. -@param[in] increment Table auto-inc increment. -@param[in] nb_desired_values Number of required values. -@param[out] first_value The auto increment value. -@param[out] nb_reserved_values Number of reserved values. -@return Auto increment value, or ~0 on failure. */ -void -ha_innopart::get_auto_increment( - ulonglong offset, - ulonglong increment, - ulonglong nb_desired_values, - ulonglong* first_value, - ulonglong* nb_reserved_values) -{ - DBUG_ENTER("ha_innopart::get_auto_increment"); - if (table_share->next_number_keypart != 0) { - /* Only first key part allowed as autoinc for InnoDB tables! */ - ut_ad(0); - *first_value = ULLONG_MAX; - DBUG_VOID_RETURN; - } - get_auto_increment_first_field( - increment, - nb_desired_values, - first_value, - nb_reserved_values); - DBUG_VOID_RETURN; -} - -/** Compares two 'refs'. -A 'ref' is the (internal) primary key value of the row. -If there is no explicitly declared non-null unique key or a primary key, then -InnoDB internally uses the row id as the primary key. -It will use the partition id as secondary compare. -@param[in] ref1 An (internal) primary key value in the MySQL key value -format. -@param[in] ref2 Reference to compare with (same type as ref1). -@return < 0 if ref1 < ref2, 0 if equal, else > 0. */ -int -ha_innopart::cmp_ref( - const uchar* ref1, - const uchar* ref2) -{ - int cmp; - - cmp = ha_innobase::cmp_ref(ref1 + PARTITION_BYTES_IN_POS, - ref2 + PARTITION_BYTES_IN_POS); - - if (cmp != 0) { - return(cmp); - } - - cmp = static_cast(uint2korr(ref1)) - - static_cast(uint2korr(ref2)); - - return(cmp); -} - -/** Prepare for creating new partitions during ALTER TABLE ... PARTITION. -@param[in] num_partitions Number of new partitions to be created. -@param[in] only_create True if only creating the partition -(no open/lock is needed). -@return 0 for success else error code. */ -int -ha_innopart::prepare_for_new_partitions( - uint num_partitions, - bool only_create) -{ - m_new_partitions = UT_NEW(Altered_partitions(num_partitions, - only_create), - mem_key_partitioning); - if (m_new_partitions == NULL) { - return(HA_ERR_OUT_OF_MEM); - } - if (m_new_partitions->initialize()) { - UT_DELETE(m_new_partitions); - m_new_partitions = NULL; - return(HA_ERR_OUT_OF_MEM); - } - return(0); -} - -/** Create a new partition to be filled during ALTER TABLE ... PARTITION. -@param[in] table Table to create the partition in. -@param[in] create_info Table/partition specific create info. -@param[in] part_name Partition name. -@param[in] new_part_id Partition id in new table. -@param[in] part_elem Partition element. -@return 0 for success else error code. */ -int -ha_innopart::create_new_partition( - TABLE* table, - HA_CREATE_INFO* create_info, - const char* part_name, - uint new_part_id, - partition_element* part_elem) -{ - int error; - char norm_name[FN_REFLEN]; - const char* data_file_name_backup = create_info->data_file_name; - DBUG_ENTER("ha_innopart::create_new_partition"); - /* Delete by ddl_log on failure. */ - normalize_table_name(norm_name, part_name); - set_create_info_dir(part_elem, create_info); - - error = ha_innobase::create(norm_name, table, create_info); - create_info->data_file_name = data_file_name_backup; - if (error == HA_ERR_FOUND_DUPP_KEY) { - DBUG_RETURN(HA_ERR_TABLE_EXIST); - } - if (error != 0) { - DBUG_RETURN(error); - } - if (!m_new_partitions->only_create()) - { - dict_table_t* part; - part = dict_table_open_on_name(norm_name, - false, - true, - DICT_ERR_IGNORE_NONE); - if (part == NULL) { - DBUG_RETURN(HA_ERR_INTERNAL_ERROR); - } - m_new_partitions->set_part(new_part_id, part); - } - DBUG_RETURN(0); -} - -/** Close and finalize new partitions. */ -void -ha_innopart::close_new_partitions() -{ - if (m_new_partitions != NULL) { - UT_DELETE(m_new_partitions); - m_new_partitions = NULL; - } -} - -/** write row to new partition. -@param[in] new_part New partition to write to. -@return 0 for success else error code. */ -int -ha_innopart::write_row_in_new_part( - uint new_part) -{ - int result; - DBUG_ENTER("ha_innopart::write_row_in_new_part"); - - m_last_part = new_part; - if (m_new_partitions->part(new_part) == NULL) { - /* Altered partition contains misplaced row. */ - m_err_rec = table->record[0]; - DBUG_RETURN(HA_ERR_ROW_IN_WRONG_PARTITION); - } - m_new_partitions->get_prebuilt(m_prebuilt, new_part); - result = ha_innobase::write_row(table->record[0]); - m_new_partitions->set_from_prebuilt(m_prebuilt, new_part); - DBUG_RETURN(result); -} - -/** Allocate the array to hold blob heaps for all partitions */ -mem_heap_t** -ha_innopart::alloc_blob_heap_array() -{ - DBUG_ENTER("ha_innopart::alloc_blob_heap_array"); - - const ulint len = sizeof(mem_heap_t*) * m_tot_parts; - m_blob_heap_parts = static_cast( - ut_zalloc(len, mem_key_partitioning)); - if (m_blob_heap_parts == NULL) { - DBUG_RETURN(NULL); - } - - DBUG_RETURN(m_blob_heap_parts); -} - -/** Free the array that holds blob heaps for all partitions */ -void -ha_innopart::free_blob_heap_array() -{ - DBUG_ENTER("ha_innopart::free_blob_heap_array"); - - if (m_blob_heap_parts != NULL) { - clear_blob_heaps(); - ut_free(m_blob_heap_parts); - m_blob_heap_parts = NULL; - } - - DBUG_VOID_RETURN; -} - -void -ha_innopart::clear_blob_heaps() -{ - DBUG_ENTER("ha_innopart::clear_blob_heaps"); - - if (m_blob_heap_parts == NULL) { - DBUG_VOID_RETURN; - } - - for (uint i = 0; i < m_tot_parts; i++) { - if (m_blob_heap_parts[i] != NULL) { - DBUG_PRINT("ha_innopart", ("freeing blob_heap: %p", - m_blob_heap_parts[i])); - mem_heap_free(m_blob_heap_parts[i]); - m_blob_heap_parts[i] = NULL; - } - } - - /* Reset blob_heap in m_prebuilt after freeing all heaps. It is set in - ha_innopart::set_partition to the blob heap of current partition. */ - m_prebuilt->blob_heap = NULL; - - DBUG_VOID_RETURN; -} - -/** Reset state of file to after 'open'. This function is called -after every statement for all tables used by that statement. */ -int -ha_innopart::reset() -{ - DBUG_ENTER("ha_innopart::reset"); - - clear_blob_heaps(); - - DBUG_RETURN(ha_innobase::reset()); -} - -/**************************************************************************** - * DS-MRR implementation - ***************************************************************************/ - -/* TODO: move the default implementations into the base handler class! */ -/* TODO: See if it could be optimized for partitioned tables? */ -/* Use default ha_innobase implementation for now... */ diff --git a/storage/innobase/handler/ha_innopart.h b/storage/innobase/handler/ha_innopart.h deleted file mode 100644 index 67db9e07150..00000000000 --- a/storage/innobase/handler/ha_innopart.h +++ /dev/null @@ -1,1315 +0,0 @@ -/***************************************************************************** - -Copyright (c) 2014, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2016, MariaDB Corporation. - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; version 2 of the License. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA - -*****************************************************************************/ - -/* The InnoDB Partition handler: the interface between MySQL and InnoDB. */ - -#ifndef ha_innopart_h -#define ha_innopart_h - -#include "partitioning/partition_handler.h" - -/* Forward declarations */ -class Altered_partitions; -class partition_info; - -/** HA_DUPLICATE_POS and HA_READ_BEFORE_WRITE_REMOVAL is not -set from ha_innobase, but cannot yet be supported in ha_innopart. -Full text and geometry is not yet supported. */ -const handler::Table_flags HA_INNOPART_DISABLED_TABLE_FLAGS = - ( HA_CAN_FULLTEXT - | HA_CAN_FULLTEXT_EXT - | HA_CAN_GEOMETRY - | HA_DUPLICATE_POS - | HA_READ_BEFORE_WRITE_REMOVAL); - -/** InnoDB partition specific Handler_share. */ -class Ha_innopart_share : public Partition_share -{ -private: - /** Array of all included table definitions (one per partition). */ - dict_table_t** m_table_parts; - - /** Instead of INNOBASE_SHARE::idx_trans_tbl. Maps MySQL index number - to InnoDB index per partition. */ - dict_index_t** m_index_mapping; - - /** Total number of partitions. */ - uint m_tot_parts; - - /** Number of indexes. */ - uint m_index_count; - - /** Reference count. */ - uint m_ref_count; - - /** Pointer back to owning TABLE_SHARE. */ - TABLE_SHARE* m_table_share; - -public: - Ha_innopart_share( - TABLE_SHARE* table_share); - - ~Ha_innopart_share(); - - /** Set innodb table for given partition. - @param[in] part_id Partition number. - @param[in] table Table. */ - inline - void - set_table_part( - uint part_id, - dict_table_t* table) - { - ut_ad(m_table_parts != NULL); - ut_ad(part_id < m_tot_parts); - m_table_parts[part_id] = table; - } - - /** Return innodb table for given partition. - @param[in] part_id Partition number. - @return InnoDB table. */ - inline - dict_table_t* - get_table_part( - uint part_id) const - { - ut_ad(m_table_parts != NULL); - ut_ad(part_id < m_tot_parts); - return(m_table_parts[part_id]); - } - - /** Return innodb index for given partition and key number. - @param[in] part_id Partition number. - @param[in] keynr Key number. - @return InnoDB index. */ - dict_index_t* - get_index( - uint part_id, - uint keynr); - - /** Get MySQL key number corresponding to InnoDB index. - @param[in] part_id Partition number. - @param[in] index InnoDB index. - @return MySQL key number or MAX_KEY if non-existent. */ - uint - get_mysql_key( - uint part_id, - const dict_index_t* index); - - /** Initialize the share with table and indexes per partition. - @param[in] part_info Partition info (partition names to use) - @param[in] table_name Table name (db/table_name) - @return false on success else true. */ - bool - open_table_parts( - partition_info* part_info, - const char* table_name); - - /** Close the table partitions. - If all instances are closed, also release the resources. */ - void - close_table_parts(); - - /* Static helper functions. */ - /** Fold to lower case if windows or lower_case_table_names == 1. - @param[in,out] s String to fold.*/ - static - void - partition_name_casedn_str( - char* s); - - /** Translate and append partition name. - @param[out] to String to write in filesystem charset - @param[in] from Name in system charset - @param[in] sep Separator - @param[in] len Max length of to buffer - @return length of written string. */ - static - size_t - append_sep_and_name( - char* to, - const char* from, - const char* sep, - size_t len); - - /** Set up the virtual column template for partition table, and points - all m_table_parts[]->vc_templ to it. - @param[in] table MySQL TABLE object - @param[in] ib_table InnoDB dict_table_t - @param[in] table_name Table name (db/table_name) */ - void - set_v_templ( - TABLE* table, - dict_table_t* ib_table, - const char* name); - -private: - /** Disable default constructor. */ - Ha_innopart_share() {}; - - /** Open one partition (lower lever innodb table). - @param[in] part_id Partition to open. - @param[in] partition_name Name of partition. - @return false on success else true. */ - bool - open_one_table_part( - uint part_id, - const char* partition_name); -}; - -/** The class defining a partitioning aware handle to an InnoDB table. -Based on ha_innobase and extended with -- Partition_helper for re-using common partitioning functionality -- Partition_handler for providing partitioning specific api calls. -Generic partitioning functions are implemented in Partition_helper. -Lower level storage functions are implemented in ha_innobase. -Partition_handler is inherited for implementing the handler level interface -for partitioning specific functions, like change_partitions and -truncate_partition. -InnoDB specific functions related to partitioning is implemented here. */ -class ha_innopart: - public ha_innobase, - public Partition_helper, - public Partition_handler -{ -public: - ha_innopart( - handlerton* hton, - TABLE_SHARE* table_arg); - - ~ha_innopart(); - - /** Clone this handler, used when needing more than one cursor - to the same table. - @param[in] name Table name. - @param[in] mem_root mem_root to allocate from. - @retval Pointer to clone or NULL if error. */ - handler* - clone( - const char* name, - MEM_ROOT* mem_root); - - /** Check and register a table in the query cache. - Ask InnoDB if a query to a table can be cached. - @param[in] thd User thread handle. - @param[in] table_key Normalized path to the table. - @param[in] key_length Lenght of table_key. - @param[out] call_back Function pointer for checking if data - has changed. - @param[in,out] engine_data Data for call_back (not used). - @return TRUE if query caching of the table is permitted. */ - my_bool - register_query_cache_table( - THD* thd, - char* table_key, - size_t key_length, - qc_engine_callback* call_back, - ulonglong* engine_data) - { - /* Currently this would need to go through every - [sub] partition in the table to see if any of them has changed. - See row_search_check_if_query_cache_permitted(). - So disabled until we can avoid check all partitions. */ - return(FALSE); - } - - /** On-line ALTER TABLE interface @see handler0alter.cc @{ */ - - /** Check if InnoDB supports a particular alter table in-place. - @param[in] altered_table TABLE object for new version of table. - @param[in,out] ha_alter_info Structure describing changes to be done - by ALTER TABLE and holding data used during in-place alter. - @retval HA_ALTER_INPLACE_NOT_SUPPORTED Not supported - @retval HA_ALTER_INPLACE_NO_LOCK Supported - @retval HA_ALTER_INPLACE_SHARED_LOCK_AFTER_PREPARE Supported, but - requires lock during main phase and exclusive lock during prepare - phase. - @retval HA_ALTER_INPLACE_NO_LOCK_AFTER_PREPARE Supported, prepare - phase requires exclusive lock. */ - enum_alter_inplace_result - check_if_supported_inplace_alter( - TABLE* altered_table, - Alter_inplace_info* ha_alter_info); - - /** Prepare in-place ALTER for table. - Allows InnoDB to update internal structures with concurrent - writes blocked (provided that check_if_supported_inplace_alter() - did not return HA_ALTER_INPLACE_NO_LOCK). - This will be invoked before inplace_alter_table(). - @param[in] altered_table TABLE object for new version of table. - @param[in,out] ha_alter_info Structure describing changes to be done - by ALTER TABLE and holding data used during in-place alter. - @retval true Failure. - @retval false Success. */ - bool - prepare_inplace_alter_table( - TABLE* altered_table, - Alter_inplace_info* ha_alter_info); - - /** Alter the table structure in-place. - Alter the table structure in-place with operations - specified using HA_ALTER_FLAGS and Alter_inplace_information. - The level of concurrency allowed during this operation depends - on the return value from check_if_supported_inplace_alter(). - @param[in] altered_table TABLE object for new version of table. - @param[in,out] ha_alter_info Structure describing changes to be done - by ALTER TABLE and holding data used during in-place alter. - @retval true Failure. - @retval false Success. */ - bool - inplace_alter_table( - TABLE* altered_table, - Alter_inplace_info* ha_alter_info); - - /** Commit or rollback. - Commit or rollback the changes made during - prepare_inplace_alter_table() and inplace_alter_table() inside - the storage engine. Note that the allowed level of concurrency - during this operation will be the same as for - inplace_alter_table() and thus might be higher than during - prepare_inplace_alter_table(). (E.g concurrent writes were - blocked during prepare, but might not be during commit). - @param[in] altered_table TABLE object for new version of table. - @param[in] ha_alter_info Structure describing changes to be done - by ALTER TABLE and holding data used during in-place alter. - @param[in,out] commit true => Commit, false => Rollback. - @retval true Failure. - @retval false Success. */ - bool - commit_inplace_alter_table( - TABLE* altered_table, - Alter_inplace_info* ha_alter_info, - bool commit); - - /** Notify the storage engine that the table structure (.frm) has - been updated. - - ha_partition allows inplace operations that also upgrades the engine - if it supports partitioning natively. So if this is the case then - we will remove the .par file since it is not used with ha_innopart - (we use the internal data dictionary instead). */ - void - notify_table_changed(); - /** @} */ - - // TODO: should we implement init_table_handle_for_HANDLER() ? - // (or is sql_stat_start handled correctly anyway?) - int - optimize( - THD* thd, - HA_CHECK_OPT* check_opt); - - int - discard_or_import_tablespace( - my_bool discard); - - /** Compare key and rowid. - Helper function for sorting records in the priority queue. - a/b points to table->record[0] rows which must have the - key fields set. The bytes before a and b store the rowid. - This is used for comparing/sorting rows first according to - KEY and if same KEY, by rowid (ref). - - @param[in] key_info Null terminated array of index - information. - @param[in] a Pointer to record+ref in first record. - @param[in] b Pointer to record+ref in second record. - @return Return value is SIGN(first_rec - second_rec) - @retval 0 Keys are equal. - @retval -1 second_rec is greater than first_rec. - @retval +1 first_rec is greater than second_rec. */ - static - int - key_and_rowid_cmp( - KEY** key_info, - uchar *a, - uchar *b); - - int - extra( - enum ha_extra_function operation); - - void - print_error( - int error, - myf errflag); - - bool - is_ignorable_error( - int error); - - int - start_stmt( - THD* thd, - thr_lock_type lock_type); - - ha_rows - records_in_range( - uint inx, - key_range* min_key, - key_range* max_key); - - ha_rows - estimate_rows_upper_bound(); - - uint - alter_table_flags( - uint flags); - - void - update_create_info( - HA_CREATE_INFO* create_info); - - int - create( - const char* name, - TABLE* form, - HA_CREATE_INFO* create_info); - - int - truncate(); - - int - check( - THD* thd, - HA_CHECK_OPT* check_opt); - - /** Repair table. - Will only handle records in wrong partition, not repairing - corrupt innodb indexes. - @param[in] thd Thread context. - @param[in] repair_opt Repair options. - @return 0 or error code. */ - int - repair( - THD* thd, - HA_CHECK_OPT* repair_opt); - - bool - can_switch_engines(); - - uint - referenced_by_foreign_key(); - - void - get_auto_increment( - ulonglong offset, - ulonglong increment, - ulonglong nb_desired_values, - ulonglong* first_value, - ulonglong* nb_reserved_values); - - int - cmp_ref( - const uchar* ref1, - const uchar* ref2); - - int - read_range_first( - const key_range* start_key, - const key_range* end_key, - bool eq_range_arg, - bool sorted) - { - return(Partition_helper::ph_read_range_first( - start_key, - end_key, - eq_range_arg, - sorted)); - } - - void - position( - const uchar* record) - { - Partition_helper::ph_position(record); - } - - int - rnd_pos_by_record( - uchar* record) - { - return(Partition_helper::ph_rnd_pos_by_record(record)); - } - - /* TODO: Implement these! */ - bool - check_if_incompatible_data( - HA_CREATE_INFO* info, - uint table_changes) - { - ut_ad(0); - return(COMPATIBLE_DATA_NO); - } - - int - delete_all_rows() - { - return(handler::delete_all_rows()); - } - - int - disable_indexes( - uint mode) - { - return(HA_ERR_WRONG_COMMAND); - } - - int - enable_indexes( - uint mode) - { - return(HA_ERR_WRONG_COMMAND); - } - - void - free_foreign_key_create_info( - char* str) - { - ut_ad(0); - } - - int - ft_init() - { - ut_ad(0); - return(HA_ERR_WRONG_COMMAND); - } - - FT_INFO* - ft_init_ext( - uint flags, - uint inx, - String* key) - { - ut_ad(0); - return(NULL); - } - - FT_INFO* - ft_init_ext_with_hints( - uint inx, - String* key, - Ft_hints* hints) - { - ut_ad(0); - return(NULL); - } - - int - ft_read( - uchar* buf) - { - ut_ad(0); - return(HA_ERR_WRONG_COMMAND); - } - - bool - get_foreign_dup_key( - char* child_table_name, - uint child_table_name_len, - char* child_key_name, - uint child_key_name_len) - { - ut_ad(0); - return(false); - } - - // TODO: not yet supporting FK. - char* - get_foreign_key_create_info() - { - return(NULL); - } - - // TODO: not yet supporting FK. - int - get_foreign_key_list( - THD* thd, - List* f_key_list) - { - return(0); - } - - // TODO: not yet supporting FK. - int - get_parent_foreign_key_list( - THD* thd, - List* f_key_list) - { - return(0); - } - - // TODO: not yet supporting FK. - int - get_cascade_foreign_key_table_list( - THD* thd, - List* fk_table_list) - { - return(0); - } - - int - read_range_next() - { - return(Partition_helper::ph_read_range_next()); - } - - uint32 - calculate_key_hash_value( - Field** field_array) - { - return(Partition_helper::ph_calculate_key_hash_value(field_array)); - } - - Table_flags - table_flags() const - { - return(ha_innobase::table_flags() | HA_CAN_REPAIR); - } - - void - release_auto_increment() - { - Partition_helper::ph_release_auto_increment(); - } - - /** Implementing Partition_handler interface @see partition_handler.h - @{ */ - - /** See Partition_handler. */ - void - get_dynamic_partition_info( - ha_statistics* stat_info, - ha_checksum* check_sum, - uint part_id) - { - Partition_helper::get_dynamic_partition_info_low( - stat_info, - check_sum, - part_id); - } - - uint - alter_flags( - uint flags MY_ATTRIBUTE((unused))) const - { - return(HA_PARTITION_FUNCTION_SUPPORTED - | HA_FAST_CHANGE_PARTITION); - } - - Partition_handler* - get_partition_handler() - { - return(static_cast(this)); - } - - void - set_part_info( - partition_info* part_info, - bool early) - { - Partition_helper::set_part_info_low(part_info, early); - } - - void - initialize_partitioning( - partition_info* part_info, - bool early) - { - Partition_helper::set_part_info_low(part_info, early); - } - - handler* - get_handler() - { - return(static_cast(this)); - } - /** @} */ - -private: - /** Pointer to Ha_innopart_share on the TABLE_SHARE. */ - Ha_innopart_share* m_part_share; - - /** ins_node per partition. Synchronized with prebuilt->ins_node - when changing partitions. */ - ins_node_t** m_ins_node_parts; - - /** upd_node per partition. Synchronized with prebuilt->upd_node - when changing partitions. */ - upd_node_t** m_upd_node_parts; - - /** blob_heap per partition. Synchronized with prebuilt->blob_heap - when changing partitions. */ - mem_heap_t** m_blob_heap_parts; - - /** trx_id from the partitions table->def_trx_id. Keep in sync - with prebuilt->trx_id when changing partitions. - prebuilt only reflects the current partition! */ - trx_id_t* m_trx_id_parts; - - /** row_read_type per partition. */ - ulint* m_row_read_type_parts; - - /** sql_stat_start per partition. */ - uchar* m_sql_stat_start_parts; - - /** persistent cursors per partition. */ - btr_pcur_t* m_pcur_parts; - - /** persistent cluster cursors per partition. */ - btr_pcur_t* m_clust_pcur_parts; - - /** map from part_id to offset in above two arrays. */ - uint16_t* m_pcur_map; - - /** Original m_prebuilt->pcur. */ - btr_pcur_t* m_pcur; - - /** Original m_prebuilt->clust_pcur. */ - btr_pcur_t* m_clust_pcur; - - /** New partitions during ADD/REORG/... PARTITION. */ - Altered_partitions* m_new_partitions; - - /** Clear used ins_nodes and upd_nodes. */ - void - clear_ins_upd_nodes(); - - /** Clear the blob heaps for all partitions */ - void - clear_blob_heaps(); - - /** Reset state of file to after 'open'. This function is called - after every statement for all tables used by that statement. */ - int - reset(); - - /** Allocate the array to hold blob heaps for all partitions */ - mem_heap_t** - alloc_blob_heap_array(); - - /** Free the array that holds blob heaps for all partitions */ - void - free_blob_heap_array(); - - /** Changes the active index of a handle. - @param[in] part_id Use this partition. - @param[in] keynr Use this index; MAX_KEY means always - clustered index, even if it was internally generated by InnoDB. - @return 0 or error code. */ - int - change_active_index( - uint part_id, - uint keynr); - - /** Move to next partition and set its index. - @return 0 for success else error number. */ - int - next_partition_index(); - - /** Get the index for the current partition - @param[in] keynr MySQL index number. - @return InnoDB index or NULL. */ - dict_index_t* - innobase_get_index( - uint keynr); - - /** Get the index for a handle. - Does not change active index. - @param[in] keynr use this index; MAX_KEY means always clustered - index, even if it was internally generated by InnoDB. - @param[in] part_id From this partition. - @return NULL or index instance. */ - dict_index_t* - innopart_get_index( - uint part_id, - uint keynr); - - /** Change active partition. - Copies needed info into m_prebuilt from the partition specific memory. - @param[in] part_id Partition to set as active. */ - void - set_partition( - uint part_id); - - /** Update active partition. - Copies needed info from m_prebuilt into the partition specific memory. - @param[in] part_id Partition to set as active. */ - void - update_partition( - uint part_id); - - /** Helpers needed by Partition_helper, @see partition_handler.h @{ */ - - /** Set the autoinc column max value. - This should only be called once from ha_innobase::open(). - Therefore there's no need for a covering lock. - @param[in] no_lock If locking should be skipped. Not used! - @return 0 on success else error code. */ - int - initialize_auto_increment( - bool /* no_lock */); - - /** Setup the ordered record buffer and the priority queue. - @param[in] used_parts Number of used partitions in query. - @return false for success, else true. */ - int - init_record_priority_queue_for_parts( - uint used_parts); - - /** Destroy the ordered record buffer and the priority queue. */ - void - destroy_record_priority_queue_for_parts(); - - /** Prepare for creating new partitions during ALTER TABLE ... - PARTITION. - @param[in] num_partitions Number of new partitions to be created. - @param[in] only_create True if only creating the partition - (no open/lock is needed). - @return 0 for success else error code. */ - int - prepare_for_new_partitions( - uint num_partitions, - bool only_create); - - /** Create a new partition to be filled during ALTER TABLE ... - PARTITION. - @param[in] table Table to create the partition in. - @param[in] create_info Table/partition specific create info. - @param[in] part_name Partition name. - @param[in] new_part_id Partition id in new table. - @param[in] part_elem Partition element. - @return 0 for success else error code. */ - int - create_new_partition( - TABLE* table, - HA_CREATE_INFO* create_info, - const char* part_name, - uint new_part_id, - partition_element* part_elem); - - /** Close and finalize new partitions. */ - void - close_new_partitions(); - - /** write row to new partition. - @param[in] new_part New partition to write to. - @return 0 for success else error code. */ - int - write_row_in_new_part( - uint new_part); - - /** Write a row in specific partition. - Stores a row in an InnoDB database, to the table specified in this - handle. - @param[in] part_id Partition to write to. - @param[in] row A row in MySQL format. - @return error code. */ - int - write_row_in_part( - uint part_id, - uchar* row); - - /** Update a row in partition. - Updates a row given as a parameter to a new value. - @param[in] part_id Partition to update row in. - @param[in] old_row Old row in MySQL format. - @param[in] new_row New row in MySQL format. - @return error number or 0. */ - int - update_row_in_part( - uint part_id, - const uchar* old_row, - uchar* new_row); - - /** Deletes a row in partition. - @param[in] part_id Partition to delete from. - @param[in] row Row to delete in MySQL format. - @return error number or 0. */ - int - delete_row_in_part( - uint part_id, - const uchar* row); - - /** Return first record in index from a partition. - @param[in] part Partition to read from. - @param[out] record First record in index in the partition. - @return error number or 0. */ - int - index_first_in_part( - uint part, - uchar* record); - - /** Return last record in index from a partition. - @param[in] part Partition to read from. - @param[out] record Last record in index in the partition. - @return error number or 0. */ - int - index_last_in_part( - uint part, - uchar* record); - - /** Return previous record in index from a partition. - @param[in] part Partition to read from. - @param[out] record Last record in index in the partition. - @return error number or 0. */ - int - index_prev_in_part( - uint part, - uchar* record); - - /** Return next record in index from a partition. - @param[in] part Partition to read from. - @param[out] record Last record in index in the partition. - @return error number or 0. */ - int - index_next_in_part( - uint part, - uchar* record); - - /** Return next same record in index from a partition. - This routine is used to read the next record, but only if the key is - the same as supplied in the call. - @param[in] part Partition to read from. - @param[out] record Last record in index in the partition. - @param[in] key Key to match. - @param[in] length Length of key. - @return error number or 0. */ - int - index_next_same_in_part( - uint part, - uchar* record, - const uchar* key, - uint length); - - /** Start index scan and return first record from a partition. - This routine starts an index scan using a start key. The calling - function will check the end key on its own. - @param[in] part Partition to read from. - @param[out] record First matching record in index in the partition. - @param[in] key Key to match. - @param[in] keypart_map Which part of the key to use. - @param[in] find_flag Key condition/direction to use. - @return error number or 0. */ - int - index_read_map_in_part( - uint part, - uchar* record, - const uchar* key, - key_part_map keypart_map, - enum ha_rkey_function find_flag); - - /** Return last matching record in index from a partition. - @param[in] part Partition to read from. - @param[out] record Last matching record in index in the partition. - @param[in] key Key to match. - @param[in] keypart_map Which part of the key to use. - @return error number or 0. */ - int - index_read_last_map_in_part( - uint part, - uchar* record, - const uchar* key, - key_part_map keypart_map); - - /** Start index scan and return first record from a partition. - This routine starts an index scan using a start and end key. - @param[in] part Partition to read from. - @param[out] record First matching record in index in the partition. - if NULL use table->record[0] as return buffer. - @param[in] start_key Start key to match. - @param[in] end_key End key to match. - @param[in] eq_range Is equal range, start_key == end_key. - @param[in] sorted Return rows in sorted order. - @return error number or 0. */ - int - read_range_first_in_part( - uint part, - uchar* record, - const key_range* start_key, - const key_range* end_key, - bool eq_range, - bool sorted); - - /** Return next record in index range scan from a partition. - @param[in] part Partition to read from. - @param[out] record First matching record in index in the partition. - if NULL use table->record[0] as return buffer. - @return error number or 0. */ - int - read_range_next_in_part( - uint part, - uchar* record); - - /** Start index scan and return first record from a partition. - This routine starts an index scan using a start key. The calling - function will check the end key on its own. - @param[in] part Partition to read from. - @param[out] record First matching record in index in the partition. - @param[in] index Index to read from. - @param[in] key Key to match. - @param[in] keypart_map Which part of the key to use. - @param[in] find_flag Key condition/direction to use. - @return error number or 0. */ - int - index_read_idx_map_in_part( - uint part, - uchar* record, - uint index, - const uchar* key, - key_part_map keypart_map, - enum ha_rkey_function find_flag); - - /** Initialize random read/scan of a specific partition. - @param[in] part_id Partition to initialize. - @param[in] table_scan True for scan else random access. - @return error number or 0. */ - int - rnd_init_in_part( - uint part_id, - bool table_scan); - - /** Get next row during scan of a specific partition. - @param[in] part_id Partition to read from. - @param[out] record Next row. - @return error number or 0. */ - int - rnd_next_in_part( - uint part_id, - uchar* record); - - /** End random read/scan of a specific partition. - @param[in] part_id Partition to end random read/scan. - @param[in] table_scan True for scan else random access. - @return error number or 0. */ - int - rnd_end_in_part( - uint part_id, - bool table_scan); - - /** Get a reference to the current cursor position in the last used - partition. - @param[out] ref Reference (PK if exists else row_id). - @param[in] record Record to position. */ - void - position_in_last_part( - uchar* ref, - const uchar* record); - - /** Read record by given record (by its PK) from the last used partition. - see handler::rnd_pos_by_record(). - @param[in,out] record Record to position. - @return 0 or error number. */ - int - rnd_pos_by_record_in_last_part( - uchar* record) - { - /* Not much overhead to use default function. - This avoids out-of-sync code. */ - return(handler::rnd_pos_by_record(record)); - } - - /** Copy a cached MySQL record. - @param[out] to_record Where to copy the MySQL record. - @param[in] from_record Which record to copy. */ - void - copy_cached_row( - uchar* to_record, - const uchar* from_record); - /** @} */ - - /* Private handler:: functions specific for native InnoDB partitioning. - @see handler.h @{ */ - - int - open( - const char* name, - int mode, - uint test_if_locked); - - int - close(); - - double - scan_time(); - - /** Was the last returned row semi consistent read. - In an UPDATE or DELETE, if the row under the cursor was locked by - another transaction, and the engine used an optimistic read of the last - committed row value under the cursor, then the engine returns 1 from - this function. MySQL must NOT try to update this optimistic value. If - the optimistic value does not match the WHERE condition, MySQL can - decide to skip over this row. This can be used to avoid unnecessary - lock waits. - - If this method returns true, it will also signal the storage - engine that the next read will be a locking re-read of the row. - @see handler.h and row0mysql.h - @return true if last read was semi consistent else false. */ - bool was_semi_consistent_read(); - - /** Try semi consistent read. - Tell the engine whether it should avoid unnecessary lock waits. - If yes, in an UPDATE or DELETE, if the row under the cursor was locked - by another transaction, the engine may try an optimistic read of - the last committed row value under the cursor. - @see handler.h and row0mysql.h - @param[in] yes Should semi-consistent read be used. */ - void try_semi_consistent_read( - bool yes); - - /** Removes a lock on a row. - Removes a new lock set on a row, if it was not read optimistically. - This can be called after a row has been read in the processing of - an UPDATE or a DELETE query. @see ha_innobase::unlock_row(). */ - void unlock_row(); - - int - index_init( - uint index, - bool sorted); - - int - index_end(); - - int - rnd_init( - bool scan) - { - return(Partition_helper::ph_rnd_init(scan)); - } - - int - rnd_end() - { - return(Partition_helper::ph_rnd_end()); - } - - int - external_lock( - THD* thd, - int lock_type); - - THR_LOCK_DATA** - store_lock( - THD* thd, - THR_LOCK_DATA** to, - thr_lock_type lock_type); - - int - write_row( - uchar* record) - { - return(Partition_helper::ph_write_row(record)); - } - - int - update_row( - const uchar* old_record, - uchar* new_record) - { - return(Partition_helper::ph_update_row(old_record, new_record)); - } - - int - delete_row( - const uchar* record) - { - return(Partition_helper::ph_delete_row(record)); - } - /** @} */ - - /** Truncate partition. - Called from Partition_handler::trunctate_partition(). */ - int - truncate_partition_low(); - - /** Change partitions according to ALTER TABLE ... PARTITION ... - Called from Partition_handler::change_partitions(). - @param[in] create_info Table create info. - @param[in] path Path including db/table_name. - @param[out] copied Number of copied rows. - @param[out] deleted Number of deleted rows. - @return 0 for success or error code. */ - int - change_partitions_low( - HA_CREATE_INFO* create_info, - const char* path, - ulonglong* const copied, - ulonglong* const deleted) - { - return(Partition_helper::change_partitions( - create_info, - path, - copied, - deleted)); - } - - /** Access methods to protected areas in handler to avoid adding - friend class Partition_helper in class handler. - @see partition_handler.h @{ */ - - THD* - get_thd() const - { - return ha_thd(); - } - - TABLE* - get_table() const - { - return table; - } - - bool - get_eq_range() const - { - return eq_range; - } - - void - set_eq_range(bool eq_range_arg) - { - eq_range= eq_range_arg; - } - - void - set_range_key_part(KEY_PART_INFO *key_part) - { - range_key_part= key_part; - } - /** @} */ - - /** Fill in data_dir_path and tablespace name from internal data - dictionary. - @param part_elem Partition element to fill. - @param ib_table InnoDB table to copy from. */ - void - update_part_elem( - partition_element* part_elem, - dict_table_t* ib_table); -protected: - /* Protected handler:: functions specific for native InnoDB partitioning. - @see handler.h @{ */ - - int - rnd_next( - uchar* record) - { - return(Partition_helper::ph_rnd_next(record)); - } - - int - rnd_pos( - uchar* record, - uchar* pos); - - int - index_next( - uchar* record) - { - return(Partition_helper::ph_index_next(record)); - } - - int - index_next_same( - uchar* record, - const uchar* key, - uint keylen) - { - return(Partition_helper::ph_index_next_same(record, key, keylen)); - } - - int - index_prev( - uchar* record) - { - return(Partition_helper::ph_index_prev(record)); - } - - int - index_first( - uchar* record) - { - return(Partition_helper::ph_index_first(record)); - } - - int - index_last( - uchar* record) - { - return(Partition_helper::ph_index_last(record)); - } - - int - index_read_last_map( - uchar* record, - const uchar* key, - key_part_map keypart_map) - { - return(Partition_helper::ph_index_read_last_map( - record, - key, - keypart_map)); - } - - int - index_read_map( - uchar* buf, - const uchar* key, - key_part_map keypart_map, - enum ha_rkey_function find_flag) - { - return(Partition_helper::ph_index_read_map( - buf, - key, - keypart_map, - find_flag)); - } - - int - index_read_idx_map( - uchar* buf, - uint index, - const uchar* key, - key_part_map keypart_map, - enum ha_rkey_function find_flag) - { - return(Partition_helper::ph_index_read_idx_map( - buf, - index, - key, - keypart_map, - find_flag)); - } - /** @} */ - - /** Updates and return statistics. - Returns statistics information of the table to the MySQL interpreter, - in various fields of the handle object. - @param[in] flag Flags for what to update and return. - @param[in] is_analyze True if called from ::analyze(). - @return HA_ERR_* error code or 0. */ - int - info_low( - uint flag, - bool is_analyze); -}; -#endif /* ha_innopart_h */ diff --git a/storage/innobase/handler/ha_xtradb.h b/storage/innobase/handler/ha_xtradb.h new file mode 100644 index 00000000000..09628b7ec48 --- /dev/null +++ b/storage/innobase/handler/ha_xtradb.h @@ -0,0 +1,1007 @@ +/***************************************************************************** + +Copyright (c) 2000, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. +Copyright (c) 2009, Percona Inc. + +Portions of this file contain modifications contributed and copyrighted +by Percona Inc.. Those modifications are +gratefully acknowledged and are described briefly in the InnoDB +documentation. The contributions by Percona Inc. are incorporated with +their permission, and subject to the conditions contained in the file +COPYING.Percona. + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA + +*****************************************************************************/ + +/** @file ha_xtradb.h */ + +#ifndef HA_XTRADB_H +#define HA_XTRADB_H + +static +void +innodb_print_deprecation(const char* param); + +/* XtraDB compatibility system variables. Note that default value and +minimum value can be different compared to original to detect has user +really used the parameter or not. */ + +static my_bool innodb_buffer_pool_populate; +#if defined UNIV_DEBUG || defined UNIV_PERF_DEBUG +static ulong srv_cleaner_max_lru_time; +static ulong srv_cleaner_max_flush_time; +static ulong srv_cleaner_flush_chunk_size; +static ulong srv_cleaner_lru_chunk_size; +static ulong srv_cleaner_free_list_lwm; +static my_bool srv_cleaner_eviction_factor; +#endif /* defined UNIV_DEBUG || defined UNIV_PERF_DEBUG */ +static ulong srv_pass_corrupt_table; +static ulong srv_empty_free_list_algorithm; +static ulong innobase_file_io_threads; +static ulong srv_foreground_preflush; +static longlong srv_kill_idle_transaction; +static my_bool srv_fake_changes_locks; +static my_bool innobase_log_archive; +static char* innobase_log_arch_dir = NULL; +static ulong srv_log_arch_expire_sec; +static ulong innobase_log_block_size; +static ulong srv_log_checksum_algorithm; +static ulonglong srv_max_bitmap_file_size; +static ulonglong srv_max_changed_pages; +static ulong innobase_mirrored_log_groups; +#ifdef UNIV_LINUX +static ulong srv_sched_priority_cleaner; +#if defined UNIV_DEBUG || defined UNIV_PERF_DEBUG +static my_bool srv_cleaner_thread_priority; +static my_bool srv_io_thread_priority; +static my_bool srv_master_thread_priority; +static my_bool srv_purge_thread_priority; +static ulong srv_sched_priority_io; +static ulong srv_sched_priority_master; +static ulong srv_sched_priority_purge; +#endif /* UNIV_DEBUG || UNIV_PERF_DEBUG */ +#endif /* UNIV_LINUX */ +static ulong srv_cleaner_lsn_age_factor; +static ulong srv_show_locks_held; +static ulong srv_show_verbose_locks; +static my_bool srv_track_changed_pages; +static my_bool innodb_track_redo_log_now; +static my_bool srv_use_global_flush_log_at_trx_commit; +static my_bool srv_use_stacktrace; + + +static const char innodb_deprecated_msg[]= "Using %s is deprecated and the" + " parameter may be removed in future releases." + " Ignoning the parameter."; + + +#ifdef BTR_CUR_HASH_ADAPT +/* it is just alias for innodb_adaptive_hash_index_parts */ +/** Number of distinct partitions of AHI. +Each partition is protected by its own latch and so we have parts number +of latches protecting complete search system. */ +static MYSQL_SYSVAR_ULONG(adaptive_hash_index_partitions, btr_ahi_parts, + PLUGIN_VAR_OPCMDARG | PLUGIN_VAR_READONLY, + "It is an alias for innodb_adaptive_hash_index_parts; " + "only exists to allow easier upgrade from earlier XtraDB versions.", + NULL, NULL, 8, 1, 512, 0); +#endif /* BTR_CUR_HASH_ADAPT */ + +static MYSQL_SYSVAR_BOOL(buffer_pool_populate, innodb_buffer_pool_populate, + PLUGIN_VAR_NOCMDARG | PLUGIN_VAR_READONLY, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, NULL, FALSE); + +#if defined UNIV_DEBUG || defined UNIV_PERF_DEBUG +static +void +set_cleaner_max_lru_time(THD*thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_cleaner_max_lru_time"); +} +/* Original default 1000 */ +static MYSQL_SYSVAR_ULONG(cleaner_max_lru_time, srv_cleaner_max_lru_time, + PLUGIN_VAR_RQCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, set_cleaner_max_lru_time, 0, 0, ~0UL, 0); + +static +void +set_cleaner_max_flush_time(THD*thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_cleaner_max_flush_time"); +} +/* Original default 1000 */ +static MYSQL_SYSVAR_ULONG(cleaner_max_flush_time, srv_cleaner_max_flush_time, + PLUGIN_VAR_RQCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_cleaner_max_flush_time, 0, 0, ~0UL, 0); + +static +void +set_cleaner_flush_chunk_size(THD*thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_cleaner_flush_chunk_size"); +} +/* Original default 100 */ +static MYSQL_SYSVAR_ULONG(cleaner_flush_chunk_size, + srv_cleaner_flush_chunk_size, + PLUGIN_VAR_RQCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_cleaner_flush_chunk_size, 0, 0, ~0UL, 0); + +static +void +set_cleaner_lru_chunk_size(THD*thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_cleaner_lru_chunk_size"); +} +/* Original default 100 */ +static MYSQL_SYSVAR_ULONG(cleaner_lru_chunk_size, + srv_cleaner_lru_chunk_size, + PLUGIN_VAR_RQCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_cleaner_lru_chunk_size, 0, 0, ~0UL, 0); + +static +void +set_cleaner_free_list_lwm(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_cleaner_free_list_lwm"); +} +/* Original default 10 */ +static MYSQL_SYSVAR_ULONG(cleaner_free_list_lwm, srv_cleaner_free_list_lwm, + PLUGIN_VAR_RQCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_cleaner_free_list_lwm, 0, 0, 100, 0); + +static +void +set_cleaner_eviction_factor(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_cleaner_eviction_factor"); +} +static MYSQL_SYSVAR_BOOL(cleaner_eviction_factor, srv_cleaner_eviction_factor, + PLUGIN_VAR_OPCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_cleaner_eviction_factor, FALSE); + +#endif /* defined UNIV_DEBUG || defined UNIV_PERF_DEBUG */ + +/* Added new default DEPRECATED */ +/** Possible values for system variable "innodb_cleaner_lsn_age_factor". */ +static const char* innodb_cleaner_lsn_age_factor_names[] = { + "LEGACY", + "HIGH_CHECKPOINT", + "DEPRECATED", + NullS +}; + +/** Enumeration for innodb_cleaner_lsn_age_factor. */ +static TYPELIB innodb_cleaner_lsn_age_factor_typelib = { + array_elements(innodb_cleaner_lsn_age_factor_names) - 1, + "innodb_cleaner_lsn_age_factor_typelib", + innodb_cleaner_lsn_age_factor_names, + NULL +}; + +/** Alternatives for srv_cleaner_lsn_age_factor, set through +innodb_cleaner_lsn_age_factor variable */ +enum srv_cleaner_lsn_age_factor_t { + SRV_CLEANER_LSN_AGE_FACTOR_LEGACY, /*!< Original Oracle MySQL 5.6 + formula */ + SRV_CLEANER_LSN_AGE_FACTOR_HIGH_CHECKPOINT, + /*!< Percona Server 5.6 formula + that returns lower values than + legacy option for low + checkpoint ages, and higher + values for high ages. This has + the effect of stabilizing the + checkpoint age higher. */ + SRV_CLEANER_LSN_AGE_FACTOR_DEPRECATED /*!< Deprecated, do not use */ +}; + +/** Alternatives for srv_foreground_preflush, set through +innodb_foreground_preflush variable */ +enum srv_foreground_preflush_t { + SRV_FOREGROUND_PREFLUSH_SYNC_PREFLUSH, /*!< Original Oracle MySQL 5.6 + behavior of performing a sync + flush list flush */ + SRV_FOREGROUND_PREFLUSH_EXP_BACKOFF, /*!< Exponential backoff wait + for the page cleaner to flush + for us */ + SRV_FOREGROUND_PREFLUSH_DEPRECATED /*!< Deprecated, do not use */ +}; + +/** Alternatives for srv_empty_free_list_algorithm, set through +innodb_empty_free_list_algorithm variable */ +enum srv_empty_free_list_t { + SRV_EMPTY_FREE_LIST_LEGACY, /*!< Original Oracle MySQL 5.6 + algorithm */ + SRV_EMPTY_FREE_LIST_BACKOFF, /*!< Percona Server 5.6 algorithm that + loops in a progressive backoff until a + free page is produced by the cleaner + thread */ + SRV_EMPTY_FREE_LIST_DEPRECATED /*!< Deprecated, do not use */ +}; + +#define SRV_CHECKSUM_ALGORITHM_DEPRECATED 6 + +static +void +set_cleaner_lsn_age_factor(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_cleaner_lsn_age_factor"); +} +static MYSQL_SYSVAR_ENUM(cleaner_lsn_age_factor, + srv_cleaner_lsn_age_factor, + PLUGIN_VAR_OPCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_cleaner_lsn_age_factor, SRV_CLEANER_LSN_AGE_FACTOR_DEPRECATED, + &innodb_cleaner_lsn_age_factor_typelib); + +/* Added new default drepcated, 3 */ +const char *corrupt_table_action_names[]= +{ + "assert", /* 0 */ + "warn", /* 1 */ + "salvage", /* 2 */ + "deprecated", /* 3 */ + NullS +}; + +TYPELIB corrupt_table_action_typelib= +{ + array_elements(corrupt_table_action_names) - 1, "corrupt_table_action_typelib", + corrupt_table_action_names, NULL +}; + +static +void +set_corrupt_table_action(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_corrupt_table_action"); +} +static MYSQL_SYSVAR_ENUM(corrupt_table_action, srv_pass_corrupt_table, + PLUGIN_VAR_RQCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_corrupt_table_action, 3, &corrupt_table_action_typelib); + +/* Added new default DEPRECATED */ +/** Possible values for system variable "innodb_empty_free_list_algorithm". */ +static const char* innodb_empty_free_list_algorithm_names[] = { + "LEGACY", + "BACKOFF", + "DEPRECATED", + NullS +}; + +/** Enumeration for innodb_empty_free_list_algorithm. */ +static TYPELIB innodb_empty_free_list_algorithm_typelib = { + array_elements(innodb_empty_free_list_algorithm_names) - 1, + "innodb_empty_free_list_algorithm_typelib", + innodb_empty_free_list_algorithm_names, + NULL +}; + +static +void +set_empty_free_list_algorithm(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_empty_free_list_algorithm"); +} +static MYSQL_SYSVAR_ENUM(empty_free_list_algorithm, + srv_empty_free_list_algorithm, + PLUGIN_VAR_OPCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_empty_free_list_algorithm, SRV_EMPTY_FREE_LIST_DEPRECATED, + &innodb_empty_free_list_algorithm_typelib); + +static +void +set_fake_changes(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_fake_changes"); +} +static MYSQL_THDVAR_BOOL(fake_changes, PLUGIN_VAR_OPCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_fake_changes, FALSE); + +/* Original default, min 4. */ +static MYSQL_SYSVAR_ULONG(file_io_threads, innobase_file_io_threads, + PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY | PLUGIN_VAR_NOSYSVAR, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, NULL, 0, 0, 64, 0); + +/** Possible values for system variable "innodb_foreground_preflush". */ +static const char* innodb_foreground_preflush_names[] = { + "SYNC_PREFLUSH", + "EXPONENTIAL_BACKOFF", + "DEPRECATED", + NullS +}; + +/* Enumeration for innodb_foreground_preflush. */ +static TYPELIB innodb_foreground_preflush_typelib = { + array_elements(innodb_foreground_preflush_names) - 1, + "innodb_foreground_preflush_typelib", + innodb_foreground_preflush_names, + NULL +}; + +static +void +set_foreground_preflush(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_foreground_preflush"); +} +static MYSQL_SYSVAR_ENUM(foreground_preflush, srv_foreground_preflush, + PLUGIN_VAR_OPCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_foreground_preflush, SRV_FOREGROUND_PREFLUSH_DEPRECATED, + &innodb_foreground_preflush_typelib); + +#ifdef EXTENDED_FOR_KILLIDLE +#define kill_idle_help_text "If non-zero value, the idle session with transaction which is idle over the value in seconds is killed by InnoDB." +#else +#define kill_idle_help_text "No effect for this build." +#endif +static +void +set_kill_idle_transaction(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_kill_idle_transaction"); +} +static MYSQL_SYSVAR_LONGLONG(kill_idle_transaction, srv_kill_idle_transaction, + PLUGIN_VAR_RQCMDARG, kill_idle_help_text, + NULL, &set_kill_idle_transaction, 0, 0, LONG_MAX, 0); + +static +void +set_locking_fake_changes(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_locking_fake_changes"); +} +/* Original default: TRUE */ +static MYSQL_SYSVAR_BOOL(locking_fake_changes, srv_fake_changes_locks, + PLUGIN_VAR_NOCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_locking_fake_changes, FALSE); + +static MYSQL_SYSVAR_STR(log_arch_dir, innobase_log_arch_dir, + PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, NULL, NULL); + +static +void +set_log_archive(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_log_archive"); +} +static MYSQL_SYSVAR_BOOL(log_archive, innobase_log_archive, + PLUGIN_VAR_OPCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_log_archive, FALSE); + +static +void +set_log_arch_expire_sec(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_log_arch_expire_sec"); +} +static MYSQL_SYSVAR_ULONG(log_arch_expire_sec, + srv_log_arch_expire_sec, PLUGIN_VAR_OPCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_log_arch_expire_sec, 0, 0, ~0UL, 0); + +/* Original default, min 512 */ +static MYSQL_SYSVAR_ULONG(log_block_size, innobase_log_block_size, + PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, NULL, 0, 0, + (1 << UNIV_PAGE_SIZE_SHIFT_MAX), 0); + +/* Added new default deprecated */ +/** Possible values for system variables "innodb_checksum_algorithm" and +"innodb_log_checksum_algorithm". */ +static const char* innodb_checksum_algorithm_names2[] = { + "CRC32", + "STRICT_CRC32", + "INNODB", + "STRICT_INNODB", + "NONE", + "STRICT_NONE", + "DEPRECATED", + NullS +}; + +/** Used to define an enumerate type of the system variables +innodb_checksum_algorithm and innodb_log_checksum_algorithm. */ +static TYPELIB innodb_checksum_algorithm_typelib2 = { + array_elements(innodb_checksum_algorithm_names2) - 1, + "innodb_checksum_algorithm_typelib2", + innodb_checksum_algorithm_names2, + NULL +}; +static +void +set_log_checksum_algorithm(THD* thd, st_mysql_sys_var*, void*, const void* save) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_log_checksum_algorithm"); + log_mutex_enter(); + srv_log_checksum_algorithm = *static_cast(save); + if (srv_log_checksum_algorithm == SRV_CHECKSUM_ALGORITHM_NONE) { + ib::info() << "Setting innodb_log_checksums = false"; + innodb_log_checksums = false; + log_checksum_algorithm_ptr = log_block_calc_checksum_none; + } else { + ib::info() << "Setting innodb_log_checksums = true"; + innodb_log_checksums = true; + log_checksum_algorithm_ptr = log_block_calc_checksum_crc32; + } + log_mutex_exit(); +} +static MYSQL_SYSVAR_ENUM(log_checksum_algorithm, srv_log_checksum_algorithm, + PLUGIN_VAR_RQCMDARG, + "Deprecated and translated to innodb_log_checksums (NONE to OFF, " + "everything else to ON); only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_log_checksum_algorithm, SRV_CHECKSUM_ALGORITHM_DEPRECATED, + &innodb_checksum_algorithm_typelib2); + +static +void +set_max_bitmap_file_size(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_max_bitmap_file_size"); +} +/* Original default 100M, min 4K */ +static MYSQL_SYSVAR_ULONGLONG(max_bitmap_file_size, srv_max_bitmap_file_size, + PLUGIN_VAR_RQCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_max_bitmap_file_size, 0, 0, ULONGLONG_MAX, 0); + +static +void +set_max_changed_pages(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_max_changed_pages"); +} +/* Original default 1000000 */ +static MYSQL_SYSVAR_ULONGLONG(max_changed_pages, srv_max_changed_pages, + PLUGIN_VAR_RQCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_max_changed_pages, 0, 0, ~0ULL, 0); + +/* Note that the default and minimum values are set to 0 to +detect if the option is passed and print deprecation message */ +static MYSQL_SYSVAR_ULONG(mirrored_log_groups, innobase_mirrored_log_groups, + PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, NULL, 0, 0, 10, 0); + +#ifdef UNIV_LINUX + +static +void +set_sched_priority_cleaner(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_sched_priority_cleaner"); +} +/* Original default 19 */ +static MYSQL_SYSVAR_ULONG(sched_priority_cleaner, srv_sched_priority_cleaner, + PLUGIN_VAR_RQCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_sched_priority_cleaner, 0, 0, 39, 0); + +#if defined UNIV_DEBUG || defined UNIV_PERF_DEBUG +static +void +set_priority_cleaner(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_priority_cleaner"); +} +static MYSQL_SYSVAR_BOOL(priority_cleaner, srv_cleaner_thread_priority, + PLUGIN_VAR_OPCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_priority_cleaner, FALSE); + +static +void +set_priority_io(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_priority_io"); +} +static MYSQL_SYSVAR_BOOL(priority_io, srv_io_thread_priority, + PLUGIN_VAR_OPCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_priority_io, FALSE); + +static +void +set_priority_master(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_priority_master"); +} +static MYSQL_SYSVAR_BOOL(priority_master, srv_master_thread_priority, + PLUGIN_VAR_OPCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_priority_master, FALSE); + +static +void +set_priority_purge(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_priority_purge"); +} +static MYSQL_SYSVAR_BOOL(priority_purge, srv_purge_thread_priority, + PLUGIN_VAR_OPCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_priority_purge, FALSE); + +static +void +set_sched_priority_io(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_sched_priority_io"); +} +/* Original default 19 */ +static MYSQL_SYSVAR_ULONG(sched_priority_io, srv_sched_priority_io, + PLUGIN_VAR_RQCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_sched_priority_io, 0, 0, 39, 0); + +static +void +set_sched_priority_master(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_sched_priority_master"); +} +/* Original default 19 */ +static MYSQL_SYSVAR_ULONG(sched_priority_master, srv_sched_priority_master, + PLUGIN_VAR_RQCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_sched_priority_master, 0, 0, 39, 0); + +static +void +set_sched_priority_purge(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_sched_priority_purge"); +} +/* Original default 19 */ +static MYSQL_SYSVAR_ULONG(sched_priority_purge, srv_sched_priority_purge, + PLUGIN_VAR_RQCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_sched_priority_purge, 0, 0, 39, 0); +#endif /* UNIV_DEBUG || UNIV_PERF_DEBUG */ +#endif /* UNIV_LINUX */ + +static +void +set_show_locks_held(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_show_locks_held"); +} +/* TODO: Implement */ +static MYSQL_SYSVAR_ULONG(show_locks_held, srv_show_locks_held, + PLUGIN_VAR_RQCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_show_locks_held, 0, 0, 1000, 0); + +static +void +set_show_verbose_locks(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_show_verbose_locks"); +} +/* TODO: Implement */ +static MYSQL_SYSVAR_ULONG(show_verbose_locks, srv_show_verbose_locks, + PLUGIN_VAR_RQCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_show_verbose_locks, 0, 0, 1, 0); + +static MYSQL_SYSVAR_BOOL(track_changed_pages, srv_track_changed_pages, + PLUGIN_VAR_NOCMDARG | PLUGIN_VAR_READONLY, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, NULL, FALSE); + +static +void +set_track_redo_log_now(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_track_redo_log_now"); +} +static MYSQL_SYSVAR_BOOL(track_redo_log_now, + innodb_track_redo_log_now, + PLUGIN_VAR_OPCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_track_redo_log_now, FALSE); + +static +void +set_use_global_flush_log_at_trx_commit(THD* thd, st_mysql_sys_var*, void*, const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + innodb_deprecated_msg, + "innodb_use_global_flush_log_at_trx_commit"); +} +static MYSQL_SYSVAR_BOOL(use_global_flush_log_at_trx_commit, srv_use_global_flush_log_at_trx_commit, + PLUGIN_VAR_NOCMDARG, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, &set_use_global_flush_log_at_trx_commit, FALSE); + +static MYSQL_SYSVAR_BOOL(use_stacktrace, srv_use_stacktrace, + PLUGIN_VAR_NOCMDARG | PLUGIN_VAR_READONLY, + "Deprecated and ignored; only exists to allow easier upgrade from " + "earlier XtraDB versions.", + NULL, NULL, FALSE); + +/** Print deprecation message for a given system variable. +@param[in] param System parameter name */ +static +void +innodb_print_deprecation(const char* param) +{ + ib::warn() << "Using " << param << " is deprecated and the" + " parameter may be removed in future releases." + " Ignoning the parameter."; +} + +/** Check if user has used xtradb extended system variable that +is not currently supported by innodb or marked as deprecated. */ +static +void +innodb_check_deprecated(void) +{ + if (innodb_buffer_pool_populate) { + innodb_print_deprecation("innodb-buffer-pool-populate"); + } + +#if defined UNIV_DEBUG || defined UNIV_PERF_DEBUG + if (srv_cleaner_max_lru_time) { + innodb_print_deprecation("innodb-cleaner-max-lru-time"); + } + + if (srv_cleaner_max_flush_time) { + innodb_print_deprecation("innodb-cleaner-max-flush-time"); + } + + if (srv_cleaner_flush_chunk_size) { + innodb_print_deprecation("innodb-cleaner-flush-chunk-size"); + } + + if (srv_cleaner_lru_chunk_size) { + innodb_print_deprecation("innodb-cleaner-lru_chunk_size"); + } + if (srv_cleaner_free_list_lwm) { + innodb_print_deprecation("innodb-cleaner-free-list-lwm"); + } + + if (srv_cleaner_eviction_factor) { + innodb_print_deprecation("innodb-cleaner-eviction-factor"); + } + +#endif /* defined UNIV_DEBUG || defined UNIV_PERF_DEBUG */ + + if (srv_cleaner_lsn_age_factor != SRV_CLEANER_LSN_AGE_FACTOR_DEPRECATED) { + innodb_print_deprecation("innodb-cleaner-lsn-age-factor"); + } + + if (srv_pass_corrupt_table != 3) { + innodb_print_deprecation("innodb-pass-corrupt-table"); + } + + if (srv_empty_free_list_algorithm != SRV_EMPTY_FREE_LIST_DEPRECATED) { + innodb_print_deprecation("innodb-empty-free-list-algorithm"); + } + + if (THDVAR((THD*) NULL, fake_changes)) { + innodb_print_deprecation("innodb-fake-changes"); + } + + if (innobase_file_io_threads) { + innodb_print_deprecation("innodb-file-io-threads"); + } + + if (srv_foreground_preflush != SRV_FOREGROUND_PREFLUSH_DEPRECATED) { + innodb_print_deprecation("innodb-foreground-preflush"); + } + + if (srv_kill_idle_transaction != 0) { + innodb_print_deprecation("innodb-kill-idle-transaction"); + } + + if (srv_fake_changes_locks) { + innodb_print_deprecation("innodb-fake-changes-locks"); + } + + if (innobase_log_arch_dir) { + innodb_print_deprecation("innodb-log-arch-dir"); + } + + if (innobase_log_archive) { + innodb_print_deprecation("innodb-log-archive"); + } + + if (srv_log_arch_expire_sec) { + innodb_print_deprecation("innodb-log-arch-expire-sec"); + } + + if (innobase_log_block_size) { + innodb_print_deprecation("innodb-log-block-size"); + } + + if (srv_log_checksum_algorithm != SRV_CHECKSUM_ALGORITHM_DEPRECATED) { + innodb_print_deprecation("innodb-log-checksum-algorithm"); + if (srv_log_checksum_algorithm == SRV_CHECKSUM_ALGORITHM_NONE) { + ib::info() << "Setting innodb_log_checksums = false"; + innodb_log_checksums = false; + log_checksum_algorithm_ptr = log_block_calc_checksum_none; + } else { + ib::info() << "Setting innodb_log_checksums = true"; + innodb_log_checksums = true; + log_checksum_algorithm_ptr = log_block_calc_checksum_crc32; + } + } + + if (srv_max_changed_pages) { + innodb_print_deprecation("innodb-max-changed-pages"); + } + + if (innobase_mirrored_log_groups) { + innodb_print_deprecation("innodb-mirrored-log-groups"); + } + +#ifdef UNIV_LINUX + if (srv_sched_priority_cleaner) { + innodb_print_deprecation("innodb-sched-priority-cleaner"); + } + +#if defined UNIV_DEBUG || defined UNIV_PERF_DEBUG + if (srv_cleaner_thread_priority) { + innodb_print_deprecation("innodb-cleaner-thread-priority"); + } + + if (srv_io_thread_priority) { + innodb_print_deprecation("innodb-io-thread-priority"); + } + + if (srv_master_thread_priority) { + innodb_print_deprecation("inodb-master-thread-priority"); + } + + if (srv_purge_thread_priority) { + innodb_print_deprecation("inodb-purge-thread-priority"); + } + + if (srv_sched_priority_io) { + innodb_print_deprecation("innodb-sched-priority-io"); + } + + if (srv_sched_priority_master) { + innodb_print_deprecation("innodb-sched-priority-master"); + } + + if (srv_sched_priority_purge) { + innodb_print_deprecation("innodb-sched-priority-purge"); + } +#endif /* defined UNIV_DEBUG || defined UNIV_PERF_DEBUG */ +#endif /* UNIV_LINUX */ + + if (srv_track_changed_pages) { + innodb_print_deprecation("innodb-track-changed-pages"); + } + + if (innodb_track_redo_log_now) { + innodb_print_deprecation("innodb-track-redo-log-now"); + } + + if (srv_use_global_flush_log_at_trx_commit) { + innodb_print_deprecation("innodb-use-global-flush-log-at-trx-commit"); + } + + if (srv_use_stacktrace) { + innodb_print_deprecation("innodb-use-stacktrace"); + } + + if (srv_max_bitmap_file_size) { + innodb_print_deprecation("innodb-max-bitmap-file-size"); + } + + if (srv_show_locks_held) { + innodb_print_deprecation("innodb-show-locks-held"); + } + + if (srv_show_verbose_locks) { + innodb_print_deprecation("innodb-show-verbose-locks"); + } +} + +#endif /* HA_XTRADB_H */ + +#ifdef HA_XTRADB_SYSVARS + /* XtraDB compatibility system variables */ + MYSQL_SYSVAR(adaptive_hash_index_partitions), + MYSQL_SYSVAR(buffer_pool_populate), +#if defined UNIV_DEBUG || defined UNIV_PERF_DEBUG + MYSQL_SYSVAR(cleaner_eviction_factor), + MYSQL_SYSVAR(cleaner_flush_chunk_size), + MYSQL_SYSVAR(cleaner_free_list_lwm), + MYSQL_SYSVAR(cleaner_lru_chunk_size), + MYSQL_SYSVAR(cleaner_max_lru_time), + MYSQL_SYSVAR(cleaner_max_flush_time), +#endif /* defined UNIV_DEBUG || defined UNIV_PERF_DEBUG */ + MYSQL_SYSVAR(cleaner_lsn_age_factor), + MYSQL_SYSVAR(corrupt_table_action), + MYSQL_SYSVAR(empty_free_list_algorithm), + MYSQL_SYSVAR(fake_changes), + MYSQL_SYSVAR(file_io_threads), + MYSQL_SYSVAR(foreground_preflush), + MYSQL_SYSVAR(kill_idle_transaction), + MYSQL_SYSVAR(locking_fake_changes), + MYSQL_SYSVAR(log_arch_dir), + MYSQL_SYSVAR(log_archive), + MYSQL_SYSVAR(log_arch_expire_sec), + MYSQL_SYSVAR(log_block_size), + MYSQL_SYSVAR(log_checksum_algorithm), + MYSQL_SYSVAR(max_bitmap_file_size), + MYSQL_SYSVAR(max_changed_pages), + MYSQL_SYSVAR(mirrored_log_groups), +#ifdef UNIV_LINUX + MYSQL_SYSVAR(sched_priority_cleaner), +#endif +#if defined UNIV_DEBUG || defined UNIV_PERF_DEBUG +#ifdef UNIV_LINUX + MYSQL_SYSVAR(priority_cleaner), + MYSQL_SYSVAR(priority_io), + MYSQL_SYSVAR(priority_master), + MYSQL_SYSVAR(priority_purge), + MYSQL_SYSVAR(sched_priority_io), + MYSQL_SYSVAR(sched_priority_master), + MYSQL_SYSVAR(sched_priority_purge), +#endif /* UNIV_LINUX */ +#endif /* defined UNIV_DEBUG || defined UNIV_PERF_DEBUG */ + MYSQL_SYSVAR(show_locks_held), + MYSQL_SYSVAR(show_verbose_locks), + MYSQL_SYSVAR(track_changed_pages), + MYSQL_SYSVAR(track_redo_log_now), + MYSQL_SYSVAR(use_global_flush_log_at_trx_commit), + MYSQL_SYSVAR(use_stacktrace), + +#endif /* HA_XTRADB_SYSVARS */ diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index 6f931d8d5a6..352b223ab69 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2005, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2017, MariaDB Corporation. All Rights Reserved. +Copyright (c) 2013, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -271,7 +271,7 @@ innobase_get_int_col_max_value( const Field* field); /*!< in: MySQL field */ /* Report an InnoDB error to the client by invoking my_error(). */ -static UNIV_COLD MY_ATTRIBUTE((nonnull)) +static ATTRIBUTE_COLD __attribute__((nonnull)) void my_error_innodb( /*============*/ @@ -320,14 +320,22 @@ my_error_innodb( case DB_CORRUPTION: my_error(ER_NOT_KEYFILE, MYF(0), table); break; - case DB_TOO_BIG_RECORD: - /* We limit max record size to 16k for 64k page size. */ - my_error(ER_TOO_BIG_ROWSIZE, MYF(0), - srv_page_size == UNIV_PAGE_SIZE_MAX - ? REC_MAX_DATA_SIZE - 1 - : page_get_free_space_of_empty( - flags & DICT_TF_COMPACT) / 2); + case DB_TOO_BIG_RECORD: { + /* Note that in page0zip.ic page_zip_rec_needs_ext() rec_size + is limited to COMPRESSED_REC_MAX_DATA_SIZE (16K) or + REDUNDANT_REC_MAX_DATA_SIZE (16K-1). */ + bool comp = !!(flags & DICT_TF_COMPACT); + ulint free_space = page_get_free_space_of_empty(comp) / 2; + + if (free_space >= (comp ? COMPRESSED_REC_MAX_DATA_SIZE : + REDUNDANT_REC_MAX_DATA_SIZE)) { + free_space = (comp ? COMPRESSED_REC_MAX_DATA_SIZE : + REDUNDANT_REC_MAX_DATA_SIZE) - 1; + } + + my_error(ER_TOO_BIG_ROWSIZE, MYF(0), free_space); break; + } case DB_INVALID_NULL: /* TODO: report the row, as we do for DB_DUPLICATE_KEY */ my_error(ER_INVALID_USE_OF_NULL, MYF(0)); @@ -591,7 +599,6 @@ ha_innobase::check_if_supported_inplace_alter( } update_thd(); - trx_assert_no_search_latch(m_prebuilt->trx); /* Change on engine specific table options require rebuild of the table */ @@ -682,7 +689,8 @@ ha_innobase::check_if_supported_inplace_alter( /* See if MYSQL table has no pk but we do. */ if (UNIV_UNLIKELY(my_primary_key >= MAX_KEY) - && !row_table_got_default_clust_index(m_prebuilt->table)) { + && !dict_index_is_auto_gen_clust( + dict_table_get_first_index(m_prebuilt->table))) { ha_alter_info->unsupported_reason = innobase_get_err_msg( ER_PRIMARY_CANT_HAVE_NULL); DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED); @@ -722,35 +730,6 @@ ha_innobase::check_if_supported_inplace_alter( } } - /* If we have column that has changed from NULL -> NOT NULL - and column default has changed we need to do additional - check. */ - if ((ha_alter_info->handler_flags - & Alter_inplace_info::ALTER_COLUMN_NOT_NULLABLE) && - (ha_alter_info->handler_flags - & Alter_inplace_info::ALTER_COLUMN_DEFAULT)) { - Alter_info *alter_info = ha_alter_info->alter_info; - List_iterator def_it(alter_info->create_list); - Create_field *def; - while ((def=def_it++)) { - - /* If this is first column definition whose SQL type - is TIMESTAMP and it is defined as NOT NULL and - it has either constant default or function default - we must use "Copy" method. */ - if (is_timestamp_type(def->sql_type)) { - if ((def->flags & NOT_NULL_FLAG) != 0 && // NOT NULL - (def->default_value != NULL || // constant default ? - def->unireg_check != Field::NONE)) { // function default - ha_alter_info->unsupported_reason = innobase_get_err_msg( - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL); - DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED); - } - break; - } - } - } - ulint n_indexes = UT_LIST_GET_LEN((m_prebuilt->table)->indexes); /* If InnoDB dictionary and MySQL frm file are not consistent @@ -794,8 +773,8 @@ ha_innobase::check_if_supported_inplace_alter( | Alter_inplace_info::DROP_INDEX); if (flags != 0 - || (altered_table->s->partition_info_str - && altered_table->s->partition_info_str_len) + || IF_PARTITIONING((altered_table->s->partition_info_str + && altered_table->s->partition_info_str_len), 0) || (!check_v_col_in_order( this->table, altered_table, ha_alter_info))) { ha_alter_info->unsupported_reason = @@ -1035,6 +1014,95 @@ ha_innobase::check_if_supported_inplace_alter( } } + /* When changing a NULL column to NOT NULL and specifying a + DEFAULT value, ensure that the DEFAULT expression is a constant. + Also, in ADD COLUMN, for now we only support a + constant DEFAULT expression. */ + cf_it.rewind(); + Field **af = altered_table->field; + + while (Create_field* cf = cf_it++) { + DBUG_ASSERT(cf->field + || (ha_alter_info->handler_flags + & Alter_inplace_info::ADD_COLUMN)); + + if (const Field* f = cf->field) { + /* This could be changing an existing column + from NULL to NOT NULL. */ + switch ((*af)->type()) { + case MYSQL_TYPE_TIMESTAMP: + case MYSQL_TYPE_TIMESTAMP2: + /* Inserting NULL into a TIMESTAMP column + would cause the DEFAULT value to be + replaced. Ensure that the DEFAULT + expression is not changing during + ALTER TABLE. */ + if (!f->real_maybe_null() + || (*af)->real_maybe_null()) { + /* The column was NOT NULL, or it + will allow NULL after ALTER TABLE. */ + goto next_column; + } + + if (!(*af)->default_value + && (*af)->is_real_null()) { + /* No DEFAULT value is + specified. We can report + errors for any NULL values for + the TIMESTAMP. + + FIXME: Allow any DEFAULT + expression whose value does + not change during ALTER TABLE. + This would require a fix in + row_merge_read_clustered_index() + to try to replace the DEFAULT + value before reporting + DB_INVALID_NULL. */ + goto next_column; + } + break; + default: + /* For any other data type, NULL + values are not converted. + (An AUTO_INCREMENT attribute cannot + be introduced to a column with + ALGORITHM=INPLACE.) */ + ut_ad((MTYP_TYPENR((*af)->unireg_check) + == Field::NEXT_NUMBER) + == (MTYP_TYPENR(f->unireg_check) + == Field::NEXT_NUMBER)); + goto next_column; + } + + ha_alter_info->unsupported_reason + = innobase_get_err_msg( + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL); + } else if (!(*af)->default_value + || !((*af)->default_value->flags + & ~(VCOL_SESSION_FUNC | VCOL_TIME_FUNC))) { + /* The added NOT NULL column lacks a DEFAULT value, + or the DEFAULT is the same for all rows. + (Time functions, such as CURRENT_TIMESTAMP(), + are evaluated from a timestamp that is assigned + at the start of the statement. Session + functions, such as USER(), always evaluate the + same within a statement.) */ + + /* Compute the DEFAULT values of non-constant columns + (VCOL_SESSION_FUNC | VCOL_TIME_FUNC). */ + (*af)->set_default(); + goto next_column; + } + + DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED); + +next_column: + af++; + } + + cf_it.rewind(); + DBUG_RETURN(online ? HA_ALTER_INPLACE_NO_LOCK_AFTER_PREPARE : HA_ALTER_INPLACE_SHARED_LOCK_AFTER_PREPARE); @@ -1701,7 +1769,6 @@ innobase_col_to_mysql( memcpy(dest, data, len); break; - case DATA_VAR_POINT: case DATA_GEOMETRY: case DATA_BLOB: /* Skip MySQL BLOBs when reporting an erroneous row @@ -1726,7 +1793,6 @@ innobase_col_to_mysql( case DATA_FLOAT: case DATA_DOUBLE: case DATA_DECIMAL: - case DATA_POINT: /* Above are the valid column types for MySQL data. */ ut_ad(flen == len); /* fall through */ @@ -2166,7 +2232,6 @@ innobase_create_index_def( memset(index->fields, 0, n_fields * sizeof *index->fields); index->parser = NULL; - index->is_ngram = false; index->key_number = key_number; index->n_fields = n_fields; index->name = mem_heap_strdup(heap, key->name); @@ -2200,12 +2265,6 @@ innobase_create_index_def( static_cast( plugin_decl(parser)->info); - index->is_ngram = strncmp( - plugin_name(parser)->str, - FTS_NGRAM_PARSER_NAME, - plugin_name(parser)->length) - == 0; - break; } } @@ -2793,10 +2852,10 @@ online_retry_drop_indexes_with_trx( @param drop_fk constraints being dropped @param n_drop_fk number of constraints that are being dropped @return whether the constraint is being dropped */ -inline MY_ATTRIBUTE((warn_unused_result)) +MY_ATTRIBUTE((pure, nonnull(1), warn_unused_result)) +inline bool innobase_dropping_foreign( -/*======================*/ const dict_foreign_t* foreign, dict_foreign_t** drop_fk, ulint n_drop_fk) @@ -2820,10 +2879,10 @@ column that is being dropped or modified to NOT NULL. @retval true Not allowed (will call my_error()) @retval false Allowed */ -static MY_ATTRIBUTE((warn_unused_result)) +MY_ATTRIBUTE((pure, nonnull(1,4), warn_unused_result)) +static bool innobase_check_foreigns_low( -/*========================*/ const dict_table_t* user_table, dict_foreign_t** drop_fk, ulint n_drop_fk, @@ -2920,10 +2979,10 @@ column that is being dropped or modified to NOT NULL. @retval true Not allowed (will call my_error()) @retval false Allowed */ -static MY_ATTRIBUTE((warn_unused_result)) +MY_ATTRIBUTE((pure, nonnull(1,2,3,4), warn_unused_result)) +static bool innobase_check_foreigns( -/*====================*/ Alter_inplace_info* ha_alter_info, const TABLE* altered_table, const TABLE* old_table, @@ -2959,29 +3018,6 @@ innobase_check_foreigns( return(false); } -/** Get the default POINT value in MySQL format -@param[in] heap memory heap where allocated -@param[in] length length of MySQL format -@return mysql format data */ -static -const byte* -innobase_build_default_mysql_point( - mem_heap_t* heap, - ulint length) -{ - byte* buf = static_cast(mem_heap_alloc( - heap, DATA_POINT_LEN + length)); - - byte* wkb = buf + length; - - ulint len = get_wkb_of_default_point(SPDIMS, wkb, DATA_POINT_LEN); - ut_ad(len == DATA_POINT_LEN); - - row_mysql_store_blob_ref(buf, length, wkb, len); - - return(buf); -} - /** Convert a default value for ADD COLUMN. @param heap Memory heap where allocated @@ -3008,16 +3044,6 @@ innobase_build_col_map_add( const byte* mysql_data = field->ptr; - if (dfield_get_type(dfield)->mtype == DATA_POINT) { - /** If the DATA_POINT field is NOT NULL, we need to - give it a default value, since DATA_POINT is a fixed length - type, we couldn't store a value of length 0, like other - geom types. Server doesn't provide the default value, and - we would use POINT(0 0) here instead. */ - - mysql_data = innobase_build_default_mysql_point(heap, size); - } - row_mysql_store_col_in_innobase_format( dfield, buf, true, mysql_data, size, comp); } @@ -3276,8 +3302,8 @@ innobase_pk_col_prefix_compare( ulint new_prefix_len, ulint old_prefix_len) { - ut_ad(new_prefix_len < REC_MAX_DATA_SIZE); - ut_ad(old_prefix_len < REC_MAX_DATA_SIZE); + ut_ad(new_prefix_len < COMPRESSED_REC_MAX_DATA_SIZE); + ut_ad(old_prefix_len < COMPRESSED_REC_MAX_DATA_SIZE); if (new_prefix_len == old_prefix_len) { return(0); @@ -4423,7 +4449,8 @@ prepare_inplace_alter_table_dict( index_defs = innobase_create_key_defs( ctx->heap, ha_alter_info, altered_table, ctx->num_to_add_index, num_fts_index, - row_table_got_default_clust_index(ctx->new_table), + dict_index_is_auto_gen_clust(dict_table_get_first_index( + ctx->new_table)), fts_doc_id_col, add_fts_doc_id, add_fts_doc_id_idx, old_table); @@ -4442,11 +4469,13 @@ prepare_inplace_alter_table_dict( || !innobase_fulltext_exist(altered_table))) { /* InnoDB can perform an online operation (LOCK=NONE). */ } else { + size_t query_length; /* This should have been blocked in check_if_supported_inplace_alter(). */ ut_ad(0); my_error(ER_NOT_SUPPORTED_YET, MYF(0), - thd_query(ctx->prebuilt->trx->mysql_thd)); + innobase_get_stmt_unsafe(ctx->prebuilt->trx->mysql_thd, + &query_length)); goto error_handled; } @@ -4520,7 +4549,7 @@ prepare_inplace_alter_table_dict( dtuple_t* add_cols; ulint space_id = 0; ulint z = 0; - ulint key_id = FIL_DEFAULT_ENCRYPTION_KEY; + uint32_t key_id = FIL_DEFAULT_ENCRYPTION_KEY; fil_encryption_t mode = FIL_ENCRYPTION_DEFAULT; fil_space_t* space = fil_space_acquire(ctx->prebuilt->table->space); @@ -4649,12 +4678,6 @@ prepare_inplace_alter_table_dict( } - if (col_type == DATA_POINT) { - /* DATA_POINT should be of fixed length, - instead of the pack_length(blob length). */ - col_len = DATA_POINT_LEN; - } - if (dict_col_name_is_reserved(field->field_name)) { dict_mem_table_free(ctx->new_table); my_error(ER_WRONG_COLUMN_NAME, MYF(0), @@ -4863,7 +4886,7 @@ new_clustered_failed: clustered index of the old table, later. */ if (new_clustered || !ctx->online - || user_table->ibd_file_missing + || !user_table->is_readable() || dict_table_is_discarded(user_table)) { /* No need to allocate a modification log. */ ut_ad(!ctx->add_index[a]->online_log); @@ -5545,30 +5568,6 @@ ha_innobase::prepare_inplace_alter_table( indexed_table = m_prebuilt->table; - if (indexed_table->is_encrypted) { - String str; - const char* engine= table_type(); - push_warning_printf(m_user_thd, Sql_condition::WARN_LEVEL_WARN, - HA_ERR_DECRYPTION_FAILED, - "Table %s is encrypted but encryption service or" - " used key_id is not available. " - " Can't continue reading table.", - indexed_table->name); - get_error_message(HA_ERR_DECRYPTION_FAILED, &str); - my_error(ER_GET_ERRMSG, MYF(0), HA_ERR_DECRYPTION_FAILED, str.c_ptr(), engine); - - DBUG_RETURN(true); - } - - if (indexed_table->corrupted - || dict_table_get_first_index(indexed_table) == NULL - || dict_index_is_corrupted( - dict_table_get_first_index(indexed_table))) { - /* The clustered index is corrupted. */ - my_error(ER_CHECK_NO_SUCH_TABLE, MYF(0)); - DBUG_RETURN(true); - } - /* ALTER TABLE will not implicitly move a table from a single-table tablespace to the system tablespace when innodb_file_per_table=OFF. But it will implicitly move a table from the system tablespace to a @@ -5588,6 +5587,42 @@ ha_innobase::prepare_inplace_alter_table( } } + if (indexed_table->is_readable()) { + } else { + if (indexed_table->corrupted) { + /* Handled below */ + } else { + FilSpace space(indexed_table->space, true); + + if (space()) { + String str; + const char* engine= table_type(); + + push_warning_printf( + m_user_thd, + Sql_condition::WARN_LEVEL_WARN, + HA_ERR_DECRYPTION_FAILED, + "Table %s in file %s is encrypted but encryption service or" + " used key_id is not available. " + " Can't continue reading table.", + table_share->table_name.str, + space()->chain.start->name); + + my_error(ER_GET_ERRMSG, MYF(0), HA_ERR_DECRYPTION_FAILED, str.c_ptr(), engine); + DBUG_RETURN(true); + } + } + } + + if (indexed_table->corrupted + || dict_table_get_first_index(indexed_table) == NULL + || dict_index_is_corrupted( + dict_table_get_first_index(indexed_table))) { + /* The clustered index is corrupted. */ + my_error(ER_CHECK_NO_SUCH_TABLE, MYF(0)); + DBUG_RETURN(true); + } + if (ha_alter_info->handler_flags & Alter_inplace_info::CHANGE_CREATE_OPTION) { const char* invalid_opt = info.create_options_are_invalid(); @@ -6347,6 +6382,7 @@ ha_innobase::inplace_alter_table( DBUG_ENTER("inplace_alter_table"); DBUG_ASSERT(!srv_read_only_mode); + ut_ad(!sync_check_iterate(sync_check())); ut_ad(!rw_lock_own(dict_operation_lock, RW_LOCK_X)); ut_ad(!rw_lock_own(dict_operation_lock, RW_LOCK_S)); @@ -6381,7 +6417,7 @@ ok_exit: ctx->m_stage = UT_NEW_NOKEY(ut_stage_alter_t(pk)); - if (m_prebuilt->table->ibd_file_missing + if (!m_prebuilt->table->is_readable() || dict_table_is_discarded(m_prebuilt->table)) { goto all_done; } @@ -7804,7 +7840,7 @@ commit_try_rebuild( /* The new table must inherit the flag from the "parent" table. */ if (dict_table_is_discarded(user_table)) { - rebuilt_table->ibd_file_missing = true; + rebuilt_table->file_unreadable = true; rebuilt_table->flags2 |= DICT_TF2_DISCARDED; } @@ -8311,20 +8347,20 @@ alter_stats_rebuild( } #ifndef DBUG_OFF - bool ibd_file_missing_orig = false; + bool file_unreadable_orig = false; #endif /* DBUG_OFF */ DBUG_EXECUTE_IF( "ib_rename_index_fail2", - ibd_file_missing_orig = table->ibd_file_missing; - table->ibd_file_missing = TRUE; + file_unreadable_orig = table->file_unreadable; + table->file_unreadable = true; ); dberr_t ret = dict_stats_update(table, DICT_STATS_RECALC_PERSISTENT); DBUG_EXECUTE_IF( "ib_rename_index_fail2", - table->ibd_file_missing = ibd_file_missing_orig; + table->file_unreadable = file_unreadable_orig; ); if (ret != DB_SUCCESS) { @@ -8455,6 +8491,19 @@ ha_innobase::commit_inplace_alter_table( = static_cast(*pctx); DBUG_ASSERT(ctx->prebuilt->trx == m_prebuilt->trx); + /* If decryption failed for old table or new table + fail here. */ + if ((!ctx->old_table->is_readable() + && fil_space_get(ctx->old_table->space)) + || (!ctx->new_table->is_readable() + && fil_space_get(ctx->new_table->space))) { + String str; + const char* engine= table_type(); + get_error_message(HA_ERR_DECRYPTION_FAILED, &str); + my_error(ER_GET_ERRMSG, MYF(0), HA_ERR_DECRYPTION_FAILED, str.c_ptr(), engine); + DBUG_RETURN(true); + } + /* Exclusively lock the table, to ensure that no other transaction is holding locks on the table while we change the table definition. The MySQL meta-data lock diff --git a/storage/innobase/handler/handler0alter_innopart.cc b/storage/innobase/handler/handler0alter_innopart.cc deleted file mode 100644 index 0f2d5c7e576..00000000000 --- a/storage/innobase/handler/handler0alter_innopart.cc +++ /dev/null @@ -1,307 +0,0 @@ -/* JAN: TODO: MySQL 5.7 InnoDB partitioning. */ - -/** Prepare inplace alter table. -Allows InnoDB to update internal structures with concurrent -writes blocked (provided that check_if_supported_inplace_alter() -did not return HA_ALTER_INPLACE_NO_LOCK). -This will be invoked before inplace_alter_table(). -@param[in] altered_table TABLE object for new version of table. -@param[in] ha_alter_info Structure describing changes to be done -by ALTER TABLE and holding data used during in-place alter. -@retval true Failure. -@retval false Success. */ -bool -ha_innopart::prepare_inplace_alter_table( - TABLE* altered_table, - Alter_inplace_info* ha_alter_info) -{ - THD* thd; - ha_innopart_inplace_ctx* ctx_parts; - bool res = true; - DBUG_ENTER("ha_innopart::prepare_inplace_alter_table"); - DBUG_ASSERT(ha_alter_info->handler_ctx == NULL); - - thd = ha_thd(); - - /* Clean up all ins/upd nodes. */ - clear_ins_upd_nodes(); - /* Based on Sql_alloc class, return NULL for new on failure. */ - ctx_parts = new ha_innopart_inplace_ctx(thd, m_tot_parts); - if (!ctx_parts) { - DBUG_RETURN(HA_ALTER_ERROR); - } - - uint ctx_array_size = sizeof(inplace_alter_handler_ctx*) - * (m_tot_parts + 1); - ctx_parts->ctx_array = - static_cast( - ut_malloc(ctx_array_size, - mem_key_partitioning)); - if (!ctx_parts->ctx_array) { - DBUG_RETURN(HA_ALTER_ERROR); - } - - /* Set all to NULL, including the terminating one. */ - memset(ctx_parts->ctx_array, 0, ctx_array_size); - - ctx_parts->prebuilt_array = static_cast( - ut_malloc(sizeof(row_prebuilt_t*) - * m_tot_parts, - mem_key_partitioning)); - if (!ctx_parts->prebuilt_array) { - DBUG_RETURN(HA_ALTER_ERROR); - } - /* For the first partition use the current prebuilt. */ - ctx_parts->prebuilt_array[0] = m_prebuilt; - /* Create new prebuilt for the rest of the partitions. - It is needed for the current implementation of - ha_innobase::commit_inplace_alter_table(). */ - for (uint i = 1; i < m_tot_parts; i++) { - row_prebuilt_t* tmp_prebuilt; - tmp_prebuilt = row_create_prebuilt( - m_part_share->get_table_part(i), - table_share->reclength); - /* Use same trx as original prebuilt. */ - tmp_prebuilt->trx = m_prebuilt->trx; - ctx_parts->prebuilt_array[i] = tmp_prebuilt; - } - - for (uint i = 0; i < m_tot_parts; i++) { - m_prebuilt = ctx_parts->prebuilt_array[i]; - m_prebuilt_ptr = ctx_parts->prebuilt_array + i; - ha_alter_info->handler_ctx = ctx_parts->ctx_array[i]; - set_partition(i); - res = ha_innobase::prepare_inplace_alter_table(altered_table, - ha_alter_info); - update_partition(i); - ctx_parts->ctx_array[i] = ha_alter_info->handler_ctx; - if (res) { - break; - } - } - m_prebuilt = ctx_parts->prebuilt_array[0]; - m_prebuilt_ptr = &m_prebuilt; - ha_alter_info->handler_ctx = ctx_parts; - ha_alter_info->group_commit_ctx = ctx_parts->ctx_array; - DBUG_RETURN(res); -} - -/** Inplace alter table. -Alter the table structure in-place with operations -specified using Alter_inplace_info. -The level of concurrency allowed during this operation depends -on the return value from check_if_supported_inplace_alter(). -@param[in] altered_table TABLE object for new version of table. -@param[in] ha_alter_info Structure describing changes to be done -by ALTER TABLE and holding data used during in-place alter. -@retval true Failure. -@retval false Success. */ -bool -ha_innopart::inplace_alter_table( - TABLE* altered_table, - Alter_inplace_info* ha_alter_info) -{ - bool res = true; - ha_innopart_inplace_ctx* ctx_parts; - - ctx_parts = static_cast( - ha_alter_info->handler_ctx); - for (uint i = 0; i < m_tot_parts; i++) { - m_prebuilt = ctx_parts->prebuilt_array[i]; - ha_alter_info->handler_ctx = ctx_parts->ctx_array[i]; - set_partition(i); - res = ha_innobase::inplace_alter_table(altered_table, - ha_alter_info); - ut_ad(ctx_parts->ctx_array[i] == ha_alter_info->handler_ctx); - ctx_parts->ctx_array[i] = ha_alter_info->handler_ctx; - if (res) { - break; - } - } - m_prebuilt = ctx_parts->prebuilt_array[0]; - ha_alter_info->handler_ctx = ctx_parts; - return(res); -} - -/** Commit or rollback inplace alter table. -Commit or rollback the changes made during -prepare_inplace_alter_table() and inplace_alter_table() inside -the storage engine. Note that the allowed level of concurrency -during this operation will be the same as for -inplace_alter_table() and thus might be higher than during -prepare_inplace_alter_table(). (E.g concurrent writes were -blocked during prepare, but might not be during commit). -@param[in] altered_table TABLE object for new version of table. -@param[in] ha_alter_info Structure describing changes to be done -by ALTER TABLE and holding data used during in-place alter. -@param[in] commit true => Commit, false => Rollback. -@retval true Failure. -@retval false Success. */ -bool -ha_innopart::commit_inplace_alter_table( - TABLE* altered_table, - Alter_inplace_info* ha_alter_info, - bool commit) -{ - bool res = false; - ha_innopart_inplace_ctx* ctx_parts; - - ctx_parts = static_cast( - ha_alter_info->handler_ctx); - ut_ad(ctx_parts); - ut_ad(ctx_parts->prebuilt_array); - ut_ad(ctx_parts->prebuilt_array[0] == m_prebuilt); - if (commit) { - /* Commit is done through first partition (group commit). */ - ut_ad(ha_alter_info->group_commit_ctx == ctx_parts->ctx_array); - ha_alter_info->handler_ctx = ctx_parts->ctx_array[0]; - set_partition(0); - res = ha_innobase::commit_inplace_alter_table(altered_table, - ha_alter_info, - commit); - ut_ad(res || !ha_alter_info->group_commit_ctx); - goto end; - } - /* Rollback is done for each partition. */ - for (uint i = 0; i < m_tot_parts; i++) { - m_prebuilt = ctx_parts->prebuilt_array[i]; - ha_alter_info->handler_ctx = ctx_parts->ctx_array[i]; - set_partition(i); - if (ha_innobase::commit_inplace_alter_table(altered_table, - ha_alter_info, commit)) { - res = true; - } - ut_ad(ctx_parts->ctx_array[i] == ha_alter_info->handler_ctx); - ctx_parts->ctx_array[i] = ha_alter_info->handler_ctx; - } -end: - /* Move the ownership of the new tables back to - the m_part_share. */ - ha_innobase_inplace_ctx* ctx; - for (uint i = 0; i < m_tot_parts; i++) { - /* TODO: Fix to only use one prebuilt (i.e. make inplace - alter partition aware instead of using multiple prebuilt - copies... */ - ctx = static_cast( - ctx_parts->ctx_array[i]); - if (ctx) { - m_part_share->set_table_part(i, ctx->prebuilt->table); - ctx->prebuilt->table = NULL; - ctx_parts->prebuilt_array[i] = ctx->prebuilt; - } - } - /* The above juggling of prebuilt must be reset here. */ - m_prebuilt = ctx_parts->prebuilt_array[0]; - m_prebuilt->table = m_part_share->get_table_part(0); - ha_alter_info->handler_ctx = ctx_parts; - return(res); -} - -/** Notify the storage engine that the table structure (.frm) has -been updated. - -ha_partition allows inplace operations that also upgrades the engine -if it supports partitioning natively. So if this is the case then -we will remove the .par file since it is not used with ha_innopart -(we use the internal data dictionary instead). */ -void -ha_innopart::notify_table_changed() -{ - char tmp_par_path[FN_REFLEN + 1]; - strxnmov(tmp_par_path, FN_REFLEN, table->s->normalized_path.str, - ".par", NullS); - - if (my_access(tmp_par_path, W_OK) == 0) - { - my_delete(tmp_par_path, MYF(0)); - } -} - -/** Check if supported inplace alter table. -@param[in] altered_table Altered MySQL table. -@param[in] ha_alter_info Information about inplace operations to do. -@return Lock level, not supported or error */ -enum_alter_inplace_result -ha_innopart::check_if_supported_inplace_alter( - TABLE* altered_table, - Alter_inplace_info* ha_alter_info) -{ - DBUG_ENTER("ha_innopart::check_if_supported_inplace_alter"); - DBUG_ASSERT(ha_alter_info->handler_ctx == NULL); - - /* Not supporting these for partitioned tables yet! */ - - /* FK not yet supported. */ - if (ha_alter_info->handler_flags - & (Alter_inplace_info::ADD_FOREIGN_KEY - | Alter_inplace_info::DROP_FOREIGN_KEY)) { - - ha_alter_info->unsupported_reason = innobase_get_err_msg( - ER_FOREIGN_KEY_ON_PARTITIONED); - DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED); - } - /* FTS not yet supported either. */ - if ((ha_alter_info->handler_flags - & Alter_inplace_info::ADD_INDEX)) { - - for (uint i = 0; i < ha_alter_info->index_add_count; i++) { - const KEY* key = - &ha_alter_info->key_info_buffer[ - ha_alter_info->index_add_buffer[i]]; - if (key->flags & HA_FULLTEXT) { - DBUG_ASSERT(!(key->flags & HA_KEYFLAG_MASK - & ~(HA_FULLTEXT - | HA_PACK_KEY - | HA_GENERATED_KEY - | HA_BINARY_PACK_KEY))); - ha_alter_info->unsupported_reason = - innobase_get_err_msg( - ER_FULLTEXT_NOT_SUPPORTED_WITH_PARTITIONING); - DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED); - } - } - } - /* We cannot allow INPLACE to change order of KEY partitioning fields! */ - if ((ha_alter_info->handler_flags - & Alter_inplace_info::ALTER_STORED_COLUMN_ORDER) - && !m_part_info->same_key_column_order( - &ha_alter_info->alter_info->create_list)) { - - DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED); - } - - /* Cannot allow INPLACE for drop and create PRIMARY KEY if partition is - on Primary Key - PARTITION BY KEY() */ - if ((ha_alter_info->handler_flags - & (Alter_inplace_info::ADD_PK_INDEX - | Alter_inplace_info::DROP_PK_INDEX))) { - - /* Check partition by key(). */ - if ((m_part_info->part_type == HASH_PARTITION) - && m_part_info->list_of_part_fields - && m_part_info->part_field_list.is_empty()) { - - DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED); - } - - /* Check sub-partition by key(). */ - if ((m_part_info->subpart_type == HASH_PARTITION) - && m_part_info->list_of_subpart_fields - && m_part_info->subpart_field_list.is_empty()) { - - DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED); - } - } - - /* Check for PK and UNIQUE should already be done when creating the - new table metadata. - (fix_partition_info/check_primary_key+check_unique_key) */ - - set_partition(0); - enum_alter_inplace_result res = - ha_innobase::check_if_supported_inplace_alter(altered_table, - ha_alter_info); - - DBEUG_RETURN(res); -} - diff --git a/storage/innobase/handler/i_s.cc b/storage/innobase/handler/i_s.cc index 3d764ef6e7a..8880d21aafb 100644 --- a/storage/innobase/handler/i_s.cc +++ b/storage/innobase/handler/i_s.cc @@ -1,7 +1,7 @@ /***************************************************************************** -Copyright (c) 2007, 2016, Oracle and/or its affiliates. -Copyrigth (c) 2014, 2017, MariaDB Corporation +Copyright (c) 2007, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2014, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -699,8 +699,7 @@ fill_innodb_trx_from_cache( #ifdef BTR_CUR_HASH_ADAPT /* trx_adaptive_hash_latched */ - OK(fields[IDX_TRX_ADAPTIVE_HASH_LATCHED]->store( - row->trx_has_search_latch, true)); + OK(fields[IDX_TRX_ADAPTIVE_HASH_LATCHED]->store(0, true)); #endif /* BTR_CUR_HASH_ADAPT */ /* trx_is_read_only*/ @@ -2971,14 +2970,16 @@ i_s_fts_deleted_generic_fill( fields = table->field; + int ret = 0; + for (ulint j = 0; j < ib_vector_size(deleted->doc_ids); ++j) { doc_id_t doc_id; doc_id = *(doc_id_t*) ib_vector_get_const(deleted->doc_ids, j); - OK(fields[I_S_FTS_DOC_ID]->store(doc_id, true)); + BREAK_IF(ret = fields[I_S_FTS_DOC_ID]->store(doc_id, true)); - OK(schema_table_store_record(thd, table)); + BREAK_IF(ret = schema_table_store_record(thd, table)); } trx_free_for_background(trx); @@ -2989,7 +2990,7 @@ i_s_fts_deleted_generic_fill( rw_lock_s_unlock(dict_operation_lock); - DBUG_RETURN(0); + DBUG_RETURN(ret); } /*******************************************************************//** @@ -3229,13 +3230,13 @@ i_s_fts_index_cache_fill_one_index( /*===============================*/ fts_index_cache_t* index_cache, /*!< in: FTS index cache */ THD* thd, /*!< in: thread */ + fts_string_t* conv_str, /*!< in/out: buffer */ TABLE_LIST* tables) /*!< in/out: tables to fill */ { TABLE* table = (TABLE*) tables->table; Field** fields; CHARSET_INFO* index_charset; const ib_rbt_node_t* rbt_node; - fts_string_t conv_str; uint dummy_errors; char* word_str; @@ -3244,10 +3245,9 @@ i_s_fts_index_cache_fill_one_index( fields = table->field; index_charset = index_cache->charset; - conv_str.f_len = system_charset_info->mbmaxlen - * FTS_MAX_WORD_LEN_IN_CHAR; - conv_str.f_str = static_cast(ut_malloc_nokey(conv_str.f_len)); - conv_str.f_n_char = 0; + conv_str->f_n_char = 0; + + int ret = 0; /* Go through each word in the index cache */ for (rbt_node = rbt_first(index_cache->words); @@ -3259,16 +3259,16 @@ i_s_fts_index_cache_fill_one_index( /* Convert word from index charset to system_charset_info */ if (index_charset->cset != system_charset_info->cset) { - conv_str.f_n_char = my_convert( - reinterpret_cast(conv_str.f_str), - static_cast(conv_str.f_len), + conv_str->f_n_char = my_convert( + reinterpret_cast(conv_str->f_str), + static_cast(conv_str->f_len), system_charset_info, reinterpret_cast(word->text.f_str), static_cast(word->text.f_len), index_charset, &dummy_errors); - ut_ad(conv_str.f_n_char <= conv_str.f_len); - conv_str.f_str[conv_str.f_n_char] = 0; - word_str = reinterpret_cast(conv_str.f_str); + ut_ad(conv_str->f_n_char <= conv_str->f_len); + conv_str->f_str[conv_str->f_n_char] = 0; + word_str = reinterpret_cast(conv_str->f_str); } else { word_str = reinterpret_cast(word->text.f_str); } @@ -3326,9 +3326,7 @@ i_s_fts_index_cache_fill_one_index( } } - ut_free(conv_str.f_str); - - DBUG_RETURN(0); + DBUG_RETURN(ret); } /*******************************************************************//** Fill the dynamic table INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHED @@ -3372,18 +3370,27 @@ i_s_fts_index_cache_fill( ut_a(cache); + int ret = 0; + fts_string_t conv_str; + conv_str.f_len = system_charset_info->mbmaxlen + * FTS_MAX_WORD_LEN_IN_CHAR; + conv_str.f_str = static_cast(ut_malloc_nokey(conv_str.f_len)); + for (ulint i = 0; i < ib_vector_size(cache->indexes); i++) { fts_index_cache_t* index_cache; index_cache = static_cast ( ib_vector_get(cache->indexes, i)); - i_s_fts_index_cache_fill_one_index(index_cache, thd, tables); + BREAK_IF(ret = i_s_fts_index_cache_fill_one_index( + index_cache, thd, &conv_str, tables)); } + ut_free(conv_str.f_str); + dict_table_close(user_table, FALSE, FALSE); - DBUG_RETURN(0); + DBUG_RETURN(ret); } /*******************************************************************//** @@ -3685,8 +3692,6 @@ i_s_fts_index_table_fill_one_fetch( } } - i_s_fts_index_table_free_one_fetch(words); - DBUG_RETURN(ret); } @@ -3700,12 +3705,12 @@ i_s_fts_index_table_fill_one_index( /*===============================*/ dict_index_t* index, /*!< in: FTS index */ THD* thd, /*!< in: thread */ + fts_string_t* conv_str, /*!< in/out: buffer */ TABLE_LIST* tables) /*!< in/out: tables to fill */ { ib_vector_t* words; mem_heap_t* heap; CHARSET_INFO* index_charset; - fts_string_t conv_str; dberr_t error; int ret = 0; @@ -3718,10 +3723,6 @@ i_s_fts_index_table_fill_one_index( sizeof(fts_word_t), 256); index_charset = fts_index_get_charset(index); - conv_str.f_len = system_charset_info->mbmaxlen - * FTS_MAX_WORD_LEN_IN_CHAR; - conv_str.f_str = static_cast(ut_malloc_nokey(conv_str.f_len)); - conv_str.f_n_char = 0; /* Iterate through each auxiliary table as described in fts_index_selector */ @@ -3759,17 +3760,17 @@ i_s_fts_index_table_fill_one_index( /* Fill into tables */ ret = i_s_fts_index_table_fill_one_fetch( - index_charset, thd, tables, words, &conv_str, has_more); + index_charset, thd, tables, words, conv_str, + has_more); + i_s_fts_index_table_free_one_fetch(words); if (ret != 0) { - i_s_fts_index_table_free_one_fetch(words); goto func_exit; } } while (has_more); } func_exit: - ut_free(conv_str.f_str); mem_heap_free(heap); DBUG_RETURN(ret); @@ -3811,10 +3812,17 @@ i_s_fts_index_table_fill( DBUG_RETURN(0); } + int ret = 0; + fts_string_t conv_str; + conv_str.f_len = system_charset_info->mbmaxlen + * FTS_MAX_WORD_LEN_IN_CHAR; + conv_str.f_str = static_cast(ut_malloc_nokey(conv_str.f_len)); + for (index = dict_table_get_first_index(user_table); index; index = dict_table_get_next_index(index)) { if (index->type & DICT_FTS) { - i_s_fts_index_table_fill_one_index(index, thd, tables); + BREAK_IF(ret = i_s_fts_index_table_fill_one_index( + index, thd, &conv_str, tables)); } } @@ -3822,7 +3830,9 @@ i_s_fts_index_table_fill( rw_lock_s_unlock(dict_operation_lock); - DBUG_RETURN(0); + ut_free(conv_str.f_str); + + DBUG_RETURN(ret); } /*******************************************************************//** @@ -3988,6 +3998,8 @@ i_s_fts_config_fill( DBUG_ASSERT(!dict_index_is_online_ddl(index)); } + int ret = 0; + while (fts_config_key[i]) { fts_string_t value; char* key_name; @@ -4012,13 +4024,14 @@ i_s_fts_config_fill( ut_free(key_name); } - OK(field_store_string( - fields[FTS_CONFIG_KEY], fts_config_key[i])); + BREAK_IF(ret = field_store_string( + fields[FTS_CONFIG_KEY], fts_config_key[i])); - OK(field_store_string( - fields[FTS_CONFIG_VALUE], (const char*) value.f_str)); + BREAK_IF(ret = field_store_string( + fields[FTS_CONFIG_VALUE], + reinterpret_cast(value.f_str))); - OK(schema_table_store_record(thd, table)); + BREAK_IF(ret = schema_table_store_record(thd, table)); i++; } @@ -4031,7 +4044,7 @@ i_s_fts_config_fill( rw_lock_s_unlock(dict_operation_lock); - DBUG_RETURN(0); + DBUG_RETURN(ret); } /*******************************************************************//** @@ -4889,15 +4902,14 @@ i_s_innodb_buffer_page_fill( i_s_page_type[page_info->page_type].type_str)); OK(fields[IDX_BUFFER_PAGE_FLUSH_TYPE]->store( - page_info->flush_type)); + page_info->flush_type, true)); OK(fields[IDX_BUFFER_PAGE_FIX_COUNT]->store( - page_info->fix_count)); + page_info->fix_count, true)); #ifdef BTR_CUR_HASH_ADAPT - OK(field_store_string( - fields[IDX_BUFFER_PAGE_HASHED], - page_info->hashed ? "YES" : "NO")); + OK(field_store_string(fields[IDX_BUFFER_PAGE_HASHED], + page_info->hashed ? "YES" : "NO")); #endif /* BTR_CUR_HASH_ADAPT */ OK(fields[IDX_BUFFER_PAGE_NEWEST_MOD]->store( @@ -4907,7 +4919,7 @@ i_s_innodb_buffer_page_fill( page_info->oldest_mod, true)); OK(fields[IDX_BUFFER_PAGE_ACCESS_TIME]->store( - page_info->access_time)); + page_info->access_time, true)); fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_null(); @@ -4916,32 +4928,36 @@ i_s_innodb_buffer_page_fill( /* If this is an index page, fetch the index name and table name */ if (page_info->page_type == I_S_PAGE_TYPE_INDEX) { - const dict_index_t* index; + bool ret = false; mutex_enter(&dict_sys->mutex); - index = dict_index_get_if_in_cache_low( - page_info->index_id); - - if (index) { + if (const dict_index_t* index = + dict_index_get_if_in_cache_low( + page_info->index_id)) { table_name_end = innobase_convert_name( table_name, sizeof(table_name), index->table_name, strlen(index->table_name), thd); - OK(fields[IDX_BUFFER_PAGE_TABLE_NAME]->store( - table_name, - uint(table_name_end - table_name), - system_charset_info)); - fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_notnull(); - - OK(field_store_index_name( - fields[IDX_BUFFER_PAGE_INDEX_NAME], - index->name)); + ret = fields[IDX_BUFFER_PAGE_TABLE_NAME] + ->store(table_name, + static_cast( + table_name_end + - table_name), + system_charset_info) + || field_store_index_name( + fields + [IDX_BUFFER_PAGE_INDEX_NAME], + index->name); } mutex_exit(&dict_sys->mutex); + + OK(ret); + + fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_notnull(); } OK(fields[IDX_BUFFER_PAGE_NUM_RECS]->store( @@ -4991,32 +5007,29 @@ i_s_innodb_buffer_page_fill( switch (page_info->io_fix) { case BUF_IO_NONE: - OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX], - "IO_NONE")); + state_str = "IO_NONE"; break; case BUF_IO_READ: - OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX], - "IO_READ")); + state_str = "IO_READ"; break; case BUF_IO_WRITE: - OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX], - "IO_WRITE")); + state_str = "IO_WRITE"; break; case BUF_IO_PIN: - OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX], - "IO_PIN")); + state_str = "IO_PIN"; break; } + OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX], + state_str)); + OK(field_store_string(fields[IDX_BUFFER_PAGE_IS_OLD], (page_info->is_old) ? "YES" : "NO")); OK(fields[IDX_BUFFER_PAGE_FREE_CLOCK]->store( page_info->freed_page_clock, true)); - if (schema_table_store_record(thd, table)) { - DBUG_RETURN(1); - } + OK(schema_table_store_record(thd, table)); } DBUG_RETURN(0); @@ -5572,17 +5585,10 @@ i_s_innodb_buf_page_lru_fill( ulint num_page) /*!< in: number of page info cached */ { - TABLE* table; - Field** fields; - mem_heap_t* heap; - DBUG_ENTER("i_s_innodb_buf_page_lru_fill"); - table = tables->table; - - fields = table->field; - - heap = mem_heap_create(1000); + TABLE* table = tables->table; + Field** fields = table->field; /* Iterate through the cached array and fill the I_S table rows */ for (ulint i = 0; i < num_page; i++) { @@ -5619,9 +5625,8 @@ i_s_innodb_buf_page_lru_fill( page_info->fix_count, true)); #ifdef BTR_CUR_HASH_ADAPT - OK(field_store_string( - fields[IDX_BUF_LRU_PAGE_HASHED], - page_info->hashed ? "YES" : "NO")); + OK(field_store_string(fields[IDX_BUF_LRU_PAGE_HASHED], + page_info->hashed ? "YES" : "NO")); #endif /* BTR_CUR_HASH_ADAPT */ OK(fields[IDX_BUF_LRU_PAGE_NEWEST_MOD]->store( @@ -5640,32 +5645,36 @@ i_s_innodb_buf_page_lru_fill( /* If this is an index page, fetch the index name and table name */ if (page_info->page_type == I_S_PAGE_TYPE_INDEX) { - const dict_index_t* index; + bool ret = false; mutex_enter(&dict_sys->mutex); - index = dict_index_get_if_in_cache_low( - page_info->index_id); - - if (index) { + if (const dict_index_t* index = + dict_index_get_if_in_cache_low( + page_info->index_id)) { table_name_end = innobase_convert_name( table_name, sizeof(table_name), index->table_name, strlen(index->table_name), thd); - OK(fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->store( - table_name, - uint(table_name_end - table_name), - system_charset_info)); - fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_notnull(); - - OK(field_store_index_name( - fields[IDX_BUF_LRU_PAGE_INDEX_NAME], - index->name)); + ret = fields[IDX_BUF_LRU_PAGE_TABLE_NAME] + ->store(table_name, + static_cast( + table_name_end + - table_name), + system_charset_info) + || field_store_index_name( + fields + [IDX_BUF_LRU_PAGE_INDEX_NAME], + index->name); } mutex_exit(&dict_sys->mutex); + + OK(ret); + + fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_notnull(); } OK(fields[IDX_BUF_LRU_PAGE_NUM_RECS]->store( @@ -5675,8 +5684,8 @@ i_s_innodb_buf_page_lru_fill( page_info->data_size, true)); OK(fields[IDX_BUF_LRU_PAGE_ZIP_SIZE]->store( - page_info->zip_ssize ? - 512 << page_info->zip_ssize : 0, true)); + page_info->zip_ssize + ? 512 << page_info->zip_ssize : 0, true)); state = static_cast(page_info->page_state); @@ -5705,35 +5714,31 @@ i_s_innodb_buf_page_lru_fill( switch (page_info->io_fix) { case BUF_IO_NONE: - OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX], - "IO_NONE")); + state_str = "IO_NONE"; break; case BUF_IO_READ: - OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX], - "IO_READ")); + state_str = "IO_READ"; break; case BUF_IO_WRITE: - OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX], - "IO_WRITE")); + state_str = "IO_WRITE"; + break; + case BUF_IO_PIN: + state_str = "IO_PIN"; break; } + OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX], + state_str)); + OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IS_OLD], - (page_info->is_old) ? "YES" : "NO")); + page_info->is_old ? "YES" : "NO")); OK(fields[IDX_BUF_LRU_PAGE_FREE_CLOCK]->store( page_info->freed_page_clock, true)); - if (schema_table_store_record(thd, table)) { - mem_heap_free(heap); - DBUG_RETURN(1); - } - - mem_heap_empty(heap); + OK(schema_table_store_record(thd, table)); } - mem_heap_free(heap); - DBUG_RETURN(0); } @@ -6082,10 +6087,10 @@ i_s_dict_fill_sys_tables( OK(field_store_string(fields[SYS_TABLES_ROW_FORMAT], row_format)); - OK(fields[SYS_TABLES_ZIP_PAGE_SIZE]->store(static_cast( + OK(fields[SYS_TABLES_ZIP_PAGE_SIZE]->store( page_size.is_compressed() ? page_size.physical() - : 0))); + : 0, true)); OK(field_store_string(fields[SYS_TABLES_SPACE_TYPE], space_type)); @@ -6385,7 +6390,7 @@ i_s_dict_fill_sys_tablestats( OK(fields[SYS_TABLESTATS_AUTONINC]->store(table->autoinc, true)); - OK(fields[SYS_TABLESTATS_TABLE_REF_COUNT]->store(static_cast(ref_count))); + OK(fields[SYS_TABLESTATS_TABLE_REF_COUNT]->store(ref_count, true)); OK(schema_table_store_record(thd, table_to_fill)); @@ -7117,11 +7122,11 @@ i_s_dict_fill_sys_virtual( fields = table_to_fill->field; - OK(fields[SYS_VIRTUAL_TABLE_ID]->store((longlong) table_id, TRUE)); + OK(fields[SYS_VIRTUAL_TABLE_ID]->store(table_id, true)); - OK(fields[SYS_VIRTUAL_POS]->store(pos)); + OK(fields[SYS_VIRTUAL_POS]->store(pos, true)); - OK(fields[SYS_VIRTUAL_BASE_POS]->store(base_pos)); + OK(fields[SYS_VIRTUAL_BASE_POS]->store(base_pos, true)); OK(schema_table_store_record(thd, table_to_fill)); @@ -7321,11 +7326,11 @@ i_s_dict_fill_sys_fields( fields = table_to_fill->field; - OK(fields[SYS_FIELD_INDEX_ID]->store((longlong) index_id, TRUE)); + OK(fields[SYS_FIELD_INDEX_ID]->store(index_id, true)); OK(field_store_string(fields[SYS_FIELD_NAME], field->name)); - OK(fields[SYS_FIELD_POS]->store(static_cast(pos))); + OK(fields[SYS_FIELD_POS]->store(pos, true)); OK(schema_table_store_record(thd, table_to_fill)); @@ -8601,31 +8606,37 @@ i_s_dict_fill_tablespaces_encryption( fil_space_crypt_get_status(space, &status); - OK(fields[TABLESPACES_ENCRYPTION_SPACE]->store(space->id)); + /* If tablespace id does not match, we did not find + encryption information for this tablespace. */ + if (!space->crypt_data || space->id != status.space) { + goto skip; + } + + OK(fields[TABLESPACES_ENCRYPTION_SPACE]->store(space->id, true)); OK(field_store_string(fields[TABLESPACES_ENCRYPTION_NAME], space->name)); OK(fields[TABLESPACES_ENCRYPTION_ENCRYPTION_SCHEME]->store( - status.scheme)); + status.scheme, true)); OK(fields[TABLESPACES_ENCRYPTION_KEYSERVER_REQUESTS]->store( - status.keyserver_requests)); + status.keyserver_requests, true)); OK(fields[TABLESPACES_ENCRYPTION_MIN_KEY_VERSION]->store( - status.min_key_version)); + status.min_key_version, true)); OK(fields[TABLESPACES_ENCRYPTION_CURRENT_KEY_VERSION]->store( - status.current_key_version)); + status.current_key_version, true)); OK(fields[TABLESPACES_ENCRYPTION_CURRENT_KEY_ID]->store( - status.key_id)); + status.key_id, true)); OK(fields[TABLESPACES_ENCRYPTION_ROTATING_OR_FLUSHING]->store( - (status.rotating || status.flushing) ? 1 : 0)); + status.rotating || status.flushing, true)); if (status.rotating) { fields[TABLESPACES_ENCRYPTION_KEY_ROTATION_PAGE_NUMBER]->set_notnull(); OK(fields[TABLESPACES_ENCRYPTION_KEY_ROTATION_PAGE_NUMBER]->store( - status.rotate_next_page_number)); + status.rotate_next_page_number, true)); fields[TABLESPACES_ENCRYPTION_KEY_ROTATION_MAX_PAGE_NUMBER]->set_notnull(); OK(fields[TABLESPACES_ENCRYPTION_KEY_ROTATION_MAX_PAGE_NUMBER]->store( - status.rotate_max_page_number)); + status.rotate_max_page_number, true)); } else { fields[TABLESPACES_ENCRYPTION_KEY_ROTATION_PAGE_NUMBER] ->set_null(); @@ -8635,6 +8646,7 @@ i_s_dict_fill_tablespaces_encryption( OK(schema_table_store_record(thd, table_to_fill)); +skip: DBUG_RETURN(0); } /*******************************************************************//** @@ -8910,13 +8922,13 @@ i_s_dict_fill_tablespaces_scrubbing( fil_space_get_scrub_status(space, &status); - OK(fields[TABLESPACES_SCRUBBING_SPACE]->store(space->id)); + OK(fields[TABLESPACES_SCRUBBING_SPACE]->store(space->id, true)); OK(field_store_string(fields[TABLESPACES_SCRUBBING_NAME], space->name)); OK(fields[TABLESPACES_SCRUBBING_COMPRESSED]->store( - status.compressed ? 1 : 0)); + status.compressed ? 1 : 0, true)); if (status.last_scrub_completed == 0) { fields[TABLESPACES_SCRUBBING_LAST_SCRUB_COMPLETED]->set_null(); @@ -8943,11 +8955,11 @@ i_s_dict_fill_tablespaces_scrubbing( fields[TABLESPACES_SCRUBBING_CURRENT_SCRUB_STARTED], status.current_scrub_started)); OK(fields[TABLESPACES_SCRUBBING_CURRENT_SCRUB_ACTIVE_THREADS] - ->store(status.current_scrub_active_threads)); + ->store(status.current_scrub_active_threads, true)); OK(fields[TABLESPACES_SCRUBBING_CURRENT_SCRUB_PAGE_NUMBER] - ->store(status.current_scrub_page_number)); + ->store(status.current_scrub_page_number, true)); OK(fields[TABLESPACES_SCRUBBING_CURRENT_SCRUB_MAX_PAGE_NUMBER] - ->store(status.current_scrub_max_page_number)); + ->store(status.current_scrub_max_page_number, true)); } else { for (uint i = 0; i < array_elements(field_numbers); i++) { fields[field_numbers[i]]->set_null(); diff --git a/storage/innobase/handler/i_s.h b/storage/innobase/handler/i_s.h index 8d34fbf8fbb..e07fe49f7fa 100644 --- a/storage/innobase/handler/i_s.h +++ b/storage/innobase/handler/i_s.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2007, 2015, Oracle and/or its affiliates. All Rights Reserved. -Copyrigth (c) 2014, 2017, MariaDB Corporation +Copyright (c) 2014, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -73,6 +73,8 @@ extern struct st_maria_plugin i_s_innodb_sys_semaphore_waits; DBUG_RETURN(1); \ } +#define BREAK_IF(expr) if ((expr)) break + #define RETURN_IF_INNODB_NOT_STARTED(plugin_name) \ do { \ if (!srv_was_started) { \ diff --git a/storage/innobase/ibuf/ibuf0ibuf.cc b/storage/innobase/ibuf/ibuf0ibuf.cc index c7ffecd00c1..eda6684e69f 100644 --- a/storage/innobase/ibuf/ibuf0ibuf.cc +++ b/storage/innobase/ibuf/ibuf0ibuf.cc @@ -534,7 +534,6 @@ ibuf_init_at_db_start(void) fseg_n_reserved_pages(header_page + IBUF_HEADER + IBUF_TREE_SEG_HEADER, &n_used, &mtr); - ibuf_enter(&mtr); ut_ad(n_used >= 2); @@ -556,7 +555,7 @@ ibuf_init_at_db_start(void) mutex_exit(&ibuf_mutex); ibuf->empty = page_is_empty(root); - ibuf_mtr_commit(&mtr); + mtr.commit(); ibuf->index = dict_mem_index_create( "innodb_change_buffer", "CLUST_IND", @@ -2105,6 +2104,8 @@ ibuf_remove_free_page(void) page_t* root; page_t* bitmap_page; + log_free_check(); + mtr_start(&mtr); fil_space_t* space = mtr.set_sys_modified(); const page_size_t page_size(space->flags); @@ -2212,19 +2213,7 @@ void ibuf_free_excess_pages(void) /*========================*/ { - ut_ad(rw_lock_own(fil_space_get_latch(IBUF_SPACE_ID, NULL), RW_LOCK_X)); - - ut_ad(rw_lock_get_x_lock_count( - fil_space_get_latch(IBUF_SPACE_ID, NULL)) == 1); - - /* NOTE: We require that the thread did not own the latch before, - because then we know that we can obey the correct latching order - for ibuf latches */ - - if (!ibuf) { - /* Not yet initialized; not sure if this is possible, but - does no harm to check for it. */ - + if (srv_force_recovery >= SRV_FORCE_NO_IBUF_MERGE) { return; } @@ -2829,8 +2818,7 @@ ibuf_get_volume_buffered_hash( fold = ut_fold_binary(data, len); hash += (fold / (CHAR_BIT * sizeof *hash)) % size; - bitmask = static_cast( - 1 << (fold % (CHAR_BIT * sizeof(*hash)))); + bitmask = static_cast(1) << (fold % (CHAR_BIT * sizeof(*hash))); if (*hash & bitmask) { @@ -3602,7 +3590,7 @@ fail_exit: if (mode == BTR_MODIFY_PREV) { err = btr_cur_optimistic_insert( - BTR_NO_LOCKING_FLAG, + BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG, cursor, &offsets, &offsets_heap, ibuf_entry, &ins_rec, &dummy_big_rec, 0, thr, &mtr); diff --git a/storage/innobase/include/btr0btr.h b/storage/innobase/include/btr0btr.h index a5409c3ad4c..1d7710a1496 100644 --- a/storage/innobase/include/btr0btr.h +++ b/storage/innobase/include/btr0btr.h @@ -172,7 +172,7 @@ btr_corruption_report( /*==================*/ const buf_block_t* block, /*!< in: corrupted block */ const dict_index_t* index) /*!< in: index tree */ - UNIV_COLD MY_ATTRIBUTE((nonnull)); + ATTRIBUTE_COLD __attribute__((nonnull)); /** Assert that a B-tree page is not corrupted. @param block buffer block containing a B-tree page diff --git a/storage/innobase/include/btr0btr.ic b/storage/innobase/include/btr0btr.ic index 308fcfe9b03..bd4f2a40267 100644 --- a/storage/innobase/include/btr0btr.ic +++ b/storage/innobase/include/btr0btr.ic @@ -63,7 +63,7 @@ btr_block_get_func( if (err == DB_DECRYPTION_FAILED) { if (index && index->table) { - index->table->is_encrypted = true; + index->table->file_unreadable = true; } } diff --git a/storage/innobase/include/btr0cur.h b/storage/innobase/include/btr0cur.h index fee7f375cb4..3a98280082f 100644 --- a/storage/innobase/include/btr0cur.h +++ b/storage/innobase/include/btr0cur.h @@ -244,15 +244,17 @@ btr_cur_optimistic_insert( btr_cur_t* cursor, /*!< in: cursor on page after which to insert; cursor stays valid */ ulint** offsets,/*!< out: offsets on *rec */ - mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */ + mem_heap_t** heap, /*!< in/out: pointer to memory heap */ dtuple_t* entry, /*!< in/out: entry to insert */ rec_t** rec, /*!< out: pointer to inserted record if succeed */ big_rec_t** big_rec,/*!< out: big rec vector whose fields have to - be stored externally by the caller, or - NULL */ + be stored externally by the caller */ ulint n_ext, /*!< in: number of externally stored columns */ - que_thr_t* thr, /*!< in: query thread or NULL */ + que_thr_t* thr, /*!< in/out: query thread; can be NULL if + !(~flags + & (BTR_NO_LOCKING_FLAG + | BTR_NO_UNDO_LOG_FLAG)) */ mtr_t* mtr) /*!< in/out: mini-transaction; if this function returns DB_SUCCESS on a leaf page of a secondary index in a @@ -279,15 +281,17 @@ btr_cur_pessimistic_insert( cursor stays valid */ ulint** offsets,/*!< out: offsets on *rec */ mem_heap_t** heap, /*!< in/out: pointer to memory heap - that can be emptied, or NULL */ + that can be emptied */ dtuple_t* entry, /*!< in/out: entry to insert */ rec_t** rec, /*!< out: pointer to inserted record if succeed */ big_rec_t** big_rec,/*!< out: big rec vector whose fields have to - be stored externally by the caller, or - NULL */ + be stored externally by the caller */ ulint n_ext, /*!< in: number of externally stored columns */ - que_thr_t* thr, /*!< in: query thread or NULL */ + que_thr_t* thr, /*!< in/out: query thread; can be NULL if + !(~flags + & (BTR_NO_LOCKING_FLAG + | BTR_NO_UNDO_LOG_FLAG)) */ mtr_t* mtr) /*!< in/out: mini-transaction */ MY_ATTRIBUTE((nonnull(2,3,4,5,6,7,10), warn_unused_result)); /*************************************************************//** @@ -408,12 +412,12 @@ btr_cur_pessimistic_update( ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */ mem_heap_t** offsets_heap, /*!< in/out: pointer to memory heap - that can be emptied, or NULL */ + that can be emptied */ mem_heap_t* entry_heap, /*!< in/out: memory heap for allocating big_rec and the index tuple */ big_rec_t** big_rec,/*!< out: big rec vector whose fields have to - be stored externally by the caller, or NULL */ + be stored externally by the caller */ upd_t* update, /*!< in/out: update vector; this is allowed to also contain trx id and roll ptr fields. Non-updated columns that are moved offpage will @@ -434,7 +438,6 @@ undo log record created. dberr_t btr_cur_del_mark_set_clust_rec( /*===========================*/ - ulint flags, /*!< in: undo logging and locking flags */ buf_block_t* block, /*!< in/out: buffer block of the record */ rec_t* rec, /*!< in/out: record */ dict_index_t* index, /*!< in: clustered index of the record */ diff --git a/storage/innobase/include/btr0defragment.h b/storage/innobase/include/btr0defragment.h index 21ba6d9f426..9c78ec412a2 100644 --- a/storage/innobase/include/btr0defragment.h +++ b/storage/innobase/include/btr0defragment.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (C) 2013, 2014 Facebook, Inc. All Rights Reserved. -Copyright (C) 2014, 2015, MariaDB Corporation. +Copyright (C) 2014, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -85,13 +85,13 @@ UNIV_INTERN void btr_defragment_save_defrag_stats_if_needed( dict_index_t* index); /*!< in: index */ -/******************************************************************//** -Thread that merges consecutive b-tree pages into fewer pages to defragment -the index. */ + +/** Merge consecutive b-tree pages into fewer pages to defragment indexes */ extern "C" UNIV_INTERN os_thread_ret_t -DECLARE_THREAD(btr_defragment_thread)( -/*==========================================*/ - void* arg); /*!< in: a dummy parameter required by - os_thread_create */ +DECLARE_THREAD(btr_defragment_thread)(void*); + +/** Whether btr_defragment_thread is active */ +extern bool btr_defragment_thread_active; + #endif diff --git a/storage/innobase/include/btr0pcur.h b/storage/innobase/include/btr0pcur.h index e00af130479..fab934ca0ee 100644 --- a/storage/innobase/include/btr0pcur.h +++ b/storage/innobase/include/btr0pcur.h @@ -99,7 +99,7 @@ btr_pcur_free( Initializes and opens a persistent cursor to an index tree. It should be closed with btr_pcur_close. */ UNIV_INLINE -void +dberr_t btr_pcur_open_low( /*==============*/ dict_index_t* index, /*!< in: index */ diff --git a/storage/innobase/include/btr0pcur.ic b/storage/innobase/include/btr0pcur.ic index 425593631d3..4490942a2bb 100644 --- a/storage/innobase/include/btr0pcur.ic +++ b/storage/innobase/include/btr0pcur.ic @@ -418,7 +418,7 @@ btr_pcur_free( Initializes and opens a persistent cursor to an index tree. It should be closed with btr_pcur_close. */ UNIV_INLINE -void +dberr_t btr_pcur_open_low( /*==============*/ dict_index_t* index, /*!< in: index */ @@ -471,6 +471,8 @@ btr_pcur_open_low( cursor->pos_state = BTR_PCUR_IS_POSITIONED; cursor->trx_if_known = NULL; + + return(err); } /**************************************************************//** diff --git a/storage/innobase/include/btr0scrub.h b/storage/innobase/include/btr0scrub.h index 608266c206d..8029cc91005 100644 --- a/storage/innobase/include/btr0scrub.h +++ b/storage/innobase/include/btr0scrub.h @@ -154,13 +154,10 @@ btr_scrub_start_space( ulint space, /*!< in: space */ btr_scrub_t* scrub_data); /*!< in/out: scrub data */ -/**************************************************************** -Complete iterating a space -* @return true if space was scrubbed */ +/** Complete iterating a space. +@param[in,out] scrub_data scrub data */ UNIV_INTERN -bool -btr_scrub_complete_space( -/*=====================*/ - btr_scrub_t* scrub_data); /*!< in/out: scrub data */ +void +btr_scrub_complete_space(btr_scrub_t* scrub_data); #endif diff --git a/storage/innobase/include/buf0buf.h b/storage/innobase/include/buf0buf.h index 7dee52d8f74..516898066aa 100644 --- a/storage/innobase/include/buf0buf.h +++ b/storage/innobase/include/buf0buf.h @@ -211,6 +211,7 @@ struct buf_pools_list_size_t { ulint unzip_LRU_bytes; /*!< unzip_LRU size in bytes */ ulint flush_list_bytes; /*!< flush_list size in bytes */ }; +#endif /* !UNIV_INNOCHECKSUM */ /** Page identifier. */ class page_id_t { @@ -333,6 +334,7 @@ operator<<( std::ostream& out, const page_id_t& page_id); +#ifndef UNIV_INNOCHECKSUM /********************************************************************//** Acquire mutex on all buffer pool instances */ UNIV_INLINE @@ -812,9 +814,8 @@ buf_page_is_zeroes( const byte* read_buf, const page_size_t& page_size); -/** Checks if a page is corrupt. -@param[in] check_lsn true if we need to check and complain about -the LSN +/** Check if a page is corrupt. +@param[in] check_lsn whether the LSN should be checked @param[in] read_buf database page @param[in] page_size page size @param[in] space tablespace @@ -824,9 +825,16 @@ buf_page_is_corrupted( bool check_lsn, const byte* read_buf, const page_size_t& page_size, - const fil_space_t* space = NULL -) MY_ATTRIBUTE((warn_unused_result)); #ifndef UNIV_INNOCHECKSUM + const fil_space_t* space = NULL) +#else + const void* space = NULL) +#endif + MY_ATTRIBUTE((warn_unused_result)); + + +#ifndef UNIV_INNOCHECKSUM + /**********************************************************************//** Gets the space id, page offset, and byte offset within page of a pointer pointing to a buffer frame containing a file page. */ @@ -885,24 +893,13 @@ buf_print(void); /*============*/ #endif /* UNIV_DEBUG_PRINT || UNIV_DEBUG || UNIV_BUF_DEBUG */ -enum buf_page_print_flags { - /** Do not crash at the end of buf_page_print(). */ - BUF_PAGE_PRINT_NO_CRASH = 1, - /** Do not print the full page dump. */ - BUF_PAGE_PRINT_NO_FULL = 2 -}; - -/** Prints a page to stderr. -@param[in] read_buf a database page -@param[in] page_size page size -@param[in] flags 0 or BUF_PAGE_PRINT_NO_CRASH or -BUF_PAGE_PRINT_NO_FULL */ +/** Dump a page to stderr. +@param[in] read_buf database page +@param[in] page_size page size */ +UNIV_INTERN void -buf_page_print( - const byte* read_buf, - const page_size_t& page_size, - ulint flags); - +buf_page_print(const byte* read_buf, const page_size_t& page_size) + ATTRIBUTE_COLD __attribute__((nonnull)); /********************************************************************//** Decompress a block. @return TRUE if successful */ @@ -1249,7 +1246,7 @@ buf_pointer_is_block_field( #define buf_pool_is_block_lock(l) \ buf_pointer_is_block_field((const void*)(l)) -/** Inits a page for read to the buffer buf_pool. If the page is +/** Initialize a page for read to the buffer buf_pool. If the page is (1) already in buf_pool, or (2) if we specify to read only ibuf pages and the page is not an ibuf page, or (3) if the space is deleted or being deleted, @@ -1260,26 +1257,33 @@ and the lock released later. @param[out] err DB_SUCCESS or DB_TABLESPACE_DELETED @param[in] mode BUF_READ_IBUF_PAGES_ONLY, ... @param[in] page_id page id -@param[in] unzip TRUE=request uncompressed page -@return pointer to the block or NULL */ +@param[in] unzip whether the uncompressed page is + requested (for ROW_FORMAT=COMPRESSED) +@return pointer to the block +@retval NULL in case of an error */ buf_page_t* buf_page_init_for_read( dberr_t* err, ulint mode, const page_id_t& page_id, const page_size_t& page_size, - ibool unzip); + bool unzip); + +/** Complete a read or write request of a file page to or from the buffer pool. +@param[in,out] bpage Page to complete +@param[in] evict whether or not to evict the page + from LRU list. +@return whether the operation succeeded +@retval DB_SUCCESS always when writing, or if a read page was OK +@retval DB_PAGE_CORRUPTED if the checksum fails on a page read +@retval DB_DECRYPTION_FAILED if page post encryption checksum matches but + after decryption normal page checksum does + not match */ +UNIV_INTERN +dberr_t +buf_page_io_complete(buf_page_t* bpage, bool evict = false) + MY_ATTRIBUTE((nonnull)); -/********************************************************************//** -Completes an asynchronous read or write request of a file page to or from -the buffer pool. -@return true if successful */ -bool -buf_page_io_complete( -/*=================*/ - buf_page_t* bpage, /*!< in: pointer to the block in question */ - bool evict = false);/*!< in: whether or not to evict - the page from LRU list. */ /********************************************************************//** Calculates the index of a buffer pool to the buf_pool[] array. @return the position of the buffer pool in buf_pool[] */ @@ -1513,20 +1517,13 @@ directory (buf) to see it. Do not use from outside! */ typedef struct { bool reserved; /*!< true if this slot is reserved */ -#ifdef HAVE_LZO - byte* lzo_mem; /*!< Temporal memory used by LZO */ -#endif byte* crypt_buf; /*!< for encryption the data needs to be copied to a separate buffer before it's encrypted&written. this as a page can be read while it's being flushed */ - byte* crypt_buf_free; /*!< for encryption, allocated buffer - that is then alligned */ byte* comp_buf; /*!< for compression we need temporal buffer because page can be read while it's being flushed */ - byte* comp_buf_free; /*!< for compression, allocated - buffer that is then alligned */ byte* out_buf; /*!< resulting buffer after encryption/compression. This is a pointer and not allocated. */ @@ -1586,7 +1583,6 @@ public: if written again we check is TRIM operation needed. */ - unsigned key_version; /*!< key version for this block */ bool encrypted; /*!< page is still encrypted */ ulint real_size; /*!< Real size of the page diff --git a/storage/innobase/include/buf0buf.ic b/storage/innobase/include/buf0buf.ic index f22dcc48a01..38c52d5e608 100644 --- a/storage/innobase/include/buf0buf.ic +++ b/storage/innobase/include/buf0buf.ic @@ -1286,9 +1286,8 @@ buf_page_release_zip( rw_lock_s_unlock(&block->debug_latch); } } - /* Fall through */ #endif /* UNIV_DEBUG */ - + /* Fall through */ case BUF_BLOCK_ZIP_PAGE: case BUF_BLOCK_ZIP_DIRTY: buf_block_unfix(reinterpret_cast(bpage)); diff --git a/storage/innobase/include/buf0checksum.h b/storage/innobase/include/buf0checksum.h index 9405251dc74..20955a5b2e6 100644 --- a/storage/innobase/include/buf0checksum.h +++ b/storage/innobase/include/buf0checksum.h @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -30,7 +31,7 @@ Created Aug 11, 2011 Vasil Dimov #include "buf0types.h" -/** Calculates the CRC32 checksum of a page. The value is stored to the page +/** Calculate the CRC32 checksum of a page. The value is stored to the page when it is written to a file and also checked for a match when reading from the file. When reading we allow both normal CRC32 and CRC-legacy-big-endian variants. Note that we must be careful to calculate the same value on 32-bit @@ -44,37 +45,30 @@ buf_calc_page_crc32( const byte* page, bool use_legacy_big_endian = false); -/********************************************************************//** -Calculates a page checksum which is stored to the page when it is written +/** Calculate a checksum which is stored to the page when it is written to a file. Note that we must be careful to calculate the same value on 32-bit and 64-bit architectures. +@param[in] page file page (srv_page_size bytes) @return checksum */ -ulint -buf_calc_page_new_checksum( -/*=======================*/ - const byte* page); /*!< in: buffer page */ +uint32_t +buf_calc_page_new_checksum(const byte* page); -/********************************************************************//** -In versions < 4.0.14 and < 4.1.1 there was a bug that the checksum only -looked at the first few bytes of the page. This calculates that old -checksum. +/** In MySQL before 4.0.14 or 4.1.1 there was an InnoDB bug that +the checksum only looked at the first few bytes of the page. +This calculates that old checksum. NOTE: we must first store the new formula checksum to FIL_PAGE_SPACE_OR_CHKSUM before calculating and storing this old checksum because this takes that field as an input! +@param[in] page file page (srv_page_size bytes) @return checksum */ -ulint -buf_calc_page_old_checksum( -/*=======================*/ - const byte* page); /*!< in: buffer page */ +uint32_t +buf_calc_page_old_checksum(const byte* page); - -/********************************************************************//** -Return a printable string describing the checksum algorithm. +/** Return a printable string describing the checksum algorithm. +@param[in] algo algorithm @return algorithm name */ const char* -buf_checksum_algorithm_name( -/*========================*/ - srv_checksum_algorithm_t algo); /*!< in: algorithm */ +buf_checksum_algorithm_name(srv_checksum_algorithm_t algo); extern ulong srv_checksum_algorithm; extern bool legacy_big_endian_checksum; diff --git a/storage/innobase/include/buf0dblwr.h b/storage/innobase/include/buf0dblwr.h index e1ecb6baf56..598609e2be4 100644 --- a/storage/innobase/include/buf0dblwr.h +++ b/storage/innobase/include/buf0dblwr.h @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under @@ -38,24 +38,27 @@ extern buf_dblwr_t* buf_dblwr; /** Set to TRUE when the doublewrite buffer is being created */ extern ibool buf_dblwr_being_created; -/****************************************************************//** -Creates the doublewrite buffer to a new InnoDB installation. The header of the -doublewrite buffer is placed on the trx system header page. -@return true if successful, false if not. */ +/** Create the doublewrite buffer if the doublewrite buffer header +is not present in the TRX_SYS page. +@return whether the operation succeeded +@retval true if the doublewrite buffer exists or was created +@retval false if the creation failed (too small first data file) */ MY_ATTRIBUTE((warn_unused_result)) bool buf_dblwr_create(); -/****************************************************************//** -At a database startup initializes the doublewrite buffer memory structure if +/** +At database startup initializes the doublewrite buffer memory structure if we already have a doublewrite buffer created in the data files. If we are upgrading to an InnoDB version which supports multiple tablespaces, then this function performs the necessary update operations. If we are in a crash recovery, this function loads the pages from double write buffer into memory. +@param[in] file File handle +@param[in] path Path name of file @return DB_SUCCESS or error code */ dberr_t buf_dblwr_init_or_load_pages( - os_file_t file, + pfs_os_file_t file, const char* path); /** Process and remove the double write buffer pages for all tablespaces. */ diff --git a/storage/innobase/include/buf0rea.h b/storage/innobase/include/buf0rea.h index 9c97a5147c1..5c766b9412a 100644 --- a/storage/innobase/include/buf0rea.h +++ b/storage/innobase/include/buf0rea.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2015, MariaDB Corporation. +Copyright (c) 2015, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -37,12 +37,15 @@ an exclusive lock on the buffer frame. The flag is cleared and the x-lock released by the i/o-handler thread. @param[in] page_id page id @param[in] page_size page size -@return TRUE if page has been read in, FALSE in case of failure */ -ibool +@retval DB_SUCCESS if the page was read and is not corrupted, +@retval DB_PAGE_CORRUPTED if page based on checksum check is corrupted, +@retval DB_DECRYPTION_FAILED if page post encryption checksum matches but +after decryption normal page checksum does not match. +@retval DB_TABLESPACE_DELETED if tablespace .ibd file is missing */ +dberr_t buf_read_page( const page_id_t& page_id, - const page_size_t& page_size, - buf_page_t** bpage); + const page_size_t& page_size); /********************************************************************//** High-level function which reads a page asynchronously from a file to the @@ -51,9 +54,8 @@ an exclusive lock on the buffer frame. The flag is cleared and the x-lock released by the i/o-handler thread. @param[in] page_id page id @param[in] page_size page size -@param[in] sync true if synchronous aio is desired -@return TRUE if page has been read in, FALSE in case of failure */ -ibool +@param[in] sync true if synchronous aio is desired */ +void buf_read_page_background( const page_id_t& page_id, const page_size_t& page_size, diff --git a/storage/innobase/include/data0type.h b/storage/innobase/include/data0type.h index 3fa8320b5aa..35dcf2f3397 100644 --- a/storage/innobase/include/data0type.h +++ b/storage/innobase/include/data0type.h @@ -77,28 +77,18 @@ binary strings */ charset-collation for tables created with it can also be latin1_swedish_ci */ -/* DATA_POINT&DATA_VAR_POINT are for standard geometry datatype 'point' and -DATA_GEOMETRY include all other standard geometry datatypes as described in -OGC standard(line_string, polygon, multi_point, multi_polygon, +/* DATA_GEOMETRY includes all standard geometry datatypes as described in +OGC standard(point, line_string, polygon, multi_point, multi_polygon, multi_line_string, geometry_collection, geometry). Currently, geometry data is stored in the standard Well-Known Binary(WKB) format (http://www.opengeospatial.org/standards/sfa). -We use BLOB as underlying datatype for DATA_GEOMETRY and DATA_VAR_POINT -while CHAR for DATA_POINT */ +We use BLOB as the underlying datatype. */ #define DATA_GEOMETRY 14 /* geometry datatype of variable length */ -/* The following two are disabled temporarily, we won't create them in -get_innobase_type_from_mysql_type(). -TODO: We will enable DATA_POINT/them when we come to the fixed-length POINT -again. */ -#define DATA_POINT 15 /* geometry datatype of fixed length POINT */ -#define DATA_VAR_POINT 16 /* geometry datatype of variable length - POINT, used when we want to store POINT - as BLOB internally */ #define DATA_MTYPE_MAX 63 /* dtype_store_for_order_and_null_size() requires the values are <= 63 */ #define DATA_MTYPE_CURRENT_MIN DATA_VARCHAR /* minimum value of mtype */ -#define DATA_MTYPE_CURRENT_MAX DATA_VAR_POINT /* maximum value of mtype */ +#define DATA_MTYPE_CURRENT_MAX DATA_GEOMETRY /* maximum value of mtype */ /*-------------------------------------------*/ /* The 'PRECISE TYPE' of a column */ /* @@ -211,15 +201,6 @@ store the charset-collation number; one byte is left unused, though */ /* Maximum multi-byte character length in bytes, plus 1 */ #define DATA_MBMAX 5 -/* For DATA_POINT of dimension 2, the length of value in btree is always 25, -which is the summary of: -SRID_SIZE(4) + WKB_HEADER_SIZE(1+4) + POINT_DATA_SIZE(8*2). -So the length of physical record or POINT KEYs on btree are 25. -GIS_TODO: When we support multi-dimensions DATA_POINT, we should get the -length from corresponding column or index definition, instead of this MACRO -*/ -#define DATA_POINT_LEN 25 - /* Pack mbminlen, mbmaxlen to mbminmaxlen. */ #define DATA_MBMINMAXLEN(mbminlen, mbmaxlen) \ unsigned((mbmaxlen) * DATA_MBMAX + (mbminlen)) @@ -229,18 +210,12 @@ length from corresponding column or index definition, instead of this MACRO /* Get mbmaxlen from mbminmaxlen. */ #define DATA_MBMAXLEN(mbminmaxlen) unsigned((mbminmaxlen) / DATA_MBMAX) -/* For checking if a geom_type is POINT */ -#define DATA_POINT_MTYPE(mtype) ((mtype) == DATA_POINT \ - || (mtype) == DATA_VAR_POINT) - /* For checking if mtype is GEOMETRY datatype */ -#define DATA_GEOMETRY_MTYPE(mtype) (DATA_POINT_MTYPE(mtype) \ - || (mtype) == DATA_GEOMETRY) +#define DATA_GEOMETRY_MTYPE(mtype) ((mtype) == DATA_GEOMETRY) /* For checking if mtype is BLOB or GEOMETRY, since we use BLOB as -the underling datatype of GEOMETRY(not DATA_POINT) data. */ +the underlying datatype of GEOMETRY data. */ #define DATA_LARGE_MTYPE(mtype) ((mtype) == DATA_BLOB \ - || (mtype) == DATA_VAR_POINT \ || (mtype) == DATA_GEOMETRY) /* For checking if data type is big length data type. */ diff --git a/storage/innobase/include/data0type.ic b/storage/innobase/include/data0type.ic index 9ec85dfaf50..3d2f46ed877 100644 --- a/storage/innobase/include/data0type.ic +++ b/storage/innobase/include/data0type.ic @@ -504,7 +504,6 @@ dtype_get_fixed_size_low( case DATA_INT: case DATA_FLOAT: case DATA_DOUBLE: - case DATA_POINT: return(len); case DATA_MYSQL: if (prtype & DATA_BINARY_TYPE) { @@ -527,12 +526,12 @@ dtype_get_fixed_size_low( return(len); } } - /* fall through for variable-length charsets */ + /* Treat as variable-length. */ + /* Fall through */ case DATA_VARCHAR: case DATA_BINARY: case DATA_DECIMAL: case DATA_VARMYSQL: - case DATA_VAR_POINT: case DATA_GEOMETRY: case DATA_BLOB: return(0); @@ -579,7 +578,6 @@ dtype_get_min_size_low( case DATA_INT: case DATA_FLOAT: case DATA_DOUBLE: - case DATA_POINT: return(len); case DATA_MYSQL: if (prtype & DATA_BINARY_TYPE) { @@ -602,7 +600,6 @@ dtype_get_min_size_low( case DATA_BINARY: case DATA_DECIMAL: case DATA_VARMYSQL: - case DATA_VAR_POINT: case DATA_GEOMETRY: case DATA_BLOB: return(0); @@ -636,9 +633,7 @@ dtype_get_max_size_low( case DATA_BINARY: case DATA_DECIMAL: case DATA_VARMYSQL: - case DATA_POINT: return(len); - case DATA_VAR_POINT: case DATA_GEOMETRY: case DATA_BLOB: break; diff --git a/storage/innobase/include/db0err.h b/storage/innobase/include/db0err.h index b0609991f61..ef6f8b39abb 100644 --- a/storage/innobase/include/db0err.h +++ b/storage/innobase/include/db0err.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2015, MariaDB Corporation. +Copyright (c) 2015, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -163,6 +163,8 @@ enum dberr_t { DB_IO_NO_PUNCH_HOLE, /*!< Punch hole not supported by file system. */ + DB_PAGE_CORRUPTED, /* Page read from tablespace is + corrupted. */ /* The following are partial failure codes */ DB_FAIL = 1000, DB_OVERFLOW, diff --git a/storage/innobase/include/dict0crea.h b/storage/innobase/include/dict0crea.h index f53ea74717d..76eb48d1e7e 100644 --- a/storage/innobase/include/dict0crea.h +++ b/storage/innobase/include/dict0crea.h @@ -45,7 +45,7 @@ tab_create_graph_create( a memory data structure */ mem_heap_t* heap, /*!< in: heap where created */ fil_encryption_t mode, /*!< in: encryption mode */ - ulint key_id); /*!< in: encryption key_id */ + uint32_t key_id); /*!< in: encryption key_id */ /** Creates an index create graph. @param[in] index index to create, built as a memory data structure @@ -305,7 +305,7 @@ struct tab_node_t{ /* Local storage for this graph node */ ulint state; /*!< node execution state */ ulint col_no; /*!< next column definition to insert */ - ulint key_id; /*!< encryption key_id */ + uint key_id; /*!< encryption key_id */ fil_encryption_t mode; /*!< encryption mode */ ulint base_col_no; /*!< next base column to insert */ mem_heap_t* heap; /*!< memory heap used as auxiliary diff --git a/storage/innobase/include/dict0dict.h b/storage/innobase/include/dict0dict.h index 18578388723..04baf032ded 100644 --- a/storage/innobase/include/dict0dict.h +++ b/storage/innobase/include/dict0dict.h @@ -1730,9 +1730,6 @@ struct dict_sys_t{ on name */ hash_table_t* table_id_hash; /*!< hash table of the tables, based on id */ - lint size; /*!< varying space in bytes occupied - by the data dictionary table and - index objects */ dict_table_t* sys_tables; /*!< SYS_TABLES table */ dict_table_t* sys_columns; /*!< SYS_COLUMNS table */ dict_table_t* sys_indexes; /*!< SYS_INDEXES table */ @@ -1870,7 +1867,7 @@ dict_set_corrupted( dict_index_t* index, /*!< in/out: index */ trx_t* trx, /*!< in/out: transaction */ const char* ctx) /*!< in: context */ - UNIV_COLD MY_ATTRIBUTE((nonnull)); + ATTRIBUTE_COLD __attribute__((nonnull)); /** Flags an index corrupted in the data dictionary cache only. This is used mostly to mark a corrupted index when index's own dictionary @@ -1889,6 +1886,14 @@ dict_set_corrupted_by_space( /*========================*/ ulint space_id); /*!< in: space ID */ +/** Flag a table with specified space_id encrypted in the data dictionary +cache +@param[in] space_id Tablespace id */ +UNIV_INTERN +void +dict_set_encrypted_by_space( + ulint space_id); + /** Sets merge_threshold in the SYS_INDEXES @param[in,out] index index @param[in] merge_threshold value to set */ @@ -2024,6 +2029,13 @@ dict_table_decode_n_col( ulint* n_col, ulint* n_v_col); +/** Calculate the used memory occupied by the data dictionary +table and index objects. +@return number of bytes occupied. */ +UNIV_INTERN +ulint +dict_sys_get_size(); + /** Look for any dictionary objects that are found in the given tablespace. @param[in] space_id Tablespace ID to search for. @return true if tablespace is empty. */ diff --git a/storage/innobase/include/dict0dict.ic b/storage/innobase/include/dict0dict.ic index 8849be1206d..9aaf506b2e3 100644 --- a/storage/innobase/include/dict0dict.ic +++ b/storage/innobase/include/dict0dict.ic @@ -638,6 +638,48 @@ dict_table_has_fts_index( return(DICT_TF2_FLAG_IS_SET(table, DICT_TF2_FTS)); } +/** Validate the flags for tables that are not ROW_FORMAT=REDUNDANT. +@param[in] flags table flags +@return whether the flags are valid */ +inline +bool +dict_tf_is_valid_not_redundant(ulint flags) +{ + const bool atomic_blobs = DICT_TF_HAS_ATOMIC_BLOBS(flags); + + ulint zip_ssize = DICT_TF_GET_ZIP_SSIZE(flags); + + if (!zip_ssize) { + /* Not ROW_FORMAT=COMPRESSED */ + } else if (!atomic_blobs) { + /* ROW_FORMAT=COMPRESSED implies ROW_FORMAT=DYNAMIC + for the uncompressed page format */ + return(false); + } else if (zip_ssize > PAGE_ZIP_SSIZE_MAX + || zip_ssize > UNIV_PAGE_SIZE_SHIFT + || UNIV_PAGE_SIZE_SHIFT > UNIV_ZIP_SIZE_SHIFT_MAX) { + /* KEY_BLOCK_SIZE is out of bounds, or + ROW_FORMAT=COMPRESSED is not supported with this + innodb_page_size (only up to 16KiB) */ + return(false); + } + + switch (DICT_TF_GET_PAGE_COMPRESSION_LEVEL(flags)) { + case 0: + /* PAGE_COMPRESSION_LEVEL=0 should imply PAGE_COMPRESSED=NO */ + return(!DICT_TF_GET_PAGE_COMPRESSION(flags)); + case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: + /* PAGE_COMPRESSION_LEVEL requires + ROW_FORMAT=COMPACT or ROW_FORMAT=DYNAMIC + (not ROW_FORMAT=COMPRESSED or ROW_FORMAT=REDUNDANT) + and PAGE_COMPRESSED=YES */ + return(!zip_ssize && DICT_TF_GET_PAGE_COMPRESSION(flags)); + default: + /* Invalid PAGE_COMPRESSION_LEVEL value */ + return(false); + } +} + /** Validate the table flags. @param[in] flags Table flags @return true if valid. */ @@ -646,75 +688,19 @@ bool dict_tf_is_valid( ulint flags) { - bool compact = DICT_TF_GET_COMPACT(flags); - ulint zip_ssize = DICT_TF_GET_ZIP_SSIZE(flags); - bool atomic_blobs = DICT_TF_HAS_ATOMIC_BLOBS(flags); - bool data_dir = DICT_TF_HAS_DATA_DIR(flags); - ulint unused = DICT_TF_GET_UNUSED(flags); - bool page_compression = DICT_TF_GET_PAGE_COMPRESSION(flags); - ulint page_compression_level = DICT_TF_GET_PAGE_COMPRESSION_LEVEL(flags); - bool flags_corrupt = false; - - /* Make sure there are no bits that we do not know about. */ - if (unused != 0) { - flags_corrupt = true; + ut_ad(flags < 1U << DICT_TF_BITS); + /* The DATA_DIRECTORY flag can be assigned fully independently + of all other persistent table flags. */ + flags &= ~DICT_TF_MASK_DATA_DIR; + if (!(flags & 1)) { + /* Only ROW_FORMAT=REDUNDANT has 0 in the least significant + bit. For ROW_FORMAT=REDUNDANT, only the DATA_DIR flag + (which we cleared above) can be set. If any other flags + are set, the flags are invalid. */ + return(flags == 0); } - if (atomic_blobs) { - /* Barracuda row formats COMPRESSED and DYNAMIC both use - atomic_blobs, which build on the page structure introduced - for the COMPACT row format by allowing keys in secondary - indexes to be made from data stored off-page in the - clustered index. */ - - if (!compact) { - flags_corrupt = true; - } - - } else if (zip_ssize) { - /* Antelope does not support COMPRESSED row format. */ - flags_corrupt = true; - } - - if (zip_ssize) { - - /* COMPRESSED row format must have compact and atomic_blobs - bits set and validate the number is within allowed range. */ - - if (!compact - || !atomic_blobs - || zip_ssize > PAGE_ZIP_SSIZE_MAX) { - flags_corrupt = true; - } - } - - if (page_compression || page_compression_level) { - /* Page compression format must have compact and - atomic_blobs and page_compression_level requires - page_compression */ - if (!compact - || !page_compression - || !atomic_blobs) { - flags_corrupt = true; - } - } - - - if (flags_corrupt) { - ib::error() - << "InnoDB: Error: table unused flags are:" << flags - << " in the data dictionary and are corrupted:" - << " compact:" << compact - << " atomic_blobs:" << atomic_blobs - << " unused:" << unused - << " data_dir:" << data_dir - << " zip_ssize:" << zip_ssize - << " page_compression:" << page_compression - << " page_compression_level:" << page_compression_level; - return (false); - } else { - return(true); - } + return(dict_tf_is_valid_not_redundant(flags)); } /** Validate both table flags and table flags2 and make sure they @@ -739,112 +725,6 @@ dict_tf2_is_valid( return(true); } -/********************************************************************//** -Validate a SYS_TABLES TYPE field and return it. -@return Same as input after validating it as a SYS_TABLES TYPE field. -If there is an error, return ULINT_UNDEFINED. */ -UNIV_INLINE -ulint -dict_sys_tables_type_validate( -/*==========================*/ - ulint type, /*!< in: SYS_TABLES.TYPE */ - ulint n_cols) /*!< in: SYS_TABLES.N_COLS */ -{ - ulint low_order_bit = DICT_TF_GET_COMPACT(type); - ulint redundant = !(n_cols & DICT_N_COLS_COMPACT); - ulint zip_ssize = DICT_TF_GET_ZIP_SSIZE(type); - ulint atomic_blobs = DICT_TF_HAS_ATOMIC_BLOBS(type); - ulint unused = DICT_TF_GET_UNUSED(type); - bool page_compression = DICT_TF_GET_PAGE_COMPRESSION(type); - ulint page_compression_level = DICT_TF_GET_PAGE_COMPRESSION_LEVEL(type); - - /* The low order bit of SYS_TABLES.TYPE is always set to 1. - If the format is UNIV_FORMAT_B or higher, this field is the same - as dict_table_t::flags. Zero is not allowed here. */ - if (!low_order_bit) { - return(ULINT_UNDEFINED); - } - - if (redundant) { - if (zip_ssize || atomic_blobs) { - ib::error() - << "SYS_TABLES::TYPE=Redundant, zip_ssize:" << zip_ssize - << " atomic_blobs:" << atomic_blobs; - return(ULINT_UNDEFINED); - } - } - - /* Make sure there are no bits that we do not know about. */ - if (unused) { - ib::error() - << "SYS_TABLES::TYPE=" << type << " unused:" << unused; - return(ULINT_UNDEFINED); - } - - if (atomic_blobs) { - /* Barracuda row formats COMPRESSED and DYNAMIC build on - the page structure introduced for the COMPACT row format - by allowing keys in secondary indexes to be made from - data stored off-page in the clustered index. - - The DICT_N_COLS_COMPACT flag should be in N_COLS, - but we already know that. */ - - } else if (zip_ssize) { - /* Antelope does not support COMPRESSED format. */ - ib::error() - << "SYS_TABLES::TYPE=" << type - << ", zip_ssize:" << zip_ssize; - - return(ULINT_UNDEFINED); - } - - if (zip_ssize) { - /* COMPRESSED row format must have low_order_bit and - atomic_blobs bits set and the DICT_N_COLS_COMPACT flag - should be in N_COLS, but we already know about the - low_order_bit and DICT_N_COLS_COMPACT flags. */ - if (!atomic_blobs) { - ib::error() << "SYS_TABLES::TYPE=" << type - << ", zip_ssize:" << zip_ssize - << ", atomic_blobs:" << atomic_blobs; - return(ULINT_UNDEFINED); - } - - /* Validate that the number is within allowed range. */ - if (zip_ssize > PAGE_ZIP_SSIZE_MAX) { - ib::error() << "SYS_TABLES::TYPE=" << type - << ", zip_ssize:" << zip_ssize - << " > " << PAGE_ZIP_SSIZE_MAX; - return(ULINT_UNDEFINED); - } - } - - /* There is nothing to validate for the data_dir field. - CREATE TABLE ... DATA DIRECTORY is supported for any row - format, so the DATA_DIR flag is compatible with any other - table flags. However, it is not used with TEMPORARY tables. */ - - if (page_compression || page_compression_level) { - /* page compressed row format must have low_order_bit and - atomic_blobs bits set and the DICT_N_COLS_COMPACT flag - should be in N_COLS, but we already know about the - low_order_bit and DICT_N_COLS_COMPACT flags. */ - - if (!atomic_blobs || !page_compression) { - ib::error() << "SYS_TABLES::TYPE=" << type - << " page_compression:" << page_compression - << " page_compression_level:" << page_compression_level - << " atomic_blobs:" << atomic_blobs; - - return(ULINT_UNDEFINED); - } - } - - /* Return the validated SYS_TABLES.TYPE. */ - return(type); -} - /********************************************************************//** Determine the file format from dict_table_t::flags The low order bit will be zero for REDUNDANT and 1 for COMPACT. For any @@ -978,7 +858,6 @@ dict_tf_to_fsp_flags(ulint table_flags) ulint fsp_flags; ulint page_compression_level = DICT_TF_GET_PAGE_COMPRESSION_LEVEL( table_flags); - ulint atomic_writes = DICT_TF_GET_ATOMIC_WRITES(table_flags); ut_ad((DICT_TF_GET_PAGE_COMPRESSION(table_flags) == 0) == (page_compression_level == 0)); @@ -999,53 +878,17 @@ dict_tf_to_fsp_flags(ulint table_flags) fsp_flags |= FSP_FLAGS_MASK_PAGE_COMPRESSION; } - ut_a(fsp_flags_is_valid(fsp_flags)); + ut_a(fsp_flags_is_valid(fsp_flags, false)); if (DICT_TF_HAS_DATA_DIR(table_flags)) { fsp_flags |= 1U << FSP_FLAGS_MEM_DATA_DIR; } - fsp_flags |= atomic_writes << FSP_FLAGS_MEM_ATOMIC_WRITES; fsp_flags |= page_compression_level << FSP_FLAGS_MEM_COMPRESSION_LEVEL; return(fsp_flags); } -/********************************************************************//** -Convert a 32 bit integer from SYS_TABLES.TYPE to dict_table_t::flags -The following chart shows the translation of the low order bit. -Other bits are the same. -========================= Low order bit ========================== - | REDUNDANT | COMPACT | COMPRESSED and DYNAMIC -SYS_TABLES.TYPE | 1 | 1 | 1 -dict_table_t::flags | 0 | 1 | 1 -================================================================== -@return ulint containing SYS_TABLES.TYPE */ -UNIV_INLINE -ulint -dict_sys_tables_type_to_tf( -/*=======================*/ - ulint type, /*!< in: SYS_TABLES.TYPE field */ - ulint n_cols) /*!< in: SYS_TABLES.N_COLS field */ -{ - ulint flags; - ulint redundant = !(n_cols & DICT_N_COLS_COMPACT); - - /* Adjust bit zero. */ - flags = redundant ? 0 : 1; - - /* ZIP_SSIZE, ATOMIC_BLOBS, DATA_DIR, PAGE_COMPRESSION, - PAGE_COMPRESSION_LEVEL are the same. */ - flags |= type & (DICT_TF_MASK_ZIP_SSIZE - | DICT_TF_MASK_ATOMIC_BLOBS - | DICT_TF_MASK_DATA_DIR - | DICT_TF_MASK_PAGE_COMPRESSION - | DICT_TF_MASK_PAGE_COMPRESSION_LEVEL); - - ut_ad(!DICT_TF_GET_ZIP_SSIZE(flags) || DICT_TF_HAS_ATOMIC_BLOBS(flags)); - return(flags); -} - /********************************************************************//** Convert a 32 bit integer table flags to the 32bit integer that is written to a SYS_TABLES.TYPE field. The following chart shows the translation of @@ -1680,7 +1523,7 @@ dict_index_is_corrupted( ut_ad(index->magic_n == DICT_INDEX_MAGIC_N); return((index->type & DICT_CORRUPT) - || (index->table && index->table->corrupted)); + || (index->table && index->table->corrupted)); } /********************************************************************//** diff --git a/storage/innobase/include/dict0load.h b/storage/innobase/include/dict0load.h index fb443caf770..22fd27c2484 100644 --- a/storage/innobase/include/dict0load.h +++ b/storage/innobase/include/dict0load.h @@ -119,7 +119,7 @@ a foreign key references columns in this table. @param[in] ignore_err Error to be ignored when loading table and its index definition @return table, NULL if does not exist; if the table is stored in an -.ibd file, but the file does not exist, then we set the ibd_file_missing +.ibd file, but the file does not exist, then we set the file_unreadable flag in the table object we return. */ dict_table_t* dict_load_table( diff --git a/storage/innobase/include/dict0mem.h b/storage/innobase/include/dict0mem.h index 0630137bb4f..daa5af95a71 100644 --- a/storage/innobase/include/dict0mem.h +++ b/storage/innobase/include/dict0mem.h @@ -137,22 +137,12 @@ This flag prevents older engines from attempting to open the table and allows InnoDB to update_create_info() accordingly. */ #define DICT_TF_WIDTH_DATA_DIR 1 -/** Width of the SHARED tablespace flag (Oracle MYSQL 5.7). -Not supported by MariaDB. */ -#define DICT_TF_WIDTH_SHARED_SPACE 1 - /** Width of the page compression flag */ #define DICT_TF_WIDTH_PAGE_COMPRESSION 1 #define DICT_TF_WIDTH_PAGE_COMPRESSION_LEVEL 4 -/** -Width of the page encryption flag -*/ -#define DICT_TF_WIDTH_PAGE_ENCRYPTION 1 -#define DICT_TF_WIDTH_PAGE_ENCRYPTION_KEY 8 - /** Width of atomic writes flag DEFAULT=0, ON = 1, OFF = 2 @@ -164,15 +154,8 @@ DEFAULT=0, ON = 1, OFF = 2 + DICT_TF_WIDTH_ZIP_SSIZE \ + DICT_TF_WIDTH_ATOMIC_BLOBS \ + DICT_TF_WIDTH_DATA_DIR \ - + DICT_TF_WIDTH_SHARED_SPACE \ + DICT_TF_WIDTH_PAGE_COMPRESSION \ - + DICT_TF_WIDTH_PAGE_COMPRESSION_LEVEL \ - + DICT_TF_WIDTH_ATOMIC_WRITES \ - + DICT_TF_WIDTH_PAGE_ENCRYPTION \ - + DICT_TF_WIDTH_PAGE_ENCRYPTION_KEY) - -/** A mask of all the known/used bits in table flags */ -#define DICT_TF_BIT_MASK (~(~0U << DICT_TF_BITS)) + + DICT_TF_WIDTH_PAGE_COMPRESSION_LEVEL) /** Zero relative shift position of the COMPACT field */ #define DICT_TF_POS_COMPACT 0 @@ -185,26 +168,17 @@ DEFAULT=0, ON = 1, OFF = 2 /** Zero relative shift position of the DATA_DIR field */ #define DICT_TF_POS_DATA_DIR (DICT_TF_POS_ATOMIC_BLOBS \ + DICT_TF_WIDTH_ATOMIC_BLOBS) -/** Zero relative shift position of the SHARED TABLESPACE field */ -#define DICT_TF_POS_SHARED_SPACE (DICT_TF_POS_DATA_DIR \ - + DICT_TF_WIDTH_DATA_DIR) /** Zero relative shift position of the PAGE_COMPRESSION field */ -#define DICT_TF_POS_PAGE_COMPRESSION (DICT_TF_POS_SHARED_SPACE \ - + DICT_TF_WIDTH_SHARED_SPACE) +#define DICT_TF_POS_PAGE_COMPRESSION (DICT_TF_POS_DATA_DIR \ + + DICT_TF_WIDTH_DATA_DIR) /** Zero relative shift position of the PAGE_COMPRESSION_LEVEL field */ #define DICT_TF_POS_PAGE_COMPRESSION_LEVEL (DICT_TF_POS_PAGE_COMPRESSION \ + DICT_TF_WIDTH_PAGE_COMPRESSION) /** Zero relative shift position of the ATOMIC_WRITES field */ #define DICT_TF_POS_ATOMIC_WRITES (DICT_TF_POS_PAGE_COMPRESSION_LEVEL \ + DICT_TF_WIDTH_PAGE_COMPRESSION_LEVEL) -/** Zero relative shift position of the PAGE_ENCRYPTION field */ -#define DICT_TF_POS_PAGE_ENCRYPTION (DICT_TF_POS_ATOMIC_WRITES \ +#define DICT_TF_POS_UNUSED (DICT_TF_POS_ATOMIC_WRITES \ + DICT_TF_WIDTH_ATOMIC_WRITES) -/** Zero relative shift position of the PAGE_ENCRYPTION_KEY field */ -#define DICT_TF_POS_PAGE_ENCRYPTION_KEY (DICT_TF_POS_PAGE_ENCRYPTION \ - + DICT_TF_WIDTH_PAGE_ENCRYPTION) -#define DICT_TF_POS_UNUSED (DICT_TF_POS_PAGE_ENCRYPTION_KEY \ - + DICT_TF_WIDTH_PAGE_ENCRYPTION_KEY) /** Bit mask of the COMPACT field */ #define DICT_TF_MASK_COMPACT \ @@ -234,14 +208,6 @@ DEFAULT=0, ON = 1, OFF = 2 #define DICT_TF_MASK_ATOMIC_WRITES \ ((~(~0U << DICT_TF_WIDTH_ATOMIC_WRITES)) \ << DICT_TF_POS_ATOMIC_WRITES) -/** Bit mask of the PAGE_ENCRYPTION field */ -#define DICT_TF_MASK_PAGE_ENCRYPTION \ - ((~(~0U << DICT_TF_WIDTH_PAGE_ENCRYPTION)) \ - << DICT_TF_POS_PAGE_ENCRYPTION) -/** Bit mask of the PAGE_ENCRYPTION_KEY field */ -#define DICT_TF_MASK_PAGE_ENCRYPTION_KEY \ - ((~(~0U << DICT_TF_WIDTH_PAGE_ENCRYPTION_KEY)) \ - << DICT_TF_POS_PAGE_ENCRYPTION_KEY) /** Return the value of the COMPACT field */ #define DICT_TF_GET_COMPACT(flags) \ @@ -271,18 +237,7 @@ DEFAULT=0, ON = 1, OFF = 2 #define DICT_TF_GET_ATOMIC_WRITES(flags) \ ((flags & DICT_TF_MASK_ATOMIC_WRITES) \ >> DICT_TF_POS_ATOMIC_WRITES) -/** Return the contents of the PAGE_ENCRYPTION field */ -#define DICT_TF_GET_PAGE_ENCRYPTION(flags) \ - ((flags & DICT_TF_MASK_PAGE_ENCRYPTION) \ - >> DICT_TF_POS_PAGE_ENCRYPTION) -/** Return the contents of the PAGE_ENCRYPTION KEY field */ -#define DICT_TF_GET_PAGE_ENCRYPTION_KEY(flags) \ - ((flags & DICT_TF_MASK_PAGE_ENCRYPTION_KEY) \ - >> DICT_TF_POS_PAGE_ENCRYPTION_KEY) -/** Return the contents of the UNUSED bits */ -#define DICT_TF_GET_UNUSED(flags) \ - (flags >> DICT_TF_POS_UNUSED) /* @} */ /** @brief Table Flags set number 2. @@ -294,9 +249,8 @@ ROW_FORMAT=REDUNDANT. InnoDB engines do not check these flags for unknown bits in order to protect backward incompatibility. */ /* @{ */ /** Total number of bits in table->flags2. */ -#define DICT_TF2_BITS 9 -#define DICT_TF2_UNUSED_BIT_MASK (~0U << DICT_TF2_BITS | \ - 1U << DICT_TF_POS_SHARED_SPACE) +#define DICT_TF2_BITS 7 +#define DICT_TF2_UNUSED_BIT_MASK (~0U << DICT_TF2_BITS) #define DICT_TF2_BIT_MASK ~DICT_TF2_UNUSED_BIT_MASK /** TEMPORARY; TRUE for tables from CREATE TEMPORARY TABLE. */ @@ -918,8 +872,6 @@ struct dict_index_t{ dict_field_t* fields; /*!< array of field descriptions */ st_mysql_ftparser* parser; /*!< fulltext parser plugin */ - bool is_ngram; - /*!< true if it's ngram parser */ bool has_new_v_col; /*!< whether it has a newly added virtual column in ALTER */ @@ -1012,6 +964,13 @@ struct dict_index_t{ ut_ad(committed || !(type & DICT_CLUSTERED)); uncommitted = !committed; } + + /** @return whether this index is readable + @retval true normally + @retval false if this is a single-table tablespace + and the .ibd file is missing, or a + page cannot be read or decrypted */ + inline bool is_readable() const; }; /** The status of online index creation */ @@ -1349,14 +1308,19 @@ struct dict_table_t { /** Acquire the table handle. */ inline void acquire(); - void* thd; /*!< thd */ - bool page_0_read; /*!< true if page 0 has - been already read */ - fil_space_crypt_t *crypt_data; /*!< crypt data if present */ - /** Release the table handle. */ inline void release(); + /** @return whether this table is readable + @retval true normally + @retval false if this is a single-table tablespace + and the .ibd file is missing, or a + page cannot be read or decrypted */ + bool is_readable() const + { + return(UNIV_LIKELY(!file_unreadable)); + } + /** Id of the table. */ table_id_t id; @@ -1398,15 +1362,12 @@ struct dict_table_t { 5 whether the table is being created its own tablespace, 6 whether the table has been DISCARDed, 7 whether the aux FTS tables names are in hex. - 8 whether the table is instinc table. - 9 whether the table has encryption setting. Use DICT_TF2_FLAG_IS_SET() to parse this flag. */ unsigned flags2:DICT_TF2_BITS; - /** TRUE if this is in a single-table tablespace and the .ibd file is - missing. Then we must return in ha_innodb.cc an error if the user - tries to query such an orphaned table. */ - unsigned ibd_file_missing:1; + /*!< whether this is in a single-table tablespace and the .ibd + file is missing or page decryption failed and page is corrupted */ + unsigned file_unreadable:1; /** TRUE if the table object has been added to the dictionary cache. */ unsigned cached:1; @@ -1727,8 +1688,6 @@ public: /** Timestamp of the last modification of this table. */ time_t update_time; - bool is_encrypted; - #ifdef UNIV_DEBUG /** Value of 'magic_n'. */ #define DICT_TABLE_MAGIC_N 76333786 @@ -1741,6 +1700,11 @@ public: dict_vcol_templ_t* vc_templ; }; +inline bool dict_index_t::is_readable() const +{ + return(UNIV_LIKELY(!table->file_unreadable)); +} + /*******************************************************************//** Initialise the table lock list. */ void diff --git a/storage/innobase/include/dict0stats.h b/storage/innobase/include/dict0stats.h index f02b8eb8eed..8846aeda7fd 100644 --- a/storage/innobase/include/dict0stats.h +++ b/storage/innobase/include/dict0stats.h @@ -110,6 +110,13 @@ dict_stats_deinit( dict_table_t* table) /*!< in/out: table */ MY_ATTRIBUTE((nonnull)); +/** Update the table modification counter and if necessary, +schedule new estimates for table and index statistics to be calculated. +@param[in,out] table persistent or temporary table */ +void +dict_stats_update_if_needed(dict_table_t* table) + MY_ATTRIBUTE((nonnull)); + /*********************************************************************//** Calculates new estimates for table and index statistics. The statistics are used in query optimization. @@ -252,6 +259,17 @@ dict_stats_save_index_stat( const char* stat_description, trx_t* trx); +/** Report an error if updating table statistics failed because +.ibd file is missing, table decryption failed or table is corrupted. +@param[in,out] table Table +@param[in] defragment true if statistics is for defragment +@retval DB_DECRYPTION_FAILED if decryption of the table failed +@retval DB_TABLESPACE_DELETED if .ibd file is missing +@retval DB_CORRUPTION if table is marked as corrupted */ +dberr_t +dict_stats_report_error(dict_table_t* table, bool defragment = false) + MY_ATTRIBUTE((nonnull, warn_unused_result)); + #include "dict0stats.ic" #ifdef UNIV_ENABLE_UNIT_TEST_DICT_STATS diff --git a/storage/innobase/include/dict0stats_bg.h b/storage/innobase/include/dict0stats_bg.h index b7bf1b0c170..f99cbeed780 100644 --- a/storage/innobase/include/dict0stats_bg.h +++ b/storage/innobase/include/dict0stats_bg.h @@ -46,17 +46,6 @@ extern mysql_pfs_key_t dict_stats_recalc_pool_mutex_key; extern my_bool innodb_dict_stats_disabled_debug; #endif /* UNIV_DEBUG */ -/*****************************************************************//** -Add a table to the recalc pool, which is processed by the -background stats gathering thread. Only the table id is added to the -list, so the table can be closed after being enqueued and it will be -opened when needed. If the table does not exist later (has been DROPped), -then it will be removed from the pool and skipped. */ -void -dict_stats_recalc_pool_add( -/*=======================*/ - const dict_table_t* table); /*!< in: table to add */ - /*****************************************************************//** Delete a given table from the auto recalc pool. dict_stats_recalc_pool_del() */ @@ -151,7 +140,7 @@ DECLARE_THREAD(dict_stats_thread)( void* arg); /*!< in: a dummy parameter required by os_thread_create */ -/** Shutdown the dict stats thread. */ +/** Shut down the dict_stats_thread. */ void dict_stats_shutdown(); diff --git a/storage/innobase/include/fil0crypt.h b/storage/innobase/include/fil0crypt.h index ca65df21402..13b3ec4e37e 100644 --- a/storage/innobase/include/fil0crypt.h +++ b/storage/innobase/include/fil0crypt.h @@ -30,6 +30,7 @@ Created 04/01/2015 Jan Lindström #include "os0event.h" #include "my_crypt.h" +#endif /*! UNIV_INNOCHECKSUM */ /** * Magic pattern in start of crypt data on page 0 @@ -101,6 +102,8 @@ struct fil_space_rotate_state_t } scrubbing; }; +#ifndef UNIV_INNOCHECKSUM + struct fil_space_crypt_t : st_encryption_scheme { public: @@ -116,8 +119,7 @@ struct fil_space_crypt_t : st_encryption_scheme min_key_version(new_min_key_version), page0_offset(0), encryption(new_encryption), - mutex(), - key_found(new_min_key_version), + key_found(0), rotate_state() { key_id = new_key_id; @@ -134,6 +136,8 @@ struct fil_space_crypt_t : st_encryption_scheme type = CRYPT_SCHEME_1; min_key_version = key_get_latest_version(); } + + key_found = min_key_version; } /** Destructor */ @@ -205,7 +209,7 @@ struct fil_space_crypt_status_t { uint min_key_version; /*!< min key version */ uint current_key_version;/*!< current key version */ uint keyserver_requests;/*!< no of key requests to key server */ - ulint key_id; /*!< current key_id */ + uint key_id; /*!< current key_id */ bool rotating; /*!< is key rotation ongoing */ bool flushing; /*!< is flush at end of rotation ongoing */ ulint rotate_next_page_number; /*!< next page if key rotating */ @@ -293,13 +297,15 @@ Parse a MLOG_FILE_WRITE_CRYPT_DATA log entry @param[in] ptr Log entry start @param[in] end_ptr Log entry end @param[in] block buffer block +@param[out] err DB_SUCCESS or DB_DECRYPTION_FAILED @return position on log buffer */ UNIV_INTERN -const byte* +byte* fil_parse_write_crypt_data( - const byte* ptr, + byte* ptr, const byte* end_ptr, - const buf_block_t* block) + const buf_block_t* block, + dberr_t* err) MY_ATTRIBUTE((warn_unused_result)); /** Encrypt a buffer. @@ -382,7 +388,7 @@ Calculate post encryption checksum @return page checksum or BUF_NO_CHECKSUM_MAGIC not needed. */ UNIV_INTERN -ulint +uint32_t fil_crypt_calculate_checksum( const page_size_t& page_size, const byte* dst_frame) diff --git a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h index cef5b578a4a..d3336c5f5b5 100644 --- a/storage/innobase/include/fil0fil.h +++ b/storage/innobase/include/fil0fil.h @@ -28,8 +28,6 @@ Created 10/25/1995 Heikki Tuuri #define fil0fil_h #include "univ.i" -struct fil_space_t; - #ifndef UNIV_INNOCHECKSUM #include "log0recv.h" @@ -180,9 +178,6 @@ struct fil_space_t { /** MariaDB encryption data */ fil_space_crypt_t* crypt_data; - /** tablespace crypt data has been read */ - bool page_0_crypt_read; - /** True if we have already printed compression failure */ bool printed_compression_failure; @@ -217,7 +212,7 @@ struct fil_node_t { /** file name; protected by fil_system->mutex and log_sys->mutex. */ char* name; /** file handle (valid if is_open) */ - os_file_t handle; + pfs_os_file_t handle; /** event that groups and serializes calls to fsync; os_event_set() and os_event_reset() are protected by fil_system_t::mutex */ @@ -284,22 +279,23 @@ but in the MySQL Embedded Server Library and mysqlbackup it is not the default directory, and we must set the base file path explicitly */ extern const char* fil_path_to_mysql_datadir; -/** Initial size of a single-table tablespace in pages */ -#define FIL_IBD_FILE_INITIAL_SIZE 4 - -/** 'null' (undefined) page offset in the context of file spaces */ -#define FIL_NULL ULINT32_UNDEFINED - /* Space address data type; this is intended to be used when addresses accurate to a byte are stored in file pages. If the page part of the address is FIL_NULL, the address is considered undefined. */ typedef byte fil_faddr_t; /*!< 'type' definition in C: an address stored in a file page is a string of bytes */ +#endif /* !UNIV_INNOCHECKSUM */ + +/** Initial size of a single-table tablespace in pages */ +#define FIL_IBD_FILE_INITIAL_SIZE 4 + +/** 'null' (undefined) page offset in the context of file spaces */ +#define FIL_NULL ULINT32_UNDEFINED + #define FIL_ADDR_PAGE 0 /* first in address is the page offset */ #define FIL_ADDR_BYTE 4 /* then comes 2-byte byte offset within page*/ -#endif /* !UNIV_INNOCHECKSUM */ #define FIL_ADDR_SIZE 6 /* address size is 6 bytes */ #ifndef UNIV_INNOCHECKSUM @@ -434,8 +430,6 @@ index */ #define fil_page_index_page_check(page) \ fil_page_type_is_index(fil_page_get_type(page)) -#ifndef UNIV_INNOCHECKSUM - /** Enum values for encryption table option */ enum fil_encryption_t { /** Encrypted if innodb_encrypt_tables=ON (srv_encrypt_tables) */ @@ -457,6 +451,8 @@ extern ulint fil_n_pending_tablespace_flushes; /** Number of files currently open */ extern ulint fil_n_file_opened; +#ifndef UNIV_INNOCHECKSUM + /** Look up a tablespace. The caller should hold an InnoDB table lock or a MDL that prevents the tablespace from being dropped during the operation, @@ -586,7 +582,6 @@ Error messages are issued to the server log. @param[in] flags tablespace flags @param[in] purpose tablespace purpose @param[in,out] crypt_data encryption information -@param[in] create_table whether this is CREATE TABLE @param[in] mode encryption mode @return pointer to created tablespace, to be filled in with fil_node_create() @retval NULL on failure (such as when the same tablespace exists) */ @@ -597,7 +592,6 @@ fil_space_create( ulint flags, fil_type_t purpose, fil_space_crypt_t* crypt_data, - bool create_table, fil_encryption_t mode = FIL_ENCRYPTION_DEFAULT) MY_ATTRIBUTE((warn_unused_result)); @@ -733,11 +727,26 @@ MY_ATTRIBUTE((warn_unused_result)); Used by background threads that do not necessarily hold proper locks for concurrency control. @param[in] id tablespace ID +@param[in] silent whether to silently ignore missing tablespaces @return the tablespace @retval NULL if missing or being deleted or truncated */ +UNIV_INTERN +fil_space_t* +fil_space_acquire_low(ulint id, bool silent) + MY_ATTRIBUTE((warn_unused_result)); + +/** Acquire a tablespace when it could be dropped concurrently. +Used by background threads that do not necessarily hold proper locks +for concurrency control. +@param[in] id tablespace ID +@return the tablespace +@retval NULL if missing or being deleted or truncated */ +inline fil_space_t* fil_space_acquire(ulint id) - MY_ATTRIBUTE((warn_unused_result)); +{ + return (fil_space_acquire_low(id, false)); +} /** Acquire a tablespace that may not exist. Used by background threads that do not necessarily hold proper locks @@ -745,9 +754,12 @@ for concurrency control. @param[in] id tablespace ID @return the tablespace @retval NULL if missing or being deleted */ +inline fil_space_t* fil_space_acquire_silent(ulint id) - MY_ATTRIBUTE((warn_unused_result)); +{ + return (fil_space_acquire_low(id, true)); +} /** Release a tablespace acquired with fil_space_acquire(). @param[in,out] space tablespace to release */ @@ -803,9 +815,10 @@ public: /** Constructor: Look up the tablespace and increment the reference count if found. - @param[in] space_id tablespace ID */ - explicit FilSpace(ulint space_id) - : m_space(fil_space_acquire(space_id)) {} + @param[in] space_id tablespace ID + @param[in] silent whether not to display errors */ + explicit FilSpace(ulint space_id, bool silent = false) + : m_space(fil_space_acquire_low(space_id, silent)) {} /** Assignment operator: This assumes that fil_space_acquire() has already been done for the fil_space_t. The caller must @@ -835,6 +848,13 @@ public: return(m_space); } + /** Member accessor + @return the wrapped object */ + const fil_space_t* operator->() const + { + return(m_space); + } + /** Explicit type conversion @return the wrapped object */ const fil_space_t* operator()() const @@ -943,12 +963,12 @@ fil_prepare_for_truncate( /** Reinitialize the original tablespace header with the same space id for single tablespace -@param[in] id space id of the tablespace +@param[in] table table belongs to the tablespace @param[in] size size in blocks @param[in] trx Transaction covering truncate */ void -fil_reinit_space_header( - ulint id, +fil_reinit_space_header_for_table( + dict_table_t* table, ulint size, trx_t* trx); @@ -1044,8 +1064,8 @@ fil_ibd_create( ulint flags, ulint size, fil_encryption_t mode, - ulint key_id) - MY_ATTRIBUTE((warn_unused_result)); + uint32_t key_id) + MY_ATTRIBUTE((nonnull(2), warn_unused_result)); /** Try to adjust FSP_SPACE_FLAGS if they differ from the expectations. (Typically when upgrading from MariaDB 10.1.0..10.1.20.) @@ -1092,8 +1112,7 @@ fil_ibd_open( ulint id, ulint flags, const char* tablename, - const char* path_in, - dict_table_t* table) /*!< in: table */ + const char* path_in) MY_ATTRIBUTE((warn_unused_result)); enum fil_load_status { @@ -1155,7 +1174,6 @@ fil_space_for_table_exists_in_mem( when find table space mismatch */ mem_heap_t* heap, /*!< in: heap memory */ table_id_t table_id, /*!< in: table id */ - dict_table_t* table, /*!< in: table or NULL */ ulint table_flags); /*!< in: table flags */ /** Try to extend a tablespace if it is smaller than the specified size. @@ -1206,7 +1224,7 @@ fil_space_get_n_reserved_extents( aligned @param[in] message message for aio handler if non-sync aio used, else ignored - +@param[in] ignore_missing_space true=ignore missing space during read @return DB_SUCCESS, DB_TABLESPACE_DELETED or DB_TABLESPACE_TRUNCATED if we are trying to do i/o on a tablespace which does not exist */ dberr_t @@ -1218,7 +1236,9 @@ fil_io( ulint byte_offset, ulint len, void* buf, - void* message); + void* message, + bool ignore_missing_space = false); + /**********************************************************************//** Waits for an aio operation to complete. This function is used to write the handler for completed requests. The aio array of pending requests is divided @@ -1296,16 +1316,17 @@ fil_page_reset_type( byte* page, ulint type, mtr_t* mtr); + /** Get the file page type. @param[in] page file page @return page type */ inline -ulint -fil_page_get_type( - const byte* page) +uint16_t +fil_page_get_type(const byte* page) { return(mach_read_from_2(page + FIL_PAGE_TYPE)); } + /** Check (and if needed, reset) the page type. Data files created before MySQL 5.1 may contain garbage in the FIL_PAGE_TYPE field. @@ -1385,19 +1406,19 @@ struct PageCallback { /** Called for every page in the tablespace. If the page was not updated then its state must be set to BUF_PAGE_NOT_USED. For compressed tables the page descriptor memory will be at offset: - block->frame + UNIV_PAGE_SIZE; + block->frame + UNIV_PAGE_SIZE; @param offset physical offset within the file @param block block read from file, note it is not from the buffer pool @retval DB_SUCCESS or error code. */ virtual dberr_t operator()( - os_offset_t offset, + os_offset_t offset, buf_block_t* block) UNIV_NOTHROW = 0; /** Set the name of the physical file and the file handle that is used to open it for the file that is being iterated over. - @param filename then physical name of the tablespace file. + @param filename the name of the tablespace file @param file OS file handle */ - void set_file(const char* filename, os_file_t file) UNIV_NOTHROW + void set_file(const char* filename, pfs_os_file_t file) UNIV_NOTHROW { m_file = file; m_filepath = filename; @@ -1422,7 +1443,7 @@ struct PageCallback { page_size_t m_page_size; /** File handle to the tablespace */ - os_file_t m_file; + pfs_os_file_t m_file; /** Physical file path. */ const char* m_filepath; @@ -1507,13 +1528,6 @@ fil_mtr_rename_log( /** Release the fil_system mutex. */ #define fil_system_exit() mutex_exit(&fil_system->mutex) -/*******************************************************************//** -Returns the table space by a given id, NULL if not found. */ -fil_space_t* -fil_space_found_by_id( -/*==================*/ - ulint id); /*!< in: space id */ - /*******************************************************************//** Returns the table space by a given id, NULL if not found. */ fil_space_t* @@ -1521,6 +1535,13 @@ fil_space_get_by_id( /*================*/ ulint id); /*!< in: space id */ +/** Look up a tablespace. +@param[in] name tablespace name +@return tablespace +@retval NULL if not found */ +fil_space_t* +fil_space_get_by_name(const char* name); + /*******************************************************************//** by redo log. @param[in,out] space tablespace */ diff --git a/storage/innobase/include/fil0fil.ic b/storage/innobase/include/fil0fil.ic index e3d4fd4d88b..9505cc0bd69 100644 --- a/storage/innobase/include/fil0fil.ic +++ b/storage/innobase/include/fil0fil.ic @@ -74,19 +74,6 @@ fil_get_page_type_name( } } -/****************************************************************//** -Get block size from fil node -@return block size*/ -UNIV_INLINE -ulint -fil_node_get_block_size( -/*====================*/ - fil_node_t* node) /*!< in: Node where to get block - size */ -{ - return (node->block_size); -} - /****************************************************************//** Validate page type. @return true if valid, false if not */ diff --git a/storage/innobase/include/fil0pagecompress.h b/storage/innobase/include/fil0pagecompress.h index cd754151d80..be10f99d0f0 100644 --- a/storage/innobase/include/fil0pagecompress.h +++ b/storage/innobase/include/fil0pagecompress.h @@ -46,9 +46,8 @@ fil_compress_page( ulint level, /* in: compression level */ ulint block_size, /*!< in: block size */ bool encrypted, /*!< in: is page also encrypted */ - ulint* out_len, /*!< out: actual length of compressed + ulint* out_len); /*!< out: actual length of compressed page */ - byte* lzo_mem); /*!< in: temporal memory used by LZO */ /****************************************************************//** For page compressed pages decompress the page after actual read @@ -67,23 +66,4 @@ fil_decompress_page( /*!< in: true if only an error should be produced when decompression fails. By default this parameter is false. */ - -/****************************************************************//** -Get space id from fil node -@return space id*/ -UNIV_INTERN -ulint -fil_node_get_space_id( -/*==================*/ - fil_node_t* node); /*!< in: Node where to get space id*/ - -/****************************************************************//** -Get block size from fil node -@return block size*/ -UNIV_INLINE -ulint -fil_node_get_block_size( -/*====================*/ - fil_node_t* node); /*!< in: Node where to get block - size */ #endif diff --git a/storage/innobase/include/fsp0file.h b/storage/innobase/include/fsp0file.h index 1c4ac8152c9..1f057be0877 100644 --- a/storage/innobase/include/fsp0file.h +++ b/storage/innobase/include/fsp0file.h @@ -54,7 +54,7 @@ public: m_name(), m_filepath(), m_filename(), - m_handle(OS_FILE_CLOSED), + m_handle(), m_open_flags(OS_FILE_OPEN), m_size(), m_order(), @@ -66,8 +66,7 @@ public: m_first_page_buf(), m_first_page(), m_last_os_error(), - m_file_info(), - m_crypt_info() + m_file_info() { /* No op */ } @@ -77,7 +76,7 @@ public: m_name(mem_strdup(name)), m_filepath(), m_filename(), - m_handle(OS_FILE_CLOSED), + m_handle(), m_open_flags(OS_FILE_OPEN), m_size(size), m_order(order), @@ -89,8 +88,7 @@ public: m_first_page_buf(), m_first_page(), m_last_os_error(), - m_file_info(), - m_crypt_info() + m_file_info() { ut_ad(m_name != NULL); /* No op */ @@ -110,8 +108,7 @@ public: m_first_page_buf(), m_first_page(), m_last_os_error(), - m_file_info(), - m_crypt_info() + m_file_info() { m_name = mem_strdup(file.m_name); ut_ad(m_name != NULL); @@ -169,8 +166,6 @@ public: it should be reread if needed */ m_first_page_buf = NULL; m_first_page = NULL; - /* Do not copy crypt info it is read from first page */ - m_crypt_info = NULL; return(*this); } @@ -274,7 +269,7 @@ public: /** Get Datafile::m_handle. @return m_handle */ - os_file_t handle() const + pfs_os_file_t handle() const { return(m_handle); } @@ -321,11 +316,6 @@ public: return(m_last_os_error); } - fil_space_crypt_t* get_crypt_info() const - { - return(m_crypt_info); - } - /** Test if the filepath provided looks the same as this filepath by string comparison. If they are two different paths to the same file, same_as() will be used to show that after the files are opened. @@ -339,6 +329,11 @@ public: @return true if it is the same file, else false */ bool same_as(const Datafile& other) const; + /** Get access to the first data page. + It is valid after open_read_only() succeeded. + @return the first data page */ + const byte* get_first_page() const { return(m_first_page); } + private: /** Free the filepath buffer. */ void free_filepath(); @@ -416,7 +411,7 @@ private: char* m_filename; /** Open file handle */ - os_file_t m_handle; + pfs_os_file_t m_handle; /** Flags to use for opening the data file */ os_file_create_t m_open_flags; @@ -465,9 +460,6 @@ public: /* Use field st_ino. */ struct stat m_file_info; #endif /* WIN32 */ - - /** Encryption information */ - fil_space_crypt_t* m_crypt_info; }; diff --git a/storage/innobase/include/fsp0fsp.h b/storage/innobase/include/fsp0fsp.h index f6fee72300c..6697c1f37ed 100644 --- a/storage/innobase/include/fsp0fsp.h +++ b/storage/innobase/include/fsp0fsp.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2017, MariaDB Corporation. All Rights Reserved. +Copyright (c) 2013, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -158,8 +158,6 @@ descriptor page, but used only in the first. */ FSP_FREE_LIMIT at a time */ /* @} */ -#ifndef UNIV_INNOCHECKSUM - /* @defgroup File Segment Inode Constants (moved from fsp0fsp.c) @{ */ /* FILE SEGMENT INODE @@ -293,6 +291,7 @@ the extent are free and which contain old tuple version to clean. */ /** Offset of the descriptor array on a descriptor page */ #define XDES_ARR_OFFSET (FSP_HEADER_OFFSET + FSP_HEADER_SIZE) +#ifndef UNIV_INNOCHECKSUM /* @} */ /**********************************************************************//** @@ -397,18 +396,12 @@ fsp_header_init_fields( ulint space_id, /*!< in: space id */ ulint flags); /*!< in: tablespace flags (FSP_SPACE_FLAGS): 0, or table->flags if newer than COMPACT */ - -/** Initializes the space header of a new created space and creates also the -insert buffer tree root if space == 0. +/** Initialize a tablespace header. @param[in] space_id space id @param[in] size current size in blocks -@param[in,out] mtr min-transaction -@return true on success, otherwise false. */ -bool -fsp_header_init( - ulint space_id, - ulint size, - mtr_t* mtr); +@param[in,out] mtr mini-transaction */ +void +fsp_header_init(ulint space_id, ulint size, mtr_t* mtr); /**********************************************************************//** Increases the space size field of a space. */ @@ -595,15 +588,12 @@ fseg_free_page_func( # define fseg_free_page(header, space_id, page, ahi, mtr) \ fseg_free_page_func(header, space_id, page, mtr) #endif /* BTR_CUR_HASH_ADAPT */ -/**********************************************************************//** -Checks if a single page of a segment is free. -@return true if free */ +/** Determine whether a page is free. +@param[in,out] space tablespace +@param[in] page page number +@return whether the page is marked as free */ bool -fseg_page_is_free( -/*==============*/ - fseg_header_t* seg_header, /*!< in: segment header */ - ulint space_id, /*!< in: space id */ - ulint page) /*!< in: page offset */ +fseg_page_is_free(fil_space_t* space, unsigned page) MY_ATTRIBUTE((nonnull, warn_unused_result)); /**********************************************************************//** Frees part of a segment. This function can be used to free a segment @@ -785,7 +775,7 @@ fsp_flags_convert_from_101(ulint flags) flags = ((flags & 0x3f) | ssize << FSP_FLAGS_POS_PAGE_SSIZE | FSP_FLAGS_GET_PAGE_COMPRESSION_MARIADB101(flags) << FSP_FLAGS_POS_PAGE_COMPRESSION); - ut_ad(fsp_flags_is_valid(flags)); + ut_ad(fsp_flags_is_valid(flags, false)); return(flags); } @@ -799,7 +789,7 @@ bool fsp_flags_match(ulint expected, ulint actual) { expected &= ~FSP_FLAGS_MEM_MASK; - ut_ad(fsp_flags_is_valid(expected)); + ut_ad(fsp_flags_is_valid(expected, false)); if (actual == expected) { return(true); @@ -841,22 +831,6 @@ xdes_calc_descriptor_page( const page_size_t& page_size, ulint offset); -/**********************************************************************//** -Checks if a single page is free. -@return true if free */ -UNIV_INTERN -bool -fsp_page_is_free_func( -/*==============*/ - ulint space, /*!< in: space id */ - ulint page, /*!< in: page offset */ - mtr_t* mtr, /*!< in/out: mini-transaction */ - const char *file, - unsigned line); - -#define fsp_page_is_free(space,page,mtr) \ - fsp_page_is_free_func(space,page,mtr, __FILE__, __LINE__) - #endif /* UNIV_INNOCHECKSUM */ #include "fsp0fsp.ic" diff --git a/storage/innobase/include/fsp0fsp.ic b/storage/innobase/include/fsp0fsp.ic index 6317a67a089..2da3320eef7 100644 --- a/storage/innobase/include/fsp0fsp.ic +++ b/storage/innobase/include/fsp0fsp.ic @@ -53,6 +53,7 @@ xdes_calc_descriptor_index( return(ut_2pow_remainder(offset, page_size.physical()) / FSP_EXTENT_SIZE); } +#endif /*!UNIV_INNOCHECKSUM */ /**********************************************************************//** Gets a descriptor bit of a page. @@ -80,6 +81,7 @@ xdes_get_bit( bit_index)); } +#ifndef UNIV_INNOCHECKSUM /** Calculates the page where the descriptor of a page resides. @param[in] page_size page size @param[in] offset page offset diff --git a/storage/innobase/include/fsp0space.h b/storage/innobase/include/fsp0space.h index 0b66827ab49..9f869fda158 100644 --- a/storage/innobase/include/fsp0space.h +++ b/storage/innobase/include/fsp0space.h @@ -44,6 +44,10 @@ public: /** Data file information - each Datafile can be accessed globally */ files_t m_files; + /** Data file iterator */ + typedef files_t::iterator iterator; + /** Data file iterator */ + typedef files_t::const_iterator const_iterator; Tablespace() : @@ -62,16 +66,21 @@ public: shutdown(); ut_ad(m_files.empty()); ut_ad(m_space_id == ULINT_UNDEFINED); - if (m_path != NULL) { - ut_free(m_path); - m_path = NULL; - } } // Disable copying Tablespace(const Tablespace&); Tablespace& operator=(const Tablespace&); + /** Data file iterator */ + const_iterator begin() const { return m_files.begin(); } + /** Data file iterator */ + const_iterator end() const { return m_files.end(); } + /** Data file iterator */ + iterator begin() { return m_files.begin(); } + /** Data file iterator */ + iterator end() { return m_files.end(); } + void set_name(const char* name) { m_name = name; } const char* name() const { return m_name; } @@ -120,7 +129,7 @@ public: @param[in] fsp_flags tablespace flags */ void set_flags(ulint fsp_flags) { - ut_ad(fsp_flags_is_valid(fsp_flags)); + ut_ad(fsp_flags_is_valid(fsp_flags, false)); m_flags = fsp_flags; } @@ -140,7 +149,7 @@ public: /** Get the tablespace encryption key_id @return m_key_id tablespace encryption key_id */ - ulint key_id() const + uint32_t key_id() const { return (m_key_id); } @@ -160,8 +169,7 @@ public: { ulint sum = 0; - for (files_t::const_iterator it = m_files.begin(); - it != m_files.end(); ++it) { + for (const_iterator it = begin(); it != end(); ++it) { sum += it->m_size; } @@ -204,7 +212,7 @@ private: /** @param[in] filename Name to lookup in the data files. @return true if the filename exists in the data files */ - bool find(const char* filename); + bool find(const char* filename) const; /** Note that the data file was found. @param[in] file data file object */ @@ -226,7 +234,7 @@ private: /** Encryption mode and key_id */ fil_encryption_t m_mode; - ulint m_key_id; + uint32_t m_key_id; protected: /** Ignore server read only configuration for this tablespace. */ diff --git a/storage/innobase/include/fsp0sysspace.h b/storage/innobase/include/fsp0sysspace.h index 4c88b268f34..efbd4fc3f24 100644 --- a/storage/innobase/include/fsp0sysspace.h +++ b/storage/innobase/include/fsp0sysspace.h @@ -53,8 +53,7 @@ public: m_last_file_size_max(), m_created_new_raw(), m_is_tablespace_full(false), - m_sanity_checks_done(false), - m_crypt_info() + m_sanity_checks_done(false) { /* No op */ } @@ -264,9 +263,6 @@ private: /** if false, then sanity checks are still pending */ bool m_sanity_checks_done; - - /** Encryption information */ - fil_space_crypt_t* m_crypt_info; }; /* GLOBAL OBJECTS */ @@ -287,16 +283,6 @@ is_system_tablespace(ulint id) return(id == TRX_SYS_SPACE || id == SRV_TMP_SPACE_ID); } -/** Check if shared-system or undo tablespace. -@return true if shared-system or undo tablespace */ -UNIV_INLINE -bool -is_system_or_undo_tablespace( - ulint id) -{ - return(id <= srv_undo_tablespaces_open); -} - /** Check if predefined shared tablespace. @return true if predefined shared tablespace */ UNIV_INLINE @@ -306,7 +292,8 @@ is_predefined_tablespace( { ut_ad(srv_sys_space.space_id() == TRX_SYS_SPACE); ut_ad(TRX_SYS_SPACE == 0); - return(id <= srv_undo_tablespaces_open - || id == SRV_TMP_SPACE_ID); + return(id == TRX_SYS_SPACE + || id == SRV_TMP_SPACE_ID + || srv_is_undo_tablespace(id)); } #endif /* fsp0sysspace_h */ diff --git a/storage/innobase/include/fsp0types.h b/storage/innobase/include/fsp0types.h index cd2a07af4f0..c6dbe52def4 100644 --- a/storage/innobase/include/fsp0types.h +++ b/storage/innobase/include/fsp0types.h @@ -278,10 +278,8 @@ The flags below only exist in fil_space_t::flags, not in FSP_SPACE_FLAGS: /** Zero relative shift position of the DATA_DIR flag */ #define FSP_FLAGS_MEM_DATA_DIR 25 -/** Zero relative shift position of the ATOMIC_WRITES field */ -#define FSP_FLAGS_MEM_ATOMIC_WRITES 26 /** Zero relative shift position of the COMPRESSION_LEVEL field */ -#define FSP_FLAGS_MEM_COMPRESSION_LEVEL 28 +#define FSP_FLAGS_MEM_COMPRESSION_LEVEL 26 /** Zero relative shift position of the POST_ANTELOPE field */ #define FSP_FLAGS_POS_POST_ANTELOPE 0 @@ -327,10 +325,6 @@ these are only used in MySQL 5.7 and used for compatibility. */ ((~(~0U << FSP_FLAGS_WIDTH_PAGE_COMPRESSION)) \ << FSP_FLAGS_POS_PAGE_COMPRESSION) -/** Bit mask of the in-memory ATOMIC_WRITES field */ -#define FSP_FLAGS_MASK_MEM_ATOMIC_WRITES \ - (3U << FSP_FLAGS_MEM_ATOMIC_WRITES) - /** Bit mask of the in-memory COMPRESSION_LEVEL field */ #define FSP_FLAGS_MASK_MEM_COMPRESSION_LEVEL \ (15U << FSP_FLAGS_MEM_COMPRESSION_LEVEL) @@ -371,21 +365,18 @@ these are only used in MySQL 5.7 and used for compatibility. */ #define FSP_FLAGS_GET_PAGE_COMPRESSION_LEVEL(flags) \ ((flags & FSP_FLAGS_MASK_MEM_COMPRESSION_LEVEL) \ >> FSP_FLAGS_MEM_COMPRESSION_LEVEL) -/** @return the ATOMIC_WRITES field */ -#define FSP_FLAGS_GET_ATOMIC_WRITES(flags) \ - ((flags & FSP_FLAGS_MASK_MEM_ATOMIC_WRITES) \ - >> FSP_FLAGS_MEM_ATOMIC_WRITES) /* @} */ /** Validate the tablespace flags, which are stored in the tablespace header at offset FSP_SPACE_FLAGS. @param[in] flags the contents of FSP_SPACE_FLAGS +@param[in] is_ibd whether this is an .ibd file (not system tablespace) @return whether the flags are correct (not in the buggy 10.1) format */ MY_ATTRIBUTE((warn_unused_result, const)) UNIV_INLINE bool -fsp_flags_is_valid(ulint flags) +fsp_flags_is_valid(ulint flags, bool is_ibd) { DBUG_EXECUTE_IF("fsp_flags_is_valid_failure", return(false);); @@ -432,7 +423,12 @@ fsp_flags_is_valid(ulint flags) return(false); } - return(true); + /* The flags do look valid. But, avoid misinterpreting + buggy MariaDB 10.1 format flags for + PAGE_COMPRESSED=1 PAGE_COMPRESSION_LEVEL={0,2,3} + as valid-looking PAGE_SSIZE if this is known to be + an .ibd file and we are using the default innodb_page_size=16k. */ + return(ssize == 0 || !is_ibd || srv_page_size != UNIV_PAGE_SIZE_ORIG); } #endif /* fsp0types_h */ diff --git a/storage/innobase/include/fts0priv.h b/storage/innobase/include/fts0priv.h index 80ebcf09d6d..f9d5d07a44c 100644 --- a/storage/innobase/include/fts0priv.h +++ b/storage/innobase/include/fts0priv.h @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 2011, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -215,13 +216,10 @@ fts_write_node( fts_node_t* node) /*!< in: node columns */ MY_ATTRIBUTE((warn_unused_result)); -/** Check fts token -1. for ngram token, check whether the token contains any words in stopwords -2. for non-ngram token, check if it's stopword or less than fts_min_token_size +/** Check if a fts token is a stopword or less than fts_min_token_size or greater than fts_max_token_size. @param[in] token token string @param[in] stopwords stopwords rb tree -@param[in] is_ngram is ngram parser @param[in] cs token charset @retval true if it is not stopword and length in range @retval false if it is stopword or length not in range */ @@ -229,7 +227,6 @@ bool fts_check_token( const fts_string_t* token, const ib_rbt_t* stopwords, - bool is_ngram, const CHARSET_INFO* cs); /******************************************************************//** diff --git a/storage/innobase/include/fts0types.h b/storage/innobase/include/fts0types.h index c1db160602f..55a698e8b66 100644 --- a/storage/innobase/include/fts0types.h +++ b/storage/innobase/include/fts0types.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2007, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -277,8 +277,6 @@ struct fts_doc_t { st_mysql_ftparser* parser; /*!< fts plugin parser */ - bool is_ngram; /*!< Whether it is a ngram parser */ - ib_rbt_t* stopwords; /*!< Stopwords */ }; diff --git a/storage/innobase/include/fts0types.ic b/storage/innobase/include/fts0types.ic index 417a1010919..a8712751412 100644 --- a/storage/innobase/include/fts0types.ic +++ b/storage/innobase/include/fts0types.ic @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 2007, 2015, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -115,19 +116,14 @@ bool fts_is_charset_cjk( const CHARSET_INFO* cs) { - if (strcmp(cs->name, "gb2312_chinese_ci") == 0 - || strcmp(cs->name, "gbk_chinese_ci") == 0 - || strcmp(cs->name, "big5_chinese_ci") == 0 - || strcmp(cs->name, "gb18030_chinese_ci") == 0 - || strcmp(cs->name, "ujis_japanese_ci") == 0 - || strcmp(cs->name, "sjis_japanese_ci") == 0 - || strcmp(cs->name, "cp932_japanese_ci") == 0 - || strcmp(cs->name, "eucjpms_japanese_ci") == 0 - || strcmp(cs->name, "euckr_korean_ci") == 0) { - return(true); - } else { - return(false); - } + return cs == &my_charset_gb2312_chinese_ci + || cs == &my_charset_gbk_chinese_ci + || cs == &my_charset_big5_chinese_ci + || cs == &my_charset_ujis_japanese_ci + || cs == &my_charset_sjis_japanese_ci + || cs == &my_charset_cp932_japanese_ci + || cs == &my_charset_eucjpms_japanese_ci + || cs == &my_charset_euckr_korean_ci; } /** Select the FTS auxiliary index for the given character by range. diff --git a/storage/innobase/include/lock0lock.h b/storage/innobase/include/lock0lock.h index e718189062d..b3de1bf27f2 100644 --- a/storage/innobase/include/lock0lock.h +++ b/storage/innobase/include/lock0lock.h @@ -302,32 +302,6 @@ lock_rec_insert_check_and_lock( record */ MY_ATTRIBUTE((warn_unused_result)); -/*********************************************************************//** -Enqueues a waiting request for a lock which cannot be granted immediately. -Checks for deadlocks. -@return DB_LOCK_WAIT, DB_DEADLOCK, or DB_QUE_THR_SUSPENDED, or -DB_SUCCESS_LOCKED_REC; DB_SUCCESS_LOCKED_REC means that -there was a deadlock, but another transaction was chosen as a victim, -and we got the lock immediately: no need to wait then */ -dberr_t -lock_rec_enqueue_waiting( -/*=====================*/ - ulint type_mode,/*!< in: lock mode this - transaction is requesting: - LOCK_S or LOCK_X, possibly - ORed with LOCK_GAP or - LOCK_REC_NOT_GAP, ORed with - LOCK_INSERT_INTENTION if this - waiting lock request is set - when performing an insert of - an index record */ - const buf_block_t* block, /*!< in: buffer block containing - the record */ - ulint heap_no,/*!< in: heap number of the record */ - dict_index_t* index, /*!< in: index of record */ - que_thr_t* thr, /*!< in: query thread */ - lock_prdt_t* prdt); /*!< in: Minimum Bounding Box */ - /*********************************************************************//** Checks if locks of other transactions prevent an immediate modify (update, delete mark, or delete unmark) of a clustered index record. If they do, diff --git a/storage/innobase/include/log0crypt.h b/storage/innobase/include/log0crypt.h index d1282043665..d972ca01491 100644 --- a/storage/innobase/include/log0crypt.h +++ b/storage/innobase/include/log0crypt.h @@ -32,7 +32,11 @@ MDEV-11782: Rewritten for MariaDB 10.2 by Marko Mäkelä, MariaDB Corporation. /** innodb_encrypt_log: whether to encrypt the redo log */ extern my_bool srv_encrypt_log; -/** Initialize the redo log encryption key. +/** Initialize the redo log encryption key and random parameters +when creating a new redo log. +The random parameters will be persisted in the log checkpoint pages. +@see log_crypt_write_checkpoint_buf() +@see log_crypt_read_checkpoint_buf() @return whether the operation succeeded */ UNIV_INTERN bool @@ -71,10 +75,51 @@ log_crypt_read_checkpoint_buf(const byte* buf); /** Encrypt or decrypt log blocks. @param[in,out] buf log blocks to encrypt or decrypt +@param[in] lsn log sequence number of the start of the buffer @param[in] size size of the buffer, in bytes @param[in] decrypt whether to decrypt instead of encrypting */ UNIV_INTERN void -log_crypt(byte* buf, ulint size, bool decrypt = false); +log_crypt(byte* buf, lsn_t lsn, ulint size, bool decrypt = false); +/** Encrypt or decrypt a temporary file block. +@param[in] src block to encrypt or decrypt +@param[in] size size of the block +@param[out] dst destination block +@param[in] offs offset to block +@param[in] space_id tablespace id +@param[in] encrypt true=encrypt; false=decrypt +@return whether the operation succeeded */ +UNIV_INTERN +bool +log_tmp_block_encrypt( + const byte* src, + ulint size, + byte* dst, + uint64_t offs, + ulint space_id, + bool encrypt = true) + MY_ATTRIBUTE((warn_unused_result, nonnull)); + +/** Decrypt a temporary file block. +@param[in] src block to decrypt +@param[in] size size of the block +@param[out] dst destination block +@param[in] offs offset to block +@param[in] space_id tablespace id +@return whether the operation succeeded */ +inline +bool +log_tmp_block_decrypt( + const byte* src, + ulint size, + byte* dst, + uint64_t offs, + ulint space_id) +{ + return(log_tmp_block_encrypt(src, size, dst, offs, space_id, false)); +} + +/** @return whether temporary files are encrypted */ +inline bool log_tmp_is_encrypted() { return srv_encrypt_log; } #endif // log0crypt.h diff --git a/storage/innobase/include/log0log.h b/storage/innobase/include/log0log.h index d1aae64227e..543302c52f0 100644 --- a/storage/innobase/include/log0log.h +++ b/storage/innobase/include/log0log.h @@ -2,7 +2,7 @@ Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved. Copyright (c) 2009, Google Inc. -Copyright (c) 2017, MariaDB Corporation. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -39,6 +39,7 @@ Created 12/9/1995 Heikki Tuuri #include "sync0rw.h" #include "log0types.h" #include "os0event.h" +#include "os0file.h" /** Redo log group */ struct log_group_t; @@ -151,24 +152,24 @@ UNIV_INLINE lsn_t log_get_max_modified_age_async(void); /*================================*/ -/******************************************************//** -Initializes the log. */ +/** Initializes the redo logging subsystem. */ void -log_init(void); -/*==========*/ -/******************************************************************//** -Inits a log group to the log system. -@return true if success, false if not */ -MY_ATTRIBUTE((warn_unused_result)) +log_sys_init(); + +/** Initialize the redo log. +@param[in] n_files number of files */ +void +log_init(ulint n_files); +/** Calculate the recommended highest values for lsn - last_checkpoint_lsn +and lsn - buf_get_oldest_modification(). +@param[in] file_size requested innodb_log_file_size +@retval true on success +@retval false if the smallest log group is too small to +accommodate the number of OS threads in the database server */ bool -log_group_init( -/*===========*/ - ulint id, /*!< in: group id */ - ulint n_files, /*!< in: number of log files */ - lsn_t file_size, /*!< in: log file size in bytes */ - ulint space_id); /*!< in: space id of the file space - which contains the log files of this - group */ +log_set_capacity(ulonglong file_size) + MY_ATTRIBUTE((warn_unused_result)); + /******************************************************//** Completes an i/o to a log file. */ void @@ -407,16 +408,9 @@ Closes all log groups. */ void log_group_close_all(void); /*=====================*/ -/********************************************************//** -Shutdown the log system but do not release all the memory. */ +/** Shut down the redo log subsystem. */ void -log_shutdown(void); -/*==============*/ -/********************************************************//** -Free the log system data structures. */ -void -log_mem_free(void); -/*==============*/ +log_shutdown(); /** Whether to generate and require checksums on the redo log pages */ extern my_bool innodb_log_checksums; @@ -552,16 +546,12 @@ Currently, this is only protected by log_sys->mutex. However, in the case of log_write_up_to(), we will access some members only with the protection of log_sys->write_mutex, which should affect nothing for now. */ struct log_group_t{ - /** log group identifier (always 0) */ - ulint id; /** number of files in the group */ ulint n_files; /** format of the redo log: e.g., LOG_HEADER_FORMAT_CURRENT */ ulint format; /** individual log file size in bytes, including the header */ - lsn_t file_size - /** file space which implements the log group */; - ulint space_id; + lsn_t file_size; /** corruption status */ log_group_state_t state; /** lsn used to fix coordinates within the log group */ @@ -580,14 +570,18 @@ struct log_group_t{ byte* checkpoint_buf_ptr; /** buffer for writing a checkpoint header */ byte* checkpoint_buf; - /** list of log groups */ - UT_LIST_NODE_T(log_group_t) log_groups; /** @return whether the redo log is encrypted */ bool is_encrypted() const { return((format & LOG_HEADER_FORMAT_ENCRYPTED) != 0); } + + /** @return capacity in bytes */ + inline lsn_t capacity() const + { + return((file_size - LOG_FILE_HDR_SIZE) * n_files); + } }; /** Redo log buffer */ @@ -639,8 +633,8 @@ struct log_t{ max_checkpoint_age; this flag is peeked at by log_free_check(), which does not reserve the log mutex */ - UT_LIST_BASE_NODE_T(log_group_t) - log_groups; /*!< log groups */ + /** the redo log */ + log_group_t log; /** The fields involved in the log buffer flush @{ */ @@ -729,7 +723,7 @@ struct log_t{ /** @return whether the redo log is encrypted */ bool is_encrypted() const { - return(UT_LIST_GET_FIRST(log_groups)->is_encrypted()); + return(log.is_encrypted()); } }; diff --git a/storage/innobase/include/log0log.ic b/storage/innobase/include/log0log.ic index 82a94265776..58da7bacc6f 100644 --- a/storage/innobase/include/log0log.ic +++ b/storage/innobase/include/log0log.ic @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -23,7 +24,6 @@ Database log Created 12/9/1995 Heikki Tuuri *******************************************************/ -#include "os0file.h" #include "mach0data.h" #include "srv0mon.h" #include "srv0srv.h" @@ -479,25 +479,25 @@ void log_free_check(void) /*================*/ { -#ifdef UNIV_DEBUG /* During row_log_table_apply(), this function will be called while we are holding some latches. This is OK, as long as we are not holding any latches on buffer blocks. */ +#ifdef UNIV_DEBUG static const latch_level_t latches[] = { SYNC_DICT, /* dict_sys->mutex during commit_try_rebuild() */ SYNC_DICT_OPERATION, /* dict_operation_lock X-latch during commit_try_rebuild() */ + SYNC_FTS_CACHE, /* fts_cache_t::lock */ SYNC_INDEX_TREE /* index->lock */ }; - - sync_allowed_latches check( - latches, latches + sizeof(latches)/sizeof(*latches)); - - ut_ad(!sync_check_iterate(check)); #endif /* UNIV_DEBUG */ + ut_ad(!sync_check_iterate( + sync_allowed_latches(latches, + latches + UT_ARR_SIZE(latches)))); + if (log_sys->check_flush_or_checkpoint) { log_check_margins(); diff --git a/storage/innobase/include/log0recv.h b/storage/innobase/include/log0recv.h index 74ea6c95036..24ad9ae2a30 100644 --- a/storage/innobase/include/log0recv.h +++ b/storage/innobase/include/log0recv.h @@ -38,9 +38,19 @@ Created 9/20/1997 Heikki Tuuri #include #include +/** Is recv_writer_thread active? */ +extern bool recv_writer_thread_active; + /** @return whether recovery is currently running. */ #define recv_recovery_is_on() recv_recovery_on +/** Find the latest checkpoint in the log header. +@param[out] max_field LOG_CHECKPOINT_1 or LOG_CHECKPOINT_2 +@return error code or DB_SUCCESS */ +dberr_t +recv_find_max_checkpoint(ulint* max_field) + MY_ATTRIBUTE((nonnull, warn_unused_result)); + /** Apply the hashed log records to the page, if the page lsn is less than the lsn of a log record. @param just_read_in whether the page recently arrived to the I/O handler @@ -74,32 +84,31 @@ recv_reset_logs( OS_FILE_LOG_BLOCK_SIZE, after which we add LOG_BLOCK_HDR_SIZE */ -/********************************************************//** -Creates the recovery system. */ +/** Clean up after recv_sys_init() */ void -recv_sys_create(void); -/*=================*/ -/**********************************************************//** -Release recovery system mutexes. */ +recv_sys_close(); +/** Initialize the redo log recovery subsystem. */ void -recv_sys_close(void); -/*================*/ -/********************************************************//** -Frees the recovery system memory. */ -void -recv_sys_mem_free(void); -/*===================*/ -/********************************************************//** -Inits the recovery system for a recovery operation. */ -void -recv_sys_init( -/*==========*/ - ulint available_memory); /*!< in: available memory in bytes */ +recv_sys_init(); /********************************************************//** Frees the recovery system. */ void recv_sys_debug_free(void); /*=====================*/ + +/** Read a log segment to a buffer. +@param[out] buf buffer +@param[in] group redo log files +@param[in] start_lsn read area start +@param[in] end_lsn read area end +@return valid end_lsn */ +lsn_t +log_group_read_log_seg( + byte* buf, + const log_group_t* group, + lsn_t start_lsn, + lsn_t end_lsn); + /********************************************************//** Reset the state of the recovery system variables. */ void diff --git a/storage/innobase/include/mach0data.h b/storage/innobase/include/mach0data.h index 5a5574b2537..684a3155a16 100644 --- a/storage/innobase/include/mach0data.h +++ b/storage/innobase/include/mach0data.h @@ -63,6 +63,7 @@ mach_write_to_2( /*============*/ byte* b, /*!< in: pointer to two bytes where to store */ ulint n); /*!< in: ulint integer to be stored, >= 0, < 64k */ +#endif /* !UNIV_INNOCHECKSUM */ /** The following function is used to fetch data from 2 consecutive bytes. The most significant byte is at the lowest address. @param[in] b pointer to 2 bytes where to store @@ -72,6 +73,8 @@ uint16_t mach_read_from_2( const byte* b) MY_ATTRIBUTE((warn_unused_result)); + +#ifndef UNIV_INNOCHECKSUM /********************************************************//** The following function is used to convert a 16-bit data item to the canonical format, for fast bytewise equality test @@ -362,6 +365,8 @@ mach_write_ulonglong( ulint len, /*!< in: length of dest */ bool usign); /*!< in: signed or unsigned flag */ +#endif /* !UNIV_INNOCHECKSUM */ + /** Read 1 to 4 bytes from a file page buffered in the buffer pool. @param[in] ptr pointer where to read @param[in] type MLOG_1BYTE, MLOG_2BYTES, or MLOG_4BYTES @@ -373,8 +378,6 @@ mach_read_ulint( mlog_id_t type) MY_ATTRIBUTE((warn_unused_result)); -#endif /* !UNIV_INNOCHECKSUM */ - #include "mach0data.ic" #endif diff --git a/storage/innobase/include/mach0data.ic b/storage/innobase/include/mach0data.ic index 34d375aa1e8..9c4760b6d3a 100644 --- a/storage/innobase/include/mach0data.ic +++ b/storage/innobase/include/mach0data.ic @@ -827,13 +827,13 @@ mach_swap_byte_order( dest += len; switch (len & 0x7) { - case 0: *--dest = *from++; - case 7: *--dest = *from++; - case 6: *--dest = *from++; - case 5: *--dest = *from++; - case 4: *--dest = *from++; - case 3: *--dest = *from++; - case 2: *--dest = *from++; + case 0: *--dest = *from++; /* fall through */ + case 7: *--dest = *from++; /* fall through */ + case 6: *--dest = *from++; /* fall through */ + case 5: *--dest = *from++; /* fall through */ + case 4: *--dest = *from++; /* fall through */ + case 3: *--dest = *from++; /* fall through */ + case 2: *--dest = *from++; /* fall through */ case 1: *--dest = *from; } } @@ -865,6 +865,8 @@ mach_write_ulonglong( } } +#endif /* !UNIV_INNOCHECKSUM */ + /** Read 1 to 4 bytes from a file page buffered in the buffer pool. @param[in] ptr pointer where to read @param[in] type MLOG_1BYTE, MLOG_2BYTES, or MLOG_4BYTES @@ -889,5 +891,3 @@ mach_read_ulint( ut_error; return(0); } - -#endif /* !UNIV_INNOCHECKSUM */ diff --git a/storage/innobase/include/mtr0log.ic b/storage/innobase/include/mtr0log.ic index 972fdc81518..dd68ea25613 100644 --- a/storage/innobase/include/mtr0log.ic +++ b/storage/innobase/include/mtr0log.ic @@ -76,10 +76,10 @@ mlog_catenate_ulint( ulint val, /*!< in: value to write */ mlog_id_t type) /*!< in: type of value to write */ { - ut_ad(MLOG_1BYTE == 1); - ut_ad(MLOG_2BYTES == 2); - ut_ad(MLOG_4BYTES == 4); - ut_ad(MLOG_8BYTES == 8); + compile_time_assert(MLOG_1BYTE == 1); + compile_time_assert(MLOG_2BYTES == 2); + compile_time_assert(MLOG_4BYTES == 4); + compile_time_assert(MLOG_8BYTES == 8); byte* ptr = mtr_buf->push(type); @@ -182,6 +182,14 @@ mlog_write_initial_log_record_low( mtr_t* mtr) { ut_ad(type <= MLOG_BIGGEST_TYPE || EXTRA_CHECK_MLOG_NUMBER(type)); + ut_ad(type == MLOG_FILE_NAME + || type == MLOG_FILE_DELETE + || type == MLOG_FILE_CREATE2 + || type == MLOG_FILE_RENAME2 + || type == MLOG_INDEX_LOAD + || type == MLOG_TRUNCATE + || type == MLOG_FILE_WRITE_CRYPT_DATA + || mtr->is_named_space(space_id)); mach_write_to_1(log_ptr, type); log_ptr++; diff --git a/storage/innobase/include/mtr0types.h b/storage/innobase/include/mtr0types.h index 0725a5405a4..e47e89ae4ba 100644 --- a/storage/innobase/include/mtr0types.h +++ b/storage/innobase/include/mtr0types.h @@ -129,14 +129,6 @@ enum mlog_id_t { MLOG_LSN = 28, #endif /* UNIV_LOG_LSN_DEBUG */ - /** this means that a file page is taken into use and the prior - contents of the page should be ignored: in recovery we must not - trust the lsn values stored to the file page. - Note: it's deprecated because it causes crash recovery problem - in bulk create index, and actually we don't need to reset page - lsn in recv_recover_page_func() now. */ - MLOG_INIT_FILE_PAGE = 29, - /** write a string to a page */ MLOG_WRITE_STRING = 30, @@ -224,8 +216,7 @@ enum mlog_id_t { /** create a R-tree compact page */ MLOG_COMP_PAGE_CREATE_RTREE = 58, - /** this means that a file page is taken into use. - We use it to replace MLOG_INIT_FILE_PAGE. */ + /** initialize a file page */ MLOG_INIT_FILE_PAGE2 = 59, /** Table is being truncated. (Marked only for file-per-table) */ diff --git a/storage/innobase/include/os0file.h b/storage/innobase/include/os0file.h index e3396a4b7f7..b366267d6d2 100644 --- a/storage/innobase/include/os0file.h +++ b/storage/innobase/include/os0file.h @@ -1,6 +1,6 @@ /*********************************************************************** -Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2009, Percona Inc. Copyright (c) 2013, 2017, MariaDB Corporation. @@ -90,6 +90,30 @@ typedef int os_file_t; static const os_file_t OS_FILE_CLOSED = os_file_t(~0); +/** File descriptor with optional PERFORMANCE_SCHEMA instrumentation */ +struct pfs_os_file_t +{ + /** Default constructor */ + pfs_os_file_t(os_file_t file = OS_FILE_CLOSED) : m_file(file) +#ifdef UNIV_PFS_IO + , m_psi(NULL) +#endif + {} + + /** The wrapped file handle */ + os_file_t m_file; +#ifdef UNIV_PFS_IO + /** PERFORMANCE_SCHEMA descriptor */ + struct PSI_file *m_psi; +#endif + /** Implicit type conversion. + @return the wrapped file handle */ + operator os_file_t() const { return m_file; } + /** Assignment operator. + @param[in] file file handle to be assigned */ + void operator=(os_file_t file) { m_file = file; } +}; + /** The next value should be smaller or equal to the smallest sector size used on any disk. A log block is required to be a portion of disk which is written so that if the start and the end of a block get written to disk, then the @@ -585,7 +609,7 @@ A simple function to open or create a file. @param[out] success true if succeed, false if error @return own: handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ -os_file_t +pfs_os_file_t os_file_create_simple_func( const char* name, ulint create_mode, @@ -605,7 +629,7 @@ A simple function to open or create a file. @param[out] success true if succeeded @return own: handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ -os_file_t +pfs_os_file_t os_file_create_simple_no_error_handling_func( const char* name, ulint create_mode, @@ -643,7 +667,7 @@ Opens an existing file or creates a new. @param[in] success true if succeeded @return own: handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ -os_file_t +pfs_os_file_t os_file_create_func( const char* name, ulint create_mode, @@ -696,6 +720,8 @@ extern mysql_pfs_key_t innodb_temp_file_key; various file I/O operations with performance schema. 1) register_pfs_file_open_begin() and register_pfs_file_open_end() are used to register file creation, opening, closing and renaming. +2) register_pfs_file_rename_begin() and register_pfs_file_rename_end() +are used to register file renaming 2) register_pfs_file_io_begin() and register_pfs_file_io_end() are used to register actual file read, write and flush 3) register_pfs_file_close_begin() and register_pfs_file_close_end() @@ -711,11 +737,23 @@ do { \ } \ } while (0) -# define register_pfs_file_open_end(locker, file) \ +# define register_pfs_file_open_end(locker, file, result) \ do { \ if (locker != NULL) { \ - PSI_FILE_CALL(end_file_open_wait_and_bind_to_descriptor)(\ - locker, file); \ + file.m_psi = PSI_FILE_CALL(end_file_open_wait)( \ + locker, result); \ + } \ +} while (0) + +# define register_pfs_file_rename_begin(state, locker, key, op, name, \ + src_file, src_line) \ + register_pfs_file_open_begin(state, locker, key, op, name, \ + src_file, src_line) \ + +# define register_pfs_file_rename_end(locker, result) \ +do { \ + if (locker != NULL) { \ + PSI_FILE_CALL(end_file_open_wait)(locker, result); \ } \ } while (0) @@ -741,8 +779,8 @@ do { \ # define register_pfs_file_io_begin(state, locker, file, count, op, \ src_file, src_line) \ do { \ - locker = PSI_FILE_CALL(get_thread_file_descriptor_locker)( \ - state, file, op); \ + locker = PSI_FILE_CALL(get_thread_file_stream_locker)( \ + state, file.m_psi, op); \ if (locker != NULL) { \ PSI_FILE_CALL(start_file_wait)( \ locker, count, src_file, src_line); \ @@ -768,7 +806,9 @@ os_file_rename os_aio os_file_read os_file_read_no_error_handling +os_file_read_no_error_handling_int_fd os_file_write +os_file_write_int_fd The wrapper functions have the prefix of "innodb_". */ @@ -804,11 +844,19 @@ The wrapper functions have the prefix of "innodb_". */ pfs_os_file_read_no_error_handling_func( \ type, file, buf, offset, n, o, __FILE__, __LINE__) +# define os_file_read_no_error_handling_int_fd(type, file, buf, offset, n) \ + pfs_os_file_read_no_error_handling_int_fd_func( \ + type, file, buf, offset, n, __FILE__, __LINE__) + # define os_file_write(type, name, file, buf, offset, n) \ pfs_os_file_write_func(type, name, file, buf, offset, \ - n,__FILE__, __LINE__) + n, __FILE__, __LINE__) -# define os_file_flush(file) \ +# define os_file_write_int_fd(type, name, file, buf, offset, n) \ + pfs_os_file_write_int_fd_func(type, name, file, buf, offset, \ + n, __FILE__, __LINE__) + +# define os_file_flush(file) \ pfs_os_file_flush_func(file, __FILE__, __LINE__) # define os_file_rename(key, oldpath, newpath) \ @@ -836,7 +884,7 @@ os_file_create_simple() which opens or creates a file. @return own: handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ UNIV_INLINE -os_file_t +pfs_os_file_t pfs_os_file_create_simple_func( mysql_pfs_key_t key, const char* name, @@ -867,7 +915,7 @@ monitor file creation/open. @return own: handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ UNIV_INLINE -os_file_t +pfs_os_file_t pfs_os_file_create_simple_no_error_handling_func( mysql_pfs_key_t key, const char* name, @@ -900,7 +948,7 @@ Add instrumentation to monitor file creation/open. @return own: handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ UNIV_INLINE -os_file_t +pfs_os_file_t pfs_os_file_create_func( mysql_pfs_key_t key, const char* name, @@ -923,7 +971,7 @@ A performance schema instrumented wrapper function for os_file_close(). UNIV_INLINE bool pfs_os_file_close_func( - os_file_t file, + pfs_os_file_t file, const char* src_file, uint src_line); @@ -931,7 +979,7 @@ pfs_os_file_close_func( this function! This is the performance schema instrumented wrapper function for os_file_read() which requests a synchronous read operation. -@param[in, out] type IO request context +@param[in] type IO request context @param[in] file Open file handle @param[out] buf buffer where to read @param[in] offset file offset where to read @@ -942,20 +990,20 @@ os_file_read() which requests a synchronous read operation. UNIV_INLINE dberr_t pfs_os_file_read_func( - IORequest& type, - os_file_t file, - void* buf, - os_offset_t offset, - ulint n, - const char* src_file, - uint src_line); + const IORequest& type, + pfs_os_file_t file, + void* buf, + os_offset_t offset, + ulint n, + const char* src_file, + uint src_line); /** NOTE! Please use the corresponding macro os_file_read_no_error_handling(), not directly this function! This is the performance schema instrumented wrapper function for os_file_read_no_error_handling_func() which requests a synchronous read operation. -@param[in, out] type IO request context +@param[in] type IO request context @param[in] file Open file handle @param[out] buf buffer where to read @param[in] offset file offset where to read @@ -967,20 +1015,20 @@ read operation. UNIV_INLINE dberr_t pfs_os_file_read_no_error_handling_func( - IORequest& type, - os_file_t file, - void* buf, - os_offset_t offset, - ulint n, - ulint* o, - const char* src_file, - uint src_line); + const IORequest& type, + pfs_os_file_t file, + void* buf, + os_offset_t offset, + ulint n, + ulint* o, + const char* src_file, + uint src_line); /** NOTE! Please use the corresponding macro os_aio(), not directly this function! Performance schema wrapper function of os_aio() which requests an asynchronous I/O operation. -@param[in] type IO request context +@param[in,out] type IO request context @param[in] mode IO mode @param[in] name Name of the file or path as NUL terminated string @@ -1004,7 +1052,7 @@ pfs_os_aio_func( IORequest& type, ulint mode, const char* name, - os_file_t file, + pfs_os_file_t file, void* buf, os_offset_t offset, ulint n, @@ -1018,7 +1066,7 @@ pfs_os_aio_func( this function! This is the performance schema instrumented wrapper function for os_file_write() which requests a synchronous write operation. -@param[in, out] type IO request context +@param[in] type IO request context @param[in] name Name of the file or path as NUL terminated string @param[in] file Open file handle @@ -1031,14 +1079,14 @@ os_file_write() which requests a synchronous write operation. UNIV_INLINE dberr_t pfs_os_file_write_func( - IORequest& type, - const char* name, - os_file_t file, - const void* buf, - os_offset_t offset, - ulint n, - const char* src_file, - uint src_line); + const IORequest& type, + const char* name, + pfs_os_file_t file, + const void* buf, + os_offset_t offset, + ulint n, + const char* src_file, + uint src_line); /** NOTE! Please use the corresponding macro os_file_flush(), not directly this function! @@ -1052,7 +1100,7 @@ Flushes the write buffers of a given file to the disk. UNIV_INLINE bool pfs_os_file_flush_func( - os_file_t file, + pfs_os_file_t file, const char* src_file, uint src_line); @@ -1144,9 +1192,12 @@ to original un-instrumented file I/O APIs */ # define os_file_read_no_error_handling(type, file, buf, offset, n, o) \ os_file_read_no_error_handling_func(type, file, buf, offset, n, o) +# define os_file_read_no_error_handling_int_fd(type, file, buf, offset, n) \ + os_file_read_no_error_handling_func(type, file, buf, offset, n, NULL) # define os_file_write(type, name, file, buf, offset, n) \ os_file_write_func(type, name, file, buf, offset, n) +# define os_file_write_int_fd os_file_write_func # define os_file_flush(file) os_file_flush_func(file) @@ -1242,11 +1293,11 @@ Requests a synchronous read operation. @return DB_SUCCESS if request was successful */ dberr_t os_file_read_func( - IORequest& type, - os_file_t file, - void* buf, - os_offset_t offset, - ulint n) + const IORequest& type, + os_file_t file, + void* buf, + os_offset_t offset, + ulint n) MY_ATTRIBUTE((warn_unused_result)); /** Rewind file to its start, read at most size - 1 bytes from it to str, and @@ -1274,18 +1325,18 @@ any error handling. In case of error it returns FALSE. @return DB_SUCCESS or error code */ dberr_t os_file_read_no_error_handling_func( - IORequest& type, - os_file_t file, - void* buf, - os_offset_t offset, - ulint n, - ulint* o) + const IORequest& type, + os_file_t file, + void* buf, + os_offset_t offset, + ulint n, + ulint* o) MY_ATTRIBUTE((warn_unused_result)); /** NOTE! Use the corresponding macro os_file_write(), not directly this function! Requests a synchronous write operation. -@param[in,out] type IO request context +@param[in] type IO request context @param[in] file Open file handle @param[out] buf buffer where to read @param[in] offset file offset where to read @@ -1293,12 +1344,12 @@ Requests a synchronous write operation. @return DB_SUCCESS if request was successful */ dberr_t os_file_write_func( - IORequest& type, - const char* name, - os_file_t file, - const void* buf, - os_offset_t offset, - ulint n) + const IORequest& type, + const char* name, + os_file_t file, + const void* buf, + os_offset_t offset, + ulint n) MY_ATTRIBUTE((warn_unused_result)); /** Check the existence and type of the given file. @@ -1381,7 +1432,7 @@ os_aio_free(); /** NOTE! Use the corresponding macro os_aio(), not directly this function! Requests an asynchronous i/o operation. -@param[in] type IO request context +@param[in,out] type IO request context @param[in] mode IO mode @param[in] name Name of the file or path as NUL terminated string @@ -1402,7 +1453,7 @@ os_aio_func( IORequest& type, ulint mode, const char* name, - os_file_t file, + pfs_os_file_t file, void* buf, os_offset_t offset, ulint n, @@ -1531,19 +1582,6 @@ os_is_sparse_file_supported( os_file_t fh) MY_ATTRIBUTE((warn_unused_result)); -/** Free storage space associated with a section of the file. -@param[in] fh Open file handle -@param[in] off Starting offset (SEEK_SET) -@param[in] len Size of the hole -@return DB_SUCCESS or error code */ -dberr_t -os_file_punch_hole( - IORequest& type, - os_file_t fh, - os_offset_t off, - os_offset_t len) - MY_ATTRIBUTE((warn_unused_result)); - /** Free storage space associated with a section of the file. @param[in] fh Open file handle @param[in] off Starting offset (SEEK_SET) diff --git a/storage/innobase/include/os0file.ic b/storage/innobase/include/os0file.ic index 807d3254b9d..6cb67af94ca 100644 --- a/storage/innobase/include/os0file.ic +++ b/storage/innobase/include/os0file.ic @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 2010, 2015, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2010, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2013, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under @@ -43,7 +43,7 @@ os_file_create_simple() which opens or creates a file. @return own: handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ UNIV_INLINE -os_file_t +pfs_os_file_t pfs_os_file_create_simple_func( mysql_pfs_key_t key, const char* name, @@ -64,11 +64,12 @@ pfs_os_file_create_simple_func( ? PSI_FILE_CREATE : PSI_FILE_OPEN, name, src_file, src_line); - os_file_t file = os_file_create_simple_func( + pfs_os_file_t file = os_file_create_simple_func( name, create_mode, access_type, read_only, success); - /* Regsiter the returning "file" value with the system */ - register_pfs_file_open_end(locker, file); + /* Register psi value for the file */ + register_pfs_file_open_end(locker, file, + (*success == TRUE ? success : 0)); return(file); } @@ -92,7 +93,7 @@ monitor file creation/open. @return own: handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ UNIV_INLINE -os_file_t +pfs_os_file_t pfs_os_file_create_simple_no_error_handling_func( mysql_pfs_key_t key, const char* name, @@ -113,10 +114,11 @@ pfs_os_file_create_simple_no_error_handling_func( ? PSI_FILE_CREATE : PSI_FILE_OPEN, name, src_file, src_line); - os_file_t file = os_file_create_simple_no_error_handling_func( + pfs_os_file_t file = os_file_create_simple_no_error_handling_func( name, create_mode, access_type, read_only, success); - register_pfs_file_open_end(locker, file); + register_pfs_file_open_end(locker, file, + (*success == TRUE ? success : 0)); return(file); } @@ -142,7 +144,7 @@ Add instrumentation to monitor file creation/open. @return own: handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ UNIV_INLINE -os_file_t +pfs_os_file_t pfs_os_file_create_func( mysql_pfs_key_t key, const char* name, @@ -164,10 +166,11 @@ pfs_os_file_create_func( ? PSI_FILE_CREATE : PSI_FILE_OPEN, name, src_file, src_line); - os_file_t file = os_file_create_func( + pfs_os_file_t file = os_file_create_func( name, create_mode, purpose, type, read_only, success); - register_pfs_file_open_end(locker, file); + register_pfs_file_open_end(locker, file, + (*success == TRUE ? success : 0)); return(file); } @@ -182,7 +185,7 @@ A performance schema instrumented wrapper function for os_file_close(). UNIV_INLINE bool pfs_os_file_close_func( - os_file_t file, + pfs_os_file_t file, const char* src_file, uint src_line) { @@ -204,7 +207,7 @@ pfs_os_file_close_func( function! Performance schema wrapper function of os_aio() which requests an asynchronous i/o operation. -@param[in] type IO request context +@param[in,type] type IO request context @param[in] mode IO mode @param[in] name Name of the file or path as NUL terminated string @@ -228,7 +231,7 @@ pfs_os_aio_func( IORequest& type, ulint mode, const char* name, - os_file_t file, + pfs_os_file_t file, void* buf, os_offset_t offset, ulint n, @@ -261,7 +264,7 @@ pfs_os_aio_func( this function! This is the performance schema instrumented wrapper function for os_file_read() which requests a synchronous read operation. -@param[in, out] type IO request context +@param[in] type IO request context @param[in] file Open file handle @param[out] buf buffer where to read @param[in] offset file offset where to read @@ -272,13 +275,13 @@ os_file_read() which requests a synchronous read operation. UNIV_INLINE dberr_t pfs_os_file_read_func( - IORequest& type, - os_file_t file, - void* buf, - os_offset_t offset, - ulint n, - const char* src_file, - uint src_line) + const IORequest& type, + pfs_os_file_t file, + void* buf, + os_offset_t offset, + ulint n, + const char* src_file, + uint src_line) { PSI_file_locker_state state; struct PSI_file_locker* locker = NULL; @@ -302,7 +305,7 @@ not directly this function! This is the performance schema instrumented wrapper function for os_file_read_no_error_handling_func() which requests a synchronous read operation. -@param[in, out] type IO request context +@param[in] type IO request context @param[in] file Open file handle @param[out] buf buffer where to read @param[in] offset file offset where to read @@ -314,14 +317,14 @@ read operation. UNIV_INLINE dberr_t pfs_os_file_read_no_error_handling_func( - IORequest& type, - os_file_t file, - void* buf, - os_offset_t offset, - ulint n, - ulint* o, - const char* src_file, - uint src_line) + const IORequest& type, + pfs_os_file_t file, + void* buf, + os_offset_t offset, + ulint n, + ulint* o, + const char* src_file, + uint src_line) { PSI_file_locker_state state; struct PSI_file_locker* locker = NULL; @@ -337,11 +340,54 @@ pfs_os_file_read_no_error_handling_func( return(result); } +/** NOTE! Please use the corresponding macro +os_file_read_no_error_handling_int_fd() to request +a synchronous read operation. +@param[in] type read request +@param[in] file file handle +@param[out] buf buffer where to read +@param[in] offset file offset where to read +@param[in] n number of bytes to read +@param[in] src_file caller file name +@param[in] src_line caller line number +@return whether the request was successful */ +UNIV_INLINE +bool +pfs_os_file_read_no_error_handling_int_fd_func( + const IORequest& type, + int file, + void* buf, + os_offset_t offset, + ulint n, + const char* src_file, + uint src_line) +{ + PSI_file_locker_state state; + + PSI_file_locker* locker = PSI_FILE_CALL( + get_thread_file_descriptor_locker)( + &state, file, PSI_FILE_READ); + if (locker != NULL) { + PSI_FILE_CALL(start_file_wait)( + locker, n, + __FILE__, __LINE__); + } + ulint fulfilled; + bool success = DB_SUCCESS == os_file_read_no_error_handling_func( + type, OS_FILE_FROM_FD(file), buf, offset, n, &fulfilled); + + if (locker != NULL) { + PSI_FILE_CALL(end_file_wait)(locker, n); + } + + return(success); +} + /** NOTE! Please use the corresponding macro os_file_write(), not directly this function! This is the performance schema instrumented wrapper function for os_file_write() which requests a synchronous write operation. -@param[in, out] type IO request context +@param[in] type IO request context @param[in] name Name of the file or path as NUL terminated string @param[in] file Open file handle @@ -350,18 +396,19 @@ os_file_write() which requests a synchronous write operation. @param[in] n number of bytes to read @param[in] src_file file name where func invoked @param[in] src_line line where the func invoked -@return DB_SUCCESS if request was successful */ +@return error code +@retval DB_SUCCESS if the request was successfully fulfilled */ UNIV_INLINE dberr_t pfs_os_file_write_func( - IORequest& type, - const char* name, - os_file_t file, - const void* buf, - os_offset_t offset, - ulint n, - const char* src_file, - uint src_line) + const IORequest& type, + const char* name, + pfs_os_file_t file, + const void* buf, + os_offset_t offset, + ulint n, + const char* src_file, + uint src_line) { PSI_file_locker_state state; struct PSI_file_locker* locker = NULL; @@ -378,6 +425,52 @@ pfs_os_file_write_func( return(result); } +/** NOTE! Please use the corresponding macro os_file_write_int_fd(), +not directly this function! +This is the performance schema instrumented wrapper function for +os_file_write_int_fd() which requests a synchronous write operation. +@param[in] type write request +@param[in] name file name +@param[in] file file handle +@param[in] buf buffer to write +@param[in] offset file offset +@param[in] n number of bytes +@param[in] src_file file name where func invoked +@param[in] src_line line where the func invoked +@return whether the request was successful */ +UNIV_INLINE +bool +pfs_os_file_write_int_fd_func( + const IORequest& type, + const char* name, + int file, + const void* buf, + os_offset_t offset, + ulint n, + const char* src_file, + uint src_line) +{ + PSI_file_locker_state state; + struct PSI_file_locker* locker; + + locker = PSI_FILE_CALL(get_thread_file_descriptor_locker)( + &state, file, PSI_FILE_WRITE); + if (locker != NULL) { + PSI_FILE_CALL(start_file_wait)( + locker, n, + __FILE__, __LINE__); + } + + bool success = DB_SUCCESS == os_file_write_func( + type, name, OS_FILE_FROM_FD(file), buf, offset, n); + + if (locker != NULL) { + PSI_FILE_CALL(end_file_wait)(locker, n); + } + + return(success); +} + /** NOTE! Please use the corresponding macro os_file_flush(), not directly this function! This is the performance schema instrumented wrapper function for @@ -390,7 +483,7 @@ Flushes the write buffers of a given file to the disk. UNIV_INLINE bool pfs_os_file_flush_func( - os_file_t file, + pfs_os_file_t file, const char* src_file, uint src_line) { @@ -436,7 +529,7 @@ pfs_os_file_rename_func( bool result = os_file_rename_func(oldpath, newpath); - register_pfs_file_open_end(locker, 0); + register_pfs_file_rename_end(locker, 0); return(result); } diff --git a/storage/innobase/include/os0thread.h b/storage/innobase/include/os0thread.h index 6f521b5a2ec..c240f5dacdd 100644 --- a/storage/innobase/include/os0thread.h +++ b/storage/innobase/include/os0thread.h @@ -128,10 +128,8 @@ os_thread_join( /** Exits the current thread. @param[in] detach if true, the thread will be detached right before exiting. If false, another thread is responsible for joining this thread */ -void -os_thread_exit( - bool detach = true) - UNIV_COLD MY_ATTRIBUTE((noreturn)); +ATTRIBUTE_NORETURN ATTRIBUTE_COLD +void os_thread_exit(bool detach = true); /*****************************************************************//** Returns the thread identifier of current thread. @@ -151,23 +149,4 @@ os_thread_sleep( /*============*/ ulint tm); /*!< in: time in microseconds */ -/** -Initializes OS thread management data structures. */ -void -os_thread_init(); -/*============*/ - -/** -Frees OS thread management data structures. */ -void -os_thread_free(); -/*============*/ - -/*****************************************************************//** -Check if there are threads active. -@return true if the thread count > 0. */ -bool -os_thread_active(); -/*==============*/ - #endif diff --git a/storage/innobase/include/page0page.h b/storage/innobase/include/page0page.h index a8c5f11c17b..9243bcaa717 100644 --- a/storage/innobase/include/page0page.h +++ b/storage/innobase/include/page0page.h @@ -1,6 +1,6 @@ /***************************************************************************** Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2016, MariaDB Corporation +Copyright (c) 2013, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -85,8 +85,6 @@ Otherwise written as 0. @see PAGE_ROOT_AUTO_INC */ This field should not be written to after page creation. */ -#ifndef UNIV_INNOCHECKSUM - #define PAGE_BTR_SEG_LEAF 36 /* file segment header for the leaf pages in a B-tree: defined only on the root page of a B-tree, but not in the root of an ibuf tree */ @@ -141,6 +139,8 @@ Otherwise written as 0. @see PAGE_ROOT_AUTO_INC */ #define PAGE_SAME_PAGE 4 #define PAGE_NO_DIRECTION 5 +#ifndef UNIV_INNOCHECKSUM + /* PAGE DIRECTORY ============== */ @@ -264,7 +264,7 @@ page_set_ssn_id( /*************************************************************//** Reads the given header field. */ UNIV_INLINE -ulint +uint16_t page_header_get_field( /*==================*/ const page_t* page, /*!< in: page */ diff --git a/storage/innobase/include/page0page.ic b/storage/innobase/include/page0page.ic index 1c680ce7cc4..db98f2e6558 100644 --- a/storage/innobase/include/page0page.ic +++ b/storage/innobase/include/page0page.ic @@ -27,8 +27,8 @@ Created 2/2/1994 Heikki Tuuri #ifndef page0page_ic #define page0page_ic -#include "mach0data.h" #ifndef UNIV_INNOCHECKSUM +#include "mach0data.h" #ifdef UNIV_DEBUG # include "log0recv.h" #endif /* !UNIV_DEBUG */ @@ -40,6 +40,7 @@ Created 2/2/1994 Heikki Tuuri #undef UNIV_INLINE #define UNIV_INLINE #endif +#endif /* !UNIV_INNOCHECKSUM */ /************************************************************//** Gets the start of a page. @@ -53,6 +54,7 @@ page_align( return((page_t*) ut_align_down(ptr, UNIV_PAGE_SIZE)); } +#ifndef UNIV_INNOCHECKSUM /************************************************************//** Gets the offset within a page. @return offset from the start of the page */ @@ -168,7 +170,7 @@ page_set_ssn_id( /*************************************************************//** Reads the given header field. */ UNIV_INLINE -ulint +uint16_t page_header_get_field( /*==================*/ const page_t* page, /*!< in: page */ @@ -181,7 +183,6 @@ page_header_get_field( } #ifndef UNIV_INNOCHECKSUM - /*************************************************************//** Sets the given header field. */ UNIV_INLINE @@ -285,6 +286,8 @@ page_header_reset_last_insert( } } +#endif /* !UNIV_INNOCHECKSUM */ + /************************************************************//** Determine whether the page is in new-style compact format. @return nonzero if the page is in compact format, zero if it is in @@ -298,6 +301,7 @@ page_is_comp( return(page[PAGE_HEADER + PAGE_N_HEAP] & 0x80); } +#ifndef UNIV_INNOCHECKSUM /************************************************************//** TRUE if the record is on a page in compact format. @return nonzero if in compact format */ @@ -326,6 +330,8 @@ page_rec_get_heap_no( } } +#endif /* !UNIV_INNOCHECKSUM */ + /************************************************************//** Determine whether the page is a B-tree leaf. @return true if the page is a B-tree leaf (PAGE_LEVEL = 0) */ @@ -338,6 +344,7 @@ page_is_leaf( return(!*(const uint16*) (page + (PAGE_HEADER + PAGE_LEVEL))); } +#ifndef UNIV_INNOCHECKSUM /************************************************************//** Determine whether the page is empty. @return true if the page is empty (PAGE_N_RECS = 0) */ @@ -627,6 +634,8 @@ page_get_middle_rec( return(page_rec_get_nth(page, middle)); } +#endif /* !UNIV_INNOCHECKSUM */ + /*************************************************************//** Gets the page number. @return page number */ @@ -640,6 +649,7 @@ page_get_page_no( return(mach_read_from_4(page + FIL_PAGE_OFFSET)); } +#ifndef UNIV_INNOCHECKSUM /*************************************************************//** Gets the tablespace identifier. @return space id */ @@ -653,6 +663,8 @@ page_get_space_id( return(mach_read_from_4(page + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID)); } +#endif /* !UNIV_INNOCHECKSUM */ + /*************************************************************//** Gets the number of user records on page (infimum and supremum records are not user records). @@ -666,6 +678,7 @@ page_get_n_recs( return(page_header_get_field(page, PAGE_N_RECS)); } +#ifndef UNIV_INNOCHECKSUM /*************************************************************//** Gets the number of dir slots in directory. @return number of slots */ @@ -718,7 +731,7 @@ page_dir_set_n_heap( ulint n_heap) /*!< in: number of records */ { ut_ad(n_heap < 0x8000); - ut_ad(!page_zip || n_heap + ut_ad(!page_zip || uint16_t(n_heap) == (page_header_get_field(page, PAGE_N_HEAP) & 0x7fff) + 1); page_header_set_field(page, page_zip, PAGE_N_HEAP, n_heap @@ -1054,6 +1067,8 @@ page_rec_get_base_extra_size( return(REC_N_NEW_EXTRA_BYTES + (ulint) !page_rec_is_comp(rec)); } +#endif /* UNIV_INNOCHECKSUM */ + /************************************************************//** Returns the sum of the sizes of the records in the record list, excluding the infimum and supremum records. @@ -1077,6 +1092,7 @@ page_get_data_size( return(ret); } +#ifndef UNIV_INNOCHECKSUM /************************************************************//** Allocates a block of memory from the free list of an index page. */ UNIV_INLINE diff --git a/storage/innobase/include/page0zip.ic b/storage/innobase/include/page0zip.ic index 5f754e1f993..b471e2cf64e 100644 --- a/storage/innobase/include/page0zip.ic +++ b/storage/innobase/include/page0zip.ic @@ -164,11 +164,13 @@ page_zip_rec_needs_ext( ulint n_fields, const page_size_t& page_size) { - ut_ad(rec_size > comp ? REC_N_NEW_EXTRA_BYTES : REC_N_OLD_EXTRA_BYTES); + ut_ad(rec_size + > ulint(comp ? REC_N_NEW_EXTRA_BYTES : REC_N_OLD_EXTRA_BYTES)); ut_ad(comp || !page_size.is_compressed()); -#if UNIV_PAGE_SIZE_MAX > REC_MAX_DATA_SIZE - if (rec_size >= REC_MAX_DATA_SIZE) { +#if UNIV_PAGE_SIZE_MAX > COMPRESSED_REC_MAX_DATA_SIZE + if (comp ? rec_size >= COMPRESSED_REC_MAX_DATA_SIZE : + rec_size >= REDUNDANT_REC_MAX_DATA_SIZE) { return(TRUE); } #endif diff --git a/storage/innobase/include/rem0cmp.h b/storage/innobase/include/rem0cmp.h index 245fefae944..216e3a7655b 100644 --- a/storage/innobase/include/rem0cmp.h +++ b/storage/innobase/include/rem0cmp.h @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -62,7 +63,7 @@ cmp_data_data( ulint len1, const byte* data2, ulint len2) - MY_ATTRIBUTE((nonnull, warn_unused_result)); + MY_ATTRIBUTE((warn_unused_result)); /** Compare two data fields. @param[in] dfield1 data field; must have type field set diff --git a/storage/innobase/include/rem0rec.h b/storage/innobase/include/rem0rec.h index 916222d5fdb..61220d4f533 100644 --- a/storage/innobase/include/rem0rec.h +++ b/storage/innobase/include/rem0rec.h @@ -27,12 +27,14 @@ Created 5/30/1994 Heikki Tuuri #ifndef rem0rec_h #define rem0rec_h +#ifndef UNIV_INNOCHECKSUM #include "univ.i" #include "data0data.h" #include "rem0types.h" #include "mtr0types.h" #include "page0types.h" #include "trx0types.h" +#endif /*! UNIV_INNOCHECKSUM */ #include #include @@ -92,6 +94,7 @@ offsets[] array, first passed to rec_get_offsets() */ #define REC_OFFS_NORMAL_SIZE OFFS_IN_REC_NORMAL_SIZE #define REC_OFFS_SMALL_SIZE 10 +#ifndef UNIV_INNOCHECKSUM /******************************************************//** The following function is used to get the pointer of the next chained record on the same page. @@ -774,19 +777,42 @@ rec_copy( const rec_t* rec, const ulint* offsets); -/**********************************************************//** -Determines the size of a data tuple prefix in a temporary file. -@return total size */ +/** Determine the size of a data tuple prefix in a temporary file. +@param[in] index clustered or secondary index +@param[in] fields data fields +@param[in] n_fields number of data fields +@param[out] extra record header size +@return total size, in bytes */ ulint rec_get_converted_size_temp( -/*========================*/ - const dict_index_t* index, /*!< in: record descriptor */ - const dfield_t* fields, /*!< in: array of data fields */ - ulint n_fields,/*!< in: number of data fields */ - const dtuple_t* v_entry,/*!< in: dtuple contains virtual column - data */ - ulint* extra) /*!< out: extra size */ - MY_ATTRIBUTE((warn_unused_result)); + const dict_index_t* index, + const dfield_t* fields, + ulint n_fields, + ulint* extra) + MY_ATTRIBUTE((warn_unused_result, nonnull(1,2))); + +/** Determine the converted size of virtual column data in a temporary file. +@see rec_convert_dtuple_to_temp_v() +@param[in] index clustered index +@param[in] v clustered index record augmented with the values + of virtual columns +@return size in bytes */ +ulint +rec_get_converted_size_temp_v(const dict_index_t* index, const dtuple_t* v) + MY_ATTRIBUTE((warn_unused_result, nonnull)); + +/** Write indexed virtual column data into a temporary file. +@see rec_get_converted_size_temp_v() +@param[out] rec serialized record +@param[in] index clustered index +@param[in] v_entry clustered index record augmented with the values + of virtual columns */ +void +rec_convert_dtuple_to_temp_v( + byte* rec, + const dict_index_t* index, + const dtuple_t* v_entry) + MY_ATTRIBUTE((nonnull)); /******************************************************//** Determine the offset to each field in temporary file. @@ -809,10 +835,7 @@ rec_convert_dtuple_to_temp( rec_t* rec, /*!< out: record */ const dict_index_t* index, /*!< in: record descriptor */ const dfield_t* fields, /*!< in: array of data fields */ - ulint n_fields, /*!< in: number of fields */ - const dtuple_t* v_entry); /*!< in: dtuple contains - virtual column data */ - + ulint n_fields); /*!< in: number of fields */ /**************************************************************//** Copies the first n fields of a physical record to a new physical record in @@ -1080,14 +1103,14 @@ private: # endif /* !DBUG_OFF */ # ifdef UNIV_DEBUG -/************************************************************//** -Reads the DB_TRX_ID of a clustered index record. +/** Read the DB_TRX_ID of a clustered index record. +@param[in] rec clustered index record +@param[in] index clustered index @return the value of DB_TRX_ID */ trx_id_t rec_get_trx_id( -/*===========*/ - const rec_t* rec, /*!< in: record */ - const dict_index_t* index) /*!< in: clustered index */ + const rec_t* rec, + const dict_index_t* index) MY_ATTRIBUTE((nonnull, warn_unused_result)); # endif /* UNIV_DEBUG */ @@ -1096,9 +1119,15 @@ are given in one byte (resp. two byte) format. */ #define REC_1BYTE_OFFS_LIMIT 0x7FUL #define REC_2BYTE_OFFS_LIMIT 0x7FFFUL -/* The data size of record must be smaller than this because we reserve -two upmost bits in a two byte offset for special purposes */ -#define REC_MAX_DATA_SIZE 16384 +/* The data size of record must not be larger than this on +REDUNDANT row format because we reserve two upmost bits in a +two byte offset for special purposes */ +#define REDUNDANT_REC_MAX_DATA_SIZE (16383) + +/* The data size of record must be smaller than this on +COMPRESSED row format because we reserve two upmost bits in a +two byte offset for special purposes */ +#define COMPRESSED_REC_MAX_DATA_SIZE (16384) #ifdef WITH_WSREP int wsrep_rec_get_foreign_key( @@ -1112,4 +1141,5 @@ int wsrep_rec_get_foreign_key( #include "rem0rec.ic" +#endif /* !UNIV_INNOCHECKSUM */ #endif /* rem0rec_h */ diff --git a/storage/innobase/include/row0ftsort.h b/storage/innobase/include/row0ftsort.h index 207fd783cac..c8556cc4ca4 100644 --- a/storage/innobase/include/row0ftsort.h +++ b/storage/innobase/include/row0ftsort.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2010, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2015, 2016, MariaDB Corporation. +Copyright (c) 2015, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -73,7 +73,6 @@ struct fts_psort_common_t { store Doc ID during sort, if Doc ID will not be big enough to use 8 bytes value */ - fil_space_crypt_t* crypt_data; /*!< crypt data or NULL */ }; struct fts_psort_t { @@ -103,7 +102,6 @@ struct fts_psort_t { /** Row fts token for plugin parser */ struct row_fts_token_t { fts_string_t* text; /*!< token */ - ulint position; /*!< token position in the document */ UT_LIST_NODE_T(row_fts_token_t) token_list; /*!< next token link */ }; diff --git a/storage/innobase/include/row0log.h b/storage/innobase/include/row0log.h index 980facee427..5657e09cc22 100644 --- a/storage/innobase/include/row0log.h +++ b/storage/innobase/include/row0log.h @@ -101,7 +101,7 @@ row_log_online_op( const dtuple_t* tuple, /*!< in: index tuple */ trx_id_t trx_id) /*!< in: transaction ID for insert, or 0 for delete */ - UNIV_COLD MY_ATTRIBUTE((nonnull)); + ATTRIBUTE_COLD __attribute__((nonnull)); /******************************************************//** Gets the error status of the online index rebuild log. @@ -137,7 +137,7 @@ row_log_table_delete( const ulint* offsets,/*!< in: rec_get_offsets(rec,index) */ const byte* sys) /*!< in: DB_TRX_ID,DB_ROLL_PTR that should be logged, or NULL to use those in rec */ - UNIV_COLD MY_ATTRIBUTE((nonnull(1,2,3))); + ATTRIBUTE_COLD __attribute__((nonnull(1,2,3))); /******************************************************//** Logs an update operation to a table that is being rebuilt. @@ -174,7 +174,7 @@ row_log_table_get_pk( byte* sys, /*!< out: DB_TRX_ID,DB_ROLL_PTR for row_log_table_delete(), or NULL */ mem_heap_t** heap) /*!< in/out: memory heap where allocated */ - UNIV_COLD MY_ATTRIBUTE((nonnull(1,2,5), warn_unused_result)); + ATTRIBUTE_COLD __attribute__((nonnull(1,2,5), warn_unused_result)); /******************************************************//** Logs an insert to a table that is being rebuilt. @@ -195,7 +195,7 @@ row_log_table_blob_free( /*====================*/ dict_index_t* index, /*!< in/out: clustered index, X-latched */ ulint page_no)/*!< in: starting page number of the BLOB */ - UNIV_COLD MY_ATTRIBUTE((nonnull)); + ATTRIBUTE_COLD __attribute__((nonnull)); /******************************************************//** Notes that a BLOB is being allocated during online ALTER TABLE. */ void @@ -203,7 +203,7 @@ row_log_table_blob_alloc( /*=====================*/ dict_index_t* index, /*!< in/out: clustered index, X-latched */ ulint page_no)/*!< in: starting page number of the BLOB */ - UNIV_COLD MY_ATTRIBUTE((nonnull)); + ATTRIBUTE_COLD __attribute__((nonnull)); /** Apply the row_log_table log to a table upon completing rebuild. @param[in] thr query graph diff --git a/storage/innobase/include/row0merge.h b/storage/innobase/include/row0merge.h index 1b61c475c6f..8ab4e2a2ee3 100644 --- a/storage/innobase/include/row0merge.h +++ b/storage/innobase/include/row0merge.h @@ -44,9 +44,6 @@ Created 13/06/2005 Jan Lindstrom /* Reserve free space from every block for key_version */ #define ROW_MERGE_RESERVE_SIZE 4 -/* Reserve free space from every block for key_version */ -#define ROW_MERGE_RESERVE_SIZE 4 - /* Cluster index read task is mandatory */ #define COST_READ_CLUSTERED_INDEX 1.0 @@ -129,7 +126,6 @@ struct index_def_t { index_field_t* fields; /*!< field definitions */ st_mysql_ftparser* parser; /*!< fulltext parser plugin */ - bool is_ngram; /*!< true if it's ngram parser */ }; /** Structure for reporting duplicate records. */ @@ -195,7 +191,7 @@ row_merge_drop_temp_indexes(void); /** Create temporary merge files in the given paramater path, and if UNIV_PFS_IO defined, register the file descriptor with Performance Schema. -@param[in] path location for creating temporary merge files. +@param[in] path location for creating temporary merge files, or NULL @return File descriptor */ int row_merge_file_create_low( @@ -374,15 +370,15 @@ row_merge_buf_sort( /********************************************************************//** Write a merge block to the file system. -@return TRUE if request was successful, FALSE if fail */ -ibool +@return whether the request was completed successfully */ +UNIV_INTERN +bool row_merge_write( /*============*/ int fd, /*!< in: file descriptor */ ulint offset, /*!< in: offset where to write, in number of row_merge_block_t elements */ const void* buf, /*!< in: data */ - fil_space_crypt_t* crypt_data, /*!< in: table crypt data */ void* crypt_buf, /*!< in: crypt buf or NULL */ ulint space) /*!< in: space id */ MY_ATTRIBUTE((warn_unused_result)); @@ -398,13 +394,13 @@ row_merge_buf_empty( /** Create a merge file in the given location. @param[out] merge_file merge file structure -@param[in] path location for creating temporary file +@param[in] path location for creating temporary file, or NULL @return file descriptor, or -1 on failure */ int row_merge_file_create( merge_file_t* merge_file, const char* path) - MY_ATTRIBUTE((warn_unused_result, nonnull)); + MY_ATTRIBUTE((warn_unused_result, nonnull(1))); /** Merge disk files. @param[in] trx transaction @@ -415,7 +411,6 @@ row_merge_file_create( @param[in] update_progress true, if we should update progress status @param[in] pct_progress total progress percent until now @param[in] pct_ocst current progress percent -@param[in] crypt_data tale crypt data @param[in] crypt_block crypt buf or NULL @param[in] space space_id @param[in,out] stage performance schema accounting object, used by @@ -433,7 +428,6 @@ row_merge_sort( const bool update_progress, const double pct_progress, const double pct_cost, - fil_space_crypt_t* crypt_data, row_merge_block_t* crypt_block, ulint space, ut_stage_alter_t* stage = NULL) @@ -464,10 +458,9 @@ row_merge_file_destroy( merge_file_t* merge_file) /*!< in/out: merge file structure */ MY_ATTRIBUTE((nonnull)); -/********************************************************************//** -Read a merge block from the file system. -@return TRUE if request was successful, FALSE if fail */ -ibool +/** Read a merge block from the file system. +@return whether the request was completed successfully */ +bool row_merge_read( /*===========*/ int fd, /*!< in: file descriptor */ @@ -475,7 +468,6 @@ row_merge_read( in number of row_merge_block_t elements */ row_merge_block_t* buf, /*!< out: data */ - fil_space_crypt_t* crypt_data,/*!< in: table crypt data */ row_merge_block_t* crypt_buf, /*!< in: crypt buf or NULL */ ulint space) /*!< in: space id */ MY_ATTRIBUTE((warn_unused_result)); @@ -496,7 +488,6 @@ row_merge_read_rec( or NULL on end of list (non-NULL on I/O error) */ ulint* offsets,/*!< out: offsets of mrec */ - fil_space_crypt_t* crypt_data,/*!< in: table crypt data */ row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */ ulint space) /*!< in: space id */ MY_ATTRIBUTE((warn_unused_result)); diff --git a/storage/innobase/include/row0mysql.h b/storage/innobase/include/row0mysql.h index 0557b585ae1..2b000603929 100644 --- a/storage/innobase/include/row0mysql.h +++ b/storage/innobase/include/row0mysql.h @@ -204,6 +204,7 @@ row_update_prebuilt_trx( row_prebuilt_t* prebuilt, /*!< in/out: prebuilt struct in MySQL handle */ trx_t* trx); /*!< in: transaction handle */ + /*********************************************************************//** Sets an AUTO_INC type lock on the table mentioned in prebuilt. The AUTO_INC lock gives exclusive access to the auto-inc counter of the @@ -261,23 +262,11 @@ row_get_prebuilt_update_vector( /*===========================*/ row_prebuilt_t* prebuilt); /*!< in: prebuilt struct in MySQL handle */ -/*********************************************************************//** -Checks if a table is such that we automatically created a clustered -index on it (on row id). -@return TRUE if the clustered index was generated automatically */ -ibool -row_table_got_default_clust_index( -/*==============================*/ - const dict_table_t* table); /*!< in: table */ - /** Does an update or delete of a row for MySQL. -@param[in] mysql_rec row in the MySQL format @param[in,out] prebuilt prebuilt struct in MySQL handle @return error code or DB_SUCCESS */ dberr_t -row_update_for_mysql( - const byte* mysql_rec, - row_prebuilt_t* prebuilt) +row_update_for_mysql(row_prebuilt_t* prebuilt) MY_ATTRIBUTE((warn_unused_result)); /** This can only be used when srv_locks_unsafe_for_binlog is TRUE or this @@ -365,7 +354,7 @@ row_create_table_for_mysql( trx_t* trx, /*!< in/out: transaction */ bool commit, /*!< in: if true, commit the transaction */ fil_encryption_t mode, /*!< in: encryption mode */ - ulint key_id) /*!< in: encryption key_id */ + uint32_t key_id) /*!< in: encryption key_id */ MY_ATTRIBUTE((warn_unused_result)); /*********************************************************************//** @@ -474,7 +463,7 @@ row_drop_table_for_mysql( /*********************************************************************//** Discards the tablespace of a table which stored in an .ibd file. Discarding means that this function deletes the .ibd file and assigns a new table id for -the table. Also the flag table->ibd_file_missing is set TRUE. +the table. Also the file_unreadable flag is set. @return error code or DB_SUCCESS */ dberr_t row_discard_tablespace_for_mysql( @@ -680,12 +669,6 @@ struct row_prebuilt_t { not to be confused with InnoDB externally stored columns (VARCHAR can be off-page too) */ - unsigned templ_contains_fixed_point:1;/*!< TRUE if the - template contains a column with - DATA_POINT. Since InnoDB regards - DATA_POINT as non-BLOB type, the - templ_contains_blob can't tell us - if there is DATA_POINT */ mysql_row_templ_t* mysql_template;/*!< template used to transform rows fast between MySQL and Innobase formats; memory for this template diff --git a/storage/innobase/include/row0row.h b/storage/innobase/include/row0row.h index 60f256fb200..d24ae37b13d 100644 --- a/storage/innobase/include/row0row.h +++ b/storage/innobase/include/row0row.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2016, MariaDB Corporation. +Copyright (c) 2016, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -30,6 +30,7 @@ Created 4/20/1996 Heikki Tuuri #include "univ.i" #include "data0data.h" #include "dict0types.h" +#include "ibuf0ibuf.h" #include "trx0types.h" #include "que0types.h" #include "mtr0mtr.h" @@ -387,6 +388,34 @@ row_raw_format( in bytes */ MY_ATTRIBUTE((nonnull, warn_unused_result)); +/** Prepare to start a mini-transaction to modify an index. +@param[in,out] mtr mini-transaction +@param[in,out] index possibly secondary index +@param[in] pessimistic whether this is a pessimistic operation */ +inline +void +row_mtr_start(mtr_t* mtr, dict_index_t* index, bool pessimistic) +{ + mtr->start(); + + switch (index->space) { + case IBUF_SPACE_ID: + if (pessimistic + && !(index->type & (DICT_UNIQUE | DICT_SPATIAL))) { + ibuf_free_excess_pages(); + } + break; + case SRV_TMP_SPACE_ID: + mtr->set_log_mode(MTR_LOG_NO_REDO); + break; + default: + mtr->set_named_space(index->space); + break; + } + + log_free_check(); +} + #include "row0row.ic" #endif diff --git a/storage/innobase/include/row0sel.h b/storage/innobase/include/row0sel.h index d4d55601bc2..d73c186b12e 100644 --- a/storage/innobase/include/row0sel.h +++ b/storage/innobase/include/row0sel.h @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1997, 2017, Oracle and/or its affiliates. Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under @@ -244,6 +244,18 @@ struct sel_buf_t{ when data != NULL */ }; +/** Copy used fields from cached row. +Copy cache record field by field, don't touch fields that +are not covered by current key. +@param[out] buf Where to copy the MySQL row. +@param[in] cached_rec What to copy (in MySQL row format). +@param[in] prebuilt prebuilt struct. */ +void +row_sel_copy_cached_fields_for_mysql( + byte* buf, + const byte* cached_rec, + row_prebuilt_t* prebuilt); + /** Query plan */ struct plan_t{ dict_table_t* table; /*!< table struct in the dictionary diff --git a/storage/innobase/include/row0trunc.h b/storage/innobase/include/row0trunc.h index b6c7810d522..56302a0e570 100644 --- a/storage/innobase/include/row0trunc.h +++ b/storage/innobase/include/row0trunc.h @@ -359,7 +359,7 @@ private: /** Encryption information of the table */ fil_encryption_t m_encryption; - uint m_key_id; + uint32_t m_key_id; /** Vector of tables to truncate. */ typedef std::vector > diff --git a/storage/innobase/include/srv0srv.h b/storage/innobase/include/srv0srv.h index 230d7b7effe..a51520e881c 100644 --- a/storage/innobase/include/srv0srv.h +++ b/storage/innobase/include/srv0srv.h @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1995, 2016, Oracle and/or its affiliates. All rights reserved. +Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved. Copyright (c) 2008, 2009, Google Inc. Copyright (c) 2009, Percona Inc. Copyright (c) 2013, 2017, MariaDB Corporation. @@ -57,15 +57,13 @@ Created 10/10/1995 Heikki Tuuri #include "ut0counter.h" #include "fil0fil.h" -struct fil_space_t; - -/* Global counters used inside InnoDB. */ -struct srv_stats_t { +/** Global counters used inside InnoDB. */ +struct srv_stats_t +{ typedef ib_counter_t ulint_ctr_64_t; - typedef ib_counter_t lsn_ctr_1_t; - typedef ib_counter_t ulint_ctr_1_t; - typedef ib_counter_t lint_ctr_1_t; - typedef ib_counter_t int64_ctr_1_t; + typedef simple_counter lsn_ctr_1_t; + typedef simple_counter ulint_ctr_1_t; + typedef simple_counter int64_ctr_1_t; /** Count the amount of data written in total (in bytes) */ ulint_ctr_1_t data_written; @@ -82,8 +80,9 @@ struct srv_stats_t { /** Amount of data written to the log files in bytes */ lsn_ctr_1_t os_log_written; - /** Number of writes being done to the log files */ - lint_ctr_1_t os_log_pending_writes; + /** Number of writes being done to the log files. + Protected by log_sys->write_mutex. */ + ulint_ctr_1_t os_log_pending_writes; /** We increase this counter, when we don't have enough space in the log buffer and have to flush it */ @@ -130,6 +129,14 @@ struct srv_stats_t { ulint_ctr_64_t pages_encrypted; /* Number of pages decrypted */ ulint_ctr_64_t pages_decrypted; + /* Number of merge blocks encrypted */ + ulint_ctr_64_t n_merge_blocks_encrypted; + /* Number of merge blocks decrypted */ + ulint_ctr_64_t n_merge_blocks_decrypted; + /* Number of row log blocks encrypted */ + ulint_ctr_64_t n_rowlog_blocks_encrypted; + /* Number of row log blocks decrypted */ + ulint_ctr_64_t n_rowlog_blocks_decrypted; /** Number of data read in total (in bytes) */ ulint_ctr_1_t data_read; @@ -141,7 +148,7 @@ struct srv_stats_t { ulint_ctr_1_t n_lock_wait_count; /** Number of threads currently waiting on database locks */ - lint_ctr_1_t n_lock_wait_current_count; + simple_counter n_lock_wait_current_count; /** Number of rows read. */ ulint_ctr_64_t n_rows_read; @@ -228,12 +235,6 @@ extern ib_mutex_t page_zip_stat_per_index_mutex; extern ib_mutex_t srv_monitor_file_mutex; /* Temporary file for innodb monitor output */ extern FILE* srv_monitor_file; -/* Mutex for locking srv_dict_tmpfile. Only created if !srv_read_only_mode. -This mutex has a very high rank; threads reserving it should not -be holding any InnoDB latches. */ -extern ib_mutex_t srv_dict_tmpfile_mutex; -/* Temporary file for output from the data dictionary */ -extern FILE* srv_dict_tmpfile; /* Mutex for locking srv_misc_tmpfile. Only created if !srv_read_only_mode. This mutex has a very low rank; threads reserving it should not acquire any further latches or sleep before releasing this one. */ @@ -318,6 +319,22 @@ segment). It is quite possible that some of the tablespaces doesn't host any of the rollback-segment based on configuration used. */ extern ulint srv_undo_tablespaces_active; +/** Undo tablespaces starts with space_id. */ +extern ulint srv_undo_space_id_start; + +/** Check whether given space id is undo tablespace id +@param[in] space_id space id to check +@return true if it is undo tablespace else false. */ +inline +bool +srv_is_undo_tablespace(ulint space_id) +{ + return srv_undo_space_id_start > 0 + && space_id >= srv_undo_space_id_start + && space_id < (srv_undo_space_id_start + + srv_undo_tablespaces_open); +} + /** The number of undo segments to use */ extern ulong srv_undo_logs; @@ -345,17 +362,9 @@ extern char* srv_log_group_home_dir; /** Maximum number of srv_n_log_files, or innodb_log_files_in_group */ #define SRV_N_LOG_FILES_MAX 100 extern ulong srv_n_log_files; -/** At startup, this is the current redo log file size. -During startup, if this is different from srv_log_file_size_requested -(innodb_log_file_size), the redo log will be rebuilt and this size -will be initialized to srv_log_file_size_requested. -When upgrading from a previous redo log format, this will be set to 0, -and writing to the redo log is not allowed. - -During startup, this is in bytes, and later converted to pages. */ -extern ib_uint64_t srv_log_file_size; -/** The value of the startup parameter innodb_log_file_size */ -extern ib_uint64_t srv_log_file_size_requested; +/** The InnoDB redo log file size, or 0 when changing the redo log format +at startup (while disallowing writes to the redo log). */ +extern ulonglong srv_log_file_size; extern ulint srv_log_buffer_size; extern ulong srv_flush_log_at_trx_commit; extern uint srv_flush_log_at_timeout; @@ -493,6 +502,21 @@ extern ulong srv_max_purge_lag_delay; extern ulong srv_replication_delay; /*-------------------------------------------*/ +/** Modes of operation */ +enum srv_operation_mode { + /** Normal mode (MariaDB Server) */ + SRV_OPERATION_NORMAL, + /** Mariabackup taking a backup */ + SRV_OPERATION_BACKUP, + /** Mariabackup restoring a backup */ + SRV_OPERATION_RESTORE, + /** Mariabackup restoring the incremental part of a backup */ + SRV_OPERATION_RESTORE_DELTA +}; + +/** Current mode of operation */ +extern enum srv_operation_mode srv_operation; + extern my_bool srv_print_innodb_monitor; extern my_bool srv_print_innodb_lock_monitor; extern ibool srv_print_verbose_log; @@ -531,7 +555,10 @@ extern my_bool srv_purge_view_update_only_debug; /** Value of MySQL global used to disable master thread. */ extern my_bool srv_master_thread_disabled_debug; +/** InnoDB system tablespace to set during recovery */ extern uint srv_sys_space_size_debug; +/** whether redo log files have been created at startup */ +extern bool srv_log_files_created; #endif /* UNIV_DEBUG */ #define SRV_SEMAPHORE_WAIT_EXTENSION 7200 @@ -1033,6 +1060,15 @@ struct export_var_t{ int64_t innodb_pages_decrypted; /*!< Number of pages decrypted */ + /*!< Number of merge blocks encrypted */ + ib_int64_t innodb_n_merge_blocks_encrypted; + /*!< Number of merge blocks decrypted */ + ib_int64_t innodb_n_merge_blocks_decrypted; + /*!< Number of row log blocks encrypted */ + ib_int64_t innodb_n_rowlog_blocks_encrypted; + /*!< Number of row log blocks decrypted */ + ib_int64_t innodb_n_rowlog_blocks_decrypted; + ulint innodb_sec_rec_cluster_reads; /*!< srv_sec_rec_cluster_reads */ ulint innodb_sec_rec_cluster_reads_avoided;/*!< srv_sec_rec_cluster_reads_avoided */ diff --git a/storage/innobase/include/srv0start.h b/storage/innobase/include/srv0start.h index 4f2f4a312ff..3575f2e40b9 100644 --- a/storage/innobase/include/srv0start.h +++ b/storage/innobase/include/srv0start.h @@ -1,7 +1,7 @@ /***************************************************************************** -Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation +Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -38,43 +38,26 @@ struct dict_table_t; only one buffer pool instance is used. */ #define BUF_POOL_SIZE_THRESHOLD (1024 * 1024 * 1024) -/*********************************************************************//** -Parse temporary tablespace configuration. -@return true if ok, false on parse error */ -bool -srv_parse_temp_data_file_paths_and_sizes( -/*=====================================*/ - char* str); /*!< in/out: the data file path string */ -/*********************************************************************//** -Frees the memory allocated by srv_parse_data_file_paths_and_sizes() -and srv_parse_log_group_home_dirs(). */ -void -srv_free_paths_and_sizes(void); -/*==========================*/ -/*********************************************************************//** -Adds a slash or a backslash to the end of a string if it is missing -and the string is not empty. -@return string which has the separator if the string is not empty */ -char* -srv_add_path_separator_if_needed( -/*=============================*/ - char* str); /*!< in: null-terminated character string */ +/** Open the configured number of dedicated undo tablespaces. +@param[in] create_new_db whether the database is being initialized +@return DB_SUCCESS or error code */ +dberr_t +srv_undo_tablespaces_init(bool create_new_db); /****************************************************************//** Starts Innobase and creates a new database if database files are not found and the user wants. @return DB_SUCCESS or error code */ dberr_t -innobase_start_or_create_for_mysql(void); -/*====================================*/ +innobase_start_or_create_for_mysql(); + /** Shut down InnoDB. */ void innodb_shutdown(); -/****************************************************************//** -Shuts down background threads that can generate undo pages. */ +/** Shut down background threads that can generate undo log. */ void -srv_shutdown_bg_undo_sources(void); +srv_shutdown_bg_undo_sources(); /*************************************************************//** Copy the file path component of the physical file to parameter. It will @@ -144,7 +127,13 @@ enum srv_shutdown_t { SRV_SHUTDOWN_EXIT_THREADS/*!< Exit all threads */ }; +/** Whether any undo log records can be generated */ +extern bool srv_undo_sources; + /** At a shutdown this value climbs from SRV_SHUTDOWN_NONE to SRV_SHUTDOWN_CLEANUP and then to SRV_SHUTDOWN_LAST_PHASE, and so on */ extern enum srv_shutdown_t srv_shutdown_state; + +/** Files comprising the system tablespace */ +extern pfs_os_file_t files[1000]; #endif diff --git a/storage/innobase/include/sync0debug.h b/storage/innobase/include/sync0debug.h index ba697b70e13..ecc742918f0 100644 --- a/storage/innobase/include/sync0debug.h +++ b/storage/innobase/include/sync0debug.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2013, 2015, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -84,10 +84,10 @@ sync_check_find(latch_level_t level); /** Checks that the level array for the current thread is empty. Terminate iteration if the functor returns true. -@param[in,out] functor called for each element. -@return true if the functor returns true */ +@param[in] functor called for each element. +@return true if the functor returns true for any element */ bool -sync_check_iterate(sync_check_functor_t& functor); +sync_check_iterate(const sync_check_functor_t& functor); /** Acquires the debug mutex. We cannot use the mutex defined in sync0sync, because the debug mutex is also acquired in sync0arr while holding the OS diff --git a/storage/innobase/include/sync0policy.h b/storage/innobase/include/sync0policy.h index 410e46f9c68..1b86d2633bf 100644 --- a/storage/innobase/include/sync0policy.h +++ b/storage/innobase/include/sync0policy.h @@ -61,7 +61,7 @@ public: : latch_t(id) { - /* No op */ + ut_ad(id != LATCH_ID_NONE); } /** Set to locked state diff --git a/storage/innobase/include/sync0sync.h b/storage/innobase/include/sync0sync.h index 7157b07e9d0..55aaf5032e8 100644 --- a/storage/innobase/include/sync0sync.h +++ b/storage/innobase/include/sync0sync.h @@ -91,7 +91,6 @@ extern mysql_pfs_key_t rw_lock_debug_mutex_key; # endif /* UNIV_DEBUG */ extern mysql_pfs_key_t rw_lock_list_mutex_key; extern mysql_pfs_key_t rw_lock_mutex_key; -extern mysql_pfs_key_t srv_dict_tmpfile_mutex_key; extern mysql_pfs_key_t srv_innodb_monitor_mutex_key; extern mysql_pfs_key_t srv_misc_tmpfile_mutex_key; extern mysql_pfs_key_t srv_monitor_file_mutex_key; diff --git a/storage/innobase/include/sync0types.h b/storage/innobase/include/sync0types.h index 1d11bfa7811..8d08416cccd 100644 --- a/storage/innobase/include/sync0types.h +++ b/storage/innobase/include/sync0types.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -260,9 +260,9 @@ enum latch_level_t { SYNC_TREE_NODE, SYNC_TREE_NODE_FROM_HASH, SYNC_TREE_NODE_NEW, + SYNC_IBUF_PESS_INSERT_MUTEX, SYNC_INDEX_TREE, - SYNC_IBUF_PESS_INSERT_MUTEX, SYNC_IBUF_HEADER, SYNC_DICT_HEADER, SYNC_STATS_AUTO_RECALC, @@ -270,10 +270,10 @@ enum latch_level_t { SYNC_DICT, SYNC_FTS_CACHE, - SYNC_DICT_OPERATION, - SYNC_FILE_FORMAT_TAG, + SYNC_DICT_OPERATION, + SYNC_TRX_I_S_LAST_READ, SYNC_TRX_I_S_RWLOCK, @@ -335,7 +335,6 @@ enum latch_id_t { LATCH_ID_RTR_PATH_MUTEX, LATCH_ID_RW_LOCK_LIST, LATCH_ID_RW_LOCK_MUTEX, - LATCH_ID_SRV_DICT_TMPFILE, LATCH_ID_SRV_INNODB_MONITOR, LATCH_ID_SRV_MISC_TMPFILE, LATCH_ID_SRV_MONITOR_FILE, @@ -354,7 +353,6 @@ enum latch_id_t { LATCH_ID_EVENT_MANAGER, LATCH_ID_EVENT_MUTEX, LATCH_ID_SYNC_ARRAY_MUTEX, - LATCH_ID_THREAD_MUTEX, LATCH_ID_ZIP_PAD_MUTEX, LATCH_ID_OS_AIO_READ_MUTEX, LATCH_ID_OS_AIO_WRITE_MUTEX, @@ -1080,107 +1078,43 @@ struct latch_t { /** Subclass this to iterate over a thread's acquired latch levels. */ struct sync_check_functor_t { virtual ~sync_check_functor_t() { } - virtual bool operator()(const latch_level_t) = 0; - virtual bool result() const = 0; + virtual bool operator()(const latch_level_t) const = 0; }; -#ifdef BTR_CUR_HASH_ADAPT -/** Functor to check whether the calling thread owns the btr search mutex. */ -struct btrsea_sync_check : public sync_check_functor_t { - - /** Constructor - @param[in] has_search_latch true if owns the latch */ - explicit btrsea_sync_check(bool has_search_latch) - : - m_result(), - m_has_search_latch(has_search_latch) { } - - /** Destructor */ - virtual ~btrsea_sync_check() { } - - /** Called for every latch owned by the calling thread. - @param[in] level Level of the existing latch - @return true if the predicate check is successful */ - virtual bool operator()(const latch_level_t level) - { - /* If calling thread doesn't hold search latch then - check if there are latch level exception provided. */ - - if (!m_has_search_latch - && (level != SYNC_SEARCH_SYS - && level != SYNC_FTS_CACHE)) { - - m_result = true; - - return(m_result); - } - - return(false); - } - - /** @return result from the check */ - virtual bool result() const - { - return(m_result); - } - -private: - /** True if all OK */ - bool m_result; - - /** If the caller owns the search latch */ - const bool m_has_search_latch; -}; -#endif /* BTR_CUR_HASH_ADAPT */ - -/** Functor to check for dictionay latching constraints. */ -struct dict_sync_check : public sync_check_functor_t { - - /** Constructor - @param[in] dict_mutex_allow true if the dict mutex - is allowed */ - explicit dict_sync_check(bool dict_mutex_allowed) - : - m_result(), - m_dict_mutex_allowed(dict_mutex_allowed) { } - - /** Destructor */ - virtual ~dict_sync_check() { } - +/** Check that no latch is being held. +@tparam some_allowed whether some latches are allowed to be held */ +template +struct sync_checker : public sync_check_functor_t +{ /** Check the latching constraints - @param[in] level The level held by the thread */ - virtual bool operator()(const latch_level_t level) + @param[in] level The level held by the thread + @return whether a latch violation was detected */ + bool operator()(const latch_level_t level) const { - if (!m_dict_mutex_allowed - || (level != SYNC_DICT - && level != SYNC_DICT_OPERATION - && level != SYNC_FTS_CACHE - /* This only happens in recv_apply_hashed_log_recs. */ - && level != SYNC_RECV_WRITER - && level != SYNC_NO_ORDER_CHECK)) { - - m_result = true; - - return(true); + if (some_allowed) { + switch (level) { + case SYNC_RECV_WRITER: + /* This only happens in + recv_apply_hashed_log_recs. */ + case SYNC_DICT: + case SYNC_DICT_OPERATION: + case SYNC_FTS_CACHE: + case SYNC_NO_ORDER_CHECK: + return(false); + default: + return(true); + } } - return(false); + return(true); } - - /** @return the result of the check */ - virtual bool result() const - { - return(m_result); - } - -private: - /** True if all OK */ - bool m_result; - - /** True if it is OK to hold the dict mutex */ - const bool m_dict_mutex_allowed; }; +/** The strict latch checker (no InnoDB latches may be held) */ +typedef struct sync_checker sync_check; +/** The sloppy latch checker (can hold InnoDB dictionary or SQL latches) */ +typedef struct sync_checker dict_sync_check; + /** Functor to check for given latching constraints. */ struct sync_allowed_latches : public sync_check_functor_t { @@ -1190,9 +1124,7 @@ struct sync_allowed_latches : public sync_check_functor_t { sync_allowed_latches( const latch_level_t* from, const latch_level_t* to) - : - m_result(), - m_latches(from, to) { } + : begin(from), end(to) { } /** Checks whether the given latch_t violates the latch constraint. This object maintains a list of allowed latch levels, and if the given @@ -1200,41 +1132,17 @@ struct sync_allowed_latches : public sync_check_functor_t { then it is a violation. @param[in] latch The latch level to check - @return true if there is a latch ordering violation */ - virtual bool operator()(const latch_level_t level) + @return true if there is a latch violation */ + bool operator()(const latch_level_t level) const { - for (latches_t::const_iterator it = m_latches.begin(); - it != m_latches.end(); - ++it) { - - if (level == *it) { - - m_result = false; - - /* No violation */ - return(false); - } - } - - return(true); - } - - /** @return the result of the check */ - virtual bool result() const - { - return(m_result); + return(std::find(begin, end, level) == end); } private: - /** Save the result of validation check here - True if all OK */ - bool m_result; - - typedef std::vector > - latches_t; - - /** List of latch levels that are allowed to be held */ - latches_t m_latches; + /** First element in an array of allowed latch levels */ + const latch_level_t* const begin; + /** First element after the end of the array of allowed latch levels */ + const latch_level_t* const end; }; /** Get the latch id from a latch name. @@ -1266,4 +1174,51 @@ enum rw_lock_flag_t { #define my_atomic_caslint my_atomic_caslong #endif +/** Simple counter aligned to CACHE_LINE_SIZE +@tparam Type the integer type of the counter +@tparam atomic whether to use atomic memory access */ +template +struct MY_ALIGNED(CPU_LEVEL1_DCACHE_LINESIZE) simple_counter +{ + /** Increment the counter */ + Type inc() { return add(1); } + /** Decrement the counter */ + Type dec() { return sub(1); } + + /** Add to the counter + @param[in] i amount to be added + @return the value of the counter after adding */ + Type add(Type i) + { + compile_time_assert(!atomic || sizeof(Type) == sizeof(lint)); + if (atomic) { + /* Silence MSVS warnings when instantiating + this template with atomic=false. */ + return Type(my_atomic_addlint(reinterpret_cast + (&m_counter), i)); + } else { + return m_counter += i; + } + } + /** Subtract from the counter + @param[in] i amount to be subtracted + @return the value of the counter after adding */ + Type sub(Type i) + { + compile_time_assert(!atomic || sizeof(Type) == sizeof(lint)); + if (atomic) { + return Type(my_atomic_addlint(&m_counter, -lint(i))); + } else { + return m_counter -= i; + } + } + + /** @return the value of the counter (non-atomic access)! */ + operator Type() const { return m_counter; } + +private: + /** The counter */ + Type m_counter; +}; + #endif /* sync0types_h */ diff --git a/storage/innobase/include/trx0i_s.h b/storage/innobase/include/trx0i_s.h index 17a297527af..e02c5d88a29 100644 --- a/storage/innobase/include/trx0i_s.h +++ b/storage/innobase/include/trx0i_s.h @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 2007, 2015, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -162,10 +163,6 @@ struct i_s_trx_row_t { /*!< check_foreigns in trx_t */ const char* trx_foreign_key_error; /*!< detailed_error in trx_t */ -#ifdef BTR_CUR_HASH_ADAPT - ibool trx_has_search_latch; - /*!< has_search_latch in trx_t */ -#endif /* BTR_CUR_HASH_ADAPT */ ulint trx_is_read_only; /*!< trx_t::read_only */ ulint trx_is_autocommit_non_locking; diff --git a/storage/innobase/include/trx0rec.h b/storage/innobase/include/trx0rec.h index 50304ce3631..3b4a195735b 100644 --- a/storage/innobase/include/trx0rec.h +++ b/storage/innobase/include/trx0rec.h @@ -188,28 +188,28 @@ transaction. dberr_t trx_undo_report_row_operation( /*==========================*/ - ulint flags, /*!< in: if BTR_NO_UNDO_LOG_FLAG bit is - set, does nothing */ - ulint op_type, /*!< in: TRX_UNDO_INSERT_OP or - TRX_UNDO_MODIFY_OP */ que_thr_t* thr, /*!< in: query thread */ dict_index_t* index, /*!< in: clustered index */ const dtuple_t* clust_entry, /*!< in: in the case of an insert, index entry to insert into the - clustered index, otherwise NULL */ + clustered index; in updates, + may contain a clustered index + record tuple that also contains + virtual columns of the table; + otherwise, NULL */ const upd_t* update, /*!< in: in the case of an update, the update vector, otherwise NULL */ ulint cmpl_info, /*!< in: compiler info on secondary index updates */ const rec_t* rec, /*!< in: case of an update or delete marking, the record in the clustered - index, otherwise NULL */ + index; NULL if insert */ const ulint* offsets, /*!< in: rec_get_offsets(rec) */ roll_ptr_t* roll_ptr) /*!< out: rollback pointer to the inserted undo log record, 0 if BTR_NO_UNDO_LOG flag was specified */ - MY_ATTRIBUTE((nonnull(3,4,10), warn_unused_result)); + MY_ATTRIBUTE((nonnull(1,2,8), warn_unused_result)); /** status bit used for trx_undo_prev_version_build() */ @@ -341,10 +341,6 @@ record */ storage fields: used by purge to free the external storage */ -/* Operation type flags used in trx_undo_report_row_operation */ -#define TRX_UNDO_INSERT_OP 1U -#define TRX_UNDO_MODIFY_OP 2U - #include "trx0rec.ic" #endif /* trx0rec_h */ diff --git a/storage/innobase/include/trx0rseg.h b/storage/innobase/include/trx0rseg.h index 4c162526384..48c5133644c 100644 --- a/storage/innobase/include/trx0rseg.h +++ b/storage/innobase/include/trx0rseg.h @@ -110,9 +110,12 @@ void trx_rseg_mem_free(trx_rseg_t* rseg); /** Create a persistent rollback segment. -@param[in] space_id system or undo tablespace id */ +@param[in] space_id system or undo tablespace id +@return pointer to new rollback segment +@retval NULL on failure */ trx_rseg_t* -trx_rseg_create(ulint space_id); +trx_rseg_create(ulint space_id) + MY_ATTRIBUTE((warn_unused_result)); /** Create the temporary rollback segments. */ void @@ -200,9 +203,17 @@ struct trx_rseg_t { bool is_persistent() const { ut_ad(space == SRV_TMP_SPACE_ID - || space <= TRX_SYS_MAX_UNDO_SPACES); + || space == TRX_SYS_SPACE + || (srv_undo_space_id_start > 0 + && space >= srv_undo_space_id_start + && space <= srv_undo_space_id_start + + TRX_SYS_MAX_UNDO_SPACES)); ut_ad(space == SRV_TMP_SPACE_ID - || space <= srv_undo_tablespaces_active + || space == TRX_SYS_SPACE + || (srv_undo_space_id_start > 0 + && space >= srv_undo_space_id_start + && space <= srv_undo_space_id_start + + srv_undo_tablespaces_active) || !srv_was_started); return(space != SRV_TMP_SPACE_ID); } diff --git a/storage/innobase/include/trx0sys.h b/storage/innobase/include/trx0sys.h index bf8cf2481eb..ebe70a1c70e 100644 --- a/storage/innobase/include/trx0sys.h +++ b/storage/innobase/include/trx0sys.h @@ -236,30 +236,31 @@ trx_sys_update_mysql_binlog_offset( /*===============================*/ const char* file_name,/*!< in: MySQL log file name */ int64_t offset, /*!< in: position in that log file */ - ulint field, /*!< in: offset of the MySQL log info field in - the trx sys header */ trx_sysf_t* sys_header, /*!< in: trx sys header */ mtr_t* mtr); /*!< in: mtr */ -/*****************************************************************//** -Prints to stderr the MySQL binlog offset info in the trx system header if -the magic number shows it valid. */ +/** Display the MySQL binlog offset info if it is present in the trx +system header. */ void -trx_sys_print_mysql_binlog_offset(void); -/*===================================*/ +trx_sys_print_mysql_binlog_offset(); #ifdef WITH_WSREP -/** Update WSREP checkpoint XID in sys header. */ + +/** Update WSREP XID info in sys_header of TRX_SYS_PAGE_NO = 5. +@param[in] xid Transaction XID +@param[in,out] sys_header sys_header +@param[in] mtr minitransaction */ +UNIV_INTERN void trx_sys_update_wsrep_checkpoint( -/*============================*/ - const XID* xid, /*!< in: WSREP XID */ - trx_sysf_t* sys_header, /*!< in: sys_header */ - mtr_t* mtr); /*!< in: mtr */ + const XID* xid, + trx_sysf_t* sys_header, + mtr_t* mtr); -void -/** Read WSREP checkpoint XID from sys header. */ -trx_sys_read_wsrep_checkpoint( -/*==========================*/ - XID* xid); /*!< out: WSREP XID */ +/** Read WSREP checkpoint XID from sys header. +@param[out] xid WSREP XID +@return whether the checkpoint was present */ +UNIV_INTERN +bool +trx_sys_read_wsrep_checkpoint(XID* xid); #endif /* WITH_WSREP */ /** Initializes the tablespace tag system. */ @@ -420,19 +421,75 @@ impose the 7 bit restriction. e.g., mach_write_to_3() */ TRX_SYS_MYSQL_LOG_MAGIC_N if we have valid data in the MySQL binlog info */ -#define TRX_SYS_MYSQL_LOG_OFFSET_HIGH 4 /*!< high 4 bytes of the offset - within that file */ -#define TRX_SYS_MYSQL_LOG_OFFSET_LOW 8 /*!< low 4 bytes of the offset +#define TRX_SYS_MYSQL_LOG_OFFSET 4 /*!< the 64-bit offset within that file */ #define TRX_SYS_MYSQL_LOG_NAME 12 /*!< MySQL log file name */ +/** Memory map TRX_SYS_PAGE_NO = 5 when UNIV_PAGE_SIZE = 4096 + +0...37 FIL_HEADER +38...45 TRX_SYS_TRX_ID_STORE +46...55 TRX_SYS_FSEG_HEADER (FSEG_HEADER_SIZE == 10) +56 TRX_SYS_RSEGS + 56...59 TRX_SYS_RSEG_SPACE for slot 0 + 60...63 TRX_SYS_RSEG_PAGE_NO for slot 0 + 64...67 TRX_SYS_RSEG_SPACE for slot 1 + 68...71 TRX_SYS_RSEG_PAGE_NO for slot 1 +.... + 594..597 TRX_SYS_RSEG_SPACE for slot 72 + 598..601 TRX_SYS_RSEG_PAGE_NO for slot 72 +... + ...1063 TRX_SYS_RSEG_PAGE_NO for slot 126 + +(UNIV_PAGE_SIZE-3500 WSREP ::: FAIL would overwrite undo tablespace +space_id, page_no pairs :::) +596 TRX_SYS_WSREP_XID_INFO TRX_SYS_WSREP_XID_MAGIC_N_FLD +600 TRX_SYS_WSREP_XID_FORMAT +604 TRX_SYS_WSREP_XID_GTRID_LEN +608 TRX_SYS_WSREP_XID_BQUAL_LEN +612 TRX_SYS_WSREP_XID_DATA (len = 128) +739 TRX_SYS_WSREP_XID_DATA_END + +FIXED WSREP XID info offsets for 4k page size 10.0.32-galera +(UNIV_PAGE_SIZE-2500) +1596 TRX_SYS_WSREP_XID_INFO TRX_SYS_WSREP_XID_MAGIC_N_FLD +1600 TRX_SYS_WSREP_XID_FORMAT +1604 TRX_SYS_WSREP_XID_GTRID_LEN +1608 TRX_SYS_WSREP_XID_BQUAL_LEN +1612 TRX_SYS_WSREP_XID_DATA (len = 128) +1739 TRX_SYS_WSREP_XID_DATA_END + +(UNIV_PAGE_SIZE - 2000 MYSQL MASTER LOG) +2096 TRX_SYS_MYSQL_MASTER_LOG_INFO TRX_SYS_MYSQL_LOG_MAGIC_N_FLD +2100 TRX_SYS_MYSQL_LOG_OFFSET_HIGH +2104 TRX_SYS_MYSQL_LOG_OFFSET_LOW +2108 TRX_SYS_MYSQL_LOG_NAME + +(UNIV_PAGE_SIZE - 1000 MYSQL LOG) +3096 TRX_SYS_MYSQL_LOG_INFO TRX_SYS_MYSQL_LOG_MAGIC_N_FLD +3100 TRX_SYS_MYSQL_LOG_OFFSET_HIGH +3104 TRX_SYS_MYSQL_LOG_OFFSET_LOW +3108 TRX_SYS_MYSQL_LOG_NAME + +(UNIV_PAGE_SIZE - 200 DOUBLEWRITE) +3896 TRX_SYS_DOUBLEWRITE TRX_SYS_DOUBLEWRITE_FSEG +3906 TRX_SYS_DOUBLEWRITE_MAGIC +3910 TRX_SYS_DOUBLEWRITE_BLOCK1 +3914 TRX_SYS_DOUBLEWRITE_BLOCK2 +3918 TRX_SYS_DOUBLEWRITE_REPEAT +3930 TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED_N + +(UNIV_PAGE_SIZE - 8, TAILER) +4088..4096 FIL_TAILER + +*/ #ifdef WITH_WSREP -/* The offset to WSREP XID headers */ -#define TRX_SYS_WSREP_XID_INFO (UNIV_PAGE_SIZE - 3500) +/** The offset to WSREP XID headers */ +#define TRX_SYS_WSREP_XID_INFO std::max(srv_page_size - 3500, 1596UL) #define TRX_SYS_WSREP_XID_MAGIC_N_FLD 0 #define TRX_SYS_WSREP_XID_MAGIC_N 0x77737265 -/* XID field: formatID, gtrid_len, bqual_len, xid_data */ +/** XID field: formatID, gtrid_len, bqual_len, xid_data */ #define TRX_SYS_WSREP_XID_LEN (4 + 4 + 4 + XIDDATASIZE) #define TRX_SYS_WSREP_XID_FORMAT 4 #define TRX_SYS_WSREP_XID_GTRID_LEN 8 diff --git a/storage/innobase/include/trx0trx.h b/storage/innobase/include/trx0trx.h index 446e619abb9..b2d4952318c 100644 --- a/storage/innobase/include/trx0trx.h +++ b/storage/innobase/include/trx0trx.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2016, 2017, MariaDB Corporation. +Copyright (c) 2015, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -58,15 +58,6 @@ class FlushObserver; /** Dummy session used currently in MySQL interface */ extern sess_t* trx_dummy_sess; -#ifdef BTR_CUR_HASH_ADAPT -/** Assert that the transaction is not holding the adaptive hash index latch. -@param[in] trx transaction */ -# define trx_assert_no_search_latch(trx) \ - ut_ad(!trx->has_search_latch) -#else /* BTR_CUR_HASH_ADAPT */ -# define trx_assert_no_search_latch(trx) -#endif - /** Set flush observer for the transaction @param[in/out] trx transaction struct @param[in] observer flush observer */ @@ -1072,11 +1063,6 @@ struct trx_t { flush the log in trx_commit_complete_for_mysql() */ ulint duplicates; /*!< TRX_DUP_IGNORE | TRX_DUP_REPLACE */ -#ifdef BTR_CUR_HASH_ADAPT - bool has_search_latch; - /*!< TRUE if this trx has latched the - search system latch in S-mode */ -#endif /* BTR_CUR_HASH_ADAPT */ trx_dict_op_t dict_operation; /**< @see enum trx_dict_op_t */ /* Fields protected by the srv_conc_mutex. */ @@ -1508,19 +1494,11 @@ private: } /* Avoid excessive mutex acquire/release */ - ++trx->in_depth; - - /* If trx->in_depth is greater than 1 then - transaction is already in InnoDB. */ - if (trx->in_depth > 1) { - + if (trx->in_depth++) { + /* The transaction is already inside InnoDB. */ return; } - /* Only the owning thread should release the latch. */ - - trx_assert_no_search_latch(trx); - trx_mutex_enter(trx); wait(trx); @@ -1545,17 +1523,10 @@ private: ut_ad(trx->in_depth > 0); - --trx->in_depth; - - if (trx->in_depth > 0) { - + if (--trx->in_depth) { return; } - /* Only the owning thread should release the latch. */ - - trx_assert_no_search_latch(trx); - trx_mutex_enter(trx); ut_ad((trx->in_innodb & TRX_FORCE_ROLLBACK_MASK) > 0); diff --git a/storage/innobase/include/trx0undo.h b/storage/innobase/include/trx0undo.h index cdf97b6a9cf..b1d442a9acf 100644 --- a/storage/innobase/include/trx0undo.h +++ b/storage/innobase/include/trx0undo.h @@ -319,7 +319,7 @@ void trx_undo_free_prepared( /*===================*/ trx_t* trx) /*!< in/out: PREPARED transaction */ - UNIV_COLD MY_ATTRIBUTE((nonnull)); + ATTRIBUTE_COLD __attribute__((nonnull)); /* Forward declaration. */ namespace undo { diff --git a/storage/innobase/include/trx0xa.h b/storage/innobase/include/trx0xa.h index b333f32cd73..4d5adc68dcd 100644 --- a/storage/innobase/include/trx0xa.h +++ b/storage/innobase/include/trx0xa.h @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1995, 2014, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -24,12 +24,7 @@ this program; if not, write to the Free Software Foundation, Inc., #ifndef XA_H #define XA_H -/* Missing MySQL 5.7 header */ -#ifdef HAVE_XA_H -#include "xa.h" -#else #include "handler.h" -#endif /* * Transaction branch identification: XID and NULLXID: diff --git a/storage/innobase/include/univ.i b/storage/innobase/include/univ.i index ee759534301..e797fd7bef7 100644 --- a/storage/innobase/include/univ.i +++ b/storage/innobase/include/univ.i @@ -41,7 +41,7 @@ Created 1/20/1994 Heikki Tuuri #define INNODB_VERSION_MAJOR 5 #define INNODB_VERSION_MINOR 7 -#define INNODB_VERSION_BUGFIX 14 +#define INNODB_VERSION_BUGFIX 19 /* The following is the InnoDB version as shown in SELECT plugin_version FROM information_schema.plugins; @@ -108,27 +108,15 @@ support cross-platform development and expose comonly used SQL names. */ #include #endif -#ifdef UNIV_INNOCHECKSUM -extern bool strict_verify; -extern FILE* log_file; -extern uintmax_t cur_page_num; -#endif /* UNIV_INNOCHECKSUM */ - #include "my_pthread.h" + /* Following defines are to enable performance schema instrumentation in each of five InnoDB modules if HAVE_PSI_INTERFACE is defined. */ #ifdef HAVE_PSI_INTERFACE # define UNIV_PFS_MUTEX # define UNIV_PFS_RWLOCK -/* For I/O instrumentation, performance schema rely -on a native descriptor to identify the file, this -descriptor could conflict with our OS level descriptor. -Disable IO instrumentation on Windows until this is -resolved */ -# ifndef _WIN32 -# define UNIV_PFS_IO -# endif +# define UNIV_PFS_IO # define UNIV_PFS_THREAD // JAN: TODO: MySQL 5.7 PSI @@ -191,9 +179,9 @@ command. */ #define UNIV_ENABLE_UNIT_TEST_ROW_RAW_FORMAT_INT */ -#if defined HAVE_valgrind && defined HAVE_VALGRIND +#if defined HAVE_valgrind && defined HAVE_VALGRIND_MEMCHECK_H # define UNIV_DEBUG_VALGRIND -#endif /* HAVE_VALGRIND */ +#endif #ifdef DBUG_OFF # undef UNIV_DEBUG @@ -270,23 +258,6 @@ easy way to get it to work. See http://bugs.mysql.com/bug.php?id=52263. */ #endif #endif -#if defined(COMPILER_HINTS) \ - && defined __GNUC__ \ - && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 3) - -/** Starting with GCC 4.3, the "cold" attribute is used to inform the -compiler that a function is unlikely executed. The function is -optimized for size rather than speed and on many targets it is placed -into special subsection of the text section so all cold functions -appears close together improving code locality of non-cold parts of -program. The paths leading to call of cold functions within code are -marked as unlikely by the branch prediction mechanism. optimize a -rarely invoked function for size instead for speed. */ -# define UNIV_COLD MY_ATTRIBUTE((cold)) -#else -# define UNIV_COLD /* empty */ -#endif - #define UNIV_INLINE static inline #define UNIV_WORD_SIZE SIZEOF_SIZE_T @@ -494,6 +465,12 @@ in both 32-bit and 64-bit environments. */ # define UINT64PFx "%016" PRIx64 #endif +#ifdef UNIV_INNOCHECKSUM +extern bool strict_verify; +extern FILE* log_file; +extern unsigned long long cur_page_num; +#endif /* UNIV_INNOCHECKSUM */ + typedef int64_t ib_int64_t; typedef uint64_t ib_uint64_t; typedef uint32_t ib_uint32_t; @@ -625,7 +602,7 @@ Windows, so define a typedef for it and a macro to use at the end of such functions. */ #ifdef _WIN32 -typedef ulint os_thread_ret_t; +typedef DWORD os_thread_ret_t; # define OS_THREAD_DUMMY_RETURN return(0) # define OS_PATH_SEPARATOR '\\' # define OS_PATH_SEPARATOR_ALT '/' diff --git a/storage/innobase/include/ut0counter.h b/storage/innobase/include/ut0counter.h index 70381f26a84..f1a9384667e 100644 --- a/storage/innobase/include/ut0counter.h +++ b/storage/innobase/include/ut0counter.h @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 2012, 2015, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -44,8 +45,6 @@ Created 2012/04/12 by Sunny Bains /** Get the offset into the counter array. */ template struct generic_indexer_t { - /** Default constructor/destructor should be OK. */ - /** @return offset within m_counter */ static size_t offset(size_t index) UNIV_NOTHROW { @@ -57,11 +56,6 @@ struct generic_indexer_t { to index into the counter array. See the comments for my_timer_cycles() */ template struct counter_indexer_t : public generic_indexer_t { - - /** Default constructor/destructor should be OK. */ - - enum { fast = 1 }; - /** @return result from RDTSC or similar functions. */ static size_t get_rnd_index() UNIV_NOTHROW { @@ -82,27 +76,11 @@ struct counter_indexer_t : public generic_indexer_t { #endif /* !_WIN32 */ } } -}; -/** For counters where N=1 */ -template -struct single_indexer_t { - /** Default constructor/destructor should are OK. */ - - enum { fast = 0 }; - - /** @return offset within m_counter */ - static size_t offset(size_t index) UNIV_NOTHROW + /** @return a random offset to the array */ + static size_t get_rnd_offset() UNIV_NOTHROW { - ut_ad(N == 1); - return((CACHE_LINE_SIZE / sizeof(Type))); - } - - /** @return 1 */ - static size_t get_rnd_index() UNIV_NOTHROW - { - ut_ad(N == 1); - return(1); + return(generic_indexer_t::offset(get_rnd_index())); } }; @@ -116,19 +94,11 @@ template < typename Type, int N = IB_N_SLOTS, template class Indexer = default_indexer_t> -class ib_counter_t { -public: - ib_counter_t() { memset(m_counter, 0x0, sizeof(m_counter)); } - +struct MY_ALIGNED(CACHE_LINE_SIZE) ib_counter_t +{ +#ifdef UNIV_DEBUG ~ib_counter_t() { - ut_ad(validate()); - } - - static bool is_fast() { return(Indexer::fast); } - - bool validate() UNIV_NOTHROW { -#ifdef UNIV_DEBUG size_t n = (CACHE_LINE_SIZE / sizeof(Type)); /* Check that we aren't writing outside our defined bounds. */ @@ -137,27 +107,23 @@ public: ut_ad(m_counter[i + j] == 0); } } -#endif /* UNIV_DEBUG */ - return(true); } +#endif /* UNIV_DEBUG */ - /** If you can't use a good index id. Increment by 1. */ + /** Increment the counter by 1. */ void inc() UNIV_NOTHROW { add(1); } - /** If you can't use a good index id. - @param n is the amount to increment */ - void add(Type n) UNIV_NOTHROW { - size_t i = m_policy.offset(m_policy.get_rnd_index()); + /** Increment the counter by 1. + @param[in] index a reasonably thread-unique identifier */ + void inc(size_t index) UNIV_NOTHROW { add(index, 1); } - ut_ad(i < UT_ARR_SIZE(m_counter)); + /** Add to the counter. + @param[in] n amount to be added */ + void add(Type n) UNIV_NOTHROW { add(m_policy.get_rnd_offset(), n); } - m_counter[i] += n; - } - - /** Use this if you can use a unique identifier, saves a - call to get_rnd_index(). - @param i index into a slot - @param n amount to increment */ + /** Add to the counter. + @param[in] index a reasonably thread-unique identifier + @param[in] n amount to be added */ void add(size_t index, Type n) UNIV_NOTHROW { size_t i = m_policy.offset(index); @@ -166,31 +132,6 @@ public: m_counter[i] += n; } - /** If you can't use a good index id. Decrement by 1. */ - void dec() UNIV_NOTHROW { sub(1); } - - /** If you can't use a good index id. - @param n the amount to decrement */ - void sub(Type n) UNIV_NOTHROW { - size_t i = m_policy.offset(m_policy.get_rnd_index()); - - ut_ad(i < UT_ARR_SIZE(m_counter)); - - m_counter[i] -= n; - } - - /** Use this if you can use a unique identifier, saves a - call to get_rnd_index(). - @param i index into a slot - @param n amount to decrement */ - void sub(size_t index, Type n) UNIV_NOTHROW { - size_t i = m_policy.offset(index); - - ut_ad(i < UT_ARR_SIZE(m_counter)); - - m_counter[i] -= n; - } - /* @return total value - not 100% accurate, since it is not atomic. */ operator Type() const UNIV_NOTHROW { Type total = 0; diff --git a/storage/innobase/include/ut0dbg.h b/storage/innobase/include/ut0dbg.h index 706579a3b9f..fd9a064ba35 100644 --- a/storage/innobase/include/ut0dbg.h +++ b/storage/innobase/include/ut0dbg.h @@ -39,13 +39,13 @@ Created 1/30/1994 Heikki Tuuri /*************************************************************//** Report a failed assertion. */ +ATTRIBUTE_NORETURN ATTRIBUTE_COLD __attribute__((nonnull(2))) void ut_dbg_assertion_failed( /*====================*/ const char* expr, /*!< in: the failed assertion */ const char* file, /*!< in: source file containing the assertion */ - unsigned line) /*!< in: line number of the assertion */ - UNIV_COLD MY_ATTRIBUTE((nonnull(2), noreturn)); + unsigned line); /*!< in: line number of the assertion */ /** Abort execution if EXPR does not evaluate to nonzero. @param EXPR assertion expression that should hold */ diff --git a/storage/innobase/include/ut0new.h b/storage/innobase/include/ut0new.h index 5a9022e8a77..955e7b026c7 100644 --- a/storage/innobase/include/ut0new.h +++ b/storage/innobase/include/ut0new.h @@ -235,8 +235,10 @@ struct ut_new_pfx_t { #endif }; -/** Allocator class for allocating memory from inside std::* containers. */ -template +/** Allocator class for allocating memory from inside std::* containers. +@tparam T type of allocated object +@tparam oom_fatal whether to commit suicide when running out of memory */ +template class ut_allocator { public: typedef T* pointer; @@ -249,13 +251,10 @@ public: /** Default constructor. */ explicit - ut_allocator( - PSI_memory_key key = PSI_NOT_INSTRUMENTED) - : + ut_allocator(PSI_memory_key key = PSI_NOT_INSTRUMENTED) #ifdef UNIV_PFS_MEMORY - m_key(key), + : m_key(key) #endif /* UNIV_PFS_MEMORY */ - m_oom_fatal(true) { } @@ -263,30 +262,10 @@ public: template ut_allocator( const ut_allocator& other) - : m_oom_fatal(other.is_oom_fatal()) - { #ifdef UNIV_PFS_MEMORY - const PSI_memory_key other_key = other.get_mem_key(NULL); - - m_key = (other_key != mem_key_std) - ? other_key - : PSI_NOT_INSTRUMENTED; + : m_key(other.m_key) #endif /* UNIV_PFS_MEMORY */ - } - - /** When out of memory (OOM) happens, report error and do not - make it fatal. - @return a reference to the allocator. */ - ut_allocator& - set_oom_not_fatal() { - m_oom_fatal = false; - return(*this); - } - - /** Check if allocation failure is a fatal error. - @return true if allocation failure is fatal, false otherwise. */ - bool is_oom_fatal() const { - return(m_oom_fatal); + { } /** Return the maximum number of objects that can be allocated by @@ -364,7 +343,7 @@ public: } if (ptr == NULL) { - ib::fatal_or_error(m_oom_fatal) + ib::fatal_or_error(oom_fatal) << "Cannot allocate " << total_bytes << " bytes of memory after " << alloc_max_retries << " retries over " @@ -499,14 +478,13 @@ public: } if (pfx_new == NULL) { - ib::fatal_or_error(m_oom_fatal) + ib::fatal_or_error(oom_fatal) << "Cannot reallocate " << total_bytes << " bytes of memory after " << alloc_max_retries << " retries over " << alloc_max_retries << " seconds. OS error: " << strerror(errno) << " (" << errno << "). " << OUT_OF_MEMORY_MSG; - /* not reached */ return(NULL); } @@ -739,10 +717,6 @@ private: void operator=( const ut_allocator&); - - /** A flag to indicate whether out of memory (OOM) error is considered - fatal. If true, it is fatal. */ - bool m_oom_fatal; }; /** Compare two allocators of the same type. @@ -882,9 +856,8 @@ ut_delete_array( n_bytes, NULL, __FILE__, true, false)) #define ut_zalloc_nokey_nofatal(n_bytes) static_cast( \ - ut_allocator(PSI_NOT_INSTRUMENTED). \ - set_oom_not_fatal(). \ - allocate(n_bytes, NULL, __FILE__, true, false)) + ut_allocator(PSI_NOT_INSTRUMENTED).allocate( \ + n_bytes, NULL, __FILE__, true, false)) #define ut_realloc(ptr, n_bytes) static_cast( \ ut_allocator(PSI_NOT_INSTRUMENTED).reallocate( \ diff --git a/storage/innobase/include/ut0rnd.ic b/storage/innobase/include/ut0rnd.ic index 503c9482ea3..16dccb545d8 100644 --- a/storage/innobase/include/ut0rnd.ic +++ b/storage/innobase/include/ut0rnd.ic @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -217,16 +218,22 @@ ut_fold_binary( switch (len & 0x7) { case 7: fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + /* fall through */ case 6: fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + /* fall through */ case 5: fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + /* fall through */ case 4: fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + /* fall through */ case 3: fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + /* fall through */ case 2: fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + /* fall through */ case 1: fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); } diff --git a/storage/innobase/include/ut0stage.h b/storage/innobase/include/ut0stage.h index baad5cd77b4..1d5457a3ab0 100644 --- a/storage/innobase/include/ut0stage.h +++ b/storage/innobase/include/ut0stage.h @@ -267,12 +267,10 @@ ut_stage_alter_t::n_pk_recs_inc() } /** Flag either one record or one page processed, depending on the -current phase. -@param[in] inc_val flag this many units processed at once */ +current phase. */ inline void -ut_stage_alter_t::inc( - ulint inc_val /* = 1 */) +ut_stage_alter_t::inc(ulint) { if (m_progress == NULL) { return; @@ -286,12 +284,14 @@ ut_stage_alter_t::inc( ut_error; case READ_PK: m_n_pk_pages++; +#if 0 /* TODO: MySQL 5.7 PSI */ ut_ad(inc_val == 1); /* Overall the read pk phase will read all the pages from the PK and will do work, proportional to the number of added indexes, thus when this is called once per read page we increment with 1 + m_n_sort_indexes */ inc_val = 1 + m_n_sort_indexes; +#endif break; case SORT: multi_factor = m_sort_multi_factor; diff --git a/storage/innobase/include/ut0ut.h b/storage/innobase/include/ut0ut.h index 3027004dbaf..b8282b7d0de 100644 --- a/storage/innobase/include/ut0ut.h +++ b/storage/innobase/include/ut0ut.h @@ -299,7 +299,7 @@ void ut_print_timestamp( /*===============*/ FILE* file) /*!< in: file where to print */ - UNIV_COLD MY_ATTRIBUTE((nonnull)); + ATTRIBUTE_COLD __attribute__((nonnull)); #ifndef UNIV_INNOCHECKSUM @@ -313,7 +313,7 @@ ut_sprintf_timestamp( Runs an idle loop on CPU. The argument gives the desired delay in microseconds on 100 MHz Pentium + Visual C++. @return dummy value */ -ulint +void ut_delay( /*=====*/ ulint delay); /*!< in: delay in microseconds on 100 MHz Pentium */ @@ -505,6 +505,7 @@ use this class directly, instead use one of the derived classes. */ class logger { public: template + ATTRIBUTE_COLD logger& operator<<(const T& rhs) { m_oss << rhs; @@ -515,6 +516,7 @@ public: @param[in] buf the buffer whose contents will be logged. @param[in] count the length of the buffer buf. @return the output stream into which buffer was written. */ + ATTRIBUTE_COLD std::ostream& write( const char* buf, @@ -527,6 +529,7 @@ public: @param[in] buf the buffer whose contents will be logged. @param[in] count the length of the buffer buf. @return the output stream into which buffer was written. */ + ATTRIBUTE_COLD std::ostream& write( const byte* buf, @@ -539,6 +542,7 @@ public: protected: /* This class must not be used directly, hence making the default constructor protected. */ + ATTRIBUTE_COLD logger() {} }; @@ -555,6 +559,7 @@ statement. If a named object is created, then the log message will be emitted only when it goes out of scope or destroyed. */ class info : public logger { public: + ATTRIBUTE_COLD ~info(); }; @@ -562,6 +567,7 @@ public: class info for further details. */ class warn : public logger { public: + ATTRIBUTE_COLD ~warn(); }; @@ -569,6 +575,7 @@ public: documentation of class info for further details. */ class error : public logger { public: + ATTRIBUTE_COLD ~error(); }; @@ -577,6 +584,7 @@ by crashing it. Use this class when MySQL server needs to be stopped immediately. Refer to the documentation of class info for usage details. */ class fatal : public logger { public: + ATTRIBUTE_NORETURN ~fatal(); }; @@ -584,10 +592,12 @@ public: warning message */ class error_or_warn : public logger { public: + ATTRIBUTE_COLD error_or_warn(bool pred) : m_error(pred) {} + ATTRIBUTE_COLD ~error_or_warn(); private: const bool m_error; @@ -597,10 +607,12 @@ private: error message. */ class fatal_or_error : public logger { public: + ATTRIBUTE_COLD fatal_or_error(bool pred) : m_fatal(pred) {} + ATTRIBUTE_COLD ~fatal_or_error(); private: const bool m_fatal; diff --git a/storage/innobase/innodb.cmake b/storage/innobase/innodb.cmake index 9d6ac0eb0e8..d916d8b4160 100644 --- a/storage/innobase/innodb.cmake +++ b/storage/innobase/innodb.cmake @@ -24,12 +24,14 @@ INCLUDE(lzo.cmake) INCLUDE(lzma.cmake) INCLUDE(bzip2.cmake) INCLUDE(snappy.cmake) +INCLUDE(numa) MYSQL_CHECK_LZ4() MYSQL_CHECK_LZO() MYSQL_CHECK_LZMA() MYSQL_CHECK_BZIP2() MYSQL_CHECK_SNAPPY() +MYSQL_CHECK_NUMA() IF(CMAKE_CROSSCOMPILING) # Use CHECK_C_SOURCE_COMPILES instead of CHECK_C_SOURCE_RUNS when @@ -123,8 +125,8 @@ ENDIF() OPTION(WITH_INNODB_EXTRA_DEBUG "Enable extra InnoDB debug checks" OFF) IF(WITH_INNODB_EXTRA_DEBUG) - IF(NOT WITH_DEBUG) - MESSAGE(FATAL_ERROR "WITH_INNODB_EXTRA_DEBUG can be enabled only when WITH_DEBUG is enabled") + IF(NOT CMAKE_BUILD_TYPE STREQUAL "Debug") + MESSAGE(FATAL_ERROR "WITH_INNODB_EXTRA_DEBUG can be enabled only in debug builds") ENDIF() SET(EXTRA_DEBUG_FLAGS "") @@ -154,9 +156,9 @@ IF(HAVE_FALLOC_PUNCH_HOLE_AND_KEEP_SIZE) ENDIF() IF(NOT MSVC) - # workaround for gcc 4.1.2 RHEL5/x86, gcc atomic ops only work under -march=i686 + # workaround for old gcc on x86, gcc atomic ops only work under -march=i686 IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "i686" AND CMAKE_COMPILER_IS_GNUCC AND - CMAKE_C_COMPILER_VERSION VERSION_LESS "4.1.3") + CMAKE_C_COMPILER_VERSION VERSION_LESS "4.4.0") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=i686") ENDIF() diff --git a/storage/innobase/lock/lock0lock.cc b/storage/innobase/lock/lock0lock.cc index 1860cd51362..d6e8be7fac0 100644 --- a/storage/innobase/lock/lock0lock.cc +++ b/storage/innobase/lock/lock0lock.cc @@ -795,12 +795,19 @@ lock_reset_lock_and_trx_wait( const char* stmt2=NULL; size_t stmt_len; trx_id_t trx_id = 0; - stmt = innobase_get_stmt_unsafe(lock->trx->mysql_thd, &stmt_len); + stmt = lock->trx->mysql_thd + ? innobase_get_stmt_unsafe( + lock->trx->mysql_thd, &stmt_len) + : NULL; if (lock->trx->lock.wait_lock && lock->trx->lock.wait_lock->trx) { trx_id = lock->trx->lock.wait_lock->trx->id; - stmt2 = innobase_get_stmt_unsafe(lock->trx->lock.wait_lock->trx->mysql_thd, &stmt_len); + stmt2 = lock->trx->lock.wait_lock->trx->mysql_thd + ? innobase_get_stmt_unsafe( + lock->trx->lock.wait_lock + ->trx->mysql_thd, &stmt_len) + : NULL; } ib::error() << @@ -1846,6 +1853,7 @@ lock_rec_insert_by_trx_age( return DB_SUCCESS; } +#ifdef UNIV_DEBUG static bool lock_queue_validate( @@ -1881,6 +1889,7 @@ lock_queue_validate( } return true; } +#endif /* UNIV_DEBUG */ static void @@ -2653,7 +2662,7 @@ lock_rec_has_to_wait_in_queue( heap_no = lock_rec_find_set_bit(wait_lock); bit_offset = heap_no / 8; - bit_mask = static_cast(1 << (heap_no % 8)); + bit_mask = static_cast(1) << (heap_no % 8); hash = lock_hash_get(wait_lock->type_mode); @@ -5054,8 +5063,6 @@ lock_rec_unlock( lock_t* first_lock; lock_t* lock; ulint heap_no; - const char* stmt; - size_t stmt_len; ut_ad(trx); ut_ad(rec); @@ -5083,13 +5090,15 @@ lock_rec_unlock( lock_mutex_exit(); trx_mutex_exit(trx); - stmt = innobase_get_stmt_unsafe(trx->mysql_thd, &stmt_len); - { ib::error err; err << "Unlock row could not find a " << lock_mode << " mode lock on the record. Current statement: "; - err.write(stmt, stmt_len); + size_t stmt_len; + if (const char* stmt = innobase_get_stmt_unsafe( + trx->mysql_thd, &stmt_len)) { + err.write(stmt, stmt_len); + } } return; diff --git a/storage/innobase/lock/lock0wait.cc b/storage/innobase/lock/lock0wait.cc index 867e596bca2..0954ad9430a 100644 --- a/storage/innobase/lock/lock0wait.cc +++ b/storage/innobase/lock/lock0wait.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2014, 2017, MariaDB Corporation. All Rights Reserved. +Copyright (c) 2014, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -263,6 +263,9 @@ lock_wait_suspend_thread( slot = lock_wait_table_reserve_slot(thr, lock_wait_timeout); + lock_wait_mutex_exit(); + trx_mutex_exit(trx); + if (thr->lock_state == QUE_THR_LOCK_ROW) { srv_stats.n_lock_wait_count.inc(); srv_stats.n_lock_wait_current_count.inc(); @@ -274,23 +277,21 @@ lock_wait_suspend_thread( } } - /* Wake the lock timeout monitor thread, if it is suspended */ - - os_event_set(lock_sys->timeout_event); - - lock_wait_mutex_exit(); - trx_mutex_exit(trx); - ulint lock_type = ULINT_UNDEFINED; - lock_mutex_enter(); - + /* The wait_lock can be cleared by another thread when the + lock is released. But the wait can only be initiated by the + current thread which owns the transaction. Only acquire the + mutex if the wait_lock is still active. */ if (const lock_t* wait_lock = trx->lock.wait_lock) { - lock_type = lock_get_type_low(wait_lock); + lock_mutex_enter(); + wait_lock = trx->lock.wait_lock; + if (wait_lock) { + lock_type = lock_get_type_low(wait_lock); + } + lock_mutex_exit(); } - lock_mutex_exit(); - ulint had_dict_lock = trx->dict_operation_lock_mode; switch (had_dict_lock) { diff --git a/storage/innobase/log/log0crypt.cc b/storage/innobase/log/log0crypt.cc index dbfda8ab7c4..f527dfeb272 100644 --- a/storage/innobase/log/log0crypt.cc +++ b/storage/innobase/log/log0crypt.cc @@ -26,7 +26,7 @@ MDEV-11782: Rewritten for MariaDB 10.2 by Marko Mäkelä, MariaDB Corporation. *******************************************************/ #include "m_string.h" #include "log0crypt.h" -#include "my_crypt.h" +#include #include "log0crypt.h" #include "srv0start.h" // for srv_start_lsn @@ -103,11 +103,12 @@ get_crypt_info(ulint checkpoint_no) /** Encrypt or decrypt log blocks. @param[in,out] buf log blocks to encrypt or decrypt +@param[in] lsn log sequence number of the start of the buffer @param[in] size size of the buffer, in bytes @param[in] decrypt whether to decrypt instead of encrypting */ UNIV_INTERN void -log_crypt(byte* buf, ulint size, bool decrypt) +log_crypt(byte* buf, lsn_t lsn, ulint size, bool decrypt) { ut_ad(size % OS_FILE_LOG_BLOCK_SIZE == 0); ut_a(info.key_version); @@ -117,11 +118,12 @@ log_crypt(byte* buf, ulint size, bool decrypt) compile_time_assert(sizeof(uint32_t) == 4); #define LOG_CRYPT_HDR_SIZE 4 + lsn &= ~lsn_t(OS_FILE_LOG_BLOCK_SIZE - 1); for (const byte* const end = buf + size; buf != end; - buf += OS_FILE_LOG_BLOCK_SIZE) { - byte dst[OS_FILE_LOG_BLOCK_SIZE - LOG_CRYPT_HDR_SIZE]; - const ulint log_block_no = log_block_get_hdr_no(buf); + buf += OS_FILE_LOG_BLOCK_SIZE, lsn += OS_FILE_LOG_BLOCK_SIZE) { + uint32_t dst[(OS_FILE_LOG_BLOCK_SIZE - LOG_CRYPT_HDR_SIZE) + / sizeof(uint32_t)]; /* The log block number is not encrypted. */ *aes_ctr_iv = @@ -130,20 +132,20 @@ log_crypt(byte* buf, ulint size, bool decrypt) #else ~(LOG_BLOCK_FLUSH_BIT_MASK >> 24) #endif - & (*reinterpret_cast(dst) - = *reinterpret_cast( + & (*dst = *reinterpret_cast( buf + LOG_BLOCK_HDR_NO)); #if LOG_BLOCK_HDR_NO + 4 != LOG_CRYPT_HDR_SIZE # error "LOG_BLOCK_HDR_NO has been moved; redo log format affected!" #endif aes_ctr_iv[1] = info.crypt_nonce.word; - mach_write_to_8(reinterpret_cast(aes_ctr_iv + 2), - log_block_get_start_lsn( - decrypt ? srv_start_lsn : log_sys->lsn, - log_block_no)); + mach_write_to_8(reinterpret_cast(aes_ctr_iv + 2), lsn); + ut_ad(log_block_get_start_lsn(lsn, + log_block_get_hdr_no(buf)) + == lsn); int rc = encryption_crypt( - buf + LOG_CRYPT_HDR_SIZE, sizeof dst, dst, &dst_len, + buf + LOG_CRYPT_HDR_SIZE, sizeof dst, + reinterpret_cast(dst), &dst_len, const_cast(info.crypt_key.bytes), sizeof info.crypt_key, reinterpret_cast(aes_ctr_iv), sizeof aes_ctr_iv, @@ -155,19 +157,6 @@ log_crypt(byte* buf, ulint size, bool decrypt) ut_a(rc == MY_AES_OK); ut_a(dst_len == sizeof dst); - if (decrypt) { - std::ostringstream s; - ut_print_buf_hex(s, buf + LOG_CRYPT_HDR_SIZE, - OS_FILE_LOG_BLOCK_SIZE - - LOG_CRYPT_HDR_SIZE); - ib::info() << "S: " << s.str(); - std::ostringstream d; - ut_print_buf_hex(d, dst, - OS_FILE_LOG_BLOCK_SIZE - - LOG_CRYPT_HDR_SIZE); - ib::info() << "c: " << d.str(); - } - memcpy(buf + LOG_CRYPT_HDR_SIZE, dst, sizeof dst); } } @@ -218,7 +207,11 @@ init_crypt_key(crypt_info_t* info, bool upgrade = false) return true; } -/** Initialize the redo log encryption key. +/** Initialize the redo log encryption key and random parameters +when creating a new redo log. +The random parameters will be persisted in the log checkpoint pages. +@see log_crypt_write_checkpoint_buf() +@see log_crypt_read_checkpoint_buf() @return whether the operation succeeded */ UNIV_INTERN bool @@ -373,3 +366,44 @@ log_crypt_read_checkpoint_buf(const byte* buf) return init_crypt_key(&info); } + +/** Encrypt or decrypt a temporary file block. +@param[in] src block to encrypt or decrypt +@param[in] size size of the block +@param[out] dst destination block +@param[in] offs offset to block +@param[in] space_id tablespace id +@param[in] encrypt true=encrypt; false=decrypt +@return whether the operation succeeded */ +UNIV_INTERN +bool +log_tmp_block_encrypt( + const byte* src, + ulint size, + byte* dst, + uint64_t offs, + ulint space_id, + bool encrypt) +{ + uint dst_len; + uint64_t aes_ctr_iv[MY_AES_BLOCK_SIZE / sizeof(uint64_t)]; + bzero(aes_ctr_iv, sizeof aes_ctr_iv); + aes_ctr_iv[0] = space_id; + aes_ctr_iv[1] = offs; + + int rc = encryption_crypt( + src, size, dst, &dst_len, + const_cast(info.crypt_key.bytes), sizeof info.crypt_key, + reinterpret_cast(aes_ctr_iv), sizeof aes_ctr_iv, + encrypt + ? ENCRYPTION_FLAG_ENCRYPT|ENCRYPTION_FLAG_NOPAD + : ENCRYPTION_FLAG_DECRYPT|ENCRYPTION_FLAG_NOPAD, + LOG_DEFAULT_ENCRYPTION_KEY, info.key_version); + + if (rc != MY_AES_OK) { + ib::error() << (encrypt ? "Encryption" : "Decryption") + << " failed for temporary file: " << rc; + } + + return rc == MY_AES_OK; +} diff --git a/storage/innobase/log/log0log.cc b/storage/innobase/log/log0log.cc index 7d4e0459610..f7974d243d8 100644 --- a/storage/innobase/log/log0log.cc +++ b/storage/innobase/log/log0log.cc @@ -44,6 +44,7 @@ Created 12/9/1995 Heikki Tuuri #include "fil0fil.h" #include "dict0boot.h" #include "dict0stats_bg.h" +#include "btr0defragment.h" #include "srv0srv.h" #include "srv0start.h" #include "trx0sys.h" @@ -358,7 +359,6 @@ log_reserve_and_open( loop: ut_ad(log_mutex_own()); - ut_ad(!recv_no_log_write); if (log_sys->is_extending) { log_mutex_exit(); @@ -415,7 +415,6 @@ log_write_low( ut_ad(log_mutex_own()); part_loop: - ut_ad(!recv_no_log_write); /* Calculate a part length */ data_len = (log->buf_free % OS_FILE_LOG_BLOCK_SIZE) + str_len; @@ -485,7 +484,6 @@ log_close(void) lsn_t checkpoint_age; ut_ad(log_mutex_own()); - ut_ad(!recv_no_log_write); lsn = log->lsn; @@ -547,23 +545,6 @@ function_exit: return(lsn); } -/******************************************************//** -Calculates the data capacity of a log group, when the log file headers are not -included. -@return capacity in bytes */ -static -lsn_t -log_group_get_capacity( -/*===================*/ - const log_group_t* group) /*!< in: log group */ -{ - /* The lsn parameters are updated while holding both the mutexes - and it is ok to have either of them while reading */ - ut_ad(log_mutex_own() || log_write_mutex_own()); - - return((group->file_size - LOG_FILE_HDR_SIZE) * group->n_files); -} - /******************************************************//** Calculates the offset within a log group, when the log file headers are not included. @@ -627,7 +608,7 @@ log_group_calc_lsn_offset( gr_lsn_size_offset = log_group_calc_size_offset( group->lsn_offset, group); - group_size = log_group_get_capacity(group); + group_size = group->capacity(); if (lsn >= gr_lsn) { @@ -666,42 +647,22 @@ log_group_set_fields( group->lsn = lsn; } -/*****************************************************************//** -Calculates the recommended highest values for lsn - last_checkpoint_lsn +/** Calculate the recommended highest values for lsn - last_checkpoint_lsn and lsn - buf_get_oldest_modification(). +@param[in] file_size requested innodb_log_file_size @retval true on success @retval false if the smallest log group is too small to accommodate the number of OS threads in the database server */ -static MY_ATTRIBUTE((warn_unused_result)) bool -log_calc_max_ages(void) -/*===================*/ +log_set_capacity(ulonglong file_size) { - log_group_t* group; lsn_t margin; ulint free; - bool success = true; - lsn_t smallest_capacity; - - log_mutex_enter(); - - group = UT_LIST_GET_FIRST(log_sys->log_groups); - - ut_ad(group); - - smallest_capacity = LSN_MAX; - - while (group) { - if (log_group_get_capacity(group) < smallest_capacity) { - - smallest_capacity = log_group_get_capacity(group); - } - - group = UT_LIST_GET_NEXT(log_groups, group); - } + lsn_t smallest_capacity = (file_size - LOG_FILE_HDR_SIZE) + * srv_n_log_files; /* Add extra safety */ - smallest_capacity = smallest_capacity - smallest_capacity / 10; + smallest_capacity -= smallest_capacity / 10; /* For each OS thread we must reserve so much free space in the smallest log group that it can accommodate the log entries produced @@ -711,15 +672,20 @@ log_calc_max_ages(void) free = LOG_CHECKPOINT_FREE_PER_THREAD * (10 + srv_thread_concurrency) + LOG_CHECKPOINT_EXTRA_FREE; if (free >= smallest_capacity / 2) { - success = false; - - goto failure; - } else { - margin = smallest_capacity - free; + ib::error() << "Cannot continue operation. ib_logfiles are too" + " small for innodb_thread_concurrency=" + << srv_thread_concurrency << ". The combined size of" + " ib_logfiles should be bigger than" + " 200 kB * innodb_thread_concurrency. " + << INNODB_PARAMETERS_MSG; + return(false); } + margin = smallest_capacity - free; margin = margin - margin / 10; /* Add still some extra safety */ + log_mutex_enter(); + log_sys->log_group_capacity = smallest_capacity; log_sys->max_modified_age_async = margin @@ -731,26 +697,14 @@ log_calc_max_ages(void) / LOG_POOL_CHECKPOINT_RATIO_ASYNC; log_sys->max_checkpoint_age = margin; -failure: log_mutex_exit(); - if (!success) { - ib::error() << "Cannot continue operation. ib_logfiles are too" - " small for innodb_thread_concurrency=" - << srv_thread_concurrency << ". The combined size of" - " ib_logfiles should be bigger than" - " 200 kB * innodb_thread_concurrency. " - << INNODB_PARAMETERS_MSG; - } - - return(success); + return(true); } -/******************************************************//** -Initializes the log. */ +/** Initializes the redo logging subsystem. */ void -log_init(void) -/*==========*/ +log_sys_init() { log_sys = static_cast(ut_zalloc_nokey(sizeof(log_t))); @@ -779,7 +733,6 @@ log_init(void) log_sys->max_buf_free = log_sys->buf_size / LOG_BUF_FLUSH_RATIO - LOG_BUF_FLUSH_MARGIN; log_sys->check_flush_or_checkpoint = true; - UT_LIST_INIT(log_sys->log_groups, &log_group_t::log_groups); log_sys->n_log_ios_old = log_sys->n_log_ios; log_sys->last_printout_time = time(NULL); @@ -823,32 +776,19 @@ log_init(void) } } -/******************************************************************//** -Inits a log group to the log system. -@return true if success, false if not */ -MY_ATTRIBUTE((warn_unused_result)) -bool -log_group_init( -/*===========*/ - ulint id, /*!< in: group id */ - ulint n_files, /*!< in: number of log files */ - lsn_t file_size, /*!< in: log file size in bytes */ - ulint space_id) /*!< in: space id of the file space - which contains the log files of this - group */ +/** Initialize the redo log. +@param[in] n_files number of files */ +void +log_init(ulint n_files) { ulint i; - log_group_t* group; + log_group_t* group = &log_sys->log; - group = static_cast(ut_malloc_nokey(sizeof(log_group_t))); - - group->id = id; group->n_files = n_files; group->format = srv_encrypt_log ? LOG_HEADER_FORMAT_CURRENT | LOG_HEADER_FORMAT_ENCRYPTED : LOG_HEADER_FORMAT_CURRENT; - group->file_size = file_size; - group->space_id = space_id; + group->file_size = srv_log_file_size; group->state = LOG_GROUP_OK; group->lsn = LOG_START_LSN; group->lsn_offset = LOG_FILE_HDR_SIZE; @@ -874,9 +814,6 @@ log_group_init( group->checkpoint_buf = static_cast( ut_align(group->checkpoint_buf_ptr,OS_FILE_LOG_BLOCK_SIZE)); - - UT_LIST_ADD_LAST(log_sys->log_groups, group); - return(log_calc_max_ages()); } /******************************************************//** @@ -899,12 +836,11 @@ log_io_complete( case SRV_O_DIRECT: case SRV_O_DIRECT_NO_FSYNC: case SRV_ALL_O_DIRECT_FSYNC: - fil_flush(group->space_id); + fil_flush(SRV_LOG_SPACE_FIRST_ID); } - DBUG_PRINT("ib_log", ("checkpoint info written to group %u", - unsigned(group->id))); + DBUG_PRINT("ib_log", ("checkpoint info written")); log_io_complete_checkpoint(); return; @@ -931,7 +867,6 @@ log_group_file_header_flush( ut_ad(log_write_mutex_own()); ut_ad(!recv_no_log_write); - ut_ad(group->id == 0); ut_a(nth_file < group->n_files); ut_ad((group->format & ~LOG_HEADER_FORMAT_ENCRYPTED) == LOG_HEADER_FORMAT_CURRENT); @@ -950,9 +885,8 @@ log_group_file_header_flush( dest_offset = nth_file * group->file_size; DBUG_PRINT("ib_log", ("write " LSN_PF - " group " ULINTPF " file " ULINTPF " header", - start_lsn, group->id, nth_file)); + start_lsn, nth_file)); log_sys->n_log_ios++; @@ -964,7 +898,7 @@ log_group_file_header_flush( = (ulint) (dest_offset / univ_page_size.physical()); fil_io(IORequestLogWrite, true, - page_id_t(group->space_id, page_no), + page_id_t(SRV_LOG_SPACE_FIRST_ID, page_no), univ_page_size, (ulint) (dest_offset % univ_page_size.physical()), OS_FILE_LOG_BLOCK_SIZE, buf, group); @@ -1050,10 +984,10 @@ loop: DBUG_PRINT("ib_log", ("write " LSN_PF " to " LSN_PF - ": group " ULINTPF " len " ULINTPF + ": len " ULINTPF " blocks " ULINTPF ".." ULINTPF, start_lsn, next_offset, - group->id, write_len, + write_len, log_block_get_hdr_no(buf), log_block_get_hdr_no( buf + write_len @@ -1063,10 +997,6 @@ loop: || log_block_get_hdr_no(buf) == log_block_convert_lsn_to_no(start_lsn)); - if (log_sys->is_encrypted()) { - log_crypt(buf, write_len); - } - /* Calculate the checksums for each log block and write them to the trailer fields of the log blocks */ @@ -1091,7 +1021,7 @@ loop: = (ulint) (next_offset / univ_page_size.physical()); fil_io(IORequestLogWrite, true, - page_id_t(group->space_id, page_no), + page_id_t(SRV_LOG_SPACE_FIRST_ID, page_no), univ_page_size, (ulint) (next_offset % UNIV_PAGE_SIZE), write_len, buf, group); @@ -1259,7 +1189,6 @@ loop: return; } - log_group_t* group; ulint start_offset; ulint end_offset; ulint area_start; @@ -1303,9 +1232,7 @@ loop: log_buffer_switch(); - group = UT_LIST_GET_FIRST(log_sys->log_groups); - - log_group_set_fields(group, log_sys->write_lsn); + log_group_set_fields(&log_sys->log, log_sys->write_lsn); log_mutex_exit(); /* Calculate pad_size if needed. */ @@ -1316,7 +1243,7 @@ loop: end_offset = log_group_calc_lsn_offset( ut_uint64_align_up(write_lsn, OS_FILE_LOG_BLOCK_SIZE), - group); + &log_sys->log); end_offset_in_unit = (ulint) (end_offset % write_ahead_size); if (end_offset_in_unit > 0 @@ -1333,9 +1260,15 @@ loop: ::memset(write_buf + area_end, 0, pad_size); } } + + if (log_sys->is_encrypted()) { + log_crypt(write_buf + area_start, log_sys->write_lsn, + area_end - area_start); + } + /* Do the write to the log files */ log_group_write_buf( - group, write_buf + area_start, + &log_sys->log, write_buf + area_start, area_end - area_start + pad_size, #ifdef UNIV_DEBUG pad_size, @@ -1538,11 +1471,10 @@ log_io_complete_checkpoint(void) } /** Write checkpoint info to the log header. -@param[in,out] group redo log @param[in] end_lsn start LSN of the MLOG_CHECKPOINT mini-transaction */ static void -log_group_checkpoint(log_group_t* group, lsn_t end_lsn) +log_group_checkpoint(lsn_t end_lsn) { lsn_t lsn_offset; byte* buf; @@ -1555,10 +1487,11 @@ log_group_checkpoint(log_group_t* group, lsn_t end_lsn) || srv_shutdown_state != SRV_SHUTDOWN_NONE); DBUG_PRINT("ib_log", ("checkpoint " UINT64PF " at " LSN_PF - " written to group " ULINTPF, + " written", log_sys->next_checkpoint_no, - log_sys->next_checkpoint_lsn, - group->id)); + log_sys->next_checkpoint_lsn)); + + log_group_t* group = &log_sys->log; buf = group->checkpoint_buf; memset(buf, 0, OS_FILE_LOG_BLOCK_SIZE); @@ -1600,7 +1533,7 @@ log_group_checkpoint(log_group_t* group, lsn_t end_lsn) file write and a checkpoint field write */ fil_io(IORequestLogWrite, false, - page_id_t(group->space_id, 0), + page_id_t(SRV_LOG_SPACE_FIRST_ID, 0), univ_page_size, (log_sys->next_checkpoint_no & 1) ? LOG_CHECKPOINT_2 : LOG_CHECKPOINT_1, @@ -1625,7 +1558,8 @@ log_group_header_read( MONITOR_INC(MONITOR_LOG_IO); fil_io(IORequestLogRead, true, - page_id_t(group->space_id, header / univ_page_size.physical()), + page_id_t(SRV_LOG_SPACE_FIRST_ID, + header / univ_page_size.physical()), univ_page_size, header % univ_page_size.physical(), OS_FILE_LOG_BLOCK_SIZE, log_sys->checkpoint_buf, NULL); } @@ -1639,12 +1573,7 @@ log_write_checkpoint_info(bool sync, lsn_t end_lsn) ut_ad(log_mutex_own()); ut_ad(!srv_read_only_mode); - for (log_group_t* group = UT_LIST_GET_FIRST(log_sys->log_groups); - group; - group = UT_LIST_GET_NEXT(log_groups, group)) { - - log_group_checkpoint(group, end_lsn); - } + log_group_checkpoint(end_lsn); log_mutex_exit(); @@ -1971,6 +1900,12 @@ loop: } else { ut_ad(!srv_dict_stats_thread_active); } + if (recv_sys && recv_sys->flush_start) { + /* This is in case recv_writer_thread was never + started, or buf_flush_page_cleaner_coordinator + failed to notice its termination. */ + os_event_set(recv_sys->flush_start); + } } os_thread_sleep(100000); @@ -2004,12 +1939,16 @@ loop: thread_name = "srv_monitor_thread"; } else if (srv_buf_resize_thread_active) { thread_name = "buf_resize_thread"; + goto wait_suspend_loop; } else if (srv_dict_stats_thread_active) { thread_name = "dict_stats_thread"; } else if (lock_sys && lock_sys->timeout_thread_active) { thread_name = "lock_wait_timeout_thread"; } else if (srv_buf_dump_thread_active) { thread_name = "buf_dump_thread"; + goto wait_suspend_loop; + } else if (btr_defragment_thread_active) { + thread_name = "btr_defragment_thread"; } else if (srv_fast_shutdown != 2 && trx_rollback_or_clean_is_active) { thread_name = "rollback of recovered transactions"; } else { @@ -2031,8 +1970,8 @@ wait_suspend_loop: switch (srv_get_active_thread_type()) { case SRV_NONE: - srv_shutdown_state = SRV_SHUTDOWN_FLUSH_PHASE; if (!srv_n_fil_crypt_threads_started) { + srv_shutdown_state = SRV_SHUTDOWN_FLUSH_PHASE; break; } os_event_set(fil_crypt_threads_event); @@ -2280,13 +2219,11 @@ log_refresh_stats(void) log_sys->last_printout_time = time(NULL); } -/********************************************************//** -Closes a log group. */ +/** Close a log group. +@param[in,out] group log group to close */ static void -log_group_close( -/*===========*/ - log_group_t* group) /* in,own: log group to close */ +log_group_close(log_group_t* group) { ulint i; @@ -2297,7 +2234,10 @@ log_group_close( ut_free(group->file_header_bufs_ptr); ut_free(group->file_header_bufs); ut_free(group->checkpoint_buf_ptr); - ut_free(group); + group->n_files = 0; + group->file_header_bufs_ptr = NULL; + group->file_header_bufs = NULL; + group->checkpoint_buf_ptr = NULL; } /********************************************************//** @@ -2306,26 +2246,12 @@ void log_group_close_all(void) /*=====================*/ { - log_group_t* group; - - group = UT_LIST_GET_FIRST(log_sys->log_groups); - - while (UT_LIST_GET_LEN(log_sys->log_groups) > 0) { - log_group_t* prev_group = group; - - group = UT_LIST_GET_NEXT(log_groups, group); - - UT_LIST_REMOVE(log_sys->log_groups, prev_group); - - log_group_close(prev_group); - } + log_group_close(&log_sys->log); } -/********************************************************//** -Shutdown the log system but do not release all the memory. */ +/** Shut down the redo log subsystem. */ void -log_shutdown(void) -/*==============*/ +log_shutdown() { log_group_close_all(); @@ -2349,20 +2275,8 @@ log_shutdown(void) } recv_sys_close(); -} - -/********************************************************//** -Free the log system data structures. */ -void -log_mem_free(void) -/*==============*/ -{ - if (log_sys != NULL) { - recv_sys_mem_free(); - ut_free(log_sys); - - log_sys = NULL; - } + ut_free(log_sys); + log_sys = NULL; } /******************************************************//** @@ -2378,6 +2292,7 @@ log_pad_current_log_block(void) ulint i; lsn_t lsn; + ut_ad(!recv_no_log_write); /* We retrieve lsn only because otherwise gcc crashed on HP-UX */ lsn = log_reserve_and_open(OS_FILE_LOG_BLOCK_SIZE); diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index 0b46c92f00a..fd0940b08df 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -124,8 +124,8 @@ mysql_pfs_key_t trx_rollback_clean_thread_key; mysql_pfs_key_t recv_writer_thread_key; #endif /* UNIV_PFS_THREAD */ -/** Flag indicating if recv_writer thread is active. */ -static volatile bool recv_writer_thread_active; +/** Is recv_writer_thread active? */ +bool recv_writer_thread_active; #ifndef DBUG_OFF /** Return string name of the redo log record type. @@ -415,31 +415,9 @@ fil_name_parse( return(end_ptr); } -/********************************************************//** -Creates the recovery system. */ +/** Clean up after recv_sys_init() */ void -recv_sys_create(void) -/*=================*/ -{ - if (recv_sys != NULL) { - - return; - } - - recv_sys = static_cast(ut_zalloc_nokey(sizeof(*recv_sys))); - - mutex_create(LATCH_ID_RECV_SYS, &recv_sys->mutex); - mutex_create(LATCH_ID_RECV_WRITER, &recv_sys->writer_mutex); - - recv_sys->heap = NULL; - recv_sys->addr_hash = NULL; -} - -/********************************************************//** -Release recovery system mutexes. */ -void -recv_sys_close(void) -/*================*/ +recv_sys_close() { if (recv_sys != NULL) { recv_sys->dblwr.pages.clear(); @@ -578,56 +556,41 @@ DECLARE_THREAD(recv_writer_thread)( OS_THREAD_DUMMY_RETURN; } -/************************************************************ -Inits the recovery system for a recovery operation. */ +/** Initialize the redo log recovery subsystem. */ void -recv_sys_init( -/*==========*/ - ulint available_memory) /*!< in: available memory in bytes */ +recv_sys_init() { - if (recv_sys->heap != NULL) { + ut_ad(recv_sys == NULL); - return; - } + recv_sys = static_cast(ut_zalloc_nokey(sizeof(*recv_sys))); - mutex_enter(&(recv_sys->mutex)); + mutex_create(LATCH_ID_RECV_SYS, &recv_sys->mutex); + mutex_create(LATCH_ID_RECV_WRITER, &recv_sys->writer_mutex); - recv_sys->heap = mem_heap_create_typed(256, - MEM_HEAP_FOR_RECV_SYS); + recv_sys->heap = mem_heap_create_typed(256, MEM_HEAP_FOR_RECV_SYS); if (!srv_read_only_mode) { recv_sys->flush_start = os_event_create(0); recv_sys->flush_end = os_event_create(0); } + ulint size = buf_pool_get_curr_size(); /* Set appropriate value of recv_n_pool_free_frames. */ - if (buf_pool_get_curr_size() >= (10 * 1024 * 1024)) { + if (size >= 10 << 20) { /* Buffer pool of size greater than 10 MB. */ recv_n_pool_free_frames = 512; } recv_sys->buf = static_cast( ut_malloc_nokey(RECV_PARSING_BUF_SIZE)); - recv_sys->len = 0; - recv_sys->recovered_offset = 0; - recv_sys->addr_hash = hash_create(available_memory / 512); - recv_sys->n_addrs = 0; - - recv_sys->apply_log_recs = FALSE; - recv_sys->apply_batch_on = FALSE; - - recv_sys->found_corrupt_log = false; - recv_sys->found_corrupt_fs = false; - recv_sys->mlog_checkpoint_lsn = 0; + recv_sys->addr_hash = hash_create(size / 512); recv_sys->progress_time = ut_time(); recv_max_page_lsn = 0; /* Call the constructor for recv_sys_t::dblwr member */ new (&recv_sys->dblwr) recv_dblwr_t(); - - mutex_exit(&(recv_sys->mutex)); } /** Empty a fully processed hash table. */ @@ -677,7 +640,6 @@ recv_sys_debug_free(void) @param[in] start_lsn read area start @param[in] end_lsn read area end @return valid end_lsn */ -static lsn_t log_group_read_log_seg( byte* buf, @@ -717,7 +679,7 @@ loop: = (ulint) (source_offset / univ_page_size.physical()); fil_io(IORequestLogRead, true, - page_id_t(group->space_id, page_no), + page_id_t(SRV_LOG_SPACE_FIRST_ID, page_no), univ_page_size, (ulint) (source_offset % univ_page_size.physical()), len, buf, NULL); @@ -753,7 +715,8 @@ loop: } if (group->is_encrypted()) { - log_crypt(buf, OS_FILE_LOG_BLOCK_SIZE, true); + log_crypt(buf, start_lsn, + OS_FILE_LOG_BLOCK_SIZE, true); } } } @@ -787,20 +750,13 @@ recv_synchronize_groups() const lsn_t start_lsn = ut_uint64_align_down(recovered_lsn, OS_FILE_LOG_BLOCK_SIZE); - log_group_read_log_seg(log_sys->buf, - UT_LIST_GET_FIRST(log_sys->log_groups), + log_group_read_log_seg(log_sys->buf, &log_sys->log, start_lsn, start_lsn + OS_FILE_LOG_BLOCK_SIZE); - ut_ad(UT_LIST_GET_LEN(log_sys->log_groups) == 1); + /* Update the fields in the group struct to correspond to + recovered_lsn */ - for (log_group_t* group = UT_LIST_GET_FIRST(log_sys->log_groups); - group; - group = UT_LIST_GET_NEXT(log_groups, group)) { - /* Update the fields in the group struct to correspond to - recovered_lsn */ - - log_group_set_fields(group, recovered_lsn); - } + log_group_set_fields(&log_sys->log, recovered_lsn); /* Copy the checkpoint info to the log; remember that we have incremented checkpoint_no by one, and the info will not be written @@ -831,17 +787,14 @@ recv_check_log_header_checksum( @return error code or DB_SUCCESS */ static MY_ATTRIBUTE((warn_unused_result)) dberr_t -recv_find_max_checkpoint_0( - log_group_t** max_group, - ulint* max_field) +recv_find_max_checkpoint_0(log_group_t** max_group, ulint* max_field) { - log_group_t* group = UT_LIST_GET_FIRST(log_sys->log_groups); + log_group_t* group = &log_sys->log; ib_uint64_t max_no = 0; ib_uint64_t checkpoint_no; byte* buf = log_sys->checkpoint_buf; ut_ad(group->format == 0); - ut_ad(UT_LIST_GET_NEXT(log_groups, group) == NULL); /** Offset of the first checkpoint checksum */ static const uint CHECKSUM_1 = 288; @@ -852,6 +805,8 @@ recv_find_max_checkpoint_0( /** Least significant bits of the checkpoint offset */ static const uint OFFSET_LOW32 = 16; + *max_group = NULL; + for (ulint field = LOG_CHECKPOINT_1; field <= LOG_CHECKPOINT_2; field += LOG_CHECKPOINT_2 - LOG_CHECKPOINT_1) { log_group_header_read(group, field); @@ -867,13 +822,6 @@ recv_find_max_checkpoint_0( continue; } - group->state = LOG_GROUP_OK; - - group->lsn = mach_read_from_8( - buf + LOG_CHECKPOINT_LSN); - group->lsn_offset = static_cast( - mach_read_from_4(buf + OFFSET_HIGH32)) << 32 - | mach_read_from_4(buf + OFFSET_LOW32); checkpoint_no = mach_read_from_8( buf + LOG_CHECKPOINT_NO); @@ -883,14 +831,22 @@ recv_find_max_checkpoint_0( } DBUG_PRINT("ib_log", - ("checkpoint " UINT64PF " at " LSN_PF - " found in group " ULINTPF, - checkpoint_no, group->lsn, group->id)); + ("checkpoint " UINT64PF " at " LSN_PF " found", + checkpoint_no, + mach_read_from_8(buf + LOG_CHECKPOINT_LSN))); if (checkpoint_no >= max_no) { *max_group = group; *max_field = field; max_no = checkpoint_no; + + group->state = LOG_GROUP_OK; + + group->lsn = mach_read_from_8( + buf + LOG_CHECKPOINT_LSN); + group->lsn_offset = static_cast( + mach_read_from_4(buf + OFFSET_HIGH32)) << 32 + | mach_read_from_4(buf + OFFSET_LOW32); } } @@ -916,7 +872,7 @@ dberr_t recv_log_format_0_recover(lsn_t lsn) { log_mutex_enter(); - log_group_t* group = UT_LIST_GET_FIRST(log_sys->log_groups); + log_group_t* group = &log_sys->log; const lsn_t source_offset = log_group_calc_lsn_offset(lsn, group); log_mutex_exit(); @@ -932,7 +888,7 @@ recv_log_format_0_recover(lsn_t lsn) REFMAN "upgrading.html"; fil_io(IORequestLogRead, true, - page_id_t(group->space_id, page_no), + page_id_t(SRV_LOG_SPACE_FIRST_ID, page_no), univ_page_size, (ulint) ((source_offset & ~(OS_FILE_LOG_BLOCK_SIZE - 1)) % univ_page_size.physical()), @@ -968,14 +924,10 @@ recv_log_format_0_recover(lsn_t lsn) } /** Find the latest checkpoint in the log header. -@param[out] max_group log group, or NULL @param[out] max_field LOG_CHECKPOINT_1 or LOG_CHECKPOINT_2 @return error code or DB_SUCCESS */ -static MY_ATTRIBUTE((warn_unused_result)) dberr_t -recv_find_max_checkpoint( - log_group_t** max_group, - ulint* max_field) +recv_find_max_checkpoint(ulint* max_field) { log_group_t* group; ib_uint64_t max_no; @@ -983,105 +935,97 @@ recv_find_max_checkpoint( ulint field; byte* buf; - group = UT_LIST_GET_FIRST(log_sys->log_groups); + group = &log_sys->log; max_no = 0; - *max_group = NULL; *max_field = 0; buf = log_sys->checkpoint_buf; - while (group) { - group->state = LOG_GROUP_CORRUPTED; + group->state = LOG_GROUP_CORRUPTED; - log_group_header_read(group, 0); - /* Check the header page checksum. There was no - checksum in the first redo log format (version 0). */ - group->format = mach_read_from_4(buf + LOG_HEADER_FORMAT); - if (group->format != 0 - && !recv_check_log_header_checksum(buf)) { - ib::error() << "Invalid redo log header checksum."; - return(DB_CORRUPTION); + log_group_header_read(group, 0); + /* Check the header page checksum. There was no + checksum in the first redo log format (version 0). */ + group->format = mach_read_from_4(buf + LOG_HEADER_FORMAT); + if (group->format != 0 + && !recv_check_log_header_checksum(buf)) { + ib::error() << "Invalid redo log header checksum."; + return(DB_CORRUPTION); + } + + switch (group->format) { + case 0: + return(recv_find_max_checkpoint_0(&group, max_field)); + case LOG_HEADER_FORMAT_CURRENT: + case LOG_HEADER_FORMAT_CURRENT | LOG_HEADER_FORMAT_ENCRYPTED: + break; + default: + /* Ensure that the string is NUL-terminated. */ + buf[LOG_HEADER_CREATOR_END] = 0; + ib::error() << "Unsupported redo log format." + " The redo log was created" + " with " << buf + LOG_HEADER_CREATOR << + ". Please follow the instructions at " + REFMAN "upgrading-downgrading.html"; + /* Do not issue a message about a possibility + to cleanly shut down the newer server version + and to remove the redo logs, because the + format of the system data structures may + radically change after MySQL 5.7. */ + return(DB_ERROR); + } + + for (field = LOG_CHECKPOINT_1; field <= LOG_CHECKPOINT_2; + field += LOG_CHECKPOINT_2 - LOG_CHECKPOINT_1) { + + log_group_header_read(group, field); + + const ulint crc32 = log_block_calc_checksum_crc32(buf); + const ulint cksum = log_block_get_checksum(buf); + + if (crc32 != cksum) { + DBUG_PRINT("ib_log", + ("invalid checkpoint," + " at " ULINTPF + ", checksum " ULINTPFx + " expected " ULINTPFx, + field, cksum, crc32)); + continue; } - switch (group->format) { - case 0: - return(recv_find_max_checkpoint_0( - max_group, max_field)); - case LOG_HEADER_FORMAT_CURRENT: - case LOG_HEADER_FORMAT_CURRENT | LOG_HEADER_FORMAT_ENCRYPTED: - break; - default: - /* Ensure that the string is NUL-terminated. */ - buf[LOG_HEADER_CREATOR_END] = 0; - ib::error() << "Unsupported redo log format." - " The redo log was created" - " with " << buf + LOG_HEADER_CREATOR << - ". Please follow the instructions at " - REFMAN "upgrading-downgrading.html"; - /* Do not issue a message about a possibility - to cleanly shut down the newer server version - and to remove the redo logs, because the - format of the system data structures may - radically change after MySQL 5.7. */ - return(DB_ERROR); + if (group->is_encrypted() + && !log_crypt_read_checkpoint_buf(buf)) { + ib::error() << "Reading checkpoint" + " encryption info failed."; + continue; } - for (field = LOG_CHECKPOINT_1; field <= LOG_CHECKPOINT_2; - field += LOG_CHECKPOINT_2 - LOG_CHECKPOINT_1) { + checkpoint_no = mach_read_from_8( + buf + LOG_CHECKPOINT_NO); - log_group_header_read(group, field); - - const ulint crc32 = log_block_calc_checksum_crc32(buf); - const ulint cksum = log_block_get_checksum(buf); - - if (crc32 != cksum) { - DBUG_PRINT("ib_log", - ("invalid checkpoint," - " group " ULINTPF " at " ULINTPF - ", checksum %x expected %x", - group->id, field, - (unsigned) cksum, - (unsigned) crc32)); - continue; - } - - if (group->is_encrypted() - && !log_crypt_read_checkpoint_buf(buf)) { - ib::error() << "Reading checkpoint" - " encryption info failed."; - continue; - } + DBUG_PRINT("ib_log", + ("checkpoint " UINT64PF " at " LSN_PF " found", + checkpoint_no, mach_read_from_8( + buf + LOG_CHECKPOINT_LSN))); + if (checkpoint_no >= max_no) { + *max_field = field; + max_no = checkpoint_no; group->state = LOG_GROUP_OK; - group->lsn = mach_read_from_8( buf + LOG_CHECKPOINT_LSN); group->lsn_offset = mach_read_from_8( buf + LOG_CHECKPOINT_OFFSET); - checkpoint_no = mach_read_from_8( - buf + LOG_CHECKPOINT_NO); - - DBUG_PRINT("ib_log", - ("checkpoint " UINT64PF " at " LSN_PF - " found in group " ULINTPF, - checkpoint_no, group->lsn, group->id)); - - if (checkpoint_no >= max_no) { - *max_group = group; - *max_field = field; - max_no = checkpoint_no; - } + log_sys->next_checkpoint_no = checkpoint_no; } - - group = UT_LIST_GET_NEXT(log_groups, group); } - if (*max_group == NULL) { - /* Before 5.7.9, we could get here during database + if (*max_field == 0) { + /* Before 10.2.2, we could get here during database initialization if we created an ib_logfile0 file that was filled with zeroes, and were killed. After - 5.7.9, we would reject such a file already earlier, + 10.2.2, we would reject such a file already earlier, when checking the file header. */ ib::error() << "No valid checkpoint found" " (corrupted redo log)." @@ -1458,7 +1402,6 @@ parse_log: /* Allow anything in page_type when creating a page. */ ptr = ibuf_parse_bitmap_init(ptr, end_ptr, block, mtr); break; - case MLOG_INIT_FILE_PAGE: case MLOG_INIT_FILE_PAGE2: /* Allow anything in page_type when creating a page. */ ptr = fsp_parse_init_file_page(ptr, end_ptr, block); @@ -1497,7 +1440,12 @@ parse_log: } break; case MLOG_FILE_WRITE_CRYPT_DATA: - ptr = const_cast(fil_parse_write_crypt_data(ptr, end_ptr, block)); + dberr_t err; + ptr = const_cast(fil_parse_write_crypt_data(ptr, end_ptr, block, &err)); + + if (err != DB_SUCCESS) { + recv_sys->found_corrupt_log = TRUE; + } break; default: ptr = NULL; @@ -1793,8 +1741,7 @@ recv_recover_page(bool just_read_in, buf_block_t* block) while (recv) { end_lsn = recv->end_lsn; - ut_ad(end_lsn - <= UT_LIST_GET_FIRST(log_sys->log_groups)->scanned_lsn); + ut_ad(end_lsn <= log_sys->log.scanned_lsn); if (recv->len > RECV_DATA_BLOCK_SIZE) { /* We have to copy the record body to a separate @@ -1807,18 +1754,6 @@ recv_recover_page(bool just_read_in, buf_block_t* block) buf = ((byte*)(recv->data)) + sizeof(recv_data_t); } - if (recv->type == MLOG_INIT_FILE_PAGE) { - page_lsn = page_newest_lsn; - - memset(FIL_PAGE_LSN + page, 0, 8); - memset(UNIV_PAGE_SIZE - FIL_PAGE_END_LSN_OLD_CHKSUM - + page, 0, 8); - - if (page_zip) { - memset(FIL_PAGE_LSN + page_zip->data, 0, 8); - } - } - /* If per-table tablespace was truncated and there exist REDO records before truncate that are to be applied as part of recovery (checkpoint didn't happen since truncate was done) @@ -1986,22 +1921,29 @@ recv_read_in_area( void recv_apply_hashed_log_recs(bool last_batch) { - for (;;) { - mutex_enter(&recv_sys->mutex); + ut_ad(srv_operation == SRV_OPERATION_NORMAL + || srv_operation == SRV_OPERATION_RESTORE); - if (!recv_sys->apply_batch_on) { - break; + mutex_enter(&recv_sys->mutex); + + while (recv_sys->apply_batch_on) { + bool abort = recv_sys->found_corrupt_log; + mutex_exit(&recv_sys->mutex); + + if (abort) { + return; } - mutex_exit(&recv_sys->mutex); os_thread_sleep(500000); + mutex_enter(&recv_sys->mutex); } ut_ad(!last_batch == log_mutex_own()); - if (!last_batch) { - recv_no_ibuf_operations = true; - } + recv_no_ibuf_operations = !last_batch + || srv_operation == SRV_OPERATION_RESTORE; + + ut_d(recv_no_log_write = recv_no_ibuf_operations); if (ulint n = recv_sys->n_addrs) { const char* msg = last_batch @@ -2073,9 +2015,14 @@ recv_apply_hashed_log_recs(bool last_batch) /* Wait until all the pages have been processed */ while (recv_sys->n_addrs != 0) { + bool abort = recv_sys->found_corrupt_log; mutex_exit(&(recv_sys->mutex)); + if (abort) { + return; + } + os_thread_sleep(500000); mutex_enter(&(recv_sys->mutex)); @@ -2085,7 +2032,6 @@ recv_apply_hashed_log_recs(bool last_batch) /* Flush all the file pages to disk and invalidate them in the buffer pool */ - ut_d(recv_no_log_write = true); mutex_exit(&(recv_sys->mutex)); log_mutex_exit(); @@ -2108,9 +2054,6 @@ recv_apply_hashed_log_recs(bool last_batch) log_mutex_enter(); mutex_enter(&(recv_sys->mutex)); - ut_d(recv_no_log_write = false); - - recv_no_ibuf_operations = false; } recv_sys->apply_log_recs = FALSE; @@ -2460,6 +2403,13 @@ loop: recv_sys->recovered_lsn); } /* fall through */ + case MLOG_INDEX_LOAD: + /* Mariabackup FIXME: Report an error + when encountering MLOG_INDEX_LOAD on + --prepare or already on --backup. */ + ut_a(type != MLOG_INDEX_LOAD + || srv_operation == SRV_OPERATION_NORMAL); + /* fall through */ case MLOG_FILE_NAME: case MLOG_FILE_DELETE: case MLOG_FILE_CREATE2: @@ -2468,7 +2418,6 @@ loop: /* These were already handled by recv_parse_log_rec() and recv_parse_or_apply_log_rec_body(). */ - case MLOG_INDEX_LOAD: DBUG_PRINT("ib_log", ("scan " LSN_PF ": log rec %s" " len " ULINTPF @@ -2606,11 +2555,16 @@ loop: for something else. */ break; #endif /* UNIV_LOG_LSN_DEBUG */ + case MLOG_INDEX_LOAD: + /* Mariabackup FIXME: Report an error + when encountering MLOG_INDEX_LOAD on + --prepare or already on --backup. */ + ut_a(srv_operation == SRV_OPERATION_NORMAL); + break; case MLOG_FILE_NAME: case MLOG_FILE_DELETE: case MLOG_FILE_CREATE2: case MLOG_FILE_RENAME2: - case MLOG_INDEX_LOAD: case MLOG_TRUNCATE: /* These were already handled by recv_parse_log_rec() and @@ -2815,7 +2769,24 @@ recv_scan_log_recs( scanned_lsn += data_len; + if (data_len == LOG_BLOCK_HDR_SIZE + SIZE_OF_MLOG_CHECKPOINT + && scanned_lsn == checkpoint_lsn + SIZE_OF_MLOG_CHECKPOINT + && log_block[LOG_BLOCK_HDR_SIZE] == MLOG_CHECKPOINT + && checkpoint_lsn == mach_read_from_8(LOG_BLOCK_HDR_SIZE + + 1 + log_block)) { + /* The redo log is logically empty. */ + ut_ad(recv_sys->mlog_checkpoint_lsn == 0 + || recv_sys->mlog_checkpoint_lsn + == checkpoint_lsn); + recv_sys->mlog_checkpoint_lsn = checkpoint_lsn; + DBUG_PRINT("ib_log", ("found empty log; LSN=" LSN_PF, + scanned_lsn)); + finished = true; + break; + } + if (scanned_lsn > recv_sys->scanned_lsn) { + ut_ad(!srv_log_files_created); if (!recv_needed_recovery) { recv_needed_recovery = true; @@ -2974,10 +2945,9 @@ recv_group_scan_log_recs( DBUG_RETURN(false); } - DBUG_PRINT("ib_log", ("%s " LSN_PF - " completed for log group " ULINTPF, + DBUG_PRINT("ib_log", ("%s " LSN_PF " completed", last_phase ? "rescan" : "scan", - group->scanned_lsn, group->id)); + group->scanned_lsn)); DBUG_RETURN(store_to_hash == STORE_NO); } @@ -2990,6 +2960,14 @@ static dberr_t recv_init_missing_space(dberr_t err, const recv_spaces_t::const_iterator& i) { + if (srv_operation == SRV_OPERATION_RESTORE) { + ib::warn() << "Tablespace " << i->first << " was not" + " found at " << i->second.name << " when" + " restoring a (partial?) backup. All redo log" + " for this file will be ignored!"; + return(err); + } + if (srv_force_recovery == 0) { ib::error() << "Tablespace " << i->first << " was not" " found at " << i->second.name << "."; @@ -3128,11 +3106,9 @@ recv_init_crash_recovery_spaces() of first system tablespace page @return error code or DB_SUCCESS */ dberr_t -recv_recovery_from_checkpoint_start( - lsn_t flush_lsn) +recv_recovery_from_checkpoint_start(lsn_t flush_lsn) { log_group_t* group; - log_group_t* max_cp_group; ulint max_cp_field; lsn_t checkpoint_lsn; bool rescan; @@ -3141,6 +3117,9 @@ recv_recovery_from_checkpoint_start( byte* buf; dberr_t err = DB_SUCCESS; + ut_ad(srv_operation == SRV_OPERATION_NORMAL + || srv_operation == SRV_OPERATION_RESTORE); + /* Initialize red-black tree for fast insertions into the flush_list during recovery process. */ buf_flush_init_flush_rbt(); @@ -3158,14 +3137,18 @@ recv_recovery_from_checkpoint_start( /* Look for the latest checkpoint from any of the log groups */ - err = recv_find_max_checkpoint(&max_cp_group, &max_cp_field); + err = recv_find_max_checkpoint(&max_cp_field); + + if (err != DB_SUCCESS + || (log_sys->log.format != 0 + && (log_sys->log.format & ~LOG_HEADER_FORMAT_ENCRYPTED) + != LOG_HEADER_FORMAT_CURRENT)) { - if (err != DB_SUCCESS) { log_mutex_exit(); return(err); } - log_group_header_read(max_cp_group, max_cp_field); + log_group_header_read(&log_sys->log, max_cp_field); buf = log_sys->checkpoint_buf; @@ -3180,8 +3163,7 @@ recv_recovery_from_checkpoint_start( ut_ad(RECV_SCAN_SIZE <= log_sys->buf_size); - ut_ad(UT_LIST_GET_LEN(log_sys->log_groups) == 1); - group = UT_LIST_GET_FIRST(log_sys->log_groups); + group = &log_sys->log; const lsn_t end_lsn = mach_read_from_8( buf + LOG_CHECKPOINT_END_LSN); @@ -3191,8 +3173,7 @@ recv_recovery_from_checkpoint_start( case 0: log_mutex_exit(); return(recv_log_format_0_recover(checkpoint_lsn)); - case LOG_HEADER_FORMAT_CURRENT: - case LOG_HEADER_FORMAT_CURRENT | LOG_HEADER_FORMAT_ENCRYPTED: + default: if (end_lsn == 0) { break; } @@ -3200,8 +3181,6 @@ recv_recovery_from_checkpoint_start( contiguous_lsn = end_lsn; break; } - /* fall through */ - default: recv_sys->found_corrupt_log = true; log_mutex_exit(); return(DB_ERROR); @@ -3257,10 +3236,14 @@ recv_recovery_from_checkpoint_start( there is something wrong we will print a message to the user about recovery: */ - if (checkpoint_lsn != flush_lsn) { + if (flush_lsn == checkpoint_lsn + SIZE_OF_MLOG_CHECKPOINT + && recv_sys->mlog_checkpoint_lsn == checkpoint_lsn) { + /* The redo log is logically empty. */ + } else if (checkpoint_lsn != flush_lsn) { + ut_ad(!srv_log_files_created); if (checkpoint_lsn + SIZE_OF_MLOG_CHECKPOINT < flush_lsn) { - ib::warn() << " Are you sure you are using the" + ib::warn() << "Are you sure you are using the" " right ib_logfiles to start up the database?" " Log sequence number in the ib_logfiles is " << checkpoint_lsn << ", less than the" @@ -3354,9 +3337,11 @@ recv_recovery_from_checkpoint_start( log_sys->last_checkpoint_lsn = checkpoint_lsn; - if (!srv_read_only_mode) { + if (!srv_read_only_mode && srv_operation == SRV_OPERATION_NORMAL) { /* Write a MLOG_CHECKPOINT marker as the first thing, - before generating any other redo log. */ + before generating any other redo log. This ensures + that subsequent crash recovery will be possible even + if the server were killed soon after this. */ fil_names_clear(log_sys->last_checkpoint_lsn, true); } @@ -3469,11 +3454,8 @@ recv_reset_logs( log_sys->lsn = ut_uint64_align_up(lsn, OS_FILE_LOG_BLOCK_SIZE); - for (log_group_t* group = UT_LIST_GET_FIRST(log_sys->log_groups); - group; group = UT_LIST_GET_NEXT(log_groups, group)) { - group->lsn = log_sys->lsn; - group->lsn_offset = LOG_FILE_HDR_SIZE; - } + log_sys->log.lsn = log_sys->lsn; + log_sys->log.lsn_offset = LOG_FILE_HDR_SIZE; log_sys->buf_next_to_write = 0; log_sys->write_lsn = log_sys->lsn; @@ -3481,6 +3463,7 @@ recv_reset_logs( log_sys->next_checkpoint_no = 0; log_sys->last_checkpoint_lsn = 0; + memset(log_sys->buf, 0, log_sys->buf_size); log_block_init(log_sys->buf, log_sys->lsn); log_block_set_first_rec_group(log_sys->buf, LOG_BLOCK_HDR_SIZE); @@ -3626,9 +3609,6 @@ get_mlog_string(mlog_id_t type) return("MLOG_LSN"); #endif /* UNIV_LOG_LSN_DEBUG */ - case MLOG_INIT_FILE_PAGE: - return("MLOG_INIT_FILE_PAGE"); - case MLOG_WRITE_STRING: return("MLOG_WRITE_STRING"); diff --git a/storage/innobase/mtr/mtr0mtr.cc b/storage/innobase/mtr/mtr0mtr.cc index d8c7d59fe27..faa00b1518b 100644 --- a/storage/innobase/mtr/mtr0mtr.cc +++ b/storage/innobase/mtr/mtr0mtr.cc @@ -478,6 +478,7 @@ mtr_write_log( const ulint len = log->size(); mtr_write_log_t write_log; + ut_ad(!recv_no_log_write); DBUG_PRINT("ib_log", (ULINTPF " extra bytes written at " LSN_PF, len, log_sys->lsn)); @@ -557,7 +558,7 @@ mtr_t::commit() m_impl.m_state = MTR_STATE_COMMITTING; /* This is a dirty read, for debugging. */ - ut_ad(!recv_no_log_write); + ut_ad(!m_impl.m_modifications || !recv_no_log_write); Command cmd(this); @@ -599,9 +600,6 @@ mtr_t::commit_checkpoint( ut_d(m_impl.m_state = MTR_STATE_COMMITTING); ut_ad(write_mlog_checkpoint || m_impl.m_n_log_recs > 1); - /* This is a dirty read, for debugging. */ - ut_ad(!recv_no_log_write); - switch (m_impl.m_n_log_recs) { case 0: break; @@ -802,6 +800,8 @@ mtr_t::release_page(const void* ptr, mtr_memo_type_t type) ulint mtr_t::Command::prepare_write() { + ut_ad(!recv_no_log_write); + switch (m_impl->m_log_mode) { case MTR_LOG_SHORT_INSERTS: ut_ad(0); @@ -829,7 +829,7 @@ mtr_t::Command::prepare_write() fil_space_t* space = m_impl->m_user_space; - if (space != NULL && space->id <= srv_undo_tablespaces_open) { + if (space != NULL && is_predefined_tablespace(space->id)) { /* Omit MLOG_FILE_NAME for predefined tablespaces. */ space = NULL; } diff --git a/storage/innobase/mysql-test/storage_engine/disabled.def b/storage/innobase/mysql-test/storage_engine/disabled.def index bad10099bbf..1d67f9311ca 100644 --- a/storage/innobase/mysql-test/storage_engine/disabled.def +++ b/storage/innobase/mysql-test/storage_engine/disabled.def @@ -4,4 +4,6 @@ insert_high_prio : InnoDB does not use table-level locking insert_low_prio : InnoDB does not use table-level locking select_high_prio : InnoDB does not use table-level locking update_low_prio : InnoDB does not use table-level locking - +insert_delayed : MDEV-12880 - INSERT DELAYED is not detected as inapplicable to a table under lock +lock_concurrent : MDEV-12882 - Assertion failure +tbl_opt_index_dir : INDEX DIRECTORY option is not supported anymore diff --git a/storage/innobase/mysql-test/storage_engine/repair_table.rdiff b/storage/innobase/mysql-test/storage_engine/repair_table.rdiff index be3709c5833..717d437b2d1 100644 --- a/storage/innobase/mysql-test/storage_engine/repair_table.rdiff +++ b/storage/innobase/mysql-test/storage_engine/repair_table.rdiff @@ -111,7 +111,7 @@ -test.t1 check error Corrupt +test.t1 check status OK SELECT a,b FROM t1; --ERROR HY000: Incorrect key file for table 't1'; try to repair it +-ERROR HY000: Index for table 't1' is corrupt; try to repair it -# Statement ended with one of expected results (0,ER_NOT_KEYFILE,144). -# If you got a difference in error message, just add it to rdiff file -INSERT INTO t1 (a,b) VALUES (14,'n'),(15,'o'); diff --git a/storage/innobase/mysql-test/storage_engine/suite.opt b/storage/innobase/mysql-test/storage_engine/suite.opt index 034b58f2628..627becdbfb5 100644 --- a/storage/innobase/mysql-test/storage_engine/suite.opt +++ b/storage/innobase/mysql-test/storage_engine/suite.opt @@ -1 +1 @@ ---innodb --ignore-builtin-innodb --plugin-load=ha_innodb +--innodb diff --git a/storage/innobase/mysql-test/storage_engine/tbl_opt_data_index_dir.rdiff b/storage/innobase/mysql-test/storage_engine/tbl_opt_index_dir.rdiff similarity index 100% rename from storage/innobase/mysql-test/storage_engine/tbl_opt_data_index_dir.rdiff rename to storage/innobase/mysql-test/storage_engine/tbl_opt_index_dir.rdiff diff --git a/storage/innobase/mysql-test/storage_engine/tbl_opt_row_format.rdiff b/storage/innobase/mysql-test/storage_engine/tbl_opt_row_format.rdiff index a6572ffa7f0..daa5fc67dec 100644 --- a/storage/innobase/mysql-test/storage_engine/tbl_opt_row_format.rdiff +++ b/storage/innobase/mysql-test/storage_engine/tbl_opt_row_format.rdiff @@ -1,10 +1,44 @@ ---- suite/storage_engine/tbl_opt_row_format.result 2012-06-24 23:55:19.539380000 +0400 -+++ suite/storage_engine/tbl_opt_row_format.reject 2012-07-15 19:26:02.235049157 +0400 -@@ -1,5 +1,7 @@ - DROP TABLE IF EXISTS t1; - CREATE TABLE t1 (a , b ) ENGINE= ROW_FORMAT=FIXED; -+Warnings: -+Warning 1478 : assuming ROW_FORMAT=COMPACT. +--- ../storage/innobase/mysql-test/storage_engine/tbl_opt_row_format.result~ 2017-05-24 00:40:12.854181048 +0300 ++++ ../storage/innobase/mysql-test/storage_engine/tbl_opt_row_format.reject 2017-05-24 00:49:06.578191030 +0300 +@@ -7,19 +7,39 @@ + `b` char(8) DEFAULT NULL + ) ENGINE= DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC + ALTER TABLE t1 ROW_FORMAT=FIXED; ++ERROR HY000: Table storage engine '' does not support the create option 'ROW_TYPE' ++# ERROR: Statement ended with errno 1478, errname ER_ILLEGAL_HA_CREATE_OPTION (expected to succeed) ++# ------------ UNEXPECTED RESULT ------------ ++# [ ALTER TABLE t1 ROW_FORMAT=FIXED ] ++# The statement|command finished with ER_ILLEGAL_HA_CREATE_OPTION. ++# ALTER TABLE or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors. ++# You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def. ++# Further in this test, the message might sometimes be suppressed; a part of the test might be skipped. ++# Also, this problem may cause a chain effect (more errors of different kinds in the test). ++# ------------------------------------------- SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` char(8) DEFAULT NULL +-) ENGINE= DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED ++) ENGINE= DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC + ALTER TABLE t1 ROW_FORMAT=PAGE; ++ERROR HY000: Table storage engine '' does not support the create option 'ROW_TYPE' ++# ERROR: Statement ended with errno 1478, errname ER_ILLEGAL_HA_CREATE_OPTION (expected to succeed) ++# ------------ UNEXPECTED RESULT ------------ ++# [ ALTER TABLE t1 ROW_FORMAT=PAGE ] ++# The statement|command finished with ER_ILLEGAL_HA_CREATE_OPTION. ++# ALTER TABLE or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors. ++# You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def. ++# Further in this test, the message might sometimes be suppressed; a part of the test might be skipped. ++# Also, this problem may cause a chain effect (more errors of different kinds in the test). ++# ------------------------------------------- + SHOW CREATE TABLE t1; + Table Create Table + t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` char(8) DEFAULT NULL +-) ENGINE= DEFAULT CHARSET=latin1 ROW_FORMAT=PAGE ++) ENGINE= DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC + ALTER TABLE t1 ROW_FORMAT=COMPACT; + SHOW CREATE TABLE t1; + Table Create Table diff --git a/storage/innobase/mysql-test/storage_engine/type_spatial_indexes.rdiff b/storage/innobase/mysql-test/storage_engine/type_spatial_indexes.rdiff deleted file mode 100644 index 154116b748c..00000000000 --- a/storage/innobase/mysql-test/storage_engine/type_spatial_indexes.rdiff +++ /dev/null @@ -1,712 +0,0 @@ ---- suite/storage_engine/type_spatial_indexes.result 2013-08-05 18:08:49.000000000 +0400 -+++ suite/storage_engine/type_spatial_indexes.reject 2013-08-05 18:25:24.000000000 +0400 -@@ -702,699 +702,15 @@ - DROP DATABASE IF EXISTS gis_ogs; - CREATE DATABASE gis_ogs; - CREATE TABLE gis_point (fid , g POINT NOT NULL, SPATIAL INDEX(g)) ENGINE= ; --CREATE TABLE gis_line (fid , g LINESTRING NOT NULL, SPATIAL INDEX(g)) ENGINE= ; --CREATE TABLE gis_polygon (fid , g POLYGON NOT NULL, SPATIAL INDEX(g)) ENGINE= ; --CREATE TABLE gis_multi_point (fid , g MULTIPOINT NOT NULL, SPATIAL INDEX(g)) ENGINE= ; --CREATE TABLE gis_multi_line (fid , g MULTILINESTRING NOT NULL, SPATIAL INDEX(g)) ENGINE= ; --CREATE TABLE gis_multi_polygon (fid , g MULTIPOLYGON NOT NULL, SPATIAL INDEX(g)) ENGINE= ; --CREATE TABLE gis_geometrycollection (fid , g GEOMETRYCOLLECTION NOT NULL, SPATIAL INDEX(g)) ENGINE= ; --CREATE TABLE gis_geometry (fid , g GEOMETRY NOT NULL) ENGINE= ; --USE gis_ogs; --CREATE TABLE lakes (fid INT , --name CHAR(64) , --shore POLYGON NOT NULL, SPATIAL INDEX s(shore)) ENGINE= ; --CREATE TABLE road_segments (fid INT , --name CHAR(64) , --aliases CHAR(64) , --num_lanes INT , --centerline LINESTRING NOT NULL, SPATIAL INDEX c(centerline)) ENGINE= ; --CREATE TABLE divided_routes (fid INT , --name CHAR(64) , --num_lanes INT , --centerlines MULTILINESTRING NOT NULL, SPATIAL INDEX c(centerlines)) ENGINE= ; --CREATE TABLE forests (fid INT , --name CHAR(64) , --boundary MULTIPOLYGON NOT NULL, SPATIAL INDEX b(boundary)) ENGINE= ; --CREATE TABLE bridges (fid INT , --name CHAR(64) , --position POINT NOT NULL, SPATIAL INDEX p(position)) ENGINE= ; --CREATE TABLE streams (fid INT , --name CHAR(64) , --centerline LINESTRING NOT NULL, SPATIAL INDEX c(centerline)) ENGINE= ; --CREATE TABLE buildings (fid INT , --name CHAR(64) , --position POINT NOT NULL, --footprint POLYGON NOT NULL, SPATIAL INDEX p(position), SPATIAL INDEX f(footprint)) ENGINE= ; --CREATE TABLE ponds (fid INT , --name CHAR(64) , --type CHAR(64) , --shores MULTIPOLYGON NOT NULL, SPATIAL INDEX s(shores)) ENGINE= ; --CREATE TABLE named_places (fid INT , --name CHAR(64) , --boundary POLYGON NOT NULL, SPATIAL INDEX b(boundary)) ENGINE= ; --CREATE TABLE map_neatlines (fid INT , --neatline POLYGON NOT NULL, SPATIAL INDEX n(neatline)) ENGINE= ; --USE test; --SHOW FIELDS FROM gis_point; --Field Type Null Key Default Extra --fid int(11) YES NULL --g point NO MUL NULL --SHOW FIELDS FROM gis_line; --Field Type Null Key Default Extra --fid int(11) YES NULL --g linestring NO MUL NULL --SHOW FIELDS FROM gis_polygon; --Field Type Null Key Default Extra --fid int(11) YES NULL --g polygon NO MUL NULL --SHOW FIELDS FROM gis_multi_point; --Field Type Null Key Default Extra --fid int(11) YES NULL --g multipoint NO MUL NULL --SHOW FIELDS FROM gis_multi_line; --Field Type Null Key Default Extra --fid int(11) YES NULL --g multilinestring NO MUL NULL --SHOW FIELDS FROM gis_multi_polygon; --Field Type Null Key Default Extra --fid int(11) YES NULL --g multipolygon NO MUL NULL --SHOW FIELDS FROM gis_geometrycollection; --Field Type Null Key Default Extra --fid int(11) YES NULL --g geometrycollection NO MUL NULL --SHOW FIELDS FROM gis_geometry; --Field Type Null Key Default Extra --fid int(11) YES NULL --g geometry NO NULL --INSERT INTO gis_point (fid,g) VALUES --(101, PointFromText('POINT(10 10)')), --(102, PointFromText('POINT(20 10)')), --(103, PointFromText('POINT(20 20)')), --(104, PointFromWKB(AsWKB(PointFromText('POINT(10 20)')))); --INSERT INTO gis_line (fid,g) VALUES --(105, LineFromText('LINESTRING(0 0,0 10,10 0)')), --(106, LineStringFromText('LINESTRING(10 10,20 10,20 20,10 20,10 10)')), --(107, LineStringFromWKB(AsWKB(LineString(Point(10, 10), Point(40, 10))))); --INSERT INTO gis_polygon (fid,g) VALUES --(108, PolygonFromText('POLYGON((10 10,20 10,20 20,10 20,10 10))')), --(109, PolyFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')), --(110, PolyFromWKB(AsWKB(Polygon(LineString(Point(0, 0), Point(30, 0), Point(30, 30), Point(0, 0)))))); --INSERT INTO gis_multi_point (fid,g) VALUES --(111, MultiPointFromText('MULTIPOINT(0 0,10 10,10 20,20 20)')), --(112, MPointFromText('MULTIPOINT(1 1,11 11,11 21,21 21)')), --(113, MPointFromWKB(AsWKB(MultiPoint(Point(3, 6), Point(4, 10))))); --INSERT INTO gis_multi_line (fid,g) VALUES --(114, MultiLineStringFromText('MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))')), --(115, MLineFromText('MULTILINESTRING((10 48,10 21,10 0))')), --(116, MLineFromWKB(AsWKB(MultiLineString(LineString(Point(1, 2), Point(3, 5)), LineString(Point(2, 5), Point(5, 8), Point(21, 7)))))); --INSERT INTO gis_multi_polygon (fid,g) VALUES --(117, MultiPolygonFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')), --(118, MPolyFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')), --(119, MPolyFromWKB(AsWKB(MultiPolygon(Polygon(LineString(Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3))))))); --INSERT INTO gis_geometrycollection (fid,g) VALUES --(120, GeomCollFromText('GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(0 0,10 10))')), --(121, GeometryFromWKB(AsWKB(GeometryCollection(Point(44, 6), LineString(Point(3, 6), Point(7, 9)))))), --(122, GeomFromText('GeometryCollection()')), --(123, GeomFromText('GeometryCollection EMPTY')); --INSERT into gis_geometry (fid,g) SELECT fid,g FROM gis_point; --INSERT into gis_geometry (fid,g) SELECT fid,g FROM gis_line; --INSERT into gis_geometry (fid,g) SELECT fid,g FROM gis_polygon; --INSERT into gis_geometry (fid,g) SELECT fid,g FROM gis_multi_point; --INSERT into gis_geometry (fid,g) SELECT fid,g FROM gis_multi_line; --INSERT into gis_geometry (fid,g) SELECT fid,g FROM gis_multi_polygon; --INSERT into gis_geometry (fid,g) SELECT fid,g FROM gis_geometrycollection; --SELECT fid, AsText(g) FROM gis_point; --fid AsText(g) --101 POINT(10 10) --102 POINT(20 10) --103 POINT(20 20) --104 POINT(10 20) --SELECT fid, AsText(g) FROM gis_line; --fid AsText(g) --105 LINESTRING(0 0,0 10,10 0) --106 LINESTRING(10 10,20 10,20 20,10 20,10 10) --107 LINESTRING(10 10,40 10) --SELECT fid, AsText(g) FROM gis_polygon; --fid AsText(g) --108 POLYGON((10 10,20 10,20 20,10 20,10 10)) --109 POLYGON((0 0,50 0,50 50,0 50,0 0),(10 10,20 10,20 20,10 20,10 10)) --110 POLYGON((0 0,30 0,30 30,0 0)) --SELECT fid, AsText(g) FROM gis_multi_point; --fid AsText(g) --111 MULTIPOINT(0 0,10 10,10 20,20 20) --112 MULTIPOINT(1 1,11 11,11 21,21 21) --113 MULTIPOINT(3 6,4 10) --SELECT fid, AsText(g) FROM gis_multi_line; --fid AsText(g) --114 MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48)) --115 MULTILINESTRING((10 48,10 21,10 0)) --116 MULTILINESTRING((1 2,3 5),(2 5,5 8,21 7)) --SELECT fid, AsText(g) FROM gis_multi_polygon; --fid AsText(g) --117 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18))) --118 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18))) --119 MULTIPOLYGON(((0 3,3 3,3 0,0 3))) --SELECT fid, AsText(g) FROM gis_geometrycollection; --fid AsText(g) --120 GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,10 10)) --121 GEOMETRYCOLLECTION(POINT(44 6),LINESTRING(3 6,7 9)) --122 GEOMETRYCOLLECTION EMPTY --123 GEOMETRYCOLLECTION EMPTY --SELECT fid, AsText(g) FROM gis_geometry; --fid AsText(g) --101 POINT(10 10) --102 POINT(20 10) --103 POINT(20 20) --104 POINT(10 20) --105 LINESTRING(0 0,0 10,10 0) --106 LINESTRING(10 10,20 10,20 20,10 20,10 10) --107 LINESTRING(10 10,40 10) --108 POLYGON((10 10,20 10,20 20,10 20,10 10)) --109 POLYGON((0 0,50 0,50 50,0 50,0 0),(10 10,20 10,20 20,10 20,10 10)) --110 POLYGON((0 0,30 0,30 30,0 0)) --111 MULTIPOINT(0 0,10 10,10 20,20 20) --112 MULTIPOINT(1 1,11 11,11 21,21 21) --113 MULTIPOINT(3 6,4 10) --114 MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48)) --115 MULTILINESTRING((10 48,10 21,10 0)) --116 MULTILINESTRING((1 2,3 5),(2 5,5 8,21 7)) --117 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18))) --118 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18))) --119 MULTIPOLYGON(((0 3,3 3,3 0,0 3))) --120 GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,10 10)) --121 GEOMETRYCOLLECTION(POINT(44 6),LINESTRING(3 6,7 9)) --122 GEOMETRYCOLLECTION EMPTY --123 GEOMETRYCOLLECTION EMPTY --SELECT fid, Dimension(g) FROM gis_geometry; --fid Dimension(g) --101 0 --102 0 --103 0 --104 0 --105 1 --106 1 --107 1 --108 2 --109 2 --110 2 --111 0 --112 0 --113 0 --114 1 --115 1 --116 1 --117 2 --118 2 --119 2 --120 1 --121 1 --122 0 --123 0 --SELECT fid, GeometryType(g) FROM gis_geometry; --fid GeometryType(g) --101 POINT --102 POINT --103 POINT --104 POINT --105 LINESTRING --106 LINESTRING --107 LINESTRING --108 POLYGON --109 POLYGON --110 POLYGON --111 MULTIPOINT --112 MULTIPOINT --113 MULTIPOINT --114 MULTILINESTRING --115 MULTILINESTRING --116 MULTILINESTRING --117 MULTIPOLYGON --118 MULTIPOLYGON --119 MULTIPOLYGON --120 GEOMETRYCOLLECTION --121 GEOMETRYCOLLECTION --122 GEOMETRYCOLLECTION --123 GEOMETRYCOLLECTION --SELECT fid, IsEmpty(g) FROM gis_geometry; --fid IsEmpty(g) --101 0 --102 0 --103 0 --104 0 --105 0 --106 0 --107 0 --108 0 --109 0 --110 0 --111 0 --112 0 --113 0 --114 0 --115 0 --116 0 --117 0 --118 0 --119 0 --120 0 --121 0 --122 0 --123 0 --SELECT fid, AsText(Envelope(g)) FROM gis_geometry; --fid AsText(Envelope(g)) --101 POLYGON((10 10,10 10,10 10,10 10,10 10)) --102 POLYGON((20 10,20 10,20 10,20 10,20 10)) --103 POLYGON((20 20,20 20,20 20,20 20,20 20)) --104 POLYGON((10 20,10 20,10 20,10 20,10 20)) --105 POLYGON((0 0,10 0,10 10,0 10,0 0)) --106 POLYGON((10 10,20 10,20 20,10 20,10 10)) --107 POLYGON((10 10,40 10,40 10,10 10,10 10)) --108 POLYGON((10 10,20 10,20 20,10 20,10 10)) --109 POLYGON((0 0,50 0,50 50,0 50,0 0)) --110 POLYGON((0 0,30 0,30 30,0 30,0 0)) --111 POLYGON((0 0,20 0,20 20,0 20,0 0)) --112 POLYGON((1 1,21 1,21 21,1 21,1 1)) --113 POLYGON((3 6,4 6,4 10,3 10,3 6)) --114 POLYGON((10 0,16 0,16 48,10 48,10 0)) --115 POLYGON((10 0,10 0,10 48,10 48,10 0)) --116 POLYGON((1 2,21 2,21 8,1 8,1 2)) --117 POLYGON((28 0,84 0,84 42,28 42,28 0)) --118 POLYGON((28 0,84 0,84 42,28 42,28 0)) --119 POLYGON((0 0,3 0,3 3,0 3,0 0)) --120 POLYGON((0 0,10 0,10 10,0 10,0 0)) --121 POLYGON((3 6,44 6,44 9,3 9,3 6)) --122 GEOMETRYCOLLECTION EMPTY --123 GEOMETRYCOLLECTION EMPTY --SELECT fid, X(g) FROM gis_point; --fid X(g) --101 10 --102 20 --103 20 --104 10 --SELECT fid, Y(g) FROM gis_point; --fid Y(g) --101 10 --102 10 --103 20 --104 20 --SELECT fid, AsText(StartPoint(g)) FROM gis_line; --fid AsText(StartPoint(g)) --105 POINT(0 0) --106 POINT(10 10) --107 POINT(10 10) --SELECT fid, AsText(EndPoint(g)) FROM gis_line; --fid AsText(EndPoint(g)) --105 POINT(10 0) --106 POINT(10 10) --107 POINT(40 10) --SELECT fid, GLength(g) FROM gis_line; --fid GLength(g) --105 24.14213562373095 --106 40 --107 30 --SELECT fid, NumPoints(g) FROM gis_line; --fid NumPoints(g) --105 3 --106 5 --107 2 --SELECT fid, AsText(PointN(g, 2)) FROM gis_line; --fid AsText(PointN(g, 2)) --105 POINT(0 10) --106 POINT(20 10) --107 POINT(40 10) --SELECT fid, IsClosed(g) FROM gis_line; --fid IsClosed(g) --105 0 --106 1 --107 0 --SELECT fid, AsText(Centroid(g)) FROM gis_polygon; --fid AsText(Centroid(g)) --108 POINT(15 15) --109 POINT(25.416666666666668 25.416666666666668) --110 POINT(20 10) --SELECT fid, Area(g) FROM gis_polygon; --fid Area(g) --108 100 --109 2400 --110 450 --SELECT fid, AsText(ExteriorRing(g)) FROM gis_polygon; --fid AsText(ExteriorRing(g)) --108 LINESTRING(10 10,20 10,20 20,10 20,10 10) --109 LINESTRING(0 0,50 0,50 50,0 50,0 0) --110 LINESTRING(0 0,30 0,30 30,0 0) --SELECT fid, NumInteriorRings(g) FROM gis_polygon; --fid NumInteriorRings(g) --108 0 --109 1 --110 0 --SELECT fid, AsText(InteriorRingN(g, 1)) FROM gis_polygon; --fid AsText(InteriorRingN(g, 1)) --108 NULL --109 LINESTRING(10 10,20 10,20 20,10 20,10 10) --110 NULL --SELECT fid, IsClosed(g) FROM gis_multi_line; --fid IsClosed(g) --114 0 --115 0 --116 0 --SELECT fid, AsText(Centroid(g)) FROM gis_multi_polygon; --fid AsText(Centroid(g)) --117 POINT(55.58852775304245 17.426536064113982) --118 POINT(55.58852775304245 17.426536064113982) --119 POINT(2 2) --SELECT fid, Area(g) FROM gis_multi_polygon; --fid Area(g) --117 1684.5 --118 1684.5 --119 4.5 --SELECT fid, NumGeometries(g) from gis_multi_point; --fid NumGeometries(g) --111 4 --112 4 --113 2 --SELECT fid, NumGeometries(g) from gis_multi_line; --fid NumGeometries(g) --114 2 --115 1 --116 2 --SELECT fid, NumGeometries(g) from gis_multi_polygon; --fid NumGeometries(g) --117 2 --118 2 --119 1 --SELECT fid, NumGeometries(g) from gis_geometrycollection; --fid NumGeometries(g) --120 2 --121 2 --122 0 --123 0 --SELECT fid, AsText(GeometryN(g, 2)) from gis_multi_point; --fid AsText(GeometryN(g, 2)) --111 POINT(10 10) --112 POINT(11 11) --113 POINT(4 10) --SELECT fid, AsText(GeometryN(g, 2)) from gis_multi_line; --fid AsText(GeometryN(g, 2)) --114 LINESTRING(16 0,16 23,16 48) --115 NULL --116 LINESTRING(2 5,5 8,21 7) --SELECT fid, AsText(GeometryN(g, 2)) from gis_multi_polygon; --fid AsText(GeometryN(g, 2)) --117 POLYGON((59 18,67 18,67 13,59 13,59 18)) --118 POLYGON((59 18,67 18,67 13,59 13,59 18)) --119 NULL --SELECT fid, AsText(GeometryN(g, 2)) from gis_geometrycollection; --fid AsText(GeometryN(g, 2)) --120 LINESTRING(0 0,10 10) --121 LINESTRING(3 6,7 9) --122 NULL --123 NULL --SELECT fid, AsText(GeometryN(g, 1)) from gis_geometrycollection; --fid AsText(GeometryN(g, 1)) --120 POINT(0 0) --121 POINT(44 6) --122 NULL --123 NULL --SELECT g1.fid as first, g2.fid as second, --Within(g1.g, g2.g) as w, Contains(g1.g, g2.g) as c, Overlaps(g1.g, g2.g) as o, --Equals(g1.g, g2.g) as e, Disjoint(g1.g, g2.g) as d, Touches(g1.g, g2.g) as t, --Intersects(g1.g, g2.g) as i, Crosses(g1.g, g2.g) as r --FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second; --first second w c o e d t i r --120 120 1 1 0 1 0 0 1 0 --120 121 0 0 1 0 0 0 1 0 --120 122 NULL NULL NULL NULL NULL NULL NULL NULL --120 123 NULL NULL NULL NULL NULL NULL NULL NULL --121 120 0 0 1 0 0 0 1 0 --121 121 1 1 0 1 0 0 1 0 --121 122 NULL NULL NULL NULL NULL NULL NULL NULL --121 123 NULL NULL NULL NULL NULL NULL NULL NULL --122 120 NULL NULL NULL NULL NULL NULL NULL NULL --122 121 NULL NULL NULL NULL NULL NULL NULL NULL --122 122 NULL NULL NULL NULL NULL NULL NULL NULL --122 123 NULL NULL NULL NULL NULL NULL NULL NULL --123 120 NULL NULL NULL NULL NULL NULL NULL NULL --123 121 NULL NULL NULL NULL NULL NULL NULL NULL --123 122 NULL NULL NULL NULL NULL NULL NULL NULL --123 123 NULL NULL NULL NULL NULL NULL NULL NULL --DROP TABLE gis_point, gis_line, gis_polygon, gis_multi_point, gis_multi_line, gis_multi_polygon, gis_geometrycollection, gis_geometry; --USE gis_ogs; --# Lakes --INSERT INTO lakes (fid,name,shore) VALUES ( --101, 'BLUE LAKE', --PolyFromText( --'POLYGON( -- (52 18,66 23,73 9,48 6,52 18), -- (59 18,67 18,67 13,59 13,59 18) -- )', --101)); --# Road Segments --INSERT INTO road_segments (fid,name,aliases,num_lanes,centerline) VALUES(102, 'Route 5', NULL, 2, --LineFromText( --'LINESTRING( 0 18, 10 21, 16 23, 28 26, 44 31 )' ,101)); --INSERT INTO road_segments (fid,name,aliases,num_lanes,centerline) VALUES(103, 'Route 5', 'Main Street', 4, --LineFromText( --'LINESTRING( 44 31, 56 34, 70 38 )' ,101)); --INSERT INTO road_segments (fid,name,aliases,num_lanes,centerline) VALUES(104, 'Route 5', NULL, 2, --LineFromText( --'LINESTRING( 70 38, 72 48 )' ,101)); --INSERT INTO road_segments (fid,name,aliases,num_lanes,centerline) VALUES(105, 'Main Street', NULL, 4, --LineFromText( --'LINESTRING( 70 38, 84 42 )' ,101)); --INSERT INTO road_segments (fid,name,aliases,num_lanes,centerline) VALUES(106, 'Dirt Road by Green Forest', NULL, --1, --LineFromText( --'LINESTRING( 28 26, 28 0 )',101)); --# DividedRoutes --INSERT INTO divided_routes (fid,name,num_lanes,centerlines) VALUES(119, 'Route 75', 4, --MLineFromText( --'MULTILINESTRING((10 48,10 21,10 0), -- (16 0,16 23,16 48))', 101)); --# Forests --INSERT INTO forests (fid,name,boundary) VALUES(109, 'Green Forest', --MPolyFromText( --'MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26), -- (52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))', --101)); --# Bridges --INSERT INTO bridges (fid,name,position) VALUES(110, 'Cam Bridge', PointFromText( --'POINT( 44 31 )', 101)); --# Streams --INSERT INTO streams (fid,name,centerline) VALUES(111, 'Cam Stream', --LineFromText( --'LINESTRING( 38 48, 44 41, 41 36, 44 31, 52 18 )', 101)); --INSERT INTO streams (fid,name,centerline) VALUES(112, NULL, --LineFromText( --'LINESTRING( 76 0, 78 4, 73 9 )', 101)); --# Buildings --INSERT INTO buildings (fid,name,position,footprint) VALUES(113, '123 Main Street', --PointFromText( --'POINT( 52 30 )', 101), --PolyFromText( --'POLYGON( ( 50 31, 54 31, 54 29, 50 29, 50 31) )', 101)); --INSERT INTO buildings (fid,name,position,footprint) VALUES(114, '215 Main Street', --PointFromText( --'POINT( 64 33 )', 101), --PolyFromText( --'POLYGON( ( 66 34, 62 34, 62 32, 66 32, 66 34) )', 101)); --# Ponds --INSERT INTO ponds (fid,name,type,shores) VALUES(120, NULL, 'Stock Pond', --MPolyFromText( --'MULTIPOLYGON( ( ( 24 44, 22 42, 24 40, 24 44) ), -- ( ( 26 44, 26 40, 28 42, 26 44) ) )', 101)); --# Named Places --INSERT INTO named_places (fid,name,boundary) VALUES(117, 'Ashton', --PolyFromText( --'POLYGON( ( 62 48, 84 48, 84 30, 56 30, 56 34, 62 48) )', 101)); --INSERT INTO named_places (fid,name,boundary) VALUES(118, 'Goose Island', --PolyFromText( --'POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )', 101)); --# Map Neatlines --INSERT INTO map_neatlines (fid,neatline) VALUES(115, --PolyFromText( --'POLYGON( ( 0 0, 0 48, 84 48, 84 0, 0 0 ) )', 101)); --SELECT Dimension(shore) --FROM lakes --WHERE name = 'Blue Lake'; --Dimension(shore) --2 --SELECT GeometryType(centerlines) --FROM divided_routes --WHERE name = 'Route 75'; --GeometryType(centerlines) --MULTILINESTRING --SELECT AsText(boundary) --FROM named_places --WHERE name = 'Goose Island'; --AsText(boundary) --POLYGON((67 13,67 18,59 18,59 13,67 13)) --SELECT AsText(PolyFromWKB(AsBinary(boundary),101)) --FROM named_places --WHERE name = 'Goose Island'; --AsText(PolyFromWKB(AsBinary(boundary),101)) --POLYGON((67 13,67 18,59 18,59 13,67 13)) --SELECT SRID(boundary) --FROM named_places --WHERE name = 'Goose Island'; --SRID(boundary) --101 --SELECT IsEmpty(centerline) --FROM road_segments --WHERE name = 'Route 5' --AND aliases = 'Main Street'; --IsEmpty(centerline) --0 --SELECT AsText(Envelope(boundary)) --FROM named_places --WHERE name = 'Goose Island'; --AsText(Envelope(boundary)) --POLYGON((59 13,67 13,67 18,59 18,59 13)) --SELECT X(position) --FROM bridges --WHERE name = 'Cam Bridge'; --X(position) --44 --SELECT Y(position) --FROM bridges --WHERE name = 'Cam Bridge'; --Y(position) --31 --SELECT AsText(StartPoint(centerline)) --FROM road_segments --WHERE fid = 102; --AsText(StartPoint(centerline)) --POINT(0 18) --SELECT AsText(EndPoint(centerline)) --FROM road_segments --WHERE fid = 102; --AsText(EndPoint(centerline)) --POINT(44 31) --SELECT GLength(centerline) --FROM road_segments --WHERE fid = 106; --GLength(centerline) --26 --SELECT NumPoints(centerline) --FROM road_segments --WHERE fid = 102; --NumPoints(centerline) --5 --SELECT AsText(PointN(centerline, 1)) --FROM road_segments --WHERE fid = 102; --AsText(PointN(centerline, 1)) --POINT(0 18) --SELECT AsText(Centroid(boundary)) --FROM named_places --WHERE name = 'Goose Island'; --AsText(Centroid(boundary)) --POINT(63 15.5) --SELECT Area(boundary) --FROM named_places --WHERE name = 'Goose Island'; --Area(boundary) --40 --SELECT AsText(ExteriorRing(shore)) --FROM lakes --WHERE name = 'Blue Lake'; --AsText(ExteriorRing(shore)) --LINESTRING(52 18,66 23,73 9,48 6,52 18) --SELECT NumInteriorRings(shore) --FROM lakes --WHERE name = 'Blue Lake'; --NumInteriorRings(shore) --1 --SELECT AsText(InteriorRingN(shore, 1)) --FROM lakes --WHERE name = 'Blue Lake'; --AsText(InteriorRingN(shore, 1)) --LINESTRING(59 18,67 18,67 13,59 13,59 18) --SELECT NumGeometries(centerlines) --FROM divided_routes --WHERE name = 'Route 75'; --NumGeometries(centerlines) --2 --SELECT AsText(GeometryN(centerlines, 2)) --FROM divided_routes --WHERE name = 'Route 75'; --AsText(GeometryN(centerlines, 2)) --LINESTRING(16 0,16 23,16 48) --SELECT IsClosed(centerlines) --FROM divided_routes --WHERE name = 'Route 75'; --IsClosed(centerlines) --0 --SELECT GLength(centerlines) --FROM divided_routes --WHERE name = 'Route 75'; --GLength(centerlines) --96 --SELECT AsText(Centroid(shores)) --FROM ponds --WHERE fid = 120; --AsText(Centroid(shores)) --POINT(25 42) --SELECT Area(shores) --FROM ponds --WHERE fid = 120; --Area(shores) --8 --SELECT ST_Equals(boundary, --PolyFromText('POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )',1)) --FROM named_places --WHERE name = 'Goose Island'; --ST_Equals(boundary, --PolyFromText('POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )',1)) --1 --SELECT ST_Disjoint(centerlines, boundary) --FROM divided_routes, named_places --WHERE divided_routes.name = 'Route 75' --AND named_places.name = 'Ashton'; --ST_Disjoint(centerlines, boundary) --1 --SELECT ST_Touches(centerline, shore) --FROM streams, lakes --WHERE streams.name = 'Cam Stream' --AND lakes.name = 'Blue Lake'; --ST_Touches(centerline, shore) --1 --SELECT Crosses(road_segments.centerline, divided_routes.centerlines) --FROM road_segments, divided_routes --WHERE road_segments.fid = 102 --AND divided_routes.name = 'Route 75'; --Crosses(road_segments.centerline, divided_routes.centerlines) --1 --SELECT ST_Intersects(road_segments.centerline, divided_routes.centerlines) --FROM road_segments, divided_routes --WHERE road_segments.fid = 102 --AND divided_routes.name = 'Route 75'; --ST_Intersects(road_segments.centerline, divided_routes.centerlines) --1 --SELECT ST_Contains(forests.boundary, named_places.boundary) --FROM forests, named_places --WHERE forests.name = 'Green Forest' --AND named_places.name = 'Ashton'; --ST_Contains(forests.boundary, named_places.boundary) --0 --SELECT ST_Distance(position, boundary) --FROM bridges, named_places --WHERE bridges.name = 'Cam Bridge' --AND named_places.name = 'Ashton'; --ST_Distance(position, boundary) --12 --SELECT AsText(ST_Difference(named_places.boundary, forests.boundary)) --FROM named_places, forests --WHERE named_places.name = 'Ashton' --AND forests.name = 'Green Forest'; --AsText(ST_Difference(named_places.boundary, forests.boundary)) --POLYGON((56 34,62 48,84 48,84 42,56 34)) --SELECT AsText(ST_Union(shore, boundary)) --FROM lakes, named_places --WHERE lakes.name = 'Blue Lake' --AND named_places.name = 'Goose Island'; --AsText(ST_Union(shore, boundary)) --POLYGON((48 6,52 18,66 23,73 9,48 6)) --SELECT AsText(ST_SymDifference(shore, boundary)) --FROM lakes, named_places --WHERE lakes.name = 'Blue Lake' --AND named_places.name = 'Ashton'; --AsText(ST_SymDifference(shore, boundary)) --MULTIPOLYGON(((48 6,52 18,66 23,73 9,48 6),(59 13,59 18,67 18,67 13,59 13)),((56 30,56 34,62 48,84 48,84 30,56 30))) --SELECT count(*) --FROM buildings, bridges --WHERE ST_Contains(ST_Buffer(bridges.position, 15.0), buildings.footprint) = 1; --count(*) --1 -+ERROR HY000: The storage engine doesn't support SPATIAL indexes -+# ERROR: Statement ended with errno 1464, errname ER_TABLE_CANT_HANDLE_SPKEYS (expected to succeed) -+# ------------ UNEXPECTED RESULT ------------ -+# [ CREATE TABLE gis_point (fid INT(11) /*!*/ /*Custom column options*/, g POINT NOT NULL, SPATIAL INDEX(g)) ENGINE=InnoDB /*!*/ /*Custom table options*/ ] -+# The statement|command finished with ER_TABLE_CANT_HANDLE_SPKEYS. -+# Geometry types or spatial indexes or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors. -+# You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def. -+# Further in this test, the message might sometimes be suppressed; a part of the test might be skipped. -+# Also, this problem may cause a chain effect (more errors of different kinds in the test). -+# ------------------------------------------- - DROP DATABASE gis_ogs; - USE test; diff --git a/storage/innobase/os/os0file.cc b/storage/innobase/os/os0file.cc index 110ac6f40f1..837e60882e6 100644 --- a/storage/innobase/os/os0file.cc +++ b/storage/innobase/os/os0file.cc @@ -1,6 +1,6 @@ /*********************************************************************** -Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2009, Percona Inc. Copyright (c) 2013, 2017, MariaDB Corporation. @@ -107,9 +107,6 @@ static ulint os_innodb_umask = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP; #else /** Umask for creating files */ static ulint os_innodb_umask = 0; -#ifndef ECANCELED -#define ECANCELED 125 -#endif static HANDLE completion_port; static HANDLE read_completion_port; static DWORD fls_sync_io = FLS_OUT_OF_INDEXES; @@ -226,7 +223,7 @@ struct Slot { os_offset_t offset; /** file where to read or write */ - os_file_t file; + pfs_os_file_t file; /** file name or path */ const char* name; @@ -303,7 +300,7 @@ public: /** Requests for a slot in the aio array. If no slot is available, waits until not_full-event becomes signaled. - @param[in,out] type IO context + @param[in] type IO context @param[in,out] m1 message to be passed along with the AIO operation @param[in,out] m2 message to be passed along with the AIO @@ -316,14 +313,14 @@ public: @param[in] len length of the block to read or write @return pointer to slot */ Slot* reserve_slot( - IORequest& type, - fil_node_t* m1, - void* m2, - os_file_t file, - const char* name, - void* buf, - os_offset_t offset, - ulint len) + const IORequest& type, + fil_node_t* m1, + void* m2, + pfs_os_file_t file, + const char* name, + void* buf, + os_offset_t offset, + ulint len) MY_ATTRIBUTE((warn_unused_result)); /** @return number of reserved slots */ @@ -362,7 +359,7 @@ public: void print(FILE* file); /** @return the number of slots per segment */ - unsigned slots_per_segment() const + ulint slots_per_segment() const MY_ATTRIBUTE((warn_unused_result)) { return(m_slots.size() / m_n_segments); @@ -510,14 +507,14 @@ public: MY_ATTRIBUTE((warn_unused_result)); /** Select the IO slot array - @param[in] type Type of IO, READ or WRITE + @param[in,out] type Type of IO, READ or WRITE @param[in] read_only true if running in read-only mode @param[in] mode IO mode @return slot array or NULL if invalid mode specified */ static AIO* select_slot_array( - IORequest& type, - bool read_only, - ulint mode) + IORequest& type, + bool read_only, + ulint mode) MY_ATTRIBUTE((warn_unused_result)); /** Calculates segment number for a slot. @@ -860,17 +857,29 @@ os_file_get_block_size( sizeof(disk_alignment), &tmp); - CloseHandle(volume_handle); - if (!result) { - os_file_handle_error_no_exit(volume, - "DeviceIoControl(IOCTL_STORAGE_QUERY_PROPERTY)", FALSE); + if (GetLastError() == ERROR_INVALID_FUNCTION) { + // Don't report error, it is driver's fault, not ours or users. + // We handle this with fallback. Report wit info message, just once. + static bool write_info = true; + if (write_info) { + ib::info() << "DeviceIoControl(IOCTL_STORAGE_QUERY_PROPERTY)" + << " unsupported on volume " << volume; + write_info = false; + } + } else { + os_file_handle_error_no_exit(volume, + "DeviceIoControl(IOCTL_STORAGE_QUERY_PROPERTY)", FALSE); + } goto end; } fblock_size = disk_alignment.BytesPerPhysicalSector; end: + if (volume_handle != INVALID_HANDLE_VALUE) { + CloseHandle(volume_handle); + } #endif /* _WIN32 */ /* Currently we support file block size up to 4Kb */ @@ -2248,7 +2257,7 @@ AIO::is_linux_native_aio_supported() strcpy(name + dirnamelen, "ib_logfile0"); - fd = ::open(name, O_RDONLY); + fd = open(name, O_RDONLY); if (fd == -1) { @@ -2578,7 +2587,7 @@ A simple function to open or create a file. @param[out] success true if succeed, false if error @return handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ -os_file_t +pfs_os_file_t os_file_create_simple_func( const char* name, ulint create_mode, @@ -2586,7 +2595,7 @@ os_file_create_simple_func( bool read_only, bool* success) { - os_file_t file; + pfs_os_file_t file; *success = false; @@ -2656,7 +2665,7 @@ os_file_create_simple_func( bool retry; do { - file = ::open(name, create_flag, os_innodb_umask); + file = open(name, create_flag, os_innodb_umask); if (file == -1) { *success = false; @@ -2871,7 +2880,7 @@ Opens an existing file or creates a new. @param[in] success true if succeeded @return handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ -os_file_t +pfs_os_file_t os_file_create_func( const char* name, ulint create_mode, @@ -2958,7 +2967,7 @@ os_file_create_func( bool retry; do { - file = ::open(name, create_flag, os_innodb_umask); + file = open(name, create_flag, os_innodb_umask); if (file == -1) { const char* operation; @@ -3037,7 +3046,7 @@ A simple function to open or create a file. @param[out] success true if succeeded @return own: handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ -os_file_t +pfs_os_file_t os_file_create_simple_no_error_handling_func( const char* name, ulint create_mode, @@ -3092,7 +3101,7 @@ os_file_create_simple_no_error_handling_func( return(OS_FILE_CLOSED); } - file = ::open(name, create_flag, os_innodb_umask); + file = open(name, create_flag, os_innodb_umask); *success = (file != -1); @@ -3324,15 +3333,8 @@ os_file_get_status_posix( && (stat_info->type == OS_FILE_TYPE_FILE || stat_info->type == OS_FILE_TYPE_BLOCK)) { - int access = !read_only ? O_RDWR : O_RDONLY; - int fh = ::open(path, access, os_innodb_umask); - - if (fh == -1) { - stat_info->rw_perm = false; - } else { - stat_info->rw_perm = true; - close(fh); - } + stat_info->rw_perm = !access(path, read_only + ? R_OK : R_OK | W_OK); } return(DB_SUCCESS); @@ -3788,7 +3790,7 @@ A simple function to open or create a file. @param[out] success true if succeed, false if error @return handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ -os_file_t +pfs_os_file_t os_file_create_simple_func( const char* name, ulint create_mode, @@ -3806,6 +3808,7 @@ os_file_create_simple_func( ut_a(!(create_mode & OS_FILE_ON_ERROR_SILENT)); ut_a(!(create_mode & OS_FILE_ON_ERROR_NO_EXIT)); + ut_ad(srv_operation == SRV_OPERATION_NORMAL); if (create_mode == OS_FILE_OPEN) { @@ -4105,7 +4108,7 @@ Opens an existing file or creates a new. @param[in] success true if succeeded @return handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ -os_file_t +pfs_os_file_t os_file_create_func( const char* name, ulint create_mode, @@ -4129,7 +4132,9 @@ os_file_create_func( ); DWORD create_flag; - DWORD share_mode = FILE_SHARE_READ; + DWORD share_mode = srv_operation != SRV_OPERATION_NORMAL + ? FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE + : FILE_SHARE_READ; if (create_mode != OS_FILE_OPEN && create_mode != OS_FILE_OPEN_RAW) { WAIT_ALLOW_WRITES(); @@ -4141,8 +4146,7 @@ os_file_create_func( on_error_silent = create_mode & OS_FILE_ON_ERROR_SILENT ? true : false; - create_mode &= ~OS_FILE_ON_ERROR_NO_EXIT; - create_mode &= ~OS_FILE_ON_ERROR_SILENT; + create_mode &= ~(OS_FILE_ON_ERROR_NO_EXIT | OS_FILE_ON_ERROR_SILENT); if (create_mode == OS_FILE_OPEN_RAW) { @@ -4320,7 +4324,7 @@ A simple function to open or create a file. @param[out] success true if succeeded @return own: handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ -os_file_t +pfs_os_file_t os_file_create_simple_no_error_handling_func( const char* name, ulint create_mode, @@ -4335,7 +4339,9 @@ os_file_create_simple_no_error_handling_func( DWORD access; DWORD create_flag; DWORD attributes = 0; - DWORD share_mode = FILE_SHARE_READ; + DWORD share_mode = srv_operation != SRV_OPERATION_NORMAL + ? FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE + : FILE_SHARE_READ; ut_a(name); @@ -4384,7 +4390,8 @@ os_file_create_simple_no_error_handling_func( /*!< A backup program has to give mysqld the maximum freedom to do what it likes with the file */ - share_mode |= FILE_SHARE_DELETE | FILE_SHARE_WRITE; + share_mode |= FILE_SHARE_DELETE | FILE_SHARE_WRITE + | FILE_SHARE_READ; } else { ib::error() @@ -4686,7 +4693,8 @@ os_file_get_status_win32( fh = CreateFile( (LPCTSTR) path, // File to open access, - 0, // No sharing + FILE_SHARE_READ | FILE_SHARE_WRITE + | FILE_SHARE_DELETE, // Full sharing NULL, // Default security OPEN_EXISTING, // Existing file only FILE_ATTRIBUTE_NORMAL, // Normal file @@ -4931,14 +4939,15 @@ os_file_io( static MY_ATTRIBUTE((warn_unused_result)) ssize_t os_file_pwrite( - IORequest& type, - os_file_t file, - const byte* buf, - ulint n, - os_offset_t offset, - dberr_t* err) + const IORequest& type, + os_file_t file, + const byte* buf, + ulint n, + os_offset_t offset, + dberr_t* err) { ut_ad(type.validate()); + ut_ad(type.is_write()); ++os_n_file_writes; @@ -4951,26 +4960,25 @@ os_file_pwrite( return(n_bytes); } -/** Requests a synchronous write operation. +/** NOTE! Use the corresponding macro os_file_write(), not directly +Requests a synchronous write operation. @param[in] type IO flags @param[in] file handle to an open file @param[out] buf buffer from which to write @param[in] offset file offset from the start where to read @param[in] n number of bytes to read, starting from offset @return DB_SUCCESS if request was successful, false if fail */ -static MY_ATTRIBUTE((warn_unused_result)) dberr_t -os_file_write_page( - IORequest& type, - const char* name, - os_file_t file, - const void* buf, - os_offset_t offset, - ulint n) +os_file_write_func( + const IORequest& type, + const char* name, + os_file_t file, + const void* buf, + os_offset_t offset, + ulint n) { dberr_t err; - ut_ad(type.is_write()); ut_ad(type.validate()); ut_ad(n > 0); @@ -5017,13 +5025,15 @@ os_file_write_page( static MY_ATTRIBUTE((warn_unused_result)) ssize_t os_file_pread( - IORequest& type, - os_file_t file, - void* buf, - ulint n, - os_offset_t offset, - dberr_t* err) + const IORequest& type, + os_file_t file, + void* buf, + ulint n, + os_offset_t offset, + dberr_t* err) { + ut_ad(type.is_read()); + ++os_n_file_reads; const bool monitor = MONITOR_IS_ON(MONITOR_OS_PENDING_READS); @@ -5047,13 +5057,13 @@ os_file_pread( static MY_ATTRIBUTE((warn_unused_result)) dberr_t os_file_read_page( - IORequest& type, - os_file_t file, - void* buf, - os_offset_t offset, - ulint n, - ulint* o, - bool exit_on_err) + const IORequest& type, + os_file_t file, + void* buf, + os_offset_t offset, + ulint n, + ulint* o, + bool exit_on_err) { dberr_t err; @@ -5421,14 +5431,12 @@ Requests a synchronous positioned read operation. @return DB_SUCCESS or error code */ dberr_t os_file_read_func( - IORequest& type, - os_file_t file, - void* buf, - os_offset_t offset, - ulint n) + const IORequest& type, + os_file_t file, + void* buf, + os_offset_t offset, + ulint n) { - ut_ad(type.is_read()); - return(os_file_read_page(type, file, buf, offset, n, NULL, true)); } @@ -5445,43 +5453,16 @@ Requests a synchronous positioned read operation. @return DB_SUCCESS or error code */ dberr_t os_file_read_no_error_handling_func( - IORequest& type, - os_file_t file, - void* buf, - os_offset_t offset, - ulint n, - ulint* o) + const IORequest& type, + os_file_t file, + void* buf, + os_offset_t offset, + ulint n, + ulint* o) { - ut_ad(type.is_read()); - return(os_file_read_page(type, file, buf, offset, n, o, false)); } -/** NOTE! Use the corresponding macro os_file_write(), not directly -Requests a synchronous write operation. -@param[in] type IO flags -@param[in] file handle to an open file -@param[out] buf buffer from which to write -@param[in] offset file offset from the start where to read -@param[in] n number of bytes to read, starting from offset -@return DB_SUCCESS if request was successful, false if fail */ -dberr_t -os_file_write_func( - IORequest& type, - const char* name, - os_file_t file, - const void* buf, - os_offset_t offset, - ulint n) -{ - ut_ad(type.validate()); - ut_ad(type.is_write()); - - const byte* ptr = reinterpret_cast(buf); - - return(os_file_write_page(type, name, file, ptr, offset, n)); -} - /** Check the existence and type of the given file. @param[in] path path name of file @param[out] exists true if the file exists @@ -5778,7 +5759,7 @@ AIO::init_linux_native_aio() } io_context** ctx = m_aio_ctx; - unsigned max_events = slots_per_segment(); + ulint max_events = slots_per_segment(); for (ulint i = 0; i < m_n_segments; ++i, ++ctx) { @@ -6146,7 +6127,7 @@ AIO::get_segment_no_from_slot( /** Requests for a slot in the aio array. If no slot is available, waits until not_full-event becomes signaled. -@param[in,out] type IO context +@param[in] type IO context @param[in,out] m1 message to be passed along with the AIO operation @param[in,out] m2 message to be passed along with the AIO @@ -6160,14 +6141,14 @@ not_full-event becomes signaled. @return pointer to slot */ Slot* AIO::reserve_slot( - IORequest& type, - fil_node_t* m1, - void* m2, - os_file_t file, - const char* name, - void* buf, - os_offset_t offset, - ulint len) + const IORequest& type, + fil_node_t* m1, + void* m2, + pfs_os_file_t file, + const char* name, + void* buf, + os_offset_t offset, + ulint len) { #ifdef WIN_ASYNC_IO ut_a((len & 0xFFFFFFFFUL) == len); @@ -6378,7 +6359,7 @@ os_aio_simulated_wake_handler_threads() } /** Select the IO slot array -@param[in] type Type of IO, READ or WRITE +@param[in,out] type Type of IO, READ or WRITE @param[in] read_only true if running in read-only mode @param[in] mode IO mode @return slot array or NULL if invalid mode specified */ @@ -6555,10 +6536,11 @@ os_aio_windows_handler( /* This read/write does not go through os_file_read and os_file_write APIs, need to register with performance schema explicitly here. */ + PSI_file_locker_state state; struct PSI_file_locker* locker = NULL; register_pfs_file_io_begin( - locker, slot->file, slot->len, + &state, locker, slot->file, slot->len, slot->type.is_write() ? PSI_FILE_WRITE : PSI_FILE_READ, __FILE__, __LINE__); #endif /* UNIV_PFS_IO */ @@ -6594,7 +6576,7 @@ os_aio_windows_handler( /** NOTE! Use the corresponding macro os_aio(), not directly this function! Requests an asynchronous i/o operation. -@param[in] type IO request context +@param[in,out] type IO request context @param[in] mode IO mode @param[in] name Name of the file or path as NUL terminated string @@ -6616,7 +6598,7 @@ os_aio_func( IORequest& type, ulint mode, const char* name, - os_file_t file, + pfs_os_file_t file, void* buf, os_offset_t offset, ulint n, @@ -6672,7 +6654,6 @@ try_again: ret = ReadFile( file, slot->ptr, slot->len, &slot->n_bytes, &slot->control); - #elif defined(LINUX_NATIVE_AIO) if (!array->linux_dispatch(slot)) { goto err_exit; @@ -6691,7 +6672,6 @@ try_again: ret = WriteFile( file, slot->ptr, slot->len, &slot->n_bytes, &slot->control); - #elif defined(LINUX_NATIVE_AIO) if (!array->linux_dispatch(slot)) { goto err_exit; @@ -7551,7 +7531,7 @@ AIO::to_file(FILE* file) const fprintf(file, "%s IO for %s (offset=" UINT64PF - ", size=%lu)\n", + ", size=" ULINTPF ")\n", slot.type.is_read() ? "read" : "write", slot.name, slot.offset, slot.len); } diff --git a/storage/innobase/os/os0proc.cc b/storage/innobase/os/os0proc.cc index 9309c1f2c97..22966690ab0 100644 --- a/storage/innobase/os/os0proc.cc +++ b/storage/innobase/os/os0proc.cc @@ -182,7 +182,7 @@ os_mem_free_large( << ") failed; Windows error " << GetLastError(); } else { my_atomic_addlint( - &os_total_large_mem_allocated, -size); + &os_total_large_mem_allocated, -lint(size)); UNIV_MEM_FREE(ptr, size); } #elif !defined OS_MAP_ANON diff --git a/storage/innobase/os/os0thread.cc b/storage/innobase/os/os0thread.cc index 72199b4cf0b..3986c4f4c44 100644 --- a/storage/innobase/os/os0thread.cc +++ b/storage/innobase/os/os0thread.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -31,14 +32,9 @@ Created 9/8/1995 Heikki Tuuri #include "os0event.h" #include -/** Mutex that tracks the thread count. Used by innorwlocktest.cc -FIXME: the unit tests should use APIs */ -SysMutex thread_mutex; - /** Number of threads active. */ ulint os_thread_count; - /***************************************************************//** Compares two thread ids for equality. @return TRUE if equal */ @@ -127,11 +123,7 @@ os_thread_create_func( CloseHandle(handle); - mutex_enter(&thread_mutex); - - os_thread_count++; - - mutex_exit(&thread_mutex); + my_atomic_addlint(&os_thread_count, 1); return((os_thread_t)new_thread_id); #else /* _WIN32 else */ @@ -140,9 +132,7 @@ os_thread_create_func( pthread_attr_init(&attr); - mutex_enter(&thread_mutex); - ++os_thread_count; - mutex_exit(&thread_mutex); + my_atomic_addlint(&os_thread_count, 1); int ret = pthread_create(&new_thread_id, &attr, func, arg); @@ -184,9 +174,9 @@ os_thread_join( /** Exits the current thread. @param[in] detach if true, the thread will be detached right before exiting. If false, another thread is responsible for joining this thread */ +ATTRIBUTE_NORETURN void -os_thread_exit( - bool detach) +os_thread_exit(bool detach) { #ifdef UNIV_DEBUG_THREAD_CREATION ib::info() << "Thread exits, id " @@ -197,16 +187,11 @@ os_thread_exit( pfs_delete_thread(); #endif - mutex_enter(&thread_mutex); - - os_thread_count--; + my_atomic_addlint(&os_thread_count, -1); #ifdef _WIN32 - mutex_exit(&thread_mutex); - ExitThread(0); #else - mutex_exit(&thread_mutex); if (detach) { pthread_detach(pthread_self()); } @@ -252,50 +237,3 @@ os_thread_sleep( select(0, NULL, NULL, NULL, &t); #endif /* _WIN32 */ } - -/*****************************************************************//** -Check if there are threads active. -@return true if the thread count > 0. */ -bool -os_thread_active() -/*==============*/ -{ - mutex_enter(&thread_mutex); - - bool active = (os_thread_count > 0); - - /* All the threads have exited or are just exiting; - NOTE that the threads may not have completed their - exit yet. Should we use pthread_join() to make sure - they have exited? If we did, we would have to - remove the pthread_detach() from - os_thread_exit(). Now we just sleep 0.1 - seconds and hope that is enough! */ - - mutex_exit(&thread_mutex); - - return(active); -} - -/** -Initializes OS thread management data structures. */ -void -os_thread_init() -/*============*/ -{ - mutex_create(LATCH_ID_THREAD_MUTEX, &thread_mutex); -} - -/** -Frees OS thread management data structures. */ -void -os_thread_free() -/*============*/ -{ - if (os_thread_count != 0) { - ib::warn() << "Some (" << os_thread_count << ") threads are" - " still active"; - } - - mutex_destroy(&thread_mutex); -} diff --git a/storage/innobase/page/page0cur.cc b/storage/innobase/page/page0cur.cc index df7d26c63e8..e5c903935f1 100644 --- a/storage/innobase/page/page0cur.cc +++ b/storage/innobase/page/page0cur.cc @@ -2060,14 +2060,10 @@ page_copy_rec_list_end_to_created_page( /* Individual inserts are logged in a shorter form */ - mtr_log_t log_mode; - - if (dict_table_is_temporary(index->table) - || index->table->ibd_file_missing /* IMPORT TABLESPACE */) { - log_mode = mtr_get_log_mode(mtr); - } else { - log_mode = mtr_set_log_mode(mtr, MTR_LOG_SHORT_INSERTS); - } + const mtr_log_t log_mode = dict_table_is_temporary(index->table) + || !index->is_readable() /* IMPORT TABLESPACE */ + ? mtr_get_log_mode(mtr) + : mtr_set_log_mode(mtr, MTR_LOG_SHORT_INSERTS); prev_rec = page_get_infimum_rec(new_page); if (page_is_comp(new_page)) { diff --git a/storage/innobase/page/page0page.cc b/storage/innobase/page/page0page.cc index 3765f8112a1..b2c27acfbaa 100644 --- a/storage/innobase/page/page0page.cc +++ b/storage/innobase/page/page0page.cc @@ -2117,7 +2117,7 @@ page_simple_validate_old( goto func_exit; } - if (UNIV_UNLIKELY(page_header_get_field(page, PAGE_N_RECS) + if (UNIV_UNLIKELY(ulint(page_header_get_field(page, PAGE_N_RECS)) + PAGE_HEAP_NO_USER_LOW != count + 1)) { ib::error() << "n recs wrong " @@ -2308,7 +2308,7 @@ page_simple_validate_new( goto func_exit; } - if (UNIV_UNLIKELY(page_header_get_field(page, PAGE_N_RECS) + if (UNIV_UNLIKELY(ulint(page_header_get_field(page, PAGE_N_RECS)) + PAGE_HEAP_NO_USER_LOW != count + 1)) { ib::error() << "n recs wrong " @@ -2615,7 +2615,7 @@ n_owned_zero: goto func_exit; } - if (UNIV_UNLIKELY(page_header_get_field(page, PAGE_N_RECS) + if (UNIV_UNLIKELY(ulint(page_header_get_field(page, PAGE_N_RECS)) + PAGE_HEAP_NO_USER_LOW != count + 1)) { ib::error() << "n recs wrong " diff --git a/storage/innobase/page/page0zip.cc b/storage/innobase/page/page0zip.cc index e718081ed63..b6e0409459b 100644 --- a/storage/innobase/page/page0zip.cc +++ b/storage/innobase/page/page0zip.cc @@ -66,12 +66,12 @@ page_zip_stat_t page_zip_stat[PAGE_ZIP_SSIZE_MAX]; /** Statistics on compression, indexed by index->id */ page_zip_stat_per_index_t page_zip_stat_per_index; -/* Compression level to be used by zlib. Settable by user. */ -uint page_zip_level = DEFAULT_COMPRESSION_LEVEL; +/** Compression level to be used by zlib. Settable by user. */ +uint page_zip_level; -/* Whether or not to log compressed page images to avoid possible +/** Whether or not to log compressed page images to avoid possible compression algorithm changes in zlib. */ -my_bool page_zip_log_pages = true; +my_bool page_zip_log_pages; /* Please refer to ../include/page0zip.ic for a description of the compressed page format. */ @@ -3711,6 +3711,10 @@ page_zip_write_rec( ut_a(slot); /* Copy the delete mark. */ if (rec_get_deleted_flag(rec, TRUE)) { + /* In delete-marked records, DB_TRX_ID must + always refer to an existing undo log record. */ + ut_ad(!dict_index_is_clust(index) + || row_get_rec_trx_id(rec, index, offsets)); *slot |= PAGE_ZIP_DIR_SLOT_DEL >> 8; } else { *slot &= ~(PAGE_ZIP_DIR_SLOT_DEL >> 8); @@ -4634,6 +4638,7 @@ page_zip_write_header_log( #if PAGE_DATA > 255 # error "PAGE_DATA > 255" #endif + ut_ad(length > 0); ut_ad(length < 256); /* If no logging is requested, we may return now */ @@ -4975,24 +4980,19 @@ page_zip_verify_checksum( const void* data, /*!< in: compressed page */ ulint size) /*!< in: size of compressed page */ { - const unsigned char* p = static_cast(data) - + FIL_PAGE_SPACE_OR_CHKSUM; + ib_uint32_t stored; + ib_uint32_t calc; - const uint32_t stored = static_cast( - mach_read_from_4(p)); + stored = static_cast(mach_read_from_4( + static_cast(data) + FIL_PAGE_SPACE_OR_CHKSUM)); -#ifdef UNIV_INNOCHECKSUM - p = static_cast(data) + FIL_PAGE_TYPE; - bool no_checksum = (mach_read_from_2(p) == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED); - p = static_cast(data) + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION; - bool encrypted = (mach_read_from_4(p) != 0); - p = static_cast(data) + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION + 4; - const uint32_t checksum = static_cast(mach_read_from_4(p)); - - if (no_checksum) { - return (TRUE); - } -#endif + ulint page_no MY_ATTRIBUTE((unused)) = + mach_read_from_4(static_cast + (data) + FIL_PAGE_OFFSET); + ulint space_id MY_ATTRIBUTE((unused)) = + mach_read_from_4(static_cast + (data) + FIL_PAGE_SPACE_ID); + const page_id_t page_id(space_id, page_no); #if FIL_PAGE_LSN % 8 #error "FIL_PAGE_LSN must be 64 bit aligned" @@ -5012,7 +5012,7 @@ page_zip_verify_checksum( } if (i >= size) { if (log_file) { - fprintf(log_file, "Page::%lu is empty and" + fprintf(log_file, "Page::%llu is empty and" " uncorrupted\n", cur_page_num); } @@ -5036,21 +5036,12 @@ page_zip_verify_checksum( return(TRUE); } -#ifndef UNIV_INNOCHECKSUM - ulint page_no = mach_read_from_4(static_cast< - const unsigned char*> - (data) + FIL_PAGE_OFFSET); - ulint space_id = mach_read_from_4(static_cast< - const unsigned char*> - (data) + FIL_PAGE_SPACE_ID); - const page_id_t page_id(space_id, page_no); -#endif /* UNIV_INNOCHECKSUM */ - - const uint32_t calc = page_zip_calc_checksum(data, size, curr_algo); + calc = static_cast(page_zip_calc_checksum( + data, size, curr_algo)); #ifdef UNIV_INNOCHECKSUM if (log_file) { - fprintf(log_file, "page::%lu;" + fprintf(log_file, "page::%llu;" " %s checksum: calculated = %u;" " recorded = %u\n", cur_page_num, buf_checksum_algorithm_name( @@ -5065,21 +5056,17 @@ page_zip_verify_checksum( data, size, SRV_CHECKSUM_ALGORITHM_CRC32); if (log_file) { - fprintf(log_file, "page::%lu: crc32 checksum:" + fprintf(log_file, "page::%llu: crc32 checksum:" " calculated = %u; recorded = %u\n", cur_page_num, crc32, stored); - fprintf(log_file, "page::%lu: none checksum:" + fprintf(log_file, "page::%llu: none checksum:" " calculated = %lu; recorded = %u\n", cur_page_num, BUF_NO_CHECKSUM_MAGIC, stored); } } #endif /* UNIV_INNOCHECKSUM */ - if (stored == calc -#ifdef UNIV_INNOCHECKSUM - || ( encrypted == true && stored == checksum) -#endif - ) { + if (stored == calc) { return(TRUE); } @@ -5111,11 +5098,7 @@ page_zip_verify_checksum( if (legacy_big_endian_checksum) { const uint32_t calculated = page_zip_calc_checksum(data, size, curr_algo, true); - if (stored == calculated -#ifdef UNIV_INNOCHECKSUM - || ( encrypted == true && calculated == checksum) -#endif - ) { + if (stored == calculated) { return(TRUE); } @@ -5125,11 +5108,7 @@ page_zip_verify_checksum( uint32_t calculated = page_zip_calc_checksum(data, size, SRV_CHECKSUM_ALGORITHM_INNODB); - if (stored == calculated -#ifdef UNIV_INNOCHECKSUM - || ( encrypted == true && stored == checksum) -#endif - ) { + if (stored == calculated) { #ifndef UNIV_INNOCHECKSUM if (curr_algo @@ -5149,11 +5128,7 @@ page_zip_verify_checksum( /* If legacy checksum is not checked, do it now. */ if ((legacy_checksum_checked - && stored == calculated) -#ifdef UNIV_INNOCHECKSUM - || ( encrypted == true && calculated == checksum) -#endif - ) { + && stored == calculated)) { legacy_big_endian_checksum = true; return(TRUE); } @@ -5163,11 +5138,7 @@ page_zip_verify_checksum( case SRV_CHECKSUM_ALGORITHM_STRICT_INNODB: case SRV_CHECKSUM_ALGORITHM_INNODB: { - if (stored == BUF_NO_CHECKSUM_MAGIC -#ifdef UNIV_INNOCHECKSUM - || ( encrypted == true && checksum == BUF_NO_CHECKSUM_MAGIC) -#endif - ) { + if (stored == BUF_NO_CHECKSUM_MAGIC) { #ifndef UNIV_INNOCHECKSUM if (curr_algo == SRV_CHECKSUM_ALGORITHM_STRICT_INNODB) { @@ -5186,14 +5157,8 @@ page_zip_verify_checksum( uint32_t calculated1; if (stored == calculated -#ifdef UNIV_INNOCHECKSUM - || ( encrypted == true && checksum == calculated) -#endif - || stored == (calculated1 = + || stored == (calculated1 = page_zip_calc_checksum(data, size, SRV_CHECKSUM_ALGORITHM_CRC32, true)) -#ifdef UNIV_INNOCHECKSUM - || ( encrypted == true && checksum == calculated1) -#endif ) { #ifndef UNIV_INNOCHECKSUM if (curr_algo @@ -5217,12 +5182,7 @@ page_zip_verify_checksum( data, size, SRV_CHECKSUM_ALGORITHM_CRC32, true); if (stored == calculated - || stored == calculated1 -#ifdef UNIV_INNOCHECKSUM - || ( encrypted == true && checksum == calculated) - || ( encrypted == true && checksum == calculated1) -#endif - ) { + || stored == calculated1) { #ifndef UNIV_INNOCHECKSUM page_warn_strict_checksum( curr_algo, @@ -5235,11 +5195,7 @@ page_zip_verify_checksum( calculated = page_zip_calc_checksum( data, size, SRV_CHECKSUM_ALGORITHM_INNODB); - if (stored == calculated -#ifdef UNIV_INNOCHECKSUM - || ( encrypted == true && checksum == calculated) -#endif - ) { + if (stored == calculated) { #ifndef UNIV_INNOCHECKSUM page_warn_strict_checksum( diff --git a/storage/innobase/que/que0que.cc b/storage/innobase/que/que0que.cc index 1aebef93ce5..5f9f57dc08a 100644 --- a/storage/innobase/que/que0que.cc +++ b/storage/innobase/que/que0que.cc @@ -417,7 +417,8 @@ que_graph_free_recursive( } DBUG_PRINT("que_graph_free_recursive", - ("node: %p, type: %lu", node, que_node_get_type(node))); + ("node: %p, type: " ULINTPF, node, + que_node_get_type(node))); switch (que_node_get_type(node)) { diff --git a/storage/innobase/rem/rem0cmp.cc b/storage/innobase/rem/rem0cmp.cc index b14d9c77ad1..7c965f791be 100644 --- a/storage/innobase/rem/rem0cmp.cc +++ b/storage/innobase/rem/rem0cmp.cc @@ -158,7 +158,7 @@ TODO: Remove this function. Everything should use MYSQL_TYPE_NEWDECIMAL. @param[in] b_length length of b, in bytes (not UNIV_SQL_NULL) @return positive, 0, negative, if a is greater, equal, less than b, respectively */ -static UNIV_COLD +static ATTRIBUTE_COLD int cmp_decimal( const byte* a, @@ -378,8 +378,6 @@ cmp_whole_field( case DATA_MYSQL: return(innobase_mysql_cmp(prtype, a, a_length, b, b_length)); - case DATA_POINT: - case DATA_VAR_POINT: case DATA_GEOMETRY: return(cmp_geometry_field(mtype, prtype, a, a_length, b, b_length)); @@ -437,11 +435,6 @@ cmp_data( case DATA_SYS: pad = ULINT_UNDEFINED; break; - case DATA_POINT: - case DATA_VAR_POINT: - /* Since DATA_POINT has a fixed length of DATA_POINT_LEN, - currently, pad is not needed. Meanwhile, DATA_VAR_POINT acts - the same as DATA_GEOMETRY */ case DATA_GEOMETRY: ut_ad(prtype & DATA_BINARY_TYPE); pad = ULINT_UNDEFINED; diff --git a/storage/innobase/rem/rem0rec.cc b/storage/innobase/rem/rem0rec.cc index 26bb12e8a03..66e8ccec178 100644 --- a/storage/innobase/rem/rem0rec.cc +++ b/storage/innobase/rem/rem0rec.cc @@ -308,7 +308,6 @@ rec_init_offsets_comp_ordinary( if (!field->fixed_len || (temp && !dict_col_get_fixed_size(col, temp))) { - ut_ad(col->mtype != DATA_POINT); /* Variable-length field: read the length */ len = *lens--; /* If the maximum length of the field is up @@ -445,9 +444,6 @@ rec_init_offsets( if (UNIV_UNLIKELY(!field->fixed_len)) { const dict_col_t* col = dict_field_get_col(field); - /* DATA_POINT should always be a fixed - length column. */ - ut_ad(col->mtype != DATA_POINT); /* Variable-length field: read the length */ len = *lens--; /* If the maximum length of the field @@ -790,8 +786,6 @@ rec_get_converted_size_comp_prefix_low( it does not */ const dfield_t* fields, /*!< in: array of data fields */ ulint n_fields,/*!< in: number of data fields */ - const dtuple_t* v_entry,/*!< in: dtuple contains virtual column - data */ ulint* extra, /*!< out: extra size */ bool temp) /*!< in: whether this is a temporary file record */ @@ -799,20 +793,15 @@ rec_get_converted_size_comp_prefix_low( ulint extra_size; ulint data_size; ulint i; - ulint n_null = (n_fields > 0) ? index->n_nullable : 0; - ulint n_v_fields; + ut_ad(n_fields > 0); ut_ad(n_fields <= dict_index_get_n_fields(index)); ut_ad(!temp || extra); - /* At the time being, only temp file record could possible - store virtual columns */ - ut_ad(!v_entry || (dict_index_is_clust(index) && temp)); - n_v_fields = v_entry ? dtuple_get_n_v_fields(v_entry) : 0; + ut_d(ulint n_null = index->n_nullable); extra_size = temp - ? UT_BITS_IN_BYTES(n_null) - : REC_N_NEW_EXTRA_BYTES - + UT_BITS_IN_BYTES(n_null); + ? UT_BITS_IN_BYTES(index->n_nullable) + : REC_N_NEW_EXTRA_BYTES + UT_BITS_IN_BYTES(index->n_nullable); data_size = 0; if (temp && dict_table_is_comp(index->table)) { @@ -858,8 +847,6 @@ rec_get_converted_size_comp_prefix_low( } ut_ad(len <= col->len || DATA_LARGE_MTYPE(col->mtype) - || (DATA_POINT_MTYPE(col->mtype) - && len == DATA_MBR_LEN) || (col->len == 0 && col->mtype == DATA_VARCHAR)); fixed_len = field->fixed_len; @@ -916,42 +903,50 @@ rec_get_converted_size_comp_prefix_low( *extra = extra_size; } - /* Log virtual columns */ - if (n_v_fields != 0) { - /* length marker */ - data_size += 2; + return(extra_size + data_size); +} - for (i = 0; i < n_v_fields; i++) { - dfield_t* vfield; - ulint flen; +/** Determine the converted size of virtual column data in a temporary file. +@see rec_convert_dtuple_to_temp_v() +@param[in] index clustered index +@param[in] v clustered index record augmented with the values + of virtual columns +@return size in bytes */ +ulint +rec_get_converted_size_temp_v(const dict_index_t* index, const dtuple_t* v) +{ + ut_ad(dict_index_is_clust(index)); - const dict_v_col_t* col - = dict_table_get_nth_v_col(index->table, i); + /* length marker */ + ulint data_size = 2; + const ulint n_v_fields = dtuple_get_n_v_fields(v); - /* Only those indexed needs to be logged */ - if (col->m_col.ord_part) { - data_size += mach_get_compressed_size( - i + REC_MAX_N_FIELDS); - vfield = dtuple_get_nth_v_field( - v_entry, col->v_pos); + for (ulint i = 0; i < n_v_fields; i++) { + const dict_v_col_t* col + = dict_table_get_nth_v_col(index->table, i); - flen = vfield->len; - - if (flen != UNIV_SQL_NULL) { - flen = ut_min( - flen, - static_cast( - DICT_MAX_FIELD_LEN_BY_FORMAT( - index->table))); - data_size += flen; - } - - data_size += mach_get_compressed_size(flen); - } + /* Only those indexed needs to be logged */ + if (!col->m_col.ord_part) { + continue; } + + data_size += mach_get_compressed_size(i + REC_MAX_N_FIELDS); + const dfield_t* vfield = dtuple_get_nth_v_field(v, col->v_pos); + ulint flen = vfield->len; + + if (flen != UNIV_SQL_NULL) { + flen = ut_min( + flen, + static_cast( + DICT_MAX_FIELD_LEN_BY_FORMAT( + index->table))); + data_size += flen; + } + + data_size += mach_get_compressed_size(flen); } - return(extra_size + data_size); + return(data_size); } /**********************************************************//** @@ -967,7 +962,7 @@ rec_get_converted_size_comp_prefix( { ut_ad(dict_table_is_comp(index->table)); return(rec_get_converted_size_comp_prefix_low( - index, fields, n_fields, NULL, extra, false)); + index, fields, n_fields, extra, false)); } /**********************************************************//** @@ -1013,7 +1008,7 @@ rec_get_converted_size_comp( } return(size + rec_get_converted_size_comp_prefix_low( - index, fields, n_fields, NULL, extra, false)); + index, fields, n_fields, extra, false)); } /***********************************************************//** @@ -1196,8 +1191,6 @@ rec_convert_dtuple_to_rec_comp( const dict_index_t* index, /*!< in: record descriptor */ const dfield_t* fields, /*!< in: array of data fields */ ulint n_fields,/*!< in: number of data fields */ - const dtuple_t* v_entry,/*!< in: dtuple contains - virtual column data */ ulint status, /*!< in: status bits of the record */ bool temp) /*!< in: whether to use the format for temporary files in @@ -1213,10 +1206,11 @@ rec_convert_dtuple_to_rec_comp( ulint n_node_ptr_field; ulint fixed_len; ulint null_mask = 1; - ulint n_null; - ulint num_v = v_entry ? dtuple_get_n_v_fields(v_entry) : 0; + ut_ad(n_fields > 0); ut_ad(temp || dict_table_is_comp(index->table)); + ulint n_null = index->n_nullable; + const ulint n_null_bytes = UT_BITS_IN_BYTES(n_null); if (temp) { ut_ad(status == REC_STATUS_ORDINARY); @@ -1229,8 +1223,6 @@ rec_convert_dtuple_to_rec_comp( temp = false; } } else { - ut_ad(v_entry == NULL); - ut_ad(num_v == 0); nulls = rec - (REC_N_NEW_EXTRA_BYTES + 1); switch (UNIV_EXPECT(status, REC_STATUS_ORDINARY)) { @@ -1256,13 +1248,9 @@ rec_convert_dtuple_to_rec_comp( } end = rec; - - if (n_fields != 0) { - n_null = index->n_nullable; - lens = nulls - UT_BITS_IN_BYTES(n_null); - /* clear the SQL-null flags */ - memset(lens + 1, 0, nulls - lens); - } + /* clear the SQL-null flags */ + lens = nulls - n_null_bytes; + memset(lens + 1, 0, nulls - lens); /* Store the data and the offsets */ @@ -1337,8 +1325,6 @@ rec_convert_dtuple_to_rec_comp( *lens-- = (byte) (len >> 8) | 0xc0; *lens-- = (byte) len; } else { - /* DATA_POINT would have a fixed_len */ - ut_ad(dtype_get_mtype(type) != DATA_POINT); ut_ad(len <= dtype_get_len(type) || DATA_LARGE_MTYPE(dtype_get_mtype(type)) || !strcmp(index->name, @@ -1354,16 +1340,30 @@ rec_convert_dtuple_to_rec_comp( } } - memcpy(end, dfield_get_data(field), len); - end += len; + if (len) { + memcpy(end, dfield_get_data(field), len); + end += len; + } } +} - if (!num_v) { - return; - } +/** Write indexed virtual column data into a temporary file. +@see rec_get_converted_size_temp_v() +@param[out] rec serialized record +@param[in] index clustered index +@param[in] v_entry clustered index record augmented with the values + of virtual columns */ +void +rec_convert_dtuple_to_temp_v( + byte* rec, + const dict_index_t* index, + const dtuple_t* v_entry) +{ + ut_ad(dict_index_is_clust(index)); + const ulint num_v = dtuple_get_n_v_fields(v_entry); /* reserve 2 bytes for writing length */ - byte* ptr = end; + byte* ptr = rec; ptr += 2; /* Now log information on indexed virtual columns */ @@ -1406,7 +1406,7 @@ rec_convert_dtuple_to_rec_comp( } } - mach_write_to_2(end, ptr - end); + mach_write_to_2(rec, ptr - rec); } /*********************************************************//** @@ -1432,8 +1432,7 @@ rec_convert_dtuple_to_rec_new( rec = buf + extra_size; rec_convert_dtuple_to_rec_comp( - rec, index, dtuple->fields, dtuple->n_fields, NULL, - status, false); + rec, index, dtuple->fields, dtuple->n_fields, status, false); /* Set the info bits of the record */ rec_set_info_and_status_bits(rec, dtuple_get_info_bits(dtuple)); @@ -1496,21 +1495,21 @@ rec_convert_dtuple_to_rec( return(rec); } -/**********************************************************//** -Determines the size of a data tuple prefix in ROW_FORMAT=COMPACT. -@return total size */ +/** Determine the size of a data tuple prefix in a temporary file. +@param[in] index clustered or secondary index +@param[in] fields data fields +@param[in] n_fields number of data fields +@param[out] extra record header size +@return total size, in bytes */ ulint rec_get_converted_size_temp( -/*========================*/ - const dict_index_t* index, /*!< in: record descriptor */ - const dfield_t* fields, /*!< in: array of data fields */ - ulint n_fields,/*!< in: number of data fields */ - const dtuple_t* v_entry,/*!< in: dtuple contains virtual column - data */ - ulint* extra) /*!< out: extra size */ + const dict_index_t* index, + const dfield_t* fields, + ulint n_fields, + ulint* extra) { return(rec_get_converted_size_comp_prefix_low( - index, fields, n_fields, v_entry, extra, true)); + index, fields, n_fields, extra, true)); } /******************************************************//** @@ -1536,11 +1535,9 @@ rec_convert_dtuple_to_temp( rec_t* rec, /*!< out: record */ const dict_index_t* index, /*!< in: record descriptor */ const dfield_t* fields, /*!< in: array of data fields */ - ulint n_fields, /*!< in: number of fields */ - const dtuple_t* v_entry) /*!< in: dtuple contains - virtual column data */ + ulint n_fields) /*!< in: number of fields */ { - rec_convert_dtuple_to_rec_comp(rec, index, fields, n_fields, v_entry, + rec_convert_dtuple_to_rec_comp(rec, index, fields, n_fields, REC_STATUS_ORDINARY, true); } @@ -2102,8 +2099,6 @@ rec_print_mbr_rec( rec_validate(rec, offsets); } -/***************************************************************//** -Prints a physical record. */ /***************************************************************//** Prints a physical record. */ void @@ -2252,14 +2247,14 @@ operator<<(std::ostream& o, const rec_offsets_print& r) } #ifdef UNIV_DEBUG -/************************************************************//** -Reads the DB_TRX_ID of a clustered index record. +/** Read the DB_TRX_ID of a clustered index record. +@param[in] rec clustered index record +@param[in] index clustered index @return the value of DB_TRX_ID */ trx_id_t rec_get_trx_id( -/*===========*/ - const rec_t* rec, /*!< in: record */ - const dict_index_t* index) /*!< in: clustered index */ + const rec_t* rec, + const dict_index_t* index) { const page_t* page = page_align(rec); @@ -2268,10 +2263,11 @@ rec_get_trx_id( const byte* trx_id; ulint len; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + ulint offsets_[REC_OFFS_HEADER_SIZE + MAX_REF_PARTS + 2]; rec_offs_init(offsets_); + ulint* offsets = offsets_; + ut_ad(trx_id_col <= MAX_REF_PARTS); ut_ad(fil_page_index_page_check(page)); ut_ad(mach_read_from_8(page + PAGE_HEADER + PAGE_INDEX_ID) == index->id); @@ -2285,7 +2281,7 @@ rec_get_trx_id( ut_ad(len == DATA_TRX_ID_LEN); - if (heap) { + if (UNIV_LIKELY_NULL(heap)) { mem_heap_free(heap); } diff --git a/storage/innobase/row/row0ftsort.cc b/storage/innobase/row/row0ftsort.cc index fca6ae5a1bf..dad00c58827 100644 --- a/storage/innobase/row/row0ftsort.cc +++ b/storage/innobase/row/row0ftsort.cc @@ -35,6 +35,7 @@ Created 10/13/2010 Jimmy Yang #include "btr0cur.h" #include "btr0bulk.h" #include "fts0plugin.h" +#include "log0crypt.h" /** Read the next record to buffer N. @param N index into array of merge info structure */ @@ -43,7 +44,7 @@ Created 10/13/2010 Jimmy Yang b[N] = row_merge_read_rec( \ block[N], buf[N], b[N], index, \ fd[N], &foffs[N], &mrec[N], offsets[N], \ - crypt_data, crypt_block[N], space); \ + crypt_block[N], space); \ if (UNIV_UNLIKELY(!b[N])) { \ if (mrec[N]) { \ goto exit; \ @@ -94,7 +95,6 @@ row_merge_create_fts_sort_index( new_index->n_def = FTS_NUM_FIELDS_SORT; new_index->cached = TRUE; new_index->parser = index->parser; - new_index->is_ngram = index->is_ngram; idx_field = dict_index_get_nth_field(index, 0); charset = fts_index_get_charset(index); @@ -195,7 +195,6 @@ row_fts_psort_info_init( fts_psort_t* merge_info = NULL; ulint block_size; ibool ret = TRUE; - fil_space_crypt_t* crypt_data = NULL; bool encrypted = false; block_size = 3 * srv_sort_buf_size; @@ -226,21 +225,8 @@ row_fts_psort_info_init( common_info->merge_event = os_event_create(0); common_info->opt_doc_id_size = opt_doc_id_size; - /* Theoretically the tablespace can be dropped straight away. - In practice, the DDL completion will wait for this thread to - finish. */ - if (fil_space_t* space = fil_space_acquire(new_table->space)) { - crypt_data = space->crypt_data; - fil_space_release(space); - } - - if (crypt_data && crypt_data->should_encrypt()) { - common_info->crypt_data = crypt_data; + if (log_tmp_is_encrypted()) { encrypted = true; - } else { - /* Not needed */ - common_info->crypt_data = NULL; - crypt_data = NULL; } ut_ad(trx->mysql_thd != NULL); @@ -515,7 +501,6 @@ row_merge_fts_doc_tokenize( ulint data_size[FTS_NUM_AUX_INDEX]; ulint n_tuple[FTS_NUM_AUX_INDEX]; st_mysql_ftparser* parser; - bool is_ngram; t_str.f_n_char = 0; t_ctx->buf_used = 0; @@ -524,13 +509,11 @@ row_merge_fts_doc_tokenize( memset(data_size, 0, FTS_NUM_AUX_INDEX * sizeof(ulint)); parser = sort_buf[0]->index->parser; - is_ngram = sort_buf[0]->index->is_ngram; /* Tokenize the data and add each word string, its corresponding doc id and position to sort buffer */ while (t_ctx->processed_len < doc->text.f_len) { ulint idx = 0; - ib_uint32_t position; ulint cur_len; doc_id_t write_doc_id; row_fts_token_t* fts_token = NULL; @@ -570,7 +553,7 @@ row_merge_fts_doc_tokenize( /* Ignore string whose character number is less than "fts_min_token_size" or more than "fts_max_token_size" */ - if (!fts_check_token(&str, NULL, is_ngram, NULL)) { + if (!fts_check_token(&str, NULL, NULL)) { if (parser != NULL) { UT_LIST_REMOVE(t_ctx->fts_token_list, fts_token); ut_free(fts_token); @@ -589,7 +572,7 @@ row_merge_fts_doc_tokenize( /* if "cached_stopword" is defined, ignore words in the stopword list */ - if (!fts_check_token(&str, t_ctx->cached_stopword, is_ngram, + if (!fts_check_token(&str, t_ctx->cached_stopword, doc->charset)) { if (parser != NULL) { UT_LIST_REMOVE(t_ctx->fts_token_list, fts_token); @@ -682,20 +665,18 @@ row_merge_fts_doc_tokenize( ++field; - /* The third field is the position */ - if (parser != NULL) { - mach_write_to_4( - reinterpret_cast(&position), - (fts_token->position + t_ctx->init_pos)); - } else { - mach_write_to_4( - reinterpret_cast(&position), - (t_ctx->processed_len + inc - str.f_len + t_ctx->init_pos)); + /* The third field is the position. + MySQL 5.7 changed the fulltext parser plugin interface + by adding MYSQL_FTPARSER_BOOLEAN_INFO::position. + Below we assume that the field is always 0. */ + unsigned pos = t_ctx->init_pos; + byte position[4]; + if (parser == NULL) { + pos += t_ctx->processed_len + inc - str.f_len; } - - dfield_set_data(field, &position, sizeof(position)); - len = dfield_get_len(field); - ut_ad(len == sizeof(ib_uint32_t)); + len = 4; + mach_write_to_4(position, pos); + dfield_set_data(field, &position, len); field->type.mtype = DATA_INT; field->type.prtype = DATA_NOT_NULL; @@ -704,11 +685,10 @@ row_merge_fts_doc_tokenize( cur_len += len; dfield_dup(field, buf->heap); - /* Reserve one byte for the end marker of row_merge_block_t - and we have reserved ROW_MERGE_RESERVE_SIZE (= 4) for - encryption key_version in the beginning of the buffer. */ + /* Reserve one byte for the end marker of row_merge_block_t */ if (buf->total_size + data_size[idx] + cur_len - >= (srv_sort_buf_size - 1 - ROW_MERGE_RESERVE_SIZE)) { + >= srv_sort_buf_size - 1) { + buf_full = TRUE; break; } @@ -804,7 +784,6 @@ fts_parallel_tokenization( fts_tokenize_ctx_t t_ctx; ulint retried = 0; dberr_t error = DB_SUCCESS; - fil_space_crypt_t* crypt_data = NULL; ut_ad(psort_info->psort_common->trx->mysql_thd != NULL); @@ -831,7 +810,6 @@ fts_parallel_tokenization( block = psort_info->merge_block; crypt_block = psort_info->crypt_block; - crypt_data = psort_info->psort_common->crypt_data; const page_size_t& page_size = dict_table_page_size(table); @@ -924,7 +902,6 @@ loop: if (!row_merge_write(merge_file[t_ctx.buf_used]->fd, merge_file[t_ctx.buf_used]->offset++, block[t_ctx.buf_used], - crypt_data, crypt_block[t_ctx.buf_used], table->space)) { error = DB_TEMP_FILE_WRITE_FAIL; @@ -1019,7 +996,6 @@ exit: if (!row_merge_write(merge_file[i]->fd, merge_file[i]->offset++, block[i], - crypt_data, crypt_block[i], table->space)) { error = DB_TEMP_FILE_WRITE_FAIL; @@ -1059,7 +1035,7 @@ exit: psort_info->psort_common->dup, merge_file[i], block[i], &tmpfd[i], false, 0.0/* pct_progress */, 0.0/* pct_cost */, - crypt_data, crypt_block[i], table->space); + crypt_block[i], table->space); if (error != DB_SUCCESS) { close(tmpfd[i]); @@ -1601,8 +1577,6 @@ row_fts_merge_insert( ulint start; fts_psort_insert_t ins_ctx; ulint count_diag = 0; - fil_space_crypt_t* crypt_data = NULL; - ulint space=0; fts_table_t fts_table; char aux_table_name[MAX_FULL_NAME_LEN]; dict_table_t* aux_table; @@ -1624,7 +1598,6 @@ row_fts_merge_insert( trx->op_info = "inserting index entries"; ins_ctx.opt_doc_id_size = psort_info[0].psort_common->opt_doc_id_size; - crypt_data = psort_info[0].psort_common->crypt_data; heap = mem_heap_create(500 + sizeof(mrec_buf_t)); @@ -1729,6 +1702,7 @@ row_fts_merge_insert( #ifdef UNIV_DEBUG ins_ctx.aux_index_id = id; #endif + const ulint space = table->space; for (i = 0; i < fts_sort_pll_degree; i++) { if (psort_info[i].merge_file[id]->n_rec == 0) { @@ -1742,7 +1716,6 @@ row_fts_merge_insert( && (!row_merge_read( fd[i], foffs[i], (row_merge_block_t*) block[i], - crypt_data, (row_merge_block_t*) crypt_block[i], space))) { error = DB_CORRUPTION; diff --git a/storage/innobase/row/row0import.cc b/storage/innobase/row/row0import.cc index 01a55d0dc61..45ca1582e49 100644 --- a/storage/innobase/row/row0import.cc +++ b/storage/innobase/row/row0import.cc @@ -527,7 +527,7 @@ AbstractCallback::init( const page_t* page = block->frame; m_space_flags = fsp_header_get_flags(page); - if (!fsp_flags_is_valid(m_space_flags)) { + if (!fsp_flags_is_valid(m_space_flags, true)) { ulint cflags = fsp_flags_convert_from_101(m_space_flags); if (cflags == ULINT_UNDEFINED) { ib::error() << "Invalid FSP_SPACE_FLAGS=" @@ -1926,6 +1926,7 @@ PageConverter::update_page( case FIL_PAGE_TYPE_XDES: err = set_current_xdes( block->page.id.page_no(), get_frame(block)); + /* fall through */ case FIL_PAGE_INODE: case FIL_PAGE_TYPE_TRX_SYS: case FIL_PAGE_IBUF_FREE_LIST: @@ -1959,16 +1960,13 @@ PageConverter::validate( buf_block_t* block) UNIV_NOTHROW { buf_frame_t* page = get_frame(block); - ulint space_id = mach_read_from_4( - page + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID); - fil_space_t* space = fil_space_found_by_id(space_id); /* Check that the page number corresponds to the offset in the file. Flag as corrupt if it doesn't. Disable the check for LSN in buf_page_is_corrupted() */ if (buf_page_is_corrupted( - false, page, get_page_size(), space) + false, page, get_page_size(), NULL) || (page_get_page_no(page) != offset / m_page_size.physical() && page_get_page_no(page) != 0)) { @@ -2101,7 +2099,7 @@ row_import_discard_changes( index->space = FIL_NULL; } - table->ibd_file_missing = TRUE; + table->file_unreadable = true; fil_close_tablespace(trx, table->space); } @@ -3004,21 +3002,19 @@ row_import_read_v1( cfg->m_n_cols = mach_read_from_4(ptr); if (!dict_tf_is_valid(cfg->m_flags)) { + ib_errf(thd, IB_LOG_LEVEL_ERROR, + ER_TABLE_SCHEMA_MISMATCH, + "Invalid table flags: " ULINTPF, cfg->m_flags); return(DB_CORRUPTION); - - } else if ((err = row_import_read_columns(file, thd, cfg)) - != DB_SUCCESS) { - - return(err); - - } else if ((err = row_import_read_indexes(file, thd, cfg)) - != DB_SUCCESS) { - - return(err); } - ut_a(err == DB_SUCCESS); + err = row_import_read_columns(file, thd, cfg); + + if (err == DB_SUCCESS) { + err = row_import_read_indexes(file, thd, cfg); + } + return(err); } @@ -3357,7 +3353,7 @@ row_import_for_mysql( ut_a(table->space); ut_ad(prebuilt->trx); - ut_a(table->ibd_file_missing); + ut_a(!table->is_readable()); ibuf_delete_for_discarded_space(table->space); @@ -3558,7 +3554,7 @@ row_import_for_mysql( err = fil_ibd_open( true, true, FIL_TYPE_IMPORT, table->space, - fsp_flags, table->name.m_name, filepath, table); + fsp_flags, table->name.m_name, filepath); DBUG_EXECUTE_IF("ib_import_open_tablespace_failure", err = DB_TABLESPACE_NOT_FOUND;); @@ -3691,7 +3687,7 @@ row_import_for_mysql( return(row_import_error(prebuilt, trx, err)); } - table->ibd_file_missing = false; + table->file_unreadable = false; table->flags2 &= ~DICT_TF2_DISCARDED; /* Set autoinc value read from .cfg file, if one was specified. diff --git a/storage/innobase/row/row0ins.cc b/storage/innobase/row/row0ins.cc index 5803bc226cd..584fd156016 100644 --- a/storage/innobase/row/row0ins.cc +++ b/storage/innobase/row/row0ins.cc @@ -34,6 +34,7 @@ Created 4/20/1996 Heikki Tuuri #include "btr0btr.h" #include "btr0cur.h" #include "mach0data.h" +#include "ibuf0ibuf.h" #include "que0que.h" #include "row0upd.h" #include "row0sel.h" @@ -346,6 +347,9 @@ row_ins_clust_index_entry_by_modify( ut_ad(rec_get_deleted_flag(rec, dict_table_is_comp(cursor->index->table))); + /* In delete-marked records, DB_TRX_ID must + always refer to an existing undo log record. */ + ut_ad(rec_get_trx_id(rec, cursor->index)); /* Build an update vector containing all the fields to be modified; NOTE that this vector may NOT contain system columns trx_id or @@ -767,9 +771,7 @@ row_ins_foreign_trx_print( ulint n_trx_locks; ulint heap_size; - if (srv_read_only_mode) { - return; - } + ut_ad(!srv_read_only_mode); lock_mutex_enter(); n_rec_locks = lock_number_of_rows_locked(&trx->lock); @@ -1266,6 +1268,9 @@ row_ins_foreign_check_on_constraint( } if (rec_get_deleted_flag(clust_rec, dict_table_is_comp(table))) { + /* In delete-marked records, DB_TRX_ID must + always refer to an existing undo log record. */ + ut_ad(rec_get_trx_id(clust_rec, clust_index)); /* This can happen if there is a circular reference of rows such that cascading delete comes to delete a row already in the process of being delete marked */ @@ -1274,7 +1279,6 @@ row_ins_foreign_check_on_constraint( goto nonstandard_exit_func; } - if (table->fts) { doc_id = fts_get_doc_id_from_rec(table, clust_rec, clust_index, tmp_heap); @@ -1434,11 +1438,11 @@ row_ins_foreign_check_on_constraint( #ifdef WITH_WSREP err = wsrep_append_foreign_key( - thr_get_trx(thr), - foreign, - clust_rec, - clust_index, - FALSE, FALSE); + thr_get_trx(thr), + foreign, + clust_rec, + clust_index, + FALSE, FALSE); if (err != DB_SUCCESS) { fprintf(stderr, "WSREP: foreign key append failed: %d\n", err); @@ -1604,6 +1608,10 @@ row_ins_check_foreign_constraint( rec_offs_init(offsets_); +#ifdef WITH_WSREP + upd_node= NULL; +#endif /* WITH_WSREP */ + ut_ad(rw_lock_own(dict_operation_lock, RW_LOCK_S)); err = DB_SUCCESS; @@ -1656,7 +1664,7 @@ row_ins_check_foreign_constraint( } if (check_table == NULL - || check_table->ibd_file_missing + || !check_table->is_readable() || check_index == NULL) { if (!srv_read_only_mode && check_ref) { @@ -1749,17 +1757,18 @@ row_ins_check_foreign_constraint( cmp = cmp_dtuple_rec(entry, rec, offsets); if (cmp == 0) { - - ulint lock_type; - - lock_type = skip_gap_lock - ? LOCK_REC_NOT_GAP - : LOCK_ORDINARY; - if (rec_get_deleted_flag(rec, rec_offs_comp(offsets))) { + /* In delete-marked records, DB_TRX_ID must + always refer to an existing undo log record. */ + ut_ad(!dict_index_is_clust(check_index) + || row_get_rec_trx_id(rec, check_index, + offsets)); + err = row_ins_set_shared_rec_lock( - lock_type, block, + skip_gap_lock + ? LOCK_REC_NOT_GAP + : LOCK_ORDINARY, block, rec, check_index, offsets, thr); switch (err) { case DB_SUCCESS_LOCKED_REC: @@ -1791,9 +1800,10 @@ row_ins_check_foreign_constraint( err = wsrep_append_foreign_key( thr_get_trx(thr), foreign, - rec, - check_index, - check_ref, TRUE); + rec, + check_index, + check_ref, + (upd_node) ? TRUE : FALSE); #endif /* WITH_WSREP */ goto end_scan; } else if (foreign->type != 0) { @@ -1840,23 +1850,21 @@ row_ins_check_foreign_constraint( } else { ut_a(cmp < 0); - err = DB_SUCCESS; - - if (!skip_gap_lock) { - err = row_ins_set_shared_rec_lock( + err = skip_gap_lock + ? DB_SUCCESS + : row_ins_set_shared_rec_lock( LOCK_GAP, block, rec, check_index, offsets, thr); - } switch (err) { case DB_SUCCESS_LOCKED_REC: + err = DB_SUCCESS; + /* fall through */ case DB_SUCCESS: if (check_ref) { err = DB_NO_REFERENCED_ROW; row_ins_foreign_report_add_err( trx, foreign, rec, entry); - } else { - err = DB_SUCCESS; } default: break; @@ -1904,19 +1912,11 @@ do_possible_lock_wait: thr->lock_state = QUE_THR_LOCK_NOLOCK; - DBUG_PRINT("to_be_dropped", - ("table: %s", check_table->name.m_name)); - if (check_table->to_be_dropped) { - /* The table is being dropped. We shall timeout - this operation */ - err = DB_LOCK_WAIT_TIMEOUT; - - goto exit_func; - } - + err = check_table->to_be_dropped + ? DB_LOCK_WAIT_TIMEOUT + : trx->error_state; } - exit_func: if (heap != NULL) { mem_heap_free(heap); @@ -2277,18 +2277,14 @@ for a clustered index! @retval DB_SUCCESS if no error @retval DB_DUPLICATE_KEY if error, @retval DB_LOCK_WAIT if we have to wait for a lock on a possible duplicate -record -@retval DB_SUCCESS_LOCKED_REC if an exact match of the record was found -in online table rebuild (flags & (BTR_KEEP_SYS_FLAG | BTR_NO_LOCKING_FLAG)) */ +record */ static MY_ATTRIBUTE((nonnull, warn_unused_result)) dberr_t row_ins_duplicate_error_in_clust( -/*=============================*/ ulint flags, /*!< in: undo logging and locking flags */ btr_cur_t* cursor, /*!< in: B-tree cursor */ const dtuple_t* entry, /*!< in: entry to insert */ - que_thr_t* thr, /*!< in: query thread */ - mtr_t* mtr) /*!< in: mtr */ + que_thr_t* thr) /*!< in: query thread */ { dberr_t err; rec_t* rec; @@ -2299,8 +2295,6 @@ row_ins_duplicate_error_in_clust( ulint* offsets = offsets_; rec_offs_init(offsets_); - UT_NOT_USED(mtr); - ut_ad(dict_index_is_clust(cursor->index)); /* NOTE: For unique non-clustered indexes there may be any number @@ -2613,8 +2607,14 @@ row_ins_clust_index_entry_low( /* Note that we use PAGE_CUR_LE as the search mode, because then the function will return in both low_match and up_match of the cursor sensible values */ - btr_pcur_open_low(index, 0, entry, PAGE_CUR_LE, mode, &pcur, + err = btr_pcur_open_low(index, 0, entry, PAGE_CUR_LE, mode, &pcur, __FILE__, __LINE__, auto_inc, &mtr); + if (err != DB_SUCCESS) { + index->table->file_unreadable = true; + mtr.commit(); + goto func_exit; + } + cursor = btr_pcur_get_btr_cur(&pcur); cursor->thr = thr; @@ -2656,7 +2656,7 @@ row_ins_clust_index_entry_low( DB_LOCK_WAIT */ err = row_ins_duplicate_error_in_clust( - flags, cursor, entry, thr, &mtr); + flags, cursor, entry, thr); } if (err != DB_SUCCESS) { @@ -2950,7 +2950,7 @@ row_ins_sec_index_entry_low( " used key_id is not available. " " Can't continue reading table.", index->table->name); - index->table->is_encrypted = true; + index->table->file_unreadable = true; } goto func_exit; } @@ -3267,6 +3267,11 @@ row_ins_sec_index_entry( if (err == DB_FAIL) { mem_heap_empty(heap); + if (index->space == IBUF_SPACE_ID + && !(index->type & (DICT_UNIQUE | DICT_SPATIAL))) { + ibuf_free_excess_pages(); + } + /* Try then pessimistic descent to the B-tree */ log_free_check(); diff --git a/storage/innobase/row/row0log.cc b/storage/innobase/row/row0log.cc index 36ad6cdd3d9..1b3521a557c 100644 --- a/storage/innobase/row/row0log.cc +++ b/storage/innobase/row/row0log.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 2011, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2011, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under @@ -30,6 +30,7 @@ Created 2011-05-26 Marko Makela #include "row0upd.h" #include "row0merge.h" #include "row0ext.h" +#include "log0crypt.h" #include "data0data.h" #include "que0que.h" #include "srv0mon.h" @@ -194,8 +195,14 @@ struct row_log_t { row_log_buf_t tail; /*!< writer context; protected by mutex and index->lock S-latch, or by index->lock X-latch only */ + byte* crypt_tail; /*!< writer context; + temporary buffer used in encryption, + decryption or NULL*/ row_log_buf_t head; /*!< reader context; protected by MDL only; modifiable by row_log_apply_ops() */ + byte* crypt_head; /*!< reader context; + temporary buffer used in encryption, + decryption or NULL */ ulint n_old_col; /*!< number of non-virtual column in old table */ @@ -302,7 +309,7 @@ row_log_online_op( extra_size+1 (and reserve 0 as the end-of-chunk marker). */ size = rec_get_converted_size_temp( - index, tuple->fields, tuple->n_fields, NULL, &extra_size); + index, tuple->fields, tuple->n_fields, &extra_size); ut_ad(size >= extra_size); ut_ad(size <= sizeof log->tail.buf); @@ -350,49 +357,66 @@ row_log_online_op( } rec_convert_dtuple_to_temp( - b + extra_size, index, tuple->fields, tuple->n_fields, NULL); + b + extra_size, index, tuple->fields, tuple->n_fields); b += size; if (mrec_size >= avail_size) { - dberr_t err; - IORequest request(IORequest::WRITE); const os_offset_t byte_offset = (os_offset_t) log->tail.blocks * srv_sort_buf_size; + IORequest request(IORequest::WRITE); + byte* buf = log->tail.block; if (byte_offset + srv_sort_buf_size >= srv_online_max_size) { goto write_failed; } if (mrec_size == avail_size) { - ut_ad(b == &log->tail.block[srv_sort_buf_size]); + ut_ad(b == &buf[srv_sort_buf_size]); } else { ut_ad(b == log->tail.buf + mrec_size); - memcpy(log->tail.block + log->tail.bytes, + memcpy(buf + log->tail.bytes, log->tail.buf, avail_size); } - UNIV_MEM_ASSERT_RW(log->tail.block, srv_sort_buf_size); + UNIV_MEM_ASSERT_RW(buf, srv_sort_buf_size); if (row_log_tmpfile(log) < 0) { log->error = DB_OUT_OF_MEMORY; goto err_exit; } - err = os_file_write( - request, - "(modification log)", - OS_FILE_FROM_FD(log->fd), - log->tail.block, byte_offset, srv_sort_buf_size); + /* If encryption is enabled encrypt buffer before writing it + to file system. */ + if (log_tmp_is_encrypted()) { + if (!log_tmp_block_encrypt( + buf, srv_sort_buf_size, + log->crypt_tail, byte_offset, + index->table->space)) { + log->error = DB_DECRYPTION_FAILED; + goto write_failed; + } + + srv_stats.n_rowlog_blocks_encrypted.inc(); + buf = log->crypt_tail; + } + log->tail.blocks++; - if (err != DB_SUCCESS) { + if (!os_file_write_int_fd( + request, + "(modification log)", + log->fd, + buf, byte_offset, srv_sort_buf_size)) { write_failed: /* We set the flag directly instead of invoking dict_set_corrupted_index_cache_only(index) here, because the index is not "public" yet. */ index->type |= DICT_CORRUPT; } + UNIV_MEM_INVALID(log->tail.block, srv_sort_buf_size); + UNIV_MEM_INVALID(buf, srv_sort_buf_size); + memcpy(log->tail.block, log->tail.buf + avail_size, mrec_size - avail_size); log->tail.bytes = mrec_size - avail_size; @@ -462,52 +486,68 @@ static MY_ATTRIBUTE((nonnull)) void row_log_table_close_func( /*=====================*/ - row_log_t* log, /*!< in/out: online rebuild log */ + dict_index_t* index, /*!< in/out: online rebuilt index */ #ifdef UNIV_DEBUG const byte* b, /*!< in: end of log record */ #endif /* UNIV_DEBUG */ ulint size, /*!< in: size of log record */ ulint avail) /*!< in: available size for log record */ { + row_log_t* log = index->online_log; + ut_ad(mutex_own(&log->mutex)); if (size >= avail) { - dberr_t err; - IORequest request(IORequest::WRITE); const os_offset_t byte_offset = (os_offset_t) log->tail.blocks * srv_sort_buf_size; + IORequest request(IORequest::WRITE); + byte* buf = log->tail.block; if (byte_offset + srv_sort_buf_size >= srv_online_max_size) { goto write_failed; } if (size == avail) { - ut_ad(b == &log->tail.block[srv_sort_buf_size]); + ut_ad(b == &buf[srv_sort_buf_size]); } else { ut_ad(b == log->tail.buf + size); - memcpy(log->tail.block + log->tail.bytes, - log->tail.buf, avail); + memcpy(buf + log->tail.bytes, log->tail.buf, avail); } - UNIV_MEM_ASSERT_RW(log->tail.block, srv_sort_buf_size); + UNIV_MEM_ASSERT_RW(buf, srv_sort_buf_size); if (row_log_tmpfile(log) < 0) { log->error = DB_OUT_OF_MEMORY; goto err_exit; } - err = os_file_write( - request, - "(modification log)", - OS_FILE_FROM_FD(log->fd), - log->tail.block, byte_offset, srv_sort_buf_size); + /* If encryption is enabled encrypt buffer before writing it + to file system. */ + if (log_tmp_is_encrypted()) { + if (!log_tmp_block_encrypt( + log->tail.block, srv_sort_buf_size, + log->crypt_tail, byte_offset, + index->table->space)) { + log->error = DB_DECRYPTION_FAILED; + goto err_exit; + } + + srv_stats.n_rowlog_blocks_encrypted.inc(); + buf = log->crypt_tail; + } + log->tail.blocks++; - if (err != DB_SUCCESS) { + if (!os_file_write_int_fd( + request, + "(modification log)", + log->fd, + buf, byte_offset, srv_sort_buf_size)) { write_failed: log->error = DB_ONLINE_LOG_TOO_BIG; } UNIV_MEM_INVALID(log->tail.block, srv_sort_buf_size); + UNIV_MEM_INVALID(buf, srv_sort_buf_size); memcpy(log->tail.block, log->tail.buf + avail, size - avail); log->tail.bytes = size - avail; } else { @@ -526,11 +566,11 @@ err_exit: } #ifdef UNIV_DEBUG -# define row_log_table_close(log, b, size, avail) \ - row_log_table_close_func(log, b, size, avail) +# define row_log_table_close(index, b, size, avail) \ + row_log_table_close_func(index, b, size, avail) #else /* UNIV_DEBUG */ # define row_log_table_close(log, b, size, avail) \ - row_log_table_close_func(log, size, avail) + row_log_table_close_func(index, size, avail) #endif /* UNIV_DEBUG */ /** Check whether a virtual column is indexed in the new table being @@ -645,7 +685,7 @@ row_log_table_delete( ut_ad(DATA_ROLL_PTR_LEN == dtuple_get_nth_field( old_pk, old_pk->n_fields - 1)->len); old_pk_size = rec_get_converted_size_temp( - new_index, old_pk->fields, old_pk->n_fields, NULL, + new_index, old_pk->fields, old_pk->n_fields, &old_pk_extra_size); ut_ad(old_pk_extra_size < 0x100); @@ -675,9 +715,7 @@ row_log_table_delete( /* Check if we need to log virtual column data */ if (ventry->n_v_fields > 0) { - ulint v_extra; - mrec_size += rec_get_converted_size_temp( - new_index, NULL, 0, ventry, &v_extra); + mrec_size += rec_get_converted_size_temp_v(new_index, ventry); } if (byte* b = row_log_table_open(index->online_log, @@ -691,7 +729,7 @@ row_log_table_delete( rec_convert_dtuple_to_temp( b + old_pk_extra_size, new_index, - old_pk->fields, old_pk->n_fields, NULL); + old_pk->fields, old_pk->n_fields); b += old_pk_size; @@ -724,13 +762,11 @@ row_log_table_delete( /* log virtual columns */ if (ventry->n_v_fields > 0) { - rec_convert_dtuple_to_temp( - b, new_index, NULL, 0, ventry); + rec_convert_dtuple_to_temp_v(b, new_index, ventry); b += mach_read_from_2(b); } - row_log_table_close( - index->online_log, b, mrec_size, avail_size); + row_log_table_close(index, b, mrec_size, avail_size); } func_exit: @@ -816,15 +852,16 @@ row_log_table_low_redundant( } size = rec_get_converted_size_temp( - index, tuple->fields, tuple->n_fields, ventry, &extra_size); + index, tuple->fields, tuple->n_fields, &extra_size); + ulint v_size = ventry + ? rec_get_converted_size_temp_v(index, ventry) : 0; - mrec_size = ROW_LOG_HEADER_SIZE + size + (extra_size >= 0x80); + mrec_size = ROW_LOG_HEADER_SIZE + size + v_size + (extra_size >= 0x80); if (num_v) { if (o_ventry) { - ulint v_extra = 0; - mrec_size += rec_get_converted_size_temp( - index, NULL, 0, o_ventry, &v_extra); + mrec_size += rec_get_converted_size_temp_v( + index, o_ventry); } } else if (index->table->n_v_cols) { mrec_size += 2; @@ -843,7 +880,7 @@ row_log_table_low_redundant( old_pk_size = rec_get_converted_size_temp( new_index, old_pk->fields, old_pk->n_fields, - ventry, &old_pk_extra_size); + &old_pk_extra_size); ut_ad(old_pk_extra_size < 0x100); mrec_size += 1/*old_pk_extra_size*/ + old_pk_size; } @@ -857,8 +894,7 @@ row_log_table_low_redundant( rec_convert_dtuple_to_temp( b + old_pk_extra_size, new_index, - old_pk->fields, old_pk->n_fields, - ventry); + old_pk->fields, old_pk->n_fields); b += old_pk_size; } @@ -871,14 +907,17 @@ row_log_table_low_redundant( } rec_convert_dtuple_to_temp( - b + extra_size, index, tuple->fields, tuple->n_fields, - ventry); + b + extra_size, index, tuple->fields, tuple->n_fields); b += size; + if (ventry) { + rec_convert_dtuple_to_temp_v(b, new_index, ventry); + b += v_size; + } if (num_v) { if (o_ventry) { - rec_convert_dtuple_to_temp( - b, new_index, NULL, 0, o_ventry); + rec_convert_dtuple_to_temp_v( + b, new_index, o_ventry); b += mach_read_from_2(b); } } else if (index->table->n_v_cols) { @@ -889,8 +928,7 @@ row_log_table_low_redundant( b += 2; } - row_log_table_close( - index->online_log, b, mrec_size, avail_size); + row_log_table_close(index, b, mrec_size, avail_size); } mem_heap_free(heap); @@ -968,13 +1006,11 @@ row_log_table_low( + (extra_size >= 0x80) + rec_offs_size(offsets) - omit_size; if (ventry && ventry->n_v_fields > 0) { - ulint v_extra = 0; - mrec_size += rec_get_converted_size_temp( - new_index, NULL, 0, ventry, &v_extra); + mrec_size += rec_get_converted_size_temp_v(new_index, ventry); if (o_ventry) { - mrec_size += rec_get_converted_size_temp( - new_index, NULL, 0, o_ventry, &v_extra); + mrec_size += rec_get_converted_size_temp_v( + new_index, o_ventry); } } else if (index->table->n_v_cols) { /* Always leave 2 bytes length marker for virtual column @@ -996,7 +1032,7 @@ row_log_table_low( old_pk_size = rec_get_converted_size_temp( new_index, old_pk->fields, old_pk->n_fields, - NULL, &old_pk_extra_size); + &old_pk_extra_size); ut_ad(old_pk_extra_size < 0x100); mrec_size += 1/*old_pk_extra_size*/ + old_pk_size; } @@ -1010,8 +1046,7 @@ row_log_table_low( rec_convert_dtuple_to_temp( b + old_pk_extra_size, new_index, - old_pk->fields, old_pk->n_fields, - NULL); + old_pk->fields, old_pk->n_fields); b += old_pk_size; } @@ -1029,13 +1064,12 @@ row_log_table_low( b += rec_offs_data_size(offsets); if (ventry && ventry->n_v_fields > 0) { - rec_convert_dtuple_to_temp( - b, new_index, NULL, 0, ventry); + rec_convert_dtuple_to_temp_v(b, new_index, ventry); b += mach_read_from_2(b); if (o_ventry) { - rec_convert_dtuple_to_temp( - b, new_index, NULL, 0, o_ventry); + rec_convert_dtuple_to_temp_v( + b, new_index, o_ventry); b += mach_read_from_2(b); } } else if (index->table->n_v_cols) { @@ -1046,8 +1080,7 @@ row_log_table_low( b += 2; } - row_log_table_close( - index->online_log, b, mrec_size, avail_size); + row_log_table_close(index, b, mrec_size, avail_size); } } @@ -2038,6 +2071,7 @@ row_log_table_apply_update( When applying the subsequent ROW_T_DELETE, no matching record will be found. */ + /* fall through */ case DB_SUCCESS: ut_ad(row != NULL); break; @@ -2422,6 +2456,9 @@ row_log_table_apply_op( next_mrec = mrec + rec_offs_data_size(offsets); if (log->table->n_v_cols) { + if (next_mrec + 2 > mrec_end) { + return(NULL); + } next_mrec += mach_read_from_2(next_mrec); } @@ -2460,7 +2497,7 @@ row_log_table_apply_op( rec_init_offsets_temp(mrec, new_index, offsets); next_mrec = mrec + rec_offs_data_size(offsets) + ext_size; if (log->table->n_v_cols) { - if (next_mrec + 2 >= mrec_end) { + if (next_mrec + 2 > mrec_end) { return(NULL); } @@ -2888,22 +2925,32 @@ all_done: goto func_exit; } - IORequest request; + IORequest request(IORequest::READ); + byte* buf = index->online_log->head.block; - dberr_t err = os_file_read_no_error_handling( - request, - OS_FILE_FROM_FD(index->online_log->fd), - index->online_log->head.block, ofs, - srv_sort_buf_size, - NULL); - - if (err != DB_SUCCESS) { + if (!os_file_read_no_error_handling_int_fd( + request, index->online_log->fd, + buf, ofs, srv_sort_buf_size)) { ib::error() << "Unable to read temporary file" " for table " << index->table_name; goto corruption; } + if (log_tmp_is_encrypted()) { + if (!log_tmp_block_decrypt( + buf, srv_sort_buf_size, + index->online_log->crypt_head, + ofs, index->table->space)) { + error = DB_DECRYPTION_FAILED; + goto func_exit; + } + + srv_stats.n_rowlog_blocks_decrypted.inc(); + memcpy(buf, index->online_log->crypt_head, + srv_sort_buf_size); + } + #ifdef POSIX_FADV_DONTNEED /* Each block is read exactly once. Free up the file cache. */ posix_fadvise(index->online_log->fd, @@ -3199,6 +3246,7 @@ row_log_allocate( log->tail.blocks = log->tail.bytes = 0; log->tail.total = 0; log->tail.block = log->head.block = NULL; + log->crypt_tail = log->crypt_head = NULL; log->head.blocks = log->head.bytes = 0; log->head.total = 0; log->path = path; @@ -3208,6 +3256,17 @@ row_log_allocate( dict_index_set_online_status(index, ONLINE_INDEX_CREATION); index->online_log = log; + if (log_tmp_is_encrypted()) { + ulint size = srv_sort_buf_size; + log->crypt_head = static_cast(os_mem_alloc_large(&size)); + log->crypt_tail = static_cast(os_mem_alloc_large(&size)); + + if (!log->crypt_head || !log->crypt_tail) { + row_log_free(log); + DBUG_RETURN(false); + } + } + /* While we might be holding an exclusive data dictionary lock here, in row_log_abort_sec() we will not always be holding it. Use atomic operations in both cases. */ @@ -3229,6 +3288,15 @@ row_log_free( row_log_block_free(log->tail); row_log_block_free(log->head); row_merge_file_destroy_low(log->fd); + + if (log->crypt_head) { + os_mem_free_large(log->crypt_head, srv_sort_buf_size); + } + + if (log->crypt_tail) { + os_mem_free_large(log->crypt_tail, srv_sort_buf_size); + } + mutex_free(&log->mutex); ut_free(log); log = NULL; @@ -3707,10 +3775,10 @@ all_done: goto func_exit; } } else { - os_offset_t ofs; - - ofs = (os_offset_t) index->online_log->head.blocks + os_offset_t ofs = static_cast( + index->online_log->head.blocks) * srv_sort_buf_size; + IORequest request(IORequest::READ); ut_ad(has_index_lock); has_index_lock = false; @@ -3723,22 +3791,30 @@ all_done: goto func_exit; } - IORequest request; + byte* buf = index->online_log->head.block; - dberr_t err = os_file_read_no_error_handling( - request, - OS_FILE_FROM_FD(index->online_log->fd), - index->online_log->head.block, ofs, - srv_sort_buf_size, - NULL); - - if (err != DB_SUCCESS) { + if (!os_file_read_no_error_handling_int_fd( + request, index->online_log->fd, + buf, ofs, srv_sort_buf_size)) { ib::error() << "Unable to read temporary file" " for index " << index->name; goto corruption; } + if (log_tmp_is_encrypted()) { + if (!log_tmp_block_decrypt( + buf, srv_sort_buf_size, + index->online_log->crypt_head, + ofs, index->table->space)) { + error = DB_DECRYPTION_FAILED; + goto func_exit; + } + + srv_stats.n_rowlog_blocks_decrypted.inc(); + memcpy(buf, index->online_log->crypt_head, srv_sort_buf_size); + } + #ifdef POSIX_FADV_DONTNEED /* Each block is read exactly once. Free up the file cache. */ posix_fadvise(index->online_log->fd, diff --git a/storage/innobase/row/row0merge.cc b/storage/innobase/row/row0merge.cc index aeff27c31eb..8c02edcb3cc 100644 --- a/storage/innobase/row/row0merge.cc +++ b/storage/innobase/row/row0merge.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 2005, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2005, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2014, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under @@ -37,6 +37,7 @@ Completed by Sunny Bains and Marko Makela #include "row0log.h" #include "row0ins.h" #include "row0sel.h" +#include "log0crypt.h" #include "dict0crea.h" #include "trx0purge.h" #include "lock0lock.h" @@ -270,92 +271,6 @@ private: /* Maximum pending doc memory limit in bytes for a fts tokenization thread */ #define FTS_PENDING_DOC_MEMORY_LIMIT 1000000 -/******************************************************//** -Encrypt a merge block. */ -static -void -row_merge_encrypt_buf( -/*==================*/ - fil_space_crypt_t* crypt_data, /*!< in: table crypt data */ - ulint offset, /*!< in: offset where to - write */ - ulint space, /*!< in: tablespace id */ - const byte* input_buf, /*!< in: input buffer */ - byte* crypted_buf) /*!< out: crypted buffer */ -{ - uint key_version; - uint dstlen=0; - uint ofs = (uint)(srv_sort_buf_size * offset); - - key_version = encryption_key_get_latest_version(crypt_data->key_id); - - /* Store key_version at the beginning of the input buffer */ - mach_write_to_4((byte *)crypted_buf, key_version); - - int rc = encryption_scheme_encrypt(input_buf+ROW_MERGE_RESERVE_SIZE, - srv_sort_buf_size-ROW_MERGE_RESERVE_SIZE, - crypted_buf+ROW_MERGE_RESERVE_SIZE, &dstlen, - crypt_data, key_version, - space, ofs, 0); - - if (! ((rc == MY_AES_OK) && ((ulint)dstlen == srv_sort_buf_size-ROW_MERGE_RESERVE_SIZE))) { - ib::fatal() - << "Unable to encrypt data-block " - " src: " << static_cast(input_buf) - << " srclen: " << srv_sort_buf_size - << " buf: " << static_cast(crypted_buf) - << " buflen: " << dstlen - << ". return-code: " << rc << ". Can't continue!"; - } -} - -/******************************************************//** -Decrypt a merge block. */ -static -bool -row_merge_decrypt_buf( -/*==================*/ - fil_space_crypt_t* crypt_data, /*!< in: table crypt data */ - ulint offset, /*!< in: offset where to - write */ - ulint space, /*!< in: tablespace id */ - const byte* input_buf, /*!< in: input buffer */ - byte* crypted_buf) /*!< out: crypted buffer */ -{ - uint key_version; - uint dstlen=0; - uint ofs = (uint)(srv_sort_buf_size * offset); - - /* Read key_version from beginning of the buffer */ - key_version = mach_read_from_4((byte *)input_buf); - - if (key_version == 0) { - /* block not encrypted */ - return false; - } - - int rc = encryption_scheme_decrypt(input_buf+ROW_MERGE_RESERVE_SIZE, - srv_sort_buf_size-ROW_MERGE_RESERVE_SIZE, - crypted_buf+ROW_MERGE_RESERVE_SIZE, &dstlen, - crypt_data, key_version, - space, ofs, 0); - - if (! ((rc == MY_AES_OK) && ((ulint)dstlen == srv_sort_buf_size-ROW_MERGE_RESERVE_SIZE))) { - ib::fatal() - << "Unable to decrypt data-block " - << " src: " << static_cast(input_buf) - << " srclen: " << srv_sort_buf_size - << " buf: " << static_cast(crypted_buf) - << " buflen: " << dstlen - << ". return-code: " << rc << ". Can't continue!"; - } - - return true; -} - -/* Maximum pending doc memory limit in bytes for a fts tokenization thread */ -#define FTS_PENDING_DOC_MEMORY_LIMIT 1000000 - /** Insert sorted data tuples to the index. @param[in] trx_id transaction identifier @param[in] index index to be inserted @@ -384,7 +299,6 @@ row_merge_insert_index_tuples( percent until now */ const double pct_cost, /*!< in: current progress percent */ - fil_space_crypt_t* crypt_data,/*!< in: table crypt data */ row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */ ulint space, /*!< in: space id */ ut_stage_alter_t* stage = NULL); @@ -407,7 +321,7 @@ row_merge_buf_encode( ulint extra_size; size = rec_get_converted_size_temp( - index, entry->fields, n_fields, NULL, &extra_size); + index, entry->fields, n_fields, &extra_size); ut_ad(size >= extra_size); /* Encode extra_size + 1 */ @@ -420,7 +334,7 @@ row_merge_buf_encode( } rec_convert_dtuple_to_temp(*b + extra_size, index, - entry->fields, n_fields, NULL); + entry->fields, n_fields); *b += size; } @@ -469,7 +383,7 @@ row_merge_buf_create( ulint buf_size; mem_heap_t* heap; - max_tuples = (srv_sort_buf_size - ROW_MERGE_RESERVE_SIZE) + max_tuples = srv_sort_buf_size / ut_max(static_cast(1), dict_index_get_min_size(index)); @@ -840,9 +754,7 @@ row_merge_buf_add( } ut_ad(len <= col->len - || DATA_LARGE_MTYPE(col->mtype) - || (col->mtype == DATA_POINT - && len == DATA_MBR_LEN)); + || DATA_LARGE_MTYPE(col->mtype)); fixed_len = ifield->fixed_len; if (fixed_len && !dict_table_is_comp(index->table) @@ -895,7 +807,7 @@ row_merge_buf_add( ulint extra; size = rec_get_converted_size_temp( - index, entry->fields, n_fields, NULL, &extra); + index, entry->fields, n_fields, &extra); ut_ad(data_size + extra_size == size); ut_ad(extra_size == extra); @@ -919,7 +831,7 @@ row_merge_buf_add( ut_ad(data_size < srv_sort_buf_size); /* Reserve bytes for the end marker of row_merge_block_t. */ - if (buf->total_size + data_size >= (srv_sort_buf_size - ROW_MERGE_RESERVE_SIZE)) { + if (buf->total_size + data_size >= srv_sort_buf_size) { DBUG_RETURN(0); } @@ -1041,7 +953,7 @@ respectively */ /**********************************************************************//** Merge sort the tuple buffer in main memory. */ -static MY_ATTRIBUTE((nonnull(4,5))) +static void row_merge_tuple_sort( /*=================*/ @@ -1092,7 +1004,7 @@ row_merge_buf_write( { const dict_index_t* index = buf->index; ulint n_fields= dict_index_get_n_fields(index); - byte* b = &block[ROW_MERGE_RESERVE_SIZE]; + byte* b = &block[0]; DBUG_ENTER("row_merge_buf_write"); @@ -1111,7 +1023,7 @@ row_merge_buf_write( /* Write an "end-of-chunk" marker. */ ut_a(b < &block[srv_sort_buf_size]); - ut_a(b == &block[0] + buf->total_size + ROW_MERGE_RESERVE_SIZE); + ut_a(b == &block[0] + buf->total_size); *b++ = 0; #ifdef UNIV_DEBUG_VALGRIND /* The rest of the block is uninitialized. Initialize it @@ -1155,10 +1067,9 @@ row_merge_heap_create( return(heap); } -/********************************************************************//** -Read a merge block from the file system. -@return TRUE if request was successful, FALSE if fail */ -ibool +/** Read a merge block from the file system. +@return whether the request was completed successfully */ +bool row_merge_read( /*===========*/ int fd, /*!< in: file descriptor */ @@ -1166,9 +1077,8 @@ row_merge_read( in number of row_merge_block_t elements */ row_merge_block_t* buf, /*!< out: data */ - fil_space_crypt_t* crypt_data,/*!< in: table crypt data */ row_merge_block_t* crypt_buf, /*!< in: crypt buf or NULL */ - ulint space) /*!< in: space id */ + ulint space) /*!< in: space id */ { os_offset_t ofs = ((os_offset_t) offset) * srv_sort_buf_size; @@ -1176,17 +1086,19 @@ row_merge_read( DBUG_LOG("ib_merge_sort", "fd=" << fd << " ofs=" << ofs); DBUG_EXECUTE_IF("row_merge_read_failure", DBUG_RETURN(FALSE);); - IORequest request; - - dberr_t err = os_file_read_no_error_handling( - request, - OS_FILE_FROM_FD(fd), buf, ofs, srv_sort_buf_size, NULL); + IORequest request(IORequest::READ); + const bool success = os_file_read_no_error_handling_int_fd( + request, fd, buf, ofs, srv_sort_buf_size); /* For encrypted tables, decrypt data after reading and copy data */ - if (crypt_data && crypt_buf) { - if (row_merge_decrypt_buf(crypt_data, offset, space, buf, crypt_buf)) { - memcpy(buf, crypt_buf, srv_sort_buf_size); + if (log_tmp_is_encrypted()) { + if (!log_tmp_block_decrypt(buf, srv_sort_buf_size, + crypt_buf, ofs, space)) { + return (FALSE); } + + srv_stats.n_merge_blocks_decrypted.inc(); + memcpy(buf, crypt_buf, srv_sort_buf_size); } #ifdef POSIX_FADV_DONTNEED @@ -1194,24 +1106,24 @@ row_merge_read( posix_fadvise(fd, ofs, srv_sort_buf_size, POSIX_FADV_DONTNEED); #endif /* POSIX_FADV_DONTNEED */ - if (err != DB_SUCCESS) { + if (!success) { ib::error() << "Failed to read merge block at " << ofs; } - DBUG_RETURN(err == DB_SUCCESS); + DBUG_RETURN(success); } /********************************************************************//** Write a merge block to the file system. -@return TRUE if request was successful, FALSE if fail */ -ibool +@return whether the request was completed successfully */ +UNIV_INTERN +bool row_merge_write( /*============*/ int fd, /*!< in: file descriptor */ ulint offset, /*!< in: offset where to write, in number of row_merge_block_t elements */ const void* buf, /*!< in: data */ - fil_space_crypt_t* crypt_data, /*!< in: table crypt data */ void* crypt_buf, /*!< in: crypt buf or NULL */ ulint space) /*!< in: space id */ { @@ -1223,18 +1135,22 @@ row_merge_write( DBUG_LOG("ib_merge_sort", "fd=" << fd << " ofs=" << ofs); DBUG_EXECUTE_IF("row_merge_write_failure", DBUG_RETURN(FALSE);); - IORequest request(IORequest::WRITE); - if (crypt_data && crypt_buf) { - row_merge_encrypt_buf(crypt_data, offset, space, (const byte *)buf, (byte *)crypt_buf); + /* For encrypted tables, encrypt data before writing */ + if (log_tmp_is_encrypted()) { + if (!log_tmp_block_encrypt(static_cast(buf), + buf_len, + static_cast(crypt_buf), + ofs, space)) { + return false; + } + + srv_stats.n_merge_blocks_encrypted.inc(); out_buf = crypt_buf; - } else { - /* Mark block unencrypted */ - mach_write_to_4((byte *)out_buf, 0); } - dberr_t err = os_file_write( - request, - "(merge)", OS_FILE_FROM_FD(fd), out_buf, ofs, buf_len); + IORequest request(IORequest::WRITE); + const bool success = os_file_write_int_fd( + request, "(merge)", fd, out_buf, ofs, buf_len); #ifdef POSIX_FADV_DONTNEED /* The block will be needed on the next merge pass, @@ -1242,7 +1158,7 @@ row_merge_write( posix_fadvise(fd, ofs, buf_len, POSIX_FADV_DONTNEED); #endif /* POSIX_FADV_DONTNEED */ - DBUG_RETURN(err == DB_SUCCESS); + DBUG_RETURN(success); } /********************************************************************//** @@ -1261,9 +1177,8 @@ row_merge_read_rec( or NULL on end of list (non-NULL on I/O error) */ ulint* offsets,/*!< out: offsets of mrec */ - fil_space_crypt_t* crypt_data,/*!< in: table crypt data */ row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */ - ulint space) /*!< in: space id */ + ulint space) /*!< in: space id */ { ulint extra_size; ulint data_size; @@ -1277,10 +1192,6 @@ row_merge_read_rec( DBUG_ENTER("row_merge_read_rec"); - if (b == &block[0]) { - b+= ROW_MERGE_RESERVE_SIZE; - } - extra_size = *b++; if (UNIV_UNLIKELY(!extra_size)) { @@ -1298,7 +1209,8 @@ row_merge_read_rec( if (UNIV_UNLIKELY(b >= &block[srv_sort_buf_size])) { if (!row_merge_read(fd, ++(*foffs), block, - crypt_data, crypt_block, space)) { + crypt_block, + space)) { err_exit: /* Signal I/O error. */ *mrec = b; @@ -1306,7 +1218,7 @@ err_exit: } /* Wrap around to the beginning of the buffer. */ - b = &block[ROW_MERGE_RESERVE_SIZE]; + b = &block[0]; } extra_size = (extra_size & 0x7f) << 8; @@ -1328,13 +1240,14 @@ err_exit: memcpy(*buf, b, avail_size); if (!row_merge_read(fd, ++(*foffs), block, - crypt_data, crypt_block, space)) { + crypt_block, + space)) { goto err_exit; } /* Wrap around to the beginning of the buffer. */ - b = &block[ROW_MERGE_RESERVE_SIZE]; + b = &block[0]; /* Copy the record. */ memcpy(*buf + avail_size, b, extra_size - avail_size); @@ -1389,13 +1302,14 @@ err_exit: ut_d(offsets[3] = (ulint) index); if (!row_merge_read(fd, ++(*foffs), block, - crypt_data, crypt_block, space)) { + crypt_block, + space)) { goto err_exit; } /* Wrap around to the beginning of the buffer. */ - b = &block[ROW_MERGE_RESERVE_SIZE]; + b = &block[0]; /* Copy the rest of the record. */ memcpy(*buf + avail_size, b, extra_size + data_size - avail_size); @@ -1467,7 +1381,6 @@ row_merge_write_rec( ulint* foffs, /*!< in/out: file offset */ const mrec_t* mrec, /*!< in: record to write */ const ulint* offsets,/*!< in: offsets of mrec */ - fil_space_crypt_t* crypt_data,/*!< in: table crypt data */ row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */ ulint space) /*!< in: space id */ { @@ -1490,10 +1403,6 @@ row_merge_write_rec( size = extra_size + (extra_size >= 0x80) + rec_offs_data_size(offsets); - if (b == &block[0]) { - b+= ROW_MERGE_RESERVE_SIZE; - } - if (UNIV_UNLIKELY(b + size >= &block[srv_sort_buf_size])) { /* The record spans two blocks. Copy it to the temporary buffer first. */ @@ -1509,14 +1418,15 @@ row_merge_write_rec( memcpy(b, buf[0], avail_size); if (!row_merge_write(fd, (*foffs)++, block, - crypt_data, crypt_block, space)) { + crypt_block, + space)) { return(NULL); } UNIV_MEM_INVALID(&block[0], srv_sort_buf_size); /* Copy the rest. */ - b = &block[ROW_MERGE_RESERVE_SIZE]; + b = &block[0]; memcpy(b, buf[0] + avail_size, size - avail_size); b += size - avail_size; } else { @@ -1539,7 +1449,6 @@ row_merge_write_eof( byte* b, /*!< in: pointer to end of block */ int fd, /*!< in: file descriptor */ ulint* foffs, /*!< in/out: file offset */ - fil_space_crypt_t* crypt_data, /*!< in: table crypt data */ row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */ ulint space) /*!< in: space id */ { @@ -1554,10 +1463,6 @@ row_merge_write_eof( reinterpret_cast(block) << ",fd=" << fd << ',' << *foffs); - if (b == &block[0]) { - b+= ROW_MERGE_RESERVE_SIZE; - } - *b++ = 0; UNIV_MEM_ASSERT_RW(&block[0], b - &block[0]); UNIV_MEM_ASSERT_W(&block[0], srv_sort_buf_size); @@ -1568,8 +1473,7 @@ row_merge_write_eof( memset(b, 0xff, &block[srv_sort_buf_size] - b); #endif /* UNIV_DEBUG_VALGRIND */ - if (!row_merge_write(fd, (*foffs)++, block, - crypt_data, crypt_block, space)) { + if (!row_merge_write(fd, (*foffs)++, block, crypt_block, space)) { DBUG_RETURN(NULL); } @@ -1769,6 +1673,8 @@ existing order @param[in,out] stage performance schema accounting object, used by ALTER TABLE. stage->n_pk_recs_inc() will be called for each record read and stage->inc() will be called for each page read. +@param[in] pct_cost percent of task weight out of total alter job +@param[in,out] crypt_block crypted file buffer @param[in] eval_table mysql table used to evaluate virtual column value, see innobase_get_computed_value(). @return DB_SUCCESS or error */ @@ -1796,10 +1702,8 @@ row_merge_read_clustered_index( int* tmpfd, ut_stage_alter_t* stage, double pct_cost, - fil_space_crypt_t* crypt_data, row_merge_block_t* crypt_block, struct TABLE* eval_table) - { dict_index_t* clust_index; /* Clustered index */ mem_heap_t* row_heap; /* Heap memory to create @@ -1995,13 +1899,18 @@ row_merge_read_clustered_index( row_ext_t* ext; page_cur_t* cur = btr_pcur_get_page_cur(&pcur); + mem_heap_empty(row_heap); + /* Do not continue if table pages are still encrypted */ - if (old_table->is_encrypted || new_table->is_encrypted) { + if (!old_table->is_readable() || + !new_table->is_readable()) { err = DB_DECRYPTION_FAILED; trx->error_key_num = 0; goto func_exit; } + mem_heap_empty(row_heap); + page_cur_move_to_next(cur); stage->n_pk_recs_inc(); @@ -2133,10 +2042,10 @@ end_of_index: rec = page_cur_get_rec(cur); - offsets = rec_get_offsets(rec, clust_index, NULL, - ULINT_UNDEFINED, &row_heap); - if (online) { + offsets = rec_get_offsets(rec, clust_index, NULL, + ULINT_UNDEFINED, &row_heap); + /* Perform a REPEATABLE READ. When rebuilding the table online, @@ -2179,6 +2088,10 @@ end_of_index: if (rec_get_deleted_flag( rec, dict_table_is_comp(old_table))) { + /* In delete-marked records, DB_TRX_ID must + always refer to an existing undo log record. */ + ut_ad(row_get_rec_trx_id(rec, clust_index, + offsets)); /* This record was deleted in the latest committed version, or it was deleted and then reinserted-by-update before purge @@ -2189,6 +2102,9 @@ end_of_index: ut_ad(!rec_offs_any_null_extern(rec, offsets)); } else if (rec_get_deleted_flag( rec, dict_table_is_comp(old_table))) { + /* In delete-marked records, DB_TRX_ID must + always refer to an existing undo log record. */ + ut_ad(rec_get_trx_id(rec, clust_index)); /* Skip delete-marked records. Skipping delete-marked records will make the @@ -2198,6 +2114,9 @@ end_of_index: would make it tricky to detect duplicate keys. */ continue; + } else { + offsets = rec_get_offsets(rec, clust_index, NULL, + ULINT_UNDEFINED, &row_heap); } /* When !online, we are holding a lock on old_table, preventing @@ -2481,8 +2400,7 @@ write_buffers: table_total_rows, curr_progress, pct_cost, - NULL, - NULL, + crypt_block, new_table->space); if (row == NULL) { @@ -2593,8 +2511,7 @@ write_buffers: table_total_rows, curr_progress, pct_cost, - NULL, - NULL, + crypt_block, new_table->space); err = btr_bulk.finish(err); @@ -2626,8 +2543,10 @@ write_buffers: row_merge_buf_write(buf, file, block); - if (!row_merge_write(file->fd, file->offset++, block, - crypt_data, crypt_block, new_table->space)) { + if (!row_merge_write( + file->fd, file->offset++, + block, crypt_block, + new_table->space)) { err = DB_TEMP_FILE_WRITE_FAIL; trx->error_key_num = i; break; @@ -2671,7 +2590,6 @@ write_buffers: goto func_exit; } - mem_heap_empty(row_heap); if (v_heap) { mem_heap_empty(v_heap); } @@ -2681,7 +2599,7 @@ write_buffers: if(read_rows % 1000 == 0) { /* Update progress for each 1000 rows */ curr_progress = (read_rows >= table_total_rows) ? - pct_cost : + pct_cost : ((pct_cost * read_rows) / table_total_rows); /* presenting 10.12% as 1012 integer */ onlineddl_pct_progress = (ulint) (curr_progress * 100); @@ -2837,9 +2755,8 @@ wait_again: &buf[2], b2, \ of->fd, &of->offset, \ mrec##N, offsets##N, \ - crypt_data, \ crypt_block ? &crypt_block[2 * srv_sort_buf_size] : NULL , \ - space); \ + space); \ if (UNIV_UNLIKELY(!b2 || ++of->n_rec > file->n_rec)) { \ goto corrupt; \ } \ @@ -2847,7 +2764,6 @@ wait_again: &buf[N], b##N, INDEX, \ file->fd, foffs##N, \ &mrec##N, offsets##N, \ - crypt_data, \ crypt_block ? &crypt_block[N * srv_sort_buf_size] : NULL, \ space); \ \ @@ -2880,6 +2796,8 @@ wait_again: @param[in,out] foffs1 offset of second source list in the file @param[in,out] of output file @param[in,out] stage performance schema accounting object, used by +@param[in,out] crypt_block encryption buffer +@param[in] space tablespace ID for encryption ALTER TABLE. If not NULL stage->inc() will be called for each record processed. @return DB_SUCCESS or error code */ @@ -2893,10 +2811,8 @@ row_merge_blocks( ulint* foffs1, merge_file_t* of, ut_stage_alter_t* stage, - fil_space_crypt_t* crypt_data,/*!< in: crypt data or NULL */ - row_merge_block_t* crypt_block,/*!< in: in/out: crypted file - buffer */ - ulint space) /*!< in: space id */ + row_merge_block_t* crypt_block, + ulint space) { mem_heap_t* heap; /*!< memory heap for offsets0, offsets1 */ @@ -2922,9 +2838,11 @@ row_merge_blocks( file in two halves, which can be merged on the following pass. */ if (!row_merge_read(file->fd, *foffs0, &block[0], - crypt_data, crypt_block ? &crypt_block[0] : NULL, space) - || !row_merge_read(file->fd, *foffs1, &block[srv_sort_buf_size], - crypt_data, crypt_block ? &crypt_block[srv_sort_buf_size] : NULL, space)) { + crypt_block ? &crypt_block[0] : NULL, + space) || + !row_merge_read(file->fd, *foffs1, &block[srv_sort_buf_size], + crypt_block ? &crypt_block[srv_sort_buf_size] : NULL, + space)) { corrupt: mem_heap_free(heap); DBUG_RETURN(DB_CORRUPTION); @@ -2937,13 +2855,15 @@ corrupt: b0 = row_merge_read_rec( &block[0], &buf[0], b0, dup->index, file->fd, foffs0, &mrec0, offsets0, - crypt_data, crypt_block ? &crypt_block[0] : NULL, space); + crypt_block ? &crypt_block[0] : NULL, + space); b1 = row_merge_read_rec( &block[srv_sort_buf_size], &buf[srv_sort_buf_size], b1, dup->index, file->fd, foffs1, &mrec1, offsets1, - crypt_data, crypt_block ? &crypt_block[srv_sort_buf_size] : NULL, space); + crypt_block ? &crypt_block[srv_sort_buf_size] : NULL, + space); if (UNIV_UNLIKELY(!b0 && mrec0) || UNIV_UNLIKELY(!b1 && mrec1)) { @@ -2983,11 +2903,12 @@ done1: mem_heap_free(heap); - b2 = row_merge_write_eof(&block[2 * srv_sort_buf_size], + b2 = row_merge_write_eof( + &block[2 * srv_sort_buf_size], b2, of->fd, &of->offset, - crypt_data, crypt_block ? &crypt_block[2 * srv_sort_buf_size] : NULL, space); + crypt_block ? &crypt_block[2 * srv_sort_buf_size] : NULL, + space); DBUG_RETURN(b2 ? DB_SUCCESS : DB_CORRUPTION); - } /** Copy a block of index entries. @@ -2997,6 +2918,8 @@ done1: @param[in,out] foffs0 input file offset @param[in,out] of output file @param[in,out] stage performance schema accounting object, used by +@param[in,out] crypt_block encryption buffer +@param[in] space tablespace ID for encryption ALTER TABLE. If not NULL stage->inc() will be called for each record processed. @return TRUE on success, FALSE on failure */ @@ -3009,9 +2932,8 @@ row_merge_blocks_copy( ulint* foffs0, merge_file_t* of, ut_stage_alter_t* stage, - fil_space_crypt_t* crypt_data,/*!< in: table crypt data */ - row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */ - ulint space) /*!< in: space id */ + row_merge_block_t* crypt_block, + ulint space) { mem_heap_t* heap; /*!< memory heap for offsets0, offsets1 */ @@ -3034,7 +2956,8 @@ row_merge_blocks_copy( file in two halves, which can be merged on the following pass. */ if (!row_merge_read(file->fd, *foffs0, &block[0], - crypt_data, crypt_block ? &crypt_block[0] : NULL, space)) { + crypt_block ? &crypt_block[0] : NULL, + space)) { corrupt: mem_heap_free(heap); DBUG_RETURN(FALSE); @@ -3046,7 +2969,8 @@ corrupt: b0 = row_merge_read_rec(&block[0], &buf[0], b0, index, file->fd, foffs0, &mrec0, offsets0, - crypt_data, crypt_block ? &crypt_block[0] : NULL, space); + crypt_block ? &crypt_block[0] : NULL, + space); if (UNIV_UNLIKELY(!b0 && mrec0)) { @@ -3067,10 +2991,12 @@ done0: mem_heap_free(heap); - DBUG_RETURN(row_merge_write_eof(&block[2 * srv_sort_buf_size], - b2, of->fd, &of->offset, - crypt_data, - crypt_block ? &crypt_block[2 * srv_sort_buf_size] : NULL, space) + DBUG_RETURN(row_merge_write_eof( + &block[2 * srv_sort_buf_size], + b2, of->fd, &of->offset, + crypt_block + ? &crypt_block[2 * srv_sort_buf_size] + : NULL, space) != NULL); } @@ -3084,6 +3010,8 @@ done0: @param[in,out] run_offset Array that contains the first offset number for each merge run @param[in,out] stage performance schema accounting object, used by +@param[in,out] crypt_block encryption buffer +@param[in] space tablespace ID for encryption ALTER TABLE. If not NULL stage->inc() will be called for each record processed. @return DB_SUCCESS or error code */ @@ -3098,9 +3026,8 @@ row_merge( ulint* num_run, ulint* run_offset, ut_stage_alter_t* stage, - fil_space_crypt_t* crypt_data,/*!< in: table crypt data */ - row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */ - ulint space) /*!< in: space id */ + row_merge_block_t* crypt_block, + ulint space) { ulint foffs0; /*!< first input offset */ ulint foffs1; /*!< second input offset */ @@ -3148,7 +3075,7 @@ row_merge( error = row_merge_blocks(dup, file, block, &foffs0, &foffs1, &of, stage, - crypt_data, crypt_block, space); + crypt_block, space); if (error != DB_SUCCESS) { return(error); @@ -3169,7 +3096,7 @@ row_merge( if (!row_merge_blocks_copy(dup->index, file, block, &foffs0, &of, stage, - crypt_data, crypt_block, space)) { + crypt_block, space)) { return(DB_CORRUPTION); } } @@ -3187,7 +3114,7 @@ row_merge( if (!row_merge_blocks_copy(dup->index, file, block, &foffs1, &of, stage, - crypt_data, crypt_block, space)) { + crypt_block, space)) { return(DB_CORRUPTION); } } @@ -3245,7 +3172,6 @@ row_merge_sort( /*!< in: total progress percent until now */ const double pct_cost, /*!< in: current progress percent */ - fil_space_crypt_t* crypt_data,/*!< in: table crypt data */ row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */ ulint space, /*!< in: space id */ ut_stage_alter_t* stage) @@ -3320,7 +3246,7 @@ row_merge_sort( error = row_merge(trx, dup, file, block, tmpfd, &num_runs, run_offset, stage, - crypt_data, crypt_block, space); + crypt_block, space); if(update_progress) { merge_count++; @@ -3463,7 +3389,6 @@ row_merge_insert_index_tuples( percent until now */ const double pct_cost, /*!< in: current progress percent */ - fil_space_crypt_t* crypt_data,/*!< in: table crypt data */ row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */ ulint space, /*!< in: space id */ ut_stage_alter_t* stage) @@ -3524,8 +3449,7 @@ row_merge_insert_index_tuples( b = block; dtuple = NULL; - if (!row_merge_read(fd, foffs, block, - crypt_data, crypt_block, space)) { + if (!row_merge_read(fd, foffs, block, crypt_block, space)) { error = DB_CORRUPTION; goto err_exit; } else { @@ -3534,7 +3458,6 @@ row_merge_insert_index_tuples( } } - for (;;) { if (stage != NULL) { @@ -3558,7 +3481,9 @@ row_merge_insert_index_tuples( } else { b = row_merge_read_rec(block, buf, b, index, fd, &foffs, &mrec, offsets, - crypt_data, crypt_block, space); + crypt_block, + space); + if (UNIV_UNLIKELY(!b)) { /* End of list, or I/O error */ if (mrec) { @@ -3610,7 +3535,16 @@ row_merge_insert_index_tuples( dtuple, tuple_heap); } +#ifdef UNIV_DEBUG + static const latch_level_t latches[] = { + SYNC_INDEX_TREE, /* index->lock */ + SYNC_LEVEL_VARYING /* btr_bulk->m_page_bulks */ + }; +#endif /* UNIV_DEBUG */ + ut_ad(dtuple_validate(dtuple)); + ut_ad(!sync_check_iterate(sync_allowed_latches(latches, + latches + 2))); error = btr_bulk->insert(dtuple); if (error != DB_SUCCESS) { @@ -4029,7 +3963,7 @@ row_merge_drop_temp_indexes(void) /** Create temporary merge files in the given paramater path, and if UNIV_PFS_IO defined, register the file descriptor with Performance Schema. -@param[in] path location for creating temporary merge files. +@param[in] path location for creating temporary merge files, or NULL @return File descriptor */ int row_merge_file_create_low( @@ -4040,16 +3974,23 @@ row_merge_file_create_low( /* This temp file open does not go through normal file APIs, add instrumentation to register with performance schema */ - struct PSI_file_locker* locker = NULL; + struct PSI_file_locker* locker; PSI_file_locker_state state; - register_pfs_file_open_begin(&state, locker, innodb_temp_file_key, - PSI_FILE_OPEN, - "Innodb Merge Temp File", - __FILE__, __LINE__); + locker = PSI_FILE_CALL(get_thread_file_name_locker)( + &state, innodb_temp_file_key, PSI_FILE_OPEN, + "Innodb Merge Temp File", &locker); + if (locker != NULL) { + PSI_FILE_CALL(start_file_open_wait)(locker, + __FILE__, + __LINE__); + } #endif fd = innobase_mysql_tmpfile(path); #ifdef UNIV_PFS_IO - register_pfs_file_open_end(locker, fd); + if (locker != NULL) { + PSI_FILE_CALL(end_file_open_wait_and_bind_to_descriptor)( + locker, fd); + } #endif if (fd < 0) { @@ -4062,7 +4003,7 @@ row_merge_file_create_low( /** Create a merge file in the given location. @param[out] merge_file merge file structure -@param[in] path location for creating temporary file +@param[in] path location for creating temporary file, or NULL @return file descriptor, or -1 on failure */ int row_merge_file_create( @@ -4093,15 +4034,20 @@ row_merge_file_destroy_low( #ifdef UNIV_PFS_IO struct PSI_file_locker* locker = NULL; PSI_file_locker_state state; - register_pfs_file_io_begin(&state, locker, - fd, 0, PSI_FILE_CLOSE, - __FILE__, __LINE__); + locker = PSI_FILE_CALL(get_thread_file_descriptor_locker)( + &state, fd, PSI_FILE_CLOSE); + if (locker != NULL) { + PSI_FILE_CALL(start_file_wait)( + locker, 0, __FILE__, __LINE__); + } #endif if (fd >= 0) { close(fd); } #ifdef UNIV_PFS_IO - register_pfs_file_io_end(locker, 0); + if (locker != NULL) { + PSI_FILE_CALL(end_file_wait)(locker, 0); + } #endif } /*********************************************************************//** @@ -4300,7 +4246,7 @@ row_merge_rename_tables_dict( renamed along with the table. */ if (err == DB_SUCCESS && dict_table_is_file_per_table(old_table) - && !old_table->ibd_file_missing) { + && fil_space_get(old_table->space) != NULL) { /* Make pathname to update SYS_DATAFILES. */ char* tmp_path = row_make_new_pathname(old_table, tmp_name); @@ -4372,7 +4318,8 @@ row_merge_rename_tables_dict( @param[in,out] index index @param[in] add_v new virtual columns added along with add index call @return DB_SUCCESS or error code */ -static MY_ATTRIBUTE((nonnull, warn_unused_result)) +MY_ATTRIBUTE((nonnull(1,2,3), warn_unused_result)) +static dberr_t row_merge_create_index_graph( trx_t* trx, @@ -4494,7 +4441,6 @@ row_merge_create_index( ut_a(index); index->parser = index_def->parser; - index->is_ngram = index_def->is_ngram; index->has_new_v_col = has_new_v_col; /* Note the id of the transaction that created this @@ -4636,11 +4582,10 @@ row_merge_build_indexes( fts_psort_t* merge_info = NULL; int64_t sig_count = 0; bool fts_psort_initiated = false; - fil_space_crypt_t * crypt_data = NULL; double total_static_cost = 0; double total_dynamic_cost = 0; - uint total_index_blocks = 0; + ulint total_index_blocks = 0; double pct_cost=0; double pct_progress=0; @@ -4667,28 +4612,14 @@ row_merge_build_indexes( DBUG_RETURN(DB_OUT_OF_MEMORY); } - /* Get crypt data from tablespace if present. We should be protected - from concurrent DDL (e.g. drop table) by MDL-locks. */ - FilSpace space(new_table->space); - - if (const fil_space_t* fs = space()) { - crypt_data = fs->crypt_data; - } else { - DBUG_RETURN(DB_TABLESPACE_NOT_FOUND); - } - - /* If tablespace is encrypted, allocate additional buffer for - encryption/decryption. */ - if (crypt_data && crypt_data->should_encrypt()) { + if (log_tmp_is_encrypted()) { crypt_block = static_cast( - alloc.allocate_large(3 * srv_sort_buf_size, &crypt_pfx)); + alloc.allocate_large(3 * srv_sort_buf_size, + &crypt_pfx)); if (crypt_block == NULL) { DBUG_RETURN(DB_OUT_OF_MEMORY); } - } else { - /* Not needed */ - crypt_data = NULL; } trx_start_if_not_started_xa(trx, true); @@ -4728,6 +4659,7 @@ row_merge_build_indexes( for (i = 0; i < n_indexes; i++) { merge_files[i].fd = -1; + merge_files[i].offset = 0; } total_static_cost = COST_BUILD_INDEX_STATIC * n_indexes + COST_READ_CLUSTERED_INDEX; @@ -4779,24 +4711,26 @@ row_merge_build_indexes( pct_cost = COST_READ_CLUSTERED_INDEX * 100 / (total_static_cost + total_dynamic_cost); /* Do not continue if we can't encrypt table pages */ - if (old_table->is_encrypted || new_table->is_encrypted) { + if (!old_table->is_readable() || + !new_table->is_readable()) { error = DB_DECRYPTION_FAILED; ib_push_warning(trx->mysql_thd, DB_DECRYPTION_FAILED, "Table %s is encrypted but encryption service or" " used key_id is not available. " " Can't continue reading table.", - old_table->is_encrypted ? old_table->name : new_table->name); + !old_table->is_readable() ? old_table->name : + new_table->name); goto func_exit; } /* Read clustered index of the table and create files for secondary index entries for merge sort */ error = row_merge_read_clustered_index( - trx, table, old_table, new_table, online, indexes, - fts_sort_idx, psort_info, merge_files, key_numbers, - n_indexes, add_cols, add_v, col_map, add_autoinc, - sequence, block, skip_pk_sort, &tmpfd, stage, - pct_cost, crypt_data, crypt_block, eval_table); + trx, table, old_table, new_table, online, indexes, + fts_sort_idx, psort_info, merge_files, key_numbers, + n_indexes, add_cols, add_v, col_map, add_autoinc, + sequence, block, skip_pk_sort, &tmpfd, stage, + pct_cost, crypt_block, eval_table); stage->end_phase_read_pk(); @@ -4821,10 +4755,6 @@ row_merge_build_indexes( /* Now we have files containing index entries ready for sorting and inserting. */ - DBUG_EXECUTE_IF( - "ib_merge_wait_after_read", - os_thread_sleep(20000000);); /* 20 sec */ - for (i = 0; i < n_indexes; i++) { dict_index_t* sort_idx = indexes[i]; @@ -4937,7 +4867,7 @@ wait_again: trx, &dup, &merge_files[i], block, &tmpfd, true, pct_progress, pct_cost, - crypt_data, crypt_block, new_table->space, stage); + crypt_block, new_table->space, stage); pct_progress += pct_cost; @@ -4980,7 +4910,7 @@ wait_again: merge_files[i].fd, block, NULL, &btr_bulk, merge_files[i].n_rec, pct_progress, pct_cost, - crypt_data, crypt_block, new_table->space, stage); + crypt_block, new_table->space, stage); error = btr_bulk.finish(error); diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc index 20a8777b71e..4452960dbc9 100644 --- a/storage/innobase/row/row0mysql.cc +++ b/storage/innobase/row/row0mysql.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2000, 2017, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. +Copyright (c) 2015, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -70,11 +70,6 @@ Created 9/17/2000 Heikki Tuuri #include #include -static const char* MODIFICATIONS_NOT_ALLOWED_MSG_FORCE_RECOVERY = - "innodb_force_recovery is on. We do not allow database modifications" - " by the user. Shut down mysqld and edit my.cnf to set" - " innodb_force_recovery=0"; - /** Provide optional 4.x backwards compatibility for 5.0 and above */ ibool row_rollback_on_timeout = FALSE; @@ -633,8 +628,6 @@ row_mysql_store_col_in_innobase_format( ptr = row_mysql_read_blob_ref(&col_len, mysql_data, col_len); } else if (DATA_GEOMETRY_MTYPE(type)) { - /* We use blob to store geometry data except DATA_POINT - internally, but in MySQL Layer the datatype is always blob. */ ptr = row_mysql_read_geometry(&col_len, mysql_data, col_len); } @@ -747,6 +740,8 @@ row_mysql_handle_errors( { dberr_t err; + DBUG_ENTER("row_mysql_handle_errors"); + handle_new_error: err = trx->error_state; @@ -754,6 +749,9 @@ handle_new_error: trx->error_state = DB_SUCCESS; + DBUG_LOG("trx", "handle error: " << ut_strerr(err) + << ";id=" << ib::hex(trx->id) << ", " << trx); + switch (err) { case DB_LOCK_WAIT_TIMEOUT: if (row_rollback_on_timeout) { @@ -802,7 +800,7 @@ handle_new_error: *new_err = err; - return(true); + DBUG_RETURN(true); case DB_DEADLOCK: case DB_LOCK_TABLE_FULL: @@ -819,6 +817,7 @@ handle_new_error: break; case DB_CORRUPTION: + case DB_PAGE_CORRUPTED: ib::error() << "We detected index corruption in an InnoDB type" " table. You have to dump + drop + reimport the" " table or, in a case of widespread corruption," @@ -846,7 +845,7 @@ handle_new_error: trx->error_state = DB_SUCCESS; - return(false); + DBUG_RETURN(false); } /********************************************************************//** @@ -1195,58 +1194,6 @@ row_get_prebuilt_insert_row( return(prebuilt->ins_node->row); } -/*********************************************************************//** -Updates the table modification counter and calculates new estimates -for table and index statistics if necessary. */ -UNIV_INLINE -void -row_update_statistics_if_needed( -/*============================*/ - dict_table_t* table) /*!< in: table */ -{ - ib_uint64_t counter; - ib_uint64_t n_rows; - - if (!table->stat_initialized) { - DBUG_EXECUTE_IF( - "test_upd_stats_if_needed_not_inited", - fprintf(stderr, "test_upd_stats_if_needed_not_inited" - " was executed\n"); - ); - return; - } - - counter = table->stat_modified_counter++; - n_rows = dict_table_get_n_rows(table); - - if (dict_stats_is_persistent_enabled(table)) { - if (counter > n_rows / 10 /* 10% */ - && dict_stats_auto_recalc_is_enabled(table)) { - - dict_stats_recalc_pool_add(table); - table->stat_modified_counter = 0; - } - return; - } - - /* Calculate new statistics if 1 / 16 of table has been modified - since the last time a statistics batch was run. - We calculate statistics at most every 16th round, since we may have - a counter table which is very small and updated very often. */ - ib_uint64_t threshold= 16 + n_rows / 16; /* 6.25% */ - - if (srv_stats_modified_counter) { - threshold= ut_min((ib_uint64_t)srv_stats_modified_counter, threshold); - } - - if (counter > threshold) { - - ut_ad(!mutex_own(&dict_sys->mutex)); - /* this will reset table->stat_modified_counter to 0 */ - dict_stats_update(table, DICT_STATS_RECALC_TRANSIENT); - } -} - /*********************************************************************//** Sets an AUTO_INC type lock on the table mentioned in prebuilt. The AUTO_INC lock gives exclusive access to the auto-inc counter of the @@ -1399,6 +1346,55 @@ run_again: return(err); } +/** Determine is tablespace encrypted but decryption failed, is table corrupted +or is tablespace .ibd file missing. +@param[in] table Table +@param[in] trx Transaction +@param[in] push_warning true if we should push warning to user +@retval DB_DECRYPTION_FAILED table is encrypted but decryption failed +@retval DB_CORRUPTION table is corrupted +@retval DB_TABLESPACE_NOT_FOUND tablespace .ibd file not found */ +static +dberr_t +row_mysql_get_table_status( + const dict_table_t* table, + trx_t* trx, + bool push_warning = true) +{ + dberr_t err; + if (fil_space_t* space = fil_space_acquire_silent(table->space)) { + if (space->crypt_data && space->crypt_data->is_encrypted()) { + // maybe we cannot access the table due to failing + // to decrypt + if (push_warning) { + ib_push_warning(trx, DB_DECRYPTION_FAILED, + "Table %s in tablespace %lu encrypted." + "However key management plugin or used key_id is not found or" + " used encryption algorithm or method does not match.", + table->name, table->space); + } + + err = DB_DECRYPTION_FAILED; + } else { + if (push_warning) { + ib_push_warning(trx, DB_CORRUPTION, + "Table %s in tablespace %lu corrupted.", + table->name, table->space); + } + + err = DB_CORRUPTION; + } + + fil_space_release(space); + } else { + ib::error() << ".ibd file is missing for table " + << table->name; + err = DB_TABLESPACE_NOT_FOUND; + } + + return(err); +} + /** Does an insert for MySQL. @param[in] mysql_rec row in the MySQL format @param[in,out] prebuilt prebuilt struct in MySQL handle @@ -1432,22 +1428,9 @@ row_insert_for_mysql( return(DB_TABLESPACE_DELETED); - } else if (prebuilt->table->ibd_file_missing) { - - ib::error() << ".ibd file is missing for table " - << prebuilt->table->name; - - return(DB_TABLESPACE_NOT_FOUND); - } else if (prebuilt->table->is_encrypted) { - ib_push_warning(trx, DB_DECRYPTION_FAILED, - "Table %s in tablespace " ULINTPF " encrypted." - "However key management plugin or used key_id is not found or" - " used encryption algorithm or method does not match.", - prebuilt->table->name, prebuilt->table->space); - return(DB_DECRYPTION_FAILED); - } else if (srv_force_recovery) { - - ib::error() << MODIFICATIONS_NOT_ALLOWED_MSG_FORCE_RECOVERY; + } else if (!prebuilt->table->is_readable()) { + return(row_mysql_get_table_status(prebuilt->table, trx, true)); + } else if (high_level_read_only) { return(DB_READ_ONLY); } DBUG_EXECUTE_IF("mark_table_corrupted", { @@ -1594,9 +1577,9 @@ error_exit: que_thr_stop_for_mysql_no_error(thr, trx); if (table->is_system_db) { - srv_stats.n_system_rows_inserted.inc(); + srv_stats.n_system_rows_inserted.inc(size_t(trx->id)); } else { - srv_stats.n_rows_inserted.inc(); + srv_stats.n_rows_inserted.inc(size_t(trx->id)); } /* Not protected by dict_table_stats_lock() for performance @@ -1610,7 +1593,7 @@ error_exit: ut_memcpy(prebuilt->row_id, node->row_id_buf, DATA_ROW_ID_LEN); } - row_update_statistics_if_needed(table); + dict_stats_update_if_needed(table); trx->op_info = ""; if (blob_heap != NULL) { @@ -1828,14 +1811,10 @@ public: /** Does an update or delete of a row for MySQL. -@param[in] mysql_rec row in the MySQL format @param[in,out] prebuilt prebuilt struct in MySQL handle @return error code or DB_SUCCESS */ -static dberr_t -row_update_for_mysql_using_upd_graph( - const byte* mysql_rec, - row_prebuilt_t* prebuilt) +row_update_for_mysql(row_prebuilt_t* prebuilt) { trx_savept_t savept; dberr_t err; @@ -1851,33 +1830,20 @@ row_update_for_mysql_using_upd_graph( upd_cascade_t* processed_cascades; bool got_s_lock = false; - DBUG_ENTER("row_update_for_mysql_using_upd_graph"); + DBUG_ENTER("row_update_for_mysql"); ut_ad(trx); ut_a(prebuilt->magic_n == ROW_PREBUILT_ALLOCATED); ut_a(prebuilt->magic_n2 == ROW_PREBUILT_ALLOCATED); - UT_NOT_USED(mysql_rec); + ut_a(prebuilt->template_type == ROW_MYSQL_WHOLE_ROW); + ut_ad(table->stat_initialized); - if (prebuilt->table->ibd_file_missing) { - ib::error() << "MySQL is trying to use a table handle but the" - " .ibd file for table " << prebuilt->table->name - << " does not exist. Have you deleted" - " the .ibd file from the database directory under" - " the MySQL datadir, or have you used DISCARD" - " TABLESPACE? " << TROUBLESHOOTING_MSG; - DBUG_RETURN(DB_ERROR); - } else if (prebuilt->table->is_encrypted) { - ib_push_warning(trx, DB_DECRYPTION_FAILED, - "Table %s in tablespace " ULINTPF " encrypted." - "However key management plugin or used key_id is not found or" - " used encryption algorithm or method does not match.", - prebuilt->table->name, prebuilt->table->space); - return (DB_TABLE_NOT_FOUND); + if (!table->is_readable()) { + return(row_mysql_get_table_status(table, trx, true)); } - if(srv_force_recovery) { - ib::error() << MODIFICATIONS_NOT_ALLOWED_MSG_FORCE_RECOVERY; - DBUG_RETURN(DB_READ_ONLY); + if (high_level_read_only) { + return(DB_READ_ONLY); } DEBUG_SYNC_C("innodb_row_update_for_mysql_begin"); @@ -1903,6 +1869,8 @@ row_update_for_mysql_using_upd_graph( } node = prebuilt->upd_node; + const bool is_delete = node->is_delete; + ut_ad(node->table == table); if (node->cascade_heap) { mem_heap_empty(node->cascade_heap); @@ -2061,7 +2029,6 @@ run_again: node->cascade_upd_nodes = cascade_upd_nodes; cascade_upd_nodes->pop_front(); thr->fk_cascade_depth++; - prebuilt->m_mysql_table = NULL; goto run_again; } @@ -2073,8 +2040,11 @@ run_again: thr->fk_cascade_depth = 0; - /* Update the statistics only after completing all cascaded - operations */ + /* Update the statistics of each involved table + only after completing all operations, including + FOREIGN KEY...ON...CASCADE|SET NULL. */ + bool update_statistics; + for (upd_cascade_t::iterator i = processed_cascades->begin(); i != processed_cascades->end(); ++i) { @@ -2088,47 +2058,54 @@ run_again: than protecting the following code with a latch. */ dict_table_n_rows_dec(node->table); - srv_stats.n_rows_deleted.add((size_t)trx->id, 1); + update_statistics = !srv_stats_include_delete_marked; + srv_stats.n_rows_deleted.inc(size_t(trx->id)); } else { - srv_stats.n_rows_updated.add((size_t)trx->id, 1); + update_statistics + = !(node->cmpl_info & UPD_NODE_NO_ORD_CHANGE); + srv_stats.n_rows_updated.inc(size_t(trx->id)); + } + + if (update_statistics) { + dict_stats_update_if_needed(node->table); + } else { + /* Always update the table modification counter. */ + node->table->stat_modified_counter++; } - row_update_statistics_if_needed(node->table); que_graph_free_recursive(node); } - if (node->is_delete) { + if (is_delete) { /* Not protected by dict_table_stats_lock() for performance reasons, we would rather get garbage in stat_n_rows (which is just an estimate anyway) than protecting the following code with a latch. */ dict_table_n_rows_dec(prebuilt->table); - if (table->is_system_db) { - srv_stats.n_system_rows_deleted.inc(); + if (table->is_system_db) { + srv_stats.n_system_rows_deleted.inc(size_t(trx->id)); } else { - srv_stats.n_rows_deleted.inc(); + srv_stats.n_rows_deleted.inc(size_t(trx->id)); } + update_statistics = !srv_stats_include_delete_marked; } else { if (table->is_system_db) { - srv_stats.n_system_rows_updated.inc(); + srv_stats.n_system_rows_updated.inc(size_t(trx->id)); } else { - srv_stats.n_rows_updated.inc(); + srv_stats.n_rows_updated.inc(size_t(trx->id)); } + + update_statistics + = !(node->cmpl_info & UPD_NODE_NO_ORD_CHANGE); } - /* We update table statistics only if it is a DELETE or UPDATE - that changes indexed columns, UPDATEs that change only non-indexed - columns would not affect statistics. */ - if (node->is_delete || !(node->cmpl_info & UPD_NODE_NO_ORD_CHANGE)) { - row_update_statistics_if_needed(prebuilt->table); + if (update_statistics) { + dict_stats_update_if_needed(prebuilt->table); } else { - /* Update the table modification counter even when - non-indexed columns change if statistics is initialized. */ - if (prebuilt->table->stat_initialized) { - prebuilt->table->stat_modified_counter++; - } + /* Always update the table modification counter. */ + prebuilt->table->stat_modified_counter++; } trx->op_info = ""; @@ -2175,19 +2152,6 @@ error: DBUG_RETURN(err); } -/** Does an update or delete of a row for MySQL. -@param[in] mysql_rec row in the MySQL format -@param[in,out] prebuilt prebuilt struct in MySQL handle -@return error code or DB_SUCCESS */ -dberr_t -row_update_for_mysql( - const byte* mysql_rec, - row_prebuilt_t* prebuilt) -{ - ut_a(prebuilt->template_type == ROW_MYSQL_WHOLE_ROW); - return(row_update_for_mysql_using_upd_graph(mysql_rec, prebuilt)); -} - /** This can only be used when srv_locks_unsafe_for_binlog is TRUE or this session is using a READ COMMITTED or READ UNCOMMITTED isolation level. Before calling this function row_search_for_mysql() must have @@ -2318,22 +2282,6 @@ no_unlock: trx->op_info = ""; } -/*********************************************************************//** -Checks if a table is such that we automatically created a clustered -index on it (on row id). -@return TRUE if the clustered index was generated automatically */ -ibool -row_table_got_default_clust_index( -/*==============================*/ - const dict_table_t* table) /*!< in: table */ -{ - const dict_index_t* clust_index; - - clust_index = dict_table_get_first_index(table); - - return(dict_index_get_nth_col(clust_index, 0)->mtype == DATA_SYS); -} - /*********************************************************************//** Locks the data dictionary in shared mode from modifications, for performing foreign key check, rollback, or other operation invisible to MySQL. */ @@ -2422,7 +2370,7 @@ row_create_table_for_mysql( trx_t* trx, /*!< in/out: transaction */ bool commit, /*!< in: if true, commit the transaction */ fil_encryption_t mode, /*!< in: encryption mode */ - ulint key_id) /*!< in: encryption key_id */ + uint32_t key_id) /*!< in: encryption key_id */ { tab_node_t* node; mem_heap_t* heap; @@ -3259,7 +3207,7 @@ row_discard_tablespace( /* All persistent operations successful, update the data dictionary memory cache. */ - table->ibd_file_missing = TRUE; + table->file_unreadable = true; table->flags2 |= DICT_TF2_DISCARDED; @@ -3298,7 +3246,7 @@ row_discard_tablespace( /*********************************************************************//** Discards the tablespace of a table which stored in an .ibd file. Discarding means that this function renames the .ibd file and assigns a new table id for -the table. Also the flag table->ibd_file_missing is set to TRUE. +the table. Also the file_unreadable flag is set. @return error code or DB_SUCCESS */ dberr_t row_discard_tablespace_for_mysql( @@ -3315,8 +3263,6 @@ row_discard_tablespace_for_mysql( if (table == 0) { err = DB_TABLE_NOT_FOUND; - } else if (table->is_encrypted) { - err = DB_DECRYPTION_FAILED; } else if (dict_table_is_temporary(table)) { ib_senderrf(trx->mysql_thd, IB_LOG_LEVEL_ERROR, @@ -3324,7 +3270,7 @@ row_discard_tablespace_for_mysql( err = DB_ERROR; - } else if (table->space == srv_sys_space.space_id()) { + } else if (table->space == TRX_SYS_SPACE) { char table_name[MAX_FULL_NAME_LEN + 1]; innobase_format_name( @@ -3571,8 +3517,7 @@ row_drop_single_table_tablespace( /* If the tablespace is not in the cache, just delete the file. */ if (!fil_space_for_table_exists_in_mem( - space_id, tablename, true, false, NULL, 0, NULL, - table_flags)) { + space_id, tablename, true, false, NULL, 0, table_flags)) { /* Force a delete of any discarded or temporary files. */ fil_delete_file(filepath); @@ -3655,18 +3600,6 @@ row_drop_table_for_mysql( err = DB_TABLE_NOT_FOUND; goto funct_exit; } - /* If table is encrypted and table page encryption failed - return error. */ - if (table->is_encrypted) { - - if (table->can_be_evicted) { - dict_table_move_from_lru_to_non_lru(table); - } - - dict_table_close(table, TRUE, FALSE); - err = DB_DECRYPTION_FAILED; - goto funct_exit; - } /* This function is called recursively via fts_drop_tables(). */ if (!trx_is_started(trx)) { @@ -3716,7 +3649,13 @@ row_drop_table_for_mysql( dict_stats_recalc_pool_del(table); dict_stats_defrag_pool_del(table, NULL); - btr_defragment_remove_table(table); + if (btr_defragment_thread_active) { + /* During fts_drop_orphaned_tables() in + recv_recovery_rollback_active() the + btr_defragment_mutex has not yet been + initialized by btr_defragment_init(). */ + btr_defragment_remove_table(table); + } /* Remove stats for this table and all of its indexes from the persistent storage if it exists and if there are stats for this @@ -3922,19 +3861,6 @@ row_drop_table_for_mysql( we need to avoid running removal of these entries. */ if (!dict_table_is_temporary(table)) { - /* If table has not yet have crypt_data, try to read it to - make freeing the table easier. */ - if (!table->crypt_data) { - if (fil_space_t* space = fil_space_acquire_silent( - table->space)) { - /* We use crypt data in dict_table_t - in ha_innodb.cc to push warnings to - user thread. */ - table->crypt_data = space->crypt_data; - fil_space_release(space); - } - } - /* We use the private SQL parser of Innobase to generate the query graphs needed in deleting the dictionary data from system tables in Innobase. Deleting a row from SYS_INDEXES table also @@ -4065,13 +3991,11 @@ row_drop_table_for_mysql( switch (err) { ulint space_id; - bool ibd_file_missing; bool is_discarded; ulint table_flags; case DB_SUCCESS: space_id = table->space; - ibd_file_missing = table->ibd_file_missing; is_discarded = dict_table_is_discarded(table); table_flags = table->flags; ut_ad(!dict_table_is_temporary(table)); @@ -4102,8 +4026,7 @@ row_drop_table_for_mysql( /* Do not attempt to drop known-to-be-missing tablespaces, nor the system tablespace. */ - if (is_discarded || ibd_file_missing - || is_system_tablespace(space_id)) { + if (is_discarded || is_system_tablespace(space_id)) { break; } @@ -4336,7 +4259,8 @@ loop: << table->name << ".frm' was lost."; } - if (table->ibd_file_missing) { + if (!table->is_readable() + && !fil_space_get(table->space)) { ib::warn() << "Missing .ibd file for table " << table->name << "."; } @@ -4515,10 +4439,8 @@ row_rename_table_for_mysql( ut_a(new_name != NULL); ut_ad(trx->state == TRX_STATE_ACTIVE); - if (srv_force_recovery) { - ib::info() << MODIFICATIONS_NOT_ALLOWED_MSG_FORCE_RECOVERY; - err = DB_READ_ONLY; - goto funct_exit; + if (high_level_read_only) { + return(DB_READ_ONLY); } else if (row_mysql_is_system_table(new_name)) { @@ -4592,7 +4514,8 @@ row_rename_table_for_mysql( err = DB_TABLE_NOT_FOUND; goto funct_exit; - } else if (table->ibd_file_missing + } else if (!table->is_readable() + && fil_space_get(table->space) == NULL && !dict_table_is_discarded(table)) { err = DB_TABLE_NOT_FOUND; @@ -4658,10 +4581,18 @@ row_rename_table_for_mysql( /* SYS_TABLESPACES and SYS_DATAFILES need to be updated if the table is in a single-table tablespace. */ if (err == DB_SUCCESS - && dict_table_is_file_per_table(table) - && !table->ibd_file_missing) { + && dict_table_is_file_per_table(table)) { /* Make a new pathname to update SYS_DATAFILES. */ char* new_path = row_make_new_pathname(table, new_name); + char* old_path = fil_space_get_first_path(table->space); + + /* If old path and new path are the same means tablename + has not changed and only the database name holding the table + has changed so we need to make the complete filepath again. */ + if (!dict_tables_have_same_db(old_name, new_name)) { + ut_free(new_path); + new_path = fil_make_filepath(NULL, new_name, IBD, false); + } info = pars_info_create(); @@ -4681,6 +4612,7 @@ row_rename_table_for_mysql( "END;\n" , FALSE, trx); + ut_free(old_path); ut_free(new_path); } if (err != DB_SUCCESS) { @@ -5111,12 +5043,10 @@ loop: case DB_INTERRUPTED: goto func_exit; default: - { - const char* doing = "CHECK TABLE"; - ib::warn() << doing << " on index " << index->name << " of" + ib::warn() << "CHECK TABLE on index " << index->name << " of" " table " << index->table->name << " returned " << ret; - /* fall through (this error is ignored by CHECK TABLE) */ - } + /* (this error is ignored by CHECK TABLE) */ + /* fall through */ case DB_END_OF_INDEX: ret = DB_SUCCESS; func_exit: diff --git a/storage/innobase/row/row0purge.cc b/storage/innobase/row/row0purge.cc index 492d864ec96..cecd127e71e 100644 --- a/storage/innobase/row/row0purge.cc +++ b/storage/innobase/row/row0purge.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1997, 2017, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -26,6 +27,7 @@ Created 3/14/1997 Heikki Tuuri #include "row0purge.h" #include "fsp0fsp.h" #include "mach0data.h" +#include "dict0stats.h" #include "trx0rseg.h" #include "trx0trx.h" #include "trx0roll.h" @@ -158,6 +160,9 @@ row_purge_remove_clust_if_poss_low( } ut_ad(rec_get_deleted_flag(rec, rec_offs_comp(offsets))); + /* In delete-marked records, DB_TRX_ID must + always refer to an existing undo log record. */ + ut_ad(row_get_rec_trx_id(rec, index, offsets)); if (mode == BTR_MODIFY_LEAF) { success = btr_cur_optimistic_delete( @@ -535,8 +540,9 @@ row_purge_remove_sec_if_poss_leaf( success = false; } } - /* fall through (the index entry is still needed, + /* (The index entry is still needed, or the deletion succeeded) */ + /* fall through */ case ROW_NOT_DELETED_REF: /* The index entry is still needed. */ case ROW_BUFFERED: @@ -951,10 +957,13 @@ row_purge_record_func( switch (node->rec_type) { case TRX_UNDO_DEL_MARK_REC: purged = row_purge_del_mark(node); - if (!purged) { - break; + if (purged) { + if (node->table->stat_initialized + && srv_stats_include_delete_marked) { + dict_stats_update_if_needed(node->table); + } + MONITOR_INC(MONITOR_N_DEL_ROW_PURGE); } - MONITOR_INC(MONITOR_N_DEL_ROW_PURGE); break; default: if (!updated_extern) { diff --git a/storage/innobase/row/row0quiesce.cc b/storage/innobase/row/row0quiesce.cc index 8bd1f5730a2..54583956107 100644 --- a/storage/innobase/row/row0quiesce.cc +++ b/storage/innobase/row/row0quiesce.cc @@ -589,16 +589,18 @@ row_quiesce_table_complete( ++count; } - /* Remove the .cfg file now that the user has resumed - normal operations. Otherwise it will cause problems when - the user tries to drop the database (remove directory). */ - char cfg_name[OS_FILE_MAX_PATH]; + if (!opt_bootstrap) { + /* Remove the .cfg file now that the user has resumed + normal operations. Otherwise it will cause problems when + the user tries to drop the database (remove directory). */ + char cfg_name[OS_FILE_MAX_PATH]; - srv_get_meta_data_filename(table, cfg_name, sizeof(cfg_name)); + srv_get_meta_data_filename(table, cfg_name, sizeof(cfg_name)); - os_file_delete_if_exists(innodb_data_file_key, cfg_name, NULL); + os_file_delete_if_exists(innodb_data_file_key, cfg_name, NULL); - ib::info() << "Deleting the meta-data file '" << cfg_name << "'"; + ib::info() << "Deleting the meta-data file '" << cfg_name << "'"; + } if (trx_purge_state() != PURGE_STATE_DISABLED) { trx_purge_run(); diff --git a/storage/innobase/row/row0sel.cc b/storage/innobase/row/row0sel.cc index 229bd567c48..d83bb2c239a 100644 --- a/storage/innobase/row/row0sel.cc +++ b/storage/innobase/row/row0sel.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1997, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, Google Inc. Copyright (c) 2015, 2017, MariaDB Corporation. @@ -183,6 +183,9 @@ row_sel_sec_rec_is_for_clust_rec( if (rec_get_deleted_flag(clust_rec, dict_table_is_comp(clust_index->table))) { + /* In delete-marked records, DB_TRX_ID must + always refer to an existing undo log record. */ + ut_ad(rec_get_trx_id(clust_rec, clust_index)); /* The clustered index record is delete-marked; it is not visible in the read view. Besides, @@ -1793,6 +1796,7 @@ rec_loop: switch (err) { case DB_SUCCESS_LOCKED_REC: err = DB_SUCCESS; + /* fall through */ case DB_SUCCESS: break; default: @@ -1853,6 +1857,7 @@ skip_lock: switch (err) { case DB_SUCCESS_LOCKED_REC: err = DB_SUCCESS; + /* fall through */ case DB_SUCCESS: break; default: @@ -2042,6 +2047,11 @@ skip_lock: if (rec_get_deleted_flag(clust_rec, dict_table_is_comp(plan->table))) { + /* In delete-marked records, DB_TRX_ID must + always refer to an existing update_undo log record. */ + ut_ad(rec_get_trx_id(clust_rec, + dict_table_get_first_index( + plan->table))); /* The record is delete marked: we can skip it */ @@ -2231,16 +2241,7 @@ stop_for_a_while: btr_pcur_store_position(&(plan->pcur), &mtr); mtr_commit(&mtr); - -#ifdef BTR_CUR_HASH_ADAPT -# ifdef UNIV_DEBUG - { - btrsea_sync_check check(true); - - ut_ad(!sync_check_iterate(check)); - } -# endif /* UNIV_DEBUG */ -#endif /* BTR_CUR_HASH_ADAPT */ + ut_ad(!sync_check_iterate(sync_check())); err = DB_SUCCESS; goto func_exit; @@ -2258,14 +2259,7 @@ commit_mtr_for_a_while: mtr_commit(&mtr); mtr_has_extra_clust_latch = FALSE; - -#ifdef UNIV_DEBUG - { - dict_sync_check check(true); - - ut_ad(!sync_check_iterate(check)); - } -#endif /* UNIV_DEBUG */ + ut_ad(!sync_check_iterate(dict_sync_check())); goto table_loop; @@ -2280,20 +2274,13 @@ lock_wait_or_error: mtr_commit(&mtr); -#ifdef UNIV_DEBUG - { - dict_sync_check check(true); - - ut_ad(!sync_check_iterate(check)); - } -#endif /* UNIV_DEBUG */ - func_exit: #ifdef BTR_CUR_HASH_ADAPT if (search_latch_locked) { btr_search_s_unlock(index); } #endif /* BTR_CUR_HASH_ADAPT */ + ut_ad(!sync_check_iterate(dict_sync_check())); if (heap != NULL) { mem_heap_free(heap); @@ -2634,10 +2621,9 @@ row_sel_convert_mysql_key_to_innobase( data_field_len = data_offset + data_len; } else { /* The key field is a column prefix of a BLOB - or TEXT, except DATA_POINT of GEOMETRY. */ + or TEXT. */ - ut_a(field->prefix_len > 0 - || DATA_POINT_MTYPE(type)); + ut_a(field->prefix_len > 0); /* MySQL stores the actual data length to the first 2 bytes after the optional SQL NULL @@ -2647,18 +2633,12 @@ row_sel_convert_mysql_key_to_innobase( seems to reserve field->prefix_len bytes for storing this field in the key value buffer, even though the actual value only takes data - len bytes from the start. - For POINT of GEOMETRY, which has no prefix - because it's now a fixed length type in - InnoDB, we have to get DATA_POINT_LEN bytes, - which is original prefix length of POINT. */ + len bytes from the start. */ data_len = key_ptr[data_offset] + 256 * key_ptr[data_offset + 1]; data_field_len = data_offset + 2 - + (type == DATA_POINT - ? DATA_POINT_LEN - : field->prefix_len); + + field->prefix_len; data_offset += 2; @@ -2801,28 +2781,14 @@ Stores a non-SQL-NULL field in the MySQL format. The counterpart of this function is row_mysql_store_col_in_innobase_format() in row0mysql.cc. */ void row_sel_field_store_in_mysql_format_func( -/*=====================================*/ - byte* dest, /*!< in/out: buffer where to store; NOTE - that BLOBs are not in themselves - stored here: the caller must allocate - and copy the BLOB into buffer before, - and pass the pointer to the BLOB in - 'data' */ + byte* dest, const mysql_row_templ_t* templ, - /*!< in: MySQL column template. - Its following fields are referenced: - type, is_unsigned, mysql_col_len, - mbminlen, mbmaxlen */ #ifdef UNIV_DEBUG const dict_index_t* index, - /*!< in: InnoDB index */ ulint field_no, - /*!< in: templ->rec_field_no or - templ->clust_rec_field_no or - templ->icp_rec_field_no */ #endif /* UNIV_DEBUG */ - const byte* data, /*!< in: data to store */ - ulint len) /*!< in: length of the data */ + const byte* data, + ulint len) { byte* ptr; #ifdef UNIV_DEBUG @@ -2920,8 +2886,6 @@ row_sel_field_store_in_mysql_format_func( len); break; - case DATA_POINT: - case DATA_VAR_POINT: case DATA_GEOMETRY: /* We store all geometry data as BLOB data at server layer. */ row_mysql_store_geometry(dest, templ->mysql_col_len, data, len); @@ -2995,27 +2959,30 @@ row_sel_field_store_in_mysql_format_func( # define row_sel_store_mysql_field(m,p,r,i,o,f,t) \ row_sel_store_mysql_field_func(m,p,r,o,f,t) #endif /* UNIV_DEBUG */ -/**************************************************************//** -Convert a field in the Innobase format to a field in the MySQL format. */ +/** Convert a field in the Innobase format to a field in the MySQL format. +@param[out] mysql_rec record in the MySQL format +@param[in,out] prebuilt prebuilt struct +@param[in] rec InnoDB record; must be protected + by a page latch +@param[in] index index of rec +@param[in] offsets array returned by rec_get_offsets() +@param[in] field_no templ->rec_field_no or + templ->clust_rec_field_no + or templ->icp_rec_field_no +@param[in] templ row template +*/ static MY_ATTRIBUTE((warn_unused_result)) ibool row_sel_store_mysql_field_func( -/*===========================*/ - byte* mysql_rec, /*!< out: record in the - MySQL format */ - row_prebuilt_t* prebuilt, /*!< in/out: prebuilt struct */ - const rec_t* rec, /*!< in: InnoDB record; - must be protected by - a page latch */ + byte* mysql_rec, + row_prebuilt_t* prebuilt, + const rec_t* rec, #ifdef UNIV_DEBUG - const dict_index_t* index, /*!< in: index of rec */ -#endif /* UNIV_DEBUG */ - const ulint* offsets, /*!< in: array returned by - rec_get_offsets() */ - ulint field_no, /*!< in: templ->rec_field_no or - templ->clust_rec_field_no or - templ->icp_rec_field_no */ - const mysql_row_templ_t*templ) /*!< in: row template */ + const dict_index_t* index, +#endif + const ulint* offsets, + ulint field_no, + const mysql_row_templ_t*templ) { DBUG_ENTER("row_sel_store_mysql_field_func"); @@ -3036,9 +3003,7 @@ row_sel_store_mysql_field_func( mem_heap_t* heap; /* Copy an externally stored field to a temporary heap */ - trx_assert_no_search_latch(prebuilt->trx); ut_ad(field_no == templ->clust_rec_field_no); - ut_ad(templ->type != DATA_POINT); if (DATA_LARGE_MTYPE(templ->type)) { if (prebuilt->blob_heap == NULL) { @@ -3118,10 +3083,7 @@ row_sel_store_mysql_field_func( will be invalid as soon as the mini-transaction is committed and the page latch on the clustered index page is - released. - For DATA_POINT, it's stored like CHAR in InnoDB, - but it should be a BLOB field in MySQL layer. So we - still treated it as BLOB here. */ + released. */ if (prebuilt->blob_heap == NULL) { prebuilt->blob_heap = mem_heap_create( @@ -3151,31 +3113,32 @@ row_sel_store_mysql_field_func( DBUG_RETURN(TRUE); } -/**************************************************************//** -Convert a row in the Innobase format to a row in the MySQL format. +/** Convert a row in the Innobase format to a row in the MySQL format. Note that the template in prebuilt may advise us to copy only a few columns to mysql_rec, other columns are left blank. All columns may not be needed in the query. +@param[out] mysql_rec row in the MySQL format +@param[in] prebuilt prebuilt structure +@param[in] rec Innobase record in the index + which was described in prebuilt's + template, or in the clustered index; + must be protected by a page latch +@param[in] vrow virtual columns +@param[in] rec_clust whether the rec in the clustered index +@param[in] index index of rec +@param[in] offsets array returned by rec_get_offsets(rec) @return TRUE on success, FALSE if not all columns could be retrieved */ static MY_ATTRIBUTE((warn_unused_result)) ibool row_sel_store_mysql_rec( -/*====================*/ - byte* mysql_rec, /*!< out: row in the MySQL format */ - row_prebuilt_t* prebuilt, /*!< in: prebuilt struct */ - const rec_t* rec, /*!< in: Innobase record in the index - which was described in prebuilt's - template, or in the clustered index; - must be protected by a page latch */ - const dtuple_t* vrow, /*!< in: virtual columns */ - ibool rec_clust, /*!< in: TRUE if rec is in the - clustered index instead of - prebuilt->index */ - const dict_index_t* index, /*!< in: index of rec */ - const ulint* offsets) /*!< in: array returned by - rec_get_offsets(rec) */ + byte* mysql_rec, + row_prebuilt_t* prebuilt, + const rec_t* rec, + const dtuple_t* vrow, + bool rec_clust, + const dict_index_t* index, + const ulint* offsets) { - ulint i; DBUG_ENTER("row_sel_store_mysql_rec"); ut_ad(rec_clust || index == prebuilt->index); @@ -3185,7 +3148,7 @@ row_sel_store_mysql_rec( row_mysql_prebuilt_free_blob_heap(prebuilt); } - for (i = 0; i < prebuilt->n_template; i++) { + for (ulint i = 0; i < prebuilt->n_template; i++) { const mysql_row_templ_t*templ = &prebuilt->mysql_template[i]; if (templ->is_virtual && dict_index_is_clust(index)) { @@ -3363,11 +3326,12 @@ row_sel_get_clust_rec_for_mysql( dberr_t err; trx_t* trx; - srv_stats.n_sec_rec_cluster_reads.inc(); - *out_rec = NULL; trx = thr_get_trx(thr); + srv_stats.n_sec_rec_cluster_reads.inc( + thd_get_thread_id(trx->mysql_thd)); + row_build_row_ref_in_tuple(prebuilt->clust_ref, rec, sec_index, *offsets, trx); @@ -3917,11 +3881,7 @@ row_sel_try_search_shortcut_for_mysql( ut_ad(!prebuilt->templ_contains_blob); btr_pcur_open_with_no_init(index, search_tuple, PAGE_CUR_GE, - BTR_SEARCH_LEAF, pcur, - (trx->has_search_latch) - ? RW_S_LATCH - : 0, - mtr); + BTR_SEARCH_LEAF, pcur, RW_S_LATCH, mtr); rec = btr_pcur_get_rec(pcur); if (!page_rec_is_user_rec(rec)) { @@ -3951,6 +3911,9 @@ row_sel_try_search_shortcut_for_mysql( } if (rec_get_deleted_flag(rec, dict_table_is_comp(index->table))) { + /* In delete-marked records, DB_TRX_ID must + always refer to an existing undo log record. */ + ut_ad(row_get_rec_trx_id(rec, index, *offsets)); return(SEL_EXHAUSTED); } @@ -4026,7 +3989,7 @@ row_search_idx_cond_check( if (!prebuilt->need_to_access_clustered || dict_index_is_clust(prebuilt->index)) { if (!row_sel_store_mysql_rec( - mysql_rec, prebuilt, rec, NULL, FALSE, + mysql_rec, prebuilt, rec, NULL, false, prebuilt->index, offsets)) { ut_ad(dict_index_is_clust(prebuilt->index)); return(ICP_NO_MATCH); @@ -4178,26 +4141,16 @@ row_search_mvcc( DBUG_RETURN(DB_END_OF_INDEX); } -#ifdef BTR_CUR_HASH_ADAPT -# ifdef UNIV_DEBUG - { - btrsea_sync_check check(trx->has_search_latch); - ut_ad(!sync_check_iterate(check)); - } -# endif /* UNIV_DEBUG */ -#endif /* BTR_CUR_HASH_ADAPT */ + ut_ad(!sync_check_iterate(sync_check())); if (dict_table_is_discarded(prebuilt->table)) { DBUG_RETURN(DB_TABLESPACE_DELETED); - } else if (prebuilt->table->ibd_file_missing) { - - DBUG_RETURN(DB_TABLESPACE_NOT_FOUND); - - } else if (prebuilt->table->is_encrypted) { - - return(DB_DECRYPTION_FAILED); + } else if (!prebuilt->table->is_readable()) { + DBUG_RETURN(fil_space_get(prebuilt->table->space) + ? DB_DECRYPTION_FAILED + : DB_TABLESPACE_NOT_FOUND); } else if (!prebuilt->index_usable) { DBUG_RETURN(DB_MISSING_HISTORY); @@ -4213,8 +4166,6 @@ row_search_mvcc( && (prebuilt->read_just_key || prebuilt->m_read_virtual_key); - trx_assert_no_search_latch(trx); - /* Reset the new record lock info if srv_locks_unsafe_for_binlog is set or session is using a READ COMMITED isolation level. Then we are able to remove the record locks set here on an individual @@ -4369,9 +4320,7 @@ row_search_mvcc( and if we try that, we can deadlock on the adaptive hash index semaphore! */ - trx_assert_no_search_latch(trx); rw_lock_s_lock(btr_get_search_latch(index)); - trx->has_search_latch = true; switch (row_sel_try_search_shortcut_for_mysql( &rec, prebuilt, &offsets, &heap, @@ -4400,7 +4349,8 @@ row_search_mvcc( if (!row_sel_store_mysql_rec( buf, prebuilt, - rec, NULL, FALSE, index, offsets)) { + rec, NULL, false, index, + offsets)) { /* Only fresh inserts may contain incomplete externally stored columns. Pretend that such @@ -4425,7 +4375,6 @@ row_search_mvcc( err = DB_SUCCESS; rw_lock_s_unlock(btr_get_search_latch(index)); - trx->has_search_latch = false; goto func_exit; @@ -4436,7 +4385,6 @@ row_search_mvcc( err = DB_RECORD_NOT_FOUND; rw_lock_s_unlock(btr_get_search_latch(index)); - trx->has_search_latch = false; /* NOTE that we do NOT store the cursor position */ @@ -4454,7 +4402,6 @@ row_search_mvcc( mtr_start(&mtr); rw_lock_s_unlock(btr_get_search_latch(index)); - trx->has_search_latch = false; } } #endif /* BTR_CUR_HASH_ADAPT */ @@ -4462,8 +4409,6 @@ row_search_mvcc( /*-------------------------------------------------------------*/ /* PHASE 3: Open or restore index cursor position */ - trx_assert_no_search_latch(trx); - spatial_search = dict_index_is_spatial(index) && mode >= PAGE_CUR_CONTAIN; @@ -4654,6 +4599,7 @@ wait_table_again: switch (err) { case DB_SUCCESS_LOCKED_REC: err = DB_SUCCESS; + /* fall through */ case DB_SUCCESS: break; default: @@ -4673,7 +4619,7 @@ wait_table_again: " used key_id is not available. " " Can't continue reading table.", prebuilt->table->name); - index->table->is_encrypted = true; + index->table->file_unreadable = true; } rec = NULL; goto lock_wait_or_error; @@ -4695,7 +4641,7 @@ rec_loop: rec = btr_pcur_get_rec(pcur); - if (!rec) { + if (!index->table->is_readable()) { err = DB_DECRYPTION_FAILED; goto lock_wait_or_error; } @@ -4736,6 +4682,7 @@ rec_loop: switch (err) { case DB_SUCCESS_LOCKED_REC: err = DB_SUCCESS; + /* fall through */ case DB_SUCCESS: break; default: @@ -4821,7 +4768,7 @@ wrong_offs: if (!rec_validate(rec, offsets) || !btr_index_rec_validate(rec, index, FALSE)) { - ib::info() << "Index corruption: rec offs " + ib::error() << "Index corruption: rec offs " << page_offset(rec) << " next offs " << next_offs << ", page no " << page_get_page_no(page_align(rec)) @@ -4997,6 +4944,7 @@ no_gap_lock: prebuilt->new_rec_locks = 1; } err = DB_SUCCESS; + /* fall through */ case DB_SUCCESS: break; case DB_LOCK_WAIT: @@ -5154,6 +5102,10 @@ locks_ok: page_rec_is_comp() cannot be used! */ if (rec_get_deleted_flag(rec, comp)) { + /* In delete-marked records, DB_TRX_ID must + always refer to an existing undo log record. */ + ut_ad(index != clust_index + || row_get_rec_trx_id(rec, index, offsets)); /* The record is delete-marked: we can skip it */ @@ -5363,7 +5315,7 @@ requires_clust_rec: appropriate version of the clustered index record. */ if (!row_sel_store_mysql_rec( buf, prebuilt, result_rec, vrow, - TRUE, clust_index, offsets)) { + true, clust_index, offsets)) { goto next_rec; } } @@ -5389,7 +5341,6 @@ requires_clust_rec: && prebuilt->select_lock_type == LOCK_NONE && !prebuilt->m_no_prefetch && !prebuilt->templ_contains_blob - && !prebuilt->templ_contains_fixed_point && !prebuilt->clust_index_was_generated && !prebuilt->used_in_HANDLER && prebuilt->template_type != ROW_MYSQL_DUMMY_TEMPLATE @@ -5768,15 +5719,7 @@ func_exit: } } -#ifdef BTR_CUR_HASH_ADAPT -# ifdef UNIV_DEBUG - { - btrsea_sync_check check(trx->has_search_latch); - - ut_ad(!sync_check_iterate(check)); - } -# endif /* UNIV_DEBUG */ -#endif /* BTR_CUR_HASH_ADAPT */ + ut_ad(!sync_check_iterate(sync_check())); DEBUG_SYNC_C("innodb_row_search_for_mysql_exit"); diff --git a/storage/innobase/row/row0trunc.cc b/storage/innobase/row/row0trunc.cc index 1fc30e714f4..afa49082136 100644 --- a/storage/innobase/row/row0trunc.cc +++ b/storage/innobase/row/row0trunc.cc @@ -1681,10 +1681,13 @@ row_truncate_sanity_checks( return(DB_TABLESPACE_DELETED); - } else if (table->ibd_file_missing) { - - return(DB_TABLESPACE_NOT_FOUND); + } else if (!table->is_readable()) { + if (fil_space_get(table->space) == NULL) { + return(DB_TABLESPACE_NOT_FOUND); + } else { + return(DB_DECRYPTION_FAILED); + } } else if (dict_table_is_corrupted(table)) { return(DB_TABLE_CORRUPT); @@ -2015,7 +2018,7 @@ row_truncate_table_for_mysql( space_size -= ib_vector_size(table->fts->indexes); } - fil_reinit_space_header(table->space, space_size, trx); + fil_reinit_space_header_for_table(table, space_size, trx); } DBUG_EXECUTE_IF("ib_trunc_crash_with_intermediate_log_checkpoint", diff --git a/storage/innobase/row/row0uins.cc b/storage/innobase/row/row0uins.cc index 9288adb21a4..0fce0731307 100644 --- a/storage/innobase/row/row0uins.cc +++ b/storage/innobase/row/row0uins.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1997, 2017, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -25,6 +26,7 @@ Created 2/25/1997 Heikki Tuuri #include "row0uins.h" #include "dict0dict.h" +#include "dict0stats.h" #include "dict0boot.h" #include "dict0crea.h" #include "trx0undo.h" @@ -192,19 +194,15 @@ row_undo_ins_remove_sec_low( dberr_t err = DB_SUCCESS; mtr_t mtr; enum row_search_result search_result; - ibool modify_leaf = false; + const bool modify_leaf = mode == BTR_MODIFY_LEAF; - log_free_check(); memset(&pcur, 0, sizeof(pcur)); - mtr_start(&mtr); - mtr.set_named_space(index->space); - dict_disable_redo_if_temporary(index->table, &mtr); + row_mtr_start(&mtr, index, !modify_leaf); - if (mode == BTR_MODIFY_LEAF) { + if (modify_leaf) { mode = BTR_MODIFY_LEAF | BTR_ALREADY_S_LATCHED; mtr_s_lock(dict_index_get_lock(index), &mtr); - modify_leaf = true; } else { ut_ad(mode == (BTR_MODIFY_TREE | BTR_LATCH_FOR_DELETE)); mtr_sx_lock(dict_index_get_lock(index), &mtr); @@ -215,7 +213,7 @@ row_undo_ins_remove_sec_low( } if (dict_index_is_spatial(index)) { - if (mode & BTR_MODIFY_LEAF) { + if (modify_leaf) { mode |= BTR_RTREE_DELETE_MARK; } btr_pcur_get_btr_cur(&pcur)->thr = thr; @@ -229,6 +227,14 @@ row_undo_ins_remove_sec_low( case ROW_NOT_FOUND: goto func_exit; case ROW_FOUND: + if (dict_index_is_spatial(index) + && rec_get_deleted_flag( + btr_pcur_get_rec(&pcur), + dict_table_is_comp(index->table))) { + ib::error() << "Record found in index " << index->name + << " is deleted marked on insert rollback."; + ut_ad(0); + } break; case ROW_BUFFERED: @@ -239,15 +245,6 @@ row_undo_ins_remove_sec_low( ut_error; } - if (search_result == ROW_FOUND && dict_index_is_spatial(index)) { - rec_t* rec = btr_pcur_get_rec(&pcur); - if (rec_get_deleted_flag(rec, - dict_table_is_comp(index->table))) { - ib::error() << "Record found in index " << index->name - << " is deleted marked on insert rollback."; - } - } - btr_cur = btr_pcur_get_btr_cur(&pcur); if (modify_leaf) { @@ -508,6 +505,23 @@ row_undo_ins( mutex_exit(&dict_sys->mutex); } + + if (err == DB_SUCCESS && node->table->stat_initialized) { + /* Not protected by dict_table_stats_lock() for + performance reasons, we would rather get garbage + in stat_n_rows (which is just an estimate anyway) + than protecting the following code with a latch. */ + dict_table_n_rows_dec(node->table); + + /* Do not attempt to update statistics when + executing ROLLBACK in the InnoDB SQL + interpreter, because in that case we would + already be holding dict_sys->mutex, which + would be acquired when updating statistics. */ + if (!dict_locked) { + dict_stats_update_if_needed(node->table); + } + } } dict_table_close(node->table, dict_locked, FALSE); diff --git a/storage/innobase/row/row0umod.cc b/storage/innobase/row/row0umod.cc index ba072a72aa1..0a2a68d1fef 100644 --- a/storage/innobase/row/row0umod.cc +++ b/storage/innobase/row/row0umod.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1997, 2017, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -27,11 +28,13 @@ Created 2/27/1997 Heikki Tuuri #include "row0umod.h" #include "dict0dict.h" +#include "dict0stats.h" #include "dict0boot.h" #include "trx0undo.h" #include "trx0roll.h" #include "btr0btr.h" #include "mach0data.h" +#include "ibuf0ibuf.h" #include "row0undo.h" #include "row0vers.h" #include "row0log.h" @@ -213,6 +216,9 @@ row_undo_mod_remove_clust_low( than the rolling-back one. */ ut_ad(rec_get_deleted_flag(btr_cur_get_rec(btr_cur), dict_table_is_comp(node->table))); + /* In delete-marked records, DB_TRX_ID must + always refer to an existing update_undo log record. */ + ut_ad(rec_get_trx_id(btr_cur_get_rec(btr_cur), btr_cur->index)); if (mode == BTR_MODIFY_LEAF) { err = btr_cur_optimistic_delete(btr_cur, 0, mtr) @@ -348,8 +354,9 @@ row_undo_mod_clust( * it can be reallocated at any time after this mtr-commits * which is just below */ - ut_ad(srv_immediate_scrub_data_uncompressed || - rec_get_trx_id(btr_pcur_get_rec(pcur), index) == node->new_trx_id); + ut_ad(srv_immediate_scrub_data_uncompressed + || row_get_rec_trx_id(btr_pcur_get_rec(pcur), index, offsets) + == node->new_trx_id); btr_pcur_commit_specify_mtr(pcur, &mtr); @@ -416,23 +423,15 @@ row_undo_mod_del_mark_or_remove_sec_low( mtr_t mtr; mtr_t mtr_vers; row_search_result search_result; - ibool modify_leaf = false; + const bool modify_leaf = mode == BTR_MODIFY_LEAF; - log_free_check(); - //mtr_start_trx(&mtr, thr_get_trx(thr)); - mtr_start(&mtr); - mtr.set_named_space(index->space); - dict_disable_redo_if_temporary(index->table, &mtr); - - if (mode == BTR_MODIFY_LEAF) { - modify_leaf = true; - } + row_mtr_start(&mtr, index, !modify_leaf); if (!index->is_committed()) { /* The index->online_status may change if the index is or was being created online, but not committed yet. It is protected by index->lock. */ - if (mode == BTR_MODIFY_LEAF) { + if (modify_leaf) { mode = BTR_MODIFY_LEAF | BTR_ALREADY_S_LATCHED; mtr_s_lock(dict_index_get_lock(index), &mtr); } else { @@ -453,7 +452,7 @@ row_undo_mod_del_mark_or_remove_sec_low( btr_cur = btr_pcur_get_btr_cur(&pcur); if (dict_index_is_spatial(index)) { - if (mode & BTR_MODIFY_LEAF) { + if (modify_leaf) { btr_cur->thr = thr; mode |= BTR_RTREE_DELETE_MARK; } @@ -513,6 +512,7 @@ row_undo_mod_del_mark_or_remove_sec_low( ib::error() << "Record found in index " << index->name << " is deleted marked" " on rollback update."; + ut_ad(0); } } @@ -624,11 +624,7 @@ row_undo_mod_del_unmark_sec_and_undo_update( } try_again: - log_free_check(); - //mtr_start_trx(&mtr, thr_get_trx(thr)); - mtr_start(&mtr); - mtr.set_named_space(index->space); - dict_disable_redo_if_temporary(index->table, &mtr); + row_mtr_start(&mtr, index, !(mode & BTR_MODIFY_LEAF)); if (!index->is_committed()) { /* The index->online_status may change if the index is @@ -1169,16 +1165,19 @@ close_table: node->new_trx_id = trx_id; node->cmpl_info = cmpl_info; - if (UNIV_UNLIKELY(!row_undo_search_clust_to_pcur(node))) { - /* This should never occur. As long as this - rolling-back transaction exists, the PRIMARY KEY value - pointed to by the undo log record must exist. + if (!row_undo_search_clust_to_pcur(node)) { + /* As long as this rolling-back transaction exists, + the PRIMARY KEY value pointed to by the undo log + record must exist. But, it is possible that the record + was not modified yet (the DB_ROLL_PTR does not match + node->roll_ptr) and thus there is nothing to roll back. + btr_cur_upd_lock_and_undo() only writes the undo log record after successfully acquiring an exclusive lock on the the clustered index record. That lock will not be released before the transaction is committed or fully rolled back. */ - ut_ad(0); + ut_ad(node->pcur.btr_cur.low_match == node->ref->n_fields); goto close_table; } @@ -1248,8 +1247,38 @@ row_undo_mod( } if (err == DB_SUCCESS) { - err = row_undo_mod_clust(node, thr); + + bool update_statistics + = !(node->cmpl_info & UPD_NODE_NO_ORD_CHANGE); + + if (err == DB_SUCCESS && node->table->stat_initialized) { + switch (node->rec_type) { + case TRX_UNDO_UPD_EXIST_REC: + break; + case TRX_UNDO_DEL_MARK_REC: + dict_table_n_rows_inc(node->table); + update_statistics = update_statistics + || !srv_stats_include_delete_marked; + break; + case TRX_UNDO_UPD_DEL_REC: + dict_table_n_rows_dec(node->table); + update_statistics = update_statistics + || !srv_stats_include_delete_marked; + break; + } + + /* Do not attempt to update statistics when + executing ROLLBACK in the InnoDB SQL + interpreter, because in that case we would + already be holding dict_sys->mutex, which + would be acquired when updating statistics. */ + if (update_statistics && !dict_locked) { + dict_stats_update_if_needed(node->table); + } else { + node->table->stat_modified_counter++; + } + } } dict_table_close(node->table, dict_locked, FALSE); diff --git a/storage/innobase/row/row0upd.cc b/storage/innobase/row/row0upd.cc index 18ea3cf3cf8..a2be9a69a56 100644 --- a/storage/innobase/row/row0upd.cc +++ b/storage/innobase/row/row0upd.cc @@ -1,7 +1,7 @@ /***************************************************************************** -Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2015, 2016, MariaDB Corporation. +Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2015, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -256,6 +256,9 @@ row_upd_check_references_constraints( row_mysql_freeze_data_dictionary(trx); } + DEBUG_SYNC_C_IF_THD(thr_get_trx(thr)->mysql_thd, + "foreign_constraint_check_for_insert"); + for (dict_foreign_set::iterator it = table->referenced_set.begin(); it != table->referenced_set.end(); ++it) { @@ -283,6 +286,34 @@ row_upd_check_references_constraints( FALSE, FALSE, DICT_ERR_IGNORE_NONE); } + /* dict_operation_lock is held both here + (UPDATE or DELETE with FOREIGN KEY) and by TRUNCATE + TABLE operations. + If a TRUNCATE TABLE operation is in progress, + there can be 2 possible conditions: + 1) row_truncate_table_for_mysql() is not yet called. + 2) Truncate releases dict_operation_lock + during eviction of pages from buffer pool + for a file-per-table tablespace. + + In case of (1), truncate will wait for FK operation + to complete. + In case of (2), truncate will be rolled forward even + if it is interrupted. So if the foreign table is + undergoing a truncate, ignore the FK check. */ + + if (foreign_table) { + mutex_enter(&fil_system->mutex); + const fil_space_t* space = fil_space_get_by_id( + foreign_table->space); + const bool being_truncated = space + && space->is_being_truncated; + mutex_exit(&fil_system->mutex); + if (being_truncated) { + continue; + } + } + /* NOTE that if the thread ends up waiting for a lock we will release dict_operation_lock temporarily! But the counter on the table protects 'foreign' from @@ -424,6 +455,24 @@ func_exit: return(err); } + +/** Determine if a FOREIGN KEY constraint needs to be processed. +@param[in] node query node +@param[in] trx transaction +@return whether the node cannot be ignored */ +inline +bool +wsrep_must_process_fk(const upd_node_t* node, const trx_t* trx) +{ + if (que_node_get_type(node->common.parent) != QUE_NODE_UPDATE || + !wsrep_on(trx->mysql_thd)) { + return false; + } + + const upd_node_t* parent = static_cast(node->common.parent); + + return parent->cascade_upd_nodes->empty(); +} #endif /* WITH_WSREP */ /*********************************************************************//** @@ -2250,17 +2299,18 @@ row_upd_sec_index_entry( "before_row_upd_sec_index_entry"); mtr_start_trx(&mtr, trx); - mtr.set_named_space(index->space); - /* Disable REDO logging as lifetime of temp-tables is limited to - server or connection lifetime and so REDO information is not needed - on restart for recovery. - Disable locking as temp-tables are not shared across connection. */ - if (dict_table_is_temporary(index->table)) { - flags = BTR_NO_LOCKING_FLAG; + switch (index->space) { + case SRV_TMP_SPACE_ID: mtr.set_log_mode(MTR_LOG_NO_REDO); - } else { + flags = BTR_NO_LOCKING_FLAG; + break; + default: + mtr.set_named_space(index->space); + /* fall through */ + case IBUF_SPACE_ID: flags = 0; + break; } if (!index->is_committed()) { @@ -2383,29 +2433,19 @@ row_upd_sec_index_entry( row_ins_sec_index_entry() below */ if (!rec_get_deleted_flag( rec, dict_table_is_comp(index->table))) { - -#ifdef WITH_WSREP - que_node_t *parent = que_node_get_parent(node); -#endif err = btr_cur_del_mark_set_sec_rec( flags, btr_cur, TRUE, thr, &mtr); if (err != DB_SUCCESS) { break; } #ifdef WITH_WSREP - if (err == DB_SUCCESS && !referenced && - !(parent && que_node_get_type(parent) == - QUE_NODE_UPDATE && - (std::find(((upd_node_t*)parent)->cascade_upd_nodes->begin(), - ((upd_node_t*)parent)->cascade_upd_nodes->end(), - node) == - ((upd_node_t*)parent)->cascade_upd_nodes->end())) && - foreign - ) { - ulint* offsets = - rec_get_offsets( - rec, index, NULL, ULINT_UNDEFINED, - &heap); + if (!referenced && foreign + && wsrep_must_process_fk(node, trx) + && !wsrep_thd_is_BF(trx->mysql_thd, FALSE)) { + + ulint* offsets = rec_get_offsets( + rec, index, NULL, ULINT_UNDEFINED, + &heap); err = wsrep_row_upd_check_foreign_constraints( node, &pcur, index->table, @@ -2419,14 +2459,14 @@ row_upd_sec_index_entry( case DB_DEADLOCK: if (wsrep_debug) { ib::warn() << "WSREP: sec index FK check fail for deadlock" - << " index " << index->name() - << " table " << index->table->name.m_name; + << " index " << index->name + << " table " << index->table->name; } break; default: - ib::error() << "WSREP: referenced FK check fail: " << err - << " index " << index->name() - << " table " << index->table->name.m_name; + ib::error() << "WSREP: referenced FK check fail: " << ut_strerr(err) + << " index " << index->name + << " table " << index->table->name; break; } @@ -2603,7 +2643,6 @@ static MY_ATTRIBUTE((nonnull, warn_unused_result)) dberr_t row_upd_clust_rec_by_insert( /*========================*/ - ulint flags, /*!< in: undo logging and locking flags */ upd_node_t* node, /*!< in/out: row update node */ dict_index_t* index, /*!< in: clustered index of the record */ que_thr_t* thr, /*!< in: query thread */ @@ -2621,9 +2660,6 @@ row_upd_clust_rec_by_insert( dberr_t err; rec_t* rec; ulint* offsets = NULL; -#ifdef WITH_WSREP - que_node_t *parent = que_node_get_parent(node); -#endif ut_ad(node); ut_ad(dict_index_is_clust(index)); @@ -2664,7 +2700,8 @@ row_upd_clust_rec_by_insert( marked, then we are here after a DB_LOCK_WAIT. Skip delete marking clustered index and disowning its blobs. */ - ut_ad(rec_get_trx_id(rec, index) == trx->id); + ut_ad(row_get_rec_trx_id(rec, index, offsets) + == trx->id); ut_ad(!trx_undo_roll_ptr_is_insert( row_get_rec_roll_ptr(rec, index, offsets))); @@ -2672,7 +2709,7 @@ row_upd_clust_rec_by_insert( } err = btr_cur_del_mark_set_clust_rec( - flags, btr_cur_get_block(btr_cur), rec, index, offsets, + btr_cur_get_block(btr_cur), rec, index, offsets, thr, node->row, mtr); if (err != DB_SUCCESS) { err_exit: @@ -2710,18 +2747,11 @@ check_fk: if (err != DB_SUCCESS) { goto err_exit; } - } #ifdef WITH_WSREP - if (!referenced && - !(parent && que_node_get_type(parent) == QUE_NODE_UPDATE && - (std::find(((upd_node_t*)parent)->cascade_upd_nodes->begin(), - ((upd_node_t*)parent)->cascade_upd_nodes->end(), - node) == - ((upd_node_t*)parent)->cascade_upd_nodes->end())) && - foreign - ) { + } else if (foreign && wsrep_must_process_fk(node, trx)) { err = wsrep_row_upd_check_foreign_constraints( node, pcur, table, index, offsets, thr, mtr); + switch (err) { case DB_SUCCESS: case DB_NO_REFERENCED_ROW: @@ -2730,23 +2760,18 @@ check_fk: case DB_DEADLOCK: if (wsrep_debug) { ib::warn() << "WSREP: sec index FK check fail for deadlock" - << " index " << index->name() - << " table " << index->table->name.m_name; + << " index " << index->name + << " table " << index->table->name; } - break; + goto err_exit; default: - ib::error() << "WSREP: referenced FK check fail: " << err - << " index " << index->name() - << " table " << index->table->name.m_name; - - break; - } - - if (err != DB_SUCCESS) { + ib::error() << "WSREP: referenced FK check fail: " << ut_strerr(err) + << " index " << index->name + << " table " << index->table->name; goto err_exit; } - } #endif /* WITH_WSREP */ + } } mtr_commit(mtr); @@ -2913,7 +2938,6 @@ static MY_ATTRIBUTE((nonnull, warn_unused_result)) dberr_t row_upd_del_mark_clust_rec( /*=======================*/ - ulint flags, /*!< in: undo logging and locking flags */ upd_node_t* node, /*!< in: row update node */ dict_index_t* index, /*!< in: clustered index */ ulint* offsets,/*!< in/out: rec_get_offsets() for the @@ -2929,9 +2953,8 @@ row_upd_del_mark_clust_rec( btr_cur_t* btr_cur; dberr_t err; rec_t* rec; -#ifdef WITH_WSREP - que_node_t *parent = que_node_get_parent(node); -#endif + trx_t* trx = thr_get_trx(thr); + ut_ad(node); ut_ad(dict_index_is_clust(index)); ut_ad(node->is_delete); @@ -2942,8 +2965,9 @@ row_upd_del_mark_clust_rec( /* Store row because we have to build also the secondary index entries */ - row_upd_store_row(node, thr_get_trx(thr)->mysql_thd, - thr->prebuilt ? thr->prebuilt->m_mysql_table : NULL); + row_upd_store_row(node, trx->mysql_thd, + thr->prebuilt && thr->prebuilt->table == node->table + ? thr->prebuilt->m_mysql_table : NULL); /* Mark the clustered index record deleted; we do not have to check locks, because we assume that we have an x-lock on the record */ @@ -2951,27 +2975,20 @@ row_upd_del_mark_clust_rec( rec = btr_cur_get_rec(btr_cur); err = btr_cur_del_mark_set_clust_rec( - flags, btr_cur_get_block(btr_cur), rec, + btr_cur_get_block(btr_cur), rec, index, offsets, thr, node->row, mtr); - if (err == DB_SUCCESS && referenced) { + if (err != DB_SUCCESS) { + } else if (referenced) { /* NOTE that the following call loses the position of pcur ! */ err = row_upd_check_references_constraints( node, pcur, index->table, index, offsets, thr, mtr); - } #ifdef WITH_WSREP - if (err == DB_SUCCESS && !referenced && - !(parent && que_node_get_type(parent) == QUE_NODE_UPDATE && - (std::find(((upd_node_t*)parent)->cascade_upd_nodes->begin(), - ((upd_node_t*)parent)->cascade_upd_nodes->end(), - node) == - ((upd_node_t*)parent)->cascade_upd_nodes->end())) && - thr_get_trx(thr) && - foreign - ) { + } else if (foreign && wsrep_must_process_fk(node, trx)) { err = wsrep_row_upd_check_foreign_constraints( node, pcur, index->table, index, offsets, thr, mtr); + switch (err) { case DB_SUCCESS: case DB_NO_REFERENCED_ROW: @@ -2980,19 +2997,19 @@ row_upd_del_mark_clust_rec( case DB_DEADLOCK: if (wsrep_debug) { ib::warn() << "WSREP: sec index FK check fail for deadlock" - << " index " << index->name() - << " table " << index->table->name.m_name; + << " index " << index->name + << " table " << index->table->name; } break; default: - ib::error() << "WSREP: referenced FK check fail: " << err - << " index " << index->name() - << " table " << index->table->name.m_name; + ib::error() << "WSREP: referenced FK check fail: " << ut_strerr(err) + << " index " << index->name + << " table " << index->table->name; break; } - } #endif /* WITH_WSREP */ + } mtr_commit(mtr); @@ -3020,7 +3037,6 @@ row_upd_clust_step( ulint offsets_[REC_OFFS_NORMAL_SIZE]; ulint* offsets; ibool referenced; - ulint flags; ibool foreign = FALSE; trx_t* trx = thr_get_trx(thr); @@ -3046,11 +3062,10 @@ row_upd_clust_step( server or connection lifetime and so REDO information is not needed on restart for recovery. Disable locking as temp-tables are not shared across connection. */ - if (dict_table_is_temporary(index->table)) { - flags = BTR_NO_LOCKING_FLAG; + const ulint flags = dict_table_is_temporary(index->table) + ? BTR_NO_LOCKING_FLAG : 0; + if (flags) { mtr.set_log_mode(MTR_LOG_NO_REDO); - } else { - flags = 0; } /* If the restoration does not succeed, then the same @@ -3118,9 +3133,9 @@ row_upd_clust_step( offsets = rec_get_offsets(rec, index, offsets_, ULINT_UNDEFINED, &heap); - if (!node->has_clust_rec_x_lock) { + if (!flags && !node->has_clust_rec_x_lock) { err = lock_clust_rec_modify_check_and_lock( - flags, btr_pcur_get_block(pcur), + 0, btr_pcur_get_block(pcur), rec, index, offsets, thr); if (err != DB_SUCCESS) { mtr_commit(&mtr); @@ -3136,7 +3151,7 @@ row_upd_clust_step( if (node->is_delete) { err = row_upd_del_mark_clust_rec( - flags, node, index, offsets, thr, referenced, foreign, &mtr); + node, index, offsets, thr, referenced, foreign, &mtr); if (err == DB_SUCCESS) { node->state = UPD_NODE_UPDATE_ALL_SEC; @@ -3182,7 +3197,7 @@ row_upd_clust_step( externally! */ err = row_upd_clust_rec_by_insert( - flags, node, index, thr, referenced, foreign, &mtr); + node, index, thr, referenced, foreign, &mtr); if (err != DB_SUCCESS) { goto exit_func; @@ -3229,7 +3244,7 @@ row_upd( ut_ad(!thr_get_trx(thr)->in_rollback); DBUG_PRINT("row_upd", ("table: %s", node->table->name.m_name)); - DBUG_PRINT("row_upd", ("info bits in update vector: 0x%lx", + DBUG_PRINT("row_upd", ("info bits in update vector: 0x" ULINTPFx, node->update ? node->update->info_bits: 0)); DBUG_PRINT("row_upd", ("foreign_id: %s", node->foreign ? node->foreign->id: "NULL")); diff --git a/storage/innobase/srv/srv0conc.cc b/storage/innobase/srv/srv0conc.cc index bf8a326a633..9f589b57d9c 100644 --- a/storage/innobase/srv/srv0conc.cc +++ b/storage/innobase/srv/srv0conc.cc @@ -197,11 +197,6 @@ srv_conc_enter_innodb_with_atomics( (void) my_atomic_addlint( &srv_conc.n_waiting, 1); - /* Release possible search system latch this - thread has */ - - trx_assert_no_search_latch(trx); - thd_wait_begin(trx->mysql_thd, THD_WAIT_USER_LOCK); notified_mysql = TRUE; @@ -257,15 +252,7 @@ srv_conc_enter_innodb( { trx_t* trx = prebuilt->trx; -#ifdef BTR_CUR_HASH_ADAPT -# ifdef UNIV_DEBUG - { - btrsea_sync_check check(trx->has_search_latch); - - ut_ad(!sync_check_iterate(check)); - } -# endif /* UNIV_DEBUG */ -#endif /* BTR_CUR_HASH_ADAPT */ + ut_ad(!sync_check_iterate(sync_check())); srv_conc_enter_innodb_with_atomics(trx); } @@ -279,15 +266,7 @@ srv_conc_force_enter_innodb( trx_t* trx) /*!< in: transaction object associated with the thread */ { -#ifdef BTR_CUR_HASH_ADAPT -# ifdef UNIV_DEBUG - { - btrsea_sync_check check(trx->has_search_latch); - - ut_ad(!sync_check_iterate(check)); - } -# endif /* UNIV_DEBUG */ -#endif /* BTR_CUR_HASH_ADAPT */ + ut_ad(!sync_check_iterate(sync_check())); if (!srv_thread_concurrency) { @@ -320,15 +299,7 @@ srv_conc_force_exit_innodb( srv_conc_exit_innodb_with_atomics(trx); -#ifdef BTR_CUR_HASH_ADAPT -# ifdef UNIV_DEBUG - { - btrsea_sync_check check(trx->has_search_latch); - - ut_ad(!sync_check_iterate(check)); - } -# endif /* UNIV_DEBUG */ -#endif /* BTR_CUR_HASH_ADAPT */ + ut_ad(!sync_check_iterate(sync_check())); } /*********************************************************************//** diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc index 6e010fadc6d..ce1a30659ed 100644 --- a/storage/innobase/srv/srv0srv.cc +++ b/storage/innobase/srv/srv0srv.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, 2009 Google Inc. Copyright (c) 2009, Percona Inc. Copyright (c) 2013, 2017, MariaDB Corporation. @@ -195,26 +195,15 @@ my_bool srv_use_mtflush; my_bool srv_master_thread_disabled_debug; /** Event used to inform that master thread is disabled. */ static os_event_t srv_master_thread_disabled_event; -/** Debug variable to find if any background threads are adding -to purge during slow shutdown. */ -extern bool trx_commit_disallowed; #endif /* UNIV_DEBUG */ /*------------------------- LOG FILES ------------------------ */ char* srv_log_group_home_dir; ulong srv_n_log_files; -/** At startup, this is the current redo log file size. -During startup, if this is different from srv_log_file_size_requested -(innodb_log_file_size), the redo log will be rebuilt and this size -will be initialized to srv_log_file_size_requested. -When upgrading from a previous redo log format, this will be set to 0, -and writing to the redo log is not allowed. - -During startup, this is in bytes, and later converted to pages. */ -ib_uint64_t srv_log_file_size; -/** The value of the startup parameter innodb_log_file_size */ -ib_uint64_t srv_log_file_size_requested; +/** The InnoDB redo log file size, or 0 when changing the redo log format +at startup (while disallowing writes to the redo log). */ +ulonglong srv_log_file_size; /** copy of innodb_log_buffer_size, but in database pages */ ulint srv_log_buffer_size; /** innodb_flush_log_at_trx_commit */ @@ -457,6 +446,9 @@ UNIV_INTERN uint srv_defragment_frequency; @see innodb_defragment_frequency_update() */ UNIV_INTERN ulonglong srv_defragment_interval; +/** Current mode of operation */ +UNIV_INTERN enum srv_operation_mode srv_operation; + /* Set the following to 0 if you want InnoDB to write messages on stderr on startup/shutdown. Not enabled on the embedded server. */ ibool srv_print_verbose_log; @@ -486,12 +478,6 @@ ib_mutex_t srv_monitor_file_mutex; /** Temporary file for innodb monitor output */ FILE* srv_monitor_file; -/** Mutex for locking srv_dict_tmpfile. Not created if srv_read_only_mode. -This mutex has a very high rank; threads reserving it should not -be holding any InnoDB latches. */ -ib_mutex_t srv_dict_tmpfile_mutex; -/** Temporary file for output from the data dictionary */ -FILE* srv_dict_tmpfile; /** Mutex for locking srv_misc_tmpfile. Not created if srv_read_only_mode. This mutex has a very low rank; threads reserving it should not acquire any further latches or sleep before releasing this one. */ @@ -539,16 +525,16 @@ UNIV_INTERN ulong srv_buf_dump_status_frequency; /** Acquire the system_mutex. */ #define srv_sys_mutex_enter() do { \ - mutex_enter(&srv_sys->mutex); \ + mutex_enter(&srv_sys.mutex); \ } while (0) /** Test if the system mutex is owned. */ -#define srv_sys_mutex_own() (mutex_own(&srv_sys->mutex) \ +#define srv_sys_mutex_own() (mutex_own(&srv_sys.mutex) \ && !srv_read_only_mode) /** Release the system mutex. */ #define srv_sys_mutex_exit() do { \ - mutex_exit(&srv_sys->mutex); \ + mutex_exit(&srv_sys.mutex); \ } while (0) #define fetch_lock_wait_timeout(trx) \ @@ -640,7 +626,7 @@ struct srv_sys_t{ ulint n_sys_threads; /*!< size of the sys_threads array */ - srv_slot_t* sys_threads; /*!< server thread table; + srv_slot_t sys_threads[32 + 1]; /*!< server thread table; os_event_set() and os_event_reset() on sys_threads[]->event are @@ -657,7 +643,7 @@ struct srv_sys_t{ activity */ }; -static srv_sys_t* srv_sys; +static srv_sys_t srv_sys; /** Event to signal srv_monitor_thread. Not protected by a mutex. Set after setting srv_print_innodb_monitor. */ @@ -682,10 +668,10 @@ and/or load it during startup. */ char srv_buffer_pool_dump_at_shutdown = TRUE; char srv_buffer_pool_load_at_startup = TRUE; -/** Slot index in the srv_sys->sys_threads array for the purge thread. */ +/** Slot index in the srv_sys.sys_threads array for the purge thread. */ static const ulint SRV_PURGE_SLOT = 1; -/** Slot index in the srv_sys->sys_threads array for the master thread. */ +/** Slot index in the srv_sys.sys_threads array for the master thread. */ static const ulint SRV_MASTER_SLOT = 0; #ifdef HAVE_PSI_STAGE_INTERFACE @@ -825,21 +811,21 @@ srv_reserve_slot( switch (type) { case SRV_MASTER: - slot = &srv_sys->sys_threads[SRV_MASTER_SLOT]; + slot = &srv_sys.sys_threads[SRV_MASTER_SLOT]; break; case SRV_PURGE: - slot = &srv_sys->sys_threads[SRV_PURGE_SLOT]; + slot = &srv_sys.sys_threads[SRV_PURGE_SLOT]; break; case SRV_WORKER: /* Find an empty slot, skip the master and purge slots. */ - for (slot = &srv_sys->sys_threads[2]; + for (slot = &srv_sys.sys_threads[2]; slot->in_use; ++slot) { - ut_a(slot < &srv_sys->sys_threads[ - srv_sys->n_sys_threads]); + ut_a(slot < &srv_sys.sys_threads[ + srv_sys.n_sys_threads]); } break; @@ -855,7 +841,7 @@ srv_reserve_slot( ut_ad(srv_slot_get_type(slot) == type); - my_atomic_addlint(&srv_sys->n_threads_active[type], 1); + my_atomic_addlint(&srv_sys.n_threads_active[type], 1); srv_sys_mutex_exit(); @@ -885,13 +871,13 @@ srv_suspend_thread_low( case SRV_MASTER: /* We have only one master thread and it should be the first entry always. */ - ut_a(srv_sys->n_threads_active[type] == 1); + ut_a(srv_sys.n_threads_active[type] == 1); break; case SRV_PURGE: /* We have only one purge coordinator thread and it should be the second entry always. */ - ut_a(srv_sys->n_threads_active[type] == 1); + ut_a(srv_sys.n_threads_active[type] == 1); break; case SRV_WORKER: @@ -902,7 +888,7 @@ srv_suspend_thread_low( ut_a(!slot->suspended); slot->suspended = TRUE; - if (my_atomic_addlint(&srv_sys->n_threads_active[type], -1) < 0) { + if (my_atomic_addlint(&srv_sys.n_threads_active[type], -1) < 0) { ut_error; } @@ -959,7 +945,7 @@ srv_resume_thread(srv_slot_t* slot, int64_t sig_count = 0, bool wait = true, ut_ad(slot->suspended); slot->suspended = FALSE; - my_atomic_addlint(&srv_sys->n_threads_active[slot->type], 1); + my_atomic_addlint(&srv_sys.n_threads_active[slot->type], 1); srv_sys_mutex_exit(); return(timeout); } @@ -981,8 +967,8 @@ srv_release_threads(enum srv_thread_type type, ulint n) srv_sys_mutex_enter(); - for (ulint i = 0; i < srv_sys->n_sys_threads; i++) { - srv_slot_t* slot = &srv_sys->sys_threads[i]; + for (ulint i = 0; i < srv_sys.n_sys_threads; i++) { + srv_slot_t* slot = &srv_sys.sys_threads[i]; if (!slot->in_use || srv_slot_get_type(slot) != type) { continue; @@ -1002,7 +988,7 @@ srv_release_threads(enum srv_thread_type type, ulint n) should be the first entry always. */ ut_a(n == 1); ut_a(i == SRV_MASTER_SLOT); - ut_a(srv_sys->n_threads_active[type] == 0); + ut_a(srv_sys.n_threads_active[type] == 0); break; case SRV_PURGE: @@ -1011,12 +997,12 @@ srv_release_threads(enum srv_thread_type type, ulint n) ut_a(n == 1); ut_a(i == SRV_PURGE_SLOT); ut_a(srv_n_purge_threads > 0); - ut_a(srv_sys->n_threads_active[type] == 0); + ut_a(srv_sys.n_threads_active[type] == 0); break; case SRV_WORKER: ut_a(srv_n_purge_threads > 1); - ut_a(srv_sys->n_threads_active[type] + ut_a(srv_sys.n_threads_active[type] < srv_n_purge_threads - 1); break; } @@ -1052,32 +1038,19 @@ static void srv_init() { - ulint n_sys_threads = 0; - ulint srv_sys_sz = sizeof(*srv_sys); - mutex_create(LATCH_ID_SRV_INNODB_MONITOR, &srv_innodb_monitor_mutex); - if (!srv_read_only_mode) { - - /* Number of purge threads + master thread */ - n_sys_threads = srv_n_purge_threads + 1; - - srv_sys_sz += n_sys_threads * sizeof(*srv_sys->sys_threads); - } - - srv_sys = static_cast(ut_zalloc_nokey(srv_sys_sz)); - - srv_sys->n_sys_threads = n_sys_threads; + srv_sys.n_sys_threads = srv_read_only_mode + ? 0 + : srv_n_purge_threads + 1/* purge coordinator */; if (!srv_read_only_mode) { - mutex_create(LATCH_ID_SRV_SYS, &srv_sys->mutex); + mutex_create(LATCH_ID_SRV_SYS, &srv_sys.mutex); - mutex_create(LATCH_ID_SRV_SYS_TASKS, &srv_sys->tasks_mutex); + mutex_create(LATCH_ID_SRV_SYS_TASKS, &srv_sys.tasks_mutex); - srv_sys->sys_threads = (srv_slot_t*) &srv_sys[1]; - - for (ulint i = 0; i < srv_sys->n_sys_threads; ++i) { - srv_slot_t* slot = &srv_sys->sys_threads[i]; + for (ulint i = 0; i < srv_sys.n_sys_threads; ++i) { + srv_slot_t* slot = &srv_sys.sys_threads[i]; slot->event = os_event_create(0); @@ -1092,7 +1065,7 @@ srv_init() buf_flush_event = os_event_create("buf_flush_event"); - UT_LIST_INIT(srv_sys->tasks, &que_thr_t::queue); + UT_LIST_INIT(srv_sys.tasks, &que_thr_t::queue); } srv_buf_resize_event = os_event_create(0); @@ -1136,7 +1109,7 @@ void srv_free(void) /*==========*/ { - if (!srv_sys) { + if (!srv_buf_resize_event) { return; } @@ -1144,13 +1117,11 @@ srv_free(void) mutex_free(&page_zip_stat_per_index_mutex); if (!srv_read_only_mode) { - mutex_free(&srv_sys->mutex); - mutex_free(&srv_sys->tasks_mutex); + mutex_free(&srv_sys.mutex); + mutex_free(&srv_sys.tasks_mutex); - for (ulint i = 0; i < srv_sys->n_sys_threads; ++i) { - srv_slot_t* slot = &srv_sys->sys_threads[i]; - - os_event_destroy(slot->event); + for (ulint i = 0; i < srv_sys.n_sys_threads; ++i) { + os_event_destroy(srv_sys.sys_threads[i].event); } os_event_destroy(srv_error_event); @@ -1161,18 +1132,11 @@ srv_free(void) os_event_destroy(srv_buf_resize_event); -#ifdef UNIV_DEBUG - os_event_destroy(srv_master_thread_disabled_event); - srv_master_thread_disabled_event = NULL; -#endif /* UNIV_DEBUG */ + ut_d(os_event_destroy(srv_master_thread_disabled_event)); dict_ind_free(); trx_i_s_cache_free(trx_i_s_cache); - - ut_free(srv_sys); - - srv_sys = 0; } /*********************************************************************//** @@ -1186,8 +1150,6 @@ srv_normalize_init_values(void) srv_tmp_space.normalize(); - srv_log_file_size /= UNIV_PAGE_SIZE; - srv_log_buffer_size /= UNIV_PAGE_SIZE; srv_lock_table_size = 5 * (srv_buf_pool_size / UNIV_PAGE_SIZE); @@ -1205,7 +1167,6 @@ srv_boot(void) srv_normalize_init_values(); sync_check_init(); - os_thread_init(); /* Reset the system variables in the recovery module. */ recv_sys_var_init(); trx_pool_init(); @@ -1396,7 +1357,7 @@ srv_printf_innodb_monitor( "Total large memory allocated " ULINTPF "\n" "Dictionary memory allocated " ULINTPF "\n", os_total_large_mem_allocated, - dict_sys->size); + dict_sys_get_size()); buf_print_io(file); @@ -1502,8 +1463,10 @@ srv_export_innodb_status(void) buf_get_total_stat(&stat); buf_get_total_list_len(&LRU_len, &free_len, &flush_list_len); buf_get_total_list_size_in_bytes(&buf_pools_list_size); - fil_crypt_total_stat(&crypt_stat); - btr_scrub_total_stat(&scrub_stat); + if (!srv_read_only_mode) { + fil_crypt_total_stat(&crypt_stat); + btr_scrub_total_stat(&scrub_stat); + } mutex_enter(&srv_innodb_monitor_mutex); @@ -1660,6 +1623,10 @@ srv_export_innodb_status(void) export_vars.innodb_pages_page_compression_error = srv_stats.pages_page_compression_error; export_vars.innodb_pages_decrypted = srv_stats.pages_decrypted; export_vars.innodb_pages_encrypted = srv_stats.pages_encrypted; + export_vars.innodb_n_merge_blocks_encrypted = srv_stats.n_merge_blocks_encrypted; + export_vars.innodb_n_merge_blocks_decrypted = srv_stats.n_merge_blocks_decrypted; + export_vars.innodb_n_rowlog_blocks_encrypted = srv_stats.n_rowlog_blocks_encrypted; + export_vars.innodb_n_rowlog_blocks_decrypted = srv_stats.n_rowlog_blocks_decrypted; export_vars.innodb_defragment_compression_failures = btr_defragment_compression_failures; @@ -1701,6 +1668,7 @@ srv_export_innodb_status(void) export_vars.innodb_sec_rec_cluster_reads_avoided = srv_stats.n_sec_rec_cluster_reads_avoided; + if (!srv_read_only_mode) { export_vars.innodb_encryption_rotation_pages_read_from_cache = crypt_stat.pages_read_from_cache; export_vars.innodb_encryption_rotation_pages_read_from_disk = @@ -1729,6 +1697,7 @@ srv_export_innodb_status(void) export_vars.innodb_scrub_page_split_failures_unknown = scrub_stat.page_split_failures_unknown; export_vars.innodb_scrub_log = srv_stats.n_log_scrubs; + } mutex_exit(&srv_innodb_monitor_mutex); } @@ -1878,7 +1847,7 @@ loop: } } - if (srv_shutdown_state >= SRV_SHUTDOWN_CLEANUP) { + if (srv_shutdown_state != SRV_SHUTDOWN_NONE) { goto exit_func; } @@ -1999,7 +1968,7 @@ loop: os_event_wait_time_low(srv_error_event, 1000000, sig_count); - if (srv_shutdown_state < SRV_SHUTDOWN_CLEANUP) { + if (srv_shutdown_state == SRV_SHUTDOWN_NONE) { goto loop; } @@ -2020,7 +1989,7 @@ void srv_inc_activity_count(void) /*========================*/ { - srv_sys->activity_count.inc(); + srv_sys.activity_count.inc(); } /**********************************************************************//** @@ -2041,7 +2010,7 @@ srv_get_active_thread_type(void) srv_sys_mutex_enter(); for (ulint i = SRV_WORKER; i <= SRV_MASTER; ++i) { - if (srv_sys->n_threads_active[i] != 0) { + if (srv_sys.n_threads_active[i] != 0) { ret = static_cast(i); break; } @@ -2076,12 +2045,12 @@ srv_active_wake_master_thread_low() srv_inc_activity_count(); - if (my_atomic_loadlint(&srv_sys->n_threads_active[SRV_MASTER]) == 0) { + if (my_atomic_loadlint(&srv_sys.n_threads_active[SRV_MASTER]) == 0) { srv_slot_t* slot; srv_sys_mutex_enter(); - slot = &srv_sys->sys_threads[SRV_MASTER_SLOT]; + slot = &srv_sys.sys_threads[SRV_MASTER_SLOT]; /* Only if the master thread has been started. */ @@ -2101,7 +2070,7 @@ srv_wake_purge_thread_if_not_active() ut_ad(!srv_sys_mutex_own()); if (purge_sys->state == PURGE_STATE_RUN - && !my_atomic_loadlint(&srv_sys->n_threads_active[SRV_PURGE]) + && !my_atomic_loadlint(&srv_sys.n_threads_active[SRV_PURGE]) && my_atomic_loadlint(&trx_sys->rseg_history_len)) { srv_release_threads(SRV_PURGE, 1); @@ -2124,7 +2093,7 @@ ulint srv_get_activity_count(void) /*========================*/ { - return(srv_sys->activity_count); + return(srv_sys.activity_count); } /*******************************************************************//** @@ -2135,7 +2104,7 @@ srv_check_activity( /*===============*/ ulint old_activity_count) /*!< in: old activity count */ { - return(srv_sys->activity_count != old_activity_count); + return(srv_sys.activity_count != old_activity_count); } /********************************************************************//** @@ -2205,7 +2174,7 @@ srv_shutdown_print_master_pending( time_elapsed = ut_difftime(current_time, *last_print_time); if (time_elapsed > 60) { - *last_print_time = ut_time(); + *last_print_time = current_time; if (n_tables_to_drop) { ib::info() << "Waiting for " << n_tables_to_drop @@ -2308,7 +2277,7 @@ srv_master_do_active_tasks(void) ut_d(srv_master_do_disabled_loop()); - if (srv_shutdown_state > 0) { + if (srv_shutdown_state != SRV_SHUTDOWN_NONE) { return; } @@ -2333,11 +2302,7 @@ srv_master_do_active_tasks(void) /* Now see if various tasks that are performed at defined intervals need to be performed. */ - if (srv_shutdown_state > 0) { - return; - } - - if (srv_shutdown_state > 0) { + if (srv_shutdown_state != SRV_SHUTDOWN_NONE) { return; } @@ -2352,7 +2317,7 @@ srv_master_do_active_tasks(void) MONITOR_SRV_DICT_LRU_MICROSECOND, counter_time); } - if (srv_shutdown_state > 0) { + if (srv_shutdown_state != SRV_SHUTDOWN_NONE) { return; } @@ -2397,7 +2362,7 @@ srv_master_do_idle_tasks(void) ut_d(srv_master_do_disabled_loop()); - if (srv_shutdown_state > 0) { + if (srv_shutdown_state != SRV_SHUTDOWN_NONE) { return; } @@ -2413,7 +2378,7 @@ srv_master_do_idle_tasks(void) MONITOR_INC_TIME_IN_MICRO_SECS( MONITOR_SRV_IBUF_MERGE_MICROSECOND, counter_time); - if (srv_shutdown_state > 0) { + if (srv_shutdown_state != SRV_SHUTDOWN_NONE) { return; } @@ -2431,7 +2396,7 @@ srv_master_do_idle_tasks(void) MONITOR_INC_TIME_IN_MICRO_SECS( MONITOR_SRV_LOG_FLUSH_MICROSECOND, counter_time); - if (srv_shutdown_state > 0) { + if (srv_shutdown_state != SRV_SHUTDOWN_NONE) { return; } @@ -2442,70 +2407,42 @@ srv_master_do_idle_tasks(void) counter_time); } -/*********************************************************************//** -Perform the tasks during shutdown. The tasks that we do at shutdown -depend on srv_fast_shutdown: -2 => very fast shutdown => do no book keeping -1 => normal shutdown => clear drop table queue and make checkpoint -0 => slow shutdown => in addition to above do complete purge and ibuf -merge -@return TRUE if some work was done. FALSE otherwise */ +/** Perform shutdown tasks. +@param[in] ibuf_merge whether to complete the change buffer merge */ static -ibool -srv_master_do_shutdown_tasks( -/*=========================*/ - ib_time_t* last_print_time)/*!< last time the function - print the message */ +void +srv_shutdown(bool ibuf_merge) { - ulint n_bytes_merged = 0; - ulint n_tables_to_drop = 0; + ulint n_bytes_merged = 0; + ulint n_tables_to_drop; + ib_time_t now = ut_time(); - ut_ad(!srv_read_only_mode); + do { + ut_ad(!srv_read_only_mode); + ut_ad(srv_shutdown_state == SRV_SHUTDOWN_CLEANUP); + ++srv_main_shutdown_loops; - ++srv_main_shutdown_loops; + /* FIXME: Remove the background DROP TABLE queue; it is not + crash-safe and breaks ACID. */ + srv_main_thread_op_info = "doing background drop tables"; + n_tables_to_drop = row_drop_tables_for_mysql_in_background(); - ut_a(srv_shutdown_state > 0); + if (ibuf_merge) { + srv_main_thread_op_info = "checking free log space"; + log_free_check(); + srv_main_thread_op_info = "doing insert buffer merge"; + n_bytes_merged = ibuf_merge_in_background(true); - /* In very fast shutdown none of the following is necessary */ - if (srv_fast_shutdown == 2) { - return(FALSE); - } + /* Flush logs if needed */ + srv_sync_log_buffer_in_background(); + } - /* ALTER TABLE in MySQL requires on Unix that the table handler - can drop tables lazily after there no longer are SELECT - queries to them. */ - srv_main_thread_op_info = "doing background drop tables"; - n_tables_to_drop = row_drop_tables_for_mysql_in_background(); - - /* make sure that there is enough reusable space in the redo - log files */ - srv_main_thread_op_info = "checking free log space"; - log_free_check(); - - /* In case of normal shutdown we don't do ibuf merge or purge */ - if (srv_fast_shutdown == 1) { - goto func_exit; - } - - /* Do an ibuf merge */ - srv_main_thread_op_info = "doing insert buffer merge"; - n_bytes_merged = ibuf_merge_in_background(true); - - /* Flush logs if needed */ - srv_sync_log_buffer_in_background(); - -func_exit: - /* Make a new checkpoint about once in 10 seconds */ - srv_main_thread_op_info = "making checkpoint"; - log_checkpoint(TRUE, FALSE); - - /* Print progress message every 60 seconds during shutdown */ - if (srv_shutdown_state > 0 && srv_print_verbose_log) { - srv_shutdown_print_master_pending( - last_print_time, n_tables_to_drop, n_bytes_merged); - } - - return(n_bytes_merged || n_tables_to_drop); + /* Print progress message every 60 seconds during shutdown */ + if (srv_print_verbose_log) { + srv_shutdown_print_master_pending( + &now, n_tables_to_drop, n_bytes_merged); + } + } while (n_bytes_merged || n_tables_to_drop); } /*********************************************************************//** @@ -2538,7 +2475,6 @@ DECLARE_THREAD(srv_master_thread)( srv_slot_t* slot; ulint old_activity_count = srv_get_activity_count(); - ib_time_t last_print_time; ut_ad(!srv_read_only_mode); @@ -2555,9 +2491,8 @@ DECLARE_THREAD(srv_master_thread)( srv_main_thread_id = os_thread_pf(os_thread_get_curr_id()); slot = srv_reserve_slot(SRV_MASTER); - ut_a(slot == srv_sys->sys_threads); + ut_a(slot == srv_sys.sys_threads); - last_print_time = ut_time(); loop: if (srv_force_recovery >= SRV_FORCE_NO_BACKGROUND) { goto suspend_thread; @@ -2577,14 +2512,26 @@ loop: } } - while (srv_shutdown_state != SRV_SHUTDOWN_EXIT_THREADS - && srv_master_do_shutdown_tasks(&last_print_time)) { - - /* Shouldn't loop here in case of very fast shutdown */ - ut_ad(srv_fast_shutdown < 2); +suspend_thread: + switch (srv_shutdown_state) { + case SRV_SHUTDOWN_NONE: + break; + case SRV_SHUTDOWN_FLUSH_PHASE: + case SRV_SHUTDOWN_LAST_PHASE: + ut_ad(0); + /* fall through */ + case SRV_SHUTDOWN_EXIT_THREADS: + /* srv_init_abort() must have been invoked */ + case SRV_SHUTDOWN_CLEANUP: + if (srv_shutdown_state == SRV_SHUTDOWN_CLEANUP + && srv_fast_shutdown < 2) { + srv_shutdown(srv_fast_shutdown == 0); + } + srv_suspend_thread(slot); + my_thread_end(); + os_thread_exit(); } -suspend_thread: srv_main_thread_op_info = "suspending"; srv_suspend_thread(slot); @@ -2596,44 +2543,32 @@ suspend_thread: srv_main_thread_op_info = "waiting for server activity"; srv_resume_thread(slot); - - if (srv_shutdown_state != SRV_SHUTDOWN_EXIT_THREADS) { - goto loop; - } - - my_thread_end(); - os_thread_exit(); - DBUG_RETURN(0); + goto loop; } -/** -Check if purge should stop. -@return true if it should shutdown. */ +/** Check if purge should stop. +@param[in] n_purged pages purged in the last batch +@return whether purge should exit */ static bool -srv_purge_should_exit( - MYSQL_THD thd, - ulint n_purged) /*!< in: pages purged in last batch */ +srv_purge_should_exit(ulint n_purged) { - switch (srv_shutdown_state) { - case SRV_SHUTDOWN_NONE: - if ((!srv_was_started || srv_running) - && !thd_kill_level(thd)) { - /* Normal operation. */ - break; - } - /* close_connections() was called; fall through */ - case SRV_SHUTDOWN_CLEANUP: - case SRV_SHUTDOWN_EXIT_THREADS: - /* Exit unless slow shutdown requested or all done. */ - return(srv_fast_shutdown != 0 || n_purged == 0); + ut_ad(srv_shutdown_state == SRV_SHUTDOWN_NONE + || srv_shutdown_state == SRV_SHUTDOWN_CLEANUP); - case SRV_SHUTDOWN_LAST_PHASE: - case SRV_SHUTDOWN_FLUSH_PHASE: - ut_error; + if (srv_undo_sources) { + return(false); } - - return(false); + if (srv_fast_shutdown) { + return(true); + } + /* Slow shutdown was requested. */ + if (n_purged) { + /* The previous round still did some work. */ + return(false); + } + /* Exit if there are no active transactions to roll back. */ + return(trx_sys_any_active_transactions() == 0); } /*********************************************************************//** @@ -2649,18 +2584,18 @@ srv_task_execute(void) ut_ad(!srv_read_only_mode); ut_a(srv_force_recovery < SRV_FORCE_NO_BACKGROUND); - mutex_enter(&srv_sys->tasks_mutex); + mutex_enter(&srv_sys.tasks_mutex); - if (UT_LIST_GET_LEN(srv_sys->tasks) > 0) { + if (UT_LIST_GET_LEN(srv_sys.tasks) > 0) { - thr = UT_LIST_GET_FIRST(srv_sys->tasks); + thr = UT_LIST_GET_FIRST(srv_sys.tasks); ut_a(que_node_get_type(thr->child) == QUE_NODE_PURGE); - UT_LIST_REMOVE(srv_sys->tasks, thr); + UT_LIST_REMOVE(srv_sys.tasks, thr); } - mutex_exit(&srv_sys->tasks_mutex); + mutex_exit(&srv_sys.tasks_mutex); if (thr != NULL) { @@ -2683,6 +2618,8 @@ DECLARE_THREAD(srv_worker_thread)( void* arg MY_ATTRIBUTE((unused))) /*!< in: a dummy parameter required by os_thread_create */ { + my_thread_init(); + srv_slot_t* slot; ut_ad(!srv_read_only_mode); @@ -2698,7 +2635,7 @@ DECLARE_THREAD(srv_worker_thread)( slot = srv_reserve_slot(SRV_WORKER); ut_a(srv_n_purge_threads > 1); - ut_a(my_atomic_loadlint(&srv_sys->n_threads_active[SRV_WORKER]) + ut_a(my_atomic_loadlint(&srv_sys.n_threads_active[SRV_WORKER]) < static_cast(srv_n_purge_threads)); /* We need to ensure that the worker threads exit after the @@ -2744,16 +2681,12 @@ DECLARE_THREAD(srv_worker_thread)( OS_THREAD_DUMMY_RETURN; /* Not reached, avoid compiler warning */ } -/*********************************************************************//** -Do the actual purge operation. +/** Do the actual purge operation. +@param[in,out] n_total_purged total number of purged pages @return length of history list before the last purge batch. */ static ulint -srv_do_purge( -/*=========*/ - MYSQL_THD thd, - ulint n_threads, /*!< in: number of threads to use */ - ulint* n_total_purged) /*!< in/out: total pages purged */ +srv_do_purge(ulint* n_total_purged) { ulint n_pages_purged; @@ -2761,6 +2694,7 @@ srv_do_purge( static ulint n_use_threads = 0; static ulint rseg_history_len = 0; ulint old_activity_count = srv_get_activity_count(); + const ulint n_threads = srv_n_purge_threads; ut_a(n_threads > 0); ut_ad(!srv_read_only_mode); @@ -2822,7 +2756,7 @@ srv_do_purge( *n_total_purged += n_pages_purged; - } while (!srv_purge_should_exit(thd, n_pages_purged) + } while (!srv_purge_should_exit(n_pages_purged) && n_pages_purged > 0 && purge_sys->state == PURGE_STATE_RUN); @@ -2835,7 +2769,6 @@ static void srv_purge_coordinator_suspend( /*==========================*/ - MYSQL_THD thd, srv_slot_t* slot, /*!< in/out: Purge coordinator thread slot */ ulint rseg_history_len) /*!< in: history list length @@ -2897,7 +2830,7 @@ srv_purge_coordinator_suspend( } rw_lock_x_unlock(&purge_sys->latch); - } while (stop && !thd_kill_level(thd)); + } while (stop && srv_undo_sources); srv_resume_thread(slot, 0, false); } @@ -2947,51 +2880,23 @@ DECLARE_THREAD(srv_purge_coordinator_thread)( purge didn't purge any records then wait for activity. */ if (srv_shutdown_state == SRV_SHUTDOWN_NONE - && !thd_kill_level(thd) + && srv_undo_sources && (purge_sys->state == PURGE_STATE_STOP || n_total_purged == 0)) { - srv_purge_coordinator_suspend(thd, slot, rseg_history_len); + srv_purge_coordinator_suspend(slot, rseg_history_len); } ut_ad(!slot->suspended); - if (srv_purge_should_exit(thd, n_total_purged)) { + if (srv_purge_should_exit(n_total_purged)) { break; } n_total_purged = 0; - rseg_history_len = srv_do_purge( - thd, srv_n_purge_threads, &n_total_purged); - - } while (!srv_purge_should_exit(thd, n_total_purged)); - - /* Ensure that we don't jump out of the loop unless the - exit condition is satisfied. */ - - ut_a(srv_purge_should_exit(thd, n_total_purged)); - - /* Ensure that all records are purged on slow shutdown. */ - while (srv_fast_shutdown == 0 - && trx_purge(1, srv_purge_batch_size, false)); - -#ifdef UNIV_DEBUG - if (srv_fast_shutdown == 0) { - trx_commit_disallowed = true; - } -#endif /* UNIV_DEBUG */ - - /* This trx_purge is called to remove any undo records (added by - background threads) after completion of the above loop. When - srv_fast_shutdown != 0, a large batch size can cause significant - delay in shutdown ,so reducing the batch size to magic number 20 - (which was default in 5.5), which we hope will be sufficient to - remove all the undo records */ - - if (trx_purge(1, std::min(srv_purge_batch_size, 20UL), true)) { - ut_a(srv_fast_shutdown); - } + rseg_history_len = srv_do_purge(&n_total_purged); + } while (!srv_purge_should_exit(n_total_purged)); /* The task queue should always be empty, independent of fast shutdown state. */ @@ -3040,11 +2945,11 @@ srv_que_task_enqueue_low( que_thr_t* thr) /*!< in: query thread */ { ut_ad(!srv_read_only_mode); - mutex_enter(&srv_sys->tasks_mutex); + mutex_enter(&srv_sys.tasks_mutex); - UT_LIST_ADD_LAST(srv_sys->tasks, thr); + UT_LIST_ADD_LAST(srv_sys.tasks, thr); - mutex_exit(&srv_sys->tasks_mutex); + mutex_exit(&srv_sys.tasks_mutex); srv_release_threads(SRV_WORKER, 1); } @@ -3060,11 +2965,11 @@ srv_get_task_queue_length(void) ut_ad(!srv_read_only_mode); - mutex_enter(&srv_sys->tasks_mutex); + mutex_enter(&srv_sys.tasks_mutex); - n_tasks = UT_LIST_GET_LEN(srv_sys->tasks); + n_tasks = UT_LIST_GET_LEN(srv_sys.tasks); - mutex_exit(&srv_sys->tasks_mutex); + mutex_exit(&srv_sys.tasks_mutex); return(n_tasks); } diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc index 6d153ff1bc6..66866c98e62 100644 --- a/storage/innobase/srv/srv0start.cc +++ b/storage/innobase/srv/srv0start.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved. +Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. Copyright (c) 2008, Google Inc. Copyright (c) 2009, Percona Inc. Copyright (c) 2013, 2017, MariaDB Corporation. @@ -78,7 +78,7 @@ Created 2/16/1996 Heikki Tuuri #include "btr0defragment.h" #include "fsp0sysspace.h" #include "row0trunc.h" -#include +#include "mysql/service_wsrep.h" /* wsrep_recovery */ #include "trx0rseg.h" #include "os0proc.h" #include "buf0flu.h" @@ -126,6 +126,9 @@ ibool srv_start_raw_disk_in_use; /** Number of IO threads to use */ ulint srv_n_file_io_threads; +/** UNDO tablespaces starts with space id. */ +ulint srv_undo_space_id_start; + /** TRUE if the server is being started, before rolling back any incomplete transactions */ bool srv_startup_is_before_trx_rollback_phase; @@ -135,26 +138,42 @@ bool srv_is_being_started; bool srv_sys_tablespaces_open; /** TRUE if the server was successfully started */ bool srv_was_started; +/** The original value of srv_log_file_size (innodb_log_file_size) */ +static ulonglong srv_log_file_size_requested; /** TRUE if innobase_start_or_create_for_mysql() has been called */ -static bool srv_start_has_been_called; +static bool srv_start_has_been_called; + +/** Whether any undo log records can be generated */ +UNIV_INTERN bool srv_undo_sources; + #ifdef UNIV_DEBUG /** InnoDB system tablespace to set during recovery */ UNIV_INTERN uint srv_sys_space_size_debug; +/** whether redo log files have been created at startup */ +UNIV_INTERN bool srv_log_files_created; #endif /* UNIV_DEBUG */ /** Bit flags for tracking background thread creation. They are used to determine which threads need to be stopped if we need to abort during the initialisation step. */ enum srv_start_state_t { + /** No thread started */ SRV_START_STATE_NONE = 0, /*!< No thread started */ + /** lock_wait_timeout_thread started */ SRV_START_STATE_LOCK_SYS = 1, /*!< Started lock-timeout thread. */ - SRV_START_STATE_IO = 2, /*!< Started IO threads */ - SRV_START_STATE_MONITOR = 4, /*!< Started montior thread */ - SRV_START_STATE_MASTER = 8, /*!< Started master threadd. */ - SRV_START_STATE_PURGE = 16, /*!< Started purge thread(s) */ - SRV_START_STATE_STAT = 32 /*!< Started bufdump + dict stat - and FTS optimize thread. */ + /** buf_flush_page_cleaner_coordinator, + buf_flush_page_cleaner_worker started */ + SRV_START_STATE_IO = 2, + /** srv_error_monitor_thread, srv_monitor_thread started */ + SRV_START_STATE_MONITOR = 4, + /** srv_master_thread started */ + SRV_START_STATE_MASTER = 8, + /** srv_purge_coordinator_thread, srv_worker_thread started */ + SRV_START_STATE_PURGE = 16, + /** fil_crypt_thread, btr_defragment_thread started + (all background threads that can generate redo log but not undo log */ + SRV_START_STATE_REDO = 32 }; /** Track server thrd starting phases */ @@ -165,7 +184,7 @@ SRV_SHUTDOWN_CLEANUP and then to SRV_SHUTDOWN_LAST_PHASE, and so on */ enum srv_shutdown_t srv_shutdown_state = SRV_SHUTDOWN_NONE; /** Files comprising the system tablespace */ -static os_file_t files[1000]; +pfs_os_file_t files[1000]; /** io_handler_thread parameters for thread identification */ static ulint n[SRV_MAX_N_IO_THREADS + 6]; @@ -182,9 +201,6 @@ static os_thread_t buf_dump_thread_handle; static os_thread_t dict_stats_thread_handle; /** Status variables, is thread started ?*/ static bool thread_started[SRV_MAX_N_IO_THREADS + 6 + 32] = {false}; -static bool buf_dump_thread_started = false; -static bool dict_stats_thread_started = false; -static bool buf_flush_page_cleaner_thread_started = false; /** Name of srv_monitor_file */ static char* srv_monitor_file_name; @@ -344,7 +360,7 @@ static MY_ATTRIBUTE((nonnull, warn_unused_result)) dberr_t create_log_file( /*============*/ - os_file_t* file, /*!< out: file handle */ + pfs_os_file_t* file, /*!< out: file handle */ const char* name) /*!< in: log file name */ { bool ret; @@ -360,17 +376,13 @@ create_log_file( } ib::info() << "Setting log file " << name << " size to " - << (srv_log_file_size >> (20 - UNIV_PAGE_SIZE_SHIFT)) - << " MB"; + << srv_log_file_size << " bytes"; - ret = os_file_set_size(name, *file, - (os_offset_t) srv_log_file_size - << UNIV_PAGE_SIZE_SHIFT, + ret = os_file_set_size(name, *file, srv_log_file_size, srv_read_only_mode); if (!ret) { - ib::error() << "Cannot set log file " << name << " to size " - << (srv_log_file_size >> (20 - UNIV_PAGE_SIZE_SHIFT)) - << " MB"; + ib::error() << "Cannot set log file " << name << " size to " + << srv_log_file_size << " bytes"; return(DB_ERROR); } @@ -383,6 +395,29 @@ create_log_file( /** Initial number of the first redo log file */ #define INIT_LOG_FILE0 (SRV_N_LOG_FILES_MAX + 1) +/** Delete all log files. +@param[in,out] logfilename buffer for log file name +@param[in] dirnamelen length of the directory path +@param[in] n_files number of files to delete */ +static +void +delete_log_files(char* logfilename, size_t dirnamelen, unsigned n_files) +{ + /* Remove any old log files. */ + for (unsigned i = 0; i < n_files; i++) { + sprintf(logfilename + dirnamelen, "ib_logfile%u", i); + + /* Ignore errors about non-existent files or files + that cannot be removed. The create_log_file() will + return an error when the file exists. */ +#ifdef _WIN32 + DeleteFile((LPCTSTR) logfilename); +#else + unlink(logfilename); +#endif + } +} + /*********************************************************************//** Creates all log files. @return DB_SUCCESS or error code */ @@ -402,24 +437,14 @@ create_log_files( return(DB_READ_ONLY); } - /* Remove any old log files. */ - for (unsigned i = 0; i <= INIT_LOG_FILE0; i++) { - sprintf(logfilename + dirnamelen, "ib_logfile%u", i); + /* Crashing after deleting the first file should be + recoverable. The buffer pool was clean, and we can simply + create all log files from the scratch. */ + DBUG_EXECUTE_IF("innodb_log_abort_6", + delete_log_files(logfilename, dirnamelen, 1); + return(DB_ERROR);); - /* Ignore errors about non-existent files or files - that cannot be removed. The create_log_file() will - return an error when the file exists. */ -#ifdef _WIN32 - DeleteFile((LPCTSTR) logfilename); -#else - unlink(logfilename); -#endif - /* Crashing after deleting the first - file should be recoverable. The buffer - pool was clean, and we can simply create - all log files from the scratch. */ - DBUG_EXECUTE_IF("innodb_log_abort_6", return(DB_ERROR);); - } + delete_log_files(logfilename, dirnamelen, INIT_LOG_FILE0 + 1); DBUG_PRINT("ib_log", ("After innodb_log_abort_6")); ut_ad(!buf_pool_check_no_pending_io()); @@ -448,23 +473,22 @@ create_log_files( fil_space_t* log_space = fil_space_create( "innodb_redo_log", SRV_LOG_SPACE_FIRST_ID, 0, FIL_TYPE_LOG, - NULL, /* innodb_encrypt_log works at a different level */ - true /* this is create */); + NULL/* innodb_encrypt_log works at a different level */); ut_a(fil_validate()); ut_a(log_space != NULL); + const ulint size = ulint(srv_log_file_size >> srv_page_size_shift); + logfile0 = fil_node_create( - logfilename, (ulint) srv_log_file_size, - log_space, false, false); + logfilename, size, log_space, false, false); ut_a(logfile0); for (unsigned i = 1; i < srv_n_log_files; i++) { sprintf(logfilename + dirnamelen, "ib_logfile%u", i); - if (!fil_node_create(logfilename, - (ulint) srv_log_file_size, + if (!fil_node_create(logfilename, size, log_space, false, false)) { ib::error() @@ -475,9 +499,8 @@ create_log_files( } } - if (!log_group_init(0, srv_n_log_files, - srv_log_file_size * UNIV_PAGE_SIZE, - SRV_LOG_SPACE_FIRST_ID)) { + log_init(srv_n_log_files); + if (!log_set_capacity(srv_log_file_size_requested)) { return(DB_ERROR); } @@ -516,6 +539,9 @@ create_log_files_rename( we need to explicitly flush the log buffers. */ fil_flush(SRV_LOG_SPACE_FIRST_ID); + ut_ad(!srv_log_files_created); + ut_d(srv_log_files_created = true); + DBUG_EXECUTE_IF("innodb_log_abort_9", return(DB_ERROR);); DBUG_PRINT("ib_log", ("After innodb_log_abort_9")); @@ -557,7 +583,7 @@ static MY_ATTRIBUTE((nonnull, warn_unused_result)) dberr_t open_log_file( /*==========*/ - os_file_t* file, /*!< out: file handle */ + pfs_os_file_t* file, /*!< out: file handle */ const char* name, /*!< in: log file name */ os_offset_t* size) /*!< out: file size */ { @@ -588,7 +614,7 @@ srv_undo_tablespace_create( const char* name, /*!< in: tablespace name */ ulint size) /*!< in: tablespace size in pages */ { - os_file_t fh; + pfs_os_file_t fh; bool ret; dberr_t err = DB_SUCCESS; @@ -657,7 +683,7 @@ srv_undo_tablespace_open( const char* name, /*!< in: tablespace file name */ ulint space_id) /*!< in: tablespace id */ { - os_file_t fh; + pfs_os_file_t fh; bool ret; dberr_t err = DB_ERROR; char undo_name[sizeof "innodb_undo000"]; @@ -705,7 +731,7 @@ srv_undo_tablespace_open( space = fil_space_create( undo_name, space_id, FSP_FLAGS_PAGE_SSIZE(), - FIL_TYPE_TABLESPACE, NULL, true); + FIL_TYPE_TABLESPACE, NULL); ut_a(fil_validate()); ut_a(space); @@ -807,7 +833,6 @@ undo::undo_spaces_t undo::Truncate::s_fix_up_spaces; /** Open the configured number of dedicated undo tablespaces. @param[in] create_new_db whether the database is being initialized @return DB_SUCCESS or error code */ -static dberr_t srv_undo_tablespaces_init(bool create_new_db) { @@ -820,6 +845,7 @@ srv_undo_tablespaces_init(bool create_new_db) srv_undo_tablespaces_open = 0; ut_a(srv_undo_tablespaces <= TRX_SYS_N_RSEGS); + ut_a(!create_new_db || srv_operation == SRV_OPERATION_NORMAL); memset(undo_tablespace_ids, 0x0, sizeof(undo_tablespace_ids)); @@ -833,13 +859,23 @@ srv_undo_tablespaces_init(bool create_new_db) for (i = 0; create_new_db && i < srv_undo_tablespaces; ++i) { char name[OS_FILE_MAX_PATH]; + ulint space_id = i + 1; + + DBUG_EXECUTE_IF("innodb_undo_upgrade", + space_id = i + 3;); ut_snprintf( name, sizeof(name), "%s%cundo%03zu", - srv_undo_dir, OS_PATH_SEPARATOR, i + 1); + srv_undo_dir, OS_PATH_SEPARATOR, space_id); + + if (i == 0) { + srv_undo_space_id_start = space_id; + prev_space_id = srv_undo_space_id_start - 1; + } + + undo_tablespace_ids[i] = space_id; - /* Undo space ids start from 1. */ err = srv_undo_tablespace_create( name, SRV_UNDO_TABLESPACE_SIZE_IN_PAGES); @@ -854,12 +890,30 @@ srv_undo_tablespaces_init(bool create_new_db) the system tablespace (0). If we are creating a new instance then we build the undo_tablespace_ids ourselves since they don't already exist. */ + n_undo_tablespaces = create_new_db + || srv_operation == SRV_OPERATION_BACKUP + || srv_operation == SRV_OPERATION_RESTORE_DELTA + ? srv_undo_tablespaces + : trx_rseg_get_n_undo_tablespaces(undo_tablespace_ids); + srv_undo_tablespaces_active = srv_undo_tablespaces; - if (!create_new_db) { - n_undo_tablespaces = trx_rseg_get_n_undo_tablespaces( - undo_tablespace_ids); - - srv_undo_tablespaces_active = n_undo_tablespaces; + switch (srv_operation) { + case SRV_OPERATION_RESTORE_DELTA: + case SRV_OPERATION_BACKUP: + /* MDEV-13561 FIXME: Determine srv_undo_space_id_start + from the undo001 file. */ + srv_undo_space_id_start = 1; + for (i = 0; i < n_undo_tablespaces; i++) { + undo_tablespace_ids[i] = i + srv_undo_space_id_start; + } + break; + case SRV_OPERATION_NORMAL: + if (create_new_db) { + break; + } + /* fall through */ + case SRV_OPERATION_RESTORE: + ut_ad(!create_new_db); /* Check if any of the UNDO tablespace needs fix-up because server crashed while truncate was active on UNDO tablespace.*/ @@ -893,15 +947,7 @@ srv_undo_tablespaces_init(bool create_new_db) undo_tablespace_ids[i]); } } - } else { - srv_undo_tablespaces_active = srv_undo_tablespaces; - n_undo_tablespaces = srv_undo_tablespaces; - - for (i = 1; i <= n_undo_tablespaces; ++i) { - undo_tablespace_ids[i - 1] = i; - } - - undo_tablespace_ids[i] = ULINT_UNDEFINED; + break; } /* Open all the undo tablespaces that are currently in use. If we @@ -925,8 +971,6 @@ srv_undo_tablespaces_init(bool create_new_db) ut_a(undo_tablespace_ids[i] != 0); ut_a(undo_tablespace_ids[i] != ULINT_UNDEFINED); - /* Undo space ids start from 1. */ - err = srv_undo_tablespace_open(name, undo_tablespace_ids[i]); if (err != DB_SUCCESS) { @@ -937,7 +981,11 @@ srv_undo_tablespaces_init(bool create_new_db) prev_space_id = undo_tablespace_ids[i]; - ++srv_undo_tablespaces_open; + /* Note the first undo tablespace id in case of + no active undo tablespace. */ + if (0 == srv_undo_tablespaces_open++) { + srv_undo_space_id_start = undo_tablespace_ids[i]; + } } /* Open any extra unused undo tablespaces. These must be contiguous. @@ -964,6 +1012,12 @@ srv_undo_tablespaces_init(bool create_new_db) ++srv_undo_tablespaces_open; } + /* Initialize srv_undo_space_id_start=0 when there are no + dedicated undo tablespaces. */ + if (n_undo_tablespaces == 0) { + srv_undo_space_id_start = 0; + } + /* If the user says that there are fewer than what we find we tolerate that discrepancy but not the inverse. Because there could be unused undo tablespaces for future use. */ @@ -993,10 +1047,11 @@ srv_undo_tablespaces_init(bool create_new_db) mtr_start(&mtr); /* The undo log tablespace */ - for (i = 1; i <= n_undo_tablespaces; ++i) { + for (i = 0; i < n_undo_tablespaces; ++i) { fsp_header_init( - i, SRV_UNDO_TABLESPACE_SIZE_IN_PAGES, &mtr); + undo_tablespace_ids[i], + SRV_UNDO_TABLESPACE_SIZE_IN_PAGES, &mtr); } mtr_commit(&mtr); @@ -1201,12 +1256,9 @@ static void srv_shutdown_all_bg_threads() { + ut_ad(!srv_undo_sources); srv_shutdown_state = SRV_SHUTDOWN_EXIT_THREADS; - if (!srv_start_state) { - return; - } - /* All threads end up waiting for certain events. Put those events to the signaled state. Then the threads will exit themselves after os_event_wait(). */ @@ -1256,28 +1308,28 @@ srv_shutdown_all_bg_threads() os_event_set(buf_flush_event); - /* f. dict_stats_thread is signaled from - logs_empty_and_mark_files_at_shutdown() and - should have already quit or is quitting right - now. */ - if (srv_use_mtflush) { - /* g. Exit the multi threaded flush threads */ buf_mtflu_io_thread_exit(); } } - if (!buf_page_cleaner_is_active && os_aio_all_slots_free()) { - os_aio_wake_all_threads_at_shutdown(); - } - - const bool active = os_thread_active(); - - os_thread_sleep(100000); - - if (!active) { + if (!os_thread_count) { return; } + + switch (srv_operation) { + case SRV_OPERATION_BACKUP: + case SRV_OPERATION_RESTORE_DELTA: + break; + case SRV_OPERATION_NORMAL: + case SRV_OPERATION_RESTORE: + if (!buf_page_cleaner_is_active + && os_aio_all_slots_free()) { + os_aio_wake_all_threads_at_shutdown(); + } + } + + os_thread_sleep(100000); } ib::warn() << os_thread_count << " threads created by InnoDB" @@ -1312,7 +1364,7 @@ srv_init_abort_low( dberr_t err) { if (create_new_db) { - ib::error() << "InnoDB Database creation was aborted" + ib::error() << "Database creation was aborted" #ifdef UNIV_DEBUG " at " << innobase_basename(file) << "[" << line << "]" #endif /* UNIV_DEBUG */ @@ -1388,7 +1440,7 @@ srv_prepare_to_delete_redo_log_files( info << srv_n_log_files << "*" << srv_log_file_size_requested - << " pages; LSN=" << flushed_lsn; + << " bytes; LSN=" << flushed_lsn; } /* Flush the old log files. */ @@ -1429,8 +1481,7 @@ Starts InnoDB and creates a new database if database files are not found and the user wants. @return DB_SUCCESS or error code */ dberr_t -innobase_start_or_create_for_mysql(void) -/*====================================*/ +innobase_start_or_create_for_mysql() { bool create_new_db = false; lsn_t flushed_lsn; @@ -1442,6 +1493,9 @@ innobase_start_or_create_for_mysql(void) size_t dirnamelen; unsigned i = 0; + ut_ad(srv_operation == SRV_OPERATION_NORMAL + || srv_operation == SRV_OPERATION_RESTORE); + if (srv_force_recovery == SRV_FORCE_NO_LOG_REDO) { srv_read_only_mode = true; } @@ -1617,10 +1671,10 @@ innobase_start_or_create_for_mysql(void) /* Do not allocate too large of a buffer pool on Windows 32-bit systems, which can have trouble allocating larger single contiguous memory blocks. */ + srv_buf_pool_size = static_cast(ut_uint64_align_up(srv_buf_pool_size, srv_buf_pool_chunk_unit)); srv_buf_pool_instances = ut_min( static_cast(MAX_BUFFER_POOLS), - static_cast(srv_buf_pool_size - / (128 * 1024 * 1024))); + static_cast(srv_buf_pool_size / srv_buf_pool_chunk_unit)); #else /* defined(_WIN32) && !defined(_WIN64) */ /* Default to 8 instances when size > 1GB. */ srv_buf_pool_instances = 8; @@ -1710,15 +1764,6 @@ innobase_start_or_create_for_mysql(void) } } - mutex_create(LATCH_ID_SRV_DICT_TMPFILE, - &srv_dict_tmpfile_mutex); - - srv_dict_tmpfile = os_file_create_tmpfile(NULL); - - if (!srv_dict_tmpfile && err == DB_SUCCESS) { - err = DB_ERROR; - } - mutex_create(LATCH_ID_SRV_MISC_TMPFILE, &srv_misc_tmpfile_mutex); @@ -1808,12 +1853,10 @@ innobase_start_or_create_for_mysql(void) #endif /* UNIV_DEBUG */ fsp_init(); - log_init(); + log_sys_init(); - recv_sys_create(); - recv_sys_init(buf_pool_get_curr_size()); + recv_sys_init(); lock_sys_create(srv_lock_table_size); - srv_start_state_set(SRV_START_STATE_LOCK_SYS); /* Create i/o-handler threads: */ @@ -1828,26 +1871,23 @@ innobase_start_or_create_for_mysql(void) if (!srv_read_only_mode) { buf_flush_page_cleaner_init(); + buf_page_cleaner_is_active = true; os_thread_create(buf_flush_page_cleaner_coordinator, NULL, NULL); - buf_flush_page_cleaner_thread_started = true; - for (i = 1; i < srv_n_page_cleaners; ++i) { os_thread_create(buf_flush_page_cleaner_worker, NULL, NULL); } - /* Make sure page cleaner is active. */ - while (!buf_page_cleaner_is_active) { - os_thread_sleep(10000); - } - +#ifdef UNIV_LINUX + /* Wait for the setpriority() call to finish. */ + os_event_wait(recv_sys->flush_end); +#endif /* UNIV_LINUX */ srv_start_state_set(SRV_START_STATE_IO); } - if (srv_n_log_files * srv_log_file_size * UNIV_PAGE_SIZE - >= 512ULL * 1024ULL * 1024ULL * 1024ULL) { + if (srv_n_log_files * srv_log_file_size >= 512ULL << 30) { /* log_block_convert_lsn_to_no() limits the returned block number to 1G and given that OS_FILE_LOG_BLOCK_SIZE is 512 bytes, then we have a limit of 512 GB. If that limit is to @@ -1858,18 +1898,8 @@ innobase_start_or_create_for_mysql(void) return(srv_init_abort(DB_ERROR)); } - if (srv_n_log_files * srv_log_file_size >= ULINT_MAX) { - /* fil_io() takes ulint as an argument and we are passing - (next_offset / UNIV_PAGE_SIZE) to it in log_group_write_buf(). - So (next_offset / UNIV_PAGE_SIZE) must be less than ULINT_MAX. - So next_offset must be < ULINT_MAX * UNIV_PAGE_SIZE. This - means that we are limited to ULINT_MAX * UNIV_PAGE_SIZE which - is 64 TB on 32 bit systems. */ - ib::error() << "Combined size of log files must be < " - << ULINT_MAX / 1073741824 * UNIV_PAGE_SIZE << " GB"; - - return(srv_init_abort(DB_ERROR)); - } + compile_time_assert(ulonglong(ULINT_MAX) * UNIV_PAGE_SIZE_MIN + >= 512ULL << 30); os_normalize_path(srv_data_home); @@ -1956,6 +1986,10 @@ innobase_start_or_create_for_mysql(void) if (err == DB_NOT_FOUND) { if (i == 0) { + if (srv_operation + == SRV_OPERATION_RESTORE) { + return(DB_SUCCESS); + } if (flushed_lsn < static_cast(1000)) { ib::error() @@ -2008,27 +2042,22 @@ innobase_start_or_create_for_mysql(void) ut_a(size != (os_offset_t) -1); - if (size & ((1 << UNIV_PAGE_SIZE_SHIFT) - 1)) { + if (size & (OS_FILE_LOG_BLOCK_SIZE - 1)) { ib::error() << "Log file " << logfilename << " size " << size << " is not a" - " multiple of innodb_page_size"; + " multiple of 512 bytes"; return(srv_init_abort(DB_ERROR)); } - size >>= UNIV_PAGE_SIZE_SHIFT; - if (i == 0) { srv_log_file_size = size; } else if (size != srv_log_file_size) { ib::error() << "Log file " << logfilename - << " is of different size " - << (size << UNIV_PAGE_SIZE_SHIFT) + << " is of different size " << size << " bytes than other log files " - << (srv_log_file_size - << UNIV_PAGE_SIZE_SHIFT) - << " bytes!"; + << srv_log_file_size << " bytes!"; return(srv_init_abort(DB_ERROR)); } } @@ -2044,28 +2073,28 @@ innobase_start_or_create_for_mysql(void) "innodb_redo_log", SRV_LOG_SPACE_FIRST_ID, 0, FIL_TYPE_LOG, - NULL /* no encryption yet */, - true /* create */); + NULL /* no encryption yet */); ut_a(fil_validate()); ut_a(log_space); - /* srv_log_file_size is measured in pages; if page size is 16KB, - then we have a limit of 64TB on 32 bit systems */ - ut_a(srv_log_file_size <= ULINT_MAX); + ut_a(srv_log_file_size <= 512ULL << 30); - for (unsigned j = 0; j < i; j++) { + const ulint size = 1 + ulint((srv_log_file_size - 1) + >> srv_page_size_shift); + + for (unsigned j = 0; j < srv_n_log_files_found; j++) { sprintf(logfilename + dirnamelen, "ib_logfile%u", j); - if (!fil_node_create(logfilename, - (ulint) srv_log_file_size, + if (!fil_node_create(logfilename, size, log_space, false, false)) { return(srv_init_abort(DB_ERROR)); } } - if (!log_group_init(0, i, srv_log_file_size * UNIV_PAGE_SIZE, - SRV_LOG_SPACE_FIRST_ID)) { + log_init(srv_n_log_files_found); + + if (!log_set_capacity(srv_log_file_size_requested)) { return(srv_init_abort(DB_ERROR)); } } @@ -2104,14 +2133,24 @@ files_checked: mtr_start(&mtr); - bool ret = fsp_header_init(0, sum_of_new_sizes, &mtr); + fsp_header_init(0, sum_of_new_sizes, &mtr); + + compile_time_assert(TRX_SYS_SPACE == 0); + compile_time_assert(IBUF_SPACE_ID == 0); + + ulint ibuf_root = btr_create( + DICT_CLUSTERED | DICT_UNIVERSAL | DICT_IBUF, + 0, univ_page_size, DICT_IBUF_ID_MIN, + dict_ind_redundant, NULL, &mtr); mtr_commit(&mtr); - if (!ret) { + if (ibuf_root == FIL_NULL) { return(srv_init_abort(DB_ERROR)); } + ut_ad(ibuf_root == IBUF_TREE_ROOT_PAGE_NO); + /* To maintain backward compatibility we create only the first rollback segment before the double write buffer. All the remaining rollback segments will be created later, @@ -2184,14 +2223,6 @@ files_checked: recv_sys->dblwr.pages.clear(); - if (err == DB_SUCCESS && !srv_read_only_mode) { - log_mutex_enter(); - if (log_sys->is_encrypted() && !log_crypt_init()) { - err = DB_ERROR; - } - log_mutex_exit(); - } - if (err == DB_SUCCESS) { /* Initialize the change buffer. */ err = dict_boot(); @@ -2210,6 +2241,11 @@ files_checked: recv_group_scan_log_recs(). */ recv_apply_hashed_log_recs(true); + + if (recv_sys->found_corrupt_log) { + return(srv_init_abort(DB_CORRUPTION)); + } + DBUG_PRINT("ib_log", ("apply completed")); if (recv_needed_recovery) { @@ -2217,17 +2253,6 @@ files_checked: } } - if (recv_sys->found_corrupt_log) { - ib::warn() - << "The log file may have been corrupt and it" - " is possible that the log scan or parsing" - " did not proceed far enough in recovery." - " Please run CHECK TABLE on your InnoDB tables" - " to check that they are ok!" - " It may be safest to recover your" - " InnoDB database from a backup!"; - } - if (!srv_read_only_mode) { const ulint flags = FSP_FLAGS_PAGE_SSIZE(); for (ulint id = 0; id <= srv_undo_tablespaces; id++) { @@ -2254,7 +2279,7 @@ files_checked: const ulint sum_of_data_file_sizes = srv_sys_space.get_sum_of_sizes(); /* Compare the system tablespace file size to what is - stored in FSP_SIZE. In open_or_create_data_files() + stored in FSP_SIZE. In srv_sys_space.open_or_create() we already checked that the file sizes match the innodb_data_file_path specification. */ if (srv_read_only_mode @@ -2292,6 +2317,26 @@ files_checked: recv_recovery_from_checkpoint_finish(); + if (srv_operation == SRV_OPERATION_RESTORE) { + /* After applying the redo log from + SRV_OPERATION_BACKUP, flush the changes + to the data files and delete the log file. + No further change to InnoDB files is needed. */ + ut_ad(!srv_force_recovery); + ut_ad(srv_n_log_files_found <= 1); + ut_ad(recv_no_log_write); + buf_flush_sync_all_buf_pools(); + err = fil_write_flushed_lsn(log_get_lsn()); + ut_ad(!buf_pool_check_no_pending_io()); + fil_close_log_files(true); + log_group_close_all(); + if (err == DB_SUCCESS) { + delete_log_files(logfilename, dirnamelen, + srv_n_log_files_found); + } + return(err); + } + /* Upgrade or resize or rebuild the redo logs before generating any dirty pages, so that the old redo log files will not be written to. */ @@ -2361,7 +2406,6 @@ files_checked: } } - /* Validate a few system page types that were left uninitialized by older versions of MySQL. */ if (!high_level_read_only) { @@ -2458,6 +2502,7 @@ files_checked: } recv_recovery_rollback_active(); + srv_startup_is_before_trx_rollback_phase = FALSE; /* It is possible that file_format tag has never been set. In this case we initialize it to minimum @@ -2470,14 +2515,6 @@ files_checked: ut_ad(err == DB_SUCCESS); ut_a(sum_of_new_sizes != ULINT_UNDEFINED); - /* Open temp-tablespace and keep it open until shutdown. */ - - err = srv_open_tmp_tablespace(create_new_db); - - if (err != DB_SUCCESS) { - return(srv_init_abort(err)); - } - /* Create the doublewrite buffer to a new tablespace */ if (!srv_read_only_mode && srv_force_recovery < SRV_FORCE_NO_TRX_UNDO && !buf_dblwr_create()) { @@ -2528,7 +2565,8 @@ files_checked: srv_monitor_thread, NULL, thread_ids + 4 + SRV_MAX_N_IO_THREADS); thread_started[4 + SRV_MAX_N_IO_THREADS] = true; - srv_start_state_set(SRV_START_STATE_MONITOR); + srv_start_state |= SRV_START_STATE_LOCK_SYS + | SRV_START_STATE_MONITOR; } /* Create the SYS_FOREIGN and SYS_FOREIGN_COLS system tables */ @@ -2552,6 +2590,18 @@ files_checked: return(srv_init_abort(err)); } + if (!srv_read_only_mode && srv_operation == SRV_OPERATION_NORMAL) { + /* Initialize the innodb_temporary tablespace and keep + it open until shutdown. */ + err = srv_open_tmp_tablespace(create_new_db); + + if (err != DB_SUCCESS) { + return(srv_init_abort(err)); + } + + trx_temp_rseg_create(); + } + srv_is_being_started = false; ut_a(trx_purge_state() == PURGE_STATE_INIT); @@ -2560,7 +2610,6 @@ files_checked: operations */ if (!srv_read_only_mode) { - thread_handles[1 + SRV_MAX_N_IO_THREADS] = os_thread_create( srv_master_thread, NULL, thread_ids + (1 + SRV_MAX_N_IO_THREADS)); @@ -2568,8 +2617,16 @@ files_checked: srv_start_state_set(SRV_START_STATE_MASTER); } - if (!srv_read_only_mode + if (!srv_read_only_mode && srv_operation == SRV_OPERATION_NORMAL && srv_force_recovery < SRV_FORCE_NO_BACKGROUND) { + srv_undo_sources = true; + /* Create the dict stats gathering thread */ + srv_dict_stats_thread_active = true; + dict_stats_thread_handle = os_thread_create( + dict_stats_thread, NULL, NULL); + + /* Create the thread that will optimize the FTS sub-system. */ + fts_optimize_init(); thread_handles[5 + SRV_MAX_N_IO_THREADS] = os_thread_create( srv_purge_coordinator_thread, @@ -2645,12 +2702,12 @@ files_checked: */ if (!wsrep_recovery) { #endif /* WITH_WSREP */ + /* Create the buffer pool dump/load thread */ + srv_buf_dump_thread_active = true; buf_dump_thread_handle= os_thread_create(buf_dump_thread, NULL, NULL); - srv_buf_dump_thread_active = true; - buf_dump_thread_started = true; #ifdef WITH_WSREP } else { ib::warn() << @@ -2664,32 +2721,16 @@ files_checked: will flush dirty pages and that might need e.g. fil_crypt_threads_event. */ fil_system_enter(); + btr_scrub_init(); fil_crypt_threads_init(); fil_system_exit(); - /* - Create a checkpoint before logging anything new, so that - the current encryption key in use is definitely logged - before any log blocks encrypted with that key. - */ - log_make_checkpoint_at(LSN_MAX, TRUE); - - /* Create the dict stats gathering thread */ - dict_stats_thread_handle = os_thread_create( - dict_stats_thread, NULL, NULL); - srv_dict_stats_thread_active = true; - dict_stats_thread_started = true; - - /* Create the thread that will optimize the FTS sub-system. */ - fts_optimize_init(); - - /* Init data for datafile scrub threads */ - btr_scrub_init(); - /* Initialize online defragmentation. */ btr_defragment_init(); + btr_defragment_thread_active = true; + os_thread_create(btr_defragment_thread, NULL, NULL); - srv_start_state_set(SRV_START_STATE_STAT); + srv_start_state |= SRV_START_STATE_REDO; } /* Create the buffer pool resize thread */ @@ -2729,16 +2770,19 @@ srv_fts_close(void) } #endif -/****************************************************************//** -Shuts down background threads that can generate undo pages. */ +/** Shut down background threads that can generate undo log. */ void -srv_shutdown_bg_undo_sources(void) -/*===========================*/ +srv_shutdown_bg_undo_sources() { - if (srv_start_state_is_set(SRV_START_STATE_STAT)) { + if (srv_undo_sources) { ut_ad(!srv_read_only_mode); fts_optimize_shutdown(); dict_stats_shutdown(); + while (row_get_background_drop_list_len_low()) { + srv_wake_master_thread(); + os_thread_yield(); + } + srv_undo_sources = false; } } @@ -2747,25 +2791,26 @@ void innodb_shutdown() { ut_ad(!srv_running); + ut_ad(!srv_undo_sources); - if (srv_fast_shutdown) { - srv_shutdown_bg_undo_sources(); + switch (srv_operation) { + case SRV_OPERATION_BACKUP: + case SRV_OPERATION_RESTORE: + case SRV_OPERATION_RESTORE_DELTA: + fil_close_all_files(); + break; + case SRV_OPERATION_NORMAL: + /* Shut down the persistent files. */ + logs_empty_and_mark_files_at_shutdown(); + + if (ulint n_threads = srv_conc_get_active_threads()) { + ib::warn() << "Query counter shows " + << n_threads << " queries still" + " inside InnoDB at shutdown"; + } } - /* 1. Flush the buffer pool to disk, write the current lsn to - the tablespace header(s), and copy all log data to archive. - The step 1 is the real InnoDB shutdown. The remaining steps 2 - ... - just free data structures after the shutdown. */ - - logs_empty_and_mark_files_at_shutdown(); - - if (ulint n_threads = srv_conc_get_active_threads()) { - ib::warn() << "Query counter shows " - << n_threads << " queries still" - " inside InnoDB at shutdown"; - } - - /* 2. Make all threads created by InnoDB to exit */ + /* Exit any remaining threads. */ srv_shutdown_all_bg_threads(); if (srv_monitor_file) { @@ -2777,11 +2822,6 @@ innodb_shutdown() } } - if (srv_dict_tmpfile) { - fclose(srv_dict_tmpfile); - srv_dict_tmpfile = 0; - } - if (srv_misc_tmpfile) { fclose(srv_misc_tmpfile); srv_misc_tmpfile = 0; @@ -2803,14 +2843,14 @@ innodb_shutdown() dict_stats_thread_deinit(); } - if (srv_start_state_is_set(SRV_START_STATE_STAT)) { + if (srv_start_state_is_set(SRV_START_STATE_REDO)) { ut_ad(!srv_read_only_mode); /* srv_shutdown_bg_undo_sources() already invoked fts_optimize_shutdown(); dict_stats_shutdown(); */ fil_crypt_threads_cleanup(); btr_scrub_cleanup(); - /* FIXME: call btr_defragment_shutdown(); */ + btr_defragment_shutdown(); } /* This must be disabled before closing the buffer pool @@ -2846,7 +2886,6 @@ innodb_shutdown() the temp files that the cover. */ if (!srv_read_only_mode) { mutex_free(&srv_monitor_file_mutex); - mutex_free(&srv_dict_tmpfile_mutex); mutex_free(&srv_misc_tmpfile_mutex); } @@ -2870,16 +2909,13 @@ innodb_shutdown() /* 4. Free all allocated memory */ pars_lexer_close(); - log_mem_free(); + recv_sys_close(); + ut_ad(buf_pool_ptr || !srv_was_started); if (buf_pool_ptr) { buf_pool_free(srv_buf_pool_instances); } - /* 6. Free the thread management resoruces. */ - os_thread_free(); - - /* 7. Free the synchronisation infrastructure. */ sync_check_close(); if (dict_foreign_err_file) { @@ -2896,85 +2932,6 @@ innodb_shutdown() srv_start_has_been_called = false; } -#if 0 // TODO: Enable this in WL#6608 -/******************************************************************** -Signal all per-table background threads to shutdown, and wait for them to do -so. */ -static -void -srv_shutdown_table_bg_threads(void) -/*===============================*/ -{ - dict_table_t* table; - dict_table_t* first; - dict_table_t* last = NULL; - - mutex_enter(&dict_sys->mutex); - - /* Signal all threads that they should stop. */ - table = UT_LIST_GET_FIRST(dict_sys->table_LRU); - first = table; - while (table) { - dict_table_t* next; - fts_t* fts = table->fts; - - if (fts != NULL) { - fts_start_shutdown(table, fts); - } - - next = UT_LIST_GET_NEXT(table_LRU, table); - - if (!next) { - last = table; - } - - table = next; - } - - /* We must release dict_sys->mutex here; if we hold on to it in the - loop below, we will deadlock if any of the background threads try to - acquire it (for example, the FTS thread by calling que_eval_sql). - - Releasing it here and going through dict_sys->table_LRU without - holding it is safe because: - - a) MySQL only starts the shutdown procedure after all client - threads have been disconnected and no new ones are accepted, so no - new tables are added or old ones dropped. - - b) Despite its name, the list is not LRU, and the order stays - fixed. - - To safeguard against the above assumptions ever changing, we store - the first and last items in the list above, and then check that - they've stayed the same below. */ - - mutex_exit(&dict_sys->mutex); - - /* Wait for the threads of each table to stop. This is not inside - the above loop, because by signaling all the threads first we can - overlap their shutting down delays. */ - table = UT_LIST_GET_FIRST(dict_sys->table_LRU); - ut_a(first == table); - while (table) { - dict_table_t* next; - fts_t* fts = table->fts; - - if (fts != NULL) { - fts_shutdown(table, fts); - } - - next = UT_LIST_GET_NEXT(table_LRU, table); - - if (table == last) { - ut_a(!next); - } - - table = next; - } -} -#endif - /** Get the meta-data filename from the table name for a single-table tablespace. @param[in] table table object diff --git a/storage/innobase/sync/sync0arr.cc b/storage/innobase/sync/sync0arr.cc index 75919043731..f1589e1f3a7 100644 --- a/storage/innobase/sync/sync0arr.cc +++ b/storage/innobase/sync/sync0arr.cc @@ -621,6 +621,7 @@ sync_array_cell_print( } } +#ifdef UNIV_DEBUG /******************************************************************//** Looks for a cell with the given thread id. @return pointer to cell or NULL if not found */ @@ -648,7 +649,6 @@ sync_array_find_thread( return(NULL); /* Not found */ } -#ifdef UNIV_DEBUG /******************************************************************//** Recursion step for deadlock detection. @return TRUE if deadlock detected */ diff --git a/storage/innobase/sync/sync0debug.cc b/storage/innobase/sync/sync0debug.cc index 4fff24a77f1..c80ea6aef3e 100644 --- a/storage/innobase/sync/sync0debug.cc +++ b/storage/innobase/sync/sync0debug.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2014, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -298,29 +298,23 @@ struct LatchDebug { } /** Iterate over a thread's latches. - @param[in,out] functor The callback + @param[in] functor The callback @return true if the functor returns true. */ - bool for_each(sync_check_functor_t& functor) + bool for_each(const sync_check_functor_t& functor) UNIV_NOTHROW { - const Latches* latches = thread_latches(); + if (const Latches* latches = thread_latches()) { + Latches::const_iterator end = latches->end(); + for (Latches::const_iterator it = latches->begin(); + it != end; ++it) { - if (latches == 0) { - return(functor.result()); - } - - Latches::const_iterator end = latches->end(); - - for (Latches::const_iterator it = latches->begin(); - it != end; - ++it) { - - if (functor(it->m_level)) { - break; + if (functor(it->m_level)) { + return(true); + } } } - return(functor.result()); + return(false); } /** Removes a latch from the thread level array if it is found there. @@ -1215,13 +1209,12 @@ sync_check_find(latch_level_t level) /** Iterate over the thread's latches. @param[in,out] functor called for each element. -@return false if the sync debug hasn't been initialised -@return the value returned by the functor */ +@return true if the functor returns true for any element */ bool -sync_check_iterate(sync_check_functor_t& functor) +sync_check_iterate(const sync_check_functor_t& functor) { - if (LatchDebug::instance() != NULL) { - return(LatchDebug::instance()->for_each(functor)); + if (LatchDebug* debug = LatchDebug::instance()) { + return(debug->for_each(functor)); } return(false); @@ -1274,11 +1267,6 @@ LatchDebug::shutdown() mutex_free(&rw_lock_debug_mutex); - if (instance() == NULL) { - - return; - } - ut_a(s_initialized); s_initialized = false; @@ -1443,9 +1431,6 @@ sync_latch_meta_init() LATCH_ADD_MUTEX(RW_LOCK_MUTEX, SYNC_NO_ORDER_CHECK, rw_lock_mutex_key); - LATCH_ADD_MUTEX(SRV_DICT_TMPFILE, SYNC_DICT_OPERATION, - srv_dict_tmpfile_mutex_key); - LATCH_ADD_MUTEX(SRV_INNODB_MONITOR, SYNC_NO_ORDER_CHECK, srv_innodb_monitor_mutex_key); @@ -1498,8 +1483,6 @@ sync_latch_meta_init() LATCH_ADD_MUTEX(SYNC_ARRAY_MUTEX, SYNC_NO_ORDER_CHECK, sync_array_mutex_key); - LATCH_ADD_MUTEX(THREAD_MUTEX, SYNC_NO_ORDER_CHECK, thread_mutex_key); - LATCH_ADD_MUTEX(ZIP_PAD_MUTEX, SYNC_NO_ORDER_CHECK, zip_pad_mutex_key); LATCH_ADD_MUTEX(OS_AIO_READ_MUTEX, SYNC_NO_ORDER_CHECK, @@ -1532,11 +1515,12 @@ sync_latch_meta_init() buf_block_lock_key); #ifdef UNIV_DEBUG - LATCH_ADD_RWLOCK(BUF_BLOCK_DEBUG, SYNC_NO_ORDER_CHECK, + LATCH_ADD_RWLOCK(BUF_BLOCK_DEBUG, SYNC_LEVEL_VARYING, buf_block_debug_latch_key); #endif /* UNIV_DEBUG */ - LATCH_ADD_RWLOCK(DICT_OPERATION, SYNC_DICT, dict_operation_lock_key); + LATCH_ADD_RWLOCK(DICT_OPERATION, SYNC_DICT_OPERATION, + dict_operation_lock_key); LATCH_ADD_RWLOCK(CHECKPOINT, SYNC_NO_ORDER_CHECK, checkpoint_lock_key); diff --git a/storage/innobase/sync/sync0rw.cc b/storage/innobase/sync/sync0rw.cc index c748bad1417..6322b14335f 100644 --- a/storage/innobase/sync/sync0rw.cc +++ b/storage/innobase/sync/sync0rw.cc @@ -277,6 +277,9 @@ rw_lock_free_func( /* We did an in-place new in rw_lock_create_func() */ ut_d(lock->~rw_lock_t()); + /* Sometimes (maybe when compiled with GCC -O3) the above call + to rw_lock_t::~rw_lock_t() will not actually assign magic_n=0. */ + ut_d(lock->magic_n = 0); } /******************************************************************//** diff --git a/storage/innobase/sync/sync0sync.cc b/storage/innobase/sync/sync0sync.cc index 099a56c5457..4be7162f631 100644 --- a/storage/innobase/sync/sync0sync.cc +++ b/storage/innobase/sync/sync0sync.cc @@ -78,7 +78,6 @@ mysql_pfs_key_t rtr_path_mutex_key; mysql_pfs_key_t rtr_ssn_mutex_key; mysql_pfs_key_t rw_lock_list_mutex_key; mysql_pfs_key_t rw_lock_mutex_key; -mysql_pfs_key_t srv_dict_tmpfile_mutex_key; mysql_pfs_key_t srv_innodb_monitor_mutex_key; mysql_pfs_key_t srv_misc_tmpfile_mutex_key; mysql_pfs_key_t srv_monitor_file_mutex_key; diff --git a/storage/innobase/trx/trx0i_s.cc b/storage/innobase/trx/trx0i_s.cc index fcc50b8c76d..7854ad2ab5a 100644 --- a/storage/innobase/trx/trx0i_s.cc +++ b/storage/innobase/trx/trx0i_s.cc @@ -589,10 +589,6 @@ thd_done: row->trx_foreign_key_error = NULL; } -#ifdef BTR_CUR_HASH_ADAPT - row->trx_has_search_latch = (ibool) trx->has_search_latch; -#endif /* BTR_CUR_HASH_ADAPT */ - row->trx_is_read_only = trx->read_only; row->trx_is_autocommit_non_locking = trx_is_autocommit_non_locking(trx); diff --git a/storage/innobase/trx/trx0purge.cc b/storage/innobase/trx/trx0purge.cc index b21ec75c3a6..e22bbd61162 100644 --- a/storage/innobase/trx/trx0purge.cc +++ b/storage/innobase/trx/trx0purge.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under @@ -61,7 +61,6 @@ trx_undo_rec_t trx_purge_dummy_rec; #ifdef UNIV_DEBUG my_bool srv_purge_view_update_only_debug; -bool trx_commit_disallowed = false; #endif /* UNIV_DEBUG */ /** Sentinel value */ @@ -148,12 +147,10 @@ TrxUndoRsegsIterator::set_next() ut_a(purge_sys->rseg->last_page_no != FIL_NULL); ut_ad(purge_sys->rseg->last_trx_no == m_trx_undo_rsegs.get_trx_no()); - /* We assume in purge of externally stored fields that - space id is in the range of UNDO tablespace space ids - unless space is system tablespace */ - ut_a(purge_sys->rseg->space <= srv_undo_tablespaces_open - || is_system_tablespace( - purge_sys->rseg->space)); + /* We assume in purge of externally stored fields that space id is + in the range of UNDO tablespace space ids */ + ut_a(purge_sys->rseg->space == TRX_SYS_SPACE + || srv_is_undo_tablespace(purge_sys->rseg->space)); ut_a(purge_sys->iter.trx_no <= purge_sys->rseg->last_trx_no); @@ -284,7 +281,28 @@ trx_purge_add_update_undo_to_history( hist_size + undo->size, MLOG_4BYTES, mtr); } - ut_ad(!trx_commit_disallowed); + /* Before any transaction-generating background threads or the + purge have been started, recv_recovery_rollback_active() can + start transactions in row_merge_drop_temp_indexes() and + fts_drop_orphaned_tables(), and roll back recovered transactions. + + Arbitrary user transactions may be executed when all the undo log + related background processes (including purge) are disabled due to + innodb_force_recovery=2 or innodb_force_recovery=3. + DROP TABLE may be executed at any innodb_force_recovery level. + + After the purge thread has been given permission to exit, + in fast shutdown, we may roll back transactions (trx->undo_no==0) + in THD::cleanup() invoked from unlink_thd(), and we may also + continue to execute user transactions. */ + ut_ad(srv_undo_sources + || ((srv_startup_is_before_trx_rollback_phase + || trx_rollback_or_clean_is_active) + && purge_sys->state == PURGE_STATE_INIT) + || (srv_force_recovery >= SRV_FORCE_NO_BACKGROUND + && purge_sys->state == PURGE_STATE_DISABLED) + || ((trx->undo_no == 0 || trx->in_mysql_trx_list) + && srv_fast_shutdown)); /* Add the log as the first in the history list */ flst_add_first(rseg_header + TRX_RSEG_HISTORY, diff --git a/storage/innobase/trx/trx0rec.cc b/storage/innobase/trx/trx0rec.cc index 47d24b63114..02aee500e02 100644 --- a/storage/innobase/trx/trx0rec.cc +++ b/storage/innobase/trx/trx0rec.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -906,6 +906,10 @@ trx_undo_page_report_modify( ut_ad(!rec_get_deleted_flag(rec, dict_table_is_comp(table))); type_cmpl = TRX_UNDO_DEL_MARK_REC; } else if (rec_get_deleted_flag(rec, dict_table_is_comp(table))) { + /* In delete-marked records, DB_TRX_ID must + always refer to an existing update_undo log record. */ + ut_ad(row_get_rec_trx_id(rec, index, offsets)); + type_cmpl = TRX_UNDO_UPD_DEL_REC; /* We are about to update a delete marked record. We don't typically need the prefix in this case unless @@ -1839,22 +1843,22 @@ transaction. dberr_t trx_undo_report_row_operation( /*==========================*/ - ulint flags, /*!< in: if BTR_NO_UNDO_LOG_FLAG bit is - set, does nothing */ - ulint op_type, /*!< in: TRX_UNDO_INSERT_OP or - TRX_UNDO_MODIFY_OP */ que_thr_t* thr, /*!< in: query thread */ dict_index_t* index, /*!< in: clustered index */ const dtuple_t* clust_entry, /*!< in: in the case of an insert, index entry to insert into the - clustered index, otherwise NULL */ + clustered index; in updates, + may contain a clustered index + record tuple that also contains + virtual columns of the table; + otherwise, NULL */ const upd_t* update, /*!< in: in the case of an update, the update vector, otherwise NULL */ ulint cmpl_info, /*!< in: compiler info on secondary index updates */ - const rec_t* rec, /*!< in: in case of an update or delete + const rec_t* rec, /*!< in: case of an update or delete marking, the record in the clustered - index, otherwise NULL */ + index; NULL if insert */ const ulint* offsets, /*!< in: rec_get_offsets(rec) */ roll_ptr_t* roll_ptr) /*!< out: rollback pointer to the inserted undo log record, @@ -1870,20 +1874,15 @@ trx_undo_report_row_operation( #endif /* UNIV_DEBUG */ ut_a(dict_index_is_clust(index)); + ut_ad(!update || rec); ut_ad(!rec || rec_offs_validate(rec, index, offsets)); ut_ad(!srv_read_only_mode); - ut_ad(op_type == TRX_UNDO_INSERT_OP || op_type == TRX_UNDO_MODIFY_OP); - ut_ad((op_type != TRX_UNDO_INSERT_OP) - || (clust_entry && !update && !rec)); - - if (flags & BTR_NO_UNDO_LOG_FLAG) { - - *roll_ptr = 0; - - return(DB_SUCCESS); - } trx = thr_get_trx(thr); + /* This function must not be invoked during rollback + (of a TRX_STATE_PREPARE transaction or otherwise). */ + ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE)); + ut_ad(!trx->in_rollback); mtr.start(); trx_undo_t** pundo; @@ -1897,12 +1896,13 @@ trx_undo_report_row_operation( pundo = &trx->rsegs.m_noredo.undo; } else { ut_ad(!trx->read_only); + ut_ad(trx->id); /* Keep INFORMATION_SCHEMA.TABLES.UPDATE_TIME up-to-date for persistent tables. Temporary tables are not listed there. */ trx->mod_tables.insert(index->table); - pundo = op_type == TRX_UNDO_INSERT_OP + pundo = !rec ? &trx->rsegs.m_redo.insert_undo : &trx->rsegs.m_redo.update_undo; rseg = trx->rsegs.m_redo.rseg; @@ -1913,7 +1913,7 @@ trx_undo_report_row_operation( if (*pundo) { err = DB_SUCCESS; - } else if (op_type == TRX_UNDO_INSERT_OP || is_temp) { + } else if (!rec || is_temp) { err = trx_undo_assign_undo(trx, rseg, pundo, TRX_UNDO_INSERT); } else { err = trx_undo_assign_undo(trx, rseg, pundo, TRX_UNDO_UPDATE); @@ -1937,23 +1937,14 @@ trx_undo_report_row_operation( buf_block_dbg_add_level(undo_block, SYNC_TRX_UNDO_PAGE); do { - page_t* undo_page; - ulint offset; - - undo_page = buf_block_get_frame(undo_block); ut_ad(page_no == undo_block->page.id.page_no()); - - switch (op_type) { - case TRX_UNDO_INSERT_OP: - offset = trx_undo_page_report_insert( - undo_page, trx, index, clust_entry, &mtr); - break; - default: - ut_ad(op_type == TRX_UNDO_MODIFY_OP); - offset = trx_undo_page_report_modify( + page_t* undo_page = buf_block_get_frame(undo_block); + ulint offset = !rec + ? trx_undo_page_report_insert( + undo_page, trx, index, clust_entry, &mtr) + : trx_undo_page_report_modify( undo_page, trx, index, rec, offsets, update, cmpl_info, clust_entry, &mtr); - } if (UNIV_UNLIKELY(offset == 0)) { /* The record did not fit on the page. We erase the @@ -2007,8 +1998,7 @@ trx_undo_report_row_operation( mutex_exit(&trx->undo_mutex); *roll_ptr = trx_undo_build_roll_ptr( - op_type == TRX_UNDO_INSERT_OP, - rseg->id, page_no, offset); + !rec, rseg->id, page_no, offset); return(DB_SUCCESS); } diff --git a/storage/innobase/trx/trx0roll.cc b/storage/innobase/trx/trx0roll.cc index 69f01e64b59..d6857b892da 100644 --- a/storage/innobase/trx/trx0roll.cc +++ b/storage/innobase/trx/trx0roll.cc @@ -869,7 +869,6 @@ DECLARE_THREAD(trx_rollback_or_clean_all_recovered)( os_thread_create */ { my_thread_init(); - ut_ad(!srv_read_only_mode); #ifdef UNIV_PFS_THREAD diff --git a/storage/innobase/trx/trx0rseg.cc b/storage/innobase/trx/trx0rseg.cc index 663566cf26f..b48f3e18f1b 100644 --- a/storage/innobase/trx/trx0rseg.cc +++ b/storage/innobase/trx/trx0rseg.cc @@ -263,7 +263,9 @@ trx_rseg_array_init() } /** Create a persistent rollback segment. -@param[in] space_id system or undo tablespace id */ +@param[in] space_id system or undo tablespace id +@return pointer to new rollback segment +@retval NULL on failure */ trx_rseg_t* trx_rseg_create(ulint space_id) { diff --git a/storage/innobase/trx/trx0sys.cc b/storage/innobase/trx/trx0sys.cc index 47f30138ceb..1a7b9ef2905 100644 --- a/storage/innobase/trx/trx0sys.cc +++ b/storage/innobase/trx/trx0sys.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under @@ -176,95 +176,67 @@ trx_sys_update_mysql_binlog_offset( /*===============================*/ const char* file_name,/*!< in: MySQL log file name */ int64_t offset, /*!< in: position in that log file */ - ulint field, /*!< in: offset of the MySQL log info field in - the trx sys header */ trx_sysf_t* sys_header, /*!< in: trx sys header */ mtr_t* mtr) /*!< in: mtr */ { DBUG_PRINT("InnoDB",("trx_mysql_binlog_offset: %lld", (longlong) offset)); - if (ut_strlen(file_name) >= TRX_SYS_MYSQL_LOG_NAME_LEN) { + const size_t len = strlen(file_name) + 1; + + if (len > TRX_SYS_MYSQL_LOG_NAME_LEN) { /* We cannot fit the name to the 512 bytes we have reserved */ return; } - if (mach_read_from_4(sys_header + field - + TRX_SYS_MYSQL_LOG_MAGIC_N_FLD) + if (mach_read_from_4(TRX_SYS_MYSQL_LOG_MAGIC_N_FLD + + TRX_SYS_MYSQL_LOG_INFO + sys_header) != TRX_SYS_MYSQL_LOG_MAGIC_N) { - mlog_write_ulint(sys_header + field - + TRX_SYS_MYSQL_LOG_MAGIC_N_FLD, + mlog_write_ulint(TRX_SYS_MYSQL_LOG_MAGIC_N_FLD + + TRX_SYS_MYSQL_LOG_INFO + sys_header, TRX_SYS_MYSQL_LOG_MAGIC_N, MLOG_4BYTES, mtr); } - if (0 != strcmp((char*) (sys_header + field + TRX_SYS_MYSQL_LOG_NAME), - file_name)) { - - mlog_write_string(sys_header + field - + TRX_SYS_MYSQL_LOG_NAME, - (byte*) file_name, 1 + ut_strlen(file_name), - mtr); + if (memcmp(file_name, TRX_SYS_MYSQL_LOG_NAME + TRX_SYS_MYSQL_LOG_INFO + + sys_header, len)) { + mlog_write_string(TRX_SYS_MYSQL_LOG_NAME + + TRX_SYS_MYSQL_LOG_INFO + + sys_header, + reinterpret_cast(file_name), + len, mtr); } - if (mach_read_from_4(sys_header + field - + TRX_SYS_MYSQL_LOG_OFFSET_HIGH) > 0 - || (offset >> 32) > 0) { - - mlog_write_ulint(sys_header + field - + TRX_SYS_MYSQL_LOG_OFFSET_HIGH, - (ulint)(offset >> 32), - MLOG_4BYTES, mtr); - } - - mlog_write_ulint(sys_header + field - + TRX_SYS_MYSQL_LOG_OFFSET_LOW, - (ulint)(offset & 0xFFFFFFFFUL), - MLOG_4BYTES, mtr); + mlog_write_ull(TRX_SYS_MYSQL_LOG_INFO + TRX_SYS_MYSQL_LOG_OFFSET + + sys_header, offset, mtr); } -/*****************************************************************//** -Stores the MySQL binlog offset info in the trx system header if -the magic number shows it valid, and print the info to stderr */ +/** Display the MySQL binlog offset info if it is present in the trx +system header. */ void -trx_sys_print_mysql_binlog_offset(void) -/*===================================*/ +trx_sys_print_mysql_binlog_offset() { - trx_sysf_t* sys_header; mtr_t mtr; - ulint trx_sys_mysql_bin_log_pos_high; - ulint trx_sys_mysql_bin_log_pos_low; - mtr_start(&mtr); + mtr.start(); - sys_header = trx_sysf_get(&mtr); + const trx_sysf_t* sys_header = trx_sysf_get(&mtr); - if (mach_read_from_4(sys_header + TRX_SYS_MYSQL_LOG_INFO - + TRX_SYS_MYSQL_LOG_MAGIC_N_FLD) - != TRX_SYS_MYSQL_LOG_MAGIC_N) { - - mtr_commit(&mtr); - - return; + if (mach_read_from_4(TRX_SYS_MYSQL_LOG_INFO + + TRX_SYS_MYSQL_LOG_MAGIC_N_FLD + sys_header) + == TRX_SYS_MYSQL_LOG_MAGIC_N) { + ib::info() << "Last binlog file '" + << TRX_SYS_MYSQL_LOG_INFO + TRX_SYS_MYSQL_LOG_NAME + + sys_header + << "', position " + << mach_read_from_8(TRX_SYS_MYSQL_LOG_INFO + + TRX_SYS_MYSQL_LOG_OFFSET + + sys_header); } - trx_sys_mysql_bin_log_pos_high = mach_read_from_4( - sys_header + TRX_SYS_MYSQL_LOG_INFO - + TRX_SYS_MYSQL_LOG_OFFSET_HIGH); - trx_sys_mysql_bin_log_pos_low = mach_read_from_4( - sys_header + TRX_SYS_MYSQL_LOG_INFO - + TRX_SYS_MYSQL_LOG_OFFSET_LOW); - - fprintf(stderr, - "InnoDB: Last MySQL binlog file position " ULINTPF " " ULINTPF - ", file name %s\n", - trx_sys_mysql_bin_log_pos_high, trx_sys_mysql_bin_log_pos_low, - sys_header + TRX_SYS_MYSQL_LOG_INFO - + TRX_SYS_MYSQL_LOG_NAME); - - mtr_commit(&mtr); + mtr.commit(); } #ifdef WITH_WSREP @@ -273,86 +245,85 @@ trx_sys_print_mysql_binlog_offset(void) static long long trx_sys_cur_xid_seqno = -1; static unsigned char trx_sys_cur_xid_uuid[16]; -long long read_wsrep_xid_seqno(const XID* xid) +/** Read WSREP XID seqno */ +static inline long long read_wsrep_xid_seqno(const XID* xid) { long long seqno; memcpy(&seqno, xid->data + 24, sizeof(long long)); return seqno; } -void read_wsrep_xid_uuid(const XID* xid, unsigned char* buf) +/** Read WSREP XID UUID */ +static inline void read_wsrep_xid_uuid(const XID* xid, unsigned char* buf) { memcpy(buf, xid->data + 8, 16); } #endif /* UNIV_DEBUG */ +/** Update WSREP XID info in sys_header of TRX_SYS_PAGE_NO = 5. +@param[in] xid Transaction XID +@param[in,out] sys_header sys_header +@param[in] mtr minitransaction */ +UNIV_INTERN void trx_sys_update_wsrep_checkpoint( -/*============================*/ - const XID* xid, /*!< in: transaction XID */ - trx_sysf_t* sys_header, /*!< in: sys_header */ - mtr_t* mtr) /*!< in: mtr */ + const XID* xid, + trx_sysf_t* sys_header, + mtr_t* mtr) { + ut_ad(xid->formatID == 1); + ut_ad(wsrep_is_wsrep_xid(xid)); + + if (mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_MAGIC_N_FLD) + != TRX_SYS_WSREP_XID_MAGIC_N) { + mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_MAGIC_N_FLD, + TRX_SYS_WSREP_XID_MAGIC_N, + MLOG_4BYTES, mtr); #ifdef UNIV_DEBUG - { + } else { /* Check that seqno is monotonically increasing */ unsigned char xid_uuid[16]; long long xid_seqno = read_wsrep_xid_seqno(xid); read_wsrep_xid_uuid(xid, xid_uuid); - if (!memcmp(xid_uuid, trx_sys_cur_xid_uuid, 16)) - { - /* - This check is a protection against the initial seqno (-1) - assigned in read_wsrep_xid_uuid(), which, if not checked, - would cause the following assertion to fail. - */ - if (xid_seqno > -1 ) - { - ut_ad(xid_seqno > trx_sys_cur_xid_seqno); - } + + if (!memcmp(xid_uuid, trx_sys_cur_xid_uuid, 8)) { + ut_ad(xid_seqno > trx_sys_cur_xid_seqno); + trx_sys_cur_xid_seqno = xid_seqno; } else { memcpy(trx_sys_cur_xid_uuid, xid_uuid, 16); } + trx_sys_cur_xid_seqno = xid_seqno; - } #endif /* UNIV_DEBUG */ + } - ut_ad(xid && mtr); - ut_a(xid->formatID == -1 || wsrep_is_wsrep_xid(xid)); - - if (mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_MAGIC_N_FLD) - != TRX_SYS_WSREP_XID_MAGIC_N) { - mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_MAGIC_N_FLD, - TRX_SYS_WSREP_XID_MAGIC_N, - MLOG_4BYTES, mtr); - } - - mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_FORMAT, - (int)xid->formatID, - MLOG_4BYTES, mtr); - mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_GTRID_LEN, - (int)xid->gtrid_length, - MLOG_4BYTES, mtr); - mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_BQUAL_LEN, - (int)xid->bqual_length, - MLOG_4BYTES, mtr); - mlog_write_string(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_DATA, - (const unsigned char*) xid->data, - XIDDATASIZE, mtr); - + mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_FORMAT, + (int)xid->formatID, + MLOG_4BYTES, mtr); + mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_GTRID_LEN, + (int)xid->gtrid_length, + MLOG_4BYTES, mtr); + mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_BQUAL_LEN, + (int)xid->bqual_length, + MLOG_4BYTES, mtr); + mlog_write_string(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_DATA, + (const unsigned char*) xid->data, + XIDDATASIZE, mtr); } -void -trx_sys_read_wsrep_checkpoint( -/*==========================*/ - XID* xid) +/** Read WSREP checkpoint XID from sys header. +@param[out] xid WSREP XID +@return whether the checkpoint was present */ +UNIV_INTERN +bool +trx_sys_read_wsrep_checkpoint(XID* xid) { trx_sysf_t* sys_header; mtr_t mtr; @@ -371,9 +342,8 @@ trx_sys_read_wsrep_checkpoint( long long seqno= -1; memcpy(xid->data + 24, &seqno, sizeof(long long)); xid->formatID = -1; - trx_sys_update_wsrep_checkpoint(xid, sys_header, &mtr); mtr_commit(&mtr); - return; + return false; } xid->formatID = (int)mach_read_from_4( @@ -390,6 +360,7 @@ trx_sys_read_wsrep_checkpoint( XIDDATASIZE); mtr_commit(&mtr); + return true; } #endif /* WITH_WSREP */ @@ -887,9 +858,6 @@ trx_sys_create_rsegs() return(true); } - /* Create temporary rollback segments. */ - trx_temp_rseg_create(); - /* This is executed in single-threaded mode therefore it is not necessary to use the same mtr in trx_rseg_create(). n_used cannot change while the function is executing. */ @@ -913,7 +881,8 @@ trx_sys_create_rsegs() /* Tablespace 0 is the system tablespace. Dedicated undo log tablespaces start from 1. */ ulint space = srv_undo_tablespaces > 0 - ? (i % srv_undo_tablespaces) + 1 + ? (i % srv_undo_tablespaces) + + srv_undo_space_id_start : TRX_SYS_SPACE; if (!trx_rseg_create(space)) { @@ -1013,6 +982,7 @@ trx_sys_close(void) /********************************************************************* Check if there are any active (non-prepared) transactions. +This is only used to check if it's safe to shutdown. @return total number of active transactions or 0 if none */ ulint trx_sys_any_active_transactions(void) @@ -1022,8 +992,13 @@ trx_sys_any_active_transactions(void) trx_sys_mutex_enter(); - total_trx = UT_LIST_GET_LEN(trx_sys->rw_trx_list) - + UT_LIST_GET_LEN(trx_sys->mysql_trx_list); + total_trx = UT_LIST_GET_LEN(trx_sys->rw_trx_list); + + for (trx_t* trx = UT_LIST_GET_FIRST(trx_sys->mysql_trx_list); + trx != NULL; + trx = UT_LIST_GET_NEXT(mysql_trx_list, trx)) { + total_trx += trx->state != TRX_STATE_NOT_STARTED; + } ut_a(total_trx >= trx_sys->n_prepared_trx); total_trx -= trx_sys->n_prepared_trx; diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc index a6cfcf0910b..2408e4bdaf4 100644 --- a/storage/innobase/trx/trx0trx.cc +++ b/storage/innobase/trx/trx0trx.cc @@ -238,6 +238,7 @@ struct TrxFactory { trx_init(trx); + DBUG_LOG("trx", "Init: " << trx); trx->state = TRX_STATE_NOT_STARTED; trx->dict_operation_lock_mode = 0; @@ -272,8 +273,6 @@ struct TrxFactory { ut_a(trx->lock.wait_lock == NULL); ut_a(trx->lock.wait_thr == NULL); - - trx_assert_no_search_latch(trx); ut_a(trx->dict_operation_lock_mode == 0); if (trx->lock.lock_heap != NULL) { @@ -341,9 +340,6 @@ struct TrxFactory { ut_a(trx->lock.wait_thr == NULL); ut_a(trx->lock.wait_lock == NULL); - - trx_assert_no_search_latch(trx); - ut_a(trx->dict_operation_lock_mode == 0); ut_a(UT_LIST_GET_LEN(trx->lock.trx_locks) == 0); @@ -457,6 +453,7 @@ trx_create_low() /* Trx state can be TRX_STATE_FORCED_ROLLBACK if the trx was forced to rollback before it's reused.*/ + DBUG_LOG("trx", "Create: " << trx); trx->state = TRX_STATE_NOT_STARTED; heap = mem_heap_create(sizeof(ib_vector_t) + sizeof(void*) * 8); @@ -553,6 +550,10 @@ static void trx_validate_state_before_free(trx_t* trx) { + ut_ad(!trx->declared_to_be_inside_innodb); + ut_ad(!trx->n_mysql_tables_in_use); + ut_ad(!trx->mysql_n_tables_locked); + if (trx->declared_to_be_inside_innodb) { ib::error() << "Freeing a trx (" << trx << ", " @@ -563,7 +564,7 @@ trx_validate_state_before_free(trx_t* trx) putc('\n', stderr); /* This is an error but not a fatal error. We must keep - the counters like srv_conc_n_threads accurate. */ + the counters like srv_conc.n_active accurate. */ srv_conc_force_exit_innodb(trx); } @@ -618,6 +619,7 @@ trx_free_prepared( || (trx_state_eq(trx, TRX_STATE_ACTIVE) && trx->is_recovered && (!srv_was_started + || srv_operation == SRV_OPERATION_RESTORE || srv_read_only_mode || srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO))); ut_a(trx->magic_n == TRX_MAGIC_N); @@ -631,6 +633,7 @@ trx_free_prepared( ut_d(trx->in_rw_trx_list = FALSE); + DBUG_LOG("trx", "Free prepared: " << trx); trx->state = TRX_STATE_NOT_STARTED; /* Undo trx_resurrect_table_locks(). */ @@ -773,8 +776,7 @@ trx_resurrect_table_locks( i != tables.end(); i++) { if (dict_table_t* table = dict_table_open_on_id( *i, FALSE, DICT_TABLE_OP_LOAD_TABLESPACE)) { - if (table->ibd_file_missing - || dict_table_is_temporary(table)) { + if (!table->is_readable()) { mutex_enter(&dict_sys->mutex); dict_table_close(table, TRUE, FALSE); dict_table_remove_from_cache(table); @@ -842,18 +844,9 @@ trx_resurrect_insert( << trx_get_id_for_print(trx) << " was in the XA prepared state."; - if (srv_force_recovery == 0) { - - trx->state = TRX_STATE_PREPARED; - ++trx_sys->n_prepared_trx; - ++trx_sys->n_prepared_recovered_trx; - } else { - - ib::info() << "Since innodb_force_recovery" - " > 0, we will force a rollback."; - - trx->state = TRX_STATE_ACTIVE; - } + trx->state = TRX_STATE_PREPARED; + trx_sys->n_prepared_trx++; + trx_sys->n_prepared_recovered_trx++; } else { trx->state = TRX_STATE_COMMITTED_IN_MEMORY; } @@ -913,24 +906,14 @@ trx_resurrect_update_in_prepared_state( ib::info() << "Transaction " << trx_get_id_for_print(trx) << " was in the XA prepared state."; - if (srv_force_recovery == 0) { - - ut_ad(trx->state != TRX_STATE_FORCED_ROLLBACK); - - if (trx_state_eq(trx, TRX_STATE_NOT_STARTED)) { - ++trx_sys->n_prepared_trx; - ++trx_sys->n_prepared_recovered_trx; - } else { - ut_ad(trx_state_eq(trx, TRX_STATE_PREPARED)); - } - - trx->state = TRX_STATE_PREPARED; + if (trx_state_eq(trx, TRX_STATE_NOT_STARTED)) { + trx_sys->n_prepared_trx++; + trx_sys->n_prepared_recovered_trx++; } else { - ib::info() << "Since innodb_force_recovery > 0, we" - " will rollback it anyway."; - - trx->state = TRX_STATE_ACTIVE; + ut_ad(trx_state_eq(trx, TRX_STATE_PREPARED)); } + + trx->state = TRX_STATE_PREPARED; } else { trx->state = TRX_STATE_COMMITTED_IN_MEMORY; } @@ -1497,7 +1480,6 @@ trx_write_serialisation_history( trx_sys_update_mysql_binlog_offset( trx->mysql_log_file_name, trx->mysql_log_offset, - TRX_SYS_MYSQL_LOG_INFO, sys_header, mtr); @@ -1756,6 +1738,7 @@ trx_commit_in_memory( ut_ad(!(trx->in_innodb & (TRX_FORCE_ROLLBACK | TRX_FORCE_ROLLBACK_ASYNC))); + DBUG_LOG("trx", "Autocommit in memory: " << trx); trx->state = TRX_STATE_NOT_STARTED; } else { @@ -1848,9 +1831,7 @@ trx_commit_in_memory( } else if (trx->flush_log_later) { /* Do nothing yet */ trx->must_flush_log_later = true; - } else if (srv_flush_log_at_trx_commit == 0 - || thd_requested_durability(trx->mysql_thd) - == HA_IGNORE_DURABILITY) { + } else if (srv_flush_log_at_trx_commit == 0) { /* Do nothing */ } else { trx_flush_log_if_needed(lsn, trx); @@ -1893,8 +1874,10 @@ trx_commit_in_memory( if (trx->abort) { trx->abort = false; + DBUG_LOG("trx", "Abort: " << trx); trx->state = TRX_STATE_FORCED_ROLLBACK; } else { + DBUG_LOG("trx", "Commit in memory: " << trx); trx->state = TRX_STATE_NOT_STARTED; } @@ -2066,6 +2049,7 @@ trx_cleanup_at_db_startup( ut_ad(trx->is_recovered); ut_ad(!trx->in_rw_trx_list); ut_ad(!trx->in_mysql_trx_list); + DBUG_LOG("trx", "Cleanup at startup: " << trx); trx->state = TRX_STATE_NOT_STARTED; } @@ -2264,8 +2248,7 @@ trx_commit_complete_for_mysql( { if (trx->id != 0 || !trx->must_flush_log_later - || thd_requested_durability(trx->mysql_thd) - == HA_IGNORE_DURABILITY) { + || (srv_flush_log_at_trx_commit == 1 && trx->active_commit_ordered)) { return; } @@ -2413,13 +2396,6 @@ state_ok: (ulong) n_rec_locks); } -#ifdef BTR_CUR_HASH_ADAPT - if (trx->has_search_latch) { - newline = TRUE; - fputs(", holds adaptive hash latch", f); - } -#endif /* BTR_CUR_HASH_ADAPT */ - if (trx->undo_no != 0) { newline = TRUE; fprintf(f, ", undo log entries " TRX_ID_FMT, trx->undo_no); @@ -2551,11 +2527,6 @@ state_ok: fprintf(f, "que state %lu ", (ulong) trx->lock.que_state); } - if (trx->has_search_latch) { - newline = TRUE; - fputs(", holds adaptive hash latch", f); - } - if (trx->undo_no != 0) { newline = TRUE; fprintf(f, ", undo log entries " TRX_ID_FMT, trx->undo_no); @@ -2765,18 +2736,7 @@ trx_prepare( trx_sys_mutex_exit(); /*--------------------------------------*/ - switch (thd_requested_durability(trx->mysql_thd)) { - case HA_IGNORE_DURABILITY: - /* We set the HA_IGNORE_DURABILITY during prepare phase of - binlog group commit to not flush redo log for every transaction - here. So that we can flush prepared records of transactions to - redo log in a group right before writing them to binary log - during flush stage of binlog group commit. */ - break; - case HA_REGULAR_DURABILITY: - if (lsn == 0) { - break; - } + if (lsn) { /* Depending on the my.cnf options, we may now write the log buffer to the log files, making the prepared state of the transaction durable if the OS does not crash. We may also @@ -3113,7 +3073,7 @@ trx_set_rw_mode( ut_ad(!trx->in_rw_trx_list); ut_ad(!trx_is_autocommit_non_locking(trx)); - if (srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO) { + if (high_level_read_only) { return; } diff --git a/storage/innobase/trx/trx0undo.cc b/storage/innobase/trx/trx0undo.cc index 3eab3733f8f..bb69d3651e1 100644 --- a/storage/innobase/trx/trx0undo.cc +++ b/storage/innobase/trx/trx0undo.cc @@ -1687,6 +1687,12 @@ trx_undo_assign_undo( mutex_enter(&rseg->mutex); + DBUG_EXECUTE_IF( + "ib_create_table_fail_too_many_trx", + err = DB_TOO_MANY_CONCURRENT_TRXS; + goto func_exit; + ); + *undo = trx_undo_reuse_cached(trx, rseg, type, trx->id, trx->xid, &mtr); if (*undo == NULL) { diff --git a/storage/innobase/usr/usr0sess.cc b/storage/innobase/usr/usr0sess.cc index 85eca604d80..55ce9500e5c 100644 --- a/storage/innobase/usr/usr0sess.cc +++ b/storage/innobase/usr/usr0sess.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software diff --git a/storage/innobase/ut/ut0dbg.cc b/storage/innobase/ut/ut0dbg.cc index fff1f0e6687..28643645de9 100644 --- a/storage/innobase/ut/ut0dbg.cc +++ b/storage/innobase/ut/ut0dbg.cc @@ -30,6 +30,7 @@ Created 1/30/1994 Heikki Tuuri /*************************************************************//** Report a failed assertion. */ +ATTRIBUTE_NORETURN void ut_dbg_assertion_failed( /*====================*/ diff --git a/storage/innobase/ut/ut0rbt.cc b/storage/innobase/ut/ut0rbt.cc index d3e4ceae97d..cb8e4f2df20 100644 --- a/storage/innobase/ut/ut0rbt.cc +++ b/storage/innobase/ut/ut0rbt.cc @@ -54,6 +54,7 @@ red-black properties: #define ROOT(t) (t->root->left) #define SIZEOF_NODE(t) ((sizeof(ib_rbt_node_t) + t->sizeof_value) - 1) +#if defined UNIV_DEBUG || defined IB_RBT_TESTING /**********************************************************************//** Verify that the keys are in order. @return TRUE of OK. FALSE if not ordered */ @@ -91,6 +92,7 @@ rbt_check_ordering( return(TRUE); } +#endif /* UNIV_DEBUG || IB_RBT_TESTING */ /**********************************************************************//** Check that every path from the root to the leaves has the same count. diff --git a/storage/innobase/ut/ut0ut.cc b/storage/innobase/ut/ut0ut.cc index 2cae865cff2..7393a24b72c 100644 --- a/storage/innobase/ut/ut0ut.cc +++ b/storage/innobase/ut/ut0ut.cc @@ -38,8 +38,6 @@ Created 5/11/1994 Heikki Tuuri #include #include "log.h" -/** A constant to prevent the compiler from optimizing ut_delay() away. */ -ibool ut_always_false = FALSE; #ifdef _WIN32 /*****************************************************************//** NOTE: The Windows epoch starts from 1601/01/01 whereas the Unix @@ -285,26 +283,21 @@ ut_sprintf_timestamp( Runs an idle loop on CPU. The argument gives the desired delay in microseconds on 100 MHz Pentium + Visual C++. @return dummy value */ -ulint +void ut_delay( /*=====*/ ulint delay) /*!< in: delay in microseconds on 100 MHz Pentium */ { - ulint i, j; + ulint i; UT_LOW_PRIORITY_CPU(); - j = 0; - for (i = 0; i < delay * 50; i++) { - j += i; UT_RELAX_CPU(); UT_COMPILER_BARRIER(); } UT_RESUME_PRIORITY_CPU(); - - return(j); } /*************************************************************//** @@ -757,6 +750,8 @@ ut_strerr( "of stored column"); case DB_IO_NO_PUNCH_HOLE: return ("File system does not support punch hole (trim) operation."); + case DB_PAGE_CORRUPTED: + return("Page read from tablespace is corrupted."); /* do not add default: in order to produce a warning if new code is added to the enum but not added here */ @@ -839,10 +834,11 @@ error::~error() sql_print_error("InnoDB: %s", m_oss.str().c_str()); } +ATTRIBUTE_NORETURN fatal::~fatal() { sql_print_error("[FATAL] InnoDB: %s", m_oss.str().c_str()); - ut_error; + abort(); } error_or_warn::~error_or_warn() @@ -856,8 +852,11 @@ error_or_warn::~error_or_warn() fatal_or_error::~fatal_or_error() { - sql_print_error("InnoDB: %s", m_oss.str().c_str()); - ut_a(!m_fatal); + sql_print_error(m_fatal ? "[FATAL] InnoDB: %s" : "InnoDB: %s", + m_oss.str().c_str()); + if (m_fatal) { + abort(); + } } } // namespace ib diff --git a/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc index b3fbc15c1a3..119a002a11a 100644 --- a/storage/maria/ha_maria.cc +++ b/storage/maria/ha_maria.cc @@ -834,7 +834,10 @@ extern "C" { int _ma_killed_ptr(HA_CHECK *param) { - return thd_killed((THD*)param->thd); + if (likely(thd_killed((THD*)param->thd)) == 0) + return 0; + my_errno= HA_ERR_ABORTED_BY_USER; + return 1; } @@ -1668,8 +1671,11 @@ int ha_maria::repair(THD *thd, HA_CHECK *param, bool do_optimize) } if (error && file->create_unique_index_by_sort && share->state.dupp_key != MAX_KEY) + { + my_errno= HA_ERR_FOUND_DUPP_KEY; print_keydup_error(table, &table->key_info[share->state.dupp_key], MYF(0)); + } } else { diff --git a/storage/maria/ma_check.c b/storage/maria/ma_check.c index f92774a0321..2b27207e601 100644 --- a/storage/maria/ma_check.c +++ b/storage/maria/ma_check.c @@ -1364,6 +1364,7 @@ static int check_dynamic_record(HA_CHECK *param, MARIA_HA *info, int extend, pos=block_info.filepos+block_info.block_len; if (block_info.rec_len > (uint) share->base.max_pack_length) { + my_errno= HA_ERR_WRONG_IN_RECORD; _ma_check_print_error(param,"Found too long record (%lu) at %s", (ulong) block_info.rec_len, llstr(start_recpos,llbuff)); @@ -4220,6 +4221,7 @@ int maria_repair_parallel(HA_CHECK *param, register MARIA_HA *info, printf("Data records: %s\n", llstr(start_records, llbuff)); } + bzero(&new_data_cache, sizeof(new_data_cache)); if (initialize_variables_for_repair(param, &sort_info, &tmp_sort_param, info, rep_quick, &backup_share)) goto err; @@ -4259,6 +4261,8 @@ int maria_repair_parallel(HA_CHECK *param, register MARIA_HA *info, } */ DBUG_PRINT("info", ("is quick repair: %d", (int) rep_quick)); + if (!rep_quick) + my_b_clear(&new_data_cache); /* Initialize pthread structures before goto err. */ mysql_mutex_init(key_SORT_INFO_mutex, &sort_info.mutex, MY_MUTEX_INIT_FAST); @@ -4624,7 +4628,7 @@ err: already or they were not yet started (if the error happend before creating the threads). */ - if (!rep_quick) + if (!rep_quick && my_b_inited(&new_data_cache)) end_io_cache(&new_data_cache); if (!got_error) { @@ -4995,6 +4999,7 @@ static int sort_get_next_record(MARIA_SORT_PARAM *sort_param) param->error_printed=1; param->retry_repair=1; param->testflag|=T_RETRY_WITHOUT_QUICK; + my_errno= HA_ERR_WRONG_IN_RECORD; DBUG_RETURN(1); /* Something wrong with data */ } b_type= _ma_get_block_info(info, &block_info,-1,pos); @@ -5268,6 +5273,7 @@ static int sort_get_next_record(MARIA_SORT_PARAM *sort_param) param->error_printed=1; param->retry_repair=1; param->testflag|=T_RETRY_WITHOUT_QUICK; + my_errno= HA_ERR_WRONG_IN_RECORD; DBUG_RETURN(1); /* Something wrong with data */ } sort_param->start_recpos=sort_param->pos; diff --git a/storage/maria/ma_create.c b/storage/maria/ma_create.c index 0ddd8b226e2..80e38fc2b00 100644 --- a/storage/maria/ma_create.c +++ b/storage/maria/ma_create.c @@ -375,18 +375,18 @@ int maria_create(const char *name, enum data_file_type datafile_type, if (rows_per_page > 0) { set_if_smaller(rows_per_page, MAX_ROWS_PER_PAGE); - ci->max_rows= data_file_length / maria_block_size * rows_per_page; + ci->max_rows= (data_file_length / maria_block_size+1) * rows_per_page; } else ci->max_rows= data_file_length / (min_pack_length + extra_header_size + - DIR_ENTRY_SIZE); + DIR_ENTRY_SIZE)+1; } else ci->max_rows=(ha_rows) (ci->data_file_length/(min_pack_length + ((options & HA_OPTION_PACK_RECORD) ? - 3 : 0))); + 3 : 0)))+1; } max_rows= (ulonglong) ci->max_rows; if (datafile_type == BLOCK_RECORD) @@ -1204,7 +1204,7 @@ int maria_create(const char *name, enum data_file_type datafile_type, if (mysql_file_chsize(file,(ulong) share.base.keystart,0,MYF(0))) goto err; - if (sync_dir && mysql_file_sync(file, MYF(0))) + if (!internal_table && sync_dir && mysql_file_sync(file, MYF(0))) goto err; if (! (flags & HA_DONT_TOUCH_DATA)) @@ -1214,7 +1214,7 @@ int maria_create(const char *name, enum data_file_type datafile_type, share.base.min_pack_length*ci->reloc_rows,0,MYF(0))) goto err; #endif - if (sync_dir && mysql_file_sync(dfile, MYF(0))) + if (!internal_table && sync_dir && mysql_file_sync(dfile, MYF(0))) goto err; if (mysql_file_close(dfile,MYF(0))) goto err; diff --git a/storage/maria/ma_extra.c b/storage/maria/ma_extra.c index 0cf5b2822b1..1db81a0ee1b 100644 --- a/storage/maria/ma_extra.c +++ b/storage/maria/ma_extra.c @@ -157,6 +157,7 @@ int maria_extra(MARIA_HA *info, enum ha_extra_function function, if (info->s->data_file_type != DYNAMIC_RECORD) break; /* Remove read/write cache if dynamic rows */ + /* fall through */ case HA_EXTRA_NO_CACHE: if (info->opt_flag & (READ_CACHE_USED | WRITE_CACHE_USED)) { @@ -313,7 +314,7 @@ int maria_extra(MARIA_HA *info, enum ha_extra_function function, share->state.open_count= 1; share->changed= 1; _ma_mark_file_changed_now(share); - /* Fall trough */ + /* Fall through */ case HA_EXTRA_PREPARE_FOR_RENAME: { my_bool do_flush= MY_TEST(function != HA_EXTRA_PREPARE_FOR_DROP); diff --git a/storage/maria/ma_key_recover.c b/storage/maria/ma_key_recover.c index 8b6342b76b5..610810756f2 100644 --- a/storage/maria/ma_key_recover.c +++ b/storage/maria/ma_key_recover.c @@ -1169,6 +1169,7 @@ uint _ma_apply_redo_index(MARIA_HA *info, goto err; } page_length= page.size; + break; } case KEY_OP_NONE: default: diff --git a/storage/maria/ma_loghandler.c b/storage/maria/ma_loghandler.c index 86e51cc3526..defa11ad6b4 100644 --- a/storage/maria/ma_loghandler.c +++ b/storage/maria/ma_loghandler.c @@ -946,6 +946,7 @@ static File create_logfile_by_number_no_cache(uint32 file_no) { DBUG_PRINT("error", ("Error %d during syncing directory '%s'", errno, log_descriptor.directory)); + mysql_file_close(file, MYF(0)); translog_stop_writing(); DBUG_RETURN(-1); } @@ -1262,6 +1263,7 @@ static my_bool translog_set_lsn_for_files(uint32 from_file, uint32 to_file, mysql_file_close(fd, MYF(MY_WME)))) { translog_stop_writing(); + mysql_mutex_unlock(&log_descriptor.file_header_lock); DBUG_RETURN(1); } } @@ -1447,17 +1449,16 @@ LSN translog_get_file_max_lsn_stored(uint32 file) if (translog_read_file_header(&info, fd)) { DBUG_PRINT("error", ("Can't read file header")); - DBUG_RETURN(LSN_ERROR); + info.max_lsn= LSN_ERROR; } if (mysql_file_close(fd, MYF(MY_WME))) { DBUG_PRINT("error", ("Can't close file")); - DBUG_RETURN(LSN_ERROR); + info.max_lsn= LSN_ERROR; } - DBUG_PRINT("info", ("Max lsn: (%lu,0x%lx)", - LSN_IN_PARTS(info.max_lsn))); + DBUG_PRINT("info", ("Max lsn: (%lu,0x%lx)", LSN_IN_PARTS(info.max_lsn))); DBUG_RETURN(info.max_lsn); } } @@ -1621,13 +1622,15 @@ static my_bool translog_create_new_file() if (allocate_dynamic(&log_descriptor.open_files, log_descriptor.max_file - log_descriptor.min_file + 2)) goto error_lock; - if ((file->handler.file= - create_logfile_by_number_no_cache(file_no)) == -1) + + /* this call just expand the array */ + if (insert_dynamic(&log_descriptor.open_files, (uchar*)&file)) + goto error_lock; + + if ((file->handler.file= create_logfile_by_number_no_cache(file_no)) == -1) goto error_lock; translog_file_init(file, file_no, 0); - /* this call just expand the array */ - insert_dynamic(&log_descriptor.open_files, (uchar*)&file); log_descriptor.max_file++; { char *start= (char*) dynamic_element(&log_descriptor.open_files, 0, @@ -1661,6 +1664,7 @@ error_lock: mysql_rwlock_unlock(&log_descriptor.open_files_lock); error: translog_stop_writing(); + my_free(file); DBUG_RETURN(1); } @@ -2274,10 +2278,11 @@ static void translog_set_only_in_buffers(TRANSLOG_ADDRESS in_buffers) if (cmp_translog_addr(in_buffers, log_descriptor.in_buffers_only) > 0) { if (translog_status != TRANSLOG_OK) - DBUG_VOID_RETURN; + goto end; log_descriptor.in_buffers_only= in_buffers; DBUG_PRINT("info", ("set new in_buffers_only")); } +end: mysql_mutex_unlock(&log_descriptor.sent_to_disk_lock); DBUG_VOID_RETURN; } @@ -3962,11 +3967,14 @@ my_bool translog_init_with_table(const char *directory, /* Start new log system from scratch */ log_descriptor.horizon= MAKE_LSN(start_file_num, TRANSLOG_PAGE_SIZE); /* header page */ - if ((file->handler.file= - create_logfile_by_number_no_cache(start_file_num)) == -1) - goto err; translog_file_init(file, start_file_num, 0); if (insert_dynamic(&log_descriptor.open_files, (uchar*)&file)) + { + my_free(file); + goto err; + } + if ((file->handler.file= + create_logfile_by_number_no_cache(start_file_num)) == -1) goto err; log_descriptor.min_file= log_descriptor.max_file= start_file_num; if (translog_write_file_header()) @@ -7789,8 +7797,24 @@ void translog_flush_buffers(TRANSLOG_ADDRESS *lsn, translog_force_current_buffer_to_finish(); translog_buffer_unlock(buffer); } - else if (log_descriptor.bc.buffer->prev_last_lsn != LSN_IMPOSSIBLE) + else { + if (log_descriptor.bc.buffer->last_lsn == LSN_IMPOSSIBLE) + { + /* + In this case both last_lsn & prev_last_lsn are LSN_IMPOSSIBLE + otherwise it will go in the first IF because LSN_IMPOSSIBLE less + then any real LSN and cmp_translog_addr(*lsn, + log_descriptor.bc.buffer->prev_last_lsn) will be TRUE + */ + DBUG_ASSERT(log_descriptor.bc.buffer->prev_last_lsn == + LSN_IMPOSSIBLE); + DBUG_PRINT("info", ("There is no LSNs yet generated => do nothing")); + translog_unlock(); + DBUG_VOID_RETURN; + } + + DBUG_ASSERT(log_descriptor.bc.buffer->prev_last_lsn != LSN_IMPOSSIBLE); /* fix lsn if it was horizon */ *lsn= log_descriptor.bc.buffer->prev_last_lsn; DBUG_PRINT("info", ("LSN to flush fixed to prev last lsn: (%lu,0x%lx)", @@ -7799,13 +7823,6 @@ void translog_flush_buffers(TRANSLOG_ADDRESS *lsn, TRANSLOG_BUFFERS_NO); translog_unlock(); } - else if (log_descriptor.bc.buffer->last_lsn == LSN_IMPOSSIBLE) - { - DBUG_PRINT("info", ("There is no LSNs yet generated => do nothing")); - translog_unlock(); - DBUG_VOID_RETURN; - } - /* flush buffers */ *sent_to_disk= translog_get_sent_to_disk(); if (cmp_translog_addr(*lsn, *sent_to_disk) > 0) diff --git a/storage/maria/ma_open.c b/storage/maria/ma_open.c index c4a7df4443c..5c5e41be1f8 100644 --- a/storage/maria/ma_open.c +++ b/storage/maria/ma_open.c @@ -565,7 +565,10 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags) set_if_smaller(max_data_file_length, INT_MAX32); set_if_smaller(max_key_file_length, INT_MAX32); #endif - share->base.max_data_file_length=(my_off_t) max_data_file_length; + /* For internal temporary tables, max_data_file_length is already set */ + if (!internal_table || !share->base.max_data_file_length) + share->base.max_data_file_length=(my_off_t) max_data_file_length; + DBUG_ASSERT(share->base.max_data_file_length); share->base.max_key_file_length=(my_off_t) max_key_file_length; if (share->options & HA_OPTION_COMPRESS_RECORD) @@ -909,9 +912,12 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags) share->block_size * keys : 0)); my_free(disk_cache); _ma_setup_functions(share); + max_data_file_length= share->base.max_data_file_length; if ((*share->once_init)(share, info.dfile.file)) goto err; - if (share->now_transactional) + if (internal_table) + set_if_smaller(share->base.max_data_file_length, + max_data_file_length); { /* Setup initial state that is visible for all */ MARIA_STATE_HISTORY_CLOSED *history; diff --git a/storage/maria/ma_packrec.c b/storage/maria/ma_packrec.c index 5243d55428c..861023a0064 100644 --- a/storage/maria/ma_packrec.c +++ b/storage/maria/ma_packrec.c @@ -1445,7 +1445,7 @@ uint _ma_pack_get_block_info(MARIA_HA *maria, MARIA_BIT_BUFF *bit_buff, maria->blob_length=info->blob_len; } info->filepos=filepos+head_length; - if (file > 0) + if (file >= 0) { info->offset=MY_MIN(info->rec_len, ref_length - head_length); memcpy(*rec_buff_p, header + head_length, info->offset); diff --git a/storage/maria/ma_pagecache.c b/storage/maria/ma_pagecache.c index afb5fb8bdff..a1c407967b7 100644 --- a/storage/maria/ma_pagecache.c +++ b/storage/maria/ma_pagecache.c @@ -493,7 +493,8 @@ error: #define FLUSH_CACHE 2000 /* sort this many blocks at once */ -static void free_block(PAGECACHE *pagecache, PAGECACHE_BLOCK_LINK *block); +static my_bool free_block(PAGECACHE *pagecache, PAGECACHE_BLOCK_LINK *block, + my_bool abort_if_pinned); static void unlink_hash(PAGECACHE *pagecache, PAGECACHE_HASH_LINK *hash_link); #ifndef DBUG_OFF static void test_key_cache(PAGECACHE *pagecache, @@ -1186,14 +1187,14 @@ void end_pagecache(PAGECACHE *pagecache, my_bool cleanup) pagecache->blocks_changed= 0; } - DBUG_PRINT("status", ("used: %zu changed: %zu w_requests: %lu " - "writes: %lu r_requests: %lu reads: %lu", - (ulong) pagecache->blocks_used, - (ulong) pagecache->global_blocks_changed, - (ulong) pagecache->global_cache_w_requests, - (ulong) pagecache->global_cache_write, - (ulong) pagecache->global_cache_r_requests, - (ulong) pagecache->global_cache_read)); + DBUG_PRINT("status", ("used: %zu changed: %zu w_requests: %llu " + "writes: %llu r_requests: %llu reads: %llu", + pagecache->blocks_used, + pagecache->global_blocks_changed, + pagecache->global_cache_w_requests, + pagecache->global_cache_write, + pagecache->global_cache_r_requests, + pagecache->global_cache_read)); if (cleanup) { @@ -1945,7 +1946,7 @@ restart: removed from the cache as we set the PCBLOCK_REASSIGNED flag (see the code below that handles reading requests). */ - free_block(pagecache, block); + free_block(pagecache, block, 0); return 0; } /* Wait until the page is flushed on disk */ @@ -1956,7 +1957,7 @@ restart: /* Invalidate page in the block if it has not been done yet */ DBUG_ASSERT(block->status); /* Should always be true */ if (block->status) - free_block(pagecache, block); + free_block(pagecache, block, 0); return 0; } @@ -1981,8 +1982,13 @@ restart: } else { - DBUG_ASSERT(hash_link->requests > 0); - hash_link->requests--; + /* + When we come here either PCBLOCK_REASSIGNED or PCBLOCK_IN_SWITCH are + active. In both cases wqueue_release_queue() is called when the + state changes. + */ + DBUG_ASSERT(block->hash_link == hash_link); + remove_reader(block); KEYCACHE_DBUG_PRINT("find_block", ("request waiting for old page to be saved")); { @@ -3469,6 +3475,7 @@ restart: lock_to_read[lock].unlock_lock, unlock_pin, FALSE)) { + pagecache_pthread_mutex_unlock(&pagecache->cache_lock); DBUG_ASSERT(0); return (uchar*) 0; } @@ -3638,7 +3645,7 @@ static my_bool pagecache_delete_internal(PAGECACHE *pagecache, DBUG_ASSERT(block->hash_link->requests > 0); page_link->requests--; /* See NOTE for pagecache_unlock() about registering requests. */ - free_block(pagecache, block); + free_block(pagecache, block, 0); dec_counter_for_resize_op(pagecache); return 0; @@ -4219,7 +4226,8 @@ end: and add it to the free list. */ -static void free_block(PAGECACHE *pagecache, PAGECACHE_BLOCK_LINK *block) +static my_bool free_block(PAGECACHE *pagecache, PAGECACHE_BLOCK_LINK *block, + my_bool abort_if_pinned) { uint status= block->status; KEYCACHE_THREAD_TRACE("free block"); @@ -4233,11 +4241,27 @@ static void free_block(PAGECACHE *pagecache, PAGECACHE_BLOCK_LINK *block) /* While waiting for readers to finish, new readers might request the block. But since we set block->status|= PCBLOCK_REASSIGNED, they - will wait on block->wqueue[COND_FOR_SAVED]. They must be signalled + will wait on block->wqueue[COND_FOR_SAVED]. They must be signaled later. */ block->status|= PCBLOCK_REASSIGNED; wait_for_readers(pagecache, block); + if (unlikely(abort_if_pinned) && unlikely(block->pins)) + { + /* + Block got pinned while waiting for readers. + This can only happens when called from flush_pagecache_blocks_int() + when flushing blocks as part of prepare for maria_close() or from + flush_cached_blocks() + */ + block->status&= ~PCBLOCK_REASSIGNED; + unreg_request(pagecache, block, 0); + + /* All pending requests for this page must be resubmitted. */ + if (block->wqueue[COND_FOR_SAVED].last_thread) + wqueue_release_queue(&block->wqueue[COND_FOR_SAVED]); + return 1; + } unlink_hash(pagecache, block->hash_link); } @@ -4288,6 +4312,8 @@ static void free_block(PAGECACHE *pagecache, PAGECACHE_BLOCK_LINK *block) /* All pending requests for this page must be resubmitted. */ if (block->wqueue[COND_FOR_SAVED].last_thread) wqueue_release_queue(&block->wqueue[COND_FOR_SAVED]); + + return 0; } @@ -4423,9 +4449,16 @@ static int flush_cached_blocks(PAGECACHE *pagecache, if (! (type == FLUSH_KEEP || type == FLUSH_KEEP_LAZY || type == FLUSH_FORCE_WRITE)) { - pagecache->blocks_changed--; - pagecache->global_blocks_changed--; - free_block(pagecache, block); + if (!free_block(pagecache, block, 1)) + { + pagecache->blocks_changed--; + pagecache->global_blocks_changed--; + } + else + { + block->status&= ~PCBLOCK_IN_FLUSH; + link_to_file_list(pagecache, block, file, 1); + } } else { @@ -4663,7 +4696,7 @@ restart: /* It's a temporary file */ pagecache->blocks_changed--; pagecache->global_blocks_changed--; - free_block(pagecache, block); + free_block(pagecache, block, 0); } } else if (type != FLUSH_KEEP_LAZY) @@ -4733,11 +4766,12 @@ restart: #endif next= block->next_changed; if (block->hash_link->file.file == file->file && + !block->pins && (! (block->status & PCBLOCK_CHANGED) || type == FLUSH_IGNORE_CHANGED)) { reg_requests(pagecache, block, 1); - free_block(pagecache, block); + free_block(pagecache, block, 1); } } } diff --git a/storage/maria/ma_recovery.c b/storage/maria/ma_recovery.c index 08d306a89be..b1d2378870f 100644 --- a/storage/maria/ma_recovery.c +++ b/storage/maria/ma_recovery.c @@ -887,9 +887,7 @@ prototype_redo_exec_hook(REDO_CREATE_TABLE) if (create_database_if_not_exists(name)) goto end; fn_format(filename, name, "", MARIA_NAME_IEXT, - (MY_UNPACK_FILENAME | - (flags & HA_DONT_TOUCH_DATA) ? MY_RETURN_REAL_PATH : 0) | - MY_APPEND_EXT); + MY_UNPACK_FILENAME | MY_RETURN_REAL_PATH | MY_APPEND_EXT); linkname_ptr= NULL; create_flag= MY_DELETE_OLD; tprint(tracef, "Table '%s' creating as '%s'\n", name, filename); @@ -1988,7 +1986,7 @@ prototype_redo_exec_hook(UNDO_KEY_INSERT) const HA_KEYSEG *keyseg= info->s->keyinfo[keynr].seg; ulonglong value; char llbuf[22]; - uchar *to; + uchar reversed[MARIA_MAX_KEY_BUFF], *to; tprint(tracef, " state older than record\n"); /* we read the record to find the auto_increment value */ enlarge_buffer(rec); @@ -2005,7 +2003,6 @@ prototype_redo_exec_hook(UNDO_KEY_INSERT) if (keyseg->flag & HA_SWAP_KEY) { /* We put key from log record to "data record" packing format... */ - uchar reversed[MARIA_MAX_KEY_BUFF]; uchar *key_ptr= to; uchar *key_end= key_ptr + keyseg->length; to= reversed + keyseg->length; @@ -3061,7 +3058,7 @@ static MARIA_HA *get_MARIA_HA_from_REDO_record(const case LOGREC_REDO_INDEX: case LOGREC_REDO_INDEX_FREE_PAGE: index_page_redo_entry= 1; - /* Fall trough*/ + /* Fall through */ case LOGREC_REDO_INSERT_ROW_HEAD: case LOGREC_REDO_INSERT_ROW_TAIL: case LOGREC_REDO_PURGE_ROW_HEAD: diff --git a/storage/maria/ma_sort.c b/storage/maria/ma_sort.c index edd5650e07b..6e106976b70 100644 --- a/storage/maria/ma_sort.c +++ b/storage/maria/ma_sort.c @@ -896,8 +896,6 @@ cleanup: { DBUG_ASSERT(t_file2.type == WRITE_CACHE); *t_file=t_file2; /* Copy result file */ - t_file->current_pos= &t_file->write_pos; - t_file->current_end= &t_file->write_end; } DBUG_RETURN(*maxbuffer >= MERGEBUFF2); /* Return 1 if interrupted */ diff --git a/storage/maria/ma_state.c b/storage/maria/ma_state.c index 88ce88b8f98..15cc48ad468 100644 --- a/storage/maria/ma_state.c +++ b/storage/maria/ma_state.c @@ -750,9 +750,18 @@ void maria_versioning(MARIA_HA *info, my_bool versioning) void _ma_set_share_data_file_length(MARIA_SHARE *share, ulonglong new_length) { - mysql_mutex_lock(&share->intern_lock); + if (!share->internal_table) + mysql_mutex_lock(&share->intern_lock); if (share->state.state.data_file_length < new_length) + { share->state.state.data_file_length= new_length; + if (new_length >= share->base.max_data_file_length) + { + /* Give an error on next insert */ + share->state.changed|= STATE_DATA_FILE_FULL; + } + } + if (!share->internal_table) mysql_mutex_unlock(&share->intern_lock); } diff --git a/storage/maria/ma_test2.c b/storage/maria/ma_test2.c index 6dfa04a5217..24c48c67210 100644 --- a/storage/maria/ma_test2.c +++ b/storage/maria/ma_test2.c @@ -1006,8 +1006,8 @@ w_requests: %10lu\n\ writes: %10lu\n\ r_requests: %10lu\n\ reads: %10lu\n", - maria_pagecache->blocks_used, - maria_pagecache->global_blocks_changed, + (ulong) maria_pagecache->blocks_used, + (ulong) maria_pagecache->global_blocks_changed, (ulong) maria_pagecache->global_cache_w_requests, (ulong) maria_pagecache->global_cache_write, (ulong) maria_pagecache->global_cache_r_requests, diff --git a/storage/maria/ma_write.c b/storage/maria/ma_write.c index fdcb5abd090..06aa2da7ae2 100644 --- a/storage/maria/ma_write.c +++ b/storage/maria/ma_write.c @@ -107,9 +107,10 @@ int maria_write(MARIA_HA *info, uchar *record) if (_ma_readinfo(info,F_WRLCK,1)) DBUG_RETURN(my_errno); - if (share->base.reloc == (ha_rows) 1 && - share->base.records == (ha_rows) 1 && - share->state.state.records == (ha_rows) 1) + if ((share->state.changed & STATE_DATA_FILE_FULL) || + (share->base.reloc == (ha_rows) 1 && + share->base.records == (ha_rows) 1 && + share->state.state.records == (ha_rows) 1)) { /* System file */ my_errno=HA_ERR_RECORD_FILE_FULL; goto err2; diff --git a/storage/maria/maria_chk.c b/storage/maria/maria_chk.c index 2b6f8164135..fc3d3492252 100644 --- a/storage/maria/maria_chk.c +++ b/storage/maria/maria_chk.c @@ -89,7 +89,7 @@ static int sort_record_index(MARIA_SORT_PARAM *sort_param, MARIA_PAGE *page, uint sortkey, File new_file, my_bool update_index); static my_bool write_log_record(HA_CHECK *param); -static void my_exit(int exit_code) __attribute__ ((noreturn)); +ATTRIBUTE_NORETURN static void my_exit(int exit_code); HA_CHECK check_param; diff --git a/storage/maria/maria_def.h b/storage/maria/maria_def.h index 8664157a65a..cc100b3706c 100644 --- a/storage/maria/maria_def.h +++ b/storage/maria/maria_def.h @@ -734,6 +734,7 @@ struct st_maria_handler #define STATE_MOVED 512U /* set if base->uuid != maria_uuid */ #define STATE_IN_REPAIR 1024U /* We are running repair on table */ #define STATE_CRASHED_PRINTED 2048U +#define STATE_DATA_FILE_FULL 4096U #define STATE_CRASHED_FLAGS (STATE_CRASHED | STATE_CRASHED_ON_REPAIR | STATE_CRASHED_PRINTED) diff --git a/storage/mroonga/mrn_table.cpp b/storage/mroonga/mrn_table.cpp index 96f24ff2e00..2b29c46be77 100644 --- a/storage/mroonga/mrn_table.cpp +++ b/storage/mroonga/mrn_table.cpp @@ -202,7 +202,7 @@ void mrn_get_partition_info(const char *table_name, uint table_name_length, const TABLE *table, partition_element **part_elem, partition_element **sub_elem) { - char tmp_name[FN_LEN]; + char tmp_name[FN_REFLEN + 1]; partition_info *part_info = table->part_info; partition_element *tmp_part_elem = NULL, *tmp_sub_elem = NULL; bool tmp_flg = FALSE, tmp_find_flg = FALSE; @@ -224,9 +224,10 @@ void mrn_get_partition_info(const char *table_name, uint table_name_length, List_iterator sub_it((*part_elem)->subpartitions); while ((*sub_elem = sub_it++)) { - create_subpartition_name(tmp_name, table->s->path.str, - (*part_elem)->partition_name, (*sub_elem)->partition_name, - NORMAL_PART_NAME); + if (create_subpartition_name(tmp_name, sizeof(tmp_name), table->s->path.str, + (*part_elem)->partition_name, (*sub_elem)->partition_name, + NORMAL_PART_NAME)) + DBUG_VOID_RETURN; DBUG_PRINT("info", ("mroonga tmp_name=%s", tmp_name)); if (table_name && !memcmp(table_name, tmp_name, table_name_length + 1)) DBUG_VOID_RETURN; @@ -243,8 +244,9 @@ void mrn_get_partition_info(const char *table_name, uint table_name_length, } } } else { - create_partition_name(tmp_name, table->s->path.str, - (*part_elem)->partition_name, NORMAL_PART_NAME, TRUE); + if (create_partition_name(tmp_name, sizeof(tmp_name), table->s->path.str, + (*part_elem)->partition_name, NORMAL_PART_NAME, TRUE)) + DBUG_VOID_RETURN; DBUG_PRINT("info", ("mroonga tmp_name=%s", tmp_name)); if (table_name && !memcmp(table_name, tmp_name, table_name_length + 1)) DBUG_VOID_RETURN; diff --git a/storage/myisam/ha_myisam.cc b/storage/myisam/ha_myisam.cc index 2b5536a9ce5..213b1dc9ec3 100644 --- a/storage/myisam/ha_myisam.cc +++ b/storage/myisam/ha_myisam.cc @@ -577,7 +577,10 @@ extern "C" { int killed_ptr(HA_CHECK *param) { - return thd_killed((THD*)param->thd); + if (likely(thd_killed((THD*)param->thd)) == 0) + return 0; + my_errno= HA_ERR_ABORTED_BY_USER; + return 1; } void mi_check_print_error(HA_CHECK *param, const char *fmt,...) @@ -849,6 +852,10 @@ int ha_myisam::open(const char *name, int mode, uint test_if_locked) /* Count statistics of usage for newly open normal files */ if (file->s->reopen == 1 && ! (test_if_locked & HA_OPEN_TMP_TABLE)) { + /* use delay_key_write from .frm, not .MYI */ + file->s->delay_key_write= delay_key_write_options == DELAY_KEY_WRITE_ALL || + (delay_key_write_options == DELAY_KEY_WRITE_ON && + table->s->db_create_options & HA_OPTION_DELAY_KEY_WRITE); if (file->s->delay_key_write) feature_files_opened_with_delayed_keys++; } @@ -1175,9 +1182,6 @@ int ha_myisam::repair(THD *thd, HA_CHECK ¶m, bool do_optimize) share->state.dupp_key= MI_MAX_KEY; strmov(fixed_name,file->filename); - // Release latches since this can take a long time - ha_release_temporary_latches(thd); - /* Don't lock tables if we have used LOCK TABLE or if we come from enable_index() @@ -1213,6 +1217,11 @@ int ha_myisam::repair(THD *thd, HA_CHECK ¶m, bool do_optimize) if (remap) mi_munmap_file(file); #endif + /* + The following is to catch errors when my_errno is no set properly + during repairt + */ + my_errno= 0; if (mi_test_if_sort_rep(file,file->state->records,tmp_key_map,0) && (local_testflag & T_REP_BY_SORT)) { @@ -1235,8 +1244,11 @@ int ha_myisam::repair(THD *thd, HA_CHECK ¶m, bool do_optimize) } if (error && file->create_unique_index_by_sort && share->state.dupp_key != MAX_KEY) + { + my_errno= HA_ERR_FOUND_DUPP_KEY; print_keydup_error(table, &table->key_info[share->state.dupp_key], MYF(0)); + } } else { @@ -1327,6 +1339,7 @@ int ha_myisam::assign_to_keycache(THD* thd, HA_CHECK_OPT *check_opt) { KEY_CACHE *new_key_cache= check_opt->key_cache; const char *errmsg= 0; + char buf[STRING_BUFFER_USUAL_SIZE]; int error= HA_ADMIN_OK; ulonglong map; TABLE_LIST *table_list= table->pos_in_table_list; @@ -1343,7 +1356,6 @@ int ha_myisam::assign_to_keycache(THD* thd, HA_CHECK_OPT *check_opt) if ((error= mi_assign_to_key_cache(file, map, new_key_cache))) { - char buf[STRING_BUFFER_USUAL_SIZE]; my_snprintf(buf, sizeof(buf), "Failed to flush to index file (errno: %d)", error); errmsg= buf; @@ -2279,16 +2291,19 @@ ha_myisam::check_if_supported_inplace_alter(TABLE *new_table, { DBUG_ENTER("ha_myisam::check_if_supported_inplace_alter"); - const uint readd_index= Alter_inplace_info::ADD_INDEX | + const Alter_inplace_info::HA_ALTER_FLAGS readd_index= + Alter_inplace_info::ADD_INDEX | Alter_inplace_info::DROP_INDEX; - const uint readd_unique= Alter_inplace_info::ADD_UNIQUE_INDEX | - Alter_inplace_info::DROP_UNIQUE_INDEX; - const uint readd_pk= Alter_inplace_info::ADD_PK_INDEX | - Alter_inplace_info::DROP_PK_INDEX; + const Alter_inplace_info::HA_ALTER_FLAGS readd_unique= + Alter_inplace_info::ADD_UNIQUE_INDEX | + Alter_inplace_info::DROP_UNIQUE_INDEX; + const Alter_inplace_info::HA_ALTER_FLAGS readd_pk= + Alter_inplace_info::ADD_PK_INDEX | + Alter_inplace_info::DROP_PK_INDEX; - const uint op= alter_info->handler_flags; + const Alter_inplace_info::HA_ALTER_FLAGS op= alter_info->handler_flags; - if (alter_info->handler_flags & Alter_inplace_info::ALTER_COLUMN_VCOL) + if (op & Alter_inplace_info::ALTER_COLUMN_VCOL) DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED); /* @@ -2349,17 +2364,16 @@ bool ha_myisam::check_if_incompatible_data(HA_CREATE_INFO *create_info, { uint options= table->s->db_options_in_use; - if (create_info->auto_increment_value != stats.auto_increment_value || + if ((create_info->used_fields & HA_CREATE_USED_AUTO && + create_info->auto_increment_value != stats.auto_increment_value) || create_info->data_file_name != data_file_name || create_info->index_file_name != index_file_name || table_changes == IS_EQUAL_NO || table_changes & IS_EQUAL_PACK_LENGTH) // Not implemented yet return COMPATIBLE_DATA_NO; - if ((options & (HA_OPTION_PACK_RECORD | HA_OPTION_CHECKSUM | - HA_OPTION_DELAY_KEY_WRITE)) != - (create_info->table_options & (HA_OPTION_PACK_RECORD | HA_OPTION_CHECKSUM | - HA_OPTION_DELAY_KEY_WRITE))) + if ((options & (HA_OPTION_PACK_RECORD | HA_OPTION_CHECKSUM)) != + (create_info->table_options & (HA_OPTION_PACK_RECORD | HA_OPTION_CHECKSUM))) return COMPATIBLE_DATA_NO; return COMPATIBLE_DATA_YES; } diff --git a/storage/myisam/mi_check.c b/storage/myisam/mi_check.c index e0016eca43f..71ab372f2aa 100644 --- a/storage/myisam/mi_check.c +++ b/storage/myisam/mi_check.c @@ -2677,6 +2677,8 @@ int mi_repair_parallel(HA_CHECK *param, register MI_INFO *info, */ DBUG_PRINT("info", ("is quick repair: %d", rep_quick)); bzero((char*)&sort_info,sizeof(sort_info)); + if (!rep_quick) + my_b_clear(&new_data_cache); /* Initialize pthread structures before goto err. */ mysql_mutex_init(mi_key_mutex_MI_SORT_INFO_mutex, &sort_info.mutex, MY_MUTEX_INIT_FAST); @@ -3056,7 +3058,7 @@ err: already or they were not yet started (if the error happend before creating the threads). */ - if (!rep_quick) + if (!rep_quick && my_b_inited(&new_data_cache)) (void) end_io_cache(&new_data_cache); if (!got_error) { @@ -3126,6 +3128,7 @@ static int sort_key_read(MI_SORT_PARAM *sort_param, void *key) } if (info->state->records == sort_info->max_records) { + my_errno= HA_ERR_WRONG_IN_RECORD; mi_check_print_error(sort_info->param, "Key %d - Found too many records; Can't continue", sort_param->key+1); @@ -3332,6 +3335,7 @@ static int sort_get_next_record(MI_SORT_PARAM *sort_param) param->error_printed=1; param->retry_repair=1; param->testflag|=T_RETRY_WITHOUT_QUICK; + my_errno= HA_ERR_WRONG_IN_RECORD; DBUG_RETURN(1); /* Something wrong with data */ } b_type=_mi_get_block_info(&block_info,-1,pos); @@ -3590,6 +3594,7 @@ static int sort_get_next_record(MI_SORT_PARAM *sort_param) param->error_printed=1; param->retry_repair=1; param->testflag|=T_RETRY_WITHOUT_QUICK; + my_errno= HA_ERR_WRONG_IN_RECORD; DBUG_RETURN(1); /* Something wrong with data */ } sort_param->start_recpos=sort_param->pos; diff --git a/storage/myisam/mi_delete_table.c b/storage/myisam/mi_delete_table.c index d766fb2547f..5ad63a5cc87 100644 --- a/storage/myisam/mi_delete_table.c +++ b/storage/myisam/mi_delete_table.c @@ -38,11 +38,9 @@ int mi_delete_table(const char *name) mysql_file_delete_with_symlink(mi_key_file_dfile, name, MI_NAME_DEXT, MYF(MY_WME))) DBUG_RETURN(my_errno); - // optionally present: mysql_file_delete_with_symlink(mi_key_file_dfile, name, ".OLD", MYF(0)); mysql_file_delete_with_symlink(mi_key_file_dfile, name, ".TMD", MYF(0)); DBUG_RETURN(0); } - diff --git a/storage/myisam/mi_extra.c b/storage/myisam/mi_extra.c index 3d6049c0172..1487592d2d6 100644 --- a/storage/myisam/mi_extra.c +++ b/storage/myisam/mi_extra.c @@ -150,6 +150,7 @@ int mi_extra(MI_INFO *info, enum ha_extra_function function, void *extra_arg) if (info->s->data_file_type != DYNAMIC_RECORD) break; /* Remove read/write cache if dynamic rows */ + /* fall through */ case HA_EXTRA_NO_CACHE: if (info->opt_flag & (READ_CACHE_USED | WRITE_CACHE_USED)) { @@ -262,7 +263,7 @@ int mi_extra(MI_INFO *info, enum ha_extra_function function, void *extra_arg) //share->deleting= TRUE; share->global_changed= FALSE; /* force writing changed flag */ _mi_mark_file_changed(info); - /* Fall trough */ + /* Fall through */ case HA_EXTRA_PREPARE_FOR_RENAME: DBUG_ASSERT(!share->temporary); mysql_mutex_lock(&THR_LOCK_myisam); diff --git a/storage/myisam/mi_locking.c b/storage/myisam/mi_locking.c index 531b800c63e..1921926463e 100644 --- a/storage/myisam/mi_locking.c +++ b/storage/myisam/mi_locking.c @@ -29,7 +29,7 @@ static void mi_update_status_with_lock(MI_INFO *info); int mi_lock_database(MI_INFO *info, int lock_type) { - int error; + int error, mark_crashed= 0; uint count; MYISAM_SHARE *share=info->s; DBUG_ENTER("mi_lock_database"); @@ -52,6 +52,7 @@ int mi_lock_database(MI_INFO *info, int lock_type) } error= 0; + DBUG_EXECUTE_IF ("mi_lock_database_failure", error= EINVAL;); mysql_mutex_lock(&share->intern_lock); if (share->kfile >= 0) /* May only be false on windows */ { @@ -75,17 +76,15 @@ int mi_lock_database(MI_INFO *info, int lock_type) &share->dirty_part_map, FLUSH_KEEP)) { - error=my_errno; + mark_crashed= error=my_errno; mi_print_error(info->s, HA_ERR_CRASHED); - mi_mark_crashed(info); /* Mark that table must be checked */ } if (info->opt_flag & (READ_CACHE_USED | WRITE_CACHE_USED)) { if (end_io_cache(&info->rec_cache)) { - error=my_errno; + mark_crashed= error=my_errno; mi_print_error(info->s, HA_ERR_CRASHED); - mi_mark_crashed(info); } } if (!count) @@ -110,22 +109,19 @@ int mi_lock_database(MI_INFO *info, int lock_type) share->state.unique= info->last_unique= info->this_unique; share->state.update_count= info->last_loop= ++info->this_loop; if (mi_state_info_write(share->kfile, &share->state, 1)) - error=my_errno; + mark_crashed= error=my_errno; share->changed=0; if (myisam_flush) { if (mysql_file_sync(share->kfile, MYF(0))) - error= my_errno; + mark_crashed= error= my_errno; if (mysql_file_sync(info->dfile, MYF(0))) - error= my_errno; + mark_crashed= error= my_errno; } else share->not_flushed=1; if (error) - { mi_print_error(info->s, HA_ERR_CRASHED); - mi_mark_crashed(info); - } } if (info->lock_type != F_EXTRA_LCK) { @@ -260,6 +256,8 @@ int mi_lock_database(MI_INFO *info, int lock_type) } #endif mysql_mutex_unlock(&share->intern_lock); + if (mark_crashed) + mi_mark_crashed(info); DBUG_RETURN(error); } /* mi_lock_database */ diff --git a/storage/myisam/mi_open.c b/storage/myisam/mi_open.c index ef47265a18b..41b0e18da02 100644 --- a/storage/myisam/mi_open.c +++ b/storage/myisam/mi_open.c @@ -151,7 +151,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags) } share->mode=open_mode; errpos=1; - if (mysql_file_read(kfile, share->state.header.file_version, head_length, + if (mysql_file_read(kfile, (uchar*)&share->state.header, head_length, MYF(MY_NABP))) { my_errno= HA_ERR_NOT_A_TABLE; diff --git a/storage/myisam/mysql-test/storage_engine/alter_tablespace.rdiff b/storage/myisam/mysql-test/storage_engine/alter_tablespace.rdiff index 4215af58011..a8c78b117a9 100644 --- a/storage/myisam/mysql-test/storage_engine/alter_tablespace.rdiff +++ b/storage/myisam/mysql-test/storage_engine/alter_tablespace.rdiff @@ -13,7 +13,7 @@ -2 -ALTER TABLE t1 DISCARD TABLESPACE; -SELECT a FROM t1; --ERROR HY000: Tablespace has been discarded for table 't1' +-ERROR HY000: Tablespace has been discarded for table `t1` -ALTER TABLE t1 IMPORT TABLESPACE; -Warnings: -Warning 1810 IO Read error: (2, No such file or directory) Error opening './test/t1.cfg', will attempt to import without schema verification diff --git a/storage/myisam/mysql-test/storage_engine/parts/disabled.def b/storage/myisam/mysql-test/storage_engine/parts/disabled.def new file mode 100644 index 00000000000..e69de29bb2d diff --git a/storage/myisam/sort.c b/storage/myisam/sort.c index 0d177072ec7..533f2cd2aa6 100644 --- a/storage/myisam/sort.c +++ b/storage/myisam/sort.c @@ -844,8 +844,6 @@ cleanup: { DBUG_ASSERT(t_file2.type == WRITE_CACHE); *t_file=t_file2; /* Copy result file */ - t_file->current_pos= &t_file->write_pos; - t_file->current_end= &t_file->write_end; } DBUG_RETURN(*maxbuffer >= MERGEBUFF2); /* Return 1 if interrupted */ diff --git a/storage/myisammrg/mysql-test/storage_engine/alter_tablespace.rdiff b/storage/myisammrg/mysql-test/storage_engine/alter_tablespace.rdiff index 19ca1a1b6e1..e5462f8cb1f 100644 --- a/storage/myisammrg/mysql-test/storage_engine/alter_tablespace.rdiff +++ b/storage/myisammrg/mysql-test/storage_engine/alter_tablespace.rdiff @@ -13,7 +13,7 @@ -2 -ALTER TABLE t1 DISCARD TABLESPACE; -SELECT a FROM t1; --ERROR HY000: Tablespace has been discarded for table 't1' +-ERROR HY000: Tablespace has been discarded for table `t1` -ALTER TABLE t1 IMPORT TABLESPACE; -Warnings: -Warning 1810 IO Read error: (2, No such file or directory) Error opening './test/t1.cfg', will attempt to import without schema verification diff --git a/storage/myisammrg/mysql-test/storage_engine/create_table.rdiff b/storage/myisammrg/mysql-test/storage_engine/create_table.rdiff index 585e5c915ba..5f5c2528a95 100644 --- a/storage/myisammrg/mysql-test/storage_engine/create_table.rdiff +++ b/storage/myisammrg/mysql-test/storage_engine/create_table.rdiff @@ -29,7 +29,7 @@ -SHOW CREATE TABLE t1; -Table Create Table -t1 CREATE TABLE `t1` ( -- `1` bigint(20) NOT NULL DEFAULT '0' +- `1` bigint(20) NOT NULL DEFAULT 0 -) ENGINE= DEFAULT CHARSET=latin1 -SELECT * FROM t1; -1 diff --git a/storage/myisammrg/mysql-test/storage_engine/disabled.def b/storage/myisammrg/mysql-test/storage_engine/disabled.def new file mode 100644 index 00000000000..227e33029d8 --- /dev/null +++ b/storage/myisammrg/mysql-test/storage_engine/disabled.def @@ -0,0 +1,3 @@ +insert_delayed : MDEV-12880 - INSERT DELAYED is not detected as inapplicable to a table under lock +lock_concurrent : MDEV-12882 - Assertion failure +select_high_prio : MDEV-12885 - MDL_SHARED_READ_ONLY is taken instead of MDL_SHARED_READ diff --git a/storage/myisammrg/mysql-test/storage_engine/parts/repair_table.rdiff b/storage/myisammrg/mysql-test/storage_engine/parts/repair_table.rdiff index d7bf99fd674..35d4f6b63d6 100644 --- a/storage/myisammrg/mysql-test/storage_engine/parts/repair_table.rdiff +++ b/storage/myisammrg/mysql-test/storage_engine/parts/repair_table.rdiff @@ -1,6 +1,6 @@ ---- repair_table.result 2013-01-23 01:35:44.388267080 +0400 -+++ repair_table.reject 2013-01-23 03:16:26.468307847 +0400 -@@ -1,234 +1,114 @@ +--- suite/storage_engine/parts/repair_table.result 2017-08-28 19:29:20.491633306 +0300 ++++ suite/storage_engine/parts/repair_table.reject 2017-08-28 19:34:41.723633059 +0300 +@@ -1,235 +1,115 @@ call mtr.add_suppression("Table '.*t1.*' is marked as crashed and should be repaired"); DROP TABLE IF EXISTS t1, t2; CREATE TABLE t1 (a , b ) ENGINE= PARTITION BY HASH(a) PARTITIONS 2; @@ -144,6 +144,7 @@ call mtr.add_suppression("MySQL thread id .*, query id .* localhost.*root Checking table"); call mtr.add_suppression(" '\..test.t1'"); call mtr.add_suppression("Couldn't repair table: test.t1"); + call mtr.add_suppression("Table 't1' is marked as crashed.*"); CREATE TABLE t1 (a , b , (a)) ENGINE= PARTITION BY HASH(a) PARTITIONS 2; +ERROR HY000: Engine cannot be used in partitioned tables +# ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed) diff --git a/storage/myisammrg/mysql-test/storage_engine/parts/truncate_table.rdiff b/storage/myisammrg/mysql-test/storage_engine/parts/truncate_table.rdiff index 22e3447e00a..9ba985f7adc 100644 --- a/storage/myisammrg/mysql-test/storage_engine/parts/truncate_table.rdiff +++ b/storage/myisammrg/mysql-test/storage_engine/parts/truncate_table.rdiff @@ -27,7 +27,7 @@ - `c` char(8) DEFAULT NULL, - PRIMARY KEY (`a`) -) ENGINE= DEFAULT CHARSET=latin1 -- PARTITION BY HASH (a) +- PARTITION BY HASH (`a`) -PARTITIONS 2 -INSERT INTO t1 (c) VALUES ('a'),('b'),('c'); -SHOW CREATE TABLE t1; @@ -37,7 +37,7 @@ - `c` char(8) DEFAULT NULL, - PRIMARY KEY (`a`) -) ENGINE= AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 -- PARTITION BY HASH (a) +- PARTITION BY HASH (`a`) -PARTITIONS 2 -TRUNCATE TABLE t1; -SHOW CREATE TABLE t1; @@ -47,7 +47,7 @@ - `c` char(8) DEFAULT NULL, - PRIMARY KEY (`a`) -) ENGINE= DEFAULT CHARSET=latin1 -- PARTITION BY HASH (a) +- PARTITION BY HASH (`a`) -PARTITIONS 2 -INSERT INTO t1 (c) VALUES ('d'); -SHOW CREATE TABLE t1; @@ -57,7 +57,7 @@ - `c` char(8) DEFAULT NULL, - PRIMARY KEY (`a`) -) ENGINE= AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 -- PARTITION BY HASH (a) +- PARTITION BY HASH (`a`) -PARTITIONS 2 -SELECT a,c FROM t1; -a c diff --git a/storage/myisammrg/mysql-test/storage_engine/repair_table.rdiff b/storage/myisammrg/mysql-test/storage_engine/repair_table.rdiff index 9ff8f906511..79f6c7040e0 100644 --- a/storage/myisammrg/mysql-test/storage_engine/repair_table.rdiff +++ b/storage/myisammrg/mysql-test/storage_engine/repair_table.rdiff @@ -1,5 +1,5 @@ ---- repair_table.result 2013-01-23 01:26:05.995538460 +0400 -+++ repair_table.reject 2013-01-23 02:50:55.035560564 +0400 +--- suite/storage_engine/repair_table.result 2017-05-24 01:09:07.274213486 +0300 ++++ suite/storage_engine/repair_table.reject 2017-05-24 01:10:25.466214949 +0300 @@ -4,56 +4,50 @@ CREATE TABLE t2 (a , b ) ENGINE= ; REPAIR TABLE t1; @@ -71,7 +71,7 @@ DROP TABLE t1, t2; call mtr.add_suppression("Got an error from thread_id=.*"); call mtr.add_suppression("MySQL thread id .*, query id .* localhost.*root Checking table"); -@@ -62,45 +56,32 @@ +@@ -63,45 +57,32 @@ CREATE TABLE t1 (a , b , (a)) ENGINE= ; REPAIR TABLE t1; Table Op Msg_type Msg_text @@ -104,7 +104,7 @@ -test.t1 check error Corrupt +test.t1 check status OK SELECT a,b FROM t1; --ERROR HY000: Incorrect key file for table 't1'; try to repair it +-ERROR HY000: Index for table 't1' is corrupt; try to repair it -# Statement ended with one of expected results (0,ER_NOT_KEYFILE,144). -# If you got a difference in error message, just add it to rdiff file -INSERT INTO t1 (a,b) VALUES (14,'n'),(15,'o'); diff --git a/storage/myisammrg/mysql-test/storage_engine/tbl_opt_data_index_dir.rdiff b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_data_dir.rdiff similarity index 58% rename from storage/myisammrg/mysql-test/storage_engine/tbl_opt_data_index_dir.rdiff rename to storage/myisammrg/mysql-test/storage_engine/tbl_opt_data_dir.rdiff index e6055278b3c..671e26ec617 100644 --- a/storage/myisammrg/mysql-test/storage_engine/tbl_opt_data_index_dir.rdiff +++ b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_data_dir.rdiff @@ -1,18 +1,18 @@ ---- tbl_opt_data_index_dir.result 2013-01-22 22:05:05.246633000 +0400 -+++ tbl_opt_data_index_dir.reject 2013-01-23 02:50:59.951498762 +0400 -@@ -4,7 +4,7 @@ +--- suite/storage_engine/tbl_opt_data_dir.result 2017-05-24 00:21:15.550159778 +0300 ++++ ../storage/myisammrg/mysql-test/storage_engine/tbl_opt_data_dir.reject 2017-05-24 00:25:45.506164827 +0300 +@@ -5,7 +5,7 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` char(8) DEFAULT NULL --) ENGINE= DEFAULT CHARSET=latin1 DATA DIRECTORY='' INDEX DIRECTORY='' +-) ENGINE= DEFAULT CHARSET=latin1 DATA DIRECTORY='' +) ENGINE= DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`) + # For ALTER TABLE the option is ignored + # Running ALTER TABLE .. DATA DIRECTORY = <> Warnings: - Warning 1618 option ignored - SHOW CREATE TABLE t1; -@@ -12,5 +12,5 @@ +@@ -15,5 +15,5 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` char(8) DEFAULT NULL --) ENGINE= DEFAULT CHARSET=latin1 DATA DIRECTORY='' INDEX DIRECTORY='' +-) ENGINE= DEFAULT CHARSET=latin1 DATA DIRECTORY='' +) ENGINE= DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`) DROP TABLE t1; diff --git a/storage/myisammrg/mysql-test/storage_engine/tbl_opt_index_dir.rdiff b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_index_dir.rdiff new file mode 100644 index 00000000000..ca025861f68 --- /dev/null +++ b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_index_dir.rdiff @@ -0,0 +1,18 @@ +--- suite/storage_engine/tbl_opt_index_dir.result 2017-05-24 00:21:15.550159778 +0300 ++++ ../storage/myisammrg/mysql-test/storage_engine/tbl_opt_index_dir.reject 2017-05-24 00:25:45.506164827 +0300 +@@ -5,7 +5,7 @@ + t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` char(8) DEFAULT NULL +-) ENGINE= DEFAULT CHARSET=latin1 INDEX DIRECTORY='' ++) ENGINE= DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`) + # For ALTER TABLE the option is ignored + # Running ALTER TABLE .. INDEX DIRECTORY = <> + Warnings: +@@ -15,5 +15,5 @@ + t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` char(8) DEFAULT NULL +-) ENGINE= DEFAULT CHARSET=latin1 INDEX DIRECTORY='' ++) ENGINE= DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`) + DROP TABLE t1; diff --git a/storage/myisammrg/mysql-test/storage_engine/tbl_opt_row_format.rdiff b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_row_format.rdiff index f7e0905d4e7..6c756e7b8e1 100644 --- a/storage/myisammrg/mysql-test/storage_engine/tbl_opt_row_format.rdiff +++ b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_row_format.rdiff @@ -1,17 +1,33 @@ ---- tbl_opt_row_format.result 2013-01-22 22:05:05.246633000 +0400 -+++ tbl_opt_row_format.reject 2013-01-23 02:51:04.743438518 +0400 -@@ -5,12 +5,12 @@ - t1 CREATE TABLE `t1` ( - `a` int(11) DEFAULT NULL, - `b` char(8) DEFAULT NULL --) ENGINE= DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED -+) ENGINE= DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED INSERT_METHOD=LAST UNION=(`mrg`.`t1`) - ALTER TABLE t1 ROW_FORMAT=DYNAMIC; - SHOW CREATE TABLE t1; - Table Create Table +--- ../storage/myisammrg/mysql-test/storage_engine/tbl_opt_row_format.result~ 2017-05-24 00:50:44.254192857 +0300 ++++ ../storage/myisammrg/mysql-test/storage_engine/tbl_opt_row_format.reject 2017-05-24 00:50:44.334192859 +0300 +@@ -5,26 +5,26 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` char(8) DEFAULT NULL -) ENGINE= DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC +) ENGINE= DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC INSERT_METHOD=LAST UNION=(`mrg`.`t1`) + ALTER TABLE t1 ROW_FORMAT=FIXED; + SHOW CREATE TABLE t1; + Table Create Table + t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` char(8) DEFAULT NULL +-) ENGINE= DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED ++) ENGINE= DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED INSERT_METHOD=LAST UNION=(`mrg`.`t1`) + ALTER TABLE t1 ROW_FORMAT=PAGE; + SHOW CREATE TABLE t1; + Table Create Table + t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` char(8) DEFAULT NULL +-) ENGINE= DEFAULT CHARSET=latin1 ROW_FORMAT=PAGE ++) ENGINE= DEFAULT CHARSET=latin1 ROW_FORMAT=PAGE INSERT_METHOD=LAST UNION=(`mrg`.`t1`) + ALTER TABLE t1 ROW_FORMAT=COMPACT; + SHOW CREATE TABLE t1; + Table Create Table + t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` char(8) DEFAULT NULL +-) ENGINE= DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT ++) ENGINE= DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT INSERT_METHOD=LAST UNION=(`mrg`.`t1`) DROP TABLE t1; diff --git a/storage/myisammrg/mysql-test/storage_engine/type_spatial.rdiff b/storage/myisammrg/mysql-test/storage_engine/type_spatial.rdiff index 024c1646892..6f337ffb638 100644 --- a/storage/myisammrg/mysql-test/storage_engine/type_spatial.rdiff +++ b/storage/myisammrg/mysql-test/storage_engine/type_spatial.rdiff @@ -352,8 +352,8 @@ -116 0 -SELECT fid, AsText(Centroid(g)) FROM gis_multi_polygon; -fid AsText(Centroid(g)) --117 POINT(55.58852775304245 17.426536064113982) --118 POINT(55.58852775304245 17.426536064113982) +-117 POINT(57.98031067576927 17.854754130800433) +-118 POINT(57.98031067576927 17.854754130800433) -119 POINT(2 2) -SELECT fid, Area(g) FROM gis_multi_polygon; -fid Area(g) diff --git a/storage/myisammrg/mysql-test/storage_engine/type_spatial_indexes.rdiff b/storage/myisammrg/mysql-test/storage_engine/type_spatial_indexes.rdiff index 1caa6c3d5a8..04c56979244 100644 --- a/storage/myisammrg/mysql-test/storage_engine/type_spatial_indexes.rdiff +++ b/storage/myisammrg/mysql-test/storage_engine/type_spatial_indexes.rdiff @@ -352,8 +352,8 @@ -116 0 -SELECT fid, AsText(Centroid(g)) FROM gis_multi_polygon; -fid AsText(Centroid(g)) --117 POINT(55.58852775304245 17.426536064113982) --118 POINT(55.58852775304245 17.426536064113982) +-117 POINT(57.98031067576927 17.854754130800433) +-118 POINT(57.98031067576927 17.854754130800433) -119 POINT(2 2) -SELECT fid, Area(g) FROM gis_multi_polygon; -fid Area(g) @@ -1062,8 +1062,8 @@ -116 0 -SELECT fid, AsText(Centroid(g)) FROM gis_multi_polygon; -fid AsText(Centroid(g)) --117 POINT(55.58852775304245 17.426536064113982) --118 POINT(55.58852775304245 17.426536064113982) +-117 POINT(57.98031067576927 17.854754130800433) +-118 POINT(57.98031067576927 17.854754130800433) -119 POINT(2 2) -SELECT fid, Area(g) FROM gis_multi_polygon; -fid Area(g) diff --git a/storage/myisammrg/mysql-test/storage_engine/vcol.rdiff b/storage/myisammrg/mysql-test/storage_engine/vcol.rdiff index c7372326fad..d537967ef99 100644 --- a/storage/myisammrg/mysql-test/storage_engine/vcol.rdiff +++ b/storage/myisammrg/mysql-test/storage_engine/vcol.rdiff @@ -6,12 +6,12 @@ -SHOW COLUMNS IN t1; -Field Type Null Key Default Extra -a int(11) # # --b int(11) # # VIRTUAL +-b int(11) # # VIRTUAL GENERATED -INSERT INTO t1 (a) VALUES (1),(2); -INSERT INTO t1 (a,b) VALUES (3,3),(4,4); -Warnings: --Warning 1906 The value specified for computed column 'b' in table 't1' ignored --Warning 1906 The value specified for computed column 'b' in table 't1' ignored +-Warning 1906 The value specified for generated column 'b' in table 't1' ignored +-Warning 1906 The value specified for generated column 'b' in table 't1' ignored -SELECT a,b FROM t1; -a b -1 2 @@ -23,12 +23,12 @@ -SHOW COLUMNS IN t1; -Field Type Null Key Default Extra -a int(11) # # --b int(11) # # PERSISTENT +-b int(11) # # STORED GENERATED -INSERT INTO t1 (a) VALUES (1),(2); -INSERT INTO t1 (a,b) VALUES (3,3),(4,4); -Warnings: --Warning 1906 The value specified for computed column 'b' in table 't1' ignored --Warning 1906 The value specified for computed column 'b' in table 't1' ignored +-Warning 1906 The value specified for generated column 'b' in table 't1' ignored +-Warning 1906 The value specified for generated column 'b' in table 't1' ignored -SELECT a,b FROM t1; -a b -1 2 @@ -40,12 +40,12 @@ -SHOW COLUMNS IN t1; -Field Type Null Key Default Extra -a int(11) # # --b int(11) # # VIRTUAL +-b int(11) # # VIRTUAL GENERATED -INSERT INTO t1 (a) VALUES (1),(2); -INSERT INTO t1 (a,b) VALUES (3,3),(4,4); -Warnings: --Warning 1906 The value specified for computed column 'b' in table 't1' ignored --Warning 1906 The value specified for computed column 'b' in table 't1' ignored +-Warning 1906 The value specified for generated column 'b' in table 't1' ignored +-Warning 1906 The value specified for generated column 'b' in table 't1' ignored -SELECT a,b FROM t1; -a b -1 2 @@ -57,12 +57,12 @@ -SHOW COLUMNS IN t1; -Field Type Null Key Default Extra -a int(11) # # --b int(11) # # PERSISTENT +-b int(11) # # STORED GENERATED -INSERT INTO t1 (a) VALUES (1),(2); -INSERT INTO t1 (a,b) VALUES (3,3),(4,4); -Warnings: --Warning 1906 The value specified for computed column 'b' in table 't1' ignored --Warning 1906 The value specified for computed column 'b' in table 't1' ignored +-Warning 1906 The value specified for generated column 'b' in table 't1' ignored +-Warning 1906 The value specified for generated column 'b' in table 't1' ignored -SELECT a,b FROM t1; -a b -1 2 @@ -70,11 +70,11 @@ -3 4 -4 5 -DROP TABLE t1; -+ERROR HY000: MRG_MyISAM storage engine does not support computed columns -+# ERROR: Statement ended with errno 1910, errname ER_UNSUPPORTED_ENGINE_FOR_VIRTUAL_COLUMNS (expected to succeed) ++ERROR HY000: MRG_MyISAM storage engine does not support generated columns ++# ERROR: Statement ended with errno 1910, errname ER_UNSUPPORTED_ENGINE_FOR_GENERATED_COLUMNS (expected to succeed) +# ------------ UNEXPECTED RESULT ------------ +# [ CREATE TABLE t1 (a INT(11) /*!*/ /*Custom column options*/, b INT(11) /*!*/ /*Custom column options*/ GENERATED ALWAYS AS (a+1)) ENGINE=MRG_MYISAM /*!*/ /*Custom table options*/ UNION(mrg.t1) INSERT_METHOD=LAST ] -+# The statement|command finished with ER_UNSUPPORTED_ENGINE_FOR_VIRTUAL_COLUMNS. ++# The statement|command finished with ER_UNSUPPORTED_ENGINE_FOR_GENERATED_COLUMNS. +# Virtual columns or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors. +# You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def. +# Further in this test, the message might sometimes be suppressed; a part of the test might be skipped. diff --git a/storage/perfschema/ha_perfschema.cc b/storage/perfschema/ha_perfschema.cc index 598fc1061d8..4077e28a51c 100644 --- a/storage/perfschema/ha_perfschema.cc +++ b/storage/perfschema/ha_perfschema.cc @@ -225,7 +225,7 @@ maria_declare_plugin(perfschema) 0x0001, pfs_status_vars, NULL, - "5.6.33", + "5.6.36", MariaDB_PLUGIN_MATURITY_STABLE } maria_declare_plugin_end; diff --git a/storage/perfschema/pfs.cc b/storage/perfschema/pfs.cc index b58862d4824..3fd0e62ac44 100644 --- a/storage/perfschema/pfs.cc +++ b/storage/perfschema/pfs.cc @@ -3953,9 +3953,11 @@ static PSI_file* end_file_open_wait_v1(PSI_file_locker *locker, switch (state->m_operation) { case PSI_FILE_STAT: + case PSI_FILE_RENAME: break; case PSI_FILE_STREAM_OPEN: case PSI_FILE_CREATE: + case PSI_FILE_OPEN: if (result != NULL) { PFS_file_class *klass= reinterpret_cast (state->m_class); @@ -3966,7 +3968,6 @@ static PSI_file* end_file_open_wait_v1(PSI_file_locker *locker, state->m_file= reinterpret_cast (pfs_file); } break; - case PSI_FILE_OPEN: default: DBUG_ASSERT(false); break; diff --git a/storage/perfschema/pfs_digest.cc b/storage/perfschema/pfs_digest.cc index 3330c29795f..86b05f37fd2 100644 --- a/storage/perfschema/pfs_digest.cc +++ b/storage/perfschema/pfs_digest.cc @@ -1,4 +1,4 @@ -/* Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -257,10 +257,11 @@ search: if (safe_index == 0) { /* Record [0] is reserved. */ - safe_index= 1; + continue; } /* Add a new record in digest stat array. */ + DBUG_ASSERT(safe_index < digest_max); pfs= &statements_digest_stat_array[safe_index]; if (pfs->m_lock.is_free()) diff --git a/storage/perfschema/unittest/pfs-t.cc b/storage/perfschema/unittest/pfs-t.cc index f76b1aa2e75..b8814f2ad2d 100644 --- a/storage/perfschema/unittest/pfs-t.cc +++ b/storage/perfschema/unittest/pfs-t.cc @@ -1,4 +1,4 @@ -/* Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,6 +27,8 @@ #include "stub_print_error.h" #include "stub_pfs_defaults.h" +void unload_performance_schema(); + /* test helpers, to simulate the setup */ void setup_thread(PSI_thread *t, bool enabled) @@ -126,7 +128,7 @@ void test_bootstrap() psi_2= boot->get_interface(PSI_VERSION_2); ok(psi_2 == NULL, "version 2"); - shutdown_performance_schema(); + unload_performance_schema(); } /* @@ -183,6 +185,27 @@ PSI * load_perfschema() return (PSI*) psi; } +void unload_performance_schema() +{ + cleanup_table_share(); + cleanup_instruments(); + cleanup_sync_class(); + cleanup_thread_class(); + cleanup_table_share(); + cleanup_file_class(); + cleanup_stage_class(); + cleanup_statement_class(); + cleanup_socket_class(); + cleanup_events_waits_history_long(); + cleanup_events_stages_history_long(); + cleanup_events_statements_history_long(); + cleanup_table_share_hash(); + cleanup_file_hash(); + cleanup_digest(); + + shutdown_performance_schema(); +} + void test_bad_registration() { PSI *psi; @@ -581,8 +604,7 @@ void test_bad_registration() psi->register_socket("X", bad_socket_3, 1); ok(dummy_socket_key == 2, "assigned key"); - - shutdown_performance_schema(); + unload_performance_schema(); } void test_init_disabled() @@ -1016,7 +1038,7 @@ void test_init_disabled() socket_A1= psi->init_socket(99, NULL, NULL, 0); ok(socket_A1 == NULL, "broken socket key not instrumented"); - shutdown_performance_schema(); + unload_performance_schema(); } void test_locker_disabled() @@ -1316,14 +1338,14 @@ void test_locker_disabled() /* Pretend the socket does not have a thread owner */ /* ---------------------------------------------- */ - psi->delete_current_thread(); socket_class_A->m_enabled= true; socket_A1= psi->init_socket(socket_key_A, NULL, NULL, 0); ok(socket_A1 != NULL, "instrumented"); /* Socket thread owner has not been set */ socket_locker= psi->start_socket_wait(&socket_state, socket_A1, PSI_SOCKET_SEND, 12, "foo.cc", 12); - ok(socket_locker == NULL, "no locker (no thread owner)"); - + ok(socket_locker != NULL, "locker (owner not used)"); + psi->end_socket_wait(socket_locker, 10); + /* Pretend the running thread is not instrumented */ /* ---------------------------------------------- */ @@ -1351,7 +1373,7 @@ void test_locker_disabled() socket_locker= psi->start_socket_wait(&socket_state, socket_A1, PSI_SOCKET_SEND, 12, "foo.cc", 12); ok(socket_locker == NULL, "no locker"); - shutdown_performance_schema(); + unload_performance_schema(); } void test_file_instrumentation_leak() @@ -1438,7 +1460,7 @@ void test_file_instrumentation_leak() file_locker= psi->get_thread_file_descriptor_locker(&file_state, (File) 12, PSI_FILE_WRITE); ok(file_locker == NULL, "no locker, no leak"); - shutdown_performance_schema(); + unload_performance_schema(); } void test_enabled() @@ -1474,7 +1496,7 @@ void test_enabled() { & cond_key_B, "C-B", 0} }; - shutdown_performance_schema(); + unload_performance_schema(); #endif } @@ -1644,5 +1666,5 @@ int main(int argc, char **argv) MY_INIT(argv[0]); do_all_tests(); my_end(0); - return exit_status(); + return (exit_status()); } diff --git a/storage/perfschema/unittest/pfs_account-oom-t.cc b/storage/perfschema/unittest/pfs_account-oom-t.cc index f1cd5069b54..a87588487cb 100644 --- a/storage/perfschema/unittest/pfs_account-oom-t.cc +++ b/storage/perfschema/unittest/pfs_account-oom-t.cc @@ -1,4 +1,4 @@ -/* Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -108,6 +108,6 @@ int main(int, char **) MY_INIT("pfs_account-oom-t"); do_all_tests(); my_end(0); - return exit_status(); + return (exit_status()); } diff --git a/storage/perfschema/unittest/pfs_connect_attr-t.cc b/storage/perfschema/unittest/pfs_connect_attr-t.cc index 7bee1d063a1..ecf790eeede 100644 --- a/storage/perfschema/unittest/pfs_connect_attr-t.cc +++ b/storage/perfschema/unittest/pfs_connect_attr-t.cc @@ -1,4 +1,4 @@ -/* Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -341,5 +341,5 @@ int main(int, char **) diag("skipping the cp1251 tests : missing character set"); plan(59 + (cs_cp1251 ? 10 : 0)); do_all_tests(); - return 0; + return (exit_status()); } diff --git a/storage/perfschema/unittest/pfs_host-oom-t.cc b/storage/perfschema/unittest/pfs_host-oom-t.cc index c72162038ca..c089083e4ae 100644 --- a/storage/perfschema/unittest/pfs_host-oom-t.cc +++ b/storage/perfschema/unittest/pfs_host-oom-t.cc @@ -1,4 +1,4 @@ -/* Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -108,6 +108,6 @@ int main(int, char **) MY_INIT("pfs_host-oom-t"); do_all_tests(); my_end(0); - return exit_status(); + return (exit_status()); } diff --git a/storage/perfschema/unittest/pfs_instr-oom-t.cc b/storage/perfschema/unittest/pfs_instr-oom-t.cc index 93cddb0de6c..888acfab744 100644 --- a/storage/perfschema/unittest/pfs_instr-oom-t.cc +++ b/storage/perfschema/unittest/pfs_instr-oom-t.cc @@ -1,4 +1,4 @@ -/* Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -355,6 +355,11 @@ void test_oom() rc= init_instruments(& param); ok(rc == 1, "oom (per thread wait)"); + cleanup_sync_class(); + cleanup_thread_class(); + cleanup_file_class(); + cleanup_instruments(); + param.m_enabled= true; param.m_mutex_class_sizing= 0; param.m_rwlock_class_sizing= 0; @@ -432,6 +437,8 @@ void test_oom() init_event_name_sizing(& param); rc= init_instruments(& param); ok(rc == 1, "oom (thread stages history sizing)"); + + cleanup_thread_class(); cleanup_instruments(); param.m_enabled= true; @@ -467,6 +474,9 @@ void test_oom() init_event_name_sizing(& param); rc= init_instruments(& param); ok(rc == 1, "oom (per thread stages)"); + + cleanup_stage_class(); + cleanup_thread_class(); cleanup_instruments(); param.m_enabled= true; @@ -502,6 +512,8 @@ void test_oom() init_event_name_sizing(& param); rc= init_instruments(& param); ok(rc == 1, "oom (thread statements history sizing)"); + + cleanup_thread_class(); cleanup_instruments(); param.m_enabled= true; @@ -537,6 +549,9 @@ void test_oom() init_event_name_sizing(& param); rc= init_instruments(& param); ok(rc == 1, "oom (per thread statements)"); + + cleanup_statement_class(); + cleanup_thread_class(); cleanup_instruments(); param.m_enabled= true; @@ -572,6 +587,8 @@ void test_oom() init_event_name_sizing(& param); rc= init_instruments(& param); ok(rc == 1, "oom (global waits)"); + + cleanup_sync_class(); cleanup_instruments(); param.m_enabled= true; @@ -609,8 +626,10 @@ void test_oom() ok(rc == 0, "init stage class"); rc= init_instruments(& param); ok(rc == 1, "oom (global stages)"); - cleanup_instruments(); + + cleanup_sync_class(); cleanup_stage_class(); + cleanup_instruments(); param.m_enabled= true; param.m_mutex_class_sizing= 10; @@ -647,8 +666,10 @@ void test_oom() ok(rc == 0, "init statement class"); rc= init_instruments(& param); ok(rc == 1, "oom (global statements)"); - cleanup_instruments(); + + cleanup_sync_class(); cleanup_statement_class(); + cleanup_instruments(); } void do_all_tests() @@ -662,6 +683,6 @@ int main(int argc, char **argv) MY_INIT(argv[0]); do_all_tests(); my_end(0); - return exit_status(); + return (exit_status()); } diff --git a/storage/perfschema/unittest/pfs_instr-t.cc b/storage/perfschema/unittest/pfs_instr-t.cc index c191b3dc41a..659f410e283 100644 --- a/storage/perfschema/unittest/pfs_instr-t.cc +++ b/storage/perfschema/unittest/pfs_instr-t.cc @@ -1,4 +1,4 @@ -/* Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,10 +23,11 @@ #include +PFS_global_param param; + void test_no_instruments() { int rc; - PFS_global_param param; memset(& param, 0xFF, sizeof(param)); param.m_enabled= true; @@ -86,7 +87,6 @@ void test_no_instances() PFS_file *file; PFS_socket *socket; PFS_table *table; - PFS_global_param param; memset(& param, 0xFF, sizeof(param)); param.m_enabled= true; @@ -227,7 +227,6 @@ void test_with_instances() PFS_socket *socket_2; PFS_table *table_1; PFS_table *table_2; - PFS_global_param param; memset(& param, 0xFF, sizeof(param)); param.m_enabled= true; @@ -414,6 +413,6 @@ int main(int argc, char **argv) MY_INIT(argv[0]); do_all_tests(); my_end(0); - return exit_status(); + return (exit_status()); } diff --git a/storage/perfschema/unittest/pfs_instr_class-oom-t.cc b/storage/perfschema/unittest/pfs_instr_class-oom-t.cc index 708e08be6d4..c9b87b9cf1e 100644 --- a/storage/perfschema/unittest/pfs_instr_class-oom-t.cc +++ b/storage/perfschema/unittest/pfs_instr_class-oom-t.cc @@ -1,4 +1,4 @@ -/* Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -64,6 +64,6 @@ int main(int argc, char **argv) MY_INIT(argv[0]); do_all_tests(); my_end(0); - return exit_status(); + return (exit_status()); } diff --git a/storage/perfschema/unittest/pfs_instr_class-t.cc b/storage/perfschema/unittest/pfs_instr_class-t.cc index 19a8989b34e..dcbc3927eae 100644 --- a/storage/perfschema/unittest/pfs_instr_class-t.cc +++ b/storage/perfschema/unittest/pfs_instr_class-t.cc @@ -1,4 +1,4 @@ -/* Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -670,5 +670,5 @@ int main(int argc, char **argv) MY_INIT(argv[0]); do_all_tests(); my_end(0); - return exit_status(); + return (exit_status()); } diff --git a/storage/perfschema/unittest/pfs_misc-t.cc b/storage/perfschema/unittest/pfs_misc-t.cc index a4b11b9a727..eed9039dfb2 100644 --- a/storage/perfschema/unittest/pfs_misc-t.cc +++ b/storage/perfschema/unittest/pfs_misc-t.cc @@ -1,4 +1,4 @@ -/* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -67,6 +67,6 @@ int main(int, char **) MY_INIT("pfs_misc-t"); do_all_tests(); my_end(0); - return exit_status(); + return (exit_status()); } diff --git a/storage/perfschema/unittest/pfs_timer-t.cc b/storage/perfschema/unittest/pfs_timer-t.cc index 8fb3a206ebf..55113860532 100644 --- a/storage/perfschema/unittest/pfs_timer-t.cc +++ b/storage/perfschema/unittest/pfs_timer-t.cc @@ -1,4 +1,4 @@ -/* Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -115,6 +115,6 @@ int main(int, char **) MY_INIT("pfs_timer-t"); do_all_tests(); my_end(0); - return exit_status(); + return (exit_status()); } diff --git a/storage/perfschema/unittest/pfs_user-oom-t.cc b/storage/perfschema/unittest/pfs_user-oom-t.cc index 9fb64d130ae..e153b39cbd2 100644 --- a/storage/perfschema/unittest/pfs_user-oom-t.cc +++ b/storage/perfschema/unittest/pfs_user-oom-t.cc @@ -1,4 +1,4 @@ -/* Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -107,6 +107,6 @@ int main(int, char **) MY_INIT("pfs_user-oom-t"); do_all_tests(); my_end(0); - return exit_status(); + return (exit_status()); } diff --git a/storage/rocksdb/CMakeLists.txt b/storage/rocksdb/CMakeLists.txt index 6308ac2e50f..7ded80107b4 100644 --- a/storage/rocksdb/CMakeLists.txt +++ b/storage/rocksdb/CMakeLists.txt @@ -28,6 +28,13 @@ IF(CMAKE_SYSTEM_PROCESSOR MATCHES "i[36]86") SKIP_ROCKSDB_PLUGIN("Intel 32 bit not supported.") ENDIF() +# Due to retrieved data being incorrect endian +include(TestBigEndian) +test_big_endian(BIG_ENDIAN) +if(BIG_ENDIAN) + SKIP_ROCKSDB_PLUGIN("Big Endian not supported.") +endif() + # # Also, disable building on 32-bit Windows # @@ -104,19 +111,7 @@ IF(NOT TARGET rocksdb) RETURN() ENDIF() -IF(UNIX) - IF(CMAKE_SYSTEM_NAME STREQUAL "Linux") - ADD_DEFINITIONS(-DOS_LINUX) - CHECK_INCLUDE_FILES(linux/falloc.h HAVE_LINUX_FALLOC_H) - - CHECK_FUNCTION_EXISTS(fallocate HAVE_FALLOCATE) - - IF(HAVE_FALLOCATE AND HAVE_LINUX_FALLOC_H) - ADD_DEFINITIONS(-DROCKSDB_FALLOCATE_PRESENT) - ENDIF() - ENDIF() -ENDIF() CHECK_CXX_SOURCE_COMPILES(" #if defined(_MSC_VER) && !defined(__thread) @@ -150,7 +145,12 @@ ADD_CONVENIENCE_LIBRARY(rocksdb_aux_lib ADD_DEPENDENCIES(rocksdb_aux_lib GenError) +# MARIAROCKS-TODO: how to properly depend on -lrt ? TARGET_LINK_LIBRARIES(rocksdb_aux_lib rocksdblib ${ZLIB_LIBRARY}) +if (UNIX AND NOT APPLE) + TARGET_LINK_LIBRARIES(rocksdb_aux_lib -lrt) +endif() + TARGET_LINK_LIBRARIES(rocksdb rocksdb_aux_lib) IF(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") @@ -191,14 +191,10 @@ ENDIF() # ADD_SUBDIRECTORY(unittest) #ENDIF() -CHECK_INCLUDE_FILES(zlib.h HAVE_ZLIB_H) +if (UNIX AND NOT APPLE) + SET(rocksdb_static_libs ${rocksdb_static_libs} "-lrt") +endif() -IF (HAVE_ZLIB_H) - ADD_DEFINITIONS(-DZLIB) - SET(rocksdb_static_libs ${rocksdb_static_libs} ${ZLIB_LIBRARY}) -ENDIF() - -SET(rocksdb_static_libs ${rocksdb_static_libs} "-lrt") ADD_LIBRARY(rocksdb_tools STATIC rocksdb/tools/ldb_tool.cc diff --git a/storage/rocksdb/build_rocksdb.cmake b/storage/rocksdb/build_rocksdb.cmake index 462be5ae242..42ed22b1e17 100644 --- a/storage/rocksdb/build_rocksdb.cmake +++ b/storage/rocksdb/build_rocksdb.cmake @@ -339,6 +339,7 @@ set(ROCKSDB_SOURCES utilities/ttl/db_ttl_impl.cc utilities/write_batch_with_index/write_batch_with_index.cc utilities/write_batch_with_index/write_batch_with_index_internal.cc + ) if(WIN32) diff --git a/storage/rocksdb/ha_rocksdb.cc b/storage/rocksdb/ha_rocksdb.cc index fd6105ae3c2..3e6e56953d5 100644 --- a/storage/rocksdb/ha_rocksdb.cc +++ b/storage/rocksdb/ha_rocksdb.cc @@ -109,6 +109,8 @@ int thd_binlog_format(const MYSQL_THD thd); bool thd_binlog_filter_ok(const MYSQL_THD thd); } +MYSQL_PLUGIN_IMPORT bool my_disable_leak_check; + namespace myrocks { static st_global_stats global_stats; @@ -172,8 +174,10 @@ Rdb_dict_manager dict_manager; Rdb_cf_manager cf_manager; Rdb_ddl_manager ddl_manager; Rdb_binlog_manager binlog_manager; -Rdb_io_watchdog *io_watchdog = nullptr; +#if !defined(_WIN32) && !defined(__APPLE__) +Rdb_io_watchdog *io_watchdog = nullptr; +#endif /** MyRocks background thread control N.B. This is besides RocksDB's own background threads @@ -568,15 +572,18 @@ static void rocksdb_set_io_write_timeout( void *const var_ptr MY_ATTRIBUTE((__unused__)), const void *const save) { DBUG_ASSERT(save != nullptr); DBUG_ASSERT(rdb != nullptr); +#if !defined(_WIN32) && !defined(__APPLE__) DBUG_ASSERT(io_watchdog != nullptr); +#endif RDB_MUTEX_LOCK_CHECK(rdb_sysvars_mutex); const uint32_t new_val = *static_cast(save); rocksdb_io_write_timeout_secs = new_val; +#if !defined(_WIN32) && !defined(__APPLE__) io_watchdog->reset_timeout(rocksdb_io_write_timeout_secs); - +#endif RDB_MUTEX_UNLOCK_CHECK(rdb_sysvars_mutex); } @@ -988,11 +995,10 @@ static MYSQL_SYSVAR_BOOL( static MYSQL_SYSVAR_BOOL( use_direct_io_for_flush_and_compaction, - *reinterpret_cast( - &rocksdb_db_options->use_direct_io_for_flush_and_compaction), + *reinterpret_cast(&rocksdb_db_options->use_direct_io_for_flush_and_compaction), PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, - "DBOptions::use_direct_io_for_flush_and_compaction for RocksDB", nullptr, - nullptr, rocksdb_db_options->use_direct_io_for_flush_and_compaction); + "DBOptions::use_direct_io_for_flush_and_compaction for RocksDB", nullptr, nullptr, + rocksdb_db_options->use_direct_io_for_flush_and_compaction); static MYSQL_SYSVAR_BOOL( allow_mmap_reads, @@ -3367,11 +3373,9 @@ public: return; } - std::string query_str; - LEX_STRING *const lex_str = thd_query_string(thd); - if (lex_str != nullptr && lex_str->str != nullptr) { - query_str = std::string(lex_str->str); - } + char query_buf[NAME_LEN+1]; + thd_query_safe(thd, query_buf, sizeof(query_buf)); + std::string query_str(query_buf); const auto state_it = state_map.find(rdb_trx->GetState()); DBUG_ASSERT(state_it != state_map.end()); @@ -3592,6 +3596,9 @@ static bool rocksdb_show_status(handlerton *const hton, THD *const thd, str, stat_print); } } +#endif + +#ifdef MARIAROCKS_NOT_YET } else if (stat_type == HA_ENGINE_TRX) { /* Handle the SHOW ENGINE ROCKSDB TRANSACTION STATUS command */ res |= rocksdb_show_snapshot_status(hton, thd, stat_print); @@ -4192,6 +4199,13 @@ static int rocksdb_init_func(void *const p) { } #endif + /** + Rocksdb does not always shutdown its threads, when + plugin is shut down. Disable server's leak check + at exit to avoid crash. + */ + my_disable_leak_check = true; + err = my_error_register(rdb_get_error_messages, HA_ERR_ROCKSDB_FIRST, HA_ERR_ROCKSDB_LAST); if (err != 0) { @@ -4201,6 +4215,8 @@ static int rocksdb_init_func(void *const p) { DBUG_RETURN(HA_EXIT_FAILURE); } + + // Creating an instance of HistogramImpl should only happen after RocksDB // has been successfully initialized. commit_latency_stats = new rocksdb::HistogramImpl(); @@ -4217,8 +4233,10 @@ static int rocksdb_init_func(void *const p) { directories.push_back(myrocks::rocksdb_wal_dir); } +#if !defined(_WIN32) && !defined(__APPLE__) io_watchdog = new Rdb_io_watchdog(directories); io_watchdog->reset_timeout(rocksdb_io_write_timeout_secs); +#endif // NO_LINT_DEBUG sql_print_information("MyRocks storage engine plugin has been successfully " @@ -4307,8 +4325,10 @@ static int rocksdb_done_func(void *const p) { delete commit_latency_stats; commit_latency_stats = nullptr; +#if !defined(_WIN32) && !defined(__APPLE__) delete io_watchdog; io_watchdog = nullptr; +#endif // Disown the cache data since we're shutting down. // This results in memory leaks but it improved the shutdown time. @@ -9747,6 +9767,7 @@ const char *ha_rocksdb::thd_rocksdb_tmpdir() { return (tmp_dir); } + /** @return HA_EXIT_SUCCESS OK @@ -9760,9 +9781,27 @@ int ha_rocksdb::external_lock(THD *const thd, int lock_type) { int res = HA_EXIT_SUCCESS; int binlog_format = my_core::thd_binlog_format(thd); bool unsafe_for_binlog = THDVAR(ha_thd(), unsafe_for_binlog); + + /* + A note about (*) below: In fb/mysql, LOCK TABLE myrocks_table WRITE + - produces an error when @@binlog_format='ROW'. + - does not produce an error with @@binlog_format='STATEMENT' + + We cannot easily provide this behavior in MariaDB, because LOCK ROWS + changes @@binlog_format for the duration of the statement. + + Instead we will make the check in ha_rocksdb::start_stmt and will produce + an error in the first DML statement done under LOCK TABLE + + (**) - The same happens for other "DDL-type" commands, so allow them here + as well. + */ if (lock_type == F_WRLCK && !thd->rgi_slave && !unsafe_for_binlog && binlog_format != BINLOG_FORMAT_ROW && binlog_format != BINLOG_FORMAT_UNSPEC && + thd->lex->sql_command != SQLCOM_LOCK_TABLES && // (*) + thd->lex->sql_command != SQLCOM_ANALYZE && // (**) + thd->lex->sql_command != SQLCOM_OPTIMIZE && // (**) my_core::thd_binlog_filter_ok(thd)) { my_error(ER_REQUIRE_ROW_BINLOG_FORMAT, MYF(0)); DBUG_RETURN(HA_ERR_UNSUPPORTED); @@ -9860,6 +9899,20 @@ int ha_rocksdb::external_lock(THD *const thd, int lock_type) { int ha_rocksdb::start_stmt(THD *const thd, thr_lock_type lock_type) { DBUG_ENTER_FUNC(); + /* + MariaDB: the following is a copy of the check in ha_rocksdb::external_lock: + */ + int binlog_format = my_core::thd_binlog_format(thd); + bool unsafe_for_binlog = THDVAR(ha_thd(), unsafe_for_binlog); + if (lock_type >= TL_WRITE_ALLOW_WRITE && + !thd->rgi_slave && !unsafe_for_binlog && + binlog_format != BINLOG_FORMAT_ROW && + binlog_format != BINLOG_FORMAT_UNSPEC && + my_core::thd_binlog_filter_ok(thd)) { + my_error(ER_REQUIRE_ROW_BINLOG_FORMAT, MYF(0)); + DBUG_RETURN(HA_ERR_UNSUPPORTED); + } + DBUG_ASSERT(thd != nullptr); Rdb_transaction *const tx = get_or_create_tx(thd); @@ -11044,7 +11097,7 @@ int ha_rocksdb::inplace_populate_sk( print_keydup_error(new_table_arg, &new_table_arg->key_info[index->get_keyno()], - MYF(0), ha_thd()); + MYF(0)); DBUG_RETURN(ER_DUP_ENTRY); } } @@ -12041,7 +12094,14 @@ void rocksdb_set_bulk_load(THD *const thd, struct st_mysql_sys_var *const var sql_print_error("RocksDB: Error %d finalizing last SST file while " "setting bulk loading variable", rc); - abort_with_stack_traces(); + /* + MariaDB doesn't do the following: + abort_with_stack_traces(); + because it doesn't seem a good idea to crash a server when a user makes + a mistake. + Instead, we return an error to the user. The error has already been + produced inside ha_rocksdb::finalize_bulk_load(). + */ } } diff --git a/storage/rocksdb/mysql-test/rocksdb/include/deadlock_stats.inc b/storage/rocksdb/mysql-test/rocksdb/include/deadlock_stats.inc new file mode 100644 index 00000000000..48ef6f816bd --- /dev/null +++ b/storage/rocksdb/mysql-test/rocksdb/include/deadlock_stats.inc @@ -0,0 +1,52 @@ +let $prior_set_lwt = `select concat('set @prior_lock_wait_timeout = @@', + '$engine', '_lock_wait_timeout;')`; +let $prior_set_dld = `select concat('set @prior_deadlock_detect = @@', + '$engine', '_deadlock_detect;')`; +let $global_dld = `select concat('set global ', '$engine', + '_deadlock_detect = on;')`; +let $global_lwt = `select concat('set global ', '$engine', + '_lock_wait_timeout = 100000;')`; +eval $prior_set_lwt $prior_set_dld $global_dld $global_lwt; + +--source include/count_sessions.inc +connect (con1,localhost,root,,); +let $con1= `SELECT CONNECTION_ID()`; + +connect (con2,localhost,root,,); +let $con2= `SELECT CONNECTION_ID()`; + +connection default; +eval create table t (i int primary key) engine=$engine; +insert into t values (1), (2), (3); + +--echo # +--echo # The following is disabled due: +--echo # MDEV-13404: MyRocks upstream uses I_S.table_statistics.row_lock_deadlocks, should we import? +--echo # +--disable_parsing +--source include/simple_deadlock.inc +connection default; +select row_lock_deadlocks from information_schema.table_statistics where +table_name = "t"; + +select row_lock_deadlocks from information_schema.table_statistics where +table_name = "t"; +--source include/simple_deadlock.inc +connection default; +select row_lock_deadlocks from information_schema.table_statistics where +table_name = "t"; + +select row_lock_deadlocks from information_schema.table_statistics where +table_name = "t"; +--enable_parsing + +disconnect con1; +disconnect con2; + +let $restore_lwt = `select concat('set global ', '$engine', + '_lock_wait_timeout = @prior_lock_wait_timeout;')`; +let $restore_dld = `select concat('set global ', '$engine', + '_deadlock_detect = @prior_deadlock_detect;')`; +eval $restore_lwt $restore_dld; +drop table t; +--source include/wait_until_count_sessions.inc diff --git a/storage/rocksdb/mysql-test/rocksdb/include/index_merge1.inc b/storage/rocksdb/mysql-test/rocksdb/include/index_merge1.inc new file mode 100644 index 00000000000..91bcc68adb4 --- /dev/null +++ b/storage/rocksdb/mysql-test/rocksdb/include/index_merge1.inc @@ -0,0 +1,850 @@ +# include/index_merge1.inc +# +# Index merge tests +# +# The variables +# $engine_type -- storage engine to be tested +# $merge_table_support -- 1 storage engine supports merge tables +# -- 0 storage engine does not support merge tables +# have to be set before sourcing this script. +# +# Note: The comments/expectations refer to MyISAM. +# They might be not valid for other storage engines. +# +# Last update: +# 2006-08-02 ML test refactored +# old name was t/index_merge.test +# main code went into include/index_merge1.inc +# + +--echo #---------------- Index merge test 1 ------------------------------------------- + +eval SET SESSION DEFAULT_STORAGE_ENGINE = $engine_type; + +--disable_warnings +drop table if exists t0, t1, t2, t3, t4; +--enable_warnings + +# Create and fill a table with simple keys +create table t0 +( + key1 int not null, + key2 int not null, + key3 int not null, + key4 int not null, + key5 int not null, + key6 int not null, + key7 int not null, + key8 int not null, + INDEX i1(key1), + INDEX i2(key2), + INDEX i3(key3), + INDEX i4(key4), + INDEX i5(key5), + INDEX i6(key6), + INDEX i7(key7), + INDEX i8(key8) +); + +--disable_query_log +insert into t0 values (1,1,1,1,1,1,1,1023),(2,2,2,2,2,2,2,1022); + +let $1=9; +set @d=2; +while ($1) +{ + eval insert into t0 select key1+@d, key2+@d, key3+@d, key4+@d, key5+@d, + key6+@d, key7+@d, key8-@d from t0; + eval set @d=@d*2; + dec $1; +} +--enable_query_log + +analyze table t0; + +# 1. One index +explain select * from t0 where key1 < 3 or key1 > 1020; + +# 2. Simple cases +explain +select * from t0 where key1 < 3 or key2 > 1020; +select * from t0 where key1 < 3 or key2 > 1020; + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 where key1 < 2 or key2 <3; + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain +select * from t0 where (key1 > 30 and key1<35) or (key2 >32 and key2 < 40); +# Bug#21277: InnoDB, wrong result set, index_merge strategy, second index not evaluated +select * from t0 where (key1 > 30 and key1<35) or (key2 >32 and key2 < 40); + +# 3. Check that index_merge doesn't break "ignore/force/use index" +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 ignore index (i2) where key1 < 3 or key2 <4; + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 where (key1 < 3 or key2 <4) and key3 = 50; + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 use index (i1,i2) where (key1 < 2 or key2 <3) and key3 = 50; + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 where (key1 > 1 or key2 > 2); + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 force index (i1,i2) where (key1 > 1 or key2 > 2); + + +# 4. Check if conjuncts are grouped by keyuse +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain + select * from t0 where key1<2 or key2<3 or (key1>5 and key1<7) or + (key1>10 and key1<12) or (key2>100 and key2<102); + +# 5. Check index_merge with conjuncts that are always true/false +# verify fallback to "range" if there is only one non-confluent condition +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 where key2 = 45 or key1 <=> null; + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 where key2 = 45 or key1 is not null; + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 where key2 = 45 or key1 is null; + +# the last conj. is always false and will be discarded +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 where key2=10 or key3=3 or key4 <=> null; + +# the last conj. is always true and will cause 'all' scan +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 where key2=10 or key3=3 or key4 is null; + +# some more complicated cases + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select key1 from t0 where (key1 <=> null) or (key2 < 2) or + (key3=10) or (key4 <=> null); + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select key1 from t0 where (key1 <=> null) or (key1 < 5) or + (key3=10) or (key4 <=> null); + +# 6.Several ways to do index_merge, (ignored) index_merge vs. range +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 where + (key1 < 2 or key2 < 2) and (key3 < 3 or key4 < 3) and (key5 < 5 or key6 < 5); + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain +select * from t0 where (key1 < 2 or key2 < 4) and (key1 < 5 or key3 < 3); + +select * from t0 where (key1 < 2 or key2 < 4) and (key1 < 5 or key3 < 3); + + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 where + (key1 < 3 or key2 < 2) and (key3 < 3 or key4 < 3) and (key5 < 2 or key6 < 2); + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 where + (key1 < 3 or key2 < 3) and (key3 < 70); + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 where + (key1 < 3 or key2 < 3) and (key3 < 1000); + + +# 7. Complex cases +# tree_or(List, range SEL_TREE). +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 where + ((key1 < 3 or key2 < 3) and (key2 <4 or key3 < 3)) + or + key2 > 4; + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 where + ((key1 < 4 or key2 < 4) and (key2 <4 or key3 < 3)) + or + key1 < 5; + +select * from t0 where + ((key1 < 4 or key2 < 4) and (key2 <4 or key3 < 3)) + or + key1 < 5; + +# tree_or(List, List). +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 where + ((key1 < 2 or key2 < 2) and (key3 <4 or key5 < 3)) + or + ((key5 < 3 or key6 < 3) and (key7 <3 or key8 < 3)); + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 where + ((key3 <3 or key5 < 4) and (key1 < 3 or key2 < 3)) + or + ((key7 <5 or key8 < 3) and (key5 < 4 or key6 < 4)); + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 where + ((key3 <3 or key5 < 4) and (key1 < 3 or key2 < 4)) + or + ((key3 <4 or key5 < 2) and (key5 < 5 or key6 < 3)); + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 where + ((key3 <4 or key5 < 3) and (key1 < 3 or key2 < 3)) + or + (((key3 <5 and key7 < 5) or key5 < 2) and (key5 < 4 or key6 < 4)); + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 where + ((key3 <5 or key5 < 4) and (key1 < 4 or key2 < 4)) + or + ((key3 >5 or key5 < 2) and (key5 < 5 or key6 < 6)); + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 force index(i1, i2, i3, i4, i5, i6 ) where + ((key3 <3 or key5 < 4) and (key1 < 3 or key2 < 3)) + or + ((key3 >4 or key5 < 2) and (key5 < 5 or key6 < 4)); + +# Can't merge any indexes here (predicate on key3 is always true) +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 force index(i1, i2, i3, i4, i5, i6 ) where + ((key3 <5 or key5 < 4) and (key1 < 4 or key2 < 4)) + or + ((key3 >=5 or key5 < 2) and (key5 < 5 or key6 < 6)); + +# 8. Verify that "order by" after index merge uses filesort +select * from t0 where key1 < 3 or key8 < 2 order by key1; + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain +select * from t0 where key1 < 3 or key8 < 2 order by key1; + +# 9. Check that index_merge cost is compared to 'index' where possible +create table t2 like t0; +insert into t2 select * from t0; + +alter table t2 add index i1_3(key1, key3); +alter table t2 add index i2_3(key2, key3); +alter table t2 drop index i1; +alter table t2 drop index i2; +alter table t2 add index i321(key3, key2, key1); + +-- disable_query_log +-- disable_result_log +analyze table t2; +-- enable_result_log +-- enable_query_log + +# index_merge vs 'index', index_merge is better. +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select key3 from t2 where key1 = 100 or key2 = 100; + +# index_merge vs 'index', 'index' is better. +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select key3 from t2 where key1 <100 or key2 < 100; + +# index_merge vs 'all', index_merge is better. +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select key7 from t2 where key1 <100 or key2 < 100; + +# 10. Multipart keys. +create table t4 ( + key1a int not null, + key1b int not null, + key2 int not null, + key2_1 int not null, + key2_2 int not null, + key3 int not null, + index i1a (key1a, key1b), + index i1b (key1b, key1a), + index i2_1(key2, key2_1), + index i2_2(key2, key2_1) +); + +insert into t4 select key1,key1,key1 div 10, key1 % 10, key1 % 10, key1 from t0; + +-- disable_query_log +-- disable_result_log +analyze table t4; +-- enable_result_log +-- enable_query_log + +# the following will be handled by index_merge: +select * from t4 where key1a = 3 or key1b = 4; +explain select * from t4 where key1a = 3 or key1b = 4; + +# and the following will not +explain select * from t4 where key2 = 1 and (key2_1 = 1 or key3 = 5); + +explain select * from t4 where key2 = 1 and (key2_1 = 1 or key2_2 = 5); + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t4 where key2_1 = 1 or key2_2 = 5; + + +# 11. Multitable selects +create table t1 like t0; +insert into t1 select * from t0; + +-- disable_query_log +-- disable_result_log +analyze table t1; +-- enable_result_log +-- enable_query_log + +# index_merge on first table in join +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0 left join t1 on (t0.key1=t1.key1) + where t0.key1=3 or t0.key2=4; + +select * from t0 left join t1 on (t0.key1=t1.key1) + where t0.key1=3 or t0.key2=4; + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain +select * from t0,t1 where (t0.key1=t1.key1) and ( t0.key1=3 or t0.key2=4); + +# index_merge vs. ref +if (!$index_merge_random_rows_in_EXPLAIN) +{ +#this plan varies too much for InnoDB +explain +select * from t0,t1 where (t0.key1=t1.key1) and + (t0.key1=3 or t0.key2=4) and t1.key1<200; +} + +# index_merge vs. ref +explain +select * from t0,t1 where (t0.key1=t1.key1) and + (t0.key1=3 or t0.key2<4) and t1.key1=2; + +# index_merge on second table in join +explain select * from t0,t1 where t0.key1 = 5 and + (t1.key1 = t0.key1 or t1.key8 = t0.key1); + +# Fix for bug#1974 +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t0,t1 where t0.key1 < 3 and + (t1.key1 = t0.key1 or t1.key8 = t0.key1); + +# index_merge inside union +explain select * from t1 where key1=3 or key2=4 + union select * from t1 where key1<4 or key3=5; + +# index merge in subselect +explain select * from (select * from t1 where key1 = 3 or key2 =3) as Z where key8 >5; + +# 12. check for long index_merges. +create table t3 like t0; +insert into t3 select * from t0; +alter table t3 add key9 int not null, add index i9(key9); +alter table t3 add keyA int not null, add index iA(keyA); +alter table t3 add keyB int not null, add index iB(keyB); +alter table t3 add keyC int not null, add index iC(keyC); +update t3 set key9=key1,keyA=key1,keyB=key1,keyC=key1; + +-- disable_query_log +-- disable_result_log +analyze table t3; +-- enable_result_log +-- enable_query_log + +explain select * from t3 where + key1=1 or key2=2 or key3=3 or key4=4 or + key5=5 or key6=6 or key7=7 or key8=8 or + key9=9 or keyA=10 or keyB=11 or keyC=12; + +select * from t3 where + key1=1 or key2=2 or key3=3 or key4=4 or + key5=5 or key6=6 or key7=7 or key8=8 or + key9=9 or keyA=10 or keyB=11 or keyC=12; + +# Test for Bug#3183 +explain select * from t0 where key1 < 3 or key2 < 4; +# Bug#21277: InnoDB, wrong result set, index_merge strategy, second index not evaluated +select * from t0 where key1 < 3 or key2 < 4; + +update t0 set key8=123 where key1 < 3 or key2 < 4; + +-- disable_query_log +-- disable_result_log +analyze table t0; +-- enable_result_log +-- enable_query_log + +# Bug#21277: InnoDB, wrong result set, index_merge strategy, second index not evaluated +select * from t0 where key1 < 3 or key2 < 4; + +delete from t0 where key1 < 3 or key2 < 4; +-- disable_query_log +-- disable_result_log +analyze table t0; +-- enable_result_log +-- enable_query_log + +select * from t0 where key1 < 3 or key2 < 4; +select count(*) from t0; + +# Test for BUG#4177 +drop table t4; +create table t4 (a int); +insert into t4 values (1),(4),(3); +-- disable_query_log +-- disable_result_log +analyze table t4; +-- enable_result_log +-- enable_query_log + +set @save_join_buffer_size=@@join_buffer_size; +set join_buffer_size= 4096; + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) + from t0 as A force index(i1,i2), t0 as B force index (i1,i2) + where (A.key1 < 500000 or A.key2 < 3) + and (B.key1 < 500000 or B.key2 < 3); + +select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) + from t0 as A force index(i1,i2), t0 as B force index (i1,i2) + where (A.key1 < 500000 or A.key2 < 3) + and (B.key1 < 500000 or B.key2 < 3); + +update t0 set key1=1; +-- disable_query_log +-- disable_result_log +analyze table t0; +-- enable_result_log +-- enable_query_log + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) + from t0 as A force index(i1,i2), t0 as B force index (i1,i2) + where (A.key1 = 1 or A.key2 = 1) + and (B.key1 = 1 or B.key2 = 1); + +select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) + from t0 as A force index(i1,i2), t0 as B force index (i1,i2) + where (A.key1 = 1 or A.key2 = 1) + and (B.key1 = 1 or B.key2 = 1); + +alter table t0 add filler1 char(200), add filler2 char(200), add filler3 char(200); +update t0 set key2=1, key3=1, key4=1, key5=1,key6=1,key7=1 where key7 < 500; + +-- disable_query_log +-- disable_result_log +analyze table t0; +-- enable_result_log +-- enable_query_log + +# The next query will not use index i7 in intersection if the OS doesn't +# support file sizes > 2GB. (ha_myisam::ref_length depends on this and index +# scan cost estimates depend on ha_myisam::ref_length) +if (!$index_merge_random_rows_in_EXPLAIN) +{ + # Too unstable for innodb + --replace_column 9 # + --replace_result "4,4,4,4,4,4,4" X "4,4,4,4,4,4" X "i6,i7" "i6,i7?" "i6" "i6,i7?" + explain select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) + from t0 as A, t0 as B + where (A.key1 = 1 and A.key2 = 1 and A.key3 = 1 and A.key4=1 and A.key5=1 and A.key6=1 and A.key7 = 1 or A.key8=1) + and (B.key1 = 1 and B.key2 = 1 and B.key3 = 1 and B.key4=1 and B.key5=1 and B.key6=1 and B.key7 = 1 or B.key8=1); +} +select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) + from t0 as A, t0 as B + where (A.key1 = 1 and A.key2 = 1 and A.key3 = 1 and A.key4=1 and A.key5=1 and A.key6=1 and A.key7 = 1 or A.key8=1) + and (B.key1 = 1 and B.key2 = 1 and B.key3 = 1 and B.key4=1 and B.key5=1 and B.key6=1 and B.key7 = 1 or B.key8=1); + +set join_buffer_size= @save_join_buffer_size; +# Test for BUG#4177 ends + +drop table t0, t1, t2, t3, t4; + +# BUG#16166 +CREATE TABLE t1 ( + cola char(3) not null, colb char(3) not null, filler char(200), + key(cola), key(colb) +); +INSERT INTO t1 VALUES ('foo','bar', 'ZZ'),('fuz','baz', 'ZZ'); + +--disable_query_log +let $1=9; +while ($1) +{ + eval INSERT INTO t1 SELECT * from t1 WHERE cola = 'foo'; + dec $1; +} + +let $1=13; +while ($1) +{ + eval INSERT INTO t1 SELECT * from t1 WHERE cola <> 'foo'; + dec $1; +} + +--enable_query_log + +OPTIMIZE TABLE t1; +select count(*) from t1; + +-- disable_query_log +-- disable_result_log +analyze table t1; +-- enable_result_log +-- enable_query_log + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t1 WHERE cola = 'foo' AND colb = 'bar'; + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t1 force index(cola,colb) WHERE cola = 'foo' AND colb = 'bar'; +drop table t1; + +if ($merge_table_support) +{ +# +# BUG#17314: Index_merge/intersection not choosen by the optimizer for MERGE tables +# +create table t0 (a int); +insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); +create table t1 ( + a int, b int, + filler1 char(200), filler2 char(200), + key(a),key(b) +); +insert into t1 select @v:= A.a, @v, 't1', 'filler2' from t0 A, t0 B, t0 C; +create table t2 like t1; + +create table t3 ( + a int, b int, + filler1 char(200), filler2 char(200), + key(a),key(b) +) engine=merge union=(t1,t2); + +-- disable_query_log +-- disable_result_log +analyze table t0; +analyze table t1; +analyze table t2; +analyze table t3; +-- enable_result_log +-- enable_query_log + +--replace_column 9 # +explain select * from t1 where a=1 and b=1; +--replace_column 9 # +explain select * from t3 where a=1 and b=1; + +drop table t3; +drop table t0, t1, t2; +} + +# +# BUG#20256 - LOCK WRITE - MyISAM +# +CREATE TABLE t1(a INT); +INSERT INTO t1 VALUES(1); +CREATE TABLE t2(a INT, b INT, dummy CHAR(16) DEFAULT '', KEY(a), KEY(b)); +INSERT INTO t2(a,b) VALUES +(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), +(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), +(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), +(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), +(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), +(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), +(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), +(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), +(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), +(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), +(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), +(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), +(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), +(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), +(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), +(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), +(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), +(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), +(1,2); +LOCK TABLES t1 WRITE, t2 WRITE; +INSERT INTO t2(a,b) VALUES(1,2); +SELECT t2.a FROM t1,t2 WHERE t2.b=2 AND t2.a=1; +UNLOCK TABLES; +DROP TABLE t1, t2; + +# +# BUG#29740: HA_KEY_SCAN_NOT_ROR wasn't set for HEAP engine +# +CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `filler` char(200) DEFAULT NULL, + `b` int(11) DEFAULT NULL, + KEY `a` (`a`), + KEY `b` (`b`) +) ENGINE=MEMORY DEFAULT CHARSET=latin1; + +insert into t1 values +(0, 'filler', 0), (1, 'filler', 1), (2, 'filler', 2), (3, 'filler', 3), +(4, 'filler', 4), (5, 'filler', 5), (6, 'filler', 6), (7, 'filler', 7), +(8, 'filler', 8), (9, 'filler', 9), (0, 'filler', 0), (1, 'filler', 1), +(2, 'filler', 2), (3, 'filler', 3), (4, 'filler', 4), (5, 'filler', 5), +(6, 'filler', 6), (7, 'filler', 7), (8, 'filler', 8), (9, 'filler', 9), +(10, 'filler', 10), (11, 'filler', 11), (12, 'filler', 12), (13, 'filler', 13), +(14, 'filler', 14), (15, 'filler', 15), (16, 'filler', 16), (17, 'filler', 17), +(18, 'filler', 18), (19, 'filler', 19), (4, '5 ', 0), (5, '4 ', 0), +(4, '4 ', 0), (4, 'qq ', 5), (5, 'qq ', 4), (4, 'zz ', 4); + +create table t2( + `a` int(11) DEFAULT NULL, + `filler` char(200) DEFAULT NULL, + `b` int(11) DEFAULT NULL, + KEY USING BTREE (`a`), + KEY USING BTREE (`b`) +) ENGINE=MEMORY DEFAULT CHARSET=latin1; +insert into t2 select * from t1; + +-- disable_query_log +-- disable_result_log +analyze table t1; +analyze table t2; +-- enable_result_log +-- enable_query_log + +--echo must use sort-union rather than union: +--replace_column 9 # +explain select * from t1 where a=4 or b=4; +--sorted_result +select * from t1 where a=4 or b=4; +--sorted_result +select * from t1 ignore index(a,b) where a=4 or b=4; + +--echo must use union, not sort-union: +--replace_column 9 # +explain select * from t2 where a=4 or b=4; +--sorted_result +select * from t2 where a=4 or b=4; + +drop table t1, t2; + +# +# Bug #37943: Reproducible mysqld crash/sigsegv in sel_trees_can_be_ored +# + +CREATE TABLE t1 (a varchar(8), b set('a','b','c','d','e','f','g','h'), + KEY b(b), KEY a(a)); +INSERT INTO t1 VALUES ('y',''), ('z',''); + +#should not crash +SELECT b,a from t1 WHERE (b!='c' AND b!='f' && b!='h') OR + (a='pure-S') OR (a='DE80337a') OR (a='DE80799'); + +DROP TABLE t1; + +--echo # +--echo # BUG#40974: Incorrect query results when using clause evaluated using range check +--echo # +create table t0 (a int); +insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); + +create table t1 (a int); +insert into t1 values (1),(2); +create table t2(a int, b int); +insert into t2 values (1,1), (2, 1000); +create table t3 (a int, b int, filler char(100), key(a), key(b)); + +insert into t3 select 1000, 1000,'filler' from t0 A, t0 B, t0 C; +insert into t3 values (1,1,'data'); +insert into t3 values (1,1,'data'); +-- echo The plan should be ALL/ALL/ALL(Range checked for each record (index map: 0x3) + +-- disable_query_log +-- disable_result_log +analyze table t0; +analyze table t1; +analyze table t2; +analyze table t3; +-- enable_result_log +-- enable_query_log + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t1 +where exists (select 1 from t2, t3 + where t2.a=t1.a and (t3.a=t2.b or t3.b=t2.b or t3.b=t2.b+1)); + +select * from t1 +where exists (select 1 from t2, t3 + where t2.a=t1.a and (t3.a=t2.b or t3.b=t2.b or t3.b=t2.b+1)); + +drop table t0, t1, t2, t3; + +--echo # +--echo # BUG#44810: index merge and order by with low sort_buffer_size +--echo # crashes server! +--echo # +CREATE TABLE t1(a VARCHAR(128),b VARCHAR(128),KEY(A),KEY(B)); +INSERT INTO t1 VALUES (REPEAT('a',128),REPEAT('b',128)); +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +-- disable_query_log +-- disable_result_log +analyze table t1; +-- enable_result_log +-- enable_query_log + +# Causes "out of sort memory" error in MariaDB: +#SET SESSION sort_buffer_size=1; + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +EXPLAIN +SELECT * FROM t1 FORCE INDEX(a,b) WHERE a LIKE 'a%' OR b LIKE 'b%' + ORDER BY a,b; + +# we don't actually care about the result : we're checking if it crashes +--disable_result_log +SELECT * FROM t1 FORCE INDEX(a,b) WHERE a LIKE 'a%' OR b LIKE 'b%' + ORDER BY a,b; +--enable_result_log + +SET SESSION sort_buffer_size=DEFAULT; +DROP TABLE t1; + + +--echo End of 5.0 tests diff --git a/storage/rocksdb/mysql-test/rocksdb/include/index_merge2.inc b/storage/rocksdb/mysql-test/rocksdb/include/index_merge2.inc new file mode 100644 index 00000000000..9fd2390c401 --- /dev/null +++ b/storage/rocksdb/mysql-test/rocksdb/include/index_merge2.inc @@ -0,0 +1,492 @@ +# include/index_merge2.inc +# +# Index merge tests +# +# The variable +# $engine_type -- storage engine to be tested +# has to be set before sourcing this script. +# +# Note: The comments/expectations refer to InnoDB. +# They might be not valid for other storage engines. +# +# Last update: +# 2006-08-02 ML test refactored +# old name was t/index_merge_innodb.test +# main code went into include/index_merge2.inc +# + +--echo #---------------- Index merge test 2 ------------------------------------------- + +eval SET SESSION DEFAULT_STORAGE_ENGINE = $engine_type; + +--disable_warnings +drop table if exists t1,t2; +--enable_warnings + +create table t1 +( + key1 int not null, + key2 int not null, + + INDEX i1(key1), + INDEX i2(key2) +); + +--disable_query_log +let $1=200; +while ($1) +{ + eval insert into t1 values (200-$1, $1); + dec $1; +} +--enable_query_log + +-- disable_query_log +-- disable_result_log +analyze table t1; +-- enable_result_log +-- enable_query_log + +# No primary key +explain select * from t1 where key1 < 5 or key2 > 197; + +select * from t1 where key1 < 5 or key2 > 197; + +explain select * from t1 where key1 < 3 or key2 > 195; +select * from t1 where key1 < 3 or key2 > 195; + +# Primary key as case-sensitive string with \0s. +# also make primary key be longer then max. index length of MyISAM. +alter table t1 add str1 char (255) not null, + add zeroval int not null default 0, + add str2 char (255) not null, + add str3 char (255) not null; + +update t1 set str1='aaa', str2='bbb', str3=concat(key2, '-', key1 div 2, '_' ,if(key1 mod 2 = 0, 'a', 'A')); + +alter table t1 add primary key (str1, zeroval, str2, str3); + +-- disable_query_log +-- disable_result_log +analyze table t1; +-- enable_result_log +-- enable_query_log + +explain select * from t1 where key1 < 5 or key2 > 197; + +select * from t1 where key1 < 5 or key2 > 197; + +explain select * from t1 where key1 < 3 or key2 > 195; +select * from t1 where key1 < 3 or key2 > 195; + +# Test for BUG#5401 +drop table t1; +create table t1 ( + pk integer not null auto_increment primary key, + key1 integer, + key2 integer not null, + filler char (200), + index (key1), + index (key2) +); +show warnings; +--disable_query_log +let $1=30; +while ($1) +{ + eval insert into t1 (key1, key2, filler) values ($1/4, $1/8, 'filler-data'); + dec $1; +} +--enable_query_log + +-- disable_query_log +-- disable_result_log +analyze table t1; +-- enable_result_log +-- enable_query_log + +explain select pk from t1 where key1 = 1 and key2 = 1; +select pk from t1 where key2 = 1 and key1 = 1; +select pk from t1 ignore index(key1,key2) where key2 = 1 and key1 = 1; + +# More tests for BUG#5401. +drop table t1; +create table t1 ( + pk int primary key auto_increment, + key1a int, + key2a int, + key1b int, + key2b int, + dummy1 int, + dummy2 int, + dummy3 int, + dummy4 int, + key3a int, + key3b int, + filler1 char (200), + index i1(key1a, key1b), + index i2(key2a, key2b), + index i3(key3a, key3b) +); + +create table t2 (a int); +insert into t2 values (0),(1),(2),(3),(4),(NULL); + +insert into t1 (key1a, key1b, key2a, key2b, key3a, key3b) + select A.a, B.a, C.a, D.a, C.a, D.a from t2 A,t2 B,t2 C, t2 D; +insert into t1 (key1a, key1b, key2a, key2b, key3a, key3b) + select key1a, key1b, key2a, key2b, key3a, key3b from t1; +insert into t1 (key1a, key1b, key2a, key2b, key3a, key3b) + select key1a, key1b, key2a, key2b, key3a, key3b from t1; +analyze table t1; +select count(*) from t1; + +-- disable_query_log +-- disable_result_log +analyze table t2; +-- enable_result_log +-- enable_query_log + +if (!$skip_ror_EXPLAIN_for_MyRocks) +{ +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select count(*) from t1 where + key1a = 2 and key1b is null and key2a = 2 and key2b is null; +} + +select count(*) from t1 where + key1a = 2 and key1b is null and key2a = 2 and key2b is null; + +if (!$skip_ror_EXPLAIN_for_MyRocks) +{ +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select count(*) from t1 where + key1a = 2 and key1b is null and key3a = 2 and key3b is null; +} + +select count(*) from t1 where + key1a = 2 and key1b is null and key3a = 2 and key3b is null; + +drop table t1,t2; + +# Test for BUG#8441 +create table t1 ( + id1 int, + id2 date , + index idx2 (id1,id2), + index idx1 (id2) +); +insert into t1 values(1,'20040101'), (2,'20040102'); +select * from t1 where id1 = 1 and id2= '20040101'; +drop table t1; + +# Test for BUG#12720 +--disable_warnings +drop view if exists v1; +--enable_warnings +CREATE TABLE t1 ( + `oid` int(11) unsigned NOT NULL auto_increment, + `fk_bbk_niederlassung` int(11) unsigned NOT NULL, + `fk_wochentag` int(11) unsigned NOT NULL, + `uhrzeit_von` time NOT NULL COMMENT 'HH:MM', + `uhrzeit_bis` time NOT NULL COMMENT 'HH:MM', + `geloescht` tinyint(4) NOT NULL, + `version` int(5) NOT NULL, + PRIMARY KEY (`oid`), + KEY `fk_bbk_niederlassung` (`fk_bbk_niederlassung`), + KEY `fk_wochentag` (`fk_wochentag`), + KEY `ix_version` (`version`) +) DEFAULT CHARSET=latin1; + +insert into t1 values +(1, 38, 1, '08:00:00', '13:00:00', 0, 1), +(2, 38, 2, '08:00:00', '13:00:00', 0, 1), +(3, 38, 3, '08:00:00', '13:00:00', 0, 1), +(4, 38, 4, '08:00:00', '13:00:00', 0, 1), +(5, 38, 5, '08:00:00', '13:00:00', 0, 1), +(6, 38, 5, '08:00:00', '13:00:00', 1, 2), +(7, 38, 3, '08:00:00', '13:00:00', 1, 2), +(8, 38, 1, '08:00:00', '13:00:00', 1, 2), +(9, 38, 2, '08:00:00', '13:00:00', 1, 2), +(10, 38, 4, '08:00:00', '13:00:00', 1, 2), +(11, 38, 1, '08:00:00', '13:00:00', 0, 3), +(12, 38, 2, '08:00:00', '13:00:00', 0, 3), +(13, 38, 3, '08:00:00', '13:00:00', 0, 3), +(14, 38, 4, '08:00:00', '13:00:00', 0, 3), +(15, 38, 5, '08:00:00', '13:00:00', 0, 3), +(16, 38, 4, '08:00:00', '13:00:00', 0, 4), +(17, 38, 5, '08:00:00', '13:00:00', 0, 4), +(18, 38, 1, '08:00:00', '13:00:00', 0, 4), +(19, 38, 2, '08:00:00', '13:00:00', 0, 4), +(20, 38, 3, '08:00:00', '13:00:00', 0, 4), +(21, 7, 1, '08:00:00', '13:00:00', 0, 1), +(22, 7, 2, '08:00:00', '13:00:00', 0, 1), +(23, 7, 3, '08:00:00', '13:00:00', 0, 1), +(24, 7, 4, '08:00:00', '13:00:00', 0, 1), +(25, 7, 5, '08:00:00', '13:00:00', 0, 1); + +create view v1 as +select + zeit1.oid AS oid, + zeit1.fk_bbk_niederlassung AS fk_bbk_niederlassung, + zeit1.fk_wochentag AS fk_wochentag, + zeit1.uhrzeit_von AS uhrzeit_von, + zeit1.uhrzeit_bis AS uhrzeit_bis, + zeit1.geloescht AS geloescht, + zeit1.version AS version +from + t1 zeit1 +where +(zeit1.version = + (select max(zeit2.version) AS `max(version)` + from t1 zeit2 + where + ((zeit1.fk_bbk_niederlassung = zeit2.fk_bbk_niederlassung) and + (zeit1.fk_wochentag = zeit2.fk_wochentag) and + (zeit1.uhrzeit_von = zeit2.uhrzeit_von) and + (zeit1.uhrzeit_bis = zeit2.uhrzeit_bis) + ) + ) +) +and (zeit1.geloescht = 0); + +select * from v1 where oid = 21; +drop view v1; +drop table t1; +## +CREATE TABLE t1( + t_cpac varchar(2) NOT NULL, + t_vers varchar(4) NOT NULL, + t_rele varchar(2) NOT NULL, + t_cust varchar(4) NOT NULL, + filler1 char(250) default NULL, + filler2 char(250) default NULL, + PRIMARY KEY (t_cpac,t_vers,t_rele,t_cust), + UNIQUE KEY IX_4 (t_cust,t_cpac,t_vers,t_rele), + KEY IX_5 (t_vers,t_rele,t_cust) +); + +insert into t1 values +('tm','2.5 ','a ',' ','',''), ('tm','2.5U','a ','stnd','',''), +('da','3.3 ','b ',' ','',''), ('da','3.3U','b ','stnd','',''), +('tl','7.6 ','a ',' ','',''), ('tt','7.6 ','a ',' ','',''), +('bc','B61 ','a ',' ','',''), ('bp','B61 ','a ',' ','',''), +('ca','B61 ','a ',' ','',''), ('ci','B61 ','a ',' ','',''), +('cp','B61 ','a ',' ','',''), ('dm','B61 ','a ',' ','',''), +('ec','B61 ','a ',' ','',''), ('ed','B61 ','a ',' ','',''), +('fm','B61 ','a ',' ','',''), ('nt','B61 ','a ',' ','',''), +('qm','B61 ','a ',' ','',''), ('tc','B61 ','a ',' ','',''), +('td','B61 ','a ',' ','',''), ('tf','B61 ','a ',' ','',''), +('tg','B61 ','a ',' ','',''), ('ti','B61 ','a ',' ','',''), +('tp','B61 ','a ',' ','',''), ('ts','B61 ','a ',' ','',''), +('wh','B61 ','a ',' ','',''), ('bc','B61U','a ','stnd','',''), +('bp','B61U','a ','stnd','',''), ('ca','B61U','a ','stnd','',''), +('ci','B61U','a ','stnd','',''), ('cp','B61U','a ','stnd','',''), +('dm','B61U','a ','stnd','',''), ('ec','B61U','a ','stnd','',''), +('fm','B61U','a ','stnd','',''), ('nt','B61U','a ','stnd','',''), +('qm','B61U','a ','stnd','',''), ('tc','B61U','a ','stnd','',''), +('td','B61U','a ','stnd','',''), ('tf','B61U','a ','stnd','',''), +('tg','B61U','a ','stnd','',''), ('ti','B61U','a ','stnd','',''), +('tp','B61U','a ','stnd','',''), ('ts','B61U','a ','stnd','',''), +('wh','B61U','a ','stnd','',''); +show create table t1; + +select t_vers,t_rele,t_cust,filler1 from t1 where t_vers = '7.6'; +select t_vers,t_rele,t_cust,filler1 from t1 where t_vers = '7.6' + and t_rele='a' and t_cust = ' '; + +drop table t1; + +# BUG#19021: Crash in index_merge/ROR-intersection optimizer under +# specific circumstances. +create table t1 ( + pk int(11) not null auto_increment, + a int(11) not null default '0', + b int(11) not null default '0', + c int(11) not null default '0', + + filler1 datetime, filler2 varchar(15), + filler3 longtext, + + kp1 varchar(4), kp2 varchar(7), + kp3 varchar(2), kp4 varchar(4), + kp5 varchar(7), + filler4 char(1), + + primary key (pk), + key idx1(a,b,c), + key idx2(c), + key idx3(kp1,kp2,kp3,kp4,kp5) +) default charset=latin1; +--disable_query_log +set @fill= uncompress(unhex(concat( +'F91D0000789CDD993D6FDB301086F7FE0A6D4E0105B8E3F1335D5BA028DA0EEDE28E1D320408', +'52A0713BF4D7571FB62C51A475924839080307B603E77DEE787C8FA41F9E9EEF7F1F8A87A7C3', +'AFE280C5DF9F8F7FEE9F8B1B2CB114D6902E918455245DB91300FA16E42D5201FA4EE29DA05D', +'B9FB3718A33718A3FA8C30AEFAFDE1F317D016AA67BA7A60FDE45BF5F8BA7B5BDE8812AA9F1A', +'069DB03C9804346644F3A3A6A1338DB572756A3C4D1BCC804CABF912C654AE9BB855A2B85962', +'3A479259CAE6A86C0411D01AE5483581EDCBD9A39C45252D532E533979EB9F82E971D979BDB4', +'8531105670740AFBFD1E34AAB0029E4AD0A1D46A6D0946A21A16038A5CD965CD2D524673F712', +'20C304477315CE18405EAF9BD0AFFEAC74FDA14F1FBF5BD34C769D73FBBEDF4750ADD4E5A99C', +'5C8DC04934AFA275D483D536D174C11B12AF27F8F888B41B6FC9DBA569E1FD7BD72D698130B7', +'91B23A98803512B3D31881E8DCDA2AC1754E3644C4BB3A8466750B911681274A39E35E8624B7', +'444A42AC1213F354758E3CF1A4CDD5A688C767CF1B11ABC5867CB15D8A18E0B91E9EC275BB94', +'58F33C2936F64690D55BC29E4A293D95A798D84217736CEAAA538CE1354269EE2162053FBC66', +'496D90CB53323CB279D3A6AF651B4B22B9E430743D83BE48E995A09D4FC9871C22D8D189B945', +'706911BCB8C3C774B9C08D2FC6ED853ADACA37A14A4CB2E027630E5B80ECACD939431B1CDF62', +'7D71487536EA2C678F59685E91F4B6C144BCCB94C1EBA9FA6F5552DDCA4E4539BE326A2720CB', +'45ED028EB3616AC93C46E775FEA9FA6DA7CFCEC6DEBA5FCD1F915EED4D983BDDB881528AD9AB', +'43C1576F29AAB35BDFBC21D422F52B307D350589D45225A887AC46C8EDD72D99EC3ED2E1BCEF', +'7AF26FC4C74097B6768A5EDAFA660CC64278F7E63F99AC954B'))); +prepare x from @fill; +execute x; +deallocate prepare x; +--enable_query_log +set @fill=NULL; +SELECT COUNT(*) FROM t1 WHERE b = 0 AND a = 0 AND c = 13286427 AND + kp1='279' AND kp2='ELM0678' AND kp3='6' AND kp4='10' AND kp5 = 'R '; + +drop table t1; + +# BUG#21277: Index Merge/sort_union: wrong query results +create table t1 +( + key1 int not null, + key2 int not null default 0, + key3 int not null default 0 +); + +insert into t1(key1) values (1),(2),(3),(4),(5),(6),(7),(8); + +let $1=7; +set @d=8; +while ($1) +{ + eval insert into t1 (key1) select key1+@d from t1; + eval set @d=@d*2; + dec $1; +} + +alter table t1 add index i2(key2); +alter table t1 add index i3(key3); +update t1 set key2=key1,key3=key1; + +-- disable_query_log +-- disable_result_log +analyze table t1; +-- enable_result_log +-- enable_query_log + +if (!$skip_ror_EXPLAIN_for_MyRocks) +{ +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +# to test the bug, the following must use "sort_union": +explain select * from t1 where (key3 > 30 and key3<35) or (key2 >32 and key2 < 40); +} +select * from t1 where (key3 > 30 and key3<35) or (key2 >32 and key2 < 40); +drop table t1; + +--echo # +--echo # Bug#56423: Different count with SELECT and CREATE SELECT queries +--echo # + +CREATE TABLE t1 ( + a INT, + b INT, + c INT, + d INT, + PRIMARY KEY (a), + KEY (c), + KEY bd (b,d) +); + +INSERT INTO t1 VALUES +(1, 0, 1, 0), +(2, 1, 1, 1), +(3, 1, 1, 1), +(4, 0, 1, 1); + +-- disable_query_log +-- disable_result_log +analyze table t1; +-- enable_result_log +-- enable_query_log + +EXPLAIN +SELECT a +FROM t1 +WHERE c = 1 AND b = 1 AND d = 1; + +CREATE TABLE t2 ( a INT ) +SELECT a +FROM t1 +WHERE c = 1 AND b = 1 AND d = 1; + +SELECT * FROM t2; + +DROP TABLE t1, t2; + +CREATE TABLE t1( a INT, b INT, KEY(a), KEY(b) ); +INSERT INTO t1 VALUES (1, 2), (1, 2), (1, 2), (1, 2); +SELECT * FROM t1 FORCE INDEX(a, b) WHERE a = 1 AND b = 2; + +DROP TABLE t1; + +--echo # Code coverage of fix. +CREATE TABLE t1 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT); +INSERT INTO t1 (b) VALUES (1); +UPDATE t1 SET b = 2 WHERE a = 1; +SELECT * FROM t1; + +CREATE TABLE t2 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b VARCHAR(1) ); +INSERT INTO t2 (b) VALUES ('a'); +UPDATE t2 SET b = 'b' WHERE a = 1; +SELECT * FROM t2; + +DROP TABLE t1, t2; + +--echo # +--echo # BUG#13970015: ASSERT `MIN_ENDP || MAX_ENDP' FAILED IN +--echo # HANDLER::MULTI_RANGE_READ_INFO_CONST +--echo # + +CREATE TABLE t1 ( + pk INT NOT NULL, + col_int_key INT NOT NULL, + col_varchar_key VARCHAR(1) NOT NULL, + PRIMARY KEY (pk), + KEY col_int_key (col_int_key), + KEY col_varchar_key (col_varchar_key,col_int_key) +); + +INSERT INTO t1 VALUES (1,1,'a'), (2,2,'b'); + +-- disable_query_log +-- disable_result_log +analyze table t1; +-- enable_result_log +-- enable_query_log + +EXPLAIN +SELECT col_int_key +FROM t1 +WHERE col_varchar_key >= 'l' OR + (((pk BETWEEN 141 AND 141) OR col_varchar_key <> 'l') + AND ((pk BETWEEN 141 AND 141) OR (col_int_key > 141))); + +SELECT col_int_key +FROM t1 +WHERE col_varchar_key >= 'l' OR + (((pk BETWEEN 141 AND 141) OR col_varchar_key <> 'l') + AND ((pk BETWEEN 141 AND 141) OR (col_int_key > 141))); + +DROP TABLE t1; diff --git a/storage/rocksdb/mysql-test/rocksdb/include/index_merge_2sweeps.inc b/storage/rocksdb/mysql-test/rocksdb/include/index_merge_2sweeps.inc new file mode 100644 index 00000000000..4f195051dd7 --- /dev/null +++ b/storage/rocksdb/mysql-test/rocksdb/include/index_merge_2sweeps.inc @@ -0,0 +1,80 @@ +# include/index_merge_2sweeps.inc +# +# 2-sweeps read Index_merge test +# +# The variable +# $engine_type -- storage engine to be tested +# has to be set before sourcing this script. +# +# Last update: +# 2006-08-02 ML test refactored +# old name was index_merge_innodb2.test +# main code went into include/index_merge_2sweeps.inc +# + +--echo #---------------- 2-sweeps read Index merge test 2 ------------------------------- + +eval SET SESSION DEFAULT_STORAGE_ENGINE = $engine_type; + +--disable_warnings +drop table if exists t1; +--enable_warnings + +create table t1 ( + pk int primary key, + key1 int, + key2 int, + filler char(200), + filler2 char(200), + index(key1), + index(key2) +); + + +--disable_query_log +let $1=1000; +while ($1) +{ + eval insert into t1 values($1, $1, $1, 'filler-data','filler-data-2'); + dec $1; +} +--enable_query_log + +if ($sorted_result) { + --sorted_result +} +select * from t1 where (key1 >= 2 and key1 <= 10) or (pk >= 4 and pk <=8 ); + +set @maxv=1000; + +if ($sorted_result) { + --sorted_result +} +select * from t1 where + (pk < 5) or (pk > 10 and pk < 15) or (pk >= 50 and pk < 55 ) or (pk > @maxv-10) + or key1=18 or key1=60; + +if ($sorted_result) { + --sorted_result +} +select * from t1 where + (pk < 5) or (pk > 10 and pk < 15) or (pk >= 50 and pk < 55 ) or (pk > @maxv-10) + or key1 < 3 or key1 > @maxv-11; + +if ($sorted_result) { + --sorted_result +} +select * from t1 where + (pk < 5) or (pk > 10 and pk < 15) or (pk >= 50 and pk < 55 ) or (pk > @maxv-10) + or + (key1 < 5) or (key1 > 10 and key1 < 15) or (key1 >= 50 and key1 < 55 ) or (key1 > @maxv-10); + +if ($sorted_result) { + --sorted_result +} +select * from t1 where + (pk > 10 and pk < 15) or (pk >= 50 and pk < 55 ) + or + (key1 < 5) or (key1 > @maxv-10); + +drop table t1; diff --git a/storage/rocksdb/mysql-test/rocksdb/include/index_merge_ror.inc b/storage/rocksdb/mysql-test/rocksdb/include/index_merge_ror.inc new file mode 100644 index 00000000000..2e8a07de349 --- /dev/null +++ b/storage/rocksdb/mysql-test/rocksdb/include/index_merge_ror.inc @@ -0,0 +1,426 @@ +# include/index_merge_ror.inc +# +# ROR-index_merge tests. +# +# The variable +# $engine_type -- storage engine to be tested +# has to be set before sourcing this script. +# +# Note: The comments/expectations refer to MyISAM. +# They might be not valid for other storage engines. +# +# Last update: +# 2006-08-02 ML test refactored +# old name was t/index_merge_ror.test +# main code went into include/index_merge_ror.inc +# + +--echo #---------------- ROR-index_merge tests ----------------------- + +eval SET SESSION DEFAULT_STORAGE_ENGINE = $engine_type; + +--disable_warnings +drop table if exists t0,t1,t2; +--enable_warnings +create table t1 +( + /* Field names reflect value(rowid) distribution, st=STairs, swt= SaWTooth */ + st_a int not null default 0, + swt1a int not null default 0, + swt2a int not null default 0, + + st_b int not null default 0, + swt1b int not null default 0, + swt2b int not null default 0, + + /* fields/keys for row retrieval tests */ + key1 int, + key2 int, + key3 int, + key4 int, + + /* make rows much bigger then keys */ + filler1 char (200), + filler2 char (200), + filler3 char (200), + filler4 char (200), + filler5 char (200), + filler6 char (200), + + /* order of keys is important */ + key sta_swt12a(st_a,swt1a,swt2a), + key sta_swt1a(st_a,swt1a), + key sta_swt2a(st_a,swt2a), + key sta_swt21a(st_a,swt2a,swt1a), + + key st_a(st_a), + key stb_swt1a_2b(st_b,swt1b,swt2a), + key stb_swt1b(st_b,swt1b), + key st_b(st_b), + + key(key1), + key(key2), + key(key3), + key(key4) +) ; + +# Fill table +create table t0 as select * from t1; +--disable_query_log +--echo # Printing of many insert into t0 values (....) disabled. +let $cnt=1000; +while ($cnt) +{ + eval insert into t0 values (1, 2, 3, 1, 2, 3, 0, 0, 0, 0, 'data1', 'data2', 'data3', 'data4', 'data5', 'data6'); + dec $cnt; +} +--enable_query_log + +alter table t1 disable keys; +--disable_query_log +--echo # Printing of many insert into t1 select .... from t0 disabled. +let $1=4; +while ($1) +{ + let $2=4; + while ($2) + { + let $3=4; + while ($3) + { + eval insert into t1 select $1, $2, $3, $1 ,$2, $3, key1, key2, key3, key4, filler1, filler2, filler3, filler4, filler5, filler6 from t0; + dec $3; + } + dec $2; + } + dec $1; +} + +--echo # Printing of many insert into t1 (...) values (....) disabled. +# Row retrieval tests +# -1 is used for values 'out of any range we are using' +# insert enough rows for index intersection to be used for (key1,key2) +insert into t1 (key1, key2, key3, key4, filler1) values (100, 100, 100, 100,'key1-key2-key3-key4'); +let $cnt=400; +while ($cnt) +{ + eval insert into t1 (key1, key2, key3, key4, filler1) values (100, -1, 100, -1,'key1-key3'); + dec $cnt; +} +let $cnt=400; +while ($cnt) +{ + eval insert into t1 (key1, key2, key3, key4, filler1) values (-1, 100, -1, 100,'key2-key4'); + dec $cnt; +} +--enable_query_log +alter table t1 enable keys; +select count(*) from t1; + +-- disable_query_log +-- disable_result_log +analyze table t0; +analyze table t1; +-- enable_result_log +-- enable_query_log + +# One row results tests for cases where a single row matches all conditions +explain select key1,key2 from t1 where key1=100 and key2=100; +select key1,key2 from t1 where key1=100 and key2=100; +if (!$skip_ror_EXPLAIN_for_MyRocks) +{ + explain select key1,key2,key3,key4,filler1 from t1 where key1=100 and key2=100 or key3=100 and key4=100; + explain format=json select key1,key2,key3,key4,filler1 from t1 where key1=100 and key2=100 or key3=100 and key4=100; +} +select key1,key2,key3,key4,filler1 from t1 where key1=100 and key2=100 or key3=100 and key4=100; + +# Several-rows results +insert into t1 (key1, key2, key3, key4, filler1) values (100, 100, -1, -1, 'key1-key2'); +insert into t1 (key1, key2, key3, key4, filler1) values (-1, -1, 100, 100, 'key4-key3'); + +-- disable_query_log +-- disable_result_log +analyze table t1; +-- enable_result_log +-- enable_query_log + +# ROR-intersection, not covering +if (!$skip_ror_EXPLAIN_for_MyRocks) +{ + explain select key1,key2,filler1 from t1 where key1=100 and key2=100; +} +select key1,key2,filler1 from t1 where key1=100 and key2=100; + +# ROR-intersection, covering +if (!$skip_ror_EXPLAIN_for_MyRocks) +{ + explain select key1,key2 from t1 where key1=100 and key2=100; +} +select key1,key2 from t1 where key1=100 and key2=100; + +# ROR-union of ROR-intersections +if (!$skip_ror_EXPLAIN_for_MyRocks) +{ + explain select key1,key2,key3,key4 from t1 where key1=100 and key2=100 or key3=100 and key4=100; +} +select key1,key2,key3,key4 from t1 where key1=100 and key2=100 or key3=100 and key4=100; +if (!$skip_ror_EXPLAIN_for_MyRocks) +{ + explain select key1,key2,key3,key4,filler1 from t1 where key1=100 and key2=100 or key3=100 and key4=100; +} +select key1,key2,key3,key4,filler1 from t1 where key1=100 and key2=100 or key3=100 and key4=100; + +# 3-way ROR-intersection +if (!$skip_ror_EXPLAIN_for_MyRocks) +{ + explain select key1,key2,key3 from t1 where key1=100 and key2=100 and key3=100; +} +select key1,key2,key3 from t1 where key1=100 and key2=100 and key3=100; + +# ROR-union(ROR-intersection, ROR-range) +insert into t1 (key1,key2,key3,key4,filler1) values (101,101,101,101, 'key1234-101'); +if (!$skip_ror_EXPLAIN_for_MyRocks) +{ + explain select key1,key2,key3,key4,filler1 from t1 where key1=100 and key2=100 or key3=101; +} +select key1,key2,key3,key4,filler1 from t1 where key1=100 and key2=100 or key3=101; + +# Run some ROR updates/deletes +select key1,key2, filler1 from t1 where key1=100 and key2=100; +update t1 set filler1='to be deleted' where key1=100 and key2=100; +update t1 set key1=200,key2=200 where key1=100 and key2=100; +delete from t1 where key1=200 and key2=200; +-- disable_query_log +-- disable_result_log +analyze table t1; +-- enable_result_log +-- enable_query_log +select key1,key2,filler1 from t1 where key2=100 and key2=200; + +# ROR-union(ROR-intersection) with one of ROR-intersection giving empty +# results +if (!$skip_ror_EXPLAIN_for_MyRocks) +{ + explain select key1,key2,key3,key4,filler1 from t1 where key1=100 and key2=100 or key3=100 and key4=100; +} +select key1,key2,key3,key4,filler1 from t1 where key1=100 and key2=100 or key3=100 and key4=100; + +delete from t1 where key3=100 and key4=100; + +-- disable_query_log +-- disable_result_log +analyze table t1; +-- enable_result_log +-- enable_query_log + +# ROR-union with all ROR-intersections giving empty results +if (!$skip_ror_EXPLAIN_for_MyRocks) +{ + explain select key1,key2,key3,key4,filler1 from t1 where key1=100 and key2=100 or key3=100 and key4=100; +} +select key1,key2,key3,key4,filler1 from t1 where key1=100 and key2=100 or key3=100 and key4=100; + +# ROR-intersection with empty result +if (!$skip_ror_EXPLAIN_for_MyRocks) +{ + explain select key1,key2 from t1 where key1=100 and key2=100; +} +select key1,key2 from t1 where key1=100 and key2=100; + +# ROR-union tests with various cases. +# All scans returning duplicate rows: +insert into t1 (key1, key2, key3, key4, filler1) values (100, 100, 200, 200,'key1-key2-key3-key4-1'); +insert into t1 (key1, key2, key3, key4, filler1) values (100, 100, 200, 200,'key1-key2-key3-key4-2'); +insert into t1 (key1, key2, key3, key4, filler1) values (100, 100, 200, 200,'key1-key2-key3-key4-3'); + +-- disable_query_log +-- disable_result_log +analyze table t1; +-- enable_result_log +-- enable_query_log + +if (!$skip_ror_EXPLAIN_for_MyRocks) +{ + explain select key1,key2,key3,key4,filler1 from t1 where key3=200 or (key1=100 and key2=100) or key4=200; +} +select key1,key2,key3,key4,filler1 from t1 where key3=200 or (key1=100 and key2=100) or key4=200; + +insert into t1 (key1, key2, key3, key4, filler1) values (-1, -1, -1, 200,'key4'); + +-- disable_query_log +-- disable_result_log +analyze table t1; +-- enable_result_log +-- enable_query_log + +if (!$skip_ror_EXPLAIN_for_MyRocks) +{ + explain select key1,key2,key3,key4,filler1 from t1 where key3=200 or (key1=100 and key2=100) or key4=200; +} +select key1,key2,key3,key4,filler1 from t1 where key3=200 or (key1=100 and key2=100) or key4=200; + +insert into t1 (key1, key2, key3, key4, filler1) values (-1, -1, 200, -1,'key3'); + +-- disable_query_log +-- disable_result_log +analyze table t1; +-- enable_result_log +-- enable_query_log + +if (!$skip_ror_EXPLAIN_for_MyRocks) +{ + explain select key1,key2,key3,key4,filler1 from t1 where key3=200 or (key1=100 and key2=100) or key4=200; +} +select key1,key2,key3,key4,filler1 from t1 where key3=200 or (key1=100 and key2=100) or key4=200; + +## +## Optimizer tests +## + +# Check that the shortest key is used for ROR-intersection, covering and non-covering. +if (!$index_merge_random_rows_in_EXPLAIN) +{ + # Too unstable on InnoDB + explain select * from t1 where st_a=1 and st_b=1; + explain select st_a,st_b from t1 where st_a=1 and st_b=1; + explain select st_a from t1 ignore index (st_a) where st_a=1 and st_b=1; +} + +# Do many tests +# Check that keys that don't improve selectivity are skipped. +# +if (!$skip_ror_EXPLAIN_for_MyRocks) +{ +# Different value on 32 and 64 bit +if ($random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +--replace_result sta_swt12a sta_swt21a sta_swt12a, sta_swt12a, +explain select * from t1 where st_a=1 and swt1a=1 and swt2a=1; + +if ($random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t1 where st_b=1 and swt1b=1 and swt2b=1; + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t1 where st_a=1 and swt1a=1 and swt2a=1 and st_b=1 and swt1b=1 and swt2b=1; + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t1 ignore index (sta_swt21a, stb_swt1a_2b) + where st_a=1 and swt1a=1 and swt2a=1 and st_b=1 and swt1b=1 and swt2b=1; + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t1 ignore index (sta_swt21a, sta_swt12a, stb_swt1a_2b) + where st_a=1 and swt1a=1 and swt2a=1 and st_b=1 and swt1b=1 and swt2b=1; + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t1 ignore index (sta_swt21a, sta_swt12a, stb_swt1a_2b, stb_swt1b) + where st_a=1 and swt1a=1 and swt2a=1 and st_b=1 and swt1b=1 and swt2b=1; + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t1 + where st_a=1 and swt1a=1 and swt2a=1 and st_b=1 and swt1b=1; + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select * from t1 + where st_a=1 and swt1a=1 and st_b=1 and swt1b=1 and swt1b=1; + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select st_a from t1 + where st_a=1 and swt1a=1 and st_b=1 and swt1b=1 and swt1b=1; + +if ($index_merge_random_rows_in_EXPLAIN) +{ + --replace_column 9 # +} +explain select st_a from t1 + where st_a=1 and swt1a=1 and st_b=1 and swt1b=1 and swt1b=1; +} + +drop table t0,t1; + +# 'Partially' covered fields test + +create table t2 ( + a char(10), + b char(10), + filler1 char(255), + filler2 char(255), + key(a(5)), + key(b(5)) +); + +--disable_query_log +let $1=8; +while ($1) +{ + eval insert into t2 values (repeat(char($1+64), 8),repeat(char($1+64), 8),'filler1', 'filler2'); + dec $1; +} +insert into t2 select * from t2; +insert into t2 select * from t2; +--enable_query_log + +# The table row buffer is reused. Fill it with rows that don't match. +select count(a) from t2 where a='BBBBBBBB'; +select count(a) from t2 where b='BBBBBBBB'; + +-- disable_query_log +-- disable_result_log +analyze table t2; +-- enable_result_log +-- enable_query_log + +# BUG#1: +--replace_result a a_or_b b a_or_b +explain select count(a) from t2 where a='AAAAAAAA' and b='AAAAAAAA'; +select count(a) from t2 where a='AAAAAAAA' and b='AAAAAAAA'; +select count(a) from t2 ignore index(a,b) where a='AAAAAAAA' and b='AAAAAAAA'; + +insert into t2 values ('ab', 'ab', 'uh', 'oh'); +-- disable_query_log +-- disable_result_log +analyze table t2; +-- enable_result_log +-- enable_query_log +explain select a from t2 where a='ab'; +drop table t2; + +# +# BUG#25048 - ERROR 126 : Incorrect key file for table '.XXXX.MYI'; try to +# repair it +# +CREATE TABLE t1(c1 INT, c2 INT DEFAULT 0, c3 CHAR(255) DEFAULT '', +KEY(c1), KEY(c2), KEY(c3)); +INSERT INTO t1(c1) VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0), +(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0); +INSERT INTO t1 VALUES(0,0,0); +CREATE TABLE t2(c1 int); +INSERT INTO t2 VALUES(1); +DELETE t1 FROM t1,t2 WHERE t1.c1=0 AND t1.c2=0; +SELECT * FROM t1; +DROP TABLE t1,t2; diff --git a/storage/rocksdb/mysql-test/rocksdb/include/index_merge_ror_cpk.inc b/storage/rocksdb/mysql-test/rocksdb/include/index_merge_ror_cpk.inc new file mode 100644 index 00000000000..9f1e2d77621 --- /dev/null +++ b/storage/rocksdb/mysql-test/rocksdb/include/index_merge_ror_cpk.inc @@ -0,0 +1,170 @@ +# include/index_merge_ror_cpk.inc +# +# Clustered PK ROR-index_merge tests +# +# The variable +# $engine_type -- storage engine to be tested +# has to be set before sourcing this script. +# +# Note: The comments/expectations refer to InnoDB. +# They might be not valid for other storage engines. +# +# Last update: +# 2006-08-02 ML test refactored +# old name was t/index_merge_ror_cpk.test +# main code went into include/index_merge_ror_cpk.inc +# + +--echo #---------------- Clustered PK ROR-index_merge tests ----------------------------- + +eval SET SESSION DEFAULT_STORAGE_ENGINE = $engine_type; + +--disable_warnings +drop table if exists t1; +--enable_warnings + +create table t1 +( + pk1 int not null, + pk2 int not null, + + key1 int not null, + key2 int not null, + + pktail1ok int not null, + pktail2ok int not null, + pktail3bad int not null, + pktail4bad int not null, + pktail5bad int not null, + + pk2copy int not null, + badkey int not null, + + filler1 char (200), + filler2 char (200), + key (key1), + key (key2), + + /* keys with tails from CPK members */ + key (pktail1ok, pk1), + key (pktail2ok, pk1, pk2), + key (pktail3bad, pk2, pk1), + key (pktail4bad, pk1, pk2copy), + key (pktail5bad, pk1, pk2, pk2copy), + + primary key (pk1, pk2) +); + +--disable_query_log +set autocommit=0; +let $1=10000; +while ($1) +{ + eval insert into t1 values ($1 div 10,$1 mod 100, $1/100,$1/100, $1/100,$1/100,$1/100,$1/100,$1/100, $1 mod 100, $1/1000,'filler-data-$1','filler2'); + dec $1; +} +set autocommit=1; +--enable_query_log + +-- disable_query_log +-- disable_result_log +analyze table t1; +-- enable_result_log +-- enable_query_log + +# Verify that range scan on CPK is ROR +# (use index_intersection because it is impossible to check that for index union) +# Column 9, rows, can change depending on innodb-page-size. +--replace_column 9 ROWS +explain select * from t1 where pk1 = 1 and pk2 < 80 and key1=0; +# CPK scan + 1 ROR range scan is a special case +--sorted_result +select * from t1 where pk1 = 1 and pk2 < 80 and key1=0; + +# Verify that CPK fields are considered to be covered by index scans +explain select pk1,pk2 from t1 where key1 = 10 and key2=10 and 2*pk1+1 < 2*96+1; +select pk1,pk2 from t1 where key1 = 10 and key2=10 and 2*pk1+1 < 2*96+1; + +# Verify that CPK is always used for index intersection scans +# (this is because it is used as a filter, not for retrieval) +# The expected number of rows can vary depending on page size +--replace_column 9 ROWS +explain select * from t1 where badkey=1 and key1=10; +# The expected number of rows can vary depending on page size +--replace_column 9 ROWS +explain select * from t1 where pk1 < 7500 and key1 = 10; + +# Verify that keys with 'tails' of PK members are ok. +explain select * from t1 where pktail1ok=1 and key1=10; +explain select * from t1 where pktail2ok=1 and key1=10; + +# Note: The following is actually a deficiency, it uses sort_union currently. +# This comment refers to InnoDB and is probably not valid for other engines. +# The expected number of rows can vary depending on page size +--replace_column 9 ROWS +explain select * from t1 where (pktail2ok=1 and pk1< 50000) or key1=10; + +# The expected column used for KEY vary depending on page size +# The expected number of rows can vary depending on page size and platform +--replace_column 6 EITHER_KEY 9 ROWS +explain select * from t1 where pktail3bad=1 and key1=10; +# The expected column used for KEY vary depending on page size +--replace_column 9 ROWS +explain select * from t1 where pktail4bad=1 and key1=10; +# The expected column used for KEY vary depending on page size +--replace_column 9 ROWS +explain select * from t1 where pktail5bad=1 and key1=10; + +# Test for problem with innodb key values prefetch buffer: +explain select pk1,pk2,key1,key2 from t1 where key1 = 10 and key2=10 limit 10; +select pk1,pk2,key1,key2 from t1 where key1 = 10 and key2=10 limit 10; + +drop table t1; +# Testcase for BUG#4984 +create table t1 +( + RUNID varchar(22), + SUBMITNR varchar(5), + ORDERNR char(1), + PROGRAMM varchar(8), + TESTID varchar(4), + UCCHECK char(1), + ETEXT varchar(80), + ETEXT_TYPE char(1), + INFO char(1), + SEVERITY tinyint(3), + TADIRFLAG char(1), + PRIMARY KEY (RUNID,SUBMITNR,ORDERNR,PROGRAMM,TESTID,UCCHECK), + KEY `TVERM~KEY` (PROGRAMM,TESTID,UCCHECK) +) DEFAULT CHARSET=latin1; + +update t1 set `ETEXT` = '', `ETEXT_TYPE`='', `INFO`='', `SEVERITY`='', `TADIRFLAG`='' +WHERE + `RUNID`= '' AND `SUBMITNR`= '' AND `ORDERNR`='' AND `PROGRAMM`='' AND + `TESTID`='' AND `UCCHECK`=''; + +drop table t1; + +--echo # +--echo # Bug#50402 Optimizer producing wrong results when using Index Merge on InnoDB +--echo # +CREATE TABLE t1 (f1 INT, PRIMARY KEY (f1)); +INSERT INTO t1 VALUES (2); +CREATE TABLE t2 (f1 INT, f2 INT, f3 char(1), + PRIMARY KEY (f1), KEY (f2), KEY (f3) ); +INSERT INTO t2 VALUES (1, 1, 'h'), (2, 3, 'h'), (3, 2, ''), (4, 2, ''); + +SELECT t1.f1 FROM t1 +WHERE (SELECT COUNT(*) FROM t2 WHERE t2.f3 = 'h' AND t2.f2 = t1.f1) = 0 AND t1.f1 = 2; + +-- disable_query_log +-- disable_result_log +analyze table t1; +analyze table t2; +-- enable_result_log +-- enable_query_log + +EXPLAIN SELECT t1.f1 FROM t1 +WHERE (SELECT COUNT(*) FROM t2 WHERE t2.f3 = 'h' AND t2.f2 = t1.f1) = 0 AND t1.f1 = 2; + +DROP TABLE t1,t2; diff --git a/storage/rocksdb/mysql-test/rocksdb/include/restart_mysqld_with_option.inc b/storage/rocksdb/mysql-test/rocksdb/include/restart_mysqld_with_option.inc new file mode 100644 index 00000000000..4250b368b1a --- /dev/null +++ b/storage/rocksdb/mysql-test/rocksdb/include/restart_mysqld_with_option.inc @@ -0,0 +1,31 @@ + +if ($rpl_inited) +{ + if (!$allow_rpl_inited) + { + --die ERROR IN TEST: This script does not support replication + } +} + +# Write file to make mysql-test-run.pl expect the "crash", but don't start +# it until it's told to +--let $_server_id= `SELECT @@server_id` +--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.$_server_id.expect +--exec echo "wait" > $_expect_file_name + +# Send shutdown to the connected server and give +# it 10 seconds to die before zapping it +shutdown_server 10; + +# Write file to make mysql-test-run.pl start up the server again +--exec echo "restart:$_mysqld_option" > $_expect_file_name + +# Turn on reconnect +--enable_reconnect + +# Call script that will poll the server waiting for it to be back online again +--source include/wait_until_connected_again.inc + +# Turn off reconnect again +--disable_reconnect + diff --git a/storage/rocksdb/mysql-test/rocksdb/include/simple_deadlock.inc b/storage/rocksdb/mysql-test/rocksdb/include/simple_deadlock.inc new file mode 100644 index 00000000000..0afdfea76db --- /dev/null +++ b/storage/rocksdb/mysql-test/rocksdb/include/simple_deadlock.inc @@ -0,0 +1,29 @@ +connection con1; +begin; +select * from t where i=1 for update; + +connection con2; +begin; +select * from t where i=2 for update; + +connection con1; +--send select * from t where i=2 for update + +connection con2; +if ($engine == "rocksdb"){ + let $wait_condition = select count(*) = 1 from information_schema.rocksdb_trx + where thread_id = $con1 and waiting_key != ""; +} +if ($engine == "innodb"){ + let $wait_condition = select count(*) = 1 from information_schema.innodb_trx + where trx_mysql_thread_id = $con1 and trx_state="LOCK WAIT"; +} +--source include/wait_condition.inc + +--error ER_LOCK_DEADLOCK +select * from t where i=1 for update; +rollback; + +connection con1; +--reap +rollback; diff --git a/storage/rocksdb/mysql-test/rocksdb/r/add_index_inplace.result b/storage/rocksdb/mysql-test/rocksdb/r/add_index_inplace.result index 7ed8375b7a0..01fa9f1d35b 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/add_index_inplace.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/add_index_inplace.result @@ -258,7 +258,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`i`), KEY `j` (`j`) ) ENGINE=ROCKSDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (i) + PARTITION BY KEY (`i`) PARTITIONS 4 SELECT * FROM t1 ORDER BY i LIMIT 10; i j k diff --git a/storage/rocksdb/mysql-test/rocksdb/r/add_index_inplace_crash.result b/storage/rocksdb/mysql-test/rocksdb/r/add_index_inplace_crash.result index 6abc9e61386..d3801258f0c 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/add_index_inplace_crash.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/add_index_inplace_crash.result @@ -37,7 +37,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`i`), KEY `j` (`j`) ) ENGINE=ROCKSDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (i) + PARTITION BY KEY (`i`) PARTITIONS 4 ALTER TABLE t1 ADD INDEX kij(i,j), ALGORITHM=INPLACE; SELECT * FROM t1 ORDER BY i LIMIT 10; @@ -72,7 +72,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`i`), KEY `j` (`j`) ) ENGINE=ROCKSDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (i) + PARTITION BY KEY (`i`) PARTITIONS 4 ALTER TABLE t1 ADD INDEX kij(i,j), ALGORITHM=INPLACE; SHOW CREATE TABLE t1; @@ -85,7 +85,7 @@ t1 CREATE TABLE `t1` ( KEY `j` (`j`), KEY `kij` (`i`,`j`) ) ENGINE=ROCKSDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (i) + PARTITION BY KEY (`i`) PARTITIONS 4 SELECT COUNT(*) FROM t1; COUNT(*) diff --git a/storage/rocksdb/mysql-test/rocksdb/r/allow_no_primary_key.result b/storage/rocksdb/mysql-test/rocksdb/r/allow_no_primary_key.result index d86792a6469..5bffab74917 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/allow_no_primary_key.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/allow_no_primary_key.result @@ -241,7 +241,7 @@ a b 2 b EXPLAIN SELECT * FROM t1 WHERE a = 2; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 const a a 5 const 1 NULL +1 SIMPLE t1 const a a 5 const 1 DROP TABLE t1; CREATE TABLE t1 (a INT, b CHAR(8)) ENGINE=rocksdb; SHOW CREATE TABLE t1; diff --git a/storage/rocksdb/mysql-test/rocksdb/r/bloomfilter.result b/storage/rocksdb/mysql-test/rocksdb/r/bloomfilter.result index 22034d0fbba..5f1083a1bb2 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/bloomfilter.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/bloomfilter.result @@ -823,7 +823,7 @@ index id2_id4 (id2, id4) COMMENT 'rev:cf_short_prefix', index id2_id3_id1_id4 (id2, id3, id1, id4) COMMENT 'rev:cf_short_prefix', index id3_id2 (id3, id2) COMMENT 'rev:cf_short_prefix' ) engine=ROCKSDB; -create table t2 ( +create or replace table t2 ( id1 bigint not null, id2 bigint not null, id3 varchar(100) not null, @@ -839,6 +839,10 @@ index id2_id4_id5 (id2, id4, id5) COMMENT 'rev:cf_short_prefix', index id3_id4 (id3, id4) COMMENT 'rev:cf_short_prefix', index id3_id5 (id3, id5) COMMENT 'rev:cf_short_prefix' ) engine=ROCKSDB; +insert t1 +select (seq+9) div 10, (seq+4) div 5, (seq+4) div 5, seq, seq, 1000, "aaabbbccc" + from seq_1_to_10000; +insert t2 select * from t1; call bloom_start(); select count(*) from t1; count(*) @@ -1203,9 +1207,7 @@ count(*) call bloom_end(); checked true -drop table if exists t1; -drop table if exists t2; -create table t1 ( +create or replace table t1 ( id1 bigint not null, id2 bigint not null, id3 varchar(100) not null, @@ -1237,6 +1239,10 @@ index id2_id4_id5 (id2, id4, id5) COMMENT 'cf_long_prefix', index id3_id4 (id3, id4) COMMENT 'cf_long_prefix', index id3_id5 (id3, id5) COMMENT 'cf_long_prefix' ) engine=ROCKSDB; +insert t1 +select (seq+9) div 10, (seq+4) div 5, (seq+4) div 5, seq, seq, 1000, "aaabbbccc" + from seq_1_to_10000; +insert t2 select * from t1; call bloom_start(); select count(*) from t1; count(*) @@ -1601,9 +1607,7 @@ count(*) call bloom_end(); checked false -drop table if exists t1; -drop table if exists t2; -create table t1 ( +create or replace table t1 ( id1 bigint not null, id2 bigint not null, id3 varchar(100) not null, @@ -1619,7 +1623,7 @@ index id2_id4 (id2, id4) COMMENT 'rev:cf_long_prefix', index id2_id3_id1_id4 (id2, id3, id1, id4) COMMENT 'rev:cf_long_prefix', index id3_id2 (id3, id2) COMMENT 'rev:cf_long_prefix' ) engine=ROCKSDB; -create table t2 ( +create or replace table t2 ( id1 bigint not null, id2 bigint not null, id3 varchar(100) not null, diff --git a/storage/rocksdb/mysql-test/rocksdb/r/bloomfilter_skip.result b/storage/rocksdb/mysql-test/rocksdb/r/bloomfilter_skip.result index b3336aec6ea..2496f349427 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/bloomfilter_skip.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/bloomfilter_skip.result @@ -823,7 +823,7 @@ index id2_id4 (id2, id4) COMMENT 'rev:cf_short_prefix', index id2_id3_id1_id4 (id2, id3, id1, id4) COMMENT 'rev:cf_short_prefix', index id3_id2 (id3, id2) COMMENT 'rev:cf_short_prefix' ) engine=ROCKSDB; -create table t2 ( +create or replace table t2 ( id1 bigint not null, id2 bigint not null, id3 varchar(100) not null, @@ -839,6 +839,10 @@ index id2_id4_id5 (id2, id4, id5) COMMENT 'rev:cf_short_prefix', index id3_id4 (id3, id4) COMMENT 'rev:cf_short_prefix', index id3_id5 (id3, id5) COMMENT 'rev:cf_short_prefix' ) engine=ROCKSDB; +insert t1 +select (seq+9) div 10, (seq+4) div 5, (seq+4) div 5, seq, seq, 1000, "aaabbbccc" + from seq_1_to_10000; +insert t2 select * from t1; call bloom_start(); select count(*) from t1; count(*) @@ -1203,9 +1207,7 @@ count(*) call bloom_end(); checked false -drop table if exists t1; -drop table if exists t2; -create table t1 ( +create or replace table t1 ( id1 bigint not null, id2 bigint not null, id3 varchar(100) not null, @@ -1237,6 +1239,10 @@ index id2_id4_id5 (id2, id4, id5) COMMENT 'cf_long_prefix', index id3_id4 (id3, id4) COMMENT 'cf_long_prefix', index id3_id5 (id3, id5) COMMENT 'cf_long_prefix' ) engine=ROCKSDB; +insert t1 +select (seq+9) div 10, (seq+4) div 5, (seq+4) div 5, seq, seq, 1000, "aaabbbccc" + from seq_1_to_10000; +insert t2 select * from t1; call bloom_start(); select count(*) from t1; count(*) @@ -1601,9 +1607,7 @@ count(*) call bloom_end(); checked false -drop table if exists t1; -drop table if exists t2; -create table t1 ( +create or replace table t1 ( id1 bigint not null, id2 bigint not null, id3 varchar(100) not null, @@ -1619,7 +1623,7 @@ index id2_id4 (id2, id4) COMMENT 'rev:cf_long_prefix', index id2_id3_id1_id4 (id2, id3, id1, id4) COMMENT 'rev:cf_long_prefix', index id3_id2 (id3, id2) COMMENT 'rev:cf_long_prefix' ) engine=ROCKSDB; -create table t2 ( +create or replace table t2 ( id1 bigint not null, id2 bigint not null, id3 varchar(100) not null, diff --git a/storage/rocksdb/mysql-test/rocksdb/r/bulk_load.result b/storage/rocksdb/mysql-test/rocksdb/r/bulk_load.result index 15f2e3f42f7..b931a61e233 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/bulk_load.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/bulk_load.result @@ -21,7 +21,7 @@ b CHAR(30), PRIMARY KEY(pk) COMMENT "cf1", KEY(a) ) COLLATE 'latin1_bin' PARTITION BY KEY() PARTITIONS 4; -connect other,localhost,root,, +connect other,localhost,root,,; set session transaction isolation level repeatable read; select * from information_schema.rocksdb_dbstats where stat_type='DB_NUM_SNAPSHOTS'; STAT_TYPE VALUE diff --git a/storage/rocksdb/mysql-test/rocksdb/r/bulk_load_errors.result b/storage/rocksdb/mysql-test/rocksdb/r/bulk_load_errors.result index be198d02aaf..53d3598a54a 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/bulk_load_errors.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/bulk_load_errors.result @@ -14,15 +14,18 @@ INSERT INTO t1 VALUES(1); INSERT INTO t1 VALUES(2); INSERT INTO t1 VALUES(20); INSERT INTO t1 VALUES(21); +# +# In MyRocks, the following statement will intentionally crash the server. +# In MariaDB, it will cause an error SET rocksdb_bulk_load=0; -ERROR HY000: Lost connection to MySQL server during query -TRUNCATE TABLE t1; -SET rocksdb_bulk_load_allow_unsorted=1; -SET rocksdb_bulk_load=1; -INSERT INTO t1 VALUES(100); -INSERT INTO t1 VALUES(101); -INSERT INTO t1 VALUES(99); -SET rocksdb_bulk_load=0; +ERROR HY000: Rows inserted during bulk load must not overlap existing rows +# +# Despite the error, bulk load operation is over so the variable value +# will be 0: +select @@rocksdb_bulk_load; +@@rocksdb_bulk_load +0 +call mtr.add_suppression('finalizing last SST file while setting bulk loading variable'); SELECT * FROM t1; pk 99 diff --git a/storage/rocksdb/mysql-test/rocksdb/r/bulk_load_rev_cf.result b/storage/rocksdb/mysql-test/rocksdb/r/bulk_load_rev_cf.result index a30838b9c9f..947f67434a5 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/bulk_load_rev_cf.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/bulk_load_rev_cf.result @@ -21,6 +21,7 @@ b CHAR(30), PRIMARY KEY(pk) COMMENT "rev:cf1", KEY(a) ) COLLATE 'latin1_bin' PARTITION BY KEY() PARTITIONS 4; +connect other,localhost,root,,; set session transaction isolation level repeatable read; select * from information_schema.rocksdb_dbstats where stat_type='DB_NUM_SNAPSHOTS'; STAT_TYPE VALUE @@ -29,6 +30,7 @@ start transaction with consistent snapshot; select * from information_schema.rocksdb_dbstats where stat_type='DB_NUM_SNAPSHOTS'; STAT_TYPE VALUE DB_NUM_SNAPSHOTS 1 +connection default; set rocksdb_bulk_load=1; set rocksdb_bulk_load_size=100000; LOAD DATA INFILE INTO TABLE t1; @@ -79,4 +81,5 @@ count(b) 5000000 longfilenamethatvalidatesthatthiswillgetdeleted.bulk_load.tmp test.bulk_load.tmp +disconnect other; DROP TABLE t1, t2, t3; diff --git a/storage/rocksdb/mysql-test/rocksdb/r/bulk_load_rev_cf_and_data.result b/storage/rocksdb/mysql-test/rocksdb/r/bulk_load_rev_cf_and_data.result index 4d259b5ea2f..6c38e030afb 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/bulk_load_rev_cf_and_data.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/bulk_load_rev_cf_and_data.result @@ -21,6 +21,7 @@ b CHAR(30), PRIMARY KEY(pk) COMMENT "rev:cf1", KEY(a) ) COLLATE 'latin1_bin' PARTITION BY KEY() PARTITIONS 4; +connect other,localhost,root,,; set session transaction isolation level repeatable read; select * from information_schema.rocksdb_dbstats where stat_type='DB_NUM_SNAPSHOTS'; STAT_TYPE VALUE @@ -29,6 +30,7 @@ start transaction with consistent snapshot; select * from information_schema.rocksdb_dbstats where stat_type='DB_NUM_SNAPSHOTS'; STAT_TYPE VALUE DB_NUM_SNAPSHOTS 1 +connection default; set rocksdb_bulk_load=1; set rocksdb_bulk_load_size=100000; LOAD DATA INFILE INTO TABLE t1; @@ -79,4 +81,5 @@ count(b) 5000000 longfilenamethatvalidatesthatthiswillgetdeleted.bulk_load.tmp test.bulk_load.tmp +disconnect other; DROP TABLE t1, t2, t3; diff --git a/storage/rocksdb/mysql-test/rocksdb/r/cardinality.result b/storage/rocksdb/mysql-test/rocksdb/r/cardinality.result index 840ad9a723c..3bd87e9ffd6 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/cardinality.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/cardinality.result @@ -1,4 +1,4 @@ -DROP TABLE IF EXISTS t1; +DROP TABLE IF EXISTS t1,t10,t11; create table t1( id bigint not null primary key, i1 bigint, #unique diff --git a/storage/rocksdb/mysql-test/rocksdb/r/cons_snapshot_repeatable_read.result b/storage/rocksdb/mysql-test/rocksdb/r/cons_snapshot_repeatable_read.result index 90723ff762c..d9be37ee18d 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/cons_snapshot_repeatable_read.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/cons_snapshot_repeatable_read.result @@ -125,7 +125,7 @@ id value value2 START TRANSACTION WITH CONSISTENT SNAPSHOT; ERROR: 0 INSERT INTO r1 values (11,11,11); -ERROR: 12045 +ERROR: 4059 SELECT * FROM r1; id value value2 1 1 1 diff --git a/storage/rocksdb/mysql-test/rocksdb/r/corrupted_data_reads_debug.result b/storage/rocksdb/mysql-test/rocksdb/r/corrupted_data_reads_debug.result index 0c08b092603..5cf9c620341 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/corrupted_data_reads_debug.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/corrupted_data_reads_debug.result @@ -20,7 +20,7 @@ set @tmp1=@@rocksdb_verify_row_debug_checksums; set rocksdb_verify_row_debug_checksums=1; set session debug_dbug= "+d,myrocks_simulate_bad_row_read1"; select * from t1 where pk=1; -ERROR HY000: Got error 122 "Internal (unspecified) error in handler" from storage engine ROCKSDB +ERROR HY000: Got error 200 'Found data corruption.' from ROCKSDB set session debug_dbug= "-d,myrocks_simulate_bad_row_read1"; set rocksdb_verify_row_debug_checksums=@tmp1; select * from t1 where pk=1; @@ -28,11 +28,11 @@ pk col1 1 1 set session debug_dbug= "+d,myrocks_simulate_bad_row_read2"; select * from t1 where pk=1; -ERROR HY000: Got error 122 "Internal (unspecified) error in handler" from storage engine ROCKSDB +ERROR HY000: Got error 200 'Found data corruption.' from ROCKSDB set session debug_dbug= "-d,myrocks_simulate_bad_row_read2"; set session debug_dbug= "+d,myrocks_simulate_bad_row_read3"; select * from t1 where pk=1; -ERROR HY000: Got error 122 "Internal (unspecified) error in handler" from storage engine ROCKSDB +ERROR HY000: Got error 200 'Found data corruption.' from ROCKSDB set session debug_dbug= "-d,myrocks_simulate_bad_row_read3"; insert into t1 values(4,'0123456789'); select * from t1; @@ -56,7 +56,7 @@ pk col1 ABCD 1 set session debug_dbug= "+d,myrocks_simulate_bad_pk_read1"; select * from t2; -ERROR HY000: Got error 122 "Internal (unspecified) error in handler" from storage engine ROCKSDB +ERROR HY000: Got error 200 'Found data corruption.' from ROCKSDB set session debug_dbug= "-d,myrocks_simulate_bad_pk_read1"; drop table t2; create table t2 ( @@ -69,6 +69,6 @@ pk col1 ABCD 1 set session debug_dbug= "+d,myrocks_simulate_bad_pk_read1"; select * from t2; -ERROR HY000: Got error 122 "Internal (unspecified) error in handler" from storage engine ROCKSDB +ERROR HY000: Got error 200 'Found data corruption.' from ROCKSDB set session debug_dbug= "-d,myrocks_simulate_bad_pk_read1"; drop table t2; diff --git a/storage/rocksdb/mysql-test/rocksdb/r/deadlock_stats.result b/storage/rocksdb/mysql-test/rocksdb/r/deadlock_stats.result index 9b62cade9ca..79cb6bb0f61 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/deadlock_stats.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/deadlock_stats.result @@ -1,51 +1,14 @@ set @prior_lock_wait_timeout = @@rocksdb_lock_wait_timeout; set @prior_deadlock_detect = @@rocksdb_deadlock_detect; set global rocksdb_deadlock_detect = on; set global rocksdb_lock_wait_timeout = 100000;; +connect con1,localhost,root,,; +connect con2,localhost,root,,; +connection default; create table t (i int primary key) engine=rocksdb; insert into t values (1), (2), (3); -begin; -select * from t where i=1 for update; -i -1 -begin; -select * from t where i=2 for update; -i -2 -select * from t where i=2 for update; -select * from t where i=1 for update; -ERROR 40001: Deadlock found when trying to get lock; try restarting transaction -rollback; -i -2 -rollback; -select row_lock_deadlocks from information_schema.table_statistics where -table_name = "t"; -row_lock_deadlocks -1 -select row_lock_deadlocks from information_schema.table_statistics where -table_name = "t"; -row_lock_deadlocks -1 -begin; -select * from t where i=1 for update; -i -1 -begin; -select * from t where i=2 for update; -i -2 -select * from t where i=2 for update; -select * from t where i=1 for update; -ERROR 40001: Deadlock found when trying to get lock; try restarting transaction -rollback; -i -2 -rollback; -select row_lock_deadlocks from information_schema.table_statistics where -table_name = "t"; -row_lock_deadlocks -2 -select row_lock_deadlocks from information_schema.table_statistics where -table_name = "t"; -row_lock_deadlocks -2 +# +# The following is disabled due: +# MDEV-13404: MyRocks upstream uses I_S.table_statistics.row_lock_deadlocks, should we import? +# +disconnect con1; +disconnect con2; set global rocksdb_lock_wait_timeout = @prior_lock_wait_timeout; set global rocksdb_deadlock_detect = @prior_deadlock_detect;; drop table t; diff --git a/storage/rocksdb/mysql-test/rocksdb/r/foreign_key.result b/storage/rocksdb/mysql-test/rocksdb/r/foreign_key.result index 5ffd2774ca2..fa3809e9758 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/foreign_key.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/foreign_key.result @@ -1,16 +1,16 @@ DROP TABLE IF EXISTS t1, t2; CREATE TABLE t1 (b INT PRIMARY KEY); CREATE TABLE t2 (a INT NOT NULL, b INT NOT NULL, FOREIGN KEY (b) REFERENCES t1(b)); -ERROR 42000: This version of MySQL doesn't yet support 'FOREIGN KEY for the RocksDB storage engine' +ERROR 42000: This version of MariaDB doesn't yet support 'FOREIGN KEY for the RocksDB storage engine' CREATE TABLE t2 (a INT NOT NULL, bforeign INT NOT NULL); DROP TABLE t2; CREATE TABLE t2 (a INT NOT NULL, foreignkey INT NOT NULL); DROP TABLE t2; CREATE TABLE t2 (a INT NOT NULL, bforeign INT not null, FOREIGN KEY (bforeign) REFERENCES t1(b)); -ERROR 42000: This version of MySQL doesn't yet support 'FOREIGN KEY for the RocksDB storage engine' +ERROR 42000: This version of MariaDB doesn't yet support 'FOREIGN KEY for the RocksDB storage engine' CREATE TABLE t2 (a INT NOT NULL, b INT NOT NULL); ALTER TABLE t2 ADD FOREIGN KEY (b) REFERENCES t1(b); -ERROR 42000: This version of MySQL doesn't yet support 'FOREIGN KEY for the RocksDB storage engine' +ERROR 42000: This version of MariaDB doesn't yet support 'FOREIGN KEY for the RocksDB storage engine' DROP TABLE t2; CREATE TABLE t2 (a INT NOT NULL); ALTER TABLE t2 ADD bforeign INT NOT NULL; @@ -20,6 +20,6 @@ ALTER TABLE t2 ADD foreignkey INT NOT NULL; DROP TABLE t2; CREATE TABLE t2 (a INT NOT NULL); ALTER TABLE t2 ADD bforeign INT NOT NULL, ADD FOREIGN KEY (bforeign) REFERENCES t1(b); -ERROR 42000: This version of MySQL doesn't yet support 'FOREIGN KEY for the RocksDB storage engine' +ERROR 42000: This version of MariaDB doesn't yet support 'FOREIGN KEY for the RocksDB storage engine' DROP TABLE t2; DROP TABLE t1; diff --git a/storage/rocksdb/mysql-test/rocksdb/r/i_s_ddl.result b/storage/rocksdb/mysql-test/rocksdb/r/i_s_ddl.result index bcb1cdd4503..21f74cc5680 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/i_s_ddl.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/i_s_ddl.result @@ -11,7 +11,6 @@ TABLE_SCHEMA TABLE_NAME PARTITION_NAME INDEX_NAME INDEX_TYPE KV_FORMAT_VERSION C test is_ddl_t1 NULL PRIMARY 1 13 default test is_ddl_t1 NULL j 2 13 default test is_ddl_t1 NULL k 2 13 kl_cf -test is_ddl_t2 NULL PRIMARY 1 11 zy_cf -test is_ddl_t2 NULL x 2 11 default +test is_ddl_t2 NULL x 2 12 default DROP TABLE is_ddl_t1; DROP TABLE is_ddl_t2; diff --git a/storage/rocksdb/mysql-test/rocksdb/r/index_merge_rocksdb.result b/storage/rocksdb/mysql-test/rocksdb/r/index_merge_rocksdb.result index 22c8592ff28..f63a271cdce 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/index_merge_rocksdb.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/index_merge_rocksdb.result @@ -31,7 +31,7 @@ test.t1 analyze status OK set global rocksdb_force_flush_memtable_now=1; explain select * from t1 where key1 = 1; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ref key1 key1 5 const # NULL +1 SIMPLE t1 ref key1 key1 5 const # explain select key1,key2 from t1 where key1 = 1 or key2 = 1; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 index_merge key1,key2 key1,key2 5,5 NULL # Using union(key1,key2); Using where diff --git a/storage/rocksdb/mysql-test/rocksdb/r/index_merge_rocksdb2.result b/storage/rocksdb/mysql-test/rocksdb/r/index_merge_rocksdb2.result index eab9bbc2ea7..ff33e6061b3 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/index_merge_rocksdb2.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/index_merge_rocksdb2.result @@ -26,7 +26,7 @@ Table Op Msg_type Msg_text test.t0 analyze status OK explain select * from t0 where key1 < 3 or key1 > 1020; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t0 range i1 i1 4 NULL 2 Using index condition +1 SIMPLE t0 range i1 i1 4 NULL 2 Using index condition; Using where explain select * from t0 where key1 < 3 or key2 > 1020; id select_type table type possible_keys key key_len ref rows Extra @@ -79,13 +79,13 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t0 index_merge i1,i2 i1,i2 4,4 NULL # Using sort_union(i1,i2); Using where explain select * from t0 where key2 = 45 or key1 <=> null; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t0 range i1,i2 i2 4 NULL # Using where +1 SIMPLE t0 range i1,i2 i2 4 NULL # Using index condition explain select * from t0 where key2 = 45 or key1 is not null; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t0 ALL i1,i2 NULL NULL NULL # Using where explain select * from t0 where key2 = 45 or key1 is null; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t0 ref i2 i2 4 const # NULL +1 SIMPLE t0 ref i2 i2 4 const # explain select * from t0 where key2=10 or key3=3 or key4 <=> null; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t0 index_merge i2,i3,i4 i2,i3 4,4 NULL # Using union(i2,i3); Using where @@ -187,7 +187,7 @@ explain select * from t0 force index(i1, i2, i3, i4, i5, i6 ) where or ((key3 >=5 or key5 < 2) and (key5 < 5 or key6 < 6)); id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t0 ALL i1,i2,i3,i5,i6 NULL NULL NULL # Using where +1 SIMPLE t0 index_merge i1,i2,i3,i5,i6 i3,i5 0,4 NULL # Using sort_union(i3,i5); Using where select * from t0 where key1 < 3 or key8 < 2 order by key1; key1 key2 key3 key4 key5 key6 key7 key8 1 1 1 1 1 1 1 1023 @@ -227,7 +227,7 @@ index i2_1(key2, key2_1), index i2_2(key2, key2_1) ); Warnings: -Note 1831 Duplicate index 'i2_2' defined on the table 'test.t4'. This is deprecated and will be disallowed in a future release. +Note 1831 Duplicate index `i2_2`. This is deprecated and will be disallowed in a future release insert into t4 select key1,key1,key1 div 10, key1 % 10, key1 % 10, key1 from t0; select * from t4 where key1a = 3 or key1b = 4; key1a key1b key2 key2_1 key2_2 key3 @@ -250,8 +250,8 @@ insert into t1 select * from t0; explain select * from t0 left join t1 on (t0.key1=t1.key1) where t0.key1=3 or t0.key2=4; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t0 index_merge i1,i2 i1,i2 4,4 NULL 2 Using union(i1,i2); Using where -1 SIMPLE t1 ref i1 i1 4 test.t0.key1 1 NULL +1 SIMPLE t0 index_merge i1,i2 i1,i2 4,4 NULL # Using union(i1,i2); Using where +1 SIMPLE t1 ref i1 i1 4 test.t0.key1 # select * from t0 left join t1 on (t0.key1=t1.key1) where t0.key1=3 or t0.key2=4; key1 key2 key3 key4 key5 key6 key7 key8 key1 key2 key3 key4 key5 key6 key7 key8 @@ -260,19 +260,19 @@ key1 key2 key3 key4 key5 key6 key7 key8 key1 key2 key3 key4 key5 key6 key7 key8 explain select * from t0,t1 where (t0.key1=t1.key1) and ( t0.key1=3 or t0.key2=4); id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t0 index_merge i1,i2 i1,i2 4,4 NULL 2 Using union(i1,i2); Using where -1 SIMPLE t1 ref i1 i1 4 test.t0.key1 1 NULL +1 SIMPLE t0 index_merge i1,i2 i1,i2 4,4 NULL # Using union(i1,i2); Using where +1 SIMPLE t1 ref i1 i1 4 test.t0.key1 # explain select * from t0,t1 where (t0.key1=t1.key1) and (t0.key1=3 or t0.key2<4) and t1.key1=2; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t0 ref i1,i2 i1 4 const 1 Using where -1 SIMPLE t1 ref i1 i1 4 const 1 NULL +1 SIMPLE t1 ref i1 i1 4 const 1 explain select * from t0,t1 where t0.key1 = 5 and (t1.key1 = t0.key1 or t1.key8 = t0.key1); id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t0 ref i1 i1 4 const 1 NULL -1 SIMPLE t1 index_merge i1,i8 i1,i8 4,4 NULL 2 Using union(i1,i8); Using where; Using join buffer (Block Nested Loop) +1 SIMPLE t0 ref i1 i1 4 const 1 +1 SIMPLE t1 index_merge i1,i8 i1,i8 4,4 NULL 2 Using union(i1,i8); Using where; Using join buffer (flat, BNL join) explain select * from t0,t1 where t0.key1 < 3 and (t1.key1 = t0.key1 or t1.key8 = t0.key1); id select_type table type possible_keys key key_len ref rows Extra @@ -283,11 +283,10 @@ union select * from t1 where key1<4 or key3=5; id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t1 index_merge i1,i2 i1,i2 4,4 NULL 2 Using union(i1,i2); Using where 2 UNION t1 index_merge i1,i3 i1,i3 4,4 NULL 2 Using sort_union(i1,i3); Using where -NULL UNION RESULT ALL NULL NULL NULL NULL NULL Using temporary +NULL UNION RESULT ALL NULL NULL NULL NULL NULL explain select * from (select * from t1 where key1 = 3 or key2 =3) as Z where key8 >5; id select_type table type possible_keys key key_len ref rows Extra -1 PRIMARY ALL NULL NULL NULL NULL 2 Using where -2 DERIVED t1 index_merge i1,i2 i1,i2 4,4 NULL 2 Using union(i1,i2); Using where +1 SIMPLE t1 index_merge i1,i2,i8 i1,i2 4,4 NULL 2 Using union(i1,i2); Using where create table t3 like t0; insert into t3 select * from t0; alter table t3 add key9 int not null, add index i9(key9); @@ -349,7 +348,7 @@ where (A.key1 < 500000 or A.key2 < 3) and (B.key1 < 500000 or B.key2 < 3); id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE A index_merge i1,i2 i1,i2 4,4 NULL # Using sort_union(i1,i2); Using where -1 SIMPLE B index_merge i1,i2 i1,i2 4,4 NULL # Using sort_union(i1,i2); Using where; Using join buffer (Block Nested Loop) +1 SIMPLE B index_merge i1,i2 i1,i2 4,4 NULL # Using sort_union(i1,i2); Using where; Using join buffer (flat, BNL join) select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) from t0 as A force index(i1,i2), t0 as B force index (i1,i2) where (A.key1 < 500000 or A.key2 < 3) @@ -363,7 +362,7 @@ where (A.key1 = 1 or A.key2 = 1) and (B.key1 = 1 or B.key2 = 1); id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE A index_merge i1,i2 i1,i2 4,4 NULL # Using union(i1,i2); Using where -1 SIMPLE B index_merge i1,i2 i1,i2 4,4 NULL # Using union(i1,i2); Using where; Using join buffer (Block Nested Loop) +1 SIMPLE B index_merge i1,i2 i1,i2 4,4 NULL # Using union(i1,i2); Using where; Using join buffer (flat, BNL join) select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) from t0 as A force index(i1,i2), t0 as B force index (i1,i2) where (A.key1 = 1 or A.key2 = 1) @@ -517,9 +516,10 @@ explain select * from t1 where exists (select 1 from t2, t3 where t2.a=t1.a and (t3.a=t2.b or t3.b=t2.b or t3.b=t2.b+1)); id select_type table type possible_keys key key_len ref rows Extra -1 PRIMARY t1 ALL NULL NULL NULL NULL # Using where -2 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL # Using where -2 DEPENDENT SUBQUERY t3 ALL a,b NULL NULL NULL # Range checked for each record (index map: 0x3) +1 PRIMARY t1 ALL NULL NULL NULL NULL # +1 PRIMARY eq_ref distinct_key distinct_key 4 func # +2 MATERIALIZED t2 ALL NULL NULL NULL NULL # +2 MATERIALIZED t3 ALL a,b NULL NULL NULL # Range checked for each record (index map: 0x3) select * from t1 where exists (select 1 from t2, t3 where t2.a=t1.a and (t3.a=t2.b or t3.b=t2.b or t3.b=t2.b+1)); @@ -539,9 +539,6 @@ INSERT INTO t1 SELECT * FROM t1; INSERT INTO t1 SELECT * FROM t1; INSERT INTO t1 SELECT * FROM t1; INSERT INTO t1 SELECT * FROM t1; -SET SESSION sort_buffer_size=1; -Warnings: -Warning 1292 Truncated incorrect sort_buffer_size value: '1' EXPLAIN SELECT * FROM t1 FORCE INDEX(a,b) WHERE a LIKE 'a%' OR b LIKE 'b%' ORDER BY a,b; @@ -595,12 +592,12 @@ create table t0 as select * from t1; # Printing of many insert into t0 values (....) disabled. alter table t1 disable keys; Warnings: -Note 1031 Table storage engine for 't1' doesn't have this option +Note 1031 Storage engine ROCKSDB of the table `test`.`t1` doesn't have this option # Printing of many insert into t1 select .... from t0 disabled. # Printing of many insert into t1 (...) values (....) disabled. alter table t1 enable keys; Warnings: -Note 1031 Table storage engine for 't1' doesn't have this option +Note 1031 Storage engine ROCKSDB of the table `test`.`t1` doesn't have this option select count(*) from t1; count(*) 64801 @@ -1291,7 +1288,7 @@ primary key (pk1, pk2) ); explain select * from t1 where pk1 = 1 and pk2 < 80 and key1=0; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ref PRIMARY,key1 key1 8 const,const ROWS Using index condition +1 SIMPLE t1 range PRIMARY,key1 key1 12 NULL ROWS Using index condition select * from t1 where pk1 = 1 and pk2 < 80 and key1=0; pk1 pk2 key1 key2 pktail1ok pktail2ok pktail3bad pktail4bad pktail5bad pk2copy badkey filler1 filler2 1 10 0 0 0 0 0 0 0 10 0 filler-data-10 filler2 @@ -1324,7 +1321,7 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref key1 key1 4 const ROWS Using where explain select * from t1 where pk1 < 7500 and key1 = 10; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 index_merge PRIMARY,key1 key1,PRIMARY 8,4 NULL ROWS Using intersect(key1,PRIMARY); Using where +1 SIMPLE t1 range PRIMARY,key1 key1 8 NULL ROWS Using index condition explain select * from t1 where pktail1ok=1 and key1=10; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref key1,pktail1ok key1 4 const 1 Using where @@ -1396,7 +1393,7 @@ EXPLAIN SELECT t1.f1 FROM t1 WHERE (SELECT COUNT(*) FROM t2 WHERE t2.f3 = 'h' AND t2.f2 = t1.f1) = 0 AND t1.f1 = 2; id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t1 const PRIMARY PRIMARY 4 const 1 Using index -2 DEPENDENT SUBQUERY t2 ref f2,f3 f2 5 const 1 Using where +2 SUBQUERY t2 ref f2,f3 f2 5 const 1 Using where DROP TABLE t1,t2; set global rocksdb_force_flush_memtable_now=1; # @@ -1415,5 +1412,5 @@ INSERT INTO t1 SELECT id + 8, id2 + 8, id3 +8 FROM t1; INSERT INTO t1 SELECT id + 16, 7, 0 FROM t1; EXPLAIN SELECT SQL_NO_CACHE count(*) FROM t1 WHERE id2=7 AND id3=0; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ref id2,id3,covering_index id2 4 const 1 Using where +1 SIMPLE t1 ref id2,id3,covering_index covering_index 8 const,const 1 Using index DROP TABLE t1; diff --git a/storage/rocksdb/mysql-test/rocksdb/r/mariadb_misc_binlog.result b/storage/rocksdb/mysql-test/rocksdb/r/mariadb_misc_binlog.result new file mode 100644 index 00000000000..e4ac62aa481 --- /dev/null +++ b/storage/rocksdb/mysql-test/rocksdb/r/mariadb_misc_binlog.result @@ -0,0 +1,24 @@ +create table t1 (a int) engine=rocksdb; +# Should have binlog ON +select @@log_bin; +@@log_bin +1 +set binlog_format='row'; +# Should succeed +optimize table t1; +Table Op Msg_type Msg_text +test.t1 optimize status OK +# +# MDEV-13602: rocksdb.index_merge_rocksdb2 failed in buildbot +# +lock tables t1 write; +insert into t1 values(1); +unlock tables; +set @tmp_bf= @@binlog_format; +set binlog_format='STATEMENT'; +lock tables t1 write; +insert into t1 values(1); +ERROR HY000: Can't execute updates on master with binlog_format != ROW. +unlock tables; +set @@binlog_format=@tmp_bf; +drop table t1; diff --git a/storage/rocksdb/mysql-test/rocksdb/r/rocksdb.result b/storage/rocksdb/mysql-test/rocksdb/r/rocksdb.result index 6a240d3126c..b3dba1612a5 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/rocksdb.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/rocksdb.result @@ -1351,7 +1351,6 @@ insert into t1 select (@a:=@a+1), 1234 from information_schema.session_variables set @tmp1= @@rocksdb_max_row_locks; set rocksdb_max_row_locks= 20; update t1 set a=a+10; -ERROR HY000: Got error 197 'Number of locks held reached @@rocksdb_max_row_locks.' from ROCKSDB DROP TABLE t1; # # Test AUTO_INCREMENT behavior problem, @@ -1467,10 +1466,10 @@ Rocksdb_system_rows_inserted # Rocksdb_system_rows_read # Rocksdb_system_rows_updated # Rocksdb_block_cache_add # -Rocksdb_block_cache_data_hit # -Rocksdb_block_cache_data_miss # -Rocksdb_block_cache_filter_hit # -Rocksdb_block_cache_filter_miss # +rocksdb_memtable_total # +rocksdb_memtable_unflushed # +rocksdb_queries_point # +rocksdb_queries_range # Rocksdb_block_cache_hit # rocksdb_memtable_total # rocksdb_memtable_unflushed # @@ -1501,9 +1500,6 @@ Rocksdb_memtable_hit # Rocksdb_memtable_miss # Rocksdb_no_file_closes # Rocksdb_no_file_errors # -Rocksdb_no_file_opens # -Rocksdb_num_iterators # -Rocksdb_number_block_not_compressed # Rocksdb_number_deletes_filtered # Rocksdb_number_keys_read # Rocksdb_number_keys_updated # diff --git a/storage/rocksdb/mysql-test/rocksdb/r/rocksdb_icp.result b/storage/rocksdb/mysql-test/rocksdb/r/rocksdb_icp.result index b2b6d7cdde9..9ef1ff28f10 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/rocksdb_icp.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/rocksdb_icp.result @@ -240,12 +240,12 @@ A.a+10*B.a+100*C.a, from t0 A, t0 B, t0 C; set @count=0; explain -select * from t1 where key1=1; +select * from t1 force index(key1) where key1=1; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref key1 key1 9 const # set @count_diff =(select (value - @count) from information_schema.rocksdb_perf_context where table_schema=database() and table_name='t1' and stat_type='INTERNAL_KEY_SKIPPED_COUNT'); -select * from t1 where key1=1; +select * from t1 force index(key1) where key1=1; pk key1 col1 1 1 1234 set @count_diff =(select (value - @count) from information_schema.rocksdb_perf_context diff --git a/storage/rocksdb/mysql-test/rocksdb/r/rocksdb_parts.result b/storage/rocksdb/mysql-test/rocksdb/r/rocksdb_parts.result index 7bebbbec205..9ac7243071b 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/rocksdb_parts.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/rocksdb_parts.result @@ -45,9 +45,11 @@ insert into t1 values (1,10,10); insert into t1 values (2,10,10); insert into t1 values (11,20,20); insert into t1 values (12,20,20); +set @tmp_rfirr= @@rocksdb_force_index_records_in_range; +set rocksdb_force_index_records_in_range= 12; explain select * from t1 force index(col1) where col1=10; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ref col1 col1 5 const 2000 +1 SIMPLE t1 ref col1 col1 5 const # select * from t1 force index(col1) where col1=10; pk col1 col2 1 10 10 @@ -56,6 +58,7 @@ select * from t1 use index () where col1=10; pk col1 col2 2 10 10 1 10 10 +set rocksdb_force_index_records_in_range= @tmp_rfirr; drop table t1; # # Issue #108: Index-only scans do not work for partitioned tables and extended keys @@ -94,7 +97,7 @@ drop table t1, t2; CREATE TABLE t1 (c1 INT NOT NULL, c2 CHAR(5)) PARTITION BY HASH(c1) PARTITIONS 4; INSERT INTO t1 VALUES(1,'a'); RENAME TABLE t1 TO db3.t3; -ERROR HY000: Error on rename of './test/t1' to './db3/t3' (errno: 122 "Internal (unspecified) error in handler") +ERROR HY000: Error on rename of './test/t1' to './db3/t3' (errno: -1 "Internal error < 0 (Not system error)") SELECT * FROM t1; c1 c2 1 a @@ -121,3 +124,14 @@ t2 DROP TABLE t2; use test; DROP DATABASE db3; +# +# MDEV-13153 Assertion `global_status_var.global_memory_used == 0 ' +# failed upon server restart with partitioned RocksDB table +# +CREATE TABLE t1 (a INT) ENGINE=RocksDB PARTITION BY HASH(a) PARTITIONS 2; +INSERT INTO t1 (a) VALUES (1),(2); +ALTER TABLE t1 ADD PARTITION PARTITIONS 2; +SELECT 1; +1 +1 +DROP TABLE t1; diff --git a/storage/rocksdb/mysql-test/rocksdb/r/tbl_opt_data_index_dir.result b/storage/rocksdb/mysql-test/rocksdb/r/tbl_opt_data_index_dir.result index 9cb7e601e65..2350ed618a9 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/tbl_opt_data_index_dir.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/tbl_opt_data_index_dir.result @@ -3,14 +3,14 @@ CREATE TABLE t1 (a INT PRIMARY KEY, b CHAR(8)) ENGINE=rocksdb DATA DIRECTORY = ' ERROR HY000: Can't create table `test`.`t1` (errno: 140 "Wrong create options") show warnings; Level Code Message -Warning 1296 Got error 198 'Specifying DATA DIRECTORY for an individual table is not supported.' from ROCKSDB +Warning 1296 Got error 196 'Specifying DATA DIRECTORY for an individual table is not supported.' from ROCKSDB Error 1005 Can't create table `test`.`t1` (errno: 140 "Wrong create options") Warning 1030 Got error 140 "Wrong create options" from storage engine ROCKSDB CREATE TABLE t1 (a INT PRIMARY KEY, b CHAR(8)) ENGINE=rocksdb INDEX DIRECTORY = '/foo/bar/index'; ERROR HY000: Can't create table `test`.`t1` (errno: 140 "Wrong create options") show warnings; Level Code Message -Warning 1296 Got error 199 'Specifying INDEX DIRECTORY for an individual table is not supported.' from ROCKSDB +Warning 1296 Got error 197 'Specifying INDEX DIRECTORY for an individual table is not supported.' from ROCKSDB Error 1005 Can't create table `test`.`t1` (errno: 140 "Wrong create options") Warning 1030 Got error 140 "Wrong create options" from storage engine ROCKSDB CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY) ENGINE=rocksdb PARTITION BY RANGE (id) @@ -21,7 +21,6 @@ PARTITION P1 VALUES LESS THAN (2000) DATA DIRECTORY = '/foo/bar/data/', PARTITION P2 VALUES LESS THAN (MAXVALUE) ); -ERROR HY000: Got error 195 'Specifying DATA DIRECTORY for an individual table is not supported.' from ROCKSDB CREATE TABLE t1 (id int not null primary key) ENGINE=rocksdb PARTITION BY RANGE (id) ( PARTITION P0 VALUES LESS THAN (1000) @@ -30,4 +29,3 @@ PARTITION P1 VALUES LESS THAN (2000) INDEX DIRECTORY = '/foo/bar/data/', PARTITION P2 VALUES LESS THAN (MAXVALUE) ); -ERROR HY000: Got error 196 'Specifying INDEX DIRECTORY for an individual table is not supported.' from ROCKSDB diff --git a/storage/rocksdb/mysql-test/rocksdb/r/ttl_primary_read_filtering.result b/storage/rocksdb/mysql-test/rocksdb/r/ttl_primary_read_filtering.result index 0a91fe3fcbd..1df6e838bcd 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/ttl_primary_read_filtering.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/ttl_primary_read_filtering.result @@ -171,11 +171,14 @@ SELECT * FROM t1; a b 998 5 DROP TABLE t1; +connect con1,localhost,root,,; +connect con2,localhost,root,,; CREATE TABLE t1 ( a int PRIMARY KEY ) ENGINE=rocksdb COMMENT='ttl_duration=5;'; INSERT INTO t1 values (1); +connection con1; # Creating Snapshot (start transaction) BEGIN; SELECT * FROM t1; @@ -185,11 +188,13 @@ SELECT * FROM t1; a 1 # Switching to connection 2 +connection con2; set global rocksdb_force_flush_memtable_now=1; set global rocksdb_compact_cf='default'; SELECT * FROM t1; a # Switching to connection 1 +connection con1; SELECT * FROM t1; a 1 @@ -201,6 +206,10 @@ COMMIT; SELECT * FROM t1; a DROP TABLE t1; +disconnect con1; +disconnect con2; +connect con1,localhost,root,,; +connect con2,localhost,root,,; set global rocksdb_force_flush_memtable_now=1; set global rocksdb_compact_cf='default'; CREATE TABLE t1 ( @@ -208,11 +217,13 @@ a int PRIMARY KEY ) ENGINE=rocksdb COMMENT='ttl_duration=1;'; # On Connection 1 +connection con1; # Creating Snapshot (start transaction) BEGIN; SELECT * FROM t1; a # On Connection 2 +connection con2; set global rocksdb_debug_ttl_rec_ts = -2; INSERT INTO t1 values (1); INSERT INTO t1 values (3); @@ -222,9 +233,11 @@ set global rocksdb_debug_ttl_rec_ts = 0; set global rocksdb_force_flush_memtable_now=1; set global rocksdb_compact_cf='default'; # On Connection 1 +connection con1; SELECT * FROM t1; a # On Connection 2 +connection con2; SELECT * FROM t1; a set global rocksdb_enable_ttl_read_filtering=0; @@ -235,4 +248,7 @@ a 5 7 set global rocksdb_enable_ttl_read_filtering=1; +disconnect con2; +disconnect con1; +connection default; DROP TABLE t1; diff --git a/storage/rocksdb/mysql-test/rocksdb/r/ttl_primary_with_partitions.result b/storage/rocksdb/mysql-test/rocksdb/r/ttl_primary_with_partitions.result index 3816accad8c..d6d9e290e9f 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/ttl_primary_with_partitions.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/ttl_primary_with_partitions.result @@ -144,16 +144,16 @@ set global rocksdb_debug_ttl_rec_ts = 0; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `c1` int(11) NOT NULL DEFAULT '0', - `c2` int(11) NOT NULL DEFAULT '0', + `c1` int(11) NOT NULL, + `c2` int(11) NOT NULL, `name` varchar(25) NOT NULL, `event` date DEFAULT NULL, PRIMARY KEY (`c2`,`c1`) COMMENT 'custom_p0_cfname=foo;custom_p1_cfname=bar;custom_p2_cfname=baz;' ) ENGINE=ROCKSDB DEFAULT CHARSET=latin1 COMMENT='custom_p0_ttl_duration=9999;custom_p2_ttl_duration=5;' -/*!50100 PARTITION BY LIST (c1) -(PARTITION custom_p0 VALUES IN (1,2,3) ENGINE = ROCKSDB, - PARTITION custom_p1 VALUES IN (4,5,6) ENGINE = ROCKSDB, - PARTITION custom_p2 VALUES IN (7,8,9) ENGINE = ROCKSDB) */ + PARTITION BY LIST (`c1`) +(PARTITION `custom_p0` VALUES IN (1,2,3) ENGINE = ROCKSDB, + PARTITION `custom_p1` VALUES IN (4,5,6) ENGINE = ROCKSDB, + PARTITION `custom_p2` VALUES IN (7,8,9) ENGINE = ROCKSDB) set global rocksdb_debug_ttl_snapshot_ts = 100; set global rocksdb_force_flush_memtable_now=1; set @@global.rocksdb_compact_cf = 'baz'; diff --git a/storage/rocksdb/mysql-test/rocksdb/r/type_varchar.result b/storage/rocksdb/mysql-test/rocksdb/r/type_varchar.result index 365a9b7b3b3..c9fa716dffc 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/type_varchar.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/type_varchar.result @@ -206,10 +206,10 @@ a 61 ab 6162 # Must show 'using index' for latin1_bin and utf8_bin: explain -select col1, hex(col1) from t1 where col1 < 'b'; +select col1, hex(col1) from t1 force index(col1) where col1 < 'b'; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 # col1 col1 67 NULL # Using where; Using index -select col1, hex(col1) from t1 where col1 < 'b'; +select col1, hex(col1) from t1 force index(col1) where col1 < 'b'; col1 hex(col1) a 61202009 a 6120 @@ -321,10 +321,10 @@ a 61 ab 6162 # Must show 'using index' for latin1_bin and utf8_bin: explain -select col1, hex(col1) from t1 where col1 < 'b'; +select col1, hex(col1) from t1 force index(col1) where col1 < 'b'; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 # col1 col1 195 NULL # Using where; Using index -select col1, hex(col1) from t1 where col1 < 'b'; +select col1, hex(col1) from t1 force index(col1) where col1 < 'b'; col1 hex(col1) a 61202009 a 6120 @@ -436,10 +436,10 @@ a 0061 a 0061002000200009 # Must show 'using index' for latin1_bin and utf8_bin: explain -select col1, hex(col1) from t1 where col1 < 'b'; +select col1, hex(col1) from t1 force index(col1) where col1 < 'b'; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 # col1 col1 131 NULL # Using where -select col1, hex(col1) from t1 where col1 < 'b'; +select col1, hex(col1) from t1 force index(col1) where col1 < 'b'; col1 hex(col1) a 0061002000200009 a 00610020 @@ -551,10 +551,10 @@ a 61 a 61202009 # Must show 'using index' for latin1_bin and utf8_bin: explain -select col1, hex(col1) from t1 where col1 < 'b'; +select col1, hex(col1) from t1 force index(col1) where col1 < 'b'; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 # col1 col1 259 NULL # Using where -select col1, hex(col1) from t1 where col1 < 'b'; +select col1, hex(col1) from t1 force index(col1) where col1 < 'b'; col1 hex(col1) a 61202009 a 6120 @@ -666,10 +666,10 @@ a 0061 a 0061002000200009 # Must show 'using index' for latin1_bin and utf8_bin: explain -select col1, hex(col1) from t1 where col1 < 'b'; +select col1, hex(col1) from t1 force index(col1) where col1 < 'b'; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 # col1 col1 259 NULL # Using where -select col1, hex(col1) from t1 where col1 < 'b'; +select col1, hex(col1) from t1 force index(col1) where col1 < 'b'; col1 hex(col1) a 0061002000200009 a 00610020 diff --git a/storage/rocksdb/mysql-test/rocksdb/r/use_direct_reads_writes.result b/storage/rocksdb/mysql-test/rocksdb/r/use_direct_reads_writes.result index 414e6279ab3..35334361d01 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/use_direct_reads_writes.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/use_direct_reads_writes.result @@ -1,4 +1,27 @@ call mtr.add_suppression("rocksdb"); call mtr.add_suppression("Aborting"); +# This shows that RocksDB plugin is loaded: +select plugin_name, plugin_type from information_schema.plugins where plugin_name='RocksDB'; +plugin_name plugin_type +ROCKSDB STORAGE ENGINE +# Check that ROCKSDB plugin is not loaded: +select plugin_name, plugin_type from information_schema.plugins where plugin_name='RocksDB'; +plugin_name plugin_type +# Check that MyRocks has printed an error message into server error log: FOUND 1 /enable both use_direct_reads/ in mysqld.1.err FOUND 1 /enable both use_direct_io_for_flush_and_compaction/ in mysqld.1.err +# Now, restart the server back with regular settings +select plugin_name, plugin_type from information_schema.plugins where plugin_name='RocksDB'; +plugin_name plugin_type +ROCKSDB STORAGE ENGINE +# +# Now, repeat the same with another set of invalid arguments +# +# Check that ROCKSDB plugin is not loaded: +select plugin_name, plugin_type from information_schema.plugins where plugin_name='RocksDB'; +plugin_name plugin_type +FOUND 1 /enable both use_direct_io_for_flush_and_compaction/ in mysqld.1.err +# Now, restart the server back with regular settings +select plugin_name, plugin_type from information_schema.plugins where plugin_name='RocksDB'; +plugin_name plugin_type +ROCKSDB STORAGE ENGINE diff --git a/storage/rocksdb/mysql-test/rocksdb/r/varbinary_format.result b/storage/rocksdb/mysql-test/rocksdb/r/varbinary_format.result index 9362d42515c..8b4634bb6e2 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/varbinary_format.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/varbinary_format.result @@ -62,11 +62,11 @@ SUBSTRING(a.key,9) 000000000000000009000000000000000009000000000000000009000000000000000009000000000000000001 ROLLBACK; DROP TABLE t1; -set session debug= '+d,MYROCKS_LEGACY_VARBINARY_FORMAT'; +set session debug_dbug= '+d,MYROCKS_LEGACY_VARBINARY_FORMAT'; CREATE TABLE t1( vb VARBINARY(64) primary key ) ENGINE=rocksdb; -set session debug= '-d,MYROCKS_LEGACY_VARBINARY_FORMAT'; +set session debug_dbug= '-d,MYROCKS_LEGACY_VARBINARY_FORMAT'; INSERT INTO t1 values(0x00); INSERT INTO t1 values(0x0000); INSERT INTO t1 values(0x0000000000000000); @@ -192,11 +192,11 @@ SUBSTRING(a.key,9) 616161616161616109616161616161616109616161616161616109616161616161616109610000000000000001 ROLLBACK; DROP TABLE t1; -set session debug= '+d,MYROCKS_LEGACY_VARBINARY_FORMAT'; +set session debug_dbug= '+d,MYROCKS_LEGACY_VARBINARY_FORMAT'; CREATE TABLE t1( vc VARCHAR(64) collate 'binary' primary key ) ENGINE=rocksdb; -set session debug= '-d,MYROCKS_LEGACY_VARBINARY_FORMAT'; +set session debug_dbug= '-d,MYROCKS_LEGACY_VARBINARY_FORMAT'; INSERT INTO t1 values('a'); INSERT INTO t1 values('aa'); INSERT INTO t1 values('aaaaaaaa'); diff --git a/storage/rocksdb/mysql-test/rocksdb/t/bloomfilter.inc b/storage/rocksdb/mysql-test/rocksdb/t/bloomfilter.inc index 9d62f590c04..1fb9ef8a0e7 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/bloomfilter.inc +++ b/storage/rocksdb/mysql-test/rocksdb/t/bloomfilter.inc @@ -12,7 +12,6 @@ select case when variable_value-@c > 0 then 'true' else 'false' end as checked f END// DELIMITER ;// - #BF is sometimes invoked and useful --let $CF= --source bloomfilter_table_def.inc @@ -23,30 +22,42 @@ DELIMITER ;// --source bloomfilter_table_def.inc --source bloomfilter_load_select.inc ---exec sed s/##CF##/" COMMENT 'rev:cf_short_prefix'"/g $tmpl_ddl > $ddl ---source $ddl ---source suite/rocksdb/t/bloomfilter_load_select.inc +--let $CF=COMMENT 'rev:cf_short_prefix' +--source bloomfilter_table_def.inc +--source bloomfilter_load_select.inc #BF is most of the time invoked and useful --let $CF=COMMENT 'cf_long_prefix' --source bloomfilter_table_def.inc --source bloomfilter_load_select.inc ---exec sed s/##CF##/" COMMENT 'rev:cf_long_prefix'"/g $tmpl_ddl > $ddl ---source $ddl ---source suite/rocksdb/t/bloomfilter_load_select.inc +--let $CF=COMMENT 'rev:cf_long_prefix' +--source bloomfilter_table_def.inc +--source bloomfilter_load_select.inc # BUG: Prev() with prefix lookup should not use prefix bloom filter create table r1 (id1 bigint, id2 bigint, id3 bigint, v1 int, v2 text, primary key (id1, id2, id3)) engine=rocksdb DEFAULT CHARSET=latin1 collate latin1_bin; --disable_query_log -let $max = 100000; +let $max = 100; let $i = 1; + +create table t10(a int primary key); +insert into t10 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); + +create table t11(a int primary key); +insert into t11 select A.a + B.a* 10 + C.a * 100 from t10 A, t10 B, t10 C; + +set @a=0; +set rocksdb_bulk_load=1; while ($i <= $max) { - let $insert = INSERT INTO r1 VALUES ($i,$i,$i,$i,$i); inc $i; - eval $insert; + eval insert into r1 select @a:=@a+1, @a, @a, @a, @a from t11; } +set rocksdb_bulk_load=0; + +drop table t10, t11; + --enable_query_log call bloom_start(); select * from r1 where id1=1 and id2 in (1) order by id3 asc; diff --git a/storage/rocksdb/mysql-test/rocksdb/t/bulk_load.test b/storage/rocksdb/mysql-test/rocksdb/t/bulk_load.test index 43b1d3e8415..6c6c75dd37e 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/bulk_load.test +++ b/storage/rocksdb/mysql-test/rocksdb/t/bulk_load.test @@ -8,4 +8,3 @@ --let data_order_desc=0 --source bulk_load.inc ---remove_file $file diff --git a/storage/rocksdb/mysql-test/rocksdb/t/bulk_load_errors.test b/storage/rocksdb/mysql-test/rocksdb/t/bulk_load_errors.test index b80361f325c..4a4c42d1fcd 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/bulk_load_errors.test +++ b/storage/rocksdb/mysql-test/rocksdb/t/bulk_load_errors.test @@ -21,21 +21,18 @@ INSERT INTO t1 VALUES(2); INSERT INTO t1 VALUES(20); INSERT INTO t1 VALUES(21); -# This last crashes the server (intentionally) because we can't return any -# error information from a SET = ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect ---error 2013 +--echo # +--echo # In MyRocks, the following statement will intentionally crash the server. +--echo # In MariaDB, it will cause an error +--error ER_OVERLAPPING_KEYS SET rocksdb_bulk_load=0; ---exec grep "RocksDB: Error 197 finalizing last SST file while setting bulk loading variable" $MYSQLTEST_VARDIR/log/mysqld.1.err | cut -d] -f2 ---exec echo "" >$MYSQLTEST_VARDIR/log/mysqld.1.err +--echo # +--echo # Despite the error, bulk load operation is over so the variable value +--echo # will be 0: +select @@rocksdb_bulk_load; -# restart the crashed server ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect - -# Make sure the error exists in the .err log and then restart the server ---enable_reconnect ---source include/wait_until_connected_again.inc +call mtr.add_suppression('finalizing last SST file while setting bulk loading variable'); TRUNCATE TABLE t1; diff --git a/storage/rocksdb/mysql-test/rocksdb/t/bulk_load_rev_cf.test b/storage/rocksdb/mysql-test/rocksdb/t/bulk_load_rev_cf.test index 5aec6ff5e99..7c4d7aef0e5 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/bulk_load_rev_cf.test +++ b/storage/rocksdb/mysql-test/rocksdb/t/bulk_load_rev_cf.test @@ -1,4 +1,7 @@ --source include/have_rocksdb.inc +--source include/have_partition.inc + +--source include/big_test.inc --let pk_cf=rev:cf1 --let data_order_desc=0 diff --git a/storage/rocksdb/mysql-test/rocksdb/t/bulk_load_rev_cf_and_data.test b/storage/rocksdb/mysql-test/rocksdb/t/bulk_load_rev_cf_and_data.test index 83006f9e446..a31e86753f3 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/bulk_load_rev_cf_and_data.test +++ b/storage/rocksdb/mysql-test/rocksdb/t/bulk_load_rev_cf_and_data.test @@ -1,4 +1,7 @@ --source include/have_rocksdb.inc +--source include/have_partition.inc + +--source include/big_test.inc --let pk_cf=rev:cf1 --let data_order_desc=1 diff --git a/storage/rocksdb/mysql-test/rocksdb/t/bulk_load_rev_data.test b/storage/rocksdb/mysql-test/rocksdb/t/bulk_load_rev_data.test index df7b6a7c821..f36990ed567 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/bulk_load_rev_data.test +++ b/storage/rocksdb/mysql-test/rocksdb/t/bulk_load_rev_data.test @@ -1,4 +1,7 @@ --source include/have_rocksdb.inc +--source include/have_partition.inc + +--source include/big_test.inc --let pk_cf=cf1 --let data_order_desc=1 diff --git a/storage/rocksdb/mysql-test/rocksdb/t/cardinality.test b/storage/rocksdb/mysql-test/rocksdb/t/cardinality.test index 0bc0ae4e900..689753faf8d 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/cardinality.test +++ b/storage/rocksdb/mysql-test/rocksdb/t/cardinality.test @@ -3,7 +3,7 @@ --source include/restart_mysqld.inc --disable_warnings -DROP TABLE IF EXISTS t1; +DROP TABLE IF EXISTS t1,t10,t11; --enable_warnings create table t1( @@ -18,13 +18,26 @@ create table t1( index t1_4(c1, c2), index t1_5(c2, c1) ) engine=rocksdb; + --disable_query_log +create table t10(a int primary key); +insert into t10 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); + +create table t11(a int primary key); +insert into t11 select A.a + B.a* 10 + C.a * 100 from t10 A, t10 B, t10 C; + +set @a=0; let $i=0; -while ($i<100000) +set rocksdb_bulk_load=1; +while ($i<100) { inc $i; - eval insert t1(id, i1, i2, c1, c2) values($i, $i, $i div 10, $i, $i div 10); + eval insert into t1 select (@a:=@a+1), @a, @a div 10, @a, @a div 10 from t11; } +set rocksdb_bulk_load=0; + +drop table t10; +drop table t11; --enable_query_log # Flush memtable out to SST and display index cardinalities diff --git a/storage/rocksdb/mysql-test/rocksdb/t/disabled.def b/storage/rocksdb/mysql-test/rocksdb/t/disabled.def index cff53e6370e..842b85f87c9 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/disabled.def +++ b/storage/rocksdb/mysql-test/rocksdb/t/disabled.def @@ -7,6 +7,7 @@ level_serializable: Not supported slow_query_log: MDEV-11480 select_for_update_skip_locked_nowait: MDEV-11481 rpl_read_free: MDEV-10976 +lock_wait_timeout_stats: MDEV-13404 optimizer_loose_index_scans: MariaDB doesnt support Skip Scan @@ -40,6 +41,7 @@ mysqldump : MariaRocks: MariaDB's mysqldump doesn't support --print-ordering-key mysqldump2 : MariaRocks: MariaDB's mysqldump doesn't support --print-ordering-key show_engine : MariaRocks: MariaDB doesnt support SHOW ENGINE rocksdb TRANSACTION STATUS +issue243_transactionStatus: MariaDB doesnt support SHOW ENGINE rocksdb TRANSACTION STATUS rpl_row_not_found : MariaDB doesnt support slave_exec_mode='SEMI_STRICT' @@ -60,6 +62,16 @@ rocksdb_deadlock_stress_rr: stress test # MDEV-12474 Regularly failing tests on Buildbot autoinc_vars_thread : MDEV-12474 Regularly fails on buildbot -validate_datadic : MDEV-12474 Regularly fails on buildbot unique_check : MDEV-12474 Regularly fails on buildbot bloomfilter : MDEV-12474 Regularly fails on buildbot + +compact_deletes: MDEV-12663 : rocksdb.compact_deletes times out and causes other tests to fail + +col_opt_not_null : MDEV-12474 - Fails in fulltest +col_opt_null : : MDEV-12474 - Fails in fulltest +col_opt_unsigned : MDEV-12474 - Fails in fulltest +col_opt_zerofill : MDEV-12474 - Fails in fulltest +type_float : MDEV-12474 - Fails in fulltest + +native_procedure : Not supported in MariaDB + diff --git a/storage/rocksdb/mysql-test/rocksdb/t/drop_table.test b/storage/rocksdb/mysql-test/rocksdb/t/drop_table.test index b62d3fbcb2d..0d3dee5ab17 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/drop_table.test +++ b/storage/rocksdb/mysql-test/rocksdb/t/drop_table.test @@ -113,46 +113,6 @@ let $wait_condition = select count(*) = 0 ## Upstream has removed the following: --disable_parsing -perl; - -sub print_array { - $str = shift; - $prev= $_[0]; - foreach (@_) { - $dummy_idx = $_ - $prev; - $prev= $_; - print "$str $dummy_idx\n"; - } -} - -$filename= "$ENV{MYSQLTEST_VARDIR}/log/mysqld.1.err"; -open(F, '<', $filename) || die("Can't open file $filename: $!"); -while () { - %a = @b = @c = () if /CURRENT_TEST/; - if (/Compacting away elements from dropped index \(\d+,(\d+)\): (\d+)/) { - $a{$1} += $2; - } - if (/Begin filtering dropped index \(\d+,(\d+)\)/) { - push @b, $1; - } - if (/Finished filtering dropped index \(\d+,(\d+)\)/) { - push @c, $1; - } -} - -$prev= 0; -foreach (sort {$a <=> $b} keys %a){ - if ($prev) { - $dummy_idx= $_ - $prev; - }else { - $dummy_idx= 0; - } - $prev= $_; -} -print_array("Begin filtering dropped index+", sort {$a <=> $b} @b); -print_array("Finished filtering dropped index+", sort {$a <=> $b} @c); -EOF --enable_parsing - # Cleanup drop table t1; diff --git a/storage/rocksdb/mysql-test/rocksdb/t/duplicate_table.test b/storage/rocksdb/mysql-test/rocksdb/t/duplicate_table.test index 9ac89a128c9..875f8514d8f 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/duplicate_table.test +++ b/storage/rocksdb/mysql-test/rocksdb/t/duplicate_table.test @@ -8,7 +8,7 @@ INSERT INTO t values (1), (2), (3); CREATE TABLE t(id int primary key) engine=rocksdb; FLUSH TABLES; move_file $MYSQLTEST_VARDIR/mysqld.1/data/test/t.frm $MYSQLTEST_VARDIR/mysqld.1/data/test/t.frm.tmp; ---error ER_UNKNOWN_ERROR +--error ER_METADATA_INCONSISTENCY CREATE TABLE t(id int primary key) engine=rocksdb; move_file $MYSQLTEST_VARDIR/mysqld.1/data/test/t.frm.tmp $MYSQLTEST_VARDIR/mysqld.1/data/test/t.frm; FLUSH TABLES; diff --git a/storage/rocksdb/mysql-test/rocksdb/t/mariadb_misc_binlog-master.opt b/storage/rocksdb/mysql-test/rocksdb/t/mariadb_misc_binlog-master.opt new file mode 100644 index 00000000000..beae84b3862 --- /dev/null +++ b/storage/rocksdb/mysql-test/rocksdb/t/mariadb_misc_binlog-master.opt @@ -0,0 +1 @@ +--log-bin diff --git a/storage/rocksdb/mysql-test/rocksdb/t/mariadb_misc_binlog.test b/storage/rocksdb/mysql-test/rocksdb/t/mariadb_misc_binlog.test new file mode 100644 index 00000000000..fb150f7a791 --- /dev/null +++ b/storage/rocksdb/mysql-test/rocksdb/t/mariadb_misc_binlog.test @@ -0,0 +1,30 @@ +--source include/have_rocksdb.inc + +create table t1 (a int) engine=rocksdb; + +--echo # Should have binlog ON +select @@log_bin; + +set binlog_format='row'; + +--echo # Should succeed +optimize table t1; + +--echo # +--echo # MDEV-13602: rocksdb.index_merge_rocksdb2 failed in buildbot +--echo # + +lock tables t1 write; +insert into t1 values(1); +unlock tables; + +set @tmp_bf= @@binlog_format; +set binlog_format='STATEMENT'; +lock tables t1 write; +--error ER_REQUIRE_ROW_BINLOG_FORMAT +insert into t1 values(1); +unlock tables; +set @@binlog_format=@tmp_bf; + +drop table t1; + diff --git a/storage/rocksdb/mysql-test/rocksdb/t/prefix_extractor_override.test b/storage/rocksdb/mysql-test/rocksdb/t/prefix_extractor_override.test index 13d76bb5a3f..c6b91071171 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/prefix_extractor_override.test +++ b/storage/rocksdb/mysql-test/rocksdb/t/prefix_extractor_override.test @@ -26,7 +26,9 @@ select variable_value into @u from information_schema.global_status where variab SELECT COUNT(*) FROM t1 WHERE id1=1 AND id2=1 AND id3=1; select variable_value-@u from information_schema.global_status where variable_name='rocksdb_bloom_filter_prefix_checked'; ---exec echo "" > $MYSQLTEST_VARDIR/log/mysqld.1.err +# MariaDB: the following doesn't work on Windows and doesn't seem to be needed +# on Linux: +#--exec echo "" > $MYSQLTEST_VARDIR/log/mysqld.1.err --let $_mysqld_option=--rocksdb_override_cf_options=cf1={prefix_extractor=capped:26}; --echo diff --git a/storage/rocksdb/mysql-test/rocksdb/t/rocksdb_icp.test b/storage/rocksdb/mysql-test/rocksdb/t/rocksdb_icp.test index 8bd93845e86..8d0ec89e85a 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/rocksdb_icp.test +++ b/storage/rocksdb/mysql-test/rocksdb/t/rocksdb_icp.test @@ -32,10 +32,10 @@ set @count_diff =(select (value - @count) from information_schema.rocksdb_perf_c --replace_column 9 # explain -select * from t1 where key1=1; +select * from t1 force index(key1) where key1=1; eval $save_query; -select * from t1 where key1=1; +select * from t1 force index(key1) where key1=1; eval $save_query; --echo # The following must be =1, or in any case not 999: select @count_diff as "INTERNAL_KEY_SKIPPED_COUNT increment"; diff --git a/storage/rocksdb/mysql-test/rocksdb/t/rocksdb_parts.test b/storage/rocksdb/mysql-test/rocksdb/t/rocksdb_parts.test index 59472e565ab..a0768667385 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/rocksdb_parts.test +++ b/storage/rocksdb/mysql-test/rocksdb/t/rocksdb_parts.test @@ -55,9 +55,17 @@ insert into t1 values (2,10,10); insert into t1 values (11,20,20); insert into t1 values (12,20,20); + +set @tmp_rfirr= @@rocksdb_force_index_records_in_range; +set rocksdb_force_index_records_in_range= 12; + +--replace_column 9 # explain select * from t1 force index(col1) where col1=10; select * from t1 force index(col1) where col1=10; select * from t1 use index () where col1=10; + +set rocksdb_force_index_records_in_range= @tmp_rfirr; + drop table t1; --echo # @@ -120,3 +128,14 @@ DROP TABLE t2; use test; DROP DATABASE db3; +--echo # +--echo # MDEV-13153 Assertion `global_status_var.global_memory_used == 0 ' +--echo # failed upon server restart with partitioned RocksDB table +--echo # +CREATE TABLE t1 (a INT) ENGINE=RocksDB PARTITION BY HASH(a) PARTITIONS 2; +INSERT INTO t1 (a) VALUES (1),(2); +ALTER TABLE t1 ADD PARTITION PARTITIONS 2; +--source include/restart_mysqld.inc +SELECT 1; +DROP TABLE t1; + diff --git a/storage/rocksdb/mysql-test/rocksdb/t/ttl_primary_with_partitions.test b/storage/rocksdb/mysql-test/rocksdb/t/ttl_primary_with_partitions.test index dd1a97b32df..aba2b594db5 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/ttl_primary_with_partitions.test +++ b/storage/rocksdb/mysql-test/rocksdb/t/ttl_primary_with_partitions.test @@ -1,5 +1,6 @@ --source include/have_debug.inc --source include/have_rocksdb.inc +--source include/have_partition.inc # # Create a table with multiple partitions, but in the comment don't specify diff --git a/storage/rocksdb/mysql-test/rocksdb/t/type_varchar_endspace.inc b/storage/rocksdb/mysql-test/rocksdb/t/type_varchar_endspace.inc index bcca0c3a499..494f0ea1395 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/type_varchar_endspace.inc +++ b/storage/rocksdb/mysql-test/rocksdb/t/type_varchar_endspace.inc @@ -53,8 +53,8 @@ select col1, hex(col1) from t1; --echo # Must show 'using index' for latin1_bin and utf8_bin: --replace_column 4 # 9 # explain -select col1, hex(col1) from t1 where col1 < 'b'; -select col1, hex(col1) from t1 where col1 < 'b'; +select col1, hex(col1) from t1 force index(col1) where col1 < 'b'; +select col1, hex(col1) from t1 force index(col1) where col1 < 'b'; delete from t1; insert into t1 values(10, '', 'empty'); diff --git a/storage/rocksdb/mysql-test/rocksdb/t/use_direct_reads_writes.test b/storage/rocksdb/mysql-test/rocksdb/t/use_direct_reads_writes.test index 071dbece7b0..7a053c659b2 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/use_direct_reads_writes.test +++ b/storage/rocksdb/mysql-test/rocksdb/t/use_direct_reads_writes.test @@ -3,46 +3,45 @@ call mtr.add_suppression("rocksdb"); call mtr.add_suppression("Aborting"); +--echo # This shows that RocksDB plugin is loaded: +select plugin_name, plugin_type from information_schema.plugins where plugin_name='RocksDB'; + # Issue221 # Turning on both --rocksdb-allow-mmap-reads and --rocksdb-use-direct-reads -# caused an assertion in RocksDB. Now it should not be allowed and the -# server will not start with that configuration +# caused an assertion in RocksDB. Now it should not be allowed and ROCKSDB +# plugin will not load in such configuration. +# +# We want the server to still start, so we specify default-storage-engine=myisam -# Write file to make mysql-test-run.pl expect the "crash", but don't restart -# the server until it is told to ---let $_server_id= `SELECT @@server_id` ---let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.$_server_id.expect ---exec echo "wait" >$_expect_file_name -shutdown_server 10; +--let $_mysqld_option=--rocksdb_use_direct_reads=1 --rocksdb_allow_mmap_reads=1 --default-storage-engine=myisam +--source include/restart_mysqld_with_option.inc -# Attempt to restart the server with invalid options ---exec echo "restart:--rocksdb_use_direct_reads=1 --rocksdb_allow_mmap_reads=1" >$_expect_file_name ---sleep 0.1 # Wait 100ms - that is how long the sleep is in check_expected_crash_and_restart ---exec echo "restart:" >$_expect_file_name +--echo # Check that ROCKSDB plugin is not loaded: +select plugin_name, plugin_type from information_schema.plugins where plugin_name='RocksDB'; -# Cleanup ---enable_reconnect ---source include/wait_until_connected_again.inc ---disable_reconnect - -# We should now have an error message +--echo # Check that MyRocks has printed an error message into server error log: let SEARCH_FILE=$MYSQLTEST_VARDIR/log/mysqld.1.err; let SEARCH_PATTERN=enable both use_direct_reads; source include/search_pattern_in_file.inc; -# Repeat with --rocksdb-use-direct-writes ---let $_server_id= `SELECT @@server_id` ---let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.$_server_id.expect ---exec echo "wait" >$_expect_file_name -shutdown_server 10; +--echo # Now, restart the server back with regular settings +--source include/restart_mysqld.inc +select plugin_name, plugin_type from information_schema.plugins where plugin_name='RocksDB'; ---exec echo "restart:--rocksdb_use_direct_io_for_flush_and_compaction=1 --rocksdb_allow_mmap_writes=1" >$_expect_file_name ---sleep 0.1 ---exec echo "restart:" >$_expect_file_name +--echo # +--echo # Now, repeat the same with another set of invalid arguments +--echo # +--let $_mysqld_option=--rocksdb_use_direct_io_for_flush_and_compaction=1 --rocksdb_allow_mmap_writes=1 --default-storage-engine=myisam +--source include/restart_mysqld_with_option.inc ---enable_reconnect ---source include/wait_until_connected_again.inc ---disable_reconnect +--echo # Check that ROCKSDB plugin is not loaded: +select plugin_name, plugin_type from information_schema.plugins where plugin_name='RocksDB'; +let SEARCH_FILE=$MYSQLTEST_VARDIR/log/mysqld.1.err; let SEARCH_PATTERN=enable both use_direct_io_for_flush_and_compaction; source include/search_pattern_in_file.inc; + +--echo # Now, restart the server back with regular settings +--source include/restart_mysqld.inc +select plugin_name, plugin_type from information_schema.plugins where plugin_name='RocksDB'; + diff --git a/storage/rocksdb/mysql-test/rocksdb/t/varbinary_format.test b/storage/rocksdb/mysql-test/rocksdb/t/varbinary_format.test index d00a8b7afbe..d10082bb95c 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/varbinary_format.test +++ b/storage/rocksdb/mysql-test/rocksdb/t/varbinary_format.test @@ -34,11 +34,11 @@ DROP TABLE t1; # Now create the same table in the old format to show that they can be read # and handled correctly -set session debug= '+d,MYROCKS_LEGACY_VARBINARY_FORMAT'; +set session debug_dbug= '+d,MYROCKS_LEGACY_VARBINARY_FORMAT'; CREATE TABLE t1( vb VARBINARY(64) primary key ) ENGINE=rocksdb; -set session debug= '-d,MYROCKS_LEGACY_VARBINARY_FORMAT'; +set session debug_dbug= '-d,MYROCKS_LEGACY_VARBINARY_FORMAT'; INSERT INTO t1 values(0x00); INSERT INTO t1 values(0x0000); @@ -98,11 +98,11 @@ DROP TABLE t1; # Now create the same table in the old format to show that they can be read # and handled correctly -set session debug= '+d,MYROCKS_LEGACY_VARBINARY_FORMAT'; +set session debug_dbug= '+d,MYROCKS_LEGACY_VARBINARY_FORMAT'; CREATE TABLE t1( vc VARCHAR(64) collate 'binary' primary key ) ENGINE=rocksdb; -set session debug= '-d,MYROCKS_LEGACY_VARBINARY_FORMAT'; +set session debug_dbug= '-d,MYROCKS_LEGACY_VARBINARY_FORMAT'; INSERT INTO t1 values('a'); INSERT INTO t1 values('aa'); diff --git a/storage/rocksdb/mysql-test/rocksdb/t/write_sync.test b/storage/rocksdb/mysql-test/rocksdb/t/write_sync.test index ffa795bef88..c20bb1fc89c 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/write_sync.test +++ b/storage/rocksdb/mysql-test/rocksdb/t/write_sync.test @@ -5,7 +5,6 @@ SET GLOBAL rocksdb_write_disable_wal=false; SET GLOBAL rocksdb_write_ignore_missing_column_families=true; create table aaa (id int primary key, i int) engine rocksdb; -set @save_rocksdb_flush_log_at_trx_commit= @@global.rocksdb_flush_log_at_trx_commit; set @save_rocksdb_flush_log_at_trx_commit=@@global.rocksdb_flush_log_at_trx_commit; SET GLOBAL rocksdb_flush_log_at_trx_commit=1; --exec sleep 5 diff --git a/storage/rocksdb/mysql-test/rocksdb_sys_vars/t/rocksdb_update_cf_options_basic.test b/storage/rocksdb/mysql-test/rocksdb_sys_vars/t/rocksdb_update_cf_options_basic.test index 15d5d870ae6..0e675dafed3 100644 --- a/storage/rocksdb/mysql-test/rocksdb_sys_vars/t/rocksdb_update_cf_options_basic.test +++ b/storage/rocksdb/mysql-test/rocksdb_sys_vars/t/rocksdb_update_cf_options_basic.test @@ -1,4 +1,5 @@ --source include/have_rocksdb.inc +--source include/have_partition.inc call mtr.add_suppression("MyRocks: NULL is not a valid option for updates to column family settings."); call mtr.add_suppression("Invalid cf options, '=' expected *"); @@ -91,4 +92,4 @@ SELECT @@global.rocksdb_update_cf_options; USE test; -DROP TABLE t1; \ No newline at end of file +DROP TABLE t1; diff --git a/storage/rocksdb/mysql-test/storage_engine/cache_index.rdiff b/storage/rocksdb/mysql-test/storage_engine/cache_index.rdiff new file mode 100644 index 00000000000..76e7705e377 --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/cache_index.rdiff @@ -0,0 +1,71 @@ +--- /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/cache_index.result 2017-06-22 00:33:46.419995639 +0300 ++++ /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/cache_index.reject 2017-06-22 01:11:22.479981459 +0300 +@@ -12,31 +12,31 @@ + SET GLOBAL .key_buffer_size=128*1024; + CACHE INDEX t1 INDEX (a), t2 IN ; + Table Op Msg_type Msg_text +-test.t1 assign_to_keycache status OK +-test.t2 assign_to_keycache status OK ++test.t1 assign_to_keycache note The storage engine for the table doesn't support assign_to_keycache ++test.t2 assign_to_keycache note The storage engine for the table doesn't support assign_to_keycache + LOAD INDEX INTO CACHE t1, t2; + Table Op Msg_type Msg_text +-test.t1 preload_keys status OK +-test.t2 preload_keys status OK ++test.t1 preload_keys note The storage engine for the table doesn't support preload_keys ++test.t2 preload_keys note The storage engine for the table doesn't support preload_keys + INSERT INTO t1 (a,b) VALUES (3,'c'),(4,'d'); + SET GLOBAL .key_buffer_size=8*1024; + LOAD INDEX INTO CACHE t1, t2 IGNORE LEAVES; + Table Op Msg_type Msg_text +-test.t1 preload_keys status OK +-test.t2 preload_keys status OK ++test.t1 preload_keys note The storage engine for the table doesn't support preload_keys ++test.t2 preload_keys note The storage engine for the table doesn't support preload_keys + SET GLOBAL .key_cache_age_threshold = 100, .key_cache_block_size = 512, .key_cache_division_limit = 1, .key_cache_segments=2; + INSERT INTO t1 (a,b) VALUES (5,'e'),(6,'f'); + LOAD INDEX INTO CACHE t1; + Table Op Msg_type Msg_text +-test.t1 preload_keys status OK ++test.t1 preload_keys note The storage engine for the table doesn't support preload_keys + SET GLOBAL new_.key_buffer_size=128*1024; + CACHE INDEX t1 IN new_; + Table Op Msg_type Msg_text +-test.t1 assign_to_keycache status OK ++test.t1 assign_to_keycache note The storage engine for the table doesn't support assign_to_keycache + INSERT INTO t1 (a,b) VALUES (7,'g'),(8,'h'); + LOAD INDEX INTO CACHE t1 IGNORE LEAVES; + Table Op Msg_type Msg_text +-test.t1 preload_keys status OK ++test.t1 preload_keys note The storage engine for the table doesn't support preload_keys + INSERT INTO t1 (a,b) VALUES (9,'i'); + DROP TABLE t2; + DROP TABLE t1; +@@ -47,11 +47,11 @@ + ) ENGINE= ; + CACHE INDEX t1 IN ; + Table Op Msg_type Msg_text +-test.t1 assign_to_keycache status OK ++test.t1 assign_to_keycache note The storage engine for the table doesn't support assign_to_keycache + INSERT INTO t1 (a,b) VALUES (1,'a'),(2,'b'); + LOAD INDEX INTO CACHE t1; + Table Op Msg_type Msg_text +-test.t1 preload_keys status OK ++test.t1 preload_keys note The storage engine for the table doesn't support preload_keys + DROP TABLE t1; + CREATE TABLE t1 (a , + b , +@@ -59,11 +59,11 @@ + ) ENGINE= ; + CACHE INDEX t1 IN ; + Table Op Msg_type Msg_text +-test.t1 assign_to_keycache status OK ++test.t1 assign_to_keycache note The storage engine for the table doesn't support assign_to_keycache + INSERT INTO t1 (a,b) VALUES (1,'a'),(2,'b'); + LOAD INDEX INTO CACHE t1; + Table Op Msg_type Msg_text +-test.t1 preload_keys status OK ++test.t1 preload_keys note The storage engine for the table doesn't support preload_keys + DROP TABLE t1; + SET GLOBAL .key_buffer_size=0; + SET GLOBAL new_.key_buffer_size=0; diff --git a/storage/rocksdb/mysql-test/storage_engine/checksum_table_live.rdiff b/storage/rocksdb/mysql-test/storage_engine/checksum_table_live.rdiff new file mode 100644 index 00000000000..094136ee926 --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/checksum_table_live.rdiff @@ -0,0 +1,13 @@ +--- /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/checksum_table_live.result 2017-06-22 00:33:46.419995639 +0300 ++++ /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/checksum_table_live.reject 2017-06-22 01:12:38.695980980 +0300 +@@ -11,8 +11,8 @@ + test.t1 4272806499 + CHECKSUM TABLE t1, t2 QUICK; + Table Checksum +-test.t1 4272806499 +-test.t2 0 ++test.t1 NULL ++test.t2 NULL + CHECKSUM TABLE t1, t2 EXTENDED; + Table Checksum + test.t1 4272806499 diff --git a/storage/rocksdb/mysql-test/storage_engine/cleanup_engine.inc b/storage/rocksdb/mysql-test/storage_engine/cleanup_engine.inc new file mode 100644 index 00000000000..4f6c586172d --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/cleanup_engine.inc @@ -0,0 +1,25 @@ +########################################### +# +# This is a stub of the include file cleanup_engine.inc which +# should be placed in storage//mysql-test/storage_engine folder. +# +################################ +# +# Here you can add whatever is needed to cleanup +# in case your define_engine.inc created any artefacts, +# e.g. an additional schema and/or tables. + +--let $datadir= `SELECT @@datadir` + +--error 0,1 +--file_exists $datadir/.rocksdb/* +if (!$mysql_errno) +{ + --enable_reconnect + --exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect + --shutdown_server + --source include/wait_until_disconnected.inc + --rmdir $datadir/.rocksdb + --exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect + --source include/wait_until_connected_again.inc +} diff --git a/storage/rocksdb/mysql-test/storage_engine/define_engine.inc b/storage/rocksdb/mysql-test/storage_engine/define_engine.inc new file mode 100644 index 00000000000..1c77a6b6bb6 --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/define_engine.inc @@ -0,0 +1,45 @@ +########################################### +# +# This is a template of the include file define_engine.inc which +# should be placed in storage//mysql-test/storage_engine folder. +# +################################ +# +# The name of the engine under test must be defined in $ENGINE variable. +# You can set it either here (uncomment and edit) or in your environment. +# +let $ENGINE = RocksDB; +# +################################ +# +# The following three variables define specific options for columns and tables. +# Normally there should be none needed, but for some engines it can be different. +# If the engine requires specific column option for all or indexed columns, +# set them inside the comment, e.g. /*!NOT NULL*/. +# Do the same for table options if needed, e.g. /*!INSERT_METHOD=LAST*/ + +let $default_col_opts = /*!*/; +let $default_col_indexed_opts = /*!*/; +let $default_tbl_opts = /*!*/; + +# INDEX, UNIQUE INDEX, PRIMARY KEY, special index type - choose the fist that the engine allows, +# or set it to /*!*/ if none is supported + +let $default_index = /*!INDEX*/; + +# If the engine does not support the following types, replace them with the closest possible + +let $default_int_type = INT(11); +let $default_char_type = CHAR(8); + +################################ + +--disable_query_log +--disable_result_log + +# Here you can place your custom MTR code which needs to be executed before each test, +# e.g. creation of an additional schema or table, etc. +# The cleanup part should be defined in cleanup_engine.inc + +--enable_query_log +--enable_result_log diff --git a/storage/rocksdb/mysql-test/storage_engine/disabled.def b/storage/rocksdb/mysql-test/storage_engine/disabled.def new file mode 100644 index 00000000000..0643b2052e2 --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/disabled.def @@ -0,0 +1,25 @@ +alter_tablespace : Not supported +autoinc_secondary : Not supported +create_table : MDEV-12914 - Engine for temporary tables which are implicitly created as RocksDB is substituted silently +delete_low_prio : Not supported +foreign_keys : Not supported +fulltext_search : Not supported +handler : Not supported +index_enable_disable : Not supported +insert_delayed : Not supported +insert_high_prio : Not supported +insert_low_prio : Not supported +lock : MDEV-13148 - LOCK TABLE on RocksDB table fails with a bogus error message +lock_concurrent : MDEV-13148 - LOCK TABLE on RocksDB table fails with a bogus error message +optimize_table : MDEV-13148 - LOCK TABLE on RocksDB table fails with a bogus error message +repair_table : MDEV-13148 - LOCK TABLE on RocksDB table fails with a bogus error message +select_high_prio : Not supported +show_table_status : MDEV-13152 - Indeterministic row number in SHOW TABLE STATUS on RocksDB table +tbl_opt_data_dir : Not supported +tbl_opt_index_dir : Not supported +type_spatial : Not supported +type_spatial_indexes : Not supported +update_low_prio : Not supported +update_ignore : MDEV-13151 - Indeterministic results of multi-table update on RocksDB tables +update_multi : MDEV-13151 - Indeterministic results of multi-table update on RocksDB tables +vcol : Not supported diff --git a/storage/rocksdb/mysql-test/storage_engine/index.rdiff b/storage/rocksdb/mysql-test/storage_engine/index.rdiff new file mode 100644 index 00000000000..76d6c6dd8e4 --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/index.rdiff @@ -0,0 +1,60 @@ +--- suite/storage_engine/index.result 2017-03-12 04:57:07.169911845 +0200 ++++ suite/storage_engine/index.reject 2017-08-14 22:41:06.548555663 +0300 +@@ -4,7 +4,7 @@ + ) ENGINE= ; + SHOW KEYS IN t1; + Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment +-t1 1 a 1 a # # NULL NULL # BTREE ++t1 1 a 1 a # # NULL NULL # LSMTREE + DROP TABLE t1; + CREATE TABLE t1 (a , + b , +@@ -12,8 +12,8 @@ + ) ENGINE= ; + SHOW KEYS IN t1; + Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment +-t1 1 a_b 1 a # # NULL NULL # BTREE a_b index +-t1 1 a_b 2 b # # NULL NULL # BTREE a_b index ++t1 1 a_b 1 a # # NULL NULL # LSMTREE a_b index ++t1 1 a_b 2 b # # NULL NULL # LSMTREE a_b index + DROP TABLE t1; + CREATE TABLE t1 (a , + b , +@@ -22,8 +22,8 @@ + ) ENGINE= ; + SHOW KEYS IN t1; + Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment +-t1 1 a 1 a # # NULL NULL # BTREE +-t1 1 b 1 b # # NULL NULL # BTREE ++t1 1 a 1 a # # NULL NULL # LSMTREE ++t1 1 b 1 b # # NULL NULL # LSMTREE + DROP TABLE t1; + CREATE TABLE t1 (a , + b , +@@ -31,7 +31,7 @@ + ) ENGINE= ; + SHOW KEYS IN t1; + Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment +-t1 0 a 1 a # # NULL NULL # BTREE ++t1 0 a 1 a # # NULL NULL # LSMTREE + INSERT INTO t1 (a,b) VALUES (1,'a'),(2,'b'); + INSERT INTO t1 (a,b) VALUES (1,'c'); + ERROR 23000: Duplicate entry '1' for key 'a' +@@ -43,7 +43,7 @@ + ALTER TABLE t1 ADD (a) COMMENT 'simple index on a'; + SHOW INDEX FROM t1; + Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment +-t1 1 a 1 a # # NULL NULL # BTREE simple index on a ++t1 1 a 1 a # # NULL NULL # LSMTREE simple index on a + ALTER TABLE t1 DROP KEY a; + DROP TABLE t1; + CREATE TABLE t1 (a , +@@ -52,7 +52,7 @@ + ) ENGINE= ; + SHOW KEYS IN t1; + Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment +-t1 0 a 1 a # # NULL NULL # BTREE ++t1 0 a 1 a # # NULL NULL # LSMTREE + INSERT INTO t1 (a,b) VALUES (1,'a'),(2,'b'); + INSERT INTO t1 (a,b) VALUES (1,'c'); + ERROR 23000: Duplicate entry '1' for key 'a' diff --git a/storage/rocksdb/mysql-test/storage_engine/index_type_btree.rdiff b/storage/rocksdb/mysql-test/storage_engine/index_type_btree.rdiff new file mode 100644 index 00000000000..5fcffbea13b --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/index_type_btree.rdiff @@ -0,0 +1,60 @@ +--- suite/storage_engine/index_type_btree.result 2017-03-12 04:57:07.169911845 +0200 ++++ suite/storage_engine/index_type_btree.reject 2017-08-14 22:50:47.264555216 +0300 +@@ -4,7 +4,7 @@ + ) ENGINE= ; + SHOW KEYS IN t1; + Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment +-t1 1 a 1 a # # NULL NULL # BTREE ++t1 1 a 1 a # # NULL NULL # LSMTREE + DROP TABLE t1; + CREATE TABLE t1 (a , + b , +@@ -12,8 +12,8 @@ + ) ENGINE= ; + SHOW KEYS IN t1; + Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment +-t1 1 a_b 1 a # # NULL NULL # BTREE a_b index +-t1 1 a_b 2 b # # NULL NULL # BTREE a_b index ++t1 1 a_b 1 a # # NULL NULL # LSMTREE a_b index ++t1 1 a_b 2 b # # NULL NULL # LSMTREE a_b index + DROP TABLE t1; + CREATE TABLE t1 (a , + b , +@@ -22,8 +22,8 @@ + ) ENGINE= ; + SHOW KEYS IN t1; + Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment +-t1 1 a 1 a # # NULL NULL # BTREE +-t1 1 b 1 b # # NULL NULL # BTREE ++t1 1 a 1 a # # NULL NULL # LSMTREE ++t1 1 b 1 b # # NULL NULL # LSMTREE + DROP TABLE t1; + CREATE TABLE t1 (a , + b , +@@ -31,7 +31,7 @@ + ) ENGINE= ; + SHOW KEYS IN t1; + Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment +-t1 0 a 1 a # # NULL NULL # BTREE ++t1 0 a 1 a # # NULL NULL # LSMTREE + INSERT INTO t1 (a,b) VALUES (1,'a'),(2,'b'); + INSERT INTO t1 (a,b) VALUES (1,'c'); + ERROR 23000: Duplicate entry '1' for key 'a' +@@ -43,7 +43,7 @@ + ALTER TABLE t1 ADD (a) USING BTREE COMMENT 'simple index on a'; + SHOW INDEX FROM t1; + Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment +-t1 1 a 1 a # # NULL NULL # BTREE simple index on a ++t1 1 a 1 a # # NULL NULL # LSMTREE simple index on a + ALTER TABLE t1 DROP KEY a; + DROP TABLE t1; + CREATE TABLE t1 (a , +@@ -52,7 +52,7 @@ + ) ENGINE= ; + SHOW KEYS IN t1; + Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment +-t1 0 a 1 a # # NULL NULL # BTREE ++t1 0 a 1 a # # NULL NULL # LSMTREE + INSERT INTO t1 (a,b) VALUES (1,'a'),(2,'b'); + INSERT INTO t1 (a,b) VALUES (1,'c'); + ERROR 23000: Duplicate entry '1' for key 'a' diff --git a/storage/rocksdb/mysql-test/storage_engine/index_type_hash.rdiff b/storage/rocksdb/mysql-test/storage_engine/index_type_hash.rdiff new file mode 100644 index 00000000000..815b2983b87 --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/index_type_hash.rdiff @@ -0,0 +1,60 @@ +--- suite/storage_engine/index_type_hash.result 2017-03-12 04:57:07.169911845 +0200 ++++ suite/storage_engine/index_type_hash.reject 2017-08-14 22:51:55.644555163 +0300 +@@ -4,7 +4,7 @@ + ) ENGINE= ; + SHOW KEYS IN t1; + Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment +-t1 1 a 1 a # # NULL NULL # HASH ++t1 1 a 1 a # # NULL NULL # LSMTREE + DROP TABLE t1; + CREATE TABLE t1 (a , + b , +@@ -12,8 +12,8 @@ + ) ENGINE= ; + SHOW KEYS IN t1; + Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment +-t1 1 a_b 1 a # # NULL NULL # HASH a_b index +-t1 1 a_b 2 b # # NULL NULL # HASH a_b index ++t1 1 a_b 1 a # # NULL NULL # LSMTREE a_b index ++t1 1 a_b 2 b # # NULL NULL # LSMTREE a_b index + DROP TABLE t1; + CREATE TABLE t1 (a , + b , +@@ -22,8 +22,8 @@ + ) ENGINE= ; + SHOW KEYS IN t1; + Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment +-t1 1 a 1 a # # NULL NULL # HASH +-t1 1 b 1 b # # NULL NULL # HASH ++t1 1 a 1 a # # NULL NULL # LSMTREE ++t1 1 b 1 b # # NULL NULL # LSMTREE + DROP TABLE t1; + CREATE TABLE t1 (a , + b , +@@ -31,7 +31,7 @@ + ) ENGINE= ; + SHOW KEYS IN t1; + Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment +-t1 0 a 1 a # # NULL NULL # HASH ++t1 0 a 1 a # # NULL NULL # LSMTREE + INSERT INTO t1 (a,b) VALUES (1,'a'),(2,'b'); + INSERT INTO t1 (a,b) VALUES (1,'c'); + ERROR 23000: Duplicate entry '1' for key 'a' +@@ -43,7 +43,7 @@ + ALTER TABLE t1 ADD (a) USING HASH COMMENT 'simple index on a'; + SHOW INDEX FROM t1; + Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment +-t1 1 a 1 a # # NULL NULL # HASH simple index on a ++t1 1 a 1 a # # NULL NULL # LSMTREE simple index on a + ALTER TABLE t1 DROP KEY a; + DROP TABLE t1; + CREATE TABLE t1 (a , +@@ -52,7 +52,7 @@ + ) ENGINE= ; + SHOW KEYS IN t1; + Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment +-t1 0 a 1 a # # NULL NULL # HASH ++t1 0 a 1 a # # NULL NULL # LSMTREE + INSERT INTO t1 (a,b) VALUES (1,'a'),(2,'b'); + INSERT INTO t1 (a,b) VALUES (1,'c'); + ERROR 23000: Duplicate entry '1' for key 'a' diff --git a/storage/rocksdb/mysql-test/storage_engine/mask_engine.inc b/storage/rocksdb/mysql-test/storage_engine/mask_engine.inc new file mode 100644 index 00000000000..fc6cd02e3ef --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/mask_engine.inc @@ -0,0 +1,15 @@ +# +# This include file just replaces the storage engine under test by the generic string +# in the next statement. More masks can be added by defining $add_regex, e.g. +# let $add_regex = /$data_dir// /$index_dir// +# + +--let $regex = /$storage_engine//i / COLLATE[= ]latin1_bin// +if ($add_regex) +{ + --let $regex = $regex $add_regex +} + +--let $add_regex = +--replace_regex $regex + diff --git a/storage/rocksdb/mysql-test/storage_engine/misc.rdiff b/storage/rocksdb/mysql-test/storage_engine/misc.rdiff new file mode 100644 index 00000000000..694f3f54815 --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/misc.rdiff @@ -0,0 +1,25 @@ +--- /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/misc.result 2017-06-22 00:33:46.419995639 +0300 ++++ /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/misc.reject 2017-06-22 02:34:23.647950149 +0300 +@@ -28,6 +28,9 @@ + SELECT TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME + FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE ORDER BY TABLE_NAME; + TABLE_NAME COLUMN_NAME REFERENCED_TABLE_NAME REFERENCED_COLUMN_NAME ++Warning 1286 Unknown storage engine 'InnoDB' ++Warning 1286 Unknown storage engine 'InnoDB' ++Warnings: + column_stats column_name NULL NULL + column_stats db_name NULL NULL + column_stats table_name NULL NULL +@@ -58,12 +61,6 @@ + index_stats index_name NULL NULL + index_stats prefix_arity NULL NULL + index_stats table_name NULL NULL +-innodb_index_stats database_name NULL NULL +-innodb_index_stats index_name NULL NULL +-innodb_index_stats stat_name NULL NULL +-innodb_index_stats table_name NULL NULL +-innodb_table_stats database_name NULL NULL +-innodb_table_stats table_name NULL NULL + plugin name NULL NULL + proc db NULL NULL + proc name NULL NULL diff --git a/storage/rocksdb/mysql-test/storage_engine/parts/checksum_table.rdiff b/storage/rocksdb/mysql-test/storage_engine/parts/checksum_table.rdiff new file mode 100644 index 00000000000..bf3347a4341 --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/parts/checksum_table.rdiff @@ -0,0 +1,13 @@ +--- /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/parts/checksum_table.result 2017-06-22 00:33:46.419995639 +0300 ++++ /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/parts/checksum_table.reject 2017-06-22 19:25:02.935568998 +0300 +@@ -31,8 +31,8 @@ + test.t1 4272806499 + CHECKSUM TABLE t1, t2 QUICK; + Table Checksum +-test.t1 4272806499 +-test.t2 0 ++test.t1 NULL ++test.t2 NULL + CHECKSUM TABLE t1, t2 EXTENDED; + Table Checksum + test.t1 4272806499 diff --git a/storage/rocksdb/mysql-test/storage_engine/parts/create_table.rdiff b/storage/rocksdb/mysql-test/storage_engine/parts/create_table.rdiff new file mode 100644 index 00000000000..b2cb47a0927 --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/parts/create_table.rdiff @@ -0,0 +1,20 @@ +--- /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/parts/create_table.result 2017-06-22 00:33:46.419995639 +0300 ++++ /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/parts/create_table.reject 2017-06-22 19:25:05.335568983 +0300 +@@ -65,7 +65,7 @@ + 1 SIMPLE t1 abc,def # # # # # # # + EXPLAIN PARTITIONS SELECT a FROM t1 WHERE a = 100; + id select_type table partitions type possible_keys key key_len ref rows Extra +-1 SIMPLE NULL NULL # # # # # # # ++1 SIMPLE t1 def # # # # # # # + INSERT INTO t1 (a) VALUES (50); + ERROR HY000: Table has no partition for value 50 + DROP TABLE t1; +@@ -81,7 +81,7 @@ + 1 SIMPLE t1 abc_abcsp0,def_defsp0 # # # # # # # + EXPLAIN PARTITIONS SELECT a FROM t1 WHERE a = 100; + id select_type table partitions type possible_keys key key_len ref rows Extra +-1 SIMPLE NULL NULL # # # # # # # ++1 SIMPLE t1 def_defsp0 # # # # # # # + SELECT TABLE_SCHEMA, TABLE_NAME, PARTITION_NAME, SUBPARTITION_NAME, PARTITION_METHOD, SUBPARTITION_METHOD + FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 't1'; + TABLE_SCHEMA TABLE_NAME PARTITION_NAME SUBPARTITION_NAME PARTITION_METHOD SUBPARTITION_METHOD diff --git a/storage/rocksdb/mysql-test/storage_engine/parts/disabled.def b/storage/rocksdb/mysql-test/storage_engine/parts/disabled.def new file mode 100644 index 00000000000..ef8ad5b3c82 --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/parts/disabled.def @@ -0,0 +1,3 @@ +alter_table : MDEV-13153 - Assertion `global_status_var.global_memory_used == 0' +optimize_table : MDEV-13148 - LOCK TABLE on RocksDB table fails with a bogus error message +repair_table : MDEV-13148 - LOCK TABLE on RocksDB table fails with a bogus error message diff --git a/storage/rocksdb/mysql-test/storage_engine/parts/suite.opt b/storage/rocksdb/mysql-test/storage_engine/parts/suite.opt new file mode 100644 index 00000000000..713e46dcddb --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/parts/suite.opt @@ -0,0 +1 @@ +--ignore-db-dirs=.rocksdb --plugin-load=$HA_ROCKSDB_SO --binlog_format=ROW diff --git a/storage/rocksdb/mysql-test/storage_engine/show_engine.rdiff b/storage/rocksdb/mysql-test/storage_engine/show_engine.rdiff new file mode 100644 index 00000000000..15a9bb6f171 --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/show_engine.rdiff @@ -0,0 +1,15 @@ +--- suite/storage_engine/show_engine.result 2017-03-12 04:57:07.169911845 +0200 ++++ suite/storage_engine/show_engine.reject 2017-08-14 22:58:15.508554871 +0300 +@@ -4,7 +4,11 @@ + # volatile data (timestamps, memory info, etc.) + SHOW ENGINE STATUS; + Type Name Status +- ### Engine status, can be long and changeable ### ++STATISTICS ### Engine status, can be long and changeable ### ++DBSTATS ### Engine status, can be long and changeable ### ++CF_COMPACTION __system__ ### Engine status, can be long and changeable ### ++CF_COMPACTION default ### Engine status, can be long and changeable ### ++MEMORY_STATS ### Engine status, can be long and changeable ### + # For SHOW MUTEX even the number of lines is volatile, so the result logging is disabled, + # the test only checks that the command does not produce any errors + SHOW ENGINE MUTEX; diff --git a/storage/rocksdb/mysql-test/storage_engine/show_table_status.rdiff b/storage/rocksdb/mysql-test/storage_engine/show_table_status.rdiff new file mode 100644 index 00000000000..d7252eb54ed --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/show_table_status.rdiff @@ -0,0 +1,20 @@ +--- /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/show_table_status.result 2017-06-22 00:33:46.423995639 +0300 ++++ /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/show_table_status.reject 2017-06-22 14:04:10.723690009 +0300 +@@ -19,7 +19,7 @@ + Create_time ### + Update_time ### + Check_time NULL +-Collation latin1_swedish_ci ++Collation latin1_bin + Checksum NULL + Create_options + Comment +@@ -37,7 +37,7 @@ + Create_time ### + Update_time ### + Check_time NULL +-Collation latin1_swedish_ci ++Collation latin1_bin + Checksum NULL + Create_options + Comment diff --git a/storage/rocksdb/mysql-test/storage_engine/suite.opt b/storage/rocksdb/mysql-test/storage_engine/suite.opt new file mode 100644 index 00000000000..41beb675cc1 --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/suite.opt @@ -0,0 +1 @@ +--ignore-db-dirs=.rocksdb --plugin-load=$HA_ROCKSDB_SO --binlog_format=ROW --collation-server=latin1_bin diff --git a/storage/rocksdb/mysql-test/storage_engine/tbl_opt_insert_method.rdiff b/storage/rocksdb/mysql-test/storage_engine/tbl_opt_insert_method.rdiff new file mode 100644 index 00000000000..20f594fbb40 --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/tbl_opt_insert_method.rdiff @@ -0,0 +1,11 @@ +--- /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/tbl_opt_insert_method.result 2017-06-22 00:33:46.423995639 +0300 ++++ /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/tbl_opt_insert_method.reject 2017-06-22 02:39:45.243948128 +0300 +@@ -5,7 +5,7 @@ + t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` char(8) DEFAULT NULL +-) ENGINE= DEFAULT CHARSET=latin1 INSERT_METHOD=FIRST ++) ENGINE= DEFAULT CHARSET=latin1 + ALTER TABLE t1 INSERT_METHOD=NO; + SHOW CREATE TABLE t1; + Table Create Table diff --git a/storage/rocksdb/mysql-test/storage_engine/tbl_opt_union.rdiff b/storage/rocksdb/mysql-test/storage_engine/tbl_opt_union.rdiff new file mode 100644 index 00000000000..0d65ad0744a --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/tbl_opt_union.rdiff @@ -0,0 +1,16 @@ +--- /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/tbl_opt_union.result 2017-06-22 00:33:46.423995639 +0300 ++++ /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/tbl_opt_union.reject 2017-06-22 02:41:02.719947641 +0300 +@@ -4,11 +4,11 @@ + Table Create Table + t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +-) ENGINE= DEFAULT CHARSET=latin1 UNION=(`child1`) ++) ENGINE= DEFAULT CHARSET=latin1 + ALTER TABLE t1 UNION = (child1,child2); + SHOW CREATE TABLE t1; + Table Create Table + t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +-) ENGINE= DEFAULT CHARSET=latin1 UNION=(`child1`,`child2`) ++) ENGINE= DEFAULT CHARSET=latin1 + DROP TABLE t1, child1, child2; diff --git a/storage/rocksdb/mysql-test/storage_engine/tbl_temporary.rdiff b/storage/rocksdb/mysql-test/storage_engine/tbl_temporary.rdiff new file mode 100644 index 00000000000..d24806e7c9f --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/tbl_temporary.rdiff @@ -0,0 +1,24 @@ +--- /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/tbl_temporary.result 2017-06-22 00:33:46.423995639 +0300 ++++ /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/tbl_temporary.reject 2017-06-22 15:27:50.643658456 +0300 +@@ -1,11 +1,14 @@ + DROP TABLE IF EXISTS t1; + CREATE TABLE t1 (c CHAR(1)) ENGINE=MyISAM; + CREATE TEMPORARY TABLE t1 (a , b ) ENGINE= ; +-SHOW CREATE TABLE t1; +-Table Create Table +-t1 CREATE TEMPORARY TABLE `t1` ( +- `a` int(11) DEFAULT NULL, +- `b` char(8) DEFAULT NULL +-) ENGINE= DEFAULT CHARSET=latin1 +-DROP TEMPORARY TABLE t1; ++ERROR HY000: Table storage engine 'ROCKSDB' does not support the create option 'TEMPORARY' ++# ERROR: Statement ended with errno 1478, errname ER_ILLEGAL_HA_CREATE_OPTION (expected to succeed) ++# ------------ UNEXPECTED RESULT ------------ ++# [ CREATE TEMPORARY TABLE t1 (a INT(11) /*!*/ /*Custom column options*/, b CHAR(8) /*!*/ /*Custom column options*/) ENGINE=RocksDB /*!*/ /*Custom table options*/ ] ++# The statement|command finished with ER_ILLEGAL_HA_CREATE_OPTION. ++# Temporary tables or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors. ++# You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def. ++# Further in this test, the message might sometimes be suppressed; a part of the test might be skipped. ++# Also, this problem may cause a chain effect (more errors of different kinds in the test). ++# ------------------------------------------- + DROP TABLE t1; diff --git a/storage/rocksdb/mysql-test/storage_engine/truncate_table.rdiff b/storage/rocksdb/mysql-test/storage_engine/truncate_table.rdiff new file mode 100644 index 00000000000..9ca7861d51e --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/truncate_table.rdiff @@ -0,0 +1,24 @@ +--- /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/truncate_table.result 2017-06-22 00:33:46.423995639 +0300 ++++ /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/truncate_table.reject 2017-06-22 02:43:27.183946733 +0300 +@@ -29,13 +29,12 @@ + CREATE TABLE t1 (a , b ) ENGINE= ; + INSERT INTO t1 (a,b) VALUES (1,'a'),(2,'b'),(3,'c'); + HANDLER t1 OPEN AS h1; +-HANDLER h1 READ FIRST; +-a b +-1 a +-TRUNCATE TABLE t1; +-HANDLER h1 READ NEXT; +-ERROR 42S02: Unknown table 'h1' in HANDLER +-HANDLER t1 OPEN AS h2; +-HANDLER h2 READ FIRST; +-a b ++ERROR HY000: Storage engine ROCKSDB of the table `test`.`t1` doesn't have this option ++# ------------ UNEXPECTED RESULT ------------ ++# The statement|command finished with ER_ILLEGAL_HA. ++# HANDLER or the syntax or the mix could be unsupported. ++# You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def. ++# Further in this test, the message might sometimes be suppressed; a part of the test might be skipped. ++# Also, this problem may cause a chain effect (more errors of different kinds in the test). ++# ------------------------------------------- + DROP TABLE t1; diff --git a/storage/rocksdb/mysql-test/storage_engine/trx/delete.rdiff b/storage/rocksdb/mysql-test/storage_engine/trx/delete.rdiff new file mode 100644 index 00000000000..dac23b83579 --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/trx/delete.rdiff @@ -0,0 +1,10 @@ +--- /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/trx/delete.result 2017-06-22 00:33:46.423995639 +0300 ++++ /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/trx/delete.reject 2017-06-22 19:29:36.827567276 +0300 +@@ -68,5 +68,7 @@ + DELETE FROM t1; + INSERT INTO t1 (a,b) VALUES (1,'a'); + ROLLBACK TO SAVEPOINT spt1; ++ERROR HY000: MyRocks currently does not support ROLLBACK TO SAVEPOINT if modifying rows. + COMMIT; ++ERROR HY000: This transaction was rolled back and cannot be committed. Only supported operation is to roll it back, so all pending changes will be discarded. Please restart another transaction. + DROP TABLE t1; diff --git a/storage/rocksdb/mysql-test/storage_engine/trx/disabled.def b/storage/rocksdb/mysql-test/storage_engine/trx/disabled.def new file mode 100644 index 00000000000..4e227c10307 --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/trx/disabled.def @@ -0,0 +1,4 @@ +cons_snapshot_serializable : Not supported +level_read_uncommitted : Not supported +level_serializable : Not supported +xa_recovery : MDEV-13155 - XA recovery not supported for RocksDB diff --git a/storage/rocksdb/mysql-test/storage_engine/trx/insert.rdiff b/storage/rocksdb/mysql-test/storage_engine/trx/insert.rdiff new file mode 100644 index 00000000000..36a71076a2b --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/trx/insert.rdiff @@ -0,0 +1,24 @@ +--- /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/trx/insert.result 2017-06-22 00:33:46.423995639 +0300 ++++ /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/trx/insert.reject 2017-06-22 19:29:39.131567262 +0300 +@@ -37,18 +37,18 @@ + INSERT INTO t1 SET a = 11, b = 'f'; + INSERT t1 SET b = DEFAULT; + ROLLBACK TO SAVEPOINT spt1; ++ERROR HY000: MyRocks currently does not support ROLLBACK TO SAVEPOINT if modifying rows. + INSERT INTO t1 (b,a) VALUES ('test1',10); ++ERROR HY000: This transaction was rolled back and cannot be committed. Only supported operation is to roll it back, so all pending changes will be discarded. Please restart another transaction. + COMMIT; ++ERROR HY000: This transaction was rolled back and cannot be committed. Only supported operation is to roll it back, so all pending changes will be discarded. Please restart another transaction. + SELECT a,b FROM t1; + a b + 1 a +-10 NULL + 10 foo +-10 test1 + 100 foo + 11 abc + 2 b +-20 NULL + 3 c + 4 d + 5 e diff --git a/storage/rocksdb/mysql-test/storage_engine/trx/level_read_committed.rdiff b/storage/rocksdb/mysql-test/storage_engine/trx/level_read_committed.rdiff new file mode 100644 index 00000000000..6b9e4a3f4e9 --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/trx/level_read_committed.rdiff @@ -0,0 +1,10 @@ +--- /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/trx/level_read_committed.result 2017-06-22 00:33:46.423995639 +0300 ++++ /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/trx/level_read_committed.reject 2017-06-22 19:29:41.459567247 +0300 +@@ -77,6 +77,7 @@ + CREATE TABLE t1 (a ) ENGINE= ; + SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; + START TRANSACTION WITH CONSISTENT SNAPSHOT; ++ERROR HY000: Only REPEATABLE READ isolation level is supported for START TRANSACTION WITH CONSISTENT SNAPSHOT in RocksDB Storage Engine. + connection con2; + INSERT INTO t1 (a) VALUES (1); + connection con1; diff --git a/storage/rocksdb/mysql-test/storage_engine/trx/level_repeatable_read.rdiff b/storage/rocksdb/mysql-test/storage_engine/trx/level_repeatable_read.rdiff new file mode 100644 index 00000000000..cf770755243 --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/trx/level_repeatable_read.rdiff @@ -0,0 +1,35 @@ +--- /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/trx/level_repeatable_read.result 2017-06-22 00:33:46.423995639 +0300 ++++ /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/trx/level_repeatable_read.reject 2017-06-22 20:33:13.935543284 +0300 +@@ -24,8 +24,7 @@ + SELECT a FROM t1; + a + INSERT INTO t1 (a) SELECT a+100 FROM t1; +-ERROR HY000: Lock wait timeout exceeded; try restarting transaction +-# WARNING: Statement ended with errno 1205, errname 'ER_LOCK_WAIT_TIMEOUT'. ++# WARNING: Statement ended with errno 0, errname ''. + # If it differs from the result file, it might indicate a problem. + SELECT a FROM t1; + a +@@ -47,22 +46,16 @@ + # If it differs from the result file, it might indicate a problem. + SELECT a FROM t1; + a +-201 +-202 + COMMIT; + SELECT a FROM t1; + a + 1 + 2 +-201 +-202 + connection con2; + SELECT a FROM t1; + a + 1 + 2 +-201 +-202 + connection default; + disconnect con1; + disconnect con2; diff --git a/storage/rocksdb/mysql-test/storage_engine/trx/suite.opt b/storage/rocksdb/mysql-test/storage_engine/trx/suite.opt new file mode 100644 index 00000000000..713e46dcddb --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/trx/suite.opt @@ -0,0 +1 @@ +--ignore-db-dirs=.rocksdb --plugin-load=$HA_ROCKSDB_SO --binlog_format=ROW diff --git a/storage/rocksdb/mysql-test/storage_engine/trx/update.rdiff b/storage/rocksdb/mysql-test/storage_engine/trx/update.rdiff new file mode 100644 index 00000000000..ab181947733 --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/trx/update.rdiff @@ -0,0 +1,38 @@ +--- /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/trx/update.result 2017-06-22 00:33:46.423995639 +0300 ++++ /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/trx/update.reject 2017-06-22 19:29:57.267567148 +0300 +@@ -29,20 +29,23 @@ + SAVEPOINT spt1; + UPDATE t1 SET b = ''; + ROLLBACK TO SAVEPOINT spt1; ++ERROR HY000: MyRocks currently does not support ROLLBACK TO SAVEPOINT if modifying rows. + UPDATE t1 SET b = 'upd' WHERE a = 10050; ++ERROR HY000: This transaction was rolled back and cannot be committed. Only supported operation is to roll it back, so all pending changes will be discarded. Please restart another transaction. + COMMIT; ++ERROR HY000: This transaction was rolled back and cannot be committed. Only supported operation is to roll it back, so all pending changes will be discarded. Please restart another transaction. + SELECT a,b FROM t1; + a b +-10050 upd +-10050 upd +-51 update2 +-51 update2 +-52 update2 +-52 update2 +-53 update2 +-53 update2 +-54 update2 +-54 update2 +-55 update2 +-55 update2 ++10050 NULL ++10050 NULL ++51 NULL ++51 NULL ++52 NULL ++52 NULL ++53 NULL ++53 NULL ++54 NULL ++54 NULL ++55 NULL ++55 NULL + DROP TABLE t1; diff --git a/storage/rocksdb/mysql-test/storage_engine/type_binary_indexes.rdiff b/storage/rocksdb/mysql-test/storage_engine/type_binary_indexes.rdiff new file mode 100644 index 00000000000..5eec9d24250 --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/type_binary_indexes.rdiff @@ -0,0 +1,11 @@ +--- suite/storage_engine/type_binary_indexes.result 2017-03-12 04:57:07.173911845 +0200 ++++ suite/storage_engine/type_binary_indexes.reject 2017-08-14 22:54:02.144555066 +0300 +@@ -91,7 +91,7 @@ + INSERT INTO t1 (b,b20,v16,v128) SELECT b,b20,v16,v128 FROM t1; + EXPLAIN SELECT HEX(SUBSTRING(v16,0,3)) FROM t1 WHERE v16 LIKE 'varchar%'; + id select_type table type possible_keys key key_len ref rows Extra +-# # # # # NULL # # # # ++# # # # # v16 # # # # + SELECT HEX(SUBSTRING(v16,7,3)) FROM t1 WHERE v16 LIKE 'varchar%'; + HEX(SUBSTRING(v16,7,3)) + 723161 diff --git a/storage/rocksdb/mysql-test/storage_engine/type_enum.rdiff b/storage/rocksdb/mysql-test/storage_engine/type_enum.rdiff new file mode 100644 index 00000000000..a402e0fb418 --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/type_enum.rdiff @@ -0,0 +1,20 @@ +--- /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/type_enum.result 2017-06-22 00:33:46.423995639 +0300 ++++ /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/type_enum.reject 2017-06-22 02:55:49.599942066 +0300 +@@ -24,8 +24,6 @@ + test2 4 + test5 2 + ALTER TABLE t1 ADD COLUMN e ENUM('a','A') ; +-Warnings: +-Note 1291 Column 'e' has duplicated value 'a' in ENUM + SHOW COLUMNS IN t1; + Field Type Null Key Default Extra + a enum('') # # # +@@ -37,7 +35,7 @@ + a b c e + NULL + test2 4 NULL +- test3 75 a ++ test3 75 A + test5 2 NULL + SELECT a,b,c,e FROM t1 WHERE b='test2' OR a != ''; + a b c e diff --git a/storage/rocksdb/mysql-test/storage_engine/type_set.rdiff b/storage/rocksdb/mysql-test/storage_engine/type_set.rdiff new file mode 100644 index 00000000000..c5cbeaedecf --- /dev/null +++ b/storage/rocksdb/mysql-test/storage_engine/type_set.rdiff @@ -0,0 +1,11 @@ +--- /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/type_set.result 2017-06-22 00:33:46.423995639 +0300 ++++ /data/src/bb-10.2-mdev12528/mysql-test/suite/storage_engine/type_set.reject 2017-06-22 03:02:58.695939369 +0300 +@@ -30,8 +30,6 @@ + test2,test3 01,23,34,44 + test2,test4 + ALTER TABLE t1 ADD COLUMN e SET('a','A') ; +-Warnings: +-Note 1291 Column 'e' has duplicated value 'a' in SET + SHOW COLUMNS IN t1; + Field Type Null Key Default Extra + a set('') # # # diff --git a/storage/rocksdb/rdb_compact_filter.h b/storage/rocksdb/rdb_compact_filter.h index c457fba4af2..9bc7ece6e7a 100644 --- a/storage/rocksdb/rdb_compact_filter.h +++ b/storage/rocksdb/rdb_compact_filter.h @@ -23,6 +23,7 @@ /* C++ system header files */ #include #include +#include /* RocksDB includes */ #include "rocksdb/compaction_filter.h" diff --git a/storage/rocksdb/rdb_datadic.cc b/storage/rocksdb/rdb_datadic.cc index 1376d5c8424..e9c13a84374 100644 --- a/storage/rocksdb/rdb_datadic.cc +++ b/storage/rocksdb/rdb_datadic.cc @@ -65,6 +65,7 @@ inline bool field_check_field_name_match(Field *field, const char *name) name)); } + /* Rdb_key_def class implementation */ diff --git a/storage/rocksdb/rdb_datadic.h b/storage/rocksdb/rdb_datadic.h index b54a5960797..a3d90909a6a 100644 --- a/storage/rocksdb/rdb_datadic.h +++ b/storage/rocksdb/rdb_datadic.h @@ -1029,6 +1029,7 @@ public: interface Rdb_tables_scanner { virtual int add_table(Rdb_tbl_def * tdef) = 0; + virtual ~Rdb_tables_scanner() {} /* Keep the compiler happy */ }; /* diff --git a/storage/rocksdb/rdb_i_s.cc b/storage/rocksdb/rdb_i_s.cc index 1e32fc352db..346a2994ec1 100644 --- a/storage/rocksdb/rdb_i_s.cc +++ b/storage/rocksdb/rdb_i_s.cc @@ -43,6 +43,8 @@ #include "./rdb_utils.h" #include "./rdb_mariadb_server_port.h" +#include "./rdb_mariadb_port.h" + namespace myrocks { /** diff --git a/storage/rocksdb/rdb_io_watchdog.cc b/storage/rocksdb/rdb_io_watchdog.cc index 7b229eee47d..b41e9248d52 100644 --- a/storage/rocksdb/rdb_io_watchdog.cc +++ b/storage/rocksdb/rdb_io_watchdog.cc @@ -21,6 +21,9 @@ #include #include +/* Rdb_io_watchdog doesn't work on Windows [yet] */ +#if !defined(_WIN32) && !defined(__APPLE__) + namespace myrocks { void Rdb_io_watchdog::expire_io_callback(union sigval timer_data) { @@ -231,3 +234,6 @@ int Rdb_io_watchdog::reset_timeout(const uint32_t &write_timeout) { } } // namespace myrocks + +#endif + diff --git a/storage/rocksdb/rdb_io_watchdog.h b/storage/rocksdb/rdb_io_watchdog.h index 0fb77536fb0..c50547745df 100644 --- a/storage/rocksdb/rdb_io_watchdog.h +++ b/storage/rocksdb/rdb_io_watchdog.h @@ -34,6 +34,9 @@ namespace myrocks { +// Rdb_io_watchdog does not support Windows ATM. +#if !defined(_WIN32) && !defined(__APPLE__) + class Rdb_io_watchdog { const int RDB_IO_WRITE_BUFFER_SIZE = 4096; const char *const RDB_IO_DUMMY_FILE_NAME = "myrocks_io_watchdog_write_file"; @@ -110,4 +113,5 @@ class Rdb_io_watchdog { Rdb_io_watchdog &operator=(const Rdb_io_watchdog &) = delete; }; +#endif } // namespace myrocks diff --git a/storage/rocksdb/rdb_mariadb_port.h b/storage/rocksdb/rdb_mariadb_port.h index f6f06eeb361..1661338030f 100644 --- a/storage/rocksdb/rdb_mariadb_port.h +++ b/storage/rocksdb/rdb_mariadb_port.h @@ -8,6 +8,10 @@ #include "my_global.h" /* ulonglong */ #include "atomic_stat.h" +// These are for split_into_vector: +#include +#include + /* The following is copied from storage/innobase/univ.i: */ #ifndef MY_ATTRIBUTE #if defined(__GNUC__) @@ -42,4 +46,7 @@ typedef struct my_io_perf_atomic_struct my_io_perf_atomic_t; //////////////////////////////////////////////////////////////////////////// typedef struct my_io_perf_struct my_io_perf_t; +std::vector split_into_vector(const std::string& input, + char delimiter); + #endif diff --git a/storage/rocksdb/rdb_mariadb_server_port.cc b/storage/rocksdb/rdb_mariadb_server_port.cc index bd2c730d33d..84a800807eb 100644 --- a/storage/rocksdb/rdb_mariadb_server_port.cc +++ b/storage/rocksdb/rdb_mariadb_server_port.cc @@ -95,3 +95,31 @@ bool Regex_list_handler::matches(const std::string& str) const return found; } +// Split a string based on a delimiter. Two delimiters in a row will not add +// an empty string in the set. +std::vector split_into_vector(const std::string& input, + char delimiter) +{ + size_t pos; + size_t start = 0; + std::vector elems; + + // Find next delimiter + while ((pos = input.find(delimiter, start)) != std::string::npos) + { + // If there is any data since the last delimiter add it to the list + if (pos > start) + elems.push_back(input.substr(start, pos - start)); + + // Set our start position to the character after the delimiter + start = pos + 1; + } + + // Add a possible string since the last delimiter + if (input.length() > start) + elems.push_back(input.substr(start)); + + // Return the resulting list back to the caller + return elems; +} + diff --git a/storage/rocksdb/rdb_mariadb_server_port.h b/storage/rocksdb/rdb_mariadb_server_port.h index a1b42b9d4bb..fe963446ebb 100644 --- a/storage/rocksdb/rdb_mariadb_server_port.h +++ b/storage/rocksdb/rdb_mariadb_server_port.h @@ -73,34 +73,4 @@ void warn_about_bad_patterns(const Regex_list_handler* regex_list_handler, void print_keydup_error(TABLE *table, KEY *key, myf errflag, const THD *thd, const char *org_table_name=NULL); -// Split a string based on a delimiter. Two delimiters in a row will not add -// an empty string in the set. -inline -std::vector split_into_vector(const std::string& input, - char delimiter) -{ - size_t pos; - size_t start = 0; - std::vector elems; - - // Find next delimiter - while ((pos = input.find(delimiter, start)) != std::string::npos) - { - // If there is any data since the last delimiter add it to the list - if (pos > start) - elems.push_back(input.substr(start, pos - start)); - - // Set our start position to the character after the delimiter - start = pos + 1; - } - - // Add a possible string since the last delimiter - if (input.length() > start) - elems.push_back(input.substr(start)); - - // Return the resulting list back to the caller - return elems; -} - - #endif diff --git a/storage/rocksdb/rdb_perf_context.cc b/storage/rocksdb/rdb_perf_context.cc index 291d38b68f3..d126d156314 100644 --- a/storage/rocksdb/rdb_perf_context.cc +++ b/storage/rocksdb/rdb_perf_context.cc @@ -205,7 +205,8 @@ void Rdb_io_perf::end_and_record(const uint32_t perf_context_level) { if (m_shared_io_perf_read && (rocksdb::get_perf_context()->block_read_byte != 0 || rocksdb::get_perf_context()->block_read_count != 0 || - rocksdb::get_perf_context()->block_read_time != 0)) { + rocksdb::get_perf_context()->block_read_time != 0)) + { #ifdef MARIAROCKS_NOT_YET my_io_perf_t io_perf_read; diff --git a/storage/sphinx/ha_sphinx.cc b/storage/sphinx/ha_sphinx.cc index 541ccf62260..650bc93cf67 100644 --- a/storage/sphinx/ha_sphinx.cc +++ b/storage/sphinx/ha_sphinx.cc @@ -216,7 +216,9 @@ enum ESphGroupBy SPH_GROUPBY_WEEK = 1, ///< group by week SPH_GROUPBY_MONTH = 2, ///< group by month SPH_GROUPBY_YEAR = 3, ///< group by year - SPH_GROUPBY_ATTR = 4 ///< group by attribute value + SPH_GROUPBY_ATTR = 4, ///< group by attribute value + SPH_GROUPBY_ATTRPAIR = 5, ///< group by sequential attrs pair (rendered redundant by 64bit attrs support; removed) + SPH_GROUPBY_MULTIPLE = 6 ///< group by on multiple attribute values }; /// known attribute types @@ -911,7 +913,7 @@ bool sphinx_show_status ( THD * thd ) } // show last error or warning (either in addition to stats, or on their own) - if ( pTls && pTls->m_pHeadTable && pTls->m_pHeadTable->m_tStats.m_sLastMessage && pTls->m_pHeadTable->m_tStats.m_sLastMessage[0] ) + if ( pTls && pTls->m_pHeadTable && pTls->m_pHeadTable->m_tStats.m_sLastMessage[0] ) { const char * sMessageType = pTls->m_pHeadTable->m_tStats.m_bLastError ? "error" : "warning"; @@ -1563,6 +1565,7 @@ bool CSphSEQuery::ParseField ( char * sField ) { "month:", SPH_GROUPBY_MONTH }, { "year:", SPH_GROUPBY_YEAR }, { "attr:", SPH_GROUPBY_ATTR }, + { "multi:", SPH_GROUPBY_MULTIPLE } }; int i; diff --git a/storage/spider/ha_spider.cc b/storage/spider/ha_spider.cc index 6ded5992c79..d6a5a20df8f 100644 --- a/storage/spider/ha_spider.cc +++ b/storage/spider/ha_spider.cc @@ -2109,6 +2109,7 @@ int ha_spider::index_read_map_internal( result_list.desc_flg = FALSE; result_list.sorted = TRUE; result_list.key_info = &table->key_info[active_index]; + check_distinct_key_query(); result_list.limit_num = result_list.internal_limit >= result_list.split_read ? result_list.split_read : result_list.internal_limit; @@ -2624,6 +2625,7 @@ int ha_spider::index_read_last_map_internal( result_list.desc_flg = TRUE; result_list.sorted = TRUE; result_list.key_info = &table->key_info[active_index]; + check_distinct_key_query(); result_list.limit_num = result_list.internal_limit >= result_list.split_read ? result_list.split_read : result_list.internal_limit; @@ -3089,6 +3091,7 @@ int ha_spider::index_first_internal( result_list.sorted = TRUE; result_list.key_info = &table->key_info[active_index]; result_list.key_order = 0; + check_distinct_key_query(); result_list.limit_num = result_list.internal_limit >= result_list.split_read ? result_list.split_read : result_list.internal_limit; @@ -3472,6 +3475,7 @@ int ha_spider::index_last_internal( result_list.sorted = TRUE; result_list.key_info = &table->key_info[active_index]; result_list.key_order = 0; + check_distinct_key_query(); result_list.limit_num = result_list.internal_limit >= result_list.split_read ? result_list.split_read : result_list.internal_limit; @@ -3914,6 +3918,7 @@ int ha_spider::read_range_first_internal( result_list.desc_flg = FALSE; result_list.sorted = sorted; result_list.key_info = &table->key_info[active_index]; + check_distinct_key_query(); result_list.limit_num = result_list.internal_limit >= result_list.split_read ? result_list.split_read : result_list.internal_limit; @@ -12077,6 +12082,81 @@ void ha_spider::check_direct_order_limit() DBUG_VOID_RETURN; } +/******************************************************************** + * Check whether the current query is a SELECT DISTINCT using an + * index in a non-partitioned Spider configuration, with a + * projection list that consists solely of the first key prefix + * column. + * + * For a SELECT DISTINCT query using an index in a non-partitioned + * Spider configuration, with a projection list that consists + * solely of the first key prefix, set the internal row retrieval + * limit to avoid visiting each row multiple times. + ********************************************************************/ +void ha_spider::check_distinct_key_query() +{ + DBUG_ENTER( "ha_spider::check_distinct_key_query" ); + + if ( result_list.direct_distinct && !partition_handler_share->handlers && + result_list.keyread && result_list.check_direct_order_limit ) + { + // SELECT DISTINCT query using an index in a non-partitioned configuration + KEY_PART_INFO* key_part = result_list.key_info->key_part; + Field* key_field = key_part->field; + + if ( is_sole_projection_field( key_field->field_index ) ) + { + // Projection list consists solely of the first key prefix column + + // Set the internal row retrieval limit to avoid visiting each row + // multiple times. This fixes a Spider performance bug that + // caused each row to be visited multiple times. + result_list.internal_limit = 1; + } + } + + DBUG_VOID_RETURN; +} + +/******************************************************************** + * Determine whether the current query's projection list + * consists solely of the specified column. + * + * Params IN - field_index: + * Field index of the column of interest within + * its table. + * + * Returns TRUE - if the query's projection list consists + * solely of the specified column. + * FALSE - otherwise. + ********************************************************************/ +bool ha_spider::is_sole_projection_field( uint16 field_index ) +{ + // NOTE: It is assumed that spider_db_append_select_columns() has already been called + // to build the bitmap of projection fields + bool is_ha_sole_projection_field; + uint loop_index, dbton_id; + spider_db_handler* dbton_hdl; + DBUG_ENTER( "ha_spider::is_sole_projection_field" ); + + for ( loop_index = 0; loop_index < share->use_sql_dbton_count; loop_index++ ) + { + dbton_id = share->use_sql_dbton_ids[ loop_index ]; + dbton_hdl = dbton_handler[ dbton_id ]; + + if ( dbton_hdl->first_link_idx >= 0 ) + { + is_ha_sole_projection_field = dbton_hdl->is_sole_projection_field( field_index ); + if ( !is_ha_sole_projection_field ) + { + DBUG_RETURN( FALSE ); + } + } + } + + DBUG_RETURN( TRUE ); +} + int ha_spider::check_ha_range_eof() { DBUG_ENTER("ha_spider::check_ha_range_eof"); diff --git a/storage/spider/ha_spider.h b/storage/spider/ha_spider.h index 50d890dc854..acc75ed1c05 100644 --- a/storage/spider/ha_spider.h +++ b/storage/spider/ha_spider.h @@ -751,6 +751,8 @@ public: ); uint check_partitioned(); void check_direct_order_limit(); + void check_distinct_key_query(); + bool is_sole_projection_field( uint16 field_index ); int check_ha_range_eof(); int drop_tmp_tables(); bool handler_opened( diff --git a/storage/spider/mysql-test/spider/bg/suite.pm b/storage/spider/mysql-test/spider/bg/suite.pm index 1bb6d7592c8..f106147deb6 100644 --- a/storage/spider/mysql-test/spider/bg/suite.pm +++ b/storage/spider/mysql-test/spider/bg/suite.pm @@ -6,5 +6,7 @@ return "No Spider engine" unless $ENV{HA_SPIDER_SO}; return "Not run for embedded server" if $::opt_embedded_server; return "Test needs --big-test" unless $::opt_big_test; +sub is_default { 1 } + bless { }; diff --git a/storage/spider/mysql-test/spider/handler/r/basic_sql.result b/storage/spider/mysql-test/spider/handler/r/basic_sql.result index da24c08e9fd..94a09fc317b 100644 --- a/storage/spider/mysql-test/spider/handler/r/basic_sql.result +++ b/storage/spider/mysql-test/spider/handler/r/basic_sql.result @@ -9,22 +9,27 @@ child3_2 child3_3 drop and create databases +connection master_1; DROP DATABASE IF EXISTS auto_test_local; CREATE DATABASE auto_test_local; USE auto_test_local; +connection child2_1; DROP DATABASE IF EXISTS auto_test_remote; CREATE DATABASE auto_test_remote; USE auto_test_remote; +connection child2_2; DROP DATABASE IF EXISTS auto_test_remote2; CREATE DATABASE auto_test_remote2; USE auto_test_remote2; test select 1 +connection master_1; SELECT 1; 1 1 create table select test +connection master_1; DROP TABLE IF EXISTS tb_l; CREATE TABLE tb_l ( a INT, @@ -43,6 +48,7 @@ CREATE TABLE ta_l ( PRIMARY KEY(a) ) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1 SELECT a, b, c FROM tb_l +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 a 2008-08-01 10:21:39 @@ -52,6 +58,7 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 5 c 2001-12-31 23:59:59 create table ignore select test +connection master_1; DROP TABLE IF EXISTS ta_l; DROP TABLE IF EXISTS tb_l; CREATE TABLE tb_l ( @@ -70,6 +77,13 @@ CREATE TABLE ta_l ( PRIMARY KEY(a) ) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1 IGNORE SELECT a, b, c FROM tb_l +Warnings: +Warning 1062 Duplicate entry '1' for key 'PRIMARY' +Warning 1062 Duplicate entry '2' for key 'PRIMARY' +Warning 1062 Duplicate entry '3' for key 'PRIMARY' +Warning 1062 Duplicate entry '4' for key 'PRIMARY' +Warning 1062 Duplicate entry '5' for key 'PRIMARY' +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 a 2008-08-01 10:21:39 @@ -79,11 +93,13 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 5 c 2001-12-31 23:59:59 create table ignore select test +connection master_1; DROP TABLE IF EXISTS ta_l; CREATE TABLE ta_l ( PRIMARY KEY(a) ) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1 REPLACE SELECT a, b, c FROM tb_l +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 f 2008-07-01 10:21:39 @@ -92,24 +108,13 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 4 i 2003-10-30 05:01:03 5 h 2001-10-31 23:59:59 -create table with partition and select test -CREATE TABLE ta_l2 ( -PRIMARY KEY(a) -) MASTER_1_ENGINE MASTER_1_COMMENT_P_2_1 -SELECT a, b, c FROM tb_l -SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; -a b date_format(c, '%Y-%m-%d %H:%i:%s') -1 f 2008-07-01 10:21:39 -2 g 2000-02-01 00:00:00 -3 j 2007-05-04 20:03:11 -4 i 2003-10-30 05:01:03 -5 h 2001-10-31 23:59:59 - create no index table +connection master_1; DROP TABLE IF EXISTS ta_l_no_idx; CREATE TABLE ta_l_no_idx MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT2_2_1 SELECT a, b, c FROM tb_l +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l_no_idx ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 f 2008-07-01 10:21:39 @@ -119,6 +124,7 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 5 h 2001-10-31 23:59:59 select table +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 f 2008-07-01 10:21:39 @@ -128,6 +134,7 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 5 h 2001-10-31 23:59:59 select table shared mode +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a LOCK IN SHARE MODE; a b date_format(c, '%Y-%m-%d %H:%i:%s') @@ -138,6 +145,7 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 5 h 2001-10-31 23:59:59 select table for update +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a FOR UPDATE; a b date_format(c, '%Y-%m-%d %H:%i:%s') @@ -148,6 +156,7 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 5 h 2001-10-31 23:59:59 select table join +connection master_1; SELECT a.a, a.b, date_format(b.c, '%Y-%m-%d %H:%i:%s') FROM ta_l a, tb_l b WHERE a.a = b.a ORDER BY a.a; a b date_format(b.c, '%Y-%m-%d %H:%i:%s') @@ -158,6 +167,7 @@ a b date_format(b.c, '%Y-%m-%d %H:%i:%s') 5 h 2001-10-31 23:59:59 select table straight_join +connection master_1; SELECT STRAIGHT_JOIN a.a, a.b, date_format(b.c, '%Y-%m-%d %H:%i:%s') FROM ta_l a, tb_l b WHERE a.a = b.a ORDER BY a.a; a b date_format(b.c, '%Y-%m-%d %H:%i:%s') @@ -168,6 +178,7 @@ a b date_format(b.c, '%Y-%m-%d %H:%i:%s') 5 h 2001-10-31 23:59:59 select sql_small_result +connection master_1; SELECT SQL_SMALL_RESULT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') @@ -178,6 +189,7 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 5 h 2001-10-31 23:59:59 select sql_big_result +connection master_1; SELECT SQL_BIG_RESULT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') @@ -188,6 +200,7 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 5 h 2001-10-31 23:59:59 select sql_buffer_result +connection master_1; SELECT SQL_BUFFER_RESULT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') @@ -198,6 +211,7 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 5 h 2001-10-31 23:59:59 select sql_cache +connection master_1; SELECT SQL_CACHE a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') @@ -208,6 +222,7 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 5 h 2001-10-31 23:59:59 select sql_no_cache +connection master_1; SELECT SQL_NO_CACHE a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') @@ -218,6 +233,7 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 5 h 2001-10-31 23:59:59 select sql_calc_found_rows +connection master_1; SELECT SQL_CALC_FOUND_ROWS a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a LIMIT 4; a b date_format(c, '%Y-%m-%d %H:%i:%s') @@ -225,11 +241,13 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 2 g 2000-02-01 00:00:00 3 j 2007-05-04 20:03:11 4 i 2003-10-30 05:01:03 +connection master_1; SELECT found_rows(); found_rows() 5 select high_priority +connection master_1; SELECT HIGH_PRIORITY a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') @@ -240,6 +258,7 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 5 h 2001-10-31 23:59:59 select distinct +connection master_1; SELECT DISTINCT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') @@ -250,11 +269,13 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 5 h 2001-10-31 23:59:59 select count +connection master_1; SELECT count(*) FROM ta_l ORDER BY a; count(*) 5 select table join not use index +connection master_1; SELECT a.a, a.b, date_format(a.c, '%Y-%m-%d %H:%i:%s') FROM tb_l a WHERE EXISTS (SELECT * FROM ta_l b WHERE b.b = a.b) ORDER BY a.a; a b date_format(a.c, '%Y-%m-%d %H:%i:%s') @@ -265,39 +286,35 @@ a b date_format(a.c, '%Y-%m-%d %H:%i:%s') 5 h 2001-10-31 23:59:59 select using pushdown +connection master_1; SELECT a.a, a.b, date_format(a.c, '%Y-%m-%d %H:%i:%s') FROM ta_l a WHERE a.b = 'g' ORDER BY a.a; a b date_format(a.c, '%Y-%m-%d %H:%i:%s') 2 g 2000-02-01 00:00:00 select using index and pushdown +connection master_1; SELECT a.a, a.b, date_format(a.c, '%Y-%m-%d %H:%i:%s') FROM ta_l a WHERE a.a > 0 AND a.b = 'g' ORDER BY a.a; a b date_format(a.c, '%Y-%m-%d %H:%i:%s') 2 g 2000-02-01 00:00:00 -select partition using pushdown -SELECT a.a, a.b, date_format(a.c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 a WHERE -a.b = 'g' ORDER BY a.a; -a b date_format(a.c, '%Y-%m-%d %H:%i:%s') -2 g 2000-02-01 00:00:00 - -select partition using index pushdown -SELECT a.a, a.b, date_format(a.c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 a WHERE -a.a > 0 AND a.b = 'g' ORDER BY a.a; -a b date_format(a.c, '%Y-%m-%d %H:%i:%s') -2 g 2000-02-01 00:00:00 - insert +connection master_1; TRUNCATE TABLE ta_l; +connection master_1; INSERT INTO ta_l (a, b, c) VALUES (2, 'e', '2008-01-01 23:59:59'); +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 2 e 2008-01-01 23:59:59 insert select +connection master_1; TRUNCATE TABLE ta_l; +connection master_1; INSERT INTO ta_l (a, b, c) SELECT a, b, c FROM tb_l; +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 f 2008-07-01 10:21:39 @@ -307,59 +324,82 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 5 h 2001-10-31 23:59:59 insert select a +connection master_1; TRUNCATE TABLE ta_l; +connection master_1; INSERT INTO ta_l (a, b, c) VALUES ((SELECT a FROM tb_l ORDER BY a LIMIT 1), 'e', '2008-01-01 23:59:59'); +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 e 2008-01-01 23:59:59 insert low_priority +connection master_1; TRUNCATE TABLE ta_l; +connection master_1; INSERT LOW_PRIORITY INTO ta_l (a, b, c) values (2, 'e', '2008-01-01 23:59:59'); +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 2 e 2008-01-01 23:59:59 insert high_priority +connection master_1; TRUNCATE TABLE ta_l; +connection master_1; INSERT HIGH_PRIORITY INTO ta_l (a, b, c) VALUES (2, 'e', '2008-01-01 23:59:59'); +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 2 e 2008-01-01 23:59:59 insert ignore +connection master_1; INSERT IGNORE INTO ta_l (a, b, c) VALUES (2, 'd', '2009-02-02 01:01:01'); +Warnings: +Warning 1062 Duplicate entry '2' for key 'PRIMARY' +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 2 e 2008-01-01 23:59:59 insert update (insert) +connection master_1; TRUNCATE TABLE ta_l; +connection master_1; INSERT INTO ta_l (a, b, c) VALUES (2, 'e', '2008-01-01 23:59:59') ON DUPLICATE KEY UPDATE b = 'f', c = '2005-08-08 11:11:11'; +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 2 e 2008-01-01 23:59:59 insert update (update) +connection master_1; INSERT INTO ta_l (a, b, c) VALUES (2, 'e', '2008-01-01 23:59:59') ON DUPLICATE KEY UPDATE b = 'f', c = '2005-08-08 11:11:11'; +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 2 f 2005-08-08 11:11:11 replace +connection master_1; TRUNCATE TABLE ta_l; INSERT INTO ta_l (a, b, c) VALUES (2, 'e', '2008-01-01 23:59:59'); +connection master_1; REPLACE INTO ta_l (a, b, c) VALUES (2, 'f', '2008-02-02 02:02:02'); +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 2 f 2008-02-02 02:02:02 replace select +connection master_1; REPLACE INTO ta_l (a, b, c) SELECT a, b, c FROM tb_l; +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 f 2008-07-01 10:21:39 @@ -369,8 +409,10 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 5 h 2001-10-31 23:59:59 replace select a +connection master_1; REPLACE INTO ta_l (a, b, c) VALUES ((SELECT a FROM tb_l ORDER BY a LIMIT 1), 'e', '2008-01-01 23:59:59'); +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 e 2008-01-01 23:59:59 @@ -380,8 +422,10 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 5 h 2001-10-31 23:59:59 replace low_priority +connection master_1; REPLACE LOW_PRIORITY INTO ta_l (a, b, c) VALUES (3, 'g', '2009-03-03 03:03:03'); +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 e 2008-01-01 23:59:59 @@ -394,91 +438,89 @@ update TRUNCATE TABLE ta_l; INSERT INTO ta_l (a, b, c) VALUES (1, 'e', '2008-01-01 23:59:59'), (2, 'e', '2008-01-01 23:59:59'); +connection master_1; UPDATE ta_l SET b = 'f', c = '2008-02-02 02:02:02' WHERE a = 2; +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 e 2008-01-01 23:59:59 2 f 2008-02-02 02:02:02 update select +connection master_1; UPDATE ta_l SET b = 'g', c = '2009-03-03 03:03:03' WHERE a IN (SELECT a FROM tb_l); +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 g 2009-03-03 03:03:03 2 g 2009-03-03 03:03:03 update select a +connection master_1; UPDATE ta_l SET b = 'h', c = '2010-04-04 04:04:04' WHERE a = (SELECT a FROM tb_l ORDER BY a LIMIT 1); +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 h 2010-04-04 04:04:04 2 g 2009-03-03 03:03:03 update join +connection master_1; UPDATE ta_l a, tb_l b SET a.b = b.b, a.c = b.c WHERE a.a = b.a; +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 f 2008-07-01 10:21:39 2 g 2000-02-01 00:00:00 update join a +connection master_1; UPDATE ta_l a, tb_l b SET a.b = 'g', a.c = '2009-03-03 03:03:03' WHERE a.a = b.a; +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 g 2009-03-03 03:03:03 2 g 2009-03-03 03:03:03 update low_priority +connection master_1; UPDATE LOW_PRIORITY ta_l SET b = 'f', c = '2008-02-02 02:02:02' WHERE a = 2; +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 g 2009-03-03 03:03:03 2 f 2008-02-02 02:02:02 update ignore +connection master_1; UPDATE IGNORE ta_l SET a = 1, b = 'g', c = '2009-03-03 03:03:03' WHERE a = 2; +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 g 2009-03-03 03:03:03 2 f 2008-02-02 02:02:02 update pushdown +connection master_1; update ta_l set b = 'j', c = '2009-03-03 03:03:03' where b = 'f'; +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 g 2009-03-03 03:03:03 2 j 2009-03-03 03:03:03 update index pushdown +connection master_1; UPDATE ta_l SET b = 'g', c = '2009-03-03 03:03:03' WHERE a > 0 AND b = 'j'; +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 g 2009-03-03 03:03:03 2 g 2009-03-03 03:03:03 -update partition pushdown -UPDATE ta_l2 SET b = 'e', c = '2009-03-03 03:03:03' WHERE b = 'j'; -SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; -a b date_format(c, '%Y-%m-%d %H:%i:%s') -1 f 2008-07-01 10:21:39 -2 g 2000-02-01 00:00:00 -3 e 2009-03-03 03:03:03 -4 i 2003-10-30 05:01:03 -5 h 2001-10-31 23:59:59 - -update partition index pushdown -UPDATE ta_l2 SET b = 'j', c = '2009-03-03 03:03:03' WHERE a > 0 AND b = 'e'; -SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; -a b date_format(c, '%Y-%m-%d %H:%i:%s') -1 f 2008-07-01 10:21:39 -2 g 2000-02-01 00:00:00 -3 j 2009-03-03 03:03:03 -4 i 2003-10-30 05:01:03 -5 h 2001-10-31 23:59:59 - delete TRUNCATE TABLE ta_l; INSERT INTO ta_l (a, b, c) VALUES (1, 'e', '2008-01-01 23:59:59'), @@ -487,7 +529,9 @@ INSERT INTO ta_l (a, b, c) VALUES (1, 'e', '2008-01-01 23:59:59'), (6, 'e', '2008-01-01 23:59:59'), (7, 'e', '2008-01-01 23:59:59'), (8, 'e', '2008-01-01 23:59:59'), (9, 'e', '2008-01-01 23:59:59'), (10, 'j', '2008-01-01 23:59:59'); +connection master_1; DELETE FROM ta_l WHERE a = 2; +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 e 2008-01-01 23:59:59 @@ -501,7 +545,9 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 10 j 2008-01-01 23:59:59 delete all +connection master_1; DELETE FROM ta_l; +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') @@ -513,7 +559,9 @@ INSERT INTO ta_l (a, b, c) VALUES (1, 'e', '2008-01-01 23:59:59'), (6, 'e', '2008-01-01 23:59:59'), (7, 'e', '2008-01-01 23:59:59'), (8, 'e', '2008-01-01 23:59:59'), (9, 'e', '2008-01-01 23:59:59'), (10, 'j', '2008-01-01 23:59:59'); +connection master_1; DELETE FROM ta_l WHERE a IN (SELECT a FROM tb_l); +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 6 e 2008-01-01 23:59:59 @@ -530,7 +578,9 @@ INSERT INTO ta_l (a, b, c) VALUES (1, 'e', '2008-01-01 23:59:59'), (6, 'e', '2008-01-01 23:59:59'), (7, 'e', '2008-01-01 23:59:59'), (8, 'e', '2008-01-01 23:59:59'), (9, 'e', '2008-01-01 23:59:59'), (10, 'j', '2008-01-01 23:59:59'); +connection master_1; DELETE FROM ta_l WHERE a = (SELECT a FROM tb_l ORDER BY a LIMIT 1); +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 2 e 2008-01-01 23:59:59 @@ -551,7 +601,9 @@ INSERT INTO ta_l (a, b, c) VALUES (1, 'e', '2008-01-01 23:59:59'), (6, 'e', '2008-01-01 23:59:59'), (7, 'e', '2008-01-01 23:59:59'), (8, 'e', '2008-01-01 23:59:59'), (9, 'e', '2008-01-01 23:59:59'), (10, 'j', '2008-01-01 23:59:59'); +connection master_1; DELETE a FROM ta_l a, (SELECT a FROM tb_l ORDER BY a) b WHERE a.a = b.a; +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 6 e 2008-01-01 23:59:59 @@ -568,7 +620,9 @@ INSERT INTO ta_l (a, b, c) VALUES (1, 'e', '2008-01-01 23:59:59'), (6, 'e', '2008-01-01 23:59:59'), (7, 'e', '2008-01-01 23:59:59'), (8, 'e', '2008-01-01 23:59:59'), (9, 'e', '2008-01-01 23:59:59'), (10, 'j', '2008-01-01 23:59:59'); +connection master_1; DELETE LOW_PRIORITY FROM ta_l WHERE a = 2; +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 e 2008-01-01 23:59:59 @@ -589,7 +643,9 @@ INSERT INTO ta_l (a, b, c) VALUES (1, 'e', '2008-01-01 23:59:59'), (6, 'e', '2008-01-01 23:59:59'), (7, 'e', '2008-01-01 23:59:59'), (8, 'e', '2008-01-01 23:59:59'), (9, 'e', '2008-01-01 23:59:59'), (10, 'j', '2008-01-01 23:59:59'); +connection master_1; DELETE IGNORE FROM ta_l WHERE a = 2; +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 e 2008-01-01 23:59:59 @@ -610,7 +666,9 @@ INSERT INTO ta_l (a, b, c) VALUES (1, 'e', '2008-01-01 23:59:59'), (6, 'e', '2008-01-01 23:59:59'), (7, 'e', '2008-01-01 23:59:59'), (8, 'e', '2008-01-01 23:59:59'), (9, 'e', '2008-01-01 23:59:59'), (10, 'j', '2008-01-01 23:59:59'); +connection master_1; DELETE QUICK FROM ta_l WHERE a = 2; +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 e 2008-01-01 23:59:59 @@ -631,7 +689,9 @@ INSERT INTO ta_l (a, b, c) VALUES (1, 'e', '2008-01-01 23:59:59'), (6, 'e', '2008-01-01 23:59:59'), (7, 'e', '2008-01-01 23:59:59'), (8, 'e', '2008-01-01 23:59:59'), (9, 'e', '2008-01-01 23:59:59'), (10, 'j', '2008-01-01 23:59:59'); +connection master_1; DELETE FROM ta_l WHERE b = 'e'; +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 10 j 2008-01-01 23:59:59 @@ -644,41 +704,26 @@ INSERT INTO ta_l (a, b, c) VALUES (1, 'e', '2008-01-01 23:59:59'), (6, 'e', '2008-01-01 23:59:59'), (7, 'e', '2008-01-01 23:59:59'), (8, 'e', '2008-01-01 23:59:59'), (9, 'e', '2008-01-01 23:59:59'), (10, 'j', '2008-01-01 23:59:59'); +connection master_1; DELETE FROM ta_l WHERE a > 0 AND b = 'e'; +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 10 j 2008-01-01 23:59:59 -delete partition pushdown -TRUNCATE TABLE ta_l2; -INSERT INTO ta_l2 SELECT a, b, c FROM tb_l; -DELETE FROM ta_l2 WHERE b = 'g'; -SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; -a b date_format(c, '%Y-%m-%d %H:%i:%s') -1 f 2008-07-01 10:21:39 -3 j 2007-05-04 20:03:11 -4 i 2003-10-30 05:01:03 -5 h 2001-10-31 23:59:59 - -delete partition index pushdown -TRUNCATE TABLE ta_l2; -INSERT INTO ta_l2 SELECT a, b, c FROM tb_l; -DELETE FROM ta_l2 WHERE a > 0 AND b = 'g'; -SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; -a b date_format(c, '%Y-%m-%d %H:%i:%s') -1 f 2008-07-01 10:21:39 -3 j 2007-05-04 20:03:11 -4 i 2003-10-30 05:01:03 -5 h 2001-10-31 23:59:59 - truncate +connection master_1; TRUNCATE TABLE ta_l; +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') deinit +connection master_1; DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; DROP DATABASE IF EXISTS auto_test_remote; +connection child2_2; DROP DATABASE IF EXISTS auto_test_remote2; for master_1 for child2 diff --git a/storage/spider/mysql-test/spider/handler/r/basic_sql_part.result b/storage/spider/mysql-test/spider/handler/r/basic_sql_part.result new file mode 100644 index 00000000000..0f4029404a7 --- /dev/null +++ b/storage/spider/mysql-test/spider/handler/r/basic_sql_part.result @@ -0,0 +1,141 @@ +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +child3_1 +child3_2 +child3_3 + +drop and create databases +connection master_1; +DROP DATABASE IF EXISTS auto_test_local; +CREATE DATABASE auto_test_local; +USE auto_test_local; +connection child2_1; +DROP DATABASE IF EXISTS auto_test_remote; +CREATE DATABASE auto_test_remote; +USE auto_test_remote; +connection child2_2; +DROP DATABASE IF EXISTS auto_test_remote2; +CREATE DATABASE auto_test_remote2; +USE auto_test_remote2; + +test select 1 +connection master_1; +SELECT 1; +1 +1 +connection master_1; +DROP TABLE IF EXISTS tb_l; +CREATE TABLE tb_l ( +a INT, +b CHAR(1), +c DATETIME, +PRIMARY KEY(a) +) MASTER_1_ENGINE2 MASTER_1_CHARSET2 +INSERT INTO tb_l (a, b, c) VALUES +(1, 'f', '2008-07-01 10:21:39'), +(2, 'g', '2000-02-01 00:00:00'), +(3, 'j', '2007-05-04 20:03:11'), +(4, 'i', '2003-10-30 05:01:03'), +(5, 'h', '2001-10-31 23:59:59'); + +create table with partition and select test +connection master_1; +CREATE TABLE ta_l2 ( +PRIMARY KEY(a) +) MASTER_1_ENGINE MASTER_1_COMMENT_P_2_1 +SELECT a, b, c FROM tb_l +connection master_1; +SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; +a b date_format(c, '%Y-%m-%d %H:%i:%s') +1 f 2008-07-01 10:21:39 +2 g 2000-02-01 00:00:00 +3 j 2007-05-04 20:03:11 +4 i 2003-10-30 05:01:03 +5 h 2001-10-31 23:59:59 + +select partition using pushdown +connection master_1; +SELECT a.a, a.b, date_format(a.c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 a WHERE +a.b = 'g' ORDER BY a.a; +a b date_format(a.c, '%Y-%m-%d %H:%i:%s') +2 g 2000-02-01 00:00:00 + +select partition using index pushdown +connection master_1; +SELECT a.a, a.b, date_format(a.c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 a WHERE +a.a > 0 AND a.b = 'g' ORDER BY a.a; +a b date_format(a.c, '%Y-%m-%d %H:%i:%s') +2 g 2000-02-01 00:00:00 + +update partition pushdown +connection master_1; +UPDATE ta_l2 SET b = 'e', c = '2009-03-03 03:03:03' WHERE b = 'j'; +connection master_1; +SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; +a b date_format(c, '%Y-%m-%d %H:%i:%s') +1 f 2008-07-01 10:21:39 +2 g 2000-02-01 00:00:00 +3 e 2009-03-03 03:03:03 +4 i 2003-10-30 05:01:03 +5 h 2001-10-31 23:59:59 + +update partition index pushdown +connection master_1; +UPDATE ta_l2 SET b = 'j', c = '2009-03-03 03:03:03' WHERE a > 0 AND b = 'e'; +connection master_1; +SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; +a b date_format(c, '%Y-%m-%d %H:%i:%s') +1 f 2008-07-01 10:21:39 +2 g 2000-02-01 00:00:00 +3 j 2009-03-03 03:03:03 +4 i 2003-10-30 05:01:03 +5 h 2001-10-31 23:59:59 + +delete partition pushdown +TRUNCATE TABLE ta_l2; +INSERT INTO ta_l2 SELECT a, b, c FROM tb_l; +connection master_1; +DELETE FROM ta_l2 WHERE b = 'g'; +connection master_1; +SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; +a b date_format(c, '%Y-%m-%d %H:%i:%s') +1 f 2008-07-01 10:21:39 +3 j 2007-05-04 20:03:11 +4 i 2003-10-30 05:01:03 +5 h 2001-10-31 23:59:59 + +delete partition index pushdown +TRUNCATE TABLE ta_l2; +INSERT INTO ta_l2 SELECT a, b, c FROM tb_l; +connection master_1; +DELETE FROM ta_l2 WHERE a > 0 AND b = 'g'; +connection master_1; +SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; +a b date_format(c, '%Y-%m-%d %H:%i:%s') +1 f 2008-07-01 10:21:39 +3 j 2007-05-04 20:03:11 +4 i 2003-10-30 05:01:03 +5 h 2001-10-31 23:59:59 + +deinit +connection master_1; +DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; +DROP DATABASE IF EXISTS auto_test_remote; +connection child2_2; +DROP DATABASE IF EXISTS auto_test_remote2; +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +child3_1 +child3_2 +child3_3 + +end of test diff --git a/storage/spider/mysql-test/spider/handler/r/direct_aggregate.result b/storage/spider/mysql-test/spider/handler/r/direct_aggregate.result index 0e845fabda1..9a8660ba79e 100644 --- a/storage/spider/mysql-test/spider/handler/r/direct_aggregate.result +++ b/storage/spider/mysql-test/spider/handler/r/direct_aggregate.result @@ -9,22 +9,27 @@ child3_2 child3_3 drop and create databases +connection master_1; DROP DATABASE IF EXISTS auto_test_local; CREATE DATABASE auto_test_local; USE auto_test_local; +connection child2_1; DROP DATABASE IF EXISTS auto_test_remote; CREATE DATABASE auto_test_remote; USE auto_test_remote; +connection child2_2; DROP DATABASE IF EXISTS auto_test_remote2; CREATE DATABASE auto_test_remote2; USE auto_test_remote2; test select 1 +connection master_1; SELECT 1; 1 1 create table select test +connection master_1; DROP TABLE IF EXISTS ta_l; CREATE TABLE ta_l ( a INT, @@ -40,6 +45,7 @@ INSERT INTO ta_l (a, b, c) VALUES (5, 'c', '2001-12-31 23:59:59'); direct_aggregating test +connection master_1; SHOW STATUS LIKE 'Spider_direct_aggregate'; Variable_name Value Spider_direct_aggregate 0 @@ -48,76 +54,38 @@ COUNT(*) 5 SHOW STATUS LIKE 'Spider_direct_aggregate'; Variable_name Value -Spider_direct_aggregate 1 +Spider_direct_aggregate 0 SELECT MAX(a) FROM ta_l; MAX(a) 5 SHOW STATUS LIKE 'Spider_direct_aggregate'; Variable_name Value -Spider_direct_aggregate 2 +Spider_direct_aggregate 0 SELECT MIN(a) FROM ta_l; MIN(a) 1 SHOW STATUS LIKE 'Spider_direct_aggregate'; Variable_name Value -Spider_direct_aggregate 3 +Spider_direct_aggregate 0 SELECT MAX(a) FROM ta_l WHERE a < 5; MAX(a) 4 SHOW STATUS LIKE 'Spider_direct_aggregate'; Variable_name Value -Spider_direct_aggregate 4 +Spider_direct_aggregate 0 SELECT MIN(a) FROM ta_l WHERE a > 1; MIN(a) 2 SHOW STATUS LIKE 'Spider_direct_aggregate'; Variable_name Value -Spider_direct_aggregate 5 - -handler with partition test -CREATE TABLE ta_l2 ( -a INT, -b CHAR(1), -c DATETIME, -PRIMARY KEY(a) -) MASTER_1_ENGINE MASTER_1_COMMENT2_P_2_1 -SHOW STATUS LIKE 'Spider_direct_aggregate'; -Variable_name Value -Spider_direct_aggregate 5 -SELECT COUNT(*) FROM ta_l2; -COUNT(*) -5 -SHOW STATUS LIKE 'Spider_direct_aggregate'; -Variable_name Value -Spider_direct_aggregate 7 -SELECT MAX(a) FROM ta_l2; -MAX(a) -5 -SHOW STATUS LIKE 'Spider_direct_aggregate'; -Variable_name Value -Spider_direct_aggregate 9 -SELECT MIN(a) FROM ta_l2; -MIN(a) -1 -SHOW STATUS LIKE 'Spider_direct_aggregate'; -Variable_name Value -Spider_direct_aggregate 11 -SELECT MAX(a) FROM ta_l2 WHERE a < 5; -MAX(a) -4 -SHOW STATUS LIKE 'Spider_direct_aggregate'; -Variable_name Value -Spider_direct_aggregate 13 -SELECT MIN(a) FROM ta_l2 WHERE a > 1; -MIN(a) -2 -SHOW STATUS LIKE 'Spider_direct_aggregate'; -Variable_name Value -Spider_direct_aggregate 15 +Spider_direct_aggregate 0 deinit +connection master_1; DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; DROP DATABASE IF EXISTS auto_test_remote; +connection child2_2; DROP DATABASE IF EXISTS auto_test_remote2; for master_1 for child2 diff --git a/storage/spider/mysql-test/spider/handler/r/direct_aggregate_part.result b/storage/spider/mysql-test/spider/handler/r/direct_aggregate_part.result new file mode 100644 index 00000000000..760b39e16d5 --- /dev/null +++ b/storage/spider/mysql-test/spider/handler/r/direct_aggregate_part.result @@ -0,0 +1,90 @@ +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +child3_1 +child3_2 +child3_3 + +drop and create databases +connection master_1; +DROP DATABASE IF EXISTS auto_test_local; +CREATE DATABASE auto_test_local; +USE auto_test_local; +connection child2_1; +DROP DATABASE IF EXISTS auto_test_remote; +CREATE DATABASE auto_test_remote; +USE auto_test_remote; +connection child2_2; +DROP DATABASE IF EXISTS auto_test_remote2; +CREATE DATABASE auto_test_remote2; +USE auto_test_remote2; + +test select 1 +connection master_1; +SELECT 1; +1 +1 + +with partition test +connection master_1; +CREATE TABLE ta_l2 ( +a INT, +b CHAR(1), +c DATETIME, +PRIMARY KEY(a) +) MASTER_1_ENGINE MASTER_1_COMMENT2_P_2_1 +SHOW STATUS LIKE 'Spider_direct_aggregate'; +Variable_name Value +Spider_direct_aggregate 0 +SELECT COUNT(*) FROM ta_l2; +COUNT(*) +5 +SHOW STATUS LIKE 'Spider_direct_aggregate'; +Variable_name Value +Spider_direct_aggregate 0 +SELECT MAX(a) FROM ta_l2; +MAX(a) +5 +SHOW STATUS LIKE 'Spider_direct_aggregate'; +Variable_name Value +Spider_direct_aggregate 0 +SELECT MIN(a) FROM ta_l2; +MIN(a) +1 +SHOW STATUS LIKE 'Spider_direct_aggregate'; +Variable_name Value +Spider_direct_aggregate 0 +SELECT MAX(a) FROM ta_l2 WHERE a < 5; +MAX(a) +4 +SHOW STATUS LIKE 'Spider_direct_aggregate'; +Variable_name Value +Spider_direct_aggregate 0 +SELECT MIN(a) FROM ta_l2 WHERE a > 1; +MIN(a) +2 +SHOW STATUS LIKE 'Spider_direct_aggregate'; +Variable_name Value +Spider_direct_aggregate 0 + +deinit +connection master_1; +DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; +DROP DATABASE IF EXISTS auto_test_remote; +connection child2_2; +DROP DATABASE IF EXISTS auto_test_remote2; +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +child3_1 +child3_2 +child3_3 + +end of test diff --git a/storage/spider/mysql-test/spider/handler/r/direct_update.result b/storage/spider/mysql-test/spider/handler/r/direct_update.result index ea3a23eb8b8..74dae7aec2e 100644 --- a/storage/spider/mysql-test/spider/handler/r/direct_update.result +++ b/storage/spider/mysql-test/spider/handler/r/direct_update.result @@ -9,22 +9,27 @@ child3_2 child3_3 drop and create databases +connection master_1; DROP DATABASE IF EXISTS auto_test_local; CREATE DATABASE auto_test_local; USE auto_test_local; +connection child2_1; DROP DATABASE IF EXISTS auto_test_remote; CREATE DATABASE auto_test_remote; USE auto_test_remote; +connection child2_2; DROP DATABASE IF EXISTS auto_test_remote2; CREATE DATABASE auto_test_remote2; USE auto_test_remote2; test select 1 +connection master_1; SELECT 1; 1 1 create table select test +connection master_1; DROP TABLE IF EXISTS ta_l; CREATE TABLE ta_l ( a INT, @@ -40,9 +45,9 @@ INSERT INTO ta_l (a, b, c) VALUES (5, 'c', '2001-12-31 23:59:59'); direct_updating test +connection master_1; SHOW STATUS LIKE 'Spider_direct_update'; Variable_name Value -Spider_direct_update 0 SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 a 2008-08-01 10:21:39 @@ -54,7 +59,6 @@ update all rows with function UPDATE ta_l SET c = ADDDATE(c, 1); SHOW STATUS LIKE 'Spider_direct_update'; Variable_name Value -Spider_direct_update 1 SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 a 2008-08-02 10:21:39 @@ -66,7 +70,6 @@ update by primary key UPDATE ta_l SET b = 'x' WHERE a = 3; SHOW STATUS LIKE 'Spider_direct_update'; Variable_name Value -Spider_direct_update 2 SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 a 2008-08-02 10:21:39 @@ -78,7 +81,6 @@ update by a column without index UPDATE ta_l SET c = '2011-10-17' WHERE b = 'x'; SHOW STATUS LIKE 'Spider_direct_update'; Variable_name Value -Spider_direct_update 3 SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 a 2008-08-02 10:21:39 @@ -90,7 +92,6 @@ update by primary key with order and limit UPDATE ta_l SET c = ADDDATE(c, 1) WHERE a < 4 ORDER BY b DESC LIMIT 1; SHOW STATUS LIKE 'Spider_direct_update'; Variable_name Value -Spider_direct_update 4 SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 a 2008-08-02 10:21:39 @@ -102,7 +103,6 @@ delete by primary key with order and limit DELETE FROM ta_l WHERE a < 4 ORDER BY c LIMIT 1; SHOW STATUS LIKE 'Spider_direct_delete'; Variable_name Value -Spider_direct_delete 1 SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 a 2008-08-02 10:21:39 @@ -113,7 +113,6 @@ delete by a column without index DELETE FROM ta_l WHERE b = 'c'; SHOW STATUS LIKE 'Spider_direct_delete'; Variable_name Value -Spider_direct_delete 2 SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 a 2008-08-02 10:21:39 @@ -123,111 +122,17 @@ delete by primary key DELETE FROM ta_l WHERE a = 3; SHOW STATUS LIKE 'Spider_direct_delete'; Variable_name Value -Spider_direct_delete 3 SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 a 2008-08-02 10:21:39 4 d 2003-12-01 05:01:03 -handler with partition test -CREATE TABLE ta_l2 ( -a INT, -b CHAR(1), -c DATETIME, -PRIMARY KEY(a) -) MASTER_1_ENGINE MASTER_1_COMMENT2_P_2_1 -SHOW STATUS LIKE 'Spider_direct_update'; -Variable_name Value -Spider_direct_update 4 -SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; -a b date_format(c, '%Y-%m-%d %H:%i:%s') -1 a 2008-08-01 10:21:39 -2 b 2000-01-01 00:00:00 -3 e 2007-06-04 20:03:11 -4 d 2003-11-30 05:01:03 -5 c 2001-12-31 23:59:59 -update all rows with function -UPDATE ta_l2 SET c = ADDDATE(c, 1); -SHOW STATUS LIKE 'Spider_direct_update'; -Variable_name Value -Spider_direct_update 6 -SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; -a b date_format(c, '%Y-%m-%d %H:%i:%s') -1 a 2008-08-02 10:21:39 -2 b 2000-01-02 00:00:00 -3 e 2007-06-05 20:03:11 -4 d 2003-12-01 05:01:03 -5 c 2002-01-01 23:59:59 -update by primary key -UPDATE ta_l2 SET b = 'x' WHERE a = 3; -SHOW STATUS LIKE 'Spider_direct_update'; -Variable_name Value -Spider_direct_update 7 -SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; -a b date_format(c, '%Y-%m-%d %H:%i:%s') -1 a 2008-08-02 10:21:39 -2 b 2000-01-02 00:00:00 -3 x 2007-06-05 20:03:11 -4 d 2003-12-01 05:01:03 -5 c 2002-01-01 23:59:59 -update by a column without index -UPDATE ta_l2 SET c = '2011-10-17' WHERE b = 'x'; -SHOW STATUS LIKE 'Spider_direct_update'; -Variable_name Value -Spider_direct_update 9 -SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; -a b date_format(c, '%Y-%m-%d %H:%i:%s') -1 a 2008-08-02 10:21:39 -2 b 2000-01-02 00:00:00 -3 x 2011-10-17 00:00:00 -4 d 2003-12-01 05:01:03 -5 c 2002-01-01 23:59:59 -update by primary key with order and limit -UPDATE ta_l2 SET c = ADDDATE(c, 1) WHERE a < 4 ORDER BY b DESC LIMIT 1; -SHOW STATUS LIKE 'Spider_direct_update'; -Variable_name Value -Spider_direct_update 10 -SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; -a b date_format(c, '%Y-%m-%d %H:%i:%s') -1 a 2008-08-02 10:21:39 -2 b 2000-01-02 00:00:00 -3 x 2011-10-18 00:00:00 -4 d 2003-12-01 05:01:03 -5 c 2002-01-01 23:59:59 -delete by primary key with order and limit -DELETE FROM ta_l2 WHERE a < 4 ORDER BY c LIMIT 1; -SHOW STATUS LIKE 'Spider_direct_delete'; -Variable_name Value -Spider_direct_delete 4 -SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; -a b date_format(c, '%Y-%m-%d %H:%i:%s') -1 a 2008-08-02 10:21:39 -3 x 2011-10-18 00:00:00 -4 d 2003-12-01 05:01:03 -5 c 2002-01-01 23:59:59 -delete by a column without index -DELETE FROM ta_l2 WHERE b = 'c'; -SHOW STATUS LIKE 'Spider_direct_delete'; -Variable_name Value -Spider_direct_delete 6 -SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; -a b date_format(c, '%Y-%m-%d %H:%i:%s') -1 a 2008-08-02 10:21:39 -3 x 2011-10-18 00:00:00 -4 d 2003-12-01 05:01:03 -delete by primary key -DELETE FROM ta_l2 WHERE a = 3; -SHOW STATUS LIKE 'Spider_direct_delete'; -Variable_name Value -Spider_direct_delete 7 -SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; -a b date_format(c, '%Y-%m-%d %H:%i:%s') -1 a 2008-08-02 10:21:39 -4 d 2003-12-01 05:01:03 - deinit +connection master_1; DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; DROP DATABASE IF EXISTS auto_test_remote; +connection child2_2; DROP DATABASE IF EXISTS auto_test_remote2; for master_1 for child2 diff --git a/storage/spider/mysql-test/spider/handler/r/direct_update_part.result b/storage/spider/mysql-test/spider/handler/r/direct_update_part.result new file mode 100644 index 00000000000..6db7c01f563 --- /dev/null +++ b/storage/spider/mysql-test/spider/handler/r/direct_update_part.result @@ -0,0 +1,137 @@ +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +child3_1 +child3_2 +child3_3 + +drop and create databases +connection master_1; +DROP DATABASE IF EXISTS auto_test_local; +CREATE DATABASE auto_test_local; +USE auto_test_local; +connection child2_1; +DROP DATABASE IF EXISTS auto_test_remote; +CREATE DATABASE auto_test_remote; +USE auto_test_remote; +connection child2_2; +DROP DATABASE IF EXISTS auto_test_remote2; +CREATE DATABASE auto_test_remote2; +USE auto_test_remote2; + +test select 1 +connection master_1; +SELECT 1; +1 +1 + +with partition test +connection master_1; +CREATE TABLE ta_l2 ( +a INT, +b CHAR(1), +c DATETIME, +PRIMARY KEY(a) +) MASTER_1_ENGINE MASTER_1_COMMENT2_P_2_1 +SHOW STATUS LIKE 'Spider_direct_update'; +Variable_name Value +SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; +a b date_format(c, '%Y-%m-%d %H:%i:%s') +1 a 2008-08-01 10:21:39 +2 b 2000-01-01 00:00:00 +3 e 2007-06-04 20:03:11 +4 d 2003-11-30 05:01:03 +5 c 2001-12-31 23:59:59 +update all rows with function +UPDATE ta_l2 SET c = ADDDATE(c, 1); +SHOW STATUS LIKE 'Spider_direct_update'; +Variable_name Value +SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; +a b date_format(c, '%Y-%m-%d %H:%i:%s') +1 a 2008-08-02 10:21:39 +2 b 2000-01-02 00:00:00 +3 e 2007-06-05 20:03:11 +4 d 2003-12-01 05:01:03 +5 c 2002-01-01 23:59:59 +update by primary key +UPDATE ta_l2 SET b = 'x' WHERE a = 3; +SHOW STATUS LIKE 'Spider_direct_update'; +Variable_name Value +SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; +a b date_format(c, '%Y-%m-%d %H:%i:%s') +1 a 2008-08-02 10:21:39 +2 b 2000-01-02 00:00:00 +3 x 2007-06-05 20:03:11 +4 d 2003-12-01 05:01:03 +5 c 2002-01-01 23:59:59 +update by a column without index +UPDATE ta_l2 SET c = '2011-10-17' WHERE b = 'x'; +SHOW STATUS LIKE 'Spider_direct_update'; +Variable_name Value +SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; +a b date_format(c, '%Y-%m-%d %H:%i:%s') +1 a 2008-08-02 10:21:39 +2 b 2000-01-02 00:00:00 +3 x 2011-10-17 00:00:00 +4 d 2003-12-01 05:01:03 +5 c 2002-01-01 23:59:59 +update by primary key with order and limit +UPDATE ta_l2 SET c = ADDDATE(c, 1) WHERE a < 4 ORDER BY b DESC LIMIT 1; +SHOW STATUS LIKE 'Spider_direct_update'; +Variable_name Value +SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; +a b date_format(c, '%Y-%m-%d %H:%i:%s') +1 a 2008-08-02 10:21:39 +2 b 2000-01-02 00:00:00 +3 x 2011-10-18 00:00:00 +4 d 2003-12-01 05:01:03 +5 c 2002-01-01 23:59:59 +delete by primary key with order and limit +DELETE FROM ta_l2 WHERE a < 4 ORDER BY c LIMIT 1; +SHOW STATUS LIKE 'Spider_direct_delete'; +Variable_name Value +SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; +a b date_format(c, '%Y-%m-%d %H:%i:%s') +1 a 2008-08-02 10:21:39 +3 x 2011-10-18 00:00:00 +4 d 2003-12-01 05:01:03 +5 c 2002-01-01 23:59:59 +delete by a column without index +DELETE FROM ta_l2 WHERE b = 'c'; +SHOW STATUS LIKE 'Spider_direct_delete'; +Variable_name Value +SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; +a b date_format(c, '%Y-%m-%d %H:%i:%s') +1 a 2008-08-02 10:21:39 +3 x 2011-10-18 00:00:00 +4 d 2003-12-01 05:01:03 +delete by primary key +DELETE FROM ta_l2 WHERE a = 3; +SHOW STATUS LIKE 'Spider_direct_delete'; +Variable_name Value +SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; +a b date_format(c, '%Y-%m-%d %H:%i:%s') +1 a 2008-08-02 10:21:39 +4 d 2003-12-01 05:01:03 + +deinit +connection master_1; +DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; +DROP DATABASE IF EXISTS auto_test_remote; +connection child2_2; +DROP DATABASE IF EXISTS auto_test_remote2; +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +child3_1 +child3_2 +child3_3 + +end of test diff --git a/storage/spider/mysql-test/spider/handler/r/function.result b/storage/spider/mysql-test/spider/handler/r/function.result index 764c774514b..c088a8a9541 100644 --- a/storage/spider/mysql-test/spider/handler/r/function.result +++ b/storage/spider/mysql-test/spider/handler/r/function.result @@ -9,22 +9,27 @@ child3_2 child3_3 drop and create databases +connection master_1; DROP DATABASE IF EXISTS auto_test_local; CREATE DATABASE auto_test_local; USE auto_test_local; +connection child2_1; DROP DATABASE IF EXISTS auto_test_remote; CREATE DATABASE auto_test_remote; USE auto_test_remote; +connection child2_2; DROP DATABASE IF EXISTS auto_test_remote2; CREATE DATABASE auto_test_remote2; USE auto_test_remote2; test select 1 +connection master_1; SELECT 1; 1 1 in() +connection master_1; CREATE TABLE t1 ( a VARCHAR(255), PRIMARY KEY(a) @@ -41,12 +46,14 @@ insert into t1 select a + 128 from t1; insert into t1 select a + 256 from t1; insert into t1 select a + 512 from t1; flush tables; +connection master_1; select a from t1 where a in ('15', '120'); a 120 15 date_sub() +connection master_1; DROP TABLE IF EXISTS ta_l; CREATE TABLE ta_l ( a INT, @@ -124,6 +131,7 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 4 d 2003-02-03 06:00:03 5 c 2001-03-07 00:58:59 UPDATE ta_l SET c = DATE_ADD(c, INTERVAL 1 SECOND); +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 a 2007-10-07 11:20:40 @@ -133,8 +141,11 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 5 c 2001-03-07 00:59:00 deinit +connection master_1; DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; DROP DATABASE IF EXISTS auto_test_remote; +connection child2_2; DROP DATABASE IF EXISTS auto_test_remote2; for master_1 for child2 diff --git a/storage/spider/mysql-test/spider/handler/r/ha.result b/storage/spider/mysql-test/spider/handler/r/ha.result index e05ecb32e1b..f8833c229ef 100644 --- a/storage/spider/mysql-test/spider/handler/r/ha.result +++ b/storage/spider/mysql-test/spider/handler/r/ha.result @@ -18,34 +18,43 @@ child3_2 child3_3 drop and create databases +connection master_1; DROP DATABASE IF EXISTS auto_test_local; CREATE DATABASE auto_test_local; USE auto_test_local; +connection child2_1; DROP DATABASE IF EXISTS auto_test_remote; CREATE DATABASE auto_test_remote; USE auto_test_remote; +connection child2_2; DROP DATABASE IF EXISTS auto_test_remote2; CREATE DATABASE auto_test_remote2; USE auto_test_remote2; +connection child2_3; DROP DATABASE IF EXISTS auto_test_remote3; CREATE DATABASE auto_test_remote3; USE auto_test_remote3; +connection child3_1; DROP DATABASE IF EXISTS auto_test_local; CREATE DATABASE auto_test_local; USE auto_test_local; +connection child3_2; DROP DATABASE IF EXISTS auto_test_local; CREATE DATABASE auto_test_local; USE auto_test_local; +connection child3_3; DROP DATABASE IF EXISTS auto_test_local; CREATE DATABASE auto_test_local; USE auto_test_local; test select 1 +connection master_1; SELECT 1; 1 1 create table test +connection master_1; DROP TABLE IF EXISTS ta_l; CREATE TABLE ta_l ( a INT, @@ -61,6 +70,7 @@ INSERT INTO ta_l (a, b, c) VALUES (5, 'c', '2001-12-31 23:59:59'); select test +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 a 2008-08-01 10:21:39 @@ -70,6 +80,7 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 5 c 2001-12-31 23:59:59 fail-over test +connection master_1; SHOW STATUS LIKE 'Spider_mon_table_cache_version%'; Variable_name Value Spider_mon_table_cache_version 0 @@ -101,6 +112,7 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 6 e 2011-05-05 20:04:05 recovery test +connection master_1; ALTER TABLE ta_l CONNECTION='host "localhost", user "root", password "", msi "5", mkd "2", @@ -113,6 +125,7 @@ auto_test_local ta_l 1 2 SELECT spider_copy_tables('ta_l', '0', '1'); spider_copy_tables('ta_l', '0', '1') 1 +connection master_1; ALTER TABLE ta_l CONNECTION='host "localhost", user "root", password "", msi "5", mkd "2", @@ -134,117 +147,14 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 6 e 2011-05-05 20:04:05 8 g 2011-05-05 21:33:30 DROP TABLE ta_l; +connection master_1; SELECT spider_flush_table_mon_cache(); spider_flush_table_mon_cache() 1 -create table with partition test -DROP TABLE IF EXISTS ta_l2; -CREATE TABLE ta_l2 ( -a INT, -b CHAR(1), -c DATETIME, -PRIMARY KEY(a) -) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_HA_P_2_1 -INSERT INTO ta_l2 (a, b, c) VALUES -(1, 'a', '2008-08-01 10:21:39'), -(2, 'b', '2000-01-01 00:00:00'), -(3, 'e', '2007-06-04 20:03:11'), -(4, 'd', '2003-11-30 05:01:03'), -(5, 'c', '2001-12-31 23:59:59'); - -select test -SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; -a b date_format(c, '%Y-%m-%d %H:%i:%s') -1 a 2008-08-01 10:21:39 -2 b 2000-01-01 00:00:00 -3 e 2007-06-04 20:03:11 -4 d 2003-11-30 05:01:03 -5 c 2001-12-31 23:59:59 - -fail-over test -SHOW STATUS LIKE 'Spider_mon_table_cache_version%'; -Variable_name Value -Spider_mon_table_cache_version 1 -Spider_mon_table_cache_version_req 2 -INSERT INTO ta_l2 (a, b, c) VALUES -(6, 'e', '2011-05-05 20:04:05'); -ERROR HY000: Table 'auto_test_remote3.ta_r4' get a problem -SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables -ORDER BY db_name, table_name, link_id; -db_name table_name link_id link_status -auto_test_local ta_l2#P#pt1 0 1 -auto_test_local ta_l2#P#pt1 1 1 -auto_test_local ta_l2#P#pt2 0 1 -auto_test_local ta_l2#P#pt2 1 3 -SELECT db_name, table_name, link_id FROM mysql.spider_link_failed_log; -db_name table_name link_id -auto_test_local ta_l 1 -auto_test_local ta_l2#P#pt2 1 -SHOW STATUS LIKE 'Spider_mon_table_cache_version%'; -Variable_name Value -Spider_mon_table_cache_version 2 -Spider_mon_table_cache_version_req 2 -INSERT INTO ta_l2 (a, b, c) VALUES -(6, 'e', '2011-05-05 20:04:05'); -SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; -a b date_format(c, '%Y-%m-%d %H:%i:%s') -1 a 2008-08-01 10:21:39 -2 b 2000-01-01 00:00:00 -3 e 2007-06-04 20:03:11 -4 d 2003-11-30 05:01:03 -5 c 2001-12-31 23:59:59 -6 e 2011-05-05 20:04:05 - -recovery test -ALTER TABLE ta_l2 -PARTITION BY KEY(a) ( -PARTITION pt1 COMMENT='srv "s_2_1 s_2_2", tbl "ta_r ta_r3", - priority "1000"', -PARTITION pt2 COMMENT='srv "s_2_1 s_2_3", tbl "ta_r2 ta_r4", - priority "1000001", lst "0 2"' - ); -SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables -ORDER BY db_name, table_name, link_id; -db_name table_name link_id link_status -auto_test_local ta_l2#P#pt1 0 1 -auto_test_local ta_l2#P#pt1 1 1 -auto_test_local ta_l2#P#pt2 0 1 -auto_test_local ta_l2#P#pt2 1 2 -SELECT spider_copy_tables('ta_l2#P#pt2', '0', '1'); -spider_copy_tables('ta_l2#P#pt2', '0', '1') -1 -ALTER TABLE ta_l2 -PARTITION BY KEY(a) ( -PARTITION pt1 COMMENT='srv "s_2_1 s_2_2", tbl "ta_r ta_r3", - priority "1000"', -PARTITION pt2 COMMENT='srv "s_2_1 s_2_3", tbl "ta_r2 ta_r4", - priority "1000001", lst "0 1"' - ); -SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables -ORDER BY db_name, table_name, link_id; -db_name table_name link_id link_status -auto_test_local ta_l2#P#pt1 0 1 -auto_test_local ta_l2#P#pt1 1 1 -auto_test_local ta_l2#P#pt2 0 1 -auto_test_local ta_l2#P#pt2 1 1 -INSERT INTO ta_l2 (a, b, c) VALUES -(8, 'g', '2011-05-05 21:33:30'), -(9, 'h', '2011-05-05 22:32:10'); -SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; -a b date_format(c, '%Y-%m-%d %H:%i:%s') -1 a 2008-08-01 10:21:39 -2 b 2000-01-01 00:00:00 -3 e 2007-06-04 20:03:11 -4 d 2003-11-30 05:01:03 -5 c 2001-12-31 23:59:59 -6 e 2011-05-05 20:04:05 -8 g 2011-05-05 21:33:30 -9 h 2011-05-05 22:32:10 -DROP TABLE ta_l2; - active standby test create table test +connection master_1; DROP TABLE IF EXISTS ta_l; CREATE TABLE ta_l ( a INT, @@ -260,6 +170,7 @@ INSERT INTO ta_l (a, b, c) VALUES (5, 'c', '2001-12-31 23:59:59'); select test +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 a 2008-08-01 10:21:39 @@ -269,9 +180,10 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 5 c 2001-12-31 23:59:59 fail-over test +connection master_1; SHOW STATUS LIKE 'Spider_mon_table_cache_version%'; Variable_name Value -Spider_mon_table_cache_version 2 +Spider_mon_table_cache_version 1 Spider_mon_table_cache_version_req 2 INSERT INTO ta_l (a, b, c) VALUES (6, 'e', '2011-05-05 20:04:05'); @@ -284,7 +196,6 @@ auto_test_local ta_l 1 1 SELECT db_name, table_name, link_id FROM mysql.spider_link_failed_log; db_name table_name link_id auto_test_local ta_l 1 -auto_test_local ta_l2#P#pt2 1 auto_test_local ta_l 0 SHOW STATUS LIKE 'Spider_mon_table_cache_version%'; Variable_name Value @@ -297,6 +208,7 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 6 e 2011-05-05 20:04:05 recovery test +connection master_1; ALTER TABLE ta_l CONNECTION='host "localhost", user "root", password "", msi "5", mkd "2", alc "1", @@ -312,102 +224,25 @@ SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 8 g 2011-05-05 21:33:30 DROP TABLE ta_l; +connection master_1; SELECT spider_flush_table_mon_cache(); spider_flush_table_mon_cache() 1 -create table with partition test -DROP TABLE IF EXISTS ta_l2; -CREATE TABLE ta_l2 ( -a INT, -b CHAR(1), -c DATETIME, -PRIMARY KEY(a) -) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_HA_AS_P_2_1 -INSERT INTO ta_l2 (a, b, c) VALUES -(1, 'a', '2008-08-01 10:21:39'), -(2, 'b', '2000-01-01 00:00:00'), -(3, 'e', '2007-06-04 20:03:11'), -(4, 'd', '2003-11-30 05:01:03'), -(5, 'c', '2001-12-31 23:59:59'); - -select test -SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; -a b date_format(c, '%Y-%m-%d %H:%i:%s') -1 a 2008-08-01 10:21:39 -2 b 2000-01-01 00:00:00 -3 e 2007-06-04 20:03:11 -4 d 2003-11-30 05:01:03 -5 c 2001-12-31 23:59:59 - -fail-over test -SHOW STATUS LIKE 'Spider_mon_table_cache_version%'; -Variable_name Value -Spider_mon_table_cache_version 2 -Spider_mon_table_cache_version_req 3 -INSERT INTO ta_l2 (a, b, c) VALUES -(6, 'e', '2011-05-05 20:04:05'); -ERROR HY000: Table 'auto_test_remote.ta_r2' get a problem -SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables -ORDER BY db_name, table_name, link_id; -db_name table_name link_id link_status -auto_test_local ta_l2#P#pt1 0 1 -auto_test_local ta_l2#P#pt1 1 1 -auto_test_local ta_l2#P#pt2 0 3 -auto_test_local ta_l2#P#pt2 1 1 -SELECT db_name, table_name, link_id FROM mysql.spider_link_failed_log; -db_name table_name link_id -auto_test_local ta_l 1 -auto_test_local ta_l2#P#pt2 1 -auto_test_local ta_l 0 -auto_test_local ta_l2#P#pt2 0 -SHOW STATUS LIKE 'Spider_mon_table_cache_version%'; -Variable_name Value -Spider_mon_table_cache_version 3 -Spider_mon_table_cache_version_req 3 -INSERT INTO ta_l2 (a, b, c) VALUES -(6, 'e', '2011-05-05 20:04:05'); -SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; -a b date_format(c, '%Y-%m-%d %H:%i:%s') -1 a 2008-08-01 10:21:39 -3 e 2007-06-04 20:03:11 -5 c 2001-12-31 23:59:59 -6 e 2011-05-05 20:04:05 - -recovery test -ALTER TABLE ta_l2 -PARTITION BY KEY(a) ( -PARTITION pt1 COMMENT='srv "s_2_1 s_2_2", tbl "ta_r ta_r3", - priority "1000"', -PARTITION pt2 COMMENT='srv "s_2_1 s_2_3", tbl "ta_r2 ta_r4", - priority "1000001", lst "1 0"' - ); -SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables -ORDER BY db_name, table_name, link_id; -db_name table_name link_id link_status -auto_test_local ta_l2#P#pt1 0 1 -auto_test_local ta_l2#P#pt1 1 1 -auto_test_local ta_l2#P#pt2 0 1 -auto_test_local ta_l2#P#pt2 1 1 -INSERT INTO ta_l2 (a, b, c) VALUES -(8, 'g', '2011-05-05 21:33:30'), -(9, 'h', '2011-05-05 22:32:10'); -SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; -a b date_format(c, '%Y-%m-%d %H:%i:%s') -1 a 2008-08-01 10:21:39 -3 e 2007-06-04 20:03:11 -5 c 2001-12-31 23:59:59 -8 g 2011-05-05 21:33:30 -9 h 2011-05-05 22:32:10 -DROP TABLE ta_l2; - deinit +connection master_1; DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; DROP DATABASE IF EXISTS auto_test_remote; +connection child2_2; DROP DATABASE IF EXISTS auto_test_remote2; +connection child2_3; DROP DATABASE IF EXISTS auto_test_remote3; +connection child3_1; DROP DATABASE IF EXISTS auto_test_local; +connection child3_2; DROP DATABASE IF EXISTS auto_test_local; +connection child3_3; DROP DATABASE IF EXISTS auto_test_local; for master_1 for child2 diff --git a/storage/spider/mysql-test/spider/handler/r/ha_part.result b/storage/spider/mysql-test/spider/handler/r/ha_part.result new file mode 100644 index 00000000000..315f37298bc --- /dev/null +++ b/storage/spider/mysql-test/spider/handler/r/ha_part.result @@ -0,0 +1,286 @@ +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +child3_1 +child3_2 +child3_3 +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +child3_1 +child3_2 +child3_3 + +drop and create databases +connection master_1; +DROP DATABASE IF EXISTS auto_test_local; +CREATE DATABASE auto_test_local; +USE auto_test_local; +connection child2_1; +DROP DATABASE IF EXISTS auto_test_remote; +CREATE DATABASE auto_test_remote; +USE auto_test_remote; +connection child2_2; +DROP DATABASE IF EXISTS auto_test_remote2; +CREATE DATABASE auto_test_remote2; +USE auto_test_remote2; +connection child2_3; +DROP DATABASE IF EXISTS auto_test_remote3; +CREATE DATABASE auto_test_remote3; +USE auto_test_remote3; +connection child3_1; +DROP DATABASE IF EXISTS auto_test_local; +CREATE DATABASE auto_test_local; +USE auto_test_local; +connection child3_2; +DROP DATABASE IF EXISTS auto_test_local; +CREATE DATABASE auto_test_local; +USE auto_test_local; +connection child3_3; +DROP DATABASE IF EXISTS auto_test_local; +CREATE DATABASE auto_test_local; +USE auto_test_local; + +test select 1 +connection master_1; +SELECT 1; +1 +1 + +create table with partition test +connection master_1; +DROP TABLE IF EXISTS ta_l2; +CREATE TABLE ta_l2 ( +a INT, +b CHAR(1), +c DATETIME, +PRIMARY KEY(a) +) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_HA_P_2_1 +INSERT INTO ta_l2 (a, b, c) VALUES +(1, 'a', '2008-08-01 10:21:39'), +(2, 'b', '2000-01-01 00:00:00'), +(3, 'e', '2007-06-04 20:03:11'), +(4, 'd', '2003-11-30 05:01:03'), +(5, 'c', '2001-12-31 23:59:59'); + +select test +connection master_1; +SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; +a b date_format(c, '%Y-%m-%d %H:%i:%s') +1 a 2008-08-01 10:21:39 +2 b 2000-01-01 00:00:00 +3 e 2007-06-04 20:03:11 +4 d 2003-11-30 05:01:03 +5 c 2001-12-31 23:59:59 + +fail-over test +connection master_1; +SHOW STATUS LIKE 'Spider_mon_table_cache_version%'; +Variable_name Value +Spider_mon_table_cache_version 0 +Spider_mon_table_cache_version_req 1 +INSERT INTO ta_l2 (a, b, c) VALUES +(6, 'e', '2011-05-05 20:04:05'); +ERROR HY000: Table 'auto_test_remote3.ta_r4' get a problem +SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables +ORDER BY db_name, table_name, link_id; +db_name table_name link_id link_status +auto_test_local ta_l2#P#pt1 0 1 +auto_test_local ta_l2#P#pt1 1 1 +auto_test_local ta_l2#P#pt2 0 1 +auto_test_local ta_l2#P#pt2 1 3 +SELECT db_name, table_name, link_id FROM mysql.spider_link_failed_log; +db_name table_name link_id +auto_test_local ta_l2#P#pt2 1 +SHOW STATUS LIKE 'Spider_mon_table_cache_version%'; +Variable_name Value +Spider_mon_table_cache_version 1 +Spider_mon_table_cache_version_req 1 +INSERT INTO ta_l2 (a, b, c) VALUES +(6, 'e', '2011-05-05 20:04:05'); +SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; +a b date_format(c, '%Y-%m-%d %H:%i:%s') +1 a 2008-08-01 10:21:39 +2 b 2000-01-01 00:00:00 +3 e 2007-06-04 20:03:11 +4 d 2003-11-30 05:01:03 +5 c 2001-12-31 23:59:59 +6 e 2011-05-05 20:04:05 + +recovery test +connection master_1; +ALTER TABLE ta_l2 +PARTITION BY KEY(a) ( +PARTITION pt1 COMMENT='srv "s_2_1 s_2_2", tbl "ta_r ta_r3", + priority "1000"', +PARTITION pt2 COMMENT='srv "s_2_1 s_2_3", tbl "ta_r2 ta_r4", + priority "1000001", lst "0 2"' + ); +SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables +ORDER BY db_name, table_name, link_id; +db_name table_name link_id link_status +auto_test_local ta_l2#P#pt1 0 1 +auto_test_local ta_l2#P#pt1 1 1 +auto_test_local ta_l2#P#pt2 0 1 +auto_test_local ta_l2#P#pt2 1 2 +SELECT spider_copy_tables('ta_l2#P#pt2', '0', '1'); +spider_copy_tables('ta_l2#P#pt2', '0', '1') +1 +connection master_1; +ALTER TABLE ta_l2 +PARTITION BY KEY(a) ( +PARTITION pt1 COMMENT='srv "s_2_1 s_2_2", tbl "ta_r ta_r3", + priority "1000"', +PARTITION pt2 COMMENT='srv "s_2_1 s_2_3", tbl "ta_r2 ta_r4", + priority "1000001", lst "0 1"' + ); +SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables +ORDER BY db_name, table_name, link_id; +db_name table_name link_id link_status +auto_test_local ta_l2#P#pt1 0 1 +auto_test_local ta_l2#P#pt1 1 1 +auto_test_local ta_l2#P#pt2 0 1 +auto_test_local ta_l2#P#pt2 1 1 +INSERT INTO ta_l2 (a, b, c) VALUES +(8, 'g', '2011-05-05 21:33:30'), +(9, 'h', '2011-05-05 22:32:10'); +SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; +a b date_format(c, '%Y-%m-%d %H:%i:%s') +1 a 2008-08-01 10:21:39 +2 b 2000-01-01 00:00:00 +3 e 2007-06-04 20:03:11 +4 d 2003-11-30 05:01:03 +5 c 2001-12-31 23:59:59 +6 e 2011-05-05 20:04:05 +8 g 2011-05-05 21:33:30 +9 h 2011-05-05 22:32:10 +DROP TABLE ta_l2; + +create table with partition test +connection master_1; +DROP TABLE IF EXISTS ta_l2; +CREATE TABLE ta_l2 ( +a INT, +b CHAR(1), +c DATETIME, +PRIMARY KEY(a) +) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_HA_AS_P_2_1 +INSERT INTO ta_l2 (a, b, c) VALUES +(1, 'a', '2008-08-01 10:21:39'), +(2, 'b', '2000-01-01 00:00:00'), +(3, 'e', '2007-06-04 20:03:11'), +(4, 'd', '2003-11-30 05:01:03'), +(5, 'c', '2001-12-31 23:59:59'); + +select test +connection master_1; +SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; +a b date_format(c, '%Y-%m-%d %H:%i:%s') +1 a 2008-08-01 10:21:39 +2 b 2000-01-01 00:00:00 +3 e 2007-06-04 20:03:11 +4 d 2003-11-30 05:01:03 +5 c 2001-12-31 23:59:59 + +fail-over test +connection master_1; +SHOW STATUS LIKE 'Spider_mon_table_cache_version%'; +Variable_name Value +Spider_mon_table_cache_version 1 +Spider_mon_table_cache_version_req 1 +INSERT INTO ta_l2 (a, b, c) VALUES +(6, 'e', '2011-05-05 20:04:05'); +ERROR HY000: Table 'auto_test_remote.ta_r2' get a problem +SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables +ORDER BY db_name, table_name, link_id; +db_name table_name link_id link_status +auto_test_local ta_l2#P#pt1 0 1 +auto_test_local ta_l2#P#pt1 1 1 +auto_test_local ta_l2#P#pt2 0 3 +auto_test_local ta_l2#P#pt2 1 1 +SELECT db_name, table_name, link_id FROM mysql.spider_link_failed_log; +db_name table_name link_id +auto_test_local ta_l2#P#pt2 1 +auto_test_local ta_l2#P#pt2 0 +SHOW STATUS LIKE 'Spider_mon_table_cache_version%'; +Variable_name Value +Spider_mon_table_cache_version 1 +Spider_mon_table_cache_version_req 1 +INSERT INTO ta_l2 (a, b, c) VALUES +(6, 'e', '2011-05-05 20:04:05'); +SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; +a b date_format(c, '%Y-%m-%d %H:%i:%s') +1 a 2008-08-01 10:21:39 +3 e 2007-06-04 20:03:11 +5 c 2001-12-31 23:59:59 +6 e 2011-05-05 20:04:05 + +recovery test +connection master_1; +ALTER TABLE ta_l2 +PARTITION BY KEY(a) ( +PARTITION pt1 COMMENT='srv "s_2_1 s_2_2", tbl "ta_r ta_r3", + priority "1000"', +PARTITION pt2 COMMENT='srv "s_2_1 s_2_3", tbl "ta_r2 ta_r4", + priority "1000001", lst "1 0"' + ); +SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables +ORDER BY db_name, table_name, link_id; +db_name table_name link_id link_status +auto_test_local ta_l2#P#pt1 0 1 +auto_test_local ta_l2#P#pt1 1 1 +auto_test_local ta_l2#P#pt2 0 1 +auto_test_local ta_l2#P#pt2 1 1 +INSERT INTO ta_l2 (a, b, c) VALUES +(8, 'g', '2011-05-05 21:33:30'), +(9, 'h', '2011-05-05 22:32:10'); +SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a; +a b date_format(c, '%Y-%m-%d %H:%i:%s') +1 a 2008-08-01 10:21:39 +3 e 2007-06-04 20:03:11 +5 c 2001-12-31 23:59:59 +8 g 2011-05-05 21:33:30 +9 h 2011-05-05 22:32:10 +DROP TABLE ta_l2; + +deinit +connection master_1; +DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; +DROP DATABASE IF EXISTS auto_test_remote; +connection child2_2; +DROP DATABASE IF EXISTS auto_test_remote2; +connection child2_3; +DROP DATABASE IF EXISTS auto_test_remote3; +connection child3_1; +DROP DATABASE IF EXISTS auto_test_local; +connection child3_2; +DROP DATABASE IF EXISTS auto_test_local; +connection child3_3; +DROP DATABASE IF EXISTS auto_test_local; +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +child3_1 +child3_2 +child3_3 +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +child3_1 +child3_2 +child3_3 + +end of test diff --git a/storage/spider/mysql-test/spider/handler/r/spider3_fixes.result b/storage/spider/mysql-test/spider/handler/r/spider3_fixes.result index 6de174e1a2d..9a8a59153f0 100644 --- a/storage/spider/mysql-test/spider/handler/r/spider3_fixes.result +++ b/storage/spider/mysql-test/spider/handler/r/spider3_fixes.result @@ -10,26 +10,34 @@ child3_3 for slave1_1 drop and create databases +connection master_1; DROP DATABASE IF EXISTS auto_test_local; CREATE DATABASE auto_test_local; USE auto_test_local; +connection slave1_1; DROP DATABASE IF EXISTS auto_test_local; CREATE DATABASE auto_test_local; USE auto_test_local; +connection child2_1; DROP DATABASE IF EXISTS auto_test_remote; CREATE DATABASE auto_test_remote; USE auto_test_remote; +connection child2_2; DROP DATABASE IF EXISTS auto_test_remote2; CREATE DATABASE auto_test_remote2; USE auto_test_remote2; test select 1 +connection master_1; SELECT 1; 1 1 3.1 auto_increment +connection master_1; +connection slave1_1; +connection master_1; DROP TABLE IF EXISTS t1, t2; CREATE TABLE t1 ( id int(11) NOT NULL AUTO_INCREMENT, @@ -198,6 +206,7 @@ LAST_INSERT_ID() SELECT MAX(id) FROM t2; MAX(id) 46 +connection slave1_1; SELECT id FROM t1 ORDER BY id; id 2 @@ -206,188 +215,16 @@ id 1554 2331 10000 -auto_increment with partition -DROP TABLE IF EXISTS t1, t2; -CREATE TABLE t1 ( -id int(11) NOT NULL AUTO_INCREMENT, -PRIMARY KEY (id) -) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_INCREMENT1_P_1 -CREATE TABLE t2 ( -id int(11) NOT NULL AUTO_INCREMENT, -PRIMARY KEY (id) -) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_INCREMENT1_P_1 -MASTER_1_AUTO_INCREMENT_INCREMENT2 -MASTER_1_AUTO_INCREMENT_OFFSET2 -spider_direct_sql('SET SESSION AUTO_INCREMENT_INCREMENT = 4', '', -'srv "s_2_1"') -1 -spider_direct_sql('SET SESSION AUTO_INCREMENT_INCREMENT = 4', '', -'srv "s_2_2"') -1 -spider_bg_direct_sql('SET SESSION AUTO_INCREMENT_OFFSET = 2', '', -'srv "s_2_1"') -1 -spider_bg_direct_sql('SET SESSION AUTO_INCREMENT_OFFSET = 3', '', -'srv "s_2_2"') -1 -CREATE TABLE t1 ( -id int(11) NOT NULL AUTO_INCREMENT, -PRIMARY KEY (id) -) SLAVE1_1_ENGINE SLAVE1_1_CHARSET SLAVE1_1_COMMENT_INCREMENT1_P_1 -CREATE TABLE t2 ( -id int(11) NOT NULL AUTO_INCREMENT, -PRIMARY KEY (id) -) SLAVE1_1_ENGINE SLAVE1_1_CHARSET SLAVE1_1_COMMENT_INCREMENT1_P_1 -INSERT INTO t1 () VALUES (); -SELECT LAST_INSERT_ID(); -LAST_INSERT_ID() -2 -SELECT MAX(id) FROM t1; -MAX(id) -2 -INSERT INTO t2 () VALUES (); -SELECT LAST_INSERT_ID(); -LAST_INSERT_ID() -3 -SELECT MAX(id) FROM t2; -MAX(id) -3 -MASTER_1_AUTO_INCREMENT_OFFSET3 -INSERT INTO t1 (id) VALUES (null); -SELECT LAST_INSERT_ID(); -LAST_INSERT_ID() -7 -SELECT MAX(id) FROM t1; -MAX(id) -7 -MASTER_1_AUTO_INCREMENT_OFFSET4 -INSERT INTO t2 (id) VALUES (null); -SELECT LAST_INSERT_ID(); -LAST_INSERT_ID() -6 -SELECT MAX(id) FROM t2; -MAX(id) -7 -MASTER_1_AUTO_INCREMENT_OFFSET3 -INSERT INTO t1 () VALUES (),(),(),(); -Warnings: -Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value -Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value -Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value -SELECT LAST_INSERT_ID(); -LAST_INSERT_ID() -10 -SELECT id FROM t1 ORDER BY id; -id -2 -3 -6 -7 -10 -11 -14 -15 -MASTER_1_AUTO_INCREMENT_OFFSET4 -INSERT INTO t2 () VALUES (),(),(),(); -Warnings: -Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value -Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value -Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value -SELECT LAST_INSERT_ID(); -LAST_INSERT_ID() -18 -SELECT id FROM t2 ORDER BY id; -id -2 -3 -6 -7 -10 -11 -14 -15 -18 -19 -22 -23 -TRUNCATE TABLE t1; -TRUNCATE TABLE t2; -INSERT INTO t1 () VALUES (),(),(),(); -Warnings: -Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value -Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value -Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value -SELECT LAST_INSERT_ID(); -LAST_INSERT_ID() -2 -SELECT id FROM t1 ORDER BY id; -id -2 -3 -6 -7 -INSERT INTO t2 () VALUES (),(),(),(); -Warnings: -Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value -Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value -Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value -SELECT LAST_INSERT_ID(); -LAST_INSERT_ID() -10 -SELECT id FROM t2 ORDER BY id; -id -2 -3 -6 -7 -10 -11 -14 -15 -SET INSERT_ID=5000; -MASTER_1_AUTO_INCREMENT_OFFSET3 -INSERT INTO t1 () VALUES (); -SELECT LAST_INSERT_ID(); -LAST_INSERT_ID() -18 -SELECT MAX(id) FROM t1; -MAX(id) -18 -MASTER_1_AUTO_INCREMENT_OFFSET4 -INSERT INTO t2 () VALUES (); -SELECT LAST_INSERT_ID(); -LAST_INSERT_ID() -19 -SELECT MAX(id) FROM t2; -MAX(id) -19 -INSERT INTO t1 (id) VALUES (10000); -SELECT LAST_INSERT_ID(); -LAST_INSERT_ID() -22 -SELECT MAX(id) FROM t1; -MAX(id) -22 -INSERT INTO t2 (id) VALUES (1000); -SELECT LAST_INSERT_ID(); -LAST_INSERT_ID() -26 -SELECT MAX(id) FROM t2; -MAX(id) -26 -SELECT id FROM t1 ORDER BY id; -id -2 -18 -777 -1554 -2331 -10000 +connection master_1; deinit +connection master_1; DROP DATABASE IF EXISTS auto_test_local; +connection slave1_1; DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; DROP DATABASE IF EXISTS auto_test_remote; +connection child2_2; DROP DATABASE IF EXISTS auto_test_remote2; for slave1_1 for master_1 diff --git a/storage/spider/mysql-test/spider/handler/r/spider3_fixes_part.result b/storage/spider/mysql-test/spider/handler/r/spider3_fixes_part.result new file mode 100644 index 00000000000..f8747cff5ea --- /dev/null +++ b/storage/spider/mysql-test/spider/handler/r/spider3_fixes_part.result @@ -0,0 +1,238 @@ +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +child3_1 +child3_2 +child3_3 +for slave1_1 + +drop and create databases +connection master_1; +DROP DATABASE IF EXISTS auto_test_local; +CREATE DATABASE auto_test_local; +USE auto_test_local; +connection slave1_1; +DROP DATABASE IF EXISTS auto_test_local; +CREATE DATABASE auto_test_local; +USE auto_test_local; +connection child2_1; +DROP DATABASE IF EXISTS auto_test_remote; +CREATE DATABASE auto_test_remote; +USE auto_test_remote; +connection child2_2; +DROP DATABASE IF EXISTS auto_test_remote2; +CREATE DATABASE auto_test_remote2; +USE auto_test_remote2; + +test select 1 +connection master_1; +SELECT 1; +1 +1 +auto_increment with partition +connection master_1; +connection slave1_1; +connection master_1; +DROP TABLE IF EXISTS t1, t2; +CREATE TABLE t1 ( +id int(11) NOT NULL AUTO_INCREMENT, +PRIMARY KEY (id) +) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_INCREMENT1_P_1 +CREATE TABLE t2 ( +id int(11) NOT NULL AUTO_INCREMENT, +PRIMARY KEY (id) +) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_INCREMENT1_P_1 +MASTER_1_AUTO_INCREMENT_INCREMENT2 +MASTER_1_AUTO_INCREMENT_OFFSET2 +spider_direct_sql('SET SESSION AUTO_INCREMENT_INCREMENT = 4', '', +'srv "s_2_1"') +1 +spider_direct_sql('SET SESSION AUTO_INCREMENT_INCREMENT = 4', '', +'srv "s_2_2"') +1 +spider_bg_direct_sql('SET SESSION AUTO_INCREMENT_OFFSET = 2', '', +'srv "s_2_1"') +1 +spider_bg_direct_sql('SET SESSION AUTO_INCREMENT_OFFSET = 3', '', +'srv "s_2_2"') +1 +CREATE TABLE t1 ( +id int(11) NOT NULL AUTO_INCREMENT, +PRIMARY KEY (id) +) SLAVE1_1_ENGINE SLAVE1_1_CHARSET SLAVE1_1_COMMENT_INCREMENT1_P_1 +CREATE TABLE t2 ( +id int(11) NOT NULL AUTO_INCREMENT, +PRIMARY KEY (id) +) SLAVE1_1_ENGINE SLAVE1_1_CHARSET SLAVE1_1_COMMENT_INCREMENT1_P_1 +INSERT INTO t1 () VALUES (); +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +3 +SELECT MAX(id) FROM t1; +MAX(id) +3 +INSERT INTO t2 () VALUES (); +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +7 +SELECT MAX(id) FROM t2; +MAX(id) +7 +MASTER_1_AUTO_INCREMENT_OFFSET3 +INSERT INTO t1 (id) VALUES (null); +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +2 +SELECT MAX(id) FROM t1; +MAX(id) +7 +MASTER_1_AUTO_INCREMENT_OFFSET4 +INSERT INTO t2 (id) VALUES (null); +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +6 +SELECT MAX(id) FROM t2; +MAX(id) +7 +MASTER_1_AUTO_INCREMENT_OFFSET3 +INSERT INTO t1 () VALUES (),(),(),(); +Warnings: +Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value +Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value +Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +10 +SELECT id FROM t1 ORDER BY id; +id +2 +3 +6 +7 +10 +11 +14 +15 +MASTER_1_AUTO_INCREMENT_OFFSET4 +INSERT INTO t2 () VALUES (),(),(),(); +Warnings: +Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value +Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value +Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +18 +SELECT id FROM t2 ORDER BY id; +id +2 +3 +6 +7 +10 +11 +14 +15 +18 +19 +22 +23 +TRUNCATE TABLE t1; +TRUNCATE TABLE t2; +INSERT INTO t1 () VALUES (),(),(),(); +Warnings: +Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value +Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value +Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +2 +SELECT id FROM t1 ORDER BY id; +id +2 +3 +6 +7 +INSERT INTO t2 () VALUES (),(),(),(); +Warnings: +Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value +Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value +Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +10 +SELECT id FROM t2 ORDER BY id; +id +2 +3 +6 +7 +10 +11 +14 +15 +SET INSERT_ID=5000; +MASTER_1_AUTO_INCREMENT_OFFSET3 +INSERT INTO t1 () VALUES (); +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +18 +SELECT MAX(id) FROM t1; +MAX(id) +18 +MASTER_1_AUTO_INCREMENT_OFFSET4 +INSERT INTO t2 () VALUES (); +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +19 +SELECT MAX(id) FROM t2; +MAX(id) +19 +INSERT INTO t1 (id) VALUES (10000); +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +22 +SELECT MAX(id) FROM t1; +MAX(id) +22 +INSERT INTO t2 (id) VALUES (1000); +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +26 +SELECT MAX(id) FROM t2; +MAX(id) +26 +connection slave1_1; +SELECT id FROM t1 ORDER BY id; +id +2 +18 +777 +1554 +2331 +10000 +connection master_1; + +deinit +connection master_1; +DROP DATABASE IF EXISTS auto_test_local; +connection slave1_1; +DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; +DROP DATABASE IF EXISTS auto_test_remote; +connection child2_2; +DROP DATABASE IF EXISTS auto_test_remote2; +for slave1_1 +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +child3_1 +child3_2 +child3_3 + +end of test diff --git a/storage/spider/mysql-test/spider/handler/r/spider_fixes.result b/storage/spider/mysql-test/spider/handler/r/spider_fixes.result index 9fd24bcc43f..9b14817eee4 100644 --- a/storage/spider/mysql-test/spider/handler/r/spider_fixes.result +++ b/storage/spider/mysql-test/spider/handler/r/spider_fixes.result @@ -10,25 +10,31 @@ child3_3 for slave1_1 drop and create databases +connection master_1; DROP DATABASE IF EXISTS auto_test_local; CREATE DATABASE auto_test_local; USE auto_test_local; +connection slave1_1; DROP DATABASE IF EXISTS auto_test_local; CREATE DATABASE auto_test_local; USE auto_test_local; +connection child2_1; DROP DATABASE IF EXISTS auto_test_remote; CREATE DATABASE auto_test_remote; USE auto_test_remote; +connection child2_2; DROP DATABASE IF EXISTS auto_test_remote2; CREATE DATABASE auto_test_remote2; USE auto_test_remote2; test select 1 +connection master_1; SELECT 1; 1 1 create table and insert +connection master_1; DROP TABLE IF EXISTS tb_l; CREATE TABLE tb_l ( a INT, @@ -50,6 +56,7 @@ INSERT INTO ta_l SELECT a, b, c FROM tb_l; 2.13 select table with "order by desc" and "<" +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l WHERE a < 5 ORDER BY a DESC LIMIT 3; a b date_format(c, '%Y-%m-%d %H:%i:%s') @@ -58,6 +65,7 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 2 b 2000-01-01 00:00:00 select table with "order by desc" and "<=" +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l WHERE a <= 5 ORDER BY a DESC LIMIT 3; a b date_format(c, '%Y-%m-%d %H:%i:%s') @@ -67,7 +75,9 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 2.14 update table with range scan and split_read +connection master_1; UPDATE ta_l SET c = '2000-02-02 00:00:00' WHERE a > 1; +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 a 2008-08-01 10:21:39 @@ -80,6 +90,7 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') select table with range scan TRUNCATE TABLE ta_l; DROP TABLE IF EXISTS ta_l; +connection master_1; CREATE TABLE ta_l ( a int(11) NOT NULL DEFAULT '0', b char(1) DEFAULT NULL, @@ -87,50 +98,62 @@ c datetime DEFAULT NULL, PRIMARY KEY (a, b, c) ) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT5_2_1 INSERT INTO ta_l SELECT a, b, c FROM tb_l; +connection master_1; SELECT a, b, c FROM ta_l FORCE INDEX(PRIMARY) WHERE a = 4 AND b >= 'b' AND c = '2003-11-30 05:01:03'; a b c 4 d 2003-11-30 05:01:03 +connection master_1; SELECT a, b, c FROM ta_l FORCE INDEX(PRIMARY) WHERE a = 4 AND b > 'b' AND c = '2003-11-30 05:01:03'; a b c 4 d 2003-11-30 05:01:03 +connection master_1; SELECT a, b, c FROM ta_l FORCE INDEX(PRIMARY) WHERE a >= 4 AND b = 'd' AND c = '2003-11-30 05:01:03'; a b c 4 d 2003-11-30 05:01:03 +connection master_1; SELECT a, b, c FROM ta_l FORCE INDEX(PRIMARY) WHERE a > 4 AND b = 'c' AND c = '2001-12-31 23:59:59'; a b c 5 c 2001-12-31 23:59:59 +connection master_1; SELECT a, b, c FROM ta_l FORCE INDEX(PRIMARY) WHERE a = 4 AND b <= 'd' AND c = '2003-11-30 05:01:03'; a b c 4 d 2003-11-30 05:01:03 +connection master_1; SELECT a, b, c FROM ta_l FORCE INDEX(PRIMARY) WHERE a = 4 AND b < 'e' AND c = '2003-11-30 05:01:03'; a b c 4 d 2003-11-30 05:01:03 +connection master_1; SELECT a, b, c FROM ta_l FORCE INDEX(PRIMARY) WHERE a <= 4 AND b = 'b' AND c = '2000-01-01 00:00:00'; a b c 2 b 2000-01-01 00:00:00 +connection master_1; SELECT a, b, c FROM ta_l FORCE INDEX(PRIMARY) WHERE a < 4 AND b = 'b' AND c = '2000-01-01 00:00:00'; a b c 2 b 2000-01-01 00:00:00 +connection master_1; SELECT a, b, c FROM ta_l FORCE INDEX(PRIMARY) WHERE a = 4 AND b >= 'b' AND b <= 'd' AND c = '2003-11-30 05:01:03'; a b c 4 d 2003-11-30 05:01:03 +connection master_1; SELECT a, b, c FROM ta_l FORCE INDEX(PRIMARY) WHERE a = 4 AND b > 'b' AND b < 'e' AND c = '2003-11-30 05:01:03'; a b c 4 d 2003-11-30 05:01:03 +connection master_1; SELECT a, b, c FROM ta_l FORCE INDEX(PRIMARY) WHERE a <= 4 AND a >= 1 AND b >= 'b' AND c = '2003-11-30 05:01:03'; a b c 4 d 2003-11-30 05:01:03 +connection master_1; SELECT a, b, c FROM ta_l FORCE INDEX(PRIMARY) WHERE a < 4 AND a > 1 AND b >= 'b' AND c = '2000-01-01 00:00:00'; a b c @@ -138,6 +161,7 @@ a b c 2.16 auto_increment insert with trigger +connection master_1; CREATE TABLE ta_l_auto_inc ( a INT AUTO_INCREMENT, b CHAR(1) DEFAULT 'c', @@ -151,14 +175,17 @@ c DATETIME, PRIMARY KEY(a) ) MASTER_1_ENGINE2 MASTER_1_CHARSET2 CREATE TRIGGER ins_ta_l_auto_inc AFTER INSERT ON ta_l_auto_inc FOR EACH ROW BEGIN INSERT INTO tc_l (a, b, c) VALUES (NEW.a, NEW.b, NEW.c); END;; +connection master_1; INSERT INTO ta_l_auto_inc (a, b, c) VALUES (NULL, 's', '2008-12-31 20:59:59'); +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM tc_l ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 s 2008-12-31 20:59:59 2.17 engine-condition-pushdown with "or" and joining +connection master_1; SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l WHERE a = 1 OR a IN (SELECT a FROM tb_l); a b date_format(c, '%Y-%m-%d %H:%i:%s') 1 a 2008-08-01 10:21:39 @@ -166,37 +193,10 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 3 e 2007-06-04 20:03:11 4 d 2003-11-30 05:01:03 5 c 2001-12-31 23:59:59 -partition with sort -CREATE TABLE ta_l2 ( -a INT, -b CHAR(1), -c DATETIME, -PRIMARY KEY(a) -) MASTER_1_ENGINE MASTER_1_COMMENT2_P_2_1 -INSERT INTO ta_l2 SELECT a, b, c FROM tb_l; -SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 WHERE a > 1 -ORDER BY a; -a b date_format(c, '%Y-%m-%d %H:%i:%s') -2 b 2000-01-01 00:00:00 -3 e 2007-06-04 20:03:11 -4 d 2003-11-30 05:01:03 -5 c 2001-12-31 23:59:59 2.23 -partition update with moving partition -DROP TABLE IF EXISTS ta_l2; -CREATE TABLE ta_l2 ( -a INT, -b CHAR(1), -c DATETIME, -PRIMARY KEY(a) -) MASTER_1_ENGINE MASTER_1_COMMENT2_P_2_1 -INSERT INTO ta_l2 (a, b, c) VALUES (3, 'B', '2010-09-26 00:00:00'); -UPDATE ta_l2 SET a = 4 WHERE a = 3; -SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2; -a b date_format(c, '%Y-%m-%d %H:%i:%s') -4 B 2010-09-26 00:00:00 index merge +connection master_1; CREATE TABLE ta_l_int ( a INT AUTO_INCREMENT, b INT DEFAULT 10, @@ -210,27 +210,7 @@ INSERT INTO ta_l_int (a, b, c) SELECT a + 1, b + 1, c + 1 FROM ta_l_int; INSERT INTO ta_l_int (a, b, c) SELECT a + 2, b + 2, c + 2 FROM ta_l_int; INSERT INTO ta_l_int (a, b, c) SELECT a + 4, b + 4, c + 4 FROM ta_l_int; INSERT INTO ta_l_int (a, b, c) SELECT a + 8, b + 8, c + 8 FROM ta_l_int; -SELECT a, b, c FROM ta_l_int force index(primary, idx1, idx2) -WHERE a = 5 OR b = 5 OR c = 5 ORDER BY a; -a b c -3 4 5 -4 5 6 -5 6 7 -index merge with partition -DROP TABLE IF EXISTS ta_l_int; -CREATE TABLE ta_l_int ( -a INT AUTO_INCREMENT, -b INT DEFAULT 10, -c INT DEFAULT 11, -PRIMARY KEY(a), -KEY idx1(b), -KEY idx2(c) -) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT3_P_2_1 -INSERT INTO ta_l_int (a, b, c) VALUES (1, 2, 3); -INSERT INTO ta_l_int (a, b, c) SELECT a + 1, b + 1, c + 1 FROM ta_l_int; -INSERT INTO ta_l_int (a, b, c) SELECT a + 2, b + 2, c + 2 FROM ta_l_int; -INSERT INTO ta_l_int (a, b, c) SELECT a + 4, b + 4, c + 4 FROM ta_l_int; -INSERT INTO ta_l_int (a, b, c) SELECT a + 8, b + 8, c + 8 FROM ta_l_int; +connection master_1; SELECT a, b, c FROM ta_l_int force index(primary, idx1, idx2) WHERE a = 5 OR b = 5 OR c = 5 ORDER BY a; a b c @@ -240,6 +220,7 @@ a b c 2.24 index scan update without PK +connection master_1; DROP TABLE IF EXISTS ta_l_int; CREATE TABLE ta_l_int ( a INT NOT NULL, @@ -250,32 +231,51 @@ KEY idx2(c) ) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT4_2_1 SELECT a, b, c FROM ta_l_int ORDER BY a; a b c +1 2 3 2 3 4 +3 4 5 4 5 6 +5 6 7 6 7 8 +7 8 9 8 9 10 +9 10 11 10 11 12 +11 12 13 12 13 14 +13 14 15 14 15 16 +15 16 17 16 17 18 INSERT INTO ta_l_int (a, b, c) VALUES (0, 2, 3); -INSERT INTO ta_l_int (a, b, c) VALUES (1, 2, 3); +INSERT INTO ta_l_int (a, b, c) VALUES (18, 2, 3); +connection master_1; UPDATE ta_l_int SET c = 4 WHERE b = 2; +connection master_1; SELECT a, b, c FROM ta_l_int ORDER BY a; a b c 1 2 4 2 3 4 +3 4 5 4 5 6 +5 6 7 6 7 8 +7 8 9 8 9 10 +9 10 11 10 11 12 +11 12 13 12 13 14 +13 14 15 14 15 16 +15 16 17 16 17 18 17 2 4 +18 2 4 2.25 direct order limit +connection master_1; SHOW STATUS LIKE 'Spider_direct_order_limit'; Variable_name Value Spider_direct_order_limit 2 @@ -283,13 +283,14 @@ SELECT a, b, c FROM ta_l_int ORDER BY a LIMIT 3; a b c 1 2 4 2 3 4 -4 5 6 +3 4 5 SHOW STATUS LIKE 'Spider_direct_order_limit'; Variable_name Value Spider_direct_order_limit 3 2.26 lock tables +connection master_1; DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t2; CREATE TABLE t1 ( @@ -304,6 +305,9 @@ LOCK TABLES t1 READ, t2 READ; UNLOCK TABLES; auto_increment +connection master_1; +connection slave1_1; +connection master_1; DROP TABLE IF EXISTS t1; CREATE TABLE t1 ( id int(11) NOT NULL AUTO_INCREMENT, @@ -395,6 +399,7 @@ LAST_INSERT_ID() SELECT MAX(id) FROM t1; MAX(id) 42 +connection slave1_1; SELECT id FROM t1 ORDER BY id; id 2 @@ -408,114 +413,10 @@ id 1554 2331 10000 - -auto_increment with partition -DROP TABLE IF EXISTS t1; -CREATE TABLE t1 ( -id int(11) NOT NULL AUTO_INCREMENT, -PRIMARY KEY (id) -) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_INCREMENT1_P_1 -MASTER_1_AUTO_INCREMENT_INCREMENT2 -MASTER_1_AUTO_INCREMENT_OFFSET2 -spider_direct_sql('SET SESSION AUTO_INCREMENT_INCREMENT = 4', '', -'srv "s_2_1"') -1 -spider_direct_sql('SET SESSION AUTO_INCREMENT_INCREMENT = 4', '', -'srv "s_2_2"') -1 -spider_bg_direct_sql('SET SESSION AUTO_INCREMENT_OFFSET = 2', '', -'srv "s_2_1"') -1 -spider_bg_direct_sql('SET SESSION AUTO_INCREMENT_OFFSET = 3', '', -'srv "s_2_2"') -1 -CREATE TABLE t1 ( -id int(11) NOT NULL AUTO_INCREMENT, -PRIMARY KEY (id) -) SLAVE1_1_ENGINE SLAVE1_1_CHARSET SLAVE1_1_COMMENT_INCREMENT1_P_1 -INSERT INTO t1 () VALUES (); -SELECT LAST_INSERT_ID(); -LAST_INSERT_ID() -2 -SELECT MAX(id) FROM t1; -MAX(id) -2 -INSERT INTO t1 () VALUES (); -SELECT LAST_INSERT_ID(); -LAST_INSERT_ID() -3 -SELECT MAX(id) FROM t1; -MAX(id) -3 -INSERT INTO t1 (id) VALUES (null); -SELECT LAST_INSERT_ID(); -LAST_INSERT_ID() -6 -SELECT MAX(id) FROM t1; -MAX(id) -6 -INSERT INTO t1 (id) VALUES (null); -SELECT LAST_INSERT_ID(); -LAST_INSERT_ID() -7 -SELECT MAX(id) FROM t1; -MAX(id) -7 -INSERT INTO t1 () VALUES (),(),(),(); -Warnings: -Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value -Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value -Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value -SELECT LAST_INSERT_ID(); -LAST_INSERT_ID() -10 -SELECT id FROM t1 ORDER BY id; -id -2 -3 -6 -7 -10 -11 -14 -15 -SET INSERT_ID=5000; -INSERT INTO t1 () VALUES (); -SELECT LAST_INSERT_ID(); -LAST_INSERT_ID() -18 -SELECT MAX(id) FROM t1; -MAX(id) -18 -INSERT INTO t1 (id) VALUES (10000); -SELECT LAST_INSERT_ID(); -LAST_INSERT_ID() -22 -SELECT MAX(id) FROM t1; -MAX(id) -22 -INSERT INTO t1 (id) VALUES (1000); -SELECT LAST_INSERT_ID(); -LAST_INSERT_ID() -26 -SELECT MAX(id) FROM t1; -MAX(id) -26 -SELECT id FROM t1 ORDER BY id; -id -2 -3 -6 -7 -10 -18 -777 -1000 -1554 -2331 -10000 +connection master_1; read only +connection master_1; DROP TABLE IF EXISTS t1; CREATE TABLE t1 ( id int(11) NOT NULL, @@ -530,6 +431,10 @@ id 18 22 26 +30 +34 +38 +42 INSERT INTO t1 (id) VALUES (1); ERROR HY000: Table 'auto_test_local.t1' is read only UPDATE t1 SET id = 4 WHERE id = 2; @@ -543,6 +448,7 @@ ERROR HY000: Table 'auto_test_local.t1' is read only 2.27 error mode +connection master_1; DROP TABLE IF EXISTS t1; CREATE TABLE t1 ( id int(11) NOT NULL, @@ -566,6 +472,7 @@ Error 1146 Table 'auto_test_remote.ter1_1' doesn't exist 3.0 is null +connection master_1; DROP TABLE IF EXISTS t1; CREATE TABLE t1 ( a VARCHAR(255), @@ -588,6 +495,7 @@ insert into t1 select a + 128, b + 128, c + 128 from t1; insert into t1 select a + 256, b + 256, c + 256 from t1; insert into t1 select a + 512, b + 512, c + 512 from t1; flush tables; +connection master_1; select a from t1 where a is null order by a limit 30; a NULL @@ -654,6 +562,7 @@ NULL NULL direct_order_limit +connection master_1; TRUNCATE TABLE t1; insert into t1 values ('1', '1', '1'); insert into t1 select a + 1, b + 1, c + 1 from t1; @@ -665,6 +574,7 @@ insert into t1 select a, b + 32, c + 32 from t1; insert into t1 select a, b + 64, c + 64 from t1; insert into t1 select a, b + 128, c + 128 from t1; flush tables; +connection master_1; select a, b, c from t1 where a = '10' and b <> '100' order by c desc limit 5; a b c 10 74 74 @@ -681,9 +591,13 @@ a c 10 170 deinit +connection master_1; DROP DATABASE IF EXISTS auto_test_local; +connection slave1_1; DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; DROP DATABASE IF EXISTS auto_test_remote; +connection child2_2; DROP DATABASE IF EXISTS auto_test_remote2; for slave1_1 for master_1 diff --git a/storage/spider/mysql-test/spider/handler/r/spider_fixes_part.result b/storage/spider/mysql-test/spider/handler/r/spider_fixes_part.result new file mode 100644 index 00000000000..c99c02071b6 --- /dev/null +++ b/storage/spider/mysql-test/spider/handler/r/spider_fixes_part.result @@ -0,0 +1,241 @@ +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +child3_1 +child3_2 +child3_3 +for slave1_1 + +drop and create databases +connection master_1; +DROP DATABASE IF EXISTS auto_test_local; +CREATE DATABASE auto_test_local; +USE auto_test_local; +connection slave1_1; +DROP DATABASE IF EXISTS auto_test_local; +CREATE DATABASE auto_test_local; +USE auto_test_local; +connection child2_1; +DROP DATABASE IF EXISTS auto_test_remote; +CREATE DATABASE auto_test_remote; +USE auto_test_remote; +connection child2_2; +DROP DATABASE IF EXISTS auto_test_remote2; +CREATE DATABASE auto_test_remote2; +USE auto_test_remote2; + +test select 1 +connection master_1; +SELECT 1; +1 +1 +connection master_1; +DROP TABLE IF EXISTS tb_l; +CREATE TABLE tb_l ( +a INT, +b CHAR(1), +c DATETIME, +PRIMARY KEY(a) +) MASTER_1_ENGINE2 MASTER_1_CHARSET2 +INSERT INTO tb_l (a, b, c) VALUES +(1, 'a', '2008-08-01 10:21:39'), +(2, 'b', '2000-01-01 00:00:00'), +(3, 'e', '2007-06-04 20:03:11'), +(4, 'd', '2003-11-30 05:01:03'), +(5, 'c', '2001-12-31 23:59:59'); + +2.17 +partition with sort +connection master_1; +CREATE TABLE ta_l2 ( +a INT, +b CHAR(1), +c DATETIME, +PRIMARY KEY(a) +) MASTER_1_ENGINE MASTER_1_COMMENT2_P_2_1 +INSERT INTO ta_l2 SELECT a, b, c FROM tb_l; +SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 WHERE a > 1 +ORDER BY a; +a b date_format(c, '%Y-%m-%d %H:%i:%s') +2 b 2000-01-01 00:00:00 +3 e 2007-06-04 20:03:11 +4 d 2003-11-30 05:01:03 +5 c 2001-12-31 23:59:59 + +2.23 +partition update with moving partition +connection master_1; +DROP TABLE IF EXISTS ta_l2; +connection master_1; +CREATE TABLE ta_l2 ( +a INT, +b CHAR(1), +c DATETIME, +PRIMARY KEY(a) +) MASTER_1_ENGINE MASTER_1_COMMENT2_P_2_1 +INSERT INTO ta_l2 (a, b, c) VALUES (3, 'B', '2010-09-26 00:00:00'); +UPDATE ta_l2 SET a = 4 WHERE a = 3; +SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2; +a b date_format(c, '%Y-%m-%d %H:%i:%s') +4 B 2010-09-26 00:00:00 +index merge with partition +connection master_1; +DROP TABLE IF EXISTS ta_l_int; +connection master_1; +CREATE TABLE ta_l_int ( +a INT AUTO_INCREMENT, +b INT DEFAULT 10, +c INT DEFAULT 11, +PRIMARY KEY(a), +KEY idx1(b), +KEY idx2(c) +) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT3_P_2_1 +INSERT INTO ta_l_int (a, b, c) VALUES (1, 2, 3); +INSERT INTO ta_l_int (a, b, c) SELECT a + 1, b + 1, c + 1 FROM ta_l_int; +INSERT INTO ta_l_int (a, b, c) SELECT a + 2, b + 2, c + 2 FROM ta_l_int; +INSERT INTO ta_l_int (a, b, c) SELECT a + 4, b + 4, c + 4 FROM ta_l_int; +INSERT INTO ta_l_int (a, b, c) SELECT a + 8, b + 8, c + 8 FROM ta_l_int; +connection master_1; +SELECT a, b, c FROM ta_l_int force index(primary, idx1, idx2) +WHERE a = 5 OR b = 5 OR c = 5 ORDER BY a; +a b c +3 4 5 +4 5 6 +5 6 7 + +2.26 +auto_increment with partition +connection master_1; +connection slave1_1; +connection master_1; +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 ( +id int(11) NOT NULL AUTO_INCREMENT, +PRIMARY KEY (id) +) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_INCREMENT1_P_1 +MASTER_1_AUTO_INCREMENT_INCREMENT2 +MASTER_1_AUTO_INCREMENT_OFFSET2 +spider_direct_sql('SET SESSION AUTO_INCREMENT_INCREMENT = 4', '', +'srv "s_2_1"') +1 +spider_direct_sql('SET SESSION AUTO_INCREMENT_INCREMENT = 4', '', +'srv "s_2_2"') +1 +spider_bg_direct_sql('SET SESSION AUTO_INCREMENT_OFFSET = 2', '', +'srv "s_2_1"') +1 +spider_bg_direct_sql('SET SESSION AUTO_INCREMENT_OFFSET = 3', '', +'srv "s_2_2"') +1 +CREATE TABLE t1 ( +id int(11) NOT NULL AUTO_INCREMENT, +PRIMARY KEY (id) +) SLAVE1_1_ENGINE SLAVE1_1_CHARSET SLAVE1_1_COMMENT_INCREMENT1_P_1 +INSERT INTO t1 () VALUES (); +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +3 +SELECT MAX(id) FROM t1; +MAX(id) +3 +INSERT INTO t1 () VALUES (); +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +2 +SELECT MAX(id) FROM t1; +MAX(id) +3 +INSERT INTO t1 (id) VALUES (null); +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +7 +SELECT MAX(id) FROM t1; +MAX(id) +7 +INSERT INTO t1 (id) VALUES (null); +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +6 +SELECT MAX(id) FROM t1; +MAX(id) +7 +INSERT INTO t1 () VALUES (),(),(),(); +Warnings: +Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value +Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value +Note 12520 Binlog's auto-inc value is probably different from linked table's auto-inc value +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +10 +SELECT id FROM t1 ORDER BY id; +id +2 +3 +6 +7 +10 +11 +14 +15 +SET INSERT_ID=5000; +INSERT INTO t1 () VALUES (); +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +18 +SELECT MAX(id) FROM t1; +MAX(id) +18 +INSERT INTO t1 (id) VALUES (10000); +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +22 +SELECT MAX(id) FROM t1; +MAX(id) +22 +INSERT INTO t1 (id) VALUES (1000); +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +26 +SELECT MAX(id) FROM t1; +MAX(id) +26 +connection slave1_1; +SELECT id FROM t1 ORDER BY id; +id +2 +3 +6 +7 +10 +18 +777 +1000 +1554 +2331 +10000 +connection master_1; + +deinit +connection master_1; +DROP DATABASE IF EXISTS auto_test_local; +connection slave1_1; +DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; +DROP DATABASE IF EXISTS auto_test_remote; +connection child2_2; +DROP DATABASE IF EXISTS auto_test_remote2; +for slave1_1 +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +child3_1 +child3_2 +child3_3 + +end of test diff --git a/storage/spider/mysql-test/spider/handler/r/vp_fixes.result b/storage/spider/mysql-test/spider/handler/r/vp_fixes.result index 15dd29aa4d3..cc0e4105d61 100644 --- a/storage/spider/mysql-test/spider/handler/r/vp_fixes.result +++ b/storage/spider/mysql-test/spider/handler/r/vp_fixes.result @@ -9,22 +9,27 @@ child3_2 child3_3 drop and create databases +connection master_1; DROP DATABASE IF EXISTS auto_test_local; CREATE DATABASE auto_test_local; USE auto_test_local; +connection child2_1; DROP DATABASE IF EXISTS auto_test_remote; CREATE DATABASE auto_test_remote; USE auto_test_remote; +connection child2_2; DROP DATABASE IF EXISTS auto_test_remote2; CREATE DATABASE auto_test_remote2; USE auto_test_remote2; test select 1 +connection master_1; SELECT 1; 1 1 create table and insert +connection master_1; DROP TABLE IF EXISTS tb_l; CREATE TABLE tb_l ( a INT, @@ -46,26 +51,34 @@ INSERT INTO ta_l SELECT a, b, c FROM tb_l; 0.9 create different primary key table +connection master_1; CREATE TABLE ta_l_int ( a INT DEFAULT 10, b INT AUTO_INCREMENT, c INT DEFAULT 11, PRIMARY KEY(b) ) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT4_2_1 +connection master_1; INSERT INTO ta_l_int (a, b, c) VALUES (2, NULL, 3); create un-correspond primary key table +connection master_1; DROP TABLE IF EXISTS ta_l_int; +connection master_1; CREATE TABLE ta_l_int ( a INT DEFAULT 10, b INT DEFAULT 12, c INT DEFAULT 11, PRIMARY KEY(c) ) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT4_2_1 +connection master_1; INSERT INTO ta_l_int (a, b, c) VALUES (2, NULL, 3); deinit +connection master_1; DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; DROP DATABASE IF EXISTS auto_test_remote; +connection child2_2; DROP DATABASE IF EXISTS auto_test_remote2; for master_1 for child2 diff --git a/storage/spider/mysql-test/spider/handler/suite.opt b/storage/spider/mysql-test/spider/handler/suite.opt new file mode 100644 index 00000000000..48457b17309 --- /dev/null +++ b/storage/spider/mysql-test/spider/handler/suite.opt @@ -0,0 +1 @@ +--loose-innodb diff --git a/storage/spider/mysql-test/spider/handler/suite.pm b/storage/spider/mysql-test/spider/handler/suite.pm new file mode 100644 index 00000000000..f106147deb6 --- /dev/null +++ b/storage/spider/mysql-test/spider/handler/suite.pm @@ -0,0 +1,12 @@ +package My::Suite::Spider; + +@ISA = qw(My::Suite); + +return "No Spider engine" unless $ENV{HA_SPIDER_SO}; +return "Not run for embedded server" if $::opt_embedded_server; +return "Test needs --big-test" unless $::opt_big_test; + +sub is_default { 1 } + +bless { }; + diff --git a/storage/spider/spd_db_conn.cc b/storage/spider/spd_db_conn.cc index 5b2071b5f1e..b8a295b10f8 100644 --- a/storage/spider/spd_db_conn.cc +++ b/storage/spider/spd_db_conn.cc @@ -1846,8 +1846,8 @@ int spider_db_append_key_where_internal( #if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000 case HA_READ_PREFIX_LAST: result_list->desc_flg = TRUE; - /* fall through */ #endif + /* fall through */ case HA_READ_KEY_EXACT: if (sql_kind == SPIDER_SQL_KIND_SQL) { @@ -4132,8 +4132,10 @@ void spider_db_discard_multiple_result( if (!conn->db_conn->cmp_request_key_to_snd(&request_key)) break; if ((result = conn->db_conn->use_result(&request_key, &error_num))) + { result->free_result(); delete result; + } } while (!conn->db_conn->next_result()); DBUG_VOID_RETURN; } diff --git a/storage/spider/spd_db_handlersocket.cc b/storage/spider/spd_db_handlersocket.cc index 47f22b04116..32acb8df6fb 100644 --- a/storage/spider/spd_db_handlersocket.cc +++ b/storage/spider/spd_db_handlersocket.cc @@ -4994,6 +4994,15 @@ int spider_handlersocket_handler::append_explain_select_part( DBUG_RETURN(0); } +int spider_handlersocket_handler::is_sole_projection_field( + uint16 field_index +) { + DBUG_ENTER("spider_handlersocket_handler::is_sole_projection_field"); + DBUG_PRINT("info", ("spider this=%p", this)); + DBUG_ASSERT(0); + DBUG_RETURN(0); +} + bool spider_handlersocket_handler::is_bulk_insert_exec_period( bool bulk_end ) { diff --git a/storage/spider/spd_db_handlersocket.h b/storage/spider/spd_db_handlersocket.h index d3fdf5564b7..a3955aea044 100644 --- a/storage/spider/spd_db_handlersocket.h +++ b/storage/spider/spd_db_handlersocket.h @@ -776,6 +776,9 @@ public: ulong sql_type, int link_idx ); + bool is_sole_projection_field( + uint16 field_index + ); bool is_bulk_insert_exec_period( bool bulk_end ); diff --git a/storage/spider/spd_db_include.h b/storage/spider/spd_db_include.h index 936951d3860..56bc2ccad42 100644 --- a/storage/spider/spd_db_include.h +++ b/storage/spider/spd_db_include.h @@ -1279,6 +1279,9 @@ public: ulong sql_type, int link_idx ) = 0; + virtual bool is_sole_projection_field( + uint16 field_index + ) = 0; virtual bool is_bulk_insert_exec_period( bool bulk_end ) = 0; diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc index 1c1c440c2ed..9974b6b0628 100644 --- a/storage/spider/spd_db_mysql.cc +++ b/storage/spider/spd_db_mysql.cc @@ -9516,6 +9516,65 @@ int spider_mysql_handler::append_explain_select( DBUG_RETURN(0); } +/******************************************************************** + * Determine whether the current query's projection list + * consists solely of the specified column. + * + * Params IN - field_index: + * Field index of the column of interest within + * its table. + * + * Returns TRUE - if the query's projection list consists + * solely of the specified column. + * FALSE - otherwise. + ********************************************************************/ +bool spider_mysql_handler::is_sole_projection_field( uint16 field_index ) +{ + // Determine whether the projection list consists solely of the field of interest + bool is_field_in_projection_list = FALSE; + TABLE* table = spider->get_table(); + uint16 projection_field_count = 0; + uint16 projection_field_index; + Field** field; + DBUG_ENTER( "spider_mysql_handler::is_sole_projection_field" ); + + for ( field = table->field; *field ; field++ ) + { + projection_field_index = ( *field )->field_index; + + if ( !( minimum_select_bit_is_set( projection_field_index ) ) ) + { + // Current field is not in the projection list + continue; + } + + projection_field_count++; + + if ( !is_field_in_projection_list ) + { + if ( field_index == projection_field_index ) + { + // Field of interest is in the projection list + is_field_in_projection_list = TRUE; + } + } + + if ( is_field_in_projection_list && ( projection_field_count != 1 ) ) + { + // Field of interest is not the sole column in the projection list + DBUG_RETURN( FALSE ); + } + } + + if ( is_field_in_projection_list && ( projection_field_count == 1 ) ) + { + // Field of interest is the only column in the projection list + DBUG_RETURN( TRUE ); + } + + DBUG_RETURN( FALSE ); +} + bool spider_mysql_handler::is_bulk_insert_exec_period( bool bulk_end ) { diff --git a/storage/spider/spd_db_mysql.h b/storage/spider/spd_db_mysql.h index 9a4f08ade98..482289d1d68 100644 --- a/storage/spider/spd_db_mysql.h +++ b/storage/spider/spd_db_mysql.h @@ -1128,6 +1128,9 @@ public: ulong sql_type, int link_idx ); + bool is_sole_projection_field( + uint16 field_index + ); bool is_bulk_insert_exec_period( bool bulk_end ); diff --git a/storage/spider/spd_db_oracle.cc b/storage/spider/spd_db_oracle.cc index c3dfe8b8cf2..94f354e0a0f 100644 --- a/storage/spider/spd_db_oracle.cc +++ b/storage/spider/spd_db_oracle.cc @@ -9571,6 +9571,65 @@ int spider_oracle_handler::append_explain_select( DBUG_RETURN(0); } +/******************************************************************** + * Determine whether the current query's projection list + * consists solely of the specified column. + * + * Params IN - field_index: + * Field index of the column of interest within + * its table. + * + * Returns TRUE - if the query's projection list consists + * solely of the specified column. + * FALSE - otherwise. + ********************************************************************/ +bool spider_oracle_handler::is_sole_projection_field( uint16 field_index ) +{ + // Determine whether the projection list consists solely of the field of interest + bool is_field_in_projection_list = FALSE; + TABLE* table = spider->get_table(); + uint16 projection_field_count = 0; + uint16 projection_field_index; + Field** field; + DBUG_ENTER( "spider_oracle_handler::is_sole_projection_field" ); + + for ( field = table->field; *field; field++ ) + { + projection_field_index = ( *field )->field_index; + + if ( !( minimum_select_bit_is_set( projection_field_index ) ) ) + { + // Current field is not in the projection list + continue; + } + + projection_field_count++; + + if ( !is_field_in_projection_list ) + { + if (field_index == projection_field_index) + { + // Field of interest is in the projection list + is_field_in_projection_list = TRUE; + } + } + + if ( is_field_in_projection_list && ( projection_field_count != 1 ) ) + { + // Field of interest is not the sole column in the projection list + DBUG_RETURN( FALSE ); + } + } + + if ( is_field_in_projection_list && ( projection_field_count == 1 ) ) + { + // Field of interest is the only column in the projection list + DBUG_RETURN( TRUE ); + } + + DBUG_RETURN( FALSE ); +} + bool spider_oracle_handler::is_bulk_insert_exec_period( bool bulk_end ) { diff --git a/storage/spider/spd_db_oracle.h b/storage/spider/spd_db_oracle.h index 0e84435d9be..7a070f498da 100644 --- a/storage/spider/spd_db_oracle.h +++ b/storage/spider/spd_db_oracle.h @@ -1208,6 +1208,9 @@ public: ulong sql_type, int link_idx ); + bool is_sole_projection_field( + uint16 field_index + ); bool is_bulk_insert_exec_period( bool bulk_end ); diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc index 7724eb067e9..4b677b3b2fe 100644 --- a/storage/spider/spd_table.cc +++ b/storage/spider/spd_table.cc @@ -516,7 +516,6 @@ int spider_free_share_alloc( ) { int roop_count; DBUG_ENTER("spider_free_share_alloc"); - if (share->dbton_bitmap) { for (roop_count = SPIDER_DBTON_SIZE - 1; roop_count >= 0; roop_count--) { @@ -6938,7 +6937,7 @@ void spider_get_partition_info( partition_element **part_elem, partition_element **sub_elem ) { - char tmp_name[FN_LEN]; + char tmp_name[FN_REFLEN + 1]; partition_element *tmp_part_elem = NULL, *tmp_sub_elem = NULL; bool tmp_flg = FALSE, tmp_find_flg = FALSE; DBUG_ENTER("spider_get_partition_info"); @@ -6959,9 +6958,10 @@ void spider_get_partition_info( List_iterator sub_it((*part_elem)->subpartitions); while ((*sub_elem = sub_it++)) { - create_subpartition_name(tmp_name, table_share->path.str, - (*part_elem)->partition_name, (*sub_elem)->partition_name, - NORMAL_PART_NAME); + if (create_subpartition_name(tmp_name, sizeof(tmp_name), + table_share->path.str, (*part_elem)->partition_name, + (*sub_elem)->partition_name, NORMAL_PART_NAME)) + DBUG_VOID_RETURN; DBUG_PRINT("info",("spider tmp_name=%s", tmp_name)); if (!memcmp(table_name, tmp_name, table_name_length + 1)) DBUG_VOID_RETURN; @@ -6977,8 +6977,10 @@ void spider_get_partition_info( } } } else { - create_partition_name(tmp_name, table_share->path.str, - (*part_elem)->partition_name, NORMAL_PART_NAME, TRUE); + if (create_partition_name(tmp_name, sizeof(tmp_name), + table_share->path.str, (*part_elem)->partition_name, + NORMAL_PART_NAME, TRUE)) + DBUG_VOID_RETURN; DBUG_PRINT("info",("spider tmp_name=%s", tmp_name)); if (!memcmp(table_name, tmp_name, table_name_length + 1)) DBUG_VOID_RETURN; @@ -8444,7 +8446,7 @@ int spider_discover_table_structure( spider_free_share_resource_only(spider_share); #ifdef WITH_PARTITION_STORAGE_ENGINE } else { - char tmp_name[FN_LEN]; + char tmp_name[FN_REFLEN + 1]; List_iterator part_it(part_info->partitions); partition_element *part_elem, *sub_elem; while ((part_elem = part_it++)) @@ -8455,9 +8457,10 @@ int spider_discover_table_structure( while ((sub_elem = sub_it++)) { str.length(str_len); - create_subpartition_name(tmp_name, table_name, - (part_elem)->partition_name, (sub_elem)->partition_name, - NORMAL_PART_NAME); + if (create_subpartition_name(tmp_name, sizeof(tmp_name), table_name, + (part_elem)->partition_name, (sub_elem)->partition_name, + NORMAL_PART_NAME)) + DBUG_RETURN(1); DBUG_PRINT("info",("spider tmp_name=%s", tmp_name)); if (!(spider_share = spider_create_share(table_name, share, part_info, @@ -8480,8 +8483,9 @@ int spider_discover_table_structure( break; } else { str.length(str_len); - create_partition_name(tmp_name, table_name, - (part_elem)->partition_name, NORMAL_PART_NAME, TRUE); + if (create_partition_name(tmp_name, sizeof(tmp_name), table_name, + (part_elem)->partition_name, NORMAL_PART_NAME, TRUE)) + DBUG_RETURN(1); DBUG_PRINT("info",("spider tmp_name=%s", tmp_name)); if (!(spider_share = spider_create_share(table_name, share, part_info, @@ -8574,7 +8578,7 @@ int spider_discover_table_structure( } #ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE_COMMENT if (!(part_syntax = generate_partition_syntax(thd, part_info, &part_syntax_len, - FALSE, TRUE, info, NULL, NULL))) + TRUE, info, NULL))) #else if (!(part_syntax = generate_partition_syntax(part_info, &part_syntax_len, FALSE, TRUE, info, NULL))) @@ -8587,7 +8591,6 @@ int spider_discover_table_structure( DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str.q_append(part_syntax, part_syntax_len); - my_free(part_syntax, MYF(0)); } #endif DBUG_PRINT("info",("spider str=%s", str.c_ptr_safe())); diff --git a/storage/test_sql_discovery/mysql-test/sql_discovery/simple.result b/storage/test_sql_discovery/mysql-test/sql_discovery/simple.result index 7ca36e07438..23b7804638f 100644 --- a/storage/test_sql_discovery/mysql-test/sql_discovery/simple.result +++ b/storage/test_sql_discovery/mysql-test/sql_discovery/simple.result @@ -4,7 +4,7 @@ test_sql_discovery_statement test_sql_discovery_write_frm ON set sql_quote_show_create=0; create table t1 (a int) engine=test_sql_discovery; -ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by database") +ERROR HY000: Can't create table `test`.`t1` (errno: 131 "Command not supported by the engine") select * from t1; ERROR 42S02: Table 'test.t1' doesn't exist set @@test_sql_discovery_statement='t1:foobar bwa-ha-ha'; diff --git a/storage/tokudb/CMakeLists.txt b/storage/tokudb/CMakeLists.txt index ac8e5a11e2a..90996725a45 100644 --- a/storage/tokudb/CMakeLists.txt +++ b/storage/tokudb/CMakeLists.txt @@ -1,4 +1,4 @@ -SET(TOKUDB_VERSION 5.6.35-80.0) +SET(TOKUDB_VERSION 5.6.36-82.1) # PerconaFT only supports x86-64 and cmake-2.8.9+ IF(CMAKE_VERSION VERSION_LESS "2.8.9") MESSAGE(STATUS "CMake 2.8.9 or higher is required by TokuDB") @@ -21,9 +21,10 @@ SET(TOKUDB_SOURCES tokudb_background.cc tokudb_information_schema.cc tokudb_sysvars.cc - tokudb_thread.cc) + tokudb_thread.cc + tokudb_dir_cmd.cc) MYSQL_ADD_PLUGIN(tokudb ${TOKUDB_SOURCES} STORAGE_ENGINE MODULE_ONLY - COMPONENT tokudb-engine) + COMPONENT tokudb-engine CONFIG tokudb.cnf) IF(NOT TARGET tokudb) RETURN() @@ -110,8 +111,3 @@ TARGET_LINK_LIBRARIES(tokudb tokufractaltree_static tokuportability_static SET(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS_RELEASE} -flto -fuse-linker-plugin") SET(CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO} -flto -fuse-linker-plugin") - -IF (INSTALL_SYSCONF2DIR) - INSTALL(FILES tokudb.cnf DESTINATION ${INSTALL_SYSCONF2DIR} - COMPONENT tokudb-engine) -ENDIF(INSTALL_SYSCONF2DIR) diff --git a/storage/tokudb/PerconaFT/CMakeLists.txt b/storage/tokudb/PerconaFT/CMakeLists.txt index 375ce0078a4..1c9052c2a55 100644 --- a/storage/tokudb/PerconaFT/CMakeLists.txt +++ b/storage/tokudb/PerconaFT/CMakeLists.txt @@ -9,6 +9,16 @@ project(TokuDB) set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") +# detect when we are being built as a subproject +if (DEFINED MYSQL_PROJECT_NAME_DOCSTRING) + add_definitions( -DMYSQL_TOKUDB_ENGINE=1) + if ((CMAKE_BUILD_TYPE MATCHES "Debug") AND + (CMAKE_CXX_FLAGS_DEBUG MATCHES " -DENABLED_DEBUG_SYNC")) + include_directories(${CMAKE_SOURCE_DIR}/include) + include_directories(${CMAKE_SOURCE_DIR}/sql) + endif () +endif () + ## Versions of gcc >= 4.9.0 require special version of 'ar' and 'ranlib' for ## link-time optimizations to work properly. ## diff --git a/storage/tokudb/PerconaFT/buildheader/make_tdb.cc b/storage/tokudb/PerconaFT/buildheader/make_tdb.cc index 0145d631839..6f0b7c5f419 100644 --- a/storage/tokudb/PerconaFT/buildheader/make_tdb.cc +++ b/storage/tokudb/PerconaFT/buildheader/make_tdb.cc @@ -426,6 +426,9 @@ static void print_db_env_struct (void) { "bool (*set_dir_per_db)(DB_ENV *, bool new_val)", "bool (*get_dir_per_db)(DB_ENV *)", "const char *(*get_data_dir)(DB_ENV *env)", + "int (*dirtool_attach)(DB_ENV *, DB_TXN *, const char *, const char *)", + "int (*dirtool_detach)(DB_ENV *, DB_TXN *, const char *)", + "int (*dirtool_move)(DB_ENV *, DB_TXN *, const char *, const char *)", "void (*kill_waiter)(DB_ENV *, void *extra)", NULL}; diff --git a/storage/tokudb/PerconaFT/cmake_modules/TokuThirdParty.cmake b/storage/tokudb/PerconaFT/cmake_modules/TokuThirdParty.cmake index a2c3103f98c..9769b7db13d 100644 --- a/storage/tokudb/PerconaFT/cmake_modules/TokuThirdParty.cmake +++ b/storage/tokudb/PerconaFT/cmake_modules/TokuThirdParty.cmake @@ -123,6 +123,9 @@ ExternalProject_Add(build_snappy -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} + -DCMAKE_AR=${CMAKE_AR} + -DCMAKE_NM=${CMAKE_NM} + -DCMAKE_RANLIB=${CMAKE_RANLIB} -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} ${USE_PROJECT_CMAKE_MODULE_PATH} diff --git a/storage/tokudb/PerconaFT/ft/cachetable/cachetable.cc b/storage/tokudb/PerconaFT/ft/cachetable/cachetable.cc index 4505a236e13..54ef11eb1eb 100644 --- a/storage/tokudb/PerconaFT/ft/cachetable/cachetable.cc +++ b/storage/tokudb/PerconaFT/ft/cachetable/cachetable.cc @@ -465,7 +465,10 @@ int toku_cachetable_openf (CACHEFILE *cfptr, CACHETABLE ct, const char *fname_in char * toku_cachefile_fname_in_env (CACHEFILE cf) { - return cf->fname_in_env; + if (cf) { + return cf->fname_in_env; + } + return nullptr; } void toku_cachefile_set_fname_in_env(CACHEFILE cf, char *new_fname_in_env) { @@ -2891,6 +2894,10 @@ toku_cachefile_get_cachetable(CACHEFILE cf) { return cf->cachetable; } +CACHEFILE toku_pair_get_cachefile(PAIR pair) { + return pair->cachefile; +} + //Only called by ft_end_checkpoint //Must have access to cf->fd (must be protected) void toku_cachefile_fsync(CACHEFILE cf) { diff --git a/storage/tokudb/PerconaFT/ft/cachetable/cachetable.h b/storage/tokudb/PerconaFT/ft/cachetable/cachetable.h index 3b3cb0a2d46..b9851f33e20 100644 --- a/storage/tokudb/PerconaFT/ft/cachetable/cachetable.h +++ b/storage/tokudb/PerconaFT/ft/cachetable/cachetable.h @@ -297,6 +297,9 @@ void *toku_cachefile_get_userdata(CACHEFILE); CACHETABLE toku_cachefile_get_cachetable(CACHEFILE cf); // Effect: Get the cachetable. +CACHEFILE toku_pair_get_cachefile(PAIR); +// Effect: Get the cachefile of the pair + void toku_cachetable_swap_pair_values(PAIR old_pair, PAIR new_pair); // Effect: Swaps the value_data of old_pair and new_pair. // Requires: both old_pair and new_pair to be pinned with write locks. diff --git a/storage/tokudb/PerconaFT/ft/ft-ops.cc b/storage/tokudb/PerconaFT/ft/ft-ops.cc index eba9aa33e9f..20035b1d02f 100644 --- a/storage/tokudb/PerconaFT/ft/ft-ops.cc +++ b/storage/tokudb/PerconaFT/ft/ft-ops.cc @@ -652,8 +652,12 @@ void toku_ftnode_clone_callback(void *value_data, // set new pair attr if necessary if (node->height == 0) { *new_attr = make_ftnode_pair_attr(node); - node->logical_rows_delta = 0; - cloned_node->logical_rows_delta = 0; + for (int i = 0; i < node->n_children; i++) { + if (BP_STATE(node, i) == PT_AVAIL) { + BLB_LRD(node, i) = 0; + BLB_LRD(cloned_node, i) = 0; + } + } } else { new_attr->is_valid = false; } @@ -701,9 +705,26 @@ void toku_ftnode_flush_callback(CACHEFILE UU(cachefile), if (ftnode->height == 0) { FT_STATUS_INC(FT_FULL_EVICTIONS_LEAF, 1); FT_STATUS_INC(FT_FULL_EVICTIONS_LEAF_BYTES, node_size); - if (!ftnode->dirty) { - toku_ft_adjust_logical_row_count( - ft, -ftnode->logical_rows_delta); + + // A leaf node (height == 0) is being evicted (!keep_me) and is + // not a checkpoint clone (!is_clone). This leaf node may have + // had messages applied to satisfy a query, but was never + // actually dirtied (!ftnode->dirty && !write_me). **Note that + // if (write_me) would persist the node and clear the dirty + // flag **. This message application may have updated the trees + // logical row count. Since these message applications are not + // persisted, we need undo the logical row count adjustments as + // they may occur again in the future if/when the node is + // re-read from disk for another query or change. + if (!ftnode->dirty && !write_me) { + int64_t lrc_delta = 0; + for (int i = 0; i < ftnode->n_children; i++) { + if (BP_STATE(ftnode, i) == PT_AVAIL) { + lrc_delta -= BLB_LRD(ftnode, i); + BLB_LRD(ftnode, i) = 0; + } + } + toku_ft_adjust_logical_row_count(ft, lrc_delta); } } else { FT_STATUS_INC(FT_FULL_EVICTIONS_NONLEAF, 1); @@ -712,6 +733,11 @@ void toku_ftnode_flush_callback(CACHEFILE UU(cachefile), toku_free(*disk_data); } else { if (ftnode->height == 0) { + // No need to adjust logical row counts when flushing a clone + // as they should have been zeroed out anyway when cloned. + // Clones are 'copies' of work already done so doing it again + // (adjusting row counts) would be redundant and leads to + // inaccurate counts. for (int i = 0; i < ftnode->n_children; i++) { if (BP_STATE(ftnode, i) == PT_AVAIL) { BASEMENTNODE bn = BLB(ftnode, i); @@ -719,10 +745,6 @@ void toku_ftnode_flush_callback(CACHEFILE UU(cachefile), bn->stat64_delta); } } - if (!ftnode->dirty) { - toku_ft_adjust_logical_row_count( - ft, -ftnode->logical_rows_delta); - } } } toku_ftnode_free(&ftnode); @@ -749,24 +771,48 @@ toku_ft_status_update_pivot_fetch_reason(ftnode_fetch_extra *bfe) } } -int toku_ftnode_fetch_callback (CACHEFILE UU(cachefile), PAIR p, int fd, BLOCKNUM blocknum, uint32_t fullhash, - void **ftnode_pv, void** disk_data, PAIR_ATTR *sizep, int *dirtyp, void *extraargs) { +int toku_ftnode_fetch_callback(CACHEFILE UU(cachefile), + PAIR p, + int fd, + BLOCKNUM blocknum, + uint32_t fullhash, + void **ftnode_pv, + void **disk_data, + PAIR_ATTR *sizep, + int *dirtyp, + void *extraargs) { assert(extraargs); - assert(*ftnode_pv == NULL); - FTNODE_DISK_DATA* ndd = (FTNODE_DISK_DATA*)disk_data; + assert(*ftnode_pv == nullptr); + FTNODE_DISK_DATA *ndd = (FTNODE_DISK_DATA *)disk_data; ftnode_fetch_extra *bfe = (ftnode_fetch_extra *)extraargs; - FTNODE *node=(FTNODE*)ftnode_pv; + FTNODE *node = (FTNODE *)ftnode_pv; // deserialize the node, must pass the bfe in because we cannot // evaluate what piece of the the node is necessary until we get it at // least partially into memory - int r = toku_deserialize_ftnode_from(fd, blocknum, fullhash, node, ndd, bfe); + int r = + toku_deserialize_ftnode_from(fd, blocknum, fullhash, node, ndd, bfe); if (r != 0) { if (r == TOKUDB_BAD_CHECKSUM) { - fprintf(stderr, - "Checksum failure while reading node in file %s.\n", - toku_cachefile_fname_in_env(cachefile)); + fprintf( + stderr, + "%s:%d:toku_ftnode_fetch_callback - " + "file[%s], blocknum[%ld], toku_deserialize_ftnode_from " + "failed with a checksum error.\n", + __FILE__, + __LINE__, + toku_cachefile_fname_in_env(cachefile), + blocknum.b); } else { - fprintf(stderr, "Error deserializing node, errno = %d", r); + fprintf( + stderr, + "%s:%d:toku_ftnode_fetch_callback - " + "file[%s], blocknum[%ld], toku_deserialize_ftnode_from " + "failed with %d.\n", + __FILE__, + __LINE__, + toku_cachefile_fname_in_env(cachefile), + blocknum.b, + r); } // make absolutely sure we crash before doing anything else. abort(); @@ -775,7 +821,8 @@ int toku_ftnode_fetch_callback (CACHEFILE UU(cachefile), PAIR p, int fd, BLOCKNU if (r == 0) { *sizep = make_ftnode_pair_attr(*node); (*node)->ct_pair = p; - *dirtyp = (*node)->dirty; // deserialize could mark the node as dirty (presumably for upgrade) + *dirtyp = (*node)->dirty; // deserialize could mark the node as dirty + // (presumably for upgrade) } return r; } @@ -948,6 +995,16 @@ int toku_ftnode_pe_callback(void *ftnode_pv, basements_to_destroy[num_basements_to_destroy++] = bn; toku_ft_decrease_stats(&ft->in_memory_stats, bn->stat64_delta); + // A basement node is being partially evicted. + // This masement node may have had messages applied to it to + // satisfy a query, but was never actually dirtied. + // This message application may have updated the trees + // logical row count. Since these message applications are + // not being persisted, we need undo the logical row count + // adjustments as they may occur again in the future if/when + // the node is re-read from disk for another query or change. + toku_ft_adjust_logical_row_count(ft, + -bn->logical_rows_delta); set_BNULL(node, i); BP_STATE(node, i) = PT_ON_DISK; num_partial_evictions++; @@ -3901,25 +3958,34 @@ struct keyrange_compare_s { }; // TODO: Remove me, I'm boring -static int keyrange_compare(DBT const &kdbt, const struct keyrange_compare_s &s) { +static int keyrange_compare(DBT const &kdbt, + const struct keyrange_compare_s &s) { return s.ft->cmp(&kdbt, s.key); } -static void -keysrange_in_leaf_partition (FT_HANDLE ft_handle, FTNODE node, - DBT* key_left, DBT* key_right, - int left_child_number, int right_child_number, uint64_t estimated_num_rows, - uint64_t *less, uint64_t* equal_left, uint64_t* middle, - uint64_t* equal_right, uint64_t* greater, bool* single_basement_node) +static void keysrange_in_leaf_partition(FT_HANDLE ft_handle, + FTNODE node, + DBT *key_left, + DBT *key_right, + int left_child_number, + int right_child_number, + uint64_t estimated_num_rows, + uint64_t *less, + uint64_t *equal_left, + uint64_t *middle, + uint64_t *equal_right, + uint64_t *greater, + bool *single_basement_node) // If the partition is in main memory then estimate the number // Treat key_left == NULL as negative infinity // Treat key_right == NULL as positive infinity { - paranoid_invariant(node->height == 0); // we are in a leaf + paranoid_invariant(node->height == 0); // we are in a leaf paranoid_invariant(!(key_left == NULL && key_right != NULL)); paranoid_invariant(left_child_number <= right_child_number); bool single_basement = left_child_number == right_child_number; - paranoid_invariant(!single_basement || (BP_STATE(node, left_child_number) == PT_AVAIL)); + paranoid_invariant(!single_basement || + (BP_STATE(node, left_child_number) == PT_AVAIL)); if (BP_STATE(node, left_child_number) == PT_AVAIL) { int r; // The partition is in main memory then get an exact count. @@ -3927,29 +3993,35 @@ keysrange_in_leaf_partition (FT_HANDLE ft_handle, FTNODE node, BASEMENTNODE bn = BLB(node, left_child_number); uint32_t idx_left = 0; // if key_left is NULL then set r==-1 and idx==0. - r = key_left ? bn->data_buffer.find_zero(s_left, nullptr, nullptr, nullptr, &idx_left) : -1; + r = key_left + ? bn->data_buffer.find_zero( + s_left, nullptr, nullptr, nullptr, &idx_left) + : -1; *less = idx_left; - *equal_left = (r==0) ? 1 : 0; + *equal_left = (r == 0) ? 1 : 0; uint32_t size = bn->data_buffer.num_klpairs(); uint32_t idx_right = size; r = -1; if (single_basement && key_right) { struct keyrange_compare_s s_right = {ft_handle->ft, key_right}; - r = bn->data_buffer.find_zero(s_right, nullptr, nullptr, nullptr, &idx_right); + r = bn->data_buffer.find_zero( + s_right, nullptr, nullptr, nullptr, &idx_right); } *middle = idx_right - idx_left - *equal_left; - *equal_right = (r==0) ? 1 : 0; + *equal_right = (r == 0) ? 1 : 0; *greater = size - idx_right - *equal_right; } else { paranoid_invariant(!single_basement); uint32_t idx_left = estimated_num_rows / 2; if (!key_left) { - //Both nullptr, assume key_left belongs before leftmost entry, key_right belongs after rightmost entry + // Both nullptr, assume key_left belongs before leftmost entry, + // key_right belongs after rightmost entry idx_left = 0; paranoid_invariant(!key_right); } - // Assume idx_left and idx_right point to where key_left and key_right belong, (but are not there). + // Assume idx_left and idx_right point to where key_left and key_right + // belong, (but are not there). *less = idx_left; *equal_left = 0; *middle = estimated_num_rows - idx_left; @@ -3959,44 +4031,76 @@ keysrange_in_leaf_partition (FT_HANDLE ft_handle, FTNODE node, *single_basement_node = single_basement; } -static int -toku_ft_keysrange_internal (FT_HANDLE ft_handle, FTNODE node, - DBT* key_left, DBT* key_right, bool may_find_right, - uint64_t* less, uint64_t* equal_left, uint64_t* middle, - uint64_t* equal_right, uint64_t* greater, bool* single_basement_node, - uint64_t estimated_num_rows, - ftnode_fetch_extra *min_bfe, // set up to read a minimal read. - ftnode_fetch_extra *match_bfe, // set up to read a basement node iff both keys in it - struct unlockers *unlockers, ANCESTORS ancestors, const pivot_bounds &bounds) -// Implementation note: Assign values to less, equal, and greater, and then on the way out (returning up the stack) we add more values in. +static int toku_ft_keysrange_internal( + FT_HANDLE ft_handle, + FTNODE node, + DBT *key_left, + DBT *key_right, + bool may_find_right, + uint64_t *less, + uint64_t *equal_left, + uint64_t *middle, + uint64_t *equal_right, + uint64_t *greater, + bool *single_basement_node, + uint64_t estimated_num_rows, + ftnode_fetch_extra *min_bfe, // set up to read a minimal read. + ftnode_fetch_extra + *match_bfe, // set up to read a basement node iff both keys in it + struct unlockers *unlockers, + ANCESTORS ancestors, + const pivot_bounds &bounds) +// Implementation note: Assign values to less, equal, and greater, and then on +// the way out (returning up the stack) we add more values in. { int r = 0; // if KEY is NULL then use the leftmost key. - int left_child_number = key_left ? toku_ftnode_which_child (node, key_left, ft_handle->ft->cmp) : 0; - int right_child_number = node->n_children; // Sentinel that does not equal left_child_number. + int left_child_number = + key_left ? toku_ftnode_which_child(node, key_left, ft_handle->ft->cmp) + : 0; + int right_child_number = + node->n_children; // Sentinel that does not equal left_child_number. if (may_find_right) { - right_child_number = key_right ? toku_ftnode_which_child (node, key_right, ft_handle->ft->cmp) : node->n_children - 1; + right_child_number = + key_right + ? toku_ftnode_which_child(node, key_right, ft_handle->ft->cmp) + : node->n_children - 1; } uint64_t rows_per_child = estimated_num_rows / node->n_children; if (node->height == 0) { - keysrange_in_leaf_partition(ft_handle, node, key_left, key_right, left_child_number, right_child_number, - rows_per_child, less, equal_left, middle, equal_right, greater, single_basement_node); + keysrange_in_leaf_partition(ft_handle, + node, + key_left, + key_right, + left_child_number, + right_child_number, + rows_per_child, + less, + equal_left, + middle, + equal_right, + greater, + single_basement_node); - *less += rows_per_child * left_child_number; + *less += rows_per_child * left_child_number; if (*single_basement_node) { - *greater += rows_per_child * (node->n_children - left_child_number - 1); + *greater += + rows_per_child * (node->n_children - left_child_number - 1); } else { - *middle += rows_per_child * (node->n_children - left_child_number - 1); + *middle += + rows_per_child * (node->n_children - left_child_number - 1); } } else { // do the child. struct ancestors next_ancestors = {node, left_child_number, ancestors}; BLOCKNUM childblocknum = BP_BLOCKNUM(node, left_child_number); - uint32_t fullhash = compute_child_fullhash(ft_handle->ft->cf, node, left_child_number); + uint32_t fullhash = + compute_child_fullhash(ft_handle->ft->cf, node, left_child_number); FTNODE childnode; bool msgs_applied = false; - bool child_may_find_right = may_find_right && left_child_number == right_child_number; + bool child_may_find_right = + may_find_right && left_child_number == right_child_number; r = toku_pin_ftnode_for_query( ft_handle, childblocknum, @@ -4007,27 +4111,45 @@ toku_ft_keysrange_internal (FT_HANDLE ft_handle, FTNODE node, child_may_find_right ? match_bfe : min_bfe, false, &childnode, - &msgs_applied - ); + &msgs_applied); paranoid_invariant(!msgs_applied); if (r != TOKUDB_TRY_AGAIN) { assert_zero(r); - struct unlock_ftnode_extra unlock_extra = {ft_handle,childnode,false}; - struct unlockers next_unlockers = {true, unlock_ftnode_fun, (void*)&unlock_extra, unlockers}; - const pivot_bounds next_bounds = bounds.next_bounds(node, left_child_number); + struct unlock_ftnode_extra unlock_extra = { + ft_handle, childnode, false}; + struct unlockers next_unlockers = { + true, unlock_ftnode_fun, (void *)&unlock_extra, unlockers}; + const pivot_bounds next_bounds = + bounds.next_bounds(node, left_child_number); - r = toku_ft_keysrange_internal(ft_handle, childnode, key_left, key_right, child_may_find_right, - less, equal_left, middle, equal_right, greater, single_basement_node, - rows_per_child, min_bfe, match_bfe, &next_unlockers, &next_ancestors, next_bounds); + r = toku_ft_keysrange_internal(ft_handle, + childnode, + key_left, + key_right, + child_may_find_right, + less, + equal_left, + middle, + equal_right, + greater, + single_basement_node, + rows_per_child, + min_bfe, + match_bfe, + &next_unlockers, + &next_ancestors, + next_bounds); if (r != TOKUDB_TRY_AGAIN) { assert_zero(r); - *less += rows_per_child * left_child_number; + *less += rows_per_child * left_child_number; if (*single_basement_node) { - *greater += rows_per_child * (node->n_children - left_child_number - 1); + *greater += rows_per_child * + (node->n_children - left_child_number - 1); } else { - *middle += rows_per_child * (node->n_children - left_child_number - 1); + *middle += rows_per_child * + (node->n_children - left_child_number - 1); } assert(unlockers->locked); @@ -4038,10 +4160,21 @@ toku_ft_keysrange_internal (FT_HANDLE ft_handle, FTNODE node, return r; } -void toku_ft_keysrange(FT_HANDLE ft_handle, DBT* key_left, DBT* key_right, uint64_t *less_p, uint64_t* equal_left_p, uint64_t* middle_p, uint64_t* equal_right_p, uint64_t* greater_p, bool* middle_3_exact_p) -// Effect: Return an estimate of the number of keys to the left, the number equal (to left key), number between keys, number equal to right key, and the number to the right of both keys. +void toku_ft_keysrange(FT_HANDLE ft_handle, + DBT *key_left, + DBT *key_right, + uint64_t *less_p, + uint64_t *equal_left_p, + uint64_t *middle_p, + uint64_t *equal_right_p, + uint64_t *greater_p, + bool *middle_3_exact_p) +// Effect: Return an estimate of the number of keys to the left, the number +// equal (to left key), number between keys, number equal to right key, and the +// number to the right of both keys. // The values are an estimate. -// If you perform a keyrange on two keys that are in the same basement, equal_less, middle, and equal_right will be exact. +// If you perform a keyrange on two keys that are in the same basement, +// equal_less, middle, and equal_right will be exact. // 4184: What to do with a NULL key? // key_left==NULL is treated as -infinity // key_right==NULL is treated as +infinity @@ -4049,10 +4182,21 @@ void toku_ft_keysrange(FT_HANDLE ft_handle, DBT* key_left, DBT* key_right, uint6 // key_right can be non-null only if key_left is non-null; { if (!key_left && key_right) { - // Simplify internals by only supporting key_right != null when key_left != null - // If key_right != null and key_left == null, then swap them and fix up numbers. - uint64_t less = 0, equal_left = 0, middle = 0, equal_right = 0, greater = 0; - toku_ft_keysrange(ft_handle, key_right, nullptr, &less, &equal_left, &middle, &equal_right, &greater, middle_3_exact_p); + // Simplify internals by only supporting key_right != null when key_left + // != null + // If key_right != null and key_left == null, then swap them and fix up + // numbers. + uint64_t less = 0, equal_left = 0, middle = 0, equal_right = 0, + greater = 0; + toku_ft_keysrange(ft_handle, + key_right, + nullptr, + &less, + &equal_left, + &middle, + &equal_right, + &greater, + middle_3_exact_p); *less_p = 0; *equal_left_p = 0; *middle_p = less; @@ -4065,98 +4209,132 @@ void toku_ft_keysrange(FT_HANDLE ft_handle, DBT* key_left, DBT* key_right, uint6 paranoid_invariant(!(!key_left && key_right)); ftnode_fetch_extra min_bfe; ftnode_fetch_extra match_bfe; - min_bfe.create_for_min_read(ft_handle->ft); // read pivot keys but not message buffers - match_bfe.create_for_keymatch(ft_handle->ft, key_left, key_right, false, false); // read basement node only if both keys in it. -try_again: + min_bfe.create_for_min_read( + ft_handle->ft); // read pivot keys but not message buffers + match_bfe.create_for_keymatch( + ft_handle->ft, + key_left, + key_right, + false, + false); // read basement node only if both keys in it. +try_again : { + uint64_t less = 0, equal_left = 0, middle = 0, equal_right = 0, greater = 0; + bool single_basement_node = false; + FTNODE node = NULL; { - uint64_t less = 0, equal_left = 0, middle = 0, equal_right = 0, greater = 0; - bool single_basement_node = false; - FTNODE node = NULL; - { - uint32_t fullhash; - CACHEKEY root_key; - toku_calculate_root_offset_pointer(ft_handle->ft, &root_key, &fullhash); - toku_pin_ftnode( - ft_handle->ft, - root_key, - fullhash, - &match_bfe, - PL_READ, // may_modify_node, cannot change root during keyrange - &node, - true - ); + uint32_t fullhash; + CACHEKEY root_key; + toku_calculate_root_offset_pointer(ft_handle->ft, &root_key, &fullhash); + toku_pin_ftnode( + ft_handle->ft, + root_key, + fullhash, + &match_bfe, + PL_READ, // may_modify_node, cannot change root during keyrange + &node, + true); + } + + struct unlock_ftnode_extra unlock_extra = {ft_handle, node, false}; + struct unlockers unlockers = { + true, unlock_ftnode_fun, (void *)&unlock_extra, (UNLOCKERS)NULL}; + + { + int r; + int64_t numrows = ft_handle->ft->in_memory_logical_rows; + if (numrows < 0) + numrows = 0; // prevent appearance of a negative number + r = toku_ft_keysrange_internal(ft_handle, + node, + key_left, + key_right, + true, + &less, + &equal_left, + &middle, + &equal_right, + &greater, + &single_basement_node, + numrows, + &min_bfe, + &match_bfe, + &unlockers, + (ANCESTORS)NULL, + pivot_bounds::infinite_bounds()); + assert(r == 0 || r == TOKUDB_TRY_AGAIN); + if (r == TOKUDB_TRY_AGAIN) { + assert(!unlockers.locked); + goto try_again; } - - struct unlock_ftnode_extra unlock_extra = {ft_handle,node,false}; - struct unlockers unlockers = {true, unlock_ftnode_fun, (void*)&unlock_extra, (UNLOCKERS)NULL}; - - { - int r; - int64_t numrows = ft_handle->ft->in_memory_stats.numrows; - if (numrows < 0) - numrows = 0; // prevent appearance of a negative number - r = toku_ft_keysrange_internal (ft_handle, node, key_left, key_right, true, - &less, &equal_left, &middle, &equal_right, &greater, - &single_basement_node, numrows, - &min_bfe, &match_bfe, &unlockers, (ANCESTORS)NULL, pivot_bounds::infinite_bounds()); + // May need to do a second query. + if (!single_basement_node && key_right != nullptr) { + // "greater" is stored in "middle" + invariant_zero(equal_right); + invariant_zero(greater); + uint64_t less2 = 0, equal_left2 = 0, middle2 = 0, equal_right2 = 0, + greater2 = 0; + bool ignore; + r = toku_ft_keysrange_internal(ft_handle, + node, + key_right, + nullptr, + false, + &less2, + &equal_left2, + &middle2, + &equal_right2, + &greater2, + &ignore, + numrows, + &min_bfe, + &match_bfe, + &unlockers, + (ANCESTORS) nullptr, + pivot_bounds::infinite_bounds()); assert(r == 0 || r == TOKUDB_TRY_AGAIN); if (r == TOKUDB_TRY_AGAIN) { assert(!unlockers.locked); goto try_again; } - // May need to do a second query. - if (!single_basement_node && key_right != nullptr) { - // "greater" is stored in "middle" - invariant_zero(equal_right); - invariant_zero(greater); - uint64_t less2 = 0, equal_left2 = 0, middle2 = 0, equal_right2 = 0, greater2 = 0; - bool ignore; - r = toku_ft_keysrange_internal (ft_handle, node, key_right, nullptr, false, - &less2, &equal_left2, &middle2, &equal_right2, &greater2, - &ignore, numrows, - &min_bfe, &match_bfe, &unlockers, (ANCESTORS)nullptr, pivot_bounds::infinite_bounds()); - assert(r == 0 || r == TOKUDB_TRY_AGAIN); - if (r == TOKUDB_TRY_AGAIN) { - assert(!unlockers.locked); - goto try_again; - } - invariant_zero(equal_right2); - invariant_zero(greater2); - // Update numbers. - // less is already correct. - // equal_left is already correct. + invariant_zero(equal_right2); + invariant_zero(greater2); + // Update numbers. + // less is already correct. + // equal_left is already correct. - // "middle" currently holds everything greater than left_key in first query - // 'middle2' currently holds everything greater than right_key in second query - // 'equal_left2' is how many match right_key + // "middle" currently holds everything greater than left_key in + // first query + // 'middle2' currently holds everything greater than right_key in + // second query + // 'equal_left2' is how many match right_key - // Prevent underflow. - if (middle >= equal_left2 + middle2) { - middle -= equal_left2 + middle2; - } else { - middle = 0; - } - equal_right = equal_left2; - greater = middle2; + // Prevent underflow. + if (middle >= equal_left2 + middle2) { + middle -= equal_left2 + middle2; + } else { + middle = 0; } + equal_right = equal_left2; + greater = middle2; } - assert(unlockers.locked); - toku_unpin_ftnode_read_only(ft_handle->ft, node); - if (!key_right) { - paranoid_invariant_zero(equal_right); - paranoid_invariant_zero(greater); - } - if (!key_left) { - paranoid_invariant_zero(less); - paranoid_invariant_zero(equal_left); - } - *less_p = less; - *equal_left_p = equal_left; - *middle_p = middle; - *equal_right_p = equal_right; - *greater_p = greater; - *middle_3_exact_p = single_basement_node; } + assert(unlockers.locked); + toku_unpin_ftnode_read_only(ft_handle->ft, node); + if (!key_right) { + paranoid_invariant_zero(equal_right); + paranoid_invariant_zero(greater); + } + if (!key_left) { + paranoid_invariant_zero(less); + paranoid_invariant_zero(equal_left); + } + *less_p = less; + *equal_left_p = equal_left; + *middle_p = middle; + *equal_right_p = equal_right; + *greater_p = greater; + *middle_3_exact_p = single_basement_node; +} } struct get_key_after_bytes_iterate_extra { diff --git a/storage/tokudb/PerconaFT/ft/ft.cc b/storage/tokudb/PerconaFT/ft/ft.cc index cec54e38a47..abc9d295eae 100644 --- a/storage/tokudb/PerconaFT/ft/ft.cc +++ b/storage/tokudb/PerconaFT/ft/ft.cc @@ -436,7 +436,8 @@ int toku_read_ft_and_store_in_cachefile (FT_HANDLE ft_handle, CACHEFILE cf, LSN } int fd = toku_cachefile_get_fd(cf); - int r = toku_deserialize_ft_from(fd, max_acceptable_lsn, &ft); + const char *fn = toku_cachefile_fname_in_env(cf); + int r = toku_deserialize_ft_from(fd, fn, max_acceptable_lsn, &ft); if (r == TOKUDB_BAD_CHECKSUM) { fprintf(stderr, "Checksum failure while reading header in file %s.\n", toku_cachefile_fname_in_env(cf)); assert(false); // make absolutely sure we crash before doing anything else diff --git a/storage/tokudb/PerconaFT/ft/loader/dbufio.cc b/storage/tokudb/PerconaFT/ft/loader/dbufio.cc index 64722bd68f1..ad084a4fbdc 100644 --- a/storage/tokudb/PerconaFT/ft/loader/dbufio.cc +++ b/storage/tokudb/PerconaFT/ft/loader/dbufio.cc @@ -566,7 +566,7 @@ dbufio_print(DBUFIO_FILESET bfs) { fprintf(stderr, "%s:%d bfs=%p", __FILE__, __LINE__, bfs); if (bfs->panic) fprintf(stderr, " panic=%d", bfs->panic_errno); - fprintf(stderr, " N=%d %d %" PRIuMAX, bfs->N, bfs->n_not_done, bfs->bufsize); + fprintf(stderr, " N=%d %d %" PRIuMAX, bfs->N, bfs->n_not_done, (uintmax_t) bfs->bufsize); for (int i = 0; i < bfs->N; i++) { struct dbufio_file *dbf = &bfs->files[i]; if (dbf->error_code[0] || dbf->error_code[1]) diff --git a/storage/tokudb/PerconaFT/ft/node.cc b/storage/tokudb/PerconaFT/ft/node.cc index aad0c1ca078..ddc850632bf 100644 --- a/storage/tokudb/PerconaFT/ft/node.cc +++ b/storage/tokudb/PerconaFT/ft/node.cc @@ -94,6 +94,7 @@ void toku_destroy_ftnode_internals(FTNODE node) { if (node->height > 0) { destroy_nonleaf_childinfo(BNC(node,i)); } else { + paranoid_invariant(BLB_LRD(node, i) == 0); destroy_basement_node(BLB(node, i)); } } else if (BP_STATE(node,i) == PT_COMPRESSED) { @@ -387,8 +388,7 @@ static void bnc_apply_messages_to_basement_node( const pivot_bounds & bounds, // contains pivot key bounds of this basement node txn_gc_info *gc_info, - bool *msgs_applied, - int64_t* logical_rows_delta) { + bool *msgs_applied) { int r; NONLEAF_CHILDINFO bnc = BNC(ancestor, childnum); @@ -396,6 +396,7 @@ static void bnc_apply_messages_to_basement_node( // apply messages from this buffer STAT64INFO_S stats_delta = {0, 0}; uint64_t workdone_this_ancestor = 0; + int64_t logical_rows_delta = 0; uint32_t stale_lbi, stale_ube; if (!bn->stale_ancestor_messages_applied) { @@ -471,7 +472,7 @@ static void bnc_apply_messages_to_basement_node( gc_info, &workdone_this_ancestor, &stats_delta, - logical_rows_delta); + &logical_rows_delta); } } else if (stale_lbi == stale_ube) { // No stale messages to apply, we just apply fresh messages, and mark @@ -483,7 +484,7 @@ static void bnc_apply_messages_to_basement_node( .gc_info = gc_info, .workdone = &workdone_this_ancestor, .stats_to_update = &stats_delta, - .logical_rows_delta = logical_rows_delta}; + .logical_rows_delta = &logical_rows_delta}; if (fresh_ube - fresh_lbi > 0) *msgs_applied = true; r = bnc->fresh_message_tree @@ -504,7 +505,7 @@ static void bnc_apply_messages_to_basement_node( .gc_info = gc_info, .workdone = &workdone_this_ancestor, .stats_to_update = &stats_delta, - .logical_rows_delta = logical_rows_delta}; + .logical_rows_delta = &logical_rows_delta}; r = bnc->stale_message_tree .iterate_on_rangeft->in_memory_stats, stats_delta); } + toku_ft_adjust_logical_row_count(t->ft, logical_rows_delta); + bn->logical_rows_delta += logical_rows_delta; } static void @@ -535,7 +538,6 @@ apply_ancestors_messages_to_bn( bool* msgs_applied ) { - int64_t logical_rows_delta = 0; BASEMENTNODE curr_bn = BLB(node, childnum); const pivot_bounds curr_bounds = bounds.next_bounds(node, childnum); for (ANCESTORS curr_ancestors = ancestors; curr_ancestors; curr_ancestors = curr_ancestors->next) { @@ -548,16 +550,13 @@ apply_ancestors_messages_to_bn( curr_ancestors->childnum, curr_bounds, gc_info, - msgs_applied, - &logical_rows_delta + msgs_applied ); // We don't want to check this ancestor node again if the // next time we query it, the msn hasn't changed. curr_bn->max_msn_applied = curr_ancestors->node->max_msn_applied_to_node_on_disk; } } - toku_ft_adjust_logical_row_count(t->ft, logical_rows_delta); - node->logical_rows_delta += logical_rows_delta; // At this point, we know all the stale messages above this // basement node have been applied, and any new messages will be // fresh, so we don't need to look at stale messages for this diff --git a/storage/tokudb/PerconaFT/ft/node.h b/storage/tokudb/PerconaFT/ft/node.h index db189e36d59..05c8a44ebed 100644 --- a/storage/tokudb/PerconaFT/ft/node.h +++ b/storage/tokudb/PerconaFT/ft/node.h @@ -175,11 +175,6 @@ struct ftnode { int height; int dirty; uint32_t fullhash; - // current count of rows add or removed as a result of message application - // to this node as a basement, irrelevant for internal nodes, gets reset - // when node is undirtied. Used to back out tree scoped LRC id node is - // evicted but not persisted - int64_t logical_rows_delta; // for internal nodes, if n_children==fanout+1 then the tree needs to be // rebalanced. for leaf nodes, represents number of basement nodes @@ -211,6 +206,10 @@ struct ftnode_leaf_basement_node { unsigned int seqinsert; // number of sequential inserts to this leaf MSN max_msn_applied; // max message sequence number applied bool stale_ancestor_messages_applied; + // current count of rows added or removed as a result of message application + // to this basement node, gets reset when node is undirtied. + // Used to back out tree scoped LRC id node is evicted but not persisted + int64_t logical_rows_delta; STAT64INFO_S stat64_delta; // change in stat64 counters since basement was last written to disk }; typedef struct ftnode_leaf_basement_node *BASEMENTNODE; @@ -385,6 +384,16 @@ enum reactivity toku_ftnode_get_reactivity(FT ft, FTNODE node); enum reactivity toku_ftnode_get_nonleaf_reactivity(FTNODE node, unsigned int fanout); enum reactivity toku_ftnode_get_leaf_reactivity(FTNODE node, uint32_t nodesize); +inline const char* toku_ftnode_get_cachefile_fname_in_env(FTNODE node) { + if (node->ct_pair) { + CACHEFILE cf = toku_pair_get_cachefile(node->ct_pair); + if (cf) { + return toku_cachefile_fname_in_env(cf); + } + } + return nullptr; +} + /** * Finds the next child for HOT to flush to, given that everything up to * and including k has been flattened. @@ -577,3 +586,4 @@ static inline void set_BSB(FTNODE node, int i, struct sub_block *sb) { #define BLB_DATA(node,i) (&(BLB(node,i)->data_buffer)) #define BLB_NBYTESINDATA(node,i) (BLB_DATA(node,i)->get_disk_size()) #define BLB_SEQINSERT(node,i) (BLB(node,i)->seqinsert) +#define BLB_LRD(node, i) (BLB(node,i)->logical_rows_delta) diff --git a/storage/tokudb/PerconaFT/ft/serialize/ft-serialize.cc b/storage/tokudb/PerconaFT/ft/serialize/ft-serialize.cc index 8fcb5293412..fcab9fc675e 100644 --- a/storage/tokudb/PerconaFT/ft/serialize/ft-serialize.cc +++ b/storage/tokudb/PerconaFT/ft/serialize/ft-serialize.cc @@ -644,7 +644,29 @@ exit: // Read ft from file into struct. Read both headers and use one. // We want the latest acceptable header whose checkpoint_lsn is no later // than max_acceptable_lsn. -int toku_deserialize_ft_from(int fd, LSN max_acceptable_lsn, FT *ft) { +#define dump_state_of_toku_deserialize_ft_from() \ + fprintf(stderr, \ + "%s:%d toku_deserialize_ft_from: " \ + "filename[%s] " \ + "r[%d] max_acceptable_lsn[%lu]" \ + "r0[%d] checkpoint_lsn_0[%lu] checkpoint_count_0[%lu] " \ + "r1[%d] checkpoint_lsn_1[%lu] checkpoint_count_1[%lu]\n", \ + __FILE__, \ + __LINE__, \ + fn, \ + r, \ + max_acceptable_lsn.lsn, \ + r0, \ + checkpoint_lsn_0.lsn, \ + checkpoint_count_0, \ + r1, \ + checkpoint_lsn_1.lsn, \ + checkpoint_count_1); + +int toku_deserialize_ft_from(int fd, + const char *fn, + LSN max_acceptable_lsn, + FT *ft) { struct rbuf rb_0; struct rbuf rb_1; uint64_t checkpoint_count_0 = 0; @@ -655,7 +677,7 @@ int toku_deserialize_ft_from(int fd, LSN max_acceptable_lsn, FT *ft) { bool h0_acceptable = false; bool h1_acceptable = false; struct rbuf *rb = NULL; - int r0, r1, r; + int r0, r1, r = 0; toku_off_t header_0_off = 0; r0 = deserialize_ft_from_fd_into_rbuf(fd, @@ -702,6 +724,10 @@ int toku_deserialize_ft_from(int fd, LSN max_acceptable_lsn, FT *ft) { // first header, unless it's readable } + if (r != TOKUDB_DICTIONARY_NO_HEADER) { + dump_state_of_toku_deserialize_ft_from(); + } + // it should not be possible for both headers to be later than the // max_acceptable_lsn invariant( @@ -713,11 +739,19 @@ int toku_deserialize_ft_from(int fd, LSN max_acceptable_lsn, FT *ft) { if (h0_acceptable && h1_acceptable) { if (checkpoint_count_0 > checkpoint_count_1) { + if (!(checkpoint_count_0 == checkpoint_count_1 + 1) || + !(version_0 >= version_1)) { + dump_state_of_toku_deserialize_ft_from(); + } invariant(checkpoint_count_0 == checkpoint_count_1 + 1); invariant(version_0 >= version_1); rb = &rb_0; version = version_0; } else { + if (!(checkpoint_count_1 == checkpoint_count_0 + 1) || + !(version_1 >= version_0)) { + dump_state_of_toku_deserialize_ft_from(); + } invariant(checkpoint_count_1 == checkpoint_count_0 + 1); invariant(version_1 >= version_0); rb = &rb_1; @@ -729,6 +763,7 @@ int toku_deserialize_ft_from(int fd, LSN max_acceptable_lsn, FT *ft) { fprintf( stderr, "Header 2 checksum failed, but header 1 ok. Proceeding.\n"); + dump_state_of_toku_deserialize_ft_from(); } rb = &rb_0; version = version_0; @@ -738,11 +773,15 @@ int toku_deserialize_ft_from(int fd, LSN max_acceptable_lsn, FT *ft) { fprintf( stderr, "Header 1 checksum failed, but header 2 ok. Proceeding.\n"); + dump_state_of_toku_deserialize_ft_from(); } rb = &rb_1; version = version_1; } + if (!rb) { + dump_state_of_toku_deserialize_ft_from(); + } paranoid_invariant(rb); r = deserialize_ft_versioned(fd, rb, ft, version); diff --git a/storage/tokudb/PerconaFT/ft/serialize/ft-serialize.h b/storage/tokudb/PerconaFT/ft/serialize/ft-serialize.h index fe31ff7c5fd..144e188566c 100644 --- a/storage/tokudb/PerconaFT/ft/serialize/ft-serialize.h +++ b/storage/tokudb/PerconaFT/ft/serialize/ft-serialize.h @@ -42,12 +42,23 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include "ft/serialize/block_table.h" size_t toku_serialize_ft_size(struct ft_header *h); -void toku_serialize_ft_to(int fd, struct ft_header *h, block_table *bt, CACHEFILE cf); -void toku_serialize_ft_to_wbuf(struct wbuf *wbuf, struct ft_header *h, DISKOFF translation_location_on_disk, DISKOFF translation_size_on_disk); -void toku_serialize_descriptor_contents_to_fd(int fd, DESCRIPTOR desc, DISKOFF offset); -void toku_serialize_descriptor_contents_to_wbuf(struct wbuf *wb, DESCRIPTOR desc); - -int toku_deserialize_ft_from(int fd, LSN max_acceptable_lsn, FT *ft); +void toku_serialize_ft_to(int fd, + struct ft_header *h, + block_table *bt, + CACHEFILE cf); +void toku_serialize_ft_to_wbuf(struct wbuf *wbuf, + struct ft_header *h, + DISKOFF translation_location_on_disk, + DISKOFF translation_size_on_disk); +void toku_serialize_descriptor_contents_to_fd(int fd, + DESCRIPTOR desc, + DISKOFF offset); +void toku_serialize_descriptor_contents_to_wbuf(struct wbuf *wb, + DESCRIPTOR desc); +int toku_deserialize_ft_from(int fd, + const char *fn, + LSN max_acceptable_lsn, + FT *ft); // TODO rename int deserialize_ft_from_fd_into_rbuf(int fd, diff --git a/storage/tokudb/PerconaFT/ft/serialize/ft_node-serialize.cc b/storage/tokudb/PerconaFT/ft/serialize/ft_node-serialize.cc index 56876b474d4..22a562ae24c 100644 --- a/storage/tokudb/PerconaFT/ft/serialize/ft_node-serialize.cc +++ b/storage/tokudb/PerconaFT/ft/serialize/ft_node-serialize.cc @@ -761,7 +761,7 @@ int toku_serialize_ftnode_to_memory(FTNODE node, // Zero the rest of the buffer memset(data + total_node_size, 0, total_buffer_size - total_node_size); - assert(curr_ptr - data == total_node_size); + assert((uint32_t) (curr_ptr - data) == total_node_size); *bytes_to_write = data; *n_bytes_to_write = total_buffer_size; *n_uncompressed_bytes = total_uncompressed_size; @@ -830,6 +830,13 @@ int toku_serialize_ftnode_to(int fd, node->dirty = 0; // See #1957. Must set the node to be clean after // serializing it so that it doesn't get written again on // the next checkpoint or eviction. + if (node->height == 0) { + for (int i = 0; i < node->n_children; i++) { + if (BP_STATE(node, i) == PT_AVAIL) { + BLB_LRD(node, i) = 0; + } + } + } return 0; } @@ -996,6 +1003,7 @@ BASEMENTNODE toku_clone_bn(BASEMENTNODE orig_bn) { bn->seqinsert = orig_bn->seqinsert; bn->stale_ancestor_messages_applied = orig_bn->stale_ancestor_messages_applied; bn->stat64_delta = orig_bn->stat64_delta; + bn->logical_rows_delta = orig_bn->logical_rows_delta; bn->data_buffer.clone(&orig_bn->data_buffer); return bn; } @@ -1006,6 +1014,7 @@ BASEMENTNODE toku_create_empty_bn_no_buffer(void) { bn->seqinsert = 0; bn->stale_ancestor_messages_applied = false; bn->stat64_delta = ZEROSTATS; + bn->logical_rows_delta = 0; bn->data_buffer.init_zero(); return bn; } @@ -1149,15 +1158,25 @@ just_decompress_sub_block(struct sub_block *sb) } // verify the checksum -int -verify_ftnode_sub_block (struct sub_block *sb) -{ +int verify_ftnode_sub_block(struct sub_block *sb, + const char *fname, + BLOCKNUM blocknum) { int r = 0; // first verify the checksum uint32_t data_size = sb->uncompressed_size - 4; // checksum is 4 bytes at end uint32_t stored_xsum = toku_dtoh32(*((uint32_t *)((char *)sb->uncompressed_ptr + data_size))); uint32_t actual_xsum = toku_x1764_memory(sb->uncompressed_ptr, data_size); if (stored_xsum != actual_xsum) { + fprintf( + stderr, + "%s:%d:verify_ftnode_sub_block - " + "file[%s], blocknum[%ld], stored_xsum[%u] != actual_xsum[%u]\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + blocknum.b, + stored_xsum, + actual_xsum); dump_bad_block((Bytef *) sb->uncompressed_ptr, sb->uncompressed_size); r = TOKUDB_BAD_CHECKSUM; } @@ -1165,19 +1184,27 @@ verify_ftnode_sub_block (struct sub_block *sb) } // This function deserializes the data stored by serialize_ftnode_info -static int -deserialize_ftnode_info( - struct sub_block *sb, - FTNODE node - ) -{ +static int deserialize_ftnode_info(struct sub_block *sb, FTNODE node) { + // sb_node_info->uncompressed_ptr stores the serialized node information // this function puts that information into node // first verify the checksum int r = 0; - r = verify_ftnode_sub_block(sb); + const char *fname = toku_ftnode_get_cachefile_fname_in_env(node); + r = verify_ftnode_sub_block(sb, fname, node->blocknum); if (r != 0) { + fprintf( + stderr, + "%s:%d:deserialize_ftnode_info - " + "file[%s], blocknum[%ld], verify_ftnode_sub_block failed with %d\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + node->blocknum.b, + r); + dump_bad_block(static_cast(sb->uncompressed_ptr), + sb->uncompressed_size); goto exit; } @@ -1223,6 +1250,16 @@ deserialize_ftnode_info( // make sure that all the data was read if (data_size != rb.ndone) { + fprintf( + stderr, + "%s:%d:deserialize_ftnode_info - " + "file[%s], blocknum[%ld], data_size[%d] != rb.ndone[%d]\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + node->blocknum.b, + data_size, + rb.ndone); dump_bad_block(rb.buf, rb.size); abort(); } @@ -1339,17 +1376,25 @@ static void setup_ftnode_partitions(FTNODE node, ftnode_fetch_extra *bfe, bool d /* deserialize the partition from the sub-block's uncompressed buffer * and destroy the uncompressed buffer */ -static int -deserialize_ftnode_partition( +static int deserialize_ftnode_partition( struct sub_block *sb, FTNODE node, - int childnum, // which partition to deserialize - const toku::comparator &cmp - ) -{ + int childnum, // which partition to deserialize + const toku::comparator &cmp) { + int r = 0; - r = verify_ftnode_sub_block(sb); + const char *fname = toku_ftnode_get_cachefile_fname_in_env(node); + r = verify_ftnode_sub_block(sb, fname, node->blocknum); if (r != 0) { + fprintf(stderr, + "%s:%d:deserialize_ftnode_partition - " + "file[%s], blocknum[%ld], " + "verify_ftnode_sub_block failed with %d\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + node->blocknum.b, + r); goto exit; } uint32_t data_size; @@ -1362,7 +1407,20 @@ deserialize_ftnode_partition( ch = rbuf_char(&rb); if (node->height > 0) { - assert(ch == FTNODE_PARTITION_MSG_BUFFER); + if (ch != FTNODE_PARTITION_MSG_BUFFER) { + fprintf(stderr, + "%s:%d:deserialize_ftnode_partition - " + "file[%s], blocknum[%ld], ch[%d] != " + "FTNODE_PARTITION_MSG_BUFFER[%d]\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + node->blocknum.b, + ch, + FTNODE_PARTITION_MSG_BUFFER); + dump_bad_block(rb.buf, rb.size); + assert(ch == FTNODE_PARTITION_MSG_BUFFER); + } NONLEAF_CHILDINFO bnc = BNC(node, childnum); if (node->layout_version_read_from_disk <= FT_LAYOUT_VERSION_26) { // Layout version <= 26 did not serialize sorted message trees to disk. @@ -1371,43 +1429,99 @@ deserialize_ftnode_partition( deserialize_child_buffer(bnc, &rb); } BP_WORKDONE(node, childnum) = 0; - } - else { - assert(ch == FTNODE_PARTITION_DMT_LEAVES); + } else { + if (ch != FTNODE_PARTITION_DMT_LEAVES) { + fprintf(stderr, + "%s:%d:deserialize_ftnode_partition - " + "file[%s], blocknum[%ld], ch[%d] != " + "FTNODE_PARTITION_DMT_LEAVES[%d]\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + node->blocknum.b, + ch, + FTNODE_PARTITION_DMT_LEAVES); + dump_bad_block(rb.buf, rb.size); + assert(ch == FTNODE_PARTITION_DMT_LEAVES); + } + BLB_SEQINSERT(node, childnum) = 0; uint32_t num_entries = rbuf_int(&rb); // we are now at the first byte of first leafentry data_size -= rb.ndone; // remaining bytes of leafentry data BASEMENTNODE bn = BLB(node, childnum); - bn->data_buffer.deserialize_from_rbuf(num_entries, &rb, data_size, node->layout_version_read_from_disk); + bn->data_buffer.deserialize_from_rbuf( + num_entries, &rb, data_size, node->layout_version_read_from_disk); } - assert(rb.ndone == rb.size); + if (rb.ndone != rb.size) { + fprintf(stderr, + "%s:%d:deserialize_ftnode_partition - " + "file[%s], blocknum[%ld], rb.ndone[%d] != rb.size[%d]\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + node->blocknum.b, + rb.ndone, + rb.size); + dump_bad_block(rb.buf, rb.size); + assert(rb.ndone == rb.size); + } + exit: return r; } -static int -decompress_and_deserialize_worker(struct rbuf curr_rbuf, struct sub_block curr_sb, FTNODE node, int child, - const toku::comparator &cmp, tokutime_t *decompress_time) -{ +static int decompress_and_deserialize_worker(struct rbuf curr_rbuf, + struct sub_block curr_sb, + FTNODE node, + int child, + const toku::comparator &cmp, + tokutime_t *decompress_time) { int r = 0; tokutime_t t0 = toku_time_now(); r = read_and_decompress_sub_block(&curr_rbuf, &curr_sb); - tokutime_t t1 = toku_time_now(); - if (r == 0) { - // at this point, sb->uncompressed_ptr stores the serialized node partition - r = deserialize_ftnode_partition(&curr_sb, node, child, cmp); + if (r != 0) { + const char *fname = toku_ftnode_get_cachefile_fname_in_env(node); + fprintf(stderr, + "%s:%d:decompress_and_deserialize_worker - " + "file[%s], blocknum[%ld], read_and_decompress_sub_block failed " + "with %d\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + node->blocknum.b, + r); + dump_bad_block(curr_rbuf.buf, curr_rbuf.size); + goto exit; + } + *decompress_time = toku_time_now() - t0; + // at this point, sb->uncompressed_ptr stores the serialized node partition + r = deserialize_ftnode_partition(&curr_sb, node, child, cmp); + if (r != 0) { + const char *fname = toku_ftnode_get_cachefile_fname_in_env(node); + fprintf(stderr, + "%s:%d:decompress_and_deserialize_worker - " + "file[%s], blocknum[%ld], deserialize_ftnode_partition failed " + "with %d\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + node->blocknum.b, + r); + dump_bad_block(curr_rbuf.buf, curr_rbuf.size); + goto exit; } - *decompress_time = t1 - t0; +exit: toku_free(curr_sb.uncompressed_ptr); return r; } -static int -check_and_copy_compressed_sub_block_worker(struct rbuf curr_rbuf, struct sub_block curr_sb, FTNODE node, int child) -{ +static int check_and_copy_compressed_sub_block_worker(struct rbuf curr_rbuf, + struct sub_block curr_sb, + FTNODE node, + int child) { int r = 0; r = read_compressed_sub_block(&curr_rbuf, &curr_sb); if (r != 0) { @@ -1419,7 +1533,8 @@ check_and_copy_compressed_sub_block_worker(struct rbuf curr_rbuf, struct sub_blo bp_sb->compressed_size = curr_sb.compressed_size; bp_sb->uncompressed_size = curr_sb.uncompressed_size; bp_sb->compressed_ptr = toku_xmalloc(bp_sb->compressed_size); - memcpy(bp_sb->compressed_ptr, curr_sb.compressed_ptr, bp_sb->compressed_size); + memcpy( + bp_sb->compressed_ptr, curr_sb.compressed_ptr, bp_sb->compressed_size); exit: return r; } @@ -1430,35 +1545,50 @@ static FTNODE alloc_ftnode_for_deserialize(uint32_t fullhash, BLOCKNUM blocknum) node->fullhash = fullhash; node->blocknum = blocknum; node->dirty = 0; - node->logical_rows_delta = 0; - node->bp = nullptr; node->oldest_referenced_xid_known = TXNID_NONE; + node->bp = nullptr; + node->ct_pair = nullptr; return node; } -static int -deserialize_ftnode_header_from_rbuf_if_small_enough (FTNODE *ftnode, - FTNODE_DISK_DATA* ndd, - BLOCKNUM blocknum, - uint32_t fullhash, - ftnode_fetch_extra *bfe, - struct rbuf *rb, - int fd) +static int deserialize_ftnode_header_from_rbuf_if_small_enough( + FTNODE *ftnode, + FTNODE_DISK_DATA *ndd, + BLOCKNUM blocknum, + uint32_t fullhash, + ftnode_fetch_extra *bfe, + struct rbuf *rb, + int fd) // If we have enough information in the rbuf to construct a header, then do so. // Also fetch in the basement node if needed. -// Return 0 if it worked. If something goes wrong (including that we are looking at some old data format that doesn't have partitions) then return nonzero. +// Return 0 if it worked. If something goes wrong (including that we are +// looking at some old data format that doesn't have partitions) then return +// nonzero. { int r = 0; tokutime_t t0, t1; tokutime_t decompress_time = 0; tokutime_t deserialize_time = 0; + // we must get the name from bfe and not through + // toku_ftnode_get_cachefile_fname_in_env as the node is not set up yet + const char* fname = toku_cachefile_fname_in_env(bfe->ft->cf); t0 = toku_time_now(); FTNODE node = alloc_ftnode_for_deserialize(fullhash, blocknum); if (rb->size < 24) { + fprintf( + stderr, + "%s:%d:deserialize_ftnode_header_from_rbuf_if_small_enough - " + "file[%s], blocknum[%ld], rb->size[%u] < 24\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + blocknum.b, + rb->size); + dump_bad_block(rb->buf, rb->size); // TODO: What error do we return here? // Does it even matter? r = toku_db_badformat(); @@ -1467,14 +1597,45 @@ deserialize_ftnode_header_from_rbuf_if_small_enough (FTNODE *ftnode, const void *magic; rbuf_literal_bytes(rb, &magic, 8); - if (memcmp(magic, "tokuleaf", 8)!=0 && - memcmp(magic, "tokunode", 8)!=0) { + if (memcmp(magic, "tokuleaf", 8) != 0 && + memcmp(magic, "tokunode", 8) != 0) { + fprintf( + stderr, + "%s:%d:deserialize_ftnode_header_from_rbuf_if_small_enough - " + "file[%s], blocknum[%ld], unrecognized magic number " + "%2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + blocknum.b, + static_cast(magic)[0], + static_cast(magic)[1], + static_cast(magic)[2], + static_cast(magic)[3], + static_cast(magic)[4], + static_cast(magic)[5], + static_cast(magic)[6], + static_cast(magic)[7]); + dump_bad_block(rb->buf, rb->size); r = toku_db_badformat(); goto cleanup; } node->layout_version_read_from_disk = rbuf_int(rb); - if (node->layout_version_read_from_disk < FT_FIRST_LAYOUT_VERSION_WITH_BASEMENT_NODES) { + if (node->layout_version_read_from_disk < + FT_FIRST_LAYOUT_VERSION_WITH_BASEMENT_NODES) { + fprintf( + stderr, + "%s:%d:deserialize_ftnode_header_from_rbuf_if_small_enough - " + "file[%s], blocknum[%ld], node->layout_version_read_from_disk[%d] " + "< FT_FIRST_LAYOUT_VERSION_WITH_BASEMENT_NODES[%d]\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + blocknum.b, + node->layout_version_read_from_disk, + FT_FIRST_LAYOUT_VERSION_WITH_BASEMENT_NODES); + dump_bad_block(rb->buf, rb->size); // This code path doesn't have to worry about upgrade. r = toku_db_badformat(); goto cleanup; @@ -1496,10 +1657,24 @@ deserialize_ftnode_header_from_rbuf_if_small_enough (FTNODE *ftnode, // is too big, we may have a problem, so check that we won't overflow // while reading the partition locations. unsigned int nhsize; - nhsize = serialize_node_header_size(node); // we can do this because n_children is filled in. + // we can do this because n_children is filled in. + nhsize = serialize_node_header_size(node); unsigned int needed_size; - needed_size = nhsize + 12; // we need 12 more so that we can read the compressed block size information that follows for the nodeinfo. + // we need 12 more so that we can read the compressed block size information + // that follows for the nodeinfo. + needed_size = nhsize + 12; if (needed_size > rb->size) { + fprintf( + stderr, + "%s:%d:deserialize_ftnode_header_from_rbuf_if_small_enough - " + "file[%s], blocknum[%ld], needed_size[%d] > rb->size[%d]\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + blocknum.b, + needed_size, + rb->size); + dump_bad_block(rb->buf, rb->size); r = toku_db_badformat(); goto cleanup; } @@ -1517,6 +1692,16 @@ deserialize_ftnode_header_from_rbuf_if_small_enough (FTNODE *ftnode, uint32_t stored_checksum; stored_checksum = rbuf_int(rb); if (stored_checksum != checksum) { + fprintf( + stderr, + "%s:%d:deserialize_ftnode_header_from_rbuf_if_small_enough - " + "file[%s], blocknum[%ld], stored_checksum[%d] != checksum[%d]\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + blocknum.b, + stored_checksum, + checksum); dump_bad_block(rb->buf, rb->size); r = TOKUDB_BAD_CHECKSUM; goto cleanup; @@ -1525,9 +1710,23 @@ deserialize_ftnode_header_from_rbuf_if_small_enough (FTNODE *ftnode, // Now we want to read the pivot information. struct sub_block sb_node_info; sub_block_init(&sb_node_info); - sb_node_info.compressed_size = rbuf_int(rb); // we'll be able to read these because we checked the size earlier. + // we'll be able to read these because we checked the size earlier. + sb_node_info.compressed_size = rbuf_int(rb); sb_node_info.uncompressed_size = rbuf_int(rb); - if (rb->size-rb->ndone < sb_node_info.compressed_size + 8) { + if (rb->size - rb->ndone < sb_node_info.compressed_size + 8) { + fprintf( + stderr, + "%s:%d:deserialize_ftnode_header_from_rbuf_if_small_enough - " + "file[%s], blocknum[%ld], rb->size[%d] - rb->ndone[%d] < " + "sb_node_info.compressed_size[%d] + 8\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + blocknum.b, + rb->size, + rb->ndone, + sb_node_info.compressed_size); + dump_bad_block(rb->buf, rb->size); r = toku_db_badformat(); goto cleanup; } @@ -1539,8 +1738,20 @@ deserialize_ftnode_header_from_rbuf_if_small_enough (FTNODE *ftnode, sb_node_info.xsum = rbuf_int(rb); // let's check the checksum uint32_t actual_xsum; - actual_xsum = toku_x1764_memory((char *)sb_node_info.compressed_ptr-8, 8+sb_node_info.compressed_size); + actual_xsum = toku_x1764_memory((char *)sb_node_info.compressed_ptr - 8, + 8 + sb_node_info.compressed_size); if (sb_node_info.xsum != actual_xsum) { + fprintf( + stderr, + "%s:%d:deserialize_ftnode_header_from_rbuf_if_small_enough - " + "file[%s], blocknum[%ld], sb_node_info.xsum[%d] != actual_xsum[%d]\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + blocknum.b, + sb_node_info.xsum, + actual_xsum); + dump_bad_block(rb->buf, rb->size); r = TOKUDB_BAD_CHECKSUM; goto cleanup; } @@ -1550,18 +1761,30 @@ deserialize_ftnode_header_from_rbuf_if_small_enough (FTNODE *ftnode, toku::scoped_malloc sb_node_info_buf(sb_node_info.uncompressed_size); sb_node_info.uncompressed_ptr = sb_node_info_buf.get(); tokutime_t decompress_t0 = toku_time_now(); - toku_decompress( - (Bytef *) sb_node_info.uncompressed_ptr, - sb_node_info.uncompressed_size, - (Bytef *) sb_node_info.compressed_ptr, - sb_node_info.compressed_size - ); + toku_decompress((Bytef *)sb_node_info.uncompressed_ptr, + sb_node_info.uncompressed_size, + (Bytef *)sb_node_info.compressed_ptr, + sb_node_info.compressed_size); tokutime_t decompress_t1 = toku_time_now(); decompress_time = decompress_t1 - decompress_t0; // at this point sb->uncompressed_ptr stores the serialized node info. r = deserialize_ftnode_info(&sb_node_info, node); if (r != 0) { + fprintf( + stderr, + "%s:%d:deserialize_ftnode_header_from_rbuf_if_small_enough - " + "file[%s], blocknum[%ld], deserialize_ftnode_info failed with " + "%d\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + blocknum.b, + r); + dump_bad_block( + static_cast(sb_node_info.uncompressed_ptr), + sb_node_info.uncompressed_size); + dump_bad_block(rb->buf, rb->size); goto cleanup; } } @@ -1586,6 +1809,17 @@ deserialize_ftnode_header_from_rbuf_if_small_enough (FTNODE *ftnode, PAIR_ATTR attr; r = toku_ftnode_pf_callback(node, *ndd, bfe, fd, &attr); if (r != 0) { + fprintf( + stderr, + "%s:%d:deserialize_ftnode_header_from_rbuf_if_small_enough - " + "file[%s], blocknum[%ld], toku_ftnode_pf_callback failed with " + "%d\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + blocknum.b, + r); + dump_bad_block(rb->buf, rb->size); goto cleanup; } } @@ -1622,12 +1856,10 @@ cleanup: // that did not generate MSN's for messages. These new MSN's are // generated from the root downwards, counting backwards from MIN_MSN // and persisted in the ft header. -static int -deserialize_and_upgrade_internal_node(FTNODE node, - struct rbuf *rb, - ftnode_fetch_extra *bfe, - STAT64INFO info) -{ +static int deserialize_and_upgrade_internal_node(FTNODE node, + struct rbuf *rb, + ftnode_fetch_extra *bfe, + STAT64INFO info) { int version = node->layout_version_read_from_disk; if (version == FT_LAST_LAYOUT_VERSION_WITH_FINGERPRINT) { @@ -1892,25 +2124,25 @@ deserialize_and_upgrade_leaf_node(FTNODE node, return r; } -static int -read_and_decompress_block_from_fd_into_rbuf(int fd, BLOCKNUM blocknum, - DISKOFF offset, DISKOFF size, - FT ft, - struct rbuf *rb, - /* out */ int *layout_version_p); +static int read_and_decompress_block_from_fd_into_rbuf( + int fd, + BLOCKNUM blocknum, + DISKOFF offset, + DISKOFF size, + FT ft, + struct rbuf *rb, + /* out */ int *layout_version_p); // This function upgrades a version 14 or 13 ftnode to the current // version. NOTE: This code assumes the first field of the rbuf has // already been read from the buffer (namely the layout_version of the // ftnode.) -static int -deserialize_and_upgrade_ftnode(FTNODE node, - FTNODE_DISK_DATA* ndd, - BLOCKNUM blocknum, - ftnode_fetch_extra *bfe, - STAT64INFO info, - int fd) -{ +static int deserialize_and_upgrade_ftnode(FTNODE node, + FTNODE_DISK_DATA *ndd, + BLOCKNUM blocknum, + ftnode_fetch_extra *bfe, + STAT64INFO info, + int fd) { int r = 0; int version; @@ -1929,6 +2161,16 @@ deserialize_and_upgrade_ftnode(FTNODE node, &rb, &version); if (r != 0) { + const char* fname = toku_cachefile_fname_in_env(bfe->ft->cf); + fprintf(stderr, + "%s:%d:deserialize_and_upgrade_ftnode - " + "file[%s], blocknum[%ld], " + "read_and_decompress_block_from_fd_into_rbuf failed with %d\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + blocknum.b, + r); goto exit; } @@ -1944,6 +2186,21 @@ deserialize_and_upgrade_ftnode(FTNODE node, // Copy over old version info. node->layout_version_read_from_disk = rbuf_int(&rb); // 2. layout version version = node->layout_version_read_from_disk; + if (version > FT_LAYOUT_VERSION_14) { + const char* fname = toku_cachefile_fname_in_env(bfe->ft->cf); + fprintf(stderr, + "%s:%d:deserialize_and_upgrade_ftnode - " + "file[%s], blocknum[%ld], version[%d] > " + "FT_LAYOUT_VERSION_14[%d]\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + blocknum.b, + version, + FT_LAYOUT_VERSION_14); + dump_bad_block(rb.buf, rb.size); + goto exit; + } assert(version <= FT_LAYOUT_VERSION_14); // Upgrade the current version number to the current version. node->layout_version = FT_LAYOUT_VERSION; @@ -1991,25 +2248,23 @@ exit: return r; } -static int -deserialize_ftnode_from_rbuf( - FTNODE *ftnode, - FTNODE_DISK_DATA* ndd, - BLOCKNUM blocknum, - uint32_t fullhash, - ftnode_fetch_extra *bfe, - STAT64INFO info, - struct rbuf *rb, - int fd - ) -// Effect: deserializes a ftnode that is in rb (with pointer of rb just past the magic) into a FTNODE. -{ +// Effect: deserializes a ftnode that is in rb (with pointer of rb just past the +// magic) into a FTNODE. +static int deserialize_ftnode_from_rbuf(FTNODE *ftnode, + FTNODE_DISK_DATA *ndd, + BLOCKNUM blocknum, + uint32_t fullhash, + ftnode_fetch_extra *bfe, + STAT64INFO info, + struct rbuf *rb, + int fd) { int r = 0; struct sub_block sb_node_info; tokutime_t t0, t1; tokutime_t decompress_time = 0; tokutime_t deserialize_time = 0; + const char* fname = toku_cachefile_fname_in_env(bfe->ft->cf); t0 = toku_time_now(); @@ -2019,8 +2274,26 @@ deserialize_ftnode_from_rbuf( // first thing we do is read the header information const void *magic; rbuf_literal_bytes(rb, &magic, 8); - if (memcmp(magic, "tokuleaf", 8)!=0 && - memcmp(magic, "tokunode", 8)!=0) { + if (memcmp(magic, "tokuleaf", 8) != 0 && + memcmp(magic, "tokunode", 8) != 0) { + fprintf(stderr, + "%s:%d:deserialize_ftnode_from_rbuf - " + "file[%s], blocknum[%ld], unrecognized magic number " + "%2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + blocknum.b, + static_cast(magic)[0], + static_cast(magic)[1], + static_cast(magic)[2], + static_cast(magic)[3], + static_cast(magic)[4], + static_cast(magic)[5], + static_cast(magic)[6], + static_cast(magic)[7]); + dump_bad_block(rb->buf, rb->size); + r = toku_db_badformat(); goto cleanup; } @@ -2034,6 +2307,16 @@ deserialize_ftnode_from_rbuf( // Perform the upgrade. r = deserialize_and_upgrade_ftnode(node, ndd, blocknum, bfe, info, fd); if (r != 0) { + fprintf(stderr, + "%s:%d:deserialize_ftnode_from_rbuf - " + "file[%s], blocknum[%ld], deserialize_and_upgrade_ftnode " + "failed with %d\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + blocknum.b, + r); + dump_bad_block(rb->buf, rb->size); goto cleanup; } @@ -2069,6 +2352,16 @@ deserialize_ftnode_from_rbuf( uint32_t stored_checksum; stored_checksum = rbuf_int(rb); if (stored_checksum != checksum) { + fprintf( + stderr, + "%s:%d:deserialize_ftnode_from_rbuf - " + "file[%s], blocknum[%ld], stored_checksum[%d] != checksum[%d]\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + blocknum.b, + stored_checksum, + checksum); dump_bad_block(rb->buf, rb->size); invariant(stored_checksum == checksum); } @@ -2080,34 +2373,61 @@ deserialize_ftnode_from_rbuf( r = read_and_decompress_sub_block(rb, &sb_node_info); tokutime_t sb_decompress_t1 = toku_time_now(); decompress_time += sb_decompress_t1 - sb_decompress_t0; - } - if (r != 0) { - goto cleanup; + if (r != 0) { + fprintf( + stderr, + "%s:%d:deserialize_ftnode_from_rbuf - " + "file[%s], blocknum[%ld], read_and_decompress_sub_block failed " + "with %d\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + blocknum.b, + r); + dump_bad_block( + static_cast(sb_node_info.uncompressed_ptr), + sb_node_info.uncompressed_size); + dump_bad_block(rb->buf, rb->size); + goto cleanup; + } } // at this point, sb->uncompressed_ptr stores the serialized node info r = deserialize_ftnode_info(&sb_node_info, node); if (r != 0) { + fprintf( + stderr, + "%s:%d:deserialize_ftnode_from_rbuf - " + "file[%s], blocknum[%ld], deserialize_ftnode_info failed with " + "%d\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + blocknum.b, + r); + dump_bad_block(rb->buf, rb->size); goto cleanup; } toku_free(sb_node_info.uncompressed_ptr); - // now that the node info has been deserialized, we can proceed to deserialize - // the individual sub blocks + // now that the node info has been deserialized, we can proceed to + // deserialize the individual sub blocks // setup the memory of the partitions - // for partitions being decompressed, create either message buffer or basement node + // for partitions being decompressed, create either message buffer or + // basement node // for partitions staying compressed, create sub_block setup_ftnode_partitions(node, bfe, true); - // This loop is parallelizeable, since we don't have a dependency on the work done so far. + // This loop is parallelizeable, since we don't have a dependency on the + // work done so far. for (int i = 0; i < node->n_children; i++) { - uint32_t curr_offset = BP_START(*ndd,i); - uint32_t curr_size = BP_SIZE(*ndd,i); - // the compressed, serialized partitions start at where rb is currently pointing, - // which would be rb->buf + rb->ndone + uint32_t curr_offset = BP_START(*ndd, i); + uint32_t curr_size = BP_SIZE(*ndd, i); + // the compressed, serialized partitions start at where rb is currently + // pointing, which would be rb->buf + rb->ndone // we need to intialize curr_rbuf to point to this place - struct rbuf curr_rbuf = {.buf = NULL, .size = 0, .ndone = 0}; + struct rbuf curr_rbuf = {.buf = nullptr, .size = 0, .ndone = 0}; rbuf_init(&curr_rbuf, rb->buf + curr_offset, curr_size); // @@ -2120,26 +2440,45 @@ deserialize_ftnode_from_rbuf( // of the compressed partitions (also possibly none or possibly all) // The partitions that we want to decompress and make available // to the node, we do, the rest we simply copy in compressed - // form into the node, and set the state of the partition to PT_COMPRESSED + // form into the node, and set the state of the partition to + // PT_COMPRESSED // struct sub_block curr_sb; sub_block_init(&curr_sb); - // curr_rbuf is passed by value to decompress_and_deserialize_worker, so there's no ugly race condition. + // curr_rbuf is passed by value to decompress_and_deserialize_worker, + // so there's no ugly race condition. // This would be more obvious if curr_rbuf were an array. // deserialize_ftnode_info figures out what the state // should be and sets up the memory so that we are ready to use it - switch (BP_STATE(node,i)) { - case PT_AVAIL: { + switch (BP_STATE(node, i)) { + case PT_AVAIL: { // case where we read and decompress the partition tokutime_t partition_decompress_time; - r = decompress_and_deserialize_worker(curr_rbuf, curr_sb, node, i, - bfe->ft->cmp, &partition_decompress_time); + r = decompress_and_deserialize_worker( + curr_rbuf, + curr_sb, + node, + i, + bfe->ft->cmp, + &partition_decompress_time); decompress_time += partition_decompress_time; if (r != 0) { + fprintf( + stderr, + "%s:%d:deserialize_ftnode_from_rbuf - " + "file[%s], blocknum[%ld], childnum[%d], " + "decompress_and_deserialize_worker failed with %d\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + blocknum.b, + i, + r); + dump_bad_block(rb->buf, rb->size); goto cleanup; } break; @@ -2148,6 +2487,19 @@ deserialize_ftnode_from_rbuf( // case where we leave the partition in the compressed state r = check_and_copy_compressed_sub_block_worker(curr_rbuf, curr_sb, node, i); if (r != 0) { + fprintf( + stderr, + "%s:%d:deserialize_ftnode_from_rbuf - " + "file[%s], blocknum[%ld], childnum[%d], " + "check_and_copy_compressed_sub_block_worker failed with " + "%d\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + blocknum.b, + i, + r); + dump_bad_block(rb->buf, rb->size); goto cleanup; } break; @@ -2259,8 +2611,10 @@ toku_deserialize_bp_from_disk(FTNODE node, FTNODE_DISK_DATA ndd, int childnum, i } // Take a ftnode partition that is in the compressed state, and make it avail -int -toku_deserialize_bp_from_compressed(FTNODE node, int childnum, ftnode_fetch_extra *bfe) { +int toku_deserialize_bp_from_compressed(FTNODE node, + int childnum, + ftnode_fetch_extra *bfe) { + int r = 0; assert(BP_STATE(node, childnum) == PT_COMPRESSED); SUB_BLOCK curr_sb = BSB(node, childnum); @@ -2275,16 +2629,30 @@ toku_deserialize_bp_from_compressed(FTNODE node, int childnum, ftnode_fetch_extr // decompress the sub_block tokutime_t t0 = toku_time_now(); - toku_decompress( - (Bytef *) curr_sb->uncompressed_ptr, - curr_sb->uncompressed_size, - (Bytef *) curr_sb->compressed_ptr, - curr_sb->compressed_size - ); + toku_decompress((Bytef *)curr_sb->uncompressed_ptr, + curr_sb->uncompressed_size, + (Bytef *)curr_sb->compressed_ptr, + curr_sb->compressed_size); tokutime_t t1 = toku_time_now(); r = deserialize_ftnode_partition(curr_sb, node, childnum, bfe->ft->cmp); + if (r != 0) { + const char* fname = toku_cachefile_fname_in_env(bfe->ft->cf); + fprintf(stderr, + "%s:%d:toku_deserialize_bp_from_compressed - " + "file[%s], blocknum[%ld], " + "deserialize_ftnode_partition failed with %d\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + node->blocknum.b, + r); + dump_bad_block(static_cast(curr_sb->compressed_ptr), + curr_sb->compressed_size); + dump_bad_block(static_cast(curr_sb->uncompressed_ptr), + curr_sb->uncompressed_size); + } tokutime_t t2 = toku_time_now(); @@ -2299,26 +2667,36 @@ toku_deserialize_bp_from_compressed(FTNODE node, int childnum, ftnode_fetch_extr return r; } -static int -deserialize_ftnode_from_fd(int fd, - BLOCKNUM blocknum, - uint32_t fullhash, - FTNODE *ftnode, - FTNODE_DISK_DATA *ndd, - ftnode_fetch_extra *bfe, - STAT64INFO info) -{ +static int deserialize_ftnode_from_fd(int fd, + BLOCKNUM blocknum, + uint32_t fullhash, + FTNODE *ftnode, + FTNODE_DISK_DATA *ndd, + ftnode_fetch_extra *bfe, + STAT64INFO info) { struct rbuf rb = RBUF_INITIALIZER; tokutime_t t0 = toku_time_now(); - read_block_from_fd_into_rbuf(fd, blocknum, bfe->ft, &rb); + read_block_from_fd_into_rbuf(fd, blocknum, bfe->ft, &rb); tokutime_t t1 = toku_time_now(); // Decompress and deserialize the ftnode. Time statistics // are taken inside this function. - int r = deserialize_ftnode_from_rbuf(ftnode, ndd, blocknum, fullhash, bfe, info, &rb, fd); + int r = deserialize_ftnode_from_rbuf( + ftnode, ndd, blocknum, fullhash, bfe, info, &rb, fd); if (r != 0) { - dump_bad_block(rb.buf,rb.size); + const char* fname = toku_cachefile_fname_in_env(bfe->ft->cf); + fprintf( + stderr, + "%s:%d:deserialize_ftnode_from_fd - " + "file[%s], blocknum[%ld], deserialize_ftnode_from_rbuf failed with " + "%d\n", + __FILE__, + __LINE__, + fname ? fname : "unknown", + blocknum.b, + r); + dump_bad_block(rb.buf, rb.size); } bfe->bytes_read = rb.size; @@ -2327,32 +2705,33 @@ deserialize_ftnode_from_fd(int fd, return r; } -// Read ftnode from file into struct. Perform version upgrade if necessary. -int -toku_deserialize_ftnode_from (int fd, - BLOCKNUM blocknum, - uint32_t fullhash, - FTNODE *ftnode, - FTNODE_DISK_DATA* ndd, - ftnode_fetch_extra *bfe - ) // Effect: Read a node in. If possible, read just the header. -{ +// Perform version upgrade if necessary. +int toku_deserialize_ftnode_from(int fd, + BLOCKNUM blocknum, + uint32_t fullhash, + FTNODE *ftnode, + FTNODE_DISK_DATA *ndd, + ftnode_fetch_extra *bfe) { int r = 0; struct rbuf rb = RBUF_INITIALIZER; - // each function below takes the appropriate io/decompression/deserialize statistics + // each function below takes the appropriate io/decompression/deserialize + // statistics if (!bfe->read_all_partitions) { - read_ftnode_header_from_fd_into_rbuf_if_small_enough(fd, blocknum, bfe->ft, &rb, bfe); - r = deserialize_ftnode_header_from_rbuf_if_small_enough(ftnode, ndd, blocknum, fullhash, bfe, &rb, fd); + read_ftnode_header_from_fd_into_rbuf_if_small_enough( + fd, blocknum, bfe->ft, &rb, bfe); + r = deserialize_ftnode_header_from_rbuf_if_small_enough( + ftnode, ndd, blocknum, fullhash, bfe, &rb, fd); } else { // force us to do it the old way r = -1; } if (r != 0) { // Something went wrong, go back to doing it the old way. - r = deserialize_ftnode_from_fd(fd, blocknum, fullhash, ftnode, ndd, bfe, NULL); + r = deserialize_ftnode_from_fd( + fd, blocknum, fullhash, ftnode, ndd, bfe, nullptr); } toku_free(rb.buf); @@ -2699,7 +3078,7 @@ decompress_from_raw_block_into_rbuf(uint8_t *raw_block, size_t raw_block_size, s // decompress all the compressed sub blocks into the uncompressed buffer r = decompress_all_sub_blocks(n_sub_blocks, sub_block, compressed_data, uncompressed_data, num_cores, ft_pool); if (r != 0) { - fprintf(stderr, "%s:%d block %" PRId64 " failed %d at %p size %lu\n", __FUNCTION__, __LINE__, blocknum.b, r, raw_block, raw_block_size); + fprintf(stderr, "%s:%d block %" PRId64 " failed %d at %p size %zu\n", __FUNCTION__, __LINE__, blocknum.b, r, raw_block, raw_block_size); dump_bad_block(raw_block, raw_block_size); goto exit; } @@ -2722,12 +3101,14 @@ static int decompress_from_raw_block_into_rbuf_versioned(uint32_t version, uint8 return r; } -static int -read_and_decompress_block_from_fd_into_rbuf(int fd, BLOCKNUM blocknum, - DISKOFF offset, DISKOFF size, - FT ft, - struct rbuf *rb, - /* out */ int *layout_version_p) { +static int read_and_decompress_block_from_fd_into_rbuf( + int fd, + BLOCKNUM blocknum, + DISKOFF offset, + DISKOFF size, + FT ft, + struct rbuf *rb, + /* out */ int *layout_version_p) { int r = 0; if (0) printf("Deserializing Block %" PRId64 "\n", blocknum.b); diff --git a/storage/tokudb/PerconaFT/ft/serialize/ft_node-serialize.h b/storage/tokudb/PerconaFT/ft/serialize/ft_node-serialize.h index 3ad616053e9..678139655f0 100644 --- a/storage/tokudb/PerconaFT/ft/serialize/ft_node-serialize.h +++ b/storage/tokudb/PerconaFT/ft/serialize/ft_node-serialize.h @@ -46,21 +46,51 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include "ft/serialize/block_table.h" unsigned int toku_serialize_ftnode_size(FTNODE node); -int toku_serialize_ftnode_to_memory(FTNODE node, FTNODE_DISK_DATA *ndd, - unsigned int basementnodesize, - enum toku_compression_method compression_method, - bool do_rebalancing, bool in_parallel, - size_t *n_bytes_to_write, size_t *n_uncompressed_bytes, - char **bytes_to_write); -int toku_serialize_ftnode_to(int fd, BLOCKNUM, FTNODE node, FTNODE_DISK_DATA *ndd, bool do_rebalancing, FT ft, bool for_checkpoint); -int toku_serialize_rollback_log_to(int fd, ROLLBACK_LOG_NODE log, SERIALIZED_ROLLBACK_LOG_NODE serialized_log, bool is_serialized, - FT ft, bool for_checkpoint); -void toku_serialize_rollback_log_to_memory_uncompressed(ROLLBACK_LOG_NODE log, SERIALIZED_ROLLBACK_LOG_NODE serialized); +int toku_serialize_ftnode_to_memory( + FTNODE node, + FTNODE_DISK_DATA *ndd, + unsigned int basementnodesize, + enum toku_compression_method compression_method, + bool do_rebalancing, + bool in_parallel, + size_t *n_bytes_to_write, + size_t *n_uncompressed_bytes, + char **bytes_to_write); +int toku_serialize_ftnode_to(int fd, + BLOCKNUM, + FTNODE node, + FTNODE_DISK_DATA *ndd, + bool do_rebalancing, + FT ft, + bool for_checkpoint); +int toku_serialize_rollback_log_to(int fd, + ROLLBACK_LOG_NODE log, + SERIALIZED_ROLLBACK_LOG_NODE serialized_log, + bool is_serialized, + FT ft, + bool for_checkpoint); +void toku_serialize_rollback_log_to_memory_uncompressed( + ROLLBACK_LOG_NODE log, + SERIALIZED_ROLLBACK_LOG_NODE serialized); -int toku_deserialize_rollback_log_from(int fd, BLOCKNUM blocknum, ROLLBACK_LOG_NODE *logp, FT ft); -int toku_deserialize_bp_from_disk(FTNODE node, FTNODE_DISK_DATA ndd, int childnum, int fd, ftnode_fetch_extra *bfe); -int toku_deserialize_bp_from_compressed(FTNODE node, int childnum, ftnode_fetch_extra *bfe); -int toku_deserialize_ftnode_from(int fd, BLOCKNUM off, uint32_t fullhash, FTNODE *node, FTNODE_DISK_DATA *ndd, ftnode_fetch_extra *bfe); +int toku_deserialize_rollback_log_from(int fd, + BLOCKNUM blocknum, + ROLLBACK_LOG_NODE *logp, + FT ft); +int toku_deserialize_bp_from_disk(FTNODE node, + FTNODE_DISK_DATA ndd, + int childnum, + int fd, + ftnode_fetch_extra *bfe); +int toku_deserialize_bp_from_compressed(FTNODE node, + int childnum, + ftnode_fetch_extra *bfe); +int toku_deserialize_ftnode_from(int fd, + BLOCKNUM off, + uint32_t fullhash, + FTNODE *node, + FTNODE_DISK_DATA *ndd, + ftnode_fetch_extra *bfe); void toku_serialize_set_parallel(bool); @@ -73,9 +103,14 @@ int decompress_from_raw_block_into_rbuf(uint8_t *raw_block, size_t raw_block_siz // used by verify int deserialize_ft_versioned(int fd, struct rbuf *rb, FT *ft, uint32_t version); -void read_block_from_fd_into_rbuf(int fd, BLOCKNUM blocknum, FT ft, struct rbuf *rb); +void read_block_from_fd_into_rbuf(int fd, + BLOCKNUM blocknum, + FT ft, + struct rbuf *rb); int read_compressed_sub_block(struct rbuf *rb, struct sub_block *sb); -int verify_ftnode_sub_block(struct sub_block *sb); +int verify_ftnode_sub_block(struct sub_block *sb, + const char *fname, + BLOCKNUM blocknum); void just_decompress_sub_block(struct sub_block *sb); // used by ft-node-deserialize.cc diff --git a/storage/tokudb/PerconaFT/ft/txn/roll.cc b/storage/tokudb/PerconaFT/ft/txn/roll.cc index 4f374d62173..97afd2f5bdb 100644 --- a/storage/tokudb/PerconaFT/ft/txn/roll.cc +++ b/storage/tokudb/PerconaFT/ft/txn/roll.cc @@ -203,7 +203,7 @@ int toku_rollback_frename(BYTESTRING old_iname, } if (toku_stat(new_iname_full.get(), &stat) == -1) { - if (ENOENT == errno) + if (ENOENT == errno || ENAMETOOLONG == errno) new_exist = false; else return 1; diff --git a/storage/tokudb/PerconaFT/ft/txn/txn.cc b/storage/tokudb/PerconaFT/ft/txn/txn.cc index 9e48d0d05dd..a3ce6beb7b0 100644 --- a/storage/tokudb/PerconaFT/ft/txn/txn.cc +++ b/storage/tokudb/PerconaFT/ft/txn/txn.cc @@ -707,8 +707,8 @@ bool toku_txn_has_spilled_rollback(TOKUTXN txn) { } void toku_txn_get_client_id(TOKUTXN txn, uint64_t *client_id, void **client_extra) { - *client_id = txn->client_id; - *client_extra = txn->client_extra; + if (client_id) *client_id = txn->client_id; + if (client_extra) *client_extra = txn->client_extra; } void toku_txn_set_client_id(TOKUTXN txn, uint64_t client_id, void *client_extra) { diff --git a/storage/tokudb/PerconaFT/ft/txn/txn_manager.cc b/storage/tokudb/PerconaFT/ft/txn/txn_manager.cc index 88eca36a261..8fe52b10597 100644 --- a/storage/tokudb/PerconaFT/ft/txn/txn_manager.cc +++ b/storage/tokudb/PerconaFT/ft/txn/txn_manager.cc @@ -970,11 +970,11 @@ int toku_txn_manager_recover_root_txn ( txn_manager->last_xid_seen_for_recover = curr_txn->txnid.parent_id64; // if we found the maximum number of prepared transactions we are // allowed to find, then break - if (num_txns_returned >= count) { + if ((long) num_txns_returned >= count) { break; } } - invariant(num_txns_returned <= count); + invariant((long) num_txns_returned <= count); *retp = num_txns_returned; ret_val = 0; exit: diff --git a/storage/tokudb/PerconaFT/locktree/lock_request.cc b/storage/tokudb/PerconaFT/locktree/lock_request.cc index 943362e1b9d..0151b5bd466 100644 --- a/storage/tokudb/PerconaFT/locktree/lock_request.cc +++ b/storage/tokudb/PerconaFT/locktree/lock_request.cc @@ -175,7 +175,8 @@ int lock_request::start(void) { m_state = state::PENDING; m_start_time = toku_current_time_microsec() / 1000; m_conflicting_txnid = conflicts.get(0); - if (m_start_before_pending_test_callback) m_start_before_pending_test_callback(); + if (m_start_before_pending_test_callback) + m_start_before_pending_test_callback(); toku_mutex_lock(&m_info->mutex); insert_into_lock_requests(); if (deadlock_exists(conflicts)) { @@ -183,7 +184,8 @@ int lock_request::start(void) { r = DB_LOCK_DEADLOCK; } toku_mutex_unlock(&m_info->mutex); - if (m_start_test_callback) m_start_test_callback(); // test callback + if (m_start_test_callback) + m_start_test_callback(); // test callback } if (r != DB_LOCK_NOTGRANTED) { @@ -242,13 +244,13 @@ int lock_request::wait(uint64_t wait_time_ms, uint64_t killed_time_ms, int (*kil invariant(r == 0 || r == ETIMEDOUT); t_now = toku_current_time_microsec(); - if (m_state == state::PENDING && t_now >= t_end) { + if (m_state == state::PENDING && (t_now >= t_end)) { m_info->counters.timeout_count += 1; - + // if we're still pending and we timed out, then remove our // request from the set of lock requests and fail. remove_from_lock_requests(); - + // complete sets m_state to COMPLETE, breaking us out of the loop complete(DB_LOCK_NOTGRANTED); } @@ -297,13 +299,15 @@ TXNID lock_request::get_conflicting_txnid(void) const { int lock_request::retry(GrowableArray *conflicts_collector) { invariant(m_state == state::PENDING); int r; - txnid_set conflicts; conflicts.create(); + if (m_type == type::WRITE) { - r = m_lt->acquire_write_lock(m_txnid, m_left_key, m_right_key, &conflicts, m_big_txn); + r = m_lt->acquire_write_lock( + m_txnid, m_left_key, m_right_key, &conflicts, m_big_txn); } else { - r = m_lt->acquire_read_lock(m_txnid, m_left_key, m_right_key, &conflicts, m_big_txn); + r = m_lt->acquire_read_lock( + m_txnid, m_left_key, m_right_key, &conflicts, m_big_txn); } // if the acquisition succeeded then remove ourselves from the @@ -311,7 +315,8 @@ int lock_request::retry(GrowableArray *conflicts_collector) { if (r == 0) { remove_from_lock_requests(); complete(r); - if (m_retry_test_callback) m_retry_test_callback(); // test callback + if (m_retry_test_callback) + m_retry_test_callback(); // test callback toku_cond_broadcast(&m_wait_cond); } else { m_conflicting_txnid = conflicts.get(0); @@ -322,54 +327,78 @@ int lock_request::retry(GrowableArray *conflicts_collector) { return r; } -void lock_request::retry_all_lock_requests(locktree *lt, void (*lock_wait_callback)(void *, TXNID, TXNID), void (*after_retry_all_test_callback)(void)) { +void lock_request::retry_all_lock_requests( + locktree *lt, + void (*lock_wait_callback)(void *, TXNID, TXNID), + void (*after_retry_all_test_callback)(void)) { lt_lock_request_info *info = lt->get_lock_request_info(); - info->retry_want++; - // if there are no pending lock requests than there is nothing to do // the unlocked data race on pending_is_empty is OK since lock requests // are retried after added to the pending set. if (info->pending_is_empty) return; - toku_mutex_lock(&info->mutex); + // get my retry generation (post increment of retry_want) + unsigned long long my_retry_want = (info->retry_want += 1); + + toku_mutex_lock(&info->retry_mutex); GrowableArray conflicts_collector; conflicts_collector.init(); // here is the group retry algorithm. - // get the latest retry_want count and use it as the generation number of this retry operation. - // if this retry generation is > the last retry generation, then do the lock retries. otherwise, - // no lock retries are needed. - unsigned long long retry_gen = info->retry_want.load(); - if (retry_gen > info->retry_done) { - - // retry all of the pending lock requests. - for (size_t i = 0; i < info->pending_lock_requests.size(); ) { - lock_request *request; - int r = info->pending_lock_requests.fetch(i, &request); - invariant_zero(r); - - // retry this lock request. if it didn't succeed, - // move on to the next lock request. otherwise - // the request is gone from the list so we may - // read the i'th entry for the next one. - r = request->retry(&conflicts_collector); - if (r != 0) { - i++; + // get the latest retry_want count and use it as the generation number of + // this retry operation. if this retry generation is > the last retry + // generation, then do the lock retries. otherwise, no lock retries + // are needed. + if ((my_retry_want - 1) == info->retry_done) { + for (;;) { + if (!info->running_retry) { + info->running_retry = true; + info->retry_done = info->retry_want; + toku_mutex_unlock(&info->retry_mutex); + retry_all_lock_requests_info(info, &conflicts_collector); + if (after_retry_all_test_callback) + after_retry_all_test_callback(); + toku_mutex_lock(&info->retry_mutex); + info->running_retry = false; + toku_cond_broadcast(&info->retry_cv); + break; + } else { + toku_cond_wait(&info->retry_cv, &info->retry_mutex); } } - if (after_retry_all_test_callback) after_retry_all_test_callback(); - info->retry_done = retry_gen; } - - toku_mutex_unlock(&info->mutex); + toku_mutex_unlock(&info->retry_mutex); report_waits(&conflicts_collector, lock_wait_callback); conflicts_collector.deinit(); } +void lock_request::retry_all_lock_requests_info(lt_lock_request_info *info, GrowableArray *collector) { + toku_mutex_lock(&info->mutex); + // retry all of the pending lock requests. + for (size_t i = 0; i < info->pending_lock_requests.size();) { + lock_request *request; + int r = info->pending_lock_requests.fetch(i, &request); + invariant_zero(r); + + // retry the lock request. if it didn't succeed, + // move on to the next lock request. otherwise + // the request is gone from the list so we may + // read the i'th entry for the next one. + r = request->retry(collector); + if (r != 0) { + i++; + } + } + + // future threads should only retry lock requests if some still exist + info->should_retry_lock_requests = info->pending_lock_requests.size() > 0; + toku_mutex_unlock(&info->mutex); +} + void lock_request::add_conflicts_to_waits(txnid_set *conflicts, GrowableArray *wait_conflicts) { size_t num_conflicts = conflicts->size(); @@ -429,7 +458,8 @@ lock_request *lock_request::find_lock_request(const TXNID &txnid) { void lock_request::insert_into_lock_requests(void) { uint32_t idx; lock_request *request; - int r = m_info->pending_lock_requests.find_zero(m_txnid, &request, &idx); + int r = m_info->pending_lock_requests.find_zero( + m_txnid, &request, &idx); invariant(r == DB_NOTFOUND); r = m_info->pending_lock_requests.insert_at(this, idx); invariant_zero(r); @@ -440,7 +470,8 @@ void lock_request::insert_into_lock_requests(void) { void lock_request::remove_from_lock_requests(void) { uint32_t idx; lock_request *request; - int r = m_info->pending_lock_requests.find_zero(m_txnid, &request, &idx); + int r = m_info->pending_lock_requests.find_zero( + m_txnid, &request, &idx); invariant_zero(r); invariant(request == this); r = m_info->pending_lock_requests.delete_at(idx); @@ -449,7 +480,8 @@ void lock_request::remove_from_lock_requests(void) { m_info->pending_is_empty = true; } -int lock_request::find_by_txnid(lock_request * const &request, const TXNID &txnid) { +int lock_request::find_by_txnid(lock_request *const &request, + const TXNID &txnid) { TXNID request_txnid = request->m_txnid; if (request_txnid < txnid) { return -1; diff --git a/storage/tokudb/PerconaFT/locktree/lock_request.h b/storage/tokudb/PerconaFT/locktree/lock_request.h index 1fa94ef5b96..9e82b31541e 100644 --- a/storage/tokudb/PerconaFT/locktree/lock_request.h +++ b/storage/tokudb/PerconaFT/locktree/lock_request.h @@ -108,9 +108,14 @@ public: TXNID get_conflicting_txnid(void) const; // effect: Retries all of the lock requests for the given locktree. - // Any lock requests successfully restarted is completed and woken up. + // Any lock requests successfully restarted is completed and woken + // up. // The rest remain pending. - static void retry_all_lock_requests(locktree *lt, void (*lock_wait_callback)(void *, TXNID, TXNID) = nullptr, void (*after_retry_test_callback)(void) = nullptr); + static void retry_all_lock_requests( + locktree *lt, + void (*lock_wait_callback)(void *, TXNID, TXNID) = nullptr, + void (*after_retry_test_callback)(void) = nullptr); + static void retry_all_lock_requests_info(lt_lock_request_info *info, GrowableArray *collector); void set_start_test_callback(void (*f)(void)); void set_start_before_pending_test_callback(void (*f)(void)); @@ -121,7 +126,7 @@ public: void kill_waiter(void); static void kill_waiter(locktree *lt, void *extra); -private: + private: enum state { UNINITIALIZED, INITIALIZED, @@ -193,7 +198,7 @@ private: void copy_keys(void); - static int find_by_txnid(lock_request * const &request, const TXNID &txnid); + static int find_by_txnid(lock_request *const &request, const TXNID &txnid); // Report list of conflicts to lock wait callback. static void report_waits(GrowableArray *wait_conflicts, diff --git a/storage/tokudb/PerconaFT/locktree/locktree.cc b/storage/tokudb/PerconaFT/locktree/locktree.cc index 11f8a4e5ff7..2fbf078bdd6 100644 --- a/storage/tokudb/PerconaFT/locktree/locktree.cc +++ b/storage/tokudb/PerconaFT/locktree/locktree.cc @@ -80,15 +80,24 @@ void locktree::create(locktree_manager *mgr, DICTIONARY_ID dict_id, const compar m_sto_end_early_count = 0; m_sto_end_early_time = 0; - m_lock_request_info.pending_lock_requests.create(); - m_lock_request_info.pending_is_empty = true; - ZERO_STRUCT(m_lock_request_info.mutex); - toku_mutex_init(&m_lock_request_info.mutex, nullptr); - m_lock_request_info.retry_want = m_lock_request_info.retry_done = 0; - ZERO_STRUCT(m_lock_request_info.counters); + m_lock_request_info.init(); +} - TOKU_VALGRIND_HG_DISABLE_CHECKING(&m_lock_request_info.pending_is_empty, sizeof(m_lock_request_info.pending_is_empty)); - TOKU_DRD_IGNORE_VAR(m_lock_request_info.pending_is_empty); +void lt_lock_request_info::init(void) { + pending_lock_requests.create(); + pending_is_empty = true; + ZERO_STRUCT(mutex); + toku_mutex_init(&mutex, nullptr); + retry_want = retry_done = 0; + ZERO_STRUCT(counters); + ZERO_STRUCT(retry_mutex); + toku_mutex_init(&retry_mutex, nullptr); + toku_cond_init(&retry_cv, nullptr); + running_retry = false; + + TOKU_VALGRIND_HG_DISABLE_CHECKING(&pending_is_empty, + sizeof(pending_is_empty)); + TOKU_DRD_IGNORE_VAR(pending_is_empty); } void locktree::destroy(void) { @@ -98,11 +107,18 @@ void locktree::destroy(void) { m_rangetree->destroy(); toku_free(m_rangetree); m_sto_buffer.destroy(); - m_lock_request_info.pending_lock_requests.destroy(); + m_lock_request_info.destroy(); +} + +void lt_lock_request_info::destroy(void) { + pending_lock_requests.destroy(); + toku_mutex_destroy(&mutex); + toku_mutex_destroy(&retry_mutex); + toku_cond_destroy(&retry_cv); } void locktree::add_reference(void) { - (void) toku_sync_add_and_fetch(&m_reference_count, 1); + (void)toku_sync_add_and_fetch(&m_reference_count, 1); } uint32_t locktree::release_reference(void) { diff --git a/storage/tokudb/PerconaFT/locktree/locktree.h b/storage/tokudb/PerconaFT/locktree/locktree.h index 64171c51b23..1ba7a51b124 100644 --- a/storage/tokudb/PerconaFT/locktree/locktree.h +++ b/storage/tokudb/PerconaFT/locktree/locktree.h @@ -41,11 +41,11 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include #include -#include #include +#include -#include // just for DICTIONARY_ID.. #include +#include // just for DICTIONARY_ID.. #include @@ -84,20 +84,31 @@ namespace toku { omt pending_lock_requests; std::atomic_bool pending_is_empty; toku_mutex_t mutex; + bool should_retry_lock_requests; lt_counters counters; std::atomic_ullong retry_want; unsigned long long retry_done; + toku_mutex_t retry_mutex; + toku_cond_t retry_cv; + bool running_retry; + + void init(void); + void destroy(void); }; - // The locktree manager manages a set of locktrees, one for each open dictionary. - // Locktrees are retrieved from the manager. When they are no longer needed, they - // are be released by the user. + // The locktree manager manages a set of locktrees, one for each open + // dictionary. Locktrees are retrieved from the manager. When they are no + // longer needed, they are be released by the user. class locktree_manager { - public: + public: // param: create_cb, called just after a locktree is first created. // destroy_cb, called just before a locktree is destroyed. - // escalate_cb, called after a locktree is escalated (with extra param) - void create(lt_create_cb create_cb, lt_destroy_cb destroy_cb, lt_escalate_cb escalate_cb, void *extra); + // escalate_cb, called after a locktree is escalated (with extra + // param) + void create(lt_create_cb create_cb, + lt_destroy_cb destroy_cb, + lt_escalate_cb escalate_cb, + void *extra); void destroy(void); diff --git a/storage/tokudb/PerconaFT/locktree/tests/lock_request_start_release_wait.cc b/storage/tokudb/PerconaFT/locktree/tests/lock_request_start_release_wait.cc index eb19ceb70e5..717628f9df7 100644 --- a/storage/tokudb/PerconaFT/locktree/tests/lock_request_start_release_wait.cc +++ b/storage/tokudb/PerconaFT/locktree/tests/lock_request_start_release_wait.cc @@ -1,84 +1,87 @@ /* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- */ // vim: ft=cpp:expandtab:ts=8:sw=4:softtabstop=4: -// test the race between start, release, and wait. since start does not put its -// lock request into the pending set, the blocking txn could release its lock before -// the first txn waits. this will block the first txn because its lock request is -// not known when the lock is released. the bug fix is to try again when lock retries -// are locked out. +// test the race between start, release, and wait. since start does not put +// its lock request into the pending set, the blocking txn could release its +// lock before the first txn waits. this will block the first txn because its +// lock request is not known when the lock is released. the bug fix is to try +// again when lock retries are locked out. -#include "locktree.h" #include "lock_request.h" -#include "test.h" -#include "locktree_unit_test.h" -#include #include +#include +#include "locktree.h" +#include "locktree_unit_test.h" +#include "test.h" namespace toku { -const uint64_t my_lock_wait_time = 1000 * 1000; // ms -const uint64_t my_killed_time = 1 * 1000; // ms + const uint64_t my_lock_wait_time = 1000 * 1000; // ms + const uint64_t my_killed_time = 1 * 1000; // ms -static uint64_t t_wait; + static uint64_t t_wait; -static int my_killed_callback(void) { - uint64_t t_now = toku_current_time_microsec(); - assert(t_now >= t_wait); - if (t_now - t_wait >= my_killed_time*1000) - abort(); - return 0; -} + static int my_killed_callback(void) { + uint64_t t_now = toku_current_time_microsec(); + assert(t_now >= t_wait); + if (t_now - t_wait >= my_killed_time * 1000) + abort(); + return 0; + } -static void locktree_release_lock(locktree *lt, TXNID txn_id, const DBT *left, const DBT *right) { - range_buffer buffer; - buffer.create(); - buffer.append(left, right); - lt->release_locks(txn_id, &buffer); - buffer.destroy(); -} + static void locktree_release_lock(locktree *lt, + TXNID txn_id, + const DBT *left, + const DBT *right) { + range_buffer buffer; + buffer.create(); + buffer.append(left, right); + lt->release_locks(txn_id, &buffer); + buffer.destroy(); + } -static void test_start_release_wait(void) { - int r; + static void test_start_release_wait(void) { + int r; - locktree_manager mgr; - mgr.create(nullptr, nullptr, nullptr, nullptr); + locktree_manager mgr; + mgr.create(nullptr, nullptr, nullptr, nullptr); - DICTIONARY_ID dict_id = { 1 }; - locktree *lt = mgr.get_lt(dict_id, dbt_comparator, nullptr); + DICTIONARY_ID dict_id = {1}; + locktree *lt = mgr.get_lt(dict_id, dbt_comparator, nullptr); - const DBT *one = get_dbt(1); + const DBT *one = get_dbt(1); - // a locks one - lock_request a; - a.create(); - a.set(lt, 1, one, one, lock_request::type::WRITE, false); - r = a.start(); - assert(r == 0); + // a locks one + lock_request a; + a.create(); + a.set(lt, 1, one, one, lock_request::type::WRITE, false); + r = a.start(); + assert(r == 0); - // b tries to lock one, fails - lock_request b; - b.create(); - b.set(lt, 2, one, one, lock_request::type::WRITE, false); - r = b.start(); - assert(r == DB_LOCK_NOTGRANTED); + // b tries to lock one, fails + lock_request b; + b.create(); + b.set(lt, 2, one, one, lock_request::type::WRITE, false); + r = b.start(); + assert(r == DB_LOCK_NOTGRANTED); - // a releases its lock - locktree_release_lock(lt, 1, one, one); + // a releases its lock + locktree_release_lock(lt, 1, one, one); - // b waits for one, gets locks immediately - t_wait = toku_current_time_microsec(); - r = b.wait(my_lock_wait_time, my_killed_time, my_killed_callback); - assert(r == 0); + // b waits for one, gets locks immediately + t_wait = toku_current_time_microsec(); + r = b.wait(my_lock_wait_time, my_killed_time, my_killed_callback); + assert(r == 0); - // b releases its lock so we can exit cleanly - locktree_release_lock(lt, 2, one, one); + // b releases its lock so we can exit cleanly + locktree_release_lock(lt, 2, one, one); - a.destroy(); - b.destroy(); + a.destroy(); + b.destroy(); - mgr.release_lt(lt); - mgr.destroy(); -} + mgr.release_lt(lt); + mgr.destroy(); + } } /* namespace toku */ @@ -86,4 +89,3 @@ int main(void) { toku::test_start_release_wait(); return 0; } - diff --git a/storage/tokudb/PerconaFT/locktree/tests/lock_request_start_retry_race.cc b/storage/tokudb/PerconaFT/locktree/tests/lock_request_start_retry_race.cc index 88493ec9ce0..5c28701c49e 100644 --- a/storage/tokudb/PerconaFT/locktree/tests/lock_request_start_retry_race.cc +++ b/storage/tokudb/PerconaFT/locktree/tests/lock_request_start_retry_race.cc @@ -34,13 +34,14 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. along with PerconaFT. If not, see . ======= */ -#ident "Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved." +#ident \ + "Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved." +#include "lock_request.h" #include #include -#include "test.h" #include "locktree.h" -#include "lock_request.h" +#include "test.h" // Test FT-633, the data race on the lock request between ::start and ::retry // This test is non-deterministic. It uses sleeps at 2 critical places to @@ -48,57 +49,54 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. namespace toku { -static void locker_callback(void) { - usleep(10000); -} + static void locker_callback(void) { usleep(10000); } -static void run_locker(locktree *lt, TXNID txnid, const DBT *key) { - int i; - for (i = 0; i < 1000; i++) { + static void run_locker(locktree *lt, TXNID txnid, const DBT *key) { + int i; + for (i = 0; i < 1000; i++) { + lock_request request; + request.create(); - lock_request request; - request.create(); + request.set(lt, txnid, key, key, lock_request::type::WRITE, false); - request.set(lt, txnid, key, key, lock_request::type::WRITE, false); + // set the test callbacks + request.set_start_test_callback(locker_callback); + request.set_retry_test_callback(locker_callback); - // set the test callbacks - request.set_start_test_callback(locker_callback); - request.set_retry_test_callback(locker_callback); + // try to acquire the lock + int r = request.start(); + if (r == DB_LOCK_NOTGRANTED) { + // wait for the lock to be granted + r = request.wait(10 * 1000); + } - // try to acquire the lock - int r = request.start(); - if (r == DB_LOCK_NOTGRANTED) { - // wait for the lock to be granted - r = request.wait(10 * 1000); + if (r == 0) { + // release the lock + range_buffer buffer; + buffer.create(); + buffer.append(key, key); + lt->release_locks(txnid, &buffer); + buffer.destroy(); + + // retry pending lock requests + lock_request::retry_all_lock_requests(lt); + } + + request.destroy(); + memset(&request, 0xab, sizeof request); + + toku_pthread_yield(); + if ((i % 10) == 0) + std::cerr << std::this_thread::get_id() << " " << i + << std::endl; } - - if (r == 0) { - // release the lock - range_buffer buffer; - buffer.create(); - buffer.append(key, key); - lt->release_locks(txnid, &buffer); - buffer.destroy(); - - // retry pending lock requests - lock_request::retry_all_lock_requests(lt); - } - - request.destroy(); - memset(&request, 0xab, sizeof request); - - toku_pthread_yield(); - if ((i % 10) == 0) - std::cout << std::this_thread::get_id() << " " << i << std::endl; } -} } /* namespace toku */ int main(void) { - toku::locktree lt; - DICTIONARY_ID dict_id = { 1 }; + DICTIONARY_ID dict_id = {1}; lt.create(nullptr, dict_id, toku::dbt_comparator); const DBT *one = toku::get_dbt(1); diff --git a/storage/tokudb/PerconaFT/locktree/tests/lock_request_start_retry_race_3.cc b/storage/tokudb/PerconaFT/locktree/tests/lock_request_start_retry_race_3.cc index 8f0d86c9f64..8458bae6b8c 100644 --- a/storage/tokudb/PerconaFT/locktree/tests/lock_request_start_retry_race_3.cc +++ b/storage/tokudb/PerconaFT/locktree/tests/lock_request_start_retry_race_3.cc @@ -34,77 +34,82 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. along with PerconaFT. If not, see . ======= */ -#ident "Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved." +#ident \ + "Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved." +#include "lock_request.h" +#include #include #include -#include -#include "test.h" #include "locktree.h" -#include "lock_request.h" +#include "test.h" -// Suppose that 3 threads are running a lock acquire, release, retry sequence. There is -// a race in the retry algorithm with 2 threads running lock retry simultaneously. The -// first thread to run retry sets a flag that will cause the second thread to skip the -// lock retries. If the first thread progressed past the contended lock, then the second -// threa will HANG until its lock timer pops, even when the contended lock is no longer held. +// Suppose that 3 threads are running a lock acquire, release, retry sequence. +// There is a race in the retry algorithm with 2 threads running lock retry +// simultaneously. The first thread to run retry sets a flag that will cause +// the second thread to skip the lock retries. If the first thread progressed +// past the contended lock, then the second threa will HANG until its lock timer +// pops, even when the contended lock is no longer held. -// This test exposes this problem as a test hang. The group retry algorithm fixes the race -// in the lock request retry algorihm and this test should no longer hang. +// This test exposes this problem as a test hang. The group retry algorithm +// fixes the race in the lock request retry algorihm and this test should no +// longer hang. namespace toku { -// use 1000 when after_retry_all is implemented, otherwise use 100000 -static const int n_tests = 1000; // 100000; + // use 1000 when after_retry_all is implemented, otherwise use 100000 + static const int n_tests = 1000; // 100000; -static void after_retry_all(void) { - usleep(10000); -} + static void after_retry_all(void) { usleep(10000); } -static void run_locker(locktree *lt, TXNID txnid, const DBT *key, pthread_barrier_t *b) { - for (int i = 0; i < n_tests; i++) { - int r; - r = pthread_barrier_wait(b); assert(r == 0 || r == PTHREAD_BARRIER_SERIAL_THREAD); + static void run_locker(locktree *lt, + TXNID txnid, + const DBT *key, + pthread_barrier_t *b) { + for (int i = 0; i < n_tests; i++) { + int r; + r = pthread_barrier_wait(b); + assert(r == 0 || r == PTHREAD_BARRIER_SERIAL_THREAD); - lock_request request; - request.create(); + lock_request request; + request.create(); - request.set(lt, txnid, key, key, lock_request::type::WRITE, false); + request.set(lt, txnid, key, key, lock_request::type::WRITE, false); - // try to acquire the lock - r = request.start(); - if (r == DB_LOCK_NOTGRANTED) { - // wait for the lock to be granted - r = request.wait(1000 * 1000); + // try to acquire the lock + r = request.start(); + if (r == DB_LOCK_NOTGRANTED) { + // wait for the lock to be granted + r = request.wait(1000 * 1000); + } + + if (r == 0) { + // release the lock + range_buffer buffer; + buffer.create(); + buffer.append(key, key); + lt->release_locks(txnid, &buffer); + buffer.destroy(); + + // retry pending lock requests + lock_request::retry_all_lock_requests(lt, nullptr, after_retry_all); + } + + request.destroy(); + memset(&request, 0xab, sizeof request); + + toku_pthread_yield(); + if ((i % 10) == 0) + std::cerr << std::this_thread::get_id() << " " << i + << std::endl; } - - if (r == 0) { - // release the lock - range_buffer buffer; - buffer.create(); - buffer.append(key, key); - lt->release_locks(txnid, &buffer); - buffer.destroy(); - - // retry pending lock requests - lock_request::retry_all_lock_requests(lt, nullptr, after_retry_all); - } - - request.destroy(); - memset(&request, 0xab, sizeof request); - - toku_pthread_yield(); - if ((i % 10) == 0) - std::cout << std::this_thread::get_id() << " " << i << std::endl; } -} } /* namespace toku */ int main(void) { - toku::locktree lt; - DICTIONARY_ID dict_id = { 1 }; + DICTIONARY_ID dict_id = {1}; lt.create(nullptr, dict_id, toku::dbt_comparator); const DBT *one = toku::get_dbt(1); @@ -112,16 +117,17 @@ int main(void) { const int n_workers = 3; std::thread worker[n_workers]; pthread_barrier_t b; - int r = pthread_barrier_init(&b, nullptr, n_workers); assert(r == 0); + int r = pthread_barrier_init(&b, nullptr, n_workers); + assert(r == 0); for (int i = 0; i < n_workers; i++) { worker[i] = std::thread(toku::run_locker, <, i, one, &b); } for (int i = 0; i < n_workers; i++) { worker[i].join(); } - r = pthread_barrier_destroy(&b); assert(r == 0); + r = pthread_barrier_destroy(&b); + assert(r == 0); lt.release_reference(); lt.destroy(); return 0; } - diff --git a/storage/tokudb/PerconaFT/locktree/tests/lock_request_start_retry_wait_race_2.cc b/storage/tokudb/PerconaFT/locktree/tests/lock_request_start_retry_wait_race_2.cc index a2ceff99edb..4b6dadd440f 100644 --- a/storage/tokudb/PerconaFT/locktree/tests/lock_request_start_retry_wait_race_2.cc +++ b/storage/tokudb/PerconaFT/locktree/tests/lock_request_start_retry_wait_race_2.cc @@ -34,78 +34,84 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. along with PerconaFT. If not, see . ======= */ -#ident "Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved." +#ident \ + "Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved." +#include "lock_request.h" +#include #include #include -#include -#include "test.h" #include "locktree.h" -#include "lock_request.h" +#include "test.h" -// Suppose that 2 threads are running a lock acquire, release, retry sequence. There is a -// race between the acquire and the release with 2 threads. If thread 1 acquires a lock, -// and thread 2 tries to acquire the same lock and fails, thread 1 may release its lock and retry -// pending lock requests BEFORE thread 2 adds itself to the pending lock requests. If this -// happens, then thread 2 will HANG until its lock timer expires even when the lock it is +// Suppose that 2 threads are running a lock acquire, release, retry sequence. +// There is a race between the acquire and the release with 2 threads. +// If thread 1 acquires a lock, and thread 2 tries to acquire the same lock and +// fails, thread 1 may release its lock and retry pending lock requests BEFORE +// thread 2 adds itself to the pending lock requests. If this happens, then +// thread 2 will HANG until its lock timer expires even when the lock it is // waiting for is FREE. -// This test exposes this problem as a test hang. If the race is fixed, then the test runs to -// completion. +// This test exposes this problem as a test hang. If the race is fixed, then +// the test runs to completion. namespace toku { -static void start_before_pending(void) { - usleep(10000); -} + static void start_before_pending(void) { usleep(10000); } -static void run_locker(locktree *lt, TXNID txnid, const DBT *key, pthread_barrier_t *b) { - for (int i = 0; i < 100000; i++) { - int r; - r = pthread_barrier_wait(b); assert(r == 0 || r == PTHREAD_BARRIER_SERIAL_THREAD); + static void run_locker(locktree *lt, + TXNID txnid, + const DBT *key, + pthread_barrier_t *b) { + for (int i = 0; i < 100000; i++) { + int r; + r = pthread_barrier_wait(b); + assert(r == 0 || r == PTHREAD_BARRIER_SERIAL_THREAD); - lock_request request; - request.create(); - request.set(lt, txnid, key, key, lock_request::type::WRITE, false); + lock_request request; + request.create(); + request.set(lt, txnid, key, key, lock_request::type::WRITE, false); - // if the callback is included, then the race is easy to reproduce. Otherwise, several - // test runs may be required before the race happens. - if (1) request.set_start_before_pending_test_callback(start_before_pending); + // if the callback is included, then the race is easy to reproduce. + // Otherwise, several test runs may be required before the race + // happens. + request.set_start_before_pending_test_callback( + start_before_pending); - // try to acquire the lock - r = request.start(); - if (r == DB_LOCK_NOTGRANTED) { - // wait for the lock to be granted - r = request.wait(1000 * 1000); + // try to acquire the lock + r = request.start(); + if (r == DB_LOCK_NOTGRANTED) { + // wait for the lock to be granted + r = request.wait(1000 * 1000); + } + + if (r == 0) { + // release the lock + range_buffer buffer; + buffer.create(); + buffer.append(key, key); + lt->release_locks(txnid, &buffer); + buffer.destroy(); + + // retry pending lock requests + lock_request::retry_all_lock_requests(lt); + } + + request.destroy(); + memset(&request, 0xab, sizeof request); + + toku_pthread_yield(); + if ((i % 10) == 0) + std::cerr << std::this_thread::get_id() << " " << i + << std::endl; } - - if (r == 0) { - // release the lock - range_buffer buffer; - buffer.create(); - buffer.append(key, key); - lt->release_locks(txnid, &buffer); - buffer.destroy(); - - // retry pending lock requests - lock_request::retry_all_lock_requests(lt); - } - - request.destroy(); - memset(&request, 0xab, sizeof request); - - toku_pthread_yield(); - if ((i % 10) == 0) - std::cout << std::this_thread::get_id() << " " << i << std::endl; } -} } /* namespace toku */ int main(void) { - toku::locktree lt; - DICTIONARY_ID dict_id = { 1 }; + DICTIONARY_ID dict_id = {1}; lt.create(nullptr, dict_id, toku::dbt_comparator); const DBT *one = toku::get_dbt(1); @@ -113,16 +119,17 @@ int main(void) { const int n_workers = 2; std::thread worker[n_workers]; pthread_barrier_t b; - int r = pthread_barrier_init(&b, nullptr, n_workers); assert(r == 0); + int r = pthread_barrier_init(&b, nullptr, n_workers); + assert(r == 0); for (int i = 0; i < n_workers; i++) { worker[i] = std::thread(toku::run_locker, <, i, one, &b); } for (int i = 0; i < n_workers; i++) { worker[i].join(); } - r = pthread_barrier_destroy(&b); assert(r == 0); + r = pthread_barrier_destroy(&b); + assert(r == 0); lt.release_reference(); lt.destroy(); return 0; } - diff --git a/storage/tokudb/PerconaFT/portability/toku_debug_sync.h b/storage/tokudb/PerconaFT/portability/toku_debug_sync.h new file mode 100644 index 00000000000..b5394e58d68 --- /dev/null +++ b/storage/tokudb/PerconaFT/portability/toku_debug_sync.h @@ -0,0 +1,77 @@ +/* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- */ +// vim: ft=cpp:expandtab:ts=8:sw=4:softtabstop=4: +#ident "$Id$" +/*====== +This file is part of PerconaFT. + + +Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. + + PerconaFT is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License, version 2, + as published by the Free Software Foundation. + + PerconaFT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with PerconaFT. If not, see . + +---------------------------------------- + + PerconaFT is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License, version 3, + as published by the Free Software Foundation. + + PerconaFT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with PerconaFT. If not, see . +======= */ + +#ident "Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved." + +#pragma once + +struct tokutxn; + +#if defined(ENABLED_DEBUG_SYNC) + +/* + the below macros are defined in my_global.h, which is included in m_string.h, + the same macros are defined in TokuSetupCompiler.cmake as compiler options, + undefine them here to avoid build errors +*/ +#undef __STDC_FORMAT_MACROS +#undef __STDC_LIMIT_MACROS + +#include "m_string.h" +#include "debug_sync.h" + +void toku_txn_get_client_id(struct tokutxn *txn, + uint64_t *client_id, + void **client_extra); + +inline void toku_debug_sync(struct tokutxn *txn, const char *sync_point_name) { + uint64_t client_id; + void *client_extra; + THD *thd; + + if (likely(!opt_debug_sync_timeout)) + return; + + toku_txn_get_client_id(txn, &client_id, &client_extra); + thd = reinterpret_cast(client_extra); + DEBUG_SYNC(thd, sync_point_name); +} + +#else // defined(ENABLED_DEBUG_SYNC) + +inline void toku_debug_sync(struct tokutxn *, const char *) {}; + +#endif // defined(ENABLED_DEBUG_SYNC) diff --git a/storage/tokudb/PerconaFT/portability/toku_portability.h b/storage/tokudb/PerconaFT/portability/toku_portability.h index 1f1215def5b..d3a4e391a9f 100644 --- a/storage/tokudb/PerconaFT/portability/toku_portability.h +++ b/storage/tokudb/PerconaFT/portability/toku_portability.h @@ -121,6 +121,7 @@ typedef int64_t toku_off_t; #include "toku_htod.h" #include "toku_assert.h" #include "toku_crash.h" +#include "toku_debug_sync.h" #define UU(x) x __attribute__((__unused__)) @@ -185,8 +186,10 @@ extern void *realloc(void*, size_t) __THROW __attribute__((__deprecat # pragma GCC poison u_int32_t # pragma GCC poison u_int64_t # pragma GCC poison BOOL +#if !defined(MYSQL_TOKUDB_ENGINE) # pragma GCC poison FALSE # pragma GCC poison TRUE +#endif // MYSQL_TOKUDB_ENGINE #endif #pragma GCC poison __sync_fetch_and_add #pragma GCC poison __sync_fetch_and_sub diff --git a/storage/tokudb/PerconaFT/src/tests/test_iterate_live_transactions.cc b/storage/tokudb/PerconaFT/src/tests/test_iterate_live_transactions.cc index 23c79620cd8..1eb04a06594 100644 --- a/storage/tokudb/PerconaFT/src/tests/test_iterate_live_transactions.cc +++ b/storage/tokudb/PerconaFT/src/tests/test_iterate_live_transactions.cc @@ -94,13 +94,13 @@ int test_main(int UU(argc), char *const UU(argv[])) { r = env->open(env, TOKU_TEST_FILENAME, env_flags, 0755); CKERR(r); r = env->txn_begin(env, NULL, &txn1, 0); CKERR(r); - txn1->set_client_id(txn1, 0, NULL); + txn1->set_client_id(txn1, 0, nullptr); txnid1 = txn1->id64(txn1); r = env->txn_begin(env, NULL, &txn2, 0); CKERR(r); - txn2->set_client_id(txn2, 1, NULL); + txn2->set_client_id(txn2, 1, nullptr); txnid2 = txn2->id64(txn2); r = env->txn_begin(env, NULL, &txn3, 0); CKERR(r); - txn3->set_client_id(txn3, 2, NULL); + txn3->set_client_id(txn3, 2, nullptr); txnid3 = txn3->id64(txn3); { diff --git a/storage/tokudb/PerconaFT/src/tests/transactional_fileops.cc b/storage/tokudb/PerconaFT/src/tests/transactional_fileops.cc index c1e7c5b21c4..858a1d70f7f 100644 --- a/storage/tokudb/PerconaFT/src/tests/transactional_fileops.cc +++ b/storage/tokudb/PerconaFT/src/tests/transactional_fileops.cc @@ -87,6 +87,7 @@ setup (void) { else error_file = stderr; r=db_env_create(&env, 0); CKERR(r); + env->set_dir_per_db(env, true); env->set_errfile(env, error_file ? error_file : stderr); r=env->open(env, TOKU_TEST_FILENAME, DB_INIT_LOCK|DB_INIT_LOG|DB_INIT_MPOOL|DB_INIT_TXN|DB_CREATE|DB_PRIVATE, S_IRWXU+S_IRWXG+S_IRWXO); CKERR(r); } @@ -431,6 +432,14 @@ test_fileops_3(void) { r = env->dbrename(env, txn_a, "a.db", NULL, "d.db", 0); CKERR2(r, EEXIST); + // verify correct error return code when trying to + // rename a dictionary to a name that is beyond the limit + // of the operating system. + char longname[FILENAME_MAX+11]; + memset(longname, 'b', FILENAME_MAX+7); + memcpy(longname+FILENAME_MAX+7, ".db", 4); + r = env->dbrename(env, txn_a, "a.db", NULL, longname, 0); + CKERR2(r, ENAMETOOLONG); r=txn_a->abort(txn_a); CKERR(r); } diff --git a/storage/tokudb/PerconaFT/src/ydb.cc b/storage/tokudb/PerconaFT/src/ydb.cc index 45385ef9120..886832cec6a 100644 --- a/storage/tokudb/PerconaFT/src/ydb.cc +++ b/storage/tokudb/PerconaFT/src/ydb.cc @@ -71,6 +71,8 @@ const char *toku_copyright_string = "Copyright (c) 2006, 2015, Percona and/or it #include "util/status.h" #include "util/context.h" +#include + // Include ydb_lib.cc here so that its constructor/destructor gets put into // ydb.o, to make sure they don't get erased at link time (when linking to // a static libtokufractaltree.a that was compiled with gcc). See #5094. @@ -1315,6 +1317,159 @@ static const char *env_get_data_dir(DB_ENV *env) { return env->i->real_data_dir; } +static int env_dirtool_attach(DB_ENV *env, + DB_TXN *txn, + const char *dname, + const char *iname) { + int r; + DBT dname_dbt; + DBT iname_dbt; + + HANDLE_PANICKED_ENV(env); + if (!env_opened(env)) { + return EINVAL; + } + HANDLE_READ_ONLY_TXN(txn); + toku_fill_dbt(&dname_dbt, dname, strlen(dname) + 1); + toku_fill_dbt(&iname_dbt, iname, strlen(iname) + 1); + + r = toku_db_put(env->i->directory, + txn, + &dname_dbt, + &iname_dbt, + 0, + true); + return r; +} + +static int env_dirtool_detach(DB_ENV *env, + DB_TXN *txn, + const char *dname) { + int r; + DBT dname_dbt; + DBT old_iname_dbt; + + HANDLE_PANICKED_ENV(env); + if (!env_opened(env)) { + return EINVAL; + } + HANDLE_READ_ONLY_TXN(txn); + + toku_fill_dbt(&dname_dbt, dname, strlen(dname) + 1); + toku_init_dbt_flags(&old_iname_dbt, DB_DBT_REALLOC); + + r = toku_db_get(env->i->directory, + txn, + &dname_dbt, + &old_iname_dbt, + DB_SERIALIZABLE); // allocates memory for iname + if (r == DB_NOTFOUND) + return EEXIST; + toku_free(old_iname_dbt.data); + + r = toku_db_del(env->i->directory, txn, &dname_dbt, DB_DELETE_ANY, true); + + return r; +} + +static int env_dirtool_move(DB_ENV *env, + DB_TXN *txn, + const char *old_dname, + const char *new_dname) { + int r; + DBT old_dname_dbt; + DBT new_dname_dbt; + DBT iname_dbt; + + HANDLE_PANICKED_ENV(env); + if (!env_opened(env)) { + return EINVAL; + } + HANDLE_READ_ONLY_TXN(txn); + + toku_fill_dbt(&old_dname_dbt, old_dname, strlen(old_dname) + 1); + toku_fill_dbt(&new_dname_dbt, new_dname, strlen(new_dname) + 1); + toku_init_dbt_flags(&iname_dbt, DB_DBT_REALLOC); + + r = toku_db_get(env->i->directory, + txn, + &old_dname_dbt, + &iname_dbt, + DB_SERIALIZABLE); // allocates memory for iname + if (r == DB_NOTFOUND) + return EEXIST; + + r = toku_db_del( + env->i->directory, txn, &old_dname_dbt, DB_DELETE_ANY, true); + if (r != 0) + goto exit; + + r = toku_db_put( + env->i->directory, txn, &new_dname_dbt, &iname_dbt, 0, true); + +exit: + toku_free(iname_dbt.data); + return r; +} + +static int locked_env_op(DB_ENV *env, + DB_TXN *txn, + std::function f) { + int ret, r; + HANDLE_READ_ONLY_TXN(txn); + HANDLE_ILLEGAL_WORKING_PARENT_TXN(env, txn); + + DB_TXN *child_txn = NULL; + int using_txns = env->i->open_flags & DB_INIT_TXN; + if (using_txns) { + ret = toku_txn_begin(env, txn, &child_txn, 0); + lazy_assert_zero(ret); + } + + // cannot begin a checkpoint + toku_multi_operation_client_lock(); + r = f(child_txn); + toku_multi_operation_client_unlock(); + + if (using_txns) { + if (r == 0) { + ret = locked_txn_commit(child_txn, 0); + lazy_assert_zero(ret); + } else { + ret = locked_txn_abort(child_txn); + lazy_assert_zero(ret); + } + } + return r; + +} + +static int locked_env_dirtool_attach(DB_ENV *env, + DB_TXN *txn, + const char *dname, + const char *iname) { + auto f = std::bind( + env_dirtool_attach, env, std::placeholders::_1, dname, iname); + return locked_env_op(env, txn, f); +} + +static int locked_env_dirtool_detach(DB_ENV *env, + DB_TXN *txn, + const char *dname) { + auto f = std::bind( + env_dirtool_detach, env, std::placeholders::_1, dname); + return locked_env_op(env, txn, f); +} + +static int locked_env_dirtool_move(DB_ENV *env, + DB_TXN *txn, + const char *old_dname, + const char *new_dname) { + auto f = std::bind( + env_dirtool_move, env, std::placeholders::_1, old_dname, new_dname); + return locked_env_op(env, txn, f); +} + static int env_dbremove(DB_ENV * env, DB_TXN *txn, const char *fname, const char *dbname, uint32_t flags); static int @@ -2657,6 +2812,9 @@ toku_env_create(DB_ENV ** envp, uint32_t flags) { #define SENV(name) result->name = locked_env_ ## name SENV(dbremove); SENV(dbrename); + SENV(dirtool_attach); + SENV(dirtool_detach); + SENV(dirtool_move); //SENV(set_noticecall); #undef SENV #define USENV(name) result->name = env_ ## name @@ -2916,28 +3074,31 @@ env_dbremove_subdb(DB_ENV * env, DB_TXN * txn, const char *fname, const char *db // see if we can acquire a table lock for the given dname. // requires: write lock on dname in the directory. dictionary // open, close, and begin checkpoint cannot occur. -// returns: true if we could open, lock, and close a dictionary -// with the given dname, false otherwise. -static bool +// returns: zero if we could open, lock, and close a dictionary +// with the given dname, errno otherwise. +static int can_acquire_table_lock(DB_ENV *env, DB_TXN *txn, const char *iname_in_env) { int r; - bool got_lock = false; DB *db; r = toku_db_create(&db, env, 0); assert_zero(r); r = toku_db_open_iname(db, txn, iname_in_env, 0, 0); - assert_zero(r); - r = toku_db_pre_acquire_table_lock(db, txn); - if (r == 0) { - got_lock = true; - } else { - got_lock = false; + if(r) { + if (r == ENAMETOOLONG) + toku_ydb_do_error(env, r, "File name too long!\n"); + goto exit; } - r = toku_db_close(db); - assert_zero(r); - - return got_lock; + r = toku_db_pre_acquire_table_lock(db, txn); + if (r) { + r = DB_LOCK_NOTGRANTED; + } +exit: + if(db) { + int r2 = toku_db_close(db); + assert_zero(r2); + } + return r; } static int @@ -2988,8 +3149,10 @@ env_dbremove(DB_ENV * env, DB_TXN *txn, const char *fname, const char *dbname, u if (txn && r) { if (r == EMFILE || r == ENFILE) r = toku_ydb_do_error(env, r, "toku dbremove failed because open file limit reached\n"); - else + else if (r != ENOENT) r = toku_ydb_do_error(env, r, "toku dbremove failed\n"); + else + r = 0; goto exit; } if (txn) { @@ -3148,8 +3311,8 @@ env_dbrename(DB_ENV *env, DB_TXN *txn, const char *fname, const char *dbname, co // otherwise, we're okay in marking this ft as remove on // commit. no new handles can open for this dictionary // because the txn has directory write locks on the dname - if (txn && !can_acquire_table_lock(env, txn, new_iname.get())) { - r = DB_LOCK_NOTGRANTED; + if (txn) { + r = can_acquire_table_lock(env, txn, new_iname.get()); } // We don't do anything at the ft or cachetable layer for rename. // We just update entries in the environment's directory. diff --git a/storage/tokudb/PerconaFT/src/ydb_row_lock.cc b/storage/tokudb/PerconaFT/src/ydb_row_lock.cc index 597e6311eb8..1d2f4e982f5 100644 --- a/storage/tokudb/PerconaFT/src/ydb_row_lock.cc +++ b/storage/tokudb/PerconaFT/src/ydb_row_lock.cc @@ -181,7 +181,16 @@ int toku_db_get_range_lock(DB *db, DB_TXN *txn, const DBT *left_key, const DBT * request.create(); int r = toku_db_start_range_lock(db, txn, left_key, right_key, lock_type, &request); if (r == DB_LOCK_NOTGRANTED) { + toku_debug_sync(db_txn_struct_i(txn)->tokutxn, + "toku_range_lock_before_wait"); r = toku_db_wait_range_lock(db, txn, &request); + if (r == DB_LOCK_NOTGRANTED) + toku_debug_sync(db_txn_struct_i(txn)->tokutxn, + "toku_range_lock_not_granted_after_wait"); + } + else if (r == 0) { + toku_debug_sync(db_txn_struct_i(txn)->tokutxn, + "toku_range_lock_granted_immediately"); } request.destroy(); @@ -191,12 +200,13 @@ int toku_db_get_range_lock(DB *db, DB_TXN *txn, const DBT *left_key, const DBT * // Setup and start an asynchronous lock request. int toku_db_start_range_lock(DB *db, DB_TXN *txn, const DBT *left_key, const DBT *right_key, toku::lock_request::type lock_type, toku::lock_request *request) { - DB_TXN *txn_anc = txn_oldest_ancester(txn); - TXNID txn_anc_id = txn_anc->id64(txn_anc); uint64_t client_id; void *client_extra; + DB_TXN *txn_anc = txn_oldest_ancester(txn); + TXNID txn_anc_id = txn_anc->id64(txn_anc); txn->get_client_id(txn, &client_id, &client_extra); - request->set(db->i->lt, txn_anc_id, left_key, right_key, lock_type, toku_is_big_txn(txn_anc), client_extra); + request->set(db->i->lt, txn_anc_id, left_key, right_key, lock_type, + toku_is_big_txn(txn_anc), client_extra); const int r = request->start(); if (r == 0) { @@ -245,6 +255,8 @@ int toku_db_get_point_write_lock(DB *db, DB_TXN *txn, const DBT *key) { // acquire a point write lock on the key for a given txn. // this does not block the calling thread. void toku_db_grab_write_lock (DB *db, DBT *key, TOKUTXN tokutxn) { + uint64_t client_id; + void *client_extra; DB_TXN *txn = toku_txn_get_container_db_txn(tokutxn); DB_TXN *txn_anc = txn_oldest_ancester(txn); TXNID txn_anc_id = txn_anc->id64(txn_anc); @@ -252,10 +264,10 @@ void toku_db_grab_write_lock (DB *db, DBT *key, TOKUTXN tokutxn) { // This lock request must succeed, so we do not want to wait toku::lock_request request; request.create(); - uint64_t client_id; - void *client_extra; txn->get_client_id(txn, &client_id, &client_extra); - request.set(db->i->lt, txn_anc_id, key, key, toku::lock_request::type::WRITE, toku_is_big_txn(txn_anc), client_extra); + request.set(db->i->lt, txn_anc_id, key, key, + toku::lock_request::type::WRITE, toku_is_big_txn(txn_anc), + client_extra); int r = request.start(); invariant_zero(r); db_txn_note_row_lock(db, txn_anc, key, key); diff --git a/storage/tokudb/PerconaFT/tools/CMakeLists.txt b/storage/tokudb/PerconaFT/tools/CMakeLists.txt index e62931524c9..e8aed51f813 100644 --- a/storage/tokudb/PerconaFT/tools/CMakeLists.txt +++ b/storage/tokudb/PerconaFT/tools/CMakeLists.txt @@ -6,6 +6,14 @@ foreach(tool ${tools}) add_dependencies(${tool} install_tdb_h) target_link_libraries(${tool} ${LIBTOKUDB}_static ft_static z lzma snappy ${LIBTOKUPORTABILITY}_static ${CMAKE_THREAD_LIBS_INIT} ${EXTRA_SYSTEM_LIBS}) + # detect when we are being built as a subproject + if (DEFINED MYSQL_PROJECT_NAME_DOCSTRING) + if ((CMAKE_BUILD_TYPE MATCHES "Debug") AND + (CMAKE_CXX_FLAGS_DEBUG MATCHES " -DENABLED_DEBUG_SYNC")) + target_link_libraries(${tool} sql) + endif() + endif () + add_space_separated_property(TARGET ${tool} COMPILE_FLAGS -fvisibility=hidden) endforeach(tool) diff --git a/storage/tokudb/PerconaFT/tools/ftverify.cc b/storage/tokudb/PerconaFT/tools/ftverify.cc index 2324249ba00..ee40b991ea6 100644 --- a/storage/tokudb/PerconaFT/tools/ftverify.cc +++ b/storage/tokudb/PerconaFT/tools/ftverify.cc @@ -325,7 +325,7 @@ check_block(BLOCKNUM blocknum, int64_t UU(blocksize), int64_t UU(address), void } just_decompress_sub_block(&sb); - r = verify_ftnode_sub_block(&sb); + r = verify_ftnode_sub_block(&sb, nullptr, blocknum); if (r != 0) { printf(" Uncompressed child partition %d checksum failed.\n", i); failure++; diff --git a/storage/tokudb/PerconaFT/tools/tokuftdump.cc b/storage/tokudb/PerconaFT/tools/tokuftdump.cc index f6d777b4161..2838ae5182e 100644 --- a/storage/tokudb/PerconaFT/tools/tokuftdump.cc +++ b/storage/tokudb/PerconaFT/tools/tokuftdump.cc @@ -158,7 +158,8 @@ static void dump_descriptor(DESCRIPTOR d) { static void open_header(int fd, FT *header, CACHEFILE cf) { FT ft = NULL; int r; - r = toku_deserialize_ft_from (fd, MAX_LSN, &ft); + const char *fn = toku_cachefile_fname_in_env(cf); + r = toku_deserialize_ft_from (fd, fn, MAX_LSN, &ft); if (r != 0) { fprintf(stderr, "%s: can not deserialize from %s error %d\n", arg0, fname, r); exit(1); diff --git a/storage/tokudb/ha_tokudb.cc b/storage/tokudb/ha_tokudb.cc index 227c8ae6b15..2511bea8084 100644 --- a/storage/tokudb/ha_tokudb.cc +++ b/storage/tokudb/ha_tokudb.cc @@ -532,51 +532,6 @@ typedef struct index_read_info { DBT* orig_key; } *INDEX_READ_INFO; -static int ai_poll_fun(void *extra, float progress) { - LOADER_CONTEXT context = (LOADER_CONTEXT)extra; - if (thd_kill_level(context->thd)) { - sprintf(context->write_status_msg, "The process has been killed, aborting add index."); - return ER_ABORTING_CONNECTION; - } - float percentage = progress * 100; - sprintf(context->write_status_msg, "Adding of indexes about %.1f%% done", percentage); - thd_proc_info(context->thd, context->write_status_msg); -#ifdef HA_TOKUDB_HAS_THD_PROGRESS - thd_progress_report(context->thd, (unsigned long long) percentage, 100); -#endif - return 0; -} - -static int loader_poll_fun(void *extra, float progress) { - LOADER_CONTEXT context = (LOADER_CONTEXT)extra; - if (thd_kill_level(context->thd)) { - sprintf(context->write_status_msg, "The process has been killed, aborting bulk load."); - return ER_ABORTING_CONNECTION; - } - float percentage = progress * 100; - sprintf(context->write_status_msg, "Loading of data about %.1f%% done", percentage); - thd_proc_info(context->thd, context->write_status_msg); -#ifdef HA_TOKUDB_HAS_THD_PROGRESS - thd_progress_report(context->thd, (unsigned long long) percentage, 100); -#endif - return 0; -} - -static void loader_ai_err_fun(DB *db, int i, int err, DBT *key, DBT *val, void *error_extra) { - LOADER_CONTEXT context = (LOADER_CONTEXT)error_extra; - assert_always(context->ha); - context->ha->set_loader_error(err); -} - -static void loader_dup_fun(DB *db, int i, int err, DBT *key, DBT *val, void *error_extra) { - LOADER_CONTEXT context = (LOADER_CONTEXT)error_extra; - assert_always(context->ha); - context->ha->set_loader_error(err); - if (err == DB_KEYEXIST) { - context->ha->set_dup_value_for_pk(key); - } -} - // // smart DBT callback function for optimize // in optimize, we want to flatten DB by doing @@ -3397,11 +3352,13 @@ void ha_tokudb::start_bulk_insert(ha_rows rows) { lc.thd = thd; lc.ha = this; - - error = loader->set_poll_function(loader, loader_poll_fun, &lc); + + error = loader->set_poll_function( + loader, ha_tokudb::bulk_insert_poll, &lc); assert_always(!error); - error = loader->set_error_callback(loader, loader_dup_fun, &lc); + error = loader->set_error_callback( + loader, ha_tokudb::loader_dup, &lc); assert_always(!error); trx->stmt_progress.using_loader = true; @@ -3414,6 +3371,47 @@ void ha_tokudb::start_bulk_insert(ha_rows rows) { } TOKUDB_HANDLER_DBUG_VOID_RETURN; } +int ha_tokudb::bulk_insert_poll(void* extra, float progress) { + LOADER_CONTEXT context = (LOADER_CONTEXT)extra; + if (thd_killed(context->thd)) { + sprintf(context->write_status_msg, + "The process has been killed, aborting bulk load."); + return ER_ABORTING_CONNECTION; + } + float percentage = progress * 100; + sprintf(context->write_status_msg, + "Loading of data t %s about %.1f%% done", + context->ha->share->full_table_name(), + percentage); + thd_proc_info(context->thd, context->write_status_msg); +#ifdef HA_TOKUDB_HAS_THD_PROGRESS + thd_progress_report(context->thd, (unsigned long long)percentage, 100); +#endif + return 0; +} +void ha_tokudb::loader_add_index_err(DB* db, + int i, + int err, + DBT* key, + DBT* val, + void* error_extra) { + LOADER_CONTEXT context = (LOADER_CONTEXT)error_extra; + assert_always(context->ha); + context->ha->set_loader_error(err); +} +void ha_tokudb::loader_dup(DB* db, + int i, + int err, + DBT* key, + DBT* val, + void* error_extra) { + LOADER_CONTEXT context = (LOADER_CONTEXT)error_extra; + assert_always(context->ha); + context->ha->set_loader_error(err); + if (err == DB_KEYEXIST) { + context->ha->set_dup_value_for_pk(key); + } +} // // Method that is called at the end of many calls to insert rows @@ -5248,17 +5246,17 @@ int ha_tokudb::fill_range_query_buf( DEBUG_SYNC(ha_thd(), "tokudb_icp_asc_scan_out_of_range"); goto cleanup; } else if (result == ICP_NO_MATCH) { - // if we are performing a DESC ICP scan and have no end_range - // to compare to stop using ICP filtering as there isn't much more - // that we can do without going through contortions with remembering - // and comparing key parts. + // Optimizer change for MyRocks also benefits us here in TokuDB as + // opt_range.cc QUICK_SELECT::get_next now sets end_range during + // descending scan. We should not ever hit this condition, but + // leaving this code in to prevent any possibility of a descending + // scan to the beginning of an index and catch any possibility + // in debug builds with an assertion + assert_debug(!(!end_range && direction < 0)); if (!end_range && direction < 0) { - cancel_pushed_idx_cond(); - DEBUG_SYNC(ha_thd(), "tokudb_icp_desc_scan_invalidate"); } - error = TOKUDB_CURSOR_CONTINUE; goto cleanup; } @@ -6108,7 +6106,6 @@ int ha_tokudb::info(uint flag) { stats.records = share->row_count() + share->rows_from_locked_table; stats.deleted = 0; if (!(flag & HA_STATUS_NO_LOCK)) { - uint64_t num_rows = 0; error = txn_begin(db_env, NULL, &txn, DB_READ_UNCOMMITTED, ha_thd()); if (error) { @@ -6118,20 +6115,13 @@ int ha_tokudb::info(uint flag) { // we should always have a primary key assert_always(share->file != NULL); - error = estimate_num_rows(share->file, &num_rows, txn); - if (error == 0) { - share->set_row_count(num_rows, false); - stats.records = num_rows; - } else { - goto cleanup; - } - DB_BTREE_STAT64 dict_stats; error = share->file->stat64(share->file, txn, &dict_stats); if (error) { goto cleanup; } - + share->set_row_count(dict_stats.bt_ndata, false); + stats.records = dict_stats.bt_ndata; stats.create_time = dict_stats.bt_create_time_sec; stats.update_time = dict_stats.bt_modify_time_sec; stats.check_time = dict_stats.bt_verify_time_sec; @@ -7834,7 +7824,7 @@ ha_rows ha_tokudb::records_in_range(uint keynr, key_range* start_key, key_range* // As a result, equal may be 0 and greater may actually be equal+greater // So, we call key_range64 on the key, and the key that is after it. if (!start_key && !end_key) { - error = estimate_num_rows(kfile, &rows, transaction); + error = estimate_num_rows(share->file, &rows, transaction); if (error) { ret_val = HA_TOKUDB_RANGE_COUNT; goto cleanup; @@ -8186,12 +8176,14 @@ int ha_tokudb::tokudb_add_index( goto cleanup; } - error = indexer->set_poll_function(indexer, ai_poll_fun, &lc); + error = indexer->set_poll_function( + indexer, ha_tokudb::tokudb_add_index_poll, &lc); if (error) { goto cleanup; } - error = indexer->set_error_callback(indexer, loader_ai_err_fun, &lc); + error = indexer->set_error_callback( + indexer, ha_tokudb::loader_add_index_err, &lc); if (error) { goto cleanup; } @@ -8246,12 +8238,14 @@ int ha_tokudb::tokudb_add_index( goto cleanup; } - error = loader->set_poll_function(loader, loader_poll_fun, &lc); + error = + loader->set_poll_function(loader, ha_tokudb::bulk_insert_poll, &lc); if (error) { goto cleanup; } - error = loader->set_error_callback(loader, loader_ai_err_fun, &lc); + error = loader->set_error_callback( + loader, ha_tokudb::loader_add_index_err, &lc); if (error) { goto cleanup; } @@ -8458,6 +8452,24 @@ cleanup: thd_proc_info(thd, orig_proc_info); TOKUDB_HANDLER_DBUG_RETURN(error ? error : loader_error); } +int ha_tokudb::tokudb_add_index_poll(void* extra, float progress) { + LOADER_CONTEXT context = (LOADER_CONTEXT)extra; + if (thd_killed(context->thd)) { + sprintf(context->write_status_msg, + "The process has been killed, aborting add index."); + return ER_ABORTING_CONNECTION; + } + float percentage = progress * 100; + sprintf(context->write_status_msg, + "Adding of indexes to %s about %.1f%% done", + context->ha->share->full_table_name(), + percentage); + thd_proc_info(context->thd, context->write_status_msg); +#ifdef HA_TOKUDB_HAS_THD_PROGRESS + thd_progress_report(context->thd, (unsigned long long)percentage, 100); +#endif + return 0; +} // // Internal function called by ha_tokudb::add_index and ha_tokudb::alter_table_phase2 diff --git a/storage/tokudb/ha_tokudb.h b/storage/tokudb/ha_tokudb.h index 4a7e395d0d1..3891e57738b 100644 --- a/storage/tokudb/ha_tokudb.h +++ b/storage/tokudb/ha_tokudb.h @@ -799,6 +799,19 @@ public: #else void start_bulk_insert(ha_rows rows); #endif + static int bulk_insert_poll(void* extra, float progress); + static void loader_add_index_err(DB* db, + int i, + int err, + DBT* key, + DBT* val, + void* error_extra); + static void loader_dup(DB* db, + int i, + int err, + DBT* key, + DBT* val, + void* error_extra); int end_bulk_insert(); int end_bulk_insert(bool abort); @@ -938,17 +951,23 @@ public: #endif private: - int tokudb_add_index( - TABLE *table_arg, - KEY *key_info, - uint num_of_keys, - DB_TXN* txn, - bool* inc_num_DBs, - bool* modified_DB - ); - void restore_add_index(TABLE* table_arg, uint num_of_keys, bool incremented_numDBs, bool modified_DBs); - int drop_indexes(TABLE *table_arg, uint *key_num, uint num_of_keys, KEY *key_info, DB_TXN* txn); - void restore_drop_indexes(TABLE *table_arg, uint *key_num, uint num_of_keys); + int tokudb_add_index(TABLE* table_arg, + KEY* key_info, + uint num_of_keys, + DB_TXN* txn, + bool* inc_num_DBs, + bool* modified_DB); + static int tokudb_add_index_poll(void *extra, float progress); + void restore_add_index(TABLE* table_arg, + uint num_of_keys, + bool incremented_numDBs, + bool modified_DBs); + int drop_indexes(TABLE* table_arg, + uint* key_num, + uint num_of_keys, + KEY* key_info, + DB_TXN* txn); + void restore_drop_indexes(TABLE* table_arg, uint* key_num, uint num_of_keys); public: // delete all rows from the table diff --git a/storage/tokudb/hatoku_hton.cc b/storage/tokudb/hatoku_hton.cc index c3fb6afed73..a079e817374 100644 --- a/storage/tokudb/hatoku_hton.cc +++ b/storage/tokudb/hatoku_hton.cc @@ -55,7 +55,7 @@ static bool tokudb_show_status( static void tokudb_handle_fatal_signal(handlerton* hton, THD* thd, int sig); #endif static int tokudb_close_connection(handlerton* hton, THD* thd); -static void tokudb_kill_query(handlerton *hton, THD *thd, enum thd_kill_levels level); +static void tokudb_kill_connection(handlerton *hton, THD *thd, enum thd_kill_levels level); static int tokudb_commit(handlerton* hton, THD* thd, bool all); static int tokudb_rollback(handlerton* hton, THD* thd, bool all); #if TOKU_INCLUDE_XA @@ -337,7 +337,7 @@ static int tokudb_init_func(void *p) { tokudb_hton->create = tokudb_create_handler; tokudb_hton->close_connection = tokudb_close_connection; - tokudb_hton->kill_query = tokudb_kill_query; + tokudb_hton->kill_query = tokudb_kill_connection; tokudb_hton->savepoint_offset = sizeof(SP_INFO_T); tokudb_hton->savepoint_set = tokudb_savepoint; @@ -762,7 +762,8 @@ static int tokudb_close_connection(handlerton* hton, THD* thd) { return error; } -void tokudb_kill_query(handlerton *hton, THD *thd, enum thd_kill_levels level) { +void tokudb_kill_connection(handlerton *hton, THD *thd, + enum thd_kill_levels level) { TOKUDB_DBUG_ENTER(""); db_env->kill_waiter(db_env, thd); DBUG_VOID_RETURN; diff --git a/storage/tokudb/mysql-test/rpl/include/rpl_tokudb_row_img_general_loop.inc b/storage/tokudb/mysql-test/rpl/include/rpl_tokudb_row_img_general_loop.inc new file mode 100644 index 00000000000..321f09353a1 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/include/rpl_tokudb_row_img_general_loop.inc @@ -0,0 +1,42 @@ +# +# This is a helper script for rpl_row_img.test. It creates +# all combinations MyISAM / InnoDB in a three server replication +# chain. Each engine combination is tested against the current +# seetings for binlog_row_image (on each server). +# +# The test script that is executed on every combination is the +# only argument to this wrapper script. See below. +# +# This script takes one parameter: +# - $row_img_test_script +# the name of the test script to include in every combination +# +# Sample usage: +# -- let $row_img_test_script= extra/rpl_tests/rpl_row_img.test +# -- source include/rpl_row_img_general_loop.test + + +-- let $engine_type_a= 2 +-- let $server_1_engine= TokuDB +while($engine_type_a) +{ + -- let $engine_type_b= 2 + -- let $server_2_engine= TokuDB + while($engine_type_b) + { + -- let $engine_type_c= 2 + -- let $server_3_engine= TokuDB + while($engine_type_c) + { + -- echo ### engines: $server_1_engine, $server_2_engine, $server_3_engine + -- source $row_img_test_script + + -- let $server_3_engine= InnoDB + -- dec $engine_type_c + } + -- let $server_2_engine= InnoDB + -- dec $engine_type_b + } + -- let $server_1_engine= InnoDB + -- dec $engine_type_a +} diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_extra_col_slave_tokudb.result b/storage/tokudb/mysql-test/rpl/r/rpl_extra_col_slave_tokudb.result index 6caa51128f9..8906cf31d74 100644 --- a/storage/tokudb/mysql-test/rpl/r/rpl_extra_col_slave_tokudb.result +++ b/storage/tokudb/mysql-test/rpl/r/rpl_extra_col_slave_tokudb.result @@ -662,7 +662,7 @@ t16 CREATE TABLE `t16` ( `c5` char(5) DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 4 *** Show table on Slave **** connection slave; @@ -678,7 +678,7 @@ t16 CREATE TABLE `t16` ( `c7` timestamp NULL DEFAULT current_timestamp(), PRIMARY KEY (`c1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (c1) + PARTITION BY KEY (`c1`) PARTITIONS 4 *** DROP TABLE t16 *** connection master; diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_parallel_tokudb_update_pk_uc0_lookup0.result b/storage/tokudb/mysql-test/rpl/r/rpl_parallel_tokudb_update_pk_uc0_lookup0.result index d055e4341c7..991ad8d1c48 100644 --- a/storage/tokudb/mysql-test/rpl/r/rpl_parallel_tokudb_update_pk_uc0_lookup0.result +++ b/storage/tokudb/mysql-test/rpl/r/rpl_parallel_tokudb_update_pk_uc0_lookup0.result @@ -25,11 +25,13 @@ update t set b=b+2 where a=1; update t set b=b+3 where a=4; update t set b=b+4 where a=3; update t set b=b+1 where 1<=a and a<=3; -select unix_timestamp() into @tstart; +# select unix_timestamp() into @tstart; connection master; connection slave; connection master; -select unix_timestamp() into @tend; +# Commented out for MariaDB +# select unix_timestamp() into @tend; +# select @tend-@tstart <= 5; # assert no delay in the delete time connection slave; select * from t; a b diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_parallel_tokudb_write_pk.result b/storage/tokudb/mysql-test/rpl/r/rpl_parallel_tokudb_write_pk.result index f39d2400afd..1de619eb4ec 100644 --- a/storage/tokudb/mysql-test/rpl/r/rpl_parallel_tokudb_write_pk.result +++ b/storage/tokudb/mysql-test/rpl/r/rpl_parallel_tokudb_write_pk.result @@ -9,11 +9,11 @@ tokudb_rpl_unique_checks OFF tokudb_rpl_unique_checks_delay 5000 connection master; create table t (a bigint not null, primary key(a)) engine=tokudb; -select unix_timestamp() into @tstart; insert into t values (1); insert into t values (2),(3); insert into t values (4); connection slave; +connection master; connection slave; connection master; include/diff_tables.inc [master:test.t, slave:test.t] diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_partition_tokudb.result b/storage/tokudb/mysql-test/rpl/r/rpl_partition_tokudb.result index 7b731bc785c..d7e99db1d0e 100644 --- a/storage/tokudb/mysql-test/rpl/r/rpl_partition_tokudb.result +++ b/storage/tokudb/mysql-test/rpl/r/rpl_partition_tokudb.result @@ -62,9 +62,9 @@ byrange_tbl CREATE TABLE `byrange_tbl` ( `filler` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=TokuDB AUTO_INCREMENT=201 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (id) -(PARTITION pa100 VALUES LESS THAN (100) ENGINE = TokuDB, - PARTITION paMax VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`id`) +(PARTITION `pa100` VALUES LESS THAN (100) ENGINE = TokuDB, + PARTITION `paMax` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) show create table test.regular_tbl; Table Create Table regular_tbl CREATE TABLE `regular_tbl` ( @@ -106,9 +106,9 @@ byrange_tbl CREATE TABLE `byrange_tbl` ( `filler` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=TokuDB AUTO_INCREMENT=201 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (id) -(PARTITION pa100 VALUES LESS THAN (100) ENGINE = TokuDB, - PARTITION paMax VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`id`) +(PARTITION `pa100` VALUES LESS THAN (100) ENGINE = TokuDB, + PARTITION `paMax` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) show create table test.regular_tbl; Table Create Table regular_tbl CREATE TABLE `regular_tbl` ( diff --git a/storage/tokudb/mysql-test/tokudb_rpl/r/rpl_rfr_disable_on_expl_pk_absence.result b/storage/tokudb/mysql-test/rpl/r/rpl_rfr_disable_on_expl_pk_absence.result similarity index 79% rename from storage/tokudb/mysql-test/tokudb_rpl/r/rpl_rfr_disable_on_expl_pk_absence.result rename to storage/tokudb/mysql-test/rpl/r/rpl_rfr_disable_on_expl_pk_absence.result index 2977dc859f5..127184a0766 100644 --- a/storage/tokudb/mysql-test/tokudb_rpl/r/rpl_rfr_disable_on_expl_pk_absence.result +++ b/storage/tokudb/mysql-test/rpl/r/rpl_rfr_disable_on_expl_pk_absence.result @@ -1,8 +1,10 @@ include/master-slave.inc [connection master] call mtr.add_suppression("read free replication is disabled for tokudb table"); +connection master; CREATE TABLE t (a int(11), b char(20)) ENGINE = TokuDB; INSERT INTO t (a, b) VALUES (1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e'); +connection slave; SELECT * FROM t; a b 1 a @@ -10,6 +12,7 @@ a b 3 c 4 d 5 e +connection master; UPDATE t SET a = a + 10 WHERE b = 'b'; SELECT * FROM t; a b @@ -18,6 +21,7 @@ a b 3 c 4 d 5 e +connection slave; SELECT * FROM t; a b 1 a @@ -25,6 +29,7 @@ a b 3 c 4 d 5 e +connection master; UPDATE t SET a = a + 10 WHERE b = 'b'; SELECT * FROM t; a b @@ -33,6 +38,7 @@ a b 3 c 4 d 5 e +connection slave; SELECT * FROM t; a b 1 a @@ -40,5 +46,7 @@ a b 3 c 4 d 5 e +connection master; DROP TABLE t; +connection slave; include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_bug28430.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_bug28430.result index 4858d5f099b..c7450a1b9c0 100644 --- a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_bug28430.result +++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_bug28430.result @@ -115,20 +115,20 @@ Create Table CREATE TABLE `byrange_tbl` ( `filler` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=TokuDB AUTO_INCREMENT=1001 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (id) -SUBPARTITION BY HASH (id) + PARTITION BY RANGE (`id`) +SUBPARTITION BY HASH (`id`) SUBPARTITIONS 2 -(PARTITION pa1 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION pa2 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION pa3 VALUES LESS THAN (30) ENGINE = TokuDB, - PARTITION pa4 VALUES LESS THAN (40) ENGINE = TokuDB, - PARTITION pa5 VALUES LESS THAN (50) ENGINE = TokuDB, - PARTITION pa6 VALUES LESS THAN (60) ENGINE = TokuDB, - PARTITION pa7 VALUES LESS THAN (70) ENGINE = TokuDB, - PARTITION pa8 VALUES LESS THAN (80) ENGINE = TokuDB, - PARTITION pa9 VALUES LESS THAN (90) ENGINE = TokuDB, - PARTITION pa10 VALUES LESS THAN (100) ENGINE = TokuDB, - PARTITION pa11 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) +(PARTITION `pa1` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `pa2` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `pa3` VALUES LESS THAN (30) ENGINE = TokuDB, + PARTITION `pa4` VALUES LESS THAN (40) ENGINE = TokuDB, + PARTITION `pa5` VALUES LESS THAN (50) ENGINE = TokuDB, + PARTITION `pa6` VALUES LESS THAN (60) ENGINE = TokuDB, + PARTITION `pa7` VALUES LESS THAN (70) ENGINE = TokuDB, + PARTITION `pa8` VALUES LESS THAN (80) ENGINE = TokuDB, + PARTITION `pa9` VALUES LESS THAN (90) ENGINE = TokuDB, + PARTITION `pa10` VALUES LESS THAN (100) ENGINE = TokuDB, + PARTITION `pa11` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT count(*) "Slave norm" FROM test.regular_tbl; Slave norm 500 SELECT count(*) "Slave bykey" FROM test.bykey_tbl; diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_commit_after_flush.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_commit_after_flush.result new file mode 100644 index 00000000000..cc9174ba09e --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_commit_after_flush.result @@ -0,0 +1,13 @@ +include/master-slave.inc +[connection master] +CREATE TABLE t1 (a INT) ENGINE=tokudb; +begin; +insert into t1 values(1); +flush tables with read lock; +commit; +connection slave; +connection master; +unlock tables; +drop table t1; +connection slave; +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_insert_id.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_insert_id.result new file mode 100644 index 00000000000..02da7194eb5 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_insert_id.result @@ -0,0 +1,580 @@ +# +# Setup +# +# +# See if queries that use both auto_increment and LAST_INSERT_ID() +# are replicated well +# +# We also check how the foreign_key_check variable is replicated +# +include/master-slave.inc +[connection master] +connection master; +SET @old_concurrent_insert= @@global.concurrent_insert; +SET @@global.concurrent_insert= 0; +connection master; +create table t1(a int auto_increment, key(a)) engine=tokudb; +create table t2(b int auto_increment, c int, key(b)) engine=tokudb; +insert into t1 values (1),(2),(3); +insert into t1 values (null); +insert into t2 values (null,last_insert_id()); +connection slave; +select * from t1 ORDER BY a; +a +1 +2 +3 +4 +select * from t2 ORDER BY b; +b c +1 4 +connection master; +drop table t1; +drop table t2; +create table t1(a int auto_increment, key(a)) engine=tokudb; +create table t2(b int auto_increment, c int, key(b), foreign key(b) references t1(a)) engine=tokudb; +SET FOREIGN_KEY_CHECKS=0; +insert into t1 values (10); +insert into t1 values (null),(null),(null); +insert into t2 values (5,0); +insert into t2 values (null,last_insert_id()); +SET FOREIGN_KEY_CHECKS=1; +connection slave; +select * from t1; +a +10 +11 +12 +13 +select * from t2; +b c +5 0 +6 11 +connection master; +# +# check if INSERT SELECT in auto_increment is well replicated (bug #490) +# +drop table t2; +drop table t1; +create table t1(a int auto_increment, key(a)) engine=tokudb; +create table t2(b int auto_increment, c int, key(b)) engine=tokudb; +insert into t1 values (10); +insert into t1 values (null),(null),(null); +insert into t2 values (5,0); +insert into t2 (c) select * from t1 ORDER BY a; +select * from t2 ORDER BY b; +b c +5 0 +6 10 +7 11 +8 12 +9 13 +connection slave; +select * from t1 ORDER BY a; +a +10 +11 +12 +13 +select * from t2 ORDER BY b; +b c +5 0 +6 10 +7 11 +8 12 +9 13 +connection master; +drop table t1; +drop table t2; +connection slave; +# +# Bug#8412: Error codes reported in binary log for CHARACTER SET, +# FOREIGN_KEY_CHECKS +# +connection master; +SET TIMESTAMP=1000000000; +CREATE TABLE t1 ( a INT UNIQUE ) engine=tokudb; +SET FOREIGN_KEY_CHECKS=0; +INSERT INTO t1 VALUES (1),(1); +Got one of the listed errors +connection slave; +connection master; +drop table t1; +connection slave; +# +# Bug#14553: NULL in WHERE resets LAST_INSERT_ID +# +connection master; +set @@session.sql_auto_is_null=1; +create table t1(a int auto_increment, key(a)) engine=tokudb; +create table t2(a int) engine=tokudb; +insert into t1 (a) values (null); +insert into t2 (a) select a from t1 where a is null; +insert into t2 (a) select a from t1 where a is null; +select * from t2; +a +1 +connection slave; +connection slave; +select * from t2; +a +1 +connection master; +drop table t1; +drop table t2; +# +# End of 4.1 tests +# +# +# BUG#15728: LAST_INSERT_ID function inside a stored function returns 0 +# +# The solution is not to reset last_insert_id on enter to sub-statement. +# +connection master; +drop function if exists bug15728; +drop function if exists bug15728_insert; +drop table if exists t1, t2; +create table t1 ( +id int not null auto_increment, +last_id int, +primary key (id) +) engine=tokudb; +create function bug15728() returns int(11) +return last_insert_id(); +insert into t1 (last_id) values (0); +insert into t1 (last_id) values (last_insert_id()); +insert into t1 (last_id) values (bug15728()); +create table t2 ( +id int not null auto_increment, +last_id int, +primary key (id) +) engine=tokudb; +create function bug15728_insert() returns int(11) modifies sql data +begin +insert into t2 (last_id) values (bug15728()); +return bug15728(); +end| +create trigger t1_bi before insert on t1 for each row +begin +declare res int; +select bug15728_insert() into res; +set NEW.last_id = res; +end| +insert into t1 (last_id) values (0); +drop trigger t1_bi; +select last_insert_id(); +last_insert_id() +4 +select bug15728_insert(); +bug15728_insert() +2 +select last_insert_id(); +last_insert_id() +4 +insert into t1 (last_id) values (bug15728()); +select last_insert_id(); +last_insert_id() +5 +drop procedure if exists foo; +create procedure foo() +begin +declare res int; +insert into t2 (last_id) values (bug15728()); +insert into t1 (last_id) values (bug15728()); +end| +call foo(); +select * from t1; +id last_id +1 0 +2 1 +3 2 +4 1 +5 4 +6 3 +select * from t2; +id last_id +1 3 +2 4 +3 5 +connection slave; +select * from t1; +id last_id +1 0 +2 1 +3 2 +4 1 +5 4 +6 3 +select * from t2; +id last_id +1 3 +2 4 +3 5 +connection master; +drop function bug15728; +drop function bug15728_insert; +drop table t1,t2; +drop procedure foo; +create table t1 (n int primary key auto_increment not null, +b int, unique(b)) engine=tokudb; +set sql_log_bin=0; +insert into t1 values(null,100); +replace into t1 values(null,50),(null,100),(null,150); +select * from t1 order by n; +n b +2 50 +3 100 +4 150 +truncate table t1; +set sql_log_bin=1; +insert into t1 values(null,100); +select * from t1 order by n; +n b +1 100 +connection slave; +insert into t1 values(null,200),(null,300); +delete from t1 where b <> 100; +select * from t1 order by n; +n b +1 100 +connection master; +replace into t1 values(null,100),(null,350); +select * from t1 order by n; +n b +2 100 +3 350 +connection slave; +select * from t1 order by n; +n b +2 100 +3 350 +connection master; +insert into t1 values (NULL,400),(3,500),(NULL,600) on duplicate key UPDATE n=1000; +select * from t1 order by n; +n b +2 100 +4 400 +1000 350 +1001 600 +connection slave; +select * from t1 order by n; +n b +2 100 +4 400 +1000 350 +1001 600 +connection master; +drop table t1; +create table t1 (n int primary key auto_increment not null, +b int, unique(b)) engine=tokudb; +insert into t1 values(null,100); +select * from t1 order by n; +n b +1 100 +connection slave; +insert into t1 values(null,200),(null,300); +delete from t1 where b <> 100; +select * from t1 order by n; +n b +1 100 +connection master; +insert into t1 values(null,100),(null,350) on duplicate key update n=2; +select * from t1 order by n; +n b +2 100 +3 350 +connection slave; +select * from t1 order by n; +n b +2 100 +3 350 +connection master; +drop table t1; +connection slave; +connection master; +CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT, +UNIQUE(b)) ENGINE=tokudb; +INSERT INTO t1(b) VALUES(1),(1),(2) ON DUPLICATE KEY UPDATE t1.b=10; +SELECT * FROM t1 ORDER BY a; +a b +1 10 +2 2 +connection slave; +SELECT * FROM t1 ORDER BY a; +a b +1 10 +2 2 +connection master; +drop table t1; +CREATE TABLE t1 ( +id bigint(20) unsigned NOT NULL auto_increment, +field_1 int(10) unsigned NOT NULL, +field_2 varchar(255) NOT NULL, +field_3 varchar(255) NOT NULL, +PRIMARY KEY (id), +UNIQUE KEY field_1 (field_1, field_2) +) ENGINE=tokudb; +CREATE TABLE t2 ( +field_a int(10) unsigned NOT NULL, +field_b varchar(255) NOT NULL, +field_c varchar(255) NOT NULL +) ENGINE=tokudb; +INSERT INTO t2 (field_a, field_b, field_c) VALUES (1, 'a', '1a'); +INSERT INTO t2 (field_a, field_b, field_c) VALUES (2, 'b', '2b'); +INSERT INTO t2 (field_a, field_b, field_c) VALUES (3, 'c', '3c'); +INSERT INTO t2 (field_a, field_b, field_c) VALUES (4, 'd', '4d'); +INSERT INTO t2 (field_a, field_b, field_c) VALUES (5, 'e', '5e'); +INSERT INTO t1 (field_1, field_2, field_3) +SELECT t2.field_a, t2.field_b, t2.field_c +FROM t2 +ON DUPLICATE KEY UPDATE +t1.field_3 = t2.field_c; +INSERT INTO t2 (field_a, field_b, field_c) VALUES (6, 'f', '6f'); +INSERT INTO t1 (field_1, field_2, field_3) +SELECT t2.field_a, t2.field_b, t2.field_c +FROM t2 +ON DUPLICATE KEY UPDATE +t1.field_3 = t2.field_c; +SELECT * FROM t1 ORDER BY id; +id field_1 field_2 field_3 +1 1 a 1a +2 2 b 2b +3 3 c 3c +4 4 d 4d +5 5 e 5e +8 6 f 6f +connection slave; +SELECT * FROM t1 ORDER BY id; +id field_1 field_2 field_3 +1 1 a 1a +2 2 b 2b +3 3 c 3c +4 4 d 4d +5 5 e 5e +8 6 f 6f +connection master; +drop table t1, t2; +connection master; +DROP PROCEDURE IF EXISTS p1; +DROP TABLE IF EXISTS t1, t2; +SELECT LAST_INSERT_ID(0); +LAST_INSERT_ID(0) +0 +CREATE TABLE t1 ( +id INT NOT NULL DEFAULT 0, +last_id INT, +PRIMARY KEY (id) +) ENGINE=tokudb; +CREATE TABLE t2 ( +id INT NOT NULL AUTO_INCREMENT, +last_id INT, +PRIMARY KEY (id) +) ENGINE=tokudb; +CREATE PROCEDURE p1() +BEGIN +INSERT INTO t2 (last_id) VALUES (LAST_INSERT_ID()); +INSERT INTO t1 (last_id) VALUES (LAST_INSERT_ID()); +END| +CALL p1(); +SELECT * FROM t1 ORDER BY id; +id last_id +0 1 +SELECT * FROM t2 ORDER BY id; +id last_id +1 0 +connection slave; +SELECT * FROM t1 ORDER BY id; +id last_id +0 1 +SELECT * FROM t2 ORDER BY id; +id last_id +1 0 +connection master; +DROP PROCEDURE p1; +DROP TABLE t1, t2; +DROP PROCEDURE IF EXISTS p1; +DROP FUNCTION IF EXISTS f1; +DROP FUNCTION IF EXISTS f2; +DROP FUNCTION IF EXISTS f3; +DROP TABLE IF EXISTS t1, t2; +CREATE TABLE t1 ( +i INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +j INT DEFAULT 0 +) ENGINE=tokudb; +CREATE TABLE t2 (i INT) ENGINE=tokudb; +CREATE PROCEDURE p1() +BEGIN +INSERT INTO t1 (i) VALUES (NULL); +INSERT INTO t2 (i) VALUES (LAST_INSERT_ID()); +INSERT INTO t1 (i) VALUES (NULL), (NULL); +INSERT INTO t2 (i) VALUES (LAST_INSERT_ID()); +END | +CREATE FUNCTION f1() RETURNS INT MODIFIES SQL DATA +BEGIN +INSERT INTO t1 (i) VALUES (NULL); +INSERT INTO t2 (i) VALUES (LAST_INSERT_ID()); +INSERT INTO t1 (i) VALUES (NULL), (NULL); +INSERT INTO t2 (i) VALUES (LAST_INSERT_ID()); +RETURN 0; +END | +CREATE FUNCTION f2() RETURNS INT NOT DETERMINISTIC +RETURN LAST_INSERT_ID() | +CREATE FUNCTION f3() RETURNS INT MODIFIES SQL DATA +BEGIN +INSERT INTO t2 (i) VALUES (LAST_INSERT_ID()); +RETURN 0; +END | +INSERT INTO t1 VALUES (NULL, -1); +CALL p1(); +SELECT f1(); +f1() +0 +INSERT INTO t1 VALUES (NULL, f2()), (NULL, LAST_INSERT_ID()), +(NULL, LAST_INSERT_ID()), (NULL, f2()), (NULL, f2()); +INSERT INTO t1 VALUES (NULL, f2()); +INSERT INTO t1 VALUES (NULL, 0), (NULL, LAST_INSERT_ID()); +UPDATE t1 SET j= -1 WHERE i IS NULL; +INSERT INTO t1 (i) VALUES (NULL); +connection master1; +INSERT INTO t1 (i) VALUES (NULL); +connection master; +SELECT f3(); +f3() +0 +SELECT * FROM t1 ORDER BY i; +i j +1 -1 +2 0 +3 0 +4 0 +5 0 +6 0 +7 0 +8 3 +9 3 +10 3 +11 3 +12 3 +13 8 +14 -1 +15 13 +16 0 +17 0 +SELECT * FROM t2 ORDER BY i; +i +2 +3 +5 +6 +16 +connection slave; +SELECT * FROM t1; +i j +1 -1 +2 0 +3 0 +4 0 +5 0 +6 0 +7 0 +8 3 +9 3 +10 3 +11 3 +12 3 +13 8 +14 -1 +15 13 +16 0 +17 0 +SELECT * FROM t2; +i +2 +3 +5 +6 +16 +connection master; +DROP PROCEDURE p1; +DROP FUNCTION f1; +DROP FUNCTION f2; +DROP FUNCTION f3; +DROP TABLE t1, t2; +connection slave; +# +# End of 5.0 tests +# +connection master; +create table t2 ( +id int not null auto_increment, +last_id int, +primary key (id) +) engine=tokudb; +connection master; +truncate table t2; +create table t1 (id tinyint primary key) engine=tokudb; +create function insid() returns int +begin +insert into t2 (last_id) values (0); +return 0; +end| +set sql_log_bin=0; +insert into t2 (id) values(1),(2),(3); +delete from t2; +set sql_log_bin=1; +select insid(); +insid() +0 +set sql_log_bin=0; +insert into t2 (id) values(5),(6),(7); +delete from t2 where id>=5; +set sql_log_bin=1; +insert into t1 select insid(); +select * from t1 order by id; +id +0 +select * from t2 order by id; +id last_id +4 0 +8 0 +connection slave; +select * from t1 order by id; +id +0 +select * from t2 order by id; +id last_id +4 0 +8 0 +connection master; +drop table t1; +drop function insid; +truncate table t2; +create table t1 (n int primary key auto_increment not null, +b int, unique(b)) engine=tokudb; +create procedure foo() +begin +insert into t1 values(null,10); +insert ignore into t1 values(null,10); +insert ignore into t1 values(null,10); +insert into t2 values(null,3); +end| +call foo(); +select * from t1 order by n; +n b +1 10 +select * from t2 order by id; +id last_id +1 3 +connection slave; +select * from t1 order by n; +n b +1 10 +select * from t2 order by id; +id last_id +1 3 +connection master; +drop table t1, t2; +drop procedure foo; +SET @@global.concurrent_insert= @old_concurrent_insert; +set @@session.sql_auto_is_null=default; +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_insert_id_pk.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_insert_id_pk.result new file mode 100644 index 00000000000..20369a1842c --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_insert_id_pk.result @@ -0,0 +1,84 @@ +include/master-slave.inc +[connection master] +call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT."); +create table t1(a int auto_increment, primary key(a)); +create table t2(b int auto_increment, c int, primary key(b)); +insert into t1 values (1),(2),(3); +insert into t1 values (null); +insert into t2 values (null,last_insert_id()); +connection slave; +select * from t1 ORDER BY a; +a +1 +2 +3 +4 +select * from t2 ORDER BY b; +b c +1 4 +connection master; +drop table t1; +drop table t2; +create table t1(a int auto_increment, key(a)) engine=tokudb; +create table t2(b int auto_increment, c int, key(b), foreign key(b) references t1(a)) engine=tokudb; +SET FOREIGN_KEY_CHECKS=0; +insert into t1 values (10); +insert into t1 values (null),(null),(null); +insert into t2 values (5,0); +insert into t2 values (null,last_insert_id()); +SET FOREIGN_KEY_CHECKS=1; +connection slave; +select * from t1; +a +10 +11 +12 +13 +select * from t2; +b c +5 0 +6 11 +connection master; +drop table t2; +drop table t1; +create table t1(a int auto_increment, primary key(a)); +create table t2(b int auto_increment, c int, primary key(b)); +insert into t1 values (10); +insert into t1 values (null),(null),(null); +insert into t2 values (5,0); +insert into t2 (c) select * from t1 ORDER BY a; +select * from t2 ORDER BY b; +b c +5 0 +6 10 +7 11 +8 12 +9 13 +connection slave; +select * from t1 ORDER BY a; +a +10 +11 +12 +13 +select * from t2 ORDER BY b; +b c +5 0 +6 10 +7 11 +8 12 +9 13 +connection master; +drop table t1; +drop table t2; +connection slave; +connection master; +SET TIMESTAMP=1000000000; +CREATE TABLE t1 ( a INT UNIQUE ); +SET FOREIGN_KEY_CHECKS=0; +INSERT INTO t1 VALUES (1),(1); +Got one of the listed errors +connection slave; +connection master; +drop table t1; +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_multi_update.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_multi_update.result new file mode 100644 index 00000000000..1036e753961 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_multi_update.result @@ -0,0 +1,27 @@ +include/master-slave.inc +[connection master] +call mtr.add_suppression('Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.'); +CREATE TABLE t1 ( +a int unsigned not null auto_increment primary key, +b int unsigned +) ENGINE=TokuDB; +CREATE TABLE t2 ( +a int unsigned not null auto_increment primary key, +b int unsigned +) ENGINE=TokuDB; +INSERT INTO t1 VALUES (NULL, 0); +INSERT INTO t1 SELECT NULL, 0 FROM t1; +INSERT INTO t2 VALUES (NULL, 0), (NULL,1); +SELECT * FROM t1 ORDER BY a; +a b +1 0 +2 0 +SELECT * FROM t2 ORDER BY a; +a b +1 0 +2 1 +UPDATE t1, t2 SET t1.b = t2.b WHERE t1.a = t2.a; +connection slave; +connection master; +drop table t1, t2; +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_multi_update2.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_multi_update2.result new file mode 100644 index 00000000000..e51eac13783 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_multi_update2.result @@ -0,0 +1,61 @@ +include/master-slave.inc +[connection master] +call mtr.add_suppression('Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT'); +drop table if exists t1,t2; +CREATE TABLE t1 ( +a int unsigned not null auto_increment primary key, +b int unsigned +) ENGINE=TokuDB; +CREATE TABLE t2 ( +a int unsigned not null auto_increment primary key, +b int unsigned +) ENGINE=TokuDB; +INSERT INTO t1 VALUES (NULL, 0); +INSERT INTO t1 SELECT NULL, 0 FROM t1; +INSERT INTO t2 VALUES (NULL, 0), (NULL,1); +SELECT * FROM t1 ORDER BY a; +a b +1 0 +2 0 +SELECT * FROM t2 ORDER BY a; +a b +1 0 +2 1 +UPDATE t1, t2 SET t1.b = (t2.b+4) WHERE t1.a = t2.a; +SELECT * FROM t1 ORDER BY a; +a b +1 4 +2 5 +SELECT * FROM t2 ORDER BY a; +a b +1 0 +2 1 +connection slave; +SELECT * FROM t1 ORDER BY a; +a b +1 4 +2 5 +SELECT * FROM t2 ORDER BY a; +a b +1 0 +2 1 +connection master; +drop table t1,t2; +connection slave; +reset master; +connection master; +CREATE TABLE t1 ( a INT ); +INSERT INTO t1 VALUES (0); +UPDATE t1, (SELECT 3 as b) AS x SET t1.a = x.b; +select * from t1; +a +3 +connection slave; +connection slave; +select * from t1; +a +3 +connection master; +drop table t1; +connection slave; +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_multi_update3.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_multi_update3.result new file mode 100644 index 00000000000..aae924f2ae8 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_multi_update3.result @@ -0,0 +1,208 @@ +include/master-slave.inc +[connection master] +call mtr.add_suppression('Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.'); + +-------- Test for BUG#9361 -------- +CREATE TABLE t1 ( +a int unsigned not null auto_increment primary key, +b int unsigned +) ENGINE=TokuDB; +CREATE TABLE t2 ( +a int unsigned not null auto_increment primary key, +b int unsigned +) ENGINE=TokuDB; +INSERT INTO t1 VALUES (NULL, 0); +INSERT INTO t1 SELECT NULL, 0 FROM t1; +INSERT INTO t2 VALUES (NULL, 0), (NULL,1); +SELECT * FROM t1 ORDER BY a; +a b +1 0 +2 0 +SELECT * FROM t2 ORDER BY a; +a b +1 0 +2 1 +UPDATE t2, (SELECT a FROM t1 ORDER BY a) AS t SET t2.b = t.a+5 ; +SELECT * FROM t1 ORDER BY a; +a b +1 0 +2 0 +SELECT * FROM t2 ORDER BY a; +a b +1 6 +2 6 +connection slave; +connection slave; +SELECT * FROM t1 ORDER BY a; +a b +1 0 +2 0 +SELECT * FROM t2 ORDER BY a; +a b +1 6 +2 6 +connection master; +drop table t1,t2; + +-------- Test 1 for BUG#9361 -------- +connection master; +DROP TABLE IF EXISTS t1; +DROP TABLE IF EXISTS t2; +CREATE TABLE t1 ( +a1 char(30), +a2 int, +a3 int, +a4 char(30), +a5 char(30) +); +CREATE TABLE t2 ( +b1 int, +b2 char(30) +); +INSERT INTO t1 VALUES ('Yes', 1, NULL, 'foo', 'bar'); +INSERT INTO t2 VALUES (1, 'baz'); +UPDATE t1 a, t2 +SET a.a1 = 'No' +WHERE a.a2 = +(SELECT b1 +FROM t2 +WHERE b2 = 'baz') +AND a.a3 IS NULL +AND a.a4 = 'foo' +AND a.a5 = 'bar'; +connection slave; +connection slave; +SELECT * FROM t1; +a1 a2 a3 a4 a5 +No 1 NULL foo bar +SELECT * FROM t2; +b1 b2 +1 baz +connection master; +DROP TABLE t1, t2; + +-------- Test 2 for BUG#9361 -------- +connection master; +DROP TABLE IF EXISTS t1; +DROP TABLE IF EXISTS t2; +DROP TABLE IF EXISTS t3; +CREATE TABLE t1 ( +i INT, +j INT, +x INT, +y INT, +z INT +); +CREATE TABLE t2 ( +i INT, +k INT, +x INT, +y INT, +z INT +); +CREATE TABLE t3 ( +j INT, +k INT, +x INT, +y INT, +z INT +); +INSERT INTO t1 VALUES ( 1, 2,13,14,15); +INSERT INTO t2 VALUES ( 1, 3,23,24,25); +INSERT INTO t3 VALUES ( 2, 3, 1,34,35), ( 2, 3, 1,34,36); +UPDATE t1 AS a +INNER JOIN t2 AS b +ON a.i = b.i +INNER JOIN t3 AS c +ON a.j = c.j AND b.k = c.k +SET a.x = b.x, +a.y = b.y, +a.z = ( +SELECT sum(z) +FROM t3 +WHERE y = 34 +) +WHERE b.x = 23; +connection slave; +connection slave; +SELECT * FROM t1; +i j x y z +1 2 23 24 71 +connection master; +DROP TABLE t1, t2, t3; +DROP TABLE IF EXISTS t1; +Warnings: +Note 1051 Unknown table 'test.t1' +DROP TABLE IF EXISTS t2; +Warnings: +Note 1051 Unknown table 'test.t2' +CREATE TABLE t1 ( +idp int(11) NOT NULL default '0', +idpro int(11) default NULL, +price decimal(19,4) default NULL, +PRIMARY KEY (idp) +); +CREATE TABLE t2 ( +idpro int(11) NOT NULL default '0', +price decimal(19,4) default NULL, +nbprice int(11) default NULL, +PRIMARY KEY (idpro) +); +INSERT INTO t1 VALUES +(1,1,'3.0000'), +(2,2,'1.0000'), +(3,1,'1.0000'), +(4,1,'4.0000'), +(5,3,'2.0000'), +(6,2,'4.0000'); +INSERT INTO t2 VALUES +(1,'0.0000',0), +(2,'0.0000',0), +(3,'0.0000',0); +update +t2 +join +( select idpro, min(price) as min_price, count(*) as nbr_price +from t1 +where idpro>0 and price>0 +group by idpro +) as table_price +on t2.idpro = table_price.idpro +set t2.price = table_price.min_price, +t2.nbprice = table_price.nbr_price; +select "-- MASTER AFTER JOIN --" as ""; + +-- MASTER AFTER JOIN -- +select * from t1; +idp idpro price +1 1 3.0000 +2 2 1.0000 +3 1 1.0000 +4 1 4.0000 +5 3 2.0000 +6 2 4.0000 +select * from t2; +idpro price nbprice +1 1.0000 3 +2 1.0000 2 +3 2.0000 1 +connection slave; +select "-- SLAVE AFTER JOIN --" as ""; + +-- SLAVE AFTER JOIN -- +select * from t1; +idp idpro price +1 1 3.0000 +2 2 1.0000 +3 1 1.0000 +4 1 4.0000 +5 3 2.0000 +6 2 4.0000 +select * from t2; +idpro price nbprice +1 1.0000 3 +2 1.0000 2 +3 2.0000 1 +connection master; +DROP TABLE t1, t2; +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/tokudb_rpl/r/rpl_tokudb_rfr_partition_table.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_rfr_partition_table.result similarity index 100% rename from storage/tokudb/mysql-test/tokudb_rpl/r/rpl_tokudb_rfr_partition_table.result rename to storage/tokudb/mysql-test/rpl/r/rpl_tokudb_rfr_partition_table.result diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_crash_safe.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_crash_safe.result new file mode 100644 index 00000000000..04578c3ff68 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_crash_safe.result @@ -0,0 +1,2183 @@ +include/master-slave.inc +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +[connection master] +call mtr.add_suppression('Attempting backtrace'); +call mtr.add_suppression("Recovery from master pos .* and file master-bin.000001"); +call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +call mtr.add_suppression(".* InnoDB: Warning: allocated tablespace .*, old maximum was .*"); +################################################################################### +# PREPARE EXECUTION +################################################################################### +include/stop_slave.inc +SHOW CREATE TABLE mysql.slave_relay_log_info; +Table Create Table +slave_relay_log_info CREATE TABLE `slave_relay_log_info` ( + `Number_of_lines` int(10) unsigned NOT NULL COMMENT 'Number of lines in the file or rows in the table. Used to version table definitions.', + `Relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'The name of the current relay log file.', + `Relay_log_pos` bigint(20) unsigned NOT NULL COMMENT 'The relay log position of the last executed event.', + `Master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'The name of the master binary log file from which the events in the relay log file were read.', + `Master_log_pos` bigint(20) unsigned NOT NULL COMMENT 'The master log position of the last executed event.', + `Sql_delay` int(11) NOT NULL COMMENT 'The number of seconds that the slave must lag behind the master.', + `Number_of_workers` int(10) unsigned NOT NULL, + `Id` int(10) unsigned NOT NULL COMMENT 'Internal Id that uniquely identifies this record.', + PRIMARY KEY (`Id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 STATS_PERSISTENT=0 COMMENT='Relay Log Information' +SHOW CREATE TABLE mysql.slave_worker_info; +Table Create Table +slave_worker_info CREATE TABLE `slave_worker_info` ( + `Id` int(10) unsigned NOT NULL, + `Relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `Relay_log_pos` bigint(20) unsigned NOT NULL, + `Master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `Master_log_pos` bigint(20) unsigned NOT NULL, + `Checkpoint_relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `Checkpoint_relay_log_pos` bigint(20) unsigned NOT NULL, + `Checkpoint_master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `Checkpoint_master_log_pos` bigint(20) unsigned NOT NULL, + `Checkpoint_seqno` int(10) unsigned NOT NULL, + `Checkpoint_group_size` int(10) unsigned NOT NULL, + `Checkpoint_group_bitmap` blob NOT NULL, + PRIMARY KEY (`Id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 STATS_PERSISTENT=0 COMMENT='Worker Information' +ALTER TABLE mysql.slave_relay_log_info ENGINE= Innodb; +ALTER TABLE mysql.slave_worker_info ENGINE= Innodb; +SHOW CREATE TABLE mysql.slave_relay_log_info; +Table Create Table +slave_relay_log_info CREATE TABLE `slave_relay_log_info` ( + `Number_of_lines` int(10) unsigned NOT NULL COMMENT 'Number of lines in the file or rows in the table. Used to version table definitions.', + `Relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'The name of the current relay log file.', + `Relay_log_pos` bigint(20) unsigned NOT NULL COMMENT 'The relay log position of the last executed event.', + `Master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'The name of the master binary log file from which the events in the relay log file were read.', + `Master_log_pos` bigint(20) unsigned NOT NULL COMMENT 'The master log position of the last executed event.', + `Sql_delay` int(11) NOT NULL COMMENT 'The number of seconds that the slave must lag behind the master.', + `Number_of_workers` int(10) unsigned NOT NULL, + `Id` int(10) unsigned NOT NULL COMMENT 'Internal Id that uniquely identifies this record.', + PRIMARY KEY (`Id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 STATS_PERSISTENT=0 COMMENT='Relay Log Information' +SHOW CREATE TABLE mysql.slave_worker_info; +Table Create Table +slave_worker_info CREATE TABLE `slave_worker_info` ( + `Id` int(10) unsigned NOT NULL, + `Relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `Relay_log_pos` bigint(20) unsigned NOT NULL, + `Master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `Master_log_pos` bigint(20) unsigned NOT NULL, + `Checkpoint_relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `Checkpoint_relay_log_pos` bigint(20) unsigned NOT NULL, + `Checkpoint_master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `Checkpoint_master_log_pos` bigint(20) unsigned NOT NULL, + `Checkpoint_seqno` int(10) unsigned NOT NULL, + `Checkpoint_group_size` int(10) unsigned NOT NULL, + `Checkpoint_group_bitmap` blob NOT NULL, + PRIMARY KEY (`Id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 STATS_PERSISTENT=0 COMMENT='Worker Information' +include/start_slave.inc +rpl_mixing_engines.inc [commands=configure] +CREATE TABLE nt_1 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = MyISAM; +CREATE TABLE nt_2 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = MyISAM; +CREATE TABLE nt_3 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = MyISAM; +CREATE TABLE nt_4 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = MyISAM; +CREATE TABLE nt_5 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = MyISAM; +CREATE TABLE nt_6 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = MyISAM; +CREATE TABLE tt_1 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = TokuDB; +CREATE TABLE tt_2 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = TokuDB; +CREATE TABLE tt_3 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = TokuDB; +CREATE TABLE tt_4 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = TokuDB; +CREATE TABLE tt_5 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = TokuDB; +CREATE TABLE tt_6 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = TokuDB; +INSERT INTO nt_1(trans_id, stmt_id) VALUES(1,1); +INSERT INTO nt_2(trans_id, stmt_id) VALUES(1,1); +INSERT INTO nt_3(trans_id, stmt_id) VALUES(1,1); +INSERT INTO nt_4(trans_id, stmt_id) VALUES(1,1); +INSERT INTO nt_5(trans_id, stmt_id) VALUES(1,1); +INSERT INTO nt_6(trans_id, stmt_id) VALUES(1,1); +INSERT INTO tt_1(trans_id, stmt_id) VALUES(1,1); +INSERT INTO tt_2(trans_id, stmt_id) VALUES(1,1); +INSERT INTO tt_3(trans_id, stmt_id) VALUES(1,1); +INSERT INTO tt_4(trans_id, stmt_id) VALUES(1,1); +INSERT INTO tt_5(trans_id, stmt_id) VALUES(1,1); +INSERT INTO tt_6(trans_id, stmt_id) VALUES(1,1); +CREATE PROCEDURE pc_i_tt_5_suc (IN p_trans_id INTEGER, IN p_stmt_id INTEGER) +BEGIN +DECLARE in_stmt_id INTEGER; +SELECT max(stmt_id) INTO in_stmt_id FROM tt_5 WHERE trans_id= p_trans_id; +SELECT COALESCE(greatest(in_stmt_id + 1, p_stmt_id), 1) INTO in_stmt_id; +INSERT INTO tt_5(trans_id, stmt_id) VALUES (p_trans_id, in_stmt_id); +INSERT INTO tt_5(trans_id, stmt_id) VALUES (p_trans_id, in_stmt_id + 1); +END| +CREATE PROCEDURE pc_i_nt_5_suc (IN p_trans_id INTEGER, IN p_stmt_id INTEGER) +BEGIN +DECLARE in_stmt_id INTEGER; +SELECT max(stmt_id) INTO in_stmt_id FROM nt_5 WHERE trans_id= p_trans_id; +SELECT COALESCE(greatest(in_stmt_id + 1, p_stmt_id), 1) INTO in_stmt_id; +INSERT INTO nt_5(trans_id, stmt_id) VALUES (p_trans_id, in_stmt_id); +INSERT INTO nt_5(trans_id, stmt_id) VALUES (p_trans_id, in_stmt_id + 1); +END| +CREATE FUNCTION fc_i_tt_5_suc (p_trans_id INTEGER, p_stmt_id INTEGER) RETURNS VARCHAR(64) +BEGIN +DECLARE in_stmt_id INTEGER; +SELECT max(stmt_id) INTO in_stmt_id FROM tt_5 WHERE trans_id= p_trans_id; +SELECT COALESCE(greatest(in_stmt_id + 1, p_stmt_id), 1) INTO in_stmt_id; +INSERT INTO tt_5(trans_id, stmt_id) VALUES (p_trans_id, in_stmt_id); +INSERT INTO tt_5(trans_id, stmt_id) VALUES (p_trans_id, in_stmt_id + 1); +RETURN "fc_i_tt_5_suc"; +END| +CREATE FUNCTION fc_i_nt_5_suc (p_trans_id INTEGER, p_stmt_id INTEGER) RETURNS VARCHAR(64) +BEGIN +DECLARE in_stmt_id INTEGER; +SELECT max(stmt_id) INTO in_stmt_id FROM nt_5 WHERE trans_id= p_trans_id; +SELECT COALESCE(greatest(in_stmt_id + 1, p_stmt_id), 1) INTO in_stmt_id; +INSERT INTO nt_5(trans_id, stmt_id) VALUES (p_trans_id, in_stmt_id); +INSERT INTO nt_5(trans_id, stmt_id) VALUES (p_trans_id, in_stmt_id + 1); +RETURN "fc_i_nt_5_suc"; +END| +CREATE FUNCTION fc_i_nt_3_tt_3_suc (p_trans_id INTEGER, p_stmt_id INTEGER) RETURNS VARCHAR(64) +BEGIN +DECLARE in_stmt_id INTEGER; +SELECT max(stmt_id) INTO in_stmt_id FROM nt_3 WHERE trans_id= p_trans_id; +SELECT COALESCE(greatest(in_stmt_id + 1, p_stmt_id), 1) INTO in_stmt_id; +INSERT INTO nt_3(trans_id, stmt_id) VALUES (p_trans_id, in_stmt_id); +SELECT max(stmt_id) INTO in_stmt_id FROM tt_3 WHERE trans_id= p_trans_id; +SELECT COALESCE(greatest(in_stmt_id + 1, p_stmt_id), 1) INTO in_stmt_id; +INSERT INTO tt_3(trans_id, stmt_id) VALUES (p_trans_id, in_stmt_id); +RETURN "fc_i_nt_3_tt_3_suc"; +END| +CREATE TRIGGER tr_i_tt_3_to_nt_3 AFTER INSERT ON tt_3 FOR EACH ROW +BEGIN +DECLARE in_stmt_id INTEGER; +SELECT max(stmt_id) INTO in_stmt_id FROM nt_3 WHERE trans_id= NEW.trans_id; +SELECT COALESCE(greatest(in_stmt_id + 1, NEW.stmt_id), 1) INTO in_stmt_id; +INSERT INTO nt_3(trans_id, stmt_id) VALUES (NEW.trans_id, in_stmt_id); +INSERT INTO nt_3(trans_id, stmt_id) VALUES (NEW.trans_id, in_stmt_id + 1); +END| +CREATE TRIGGER tr_i_nt_4_to_tt_4 AFTER INSERT ON nt_4 FOR EACH ROW +BEGIN +DECLARE in_stmt_id INTEGER; +SELECT max(stmt_id) INTO in_stmt_id FROM tt_4 WHERE trans_id= NEW.trans_id; +SELECT COALESCE(greatest(in_stmt_id + 1, NEW.stmt_id), 1) INTO in_stmt_id; +INSERT INTO tt_4(trans_id, stmt_id) VALUES (NEW.trans_id, in_stmt_id); +INSERT INTO tt_4(trans_id, stmt_id) VALUES (NEW.trans_id, in_stmt_id + 1); +END| +CREATE TRIGGER tr_i_tt_5_to_tt_6 AFTER INSERT ON tt_5 FOR EACH ROW +BEGIN +DECLARE in_stmt_id INTEGER; +SELECT max(stmt_id) INTO in_stmt_id FROM tt_6 WHERE trans_id= NEW.trans_id; +SELECT COALESCE(greatest(in_stmt_id + 1, NEW.stmt_id, 1), 1) INTO in_stmt_id; +INSERT INTO tt_6(trans_id, stmt_id) VALUES (NEW.trans_id, in_stmt_id); +INSERT INTO tt_6(trans_id, stmt_id) VALUES (NEW.trans_id, in_stmt_id + 1); +END| +CREATE TRIGGER tr_i_nt_5_to_nt_6 AFTER INSERT ON nt_5 FOR EACH ROW +BEGIN +DECLARE in_stmt_id INTEGER; +SELECT max(stmt_id) INTO in_stmt_id FROM nt_6 WHERE trans_id= NEW.trans_id; +SELECT COALESCE(greatest(in_stmt_id + 1, NEW.stmt_id), 1) INTO in_stmt_id; +INSERT INTO nt_6(trans_id, stmt_id) VALUES (NEW.trans_id, in_stmt_id); +INSERT INTO nt_6(trans_id, stmt_id) VALUES (NEW.trans_id, in_stmt_id + 1); +END| +################################################################################### +# EXECUTE CASES CRASHING THE XID +################################################################################### + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_apply";; +FAILURE d,crash_after_apply and OUTCOME O2 +rpl_mixing_engines.inc [commands=T] +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (7, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_apply";; +FAILURE d,crash_after_apply and OUTCOME O2 +rpl_mixing_engines.inc [commands=T-trig] +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (8, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_apply";; +FAILURE d,crash_after_apply and OUTCOME O2 +rpl_mixing_engines.inc [commands=T-func] +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (9, 1); +fc_i_tt_5_suc (9, 1) +fc_i_tt_5_suc +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_apply";; +FAILURE d,crash_after_apply and OUTCOME O2 +rpl_mixing_engines.inc [commands=T-proc] +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (10, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_apply";; +FAILURE d,crash_after_apply and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T T-trig C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (11, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (11, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-trig C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-trig C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_apply";; +FAILURE d,crash_after_apply and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T T-func C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (12, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (12, 4); +fc_i_tt_5_suc (12, 4) +fc_i_tt_5_suc +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-func C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-func C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_apply";; +FAILURE d,crash_after_apply and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T T-proc C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (13, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (13, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-proc C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-proc C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_apply";; +FAILURE d,crash_after_apply and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T-trig T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (14, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (14, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-trig T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-trig T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_apply";; +FAILURE d,crash_after_apply and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T-func T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (15, 2); +fc_i_tt_5_suc (15, 2) +fc_i_tt_5_suc +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (15, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-func T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-func T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_apply";; +FAILURE d,crash_after_apply and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T-proc T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (16, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (16, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-proc T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-proc T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_before_update_pos";; +FAILURE d,crash_before_update_pos and OUTCOME O1 +rpl_mixing_engines.inc [commands=T] +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (17, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_before_update_pos";; +FAILURE d,crash_before_update_pos and OUTCOME O1 +rpl_mixing_engines.inc [commands=T-trig] +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (18, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_before_update_pos";; +FAILURE d,crash_before_update_pos and OUTCOME O1 +rpl_mixing_engines.inc [commands=T-func] +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (19, 1); +fc_i_tt_5_suc (19, 1) +fc_i_tt_5_suc +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_before_update_pos";; +FAILURE d,crash_before_update_pos and OUTCOME O1 +rpl_mixing_engines.inc [commands=T-proc] +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (20, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_before_update_pos";; +FAILURE d,crash_before_update_pos and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T T-trig C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (21, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (21, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-trig C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-trig C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_before_update_pos";; +FAILURE d,crash_before_update_pos and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T T-func C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (22, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (22, 4); +fc_i_tt_5_suc (22, 4) +fc_i_tt_5_suc +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-func C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-func C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_before_update_pos";; +FAILURE d,crash_before_update_pos and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T T-proc C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (23, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (23, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-proc C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-proc C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_before_update_pos";; +FAILURE d,crash_before_update_pos and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T-trig T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (24, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (24, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-trig T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-trig T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_before_update_pos";; +FAILURE d,crash_before_update_pos and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T-func T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (25, 2); +fc_i_tt_5_suc (25, 2) +fc_i_tt_5_suc +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (25, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-func T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-func T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_before_update_pos";; +FAILURE d,crash_before_update_pos and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T-proc T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (26, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (26, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-proc T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-proc T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_update_pos_before_apply";; +FAILURE d,crash_after_update_pos_before_apply and OUTCOME O1 +rpl_mixing_engines.inc [commands=T] +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (27, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_update_pos_before_apply";; +FAILURE d,crash_after_update_pos_before_apply and OUTCOME O1 +rpl_mixing_engines.inc [commands=T-trig] +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (28, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_update_pos_before_apply";; +FAILURE d,crash_after_update_pos_before_apply and OUTCOME O1 +rpl_mixing_engines.inc [commands=T-func] +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (29, 1); +fc_i_tt_5_suc (29, 1) +fc_i_tt_5_suc +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_update_pos_before_apply";; +FAILURE d,crash_after_update_pos_before_apply and OUTCOME O1 +rpl_mixing_engines.inc [commands=T-proc] +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (30, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_update_pos_before_apply";; +FAILURE d,crash_after_update_pos_before_apply and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T T-trig C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (31, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (31, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-trig C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-trig C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_update_pos_before_apply";; +FAILURE d,crash_after_update_pos_before_apply and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T T-func C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (32, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (32, 4); +fc_i_tt_5_suc (32, 4) +fc_i_tt_5_suc +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-func C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-func C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_update_pos_before_apply";; +FAILURE d,crash_after_update_pos_before_apply and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T T-proc C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (33, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (33, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-proc C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-proc C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_update_pos_before_apply";; +FAILURE d,crash_after_update_pos_before_apply and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T-trig T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (34, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (34, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-trig T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-trig T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_update_pos_before_apply";; +FAILURE d,crash_after_update_pos_before_apply and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T-func T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (35, 2); +fc_i_tt_5_suc (35, 2) +fc_i_tt_5_suc +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (35, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-func T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-func T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_update_pos_before_apply";; +FAILURE d,crash_after_update_pos_before_apply and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T-proc T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (36, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (36, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-proc T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-proc T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_before_update_pos";; +FAILURE d,crash_after_commit_before_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=T] +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (37, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_before_update_pos";; +FAILURE d,crash_after_commit_before_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=T-trig] +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (38, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_before_update_pos";; +FAILURE d,crash_after_commit_before_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=T-func] +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (39, 1); +fc_i_tt_5_suc (39, 1) +fc_i_tt_5_suc +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_before_update_pos";; +FAILURE d,crash_after_commit_before_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=T-proc] +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (40, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_before_update_pos";; +FAILURE d,crash_after_commit_before_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T T-trig C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (41, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (41, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-trig C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-trig C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_before_update_pos";; +FAILURE d,crash_after_commit_before_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T T-func C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (42, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (42, 4); +fc_i_tt_5_suc (42, 4) +fc_i_tt_5_suc +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-func C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-func C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_before_update_pos";; +FAILURE d,crash_after_commit_before_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T T-proc C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (43, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (43, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-proc C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-proc C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_before_update_pos";; +FAILURE d,crash_after_commit_before_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T-trig T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (44, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (44, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-trig T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-trig T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_before_update_pos";; +FAILURE d,crash_after_commit_before_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T-func T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (45, 2); +fc_i_tt_5_suc (45, 2) +fc_i_tt_5_suc +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (45, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-func T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-func T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_before_update_pos";; +FAILURE d,crash_after_commit_before_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T-proc T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (46, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (46, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-proc T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_5) +master-bin.000001 # Table_map # # table_id: # (test.tt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-proc T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc +################################################################################### +# EXECUTE CASES CRASHING THE BEGIN/COMMIT +################################################################################### + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_and_update_pos";; +FAILURE d,crash_after_commit_and_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=N] +-b-b-b-b-b-b-b-b-b-b-b- >> N << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO nt_1(trans_id, stmt_id) VALUES (47, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.nt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Query # # COMMIT +-e-e-e-e-e-e-e-e-e-e-e- >> N << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> N << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.nt_1) +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Query # # COMMIT +-e-e-e-e-e-e-e-e-e-e-e- >> N << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_and_update_pos";; +FAILURE d,crash_after_commit_and_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=N-trig] +-b-b-b-b-b-b-b-b-b-b-b- >> N-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO nt_5(trans_id, stmt_id) VALUES (48, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.nt_5) +master-bin.000001 # Table_map # # table_id: # (test.nt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Query # # COMMIT +-e-e-e-e-e-e-e-e-e-e-e- >> N-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> N-trig << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.nt_5) +master-bin.000001 # Table_map # # table_id: # (test.nt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Query # # COMMIT +-e-e-e-e-e-e-e-e-e-e-e- >> N-trig << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_and_update_pos";; +FAILURE d,crash_after_commit_and_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=N-func] +-b-b-b-b-b-b-b-b-b-b-b- >> N-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_nt_5_suc (49, 1); +fc_i_nt_5_suc (49, 1) +fc_i_nt_5_suc +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.nt_5) +master-bin.000001 # Table_map # # table_id: # (test.nt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Query # # COMMIT +-e-e-e-e-e-e-e-e-e-e-e- >> N-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> N-func << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Table_map # # table_id: # (test.nt_5) +master-bin.000001 # Table_map # # table_id: # (test.nt_6) +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F +master-bin.000001 # Query # # COMMIT +-e-e-e-e-e-e-e-e-e-e-e- >> N-func << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc +################################################################################### +# CHECK CONSISTENCY +################################################################################### +include/sync_slave_sql_with_master.inc +################################################################################### +# CLEAN +################################################################################### +rpl_mixing_engines.inc [commands=clean] +DROP TABLE tt_1; +DROP TABLE tt_2; +DROP TABLE tt_3; +DROP TABLE tt_4; +DROP TABLE tt_5; +DROP TABLE tt_6; +DROP TABLE nt_1; +DROP TABLE nt_2; +DROP TABLE nt_3; +DROP TABLE nt_4; +DROP TABLE nt_5; +DROP TABLE nt_6; +DROP PROCEDURE pc_i_tt_5_suc; +DROP PROCEDURE pc_i_nt_5_suc; +DROP FUNCTION fc_i_tt_5_suc; +DROP FUNCTION fc_i_nt_5_suc; +DROP FUNCTION fc_i_nt_3_tt_3_suc; +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_img_blobs.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_img_blobs.result new file mode 100644 index 00000000000..a0713d01593 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_img_blobs.result @@ -0,0 +1,4739 @@ +include/rpl_init.inc [topology=1->2->3] +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +CON: 'server_1', IMG: 'NOBLOB', RESTART SLAVE: 'N' +SET SESSION binlog_row_image= 'NOBLOB'; +SET GLOBAL binlog_row_image= 'NOBLOB'; +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image NOBLOB +CON: 'server_2', IMG: 'NOBLOB', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'NOBLOB'; +SET GLOBAL binlog_row_image= 'NOBLOB'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image NOBLOB +CON: 'server_3', IMG: 'NOBLOB', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'NOBLOB'; +SET GLOBAL binlog_row_image= 'NOBLOB'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image NOBLOB +### engines: TokuDB, TokuDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, TokuDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, InnoDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, InnoDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, TokuDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, TokuDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, InnoDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, InnoDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +CON: 'server_1', IMG: 'MINIMAL', RESTART SLAVE: 'N' +SET SESSION binlog_row_image= 'MINIMAL'; +SET GLOBAL binlog_row_image= 'MINIMAL'; +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image MINIMAL +CON: 'server_2', IMG: 'MINIMAL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'MINIMAL'; +SET GLOBAL binlog_row_image= 'MINIMAL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image MINIMAL +CON: 'server_3', IMG: 'MINIMAL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'MINIMAL'; +SET GLOBAL binlog_row_image= 'MINIMAL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image MINIMAL +### engines: TokuDB, TokuDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, TokuDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, InnoDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, InnoDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, TokuDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, TokuDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, InnoDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, InnoDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +CON: 'server_1', IMG: 'FULL', RESTART SLAVE: 'N' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +CON: 'server_2', IMG: 'FULL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +CON: 'server_3', IMG: 'FULL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +### engines: TokuDB, TokuDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, TokuDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, InnoDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, InnoDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, TokuDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, TokuDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, InnoDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, InnoDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check when there is no key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the AI (they are not updated) +### will not break replication (check even if there is a key in the table) +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (UK NOT NULL exists in the table) +### will not break replication +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that updates without blobs in the BI (PK exists int the table) +### will not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob in a key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a unique (not null) key does not break replication +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Asserts that declaring a blob as part of a primary key does not break replication +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_img_eng_full.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_img_eng_full.result new file mode 100644 index 00000000000..d86105a3440 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_img_eng_full.result @@ -0,0 +1,3681 @@ +include/rpl_init.inc [topology=1->2->3] +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +CON: 'server_1', IMG: 'FULL', RESTART SLAVE: 'N' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +CON: 'server_2', IMG: 'FULL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +CON: 'server_3', IMG: 'FULL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +### engines: TokuDB, TokuDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, TokuDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, InnoDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, InnoDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, TokuDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, TokuDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, InnoDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, InnoDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### Testing with TokuDB storage engine +CON: 'server_1', IMG: 'MINIMAL', RESTART SLAVE: 'N' +SET SESSION binlog_row_image= 'MINIMAL'; +SET GLOBAL binlog_row_image= 'MINIMAL'; +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image MINIMAL +CON: 'server_2', IMG: 'MINIMAL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'MINIMAL'; +SET GLOBAL binlog_row_image= 'MINIMAL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image MINIMAL +CON: 'server_3', IMG: 'MINIMAL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'MINIMAL'; +SET GLOBAL binlog_row_image= 'MINIMAL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image MINIMAL +#### case #1: AI: no values logged +CREATE TABLE t1 (c1 int DEFAULT 100) Engine=ENGINE; +INSERT INTO t1 VALUES (); +SELECT * FROM t1; +c1 +100 +include/rpl_sync.inc +SELECT * FROM t1; +c1 +100 +SELECT * FROM t1; +c1 +100 +DROP TABLE t1; +include/rpl_sync.inc +#### case #2: AI: not empty but slave does not have usable data for its columns (INSERT) +CREATE TABLE t1 (c1 int DEFAULT 100) Engine=ENGINE; +SET SQL_LOG_BIN=0; +CREATE TABLE t1 (c1 int DEFAULT 100) Engine=ENGINE; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=0; +CREATE TABLE t1 (c1 int DEFAULT 100, c2 int, primary key(c2)) Engine=ENGINE; +SET SQL_LOG_BIN=1; +INSERT INTO t1(c2) VALUES (1); +SELECT * FROM t1; +c1 c2 +100 1 +include/rpl_sync.inc +SELECT * FROM t1; +c1 +100 +SELECT * FROM t1; +c1 +100 +DROP TABLE t1; +include/rpl_sync.inc +#### case #3: BI: usable columns on the slave, AI: no usable columns on the slave +CREATE TABLE t1 (c1 int DEFAULT 100) Engine=ENGINE; +SET SQL_LOG_BIN=0; +CREATE TABLE t1 (c1 int DEFAULT 100) Engine=ENGINE; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=0; +CREATE TABLE t1 (c1 int DEFAULT 100, c2 int) Engine=ENGINE; +SET SQL_LOG_BIN=1; +INSERT INTO t1 VALUES (1,1); +SELECT * FROM t1; +c1 c2 +1 1 +include/rpl_sync.inc +SELECT * FROM t1; +c1 +1 +SELECT * FROM t1; +c1 +1 +UPDATE t1 SET c2=2 WHERE c1=1 AND c2=1; +SELECT * FROM t1; +c1 c2 +1 2 +include/rpl_sync.inc +SELECT * FROM t1; +c1 +1 +SELECT * FROM t1; +c1 +1 +DROP TABLE t1; +include/rpl_sync.inc +#### case #4: AI, BI: no usable columns on the slave (NOOP UPDATE). +#### +CREATE TABLE t1 (c1 int DEFAULT 100) Engine=ENGINE; +SET SQL_LOG_BIN=0; +CREATE TABLE t1 (c1 int DEFAULT 100) Engine=ENGINE; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=0; +CREATE TABLE t1 (c1 int DEFAULT 100, c2 int, c3 int, primary key(c2)) Engine=ENGINE; +SET SQL_LOG_BIN=1; +INSERT INTO t1 VALUES (1,1,1); +SELECT * FROM t1; +c1 c2 c3 +1 1 1 +include/rpl_sync.inc +SELECT * FROM t1; +c1 +1 +SELECT * FROM t1; +c1 +1 +UPDATE t1 SET c3=300 WHERE c2=1; +SELECT * FROM t1; +c1 c2 c3 +1 1 300 +include/rpl_sync.inc +SELECT * FROM t1; +c1 +1 +SELECT * FROM t1; +c1 +1 +DROP TABLE t1; +include/rpl_sync.inc +#### case #5: BI: no usable columns on the slave, AI: usable columns on the slave (slave must stop). +#### +CREATE TABLE t1 (c1 INT DEFAULT 100) Engine=ENGINE; +SET SQL_LOG_BIN=0; +CREATE TABLE t1 (c1 INT DEFAULT 100) Engine=ENGINE; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=0; +CREATE TABLE t1 (c1 INT DEFAULT 100, c2 INT PRIMARY KEY) Engine=ENGINE; +SET SQL_LOG_BIN=1; +INSERT INTO t1 VALUES (1,1); +SELECT * FROM t1; +c1 c2 +1 1 +include/rpl_sync.inc +SELECT * FROM t1; +c1 +1 +SELECT * FROM t1; +c1 +1 +UPDATE t1 SET c1=300 WHERE c2=1; +SELECT * FROM t1; +c1 c2 +300 1 +SET SQL_LOG_BIN=0; +call mtr.add_suppression("Slave: Can\'t find record in \'t1\' Error_code: 1032"); +call mtr.add_suppression("Slave SQL: .*Could not execute Update_rows event on table test.t1; Can.t find record in .t1.* Error_code: 1032"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); +SET SQL_LOG_BIN=1; +include/wait_for_slave_sql_error_and_skip.inc [errno=1032] +DROP TABLE t1; +include/rpl_sync.inc +CON: 'server_1', IMG: 'FULL', RESTART SLAVE: 'N' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +CON: 'server_2', IMG: 'FULL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +CON: 'server_3', IMG: 'FULL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_img_eng_min.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_img_eng_min.result new file mode 100644 index 00000000000..45a5e6ee341 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_img_eng_min.result @@ -0,0 +1,3522 @@ +include/rpl_init.inc [topology=1->2->3] +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +CON: 'server_1', IMG: 'MINIMAL', RESTART SLAVE: 'N' +SET SESSION binlog_row_image= 'MINIMAL'; +SET GLOBAL binlog_row_image= 'MINIMAL'; +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image MINIMAL +CON: 'server_2', IMG: 'MINIMAL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'MINIMAL'; +SET GLOBAL binlog_row_image= 'MINIMAL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image MINIMAL +CON: 'server_3', IMG: 'MINIMAL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'MINIMAL'; +SET GLOBAL binlog_row_image= 'MINIMAL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image MINIMAL +### engines: TokuDB, TokuDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, TokuDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, InnoDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, InnoDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, TokuDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, TokuDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, InnoDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, InnoDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +CON: 'server_1', IMG: 'FULL', RESTART SLAVE: 'N' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +CON: 'server_2', IMG: 'FULL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +CON: 'server_3', IMG: 'FULL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_img_eng_noblob.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_img_eng_noblob.result new file mode 100644 index 00000000000..52906a7ee36 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_img_eng_noblob.result @@ -0,0 +1,3522 @@ +include/rpl_init.inc [topology=1->2->3] +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +CON: 'server_1', IMG: 'NOBLOB', RESTART SLAVE: 'N' +SET SESSION binlog_row_image= 'NOBLOB'; +SET GLOBAL binlog_row_image= 'NOBLOB'; +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image NOBLOB +CON: 'server_2', IMG: 'NOBLOB', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'NOBLOB'; +SET GLOBAL binlog_row_image= 'NOBLOB'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image NOBLOB +CON: 'server_3', IMG: 'NOBLOB', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'NOBLOB'; +SET GLOBAL binlog_row_image= 'NOBLOB'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image NOBLOB +### engines: TokuDB, TokuDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, TokuDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, InnoDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, InnoDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, TokuDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, TokuDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, InnoDB, TokuDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, InnoDB, InnoDB +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes in master, but NULLABLE on first slave +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite NOT NULL Unique key with holes +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int NOT NULL, c2 char(1), c3 char(1) NOT NULL, c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key with holes +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c3)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Primary Key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Primary key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Unique key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), unique key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +****** TEST: One Composite key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1,c2)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: One key +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1), key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +******* TEST: No keys +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 char(1), c3 char(1), c4 char(1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, '1', '1', '1' ); +INSERT INTO t VALUES (4, '4', '4', '4' ); +INSERT INTO t VALUES (7, '7', '7', '7' ); +INSERT INTO t VALUES (9, '9', '9', NULL ); +INSERT INTO t VALUES (2, '1', '2', '2' ); +INSERT INTO t VALUES (3, '1', '3', '2' ); +include/rpl_sync.inc +UPDATE t SET c4 = '7'; +UPDATE t SET c4 = '5' WHERE c1 = 1; +UPDATE t SET c2 = '5' WHERE c1 = 1; +UPDATE t SET c1 = '5' WHERE c1 = 1; +UPDATE t SET c4 = '8' WHERE c2 = '4'; +UPDATE t SET c1 = '8' WHERE c2 = '4'; +UPDATE t SET c2 = '8' WHERE c2 = '4'; +UPDATE t SET c3 = '0' WHERE c4 = NULL; +UPDATE t SET c2 = '0' WHERE c4 = '0'; +UPDATE t SET c2 = '2' WHERE c4 = '2'; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c1 = 7; +DELETE FROM t WHERE c1 = 8; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +CON: 'server_1', IMG: 'FULL', RESTART SLAVE: 'N' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +CON: 'server_2', IMG: 'FULL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +CON: 'server_3', IMG: 'FULL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_img_idx_full.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_img_idx_full.result new file mode 100644 index 00000000000..e802156918e --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_img_idx_full.result @@ -0,0 +1,3505 @@ +include/rpl_init.inc [topology=1->2->3] +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +CON: 'server_1', IMG: 'FULL', RESTART SLAVE: 'N' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +CON: 'server_2', IMG: 'FULL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +CON: 'server_3', IMG: 'FULL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +### engines: TokuDB, TokuDB, TokuDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, TokuDB, InnoDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, InnoDB, TokuDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, InnoDB, InnoDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, TokuDB, TokuDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, TokuDB, InnoDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, InnoDB, TokuDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, InnoDB, InnoDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_img_idx_min.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_img_idx_min.result new file mode 100644 index 00000000000..368b3b5f938 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_img_idx_min.result @@ -0,0 +1,3530 @@ +include/rpl_init.inc [topology=1->2->3] +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +CON: 'server_1', IMG: 'MINIMAL', RESTART SLAVE: 'N' +SET SESSION binlog_row_image= 'MINIMAL'; +SET GLOBAL binlog_row_image= 'MINIMAL'; +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image MINIMAL +CON: 'server_2', IMG: 'MINIMAL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'MINIMAL'; +SET GLOBAL binlog_row_image= 'MINIMAL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image MINIMAL +CON: 'server_3', IMG: 'MINIMAL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'MINIMAL'; +SET GLOBAL binlog_row_image= 'MINIMAL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image MINIMAL +### engines: TokuDB, TokuDB, TokuDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, TokuDB, InnoDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, InnoDB, TokuDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, InnoDB, InnoDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, TokuDB, TokuDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, TokuDB, InnoDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, InnoDB, TokuDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, InnoDB, InnoDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +CON: 'server_1', IMG: 'FULL', RESTART SLAVE: 'N' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +CON: 'server_2', IMG: 'FULL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +CON: 'server_3', IMG: 'FULL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_img_idx_noblob.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_img_idx_noblob.result new file mode 100644 index 00000000000..bb6c3ea1c3e --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_img_idx_noblob.result @@ -0,0 +1,3530 @@ +include/rpl_init.inc [topology=1->2->3] +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +CON: 'server_1', IMG: 'NOBLOB', RESTART SLAVE: 'N' +SET SESSION binlog_row_image= 'NOBLOB'; +SET GLOBAL binlog_row_image= 'NOBLOB'; +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image NOBLOB +CON: 'server_2', IMG: 'NOBLOB', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'NOBLOB'; +SET GLOBAL binlog_row_image= 'NOBLOB'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image NOBLOB +CON: 'server_3', IMG: 'NOBLOB', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'NOBLOB'; +SET GLOBAL binlog_row_image= 'NOBLOB'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image NOBLOB +### engines: TokuDB, TokuDB, TokuDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, TokuDB, InnoDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, InnoDB, TokuDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: TokuDB, InnoDB, InnoDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, TokuDB, TokuDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, TokuDB, InnoDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= TokuDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, InnoDB, TokuDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= TokuDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +### engines: InnoDB, InnoDB, InnoDB +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no keys slaves with no keys as well +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with keys +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields (first slave with UK NOT NULL, second with PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with no key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, first slave with key on different field and second slave with key on yet another different field. +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields (first slave has UK NOT NULL) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with Key, slaves with PKs on different fields +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, slaves with no keys +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NULLABLE, first slave with K on different field second slave with key on yet another different field +CREATE TABLE t (c1 int, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL, first slave with UK NOT NULL on different field +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with UK NOT NULL and slaves with PK on different fields +CREATE TABLE t (c1 int NOT NULL, c2 blob, c3 int, unique key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and no keys on the slaves +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Master with PK and first slave with KEY only +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c3)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave (which has unique NOT NULL key instead of PK) +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +SET SQL_LOG_BIN=0; +### Different PKs on master and first slave +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512))) engine= InnoDB;; +CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine= InnoDB;; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +SET SQL_LOG_BIN=1; +INSERT INTO t VALUES (1, "a", 10); +INSERT INTO t VALUES (2, "b", 20); +INSERT INTO t VALUES (3, "c", 30); +include/rpl_sync.inc +UPDATE t SET c1=10 WHERE c2="a"; +UPDATE t SET c1=20 WHERE c1=2; +UPDATE t SET c1=30 WHERE c3=30; +UPDATE t SET c3=40 WHERE c1=30; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DELETE FROM t WHERE c2="a"; +DELETE FROM t WHERE c1=20; +DELETE FROM t; +include/rpl_sync.inc +include/diff_tables.inc [server_1:test.t, server_2:test.t, server_3:test.t] +DROP TABLE t; +include/rpl_sync.inc +CON: 'server_1', IMG: 'FULL', RESTART SLAVE: 'N' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +CON: 'server_2', IMG: 'FULL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +CON: 'server_3', IMG: 'FULL', RESTART SLAVE: 'Y' +SET SESSION binlog_row_image= 'FULL'; +SET GLOBAL binlog_row_image= 'FULL'; +include/stop_slave.inc +include/start_slave.inc +FLUSH TABLES; +SHOW VARIABLES LIKE 'binlog_row_image'; +Variable_name Value +binlog_row_image FULL +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_log.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_log.result new file mode 100644 index 00000000000..73c010c6eb7 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_log.result @@ -0,0 +1,315 @@ +include/master-slave.inc +[connection master] +connection slave; +include/stop_slave.inc +include/wait_for_slave_to_stop.inc +reset master; +reset slave; +start slave; +include/wait_for_slave_to_start.inc +connection slave; +set @save_slave_ddl_exec_mode=@@global.slave_ddl_exec_mode; +set @@global.slave_ddl_exec_mode=STRICT; +connection master; +create table t1(n int not null auto_increment primary key)ENGINE=TokuDB; +insert into t1 values (NULL); +drop table t1; +create table t1 (word char(20) not null)ENGINE=TokuDB; +load data infile 'LOAD_FILE' into table t1 ignore 1 lines; +select count(*) from t1; +count(*) +69 +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; create table t1(n int not null auto_increment primary key)ENGINE=TokuDB +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Annotate_rows # # insert into t1 values (NULL) +master-bin.000001 # Table_map # # table_id: # (test.t1) +master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server */ +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; create table t1 (word char(20) not null)ENGINE=TokuDB +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Annotate_rows # # load data infile '../../std_data/words.dat' into table t1 ignore 1 lines +master-bin.000001 # Table_map # # table_id: # (test.t1) +master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; create table t1(n int not null auto_increment primary key)ENGINE=TokuDB +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; create table t1(n int not null auto_increment primary key)ENGINE=TokuDB +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Annotate_rows # # insert into t1 values (NULL) +master-bin.000001 # Table_map # # table_id: # (test.t1) +master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +flush logs; +create table t3 (a int)ENGINE=TokuDB; +connection master; +select * from t1 order by 1 asc; +word +Aarhus +Aaron +Aaron +Ababa +Ababa +aback +aback +abaft +abaft +abandon +abandon +abandoned +abandoned +abandoning +abandoning +abandonment +abandonment +abandons +abandons +abase +abased +abasement +abasements +abases +abash +abashed +abashes +abashing +abasing +abate +abated +abatement +abatements +abater +abates +abating +Abba +abbe +abbey +abbeys +abbot +abbots +Abbott +abbreviate +abbreviated +abbreviates +abbreviating +abbreviation +abbreviations +Abby +abdomen +abdomens +abdominal +abduct +abducted +abduction +abductions +abductor +abductors +abducts +Abe +abed +Abel +Abelian +Abelson +Aberdeen +Abernathy +aberrant +aberration +connection slave; +select * from t1 order by 1 asc; +word +Aarhus +Aaron +Aaron +Ababa +Ababa +aback +aback +abaft +abaft +abandon +abandon +abandoned +abandoned +abandoning +abandoning +abandonment +abandonment +abandons +abandons +abase +abased +abasement +abasements +abases +abash +abashed +abashes +abashing +abasing +abate +abated +abatement +abatements +abater +abates +abating +Abba +abbe +abbey +abbeys +abbot +abbots +Abbott +abbreviate +abbreviated +abbreviates +abbreviating +abbreviation +abbreviations +Abby +abdomen +abdomens +abdominal +abduct +abducted +abduction +abductions +abductor +abductors +abducts +Abe +abed +Abel +Abelian +Abelson +Aberdeen +Abernathy +aberrant +aberration +flush logs; +include/stop_slave.inc +include/start_slave.inc +connection master; +create table t2 (n int)ENGINE=TokuDB; +insert into t2 values (1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; create table t1(n int not null auto_increment primary key)ENGINE=TokuDB +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Annotate_rows # # insert into t1 values (NULL) +master-bin.000001 # Table_map # # table_id: # (test.t1) +master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server */ +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; create table t1 (word char(20) not null)ENGINE=TokuDB +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Annotate_rows # # load data infile '../../std_data/words.dat' into table t1 ignore 1 lines +master-bin.000001 # Table_map # # table_id: # (test.t1) +master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Rotate # # master-bin.000002;pos=POS +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000002 # Binlog_checkpoint # # master-bin.000002 +master-bin.000002 # Gtid # # GTID #-#-# +master-bin.000002 # Query # # use `test`; create table t3 (a int)ENGINE=TokuDB +master-bin.000002 # Gtid # # GTID #-#-# +master-bin.000002 # Query # # use `test`; create table t2 (n int)ENGINE=TokuDB +master-bin.000002 # Gtid # # BEGIN GTID #-#-# +master-bin.000002 # Annotate_rows # # insert into t2 values (1) +master-bin.000002 # Table_map # # table_id: # (test.t2) +master-bin.000002 # Write_rows_v1 # # table_id: # flags: STMT_END_F +master-bin.000002 # Xid # # COMMIT /* XID */ +show binary logs; +Log_name File_size +master-bin.000001 # +master-bin.000002 # +connection slave; +show binary logs; +Log_name File_size +slave-bin.000001 # +slave-bin.000002 # +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +slave-bin.000001 # Gtid # # GTID #-#-# +slave-bin.000001 # Query # # use `test`; create table t1(n int not null auto_increment primary key)ENGINE=TokuDB +slave-bin.000001 # Gtid # # BEGIN GTID #-#-# +slave-bin.000001 # Annotate_rows # # insert into t1 values (NULL) +slave-bin.000001 # Table_map # # table_id: # (test.t1) +slave-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F +slave-bin.000001 # Xid # # COMMIT /* XID */ +slave-bin.000001 # Gtid # # GTID #-#-# +slave-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server */ +slave-bin.000001 # Gtid # # GTID #-#-# +slave-bin.000001 # Query # # use `test`; create table t1 (word char(20) not null)ENGINE=TokuDB +slave-bin.000001 # Gtid # # BEGIN GTID #-#-# +slave-bin.000001 # Annotate_rows # # load data infile '../../std_data/words.dat' into table t1 ignore 1 lines +slave-bin.000001 # Table_map # # table_id: # (test.t1) +slave-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F +slave-bin.000001 # Xid # # COMMIT /* XID */ +slave-bin.000001 # Gtid # # GTID #-#-# +slave-bin.000001 # Query # # use `test`; create table t3 (a int)ENGINE=TokuDB +slave-bin.000001 # Rotate # # slave-bin.000002;pos=POS +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +slave-bin.000002 # Binlog_checkpoint # # slave-bin.000002 +slave-bin.000002 # Gtid # # GTID #-#-# +slave-bin.000002 # Query # # use `test`; create table t2 (n int)ENGINE=TokuDB +slave-bin.000002 # Gtid # # BEGIN GTID #-#-# +slave-bin.000002 # Annotate_rows # # insert into t2 values (1) +slave-bin.000002 # Table_map # # table_id: # (test.t2) +slave-bin.000002 # Write_rows_v1 # # table_id: # flags: STMT_END_F +slave-bin.000002 # Xid # # COMMIT /* XID */ +include/check_slave_is_running.inc +show binlog events in 'slave-bin.000005' from 4; +ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Could not find target log +connection master; +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; +include/rpl_reset.inc +connection master; +create table t1(a int auto_increment primary key, b int); +insert into t1 values (NULL, 1); +set insert_id=5; +insert into t1 values (NULL, last_insert_id()), (NULL, last_insert_id()); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; create table t1(a int auto_increment primary key, b int) +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Annotate_rows # # insert into t1 values (NULL, 1) +master-bin.000001 # Table_map # # table_id: # (test.t1) +master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F +master-bin.000001 # Query # # COMMIT +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Annotate_rows # # insert into t1 values (NULL, last_insert_id()), (NULL, last_insert_id()) +master-bin.000001 # Table_map # # table_id: # (test.t1) +master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F +master-bin.000001 # Query # # COMMIT +select * from t1; +a b +1 1 +5 1 +6 1 +drop table t1; +connection slave; +set @@global.slave_ddl_exec_mode=@save_slave_ddl_exec_mode; +connection master; +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_lower_case_table_names.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_lower_case_table_names.result new file mode 100644 index 00000000000..d4a50261d60 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_lower_case_table_names.result @@ -0,0 +1,51 @@ +include/master-slave.inc +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +[connection master] +******** [ MASTER ] ******** +CREATE DATABASE BUG_37656; +use BUG_37656; +show databases like 'BUG_37656'; +Database (BUG_37656) +BUG_37656 +******** [ SLAVE ] ******** +show databases like 'bug_37656'; +Database (bug_37656) +bug_37656 +******** [ MASTER ] ******** +CREATE TABLE T1 (a int); +CREATE TABLE T2 (b int) ENGINE=TokuDB; +CREATE TABLE T3 (txt TEXT); +show tables; +Tables_in_BUG_37656 +T1 +T2 +T3 +******** [ SLAVE ] ******** +use bug_37656; +show tables; +Tables_in_bug_37656 +t2 +t3 +CREATE TABLE t1 (a INT); +******** [ MASTER ] ******** +use BUG_37656; +INSERT INTO T1 VALUES (1); +INSERT INTO T2 VALUES (1); +use test; +INSERT INTO BUG_37656.T1 VALUES (2); +INSERT INTO BUG_37656.T2 VALUES (2); +LOAD DATA INFILE '../../std_data/words.dat' INTO TABLE BUG_37656.T3; +******** [ SLAVE ] ******** +include/diff_tables.inc [master:BUG_37656.T2, slave:bug_37656.t2] +include/diff_tables.inc [master:BUG_37656.T3, slave:bug_37656.t3] +******** [ MASTER ] ******** +DROP DATABASE BUG_37656; +include/rpl_reset.inc +CREATE DATABASE B50653; +USE B50653; +CREATE PROCEDURE b50653_proc() BEGIN SELECT 1; END; +DROP PROCEDURE b50653_proc; +DROP DATABASE B50653; +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_sp003.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_sp003.result new file mode 100644 index 00000000000..c3345d52d06 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_sp003.result @@ -0,0 +1,66 @@ +include/master-slave.inc +[connection master] +connection master; +DROP PROCEDURE IF EXISTS test.p1; +DROP PROCEDURE IF EXISTS test.p2; +DROP TABLE IF EXISTS test.t1; +CREATE TABLE test.t1(a INT,PRIMARY KEY(a))ENGINE=TOKUDB; +CREATE PROCEDURE test.p1() +BEGIN +INSERT INTO test.t1 VALUES (4); +SELECT get_lock("test", 100); +UPDATE test.t1 set a=a+4 WHERE a=4; +END| +CREATE PROCEDURE test.p2() +BEGIN +UPDATE test.t1 SET a=a+1; +END| +SELECT get_lock("test", 200); +get_lock("test", 200) +1 +connection master1; +CALL test.p1(); +connection master; +CALL test.p2(); +SELECT release_lock("test"); +release_lock("test") +1 +connection master1; +get_lock("test", 100) +1 +SELECT release_lock("test"); +release_lock("test") +1 +connection master; +SELECT * FROM test.t1; +a +5 +connection slave; +connection slave; +SELECT * FROM test.t1; +a +5 +connection master; +DROP TABLE IF EXISTS test.t1; +CREATE TABLE test.t1(a INT,PRIMARY KEY(a))ENGINE=TOKUDB; +CALL test.p2(); +CALL test.p1(); +get_lock("test", 100) +1 +SELECT release_lock("test"); +release_lock("test") +1 +SELECT * FROM test.t1; +a +8 +connection slave; +connection slave; +SELECT * FROM test.t1; +a +8 +connection master; +DROP PROCEDURE IF EXISTS test.p1; +DROP PROCEDURE IF EXISTS test.p2; +DROP TABLE IF EXISTS test.t1; +connection slave; +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_sp006.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_sp006.result new file mode 100644 index 00000000000..33c6c266950 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_sp006.result @@ -0,0 +1,46 @@ +include/master-slave.inc +[connection master] +DROP TABLE IF EXISTS t1; +DROP TABLE IF EXISTS t2; +DROP PROCEDURE IF EXISTS p1; +DROP PROCEDURE IF EXISTS p2; +CREATE TABLE IF NOT EXISTS t1(name CHAR(16), birth DATE,PRIMARY KEY(name))ENGINE=TokuDB; +CREATE TABLE IF NOT EXISTS t2(name CHAR(16), age INT ,PRIMARY KEY(name))ENGINE=TokuDB; +CREATE PROCEDURE p1() +BEGIN +DECLARE done INT DEFAULT 0; +DECLARE spa CHAR(16); +DECLARE spb INT; +DECLARE cur1 CURSOR FOR SELECT name, +(YEAR(CURDATE())-YEAR(birth))-(RIGHT(CURDATE(),5)--.' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' IGNORE 1 LINES (`word`) ;file_id=# +slave-bin.000001 # Xid # # COMMIT /* XID */ +slave-bin.000001 # Gtid # # GTID #-#-# +slave-bin.000001 # Query # # use `test`; create table t3 (a int)ENGINE=TokuDB +slave-bin.000001 # Rotate # # slave-bin.000002;pos=POS +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +slave-bin.000002 # Binlog_checkpoint # # slave-bin.000002 +slave-bin.000002 # Gtid # # GTID #-#-# +slave-bin.000002 # Query # # use `test`; create table t2 (n int)ENGINE=TokuDB +slave-bin.000002 # Gtid # # BEGIN GTID #-#-# +slave-bin.000002 # Query # # use `test`; insert into t2 values (1) +slave-bin.000002 # Xid # # COMMIT /* XID */ +include/check_slave_is_running.inc +show binlog events in 'slave-bin.000005' from 4; +ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Could not find target log +connection master; +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; +include/rpl_reset.inc +connection master; +create table t1(a int auto_increment primary key, b int); +insert into t1 values (NULL, 1); +set insert_id=5; +insert into t1 values (NULL, last_insert_id()), (NULL, last_insert_id()); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; create table t1(a int auto_increment primary key, b int) +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Intvar # # INSERT_ID=1 +master-bin.000001 # Query # # use `test`; insert into t1 values (NULL, 1) +master-bin.000001 # Query # # COMMIT +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Intvar # # LAST_INSERT_ID=1 +master-bin.000001 # Intvar # # INSERT_ID=5 +master-bin.000001 # Query # # use `test`; insert into t1 values (NULL, last_insert_id()), (NULL, last_insert_id()) +master-bin.000001 # Query # # COMMIT +select * from t1; +a b +1 1 +5 1 +6 1 +drop table t1; +connection slave; +set @@global.slave_ddl_exec_mode=@save_slave_ddl_exec_mode; +connection master; +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_stm_mixed_crash_safe.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_stm_mixed_crash_safe.result new file mode 100644 index 00000000000..226a2b93140 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_stm_mixed_crash_safe.result @@ -0,0 +1,1773 @@ +include/master-slave.inc +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +[connection master] +call mtr.add_suppression('Attempting backtrace'); +call mtr.add_suppression("Recovery from master pos .* and file master-bin.000001"); +call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +call mtr.add_suppression(".* InnoDB: Warning: allocated tablespace .*, old maximum was .*"); +################################################################################### +# PREPARE EXECUTION +################################################################################### +include/stop_slave.inc +SHOW CREATE TABLE mysql.slave_relay_log_info; +Table Create Table +slave_relay_log_info CREATE TABLE `slave_relay_log_info` ( + `Number_of_lines` int(10) unsigned NOT NULL COMMENT 'Number of lines in the file or rows in the table. Used to version table definitions.', + `Relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'The name of the current relay log file.', + `Relay_log_pos` bigint(20) unsigned NOT NULL COMMENT 'The relay log position of the last executed event.', + `Master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'The name of the master binary log file from which the events in the relay log file were read.', + `Master_log_pos` bigint(20) unsigned NOT NULL COMMENT 'The master log position of the last executed event.', + `Sql_delay` int(11) NOT NULL COMMENT 'The number of seconds that the slave must lag behind the master.', + `Number_of_workers` int(10) unsigned NOT NULL, + `Id` int(10) unsigned NOT NULL COMMENT 'Internal Id that uniquely identifies this record.', + PRIMARY KEY (`Id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 STATS_PERSISTENT=0 COMMENT='Relay Log Information' +SHOW CREATE TABLE mysql.slave_worker_info; +Table Create Table +slave_worker_info CREATE TABLE `slave_worker_info` ( + `Id` int(10) unsigned NOT NULL, + `Relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `Relay_log_pos` bigint(20) unsigned NOT NULL, + `Master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `Master_log_pos` bigint(20) unsigned NOT NULL, + `Checkpoint_relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `Checkpoint_relay_log_pos` bigint(20) unsigned NOT NULL, + `Checkpoint_master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `Checkpoint_master_log_pos` bigint(20) unsigned NOT NULL, + `Checkpoint_seqno` int(10) unsigned NOT NULL, + `Checkpoint_group_size` int(10) unsigned NOT NULL, + `Checkpoint_group_bitmap` blob NOT NULL, + PRIMARY KEY (`Id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 STATS_PERSISTENT=0 COMMENT='Worker Information' +ALTER TABLE mysql.slave_relay_log_info ENGINE= Innodb; +ALTER TABLE mysql.slave_worker_info ENGINE= Innodb; +SHOW CREATE TABLE mysql.slave_relay_log_info; +Table Create Table +slave_relay_log_info CREATE TABLE `slave_relay_log_info` ( + `Number_of_lines` int(10) unsigned NOT NULL COMMENT 'Number of lines in the file or rows in the table. Used to version table definitions.', + `Relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'The name of the current relay log file.', + `Relay_log_pos` bigint(20) unsigned NOT NULL COMMENT 'The relay log position of the last executed event.', + `Master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'The name of the master binary log file from which the events in the relay log file were read.', + `Master_log_pos` bigint(20) unsigned NOT NULL COMMENT 'The master log position of the last executed event.', + `Sql_delay` int(11) NOT NULL COMMENT 'The number of seconds that the slave must lag behind the master.', + `Number_of_workers` int(10) unsigned NOT NULL, + `Id` int(10) unsigned NOT NULL COMMENT 'Internal Id that uniquely identifies this record.', + PRIMARY KEY (`Id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 STATS_PERSISTENT=0 COMMENT='Relay Log Information' +SHOW CREATE TABLE mysql.slave_worker_info; +Table Create Table +slave_worker_info CREATE TABLE `slave_worker_info` ( + `Id` int(10) unsigned NOT NULL, + `Relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `Relay_log_pos` bigint(20) unsigned NOT NULL, + `Master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `Master_log_pos` bigint(20) unsigned NOT NULL, + `Checkpoint_relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `Checkpoint_relay_log_pos` bigint(20) unsigned NOT NULL, + `Checkpoint_master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `Checkpoint_master_log_pos` bigint(20) unsigned NOT NULL, + `Checkpoint_seqno` int(10) unsigned NOT NULL, + `Checkpoint_group_size` int(10) unsigned NOT NULL, + `Checkpoint_group_bitmap` blob NOT NULL, + PRIMARY KEY (`Id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 STATS_PERSISTENT=0 COMMENT='Worker Information' +include/start_slave.inc +rpl_mixing_engines.inc [commands=configure] +CREATE TABLE nt_1 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = MyISAM; +CREATE TABLE nt_2 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = MyISAM; +CREATE TABLE nt_3 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = MyISAM; +CREATE TABLE nt_4 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = MyISAM; +CREATE TABLE nt_5 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = MyISAM; +CREATE TABLE nt_6 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = MyISAM; +CREATE TABLE tt_1 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = TokuDB; +CREATE TABLE tt_2 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = TokuDB; +CREATE TABLE tt_3 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = TokuDB; +CREATE TABLE tt_4 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = TokuDB; +CREATE TABLE tt_5 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = TokuDB; +CREATE TABLE tt_6 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = TokuDB; +INSERT INTO nt_1(trans_id, stmt_id) VALUES(1,1); +INSERT INTO nt_2(trans_id, stmt_id) VALUES(1,1); +INSERT INTO nt_3(trans_id, stmt_id) VALUES(1,1); +INSERT INTO nt_4(trans_id, stmt_id) VALUES(1,1); +INSERT INTO nt_5(trans_id, stmt_id) VALUES(1,1); +INSERT INTO nt_6(trans_id, stmt_id) VALUES(1,1); +INSERT INTO tt_1(trans_id, stmt_id) VALUES(1,1); +INSERT INTO tt_2(trans_id, stmt_id) VALUES(1,1); +INSERT INTO tt_3(trans_id, stmt_id) VALUES(1,1); +INSERT INTO tt_4(trans_id, stmt_id) VALUES(1,1); +INSERT INTO tt_5(trans_id, stmt_id) VALUES(1,1); +INSERT INTO tt_6(trans_id, stmt_id) VALUES(1,1); +CREATE PROCEDURE pc_i_tt_5_suc (IN p_trans_id INTEGER, IN p_stmt_id INTEGER) +BEGIN +DECLARE in_stmt_id INTEGER; +SELECT max(stmt_id) INTO in_stmt_id FROM tt_5 WHERE trans_id= p_trans_id; +SELECT COALESCE(greatest(in_stmt_id + 1, p_stmt_id), 1) INTO in_stmt_id; +INSERT INTO tt_5(trans_id, stmt_id) VALUES (p_trans_id, in_stmt_id); +INSERT INTO tt_5(trans_id, stmt_id) VALUES (p_trans_id, in_stmt_id + 1); +END| +CREATE PROCEDURE pc_i_nt_5_suc (IN p_trans_id INTEGER, IN p_stmt_id INTEGER) +BEGIN +DECLARE in_stmt_id INTEGER; +SELECT max(stmt_id) INTO in_stmt_id FROM nt_5 WHERE trans_id= p_trans_id; +SELECT COALESCE(greatest(in_stmt_id + 1, p_stmt_id), 1) INTO in_stmt_id; +INSERT INTO nt_5(trans_id, stmt_id) VALUES (p_trans_id, in_stmt_id); +INSERT INTO nt_5(trans_id, stmt_id) VALUES (p_trans_id, in_stmt_id + 1); +END| +CREATE FUNCTION fc_i_tt_5_suc (p_trans_id INTEGER, p_stmt_id INTEGER) RETURNS VARCHAR(64) +BEGIN +DECLARE in_stmt_id INTEGER; +SELECT max(stmt_id) INTO in_stmt_id FROM tt_5 WHERE trans_id= p_trans_id; +SELECT COALESCE(greatest(in_stmt_id + 1, p_stmt_id), 1) INTO in_stmt_id; +INSERT INTO tt_5(trans_id, stmt_id) VALUES (p_trans_id, in_stmt_id); +INSERT INTO tt_5(trans_id, stmt_id) VALUES (p_trans_id, in_stmt_id + 1); +RETURN "fc_i_tt_5_suc"; +END| +CREATE FUNCTION fc_i_nt_5_suc (p_trans_id INTEGER, p_stmt_id INTEGER) RETURNS VARCHAR(64) +BEGIN +DECLARE in_stmt_id INTEGER; +SELECT max(stmt_id) INTO in_stmt_id FROM nt_5 WHERE trans_id= p_trans_id; +SELECT COALESCE(greatest(in_stmt_id + 1, p_stmt_id), 1) INTO in_stmt_id; +INSERT INTO nt_5(trans_id, stmt_id) VALUES (p_trans_id, in_stmt_id); +INSERT INTO nt_5(trans_id, stmt_id) VALUES (p_trans_id, in_stmt_id + 1); +RETURN "fc_i_nt_5_suc"; +END| +CREATE FUNCTION fc_i_nt_3_tt_3_suc (p_trans_id INTEGER, p_stmt_id INTEGER) RETURNS VARCHAR(64) +BEGIN +DECLARE in_stmt_id INTEGER; +SELECT max(stmt_id) INTO in_stmt_id FROM nt_3 WHERE trans_id= p_trans_id; +SELECT COALESCE(greatest(in_stmt_id + 1, p_stmt_id), 1) INTO in_stmt_id; +INSERT INTO nt_3(trans_id, stmt_id) VALUES (p_trans_id, in_stmt_id); +SELECT max(stmt_id) INTO in_stmt_id FROM tt_3 WHERE trans_id= p_trans_id; +SELECT COALESCE(greatest(in_stmt_id + 1, p_stmt_id), 1) INTO in_stmt_id; +INSERT INTO tt_3(trans_id, stmt_id) VALUES (p_trans_id, in_stmt_id); +RETURN "fc_i_nt_3_tt_3_suc"; +END| +CREATE TRIGGER tr_i_tt_3_to_nt_3 AFTER INSERT ON tt_3 FOR EACH ROW +BEGIN +DECLARE in_stmt_id INTEGER; +SELECT max(stmt_id) INTO in_stmt_id FROM nt_3 WHERE trans_id= NEW.trans_id; +SELECT COALESCE(greatest(in_stmt_id + 1, NEW.stmt_id), 1) INTO in_stmt_id; +INSERT INTO nt_3(trans_id, stmt_id) VALUES (NEW.trans_id, in_stmt_id); +INSERT INTO nt_3(trans_id, stmt_id) VALUES (NEW.trans_id, in_stmt_id + 1); +END| +CREATE TRIGGER tr_i_nt_4_to_tt_4 AFTER INSERT ON nt_4 FOR EACH ROW +BEGIN +DECLARE in_stmt_id INTEGER; +SELECT max(stmt_id) INTO in_stmt_id FROM tt_4 WHERE trans_id= NEW.trans_id; +SELECT COALESCE(greatest(in_stmt_id + 1, NEW.stmt_id), 1) INTO in_stmt_id; +INSERT INTO tt_4(trans_id, stmt_id) VALUES (NEW.trans_id, in_stmt_id); +INSERT INTO tt_4(trans_id, stmt_id) VALUES (NEW.trans_id, in_stmt_id + 1); +END| +CREATE TRIGGER tr_i_tt_5_to_tt_6 AFTER INSERT ON tt_5 FOR EACH ROW +BEGIN +DECLARE in_stmt_id INTEGER; +SELECT max(stmt_id) INTO in_stmt_id FROM tt_6 WHERE trans_id= NEW.trans_id; +SELECT COALESCE(greatest(in_stmt_id + 1, NEW.stmt_id, 1), 1) INTO in_stmt_id; +INSERT INTO tt_6(trans_id, stmt_id) VALUES (NEW.trans_id, in_stmt_id); +INSERT INTO tt_6(trans_id, stmt_id) VALUES (NEW.trans_id, in_stmt_id + 1); +END| +CREATE TRIGGER tr_i_nt_5_to_nt_6 AFTER INSERT ON nt_5 FOR EACH ROW +BEGIN +DECLARE in_stmt_id INTEGER; +SELECT max(stmt_id) INTO in_stmt_id FROM nt_6 WHERE trans_id= NEW.trans_id; +SELECT COALESCE(greatest(in_stmt_id + 1, NEW.stmt_id), 1) INTO in_stmt_id; +INSERT INTO nt_6(trans_id, stmt_id) VALUES (NEW.trans_id, in_stmt_id); +INSERT INTO nt_6(trans_id, stmt_id) VALUES (NEW.trans_id, in_stmt_id + 1); +END| +################################################################################### +# EXECUTE CASES CRASHING THE XID +################################################################################### + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_apply";; +FAILURE d,crash_after_apply and OUTCOME O2 +rpl_mixing_engines.inc [commands=T] +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (7, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (7, 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (7, 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_apply";; +FAILURE d,crash_after_apply and OUTCOME O2 +rpl_mixing_engines.inc [commands=T-trig] +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (8, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (8, 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (8, 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_apply";; +FAILURE d,crash_after_apply and OUTCOME O2 +rpl_mixing_engines.inc [commands=T-func] +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (9, 1); +fc_i_tt_5_suc (9, 1) +fc_i_tt_5_suc +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(9,1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(9,1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_apply";; +FAILURE d,crash_after_apply and OUTCOME O2 +rpl_mixing_engines.inc [commands=T-proc] +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (10, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',10), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',10), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',10), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',10), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_apply";; +FAILURE d,crash_after_apply and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T T-trig C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (11, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (11, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (11, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (11, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-trig C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (11, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (11, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-trig C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_apply";; +FAILURE d,crash_after_apply and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T T-func C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (12, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (12, 4); +fc_i_tt_5_suc (12, 4) +fc_i_tt_5_suc +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (12, 2) +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(12,4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-func C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (12, 2) +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(12,4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-func C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_apply";; +FAILURE d,crash_after_apply and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T T-proc C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (13, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (13, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (13, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',13), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',13), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-proc C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (13, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',13), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',13), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-proc C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_apply";; +FAILURE d,crash_after_apply and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T-trig T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (14, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (14, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (14, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (14, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-trig T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (14, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (14, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-trig T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_apply";; +FAILURE d,crash_after_apply and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T-func T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (15, 2); +fc_i_tt_5_suc (15, 2) +fc_i_tt_5_suc +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (15, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(15,2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (15, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-func T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(15,2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (15, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-func T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_apply";; +FAILURE d,crash_after_apply and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T-proc T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (16, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (16, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',16), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',16), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (16, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-proc T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',16), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',16), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (16, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-proc T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_before_update_pos";; +FAILURE d,crash_before_update_pos and OUTCOME O1 +rpl_mixing_engines.inc [commands=T] +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (17, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (17, 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (17, 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_before_update_pos";; +FAILURE d,crash_before_update_pos and OUTCOME O1 +rpl_mixing_engines.inc [commands=T-trig] +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (18, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (18, 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (18, 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_before_update_pos";; +FAILURE d,crash_before_update_pos and OUTCOME O1 +rpl_mixing_engines.inc [commands=T-func] +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (19, 1); +fc_i_tt_5_suc (19, 1) +fc_i_tt_5_suc +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(19,1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(19,1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_before_update_pos";; +FAILURE d,crash_before_update_pos and OUTCOME O1 +rpl_mixing_engines.inc [commands=T-proc] +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (20, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',20), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',20), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',20), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',20), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_before_update_pos";; +FAILURE d,crash_before_update_pos and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T T-trig C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (21, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (21, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (21, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (21, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-trig C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (21, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (21, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-trig C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_before_update_pos";; +FAILURE d,crash_before_update_pos and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T T-func C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (22, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (22, 4); +fc_i_tt_5_suc (22, 4) +fc_i_tt_5_suc +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (22, 2) +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(22,4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-func C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (22, 2) +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(22,4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-func C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_before_update_pos";; +FAILURE d,crash_before_update_pos and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T T-proc C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (23, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (23, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (23, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',23), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',23), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-proc C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (23, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',23), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',23), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-proc C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_before_update_pos";; +FAILURE d,crash_before_update_pos and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T-trig T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (24, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (24, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (24, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (24, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-trig T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (24, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (24, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-trig T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_before_update_pos";; +FAILURE d,crash_before_update_pos and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T-func T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (25, 2); +fc_i_tt_5_suc (25, 2) +fc_i_tt_5_suc +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (25, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(25,2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (25, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-func T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(25,2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (25, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-func T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_before_update_pos";; +FAILURE d,crash_before_update_pos and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T-proc T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (26, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (26, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',26), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',26), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (26, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-proc T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',26), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',26), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (26, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-proc T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_update_pos_before_apply";; +FAILURE d,crash_after_update_pos_before_apply and OUTCOME O1 +rpl_mixing_engines.inc [commands=T] +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (27, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (27, 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (27, 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_update_pos_before_apply";; +FAILURE d,crash_after_update_pos_before_apply and OUTCOME O1 +rpl_mixing_engines.inc [commands=T-trig] +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (28, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (28, 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (28, 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_update_pos_before_apply";; +FAILURE d,crash_after_update_pos_before_apply and OUTCOME O1 +rpl_mixing_engines.inc [commands=T-func] +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (29, 1); +fc_i_tt_5_suc (29, 1) +fc_i_tt_5_suc +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(29,1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(29,1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_update_pos_before_apply";; +FAILURE d,crash_after_update_pos_before_apply and OUTCOME O1 +rpl_mixing_engines.inc [commands=T-proc] +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (30, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',30), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',30), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',30), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',30), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_update_pos_before_apply";; +FAILURE d,crash_after_update_pos_before_apply and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T T-trig C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (31, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (31, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (31, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (31, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-trig C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (31, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (31, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-trig C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_update_pos_before_apply";; +FAILURE d,crash_after_update_pos_before_apply and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T T-func C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (32, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (32, 4); +fc_i_tt_5_suc (32, 4) +fc_i_tt_5_suc +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (32, 2) +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(32,4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-func C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (32, 2) +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(32,4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-func C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_update_pos_before_apply";; +FAILURE d,crash_after_update_pos_before_apply and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T T-proc C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (33, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (33, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (33, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',33), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',33), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-proc C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (33, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',33), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',33), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-proc C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_update_pos_before_apply";; +FAILURE d,crash_after_update_pos_before_apply and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T-trig T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (34, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (34, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (34, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (34, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-trig T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (34, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (34, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-trig T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_update_pos_before_apply";; +FAILURE d,crash_after_update_pos_before_apply and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T-func T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (35, 2); +fc_i_tt_5_suc (35, 2) +fc_i_tt_5_suc +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (35, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(35,2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (35, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-func T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(35,2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (35, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-func T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_update_pos_before_apply";; +FAILURE d,crash_after_update_pos_before_apply and OUTCOME O1 +rpl_mixing_engines.inc [commands=B T-proc T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (36, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (36, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',36), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',36), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (36, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-proc T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',36), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',36), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (36, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-proc T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_before_update_pos";; +FAILURE d,crash_after_commit_before_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=T] +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (37, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (37, 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (37, 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_before_update_pos";; +FAILURE d,crash_after_commit_before_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=T-trig] +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (38, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (38, 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (38, 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_before_update_pos";; +FAILURE d,crash_after_commit_before_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=T-func] +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (39, 1); +fc_i_tt_5_suc (39, 1) +fc_i_tt_5_suc +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(39,1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(39,1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_before_update_pos";; +FAILURE d,crash_after_commit_before_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=T-proc] +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (40, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',40), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',40), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',40), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',40), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_before_update_pos";; +FAILURE d,crash_after_commit_before_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T T-trig C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (41, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (41, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (41, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (41, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-trig C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (41, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (41, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-trig C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_before_update_pos";; +FAILURE d,crash_after_commit_before_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T T-func C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (42, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (42, 4); +fc_i_tt_5_suc (42, 4) +fc_i_tt_5_suc +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (42, 2) +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(42,4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-func C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (42, 2) +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(42,4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-func C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_before_update_pos";; +FAILURE d,crash_after_commit_before_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T T-proc C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (43, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (43, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (43, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',43), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',43), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T T-proc C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (43, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',43), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',43), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T T-proc C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_before_update_pos";; +FAILURE d,crash_after_commit_before_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T-trig T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_5(trans_id, stmt_id) VALUES (44, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (44, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (44, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (44, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-trig T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES (44, 2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (44, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-trig T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_before_update_pos";; +FAILURE d,crash_after_commit_before_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T-func T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_tt_5_suc (45, 2); +fc_i_tt_5_suc (45, 2) +fc_i_tt_5_suc +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (45, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(45,2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (45, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-func T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(45,2) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (45, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-func T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_before_update_pos";; +FAILURE d,crash_after_commit_before_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=B T-proc T C] +-b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b- +BEGIN; +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> B << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T-proc << -b-b-b-b-b-b-b-b-b-b-b- +CALL pc_i_tt_5_suc (46, 2); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T-proc << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> T << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(trans_id, stmt_id) VALUES (46, 4); +include/show_binlog_events.inc +-e-e-e-e-e-e-e-e-e-e-e- >> T << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> C << -b-b-b-b-b-b-b-b-b-b-b- +COMMIT; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',46), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',46), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (46, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> B T-proc T C << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',46), NAME_CONST('in_stmt_id',1)) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES ( NAME_CONST('p_trans_id',46), NAME_CONST('in_stmt_id',1) + 1) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES (46, 4) +master-bin.000001 # Xid # # COMMIT /* XID */ +-e-e-e-e-e-e-e-e-e-e-e- >> B T-proc T C << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc +################################################################################### +# EXECUTE CASES CRASHING THE BEGIN/COMMIT +################################################################################### + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_and_update_pos";; +FAILURE d,crash_after_commit_and_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=N] +-b-b-b-b-b-b-b-b-b-b-b- >> N << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO nt_1(trans_id, stmt_id) VALUES (47, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO nt_1(trans_id, stmt_id) VALUES (47, 1) +master-bin.000001 # Query # # COMMIT +-e-e-e-e-e-e-e-e-e-e-e- >> N << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> N << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO nt_1(trans_id, stmt_id) VALUES (47, 1) +master-bin.000001 # Query # # COMMIT +-e-e-e-e-e-e-e-e-e-e-e- >> N << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_and_update_pos";; +FAILURE d,crash_after_commit_and_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=N-trig] +-b-b-b-b-b-b-b-b-b-b-b- >> N-trig << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO nt_5(trans_id, stmt_id) VALUES (48, 1); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO nt_5(trans_id, stmt_id) VALUES (48, 1) +master-bin.000001 # Query # # COMMIT +-e-e-e-e-e-e-e-e-e-e-e- >> N-trig << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> N-trig << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO nt_5(trans_id, stmt_id) VALUES (48, 1) +master-bin.000001 # Query # # COMMIT +-e-e-e-e-e-e-e-e-e-e-e- >> N-trig << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc + + + +STOP SLAVE SQL_THREAD; +include/wait_for_slave_sql_to_stop.inc +SET GLOBAL debug="d,crash_after_commit_and_update_pos";; +FAILURE d,crash_after_commit_and_update_pos and OUTCOME O2 +rpl_mixing_engines.inc [commands=N-func] +-b-b-b-b-b-b-b-b-b-b-b- >> N-func << -b-b-b-b-b-b-b-b-b-b-b- +SELECT fc_i_nt_5_suc (49, 1); +fc_i_nt_5_suc (49, 1) +fc_i_nt_5_suc +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_nt_5_suc`(49,1) +master-bin.000001 # Query # # COMMIT +-e-e-e-e-e-e-e-e-e-e-e- >> N-func << -e-e-e-e-e-e-e-e-e-e-e- +-b-b-b-b-b-b-b-b-b-b-b- >> N-func << -b-b-b-b-b-b-b-b-b-b-b- +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_nt_5_suc`(49,1) +master-bin.000001 # Query # # COMMIT +-e-e-e-e-e-e-e-e-e-e-e- >> N-func << -e-e-e-e-e-e-e-e-e-e-e- + +include/rpl_reconnect.inc +START SLAVE; +include/wait_for_slave_to_start.inc +################################################################################### +# CHECK CONSISTENCY +################################################################################### +include/sync_slave_sql_with_master.inc +################################################################################### +# CLEAN +################################################################################### +rpl_mixing_engines.inc [commands=clean] +DROP TABLE tt_1; +DROP TABLE tt_2; +DROP TABLE tt_3; +DROP TABLE tt_4; +DROP TABLE tt_5; +DROP TABLE tt_6; +DROP TABLE nt_1; +DROP TABLE nt_2; +DROP TABLE nt_3; +DROP TABLE nt_4; +DROP TABLE nt_5; +DROP TABLE nt_6; +DROP PROCEDURE pc_i_tt_5_suc; +DROP PROCEDURE pc_i_nt_5_suc; +DROP FUNCTION fc_i_tt_5_suc; +DROP FUNCTION fc_i_nt_5_suc; +DROP FUNCTION fc_i_nt_3_tt_3_suc; +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_stm_mixed_lower_case_table_names.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_stm_mixed_lower_case_table_names.result new file mode 100644 index 00000000000..e3d83733ed0 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_stm_mixed_lower_case_table_names.result @@ -0,0 +1,48 @@ +include/master-slave.inc +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +[connection master] +******** [ MASTER ] ******** +CREATE DATABASE BUG_37656; +use BUG_37656; +show databases like 'BUG_37656'; +Database (BUG_37656) +BUG_37656 +******** [ SLAVE ] ******** +show databases like 'bug_37656'; +Database (bug_37656) +bug_37656 +******** [ MASTER ] ******** +CREATE TABLE T1 (a int); +CREATE TABLE T2 (b int) ENGINE=TokuDB; +CREATE TABLE T3 (txt TEXT); +show tables; +Tables_in_BUG_37656 +T1 +T2 +T3 +******** [ SLAVE ] ******** +use bug_37656; +show tables; +Tables_in_bug_37656 +t2 +t3 +CREATE TABLE t1 (a INT); +******** [ MASTER ] ******** +use BUG_37656; +INSERT INTO T1 VALUES (1); +INSERT INTO T2 VALUES (1); +LOAD DATA INFILE '../../std_data/words.dat' INTO TABLE BUG_37656.T3; +******** [ SLAVE ] ******** +include/diff_tables.inc [master:BUG_37656.T2, slave:bug_37656.t2] +include/diff_tables.inc [master:BUG_37656.T3, slave:bug_37656.t3] +******** [ MASTER ] ******** +DROP DATABASE BUG_37656; +include/rpl_reset.inc +CREATE DATABASE B50653; +USE B50653; +CREATE PROCEDURE b50653_proc() BEGIN SELECT 1; END; +DROP PROCEDURE b50653_proc; +DROP DATABASE B50653; +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_not_null_tokudb.test b/storage/tokudb/mysql-test/rpl/t/rpl_not_null_tokudb.test index 57243376ac2..53cf555ce64 100644 --- a/storage/tokudb/mysql-test/rpl/t/rpl_not_null_tokudb.test +++ b/storage/tokudb/mysql-test/rpl/t/rpl_not_null_tokudb.test @@ -11,9 +11,9 @@ # 3 - NULL --> NOT NULL ( sql-mode != STRICT and no failures) # ################################################################################# ---source include/master-slave.inc --source include/have_tokudb.inc --source include/have_binlog_format_row.inc +--source include/master-slave.inc let $engine=TokuDB; --source extra/rpl_tests/rpl_not_null.test diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_parallel_tokudb_delete_pk-slave.opt b/storage/tokudb/mysql-test/rpl/t/rpl_parallel_tokudb_delete_pk-slave.opt index 0aa48174807..e1bddaa2204 100644 --- a/storage/tokudb/mysql-test/rpl/t/rpl_parallel_tokudb_delete_pk-slave.opt +++ b/storage/tokudb/mysql-test/rpl/t/rpl_parallel_tokudb_delete_pk-slave.opt @@ -1,5 +1,2 @@ ---read-only=ON ---loose-tokudb-rpl-unique-checks-delay=10000 ---loose-tokudb-rpl-unique-checks=OFF ---loose-tokudb-rpl-lookup-rows-delay=10000 ---loose-tokudb-rpl-lookup-rows=OFF +--read-only=ON --loose-tokudb-rpl-unique-checks-delay=10000 --loose-tokudb-rpl-unique-checks=OFF --loose-tokudb-rpl-lookup-rows-delay=10000 --loose-tokudb-rpl-lookup-rows=OFF + diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_parallel_tokudb_update_pk_uc0_lookup0-slave.opt b/storage/tokudb/mysql-test/rpl/t/rpl_parallel_tokudb_update_pk_uc0_lookup0-slave.opt index 0aa48174807..93a2685e847 100644 --- a/storage/tokudb/mysql-test/rpl/t/rpl_parallel_tokudb_update_pk_uc0_lookup0-slave.opt +++ b/storage/tokudb/mysql-test/rpl/t/rpl_parallel_tokudb_update_pk_uc0_lookup0-slave.opt @@ -1,5 +1 @@ ---read-only=ON ---loose-tokudb-rpl-unique-checks-delay=10000 ---loose-tokudb-rpl-unique-checks=OFF ---loose-tokudb-rpl-lookup-rows-delay=10000 ---loose-tokudb-rpl-lookup-rows=OFF +--read-only=ON --loose-tokudb-rpl-unique-checks-delay=10000 --loose-tokudb-rpl-unique-checks=OFF --loose-tokudb-rpl-lookup-rows-delay=10000 --loose-tokudb-rpl-lookup-rows=OFF diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_parallel_tokudb_update_pk_uc0_lookup0.test b/storage/tokudb/mysql-test/rpl/t/rpl_parallel_tokudb_update_pk_uc0_lookup0.test index d6ccf2487ae..25fe8847dad 100644 --- a/storage/tokudb/mysql-test/rpl/t/rpl_parallel_tokudb_update_pk_uc0_lookup0.test +++ b/storage/tokudb/mysql-test/rpl/t/rpl_parallel_tokudb_update_pk_uc0_lookup0.test @@ -42,15 +42,16 @@ update t set b=b+2 where a=1; update t set b=b+3 where a=4; update t set b=b+4 where a=3; update t set b=b+1 where 1<=a and a<=3; -select unix_timestamp() into @tstart; +--echo # select unix_timestamp() into @tstart; # wait for the delete to finish on the slave connection master; sync_slave_with_master; # source include/sync_slave_sql_with_master.inc; connection master; -select unix_timestamp() into @tend; -#select @tend-@tstart <= 5; # assert no delay in the delete time +--echo # Commented out for MariaDB +--echo # select unix_timestamp() into @tend; +--echo # select @tend-@tstart <= 5; # assert no delay in the delete time connection slave; select * from t; diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_parallel_tokudb_write_pk-slave.opt b/storage/tokudb/mysql-test/rpl/t/rpl_parallel_tokudb_write_pk-slave.opt index 7f49776e4e8..dd719829112 100644 --- a/storage/tokudb/mysql-test/rpl/t/rpl_parallel_tokudb_write_pk-slave.opt +++ b/storage/tokudb/mysql-test/rpl/t/rpl_parallel_tokudb_write_pk-slave.opt @@ -1,3 +1,2 @@ ---read-only=ON ---loose-tokudb-rpl-unique-checks-delay=5000 ---loose-tokudb-rpl-unique-checks=OFF +--read-only=ON --loose-tokudb-rpl-unique-checks-delay=5000 --loose-tokudb-rpl-unique-checks=OFF + diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_parallel_tokudb_write_pk.test b/storage/tokudb/mysql-test/rpl/t/rpl_parallel_tokudb_write_pk.test index db96ac321c0..d2a1cbea328 100644 --- a/storage/tokudb/mysql-test/rpl/t/rpl_parallel_tokudb_write_pk.test +++ b/storage/tokudb/mysql-test/rpl/t/rpl_parallel_tokudb_write_pk.test @@ -22,7 +22,6 @@ connection master; # select @@autocommit; eval create table t (a bigint not null, primary key(a)) engine=$engine; # show create table t; -select unix_timestamp() into @tstart; insert into t values (1); insert into t values (2),(3); insert into t values (4); @@ -30,8 +29,7 @@ insert into t values (4); sync_slave_with_master; # source include/sync_slave_sql_with_master.inc; -#connection master; -#select unix_timestamp()-@tstart; +connection master; connection slave; # insert into t values (5); # test read-only diff --git a/storage/tokudb/mysql-test/tokudb_rpl/t/rpl_rfr_disable_on_expl_pk_absence-slave.opt b/storage/tokudb/mysql-test/rpl/t/rpl_rfr_disable_on_expl_pk_absence-slave.opt similarity index 100% rename from storage/tokudb/mysql-test/tokudb_rpl/t/rpl_rfr_disable_on_expl_pk_absence-slave.opt rename to storage/tokudb/mysql-test/rpl/t/rpl_rfr_disable_on_expl_pk_absence-slave.opt diff --git a/storage/tokudb/mysql-test/tokudb_rpl/t/rpl_rfr_disable_on_expl_pk_absence.test b/storage/tokudb/mysql-test/rpl/t/rpl_rfr_disable_on_expl_pk_absence.test similarity index 100% rename from storage/tokudb/mysql-test/tokudb_rpl/t/rpl_rfr_disable_on_expl_pk_absence.test rename to storage/tokudb/mysql-test/rpl/t/rpl_rfr_disable_on_expl_pk_absence.test diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_row_basic_3tokudb.test b/storage/tokudb/mysql-test/rpl/t/rpl_row_basic_3tokudb.test index eb1bad94e29..4c38646b112 100644 --- a/storage/tokudb/mysql-test/rpl/t/rpl_row_basic_3tokudb.test +++ b/storage/tokudb/mysql-test/rpl/t/rpl_row_basic_3tokudb.test @@ -1,11 +1,11 @@ --- source include/have_tokudb.inc --- source include/have_binlog_format_row.inc --- source include/master-slave.inc +--source include/have_tokudb.inc +--source include/have_binlog_format_row.inc +--source include/master-slave.inc connection slave; let $bit_field_special = ALL_LOSSY; -let $type= 'TokuDB'; -let $extra_index= ; --- source extra/rpl_tests/rpl_row_basic.test +let $type = 'TokuDB'; +let $extra_index = ; +--source extra/rpl_tests/rpl_row_basic.test --source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_stm_tokudb.test b/storage/tokudb/mysql-test/rpl/t/rpl_stm_tokudb.test index bd4de6e467c..25f0ab3b934 100644 --- a/storage/tokudb/mysql-test/rpl/t/rpl_stm_tokudb.test +++ b/storage/tokudb/mysql-test/rpl/t/rpl_stm_tokudb.test @@ -4,6 +4,7 @@ source include/master-slave.inc; source include/have_tokudb.inc; source include/have_binlog_format_statement.inc; +# gtids disabled because it tests DROP TEMPORARY inside a transaction source extra/rpl_tests/rpl_tokudb.test; --source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_commit_after_flush.test b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_commit_after_flush.test new file mode 100644 index 00000000000..b39661c111b --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_commit_after_flush.test @@ -0,0 +1,5 @@ +-- source include/have_tokudb.inc +-- source include/master-slave.inc +let $engine_type=tokudb; +-- source extra/rpl_tests/rpl_commit_after_flush.test +--source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_insert_id-master.opt b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_insert_id-master.opt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_insert_id-slave.opt b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_insert_id-slave.opt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_insert_id.test b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_insert_id.test new file mode 100644 index 00000000000..b0308402b40 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_insert_id.test @@ -0,0 +1,6 @@ +################################# +# Wrapper for rpl_insert_id.test# +################################# +-- source include/have_tokudb.inc +let $engine_type=tokudb; +-- source extra/rpl_tests/rpl_insert_id.test diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_insert_id_pk.test b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_insert_id_pk.test new file mode 100644 index 00000000000..103cad8a266 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_insert_id_pk.test @@ -0,0 +1,6 @@ +################################# +# Wrapper for rpl_insert_id.test# +################################# +-- source include/have_tokudb.inc +let $engine_type=tokudb; +-- source extra/rpl_tests/rpl_insert_id_pk.test diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_multi_update.test b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_multi_update.test new file mode 100644 index 00000000000..89a73b1506f --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_multi_update.test @@ -0,0 +1,3 @@ +-- source include/have_tokudb.inc +let $engine_type=TokuDB; +-- source extra/rpl_tests/rpl_multi_update.test diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_multi_update2-slave.opt b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_multi_update2-slave.opt new file mode 100644 index 00000000000..17d4171af0e --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_multi_update2-slave.opt @@ -0,0 +1 @@ +--replicate-ignore-table=nothing.sensible diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_multi_update2.test b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_multi_update2.test new file mode 100644 index 00000000000..b73b302d024 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_multi_update2.test @@ -0,0 +1,12 @@ +####################################################### +# Wrapper for rpl_multi_update2.test to allow multi # +# Engines to reuse test code. By JBM 2006-02-15 # +# Added comments section and to skip when ndb is # +# Default engine. # +####################################################### +--source include/have_tokudb.inc +--source include/master-slave.inc +call mtr.add_suppression('Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT'); +let $engine_type=TokuDB; +--source extra/rpl_tests/rpl_multi_update2.test +--source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_multi_update3.test b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_multi_update3.test new file mode 100644 index 00000000000..2cdf44bff16 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_multi_update3.test @@ -0,0 +1,12 @@ +####################################################### +# Wrapper for rpl_multi_update3.test to allow multi # +# Engines to reuse test code. By JBM 2006-02-15 # +# Added comments section and to skip when ndb is # +# Default engine. # +####################################################### +--source include/have_tokudb.inc +--source include/master-slave.inc +call mtr.add_suppression('Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.'); +let $engine_type=TokuDB; +--source extra/rpl_tests/rpl_multi_update3.test +--source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/tokudb_rpl/t/rpl_tokudb_rfr_partition_table-slave.opt b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_rfr_partition_table-slave.opt similarity index 100% rename from storage/tokudb/mysql-test/tokudb_rpl/t/rpl_tokudb_rfr_partition_table-slave.opt rename to storage/tokudb/mysql-test/rpl/t/rpl_tokudb_rfr_partition_table-slave.opt diff --git a/storage/tokudb/mysql-test/tokudb_rpl/t/rpl_tokudb_rfr_partition_table.test b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_rfr_partition_table.test similarity index 97% rename from storage/tokudb/mysql-test/tokudb_rpl/t/rpl_tokudb_rfr_partition_table.test rename to storage/tokudb/mysql-test/rpl/t/rpl_tokudb_rfr_partition_table.test index eadeda83cd5..a9cdaa57248 100644 --- a/storage/tokudb/mysql-test/tokudb_rpl/t/rpl_tokudb_rfr_partition_table.test +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_rfr_partition_table.test @@ -1,5 +1,7 @@ # test tokudb read free replication feature with partition table +skip MDEV-13441; +--source include/have_partition.inc --source include/have_debug.inc --source include/have_partition.inc --source include/have_tokudb.inc diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_crash_safe-master.opt b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_crash_safe-master.opt new file mode 100644 index 00000000000..e980c2de7ff --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_crash_safe-master.opt @@ -0,0 +1 @@ +--transaction_isolation=READ-COMMITTED diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_crash_safe-slave.opt b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_crash_safe-slave.opt new file mode 100644 index 00000000000..264c5c1a4b4 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_crash_safe-slave.opt @@ -0,0 +1 @@ +--skip-slave-start --relay-log-info-repository=TABLE --relay-log-recovery=1 --transaction_isolation=READ-COMMITTED diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_crash_safe.test b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_crash_safe.test new file mode 100644 index 00000000000..6bd79691528 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_crash_safe.test @@ -0,0 +1,19 @@ +# This test takes long time, so only run it with the --big-test mtr-flag. +--source include/big_test.inc +--source include/not_embedded.inc +--source include/not_valgrind.inc +--source include/have_debug.inc +--source include/have_tokudb.inc +--source include/have_binlog_format_row.inc +--source include/not_mts_slave_parallel_workers.inc +--source include/master-slave.inc + +call mtr.add_suppression('Attempting backtrace'); +call mtr.add_suppression("Recovery from master pos .* and file master-bin.000001"); +call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +call mtr.add_suppression(".* InnoDB: Warning: allocated tablespace .*, old maximum was .*"); + +let $engine_type=TokuDB; +let $database_name=test; +--source extra/rpl_tests/rpl_crash_safe.test +--source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_img_blobs.test b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_img_blobs.test new file mode 100644 index 00000000000..ff4a0435a5e --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_img_blobs.test @@ -0,0 +1,54 @@ +#Want to skip this test from daily Valgrind execution +skip Require rpl files from MySQL; +--source include/no_valgrind_without_big.inc + +-- source include/have_innodb.inc +-- source include/have_tokudb.inc +# +# This file contains tests for WL#5096. +# + +-- let $rpl_topology= 1->2->3 +-- source include/rpl_init.inc +-- source include/have_binlog_format_row.inc + +# +# WL#5096 Tests. +# + +# +# Tests combinations of binlog-row-image against mixes of MyISAM and InnoDB +# storage engines on all three servers. +# +# All the combinarions need not to be separated into their own files as +# the tests for indexes and engines mixes are, because noblobs test script +# does not take too long time, thence we do not risk triggering PB2 timeout +# on valgrind runs. +# + +## NOBLOB + +-- let $row_img_set=server_1:NOBLOB:N,server_2:NOBLOB:Y,server_3:NOBLOB:Y +-- source include/rpl_row_img_set.inc + +-- let $row_img_test_script= extra/rpl_tests/rpl_row_img_blobs.test +-- source suite/tokudb.rpl/include/rpl_tokudb_row_img_general_loop.inc + +## MINIMAL + +-- let $row_img_set=server_1:MINIMAL:N,server_2:MINIMAL:Y,server_3:MINIMAL:Y +-- source include/rpl_row_img_set.inc + +-- let $row_img_test_script= extra/rpl_tests/rpl_row_img_blobs.test +-- source suite/tokudb.rpl/include/rpl_tokudb_row_img_general_loop.inc + +## FULL + +-- let $row_img_set=server_1:FULL:N,server_2:FULL:Y,server_3:FULL:Y +-- source include/rpl_row_img_set.inc + +-- let $row_img_test_script= extra/rpl_tests/rpl_row_img_blobs.test +-- source suite/tokudb.rpl/include/rpl_tokudb_row_img_general_loop.inc + + +-- source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_img_eng_full.test b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_img_eng_full.test new file mode 100644 index 00000000000..68ff71752ac --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_img_eng_full.test @@ -0,0 +1,51 @@ +#Want to skip this test from daily Valgrind execution +skip Require rpl files from MySQL; +-- source include/no_valgrind_without_big.inc +# +# This file contains tests for WL#5096 and bug fixes. +# + +-- source include/have_binlog_format_row.inc +-- source include/not_gtid_enabled.inc + +-- let $rpl_topology= 1->2->3 +-- source include/rpl_init.inc + +-- connection server_1 +-- source include/have_innodb.inc +-- source include/have_tokudb.inc +-- connection server_2 +-- source include/have_innodb.inc +-- source include/have_tokudb.inc +-- connection server_3 +-- source include/have_innodb.inc +-- source include/have_tokudb.inc +-- connection server_1 + +# +# WL#5096 +# + +# +# Tests for different storage engines on each server, +# but same index structure on tables. The tests are conducted +# using FULL binlog-row-image on all servers. +# + +-- let $row_img_set=server_1:FULL:N,server_2:FULL:Y,server_3:FULL:Y +-- source include/rpl_row_img_set.inc + +-- let $row_img_test_script= extra/rpl_tests/rpl_row_img.test +-- source suite/tokudb.rpl/include/rpl_tokudb_row_img_general_loop.inc + +# +# BUG#49100 +# + +-- echo ### Testing with TokuDB storage engine + +-- let $engine=TokuDB +-- source extra/rpl_tests/rpl_row_empty_imgs.test + + +-- source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_img_eng_min.test b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_img_eng_min.test new file mode 100644 index 00000000000..3ba958fc691 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_img_eng_min.test @@ -0,0 +1,43 @@ +#Want to skip this test from daily Valgrind execution +skip Require rpl files from MySQL; +-- source include/no_valgrind_without_big.inc +# +# This file contains tests for WL#5096 and bug fixes. +# + +-- let $rpl_topology= 1->2->3 +-- source include/rpl_init.inc +-- source include/have_binlog_format_row.inc + +-- connection server_1 +-- source include/have_innodb.inc +-- source include/have_tokudb.inc +-- connection server_2 +-- source include/have_innodb.inc +-- source include/have_tokudb.inc +-- connection server_3 +-- source include/have_innodb.inc +-- source include/have_tokudb.inc +-- connection server_1 + +# +# WL#5096 +# + +# +# Tests for different storage engines on each server, +# but same index structure on tables. The tests are conducted +# using MINIMAL binlog-row-image on all servers. +# + +-- let $row_img_set=server_1:MINIMAL:N,server_2:MINIMAL:Y,server_3:MINIMAL:Y +-- source include/rpl_row_img_set.inc + +-- let $row_img_test_script= extra/rpl_tests/rpl_row_img.test +-- source suite/tokudb.rpl/include/rpl_tokudb_row_img_general_loop.inc + +-- let $row_img_set=server_1:FULL:N,server_2:FULL:Y,server_3:FULL:Y +-- source include/rpl_row_img_set.inc + + +-- source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_img_eng_noblob.test b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_img_eng_noblob.test new file mode 100644 index 00000000000..f539e3ac370 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_img_eng_noblob.test @@ -0,0 +1,43 @@ +#Want to skip this test from daily Valgrind execution +skip Require rpl files from MySQL; +-- source include/no_valgrind_without_big.inc +# +# This file contains tests for WL#5096 and bug fixes. +# + +-- let $rpl_topology= 1->2->3 +-- source include/rpl_init.inc +-- source include/have_binlog_format_row.inc + +-- connection server_1 +-- source include/have_innodb.inc +-- source include/have_tokudb.inc +-- connection server_2 +-- source include/have_innodb.inc +-- source include/have_tokudb.inc +-- connection server_3 +-- source include/have_innodb.inc +-- source include/have_tokudb.inc +-- connection server_1 + +# +# WL#5096 +# + +# +# Tests for different storage engines on each server, +# but same index structure on tables. The tests are conducted +# using NOBLOB binlog-row-image on all servers. +# + +-- let $row_img_set=server_1:NOBLOB:N,server_2:NOBLOB:Y,server_3:NOBLOB:Y +-- source include/rpl_row_img_set.inc + +-- let $row_img_test_script= extra/rpl_tests/rpl_row_img.test +-- source suite/tokudb.rpl/include/rpl_tokudb_row_img_general_loop.inc + +-- let $row_img_set=server_1:FULL:N,server_2:FULL:Y,server_3:FULL:Y +-- source include/rpl_row_img_set.inc + + +-- source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_img_idx_full.test b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_img_idx_full.test new file mode 100644 index 00000000000..9dfd1675f53 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_img_idx_full.test @@ -0,0 +1,39 @@ +#Want to skip this test from daily Valgrind execution +skip Require rpl files from MySQL; +-- source include/no_valgrind_without_big.inc +# +# This file contains tests for WL#5096. +# + +-- let $rpl_topology= 1->2->3 +-- source include/rpl_init.inc +-- source include/have_binlog_format_row.inc + +-- connection server_1 +-- source include/have_innodb.inc +-- source include/have_tokudb.inc +-- connection server_2 +-- source include/have_innodb.inc +-- source include/have_tokudb.inc +-- connection server_3 +-- source include/have_innodb.inc +-- source include/have_tokudb.inc +-- connection server_1 + +# +# WL#5096 Tests. +# + +# +# Tests FULL image against a mix of MyISAM and InnoDB engines on +# each of the three servers. +# + +-- let $row_img_set=server_1:FULL:N,server_2:FULL:Y,server_3:FULL:Y +-- source include/rpl_row_img_set.inc + +-- let $row_img_test_script= extra/rpl_tests/rpl_row_img_diff_indexes.test +-- source suite/tokudb.rpl/include/rpl_tokudb_row_img_general_loop.inc + + +-- source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_img_idx_min.test b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_img_idx_min.test new file mode 100644 index 00000000000..03e022940a6 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_img_idx_min.test @@ -0,0 +1,42 @@ +#Want to skip this test from daily Valgrind execution +skip Require rpl files from MySQL; +--source include/no_valgrind_without_big.inc +# +# This file contains tests for WL#5096. +# + +--let $rpl_topology= 1->2->3 +--source include/rpl_init.inc +-- source include/have_binlog_format_row.inc + +-- connection server_1 +-- source include/have_innodb.inc +-- source include/have_tokudb.inc +-- connection server_2 +-- source include/have_innodb.inc +-- source include/have_tokudb.inc +-- connection server_3 +-- source include/have_innodb.inc +-- source include/have_tokudb.inc +-- connection server_1 + +# +# WL#5096 Tests. +# + +# +# Tests MINIMAL image against a mix of MyISAM and InnoDB engines on +# each of the three servers. +# + +-- let $row_img_set=server_1:MINIMAL:N,server_2:MINIMAL:Y,server_3:MINIMAL:Y +-- source include/rpl_row_img_set.inc + +-- let $row_img_test_script= extra/rpl_tests/rpl_row_img_diff_indexes.test +-- source suite/tokudb.rpl/include/rpl_tokudb_row_img_general_loop.inc + +-- let $row_img_set=server_1:FULL:N,server_2:FULL:Y,server_3:FULL:Y +-- source include/rpl_row_img_set.inc + + +-- source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_img_idx_noblob.test b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_img_idx_noblob.test new file mode 100644 index 00000000000..ed147c8902b --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_img_idx_noblob.test @@ -0,0 +1,42 @@ +#Want to skip this test from daily Valgrind execution +skip Require rpl files from MySQL; +-- source include/no_valgrind_without_big.inc +# +# This file contains tests for WL#5096. +# + +-- let $rpl_topology= 1->2->3 +-- source include/rpl_init.inc +-- source include/have_binlog_format_row.inc + +-- connection server_1 +-- source include/have_innodb.inc +-- source include/have_tokudb.inc +-- connection server_2 +-- source include/have_innodb.inc +-- source include/have_tokudb.inc +-- connection server_3 +-- source include/have_innodb.inc +-- source include/have_tokudb.inc +-- connection server_1 + +# +# WL#5096 +# + +# +# Tests NOBLOB image against a mix of MyISAM and InnoDB engines on +# each of the three servers. +# + +-- let $row_img_set=server_1:NOBLOB:N,server_2:NOBLOB:Y,server_3:NOBLOB:Y +-- source include/rpl_row_img_set.inc + +-- let $row_img_test_script= extra/rpl_tests/rpl_row_img_diff_indexes.test +-- source suite/tokudb.rpl/include/rpl_tokudb_row_img_general_loop.inc + +-- let $row_img_set=server_1:FULL:N,server_2:FULL:Y,server_3:FULL:Y +-- source include/rpl_row_img_set.inc + + +-- source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_log-master.opt b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_log-master.opt new file mode 100644 index 00000000000..773ec62bef2 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_log-master.opt @@ -0,0 +1,2 @@ +--skip-external-locking +--default-storage-engine=MyISAM diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_log.test b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_log.test new file mode 100644 index 00000000000..826eb5eab86 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_log.test @@ -0,0 +1,14 @@ +################################### +# Wrapper for rpl_row_log.test # +# Added wrapper so that MyISAM & # +# Innodb and NDB could all use the# +# Same test. NDB produced a diff # +# bin-log # +################################### +-- source include/have_binlog_format_row.inc +-- source include/have_tokudb.inc +-- source include/master-slave.inc +let $engine_type=TokuDB; +-- source extra/rpl_tests/rpl_log.test + +--source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_lower_case_table_names-slave.opt b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_lower_case_table_names-slave.opt new file mode 100644 index 00000000000..8be29bbe976 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_lower_case_table_names-slave.opt @@ -0,0 +1 @@ +--replicate-do-db=bug_37656 --replicate-ignore-table=bug_37656.t1 --replicate-do-table=bug_37656.t2 --replicate-do-table=bug_37656.t3 --lower-case-table-names=1 diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_lower_case_table_names.test b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_lower_case_table_names.test new file mode 100644 index 00000000000..c9f6d9055b3 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_lower_case_table_names.test @@ -0,0 +1,15 @@ +# BUG#37656 +# +# For details look into extra/rpl_tests/rpl_lower_case_table_names.test +# +skip Missing extra/rpl_tests/rpl_lower_case_table_names.test; + +-- source include/not_gtid_enabled.inc +-- source include/have_tokudb.inc +-- source include/not_windows.inc +-- source include/have_binlog_format_row.inc +-- source include/master-slave.inc + +-- let $engine=TokuDB +-- source extra/rpl_tests/rpl_lower_case_table_names.test +-- source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_sp003.test b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_sp003.test new file mode 100644 index 00000000000..1c5be34fb23 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_sp003.test @@ -0,0 +1,13 @@ +################################# +# Wrapper for rpl_row_sp003.test# +################################# +######################################################## +# By JBM 2005-02-15 Wrapped to allow reuse of test code# +# Added to skip if ndb is default # +######################################################## +-- source include/have_tokudb.inc +-- source include/have_binlog_format_row.inc +-- source include/master-slave.inc +let $engine_type=TOKUDB; +-- source extra/rpl_tests/rpl_row_sp003.test +-- source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_sp006.test b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_sp006.test new file mode 100644 index 00000000000..064339b8e68 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_sp006.test @@ -0,0 +1,13 @@ +################################# +# Wrapper for rpl_row_sp006.test# +################################# +######################################################## +# By JBM 2005-02-15 Wrapped to allow reuse of test code# +# Added to skip if ndb is default # +######################################################## +-- source include/have_tokudb.inc +-- source include/have_binlog_format_row.inc +-- source include/master-slave.inc +let $engine_type=TokuDB; +-- source extra/rpl_tests/rpl_row_sp006.test +-- source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_trig004.test b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_trig004.test new file mode 100644 index 00000000000..471c5f8cc3d --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_row_trig004.test @@ -0,0 +1,18 @@ +############################################################################# +# Original Author: JBM # +# Original Date: Oct/18/2005 # +############################################################################# +# TEST: Use before insert triggers and has the second insert fail # +############################################################################# +# Change by JBM 2006-02-14 added to skip when NDB default engine # +# This test has been wrapped to allow multipal engines to use same code # +############################################################################# + +# Includes +-- source include/have_binlog_format_row.inc +-- source include/have_tokudb.inc +-- source include/master-slave.inc +let $engine_type=TOKUDB; +-- source extra/rpl_tests/rpl_trig004.test + +-- source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_stm_log-master.opt b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_stm_log-master.opt new file mode 100644 index 00000000000..773ec62bef2 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_stm_log-master.opt @@ -0,0 +1,2 @@ +--skip-external-locking +--default-storage-engine=MyISAM diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_stm_log.test b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_stm_log.test new file mode 100644 index 00000000000..b877d555619 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_stm_log.test @@ -0,0 +1,14 @@ +################################### +# Wrapper for rpl_row_log.test # +# Added wrapper so that MyISAM & # +# Innodb and NDB could all use the# +# Same test. NDB produced a diff # +# bin-log # +################################### +-- source include/have_binlog_format_statement.inc +-- source include/have_tokudb.inc +-- source include/master-slave.inc +let $engine_type=TokuDB; +-- source extra/rpl_tests/rpl_log.test + +--source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_stm_mixed_crash_safe-master.opt b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_stm_mixed_crash_safe-master.opt new file mode 100644 index 00000000000..e980c2de7ff --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_stm_mixed_crash_safe-master.opt @@ -0,0 +1 @@ +--transaction_isolation=READ-COMMITTED diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_stm_mixed_crash_safe-slave.opt b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_stm_mixed_crash_safe-slave.opt new file mode 100644 index 00000000000..264c5c1a4b4 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_stm_mixed_crash_safe-slave.opt @@ -0,0 +1 @@ +--skip-slave-start --relay-log-info-repository=TABLE --relay-log-recovery=1 --transaction_isolation=READ-COMMITTED diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_stm_mixed_crash_safe.test b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_stm_mixed_crash_safe.test new file mode 100644 index 00000000000..724550fae4a --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_stm_mixed_crash_safe.test @@ -0,0 +1,18 @@ +--source include/big_test.inc +--source include/not_embedded.inc +--source include/not_valgrind.inc +--source include/have_debug.inc +--source include/have_tokudb.inc +--source include/have_binlog_format_mixed_or_statement.inc +--source include/not_mts_slave_parallel_workers.inc +--source include/master-slave.inc + +call mtr.add_suppression('Attempting backtrace'); +call mtr.add_suppression("Recovery from master pos .* and file master-bin.000001"); +call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +call mtr.add_suppression(".* InnoDB: Warning: allocated tablespace .*, old maximum was .*"); + +let $engine_type=TokuDB; +let $database_name=test; +--source extra/rpl_tests/rpl_crash_safe.test +--source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_stm_mixed_lower_case_table_names-slave.opt b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_stm_mixed_lower_case_table_names-slave.opt new file mode 100644 index 00000000000..8be29bbe976 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_stm_mixed_lower_case_table_names-slave.opt @@ -0,0 +1 @@ +--replicate-do-db=bug_37656 --replicate-ignore-table=bug_37656.t1 --replicate-do-table=bug_37656.t2 --replicate-do-table=bug_37656.t3 --lower-case-table-names=1 diff --git a/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_stm_mixed_lower_case_table_names.test b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_stm_mixed_lower_case_table_names.test new file mode 100644 index 00000000000..f9fd0e13b83 --- /dev/null +++ b/storage/tokudb/mysql-test/rpl/t/rpl_tokudb_stm_mixed_lower_case_table_names.test @@ -0,0 +1,14 @@ +# BUG#37656 +# +# For details look into extra/rpl_tests/rpl_lower_case_table_names.test +# +skip Missing extra/rpl_tests/rpl_lower_case_table_names.test; + +-- source include/have_tokudb.inc +-- source include/not_windows.inc +-- source include/have_binlog_format_mixed_or_statement.inc +-- source include/master-slave.inc + +-- let $engine=TokuDB +-- source extra/rpl_tests/rpl_lower_case_table_names.test +-- source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/tokudb/r/bug-1657908.result b/storage/tokudb/mysql-test/tokudb/r/bug-1657908.result new file mode 100644 index 00000000000..1d86478d833 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb/r/bug-1657908.result @@ -0,0 +1,70 @@ +SET GLOBAL tokudb_dir_per_db=ON; +CREATE PROCEDURE create_table() +BEGIN +CREATE TABLE test.t1 ( +a INT +) ENGINE = TokuDB +PARTITION BY RANGE (a) +(PARTITION p100 VALUES LESS THAN (100) ENGINE = TokuDB, +PARTITION p_to_del VALUES LESS THAN (200) ENGINE = TokuDB, +PARTITION p300 VALUES LESS THAN (300) ENGINE = TokuDB, +PARTITION p400 VALUES LESS THAN (400) ENGINE = TokuDB +); +END| +### Create partitioned table +CALL create_table(); +## Looking for *.tokudb files in data_dir +## Looking for *.tokudb files in data_dir/test +t1_P_p100_main_id.tokudb +t1_P_p100_status_id.tokudb +t1_P_p300_main_id.tokudb +t1_P_p300_status_id.tokudb +t1_P_p400_main_id.tokudb +t1_P_p400_status_id.tokudb +t1_P_p_to_del_main_id.tokudb +t1_P_p_to_del_status_id.tokudb +### Stop server +### Remove 'main' file of one of the partitions +### Start server +### Make sure 'main' partition file is deleted +## Looking for *.tokudb files in data_dir +## Looking for *.tokudb files in data_dir/test +t1_P_p100_main_id.tokudb +t1_P_p100_status_id.tokudb +t1_P_p300_main_id.tokudb +t1_P_p300_status_id.tokudb +t1_P_p400_main_id.tokudb +t1_P_p400_status_id.tokudb +t1_P_p_to_del_status_id.tokudb +### Make sure the table still exists +SHOW TABLES; +Tables_in_test +t1 +### Drop table +DROP TABLE t1; +### Make sure the table is dropped +SHOW TABLES; +Tables_in_test +### Check what files still exist after DROP TABLE +## Looking for *.tokudb files in data_dir +## Looking for *.tokudb files in data_dir/test +### Remove the rest of the files +### Make sure there are no tokudb files +## Looking for *.tokudb files in data_dir +## Looking for *.tokudb files in data_dir/test +### Create the same table once more +CALL create_table(); +## Looking for *.tokudb files in data_dir +## Looking for *.tokudb files in data_dir/test +t1_P_p100_main_id.tokudb +t1_P_p100_status_id.tokudb +t1_P_p300_main_id.tokudb +t1_P_p300_status_id.tokudb +t1_P_p400_main_id.tokudb +t1_P_p400_status_id.tokudb +t1_P_p_to_del_main_id.tokudb +t1_P_p_to_del_status_id.tokudb +### Restore state +DROP TABLE t1; +DROP PROCEDURE create_table; +SET GLOBAL tokudb_dir_per_db=default; diff --git a/storage/tokudb/mysql-test/tokudb/r/dir_cmd.result b/storage/tokudb/mysql-test/tokudb/r/dir_cmd.result new file mode 100644 index 00000000000..dd3b693db49 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb/r/dir_cmd.result @@ -0,0 +1,58 @@ +SET GLOBAL tokudb_dir_per_db = ON; +SET tokudb_dir_cmd = "attach test_dname_1 test_iname_1"; +SET tokudb_dir_cmd = "attach test_dname_2 test_iname_2"; +SELECT dictionary_name, internal_file_name +FROM information_schema.TokuDB_file_map; +dictionary_name internal_file_name +test_dname_1 test_iname_1 +test_dname_2 test_iname_2 +SET tokudb_dir_cmd = "detach test_dname_1"; +SELECT dictionary_name, internal_file_name +FROM information_schema.TokuDB_file_map; +dictionary_name internal_file_name +test_dname_2 test_iname_2 +SET tokudb_dir_cmd = "move test_dname_2 test_dname_3"; +SELECT dictionary_name, internal_file_name +FROM information_schema.TokuDB_file_map; +dictionary_name internal_file_name +test_dname_3 test_iname_2 +SET tokudb_dir_cmd = "detach test_dname_3"; +SELECT dictionary_name, internal_file_name +FROM information_schema.TokuDB_file_map; +dictionary_name internal_file_name +CREATE TABLE t1(a int) ENGINE=tokudb; +INSERT INTO t1 (a) VALUES (10); +SELECT dictionary_name, internal_file_name +FROM information_schema.TokuDB_file_map; +dictionary_name internal_file_name +./test/t1-main ./test/t1_main_id.tokudb +./test/t1-status ./test/t1_status_id.tokudb +SET tokudb_dir_cmd = "attach ./test/t1-main test/t1-main-renamed.tokudb"; +SELECT dictionary_name, internal_file_name +FROM information_schema.TokuDB_file_map; +dictionary_name internal_file_name +./test/t1-main test/t1-main-renamed.tokudb +./test/t1-status ./test/t1_status_id.tokudb +### rename t1_main_id.tokudb to t1-main-renamed.tokudb +SELECT * FROM t1; +a +10 +### Test for errors notification +SET tokudb_dir_cmd = "detach foo"; +ERROR 42000: Variable 'tokudb_dir_cmd' can't be set to the value of 'detach foo' +SELECT @@tokudb_dir_cmd_last_error; +@@tokudb_dir_cmd_last_error +17 +SELECT @@tokudb_dir_cmd_last_error_string; +@@tokudb_dir_cmd_last_error_string +detach command error +SET @@tokudb_dir_cmd_last_error_string = "blablabla"; +SELECT @@tokudb_dir_cmd_last_error_string; +@@tokudb_dir_cmd_last_error_string +blablabla +SET STATEMENT tokudb_dir_cmd_last_error_string = "statement_blablabla" FOR +SELECT @@tokudb_dir_cmd_last_error_string; +@@tokudb_dir_cmd_last_error_string +statement_blablabla +DROP TABLE t1; +SET GLOBAL tokudb_dir_per_db = default; diff --git a/storage/tokudb/mysql-test/tokudb/r/kill_query_blocked_in_lt.result b/storage/tokudb/mysql-test/tokudb/r/kill_query_blocked_in_lt.result new file mode 100644 index 00000000000..27423a840e8 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb/r/kill_query_blocked_in_lt.result @@ -0,0 +1,26 @@ +### connection default +CREATE TABLE t (a INT PRIMARY KEY, b INT) ENGINE=TokuDB; +INSERT INTO t (a, b) VALUES (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), +(6, 6), (7, 7), (8, 8), (9, 9), (10, 10), +(11, 11), (12, 12), (13, 13), (14, 14), (15, 15), +(16, 16), (17, 17), (18, 18), (19, 19), (20, 20); +### connection con1 +SET DEBUG_SYNC= 'toku_range_lock_granted_immediately SIGNAL lock_granted WAIT_FOR lock_granted_continue'; +UPDATE t SET b=1 WHERE a BETWEEN 5 AND 10; +### connection default +SET DEBUG_SYNC= 'now WAIT_FOR lock_granted'; +### connection con2 +SET DEBUG_SYNC= 'toku_range_lock_before_wait SIGNAL lock_not_granted WAIT_FOR lock_not_granted_continue'; +SET DEBUG_SYNC= 'toku_range_lock_not_granted_after_wait SIGNAL lock_not_granted_after_wait'; +UPDATE t SET b=1 WHERE a BETWEEN 5 AND 10; +### connection default +SET DEBUG_SYNC= 'now SIGNAL lock_not_granted_continue WAIT_FOR lock_not_granted'; +KILL QUERY con2_id +SET DEBUG_SYNC= 'now SIGNAL lock_granted_continue WAIT_FOR lock_not_granted_after_wait'; +### connection con1 +### reap +### connection con2 +### reap +ERROR 70100: Query execution was interrupted +### connection default +DROP TABLE t; diff --git a/storage/tokudb/mysql-test/tokudb/r/locks-select-update-3.result b/storage/tokudb/mysql-test/tokudb/r/locks-select-update-3.result index e8c82b65967..af728338110 100644 --- a/storage/tokudb/mysql-test/tokudb/r/locks-select-update-3.result +++ b/storage/tokudb/mysql-test/tokudb/r/locks-select-update-3.result @@ -1,6 +1,4 @@ -SET DEFAULT_STORAGE_ENGINE='tokudb'; -drop table if exists t; -create table t (a int primary key, b int); +create table t (a int primary key, b int) engine=tokudb; insert into t values (1,0); set session transaction isolation level read committed; begin; @@ -9,7 +7,7 @@ a b 1 0 update t set b=b+1 where a=1; connect conn1,localhost,root; -set session tokudb_lock_timeout= 60000; +set session tokudb_lock_timeout=60000; set session transaction isolation level read committed; begin; select * from t where a=1 for update; diff --git a/storage/tokudb/mysql-test/tokudb/t/background_job_manager.opt b/storage/tokudb/mysql-test/tokudb/t/background_job_manager.opt deleted file mode 100644 index 3cc9ea3009e..00000000000 --- a/storage/tokudb/mysql-test/tokudb/t/background_job_manager.opt +++ /dev/null @@ -1 +0,0 @@ ---tokudb-background-job-status diff --git a/storage/tokudb/mysql-test/tokudb/t/background_job_manager.test b/storage/tokudb/mysql-test/tokudb/t/background_job_manager.test index 933814442e0..709fc463696 100644 --- a/storage/tokudb/mysql-test/tokudb/t/background_job_manager.test +++ b/storage/tokudb/mysql-test/tokudb/t/background_job_manager.test @@ -1,3 +1,4 @@ +skip Background Job Manager not supported in MariaDB; # This is a comprehensive test for the background job manager and # the information_schema.tokudb_background_job_status table # diff --git a/storage/tokudb/mysql-test/tokudb/t/bug-1657908.test b/storage/tokudb/mysql-test/tokudb/t/bug-1657908.test new file mode 100644 index 00000000000..adcf4ef55f6 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb/t/bug-1657908.test @@ -0,0 +1,73 @@ +--source include/have_partition.inc +# See https://bugs.launchpad.net/percona-server/+bug/1657908 + +source include/have_tokudb.inc; + +SET GLOBAL tokudb_dir_per_db=ON; + +--let $DB= test +--let $DATADIR= `SELECT @@datadir` + +--delimiter | +CREATE PROCEDURE create_table() +BEGIN +CREATE TABLE test.t1 ( + a INT +) ENGINE = TokuDB +PARTITION BY RANGE (a) +(PARTITION p100 VALUES LESS THAN (100) ENGINE = TokuDB, + PARTITION p_to_del VALUES LESS THAN (200) ENGINE = TokuDB, + PARTITION p300 VALUES LESS THAN (300) ENGINE = TokuDB, + PARTITION p400 VALUES LESS THAN (400) ENGINE = TokuDB +); +END| +--delimiter ; + +--echo ### Create partitioned table +CALL create_table(); +--source dir_per_db_show_table_files.inc + +--echo ### Stop server +--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--shutdown_server +--source include/wait_until_disconnected.inc + +--echo ### Remove 'main' file of one of the partitions +--remove_files_wildcard $DATADIR/$DB t1_P_p_to_del_main_*.tokudb + +--echo ### Start server +--enable_reconnect +--exec echo "restart: --loose-tokudb-dir-per-db=ON" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--source include/wait_until_connected_again.inc + +--echo ### Make sure 'main' partition file is deleted +--source dir_per_db_show_table_files.inc + +--echo ### Make sure the table still exists +SHOW TABLES; + +--echo ### Drop table +# error 1051 was here before the fix +DROP TABLE t1; + +--echo ### Make sure the table is dropped +SHOW TABLES; + +--echo ### Check what files still exist after DROP TABLE +--source dir_per_db_show_table_files.inc + +--echo ### Remove the rest of the files +--remove_files_wildcard $DATADIR/$DB *.tokudb + +--echo ### Make sure there are no tokudb files +--source dir_per_db_show_table_files.inc + +--echo ### Create the same table once more +# engine error 17 (EEXIST) was here before the fix +CALL create_table(); +--source dir_per_db_show_table_files.inc + +--echo ### Restore state +DROP TABLE t1; +DROP PROCEDURE create_table; +SET GLOBAL tokudb_dir_per_db=default; diff --git a/storage/tokudb/mysql-test/tokudb/t/card_auto_analyze_lots.test b/storage/tokudb/mysql-test/tokudb/t/card_auto_analyze_lots.test index ec74a4a28bc..9675449372b 100644 --- a/storage/tokudb/mysql-test/tokudb/t/card_auto_analyze_lots.test +++ b/storage/tokudb/mysql-test/tokudb/t/card_auto_analyze_lots.test @@ -1,3 +1,4 @@ +skip Background Job Manager not supported in MariaDB; # Test the auto analyze on lots of tables -- source include/have_tokudb.inc diff --git a/storage/tokudb/mysql-test/tokudb/t/dir_cmd.test b/storage/tokudb/mysql-test/tokudb/t/dir_cmd.test new file mode 100644 index 00000000000..b9d8c80de65 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb/t/dir_cmd.test @@ -0,0 +1,52 @@ +skip TokuDB dir CMD disabled in MariaDB; +source include/have_tokudb.inc; + +--let $MYSQL_DATADIR=`select @@datadir` + +SET GLOBAL tokudb_dir_per_db = ON; + +SET tokudb_dir_cmd = "attach test_dname_1 test_iname_1"; +SET tokudb_dir_cmd = "attach test_dname_2 test_iname_2"; +SELECT dictionary_name, internal_file_name + FROM information_schema.TokuDB_file_map; + +SET tokudb_dir_cmd = "detach test_dname_1"; +SELECT dictionary_name, internal_file_name + FROM information_schema.TokuDB_file_map; + +SET tokudb_dir_cmd = "move test_dname_2 test_dname_3"; +SELECT dictionary_name, internal_file_name + FROM information_schema.TokuDB_file_map; + +SET tokudb_dir_cmd = "detach test_dname_3"; +SELECT dictionary_name, internal_file_name + FROM information_schema.TokuDB_file_map; + +CREATE TABLE t1(a int) ENGINE=tokudb; +INSERT INTO t1 (a) VALUES (10); +--source include/table_files_replace_pattern.inc +SELECT dictionary_name, internal_file_name + FROM information_schema.TokuDB_file_map; + +SET tokudb_dir_cmd = "attach ./test/t1-main test/t1-main-renamed.tokudb"; +--source include/table_files_replace_pattern.inc +SELECT dictionary_name, internal_file_name + FROM information_schema.TokuDB_file_map; + +--echo ### rename t1_main_id.tokudb to t1-main-renamed.tokudb +--exec mv $MYSQL_DATADIR/test/t1_main_*.tokudb $MYSQL_DATADIR/test/t1-main-renamed.tokudb + +SELECT * FROM t1; + +--echo ### Test for errors notification +--error 1231 +SET tokudb_dir_cmd = "detach foo"; +SELECT @@tokudb_dir_cmd_last_error; +SELECT @@tokudb_dir_cmd_last_error_string; +SET @@tokudb_dir_cmd_last_error_string = "blablabla"; +SELECT @@tokudb_dir_cmd_last_error_string; +SET STATEMENT tokudb_dir_cmd_last_error_string = "statement_blablabla" FOR + SELECT @@tokudb_dir_cmd_last_error_string; + +DROP TABLE t1; +SET GLOBAL tokudb_dir_per_db = default; diff --git a/storage/tokudb/mysql-test/tokudb/t/i_s_tokudb_lock_waits_timeout.test b/storage/tokudb/mysql-test/tokudb/t/i_s_tokudb_lock_waits_timeout.test index 42fb548814f..8fe5e66a9b3 100644 --- a/storage/tokudb/mysql-test/tokudb/t/i_s_tokudb_lock_waits_timeout.test +++ b/storage/tokudb/mysql-test/tokudb/t/i_s_tokudb_lock_waits_timeout.test @@ -1,3 +1,4 @@ +skip Tokudb Lock Waits not in I_S in MariaDB; # verify that tokudb_locks and tokudb_lock_waits contents for 2 conflicting transactions with a lock timeout source include/have_tokudb.inc; diff --git a/storage/tokudb/mysql-test/tokudb/t/i_s_tokudb_locks.test b/storage/tokudb/mysql-test/tokudb/t/i_s_tokudb_locks.test index 8f205ad7f45..59d04ead386 100644 --- a/storage/tokudb/mysql-test/tokudb/t/i_s_tokudb_locks.test +++ b/storage/tokudb/mysql-test/tokudb/t/i_s_tokudb_locks.test @@ -1,3 +1,4 @@ +skip Tokudb Lock Waits not in I_S in MariaDB; # verify that information_schema.tokudb_locks gets populated with locks for 2 clients source include/have_tokudb.inc; diff --git a/storage/tokudb/mysql-test/tokudb/t/i_s_tokudb_trx.test b/storage/tokudb/mysql-test/tokudb/t/i_s_tokudb_trx.test index 517280391c4..b4ab64be962 100644 --- a/storage/tokudb/mysql-test/tokudb/t/i_s_tokudb_trx.test +++ b/storage/tokudb/mysql-test/tokudb/t/i_s_tokudb_trx.test @@ -1,3 +1,4 @@ +skip Tokudb trx not in I_S in MariaDB; # verify that information_schema.tokudb_trx gets populated with transactions source include/have_tokudb.inc; diff --git a/storage/tokudb/mysql-test/tokudb/t/kill_query_blocked_in_lt.test b/storage/tokudb/mysql-test/tokudb/t/kill_query_blocked_in_lt.test new file mode 100644 index 00000000000..f1412f0cd40 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb/t/kill_query_blocked_in_lt.test @@ -0,0 +1,57 @@ +--source include/have_tokudb.inc +--source include/have_debug_sync.inc + +--echo ### connection default + +skip MDEV-13442; +CREATE TABLE t (a INT PRIMARY KEY, b INT) ENGINE=TokuDB; + +INSERT INTO t (a, b) VALUES (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), + (6, 6), (7, 7), (8, 8), (9, 9), (10, 10), + (11, 11), (12, 12), (13, 13), (14, 14), (15, 15), + (16, 16), (17, 17), (18, 18), (19, 19), (20, 20); + +--connect(con1, localhost, root) +--connect(con2, localhost, root) + +--connection con1 +--echo ### connection con1 +SET DEBUG_SYNC= 'toku_range_lock_granted_immediately SIGNAL lock_granted WAIT_FOR lock_granted_continue'; +--send UPDATE t SET b=1 WHERE a BETWEEN 5 AND 10 + +--connection default +--echo ### connection default +SET DEBUG_SYNC= 'now WAIT_FOR lock_granted'; + +--connection con2 +--echo ### connection con2 +--let $con2_id= `SELECT CONNECTION_ID()` +SET DEBUG_SYNC= 'toku_range_lock_before_wait SIGNAL lock_not_granted WAIT_FOR lock_not_granted_continue'; +SET DEBUG_SYNC= 'toku_range_lock_not_granted_after_wait SIGNAL lock_not_granted_after_wait'; +--send UPDATE t SET b=1 WHERE a BETWEEN 5 AND 10 + +--connection default +--echo ### connection default +SET DEBUG_SYNC= 'now SIGNAL lock_not_granted_continue WAIT_FOR lock_not_granted'; + +--disable_query_log +--eval KILL QUERY $con2_id +--enable_query_log +--echo KILL QUERY con2_id +SET DEBUG_SYNC= 'now SIGNAL lock_granted_continue WAIT_FOR lock_not_granted_after_wait'; + +--connection con1 +--echo ### connection con1 +--echo ### reap +--reap + +--connection con2 +--echo ### connection con2 +--echo ### reap +--error ER_QUERY_INTERRUPTED +--reap + +--connection default +--echo ### connection default + +DROP TABLE t; diff --git a/storage/tokudb/mysql-test/tokudb/t/locks-select-update-3.test b/storage/tokudb/mysql-test/tokudb/t/locks-select-update-3.test index 5b54fa7313e..fcd89d5783f 100644 --- a/storage/tokudb/mysql-test/tokudb/t/locks-select-update-3.test +++ b/storage/tokudb/mysql-test/tokudb/t/locks-select-update-3.test @@ -1,12 +1,8 @@ source include/have_tokudb.inc; +source include/count_sessions.inc; # test that select for update is executed with serializable isolation -SET DEFAULT_STORAGE_ENGINE='tokudb'; - ---disable_warnings -drop table if exists t; ---enable_warnings -create table t (a int primary key, b int); +create table t (a int primary key, b int) engine=tokudb; insert into t values (1,0); set session transaction isolation level read committed; begin; @@ -15,7 +11,7 @@ select * from t where a=1 for update; # t2 update update t set b=b+1 where a=1; connect(conn1,localhost,root); -set session tokudb_lock_timeout= 60000; +set session tokudb_lock_timeout=60000; set session transaction isolation level read committed; begin; # t2 select for update, should hang until t1 commits @@ -34,3 +30,4 @@ connection default; disconnect conn1; drop table t; +source include/wait_until_count_sessions.inc; diff --git a/storage/tokudb/mysql-test/tokudb_alter_table/r/ai_part.result b/storage/tokudb/mysql-test/tokudb_alter_table/r/ai_part.result index 714b0d861c0..29d2be47f1c 100644 --- a/storage/tokudb/mysql-test/tokudb_alter_table/r/ai_part.result +++ b/storage/tokudb/mysql-test/tokudb_alter_table/r/ai_part.result @@ -10,7 +10,7 @@ foo CREATE TABLE `foo` ( `b` int(11) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) + PARTITION BY HASH (`a`) PARTITIONS 2 ALTER TABLE foo ADD KEY(b); SHOW CREATE TABLE foo; @@ -21,6 +21,6 @@ foo CREATE TABLE `foo` ( PRIMARY KEY (`a`), KEY `b` (`b`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) + PARTITION BY HASH (`a`) PARTITIONS 2 DROP TABLE foo; diff --git a/storage/tokudb/mysql-test/tokudb_alter_table/r/hcad_part.result b/storage/tokudb/mysql-test/tokudb_alter_table/r/hcad_part.result index f8562bfc25c..99f87aec225 100644 --- a/storage/tokudb/mysql-test/tokudb_alter_table/r/hcad_part.result +++ b/storage/tokudb/mysql-test/tokudb_alter_table/r/hcad_part.result @@ -9,7 +9,7 @@ foo CREATE TABLE `foo` ( `b` int(11) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) + PARTITION BY HASH (`a`) PARTITIONS 2 ALTER TABLE foo ADD COLUMN c INT; SHOW CREATE TABLE foo; @@ -20,6 +20,6 @@ foo CREATE TABLE `foo` ( `c` int(11) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) + PARTITION BY HASH (`a`) PARTITIONS 2 DROP TABLE foo; diff --git a/storage/tokudb/mysql-test/tokudb_backup/r/backup_master_info.result b/storage/tokudb/mysql-test/tokudb_backup/r/backup_master_info.result new file mode 100644 index 00000000000..992a828e287 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_backup/r/backup_master_info.result @@ -0,0 +1,26 @@ +### +# Test for binlog position +##### +include/master-slave.inc +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +[connection master] +CREATE TABLE t1(a INT) ENGINE=TokuDB; +DROP TABLE t1; +Backup +include/filter_file.inc +### tokubackup_slave_info content: +host: #.#.#.#, user: ####, port: ####, master log file: ####, relay log file: ####, exec master log pos: ####, executed gtid set: , channel name: +### +# Test for gtid set +##### +include/rpl_set_gtid_mode.inc +CREATE TABLE t1(a INT) ENGINE=TokuDB; +DROP TABLE t1; +Backup +include/filter_file.inc +### tokubackup_slave_info content: +host: #.#.#.#, user: ####, port: ####, master log file: ####, relay log file: ####, exec master log pos: ####, executed gtid set: ####, channel name: +include/rpl_set_gtid_mode.inc +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/tokudb_backup/r/backup_master_state.result b/storage/tokudb/mysql-test/tokudb_backup/r/backup_master_state.result new file mode 100644 index 00000000000..072dfff448b --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_backup/r/backup_master_state.result @@ -0,0 +1,36 @@ +### Create backup dir +include/master-slave.inc +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +[connection master] +### Check for settings +SELECT @@gtid_mode; +@@gtid_mode +OFF +### Generate some binlog events +CREATE TABLE t1(a INT) ENGINE=TokuDB; +DROP TABLE t1; +### Master backup +include/filter_file.inc +### tokubackup_binlog_info content: +filename: ####, position: ####, gtid_mode: OFF, GTID of last change: +### Delete backup dir +### Create backup dir +### GTID-mode on +include/rpl_set_gtid_mode.inc +### Check for settings +SELECT @@gtid_mode; +@@gtid_mode +ON +### Generate some binlog events +CREATE TABLE t1(a INT) ENGINE=TokuDB; +DROP TABLE t1; +### Master backup +include/filter_file.inc +### tokubackup_binlog_info content: +filename: ####, position: ####, gtid_mode: ON, GTID of last change: ##### +### Delete backup dir +### GTID-mode off +include/rpl_set_gtid_mode.inc +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/tokudb_backup/r/empty_slave_info_file.result b/storage/tokudb/mysql-test/tokudb_backup/r/empty_slave_info_file.result new file mode 100644 index 00000000000..a0af40d80cc --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_backup/r/empty_slave_info_file.result @@ -0,0 +1 @@ +Backup diff --git a/storage/tokudb/mysql-test/tokudb_backup/r/innodb_use_native_aio_enabled.result b/storage/tokudb/mysql-test/tokudb_backup/r/innodb_use_native_aio_enabled.result new file mode 100644 index 00000000000..94e113fc87d --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_backup/r/innodb_use_native_aio_enabled.result @@ -0,0 +1,5 @@ +SELECT @@innodb_use_native_aio; +@@innodb_use_native_aio +1 +SET SESSION tokudb_backup_dir='MYSQL_TMP_DIR/tokudb_backup'; +ERROR 42000: Variable 'tokudb_backup_dir' can't be set to the value of 'MYSQL_TMP_DIR/tokudb_backup' diff --git a/storage/tokudb/mysql-test/tokudb_backup/r/rpl_safe_slave.result b/storage/tokudb/mysql-test/tokudb_backup/r/rpl_safe_slave.result new file mode 100644 index 00000000000..3f742690bd8 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_backup/r/rpl_safe_slave.result @@ -0,0 +1,75 @@ +### +# Master-slave test +#### +include/rpl_init.inc [topology=1->2] +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +### Create temp table on master +CREATE TEMPORARY TABLE t1 (a INT); +include/sync_slave_sql_with_master.inc +### Setup debug_sync points and prepare for slave backup +SET SESSION debug="+d,debug_sync_abort_on_timeout"; +SHOW STATUS LIKE 'Slave_open_temp_tables'; +Variable_name Value +Slave_open_temp_tables 1 +SET DEBUG_SYNC= 'tokudb_backup_wait_for_safe_slave_entered SIGNAL sse WAIT_FOR sse_continue'; +SET DEBUG_SYNC= 'tokudb_backup_wait_for_temp_tables_loop_begin SIGNAL ttlb WAIT_FOR ttlb_continue'; +SET DEBUG_SYNC= 'tokudb_backup_wait_for_temp_tables_loop_slave_started SIGNAL ttlss WAIT_FOR ttlss_continue EXECUTE 2'; +SET DEBUG_SYNC= 'tokudb_backup_wait_for_temp_tables_loop_end SIGNAL ttle WAIT_FOR ttle_continue'; +### Turn-on safe-slave option +SET GLOBAL tokudb_backup_safe_slave=ON; +SET GLOBAL tokudb_backup_safe_slave_timeout=30; +### Start slave backup +SET SESSION debug="+d,debug_sync_abort_on_timeout"; +### Wait for safe slave function to start +SET DEBUG_SYNC = "now WAIT_FOR sse"; +SHOW STATUS LIKE 'Slave_open_temp_tables'; +Variable_name Value +Slave_open_temp_tables 1 +### Wait for safe slave loop start +SET DEBUG_SYNC = "now SIGNAL sse_continue WAIT_FOR ttlb"; +SHOW STATUS LIKE 'Slave_open_temp_tables'; +Variable_name Value +Slave_open_temp_tables 1 +### Wait for safe thread loop point just after slave sql thread start 1 +SET DEBUG_SYNC = "now SIGNAL ttlb_continue WAIT_FOR ttlss"; +SHOW STATUS LIKE 'Slave_open_temp_tables'; +Variable_name Value +Slave_open_temp_tables 1 +### Wait for safe thread loop end +SET DEBUG_SYNC = "now SIGNAL ttlss_continue WAIT_FOR ttle"; +SHOW STATUS LIKE 'Slave_open_temp_tables'; +Variable_name Value +Slave_open_temp_tables 1 +### Wait for safe thread loop point just after slave sql thread start 2 +SET DEBUG_SYNC = "now SIGNAL ttle_continue WAIT_FOR ttlss"; +### Drop temp table on master +DROP TABLE t1; +### and syncronize slave +include/sync_slave_sql_with_master.inc +SHOW STATUS LIKE 'Slave_open_temp_tables'; +Variable_name Value +Slave_open_temp_tables 0 +### Continue backup +SET DEBUG_SYNC = "now SIGNAL ttlss_continue"; +### Wait for backup finish +include/filter_file.inc +### Slave tokubackup_slave_info content: +host: #.#.#.#, user: ####, port: ####, master log file: ####, relay log file: ####, exec master log pos: ####, executed gtid set: , channel name: +### Delete slave backup dir +### Turn-off safe-slave option for slave +SET GLOBAL tokudb_backup_safe_slave=default; +SET GLOBAL tokudb_backup_safe_slave_timeout=default; +### Turn-on safe-slave option for master +SET GLOBAL tokudb_backup_safe_slave=ON; +SET GLOBAL tokudb_backup_safe_slave_timeout=30; +### Backup master +### Turn-off safe-slave option for master +SET GLOBAL tokudb_backup_safe_slave=default; +SET GLOBAL tokudb_backup_safe_slave_timeout=default; +include/filter_file.inc +### Master tokubackup_binlog_info content: +filename: ####, position: ####, gtid_mode: OFF, GTID of last change: +### Delete master backup dir +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/tokudb_backup/r/rpl_tokudb_commit_sync.result b/storage/tokudb/mysql-test/tokudb_backup/r/rpl_tokudb_commit_sync.result new file mode 100644 index 00000000000..50508f073ab --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_backup/r/rpl_tokudb_commit_sync.result @@ -0,0 +1,59 @@ +include/master-slave.inc +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +[connection master] +### Create some data on master +CREATE TABLE t1(a INT, b INT, PRIMARY KEY (a)) ENGINE=TokuDB; +INSERT INTO t1 SET a=100, b=100; +INSERT INTO t1 SET a=200, b=100; +INSERT INTO t1 SET a=300, b=100; +INSERT INTO t1 SET a=400, b=100; +INSERT INTO t1 SET a=500, b=100; +UPDATE t1 SET b = 200 WHERE a = 200; +DELETE FROM t1 WHERE a = 100; +SELECT * FROM t1; +a b +200 200 +300 100 +400 100 +500 100 +### Check for slave options +SELECT @@tokudb_commit_sync; +@@tokudb_commit_sync +0 +SELECT @@tokudb_fsync_log_period; +@@tokudb_fsync_log_period +1000000 +### Check data on slave after sync +SELECT * FROM t1; +a b +200 200 +300 100 +400 100 +500 100 +### Do backup on slave +### Check for errors +SELECT @@session.tokudb_backup_last_error; +@@session.tokudb_backup_last_error +0 +SELECT @@session.tokudb_backup_last_error_string; +@@session.tokudb_backup_last_error_string +NULL +### Stop slave server +include/rpl_stop_server.inc [server_number=2] +### Restore backup +### Start slave server and slave threads +include/rpl_start_server.inc [server_number=2] +include/start_slave.inc +### Sync slave with master +### Check data on slave +SELECT * FROM t1; +a b +200 200 +300 100 +400 100 +500 100 +### Cleanup +DROP TABLE t1; +include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/tokudb_backup/t/backup_master_info.test b/storage/tokudb/mysql-test/tokudb_backup/t/backup_master_info.test new file mode 100644 index 00000000000..8e9f6df4b1d --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_backup/t/backup_master_info.test @@ -0,0 +1,94 @@ +--source include/have_tokudb_backup.inc +--source include/not_gtid_enabled.inc + + +--let $SLAVE_INFO_FILE=tokubackup_slave_info +--let $BACKUP_DIR_SLAVE=$MYSQL_TMP_DIR/tokudb_backup_slave +--let $SLAVE_INFO_FILE_PATH=$BACKUP_DIR_SLAVE/$SLAVE_INFO_FILE +--let DDIR=$BACKUP_DIR_SLAVE + +# Settings for include/filter_file.inc + +--delimiter | +let $script= + s{host: [^,]+,}{host: #.#.#.#,}; + s{user: [^,]+,}{user: ####,}; + s{port: [^,]+,}{port: ####,}; + s{master log file: [^,]+,}{master log file: ####,}; + s{relay log file: [^,]+,}{relay log file: ####,}; + s{exec master log pos: [^,]+,}{exec master log pos: ####,}; + s{executed gtid set: [^,]+, }{executed gtid set: ####, }; + s{executed gtid set: [^,]+,[^,]+, }{executed gtid set: ####,####, }; +| +--delimiter ; +--let $input_file = $SLAVE_INFO_FILE_PATH +--let $skip_column_names= 1 + +--echo ### +--echo # Test for binlog position +--echo ##### + +--mkdir $BACKUP_DIR_SLAVE + +--source include/master-slave.inc + +--connection master +CREATE TABLE t1(a INT) ENGINE=TokuDB; +DROP TABLE t1; + +--sync_slave_with_master + +--connection slave +--echo Backup +--disable_query_log +--eval SET SESSION tokudb_backup_dir='$BACKUP_DIR_SLAVE' +--enable_query_log + +--source include/filter_file.inc +--echo ### $SLAVE_INFO_FILE content: +--cat_file $SLAVE_INFO_FILE_PATH + +--perl +use File::Path 'rmtree'; +$DDIR=$ENV{"DDIR"}; +rmtree([ "$DDIR" ]); +EOF + +--echo ### +--echo # Test for gtid set +--echo ##### + +--mkdir $BACKUP_DIR_SLAVE + +--let $rpl_server_numbers= 1,2 +--let $rpl_set_enforce_gtid_consistency= 1 +--source include/rpl_set_gtid_mode.inc + +--connection master +CREATE TABLE t1(a INT) ENGINE=TokuDB; +DROP TABLE t1; + +--sync_slave_with_master + +--connection slave +--echo Backup +--disable_query_log +--eval SET SESSION tokudb_backup_dir='$BACKUP_DIR_SLAVE' +--enable_query_log + +--source include/filter_file.inc +--echo ### $SLAVE_INFO_FILE content: +--cat_file $SLAVE_INFO_FILE_PATH + +--perl +use File::Path 'rmtree'; +$DDIR=$ENV{"DDIR"}; +rmtree([ "$DDIR" ]); +EOF + +--let $rpl_gtid_mode= OFF +--let $rpl_set_enforce_gtid_consistency= 0 +--let $rpl_server_numbers= 1,2 +--let $rpl_skip_sync= 1 +--source include/rpl_set_gtid_mode.inc +--source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/tokudb_backup/t/backup_master_state.test b/storage/tokudb/mysql-test/tokudb_backup/t/backup_master_state.test new file mode 100644 index 00000000000..c301d55f8fa --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_backup/t/backup_master_state.test @@ -0,0 +1,87 @@ +--source include/have_tokudb_backup.inc +--source include/not_gtid_enabled.inc + +--let $MASTER_STATE_FILE=tokubackup_binlog_info +--let $BACKUP_DIR_MASTER=$MYSQL_TMP_DIR/tokudb_backup_master +--let $MASTER_STATE_FILE_PATH=$BACKUP_DIR_MASTER/$MASTER_STATE_FILE +--let DDIR=$BACKUP_DIR_MASTER + +# Settings for include/filter_file.inc +--delimiter | +let $script= + s{filename: [^,]+,}{filename: ####,}; + s{position: [^,]+,}{position: ####,}; + s{GTID of last change: [^ ]+}{GTID of last change: #####}; +| +--delimiter ; +--let $input_file = $MASTER_STATE_FILE_PATH +--let $skip_column_names= 1 + +--echo ### Create backup dir +--mkdir $BACKUP_DIR_MASTER + +--source include/master-slave.inc + +--connection master + +--echo ### Check for settings +SELECT @@gtid_mode; + +--echo ### Generate some binlog events +CREATE TABLE t1(a INT) ENGINE=TokuDB; +DROP TABLE t1; + +--echo ### Master backup +--disable_query_log +--eval SET SESSION tokudb_backup_dir='$BACKUP_DIR_MASTER' +--enable_query_log + +--source include/filter_file.inc +--echo ### $MASTER_STATE_FILE content: +--cat_file $MASTER_STATE_FILE_PATH + +--echo ### Delete backup dir +--perl +use File::Path 'rmtree'; +$DDIR=$ENV{"DDIR"}; +rmtree([ "$DDIR" ]); +EOF + +--echo ### Create backup dir +--mkdir $BACKUP_DIR_MASTER + +--echo ### GTID-mode on +--let $rpl_server_numbers= 1,2 +--let $rpl_set_enforce_gtid_consistency= 1 +--source include/rpl_set_gtid_mode.inc + +--echo ### Check for settings +SELECT @@gtid_mode; + +--echo ### Generate some binlog events +CREATE TABLE t1(a INT) ENGINE=TokuDB; +DROP TABLE t1; + +--echo ### Master backup +--disable_query_log +--eval SET SESSION tokudb_backup_dir='$BACKUP_DIR_MASTER' +--enable_query_log + +--source include/filter_file.inc +--echo ### $MASTER_STATE_FILE content: +--cat_file $MASTER_STATE_FILE_PATH + +--echo ### Delete backup dir +--perl +use File::Path 'rmtree'; +$DDIR=$ENV{"DDIR"}; +rmtree([ "$DDIR" ]); +EOF + +--echo ### GTID-mode off +--let $rpl_gtid_mode= OFF +--let $rpl_set_enforce_gtid_consistency= 0 +--let $rpl_server_numbers= 1,2 +--source include/rpl_set_gtid_mode.inc + +--source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/tokudb_backup/t/empty_slave_info_file.test b/storage/tokudb/mysql-test/tokudb_backup/t/empty_slave_info_file.test new file mode 100644 index 00000000000..53592903a27 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_backup/t/empty_slave_info_file.test @@ -0,0 +1,23 @@ +--source include/have_tokudb_backup.inc +--source include/not_gtid_enabled.inc + + +--let $SLAVE_INFO_FILE=tokubackup_slave_info +--let $BACKUP_DIR_SLAVE=$MYSQL_TMP_DIR/tokudb_backup_slave +--let DDIR=$BACKUP_DIR_SLAVE + +--mkdir $BACKUP_DIR_SLAVE + +--echo Backup +--disable_query_log +--eval SET SESSION tokudb_backup_dir='$BACKUP_DIR_SLAVE' +--enable_query_log + +--list_files $BACKUP_DIR_SLAVE $SLAVE_INFO_FILE + +--perl +use File::Path 'rmtree'; +$DDIR=$ENV{"DDIR"}; +rmtree([ "$DDIR" ]); +EOF + diff --git a/storage/tokudb/mysql-test/tokudb_backup/t/innodb_use_native_aio_enabled-master.opt b/storage/tokudb/mysql-test/tokudb_backup/t/innodb_use_native_aio_enabled-master.opt new file mode 100644 index 00000000000..5f5dbb9c7c6 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_backup/t/innodb_use_native_aio_enabled-master.opt @@ -0,0 +1 @@ +--innodb_use_native_aio=on diff --git a/storage/tokudb/mysql-test/tokudb_backup/t/innodb_use_native_aio_enabled.test b/storage/tokudb/mysql-test/tokudb_backup/t/innodb_use_native_aio_enabled.test new file mode 100644 index 00000000000..3e09b465c02 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_backup/t/innodb_use_native_aio_enabled.test @@ -0,0 +1,19 @@ +# Check if tokudb hot backup is prevented if innodb_use_native_aio enabled +--source include/have_tokudb_backup.inc +--source include/have_innodb.inc + +SELECT @@innodb_use_native_aio; + +--let BACKUP_DIR= $MYSQL_TMP_DIR/tokudb_backup + +--mkdir $BACKUP_DIR + +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +--error ER_WRONG_VALUE_FOR_VAR +--eval SET SESSION tokudb_backup_dir='$BACKUP_DIR' + +--perl +use File::Path 'rmtree'; +$DDIR=$ENV{"BACKUP_DIR"}; +rmtree([ "$DDIR" ]); +EOF diff --git a/storage/tokudb/mysql-test/tokudb_backup/t/rpl_safe_slave-master.opt b/storage/tokudb/mysql-test/tokudb_backup/t/rpl_safe_slave-master.opt new file mode 100644 index 00000000000..af3a211967b --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_backup/t/rpl_safe_slave-master.opt @@ -0,0 +1 @@ +--binlog-format=statement diff --git a/storage/tokudb/mysql-test/tokudb_backup/t/rpl_safe_slave-slave.opt b/storage/tokudb/mysql-test/tokudb_backup/t/rpl_safe_slave-slave.opt new file mode 100644 index 00000000000..49405b1aec3 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_backup/t/rpl_safe_slave-slave.opt @@ -0,0 +1 @@ +--master-info-repository=TABLE --relay-log-info-repository=TABLE diff --git a/storage/tokudb/mysql-test/tokudb_backup/t/rpl_safe_slave.cnf b/storage/tokudb/mysql-test/tokudb_backup/t/rpl_safe_slave.cnf new file mode 100644 index 00000000000..321be4ab2fc --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_backup/t/rpl_safe_slave.cnf @@ -0,0 +1,14 @@ +!include ../../rpl/my.cnf + +[mysqld.1] + +[mysqld.2] + +[mysqld.3] +master-info-repository=TABLE +relay-log-info-repository=TABLE + +[ENV] +SERVER_MYPORT_3= @mysqld.3.port +SERVER_MYSOCK_3= @mysqld.3.socket + diff --git a/storage/tokudb/mysql-test/tokudb_backup/t/rpl_safe_slave.inc b/storage/tokudb/mysql-test/tokudb_backup/t/rpl_safe_slave.inc new file mode 100644 index 00000000000..9b795008eff --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_backup/t/rpl_safe_slave.inc @@ -0,0 +1,109 @@ +--connection server_1 +--echo ### Create temp table on master +CREATE TEMPORARY TABLE t1 (a INT); + +--let $sync_slave_connection= server_2 +--source include/sync_slave_sql_with_master.inc + +--echo ### Setup debug_sync points and prepare for slave backup +--connection slave_2 +SET SESSION debug="+d,debug_sync_abort_on_timeout"; + +SHOW STATUS LIKE 'Slave_open_temp_tables'; + +SET DEBUG_SYNC= 'tokudb_backup_wait_for_safe_slave_entered SIGNAL sse WAIT_FOR sse_continue'; +SET DEBUG_SYNC= 'tokudb_backup_wait_for_temp_tables_loop_begin SIGNAL ttlb WAIT_FOR ttlb_continue'; +SET DEBUG_SYNC= 'tokudb_backup_wait_for_temp_tables_loop_slave_started SIGNAL ttlss WAIT_FOR ttlss_continue EXECUTE 2'; +SET DEBUG_SYNC= 'tokudb_backup_wait_for_temp_tables_loop_end SIGNAL ttle WAIT_FOR ttle_continue'; + +--mkdir $BACKUP_DIR_SLAVE + +--echo ### Turn-on safe-slave option +SET GLOBAL tokudb_backup_safe_slave=ON; +SET GLOBAL tokudb_backup_safe_slave_timeout=30; + +--echo ### Start slave backup +--disable_query_log +--send_eval SET SESSION tokudb_backup_dir='$BACKUP_DIR_SLAVE' +--enable_query_log + +--connection server_2 +SET SESSION debug="+d,debug_sync_abort_on_timeout"; + +--echo ### Wait for safe slave function to start +SET DEBUG_SYNC = "now WAIT_FOR sse"; +SHOW STATUS LIKE 'Slave_open_temp_tables'; +--echo ### Wait for safe slave loop start +SET DEBUG_SYNC = "now SIGNAL sse_continue WAIT_FOR ttlb"; +SHOW STATUS LIKE 'Slave_open_temp_tables'; +--echo ### Wait for safe thread loop point just after slave sql thread start 1 +SET DEBUG_SYNC = "now SIGNAL ttlb_continue WAIT_FOR ttlss"; +SHOW STATUS LIKE 'Slave_open_temp_tables'; +--echo ### Wait for safe thread loop end +SET DEBUG_SYNC = "now SIGNAL ttlss_continue WAIT_FOR ttle"; +SHOW STATUS LIKE 'Slave_open_temp_tables'; + +--echo ### Wait for safe thread loop point just after slave sql thread start 2 +SET DEBUG_SYNC = "now SIGNAL ttle_continue WAIT_FOR ttlss"; + +--connection server_1 +--echo ### Drop temp table on master +DROP TABLE t1; + +--echo ### and syncronize slave +--let $sync_slave_connection= server_2 +--source include/sync_slave_sql_with_master.inc + +SHOW STATUS LIKE 'Slave_open_temp_tables'; + +--echo ### Continue backup +SET DEBUG_SYNC = "now SIGNAL ttlss_continue"; + +--connection slave_2 +--echo ### Wait for backup finish +--reap + +--let $input_file = $S_SLAVE_INFO_FILE_PATH +--source include/filter_file.inc +--echo ### Slave $SLAVE_INFO_FILE content: +--cat_file $S_SLAVE_INFO_FILE_PATH + +--echo ### Delete slave backup dir +--perl +use File::Path 'rmtree'; +$DDIR=$ENV{"BACKUP_DIR_SLAVE"}; +rmtree([ "$DDIR" ]); +EOF + +--echo ### Turn-off safe-slave option for slave +SET GLOBAL tokudb_backup_safe_slave=default; +SET GLOBAL tokudb_backup_safe_slave_timeout=default; + +--connection server_1 + +--echo ### Turn-on safe-slave option for master +SET GLOBAL tokudb_backup_safe_slave=ON; +SET GLOBAL tokudb_backup_safe_slave_timeout=30; + +--echo ### Backup master +--mkdir $BACKUP_DIR_MASTER +--disable_query_log +--eval SET SESSION tokudb_backup_dir='$BACKUP_DIR_MASTER' +--enable_query_log + +--echo ### Turn-off safe-slave option for master +SET GLOBAL tokudb_backup_safe_slave=default; +SET GLOBAL tokudb_backup_safe_slave_timeout=default; + +--let $input_file = $M_MASTER_INFO_FILE_PATH +--source include/filter_file.inc +--echo ### Master $MASTER_INFO_FILE content: +--cat_file $M_MASTER_INFO_FILE_PATH + +--echo ### Delete master backup dir +--perl +use File::Path 'rmtree'; +$DDIR=$ENV{"BACKUP_DIR_MASTER"}; +rmtree([ "$DDIR" ]); +EOF + diff --git a/storage/tokudb/mysql-test/tokudb_backup/t/rpl_safe_slave.test b/storage/tokudb/mysql-test/tokudb_backup/t/rpl_safe_slave.test new file mode 100644 index 00000000000..15ba1d8bb66 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_backup/t/rpl_safe_slave.test @@ -0,0 +1,49 @@ +--source include/have_tokudb_backup.inc +--source include/have_binlog_format_statement.inc +--source include/have_debug_sync.inc + +--let $SLAVE_INFO_FILE=tokubackup_slave_info +--let $MASTER_INFO_FILE=tokubackup_binlog_info + +--let BACKUP_DIR_SLAVE=$MYSQL_TMP_DIR/tokudb_backup_slave +--let $S_SLAVE_INFO_FILE_PATH=$BACKUP_DIR_SLAVE/$SLAVE_INFO_FILE + +--let BACKUP_DIR_MASTER=$MYSQL_TMP_DIR/tokudb_backup_master +--let $M_MASTER_INFO_FILE_PATH=$BACKUP_DIR_MASTER/$MASTER_INFO_FILE + +# Settings for include/filter_file.inc +--delimiter | +let $script= + s{filename: [^,]+,}{filename: ####,}; + s{position: [^,]+,}{position: ####,}; + s{GTID of last change: [^ ]+}{GTID of last change: #####}; + s{host: [^,]+,}{host: #.#.#.#,}; + s{user: [^,]+,}{user: ####,}; + s{port: [^,]+,}{port: ####,}; + s{master log file: [^,]+,}{master log file: ####,}; + s{relay log file: [^,]+,}{relay log file: ####,}; + s{exec master log pos: [^,]+,}{exec master log pos: ####,}; + s{executed gtid set: [^,]+, }{executed gtid set: ####, }; + s{executed gtid set: [^,]+,[^,]+, }{executed gtid set: ####,####, }; +| +--delimiter ; +--let $skip_column_names= 1 + +--disable_query_log +CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +CALL mtr.add_suppression("Sending passwords in plain text without SSL/TLS is extremely insecure"); +--enable_query_log + +--echo ### +--echo # Master-slave test +--echo #### + +--let $rpl_server_count=3 +--let $rpl_topology=1->2 +--source include/rpl_init.inc + +--connect (slave_2,localhost,root,,test,$SLAVE_MYPORT,$SLAVE_MYSOCK) + +--source rpl_safe_slave.inc + +--source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/tokudb_backup/t/rpl_tokudb_commit_sync-slave.opt b/storage/tokudb/mysql-test/tokudb_backup/t/rpl_tokudb_commit_sync-slave.opt new file mode 100644 index 00000000000..263e1aef0ab --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_backup/t/rpl_tokudb_commit_sync-slave.opt @@ -0,0 +1 @@ +--loose-tokudb-commit-sync=OFF --loose-tokudb-fsync-log-period=1000000 diff --git a/storage/tokudb/mysql-test/tokudb_backup/t/rpl_tokudb_commit_sync.test b/storage/tokudb/mysql-test/tokudb_backup/t/rpl_tokudb_commit_sync.test new file mode 100644 index 00000000000..5bd53cacdab --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_backup/t/rpl_tokudb_commit_sync.test @@ -0,0 +1,72 @@ +# if --tokudb-commit-sync is off on slave tokudb log must be flushed on backup +# to provide the ability to restore replication after backup restoring + +--source include/have_tokudb_backup.inc + +--let $BACKUP_DIR_SLAVE= $MYSQL_TMP_DIR/tokudb_backup_slave +--let $BACKUP_MYSQL_DATA_DIR= $BACKUP_DIR_SLAVE/mysql_data_dir + +--mkdir $BACKUP_DIR_SLAVE + +--source include/master-slave.inc + +--echo ### Create some data on master +--connection master +CREATE TABLE t1(a INT, b INT, PRIMARY KEY (a)) ENGINE=TokuDB; +INSERT INTO t1 SET a=100, b=100; +INSERT INTO t1 SET a=200, b=100; +INSERT INTO t1 SET a=300, b=100; +INSERT INTO t1 SET a=400, b=100; +INSERT INTO t1 SET a=500, b=100; +UPDATE t1 SET b = 200 WHERE a = 200; +DELETE FROM t1 WHERE a = 100; + +SELECT * FROM t1; + +--sync_slave_with_master +--let $SLAVE_DATA_DIR=`SELECT @@DATADIR` + +--echo ### Check for slave options +SELECT @@tokudb_commit_sync; +SELECT @@tokudb_fsync_log_period; + +--echo ### Check data on slave after sync +SELECT * FROM t1; + + +--echo ### Do backup on slave +--disable_query_log +--eval SET SESSION tokudb_backup_dir='$BACKUP_DIR_SLAVE' +--enable_query_log + +--echo ### Check for errors +SELECT @@session.tokudb_backup_last_error; +SELECT @@session.tokudb_backup_last_error_string; + +--echo ### Stop slave server +--connection slave +--let $rpl_server_number= 2 +--let $rpl_force_stop= 1 +--source include/rpl_stop_server.inc + +--echo ### Restore backup +--exec rm -rf $SLAVE_DATA_DIR; +--exec mv $BACKUP_MYSQL_DATA_DIR $SLAVE_DATA_DIR; + +--echo ### Start slave server and slave threads +--connection slave +--source include/rpl_start_server.inc +--source include/start_slave.inc + +--echo ### Sync slave with master +--connection master +--sync_slave_with_master + +--echo ### Check data on slave +SELECT * FROM t1; + +--echo ### Cleanup +--connection master +DROP TABLE t1; + +--source include/rpl_end.inc diff --git a/storage/tokudb/mysql-test/tokudb_backup/t/suite.opt b/storage/tokudb/mysql-test/tokudb_backup/t/suite.opt index 5d4cb245e27..a624d6895cc 100644 --- a/storage/tokudb/mysql-test/tokudb_backup/t/suite.opt +++ b/storage/tokudb/mysql-test/tokudb_backup/t/suite.opt @@ -1 +1 @@ -$TOKUDB_OPT $TOKUDB_LOAD_ADD_PATH $TOKUDB_BACKUP_OPT $TOKUDB_BACKUP_LOAD_ADD_PATH --loose-tokudb-check-jemalloc=0 --loose-tokudb-cache-size=512M --loose-tokudb-block-size=1M +$TOKUDB_OPT $TOKUDB_LOAD_ADD_PATH $TOKUDB_BACKUP_OPT $TOKUDB_BACKUP_LOAD_ADD_PATH --loose-innodb_use_native_aio=off --loose-tokudb-check-jemalloc=0 --loose-tokudb-cache-size=512M --loose-tokudb-block-size=1M diff --git a/storage/tokudb/mysql-test/tokudb_bugs/r/db233.result b/storage/tokudb/mysql-test/tokudb_bugs/r/db233.result index e5808f52e69..a7cdbcae1e2 100644 --- a/storage/tokudb/mysql-test/tokudb_bugs/r/db233.result +++ b/storage/tokudb/mysql-test/tokudb_bugs/r/db233.result @@ -14,16 +14,6 @@ INSERT INTO t1 VALUES(1, 1, '1', '1'), (2, 2, '2', '2'), (3, 3, '3', '3'), (4, 4 ANALYZE TABLE t1; Table Op Msg_type Msg_text test.t1 analyze status OK -set DEBUG_SYNC = 'tokudb_icp_desc_scan_invalidate SIGNAL hit1 WAIT_FOR done1'; -SELECT c FROM t1 WHERE id BETWEEN 5 AND 8 ORDER BY id DESC; -set DEBUG_SYNC = 'now WAIT_FOR hit1'; -set DEBUG_SYNC = 'now SIGNAL done1'; -c -8 -7 -6 -6 -5 set DEBUG_SYNC = 'tokudb_icp_asc_scan_out_of_range SIGNAL hit2 WAIT_FOR done2'; SELECT c FROM t1 WHERE id BETWEEN 5 AND 8 ORDER BY id ASC; set DEBUG_SYNC = 'now WAIT_FOR hit2'; diff --git a/storage/tokudb/mysql-test/tokudb_bugs/t/db233.test b/storage/tokudb/mysql-test/tokudb_bugs/t/db233.test index 8e4c3b73c09..fec11bf0553 100644 --- a/storage/tokudb/mysql-test/tokudb_bugs/t/db233.test +++ b/storage/tokudb/mysql-test/tokudb_bugs/t/db233.test @@ -29,24 +29,6 @@ ANALYZE TABLE t1; # lets flip to another connection connect(conn1, localhost, root); -# set up the DEBUG_SYNC point -set DEBUG_SYNC = 'tokudb_icp_desc_scan_invalidate SIGNAL hit1 WAIT_FOR done1'; - -# send the query -send SELECT c FROM t1 WHERE id BETWEEN 5 AND 8 ORDER BY id DESC; - -# back to default connection -connection default; - -# wait for the ICP reverse scan to invalidate -set DEBUG_SYNC = 'now WAIT_FOR hit1'; - -# lets release and clean up -set DEBUG_SYNC = 'now SIGNAL done1'; - -connection conn1; -reap; - # set up the DEBUG_SYNC point again, but for the out of range set DEBUG_SYNC = 'tokudb_icp_asc_scan_out_of_range SIGNAL hit2 WAIT_FOR done2'; diff --git a/storage/tokudb/mysql-test/tokudb_bugs/t/db397_delete_trigger.test b/storage/tokudb/mysql-test/tokudb_bugs/t/db397_delete_trigger.test index dfd935b17ff..0502b35bc2c 100644 --- a/storage/tokudb/mysql-test/tokudb_bugs/t/db397_delete_trigger.test +++ b/storage/tokudb/mysql-test/tokudb_bugs/t/db397_delete_trigger.test @@ -1,3 +1,4 @@ +skip Tokudb Lock Waits not in I_S in MariaDB; # check for any locking weirdness on DELETE triggers source include/have_tokudb.inc; set default_storage_engine='tokudb'; diff --git a/storage/tokudb/mysql-test/tokudb_bugs/t/db397_insert_trigger.test b/storage/tokudb/mysql-test/tokudb_bugs/t/db397_insert_trigger.test index ffe2face9f2..313b1f96b52 100644 --- a/storage/tokudb/mysql-test/tokudb_bugs/t/db397_insert_trigger.test +++ b/storage/tokudb/mysql-test/tokudb_bugs/t/db397_insert_trigger.test @@ -1,3 +1,4 @@ +skip Tokudb Lock Waits not in I_S in MariaDB; # check for any locking weirdness on INSERT triggers source include/have_tokudb.inc; set default_storage_engine='tokudb'; diff --git a/storage/tokudb/mysql-test/tokudb_bugs/t/db397_update_trigger.test b/storage/tokudb/mysql-test/tokudb_bugs/t/db397_update_trigger.test index 063a88cb4ab..ce1eb6bddd1 100644 --- a/storage/tokudb/mysql-test/tokudb_bugs/t/db397_update_trigger.test +++ b/storage/tokudb/mysql-test/tokudb_bugs/t/db397_update_trigger.test @@ -1,3 +1,4 @@ +skip Tokudb Lock Waits not in I_S in MariaDB; # check for any locking weirdness on UPDATE triggers source include/have_tokudb.inc; set default_storage_engine='tokudb'; diff --git a/storage/tokudb/mysql-test/tokudb_bugs/t/db938.test b/storage/tokudb/mysql-test/tokudb_bugs/t/db938.test index 50434a79a00..d65bf3d95de 100644 --- a/storage/tokudb/mysql-test/tokudb_bugs/t/db938.test +++ b/storage/tokudb/mysql-test/tokudb_bugs/t/db938.test @@ -1,3 +1,4 @@ +skip Background Job Manager not supported in MariaDB; # This test for DB-938 tests a race condition where a scheduled background job # (analyze) ends up operating on a set of DB* key_file[] in TOKUDB_SHARE that # were set to NULL during a TRUNCATE TABLE operation. diff --git a/storage/tokudb/mysql-test/tokudb_bugs/t/db945.test b/storage/tokudb/mysql-test/tokudb_bugs/t/db945.test index c7774877291..50dc91829d8 100644 --- a/storage/tokudb/mysql-test/tokudb_bugs/t/db945.test +++ b/storage/tokudb/mysql-test/tokudb_bugs/t/db945.test @@ -1,3 +1,4 @@ +skip Background Job Manager not supported in MariaDB; source include/have_tokudb.inc; set default_storage_engine='tokudb'; disable_warnings; diff --git a/storage/tokudb/mysql-test/tokudb_bugs/t/leak172.test b/storage/tokudb/mysql-test/tokudb_bugs/t/leak172.test index 9d82604e4b1..28cfff14770 100644 --- a/storage/tokudb/mysql-test/tokudb_bugs/t/leak172.test +++ b/storage/tokudb/mysql-test/tokudb_bugs/t/leak172.test @@ -132,6 +132,7 @@ CREATE TABLE `t2` ( ); LOAD DATA INFILE 'leak172_t1.data' INTO TABLE `t1` fields terminated by ','; +remove_file $MYSQLD_DATADIR/test/leak172_t1.data; connect(conn1,localhost,root,,); set session debug_dbug="+d,tokudb_end_bulk_insert_sleep"; @@ -145,6 +146,7 @@ UPDATE t1, t2 SET t1.`c5` = 4 WHERE t1.`c6` <= 'o'; connection conn1; reap; +remove_file $MYSQLD_DATADIR/test/leak172_t2.data; connection default; disconnect conn1; diff --git a/storage/tokudb/mysql-test/tokudb_bugs/t/tokudb718.test b/storage/tokudb/mysql-test/tokudb_bugs/t/tokudb718.test index 735a88afed8..e7ef3211401 100644 --- a/storage/tokudb/mysql-test/tokudb_bugs/t/tokudb718.test +++ b/storage/tokudb/mysql-test/tokudb_bugs/t/tokudb718.test @@ -1,3 +1,4 @@ +skip Tokudb Fractal Tree info not in I_S in MariaDB; # test DB-718, a crash caused by broken error handling in tokudb's fractal_tree_info information schema source include/have_tokudb.inc; set default_storage_engine='tokudb'; diff --git a/storage/tokudb/mysql-test/tokudb_mariadb/r/mdev12972.result b/storage/tokudb/mysql-test/tokudb_mariadb/r/mdev12972.result new file mode 100644 index 00000000000..92aefedac69 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_mariadb/r/mdev12972.result @@ -0,0 +1,19 @@ +CREATE TABLE t1 (pk INT PRIMARY KEY, i1 INT, c1 VARCHAR(1), KEY(c1)) ENGINE=TokuDB; +INSERT INTO t1 VALUES +(1,2,NULL),(2,5,'x'),(3,3,'i'),(4,1,'e'),(5,4,'p'); +CREATE TABLE t2 (i2 INT) ENGINE=TokuDB; +INSERT INTO t2 VALUES (1),(2); +CREATE TABLE t3 (i3 INT, c3 VARCHAR(1), KEY(i3)) ENGINE=TokuDB; +INSERT INTO t3 VALUES +(1,'e'),(1,'z'),(1,'i'),(1,'q'),(1,'i'),(1,'f'),(1,'m'),(2,'c'),(1,'d'), +(2,'n'),(1,'t'),(2,'e'),(1,'w'),(2,'y'),(1,'j'),(2,'i'),(1,'f'),(2,'f'), +(1,'s'),(2,'y'); +SET join_cache_level = 8; +SET optimizer_switch ='mrr=on,mrr_sort_keys=on,optimize_join_buffer_size=on'; +SELECT * FROM t1 AS t1_outer WHERE EXISTS ( SELECT * FROM t2 WHERE i2 IN ( SELECT i3 FROM t3 INNER JOIN t1 AS t1_inner ON (t1_inner.c1 = c3 ) WHERE t1_inner.i1 < t1_outer.i1 ) ); +pk i1 c1 +1 2 NULL +2 5 x +3 3 i +5 4 p +DROP TABLE t1, t2, t3; diff --git a/storage/tokudb/mysql-test/tokudb_mariadb/t/mdev12972.test b/storage/tokudb/mysql-test/tokudb_mariadb/t/mdev12972.test new file mode 100644 index 00000000000..9d136ff0c65 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_mariadb/t/mdev12972.test @@ -0,0 +1,26 @@ +# +# MDEV-12972 Random and Frequent Segfault (SIG 11) During Runtime +# +# This was actually a memory overrun in MRR that TokuDB triggered +# + +CREATE TABLE t1 (pk INT PRIMARY KEY, i1 INT, c1 VARCHAR(1), KEY(c1)) ENGINE=TokuDB; +INSERT INTO t1 VALUES +(1,2,NULL),(2,5,'x'),(3,3,'i'),(4,1,'e'),(5,4,'p'); + +CREATE TABLE t2 (i2 INT) ENGINE=TokuDB; +INSERT INTO t2 VALUES (1),(2); + +CREATE TABLE t3 (i3 INT, c3 VARCHAR(1), KEY(i3)) ENGINE=TokuDB; +INSERT INTO t3 VALUES +(1,'e'),(1,'z'),(1,'i'),(1,'q'),(1,'i'),(1,'f'),(1,'m'),(2,'c'),(1,'d'), +(2,'n'),(1,'t'),(2,'e'),(1,'w'),(2,'y'),(1,'j'),(2,'i'),(1,'f'),(2,'f'), +(1,'s'),(2,'y'); + +SET join_cache_level = 8; +SET optimizer_switch ='mrr=on,mrr_sort_keys=on,optimize_join_buffer_size=on'; + +--sorted_result +SELECT * FROM t1 AS t1_outer WHERE EXISTS ( SELECT * FROM t2 WHERE i2 IN ( SELECT i3 FROM t3 INNER JOIN t1 AS t1_inner ON (t1_inner.c1 = c3 ) WHERE t1_inner.i1 < t1_outer.i1 ) ); + +DROP TABLE t1, t2, t3; diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/part_supported_sql_func_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/part_supported_sql_func_tokudb.result index 370359327c1..6bb98671feb 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/part_supported_sql_func_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/part_supported_sql_func_tokudb.result @@ -620,15 +620,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (abs(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (abs(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) select * from t55 order by colint; colint col1 1 15 @@ -2317,15 +2317,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (mod(col1,10)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (`col1` % 10) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) select * from t55 order by colint; colint col1 1 15 @@ -3667,15 +3667,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (day(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (dayofmonth(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) select * from t55 order by colint; colint col1 1 2006-02-05 @@ -4184,15 +4184,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (dayofmonth(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (dayofmonth(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) select * from t55 order by colint; colint col1 1 2006-02-05 @@ -4701,15 +4701,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (dayofweek(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (dayofweek(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) select * from t55 order by colint; colint col1 1 2006-02-03 @@ -5230,15 +5230,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (dayofyear(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (dayofyear(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) select * from t55 order by colint; colint col1 1 2006-02-03 @@ -5749,15 +5749,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (extract(month from col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (extract(month from `col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) select * from t55 order by colint; colint col1 1 2006-02-03 @@ -6268,15 +6268,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` time DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (hour(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (hour(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) select * from t55 order by colint; colint col1 1 09:09:15 @@ -6793,15 +6793,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` time(6) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (microsecond(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (microsecond(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) select * from t55 order by colint; colint col1 1 05:30:34.000037 @@ -7314,15 +7314,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` time DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (minute(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (minute(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) select * from t55 order by colint; colint col1 1 10:24:23 @@ -7845,15 +7845,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` time DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (second(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (second(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) select * from t55 order by colint; colint col1 1 09:09:15 @@ -8376,15 +8376,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (month(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (month(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) select * from t55 order by colint; colint col1 1 2006-02-03 @@ -8901,15 +8901,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (quarter(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (quarter(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) select * from t55 order by colint; colint col1 1 2006-02-03 @@ -9424,15 +9424,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (weekday(col1)) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (weekday(`col1`)) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) select * from t55 order by colint; colint col1 1 2006-02-03 @@ -9945,15 +9945,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (year(col1)-1990) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (year(`col1`) - 1990) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) select * from t55 order by colint; colint col1 1 2006-02-03 @@ -10470,15 +10470,15 @@ t55 CREATE TABLE `t55` ( `colint` int(11) DEFAULT NULL, `col1` date DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (colint) -SUBPARTITION BY HASH (yearweek(col1)-200600) + PARTITION BY LIST (`colint`) +SUBPARTITION BY HASH (yearweek(`col1`,0) - 200600) SUBPARTITIONS 5 -(PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, - PARTITION p1 VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, - PARTITION p2 VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, - PARTITION p3 VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, - PARTITION p4 VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, - PARTITION p5 VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) +(PARTITION `p0` VALUES IN (1,2,3,4,5,6,7,8,9,10) ENGINE = TokuDB, + PARTITION `p1` VALUES IN (11,12,13,14,15,16,17,18,19,20) ENGINE = TokuDB, + PARTITION `p2` VALUES IN (21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, + PARTITION `p3` VALUES IN (31,32,33,34,35,36,37,38,39,40) ENGINE = TokuDB, + PARTITION `p4` VALUES IN (41,42,43,44,45,46,47,48,49,50) ENGINE = TokuDB, + PARTITION `p5` VALUES IN (51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) select * from t55 order by colint; colint col1 1 2006-02-03 diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter1_1_2_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter1_1_2_tokudb.result index 5ee7ced4487..3d944dccdb1 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter1_1_2_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter1_1_2_tokudb.result @@ -75,7 +75,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -567,7 +567,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -1067,15 +1067,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1572,13 +1572,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2071,13 +2071,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2574,20 +2574,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3084,20 +3084,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3592,12 +3592,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -4089,7 +4089,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -4581,7 +4581,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -5081,15 +5081,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5586,13 +5586,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6085,13 +6085,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6588,20 +6588,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7098,20 +7098,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7606,12 +7606,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -8104,7 +8104,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -8612,7 +8612,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -9128,15 +9128,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9649,13 +9649,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10164,13 +10164,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10683,20 +10683,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11209,20 +11209,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11733,12 +11733,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -12246,7 +12246,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -12754,7 +12754,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -13270,15 +13270,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13791,13 +13791,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14306,13 +14306,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14825,20 +14825,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15351,20 +15351,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15875,12 +15875,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -16390,7 +16390,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -16883,7 +16883,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -17384,15 +17384,15 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -17890,13 +17890,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18390,13 +18390,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18894,20 +18894,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19405,20 +19405,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19914,12 +19914,12 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -20412,7 +20412,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -20905,7 +20905,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -21406,15 +21406,15 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -21912,13 +21912,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -22412,13 +22412,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -22916,20 +22916,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -23427,20 +23427,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -23936,12 +23936,12 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -24434,7 +24434,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -24927,7 +24927,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -25428,15 +25428,15 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -25934,13 +25934,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -26434,13 +26434,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -26938,20 +26938,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -27449,20 +27449,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -27958,12 +27958,12 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter1_1_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter1_1_tokudb.result index 17f4c83cd97..7ad3d72441c 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter1_1_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter1_1_tokudb.result @@ -393,7 +393,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -885,7 +885,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -1385,15 +1385,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1890,13 +1890,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2389,13 +2389,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2894,20 +2894,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3404,20 +3404,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3912,12 +3912,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -4409,7 +4409,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -4901,7 +4901,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -5401,15 +5401,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5906,13 +5906,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6405,13 +6405,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6910,20 +6910,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7420,20 +7420,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7928,12 +7928,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -8426,7 +8426,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -8934,7 +8934,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -9450,15 +9450,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9971,13 +9971,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10486,13 +10486,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11007,20 +11007,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11533,20 +11533,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -12057,12 +12057,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -12570,7 +12570,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -13078,7 +13078,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -13594,15 +13594,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14115,13 +14115,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14630,13 +14630,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15151,20 +15151,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15677,20 +15677,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -16201,12 +16201,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter1_2_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter1_2_tokudb.result index 3cedec4c908..9f53437fdf7 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter1_2_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter1_2_tokudb.result @@ -73,7 +73,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -513,7 +513,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -961,15 +961,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1414,13 +1414,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1861,13 +1861,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2314,20 +2314,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2772,20 +2772,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3228,12 +3228,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3673,7 +3673,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -4113,7 +4113,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -4561,15 +4561,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5014,13 +5014,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5461,13 +5461,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5914,20 +5914,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6372,20 +6372,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6828,12 +6828,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7273,7 +7273,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -7729,7 +7729,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -8193,15 +8193,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -8662,13 +8662,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9125,13 +9125,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9594,20 +9594,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10068,20 +10068,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10540,12 +10540,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11005,7 +11005,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -11445,7 +11445,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -11893,15 +11893,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -12346,13 +12346,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -12793,13 +12793,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13244,20 +13244,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13702,20 +13702,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14158,12 +14158,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14603,7 +14603,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -15043,7 +15043,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -15491,15 +15491,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15944,13 +15944,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -16391,13 +16391,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -16842,20 +16842,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -17300,20 +17300,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -17756,12 +17756,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18202,7 +18202,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -18658,7 +18658,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -19122,15 +19122,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19591,13 +19591,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -20054,13 +20054,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -20521,20 +20521,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -20995,20 +20995,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -21467,12 +21467,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -21928,7 +21928,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -22384,7 +22384,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -22848,15 +22848,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -23317,13 +23317,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -23780,13 +23780,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -24247,20 +24247,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -24721,20 +24721,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -25193,12 +25193,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -25655,7 +25655,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -26095,7 +26095,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -26543,15 +26543,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -26996,13 +26996,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -27443,13 +27443,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -27894,20 +27894,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -28352,20 +28352,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -28808,12 +28808,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -29253,7 +29253,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -29693,7 +29693,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -30141,15 +30141,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -30594,13 +30594,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -31041,13 +31041,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -31492,20 +31492,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -31950,20 +31950,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -32406,12 +32406,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -32851,7 +32851,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -33307,7 +33307,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -33771,15 +33771,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -34240,13 +34240,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -34703,13 +34703,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -35170,20 +35170,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -35644,20 +35644,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -36116,12 +36116,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter2_1_1_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter2_1_1_tokudb.result index 030e3e2204d..d994f5f2654 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter2_1_1_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter2_1_1_tokudb.result @@ -74,7 +74,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -530,7 +530,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -994,15 +994,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1463,13 +1463,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1926,13 +1926,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2395,20 +2395,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2869,20 +2869,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3341,12 +3341,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3804,7 +3804,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -4298,7 +4298,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -4800,15 +4800,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5307,13 +5307,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5808,13 +5808,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6315,20 +6315,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6827,20 +6827,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7337,12 +7337,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7836,7 +7836,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -8330,7 +8330,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -8832,15 +8832,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9339,13 +9339,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9840,13 +9840,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10347,20 +10347,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10859,20 +10859,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11369,12 +11369,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11869,7 +11869,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -12377,7 +12377,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -12893,15 +12893,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13414,13 +13414,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13929,13 +13929,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14450,20 +14450,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14976,20 +14976,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15500,12 +15500,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -16013,7 +16013,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -16521,7 +16521,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -17037,15 +17037,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -17558,13 +17558,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18073,13 +18073,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18594,20 +18594,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19120,20 +19120,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19644,12 +19644,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter2_1_2_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter2_1_2_tokudb.result index f252760e0a5..f8c7eadb44c 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter2_1_2_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter2_1_2_tokudb.result @@ -70,7 +70,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -526,7 +526,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -990,15 +990,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1459,13 +1459,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1922,13 +1922,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2389,20 +2389,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2863,20 +2863,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3335,12 +3335,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3798,7 +3798,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -4293,7 +4293,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -4796,15 +4796,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5304,13 +5304,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5806,13 +5806,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6312,20 +6312,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6825,20 +6825,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7336,12 +7336,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7836,7 +7836,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -8331,7 +8331,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -8834,15 +8834,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9342,13 +9342,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9844,13 +9844,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10350,20 +10350,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10863,20 +10863,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11374,12 +11374,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11875,7 +11875,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -12383,7 +12383,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -12899,15 +12899,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13420,13 +13420,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13935,13 +13935,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14454,20 +14454,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14980,20 +14980,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15504,12 +15504,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -16017,7 +16017,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -16525,7 +16525,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -17041,15 +17041,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -17562,13 +17562,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18077,13 +18077,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18596,20 +18596,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19122,20 +19122,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19646,12 +19646,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter2_2_1_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter2_2_1_tokudb.result index 32dab941bf1..1a4d1210a23 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter2_2_1_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter2_2_1_tokudb.result @@ -74,7 +74,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -532,7 +532,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -998,15 +998,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1469,13 +1469,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1932,13 +1932,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2403,20 +2403,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2877,20 +2877,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3351,12 +3351,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3815,7 +3815,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -4311,7 +4311,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -4815,15 +4815,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5324,13 +5324,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5825,13 +5825,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6334,20 +6334,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6846,20 +6846,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7358,12 +7358,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7859,7 +7859,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -8355,7 +8355,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -8859,15 +8859,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9368,13 +9368,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9869,13 +9869,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10378,20 +10378,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10890,20 +10890,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11402,12 +11402,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11904,7 +11904,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -12414,7 +12414,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -12932,15 +12932,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13455,13 +13455,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13970,13 +13970,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14493,20 +14493,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15019,20 +15019,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15545,12 +15545,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -16060,7 +16060,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -16570,7 +16570,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -17088,15 +17088,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -17611,13 +17611,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18126,13 +18126,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18649,20 +18649,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19175,20 +19175,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19701,12 +19701,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter2_2_2_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter2_2_2_tokudb.result index 4200c75867f..36be0936c09 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter2_2_2_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter2_2_2_tokudb.result @@ -69,7 +69,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -528,7 +528,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -995,15 +995,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1467,13 +1467,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1935,13 +1935,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2407,20 +2407,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2886,20 +2886,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3361,12 +3361,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3827,7 +3827,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -4325,7 +4325,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -4831,15 +4831,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5342,13 +5342,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5849,13 +5849,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6360,20 +6360,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6878,20 +6878,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7392,12 +7392,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7895,7 +7895,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -8393,7 +8393,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -8899,15 +8899,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9410,13 +9410,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9917,13 +9917,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10428,20 +10428,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10946,20 +10946,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11460,12 +11460,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, PRIMARY KEY (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11964,7 +11964,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -12475,7 +12475,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -12994,15 +12994,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13518,13 +13518,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14038,13 +14038,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14562,20 +14562,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15093,20 +15093,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15620,12 +15620,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -16136,7 +16136,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -16647,7 +16647,7 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 # check prerequisites-1 success: 1 @@ -17166,15 +17166,15 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -17690,13 +17690,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18210,13 +18210,13 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18734,20 +18734,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19265,20 +19265,20 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19792,12 +19792,12 @@ t1 CREATE TABLE `t1` ( `f_charbig` varchar(1000) DEFAULT NULL, UNIQUE KEY `uidx` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter3_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter3_tokudb.result index 1aa7b778aae..1a958e8a6b9 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter3_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter3_tokudb.result @@ -77,7 +77,7 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) + PARTITION BY HASH (year(`f_date`)) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) FROM t1 WHERE f_date = '1000-02-10'; @@ -95,7 +95,7 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (DAYOFYEAR(f_date)) + PARTITION BY HASH (dayofyear(`f_date`)) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) FROM t1 WHERE f_date = '1000-02-10'; @@ -111,7 +111,7 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) + PARTITION BY HASH (year(`f_date`)) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) FROM t1 WHERE f_date = '1000-02-10'; @@ -133,10 +133,10 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = TokuDB, - PARTITION part1 ENGINE = TokuDB, - PARTITION part7 ENGINE = TokuDB) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = TokuDB, + PARTITION `part1` ENGINE = TokuDB, + PARTITION `part7` ENGINE = TokuDB) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) FROM t1 WHERE f_date = '1000-02-10'; @@ -156,11 +156,11 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = TokuDB, - PARTITION part1 ENGINE = TokuDB, - PARTITION part7 ENGINE = TokuDB, - PARTITION part2 ENGINE = TokuDB) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = TokuDB, + PARTITION `part1` ENGINE = TokuDB, + PARTITION `part7` ENGINE = TokuDB, + PARTITION `part2` ENGINE = TokuDB) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) FROM t1 WHERE f_date = '1000-02-10'; @@ -177,15 +177,15 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = TokuDB, - PARTITION part1 ENGINE = TokuDB, - PARTITION part7 ENGINE = TokuDB, - PARTITION part2 ENGINE = TokuDB, - PARTITION p4 ENGINE = TokuDB, - PARTITION p5 ENGINE = TokuDB, - PARTITION p6 ENGINE = TokuDB, - PARTITION p7 ENGINE = TokuDB) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = TokuDB, + PARTITION `part1` ENGINE = TokuDB, + PARTITION `part7` ENGINE = TokuDB, + PARTITION `part2` ENGINE = TokuDB, + PARTITION `p4` ENGINE = TokuDB, + PARTITION `p5` ENGINE = TokuDB, + PARTITION `p6` ENGINE = TokuDB, + PARTITION `p7` ENGINE = TokuDB) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) FROM t1 WHERE f_date = '1000-02-10'; @@ -214,14 +214,14 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = TokuDB, - PARTITION part1 ENGINE = TokuDB, - PARTITION part7 ENGINE = TokuDB, - PARTITION part2 ENGINE = TokuDB, - PARTITION p4 ENGINE = TokuDB, - PARTITION p5 ENGINE = TokuDB, - PARTITION p6 ENGINE = TokuDB) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = TokuDB, + PARTITION `part1` ENGINE = TokuDB, + PARTITION `part7` ENGINE = TokuDB, + PARTITION `part2` ENGINE = TokuDB, + PARTITION `p4` ENGINE = TokuDB, + PARTITION `p5` ENGINE = TokuDB, + PARTITION `p6` ENGINE = TokuDB) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) FROM t1 WHERE f_date = '1000-02-10'; @@ -237,13 +237,13 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = TokuDB, - PARTITION part1 ENGINE = TokuDB, - PARTITION part7 ENGINE = TokuDB, - PARTITION part2 ENGINE = TokuDB, - PARTITION p4 ENGINE = TokuDB, - PARTITION p5 ENGINE = TokuDB) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = TokuDB, + PARTITION `part1` ENGINE = TokuDB, + PARTITION `part7` ENGINE = TokuDB, + PARTITION `part2` ENGINE = TokuDB, + PARTITION `p4` ENGINE = TokuDB, + PARTITION `p5` ENGINE = TokuDB) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) FROM t1 WHERE f_date = '1000-02-10'; @@ -259,12 +259,12 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = TokuDB, - PARTITION part1 ENGINE = TokuDB, - PARTITION part7 ENGINE = TokuDB, - PARTITION part2 ENGINE = TokuDB, - PARTITION p4 ENGINE = TokuDB) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = TokuDB, + PARTITION `part1` ENGINE = TokuDB, + PARTITION `part7` ENGINE = TokuDB, + PARTITION `part2` ENGINE = TokuDB, + PARTITION `p4` ENGINE = TokuDB) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) FROM t1 WHERE f_date = '1000-02-10'; @@ -280,11 +280,11 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = TokuDB, - PARTITION part1 ENGINE = TokuDB, - PARTITION part7 ENGINE = TokuDB, - PARTITION part2 ENGINE = TokuDB) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = TokuDB, + PARTITION `part1` ENGINE = TokuDB, + PARTITION `part7` ENGINE = TokuDB, + PARTITION `part2` ENGINE = TokuDB) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) FROM t1 WHERE f_date = '1000-02-10'; @@ -300,10 +300,10 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = TokuDB, - PARTITION part1 ENGINE = TokuDB, - PARTITION part7 ENGINE = TokuDB) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = TokuDB, + PARTITION `part1` ENGINE = TokuDB, + PARTITION `part7` ENGINE = TokuDB) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) FROM t1 WHERE f_date = '1000-02-10'; @@ -319,9 +319,9 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = TokuDB, - PARTITION part1 ENGINE = TokuDB) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = TokuDB, + PARTITION `part1` ENGINE = TokuDB) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) FROM t1 WHERE f_date = '1000-02-10'; @@ -337,8 +337,8 @@ t1 CREATE TABLE `t1` ( `f_date` date DEFAULT NULL, `f_varchar` varchar(30) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (YEAR(f_date)) -(PARTITION p0 ENGINE = TokuDB) + PARTITION BY HASH (year(`f_date`)) +(PARTITION `p0` ENGINE = TokuDB) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) FROM t1 WHERE f_date = '1000-02-10'; @@ -420,7 +420,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) <> 1 FROM t1 WHERE f_int1 = 3; @@ -445,10 +445,10 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = TokuDB, - PARTITION part1 ENGINE = TokuDB, - PARTITION part7 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = TokuDB, + PARTITION `part1` ENGINE = TokuDB, + PARTITION `part7` ENGINE = TokuDB) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) <> 1 FROM t1 WHERE f_int1 = 3; @@ -468,11 +468,11 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = TokuDB, - PARTITION part1 ENGINE = TokuDB, - PARTITION part7 ENGINE = TokuDB, - PARTITION part2 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = TokuDB, + PARTITION `part1` ENGINE = TokuDB, + PARTITION `part7` ENGINE = TokuDB, + PARTITION `part2` ENGINE = TokuDB) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) <> 1 FROM t1 WHERE f_int1 = 3; @@ -492,15 +492,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = TokuDB, - PARTITION part1 ENGINE = TokuDB, - PARTITION part7 ENGINE = TokuDB, - PARTITION part2 ENGINE = TokuDB, - PARTITION p4 ENGINE = TokuDB, - PARTITION p5 ENGINE = TokuDB, - PARTITION p6 ENGINE = TokuDB, - PARTITION p7 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = TokuDB, + PARTITION `part1` ENGINE = TokuDB, + PARTITION `part7` ENGINE = TokuDB, + PARTITION `part2` ENGINE = TokuDB, + PARTITION `p4` ENGINE = TokuDB, + PARTITION `p5` ENGINE = TokuDB, + PARTITION `p6` ENGINE = TokuDB, + PARTITION `p7` ENGINE = TokuDB) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) <> 1 FROM t1 WHERE f_int1 = 3; @@ -527,14 +527,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = TokuDB, - PARTITION part1 ENGINE = TokuDB, - PARTITION part7 ENGINE = TokuDB, - PARTITION part2 ENGINE = TokuDB, - PARTITION p4 ENGINE = TokuDB, - PARTITION p5 ENGINE = TokuDB, - PARTITION p6 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = TokuDB, + PARTITION `part1` ENGINE = TokuDB, + PARTITION `part7` ENGINE = TokuDB, + PARTITION `part2` ENGINE = TokuDB, + PARTITION `p4` ENGINE = TokuDB, + PARTITION `p5` ENGINE = TokuDB, + PARTITION `p6` ENGINE = TokuDB) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) <> 1 FROM t1 WHERE f_int1 = 3; @@ -553,13 +553,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = TokuDB, - PARTITION part1 ENGINE = TokuDB, - PARTITION part7 ENGINE = TokuDB, - PARTITION part2 ENGINE = TokuDB, - PARTITION p4 ENGINE = TokuDB, - PARTITION p5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = TokuDB, + PARTITION `part1` ENGINE = TokuDB, + PARTITION `part7` ENGINE = TokuDB, + PARTITION `part2` ENGINE = TokuDB, + PARTITION `p4` ENGINE = TokuDB, + PARTITION `p5` ENGINE = TokuDB) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) <> 1 FROM t1 WHERE f_int1 = 3; @@ -578,12 +578,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = TokuDB, - PARTITION part1 ENGINE = TokuDB, - PARTITION part7 ENGINE = TokuDB, - PARTITION part2 ENGINE = TokuDB, - PARTITION p4 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = TokuDB, + PARTITION `part1` ENGINE = TokuDB, + PARTITION `part7` ENGINE = TokuDB, + PARTITION `part2` ENGINE = TokuDB, + PARTITION `p4` ENGINE = TokuDB) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) <> 1 FROM t1 WHERE f_int1 = 3; @@ -602,11 +602,11 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = TokuDB, - PARTITION part1 ENGINE = TokuDB, - PARTITION part7 ENGINE = TokuDB, - PARTITION part2 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = TokuDB, + PARTITION `part1` ENGINE = TokuDB, + PARTITION `part7` ENGINE = TokuDB, + PARTITION `part2` ENGINE = TokuDB) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) <> 1 FROM t1 WHERE f_int1 = 3; @@ -625,10 +625,10 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = TokuDB, - PARTITION part1 ENGINE = TokuDB, - PARTITION part7 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = TokuDB, + PARTITION `part1` ENGINE = TokuDB, + PARTITION `part7` ENGINE = TokuDB) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) <> 1 FROM t1 WHERE f_int1 = 3; @@ -647,9 +647,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = TokuDB, - PARTITION part1 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = TokuDB, + PARTITION `part1` ENGINE = TokuDB) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) <> 1 FROM t1 WHERE f_int1 = 3; @@ -668,8 +668,8 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION p0 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `p0` ENGINE = TokuDB) t1.frm t1.par EXPLAIN PARTITIONS SELECT COUNT(*) <> 1 FROM t1 WHERE f_int1 = 3; diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter4_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter4_tokudb.result index 07b9770d3ca..3409f1d380e 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter4_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_alter4_tokudb.result @@ -75,9 +75,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -534,12 +534,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB, - PARTITION part_3 ENGINE = TokuDB, - PARTITION part_4 ENGINE = TokuDB, - PARTITION part_5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB, + PARTITION `part_3` ENGINE = TokuDB, + PARTITION `part_4` ENGINE = TokuDB, + PARTITION `part_5` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1004,15 +1004,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1475,13 +1475,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1940,13 +1940,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2411,20 +2411,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2887,20 +2887,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3361,12 +3361,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3825,9 +3825,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -4284,12 +4284,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB, - PARTITION part_3 ENGINE = TokuDB, - PARTITION part_4 ENGINE = TokuDB, - PARTITION part_5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB, + PARTITION `part_3` ENGINE = TokuDB, + PARTITION `part_4` ENGINE = TokuDB, + PARTITION `part_5` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -4754,15 +4754,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5225,13 +5225,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -5690,13 +5690,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6161,20 +6161,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -6637,20 +6637,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7111,12 +7111,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -7575,9 +7575,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -8034,12 +8034,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB, - PARTITION part_3 ENGINE = TokuDB, - PARTITION part_4 ENGINE = TokuDB, - PARTITION part_5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB, + PARTITION `part_3` ENGINE = TokuDB, + PARTITION `part_4` ENGINE = TokuDB, + PARTITION `part_5` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -8504,15 +8504,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -8975,13 +8975,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9440,13 +9440,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -9911,20 +9911,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10387,20 +10387,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -10861,12 +10861,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11325,9 +11325,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -11784,12 +11784,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB, - PARTITION part_3 ENGINE = TokuDB, - PARTITION part_4 ENGINE = TokuDB, - PARTITION part_5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB, + PARTITION `part_3` ENGINE = TokuDB, + PARTITION `part_4` ENGINE = TokuDB, + PARTITION `part_5` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -12254,15 +12254,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -12725,13 +12725,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13190,13 +13190,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -13661,20 +13661,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14137,20 +14137,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -14611,12 +14611,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15075,9 +15075,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -15534,12 +15534,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB, - PARTITION part_3 ENGINE = TokuDB, - PARTITION part_4 ENGINE = TokuDB, - PARTITION part_5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB, + PARTITION `part_3` ENGINE = TokuDB, + PARTITION `part_4` ENGINE = TokuDB, + PARTITION `part_5` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -16004,15 +16004,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -16475,13 +16475,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -16940,13 +16940,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -17411,20 +17411,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -17887,20 +17887,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18361,12 +18361,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -18828,9 +18828,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19287,12 +19287,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB, - PARTITION part_3 ENGINE = TokuDB, - PARTITION part_4 ENGINE = TokuDB, - PARTITION part_5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB, + PARTITION `part_3` ENGINE = TokuDB, + PARTITION `part_4` ENGINE = TokuDB, + PARTITION `part_5` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -19757,15 +19757,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -20228,13 +20228,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -20693,13 +20693,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -21164,20 +21164,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -21640,20 +21640,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -22114,12 +22114,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -22578,9 +22578,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -23037,12 +23037,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB, - PARTITION part_3 ENGINE = TokuDB, - PARTITION part_4 ENGINE = TokuDB, - PARTITION part_5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB, + PARTITION `part_3` ENGINE = TokuDB, + PARTITION `part_4` ENGINE = TokuDB, + PARTITION `part_5` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -23507,15 +23507,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -23978,13 +23978,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -24443,13 +24443,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -24914,20 +24914,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -25390,20 +25390,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -25864,12 +25864,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -26328,9 +26328,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -26787,12 +26787,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB, - PARTITION part_3 ENGINE = TokuDB, - PARTITION part_4 ENGINE = TokuDB, - PARTITION part_5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB, + PARTITION `part_3` ENGINE = TokuDB, + PARTITION `part_4` ENGINE = TokuDB, + PARTITION `part_5` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -27257,15 +27257,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -27728,13 +27728,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -28193,13 +28193,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -28664,20 +28664,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -29140,20 +29140,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -29614,12 +29614,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -30078,9 +30078,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -30537,12 +30537,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB, - PARTITION part_3 ENGINE = TokuDB, - PARTITION part_4 ENGINE = TokuDB, - PARTITION part_5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB, + PARTITION `part_3` ENGINE = TokuDB, + PARTITION `part_4` ENGINE = TokuDB, + PARTITION `part_5` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -31007,15 +31007,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -31478,13 +31478,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -31943,13 +31943,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -32414,20 +32414,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -32890,20 +32890,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -33364,12 +33364,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -33828,9 +33828,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -34287,12 +34287,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB, - PARTITION part_3 ENGINE = TokuDB, - PARTITION part_4 ENGINE = TokuDB, - PARTITION part_5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB, + PARTITION `part_3` ENGINE = TokuDB, + PARTITION `part_4` ENGINE = TokuDB, + PARTITION `part_5` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -34757,15 +34757,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -35228,13 +35228,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -35693,13 +35693,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -36164,20 +36164,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -36640,20 +36640,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -37114,12 +37114,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -37582,9 +37582,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -38042,12 +38042,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB, - PARTITION part_3 ENGINE = TokuDB, - PARTITION part_4 ENGINE = TokuDB, - PARTITION part_5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB, + PARTITION `part_3` ENGINE = TokuDB, + PARTITION `part_4` ENGINE = TokuDB, + PARTITION `part_5` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -38513,15 +38513,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -38985,13 +38985,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -39451,13 +39451,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -39923,20 +39923,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -40400,20 +40400,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -40875,12 +40875,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -41340,9 +41340,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -41800,12 +41800,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB, - PARTITION part_3 ENGINE = TokuDB, - PARTITION part_4 ENGINE = TokuDB, - PARTITION part_5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB, + PARTITION `part_3` ENGINE = TokuDB, + PARTITION `part_4` ENGINE = TokuDB, + PARTITION `part_5` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -42271,15 +42271,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -42743,13 +42743,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -43209,13 +43209,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -43681,20 +43681,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -44158,20 +44158,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -44633,12 +44633,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -45097,9 +45097,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -45556,12 +45556,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB, - PARTITION part_3 ENGINE = TokuDB, - PARTITION part_4 ENGINE = TokuDB, - PARTITION part_5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB, + PARTITION `part_3` ENGINE = TokuDB, + PARTITION `part_4` ENGINE = TokuDB, + PARTITION `part_5` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -46026,15 +46026,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -46497,13 +46497,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -46962,13 +46962,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -47433,20 +47433,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -47909,20 +47909,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -48383,12 +48383,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -48847,9 +48847,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -49306,12 +49306,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB, - PARTITION part_3 ENGINE = TokuDB, - PARTITION part_4 ENGINE = TokuDB, - PARTITION part_5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB, + PARTITION `part_3` ENGINE = TokuDB, + PARTITION `part_4` ENGINE = TokuDB, + PARTITION `part_5` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -49776,15 +49776,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -50247,13 +50247,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -50712,13 +50712,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -51183,20 +51183,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -51659,20 +51659,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -52133,12 +52133,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -52598,9 +52598,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -53058,12 +53058,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB, - PARTITION part_3 ENGINE = TokuDB, - PARTITION part_4 ENGINE = TokuDB, - PARTITION part_5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB, + PARTITION `part_3` ENGINE = TokuDB, + PARTITION `part_4` ENGINE = TokuDB, + PARTITION `part_5` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -53529,15 +53529,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -54001,13 +54001,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -54467,13 +54467,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -54939,20 +54939,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -55416,20 +55416,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -55891,12 +55891,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -56356,9 +56356,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -56813,12 +56813,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB, - PARTITION part_3 ENGINE = TokuDB, - PARTITION part_4 ENGINE = TokuDB, - PARTITION part_5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB, + PARTITION `part_3` ENGINE = TokuDB, + PARTITION `part_4` ENGINE = TokuDB, + PARTITION `part_5` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -57281,15 +57281,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -57750,13 +57750,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -58213,13 +58213,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -58682,20 +58682,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -59156,20 +59156,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -59628,12 +59628,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -60090,9 +60090,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -60547,12 +60547,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB, - PARTITION part_3 ENGINE = TokuDB, - PARTITION part_4 ENGINE = TokuDB, - PARTITION part_5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB, + PARTITION `part_3` ENGINE = TokuDB, + PARTITION `part_4` ENGINE = TokuDB, + PARTITION `part_5` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -61015,15 +61015,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -61484,13 +61484,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -61947,13 +61947,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -62416,20 +62416,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -62890,20 +62890,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -63362,12 +63362,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -64144,9 +64144,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -64601,12 +64601,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB, - PARTITION part_3 ENGINE = TokuDB, - PARTITION part_4 ENGINE = TokuDB, - PARTITION part_5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB, + PARTITION `part_3` ENGINE = TokuDB, + PARTITION `part_4` ENGINE = TokuDB, + PARTITION `part_5` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -65069,15 +65069,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -65538,13 +65538,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -66001,13 +66001,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -66470,20 +66470,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -66944,20 +66944,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -67416,12 +67416,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -67883,9 +67883,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -68342,12 +68342,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB, - PARTITION part_3 ENGINE = TokuDB, - PARTITION part_4 ENGINE = TokuDB, - PARTITION part_5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB, + PARTITION `part_3` ENGINE = TokuDB, + PARTITION `part_4` ENGINE = TokuDB, + PARTITION `part_5` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -68812,15 +68812,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -69283,13 +69283,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -69748,13 +69748,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -70219,20 +70219,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -70695,20 +70695,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -71169,12 +71169,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -71633,9 +71633,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -72092,12 +72092,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB, - PARTITION part_3 ENGINE = TokuDB, - PARTITION part_4 ENGINE = TokuDB, - PARTITION part_5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB, + PARTITION `part_3` ENGINE = TokuDB, + PARTITION `part_4` ENGINE = TokuDB, + PARTITION `part_5` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -72562,15 +72562,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -73033,13 +73033,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -73498,13 +73498,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -73969,20 +73969,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -74445,20 +74445,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -74919,12 +74919,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -75383,9 +75383,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -75842,12 +75842,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB, - PARTITION part_3 ENGINE = TokuDB, - PARTITION part_4 ENGINE = TokuDB, - PARTITION part_5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB, + PARTITION `part_3` ENGINE = TokuDB, + PARTITION `part_4` ENGINE = TokuDB, + PARTITION `part_5` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -76312,15 +76312,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -76783,13 +76783,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -77248,13 +77248,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -77719,20 +77719,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -78195,20 +78195,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -78669,12 +78669,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -79133,9 +79133,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -79592,12 +79592,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB, - PARTITION part_3 ENGINE = TokuDB, - PARTITION part_4 ENGINE = TokuDB, - PARTITION part_5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB, + PARTITION `part_3` ENGINE = TokuDB, + PARTITION `part_4` ENGINE = TokuDB, + PARTITION `part_5` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -80062,15 +80062,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -80533,13 +80533,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -80998,13 +80998,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -81469,20 +81469,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -81945,20 +81945,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -82419,12 +82419,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -82883,9 +82883,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -83342,12 +83342,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) -(PARTITION part_1 ENGINE = TokuDB, - PARTITION part_2 ENGINE = TokuDB, - PARTITION part_3 ENGINE = TokuDB, - PARTITION part_4 ENGINE = TokuDB, - PARTITION part_5 ENGINE = TokuDB) + PARTITION BY KEY (`f_int1`) +(PARTITION `part_1` ENGINE = TokuDB, + PARTITION `part_2` ENGINE = TokuDB, + PARTITION `part_3` ENGINE = TokuDB, + PARTITION `part_4` ENGINE = TokuDB, + PARTITION `part_5` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -83812,15 +83812,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -84283,13 +84283,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_1 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION part_5 VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_1` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `part_5` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -84748,13 +84748,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part_1 VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION part_3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part_4 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part_1` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `part_3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part_4` VALUES LESS THAN (2147483646) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -85219,20 +85219,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part_1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part_2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part_3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part_4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part_1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part_2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part_3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part_4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -85695,20 +85695,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part_1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part_2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part_3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part_4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part_1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part_2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part_3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part_4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -86169,12 +86169,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part_1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part_3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part_1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part_3` VALUES IN (NULL) ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_auto_increment_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_auto_increment_tokudb.result index 3207e5fda86..b18f970d2ce 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_auto_increment_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_auto_increment_tokudb.result @@ -189,7 +189,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=TokuDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1; c1 @@ -413,7 +413,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=TokuDB AUTO_INCREMENT=27 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -426,7 +426,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=TokuDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -444,7 +444,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=TokuDB AUTO_INCREMENT=102 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 DROP TABLE t1; # Test with two threads @@ -715,7 +715,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=TokuDB AUTO_INCREMENT=15 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (4); SHOW CREATE TABLE t1; @@ -724,7 +724,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=TokuDB AUTO_INCREMENT=15 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (0); SHOW CREATE TABLE t1; @@ -733,7 +733,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=TokuDB AUTO_INCREMENT=16 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -742,7 +742,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=TokuDB AUTO_INCREMENT=17 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -758,7 +758,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=TokuDB AUTO_INCREMENT=301 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (0); SHOW CREATE TABLE t1; @@ -767,7 +767,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=TokuDB AUTO_INCREMENT=301 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -776,7 +776,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=TokuDB AUTO_INCREMENT=302 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 @@ -799,7 +799,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -808,7 +808,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=TokuDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1; c1 @@ -820,7 +820,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=TokuDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; @@ -829,7 +829,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=TokuDB AUTO_INCREMENT=24 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SET INSERT_ID = 22; INSERT INTO t1 VALUES (NULL), (NULL), (NULL); @@ -853,7 +853,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 FLUSH TABLE; SHOW CREATE TABLE t1; @@ -862,7 +862,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 VALUES (4); FLUSH TABLE; @@ -872,7 +872,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=TokuDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 INSERT INTO t1 VALUES (NULL); FLUSH TABLE; @@ -882,7 +882,7 @@ t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) ) ENGINE=TokuDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 - PARTITION BY HASH (c1) + PARTITION BY HASH (`c1`) PARTITIONS 2 SELECT * FROM t1 ORDER BY c1; c1 diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_basic_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_basic_tokudb.result index ca85132d982..fca6cbe169e 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_basic_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_basic_tokudb.result @@ -73,7 +73,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -528,7 +528,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -991,15 +991,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) unified filelist t1.frm @@ -1459,13 +1459,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) unified filelist t1.frm @@ -1921,13 +1921,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) unified filelist t1.frm @@ -2389,20 +2389,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) unified filelist t1.frm @@ -2866,20 +2866,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) unified filelist t1.frm @@ -3337,12 +3337,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) unified filelist t1.frm @@ -3798,7 +3798,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -4253,7 +4253,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -4716,15 +4716,15 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) unified filelist t1.frm @@ -5184,13 +5184,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) unified filelist t1.frm @@ -5646,13 +5646,13 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) unified filelist t1.frm @@ -6112,20 +6112,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) unified filelist t1.frm @@ -6585,20 +6585,20 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) unified filelist t1.frm @@ -7056,12 +7056,12 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) unified filelist t1.frm @@ -7523,7 +7523,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -8015,7 +8015,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -8515,15 +8515,15 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) unified filelist t1.frm @@ -9020,13 +9020,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) unified filelist t1.frm @@ -9519,13 +9519,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) unified filelist t1.frm @@ -10024,20 +10024,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) unified filelist t1.frm @@ -10538,20 +10538,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) unified filelist t1.frm @@ -11046,12 +11046,12 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) unified filelist t1.frm @@ -11543,7 +11543,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -12035,7 +12035,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -12535,15 +12535,15 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) unified filelist t1.frm @@ -13040,13 +13040,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) unified filelist t1.frm @@ -13539,13 +13539,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) unified filelist t1.frm @@ -14044,20 +14044,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) unified filelist t1.frm @@ -14558,20 +14558,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) unified filelist t1.frm @@ -15066,12 +15066,12 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) unified filelist t1.frm @@ -15563,7 +15563,7 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 unified filelist @@ -16071,7 +16071,7 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1) + PARTITION BY KEY (`f_int1`) PARTITIONS 5 unified filelist @@ -16587,15 +16587,15 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) unified filelist t1.frm @@ -17108,13 +17108,13 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE (`f_int1`) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) unified filelist t1.frm @@ -17623,13 +17623,13 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1 DIV 2) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1` DIV 2) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) unified filelist t1.frm @@ -18144,20 +18144,20 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int1) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) unified filelist t1.frm @@ -18674,20 +18674,20 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int1 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int1` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) unified filelist t1.frm @@ -19198,12 +19198,12 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int1) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int1`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) unified filelist t1.frm @@ -19716,7 +19716,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -20208,7 +20208,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -20708,15 +20708,15 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) unified filelist t1.frm @@ -21213,13 +21213,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) unified filelist t1.frm @@ -21712,13 +21712,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) unified filelist t1.frm @@ -22215,20 +22215,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) unified filelist t1.frm @@ -22725,20 +22725,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) unified filelist t1.frm @@ -23233,12 +23233,12 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int2`,`f_int1`), UNIQUE KEY `uidx1` (`f_int1`,`f_int2`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) unified filelist t1.frm @@ -23730,7 +23730,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -24222,7 +24222,7 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -24722,15 +24722,15 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) unified filelist t1.frm @@ -25227,13 +25227,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) unified filelist t1.frm @@ -25726,13 +25726,13 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) unified filelist t1.frm @@ -26229,20 +26229,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) unified filelist t1.frm @@ -26739,20 +26739,20 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) unified filelist t1.frm @@ -27247,12 +27247,12 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`f_int1`,`f_int2`), UNIQUE KEY `uidx1` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) unified filelist t1.frm @@ -27744,7 +27744,7 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1 + f_int2) + PARTITION BY HASH (`f_int1` + `f_int2`) PARTITIONS 2 unified filelist @@ -28252,7 +28252,7 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (f_int1,f_int2) + PARTITION BY KEY (`f_int1`,`f_int2`) PARTITIONS 5 unified filelist @@ -28768,15 +28768,15 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1 + f_int2,4)) -(PARTITION part_3 VALUES IN (-3) ENGINE = TokuDB, - PARTITION part_2 VALUES IN (-2) ENGINE = TokuDB, - PARTITION part_1 VALUES IN (-1) ENGINE = TokuDB, - PARTITION part_N VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part0 VALUES IN (0) ENGINE = TokuDB, - PARTITION part1 VALUES IN (1) ENGINE = TokuDB, - PARTITION part2 VALUES IN (2) ENGINE = TokuDB, - PARTITION part3 VALUES IN (3) ENGINE = TokuDB) + PARTITION BY LIST ((`f_int1` + `f_int2`) % 4) +(PARTITION `part_3` VALUES IN (-3) ENGINE = TokuDB, + PARTITION `part_2` VALUES IN (-2) ENGINE = TokuDB, + PARTITION `part_1` VALUES IN (-1) ENGINE = TokuDB, + PARTITION `part_N` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part0` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part1` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (2) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (3) ENGINE = TokuDB) unified filelist t1.frm @@ -29289,13 +29289,13 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE ((f_int1 + f_int2) DIV 2) -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (15) ENGINE = TokuDB, - PARTITION parte VALUES LESS THAN (20) ENGINE = TokuDB, - PARTITION partf VALUES LESS THAN (2147483646) ENGINE = TokuDB) + PARTITION BY RANGE ((`f_int1` + `f_int2`) DIV 2) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (15) ENGINE = TokuDB, + PARTITION `parte` VALUES LESS THAN (20) ENGINE = TokuDB, + PARTITION `partf` VALUES LESS THAN (2147483646) ENGINE = TokuDB) unified filelist t1.frm @@ -29804,13 +29804,13 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int2) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int2`) SUBPARTITIONS 2 -(PARTITION parta VALUES LESS THAN (0) ENGINE = TokuDB, - PARTITION partb VALUES LESS THAN (5) ENGINE = TokuDB, - PARTITION partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION partd VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `parta` VALUES LESS THAN (0) ENGINE = TokuDB, + PARTITION `partb` VALUES LESS THAN (5) ENGINE = TokuDB, + PARTITION `partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `partd` VALUES LESS THAN (2147483646) ENGINE = TokuDB) unified filelist t1.frm @@ -30323,20 +30323,20 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY KEY (f_int2) -(PARTITION part1 VALUES LESS THAN (0) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (5) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (10) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB), - PARTITION part4 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart41 ENGINE = TokuDB, - SUBPARTITION subpart42 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY KEY (`f_int2`) +(PARTITION `part1` VALUES LESS THAN (0) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (5) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (10) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB), + PARTITION `part4` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart41` ENGINE = TokuDB, + SUBPARTITION `subpart42` ENGINE = TokuDB)) unified filelist t1.frm @@ -30849,20 +30849,20 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,3))) -SUBPARTITION BY HASH (f_int2 + 1) -(PARTITION part1 VALUES IN (0) - (SUBPARTITION sp11 ENGINE = TokuDB, - SUBPARTITION sp12 ENGINE = TokuDB), - PARTITION part2 VALUES IN (1) - (SUBPARTITION sp21 ENGINE = TokuDB, - SUBPARTITION sp22 ENGINE = TokuDB), - PARTITION part3 VALUES IN (2) - (SUBPARTITION sp31 ENGINE = TokuDB, - SUBPARTITION sp32 ENGINE = TokuDB), - PARTITION part4 VALUES IN (NULL) - (SUBPARTITION sp41 ENGINE = TokuDB, - SUBPARTITION sp42 ENGINE = TokuDB)) + PARTITION BY LIST (abs(`f_int1` % 3)) +SUBPARTITION BY HASH (`f_int2` + 1) +(PARTITION `part1` VALUES IN (0) + (SUBPARTITION `sp11` ENGINE = TokuDB, + SUBPARTITION `sp12` ENGINE = TokuDB), + PARTITION `part2` VALUES IN (1) + (SUBPARTITION `sp21` ENGINE = TokuDB, + SUBPARTITION `sp22` ENGINE = TokuDB), + PARTITION `part3` VALUES IN (2) + (SUBPARTITION `sp31` ENGINE = TokuDB, + SUBPARTITION `sp32` ENGINE = TokuDB), + PARTITION `part4` VALUES IN (NULL) + (SUBPARTITION `sp41` ENGINE = TokuDB, + SUBPARTITION `sp42` ENGINE = TokuDB)) unified filelist t1.frm @@ -31373,12 +31373,12 @@ t1 CREATE TABLE `t1` ( UNIQUE KEY `uidx1` (`f_int1`,`f_int2`), UNIQUE KEY `uidx2` (`f_int2`,`f_int1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ABS(MOD(f_int1,2))) -SUBPARTITION BY KEY (f_int2) + PARTITION BY LIST (abs(`f_int1` % 2)) +SUBPARTITION BY KEY (`f_int2`) SUBPARTITIONS 3 -(PARTITION part1 VALUES IN (0) ENGINE = TokuDB, - PARTITION part2 VALUES IN (1) ENGINE = TokuDB, - PARTITION part3 VALUES IN (NULL) ENGINE = TokuDB) +(PARTITION `part1` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (1) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (NULL) ENGINE = TokuDB) unified filelist t1.frm diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_bit_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_bit_tokudb.result index cfd8155caf1..5cde7dd065e 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_bit_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_bit_tokudb.result @@ -9,7 +9,7 @@ t1 CREATE TABLE `t1` ( `a` bit(1) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) drop table t1; create table t1 (a bit(0), primary key (a)) engine='TOKUDB' partition by key (a) ( @@ -21,9 +21,9 @@ t1 CREATE TABLE `t1` ( `a` bit(1) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 ENGINE = TokuDB, - PARTITION pa2 ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` ENGINE = TokuDB, + PARTITION `pa2` ENGINE = TokuDB) drop table t1; create table t1 (a bit(64), primary key (a)) engine='TOKUDB' partition by key (a) partitions 2; @@ -33,7 +33,7 @@ t1 CREATE TABLE `t1` ( `a` bit(64) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 2 insert into t1 values (b'1111111111111111111111111111111111111111111111111111111111111111'), @@ -61,11 +61,11 @@ t1 CREATE TABLE `t1` ( `a` bit(64) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) insert into t1 values (b'1111111111111111111111111111111111111111111111111111111111111111'), (b'1000000000000000000000000000000000000000000000000000000000000000'), @@ -91,7 +91,7 @@ t2 CREATE TABLE `t2` ( `a` bit(1) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 4 insert into t2 values (b'0'), (b'1'); select hex(a) from t2; @@ -104,7 +104,7 @@ Table Create Table t2 CREATE TABLE `t2` ( `a` bit(1) NOT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 4 select hex(a) from t2; hex(a) @@ -117,7 +117,7 @@ t2 CREATE TABLE `t2` ( `a` bit(1) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 4 select hex(a) from t2; hex(a) @@ -136,13 +136,13 @@ t3 CREATE TABLE `t3` ( `a` bit(8) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -SUBPARTITION BY KEY (a) + PARTITION BY RANGE (`a`) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 2 -(PARTITION pa1 VALUES LESS THAN (3) ENGINE = TokuDB, - PARTITION pa2 VALUES LESS THAN (16) ENGINE = TokuDB, - PARTITION pa3 VALUES LESS THAN (64) ENGINE = TokuDB, - PARTITION pa4 VALUES LESS THAN (256) ENGINE = TokuDB) +(PARTITION `pa1` VALUES LESS THAN (3) ENGINE = TokuDB, + PARTITION `pa2` VALUES LESS THAN (16) ENGINE = TokuDB, + PARTITION `pa3` VALUES LESS THAN (64) ENGINE = TokuDB, + PARTITION `pa4` VALUES LESS THAN (256) ENGINE = TokuDB) 255 inserts; select hex(a) from t3 where a=b'01010101'; hex(a) @@ -419,12 +419,12 @@ t4 CREATE TABLE `t4` ( `a` bit(8) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -SUBPARTITION BY KEY (a) + PARTITION BY LIST (`a`) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 2 -(PARTITION pa1 VALUES IN (0,1,2,3) ENGINE = TokuDB, - PARTITION pa2 VALUES IN (4,5,6,7,8,9,10,11,12,13,14,15,16) ENGINE = TokuDB, - PARTITION pa3 VALUES IN (17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32) ENGINE = TokuDB) +(PARTITION `pa1` VALUES IN (0,1,2,3) ENGINE = TokuDB, + PARTITION `pa2` VALUES IN (4,5,6,7,8,9,10,11,12,13,14,15,16) ENGINE = TokuDB, + PARTITION `pa3` VALUES IN (17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32) ENGINE = TokuDB) 32 inserts; select hex(a) from t4 where a=b'00000001'; hex(a) diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_char_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_char_tokudb.result index 0d206906df3..86686296b81 100644 Binary files a/storage/tokudb/mysql-test/tokudb_parts/r/partition_char_tokudb.result and b/storage/tokudb/mysql-test/tokudb_parts/r/partition_char_tokudb.result differ diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_datetime_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_datetime_tokudb.result index 58a82b8f684..0bbd8bd75cc 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_datetime_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_datetime_tokudb.result @@ -10,11 +10,11 @@ t1 CREATE TABLE `t1` ( `a` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) insert into t1 values ('1975-01-01 21:21:21'), ('2020-12-31 12:10:30'), ('1980-10-14 03:03'), ('2000-06-15 23:59'); select * from t1; a @@ -40,7 +40,7 @@ t2 CREATE TABLE `t2` ( `a` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 12 insert into t2 values ('1975-01-01 0:1:1'), ('2020-12-31 10:11:12'), ('1980-10-14 13:14:15'), ('2000-06-15 14:15:16'); select * from t2; @@ -137,11 +137,11 @@ t1 CREATE TABLE `t1` ( `a` date NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) insert into t1 values ('1975-01-01'), ('2020-12-31'), ('1980-10-14'), ('2000-06-15'); select * from t1; a @@ -167,7 +167,7 @@ t2 CREATE TABLE `t2` ( `a` date NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 12 insert into t2 values ('1975-01-01'), ('2020-12-31'), ('1980-10-14'), ('2000-06-15'); select * from t2; @@ -291,13 +291,13 @@ t3 CREATE TABLE `t3` ( `a` date NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (month(a)) -SUBPARTITION BY KEY (a) + PARTITION BY RANGE (month(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 3 -(PARTITION quarter1 VALUES LESS THAN (4) ENGINE = TokuDB, - PARTITION quarter2 VALUES LESS THAN (7) ENGINE = TokuDB, - PARTITION quarter3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION quarter4 VALUES LESS THAN (13) ENGINE = TokuDB) +(PARTITION `quarter1` VALUES LESS THAN (4) ENGINE = TokuDB, + PARTITION `quarter2` VALUES LESS THAN (7) ENGINE = TokuDB, + PARTITION `quarter3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `quarter4` VALUES LESS THAN (13) ENGINE = TokuDB) 12 inserts; select count(*) from t3; count(*) @@ -331,13 +331,13 @@ t4 CREATE TABLE `t4` ( `a` date NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (month(a)) -SUBPARTITION BY KEY (a) + PARTITION BY LIST (month(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 3 -(PARTITION quarter1 VALUES IN (1,2,3) ENGINE = TokuDB, - PARTITION quarter2 VALUES IN (4,5,6) ENGINE = TokuDB, - PARTITION quarter3 VALUES IN (7,8,9) ENGINE = TokuDB, - PARTITION quarter4 VALUES IN (10,11,12) ENGINE = TokuDB) +(PARTITION `quarter1` VALUES IN (1,2,3) ENGINE = TokuDB, + PARTITION `quarter2` VALUES IN (4,5,6) ENGINE = TokuDB, + PARTITION `quarter3` VALUES IN (7,8,9) ENGINE = TokuDB, + PARTITION `quarter4` VALUES IN (10,11,12) ENGINE = TokuDB) 12 inserts; select count(*) from t4; count(*) @@ -369,11 +369,11 @@ t1 CREATE TABLE `t1` ( `a` time NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) insert into t1 values ('21:21:21'), ('12:10:30'), ('03:03:03'), ('23:59'); select * from t1; a @@ -399,7 +399,7 @@ t2 CREATE TABLE `t2` ( `a` time NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 12 insert into t2 values ('0:1:1'), ('10:11:12'), ('13:14:15'), ('14:15:16'); select * from t2; @@ -498,13 +498,13 @@ t3 CREATE TABLE `t3` ( `a` time NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (second(a)) -SUBPARTITION BY KEY (a) + PARTITION BY RANGE (second(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 3 -(PARTITION quarter1 VALUES LESS THAN (16) ENGINE = TokuDB, - PARTITION quarter2 VALUES LESS THAN (31) ENGINE = TokuDB, - PARTITION quarter3 VALUES LESS THAN (46) ENGINE = TokuDB, - PARTITION quarter4 VALUES LESS THAN (61) ENGINE = TokuDB) +(PARTITION `quarter1` VALUES LESS THAN (16) ENGINE = TokuDB, + PARTITION `quarter2` VALUES LESS THAN (31) ENGINE = TokuDB, + PARTITION `quarter3` VALUES LESS THAN (46) ENGINE = TokuDB, + PARTITION `quarter4` VALUES LESS THAN (61) ENGINE = TokuDB) 59 inserts; select count(*) from t3; count(*) @@ -585,13 +585,13 @@ t4 CREATE TABLE `t4` ( `a` time NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (second(a)) -SUBPARTITION BY KEY (a) + PARTITION BY LIST (second(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 3 -(PARTITION quarter1 VALUES IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15) ENGINE = TokuDB, - PARTITION quarter2 VALUES IN (16,17,18,19,20,21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, - PARTITION quarter3 VALUES IN (31,32,33,34,35,36,37,38,39,40,41,42,43,44,45) ENGINE = TokuDB, - PARTITION quarter4 VALUES IN (46,47,48,49,50,51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) +(PARTITION `quarter1` VALUES IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15) ENGINE = TokuDB, + PARTITION `quarter2` VALUES IN (16,17,18,19,20,21,22,23,24,25,26,27,28,29,30) ENGINE = TokuDB, + PARTITION `quarter3` VALUES IN (31,32,33,34,35,36,37,38,39,40,41,42,43,44,45) ENGINE = TokuDB, + PARTITION `quarter4` VALUES IN (46,47,48,49,50,51,52,53,54,55,56,57,58,59,60) ENGINE = TokuDB) 59 inserts; select count(*) from t4; count(*) @@ -670,11 +670,11 @@ t1 CREATE TABLE `t1` ( `a` datetime NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) insert into t1 values ('1975-01-01 21:21:21'), ('2020-12-31 12:10:30'), ('1980-10-14 03:03'), ('2000-06-15 23:59'); select * from t1; a @@ -700,7 +700,7 @@ t2 CREATE TABLE `t2` ( `a` datetime NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 12 insert into t2 values ('1975-01-01 0:1:1'), ('2020-12-31 10:11:12'), ('1980-10-14 13:14:15'), ('2000-06-15 14:15:16'); select * from t2; @@ -799,13 +799,13 @@ t3 CREATE TABLE `t3` ( `a` datetime NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (month(a)) -SUBPARTITION BY KEY (a) + PARTITION BY RANGE (month(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 3 -(PARTITION quarter1 VALUES LESS THAN (4) ENGINE = TokuDB, - PARTITION quarter2 VALUES LESS THAN (7) ENGINE = TokuDB, - PARTITION quarter3 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION quarter4 VALUES LESS THAN (13) ENGINE = TokuDB) +(PARTITION `quarter1` VALUES LESS THAN (4) ENGINE = TokuDB, + PARTITION `quarter2` VALUES LESS THAN (7) ENGINE = TokuDB, + PARTITION `quarter3` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `quarter4` VALUES LESS THAN (13) ENGINE = TokuDB) 12 inserts; select count(*) from t3; count(*) @@ -839,13 +839,13 @@ t4 CREATE TABLE `t4` ( `a` datetime NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (month(a)) -SUBPARTITION BY KEY (a) + PARTITION BY LIST (month(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 3 -(PARTITION quarter1 VALUES IN (1,2,3) ENGINE = TokuDB, - PARTITION quarter2 VALUES IN (4,5,6) ENGINE = TokuDB, - PARTITION quarter3 VALUES IN (7,8,9) ENGINE = TokuDB, - PARTITION quarter4 VALUES IN (10,11,12) ENGINE = TokuDB) +(PARTITION `quarter1` VALUES IN (1,2,3) ENGINE = TokuDB, + PARTITION `quarter2` VALUES IN (4,5,6) ENGINE = TokuDB, + PARTITION `quarter3` VALUES IN (7,8,9) ENGINE = TokuDB, + PARTITION `quarter4` VALUES IN (10,11,12) ENGINE = TokuDB) 12 inserts; select count(*) from t4; count(*) @@ -877,11 +877,11 @@ t1 CREATE TABLE `t1` ( `a` year(4) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) insert into t1 values ('1975'), (2020), ('1980'), ('2000'); select * from t1; a @@ -907,7 +907,7 @@ t2 CREATE TABLE `t2` ( `a` year(4) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 12 insert into t2 values ('1975'), ('2020'), ('1980'), ('2000'); select * from t2; diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_debug_sync_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_debug_sync_tokudb.result index 98eba1276c8..7186da6f69a 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_debug_sync_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_debug_sync_tokudb.result @@ -56,8 +56,8 @@ Table Create Table t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 STATS_PERSISTENT=0 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) t1.frm t1.par SET DEBUG_SYNC='before_open_in_get_all_tables SIGNAL parked WAIT_FOR open'; @@ -90,9 +90,9 @@ Table Create Table t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 STATS_PERSISTENT=0 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p10 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p10` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a 1 diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_debug_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_debug_tokudb.result index 5031af92fbe..af3aaddca7c 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_debug_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_debug_tokudb.result @@ -28,9 +28,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -56,9 +56,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -87,9 +87,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -117,9 +117,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -148,9 +148,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -178,9 +178,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -209,9 +209,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -239,9 +239,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -270,9 +270,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -300,9 +300,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -331,9 +331,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -361,9 +361,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -392,9 +392,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -422,9 +422,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -453,9 +453,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -483,10 +483,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -515,9 +515,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -543,10 +543,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -575,9 +575,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -603,10 +603,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -636,9 +636,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -661,9 +661,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -691,9 +691,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -717,9 +717,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -749,9 +749,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -774,9 +774,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -804,9 +804,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -830,9 +830,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -862,9 +862,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -887,9 +887,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -917,9 +917,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -943,9 +943,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -975,9 +975,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1000,9 +1000,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1030,9 +1030,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1056,9 +1056,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1088,9 +1088,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1113,9 +1113,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1143,9 +1143,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1169,9 +1169,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1201,9 +1201,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1226,9 +1226,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1256,9 +1256,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1282,9 +1282,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1314,9 +1314,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1339,9 +1339,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1369,9 +1369,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1395,9 +1395,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1427,9 +1427,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1452,10 +1452,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1483,9 +1483,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1509,10 +1509,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1542,9 +1542,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1567,10 +1567,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1598,9 +1598,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1624,10 +1624,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1657,9 +1657,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1682,10 +1682,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1713,9 +1713,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1739,10 +1739,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1773,9 +1773,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1800,9 +1800,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1831,9 +1831,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1860,9 +1860,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1891,9 +1891,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1920,9 +1920,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1951,9 +1951,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -1980,8 +1980,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2006,9 +2006,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2035,8 +2035,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2061,9 +2061,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2090,8 +2090,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2116,9 +2116,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2143,8 +2143,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2169,9 +2169,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2196,8 +2196,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2222,9 +2222,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2249,8 +2249,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2276,9 +2276,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2300,9 +2300,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2330,9 +2330,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2355,9 +2355,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2387,9 +2387,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2411,9 +2411,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2441,9 +2441,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2466,9 +2466,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2498,9 +2498,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2522,9 +2522,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2552,9 +2552,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2577,9 +2577,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2609,9 +2609,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2633,8 +2633,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2658,9 +2658,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2683,8 +2683,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2710,9 +2710,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2734,8 +2734,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2759,9 +2759,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2784,8 +2784,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2811,9 +2811,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2835,8 +2835,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2860,9 +2860,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2885,8 +2885,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2912,9 +2912,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2936,8 +2936,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2961,9 +2961,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -2986,8 +2986,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3013,9 +3013,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3037,8 +3037,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3062,9 +3062,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3087,8 +3087,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3114,9 +3114,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3138,8 +3138,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3163,9 +3163,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3188,8 +3188,8 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3217,9 +3217,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3246,9 +3246,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3277,9 +3277,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3308,9 +3308,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3339,9 +3339,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3370,9 +3370,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3401,9 +3401,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3432,9 +3432,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3463,9 +3463,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3494,9 +3494,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3525,9 +3525,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3556,9 +3556,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3587,9 +3587,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3618,10 +3618,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3650,9 +3650,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3681,10 +3681,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3713,9 +3713,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3742,10 +3742,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3774,9 +3774,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3803,10 +3803,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3835,9 +3835,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3864,10 +3864,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3896,9 +3896,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3925,10 +3925,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3959,9 +3959,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -3985,9 +3985,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4015,9 +4015,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4042,9 +4042,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4074,9 +4074,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4100,9 +4100,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4130,9 +4130,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4157,9 +4157,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4189,9 +4189,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4215,9 +4215,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4245,9 +4245,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4272,9 +4272,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4304,9 +4304,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4330,9 +4330,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4360,9 +4360,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4387,9 +4387,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4419,9 +4419,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4445,9 +4445,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4475,9 +4475,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4502,9 +4502,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4534,9 +4534,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4560,9 +4560,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4590,9 +4590,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4617,9 +4617,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4649,9 +4649,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4675,10 +4675,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4706,9 +4706,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4733,10 +4733,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4766,9 +4766,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4792,10 +4792,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4823,9 +4823,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4850,10 +4850,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4883,9 +4883,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4909,10 +4909,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4940,9 +4940,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -4967,10 +4967,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5000,9 +5000,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5026,10 +5026,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5057,9 +5057,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5084,10 +5084,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5117,9 +5117,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5143,10 +5143,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5174,9 +5174,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5201,10 +5201,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5234,9 +5234,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5260,10 +5260,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5291,9 +5291,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (11,12,13,14,15,16,17,18,19) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5318,10 +5318,10 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, - PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, - PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `p0` VALUES IN (0,1,2,3,4,5,6,7,8,9) ENGINE = TokuDB, + PARTITION `p10` VALUES IN (10,11,12,13,14,15,16,17,18,19) ENGINE = TokuDB, + PARTITION `p20` VALUES IN (20,21,22,23,24,25,26,27,28,29) ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5372,9 +5372,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5405,9 +5405,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5468,9 +5468,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5501,9 +5501,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5564,9 +5564,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5597,9 +5597,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5660,9 +5660,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5693,9 +5693,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5756,9 +5756,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5789,9 +5789,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5852,9 +5852,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5885,9 +5885,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5948,9 +5948,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -5981,9 +5981,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6044,9 +6044,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6077,9 +6077,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6140,9 +6140,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6173,9 +6173,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 11 Original from partition p1 @@ -6236,9 +6236,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6265,9 +6265,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6328,9 +6328,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6357,9 +6357,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6420,9 +6420,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6449,9 +6449,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6512,9 +6512,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6541,9 +6541,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6604,9 +6604,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6633,9 +6633,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6696,9 +6696,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6725,9 +6725,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6788,9 +6788,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6817,9 +6817,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6880,9 +6880,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6909,9 +6909,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -6972,9 +6972,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 1 Original from partition p0 @@ -7001,9 +7001,9 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(64) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1; a b 11 Original from partition p1 diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_decimal_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_decimal_tokudb.result index 7ec843191e9..6dfeda71b48 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_decimal_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_decimal_tokudb.result @@ -10,11 +10,11 @@ t1 CREATE TABLE `t1` ( `a` decimal(10,4) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) insert into t1 values (999999.9999), (-999999.9999), (123456.7899), (-123456.7899), (-1.5), (1), (0), (-1), (1.5), (1234.567), (-1234.567); select * from t1; a @@ -54,7 +54,7 @@ t2 CREATE TABLE `t2` ( `a` decimal(18,9) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 10 insert into t2 values (999999999.999999999), (-999999999.999999999), (-1.5), (-1), (0), (1.5), (1234.567), (-1234.567); select * from t2; @@ -100,14 +100,14 @@ t3 CREATE TABLE `t3` ( `a` decimal(18,9) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (floor(a)) -SUBPARTITION BY KEY (a) + PARTITION BY RANGE (floor(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 2 -(PARTITION pa2 VALUES LESS THAN (2) ENGINE = TokuDB, - PARTITION pa4 VALUES LESS THAN (4) ENGINE = TokuDB, - PARTITION pa6 VALUES LESS THAN (6) ENGINE = TokuDB, - PARTITION pa8 VALUES LESS THAN (8) ENGINE = TokuDB, - PARTITION pa10 VALUES LESS THAN (10) ENGINE = TokuDB) +(PARTITION `pa2` VALUES LESS THAN (2) ENGINE = TokuDB, + PARTITION `pa4` VALUES LESS THAN (4) ENGINE = TokuDB, + PARTITION `pa6` VALUES LESS THAN (6) ENGINE = TokuDB, + PARTITION `pa8` VALUES LESS THAN (8) ENGINE = TokuDB, + PARTITION `pa10` VALUES LESS THAN (10) ENGINE = TokuDB) 9*3 inserts; select count(*) from t3; count(*) @@ -127,14 +127,14 @@ t4 CREATE TABLE `t4` ( `a` decimal(18,9) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (ceiling(a)) -SUBPARTITION BY KEY (a) + PARTITION BY LIST (ceiling(`a`)) +SUBPARTITION BY KEY (`a`) SUBPARTITIONS 2 -(PARTITION pa2 VALUES IN (1,2) ENGINE = TokuDB, - PARTITION pa4 VALUES IN (3,4) ENGINE = TokuDB, - PARTITION pa6 VALUES IN (5,6) ENGINE = TokuDB, - PARTITION pa8 VALUES IN (7,8) ENGINE = TokuDB, - PARTITION pa10 VALUES IN (9,10) ENGINE = TokuDB) +(PARTITION `pa2` VALUES IN (1,2) ENGINE = TokuDB, + PARTITION `pa4` VALUES IN (3,4) ENGINE = TokuDB, + PARTITION `pa6` VALUES IN (5,6) ENGINE = TokuDB, + PARTITION `pa8` VALUES IN (7,8) ENGINE = TokuDB, + PARTITION `pa10` VALUES IN (9,10) ENGINE = TokuDB) 9*3 inserts; select count(*) from t4; count(*) diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_engine_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_engine_tokudb.result index c14e895f8f2..a921ba0f56d 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_engine_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_engine_tokudb.result @@ -68,7 +68,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 # check prerequisites-1 success: 1 @@ -525,9 +525,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part1 ENGINE = TokuDB, - PARTITION part2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part1` ENGINE = TokuDB, + PARTITION `part2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -984,14 +984,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (10) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (10) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -1509,14 +1509,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (10) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (10) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2010,14 +2010,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (10) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (10) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2472,14 +2472,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (10) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (10) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -2934,9 +2934,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part1 ENGINE = TokuDB, - PARTITION part2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part1` ENGINE = TokuDB, + PARTITION `part2` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3393,14 +3393,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (10) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (10) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -3858,14 +3858,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (10) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (10) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -4316,8 +4316,8 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part1 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part1` ENGINE = TokuDB) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 @@ -4770,11 +4770,11 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (1000) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (1000) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB)) # check prerequisites-1 success: 1 # check COUNT(*) success: 1 diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_exch_qa_1_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_exch_qa_1_tokudb.result index da13bf5bc5b..8f3d888a5a3 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_exch_qa_1_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_exch_qa_1_tokudb.result @@ -128,10 +128,10 @@ tp CREATE TABLE `tp` ( PRIMARY KEY (`a`), UNIQUE KEY `a` (`a`) USING BTREE ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN (100) ENGINE = TokuDB, - PARTITION p2 VALUES LESS THAN (1000) ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN (100) ENGINE = TokuDB, + PARTITION `p2` VALUES LESS THAN (1000) ENGINE = TokuDB) ALTER TABLE tp DROP INDEX a; ALTER TABLE t_10 DROP INDEX a; ALTER TABLE tp ADD UNIQUE INDEX USING BTREE (a,b); @@ -153,10 +153,10 @@ tp CREATE TABLE `tp` ( PRIMARY KEY (`a`), UNIQUE KEY `a` (`a`,`b`) USING BTREE ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN (100) ENGINE = TokuDB, - PARTITION p2 VALUES LESS THAN (1000) ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN (100) ENGINE = TokuDB, + PARTITION `p2` VALUES LESS THAN (1000) ENGINE = TokuDB) DROP TABLE IF EXISTS t_10; DROP TABLE IF EXISTS t_100; DROP TABLE IF EXISTS t_1000; diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_exchange_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_exchange_tokudb.result index 11c75321b4b..b3cc206e854 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_exchange_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_exchange_tokudb.result @@ -13,7 +13,7 @@ tp CREATE TABLE `tp` ( `b` varchar(24) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) + PARTITION BY HASH (`a`) PARTITIONS 4 SHOW CREATE TABLE t; Table Create Table @@ -86,7 +86,7 @@ tp CREATE TABLE `tp` ( `b` varchar(24) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB AUTO_INCREMENT=112 DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) + PARTITION BY HASH (`a`) PARTITIONS 4 SHOW CREATE TABLE t; Table Create Table @@ -194,9 +194,9 @@ tp CREATE TABLE `tp` ( `b` varchar(55) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SET DEBUG_SYNC= 'now SIGNAL goto_verification'; SET DEBUG_SYNC= 'now WAIT_FOR swap_in_progress'; # select from t and select/update/delete/insert from tp should work @@ -237,9 +237,9 @@ tp CREATE TABLE `tp` ( `b` varchar(55) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SET DEBUG_SYNC= 'now SIGNAL goto_wait'; SET DEBUG_SYNC= 'now WAIT_FOR swap_in_progress'; # Both tables should now be under exclusive lock, even SHOW should fail @@ -312,9 +312,9 @@ tp CREATE TABLE `tp` ( `b` varchar(55) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM tp WHERE a = 99; a b 99 End of values @@ -346,9 +346,9 @@ tp CREATE TABLE `tp` ( `b` varchar(55) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION p0 VALUES LESS THAN (100) ENGINE = TokuDB, - PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (100) ENGINE = TokuDB, + PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t; a b 10 Ten diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_float_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_float_tokudb.result index 4f75249a21c..41cf88139ed 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_float_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_float_tokudb.result @@ -10,11 +10,11 @@ t1 CREATE TABLE `t1` ( `a` float NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) insert into t1 values (-3.402823466E+38), (3.402823466E+38), (-1.5), (-1), (0), (1), (1.5); select * from t1; a @@ -46,7 +46,7 @@ t2 CREATE TABLE `t2` ( `a` float NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 10 insert into t2 values (-3.402823466E+38), (-3.402823466E+37), (-123.456), (0), (1234546.789), (123.456), (1.5); select * from t2; @@ -100,11 +100,11 @@ t1 CREATE TABLE `t1` ( `a` double NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) insert into t1 values (-2.2250738585072014E+208), (-2.2250738585072014E-208), (-1.5), (-1), (0), (1.5), (1234.567), (2.2250738585072014E+208); select * from t1; a @@ -138,7 +138,7 @@ t2 CREATE TABLE `t2` ( `a` double NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 10 insert into t2 values (-2.2250738585072014E+208), (-2.2250738585072014E-208), (-1.5), (-1), (0), (1.5), (1234.567), (2.2250738585072014E+208); select * from t2; diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_int_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_int_tokudb.result index 581b5a72a0e..87ad2fc16f2 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_int_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_int_tokudb.result @@ -10,11 +10,11 @@ t1 CREATE TABLE `t1` ( `a` tinyint(3) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) insert into t1 values (255), (254), (253), (252), (1), (2), (128); select * from t1; a @@ -46,7 +46,7 @@ t2 CREATE TABLE `t2` ( `a` tinyint(3) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 8 insert into t2 values (255), (254), (253), (252); select * from t2; @@ -78,7 +78,7 @@ t3 CREATE TABLE `t3` ( `a` tinyint(4) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 7 insert into t3 values (127), (126), (125), (124), (-128), (-127), (1), (-1), (0); select * from t3; @@ -119,11 +119,11 @@ t1 CREATE TABLE `t1` ( `a` smallint(5) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) insert into t1 values (65535), (65534), (65533), (65532), (1), (2), (256); select * from t1; a @@ -155,7 +155,7 @@ t2 CREATE TABLE `t2` ( `a` smallint(5) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 8 insert into t2 values (65535), (65534), (65533), (65532); select * from t2; @@ -187,7 +187,7 @@ t3 CREATE TABLE `t3` ( `a` smallint(6) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 7 insert into t3 values (32767), (32766), (32765), (32764), (-32768), (-32767), (1), (-1), (0); select * from t3; @@ -228,11 +228,11 @@ t1 CREATE TABLE `t1` ( `a` int(10) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) insert into t1 values (4294967295), (4294967294), (4294967293), (4294967292), (1), (2), (65535); select * from t1; a @@ -264,7 +264,7 @@ t2 CREATE TABLE `t2` ( `a` int(10) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 8 insert into t2 values (4294967295), (4294967294), (4294967293), (4294967292); select * from t2; @@ -296,7 +296,7 @@ t3 CREATE TABLE `t3` ( `a` int(11) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 7 insert into t3 values (2147483647), (2147483646), (2147483645), (2147483644), (-2147483648), (-2147483647), (1), (-1), (0); select * from t3; @@ -337,11 +337,11 @@ t1 CREATE TABLE `t1` ( `a` mediumint(8) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) insert into t1 values (16777215), (16777214), (16777213), (16777212), (1), (2), (65535); select * from t1; a @@ -373,7 +373,7 @@ t2 CREATE TABLE `t2` ( `a` mediumint(8) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 8 insert into t2 values (16777215), (16777214), (16777213), (16777212); select * from t2; @@ -405,7 +405,7 @@ t3 CREATE TABLE `t3` ( `a` mediumint(9) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 7 insert into t3 values (8388607), (8388606), (8388605), (8388604), (-8388608), (-8388607), (1), (-1), (0); select * from t3; @@ -446,11 +446,11 @@ t1 CREATE TABLE `t1` ( `a` bigint(20) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) insert into t1 values (18446744073709551615), (0xFFFFFFFFFFFFFFFE), (18446744073709551613), (18446744073709551612), (1), (2), (65535); select * from t1; a @@ -494,7 +494,7 @@ t2 CREATE TABLE `t2` ( `a` bigint(20) unsigned NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 8 insert into t2 values (18446744073709551615), (0xFFFFFFFFFFFFFFFE), (18446744073709551613), (18446744073709551612); select * from t2; @@ -526,7 +526,7 @@ t3 CREATE TABLE `t3` ( `a` bigint(20) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) + PARTITION BY KEY (`a`) PARTITIONS 7 insert into t3 values (9223372036854775807), (9223372036854775806), (9223372036854775805), (9223372036854775804), (-9223372036854775808), (-9223372036854775807), (1), (-1), (0); select * from t3; diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_mgm_lc0_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_mgm_lc0_tokudb.result index 7ee2018a661..4c30d47f526 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_mgm_lc0_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_mgm_lc0_tokudb.result @@ -56,14 +56,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = TokuDB, - PARTITION partB ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB, - PARTITION PartD ENGINE = TokuDB, - PARTITION partE ENGINE = TokuDB, - PARTITION Partf ENGINE = TokuDB, - PARTITION PartG ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = TokuDB, + PARTITION `partB` ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB, + PARTITION `PartD` ENGINE = TokuDB, + PARTITION `partE` ENGINE = TokuDB, + PARTITION `Partf` ENGINE = TokuDB, + PARTITION `PartG` ENGINE = TokuDB) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -84,10 +84,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = TokuDB, - PARTITION partB ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = TokuDB, + PARTITION `partB` ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB) # Test of EXCHANGE PARTITION WITH TABLE SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA ='MySQL_Test_DB' AND TABLE_NAME = 'TableA'; PARTITION_NAME TABLE_ROWS @@ -112,10 +112,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = TokuDB, - PARTITION partB ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = TokuDB, + PARTITION `partB` ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB) SELECT * FROM TableB; a 10 @@ -156,10 +156,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = TokuDB, - PARTITION partB ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = TokuDB, + PARTITION `partB` ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB) # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO @@ -192,10 +192,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = TokuDB, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = TokuDB, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -271,11 +271,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = TokuDB, - PARTITION partB ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB, - PARTITION PartD ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = TokuDB, + PARTITION `partB` ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB, + PARTITION `PartD` ENGINE = TokuDB) DROP TABLE tablea; # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; @@ -364,14 +364,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = TokuDB, - PARTITION partB ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB, - PARTITION PartD ENGINE = TokuDB, - PARTITION partE ENGINE = TokuDB, - PARTITION Partf ENGINE = TokuDB, - PARTITION PartG ENGINE = TokuDB) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = TokuDB, + PARTITION `partB` ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB, + PARTITION `PartD` ENGINE = TokuDB, + PARTITION `partE` ENGINE = TokuDB, + PARTITION `Partf` ENGINE = TokuDB, + PARTITION `PartG` ENGINE = TokuDB) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -392,10 +392,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = TokuDB, - PARTITION partB ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = TokuDB, + PARTITION `partB` ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB) # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO @@ -428,10 +428,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = TokuDB, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB) + PARTITION BY HASH (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = TokuDB, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -507,11 +507,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = TokuDB, - PARTITION partB ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB, - PARTITION PartD ENGINE = TokuDB) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = TokuDB, + PARTITION `partB` ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB, + PARTITION `PartD` ENGINE = TokuDB) DROP TABLE tablea; # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; @@ -589,14 +589,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = TokuDB, - PARTITION partB VALUES LESS THAN (7) ENGINE = TokuDB, - PARTITION Partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION PartD VALUES LESS THAN (13) ENGINE = TokuDB, - PARTITION partE VALUES LESS THAN (16) ENGINE = TokuDB, - PARTITION Partf VALUES LESS THAN (19) ENGINE = TokuDB, - PARTITION PartG VALUES LESS THAN (22) ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = TokuDB, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = TokuDB, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = TokuDB, + PARTITION `partE` VALUES LESS THAN (16) ENGINE = TokuDB, + PARTITION `Partf` VALUES LESS THAN (19) ENGINE = TokuDB, + PARTITION `PartG` VALUES LESS THAN (22) ENGINE = TokuDB) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -620,12 +620,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = TokuDB, - PARTITION partB VALUES LESS THAN (7) ENGINE = TokuDB, - PARTITION Partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION PartD VALUES LESS THAN (13) ENGINE = TokuDB, - PARTITION PartE VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = TokuDB, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = TokuDB, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = TokuDB, + PARTITION `PartE` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) # Test of REORGANIZE PARTITIONS # Error since it must reorganize a consecutive range ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO @@ -658,11 +658,11 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = TokuDB, - PARTITION partD VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = TokuDB, - PARTITION partB VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = TokuDB, - PARTITION partC VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = TokuDB, + PARTITION `partD` VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = TokuDB, + PARTITION `partB` VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = TokuDB, + PARTITION `partC` VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = TokuDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -738,11 +738,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = TokuDB, - PARTITION partB VALUES LESS THAN (7) ENGINE = TokuDB, - PARTITION Partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION PartD VALUES LESS THAN (13) ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = TokuDB, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = TokuDB, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = TokuDB) DROP TABLE tablea; # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; @@ -820,14 +820,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = TokuDB, - PARTITION partB VALUES IN (2,10,11) ENGINE = TokuDB, - PARTITION Partc VALUES IN (3,4,7) ENGINE = TokuDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = TokuDB, - PARTITION partE VALUES IN (16) ENGINE = TokuDB, - PARTITION Partf VALUES IN (19) ENGINE = TokuDB, - PARTITION PartG VALUES IN (22) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = TokuDB, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = TokuDB, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = TokuDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = TokuDB, + PARTITION `partE` VALUES IN (16) ENGINE = TokuDB, + PARTITION `Partf` VALUES IN (19) ENGINE = TokuDB, + PARTITION `PartG` VALUES IN (22) ENGINE = TokuDB) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -851,12 +851,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = TokuDB, - PARTITION partB VALUES IN (2,10,11) ENGINE = TokuDB, - PARTITION Partc VALUES IN (3,4,7) ENGINE = TokuDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = TokuDB, - PARTITION PartE VALUES IN (13) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = TokuDB, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = TokuDB, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = TokuDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = TokuDB, + PARTITION `PartE` VALUES IN (13) ENGINE = TokuDB) # Test of REORGANIZE PARTITIONS ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO (PARTITION Partc VALUES IN (1,7) @@ -889,12 +889,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION Partc VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = TokuDB, - PARTITION parta VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = TokuDB, - PARTITION partB VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = TokuDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = TokuDB, - PARTITION PartE VALUES IN (13) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `Partc` VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = TokuDB, + PARTITION `parta` VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = TokuDB, + PARTITION `partB` VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = TokuDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = TokuDB, + PARTITION `PartE` VALUES IN (13) ENGINE = TokuDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -961,11 +961,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = TokuDB, - PARTITION partB VALUES IN (2,10,11) ENGINE = TokuDB, - PARTITION Partc VALUES IN (3,4,7) ENGINE = TokuDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = TokuDB, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = TokuDB, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = TokuDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = TokuDB) DROP TABLE tablea; # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; @@ -1004,10 +1004,10 @@ t1 CREATE TABLE `t1` ( `b` varchar(255) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB AUTO_INCREMENT=2002 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION LT1000 VALUES LESS THAN (1000) ENGINE = TokuDB, - PARTITION LT2000 VALUES LESS THAN (2000) ENGINE = TokuDB, - PARTITION MAX VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `LT1000` VALUES LESS THAN (1000) ENGINE = TokuDB, + PARTITION `LT2000` VALUES LESS THAN (2000) ENGINE = TokuDB, + PARTITION `MAX` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1 ORDER BY a; a b 1 First diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_mgm_lc10_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_mgm_lc10_tokudb.result index 28aa690fea4..6ccd9afefab 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_mgm_lc10_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_mgm_lc10_tokudb.result @@ -56,14 +56,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = TokuDB, - PARTITION partB ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB, - PARTITION PartD ENGINE = TokuDB, - PARTITION partE ENGINE = TokuDB, - PARTITION Partf ENGINE = TokuDB, - PARTITION PartG ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = TokuDB, + PARTITION `partB` ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB, + PARTITION `PartD` ENGINE = TokuDB, + PARTITION `partE` ENGINE = TokuDB, + PARTITION `Partf` ENGINE = TokuDB, + PARTITION `PartG` ENGINE = TokuDB) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -84,10 +84,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = TokuDB, - PARTITION partB ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = TokuDB, + PARTITION `partB` ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB) # Test of EXCHANGE PARTITION WITH TABLE # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY @@ -121,10 +121,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = TokuDB, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = TokuDB, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -200,11 +200,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = TokuDB, - PARTITION partB ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB, - PARTITION PartD ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = TokuDB, + PARTITION `partB` ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB, + PARTITION `PartD` ENGINE = TokuDB) DROP TABLE tablea; # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; @@ -293,14 +293,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = TokuDB, - PARTITION partB ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB, - PARTITION PartD ENGINE = TokuDB, - PARTITION partE ENGINE = TokuDB, - PARTITION Partf ENGINE = TokuDB, - PARTITION PartG ENGINE = TokuDB) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = TokuDB, + PARTITION `partB` ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB, + PARTITION `PartD` ENGINE = TokuDB, + PARTITION `partE` ENGINE = TokuDB, + PARTITION `Partf` ENGINE = TokuDB, + PARTITION `PartG` ENGINE = TokuDB) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -321,10 +321,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = TokuDB, - PARTITION partB ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = TokuDB, + PARTITION `partB` ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB) # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO @@ -357,10 +357,10 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = TokuDB, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB) + PARTITION BY HASH (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = TokuDB, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -436,11 +436,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = TokuDB, - PARTITION partB ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB, - PARTITION PartD ENGINE = TokuDB) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = TokuDB, + PARTITION `partB` ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB, + PARTITION `PartD` ENGINE = TokuDB) DROP TABLE tablea; # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; @@ -518,14 +518,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = TokuDB, - PARTITION partB VALUES LESS THAN (7) ENGINE = TokuDB, - PARTITION Partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION PartD VALUES LESS THAN (13) ENGINE = TokuDB, - PARTITION partE VALUES LESS THAN (16) ENGINE = TokuDB, - PARTITION Partf VALUES LESS THAN (19) ENGINE = TokuDB, - PARTITION PartG VALUES LESS THAN (22) ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = TokuDB, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = TokuDB, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = TokuDB, + PARTITION `partE` VALUES LESS THAN (16) ENGINE = TokuDB, + PARTITION `Partf` VALUES LESS THAN (19) ENGINE = TokuDB, + PARTITION `PartG` VALUES LESS THAN (22) ENGINE = TokuDB) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -549,12 +549,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = TokuDB, - PARTITION partB VALUES LESS THAN (7) ENGINE = TokuDB, - PARTITION Partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION PartD VALUES LESS THAN (13) ENGINE = TokuDB, - PARTITION PartE VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = TokuDB, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = TokuDB, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = TokuDB, + PARTITION `PartE` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) # Test of REORGANIZE PARTITIONS # Error since it must reorganize a consecutive range ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO @@ -587,11 +587,11 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = TokuDB, - PARTITION partD VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = TokuDB, - PARTITION partB VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = TokuDB, - PARTITION partC VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = TokuDB, + PARTITION `partD` VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = TokuDB, + PARTITION `partB` VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = TokuDB, + PARTITION `partC` VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = TokuDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -667,11 +667,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = TokuDB, - PARTITION partB VALUES LESS THAN (7) ENGINE = TokuDB, - PARTITION Partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION PartD VALUES LESS THAN (13) ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = TokuDB, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = TokuDB, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = TokuDB) DROP TABLE tablea; # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; @@ -749,14 +749,14 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = TokuDB, - PARTITION partB VALUES IN (2,10,11) ENGINE = TokuDB, - PARTITION Partc VALUES IN (3,4,7) ENGINE = TokuDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = TokuDB, - PARTITION partE VALUES IN (16) ENGINE = TokuDB, - PARTITION Partf VALUES IN (19) ENGINE = TokuDB, - PARTITION PartG VALUES IN (22) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = TokuDB, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = TokuDB, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = TokuDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = TokuDB, + PARTITION `partE` VALUES IN (16) ENGINE = TokuDB, + PARTITION `Partf` VALUES IN (19) ENGINE = TokuDB, + PARTITION `PartG` VALUES IN (22) ENGINE = TokuDB) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -780,12 +780,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = TokuDB, - PARTITION partB VALUES IN (2,10,11) ENGINE = TokuDB, - PARTITION Partc VALUES IN (3,4,7) ENGINE = TokuDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = TokuDB, - PARTITION PartE VALUES IN (13) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = TokuDB, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = TokuDB, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = TokuDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = TokuDB, + PARTITION `PartE` VALUES IN (13) ENGINE = TokuDB) # Test of REORGANIZE PARTITIONS ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO (PARTITION Partc VALUES IN (1,7) @@ -818,12 +818,12 @@ Table Create Table TableA CREATE TABLE `TableA` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION Partc VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = TokuDB, - PARTITION parta VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = TokuDB, - PARTITION partB VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = TokuDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = TokuDB, - PARTITION PartE VALUES IN (13) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `Partc` VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = TokuDB, + PARTITION `parta` VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = TokuDB, + PARTITION `partB` VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = TokuDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = TokuDB, + PARTITION `PartE` VALUES IN (13) ENGINE = TokuDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -890,11 +890,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = TokuDB, - PARTITION partB VALUES IN (2,10,11) ENGINE = TokuDB, - PARTITION Partc VALUES IN (3,4,7) ENGINE = TokuDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = TokuDB, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = TokuDB, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = TokuDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = TokuDB) DROP TABLE tablea; # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; @@ -933,10 +933,10 @@ t1 CREATE TABLE `t1` ( `b` varchar(255) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB AUTO_INCREMENT=2002 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION LT1000 VALUES LESS THAN (1000) ENGINE = TokuDB, - PARTITION LT2000 VALUES LESS THAN (2000) ENGINE = TokuDB, - PARTITION MAX VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `LT1000` VALUES LESS THAN (1000) ENGINE = TokuDB, + PARTITION `LT2000` VALUES LESS THAN (2000) ENGINE = TokuDB, + PARTITION `MAX` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1 ORDER BY a; a b 1 First diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_mgm_lc1_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_mgm_lc1_tokudb.result index 63ecc04b812..fce0d496032 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_mgm_lc1_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_mgm_lc1_tokudb.result @@ -56,14 +56,14 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = TokuDB, - PARTITION partB ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB, - PARTITION PartD ENGINE = TokuDB, - PARTITION partE ENGINE = TokuDB, - PARTITION Partf ENGINE = TokuDB, - PARTITION PartG ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = TokuDB, + PARTITION `partB` ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB, + PARTITION `PartD` ENGINE = TokuDB, + PARTITION `partE` ENGINE = TokuDB, + PARTITION `Partf` ENGINE = TokuDB, + PARTITION `PartG` ENGINE = TokuDB) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -84,10 +84,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = TokuDB, - PARTITION partB ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = TokuDB, + PARTITION `partB` ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB) # Test of EXCHANGE PARTITION WITH TABLE SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA ='MySQL_Test_DB' AND TABLE_NAME = 'TableA'; PARTITION_NAME TABLE_ROWS @@ -112,10 +112,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = TokuDB, - PARTITION partB ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = TokuDB, + PARTITION `partB` ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB) SELECT * FROM TableB; a 10 @@ -156,10 +156,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION parta ENGINE = TokuDB, - PARTITION partB ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `parta` ENGINE = TokuDB, + PARTITION `partB` ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB) # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO @@ -192,10 +192,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = TokuDB, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = TokuDB, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -264,10 +264,10 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = TokuDB, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB) + PARTITION BY KEY (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = TokuDB, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -355,14 +355,14 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = TokuDB, - PARTITION partB ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB, - PARTITION PartD ENGINE = TokuDB, - PARTITION partE ENGINE = TokuDB, - PARTITION Partf ENGINE = TokuDB, - PARTITION PartG ENGINE = TokuDB) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = TokuDB, + PARTITION `partB` ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB, + PARTITION `PartD` ENGINE = TokuDB, + PARTITION `partE` ENGINE = TokuDB, + PARTITION `Partf` ENGINE = TokuDB, + PARTITION `PartG` ENGINE = TokuDB) ALTER TABLE TableA COALESCE PARTITION 4; SELECT * FROM TableA; a @@ -383,10 +383,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION parta ENGINE = TokuDB, - PARTITION partB ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB) + PARTITION BY HASH (`a`) +(PARTITION `parta` ENGINE = TokuDB, + PARTITION `partB` ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB) # Test of REORGANIZE PARTITIONS # Should not work on HASH/KEY ALTER TABLE TableA REORGANIZE PARTITION parta,partB,Partc INTO @@ -419,10 +419,10 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = TokuDB, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB) + PARTITION BY HASH (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = TokuDB, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -491,10 +491,10 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (a) -(PARTITION partB COMMENT = 'Previusly named parta' ENGINE = TokuDB, - PARTITION parta COMMENT = 'Previusly named partB' ENGINE = TokuDB, - PARTITION Partc ENGINE = TokuDB) + PARTITION BY HASH (`a`) +(PARTITION `partB` COMMENT = 'Previusly named parta' ENGINE = TokuDB, + PARTITION `parta` COMMENT = 'Previusly named partB' ENGINE = TokuDB, + PARTITION `Partc` ENGINE = TokuDB) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -571,14 +571,14 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = TokuDB, - PARTITION partB VALUES LESS THAN (7) ENGINE = TokuDB, - PARTITION Partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION PartD VALUES LESS THAN (13) ENGINE = TokuDB, - PARTITION partE VALUES LESS THAN (16) ENGINE = TokuDB, - PARTITION Partf VALUES LESS THAN (19) ENGINE = TokuDB, - PARTITION PartG VALUES LESS THAN (22) ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = TokuDB, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = TokuDB, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = TokuDB, + PARTITION `partE` VALUES LESS THAN (16) ENGINE = TokuDB, + PARTITION `Partf` VALUES LESS THAN (19) ENGINE = TokuDB, + PARTITION `PartG` VALUES LESS THAN (22) ENGINE = TokuDB) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -602,12 +602,12 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = TokuDB, - PARTITION partB VALUES LESS THAN (7) ENGINE = TokuDB, - PARTITION Partc VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION PartD VALUES LESS THAN (13) ENGINE = TokuDB, - PARTITION PartE VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = TokuDB, + PARTITION `partB` VALUES LESS THAN (7) ENGINE = TokuDB, + PARTITION `Partc` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `PartD` VALUES LESS THAN (13) ENGINE = TokuDB, + PARTITION `PartE` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) # Test of REORGANIZE PARTITIONS # Error since it must reorganize a consecutive range ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO @@ -640,11 +640,11 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = TokuDB, - PARTITION partD VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = TokuDB, - PARTITION partB VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = TokuDB, - PARTITION partC VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = TokuDB, + PARTITION `partD` VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = TokuDB, + PARTITION `partB` VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = TokuDB, + PARTITION `partC` VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = TokuDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -713,11 +713,11 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION parta VALUES LESS THAN (4) ENGINE = TokuDB, - PARTITION partD VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = TokuDB, - PARTITION partB VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = TokuDB, - PARTITION partC VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `parta` VALUES LESS THAN (4) ENGINE = TokuDB, + PARTITION `partD` VALUES LESS THAN (8) COMMENT = 'Previously partB and partly Partc' ENGINE = TokuDB, + PARTITION `partB` VALUES LESS THAN (11) COMMENT = 'Previously partly Partc and partly PartD' ENGINE = TokuDB, + PARTITION `partC` VALUES LESS THAN MAXVALUE COMMENT = 'Previously partly PartD' ENGINE = TokuDB) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -794,14 +794,14 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = TokuDB, - PARTITION partB VALUES IN (2,10,11) ENGINE = TokuDB, - PARTITION Partc VALUES IN (3,4,7) ENGINE = TokuDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = TokuDB, - PARTITION partE VALUES IN (16) ENGINE = TokuDB, - PARTITION Partf VALUES IN (19) ENGINE = TokuDB, - PARTITION PartG VALUES IN (22) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = TokuDB, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = TokuDB, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = TokuDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = TokuDB, + PARTITION `partE` VALUES IN (16) ENGINE = TokuDB, + PARTITION `Partf` VALUES IN (19) ENGINE = TokuDB, + PARTITION `PartG` VALUES IN (22) ENGINE = TokuDB) ALTER TABLE TableA DROP PARTITION partE, PartG; ALTER TABLE TableA DROP PARTITION Partf; ALTER TABLE TableA ADD PARTITION @@ -825,12 +825,12 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION parta VALUES IN (1,8,9) ENGINE = TokuDB, - PARTITION partB VALUES IN (2,10,11) ENGINE = TokuDB, - PARTITION Partc VALUES IN (3,4,7) ENGINE = TokuDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = TokuDB, - PARTITION PartE VALUES IN (13) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `parta` VALUES IN (1,8,9) ENGINE = TokuDB, + PARTITION `partB` VALUES IN (2,10,11) ENGINE = TokuDB, + PARTITION `Partc` VALUES IN (3,4,7) ENGINE = TokuDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = TokuDB, + PARTITION `PartE` VALUES IN (13) ENGINE = TokuDB) # Test of REORGANIZE PARTITIONS ALTER TABLE TableA REORGANIZE PARTITION parta,Partc INTO (PARTITION Partc VALUES IN (1,7) @@ -863,12 +863,12 @@ Table Create Table TableA CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION Partc VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = TokuDB, - PARTITION parta VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = TokuDB, - PARTITION partB VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = TokuDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = TokuDB, - PARTITION PartE VALUES IN (13) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `Partc` VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = TokuDB, + PARTITION `parta` VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = TokuDB, + PARTITION `partB` VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = TokuDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = TokuDB, + PARTITION `PartE` VALUES IN (13) ENGINE = TokuDB) # Test of RENAME TABLE RENAME TABLE TableA to TableB; SELECT * FROM TableB; @@ -928,12 +928,12 @@ Table Create Table tablea CREATE TABLE `tablea` ( `a` int(11) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (a) -(PARTITION Partc VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = TokuDB, - PARTITION parta VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = TokuDB, - PARTITION partB VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = TokuDB, - PARTITION PartD VALUES IN (5,6,12) ENGINE = TokuDB, - PARTITION PartE VALUES IN (13) ENGINE = TokuDB) + PARTITION BY LIST (`a`) +(PARTITION `Partc` VALUES IN (1,7) COMMENT = 'Mix 1 of old parta and Partc' ENGINE = TokuDB, + PARTITION `parta` VALUES IN (3,9) COMMENT = 'Mix 2 of old parta and Partc' ENGINE = TokuDB, + PARTITION `partB` VALUES IN (4,8) COMMENT = 'Mix 3 of old parta and Partc' ENGINE = TokuDB, + PARTITION `PartD` VALUES IN (5,6,12) ENGINE = TokuDB, + PARTITION `PartE` VALUES IN (13) ENGINE = TokuDB) # Test of REMOVE PARTITIONING ALTER TABLE TableA REMOVE PARTITIONING; SELECT * FROM TableA; @@ -971,10 +971,10 @@ t1 CREATE TABLE `t1` ( `b` varchar(255) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE=TokuDB AUTO_INCREMENT=2002 DEFAULT CHARSET=latin1 - PARTITION BY RANGE (a) -(PARTITION LT1000 VALUES LESS THAN (1000) ENGINE = TokuDB, - PARTITION LT2000 VALUES LESS THAN (2000) ENGINE = TokuDB, - PARTITION MAX VALUES LESS THAN MAXVALUE ENGINE = TokuDB) + PARTITION BY RANGE (`a`) +(PARTITION `LT1000` VALUES LESS THAN (1000) ENGINE = TokuDB, + PARTITION `LT2000` VALUES LESS THAN (2000) ENGINE = TokuDB, + PARTITION `MAX` VALUES LESS THAN MAXVALUE ENGINE = TokuDB) SELECT * FROM t1 ORDER BY a; a b 1 First diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_special_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_special_tokudb.result index 79274aa903b..a2df5bc5831 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_special_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_special_tokudb.result @@ -13,11 +13,11 @@ t1 CREATE TABLE `t1` ( `d` enum('m','w') NOT NULL, PRIMARY KEY (`a`,`b`,`c`,`d`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a,b,c,d) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) + PARTITION BY KEY (`a`,`b`,`c`,`d`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) insert into t1 values ('1975-01-01', 'abcde', 'abcde','m'), ('1983-12-31', 'cdef', 'srtbvsr', 'w'), @@ -55,11 +55,11 @@ t1 CREATE TABLE `t1` ( `i` char(255) DEFAULT NULL, PRIMARY KEY (`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a,b,c,d,e,f,g,h) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) + PARTITION BY KEY (`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) insert into t1 values ('1975-01-01', 'abcde', 'abcde','m', 1234, 123.45, 32412341234, 113, 'tbhth nrzh ztfghgfh fzh ftzhj fztjh'), ('1983-12-31', 'cdef', 'srtbvsr', 'w', 45634, 13452.56, 3452346456, 127, 'liuugbzvdmrlti b itiortudirtfgtibm dfi'), @@ -105,11 +105,11 @@ t1 CREATE TABLE `t1` ( `i` char(255) DEFAULT NULL, PRIMARY KEY (`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`,`a1`,`b1`,`c1`,`d1`,`e1`,`f1`,`g1`,`h1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a,b,c,d,e,f,g,h,a1,b1,c1,d1,e1,f1,g1,h1) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) + PARTITION BY KEY (`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`,`a1`,`b1`,`c1`,`d1`,`e1`,`f1`,`g1`,`h1`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) insert into t1 values ('1975-01-01', 'abcde', 'abcde','m', 1234, 123.45, 32412341234, 113,'1975-01-01', 'abcde', 'abcde','m', 1234, 123.45, 32412341234, 113, 'tbhth nrzh ztfghgfh fzh ftzhj fztjh'), ('1983-12-31', 'cdef', 'srtbvsr', 'w', 45634, 13452.56, 3452346456, 127,'1983-12-31', 'cdef', 'srtbvsr', 'w', 45634, 13452.56, 3452346456, 127, 'liuugbzvdmrlti b itiortudirtfgtibm dfi'), @@ -185,11 +185,11 @@ t1 CREATE TABLE `t1` ( `i` char(255) DEFAULT NULL, PRIMARY KEY (`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`,`a1`,`b1`,`c1`,`d1`,`e1`,`f1`,`g1`,`h1`) ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY KEY (a,b,c,d,e,f,g,h) -(PARTITION pa1 MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, - PARTITION pa2 MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, - PARTITION pa3 MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, - PARTITION pa4 MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) + PARTITION BY KEY (`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`) +(PARTITION `pa1` MAX_ROWS = 20 MIN_ROWS = 2 ENGINE = TokuDB, + PARTITION `pa2` MAX_ROWS = 30 MIN_ROWS = 3 ENGINE = TokuDB, + PARTITION `pa3` MAX_ROWS = 30 MIN_ROWS = 4 ENGINE = TokuDB, + PARTITION `pa4` MAX_ROWS = 40 MIN_ROWS = 2 ENGINE = TokuDB) insert into t1 values ('1975-01-01', 'abcde', 'abcde','m', 1234, 123.45, 32412341234, 113,'1975-01-01', 'abcde', 'abcde','m', 1234, 123.45, 32412341234, 113,'1975-01-01', 'abcde', 'abcde','m', 1234, 123.45, 32412341234, 113, '1975-01-01', 'abcde', 'abcde','m', 1234, 123.45, 32412341234, 113, 'tbhth nrzh ztfghgfh fzh ftzhj fztjh'), ('1983-12-31', 'cdef', 'srtbvsr', 'w', 45634, 13452.56, 3452346456, 127,'1983-12-31', 'cdef', 'srtbvsr', 'w', 45634, 13452.56, 3452346456, 127, '1983-12-31', 'cdef', 'srtbvsr', 'w', 45634, 13452.56, 3452346456, 127, '1983-12-31', 'cdef', 'srtbvsr', 'w', 45634, 13452.56, 3452346456, 127, 'liuugbzvdmrlti b itiortudirtfgtibm dfi'), diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/partition_syntax_tokudb.result b/storage/tokudb/mysql-test/tokudb_parts/r/partition_syntax_tokudb.result index 1b5d2870cda..c84b4601332 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/r/partition_syntax_tokudb.result +++ b/storage/tokudb/mysql-test/tokudb_parts/r/partition_syntax_tokudb.result @@ -658,9 +658,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,2)) -(PARTITION part1 VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part3 VALUES IN (1) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 2) +(PARTITION `part1` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (1) ENGINE = TokuDB) DROP TABLE t1; # 3.5.3 Reveal that IN (...NULL) is not mapped to IN(0) @@ -685,10 +685,10 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY LIST (MOD(f_int1,2)) -(PARTITION part1 VALUES IN (NULL) ENGINE = TokuDB, - PARTITION part2 VALUES IN (0) ENGINE = TokuDB, - PARTITION part3 VALUES IN (1) ENGINE = TokuDB) + PARTITION BY LIST (`f_int1` % 2) +(PARTITION `part1` VALUES IN (NULL) ENGINE = TokuDB, + PARTITION `part2` VALUES IN (0) ENGINE = TokuDB, + PARTITION `part3` VALUES IN (1) ENGINE = TokuDB) DROP TABLE t1; @@ -719,7 +719,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) DROP TABLE t1; # 4.1.2 no partition number, named partitions @@ -741,9 +741,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part1 ENGINE = TokuDB, - PARTITION part2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part1` ENGINE = TokuDB, + PARTITION `part2` ENGINE = TokuDB) DROP TABLE t1; # 4.1.3 variations on no partition/subpartition number, named partitions, @@ -826,17 +826,17 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (10) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (20) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB), - PARTITION part3 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart31 ENGINE = TokuDB, - SUBPARTITION subpart32 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (10) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (20) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB), + PARTITION `part3` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart31` ENGINE = TokuDB, + SUBPARTITION `subpart32` ENGINE = TokuDB)) DROP TABLE t1; #------------------------------------------------------------------------ @@ -862,7 +862,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 2 DROP TABLE t1; @@ -887,11 +887,11 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 2 -(PARTITION part1 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part2 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part1` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part2` VALUES LESS THAN (2147483646) ENGINE = TokuDB) DROP TABLE t1; CREATE TABLE t1 ( @@ -912,7 +912,7 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) + PARTITION BY HASH (`f_int1`) PARTITIONS 1 DROP TABLE t1; @@ -937,11 +937,11 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) SUBPARTITIONS 1 -(PARTITION part1 VALUES LESS THAN (10) ENGINE = TokuDB, - PARTITION part2 VALUES LESS THAN (2147483646) ENGINE = TokuDB) +(PARTITION `part1` VALUES LESS THAN (10) ENGINE = TokuDB, + PARTITION `part2` VALUES LESS THAN (2147483646) ENGINE = TokuDB) DROP TABLE t1; CREATE TABLE t1 ( @@ -1681,9 +1681,9 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY HASH (f_int1) -(PARTITION part1 ENGINE = TokuDB, - PARTITION part2 ENGINE = TokuDB) + PARTITION BY HASH (`f_int1`) +(PARTITION `part1` ENGINE = TokuDB, + PARTITION `part2` ENGINE = TokuDB) DROP TABLE t1; CREATE TABLE t1 ( @@ -1710,14 +1710,14 @@ t1 CREATE TABLE `t1` ( `f_char2` char(20) DEFAULT NULL, `f_charbig` varchar(1000) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 - PARTITION BY RANGE (f_int1) -SUBPARTITION BY HASH (f_int1) -(PARTITION part1 VALUES LESS THAN (1000) - (SUBPARTITION subpart11 ENGINE = TokuDB, - SUBPARTITION subpart12 ENGINE = TokuDB), - PARTITION part2 VALUES LESS THAN (2147483646) - (SUBPARTITION subpart21 ENGINE = TokuDB, - SUBPARTITION subpart22 ENGINE = TokuDB)) + PARTITION BY RANGE (`f_int1`) +SUBPARTITION BY HASH (`f_int1`) +(PARTITION `part1` VALUES LESS THAN (1000) + (SUBPARTITION `subpart11` ENGINE = TokuDB, + SUBPARTITION `subpart12` ENGINE = TokuDB), + PARTITION `part2` VALUES LESS THAN (2147483646) + (SUBPARTITION `subpart21` ENGINE = TokuDB, + SUBPARTITION `subpart22` ENGINE = TokuDB)) DROP TABLE t1; # 4.3.2 (positive) number of partition/subpartition , diff --git a/storage/tokudb/tokudb_dir_cmd.cc b/storage/tokudb/tokudb_dir_cmd.cc new file mode 100644 index 00000000000..f9995302d49 --- /dev/null +++ b/storage/tokudb/tokudb_dir_cmd.cc @@ -0,0 +1,331 @@ +/* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- */ +// vim: ft=cpp:expandtab:ts=8:sw=4:softtabstop=4: +/* -*- mode: C; c-basic-offset: 4 -*- */ +#ident "$Id$" +/*====== +This file is part of TokuDB + + +Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. + + TokuDBis is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License, version 2, + as published by the Free Software Foundation. + + TokuDB is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with TokuDB. If not, see . + +======= */ + +#ident "Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved." + +#include "hatoku_hton.h" +#include "tokudb_dir_cmd.h" +#include "my_dbug.h" +#include "sql_base.h" + +#include +#include + +namespace tokudb { + +const char tokens_delimiter = ' '; +const char tokens_escape_delimiter_char = '\\'; + +static int MDL_and_TDC(THD *thd, + const char *db, + const char *table, + const dir_cmd_callbacks &cb) { + int error; + LEX_STRING db_arg; + LEX_STRING table_arg; + + db_arg.str = const_cast(db); + db_arg.length = strlen(db);; + table_arg.str = const_cast(table); + table_arg.length = strlen(table); + Table_ident table_ident(thd, db_arg, table_arg, true);; + thd->lex->select_lex.add_table_to_list( + thd, &table_ident, NULL, 1, TL_UNLOCK, MDL_EXCLUSIVE, 0, 0, 0); + /* The lock will be released at the end of mysq_execute_command() */ + error = lock_table_names(thd, + thd->lex->select_lex.table_list.first, + NULL, + thd->variables.lock_wait_timeout, + 0); + if (error) { + if (cb.set_error) + cb.set_error(thd, + error, + "Can't lock table '%s.%s'", + db, + table); + return error; + } + tdc_remove_table(thd, TDC_RT_REMOVE_ALL, db, table, false); + return error; +} + +static bool parse_db_and_table(const char *dname, + std::string /*out*/ &db_name, + std::string /*out*/ &table_name) { + const char *begin; + const char *end; + const char *db_name_begin; + const char *db_name_end; + + begin = strchr(dname, '/'); + if (!begin) + return false; + ++begin; + end = strchr(begin, '/'); + if (!end) + return false; + + db_name_begin = begin; + db_name_end = end; + + begin = end + 1; + + end = strchr(begin, '-'); + if (!end) + return false; + + if (strncmp(end, "-main", strlen("-main")) && + strncmp(end, "-status", strlen("-status")) && + strncmp(end, "-key", strlen("-key"))) + return false; + + db_name.assign(db_name_begin, db_name_end); + table_name.assign(begin, end); + + return true; +} + +static int attach(THD *thd, + const std::string &dname, + const std::string &iname, + const dir_cmd_callbacks &cb) { + int error; + DB_TXN* txn = NULL; + DB_TXN *parent_txn = NULL; + tokudb_trx_data *trx = NULL; + + std::string db_name; + std::string table_name; + + if (parse_db_and_table(dname.c_str(), db_name, table_name)) { + error = MDL_and_TDC(thd, db_name.c_str(), table_name.c_str(), cb); + if (error) + goto cleanup; + } + + trx = (tokudb_trx_data *) thd_get_ha_data(thd, tokudb_hton); + if (trx && trx->sub_sp_level) + parent_txn = trx->sub_sp_level; + error = txn_begin(db_env, parent_txn, &txn, 0, thd); + if (error) + goto cleanup; + + error = db_env->dirtool_attach(db_env, + txn, + dname.c_str(), + iname.c_str()); +cleanup: + if (txn) { + if (error) { + abort_txn(txn); + } + else { + commit_txn(txn, 0); + } + } + return error; +} + +static int detach(THD *thd, + const std::string &dname, + const dir_cmd_callbacks &cb) { + int error; + DB_TXN* txn = NULL; + DB_TXN *parent_txn = NULL; + tokudb_trx_data *trx = NULL; + + std::string db_name; + std::string table_name; + + if (parse_db_and_table(dname.c_str(), db_name, table_name)) { + error = MDL_and_TDC(thd, db_name.c_str(), table_name.c_str(), cb); + if (error) + goto cleanup; + } + + trx = (tokudb_trx_data *) thd_get_ha_data(thd, tokudb_hton); + if (trx && trx->sub_sp_level) + parent_txn = trx->sub_sp_level; + error = txn_begin(db_env, parent_txn, &txn, 0, thd); + if (error) + goto cleanup; + + error = db_env->dirtool_detach(db_env, + txn, + dname.c_str()); +cleanup: + if (txn) { + if (error) { + abort_txn(txn); + } + else { + commit_txn(txn, 0); + } + } + return error; +} + +static int move(THD *thd, + const std::string &old_dname, + const std::string &new_dname, + const dir_cmd_callbacks &cb) { + int error; + DB_TXN* txn = NULL; + DB_TXN *parent_txn = NULL; + tokudb_trx_data *trx = NULL; + + std::string db_name; + std::string table_name; + + if (parse_db_and_table(old_dname.c_str(), db_name, table_name)) { + error = MDL_and_TDC(thd, db_name.c_str(), table_name.c_str(), cb); + if (error) + goto cleanup; + } + + trx = (tokudb_trx_data *) thd_get_ha_data(thd, tokudb_hton); + if (trx && trx->sub_sp_level) + parent_txn = trx->sub_sp_level; + error = txn_begin(db_env, parent_txn, &txn, 0, thd); + if (error) + goto cleanup; + + error = db_env->dirtool_move(db_env, + txn, + old_dname.c_str(), + new_dname.c_str()); +cleanup: + if (txn) { + if (error) { + abort_txn(txn); + } + else { + commit_txn(txn, 0); + } + } + return error; +} + +static void tokenize(const char *cmd_str, + std::vector /*out*/ &tokens) { + DBUG_ASSERT(cmd_str); + + bool was_escape = false; + const char *token_begin = cmd_str; + const char *token_end = token_begin; + + while (*token_end) { + if (*token_end == tokens_escape_delimiter_char) { + was_escape = true; + } + else if (*token_end == tokens_delimiter) { + if (was_escape) + was_escape = false; + else { + if (token_begin == token_end) + ++token_begin; + else { + tokens.push_back(std::string(token_begin, token_end)); + token_begin = token_end + 1; + } + } + } + else { + was_escape = false; + } + ++token_end; + } + + if (token_begin != token_end) + tokens.push_back(std::string(token_begin, token_end)); +} + +void process_dir_cmd(THD *thd, + const char *cmd_str, + const dir_cmd_callbacks &cb) { + + DBUG_ASSERT(thd); + DBUG_ASSERT(cmd_str); + + std::vector tokens; + tokenize(cmd_str, tokens); + + if (tokens.empty()) + return; + + const std::string &cmd = tokens[0]; + + if (!cmd.compare("attach")) { + if (tokens.size() != 3) { + if (cb.set_error) + cb.set_error(thd, + EINVAL, + "attach command requires two arguments"); + } + else { + int r = attach(thd, tokens[1], tokens[2], cb); + if (r && cb.set_error) + cb.set_error(thd, r, "Attach command error"); + } + } + else if (!cmd.compare("detach")) { + if (tokens.size() != 2) { + if (cb.set_error) + cb.set_error(thd, + EINVAL, + "detach command requires one argument"); + } + else { + int r = detach(thd, tokens[1], cb); + if (r && cb.set_error) + cb.set_error(thd, r, "detach command error"); + } + } + else if (!cmd.compare("move")) { + if (tokens.size() != 3) { + if (cb.set_error) + cb.set_error(thd, + EINVAL, + "move command requires two arguments"); + } + else { + int r = move(thd, tokens[1], tokens[2], cb); + if (r && cb.set_error) + cb.set_error(thd, r, "move command error"); + } + } + else { + if (cb.set_error) + cb.set_error(thd, + ENOENT, + "Unknown command '%s'", + cmd.c_str()); + } + + return; +}; + + +} // namespace tokudb diff --git a/storage/tokudb/tokudb_dir_cmd.h b/storage/tokudb/tokudb_dir_cmd.h new file mode 100644 index 00000000000..b39caadc7c3 --- /dev/null +++ b/storage/tokudb/tokudb_dir_cmd.h @@ -0,0 +1,46 @@ +/* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- */ +// vim: ft=cpp:expandtab:ts=8:sw=4:softtabstop=4: +#ident "$Id$" +/*====== +This file is part of TokuDB + + +Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. + + TokuDBis is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License, version 2, + as published by the Free Software Foundation. + + TokuDB is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with TokuDB. If not, see . + +======= */ + +#ident "Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved." + +#ifndef _TOKUDB_DIR_CMD_H +#define _TOKUDB_DIR_CMD_H + +#include + +namespace tokudb { + +struct dir_cmd_callbacks { + void (*set_error)(THD *thd, + int error, + const char *error_fmt, + ...); +}; + +void process_dir_cmd(THD *thd, + const char *cmd_str, + const dir_cmd_callbacks &cb); + +}; + +#endif // _TOKUDB_DIR_CMD_H diff --git a/storage/tokudb/tokudb_information_schema.cc b/storage/tokudb/tokudb_information_schema.cc index 2b4128cc03a..5cd0609ac74 100644 --- a/storage/tokudb/tokudb_information_schema.cc +++ b/storage/tokudb/tokudb_information_schema.cc @@ -76,8 +76,7 @@ int trx_callback( uint64_t txn_id = txn->id64(txn); uint64_t client_id; - void *client_extra; - txn->get_client_id(txn, &client_id, &client_extra); + txn->get_client_id(txn, &client_id, NULL); uint64_t start_time = txn->get_start_time(txn); trx_extra_t* e = reinterpret_cast(extra); THD* thd = e->thd; @@ -317,8 +316,7 @@ int locks_callback( uint64_t txn_id = txn->id64(txn); uint64_t client_id; - void *client_extra; - txn->get_client_id(txn, &client_id, &client_extra); + txn->get_client_id(txn, &client_id, NULL); locks_extra_t* e = reinterpret_cast(extra); THD* thd = e->thd; TABLE* table = e->table; diff --git a/storage/tokudb/tokudb_sysvars.cc b/storage/tokudb/tokudb_sysvars.cc index b758929c10e..bbc39dc550a 100644 --- a/storage/tokudb/tokudb_sysvars.cc +++ b/storage/tokudb/tokudb_sysvars.cc @@ -25,6 +25,9 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #ident "Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved." #include "hatoku_hton.h" +#include "sql_acl.h" +#include "tokudb_dir_cmd.h" +#include "sql_parse.h" namespace tokudb { namespace sysvars { @@ -40,6 +43,7 @@ namespace sysvars { #define TOKUDB_VERSION_STR NULL #endif + ulonglong cache_size = 0; uint cachetable_pool_threads = 0; int cardinality_scale_percent = 0; @@ -918,8 +922,6 @@ static MYSQL_THDVAR_BOOL( true); #endif - - //****************************************************************************** // all system variables //****************************************************************************** @@ -949,7 +951,6 @@ st_mysql_sys_var* system_variables[] = { MYSQL_SYSVAR(version), MYSQL_SYSVAR(write_status_frequency), MYSQL_SYSVAR(dir_per_db), - #if TOKU_INCLUDE_HANDLERTON_HANDLE_FATAL_SIGNAL MYSQL_SYSVAR(gdb_path), MYSQL_SYSVAR(gdb_on_fatal), diff --git a/storage/xtradb/CMakeLists.txt b/storage/xtradb/CMakeLists.txt index ba0797dd422..a717249cf5a 100644 --- a/storage/xtradb/CMakeLists.txt +++ b/storage/xtradb/CMakeLists.txt @@ -100,9 +100,9 @@ ENDIF() IF(NOT MSVC) # either define HAVE_IB_GCC_ATOMIC_BUILTINS or not - # workaround for gcc 4.1.2 RHEL5/x86, gcc atomic ops only work under -march=i686 + # workaround for old gcc on x86, gcc atomic ops only work under -march=i686 IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "i686" AND CMAKE_COMPILER_IS_GNUCC AND - CMAKE_C_COMPILER_VERSION VERSION_LESS "4.1.3") + CMAKE_C_COMPILER_VERSION VERSION_LESS "4.4.0") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=i686") ENDIF() @@ -510,3 +510,6 @@ MYSQL_ADD_PLUGIN(xtradb ${INNOBASE_SOURCES} STORAGE_ENGINE IF(TARGET xtradb AND NOT XTRADB_OK) MESSAGE(FATAL_ERROR "Percona XtraDB is not supported on this platform") ENDIF() + +ADD_SUBDIRECTORY(${CMAKE_SOURCE_DIR}/extra/mariabackup ${CMAKE_BINARY_DIR}/extra/mariabackup) + diff --git a/storage/xtradb/api/api0api.cc b/storage/xtradb/api/api0api.cc index a6dfad40150..2a46dd4b4c1 100644 --- a/storage/xtradb/api/api0api.cc +++ b/storage/xtradb/api/api0api.cc @@ -247,7 +247,7 @@ ib_open_table_by_id( table = dict_table_open_on_id(table_id, TRUE, DICT_TABLE_OP_NORMAL); - if (table != NULL && table->ibd_file_missing) { + if (table != NULL && table->file_unreadable) { table = NULL; } @@ -272,7 +272,7 @@ ib_open_table_by_name( table = dict_table_open_on_name(name, FALSE, FALSE, DICT_ERR_IGNORE_NONE); - if (table != NULL && table->ibd_file_missing) { + if (table != NULL && table->file_unreadable) { table = NULL; } @@ -292,7 +292,7 @@ ib_lookup_table_by_name( table = dict_table_get_low(name); - if (table != NULL && table->ibd_file_missing) { + if (table != NULL && table->file_unreadable) { table = NULL; } diff --git a/storage/xtradb/btr/btr0btr.cc b/storage/xtradb/btr/btr0btr.cc index 48411b6ff6a..29f03549899 100644 --- a/storage/xtradb/btr/btr0btr.cc +++ b/storage/xtradb/btr/btr0btr.cc @@ -2,7 +2,7 @@ Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2014, 2016, MariaDB Corporation +Copyright (c) 2014, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -77,10 +77,9 @@ btr_corruption_report( index->name, index->table_name); if (block->page.zip.data) { buf_page_print(block->page.zip.data, - buf_block_get_zip_size(block), - BUF_PAGE_PRINT_NO_CRASH); + buf_block_get_zip_size(block)); } - buf_page_print(buf_nonnull_block_get_frame(block), 0, 0); + buf_page_print(buf_nonnull_block_get_frame(block), 0); } #ifndef UNIV_HOTBACKUP @@ -722,7 +721,6 @@ btr_root_fseg_validate( /**************************************************************//** Gets the root node of a tree and x- or s-latches it. @return root page, x- or s-latched */ -static buf_block_t* btr_root_block_get( /*===============*/ @@ -744,10 +742,10 @@ btr_root_block_get( if (!block) { if (index && index->table) { - index->table->is_encrypted = TRUE; - index->table->corrupted = FALSE; + index->table->file_unreadable = true; - ib_push_warning(index->table->thd, DB_DECRYPTION_FAILED, + ib_push_warning( + static_cast(NULL), DB_DECRYPTION_FAILED, "Table %s in tablespace %lu is encrypted but encryption service or" " used key_id is not available. " " Can't continue reading table.", @@ -760,6 +758,7 @@ btr_root_block_get( SRV_CORRUPT_TABLE_CHECK(block, return(0);); btr_assert_not_corrupted(block, index); + #ifdef UNIV_BTR_DEBUG if (!dict_index_is_ibuf(index)) { const page_t* root = buf_block_get_frame(block); @@ -1531,7 +1530,6 @@ btr_node_ptr_set_child_page_no( /************************************************************//** Returns the child page of a node pointer and x-latches it. @return child page, x-latched */ -static buf_block_t* btr_node_ptr_get_child( /*===================*/ @@ -1602,11 +1600,9 @@ btr_page_get_father_node_ptr_func( if (btr_node_ptr_get_child_page_no(node_ptr, offsets) != page_no) { rec_t* print_rec; fputs("InnoDB: Dump of the child page:\n", stderr); - buf_page_print(page_align(user_rec), 0, - BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(page_align(user_rec), 0); fputs("InnoDB: Dump of the parent page:\n", stderr); - buf_page_print(page_align(node_ptr), 0, - BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(page_align(node_ptr), 0); fputs("InnoDB: Corruption of an index tree: table ", stderr); ut_print_name(stderr, NULL, TRUE, index->table_name); @@ -1705,9 +1701,7 @@ btr_create( dict_index_t* index, /*!< in: index */ mtr_t* mtr) /*!< in: mini-transaction handle */ { - ulint page_no; buf_block_t* block; - buf_frame_t* frame; page_t* page; page_zip_des_t* page_zip; @@ -1722,6 +1716,10 @@ btr_create( space, 0, IBUF_HEADER + IBUF_TREE_SEG_HEADER, mtr); + if (ibuf_hdr_block == NULL) { + return(FIL_NULL); + } + buf_block_dbg_add_level( ibuf_hdr_block, SYNC_IBUF_TREE_NODE_NEW); @@ -1735,7 +1733,17 @@ btr_create( + IBUF_HEADER + IBUF_TREE_SEG_HEADER, IBUF_TREE_ROOT_PAGE_NO, FSP_UP, mtr); + + if (block == NULL) { + return(FIL_NULL); + } + ut_ad(buf_block_get_page_no(block) == IBUF_TREE_ROOT_PAGE_NO); + + buf_block_dbg_add_level(block, SYNC_IBUF_TREE_NODE_NEW); + + flst_init(block->frame + PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST, + mtr); } else { #ifdef UNIV_BLOB_DEBUG if ((type & DICT_CLUSTERED) && !index->blobs) { @@ -1747,34 +1755,19 @@ btr_create( #endif /* UNIV_BLOB_DEBUG */ block = fseg_create(space, 0, PAGE_HEADER + PAGE_BTR_SEG_TOP, mtr); - } - if (block == NULL) { + if (block == NULL) { + return(FIL_NULL); + } - return(FIL_NULL); - } - - page_no = buf_block_get_page_no(block); - frame = buf_block_get_frame(block); - - if (type & DICT_IBUF) { - /* It is an insert buffer tree: initialize the free list */ - buf_block_dbg_add_level(block, SYNC_IBUF_TREE_NODE_NEW); - - ut_ad(page_no == IBUF_TREE_ROOT_PAGE_NO); - - flst_init(frame + PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST, mtr); - } else { - /* It is a non-ibuf tree: create a file segment for leaf - pages */ buf_block_dbg_add_level(block, SYNC_TREE_NODE_NEW); - if (!fseg_create(space, page_no, + if (!fseg_create(space, buf_block_get_page_no(block), PAGE_HEADER + PAGE_BTR_SEG_LEAF, mtr)) { /* Not enough space for new segment, free root segment before return. */ - btr_free_root(space, zip_size, page_no, mtr); - + btr_free_root(space, zip_size, + buf_block_get_page_no(block), mtr); return(FIL_NULL); } @@ -1818,7 +1811,7 @@ btr_create( ut_ad(page_get_max_insert_size(page, 2) > 2 * BTR_PAGE_MAX_REC_SIZE); - return(page_no); + return(buf_block_get_page_no(block)); } /************************************************************//** @@ -2084,8 +2077,8 @@ btr_page_reorganize_low( max_ins_size2 = page_get_max_insert_size_after_reorganize(page, 1); if (data_size1 != data_size2 || max_ins_size1 != max_ins_size2) { - buf_page_print(page, 0, BUF_PAGE_PRINT_NO_CRASH); - buf_page_print(temp_page, 0, BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(page, 0); + buf_page_print(temp_page, 0); fprintf(stderr, "InnoDB: Error: page old data size %lu" @@ -4613,7 +4606,7 @@ btr_index_rec_validate( (ulong) rec_get_n_fields_old(rec), (ulong) n); if (dump_on_error) { - buf_page_print(page, 0, BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(page, 0); fputs("InnoDB: corrupt record ", stderr); rec_print_old(stderr, rec); @@ -4651,8 +4644,7 @@ btr_index_rec_validate( (ulong) i, (ulong) len, (ulong) fixed_size); if (dump_on_error) { - buf_page_print(page, 0, - BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(page, 0); fputs("InnoDB: corrupt record ", stderr); rec_print_new(stderr, rec, offsets); @@ -4929,8 +4921,8 @@ loop: btr_validate_report2(index, level, block, right_block); fputs("InnoDB: broken FIL_PAGE_NEXT" " or FIL_PAGE_PREV links\n", stderr); - buf_page_print(page, 0, BUF_PAGE_PRINT_NO_CRASH); - buf_page_print(right_page, 0, BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(page, 0); + buf_page_print(right_page, 0); ret = false; } @@ -4938,8 +4930,8 @@ loop: if (page_is_comp(right_page) != page_is_comp(page)) { btr_validate_report2(index, level, block, right_block); fputs("InnoDB: 'compact' flag mismatch\n", stderr); - buf_page_print(page, 0, BUF_PAGE_PRINT_NO_CRASH); - buf_page_print(right_page, 0, BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(page, 0); + buf_page_print(right_page, 0); ret = false; @@ -4961,8 +4953,8 @@ loop: fputs("InnoDB: records in wrong order" " on adjacent pages\n", stderr); - buf_page_print(page, 0, BUF_PAGE_PRINT_NO_CRASH); - buf_page_print(right_page, 0, BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(page, 0); + buf_page_print(right_page, 0); fputs("InnoDB: record ", stderr); rec = page_rec_get_prev(page_get_supremum_rec(page)); @@ -5010,8 +5002,8 @@ loop: fputs("InnoDB: node pointer to the page is wrong\n", stderr); - buf_page_print(father_page, 0, BUF_PAGE_PRINT_NO_CRASH); - buf_page_print(page, 0, BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(father_page, 0); + buf_page_print(page, 0); fputs("InnoDB: node ptr ", stderr); rec_print(stderr, node_ptr, index); @@ -5043,10 +5035,8 @@ loop: btr_validate_report1(index, level, block); - buf_page_print(father_page, 0, - BUF_PAGE_PRINT_NO_CRASH); - buf_page_print(page, 0, - BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(father_page, 0); + buf_page_print(page, 0); fputs("InnoDB: Error: node ptrs differ" " on levels > 0\n" @@ -5091,15 +5081,9 @@ loop: btr_validate_report1(index, level, block); - buf_page_print( - father_page, 0, - BUF_PAGE_PRINT_NO_CRASH); - buf_page_print( - page, 0, - BUF_PAGE_PRINT_NO_CRASH); - buf_page_print( - right_page, 0, - BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(father_page, 0); + buf_page_print(page, 0); + buf_page_print(right_page, 0); } } else { page_t* right_father_page @@ -5117,18 +5101,10 @@ loop: btr_validate_report1(index, level, block); - buf_page_print( - father_page, 0, - BUF_PAGE_PRINT_NO_CRASH); - buf_page_print( - right_father_page, 0, - BUF_PAGE_PRINT_NO_CRASH); - buf_page_print( - page, 0, - BUF_PAGE_PRINT_NO_CRASH); - buf_page_print( - right_page, 0, - BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(father_page, 0); + buf_page_print(right_father_page, 0); + buf_page_print(page, 0); + buf_page_print(right_page, 0); } if (page_get_page_no(right_father_page) @@ -5142,18 +5118,10 @@ loop: btr_validate_report1(index, level, block); - buf_page_print( - father_page, 0, - BUF_PAGE_PRINT_NO_CRASH); - buf_page_print( - right_father_page, 0, - BUF_PAGE_PRINT_NO_CRASH); - buf_page_print( - page, 0, - BUF_PAGE_PRINT_NO_CRASH); - buf_page_print( - right_page, 0, - BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(father_page, 0); + buf_page_print(right_father_page, 0); + buf_page_print(page, 0); + buf_page_print(right_page, 0); } } } @@ -5211,7 +5179,7 @@ btr_validate_index( page_t* root = btr_root_get(index, &mtr); - if (root == NULL && index->table->is_encrypted) { + if (root == NULL && index->table->file_unreadable) { err = DB_DECRYPTION_FAILED; mtr_commit(&mtr); return err; diff --git a/storage/xtradb/btr/btr0cur.cc b/storage/xtradb/btr/btr0cur.cc index 78683f35028..59470b95c35 100644 --- a/storage/xtradb/btr/btr0cur.cc +++ b/storage/xtradb/btr/btr0cur.cc @@ -3,7 +3,7 @@ Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, Google Inc. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2015, MariaDB Corporation. +Copyright (c) 2015, 2017, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -658,7 +658,10 @@ retry_page_get: space, zip_size, page_no, rw_latch, guess, buf_mode, file, line, mtr, &err); + /* Note that block==NULL signifies either an error or change + buffering. */ if (err != DB_SUCCESS) { + ut_ad(block == NULL); if (err == DB_DECRYPTION_FAILED) { ib_push_warning((void *)NULL, DB_DECRYPTION_FAILED, @@ -666,7 +669,7 @@ retry_page_get: " used key_id is not available. " " Can't continue reading table.", index->table->name); - index->table->is_encrypted = true; + index->table->file_unreadable = true; } goto func_exit; @@ -944,7 +947,7 @@ btr_cur_open_at_index_side_func( ulint offsets_[REC_OFFS_NORMAL_SIZE]; ulint* offsets = offsets_; dberr_t err = DB_SUCCESS; - + rec_offs_init(offsets_); estimate = latch_mode & BTR_ESTIMATE; @@ -988,6 +991,9 @@ btr_cur_open_at_index_side_func( block = buf_page_get_gen(space, zip_size, page_no, RW_NO_LATCH, NULL, BUF_GET, file, line, mtr, &err); + + ut_ad((block != NULL) == (err == DB_SUCCESS)); + if (err != DB_SUCCESS) { if (err == DB_DECRYPTION_FAILED) { ib_push_warning((void *)NULL, @@ -996,7 +1002,7 @@ btr_cur_open_at_index_side_func( " used key_id is not available. " " Can't continue reading table.", index->table->name); - index->table->is_encrypted = true; + index->table->file_unreadable = true; } goto exit_loop; @@ -1161,6 +1167,8 @@ btr_cur_open_at_rnd_pos_func( RW_NO_LATCH, NULL, BUF_GET, file, line, mtr, &err); + ut_ad((block != NULL) == (err == DB_SUCCESS)); + if (err != DB_SUCCESS) { if (err == DB_DECRYPTION_FAILED) { ib_push_warning((void *)NULL, @@ -1169,8 +1177,9 @@ btr_cur_open_at_rnd_pos_func( " used key_id is not available. " " Can't continue reading table.", index->table->name); - index->table->is_encrypted = true; + index->table->file_unreadable = true; } + goto exit_loop; } @@ -1320,18 +1329,21 @@ btr_cur_ins_lock_and_undo( index, thr, mtr, inherit); if (err != DB_SUCCESS + || !(~flags | (BTR_NO_UNDO_LOG_FLAG | BTR_KEEP_SYS_FLAG)) || !dict_index_is_clust(index) || dict_index_is_ibuf(index)) { return(err); } - err = trx_undo_report_row_operation(flags, TRX_UNDO_INSERT_OP, - thr, index, entry, - NULL, 0, NULL, NULL, - &roll_ptr); - if (err != DB_SUCCESS) { - - return(err); + if (flags & BTR_NO_UNDO_LOG_FLAG) { + roll_ptr = 0; + } else { + err = trx_undo_report_row_operation(thr, index, entry, + NULL, 0, NULL, NULL, + &roll_ptr); + if (err != DB_SUCCESS) { + return(err); + } } /* Now we can fill in the roll ptr field in entry */ @@ -1380,15 +1392,17 @@ btr_cur_optimistic_insert( btr_cur_t* cursor, /*!< in: cursor on page after which to insert; cursor stays valid */ ulint** offsets,/*!< out: offsets on *rec */ - mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */ + mem_heap_t** heap, /*!< in/out: pointer to memory heap */ dtuple_t* entry, /*!< in/out: entry to insert */ rec_t** rec, /*!< out: pointer to inserted record if succeed */ big_rec_t** big_rec,/*!< out: big rec vector whose fields have to - be stored externally by the caller, or - NULL */ + be stored externally by the caller */ ulint n_ext, /*!< in: number of externally stored columns */ - que_thr_t* thr, /*!< in: query thread or NULL */ + que_thr_t* thr, /*!< in/out: query thread; can be NULL if + !(~flags + & (BTR_NO_LOCKING_FLAG + | BTR_NO_UNDO_LOG_FLAG)) */ mtr_t* mtr) /*!< in/out: mini-transaction; if this function returns DB_SUCCESS on a leaf page of a secondary index in a @@ -1409,6 +1423,7 @@ btr_cur_optimistic_insert( ulint rec_size; dberr_t err; + ut_ad(thr || !(~flags & (BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG))); *big_rec = NULL; block = btr_cur_get_block(cursor); @@ -1418,7 +1433,10 @@ btr_cur_optimistic_insert( page = buf_block_get_frame(block); index = cursor->index; - ut_ad((thr && thr_get_trx(thr)->fake_changes) + const bool fake_changes = (~flags & (BTR_NO_LOCKING_FLAG + | BTR_NO_UNDO_LOG_FLAG)) + && thr_get_trx(thr)->fake_changes; + ut_ad(fake_changes || mtr_memo_contains(mtr, block, MTR_MEMO_PAGE_X_FIX)); ut_ad(!dict_index_is_online_ddl(index) || dict_index_is_clust(index) @@ -1559,7 +1577,7 @@ fail_err: goto fail_err; } - if (UNIV_UNLIKELY(thr && thr_get_trx(thr)->fake_changes)) { + if (UNIV_UNLIKELY(fake_changes)) { /* skip CHANGE, LOG */ *big_rec = big_rec_vec; return(err); /* == DB_SUCCESS */ @@ -1677,15 +1695,17 @@ btr_cur_pessimistic_insert( cursor stays valid */ ulint** offsets,/*!< out: offsets on *rec */ mem_heap_t** heap, /*!< in/out: pointer to memory heap - that can be emptied, or NULL */ + that can be emptied */ dtuple_t* entry, /*!< in/out: entry to insert */ rec_t** rec, /*!< out: pointer to inserted record if succeed */ big_rec_t** big_rec,/*!< out: big rec vector whose fields have to - be stored externally by the caller, or - NULL */ + be stored externally by the caller */ ulint n_ext, /*!< in: number of externally stored columns */ - que_thr_t* thr, /*!< in: query thread or NULL */ + que_thr_t* thr, /*!< in/out: query thread; can be NULL if + !(~flags + & (BTR_NO_LOCKING_FLAG + | BTR_NO_UNDO_LOG_FLAG)) */ mtr_t* mtr) /*!< in/out: mini-transaction */ { dict_index_t* index = cursor->index; @@ -1697,13 +1717,17 @@ btr_cur_pessimistic_insert( ulint n_reserved = 0; ut_ad(dtuple_check_typed(entry)); + ut_ad(thr || !(~flags & (BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG))); *big_rec = NULL; - ut_ad((thr && thr_get_trx(thr)->fake_changes) || mtr_memo_contains(mtr, + const bool fake_changes = (~flags & (BTR_NO_LOCKING_FLAG + | BTR_NO_UNDO_LOG_FLAG)) + && thr_get_trx(thr)->fake_changes; + ut_ad(fake_changes || mtr_memo_contains(mtr, dict_index_get_lock(btr_cur_get_index(cursor)), MTR_MEMO_X_LOCK)); - ut_ad((thr && thr_get_trx(thr)->fake_changes) || mtr_memo_contains(mtr, btr_cur_get_block(cursor), + ut_ad(fake_changes || mtr_memo_contains(mtr, btr_cur_get_block(cursor), MTR_MEMO_PAGE_X_FIX)); ut_ad(!dict_index_is_online_ddl(index) || dict_index_is_clust(index) @@ -1764,7 +1788,7 @@ btr_cur_pessimistic_insert( } } - if (UNIV_UNLIKELY(thr && thr_get_trx(thr)->fake_changes)) { + if (UNIV_UNLIKELY(fake_changes)) { /* skip CHANGE, LOG */ if (n_reserved > 0) { fil_space_release_free_extents(index->space, @@ -1862,7 +1886,9 @@ btr_cur_upd_lock_and_undo( const rec_t* rec; dberr_t err; - if (UNIV_UNLIKELY(thr_get_trx(thr)->fake_changes)) { + ut_ad((thr != NULL) || (flags & BTR_NO_LOCKING_FLAG)); + + if (!(flags & BTR_NO_LOCKING_FLAG) && thr_get_trx(thr)->fake_changes) { /* skip LOCK, UNDO */ return(DB_SUCCESS); } @@ -1897,9 +1923,10 @@ btr_cur_upd_lock_and_undo( /* Append the info about the update in the undo log */ - return(trx_undo_report_row_operation( - flags, TRX_UNDO_MODIFY_OP, thr, - index, NULL, update, + return((flags & BTR_NO_UNDO_LOG_FLAG) + ? DB_SUCCESS + : trx_undo_report_row_operation( + thr, index, NULL, update, cmpl_info, rec, offsets, roll_ptr)); } @@ -2439,6 +2466,15 @@ any_extern: rec = page_cur_get_rec(page_cursor); } + /* We limit max record size to 16k even for 64k page size. */ + if (new_rec_size >= COMPRESSED_REC_MAX_DATA_SIZE || + (!dict_table_is_comp(index->table) + && new_rec_size >= REDUNDANT_REC_MAX_DATA_SIZE)) { + err = DB_OVERFLOW; + + goto func_exit; + } + if (UNIV_UNLIKELY(new_rec_size >= (page_get_free_space_of_empty(page_is_comp(page)) / 2))) { @@ -2650,12 +2686,12 @@ btr_cur_pessimistic_update( ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */ mem_heap_t** offsets_heap, /*!< in/out: pointer to memory heap - that can be emptied, or NULL */ + that can be emptied */ mem_heap_t* entry_heap, /*!< in/out: memory heap for allocating big_rec and the index tuple */ big_rec_t** big_rec,/*!< out: big rec vector whose fields have to - be stored externally by the caller, or NULL */ + be stored externally by the caller */ const upd_t* update, /*!< in: update vector; this is allowed also contain trx id and roll ptr fields, but the values in update vector have no effect */ @@ -3230,7 +3266,7 @@ btr_cur_del_mark_set_clust_rec( return(err); } - err = trx_undo_report_row_operation(0, TRX_UNDO_MODIFY_OP, thr, + err = trx_undo_report_row_operation(thr, index, NULL, NULL, 0, rec, offsets, &roll_ptr); if (err != DB_SUCCESS) { @@ -3853,6 +3889,8 @@ btr_estimate_n_rows_in_range_on_level( NULL, BUF_GET_POSSIBLY_FREED, __FILE__, __LINE__, &mtr, &err); + ut_ad((block != NULL) == (err == DB_SUCCESS)); + if (err != DB_SUCCESS) { if (err == DB_DECRYPTION_FAILED) { ib_push_warning((void *)NULL, @@ -3861,14 +3899,13 @@ btr_estimate_n_rows_in_range_on_level( " used key_id is not available. " " Can't continue reading table.", index->table->name); - index->table->is_encrypted = true; + index->table->file_unreadable = true; } mtr_commit(&mtr); goto inexact; } - page = buf_block_get_frame(block); /* It is possible that the tree has been reorganized in the @@ -4010,6 +4047,10 @@ btr_estimate_n_rows_in_range_low( mtr_commit(&mtr); + if (index->table->file_unreadable) { + return (0); + } + mtr_start_trx(&mtr, trx); #ifdef UNIV_DEBUG @@ -4337,8 +4378,8 @@ btr_estimate_number_of_different_key_vals( */ if (index->stat_index_size > 1) { n_sample_pages = (srv_stats_transient_sample_pages < index->stat_index_size) ? - (ulint) ut_min((double) index->stat_index_size, - log2(index->stat_index_size)*srv_stats_transient_sample_pages) + ut_min(index->stat_index_size, + ulint(log2(index->stat_index_size)*srv_stats_transient_sample_pages)) : index->stat_index_size; } @@ -4360,6 +4401,11 @@ btr_estimate_number_of_different_key_vals( because otherwise our algorithm would give a wrong estimate for an index where there is just one key value. */ + if (index->table->file_unreadable) { + mtr_commit(&mtr); + goto exit_loop; + } + page = btr_cur_get_page(&cursor); SRV_CORRUPT_TABLE_CHECK(page, goto exit_loop;); diff --git a/storage/xtradb/btr/btr0defragment.cc b/storage/xtradb/btr/btr0defragment.cc index 3f4185341a6..c2f58a8e1cf 100644 --- a/storage/xtradb/btr/btr0defragment.cc +++ b/storage/xtradb/btr/btr0defragment.cc @@ -154,7 +154,6 @@ btr_defragment_init() (ulonglong) (1000000.0 / srv_defragment_frequency)); mutex_create(btr_defragment_mutex_key, &btr_defragment_mutex, SYNC_ANY_LATCH); - os_thread_create(btr_defragment_thread, NULL, NULL); } /******************************************************************//** @@ -227,7 +226,7 @@ btr_defragment_add_index( page = buf_block_get_frame(block); } - if (page == NULL && index->table->is_encrypted) { + if (page == NULL && index->table->file_unreadable) { mtr_commit(&mtr); *err = DB_DECRYPTION_FAILED; return NULL; @@ -735,14 +734,13 @@ btr_defragment_n_pages( return current_block; } -/******************************************************************//** -Thread that merges consecutive b-tree pages into fewer pages to defragment -the index. */ +/** Whether btr_defragment_thread is active */ +bool btr_defragment_thread_active; + +/** Merge consecutive b-tree pages into fewer pages to defragment indexes */ extern "C" UNIV_INTERN os_thread_ret_t -DECLARE_THREAD(btr_defragment_thread)( -/*==========================================*/ - void* arg) /*!< in: work queue */ +DECLARE_THREAD(btr_defragment_thread)(void*) { btr_pcur_t* pcur; btr_cur_t* cursor; @@ -752,6 +750,8 @@ DECLARE_THREAD(btr_defragment_thread)( buf_block_t* last_block; while (srv_shutdown_state == SRV_SHUTDOWN_NONE) { + ut_ad(btr_defragment_thread_active); + /* If defragmentation is disabled, sleep before checking whether it's enabled. */ if (!srv_defragment) { @@ -825,9 +825,9 @@ DECLARE_THREAD(btr_defragment_thread)( btr_defragment_remove_item(item); } } - btr_defragment_shutdown(); + + btr_defragment_thread_active = false; os_thread_exit(NULL); OS_THREAD_DUMMY_RETURN; } - #endif /* !UNIV_HOTBACKUP */ diff --git a/storage/xtradb/btr/btr0pcur.cc b/storage/xtradb/btr/btr0pcur.cc index dd6ef484fc3..0b970e1cf49 100644 --- a/storage/xtradb/btr/btr0pcur.cc +++ b/storage/xtradb/btr/btr0pcur.cc @@ -420,6 +420,11 @@ btr_pcur_move_to_next_page( cursor->old_stored = BTR_PCUR_OLD_NOT_STORED; page = btr_pcur_get_page(cursor); + + if (UNIV_UNLIKELY(!page)) { + return; + } + next_page_no = btr_page_get_next(page, mtr); space = buf_block_get_space(btr_pcur_get_block(cursor)); zip_size = buf_block_get_zip_size(btr_pcur_get_block(cursor)); @@ -429,6 +434,11 @@ btr_pcur_move_to_next_page( next_block = btr_block_get(space, zip_size, next_page_no, cursor->latch_mode, btr_pcur_get_btr_cur(cursor)->index, mtr); + + if (UNIV_UNLIKELY(!next_block)) { + return; + } + next_page = buf_block_get_frame(next_block); SRV_CORRUPT_TABLE_CHECK(next_page, diff --git a/storage/xtradb/btr/btr0scrub.cc b/storage/xtradb/btr/btr0scrub.cc index e9434c9f778..1b10b79838d 100644 --- a/storage/xtradb/btr/btr0scrub.cc +++ b/storage/xtradb/btr/btr0scrub.cc @@ -139,6 +139,7 @@ btr_scrub_lock_dict_func(ulint space_id, bool lock_to_close_table, } else { return false; } + os_thread_sleep(250000); time_t now = time(0); @@ -577,7 +578,7 @@ btr_scrub_table_needs_scrubbing( return false; } - if (table->corrupted) { + if (!table->is_readable()) { return false; } @@ -885,17 +886,15 @@ btr_scrub_update_total_stat(btr_scrub_t *scrub_data) memset(&scrub_data->scrub_stat, 0, sizeof(scrub_data->scrub_stat)); } -/**************************************************************//** -Complete iterating a space */ +/** Complete iterating a space. +@param[in,out] scrub_data scrub data */ UNIV_INTERN -bool -btr_scrub_complete_space( -/*=====================*/ - btr_scrub_t* scrub_data) /*!< in/out: scrub data */ +void +btr_scrub_complete_space(btr_scrub_t* scrub_data) { + ut_ad(scrub_data->scrubbing); btr_scrub_table_close_for_thread(scrub_data); btr_scrub_update_total_stat(scrub_data); - return scrub_data->scrubbing; } /********************************************************************* diff --git a/storage/xtradb/btr/btr0sea.cc b/storage/xtradb/btr/btr0sea.cc index 68dbcdf1fa7..6891583554c 100644 --- a/storage/xtradb/btr/btr0sea.cc +++ b/storage/xtradb/btr/btr0sea.cc @@ -192,7 +192,7 @@ btr_search_sys_create( &btr_search_latch_arr[i], SYNC_SEARCH_SYS); btr_search_sys->hash_tables[i] - = ha_create(hash_size, 0, MEM_HEAP_FOR_BTR_SEARCH, 0); + = ib_create(hash_size, 0, MEM_HEAP_FOR_BTR_SEARCH, 0); #if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG btr_search_sys->hash_tables[i]->adaptive = TRUE; @@ -2022,9 +2022,7 @@ btr_search_validate_one_table( (ulong) block->curr_left_side); if (n_page_dumps < 20) { - buf_page_print( - page, 0, - BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(page, 0); n_page_dumps++; } } diff --git a/storage/xtradb/buf/buf0buf.cc b/storage/xtradb/buf/buf0buf.cc index 78ebbb7902b..7eb0474091e 100644 --- a/storage/xtradb/buf/buf0buf.cc +++ b/storage/xtradb/buf/buf0buf.cc @@ -2,7 +2,7 @@ Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, Google Inc. -Copyright (c) 2013, 2017, MariaDB Corporation. All Rights Reserved. +Copyright (c) 2013, 2017, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -65,9 +65,59 @@ Created 11/5/1995 Heikki Tuuri #include "fil0pagecompress.h" #include "ha_prototypes.h" +#ifdef UNIV_LINUX +#include +#endif + +#ifdef HAVE_LZO +#include "lzo/lzo1x.h" +#endif + +#ifdef HAVE_SNAPPY +#include "snappy-c.h" +#endif + +/** Decrypt a page. +@param[in,out] bpage Page control block +@param[in,out] space tablespace +@return whether the operation was successful */ +static +bool +buf_page_decrypt_after_read(buf_page_t* bpage, fil_space_t* space) + MY_ATTRIBUTE((nonnull)); + +/********************************************************************//** +Mark a table with the specified space pointed by bpage->space corrupted. +Also remove the bpage from LRU list. +@param[in,out] bpage Block */ +static +void +buf_mark_space_corrupt( + buf_page_t* bpage); + /* prototypes for new functions added to ha_innodb.cc */ trx_t* innobase_get_trx(); +inline void* aligned_malloc(size_t size, size_t align) { + void *result; +#ifdef _MSC_VER + result = _aligned_malloc(size, align); +#else + if(posix_memalign(&result, align, size)) { + result = 0; + } +#endif + return result; +} + +inline void aligned_free(void *ptr) { +#ifdef _MSC_VER + _aligned_free(ptr); +#else + free(ptr); +#endif +} + static inline void _increment_page_get_statistics(buf_block_t* block, trx_t* trx) @@ -99,10 +149,6 @@ _increment_page_get_statistics(buf_block_t* block, trx_t* trx) return; } -#ifdef HAVE_LZO -#include "lzo/lzo1x.h" -#endif - /* IMPLEMENTATION OF THE BUFFER POOL ================================= @@ -548,16 +594,13 @@ buf_block_alloc( } #endif /* !UNIV_HOTBACKUP */ -/********************************************************************//** -Checks if a page is all zeroes. -@return TRUE if the page is all zeroes */ +/** Check if a page is all zeroes. +@param[in] read_buf database page +@param[in] zip_size ROW_FORMAT=COMPRESSED page size, or 0 +@return whether the page is all zeroes */ UNIV_INTERN bool -buf_page_is_zeroes( -/*===============*/ - const byte* read_buf, /*!< in: a database page */ - const ulint zip_size) /*!< in: size of compressed page; - 0 for uncompressed pages */ +buf_page_is_zeroes(const byte* read_buf, ulint zip_size) { const ulint page_size = zip_size ? zip_size : UNIV_PAGE_SIZE; @@ -673,8 +716,7 @@ buf_page_is_checksum_valid_none( && checksum_field1 == BUF_NO_CHECKSUM_MAGIC); } -/********************************************************************//** -Checks if a page is corrupt. +/** Check if a page is corrupt. @param[in] check_lsn true if LSN should be checked @param[in] read_buf Page to be checked @param[in] zip_size compressed size or 0 @@ -914,19 +956,12 @@ buf_page_is_corrupted( return(false); } -/********************************************************************//** -Prints a page to stderr. */ +/** Dump a page to stderr. +@param[in] read_buf database page +@param[in] zip_size compressed page size, or 0 for uncompressed */ UNIV_INTERN void -buf_page_print( -/*===========*/ - const byte* read_buf, /*!< in: a database page */ - ulint zip_size, /*!< in: compressed page size, or - 0 for uncompressed pages */ - ulint flags) /*!< in: 0 or - BUF_PAGE_PRINT_NO_CRASH or - BUF_PAGE_PRINT_NO_FULL */ - +buf_page_print(const byte* read_buf, ulint zip_size) { #ifndef UNIV_HOTBACKUP dict_index_t* index; @@ -937,14 +972,12 @@ buf_page_print( size = UNIV_PAGE_SIZE; } - if (!(flags & BUF_PAGE_PRINT_NO_FULL)) { - ut_print_timestamp(stderr); - fprintf(stderr, - " InnoDB: Page dump in ascii and hex (%lu bytes):\n", - size); - ut_print_buf(stderr, read_buf, size); - fputs("\nInnoDB: End of page dump\n", stderr); - } + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: Page dump in ascii and hex (%lu bytes):\n", + size); + ut_print_buf(stderr, read_buf, size); + fputs("\nInnoDB: End of page dump\n", stderr); if (zip_size) { /* Print compressed page. */ @@ -1099,8 +1132,6 @@ buf_page_print( stderr); break; } - - ut_ad(flags & BUF_PAGE_PRINT_NO_CRASH); } #ifndef UNIV_HOTBACKUP @@ -1181,7 +1212,6 @@ buf_block_init( block->page.buf_fix_count = 0; block->page.io_fix = BUF_IO_NONE; block->page.encrypted = false; - block->page.key_version = 0; block->page.real_size = 0; block->page.write_size = 0; block->modify_clock = 0; @@ -1506,8 +1536,6 @@ buf_pool_init_instance( buf_pool->chunks = chunk = (buf_chunk_t*) mem_zalloc(sizeof *chunk); - UT_LIST_INIT(buf_pool->free); - if (!buf_chunk_init(buf_pool, chunk, buf_pool_size)) { mem_free(chunk); mem_free(buf_pool); @@ -1529,7 +1557,7 @@ buf_pool_init_instance( ut_a(srv_n_page_hash_locks != 0); ut_a(srv_n_page_hash_locks <= MAX_PAGE_HASH_LOCKS); - buf_pool->page_hash = ha_create(2 * buf_pool->curr_size, + buf_pool->page_hash = ib_create(2 * buf_pool->curr_size, srv_n_page_hash_locks, MEM_HEAP_FOR_PAGE_HASH, SYNC_BUF_PAGE_HASH); @@ -1638,20 +1666,14 @@ buf_pool_free_instance( if (buf_pool->tmp_arr) { for(ulint i = 0; i < buf_pool->tmp_arr->n_slots; i++) { buf_tmp_buffer_t* slot = &(buf_pool->tmp_arr->slots[i]); -#ifdef HAVE_LZO - if (slot && slot->lzo_mem) { - ut_free(slot->lzo_mem); - slot->lzo_mem = NULL; - } -#endif - if (slot && slot->crypt_buf_free) { - ut_free(slot->crypt_buf_free); - slot->crypt_buf_free = NULL; + if (slot && slot->crypt_buf) { + aligned_free(slot->crypt_buf); + slot->crypt_buf = NULL; } - if (slot && slot->comp_buf_free) { - ut_free(slot->comp_buf_free); - slot->comp_buf_free = NULL; + if (slot && slot->comp_buf) { + aligned_free(slot->comp_buf); + slot->comp_buf = NULL; } } } @@ -2354,7 +2376,17 @@ lookup: /* Page not in buf_pool: needs to be read from file */ ut_ad(!hash_lock); - buf_read_page(space, zip_size, offset, trx, NULL); + dberr_t err = buf_read_page(space, zip_size, offset, trx); + + if (err != DB_SUCCESS) { + ib_logf(IB_LOG_LEVEL_ERROR, + "Reading compressed page " ULINTPF + ":" ULINTPF + " failed with error: %s.", + space, offset, ut_strerr(err)); + + goto err_exit; + } #if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG ut_a(++buf_dbg_counter % 5771 || buf_validate()); @@ -2507,17 +2539,26 @@ buf_zip_decompress( { const byte* frame = block->page.zip.data; ulint size = page_zip_get_size(&block->page.zip); + /* Space is not found if this function is called during IMPORT */ + fil_space_t* space = fil_space_acquire_for_io(block->page.space); + const unsigned key_version = mach_read_from_4(frame + + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); + fil_space_crypt_t* crypt_data = space ? space->crypt_data : NULL; + const bool encrypted = crypt_data + && crypt_data->type != CRYPT_SCHEME_UNENCRYPTED + && (!crypt_data->is_default_encryption() + || srv_encrypt_tables); ut_ad(buf_block_get_zip_size(block)); ut_a(buf_block_get_space(block) != 0); if (UNIV_UNLIKELY(check && !page_zip_verify_checksum(frame, size))) { - ut_print_timestamp(stderr); - fprintf(stderr, - " InnoDB: compressed page checksum mismatch" - " (space %u page %u): stored: %lu, crc32: %lu " - "innodb: %lu, none: %lu\n", + ib_logf(IB_LOG_LEVEL_ERROR, + "Compressed page checksum mismatch" + " for %s [%u:%u]: stored: " ULINTPF ", crc32: " ULINTPF + " innodb: " ULINTPF ", none: " ULINTPF ".", + space ? space->chain.start->name : "N/A", block->page.space, block->page.offset, mach_read_from_4(frame + FIL_PAGE_SPACE_OR_CHKSUM), page_zip_calc_checksum(frame, size, @@ -2526,22 +2567,28 @@ buf_zip_decompress( SRV_CHECKSUM_ALGORITHM_INNODB), page_zip_calc_checksum(frame, size, SRV_CHECKSUM_ALGORITHM_NONE)); - return(FALSE); + goto err_exit; } switch (fil_page_get_type(frame)) { - case FIL_PAGE_INDEX: + case FIL_PAGE_INDEX: { + if (page_zip_decompress(&block->page.zip, block->frame, TRUE)) { + if (space) { + fil_space_release_for_io(space); + } return(TRUE); } - fprintf(stderr, - "InnoDB: unable to decompress space %u page %u\n", + ib_logf(IB_LOG_LEVEL_ERROR, + "Unable to decompress space %s [%u:%u]", + space ? space->chain.start->name : "N/A", block->page.space, block->page.offset); - return(FALSE); + goto err_exit; + } case FIL_PAGE_TYPE_ALLOCATED: case FIL_PAGE_INODE: case FIL_PAGE_IBUF_BITMAP: @@ -2552,14 +2599,36 @@ buf_zip_decompress( /* Copy to uncompressed storage. */ memcpy(block->frame, frame, buf_block_get_zip_size(block)); + + if (space) { + fil_space_release_for_io(space); + } + return(TRUE); } - ut_print_timestamp(stderr); - fprintf(stderr, - " InnoDB: unknown compressed page" - " type %lu\n", - fil_page_get_type(frame)); + ib_logf(IB_LOG_LEVEL_ERROR, + "Unknown compressed page in %s [%u:%u]" + " type %s [" ULINTPF "].", + space ? space->chain.start->name : "N/A", + block->page.space, block->page.offset, + fil_get_page_type_name(fil_page_get_type(frame)), fil_page_get_type(frame)); + +err_exit: + if (encrypted) { + ib_logf(IB_LOG_LEVEL_INFO, + "Row compressed page could be encrypted with key_version %u.", + key_version); + block->page.encrypted = true; + dict_set_encrypted_by_space(block->page.space); + } else { + dict_set_corrupted_by_space(block->page.space); + } + + if (space) { + fil_space_release_for_io(space); + } + return(FALSE); } @@ -2960,7 +3029,6 @@ loop: } if (block == NULL) { - buf_page_t* bpage=NULL; /* Page not in buf_pool: needs to be read from file */ @@ -2996,7 +3064,18 @@ loop: return(NULL); } - if (buf_read_page(space, zip_size, offset, trx, &bpage)) { + /* Call path is buf_read_page() -> buf_read_page_low() + (_fil_io()) -> buf_page_io_complete() -> + buf_decrypt_after_read() here fil_space_t* is used + and we decrypt -> buf_page_check_corrupt() where + page checksums are compared. Decryption/decompression + is handled lower level, error handling is handled on lower + level, here we need only to know is page really corrupted + or encrypted page with correct checksum. */ + + dberr_t local_err = buf_read_page(space, zip_size, offset, trx); + + if (local_err == DB_SUCCESS) { buf_read_ahead_random(space, zip_size, offset, ibuf_inside(mtr), trx); @@ -3004,89 +3083,47 @@ loop: } else if (retries < BUF_PAGE_READ_MAX_RETRIES) { ++retries; - bool corrupted = false; - - if (bpage) { - corrupted = buf_page_check_corrupt(bpage); - } - - /* Do not try again for encrypted pages */ - if (corrupted && bpage->encrypted) { - ib_mutex_t* pmutex = buf_page_get_mutex(bpage); - mutex_enter(&buf_pool->LRU_list_mutex); - mutex_enter(pmutex); - - ut_ad(buf_pool->n_pend_reads > 0); - os_atomic_decrement_ulint(&buf_pool->n_pend_reads, 1); - buf_page_set_io_fix(bpage, BUF_IO_NONE); - - if (!buf_LRU_free_page(bpage, true)) { - mutex_exit(&buf_pool->LRU_list_mutex); - } - - mutex_exit(pmutex); - rw_lock_x_unlock_gen(&((buf_block_t*) bpage)->lock, - BUF_IO_READ); - - if (err) { - *err = DB_DECRYPTION_FAILED; - } - - return (NULL); - } - DBUG_EXECUTE_IF( "innodb_page_corruption_retries", retries = BUF_PAGE_READ_MAX_RETRIES; ); } else { - bool corrupted = false; - - if (bpage) { - corrupted = buf_page_check_corrupt(bpage); + if (err) { + *err = local_err; } - if (corrupted && !bpage->encrypted) { - ib_logf(IB_LOG_LEVEL_ERROR, "Unable" - " to read tablespace %lu page no" - " %lu into the buffer pool after" - " %lu attempts\n" - "InnoDB: The most probable cause" - " of this error may be that the" - " table has been corrupted.\n" - "InnoDB: You can try to fix this" - " problem by using" - " innodb_force_recovery.\n" - "InnoDB: Please see reference manual" - " for more details.\n" - "InnoDB: Aborting...\n", - space, offset, - BUF_PAGE_READ_MAX_RETRIES); - - ut_error; - } else { - ib_mutex_t* pmutex = buf_page_get_mutex(bpage); - mutex_enter(&buf_pool->LRU_list_mutex); - mutex_enter(pmutex); - - ut_ad(buf_pool->n_pend_reads > 0); - os_atomic_decrement_ulint(&buf_pool->n_pend_reads, 1); - buf_page_set_io_fix(bpage, BUF_IO_NONE); - - if (!buf_LRU_free_page(bpage, true)) { - mutex_exit(&buf_pool->LRU_list_mutex); - } - - mutex_exit(pmutex); - rw_lock_x_unlock_gen(&((buf_block_t*) bpage)->lock, - BUF_IO_READ); - - if (err) { - *err = DB_DECRYPTION_FAILED; - } - + /* Pages whose encryption key is unavailable or used + key, encryption algorithm or encryption method is + incorrect are marked as encrypted in + buf_page_check_corrupt(). Unencrypted page could be + corrupted in a way where the key_id field is + nonzero. There is no checksum on field + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION. */ + if (local_err == DB_DECRYPTION_FAILED) { return (NULL); } + + /* Try to set table as corrupted instead of + asserting. */ + if (space > TRX_SYS_SPACE && + dict_set_corrupted_by_space(space)) { + return (NULL); + } + + ib_logf(IB_LOG_LEVEL_FATAL, "Unable" + " to read tablespace " ULINTPF " page no " + ULINTPF " into the buffer pool after " + ULINTPF " attempts." + " The most probable cause" + " of this error may be that the" + " table has been corrupted." + " You can try to fix this" + " problem by using" + " innodb_force_recovery." + " Please see " REFMAN " for more" + " details. Aborting...", + space, offset, + BUF_PAGE_READ_MAX_RETRIES); } #if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG @@ -3289,12 +3326,21 @@ got_block: /* Decompress the page while not holding any buf_pool or block->mutex. */ - /* Page checksum verification is already done when - the page is read from disk. Hence page checksum - verification is not necessary when decompressing the page. */ { - bool success = buf_zip_decompress(block, FALSE); - ut_a(success); + bool success = buf_zip_decompress(block, TRUE); + + if (!success) { + buf_block_mutex_enter(fix_block); + buf_block_set_io_fix(fix_block, BUF_IO_NONE); + buf_block_mutex_exit(fix_block); + + os_atomic_decrement_ulint(&buf_pool->n_pend_unzip, 1); + rw_lock_x_unlock(&fix_block->lock); + mutex_enter(&buf_pool->LRU_list_mutex); + buf_block_unfix(fix_block); + mutex_exit(&buf_pool->LRU_list_mutex); + return NULL; + } } if (!recv_no_ibuf_operations) { @@ -3392,16 +3438,10 @@ got_block: goto loop; } - fprintf(stderr, - "innodb_change_buffering_debug evict %u %u\n", - (unsigned) space, (unsigned) offset); return(NULL); } if (buf_flush_page_try(buf_pool, fix_block)) { - fprintf(stderr, - "innodb_change_buffering_debug flush %u %u\n", - (unsigned) space, (unsigned) offset); guess = fix_block; goto loop; } @@ -3859,7 +3899,6 @@ buf_page_init_low( bpage->oldest_modification = 0; bpage->write_size = 0; bpage->encrypted = false; - bpage->key_version = 0; bpage->real_size = 0; HASH_INVALIDATE(bpage, hash); @@ -4373,11 +4412,11 @@ buf_page_create( memset(frame + FIL_PAGE_NEXT, 0xff, 4); mach_write_to_2(frame + FIL_PAGE_TYPE, FIL_PAGE_TYPE_ALLOCATED); - /* Reset to zero the file flush lsn field in the page; if the first - page of an ibdata file is 'created' in this function into the buffer - pool then we lose the original contents of the file flush lsn stamp. - Then InnoDB could in a crash recovery print a big, false, corruption - warning if the stamp contains an lsn bigger than the ib_logfile lsn. */ + /* FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION is only used on the + following pages: + (1) The first page of the InnoDB system tablespace (page 0:0) + (2) FIL_RTREE_SPLIT_SEQ_NUM on R-tree pages + (3) key_version on encrypted pages (not page 0:0) */ memset(frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, 0, 8); @@ -4502,86 +4541,81 @@ buf_page_monitor( /********************************************************************//** Mark a table with the specified space pointed by bpage->space corrupted. Also remove the bpage from LRU list. -@return TRUE if successful */ +@param[in,out] bpage Block */ static -ibool +void buf_mark_space_corrupt( -/*===================*/ - buf_page_t* bpage) /*!< in: pointer to the block in question */ + buf_page_t* bpage) { buf_pool_t* buf_pool = buf_pool_from_bpage(bpage); const ibool uncompressed = (buf_page_get_state(bpage) == BUF_BLOCK_FILE_PAGE); ulint space = bpage->space; - ibool ret = TRUE; const ulint fold = buf_page_address_fold(bpage->space, bpage->offset); prio_rw_lock_t* hash_lock = buf_page_hash_lock_get(buf_pool, fold); + ib_mutex_t* block_mutex = buf_page_get_mutex(bpage); /* First unfix and release lock on the bpage */ ut_ad(!mutex_own(&buf_pool->LRU_list_mutex)); + mutex_enter(&buf_pool->LRU_list_mutex); + rw_lock_x_lock(hash_lock); + mutex_enter(block_mutex); + ut_ad(buf_page_get_io_fix(bpage) == BUF_IO_READ); + ut_ad(bpage->buf_fix_count == 0); + + /* Set BUF_IO_NONE before we remove the block from LRU list */ + buf_page_set_io_fix(bpage, BUF_IO_NONE); + + if (uncompressed) { + rw_lock_x_unlock_gen( + &((buf_block_t*) bpage)->lock, + BUF_IO_READ); + } + + /* If block is not encrypted find the table with specified + space id, and mark it corrupted. Encrypted tables + are marked unusable later e.g. in ::open(). */ if (!bpage->encrypted) { - mutex_enter(&buf_pool->LRU_list_mutex); - rw_lock_x_lock(hash_lock); - mutex_enter(buf_page_get_mutex(bpage)); - ut_ad(buf_page_get_io_fix(bpage) == BUF_IO_READ); - ut_ad(bpage->buf_fix_count == 0); - - /* Set BUF_IO_NONE before we remove the block from LRU list */ - buf_page_set_io_fix(bpage, BUF_IO_NONE); - - if (uncompressed) { - rw_lock_x_unlock_gen( - &((buf_block_t*) bpage)->lock, - BUF_IO_READ); - } - } - - /* Find the table with specified space id, and mark it corrupted */ - if (dict_set_corrupted_by_space(space)) { - if (!bpage->encrypted) { - buf_LRU_free_one_page(bpage); - } + dict_set_corrupted_by_space(space); } else { - if (!bpage->encrypted) { - mutex_exit(buf_page_get_mutex(bpage)); - } - ret = FALSE; + dict_set_encrypted_by_space(space); } - if(!bpage->encrypted) { - mutex_exit(&buf_pool->LRU_list_mutex); - ut_ad(buf_pool->n_pend_reads > 0); - os_atomic_decrement_ulint(&buf_pool->n_pend_reads, 1); - } + /* After this point bpage can't be referenced. This + function will release the hash_lock acquired above. */ + buf_LRU_free_one_page(bpage); - return(ret); + ut_ad(buf_pool->n_pend_reads > 0); + os_atomic_decrement_ulint(&buf_pool->n_pend_reads, 1); + mutex_exit(&buf_pool->LRU_list_mutex); } -/********************************************************************//** -Check if page is maybe compressed, encrypted or both when we encounter +/** Check if page is maybe compressed, encrypted or both when we encounter corrupted page. Note that we can't be 100% sure if page is corrupted or decrypt/decompress just failed. -@param[in,out] bpage Page -@return true if page corrupted, false if not */ -UNIV_INTERN -bool -buf_page_check_corrupt( - buf_page_t* bpage) +@param[in,out] bpage page +@param[in,out] space tablespace from fil_space_acquire_for_io() +@return whether the operation succeeded +@retval DB_SUCCESS if page has been read and is not corrupted +@retval DB_PAGE_CORRUPTED if page based on checksum check is corrupted +@retval DB_DECRYPTION_FAILED if page post encryption checksum matches but +after decryption normal page checksum does not match. +@retval DB_TABLESPACE_DELETED if accessed tablespace is not found */ +static +dberr_t +buf_page_check_corrupt(buf_page_t* bpage, fil_space_t* space) { + ut_ad(space->n_pending_ios > 0); + ulint zip_size = buf_page_get_zip_size(bpage); byte* dst_frame = (zip_size) ? bpage->zip.data : ((buf_block_t*) bpage)->frame; - ulint space_id = bpage->space; - fil_space_t* space = fil_space_acquire_silent(space_id); bool still_encrypted = false; + dberr_t err = DB_SUCCESS; bool corrupted = false; - ulint page_type = mach_read_from_2(dst_frame + FIL_PAGE_TYPE); - fil_space_crypt_t* crypt_data = NULL; - - ut_ad(space); - crypt_data = space->crypt_data; + fil_space_crypt_t* crypt_data = space->crypt_data; /* In buf_decrypt_after_read we have either decrypted the page if page post encryption checksum matches and used key_id is found @@ -4593,71 +4627,72 @@ buf_page_check_corrupt( crypt_data->type != CRYPT_SCHEME_UNENCRYPTED && !bpage->encrypted && fil_space_verify_crypt_checksum(dst_frame, zip_size, - space, bpage->offset)); + space, bpage->offset)); if (!still_encrypted) { /* If traditional checksums match, we assume that page is not anymore encrypted. */ - corrupted = buf_page_is_corrupted(true, dst_frame, zip_size, space); + corrupted = buf_page_is_corrupted(true, dst_frame, zip_size, + space); if (!corrupted) { bpage->encrypted = false; + } else { + err = DB_PAGE_CORRUPTED; } } /* Pages that we think are unencrypted but do not match the checksum checks could be corrupted or encrypted or both. */ if (corrupted && !bpage->encrypted) { - ib_logf(IB_LOG_LEVEL_ERROR, - "%s: Block in space_id " ULINTPF " in file %s corrupted.", - page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED ? "Maybe corruption" : "Corruption", - space_id, (space && space->name) ? space->name : "NULL"); - ib_logf(IB_LOG_LEVEL_ERROR, - "Based on page type %s (" ULINTPF ")", - fil_get_page_type_name(page_type), page_type); + /* An error will be reported by + buf_page_io_complete(). */ } else if (still_encrypted || (bpage->encrypted && corrupted)) { bpage->encrypted = true; - corrupted = true; + err = DB_DECRYPTION_FAILED; ib_logf(IB_LOG_LEVEL_ERROR, - "Block in space_id " ULINTPF " in file %s encrypted.", - space_id, (space && space->name) ? space->name : "NULL"); - ib_logf(IB_LOG_LEVEL_ERROR, - "However key management plugin or used key_version %u is not found or" - " used encryption algorithm or method does not match.", - bpage->key_version); - if (space_id > TRX_SYS_SPACE) { - ib_logf(IB_LOG_LEVEL_ERROR, + "The page [page id: space=%u" + ", page number=%u]" + " in file %s cannot be decrypted.", + bpage->space, bpage->offset, + space->name); + + ib_logf(IB_LOG_LEVEL_INFO, + "However key management plugin or used key_version " ULINTPF + " is not found or" + " used encryption algorithm or method does not match.", + mach_read_from_4(dst_frame+FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION)); + + if (bpage->space > TRX_SYS_SPACE) { + ib_logf(IB_LOG_LEVEL_INFO, "Marking tablespace as missing. You may drop this table or" " install correct key management plugin and key file."); } } - if (space) { - fil_space_release(space); - } - - return corrupted; + return (err); } -/********************************************************************//** -Completes an asynchronous read or write request of a file page to or from -the buffer pool. -@return true if successful */ +/** Complete a read or write request of a file page to or from the buffer pool. +@param[in,out] bpage Page to complete +@return whether the operation succeeded +@retval DB_SUCCESS always when writing, or if a read page was OK +@retval DB_PAGE_CORRUPTED if the checksum fails on a page read +@retval DB_DECRYPTION_FAILED if page post encryption checksum matches but + after decryption normal page checksum does + not match */ UNIV_INTERN -bool -buf_page_io_complete( -/*=================*/ - buf_page_t* bpage) /*!< in: pointer to the block in question */ +dberr_t +buf_page_io_complete(buf_page_t* bpage) { enum buf_io_fix io_type; buf_pool_t* buf_pool = buf_pool_from_bpage(bpage); const ibool uncompressed = (buf_page_get_state(bpage) == BUF_BLOCK_FILE_PAGE); bool have_LRU_mutex = false; - fil_space_t* space = NULL; - byte* frame = NULL; - bool corrupted = false; + byte* frame = NULL; + dberr_t err = DB_SUCCESS; ut_a(buf_page_in_file(bpage)); @@ -4671,10 +4706,17 @@ buf_page_io_complete( ut_ad(io_type == BUF_IO_READ || io_type == BUF_IO_WRITE); if (io_type == BUF_IO_READ) { - ulint read_page_no; - ulint read_space_id; + ulint read_page_no = 0; + ulint read_space_id = 0; + uint key_version = 0; - buf_page_decrypt_after_read(bpage); + ut_ad(bpage->zip.data || ((buf_block_t*)bpage)->frame); + fil_space_t* space = fil_space_acquire_for_io(bpage->space); + if (!space) { + return(DB_TABLESPACE_DELETED); + } + + buf_page_decrypt_after_read(bpage, space); if (buf_page_get_zip_size(bpage)) { frame = bpage->zip.data; @@ -4696,10 +4738,11 @@ buf_page_io_complete( "Page %u in tablespace %u zip_decompress failure.", bpage->offset, bpage->space); - corrupted = true; + err = DB_PAGE_CORRUPTED; goto database_corrupted; } + os_atomic_decrement_ulint(&buf_pool->n_pend_unzip, 1); } else { ut_a(uncompressed); @@ -4712,6 +4755,8 @@ buf_page_io_complete( read_page_no = mach_read_from_4(frame + FIL_PAGE_OFFSET); read_space_id = mach_read_from_4( frame + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID); + key_version = mach_read_from_4( + frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); if (bpage->space == TRX_SYS_SPACE && buf_dblwr_page_inside(bpage->offset)) { @@ -4732,12 +4777,11 @@ buf_page_io_complete( page may contain garbage in MySQL < 4.1.1, which only supported bpage->space == 0. */ - ut_print_timestamp(stderr); - fprintf(stderr, - " InnoDB: Error: space id and page n:o" - " stored in the page\n" - "InnoDB: read in are " ULINTPF ":" ULINTPF "," - " should be %u:%u!\n", + ib_logf(IB_LOG_LEVEL_ERROR, + "Space id and page n:o" + " stored in the page" + " read in are " ULINTPF ":" ULINTPF "," + " should be %u:%u!", read_space_id, read_page_no, bpage->space, @@ -4746,81 +4790,64 @@ buf_page_io_complete( if (UNIV_LIKELY(!bpage->is_corrupt || !srv_pass_corrupt_table)) { - corrupted = buf_page_check_corrupt(bpage); - + err = buf_page_check_corrupt(bpage, space); } database_corrupted: - if (corrupted) { + if (err != DB_SUCCESS) { /* Not a real corruption if it was triggered by error injection */ - DBUG_EXECUTE_IF("buf_page_is_corrupt_failure", - if (bpage->space > TRX_SYS_SPACE - && buf_mark_space_corrupt(bpage)) { + if (bpage->space > TRX_SYS_SPACE) { + buf_mark_space_corrupt(bpage); ib_logf(IB_LOG_LEVEL_INFO, "Simulated page corruption"); - return(true); + fil_space_release_for_io(space); + return(err); } + err = DB_SUCCESS; goto page_not_corrupt; ); - if (!bpage->encrypted) { - fil_system_enter(); - space = fil_space_get_by_id(bpage->space); - fil_system_exit(); + if (err == DB_PAGE_CORRUPTED) { ib_logf(IB_LOG_LEVEL_ERROR, "Database page corruption on disk" - " or a failed"); - ib_logf(IB_LOG_LEVEL_ERROR, - "Space %u file %s read of page %u.", - bpage->space, - space->name ? space->name : "NULL", - bpage->offset); - ib_logf(IB_LOG_LEVEL_ERROR, - "You may have to recover" - " from a backup."); + " or a failed file read of tablespace %s" + " page [page id: space=%u" + ", page number=%u]" + ". You may have to recover from " + "a backup.", + space->name, + bpage->space, bpage->offset); - buf_page_print(frame, buf_page_get_zip_size(bpage), - BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(frame, + buf_page_get_zip_size(bpage)); - ib_logf(IB_LOG_LEVEL_ERROR, - "It is also possible that your operating" - "system has corrupted its own file cache."); - ib_logf(IB_LOG_LEVEL_ERROR, - "and rebooting your computer removes the error."); - ib_logf(IB_LOG_LEVEL_ERROR, - "If the corrupt page is an index page you can also try to"); - ib_logf(IB_LOG_LEVEL_ERROR, - "fix the corruption by dumping, dropping, and reimporting"); - ib_logf(IB_LOG_LEVEL_ERROR, - "the corrupt table. You can use CHECK"); - ib_logf(IB_LOG_LEVEL_ERROR, - "TABLE to scan your table for corruption."); - ib_logf(IB_LOG_LEVEL_ERROR, - "See also " - REFMAN "forcing-innodb-recovery.html" - " about forcing recovery."); + ib_logf(IB_LOG_LEVEL_INFO, + "It is also possible that your" + " operating system has corrupted" + " its own file cache and rebooting" + " your computer removes the error." + " If the corrupt page is an index page." + " You can also try to fix the" + " corruption by dumping, dropping," + " and reimporting the corrupt table." + " You can use CHECK TABLE to scan" + " your table for corruption. " + "Please refer to " REFMAN "forcing-innodb-recovery.html" + " for information about forcing recovery."); } if (srv_pass_corrupt_table && bpage->space != 0 && bpage->space < SRV_LOG_SPACE_FIRST_ID) { - trx_t* trx; - fprintf(stderr, - "InnoDB: space %u will be treated as corrupt.\n", + ib_logf(IB_LOG_LEVEL_INFO, + "InnoDB: space %u will be treated as corrupt.", bpage->space); fil_space_set_corrupt(bpage->space); - trx = innobase_get_trx(); - - if (trx && trx->dict_operation_lock_mode == RW_X_LATCH) { - dict_table_set_corrupt_by_space(bpage->space, FALSE); - } else { - dict_table_set_corrupt_by_space(bpage->space, TRUE); - } - + dict_set_corrupted_by_space(bpage->space); bpage->is_corrupt = TRUE; } @@ -4828,31 +4855,13 @@ database_corrupted: /* If page space id is larger than TRX_SYS_SPACE (0), we will attempt to mark the corresponding table as corrupted instead of crashing server */ - if (bpage->space > TRX_SYS_SPACE - && buf_mark_space_corrupt(bpage)) { - return(false); + if (bpage->space > TRX_SYS_SPACE) { + buf_mark_space_corrupt(bpage); + fil_space_release_for_io(space); + return(err); } else { - if (!bpage->encrypted) { - ib_logf(IB_LOG_LEVEL_ERROR, - "Ending processing because of a corrupt database page."); - - ut_error; - } - - ib_push_warning(innobase_get_trx(), DB_DECRYPTION_FAILED, - "Table in tablespace %lu encrypted." - "However key management plugin or used key_id %lu is not found or" - " used encryption algorithm or method does not match." - " Can't continue opening the table.", - bpage->space, bpage->key_version); - - if (bpage->encrypted && bpage->space > TRX_SYS_SPACE) { - buf_mark_space_corrupt(bpage); - } else { - ut_error; - } - - return(false); + ib_logf(IB_LOG_LEVEL_FATAL, + "Ending processing because of a corrupt database page."); } } } @@ -4872,11 +4881,12 @@ database_corrupted: if (bpage && bpage->encrypted) { ib_logf(IB_LOG_LEVEL_WARN, - "Table in tablespace %lu encrypted." - "However key management plugin or used key_version %u is not found or" + "Table in tablespace " ULINTPF " encrypted." + "However key management plugin or used " + " key_version %u is not found or" " used encryption algorithm or method does not match." - " Can't continue opening the table.\n", - (ulint)bpage->space, bpage->key_version); + " Can't continue opening the table.", + read_space_id, key_version); } else { ibuf_merge_or_delete_for_page( @@ -4886,6 +4896,8 @@ database_corrupted: } } + + fil_space_release_for_io(space); } else { /* io_type == BUF_IO_WRITE */ if (bpage->slot) { @@ -4998,7 +5010,7 @@ retry_mutex: mutex_exit(block_mutex); - return(true); + return(err); } /*********************************************************************//** @@ -5026,7 +5038,7 @@ buf_all_freed_instance( mutex_exit(&buf_pool->LRU_list_mutex); - if (UNIV_LIKELY_NULL(block) && block->page.key_version == 0) { + if (UNIV_LIKELY_NULL(block)) { fil_space_t* space = fil_space_get(block->page.space); ib_logf(IB_LOG_LEVEL_ERROR, "Page %u %u still fixed or dirty.", @@ -6223,22 +6235,27 @@ buf_pool_reserve_tmp_slot( buf_pool_mutex_exit(buf_pool); /* Allocate temporary memory for encryption/decryption */ - if (free_slot->crypt_buf_free == NULL) { - free_slot->crypt_buf_free = static_cast(ut_malloc(UNIV_PAGE_SIZE*2)); - free_slot->crypt_buf = static_cast(ut_align(free_slot->crypt_buf_free, UNIV_PAGE_SIZE)); - memset(free_slot->crypt_buf_free, 0, UNIV_PAGE_SIZE *2); + if (free_slot->crypt_buf == NULL) { + free_slot->crypt_buf = static_cast(aligned_malloc(UNIV_PAGE_SIZE, UNIV_PAGE_SIZE)); + memset(free_slot->crypt_buf, 0, UNIV_PAGE_SIZE); } /* For page compressed tables allocate temporary memory for compression/decompression */ - if (compressed && free_slot->comp_buf_free == NULL) { - free_slot->comp_buf_free = static_cast(ut_malloc(UNIV_PAGE_SIZE*2)); - free_slot->comp_buf = static_cast(ut_align(free_slot->comp_buf_free, UNIV_PAGE_SIZE)); - memset(free_slot->comp_buf_free, 0, UNIV_PAGE_SIZE *2); -#ifdef HAVE_LZO - free_slot->lzo_mem = static_cast(ut_malloc(LZO1X_1_15_MEM_COMPRESS)); - memset(free_slot->lzo_mem, 0, LZO1X_1_15_MEM_COMPRESS); + if (compressed && free_slot->comp_buf == NULL) { + ulint size = UNIV_PAGE_SIZE; + + /* Both snappy and lzo compression methods require that + output buffer used for compression is bigger than input + buffer. Increase the allocated buffer size accordingly. */ +#if HAVE_SNAPPY + size = snappy_max_compressed_length(size); #endif +#if HAVE_LZO + size += LZO1X_1_15_MEM_COMPRESS; +#endif + free_slot->comp_buf = static_cast(aligned_malloc(size, UNIV_PAGE_SIZE)); + memset(free_slot->comp_buf, 0, size); } return (free_slot); @@ -6266,32 +6283,29 @@ buf_page_encrypt_before_write( switch (bpage->offset) { case 0: /* Page 0 of a tablespace is not encrypted/compressed */ - ut_ad(bpage->key_version == 0); return src_frame; case TRX_SYS_PAGE_NO: if (bpage->space == TRX_SYS_SPACE) { /* don't encrypt/compress page as it contains address to dblwr buffer */ - bpage->key_version = 0; return src_frame; } } fil_space_crypt_t* crypt_data = space->crypt_data; + const bool encrypted = crypt_data && !crypt_data->not_encrypted() && crypt_data->type != CRYPT_SCHEME_UNENCRYPTED && (!crypt_data->is_default_encryption() || srv_encrypt_tables); - if (!encrypted) { - bpage->key_version = 0; - } - bool page_compressed = FSP_FLAGS_HAS_PAGE_COMPRESSION(space->flags); if (!encrypted && !page_compressed) { - /* No need to encrypt or page compress the page */ + /* No need to encrypt or page compress the page. + Clear key-version & crypt-checksum. */ + memset(src_frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, 0, 8); return src_frame; } @@ -6313,9 +6327,6 @@ buf_page_encrypt_before_write( src_frame, dst_frame); - ulint key_version = mach_read_from_4(dst_frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); - ut_ad(key_version == 0 || key_version >= bpage->key_version); - bpage->key_version = key_version; bpage->real_size = page_size; slot->out_buf = dst_frame = tmp; @@ -6332,8 +6343,7 @@ buf_page_encrypt_before_write( fsp_flags_get_page_compression_level(space->flags), fil_space_get_block_size(space, bpage->offset), encrypted, - &out_len, - IF_LZO(slot->lzo_mem, NULL)); + &out_len); bpage->real_size = out_len; @@ -6362,16 +6372,17 @@ buf_page_encrypt_before_write( return dst_frame; } -/********************************************************************//** -Decrypt page after it has been read from disk -@param[in,out] bpage Page control block -@return true if successfull, false if something went wrong -*/ -UNIV_INTERN +/** Decrypt a page. +@param[in,out] bpage Page control block +@param[in,out] space tablespace +@return whether the operation was successful */ +static bool -buf_page_decrypt_after_read( - buf_page_t* bpage) +buf_page_decrypt_after_read(buf_page_t* bpage, fil_space_t* space) { + ut_ad(space->n_pending_ios > 0); + ut_ad(space->id == bpage->space); + ulint zip_size = buf_page_get_zip_size(bpage); ulint size = (zip_size) ? zip_size : UNIV_PAGE_SIZE; @@ -6384,19 +6395,15 @@ buf_page_decrypt_after_read( buf_pool_t* buf_pool = buf_pool_from_bpage(bpage); bool success = true; - bpage->key_version = key_version; - if (bpage->offset == 0) { /* File header pages are not encrypted/compressed */ return (true); } - fil_space_t* space = fil_space_acquire(bpage->space, true); - /* Page is encrypted if encryption information is found from tablespace and page contains used key_version. This is true also for pages first compressed and then encrypted. */ - if (!space || !space->crypt_data) { + if (!space->crypt_data) { key_version = 0; } @@ -6430,6 +6437,14 @@ buf_page_decrypt_after_read( decrypt. */ if (!fil_space_verify_crypt_checksum(dst_frame, zip_size, NULL, bpage->offset)) { + + /* Mark page encrypted in case it should + be. */ + if (space->crypt_data->type + != CRYPT_SCHEME_UNENCRYPTED) { + bpage->encrypted = true; + } + return (false); } @@ -6441,12 +6456,8 @@ buf_page_decrypt_after_read( #endif /* decrypt using crypt_buf to dst_frame */ - byte* res = fil_space_decrypt(space, - slot->crypt_buf, - dst_frame, - &bpage->encrypted); - - if (!res) { + if (!fil_space_decrypt(space, slot->crypt_buf, + dst_frame, &bpage->encrypted)) { success = false; } @@ -6477,8 +6488,6 @@ buf_page_decrypt_after_read( } } - if (space != NULL) { - fil_space_release(space); - } + ut_ad(space->n_pending_ios > 0); return (success); } diff --git a/storage/xtradb/buf/buf0dblwr.cc b/storage/xtradb/buf/buf0dblwr.cc index 55c5e4d543a..4995df98165 100644 --- a/storage/xtradb/buf/buf0dblwr.cc +++ b/storage/xtradb/buf/buf0dblwr.cc @@ -1,7 +1,7 @@ /***************************************************************************** -Copyright (c) 1995, 2014, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2017, MariaDB Corporation. All Rights Reserved. +Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2013, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -175,13 +175,14 @@ buf_dblwr_init( mem_zalloc(buf_size * sizeof(void*))); } -/****************************************************************//** -Creates the doublewrite buffer to a new InnoDB installation. The header of the -doublewrite buffer is placed on the trx system header page. */ +/** Create the doublewrite buffer if the doublewrite buffer header +is not present in the TRX_SYS page. +@return whether the operation succeeded +@retval true if the doublewrite buffer exists or was created +@retval false if the creation failed (too small first data file) */ UNIV_INTERN -void -buf_dblwr_create(void) -/*==================*/ +bool +buf_dblwr_create() { buf_block_t* block2; buf_block_t* new_block; @@ -194,8 +195,7 @@ buf_dblwr_create(void) if (buf_dblwr) { /* Already inited */ - - return; + return(true); } start_again: @@ -213,39 +213,59 @@ start_again: mtr_commit(&mtr); buf_dblwr_being_created = FALSE; - return; + return(true); } - ib_logf(IB_LOG_LEVEL_INFO, - "Doublewrite buffer not found: creating new"); - if (buf_pool_get_curr_size() < ((TRX_SYS_DOUBLEWRITE_BLOCKS * TRX_SYS_DOUBLEWRITE_BLOCK_SIZE + FSP_EXTENT_SIZE / 2 + 100) * UNIV_PAGE_SIZE)) { - ib_logf(IB_LOG_LEVEL_FATAL, - "Cannot create doublewrite buffer: you must " - "increase your buffer pool size. Cannot continue " - "operation."); + ib_logf(IB_LOG_LEVEL_ERROR, + "Cannot create doublewrite buffer: " + "innodb_buffer_pool_size is too small."); + mtr_commit(&mtr); + return(false); + } else { + fil_space_t* space = fil_space_acquire(TRX_SYS_SPACE); + const bool fail = UT_LIST_GET_FIRST(space->chain)->size + < 3 * FSP_EXTENT_SIZE; + fil_space_release(space); + + if (fail) { + goto too_small; + } } block2 = fseg_create(TRX_SYS_SPACE, TRX_SYS_PAGE_NO, TRX_SYS_DOUBLEWRITE + TRX_SYS_DOUBLEWRITE_FSEG, &mtr); + if (block2 == NULL) { +too_small: + ib_logf(IB_LOG_LEVEL_ERROR, + "Cannot create doublewrite buffer: " + "the first file in innodb_data_file_path" + " must be at least %luM.", + 3 * (FSP_EXTENT_SIZE * UNIV_PAGE_SIZE) >> 20); + mtr_commit(&mtr); + return(false); + } + + ib_logf(IB_LOG_LEVEL_INFO, + "Doublewrite buffer not found: creating new"); + + /* FIXME: After this point, the doublewrite buffer creation + is not atomic. The doublewrite buffer should not exist in + the InnoDB system tablespace file in the first place. + It could be located in separate optional file(s) in a + user-specified location. */ + /* fseg_create acquires a second latch on the page, therefore we must declare it: */ buf_block_dbg_add_level(block2, SYNC_NO_ORDER_CHECK); - if (block2 == NULL) { - ib_logf(IB_LOG_LEVEL_FATAL, - "Cannot create doublewrite buffer: you must " - "increase your tablespace size. " - "Cannot continue operation."); - } - fseg_header = doublewrite + TRX_SYS_DOUBLEWRITE_FSEG; prev_page_no = 0; @@ -351,7 +371,7 @@ recovery, this function loads the pages from double write buffer into memory. */ void buf_dblwr_init_or_load_pages( /*=========================*/ - os_file_t file, + pfs_os_file_t file, char* path, bool load_corrupt_pages) { @@ -482,6 +502,14 @@ buf_dblwr_process() byte* unaligned_read_buf; recv_dblwr_t& recv_dblwr = recv_sys->dblwr; + if (!buf_dblwr) { + return; + } + + ib_logf(IB_LOG_LEVEL_INFO, + "Restoring possible half-written data pages " + "from the doublewrite buffer..."); + unaligned_read_buf = static_cast(ut_malloc(2 * UNIV_PAGE_SIZE)); read_buf = static_cast( @@ -493,7 +521,9 @@ buf_dblwr_process() page_no = mach_read_from_4(page + FIL_PAGE_OFFSET); space_id = mach_read_from_4(page + FIL_PAGE_SPACE_ID); - if (!fil_tablespace_exists_in_mem(space_id)) { + FilSpace space(space_id, true); + + if (!space()) { /* Maybe we have dropped the single-table tablespace and this page once belonged to it: do nothing */ continue; @@ -508,8 +538,7 @@ buf_dblwr_process() continue; } - fil_space_t* space = fil_space_found_by_id(space_id); - ulint zip_size = fil_space_get_zip_size(space_id); + ulint zip_size = fsp_flags_get_zip_size(space()->flags); ut_ad(!buf_page_is_zeroes(page, zip_size)); /* Read in the actual page from the file */ @@ -545,7 +574,7 @@ buf_dblwr_process() if (fil_space_verify_crypt_checksum( read_buf, zip_size, NULL, page_no) || !buf_page_is_corrupted( - true, read_buf, zip_size, space)) { + true, read_buf, zip_size, space())) { /* The page is good; there is no need to consult the doublewrite buffer. */ continue; @@ -771,7 +800,7 @@ buf_dblwr_assert_on_corrupt_block( /*==============================*/ const buf_block_t* block) /*!< in: block to check */ { - buf_page_print(block->frame, 0, BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(block->frame, 0); ut_print_timestamp(stderr); fprintf(stderr, diff --git a/storage/xtradb/buf/buf0dump.cc b/storage/xtradb/buf/buf0dump.cc index e728636042b..bf384390a98 100644 --- a/storage/xtradb/buf/buf0dump.cc +++ b/storage/xtradb/buf/buf0dump.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 2011, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2011, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2017, MariaDB Corporation. All Rights Reserved. This program is free software; you can redistribute it and/or modify it under @@ -41,6 +41,7 @@ Created April 08, 2011 Vasil Dimov #include "sync0rw.h" /* rw_lock_s_lock() */ #include "ut0byte.h" /* ut_ull_create() */ #include "ut0sort.h" /* UT_SORT_FUNCTION_BODY */ +#include "mysql/service_wsrep.h" /* wsrep_recovery */ enum status_severity { STATUS_INFO, @@ -612,6 +613,7 @@ buf_load() if (dump_n == 0) { ut_free(dump); + ut_free(dump_tmp); ut_sprintf_timestamp(now); buf_load_status(STATUS_NOTICE, "Buffer pool(s) load completed at %s " @@ -685,13 +687,20 @@ extern "C" UNIV_INTERN os_thread_ret_t DECLARE_THREAD(buf_dump_thread)(void*) { + my_thread_init(); ut_ad(!srv_read_only_mode); buf_dump_status(STATUS_INFO, "Dumping buffer pool(s) not yet started"); buf_load_status(STATUS_INFO, "Loading buffer pool(s) not yet started"); if (srv_buffer_pool_load_at_startup) { +#ifdef WITH_WSREP + if (!wsrep_recovery) { +#endif /* WITH_WSREP */ buf_load(); +#ifdef WITH_WSREP + } +#endif /* WITH_WSREP */ } while (!SHUTTING_DOWN()) { @@ -715,12 +724,19 @@ DECLARE_THREAD(buf_dump_thread)(void*) } if (srv_buffer_pool_dump_at_shutdown && srv_fast_shutdown != 2) { +#ifdef WITH_WSREP + if (!wsrep_recovery) { +#endif /* WITH_WSREP */ buf_dump(FALSE /* ignore shutdown down flag, keep going even if we are in a shutdown state */); +#ifdef WITH_WSREP + } +#endif /* WITH_WSREP */ } srv_buf_dump_thread_active = false; + my_thread_end(); /* We count the number of threads in os_thread_exit(). A created thread should always use that to exit and not use return() to exit. */ os_thread_exit(NULL); diff --git a/storage/xtradb/buf/buf0flu.cc b/storage/xtradb/buf/buf0flu.cc index ffd40157c30..db7e2172e93 100644 --- a/storage/xtradb/buf/buf0flu.cc +++ b/storage/xtradb/buf/buf0flu.cc @@ -1,7 +1,7 @@ /***************************************************************************** -Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2017, MariaDB Corporation. All Rights Reserved. +Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2013, 2017, MariaDB Corporation. Copyright (c) 2013, 2014, Fusion-io This program is free software; you can redistribute it and/or modify it under @@ -62,10 +62,10 @@ is set to TRUE by the page_cleaner thread when it is spawned and is set back to FALSE at shutdown by the page_cleaner as well. Therefore no need to protect it by a mutex. It is only ever read by the thread doing the shutdown */ -UNIV_INTERN ibool buf_page_cleaner_is_active = FALSE; +UNIV_INTERN bool buf_page_cleaner_is_active; /** Flag indicating if the lru_manager is in active state. */ -UNIV_INTERN bool buf_lru_manager_is_active = false; +UNIV_INTERN bool buf_lru_manager_is_active; #ifdef UNIV_PFS_THREAD UNIV_INTERN mysql_pfs_key_t buf_page_cleaner_thread_key; @@ -352,6 +352,7 @@ buf_flush_insert_into_flush_list( buf_block_t* block, /*!< in/out: block which is modified */ lsn_t lsn) /*!< in: oldest modification */ { + ut_ad(srv_shutdown_state != SRV_SHUTDOWN_FLUSH_PHASE); ut_ad(log_flush_order_mutex_own()); ut_ad(mutex_own(&block->mutex)); @@ -410,6 +411,7 @@ buf_flush_insert_sorted_into_flush_list( buf_page_t* prev_b; buf_page_t* b; + ut_ad(srv_shutdown_state != SRV_SHUTDOWN_FLUSH_PHASE); ut_ad(log_flush_order_mutex_own()); ut_ad(mutex_own(&block->mutex)); ut_ad(buf_block_get_state(block) == BUF_BLOCK_FILE_PAGE); @@ -715,6 +717,7 @@ buf_flush_write_complete( buf_page_set_io_fix(bpage, BUF_IO_NONE); buf_pool->n_flush[flush_type]--; + ut_ad(buf_pool->n_flush[flush_type] != ULINT_MAX); #ifdef UNIV_MTFLUSH_DEBUG fprintf(stderr, "n pending flush %lu\n", @@ -873,7 +876,7 @@ buf_flush_write_block_low( buf_flush_t flush_type, /*!< in: type of flush */ bool sync) /*!< in: true if sync IO request */ { - fil_space_t* space = fil_space_acquire(bpage->space, true); + fil_space_t* space = fil_space_acquire_for_io(bpage->space); if (!space) { return; } @@ -994,10 +997,23 @@ buf_flush_write_block_low( if (sync) { ut_ad(flush_type == BUF_FLUSH_SINGLE_PAGE); fil_flush(space); + + /* The tablespace could already have been dropped, + because fil_io(request, sync) would already have + decremented the node->n_pending. However, + buf_page_io_complete() only needs to look up the + tablespace during read requests, not during writes. */ + ut_ad(buf_page_get_io_fix_unlocked(bpage) == BUF_IO_WRITE); + +#ifdef UNIV_DEBUG + dberr_t err = +#endif buf_page_io_complete(bpage); + + ut_ad(err == DB_SUCCESS); } - fil_space_release(space); + fil_space_release_for_io(space); /* Increment the counter of I/O operations used for selecting LRU policy. */ @@ -1086,6 +1102,7 @@ buf_flush_page( } ++buf_pool->n_flush[flush_type]; + ut_ad(buf_pool->n_flush[flush_type] != 0); mutex_exit(&buf_pool->flush_state_mutex); @@ -2251,13 +2268,14 @@ Clears up tail of the LRU lists: * Flush dirty pages at the tail of LRU to the disk The depth to which we scan each buffer pool is controlled by dynamic config parameter innodb_LRU_scan_depth. -@return number of pages flushed */ +@return number of flushed and evicted pages */ UNIV_INTERN ulint buf_flush_LRU_tail(void) /*====================*/ { ulint total_flushed = 0; + ulint total_evicted = 0; ulint start_time = ut_time_ms(); ulint scan_depth[MAX_BUFFER_POOLS]; ulint requested_pages[MAX_BUFFER_POOLS]; @@ -2328,6 +2346,7 @@ buf_flush_LRU_tail(void) limited_scan[i] = (previous_evicted[i] > n.evicted); previous_evicted[i] = n.evicted; + total_evicted += n.evicted; requested_pages[i] += lru_chunk_size; @@ -2368,7 +2387,7 @@ buf_flush_LRU_tail(void) } } - return(total_flushed); + return(total_flushed + total_evicted); } /*********************************************************************//** @@ -2669,6 +2688,23 @@ buf_get_total_free_list_length(void) return result; } +/** Returns the aggregate LRU list length over all buffer pool instances. +@return total LRU list length. */ +MY_ATTRIBUTE((warn_unused_result)) +static +ulint +buf_get_total_LRU_list_length(void) +{ + ulint result = 0; + + for (ulint i = 0; i < srv_buf_pool_instances; i++) { + + result += UT_LIST_GET_LEN(buf_pool_from_array(i)->LRU); + } + + return result; +} + /*********************************************************************//** Adjust the desired page cleaner thread sleep time for LRU flushes. */ MY_ATTRIBUTE((nonnull)) @@ -2681,8 +2717,9 @@ page_cleaner_adapt_lru_sleep_time( ulint lru_n_flushed) /*!< in: number of flushed in previous batch */ { - ulint free_len = buf_get_total_free_list_length(); - ulint max_free_len = srv_LRU_scan_depth * srv_buf_pool_instances; + ulint free_len = buf_get_total_free_list_length(); + ulint max_free_len = ut_min(buf_get_total_LRU_list_length(), + srv_LRU_scan_depth * srv_buf_pool_instances); if (free_len < max_free_len / 100 && lru_n_flushed) { @@ -2694,7 +2731,7 @@ page_cleaner_adapt_lru_sleep_time( /* Free lists filled more than 20% or no pages flushed in previous batch, sleep a bit more */ - *lru_sleep_time += 50; + *lru_sleep_time += 1; if (*lru_sleep_time > srv_cleaner_max_lru_time) *lru_sleep_time = srv_cleaner_max_lru_time; } else if (free_len < max_free_len / 20 && *lru_sleep_time >= 50) { @@ -2741,6 +2778,7 @@ DECLARE_THREAD(buf_flush_page_cleaner_thread)( /*!< in: a dummy parameter required by os_thread_create */ { + my_thread_init(); ulint next_loop_time = ut_time_ms() + 1000; ulint n_flushed = 0; ulint last_activity = srv_get_activity_count(); @@ -2761,8 +2799,6 @@ DECLARE_THREAD(buf_flush_page_cleaner_thread)( os_thread_pf(os_thread_get_curr_id())); #endif /* UNIV_DEBUG_THREAD_CREATION */ - buf_page_cleaner_is_active = TRUE; - while (srv_shutdown_state == SRV_SHUTDOWN_NONE) { ulint page_cleaner_sleep_time; @@ -2825,7 +2861,10 @@ DECLARE_THREAD(buf_flush_page_cleaner_thread)( when SRV_SHUTDOWN_CLEANUP is set other threads like the master and the purge threads may be working as well. We start flushing the buffer pool but can't be sure that no new pages are being - dirtied until we enter SRV_SHUTDOWN_FLUSH_PHASE phase. */ + dirtied until we enter SRV_SHUTDOWN_FLUSH_PHASE phase. Because + the LRU manager thread is also flushing at SRV_SHUTDOWN_CLEANUP + but not SRV_SHUTDOWN_FLUSH_PHASE, we only leave the + SRV_SHUTDOWN_CLEANUP loop when the LRU manager quits. */ do { n_flushed = page_cleaner_do_flush_batch(PCT_IO(100), LSN_MAX); @@ -2834,7 +2873,10 @@ DECLARE_THREAD(buf_flush_page_cleaner_thread)( if (n_flushed == 0) { os_thread_sleep(100000); } - } while (srv_shutdown_state == SRV_SHUTDOWN_CLEANUP); + + os_rmb; + } while (srv_shutdown_state == SRV_SHUTDOWN_CLEANUP + || buf_lru_manager_is_active); /* At this point all threads including the master and the purge thread must have been suspended. */ @@ -2851,6 +2893,11 @@ DECLARE_THREAD(buf_flush_page_cleaner_thread)( buf_flush_wait_batch_end(NULL, BUF_FLUSH_LIST); buf_flush_wait_LRU_batch_end(); +#ifdef UNIV_DEBUG + os_rmb; + ut_ad(!buf_lru_manager_is_active); +#endif + bool success; do { @@ -2858,7 +2905,7 @@ DECLARE_THREAD(buf_flush_page_cleaner_thread)( success = buf_flush_list(PCT_IO(100), LSN_MAX, &n_flushed); buf_flush_wait_batch_end(NULL, BUF_FLUSH_LIST); - } while (!success || n_flushed > 0); + } while (!success || n_flushed > 0 || (IS_XTRABACKUP() && buf_get_n_pending_read_ios() > 0)); /* Some sanity checks */ ut_a(srv_get_active_thread_type() == SRV_NONE); @@ -2871,8 +2918,9 @@ DECLARE_THREAD(buf_flush_page_cleaner_thread)( /* We have lived our life. Time to die. */ thread_exit: - buf_page_cleaner_is_active = FALSE; + buf_page_cleaner_is_active = false; + my_thread_end(); /* We count the number of threads in os_thread_exit(). A created thread should always use that to exit and not use return() to exit. */ os_thread_exit(NULL); @@ -2911,8 +2959,6 @@ DECLARE_THREAD(buf_flush_lru_manager_thread)( os_thread_pf(os_thread_get_curr_id())); #endif /* UNIV_DEBUG_THREAD_CREATION */ - buf_lru_manager_is_active = true; - /* On server shutdown, the LRU manager thread runs through cleanup phase to provide free pages for the master and purge threads. */ while (srv_shutdown_state == SRV_SHUTDOWN_NONE @@ -2930,6 +2976,7 @@ DECLARE_THREAD(buf_flush_lru_manager_thread)( } buf_lru_manager_is_active = false; + os_wmb; /* We count the number of threads in os_thread_exit(). A created thread should always use that to exit and not use return() to exit. */ diff --git a/storage/xtradb/buf/buf0lru.cc b/storage/xtradb/buf/buf0lru.cc index dff67c0fad6..d979eb44a96 100644 --- a/storage/xtradb/buf/buf0lru.cc +++ b/storage/xtradb/buf/buf0lru.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -1501,7 +1502,7 @@ loop: n_iterations++; - srv_stats.buf_pool_wait_free.add(n_iterations, 1); + srv_stats.buf_pool_wait_free.inc(); /* In case of backoff, do not ever attempt single page flushes and wait for the cleaner to free some pages instead. */ @@ -1595,7 +1596,7 @@ loop: ++flush_failures; } - srv_stats.buf_pool_wait_free.add(n_iterations, 1); + srv_stats.buf_pool_wait_free.inc(); n_iterations++; diff --git a/storage/xtradb/buf/buf0rea.cc b/storage/xtradb/buf/buf0rea.cc index be2ee56504b..76b71550710 100644 --- a/storage/xtradb/buf/buf0rea.cc +++ b/storage/xtradb/buf/buf0rea.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2013, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2014, MariaDB Corporation. All Rights Reserved. +Copyright (c) 2013, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -103,36 +103,46 @@ flag is cleared and the x-lock released by an i/o-handler thread. in buf_pool, or if the page is in the doublewrite buffer blocks in which case it is never read into the pool, or if the tablespace does not exist or is being dropped -@return 1 if read request is issued. 0 if it is not */ -UNIV_INTERN -ulint -buf_read_page_low( -/*==============*/ - dberr_t* err, /*!< out: DB_SUCCESS or DB_TABLESPACE_DELETED if we are - trying to read from a non-existent tablespace, or a - tablespace which is just now being dropped */ - bool sync, /*!< in: true if synchronous aio is desired */ - ulint mode, /*!< in: BUF_READ_IBUF_PAGES_ONLY, ..., - ORed to OS_AIO_SIMULATED_WAKE_LATER (see below - at read-ahead functions) */ - ulint space, /*!< in: space id */ - ulint zip_size,/*!< in: compressed page size, or 0 */ - ibool unzip, /*!< in: TRUE=request uncompressed page */ - ib_int64_t tablespace_version, /*!< in: if the space memory object has + +@param[out] err DB_SUCCESS, DB_TABLESPACE_DELETED if we are + trying to read from a non-existent tablespace, or a + tablespace which is just now being dropped, + DB_PAGE_CORRUPTED if page based on checksum + check is corrupted, or DB_DECRYPTION_FAILED + if page post encryption checksum matches but + after decryption normal page checksum does not match. +@param[in] sync true if synchronous aio is desired +@param[in] mode BUF_READ_IBUF_PAGES_ONLY, ..., + ORed to OS_AIO_SIMULATED_WAKE_LATER (see below + at read-ahead functions) +@param[in] space space id +@param[in] zip_size compressed page size, or 0 +@param[in] unzip TRUE=request uncompressed page +@param[in] tablespace_version if the space memory object has this timestamp different from what we are giving here, treat the tablespace as dropped; this is a timestamp we use to stop dangling page reads from a tablespace - which we have DISCARDed + IMPORTed back */ - ulint offset, /*!< in: page number */ - trx_t* trx, /*!< in: trx */ - buf_page_t** rbpage) /*!< out: page */ + which we have DISCARDed + IMPORTed back +@param[in] offset page number +@param[in] trx transaction +@return 1 if read request is issued. 0 if it is not */ +static +ulint +buf_read_page_low( + dberr_t* err, + bool sync, + ulint mode, + ulint space, + ulint zip_size, + ibool unzip, + ib_int64_t tablespace_version, + ulint offset, + trx_t* trx = NULL) { buf_page_t* bpage; ulint wake_later; ibool ignore_nonexistent_pages; - *err = DB_SUCCESS; - wake_later = mode & OS_AIO_SIMULATED_WAKE_LATER; mode = mode & ~OS_AIO_SIMULATED_WAKE_LATER; @@ -259,18 +269,13 @@ not_to_recover: if (sync) { /* The i/o is already completed when we arrive from fil_read */ - if (!buf_page_io_complete(bpage)) { - if (rbpage) { - *rbpage = bpage; - } + *err = buf_page_io_complete(bpage); + + if (*err != DB_SUCCESS) { return(0); } } - if (rbpage) { - *rbpage = bpage; - } - return(1); } @@ -307,7 +312,7 @@ buf_read_ahead_random( ulint ibuf_mode; ulint count; ulint low, high; - dberr_t err; + dberr_t err = DB_SUCCESS; ulint i; const ulint buf_read_ahead_random_area = BUF_READ_AHEAD_AREA(buf_pool); @@ -402,20 +407,35 @@ read_ahead: mode: hence FALSE as the first parameter */ if (!ibuf_bitmap_page(zip_size, i)) { + count += buf_read_page_low( &err, false, ibuf_mode | OS_AIO_SIMULATED_WAKE_LATER, space, zip_size, FALSE, - tablespace_version, i, trx, NULL); - if (err == DB_TABLESPACE_DELETED) { - ut_print_timestamp(stderr); - fprintf(stderr, - " InnoDB: Warning: in random" - " readahead trying to access\n" - "InnoDB: tablespace %lu page %lu,\n" - "InnoDB: but the tablespace does not" - " exist or is just being dropped.\n", - (ulong) space, (ulong) i); + tablespace_version, i, trx); + + switch(err) { + case DB_SUCCESS: + case DB_ERROR: + break; + case DB_TABLESPACE_DELETED: + ib_logf(IB_LOG_LEVEL_WARN, + "In random" + " readahead trying to access" + " tablespace " ULINTPF ":" ULINTPF + " but the tablespace does not" + " exist or is just being dropped.", + space, i); + break; + case DB_DECRYPTION_FAILED: + case DB_PAGE_CORRUPTED: + ib_logf(IB_LOG_LEVEL_ERROR, + "Random readahead failed to decrypt page or page corrupted " + ULINTPF ":" ULINTPF ".", + i, space); + break; + default: + ib_logf(IB_LOG_LEVEL_FATAL, "Error %u (%s) in random readahead", err, ut_strerr(err)); } } } @@ -449,44 +469,60 @@ High-level function which reads a page asynchronously from a file to the buffer buf_pool if it is not already there. Sets the io_fix flag and sets an exclusive lock on the buffer frame. The flag is cleared and the x-lock released by the i/o-handler thread. -@return TRUE if page has been read in, FALSE in case of failure */ + +@param[in] space_id space_id +@param[in] zip_size compressed page size in bytes, or 0 +@param[in] offset page number +@param[in] trx transaction +@param[out] encrypted true if page encrypted +@return DB_SUCCESS if page has been read and is not corrupted, +@retval DB_PAGE_CORRUPTED if page based on checksum check is corrupted, +@retval DB_DECRYPTION_FAILED if page post encryption checksum matches but +after decryption normal page checksum does not match. +@retval DB_TABLESPACE_DELETED if tablespace .ibd file is missing */ UNIV_INTERN -ibool +dberr_t buf_read_page( -/*==========*/ - ulint space, /*!< in: space id */ - ulint zip_size, /*!< in: compressed page size in bytes, or 0 */ - ulint offset, /*!< in: page number */ - trx_t* trx, /*!< in: trx */ - buf_page_t** bpage) /*!< out: page */ + ulint space_id, + ulint zip_size, + ulint offset, + trx_t* trx) { ib_int64_t tablespace_version; ulint count; - dberr_t err; + dberr_t err = DB_SUCCESS; - tablespace_version = fil_space_get_version(space); + tablespace_version = fil_space_get_version(space_id); - /* We do the i/o in the synchronous aio mode to save thread - switches: hence TRUE */ + FilSpace space(space_id, true); - count = buf_read_page_low(&err, true, BUF_READ_ANY_PAGE, space, + if (space()) { + + /* We do the i/o in the synchronous aio mode to save thread + switches: hence TRUE */ + count = buf_read_page_low(&err, true, BUF_READ_ANY_PAGE, space_id, zip_size, FALSE, - tablespace_version, offset, trx, bpage); - srv_stats.buf_pool_reads.add(count); - if (err == DB_TABLESPACE_DELETED) { - ut_print_timestamp(stderr); - fprintf(stderr, - " InnoDB: Error: trying to access" - " tablespace %lu page no. %lu,\n" - "InnoDB: but the tablespace does not exist" - " or is just being dropped.\n", - (ulong) space, (ulong) offset); + tablespace_version, offset, trx); + + srv_stats.buf_pool_reads.add(count); + } + + /* Page corruption and decryption failures are already reported + in above function. */ + if (!space() || err == DB_TABLESPACE_DELETED) { + err = DB_TABLESPACE_DELETED; + ib_logf(IB_LOG_LEVEL_ERROR, + "Trying to access" + " tablespace [space=" ULINTPF ": page=" ULINTPF + "] but the tablespace does not exist" + " or is just being dropped.", + space_id, offset); } /* Increment number of I/O operations used for LRU policy. */ buf_LRU_stat_inc_io(); - return(count > 0); + return(err); } /********************************************************************//** @@ -494,23 +530,23 @@ High-level function which reads a page asynchronously from a file to the buffer buf_pool if it is not already there. Sets the io_fix flag and sets an exclusive lock on the buffer frame. The flag is cleared and the x-lock released by the i/o-handler thread. -@return TRUE if page has been read in, FALSE in case of failure */ +@param[in] space Tablespace id +@param[in] offset Page no */ UNIV_INTERN -ibool +void buf_read_page_async( -/*================*/ - ulint space, /*!< in: space id */ - ulint offset) /*!< in: page number */ + ulint space, + ulint offset) { ulint zip_size; ib_int64_t tablespace_version; ulint count; - dberr_t err; + dberr_t err = DB_SUCCESS; zip_size = fil_space_get_zip_size(space); if (zip_size == ULINT_UNDEFINED) { - return(FALSE); + return; } tablespace_version = fil_space_get_version(space); @@ -519,7 +555,32 @@ buf_read_page_async( | OS_AIO_SIMULATED_WAKE_LATER | BUF_READ_IGNORE_NONEXISTENT_PAGES, space, zip_size, FALSE, - tablespace_version, offset, NULL,NULL); + tablespace_version, offset); + + switch(err) { + case DB_SUCCESS: + case DB_ERROR: + break; + case DB_TABLESPACE_DELETED: + ib_logf(IB_LOG_LEVEL_ERROR, + "In async page read " + "trying to access " + "page " ULINTPF ":" ULINTPF + " in nonexisting or being-dropped tablespace", + space, offset); + break; + + case DB_DECRYPTION_FAILED: + case DB_PAGE_CORRUPTED: + ib_logf(IB_LOG_LEVEL_ERROR, + "Async page read failed to decrypt page or page corrupted " + ULINTPF ":" ULINTPF ".", + space, offset); + break; + default: + ib_logf(IB_LOG_LEVEL_FATAL, "Error %u (%s) in async page read", err, ut_strerr(err)); + } + srv_stats.buf_pool_reads.add(count); /* We do not increment number of I/O operations used for LRU policy @@ -528,8 +589,6 @@ buf_read_page_async( buffer pool. Since this function is called from buffer pool load these IOs are deliberate and are not part of normal workload we can ignore these in our heuristics. */ - - return(count > 0); } /********************************************************************//** @@ -580,7 +639,7 @@ buf_read_ahead_linear( ulint fail_count; ulint ibuf_mode; ulint low, high; - dberr_t err; + dberr_t err = DB_SUCCESS; ulint i; const ulint buf_read_ahead_linear_area = BUF_READ_AHEAD_AREA(buf_pool); @@ -784,19 +843,36 @@ buf_read_ahead_linear( aio mode: hence FALSE as the first parameter */ if (!ibuf_bitmap_page(zip_size, i)) { + count += buf_read_page_low( &err, false, ibuf_mode, - space, zip_size, FALSE, tablespace_version, i, trx, NULL); - if (err == DB_TABLESPACE_DELETED) { - ut_print_timestamp(stderr); - fprintf(stderr, - " InnoDB: Warning: in" - " linear readahead trying to access\n" - "InnoDB: tablespace %lu page %lu,\n" - "InnoDB: but the tablespace does not" - " exist or is just being dropped.\n", - (ulong) space, (ulong) i); + space, zip_size, FALSE, tablespace_version, + i, trx); + + switch(err) { + case DB_SUCCESS: + case DB_ERROR: + break; + case DB_TABLESPACE_DELETED: + ib_logf(IB_LOG_LEVEL_WARN, + "In linear" + " readahead trying to access" + " tablespace " ULINTPF ":" ULINTPF + " but the tablespace does not" + " exist or is just being dropped.", + space, i); + break; + + case DB_DECRYPTION_FAILED: + case DB_PAGE_CORRUPTED: + ib_logf(IB_LOG_LEVEL_ERROR, + "Linear readahead failed to decrypt page or page corrupted" + ULINTPF ":" ULINTPF ".", + i, space); + break; + default: + ib_logf(IB_LOG_LEVEL_FATAL, "Error %u (%s) in linear readahead", err, ut_strerr(err)); } } } @@ -858,9 +934,9 @@ buf_read_ibuf_merge_pages( #endif for (i = 0; i < n_stored; i++) { - dberr_t err; buf_pool_t* buf_pool; ulint zip_size = fil_space_get_zip_size(space_ids[i]); + dberr_t err = DB_SUCCESS; buf_pool = buf_pool_get(space_ids[i], page_nos[i]); @@ -870,23 +946,34 @@ buf_read_ibuf_merge_pages( } if (UNIV_UNLIKELY(zip_size == ULINT_UNDEFINED)) { - goto tablespace_deleted; } buf_read_page_low(&err, sync && (i + 1 == n_stored), BUF_READ_ANY_PAGE, space_ids[i], zip_size, TRUE, space_versions[i], - page_nos[i], NULL, NULL); + page_nos[i], NULL); + + switch(err) { + case DB_SUCCESS: + case DB_ERROR: + break; + case DB_TABLESPACE_DELETED: - if (UNIV_UNLIKELY(err == DB_TABLESPACE_DELETED)) { tablespace_deleted: /* We have deleted or are deleting the single-table - tablespace: remove the entries for that page */ - - ibuf_merge_or_delete_for_page(NULL, space_ids[i], - page_nos[i], - zip_size, FALSE); + tablespace: remove the entries for tablespace. */ + ibuf_delete_for_discarded_space(space_ids[i]); + break; + case DB_DECRYPTION_FAILED: + case DB_PAGE_CORRUPTED: + ib_logf(IB_LOG_LEVEL_ERROR, + "Failed to decrypt insert buffer page or page corrupted " + ULINTPF ":" ULINTPF ".", + space_ids[i], page_nos[i]); + break; + default: + ib_logf(IB_LOG_LEVEL_FATAL, "Error %u (%s) in insert buffer read", err, ut_strerr(err)); } } @@ -924,7 +1011,7 @@ buf_read_recv_pages( { ib_int64_t tablespace_version; ulint count; - dberr_t err; + dberr_t err = DB_SUCCESS; ulint i; zip_size = fil_space_get_zip_size(space); @@ -1013,12 +1100,20 @@ not_to_recover: if ((i + 1 == n_stored) && sync) { buf_read_page_low(&err, true, BUF_READ_ANY_PAGE, space, zip_size, TRUE, tablespace_version, - page_nos[i], NULL, NULL); + page_nos[i], NULL); } else { buf_read_page_low(&err, false, BUF_READ_ANY_PAGE | OS_AIO_SIMULATED_WAKE_LATER, space, zip_size, TRUE, - tablespace_version, page_nos[i], NULL, NULL); + tablespace_version, page_nos[i], + NULL); + } + + if (err == DB_DECRYPTION_FAILED) { + ib_logf(IB_LOG_LEVEL_ERROR, + "Recovery failed to decrypt read page " + ULINTPF ":" ULINTPF ".", + space, page_nos[i]); } } diff --git a/storage/xtradb/dict/dict0crea.cc b/storage/xtradb/dict/dict0crea.cc index 1ada35a89a2..6d5b12474eb 100644 --- a/storage/xtradb/dict/dict0crea.cc +++ b/storage/xtradb/dict/dict0crea.cc @@ -692,7 +692,7 @@ dict_create_index_tree_step( dberr_t err = DB_SUCCESS; ulint zip_size = dict_table_zip_size(index->table); - if (node->index->table->ibd_file_missing + if (node->index->table->file_unreadable || dict_table_is_discarded(node->index->table)) { node->page_no = FIL_NULL; diff --git a/storage/xtradb/dict/dict0dict.cc b/storage/xtradb/dict/dict0dict.cc index 49de1cf7ef8..7550943de7a 100644 --- a/storage/xtradb/dict/dict0dict.cc +++ b/storage/xtradb/dict/dict0dict.cc @@ -888,6 +888,12 @@ dict_index_get_nth_col_or_prefix_pos( ut_ad(index); ut_ad(index->magic_n == DICT_INDEX_MAGIC_N); + ut_ad((inc_prefix && !prefix_col_pos) || (!inc_prefix)); + + if (!prefix_col_pos) { + prefix_col_pos = &prefixed_pos_dummy; + } + *prefix_col_pos = ULINT_UNDEFINED; if (!prefix_col_pos) { prefix_col_pos = &prefixed_pos_dummy; @@ -1185,14 +1191,31 @@ dict_table_open_on_name( if (table != NULL) { - /* If table is encrypted return table */ + /* If table is encrypted or corrupted */ if (ignore_err == DICT_ERR_IGNORE_NONE - && table->is_encrypted) { + && !table->is_readable()) { /* Make life easy for drop table. */ if (table->can_be_evicted) { dict_table_move_from_lru_to_non_lru(table); } + if (table->corrupted) { + + if (!dict_locked) { + mutex_exit(&dict_sys->mutex); + } + + char buf[MAX_FULL_NAME_LEN]; + ut_format_name(table->name, TRUE, buf, sizeof(buf)); + + ib_logf(IB_LOG_LEVEL_ERROR, + "Table %s is corrupted. Please " + "drop the table and recreate.", + buf); + + return(NULL); + } + if (table->can_be_evicted) { dict_move_to_mru(table); } @@ -1205,28 +1228,6 @@ dict_table_open_on_name( return (table); } - /* If table is corrupted, return NULL */ - else if (ignore_err == DICT_ERR_IGNORE_NONE - && table->corrupted) { - - /* Make life easy for drop table. */ - if (table->can_be_evicted) { - dict_table_move_from_lru_to_non_lru(table); - } - - if (!dict_locked) { - mutex_exit(&dict_sys->mutex); - } - - ut_print_timestamp(stderr); - - fprintf(stderr, " InnoDB: table "); - ut_print_name(stderr, NULL, TRUE, table->name); - fprintf(stderr, "is corrupted. Please drop the table " - "and recreate\n"); - - return(NULL); - } if (table->can_be_evicted) { dict_move_to_mru(table); @@ -1394,9 +1395,6 @@ dict_table_add_to_cache( dict_table_autoinc_restore(table); ut_ad(dict_lru_validate()); - - dict_sys->size += mem_heap_get_size(table->heap) - + strlen(table->name) + 1; } /**********************************************************************//** @@ -1811,9 +1809,6 @@ dict_table_rename_in_cache( HASH_INSERT(dict_table_t, name_hash, dict_sys->table_hash, fold, table); - dict_sys->size += strlen(new_name) - strlen(old_name); - ut_a(dict_sys->size > 0); - /* Update the table_name field in indexes */ for (index = dict_table_get_first_index(table); index != NULL; @@ -2100,7 +2095,6 @@ dict_table_remove_from_cache_low( { dict_foreign_t* foreign; dict_index_t* index; - ulint size; ut_ad(table); ut_ad(dict_lru_validate()); @@ -2180,12 +2174,6 @@ dict_table_remove_from_cache_low( trx_free_for_background(trx); } - size = mem_heap_get_size(table->heap) + strlen(table->name) + 1; - - ut_ad(dict_sys->size >= size); - - dict_sys->size -= size; - dict_mem_table_free(table); } @@ -2429,9 +2417,13 @@ dict_index_too_big_for_tree( rec_max_size = 2; } else { /* The maximum allowed record size is half a B-tree - page. No additional sparse page directory entry will - be generated for the first few user records. */ - page_rec_max = page_get_free_space_of_empty(comp) / 2; + page(16k for 64k page size). No additional sparse + page directory entry will be generated for the first + few user records. */ + page_rec_max = (comp || UNIV_PAGE_SIZE < UNIV_PAGE_SIZE_MAX) + ? page_get_free_space_of_empty(comp) / 2 + : REDUNDANT_REC_MAX_DATA_SIZE; + page_ptr_max = page_rec_max; /* Each record has a header. */ rec_max_size = comp @@ -2515,7 +2507,6 @@ add_field_size: /* Check the size limit on leaf pages. */ if (UNIV_UNLIKELY(rec_max_size >= page_rec_max)) { - return(TRUE); } @@ -2728,8 +2719,6 @@ undo_size_ok: dict_index_is_ibuf(index) ? SYNC_IBUF_INDEX_TREE : SYNC_INDEX_TREE); - dict_sys->size += mem_heap_get_size(new_index->heap); - dict_mem_index_free(index); return(DB_SUCCESS); @@ -2746,7 +2735,6 @@ dict_index_remove_from_cache_low( ibool lru_evict) /*!< in: TRUE if index being evicted to make room in the table LRU list */ { - ulint size; ulint retries = 0; btr_search_t* info; @@ -2815,12 +2803,6 @@ dict_index_remove_from_cache_low( /* Remove the index from the list of indexes of the table */ UT_LIST_REMOVE(indexes, table->indexes, index); - size = mem_heap_get_size(index->heap); - - ut_ad(dict_sys->size >= size); - - dict_sys->size -= size; - dict_mem_index_free(index); } @@ -6183,11 +6165,29 @@ dict_set_corrupted_by_space( /* mark the table->corrupted bit only, since the caller could be too deep in the stack for SYS_INDEXES update */ - table->corrupted = TRUE; + table->corrupted = true; + table->file_unreadable = true; return(TRUE); } + +/** Flags a table with specified space_id encrypted in the data dictionary +cache +@param[in] space_id Tablespace id */ +UNIV_INTERN +void +dict_set_encrypted_by_space(ulint space_id) +{ + dict_table_t* table; + + table = dict_find_table_by_space(space_id); + + if (table) { + table->file_unreadable = true; + } +} + /**********************************************************************//** Flags an index corrupted both in the data dictionary cache and in the SYS_INDEXES */ @@ -6325,43 +6325,6 @@ dict_set_corrupted_index_cache_only( index->type |= DICT_CORRUPT; } -/************************************************************************* -set is_corrupt flag by space_id*/ - -void -dict_table_set_corrupt_by_space( -/*============================*/ - ulint space_id, - ibool need_mutex) -{ - dict_table_t* table; - ibool found = FALSE; - - ut_a(space_id != 0 && space_id < SRV_LOG_SPACE_FIRST_ID); - - if (need_mutex) - mutex_enter(&(dict_sys->mutex)); - - table = UT_LIST_GET_FIRST(dict_sys->table_LRU); - - while (table) { - if (table->space == space_id) { - table->is_corrupt = TRUE; - found = TRUE; - } - - table = UT_LIST_GET_NEXT(table_LRU, table); - } - - if (need_mutex) - mutex_exit(&(dict_sys->mutex)); - - if (!found) { - fprintf(stderr, "InnoDB: space to be marked as " - "crashed was not found for id " ULINTPF ".\n", - space_id); - } -} #endif /* !UNIV_HOTBACKUP */ /**********************************************************************//** @@ -6683,7 +6646,8 @@ dict_table_schema_check( } } - if (table->ibd_file_missing) { + if (!table->is_readable() && + fil_space_get(table->space) == NULL) { /* missing tablespace */ ut_snprintf(errstr, errstr_sz, @@ -7340,3 +7304,38 @@ dict_tf_to_row_format_string( return(0); } #endif /* !UNIV_HOTBACKUP */ + +/** Calculate the used memory occupied by the data dictionary +table and index objects. +@return number of bytes occupied. */ +UNIV_INTERN +ulint +dict_sys_get_size() +{ + ulint size = 0; + + ut_ad(dict_sys); + + mutex_enter(&dict_sys->mutex); + + for(ulint i = 0; i < hash_get_n_cells(dict_sys->table_hash); i++) { + dict_table_t* table; + + for (table = static_cast(HASH_GET_FIRST(dict_sys->table_hash,i)); + table != NULL; + table = static_cast(HASH_GET_NEXT(name_hash, table))) { + dict_index_t* index; + size += mem_heap_get_size(table->heap) + strlen(table->name) +1; + + for(index = dict_table_get_first_index(table); + index != NULL; + index = dict_table_get_next_index(index)) { + size += mem_heap_get_size(index->heap); + } + } + } + + mutex_exit(&dict_sys->mutex); + + return (size); +} diff --git a/storage/xtradb/dict/dict0load.cc b/storage/xtradb/dict/dict0load.cc index b843891f16c..4c3dd47761f 100644 --- a/storage/xtradb/dict/dict0load.cc +++ b/storage/xtradb/dict/dict0load.cc @@ -945,6 +945,10 @@ dict_insert_tablespace_and_filepath( return(err); } +/* Set by Xtrabackup */ +my_bool (*dict_check_if_skip_table)(const char* name) = 0; + + /********************************************************************//** This function looks at each table defined in SYS_TABLES. It checks the tablespace for any table with a space_id > 0. It looks up the tablespace @@ -1064,6 +1068,9 @@ loop: bool is_temp = false; bool discarded = false; + bool print_error_if_does_not_exist; + bool remove_from_data_dict_if_does_not_exist; + ib_uint32_t flags2 = static_cast( mach_read_from_4(field)); @@ -1089,6 +1096,19 @@ loop: goto loop; } + + ut_a(!IS_XTRABACKUP() || dict_check_if_skip_table); + + if (is_temp || discarded || + (IS_XTRABACKUP() && dict_check_if_skip_table(name))) { + print_error_if_does_not_exist = false; + } + else { + print_error_if_does_not_exist = true; + } + + remove_from_data_dict_if_does_not_exist = IS_XTRABACKUP() && !(is_temp || discarded); + mtr_commit(&mtr); switch (dict_check) { @@ -1096,8 +1116,8 @@ loop: /* All tablespaces should have been found in fil_load_single_table_tablespaces(). */ if (fil_space_for_table_exists_in_mem( - space_id, name, !(is_temp || discarded), - false, NULL, 0, flags) + space_id, name, print_error_if_does_not_exist, + remove_from_data_dict_if_does_not_exist , false, NULL, 0, flags) && !(is_temp || discarded)) { /* If user changes the path of .ibd files in *.isl files before doing crash recovery , @@ -1130,7 +1150,7 @@ loop: trx_resurrect_table_locks(). */ if (fil_space_for_table_exists_in_mem( space_id, name, false, - false, NULL, 0, flags)) { + false, false, NULL, 0, flags)) { break; } /* fall through */ @@ -1173,7 +1193,7 @@ loop: dberr_t err = fil_open_single_table_tablespace( read_page_0, srv_read_only_mode ? false : true, space_id, dict_tf_to_fsp_flags(flags), - name, filepath, NULL); + name, filepath); if (err != DB_SUCCESS) { ib_logf(IB_LOG_LEVEL_ERROR, @@ -1964,7 +1984,7 @@ dict_load_indexes( dict_mem_index_free(index); goto func_exit; } else if (index->page == FIL_NULL - && !table->ibd_file_missing + && !table->file_unreadable && (!(index->type & DICT_FTS))) { fprintf(stderr, @@ -2193,7 +2213,7 @@ err_len: (*table)->id = mach_read_from_8(field); - (*table)->ibd_file_missing = FALSE; + (*table)->file_unreadable = false; return(NULL); } @@ -2380,15 +2400,15 @@ err_exit: "Table '%s' tablespace is set as discarded.", table_name); - table->ibd_file_missing = TRUE; + table->file_unreadable = true; } else if (!fil_space_for_table_exists_in_mem( - table->space, name, false, true, heap, + table->space, name, false, IS_XTRABACKUP(), true, heap, table->id, table->flags)) { if (DICT_TF2_FLAG_IS_SET(table, DICT_TF2_TEMPORARY)) { /* Do not bother to retry opening temporary tables. */ - table->ibd_file_missing = TRUE; + table->file_unreadable = true; } else { if (!(ignore_err & DICT_ERR_IGNORE_RECOVER_LOCK)) { @@ -2417,14 +2437,15 @@ err_exit: err = fil_open_single_table_tablespace( true, false, table->space, dict_tf_to_fsp_flags(table->flags), - name, filepath, table); + name, filepath); if (err != DB_SUCCESS) { /* We failed to find a sensible tablespace file */ - table->ibd_file_missing = TRUE; + table->file_unreadable = true; } + if (filepath) { mem_free(filepath); } @@ -2448,9 +2469,10 @@ err_exit: were not allowed while the table is being locked by a transaction. */ dict_err_ignore_t index_load_err = !(ignore_err & DICT_ERR_IGNORE_RECOVER_LOCK) - && table->ibd_file_missing + && table->file_unreadable ? DICT_ERR_IGNORE_ALL : ignore_err; + err = dict_load_indexes(table, heap, index_load_err); if (err == DB_INDEX_CORRUPT) { @@ -2485,7 +2507,7 @@ err_exit: of the error condition, since the user may want to dump data from the clustered index. However we load the foreign key information only if all indexes were loaded. */ - if (!cached || table->ibd_file_missing) { + if (!cached || table->file_unreadable) { /* Don't attempt to load the indexes from disk. */ } else if (err == DB_SUCCESS) { err = dict_load_foreigns(table->name, NULL, true, true, @@ -2518,12 +2540,12 @@ err_exit: table = NULL; } else if (dict_index_is_corrupted(index) - && !table->ibd_file_missing) { + && !table->file_unreadable) { /* It is possible we force to load a corrupted clustered index if srv_load_corrupted is set. Mark the table as corrupted in this case */ - table->corrupted = TRUE; + table->corrupted = true; } } @@ -2532,7 +2554,7 @@ func_exit: ut_ad(!table || ignore_err != DICT_ERR_IGNORE_NONE - || table->ibd_file_missing + || table->file_unreadable || !table->corrupted); if (table && table->fts) { diff --git a/storage/xtradb/dict/dict0mem.cc b/storage/xtradb/dict/dict0mem.cc index bde72b83c54..125d7d78a1f 100644 --- a/storage/xtradb/dict/dict0mem.cc +++ b/storage/xtradb/dict/dict0mem.cc @@ -2,6 +2,7 @@ Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. +Copyright (c) 2013, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -137,8 +138,6 @@ dict_mem_table_create( table->fts = NULL; } - table->is_corrupt = FALSE; - #endif /* !UNIV_HOTBACKUP */ new(&table->foreign_set) dict_foreign_set(); @@ -321,8 +320,8 @@ dict_mem_table_col_rename_low( ut_ad(from_len <= NAME_LEN); ut_ad(to_len <= NAME_LEN); - char from[NAME_LEN]; - strncpy(from, s, NAME_LEN); + char from[NAME_LEN + 1]; + strncpy(from, s, NAME_LEN + 1); if (from_len == to_len) { /* The easy case: simply replace the column name in diff --git a/storage/xtradb/dict/dict0stats.cc b/storage/xtradb/dict/dict0stats.cc index 33b6c2e23e0..c1463e98ce0 100644 --- a/storage/xtradb/dict/dict0stats.cc +++ b/storage/xtradb/dict/dict0stats.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 2009, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2015, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -920,7 +921,11 @@ dict_stats_update_transient_for_index( index->stat_n_leaf_pages = size; - btr_estimate_number_of_different_key_vals(index); + /* Do not continue if table decryption has failed or + table is already marked as corrupted. */ + if (index->is_readable()) { + btr_estimate_number_of_different_key_vals(index); + } } } @@ -974,8 +979,9 @@ dict_stats_update_transient( continue; } - /* Do not continue if table decryption has failed. */ - if (index->table->is_encrypted) { + /* Do not continue if table decryption has failed or + table is already marked as corrupted. */ + if (!index->is_readable()) { break; } @@ -1162,8 +1168,9 @@ dict_stats_analyze_index_level( leaf-level delete marks because delete marks on non-leaf level do not make sense. */ - if (level == 0 && srv_stats_include_delete_marked? 0: - rec_get_deleted_flag( + if (level == 0 + && !srv_stats_include_delete_marked + && rec_get_deleted_flag( rec, page_is_comp(btr_pcur_get_page(&pcur)))) { @@ -2437,6 +2444,61 @@ dict_stats_save_index_stat( return(ret); } +/** Report error if statistic update for a table failed because +.ibd file is missing, table decryption failed or table is corrupted. +@param[in,out] table Table +@param[in] defragment true if statistics is for defragment +@return DB_DECRYPTION_FAILED, DB_TABLESPACE_DELETED or DB_CORRUPTION +@retval DB_DECRYPTION_FAILED if decryption of the table failed +@retval DB_TABLESPACE_DELETED if .ibd file is missing +@retval DB_CORRUPTION if table is marked as corrupted */ +static +dberr_t +dict_stats_report_error( + dict_table_t* table, + bool defragment = false) +{ + char buf[3 * NAME_LEN]; + dberr_t err; + + innobase_format_name(buf, sizeof buf, + table->name, + true); + + FilSpace space(table->space); + + if (space()) { + if (table->corrupted) { + ib_logf(IB_LOG_LEVEL_INFO, + "Cannot save%s statistics because " + " table %s in file %s is corrupted.", + defragment ? " defragment" : " ", + buf, space()->chain.start->name); + err = DB_CORRUPTION; + } else { + ib_logf(IB_LOG_LEVEL_INFO, + "Cannot save%s statistics because " + " table %s in file %s can't be decrypted.", + defragment ? " defragment" : " ", + buf, space()->chain.start->name); + err = DB_DECRYPTION_FAILED; + } + } else { + ib_logf(IB_LOG_LEVEL_INFO, + "Cannot save%s statistics for " + " table %s because .ibd file is missing." + " For help, please " + "refer to " REFMAN "innodb-troubleshooting.html.", + defragment ? " defragment" : " ", + buf); + err = DB_TABLESPACE_DELETED; + } + + dict_stats_empty_table(table, defragment); + + return (err); +} + /** Save the table's statistics into the persistent statistics storage. @param[in] table_orig table whose stats to save @param[in] only_for_index if this is non-NULL, then stats for indexes @@ -2457,6 +2519,11 @@ dict_stats_save( char db_utf8[MAX_DB_UTF8_LEN]; char table_utf8[MAX_TABLE_UTF8_LEN]; + if (table_orig->is_readable()) { + } else { + return (dict_stats_report_error(table_orig)); + } + table = dict_stats_snapshot_create(table_orig); dict_fs2utf8(table->name, db_utf8, sizeof(db_utf8), @@ -3192,15 +3259,8 @@ dict_stats_update( ut_ad(!mutex_own(&dict_sys->mutex)); - if (table->ibd_file_missing) { - ut_print_timestamp(stderr); - fprintf(stderr, - " InnoDB: cannot calculate statistics for table %s " - "because the .ibd file is missing. For help, please " - "refer to " REFMAN "innodb-troubleshooting.html\n", - ut_format_name(table->name, TRUE, buf, sizeof(buf))); - dict_stats_empty_table(table, true); - return(DB_TABLESPACE_DELETED); + if (!table->is_readable()) { + return (dict_stats_report_error(table)); } else if (srv_force_recovery >= SRV_FORCE_NO_IBUF_MERGE) { /* If we have set a high innodb_force_recovery level, do not calculate statistics, as a badly corrupted index can @@ -3946,19 +4006,10 @@ dict_stats_save_defrag_stats( { dberr_t ret; - if (index->table->ibd_file_missing) { - ut_print_timestamp(stderr); - fprintf(stderr, - " InnoDB: Cannot save defragment stats because " - ".ibd file is missing.\n"); - return (DB_TABLESPACE_DELETED); - } - if (dict_index_is_corrupted(index)) { - ut_print_timestamp(stderr); - fprintf(stderr, - " InnoDB: Cannot save defragment stats because " - "index is corrupted.\n"); - return(DB_CORRUPTION); + + if (index->is_readable()) { + } else { + return (dict_stats_report_error(index->table, true)); } if (dict_index_is_univ(index)) { diff --git a/storage/xtradb/dict/dict0stats_bg.cc b/storage/xtradb/dict/dict0stats_bg.cc index 55d34ff6ae1..ba6fd115551 100644 --- a/storage/xtradb/dict/dict0stats_bg.cc +++ b/storage/xtradb/dict/dict0stats_bg.cc @@ -1,7 +1,7 @@ /***************************************************************************** -Copyright (c) 2012, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. All Rights Reserved. +Copyright (c) 2012, 2017, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -39,12 +39,18 @@ Created Apr 25, 2012 Vasil Dimov /** Minimum time interval between stats recalc for a given table */ #define MIN_RECALC_INTERVAL 10 /* seconds */ -#define SHUTTING_DOWN() (srv_shutdown_state != SRV_SHUTDOWN_NONE) - /** Event to wake up dict_stats_thread on dict_stats_recalc_pool_add() or shutdown. Not protected by any mutex. */ UNIV_INTERN os_event_t dict_stats_event; +/** Variable to initiate shutdown the dict stats thread. Note we don't +use 'srv_shutdown_state' because we want to shutdown dict stats thread +before purge thread. */ +static bool dict_stats_start_shutdown; + +/** Event to wait for shutdown of the dict stats thread */ +static os_event_t dict_stats_shutdown_event; + /** This mutex protects the "recalc_pool" variable. */ static ib_mutex_t recalc_pool_mutex; static ib_mutex_t defrag_pool_mutex; @@ -341,11 +347,11 @@ Must be called before dict_stats_thread() is started. */ UNIV_INTERN void dict_stats_thread_init() -/*====================*/ { ut_a(!srv_read_only_mode); dict_stats_event = os_event_create(); + dict_stats_shutdown_event = os_event_create(); /* The recalc_pool_mutex is acquired from: 1) the background stats gathering thread before any other latch @@ -390,6 +396,9 @@ dict_stats_thread_deinit() os_event_free(dict_stats_event); dict_stats_event = NULL; + os_event_free(dict_stats_shutdown_event); + dict_stats_shutdown_event = NULL; + dict_stats_start_shutdown = false; } /*****************************************************************//** @@ -530,9 +539,10 @@ extern "C" UNIV_INTERN os_thread_ret_t DECLARE_THREAD(dict_stats_thread)(void*) { + my_thread_init(); ut_a(!srv_read_only_mode); - while (!SHUTTING_DOWN()) { + while (!dict_stats_start_shutdown) { /* Wake up periodically even if not signaled. This is because we may lose an event - if the below call to @@ -542,7 +552,7 @@ DECLARE_THREAD(dict_stats_thread)(void*) os_event_wait_time( dict_stats_event, MIN_RECALC_INTERVAL * 1000000); - if (SHUTTING_DOWN()) { + if (dict_stats_start_shutdown) { break; } @@ -556,9 +566,20 @@ DECLARE_THREAD(dict_stats_thread)(void*) srv_dict_stats_thread_active = false; + os_event_set(dict_stats_shutdown_event); + my_thread_end(); /* We count the number of threads in os_thread_exit(). A created thread should always use that to exit instead of return(). */ os_thread_exit(NULL); OS_THREAD_DUMMY_RETURN; } + +/** Shut down the dict_stats_thread. */ +void +dict_stats_shutdown() +{ + dict_stats_start_shutdown = true; + os_event_set(dict_stats_event); + os_event_wait(dict_stats_shutdown_event); +} diff --git a/storage/xtradb/fil/fil0crypt.cc b/storage/xtradb/fil/fil0crypt.cc index f37d5e19ad6..167f9e48273 100644 --- a/storage/xtradb/fil/fil0crypt.cc +++ b/storage/xtradb/fil/fil0crypt.cc @@ -25,13 +25,18 @@ Modified Jan Lindström jan.lindstrom@mariadb.com #include "fil0fil.h" #include "fil0crypt.h" +#include "mach0data.h" +#include "page0zip.h" +#include "buf0buf.h" +#include "buf0checksum.h" + +#ifndef UNIV_INNOCHECKSUM + #include "srv0srv.h" #include "srv0start.h" -#include "mach0data.h" #include "log0recv.h" #include "mtr0mtr.h" #include "mtr0log.h" -#include "page0zip.h" #include "ut0ut.h" #include "btr0scrub.h" #include "fsp0fsp.h" @@ -107,13 +112,20 @@ UNIV_INTERN mysql_pfs_key_t fil_crypt_data_mutex_key; extern my_bool srv_background_scrub_data_uncompressed; extern my_bool srv_background_scrub_data_compressed; +/*********************************************************************** +Check if a key needs rotation given a key_state +@param[in] encrypt_mode Encryption mode +@param[in] key_version Current key version +@param[in] latest_key_version Latest key version +@param[in] rotate_key_age when to rotate +@return true if key needs rotation, false if not */ static bool fil_crypt_needs_rotation( - fil_encryption_t encrypt_mode, /*!< in: Encryption - mode */ - uint key_version, /*!< in: Key version */ - uint latest_key_version, /*!< in: Latest key version */ - uint rotate_key_age); /*!< in: When to rotate */ + fil_encryption_t encrypt_mode, + uint key_version, + uint latest_key_version, + uint rotate_key_age) + MY_ATTRIBUTE((warn_unused_result)); /********************************************************************* Init space crypt */ @@ -179,7 +191,12 @@ fil_crypt_get_latest_key_version( crypt_data->min_key_version, key_version, srv_fil_crypt_rotate_key_age)) { - os_event_set(fil_crypt_threads_event); + /* Below event seen as NULL-pointer at startup + when new database was created and we create a + checkpoint. Only seen when debugging. */ + if (fil_crypt_threads_inited) { + os_event_set(fil_crypt_threads_event); + } } } @@ -479,11 +496,12 @@ Parse a MLOG_FILE_WRITE_CRYPT_DATA log entry @param[in] block buffer block @return position on log buffer */ UNIV_INTERN -const byte* +byte* fil_parse_write_crypt_data( - const byte* ptr, + byte* ptr, const byte* end_ptr, - const buf_block_t* block) + const buf_block_t* block, + dberr_t* err) { /* check that redo log entry is complete */ size_t entry_size = @@ -495,6 +513,8 @@ fil_parse_write_crypt_data( 4 + // size of key_id 1; // fil_encryption_t + *err = DB_SUCCESS; + if (ptr + entry_size > end_ptr) { return NULL; } @@ -534,11 +554,16 @@ fil_parse_write_crypt_data( ptr += len; /* update fil_space memory cache with crypt_data */ - fil_space_t* space = fil_space_acquire_silent(space_id); - - if (space) { + if (fil_space_t* space = fil_space_acquire_silent(space_id)) { crypt_data = fil_space_set_crypt_data(space, crypt_data); fil_space_release(space); + /* Check is used key found from encryption plugin */ + if (crypt_data->should_encrypt() + && !crypt_data->is_key_found()) { + *err = DB_DECRYPTION_FAILED; + } + } else { + fil_space_destroy_crypt_data(&crypt_data); } return ptr; @@ -675,7 +700,7 @@ fil_space_encrypt( } fil_space_crypt_t* crypt_data = space->crypt_data; - ut_ad(space->n_pending_ops); + ut_ad(space->n_pending_ios > 0); ulint zip_size = fsp_flags_get_zip_size(space->flags); byte* tmp = fil_encrypt_buf(crypt_data, space->id, offset, lsn, src_frame, zip_size, dst_frame); @@ -710,16 +735,19 @@ fil_space_encrypt( } bool corrupted = buf_page_is_corrupted(true, tmp_mem, zip_size, space); + memcpy(tmp_mem+FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, src+FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, 8); bool different = memcmp(src, tmp_mem, size); if (!ok || corrupted || corrupted1 || err != DB_SUCCESS || different) { - fprintf(stderr, "ok %d corrupted %d corrupted1 %d err %d different %d\n", ok , corrupted, corrupted1, err, different); + fprintf(stderr, "ok %d corrupted %d corrupted1 %d err %d different %d\n", + ok , corrupted, corrupted1, err, different); fprintf(stderr, "src_frame\n"); - buf_page_print(src_frame, zip_size, BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(src_frame, zip_size); fprintf(stderr, "encrypted_frame\n"); - buf_page_print(tmp, zip_size, BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(tmp, zip_size); fprintf(stderr, "decrypted_frame\n"); - buf_page_print(tmp_mem, zip_size, 0); + buf_page_print(tmp_mem, zip_size); + ut_ad(0); } free(tmp_mem); @@ -768,25 +796,6 @@ fil_space_decrypt( return false; } - if (crypt_data == NULL) { - if (!(space == 0 && offset == 0) && key_version != 0) { - /* FIL_PAGE_FILE_FLUSH_LSN field i.e. - FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION - should be only defined for the - first page in a system tablespace - data file (ibdata*, not *.ibd), if not - clear it. */ - - DBUG_PRINT("ib_crypt", - ("Page on space %lu offset %lu has key_version %u" - " when it shoud be undefined.", - space, offset, key_version)); - - mach_write_to_4(src_frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, 0); - } - return false; - } - ut_a(crypt_data != NULL && crypt_data->is_encrypted()); /* read space & lsn */ @@ -838,9 +847,6 @@ fil_space_decrypt( memcpy(tmp_frame + page_size - FIL_PAGE_DATA_END, src_frame + page_size - FIL_PAGE_DATA_END, FIL_PAGE_DATA_END); - - // clear key-version & crypt-checksum from dst - memset(tmp_frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, 0, 8); } srv_stats.pages_decrypted.inc(); @@ -872,7 +878,7 @@ fil_space_decrypt( *decrypted = false; ut_ad(space->crypt_data != NULL && space->crypt_data->is_encrypted()); - ut_ad(space->n_pending_ops > 0); + ut_ad(space->n_pending_ios > 0); bool encrypted = fil_space_decrypt( space->crypt_data, @@ -899,7 +905,7 @@ fil_space_decrypt( Calculate post encryption checksum @param[in] zip_size zip_size or 0 @param[in] dst_frame Block where checksum is calculated -@return page checksum or BUF_NO_CHECKSUM_MAGIC +@return page checksum not needed. */ UNIV_INTERN ulint @@ -908,165 +914,18 @@ fil_crypt_calculate_checksum( const byte* dst_frame) { ib_uint32_t checksum = 0; - srv_checksum_algorithm_t algorithm = - static_cast(srv_checksum_algorithm); + /* For encrypted tables we use only crc32 and strict_crc32 */ if (zip_size == 0) { - switch (algorithm) { - case SRV_CHECKSUM_ALGORITHM_CRC32: - case SRV_CHECKSUM_ALGORITHM_STRICT_CRC32: - checksum = buf_calc_page_crc32(dst_frame); - break; - case SRV_CHECKSUM_ALGORITHM_INNODB: - case SRV_CHECKSUM_ALGORITHM_STRICT_INNODB: - checksum = (ib_uint32_t) buf_calc_page_new_checksum( - dst_frame); - break; - case SRV_CHECKSUM_ALGORITHM_NONE: - case SRV_CHECKSUM_ALGORITHM_STRICT_NONE: - checksum = BUF_NO_CHECKSUM_MAGIC; - break; - /* no default so the compiler will emit a warning - * if new enum is added and not handled here */ - } + checksum = buf_calc_page_crc32(dst_frame); } else { checksum = page_zip_calc_checksum(dst_frame, zip_size, - algorithm); + SRV_CHECKSUM_ALGORITHM_CRC32); } return checksum; } -/********************************************************************* -Verify that post encryption checksum match calculated checksum. -This function should be called only if tablespace contains crypt_data -metadata (this is strong indication that tablespace is encrypted). -Function also verifies that traditional checksum does not match -calculated checksum as if it does page could be valid unencrypted, -encrypted, or corrupted. - -@param[in] page Page to verify -@param[in] zip_size zip size -@param[in] space Tablespace -@param[in] pageno Page no -@return true if page is encrypted AND OK, false otherwise */ -UNIV_INTERN -bool -fil_space_verify_crypt_checksum( - byte* page, - ulint zip_size, - const fil_space_t* space, - ulint pageno) -{ - uint key_version = mach_read_from_4(page+ FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); - - /* If page is not encrypted, return false */ - if (key_version == 0) { - return false; - } - - srv_checksum_algorithm_t algorithm = - static_cast(srv_checksum_algorithm); - /* If no checksum is used, can't continue checking. */ - if (algorithm == SRV_CHECKSUM_ALGORITHM_NONE) { - return(true); - } - - /* Read stored post encryption checksum. */ - ib_uint32_t checksum = mach_read_from_4( - page + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION + 4); - - /* Declare empty pages non-corrupted */ - if (checksum == 0 - && *reinterpret_cast(page + FIL_PAGE_LSN) == 0 - && buf_page_is_zeroes(page, zip_size)) { - return(true); - } - - /* Compressed and encrypted pages do not have checksum. Assume not - corrupted. Page verification happens after decompression in - buf_page_io_complete() using buf_page_is_corrupted(). */ - if (mach_read_from_2(page+FIL_PAGE_TYPE) == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED) { - return (true); - } - - /* Compressed pages use different checksum method. We first store - the post encryption checksum on checksum location and after function - restore the original. */ - if (zip_size) { - ib_uint32_t old = static_cast(mach_read_from_4( - page + FIL_PAGE_SPACE_OR_CHKSUM)); - - mach_write_to_4(page + FIL_PAGE_SPACE_OR_CHKSUM, checksum); - - bool valid = page_zip_verify_checksum(page, zip_size); - - mach_write_to_4(page + FIL_PAGE_SPACE_OR_CHKSUM, old); - - return (valid); - } - - /* If stored checksum matches one of the calculated checksums - page is not corrupted. */ - - ib_uint32_t cchecksum1 = buf_calc_page_crc32(page); - ib_uint32_t cchecksum2 = (ib_uint32_t) buf_calc_page_new_checksum( - page); - bool encrypted = (checksum == cchecksum1 || checksum == cchecksum2 - || checksum == BUF_NO_CHECKSUM_MAGIC); - - /* MySQL 5.6 and MariaDB 10.0 and 10.1 will write an LSN to the - first page of each system tablespace file at - FIL_PAGE_FILE_FLUSH_LSN offset. On other pages and in other files, - the field might have been uninitialized until MySQL 5.5. In MySQL 5.7 - (and MariaDB Server 10.2.2) WL#7990 stopped writing the field for other - than page 0 of the system tablespace. - - Starting from MariaDB 10.1 the field has been repurposed for - encryption key_version. - - Starting with MySQL 5.7 (and MariaDB Server 10.2), the - field has been repurposed for SPATIAL INDEX pages for - FIL_RTREE_SPLIT_SEQ_NUM. - - Note that FIL_PAGE_FILE_FLUSH_LSN is not included in the InnoDB page - checksum. - - Thus, FIL_PAGE_FILE_FLUSH_LSN could contain any value. While the - field would usually be 0 for pages that are not encrypted, we cannot - assume that a nonzero value means that the page is encrypted. - Therefore we must validate the page both as encrypted and unencrypted - when FIL_PAGE_FILE_FLUSH_LSN does not contain 0. - */ - - ulint checksum1 = mach_read_from_4( - page + FIL_PAGE_SPACE_OR_CHKSUM); - - ulint checksum2 = mach_read_from_4( - page + UNIV_PAGE_SIZE - FIL_PAGE_END_LSN_OLD_CHKSUM); - - - bool valid = (buf_page_is_checksum_valid_crc32(page,checksum1,checksum2) - || buf_page_is_checksum_valid_none(page,checksum1,checksum2) - || buf_page_is_checksum_valid_innodb(page,checksum1, checksum2)); - - if (encrypted && valid) { - /* If page is encrypted and traditional checksums match, - page could be still encrypted, or not encrypted and valid or - corrupted. */ - ib_logf(IB_LOG_LEVEL_ERROR, - " Page %lu in space %s (%lu) maybe corrupted." - " Post encryption checksum %u stored [%lu:%lu] key_version %u", - pageno, - space ? space->name : "N/A", - mach_read_from_4(page + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID), - checksum, checksum1, checksum2, key_version); - encrypted = false; - } - - return(encrypted); -} - /***********************************************************************/ /** A copy of global key state */ @@ -1143,6 +1002,36 @@ fil_crypt_needs_rotation( return false; } +/** Read page 0 and possible crypt data from there. +@param[in,out] space Tablespace */ +static inline +void +fil_crypt_read_crypt_data(fil_space_t* space) +{ + if (space->crypt_data || space->size) { + /* The encryption metadata has already been read, or + the tablespace is not encrypted and the file has been + opened already. */ + return; + } + + mtr_t mtr; + mtr_start(&mtr); + ulint zip_size = fsp_flags_get_zip_size(space->flags); + ulint offset = fsp_header_get_crypt_offset(zip_size); + if (buf_block_t* block = buf_page_get(space->id, zip_size, 0, + RW_S_LATCH, &mtr)) { + mutex_enter(&fil_system->mutex); + if (!space->crypt_data) { + space->crypt_data = fil_space_read_crypt_data( + space->id, block->frame, offset); + } + mutex_exit(&fil_system->mutex); + } + + mtr_commit(&mtr); +} + /*********************************************************************** Start encrypting a space @param[in,out] space Tablespace @@ -1153,6 +1042,7 @@ fil_crypt_start_encrypting_space( fil_space_t* space) { bool recheck = false; + mutex_enter(&fil_crypt_threads_mutex); fil_space_crypt_t *crypt_data = space->crypt_data; @@ -1219,8 +1109,6 @@ fil_crypt_start_encrypting_space( byte* frame = buf_block_get_frame(block); crypt_data->type = CRYPT_SCHEME_1; crypt_data->write_page0(frame, &mtr); - - mtr_commit(&mtr); /* record lsn of update */ @@ -1296,10 +1184,10 @@ struct rotate_thread_t { bool should_shutdown() const { switch (srv_shutdown_state) { case SRV_SHUTDOWN_NONE: - case SRV_SHUTDOWN_CLEANUP: return thread_no >= srv_n_fil_crypt_threads; - case SRV_SHUTDOWN_FLUSH_PHASE: + case SRV_SHUTDOWN_CLEANUP: return true; + case SRV_SHUTDOWN_FLUSH_PHASE: case SRV_SHUTDOWN_LAST_PHASE: case SRV_SHUTDOWN_EXIT_THREADS: break; @@ -1516,7 +1404,7 @@ fil_crypt_realloc_iops( DBUG_PRINT("ib_crypt", ("thr_no: %u only waited %lu%% skip re-estimate.", state->thread_no, - (100 * state->cnt_waited) / state->batch)); + (100 * state->cnt_waited) / (state->batch ? state->batch : 1))); } if (state->estimated_max_iops <= state->allocated_iops) { @@ -1619,7 +1507,7 @@ fil_crypt_find_space_to_rotate( /* we need iops to start rotating */ while (!state->should_shutdown() && !fil_crypt_alloc_iops(state)) { os_event_reset(fil_crypt_threads_event); - os_event_wait_time(fil_crypt_threads_event, 1000000); + os_event_wait_time(fil_crypt_threads_event, 100000); } if (state->should_shutdown()) { @@ -1648,6 +1536,8 @@ fil_crypt_find_space_to_rotate( } while (!state->should_shutdown() && state->space) { + fil_crypt_read_crypt_data(state->space); + if (fil_crypt_space_needs_rotation(state, key_state, recheck)) { ut_ad(key_state->key_id); /* init state->min_key_version_found before @@ -1765,20 +1655,6 @@ fil_crypt_find_page_to_rotate( return found; } -/*********************************************************************** -Check if a page is uninitialized (doesn't need to be rotated) -@param[in] frame Page to check -@param[in] zip_size zip_size or 0 -@return true if page is uninitialized, false if not. */ -static inline -bool -fil_crypt_is_page_uninitialized( - const byte *frame, - uint zip_size) -{ - return (buf_page_is_zeroes(frame, zip_size)); -} - #define fil_crypt_get_page_throttle(state,offset,mtr,sleeptime_ms) \ fil_crypt_get_page_throttle_func(state, offset, mtr, \ sleeptime_ms, __FILE__, __LINE__) @@ -1939,6 +1815,7 @@ fil_crypt_rotate_page( fil_space_crypt_t *crypt_data = space->crypt_data; ut_ad(space->n_pending_ops > 0); + ut_ad(offset > 0); /* In fil_crypt_thread where key rotation is done we have acquired space and checked that this space is not yet @@ -1964,45 +1841,43 @@ fil_crypt_rotate_page( bool modified = false; int needs_scrubbing = BTR_SCRUB_SKIP_PAGE; lsn_t block_lsn = block->page.newest_modification; - uint kv = block->page.key_version; + byte* frame = buf_block_get_frame(block); + uint kv = mach_read_from_4(frame+FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); - /* check if tablespace is closing after reading page */ if (space->is_stopping()) { - byte* frame = buf_block_get_frame(block); + /* The tablespace is closing (in DROP TABLE or + TRUNCATE TABLE or similar): avoid further access */ + } else if (!*reinterpret_cast(FIL_PAGE_OFFSET + + frame)) { + /* It looks like this page was never + allocated. Because key rotation is accessing + pages in a pattern that is unlike the normal + B-tree and undo log access pattern, we cannot + invoke fseg_page_is_free() here, because that + could result in a deadlock. If we invoked + fseg_page_is_free() and released the + tablespace latch before acquiring block->lock, + then the fseg_page_is_free() information + could be stale already. */ + ut_ad(kv == 0); + ut_ad(page_get_space_id(frame) == 0); + } else if (fil_crypt_needs_rotation( + crypt_data->encryption, + kv, key_state->key_version, + key_state->rotate_key_age)) { - if (kv == 0 && - fil_crypt_is_page_uninitialized(frame, zip_size)) { - ; - } else if (fil_crypt_needs_rotation( - crypt_data->encryption, - kv, key_state->key_version, - key_state->rotate_key_age)) { + modified = true; - /* page can be "fresh" i.e never written in case - * kv == 0 or it should have a key version at least - * as big as the space minimum key version*/ - ut_a(kv == 0 || kv >= crypt_data->min_key_version); + /* force rotation by dummy updating page */ + mlog_write_ulint(frame + FIL_PAGE_SPACE_ID, + space_id, MLOG_4BYTES, &mtr); - modified = true; - - /* force rotation by dummy updating page */ - mlog_write_ulint(frame + - FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID, - space_id, MLOG_4BYTES, &mtr); - - /* update block */ - block->page.key_version = key_state->key_version; - - /* statistics */ - state->crypt_stat.pages_modified++; - } else { - if (crypt_data->is_encrypted()) { - ut_a(kv >= crypt_data->min_key_version || - (kv == 0 && key_state->key_version == 0)); - - if (kv < state->min_key_version_found) { - state->min_key_version_found = kv; - } + /* statistics */ + state->crypt_stat.pages_modified++; + } else { + if (crypt_data->is_encrypted()) { + if (kv < state->min_key_version_found) { + state->min_key_version_found = kv; } } @@ -2083,6 +1958,11 @@ fil_crypt_rotate_page( state->end_lsn = block_lsn; } } + } else { + /* If block read failed mtr memo and log should be empty. */ + ut_ad(dyn_array_get_data_size(&mtr.memo) == 0); + ut_ad(dyn_array_get_data_size(&mtr.log) == 0); + mtr_commit(&mtr); } if (sleeptime_ms) { @@ -2248,7 +2128,8 @@ fil_crypt_complete_rotate_space( mutex_exit(&crypt_data->mutex); /* all threads must call btr_scrub_complete_space wo/ mutex held */ - if (btr_scrub_complete_space(&state->scrub_data) == true) { + if (state->scrub_data.scrubbing) { + btr_scrub_complete_space(&state->scrub_data); if (should_flush) { /* only last thread updates last_scrub_completed */ ut_ad(crypt_data); @@ -2266,6 +2147,11 @@ fil_crypt_complete_rotate_space( crypt_data->rotate_state.flushing = false; mutex_exit(&crypt_data->mutex); } + } else { + mutex_enter(&crypt_data->mutex); + ut_a(crypt_data->rotate_state.active_threads > 0); + crypt_data->rotate_state.active_threads--; + mutex_exit(&crypt_data->mutex); } } @@ -2343,8 +2229,10 @@ DECLARE_THREAD(fil_crypt_thread)( while (!thr.should_shutdown() && fil_crypt_find_page_to_rotate(&new_state, &thr)) { - /* rotate a (set) of pages */ - fil_crypt_rotate_pages(&new_state, &thr); + if (!thr.space->is_stopping()) { + /* rotate a (set) of pages */ + fil_crypt_rotate_pages(&new_state, &thr); + } /* If space is marked as stopping, release space and stop rotation. */ @@ -2417,7 +2305,7 @@ fil_crypt_set_thread_cnt( os_thread_create(fil_crypt_thread, NULL, &rotation_thread_id); ib_logf(IB_LOG_LEVEL_INFO, - "Creating #%d thread id %lu total threads %u.", + "Creating #%d encryption thread id %lu total threads %u.", i+1, os_thread_pf(rotation_thread_id), new_cnt); } } else if (new_cnt < srv_n_fil_crypt_threads) { @@ -2429,7 +2317,13 @@ fil_crypt_set_thread_cnt( while(srv_n_fil_crypt_threads_started != srv_n_fil_crypt_threads) { os_event_reset(fil_crypt_event); - os_event_wait_time(fil_crypt_event, 1000000); + os_event_wait_time(fil_crypt_event, 100000); + } + + /* Send a message to encryption threads that there could be + something to do. */ + if (srv_n_fil_crypt_threads) { + os_event_set(fil_crypt_threads_event); } } @@ -2551,8 +2445,9 @@ fil_space_crypt_close_tablespace( if (now >= last + 30) { ib_logf(IB_LOG_LEVEL_WARN, - "Waited %ld seconds to drop space: %s(" ULINTPF ").", - now - start, space->name, space->id); + "Waited %ld seconds to drop space: %s (" ULINTPF + ") active threads %u flushing=%d.", + now - start, space->name, space->id, cnt, flushing); last = now; } } @@ -2573,10 +2468,11 @@ fil_space_crypt_get_status( memset(status, 0, sizeof(*status)); ut_ad(space->n_pending_ops > 0); - fil_space_crypt_t* crypt_data = space->crypt_data; - status->space = space->id; + fil_crypt_read_crypt_data(const_cast(space)); + status->space = ULINT_UNDEFINED; - if (crypt_data != NULL) { + if (fil_space_crypt_t* crypt_data = space->crypt_data) { + status->space = space->id; mutex_enter(&crypt_data->mutex); status->scheme = crypt_data->type; status->keyserver_requests = crypt_data->keyserver_requests; @@ -2655,3 +2551,159 @@ fil_space_get_scrub_status( mutex_exit(&crypt_data->mutex); } } + +#endif /* !UNIV_INNOCHECKSUM */ + +/********************************************************************* +Verify that post encryption checksum match calculated checksum. +This function should be called only if tablespace contains crypt_data +metadata (this is strong indication that tablespace is encrypted). +Function also verifies that traditional checksum does not match +calculated checksum as if it does page could be valid unencrypted, +encrypted, or corrupted. + +@param[in] page Page to verify +@param[in] zip_size zip size +@param[in] space Tablespace +@param[in] pageno Page no +@return true if page is encrypted AND OK, false otherwise */ +UNIV_INTERN +bool +fil_space_verify_crypt_checksum( + byte* page, + ulint zip_size, +#ifndef UNIV_INNOCHECKSUM + const fil_space_t* space, +#else + const void* space, +#endif + ulint pageno) +{ + uint key_version = mach_read_from_4(page+ FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); + + /* If page is not encrypted, return false */ + if (key_version == 0) { + return(false); + } + + srv_checksum_algorithm_t algorithm = + static_cast(srv_checksum_algorithm); + + /* If no checksum is used, can't continue checking. */ + if (algorithm == SRV_CHECKSUM_ALGORITHM_NONE) { + return(true); + } + + /* Read stored post encryption checksum. */ + ib_uint32_t checksum = mach_read_from_4( + page + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION + 4); + + /* Declare empty pages non-corrupted */ + if (checksum == 0 + && *reinterpret_cast(page + FIL_PAGE_LSN) == 0 + && buf_page_is_zeroes(page, zip_size)) { + return(true); + } + + /* Compressed and encrypted pages do not have checksum. Assume not + corrupted. Page verification happens after decompression in + buf_page_io_complete() using buf_page_is_corrupted(). */ + if (mach_read_from_2(page+FIL_PAGE_TYPE) == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED) { + return (true); + } + + ib_uint32_t cchecksum1 = 0; + ib_uint32_t cchecksum2 = 0; + + /* Calculate checksums */ + if (zip_size) { + cchecksum1 = page_zip_calc_checksum( + page, zip_size, SRV_CHECKSUM_ALGORITHM_CRC32); + + cchecksum2 = (cchecksum1 == checksum) + ? 0 + : page_zip_calc_checksum( + page, zip_size, + SRV_CHECKSUM_ALGORITHM_INNODB); + } else { + cchecksum1 = buf_calc_page_crc32(page); + cchecksum2 = (cchecksum1 == checksum) + ? 0 + : buf_calc_page_new_checksum(page); + } + + /* If stored checksum matches one of the calculated checksums + page is not corrupted. */ + + bool encrypted = (checksum == cchecksum1 || checksum == cchecksum2 + || checksum == BUF_NO_CHECKSUM_MAGIC); + + /* MySQL 5.6 and MariaDB 10.0 and 10.1 will write an LSN to the + first page of each system tablespace file at + FIL_PAGE_FILE_FLUSH_LSN offset. On other pages and in other files, + the field might have been uninitialized until MySQL 5.5. In MySQL 5.7 + (and MariaDB Server 10.2.2) WL#7990 stopped writing the field for other + than page 0 of the system tablespace. + + Starting from MariaDB 10.1 the field has been repurposed for + encryption key_version. + + Starting with MySQL 5.7 (and MariaDB Server 10.2), the + field has been repurposed for SPATIAL INDEX pages for + FIL_RTREE_SPLIT_SEQ_NUM. + + Note that FIL_PAGE_FILE_FLUSH_LSN is not included in the InnoDB page + checksum. + + Thus, FIL_PAGE_FILE_FLUSH_LSN could contain any value. While the + field would usually be 0 for pages that are not encrypted, we cannot + assume that a nonzero value means that the page is encrypted. + Therefore we must validate the page both as encrypted and unencrypted + when FIL_PAGE_FILE_FLUSH_LSN does not contain 0. + */ + + uint32_t checksum1 = mach_read_from_4(page + FIL_PAGE_SPACE_OR_CHKSUM); + uint32_t checksum2; + + bool valid; + + if (zip_size) { + valid = (checksum1 == cchecksum1); + checksum2 = checksum1; + } else { + checksum2 = mach_read_from_4( + page + UNIV_PAGE_SIZE - FIL_PAGE_END_LSN_OLD_CHKSUM); + valid = (buf_page_is_checksum_valid_crc32(page,checksum1,checksum2) + || buf_page_is_checksum_valid_innodb(page,checksum1, checksum2)); + } + + if (encrypted && valid) { + /* If page is encrypted and traditional checksums match, + page could be still encrypted, or not encrypted and valid or + corrupted. */ +#ifndef UNIV_INNOCHECKSUM + ib_logf(IB_LOG_LEVEL_ERROR, + " Page " ULINTPF " in space %s (" ULINTPF ") maybe corrupted." + " Post encryption checksum %u stored [%u:%u] key_version %u", + pageno, + space ? space->name : "N/A", + mach_read_from_4(page + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID), + checksum, checksum1, checksum2, key_version); +#else + if (log_file) { + fprintf(log_file, + "Page " ULINTPF ":" ULINTPF " may be corrupted." + " Post encryption checksum %u" + " stored [%u:%u] key_version %u\n", + pageno, + mach_read_from_4(page + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID), + checksum, checksum1, checksum2, + key_version); + } +#endif /* UNIV_INNOCHECKSUM */ + + encrypted = false; + } + + return(encrypted); +} diff --git a/storage/xtradb/fil/fil0fil.cc b/storage/xtradb/fil/fil0fil.cc index e504ab3947e..a8752059b5b 100644 --- a/storage/xtradb/fil/fil0fil.cc +++ b/storage/xtradb/fil/fil0fil.cc @@ -1,7 +1,7 @@ /***************************************************************************** -Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2014, 2017, MariaDB Corporation. All Rights Reserved. +Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2014, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -67,9 +67,11 @@ static ulint srv_data_read, srv_data_written; #include #endif #include "row0mysql.h" +#include "trx0purge.h" MYSQL_PLUGIN_IMPORT extern my_bool lower_case_file_system; + /* IMPLEMENTATION OF THE TABLESPACE MEMORY CACHE ============================================= @@ -164,7 +166,8 @@ UNIV_INTERN extern uint srv_fil_crypt_rotate_key_age; UNIV_INTERN extern ib_mutex_t fil_crypt_threads_mutex; /** Determine if (i) is a user tablespace id or not. */ -# define fil_is_user_tablespace_id(i) ((i) > srv_undo_tablespaces_open) +# define fil_is_user_tablespace_id(i) (i != 0 \ + && !srv_is_undo_tablespace(i)) /** Determine if user has explicitly disabled fsync(). */ #ifndef __WIN__ @@ -247,18 +250,16 @@ fil_node_complete_io( ulint type); /*!< in: OS_FILE_WRITE or OS_FILE_READ; marks the node as modified if type == OS_FILE_WRITE */ -/*******************************************************************//** -Frees a space object from the tablespace memory cache. Closes the files in -the chain but does not delete them. There must not be any pending i/o's or +/** Free a space object from the tablespace memory cache. Close the files in +the chain but do not delete them. There must not be any pending i/o's or flushes on the files. -@return TRUE on success */ +The fil_system->mutex will be released. +@param[in] id tablespace ID +@param[in] x_latched whether the caller holds exclusive space->latch +@return whether the tablespace existed */ static -ibool -fil_space_free( -/*===========*/ - ulint id, /* in: space id */ - ibool x_latched); /* in: TRUE if caller has space->latch - in X mode */ +bool +fil_space_free_and_mutex_exit(ulint id, bool x_latched); /********************************************************************//** Reads data from a space to a buffer. Remember that the possible incomplete blocks at the end of file are ignored: they are not taken into account when @@ -330,7 +331,11 @@ fil_write( } /*******************************************************************//** -Returns the table space by a given id, NULL if not found. */ +Returns the table space by a given id, NULL if not found. +It is unsafe to dereference the returned pointer. It is fine to check +for NULL. +@param[in] id Tablespace id +@return table space or NULL */ fil_space_t* fil_space_get_by_id( /*================*/ @@ -350,26 +355,6 @@ fil_space_get_by_id( return(space); } -/*******************************************************************//** -Returns the table space by a given id, NULL if not found. */ -fil_space_t* -fil_space_found_by_id( -/*==================*/ - ulint id) /*!< in: space id */ -{ - fil_space_t* space = NULL; - mutex_enter(&fil_system->mutex); - space = fil_space_get_by_id(id); - - /* Not found if space is being deleted */ - if (space && space->stop_new_ops) { - space = NULL; - } - - mutex_exit(&fil_system->mutex); - return space; -} - /****************************************************************//** Get space id from fil node */ ulint @@ -385,7 +370,6 @@ fil_node_get_space_id( /*******************************************************************//** Returns the table space by a given name, NULL if not found. */ -UNIV_INLINE fil_space_t* fil_space_get_by_name( /*==================*/ @@ -638,7 +622,8 @@ fil_node_open_file( size_bytes = os_file_get_size(node->handle); ut_a(size_bytes != (os_offset_t) -1); - node->file_block_size = os_file_get_block_size(node->handle, node->name); + node->file_block_size = os_file_get_block_size( + node->handle, node->name); space->file_block_size = node->file_block_size; #ifdef UNIV_HOTBACKUP @@ -669,19 +654,17 @@ fil_node_open_file( page = static_cast(ut_align(buf2, UNIV_PAGE_SIZE)); success = os_file_read(node->handle, page, 0, UNIV_PAGE_SIZE); - srv_stats.page0_read.add(1); + srv_stats.page0_read.inc(); const ulint space_id = fsp_header_get_space_id(page); ulint flags = fsp_header_get_flags(page); /* Try to read crypt_data from page 0 if it is not yet read. */ - if (!node->space->page_0_crypt_read) { - ulint offset = fsp_header_get_crypt_offset( - fsp_flags_get_zip_size(flags)); - ut_ad(node->space->crypt_data == NULL); + if (!node->space->crypt_data) { + const ulint offset = fsp_header_get_crypt_offset( + fsp_flags_get_zip_size(flags)); node->space->crypt_data = fil_space_read_crypt_data(space_id, page, offset); - node->space->page_0_crypt_read = true; } ut_free(buf2); @@ -748,7 +731,8 @@ add_size: } if (node->file_block_size == 0) { - node->file_block_size = os_file_get_block_size(node->handle, node->name); + node->file_block_size = os_file_get_block_size( + node->handle, node->name); space->file_block_size = node->file_block_size; } @@ -1384,18 +1368,14 @@ retry: } } -/*******************************************************************//** -Frees a file node object from a tablespace memory cache. */ +/** Prepare a data file object for freeing. +@param[in,out] space tablespace +@param[in,out] node data file */ static void -fil_node_free( -/*==========*/ - fil_node_t* node, /*!< in, own: file node */ - fil_system_t* system, /*!< in: tablespace memory cache */ - fil_space_t* space) /*!< in: space where the file node is chained */ +fil_node_free_part1(fil_space_t* space, fil_node_t* node) { - ut_ad(node && system && space); - ut_ad(mutex_own(&(system->mutex))); + ut_ad(mutex_own(&fil_system->mutex)); ut_a(node->magic_n == FIL_NODE_MAGIC_N); ut_a(node->n_pending == 0); ut_a(!node->being_extended); @@ -1418,12 +1398,22 @@ fil_node_free( space->is_in_unflushed_spaces = false; UT_LIST_REMOVE(unflushed_spaces, - system->unflushed_spaces, + fil_system->unflushed_spaces, space); } - fil_node_close_file(node, system); + fil_node_close_file(node, fil_system); } +} + +/** Free a data file object. +@param[in,out] space tablespace +@param[in] node data file */ +static +void +fil_node_free_part2(fil_space_t* space, fil_node_t* node) +{ + ut_ad(!node->open); space->size -= node->size; @@ -1463,7 +1453,8 @@ fil_space_truncate_start( trunc_len -= node->size * UNIV_PAGE_SIZE; - fil_node_free(node, fil_system, space); + fil_node_free_part1(space, node); + fil_node_free_part2(space, node); } mutex_exit(&fil_system->mutex); @@ -1555,10 +1546,9 @@ fil_space_create( "from the cache with id %lu", name, (ulong) id); - ibool success = fil_space_free(space->id, FALSE); + bool success = fil_space_free_and_mutex_exit( + space->id, false); ut_a(success); - - mutex_exit(&fil_system->mutex); } } while (space != 0); @@ -1590,12 +1580,13 @@ fil_space_create( if (!fil_system->space_id_reuse_warned) { fil_system->space_id_reuse_warned = TRUE; - - ib_logf(IB_LOG_LEVEL_WARN, - "Allocated tablespace %lu, old maximum " - "was %lu", - (ulong) id, - (ulong) fil_system->max_assigned_id); + if (!IS_XTRABACKUP()) { + ib_logf(IB_LOG_LEVEL_WARN, + "Allocated tablespace %lu, old maximum " + "was %lu", + (ulong)id, + (ulong)fil_system->max_assigned_id); + } } fil_system->max_assigned_id = id; @@ -1607,22 +1598,6 @@ fil_space_create( space->magic_n = FIL_SPACE_MAGIC_N; space->crypt_data = crypt_data; - /* In create table we write page 0 so we have already - "read" it and for system tablespaces we have read - crypt data at startup. */ - if (create_table || crypt_data != NULL) { - space->page_0_crypt_read = true; - } - -#ifdef UNIV_DEBUG - ib_logf(IB_LOG_LEVEL_INFO, - "Created tablespace for space %lu name %s key_id %u encryption %d.", - space->id, - space->name, - space->crypt_data ? space->crypt_data->key_id : 0, - space->crypt_data ? space->crypt_data->encryption : 0); -#endif - rw_lock_create(fil_space_latch_key, &space->latch, SYNC_FSP); HASH_INSERT(fil_space_t, hash, fil_system->spaces, id, space); @@ -1712,19 +1687,16 @@ fil_assign_new_space_id( return(success); } -/*******************************************************************//** -Frees a space object from the tablespace memory cache. Closes the files in -the chain but does not delete them. There must not be any pending i/o's or +/** Free a space object from the tablespace memory cache. Close the files in +the chain but do not delete them. There must not be any pending i/o's or flushes on the files. -@return TRUE if success */ +The fil_system->mutex will be released. +@param[in] id tablespace ID +@param[in] x_latched whether the caller holds exclusive space->latch +@return whether the tablespace existed */ static -ibool -fil_space_free( -/*===========*/ - /* out: TRUE if success */ - ulint id, /* in: space id */ - ibool x_latched) /* in: TRUE if caller has space->latch - in X mode */ +bool +fil_space_free_and_mutex_exit(ulint id, bool x_latched) { fil_space_t* space; fil_space_t* fnamespace; @@ -1734,13 +1706,11 @@ fil_space_free( space = fil_space_get_by_id(id); if (!space) { - ut_print_timestamp(stderr); - fprintf(stderr, - " InnoDB: Error: trying to remove tablespace %lu" - " from the cache but\n" - "InnoDB: it is not there.\n", (ulong) id); - - return(FALSE); + ib_logf(IB_LOG_LEVEL_ERROR, + "trying to remove non-existing tablespace " ULINTPF, + id); + mutex_exit(&fil_system->mutex); + return(false); } HASH_DELETE(fil_space_t, hash, fil_system->spaces, id, space); @@ -1772,11 +1742,25 @@ fil_space_free( ut_a(space->magic_n == FIL_SPACE_MAGIC_N); ut_a(0 == space->n_pending_flushes); + for (fil_node_t* node = UT_LIST_GET_FIRST(space->chain); + node != NULL; + node = UT_LIST_GET_NEXT(chain, node)) { + fil_node_free_part1(space, node); + } + + mutex_exit(&fil_system->mutex); + + /* Wait for fil_space_release_for_io(); after + fil_space_detach(), the tablespace cannot be found, so + fil_space_acquire_for_io() would return NULL */ + while (space->n_pending_ios) { + os_thread_sleep(100); + } + for (fil_node_t* fil_node = UT_LIST_GET_FIRST(space->chain); fil_node != NULL; fil_node = UT_LIST_GET_FIRST(space->chain)) { - - fil_node_free(fil_node, fil_system, space); + fil_node_free_part2(space, fil_node); } ut_a(0 == UT_LIST_GET_LEN(space->chain)); @@ -2064,8 +2048,6 @@ fil_init( fil_system->spaces = hash_create(hash_size); fil_system->name_hash = hash_create(hash_size); - UT_LIST_INIT(fil_system->LRU); - fil_system->max_n_open = max_n_open; fil_space_crypt_init(); @@ -2176,7 +2158,11 @@ fil_close_all_files(void) space = UT_LIST_GET_NEXT(space_list, space); - fil_space_free(prev_space->id, FALSE); + /* This is executed during shutdown. No other thread + can create or remove tablespaces while we are not + holding fil_system->mutex. */ + fil_space_free_and_mutex_exit(prev_space->id, false); + mutex_enter(&fil_system->mutex); } mutex_exit(&fil_system->mutex); @@ -2224,7 +2210,11 @@ fil_close_log_files( space = UT_LIST_GET_NEXT(space_list, space); if (free) { - fil_space_free(prev_space->id, FALSE); + /* This is executed during startup. No other thread + can create or remove tablespaces while we are not + holding fil_system->mutex. */ + fil_space_free_and_mutex_exit(prev_space->id, false); + mutex_enter(&fil_system->mutex); } } @@ -2257,99 +2247,70 @@ fil_set_max_space_id_if_bigger( mutex_exit(&fil_system->mutex); } -/****************************************************************//** -Writes the flushed lsn and the latest archived log number to the page header -of the first page of a data file of the system tablespace (space 0), -which is uncompressed. */ -static MY_ATTRIBUTE((warn_unused_result)) +/** Write the flushed LSN to the page header of the first page in the +system tablespace. +@param[in] lsn flushed LSN +@return DB_SUCCESS or error number */ dberr_t -fil_write_lsn_and_arch_no_to_file( -/*==============================*/ - ulint space, /*!< in: space to write to */ - ulint sum_of_sizes, /*!< in: combined size of previous files - in space, in database pages */ - lsn_t lsn, /*!< in: lsn to write */ - ulint arch_log_no MY_ATTRIBUTE((unused))) - /*!< in: archived log number to write */ +fil_write_flushed_lsn( + lsn_t lsn) { byte* buf1; byte* buf; dberr_t err; - buf1 = static_cast(mem_alloc(2 * UNIV_PAGE_SIZE)); + buf1 = static_cast(ut_malloc(2 * UNIV_PAGE_SIZE)); buf = static_cast(ut_align(buf1, UNIV_PAGE_SIZE)); - err = fil_read(TRUE, space, 0, sum_of_sizes, 0, - UNIV_PAGE_SIZE, buf, NULL, 0); - if (err == DB_SUCCESS) { - mach_write_to_8(buf + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, - lsn); + /* Acquire system tablespace */ + fil_space_t* space = fil_space_acquire(0); - err = fil_write(TRUE, space, 0, sum_of_sizes, 0, - UNIV_PAGE_SIZE, buf, NULL, 0); - } + /* If tablespace is not encrypted, stamp flush_lsn to + first page of all system tablespace datafiles to avoid + unnecessary error messages on possible downgrade. */ + if (!space->crypt_data || space->crypt_data->min_key_version == 0) { + fil_node_t* node; + ulint sum_of_sizes = 0; - mem_free(buf1); + for (node = UT_LIST_GET_FIRST(space->chain); + node != NULL; + node = UT_LIST_GET_NEXT(chain, node)) { - return(err); -} + err = fil_read(TRUE, 0, 0, sum_of_sizes, 0, + UNIV_PAGE_SIZE, buf, NULL, 0); -/****************************************************************//** -Writes the flushed lsn and the latest archived log number to the page -header of the first page of each data file in the system tablespace. -@return DB_SUCCESS or error number */ -UNIV_INTERN -dberr_t -fil_write_flushed_lsn_to_data_files( -/*================================*/ - lsn_t lsn, /*!< in: lsn to write */ - ulint arch_log_no) /*!< in: latest archived log file number */ -{ - fil_space_t* space; - fil_node_t* node; - dberr_t err; + if (err == DB_SUCCESS) { + mach_write_to_8(buf + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, + lsn); - mutex_enter(&fil_system->mutex); - - for (space = UT_LIST_GET_FIRST(fil_system->space_list); - space != NULL; - space = UT_LIST_GET_NEXT(space_list, space)) { - - /* We only write the lsn to all existing data files which have - been open during the lifetime of the mysqld process; they are - represented by the space objects in the tablespace memory - cache. Note that all data files in the system tablespace 0 - and the UNDO log tablespaces (if separate) are always open. */ - - if (space->purpose == FIL_TABLESPACE - && !fil_is_user_tablespace_id(space->id)) { - ulint sum_of_sizes = 0; - - for (node = UT_LIST_GET_FIRST(space->chain); - node != NULL; - node = UT_LIST_GET_NEXT(chain, node)) { - - mutex_exit(&fil_system->mutex); - - err = fil_write_lsn_and_arch_no_to_file( - space->id, sum_of_sizes, lsn, - arch_log_no); - - if (err != DB_SUCCESS) { - - return(err); - } - - mutex_enter(&fil_system->mutex); + err = fil_write(TRUE, 0, 0, sum_of_sizes, 0, + UNIV_PAGE_SIZE, buf, NULL, 0); sum_of_sizes += node->size; } } + } else { + /* When system tablespace is encrypted stamp flush_lsn to + only the first page of the first datafile (rest of pages + are encrypted). */ + err = fil_read(TRUE, 0, 0, 0, 0, + UNIV_PAGE_SIZE, buf, NULL, 0); + + if (err == DB_SUCCESS) { + mach_write_to_8(buf + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, + lsn); + + err = fil_write(TRUE, 0, 0, 0, 0, + UNIV_PAGE_SIZE, buf, NULL, 0); + } } - mutex_exit(&fil_system->mutex); + fil_flush_file_spaces(FIL_TABLESPACE); + fil_space_release(space); - return(DB_SUCCESS); + ut_free(buf1); + + return(err); } /** Check the consistency of the first data page of a tablespace @@ -2402,33 +2363,49 @@ fil_check_first_page(const page_t* page, ulint space_id, ulint flags) return("inconsistent data in space header"); } -/*******************************************************************//** -Reads the flushed lsn, arch no, space_id and tablespace flag fields from -the first page of a data file at database startup. -@retval NULL on success, or if innodb_force_recovery is set -@return pointer to an error message string */ +/** Reads the flushed lsn, arch no, space_id and tablespace flag fields from +the first page of a first data file at database startup. +@param[in] data_file open data file +@param[in] one_read_only true if first datafile is already + read +@param[out] flags FSP_SPACE_FLAGS +@param[out] space_id tablepspace ID +@param[out] flushed_lsn flushed lsn value +@param[out] crypt_data encryption crypt data +@param[in] check_first_page true if first page contents + should be checked +@return NULL on success, or if innodb_force_recovery is set +@retval pointer to an error message string */ UNIV_INTERN const char* fil_read_first_page( -/*================*/ - os_file_t data_file, /*!< in: open data file */ - ibool one_read_already, /*!< in: TRUE if min and max - parameters below already - contain sensible data */ - ulint* flags, /*!< out: FSP_SPACE_FLAGS */ - ulint* space_id, /*!< out: tablespace ID */ - lsn_t* min_flushed_lsn, /*!< out: min of flushed - lsn values in data files */ - lsn_t* max_flushed_lsn, /*!< out: max of flushed - lsn values in data files */ - fil_space_crypt_t** crypt_data) /*< out: crypt data */ + pfs_os_file_t data_file, + ibool one_read_already, + ulint* flags, + ulint* space_id, + lsn_t* flushed_lsn, + fil_space_crypt_t** crypt_data, + bool check_first_page) { byte* buf; byte* page; - lsn_t flushed_lsn; const char* check_msg = NULL; fil_space_crypt_t* cdata; + if (IS_XTRABACKUP() && srv_backup_mode) { + /* Files smaller than page size may occur + in xtrabackup, when server creates new file + but has not yet written into it, or wrote only + partially. Checks size here, to avoid exit in os_file_read. + This file will be skipped by xtrabackup if it is too small. + */ + os_offset_t file_size; + file_size = os_file_get_size(data_file); + if (file_size < FIL_IBD_FILE_INITIAL_SIZE*UNIV_PAGE_SIZE) { + return "File size is less than minimum"; + } + } + buf = static_cast(ut_malloc(2 * UNIV_PAGE_SIZE)); /* Align the memory for a possible read from a raw device */ @@ -2437,57 +2414,67 @@ fil_read_first_page( os_file_read(data_file, page, 0, UNIV_PAGE_SIZE); - srv_stats.page0_read.add(1); + srv_stats.page0_read.inc(); /* The FSP_HEADER on page 0 is only valid for the first file in a tablespace. So if this is not the first datafile, leave *flags and *space_id as they were read from the first file and do not validate the first page. */ if (!one_read_already) { - *space_id = fsp_header_get_space_id(page); - *flags = fsp_header_get_flags(page); + /* Undo tablespace does not contain correct FSP_HEADER, + and actually we really need to read only crypt_data. */ + if (check_first_page) { + *space_id = fsp_header_get_space_id(page); + *flags = fsp_header_get_flags(page); - if (!fsp_flags_is_valid(*flags)) { - ulint cflags = fsp_flags_convert_from_101(*flags); - if (cflags == ULINT_UNDEFINED) { - ib_logf(IB_LOG_LEVEL_ERROR, - "Invalid flags 0x%x in tablespace %u", - unsigned(*flags), unsigned(*space_id)); - return "invalid tablespace flags"; - } else { - *flags = cflags; + if (flushed_lsn) { + *flushed_lsn = mach_read_from_8(page + + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); + } + + if (!fsp_flags_is_valid(*flags)) { + ulint cflags = fsp_flags_convert_from_101(*flags); + if (cflags == ULINT_UNDEFINED) { + ib_logf(IB_LOG_LEVEL_ERROR, + "Invalid flags 0x%x in tablespace %u", + unsigned(*flags), unsigned(*space_id)); + return "invalid tablespace flags"; + } else { + *flags = cflags; + } + } + + if (!(IS_XTRABACKUP() && srv_backup_mode)) { + check_msg = fil_check_first_page(page, *space_id, *flags); } } - check_msg = fil_check_first_page(page, *space_id, *flags); - } + /* Possible encryption crypt data is also stored only to first page + of the first datafile. */ - flushed_lsn = mach_read_from_8(page + - FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); + const ulint offset = fsp_header_get_crypt_offset( + fsp_flags_get_zip_size(*flags)); + cdata = fil_space_read_crypt_data(*space_id, page, offset); - ulint space = fsp_header_get_space_id(page); - ulint offset = fsp_header_get_crypt_offset( - fsp_flags_get_zip_size(*flags)); + if (crypt_data) { + *crypt_data = cdata; + } - cdata = fil_space_read_crypt_data(space, page, offset); + /* If file space is encrypted we need to have at least some + encryption service available where to get keys */ + if (cdata && cdata->should_encrypt()) { - if (crypt_data) { - *crypt_data = cdata; - } - - /* If file space is encrypted we need to have at least some - encryption service available where to get keys */ - if (cdata && cdata->should_encrypt()) { - - if (!encryption_key_id_exists(cdata->key_id)) { - ib_logf(IB_LOG_LEVEL_ERROR, - "Tablespace id %ld is encrypted but encryption service" - " or used key_id %u is not available. Can't continue opening tablespace.", - space, cdata->key_id); - - return ("table encrypted but encryption service not available."); + if (!encryption_key_id_exists(cdata->key_id)) { + ib_logf(IB_LOG_LEVEL_ERROR, + "Tablespace id " ULINTPF + " is encrypted but encryption service" + " or used key_id %u is not available. " + "Can't continue opening tablespace.", + *space_id, cdata->key_id); + return ("table encrypted but encryption service not available."); + } } } @@ -2497,93 +2484,11 @@ fil_read_first_page( return(check_msg); } - if (!one_read_already) { - *min_flushed_lsn = flushed_lsn; - *max_flushed_lsn = flushed_lsn; - - return(NULL); - } - - if (*min_flushed_lsn > flushed_lsn) { - *min_flushed_lsn = flushed_lsn; - } - if (*max_flushed_lsn < flushed_lsn) { - *max_flushed_lsn = flushed_lsn; - } - return(NULL); } /*================ SINGLE-TABLE TABLESPACES ==========================*/ -#ifndef UNIV_HOTBACKUP -/*******************************************************************//** -Increments the count of pending operation, if space is not being deleted. -@return TRUE if being deleted, and operation should be skipped */ -UNIV_INTERN -ibool -fil_inc_pending_ops( -/*================*/ - ulint id, /*!< in: space id */ - ibool print_err) /*!< in: need to print error or not */ -{ - fil_space_t* space; - - mutex_enter(&fil_system->mutex); - - space = fil_space_get_by_id(id); - - if (space == NULL) { - if (print_err) { - fprintf(stderr, - "InnoDB: Error: trying to do an operation on a" - " dropped tablespace %lu\n", - (ulong) id); - } - } - - if (space == NULL || space->stop_new_ops) { - mutex_exit(&fil_system->mutex); - - return(TRUE); - } - - space->n_pending_ops++; - - mutex_exit(&fil_system->mutex); - - return(FALSE); -} - -/*******************************************************************//** -Decrements the count of pending operations. */ -UNIV_INTERN -void -fil_decr_pending_ops( -/*=================*/ - ulint id) /*!< in: space id */ -{ - fil_space_t* space; - - mutex_enter(&fil_system->mutex); - - space = fil_space_get_by_id(id); - - if (space == NULL) { - fprintf(stderr, - "InnoDB: Error: decrementing pending operation" - " of a dropped tablespace %lu\n", - (ulong) id); - } - - if (space != NULL) { - space->n_pending_ops--; - } - - mutex_exit(&fil_system->mutex); -} -#endif /* !UNIV_HOTBACKUP */ - /********************************************************//** Creates the database directory for a table if it does not exist yet. */ static @@ -2837,14 +2742,12 @@ fil_op_log_parse_or_replay( } else if (log_flags & MLOG_FILE_FLAG_TEMP) { /* Temporary table, do nothing */ } else { - const char* path = NULL; - /* Create the database directory for name, if it does not exist yet */ fil_create_directory_for_tablename(name); if (fil_create_new_single_table_tablespace( - space_id, name, path, flags, + space_id, name, NULL, flags, DICT_TF2_USE_TABLESPACE, FIL_IBD_FILE_INITIAL_SIZE, FIL_ENCRYPTION_DEFAULT, @@ -2975,7 +2878,7 @@ fil_check_pending_operations( fil_space_t* sp = fil_space_get_by_id(id); if (sp) { - sp->stop_new_ops = TRUE; + sp->stop_new_ops = true; /* space could be freed by other threads as soon as n_pending_ops reaches 0, thus increment pending ops here. */ @@ -3087,15 +2990,13 @@ fil_close_tablespace( /* If the free is successful, the X lock will be released before the space memory data structure is freed. */ - if (!fil_space_free(id, TRUE)) { + if (!fil_space_free_and_mutex_exit(id, TRUE)) { rw_lock_x_unlock(&space->latch); err = DB_TABLESPACE_NOT_FOUND; } else { err = DB_SUCCESS; } - mutex_exit(&fil_system->mutex); - /* If it is a delete then also delete any generated files, otherwise when we drop the database the remove directory will fail. */ @@ -3204,12 +3105,10 @@ fil_delete_tablespace( ut_a(node->n_pending == 0); } - if (!fil_space_free(id, TRUE)) { + if (!fil_space_free_and_mutex_exit(id, true)) { err = DB_TABLESPACE_NOT_FOUND; } - mutex_exit(&fil_system->mutex); - if (err != DB_SUCCESS) { rw_lock_x_unlock(&space->latch); } else if (!os_file_delete(innodb_file_data_key, path) @@ -3221,7 +3120,7 @@ fil_delete_tablespace( err = DB_IO_ERROR; } - if (err == DB_SUCCESS) { + if (err == DB_SUCCESS && !IS_XTRABACKUP()) { #ifndef UNIV_HOTBACKUP /* Write a log record about the deletion of the .ibd file, so that mysqlbackup can replay it in the @@ -3620,7 +3519,7 @@ skip_second_rename: mutex_exit(&fil_system->mutex); #ifndef UNIV_HOTBACKUP - if (success && !recv_recovery_on) { + if (success && !recv_recovery_on && !IS_XTRABACKUP()) { mtr_t mtr; mtr_start(&mtr); @@ -3794,7 +3693,7 @@ fil_open_linked_file( /*===============*/ const char* tablename, /*!< in: database/tablename */ char** remote_filepath,/*!< out: remote filepath */ - os_file_t* remote_file, /*!< out: remote file handle */ + pfs_os_file_t* remote_file, /*!< out: remote file handle */ ulint atomic_writes) /*!< in: atomic writes table option value */ { @@ -3857,7 +3756,8 @@ fil_create_new_single_table_tablespace( fil_encryption_t mode, /*!< in: encryption mode */ ulint key_id) /*!< in: encryption key_id */ { - os_file_t file; + pfs_os_file_t file; + ibool ret; dberr_t err; byte* buf2; @@ -3866,7 +3766,18 @@ fil_create_new_single_table_tablespace( ibool success; /* TRUE if a table is created with CREATE TEMPORARY TABLE */ bool is_temp = !!(flags2 & DICT_TF2_TEMPORARY); - bool has_data_dir = FSP_FLAGS_HAS_DATA_DIR(flags) != 0; + + + /* For XtraBackup recovery we force remote tablespaces to be local, + i.e. never execute the code path corresponding to has_data_dir == true. + We don't create .isl files either, because we rely on innobackupex to + copy them under a global lock, and use them to copy remote tablespaces + to their proper locations on --copy-back. + + See also MySQL bug #72022: dir_path is always NULL for remote + tablespaces when a MLOG_FILE_CREATE* log record is replayed (the remote + directory is not available from MLOG_FILE_CREATE*). */ + bool has_data_dir = FSP_FLAGS_HAS_DATA_DIR(flags) != 0 && !IS_XTRABACKUP(); ulint atomic_writes = FSP_FLAGS_GET_ATOMIC_WRITES(flags); fil_space_crypt_t *crypt_data = NULL; @@ -4048,6 +3959,7 @@ fil_create_new_single_table_tablespace( } #ifndef UNIV_HOTBACKUP + if (!IS_XTRABACKUP()) { mtr_t mtr; ulint mlog_file_flag = 0; @@ -4088,6 +4000,138 @@ error_exit_3: return(err); } +#include "pars0pars.h" +#include "que0que.h" +#include "dict0priv.h" +static +void +fil_remove_invalid_table_from_data_dict(const char *name) +{ + trx_t* trx; + pars_info_t* info = NULL; + + trx = trx_allocate_for_mysql(); + trx_start_for_ddl(trx, TRX_DICT_OP_TABLE); + + ut_ad(mutex_own(&dict_sys->mutex)); + + trx->op_info = "removing invalid table from data dictionary"; + + info = pars_info_create(); + + pars_info_add_str_literal(info, "table_name", name); + + que_eval_sql(info, + "PROCEDURE DROP_TABLE_PROC () IS\n" + "sys_foreign_id CHAR;\n" + "table_id CHAR;\n" + "index_id CHAR;\n" + "foreign_id CHAR;\n" + "found INT;\n" + + "DECLARE CURSOR cur_fk IS\n" + "SELECT ID FROM SYS_FOREIGN\n" + "WHERE FOR_NAME = :table_name\n" + "AND TO_BINARY(FOR_NAME)\n" + " = TO_BINARY(:table_name)\n" + "LOCK IN SHARE MODE;\n" + + "DECLARE CURSOR cur_idx IS\n" + "SELECT ID FROM SYS_INDEXES\n" + "WHERE TABLE_ID = table_id\n" + "LOCK IN SHARE MODE;\n" + + "BEGIN\n" + "SELECT ID INTO table_id\n" + "FROM SYS_TABLES\n" + "WHERE NAME = :table_name\n" + "LOCK IN SHARE MODE;\n" + "IF (SQL % NOTFOUND) THEN\n" + " RETURN;\n" + "END IF;\n" + "found := 1;\n" + "SELECT ID INTO sys_foreign_id\n" + "FROM SYS_TABLES\n" + "WHERE NAME = 'SYS_FOREIGN'\n" + "LOCK IN SHARE MODE;\n" + "IF (SQL % NOTFOUND) THEN\n" + " found := 0;\n" + "END IF;\n" + "IF (:table_name = 'SYS_FOREIGN') THEN\n" + " found := 0;\n" + "END IF;\n" + "IF (:table_name = 'SYS_FOREIGN_COLS') THEN\n" + " found := 0;\n" + "END IF;\n" + "OPEN cur_fk;\n" + "WHILE found = 1 LOOP\n" + " FETCH cur_fk INTO foreign_id;\n" + " IF (SQL % NOTFOUND) THEN\n" + " found := 0;\n" + " ELSE\n" + " DELETE FROM SYS_FOREIGN_COLS\n" + " WHERE ID = foreign_id;\n" + " DELETE FROM SYS_FOREIGN\n" + " WHERE ID = foreign_id;\n" + " END IF;\n" + "END LOOP;\n" + "CLOSE cur_fk;\n" + "found := 1;\n" + "OPEN cur_idx;\n" + "WHILE found = 1 LOOP\n" + " FETCH cur_idx INTO index_id;\n" + " IF (SQL % NOTFOUND) THEN\n" + " found := 0;\n" + " ELSE\n" + " DELETE FROM SYS_FIELDS\n" + " WHERE INDEX_ID = index_id;\n" + " DELETE FROM SYS_INDEXES\n" + " WHERE ID = index_id\n" + " AND TABLE_ID = table_id;\n" + " END IF;\n" + "END LOOP;\n" + "CLOSE cur_idx;\n" + "DELETE FROM SYS_COLUMNS\n" + "WHERE TABLE_ID = table_id;\n" + "DELETE FROM SYS_TABLES\n" + "WHERE NAME = :table_name;\n" + "END;\n" + , FALSE, trx); + + /* SYS_DATAFILES and SYS_TABLESPACES do not necessarily exist + on XtraBackup recovery. See comments around + dict_create_or_check_foreign_constraint_tables() in + innobase_start_or_create_for_mysql(). */ + if (dict_table_get_low("SYS_DATAFILES") != NULL) { + info = pars_info_create(); + + pars_info_add_str_literal(info, "table_name", name); + + que_eval_sql(info, + "PROCEDURE DROP_TABLE_PROC () IS\n" + "space_id INT;\n" + + "BEGIN\n" + "SELECT SPACE INTO space_id\n" + "FROM SYS_TABLES\n" + "WHERE NAME = :table_name;\n" + "IF (SQL % NOTFOUND) THEN\n" + " RETURN;\n" + "END IF;\n" + "DELETE FROM SYS_TABLESPACES\n" + "WHERE SPACE = space_id;\n" + "DELETE FROM SYS_DATAFILES\n" + "WHERE SPACE = space_id;\n" + "END;\n" + , FALSE, trx); + } + + trx_commit_for_mysql(trx); + + trx_free_for_mysql(trx); +} + + #ifndef UNIV_HOTBACKUP /********************************************************************//** Report information about a bad tablespace. */ @@ -4156,6 +4200,7 @@ fsp_flags_try_adjust(ulint space_id, ulint flags) flags, MLOG_4BYTES, &mtr); } } + mtr_commit(&mtr); } @@ -4191,8 +4236,7 @@ fil_open_single_table_tablespace( ulint flags, /*!< in: expected FSP_SPACE_FLAGS */ const char* tablename, /*!< in: table name in the databasename/tablename format */ - const char* path_in, /*!< in: tablespace filepath */ - dict_table_t* table) /*!< in: table */ + const char* path_in) /*!< in: table */ { dberr_t err = DB_SUCCESS; bool dict_filepath_same_as_default = false; @@ -4228,8 +4272,10 @@ fil_open_single_table_tablespace( in the default location. If it is remote, it should not be here. */ def.filepath = fil_make_ibd_name(tablename, false); - /* The path_in was read from SYS_DATAFILES. */ - if (path_in) { + /* The path_in was read from SYS_DATAFILES. + We skip SYS_DATAFILES validation and remote tablespaces discovery for + XtraBackup, as all tablespaces are local for XtraBackup recovery. */ + if (path_in && !IS_XTRABACKUP()) { if (strcmp(def.filepath, path_in)) { dict.filepath = mem_strdup(path_in); /* possibility of multiple files. */ @@ -4281,6 +4327,7 @@ fil_open_single_table_tablespace( def.file = os_file_create_simple_no_error_handling( innodb_file_data_key, def.filepath, OS_FILE_OPEN, OS_FILE_READ_ONLY, &def.success, atomic_writes); + if (def.success) { tablespaces_found++; } @@ -4295,16 +4342,12 @@ fil_open_single_table_tablespace( /* Read the first page of the datadir tablespace, if found. */ if (def.success) { def.check_msg = fil_read_first_page( - def.file, FALSE, &def.flags, &def.id, - &def.lsn, &def.lsn, &def.crypt_data); - - if (table) { - table->crypt_data = def.crypt_data; - table->page_0_read = true; - } + def.file, false, &def.flags, &def.id, + NULL, &def.crypt_data); def.valid = !def.check_msg && def.id == id && fsp_flags_match(flags, def.flags); + if (def.valid) { valid_tablespaces_found++; } else { @@ -4318,17 +4361,13 @@ fil_open_single_table_tablespace( /* Read the first page of the remote tablespace */ if (remote.success) { remote.check_msg = fil_read_first_page( - remote.file, FALSE, &remote.flags, &remote.id, - &remote.lsn, &remote.lsn, &remote.crypt_data); - - if (table) { - table->crypt_data = remote.crypt_data; - table->page_0_read = true; - } + remote.file, false, &remote.flags, &remote.id, + NULL, &remote.crypt_data); /* Validate this single-table-tablespace with SYS_TABLES. */ remote.valid = !remote.check_msg && remote.id == id && fsp_flags_match(flags, remote.flags); + if (remote.valid) { valid_tablespaces_found++; } else { @@ -4343,13 +4382,8 @@ fil_open_single_table_tablespace( /* Read the first page of the datadir tablespace, if found. */ if (dict.success) { dict.check_msg = fil_read_first_page( - dict.file, FALSE, &dict.flags, &dict.id, - &dict.lsn, &dict.lsn, &dict.crypt_data); - - if (table) { - table->crypt_data = dict.crypt_data; - table->page_0_read = true; - } + dict.file, false, &dict.flags, &dict.id, + NULL, &dict.crypt_data); /* Validate this single-table-tablespace with SYS_TABLES. */ dict.valid = !dict.check_msg && dict.id == id @@ -4371,12 +4405,21 @@ fil_open_single_table_tablespace( /* The following call prints an error message */ os_file_get_last_error(true); - ib_logf(IB_LOG_LEVEL_ERROR, + ib_logf(IS_XTRABACKUP() ? IB_LOG_LEVEL_WARN : IB_LOG_LEVEL_ERROR, "Could not find a valid tablespace file for '%s'. " "See " REFMAN "innodb-troubleshooting-datadict.html " "for how to resolve the issue.", tablename); + if (IS_XTRABACKUP() && fix_dict) { + ib_logf(IB_LOG_LEVEL_WARN, + "It will be removed from the data dictionary."); + + if (purge_sys) { + fil_remove_invalid_table_from_data_dict(tablename); + } + } + err = DB_CORRUPTION; goto cleanup_and_exit; @@ -4388,26 +4431,32 @@ fil_open_single_table_tablespace( ib_logf(IB_LOG_LEVEL_ERROR, "A tablespace for %s has been found in " "multiple places;", tablename); + if (def.success) { ib_logf(IB_LOG_LEVEL_ERROR, - "Default location; %s, LSN=" LSN_PF - ", Space ID=%lu, Flags=%lu", - def.filepath, def.lsn, - (ulong) def.id, (ulong) def.flags); + "Default location; %s" + ", Space ID=" ULINTPF " , Flags=" ULINTPF " .", + def.filepath, + def.id, + def.flags); } + if (remote.success) { ib_logf(IB_LOG_LEVEL_ERROR, - "Remote location; %s, LSN=" LSN_PF - ", Space ID=%lu, Flags=%lu", - remote.filepath, remote.lsn, - (ulong) remote.id, (ulong) remote.flags); + "Remote location; %s" + ", Space ID=" ULINTPF " , Flags=" ULINTPF " .", + remote.filepath, + remote.id, + remote.flags); } + if (dict.success) { ib_logf(IB_LOG_LEVEL_ERROR, - "Dictionary location; %s, LSN=" LSN_PF - ", Space ID=%lu, Flags=%lu", - dict.filepath, dict.lsn, - (ulong) dict.id, (ulong) dict.flags); + "Dictionary location; %s" + ", Space ID=" ULINTPF " , Flags=" ULINTPF " .", + dict.filepath, + dict.id, + dict.flags); } /* Force-recovery will allow some tablespaces to be @@ -4440,6 +4489,7 @@ fil_open_single_table_tablespace( os_file_close(def.file); tablespaces_found--; } + if (dict.success && !dict.valid) { dict.success = false; os_file_close(dict.file); @@ -4555,7 +4605,17 @@ cleanup_and_exit: mem_free(def.filepath); - if (err == DB_SUCCESS && !srv_read_only_mode) { + /* We need to check fsp flags when no errors has happened and + server was not started on read only mode and tablespace validation + was requested or flags contain other table options except + low order bits to FSP_FLAGS_POS_PAGE_SSIZE position. + Note that flag comparison is pessimistic. Adjust is required + only when flags contain buggy MariaDB 10.1.0 - + MariaDB 10.1.20 flags. */ + if (err == DB_SUCCESS + && !srv_read_only_mode + && (validate + || flags >= (1U << FSP_FLAGS_POS_PAGE_SSIZE))) { fsp_flags_try_adjust(id, flags & ~FSP_FLAGS_MEM_MASK); } @@ -4792,8 +4852,8 @@ fil_validate_single_table_tablespace( check_first_page: fsp->success = TRUE; if (const char* check_msg = fil_read_first_page( - fsp->file, FALSE, &fsp->flags, &fsp->id, - &fsp->lsn, &fsp->lsn, &fsp->crypt_data)) { + fsp->file, false, &fsp->flags, &fsp->id, + NULL, &fsp->crypt_data)) { ib_logf(IB_LOG_LEVEL_ERROR, "%s in tablespace %s (table %s)", check_msg, fsp->filepath, tablename); @@ -4801,6 +4861,12 @@ check_first_page: } if (!fsp->success) { + if (IS_XTRABACKUP()) { + /* Do not attempt restore from doublewrite buffer + in Xtrabackup, this does not work.*/ + return; + } + if (!restore_attempted) { if (!fil_user_tablespace_find_space_id(fsp)) { return; @@ -4868,6 +4934,10 @@ fil_load_single_table_tablespace( os_offset_t size; fil_space_t* space; + fsp_open_info* fsp; + ulong minimum_size; + ibool file_space_create_success; + memset(&def, 0, sizeof(def)); memset(&remote, 0, sizeof(remote)); @@ -4923,6 +4993,7 @@ fil_load_single_table_tablespace( # endif /* !UNIV_HOTBACKUP */ #endif + /* Check for a link file which locates a remote tablespace. */ remote.success = fil_open_linked_file( tablename, &remote.filepath, &remote.file, FALSE); @@ -4933,6 +5004,17 @@ fil_load_single_table_tablespace( if (!remote.success) { os_file_close(remote.file); mem_free(remote.filepath); + + if (srv_backup_mode && (remote.id == ULINT_UNDEFINED + || remote.id == 0)) { + + /* Ignore files that have uninitialized space + IDs on the backup stage. This means that a + tablespace has just been created and we will + replay the corresponding log records on + prepare. */ + goto func_exit_after_close; + } } } @@ -4947,6 +5029,18 @@ fil_load_single_table_tablespace( fil_validate_single_table_tablespace(tablename, &def); if (!def.success) { os_file_close(def.file); + + if (IS_XTRABACKUP() && srv_backup_mode && (def.id == ULINT_UNDEFINED + || def.id == 0)) { + + /* Ignore files that have uninitialized space + IDs on the backup stage. This means that a + tablespace has just been created and we will + replay the corresponding log records on + prepare. */ + + goto func_exit_after_close; + } } } @@ -5016,11 +5110,11 @@ will_not_choose: if (def.success && remote.success) { ib_logf(IB_LOG_LEVEL_ERROR, "Tablespaces for %s have been found in two places;\n" - "Location 1: SpaceID: %lu LSN: %lu File: %s\n" - "Location 2: SpaceID: %lu LSN: %lu File: %s\n" + "Location 1: SpaceID: " ULINTPF " File: %s\n" + "Location 2: SpaceID: " ULINTPF " File: %s\n" "You must delete one of them.", - tablename, (ulong) def.id, (ulong) def.lsn, - def.filepath, (ulong) remote.id, (ulong) remote.lsn, + tablename, def.id, + def.filepath, remote.id, remote.filepath); def.success = FALSE; @@ -5032,7 +5126,7 @@ will_not_choose: /* At this point, only one tablespace is open */ ut_a(def.success == !remote.success); - fsp_open_info* fsp = def.success ? &def : &remote; + fsp = def.success ? &def : &remote; /* Get and test the file size. */ size = os_file_get_size(fsp->file); @@ -5051,19 +5145,14 @@ will_not_choose: /* Every .ibd file is created >= 4 pages in size. Smaller files cannot be ok. */ - ulong minimum_size = FIL_IBD_FILE_INITIAL_SIZE * UNIV_PAGE_SIZE; + minimum_size = FIL_IBD_FILE_INITIAL_SIZE * UNIV_PAGE_SIZE; if (size < minimum_size) { -#ifndef UNIV_HOTBACKUP ib_logf(IB_LOG_LEVEL_ERROR, "The size of single-table tablespace file %s " "is only " UINT64PF ", should be at least %lu!", fsp->filepath, size, minimum_size); os_file_close(fsp->file); goto no_good_file; -#else - fsp->id = ULINT_UNDEFINED; - fsp->flags = 0; -#endif /* !UNIV_HOTBACKUP */ } #ifdef UNIV_HOTBACKUP @@ -5134,6 +5223,7 @@ will_not_choose: } mutex_exit(&fil_system->mutex); #endif /* UNIV_HOTBACKUP */ + /* Adjust the memory-based flags that would normally be set by dict_tf_to_fsp_flags(). In recovery, we have no data dictionary. */ if (FSP_FLAGS_HAS_PAGE_COMPRESSION(fsp->flags)) { @@ -5144,7 +5234,7 @@ will_not_choose: /* We will leave atomic_writes at ATOMIC_WRITES_DEFAULT. That will be adjusted in fil_space_for_table_exists_in_mem(). */ - ibool file_space_create_success = fil_space_create( + file_space_create_success = fil_space_create( tablename, fsp->id, fsp->flags, FIL_TABLESPACE, fsp->crypt_data, false); @@ -5172,13 +5262,56 @@ will_not_choose: } func_exit: - os_file_close(fsp->file); + /* We reuse file handles on the backup stage in XtraBackup to avoid + inconsistencies between the file name and the actual tablespace contents + if a DDL occurs between a fil_load_single_table_tablespaces() call and + the actual copy operation. */ + if (IS_XTRABACKUP() && srv_backup_mode && !srv_close_files) { + + fil_node_t* node; + fil_space_t* space; + + mutex_enter(&fil_system->mutex); + + space = fil_space_get_by_id(fsp->id); + + if (space) { + node = UT_LIST_GET_LAST(space->chain); + + /* The handle will be closed by xtrabackup in + xtrabackup_copy_datafile(). We set node->open to TRUE to + make sure no one calls fil_node_open_file() + (i.e. attempts to reopen the tablespace by name) during + the backup stage. */ + + node->open = TRUE; + node->handle = fsp->file; + + /* The following is copied from fil_node_open_file() to + pass fil_system validaty checks. We cannot use + fil_node_open_file() directly, as that would re-open the + file by name and create another file handle. */ + + fil_system->n_open++; + fil_n_file_opened++; + + if (fil_space_belongs_in_lru(space)) { + + /* Put the node to the LRU list */ + UT_LIST_ADD_FIRST(LRU, fil_system->LRU, node); + } + } + + mutex_exit(&fil_system->mutex); + } + else { + os_file_close(fsp->file); + } + -#ifdef UNIV_HOTBACKUP func_exit_after_close: -#else ut_ad(!mutex_own(&fil_system->mutex)); -#endif + mem_free(tablename); if (remote.success) { mem_free(remote.filepath); @@ -5192,7 +5325,7 @@ directory. We retry 100 times if os_file_readdir_next_file() returns -1. The idea is to read as much good data as we can and jump over bad data. @return 0 if ok, -1 if error even after the retries, 1 if at the end of the directory */ -static +UNIV_INTERN int fil_file_readdir_next_file( /*=======================*/ @@ -5222,6 +5355,9 @@ fil_file_readdir_next_file( return(-1); } + +my_bool(*fil_check_if_skip_database_by_path)(const char* name); + #define CHECK_TIME_EVERY_N_FILES 10 /********************************************************************//** At the server startup, if we need crash recovery, scans the database @@ -5233,7 +5369,7 @@ space id is != 0. @return DB_SUCCESS or error number */ UNIV_INTERN dberr_t -fil_load_single_table_tablespaces(void) +fil_load_single_table_tablespaces(ibool (*pred)(const char*, const char*)) /*===================================*/ { int ret; @@ -5292,7 +5428,19 @@ fil_load_single_table_tablespaces(void) "%s/%s", fil_path_to_mysql_datadir, dbinfo.name); srv_normalize_path_for_win(dbpath); - dbdir = os_file_opendir(dbpath, FALSE); + if (IS_XTRABACKUP()) { + ut_a(fil_check_if_skip_database_by_path); + if (fil_check_if_skip_database_by_path(dbpath)) { + fprintf(stderr, "Skipping db: %s\n", dbpath); + dbdir = NULL; + } else { + /* We want wrong directory permissions to be a fatal + error for XtraBackup. */ + dbdir = os_file_opendir(dbpath, TRUE); + } + } else { + dbdir = os_file_opendir(dbpath, FALSE); + } if (dbdir != NULL) { @@ -5308,14 +5456,20 @@ fil_load_single_table_tablespaces(void) goto next_file_item; } - /* We found a symlink or a file */ + /* We found a symlink or a file + + Ignore .isl files on XtraBackup + recovery, all tablespaces must be local. */ if (strlen(fileinfo.name) > 4 && (0 == strcmp(fileinfo.name + strlen(fileinfo.name) - 4, ".ibd") - || 0 == strcmp(fileinfo.name - + strlen(fileinfo.name) - 4, - ".isl"))) { + || ((!IS_XTRABACKUP() || srv_backup_mode) + && 0 == strcmp(fileinfo.name + + strlen(fileinfo.name) - 4, + ".isl"))) + && (!pred || + pred(dbinfo.name, fileinfo.name))) { /* The name ends in .ibd or .isl; try opening the file */ fil_load_single_table_tablespace( @@ -5390,7 +5544,7 @@ fil_tablespace_deleted_or_being_deleted_in_mem( space = fil_space_get_by_id(id); - if (space == NULL || space->stop_new_ops) { + if (space == NULL || space->is_stopping()) { mutex_exit(&fil_system->mutex); return(TRUE); @@ -5471,6 +5625,9 @@ fil_space_for_table_exists_in_mem( information to the .err log if a matching tablespace is not found from memory */ + bool remove_from_data_dict_if_does_not_exist, + /*!< in: remove from the data dictionary + if tablespace does not exist */ bool adjust_space, /*!< in: whether to adjust space id when find table space mismatch */ mem_heap_t* heap, /*!< in: heap memory */ @@ -5541,6 +5698,11 @@ fil_space_for_table_exists_in_mem( if (fnamespace == NULL) { if (print_error_if_does_not_exist) { fil_report_missing_tablespace(name, id); + if (IS_XTRABACKUP() && remove_from_data_dict_if_does_not_exist) { + ib_logf(IB_LOG_LEVEL_WARN, + "It will be removed from " + "the data dictionary."); + } } } else { ut_print_timestamp(stderr); @@ -5937,19 +6099,19 @@ fil_report_invalid_page_access( ulint len, /*!< in: I/O length */ ulint type) /*!< in: I/O type */ { - fprintf(stderr, - "InnoDB: Error: trying to access page number %lu" - " in space %lu,\n" - "InnoDB: space name %s,\n" - "InnoDB: which is outside the tablespace bounds.\n" - "InnoDB: Byte offset %lu, len %lu, i/o type %lu.\n" - "InnoDB: If you get this error at mysqld startup," - " please check that\n" - "InnoDB: your my.cnf matches the ibdata files" - " that you have in the\n" - "InnoDB: MySQL server.\n", - (ulong) block_offset, (ulong) space_id, space_name, - (ulong) byte_offset, (ulong) len, (ulong) type); + ib_logf(IB_LOG_LEVEL_FATAL, + "Trying to access page number " ULINTPF + " in space " ULINTPF + " space name %s," + " which is outside the tablespace bounds." + " Byte offset " ULINTPF ", len " ULINTPF + " i/o type " ULINTPF ".%s", + block_offset, space_id, space_name, + byte_offset, len, type, + space_id == 0 && !srv_was_started + ? "Please check that the configuration matches" + " the InnoDB system tablespace location (ibdata files)" + : ""); } /********************************************************************//** @@ -6002,7 +6164,7 @@ UNIV_INTERN ulint fil_space_get_block_size(const fil_space_t* space, unsigned offset) { - ut_ad(space->n_pending_ops > 0); + ut_ad(space->n_pending_ios > 0); ulint block_size = 512; @@ -6143,15 +6305,19 @@ _fil_io( /* If we are deleting a tablespace we don't allow async read operations on that. However, we do allow write and sync read operations */ if (space == 0 - || (type == OS_FILE_READ && !sync && space->stop_new_ops)) { + || (type == OS_FILE_READ + && !sync + && space->stop_new_ops)) { mutex_exit(&fil_system->mutex); ib_logf(IB_LOG_LEVEL_ERROR, "Trying to do i/o to a tablespace which does " - "not exist. i/o type %lu, space id %lu, " - "page no. %lu, i/o length %lu bytes", - (ulong) type, (ulong) space_id, (ulong) block_offset, - (ulong) len); + "not exist. i/o type " ULINTPF + ", space id " ULINTPF " , " + "page no. " ULINTPF + ", i/o length " ULINTPF " bytes", + type, space_id, block_offset, + len); return(DB_TABLESPACE_DELETED); } @@ -6165,11 +6331,10 @@ _fil_io( mutex_exit(&fil_system->mutex); return(DB_ERROR); } + fil_report_invalid_page_access( block_offset, space_id, space->name, byte_offset, len, type); - - ut_error; } /* Open file if closed */ @@ -6181,10 +6346,11 @@ _fil_io( ib_logf(IB_LOG_LEVEL_ERROR, "Trying to do i/o to a tablespace which " "exists without .ibd data file. " - "i/o type %lu, space id %lu, page no %lu, " - "i/o length %lu bytes", - (ulong) type, (ulong) space_id, - (ulong) block_offset, (ulong) len); + "i/o type " ULINTPF ", space id " + ULINTPF ", page no " ULINTPF ", " + "i/o length " ULINTPF " bytes", + type, space_id, + block_offset, len); return(DB_TABLESPACE_DELETED); } @@ -6199,13 +6365,11 @@ _fil_io( /* Check that at least the start offset is within the bounds of a single-table tablespace, including rollback tablespaces. */ if (UNIV_UNLIKELY(node->size <= block_offset) - && space->id != 0 && space->purpose == FIL_TABLESPACE) { + && space->id != 0 && space->purpose == FIL_TABLESPACE) { fil_report_invalid_page_access( block_offset, space_id, space->name, byte_offset, len, type); - - ut_error; } /* Now we have made the changes in the data structures of fil_system */ @@ -6255,8 +6419,15 @@ _fil_io( mutex_exit(&fil_system->mutex); if (mode == OS_AIO_NORMAL) { ut_a(space->purpose == FIL_TABLESPACE); - buf_page_io_complete(static_cast - (message)); + dberr_t err = buf_page_io_complete(static_cast + (message)); + + if (err != DB_SUCCESS) { + ib_logf(IB_LOG_LEVEL_ERROR, + "Write operation failed for tablespace %s (" + ULINTPF ") offset " ULINTPF " error=%d.", + space->name, space->id, byte_offset, err); + } } } @@ -6359,6 +6530,8 @@ fil_aio_wait( mutex_enter(&fil_system->mutex); fil_node_complete_io(fil_node, fil_system, type); + ulint purpose = fil_node->space->purpose; + space_id = fil_node->space->id; mutex_exit(&fil_system->mutex); @@ -6370,9 +6543,27 @@ fil_aio_wait( deadlocks in the i/o system. We keep tablespace 0 data files always open, and use a special i/o thread to serve insert buffer requests. */ - if (fil_node->space->purpose == FIL_TABLESPACE) { + if (purpose == FIL_TABLESPACE) { srv_set_io_thread_op_info(segment, "complete io for buf page"); - buf_page_io_complete(static_cast(message)); + buf_page_t* bpage = static_cast(message); + ulint offset = bpage->offset; + dberr_t err = buf_page_io_complete(bpage); + + if (err != DB_SUCCESS) { + ut_ad(type == OS_FILE_READ); + /* In crash recovery set log corruption on + and produce only an error to fail InnoDB startup. */ + if (recv_recovery_is_on() && !srv_force_recovery) { + recv_sys->found_corrupt_log = true; + } + + ib_logf(IB_LOG_LEVEL_ERROR, + "Read operation failed for tablespace %s" + " offset " ULINTPF " with error %s", + fil_node->name, + offset, + ut_strerr(err)); + } } else { srv_set_io_thread_op_info(segment, "complete io for log"); log_io_complete(static_cast(message)); @@ -6393,7 +6584,8 @@ fil_flush( mutex_enter(&fil_system->mutex); if (fil_space_t* space = fil_space_get_by_id(space_id)) { - if (!space->is_stopping()) { + if (!space->stop_new_ops) { + fil_flush_low(space); } } @@ -6407,7 +6599,7 @@ UNIV_INTERN void fil_flush(fil_space_t* space) { - ut_ad(space->n_pending_ops > 0); + ut_ad(space->n_pending_ios > 0); if (!space->is_stopping()) { mutex_enter(&fil_system->mutex); @@ -6650,7 +6842,7 @@ fil_buf_block_init( } struct fil_iterator_t { - os_file_t file; /*!< File handle */ + pfs_os_file_t file; /*!< File handle */ const char* filepath; /*!< File path name */ os_offset_t start; /*!< From where to start */ os_offset_t end; /*!< Where to stop */ @@ -6693,15 +6885,15 @@ fil_iterate( /* TODO: For compressed tables we do a lot of useless copying for non-index pages. Unfortunately, it is required by buf_zip_decompress() */ + const bool row_compressed = callback.get_zip_size() > 0; for (offset = iter.start; offset < iter.end; offset += n_bytes) { byte* io_buffer = iter.io_buffer; - bool row_compressed = false; block->frame = io_buffer; - if (callback.get_zip_size() > 0) { + if (row_compressed) { page_zip_des_init(&block->page.zip); page_zip_set_size(&block->page.zip, iter.page_size); block->page.zip.data = block->frame + UNIV_PAGE_SIZE; @@ -6710,9 +6902,6 @@ fil_iterate( /* Zip IO is done in the compressed page buffer. */ io_buffer = block->page.zip.data; - row_compressed = true; - } else { - io_buffer = iter.io_buffer; } /* We have to read the exact number of bytes. Otherwise the @@ -6725,16 +6914,12 @@ fil_iterate( ut_ad(n_bytes > 0); ut_ad(!(n_bytes % iter.page_size)); - byte* readptr = io_buffer; - byte* writeptr = io_buffer; - bool encrypted = false; - + const bool encrypted = iter.crypt_data != NULL + && iter.crypt_data->should_encrypt(); /* Use additional crypt io buffer if tablespace is encrypted */ - if (iter.crypt_data != NULL && iter.crypt_data->should_encrypt()) { - encrypted = true; - readptr = iter.crypt_io_buffer; - writeptr = iter.crypt_io_buffer; - } + byte* const readptr = encrypted + ? iter.crypt_io_buffer : io_buffer; + byte* const writeptr = readptr; if (!os_file_read(iter.file, readptr, offset, (ulint) n_bytes)) { @@ -6757,8 +6942,9 @@ fil_iterate( ulint page_type = mach_read_from_2(src+FIL_PAGE_TYPE); - bool page_compressed = (page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED || - page_type == FIL_PAGE_PAGE_COMPRESSED); + const bool page_compressed + = page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED + || page_type == FIL_PAGE_PAGE_COMPRESSED; /* If tablespace is encrypted, we need to decrypt the page. Note that tablespaces are not in @@ -6860,8 +7046,7 @@ fil_iterate( 0,/* FIXME: compression level */ 512,/* FIXME: use proper block size */ encrypted, - &len, - NULL); + &len); updated = true; } @@ -6929,7 +7114,7 @@ fil_tablespace_iterate( PageCallback& callback) { dberr_t err; - os_file_t file; + pfs_os_file_t file; char* filepath; ut_a(n_io_buffers > 0); @@ -7331,88 +7516,16 @@ fil_space_set_corrupt( mutex_exit(&fil_system->mutex); } -/****************************************************************** -Get id of first tablespace or ULINT_UNDEFINED if none */ -UNIV_INTERN -ulint -fil_get_first_space() -/*=================*/ -{ - ulint out_id = ULINT_UNDEFINED; - fil_space_t* space; - - mutex_enter(&fil_system->mutex); - - space = UT_LIST_GET_FIRST(fil_system->space_list); - if (space != NULL) { - do - { - if (!space->stop_new_ops) { - out_id = space->id; - break; - } - space = UT_LIST_GET_NEXT(space_list, space); - } while (space != NULL); - } - - mutex_exit(&fil_system->mutex); - - return out_id; -} - -/****************************************************************** -Get id of next tablespace or ULINT_UNDEFINED if none */ -UNIV_INTERN -ulint -fil_get_next_space( -/*===============*/ - ulint id) /*!< in: previous space id */ -{ - bool found; - fil_space_t* space; - ulint out_id = ULINT_UNDEFINED; - - mutex_enter(&fil_system->mutex); - - space = fil_space_get_by_id(id); - if (space == NULL) { - /* we didn't find it...search for space with space->id > id */ - found = false; - space = UT_LIST_GET_FIRST(fil_system->space_list); - } else { - /* we found it, take next available space */ - found = true; - } - - while ((space = UT_LIST_GET_NEXT(space_list, space)) != NULL) { - - if (!found && space->id <= id) - continue; - - if (!space->stop_new_ops && UT_LIST_GET_LEN(space->chain) > 0) { - /* inc reference to prevent drop */ - out_id = space->id; - break; - } - } - - mutex_exit(&fil_system->mutex); - - return out_id; -} - /** Acquire a tablespace when it could be dropped concurrently. Used by background threads that do not necessarily hold proper locks for concurrency control. @param[in] id tablespace ID @param[in] silent whether to silently ignore missing tablespaces -@param[in] for_io whether to look up the tablespace while performing I/O - (possibly executing TRUNCATE) @return the tablespace @retval NULL if missing or being deleted or truncated */ -inline +UNIV_INTERN fil_space_t* -fil_space_acquire_low(ulint id, bool silent, bool for_io = false) +fil_space_acquire_low(ulint id, bool silent) { fil_space_t* space; @@ -7425,7 +7538,7 @@ fil_space_acquire_low(ulint id, bool silent, bool for_io = false) ib_logf(IB_LOG_LEVEL_WARN, "Trying to access missing" " tablespace " ULINTPF ".", id); } - } else if (!for_io && space->is_stopping()) { + } else if (space->is_stopping()) { space = NULL; } else { space->n_pending_ops++; @@ -7436,34 +7549,44 @@ fil_space_acquire_low(ulint id, bool silent, bool for_io = false) return(space); } -/** Acquire a tablespace when it could be dropped concurrently. -Used by background threads that do not necessarily hold proper locks -for concurrency control. +/** Acquire a tablespace for reading or writing a block, +when it could be dropped concurrently. @param[in] id tablespace ID -@param[in] for_io whether to look up the tablespace while performing I/O - (possibly executing TRUNCATE) @return the tablespace -@retval NULL if missing or being deleted or truncated */ +@retval NULL if missing */ +UNIV_INTERN fil_space_t* -fil_space_acquire(ulint id, bool for_io) +fil_space_acquire_for_io(ulint id) { - return(fil_space_acquire_low(id, false, for_io)); + mutex_enter(&fil_system->mutex); + + fil_space_t* space = fil_space_get_by_id(id); + + if (space) { + space->n_pending_ios++; + } + + mutex_exit(&fil_system->mutex); + + return(space); } -/** Acquire a tablespace that may not exist. -Used by background threads that do not necessarily hold proper locks -for concurrency control. -@param[in] id tablespace ID -@return the tablespace -@retval NULL if missing or being deleted */ -fil_space_t* -fil_space_acquire_silent(ulint id) +/** Release a tablespace acquired with fil_space_acquire_for_io(). +@param[in,out] space tablespace to release */ +UNIV_INTERN +void +fil_space_release_for_io(fil_space_t* space) { - return(fil_space_acquire_low(id, true)); + mutex_enter(&fil_system->mutex); + ut_ad(space->magic_n == FIL_SPACE_MAGIC_N); + ut_ad(space->n_pending_ios > 0); + space->n_pending_ios--; + mutex_exit(&fil_system->mutex); } /** Release a tablespace acquired with fil_space_acquire(). @param[in,out] space tablespace to release */ +UNIV_INTERN void fil_space_release(fil_space_t* space) { @@ -7482,6 +7605,7 @@ blocks a concurrent operation from dropping the tablespace. If NULL, use the first fil_space_t on fil_system->space_list. @return pointer to the next fil_space_t. @retval NULL if this was the last*/ +UNIV_INTERN fil_space_t* fil_space_next(fil_space_t* prev_space) { @@ -7549,6 +7673,7 @@ blocks a concurrent operation from dropping the tablespace. If NULL, use the first fil_space_t on fil_system->space_list. @return pointer to the next fil_space_t. @retval NULL if this was the last*/ +UNIV_INTERN fil_space_t* fil_space_keyrotate_next( fil_space_t* prev_space) @@ -7590,7 +7715,7 @@ fil_space_keyrotate_next( space->purpose == FIL_TABLESPACE. */ while (space != NULL && (UT_LIST_GET_LEN(space->chain) == 0 - || space->stop_new_ops)) { + || space->is_stopping())) { old = space; space = UT_LIST_GET_NEXT(rotation_list, space); diff --git a/storage/xtradb/fil/fil0pagecompress.cc b/storage/xtradb/fil/fil0pagecompress.cc index 8b2449983df..7a61f17836b 100644 --- a/storage/xtradb/fil/fil0pagecompress.cc +++ b/storage/xtradb/fil/fil0pagecompress.cc @@ -99,17 +99,16 @@ fil_compress_page( ulint level, /* in: compression level */ ulint block_size, /*!< in: block size */ bool encrypted, /*!< in: is page also encrypted */ - ulint* out_len, /*!< out: actual length of compressed + ulint* out_len) /*!< out: actual length of compressed page */ - byte* lzo_mem) /*!< in: temporal memory used by LZO */ { int err = Z_OK; int comp_level = level; ulint header_len = FIL_PAGE_DATA + FIL_PAGE_COMPRESSED_SIZE; - ulint write_size=0; + ulint write_size = 0; /* Cache to avoid change during function execution */ ulint comp_method = innodb_compression_algorithm; - bool allocated=false; + bool allocated = false; /* page_compression does not apply to tables or tablespaces that use ROW_FORMAT=COMPRESSED */ @@ -121,13 +120,23 @@ fil_compress_page( if (!out_buf) { allocated = true; - out_buf = static_cast(ut_malloc(UNIV_PAGE_SIZE)); -#ifdef HAVE_LZO - if (comp_method == PAGE_LZO_ALGORITHM) { - lzo_mem = static_cast(ut_malloc(LZO1X_1_15_MEM_COMPRESS)); - memset(lzo_mem, 0, LZO1X_1_15_MEM_COMPRESS); + ulint size = UNIV_PAGE_SIZE; + + /* Both snappy and lzo compression methods require that + output buffer used for compression is bigger than input + buffer. Increase the allocated buffer size accordingly. */ +#if HAVE_SNAPPY + if (comp_method == PAGE_SNAPPY_ALGORITHM) { + size = snappy_max_compressed_length(size); } #endif +#if HAVE_LZO + if (comp_method == PAGE_LZO_ALGORITHM) { + size += LZO1X_1_15_MEM_COMPRESS; + } +#endif + + out_buf = static_cast(ut_malloc(size)); } ut_ad(buf); @@ -163,8 +172,14 @@ fil_compress_page( switch(comp_method) { #ifdef HAVE_LZ4 case PAGE_LZ4_ALGORITHM: + +#ifdef HAVE_LZ4_COMPRESS_DEFAULT + err = LZ4_compress_default((const char *)buf, + (char *)out_buf+header_len, len, write_size); +#else err = LZ4_compress_limitedOutput((const char *)buf, (char *)out_buf+header_len, len, write_size); +#endif /* HAVE_LZ4_COMPRESS_DEFAULT */ write_size = err; if (err == 0) { @@ -192,7 +207,7 @@ fil_compress_page( #ifdef HAVE_LZO case PAGE_LZO_ALGORITHM: err = lzo1x_1_15_compress( - buf, len, out_buf+header_len, &write_size, lzo_mem); + buf, len, out_buf+header_len, &write_size, out_buf+UNIV_PAGE_SIZE); if (err != LZO_E_OK || write_size > UNIV_PAGE_SIZE-header_len) { if (space && !space->printed_compression_failure) { @@ -283,6 +298,7 @@ fil_compress_page( case PAGE_SNAPPY_ALGORITHM: { snappy_status cstatus; + write_size = snappy_max_compressed_length(UNIV_PAGE_SIZE); cstatus = snappy_compress( (const char *)buf, @@ -381,7 +397,8 @@ fil_compress_page( fil_decompress_page(uncomp_page, comp_page, ulong(len), NULL); if (buf_page_is_corrupted(false, uncomp_page, 0, space)) { - buf_page_print(uncomp_page, 0, 0); + buf_page_print(uncomp_page, 0); + ut_ad(0); } ut_free(comp_page); @@ -438,11 +455,6 @@ fil_compress_page( err_exit: if (allocated) { ut_free(out_buf); -#ifdef HAVE_LZO - if (comp_method == PAGE_LZO_ALGORITHM) { - ut_free(lzo_mem); - } -#endif } return (buf); @@ -504,7 +516,7 @@ fil_decompress_page( ptype != FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED)) { ib_logf(IB_LOG_LEVEL_ERROR, "Corruption: We try to uncompress corrupted page" - " CRC %lu type %lu len %lu.", + " CRC " ULINTPF " type " ULINTPF " len " ULINTPF ".", mach_read_from_4(buf+FIL_PAGE_SPACE_OR_CHKSUM), mach_read_from_2(buf+FIL_PAGE_TYPE), len); @@ -528,7 +540,7 @@ fil_decompress_page( if (actual_size == 0 || actual_size > UNIV_PAGE_SIZE) { ib_logf(IB_LOG_LEVEL_ERROR, "Corruption: We try to uncompress corrupted page" - " actual size %lu compression %s.", + " actual size " ULINTPF " compression %s.", actual_size, fil_get_compression_alg_name(compression_alg)); fflush(stderr); if (return_error) { @@ -543,12 +555,9 @@ fil_decompress_page( *write_size = actual_size; } -#ifdef UNIV_PAGECOMPRESS_DEBUG - ib_logf(IB_LOG_LEVEL_INFO, - "Preparing for decompress for len %lu\n", - actual_size); -#endif /* UNIV_PAGECOMPRESS_DEBUG */ - + DBUG_PRINT("compress", + ("Preparing for decompress for len " ULINTPF ".", + actual_size)); switch(compression_alg) { case PAGE_ZLIB_ALGORITHM: @@ -560,7 +569,7 @@ fil_decompress_page( ib_logf(IB_LOG_LEVEL_ERROR, "Corruption: Page is marked as compressed" " but uncompress failed with error %d " - " size %lu len %lu.", + " size " ULINTPF " len " ULINTPF ".", err, actual_size, len); fflush(stderr); @@ -579,9 +588,10 @@ fil_decompress_page( if (err != (int)actual_size) { ib_logf(IB_LOG_LEVEL_ERROR, "Corruption: Page is marked as compressed" - " but decompression read only %d bytes " - " size %lu len %lu.", + " but uncompress failed with error %d " + " size " ULINTPF " len " ULINTPF ".", err, actual_size, len); + fflush(stderr); if (return_error) { @@ -593,16 +603,17 @@ fil_decompress_page( #endif /* HAVE_LZ4 */ #ifdef HAVE_LZO case PAGE_LZO_ALGORITHM: { - ulint olen=0; + ulint olen = 0; err = lzo1x_decompress((const unsigned char *)buf+header_len, actual_size,(unsigned char *)in_buf, &olen, NULL); if (err != LZO_E_OK || (olen == 0 || olen > UNIV_PAGE_SIZE)) { ib_logf(IB_LOG_LEVEL_ERROR, "Corruption: Page is marked as compressed" - " but decompression read only %ld bytes" - " size %lu len %lu.", - olen, actual_size, len); + " but uncompress failed with error %d " + " size " ULINTPF " len " ULINTPF ".", + err, actual_size, len); + fflush(stderr); if (return_error) { @@ -637,7 +648,7 @@ fil_decompress_page( ib_logf(IB_LOG_LEVEL_ERROR, "Corruption: Page is marked as compressed" " but decompression read only %ld bytes" - " size %lu len %lu.", + " size " ULINTPF "len " ULINTPF ".", dst_pos, actual_size, len); fflush(stderr); @@ -666,7 +677,7 @@ fil_decompress_page( ib_logf(IB_LOG_LEVEL_ERROR, "Corruption: Page is marked as compressed" " but decompression read only %du bytes" - " size %lu len %lu err %d.", + " size " ULINTPF " len " ULINTPF " err %d.", dst_pos, actual_size, len, err); fflush(stderr); @@ -682,7 +693,7 @@ fil_decompress_page( case PAGE_SNAPPY_ALGORITHM: { snappy_status cstatus; - ulint olen = 0; + ulint olen = UNIV_PAGE_SIZE; cstatus = snappy_uncompress( (const char *)(buf+header_len), @@ -690,11 +701,11 @@ fil_decompress_page( (char *)in_buf, (size_t*)&olen); - if (cstatus != SNAPPY_OK || (olen == 0 || olen > UNIV_PAGE_SIZE)) { + if (cstatus != SNAPPY_OK || olen != UNIV_PAGE_SIZE) { ib_logf(IB_LOG_LEVEL_ERROR, "Corruption: Page is marked as compressed" - " but decompression read only %lu bytes" - " size %lu len %lu err %d.", + " but decompression read only " ULINTPF " bytes" + " size " ULINTPF " len " ULINTPF " err %d.", olen, actual_size, len, (int)cstatus); fflush(stderr); @@ -703,6 +714,7 @@ fil_decompress_page( } ut_error; } + break; } #endif /* HAVE_SNAPPY */ @@ -728,8 +740,7 @@ fil_decompress_page( memcpy(buf, in_buf, len); error_return: - // Need to free temporal buffer if no buffer was given - if (page_buf == NULL) { + if (page_buf != in_buf) { ut_free(in_buf); } } diff --git a/storage/xtradb/fsp/fsp0fsp.cc b/storage/xtradb/fsp/fsp0fsp.cc index 934824c6462..02683e298cb 100644 --- a/storage/xtradb/fsp/fsp0fsp.cc +++ b/storage/xtradb/fsp/fsp0fsp.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -673,16 +674,13 @@ fsp_header_init_fields( } #ifndef UNIV_HOTBACKUP -/**********************************************************************//** -Initializes the space header of a new created space and creates also the -insert buffer tree root if space == 0. */ +/** Initialize a tablespace header. +@param[in] space_id space id +@param[in] size current size in blocks +@param[in,out] mtr mini-transaction */ UNIV_INTERN void -fsp_header_init( -/*============*/ - ulint space_id, /*!< in: space id */ - ulint size, /*!< in: current size in blocks */ - mtr_t* mtr) /*!< in/out: mini-transaction */ +fsp_header_init(ulint space_id, ulint size, mtr_t* mtr) { fsp_header_t* header; buf_block_t* block; @@ -725,19 +723,17 @@ fsp_header_init( flst_init(header + FSP_SEG_INODES_FREE, mtr); mlog_write_ull(header + FSP_SEG_ID, 1, mtr); - if (space_id == 0) { - fsp_fill_free_list(FALSE, space_id, header, mtr); - btr_create(DICT_CLUSTERED | DICT_UNIVERSAL | DICT_IBUF, - 0, 0, DICT_IBUF_ID_MIN + space_id, - dict_ind_redundant, mtr); - } else { - fsp_fill_free_list(TRUE, space_id, header, mtr); - } + + fsp_fill_free_list(space_id != TRX_SYS_SPACE, space_id, header, mtr); fil_space_t* space = fil_space_acquire(space_id); ut_ad(space); - if (space->crypt_data) { + /* Write encryption metadata to page 0 if tablespace is + encrypted or encryption is disabled by table option. */ + if (space->crypt_data && + (space->crypt_data->should_encrypt() || + space->crypt_data->not_encrypted())) { space->crypt_data->write_page0(page, mtr); } @@ -2053,15 +2049,6 @@ fseg_create_general( mtr_x_lock(latch, mtr); - if (rw_lock_get_x_lock_count(latch) == 1) { - /* This thread did not own the latch before this call: free - excess pages from the insert buffer free list */ - - if (space == IBUF_SPACE_ID) { - ibuf_free_excess_pages(); - } - } - if (!has_done_reservation) { success = fsp_reserve_free_extents(&n_reserved, space, 2, FSP_NORMAL, mtr); @@ -2075,7 +2062,6 @@ fseg_create_general( inode = fsp_alloc_seg_inode(space_header, mtr); if (inode == NULL) { - goto funct_exit; } @@ -2633,15 +2619,6 @@ fseg_alloc_free_page_general( mtr_x_lock(latch, mtr); - if (rw_lock_get_x_lock_count(latch) == 1) { - /* This thread did not own the latch before this call: free - excess pages from the insert buffer free list */ - - if (space == IBUF_SPACE_ID) { - ibuf_free_excess_pages(); - } - } - inode = fseg_inode_get(seg_header, space, zip_size, mtr); if (!has_done_reservation @@ -2750,7 +2727,6 @@ fsp_reserve_free_extents( ibool success; ulint n_pages_added; size_t total_reserved = 0; - ulint rounds = 0; ut_ad(mtr); *n_reserved = n_ext; @@ -2829,17 +2805,7 @@ try_to_extend: success = fsp_try_extend_data_file(&n_pages_added, space, space_header, mtr); if (success && n_pages_added > 0) { - - rounds++; total_reserved += n_pages_added; - - if (rounds > 50) { - ib_logf(IB_LOG_LEVEL_INFO, - "Space id %lu trying to reserve %lu extents actually reserved %lu " - " reserve %lu free %lu size %lu rounds %lu total_reserved %llu", - space, n_ext, n_pages_added, reserve, n_free, size, rounds, (ullint) total_reserved); - } - goto try_again; } @@ -4160,20 +4126,8 @@ ulint fsp_header_get_crypt_offset( const ulint zip_size) { - ulint pageno = 0; - /* compute first page_no that will have xdes stored on page != 0*/ - for (ulint i = 0; - (pageno = xdes_calc_descriptor_page(zip_size, i)) == 0; ) - i++; - - /* use pageno prior to this...i.e last page on page 0 */ - ut_ad(pageno > 0); - pageno--; - - ulint iv_offset = XDES_ARR_OFFSET + - XDES_SIZE * (1 + xdes_calc_descriptor_index(zip_size, pageno)); - - return FSP_HEADER_OFFSET + iv_offset; + return (FSP_HEADER_OFFSET + (XDES_ARR_OFFSET + XDES_SIZE * + (zip_size ? zip_size : UNIV_PAGE_SIZE) / FSP_EXTENT_SIZE)); } /**********************************************************************//** diff --git a/storage/xtradb/fts/fts0que.cc b/storage/xtradb/fts/fts0que.cc index 2e335c1c255..f24973e26fb 100644 --- a/storage/xtradb/fts/fts0que.cc +++ b/storage/xtradb/fts/fts0que.cc @@ -953,6 +953,18 @@ fts_query_free_doc_ids( query->total_size -= SIZEOF_RBT_CREATE; } +/** +Free the query intersection +@param[in] query query instance */ +static +void +fts_query_free_intersection( + fts_query_t* query) +{ + fts_query_free_doc_ids(query, query->intersection); + query->intersection = NULL; +} + /*******************************************************************//** Add the word to the documents "list" of matching words from the query. We make a copy of the word from the query heap. */ @@ -1311,6 +1323,7 @@ fts_query_intersect( /* error is passed by 'query->error' */ if (query->error != DB_SUCCESS) { ut_ad(query->error == DB_FTS_EXCEED_RESULT_CACHE_LIMIT); + fts_query_free_intersection(query); return(query->error); } @@ -1339,6 +1352,8 @@ fts_query_intersect( ut_a(!query->multi_exist || (query->multi_exist && rbt_size(query->doc_ids) <= n_doc_ids)); + } else if (query->intersection != NULL) { + fts_query_free_intersection(query); } } @@ -1557,6 +1572,11 @@ fts_merge_doc_ids( query, ranking->doc_id, ranking->rank); if (query->error != DB_SUCCESS) { + if (query->intersection != NULL) + { + ut_a(query->oper == FTS_EXIST); + fts_query_free_intersection(query); + } DBUG_RETURN(query->error); } diff --git a/storage/xtradb/handler/ha_innodb.cc b/storage/xtradb/handler/ha_innodb.cc index 11779a66e7c..a56dda417cc 100644 --- a/storage/xtradb/handler/ha_innodb.cc +++ b/storage/xtradb/handler/ha_innodb.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 2000, 2016, Oracle and/or its affiliates. +Copyright (c) 2000, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2013, 2017, MariaDB Corporation. Copyright (c) 2008, 2009 Google Inc. Copyright (c) 2009, Percona Inc. @@ -32,7 +32,7 @@ this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA *****************************************************************************/ - + #define MYSQL_SERVER #include // explain_filename, nz2, EXPLAIN_PARTITIONS_AS_COMMENT, @@ -289,7 +289,8 @@ static TYPELIB innodb_stats_method_typelib = { /** Possible values for system variables "innodb_checksum_algorithm" and "innodb_log_checksum_algorithm". */ -static const char* innodb_checksum_algorithm_names[] = { +UNIV_INTERN +const char* innodb_checksum_algorithm_names[] = { "CRC32", "STRICT_CRC32", "INNODB", @@ -301,7 +302,8 @@ static const char* innodb_checksum_algorithm_names[] = { /** Used to define an enumerate type of the system variables innodb_checksum_algorithm and innodb_log_checksum_algorithm. */ -static TYPELIB innodb_checksum_algorithm_typelib = { +UNIV_INTERN +TYPELIB innodb_checksum_algorithm_typelib = { array_elements(innodb_checksum_algorithm_names) - 1, "innodb_checksum_algorithm_typelib", innodb_checksum_algorithm_names, @@ -874,17 +876,31 @@ innobase_purge_changed_page_bitmaps( /*================================*/ ulonglong lsn) __attribute__((unused)); /*!< in: LSN to purge files up to */ +/** Empty free list algorithm. +Checks if buffer pool is big enough to enable backoff algorithm. +InnoDB empty free list algorithm backoff requires free pages +from LRU for the best performance. +buf_LRU_buf_pool_running_out cancels query if 1/4 of +buffer pool belongs to LRU or freelist. +At the same time buf_flush_LRU_list_batch +keeps up to BUF_LRU_MIN_LEN in LRU. +In order to avoid deadlock baclkoff requires buffer pool +to be at least 4*BUF_LRU_MIN_LEN, +but flush peformance is bad because of trashing +and additional BUF_LRU_MIN_LEN pages are requested. +@param[in] algorithm desired algorithm from srv_empty_free_list_t +@return true if it's possible to enable backoff. */ +static inline +bool +innodb_empty_free_list_algorithm_allowed( + srv_empty_free_list_t algorithm) +{ + long long buf_pool_pages = srv_buf_pool_size / srv_page_size + / srv_buf_pool_instances; -/*****************************************************************//** -Check whether this is a fake change transaction. -@return TRUE if a fake change transaction */ -static -my_bool -innobase_is_fake_change( -/*====================*/ - handlerton *hton, /*!< in: InnoDB handlerton */ - THD* thd) __attribute__((unused)); /*!< in: MySQL thread handle of the user for - whom the transaction is being committed */ + return(buf_pool_pages >= BUF_LRU_MIN_LEN * (4 + 1) + || algorithm != SRV_EMPTY_FREE_LIST_BACKOFF); +} /** Get the list of foreign keys referencing a specified table table. @@ -1298,6 +1314,18 @@ static SHOW_VAR innodb_status_variables[]= { {"encryption_key_rotation_list_length", (char*)&export_vars.innodb_key_rotation_list_length, SHOW_LONGLONG}, + {"encryption_n_merge_blocks_encrypted", + (char*)&export_vars.innodb_n_merge_blocks_encrypted, + SHOW_LONGLONG}, + {"encryption_n_merge_blocks_decrypted", + (char*)&export_vars.innodb_n_merge_blocks_decrypted, + SHOW_LONGLONG}, + {"encryption_n_rowlog_blocks_encrypted", + (char*)&export_vars.innodb_n_rowlog_blocks_encrypted, + SHOW_LONGLONG}, + {"encryption_n_rowlog_blocks_decrypted", + (char*)&export_vars.innodb_n_rowlog_blocks_decrypted, + SHOW_LONGLONG}, /* Scrubing feature */ {"scrub_background_page_reorganizations", @@ -1599,14 +1627,11 @@ innobase_drop_database( the path is used as the database name: for example, in 'mysql/data/test' the database name is 'test' */ -/*******************************************************************//** -Closes an InnoDB database. */ +/** Shut down the InnoDB storage engine. +@return 0 */ static int -innobase_end( -/*=========*/ - handlerton* hton, /* in: Innodb handlerton */ - ha_panic_function type); +innobase_end(handlerton*, ha_panic_function); #if NOT_USED /*****************************************************************//** @@ -1701,28 +1726,6 @@ normalize_table_name_low( ibool set_lower_case); /* in: TRUE if we want to set name to lower case */ -/*************************************************************//** -Checks if buffer pool is big enough to enable backoff algorithm. -InnoDB empty free list algorithm backoff requires free pages -from LRU for the best performance. -buf_LRU_buf_pool_running_out cancels query if 1/4 of -buffer pool belongs to LRU or freelist. -At the same time buf_flush_LRU_list_batch -keeps up to BUF_LRU_MIN_LEN in LRU. -In order to avoid deadlock baclkoff requires buffer pool -to be at least 4*BUF_LRU_MIN_LEN, -but flush peformance is bad because of trashing -and additional BUF_LRU_MIN_LEN pages are requested. -@return true if it's possible to enable backoff. */ -static -bool -innodb_empty_free_list_algorithm_backoff_allowed( - srv_empty_free_list_t - algorithm, /*!< in: desired algorithm - from srv_empty_free_list_t */ - long long buf_pool_pages); /*!< in: total number - of pages inside buffer pool */ - #ifdef NOT_USED /*************************************************************//** Removes old archived transaction log files. @@ -2018,7 +2021,9 @@ thd_supports_xa( THD* thd) /*!< in: thread handle, or NULL to query the global innodb_supports_xa */ { - return(THDVAR(thd, support_xa)); + /* THDVAR cannot be used in xtrabackup, + plugin variables for innodb are not loaded. */ + return (thd || !IS_XTRABACKUP())? THDVAR(thd, support_xa): FALSE; } /** Get the value of innodb_tmpdir. @@ -2051,7 +2056,9 @@ thd_fake_changes( THD* thd) /*!< in: thread handle, or NULL to query the global innodb_supports_xa */ { - return(THDVAR((THD*) thd, fake_changes)); + /* THDVAR cannot be used in xtrabackup, + plugin variables for innodb are not loaded */ + return (thd || !IS_XTRABACKUP())? THDVAR((THD*) thd, fake_changes) : FALSE ; } /******************************************************************//** @@ -2091,7 +2098,10 @@ thd_flush_log_at_trx_commit( /*================================*/ void* thd) { - return(THDVAR((THD*) thd, flush_log_at_trx_commit)); + /* THDVAR cannot be used in xtrabackup, + plugin variables for innodb are not loaded, + this makes xtrabackup crash when trying to use them. */ + return (thd || !IS_XTRABACKUP())? THDVAR((THD*)thd, flush_log_at_trx_commit) : FALSE; } /********************************************************************//** @@ -2124,39 +2134,6 @@ ha_innobase::is_fake_change_enabled(THD* thd) return(trx && UNIV_UNLIKELY(trx->fake_changes)); } -/********************************************************************//** -In XtraDB it is impossible for a transaction to own a search latch outside of -InnoDB code, so there is nothing to release on demand. We keep this function to -simplify maintenance. -@return 0 */ -static -int -innobase_release_temporary_latches( -/*===============================*/ - handlerton* hton MY_ATTRIBUTE((unused)), /*!< in: handlerton */ - THD* thd MY_ATTRIBUTE((unused))) /*!< in: MySQL thread */ -{ -#ifdef UNIV_DEBUG - DBUG_ASSERT(hton == innodb_hton_ptr); - - if (!innodb_inited || thd == NULL) { - - return(0); - } - - trx_t* trx = thd_to_trx(thd); - - if (trx != NULL) { -#ifdef UNIV_SYNC_DEBUG - ut_ad(!btr_search_own_any()); -#endif - trx_search_latch_release_if_reserved(trx); - } -#endif - - return(0); -} - /********************************************************************//** Increments innobase_active_counter and every INNOBASE_WAKE_INTERVALth time calls srv_active_wake_master_thread. This function should be used @@ -2306,18 +2283,33 @@ convert_error_code_to_mysql( case DB_TOO_BIG_RECORD: { /* If prefix is true then a 768-byte prefix is stored - locally for BLOB fields. Refer to dict_table_get_format() */ + locally for BLOB fields. Refer to dict_table_get_format(). + Note that in page0zip.ic page_zip_rec_needs_ext() rec_size + is limited to COMPRESSED_REC_MAX_DATA_SIZE (16K) or + REDUNDANT_REC_MAX_DATA_SIZE (16K-1). */ bool prefix = (dict_tf_get_format(flags) == UNIV_FORMAT_A); + bool comp = !!(flags & DICT_TF_COMPACT); + ulint free_space = page_get_free_space_of_empty(comp) / 2; + + if (free_space >= (comp ? COMPRESSED_REC_MAX_DATA_SIZE : + REDUNDANT_REC_MAX_DATA_SIZE)) { + free_space = (comp ? COMPRESSED_REC_MAX_DATA_SIZE : + REDUNDANT_REC_MAX_DATA_SIZE) - 1; + } + my_printf_error(ER_TOO_BIG_ROWSIZE, "Row size too large (> %lu). Changing some columns " "to TEXT or BLOB %smay help. In current row " "format, BLOB prefix of %d bytes is stored inline.", MYF(0), - page_get_free_space_of_empty(flags & - DICT_TF_COMPACT) / 2, - prefix ? "or using ROW_FORMAT=DYNAMIC " - "or ROW_FORMAT=COMPRESSED ": "", - prefix ? DICT_MAX_FIXED_COL_LEN : 0); + free_space, + prefix + ? "or using ROW_FORMAT=DYNAMIC or" + " ROW_FORMAT=COMPRESSED " + : "", + prefix + ? DICT_MAX_FIXED_COL_LEN + : 0); return(HA_ERR_TO_BIG_ROW); } @@ -2587,16 +2579,11 @@ innobase_get_stmt( THD* thd, /*!< in: MySQL thread handle */ size_t* length) /*!< out: length of the SQL statement */ { - const char* query = NULL; - LEX_STRING *stmt = NULL; - if (thd) { - stmt = thd_query_string(thd); - if (stmt) { - *length = stmt->length; - query = stmt->str; - } + if (const LEX_STRING *stmt = thd_query_string(thd)) { + *length = stmt->length; + return stmt->str; } - return (query); + return NULL; } /**********************************************************************//** @@ -3058,7 +3045,7 @@ trx_is_started( /****************************************************************//** Update log_checksum_algorithm_ptr with a pointer to the function corresponding to a given checksum algorithm. */ -static + void innodb_log_checksum_func_update( /*============================*/ @@ -3496,13 +3483,13 @@ innobase_convert_identifier( ibool file_id)/*!< in: TRUE=id is a table or database name; FALSE=id is an UTF-8 string */ { + char nz2[MAX_TABLE_NAME_LEN + 1]; const char* s = id; int q; if (file_id) { char nz[MAX_TABLE_NAME_LEN + 1]; - char nz2[MAX_TABLE_NAME_LEN + 1]; /* Decode the table name. The MySQL function expects a NUL-terminated string. The input and output strings @@ -3820,9 +3807,6 @@ innobase_init( innobase_hton->flags = HTON_SUPPORTS_EXTENDED_KEYS | HTON_SUPPORTS_FOREIGN_KEYS; - innobase_hton->release_temporary_latches = - innobase_release_temporary_latches; - innobase_hton->kill_query = innobase_kill_connection; if (srv_file_per_table) @@ -4365,10 +4349,9 @@ innobase_change_buffering_inited_ok: srv_use_posix_fallocate = (ibool) innobase_use_fallocate; #endif /* Do not enable backoff algorithm for small buffer pool. */ - if (!innodb_empty_free_list_algorithm_backoff_allowed( + if (!innodb_empty_free_list_algorithm_allowed( static_cast( - srv_empty_free_list_algorithm), - innobase_buffer_pool_size / srv_page_size)) { + srv_empty_free_list_algorithm))) { sql_print_information( "InnoDB: innodb_empty_free_list_algorithm " "has been changed to legacy " @@ -4503,21 +4486,13 @@ error: DBUG_RETURN(TRUE); } -/*******************************************************************//** -Closes an InnoDB database. -@return TRUE if error */ +/** Shut down the InnoDB storage engine. +@return 0 */ static int -innobase_end( -/*=========*/ - handlerton* hton, /*!< in/out: InnoDB handlerton */ - ha_panic_function type MY_ATTRIBUTE((unused))) - /*!< in: ha_panic() parameter */ +innobase_end(handlerton*, ha_panic_function) { - int err= 0; - DBUG_ENTER("innobase_end"); - DBUG_ASSERT(hton == innodb_hton_ptr); if (innodb_inited) { @@ -4534,9 +4509,7 @@ innobase_end( innodb_inited = 0; hash_table_free(innobase_open_tables); innobase_open_tables = NULL; - if (innobase_shutdown_for_mysql() != DB_SUCCESS) { - err = 1; - } + innodb_shutdown(); srv_free_paths_and_sizes(); my_free(internal_innobase_data_file_path); mysql_mutex_destroy(&innobase_share_mutex); @@ -4545,7 +4518,7 @@ innobase_end( mysql_mutex_destroy(&pending_checkpoint_mutex); } - DBUG_RETURN(err); + DBUG_RETURN(0); } /****************************************************************//** @@ -4599,22 +4572,6 @@ innobase_purge_changed_page_bitmaps( return (my_bool)log_online_purge_changed_page_bitmaps(lsn); } -/*****************************************************************//** -Check whether this is a fake change transaction. -@return TRUE if a fake change transaction */ -static -my_bool -innobase_is_fake_change( -/*====================*/ - handlerton *hton MY_ATTRIBUTE((unused)), - /*!< in: InnoDB handlerton */ - THD* thd) /*!< in: MySQL thread handle of the user for - whom the transaction is being committed */ -{ - trx_t* trx = check_trx_exists(thd); - return UNIV_UNLIKELY(trx->fake_changes); -} - /*****************************************************************//** Commits a transaction in an InnoDB database. */ static @@ -6233,20 +6190,23 @@ ha_innobase::innobase_initialize_autoinc() break; } case DB_RECORD_NOT_FOUND: - ut_print_timestamp(stderr); - fprintf(stderr, " InnoDB: MySQL and InnoDB data " - "dictionaries are out of sync.\n" - "InnoDB: Unable to find the AUTOINC column " - "%s in the InnoDB table %s.\n" - "InnoDB: We set the next AUTOINC column " - "value to 0,\n" - "InnoDB: in effect disabling the AUTOINC " - "next value generation.\n" - "InnoDB: You can either set the next " - "AUTOINC value explicitly using ALTER TABLE\n" - "InnoDB: or fix the data dictionary by " - "recreating the table.\n", - col_name, index->table->name); + char buf[MAX_FULL_NAME_LEN]; + ut_format_name(index->table->name, TRUE, buf, sizeof(buf)); + + ib_logf(IB_LOG_LEVEL_ERROR, + "MySQL and InnoDB data " + "dictionaries are out of sync." + " Unable to find the AUTOINC column " + " %s in the InnoDB table %s." + " We set the next AUTOINC column " + "value to 0" + " in effect disabling the AUTOINC " + "next value generation." + " You can either set the next " + "AUTOINC value explicitly using ALTER TABLE " + " or fix the data dictionary by " + "recreating the table.", + col_name, buf); /* This will disable the AUTOINC generation. */ auto_inc = 0; @@ -6293,9 +6253,6 @@ ha_innobase::open( thd = ha_thd(); - /* No-op in XtraDB */ - innobase_release_temporary_latches(ht, thd); - normalize_table_name(norm_name, name); user_thd = NULL; @@ -6305,7 +6262,7 @@ ha_innobase::open( DBUG_RETURN(1); } - if (UNIV_UNLIKELY(share->ib_table && share->ib_table->is_corrupt && + if (UNIV_UNLIKELY(share->ib_table && share->ib_table->corrupted && srv_pass_corrupt_table <= 1)) { free_share(share); @@ -6341,23 +6298,24 @@ ha_innobase::open( && (table->s->fields != dict_table_get_n_user_cols(ib_table) - 1)))) { ib_logf(IB_LOG_LEVEL_WARN, - "table %s contains %lu user defined columns " - "in InnoDB, but %lu columns in MySQL. Please " + "table %s contains " ULINTPF " user defined columns " + "in InnoDB, but %u columns in MySQL. Please " "check INFORMATION_SCHEMA.INNODB_SYS_COLUMNS and " REFMAN "innodb-troubleshooting.html " "for how to resolve it", - norm_name, (ulong) dict_table_get_n_user_cols(ib_table), - (ulong) table->s->fields); + norm_name, dict_table_get_n_user_cols(ib_table), + table->s->fields); /* Mark this table as corrupted, so the drop table or force recovery can still use it, but not others. */ ib_table->corrupted = true; + ib_table->file_unreadable = true; dict_table_close(ib_table, FALSE, FALSE); ib_table = NULL; is_part = NULL; } - if (UNIV_UNLIKELY(ib_table && ib_table->is_corrupt && + if (UNIV_UNLIKELY(ib_table && ib_table->corrupted && srv_pass_corrupt_table <= 1)) { free_share(share); my_free(upd_buf); @@ -6464,10 +6422,8 @@ table_opened: innobase_copy_frm_flags_from_table_share(ib_table, table->s); - ib_table->thd = (void*)thd; - /* No point to init any statistics if tablespace is still encrypted. */ - if (!ib_table->is_encrypted) { + if (ib_table->is_readable()) { dict_stats_init(ib_table); } else { ib_table->stat_initialized = 1; @@ -6475,7 +6431,9 @@ table_opened: MONITOR_INC(MONITOR_TABLE_OPEN); - bool no_tablespace; + bool no_tablespace = false; + bool encrypted = false; + FilSpace space; if (dict_table_is_discarded(ib_table)) { @@ -6490,23 +6448,28 @@ table_opened: no_tablespace = false; - } else if (ib_table->ibd_file_missing) { + } else if (!ib_table->is_readable()) { + space = fil_space_acquire_silent(ib_table->space); - ib_senderrf( - thd, IB_LOG_LEVEL_WARN, - ER_TABLESPACE_MISSING, norm_name); + if (space()) { + if (space()->crypt_data && space()->crypt_data->is_encrypted()) { + /* This means that tablespace was found but we could not + decrypt encrypted page. */ + no_tablespace = true; + encrypted = true; + } else { + no_tablespace = true; + } + } else { + ib_senderrf( + thd, IB_LOG_LEVEL_WARN, + ER_TABLESPACE_MISSING, norm_name); - /* This means we have no idea what happened to the tablespace - file, best to play it safe. */ + /* This means we have no idea what happened to the tablespace + file, best to play it safe. */ - no_tablespace = true; - } else if (ib_table->is_encrypted) { - /* This means that tablespace was found but we could not - decrypt encrypted page. */ - no_tablespace = true; - ib_table->ibd_file_missing = true; - } else { - no_tablespace = false; + no_tablespace = true; + } } if (!thd_tablespace_op(thd) && no_tablespace) { @@ -6517,27 +6480,33 @@ table_opened: /* If table has no talespace but it has crypt data, check is tablespace made unaccessible because encryption service or used key_id is not available. */ - if (ib_table) { - fil_space_crypt_t* crypt_data = ib_table->crypt_data; + if (encrypted) { + bool warning_pushed = false; + char buf[MAX_FULL_NAME_LEN]; + ut_format_name(ib_table->name, TRUE, buf, sizeof(buf)); - if (crypt_data && crypt_data->should_encrypt()) { - - if (!encryption_key_id_exists(crypt_data->key_id)) { - push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, - HA_ERR_DECRYPTION_FAILED, - "Table %s is encrypted but encryption service or" - " used key_id %u is not available. " - " Can't continue reading table.", - ib_table->name, crypt_data->key_id); - ret_err = HA_ERR_DECRYPTION_FAILED; - } - } else if (ib_table->is_encrypted) { + if (!encryption_key_id_exists(space()->crypt_data->key_id)) { push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, HA_ERR_DECRYPTION_FAILED, - "Table %s is encrypted but encryption service or" + "Table %s in file %s is encrypted but encryption service or" + " used key_id %u is not available. " + " Can't continue reading table.", + buf, space()->chain.start->name, + space()->crypt_data->key_id); + ret_err = HA_ERR_DECRYPTION_FAILED; + warning_pushed = true; + } + + /* If table is marked as encrypted then we push + warning if it has not been already done as used + key_id might be found but it is incorrect. */ + if (!warning_pushed) { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + HA_ERR_DECRYPTION_FAILED, + "Table %s in file %s is encrypted but encryption service or" " used key_id is not available. " " Can't continue reading table.", - ib_table->name); + buf, space()->chain.start->name); ret_err = HA_ERR_DECRYPTION_FAILED; } } @@ -6673,7 +6642,7 @@ table_opened: /* Only if the table has an AUTOINC column. */ if (prebuilt->table != NULL - && !prebuilt->table->ibd_file_missing + && prebuilt->table->is_readable() && table->found_next_number_field != NULL) { dict_table_autoinc_lock(prebuilt->table); @@ -6743,9 +6712,6 @@ ha_innobase::close() thd = ha_thd(); - /* No-op in XtraDB */ - innobase_release_temporary_latches(ht, thd); - row_prebuilt_free(prebuilt, FALSE); if (upd_buf != NULL) { @@ -8146,17 +8112,31 @@ build_template_field( templ->rec_field_is_prefix = FALSE; if (dict_index_is_clust(index)) { + templ->rec_field_is_prefix = false; templ->rec_field_no = templ->clust_rec_field_no; templ->rec_prefix_field_no = ULINT_UNDEFINED; } else { - /* If we're in a secondary index, keep track - * of the original index position even if this - * is just a prefix index; we will use this - * later to avoid a cluster index lookup in - * some cases.*/ + /* If we're in a secondary index, keep track of the original + index position even if this is just a prefix index; we will use + this later to avoid a cluster index lookup in some cases.*/ templ->rec_field_no = dict_index_get_nth_col_pos(index, i, &templ->rec_prefix_field_no); + templ->rec_field_is_prefix + = (templ->rec_field_no == ULINT_UNDEFINED) + && (templ->rec_prefix_field_no != ULINT_UNDEFINED); +#ifdef UNIV_DEBUG + if (templ->rec_prefix_field_no != ULINT_UNDEFINED) + { + const dict_field_t* field = dict_index_get_nth_field( + index, + templ->rec_prefix_field_no); + ut_ad(templ->rec_field_is_prefix + == (field->prefix_len != 0)); + } else { + ut_ad(!templ->rec_field_is_prefix); + } +#endif } if (field->real_maybe_null()) { @@ -8546,8 +8526,8 @@ ha_innobase::innobase_lock_autoinc(void) break; } } - /* Fall through to old style locking. */ - + /* Use old style locking. */ + /* fall through */ case AUTOINC_OLD_STYLE_LOCKING: DBUG_EXECUTE_IF("die_if_autoinc_old_lock_style_used", ut_ad(0);); @@ -8658,16 +8638,6 @@ ha_innobase::write_row( ha_statistic_increment(&SSV::ha_write_count); - if (share->ib_table != prebuilt->table) { - fprintf(stderr, - "InnoDB: Warning: share->ib_table %p prebuilt->table %p table %s is_corrupt %lu.", - share->ib_table, prebuilt->table, prebuilt->table->name, prebuilt->table->is_corrupt); - } - - if (UNIV_UNLIKELY(share->ib_table && share->ib_table->is_corrupt)) { - DBUG_RETURN(HA_ERR_CRASHED); - } - sql_command = thd_sql_command(user_thd); if ((sql_command == SQLCOM_ALTER_TABLE @@ -9005,16 +8975,6 @@ wsrep_error: func_exit: innobase_active_small(); - if (share->ib_table != prebuilt->table) { - fprintf(stderr, - "InnoDB: Warning: share->ib_table %p prebuilt->table %p table %s is_corrupt %lu.", - share->ib_table, prebuilt->table, prebuilt->table->name, prebuilt->table->is_corrupt); - } - - if (UNIV_UNLIKELY(share->ib_table && share->ib_table->is_corrupt)) { - DBUG_RETURN(HA_ERR_CRASHED); - } - DBUG_RETURN(error_result); } @@ -9144,8 +9104,8 @@ calc_row_difference( } } - if (o_len != n_len || (o_len != UNIV_SQL_NULL && - 0 != memcmp(o_ptr, n_ptr, o_len))) { + if (o_len != n_len || (o_len != 0 && o_len != UNIV_SQL_NULL + && 0 != memcmp(o_ptr, n_ptr, o_len))) { /* The field has changed */ ufield = uvect->fields + n_changed; @@ -9425,16 +9385,6 @@ ha_innobase::update_row( ha_statistic_increment(&SSV::ha_update_count); - if (share->ib_table != prebuilt->table) { - fprintf(stderr, - "InnoDB: Warning: share->ib_table %p prebuilt->table %p table %s is_corrupt %lu.", - share->ib_table, prebuilt->table, prebuilt->table->name, prebuilt->table->is_corrupt); - } - - if (UNIV_UNLIKELY(share->ib_table && share->ib_table->is_corrupt)) { - DBUG_RETURN(HA_ERR_CRASHED); - } - if (prebuilt->upd_node) { uvect = prebuilt->upd_node->update; } else { @@ -9540,16 +9490,6 @@ func_exit: wsrep_error: #endif /* WITH_WSREP */ - if (share->ib_table != prebuilt->table) { - fprintf(stderr, - "InnoDB: Warning: share->ib_table %p prebuilt->table %p table %s is_corrupt %lu.", - share->ib_table, prebuilt->table, prebuilt->table->name, prebuilt->table->is_corrupt); - } - - if (UNIV_UNLIKELY(share->ib_table && share->ib_table->is_corrupt)) { - DBUG_RETURN(HA_ERR_CRASHED); - } - DBUG_RETURN(err); } @@ -9578,11 +9518,6 @@ ha_innobase::delete_row( ha_statistic_increment(&SSV::ha_delete_count); - if (UNIV_UNLIKELY(share && share->ib_table - && share->ib_table->is_corrupt)) { - DBUG_RETURN(HA_ERR_CRASHED); - } - if (!prebuilt->upd_node) { row_get_prebuilt_update_vector(prebuilt); } @@ -9617,11 +9552,6 @@ ha_innobase::delete_row( wsrep_error: #endif /* WITH_WSREP */ - if (UNIV_UNLIKELY(share && share->ib_table - && share->ib_table->is_corrupt)) { - DBUG_RETURN(HA_ERR_CRASHED); - } - DBUG_RETURN(convert_error_code_to_mysql( error, prebuilt->table->flags, user_thd)); } @@ -9872,17 +9802,13 @@ ha_innobase::index_read( ha_statistic_increment(&SSV::ha_read_key_count); - if (UNIV_UNLIKELY(srv_pass_corrupt_table <= 1 && share - && share->ib_table && share->ib_table->is_corrupt)) { - DBUG_RETURN(HA_ERR_CRASHED); - } - index = prebuilt->index; if (UNIV_UNLIKELY(index == NULL) || dict_index_is_corrupted(index)) { prebuilt->index_usable = FALSE; DBUG_RETURN(HA_ERR_CRASHED); } + if (UNIV_UNLIKELY(!prebuilt->index_usable)) { DBUG_RETURN(dict_index_is_corrupted(index) ? HA_ERR_INDEX_CORRUPT @@ -9949,11 +9875,6 @@ ha_innobase::index_read( ret = DB_UNSUPPORTED; } - if (UNIV_UNLIKELY(srv_pass_corrupt_table <= 1 && share - && share->ib_table && share->ib_table->is_corrupt)) { - DBUG_RETURN(HA_ERR_CRASHED); - } - switch (ret) { case DB_SUCCESS: error = 0; @@ -10113,11 +10034,6 @@ ha_innobase::change_active_index( { DBUG_ENTER("change_active_index"); - if (UNIV_UNLIKELY(srv_pass_corrupt_table <= 1 && share - && share->ib_table && share->ib_table->is_corrupt)) { - DBUG_RETURN(HA_ERR_CRASHED); - } - ut_ad(user_thd == ha_thd()); ut_a(prebuilt->trx == thd_to_trx(user_thd)); @@ -10237,13 +10153,23 @@ ha_innobase::general_fetch( DBUG_RETURN(HA_ERR_END_OF_FILE); } - if (UNIV_UNLIKELY(srv_pass_corrupt_table <= 1 && share - && share->ib_table && share->ib_table->is_corrupt)) { - DBUG_RETURN(HA_ERR_CRASHED); - } - ut_a(prebuilt->trx == thd_to_trx(user_thd)); + if (prebuilt->table->is_readable()) { + } else { + if (prebuilt->table->corrupted) { + DBUG_RETURN(HA_ERR_CRASHED); + } else { + FilSpace space(prebuilt->table->space, true); + + if (space()) { + DBUG_RETURN(HA_ERR_DECRYPTION_FAILED); + } else { + DBUG_RETURN(HA_ERR_NO_SUCH_TABLE); + } + } + } + innobase_srv_conc_enter_innodb(prebuilt->trx); ret = row_search_for_mysql( @@ -10251,11 +10177,6 @@ ha_innobase::general_fetch( innobase_srv_conc_exit_innodb(prebuilt->trx); - if (UNIV_UNLIKELY(srv_pass_corrupt_table <= 1 && share - && share->ib_table && share->ib_table->is_corrupt)) { - DBUG_RETURN(HA_ERR_CRASHED); - } - switch (ret) { case DB_SUCCESS: error = 0; @@ -11908,7 +11829,8 @@ create_options_are_invalid( case ROW_TYPE_DYNAMIC: CHECK_ERROR_ROW_TYPE_NEEDS_FILE_PER_TABLE(use_tablespace); CHECK_ERROR_ROW_TYPE_NEEDS_GT_ANTELOPE; - /* fall through since dynamic also shuns KBS */ + /* ROW_FORMAT=DYNAMIC also shuns KEY_BLOCK_SIZE */ + /* fall through */ case ROW_TYPE_COMPACT: case ROW_TYPE_REDUNDANT: if (kbs_specified) { @@ -12318,7 +12240,8 @@ index_bad: break; /* Correct row_format */ } zip_allowed = FALSE; - /* fall through to set row_format = COMPACT */ + /* Set ROW_FORMAT = COMPACT */ + /* fall through */ case ROW_TYPE_NOT_USED: case ROW_TYPE_FIXED: case ROW_TYPE_PAGE: @@ -12327,6 +12250,7 @@ index_bad: thd, Sql_condition::WARN_LEVEL_WARN, ER_ILLEGAL_HA_CREATE_OPTION, "InnoDB: assuming ROW_FORMAT=COMPACT."); + /* fall through */ case ROW_TYPE_DEFAULT: /* If we fell through, set row format to Compact. */ row_format = ROW_TYPE_COMPACT; @@ -12984,7 +12908,7 @@ ha_innobase::discard_or_import_tablespace( user may want to set the DISCARD flag in order to IMPORT a new tablespace. */ - if (dict_table->ibd_file_missing) { + if (!dict_table->is_readable()) { ib_senderrf( prebuilt->trx->mysql_thd, IB_LOG_LEVEL_WARN, ER_TABLESPACE_MISSING, @@ -12994,7 +12918,7 @@ ha_innobase::discard_or_import_tablespace( err = row_discard_tablespace_for_mysql( dict_table->name, prebuilt->trx); - } else if (!dict_table->ibd_file_missing) { + } else if (dict_table->is_readable()) { /* Commit the transaction in order to release the table lock. */ trx_commit_for_mysql(prebuilt->trx); @@ -13071,15 +12995,7 @@ ha_innobase::truncate() update_thd(ha_thd()); - if (share->ib_table != prebuilt->table) { - fprintf(stderr, - "InnoDB: Warning: share->ib_table %p prebuilt->table %p table %s is_corrupt %lu.", - share->ib_table, prebuilt->table, prebuilt->table->name, prebuilt->table->is_corrupt); - } - - if (UNIV_UNLIKELY(share->ib_table && share->ib_table->is_corrupt)) { - DBUG_RETURN(HA_ERR_CRASHED); - } + DBUG_ASSERT(share->ib_table == prebuilt->table); if (UNIV_UNLIKELY(prebuilt->trx->fake_changes)) { DBUG_RETURN(HA_ERR_WRONG_COMMAND); @@ -13092,16 +13008,6 @@ ha_innobase::truncate() err = row_truncate_table_for_mysql(prebuilt->table, prebuilt->trx); - if (share->ib_table != prebuilt->table) { - fprintf(stderr, - "InnoDB: Warning: share->ib_table %p prebuilt->table %p table %s is_corrupt %lu.", - share->ib_table, prebuilt->table, prebuilt->table->name, prebuilt->table->is_corrupt); - } - - if (UNIV_UNLIKELY(share->ib_table && share->ib_table->is_corrupt)) { - DBUG_RETURN(HA_ERR_CRASHED); - } - switch (err) { case DB_TABLESPACE_DELETED: @@ -13160,7 +13066,8 @@ ha_innobase::delete_table( extension, in contrast to ::create */ normalize_table_name(norm_name, name); - if (srv_read_only_mode) { + if (srv_read_only_mode + || srv_force_recovery >= SRV_FORCE_NO_UNDO_LOG_SCAN) { DBUG_RETURN(HA_ERR_TABLE_READONLY); } else if (row_is_magic_monitor_table(norm_name) && check_global_access(thd, PROCESS_ACL)) { @@ -14502,15 +14409,7 @@ ha_innobase::analyze( { int ret; - if (share->ib_table != prebuilt->table) { - fprintf(stderr, - "InnoDB: Warning: share->ib_table %p prebuilt->table %p table %s is_corrupt %lu.", - share->ib_table, prebuilt->table, prebuilt->table->name, prebuilt->table->is_corrupt); - } - - if (UNIV_UNLIKELY(share->ib_table && share->ib_table->is_corrupt)) { - return(HA_ADMIN_CORRUPT); - } + DBUG_ASSERT(share->ib_table == prebuilt->table); /* Simply call this->info_low() with all the flags and request recalculation of the statistics */ @@ -14518,15 +14417,7 @@ ha_innobase::analyze( HA_STATUS_TIME | HA_STATUS_CONST | HA_STATUS_VARIABLE, true /* this is ANALYZE */); - if (share->ib_table != prebuilt->table) { - fprintf(stderr, - "InnoDB: Warning: share->ib_table %p prebuilt->table %p table %s is_corrupt %lu.", - share->ib_table, prebuilt->table, prebuilt->table->name, prebuilt->table->is_corrupt); - } - - if (UNIV_UNLIKELY(share->ib_table && share->ib_table->is_corrupt)) { - return(HA_ADMIN_CORRUPT); - } + DBUG_ASSERT(share->ib_table == prebuilt->table); if (ret != 0) { return(HA_ADMIN_FAILED); @@ -14630,7 +14521,8 @@ ha_innobase::check( DBUG_RETURN(HA_ADMIN_CORRUPT); - } else if (prebuilt->table->ibd_file_missing) { + } else if (!prebuilt->table->is_readable() && + fil_space_get(prebuilt->table->space) == NULL) { ib_senderrf( thd, IB_LOG_LEVEL_ERROR, @@ -14704,6 +14596,7 @@ ha_innobase::check( server_mutex, srv_fatal_semaphore_wait_threshold, SRV_SEMAPHORE_WAIT_EXTENSION); + dberr_t err = btr_validate_index(index, prebuilt->trx); /* Restore the fatal lock wait timeout after @@ -14802,6 +14695,7 @@ ha_innobase::check( if (!(index->type & DICT_CLUSTERED)) { check_result = false; }); + if (!check_result) { innobase_format_name( index_name, sizeof index_name, @@ -15142,7 +15036,8 @@ fill_foreign_key_list(THD* thd, { ut_ad(mutex_own(&dict_sys->mutex)); - for (dict_foreign_set::iterator it = table->referenced_set.begin(); + for (dict_foreign_set::const_iterator it + = table->referenced_set.begin(); it != table->referenced_set.end(); ++it) { dict_foreign_t* foreign = *it; @@ -15831,15 +15726,7 @@ ha_innobase::transactional_table_lock( update_thd(thd); - if (share->ib_table != prebuilt->table) { - fprintf(stderr, - "InnoDB: Warning: share->ib_table %p prebuilt->table %p table %s is_corrupt %lu.", - share->ib_table, prebuilt->table, prebuilt->table->name, prebuilt->table->is_corrupt); - } - - if (UNIV_UNLIKELY(share->ib_table && share->ib_table->is_corrupt)) { - DBUG_RETURN(HA_ERR_CRASHED); - } + DBUG_ASSERT(share->ib_table == prebuilt->table); if (!thd_tablespace_op(thd)) { @@ -15850,7 +15737,7 @@ ha_innobase::transactional_table_lock( ER_TABLESPACE_DISCARDED, table->s->table_name.str); - } else if (prebuilt->table->ibd_file_missing) { + } else if (!prebuilt->table->is_readable()) { ib_senderrf( thd, IB_LOG_LEVEL_ERROR, @@ -17232,6 +17119,10 @@ innobase_commit_by_xid( DBUG_ASSERT(hton == innodb_hton_ptr); + if (high_level_read_only) { + return(XAER_RMFAIL); + } + trx = trx_get_trx_by_xid(xid); if (trx) { @@ -17259,8 +17150,11 @@ innobase_rollback_by_xid( DBUG_ASSERT(hton == innodb_hton_ptr); - trx = trx_get_trx_by_xid(xid); + if (high_level_read_only) { + return(XAER_RMFAIL); + } + trx = trx_get_trx_by_xid(xid); if (trx) { int ret = innobase_rollback_trx(trx); trx_free_for_background(trx); @@ -17478,11 +17372,11 @@ innodb_log_archive_update( if (in_val) { /* turn archiving on */ - srv_log_archive_on = innobase_log_archive = 1; + innobase_log_archive = srv_log_archive_on = 1; log_archive_archivelog(); } else { /* turn archivng off */ - srv_log_archive_on = innobase_log_archive = 0; + innobase_log_archive = srv_log_archive_on = 0; log_archive_noarchivelog(); } } @@ -18705,15 +18599,17 @@ innodb_buffer_pool_evict_uncompressed(void) ut_ad(block->page.in_LRU_list); mutex_enter(&block->mutex); - if (!buf_LRU_free_page(&block->page, false)) { - mutex_exit(&block->mutex); - all_evicted = false; - } else { - mutex_exit(&block->mutex); - mutex_enter(&buf_pool->LRU_list_mutex); - } + all_evicted = buf_LRU_free_page(&block->page, false); + mutex_exit(&block->mutex); - block = prev_block; + if (all_evicted) { + + mutex_enter(&buf_pool->LRU_list_mutex); + block = UT_LIST_GET_LAST(buf_pool->unzip_LRU); + } else { + + block = prev_block; + } } mutex_exit(&buf_pool->LRU_list_mutex); @@ -18904,6 +18800,10 @@ innodb_sched_priority_cleaner_update( const void* save) /*!< in: immediate result from check function */ { + if (srv_read_only_mode) { + return; + } + ulint priority = *static_cast(save); ulint actual_priority; ulint nice = 0; @@ -18930,10 +18830,6 @@ innodb_sched_priority_cleaner_update( } /* Set the priority for the page cleaner thread */ - if (srv_read_only_mode) { - - return; - } ut_ad(buf_page_cleaner_is_active); nice = os_thread_get_priority(srv_cleaner_tid); @@ -19324,8 +19220,15 @@ checkpoint_now_set( log_make_checkpoint_at(LSN_MAX, TRUE); fil_flush_file_spaces(FIL_LOG); } - fil_write_flushed_lsn_to_data_files(log_sys->lsn, 0); - fil_flush_file_spaces(FIL_TABLESPACE); + + dberr_t err = fil_write_flushed_lsn(log_sys->lsn); + + if (err != DB_SUCCESS) { + ib_logf(IB_LOG_LEVEL_ERROR, + "Failed to write flush lsn to the " + "system tablespace at checkpoint err=%s", + ut_strerr(err)); + } } } @@ -19919,39 +19822,13 @@ wsrep_fake_trx_id( mutex_enter(&trx_sys->mutex); trx_id_t trx_id = trx_sys_get_new_trx_id(); mutex_exit(&trx_sys->mutex); - + WSREP_DEBUG("innodb fake trx id: %lu thd: %s", trx_id, wsrep_thd_query(thd)); wsrep_ws_handle_for_trx(wsrep_thd_ws_handle(thd), trx_id); } #endif /* WITH_WSREP */ -/*************************************************************//** -Empty free list algorithm. -Checks if buffer pool is big enough to enable backoff algorithm. -InnoDB empty free list algorithm backoff requires free pages -from LRU for the best performance. -buf_LRU_buf_pool_running_out cancels query if 1/4 of -buffer pool belongs to LRU or freelist. -At the same time buf_flush_LRU_list_batch -keeps up to BUF_LRU_MIN_LEN in LRU. -In order to avoid deadlock baclkoff requires buffer pool -to be at least 4*BUF_LRU_MIN_LEN, -but flush peformance is bad because of trashing -and additional BUF_LRU_MIN_LEN pages are requested. -@return true if it's possible to enable backoff. */ -static -bool -innodb_empty_free_list_algorithm_backoff_allowed( - srv_empty_free_list_t algorithm, /*!< in: desired algorithm - from srv_empty_free_list_t */ - long long buf_pool_pages) /*!< in: total number - of pages inside buffer pool */ -{ - return(buf_pool_pages >= BUF_LRU_MIN_LEN * (4 + 1) - || algorithm != SRV_EMPTY_FREE_LIST_BACKOFF); -} - /*************************************************************//** Empty free list algorithm. This function is registered as a callback with MySQL. @@ -19993,13 +19870,11 @@ innodb_srv_empty_free_list_algorithm_validate( return(1); algorithm = static_cast(algo); - if (!innodb_empty_free_list_algorithm_backoff_allowed( - algorithm, - innobase_buffer_pool_size / srv_page_size)) { + if (!innodb_empty_free_list_algorithm_allowed(algorithm)) { sql_print_warning( "InnoDB: innodb_empty_free_list_algorithm " "= 'backoff' requires at least" - " 20MB buffer pool.\n"); + " 20MB buffer pool instances.\n"); return(1); } @@ -22037,8 +21912,7 @@ ib_logf( str = static_cast(malloc(BUFSIZ)); my_vsnprintf(str, BUFSIZ, format, args); #endif /* __WIN__ */ - - switch(level) { + switch (level) { case IB_LOG_LEVEL_INFO: sql_print_information("InnoDB: %s", str); break; diff --git a/storage/xtradb/handler/ha_innodb.h b/storage/xtradb/handler/ha_innodb.h index 62b80c492a1..426136e4d51 100644 --- a/storage/xtradb/handler/ha_innodb.h +++ b/storage/xtradb/handler/ha_innodb.h @@ -540,7 +540,7 @@ innobase_index_name_is_reserved( const KEY* key_info, /*!< in: Indexes to be created */ ulint num_of_keys) /*!< in: Number of indexes to be created. */ - MY_ATTRIBUTE((nonnull, warn_unused_result)); + MY_ATTRIBUTE((nonnull(1), warn_unused_result)); /*****************************************************************//** #ifdef WITH_WSREP diff --git a/storage/xtradb/handler/handler0alter.cc b/storage/xtradb/handler/handler0alter.cc index a521db3ce25..32ad4844c34 100644 --- a/storage/xtradb/handler/handler0alter.cc +++ b/storage/xtradb/handler/handler0alter.cc @@ -157,11 +157,22 @@ my_error_innodb( case DB_CORRUPTION: my_error(ER_NOT_KEYFILE, MYF(0), table); break; - case DB_TOO_BIG_RECORD: - my_error(ER_TOO_BIG_ROWSIZE, MYF(0), - page_get_free_space_of_empty( - flags & DICT_TF_COMPACT) / 2); + case DB_TOO_BIG_RECORD: { + /* Note that in page0zip.ic page_zip_rec_needs_ext() rec_size + is limited to COMPRESSED_REC_MAX_DATA_SIZE (16K) or + REDUNDANT_REC_MAX_DATA_SIZE (16K-1). */ + bool comp = !!(flags & DICT_TF_COMPACT); + ulint free_space = page_get_free_space_of_empty(comp) / 2; + + if (free_space >= (comp ? COMPRESSED_REC_MAX_DATA_SIZE : + REDUNDANT_REC_MAX_DATA_SIZE)) { + free_space = (comp ? COMPRESSED_REC_MAX_DATA_SIZE : + REDUNDANT_REC_MAX_DATA_SIZE) - 1; + } + + my_error(ER_TOO_BIG_ROWSIZE, MYF(0), free_space); break; + } case DB_INVALID_NULL: /* TODO: report the row, as we do for DB_DUPLICATE_KEY */ my_error(ER_INVALID_USE_OF_NULL, MYF(0)); @@ -2307,10 +2318,10 @@ online_retry_drop_indexes_with_trx( @param drop_fk constraints being dropped @param n_drop_fk number of constraints that are being dropped @return whether the constraint is being dropped */ -inline MY_ATTRIBUTE((pure, nonnull, warn_unused_result)) +MY_ATTRIBUTE((pure, nonnull(1), warn_unused_result)) +inline bool innobase_dropping_foreign( -/*======================*/ const dict_foreign_t* foreign, dict_foreign_t** drop_fk, ulint n_drop_fk) @@ -2334,10 +2345,10 @@ column that is being dropped or modified to NOT NULL. @retval true Not allowed (will call my_error()) @retval false Allowed */ -static MY_ATTRIBUTE((pure, nonnull, warn_unused_result)) +MY_ATTRIBUTE((pure, nonnull(1,4), warn_unused_result)) +static bool innobase_check_foreigns_low( -/*========================*/ const dict_table_t* user_table, dict_foreign_t** drop_fk, ulint n_drop_fk, @@ -2434,10 +2445,10 @@ column that is being dropped or modified to NOT NULL. @retval true Not allowed (will call my_error()) @retval false Allowed */ -static MY_ATTRIBUTE((pure, nonnull, warn_unused_result)) +MY_ATTRIBUTE((pure, nonnull(1,2,3,4), warn_unused_result)) +static bool innobase_check_foreigns( -/*====================*/ Alter_inplace_info* ha_alter_info, const TABLE* altered_table, const TABLE* old_table, @@ -3137,7 +3148,7 @@ prepare_inplace_alter_table_dict( clustered index of the old table, later. */ if (new_clustered || !ctx->online - || user_table->ibd_file_missing + || !user_table->is_readable() || dict_table_is_discarded(user_table)) { /* No need to allocate a modification log. */ ut_ad(!ctx->add_index[a]->online_log); @@ -3557,6 +3568,43 @@ ha_innobase::prepare_inplace_alter_table( goto func_exit; } + indexed_table = prebuilt->table; + + if (indexed_table->is_readable()) { + } else { + if (indexed_table->corrupted) { + /* Handled below */ + } else { + FilSpace space(indexed_table->space, true); + + if (space()) { + String str; + const char* engine= table_type(); + char buf[MAX_FULL_NAME_LEN]; + ut_format_name(indexed_table->name, TRUE, buf, sizeof(buf)); + + push_warning_printf(user_thd, Sql_condition::WARN_LEVEL_WARN, + HA_ERR_DECRYPTION_FAILED, + "Table %s in file %s is encrypted but encryption service or" + " used key_id is not available. " + " Can't continue reading table.", + buf, space()->chain.start->name); + + my_error(ER_GET_ERRMSG, MYF(0), HA_ERR_DECRYPTION_FAILED, str.c_ptr(), engine); + DBUG_RETURN(true); + } + } + } + + if (indexed_table->corrupted + || dict_table_get_first_index(indexed_table) == NULL + || dict_index_is_corrupted( + dict_table_get_first_index(indexed_table))) { + /* The clustered index is corrupted. */ + my_error(ER_CHECK_NO_SUCH_TABLE, MYF(0)); + DBUG_RETURN(true); + } + if (ha_alter_info->handler_flags & Alter_inplace_info::CHANGE_CREATE_OPTION) { /* Check engine specific table options */ @@ -4209,7 +4257,7 @@ ok_exit: DBUG_ASSERT(ctx->trx); DBUG_ASSERT(ctx->prebuilt == prebuilt); - if (prebuilt->table->ibd_file_missing + if (prebuilt->table->file_unreadable || dict_table_is_discarded(prebuilt->table)) { goto all_done; } @@ -5231,7 +5279,7 @@ commit_try_rebuild( /* The new table must inherit the flag from the "parent" table. */ if (dict_table_is_discarded(user_table)) { - rebuilt_table->ibd_file_missing = true; + rebuilt_table->file_unreadable = true; rebuilt_table->flags2 |= DICT_TF2_DISCARDED; } @@ -5763,9 +5811,9 @@ ha_innobase::commit_inplace_alter_table( if (ha_alter_info->group_commit_ctx) { ctx_array = ha_alter_info->group_commit_ctx; } else { - ctx_single[0] = ctx0; - ctx_single[1] = NULL; - ctx_array = ctx_single; + ctx_single[0] = ctx0; + ctx_single[1] = NULL; + ctx_array = ctx_single; } DBUG_ASSERT(ctx0 == ctx_array[0]); @@ -5794,6 +5842,19 @@ ha_innobase::commit_inplace_alter_table( = static_cast(*pctx); DBUG_ASSERT(ctx->prebuilt->trx == prebuilt->trx); + /* If decryption failed for old table or new table + fail here. */ + if ((ctx->old_table->file_unreadable && + fil_space_get(ctx->old_table->space) != NULL)|| + (ctx->new_table->file_unreadable && + fil_space_get(ctx->new_table->space) != NULL)) { + String str; + const char* engine= table_type(); + get_error_message(HA_ERR_DECRYPTION_FAILED, &str); + my_error(ER_GET_ERRMSG, MYF(0), HA_ERR_DECRYPTION_FAILED, str.c_ptr(), engine); + DBUG_RETURN(true); + } + /* Exclusively lock the table, to ensure that no other transaction is holding locks on the table while we change the table definition. The MySQL meta-data lock diff --git a/storage/xtradb/handler/i_s.cc b/storage/xtradb/handler/i_s.cc index 086d5642dbb..ca2c76c31ad 100644 --- a/storage/xtradb/handler/i_s.cc +++ b/storage/xtradb/handler/i_s.cc @@ -1,7 +1,7 @@ /***************************************************************************** -Copyright (c) 2007, 2016, Oracle and/or its affiliates. -Copyrigth (c) 2014, 2017, MariaDB Corporation +Copyright (c) 2007, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2014, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -2966,14 +2966,16 @@ i_s_fts_deleted_generic_fill( fields = table->field; + int ret = 0; + for (ulint j = 0; j < ib_vector_size(deleted->doc_ids); ++j) { doc_id_t doc_id; doc_id = *(doc_id_t*) ib_vector_get_const(deleted->doc_ids, j); - OK(fields[I_S_FTS_DOC_ID]->store((longlong) doc_id, true)); + BREAK_IF(ret = fields[I_S_FTS_DOC_ID]->store(doc_id, true)); - OK(schema_table_store_record(thd, table)); + BREAK_IF(ret = schema_table_store_record(thd, table)); } trx_free_for_background(trx); @@ -2984,7 +2986,7 @@ i_s_fts_deleted_generic_fill( rw_lock_s_unlock(&dict_operation_lock); - DBUG_RETURN(0); + DBUG_RETURN(ret); } /*******************************************************************//** @@ -3222,13 +3224,13 @@ i_s_fts_index_cache_fill_one_index( /*===============================*/ fts_index_cache_t* index_cache, /*!< in: FTS index cache */ THD* thd, /*!< in: thread */ + fts_string_t* conv_str, /*!< in/out: buffer */ TABLE_LIST* tables) /*!< in/out: tables to fill */ { TABLE* table = (TABLE*) tables->table; Field** fields; CHARSET_INFO* index_charset; const ib_rbt_node_t* rbt_node; - fts_string_t conv_str; uint dummy_errors; char* word_str; @@ -3237,10 +3239,9 @@ i_s_fts_index_cache_fill_one_index( fields = table->field; index_charset = index_cache->charset; - conv_str.f_len = system_charset_info->mbmaxlen - * FTS_MAX_WORD_LEN_IN_CHAR; - conv_str.f_str = static_cast(ut_malloc(conv_str.f_len)); - conv_str.f_n_char = 0; + conv_str->f_n_char = 0; + + int ret = 0; /* Go through each word in the index cache */ for (rbt_node = rbt_first(index_cache->words); @@ -3252,16 +3253,16 @@ i_s_fts_index_cache_fill_one_index( /* Convert word from index charset to system_charset_info */ if (index_charset->cset != system_charset_info->cset) { - conv_str.f_n_char = my_convert( - reinterpret_cast(conv_str.f_str), - static_cast(conv_str.f_len), + conv_str->f_n_char = my_convert( + reinterpret_cast(conv_str->f_str), + static_cast(conv_str->f_len), system_charset_info, reinterpret_cast(word->text.f_str), static_cast(word->text.f_len), index_charset, &dummy_errors); - ut_ad(conv_str.f_n_char <= conv_str.f_len); - conv_str.f_str[conv_str.f_n_char] = 0; - word_str = reinterpret_cast(conv_str.f_str); + ut_ad(conv_str->f_n_char <= conv_str->f_len); + conv_str->f_str[conv_str->f_n_char] = 0; + word_str = reinterpret_cast(conv_str->f_str); } else { word_str = reinterpret_cast(word->text.f_str); } @@ -3319,9 +3320,7 @@ i_s_fts_index_cache_fill_one_index( } } - ut_free(conv_str.f_str); - - DBUG_RETURN(0); + DBUG_RETURN(ret); } /*******************************************************************//** Fill the dynamic table INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHED @@ -3365,18 +3364,27 @@ i_s_fts_index_cache_fill( ut_a(cache); + int ret = 0; + fts_string_t conv_str; + conv_str.f_len = system_charset_info->mbmaxlen + * FTS_MAX_WORD_LEN_IN_CHAR; + conv_str.f_str = static_cast(ut_malloc(conv_str.f_len)); + for (ulint i = 0; i < ib_vector_size(cache->indexes); i++) { fts_index_cache_t* index_cache; index_cache = static_cast ( ib_vector_get(cache->indexes, i)); - i_s_fts_index_cache_fill_one_index(index_cache, thd, tables); + BREAK_IF(ret = i_s_fts_index_cache_fill_one_index( + index_cache, thd, &conv_str, tables)); } + ut_free(conv_str.f_str); + dict_table_close(user_table, FALSE, FALSE); - DBUG_RETURN(0); + DBUG_RETURN(ret); } /*******************************************************************//** @@ -3679,8 +3687,6 @@ i_s_fts_index_table_fill_one_fetch( } } - i_s_fts_index_table_free_one_fetch(words); - DBUG_RETURN(ret); } @@ -3694,13 +3700,13 @@ i_s_fts_index_table_fill_one_index( /*===============================*/ dict_index_t* index, /*!< in: FTS index */ THD* thd, /*!< in: thread */ + fts_string_t* conv_str, /*!< in/out: buffer */ TABLE_LIST* tables) /*!< in/out: tables to fill */ { ib_vector_t* words; mem_heap_t* heap; fts_string_t word; CHARSET_INFO* index_charset; - fts_string_t conv_str; dberr_t error; int ret = 0; @@ -3717,10 +3723,6 @@ i_s_fts_index_table_fill_one_index( word.f_n_char = 0; index_charset = fts_index_get_charset(index); - conv_str.f_len = system_charset_info->mbmaxlen - * FTS_MAX_WORD_LEN_IN_CHAR; - conv_str.f_str = static_cast(ut_malloc(conv_str.f_len)); - conv_str.f_n_char = 0; /* Iterate through each auxiliary table as described in fts_index_selector */ @@ -3754,17 +3756,17 @@ i_s_fts_index_table_fill_one_index( /* Fill into tables */ ret = i_s_fts_index_table_fill_one_fetch( - index_charset, thd, tables, words, &conv_str, has_more); + index_charset, thd, tables, words, conv_str, + has_more); + i_s_fts_index_table_free_one_fetch(words); if (ret != 0) { - i_s_fts_index_table_free_one_fetch(words); goto func_exit; } } while (has_more); } func_exit: - ut_free(conv_str.f_str); mem_heap_free(heap); DBUG_RETURN(ret); @@ -3806,10 +3808,17 @@ i_s_fts_index_table_fill( DBUG_RETURN(0); } + int ret = 0; + fts_string_t conv_str; + conv_str.f_len = system_charset_info->mbmaxlen + * FTS_MAX_WORD_LEN_IN_CHAR; + conv_str.f_str = static_cast(ut_malloc(conv_str.f_len)); + for (index = dict_table_get_first_index(user_table); index; index = dict_table_get_next_index(index)) { if (index->type & DICT_FTS) { - i_s_fts_index_table_fill_one_index(index, thd, tables); + BREAK_IF(ret = i_s_fts_index_table_fill_one_index( + index, thd, &conv_str, tables)); } } @@ -3817,7 +3826,9 @@ i_s_fts_index_table_fill( rw_lock_s_unlock(&dict_operation_lock); - DBUG_RETURN(0); + ut_free(conv_str.f_str); + + DBUG_RETURN(ret); } /*******************************************************************//** @@ -3982,6 +3993,8 @@ i_s_fts_config_fill( DBUG_ASSERT(!dict_index_is_online_ddl(index)); } + int ret = 0; + while (fts_config_key[i]) { fts_string_t value; char* key_name; @@ -4006,13 +4019,14 @@ i_s_fts_config_fill( ut_free(key_name); } - OK(field_store_string( - fields[FTS_CONFIG_KEY], fts_config_key[i])); + BREAK_IF(ret = field_store_string( + fields[FTS_CONFIG_KEY], fts_config_key[i])); - OK(field_store_string( - fields[FTS_CONFIG_VALUE], (const char*) value.f_str)); + BREAK_IF(ret = field_store_string( + fields[FTS_CONFIG_VALUE], + reinterpret_cast(value.f_str))); - OK(schema_table_store_record(thd, table)); + BREAK_IF(ret = schema_table_store_record(thd, table)); i++; } @@ -4025,7 +4039,7 @@ i_s_fts_config_fill( rw_lock_s_unlock(&dict_operation_lock); - DBUG_RETURN(0); + DBUG_RETURN(ret); } /*******************************************************************//** @@ -4864,34 +4878,29 @@ i_s_innodb_buffer_page_fill( state_str = NULL; OK(fields[IDX_BUFFER_POOL_ID]->store( - static_cast(page_info->pool_id))); + page_info->pool_id, true)); OK(fields[IDX_BUFFER_BLOCK_ID]->store( - static_cast(page_info->block_id))); + page_info->block_id, true)); OK(fields[IDX_BUFFER_PAGE_SPACE]->store( - static_cast(page_info->space_id))); + page_info->space_id, true)); OK(fields[IDX_BUFFER_PAGE_NUM]->store( - static_cast(page_info->page_num))); + page_info->page_num, true)); OK(field_store_string( fields[IDX_BUFFER_PAGE_TYPE], i_s_page_type[page_info->page_type].type_str)); OK(fields[IDX_BUFFER_PAGE_FLUSH_TYPE]->store( - page_info->flush_type)); + page_info->flush_type, true)); OK(fields[IDX_BUFFER_PAGE_FIX_COUNT]->store( - page_info->fix_count)); + page_info->fix_count, true)); - if (page_info->hashed) { - OK(field_store_string( - fields[IDX_BUFFER_PAGE_HASHED], "YES")); - } else { - OK(field_store_string( - fields[IDX_BUFFER_PAGE_HASHED], "NO")); - } + OK(field_store_string(fields[IDX_BUFFER_PAGE_HASHED], + page_info->hashed ? "YES" : "NO")); OK(fields[IDX_BUFFER_PAGE_NEWEST_MOD]->store( (longlong) page_info->newest_mod, true)); @@ -4900,7 +4909,7 @@ i_s_innodb_buffer_page_fill( (longlong) page_info->oldest_mod, true)); OK(fields[IDX_BUFFER_PAGE_ACCESS_TIME]->store( - page_info->access_time)); + page_info->access_time, true)); fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_null(); @@ -4909,44 +4918,48 @@ i_s_innodb_buffer_page_fill( /* If this is an index page, fetch the index name and table name */ if (page_info->page_type == I_S_PAGE_TYPE_INDEX) { - const dict_index_t* index; + bool ret = false; mutex_enter(&dict_sys->mutex); - index = dict_index_get_if_in_cache_low( - page_info->index_id); - - if (index) { + if (const dict_index_t* index = + dict_index_get_if_in_cache_low( + page_info->index_id)) { table_name_end = innobase_convert_name( table_name, sizeof(table_name), index->table_name, strlen(index->table_name), thd, TRUE); - OK(fields[IDX_BUFFER_PAGE_TABLE_NAME]->store( - table_name, - static_cast(table_name_end - table_name), - system_charset_info)); - fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_notnull(); - - OK(field_store_index_name( - fields[IDX_BUFFER_PAGE_INDEX_NAME], - index->name)); + ret = fields[IDX_BUFFER_PAGE_TABLE_NAME] + ->store(table_name, + static_cast( + table_name_end + - table_name), + system_charset_info) + || field_store_index_name( + fields + [IDX_BUFFER_PAGE_INDEX_NAME], + index->name); } mutex_exit(&dict_sys->mutex); + + OK(ret); + + fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_notnull(); } OK(fields[IDX_BUFFER_PAGE_NUM_RECS]->store( - page_info->num_recs)); + page_info->num_recs, true)); OK(fields[IDX_BUFFER_PAGE_DATA_SIZE]->store( - page_info->data_size)); + page_info->data_size, true)); OK(fields[IDX_BUFFER_PAGE_ZIP_SIZE]->store( - page_info->zip_ssize - ? (UNIV_ZIP_SIZE_MIN >> 1) << page_info->zip_ssize - : 0)); + page_info->zip_ssize + ? (UNIV_ZIP_SIZE_MIN >> 1) << page_info->zip_ssize + : 0, true)); #if BUF_PAGE_STATE_BITS > 3 # error "BUF_PAGE_STATE_BITS > 3, please ensure that all 1<io_fix) { case BUF_IO_NONE: - OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX], - "IO_NONE")); + state_str = "IO_NONE"; break; case BUF_IO_READ: - OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX], - "IO_READ")); + state_str = "IO_READ"; break; case BUF_IO_WRITE: - OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX], - "IO_WRITE")); + state_str = "IO_WRITE"; break; case BUF_IO_PIN: - OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX], - "IO_PIN")); + state_str = "IO_PIN"; break; } + OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX], + state_str)); + OK(field_store_string(fields[IDX_BUFFER_PAGE_IS_OLD], (page_info->is_old) ? "YES" : "NO")); OK(fields[IDX_BUFFER_PAGE_FREE_CLOCK]->store( page_info->freed_page_clock)); - if (schema_table_store_record(thd, table)) { - DBUG_RETURN(1); - } + OK(schema_table_store_record(thd, table)); } DBUG_RETURN(0); @@ -5550,17 +5560,10 @@ i_s_innodb_buf_page_lru_fill( ulint num_page) /*!< in: number of page info cached */ { - TABLE* table; - Field** fields; - mem_heap_t* heap; - DBUG_ENTER("i_s_innodb_buf_page_lru_fill"); - table = tables->table; - - fields = table->field; - - heap = mem_heap_create(1000); + TABLE* table = tables->table; + Field** fields = table->field; /* Iterate through the cached array and fill the I_S table rows */ for (ulint i = 0; i < num_page; i++) { @@ -5575,43 +5578,37 @@ i_s_innodb_buf_page_lru_fill( page_info = info_array + i; OK(fields[IDX_BUF_LRU_POOL_ID]->store( - static_cast(page_info->pool_id))); - + page_info->pool_id, true)); OK(fields[IDX_BUF_LRU_POS]->store( - static_cast(page_info->block_id))); + page_info->block_id, true)); OK(fields[IDX_BUF_LRU_PAGE_SPACE]->store( - static_cast(page_info->space_id))); + page_info->space_id, true)); OK(fields[IDX_BUF_LRU_PAGE_NUM]->store( - static_cast(page_info->page_num))); + page_info->page_num, true)); OK(field_store_string( - fields[IDX_BUF_LRU_PAGE_TYPE], - i_s_page_type[page_info->page_type].type_str)); + fields[IDX_BUF_LRU_PAGE_TYPE], + i_s_page_type[page_info->page_type].type_str)); OK(fields[IDX_BUF_LRU_PAGE_FLUSH_TYPE]->store( - static_cast(page_info->flush_type))); + page_info->flush_type, true)); OK(fields[IDX_BUF_LRU_PAGE_FIX_COUNT]->store( - static_cast(page_info->fix_count))); + page_info->fix_count, true)); - if (page_info->hashed) { - OK(field_store_string( - fields[IDX_BUF_LRU_PAGE_HASHED], "YES")); - } else { - OK(field_store_string( - fields[IDX_BUF_LRU_PAGE_HASHED], "NO")); - } + OK(field_store_string(fields[IDX_BUF_LRU_PAGE_HASHED], + page_info->hashed ? "YES" : "NO")); OK(fields[IDX_BUF_LRU_PAGE_NEWEST_MOD]->store( - page_info->newest_mod, true)); + page_info->newest_mod, true)); OK(fields[IDX_BUF_LRU_PAGE_OLDEST_MOD]->store( - page_info->oldest_mod, true)); + page_info->oldest_mod, true)); OK(fields[IDX_BUF_LRU_PAGE_ACCESS_TIME]->store( - page_info->access_time)); + page_info->access_time, true)); fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_null(); @@ -5620,43 +5617,47 @@ i_s_innodb_buf_page_lru_fill( /* If this is an index page, fetch the index name and table name */ if (page_info->page_type == I_S_PAGE_TYPE_INDEX) { - const dict_index_t* index; + bool ret = false; mutex_enter(&dict_sys->mutex); - index = dict_index_get_if_in_cache_low( - page_info->index_id); - - if (index) { + if (const dict_index_t* index = + dict_index_get_if_in_cache_low( + page_info->index_id)) { table_name_end = innobase_convert_name( table_name, sizeof(table_name), index->table_name, strlen(index->table_name), thd, TRUE); - OK(fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->store( - table_name, - static_cast(table_name_end - table_name), - system_charset_info)); - fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_notnull(); - - OK(field_store_index_name( - fields[IDX_BUF_LRU_PAGE_INDEX_NAME], - index->name)); + ret = fields[IDX_BUF_LRU_PAGE_TABLE_NAME] + ->store(table_name, + static_cast( + table_name_end + - table_name), + system_charset_info) + || field_store_index_name( + fields + [IDX_BUF_LRU_PAGE_INDEX_NAME], + index->name); } mutex_exit(&dict_sys->mutex); + + OK(ret); + + fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_notnull(); } OK(fields[IDX_BUF_LRU_PAGE_NUM_RECS]->store( - page_info->num_recs)); + page_info->num_recs, true)); OK(fields[IDX_BUF_LRU_PAGE_DATA_SIZE]->store( - page_info->data_size)); + page_info->data_size, true)); OK(fields[IDX_BUF_LRU_PAGE_ZIP_SIZE]->store( - page_info->zip_ssize ? - 512 << page_info->zip_ssize : 0)); + page_info->zip_ssize + ? 512 << page_info->zip_ssize : 0, true)); state = static_cast(page_info->page_state); @@ -5685,35 +5686,31 @@ i_s_innodb_buf_page_lru_fill( switch (page_info->io_fix) { case BUF_IO_NONE: - OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX], - "IO_NONE")); + state_str = "IO_NONE"; break; case BUF_IO_READ: - OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX], - "IO_READ")); + state_str = "IO_READ"; break; case BUF_IO_WRITE: - OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX], - "IO_WRITE")); + state_str = "IO_WRITE"; + break; + case BUF_IO_PIN: + state_str = "IO_PIN"; break; } + OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX], + state_str)); + OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IS_OLD], - (page_info->is_old) ? "YES" : "NO")); + page_info->is_old ? "YES" : "NO")); OK(fields[IDX_BUF_LRU_PAGE_FREE_CLOCK]->store( - page_info->freed_page_clock)); + page_info->freed_page_clock, true)); - if (schema_table_store_record(thd, table)) { - mem_heap_free(heap); - DBUG_RETURN(1); - } - - mem_heap_empty(heap); + OK(schema_table_store_record(thd, table)); } - mem_heap_free(heap); - DBUG_RETURN(0); } @@ -8527,6 +8524,12 @@ i_s_dict_fill_tablespaces_encryption( fil_space_crypt_get_status(space, &status); + /* If tablespace id does not match, we did not find + encryption information for this tablespace. */ + if (!space->crypt_data || space->id != status.space) { + goto skip; + } + OK(fields[TABLESPACES_ENCRYPTION_SPACE]->store(space->id)); OK(field_store_string(fields[TABLESPACES_ENCRYPTION_NAME], @@ -8561,6 +8564,7 @@ i_s_dict_fill_tablespaces_encryption( OK(schema_table_store_record(thd, table_to_fill)); +skip: DBUG_RETURN(0); } /*******************************************************************//** diff --git a/storage/xtradb/handler/i_s.h b/storage/xtradb/handler/i_s.h index 55ef6e7ea42..4bb3ea33462 100644 --- a/storage/xtradb/handler/i_s.h +++ b/storage/xtradb/handler/i_s.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2007, 2013, Oracle and/or its affiliates. All Rights Reserved. -Copyrigth (c) 2014, 2015, MariaDB Corporation +Copyrigth (c) 2014, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -77,6 +77,8 @@ extern struct st_mysql_plugin i_s_innodb_changed_page_bitmaps; DBUG_RETURN(1); \ } +#define BREAK_IF(expr) if ((expr)) break + #define RETURN_IF_INNODB_NOT_STARTED(plugin_name) \ do { \ if (!srv_was_started) { \ diff --git a/storage/xtradb/handler/xtradb_i_s.cc b/storage/xtradb/handler/xtradb_i_s.cc index eaf7da733bf..b3c79975fb3 100644 --- a/storage/xtradb/handler/xtradb_i_s.cc +++ b/storage/xtradb/handler/xtradb_i_s.cc @@ -314,19 +314,20 @@ static int xtradb_internal_hash_tables_fill_table(THD* thd, TABLE_LIST* tables, if (dict_sys) { + ulint dict_size = dict_sys_get_size(); OK(field_store_string(fields[INT_HASH_TABLES_NAME], "Dictionary Cache")); OK(field_store_ulint(fields[INT_HASH_TABLES_TOTAL], ((dict_sys->table_hash->n_cells + dict_sys->table_id_hash->n_cells ) * sizeof(hash_cell_t) - + dict_sys->size))); + + dict_size))); OK(field_store_ulint(fields[INT_HASH_TABLES_CONSTANT], ((dict_sys->table_hash->n_cells + dict_sys->table_id_hash->n_cells ) * sizeof(hash_cell_t)))); OK(field_store_ulint(fields[INT_HASH_TABLES_VARIABLE], - dict_sys->size)); + dict_size)); OK(schema_table_store_record(thd, table)); } diff --git a/storage/xtradb/ibuf/ibuf0ibuf.cc b/storage/xtradb/ibuf/ibuf0ibuf.cc index e66568565e1..e872198d927 100644 --- a/storage/xtradb/ibuf/ibuf0ibuf.cc +++ b/storage/xtradb/ibuf/ibuf0ibuf.cc @@ -2216,6 +2216,8 @@ ibuf_remove_free_page(void) page_t* root; page_t* bitmap_page; + log_free_check(); + mtr_start(&mtr); /* Acquire the fsp latch before the ibuf header, obeying the latching @@ -2327,22 +2329,7 @@ ibuf_free_excess_pages(void) { ulint i; -#ifdef UNIV_SYNC_DEBUG - ut_ad(rw_lock_own(fil_space_get_latch(IBUF_SPACE_ID, NULL), - RW_LOCK_EX)); -#endif /* UNIV_SYNC_DEBUG */ - - ut_ad(rw_lock_get_x_lock_count( - fil_space_get_latch(IBUF_SPACE_ID, NULL)) == 1); - - /* NOTE: We require that the thread did not own the latch before, - because then we know that we can obey the correct latching order - for ibuf latches */ - - if (!ibuf) { - /* Not yet initialized; not sure if this is possible, but - does no harm to check for it. */ - + if (srv_force_recovery >= SRV_FORCE_NO_IBUF_MERGE) { return; } @@ -2963,8 +2950,7 @@ ibuf_get_volume_buffered_hash( fold = ut_fold_binary(data, len); hash += (fold / (CHAR_BIT * sizeof *hash)) % size; - bitmask = static_cast( - 1 << (fold % (CHAR_BIT * sizeof(*hash)))); + bitmask = static_cast(1) << (fold % (CHAR_BIT * sizeof(*hash))); if (*hash & bitmask) { @@ -3733,7 +3719,7 @@ fail_exit: if (mode == BTR_MODIFY_PREV) { err = btr_cur_optimistic_insert( - BTR_NO_LOCKING_FLAG, + BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG, cursor, &offsets, &offsets_heap, ibuf_entry, &ins_rec, &dummy_big_rec, 0, thr, &mtr); @@ -4118,7 +4104,7 @@ ibuf_insert_to_index_page( "InnoDB: but the number of fields does not match!\n", stderr); dump: - buf_page_print(page, 0, BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(page, 0); dtuple_print(stderr, entry); ut_ad(0); @@ -4737,15 +4723,13 @@ ibuf_merge_or_delete_for_page( fputs("InnoDB: cannot retrieve bitmap page\n", stderr); } else { - buf_page_print(bitmap_page, 0, - BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(bitmap_page, 0); } ibuf_mtr_commit(&mtr); fputs("\nInnoDB: Dump of the page:\n", stderr); - buf_page_print(block->frame, 0, - BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(block->frame, 0); fprintf(stderr, "InnoDB: Error: corruption in the tablespace." diff --git a/storage/xtradb/include/btr0btr.ic b/storage/xtradb/include/btr0btr.ic index 62a24873482..9f13c9303ca 100644 --- a/storage/xtradb/include/btr0btr.ic +++ b/storage/xtradb/include/btr0btr.ic @@ -61,7 +61,7 @@ btr_block_get_func( if (err == DB_DECRYPTION_FAILED) { if (index && index->table) { - index->table->is_encrypted = true; + index->table->file_unreadable = true; } } @@ -306,7 +306,7 @@ btr_node_ptr_get_child_page_no( "InnoDB: a nonsensical page number 0" " in a node ptr record at offset %lu\n", (ulong) page_offset(rec)); - buf_page_print(page_align(rec), 0, 0); + buf_page_print(page_align(rec), 0); ut_ad(0); } diff --git a/storage/xtradb/include/btr0cur.h b/storage/xtradb/include/btr0cur.h index 960bd55d3d9..e478b33bf8e 100644 --- a/storage/xtradb/include/btr0cur.h +++ b/storage/xtradb/include/btr0cur.h @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -220,15 +221,17 @@ btr_cur_optimistic_insert( btr_cur_t* cursor, /*!< in: cursor on page after which to insert; cursor stays valid */ ulint** offsets,/*!< out: offsets on *rec */ - mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */ + mem_heap_t** heap, /*!< in/out: pointer to memory heap */ dtuple_t* entry, /*!< in/out: entry to insert */ rec_t** rec, /*!< out: pointer to inserted record if succeed */ big_rec_t** big_rec,/*!< out: big rec vector whose fields have to - be stored externally by the caller, or - NULL */ + be stored externally by the caller */ ulint n_ext, /*!< in: number of externally stored columns */ - que_thr_t* thr, /*!< in: query thread or NULL */ + que_thr_t* thr, /*!< in/out: query thread; can be NULL if + !(~flags + & (BTR_NO_LOCKING_FLAG + | BTR_NO_UNDO_LOG_FLAG)) */ mtr_t* mtr) /*!< in/out: mini-transaction; if this function returns DB_SUCCESS on a leaf page of a secondary index in a @@ -256,15 +259,17 @@ btr_cur_pessimistic_insert( cursor stays valid */ ulint** offsets,/*!< out: offsets on *rec */ mem_heap_t** heap, /*!< in/out: pointer to memory heap - that can be emptied, or NULL */ + that can be emptied */ dtuple_t* entry, /*!< in/out: entry to insert */ rec_t** rec, /*!< out: pointer to inserted record if succeed */ big_rec_t** big_rec,/*!< out: big rec vector whose fields have to - be stored externally by the caller, or - NULL */ + be stored externally by the caller */ ulint n_ext, /*!< in: number of externally stored columns */ - que_thr_t* thr, /*!< in: query thread or NULL */ + que_thr_t* thr, /*!< in/out: query thread; can be NULL if + !(~flags + & (BTR_NO_LOCKING_FLAG + | BTR_NO_UNDO_LOG_FLAG)) */ mtr_t* mtr) /*!< in/out: mini-transaction */ MY_ATTRIBUTE((nonnull(2,3,4,5,6,7,10), warn_unused_result)); /*************************************************************//** @@ -392,12 +397,12 @@ btr_cur_pessimistic_update( ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */ mem_heap_t** offsets_heap, /*!< in/out: pointer to memory heap - that can be emptied, or NULL */ + that can be emptied */ mem_heap_t* entry_heap, /*!< in/out: memory heap for allocating big_rec and the index tuple */ big_rec_t** big_rec,/*!< out: big rec vector whose fields have to - be stored externally by the caller, or NULL */ + be stored externally by the caller */ const upd_t* update, /*!< in: update vector; this is allowed also contain trx id and roll ptr fields, but the values in update vector have no effect */ diff --git a/storage/xtradb/include/btr0defragment.h b/storage/xtradb/include/btr0defragment.h index 5c54b898e37..477824c1a35 100644 --- a/storage/xtradb/include/btr0defragment.h +++ b/storage/xtradb/include/btr0defragment.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (C) 2013, 2014 Facebook, Inc. All Rights Reserved. -Copyright (C) 2014, 2015, MariaDB Corporation. +Copyright (C) 2014, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -89,15 +89,14 @@ UNIV_INTERN void btr_defragment_save_defrag_stats_if_needed( dict_index_t* index); /*!< in: index */ -/******************************************************************//** -Thread that merges consecutive b-tree pages into fewer pages to defragment -the index. */ + +/** Merge consecutive b-tree pages into fewer pages to defragment indexes */ extern "C" UNIV_INTERN os_thread_ret_t -DECLARE_THREAD(btr_defragment_thread)( -/*==========================================*/ - void* arg); /*!< in: a dummy parameter required by - os_thread_create */ +DECLARE_THREAD(btr_defragment_thread)(void*); + +/** Whether btr_defragment_thread is active */ +extern bool btr_defragment_thread_active; #endif /* !UNIV_HOTBACKUP */ #endif diff --git a/storage/xtradb/include/btr0scrub.h b/storage/xtradb/include/btr0scrub.h index 608266c206d..8029cc91005 100644 --- a/storage/xtradb/include/btr0scrub.h +++ b/storage/xtradb/include/btr0scrub.h @@ -154,13 +154,10 @@ btr_scrub_start_space( ulint space, /*!< in: space */ btr_scrub_t* scrub_data); /*!< in/out: scrub data */ -/**************************************************************** -Complete iterating a space -* @return true if space was scrubbed */ +/** Complete iterating a space. +@param[in,out] scrub_data scrub data */ UNIV_INTERN -bool -btr_scrub_complete_space( -/*=====================*/ - btr_scrub_t* scrub_data); /*!< in/out: scrub data */ +void +btr_scrub_complete_space(btr_scrub_t* scrub_data); #endif diff --git a/storage/xtradb/include/buf0buf.h b/storage/xtradb/include/buf0buf.h index 4a632e2345f..88ee042e8c3 100644 --- a/storage/xtradb/include/buf0buf.h +++ b/storage/xtradb/include/buf0buf.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2017, MariaDB Corporation. All Rights Reserved. +Copyright (c) 2013, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -675,13 +675,13 @@ buf_page_is_checksum_valid_none( ulint checksum_field2) MY_ATTRIBUTE((warn_unused_result)); -/********************************************************************//** -Checks if a page is corrupt. +/** Check if a page is corrupt. @param[in] check_lsn true if LSN should be checked @param[in] read_buf Page to be checked @param[in] zip_size compressed size or 0 @param[in] space Pointer to tablespace @return true if corrupted, false if not */ +UNIV_INTERN bool buf_page_is_corrupted( bool check_lsn, @@ -689,26 +689,13 @@ buf_page_is_corrupted( ulint zip_size, const fil_space_t* space) MY_ATTRIBUTE((warn_unused_result)); -/********************************************************************//** -Check if page is maybe compressed, encrypted or both when we encounter -corrupted page. Note that we can't be 100% sure if page is corrupted -or decrypt/decompress just failed. -@param[in] bpage Page -@return true if page corrupted, false if not */ +/** Check if a page is all zeroes. +@param[in] read_buf database page +@param[in] zip_size ROW_FORMAT=COMPRESSED page size, or 0 +@return whether the page is all zeroes */ +UNIV_INTERN bool -buf_page_check_corrupt( - buf_page_t* bpage) /*!< in/out: buffer page read from disk */ - MY_ATTRIBUTE(( warn_unused_result)); - -/********************************************************************//** -Checks if a page is all zeroes. -@return TRUE if the page is all zeroes */ -bool -buf_page_is_zeroes( -/*===============*/ - const byte* read_buf, /*!< in: a database page */ - const ulint zip_size); /*!< in: size of compressed page; - 0 for uncompressed pages */ +buf_page_is_zeroes(const byte* read_buf, ulint zip_size); #ifndef UNIV_HOTBACKUP /**********************************************************************//** Gets the space id, page offset, and byte offset within page of a @@ -771,26 +758,15 @@ buf_print(void); /*============*/ #endif /* UNIV_DEBUG_PRINT || UNIV_DEBUG || UNIV_BUF_DEBUG */ #endif /* !UNIV_HOTBACKUP */ -enum buf_page_print_flags { - /** Do not crash at the end of buf_page_print(). */ - BUF_PAGE_PRINT_NO_CRASH = 1, - /** Do not print the full page dump. */ - BUF_PAGE_PRINT_NO_FULL = 2 -}; -/********************************************************************//** -Prints a page to stderr. */ +/** Dump a page to stderr. +@param[in] read_buf database page +@param[in] zip_size compressed page size, or 0 for uncompressed */ UNIV_INTERN void -buf_page_print( -/*===========*/ - const byte* read_buf, /*!< in: a database page */ - ulint zip_size, /*!< in: compressed page size, or - 0 for uncompressed pages */ - ulint flags) /*!< in: 0 or - BUF_PAGE_PRINT_NO_CRASH or - BUF_PAGE_PRINT_NO_FULL */ +buf_page_print(const byte* read_buf, ulint zip_size) UNIV_COLD; + /********************************************************************//** Decompress a block. @return TRUE if successful */ @@ -1270,15 +1246,18 @@ buf_page_init_for_read( version of the tablespace in case we have done DISCARD + IMPORT */ ulint offset);/*!< in: page number */ -/********************************************************************//** -Completes an asynchronous read or write request of a file page to or from -the buffer pool. -@return true if successful */ +/** Complete a read or write request of a file page to or from the buffer pool. +@param[in,out] bpage Page to complete +@return whether the operation succeeded +@retval DB_SUCCESS always when writing, or if a read page was OK +@retval DB_PAGE_CORRUPTED if the checksum fails on a page read +@retval DB_DECRYPTION_FAILED if page post encryption checksum matches but + after decryption normal page checksum does + not match */ UNIV_INTERN -bool -buf_page_io_complete( -/*=================*/ - buf_page_t* bpage); /*!< in: pointer to the block in question */ +dberr_t +buf_page_io_complete(buf_page_t* bpage) + MY_ATTRIBUTE((nonnull)); /********************************************************************//** Calculates a folded value of a file page address to use in the page hash table. @@ -1587,20 +1566,13 @@ directory (buf) to see it. Do not use from outside! */ typedef struct { bool reserved; /*!< true if this slot is reserved */ -#ifdef HAVE_LZO - byte* lzo_mem; /*!< Temporal memory used by LZO */ -#endif byte* crypt_buf; /*!< for encryption the data needs to be copied to a separate buffer before it's encrypted&written. this as a page can be read while it's being flushed */ - byte* crypt_buf_free; /*!< for encryption, allocated buffer - that is then alligned */ byte* comp_buf; /*!< for compression we need temporal buffer because page can be read while it's being flushed */ - byte* comp_buf_free; /*!< for compression, allocated - buffer that is then alligned */ byte* out_buf; /*!< resulting buffer after encryption/compression. This is a pointer and not allocated. */ @@ -1680,7 +1652,6 @@ struct buf_page_t{ if written again we check is TRIM operation needed. */ - unsigned key_version; /*!< key version for this block */ bool encrypted; /*!< page is still encrypted */ ulint real_size; /*!< Real size of the page diff --git a/storage/xtradb/include/buf0dblwr.h b/storage/xtradb/include/buf0dblwr.h index 5582778825c..7b7464761cc 100644 --- a/storage/xtradb/include/buf0dblwr.h +++ b/storage/xtradb/include/buf0dblwr.h @@ -1,7 +1,7 @@ /***************************************************************************** -Copyright (c) 1995, 2014, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. All Rights Reserved. +Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -39,13 +39,15 @@ extern buf_dblwr_t* buf_dblwr; /** Set to TRUE when the doublewrite buffer is being created */ extern ibool buf_dblwr_being_created; -/****************************************************************//** -Creates the doublewrite buffer to a new InnoDB installation. The header of the -doublewrite buffer is placed on the trx system header page. */ +/** Create the doublewrite buffer if the doublewrite buffer header +is not present in the TRX_SYS page. +@return whether the operation succeeded +@retval true if the doublewrite buffer exists or was created +@retval false if the creation failed (too small first data file) */ UNIV_INTERN -void -buf_dblwr_create(void); -/*==================*/ +bool +buf_dblwr_create() + MY_ATTRIBUTE((warn_unused_result)); /****************************************************************//** At a database startup initializes the doublewrite buffer memory structure if @@ -56,7 +58,7 @@ recovery, this function loads the pages from double write buffer into memory. */ void buf_dblwr_init_or_load_pages( /*=========================*/ - os_file_t file, + pfs_os_file_t file, char* path, bool load_corrupt_pages); diff --git a/storage/xtradb/include/buf0flu.h b/storage/xtradb/include/buf0flu.h index af50a5498ef..6089baf81e8 100644 --- a/storage/xtradb/include/buf0flu.h +++ b/storage/xtradb/include/buf0flu.h @@ -34,7 +34,7 @@ Created 11/5/1995 Heikki Tuuri #include "buf0types.h" /** Flag indicating if the page_cleaner is in active state. */ -extern ibool buf_page_cleaner_is_active; +extern bool buf_page_cleaner_is_active; /** Flag indicating if the lru_manager is in active state. */ extern bool buf_lru_manager_is_active; diff --git a/storage/xtradb/include/buf0rea.h b/storage/xtradb/include/buf0rea.h index f0652b5d2cd..ab73108a71e 100644 --- a/storage/xtradb/include/buf0rea.h +++ b/storage/xtradb/include/buf0rea.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2013, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2015, MariaDB Corporation. +Copyright (c) 2015, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -35,29 +35,37 @@ High-level function which reads a page asynchronously from a file to the buffer buf_pool if it is not already there. Sets the io_fix flag and sets an exclusive lock on the buffer frame. The flag is cleared and the x-lock released by the i/o-handler thread. -@return TRUE if page has been read in, FALSE in case of failure */ + +@param[in] space space_id +@param[in] zip_size compressed page size in bytes, or 0 +@param[in] offset page number +@param[in] trx transaction +@return DB_SUCCESS if page has been read and is not corrupted, +@retval DB_PAGE_CORRUPTED if page based on checksum check is corrupted, +@retval DB_DECRYPTION_FAILED if page post encryption checksum matches but +after decryption normal page checksum does not match. +@retval DB_TABLESPACE_DELETED if tablespace .ibd file is missing */ UNIV_INTERN -ibool +dberr_t buf_read_page( -/*==========*/ - ulint space, /*!< in: space id */ - ulint zip_size, /*!< in: compressed page size in bytes, or 0 */ - ulint offset, /*!< in: page number */ - trx_t* trx, /*!< in: trx */ - buf_page_t** bpage /*!< out: page */ -); + ulint space, + ulint zip_size, + ulint offset, + trx_t* trx); + /********************************************************************//** High-level function which reads a page asynchronously from a file to the buffer buf_pool if it is not already there. Sets the io_fix flag and sets an exclusive lock on the buffer frame. The flag is cleared and the x-lock released by the i/o-handler thread. -@return TRUE if page has been read in, FALSE in case of failure */ +@param[in] space Tablespace id +@param[in] offset Page number */ UNIV_INTERN -ibool +void buf_read_page_async( -/*================*/ - ulint space, /*!< in: space id */ - ulint offset);/*!< in: page number */ + ulint space, + ulint offset); + /********************************************************************//** Applies a random read-ahead in buf_pool if there are at least a threshold value of accessed pages from the random read-ahead area. Does not read any diff --git a/storage/xtradb/include/data0type.ic b/storage/xtradb/include/data0type.ic index 555852474aa..8f5cee0fd5f 100644 --- a/storage/xtradb/include/data0type.ic +++ b/storage/xtradb/include/data0type.ic @@ -576,7 +576,8 @@ dtype_get_fixed_size_low( #else /* !UNIV_HOTBACKUP */ return(len); #endif /* !UNIV_HOTBACKUP */ - /* fall through for variable-length charsets */ + /* Treat as variable-length. */ + /* Fall through */ case DATA_VARCHAR: case DATA_BINARY: case DATA_DECIMAL: diff --git a/storage/xtradb/include/db0err.h b/storage/xtradb/include/db0err.h index b11c5f4ea1a..8bd3beda110 100644 --- a/storage/xtradb/include/db0err.h +++ b/storage/xtradb/include/db0err.h @@ -138,6 +138,8 @@ enum dberr_t { of missing key management plugin, or missing or incorrect key or incorret AES method or algorithm. */ + DB_PAGE_CORRUPTED, /* Page read from tablespace is + corrupted. */ /* The following are partial failure codes */ DB_FAIL = 1000, DB_OVERFLOW, diff --git a/storage/xtradb/include/dict0dict.h b/storage/xtradb/include/dict0dict.h index 1622b927a76..a43b04d9d1e 100644 --- a/storage/xtradb/include/dict0dict.h +++ b/storage/xtradb/include/dict0dict.h @@ -1192,7 +1192,7 @@ dict_index_get_nth_col_pos( const dict_index_t* index, /*!< in: index */ ulint n, /*!< in: column number */ ulint* prefix_col_pos) /*!< out: col num if prefix */ - __attribute__((nonnull(1), warn_unused_result)); + MY_ATTRIBUTE((nonnull(1), warn_unused_result)); /********************************************************************//** Looks for column n in an index. @return position in internal representation of the index; @@ -1207,7 +1207,7 @@ dict_index_get_nth_col_or_prefix_pos( column prefixes too */ ulint* prefix_col_pos) /*!< out: col num if prefix */ - __attribute__((nonnull(1), warn_unused_result)); + MY_ATTRIBUTE((nonnull(1), warn_unused_result)); /********************************************************************//** Returns TRUE if the index contains a column or a prefix of that column. @return TRUE if contains the column or its prefix */ @@ -1653,9 +1653,6 @@ struct dict_sys_t{ on name */ hash_table_t* table_id_hash; /*!< hash table of the tables, based on id */ - ulint size; /*!< varying space in bytes occupied - by the data dictionary table and - index objects */ dict_table_t* sys_tables; /*!< SYS_TABLES table */ dict_table_t* sys_columns; /*!< SYS_COLUMNS table */ dict_table_t* sys_indexes; /*!< SYS_INDEXES table */ @@ -1766,16 +1763,6 @@ void dict_close(void); /*============*/ #ifndef UNIV_HOTBACKUP -/**********************************************************************//** -Check whether the table is corrupted. -@return nonzero for corrupted table, zero for valid tables */ -UNIV_INLINE -ulint -dict_table_is_corrupted( -/*====================*/ - const dict_table_t* table) /*!< in: table */ - MY_ATTRIBUTE((nonnull, warn_unused_result)); - /**********************************************************************//** Check whether the index is corrupted. @return nonzero for corrupted index, zero for valid indexes */ @@ -1820,6 +1807,15 @@ dict_set_corrupted_by_space( /*========================*/ ulint space_id); /*!< in: space ID */ +/**********************************************************************//** +Flags a table with specified space_id encrypted in the data dictionary +cache +@param[in] space_id Tablespace id */ +UNIV_INTERN +void +dict_set_encrypted_by_space( + ulint space_id); + /********************************************************************//** Validate the table flags. @return true if valid. */ @@ -1899,15 +1895,14 @@ dict_table_get_index_on_first_col( ulint col_index); /*!< in: position of column in table */ -#endif /* !UNIV_HOTBACKUP */ -/************************************************************************* -set is_corrupt flag by space_id*/ +/** Calculate the used memory occupied by the data dictionary +table and index objects. +@return number of bytes occupied. */ +UNIV_INTERN +ulint +dict_sys_get_size(); -void -dict_table_set_corrupt_by_space( -/*============================*/ - ulint space_id, - ibool need_mutex); +#endif /* !UNIV_HOTBACKUP */ #ifndef UNIV_NONINL #include "dict0dict.ic" diff --git a/storage/xtradb/include/dict0dict.ic b/storage/xtradb/include/dict0dict.ic index e3de7a33123..f68d4e176da 100644 --- a/storage/xtradb/include/dict0dict.ic +++ b/storage/xtradb/include/dict0dict.ic @@ -705,8 +705,6 @@ dict_sys_tables_type_validate( ulint page_compression_level = DICT_TF_GET_PAGE_COMPRESSION_LEVEL(type); ulint atomic_writes = DICT_TF_GET_ATOMIC_WRITES(type); - ut_a(atomic_writes <= ATOMIC_WRITES_OFF); - /* The low order bit of SYS_TABLES.TYPE is always set to 1. If the format is UNIV_FORMAT_B or higher, this field is the same as dict_table_t::flags. Zero is not allowed here. */ @@ -716,16 +714,12 @@ dict_sys_tables_type_validate( if (redundant) { if (zip_ssize || atomic_blobs) { - fprintf(stderr, "InnoDB: Error: SYS_TABLES::TYPE=Redundant, zip_ssize " ULINTPF " atomic_blobs " ULINTPF "\n", - zip_ssize, atomic_blobs); return(ULINT_UNDEFINED); } } /* Make sure there are no bits that we do not know about. */ if (unused) { - fprintf(stderr, "InnoDB: Error: SYS_TABLES::TYPE=" ULINTPF ", unused " ULINTPF "\n", - type, unused); return(ULINT_UNDEFINED); } @@ -737,11 +731,8 @@ dict_sys_tables_type_validate( The DICT_N_COLS_COMPACT flag should be in N_COLS, but we already know that. */ - } else if (zip_ssize) { /* Antelope does not support COMPRESSED format. */ - fprintf(stderr, "InnoDB: Error: SYS_TABLES::TYPE=" ULINTPF ", zip_ssize " ULINTPF "\n", - type, zip_ssize); return(ULINT_UNDEFINED); } @@ -751,15 +742,11 @@ dict_sys_tables_type_validate( should be in N_COLS, but we already know about the low_order_bit and DICT_N_COLS_COMPACT flags. */ if (!atomic_blobs) { - fprintf(stderr, "InnoDB: Error: SYS_TABLES::TYPE=" ULINTPF ", zip_ssize " ULINTPF " atomic_blobs " ULINTPF "\n", - type, zip_ssize, atomic_blobs); return(ULINT_UNDEFINED); } /* Validate that the number is within allowed range. */ if (zip_ssize > PAGE_ZIP_SSIZE_MAX) { - fprintf(stderr, "InnoDB: Error: SYS_TABLES::TYPE=" ULINTPF ", zip_ssize " ULINTPF " max %d\n", - type, zip_ssize, PAGE_ZIP_SSIZE_MAX); return(ULINT_UNDEFINED); } } @@ -776,18 +763,13 @@ dict_sys_tables_type_validate( low_order_bit and DICT_N_COLS_COMPACT flags. */ if (!atomic_blobs || !page_compression) { - fprintf(stderr, "InnoDB: Error: SYS_TABLES::TYPE=" ULINTPF ", page_compression " ULINTPF " page_compression_level " ULINTPF "\n" - "InnoDB: Error: atomic_blobs " ULINTPF "\n", - type, page_compression, page_compression_level, atomic_blobs); return(ULINT_UNDEFINED); } } /* Validate that the atomic writes number is within allowed range. */ if (atomic_writes > ATOMIC_WRITES_OFF) { - fprintf(stderr, "InnoDB: Error: SYS_TABLES::TYPE=" ULINTPF ", atomic_writes " ULINTPF "\n", - type, atomic_writes); - return(ULINT_UNDEFINED); + return(ULINT_UNDEFINED); } /* Return the validated SYS_TABLES.TYPE. */ @@ -1537,21 +1519,6 @@ dict_max_field_len_store_undo( return(prefix_len); } -/********************************************************************//** -Check whether the table is corrupted. -@return nonzero for corrupted table, zero for valid tables */ -UNIV_INLINE -ulint -dict_table_is_corrupted( -/*====================*/ - const dict_table_t* table) /*!< in: table */ -{ - ut_ad(table); - ut_ad(table->magic_n == DICT_TABLE_MAGIC_N); - - return(table->corrupted); -} - /********************************************************************//** Check whether the index is corrupted. @return nonzero for corrupted index, zero for valid indexes */ @@ -1564,7 +1531,7 @@ dict_index_is_corrupted( ut_ad(index->magic_n == DICT_INDEX_MAGIC_N); return((index->type & DICT_CORRUPT) - || (index->table && index->table->corrupted)); + || (index->table && index->table->corrupted)); } /********************************************************************//** diff --git a/storage/xtradb/include/dict0mem.h b/storage/xtradb/include/dict0mem.h index 96c85cd8a99..2a4422fc18b 100644 --- a/storage/xtradb/include/dict0mem.h +++ b/storage/xtradb/include/dict0mem.h @@ -2,7 +2,7 @@ Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2013, 2016, MariaDB Corporation. +Copyright (c) 2013, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -795,6 +795,9 @@ struct dict_index_t{ to first_blob_page_no; protected by blobs_mutex; @see btr_blob_dbg_t */ #endif /* UNIV_BLOB_DEBUG */ + + bool is_readable() const; + #ifdef UNIV_DEBUG ulint magic_n;/*!< magic number */ /** Value of dict_index_t::magic_n */ @@ -1045,10 +1048,6 @@ struct dict_table_t{ table_id_t id; /*!< id of the table */ mem_heap_t* heap; /*!< memory heap */ char* name; /*!< table name */ - void* thd; /*!< thd */ - bool page_0_read; /*!< true if page 0 has - been already read */ - fil_space_crypt_t *crypt_data; /*!< crypt data if present */ const char* dir_path_of_temp_table;/*!< NULL or the directory path where a TEMPORARY table that was explicitly created by a user should be placed if @@ -1062,11 +1061,13 @@ struct dict_table_t{ table is placed */ unsigned flags:DICT_TF_BITS; /*!< DICT_TF_... */ unsigned flags2:DICT_TF2_BITS; /*!< DICT_TF2_... */ - unsigned ibd_file_missing:1; - /*!< TRUE if this is in a single-table - tablespace and the .ibd file is missing; then - we must return in ha_innodb.cc an error if the - user tries to query such an orphaned table */ + unsigned file_unreadable:1; + /*!< true if this is in a single-table + tablespace and the .ibd file is missing + or page decryption failed and page is + corrupted; then we must return in + ha_innodb.cc an error if the + user tries to query such table */ unsigned cached:1;/*!< TRUE if the table object has been added to the dictionary cache */ unsigned to_be_dropped:1; @@ -1364,10 +1365,19 @@ struct dict_table_t{ UT_LIST_BASE_NODE_T(lock_t) locks; /*!< list of locks on the table; protected by lock_sys->mutex */ - ibool is_corrupt; - ibool is_encrypted; + #endif /* !UNIV_HOTBACKUP */ + /* Returns true if this is a single-table tablespace + and the .ibd file is missing or page decryption failed + and/or page is corrupted. + @return true if table is readable + @retval false if table is not readable */ + inline bool is_readable() const + { + return(UNIV_LIKELY(!file_unreadable)); + } + #ifdef UNIV_DEBUG ulint magic_n;/*!< magic number */ /** Value of dict_table_t::magic_n */ @@ -1375,6 +1385,16 @@ struct dict_table_t{ #endif /* UNIV_DEBUG */ }; +/* Returns true if this is a single-table tablespace +and the .ibd file is missing or page decryption failed +and/or page is corrupted. +@return true if table is readable +@retval false if table is not readable */ +inline bool dict_index_t::is_readable() const +{ + return(UNIV_LIKELY(!table->file_unreadable)); +} + /** A function object to add the foreign key constraint to the referenced set of the referenced table, if it exists in the dictionary cache. */ struct dict_foreign_add_to_referenced_table { diff --git a/storage/xtradb/include/dict0stats_bg.h b/storage/xtradb/include/dict0stats_bg.h index d5f0870718d..8f3385eb22b 100644 --- a/storage/xtradb/include/dict0stats_bg.h +++ b/storage/xtradb/include/dict0stats_bg.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2012, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -144,6 +144,10 @@ DECLARE_THREAD(dict_stats_thread)( void* arg); /*!< in: a dummy parameter required by os_thread_create */ +/** Shut down the dict_stats_thread. */ +void +dict_stats_shutdown(); + # ifndef UNIV_NONINL # include "dict0stats_bg.ic" # endif diff --git a/storage/xtradb/include/fil0crypt.h b/storage/xtradb/include/fil0crypt.h index e7e9676aa3a..228dfb895fe 100644 --- a/storage/xtradb/include/fil0crypt.h +++ b/storage/xtradb/include/fil0crypt.h @@ -117,8 +117,7 @@ struct fil_space_crypt_t : st_encryption_scheme min_key_version(new_min_key_version), page0_offset(0), encryption(new_encryption), - mutex(), - key_found(new_min_key_version), + key_found(0), rotate_state() { key_id = new_key_id; @@ -136,6 +135,8 @@ struct fil_space_crypt_t : st_encryption_scheme type = CRYPT_SCHEME_1; min_key_version = key_get_latest_version(); } + + key_found = min_key_version; } /** Destructor */ @@ -298,13 +299,15 @@ Parse a MLOG_FILE_WRITE_CRYPT_DATA log entry @param[in] ptr Log entry start @param[in] end_ptr Log entry end @param[in] block buffer block +@param[out] err DB_SUCCESS or DB_DECRYPTION_FAILED @return position on log buffer */ UNIV_INTERN -const byte* +byte* fil_parse_write_crypt_data( - const byte* ptr, + byte* ptr, const byte* end_ptr, - const buf_block_t* block) + const buf_block_t* block, + dberr_t* err) MY_ATTRIBUTE((warn_unused_result)); /****************************************************************** diff --git a/storage/xtradb/include/fil0fil.h b/storage/xtradb/include/fil0fil.h index d73a68d9d34..a33cec65ed5 100644 --- a/storage/xtradb/include/fil0fil.h +++ b/storage/xtradb/include/fil0fil.h @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2013, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under @@ -136,6 +136,7 @@ extern fil_addr_t fil_addr_null; #define FIL_PAGE_DATA 38 /*!< start of the data on the page */ /* Following are used when page compression is used */ + #define FIL_PAGE_COMPRESSED_SIZE 2 /*!< Number of bytes used to store actual payload data size on compressed pages. */ @@ -209,9 +210,8 @@ struct fsp_open_info { ibool success; /*!< Has the tablespace been opened? */ const char* check_msg; /*!< fil_check_first_page() message */ ibool valid; /*!< Is the tablespace valid? */ - os_file_t file; /*!< File handle */ + pfs_os_file_t file; /*!< File handle */ char* filepath; /*!< File path to open */ - lsn_t lsn; /*!< Flushed LSN from header page */ ulint id; /*!< Space ID */ ulint flags; /*!< Tablespace flags */ ulint encryption_error; /*!< if an encryption error occurs */ @@ -227,7 +227,7 @@ struct fil_node_t { belongs */ char* name; /*!< path to the file */ ibool open; /*!< TRUE if file open */ - os_file_t handle; /*!< OS handle to the file, if file open */ + pfs_os_file_t handle; /*!< OS handle to the file, if file open */ os_event_t sync_event;/*!< Condition event to group and serialize calls to fsync; os_event_set() and os_event_reset() @@ -313,13 +313,21 @@ struct fil_space_t { ulint n_pending_flushes; /*!< this is positive when flushing the tablespace to disk; dropping of the tablespace is forbidden if this is positive */ - ulint n_pending_ops;/*!< this is positive when we - have pending operations against this - tablespace. The pending operations can - be ibuf merges or lock validation code - trying to read a block. - Dropping of the tablespace is forbidden - if this is positive */ + /** Number of pending buffer pool operations accessing the tablespace + without holding a table lock or dict_operation_lock S-latch + that would prevent the table (and tablespace) from being + dropped. An example is change buffer merge. + The tablespace cannot be dropped while this is nonzero, + or while fil_node_t::n_pending is nonzero. + Protected by fil_system->mutex. */ + ulint n_pending_ops; + /** Number of pending block read or write operations + (when a write is imminent or a read has recently completed). + The tablespace object cannot be freed while this is nonzero, + but it can be detached from fil_system. + Note that fil_node_t::n_pending tracks actual pending I/O requests. + Protected by fil_system->mutex. */ + ulint n_pending_ios; hash_node_t hash; /*!< hash chain node */ hash_node_t name_hash;/*!< hash chain the name_hash table */ #ifndef UNIV_HOTBACKUP @@ -342,9 +350,6 @@ struct fil_space_t { compression failure */ fil_space_crypt_t* crypt_data; /*!< tablespace crypt data or NULL */ - bool page_0_crypt_read; - /*!< tablespace crypt data has been - read */ ulint file_block_size; /*!< file system block size */ @@ -634,17 +639,29 @@ void fil_set_max_space_id_if_bigger( /*===========================*/ ulint max_id);/*!< in: maximum known id */ + #ifndef UNIV_HOTBACKUP -/****************************************************************//** -Writes the flushed lsn and the latest archived log number to the page -header of the first page of each data file in the system tablespace. -@return DB_SUCCESS or error number */ -UNIV_INTERN + +/** Write the flushed LSN to the page header of the first page in the +system tablespace. +@param[in] lsn flushed LSN +@return DB_SUCCESS or error number */ dberr_t -fil_write_flushed_lsn_to_data_files( -/*================================*/ - lsn_t lsn, /*!< in: lsn to write */ - ulint arch_log_no); /*!< in: latest archived log file number */ +fil_write_flushed_lsn( + lsn_t lsn) + MY_ATTRIBUTE((warn_unused_result)); + +/** Acquire a tablespace when it could be dropped concurrently. +Used by background threads that do not necessarily hold proper locks +for concurrency control. +@param[in] id tablespace ID +@param[in] silent whether to silently ignore missing tablespaces +@return the tablespace +@retval NULL if missing or being deleted or truncated */ +UNIV_INTERN +fil_space_t* +fil_space_acquire_low(ulint id, bool silent) + MY_ATTRIBUTE((warn_unused_result)); /** Acquire a tablespace when it could be dropped concurrently. Used by background threads that do not necessarily hold proper locks @@ -654,9 +671,12 @@ for concurrency control. (possibly executing TRUNCATE) @return the tablespace @retval NULL if missing or being deleted or truncated */ +inline fil_space_t* -fil_space_acquire(ulint id, bool for_io = false) - MY_ATTRIBUTE((warn_unused_result)); +fil_space_acquire(ulint id) +{ + return(fil_space_acquire_low(id, false)); +} /** Acquire a tablespace that may not exist. Used by background threads that do not necessarily hold proper locks @@ -664,15 +684,34 @@ for concurrency control. @param[in] id tablespace ID @return the tablespace @retval NULL if missing or being deleted */ +inline fil_space_t* fil_space_acquire_silent(ulint id) - MY_ATTRIBUTE((warn_unused_result)); +{ + return(fil_space_acquire_low(id, true)); +} /** Release a tablespace acquired with fil_space_acquire(). @param[in,out] space tablespace to release */ +UNIV_INTERN void fil_space_release(fil_space_t* space); +/** Acquire a tablespace for reading or writing a block, +when it could be dropped concurrently. +@param[in] id tablespace ID +@return the tablespace +@retval NULL if missing */ +UNIV_INTERN +fil_space_t* +fil_space_acquire_for_io(ulint id); + +/** Release a tablespace acquired with fil_space_acquire_for_io(). +@param[in,out] space tablespace to release */ +UNIV_INTERN +void +fil_space_release_for_io(fil_space_t* space); + /** Return the next fil_space_t. Once started, the caller must keep calling this until it returns NULL. fil_space_acquire() and fil_space_release() are invoked here which @@ -681,6 +720,7 @@ blocks a concurrent operation from dropping the tablespace. If NULL, use the first fil_space_t on fil_system->space_list. @return pointer to the next fil_space_t. @retval NULL if this was the last */ +UNIV_INTERN fil_space_t* fil_space_next( fil_space_t* prev_space) @@ -694,49 +734,92 @@ blocks a concurrent operation from dropping the tablespace. If NULL, use the first fil_space_t on fil_system->space_list. @return pointer to the next fil_space_t. @retval NULL if this was the last*/ +UNIV_INTERN fil_space_t* fil_space_keyrotate_next( fil_space_t* prev_space) MY_ATTRIBUTE((warn_unused_result)); -/*******************************************************************//** -Reads the flushed lsn, arch no, and tablespace flag fields from a data -file at database startup. -@retval NULL on success, or if innodb_force_recovery is set -@return pointer to an error message string */ +/** Wrapper with reference-counting for a fil_space_t. */ +class FilSpace +{ +public: + /** Default constructor: Use this when reference counting + is done outside this wrapper. */ + FilSpace() : m_space(NULL) {} + + /** Constructor: Look up the tablespace and increment the + reference count if found. + @param[in] space_id tablespace ID + @param[in] silent whether not to print any errors */ + explicit FilSpace(ulint space_id, bool silent = false) + : m_space(fil_space_acquire_low(space_id, silent)) {} + + /** Assignment operator: This assumes that fil_space_acquire() + has already been done for the fil_space_t. The caller must + assign NULL if it calls fil_space_release(). + @param[in] space tablespace to assign */ + class FilSpace& operator=(fil_space_t* space) + { + /* fil_space_acquire() must have been invoked. */ + ut_ad(space == NULL || space->n_pending_ops > 0); + m_space = space; + return(*this); + } + + /** Destructor - Decrement the reference count if a fil_space_t + is still assigned. */ + ~FilSpace() + { + if (m_space != NULL) { + fil_space_release(m_space); + } + } + + /** Implicit type conversion + @return the wrapped object */ + operator const fil_space_t*() const + { + return(m_space); + } + + /** Explicit type conversion + @return the wrapped object */ + const fil_space_t* operator()() const + { + return(m_space); + } + +private: + /** The wrapped pointer */ + fil_space_t* m_space; +}; + +/** Reads the flushed lsn, arch no, space_id and tablespace flag fields from +the first page of a first data file at database startup. +@param[in] data_file open data file +@param[in] one_read_only true if first datafile is already + read +@param[out] flags FSP_SPACE_FLAGS +@param[out] space_id tablepspace ID +@param[out] flushed_lsn flushed lsn value +@param[out] crypt_data encryption crypt data +@param[in] check_first_page true if first page contents + should be checked +@return NULL on success, or if innodb_force_recovery is set +@retval pointer to an error message string */ UNIV_INTERN const char* fil_read_first_page( -/*================*/ - os_file_t data_file, /*!< in: open data file */ - ibool one_read_already, /*!< in: TRUE if min and max - parameters below already - contain sensible data */ - ulint* flags, /*!< out: FSP_SPACE_FLAGS */ - ulint* space_id, /*!< out: tablespace ID */ - lsn_t* min_flushed_lsn, /*!< out: min of flushed - lsn values in data files */ - lsn_t* max_flushed_lsn, /*!< out: max of flushed - lsn values in data files */ - fil_space_crypt_t** crypt_data) /*!< out: crypt data */ + pfs_os_file_t data_file, + ibool one_read_already, + ulint* flags, + ulint* space_id, + lsn_t* flushed_lsn, + fil_space_crypt_t** crypt_data, + bool check_first_page=true) + MY_ATTRIBUTE((warn_unused_result)); - __attribute__((warn_unused_result)); -/*******************************************************************//** -Increments the count of pending operation, if space is not being deleted. -@return TRUE if being deleted, and operation should be skipped */ -UNIV_INTERN -ibool -fil_inc_pending_ops( -/*================*/ - ulint id, /*!< in: space id */ - ibool print_err); /*!< in: need to print error or not */ -/*******************************************************************//** -Decrements the count of pending operations. */ -UNIV_INTERN -void -fil_decr_pending_ops( -/*=================*/ - ulint id); /*!< in: space id */ #endif /* !UNIV_HOTBACKUP */ /*******************************************************************//** Parses the body of a log record written about an .ibd file operation. That is, @@ -922,7 +1005,7 @@ fil_create_new_single_table_tablespace( must be >= FIL_IBD_FILE_INITIAL_SIZE */ fil_encryption_t mode, /*!< in: encryption mode */ ulint key_id) /*!< in: encryption key_id */ - __attribute__((nonnull, warn_unused_result)); + MY_ATTRIBUTE((nonnull(2), warn_unused_result)); #ifndef UNIV_HOTBACKUP /** Try to adjust FSP_SPACE_FLAGS if they differ from the expectations. (Typically when upgrading from MariaDB 10.1.0..10.1.20.) @@ -963,8 +1046,7 @@ fil_open_single_table_tablespace( ulint flags, /*!< in: expected FSP_SPACE_FLAGS */ const char* tablename, /*!< in: table name in the databasename/tablename format */ - const char* filepath, /*!< in: tablespace filepath */ - dict_table_t* table) /*!< in: table */ + const char* filepath) /*!< in: tablespace filepath */ __attribute__((nonnull(5), warn_unused_result)); #endif /* !UNIV_HOTBACKUP */ @@ -978,7 +1060,7 @@ space id is != 0. @return DB_SUCCESS or error number */ UNIV_INTERN dberr_t -fil_load_single_table_tablespaces(void); +fil_load_single_table_tablespaces(ibool (*pred)(const char*, const char*)=0); /*===================================*/ /*******************************************************************//** Returns TRUE if a single-table tablespace does not exist in the memory cache, @@ -1017,6 +1099,9 @@ fil_space_for_table_exists_in_mem( information to the .err log if a matching tablespace is not found from memory */ + bool remove_from_data_dict_if_does_not_exist, + /*!< in: remove from the data dictionary + if tablespace does not exist */ bool adjust_space, /*!< in: whether to adjust space id when find table space mismatch */ mem_heap_t* heap, /*!< in: heap memory */ @@ -1253,12 +1338,12 @@ struct PageCallback { Called for every page in the tablespace. If the page was not updated then its state must be set to BUF_PAGE_NOT_USED. For compressed tables the page descriptor memory will be at offset: - block->frame + UNIV_PAGE_SIZE; + block->frame + UNIV_PAGE_SIZE; @param offset - physical offset within the file @param block - block read from file, note it is not from the buffer pool @retval DB_SUCCESS or error code. */ virtual dberr_t operator()( - os_offset_t offset, + os_offset_t offset, buf_block_t* block) UNIV_NOTHROW = 0; /** @@ -1266,7 +1351,7 @@ struct PageCallback { to open it for the file that is being iterated over. @param filename - then physical name of the tablespace file. @param file - OS file handle */ - void set_file(const char* filename, os_file_t file) UNIV_NOTHROW + void set_file(const char* filename, pfs_os_file_t file) UNIV_NOTHROW { m_file = file; m_filepath = filename; @@ -1302,7 +1387,7 @@ struct PageCallback { ulint m_page_size; /** File handle to the tablespace */ - os_file_t m_file; + pfs_os_file_t m_file; /** Physical file path. */ const char* m_filepath; @@ -1428,36 +1513,6 @@ fil_space_get_by_id( /*================*/ ulint id); /*!< in: space id */ -/****************************************************************** -Get id of first tablespace or ULINT_UNDEFINED if none */ -UNIV_INTERN -ulint -fil_get_first_space(); -/*=================*/ - -/****************************************************************** -Get id of next tablespace or ULINT_UNDEFINED if none */ -UNIV_INTERN -ulint -fil_get_next_space( -/*===============*/ - ulint id); /*!< in: space id */ - -/****************************************************************** -Get id of first tablespace that has node or ULINT_UNDEFINED if none */ -UNIV_INTERN -ulint -fil_get_first_space_safe(); -/*======================*/ - -/****************************************************************** -Get id of next tablespace that has node or ULINT_UNDEFINED if none */ -UNIV_INTERN -ulint -fil_get_next_space_safe( -/*====================*/ - ulint id); /*!< in: previous space id */ - #endif /* UNIV_INNOCHECKSUM */ /****************************************************************//** diff --git a/storage/xtradb/include/fil0pagecompress.h b/storage/xtradb/include/fil0pagecompress.h index 73667c5420e..03e16699ce3 100644 --- a/storage/xtradb/include/fil0pagecompress.h +++ b/storage/xtradb/include/fil0pagecompress.h @@ -65,9 +65,8 @@ fil_compress_page( ulint level, /* in: compression level */ ulint block_size, /*!< in: block size */ bool encrypted, /*!< in: is page also encrypted */ - ulint* out_len, /*!< out: actual length of compressed + ulint* out_len); /*!< out: actual length of compressed page */ - byte* lzo_mem); /*!< in: temporal memory used by LZO */ /****************************************************************//** For page compressed pages decompress the page after actual read diff --git a/storage/xtradb/include/fsp0fsp.h b/storage/xtradb/include/fsp0fsp.h index 6ed78eba6f9..715572199ab 100644 --- a/storage/xtradb/include/fsp0fsp.h +++ b/storage/xtradb/include/fsp0fsp.h @@ -519,16 +519,14 @@ fsp_header_init_fields( ulint space_id, /*!< in: space id */ ulint flags); /*!< in: tablespace flags (FSP_SPACE_FLAGS): 0, or table->flags if newer than COMPACT */ -/**********************************************************************//** -Initializes the space header of a new created space and creates also the -insert buffer tree root if space == 0. */ +/** Initialize a tablespace header. +@param[in] space_id space id +@param[in] size current size in blocks +@param[in,out] mtr mini-transaction */ UNIV_INTERN void -fsp_header_init( -/*============*/ - ulint space, /*!< in: space id */ - ulint size, /*!< in: current size in blocks */ - mtr_t* mtr); /*!< in/out: mini-transaction */ +fsp_header_init(ulint space_id, ulint size, mtr_t* mtr); + /**********************************************************************//** Increases the space size field of a space. */ UNIV_INTERN diff --git a/storage/xtradb/include/ha0ha.h b/storage/xtradb/include/ha0ha.h index 7351b407e8c..58eb581e76a 100644 --- a/storage/xtradb/include/ha0ha.h +++ b/storage/xtradb/include/ha0ha.h @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1994, 2011, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -107,7 +107,7 @@ chosen to be a slightly bigger prime number. @param level in: level of the mutexes in the latching order @param n_m in: number of mutexes to protect the hash table; must be a power of 2, or 0 */ -# define ha_create(n_c,n_m,type,level) ha_create_func(n_c,level,n_m,type) +# define ib_create(n_c,n_m,type,level) ha_create_func(n_c,level,n_m,type) #else /* UNIV_SYNC_DEBUG */ /** Creates a hash table. @return own: created table @@ -116,7 +116,7 @@ chosen to be a slightly bigger prime number. @param level in: level of the mutexes in the latching order @param n_m in: number of mutexes to protect the hash table; must be a power of 2, or 0 */ -# define ha_create(n_c,n_m,type,level) ha_create_func(n_c,n_m,type) +# define ib_create(n_c,n_m,type,level) ha_create_func(n_c,n_m,type) #endif /* UNIV_SYNC_DEBUG */ /*************************************************************//** diff --git a/storage/xtradb/include/ha_prototypes.h b/storage/xtradb/include/ha_prototypes.h index a161ec8c06c..b053be9e61d 100644 --- a/storage/xtradb/include/ha_prototypes.h +++ b/storage/xtradb/include/ha_prototypes.h @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 2006, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -144,7 +145,7 @@ enum durability_properties thd_requested_durability( /*=====================*/ const THD* thd) /*!< in: thread handle */ - MY_ATTRIBUTE((nonnull, warn_unused_result)); + MY_ATTRIBUTE((warn_unused_result)); /******************************************************************//** Returns true if the transaction this thread is processing has edited diff --git a/storage/xtradb/include/log0crypt.h b/storage/xtradb/include/log0crypt.h index 6b164e90d6e..0ad7e7d7037 100644 --- a/storage/xtradb/include/log0crypt.h +++ b/storage/xtradb/include/log0crypt.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (C) 2013, 2015, Google Inc. All Rights Reserved. -Copyright (C) 2014, 2016, MariaDB Corporation. All Rights Reserved. +Copyright (C) 2014, 2017, MariaDB Corporation. All Rights Reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -29,6 +29,7 @@ Modified Jan Lindström jan.lindstrom@mariadb.com #include "univ.i" #include "ut0byte.h" #include "my_crypt.h" +#include "os0file.h" typedef int Crypt_result; @@ -125,4 +126,45 @@ log_crypt_print_checkpoint_keys( /*============================*/ const byte* log_block); +/** Encrypt temporary log block. +@param[in] src_block block to encrypt or decrypt +@param[in] size size of the block +@param[out] dst_block destination block +@param[in] offs offset to block +@param[in] space_id tablespace id +@return true if successfull, false in case of failure +*/ +UNIV_INTERN +bool +log_tmp_block_encrypt( + const byte* src_block, + ulint size, + byte* dst_block, + os_offset_t offs, + ulint space_id) + MY_ATTRIBUTE((warn_unused_result)); + +/** Decrypt temporary log block. +@param[in] src_block block to encrypt or decrypt +@param[in] size size of the block +@param[out] dst_block destination block +@param[in] offs offset to block +@param[in] space_id tablespace id +@return true if successfull, false in case of failure +*/ +UNIV_INTERN +bool +log_tmp_block_decrypt( + const byte* src_block, + ulint size, + byte* dst_block, + os_offset_t offs, + ulint space_id) + MY_ATTRIBUTE((warn_unused_result)); + +/** Find out is temporary log files encrypted. +@return true if temporary log file should be encrypted, false if not */ +UNIV_INTERN +bool +log_tmp_is_encrypted() MY_ATTRIBUTE((warn_unused_result)); #endif // log0crypt.h diff --git a/storage/xtradb/include/log0online.h b/storage/xtradb/include/log0online.h index 722336dd6b4..5c3e7d07fd9 100644 --- a/storage/xtradb/include/log0online.h +++ b/storage/xtradb/include/log0online.h @@ -130,7 +130,7 @@ log_online_bitmap_iterator_next( /** Struct for single bitmap file information */ struct log_online_bitmap_file_struct { char name[FN_REFLEN]; /*!< Name with full path */ - os_file_t file; /*!< Handle to opened file */ + pfs_os_file_t file; /*!< Handle to opened file */ ib_uint64_t size; /*!< Size of the file */ os_offset_t offset; /*!< Offset of the next read, or count of already-read bytes diff --git a/storage/xtradb/include/log0recv.h b/storage/xtradb/include/log0recv.h index e7b6a937f01..73d53d2ddab 100644 --- a/storage/xtradb/include/log0recv.h +++ b/storage/xtradb/include/log0recv.h @@ -137,26 +137,25 @@ a freshly read page) */ # define recv_recover_page(jri, block) recv_recover_page_func(block) #endif /* !UNIV_HOTBACKUP */ -/********************************************************//** -Recovers from a checkpoint. When this function returns, the database is able + +/** Recovers from a checkpoint. When this function returns, the database is able to start processing of new user transactions, but the function recv_recovery_from_checkpoint_finish should be called later to complete the recovery and free the resources used in it. +@param[in] type LOG_CHECKPOINT or LOG_ARCHIVE +@param[in] limit_lsn recover up to this lsn if possible +@param[in] flushed_lsn flushed lsn from first data file @return error code or DB_SUCCESS */ UNIV_INTERN dberr_t recv_recovery_from_checkpoint_start_func( -/*=====================================*/ #ifdef UNIV_LOG_ARCHIVE - ulint type, /*!< in: LOG_CHECKPOINT or - LOG_ARCHIVE */ - lsn_t limit_lsn, /*!< in: recover up to this lsn - if possible */ + ulint type, + lsn_t limit_lsn, #endif /* UNIV_LOG_ARCHIVE */ - lsn_t min_flushed_lsn,/*!< in: min flushed lsn from - data files */ - lsn_t max_flushed_lsn);/*!< in: max flushed lsn from - data files */ + lsn_t flushed_lsn) + MY_ATTRIBUTE((warn_unused_result)); + #ifdef UNIV_LOG_ARCHIVE /** Wrapper for recv_recovery_from_checkpoint_start_func(). Recovers from a checkpoint. When this function returns, the database is able @@ -165,11 +164,10 @@ recv_recovery_from_checkpoint_finish should be called later to complete the recovery and free the resources used in it. @param type in: LOG_CHECKPOINT or LOG_ARCHIVE @param lim in: recover up to this log sequence number if possible -@param min in: minimum flushed log sequence number from data files -@param max in: maximum flushed log sequence number from data files +@param lsn in: flushed log sequence number from first data file @return error code or DB_SUCCESS */ -# define recv_recovery_from_checkpoint_start(type,lim,min,max) \ - recv_recovery_from_checkpoint_start_func(type,lim,min,max) +# define recv_recovery_from_checkpoint_start(type,lim,lsn) \ + recv_recovery_from_checkpoint_start_func(type,lim,lsn) #else /* UNIV_LOG_ARCHIVE */ /** Wrapper for recv_recovery_from_checkpoint_start_func(). Recovers from a checkpoint. When this function returns, the database is able @@ -178,12 +176,12 @@ recv_recovery_from_checkpoint_finish should be called later to complete the recovery and free the resources used in it. @param type ignored: LOG_CHECKPOINT or LOG_ARCHIVE @param lim ignored: recover up to this log sequence number if possible -@param min in: minimum flushed log sequence number from data files -@param max in: maximum flushed log sequence number from data files +@param lsn in: flushed log sequence number from first data file @return error code or DB_SUCCESS */ -# define recv_recovery_from_checkpoint_start(type,lim,min,max) \ - recv_recovery_from_checkpoint_start_func(min,max) +# define recv_recovery_from_checkpoint_start(type,lim,lsn) \ + recv_recovery_from_checkpoint_start_func(lsn) #endif /* UNIV_LOG_ARCHIVE */ + /********************************************************//** Completes recovery from a checkpoint. */ UNIV_INTERN diff --git a/storage/xtradb/include/mach0data.ic b/storage/xtradb/include/mach0data.ic index 3904d96c09f..3b1cf9c0378 100644 --- a/storage/xtradb/include/mach0data.ic +++ b/storage/xtradb/include/mach0data.ic @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2009, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -779,13 +780,13 @@ mach_swap_byte_order( dest += len; switch (len & 0x7) { - case 0: *--dest = *from++; - case 7: *--dest = *from++; - case 6: *--dest = *from++; - case 5: *--dest = *from++; - case 4: *--dest = *from++; - case 3: *--dest = *from++; - case 2: *--dest = *from++; + case 0: *--dest = *from++; /* fall through */ + case 7: *--dest = *from++; /* fall through */ + case 6: *--dest = *from++; /* fall through */ + case 5: *--dest = *from++; /* fall through */ + case 4: *--dest = *from++; /* fall through */ + case 3: *--dest = *from++; /* fall through */ + case 2: *--dest = *from++; /* fall through */ case 1: *--dest = *from; } } diff --git a/storage/xtradb/include/os0file.h b/storage/xtradb/include/os0file.h index 06bb6a6fbac..b17e09cf0fa 100644 --- a/storage/xtradb/include/os0file.h +++ b/storage/xtradb/include/os0file.h @@ -1,6 +1,6 @@ /*********************************************************************** -Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2009, Percona Inc. Copyright (c) 2013, 2017, MariaDB Corporation. @@ -65,26 +65,54 @@ extern ibool os_aio_print_debug; /** File offset in bytes */ typedef ib_uint64_t os_offset_t; -#ifdef __WIN__ -#define SRV_PATH_SEPARATOR '\\' +#ifdef _WIN32 +# define SRV_PATH_SEPARATOR '\\' /** File handle */ -# define os_file_t HANDLE -# define os_file_invalid INVALID_HANDLE_VALUE +typedef HANDLE os_file_t; /** Convert a C file descriptor to a native file handle @param fd file descriptor @return native file handle */ -# define OS_FILE_FROM_FD(fd) (HANDLE) _get_osfhandle(fd) +# define OS_FILE_FROM_FD(fd) reinterpret_cast(_get_osfhandle(fd)) #else -#define SRV_PATH_SEPARATOR '/' +# define SRV_PATH_SEPARATOR '/' /** File handle */ typedef int os_file_t; -# define os_file_invalid (-1) /** Convert a C file descriptor to a native file handle @param fd file descriptor @return native file handle */ # define OS_FILE_FROM_FD(fd) fd #endif +/** File descriptor with optional PERFORMANCE_SCHEMA instrumentation */ +struct pfs_os_file_t +{ + /** Default constructor */ + pfs_os_file_t() : m_file( +#ifdef _WIN32 + INVALID_HANDLE_VALUE +#else + -1 +#endif + ) +#ifdef UNIV_PFS_IO + , m_psi(NULL) +#endif + {} + + /** The wrapped file handle */ + os_file_t m_file; +#ifdef UNIV_PFS_IO + /** PERFORMANCE_SCHEMA descriptor */ + struct PSI_file *m_psi; +#endif + /** Implicit type conversion. + @return the wrapped file handle */ + operator os_file_t() const { return m_file; } + /** Assignment operator. + @param[in] file file handle to be assigned */ + void operator=(os_file_t file) { m_file = file; } +}; + /** Umask for creating files */ extern ulint os_innodb_umask; @@ -120,6 +148,21 @@ enum os_file_create_t { ON_ERROR_NO_EXIT is set */ }; +/** Options for os_file_advise_func @{ */ +enum os_file_advise_t { + OS_FILE_ADVISE_NORMAL = 1, /*!< no advice on access pattern + (default) */ + OS_FILE_ADVISE_RANDOM = 2, /*!< access in random order */ + OS_FILE_ADVISE_SEQUENTIAL = 4, /*!< access the specified data + sequentially (with lower offsets read + before higher ones) */ + OS_FILE_ADVISE_WILLNEED = 8, /*!< specified data will be accessed + in the near future */ + OS_FILE_ADVISE_DONTNEED = 16, /*!< specified data will not be + accessed in the near future */ + OS_FILE_ADVISE_NOREUSE = 32 /*!< access only once */ +}; + #define OS_FILE_READ_ONLY 333 #define OS_FILE_READ_WRITE 444 #define OS_FILE_READ_ALLOW_DELETE 555 /* for mysqlbackup */ @@ -221,6 +264,8 @@ extern mysql_pfs_key_t innodb_file_bmp_key; various file I/O operations with performance schema. 1) register_pfs_file_open_begin() and register_pfs_file_open_end() are used to register file creation, opening, closing and renaming. +2) register_pfs_file_rename_begin() and register_pfs_file_rename_end() +are used to register file renaming 2) register_pfs_file_io_begin() and register_pfs_file_io_end() are used to register actual file read, write and flush 3) register_pfs_file_close_begin() and register_pfs_file_close_end() @@ -230,17 +275,30 @@ are used to register file deletion operations*/ do { \ locker = PSI_FILE_CALL(get_thread_file_name_locker)( \ state, key, op, name, &locker); \ - if (UNIV_LIKELY(locker != NULL)) { \ + if (locker != NULL) { \ PSI_FILE_CALL(start_file_open_wait)( \ locker, src_file, src_line); \ } \ } while (0) -# define register_pfs_file_open_end(locker, file) \ +# define register_pfs_file_open_end(locker, file, result) \ do { \ - if (UNIV_LIKELY(locker != NULL)) { \ - PSI_FILE_CALL(end_file_open_wait_and_bind_to_descriptor)(\ - locker, file); \ + if (locker != NULL) { \ + file.m_psi = PSI_FILE_CALL( \ + end_file_open_wait)( \ + locker, result); \ + } \ +} while (0) + +# define register_pfs_file_rename_begin(state, locker, key, op, name, \ + src_file, src_line) \ + register_pfs_file_open_begin(state, locker, key, op, name, \ + src_file, src_line) \ + +# define register_pfs_file_rename_end(locker, result) \ +do { \ + if (locker != NULL) { \ + PSI_FILE_CALL(end_file_open_wait)(locker, result); \ } \ } while (0) @@ -266,9 +324,9 @@ do { \ # define register_pfs_file_io_begin(state, locker, file, count, op, \ src_file, src_line) \ do { \ - locker = PSI_FILE_CALL(get_thread_file_descriptor_locker)( \ - state, file, op); \ - if (UNIV_LIKELY(locker != NULL)) { \ + locker = PSI_FILE_CALL(get_thread_file_stream_locker)( \ + state, file.m_psi, op); \ + if (locker != NULL) { \ PSI_FILE_CALL(start_file_wait)( \ locker, count, src_file, src_line); \ } \ @@ -276,7 +334,7 @@ do { \ # define register_pfs_file_io_end(locker, count) \ do { \ - if (UNIV_LIKELY(locker != NULL)) { \ + if (locker != NULL) { \ PSI_FILE_CALL(end_file_wait)(locker, count); \ } \ } while (0) @@ -290,11 +348,16 @@ os_file_create os_file_create_simple os_file_create_simple_no_error_handling os_file_close +os_file_close_no_error_handling os_file_rename os_aio os_file_read os_file_read_no_error_handling +os_file_read_no_error_handling_int_fd os_file_write +os_file_write_int_fd +os_file_set_eof_at +os_file_allocate The wrapper functions have the prefix of "innodb_". */ @@ -315,6 +378,9 @@ The wrapper functions have the prefix of "innodb_". */ # define os_file_close(file) \ pfs_os_file_close_func(file, __FILE__, __LINE__) +# define os_file_close_no_error_handling(file) \ + pfs_os_file_close_no_error_handling_func(file, __FILE__, __LINE__) + # define os_aio(type, is_log, mode, name, file, buf, offset, \ n, page_size, message1, message2, space_id, \ trx, write_size) \ @@ -334,9 +400,18 @@ The wrapper functions have the prefix of "innodb_". */ pfs_os_file_read_no_error_handling_func(file, buf, offset, n, \ __FILE__, __LINE__) -# define os_file_write(name, file, buf, offset, n) \ - pfs_os_file_write_func(name, file, buf, offset, n, \ - __FILE__, __LINE__) +# define os_file_read_no_error_handling_int_fd( \ + file, buf, offset, n) \ + pfs_os_file_read_no_error_handling_int_fd_func( \ + file, buf, offset, n, __FILE__, __LINE__) + +# define os_file_write(name, file, buf, offset, n) \ + pfs_os_file_write_func(name, file, buf, offset, \ + n, __FILE__, __LINE__) + +# define os_file_write_int_fd(name, file, buf, offset, n) \ + pfs_os_file_write_int_fd_func(name, file, buf, offset, \ + n, __FILE__, __LINE__) # define os_file_flush(file) \ pfs_os_file_flush_func(file, __FILE__, __LINE__) @@ -349,6 +424,15 @@ The wrapper functions have the prefix of "innodb_". */ # define os_file_delete_if_exists(key, name) \ pfs_os_file_delete_if_exists_func(key, name, __FILE__, __LINE__) + +# define os_file_set_eof_at(file, new_len) \ + pfs_os_file_set_eof_at_func(file, new_len, __FILE__, __LINE__) + +# ifdef HAVE_POSIX_FALLOCATE +# define os_file_allocate(file, offset, len) \ + pfs_os_file_allocate_func(file, offset, len, __FILE__, __LINE__) +# endif + #else /* UNIV_PFS_IO */ /* If UNIV_PFS_IO is not defined, these I/O APIs point @@ -364,7 +448,11 @@ to original un-instrumented file I/O APIs */ os_file_create_simple_no_error_handling_func( \ name, create_mode, access, success, atomic_writes) -# define os_file_close(file) os_file_close_func(file) +# define os_file_close(file) \ + os_file_close_func(file) + +# define os_file_close_no_error_handling(file) \ + os_file_close_no_error_handling_func(file) # define os_aio(type, is_log, mode, name, file, buf, offset, n, page_size, message1, \ message2, space_id, trx, write_size) \ @@ -379,11 +467,17 @@ to original un-instrumented file I/O APIs */ # define os_file_read_no_error_handling(file, buf, offset, n) \ os_file_read_no_error_handling_func(file, buf, offset, n) +# define os_file_read_no_error_handling_int_fd( \ + file, buf, offset, n) \ + os_file_read_no_error_handling_func(file, buf, offset, n) +# define os_file_write_int_fd(name, file, buf, offset, n) \ + os_file_write_func(name, file, buf, offset, n) # define os_file_write(name, file, buf, offset, n) \ os_file_write_func(name, file, buf, offset, n) -# define os_file_flush(file) os_file_flush_func(file) + +# define os_file_flush(file) os_file_flush_func(file) # define os_file_rename(key, oldpath, newpath) \ os_file_rename_func(oldpath, newpath) @@ -393,6 +487,9 @@ to original un-instrumented file I/O APIs */ # define os_file_delete_if_exists(key, name) \ os_file_delete_if_exists_func(name) +# define os_file_set_eof_at(file, new_len) \ + os_file_set_eof_at_func(file, new_len) + #endif /* UNIV_PFS_IO */ /* File types for directory entry data type */ @@ -530,7 +627,7 @@ A simple function to open or create a file. @return own: handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ UNIV_INTERN -os_file_t +pfs_os_file_t os_file_create_simple_no_error_handling_func( /*=========================================*/ const char* name, /*!< in: name of the file or path as a @@ -565,7 +662,7 @@ Opens an existing file or creates a new. @return own: handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ UNIV_INTERN -os_file_t +pfs_os_file_t os_file_create_func( /*================*/ const char* name, /*!< in: name of the file or path as a @@ -626,6 +723,42 @@ ibool os_file_close_func( /*===============*/ os_file_t file); /*!< in, own: handle to a file */ +/***********************************************************************//** +NOTE! Use the corresponding macro os_file_close(), not directly this +function! +Closes a file handle. In case of error, error number can be retrieved with +os_file_get_last_error. +@return TRUE if success */ +UNIV_INTERN +bool +os_file_close_no_error_handling_func( +/*===============*/ + os_file_t file); /*!< in, own: handle to a file */ + +/***********************************************************************//** +NOTE! Please use the corresponding macro os_file_set_eof_at(), not +directly this function! +Truncates a file at the specified position. +@return TRUE if success */ +UNIV_INTERN +bool +os_file_set_eof_at_func( + os_file_t file, /*!< in: handle to a file */ + ib_uint64_t new_len);/*!< in: new file length */ + +#ifdef HAVE_POSIX_FALLOCATE +/***********************************************************************//** +NOTE! Please use the corresponding macro os_file_allocate(), not +directly this function! +Ensures that disk space is allocated for the file. +@return TRUE if success */ +UNIV_INTERN +bool +os_file_allocate_func( + os_file_t file, /*!< in, own: handle to a file */ + os_offset_t offset, /*!< in: file region offset */ + os_offset_t len); /*!< in: file region length */ +#endif #ifdef UNIV_PFS_IO /****************************************************************//** @@ -636,7 +769,7 @@ os_file_create_simple() which opens or creates a file. @return own: handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ UNIV_INLINE -os_file_t +pfs_os_file_t pfs_os_file_create_simple_func( /*===========================*/ mysql_pfs_key_t key, /*!< in: Performance Schema Key */ @@ -661,7 +794,7 @@ monitor file creation/open. @return own: handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ UNIV_INLINE -os_file_t +pfs_os_file_t pfs_os_file_create_simple_no_error_handling_func( /*=============================================*/ mysql_pfs_key_t key, /*!< in: Performance Schema Key */ @@ -687,7 +820,7 @@ Add instrumentation to monitor file creation/open. @return own: handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ UNIV_INLINE -os_file_t +pfs_os_file_t pfs_os_file_create_func( /*====================*/ mysql_pfs_key_t key, /*!< in: Performance Schema Key */ @@ -718,7 +851,20 @@ UNIV_INLINE ibool pfs_os_file_close_func( /*===================*/ - os_file_t file, /*!< in, own: handle to a file */ + pfs_os_file_t file, /*!< in, own: handle to a file */ + const char* src_file,/*!< in: file name where func invoked */ + ulint src_line);/*!< in: line where the func invoked */ +/***********************************************************************//** +NOTE! Please use the corresponding macro os_file_close_no_error_handling(), +not directly this function! +A performance schema instrumented wrapper function for +os_file_close_no_error_handling(). +@return TRUE if success */ +UNIV_INLINE +bool +pfs_os_file_close_no_error_handling_func( +/*===================*/ + pfs_os_file_t file, /*!< in, own: handle to a file */ const char* src_file,/*!< in: file name where func invoked */ ulint src_line);/*!< in: line where the func invoked */ /*******************************************************************//** @@ -731,7 +877,7 @@ UNIV_INLINE ibool pfs_os_file_read_func( /*==================*/ - os_file_t file, /*!< in: handle to a file */ + pfs_os_file_t file, /*!< in: handle to a file */ void* buf, /*!< in: buffer where to read */ os_offset_t offset, /*!< in: file offset where to read */ ulint n, /*!< in: number of bytes to read */ @@ -750,7 +896,7 @@ UNIV_INLINE ibool pfs_os_file_read_no_error_handling_func( /*====================================*/ - os_file_t file, /*!< in: handle to a file */ + pfs_os_file_t file, /*!< in: handle to a file */ void* buf, /*!< in: buffer where to read */ os_offset_t offset, /*!< in: file offset where to read */ ulint n, /*!< in: number of bytes to read */ @@ -772,7 +918,7 @@ pfs_os_aio_func( ulint mode, /*!< in: OS_AIO_NORMAL etc. I/O mode */ const char* name, /*!< in: name of the file or path as a null-terminated string */ - os_file_t file, /*!< in: handle to a file */ + pfs_os_file_t file, /*!< in: handle to a file */ void* buf, /*!< in: buffer where to read or from which to write */ os_offset_t offset, /*!< in: file offset where to read or write */ @@ -807,7 +953,7 @@ pfs_os_file_write_func( /*===================*/ const char* name, /*!< in: name of the file or path as a null-terminated string */ - os_file_t file, /*!< in: handle to a file */ + pfs_os_file_t file, /*!< in: handle to a file */ const void* buf, /*!< in: buffer from which to write */ os_offset_t offset, /*!< in: file offset where to write */ ulint n, /*!< in: number of bytes to write */ @@ -824,7 +970,7 @@ UNIV_INLINE ibool pfs_os_file_flush_func( /*===================*/ - os_file_t file, /*!< in, own: handle to a file */ + pfs_os_file_t file, /*!< in, own: handle to a file */ const char* src_file,/*!< in: file name where func invoked */ ulint src_line);/*!< in: line where the func invoked */ @@ -876,16 +1022,66 @@ pfs_os_file_delete_if_exists_func( string */ const char* src_file,/*!< in: file name where func invoked */ ulint src_line);/*!< in: line where the func invoked */ + +/***********************************************************************//** +NOTE! Please use the corresponding macro os_file_set_eof_at(), not +directly this function! +This is the performance schema instrumented wrapper function for +os_file_set_eof_at() +@return TRUE if success */ +UNIV_INLINE +bool +pfs_os_file_set_eof_at_func( + pfs_os_file_t file, /*!< in: handle to a file */ + ib_uint64_t new_len,/*!< in: new file length */ + const char* src_file,/*!< in: file name where func invoked */ + ulint src_line);/*!< in: line where the func invoked */ + +#ifdef HAVE_POSIX_FALLOCATE +/***********************************************************************//** +NOTE! Please use the corresponding macro os_file_allocate(), not +directly this function! +Ensures that disk space is allocated for the file. +@return TRUE if success */ +UNIV_INLINE +bool +pfs_os_file_allocate_func( + pfs_os_file_t file, /*!< in, own: handle to a file */ + os_offset_t offset, /*!< in: file region offset */ + os_offset_t len, /*!< in: file region length */ + const char* src_file,/*!< in: file name where func invoked */ + ulint src_line);/*!< in: line where the func invoked */ +#endif + #endif /* UNIV_PFS_IO */ /***********************************************************************//** -Closes a file handle. -@return TRUE if success */ +Checks if the file is marked as invalid. +@return TRUE if invalid */ UNIV_INTERN -ibool -os_file_close_no_error_handling( -/*============================*/ - os_file_t file); /*!< in, own: handle to a file */ +bool +os_file_is_invalid( + pfs_os_file_t file); /*!< in, own: handle to a file */ + +/***********************************************************************//** +Marks the file as invalid. */ +UNIV_INTERN +void +os_file_mark_invalid( + pfs_os_file_t* file); /*!< out: pointer to a handle to a file */ + +/***********************************************************************//** +Announces an intention to access file data in a specific pattern in the +future. +@return TRUE if success */ +UNIV_INTERN +bool +os_file_advise( + pfs_os_file_t file, /*!< in, own: handle to a file */ + os_offset_t offset, /*!< in: file region offset */ + os_offset_t len, /*!< in: file region length */ + ulint advice);/*!< in: advice for access pattern */ + /***********************************************************************//** Gets a file size. @return file size, or (os_offset_t) -1 on failure */ @@ -893,7 +1089,7 @@ UNIV_INTERN os_offset_t os_file_get_size( /*=============*/ - os_file_t file) /*!< in: handle to a file */ + pfs_os_file_t file) /*!< in: handle to a file */ MY_ATTRIBUTE((warn_unused_result)); /** Set the size of a newly created file. @param[in] name file name @@ -905,7 +1101,7 @@ UNIV_INTERN bool os_file_set_size( const char* name, - os_file_t file, + pfs_os_file_t file, os_offset_t size, bool is_sparse = false) MY_ATTRIBUTE((nonnull, warn_unused_result)); @@ -918,14 +1114,6 @@ os_file_set_eof( /*============*/ FILE* file); /*!< in: file to be truncated */ /***********************************************************************//** -Truncates a file at the specified position. -@return TRUE if success */ -UNIV_INTERN -ibool -os_file_set_eof_at( - os_file_t file, /*!< in: handle to a file */ - ib_uint64_t new_len);/*!< in: new file length */ -/***********************************************************************//** NOTE! Use the corresponding macro os_file_flush(), not directly this function! Flushes the write buffers of a given file to the disk. @return TRUE if success */ @@ -1155,7 +1343,7 @@ os_aio_func( caution! */ const char* name, /*!< in: name of the file or path as a null-terminated string */ - os_file_t file, /*!< in: handle to a file */ + pfs_os_file_t file, /*!< in: handle to a file */ void* buf, /*!< in: buffer where to read or from which to write */ os_offset_t offset, /*!< in: file offset where to read or write */ diff --git a/storage/xtradb/include/os0file.ic b/storage/xtradb/include/os0file.ic index b284d7ea9ac..72ac9d9dd6a 100644 --- a/storage/xtradb/include/os0file.ic +++ b/storage/xtradb/include/os0file.ic @@ -1,7 +1,7 @@ /***************************************************************************** -Copyright (c) 2010, 2011, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, SkySQL Ab. All Rights Reserved. +Copyright (c) 2010, 2017, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2013, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -35,7 +35,7 @@ os_file_create_simple() which opens or creates a file. @return own: handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ UNIV_INLINE -os_file_t +pfs_os_file_t pfs_os_file_create_simple_func( /*===========================*/ mysql_pfs_key_t key, /*!< in: Performance Schema Key */ @@ -50,7 +50,7 @@ pfs_os_file_create_simple_func( const char* src_file,/*!< in: file name where func invoked */ ulint src_line)/*!< in: line where the func invoked */ { - os_file_t file; + pfs_os_file_t file; struct PSI_file_locker* locker = NULL; PSI_file_locker_state state; @@ -64,8 +64,9 @@ pfs_os_file_create_simple_func( file = os_file_create_simple_func(name, create_mode, access_type, success, atomic_writes); - /* Regsiter the returning "file" value with the system */ - register_pfs_file_open_end(locker, file); + /* Register psi value for the file */ + register_pfs_file_open_end(locker, file, + (*success == TRUE ? success : 0)); return(file); } @@ -79,7 +80,7 @@ monitor file creation/open. @return own: handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ UNIV_INLINE -os_file_t +pfs_os_file_t pfs_os_file_create_simple_no_error_handling_func( /*=============================================*/ mysql_pfs_key_t key, /*!< in: Performance Schema Key */ @@ -96,7 +97,7 @@ pfs_os_file_create_simple_no_error_handling_func( const char* src_file,/*!< in: file name where func invoked */ ulint src_line)/*!< in: line where the func invoked */ { - os_file_t file; + pfs_os_file_t file; struct PSI_file_locker* locker = NULL; PSI_file_locker_state state; @@ -108,9 +109,10 @@ pfs_os_file_create_simple_no_error_handling_func( name, src_file, src_line); file = os_file_create_simple_no_error_handling_func( - name, create_mode, access_type, success, atomic_writes); + name, create_mode, access_type, success, atomic_writes); - register_pfs_file_open_end(locker, file); + register_pfs_file_open_end(locker, file, + (*success == TRUE ? success : 0)); return(file); } @@ -123,7 +125,7 @@ Add instrumentation to monitor file creation/open. @return own: handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ UNIV_INLINE -os_file_t +pfs_os_file_t pfs_os_file_create_func( /*====================*/ mysql_pfs_key_t key, /*!< in: Performance Schema Key */ @@ -144,7 +146,7 @@ pfs_os_file_create_func( const char* src_file,/*!< in: file name where func invoked */ ulint src_line)/*!< in: line where the func invoked */ { - os_file_t file; + pfs_os_file_t file; struct PSI_file_locker* locker = NULL; PSI_file_locker_state state; @@ -158,7 +160,8 @@ pfs_os_file_create_func( file = os_file_create_func(name, create_mode, purpose, type, success, atomic_writes); - register_pfs_file_open_end(locker, file); + register_pfs_file_open_end(locker, file, + (*success == TRUE ? success : 0)); return(file); } @@ -172,7 +175,7 @@ UNIV_INLINE ibool pfs_os_file_close_func( /*===================*/ - os_file_t file, /*!< in, own: handle to a file */ + pfs_os_file_t file, /*!< in, own: handle to a file */ const char* src_file,/*!< in: file name where func invoked */ ulint src_line)/*!< in: line where the func invoked */ { @@ -190,6 +193,34 @@ pfs_os_file_close_func( return(result); } +/***********************************************************************//** +NOTE! Please use the corresponding macro os_file_close_no_error_handling(), +not directly this function! +A performance schema instrumented wrapper function for +os_file_close_no_error_handling(). +@return TRUE if success */ +UNIV_INLINE +bool +pfs_os_file_close_no_error_handling_func( +/*===================*/ + pfs_os_file_t file, /*!< in, own: handle to a file */ + const char* src_file,/*!< in: file name where func invoked */ + ulint src_line)/*!< in: line where the func invoked */ +{ + bool result; + struct PSI_file_locker* locker = NULL; + PSI_file_locker_state state; + + /* register the file close */ + register_pfs_file_io_begin(&state, locker, file, 0, PSI_FILE_CLOSE, + src_file, src_line); + + result = os_file_close_no_error_handling_func(file); + + register_pfs_file_io_end(locker, 0); + + return(result); +} /*******************************************************************//** NOTE! Please use the corresponding macro os_aio(), not directly this @@ -206,7 +237,7 @@ pfs_os_aio_func( ulint mode, /*!< in: OS_AIO_NORMAL etc. I/O mode */ const char* name, /*!< in: name of the file or path as a null-terminated string */ - os_file_t file, /*!< in: handle to a file */ + pfs_os_file_t file, /*!< in: handle to a file */ void* buf, /*!< in: buffer where to read or from which to write */ os_offset_t offset, /*!< in: file offset where to read or write */ @@ -260,7 +291,7 @@ UNIV_INLINE ibool pfs_os_file_read_func( /*==================*/ - os_file_t file, /*!< in: handle to a file */ + pfs_os_file_t file, /*!< in: handle to a file */ void* buf, /*!< in: buffer where to read */ os_offset_t offset, /*!< in: file offset where to read */ ulint n, /*!< in: number of bytes to read */ @@ -294,7 +325,7 @@ UNIV_INLINE ibool pfs_os_file_read_no_error_handling_func( /*====================================*/ - os_file_t file, /*!< in: handle to a file */ + pfs_os_file_t file, /*!< in: handle to a file */ void* buf, /*!< in: buffer where to read */ os_offset_t offset, /*!< in: file offset where to read */ ulint n, /*!< in: number of bytes to read */ @@ -315,6 +346,42 @@ pfs_os_file_read_no_error_handling_func( return(result); } +/** NOTE! Please use the corresponding macro +os_file_read_no_error_handling_int_fd(), not directly this function! +This is the performance schema instrumented wrapper function for +os_file_read_no_error_handling_int_fd_func() which requests a +synchronous read operation. +@return TRUE if request was successful, FALSE if fail */ +UNIV_INLINE +ibool +pfs_os_file_read_no_error_handling_int_fd_func( + int file, /*!< in: handle to a file */ + void* buf, /*!< in: buffer where to read */ + os_offset_t offset, /*!< in: file offset where to read */ + ulint n, /*!< in: number of bytes to read */ + const char* src_file,/*!< in: file name where func invoked */ + ulint src_line)/*!< in: line where the func invoked */ +{ + PSI_file_locker_state state; + struct PSI_file_locker* locker; + + locker = PSI_FILE_CALL(get_thread_file_descriptor_locker)( + &state, file, PSI_FILE_READ); + if (locker != NULL) { + PSI_FILE_CALL(start_file_wait)( + locker, n, + __FILE__, __LINE__); + } + ibool result = os_file_read_no_error_handling_func( + OS_FILE_FROM_FD(file), buf, offset, n); + + if (locker != NULL) { + PSI_FILE_CALL(end_file_wait)(locker, n); + } + + return(result); +} + /*******************************************************************//** NOTE! Please use the corresponding macro os_file_write(), not directly this function! @@ -327,7 +394,7 @@ pfs_os_file_write_func( /*===================*/ const char* name, /*!< in: name of the file or path as a null-terminated string */ - os_file_t file, /*!< in: handle to a file */ + pfs_os_file_t file, /*!< in: handle to a file */ const void* buf, /*!< in: buffer from which to write */ os_offset_t offset, /*!< in: file offset where to write */ ulint n, /*!< in: number of bytes to write */ @@ -348,6 +415,43 @@ pfs_os_file_write_func( return(result); } +/** NOTE! Please use the corresponding macro os_file_write(), not +directly this function! +This is the performance schema instrumented wrapper function for +os_file_write() which requests a synchronous write operation. +@return TRUE if request was successful, FALSE if fail */ +UNIV_INLINE +ibool +pfs_os_file_write_int_fd_func( + const char* name, /*!< in: name of the file or path as a + null-terminated string */ + int file, /*!< in: handle to a file */ + const void* buf, /*!< in: buffer from which to write */ + os_offset_t offset, /*!< in: file offset where to write */ + ulint n, /*!< in: number of bytes to write */ + const char* src_file,/*!< in: file name where func invoked */ + ulint src_line)/*!< in: line where the func invoked */ +{ + PSI_file_locker_state state; + struct PSI_file_locker* locker = NULL; + + locker = PSI_FILE_CALL(get_thread_file_descriptor_locker)( + &state, file, PSI_FILE_WRITE); + if (locker != NULL) { + PSI_FILE_CALL(start_file_wait)( + locker, n, + __FILE__, __LINE__); + } + ibool result = os_file_write_func( + name, OS_FILE_FROM_FD(file), buf, offset, n); + + if (locker != NULL) { + PSI_FILE_CALL(end_file_wait)(locker, n); + } + + return(result); +} + /***********************************************************************//** NOTE! Please use the corresponding macro os_file_flush(), not directly this function! @@ -358,7 +462,7 @@ UNIV_INLINE ibool pfs_os_file_flush_func( /*===================*/ - os_file_t file, /*!< in, own: handle to a file */ + pfs_os_file_t file, /*!< in, own: handle to a file */ const char* src_file,/*!< in: file name where func invoked */ ulint src_line)/*!< in: line where the func invoked */ { @@ -396,12 +500,12 @@ pfs_os_file_rename_func( struct PSI_file_locker* locker = NULL; PSI_file_locker_state state; - register_pfs_file_open_begin(&state, locker, key, PSI_FILE_RENAME, newpath, + register_pfs_file_rename_begin(&state, locker, key, PSI_FILE_RENAME, newpath, src_file, src_line); result = os_file_rename_func(oldpath, newpath); - register_pfs_file_open_end(locker, 0); + register_pfs_file_rename_end(locker, 0); return(result); } @@ -465,4 +569,61 @@ pfs_os_file_delete_if_exists_func( return(result); } + +/***********************************************************************//** +NOTE! Please use the corresponding macro os_file_set_eof_at(), not +directly this function! +This is the performance schema instrumented wrapper function for +os_file_set_eof_at() +@return TRUE if success */ +UNIV_INLINE +bool +pfs_os_file_set_eof_at_func( + pfs_os_file_t file, /*!< in: handle to a file */ + ib_uint64_t new_len,/*!< in: new file length */ + const char* src_file,/*!< in: file name where func invoked */ + ulint src_line)/*!< in: line where the func invoked */ +{ + bool result; + struct PSI_file_locker* locker = NULL; + PSI_file_locker_state state; + + register_pfs_file_io_begin(&state, locker, file, 0, PSI_FILE_CHSIZE, + src_file, src_line); + result = os_file_set_eof_at_func(file, new_len); + + register_pfs_file_io_end(locker, 0); + + return(result); +} + +#ifdef HAVE_POSIX_FALLOCATE +/***********************************************************************//** +NOTE! Please use the corresponding macro os_file_allocate(), not +directly this function! +Ensures that disk space is allocated for the file. +@return TRUE if success */ +UNIV_INLINE +bool +pfs_os_file_allocate_func( + pfs_os_file_t file, /*!< in, own: handle to a file */ + os_offset_t offset, /*!< in: file region offset */ + os_offset_t len, /*!< in: file region length */ + const char* src_file,/*!< in: file name where func invoked */ + ulint src_line)/*!< in: line where the func invoked */ +{ + bool result; + struct PSI_file_locker* locker = NULL; + PSI_file_locker_state state; + + register_pfs_file_io_begin(&state, locker, file, 0, PSI_FILE_CHSIZE, + src_file, src_line); + result = os_file_allocate_func(file, offset, len); + + register_pfs_file_io_end(locker, 0); + + return(result); +} +#endif + #endif /* UNIV_PFS_IO */ diff --git a/storage/xtradb/include/os0sync.h b/storage/xtradb/include/os0sync.h index 48c56a73369..ce03f6a2124 100644 --- a/storage/xtradb/include/os0sync.h +++ b/storage/xtradb/include/os0sync.h @@ -2,6 +2,7 @@ Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, Google Inc. +Copyright (c) 2017, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -38,12 +39,11 @@ Created 9/6/1995 Heikki Tuuri #include "ut0lst.h" #include "sync0types.h" -#if defined __i386__ || defined __x86_64__ || defined _M_IX86 \ - || defined _M_X64 || defined __WIN__ - -#define IB_STRONG_MEMORY_MODEL - -#endif /* __i386__ || __x86_64__ || _M_IX86 || _M_X64 || __WIN__ */ +#ifdef CPU_LEVEL1_DCACHE_LINESIZE +# define CACHE_LINE_SIZE CPU_LEVEL1_DCACHE_LINESIZE +#else +# error CPU_LEVEL1_DCACHE_LINESIZE is undefined +#endif /* CPU_LEVEL1_DCACHE_LINESIZE */ #ifdef HAVE_WINDOWS_ATOMICS typedef LONG lock_word_t; /*!< On Windows, InterlockedExchange operates @@ -940,6 +940,58 @@ for synchronization */ "Memory barrier is not used" #endif + +/** Simple counter aligned to CACHE_LINE_SIZE +@tparam Type the integer type of the counter +@tparam atomic whether to use atomic memory access */ +template +struct MY_ALIGNED(CACHE_LINE_SIZE) simple_counter +{ + /** Increment the counter */ + Type inc() { return add(1); } + /** Decrement the counter */ + Type dec() { return sub(1); } + + /** Add to the counter + @param[in] i amount to be added + @return the value of the counter after adding */ + Type add(Type i) + { + compile_time_assert(!atomic || sizeof(Type) == sizeof(ulint)); + if (atomic) { + /* GCC would perform a type check in this code + also in case the template is instantiated with + simple_counter. + On Solaris, os_atomic_increment_ulint() maps + to atomic_add_long_nv(), which expects the + parameter to be correctly typed. */ + return os_atomic_increment_ulint( + reinterpret_cast(&m_counter), i); + } else { + return m_counter += i; + } + } + /** Subtract from the counter + @param[in] i amount to be subtracted + @return the value of the counter after adding */ + Type sub(Type i) + { + compile_time_assert(!atomic || sizeof(Type) == sizeof(ulint)); + if (atomic) { + return os_atomic_decrement_ulint(&m_counter, i); + } else { + return m_counter -= i; + } + } + + /** @return the value of the counter (non-atomic access)! */ + operator Type() const { return m_counter; } + +private: + /** The counter */ + Type m_counter; +}; + #ifndef UNIV_NONINL #include "os0sync.ic" #endif diff --git a/storage/xtradb/include/page0page.ic b/storage/xtradb/include/page0page.ic index 364536b86f8..b37715b53be 100644 --- a/storage/xtradb/include/page0page.ic +++ b/storage/xtradb/include/page0page.ic @@ -771,7 +771,7 @@ page_rec_get_next_low( (void*) rec, (ulong) page_get_space_id(page), (ulong) page_get_page_no(page)); - buf_page_print(page, 0, 0); + buf_page_print(page, 0); ut_error; } else if (offs == 0) { diff --git a/storage/xtradb/include/page0zip.ic b/storage/xtradb/include/page0zip.ic index 6c7d8cd32c7..3fa8a08c4f9 100644 --- a/storage/xtradb/include/page0zip.ic +++ b/storage/xtradb/include/page0zip.ic @@ -2,6 +2,7 @@ Copyright (c) 2005, 2013, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -172,12 +173,14 @@ page_zip_rec_needs_ext( ignored if zip_size == 0 */ ulint zip_size) /*!< in: compressed page size in bytes, or 0 */ { - ut_ad(rec_size > comp ? REC_N_NEW_EXTRA_BYTES : REC_N_OLD_EXTRA_BYTES); + ut_ad(rec_size + > ulint(comp ? REC_N_NEW_EXTRA_BYTES : REC_N_OLD_EXTRA_BYTES)); ut_ad(ut_is_2pow(zip_size)); ut_ad(comp || !zip_size); -#if UNIV_PAGE_SIZE_MAX > REC_MAX_DATA_SIZE - if (rec_size >= REC_MAX_DATA_SIZE) { +#if UNIV_PAGE_SIZE_MAX > COMPRESSED_REC_MAX_DATA_SIZE + if (comp ? rec_size >= COMPRESSED_REC_MAX_DATA_SIZE : + rec_size >= REDUNDANT_REC_MAX_DATA_SIZE) { return(TRUE); } #endif diff --git a/storage/xtradb/include/rem0rec.h b/storage/xtradb/include/rem0rec.h index 9baf0ab380a..afc191e632d 100644 --- a/storage/xtradb/include/rem0rec.h +++ b/storage/xtradb/include/rem0rec.h @@ -976,9 +976,15 @@ are given in one byte (resp. two byte) format. */ #define REC_1BYTE_OFFS_LIMIT 0x7FUL #define REC_2BYTE_OFFS_LIMIT 0x7FFFUL -/* The data size of record must be smaller than this because we reserve -two upmost bits in a two byte offset for special purposes */ -#define REC_MAX_DATA_SIZE (16384) +/* The data size of record must not be larger than this on +REDUNDANT row format because we reserve two upmost bits in a +two byte offset for special purposes */ +#define REDUNDANT_REC_MAX_DATA_SIZE (16383) + +/* The data size of record must be smaller than this on +COMPRESSED row format because we reserve two upmost bits in a +two byte offset for special purposes */ +#define COMPRESSED_REC_MAX_DATA_SIZE (16384) #ifdef WITH_WSREP int wsrep_rec_get_foreign_key( diff --git a/storage/xtradb/include/row0ftsort.h b/storage/xtradb/include/row0ftsort.h index 7c9ed23645c..b2dd90e7e3b 100644 --- a/storage/xtradb/include/row0ftsort.h +++ b/storage/xtradb/include/row0ftsort.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2010, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2016, MariaDB Corporation. +Copyright (c) 2016, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -72,7 +72,6 @@ struct fts_psort_common_t { store Doc ID during sort, if Doc ID will not be big enough to use 8 bytes value */ - fil_space_crypt_t* crypt_data; /*!< crypt data or NULL */ }; struct fts_psort_t { diff --git a/storage/xtradb/include/row0merge.h b/storage/xtradb/include/row0merge.h index 04d4010ad48..152a51dafc6 100644 --- a/storage/xtradb/include/row0merge.h +++ b/storage/xtradb/include/row0merge.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2005, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2015, 2016, MariaDB Corporation. +Copyright (c) 2015, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -41,9 +41,6 @@ Created 13/06/2005 Jan Lindstrom #include "lock0types.h" #include "srv0srv.h" -/* Reserve free space from every block for key_version */ -#define ROW_MERGE_RESERVE_SIZE 4 - /* Cluster index read task is mandatory */ #define COST_READ_CLUSTERED_INDEX 1.0 @@ -352,17 +349,16 @@ row_merge_buf_sort( Write a merge block to the file system. @return TRUE if request was successful, FALSE if fail */ UNIV_INTERN -ibool +bool row_merge_write( /*============*/ int fd, /*!< in: file descriptor */ ulint offset, /*!< in: offset where to write, in number of row_merge_block_t elements */ const void* buf, /*!< in: data */ - fil_space_crypt_t* crypt_data, /*!< in: table crypt data */ void* crypt_buf, /*!< in: crypt buf or NULL */ - ulint space); /*!< in: space id */ - + ulint space) /*!< in: space id */ + MY_ATTRIBUTE((warn_unused_result)); /********************************************************************//** Empty a sort buffer. @return sort buffer */ @@ -400,10 +396,9 @@ row_merge_sort( const bool update_progress, /*!< in: update progress status variable or not */ const float pct_progress, /*!< in: total progress percent until now */ const float pct_cost, /*!< in: current progress percent */ - fil_space_crypt_t* crypt_data,/*!< in: table crypt data */ row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */ - ulint space) /*!< in: space id */ - __attribute__((nonnull(1,2,3,4,5))); + ulint space) /*!< in: space id */ + MY_ATTRIBUTE((warn_unused_result)); /*********************************************************************//** Allocate a sort buffer. @return own: sort buffer */ @@ -433,7 +428,7 @@ row_merge_file_destroy( Read a merge block from the file system. @return TRUE if request was successful, FALSE if fail */ UNIV_INTERN -ibool +bool row_merge_read( /*===========*/ int fd, /*!< in: file descriptor */ @@ -441,10 +436,9 @@ row_merge_read( in number of row_merge_block_t elements */ row_merge_block_t* buf, /*!< out: data */ - fil_space_crypt_t* crypt_data,/*!< in: table crypt data */ row_merge_block_t* crypt_buf, /*!< in: crypt buf or NULL */ - ulint space); /*!< in: space id */ - + ulint space) /*!< in: space id */ + MY_ATTRIBUTE((warn_unused_result)); /********************************************************************//** Read a merge record. @return pointer to next record, or NULL on I/O error or end of list */ @@ -462,8 +456,8 @@ row_merge_read_rec( or NULL on end of list (non-NULL on I/O error) */ ulint* offsets,/*!< out: offsets of mrec */ - fil_space_crypt_t* crypt_data,/*!< in: table crypt data */ row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */ - ulint space) /*!< in: space id */ - __attribute__((nonnull(1,2,3,4,6,7,8), warn_unused_result)); + ulint space) /*!< in: space id */ + MY_ATTRIBUTE((warn_unused_result)); + #endif /* row0merge.h */ diff --git a/storage/xtradb/include/row0mysql.h b/storage/xtradb/include/row0mysql.h index 2bd17980896..a8503a5cfda 100644 --- a/storage/xtradb/include/row0mysql.h +++ b/storage/xtradb/include/row0mysql.h @@ -614,7 +614,7 @@ struct mysql_row_templ_t { Innobase record in the current index; not defined if template_type is ROW_MYSQL_WHOLE_ROW */ - ibool rec_field_is_prefix; /* is this field in a prefix index? */ + bool rec_field_is_prefix; /* is this field in a prefix index? */ ulint rec_prefix_field_no; /* record field, even if just a prefix; same as rec_field_no when not a prefix, otherwise rec_field_no is diff --git a/storage/xtradb/include/srv0srv.h b/storage/xtradb/include/srv0srv.h index c18bc7c1fc3..0e76340cdbd 100644 --- a/storage/xtradb/include/srv0srv.h +++ b/storage/xtradb/include/srv0srv.h @@ -1,9 +1,9 @@ /***************************************************************************** -Copyright (c) 1995, 2016, Oracle and/or its affiliates. All rights reserved. +Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved. Copyright (c) 2008, 2009, Google Inc. Copyright (c) 2009, Percona Inc. -Copyright (c) 2013, 2017, MariaDB Corporation Ab. All Rights Reserved. +Copyright (c) 2013, 2017, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -55,11 +55,10 @@ Created 10/10/1995 Heikki Tuuri /* Global counters used inside InnoDB. */ struct srv_stats_t { - typedef ib_counter_t lsn_ctr_1_t; - typedef ib_counter_t ulint_ctr_1_t; - typedef ib_counter_t lint_ctr_1_t; typedef ib_counter_t ulint_ctr_64_t; - typedef ib_counter_t ib_int64_ctr_1_t; + typedef simple_counter lsn_ctr_1_t; + typedef simple_counter ulint_ctr_1_t; + typedef simple_counter ib_int64_ctr_1_t; /** Count the amount of data written in total (in bytes) */ ulint_ctr_1_t data_written; @@ -73,8 +72,9 @@ struct srv_stats_t { /** Amount of data written to the log files in bytes */ lsn_ctr_1_t os_log_written; - /** Number of writes being done to the log files */ - lint_ctr_1_t os_log_pending_writes; + /** Number of writes being done to the log files. + Protected by log_sys->write_mutex. */ + ulint_ctr_1_t os_log_pending_writes; /** We increase this counter, when we don't have enough space in the log buffer and have to flush it */ @@ -137,6 +137,14 @@ struct srv_stats_t { ulint_ctr_64_t pages_encrypted; /* Number of pages decrypted */ ulint_ctr_64_t pages_decrypted; + /* Number of merge blocks encrypted */ + ulint_ctr_64_t n_merge_blocks_encrypted; + /* Number of merge blocks decrypted */ + ulint_ctr_64_t n_merge_blocks_decrypted; + /* Number of row log blocks encrypted */ + ulint_ctr_64_t n_rowlog_blocks_encrypted; + /* Number of row log blocks decrypted */ + ulint_ctr_64_t n_rowlog_blocks_decrypted; /** Number of data read in total (in bytes) */ ulint_ctr_1_t data_read; @@ -148,7 +156,7 @@ struct srv_stats_t { ulint_ctr_1_t n_lock_wait_count; /** Number of threads currently waiting on database locks */ - lint_ctr_1_t n_lock_wait_current_count; + simple_counter n_lock_wait_current_count; /** Number of rows read. */ ulint_ctr_64_t n_rows_read; @@ -496,7 +504,9 @@ as enum type because the configure option takes unsigned integer type. */ extern ulong srv_innodb_stats_method; #ifdef UNIV_LOG_ARCHIVE -extern ibool srv_log_archive_on; +extern bool srv_log_archive_on; +extern bool srv_archive_recovery; +extern ib_uint64_t srv_archive_recovery_limit_lsn; #endif /* UNIV_LOG_ARCHIVE */ extern char* srv_file_flush_method_str; @@ -547,6 +557,14 @@ extern ulong srv_pass_corrupt_table; extern ulong srv_log_checksum_algorithm; +extern bool srv_apply_log_only; + +extern bool srv_backup_mode; +extern bool srv_close_files; +extern bool srv_xtrabackup; + +#define IS_XTRABACKUP() (srv_xtrabackup) + extern my_bool srv_force_primary_key; /* Helper macro to support srv_pass_corrupt_table checks. If 'cond' is FALSE, @@ -1086,6 +1104,13 @@ UNIV_INTERN void srv_purge_wakeup(); +/** Check whether given space id is undo tablespace id +@param[in] space_id space id to check +@return true if it is undo tablespace else false. */ +bool +srv_is_undo_tablespace( + ulint space_id); + /** Status variables to be passed to MySQL */ struct export_var_t{ ulint innodb_adaptive_hash_hash_searches; @@ -1256,6 +1281,15 @@ struct export_var_t{ ib_int64_t innodb_pages_decrypted; /*!< Number of pages decrypted */ + /*!< Number of merge blocks encrypted */ + ib_int64_t innodb_n_merge_blocks_encrypted; + /*!< Number of merge blocks decrypted */ + ib_int64_t innodb_n_merge_blocks_decrypted; + /*!< Number of row log blocks encrypted */ + ib_int64_t innodb_n_rowlog_blocks_encrypted; + /*!< Number of row log blocks decrypted */ + ib_int64_t innodb_n_rowlog_blocks_decrypted; + ulint innodb_sec_rec_cluster_reads; /*!< srv_sec_rec_cluster_reads */ ulint innodb_sec_rec_cluster_reads_avoided;/*!< srv_sec_rec_cluster_reads_avoided */ diff --git a/storage/xtradb/include/srv0start.h b/storage/xtradb/include/srv0start.h index 963b767f0fb..b055a9d834f 100644 --- a/storage/xtradb/include/srv0start.h +++ b/storage/xtradb/include/srv0start.h @@ -1,6 +1,7 @@ /***************************************************************************** -Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -75,22 +76,12 @@ are not found and the user wants. @return DB_SUCCESS or error code */ UNIV_INTERN dberr_t -innobase_start_or_create_for_mysql(void); -/*====================================*/ -/****************************************************************//** -Shuts down the Innobase database. -@return DB_SUCCESS or error code */ -UNIV_INTERN -dberr_t -innobase_shutdown_for_mysql(void); +innobase_start_or_create_for_mysql(); -/******************************************************************** -Signal all per-table background threads to shutdown, and wait for them to do -so. */ +/** Shut down InnoDB. */ UNIV_INTERN void -srv_shutdown_table_bg_threads(void); -/*=============================*/ +innodb_shutdown(); /*************************************************************//** Copy the file path component of the physical file to parameter. It will @@ -139,6 +130,8 @@ extern ibool srv_startup_is_before_trx_rollback_phase; /** TRUE if a raw partition is in use */ extern ibool srv_start_raw_disk_in_use; +/** Undo tablespaces starts with space_id. */ +extern ulint srv_undo_space_id_start; /** Shutdown state */ enum srv_shutdown_state { @@ -156,6 +149,9 @@ enum srv_shutdown_state { SRV_SHUTDOWN_EXIT_THREADS/*!< Exit all threads */ }; +/** Whether any undo log records can be generated */ +extern bool srv_undo_sources; + /** At a shutdown this value climbs from SRV_SHUTDOWN_NONE to SRV_SHUTDOWN_CLEANUP and then to SRV_SHUTDOWN_LAST_PHASE, and so on */ extern enum srv_shutdown_state srv_shutdown_state; diff --git a/storage/xtradb/include/trx0rec.h b/storage/xtradb/include/trx0rec.h index 359937e3583..a6e202d04e4 100644 --- a/storage/xtradb/include/trx0rec.h +++ b/storage/xtradb/include/trx0rec.h @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -212,10 +213,6 @@ UNIV_INTERN dberr_t trx_undo_report_row_operation( /*==========================*/ - ulint flags, /*!< in: if BTR_NO_UNDO_LOG_FLAG bit is - set, does nothing */ - ulint op_type, /*!< in: TRX_UNDO_INSERT_OP or - TRX_UNDO_MODIFY_OP */ que_thr_t* thr, /*!< in: query thread */ dict_index_t* index, /*!< in: clustered index */ const dtuple_t* clust_entry, /*!< in: in the case of an insert, @@ -233,7 +230,7 @@ trx_undo_report_row_operation( inserted undo log record, 0 if BTR_NO_UNDO_LOG flag was specified */ - MY_ATTRIBUTE((nonnull(3,4,10), warn_unused_result)); + MY_ATTRIBUTE((nonnull(1,2,8), warn_unused_result)); /******************************************************************//** Copies an undo record to heap. This function can be called if we know that the undo log record exists. @@ -313,10 +310,6 @@ record */ storage fields: used by purge to free the external storage */ -/* Operation type flags used in trx_undo_report_row_operation */ -#define TRX_UNDO_INSERT_OP 1 -#define TRX_UNDO_MODIFY_OP 2 - #ifndef UNIV_NONINL #include "trx0rec.ic" #endif diff --git a/storage/xtradb/include/trx0rseg.h b/storage/xtradb/include/trx0rseg.h index b9c84ef2b06..e2853df7045 100644 --- a/storage/xtradb/include/trx0rseg.h +++ b/storage/xtradb/include/trx0rseg.h @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -124,13 +125,13 @@ trx_rseg_mem_free( /*==============*/ trx_rseg_t* rseg); /*!< in, own: instance to free */ -/********************************************************************* -Creates a rollback segment. */ +/** Create a rollback segment. +@param[in] space undo tablespace ID +@return pointer to new rollback segment +@retval NULL on failure */ UNIV_INTERN trx_rseg_t* -trx_rseg_create( -/*============*/ - ulint space); /*!< in: id of UNDO tablespace */ +trx_rseg_create(ulint space); /******************************************************************** Get the number of unique rollback tablespaces in use except space id 0. diff --git a/storage/xtradb/include/trx0sys.h b/storage/xtradb/include/trx0sys.h index 0c18b657fd7..859adef0f0f 100644 --- a/storage/xtradb/include/trx0sys.h +++ b/storage/xtradb/include/trx0sys.h @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -328,19 +329,29 @@ UNIV_INTERN void trx_sys_print_mysql_binlog_offset(void); /*===================================*/ + #ifdef WITH_WSREP -/** Update WSREP checkpoint XID in sys header. */ + +/** Update WSREP XID info in sys_header of TRX_SYS_PAGE_NO = 5. +@param[in] xid Transaction XID +@param[in,out] sys_header sys_header +@param[in] mtr minitransaction */ +UNIV_INTERN void trx_sys_update_wsrep_checkpoint( - const XID* xid, /*!< in: WSREP XID */ - trx_sysf_t* sys_header, /*!< in: sys_header */ - mtr_t* mtr); /*!< in: mtr */ + const XID* xid, + trx_sysf_t* sys_header, + mtr_t* mtr); -void -/** Read WSREP checkpoint XID from sys header. */ +/** Read WSREP checkpoint XID from sys header. +@param[out] xid Transaction XID +@return true on success, false on error. */ +UNIV_INTERN +bool trx_sys_read_wsrep_checkpoint( XID* xid); /*!< out: WSREP XID */ #endif /* WITH_WSREP */ + /*****************************************************************//** Prints to stderr the MySQL master log offset info in the trx system header if the magic number shows it valid. */ @@ -569,13 +580,71 @@ this contains the same fields as TRX_SYS_MYSQL_LOG_INFO below */ within that file */ #define TRX_SYS_MYSQL_LOG_NAME 12 /*!< MySQL log file name */ +/** Memory map TRX_SYS_PAGE_NO = 5 when UNIV_PAGE_SIZE = 4096 + +0...37 FIL_HEADER +38...45 TRX_SYS_TRX_ID_STORE +46...55 TRX_SYS_FSEG_HEADER (FSEG_HEADER_SIZE == 10) +56 TRX_SYS_RSEGS + 56...59 TRX_SYS_RSEG_SPACE for slot 0 + 60...63 TRX_SYS_RSEG_PAGE_NO for slot 0 + 64...67 TRX_SYS_RSEG_SPACE for slot 1 + 68...71 TRX_SYS_RSEG_PAGE_NO for slot 1 +.... + 594..597 TRX_SYS_RSEG_SPACE for slot 72 + 598..601 TRX_SYS_RSEG_PAGE_NO for slot 72 +... + ...1063 TRX_SYS_RSEG_PAGE_NO for slot 126 + +(UNIV_PAGE_SIZE-3500 WSREP ::: FAIL would overwrite undo tablespace +space_id, page_no pairs :::) +596 TRX_SYS_WSREP_XID_INFO TRX_SYS_WSREP_XID_MAGIC_N_FLD +600 TRX_SYS_WSREP_XID_FORMAT +604 TRX_SYS_WSREP_XID_GTRID_LEN +608 TRX_SYS_WSREP_XID_BQUAL_LEN +612 TRX_SYS_WSREP_XID_DATA (len = 128) +739 TRX_SYS_WSREP_XID_DATA_END + +FIXED WSREP XID info offsets for 4k page size 10.0.32-galera +(UNIV_PAGE_SIZE-2500) +1596 TRX_SYS_WSREP_XID_INFO TRX_SYS_WSREP_XID_MAGIC_N_FLD +1600 TRX_SYS_WSREP_XID_FORMAT +1604 TRX_SYS_WSREP_XID_GTRID_LEN +1608 TRX_SYS_WSREP_XID_BQUAL_LEN +1612 TRX_SYS_WSREP_XID_DATA (len = 128) +1739 TRX_SYS_WSREP_XID_DATA_END + +(UNIV_PAGE_SIZE - 2000 MYSQL MASTER LOG) +2096 TRX_SYS_MYSQL_MASTER_LOG_INFO TRX_SYS_MYSQL_LOG_MAGIC_N_FLD +2100 TRX_SYS_MYSQL_LOG_OFFSET_HIGH +2104 TRX_SYS_MYSQL_LOG_OFFSET_LOW +2108 TRX_SYS_MYSQL_LOG_NAME + +(UNIV_PAGE_SIZE - 1000 MYSQL LOG) +3096 TRX_SYS_MYSQL_LOG_INFO TRX_SYS_MYSQL_LOG_MAGIC_N_FLD +3100 TRX_SYS_MYSQL_LOG_OFFSET_HIGH +3104 TRX_SYS_MYSQL_LOG_OFFSET_LOW +3108 TRX_SYS_MYSQL_LOG_NAME + +(UNIV_PAGE_SIZE - 200 DOUBLEWRITE) +3896 TRX_SYS_DOUBLEWRITE TRX_SYS_DOUBLEWRITE_FSEG +3906 TRX_SYS_DOUBLEWRITE_MAGIC +3910 TRX_SYS_DOUBLEWRITE_BLOCK1 +3914 TRX_SYS_DOUBLEWRITE_BLOCK2 +3918 TRX_SYS_DOUBLEWRITE_REPEAT +3930 TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED_N + +(UNIV_PAGE_SIZE - 8, TAILER) +4088..4096 FIL_TAILER + +*/ #ifdef WITH_WSREP -/* The offset to WSREP XID headers */ -#define TRX_SYS_WSREP_XID_INFO (UNIV_PAGE_SIZE - 3500) +/** The offset to WSREP XID headers */ +#define TRX_SYS_WSREP_XID_INFO (ut_max(UNIV_PAGE_SIZE - 3500, 1596)) #define TRX_SYS_WSREP_XID_MAGIC_N_FLD 0 #define TRX_SYS_WSREP_XID_MAGIC_N 0x77737265 -/* XID field: formatID, gtrid_len, bqual_len, xid_data */ +/** XID field: formatID, gtrid_len, bqual_len, xid_data */ #define TRX_SYS_WSREP_XID_LEN (4 + 4 + 4 + XIDDATASIZE) #define TRX_SYS_WSREP_XID_FORMAT 4 #define TRX_SYS_WSREP_XID_GTRID_LEN 8 diff --git a/storage/xtradb/include/trx0trx.h b/storage/xtradb/include/trx0trx.h index 766d61039b4..1b490eca2af 100644 --- a/storage/xtradb/include/trx0trx.h +++ b/storage/xtradb/include/trx0trx.h @@ -1,8 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2015, 2016, MariaDB Corporation. All Rights Reserved. - +Copyright (c) 2015, 2017, MariaDB Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -334,6 +333,24 @@ trx_print_low( /*!< in: mem_heap_get_size(trx->lock.lock_heap) */ MY_ATTRIBUTE((nonnull)); +#ifdef WITH_WSREP +/**********************************************************************//** +Prints info about a transaction. +Transaction information may be retrieved without having trx_sys->mutex acquired +so it may not be completely accurate. The caller must own lock_sys->mutex +and the trx must have some locks to make sure that it does not escape +without locking lock_sys->mutex. */ +UNIV_INTERN +void +wsrep_trx_print_locking( +/*==============*/ + FILE* f, /*!< in: output stream */ + const trx_t* trx, /*!< in: transaction */ + ulint max_query_len) /*!< in: max query length to print, + or 0 to use the default max length */ + MY_ATTRIBUTE((nonnull)); +#endif /* WITH_WSREP */ + /**********************************************************************//** Prints info about a transaction. The caller must hold lock_sys->mutex and trx_sys->mutex. diff --git a/storage/xtradb/include/trx0xa.h b/storage/xtradb/include/trx0xa.h index 7caddfb7ba4..4d5adc68dcd 100644 --- a/storage/xtradb/include/trx0xa.h +++ b/storage/xtradb/include/trx0xa.h @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1995, 2009, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -24,6 +24,8 @@ this program; if not, write to the Free Software Foundation, Inc., #ifndef XA_H #define XA_H +#include "handler.h" + /* * Transaction branch identification: XID and NULLXID: */ @@ -35,17 +37,6 @@ this program; if not, write to the Free Software Foundation, Inc., #define MAXGTRIDSIZE 64 /*!< maximum size in bytes of gtrid */ #define MAXBQUALSIZE 64 /*!< maximum size in bytes of bqual */ -/** X/Open XA distributed transaction identifier */ -struct xid_t { - long formatID; /*!< format identifier; -1 - means that the XID is null */ - long gtrid_length; /*!< value from 1 through 64 */ - long bqual_length; /*!< value from 1 through 64 */ - char data[XIDDATASIZE]; /*!< distributed transaction - identifier */ -}; -/** X/Open XA distributed transaction identifier */ -typedef struct xid_t XID; #endif /** X/Open XA distributed transaction status codes */ /* @{ */ diff --git a/storage/xtradb/include/univ.i b/storage/xtradb/include/univ.i index e698f08f15b..739f6640eef 100644 --- a/storage/xtradb/include/univ.i +++ b/storage/xtradb/include/univ.i @@ -45,10 +45,10 @@ Created 1/20/1994 Heikki Tuuri #define INNODB_VERSION_MAJOR 5 #define INNODB_VERSION_MINOR 6 -#define INNODB_VERSION_BUGFIX 35 +#define INNODB_VERSION_BUGFIX 36 #ifndef PERCONA_INNODB_VERSION -#define PERCONA_INNODB_VERSION 80.0 +#define PERCONA_INNODB_VERSION 82.1 #endif /* Enable UNIV_LOG_ARCHIVE in XtraDB */ @@ -146,14 +146,8 @@ HAVE_PSI_INTERFACE is defined. */ #if defined HAVE_PSI_INTERFACE && !defined UNIV_HOTBACKUP # define UNIV_PFS_MUTEX # define UNIV_PFS_RWLOCK -/* For I/O instrumentation, performance schema rely -on a native descriptor to identify the file, this -descriptor could conflict with our OS level descriptor. -Disable IO instrumentation on Windows until this is -resolved */ -# ifndef __WIN__ -# define UNIV_PFS_IO -# endif + +# define UNIV_PFS_IO # define UNIV_PFS_THREAD /* There are mutexes/rwlocks that we want to exclude from @@ -635,7 +629,7 @@ functions. */ #ifdef __WIN__ #define usleep(a) Sleep((a)/1000) -typedef ulint os_thread_ret_t; +typedef DWORD os_thread_ret_t; #define OS_THREAD_DUMMY_RETURN return(0) #else typedef void* os_thread_ret_t; diff --git a/storage/xtradb/include/ut0counter.h b/storage/xtradb/include/ut0counter.h index 447484ba985..4f736428a17 100644 --- a/storage/xtradb/include/ut0counter.h +++ b/storage/xtradb/include/ut0counter.h @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 2012, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -48,8 +49,6 @@ Created 2012/04/12 by Sunny Bains /** Get the offset into the counter array. */ template struct generic_indexer_t { - /** Default constructor/destructor should be OK. */ - /** @return offset within m_counter */ size_t offset(size_t index) const UNIV_NOTHROW { return(((index % N) + 1) * (CACHE_LINE_SIZE / sizeof(Type))); @@ -62,8 +61,6 @@ struct generic_indexer_t { use the thread id. */ template struct get_sched_indexer_t : public generic_indexer_t { - /** Default constructor/destructor should be OK. */ - /* @return result from sched_getcpu(), the thread id if it fails. */ size_t get_rnd_index() const UNIV_NOTHROW { @@ -80,31 +77,17 @@ struct get_sched_indexer_t : public generic_indexer_t { /** Use the thread id to index into the counter array. */ template struct thread_id_indexer_t : public generic_indexer_t { - /** Default constructor/destructor should are OK. */ - /* @return a random number, currently we use the thread id. Where thread id is represented as a pointer, it may not work as effectively. */ size_t get_rnd_index() const UNIV_NOTHROW { return((lint) os_thread_get_curr_id()); } -}; -/** For counters wher N=1 */ -template -struct single_indexer_t { - /** Default constructor/destructor should are OK. */ - - /** @return offset within m_counter */ - size_t offset(size_t index) const UNIV_NOTHROW { - ut_ad(N == 1); - return((CACHE_LINE_SIZE / sizeof(Type))); - } - - /* @return 1 */ - size_t get_rnd_index() const UNIV_NOTHROW { - ut_ad(N == 1); - return(1); + /** @return a random offset to the array */ + size_t get_rnd_offset() const UNIV_NOTHROW + { + return(generic_indexer_t::offset(get_rnd_index())); } }; @@ -116,17 +99,11 @@ template < typename Type, int N = IB_N_SLOTS, template class Indexer = thread_id_indexer_t> -class ib_counter_t { -public: - ib_counter_t() { memset(m_counter, 0x0, sizeof(m_counter)); } - +struct MY_ALIGNED(CACHE_LINE_SIZE) ib_counter_t +{ +#ifdef UNIV_DEBUG ~ib_counter_t() { - ut_ad(validate()); - } - - bool validate() UNIV_NOTHROW { -#ifdef UNIV_DEBUG size_t n = (CACHE_LINE_SIZE / sizeof(Type)); /* Check that we aren't writing outside our defined bounds. */ @@ -135,27 +112,23 @@ public: ut_ad(m_counter[i + j] == 0); } } -#endif /* UNIV_DEBUG */ - return(true); } +#endif /* UNIV_DEBUG */ - /** If you can't use a good index id. Increment by 1. */ + /** Increment the counter by 1. */ void inc() UNIV_NOTHROW { add(1); } - /** If you can't use a good index id. - * @param n - is the amount to increment */ - void add(Type n) UNIV_NOTHROW { - size_t i = m_policy.offset(m_policy.get_rnd_index()); + /** Increment the counter by 1. + @param[in] index a reasonably thread-unique identifier */ + void inc(size_t index) UNIV_NOTHROW { add(index, 1); } - ut_ad(i < UT_ARR_SIZE(m_counter)); + /** Add to the counter. + @param[in] n amount to be added */ + void add(Type n) UNIV_NOTHROW { add(m_policy.get_rnd_offset(), n); } - m_counter[i] += n; - } - - /** Use this if you can use a unique indentifier, saves a - call to get_rnd_index(). - @param i - index into a slot - @param n - amount to increment */ + /** Add to the counter. + @param[in] index a reasonably thread-unique identifier + @param[in] n amount to be added */ void add(size_t index, Type n) UNIV_NOTHROW { size_t i = m_policy.offset(index); @@ -164,31 +137,6 @@ public: m_counter[i] += n; } - /** If you can't use a good index id. Decrement by 1. */ - void dec() UNIV_NOTHROW { sub(1); } - - /** If you can't use a good index id. - * @param - n is the amount to decrement */ - void sub(Type n) UNIV_NOTHROW { - size_t i = m_policy.offset(m_policy.get_rnd_index()); - - ut_ad(i < UT_ARR_SIZE(m_counter)); - - m_counter[i] -= n; - } - - /** Use this if you can use a unique indentifier, saves a - call to get_rnd_index(). - @param i - index into a slot - @param n - amount to decrement */ - void sub(size_t index, Type n) UNIV_NOTHROW { - size_t i = m_policy.offset(index); - - ut_ad(i < UT_ARR_SIZE(m_counter)); - - m_counter[i] -= n; - } - /* @return total value - not 100% accurate, since it is not atomic. */ operator Type() const UNIV_NOTHROW { Type total = 0; diff --git a/storage/xtradb/include/ut0rnd.ic b/storage/xtradb/include/ut0rnd.ic index 024c59e553b..987dfac03c1 100644 --- a/storage/xtradb/include/ut0rnd.ic +++ b/storage/xtradb/include/ut0rnd.ic @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1994, 2009, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -237,16 +238,22 @@ ut_fold_binary( switch (len & 0x7) { case 7: fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + /* fall through */ case 6: fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + /* fall through */ case 5: fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + /* fall through */ case 4: fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + /* fall through */ case 3: fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + /* fall through */ case 2: fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + /* fall through */ case 1: fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); } diff --git a/storage/xtradb/include/ut0timer.ic b/storage/xtradb/include/ut0timer.ic index 62e17a10fb1..815726e9d0a 100644 --- a/storage/xtradb/include/ut0timer.ic +++ b/storage/xtradb/include/ut0timer.ic @@ -106,7 +106,7 @@ ut_microseconds_to_timer( /*=====================*/ ulonglong when) /*!< in: time where to calculate */ { - double ret = when; + double ret = (double)when; ret *= (double)(ut_timer.frequency); ret /= 1000000.0; return (ulonglong)ret; diff --git a/storage/xtradb/lock/lock0lock.cc b/storage/xtradb/lock/lock0lock.cc index 717fbf02536..40ab9d9403c 100644 --- a/storage/xtradb/lock/lock0lock.cc +++ b/storage/xtradb/lock/lock0lock.cc @@ -921,12 +921,18 @@ lock_reset_lock_and_trx_wait( const char* stmt2=NULL; size_t stmt_len; trx_id_t trx_id = 0; - stmt = innobase_get_stmt(lock->trx->mysql_thd, &stmt_len); + stmt = lock->trx->mysql_thd + ? innobase_get_stmt(lock->trx->mysql_thd, &stmt_len) + : NULL; if (lock->trx->lock.wait_lock && lock->trx->lock.wait_lock->trx) { trx_id = lock->trx->lock.wait_lock->trx->id; - stmt2 = innobase_get_stmt(lock->trx->lock.wait_lock->trx->mysql_thd, &stmt_len); + stmt2 = lock->trx->lock.wait_lock->trx->mysql_thd + ? innobase_get_stmt( + lock->trx->lock.wait_lock + ->trx->mysql_thd, &stmt_len) + : NULL; } ib_logf(IB_LOG_LEVEL_INFO, @@ -1915,7 +1921,7 @@ lock_sec_rec_some_has_impl( } else if (!lock_check_trx_id_sanity(max_trx_id, rec, index, offsets)) { - buf_page_print(page, 0, 0); + buf_page_print(page, 0); /* The page is corrupt: try to avoid a crash by returning 0 */ trx_id = 0; @@ -5636,13 +5642,11 @@ lock_rec_unlock( trx_mutex_exit(trx); stmt = innobase_get_stmt(trx->mysql_thd, &stmt_len); - ut_print_timestamp(stderr); - fprintf(stderr, - " InnoDB: Error: unlock row could not" - " find a %lu mode lock on the record\n", - (ulong) lock_mode); - ut_print_timestamp(stderr); - fprintf(stderr, " InnoDB: current statement: %.*s\n", + + ib_logf(IB_LOG_LEVEL_ERROR, + "unlock row could not find a %u mode lock on the record;" + " statement=%.*s", + lock_mode, (int) stmt_len, stmt); return; diff --git a/storage/xtradb/lock/lock0wait.cc b/storage/xtradb/lock/lock0wait.cc index 8f9ea7e10aa..a447027e336 100644 --- a/storage/xtradb/lock/lock0wait.cc +++ b/storage/xtradb/lock/lock0wait.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. All Rights Reserved. +Copyright (c) 2014, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -273,6 +273,9 @@ lock_wait_suspend_thread( slot = lock_wait_table_reserve_slot(thr, lock_wait_timeout); + lock_wait_mutex_exit(); + trx_mutex_exit(trx); + if (thr->lock_state == QUE_THR_LOCK_ROW) { srv_stats.n_lock_wait_count.inc(); srv_stats.n_lock_wait_current_count.inc(); @@ -284,19 +287,21 @@ lock_wait_suspend_thread( } } - lock_wait_mutex_exit(); - trx_mutex_exit(trx); - ulint lock_type = ULINT_UNDEFINED; - lock_mutex_enter(); - + /* The wait_lock can be cleared by another thread when the + lock is released. But the wait can only be initiated by the + current thread which owns the transaction. Only acquire the + mutex if the wait_lock is still active. */ if (const lock_t* wait_lock = trx->lock.wait_lock) { - lock_type = lock_get_type_low(wait_lock); + lock_mutex_enter(); + wait_lock = trx->lock.wait_lock; + if (wait_lock) { + lock_type = lock_get_type_low(wait_lock); + } + lock_mutex_exit(); } - lock_mutex_exit(); - had_dict_lock = trx->dict_operation_lock_mode; switch (had_dict_lock) { diff --git a/storage/xtradb/log/log0crypt.cc b/storage/xtradb/log/log0crypt.cc index e6b5c845757..9509797dde3 100644 --- a/storage/xtradb/log/log0crypt.cc +++ b/storage/xtradb/log/log0crypt.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (C) 2013, 2015, Google Inc. All Rights Reserved. -Copyright (C) 2014, 2016, MariaDB Corporation. All Rights Reserved. +Copyright (C) 2014, 2017, MariaDB Corporation. All Rights Reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -25,8 +25,7 @@ Modified Jan Lindström jan.lindstrom@mariadb.com *******************************************************/ #include "m_string.h" #include "log0crypt.h" -#include -#include +#include #include "log0log.h" #include "srv0start.h" // for srv_start_lsn @@ -34,8 +33,6 @@ Modified Jan Lindström jan.lindstrom@mariadb.com #include "ha_prototypes.h" // IB_LOG_ -#include "my_crypt.h" - /* Used for debugging */ // #define DEBUG_CRYPT 1 #define UNENCRYPTED_KEY_VER 0 @@ -239,6 +236,129 @@ next: return rc; } +/** Encrypt/decrypt temporary log blocks. + +@param[in] src_block block to encrypt or decrypt +@param[in] size size of the block +@param[out] dst_block destination block +@param[in] what ENCRYPTION_FLAG_ENCRYPT or + ENCRYPTION_FLAG_DECRYPT +@param[in] offs offset to block +@param[in] space_id tablespace id +@return true if successfull, false in case of failure +*/ +static +bool +log_tmp_blocks_crypt( + const byte* src_block, + ulint size, + byte* dst_block, + int what, + os_offset_t offs, + ulint space_id) +{ + Crypt_result rc = MY_AES_OK; + uint dst_len; + byte aes_ctr_counter[MY_AES_BLOCK_SIZE]; + byte is_encrypt= what == ENCRYPTION_FLAG_ENCRYPT; + const crypt_info_t* info = static_cast(&crypt_info[0]); + + // AES_CTR_COUNTER = space_id + offs + + bzero(aes_ctr_counter, MY_AES_BLOCK_SIZE); + mach_write_to_8(aes_ctr_counter, space_id); + mach_write_to_8(aes_ctr_counter + 8, offs); + + rc = encryption_crypt(src_block, size, + dst_block, &dst_len, + (unsigned char*)(info->crypt_key), 16, + aes_ctr_counter, MY_AES_BLOCK_SIZE, + what | ENCRYPTION_FLAG_NOPAD, + LOG_DEFAULT_ENCRYPTION_KEY, + info->key_version); + + if (rc != MY_AES_OK) { + ib_logf(IB_LOG_LEVEL_ERROR, + "%s failed for temporary log file with rc = %d", + is_encrypt ? "Encryption" : "Decryption", + rc); + return false; + } + + return true; +} + +/** Get crypt info +@return pointer to log crypt info or NULL +*/ +inline +const crypt_info_t* +get_crypt_info() +{ + mutex_enter(&log_sys->mutex); + const crypt_info_t* info = get_crypt_info(log_sys->next_checkpoint_no); + mutex_exit(&log_sys->mutex); + + return info; +} + +/** Find out is temporary log files encrypted. +@return true if temporary log file should be encrypted, false if not */ +UNIV_INTERN +bool +log_tmp_is_encrypted() +{ + const crypt_info_t* info = get_crypt_info(); + + if (info == NULL || info->key_version == UNENCRYPTED_KEY_VER) { + return false; + } + + return true; +} + +/** Encrypt temporary log block. +@param[in] src_block block to encrypt or decrypt +@param[in] size size of the block +@param[out] dst_block destination block +@param[in] offs offset to block +@param[in] space_id tablespace id +@return true if successfull, false in case of failure +*/ +UNIV_INTERN +bool +log_tmp_block_encrypt( + const byte* src_block, + ulint size, + byte* dst_block, + os_offset_t offs, + ulint space_id) +{ + return (log_tmp_blocks_crypt(src_block, size, dst_block, + ENCRYPTION_FLAG_ENCRYPT, offs, space_id)); +} + +/** Decrypt temporary log block. +@param[in] src_block block to encrypt or decrypt +@param[in] size size of the block +@param[out] dst_block destination block +@param[in] offs offset to block +@param[in] space_id tablespace id +@return true if successfull, false in case of failure +*/ +UNIV_INTERN +bool +log_tmp_block_decrypt( + const byte* src_block, + ulint size, + byte* dst_block, + os_offset_t offs, + ulint space_id) +{ + return (log_tmp_blocks_crypt(src_block, size, dst_block, + ENCRYPTION_FLAG_DECRYPT, offs, space_id)); +} + /*********************************************************************//** Generate crypt key from crypt msg. @return true if successfull, false if not. */ diff --git a/storage/xtradb/log/log0log.cc b/storage/xtradb/log/log0log.cc index 25c8ed06981..31a2cad05eb 100644 --- a/storage/xtradb/log/log0log.cc +++ b/storage/xtradb/log/log0log.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2009, Google Inc. Copyright (c) 2014, 2017, MariaDB Corporation. @@ -55,12 +55,13 @@ Created 12/9/1995 Heikki Tuuri #include "mem0mem.h" #include "buf0buf.h" #include "buf0flu.h" -#include "srv0srv.h" #include "lock0lock.h" #include "log0recv.h" #include "fil0fil.h" #include "dict0boot.h" -#include "dict0stats_bg.h" /* dict_stats_event */ +#include "dict0stats_bg.h" +#include "dict0stats_bg.h" +#include "btr0defragment.h" #include "srv0srv.h" #include "srv0start.h" #include "trx0sys.h" @@ -859,43 +860,16 @@ ibool log_calc_max_ages(void) /*===================*/ { - log_group_t* group; lsn_t margin; ulint free; - ibool success = TRUE; - lsn_t smallest_capacity; - lsn_t archive_margin; - lsn_t smallest_archive_margin; - mutex_enter(&(log_sys->mutex)); - - group = UT_LIST_GET_FIRST(log_sys->log_groups); - - ut_ad(group); - - smallest_capacity = LSN_MAX; - smallest_archive_margin = LSN_MAX; - - while (group) { - if (log_group_get_capacity(group) < smallest_capacity) { - - smallest_capacity = log_group_get_capacity(group); - } - - archive_margin = log_group_get_capacity(group) - - (group->file_size - LOG_FILE_HDR_SIZE) - - LOG_ARCHIVE_EXTRA_MARGIN; - - if (archive_margin < smallest_archive_margin) { - - smallest_archive_margin = archive_margin; - } - - group = UT_LIST_GET_NEXT(log_groups, group); - } + lsn_t smallest_capacity = ((srv_log_file_size_requested + << srv_page_size_shift) + - LOG_FILE_HDR_SIZE) + * srv_n_log_files; /* Add extra safety */ - smallest_capacity = smallest_capacity - smallest_capacity / 10; + smallest_capacity -= smallest_capacity / 10; /* For each OS thread we must reserve so much free space in the smallest log group that it can accommodate the log entries produced @@ -905,15 +879,16 @@ log_calc_max_ages(void) free = LOG_CHECKPOINT_FREE_PER_THREAD * (10 + srv_thread_concurrency) + LOG_CHECKPOINT_EXTRA_FREE; if (free >= smallest_capacity / 2) { - success = FALSE; - - goto failure; - } else { - margin = smallest_capacity - free; + ib_logf(IB_LOG_LEVEL_FATAL, + "The combined size of ib_logfiles" + " should be bigger than\n" + "InnoDB: 200 kB * innodb_thread_concurrency."); } - + margin = smallest_capacity - free; margin = margin - margin / 10; /* Add still some extra safety */ + mutex_enter(&log_sys->mutex); + log_sys->log_group_capacity = smallest_capacity; log_sys->max_modified_age_async = margin @@ -926,22 +901,17 @@ log_calc_max_ages(void) log_sys->max_checkpoint_age = margin; #ifdef UNIV_LOG_ARCHIVE - log_sys->max_archived_lsn_age = smallest_archive_margin; + lsn_t archive_margin = smallest_capacity + - (srv_log_file_size_requested - LOG_FILE_HDR_SIZE) + - LOG_ARCHIVE_EXTRA_MARGIN; + log_sys->max_archived_lsn_age = archive_margin; - log_sys->max_archived_lsn_age_async = smallest_archive_margin - - smallest_archive_margin / LOG_ARCHIVE_RATIO_ASYNC; + log_sys->max_archived_lsn_age_async = archive_margin + - archive_margin / LOG_ARCHIVE_RATIO_ASYNC; #endif /* UNIV_LOG_ARCHIVE */ -failure: - mutex_exit(&(log_sys->mutex)); + mutex_exit(&log_sys->mutex); - if (!success) { - ib_logf(IB_LOG_LEVEL_FATAL, - "The combined size of ib_logfiles" - " should be bigger than\n" - "InnoDB: 200 kB * innodb_thread_concurrency."); - } - - return(success); + return(true); } /******************************************************//** @@ -2629,7 +2599,7 @@ loop: start_lsn += len; buf += len; - if (recv_sys->report(ut_time())) { + if (recv_sys && recv_sys->report(ut_time())) { ib_logf(IB_LOG_LEVEL_INFO, "Read redo log up to LSN=" LSN_PF, start_lsn); sd_notifyf(0, "STATUS=Read redo log up to LSN=" LSN_PF, @@ -2804,7 +2774,7 @@ log_group_archive( /*==============*/ log_group_t* group) /*!< in: log group */ { - os_file_t file_handle; + pfs_os_file_t file_handle; lsn_t start_lsn; lsn_t end_lsn; char name[OS_FILE_MAX_PATH]; @@ -3618,6 +3588,8 @@ loop: thread_name = "lock_wait_timeout_thread"; } else if (srv_buf_dump_thread_active) { thread_name = "buf_dump_thread"; + } else if (btr_defragment_thread_active) { + thread_name = "btr_defragment_thread"; } else if (srv_fast_shutdown != 2 && trx_rollback_or_clean_is_active) { thread_name = "rollback of recovered transactions"; } else { @@ -3639,8 +3611,8 @@ wait_suspend_loop: switch (srv_get_active_thread_type()) { case SRV_NONE: - srv_shutdown_state = SRV_SHUTDOWN_FLUSH_PHASE; if (!srv_n_fil_crypt_threads_started) { + srv_shutdown_state = SRV_SHUTDOWN_FLUSH_PHASE; break; } os_event_set(fil_crypt_threads_event); @@ -3663,6 +3635,7 @@ wait_suspend_loop: before proceeding further. */ count = 0; + os_rmb; while (buf_page_cleaner_is_active || buf_lru_manager_is_active) { if (srv_print_verbose_log && count == 0) { ib_logf(IB_LOG_LEVEL_INFO, @@ -3674,6 +3647,7 @@ wait_suspend_loop: if (count > 600) { count = 0; } + os_rmb; } if (log_scrub_thread_active) { @@ -3820,7 +3794,8 @@ wait_suspend_loop: ut_a(freed); ut_a(lsn == log_sys->lsn); - ut_ad(lsn == log_sys->last_checkpoint_lsn); + ut_ad(srv_force_recovery >= SRV_FORCE_NO_LOG_REDO + || lsn == log_sys->last_checkpoint_lsn); if (lsn < srv_start_lsn) { ib_logf(IB_LOG_LEVEL_ERROR, @@ -3832,9 +3807,14 @@ wait_suspend_loop: srv_shutdown_lsn = lsn; if (!srv_read_only_mode) { - fil_write_flushed_lsn_to_data_files(lsn, 0); + dberr_t err = fil_write_flushed_lsn(lsn); - fil_flush_file_spaces(FIL_TABLESPACE); + if (err != DB_SUCCESS) { + ib_logf(IB_LOG_LEVEL_ERROR, + "Failed to write flush lsn to the " + "system tablespace at shutdown err=%s", + ut_strerr(err)); + } } fil_close_all_files(); diff --git a/storage/xtradb/log/log0online.cc b/storage/xtradb/log/log0online.cc index 74f2e2360a8..27382977e5c 100644 --- a/storage/xtradb/log/log0online.cc +++ b/storage/xtradb/log/log0online.cc @@ -329,7 +329,7 @@ log_online_read_last_tracked_lsn(void) lsn_t result; os_offset_t read_offset = log_bmp_sys->out.offset; - while (!checksum_ok && read_offset > 0 && !is_last_page) + while ((!checksum_ok || !is_last_page) && read_offset > 0) { read_offset -= MODIFIED_PAGE_BLOCK_SIZE; log_bmp_sys->out.offset = read_offset; @@ -554,9 +554,9 @@ log_online_rotate_bitmap_file( lsn_t next_file_start_lsn) /*!out.file != os_file_invalid) { + if (!os_file_is_invalid(log_bmp_sys->out.file)) { os_file_close(log_bmp_sys->out.file); - log_bmp_sys->out.file = os_file_invalid; + os_file_mark_invalid(&log_bmp_sys->out.file); } log_bmp_sys->out_seq_num++; log_online_make_bitmap_name(next_file_start_lsn); @@ -723,7 +723,11 @@ log_online_read_init(void) } last_tracked_lsn = log_online_read_last_tracked_lsn(); + /* Do not rotate if we truncated the file to zero length - we + can just start writing there */ + const bool need_rotate = (last_tracked_lsn != 0); if (!last_tracked_lsn) { + last_tracked_lsn = last_file_start_lsn; } @@ -735,7 +739,8 @@ log_online_read_init(void) } else { file_start_lsn = tracking_start_lsn; } - ut_a(log_online_rotate_bitmap_file(file_start_lsn)); + ut_a(!need_rotate + || log_online_rotate_bitmap_file(file_start_lsn)); if (last_tracked_lsn < tracking_start_lsn) { @@ -773,9 +778,9 @@ log_online_read_shutdown(void) ib_rbt_node_t *free_list_node = log_bmp_sys->page_free_list; - if (log_bmp_sys->out.file != os_file_invalid) { + if (!os_file_is_invalid(log_bmp_sys->out.file)) { os_file_close(log_bmp_sys->out.file); - log_bmp_sys->out.file = os_file_invalid; + os_file_mark_invalid(&log_bmp_sys->out.file); } rbt_free(log_bmp_sys->modified_pages); @@ -1114,6 +1119,18 @@ log_online_write_bitmap_page( } }); + /* A crash injection site that ensures last checkpoint LSN > last + tracked LSN, so that LSN tracking for this interval is tested. */ + DBUG_EXECUTE_IF("crash_before_bitmap_write", + { + ulint space_id + = mach_read_from_4(block + + MODIFIED_PAGE_SPACE_ID); + if (space_id > 0) + DBUG_SUICIDE(); + }); + + ibool success = os_file_write(log_bmp_sys->out.name, log_bmp_sys->out.file, block, log_bmp_sys->out.offset, @@ -1137,10 +1154,8 @@ log_online_write_bitmap_page( return FALSE; } -#ifdef UNIV_LINUX - posix_fadvise(log_bmp_sys->out.file, log_bmp_sys->out.offset, - MODIFIED_PAGE_BLOCK_SIZE, POSIX_FADV_DONTNEED); -#endif + os_file_advise(log_bmp_sys->out.file, log_bmp_sys->out.offset, + MODIFIED_PAGE_BLOCK_SIZE, OS_FILE_ADVISE_DONTNEED); log_bmp_sys->out.offset += MODIFIED_PAGE_BLOCK_SIZE; return TRUE; @@ -1262,10 +1277,6 @@ log_online_follow_redo_log(void) group = UT_LIST_GET_NEXT(log_groups, group); } - /* A crash injection site that ensures last checkpoint LSN > last - tracked LSN, so that LSN tracking for this interval is tested. */ - DBUG_EXECUTE_IF("crash_before_bitmap_write", DBUG_SUICIDE();); - result = log_online_write_bitmap(); log_bmp_sys->start_lsn = log_bmp_sys->end_lsn; log_set_tracked_lsn(log_bmp_sys->start_lsn); @@ -1433,6 +1444,7 @@ log_online_setup_bitmap_file_range( if (UNIV_UNLIKELY(array_pos >= bitmap_files->count)) { log_online_diagnose_inconsistent_dir(bitmap_files); + os_file_closedir(bitmap_dir); return FALSE; } @@ -1535,10 +1547,8 @@ log_online_open_bitmap_file_read_only( bitmap_file->size = os_file_get_size(bitmap_file->file); bitmap_file->offset = 0; -#ifdef UNIV_LINUX - posix_fadvise(bitmap_file->file, 0, 0, POSIX_FADV_SEQUENTIAL); - posix_fadvise(bitmap_file->file, 0, 0, POSIX_FADV_NOREUSE); -#endif + os_file_advise(bitmap_file->file, 0, 0, OS_FILE_ADVISE_SEQUENTIAL); + os_file_advise(bitmap_file->file, 0, 0, OS_FILE_ADVISE_NOREUSE); return TRUE; } @@ -1624,7 +1634,7 @@ log_online_bitmap_iterator_init( /* Empty range */ i->in_files.count = 0; i->in_files.files = NULL; - i->in.file = os_file_invalid; + os_file_mark_invalid(&i->in.file); i->page = NULL; i->failed = FALSE; return TRUE; @@ -1642,7 +1652,7 @@ log_online_bitmap_iterator_init( if (i->in_files.count == 0) { /* Empty range */ - i->in.file = os_file_invalid; + os_file_mark_invalid(&i->in.file); i->page = NULL; i->failed = FALSE; return TRUE; @@ -1681,10 +1691,10 @@ log_online_bitmap_iterator_release( { ut_a(i); - if (i->in.file != os_file_invalid) { + if (!os_file_is_invalid(i->in.file)) { os_file_close(i->in.file); - i->in.file = os_file_invalid; + os_file_mark_invalid(&i->in.file); } if (i->in_files.files) { @@ -1738,8 +1748,9 @@ log_online_bitmap_iterator_next( /* Advance file */ i->in_i++; - success = os_file_close_no_error_handling(i->in.file); - i->in.file = os_file_invalid; + success = os_file_close_no_error_handling( + i->in.file); + os_file_mark_invalid(&i->in.file); if (UNIV_UNLIKELY(!success)) { os_file_get_last_error(TRUE); @@ -1848,7 +1859,7 @@ log_online_purge_changed_page_bitmaps( /* If we have to delete the current output file, close it first. */ os_file_close(log_bmp_sys->out.file); - log_bmp_sys->out.file = os_file_invalid; + os_file_mark_invalid(&log_bmp_sys->out.file); } for (i = 0; i < bitmap_files.count; i++) { diff --git a/storage/xtradb/log/log0recv.cc b/storage/xtradb/log/log0recv.cc index 120f1432ccf..1943fb51f37 100644 --- a/storage/xtradb/log/log0recv.cc +++ b/storage/xtradb/log/log0recv.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1997, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. Copyright (c) 2013, 2017, MariaDB Corporation. @@ -332,6 +332,7 @@ DECLARE_THREAD(recv_writer_thread)( /*!< in: a dummy parameter required by os_thread_create */ { + my_thread_init(); ut_ad(!srv_read_only_mode); #ifdef UNIV_PFS_THREAD @@ -362,6 +363,7 @@ DECLARE_THREAD(recv_writer_thread)( recv_writer_thread_active = false; + my_thread_end(); /* We count the number of threads in os_thread_exit(). A created thread should always use that to exit and not use return() to exit. */ @@ -692,7 +694,6 @@ recv_synchronize_groups( /***********************************************************************//** Checks the consistency of the checkpoint info @return TRUE if ok */ -static ibool recv_check_cp_is_consistent( /*========================*/ @@ -722,7 +723,7 @@ recv_check_cp_is_consistent( /********************************************************//** Looks for the maximum consistent checkpoint from the log groups. @return error code or DB_SUCCESS */ -static MY_ATTRIBUTE((nonnull, warn_unused_result)) +MY_ATTRIBUTE((nonnull, warn_unused_result)) dberr_t recv_find_max_checkpoint( /*=====================*/ @@ -841,10 +842,8 @@ not_consistent: fprintf(stderr, "InnoDB: No valid checkpoint found.\n" - "InnoDB: If you are attempting downgrade" - " from MySQL 5.7.9 or later,\n" - "InnoDB: please refer to " REFMAN - "upgrading-downgrading.html\n" + "InnoDB: A downgrade from MariaDB 10.2.2" + " or later is not supported.\n" "InnoDB: If this error appears when you are" " creating an InnoDB database,\n" "InnoDB: the problem may be that during" @@ -1383,7 +1382,12 @@ recv_parse_or_apply_log_rec_body( } break; case MLOG_FILE_WRITE_CRYPT_DATA: - ptr = const_cast(fil_parse_write_crypt_data(ptr, end_ptr, block)); + dberr_t err; + ptr = const_cast(fil_parse_write_crypt_data(ptr, end_ptr, block, &err)); + + if (err != DB_SUCCESS) { + recv_sys->found_corrupt_log = TRUE; + } break; default: ptr = NULL; @@ -1868,6 +1872,11 @@ recv_apply_hashed_log_recs(bool last_batch) break; } + if (recv_sys->found_corrupt_log) { + mutex_exit(&recv_sys->mutex); + return; + } + mutex_exit(&recv_sys->mutex); os_thread_sleep(500000); } @@ -1932,6 +1941,10 @@ recv_apply_hashed_log_recs(bool last_batch) mutex_exit(&(recv_sys->mutex)); + if (recv_sys->found_corrupt_log) { + return; + } + os_thread_sleep(500000); mutex_enter(&(recv_sys->mutex)); @@ -1967,7 +1980,7 @@ recv_apply_hashed_log_recs(bool last_batch) mutex_enter(&(log_sys->mutex)); mutex_enter(&(recv_sys->mutex)); - ut_d(recv_no_log_write = FALSE); + ut_d(recv_no_log_write = srv_apply_log_only); recv_no_ibuf_operations = FALSE; } @@ -2989,11 +3002,6 @@ recv_init_crash_recovery(void) possible */ if (srv_force_recovery < SRV_FORCE_NO_LOG_REDO) { - - ib_logf(IB_LOG_LEVEL_INFO, - "Restoring possible half-written data pages " - "from the doublewrite buffer..."); - buf_dblwr_process(); /* Spawn the background thread to flush dirty pages @@ -3004,22 +3012,22 @@ recv_init_crash_recovery(void) } } -/********************************************************//** -Recovers from a checkpoint. When this function returns, the database is able +/** Recovers from a checkpoint. When this function returns, the database is able to start processing of new user transactions, but the function recv_recovery_from_checkpoint_finish should be called later to complete the recovery and free the resources used in it. +@param[in] type LOG_CHECKPOINT or LOG_ARCHIVE +@param[in] limit_lsn recover up to this lsn if possible +@param[in] flushed_lsn flushed lsn from first data file @return error code or DB_SUCCESS */ UNIV_INTERN dberr_t recv_recovery_from_checkpoint_start_func( -/*=====================================*/ #ifdef UNIV_LOG_ARCHIVE - ulint type, /*!< in: LOG_CHECKPOINT or LOG_ARCHIVE */ - lsn_t limit_lsn, /*!< in: recover up to this lsn if possible */ + ulint type, + lsn_t limit_lsn, #endif /* UNIV_LOG_ARCHIVE */ - lsn_t min_flushed_lsn,/*!< in: min flushed lsn from data files */ - lsn_t max_flushed_lsn)/*!< in: max flushed lsn from data files */ + lsn_t flushed_lsn) { log_group_t* group; log_group_t* max_cp_group; @@ -3247,6 +3255,7 @@ recv_recovery_from_checkpoint_start_func( group = UT_LIST_GET_NEXT(log_groups, group); } + /* Done with startup scan. Clear the flag. */ recv_log_scan_is_startup_type = FALSE; @@ -3259,38 +3268,16 @@ recv_recovery_from_checkpoint_start_func( there is something wrong we will print a message to the user about recovery: */ - if (checkpoint_lsn != max_flushed_lsn - || checkpoint_lsn != min_flushed_lsn) { - - if (checkpoint_lsn < max_flushed_lsn) { - - ib_logf(IB_LOG_LEVEL_WARN, - "The log sequence number " - "in the ibdata files is higher " - "than the log sequence number " - "in the ib_logfiles! Are you sure " - "you are using the right " - "ib_logfiles to start up the database. " - "Log sequence number in the " - "ib_logfiles is " LSN_PF ", log" - "sequence numbers stamped " - "to ibdata file headers are between " - "" LSN_PF " and " LSN_PF ".", - checkpoint_lsn, - min_flushed_lsn, - max_flushed_lsn); - } - + if (checkpoint_lsn != flushed_lsn) { if (!recv_needed_recovery) { ib_logf(IB_LOG_LEVEL_INFO, - "The log sequence numbers " - LSN_PF " and " LSN_PF - " in ibdata files do not match" + "The log sequence number " + LSN_PF + " in ibdata file do not match" " the log sequence number " LSN_PF " in the ib_logfiles!", - min_flushed_lsn, - max_flushed_lsn, + flushed_lsn, checkpoint_lsn); if (!srv_read_only_mode) { @@ -3460,6 +3447,7 @@ recv_recovery_from_checkpoint_finish(void) #ifdef __WIN__ if (recv_writer_thread_handle) { CloseHandle(recv_writer_thread_handle); + recv_writer_thread_handle = 0; } #endif /* __WIN__ */ @@ -3473,7 +3461,8 @@ recv_recovery_from_checkpoint_finish(void) that the data dictionary tables will be free of any locks. The data dictionary latch should guarantee that there is at most one data dictionary transaction active at a time. */ - if (srv_force_recovery < SRV_FORCE_NO_TRX_UNDO) { + if (srv_force_recovery < SRV_FORCE_NO_TRX_UNDO + && !srv_apply_log_only) { trx_rollback_or_clean_recovered(FALSE); } } @@ -3576,6 +3565,7 @@ recv_reset_logs( log_sys->tracked_lsn = log_sys->lsn; + memset(log_sys->buf, 0, log_sys->buf_size); log_block_init(log_sys->buf, log_sys->lsn); log_block_set_first_rec_group(log_sys->buf, LOG_BLOCK_HDR_SIZE); @@ -3686,6 +3676,102 @@ recv_reset_log_files_for_backup( } #endif /* UNIV_HOTBACKUP */ +/******************************************************//** +Checks the 4-byte checksum to the trailer checksum field of a log +block. We also accept a log block in the old format before +InnoDB-3.23.52 where the checksum field contains the log block number. +@return TRUE if ok, or if the log block may be in the format of InnoDB +version predating 3.23.52 */ +UNIV_INTERN +ibool +log_block_checksum_is_ok_or_old_format( +/*===================================*/ + const byte* block) /*!< in: pointer to a log block */ +{ +#ifdef UNIV_LOG_DEBUG + return(TRUE); +#endif /* UNIV_LOG_DEBUG */ + + ulint block_checksum = log_block_get_checksum(block); + + if (UNIV_LIKELY(srv_log_checksum_algorithm == + SRV_CHECKSUM_ALGORITHM_NONE || + log_block_calc_checksum(block) == block_checksum)) { + + return(TRUE); + } + + if (srv_log_checksum_algorithm == SRV_CHECKSUM_ALGORITHM_STRICT_CRC32 || + srv_log_checksum_algorithm == SRV_CHECKSUM_ALGORITHM_STRICT_INNODB || + srv_log_checksum_algorithm == SRV_CHECKSUM_ALGORITHM_STRICT_NONE) { + + const char* algo = NULL; + + ib_logf(IB_LOG_LEVEL_ERROR, + "log block checksum mismatch: expected " ULINTPF ", " + "calculated checksum " ULINTPF, + block_checksum, + log_block_calc_checksum(block)); + + if (block_checksum == LOG_NO_CHECKSUM_MAGIC) { + + algo = "none"; + } else if (block_checksum == + log_block_calc_checksum_crc32(block)) { + + algo = "crc32"; + } else if (block_checksum == + log_block_calc_checksum_innodb(block)) { + + algo = "innodb"; + } + + if (algo) { + + const char* current_algo; + + current_algo = buf_checksum_algorithm_name( + (srv_checksum_algorithm_t) + srv_log_checksum_algorithm); + + ib_logf(IB_LOG_LEVEL_ERROR, + "current InnoDB log checksum type: %s, " + "detected log checksum type: %s", + current_algo, + algo); + } + + ib_logf(IB_LOG_LEVEL_FATAL, + "STRICT method was specified for innodb_log_checksum, " + "so we intentionally assert here."); + } + + ut_ad(srv_log_checksum_algorithm == SRV_CHECKSUM_ALGORITHM_CRC32 || + srv_log_checksum_algorithm == SRV_CHECKSUM_ALGORITHM_INNODB); + + if (block_checksum == LOG_NO_CHECKSUM_MAGIC || + block_checksum == log_block_calc_checksum_crc32(block) || + block_checksum == log_block_calc_checksum_innodb(block)) { + + return(TRUE); + } + + if (log_block_get_hdr_no(block) == block_checksum) { + + /* We assume the log block is in the format of + InnoDB version < 3.23.52 and the block is ok */ +#if 0 + fprintf(stderr, + "InnoDB: Scanned old format < InnoDB-3.23.52" + " log block number %lu\n", + log_block_get_hdr_no(block)); +#endif + return(TRUE); + } + + return(FALSE); +} + void recv_dblwr_t::add(byte* page) { pages.push_back(page); diff --git a/storage/xtradb/mysql-test/storage_engine/parts/suite.pm b/storage/xtradb/mysql-test/storage_engine/parts/suite.pm new file mode 100644 index 00000000000..e186a532dcc --- /dev/null +++ b/storage/xtradb/mysql-test/storage_engine/parts/suite.pm @@ -0,0 +1,8 @@ +package My::Suite::SE::XtraDB; + +@ISA = qw(My::Suite); + +return "Need XtraDB engine"; + +bless { }; + diff --git a/storage/xtradb/mysql-test/storage_engine/suite.pm b/storage/xtradb/mysql-test/storage_engine/suite.pm new file mode 100644 index 00000000000..e186a532dcc --- /dev/null +++ b/storage/xtradb/mysql-test/storage_engine/suite.pm @@ -0,0 +1,8 @@ +package My::Suite::SE::XtraDB; + +@ISA = qw(My::Suite); + +return "Need XtraDB engine"; + +bless { }; + diff --git a/storage/xtradb/mysql-test/storage_engine/tbl_opt_data_index_dir.rdiff b/storage/xtradb/mysql-test/storage_engine/tbl_opt_index_dir.rdiff similarity index 100% rename from storage/xtradb/mysql-test/storage_engine/tbl_opt_data_index_dir.rdiff rename to storage/xtradb/mysql-test/storage_engine/tbl_opt_index_dir.rdiff diff --git a/storage/xtradb/mysql-test/storage_engine/trx/suite.pm b/storage/xtradb/mysql-test/storage_engine/trx/suite.pm new file mode 100644 index 00000000000..e186a532dcc --- /dev/null +++ b/storage/xtradb/mysql-test/storage_engine/trx/suite.pm @@ -0,0 +1,8 @@ +package My::Suite::SE::XtraDB; + +@ISA = qw(My::Suite); + +return "Need XtraDB engine"; + +bless { }; + diff --git a/storage/xtradb/mysql-test/storage_engine/type_spatial_indexes.rdiff b/storage/xtradb/mysql-test/storage_engine/type_spatial_indexes.rdiff index 154116b748c..e312cf8f65c 100644 --- a/storage/xtradb/mysql-test/storage_engine/type_spatial_indexes.rdiff +++ b/storage/xtradb/mysql-test/storage_engine/type_spatial_indexes.rdiff @@ -352,8 +352,8 @@ -116 0 -SELECT fid, AsText(Centroid(g)) FROM gis_multi_polygon; -fid AsText(Centroid(g)) --117 POINT(55.58852775304245 17.426536064113982) --118 POINT(55.58852775304245 17.426536064113982) +-117 POINT(57.98031067576927 17.854754130800433) +-118 POINT(57.98031067576927 17.854754130800433) -119 POINT(2 2) -SELECT fid, Area(g) FROM gis_multi_polygon; -fid Area(g) diff --git a/storage/xtradb/os/os0file.cc b/storage/xtradb/os/os0file.cc index 03200fee80b..f3c72576501 100644 --- a/storage/xtradb/os/os0file.cc +++ b/storage/xtradb/os/os0file.cc @@ -1,6 +1,6 @@ /*********************************************************************** -Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2009, Percona Inc. Copyright (c) 2013, 2017, MariaDB Corporation. @@ -114,10 +114,12 @@ my_umask */ #ifndef __WIN__ /** Umask for creating files */ UNIV_INTERN ulint os_innodb_umask = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP; +# define os_file_invalid (-1) #else /** Umask for creating files */ UNIV_INTERN ulint os_innodb_umask = 0; -#define ECANCELED 125 +# define ECANCELED 125 +# define os_file_invalid INVALID_HANDLE_VALUE #endif /* __WIN__ */ #ifndef UNIV_HOTBACKUP @@ -130,7 +132,7 @@ UNIV_INTERN os_ib_mutex_t os_file_seek_mutexes[OS_FILE_N_SEEK_MUTEXES]; #define OS_AIO_MERGE_N_CONSECUTIVE 64 #ifdef WITH_INNODB_DISALLOW_WRITES -#define WAIT_ALLOW_WRITES() os_event_wait(srv_allow_writes_event) +#define WAIT_ALLOW_WRITES() if (!IS_XTRABACKUP()) os_event_wait(srv_allow_writes_event) #else #define WAIT_ALLOW_WRITES() do { } while (0) #endif /* WITH_INNODB_DISALLOW_WRITES */ @@ -221,7 +223,7 @@ struct os_aio_slot_t{ ulint page_size; /*!< UNIV_PAGE_SIZE or zip_size */ os_offset_t offset; /*!< file offset in bytes */ - os_file_t file; /*!< file where to read or write */ + pfs_os_file_t file; /*!< file where to read or write */ const char* name; /*!< file name or path */ ibool io_already_done;/*!< used only in simulated aio: TRUE if the physical i/o already @@ -674,10 +676,9 @@ os_file_get_last_error_low( REFMAN "operating-system-error-codes.html\n"); } + fflush(stderr); } - fflush(stderr); - if (err == ERROR_FILE_NOT_FOUND) { return(OS_FILE_NOT_FOUND); } else if (err == ERROR_DISK_FULL) { @@ -1001,7 +1002,6 @@ os_file_lock( #ifndef UNIV_HOTBACKUP /****************************************************************//** Creates the seek mutexes used in positioned reads and writes. */ -static void os_io_init_simple(void) /*===================*/ @@ -1569,7 +1569,7 @@ A simple function to open or create a file. @return own: handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ UNIV_INTERN -os_file_t +pfs_os_file_t os_file_create_simple_no_error_handling_func( /*=========================================*/ const char* name, /*!< in: name of the file or path as a @@ -1585,7 +1585,7 @@ os_file_create_simple_no_error_handling_func( ulint atomic_writes) /*! in: atomic writes table option value */ { - os_file_t file; + pfs_os_file_t file; atomic_writes_t awrites = (atomic_writes_t) atomic_writes; *success = FALSE; @@ -1594,7 +1594,6 @@ os_file_create_simple_no_error_handling_func( DWORD create_flag; DWORD attributes = 0; DWORD share_mode = FILE_SHARE_READ; - ut_a(name); ut_a(!(create_mode & OS_FILE_ON_ERROR_SILENT)); @@ -1611,8 +1610,8 @@ os_file_create_simple_no_error_handling_func( ib_logf(IB_LOG_LEVEL_ERROR, "Unknown file create mode (%lu) for file '%s'", create_mode, name); - - return((os_file_t) -1); + file = INVALID_HANDLE_VALUE; + return(file); } if (access_type == OS_FILE_READ_ONLY) { @@ -1636,8 +1635,12 @@ os_file_create_simple_no_error_handling_func( ib_logf(IB_LOG_LEVEL_ERROR, "Unknown file access type (%lu) for file '%s'", access_type, name); + file = INVALID_HANDLE_VALUE; + return(file); + } - return((os_file_t) -1); + if (IS_XTRABACKUP()) { + share_mode |= FILE_SHARE_DELETE | FILE_SHARE_WRITE; } file = CreateFile((LPCTSTR) name, @@ -1665,11 +1668,10 @@ os_file_create_simple_no_error_handling_func( } } - *success = (file != INVALID_HANDLE_VALUE); + *success = file != INVALID_HANDLE_VALUE; #else /* __WIN__ */ int create_flag; const char* mode_str = NULL; - ut_a(name); if (create_mode != OS_FILE_OPEN && create_mode != OS_FILE_OPEN_RAW) WAIT_ALLOW_WRITES(); @@ -1714,13 +1716,13 @@ os_file_create_simple_no_error_handling_func( ib_logf(IB_LOG_LEVEL_ERROR, "Unknown file create mode (%lu) for file '%s'", create_mode, name); - - return((os_file_t) -1); + file = -1; + return(file); } - file = ::open(name, create_flag, os_innodb_umask); + file = open(name, create_flag, os_innodb_umask); - *success = file == -1 ? FALSE : TRUE; + *success = file != -1; /* This function is always called for data files, we should disable OS caching (O_DIRECT) here as we do in os_file_create_func(), so @@ -1869,7 +1871,7 @@ Opens an existing file or creates a new. @return own: handle to the file, not defined if error, error number can be retrieved with os_file_get_last_error */ UNIV_INTERN -os_file_t +pfs_os_file_t os_file_create_func( /*================*/ const char* name, /*!< in: name of the file or path as a @@ -1887,7 +1889,7 @@ os_file_create_func( ulint atomic_writes) /*! in: atomic writes table option value */ { - os_file_t file; + pfs_os_file_t file; ibool retry; ibool on_error_no_exit; ibool on_error_silent; @@ -1898,14 +1900,16 @@ os_file_create_func( "ib_create_table_fail_disk_full", *success = FALSE; SetLastError(ERROR_DISK_FULL); - return((os_file_t) -1); + file = INVALID_HANDLE_VALUE; + return(file); ); #else /* __WIN__ */ DBUG_EXECUTE_IF( "ib_create_table_fail_disk_full", *success = FALSE; errno = ENOSPC; - return((os_file_t) -1); + file = -1; + return(file); ); #endif /* __WIN__ */ @@ -1921,7 +1925,10 @@ os_file_create_func( create_mode &= ~OS_FILE_ON_ERROR_NO_EXIT; create_mode &= ~OS_FILE_ON_ERROR_SILENT; - + if (srv_backup_mode){ + /* Permit others to write, while I'm reading. */ + share_mode |= FILE_SHARE_WRITE; + } if (create_mode == OS_FILE_OPEN_RAW) { ut_a(!srv_read_only_mode); @@ -1956,7 +1963,8 @@ os_file_create_func( "Unknown file create mode (%lu) for file '%s'", create_mode, name); - return((os_file_t) -1); + file = INVALID_HANDLE_VALUE; + return(file); } DWORD attributes = 0; @@ -1980,8 +1988,8 @@ os_file_create_func( ib_logf(IB_LOG_LEVEL_ERROR, "Unknown purpose flag (%lu) while opening file '%s'", purpose, name); - - return((os_file_t)(-1)); + file = INVALID_HANDLE_VALUE; + return(file); } #ifdef UNIV_NON_BUFFERED_IO @@ -2063,7 +2071,6 @@ os_file_create_func( file = INVALID_HANDLE_VALUE; } } - #else /* __WIN__ */ int create_flag; const char* mode_str = NULL; @@ -2107,7 +2114,8 @@ os_file_create_func( "Unknown file create mode (%lu) for file '%s'", create_mode, name); - return((os_file_t) -1); + file = -1; + return(file); } ut_a(type == OS_LOG_FILE || type == OS_DATA_FILE); @@ -2127,7 +2135,7 @@ os_file_create_func( #endif /* O_SYNC */ do { - file = ::open(name, create_flag, os_innodb_umask); + file = open(name, create_flag, os_innodb_umask); if (file == -1) { const char* operation; @@ -2436,8 +2444,8 @@ os_file_close_func( Closes a file handle. @return TRUE if success */ UNIV_INTERN -ibool -os_file_close_no_error_handling( +bool +os_file_close_no_error_handling_func( /*============================*/ os_file_t file) /*!< in, own: handle to a file */ { @@ -2447,10 +2455,10 @@ os_file_close_no_error_handling( ret = CloseHandle(file); if (ret) { - return(TRUE); + return(true); } - return(FALSE); + return(false); #else int ret; @@ -2458,10 +2466,83 @@ os_file_close_no_error_handling( if (ret == -1) { - return(FALSE); + return(false); } - return(TRUE); + return(true); +#endif /* __WIN__ */ +} + +#ifdef HAVE_POSIX_FALLOCATE +/***********************************************************************//** +Ensures that disk space is allocated for the file. +@return TRUE if success */ +UNIV_INTERN +bool +os_file_allocate_func( + os_file_t file, /*!< in, own: handle to a file */ + os_offset_t offset, /*!< in: file region offset */ + os_offset_t len) /*!< in: file region length */ +{ + return(posix_fallocate(file, offset, len) == 0); +} +#endif + +/***********************************************************************//** +Checks if the file is marked as invalid. +@return TRUE if invalid */ +UNIV_INTERN +bool +os_file_is_invalid( + pfs_os_file_t file) /*!< in, own: handle to a file */ +{ + return(file == os_file_invalid); +} + +/***********************************************************************//** +Marks the file as invalid. */ +UNIV_INTERN +void +os_file_mark_invalid( + pfs_os_file_t* file) /*!< out: pointer to a handle to a file */ +{ + file->m_file = os_file_invalid; +} + +/***********************************************************************//** +Announces an intention to access file data in a specific pattern in the +future. +@return TRUE if success */ +UNIV_INTERN +bool +os_file_advise( + pfs_os_file_t file, /*!< in, own: handle to a file */ + os_offset_t offset, /*!< in: file region offset */ + os_offset_t len, /*!< in: file region length */ + ulint advice)/*!< in: advice for access pattern */ +{ +#ifdef __WIN__ + return(true); +#else +#ifdef UNIV_LINUX + int native_advice = 0; + if ((advice & OS_FILE_ADVISE_NORMAL) != 0) + native_advice |= POSIX_FADV_NORMAL; + if ((advice & OS_FILE_ADVISE_RANDOM) != 0) + native_advice |= POSIX_FADV_RANDOM; + if ((advice & OS_FILE_ADVISE_SEQUENTIAL) != 0) + native_advice |= POSIX_FADV_SEQUENTIAL; + if ((advice & OS_FILE_ADVISE_WILLNEED) != 0) + native_advice |= POSIX_FADV_WILLNEED; + if ((advice & OS_FILE_ADVISE_DONTNEED) != 0) + native_advice |= POSIX_FADV_DONTNEED; + if ((advice & OS_FILE_ADVISE_NOREUSE) != 0) + native_advice |= POSIX_FADV_NOREUSE; + + return(posix_fadvise(file, offset, len, native_advice) == 0); +#else + return(true); +#endif #endif /* __WIN__ */ } @@ -2472,7 +2553,7 @@ UNIV_INTERN os_offset_t os_file_get_size( /*=============*/ - os_file_t file) /*!< in: handle to a file */ + pfs_os_file_t file) /*!< in: handle to a file */ { #ifdef __WIN__ os_offset_t offset; @@ -2490,6 +2571,7 @@ os_file_get_size( return(offset); #else return((os_offset_t) lseek(file, 0, SEEK_END)); + #endif /* __WIN__ */ } @@ -2503,7 +2585,7 @@ UNIV_INTERN bool os_file_set_size( const char* name, - os_file_t file, + pfs_os_file_t file, os_offset_t size, bool is_sparse) { @@ -2612,8 +2694,8 @@ os_file_set_eof( Truncates a file at the specified position. @return TRUE if success */ UNIV_INTERN -ibool -os_file_set_eof_at( +bool +os_file_set_eof_at_func( os_file_t file, /*!< in: handle to a file */ ib_uint64_t new_len)/*!< in: new file length */ { @@ -3525,7 +3607,7 @@ os_file_get_status( fh = CreateFile( (LPCTSTR) path, // File to open access, - 0, // No sharing + FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, // Default security OPEN_EXISTING, // Existing file only FILE_ATTRIBUTE_NORMAL, // Normal file @@ -4317,7 +4399,7 @@ os_aio_init( #ifdef _WIN32 ut_a(completion_port == 0 && read_completion_port == 0); completion_port = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0); - read_completion_port = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0); + read_completion_port = srv_read_only_mode? completion_port : CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0); ut_a(completion_port && read_completion_port); #endif @@ -4547,7 +4629,7 @@ os_aio_array_reserve_slot( the aio operation */ void* message2,/*!< in: message to be passed along with the aio operation */ - os_file_t file, /*!< in: file handle */ + pfs_os_file_t file, /*!< in: file handle */ const char* name, /*!< in: name of the file or path as a null-terminated string */ void* buf, /*!< in: buffer where to read or from which @@ -4922,7 +5004,7 @@ os_aio_func( caution! */ const char* name, /*!< in: name of the file or path as a null-terminated string */ - os_file_t file, /*!< in: handle to a file */ + pfs_os_file_t file, /*!< in: handle to a file */ void* buf, /*!< in: buffer where to read or from which to write */ os_offset_t offset, /*!< in: file offset where to read or write */ @@ -4952,7 +5034,6 @@ os_aio_func( BOOL ret; #endif ulint wake_later; - ut_ad(buf); ut_ad(n > 0); ut_ad(n % OS_MIN_LOG_BLOCK_SIZE == 0); @@ -5199,7 +5280,6 @@ os_aio_windows_handle( break; } } - *message1 = slot->message1; *message2 = slot->message2; @@ -5223,12 +5303,14 @@ os_aio_windows_handle( switch (slot->type) { case OS_FILE_WRITE: - ret_val = os_file_write(slot->name, slot->file, slot->buf, - slot->offset, slot->len); + ret_val = os_file_write( + slot->name, slot->file, slot->buf, + slot->offset, slot->len); break; case OS_FILE_READ: - ret_val = os_file_read(slot->file, slot->buf, - slot->offset, slot->len); + ret_val = os_file_read( + slot->file, slot->buf, + slot->offset, slot->len); break; default: ut_error; @@ -5497,12 +5579,14 @@ found: iocb = &(slot->control); if (slot->type == OS_FILE_READ) { - io_prep_pread(&slot->control, slot->file, slot->buf, - slot->len, (off_t) slot->offset); + io_prep_pread(&slot->control, slot->file, + slot->buf, slot->len, + (off_t) slot->offset); } else { ut_a(slot->type == OS_FILE_WRITE); - io_prep_pwrite(&slot->control, slot->file, slot->buf, - slot->len, (off_t) slot->offset); + io_prep_pwrite(&slot->control, slot->file, + slot->buf, slot->len, + (off_t) slot->offset); } /* Resubmit an I/O request */ submit_ret = io_submit(array->aio_ctx[segment], 1, &iocb); @@ -5736,7 +5820,6 @@ consecutive_loop: os_aio_slot_t* slot; slot = os_aio_array_get_nth_slot(array, i + segment * n); - if (slot->reserved && slot != aio_slot && slot->offset == aio_slot->offset + aio_slot->len @@ -6290,7 +6373,9 @@ os_file_trim( #ifdef __linux__ #if defined(HAVE_FALLOC_PUNCH_HOLE_AND_KEEP_SIZE) - int ret = fallocate(slot->file, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, off, trim_len); + int ret = fallocate(slot->file, + FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, + off, trim_len); if (ret) { /* After first failure do not try to trim again */ @@ -6336,22 +6421,27 @@ os_file_trim( flt.Ranges[0].Offset = off; flt.Ranges[0].Length = trim_len; + OVERLAPPED overlapped = { 0 }; + overlapped.hEvent = win_get_syncio_event(); BOOL ret = DeviceIoControl(slot->file, FSCTL_FILE_LEVEL_TRIM, - &flt, sizeof(flt), NULL, NULL, NULL, NULL); - + &flt, sizeof(flt), NULL, NULL, NULL, &overlapped); + DWORD tmp; + if (ret) { + ret = GetOverlappedResult(slot->file, &overlapped, &tmp, FALSE); + } + else if (GetLastError() == ERROR_IO_PENDING) { + ret = GetOverlappedResult(slot->file, &overlapped, &tmp, TRUE); + } if (!ret) { + DWORD last_error = GetLastError(); /* After first failure do not try to trim again */ os_fallocate_failed = true; srv_use_trim = FALSE; ut_print_timestamp(stderr); - fprintf(stderr, - " InnoDB: Warning: fallocate call failed with error.\n" - " InnoDB: start: %lu len: %lu payload: %lu\n" - " InnoDB: Disabling fallocate for now.\n", off, trim_len, len); - os_file_handle_error_no_exit(slot->name, - " DeviceIOControl(FSCTL_FILE_LEVEL_TRIM) ", - FALSE, __FILE__, __LINE__); + fprintf(stderr, + " InnoDB: Warning: DeviceIoControl(FSCTL_FILE_LEVEL_TRIM) call failed with error %u%s. Disabling trimming.\n", + last_error, last_error == ERROR_NOT_SUPPORTED ? "(ERROR_NOT_SUPPORTED)" : ""); if (slot->write_size) { *slot->write_size = 0; diff --git a/storage/xtradb/page/page0cur.cc b/storage/xtradb/page/page0cur.cc index 76e4c2aed9b..692cb393afd 100644 --- a/storage/xtradb/page/page0cur.cc +++ b/storage/xtradb/page/page0cur.cc @@ -903,7 +903,7 @@ page_cur_parse_insert_rec( ut_print_buf(stderr, ptr2, 300); putc('\n', stderr); - buf_page_print(page, 0, 0); + buf_page_print(page, 0); ut_error; } diff --git a/storage/xtradb/page/page0page.cc b/storage/xtradb/page/page0page.cc index 3f8e47adafd..800f76e1532 100644 --- a/storage/xtradb/page/page0page.cc +++ b/storage/xtradb/page/page0page.cc @@ -154,7 +154,7 @@ page_dir_find_owner_slot( fputs("\n" "InnoDB: on that page!\n", stderr); - buf_page_print(page, 0, 0); + buf_page_print(page, 0); ut_error; } @@ -618,10 +618,8 @@ page_copy_rec_list_end_no_locks( /* Track an assertion failure reported on the mailing list on June 18th, 2003 */ - buf_page_print(new_page, 0, - BUF_PAGE_PRINT_NO_CRASH); - buf_page_print(page_align(rec), 0, - BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(new_page, 0); + buf_page_print(page_align(rec), 0); ut_print_timestamp(stderr); fprintf(stderr, @@ -1953,7 +1951,8 @@ page_check_dir( fprintf(stderr, "InnoDB: Page directory corruption:" " infimum not pointed to\n"); - buf_page_print(page, 0, 0); + buf_page_print(page, 0); + ut_ad(0); } if (UNIV_UNLIKELY(!page_rec_is_supremum_low(supremum_offs))) { @@ -1961,7 +1960,8 @@ page_check_dir( fprintf(stderr, "InnoDB: Page directory corruption:" " supremum not pointed to\n"); - buf_page_print(page, 0, 0); + buf_page_print(page, 0); + ut_ad(0); } } #endif /* !UNIV_HOTBACKUP */ @@ -2679,7 +2679,8 @@ func_exit2: (ulong) page_get_space_id(page), (ulong) page_get_page_no(page), index->name); - buf_page_print(page, 0, 0); + buf_page_print(page, 0); + ut_ad(0); } return(ret); diff --git a/storage/xtradb/page/page0zip.cc b/storage/xtradb/page/page0zip.cc index 32e76fb44e6..bf7b4928e61 100644 --- a/storage/xtradb/page/page0zip.cc +++ b/storage/xtradb/page/page0zip.cc @@ -2,7 +2,7 @@ Copyright (c) 2005, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2014, SkySQL Ab. All Rights Reserved. +Copyright (c) 2014, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -83,12 +83,12 @@ UNIV_INTERN mysql_pfs_key_t page_zip_stat_per_index_mutex_key; #endif /* !UNIV_INNOCHECKSUM */ #endif /* !UNIV_HOTBACKUP */ -/* Compression level to be used by zlib. Settable by user. */ -UNIV_INTERN uint page_zip_level = DEFAULT_COMPRESSION_LEVEL; +/** Compression level to be used by zlib. Settable by user. */ +UNIV_INTERN uint page_zip_level; -/* Whether or not to log compressed page images to avoid possible +/** Whether or not to log compressed page images to avoid possible compression algorithm changes in zlib. */ -UNIV_INTERN my_bool page_zip_log_pages = false; +UNIV_INTERN my_bool page_zip_log_pages; /* Please refer to ../include/page0zip.ic for a description of the compressed page format. */ diff --git a/storage/xtradb/rem/rem0rec.cc b/storage/xtradb/rem/rem0rec.cc index 6770748c38b..c62e8c90434 100644 --- a/storage/xtradb/rem/rem0rec.cc +++ b/storage/xtradb/rem/rem0rec.cc @@ -1293,8 +1293,10 @@ rec_convert_dtuple_to_rec_comp( } } - memcpy(end, dfield_get_data(field), len); - end += len; + if (len) { + memcpy(end, dfield_get_data(field), len); + end += len; + } } } diff --git a/storage/xtradb/row/row0ftsort.cc b/storage/xtradb/row/row0ftsort.cc index 4542aa31a6c..0f9c15f6a69 100644 --- a/storage/xtradb/row/row0ftsort.cc +++ b/storage/xtradb/row/row0ftsort.cc @@ -40,7 +40,7 @@ Created 10/13/2010 Jimmy Yang b[N] = row_merge_read_rec( \ block[N], buf[N], b[N], index, \ fd[N], &foffs[N], &mrec[N], offsets[N], \ - crypt_data, crypt_block[N], space); \ + crypt_block[N], space); \ if (UNIV_UNLIKELY(!b[N])) { \ if (mrec[N]) { \ goto exit; \ @@ -194,7 +194,6 @@ row_fts_psort_info_init( fts_psort_t* merge_info = NULL; ulint block_size; ibool ret = TRUE; - fil_space_crypt_t* crypt_data = NULL; bool encrypted = false; block_size = 3 * srv_sort_buf_size; @@ -225,21 +224,8 @@ row_fts_psort_info_init( common_info->merge_event = os_event_create(); common_info->opt_doc_id_size = opt_doc_id_size; - /* Theoretically the tablespace can be dropped straight away. - In practice, the DDL completion will wait for this thread to - finish. */ - if (fil_space_t* space = fil_space_acquire(new_table->space)) { - crypt_data = space->crypt_data; - fil_space_release(space); - } - - if (crypt_data && crypt_data->should_encrypt()) { - common_info->crypt_data = crypt_data; + if (log_tmp_is_encrypted()) { encrypted = true; - } else { - /* Not needed */ - common_info->crypt_data = NULL; - crypt_data = NULL; } ut_ad(trx->mysql_thd != NULL); @@ -249,9 +235,6 @@ row_fts_psort_info_init( each parallel sort thread. Each "sort bucket" holds records for a particular "FTS index partition" */ for (j = 0; j < fts_sort_pll_degree; j++) { - - UT_LIST_INIT(psort_info[j].fts_doc_list); - for (i = 0; i < FTS_NUM_AUX_INDEX; i++) { psort_info[j].merge_file[i] = @@ -580,11 +563,9 @@ row_merge_fts_doc_tokenize( cur_len += len; dfield_dup(field, buf->heap); - /* Reserve one byte for the end marker of row_merge_block_t - and we have reserved ROW_MERGE_RESERVE_SIZE (= 4) for - encryption key_version in the beginning of the buffer. */ + /* Reserve one byte for the end marker of row_merge_block_t */ if (buf->total_size + data_size[idx] + cur_len - >= (srv_sort_buf_size - 1 - ROW_MERGE_RESERVE_SIZE)) { + >= (srv_sort_buf_size - 1)) { buf_full = TRUE; break; @@ -678,7 +659,6 @@ fts_parallel_tokenization( fts_tokenize_ctx_t t_ctx; ulint retried = 0; dberr_t error = DB_SUCCESS; - fil_space_crypt_t* crypt_data = NULL; ut_ad(psort_info->psort_common->trx->mysql_thd != NULL); @@ -699,7 +679,6 @@ fts_parallel_tokenization( block = psort_info->merge_block; crypt_block = psort_info->crypt_block; - crypt_data = psort_info->psort_common->crypt_data; zip_size = dict_table_zip_size(table); row_merge_fts_get_next_doc_item(psort_info, &doc_item); @@ -794,7 +773,6 @@ loop: if (!row_merge_write(merge_file[t_ctx.buf_used]->fd, merge_file[t_ctx.buf_used]->offset++, block[t_ctx.buf_used], - crypt_data, crypt_block[t_ctx.buf_used], table->space)) { error = DB_TEMP_FILE_WRITE_FAILURE; @@ -890,7 +868,6 @@ exit: if (!row_merge_write(merge_file[i]->fd, merge_file[i]->offset++, block[i], - crypt_data, crypt_block[i], table->space)) { error = DB_TEMP_FILE_WRITE_FAILURE; @@ -930,7 +907,7 @@ exit: psort_info->psort_common->dup, merge_file[i], block[i], &tmpfd[i], false, 0.0/* pct_progress */, 0.0/* pct_cost */, - crypt_data, crypt_block[i], table->space); + crypt_block[i], table->space); if (error != DB_SUCCESS) { close(tmpfd[i]); @@ -1442,7 +1419,6 @@ row_fts_merge_insert( ulint start; fts_psort_insert_t ins_ctx; ulint count_diag = 0; - fil_space_crypt_t* crypt_data = NULL; ulint space; ut_ad(index); @@ -1456,7 +1432,6 @@ row_fts_merge_insert( ins_ctx.trx->op_info = "inserting index entries"; ins_ctx.opt_doc_id_size = psort_info[0].psort_common->opt_doc_id_size; - crypt_data = psort_info[0].psort_common->crypt_data; heap = mem_heap_create(500 + sizeof(mrec_buf_t)); @@ -1550,7 +1525,6 @@ row_fts_merge_insert( && (!row_merge_read( fd[i], foffs[i], (row_merge_block_t*) block[i], - crypt_data, (row_merge_block_t*) crypt_block[i], space))) { error = DB_CORRUPTION; diff --git a/storage/xtradb/row/row0import.cc b/storage/xtradb/row/row0import.cc index baa7bcbea09..86b2d782b7b 100644 --- a/storage/xtradb/row/row0import.cc +++ b/storage/xtradb/row/row0import.cc @@ -1995,6 +1995,7 @@ PageConverter::update_page( case FIL_PAGE_TYPE_XDES: err = set_current_xdes( buf_block_get_page_no(block), get_frame(block)); + /* fall through */ case FIL_PAGE_INODE: case FIL_PAGE_TYPE_TRX_SYS: case FIL_PAGE_IBUF_FREE_LIST: @@ -2030,15 +2031,12 @@ PageConverter::validate( buf_block_t* block) UNIV_NOTHROW { buf_frame_t* page = get_frame(block); - ulint space_id = mach_read_from_4( - page + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID); - fil_space_t* space = fil_space_found_by_id(space_id); /* Check that the page number corresponds to the offset in the file. Flag as corrupt if it doesn't. Disable the check for LSN in buf_page_is_corrupted() */ - if (buf_page_is_corrupted(false, page, get_zip_size(), space) + if (buf_page_is_corrupted(false, page, get_zip_size(), NULL) || (page_get_page_no(page) != offset / m_page_size && page_get_page_no(page) != 0)) { @@ -2201,7 +2199,7 @@ row_import_discard_changes( index->space = FIL_NULL; } - table->ibd_file_missing = TRUE; + table->file_unreadable = true; fil_close_tablespace(trx, table->space); } @@ -3447,7 +3445,7 @@ row_import_for_mysql( ut_a(table->space); ut_ad(prebuilt->trx); - ut_a(table->ibd_file_missing); + ut_a(table->file_unreadable); trx_start_if_not_started(prebuilt->trx); @@ -3620,7 +3618,7 @@ row_import_for_mysql( err = fil_open_single_table_tablespace( true, true, table->space, dict_tf_to_fsp_flags(table->flags), - table->name, filepath, table); + table->name, filepath); DBUG_EXECUTE_IF("ib_import_open_tablespace_failure", err = DB_TABLESPACE_NOT_FOUND;); @@ -3752,7 +3750,7 @@ row_import_for_mysql( return(row_import_error(prebuilt, trx, err)); } - table->ibd_file_missing = false; + table->file_unreadable = false; table->flags2 &= ~DICT_TF2_DISCARDED; if (autoinc != 0) { diff --git a/storage/xtradb/row/row0ins.cc b/storage/xtradb/row/row0ins.cc index 8dbf093a17d..33f8ec443dd 100644 --- a/storage/xtradb/row/row0ins.cc +++ b/storage/xtradb/row/row0ins.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -37,6 +38,7 @@ Created 4/20/1996 Heikki Tuuri #include "btr0btr.h" #include "btr0cur.h" #include "mach0data.h" +#include "ibuf0ibuf.h" #include "que0que.h" #include "row0upd.h" #include "row0sel.h" @@ -935,7 +937,7 @@ row_ins_invalidate_query_cache( mem_free(buf); } #ifdef WITH_WSREP -dberr_t wsrep_append_foreign_key(trx_t *trx, +dberr_t wsrep_append_foreign_key(trx_t *trx, dict_foreign_t* foreign, const rec_t* clust_rec, dict_index_t* clust_index, @@ -1295,11 +1297,12 @@ row_ins_foreign_check_on_constraint( #ifdef WITH_WSREP err = wsrep_append_foreign_key( - thr_get_trx(thr), - foreign, - clust_rec, - clust_index, - FALSE, FALSE); + thr_get_trx(thr), + foreign, + clust_rec, + clust_index, + FALSE, + (node) ? TRUE : FALSE); if (err != DB_SUCCESS) { fprintf(stderr, "WSREP: foreign key append failed: %d\n", err); @@ -1460,6 +1463,9 @@ row_ins_check_foreign_constraint( ulint* offsets = offsets_; rec_offs_init(offsets_); +#ifdef WITH_WSREP + upd_node= NULL; +#endif /* WITH_WSREP */ run_again: #ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&dict_operation_lock, RW_LOCK_SHARED)); @@ -1518,7 +1524,7 @@ run_again: } if (check_table == NULL - || check_table->ibd_file_missing + || check_table->file_unreadable || check_index == NULL) { if (!srv_read_only_mode && check_ref) { @@ -1649,9 +1655,10 @@ run_again: err = wsrep_append_foreign_key( thr_get_trx(thr), foreign, - rec, - check_index, - check_ref, TRUE); + rec, + check_index, + check_ref, + (upd_node) ? TRUE : FALSE); #endif /* WITH_WSREP */ goto end_scan; } else if (foreign->type != 0) { @@ -2166,14 +2173,10 @@ for a clustered index! @retval DB_SUCCESS if no error @retval DB_DUPLICATE_KEY if error, @retval DB_LOCK_WAIT if we have to wait for a lock on a possible duplicate -record -@retval DB_SUCCESS_LOCKED_REC if an exact match of the record was found -in online table rebuild (flags & (BTR_KEEP_SYS_FLAG | BTR_NO_LOCKING_FLAG)) */ +record */ static MY_ATTRIBUTE((nonnull, warn_unused_result)) dberr_t row_ins_duplicate_error_in_clust( -/*=============================*/ - ulint flags, /*!< in: undo logging and locking flags */ btr_cur_t* cursor, /*!< in: B-tree cursor */ const dtuple_t* entry, /*!< in: entry to insert */ que_thr_t* thr, /*!< in: query thread */ @@ -2410,8 +2413,7 @@ row_ins_clust_index_entry_low( &cursor, 0, __FILE__, __LINE__, &mtr); if (err != DB_SUCCESS) { - index->table->is_encrypted = true; - index->table->ibd_file_missing = true; + index->table->file_unreadable = true; mtr_commit(&mtr); goto func_exit; } @@ -2455,7 +2457,7 @@ row_ins_clust_index_entry_low( DB_LOCK_WAIT */ err = row_ins_duplicate_error_in_clust( - flags, &cursor, entry, thr, &mtr); + &cursor, entry, thr, &mtr); } if (err != DB_SUCCESS) { @@ -2771,7 +2773,7 @@ row_ins_sec_index_entry_low( " used key_id is not available. " " Can't continue reading table.", index->table->name); - index->table->is_encrypted = true; + index->table->file_unreadable = true; } goto func_exit; } @@ -3063,6 +3065,11 @@ row_ins_sec_index_entry( if (err == DB_FAIL) { mem_heap_empty(heap); + if (index->space == IBUF_SPACE_ID + && !dict_index_is_unique(index)) { + ibuf_free_excess_pages(); + } + /* Try then pessimistic descent to the B-tree */ log_free_check(); diff --git a/storage/xtradb/row/row0log.cc b/storage/xtradb/row/row0log.cc index a17ee405720..f49ff2f1530 100644 --- a/storage/xtradb/row/row0log.cc +++ b/storage/xtradb/row/row0log.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 2011, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -181,6 +182,7 @@ struct row_log_t { dict_table_t* table; /*!< table that is being rebuilt, or NULL when this is a secondary index that is being created online */ + dict_index_t* index; /*!< index to be build */ bool same_pk;/*!< whether the definition of the PRIMARY KEY has remained the same */ const dtuple_t* add_cols; @@ -196,8 +198,14 @@ struct row_log_t { row_log_buf_t tail; /*!< writer context; protected by mutex and index->lock S-latch, or by index->lock X-latch only */ + byte* crypt_tail; /*!< writer context; + temporary buffer used in encryption, + decryption or NULL*/ row_log_buf_t head; /*!< reader context; protected by MDL only; modifiable by row_log_apply_ops() */ + byte* crypt_head; /*!< reader context; + temporary buffer used in encryption, + decryption or NULL */ const char* path; /*!< where to create temporary file during log operation */ }; @@ -348,6 +356,7 @@ row_log_online_op( = (os_offset_t) log->tail.blocks * srv_sort_buf_size; ibool ret; + byte * buf = log->tail.block; if (byte_offset + srv_sort_buf_size >= srv_online_max_size) { goto write_failed; @@ -367,11 +376,29 @@ row_log_online_op( goto err_exit; } - ret = os_file_write( + /* If encryption is enabled encrypt buffer before writing it + to file system. */ + if (log_tmp_is_encrypted()) { + if (!log_tmp_block_encrypt(log->tail.block, + srv_sort_buf_size, + log->crypt_tail, + byte_offset, + index->table->space)) { + log->error = DB_DECRYPTION_FAILED; + goto err_exit; + } + + srv_stats.n_rowlog_blocks_encrypted.inc(); + buf = log->crypt_tail; + } + + ret = os_file_write_int_fd( "(modification log)", - OS_FILE_FROM_FD(log->fd), - log->tail.block, byte_offset, srv_sort_buf_size); + log->fd, + buf, byte_offset, srv_sort_buf_size); + log->tail.blocks++; + if (!ret) { write_failed: /* We set the flag directly instead of invoking @@ -379,7 +406,9 @@ write_failed: because the index is not "public" yet. */ index->type |= DICT_CORRUPT; } + UNIV_MEM_INVALID(log->tail.block, srv_sort_buf_size); + memcpy(log->tail.block, log->tail.buf + avail_size, mrec_size - avail_size); log->tail.bytes = mrec_size - avail_size; @@ -464,6 +493,7 @@ row_log_table_close_func( = (os_offset_t) log->tail.blocks * srv_sort_buf_size; ibool ret; + byte * buf = log->tail.block; if (byte_offset + srv_sort_buf_size >= srv_online_max_size) { goto write_failed; @@ -483,11 +513,29 @@ row_log_table_close_func( goto err_exit; } - ret = os_file_write( + /* If encryption is enabled encrypt buffer before writing it + to file system. */ + if (log_tmp_is_encrypted()) { + if (!log_tmp_block_encrypt(log->tail.block, + srv_sort_buf_size, + log->crypt_tail, + byte_offset, + log->index->table->space)) { + log->error = DB_DECRYPTION_FAILED; + goto err_exit; + } + + srv_stats.n_rowlog_blocks_encrypted.inc(); + buf = log->crypt_tail; + } + + ret = os_file_write_int_fd( "(modification log)", - OS_FILE_FROM_FD(log->fd), - log->tail.block, byte_offset, srv_sort_buf_size); + log->fd, + buf, byte_offset, srv_sort_buf_size); + log->tail.blocks++; + if (!ret) { write_failed: log->error = DB_ONLINE_LOG_TOO_BIG; @@ -1880,6 +1928,7 @@ row_log_table_apply_update( When applying the subsequent ROW_T_DELETE, no matching record will be found. */ + /* fall through */ case DB_SUCCESS: ut_ad(row != NULL); break; @@ -2617,11 +2666,29 @@ all_done: goto func_exit; } - success = os_file_read_no_error_handling( - OS_FILE_FROM_FD(index->online_log->fd), - index->online_log->head.block, ofs, + byte * buf = index->online_log->head.block; + + success = os_file_read_no_error_handling_int_fd( + index->online_log->fd, + buf, ofs, srv_sort_buf_size); + /* If encryption is enabled decrypt buffer after reading it + from file system. */ + if (log_tmp_is_encrypted()) { + if (!log_tmp_block_decrypt(buf, + srv_sort_buf_size, + index->online_log->crypt_head, + ofs, + index->table->space)) { + error = DB_DECRYPTION_FAILED; + goto func_exit; + } + + srv_stats.n_rowlog_blocks_decrypted.inc(); + memcpy(buf, index->online_log->crypt_head, srv_sort_buf_size); + } + if (!success) { fprintf(stderr, "InnoDB: unable to read temporary file" " for table %s\n", index->table_name); @@ -2928,9 +2995,22 @@ row_log_allocate( log->head.blocks = log->head.bytes = 0; log->head.total = 0; log->path = path; + log->crypt_tail = log->crypt_head = NULL; + log->index = index; dict_index_set_online_status(index, ONLINE_INDEX_CREATION); index->online_log = log; + if (log_tmp_is_encrypted()) { + ulint size = srv_sort_buf_size; + log->crypt_head = static_cast(os_mem_alloc_large(&size)); + log->crypt_tail = static_cast(os_mem_alloc_large(&size)); + + if (!log->crypt_head || !log->crypt_tail) { + row_log_free(log); + DBUG_RETURN(false); + } + } + /* While we might be holding an exclusive data dictionary lock here, in row_log_abort_sec() we will not always be holding it. Use atomic operations in both cases. */ @@ -2953,6 +3033,15 @@ row_log_free( row_log_block_free(log->tail); row_log_block_free(log->head); row_merge_file_destroy_low(log->fd); + + if (log->crypt_head) { + os_mem_free_large(log->crypt_head, srv_sort_buf_size); + } + + if (log->crypt_tail) { + os_mem_free_large(log->crypt_tail, srv_sort_buf_size); + } + mutex_free(&log->mutex); ut_free(log); log = 0; @@ -3444,11 +3533,29 @@ all_done: goto func_exit; } - success = os_file_read_no_error_handling( - OS_FILE_FROM_FD(index->online_log->fd), - index->online_log->head.block, ofs, + byte* buf = index->online_log->head.block; + + success = os_file_read_no_error_handling_int_fd( + index->online_log->fd, + buf, ofs, srv_sort_buf_size); + /* If encryption is enabled decrypt buffer after reading it + from file system. */ + if (log_tmp_is_encrypted()) { + if (!log_tmp_block_decrypt(buf, + srv_sort_buf_size, + index->online_log->crypt_head, + ofs, + index->table->space)) { + error = DB_DECRYPTION_FAILED; + goto func_exit; + } + + srv_stats.n_rowlog_blocks_decrypted.inc(); + memcpy(buf, index->online_log->crypt_head, srv_sort_buf_size); + } + if (!success) { fprintf(stderr, "InnoDB: unable to read temporary file" " for index %s\n", index->name + 1); @@ -3674,7 +3781,7 @@ row_log_apply( rw_lock_x_lock(dict_index_get_lock(index)); - if (!dict_table_is_corrupted(index->table)) { + if (!index->table->corrupted) { error = row_log_apply_ops(trx, index, &dup); } else { error = DB_SUCCESS; diff --git a/storage/xtradb/row/row0merge.cc b/storage/xtradb/row/row0merge.cc index 24cd9687a47..d38f10ee7ba 100644 --- a/storage/xtradb/row/row0merge.cc +++ b/storage/xtradb/row/row0merge.cc @@ -79,88 +79,6 @@ UNIV_INTERN char srv_disable_sort_file_cache; /* Maximum pending doc memory limit in bytes for a fts tokenization thread */ #define FTS_PENDING_DOC_MEMORY_LIMIT 1000000 - -/******************************************************//** -Encrypt a merge block. */ -static -void -row_merge_encrypt_buf( -/*==================*/ - fil_space_crypt_t* crypt_data, /*!< in: table crypt data */ - ulint offset, /*!< in: offset where to - write */ - ulint space, /*!< in: tablespace id */ - const byte* input_buf, /*!< in: input buffer */ - byte* crypted_buf) /*!< out: crypted buffer */ -{ - uint key_version; - uint dstlen=0; - os_offset_t ofs = (os_offset_t)srv_sort_buf_size * (os_offset_t)offset; - - key_version = encryption_key_get_latest_version(crypt_data->key_id); - - /* Store key_version at the beginning of the input buffer */ - mach_write_to_4((byte *)crypted_buf, key_version); - - int rc = encryption_scheme_encrypt(input_buf+ROW_MERGE_RESERVE_SIZE, - srv_sort_buf_size-ROW_MERGE_RESERVE_SIZE, - crypted_buf+ROW_MERGE_RESERVE_SIZE, &dstlen, - crypt_data, key_version, - space, ofs, 0); - - if (! ((rc == MY_AES_OK) && ((ulint)dstlen == srv_sort_buf_size-ROW_MERGE_RESERVE_SIZE))) { - ib_logf(IB_LOG_LEVEL_FATAL, - "Unable to encrypt data-block " - " src: %p srclen: %lu buf: %p buflen: %u." - " return-code: %d. Can't continue!\n", - input_buf, srv_sort_buf_size, - crypted_buf, dstlen, rc); - } -} - -/******************************************************//** -Decrypt a merge block. */ -static -bool -row_merge_decrypt_buf( -/*==================*/ - fil_space_crypt_t* crypt_data, /*!< in: table crypt data */ - ulint offset, /*!< in: offset where to - write */ - ulint space, /*!< in: tablespace id */ - const byte* input_buf, /*!< in: input buffer */ - byte* crypted_buf) /*!< out: crypted buffer */ -{ - uint key_version; - uint dstlen=0; - os_offset_t ofs = (os_offset_t)srv_sort_buf_size * (os_offset_t)offset; - - /* Read key_version from beginning of the buffer */ - key_version = mach_read_from_4((byte *)input_buf); - - if (key_version == 0) { - /* block not encrypted */ - return false; - } - - int rc = encryption_scheme_decrypt(input_buf+ROW_MERGE_RESERVE_SIZE, - srv_sort_buf_size-ROW_MERGE_RESERVE_SIZE, - crypted_buf+ROW_MERGE_RESERVE_SIZE, &dstlen, - crypt_data, key_version, - space, ofs, 0); - - if (! ((rc == MY_AES_OK) && ((ulint)dstlen == srv_sort_buf_size-ROW_MERGE_RESERVE_SIZE))) { - ib_logf(IB_LOG_LEVEL_FATAL, - "Unable to encrypt data-block " - " src: %p srclen: %lu buf: %p buflen: %d." - " return-code: %d. Can't continue!\n", - input_buf, srv_sort_buf_size, - crypted_buf, dstlen, rc); - } - - return (true); -} - #ifdef UNIV_DEBUG /******************************************************//** Display a merge tuple. */ @@ -279,7 +197,7 @@ row_merge_buf_create( ulint buf_size; mem_heap_t* heap; - max_tuples = (srv_sort_buf_size - ROW_MERGE_RESERVE_SIZE) + max_tuples = (srv_sort_buf_size) / ut_max(1, dict_index_get_min_size(index)); buf_size = (sizeof *buf); @@ -702,7 +620,7 @@ row_merge_buf_add( ut_ad(data_size < srv_sort_buf_size); /* Reserve bytes for the end marker of row_merge_block_t. */ - if (buf->total_size + data_size >= (srv_sort_buf_size - ROW_MERGE_RESERVE_SIZE)) { + if (buf->total_size + data_size >= srv_sort_buf_size) { DBUG_RETURN(0); } @@ -823,7 +741,7 @@ UT_SORT_FUNCTION_BODY(). /**********************************************************************//** Merge sort the tuple buffer in main memory. */ -static MY_ATTRIBUTE((nonnull(4,5))) +static void row_merge_tuple_sort( /*=================*/ @@ -874,7 +792,7 @@ row_merge_buf_write( { const dict_index_t* index = buf->index; ulint n_fields= dict_index_get_n_fields(index); - byte* b = &block[ROW_MERGE_RESERVE_SIZE]; + byte* b = &block[0]; for (ulint i = 0; i < buf->n_tuples; i++) { const mtuple_t* entry = &buf->tuples[i]; @@ -893,7 +811,7 @@ row_merge_buf_write( /* Write an "end-of-chunk" marker. */ ut_a(b < &block[srv_sort_buf_size]); - ut_a(b == &block[0] + buf->total_size + ROW_MERGE_RESERVE_SIZE); + ut_a(b == &block[0] + buf->total_size); *b++ = 0; #ifdef UNIV_DEBUG_VALGRIND /* The rest of the block is uninitialized. Initialize it @@ -943,7 +861,7 @@ row_merge_heap_create( Read a merge block from the file system. @return TRUE if request was successful, FALSE if fail */ UNIV_INTERN -ibool +bool row_merge_read( /*===========*/ int fd, /*!< in: file descriptor */ @@ -951,12 +869,11 @@ row_merge_read( in number of row_merge_block_t elements */ row_merge_block_t* buf, /*!< out: data */ - fil_space_crypt_t* crypt_data,/*!< in: table crypt data */ row_merge_block_t* crypt_buf, /*!< in: crypt buf or NULL */ - ulint space) /*!< in: space id */ + ulint space) /*!< in: space id */ { os_offset_t ofs = ((os_offset_t) offset) * srv_sort_buf_size; - ibool success; + bool success; DBUG_EXECUTE_IF("row_merge_read_failure", return(FALSE);); @@ -967,14 +884,18 @@ row_merge_read( } #endif /* UNIV_DEBUG */ - success = os_file_read_no_error_handling(OS_FILE_FROM_FD(fd), buf, - ofs, srv_sort_buf_size); + success = os_file_read_no_error_handling_int_fd(fd, buf, + ofs, srv_sort_buf_size); /* For encrypted tables, decrypt data after reading and copy data */ - if (crypt_data && crypt_buf) { - if( row_merge_decrypt_buf(crypt_data, offset, space, buf, crypt_buf)) { - memcpy(buf, crypt_buf, srv_sort_buf_size); + if (log_tmp_is_encrypted()) { + if (!log_tmp_block_decrypt(buf, srv_sort_buf_size, + crypt_buf, ofs, space)) { + return (FALSE); } + + srv_stats.n_merge_blocks_decrypted.inc(); + memcpy(buf, crypt_buf, srv_sort_buf_size); } #ifdef POSIX_FADV_DONTNEED @@ -996,34 +917,35 @@ row_merge_read( Write a merge block to the file system. @return TRUE if request was successful, FALSE if fail */ UNIV_INTERN -ibool +bool row_merge_write( /*============*/ int fd, /*!< in: file descriptor */ ulint offset, /*!< in: offset where to write, in number of row_merge_block_t elements */ const void* buf, /*!< in: data */ - fil_space_crypt_t* crypt_data, /*!< in: table crypt data */ void* crypt_buf, /*!< in: crypt buf or NULL */ ulint space) /*!< in: space id */ { size_t buf_len = srv_sort_buf_size; os_offset_t ofs = buf_len * (os_offset_t) offset; - ibool ret; + bool ret; void* out_buf = (void *)buf; DBUG_EXECUTE_IF("row_merge_write_failure", return(FALSE);); /* For encrypted tables, encrypt data before writing */ - if (crypt_data && crypt_buf) { - row_merge_encrypt_buf(crypt_data, offset, space, (const byte *)buf, (byte *)crypt_buf); + if (log_tmp_is_encrypted()) { + if (!log_tmp_block_encrypt((const byte *)buf, buf_len, + (byte *)crypt_buf, ofs, space)) { + return (FALSE); + } + + srv_stats.n_merge_blocks_encrypted.inc(); out_buf = crypt_buf; - } else { - /* Mark block unencrypted */ - mach_write_to_4((byte *)out_buf, 0); } - ret = os_file_write("(merge)", OS_FILE_FROM_FD(fd), out_buf, ofs, buf_len); + ret = os_file_write_int_fd("(merge)", fd, out_buf, ofs, buf_len); #ifdef UNIV_DEBUG if (row_merge_print_block_write) { @@ -1058,9 +980,8 @@ row_merge_read_rec( or NULL on end of list (non-NULL on I/O error) */ ulint* offsets,/*!< out: offsets of mrec */ - fil_space_crypt_t* crypt_data,/*!< in: table crypt data */ row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */ - ulint space) /*!< in: space id */ + ulint space) /*!< in: space id */ { ulint extra_size; ulint data_size; @@ -1072,10 +993,6 @@ row_merge_read_rec( ut_ad(*offsets == 1 + REC_OFFS_HEADER_SIZE + dict_index_get_n_fields(index)); - if (b == &block[0]) { - b+= ROW_MERGE_RESERVE_SIZE; - } - extra_size = *b++; if (UNIV_UNLIKELY(!extra_size)) { @@ -1097,7 +1014,8 @@ row_merge_read_rec( if (UNIV_UNLIKELY(b >= &block[srv_sort_buf_size])) { if (!row_merge_read(fd, ++(*foffs), block, - crypt_data, crypt_block, space)) { + crypt_block, + space)) { err_exit: /* Signal I/O error. */ *mrec = b; @@ -1105,7 +1023,7 @@ err_exit: } /* Wrap around to the beginning of the buffer. */ - b = &block[ROW_MERGE_RESERVE_SIZE]; + b = &block[0]; } extra_size = (extra_size & 0x7f) << 8; @@ -1127,13 +1045,14 @@ err_exit: memcpy(*buf, b, avail_size); if (!row_merge_read(fd, ++(*foffs), block, - crypt_data, crypt_block, space)) { + crypt_block, + space)) { goto err_exit; } /* Wrap around to the beginning of the buffer. */ - b = &block[ROW_MERGE_RESERVE_SIZE]; + b = &block[0]; /* Copy the record. */ memcpy(*buf + avail_size, b, extra_size - avail_size); @@ -1189,13 +1108,14 @@ err_exit: #endif /* UNIV_DEBUG */ if (!row_merge_read(fd, ++(*foffs), block, - crypt_data, crypt_block, space)) { + crypt_block, + space)) { goto err_exit; } /* Wrap around to the beginning of the buffer. */ - b = &block[ROW_MERGE_RESERVE_SIZE]; + b = &block[0]; /* Copy the rest of the record. */ memcpy(*buf + avail_size, b, extra_size + data_size - avail_size); @@ -1272,9 +1192,8 @@ row_merge_write_rec( ulint* foffs, /*!< in/out: file offset */ const mrec_t* mrec, /*!< in: record to write */ const ulint* offsets,/*!< in: offsets of mrec */ - fil_space_crypt_t* crypt_data,/*!< in: table crypt data */ row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */ - ulint space) /*!< in: space id */ + ulint space) /*!< in: space id */ { ulint extra_size; ulint size; @@ -1295,10 +1214,6 @@ row_merge_write_rec( size = extra_size + (extra_size >= 0x80) + rec_offs_data_size(offsets); - if (b == &block[0]) { - b+= ROW_MERGE_RESERVE_SIZE; - } - if (UNIV_UNLIKELY(b + size >= &block[srv_sort_buf_size])) { /* The record spans two blocks. Copy it to the temporary buffer first. */ @@ -1314,14 +1229,15 @@ row_merge_write_rec( memcpy(b, buf[0], avail_size); if (!row_merge_write(fd, (*foffs)++, block, - crypt_data, crypt_block, space)) { + crypt_block, + space)) { return(NULL); } UNIV_MEM_INVALID(&block[0], srv_sort_buf_size); /* Copy the rest. */ - b = &block[ROW_MERGE_RESERVE_SIZE]; + b = &block[0]; memcpy(b, buf[0] + avail_size, size - avail_size); b += size - avail_size; } else { @@ -1344,7 +1260,6 @@ row_merge_write_eof( byte* b, /*!< in: pointer to end of block */ int fd, /*!< in: file descriptor */ ulint* foffs, /*!< in/out: file offset */ - fil_space_crypt_t* crypt_data, /*!< in: table crypt data */ row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */ ulint space) /*!< in: space id */ { @@ -1359,10 +1274,6 @@ row_merge_write_eof( } #endif /* UNIV_DEBUG */ - if (b == &block[0]) { - b+= ROW_MERGE_RESERVE_SIZE; - } - *b++ = 0; UNIV_MEM_ASSERT_RW(&block[0], b - &block[0]); UNIV_MEM_ASSERT_W(&block[0], srv_sort_buf_size); @@ -1374,7 +1285,8 @@ row_merge_write_eof( #endif /* UNIV_DEBUG_VALGRIND */ if (!row_merge_write(fd, (*foffs)++, block, - crypt_data, crypt_block, space)) { + crypt_block, + space)) { return(NULL); } @@ -1451,8 +1363,10 @@ containing the index entries for the indexes to be built. @param[in,out] sequence autoinc sequence @param[in,out] block file buffer @param[in,out] tmpfd temporary file handle -return DB_SUCCESS or error */ -static MY_ATTRIBUTE((nonnull(1,2,3,4,6,9,10,16), warn_unused_result)) +@param[in] pct_cost percent of task weight out of total alter job +@param[in,out] crypt_block crypted file buffer +@return DB_SUCCESS or error */ +static MY_ATTRIBUTE((warn_unused_result)) dberr_t row_merge_read_clustered_index( trx_t* trx, @@ -1472,11 +1386,8 @@ row_merge_read_clustered_index( ib_sequence_t& sequence, row_merge_block_t* block, int* tmpfd, - float pct_cost, /*!< in: percent of task weight - out of total alter job */ - fil_space_crypt_t* crypt_data,/*!< in: crypt data or NULL */ - row_merge_block_t* crypt_block)/*!< in: in/out: crypted file - buffer */ + float pct_cost, + row_merge_block_t* crypt_block) { dict_index_t* clust_index; /* Clustered index */ mem_heap_t* row_heap; /* Heap memory to create @@ -1620,7 +1531,8 @@ row_merge_read_clustered_index( page_cur_t* cur = btr_pcur_get_page_cur(&pcur); /* Do not continue if table pages are still encrypted */ - if (old_table->is_encrypted || new_table->is_encrypted) { + if (!old_table->is_readable() || + !new_table->is_readable()) { err = DB_DECRYPTION_FAILED; trx->error_key_num = 0; goto func_exit; @@ -2013,7 +1925,7 @@ write_buffers: row_merge_buf_write(buf, file, block); if (!row_merge_write(file->fd, file->offset++, - block, crypt_data, crypt_block, + block, crypt_block, new_table->space)) { err = DB_TEMP_FILE_WRITE_FAILURE; trx->error_key_num = i; @@ -2065,7 +1977,7 @@ write_buffers: if(read_rows % 1000 == 0) { /* Update progress for each 1000 rows */ curr_progress = (read_rows >= table_total_rows) ? - pct_cost : + pct_cost : ((pct_cost * read_rows) / table_total_rows); /* presenting 10.12% as 1012 integer */ onlineddl_pct_progress = (ulint) (curr_progress * 100); @@ -2194,9 +2106,8 @@ wait_again: &buf[2], b2, \ of->fd, &of->offset, \ mrec##N, offsets##N, \ - crypt_data, \ crypt_block ? &crypt_block[2 * srv_sort_buf_size] : NULL , \ - space); \ + space); \ if (UNIV_UNLIKELY(!b2 || ++of->n_rec > file->n_rec)) { \ goto corrupt; \ } \ @@ -2204,7 +2115,6 @@ wait_again: &buf[N], b##N, INDEX, \ file->fd, foffs##N, \ &mrec##N, offsets##N, \ - crypt_data, \ crypt_block ? &crypt_block[N * srv_sort_buf_size] : NULL, \ space); \ \ @@ -2219,7 +2129,7 @@ wait_again: /*************************************************************//** Merge two blocks of records on disk and write a bigger block. @return DB_SUCCESS or error code */ -static __attribute__((nonnull(1,2,3,4,5,6), warn_unused_result)) +static __attribute__((warn_unused_result)) dberr_t row_merge_blocks( /*=============*/ @@ -2233,7 +2143,6 @@ row_merge_blocks( ulint* foffs1, /*!< in/out: offset of second source list in the file */ merge_file_t* of, /*!< in/out: output file */ - fil_space_crypt_t* crypt_data,/*!< in: crypt data or NULL */ row_merge_block_t* crypt_block,/*!< in: in/out: crypted file buffer */ ulint space) /*!< in: space id */ @@ -2269,9 +2178,11 @@ row_merge_blocks( file in two halves, which can be merged on the following pass. */ if (!row_merge_read(file->fd, *foffs0, &block[0], - crypt_data, crypt_block ? &crypt_block[0] : NULL, space) - || !row_merge_read(file->fd, *foffs1, &block[srv_sort_buf_size], - crypt_data, crypt_block ? &crypt_block[srv_sort_buf_size] : NULL, space)) { + crypt_block ? &crypt_block[0] : NULL, + space) || + !row_merge_read(file->fd, *foffs1, &block[srv_sort_buf_size], + crypt_block ? &crypt_block[srv_sort_buf_size] : NULL, + space)) { corrupt: mem_heap_free(heap); return(DB_CORRUPTION); @@ -2284,13 +2195,15 @@ corrupt: b0 = row_merge_read_rec( &block[0], &buf[0], b0, dup->index, file->fd, foffs0, &mrec0, offsets0, - crypt_data, crypt_block ? &crypt_block[0] : NULL, space); + crypt_block ? &crypt_block[0] : NULL, + space); b1 = row_merge_read_rec( &block[srv_sort_buf_size], &buf[srv_sort_buf_size], b1, dup->index, file->fd, foffs1, &mrec1, offsets1, - crypt_data, crypt_block ? &crypt_block[srv_sort_buf_size] : NULL, space); + crypt_block ? &crypt_block[srv_sort_buf_size] : NULL, + space); if (UNIV_UNLIKELY(!b0 && mrec0) || UNIV_UNLIKELY(!b1 && mrec1)) { @@ -2336,7 +2249,8 @@ done1: b2 = row_merge_write_eof(&block[2 * srv_sort_buf_size], b2, of->fd, &of->offset, - crypt_data, crypt_block ? &crypt_block[2 * srv_sort_buf_size] : NULL, space); + crypt_block ? &crypt_block[2 * srv_sort_buf_size] : NULL, + space); return(b2 ? DB_SUCCESS : DB_CORRUPTION); } @@ -2344,8 +2258,8 @@ done1: /*************************************************************//** Copy a block of index entries. @return TRUE on success, FALSE on failure */ -static __attribute__((nonnull(1,2,3,4,5), warn_unused_result)) -ibool +static __attribute__((warn_unused_result)) +bool row_merge_blocks_copy( /*==================*/ const dict_index_t* index, /*!< in: index being created */ @@ -2353,9 +2267,8 @@ row_merge_blocks_copy( row_merge_block_t* block, /*!< in/out: 3 buffers */ ulint* foffs0, /*!< in/out: input file offset */ merge_file_t* of, /*!< in/out: output file */ - fil_space_crypt_t* crypt_data,/*!< in: table crypt data */ row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */ - ulint space) /*!< in: space id */ + ulint space) /*!< in: space id */ { mem_heap_t* heap; /*!< memory heap for offsets0, offsets1 */ @@ -2383,7 +2296,8 @@ row_merge_blocks_copy( file in two halves, which can be merged on the following pass. */ if (!row_merge_read(file->fd, *foffs0, &block[0], - crypt_data, crypt_block ? &crypt_block[0] : NULL, space)) { + crypt_block ? &crypt_block[0] : NULL, + space)) { corrupt: mem_heap_free(heap); return(FALSE); @@ -2395,7 +2309,8 @@ corrupt: b0 = row_merge_read_rec(&block[0], &buf[0], b0, index, file->fd, foffs0, &mrec0, offsets0, - crypt_data, crypt_block ? &crypt_block[0] : NULL, space); + crypt_block ? &crypt_block[0] : NULL, + space); if (UNIV_UNLIKELY(!b0 && mrec0)) { @@ -2418,15 +2333,15 @@ done0: return(row_merge_write_eof(&block[2 * srv_sort_buf_size], b2, of->fd, &of->offset, - crypt_data, - crypt_block ? &crypt_block[2 * srv_sort_buf_size] : NULL, space) + crypt_block ? &crypt_block[2 * srv_sort_buf_size] : NULL, + space) != NULL); } /*************************************************************//** Merge disk files. @return DB_SUCCESS or error code */ -static __attribute__((nonnull(1,2,3,4,5,6,7))) +static dberr_t row_merge( /*======*/ @@ -2442,9 +2357,8 @@ row_merge( ulint* run_offset, /*!< in/out: Array contains the first offset number for each merge run */ - fil_space_crypt_t* crypt_data,/*!< in: table crypt data */ row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */ - ulint space) /*!< in: space id */ + ulint space) /*!< in: space id */ { ulint foffs0; /*!< first input offset */ ulint foffs1; /*!< second input offset */ @@ -2492,7 +2406,8 @@ row_merge( error = row_merge_blocks(dup, file, block, &foffs0, &foffs1, &of, - crypt_data, crypt_block, space); + crypt_block, + space); if (error != DB_SUCCESS) { return(error); @@ -2513,7 +2428,8 @@ row_merge( if (!row_merge_blocks_copy(dup->index, file, block, &foffs0, &of, - crypt_data, crypt_block, space)) { + crypt_block, + space)) { return(DB_CORRUPTION); } } @@ -2531,7 +2447,8 @@ row_merge( if (!row_merge_blocks_copy(dup->index, file, block, &foffs1, &of, - crypt_data, crypt_block, space)) { + crypt_block, + space)) { return(DB_CORRUPTION); } } @@ -2587,9 +2504,8 @@ row_merge_sort( /*!< in: total progress percent until now */ const float pct_cost, /*!< in: current progress percent */ - fil_space_crypt_t* crypt_data,/*!< in: table crypt data */ row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */ - ulint space) /*!< in: space id */ + ulint space) /*!< in: space id */ { const ulint half = file->offset / 2; ulint num_runs; @@ -2649,7 +2565,8 @@ row_merge_sort( error = row_merge(trx, dup, file, block, tmpfd, &num_runs, run_offset, - crypt_data, crypt_block, space); + crypt_block, + space); if(update_progress) { merge_count++; @@ -2724,7 +2641,7 @@ row_merge_copy_blobs( Read sorted file containing index data tuples and insert these data tuples to the index @return DB_SUCCESS or error number */ -static __attribute__((nonnull(2,3,5), warn_unused_result)) +static __attribute__((warn_unused_result)) dberr_t row_merge_insert_index_tuples( /*==========================*/ @@ -2737,9 +2654,8 @@ row_merge_insert_index_tuples( const float pct_progress, /*!< in: total progress percent until now */ const float pct_cost, /*!< in: current progress percent */ - fil_space_crypt_t* crypt_data,/*!< in: table crypt data */ row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */ - ulint space) /*!< in: space id */ + ulint space) /*!< in: space id */ { const byte* b; mem_heap_t* heap; @@ -2773,7 +2689,8 @@ row_merge_insert_index_tuples( b = &block[0]; if (!row_merge_read(fd, foffs, block, - crypt_data, crypt_block, space)) { + crypt_block, + space)) { error = DB_CORRUPTION; } else { buf = static_cast( @@ -2790,7 +2707,9 @@ row_merge_insert_index_tuples( b = row_merge_read_rec(block, buf, b, index, fd, &foffs, &mrec, offsets, - crypt_data, crypt_block, space); + crypt_block, + space); + if (UNIV_UNLIKELY(!b)) { /* End of list, or I/O error */ if (mrec) { @@ -3426,14 +3345,21 @@ row_merge_file_create_low( performance schema */ struct PSI_file_locker* locker = NULL; PSI_file_locker_state state; - register_pfs_file_open_begin(&state, locker, innodb_file_temp_key, - PSI_FILE_OPEN, - "Innodb Merge Temp File", - __FILE__, __LINE__); + locker = PSI_FILE_CALL(get_thread_file_name_locker)( + &state, innodb_file_temp_key, PSI_FILE_OPEN, + "Innodb Merge Temp File", &locker); + if (locker != NULL) { + PSI_FILE_CALL(start_file_open_wait)(locker, + __FILE__, + __LINE__); + } #endif fd = innobase_mysql_tmpfile(path); #ifdef UNIV_PFS_IO - register_pfs_file_open_end(locker, fd); + if (locker != NULL) { + PSI_FILE_CALL(end_file_open_wait_and_bind_to_descriptor)( + locker, fd); + } #endif if (fd < 0) { @@ -3480,15 +3406,20 @@ row_merge_file_destroy_low( #ifdef UNIV_PFS_IO struct PSI_file_locker* locker = NULL; PSI_file_locker_state state; - register_pfs_file_io_begin(&state, locker, - fd, 0, PSI_FILE_CLOSE, - __FILE__, __LINE__); + locker = PSI_FILE_CALL(get_thread_file_descriptor_locker)( + &state, fd, PSI_FILE_CLOSE); + if (locker != NULL) { + PSI_FILE_CALL(start_file_wait)( + locker, 0, __FILE__, __LINE__); + } #endif if (fd >= 0) { close(fd); } #ifdef UNIV_PFS_IO - register_pfs_file_io_end(locker, 0); + if (locker != NULL) { + PSI_FILE_CALL(end_file_wait)(locker, 0); + } #endif } /*********************************************************************//** @@ -3695,7 +3626,7 @@ row_merge_rename_tables_dict( table is in a non-system tablespace where space > 0. */ if (err == DB_SUCCESS && old_table->space != TRX_SYS_SPACE - && !old_table->ibd_file_missing) { + && fil_space_get(old_table->space) != NULL) { /* Make pathname to update SYS_DATAFILES. */ char* tmp_path = row_make_new_pathname(old_table, tmp_name); @@ -3963,7 +3894,6 @@ row_merge_build_indexes( fts_psort_t* merge_info = NULL; ib_int64_t sig_count = 0; bool fts_psort_initiated = false; - fil_space_crypt_t * crypt_data = NULL; float total_static_cost = 0; float total_dynamic_cost = 0; @@ -3992,24 +3922,20 @@ row_merge_build_indexes( from concurrent DDL (e.g. drop table) by MDL-locks. */ fil_space_t* space = fil_space_acquire(new_table->space); - if (space) { - crypt_data = space->crypt_data; - } else { + if (!space) { DBUG_RETURN(DB_TABLESPACE_NOT_FOUND); } - /* If tablespace is encrypted, allocate additional buffer for + /* If temporal log file is encrypted allocate memory for encryption/decryption. */ - if (crypt_data && crypt_data->should_encrypt()) { + if (log_tmp_is_encrypted()) { crypt_block = static_cast( - os_mem_alloc_large(&block_size)); + os_mem_alloc_large(&block_size)); if (crypt_block == NULL) { + fil_space_release(space); DBUG_RETURN(DB_OUT_OF_MEMORY); } - } else { - /* Not needed */ - crypt_data = NULL; } trx_start_if_not_started_xa(trx); @@ -4023,6 +3949,7 @@ row_merge_build_indexes( for (i = 0; i < n_indexes; i++) { merge_files[i].fd = -1; + merge_files[i].offset = 0; } total_static_cost = COST_BUILD_INDEX_STATIC * n_indexes + COST_READ_CLUSTERED_INDEX; @@ -4070,13 +3997,15 @@ row_merge_build_indexes( pct_cost = COST_READ_CLUSTERED_INDEX * 100 / (total_static_cost + total_dynamic_cost); /* Do not continue if we can't encrypt table pages */ - if (old_table->is_encrypted || new_table->is_encrypted) { + if (!old_table->is_readable() || + !new_table->is_readable()) { error = DB_DECRYPTION_FAILED; ib_push_warning(trx->mysql_thd, DB_DECRYPTION_FAILED, "Table %s is encrypted but encryption service or" " used key_id is not available. " " Can't continue reading table.", - old_table->is_encrypted ? old_table->name : new_table->name); + !old_table->is_readable() ? old_table->name : + new_table->name); goto func_exit; } @@ -4088,7 +4017,7 @@ row_merge_build_indexes( fts_sort_idx, psort_info, merge_files, key_numbers, n_indexes, add_cols, col_map, add_autoinc, sequence, block, &tmpfd, pct_cost, - crypt_data, crypt_block); + crypt_block); pct_progress += pct_cost; @@ -4111,10 +4040,6 @@ row_merge_build_indexes( /* Now we have files containing index entries ready for sorting and inserting. */ - DBUG_EXECUTE_IF( - "ib_merge_wait_after_read", - os_thread_sleep(20000000);); /* 20 sec */ - for (i = 0; i < n_indexes; i++) { dict_index_t* sort_idx = indexes[i]; @@ -4225,7 +4150,8 @@ wait_again: trx, &dup, &merge_files[i], block, &tmpfd, true, pct_progress, pct_cost, - crypt_data, crypt_block, new_table->space); + crypt_block, + new_table->space); pct_progress += pct_cost; @@ -4263,7 +4189,8 @@ wait_again: trx->id, sort_idx, old_table, merge_files[i].fd, block, merge_files[i].n_rec, pct_progress, pct_cost, - crypt_data, crypt_block, new_table->space); + crypt_block, new_table->space); + pct_progress += pct_cost; if (global_system_variables.log_warnings > 2) { diff --git a/storage/xtradb/row/row0mysql.cc b/storage/xtradb/row/row0mysql.cc index 7c8636d354f..0079fc79a0e 100644 --- a/storage/xtradb/row/row0mysql.cc +++ b/storage/xtradb/row/row0mysql.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2000, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. +Copyright (c) 2015, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -663,6 +663,7 @@ handle_new_error: abort(); case DB_CORRUPTION: + case DB_PAGE_CORRUPTED: fputs("InnoDB: We detected index corruption" " in an InnoDB type table.\n" "InnoDB: You have to dump + drop + reimport" @@ -1279,6 +1280,71 @@ run_again: return(err); } +/*********************************************************************//** +Determine is tablespace encrypted but decryption failed, is table corrupted +or is tablespace .ibd file missing. +@param[in] table Table +@param[in] trx Transaction +@param[in] push_warning true if we should push warning to user +@return DB_DECRYPTION_FAILED table is encrypted but decryption failed +DB_CORRUPTION table is corrupted +DB_TABLESPACE_NOT_FOUND tablespace .ibd file not found */ +static +dberr_t +row_mysql_get_table_status( + const dict_table_t* table, + trx_t* trx, + bool push_warning = true) +{ + dberr_t err = DB_SUCCESS; + FilSpace space(table->space, true); + char buf[MAX_FULL_NAME_LEN]; + ut_format_name(table->name, TRUE, buf, sizeof(buf)); + + if (space()) { + + if (space()->crypt_data && space()->crypt_data->is_encrypted()) { + // maybe we cannot access the table due to failing + // to decrypt + if (push_warning) { + ib_push_warning(trx,HA_ERR_DECRYPTION_FAILED, + "Table %s in file %s is encrypted but encryption service or" + " used key_id %u is not available. " + " Can't continue reading table.", + buf, space()->chain.start->name, + space()->crypt_data->key_id); + } + + err = DB_DECRYPTION_FAILED; + } else { + if (push_warning) { + ib_push_warning(trx, DB_CORRUPTION, + "Table %s in file %s corrupted.", + buf, space()->chain.start->name); + } + + err = DB_CORRUPTION; + } + + } else { + ib_logf(IB_LOG_LEVEL_ERROR, + "InnoDB: MySQL is trying to use a table handle" + " but the .ibd file for" + " table %s does not exist." + " Have you deleted the .ibd file" + " from the database directory under" + " the MySQL datadir, or have you" + " used DISCARD TABLESPACE?" + " Look from " REFMAN "innodb-troubleshooting.html" + " how you can resolve the problem.", + buf); + + err = DB_TABLESPACE_NOT_FOUND; + } + + return (err); +} + /*********************************************************************//** Does an insert for MySQL. @return error code or DB_SUCCESS */ @@ -1308,20 +1374,8 @@ row_insert_for_mysql( return(DB_TABLESPACE_DELETED); - } else if (prebuilt->table->ibd_file_missing) { - - ib_logf(IB_LOG_LEVEL_ERROR, - ".ibd file is missing for table %s", - prebuilt->table->name); - - return(DB_TABLESPACE_NOT_FOUND); - } else if (prebuilt->table->is_encrypted) { - ib_push_warning(trx, DB_DECRYPTION_FAILED, - "Table %s in tablespace %lu encrypted." - "However key management plugin or used key_id is not found or" - " used encryption algorithm or method does not match.", - prebuilt->table->name, prebuilt->table->space); - return(DB_DECRYPTION_FAILED); + } else if (!prebuilt->table->is_readable()) { + return (row_mysql_get_table_status(prebuilt->table, trx, true)); } else if (prebuilt->magic_n != ROW_PREBUILT_ALLOCATED) { fprintf(stderr, "InnoDB: Error: trying to free a corrupt\n" @@ -1460,11 +1514,10 @@ error_exit: que_thr_stop_for_mysql_no_error(thr, trx); if (UNIV_LIKELY(!(trx->fake_changes))) { - if (table->is_system_db) { - srv_stats.n_system_rows_inserted.add((size_t)trx->id, 1); + srv_stats.n_system_rows_inserted.inc(size_t(trx->id)); } else { - srv_stats.n_rows_inserted.add((size_t)trx->id, 1); + srv_stats.n_rows_inserted.inc(size_t(trx->id)); } if (prebuilt->clust_index_was_generated) { @@ -1712,28 +1765,8 @@ row_update_for_mysql( ut_ad(trx != NULL); UT_NOT_USED(mysql_rec); - if (prebuilt->table->ibd_file_missing) { - ut_print_timestamp(stderr); - fprintf(stderr, " InnoDB: Error:\n" - "InnoDB: MySQL is trying to use a table handle" - " but the .ibd file for\n" - "InnoDB: table %s does not exist.\n" - "InnoDB: Have you deleted the .ibd file" - " from the database directory under\n" - "InnoDB: the MySQL datadir, or have you" - " used DISCARD TABLESPACE?\n" - "InnoDB: Look from\n" - "InnoDB: " REFMAN "innodb-troubleshooting.html\n" - "InnoDB: how you can resolve the problem.\n", - prebuilt->table->name); - return(DB_ERROR); - } else if (prebuilt->table->is_encrypted) { - ib_push_warning(trx, DB_DECRYPTION_FAILED, - "Table %s in tablespace %lu encrypted." - "However key management plugin or used key_id is not found or" - " used encryption algorithm or method does not match.", - prebuilt->table->name, prebuilt->table->space); - return (DB_TABLE_NOT_FOUND); + if (!table->is_readable()) { + return (row_mysql_get_table_status(table, trx, true)); } if (UNIV_UNLIKELY(prebuilt->magic_n != ROW_PREBUILT_ALLOCATED)) { @@ -1873,17 +1906,15 @@ run_again: dict_table_n_rows_dec(prebuilt->table); if (table->is_system_db) { - srv_stats.n_system_rows_deleted.add( - (size_t)trx->id, 1); + srv_stats.n_system_rows_deleted.inc(size_t(trx->id)); } else { - srv_stats.n_rows_deleted.add((size_t)trx->id, 1); + srv_stats.n_rows_deleted.inc(size_t(trx->id)); } } else { if (table->is_system_db) { - srv_stats.n_system_rows_updated.add( - (size_t)trx->id, 1); + srv_stats.n_system_rows_updated.inc(size_t(trx->id)); } else { - srv_stats.n_rows_updated.add((size_t)trx->id, 1); + srv_stats.n_rows_updated.inc(size_t(trx->id)); } } @@ -2121,17 +2152,15 @@ run_again: dict_table_n_rows_dec(table); if (table->is_system_db) { - srv_stats.n_system_rows_deleted.add( - (size_t)trx->id, 1); + srv_stats.n_system_rows_deleted.inc(size_t(trx->id)); } else { - srv_stats.n_rows_deleted.add((size_t)trx->id, 1); + srv_stats.n_rows_deleted.inc(size_t(trx->id)); } } else { if (table->is_system_db) { - srv_stats.n_system_rows_updated.add( - (size_t)trx->id, 1); + srv_stats.n_system_rows_updated.inc(size_t(trx->id)); } else { - srv_stats.n_rows_updated.add((size_t)trx->id, 1); + srv_stats.n_rows_updated.inc(size_t(trx->id)); } } @@ -3128,7 +3157,7 @@ row_discard_tablespace( /* All persistent operations successful, update the data dictionary memory cache. */ - table->ibd_file_missing = TRUE; + table->file_unreadable = true; table->flags2 |= DICT_TF2_DISCARDED; @@ -3185,8 +3214,6 @@ row_discard_tablespace_for_mysql( if (table == 0) { err = DB_TABLE_NOT_FOUND; - } else if (table->is_encrypted) { - err = DB_DECRYPTION_FAILED; } else if (table->space == TRX_SYS_SPACE) { char table_name[MAX_FULL_NAME_LEN + 1]; @@ -3401,10 +3428,8 @@ row_truncate_table_for_mysql( if (dict_table_is_discarded(table)) { return(DB_TABLESPACE_DELETED); - } else if (table->is_encrypted) { - return(DB_DECRYPTION_FAILED); - } else if (table->ibd_file_missing) { - return(DB_TABLESPACE_NOT_FOUND); + } else if (!table->is_readable()) { + return (row_mysql_get_table_status(table, trx, true)); } trx_start_for_ddl(trx, TRX_DICT_OP_TABLE); @@ -3570,7 +3595,7 @@ row_truncate_table_for_mysql( "create a new tablespace", table->name); - table->ibd_file_missing = 1; + table->file_unreadable = true; err = DB_ERROR; goto funct_exit; } @@ -3994,19 +4019,6 @@ row_drop_table_for_mysql( goto funct_exit; } - /* If table is encrypted and table page encryption failed - return error. */ - if (table->is_encrypted) { - - if (table->can_be_evicted) { - dict_table_move_from_lru_to_non_lru(table); - } - - dict_table_close(table, TRUE, FALSE); - err = DB_DECRYPTION_FAILED; - goto funct_exit; - } - /* Turn on this drop bit before we could release the dictionary latch */ table->to_be_dropped = true; @@ -4260,18 +4272,6 @@ row_drop_table_for_mysql( rw_lock_x_unlock(dict_index_get_lock(index)); } - /* If table has not yet have crypt_data, try to read it to - make freeing the table easier. */ - if (!table->crypt_data) { - - if (fil_space_t* space = fil_space_acquire_silent(table->space)) { - /* We use crypt data in dict_table_t in ha_innodb.cc - to push warnings to user thread. */ - table->crypt_data = space->crypt_data; - fil_space_release(space); - } - } - /* We use the private SQL parser of Innobase to generate the query graphs needed in deleting the dictionary data from system tables in Innobase. Deleting a row from SYS_INDEXES table also @@ -4378,7 +4378,7 @@ row_drop_table_for_mysql( from table->heap, which will be freed by dict_table_remove_from_cache(table) below. */ space_id = table->space; - ibd_file_missing = table->ibd_file_missing; + ibd_file_missing = table->file_unreadable; table_flags = table->flags; is_temp = DICT_TF2_FLAG_IS_SET(table, DICT_TF2_TEMPORARY); @@ -4389,7 +4389,8 @@ row_drop_table_for_mysql( have a temp flag but not know the temp path */ ut_a(table->dir_path_of_temp_table == NULL || is_temp); if (dict_table_is_discarded(table) - || table->ibd_file_missing) { + || (!table->is_readable() + && fil_space_get(table->space) == NULL)) { /* Do not attempt to drop known-to-be-missing tablespaces. */ space_id = 0; @@ -4465,8 +4466,9 @@ row_drop_table_for_mysql( if (!is_temp && !fil_space_for_table_exists_in_mem( space_id, tablename, - print_msg, false, NULL, 0, + print_msg, IS_XTRABACKUP() && print_msg, false, NULL, 0, table_flags)) { + /* This might happen if we are dropping a discarded tablespace */ err = DB_SUCCESS; @@ -4801,7 +4803,8 @@ loop: "'%s.frm' was lost.", table->name); } - if (table->ibd_file_missing) { + if (!table->is_readable() + && fil_space_get(table->space) == NULL) { ib_logf(IB_LOG_LEVEL_WARN, "Missing %s.ibd file for table %s.", table->name, table->name); @@ -5075,7 +5078,8 @@ row_rename_table_for_mysql( stderr); goto funct_exit; - } else if (table->ibd_file_missing + } else if (!table->is_readable() + && fil_space_get(table->space) == NULL && !dict_table_is_discarded(table)) { err = DB_TABLE_NOT_FOUND; @@ -5145,7 +5149,7 @@ row_rename_table_for_mysql( which have space IDs > 0. */ if (err == DB_SUCCESS && table->space != TRX_SYS_SPACE - && !table->ibd_file_missing) { + && table->is_readable()) { /* Make a new pathname to update SYS_DATAFILES. */ char* new_path = row_make_new_pathname(table, new_name); @@ -5526,7 +5530,8 @@ loop: fputs(" InnoDB: Warning: CHECK TABLE on ", stderr); dict_index_name_print(stderr, prebuilt->trx, index); fprintf(stderr, " returned %lu\n", ret); - /* fall through (this error is ignored by CHECK TABLE) */ + /* (this error is ignored by CHECK TABLE) */ + /* fall through */ case DB_END_OF_INDEX: func_exit: mem_free(buf); diff --git a/storage/xtradb/row/row0purge.cc b/storage/xtradb/row/row0purge.cc index 35b3520749b..333677edf21 100644 --- a/storage/xtradb/row/row0purge.cc +++ b/storage/xtradb/row/row0purge.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -488,8 +489,9 @@ row_purge_remove_sec_if_poss_leaf( success = false; } } - /* fall through (the index entry is still needed, + /* (The index entry is still needed, or the deletion succeeded) */ + /* fall through */ case ROW_NOT_DELETED_REF: /* The index entry is still needed. */ case ROW_BUFFERED: @@ -777,7 +779,7 @@ row_purge_parse_undo_rec( goto err_exit; } - if (node->table->ibd_file_missing) { + if (node->table->file_unreadable) { /* We skip purge of missing .ibd files */ dict_table_close(node->table, FALSE, FALSE); diff --git a/storage/xtradb/row/row0sel.cc b/storage/xtradb/row/row0sel.cc index 29569bb31e7..26fd7629a5d 100644 --- a/storage/xtradb/row/row0sel.cc +++ b/storage/xtradb/row/row0sel.cc @@ -62,9 +62,12 @@ Created 12/19/1997 Heikki Tuuri #include "srv0start.h" #include "m_string.h" /* for my_sys.h */ #include "my_sys.h" /* DEBUG_SYNC_C */ +#include "fil0fil.h" #include "my_compare.h" /* enum icp_result */ +#include + /* Maximum number of rows to prefetch; MySQL interface has another parameter */ #define SEL_MAX_N_PREFETCH 16 @@ -1542,6 +1545,7 @@ rec_loop: switch (err) { case DB_SUCCESS_LOCKED_REC: err = DB_SUCCESS; + /* fall through */ case DB_SUCCESS: break; default: @@ -1600,6 +1604,7 @@ skip_lock: switch (err) { case DB_SUCCESS_LOCKED_REC: err = DB_SUCCESS; + /* fall through */ case DB_SUCCESS: break; default: @@ -2714,7 +2719,8 @@ row_sel_field_store_in_mysql_format_func( || !(templ->mysql_col_len % templ->mbmaxlen)); ut_ad(len * templ->mbmaxlen >= templ->mysql_col_len || (field_no == templ->icp_rec_field_no - && field->prefix_len > 0)); + && field->prefix_len > 0) + || templ->rec_field_is_prefix); ut_ad(!(field->prefix_len % templ->mbmaxlen)); if (templ->mbminlen == 1 && templ->mbmaxlen != 1) { @@ -2756,27 +2762,32 @@ row_sel_field_store_in_mysql_format_func( # define row_sel_store_mysql_field(m,p,r,i,o,f,t) \ row_sel_store_mysql_field_func(m,p,r,o,f,t) #endif /* UNIV_DEBUG */ -/**************************************************************//** -Convert a field in the Innobase format to a field in the MySQL format. */ +/** Convert a field in the Innobase format to a field in the MySQL format. +@param[out] mysql_rec record in the MySQL format +@param[in,out] prebuilt prebuilt struct +@param[in] rec InnoDB record; must be protected + by a page latch +@param[in] index index of rec +@param[in] offsets array returned by rec_get_offsets() +@param[in] field_no templ->rec_field_no or + templ->clust_rec_field_no + or templ->icp_rec_field_no + or sec field no if clust_templ_for_sec + is TRUE +@param[in] templ row template +*/ static MY_ATTRIBUTE((warn_unused_result)) ibool row_sel_store_mysql_field_func( -/*===========================*/ - byte* mysql_rec, /*!< out: record in the - MySQL format */ - row_prebuilt_t* prebuilt, /*!< in/out: prebuilt struct */ - const rec_t* rec, /*!< in: InnoDB record; - must be protected by - a page latch */ + byte* mysql_rec, + row_prebuilt_t* prebuilt, + const rec_t* rec, #ifdef UNIV_DEBUG - const dict_index_t* index, /*!< in: index of rec */ + const dict_index_t* index, #endif - const ulint* offsets, /*!< in: array returned by - rec_get_offsets() */ - ulint field_no, /*!< in: templ->rec_field_no or - templ->clust_rec_field_no or - templ->icp_rec_field_no */ - const mysql_row_templ_t*templ) /*!< in: row template */ + const ulint* offsets, + ulint field_no, + const mysql_row_templ_t*templ) { const byte* data; ulint len; @@ -2905,31 +2916,31 @@ row_sel_store_mysql_field_func( return(TRUE); } -/**************************************************************//** -Convert a row in the Innobase format to a row in the MySQL format. +/** Convert a row in the Innobase format to a row in the MySQL format. Note that the template in prebuilt may advise us to copy only a few columns to mysql_rec, other columns are left blank. All columns may not be needed in the query. +@param[out] mysql_rec row in the MySQL format +@param[in] prebuilt prebuilt structure +@param[in] rec Innobase record in the index + which was described in prebuilt's + template, or in the clustered index; + must be protected by a page latch +@param[in] rec_clust TRUE if the rec in the clustered index +@param[in] index index of rec +@param[in] offsets array returned by rec_get_offsets(rec) @return TRUE on success, FALSE if not all columns could be retrieved */ static MY_ATTRIBUTE((warn_unused_result)) ibool row_sel_store_mysql_rec( -/*====================*/ - byte* mysql_rec, /*!< out: row in the MySQL format */ - row_prebuilt_t* prebuilt, /*!< in: prebuilt struct */ - const rec_t* rec, /*!< in: Innobase record in the index - which was described in prebuilt's - template, or in the clustered index; - must be protected by a page latch */ - ibool rec_clust, /*!< in: TRUE if rec is in the - clustered index instead of - prebuilt->index */ - const dict_index_t* index, /*!< in: index of rec */ - const ulint* offsets) /*!< in: array returned by - rec_get_offsets(rec) */ + byte* mysql_rec, + row_prebuilt_t* prebuilt, + const rec_t* rec, + ibool rec_clust, + const dict_index_t* index, + const ulint* offsets) { ulint i; - ut_ad(rec_clust || index == prebuilt->index); ut_ad(!rec_clust || dict_index_is_clust(index)); @@ -2945,12 +2956,14 @@ row_sel_store_mysql_rec( ? templ->clust_rec_field_no : templ->rec_field_no; /* We should never deliver column prefixes to MySQL, - except for evaluating innobase_index_cond(). */ + except for evaluating innobase_index_cond() and if the prefix + index is longer than the actual row data. */ /* ...actually, we do want to do this in order to support the prefix query optimization. ut_ad(dict_index_get_nth_field(index, field_no)->prefix_len - == 0); + == 0 || templ->rec_field_is_prefix); + ...so we disable this assert. */ @@ -3046,11 +3059,12 @@ row_sel_get_clust_rec_for_mysql( dberr_t err; trx_t* trx; - srv_stats.n_sec_rec_cluster_reads.inc(); - *out_rec = NULL; trx = thr_get_trx(thr); + srv_stats.n_sec_rec_cluster_reads.inc( + thd_get_thread_id(trx->mysql_thd)); + row_build_row_ref_in_tuple(prebuilt->clust_ref, rec, sec_index, *offsets, trx); @@ -3679,7 +3693,7 @@ row_search_for_mysql( trx_t* trx = prebuilt->trx; dict_index_t* clust_index; que_thr_t* thr; - const rec_t* rec; + const rec_t* rec = NULL; const rec_t* result_rec = NULL; const rec_t* clust_rec; dberr_t err = DB_SUCCESS; @@ -3704,7 +3718,7 @@ row_search_for_mysql( ulint* offsets = offsets_; ibool table_lock_waited = FALSE; byte* next_buf = 0; - ibool use_clustered_index = FALSE; + bool use_clustered_index = false; rec_offs_init(offsets_); @@ -3728,13 +3742,12 @@ row_search_for_mysql( return(DB_TABLESPACE_DELETED); - } else if (prebuilt->table->ibd_file_missing) { - - return(DB_TABLESPACE_NOT_FOUND); - - } else if (prebuilt->table->is_encrypted) { - - return(DB_DECRYPTION_FAILED); + } else if (!prebuilt->table->is_readable()) { + if (fil_space_get(prebuilt->table->space) == NULL) { + return(DB_TABLESPACE_NOT_FOUND); + } else { + return(DB_DECRYPTION_FAILED); + } } else if (!prebuilt->index_usable) { return(DB_MISSING_HISTORY); @@ -3965,7 +3978,8 @@ row_search_for_mysql( if (!row_sel_store_mysql_rec( buf, prebuilt, - rec, FALSE, index, offsets)) { + rec, FALSE, index, + offsets)) { /* Only fresh inserts may contain incomplete externally stored columns. Pretend that such @@ -4174,6 +4188,7 @@ wait_table_again: switch (err) { case DB_SUCCESS_LOCKED_REC: err = DB_SUCCESS; + /* fall through */ case DB_SUCCESS: break; default: @@ -4193,7 +4208,7 @@ wait_table_again: " used key_id is not available. " " Can't continue reading table.", prebuilt->table->name); - index->table->is_encrypted = true; + index->table->file_unreadable = true; } rec = NULL; goto lock_wait_or_error; @@ -4213,7 +4228,7 @@ rec_loop: rec = btr_pcur_get_rec(pcur); - if (!rec) { + if (!index->table->is_readable()) { err = DB_DECRYPTION_FAILED; goto lock_wait_or_error; } @@ -4247,7 +4262,6 @@ rec_loop: } if (page_rec_is_supremum(rec)) { - if (set_also_gap_locks && !(srv_locks_unsafe_for_binlog || trx->isolation_level <= TRX_ISO_READ_COMMITTED) @@ -4270,6 +4284,7 @@ rec_loop: switch (err) { case DB_SUCCESS_LOCKED_REC: err = DB_SUCCESS; + /* fall through */ case DB_SUCCESS: break; default: @@ -4305,15 +4320,14 @@ rec_loop: wrong_offs: if (srv_pass_corrupt_table && index->table->space != 0 && index->table->space < SRV_LOG_SPACE_FIRST_ID) { - index->table->is_corrupt = TRUE; + index->table->file_unreadable = TRUE; fil_space_set_corrupt(index->table->space); } if ((srv_force_recovery == 0 || moves_up == FALSE) && srv_pass_corrupt_table <= 1) { ut_print_timestamp(stderr); - buf_page_print(page_align(rec), 0, - BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(page_align(rec), 0); fprintf(stderr, "\nInnoDB: rec address %p," " buf block fix count %lu\n", @@ -4366,20 +4380,22 @@ wrong_offs: offsets = rec_get_offsets(rec, index, offsets, ULINT_UNDEFINED, &heap); if (UNIV_UNLIKELY(srv_force_recovery > 0 - || (index->table->is_corrupt && + || (!index->table->is_readable() && srv_pass_corrupt_table == 2))) { if (!rec_validate(rec, offsets) || !btr_index_rec_validate(rec, index, FALSE)) { - fprintf(stderr, - "InnoDB: Index corruption: rec offs %lu" - " next offs %lu, page no %lu,\n" - "InnoDB: ", - (ulong) page_offset(rec), - (ulong) next_offs, - (ulong) page_get_page_no(page_align(rec))); - dict_index_name_print(stderr, trx, index); - fputs(". We try to skip the record.\n", - stderr); + char buf[MAX_FULL_NAME_LEN]; + ut_format_name(index->table->name, FALSE, buf, sizeof(buf)); + + ib_logf(IB_LOG_LEVEL_ERROR, + "Index %s corrupted: rec offs " ULINTPF + " next offs " ULINTPF + ", page no " ULINTPF " ." + " We try to skip the record.", + buf, + page_offset(rec), + next_offs, + page_get_page_no(page_align(rec))); goto next_rec; } @@ -4556,6 +4572,7 @@ no_gap_lock: prebuilt->new_rec_locks = 1; } err = DB_SUCCESS; + /* fall through */ case DB_SUCCESS: break; case DB_LOCK_WAIT: @@ -4774,17 +4791,17 @@ locks_ok: indexes are shorter than the prefix size This optimization can avoid many IOs for certain schemas. */ - ibool row_contains_all_values = TRUE; - int i; + bool row_contains_all_values = true; + unsigned int i; for (i = 0; i < prebuilt->n_template; i++) { /* Condition (1) from above: is the field in the index (prefix or not)? */ - mysql_row_templ_t* templ = + const mysql_row_templ_t* templ = prebuilt->mysql_template + i; ulint secondary_index_field_no = templ->rec_prefix_field_no; if (secondary_index_field_no == ULINT_UNDEFINED) { - row_contains_all_values = FALSE; + row_contains_all_values = false; break; } /* Condition (2) from above: if this is a @@ -4799,8 +4816,9 @@ locks_ok: index, secondary_index_field_no); ut_a(field->prefix_len > 0); - if (record_size >= field->prefix_len) { - row_contains_all_values = FALSE; + if (record_size >= field->prefix_len + / templ->mbmaxlen) { + row_contains_all_values = false; break; } } @@ -4816,7 +4834,7 @@ locks_ok: templ->rec_prefix_field_no; ut_a(templ->rec_field_no != ULINT_UNDEFINED); } - use_clustered_index = FALSE; + use_clustered_index = false; srv_stats.n_sec_rec_cluster_reads_avoided.inc(); } } diff --git a/storage/xtradb/row/row0uins.cc b/storage/xtradb/row/row0uins.cc index 651042fb820..29660055fad 100644 --- a/storage/xtradb/row/row0uins.cc +++ b/storage/xtradb/row/row0uins.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -201,6 +202,10 @@ row_undo_ins_remove_sec_low( mtr_s_lock(dict_index_get_lock(index), &mtr); } else { ut_ad(mode == BTR_MODIFY_TREE); + if (index->space == IBUF_SPACE_ID + && !dict_index_is_unique(index)) { + ibuf_free_excess_pages(); + } mtr_x_lock(dict_index_get_lock(index), &mtr); } @@ -320,7 +325,7 @@ row_undo_ins_parse_undo_rec( /* Skip the UNDO if we can't find the table or the .ibd file. */ if (UNIV_UNLIKELY(node->table == NULL)) { - } else if (UNIV_UNLIKELY(node->table->ibd_file_missing)) { + } else if (UNIV_UNLIKELY(node->table->file_unreadable)) { close_table: dict_table_close(node->table, dict_locked, FALSE); node->table = NULL; diff --git a/storage/xtradb/row/row0umod.cc b/storage/xtradb/row/row0umod.cc index 19576d976bd..f23d7e9dc68 100644 --- a/storage/xtradb/row/row0umod.cc +++ b/storage/xtradb/row/row0umod.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -35,6 +36,7 @@ Created 2/27/1997 Heikki Tuuri #include "trx0roll.h" #include "btr0btr.h" #include "mach0data.h" +#include "ibuf0ibuf.h" #include "row0undo.h" #include "row0vers.h" #include "row0log.h" @@ -409,6 +411,11 @@ row_undo_mod_del_mark_or_remove_sec_low( log_free_check(); mtr_start_trx(&mtr, thr_get_trx(thr)); + if (mode == BTR_MODIFY_TREE + && index->space == IBUF_SPACE_ID + && !dict_index_is_unique(index)) { + ibuf_free_excess_pages(); + } if (*index->name == TEMP_INDEX_PREFIX) { /* The index->online_status may change if the @@ -581,6 +588,11 @@ row_undo_mod_del_unmark_sec_and_undo_update( log_free_check(); mtr_start_trx(&mtr, thr_get_trx(thr)); + if (mode == BTR_MODIFY_TREE + && index->space == IBUF_SPACE_ID + && !dict_index_is_unique(index)) { + ibuf_free_excess_pages(); + } if (*index->name == TEMP_INDEX_PREFIX) { /* The index->online_status may change if the @@ -1068,7 +1080,7 @@ row_undo_mod_parse_undo_rec( return; } - if (node->table->ibd_file_missing) { + if (node->table->file_unreadable) { dict_table_close(node->table, dict_locked, FALSE); /* We skip undo operations to missing .ibd files */ diff --git a/storage/xtradb/row/row0upd.cc b/storage/xtradb/row/row0upd.cc index 1156cbe4b4c..b09021722be 100644 --- a/storage/xtradb/row/row0upd.cc +++ b/storage/xtradb/row/row0upd.cc @@ -1989,6 +1989,8 @@ row_upd_sec_index_entry( } #ifdef WITH_WSREP if (err == DB_SUCCESS && !referenced && + wsrep_on(trx->mysql_thd) && + !wsrep_thd_is_BF(trx->mysql_thd, FALSE) && !(parent && que_node_get_type(parent) == QUE_NODE_UPDATE && ((upd_node_t*)parent)->cascade_node == node) && @@ -2277,7 +2279,7 @@ err_exit: } } #ifdef WITH_WSREP - if (!referenced && + if (!referenced && wsrep_on(trx->mysql_thd) && !(parent && que_node_get_type(parent) == QUE_NODE_UPDATE && ((upd_node_t*)parent)->cascade_node == node) && foreign @@ -2545,10 +2547,11 @@ row_upd_del_mark_clust_rec( node, pcur, index->table, index, offsets, thr, mtr); } #ifdef WITH_WSREP - if (err == DB_SUCCESS && !referenced && + trx_t* trx = thr_get_trx(thr) ; + + if (err == DB_SUCCESS && !referenced && trx && wsrep_on(trx->mysql_thd) && !(parent && que_node_get_type(parent) == QUE_NODE_UPDATE && ((upd_node_t*)parent)->cascade_node == node) && - thr_get_trx(thr) && foreign ) { err = wsrep_row_upd_check_foreign_constraints( diff --git a/storage/xtradb/srv/srv0srv.cc b/storage/xtradb/srv/srv0srv.cc index 1c40baee04b..9694e16ef08 100644 --- a/storage/xtradb/srv/srv0srv.cc +++ b/storage/xtradb/srv/srv0srv.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, 2009 Google Inc. Copyright (c) 2009, Percona Inc. Copyright (c) 2013, 2017, MariaDB Corporation. @@ -171,7 +171,8 @@ UNIV_INTERN unsigned long long srv_online_max_size; OS (provided we compiled Innobase with it in), otherwise we will use simulated aio we build below with threads. Currently we support native aio on windows and linux */ -UNIV_INTERN my_bool srv_use_native_aio = TRUE; +/* make srv_use_native_aio to be visible for other plugins */ +my_bool srv_use_native_aio = TRUE; UNIV_INTERN my_bool srv_numa_interleave = FALSE; /* Default compression level if page compression is used and no compression @@ -203,7 +204,7 @@ performance killer causing calling thread to context switch. Besides, Innodb is preallocating large number (often millions) of os_events. With kernel event objects it takes a big chunk out of non-paged pool, which is better suited for tasks like IO than for storing idle event objects. */ -UNIV_INTERN ibool srv_use_native_conditions = FALSE; +UNIV_INTERN ibool srv_use_native_conditions = TRUE; #endif /* __WIN__ */ UNIV_INTERN ulint srv_n_data_files = 0; @@ -366,7 +367,9 @@ readahead request. */ UNIV_INTERN ulong srv_read_ahead_threshold = 56; #ifdef UNIV_LOG_ARCHIVE -UNIV_INTERN ibool srv_log_archive_on = FALSE; +UNIV_INTERN bool srv_log_archive_on; +UNIV_INTERN bool srv_archive_recovery; +UNIV_INTERN ib_uint64_t srv_archive_recovery_limit_lsn; #endif /* UNIV_LOG_ARCHIVE */ /* This parameter is used to throttle the number of insert buffers that are @@ -448,7 +451,7 @@ UNIV_INTERN my_bool srv_cleaner_thread_priority = FALSE; UNIV_INTERN my_bool srv_master_thread_priority = FALSE; /* The number of purge threads to use.*/ -UNIV_INTERN ulong srv_n_purge_threads = 1; +UNIV_INTERN ulong srv_n_purge_threads; /* the number of pages to purge in one batch */ UNIV_INTERN ulong srv_purge_batch_size = 20; @@ -522,6 +525,12 @@ UNIV_INTERN ulong srv_doublewrite_batch_size = 120; UNIV_INTERN ulong srv_replication_delay = 0; +UNIV_INTERN bool srv_apply_log_only; + +UNIV_INTERN bool srv_backup_mode; +UNIV_INTERN bool srv_close_files; +UNIV_INTERN bool srv_xtrabackup; + UNIV_INTERN ulong srv_pass_corrupt_table = 0; /* 0:disable 1:enable */ UNIV_INTERN ulong srv_log_checksum_algorithm = @@ -681,16 +690,16 @@ UNIV_INTERN ulong srv_buf_dump_status_frequency = 0; /** Acquire the system_mutex. */ #define srv_sys_mutex_enter() do { \ - mutex_enter(&srv_sys->mutex); \ + mutex_enter(&srv_sys.mutex); \ } while (0) /** Test if the system mutex is owned. */ -#define srv_sys_mutex_own() (mutex_own(&srv_sys->mutex) \ +#define srv_sys_mutex_own() (mutex_own(&srv_sys.mutex) \ && !srv_read_only_mode) /** Release the system mutex. */ #define srv_sys_mutex_exit() do { \ - mutex_exit(&srv_sys->mutex); \ + mutex_exit(&srv_sys.mutex); \ } while (0) #define fetch_lock_wait_timeout(trx) \ @@ -785,7 +794,7 @@ struct srv_sys_t{ ulint n_sys_threads; /*!< size of the sys_threads array */ - srv_slot_t* sys_threads; /*!< server thread table; + srv_slot_t sys_threads[32 + 1]; /*!< server thread table; os_event_set() and os_event_reset() on sys_threads[]->event are @@ -809,7 +818,7 @@ struct srv_sys_t{ UNIV_INTERN ib_mutex_t server_mutex; #endif /* !HAVE_ATOMIC_BUILTINS */ -static srv_sys_t* srv_sys = NULL; +static srv_sys_t srv_sys; /** Event to signal srv_monitor_thread. Not protected by a mutex. Set after setting srv_print_innodb_monitor. */ @@ -831,10 +840,10 @@ and/or load it during startup. */ UNIV_INTERN char srv_buffer_pool_dump_at_shutdown = FALSE; UNIV_INTERN char srv_buffer_pool_load_at_startup = FALSE; -/** Slot index in the srv_sys->sys_threads array for the purge thread. */ +/** Slot index in the srv_sys.sys_threads array for the purge thread. */ static const ulint SRV_PURGE_SLOT = 1; -/** Slot index in the srv_sys->sys_threads array for the master thread. */ +/** Slot index in the srv_sys.sys_threads array for the master thread. */ static const ulint SRV_MASTER_SLOT = 0; UNIV_INTERN os_event_t srv_checkpoint_completed_event; @@ -944,21 +953,21 @@ srv_reserve_slot( switch (type) { case SRV_MASTER: - slot = &srv_sys->sys_threads[SRV_MASTER_SLOT]; + slot = &srv_sys.sys_threads[SRV_MASTER_SLOT]; break; case SRV_PURGE: - slot = &srv_sys->sys_threads[SRV_PURGE_SLOT]; + slot = &srv_sys.sys_threads[SRV_PURGE_SLOT]; break; case SRV_WORKER: /* Find an empty slot, skip the master and purge slots. */ - for (slot = &srv_sys->sys_threads[2]; + for (slot = &srv_sys.sys_threads[2]; slot->in_use; ++slot) { - ut_a(slot < &srv_sys->sys_threads[ - srv_sys->n_sys_threads]); + ut_a(slot < &srv_sys.sys_threads[ + srv_sys.n_sys_threads]); } break; @@ -974,7 +983,7 @@ srv_reserve_slot( ut_ad(srv_slot_get_type(slot) == type); - ++srv_sys->n_threads_active[type]; + ++srv_sys.n_threads_active[type]; srv_sys_mutex_exit(); @@ -1004,27 +1013,27 @@ srv_suspend_thread_low( case SRV_MASTER: /* We have only one master thread and it should be the first entry always. */ - ut_a(srv_sys->n_threads_active[type] == 1); + ut_a(srv_sys.n_threads_active[type] == 1); break; case SRV_PURGE: /* We have only one purge coordinator thread and it should be the second entry always. */ - ut_a(srv_sys->n_threads_active[type] == 1); + ut_a(srv_sys.n_threads_active[type] == 1); break; case SRV_WORKER: ut_a(srv_n_purge_threads > 1); - ut_a(srv_sys->n_threads_active[type] > 0); + ut_a(srv_sys.n_threads_active[type] > 0); break; } ut_a(!slot->suspended); slot->suspended = TRUE; - ut_a(srv_sys->n_threads_active[type] > 0); + ut_a(srv_sys.n_threads_active[type] > 0); - srv_sys->n_threads_active[type]--; + srv_sys.n_threads_active[type]--; return(os_event_reset(slot->event)); } @@ -1079,7 +1088,7 @@ srv_resume_thread(srv_slot_t* slot, ib_int64_t sig_count = 0, bool wait = true, ut_ad(slot->suspended); slot->suspended = FALSE; - ++srv_sys->n_threads_active[slot->type]; + ++srv_sys.n_threads_active[slot->type]; srv_sys_mutex_exit(); return(timeout); } @@ -1101,8 +1110,8 @@ srv_release_threads(enum srv_thread_type type, ulint n) srv_sys_mutex_enter(); - for (ulint i = 0; i < srv_sys->n_sys_threads; i++) { - srv_slot_t* slot = &srv_sys->sys_threads[i]; + for (ulint i = 0; i < srv_sys.n_sys_threads; i++) { + srv_slot_t* slot = &srv_sys.sys_threads[i]; if (!slot->in_use || srv_slot_get_type(slot) != type) { continue; @@ -1122,7 +1131,7 @@ srv_release_threads(enum srv_thread_type type, ulint n) should be the first entry always. */ ut_a(n == 1); ut_a(i == SRV_MASTER_SLOT); - ut_a(srv_sys->n_threads_active[type] == 0); + ut_a(srv_sys.n_threads_active[type] == 0); break; case SRV_PURGE: @@ -1131,12 +1140,12 @@ srv_release_threads(enum srv_thread_type type, ulint n) ut_a(n == 1); ut_a(i == SRV_PURGE_SLOT); ut_a(srv_n_purge_threads > 0); - ut_a(srv_sys->n_threads_active[type] == 0); + ut_a(srv_sys.n_threads_active[type] == 0); break; case SRV_WORKER: ut_a(srv_n_purge_threads > 1); - ut_a(srv_sys->n_threads_active[type] + ut_a(srv_sys.n_threads_active[type] < srv_n_purge_threads - 1); break; } @@ -1174,9 +1183,6 @@ void srv_init(void) /*==========*/ { - ulint n_sys_threads = 0; - ulint srv_sys_sz = sizeof(*srv_sys); - #ifndef HAVE_ATOMIC_BUILTINS mutex_create(server_mutex_key, &server_mutex, SYNC_ANY_LATCH); #endif /* !HAVE_ATOMIC_BUILTINS */ @@ -1184,29 +1190,19 @@ srv_init(void) mutex_create(srv_innodb_monitor_mutex_key, &srv_innodb_monitor_mutex, SYNC_NO_ORDER_CHECK); - if (!srv_read_only_mode) { - - /* Number of purge threads + master thread */ - n_sys_threads = srv_n_purge_threads + 1; - - srv_sys_sz += n_sys_threads * sizeof(*srv_sys->sys_threads); - } - - srv_sys = static_cast(mem_zalloc(srv_sys_sz)); - - srv_sys->n_sys_threads = n_sys_threads; + srv_sys.n_sys_threads = srv_read_only_mode + ? 0 + : srv_n_purge_threads + 1/* purge coordinator */; if (!srv_read_only_mode) { - mutex_create(srv_sys_mutex_key, &srv_sys->mutex, SYNC_THREADS); + mutex_create(srv_sys_mutex_key, &srv_sys.mutex, SYNC_THREADS); mutex_create(srv_sys_tasks_mutex_key, - &srv_sys->tasks_mutex, SYNC_ANY_LATCH); + &srv_sys.tasks_mutex, SYNC_ANY_LATCH); - srv_sys->sys_threads = (srv_slot_t*) &srv_sys[1]; - - for (ulint i = 0; i < srv_sys->n_sys_threads; ++i) { - srv_slot_t* slot = &srv_sys->sys_threads[i]; + for (ulint i = 0; i < srv_sys.n_sys_threads; ++i) { + srv_slot_t* slot = &srv_sys.sys_threads[i]; slot->event = os_event_create(); @@ -1226,8 +1222,6 @@ srv_init(void) if (srv_track_changed_pages) { os_event_set(srv_redo_log_tracked_event); } - - UT_LIST_INIT(srv_sys->tasks); } /* page_zip_stat_per_index_mutex is acquired from: @@ -1275,8 +1269,8 @@ srv_free(void) if (!srv_read_only_mode) { - for (ulint i = 0; i < srv_sys->n_sys_threads; i++) - os_event_free(srv_sys->sys_threads[i].event); + for (ulint i = 0; i < srv_sys.n_sys_threads; i++) + os_event_free(srv_sys.sys_threads[i].event); os_event_free(srv_error_event); srv_error_event = NULL; @@ -1288,8 +1282,8 @@ srv_free(void) srv_checkpoint_completed_event = NULL; os_event_free(srv_redo_log_tracked_event); srv_redo_log_tracked_event = NULL; - mutex_free(&srv_sys->mutex); - mutex_free(&srv_sys->tasks_mutex); + mutex_free(&srv_sys.mutex); + mutex_free(&srv_sys.tasks_mutex); } #ifdef WITH_INNODB_DISALLOW_WRITES @@ -1303,10 +1297,10 @@ srv_free(void) mutex_free(&srv_innodb_monitor_mutex); mutex_free(&page_zip_stat_per_index_mutex); - mem_free(srv_sys); - srv_sys = NULL; - trx_i_s_cache_free(trx_i_s_cache); + + /* This is needed for Mariabackup. */ + memset(&srv_sys, 0, sizeof srv_sys); } /*********************************************************************//** @@ -1606,6 +1600,8 @@ srv_printf_innodb_monitor( recv_sys_subtotal = ((recv_sys && recv_sys->addr_hash) ? mem_heap_get_size(recv_sys->heap) : 0); + ulint dict_size = dict_sys ? dict_sys_get_size() : 0; + fprintf(file, "Internal hash tables (constant factor + variable factor)\n" " Adaptive hash index %lu \t(%lu + " ULINTPF ")\n" @@ -1624,11 +1620,11 @@ srv_printf_innodb_monitor( (ulong) (dict_sys ? ((dict_sys->table_hash->n_cells + dict_sys->table_id_hash->n_cells ) * sizeof(hash_cell_t) - + dict_sys->size) : 0), + + dict_size) : 0), (ulong) (dict_sys ? ((dict_sys->table_hash->n_cells + dict_sys->table_id_hash->n_cells ) * sizeof(hash_cell_t)) : 0), - dict_sys ? (dict_sys->size) : 0, + dict_size, (ulong) (fil_system_hash_cells() * sizeof(hash_cell_t) + fil_system_hash_nodes()), @@ -1649,7 +1645,7 @@ srv_printf_innodb_monitor( fprintf(file, "Dictionary memory allocated " ULINTPF "\n", - dict_sys ? dict_sys->size : 0); + dict_sys ? dict_sys_get_size() : 0); buf_print_io(file); @@ -1785,8 +1781,10 @@ srv_export_innodb_status(void) buf_get_total_stat(&stat); buf_get_total_list_len(&LRU_len, &free_len, &flush_list_len); buf_get_total_list_size_in_bytes(&buf_pools_list_size); - fil_crypt_total_stat(&crypt_stat); - btr_scrub_total_stat(&scrub_stat); + if (!srv_read_only_mode) { + fil_crypt_total_stat(&crypt_stat); + btr_scrub_total_stat(&scrub_stat); + } mem_adaptive_hash = 0; @@ -1809,7 +1807,7 @@ srv_export_innodb_status(void) mem_dictionary = (dict_sys ? ((dict_sys->table_hash->n_cells + dict_sys->table_id_hash->n_cells ) * sizeof(hash_cell_t) - + dict_sys->size) : 0); + + dict_sys_get_size()) : 0); mutex_enter(&srv_innodb_monitor_mutex); @@ -2057,6 +2055,10 @@ srv_export_innodb_status(void) export_vars.innodb_pages_page_compression_error = srv_stats.pages_page_compression_error; export_vars.innodb_pages_decrypted = srv_stats.pages_decrypted; export_vars.innodb_pages_encrypted = srv_stats.pages_encrypted; + export_vars.innodb_n_merge_blocks_encrypted = srv_stats.n_merge_blocks_encrypted; + export_vars.innodb_n_merge_blocks_decrypted = srv_stats.n_merge_blocks_decrypted; + export_vars.innodb_n_rowlog_blocks_encrypted = srv_stats.n_rowlog_blocks_encrypted; + export_vars.innodb_n_rowlog_blocks_decrypted = srv_stats.n_rowlog_blocks_decrypted; export_vars.innodb_defragment_compression_failures = btr_defragment_compression_failures; @@ -2100,6 +2102,7 @@ srv_export_innodb_status(void) export_vars.innodb_sec_rec_cluster_reads_avoided = srv_stats.n_sec_rec_cluster_reads_avoided; + if (!srv_read_only_mode) { export_vars.innodb_encryption_rotation_pages_read_from_cache = crypt_stat.pages_read_from_cache; export_vars.innodb_encryption_rotation_pages_read_from_disk = @@ -2127,6 +2130,7 @@ srv_export_innodb_status(void) scrub_stat.page_split_failures_missing_index; export_vars.innodb_scrub_page_split_failures_unknown = scrub_stat.page_split_failures_unknown; + } mutex_exit(&srv_innodb_monitor_mutex); } @@ -2281,7 +2285,7 @@ loop: } } - if (srv_shutdown_state >= SRV_SHUTDOWN_CLEANUP) { + if (srv_shutdown_state != SRV_SHUTDOWN_NONE) { goto exit_func; } @@ -2419,7 +2423,7 @@ loop: os_event_wait_time_low(srv_error_event, 1000000, sig_count); - if (srv_shutdown_state < SRV_SHUTDOWN_CLEANUP) { + if (srv_shutdown_state == SRV_SHUTDOWN_NONE) { goto loop; } @@ -2444,9 +2448,9 @@ srv_inc_activity_count( is caused by the background change buffer merge */ { - srv_sys->activity_count.inc(); + srv_sys.activity_count.inc(); if (ibuf_merge_activity) - srv_sys->ibuf_merge_activity_count.inc(); + srv_sys.ibuf_merge_activity_count.inc(); } /**********************************************************************//** @@ -2461,14 +2465,14 @@ srv_get_active_thread_type(void) { srv_thread_type ret = SRV_NONE; - if (srv_read_only_mode) { + if (srv_read_only_mode || srv_apply_log_only) { return(SRV_NONE); } srv_sys_mutex_enter(); for (ulint i = SRV_WORKER; i <= SRV_MASTER; ++i) { - if (srv_sys->n_threads_active[i] != 0) { + if (srv_sys.n_threads_active[i] != 0) { ret = static_cast(i); break; } @@ -2591,7 +2595,8 @@ purge_archived_logs( if (dirnamelen + strlen(fileinfo.name) + 2 > OS_FILE_MAX_PATH) continue; - snprintf(archived_log_filename + dirnamelen, OS_FILE_MAX_PATH, + snprintf(archived_log_filename + dirnamelen, + OS_FILE_MAX_PATH - dirnamelen - 1, "%s", fileinfo.name); if (before_no) { @@ -2687,12 +2692,12 @@ srv_active_wake_master_thread(void) srv_inc_activity_count(); - if (srv_sys->n_threads_active[SRV_MASTER] == 0) { + if (srv_sys.n_threads_active[SRV_MASTER] == 0) { srv_slot_t* slot; srv_sys_mutex_enter(); - slot = &srv_sys->sys_threads[SRV_MASTER_SLOT]; + slot = &srv_sys.sys_threads[SRV_MASTER_SLOT]; /* Only if the master thread has been started. */ @@ -2719,7 +2724,7 @@ srv_wake_purge_thread_if_not_active(void) ut_ad(!srv_sys_mutex_own()); if (purge_sys->state == PURGE_STATE_RUN - && srv_sys->n_threads_active[SRV_PURGE] == 0) { + && srv_sys.n_threads_active[SRV_PURGE] == 0) { srv_release_threads(SRV_PURGE, 1); } @@ -2748,7 +2753,7 @@ ulint srv_get_activity_count(void) /*========================*/ { - return(srv_sys->activity_count); + return(srv_sys.activity_count); } /** Get current server ibuf merge activity count. @@ -2757,7 +2762,7 @@ static ulint srv_get_ibuf_merge_activity_count(void) { - return(srv_sys->ibuf_merge_activity_count); + return(srv_sys.ibuf_merge_activity_count); } /*******************************************************************//** @@ -2776,14 +2781,14 @@ srv_check_activity( ULINT_UNDEFINED */ ulint old_ibuf_merge_activity_count) { - ulint new_activity_count = srv_sys->activity_count; + ulint new_activity_count = srv_sys.activity_count; if (old_ibuf_merge_activity_count == ULINT_UNDEFINED) return(new_activity_count != old_activity_count); /* If we care about ibuf merge activity, then the server is considered idle if all activity, if any, was due to ibuf merge. */ ulint new_ibuf_merge_activity_count - = srv_sys->ibuf_merge_activity_count; + = srv_sys.ibuf_merge_activity_count; ut_ad(new_ibuf_merge_activity_count <= new_activity_count); ut_ad(new_ibuf_merge_activity_count >= old_ibuf_merge_activity_count); @@ -2863,7 +2868,7 @@ srv_shutdown_print_master_pending( time_elapsed = ut_difftime(current_time, *last_print_time); if (time_elapsed > 60) { - *last_print_time = ut_time(); + *last_print_time = current_time; if (n_tables_to_drop) { ut_print_timestamp(stderr); @@ -2916,7 +2921,7 @@ srv_master_do_active_tasks(void) MONITOR_INC_TIME_IN_MICRO_SECS( MONITOR_SRV_BACKGROUND_DROP_TABLE_MICROSECOND, counter_time); - if (srv_shutdown_state > 0) { + if (srv_shutdown_state != SRV_SHUTDOWN_NONE) { return; } @@ -2950,11 +2955,7 @@ srv_master_do_active_tasks(void) MONITOR_SRV_MEM_VALIDATE_MICROSECOND, counter_time); } #endif - if (srv_shutdown_state > 0) { - return; - } - - if (srv_shutdown_state > 0) { + if (srv_shutdown_state != SRV_SHUTDOWN_NONE) { return; } @@ -2967,7 +2968,7 @@ srv_master_do_active_tasks(void) MONITOR_SRV_DICT_LRU_MICROSECOND, counter_time); } - if (srv_shutdown_state > 0) { + if (srv_shutdown_state != SRV_SHUTDOWN_NONE) { return; } @@ -3011,7 +3012,7 @@ srv_master_do_idle_tasks(void) MONITOR_SRV_BACKGROUND_DROP_TABLE_MICROSECOND, counter_time); - if (srv_shutdown_state > 0) { + if (srv_shutdown_state != SRV_SHUTDOWN_NONE) { return; } @@ -3027,7 +3028,7 @@ srv_master_do_idle_tasks(void) MONITOR_INC_TIME_IN_MICRO_SECS( MONITOR_SRV_IBUF_MERGE_MICROSECOND, counter_time); - if (srv_shutdown_state > 0) { + if (srv_shutdown_state != SRV_SHUTDOWN_NONE) { return; } @@ -3043,7 +3044,7 @@ srv_master_do_idle_tasks(void) MONITOR_INC_TIME_IN_MICRO_SECS( MONITOR_SRV_LOG_FLUSH_MICROSECOND, counter_time); - if (srv_shutdown_state > 0) { + if (srv_shutdown_state != SRV_SHUTDOWN_NONE) { return; } @@ -3064,70 +3065,42 @@ srv_master_do_idle_tasks(void) } } -/*********************************************************************//** -Perform the tasks during shutdown. The tasks that we do at shutdown -depend on srv_fast_shutdown: -2 => very fast shutdown => do no book keeping -1 => normal shutdown => clear drop table queue and make checkpoint -0 => slow shutdown => in addition to above do complete purge and ibuf -merge -@return TRUE if some work was done. FALSE otherwise */ +/** Perform shutdown tasks. +@param[in] ibuf_merge whether to complete the change buffer merge */ static -ibool -srv_master_do_shutdown_tasks( -/*=========================*/ - ib_time_t* last_print_time)/*!< last time the function - print the message */ +void +srv_shutdown(bool ibuf_merge) { - ulint n_bytes_merged = 0; - ulint n_tables_to_drop = 0; + ulint n_bytes_merged = 0; + ulint n_tables_to_drop; + ib_time_t now = ut_time(); - ut_ad(!srv_read_only_mode); + do { + ut_ad(!srv_read_only_mode); + ut_ad(srv_shutdown_state == SRV_SHUTDOWN_CLEANUP); + ++srv_main_shutdown_loops; - ++srv_main_shutdown_loops; + /* FIXME: Remove the background DROP TABLE queue; it is not + crash-safe and breaks ACID. */ + srv_main_thread_op_info = "doing background drop tables"; + n_tables_to_drop = row_drop_tables_for_mysql_in_background(); - ut_a(srv_shutdown_state > 0); + if (ibuf_merge) { + srv_main_thread_op_info = "checking free log space"; + log_free_check(); + srv_main_thread_op_info = "doing insert buffer merge"; + n_bytes_merged = ibuf_merge_in_background(true); - /* In very fast shutdown none of the following is necessary */ - if (srv_fast_shutdown == 2) { - return(FALSE); - } + /* Flush logs if needed */ + srv_sync_log_buffer_in_background(); + } - /* ALTER TABLE in MySQL requires on Unix that the table handler - can drop tables lazily after there no longer are SELECT - queries to them. */ - srv_main_thread_op_info = "doing background drop tables"; - n_tables_to_drop = row_drop_tables_for_mysql_in_background(); - - /* make sure that there is enough reusable space in the redo - log files */ - srv_main_thread_op_info = "checking free log space"; - log_free_check(); - - /* In case of normal shutdown we don't do ibuf merge or purge */ - if (srv_fast_shutdown == 1) { - goto func_exit; - } - - /* Do an ibuf merge */ - srv_main_thread_op_info = "doing insert buffer merge"; - n_bytes_merged = ibuf_merge_in_background(true); - - /* Flush logs if needed */ - srv_sync_log_buffer_in_background(); - -func_exit: - /* Make a new checkpoint about once in 10 seconds */ - srv_main_thread_op_info = "making checkpoint"; - log_checkpoint(TRUE, FALSE, FALSE); - - /* Print progress message every 60 seconds during shutdown */ - if (srv_shutdown_state > 0 && srv_print_verbose_log) { - srv_shutdown_print_master_pending( - last_print_time, n_tables_to_drop, n_bytes_merged); - } - - return(n_bytes_merged || n_tables_to_drop); + /* Print progress message every 60 seconds during shutdown */ + if (srv_print_verbose_log) { + srv_shutdown_print_master_pending( + &now, n_tables_to_drop, n_bytes_merged); + } + } while (n_bytes_merged || n_tables_to_drop); } /*********************************************************************//** @@ -3155,11 +3128,12 @@ DECLARE_THREAD(srv_master_thread)( /*!< in: a dummy parameter required by os_thread_create */ { + my_thread_init(); + srv_slot_t* slot; ulint old_activity_count = srv_get_activity_count(); ulint old_ibuf_merge_activity_count = srv_get_ibuf_merge_activity_count(); - ib_time_t last_print_time; ut_ad(!srv_read_only_mode); @@ -3180,9 +3154,8 @@ DECLARE_THREAD(srv_master_thread)( srv_main_thread_id = os_thread_pf(os_thread_get_curr_id()); slot = srv_reserve_slot(SRV_MASTER); - ut_a(slot == srv_sys->sys_threads); + ut_a(slot == srv_sys.sys_threads); - last_print_time = ut_time(); loop: if (srv_force_recovery >= SRV_FORCE_NO_BACKGROUND) { goto suspend_thread; @@ -3208,13 +3181,26 @@ loop: } } - while (srv_master_do_shutdown_tasks(&last_print_time)) { - - /* Shouldn't loop here in case of very fast shutdown */ - ut_ad(srv_fast_shutdown < 2); +suspend_thread: + switch (srv_shutdown_state) { + case SRV_SHUTDOWN_NONE: + break; + case SRV_SHUTDOWN_FLUSH_PHASE: + case SRV_SHUTDOWN_LAST_PHASE: + ut_ad(0); + /* fall through */ + case SRV_SHUTDOWN_EXIT_THREADS: + /* srv_init_abort() must have been invoked */ + case SRV_SHUTDOWN_CLEANUP: + if (srv_shutdown_state == SRV_SHUTDOWN_CLEANUP + && srv_fast_shutdown < 2) { + srv_shutdown(srv_fast_shutdown == 0); + } + srv_suspend_thread(slot); + my_thread_end(); + os_thread_exit(NULL); } -suspend_thread: srv_main_thread_op_info = "suspending"; srv_suspend_thread(slot); @@ -3226,41 +3212,32 @@ suspend_thread: srv_main_thread_op_info = "waiting for server activity"; srv_resume_thread(slot); - - if (srv_shutdown_state == SRV_SHUTDOWN_EXIT_THREADS) { - os_thread_exit(NULL); - } - goto loop; - - OS_THREAD_DUMMY_RETURN; /* Not reached, avoid compiler warning */ } -/*********************************************************************//** -Check if purge should stop. -@return true if it should shutdown. */ +/** Check if purge should stop. +@param[in] n_purged pages purged in the last batch +@return whether purge should exit */ static bool -srv_purge_should_exit( -/*==============*/ - ulint n_purged) /*!< in: pages purged in last batch */ +srv_purge_should_exit(ulint n_purged) { - switch (srv_shutdown_state) { - case SRV_SHUTDOWN_NONE: - /* Normal operation. */ - break; + ut_ad(srv_shutdown_state == SRV_SHUTDOWN_NONE + || srv_shutdown_state == SRV_SHUTDOWN_CLEANUP); - case SRV_SHUTDOWN_CLEANUP: - case SRV_SHUTDOWN_EXIT_THREADS: - /* Exit unless slow shutdown requested or all done. */ - return(srv_fast_shutdown != 0 || n_purged == 0); - - case SRV_SHUTDOWN_LAST_PHASE: - case SRV_SHUTDOWN_FLUSH_PHASE: - ut_error; + if (srv_undo_sources) { + return(false); } - - return(false); + if (srv_fast_shutdown) { + return(true); + } + /* Slow shutdown was requested. */ + if (n_purged) { + /* The previous round still did some work. */ + return(false); + } + /* Exit if there are no active transactions to roll back. */ + return(trx_sys_any_active_transactions() == 0); } /*********************************************************************//** @@ -3276,18 +3253,18 @@ srv_task_execute(void) ut_ad(!srv_read_only_mode); ut_a(srv_force_recovery < SRV_FORCE_NO_BACKGROUND); - mutex_enter(&srv_sys->tasks_mutex); + mutex_enter(&srv_sys.tasks_mutex); - if (UT_LIST_GET_LEN(srv_sys->tasks) > 0) { + if (UT_LIST_GET_LEN(srv_sys.tasks) > 0) { - thr = UT_LIST_GET_FIRST(srv_sys->tasks); + thr = UT_LIST_GET_FIRST(srv_sys.tasks); ut_a(que_node_get_type(thr->child) == QUE_NODE_PURGE); - UT_LIST_REMOVE(queue, srv_sys->tasks, thr); + UT_LIST_REMOVE(queue, srv_sys.tasks, thr); } - mutex_exit(&srv_sys->tasks_mutex); + mutex_exit(&srv_sys.tasks_mutex); if (thr != NULL) { @@ -3314,6 +3291,8 @@ DECLARE_THREAD(srv_worker_thread)( void* arg MY_ATTRIBUTE((unused))) /*!< in: a dummy parameter required by os_thread_create */ { + my_thread_init(); + srv_slot_t* slot; ulint tid_i = os_atomic_increment_ulint(&purge_tid_i, 1); @@ -3337,7 +3316,7 @@ DECLARE_THREAD(srv_worker_thread)( srv_sys_mutex_enter(); - ut_a(srv_sys->n_threads_active[SRV_WORKER] < srv_n_purge_threads); + ut_a(srv_sys.n_threads_active[SRV_WORKER] < srv_n_purge_threads); srv_sys_mutex_exit(); @@ -3379,6 +3358,7 @@ DECLARE_THREAD(srv_worker_thread)( os_thread_pf(os_thread_get_curr_id())); #endif /* UNIV_DEBUG_THREAD_CREATION */ + my_thread_end(); /* We count the number of threads in os_thread_exit(). A created thread should always use that to exit and not use return() to exit. */ os_thread_exit(NULL); @@ -3532,7 +3512,7 @@ srv_purge_coordinator_suspend( } rw_lock_x_unlock(&purge_sys->latch); - } while (stop); + } while (stop && srv_undo_sources); srv_resume_thread(slot, 0, false); } @@ -3547,6 +3527,8 @@ DECLARE_THREAD(srv_purge_coordinator_thread)( void* arg MY_ATTRIBUTE((unused))) /*!< in: a dummy parameter required by os_thread_create */ { + my_thread_init(); + srv_slot_t* slot; ulint n_total_purged = ULINT_UNDEFINED; @@ -3584,6 +3566,7 @@ DECLARE_THREAD(srv_purge_coordinator_thread)( purge didn't purge any records then wait for activity. */ if (srv_shutdown_state == SRV_SHUTDOWN_NONE + && srv_undo_sources && (purge_sys->state == PURGE_STATE_STOP || n_total_purged == 0)) { @@ -3604,36 +3587,8 @@ DECLARE_THREAD(srv_purge_coordinator_thread)( srv_n_purge_threads, &n_total_purged); srv_inc_activity_count(); - } while (!srv_purge_should_exit(n_total_purged)); - /* Ensure that we don't jump out of the loop unless the - exit condition is satisfied. */ - - ut_a(srv_purge_should_exit(n_total_purged)); - - ulint n_pages_purged = ULINT_MAX; - - /* Ensure that all records are purged if it is not a fast shutdown. - This covers the case where a record can be added after we exit the - loop above. */ - while (srv_fast_shutdown == 0 && n_pages_purged > 0) { - n_pages_purged = trx_purge(1, srv_purge_batch_size, false); - } - - /* This trx_purge is called to remove any undo records (added by - background threads) after completion of the above loop. When - srv_fast_shutdown != 0, a large batch size can cause significant - delay in shutdown ,so reducing the batch size to magic number 20 - (which was default in 5.5), which we hope will be sufficient to - remove all the undo records */ - const uint temp_batch_size = 20; - - n_pages_purged = trx_purge(1, srv_purge_batch_size <= temp_batch_size - ? srv_purge_batch_size : temp_batch_size, - true); - ut_a(n_pages_purged == 0 || srv_fast_shutdown != 0); - /* The task queue should always be empty, independent of fast shutdown state. */ ut_a(srv_get_task_queue_length() == 0); @@ -3660,6 +3615,7 @@ DECLARE_THREAD(srv_purge_coordinator_thread)( srv_release_threads(SRV_WORKER, srv_n_purge_threads - 1); } + my_thread_end(); /* We count the number of threads in os_thread_exit(). A created thread should always use that to exit and not use return() to exit. */ os_thread_exit(NULL); @@ -3677,11 +3633,11 @@ srv_que_task_enqueue_low( que_thr_t* thr) /*!< in: query thread */ { ut_ad(!srv_read_only_mode); - mutex_enter(&srv_sys->tasks_mutex); + mutex_enter(&srv_sys.tasks_mutex); - UT_LIST_ADD_LAST(queue, srv_sys->tasks, thr); + UT_LIST_ADD_LAST(queue, srv_sys.tasks, thr); - mutex_exit(&srv_sys->tasks_mutex); + mutex_exit(&srv_sys.tasks_mutex); srv_release_threads(SRV_WORKER, 1); } @@ -3698,11 +3654,11 @@ srv_get_task_queue_length(void) ut_ad(!srv_read_only_mode); - mutex_enter(&srv_sys->tasks_mutex); + mutex_enter(&srv_sys.tasks_mutex); - n_tasks = UT_LIST_GET_LEN(srv_sys->tasks); + n_tasks = UT_LIST_GET_LEN(srv_sys.tasks); - mutex_exit(&srv_sys->tasks_mutex); + mutex_exit(&srv_sys.tasks_mutex); return(n_tasks); } @@ -3725,3 +3681,19 @@ srv_purge_wakeup() } } } + +/** Check whether given space id is undo tablespace id +@param[in] space_id space id to check +@return true if it is undo tablespace else false. */ +bool +srv_is_undo_tablespace( + ulint space_id) +{ + if (srv_undo_space_id_start == 0) { + return (false); + } + + return(space_id >= srv_undo_space_id_start + && space_id < (srv_undo_space_id_start + + srv_undo_tablespaces_open)); +} diff --git a/storage/xtradb/srv/srv0start.cc b/storage/xtradb/srv/srv0start.cc index 5255a7454ea..a3c5a03a1d9 100644 --- a/storage/xtradb/srv/srv0start.cc +++ b/storage/xtradb/srv/srv0start.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved. +Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. Copyright (c) 2008, Google Inc. Copyright (c) 2009, Percona Inc. Copyright (c) 2013, 2017, MariaDB Corporation @@ -73,8 +73,7 @@ Created 2/16/1996 Heikki Tuuri #include "btr0defragment.h" #include "ut0timer.h" #include "btr0scrub.h" - -#include +#include "mysql/service_wsrep.h" /* wsrep_recovery */ #ifndef UNIV_HOTBACKUP # include "trx0rseg.h" @@ -121,6 +120,9 @@ UNIV_INTERN ibool srv_have_fullfsync = FALSE; /** TRUE if a raw partition is in use */ UNIV_INTERN ibool srv_start_raw_disk_in_use = FALSE; +/** UNDO tablespaces starts with space id. */ +ulint srv_undo_space_id_start; + /** TRUE if the server is being started, before rolling back any incomplete transactions */ UNIV_INTERN ibool srv_startup_is_before_trx_rollback_phase = FALSE; @@ -129,7 +131,11 @@ UNIV_INTERN ibool srv_is_being_started = FALSE; /** TRUE if the server was successfully started */ UNIV_INTERN ibool srv_was_started = FALSE; /** TRUE if innobase_start_or_create_for_mysql() has been called */ -static ibool srv_start_has_been_called = FALSE; +static ibool srv_start_has_been_called; + +/** Whether any undo log records can be generated */ +UNIV_INTERN bool srv_undo_sources; + #ifdef UNIV_DEBUG /** InnoDB system tablespace to set during recovery */ UNIV_INTERN uint srv_sys_space_size_debug; @@ -139,8 +145,8 @@ UNIV_INTERN uint srv_sys_space_size_debug; SRV_SHUTDOWN_CLEANUP and then to SRV_SHUTDOWN_LAST_PHASE, and so on */ UNIV_INTERN enum srv_shutdown_state srv_shutdown_state = SRV_SHUTDOWN_NONE; -/** Files comprising the system tablespace */ -static os_file_t files[1000]; +/** Files comprising the system tablespace. Also used by Mariabackup. */ +UNIV_INTERN pfs_os_file_t files[1000]; /** io_handler_thread parameters for thread identification */ static ulint n[SRV_MAX_N_IO_THREADS]; @@ -203,6 +209,39 @@ UNIV_INTERN mysql_pfs_key_t srv_purge_thread_key; UNIV_INTERN mysql_pfs_key_t srv_log_tracking_thread_key; #endif /* UNIV_PFS_THREAD */ +/** Innobase start-up aborted. Perform cleanup actions. +@param[in] create_new_db TRUE if new db is being created +@param[in] file File name +@param[in] line Line number +@param[in] err Reason for aborting InnoDB startup +@return DB_SUCCESS or error code. */ +static +dberr_t +srv_init_abort( + bool create_new_db, + const char* file, + ulint line, + dberr_t err) +{ + if (create_new_db) { + ib_logf(IB_LOG_LEVEL_ERROR, + "Database creation was aborted" + " at %s [" ULINTPF "]" + " with error %s. You may need" + " to delete the ibdata1 file before trying to start" + " up again.", + file, line, ut_strerr(err)); + } else { + ib_logf(IB_LOG_LEVEL_ERROR, + "Plugin initialization aborted" + " at %s [" ULINTPF "]" + " with error %s.", + file, line, ut_strerr(err)); + } + + return(err); +} + /*********************************************************************//** Convert a numeric string that optionally ends in G or M or K, to a number containing megabytes. @@ -584,7 +623,7 @@ static MY_ATTRIBUTE((nonnull, warn_unused_result)) dberr_t create_log_file( /*============*/ - os_file_t* file, /*!< out: file handle */ + pfs_os_file_t* file, /*!< out: file handle */ const char* name) /*!< in: log file name */ { ibool ret; @@ -728,7 +767,7 @@ create_log_files( /* Create a log checkpoint. */ mutex_enter(&log_sys->mutex); - ut_d(recv_no_log_write = FALSE); + ut_d(recv_no_log_write = srv_apply_log_only); recv_reset_logs( #ifdef UNIV_LOG_ARCHIVE UT_LIST_GET_FIRST(log_sys->log_groups)->archived_file_no, @@ -802,7 +841,7 @@ static MY_ATTRIBUTE((nonnull, warn_unused_result)) dberr_t open_log_file( /*==========*/ - os_file_t* file, /*!< out: file handle */ + pfs_os_file_t* file, /*!< out: file handle */ const char* name, /*!< in: log file name */ os_offset_t* size) /*!< out: file size */ { @@ -823,35 +862,35 @@ open_log_file( return(DB_SUCCESS); } -/*********************************************************************//** -Creates or opens database data files and closes them. + +/** Creates or opens database data files and closes them. +@param[out] create_new_db true = create new database +@param[out] min_arch_log_no min of archived log numbers in + data files +@param[out] max_arch_log_no max of archived log numbers in + data files +@param[out] flushed_lsn flushed lsn in fist datafile +@param[out] sum_of_new_sizes sum of sizes of the new files + added @return DB_SUCCESS or error code */ -static MY_ATTRIBUTE((nonnull, warn_unused_result)) +MY_ATTRIBUTE((nonnull, warn_unused_result)) dberr_t open_or_create_data_files( -/*======================*/ - ibool* create_new_db, /*!< out: TRUE if new database should be - created */ + bool* create_new_db, #ifdef UNIV_LOG_ARCHIVE - lsn_t* min_arch_log_no,/*!< out: min of archived log - numbers in data files */ - lsn_t* max_arch_log_no,/*!< out: max of archived log - numbers in data files */ + lsn_t* min_arch_log_no, + lsn_t* max_arch_log_no, #endif /* UNIV_LOG_ARCHIVE */ - lsn_t* min_flushed_lsn,/*!< out: min of flushed lsn - values in data files */ - lsn_t* max_flushed_lsn,/*!< out: max of flushed lsn - values in data files */ - ulint* sum_of_new_sizes)/*!< out: sum of sizes of the - new files added */ + lsn_t* flushed_lsn, + ulint* sum_of_new_sizes) { ibool ret; ulint i; - ibool one_opened = FALSE; - ibool one_created = FALSE; + bool one_opened = false; + bool one_created = false; os_offset_t size; ulint flags; - ulint space; + ulint space = 0; ulint rounded_size_pages; char name[10000]; fil_space_crypt_t* crypt_data=NULL; @@ -867,7 +906,7 @@ open_or_create_data_files( *sum_of_new_sizes = 0; - *create_new_db = FALSE; + *create_new_db = false; srv_normalize_path_for_win(srv_data_home); @@ -919,7 +958,7 @@ open_or_create_data_files( && os_file_get_last_error(false) != OS_FILE_ALREADY_EXISTS #ifdef UNIV_AIX - /* AIX 5.1 after security patch ML7 may have + /* AIX 5.1 after security patch ML7 may have errno set to 0 here, which causes our function to return 100; work around that AIX problem */ @@ -955,9 +994,10 @@ open_or_create_data_files( } const char* check_msg; + check_msg = fil_read_first_page( files[i], FALSE, &flags, &space, - min_flushed_lsn, max_flushed_lsn, NULL); + flushed_lsn, NULL); /* If first page is valid, don't overwrite DB. It prevents overwriting DB when mysql_install_db @@ -988,6 +1028,7 @@ open_or_create_data_files( name); return(DB_ERROR); } + if (srv_data_file_is_raw_partition[i] == SRV_OLD_RAW) { ut_a(!srv_read_only_mode); files[i] = os_file_create( @@ -1007,7 +1048,6 @@ open_or_create_data_files( } if (!ret) { - os_file_get_last_error(true); ib_logf(IB_LOG_LEVEL_ERROR, @@ -1017,7 +1057,6 @@ open_or_create_data_files( } if (srv_data_file_is_raw_partition[i] == SRV_OLD_RAW) { - goto skip_size_check; } @@ -1044,16 +1083,15 @@ size_check: "auto-extending " "data file %s is " "of a different size " - "%lu pages (rounded " + ULINTPF " pages (rounded " "down to MB) than specified " "in the .cnf file: " - "initial %lu pages, " - "max %lu (relevant if " + "initial " ULINTPF " pages, " + "max " ULINTPF " (relevant if " "non-zero) pages!", name, - (ulong) rounded_size_pages, - (ulong) srv_data_file_sizes[i], - (ulong) + rounded_size_pages, + srv_data_file_sizes[i], srv_last_file_size_max); return(DB_ERROR); @@ -1066,12 +1104,12 @@ size_check: ib_logf(IB_LOG_LEVEL_ERROR, "Data file %s is of a different " - "size %lu pages (rounded down to MB) " + "size " ULINTPF " pages (rounded down to MB) " "than specified in the .cnf file " - "%lu pages!", + ULINTPF " pages!", name, - (ulong) rounded_size_pages, - (ulong) srv_data_file_sizes[i]); + rounded_size_pages, + srv_data_file_sizes[i]); return(DB_ERROR); } @@ -1080,15 +1118,17 @@ skip_size_check: /* This is the earliest location where we can load the double write buffer. */ if (i == 0) { + /* XtraBackup never loads corrupted pages from + the doublewrite buffer */ buf_dblwr_init_or_load_pages( - files[i], srv_data_file_names[i], true); + files[i], srv_data_file_names[i], !IS_XTRABACKUP()); } bool retry = true; check_first_page: check_msg = fil_read_first_page( files[i], one_opened, &flags, &space, - min_flushed_lsn, max_flushed_lsn, &crypt_data); + flushed_lsn, &crypt_data); if (check_msg) { @@ -1125,9 +1165,9 @@ check_first_page: != fsp_flags_get_page_size(flags)) { ib_logf(IB_LOG_LEVEL_ERROR, - "Data file \"%s\" uses page size %lu," + "Data file \"%s\" uses page size " ULINTPF " ," "but the start-up parameter " - "is --innodb-page-size=%lu", + "is --innodb-page-size=" ULINTPF " .", name, fsp_flags_get_page_size(flags), UNIV_PAGE_SIZE); @@ -1158,9 +1198,9 @@ check_first_page: } ib_logf(IB_LOG_LEVEL_INFO, - "Setting file %s size to %lu MB", + "Setting file %s size to " ULINTPF " MB", name, - (ulong) (srv_data_file_sizes[i] + (srv_data_file_sizes[i] >> (20 - UNIV_PAGE_SIZE_SHIFT))); ret = os_file_set_size( @@ -1187,11 +1227,6 @@ check_first_page: ut_a(ret); if (i == 0) { - if (!crypt_data) { - crypt_data = fil_space_create_crypt_data(FIL_ENCRYPTION_DEFAULT, - FIL_DEFAULT_ENCRYPTION_KEY); - } - flags = FSP_FLAGS_PAGE_SSIZE(); fil_space_create(name, 0, flags, FIL_TABLESPACE, @@ -1219,7 +1254,7 @@ srv_undo_tablespace_create( const char* name, /*!< in: tablespace name */ ulint size) /*!< in: tablespace size in pages */ { - os_file_t fh; + pfs_os_file_t fh; ibool ret; dberr_t err = DB_SUCCESS; @@ -1297,7 +1332,7 @@ srv_undo_tablespace_open( const char* name, /*!< in: tablespace name */ ulint space) /*!< in: tablespace id */ { - os_file_t fh; + pfs_os_file_t fh; dberr_t err = DB_ERROR; ibool ret; ulint flags; @@ -1328,11 +1363,30 @@ srv_undo_tablespace_open( size = os_file_get_size(fh); ut_a(size != (os_offset_t) -1); + /* Load the tablespace into InnoDB's internal + data structures. */ + + const char* check_msg; + fil_space_crypt_t* crypt_data = NULL; + + /* Set the compressed page size to 0 (non-compressed) */ + flags = FSP_FLAGS_PAGE_SSIZE(); + + /* Read first page to find out does the crypt_info + exists on undo tablespace. */ + check_msg = fil_read_first_page( + fh, FALSE, &flags, &space, + NULL, &crypt_data, false); + ret = os_file_close(fh); ut_a(ret); - /* Load the tablespace into InnoDB's internal - data structures. */ + if (check_msg) { + ib_logf(IB_LOG_LEVEL_ERROR, + "%s in data file %s", + check_msg, name); + return (err); + } /* We set the biggest space id to the undo tablespace because InnoDB hasn't opened any other tablespace apart @@ -1340,10 +1394,8 @@ srv_undo_tablespace_open( fil_set_max_space_id_if_bigger(space); - /* Set the compressed page size to 0 (non-compressed) */ - flags = FSP_FLAGS_PAGE_SSIZE(); fil_space_create(name, space, flags, FIL_TABLESPACE, - NULL /* no encryption */, + crypt_data, true /* create */); ut_a(fil_validate()); @@ -1365,12 +1417,15 @@ srv_undo_tablespace_open( /******************************************************************** Opens the configured number of undo tablespaces. @return DB_SUCCESS or error code */ -static dberr_t srv_undo_tablespaces_init( /*======================*/ ibool create_new_db, /*!< in: TRUE if new db being created */ + ibool backup_mode, /*!< in: TRUE disables reading + the system tablespace (used in + XtraBackup), FALSE is passed on + recovery. */ const ulint n_conf_tablespaces, /*!< in: configured undo tablespaces */ ulint* n_opened) /*!< out: number of UNDO @@ -1399,13 +1454,23 @@ srv_undo_tablespaces_init( for (i = 0; create_new_db && i < n_conf_tablespaces; ++i) { char name[OS_FILE_MAX_PATH]; + ulint space_id = i + 1; + + DBUG_EXECUTE_IF("innodb_undo_upgrade", + space_id = i + 3;); ut_snprintf( name, sizeof(name), "%s%cundo%03lu", - srv_undo_dir, SRV_PATH_SEPARATOR, i + 1); + srv_undo_dir, SRV_PATH_SEPARATOR, space_id); + + if (i == 0) { + srv_undo_space_id_start = space_id; + prev_space_id = srv_undo_space_id_start - 1; + } + + undo_tablespace_ids[i] = space_id; - /* Undo space ids start from 1. */ err = srv_undo_tablespace_create( name, SRV_UNDO_TABLESPACE_SIZE_IN_PAGES); @@ -1424,17 +1489,31 @@ srv_undo_tablespaces_init( we build the undo_tablespace_ids ourselves since they don't already exist. */ - if (!create_new_db) { + if (!create_new_db && !backup_mode) { n_undo_tablespaces = trx_rseg_get_n_undo_tablespaces( undo_tablespace_ids); + + if (n_undo_tablespaces != 0) { + srv_undo_space_id_start = undo_tablespace_ids[0]; + prev_space_id = srv_undo_space_id_start - 1; + } + } else { n_undo_tablespaces = n_conf_tablespaces; - for (i = 1; i <= n_undo_tablespaces; ++i) { - undo_tablespace_ids[i - 1] = i; - } + undo_tablespace_ids[n_conf_tablespaces] = ULINT_UNDEFINED; - undo_tablespace_ids[i] = ULINT_UNDEFINED; + if (backup_mode) { + ut_ad(!create_new_db); + /* MDEV-13561 FIXME: Determine srv_undo_space_id_start + from the undo001 file. */ + srv_undo_space_id_start = 1; + + for (i = 0; i < n_undo_tablespaces; i++) { + undo_tablespace_ids[i] + = i + srv_undo_space_id_start; + } + } } /* Open all the undo tablespaces that are currently in use. If we @@ -1458,8 +1537,6 @@ srv_undo_tablespaces_init( ut_a(undo_tablespace_ids[i] != 0); ut_a(undo_tablespace_ids[i] != ULINT_UNDEFINED); - /* Undo space ids start from 1. */ - err = srv_undo_tablespace_open(name, undo_tablespace_ids[i]); if (err != DB_SUCCESS) { @@ -1494,11 +1571,23 @@ srv_undo_tablespaces_init( break; } + /** Note the first undo tablespace id in case of + no active undo tablespace. */ + if (n_undo_tablespaces == 0) { + srv_undo_space_id_start = i; + } + ++n_undo_tablespaces; ++*n_opened; } + /** Explictly specify the srv_undo_space_id_start + as zero when there are no undo tablespaces. */ + if (n_undo_tablespaces == 0) { + srv_undo_space_id_start = 0; + } + /* If the user says that there are fewer than what we find we tolerate that discrepancy but not the inverse. Because there could be unused undo tablespaces for future use. */ @@ -1543,10 +1632,11 @@ srv_undo_tablespaces_init( mtr_start(&mtr); /* The undo log tablespace */ - for (i = 1; i <= n_undo_tablespaces; ++i) { + for (i = 0; i < n_undo_tablespaces; ++i) { fsp_header_init( - i, SRV_UNDO_TABLESPACE_SIZE_IN_PAGES, &mtr); + undo_tablespace_ids[i], + SRV_UNDO_TABLESPACE_SIZE_IN_PAGES, &mtr); } mtr_commit(&mtr); @@ -1621,12 +1711,10 @@ are not found and the user wants. @return DB_SUCCESS or error code */ UNIV_INTERN dberr_t -innobase_start_or_create_for_mysql(void) -/*====================================*/ +innobase_start_or_create_for_mysql() { - ibool create_new_db; - lsn_t min_flushed_lsn; - lsn_t max_flushed_lsn; + bool create_new_db; + lsn_t flushed_lsn; #ifdef UNIV_LOG_ARCHIVE lsn_t min_arch_log_no = LSN_MAX; lsn_t max_arch_log_no = LSN_MAX; @@ -1660,6 +1748,10 @@ innobase_start_or_create_for_mysql(void) /* This should be initialized early */ ut_init_timer(); + if (srv_force_recovery == SRV_FORCE_NO_LOG_REDO) { + srv_read_only_mode = 1; + } + high_level_read_only = srv_read_only_mode || srv_force_recovery > SRV_FORCE_NO_TRX_UNDO; @@ -2171,7 +2263,7 @@ innobase_start_or_create_for_mysql(void) #ifdef UNIV_LOG_ARCHIVE &min_arch_log_no, &max_arch_log_no, #endif /* UNIV_LOG_ARCHIVE */ - &min_flushed_lsn, &max_flushed_lsn, + &flushed_lsn, &sum_of_new_sizes); if (err == DB_FAIL) { @@ -2215,12 +2307,12 @@ innobase_start_or_create_for_mysql(void) bool success = buf_flush_list(ULINT_MAX, LSN_MAX, NULL); ut_a(success); - min_flushed_lsn = max_flushed_lsn = log_get_lsn(); + flushed_lsn = log_get_lsn(); buf_flush_wait_batch_end(NULL, BUF_FLUSH_LIST); err = create_log_files(create_new_db, logfilename, dirnamelen, - max_flushed_lsn, logfile0); + flushed_lsn, logfile0); if (err != DB_SUCCESS) { return(err); @@ -2240,19 +2332,8 @@ innobase_start_or_create_for_mysql(void) if (err == DB_NOT_FOUND) { if (i == 0) { - if (max_flushed_lsn - != min_flushed_lsn) { - ib_logf(IB_LOG_LEVEL_ERROR, - "Cannot create" - " log files because" - " data files are" - " corrupt or" - " not in sync" - " with each other"); - return(DB_ERROR); - } - if (max_flushed_lsn < (lsn_t) 1000) { + if (flushed_lsn < (lsn_t) 1000) { ib_logf(IB_LOG_LEVEL_ERROR, "Cannot create" " log files because" @@ -2267,14 +2348,14 @@ innobase_start_or_create_for_mysql(void) err = create_log_files( create_new_db, logfilename, - dirnamelen, max_flushed_lsn, + dirnamelen, flushed_lsn, logfile0); if (err == DB_SUCCESS) { err = create_log_files_rename( logfilename, dirnamelen, - max_flushed_lsn, + flushed_lsn, logfile0); } @@ -2284,14 +2365,13 @@ innobase_start_or_create_for_mysql(void) /* Suppress the message about crash recovery. */ - max_flushed_lsn = min_flushed_lsn - = log_get_lsn(); + flushed_lsn = log_get_lsn(); goto files_checked; - } else if (i < 2) { - /* must have at least 2 log files */ - ib_logf(IB_LOG_LEVEL_ERROR, - "Only one log file found."); - return(err); + } else if (i < 2 && !IS_XTRABACKUP()) { + /* must have at least 2 log files */ + ib_logf(IB_LOG_LEVEL_ERROR, + "Only one log file found."); + return(err); } /* opened all files */ @@ -2385,6 +2465,7 @@ files_checked: err = srv_undo_tablespaces_init( create_new_db, + FALSE, srv_undo_tablespaces, &srv_undo_tablespaces_open); @@ -2414,9 +2495,23 @@ files_checked: mtr_start(&mtr); fsp_header_init(0, sum_of_new_sizes, &mtr); + compile_time_assert(TRX_SYS_SPACE == 0); + compile_time_assert(IBUF_SPACE_ID == 0); + + ulint ibuf_root = btr_create( + DICT_CLUSTERED | DICT_UNIVERSAL | DICT_IBUF, + 0, 0, DICT_IBUF_ID_MIN, + dict_ind_redundant, &mtr); mtr_commit(&mtr); + if (ibuf_root == FIL_NULL) { + return(srv_init_abort(true, __FILE__, __LINE__, + DB_ERROR)); + } + + ut_ad(ibuf_root == IBUF_TREE_ROOT_PAGE_NO); + /* To maintain backward compatibility we create only the first rollback segment before the double write buffer. All the remaining rollback segments will be created later, @@ -2442,17 +2537,19 @@ files_checked: bool success = buf_flush_list(ULINT_MAX, LSN_MAX, NULL); ut_a(success); - min_flushed_lsn = max_flushed_lsn = log_get_lsn(); + flushed_lsn = log_get_lsn(); buf_flush_wait_batch_end(NULL, BUF_FLUSH_LIST); /* Stamp the LSN to the data files. */ - fil_write_flushed_lsn_to_data_files(max_flushed_lsn, 0); + err = fil_write_flushed_lsn(flushed_lsn); - fil_flush_file_spaces(FIL_TABLESPACE); + if (err != DB_SUCCESS) { + return(err); + } err = create_log_files_rename(logfilename, dirnamelen, - max_flushed_lsn, logfile0); + flushed_lsn, logfile0); if (err != DB_SUCCESS) { return(err); @@ -2507,7 +2604,7 @@ files_checked: err = recv_recovery_from_checkpoint_start( LOG_CHECKPOINT, LSN_MAX, - min_flushed_lsn, max_flushed_lsn); + flushed_lsn); if (err != DB_SUCCESS) { return(err); @@ -2531,6 +2628,11 @@ files_checked: recv_group_scan_log_recs(). */ recv_apply_hashed_log_recs(true); + + if (recv_sys->found_corrupt_log) { + return (DB_CORRUPTION); + } + DBUG_PRINT("ib_log", ("apply completed")); } @@ -2615,6 +2717,11 @@ files_checked: recv_recovery_from_checkpoint_finish(); + if (srv_apply_log_only) { + ut_ad(IS_XTRABACKUP()); + goto skip_processes; + } + if (srv_force_recovery < SRV_FORCE_NO_IBUF_MERGE) { /* The following call is necessary for the insert buffer to work with multiple tablespaces. We must @@ -2653,6 +2760,17 @@ files_checked: dict_check_tablespaces_and_store_max_id(dict_check); } + if (IS_XTRABACKUP() + && !srv_backup_mode + && srv_read_only_mode + && srv_log_file_size_requested != srv_log_file_size) { + + ib_logf(IB_LOG_LEVEL_WARN, + "Log files size mismatch, ignored in readonly mode"); + srv_log_file_size_requested = srv_log_file_size; + } + + if (!srv_force_recovery && !recv_sys->found_corrupt_log && (srv_log_file_size_requested != srv_log_file_size @@ -2674,7 +2792,7 @@ files_checked: DBUG_EXECUTE_IF("innodb_log_abort_1", return(DB_ERROR);); - min_flushed_lsn = max_flushed_lsn = log_get_lsn(); + flushed_lsn = log_get_lsn(); ib_logf(IB_LOG_LEVEL_WARN, "Resizing redo log from %u*%u to %u*%u pages" @@ -2683,7 +2801,7 @@ files_checked: (unsigned) srv_log_file_size, (unsigned) srv_n_log_files, (unsigned) srv_log_file_size_requested, - max_flushed_lsn); + flushed_lsn); buf_flush_wait_batch_end(NULL, BUF_FLUSH_LIST); @@ -2693,7 +2811,7 @@ files_checked: we need to explicitly flush the log buffers. */ fil_flush(SRV_LOG_SPACE_FIRST_ID); - ut_ad(max_flushed_lsn == log_get_lsn()); + ut_ad(flushed_lsn == log_get_lsn()); /* Prohibit redo log writes from any other threads until creating a log checkpoint at the @@ -2705,8 +2823,7 @@ files_checked: return(DB_ERROR);); /* Stamp the LSN to the data files. */ - fil_write_flushed_lsn_to_data_files( - max_flushed_lsn, 0); + err = fil_write_flushed_lsn(flushed_lsn); DBUG_EXECUTE_IF("innodb_log_abort_4", err = DB_ERROR;); @@ -2714,8 +2831,6 @@ files_checked: return(err); } - fil_flush_file_spaces(FIL_TABLESPACE); - /* Close and free the redo log files, so that we can replace them. */ fil_close_log_files(true); @@ -2732,28 +2847,23 @@ files_checked: srv_log_file_size = srv_log_file_size_requested; err = create_log_files(create_new_db, logfilename, - dirnamelen, max_flushed_lsn, + dirnamelen, flushed_lsn, logfile0); if (err != DB_SUCCESS) { return(err); } - /* create_log_files() can increase system lsn that is - why FIL_PAGE_FILE_FLUSH_LSN have to be updated */ - min_flushed_lsn = max_flushed_lsn = log_get_lsn(); - fil_write_flushed_lsn_to_data_files(min_flushed_lsn, 0); - fil_flush_file_spaces(FIL_TABLESPACE); - err = create_log_files_rename(logfilename, dirnamelen, log_get_lsn(), logfile0); + if (err != DB_SUCCESS) { return(err); } } - srv_startup_is_before_trx_rollback_phase = FALSE; recv_recovery_rollback_active(); + srv_startup_is_before_trx_rollback_phase = FALSE; /* It is possible that file_format tag has never been set. In this case we initialize it to minimum @@ -2793,10 +2903,9 @@ files_checked: /* fprintf(stderr, "Max allowed record size %lu\n", page_get_free_space_of_empty() / 2); */ - if (buf_dblwr == NULL) { - /* Create the doublewrite buffer to a new tablespace */ - - buf_dblwr_create(); + if (!buf_dblwr_create()) { + return(srv_init_abort(create_new_db, __FILE__, __LINE__, + DB_ERROR)); } /* Here the double write buffer has already been created and so @@ -2826,6 +2935,9 @@ files_checked: /* Can only happen if server is read only. */ ut_a(srv_read_only_mode); srv_undo_logs = ULONG_UNDEFINED; + } else if (srv_available_undo_logs < srv_undo_logs) { + /* Should due to out of file space. */ + return (srv_init_abort(create_new_db, __FILE__, __LINE__, DB_ERROR)); } if (!srv_read_only_mode) { @@ -2883,6 +2995,16 @@ files_checked: srv_master_thread, NULL, thread_ids + (1 + SRV_MAX_N_IO_THREADS)); thread_started[1 + SRV_MAX_N_IO_THREADS] = true; + + srv_undo_sources = true; + /* Create the dict stats gathering thread */ + srv_dict_stats_thread_active = true; + dict_stats_thread_handle = os_thread_create( + dict_stats_thread, NULL, NULL); + dict_stats_thread_started = true; + + /* Create the thread that will optimize the FTS sub-system. */ + fts_optimize_init(); } if (!srv_read_only_mode @@ -2927,12 +3049,16 @@ files_checked: } - buf_flush_page_cleaner_thread_handle = os_thread_create(buf_flush_page_cleaner_thread, NULL, NULL); + buf_page_cleaner_is_active = true; + buf_flush_page_cleaner_thread_handle = os_thread_create( + buf_flush_page_cleaner_thread, NULL, NULL); buf_flush_page_cleaner_thread_started = true; - } - buf_flush_lru_manager_thread_handle = os_thread_create(buf_flush_lru_manager_thread, NULL, NULL); - buf_flush_lru_manager_thread_started = true; + buf_lru_manager_is_active = true; + buf_flush_lru_manager_thread_handle = os_thread_create( + buf_flush_lru_manager_thread, NULL, NULL); + buf_flush_lru_manager_thread_started = true; + } if (!srv_file_per_table && srv_pass_corrupt_table) { fprintf(stderr, "InnoDB: Warning:" @@ -2980,10 +3106,10 @@ files_checked: if (!wsrep_recovery) { #endif /* WITH_WSREP */ /* Create the buffer pool dump/load thread */ + srv_buf_dump_thread_active = true; buf_dump_thread_handle= os_thread_create(buf_dump_thread, NULL, NULL); - srv_buf_dump_thread_active = true; buf_dump_thread_started = true; #ifdef WITH_WSREP } else { @@ -2992,28 +3118,19 @@ files_checked: "wsrep recovery."); } #endif /* WITH_WSREP */ - - /* Create the dict stats gathering thread */ - dict_stats_thread_handle = os_thread_create( - dict_stats_thread, NULL, NULL); - srv_dict_stats_thread_active = true; - dict_stats_thread_started = true; - - /* Create the thread that will optimize the FTS sub-system. */ - fts_optimize_init(); - /* Create thread(s) that handles key rotation */ fil_system_enter(); + btr_scrub_init(); fil_crypt_threads_init(); fil_system_exit(); + + /* Initialize online defragmentation. */ + btr_defragment_init(); + btr_defragment_thread_active = true; + os_thread_create(btr_defragment_thread, NULL, NULL); } - /* Init data for datafile scrub threads */ - btr_scrub_init(); - - /* Initialize online defragmentation. */ - btr_defragment_init(); - +skip_processes: srv_was_started = TRUE; return(DB_SUCCESS); @@ -3049,13 +3166,10 @@ srv_fts_close(void) } #endif -/****************************************************************//** -Shuts down the InnoDB database. -@return DB_SUCCESS or error code */ +/** Shut down InnoDB. */ UNIV_INTERN -dberr_t -innobase_shutdown_for_mysql(void) -/*=============================*/ +void +innodb_shutdown() { ulint i; @@ -3065,15 +3179,20 @@ innobase_shutdown_for_mysql(void) "Shutting down an improperly started, " "or created database!"); } - - return(DB_SUCCESS); } - if (!srv_read_only_mode) { + if (srv_undo_sources) { + ut_ad(!srv_read_only_mode); /* Shutdown the FTS optimize sub system. */ fts_optimize_start_shutdown(); fts_optimize_end(); + dict_stats_shutdown(); + while (row_get_background_drop_list_len_low()) { + srv_wake_master_thread(); + os_thread_yield(); + } + srv_undo_sources = false; } /* 1. Flush the buffer pool to disk, write the current lsn to @@ -3174,14 +3293,13 @@ innobase_shutdown_for_mysql(void) srv_misc_tmpfile = 0; } - if (!srv_read_only_mode) { + if (!srv_read_only_mode && !srv_apply_log_only) { dict_stats_thread_deinit(); fil_crypt_threads_cleanup(); + btr_scrub_cleanup(); + btr_defragment_shutdown(); } - /* Cleanup data for datafile scrubbing */ - btr_scrub_cleanup(); - #ifdef __WIN__ /* MDEV-361: ha_innodb.dll leaks handles on Windows MDEV-7403: should not pass recv_writer_thread_handle to @@ -3287,89 +3405,11 @@ innobase_shutdown_for_mysql(void) srv_was_started = FALSE; srv_start_has_been_called = FALSE; - - return(DB_SUCCESS); + /* reset io_tid_i, in case current process does second innodb start (xtrabackup might do that).*/ + io_tid_i = 0; } #endif /* !UNIV_HOTBACKUP */ - -/******************************************************************** -Signal all per-table background threads to shutdown, and wait for them to do -so. */ -UNIV_INTERN -void -srv_shutdown_table_bg_threads(void) -/*===============================*/ -{ - dict_table_t* table; - dict_table_t* first; - dict_table_t* last = NULL; - - mutex_enter(&dict_sys->mutex); - - /* Signal all threads that they should stop. */ - table = UT_LIST_GET_FIRST(dict_sys->table_LRU); - first = table; - while (table) { - dict_table_t* next; - fts_t* fts = table->fts; - - if (fts != NULL) { - fts_start_shutdown(table, fts); - } - - next = UT_LIST_GET_NEXT(table_LRU, table); - - if (!next) { - last = table; - } - - table = next; - } - - /* We must release dict_sys->mutex here; if we hold on to it in the - loop below, we will deadlock if any of the background threads try to - acquire it (for example, the FTS thread by calling que_eval_sql). - - Releasing it here and going through dict_sys->table_LRU without - holding it is safe because: - - a) MySQL only starts the shutdown procedure after all client - threads have been disconnected and no new ones are accepted, so no - new tables are added or old ones dropped. - - b) Despite its name, the list is not LRU, and the order stays - fixed. - - To safeguard against the above assumptions ever changing, we store - the first and last items in the list above, and then check that - they've stayed the same below. */ - - mutex_exit(&dict_sys->mutex); - - /* Wait for the threads of each table to stop. This is not inside - the above loop, because by signaling all the threads first we can - overlap their shutting down delays. */ - table = UT_LIST_GET_FIRST(dict_sys->table_LRU); - ut_a(first == table); - while (table) { - dict_table_t* next; - fts_t* fts = table->fts; - - if (fts != NULL) { - fts_shutdown(table, fts); - } - - next = UT_LIST_GET_NEXT(table_LRU, table); - - if (table == last) { - ut_a(!next); - } - - table = next; - } -} - /*****************************************************************//** Get the meta-data filename from the table name. */ UNIV_INTERN diff --git a/storage/xtradb/sync/sync0sync.cc b/storage/xtradb/sync/sync0sync.cc index 6692eef9fb0..37ac3c56fff 100644 --- a/storage/xtradb/sync/sync0sync.cc +++ b/storage/xtradb/sync/sync0sync.cc @@ -1236,6 +1236,7 @@ sync_thread_add_level( upgrading in innobase_start_or_create_for_mysql(). */ break; } + /* fall through */ case SYNC_MEM_POOL: case SYNC_MEM_HASH: case SYNC_RECV: @@ -1299,9 +1300,9 @@ sync_thread_add_level( } } ut_ad(found_current); - - /* fallthrough */ } + + /* fall through */ case SYNC_BUF_FLUSH_LIST: case SYNC_BUF_LRU_LIST: case SYNC_BUF_FREE_LIST: diff --git a/storage/xtradb/trx/trx0i_s.cc b/storage/xtradb/trx/trx0i_s.cc index eacd9212d2f..0c9618d98eb 100644 --- a/storage/xtradb/trx/trx0i_s.cc +++ b/storage/xtradb/trx/trx0i_s.cc @@ -507,7 +507,9 @@ fill_trx_row( row->trx_mysql_thread_id = thd_get_thread_id(trx->mysql_thd); - stmt = innobase_get_stmt(trx->mysql_thd, &stmt_len); + stmt = trx->mysql_thd + ? innobase_get_stmt(trx->mysql_thd, &stmt_len) + : NULL; if (stmt != NULL) { char query[TRX_I_S_TRX_QUERY_MAX_LEN + 1]; diff --git a/storage/xtradb/trx/trx0purge.cc b/storage/xtradb/trx/trx0purge.cc index 7d35bb12093..df4a3217820 100644 --- a/storage/xtradb/trx/trx0purge.cc +++ b/storage/xtradb/trx/trx0purge.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2017, MariaDB Corporation. All Rights Reserved. This program is free software; you can redistribute it and/or modify it under @@ -247,6 +247,19 @@ trx_purge_add_update_undo_to_history( hist_size + undo->size, MLOG_4BYTES, mtr); } + /* Before any transaction-generating background threads or the + purge have been started, recv_recovery_rollback_active() can + start transactions in row_merge_drop_temp_indexes() and + fts_drop_orphaned_tables(), and roll back recovered transactions. + After the purge thread has been given permission to exit, + in fast shutdown, we may roll back transactions (trx->undo_no==0) + in THD::cleanup() invoked from unlink_thd(). */ + ut_ad(srv_undo_sources + || ((srv_startup_is_before_trx_rollback_phase + || trx_rollback_or_clean_is_active) + && purge_sys->state == PURGE_STATE_INIT) + || (trx->undo_no == 0 && srv_fast_shutdown)); + /* Add the log as the first in the history list */ flst_add_first(rseg_header + TRX_RSEG_HISTORY, undo_header + TRX_UNDO_HISTORY_NODE, mtr); @@ -685,7 +698,8 @@ trx_purge_get_rseg_with_min_trx_id( /* We assume in purge of externally stored fields that space id is in the range of UNDO tablespace space ids */ - ut_a(purge_sys->rseg->space <= srv_undo_tablespaces_open); + ut_a(purge_sys->rseg->space == 0 + || srv_is_undo_tablespace(purge_sys->rseg->space)); zip_size = purge_sys->rseg->zip_size; diff --git a/storage/xtradb/trx/trx0rec.cc b/storage/xtradb/trx/trx0rec.cc index 74a63b60286..8c0904dd57b 100644 --- a/storage/xtradb/trx/trx0rec.cc +++ b/storage/xtradb/trx/trx0rec.cc @@ -1186,10 +1186,6 @@ UNIV_INTERN dberr_t trx_undo_report_row_operation( /*==========================*/ - ulint flags, /*!< in: if BTR_NO_UNDO_LOG_FLAG bit is - set, does nothing */ - ulint op_type, /*!< in: TRX_UNDO_INSERT_OP or - TRX_UNDO_MODIFY_OP */ que_thr_t* thr, /*!< in: query thread */ dict_index_t* index, /*!< in: clustered index */ const dtuple_t* clust_entry, /*!< in: in the case of an insert, @@ -1223,16 +1219,8 @@ trx_undo_report_row_operation( ut_a(dict_index_is_clust(index)); ut_ad(!rec || rec_offs_validate(rec, index, offsets)); - if (flags & BTR_NO_UNDO_LOG_FLAG) { - - *roll_ptr = 0; - - return(DB_SUCCESS); - } - ut_ad(thr); - ut_ad((op_type != TRX_UNDO_INSERT_OP) - || (clust_entry && !update && !rec)); + ut_ad(!clust_entry || (!update && !rec)); trx = thr_get_trx(thr); @@ -1253,8 +1241,7 @@ trx_undo_report_row_operation( /* If the undo log is not assigned yet, assign one */ - switch (op_type) { - case TRX_UNDO_INSERT_OP: + if (clust_entry) { undo = trx->insert_undo; if (undo == NULL) { @@ -1270,10 +1257,7 @@ trx_undo_report_row_operation( ut_ad(err == DB_SUCCESS); } - break; - default: - ut_ad(op_type == TRX_UNDO_MODIFY_OP); - + } else { undo = trx->update_undo; if (undo == NULL) { @@ -1297,23 +1281,15 @@ trx_undo_report_row_operation( buf_block_dbg_add_level(undo_block, SYNC_TRX_UNDO_PAGE); do { - page_t* undo_page; - ulint offset; - - undo_page = buf_block_get_frame(undo_block); ut_ad(page_no == buf_block_get_page_no(undo_block)); - switch (op_type) { - case TRX_UNDO_INSERT_OP: - offset = trx_undo_page_report_insert( - undo_page, trx, index, clust_entry, &mtr); - break; - default: - ut_ad(op_type == TRX_UNDO_MODIFY_OP); - offset = trx_undo_page_report_modify( + page_t* undo_page = buf_block_get_frame(undo_block); + ulint offset = clust_entry + ? trx_undo_page_report_insert( + undo_page, trx, index, clust_entry, &mtr) + : trx_undo_page_report_modify( undo_page, trx, index, rec, offsets, update, cmpl_info, &mtr); - } if (UNIV_UNLIKELY(offset == 0)) { /* The record did not fit on the page. We erase the @@ -1364,7 +1340,7 @@ trx_undo_report_row_operation( mutex_exit(&trx->undo_mutex); *roll_ptr = trx_undo_build_roll_ptr( - op_type == TRX_UNDO_INSERT_OP, + clust_entry != NULL, rseg->id, page_no, offset); return(DB_SUCCESS); } diff --git a/storage/xtradb/trx/trx0roll.cc b/storage/xtradb/trx/trx0roll.cc index d228743d300..335ef8859c4 100644 --- a/storage/xtradb/trx/trx0roll.cc +++ b/storage/xtradb/trx/trx0roll.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2016, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under @@ -818,6 +818,7 @@ DECLARE_THREAD(trx_rollback_or_clean_all_recovered)( /*!< in: a dummy parameter required by os_thread_create */ { + my_thread_init(); ut_ad(!srv_read_only_mode); #ifdef UNIV_PFS_THREAD @@ -828,6 +829,7 @@ DECLARE_THREAD(trx_rollback_or_clean_all_recovered)( trx_rollback_or_clean_is_active = false; + my_thread_end(); /* We count the number of threads in os_thread_exit(). A created thread should always use that to exit and not use return() to exit. */ diff --git a/storage/xtradb/trx/trx0rseg.cc b/storage/xtradb/trx/trx0rseg.cc index 003d1036a8c..38719a1c771 100644 --- a/storage/xtradb/trx/trx0rseg.cc +++ b/storage/xtradb/trx/trx0rseg.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -121,9 +122,11 @@ trx_rseg_mem_free( mutex_free(&rseg->mutex); + if (!srv_apply_log_only) { /* There can't be any active transactions. */ ut_a(UT_LIST_GET_LEN(rseg->update_undo_list) == 0); ut_a(UT_LIST_GET_LEN(rseg->insert_undo_list) == 0); + } for (undo = UT_LIST_GET_FIRST(rseg->update_undo_cached); undo != NULL; @@ -293,14 +296,13 @@ trx_rseg_create_instance( } } -/********************************************************************* -Creates a rollback segment. -@return pointer to new rollback segment if create successful */ +/** Create a rollback segment. +@param[in] space undo tablespace ID +@return pointer to new rollback segment +@retval NULL on failure */ UNIV_INTERN trx_rseg_t* -trx_rseg_create( -/*============*/ - ulint space) /*!< in: id of UNDO tablespace */ +trx_rseg_create(ulint space) { mtr_t mtr; ulint slot_no; @@ -323,22 +325,21 @@ trx_rseg_create( page_no = trx_rseg_header_create( space, 0, ULINT_MAX, slot_no, &mtr); - ut_a(page_no != FIL_NULL); + if (page_no != FIL_NULL) { + sys_header = trx_sysf_get(&mtr); - sys_header = trx_sysf_get(&mtr); + id = trx_sysf_rseg_get_space(sys_header, slot_no, &mtr); + ut_a(id == space); - id = trx_sysf_rseg_get_space(sys_header, slot_no, &mtr); - ut_a(id == space); + zip_size = space ? fil_space_get_zip_size(space) : 0; - zip_size = space ? fil_space_get_zip_size(space) : 0; - - rseg = trx_rseg_mem_create( - slot_no, space, zip_size, page_no, - purge_sys->ib_bh, &mtr); + rseg = trx_rseg_mem_create( + slot_no, space, zip_size, page_no, + purge_sys->ib_bh, &mtr); + } } mtr_commit(&mtr); - return(rseg); } diff --git a/storage/xtradb/trx/trx0sys.cc b/storage/xtradb/trx/trx0sys.cc index 1c4fb19430e..83bb28b3c07 100644 --- a/storage/xtradb/trx/trx0sys.cc +++ b/storage/xtradb/trx/trx0sys.cc @@ -1,6 +1,7 @@ /***************************************************************************** -Copyright (c) 1996, 2015, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -327,123 +328,126 @@ trx_sys_print_mysql_binlog_offset(void) static long long trx_sys_cur_xid_seqno = -1; static unsigned char trx_sys_cur_xid_uuid[16]; -long long read_wsrep_xid_seqno(const XID* xid) +/** Read WSREP XID seqno */ +static inline long long read_wsrep_xid_seqno(const XID* xid) { - long long seqno; - memcpy(&seqno, xid->data + 24, sizeof(long long)); - return seqno; + long long seqno; + memcpy(&seqno, xid->data + 24, sizeof(long long)); + return seqno; } -void read_wsrep_xid_uuid(const XID* xid, unsigned char* buf) +/** Read WSREP XID UUID */ +static inline void read_wsrep_xid_uuid(const XID* xid, unsigned char* buf) { - memcpy(buf, xid->data + 8, 16); + memcpy(buf, xid->data + 8, 16); } #endif /* UNIV_DEBUG */ +/** Update WSREP XID info in sys_header of TRX_SYS_PAGE_NO = 5. +@param[in] xid Transaction XID +@param[in,out] sys_header sys_header +@param[in] mtr minitransaction */ +UNIV_INTERN void trx_sys_update_wsrep_checkpoint( - const XID* xid, /*!< in: transaction XID */ - trx_sysf_t* sys_header, /*!< in: sys_header */ - mtr_t* mtr) /*!< in: mtr */ + const XID* xid, + trx_sysf_t* sys_header, + mtr_t* mtr) { #ifdef UNIV_DEBUG - { - /* Check that seqno is monotonically increasing */ - unsigned char xid_uuid[16]; - long long xid_seqno = read_wsrep_xid_seqno(xid); - read_wsrep_xid_uuid(xid, xid_uuid); - if (!memcmp(xid_uuid, trx_sys_cur_xid_uuid, 16)) - { - /* - This check is a protection against the initial seqno (-1) - assigned in read_wsrep_xid_uuid(), which, if not checked, - would cause the following assertion to fail. - */ - if (xid_seqno > -1 ) - { - ut_ad(xid_seqno > trx_sys_cur_xid_seqno); - } - } - else - { - memcpy(trx_sys_cur_xid_uuid, xid_uuid, 16); - } - trx_sys_cur_xid_seqno = xid_seqno; - } + if (xid->formatID != -1 + && mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_MAGIC_N_FLD) + == TRX_SYS_WSREP_XID_MAGIC_N) { + /* Check that seqno is monotonically increasing */ + unsigned char xid_uuid[16]; + long long xid_seqno = read_wsrep_xid_seqno(xid); + read_wsrep_xid_uuid(xid, xid_uuid); + + if (!memcmp(xid_uuid, trx_sys_cur_xid_uuid, 8)) { + ut_ad(xid_seqno > trx_sys_cur_xid_seqno); + trx_sys_cur_xid_seqno = xid_seqno; + } else { + memcpy(trx_sys_cur_xid_uuid, xid_uuid, 16); + } + + trx_sys_cur_xid_seqno = xid_seqno; + } #endif /* UNIV_DEBUG */ - ut_ad(xid && mtr); - ut_a(xid->formatID == -1 || wsrep_is_wsrep_xid(xid)); + ut_ad(xid && mtr); + ut_a(xid->formatID == -1 || wsrep_is_wsrep_xid((const XID *)xid)); - if (mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_MAGIC_N_FLD) - != TRX_SYS_WSREP_XID_MAGIC_N) { - mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_MAGIC_N_FLD, - TRX_SYS_WSREP_XID_MAGIC_N, - MLOG_4BYTES, mtr); - } - - mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_FORMAT, - (int)xid->formatID, - MLOG_4BYTES, mtr); - mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_GTRID_LEN, - (int)xid->gtrid_length, - MLOG_4BYTES, mtr); - mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_BQUAL_LEN, - (int)xid->bqual_length, - MLOG_4BYTES, mtr); - mlog_write_string(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_DATA, - (const unsigned char*) xid->data, - XIDDATASIZE, mtr); + if (mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_MAGIC_N_FLD) + != TRX_SYS_WSREP_XID_MAGIC_N) { + mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_MAGIC_N_FLD, + TRX_SYS_WSREP_XID_MAGIC_N, + MLOG_4BYTES, mtr); + } + mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_FORMAT, + (int)xid->formatID, + MLOG_4BYTES, mtr); + mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_GTRID_LEN, + (int)xid->gtrid_length, + MLOG_4BYTES, mtr); + mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_BQUAL_LEN, + (int)xid->bqual_length, + MLOG_4BYTES, mtr); + mlog_write_string(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_DATA, + (const unsigned char*) xid->data, + XIDDATASIZE, mtr); } -void +/** Read WSREP XID from sys_header of TRX_SYS_PAGE_NO = 5. +@param[out] xid Transaction XID +@retval true if found, false if not */ +UNIV_INTERN +bool trx_sys_read_wsrep_checkpoint(XID* xid) -/*===================================*/ { - trx_sysf_t* sys_header; - mtr_t mtr; - ulint magic; + trx_sysf_t* sys_header; + mtr_t mtr; + ulint magic; - ut_ad(xid); + ut_ad(xid); mtr_start(&mtr); sys_header = trx_sysf_get(&mtr); - if ((magic = mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_MAGIC_N_FLD)) - != TRX_SYS_WSREP_XID_MAGIC_N) { - memset(xid, 0, sizeof(*xid)); - long long seqno= -1; - memcpy(xid->data + 24, &seqno, sizeof(long long)); - xid->formatID = -1; - trx_sys_update_wsrep_checkpoint(xid, sys_header, &mtr); - mtr_commit(&mtr); - return; - } + if ((magic = mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_MAGIC_N_FLD)) + != TRX_SYS_WSREP_XID_MAGIC_N) { + memset(xid, 0, sizeof(*xid)); + xid->formatID = -1; + trx_sys_update_wsrep_checkpoint(xid, sys_header, &mtr); + mtr_commit(&mtr); + return false; + } - xid->formatID = (int)mach_read_from_4( - sys_header - + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_FORMAT); - xid->gtrid_length = (int)mach_read_from_4( - sys_header - + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_GTRID_LEN); - xid->bqual_length = (int)mach_read_from_4( - sys_header - + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_BQUAL_LEN); - ut_memcpy(xid->data, - sys_header + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_DATA, - XIDDATASIZE); + xid->formatID = (int)mach_read_from_4( + sys_header + + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_FORMAT); + xid->gtrid_length = (int)mach_read_from_4( + sys_header + + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_GTRID_LEN); + xid->bqual_length = (int)mach_read_from_4( + sys_header + + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_BQUAL_LEN); + ut_memcpy(xid->data, + sys_header + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_DATA, + XIDDATASIZE); mtr_commit(&mtr); + return true; } #endif /* WITH_WSREP */ @@ -1063,18 +1067,12 @@ trx_sys_create_rsegs( ulint new_rsegs = n_rsegs - n_used; for (i = 0; i < new_rsegs; ++i) { - ulint space; + ulint space_id; + space_id = (n_spaces == 0) ? 0 + : (srv_undo_space_id_start + i % n_spaces); - /* Tablespace 0 is the system tablespace. All UNDO - log tablespaces start from 1. */ - - if (n_spaces > 0) { - space = (i % n_spaces) + 1; - } else { - space = 0; /* System tablespace */ - } - - if (trx_rseg_create(space) != NULL) { + /* Tablespace 0 is the system tablespace. */ + if (trx_rseg_create(space_id) != NULL) { ++n_used; } else { break; @@ -1339,14 +1337,16 @@ trx_sys_close(void) trx_purge_sys_close(); /* Free the double write data structures. */ - buf_dblwr_free(); + if (buf_dblwr) { + buf_dblwr_free(); + } - ut_a(UT_LIST_GET_LEN(trx_sys->ro_trx_list) == 0); /* Only prepared transactions may be left in the system. Free them. */ ut_a(UT_LIST_GET_LEN(trx_sys->rw_trx_list) == trx_sys->n_prepared_trx || srv_read_only_mode - || srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO); + || srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO + || srv_apply_log_only); while ((trx = UT_LIST_GET_FIRST(trx_sys->rw_trx_list)) != NULL) { trx_free_prepared(trx); @@ -1377,10 +1377,12 @@ trx_sys_close(void) UT_LIST_REMOVE(view_list, trx_sys->view_list, prev_view); } - ut_a(UT_LIST_GET_LEN(trx_sys->view_list) == 0); - ut_a(UT_LIST_GET_LEN(trx_sys->ro_trx_list) == 0); - ut_a(UT_LIST_GET_LEN(trx_sys->rw_trx_list) == 0); - ut_a(UT_LIST_GET_LEN(trx_sys->mysql_trx_list) == 0); + if (!srv_apply_log_only) { + ut_a(UT_LIST_GET_LEN(trx_sys->view_list) == 0); + ut_a(UT_LIST_GET_LEN(trx_sys->ro_trx_list) == 0); + ut_a(UT_LIST_GET_LEN(trx_sys->rw_trx_list) == 0); + ut_a(UT_LIST_GET_LEN(trx_sys->mysql_trx_list) == 0); + } mutex_free(&trx_sys->mutex); @@ -1427,6 +1429,9 @@ ulint trx_sys_any_active_transactions(void) /*=================================*/ { + if (srv_apply_log_only) { + return(0); + } mutex_enter(&trx_sys->mutex); ulint total_trx = UT_LIST_GET_LEN(trx_sys->mysql_trx_list); diff --git a/storage/xtradb/trx/trx0trx.cc b/storage/xtradb/trx/trx0trx.cc index 92d7525ea84..ef6e7d01cc4 100644 --- a/storage/xtradb/trx/trx0trx.cc +++ b/storage/xtradb/trx/trx0trx.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2015, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -482,6 +483,7 @@ trx_free_prepared( || (trx_state_eq(trx, TRX_STATE_ACTIVE) && trx->is_recovered && (srv_read_only_mode + || srv_apply_log_only || srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO))); ut_a(trx->magic_n == TRX_MAGIC_N); @@ -661,7 +663,7 @@ trx_resurrect_table_locks( i != tables.end(); i++) { if (dict_table_t* table = dict_table_open_on_id( *i, FALSE, DICT_TABLE_OP_LOAD_TABLESPACE)) { - if (table->ibd_file_missing + if (table->file_unreadable || dict_table_is_temporary(table)) { mutex_enter(&dict_sys->mutex); dict_table_close(table, TRUE, FALSE); @@ -719,18 +721,9 @@ trx_resurrect_insert( "InnoDB: Transaction " TRX_ID_FMT " was in the" " XA prepared state.\n", trx->id); - if (srv_force_recovery == 0) { - - trx->state = TRX_STATE_PREPARED; - trx_sys->n_prepared_trx++; - trx_sys->n_prepared_recovered_trx++; - } else { - fprintf(stderr, - "InnoDB: Since innodb_force_recovery" - " > 0, we will rollback it anyway.\n"); - - trx->state = TRX_STATE_ACTIVE; - } + trx->state = TRX_STATE_PREPARED; + trx_sys->n_prepared_trx++; + trx_sys->n_prepared_recovered_trx++; } else { trx->state = TRX_STATE_COMMITTED_IN_MEMORY; } @@ -788,22 +781,14 @@ trx_resurrect_update_in_prepared_state( "InnoDB: Transaction " TRX_ID_FMT " was in the XA prepared state.\n", trx->id); - if (srv_force_recovery == 0) { - if (trx_state_eq(trx, TRX_STATE_NOT_STARTED)) { - trx_sys->n_prepared_trx++; - trx_sys->n_prepared_recovered_trx++; - } else { - ut_ad(trx_state_eq(trx, TRX_STATE_PREPARED)); - } - - trx->state = TRX_STATE_PREPARED; + if (trx_state_eq(trx, TRX_STATE_NOT_STARTED)) { + trx_sys->n_prepared_trx++; + trx_sys->n_prepared_recovered_trx++; } else { - fprintf(stderr, - "InnoDB: Since innodb_force_recovery" - " > 0, we will rollback it anyway.\n"); - - trx->state = TRX_STATE_ACTIVE; + ut_ad(trx_state_eq(trx, TRX_STATE_PREPARED)); } + + trx->state = TRX_STATE_PREPARED; } else { trx->state = TRX_STATE_COMMITTED_IN_MEMORY; } @@ -2273,6 +2258,7 @@ state_ok: } } #endif /* WITH_WSREP */ + /**********************************************************************//** Prints info about a transaction. Acquires and releases lock_sys->mutex and trx_sys->mutex. */ @@ -2734,4 +2720,3 @@ trx_start_for_ddl_low( ut_error; } - diff --git a/storage/xtradb/trx/trx0undo.cc b/storage/xtradb/trx/trx0undo.cc index 220589dd9ff..cb064e3d485 100644 --- a/storage/xtradb/trx/trx0undo.cc +++ b/storage/xtradb/trx/trx0undo.cc @@ -2037,6 +2037,7 @@ trx_undo_free_prepared( /* lock_trx_release_locks() assigns trx->is_recovered=false */ ut_a(srv_read_only_mode + || srv_apply_log_only || srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO); break; default: diff --git a/storage/xtradb/usr/usr0sess.cc b/storage/xtradb/usr/usr0sess.cc index ab7ba6bea09..e1bd71ff1a0 100644 --- a/storage/xtradb/usr/usr0sess.cc +++ b/storage/xtradb/usr/usr0sess.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -48,8 +49,6 @@ sess_open(void) sess->trx = trx_allocate_for_background(); sess->trx->sess = sess; - UT_LIST_INIT(sess->graphs); - return(sess); } diff --git a/storage/xtradb/ut/ut0ut.cc b/storage/xtradb/ut/ut0ut.cc index acedb56879a..fd52537ae11 100644 --- a/storage/xtradb/ut/ut0ut.cc +++ b/storage/xtradb/ut/ut0ut.cc @@ -852,6 +852,8 @@ ut_strerr( return("BLOB record length is greater than 10%% of redo log"); case DB_DECRYPTION_FAILED: return("Table is encrypted but decrypt failed."); + case DB_PAGE_CORRUPTED: + return("Page read from tablespace is corrupted."); /* do not add default: in order to produce a warning if new code is added to the enum but not added here */ diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c index 683c80f643d..56330bd68cb 100644 --- a/strings/ctype-utf8.c +++ b/strings/ctype-utf8.c @@ -1,5 +1,5 @@ /* Copyright (c) 2000, 2013, Oracle and/or its affiliates. - Copyright (c) 2009, 2016, MariaDB + Copyright (c) 2009, 2017, MariaDB This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public @@ -5114,7 +5114,9 @@ static int my_uni_utf8_no_range(CHARSET_INFO *cs __attribute__((unused)), { /* Fall through all cases!!! */ case 3: r[2]= (uchar) (0x80 | (wc & 0x3f)); wc= wc >> 6; wc |= 0x800; + /* fall through */ case 2: r[1]= (uchar) (0x80 | (wc & 0x3f)); wc= wc >> 6; wc |= 0xc0; + /* fall through */ case 1: r[0]= (uchar) wc; } return count; @@ -7497,8 +7499,11 @@ my_wc_mb_utf8mb4(CHARSET_INFO *cs __attribute__((unused)), switch (count) { /* Fall through all cases!!! */ case 4: r[3] = (uchar) (0x80 | (wc & 0x3f)); wc = wc >> 6; wc |= 0x10000; + /* fall through */ case 3: r[2] = (uchar) (0x80 | (wc & 0x3f)); wc = wc >> 6; wc |= 0x800; + /* fall through */ case 2: r[1] = (uchar) (0x80 | (wc & 0x3f)); wc = wc >> 6; wc |= 0xc0; + /* fall through */ case 1: r[0] = (uchar) wc; } return count; @@ -7529,8 +7534,11 @@ my_wc_mb_utf8mb4_no_range(CHARSET_INFO *cs __attribute__((unused)), { /* Fall through all cases!!! */ case 4: r[3]= (uchar) (0x80 | (wc & 0x3f)); wc= wc >> 6; wc |= 0x10000; + /* fall through */ case 3: r[2]= (uchar) (0x80 | (wc & 0x3f)); wc= wc >> 6; wc |= 0x800; + /* fall through */ case 2: r[1]= (uchar) (0x80 | (wc & 0x3f)); wc= wc >> 6; wc |= 0xc0; + /* fall through */ case 1: r[0]= (uchar) wc; } return count; diff --git a/strings/ctype.c b/strings/ctype.c index 12d511162d7..0aed6c8bf52 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -762,7 +762,7 @@ static int cs_value(MY_XML_PARSER *st,const char *attr, size_t len) /* Rules: Context */ case _CS_CONTEXT: - if (len < sizeof(i->context) + 1) + if (len < sizeof(i->context)) { memcpy(i->context, attr, len); i->context[len]= '\0'; diff --git a/strings/dtoa.c b/strings/dtoa.c index fdf7bceddfd..a16ec93d3eb 100644 --- a/strings/dtoa.c +++ b/strings/dtoa.c @@ -1,4 +1,5 @@ /* Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + Copyright (c) 2017, MariaDB Corporation. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public @@ -1377,7 +1378,7 @@ static double my_strtod_int(const char *s00, char **se, int *error, char *buf, s switch (*s) { case '-': sign= 1; - /* no break */ + /* fall through */ case '+': s++; goto break2; @@ -1467,6 +1468,7 @@ static double my_strtod_int(const char *s00, char **se, int *error, char *buf, s switch (c= *s) { case '-': esign= 1; + /* fall through */ case '+': c= *++s; } @@ -2360,7 +2362,7 @@ static char *dtoa(double dd, int mode, int ndigits, int *decpt, int *sign, break; case 2: leftright= 0; - /* no break */ + /* fall through */ case 4: if (ndigits <= 0) ndigits= 1; @@ -2368,7 +2370,7 @@ static char *dtoa(double dd, int mode, int ndigits, int *decpt, int *sign, break; case 3: leftright= 0; - /* no break */ + /* fall through */ case 5: i= ndigits + k + 1; ilim= i; diff --git a/strings/json_lib.c b/strings/json_lib.c index 5eda81d96c5..f666d95985b 100644 --- a/strings/json_lib.c +++ b/strings/json_lib.c @@ -253,7 +253,7 @@ static int read_4_hexdigits(json_string_t *s, uchar *dest) if ((c_len= json_next_char(s)) <= 0) return s->error= json_eos(s) ? JE_EOS : JE_BAD_CHR; - if (s->c_next >= 128 || (t= json_instr_chr_map[s->c_next]) >= S_F) + if (s->c_next >= 128 || (t= json_instr_chr_map[s->c_next]) > S_F) return s->error= JE_SYN; s->c_str+= c_len; @@ -1139,21 +1139,21 @@ int json_path_setup(json_path_t *p, case PS_EKY: p->last_step->key_end= p->s.c_str - c_len; state= PS_KEY; - /* Note no 'continue' here. */ + /* fall through */ case PS_KEY: p->last_step++; if (p->last_step - p->steps >= JSON_DEPTH_LIMIT) return p->s.error= JE_DEPTH; p->types_used|= p->last_step->type= JSON_PATH_KEY | double_wildcard; double_wildcard= JSON_PATH_KEY_NULL; - /* Note no 'continue' here. */ + /* fall through */ case PS_KEYX: p->last_step->key= p->s.c_str; continue; case PS_EAR: p->last_step->key_end= p->s.c_str - c_len; state= PS_AR; - /* Note no 'continue' here. */ + /* fall through */ case PS_AR: p->last_step++; if (p->last_step - p->steps >= JSON_DEPTH_LIMIT) @@ -1248,6 +1248,7 @@ static int handle_match(json_engine_t *je, json_path_t *p, if (++next_step > p->last_step) { je->s.c_str= je->value_begin; + je->stack_p--; return 1; } } while (next_step->type == JSON_PATH_ARRAY && next_step->n_item == 0); @@ -1446,7 +1447,7 @@ int json_find_paths_next(json_engine_t *je, json_find_paths_t *state) /* Path already failed. */ continue; if (state->paths[p_c].steps[state->cur_depth].type & - (je->state == JST_OBJ_START) ? JSON_PATH_KEY : JSON_PATH_ARRAY) + ((je->state == JST_OBJ_START) ? JSON_PATH_KEY : JSON_PATH_ARRAY)) state->path_depths[p_c]++; } state->cur_depth++; @@ -1585,7 +1586,7 @@ int json_escape(CHARSET_INFO *str_cs, enum json_esc_char_classes c_class; str+= c_len; - if (c_chr > 0x60 || (c_class= json_escape_chr_map[c_chr]) == ESC_) + if (c_chr >= 0x60 || (c_class= json_escape_chr_map[c_chr]) == ESC_) { if ((c_len= json_cs->cset->wc_mb(json_cs, c_chr, json, json_end)) > 0) { @@ -1704,6 +1705,7 @@ int json_get_path_next(json_engine_t *je, json_path_t *p) return 1; /* Now we have je.state == JST_VALUE, so let's handle it. */ + /* fall through */ case JST_VALUE: if (json_read_value(je)) return 1; @@ -1755,7 +1757,7 @@ int json_path_parts_compare( goto step_fits; goto step_failed; } - if (a->n_item == 0) + if ((a->type & JSON_PATH_WILD) == 0 && a->n_item == 0) goto step_fits_autowrap; goto step_failed; } diff --git a/support-files/CMakeLists.txt b/support-files/CMakeLists.txt index c9addecafa5..71e9b3fad3d 100644 --- a/support-files/CMakeLists.txt +++ b/support-files/CMakeLists.txt @@ -1,5 +1,5 @@ -# Copyright (c) 2006, 2014, Oracle and/or its affiliates. -# Copyright (c) 2012, 2014, SkySQL Ab. +# Copyright (c) 2006, 2016, Oracle and/or its affiliates. +# Copyright (c) 2012, 2017, MariaDB # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/support-files/build-tags b/support-files/build-tags index 03b243ee8cc..e94b7bed298 100755 --- a/support-files/build-tags +++ b/support-files/build-tags @@ -8,7 +8,7 @@ then echo client storage dbug libmysql sql-common \ sql extra mysys mysys_ssl strings regex pcre vio include \ tools unittest plugin libmysqld | \ - xargs -n1 git ls-files | grep -v '\.jar$' | \ + xargs -n1 git ls-files | grep -v '\.jar$' | grep -v '\.xz$' | \ xargs etags -o TAGS --append else find . -type f ! -name "*.jar" | diff --git a/support-files/mysql.server.sh b/support-files/mysql.server.sh index 9162cf7d716..1ebf2922279 100644 --- a/support-files/mysql.server.sh +++ b/support-files/mysql.server.sh @@ -156,8 +156,7 @@ parse_server_arguments() { # Get arguments from the my.cnf file, # the only group, which is read from now on is [mysqld] -if test -x $bindir/my_print_defaults -then +if test -x "$bindir/my_print_defaults"; then print_defaults="$bindir/my_print_defaults" else # Try to find basedir in /etc/my.cnf @@ -175,11 +174,6 @@ else print_defaults="$d/bin/my_print_defaults" break fi - if test -x "$d/bin/mysql_print_defaults" - then - print_defaults="$d/bin/mysql_print_defaults" - break - fi done fi @@ -384,7 +378,7 @@ case "$mode" in fi else # Try to find appropriate mysqld process - mysqld_pid=`pidof $libexecdir/mysqld` + mysqld_pid=`pgrep $libexecdir/mysqld` # test if multiple pids exist pid_count=`echo $mysqld_pid | wc -w` diff --git a/support-files/policy/apparmor/usr.sbin.mysqld b/support-files/policy/apparmor/usr.sbin.mysqld index 307872c0fff..05ec77414d2 100644 --- a/support-files/policy/apparmor/usr.sbin.mysqld +++ b/support-files/policy/apparmor/usr.sbin.mysqld @@ -34,6 +34,8 @@ /etc/mysql/*.pem r, /etc/mysql/conf.d/ r, /etc/mysql/conf.d/* r, + /etc/mysql/mariadb.conf.d/ r, + /etc/mysql/mariadb.conf.d/* r, /etc/nsswitch.conf r, /etc/passwd r, /etc/services r, diff --git a/tests/fork_big.pl b/tests/fork_big.pl index 6e78e779d11..ec1f131d453 100755 --- a/tests/fork_big.pl +++ b/tests/fork_big.pl @@ -1,4 +1,5 @@ #!/usr/bin/perl -w +use strict; # Copyright (c) 2001, 2006 MySQL AB # Use is subject to license terms @@ -21,7 +22,7 @@ # # Tested a lot with: --threads=30 -$opt_loop_count=500000; # Change this to make test harder/easier +my $opt_loop_count=500000; # Change this to make test harder/easier ##################### Standard benchmark inits ############################## @@ -31,6 +32,13 @@ use Benchmark; package main; +our ($opt_skip_create,$opt_skip_in,$opt_verbose,$opt_fast_insert); +our ($opt_lock_tables,$opt_debug,$opt_skip_delete,$opt_fast,$opt_force); +our ($opt_threads); +our ($opt_host,$opt_user,$opt_password,$opt_db); +my (@testtables, $abort_table, $numtables, $start_time, $end_time); +my ($dbh); + $opt_skip_create=$opt_skip_in=$opt_verbose=$opt_fast_insert= $opt_lock_tables=$opt_debug=$opt_skip_delete=$opt_fast=$opt_force=0; $opt_threads=5; @@ -94,6 +102,8 @@ $|= 1; # Autoflush #### Start the tests #### +my ($i, $pid, %work); + for ($i=0 ; $i < $opt_threads ; $i ++) { test_insert() if (($pid=fork()) == 0); $work{$pid}="insert"; @@ -118,10 +128,13 @@ test_alter() if (($pid=fork()) == 0); $work{$pid}="alter"; print "Started " . ($opt_threads*2+4) . " threads\n"; +my ($errors, $running_insert_threads); + $errors=0; $running_insert_threads=$opt_threads+$numtables; while (($pid=wait()) != -1) { + my ($ret); $ret=$?/256; print "thread '" . $work{$pid} . "' finished with exit code $ret\n"; if ($work{$pid} =~ /^insert/) @@ -203,7 +216,7 @@ sub test_insert sub test_select { - my ($dbh, $i, $j, $count, $loop); + my ($dbh, $i, $j, $count, $loop, $count_query, $row_counts); $dbh = DBI->connect("DBI:mysql:$opt_db:$opt_host", $opt_user, $opt_password, @@ -270,7 +283,7 @@ sub test_select_count sub test_join { - my ($dbh, $i, $j, $count, $loop); + my ($dbh, $i, $j, $count, $loop, $count_query, $row_counts); $dbh = DBI->connect("DBI:mysql:$opt_db:$opt_host", $opt_user, $opt_password, @@ -389,7 +402,7 @@ sub test_update sub test_check { - my ($dbh, $row, $i, $j, $type, $table); + my ($dbh, $sth, $row, $i, $j, $type, $table); $dbh = DBI->connect("DBI:mysql:$opt_db:$opt_host", $opt_user, $opt_password, { PrintError => 0}) || die $DBI::errstr; @@ -397,7 +410,7 @@ sub test_check $type= "check"; for ($i=$j=0 ; !test_if_abort($dbh) ; $i++) { - sleep(1000); + sleep(200); $table=$testtables[$j]->[0]; $sth=$dbh->prepare("$type table $table") || die "Got error on prepare: $DBI::errstr\n"; $sth->execute || die $DBI::errstr; @@ -426,7 +439,7 @@ sub test_check sub test_repair { - my ($dbh, $row, $i, $type, $table); + my ($dbh, $sth, $row, $i, $type, $table); $dbh = DBI->connect("DBI:mysql:$opt_db:$opt_host", $opt_user, $opt_password, { PrintError => 0}) || die $DBI::errstr; @@ -434,7 +447,7 @@ sub test_repair $type= "repair"; for ($i=0 ; !test_if_abort($dbh) ; $i++) { - sleep(2000); + sleep(100); $table=$testtables[0]->[0]; $sth=$dbh->prepare("$type table $table") || die "Got error on prepare: $DBI::errstr\n"; $sth->execute || die $DBI::errstr; @@ -470,7 +483,7 @@ sub test_flush $count=0; while (!test_if_abort($dbh)) { - sleep(3000); + sleep(300); $dbh->do("flush tables $tables") || die "Got error on flush $DBI::errstr\n"; $count++; @@ -488,7 +501,7 @@ sub test_flush sub test_database { my ($database) = @_; - my ($dbh, $row, $i, $type, $tables); + my ($dbh, $sth, $row, $i, $type, $tables); $dbh = DBI->connect("DBI:mysql:$database:$opt_host", $opt_user, $opt_password, { PrintError => 0}) || die $DBI::errstr; @@ -521,7 +534,7 @@ sub test_database sub test_alter { - my ($dbh, $row, $i, $type, $table); + my ($dbh, $sth, $row, $i, $type, $table); $dbh = DBI->connect("DBI:mysql:$opt_db:$opt_host", $opt_user, $opt_password, { PrintError => 0}) || die $DBI::errstr; @@ -559,6 +572,7 @@ sub signal_abort sub test_if_abort() { my ($dbh)=@_; + my ($row); $row=simple_query($dbh,"select * from $opt_db.$abort_table"); return (defined($row) && defined($row->[0]) != 0) ? 1 : 0; } @@ -567,7 +581,7 @@ sub test_if_abort() sub make_count_query { my ($table_count)= @_; - my ($tables, $count_query, $i, $tables_def); + my ($tables, $count_query, $i, $table_def); $tables=""; $count_query="select high_priority "; $table_count--; diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c index 469a6ec5103..383036ff092 100644 --- a/tests/mysql_client_test.c +++ b/tests/mysql_client_test.c @@ -1096,6 +1096,7 @@ static void test_wl4435_2() \ rs_metadata= mysql_stmt_result_metadata(ps); \ fields= mysql_fetch_fields(rs_metadata); \ + mysql_free_result(rs_metadata); \ \ rc= mysql_stmt_bind_result(ps, &psp); \ check_execute(ps, rc); \ @@ -19530,6 +19531,40 @@ static void test_prepare_analyze() check_execute(stmt, rc); } +static void test_mdev12579() +{ + MYSQL_STMT *stmt= mysql_stmt_init(mysql); + MYSQL_BIND bind[2]; + int rc; + long l=3; + const char *data = "123456"; + + rc= mysql_query(mysql, "CREATE TABLE mdev12579 (k integer,t LONGTEXT,b LONGBLOB,x integer)"); + myquery(rc); + + rc= mysql_stmt_prepare(stmt, "INSERT INTO mdev12579 VALUES (1,?,NULL,?)", -1); + myquery(rc); + + rc= mysql_stmt_send_long_data(stmt, 0, data, 6); + rc= mysql_stmt_send_long_data(stmt, 0, data, 6); + rc= mysql_stmt_send_long_data(stmt, 0, data, 6); + + memset(bind, 0, sizeof(MYSQL_BIND) * 2); + bind[0].buffer_type= MYSQL_TYPE_VAR_STRING; + bind[1].buffer_type= MYSQL_TYPE_LONG; + bind[1].buffer= &l; + mysql_stmt_bind_param(stmt, bind); + + rc= mysql_stmt_execute(stmt); + check_execute(stmt, rc); + + mysql_stmt_close(stmt); + + rc= mysql_query(mysql, "DROP TABLE mdev12579"); + myquery(rc); +} + + static struct my_tests_st my_tests[]= { { "disable_query_logs", disable_query_logs }, { "test_view_sp_list_fields", test_view_sp_list_fields }, @@ -19807,6 +19842,7 @@ static struct my_tests_st my_tests[]= { { "test_compressed_protocol", test_compressed_protocol }, { "test_big_packet", test_big_packet }, { "test_prepare_analyze", test_prepare_analyze }, + { "test_mdev12579", test_mdev12579 }, { 0, 0 } }; diff --git a/unittest/mysys/ma_dyncol-t.c b/unittest/mysys/ma_dyncol-t.c index b3fff638b65..3b43c10a6a8 100644 --- a/unittest/mysys/ma_dyncol-t.c +++ b/unittest/mysys/ma_dyncol-t.c @@ -687,6 +687,9 @@ void test_update_many(uint *column_numbers, uint *column_values, err: ok(rc, "%s", "update_many"); /* cleanup */ + free(val); + free(upd); + free(res); mariadb_dyncol_free(&str1); mariadb_dyncol_free(&str2); } diff --git a/unittest/sql/mf_iocache-t.cc b/unittest/sql/mf_iocache-t.cc index a7db7c58713..36860892508 100644 --- a/unittest/sql/mf_iocache-t.cc +++ b/unittest/sql/mf_iocache-t.cc @@ -93,7 +93,7 @@ IO_CACHE info; #define CACHE_SIZE 16384 #define INFO_TAIL ", pos_in_file = %llu, pos_in_mem = %lu", \ - info.pos_in_file, (ulong) (*info.current_pos - info.request_pos) + info.pos_in_file, (ulong) ((info.type == READ_CACHE ? info.read_pos : info.write_pos) - info.request_pos) #define FILL 0x5A diff --git a/vio/vio.c b/vio/vio.c index 77a58a8272c..2c5f37a75a4 100644 --- a/vio/vio.c +++ b/vio/vio.c @@ -22,6 +22,7 @@ */ #include "vio_priv.h" +#include "ssl_compat.h" #ifdef _WIN32 diff --git a/vio/viosslfactories.c b/vio/viosslfactories.c index 52b624d3376..71ef2879464 100644 --- a/vio/viosslfactories.c +++ b/vio/viosslfactories.c @@ -15,6 +15,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "vio_priv.h" +#include #ifdef HAVE_OPENSSL #ifndef HAVE_YASSL @@ -26,49 +27,56 @@ static my_bool ssl_algorithms_added = FALSE; static my_bool ssl_error_strings_loaded= FALSE; /* the function below was generated with "openssl dhparam -2 -C 2048" */ + static DH *get_dh2048() { - static unsigned char dh2048_p[]={ - 0xA1,0xBB,0x7C,0x20,0xC5,0x5B,0xC0,0x7B,0x21,0x8B,0xD6,0xA8, - 0x15,0xFC,0x3B,0xBA,0xAB,0x9F,0xDF,0x68,0xC4,0x79,0x78,0x0D, - 0xC1,0x12,0x64,0xE4,0x15,0xC9,0x66,0xDB,0xF6,0xCB,0xB3,0x39, - 0x02,0x5B,0x78,0x62,0xFB,0x09,0xAE,0x09,0x6B,0xDD,0xD4,0x5D, - 0x97,0xBC,0xDC,0x7F,0xE6,0xD6,0xF1,0xCB,0xF5,0xEB,0xDA,0xA7, - 0x2E,0x5A,0x43,0x2B,0xE9,0x40,0xE2,0x85,0x00,0x1C,0xC0,0x0A, - 0x98,0x77,0xA9,0x31,0xDE,0x0B,0x75,0x4D,0x1E,0x1F,0x16,0x83, - 0xCA,0xDE,0xBD,0x21,0xFC,0xC1,0x82,0x37,0x36,0x33,0x0B,0x66, - 0x06,0x3C,0xF3,0xAF,0x21,0x57,0x57,0x80,0xF6,0x94,0x1B,0xA9, - 0xD4,0xF6,0x8F,0x18,0x62,0x0E,0xC4,0x22,0xF9,0x5B,0x62,0xCC, - 0x3F,0x19,0x95,0xCF,0x4B,0x00,0xA6,0x6C,0x0B,0xAF,0x9F,0xD5, - 0xFA,0x3D,0x6D,0xDA,0x30,0x83,0x07,0x91,0xAC,0x15,0xFF,0x8F, - 0x59,0x54,0xEA,0x25,0xBC,0x4E,0xEB,0x6A,0x54,0xDF,0x75,0x09, - 0x72,0x0F,0xEF,0x23,0x70,0xE0,0xA8,0x04,0xEA,0xFF,0x90,0x54, - 0xCD,0x84,0x18,0xC0,0x75,0x91,0x99,0x0F,0xA1,0x78,0x0C,0x07, - 0xB7,0xC5,0xDE,0x55,0x06,0x7B,0x95,0x68,0x2C,0x33,0x39,0xBC, - 0x2C,0xD0,0x6D,0xDD,0xFA,0xDC,0xB5,0x8F,0x82,0x39,0xF8,0x67, - 0x44,0xF1,0xD8,0xF7,0x78,0x11,0x9A,0x77,0x9B,0x53,0x47,0xD6, - 0x2B,0x5D,0x67,0xB8,0xB7,0xBC,0xC1,0xD7,0x79,0x62,0x15,0xC2, - 0xC5,0x83,0x97,0xA7,0xF8,0xB4,0x9C,0xF6,0x8F,0x9A,0xC7,0xDA, - 0x1B,0xBB,0x87,0x07,0xA7,0x71,0xAD,0xB2,0x8A,0x50,0xF8,0x26, - 0x12,0xB7,0x3E,0x0B, - }; - static unsigned char dh2048_g[]={ - 0x02, - }; - DH *dh; + static unsigned char dhp_2048[] = { + 0xA1,0xBB,0x7C,0x20,0xC5,0x5B,0xC0,0x7B,0x21,0x8B,0xD6,0xA8, + 0x15,0xFC,0x3B,0xBA,0xAB,0x9F,0xDF,0x68,0xC4,0x79,0x78,0x0D, + 0xC1,0x12,0x64,0xE4,0x15,0xC9,0x66,0xDB,0xF6,0xCB,0xB3,0x39, + 0x02,0x5B,0x78,0x62,0xFB,0x09,0xAE,0x09,0x6B,0xDD,0xD4,0x5D, + 0x97,0xBC,0xDC,0x7F,0xE6,0xD6,0xF1,0xCB,0xF5,0xEB,0xDA,0xA7, + 0x2E,0x5A,0x43,0x2B,0xE9,0x40,0xE2,0x85,0x00,0x1C,0xC0,0x0A, + 0x98,0x77,0xA9,0x31,0xDE,0x0B,0x75,0x4D,0x1E,0x1F,0x16,0x83, + 0xCA,0xDE,0xBD,0x21,0xFC,0xC1,0x82,0x37,0x36,0x33,0x0B,0x66, + 0x06,0x3C,0xF3,0xAF,0x21,0x57,0x57,0x80,0xF6,0x94,0x1B,0xA9, + 0xD4,0xF6,0x8F,0x18,0x62,0x0E,0xC4,0x22,0xF9,0x5B,0x62,0xCC, + 0x3F,0x19,0x95,0xCF,0x4B,0x00,0xA6,0x6C,0x0B,0xAF,0x9F,0xD5, + 0xFA,0x3D,0x6D,0xDA,0x30,0x83,0x07,0x91,0xAC,0x15,0xFF,0x8F, + 0x59,0x54,0xEA,0x25,0xBC,0x4E,0xEB,0x6A,0x54,0xDF,0x75,0x09, + 0x72,0x0F,0xEF,0x23,0x70,0xE0,0xA8,0x04,0xEA,0xFF,0x90,0x54, + 0xCD,0x84,0x18,0xC0,0x75,0x91,0x99,0x0F,0xA1,0x78,0x0C,0x07, + 0xB7,0xC5,0xDE,0x55,0x06,0x7B,0x95,0x68,0x2C,0x33,0x39,0xBC, + 0x2C,0xD0,0x6D,0xDD,0xFA,0xDC,0xB5,0x8F,0x82,0x39,0xF8,0x67, + 0x44,0xF1,0xD8,0xF7,0x78,0x11,0x9A,0x77,0x9B,0x53,0x47,0xD6, + 0x2B,0x5D,0x67,0xB8,0xB7,0xBC,0xC1,0xD7,0x79,0x62,0x15,0xC2, + 0xC5,0x83,0x97,0xA7,0xF8,0xB4,0x9C,0xF6,0x8F,0x9A,0xC7,0xDA, + 0x1B,0xBB,0x87,0x07,0xA7,0x71,0xAD,0xB2,0x8A,0x50,0xF8,0x26, + 0x12,0xB7,0x3E,0x0B, + }; + static unsigned char dhg_2048[] = { + 0x02 + }; + DH *dh = DH_new(); + BIGNUM *dhp_bn, *dhg_bn; - if ((dh=DH_new()) == NULL) return(NULL); - dh->p=BN_bin2bn(dh2048_p,sizeof(dh2048_p),NULL); - dh->g=BN_bin2bn(dh2048_g,sizeof(dh2048_g),NULL); - if ((dh->p == NULL) || (dh->g == NULL)) - { DH_free(dh); return(NULL); } - return(dh); + if (dh == NULL) + return NULL; + dhp_bn = BN_bin2bn(dhp_2048, sizeof (dhp_2048), NULL); + dhg_bn = BN_bin2bn(dhg_2048, sizeof (dhg_2048), NULL); + if (dhp_bn == NULL || dhg_bn == NULL + || !DH_set0_pqg(dh, dhp_bn, NULL, dhg_bn)) { + DH_free(dh); + BN_free(dhp_bn); + BN_free(dhg_bn); + return NULL; + } + return dh; } - static const char* -ssl_error_string[] = +ssl_error_string[] = { "No error", "Unable to get certificate", @@ -148,9 +156,7 @@ static void check_ssl_init() if (!ssl_algorithms_added) { ssl_algorithms_added= TRUE; - SSL_library_init(); - OpenSSL_add_all_algorithms(); - + OPENSSL_init_ssl(0, NULL); } if (!ssl_error_strings_loaded) diff --git a/win/packaging/CPackWixConfig.cmake b/win/packaging/CPackWixConfig.cmake index e954110ef19..581f4925d41 100644 --- a/win/packaging/CPackWixConfig.cmake +++ b/win/packaging/CPackWixConfig.cmake @@ -9,7 +9,7 @@ IF(ESSENTIALS) ENDIF() ELSE() SET(CPACK_COMPONENTS_USED - "Server;Client;Development;SharedLibraries;Documentation;Readme;Debuginfo;Common;VCCRT;connect-engine;ClientPlugins;gssapi-server;gssapi-client;aws-key-management;rocksdb-engine") + "Server;Client;Development;SharedLibraries;Documentation;Readme;Debuginfo;Common;VCCRT;connect-engine;ClientPlugins;gssapi-server;gssapi-client;aws-key-management;rocksdb-engine;backup") ENDIF() SET( WIX_FEATURE_MySQLServer_EXTRA_FEATURES "DBInstance;SharedClientServerComponents") @@ -56,6 +56,11 @@ SET(CPACK_COMPONENT_GROUP_MYSQLSERVER_DESCRIPTION "Install server") "Debug/trace versions of executables and libraries" ) #SET(CPACK_COMPONENT_DEBUGBINARIES_WIX_LEVEL 2) + # Subfeature "Backup" + SET(CPACK_COMPONENT_BACKUP_GROUP "MySQLServer") + SET(CPACK_COMPONENT_BACKUP_DISPLAY_NAME "Backup utilities") + SET(CPACK_COMPONENT_BACKUP_DESCRIPTION "Installs backup utilities(mariabackup and mbstream)") + #Miscellaneous (hidden) components, part of server / or client programs FOREACH(comp connect-engine ClientPlugins gssapi-server gssapi-client aws-key-management rocksdb-engine) diff --git a/win/packaging/ca/CustomAction.cpp b/win/packaging/ca/CustomAction.cpp index 9a174b8529e..9281ce27d34 100644 --- a/win/packaging/ca/CustomAction.cpp +++ b/win/packaging/ca/CustomAction.cpp @@ -180,7 +180,7 @@ extern "C" UINT __stdcall CheckDirectoryEmpty(MSIHANDLE hInstall, empty= true; for(;;) { - if (wcscmp(data.cFileName, L".") || wcscmp(data.cFileName, L"..")) + if (wcscmp(data.cFileName, L".") && wcscmp(data.cFileName, L"..")) { empty= false; break; diff --git a/win/packaging/create_msi.cmake.in b/win/packaging/create_msi.cmake.in index 4b05e61decd..c37f7ca9d1d 100644 --- a/win/packaging/create_msi.cmake.in +++ b/win/packaging/create_msi.cmake.in @@ -78,13 +78,6 @@ ELSE() ENDIF() SET(ENV{VS_UNICODE_OUTPUT}) -# Workaround for CMake bug#11452 -# Switch off the monolithic install -EXECUTE_PROCESS( - COMMAND ${CMAKE_COMMAND} -DCPACK_MONOLITHIC_INSTALL=0 ${CMAKE_BINARY_DIR} - OUTPUT_QUIET -) - INCLUDE(${CMAKE_BINARY_DIR}/CPackConfig.cmake) @@ -441,11 +434,4 @@ ENDIF() CONFIGURE_FILE(${CPACK_PACKAGE_FILE_NAME}.msi ${CMAKE_BINARY_DIR}/${CPACK_PACKAGE_FILE_NAME}.msi COPYONLY) - -# Workaround for CMake bug#11452 -# Switch monolithic install on again -EXECUTE_PROCESS( - COMMAND ${CMAKE_COMMAND} -DCPACK_MONOLITHIC_INSTALL=1 ${CMAKE_BINARY_DIR} - OUTPUT_QUIET -)